diff --git a/CHANGES b/CHANGES index bccc1af36..5de140640 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,516 @@ +9.4.0 +- Fixed bug OpenAsync throws unhandled exception from thread pool (MySQL Bug #110789, Oracle Bug #35474099). +- Fixed Entity Framework 6 from NET9 is deprecated due to Nunit4 Upgrade (MySQL Bug #117976, Oracle Bug #37837374). +- Added support for GSSAPI/Kerberos authentication on Windows using authentication_ldap_sasl_client plug-in (WL15984). +- Added support for .NET 10 and EF Core 10 preview versions (WL16900). +- Fixed MySql.EntityFrameworkCore 8.0.8 rename bug (MySQL Bug #116704, Oracle Bug #37462099). +- Fixed Invalid cast exception (MySQL Bug #118282, Oracle Bug #38001821). Thanks to Dev Nullinside for the contribution. +- Fixed MySqlHelper.ExecuteReaderAsync causes stack overflow (MySQL Bug #114006, Oracle Bug #36303124). +- Fixed bug Connector/Net Not honouring MinPoolSize Configuration (MySQL Bug #117020, Oracle Bug #37462116). +- Fixed bug bugfix schema name (specially usefull when use multiple schema) (MySQL Bug #111030, Oracle Bug #35392218). Thanks to Stéphane Graziano for the contribution. +- Fixed bug reorganize test suite (Oracle Bug #38029691). + + +9.3.0 +- Fixed bug MySql.EntityFrameworkCore.dll in NuGet packages is not signed (Oracle Bug #37503859). +- Fixed some tests due to incorrect implementation (WL16033). +- Updated third party dependencies (WL16852). +- Fixed bug Cannot Perform Database Migration using MySql.EntityFrameworkCore 9.0.0 (MySQL Bug #117258, Oracle Bug #37513445). +- Fixed failing tests due to server changes (Oracle Bug #37705281). + + +9.2.0 +- Added support for .NET 9 and EF Core 9 GA versions (WL16638). +- Removed support for .NET 6 and EFCore 6 (WL16654). +- Fixed bug Run inserts in batch command as one block (MySQL Bug #110553, Oracle Bug #35240186). Thanks to Sebastian Schwarzhuber for the contribution. +- Fixed failing tests due to server changes (Oracle Bug #37365939). +- Fixed bug Fix: MySQLUpdateSqlGenerator to inherit UpdateAndSelectSqlGenerator (MySQL Bug #115020, Oracle Bug #36624158). Thanks to Hikari Fujioka for the contribution. +- Fixed bug Fixed NullReferenceException (MySQL Bug #114457, Oracle Bug #36568102). Thanks to Maximilian Bienhüls for the contribution. +- Fixed bug MySql.Data.OpenTelemetry dll has a version 0.0.0.0 (Oracle Bug #37198051). +- Fixed bug Missing VersionInfo file in multiple projects (Oracle Bug #37240118). +- Fixed bug ConcurrencyFix - Added back in RowCount checking (MySQL Bug #115853, Oracle Bug #36960454). Thanks to Ryan Kelly for the contribution. + + +9.1.0 +- Updated test suite to use constraint-based assertions (WL16397). +- Changed testsuite to use assummptions instead of Assert.Ignore (WL16402). +- Added support for .NET 9 and EFCore 9 preview versions (WL16308). +- Added OpenTelemetry.Api NuGet package reference (WL16453). +- Fixed Code coverage (WL16309). +- Added support for OpenID Connect client authentication (WL16491). +- Fixed bug 8.0.33 Removes Important Locks (MySQL Bug #111759, Oracle Bug #35937318). Thanks to Stuart Lang for the contribution. +- Fixed bug EntityFramework SQL generation of TPT pseudo discriminator column incorrect (MySQL Bug #116028, Oracle Bug #37032982). Thanks to Kristoffer Sjöberg for the contribution. +- Fixed bug Connector does crashes when retrieving data from the database (MySQL Bug #111630, Oracle Bug #35937293). Thanks to Sidraya Jayagond for the contribution. + + +9.0.0 +- Updated NUnit to 4.x (WL16279). +- Removed deprecated OldGetStringBehavior option (WL16280). +- Remove MySqlX.Data.Performance.Console.Tests project (WL16387). +- Updated third party dependencies (WL16291). +- Remove .NET 7 and EF Core 7 (WL16386). +- Fixed bug SQL Keyword "RETURNING" not handled properly when updating data (Oracle Bug #36116171). Thanks to Wang Shiyao for the contribution. +- Fixed bug IIS Website is crashing after upgrading MySQL.Data package to 8.3.0 (Oracle Bug #36483069). +- Updated Wix Toolset to 4.0.5 (Oracle Bug #36627858). +- Fixed bug disabling of mysql_native_password in server causes errors in testsuite (Oracle Bug #36529814). +- Fixed bug EFCore test failing due to misconfiguration (Oracle Bug #36701652). + + +8.4.0 +- Updated FOSS license text in all source files (WL16197). +- Fixed bug Shared memory connection doesn't work in multithread environment (Oracle Bug #36208932). +- Fixed bug Named pipe connection doesn't work in multithread environment (Oracle Bug #36208929). +- Fixed bug Byte array type mapping has a fixed limit of 8000 in EFCore (Oracle Bug #36208913). +- Removed support for FIDO authentication (WL16150). +- Add support for TLS 1.3 (WL16176). +- Updated installer and binary metadata (WL16204). +- Fixed bug Minpoolsize different than 0 causes connector to hang after first connection (Oracle Bug #36319784). +- Fixed bug Tests failing due to removal of 'HAVE_SSL' variable from server (Oracle Bug #36374702). +- Added support for Vector data type (WL16175). +- Fixed bug Fix deadlock in mysql poolmanager attempt (Oracle Bug #36380976). Thanks to Marek Matys for the contribution. +- Fixed bug Test failing due to removal of 'default_authentication_plugin' server variable (Oracle Bug #36405198). + + +8.3.0 +- Added support for build traversal (WL15798). +- Added AssemblyInfo file to MySQL.Data.OpenTelemetry (Oracle Bug #35957212). +- Fix broken .GetString() behavior on MySqlDataReader (WL15972). +- Fixed a bug that prevented a connection from being removed from the in use connection pool. (MySQL Bug #112123, Oracle Bug #35731216). +- Added missing target frameworks to EFCore nuget packages (Oracle Bug #35968775). +- Added missing README files to Nuget packages (WL16041). +- Upgraded the Google.Protobuf dependency to version 3.25.1 (WL16075). +- Added support for .NET 8 and EFCore 8 GA versions (WL16035). +- Fixed a bug that permitted to open a disposed connection (MySQL bug #112399, Oracle bug #35827809). + + +8.2.0 +- Migrated installer to Wix 4.0 (WL15847). +- Fixed bug Opening two MySqlConnections simultaneously can crash (Oracle Bug #35307501). +- Added support for .NET 8 and EF Core 8 preview versions (WL15792). +- Combined EFCore projects into single project (WL15799). +- Fixed bug Power BI Desktop & MS Excel don't work with v8.0.33 of the Connector/Net Driver (Oracle Bug #35379875). +- Updated BouncyCastle nuget package (MySQL Bug #111361,Oracle Bug #35488339). +- Added support for the WebAuthn authentication client-side plugin (WL15193). + + +8.1.0 +- Removed GetSchema code that used direct access to mysql.proc table (WL15643). +- Removed code that used SHOW CREATE PROCEDURE to enumerator procedure parameters (WL #15644). +- Removed 'PROCEDURES WITH PARAMETERS' schema collection (WL15654). +- Fixed bug where the MySqlDbType was not preserved on a clone (Oracle Bug #34993796). +- Fixed bug can't insert negative number using prepared statement with MySqlDbType.Int24 (Oracle Bug #34694519). +- Re-enable Zstandard compression in X DevAPI [WL15708]. +- Remove support for .NET Core and EF Core 3.1 and 5.0 [WL15797]. +- Updated non signed libraries (Oracle Bug #35052869). +- Added missing dll to installer (Oracle Bug #35360846). +- Added support for OpenTelemetry tracing (WL15707). + + +8.0.33 +- Added support for OCI ephemeral key-based authentication (WL15489). +- Re implemented the asynchronous methods for the Classic protocol (WL15484). +- Added support for mapping documents to custom types using X DevAPI (WL15476). +- Added missing summaries for some classes and methods in the API documentation (Oracle Bug #34975410). +- Fixed MySqlCommand.LastInsertedId is incorrect if multiple rows are inserted (Oracle Bug #34993798). +- Reverted old code that allowed calling some procedures without using the StoredProcedure CommandType (Oracle Bug #29722378). +- Upgraded .NET Framework 4.5.2 to .NET Framework 4.6.2 with regard to packaging minimum version (WL15641). +- Changed broken references in summaries for some classes on the API documentation (Oracle Bug #35141281). +- Deprecate the `Procedures with Parameters` schema collection (WL #15645). +- Remove 3rd party libraries from install bundles (WL #15682). +- Removed ZstdNet libraries from MySql.Data (Oracle Bug #35281610). + + +8.0.32.1 +- Fixed a bug related to how the authentication libraries are added to the NuGet Package (MySQL Bug #109670, Oracle Bug #34990010). + + +8.0.32 +- Fixed a bug that raised a NullReferenceException when using the MySqlCommand.Cancel function with a closed connection (MySQL Bug #101507, Oracle Bug #32127591). +- Upgraded the Google.Protobuf dependency to version 3.21.9 (WL15408). +- Added support to Kerberos authentication through GSSAPI on Windows clients (WL15341). +- Improved the implementation for Entity Framework Core 6.0 and 7.0 (WL15333). +- Fixed a bug affecting precondition checks on the MySqlParameterCollection.Add method (MySQL Bug #93370, Oracle Bug #28980952). +- Fixed a bug that prevented copying all parameter properties using the MySqlParameter.Clone method (MySQL Bug #92734, Oracle Bug #28777779). +- Added the support to use a stream for bulk loading data (MySQL Bug #74392, Oracle Bug #21049228). Thanks to Alexander Reinert for the contribution. +- Fixed a bug that prevented showing the MySqlException.Number property value for authentication-related exceptions (MySQL Bug #78426, Oracle Bug #21830667). +- Fixed a bug that prevented the correct behavior when inserting data by replacing the value of the MySQL Server sql_mode variable with "ANSI" if using Entity Framework 6 (MySQL Bug #79678, Oracle Bug #22564126). +- Upgraded the EFCore 7 and .NET 7 support from preview to GA version (WL15334). +- Fixed a bug that raised an exception when a LINQ query attempted to partially compare items from a string function using LIKE pattern matching (MySQL Bug #103160, Oracle Bug #34498485). +- Fixed a bug related to how the unloading of the assembly was handled (MySQL Bug #108837, Oracle Bug #34724334). Thanks to Gabriele Gervasi for the contribution. +- Fixed how the connection string is analyzed so it does not get analyzed twice (MySQL Bug #102964, Oracle Bug #32680315). +- Fixed a bug that prevented the return of the correct LastInsertedId when executing multiple insert statements in one command (MySQL Bug #97061, Oracle Bug #30365157). +- Fixed a bug that returned an unexpected value when getting an integer from a TINYINT column (MySQL Bug #99091, Oracle Bug #31087580). +- Fixed a bug that prevented the correct behavior of Parameters with Output Direction in text commands (MySQL Bug #75267, Oracle Bug #20259756). +- Fixed a bug that prevented authentication when using the OCI authentication plugin (MySQL Bug #109256, Oracle Bug #34851463). + + +8.0.31 +- Removed the MySql.EMTrace project (WL5158). +- Removed the Memcached client from Connector/NET (WL15213). +- Added support for the .NET 7.0 preview release (WL15195). +- Implemented the DNS SRV query resolver (WL14016). +- Added support for the EF Core 7.0 preview release (WL15194). +- Fixed a bug that prevented the proper installation of Connector/NET (MySQL Bug #107316, Oracle Bug #34189859). +- Changed the exception that Connector/NET throws when a connection timeout expires (from TimeoutException to MySqlException) (MySQL Bug #107600, Oracle Bug #34299402). +- Contribution: Added PackageLicenseExpression to display licensing information from NuGet (MySQL Bug #108091, Oracle Bug #34477295). Thanks to Matthew Steeples for the contribution. +- Fixed a bug that raised an exception when trying to do an equality check on Datetime.Date (MySQL Bug #107618, Oracle Bug #34317220). +- Fixed a bug that overrode the query attribute's value when using command parameters with the same name (MySQL Bug #105728, Oracle Bug #33620022). +- Improved the performance for the Add(object value) method of the MySqlParameterCollection object (MySQL Bug #105997, Oracle Bug #33710643). +- Fixed a bug that closes the connection when an exception occurs and prevents the rollback from happening when using transactions (MySQL Bug #107110, Oracle Bug #34107186). +- Fixed a bug that raised an exception when using Int24 data type in prepared commands (MySQL Bug #95986, Oracle Bug #29959095). +- Contribution: Fixed a malformed URL (MySQL Bug #108290, Oracle Bug #34535732). Thanks to Adam Croot for the contribution. +- Fixed a bug that prevented the use of a MemoryStream object as a MySqlParameter value parameter (MySQL Bug #102593, Oracle Bug #32506736). + + +8.0.30 +- Deprecated the MySql.EMTrace project. This will be removed in 8.0.31 (WL15159). +- Deprecate memcached client. This will be removed in 8.0.31 (WL15163). +- Fixed a bug that raised an exception when using the named-pipe protocol to connect to MySQL Server (MySQL Bug #106765, Oracle Bug #33974737). +- Updated the link to the Oracle Contributor Agreement (OCA) page specified in the CONTRIBUTING file (MySQL Bug #107048, Oracle Bug #34082302). +- Updated the BouncyCastle NuGet dependency to use a most convenient version (MySQL Bug #106370, Oracle Bug #33827732). +- Updated test cases for UTF8 collation mappings (MySQL Bug #107256, Oracle Bug#34156197). +- Fixed a bug that prevented the correct use of the TryGetValue method for the MySqlConnectionStringBuilder object (MySQL Bug #104910, Oracle Bug #33351775). +- Fixed a bug that prevented SSL connections using chained certificates (Oracle Bug #33179908). +- Fixed a bug that prevented executing stored procedures with backtick (`) characters in the name (MySQL Bug #104913, Oracle Bug #33338458). +- Fixed a bug that permitted using an empty string to represent a document path in the Modify methods of a Collection (MySQL Bug #107487, Oracle Bug #34243143). +- Fixed a bug that occurred when using MySqlDbType.Enum as the parameter type in a prepared statement (MySQL Bug #106247, Oracle Bug #33827735). +- Fixed the connection pool cleanup by changing the idle list from Queue type to LinkedList type (MySQL Bug #106368, Oracle Bug #33935441). +- Fixed a bug that prevented cancelling the OpenAsync operation when passing a CancellationToken object as an argument (MySQL Bug #106243, Oracle Bug #33781447). + + +8.0.29 +- Aligned the TLS/SSL connection options verification across connectors (WL14828). +- Fixed a bug that prevented the generation of a complete MySqlAttributeCollection at the moment of cloning a MySqlCommand (MySQL Bug #105730, Oracle Bug #33613687). +- Added support for the FIDO authentication client-side plugin (WL14781). +- Fixed a bug that prevented using MySqlCommandBuilder for tables with BIGINT unsigned columns as the primary key (MySQL Bug #105768, Oracle Bug #33650097). +- Fixed a bug that prevented obtaining the "Procedure Parameters" collection by using the GetSchema method (MySQL Bug #105181, Oracle Bug #33674814). +- Fixed a bug that occurred when using tabs instead of white spaces in a query (MySQL Bug #78760, Oracle Bug #21971751). +- Fixed a bug that occurred when a DateTime LINQ expression is compared against a DB date field (MySQL Bug #103436, Oracle Bug #32965150). +- Fixed a bug that raised an exception when trying to retrieve the value of a BINARY column by using the MySqlDataReader.GetFieldValue method (MySQL Bug #106244, Oracle Bug #33781449). +- Fixed a bug caused by an exception type that was changed. Reverted to MySqlException type (MySQL Bug #106242, Oracle Bug #33781445). +- Added the missing summaries for some classes in the API documentation (Oracle Bug #33775282). +- Added the Connector/NET version number to the API documentation (Oracle Bug #33775317). +- Added missing description for MySqlSslMode.Prefered (Oracle Bug #33784669). +- Upgraded the Google.Protobuf dependency to version 3.9.14 (WL15082). +- Fixed a bug that prevented the proper installation of Connector/NET by using the msi package (Oracle Bug #33843853). +- Fixed a bug that raised an exception when using X DevAPI and trying to insert a string value containing special characters (MySQL Bug #100314, Oracle Bug #31692694). + + +8.0.28 +- Added support for .NET 6.0 (WL14734). +- Added support for multifactor authentication (WL14653). +- Removed support for the TLSv1.0 and TLSv1.1 protocols (WL14811). +- Fixed a bug caused by the mishandling of parameters and query attributes (Oracle Bug #33380176). +- Added missing summaries to MySql EF Core types (Oracle Bug #33513153). +- Changed access modifier from public to internal for Resources file in EF and Web projects (Oracle Bug #33513545). +- Improved the test suite configuration (WL14662). +- Fixed wrong type classification in the API documentation (Oracle Bug #33509644). +- Fixed unexpected behavior when multiple hosts are used and the first fails with a MySQL exception (Oracle Bug #30581109). +- Added support for EF Core 6 (WL14735). +- Fixed a bug that occurred when the OpenAsync method is invoked with multithreading (MySQL Bug #92465, Oracle Bug #28662512). +- Fixed a bug that occurred when trying to retrieve the IndexColumns schema on a database that has a FULLTEXT index defined (MySQL Bug #75301, Oracle Bug #20266825). +- Fixed a bug that occurred when accessing a database in which the character set equals "utf8mb3" (MySQL Bug #105516, Oracle Bug #33556024). +- Fixed a bug that occurred when cloning a parameter to ensure the SourceColumnNullMapping property is copied with the right value (MySQL Bug #74533, Oracle Bug #20056757). +- Fixed how the length of connection attribute values are calculated for sending across the wire (MySQL Bug #92789, Oracle Bug #28824591). +- Added missing implementation of the IConvertible interface for type MySqlDateTime (MySQL Bug #82661, Oracle Bug #24495619). +- Fixed how parameters are created, ensuring that the values of type DbType and MySQLDbType match (MySQL Bug #81586, Oracle Bug #23343947). +- Fixed wrong setting of the default value in integral type parameters (MySQL Bug #101253, Oracle Bug #32050204). +- Removed an extra query when inserting multiple batched rows using MySqlDataAdapter (MySQL Bug #71626, Oracle Bug #20328929). +- Fixed a bug that occurred when reading a zero time value after reading a nonzero time value (MySQL Bug #105209, Oracle Bug #33470147). +- Fixed a bug that prevented the use of microseconds in a timespan value when using prepared statements (MySQL Bug #103801, Oracle Bug #32933120). +- Fixed a bug caused by a missing implementation of the GetStream method for the MySqlDataReader (MySQL Bug #93374, Oracle Bug #28980953). +- Fixed wrong behavior when doing a batch insert and the packet is larger than max_allowed_packet (MySQL Bug #80693, Oracle Bug #22913833). + + +8.0.27 +- Added support for reading and processing session trackers (WL14678). +- Added client-side Kerberos authentication plugin support for Windows (WL14654). +- Added support for the OCI IAM authentication plugin (WL14708). +- Fixed a bug that prevented connections using "Preferred" SSL mode when the server did not support secure connections (MySQL Bug #104541, OracleBug Bug #33191344). +- Fixed a bug that occurred when creating a connection and a new transaction is initiated using a server with variable autocommit set globally to zero (Oracle Bug #33123597). +- Changed the API docs generator tool from Sandcastle to DocFX (WL14117). +- Migrated the current QA test suite to the main repository (WL14389). +- Fixed a bug that prevented querying CHAR(36) data type columns when using prepared commands (MySQL Bug #103390, Oracle Bug #32938630). +- Fixed a bug that prevented the use of fully qualified procedures or functions names (MySQL Bug #104244, Oracle Bug #33097912). + + +8.0.26 +- Deprecated TLSv1.0 and TLSv1.1 (WL14554). +- Added support for the Kerberos authentication plugin (WL14429). +- Added support for query attributes (WL14209). +- Fixed inconsistent behavior of the ReplaceOne and AddOrReplaceOne methods in the MySqlX.XDevAPI namespace (MySQL Bug #103310, Oracle Bug #32763765). +- Fixed a bug that prevented connections using Named Pipes and Shared Memory connection protocols (Oracle Bug #32853205). +- Removed the support for Kerberos authentication on Windows (Oracle Bug #32867404). +- Added support for the EF Core 6.0 preview release (WL14578). +- Added descriptions and renamed the MySqlGuidFormat enumeration (was MySQLGuidFormat) (Oracle Bug #32651245). +- Removed unnecessary references in the MySql.Web project (MySQL Bug #103433, Oracle Bug #32805002). +- Added the Connector/NET assemblies into the MSI file and ZIP Package, target Frameworks included are .NET Framework 4.5.2, .NET Framework 4.8, .NET Standard 2.0, .NET Standard 2.1 and .NET 5.0 (WL14616). +- Fixed an error provoked by a duplicate schema name when using Entity Framework (MySQL Bug #101236, Oracle Bug #32358174). + + +8.0.25 +- This release contains no functional changes and is published to align the version number with the MySQL Server 8.0.25 release. + + +8.0.24 +- Added support for the SASL authentication protocol using the GSSAPI/Kerberos method (WL14210). +- Added a more descriptive message for when a connection is closed by server due to a timeout (WL14393). +- Added Support for connection close notification (WL14208). +- Fixed a bug that affected driver performance by incrementing the execution time (MySQL Bug #101714, Oracle Bug #32386454). +- Removed the "Ignore Prepare" connection string option (Oracle Bug #31872906). +- Fixed bad handling of NULL values for GUID data type columns (MySQL Bug #101252, Oracle Bug #32049837). +- Added missing data type mappings to Entity Framework Core projects (MySQL Bug #102381, Oracle Bug #32424742). +- Fixed a bug that interpreted the pound symbol in a JSON column incorrectly when using accent sensitive collation (MySQL Bug #102393, Oracle Bug #32429236). +- Added .NET 4.8 to the non-supported frameworks for using deflate_stream compression algorithm (Oracle Bug #32488373). +- Added GUID mapping to EntityFrameworkCore (MySQL Bug #93398, Oracle Bug #32173133). +- Contribution: Added error codes to handle different types of exceptions (MySQL Bug #101592, Oracle Bug #32150115). Thanks to Stanislav Revin for the contribution. +- Removed the SSH tunneling feature (WL14562). + + +8.0.23 +- Added support for .NET Framework 4.8 in MySQL.Web (Oracle Bug #31799902). +- Replace language in source code and files (WL14211). +- Deprecated the "Ignore Prepare" connection string option (Oracle Bug #31872906). +- Added support for the SASL authentication protocol using the SCRAM-SHA-256 method (WL14255). +- Updated the list of SSH ciphers, added validation for Host Key Algorithms (Oracle Bug #31917057). +- Fixed a bug that prevented the Certificate Thumbprint from being checked during a connection (MySQL Bug #100926, Oracle Bug #31954655). +- Fixed a bug caused by a wrong casting when calling the EnsureCreatedAsync method, using EF Core, if the database already exists (MySQL Bug #100773, Oracle Bug #31860492). +- Fixed bad handling of Wait() for an async execution that could cause a program to hang indefinitely hence blocking it (MySQL Bug #100692, Oracle Bug #31945397). +- Removing aliases(address,addr,network address) for server option in the connection string.(Oracle Bug #31248601) +- Fixed a bug caused by setting an Int32 default value to any enum parameter (MySQL Bug #84701, Oracle Bug #25467610). +- Fixed a bug that allowed the insertion of a parameter with "-1" as index (MySQL Bug #100522, Oracle Bug #31754599). +- Added support for EF Core 5.0 (WL14214). +- Fixed the COM_STMT_EXECUTE packet structure to only send new-params-bound flag when it has parameters (Oracle Bug #32208427). +- Fixed types validation for stored procedure parameters (MySQL Bug #101302, Oracle Bug #32066024). + + +8.0.22 +- Fixed an error that occurred when trying to find the "__EFMigrationHistory" table during a migration using EF Core (MySQL Bug #85902, Oracle Bug #2501276). +- Fixed a third-party library that was built in debug mode now is built in release mode (MySQL Bug #98955, Oracle Bug #31061034). +- Fixed an error that occurred when using the Convert.ToString method on a property of an entity in EF Core (MySQL Bug #99523, Oracle Bug #31337609). +- Fixed a bug that sets column to "NOT NULL" when using the alter-column migration script (MySQL Bug #96913, Oracle Bug #31070175). +- Added support for Entity Framework 6.4 that runs over .NET Core 3.1 (WL14076). +- Added support for .NET 5.0 (WL14044). +- Added the new 'allowLoadLocalInfileInPath' connection string option that allows the user to specify a safe path where files can be sent to server using Load Data Local (WL-14093). +- Added support for configurable compression algorithms (WL14001). +- Fixed a bug that occurred when MySqlParameter, specifically created with value zero, is mapped as MySQLDbType with a default value of null, instead of an Int32(MySQL Bug #85027, Oracle Bug #25573071 ). +- Added support for the SASL authentication protocol using SCRAM-SHA-1 method (WL14116). +- Added support for the mysql_clear_password plugin (WL14002). +- Fixed the creation of corrupted sql statements by the MigrationSqlGenerator in EF (MySQL Bug #80159, Oracle Bug #22669961). +- Fixed how microseconds are set in the MySqlTime class. (MySQL Bug #100218, Oracle Bug #31623730). +- Fixed the wrong mapping from TINYINT(1)/BIT(1) to BOOL using scaffolding in EF Core (MySQL Bug #99419, Oracle Bug #31304070). +- Added a missing implementation to TCPClient (MySQL Bug #82810, Oracle Bug #26427802). +- Fixed a bug that is present only with MySQL Server versions before than 8.0, as previous versions return a different data type while retrieving ROUTINE_DEFINITION value(MySQL Bug #100208, Oracle Bug #31622907). +- Fixed a bug that occurred because of a bad interpretation of every CHAR(36) column as GUID type (MySQL Bug #93399, Oracle Bug #29963760). +- Fixed a bug that prevented the use of EF Code First Migrations when the system decimal separator was a character other than "." (MySQL Bug #94358, Oracle Bug #30965702). +- Fixed a bug that misinterpreted a DateTime value as a String (MySQL Bug #100159, Oracle Bug #31598178). +- Fixed missing table schemas when using EF Code First (MySQL Bug #94343, Oracle Bug #31323788). +- Deprecated aliases(address,addr,network address) for server option in the connection string.(Oracle Bug #31248601) +- Fixed an error that occurred when trying to execute a procedure and the database was not specified in the connection string (MySQL Bug #100306, Oracle Bug #31669587). +- Contribution added: Included validation that checks if the connection is not null before canceling a command to avoid unwanted exceptions (MySQL Bug #86836, Oracle Bug #26362494). Thanks to Denis Yarkovoy for the contribution. +- Fixed a bad reading of the ReservedWords that results in an incorrect data (MySQL Bug #89639, Oracle Bug #27536342). +- Fixed the missing length specifier for a binary column when it was provided (MySQL Bug #81179, Oracle Bug #23171349). +- Fixed the wrong exception handling when setting the command timeout to a negative value (MySQL Bug #87316, Oracle Bug #26574860). +- Added a FormatException exception to indicate when the data type defined in a stored procedure is a type other than MySqlParameter and the Prepare() method is used.(MySQL Bug #99793, Oracle Bug #31458774). + + +8.0.21 +- Revised SqlNullValueException, raised when a stored procedure is executed by a user with sufficient privileges(MySQL Bug #96143, Oracle Bug #30029732). +- Fixed an error that returned a BLOB object, instead of the expected MySqlGeometry object, when the wrong type assignment was used with the AddWithValue method to define a command parameter and the type was inferred (MySQL Bug #96499, MySQL Bug #96498, Oracle Bug #30169716, Oracle Bug #30169715). +- Fixed an issue in which the wrong isolation level was obtained after a transaction finished (MySQL Bug #86263, Oracle Bug #26035791). +- Fixed an error caused by a missing unsigned flag when a bigint field is used.(MySQL Bug #95382, Oracle Bug #29802379). +- Fixed an error that returned NullReferenceException when initializing a MySqlConnection with null (MySQL Bug #98322, Oracle Bug #30791289). +- Contribution added: Fixed a typo in SimpleRoleProvider.GetRoleId that caused an unexpected behavior (MySQL Bug #83657, Oracle Bug #25046352). Thanks to Stein Setvik for the contribution. +- Fixed an error that occurred while parsing a MySqlTimeSpan data type (MySQL Bug #91770, Oracle Bug #28393733). +- Added code to clean up the internal ResulSet in DataReader (MySQL Bug #97300, Oracle Bug #30444429). +- Fixed an error that occurred when having two databases with same table on a rename-column migration (MySQL Bug 72424, Oracle Bug #23291095). +- Fixed an error that occurred when the database name or stored procedure name contains a period "." (MySQL Bug #99371, Oracle Bug #31237338). +- Fixed a bug that occurred when a database name is set as uppercase in the connection string, but the actual database name is lowercase.(Oracle Bug #31173265). + + +8.0.20 +- Fixed an error that occurred unexpectedly when an IN operator with blank spaces was part of a SELECT statement (Oracle Bug #29838254). +- Added support to handle Schema validation in the commands CreateCollection and ModifyCollection (WL13007) +- Added support for compressing data exchanged between the server and client when using the X Protocol. A new connection option, + compression, provides the following values: Preferred (Default), Required, Disabled (WL12980). +- Removed the ResetReader method when a MySqlCommand object is disposed of, because it restricted access to the MySqlDataReader object after the MySqlCommand object closed (MySQL Bug #89159, Oracle Bug #27441433). +- Added support for EF Core 3.1 (WL13793). +- Fix an error that occurred when using EF Core 3.1 due to unsupported version (MySql Bug #96990, Oracle Bug #30347893). +- Fixed a bug on prepared statements with parameters of type MySqlDbType.JSON(MySQL Bug #95984, Oracle Bug #29959124). +- Fixed the Method Not Implemented exception when trying to use Entity Framework Core 3.1.1 Scaffolding (MySQL Bug #98011, Oracle Bug #30677382). +- Fixed bad handling of nullable boolean properties in Entity Framework Core (MySQL Bug #93028, Oracle Bug #29833103). +- Fixed an error that occurred when more than one IP address is found in DNS for a named host (MySQL Bug #97448, Oracle Bug #30970949). + + +8.0.19 +- Fixed unexpected behavior when connection string is retrieved, it discloses connection password in a clone connection(MySQL Bug #97473, Oracle Bug #30502718). +- Added support for multi-host and failover (WL13304). +- Added support for DNS SRV records (WL13368). +- Added new 'TlsVersion' connection string option (WL12748). +- Added support for TLSv1.3 only in .NET Framework 4.8 and .NET Core 3.0. Known issue: Be sure to confirm that the platform operating system running your application also supports TLSv1.3 before using it exclusively for connections (Bug #30225427) (WL12748). + + +8.0.18 +- Added support for IPv6. +- Fixed an error involving a rename-table operation in Entity Framework Core migrations (MySQL Bug #90958, Oracle Bug #28107555). +- Fix to retrieve the correct value from a Year type column when using prepared commands (MySql Bug #91751, Oracle Bug #28383721). +- Removed hard dependency with Renci.SshNet.dll (MySQL Bug96614, Oracle Bug #30215984). +- Added support for .NET Core 3.0 (WL13114) +- Implemented end-of-support for all .NET Core 1.x versions (WL13387). + + +8.0.17 +- Fixed wrong order of records for columns when using MySqlConnection.GetSchema (MySql Bug #94773, Oracle Bug #29536344). +- Added SSH tunnelling to X Protocol and MySQL classic protocol connections for use with the SshHostName, SshUserName, SshPassword, SshKeyFile, SshPassphrase, and SshPort connection options (WL12747). +- Added support for .NET Core 2.2 (WL12337). +- MySqlX: Deprecated Where condition usage in the Find, Modify and Remove methods (WL12983). +- Added the README.md and CONTRIBUTING.md files (WL12970). +- MySqlX: Added OVERLAPS and NOT_OVERLAPS as operators (WL12749). +- MySqlX: Added support for utf8mb4 binary no-pad collation (WL13099). +- MySqlX: Removed a limitation preventing the creation of an index on document fields that contains arrays (WL12176). +- Fix to correct wrong TimeZone returned when using MySqlDataReader['columnName'] to get DateTime type values (Oracle Bug #28156187). +- Contribution added: Add CreateCommandBuilder and CreateDataAdapter to MySqlClientFactory (MySQL Bug #92206, Oracle Bug #28560189). Thanks to Cédric Luthi for the contribution. +- Fix null DbDataAdapter and DbCommandBuilder objects when using CreateDataAdapter and CreateCommandBuilder respectively (MySQL Bug #88660, Oracle Bug #27292344). + + +8.0.16 +- MySqlX: Added prepared statement support (WL12174). +- MySqlX: Values and binding parameters are not cleared after an execution, so a new execution can use the previous parameters. +- MySqlX bug fix: BIND WITH FIND/REMOVE DOESN'T WORK WHEN STRING IS PASSED (Oracle Bug #29304767). +- MySqlX bug fix: DELETE WHERE THROWS PARSE EXCEPTION WITH -> OPERATOR FOR ARRAY (Oracle Bug #29347028). +- Bug fix: PREPARED COMMANDS EXECUTE WITH ERROR ON MYSQL SERVER 8.0.13 (MySQL Bug #92912, Oracle Bug #28834253). +- MySqlX: Added support for new session reset functionality (WL12515). +- MySqlX: Added the Connection Attributes property (WL12514). +- Added support for SSL connections using PEM certificates with the sslCA, sslCert and sslKey connection options (WL12494). +- Fixed an issue that convert 00:00:00 (Time) to null when using prepared commands (MySQL Bug #91752, Oracle Bug #28383726). + + +8.0.15 +- Bug fix: Disabled Load Data Local Infile by default (Oracle Bug #29259767). +- Added new "allowloadlocalinfile" connection string option that disables or enables the server functionality to load the data local infile. +- Contribution added: Fix to add missing invariant culture on parse methods (MySQL Bug #94045, Orale Bug #29262195). Thanks to Effy Teva for the contribution. +- Added a fix to avoid running "SHOW VARIABLES" query (MySQL Bug #93202, Oracle Bug #28928543). +- Fixed a bug that throws an exception 24.9 days after a server was restarted (MySQL Bug #75604, Oracle Bug #26930306). + + +8.0.14 +- MySqlX: Added revisions to be prepared for unknown types of initial notices on a connection (WL12517). +- MySqlX: Standardize count method for X Protocol (WL12518). +- MySqlX: Removed class members that were previously deprecated and replaced with types that support the X DevAPI standard (WL12031). +- Expose metadata about source and binaries in unified way (WL12274). + + +8.0.13 +- MySqlX: Connect-Timeout connection option implemented for X Protocol. +- Improved the performance for index creation by removing redundant client-side validations already being done on the server side (MySQL Bug #91631, Oracle Bug #28343828). +- Improved the performance when opening connections by refactoring the MySqlConnectAttrs class. Improved the performance in Windows environments by optimizing the query that identifies the operating system details (MySQL Bug #80030, Oracle Bug#22580399). +- Fixed an SQL syntax error thrown when a point type is evaluated. Changed SRID() function to ST_SRID() since SRID() is deprecated. (MySQL Bug #27715007). +- Removed unused _fieldHashCs field from ResulSet (MySQL Bug #88950, Oracle Bug #27285641). +- Fix to correct exception, "Incorrect usage of spatial/fulltext/hash index and explicit index order", when using the Entity Framework code-first approach with MySQL 8.0 servers (Oracle Bug #27715069). +- Fixed in EF Core that when an entity property is numeric and not a key, to avoid adding the autoincrement annotation (MySQL Bug #91551, Oracle Bug #28293927). +- Contribution added: Fix to correct ArgumentOutOfRangeException raised when trying to create an instance of MySqlGeometry for an empty geometry collection (MySQL Bug #86974, Oracle Bug #26421346). Thanks to Peet Whittaker for the contribution. +- Added support for Entity Framework Core 2.1 and removed suppport for 2.0 (WL-12182). +- MySqlX: Fixed bug that throws an exception when using Set and Unset for an alphanumeric field (Oracle Bug #28094094). +- MySqlX: Added support for session pooling (WL-11841). +- Fix to correct wrong TimeZone returned when using MySqlDataReader['columnName'] to get DateTime type values (Oracle Bug #28156187). +- Contribution added: Add CreateCommandBuilder and CreateDataAdapter to MySqlClientFactory (MySQL Bug #92206, Oracle Bug #28560189). Thanks to Cédric Luthi for the contribution. +- Fix null DbDataAdapter and DbCommandBuilder objects when using CreateDataAdapter and CreateCommandBuilder respectively (MySQL Bug #88660, Oracle Bug #27292344). +- Re-introduced the Preferred SSL Mode as the default value for the classic protocol (MySQL Bug#92533, Oracle Bug #28687769). + + +8.0.12 +- MySqlX: Created the MySqlXConnectionStringBuilder class to handle X Protocol/X DevAPI specific connection options. + X Protocol/X DevAPI connection options have been removed from the MySqlConnectionStringBuilder class (WL11846). +- MySqlX: Modified multiple elements as an effort to better standarize MySQL Document Store operations with other + MySQL connectors (WL11843). +- MySqlX: Added the ColumnCount and ColumnNames properties to SqlResult and RowResult objects (Oracle Bug #27732175). +- MySqlX: The RecordsAffected property available in Result objects has been deprecated and replaced with the + AffectedItemsCount property. The WarningCount property has been added to Result objects (Oracle Bug #27732235). +- MySqlX: Added the ArrayInsert() and ArrayAppend() methods to the Modify() chain, enhancing array manipulation + (Oracle Bug #27732098). +- Fixed a bug that prevented the TreatTinyAsBoolean connection option from being set when calling the + MySqlCommand.Prepare method (MySQL Bug #88472, Oracle Bug #27113566). +- Fix to correct wrong result type returned by MySqlDataReader after null found (MySQL Bug #78917, Oracle Bug #22101727). +- Contribution added: Fixing encoding (MySQL Bug #90316, Oracle Bug #27818822). Thanks to Kleber Syd Moraes da Silva for the contribution. +- Contribution added: Fixing CONCURRENCYCHECK and DATABASEGENERATEDOPTION.COMPUTED (MySQL Bug #91064, Oracle Bug #28095165). Thanks to Tony OHagan for the contribution. +- Fixed an SQL syntax error thrown when a point type is evaluated. Changed SRID() function to ST_SRID() since SRID() is deprecated. (MySQL Bug #27715007). +- Removed unused _fieldHashCs field from ResulSet (MySQL Bug #88950, Oracle Bug #27285641). +- Fix to correct exception, "Incorrect usage of spatial/fulltext/hash index and explicit index order", when using the Entity Framework code-first approach with MySQL 8.0 servers (Oracle Bug #27715069). +- Fixed in EF Core that when an entity property is numeric and not a key, to avoid adding the autoincrement annotation (MySQL Bug #91551, Oracle Bug #28293927). +- Contribution added: Fix to correct ArgumentOutOfRangeException raised when trying to create an instance of MySqlGeometry for an empty geometry collection (MySQL Bug #86974, Oracle Bug #26421346). Thanks to Peet Whittaker for the contribution. +- Fixed EF Core 2.0 not supported in .NET Framework projects (MySQL Bug #90306, Oracle Bug #27815706). +- Fixed EF Core 2.0 scaffolding (MySQL Bug #90368, Oracle Bug #27898343). + + +8.0.11 +- Updated the RSA key encryption padding to RSA_PKCS1_OAEP_PADDING for the caching_sha2_password authentication plugin + when connecting to server 8.0.5 (or later) (WL11618). +- Fix for sockets stay in CLOSE_WAIT when using SSL (MySQL Bug #75022, Oracle Bug #20393654). +- Fix for unexpected ColumnSize for CHAR(63) and BLOB columns in GetSchemaTable (MySQL Bug #87868, Oracle Bug #26876582) +- Fix to correct unexpected ColummSize and IsLong values returned by MySqlDataReader.GetSchemaTable when using LongText and LongBlob data types. (MySQL Bug #87876, Oracle Bug #26876592) +- Fix to correct the wrong NumericPrecision value returned by MySqlDataReader.GetSchemaTable when NumericScale is 0 for Decimal data types. (MySQL Bug #88058, Oracle Bug #26954812) +- Added support for MySQL 8 server features (WL11326). +- Fix to avoid raising an exception during the DbContext setup. Thanks to Cédric Luthi for his contribution. (MySQL Bug #89134, Oracle Bug #25185319) +- Fixed a problem in which NuGet packages could not be installed from within Visual Studio 2015 (MySQL Bug #88838, Oracle Bug #27251839). +- Fix for bug: could not load file or assembly MySql.ConnectorInstaller when using web providers (MySQL Bug #88544, Oracle Bug #27457398). +- Fix to enable the creation of an Entity Framework model from a database, also called the database-first approach (MySQL Bug 79163, Oracle Bug #22173048). +- Fixed a bug that prevented making a connection to MySQL when using TLS/SSL for the MySqlX URI scheme (Oracle Bug #24510329). +- MySqlX: Added support for SHA256_MEMORY authentication (WL11624). +- MySqlX: Added support for locking read concurrency with NOWAIT and SKIP LOCKED (WL11307). +- MySqlX: New server document _id generation support for MySQL 8.0.5 server and higher. Removed client-side _id generation (WL11421). + + +8.0.10 +- MySqlX: Replaced the current implementation of the CreateIndex() method with new syntax that enhances the + creation of indexes (WL11131). +- MySqlX: Added the Patch() method, which provides extended functionality for updating documents and elements + within documents (WL11133). +- MySqlX: Added support for setting transaction savepoints (WL11135). +- MySqlX: Removed support for the Configuartion API (WL11362). +- MySqlX: Removed support for creating, modifying and dropping Views (WL11306). +- MySqlX: Fixed bug that prevented Plain authentication from setting the default database provided as part + of the connection string (Bug #88427, Oracle Bug #27098974). +- Fix for sockets stay in CLOSE_WAIT when using SSL (MySQL Bug #75022, Oracle Bug #20393654). +- Added support for connections to the server using an account that authenticates with the caching_sha2_password + plugin. Added the AllowPublicKeyRetrieval connection option used to allow retrieval of RSA keys from the + server (WL11081). +- Added support for .Net Core 2.0 (WL-11394). +- Added support for EF Core 2.0 (WL-11395). + + +8.0.9 +- MySqlX: Set utf8mb4 as the default charset (WL10562). +- MySqlX: Updated all DropX() methods to return void, execute without the need to call Execute() and to succeed + even if the object to be droppped does not already exist (WL10563). +- MySqlX: Added the LockShared() and LockExclusive() methods to Table.Select() and Collection.Find() command + chains, allowing safe transactional document and row updates (WL10948). +- MySqlX: Added support for setting the priority of hosts during client-side failover (WL10998). +- MySqlX: Extended the IN operator to support operations of the type: + (compExpr ["NOT"] "IN" compExpr | compExpr ["NOT"] "IN" "(" argsList ")") (WL10947). +- MySqlX: Added ReplaceOne(), AddOrReplaceOne(), GetOne() and RemoveOne() direct-execute methods to collections + (WL10949). +- MySqlX: Added support for Unix sockets (WL10201). +- MySQLX: Added support to connect to the server using an account that authenticates with the sha256_password + plugin. Added the auth connection option for specifying the authentication mechanism to be used. Set PLAIN as + the default authentication mechanism whenever TLS is enabled or Unix sockets are being used (WL10595). +- Added support to connect to the server using an account that authenticates with the sha256_password plugin. (WL10595). +- Added support for Unix sockets in dotnet core (WL10613) +- EF Core: Added async support (WL10615). +- Removed connection string options 'autoenlist' and 'includesecurityasserts' for Dotnet core (WL10564). +- EF Core: Added support for Explicit loading (WL9768). +- EF Core: Added support for multiple schemas (WL10668). +- The following connection string options will raise a PlatformNotSupportedException when used in Dotnet Core: + sharedmemoryname, integratedsecurity, pipe, logging, useusageadvisor, useperformancemonitor, interactivesession, + replication. They will be implemented in future versions. + + +8.0.8 +- MySqlX: Updated Collection's Modify() and Remove() methods to always require a search condition (WL10739). +- MySqlX: Updated the generated UUID for inserted documents to have its components in reversed order (WL10202). +- Removed ssl-enable connection option. Set "Required" as the default value for ssl-mode (WL10559). +- MySqlX: Added client-side failover when establishing a connection (WL9980). +- MySqlX: Removed XSession and renamed NodeSession to Session (WL10561). + 7.0.7 - MySqlX: Fixed configuration handling paths in Linux and MacOS (Oracle Bug #25423724). @@ -41,4 +554,4 @@ - Support for MySqlX.Session and NodeSession objects in new Dev API. - Support for Collection and Documents objects new Dev API. - Support for Relational tables in new Dev API. -- Support for Transactions in new Dev API. \ No newline at end of file +- Support for Transactions in new Dev API. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..e5612e3bd --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,65 @@ +# Contributing Guidelines + +We greatly appreciate feedback from our users, including bug reports and code contributions. Your input helps us improve, and we thank you for any issues you report or code you contribute. + +## Reporting Issues + +Before submitting a new bug report, please [check here](https://bugs.mysql.com/search.php) to see if the issue has already been reported. + +When reporting a bug, ensure your report is as detailed as possible. Please include the following: + +* Clear, reproducible steps to demonstrate the issue. +* Relevant platform and environment information. +* The specific version of the product in use. +* The version of the MySQL Server in use. +* Sample code that can help reproduce the issue, if applicable. + +## Contributing Code + +We welcome your code contributions. Before submitting code via a GitHub pull request or by filing a bug on [bugs.mysql.com](https://bugs.mysql.com), you will need to sign the Oracle Contributor Agreement (OCA). Instructions for signing the OCA are available on the [OCA Page](https://oca.opensource.oracle.com). + +**Only pull requests from contributors who have signed the OCA can be accepted.** + +### Submitting a Contribution + +1. Ensure you have a user account at [bugs.mysql.com](https://bugs.mysql.com). You'll need to reference this account when submitting your OCA. +2. Sign the Oracle Contributor Agreement. Instructions are provided on the [OCA Page](https://oca.opensource.oracle.com). +3. Validate your contribution by including tests that adequately cover the functionality you're adding. +4. Ensure the entire test suite passes with your changes applied. +5. Submit your pull request through [GitHub](https://github.com/mysql/mysql-connector-net/pulls/) or upload it to a bug record on [bugs.mysql.com](https://bugs.mysql.com) using the _Contributions_ tab. + +### Developing Your Pull Request + +1. Create your pull request, following the [project's requirements](https://dev.mysql.com/doc/connector-net/en/connector-net-installation.html). +2. Include sufficient tests to validate the new functionality. +3. Confirm that the entire test suite passes with your changes applied. +4. Submit the pull request via [GitHub](https://github.com/mysql/mysql-connector-net/pulls/) or directly via [bugs.mysql.com](https://bugs.mysql.com). + +We deeply value contributions to MySQL and thank you for supporting open-source development. + +## Setting Up a Development Environment + +You can use your preferred .NET IDE to view, edit, and compile the MySQL Connector/NET source code. For project configuration, please refer to the instructions in [Installing from Source](https://dev.mysql.com/doc/connector-net/en/connector-net-installation-source.html). + +## Running Tests + +Any code you contribute must pass our test suite. Each project has its own suite (e.g., *MySql.Data.Tests*). Be sure to run the entire test suite to ensure that no other functionality is affected by your changes. You can run the tests using your preferred IDE or via the CLI with the "dotnet" tool. + +## Getting Help + +If you need assistance or would like to reach out to the community, please use the following resources: + +* [MySQL Connector/NET Developer Guide](https://dev.mysql.com/doc/connector-net/en/) +* [MySQL Connector/NET API](https://dev.mysql.com/doc/dev/connector-net/latest/) +* [MySQL NuGet](https://www.nuget.org/profiles/MySQL/) +* [MySQL Connector/NET and C#, Mono, .Net Forum](https://forums.mysql.com/list.php?38) +* [`#connectors` channel on MySQL Community Slack](https://mysqlcommunity.slack.com/messages/connectors/) ([Sign-up](https://lefred.be/mysql-community-on-slack/) required if you do not have an Oracle account.) +* [@MySQL on X](https://x.com/MySQL/). +* [MySQL Blog](https://blogs.oracle.com/mysql/). +* [MySQL Connectors Blog archive](https://dev.mysql.com/blog-archive/?cat=Connectors%20%2F%20Languages). +* [MySQL Newsletter](https://www.mysql.com/news-and-events/newsletter/). +* [MySQL Bugs Tracking System](https://bugs.mysql.com). + +We look forward to hearing from you and encourage you to get involved. Happy coding! + +[![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/MySQL?style=social)](https://x.com/intent/follow?screen_name=MySQL) diff --git a/COPYING b/COPYING deleted file mode 100644 index c123f2d4a..000000000 --- a/COPYING +++ /dev/null @@ -1,307 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software - interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as -a special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or - modify it under the terms of the GNU General Public License as - published by the Free Software Foundation; either version - 2 of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details - type 'show w'. This is free software, and you are welcome - to redistribute it under certain conditions; type 'show c' - for details. - -The hypothetical commands 'show w' and 'show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than 'show w' and -'show c'; they could even be mouse-clicks or menu items--whatever -suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - program 'Gnomovision' (which makes passes at compilers) written - by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use -the GNU Lesser General Public License instead of this License. \ No newline at end of file diff --git a/ConnectorNet.nunit b/ConnectorNet.nunit deleted file mode 100644 index 322e0ce04..000000000 --- a/ConnectorNet.nunit +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Dependencies/MITLibs/comerr64.dll b/Dependencies/MITLibs/comerr64.dll new file mode 100644 index 000000000..70753cc79 Binary files /dev/null and b/Dependencies/MITLibs/comerr64.dll differ diff --git a/Dependencies/MITLibs/gssapi64.dll b/Dependencies/MITLibs/gssapi64.dll new file mode 100644 index 000000000..21d6feb38 Binary files /dev/null and b/Dependencies/MITLibs/gssapi64.dll differ diff --git a/Dependencies/MITLibs/k5sprt64.dll b/Dependencies/MITLibs/k5sprt64.dll new file mode 100644 index 000000000..ff77f1a3b Binary files /dev/null and b/Dependencies/MITLibs/k5sprt64.dll differ diff --git a/Dependencies/MITLibs/krb5_64.dll b/Dependencies/MITLibs/krb5_64.dll new file mode 100644 index 000000000..42db6f7b1 Binary files /dev/null and b/Dependencies/MITLibs/krb5_64.dll differ diff --git a/Dependencies/MITLibs/krbcc64.dll b/Dependencies/MITLibs/krbcc64.dll new file mode 100644 index 000000000..c3891e817 Binary files /dev/null and b/Dependencies/MITLibs/krbcc64.dll differ diff --git a/Dependencies/System.Runtime.CompilerServices.Unsafe.dll b/Dependencies/System.Runtime.CompilerServices.Unsafe.dll new file mode 100644 index 000000000..c5ba4e404 Binary files /dev/null and b/Dependencies/System.Runtime.CompilerServices.Unsafe.dll differ diff --git a/Dependencies/System.Threading.Tasks.Extensions.dll b/Dependencies/System.Threading.Tasks.Extensions.dll new file mode 100644 index 000000000..eeec92852 Binary files /dev/null and b/Dependencies/System.Threading.Tasks.Extensions.dll differ diff --git a/Documentation/CodeExamples/MembershipCodeExample1.xml b/Documentation/CodeExamples/MembershipCodeExample1.xml deleted file mode 100644 index 1cb9dbaa2..000000000 --- a/Documentation/CodeExamples/MembershipCodeExample1.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - diff --git a/Documentation/CodeExamples/MembershipCodeExample2.xml b/Documentation/CodeExamples/MembershipCodeExample2.xml deleted file mode 100644 index 5c4886c48..000000000 --- a/Documentation/CodeExamples/MembershipCodeExample2.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/Documentation/CodeExamples/RoleCodeExample1.xml b/Documentation/CodeExamples/RoleCodeExample1.xml deleted file mode 100644 index a8a6adcea..000000000 --- a/Documentation/CodeExamples/RoleCodeExample1.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - diff --git a/Documentation/CollectionFiles/COL_Master.HxC b/Documentation/CollectionFiles/COL_Master.HxC deleted file mode 100644 index c5e1e44ec..000000000 --- a/Documentation/CollectionFiles/COL_Master.HxC +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Documentation/CollectionFiles/COL_Master.HxT b/Documentation/CollectionFiles/COL_Master.HxT deleted file mode 100644 index 4c6f57435..000000000 --- a/Documentation/CollectionFiles/COL_Master.HxT +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/Documentation/CollectionFiles/COL_Master_A.HxK b/Documentation/CollectionFiles/COL_Master_A.HxK deleted file mode 100644 index 8d793d1ca..000000000 --- a/Documentation/CollectionFiles/COL_Master_A.HxK +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/Documentation/CollectionFiles/COL_Master_F.HxK b/Documentation/CollectionFiles/COL_Master_F.HxK deleted file mode 100644 index 2cc2b75d6..000000000 --- a/Documentation/CollectionFiles/COL_Master_F.HxK +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/Documentation/CollectionFiles/COL_Master_K.HxK b/Documentation/CollectionFiles/COL_Master_K.HxK deleted file mode 100644 index 5e959cf79..000000000 --- a/Documentation/CollectionFiles/COL_Master_K.HxK +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/Documentation/CollectionFiles/COL_Master_N.HxK b/Documentation/CollectionFiles/COL_Master_N.HxK deleted file mode 100644 index 793b775d3..000000000 --- a/Documentation/CollectionFiles/COL_Master_N.HxK +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/Documentation/CollectionFiles/FixRegTables.exe b/Documentation/CollectionFiles/FixRegTables.exe deleted file mode 100644 index d0a2162a6..000000000 Binary files a/Documentation/CollectionFiles/FixRegTables.exe and /dev/null differ diff --git a/Documentation/CollectionFiles/IntegrationWizard.xml b/Documentation/CollectionFiles/IntegrationWizard.xml deleted file mode 100644 index d302fa3f4..000000000 --- a/Documentation/CollectionFiles/IntegrationWizard.xml +++ /dev/null @@ -1,48 +0,0 @@ - - - - MergeModule - VS_2005_VSIPCC - mysql.connectornet.en - MySQL Connector Net Documentation - - - MS_VSIPCC_v80 - FL_vsipcc_hxt_86880________.3643236F_FC70_11D3_A536_0090278A1BB8 - - - - - - - MySql.Data.HxS - {D0F879BD-DEBE-E064-F7AF-78660B022018} - - - COL_Master.HxC - {5F039555-17AF-C506-B05A-011D32179B24} - - - COL_Master.HxT - {D34AA189-F112-BDB2-9CD1-A7EAD8B81875} - - - COL_Master_K.HxK - {F8F08CBD-895C-9D66-086A-A4B1855AD01C} - - - COL_Master_A.HxK - {57C68500-B4CD-9C0E-2E6A-24F17047BBD1} - - - COL_Master_F.HxK - {E7203EE3-E572-8000-BDE3-6512A71B4540} - - - COL_Master_N.HxK - {DBBFFC13-9F08-1091-AB6E-7FDB93490DE5} - - - - - \ No newline at end of file diff --git a/Documentation/CollectionFiles/MSHelp2_RegTables__RTL_---_---.msm b/Documentation/CollectionFiles/MSHelp2_RegTables__RTL_---_---.msm deleted file mode 100644 index 29f4f8a94..000000000 Binary files a/Documentation/CollectionFiles/MSHelp2_RegTables__RTL_---_---.msm and /dev/null differ diff --git a/Documentation/DevGuide.shfbproj b/Documentation/DevGuide.shfbproj deleted file mode 100644 index fa469d82c..000000000 --- a/Documentation/DevGuide.shfbproj +++ /dev/null @@ -1,115 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - {5c97df05-1229-4b30-9711-789d0d6ff81b} - 2015.6.5.0 - - Documentation - Documentation - Documentation - - .\Output\ - ConnectorNET - - - - - - - - - - - - - - None - InheritedMembers, InheritedFrameworkMembers, Protected, SealedProtected - C:\Program Files (x86)\HTML Help Workshop\ - C:\Program Files (x86)\Common Files\microsoft shared\Help 2.0 Compiler\ - - - - - False - - - Website - .NET Framework 4.5 - True - Reference - MySQL Connector/Net - http://www.mysql.com - Copyright &#169%3b 2004, 2017, Oracle and/or its affiliates. All rights reserved. - support%40oracle.com - VS2013 - MemberName - - - - - - - - - - Set of classes used for parsing JSON strings. - Set of classes to manage connections using X protocol. - Main set of classes for the X communication protocol. - - Set of classes for the Dev API with Hybrid MySQL technology. - Set of classes used for managing relational table operations. - Set of classes used for secure access user accounts in connections. - - - - - Oracle - 1.0.0.0 - 10 - True - Standard - Blank - False - en-US - AboveNamespaces - OnlyErrors - False - False - False - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Documentation/Layout.content b/Documentation/Layout.content deleted file mode 100644 index 01efb05fc..000000000 --- a/Documentation/Layout.content +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/Documentation/Licenses for Third-Party Components/license-antlr.html b/Documentation/Licenses for Third-Party Components/license-antlr.html deleted file mode 100644 index 6583c16e4..000000000 --- a/Documentation/Licenses for Third-Party Components/license-antlr.html +++ /dev/null @@ -1,389 +0,0 @@ - - - - - - MySQL :: MySQL Connector/Net :: B.1 ANTLR 3.3 License - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -Skip navigation links - - - - - - - - - -
-
- - - - - - - -
- - -
- - - - - -
- - - - - - - - - - - - - - \ No newline at end of file diff --git a/Documentation/Licenses for Third-Party Components/license-json-net.html b/Documentation/Licenses for Third-Party Components/license-json-net.html deleted file mode 100644 index 35451327b..000000000 --- a/Documentation/Licenses for Third-Party Components/license-json-net.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - - -A.4 Json.NET (Newtonsoft.Json) - - - - - - - - - - - -
-
-
-
-

A.4 Json.NET (Newtonsoft.Json)

- -
- -
- -
-
Copyright (c) 2007 James Newton-King
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this
-software and associated documentation files (the "Software"), to deal in the Software
-without restriction, including without limitation the rights to use, copy, modify,
-merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be included in all copies
-or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
-CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
-OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
- - - - diff --git a/Documentation/Licenses for Third-Party Components/license-protobuf-csharp.html b/Documentation/Licenses for Third-Party Components/license-protobuf-csharp.html deleted file mode 100644 index 0dd5a29b3..000000000 --- a/Documentation/Licenses for Third-Party Components/license-protobuf-csharp.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - -A.3 Google Protocol Buffers - C# Port - License - - - - - - - - - - - -
-
-
-
-

A.3 Google Protocol Buffers - C# Port - License

- -
- -
- -
-
Protocol Buffers - Google's data interchange format
-
-Copyright 2008-2010 Google Inc.  All rights reserved.
-  http://github.com/jskeet/dotnet-protobufs/
-
-Original C++/Java/Python code:
-  http://code.google.com/p/protobuf/
-
-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 Google Inc. 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.
-
- - - - diff --git a/Documentation/Licenses for Third-Party Components/license-us-secure-hash.html b/Documentation/Licenses for Third-Party Components/license-us-secure-hash.html deleted file mode 100644 index 26e083256..000000000 --- a/Documentation/Licenses for Third-Party Components/license-us-secure-hash.html +++ /dev/null @@ -1,444 +0,0 @@ - - - - - - MySQL :: MySQL 5.1 Reference Manual :: A.30 RFC 3174 - US Secure Hash Algorithm 1 (SHA1) License - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -Skip navigation links - - - - - - - - - -
-
- - - - - - - -
- - - -
- - - - - - - - - -
- - - - - - - - - \ No newline at end of file diff --git a/Documentation/Licenses for Third-Party Components/license-zlib-net.html b/Documentation/Licenses for Third-Party Components/license-zlib-net.html deleted file mode 100644 index 50f2d54ba..000000000 --- a/Documentation/Licenses for Third-Party Components/license-zlib-net.html +++ /dev/null @@ -1,446 +0,0 @@ - - - - - - MySQL :: MySQL 5.1 Reference Manual :: A.35 ZLIB.NET License - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -Skip navigation links - - - - - - - - - -
-
- - - - - - - -
- - - -
- - - - - - - - - -
- - - - - - - - - \ No newline at end of file diff --git a/Documentation/Licenses for Third-Party Components/license-zlib.html b/Documentation/Licenses for Third-Party Components/license-zlib.html deleted file mode 100644 index 1c8b1053c..000000000 --- a/Documentation/Licenses for Third-Party Components/license-zlib.html +++ /dev/null @@ -1,444 +0,0 @@ - - - - - - MySQL :: MySQL 5.1 Reference Manual :: A.34 zlib License - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -Skip navigation links - - - - - - - - - -
-
- - - - - - - -
- - - -
- - - - - - - - - -
- - - - - - - - - \ No newline at end of file diff --git a/Documentation/Users Guide/CodeExamples.snippets b/Documentation/Users Guide/CodeExamples.snippets deleted file mode 100644 index 7fe87f185..000000000 --- a/Documentation/Users Guide/CodeExamples.snippets +++ /dev/null @@ -1,128 +0,0 @@ - - - - - -string schemaName = "world_x"; -// Define the connection string -string connectionString = "server=localhost;port=33060;uid=test;password=test"; -XSession session = MySqlX.GetSession(connectionString); -// Get the schema object -Schema schema = session.GetSchema(schemaName); - - - - -// Use the collection 'contryinfo' -var myCollection = schema.GetCollection("countryinfo"); -var docParams = new DbDoc(new { name1 = "Albania", _id1 = "ALB" }); - -// Find a document -DocResult foundDocs = myCollection.Find("Name = :name1|| _id = :_id1").Bind(docParams).Execute(); - -while (foundDocs.Next()) -{ - Console.WriteLine(foundDocs.Current["Name"]); - Console.WriteLine(foundDocs.Current["_id"]); -} - - - - - //Insert a new document with an id -var obj = new { _id = "UKN", Name = "Unknown" }; -Result r = myCollection.Add(obj).Execute(); - -- How to update an existing document - -// using the same docParams object previously created -docParams = new DbDoc(new { name1 = "Unknown", _id1 = "UKN" }); -r = myCollection.Modify("_id = :Id").Bind("id", "UKN").Set("GNP", "3308").Execute(); -if (r.RecordsAffected == 1) -{ - foundDocs = myCollection.Find("Name = :name1|| _id = :_id1").Bind(docParams).Execute(); - while (foundDocs.Next()) - { - Console.WriteLine(foundDocs.Current["Name"]); - Console.WriteLine(foundDocs.Current["_id"]); - Console.WriteLine(foundDocs.Current["GNP"]); - } -} - - - - -r = myCollection.Remove("_id = :id").Bind("id", "UKN").Execute(); - - - - - session.Close(); - - - - -using MySql.XDevAPI; -using MySql.XDevAPI.Common; -using MySql.XDevAPI.CRUD; -using System; - - -namespace MySQLX_Tutorial -{ - class Program - { - static void Main(string[] args) - { - - string schemaName = "world_x"; - string connectionString = "server=localhost;port=33060;uid=test;password=test"; - XSession session = MySqlX.GetSession(connectionString); - Schema schema = session.GetSchema(schemaName); - - // Use the collection 'contryinfo' - var myCollection = schema.GetCollection("countryinfo"); - var docParams = new DbDoc(new { name1 = "Albania", _id1 = "ALB" }); - - // Find a document - DocResult foundDocs = myCollection.Find("Name = :name1|| _id = :_id1").Bind(docParams).Execute(); - - while (foundDocs.Next()) - { - Console.WriteLine(foundDocs.Current["Name"]); - Console.WriteLine(foundDocs.Current["_id"]); - } - - //Insert a new document with an id - var obj = new { _id = "UKN", Name = "Unknown" }; - Result r = myCollection.Add(obj).Execute(); - - //update an existing document - docParams = new DbDoc(new { name1 = "Unknown", _id1 = "UKN" }); - r = myCollection.Modify("_id = :Id").Bind("id", "UKN").Set("GNP", "3308").Execute(); - if (r.RecordsAffected == 1) - { - foundDocs = myCollection.Find("Name = :name1|| _id = :_id1").Bind(docParams).Execute(); - while (foundDocs.Next()) - { - Console.WriteLine(foundDocs.Current["Name"]); - Console.WriteLine(foundDocs.Current["_id"]); - Console.WriteLine(foundDocs.Current["GNP"]); - } - } - - // delete a row in a document - r = myCollection.Remove("_id = :id").Bind("id", "UKN").Execute(); - - //close the session - session.Close(); - - Console.ReadKey(); - - } - } -} - - - - \ No newline at end of file diff --git a/Documentation/Users Guide/GettingStartedGuide.aml b/Documentation/Users Guide/GettingStartedGuide.aml deleted file mode 100644 index d138269df..000000000 --- a/Documentation/Users Guide/GettingStartedGuide.aml +++ /dev/null @@ -1,86 +0,0 @@ - - -
- - - Introduction - The MySQL Connector/Net 7.0.2 (or higher) getting started tutorial, provides an introduction to the X DevAPI functionality introduced with MySQL 5.7.12. X functionality includes the new X DevAPI (DevAPI), which offers a modern, integrative way to work with relational and document data without requiring SQL knowledge when developing .NET Framework applications. - - Requirements - - - Connector/Net 7.0.2 or later - - - Visual Studio 2013/2015 Community Edition - - - MySQL 5.7.12 or later - - - Download Sample Database - - A MySQL script is provided with data and a JSON collection. - - To install the world_x database sample, follow these steps: - - - Download world_x.zip from http://dev.mysql.com/doc/index-other.html - - - Extract the installation archive to a temporary location such as /tmp/. - - - Unpacking the archive results in two files, one of them named world_x.sql. - - - Connect to the MySQL server using the mysql command-line client with the following command: - shell> mysql -u root -p - Enter your password when prompted. A non-root account can be used as long as the account has privileges to create new databases. - - - Execute the world_x.sql script to create the database structure, and insert the data, by using the following command: - mysql> SOURCE /temp/world_x.sql; - Replace /temp/ with the path to the world_x.sql file on your system. - - - The database contains the following: - - - Tables - City: Information about some of the cities in those countries. - Country: Minimal information about countries of the world. - CountryLanguage: Languages spoken in each country. - - - Collections: - CountryInfo: Information about countries in the world. - - - Getting started with MySQL Connector/Net 7.0.2 (or later) - Creating an XSession - - An XSession is a high-level database session concept that is different from working with traditional low-level MySQL connections. It is important to understand that an XSession is not the same as a traditional MySQL Session. XSessions encapsulate one or more actual MySQL connections. - - - Create a new Visual Studio Console Project targeting .NET framework 4.5.1 or later. - - Use C# or Visual Basic as your preference. This tutorial will be done using C#. - - Add a reference in your project to the MySql.Data.dll 7.0.X - - Add a reference to Google.Protobuf 3.0.0 - The following lines open the session so later on, a schema can be grabbed to make some basic operations. - ClassDefinition#Define - - Finding a row inside a Collection - Once the session is instantiated a find can be executed. The example uses the previous session object created: - ClassDefinition1#Define - - Insert a new document in a collection - ClassDefinition2#Define - - How to delete an specific document - ClassDefinition3#Define - - Closing the session - ClassDefinition4#Define - These are some very basic operations that can be done with a collection which overview about what can be achieved with this new DEV API. - Here is the complete code example: - ClassDefinition5#Define - -
-
-
\ No newline at end of file diff --git a/Documentation/Users Guide/connector-net-connection-options.aml b/Documentation/Users Guide/connector-net-connection-options.aml deleted file mode 100644 index c6bec6155..000000000 --- a/Documentation/Users Guide/connector-net-connection-options.aml +++ /dev/null @@ -1,973 +0,0 @@ - - -
- Connector/Net Connection String Options Reference - - - For usage information about connection strings, see - Creating a Connector/Net Connection String. - The first table list options that apply generally to all server - configurations. The options related to systems using a connection - pool are split into a separate table. - - - - - - Allow Batch, AllowBatch - - - true - - - When true, multiple SQL statements can be sent with one command - execution. Note: starting with MySQL 4.1.1, batch statements - should be separated by the server-defined separator - character. Commands sent to earlier versions of MySQL should - be separated with ';'. - - - - - - Allow User Variables, - AllowUserVariables - - - false - - - Setting this to true indicates that the provider - expects user variables in the SQL. This option was added in - Connector/Net version 5.2.2. - - - - - - Allow Zero Datetime, - AllowZeroDateTime - - - false - - - If set to True, - MySqlDataReader.GetValue() returns a - MySqlDateTime object for date or datetime - columns that have disallowed values, such as zero datetime - values, and a System.DateTime object for - valid values. If set to False (the - default setting) it will cause a - System.DateTime object to be returned for - all legal values and an exception to be thrown for - disallowed values, such as zero datetime values. - - - - - - Auto Enlist, AutoEnlist - - - true - - - If AutoEnlist is set to true, - which is the default, a connection opened using - TransactionScope participates in this - scope, it commits when the scope commits and rolls back if - TransactionScope does not commit. - However, this feature is considered security sensitive and - therefore cannot be used in a medium trust environment. - - - - - - BlobAsUTF8ExcludePattern - - - - null - - - A POSIX-style regular expression that matches the names of BLOB columns - that do not contain UTF-8 character data. See - Character Set Considerations for Connector/Net for - usage details. - - - - - - BlobAsUTF8IncludePattern - - - - null - - - A POSIX-style regular expression that matches the names of BLOB columns - containing UTF-8 character data. See - Character Set Considerations for Connector/Net for - usage details. - - - - - - Certificate File, CertificateFile - - - null - - - This option specifies the path to a certificate file in PKCS #12 format - (.pfx). For an example of usage, see - Tutorial: Using SSL with . Was - introduced with 6.2.1. - - - - - - Certificate Password, - CertificatePassword - - - null - - - Specifies a password that is used in conjunction with a certificate - specified using the option - CertificateFile. For an example of usage, - see Tutorial: Using SSL with . Was - introduced with 6.2.1. - - - - - - Certificate Store Location, - CertificateStoreLocation - - - null - - - Enables you to access a certificate held in a personal store, rather - than use a certificate file and password combination. For an - example of usage, see - Tutorial: Using SSL with . Was - introduced with 6.2.1. - - - - - - Certificate Thumbprint, - CertificateThumbprint - - - null - - - Specifies a certificate thumbprint to ensure correct identification of a - certificate contained within a personal store. For an - example of usage, see - Tutorial: Using SSL with . Was - introduced with 6.2.1. - - - - - - CharSet, Character Set, - CharacterSet - - - - - - - Specifies the character set that should be used to encode all queries - sent to the server. Resultsets are still returned in the - character set of the result data. - - - - - - Check Parameters, CheckParameters - - - true - - - Indicates if stored routine parameters should be checked against the - server. - - - - - - Command Interceptors, - CommandInterceptors - - - - - - - The list of interceptors that can intercept SQL command operations. - - - - - - Connect Timeout, Connection - Timeout, ConnectionTimeout - - - 15 - - - The length of time (in seconds) to wait for a connection to the server - before terminating the attempt and generating an error. - - - - - - Convert Zero Datetime, - ConvertZeroDateTime - - - false - - - True to have MySqlDataReader.GetValue() and - MySqlDataReader.GetDateTime() return - DateTime.MinValue for date or datetime - columns that have disallowed values. - - - - - - Default Command Timeout, - DefaultCommandTimeout - - - 30 - - - Sets the default value of the command timeout to be used. This does not - supercede the individual command timeout property on an - individual command object. If you set the command timeout - property, that will be used. This option was added in - Connector/Net 5.1.4 - - - - - - Default Table Cache Age, - DefaultTableCacheAge - - - 60 - - - Specifies how long a TableDirect result should be - cached, in seconds. For usage information about table - caching, see - Using Connector/Net with Table Caching. - This option was added in Connector/Net 6.4. - - - - - - Encrypt, UseSSL - - - false - - - For Connector/Net 5.0.3 and later, when true, SSL - encryption is used for all data sent between the client and - server if the server has a certificate installed. Recognized - values are true, - false, yes, and - no. In versions before 5.0.3, this option - had no effect. From version 6.2.1, this option is deprecated - and is replaced by SSL Mode. The option - still works if used. If this option is set to true, it is - equivalent to SSL Mode = Preferred. - - - - - - Exception Interceptors, - ExceptionInterceptors - - - - - - - The list of interceptors that can triage thrown - MySqlException exceptions. - - - - - - Functions Return String, - FunctionsReturnString - - - false - - - Causes the connector to return binary/varbinary values as strings, if - they do not have a tablename in the metadata. - - - - - - Host, Server, Data - Source, DataSource, - Address, Addr, - Network Address - - - localhost - - - The name or network address of the instance of MySQL to which to - connect. Multiple hosts can be specified separated by - commas. This can be useful where multiple MySQL servers are - configured for replication and you are not concerned about - the precise server you are connecting to. No attempt is made - by the provider to synchronize writes to the database, so - take care when using this option. In Unix environment with - Mono, this can be a fully qualified path to a MySQL socket - file. With this configuration, the Unix socket will be used - instead of the TCP/IP socket. Currently, only a single - socket name can be given, so accessing MySQL in a replicated - environment using Unix sockets is not currently supported. - - - - - - Ignore Prepare, IgnorePrepare - - - true - - - When true, instructs the provider to ignore any calls to - MySqlCommand.Prepare(). This option is - provided to prevent issues with corruption of the statements - when used with server-side prepared statements. If you use - server-side prepare statements, set this option to false. - This option was added in Connector/Net 5.0.3 and - Connector/Net 1.0.9. - - - - - - Initial Catalog, Database - - - mysql - - - The case-sensitive name of the database to use initially. - - - - - - Interactive, Interactive Session, - InteractiveSession - - - false - - - If set to true, the client is interactive. An interactive client is one - where the server variable - CLIENT_INTERACTIVE is set. If an - interactive client is set, the - wait_timeout variable is set to the value - of interactive_timeout. The client will - then timeout after this period of inactivity. More details - can be found in the server manual - . - - - - - - Integrated Security, - IntegratedSecurity - - - no - - - Use Windows authentication when connecting to server. By default, it is - turned off. To enable, specify a value of - yes. (You can also use the value - sspi as an alternative to - yes.) For details, see - Using the Windows Native Authentication Plugin. - This option was introduced in Connector/Net 6.4.4. - - - - - - Keep Alive, Keepalive - - - 0 - - - For TCP connections, idle connection time measured in seconds, before - the first keepalive packet is sent. A value of 0 indicates - that keepalive is not used. - - - - - - Logging - - - - false - - - When true, various pieces of information is output to any configured - TraceListeners. See - Using the Trace Source Object for - further details. - - - - - - Old Guids, OldGuids - - - false - - - This option was introduced in Connector/Net 6.1.1. The backend - representation of a GUID type was changed from - BINARY(16) to - CHAR(36). This was done to allow - developers to use the server function - UUID() to populate a GUID - table - UUID() generates a 36-character - string. Developers of older applications can add - 'Old Guids=true' to the connection string - to use a GUID of data type - BINARY(16). - - - - - - Old Syntax, OldSyntax, - Use Old Syntax, - UseOldSyntax - - - false - - - This option was deprecated in Connector/Net 5.2.2. All code should now - be written using the '@' symbol as the parameter marker. - - - - - - Password, pwd - - - - - - - The password for the MySQL account being used. - - - - - - Persist Security Info, - PersistSecurityInfo - - - false - - - When set to false or no (strongly - recommended), security-sensitive information, such as the - password, is not returned as part of the connection if the - connection is open or has ever been in an open state. - Resetting the connection string resets all connection string - values, including the password. Recognized values are - true, false, - yes, and no. - - - - - - Pipe Name, Pipe, - PipeName - - - mysql - - - When set to the name of a named pipe, the - MySqlConnection will attempt to connect - to MySQL on that named pipe. This setting only applies to - the Windows platform. - - - - - - Port - - - - 3306 - - - The port MySQL is using to listen for connections. This value is ignored - if Unix socket is used. - - - - - - Procedure Cache Size, - ProcedureCacheSize, procedure - cache, procedurecache - - - 25 - - - Sets the size of the stored procedure cache. By default, Connector/Net - stores the metadata (input/output data types) about the last - 25 stored procedures used. To disable the stored procedure - cache, set the value to zero (0). This option was added in - Connector/Net 5.0.2 and Connector/Net 1.0.9. - - - - - - Protocol, Connection Protocol, - ConnectionProtocol - - - socket - - - Specifies the type of connection to make to the server. Values can be: - socket or tcp for a - socket connection, pipe for a named pipe - connection, unix for a Unix socket - connection, memory to use MySQL shared - memory. - - - - - - Replication - - - - false - - - Indicates if this connection is to use replicated servers. - - - - - - Respect Binary Flags, - RespectBinaryFlags - - - true - - - Setting this option to false means that Connector/Net - ignores a column's binary flags as set by the server. This - option was added in Connector/Net version 5.1.3. - - - - - - Shared Memory Name, - SharedMemoryName - - - MYSQL - - - The name of the shared memory object to use for communication if the - connection protocol is set to memory. - - - - - - Sql Server Mode, sqlservermode - - - false - - - Allow SQL Server syntax. When set to true, enables - Connector/Net to support square brackets around symbols - instead of backticks. This enables Visual Studio wizards - that bracket symbols with [] to work with Connector/Net. - This option incurs a performance hit, so should only be used - if necessary. This option was added in version 6.3.1. - - - - - - SSL Mode, SslMode - - - None - - - This option has the following values: - - None - do not use - SSL. - Preferred - use SSL - if the server supports it, but allow connection in all - cases. - Required - Always use - SSL. Deny connection if server does not support SSL. - VerifyCA - Always use - SSL. Validate the CA but tolerate name mismatch. - VerifyFull - Always - use SSL. Fail if the host name is not correct. - - This option was introduced in 6.2.1. - - - - - - - Table Cache, tablecache, - tablecaching - - - false - - - Enables or disables caching of TableDirect commands. - A value of true enables the cache while - false disables it. For usage information - about table caching, see - Using Connector/Net with Table Caching. - This option was added in Connector/Net 6.4. - - - - - - Treat BLOBs as UTF8, - TreatBlobsAsUTF8 - - - false - - - - - - - - - - Treat Tiny As Boolean, - TreatTinyAsBoolean - - - true - - - Setting this value to false indicates that - TINYINT(1) will be treated as an - INT. See - for a further - explanation of the TINYINT - and BOOL data types. - - - - - - Use Affected Rows, UseAffectedRows - - - false - - - When true the connection will report changed rows - instead of found rows. This option was added in - Connector/Net version 5.2.6. - - - - - - Use Procedure Bodies, - UseProcedureBodies, procedure - bodies - - - true - - - When set to true, the default value, expects - the body of the procedure to be viewable. This enables it to - determine the parameter types and order. Set the option to - false when the user connecting to the - database does not have the - SELECT privileges for the - mysql.proc (stored procedures) table, or - cannot view - INFORMATION_SCHEMA.ROUTINES. In - this case, cannot determine the types and order of - the parameters, and must be alerted to this fact by setting - this option to false. When set to - false, does not rely on this - information being available when the procedure is called. - Because will not be able to determine this - information, explicitly set the types of all the parameters - before the call and add the parameters to the command in the - same order as they appear in the procedure definition. This - option was added in 5.0.4 and 1.0.10. - - - - - - User Id, UserID, - Username, Uid, - User name, User - - - - - - - The MySQL login account being used. - - - - - - Compress, Use Compression, - UseCompression - - - false - - - - - Setting this option to true enables - compression of packets exchanged between the client and - the server. This exchange is defined by the MySQL - client/server protocol. - - - Compression is used if both client and server support ZLIB - compression, and the client has requested compression - using this option. - - - A compressed packet header is: packet length (3 bytes), - packet number (1 byte), and Uncompressed Packet Length (3 - bytes). The Uncompressed Packet Length is the number of - bytes in the original, uncompressed packet. If this is - zero, the data in this packet has not been compressed. - When the compression protocol is in use, either the client - or the server may compress packets. However, compression - will not occur if the compressed length is greater than - the original length. Thus, some packets will contain - compressed data while other packets will not. - - - - - - - - Use Usage Advisor, Usage Advisor, - UseUsageAdvisor - - - false - - - Logs inefficient database operations. - - - - - - Use Performance Monitor, - UsePerformanceMonitor, - userperfmon, perfmon - - - false - - - Indicates that performance counters should be updated during execution. - - -
- - The following table lists the valid names for options related to - connection pooling within the ConnectionString. - For more information about connection pooling, see - Using Connector/Net with Connection Pooling. - - - - - - Cache Server Properties, - CacheServerProperties - - - false - - - Specifies whether server variable settings are updated by a - SHOW VARIABLES command each time a pooled - connection is returned. Enabling this setting speeds up - connections in a connection pool environment. Your - application will not be informed of any changes to - configuration variables made by other connections. This - option was added in Connector/Net 6.3. - - - - - - Connection Lifetime, - ConnectionLifeTime - - - 0 - - - When a connection is returned to the pool, its creation time is compared - with the current time, and the connection is destroyed if - that time span (in seconds) exceeds the value specified by - Connection Lifetime. This is useful in - clustered configurations to force load balancing between a - running server and a server just brought online. A value of - zero (0) causes pooled connections to have the maximum - connection timeout. - - - - - - Connection Reset, ConnectionReset - - - false - - - If true, the connection state will be reset when it is retrieved from - the pool. The default value of false avoids making an - additional server round trip when obtaining a connection, - but the connection state is not reset. - - - - - - Maximum Pool Size, Max Pool Size, - maximumpoolsize - - - 100 - - - The maximum number of connections allowed in the pool. - - - - - - Minimum Pool Size, Min Pool Size, - MinimumPoolSize - - - 0 - - - The minimum number of connections allowed in the pool. - - - - - - Pooling - - - - true - - - When true, the MySqlConnection - object is drawn from the appropriate pool, or if necessary, - is created and added to the appropriate pool. Recognized - values are true, - false, yes, and - no. - - -
-
-
-
-
\ No newline at end of file diff --git a/Documentation/Users Guide/connector-net-core.aml b/Documentation/Users Guide/connector-net-core.aml deleted file mode 100644 index 0544d870e..000000000 --- a/Documentation/Users Guide/connector-net-core.aml +++ /dev/null @@ -1,61 +0,0 @@ - - -
- MySQL Connector/Net - - - - Connector/Net lets you easily develop .NET applications that require - secure, high-performance data connectivity with MySQL. It implements - the required ADO.NET interfaces and integrates into ADO.NET aware - tools. Developers can build applications using their choice of .NET - languages. Connector/Net is a fully managed ADO.NET driver written - in 100% pure C#. - - - Connector/Net includes full support for: - - - - - Features provided by MySQL Server up to and including MySQL - Server version 5.7.12 - - - - - Large-packet support for sending and receiving rows and BLOBs up - to 2 gigabytes in size. - - - - - Protocol compression, which enables compressing the data stream - between the client and server. - - - - - Connections using TCP/IP sockets, named pipes, or shared memory - on Windows. - - - - - Connections using TCP/IP sockets or Unix sockets on Unix. - - - - - Fully managed, does not utilize the MySQL client library. - - - - - This document is intended as a user's guide to Connector/Net and - includes a full syntax reference. - - -
-
-
\ No newline at end of file diff --git a/Documentation/Users Guide/connector-net-install.aml b/Documentation/Users Guide/connector-net-install.aml deleted file mode 100644 index d3c582ae9..000000000 --- a/Documentation/Users Guide/connector-net-install.aml +++ /dev/null @@ -1,178 +0,0 @@ - - - -
- Connector/Net Installation - - - - Connector/Net runs on any platform that supports the .NET framework. - The .NET framework is primarily supported on recent versions of - Microsoft Windows, and is supported on Linux through the Open Source - Mono framework (see - http://www.mono-project.com - http://www.mono-project.com - ). - - - Connector/Net is available for download from - - http://dev.mysql.com/downloads/connector/net/ - http://dev.mysql.com/downloads/connector/net/ - . - - -
-
- Installing Connector/Net on Windows - - - - On Windows, installation is supported either through a binary - installation process or by downloading a Zip file with the - Connector/Net components. - - - Before installing, ensure that your system is up to date, - including installing the latest version of the .NET Framework. - - -
-
- Installing Connector/Net using the Installer - - - Using the installer is the most straightforward method of - installing Connector/Net on Windows and the installed components - include the source code, test code and full reference - documentation. - - - Connector/Net is installed through the use of a Windows - Installer (.msi) installation package, which - can be used to install Connector/Net on all Windows operating - systems. The MSI package in contained within a Zip archive named - mysql-connector-net-version.zip, - where indicates the - Connector/Net version. - - - To install Connector/Net: - - - - - Double-click the MSI installer file extracted from the Zip - you downloaded. Click Next to start - the installation. - - - - - You must choose the type of installation to perform. - - - For most situations, the Typical installation is suitable. - Click the Typical button and proceed - to Step 5. A Complete installation installs all the - available files. To conduct a Complete installation, click - the Complete button and proceed to - step 5. To customize your installation, including choosing - the components to install and some installation options, - click the Custom button and proceed - to Step 3. - - - The Connector/Net installer will register the connector - within the Global Assembly Cache (GAC) - this will make the - Connector/Net component available to all applications, not - just those where you explicitly reference the Connector/Net - component. The installer will also create the necessary - links in the Start menu to the documentation and release - notes. - - - - - If you have chosen a custom installation, you can select the - individual components to install, including the core - interface component, supporting documentation (a CHM file) - samples and examples, and the source code. Select the items, - and their installation level, and then click - Next to continue the installation. - - - - - You will be given a final opportunity to confirm the - installation. Click Install to copy - and install the files onto your machine. - - - - - Once the installation has been completed, click - Finish to exit the installer. - - - - - Unless you choose otherwise, Connector/Net is installed in - - C:\Program Files\MySQL\MySQL Connector Net - X.X.X - , where - is replaced with the version of - Connector/Net you are installing. New installations do not - overwrite existing versions of Connector/Net. - - - Depending on your installation type, the installed components - will include some or all of the following components: - - - - - bin: Connector/Net MySQL libraries for - different versions of the .NET environment. - - - - - docs: Connector/Net documentation in CHM - format. - - - - - samples: Sample code and applications - that use the Connector/Net component. - - - - - src: The source code for the - Connector/Net component. - - - - - You may also use the /quiet or - /q command-line option with the - msiexec tool to install the Connector/Net - package automatically (using the default options) with no - notification to the user. Using this method the user cannot - select options. Additionally, no prompts, messages or dialog - boxes will be displayed. - - - C:\> msiexec /package connector-net.msi /quiet - - - To provide a progress bar to the user during automatic - installation, use the /passive option. - - -
-
-
\ No newline at end of file diff --git a/Documentation/Users Guide/connector-net-programming.aml b/Documentation/Users Guide/connector-net-programming.aml deleted file mode 100644 index f0aa2cb7b..000000000 --- a/Documentation/Users Guide/connector-net-programming.aml +++ /dev/null @@ -1,3407 +0,0 @@ - - -
- Connector/Net Programming - - - - Connector/Net comprises several classes that are used to connect to - the database, execute queries and statements, and manage query - results. - - - The following are the major classes of Connector/Net: - - - - - MySqlCommand: Represents an SQL statement to - execute against a MySQL database. - - - - - MySqlCommandBuilder: Automatically generates - single-table commands used to reconcile changes made to a - DataSet with the associated MySQL database. - - - - - MySqlConnection: Represents an open - connection to a MySQL Server database. - - - - - MySqlDataAdapter: Represents a set of data - commands and a database connection that are used to fill a data - set and update a MySQL database. - - - - - MySqlDataReader: Provides a means of reading - a forward-only stream of rows from a MySQL database. - - - - - MySqlException: The exception that is thrown - when MySQL returns an error. - - - - - MySqlHelper: Helper class that makes it - easier to work with the provider. - - - - - MySqlTransaction: Represents an SQL - transaction to be made in a MySQL database. - - - - - In the following sections you will learn about some common use cases - for Connector/Net, including BLOB handling, date handling, and using - Connector/Net with common tools such as Crystal Reports. - - -
-
- Connecting to MySQL Using Connector/Net - - - Introduction - - - All interaction between a .NET application and the MySQL server is - routed through a MySqlConnection object. Before - your application can interact with the server, a - MySqlConnection object must be instanced, - configured, and opened. - - - Even when using the MySqlHelper class, a - MySqlConnection object is created by the helper - class. - - - In this section, we will describe how to connect to MySQL using - the MySqlConnection object. - - -
-
- Creating a Connector/Net Connection String - - - - The MySqlConnection object is configured using - a connection string. A connection string contains several - key/value pairs, separated by semicolons. Each key/value pair is - joined with an equal sign. - - - The following is a sample connection string: - - Server=127.0.0.1;Uid=root;Pwd=12345;Database=test; - - In this example, the MySqlConnection object is - configured to connect to a MySQL server at - 127.0.0.1, with a user name of - root and a password of - 12345. The default database for all statements - will be the test database. All other options - may be found here: - . - - - - Using the '@' symbol for parameters is now the preferred - approach although the old pattern of using '?' is still - supported. - - - Please be aware however that using '@' can cause conflicts when - user variables are also used. To help with this situation please - see the documentation on the Allow User - Variables connection string option, which can be found - here: . The - Old Syntax connection string option has now - been deprecated. - - - -
-
- Opening a Connection - - - Once you have created a connection string it can be used to open - a connection to the MySQL server. - - - The following code is used to create a - MySqlConnection object, assign the connection - string, and open the connection. - - - Connector/NET can also connect using the native Windows - authentication plugin. See - Using the Windows Native Authentication Plugin - for further information. - - -Dim conn As New MySql.Data.MySqlClient.MySqlConnection -Dim myConnectionString as String - -myConnectionString = "server=127.0.0.1;" _ - & "uid=root;" _ - & "pwd=12345;" _ - & "database=test;" - -Try - conn.ConnectionString = myConnectionString - conn.Open() - -Catch ex As MySql.Data.MySqlClient.MySqlException - MessageBox.Show(ex.Message) -End Try - - -MySql.Data.MySqlClient.MySqlConnection conn; -string myConnectionString; - -myConnectionString = "server=127.0.0.1;uid=root;" + - "pwd=12345;database=test;"; - -try -{ - conn = new MySql.Data.MySqlClient.MySqlConnection(); - conn.ConnectionString = myConnectionString; - conn.Open(); -} -catch (MySql.Data.MySqlClient.MySqlException ex) -{ - MessageBox.Show(ex.Message); -} - - - You can also pass the connection string to the constructor of - the MySqlConnection class: - - -Dim myConnectionString as String - -myConnectionString = "server=127.0.0.1;" _ - & "uid=root;" _ - & "pwd=12345;" _ - & "database=test;" - -Try - Dim conn As New MySql.Data.MySqlClient.MySqlConnection(myConnectionString) - conn.Open() -Catch ex As MySql.Data.MySqlClient.MySqlException - MessageBox.Show(ex.Message) -End Try - - -MySql.Data.MySqlClient.MySqlConnection conn; -string myConnectionString; - -myConnectionString = "server=127.0.0.1;uid=root;" + - "pwd=12345;database=test;"; - -try -{ - conn = new MySql.Data.MySqlClient.MySqlConnection(myConnectionString); - conn.Open(); -} -catch (MySql.Data.MySqlClient.MySqlException ex) -{ - MessageBox.Show(ex.Message); -} - - - Once the connection is open it can be used by the other - Connector/Net classes to communicate with the MySQL server. - - -
-
- Handling Connection Errors - - - Because connecting to an external server is unpredictable, it is - important to add error handling to your .NET application. When - there is an error connecting, the - MySqlConnection class will return a - MySqlException object. This object has two - properties that are of interest when handling errors: - - - - - Message: A message that describes the - current exception. - - - - - Number: The MySQL error number. - - - - - When handling errors, you can your application's response based - on the error number. The two most common error numbers when - connecting are as follows: - - - - - 0: Cannot connect to server. - - - - - 1045: Invalid user name and/or password. - - - - - The following code shows how to adapt the application's response - based on the actual error: - - -Dim myConnectionString as String - -myConnectionString = "server=127.0.0.1;" _ - & "uid=root;" _ - & "pwd=12345;" _ - & "database=test;" - -Try - Dim conn As New MySql.Data.MySqlClient.MySqlConnection(myConnectionString) - conn.Open() -Catch ex As MySql.Data.MySqlClient.MySqlException - Select Case ex.Number - Case 0 - MessageBox.Show("Cannot connect to server. Contact administrator") - Case 1045 - MessageBox.Show("Invalid username/password, please try again") - End Select -End Try - - -MySql.Data.MySqlClient.MySqlConnection conn; -string myConnectionString; - -myConnectionString = "server=127.0.0.1;uid=root;" + - "pwd=12345;database=test;"; - -try -{ - conn = new MySql.Data.MySqlClient.MySqlConnection(myConnectionString); - conn.Open(); -} - catch (MySql.Data.MySqlClient.MySqlException ex) -{ - switch (ex.Number) - { - case 0: - MessageBox.Show("Cannot connect to server. Contact administrator"); - case 1045: - MessageBox.Show("Invalid username/password, please try again"); - } -} - - - - Note that if you are using multilanguage databases you must - specify the character set in the connection string. If you do - not specify the character set, the connection defaults to the - latin1 charset. You can specify the - character set as part of the connection string, for example: - - - -MySqlConnection myConnection = new MySqlConnection("server=127.0.0.1;uid=root;" + - "pwd=12345;database=test;Charset=latin1;"); - - -
-
- Using GetSchema on a Connection - - - - The GetSchema() method of the connection - object can be used to retrieve schema information about the - database currently connected to. The schema information is - returned in the form of a DataTable. The - schema information is organized into a number of collections. - Different forms of the GetSchema() method can - be used depending on the information required. There are three - forms of the GetSchema() method: - - - - - GetSchema() - This call will return a - list of available collections. - - - - - GetSchema(String) - This call returns - information about the collection named in the string - parameter. If the string - is used then a list of all available collections is - returned. This is the same as calling - GetSchema() without any parameters. - - - - - GetSchema(String, String[]) - In this - call the first string parameter represents the collection - name, and the second parameter represents a string array of - restriction values. Restriction values limit the amount of - data that will be returned. Restriction values are explained - in more detail in the - Microsoft - .NET documentationhttp://msdn.microsoft.com/en-us/library/ms254934(VS.80).aspx. - - - - -
-
- Collections - - - The collections can be broadly grouped into two types: - collections that are common to all data providers, and - collections specific to a particular provider. - - - Common - - - The following collections are common to all data providers: - - - - - MetaDataCollections - - - - - DataSourceInformation - - - - - DataTypes - - - - - Restrictions - - - - - ReservedWords - - - - - Provider-specific - - - The following are the collections currently provided by - , in addition to the common collections above: - - - - - Databases - - - - - Tables - - - - - Columns - - - - - Users - - - - - Foreign Keys - - - - - IndexColumns - - - - - Indexes - - - - - Foreign Key Columns - - - - - UDF - - - - - Views - - - - - ViewColumns - - - - - Procedure Parameters - - - - - Procedures - - - - - Triggers - - - - - Example Code - - - A list of available collections can be obtained using the - following code: - - -using System; -using System.Data; -using System.Text; -using MySql.Data; -using MySql.Data.MySqlClient; - -namespace ConsoleApplication2 -{ - class Program - { - - private static void DisplayData(System.Data.DataTable table) - { - foreach (System.Data.DataRow row in table.Rows) - { - foreach (System.Data.DataColumn col in table.Columns) - { - Console.WriteLine("{0} = {1}", col.ColumnName, row[col]); - } - Console.WriteLine("============================"); - } - } - - static void Main(string[] args) - { - - string connStr = "server=localhost;user=root;database=world;port=3306;password=******;"; - MySqlConnection conn = new MySqlConnection(connStr); - - try - { - Console.WriteLine("Connecting to MySQL..."); - conn.Open(); - - DataTable table = conn.GetSchema("MetaDataCollections"); - //DataTable table = conn.GetSchema("UDF"); - DisplayData(table); - - conn.Close(); - } - catch (Exception ex) - { - Console.WriteLine(ex.ToString()); - } - Console.WriteLine("Done."); - } - } -} - - - Further information on the GetSchema() - method and schema collections can be found in the - Microsoft - .NET documentationhttp://msdn.microsoft.com/en-us/library/kcax58fh(VS.80).aspx. - - -
-
- Using MySqlCommand - - - A MySqlCommand has the - CommandText and CommandType - properties associated with it. The CommandText - will be handled differently depending on the setting of - CommandType. CommandType can - be one of: - - - - - Text - A SQL text command (default) - - - - - StoredProcedure - The name of a Stored Procedure - - - - - TableDirect - The name of a table (new in Connector/Net 6.2) - - - - - The default CommandType, - Text, is used for executing queries and other - SQL commands. Some example of this can be found in the following - section The MySqlCommand Object. - - - If CommandType is set to - StoredProcedure, set - CommandText to the name of the Stored Procedure - to access. - - - If CommandType is set to - TableDirect, all rows and columns of the named - table will be returned when you call one of the Execute methods. - In effect, this command performs a SELECT * on - the table specified. The CommandText property - is set to the name of the table to query. This is illustrated by - the following code snippet: - - ... -MySqlCommand cmd = new MySqlCommand(); -cmd.CommandText = "mytable"; -cmd.Connection = someConnection; -cmd.CommandType = CommandType.TableDirect; -MySqlDataReader reader = cmd.ExecuteReader(); -while (reader.Read()) -{ - Console.WriteLn(reader[0], reader[1]...); -} -... - - Examples of using the CommandType of StoredProcedure can be found - in the section Accessing Stored Procedures with Connector/Net. - - - Commands can have a timeout associated with them. This is useful - as you may not want a situation were a command takes up an - excessive amount of time. A timeout can be set using the - CommandTimeout property. The following code - snippet sets a timeout of one minute: - - -MySqlCommand cmd = new MySqlCommand(); -cmd.CommandTimeout = 60; - - - The default value is 30 seconds. Avoid a value of 0, which - indicates an indefinite wait. To change the default command - timeout, use the connection string option Default Command - Timeout. - - - Prior to 6.2, - MySqlCommand.CommandTimeout included user - processing time, that is processing time not related to direct use - of the connector. Timeout was implemented through a .NET Timer, - that triggered after CommandTimeout seconds. - This timer consumed a thread. - - - 6.2 introduced timeouts that are aligned with how Microsoft - handles SqlCommand.CommandTimeout. This - property is the cumulative timeout for all network reads and - writes during command execution or processing of the results. A - timeout can still occur in the MySqlReader.Read - method after the first row is returned, and does not include user - processing time, only IO operations. The 6.2 implementation uses - the underlying stream timeout facility, so is more efficient in - that it does not require the additional timer thread as was the - case with the previous implementation. - - - Further details on this can be found in the relevant - Microsoft - documentationhttp://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtimeout.aspx. - - -
-
- Using Connector/Net with Connection Pooling - - - The Connector/Net supports connection pooling. This is enabled by - default. You can turn it off or adjust its performance - characteristics using the connection string options - Pooling, Connection Reset, - Connection Lifetime, Cache Server - Properties, Max Pool Size and - Min Pool Size. See - Creating a Connector/Net Connection String - for further information. - - - Connection pooling works by keeping the native connection to the - server live when the client disposes of a - MySqlConnection. Subsequently, if a new - MySqlConnection object is opened, it will be - created from the connection pool, rather than creating a new - native connection. This improves performance. - - - To work as designed, it is best to let the connection pooling - system manage all connections. Do not create a globally accessible - instance of MySqlConnection and then manually - open and close it. This interferes with the way the pooling works - and can lead to unpredictable results or even exceptions. - - - One approach that simplifies things is to avoid manually creating - a MySqlConnection object. Instead use the - overloaded methods that take a connection string as an argument. - Using this approach, Connector/Net will automatically create, - open, close and destroy connections, using the connection pooling - system for best performance. - - - Typed Datasets and the MembershipProvider and - RoleProvider classes use this approach. Most - classes that have methods that take a - MySqlConnection as an argument, also have - methods that take a connection string as an argument. This - includes MySqlDataAdapter. - - - Instead of manually creating MySqlCommand - objects, you can use the static methods of the - MySqlHelper class. These take a connection - string as an argument, and they fully support connection pooling. - - - Starting with 6.2, there is a background job that runs - every three minutes and removes connections from pool that have - been idle (unused) for more than three minutes. The pool cleanup - frees resources on both client and server side. This is because on - the client side every connection uses a socket, and on the server - side every connection uses a socket and a thread. - - - Prior to this change, connections were never removed from the - pool, and the pool always contained the peak number of open - connections. For example, a web application that peaked at 1000 - concurrent database connections would consume 1000 threads and - 1000 open sockets at the server, without ever freeing up those - resources from the connection pool. Note, connections, no matter - how old, will not be closed if the number of connections in the - pool is less than or equal to the value set by the Min - Pool Size connection string parameter. - - -
-
- Using the Windows Native Authentication Plugin - - - Connector/Net applications can authenticate to a MySQL server - using the Windows Native Authentication Plugin as of Connector/NET - 6.4.4 and MySQL 5.5.16. Users who have logged in to Windows can - connect from MySQL client programs to the server based on the - information in their environment without specifying an additional - password. For background and usage information about the - authentication plugin, see, - . - - - The interface matches the - - object. To enable, pass in Integrated Security - to the connection string with a value of yes or - sspi. - - - Passing in a user ID is optional. When Windows authentication is - set up, a MySQL user is created and configured to be used by - Windows authentication. By default, this user ID is named - auth_windows, but can be defined using a - different name. If the default name is used, then passing the user - ID to the connection string from Connector/NET is optional, - because it will use the auth_windows user. - Otherwise, the name must be passed to the - using the standard user ID element. - - -
-
- Using Connector/Net with Table Caching - - - This feature exists with Connector/NET versions 6.4 and above. - - - Table caching is a feature that can be used to cache slow-changing - datasets on the client side. This is useful for applications that - are designed to use readers, but still want to minimize trips to - the server for slow-changing tables. - - - This feature is transparent to the application, and is disabled by - default. - - - - - To enable table caching, add - 'table - cache = true' to the connection string. - - - - - Optionally, specify the - 'Default - Table Cache Age' connection string option, - which represents the number of seconds a table is cached - before the cached data is discarded. The default value is - 60. - - - - - You can turn caching on and off and set caching options at - runtime, on a per-command basis. - - - - -
-
- Using the Connector/Net with Prepared Statements - - - - Introduction - - - As of MySQL 4.1, it is possible to use prepared statements with - Connector/Net. Use of prepared statements can provide significant - performance improvements on queries that are executed more than - once. - - - Prepared execution is faster than direct execution for statements - executed more than once, primarily because the query is parsed - only once. In the case of direct execution, the query is parsed - every time it is executed. Prepared execution also can provide a - reduction of network traffic because for each execution of the - prepared statement, it is necessary only to send the data for the - parameters. - - - Another advantage of prepared statements is that it uses a binary - protocol that makes data transfer between client and server more - efficient. - - -
-
- Preparing Statements in Connector/Net - - - To prepare a statement, create a command object and set the - .CommandText property to your query. - - - After entering your statement, call the - .Prepare method of the - MySqlCommand object. After the statement is - prepared, add parameters for each of the dynamic elements in the - query. - - - After you enter your query and enter parameters, execute the - statement using the .ExecuteNonQuery(), - .ExecuteScalar(), or - .ExecuteReader methods. - - - For subsequent executions, you need only modify the values of - the parameters and call the execute method again, there is no - need to set the .CommandText property or - redefine the parameters. - - -Dim conn As New MySqlConnection -Dim cmd As New MySqlCommand - -conn.ConnectionString = strConnection - -Try - conn.Open() - cmd.Connection = conn - - cmd.CommandText = "INSERT INTO myTable VALUES(NULL, @number, @text)" - cmd.Prepare() - - cmd.Parameters.AddWithValue("@number", 1) - cmd.Parameters.AddWithValue("@text", "One") - - For i = 1 To 1000 - cmd.Parameters("@number").Value = i - cmd.Parameters("@text").Value = "A string value" - - cmd.ExecuteNonQuery() - Next -Catch ex As MySqlException - MessageBox.Show("Error " & ex.Number & " has occurred: " & ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) -End Try - - -MySql.Data.MySqlClient.MySqlConnection conn; -MySql.Data.MySqlClient.MySqlCommand cmd; - -conn = new MySql.Data.MySqlClient.MySqlConnection(); -cmd = new MySql.Data.MySqlClient.MySqlCommand(); - -conn.ConnectionString = strConnection; - -try -{ - conn.Open(); - cmd.Connection = conn; - - cmd.CommandText = "INSERT INTO myTable VALUES(NULL, @number, @text)"; - cmd.Prepare(); - - cmd.Parameters.AddWithValue("@number", 1); - cmd.Parameters.AddWithValue("@text", "One"); - - for (int i=1; i <= 1000; i++) - { - cmd.Parameters["@number"].Value = i; - cmd.Parameters["@text"].Value = "A string value"; - - cmd.ExecuteNonQuery(); - } -} -catch (MySql.Data.MySqlClient.MySqlException ex) -{ - MessageBox.Show("Error " + ex.Number + " has occurred: " + ex.Message, - "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); -} - - -
-
- Accessing Stored Procedures with Connector/Net - - - - Introduction - - - MySQL server version 5 and up supports stored procedures with the - SQL 2003 stored procedure syntax. - - - A stored procedure is a set of SQL statements that is stored in - the server. Clients make a single call to the stored procedure, - passing parameters that can influence the procedure logic and - query conditions, rather than issuing individual hardcoded SQL - statements. - - - Stored procedures can be particularly useful in situations such as - the following: - - - - - Stored procedures can act as an API or abstraction layer, - allowing multiple client applications to perform the same - database operations. The applications can be written in - different languages and run on different platforms. The - applications do not need to hardcode table and column names, - complicated queries, and so on. When you extend and optimize - the queries in a stored procedure, all the applications that - call the procedure automatically receive the benefits. - - - - - When security is paramount, stored procedures keep - applications from directly manipulating tables, or even - knowing details such as table and column names. Banks, for - example, use stored procedures for all common operations. This - provides a consistent and secure environment, and procedures - can ensure that each operation is properly logged. In such a - setup, applications and users would not get any access to the - database tables directly, but can only execute specific stored - procedures. - - - - - Connector/Net supports the calling of stored procedures through - the MySqlCommand object. Data can be passed in - and out of a MySQL stored procedure through use of the - MySqlCommand.Parameters collection. - - - - When you call a stored procedure, the command object makes an - additional SELECT call to - determine the parameters of the stored procedure. You must - ensure that the user calling the procedure has the - SELECT privilege on the - mysql.proc table to enable them to verify the - parameters. Failure to do this will result in an error when - calling the procedure. - - - - This section will not provide in-depth information on creating - Stored Procedures. For such information, please refer to - http://dev.mysql.com/doc/;mysql/en/stored-routines.htmlhttp://dev.mysql.com/doc/;mysql/en/stored-routines.html. - - - A sample application demonstrating how to use stored procedures - with Connector/Net can be found in the Samples - directory of your Connector/Net installation. - - -
-
- Using Stored Routines from Connector/Net - - - Stored procedures in MySQL can be created using a variety of - tools. First, stored procedures can be created using the - command-line client. Second, stored - procedures can be created using workbench. Finally, stored - procedures can be created using the - .ExecuteNonQuery method of the - MySqlCommand object. - - - Unlike the command-line and GUI clients, you are not required to - specify a special delimiter when creating stored procedures in - Connector/Net. - - - To call a stored procedure using Connector/Net, you create a - MySqlCommand object and pass the stored - procedure name as the .CommandText property. - You then set the .CommandType property to - CommandType.StoredProcedure. - - - After the stored procedure is named, you create one - MySqlCommand parameter for every parameter in - the stored procedure. IN parameters are - defined with the parameter name and the object containing the - value, OUT parameters are defined with the - parameter name and the data type that is expected to be - returned. All parameters need the parameter direction defined. - - - After defining the parameters, you call the stored procedure by - using the MySqlCommand.ExecuteNonQuery() - method. - - - Once the stored procedure is called, the values of the output - parameters can be retrieved by using the - .Value property of the - MySqlConnector.Parameters collection. - - - - When a stored procedure is called using - MySqlCommand.ExecuteReader, and the stored - procedure has output parameters, the output parameters are - only set after the MySqlDataReader returned - by ExecuteReader is closed. - - - - The following C# example code demonstrates the use of stored - procedures. It assumes the database 'employees' has already been - created: - - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -using System.Data; -using MySql.Data; -using MySql.Data.MySqlClient; - -namespace UsingStoredRoutines -{ - class Program - { - static void Main(string[] args) - { - MySqlConnection conn = new MySqlConnection(); - conn.ConnectionString = "server=localhost;user=root;database=employees;port=3306;password=******;"; - MySqlCommand cmd = new MySqlCommand(); - - try - { - Console.WriteLine("Connecting to MySQL..."); - conn.Open(); - cmd.Connection = conn; - cmd.CommandText = "DROP PROCEDURE IF EXISTS add_emp"; - cmd.ExecuteNonQuery(); - cmd.CommandText = "DROP TABLE IF EXISTS emp"; - cmd.ExecuteNonQuery(); - cmd.CommandText = "CREATE TABLE emp (empno INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, first_name VARCHAR(20), last_name VARCHAR(20), birthdate DATE)"; - cmd.ExecuteNonQuery(); - - cmd.CommandText = "CREATE PROCEDURE add_emp(" + - "IN fname VARCHAR(20), IN lname VARCHAR(20), IN bday DATETIME, OUT empno INT)" + - "BEGIN INSERT INTO emp(first_name, last_name, birthdate) " + - "VALUES(fname, lname, DATE(bday)); SET empno = LAST_INSERT_ID(); END"; - - cmd.ExecuteNonQuery(); - } - catch (MySqlException ex) - { - Console.WriteLine ("Error " + ex.Number + " has occurred: " + ex.Message); - } - conn.Close(); - Console.WriteLine("Connection closed."); - try - { - Console.WriteLine("Connecting to MySQL..."); - conn.Open(); - cmd.Connection = conn; - - cmd.CommandText = "add_emp"; - cmd.CommandType = CommandType.StoredProcedure; - - cmd.Parameters.AddWithValue("@lname", "Jones"); - cmd.Parameters["@lname"].Direction = ParameterDirection.Input; - - cmd.Parameters.AddWithValue("@fname", "Tom"); - cmd.Parameters["@fname"].Direction = ParameterDirection.Input; - - cmd.Parameters.AddWithValue("@bday", "1940-06-07"); - cmd.Parameters["@bday"].Direction = ParameterDirection.Input; - - cmd.Parameters.AddWithValue("@empno", MySqlDbType.Int32); - cmd.Parameters["@empno"].Direction = ParameterDirection.Output; - - cmd.ExecuteNonQuery(); - - Console.WriteLine("Employee number: "+cmd.Parameters["@empno"].Value); - Console.WriteLine("Birthday: " + cmd.Parameters["@bday"].Value); - } - catch (MySql.Data.MySqlClient.MySqlException ex) - { - Console.WriteLine("Error " + ex.Number + " has occurred: " + ex.Message); - } - conn.Close(); - Console.WriteLine("Done."); - } - } -} - - - The following code shows the same application in Visual Basic: - - - - -
-
- Handling BLOB Data With Connector/Net - - - - One common use for MySQL is the storage of binary data in - BLOB columns. MySQL supports four - different BLOB data types: TINYBLOB, - BLOB, MEDIUMBLOB, and - LONGBLOB, all described in - and . - - - Data stored in a BLOB column can be accessed - using Connector/Net and manipulated using client-side code. There - are no special requirements for using Connector/Net with - BLOB data. - - - Simple code examples will be presented within this section, and a - full sample application can be found in the - Samples directory of the Connector/Net - installation. - - -
-
- Preparing the MySQL Server - - - The first step is using MySQL with BLOB data - is to configure the server. Let's start by creating a table to - be accessed. In my file tables, I usually have four columns: an - AUTO_INCREMENT column of appropriate size - (UNSIGNED SMALLINT) to serve as a primary key - to identify the file, a VARCHAR column that - stores the file name, an UNSIGNED MEDIUMINT - column that stores the size of the file, and a - MEDIUMBLOB column that stores the file - itself. For this example, I will use the following table - definition: - - -CREATE TABLE file( -file_id SMALLINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, -file_name VARCHAR(64) NOT NULL, -file_size MEDIUMINT UNSIGNED NOT NULL, -file MEDIUMBLOB NOT NULL); - - - After creating a table, you might need to modify the - max_allowed_packet system variable. This - variable determines how large of a packet (that is, a single - row) can be sent to the MySQL server. By default, the server - only accepts a maximum size of 1MB from the client application. - If you intend to exceed 1MB in your file transfers, increase - this number. - - - The max_allowed_packet option can be modified - using MySQL Administrator's Startup Variables screen. Adjust the - Maximum permitted option in the Memory section of the Networking - tab to an appropriate setting. After adjusting the value, click - the Apply Changes button and restart the - server using the Service Control screen of - MySQL Administrator. You can also adjust this value directly in - the my.cnf file (add a line that reads - max_allowed_packet=xxM), - or use the SET - max_allowed_packet=xxM; - syntax from within MySQL. - - - Try to be conservative when setting - max_allowed_packet, as transfers of BLOB data - can take some time to complete. Try to set a value that will be - adequate for your intended use and increase the value if - necessary. - - -
-
- Writing a File to the Database - - - To write a file to a database, we need to convert the file to a - byte array, then use the byte array as a parameter to an - INSERT query. - - - The following code opens a file using a FileStream object, reads - it into a byte array, and inserts it into the - file table: - - -Dim conn As New MySqlConnection -Dim cmd As New MySqlCommand - -Dim SQL As String - -Dim FileSize As UInt32 -Dim rawData() As Byte -Dim fs As FileStream - -conn.ConnectionString = "server=127.0.0.1;" _ - & "uid=root;" _ - & "pwd=12345;" _ - & "database=test" - -Try - fs = New FileStream("c:\image.png", FileMode.Open, FileAccess.Read) - FileSize = fs.Length - - rawData = New Byte(FileSize) {} - fs.Read(rawData, 0, FileSize) - fs.Close() - - conn.Open() - - SQL = "INSERT INTO file VALUES(NULL, @FileName, @FileSize, @File)" - - cmd.Connection = conn - cmd.CommandText = SQL - cmd.Parameters.AddWithValue("@FileName", strFileName) - cmd.Parameters.AddWithValue("@FileSize", FileSize) - cmd.Parameters.AddWithValue("@File", rawData) - - cmd.ExecuteNonQuery() - - MessageBox.Show("File Inserted into database successfully!", _ - "Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk) - - conn.Close() -Catch ex As Exception - MessageBox.Show("There was an error: " & ex.Message, "Error", _ - MessageBoxButtons.OK, MessageBoxIcon.Error) -End Try - - -MySql.Data.MySqlClient.MySqlConnection conn; -MySql.Data.MySqlClient.MySqlCommand cmd; - -conn = new MySql.Data.MySqlClient.MySqlConnection(); -cmd = new MySql.Data.MySqlClient.MySqlCommand(); - -string SQL; -UInt32 FileSize; -byte[] rawData; -FileStream fs; - -conn.ConnectionString = "server=127.0.0.1;uid=root;" + - "pwd=12345;database=test;"; - -try -{ - fs = new FileStream(@"c:\image.png", FileMode.Open, FileAccess.Read); - FileSize = fs.Length; - - rawData = new byte[FileSize]; - fs.Read(rawData, 0, FileSize); - fs.Close(); - - conn.Open(); - - SQL = "INSERT INTO file VALUES(NULL, @FileName, @FileSize, @File)"; - - cmd.Connection = conn; - cmd.CommandText = SQL; - cmd.Parameters.AddWithValue("@FileName", strFileName); - cmd.Parameters.AddWithValue("@FileSize", FileSize); - cmd.Parameters.AddWithValue("@File", rawData); - - cmd.ExecuteNonQuery(); - - MessageBox.Show("File Inserted into database successfully!", - "Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); - - conn.Close(); -} -catch (MySql.Data.MySqlClient.MySqlException ex) -{ - MessageBox.Show("Error " + ex.Number + " has occurred: " + ex.Message, - "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); -} - - - The Read method of the - FileStream object is used to load the file - into a byte array which is sized according to the - Length property of the - FileStream object. - - - After assigning the byte array as a parameter of the - MySqlCommand object, the - ExecuteNonQuery method is called and the - BLOB is inserted into the - file table. - - -
-
- Reading a BLOB from the Database to a File on Disk - - - Once a file is loaded into the file table, we - can use the MySqlDataReader class to retrieve - it. - - - The following code retrieves a row from the - file table, then loads the data into a - FileStream object to be written to disk: - - -Dim conn As New MySqlConnection -Dim cmd As New MySqlCommand -Dim myData As MySqlDataReader -Dim SQL As String -Dim rawData() As Byte -Dim FileSize As UInt32 -Dim fs As FileStream - -conn.ConnectionString = "server=127.0.0.1;" _ - & "uid=root;" _ - & "pwd=12345;" _ - & "database=test" - -SQL = "SELECT file_name, file_size, file FROM file" - -Try - conn.Open() - - cmd.Connection = conn - cmd.CommandText = SQL - - myData = cmd.ExecuteReader - - If Not myData.HasRows Then Throw New Exception("There are no BLOBs to save") - - myData.Read() - - FileSize = myData.GetUInt32(myData.GetOrdinal("file_size")) - rawData = New Byte(FileSize) {} - - myData.GetBytes(myData.GetOrdinal("file"), 0, rawData, 0, FileSize) - - fs = New FileStream("C:\newfile.png", FileMode.OpenOrCreate, FileAccess.Write) - fs.Write(rawData, 0, FileSize) - fs.Close() - - MessageBox.Show("File successfully written to disk!", "Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk) - - myData.Close() - conn.Close() -Catch ex As Exception - MessageBox.Show("There was an error: " & ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) -End Try - - -MySql.Data.MySqlClient.MySqlConnection conn; -MySql.Data.MySqlClient.MySqlCommand cmd; -MySql.Data.MySqlClient.MySqlDataReader myData; - -conn = new MySql.Data.MySqlClient.MySqlConnection(); -cmd = new MySql.Data.MySqlClient.MySqlCommand(); - -string SQL; -UInt32 FileSize; -byte[] rawData; -FileStream fs; - -conn.ConnectionString = "server=127.0.0.1;uid=root;" + - "pwd=12345;database=test;"; - -SQL = "SELECT file_name, file_size, file FROM file"; - -try -{ - conn.Open(); - - cmd.Connection = conn; - cmd.CommandText = SQL; - - myData = cmd.ExecuteReader(); - - if (! myData.HasRows) - throw new Exception("There are no BLOBs to save"); - - myData.Read(); - - FileSize = myData.GetUInt32(myData.GetOrdinal("file_size")); - rawData = new byte[FileSize]; - - myData.GetBytes(myData.GetOrdinal("file"), 0, rawData, 0, (int)FileSize); - - fs = new FileStream(@"C:\newfile.png", FileMode.OpenOrCreate, FileAccess.Write); - fs.Write(rawData, 0, (int)FileSize); - fs.Close(); - - MessageBox.Show("File successfully written to disk!", - "Success!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); - - myData.Close(); - conn.Close(); -} -catch (MySql.Data.MySqlClient.MySqlException ex) -{ - MessageBox.Show("Error " + ex.Number + " has occurred: " + ex.Message, - "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); -} - - - After connecting, the contents of the file - table are loaded into a MySqlDataReader - object. The GetBytes method of the - MySqlDataReader is used to load the - BLOB into a byte array, which is then written - to disk using a FileStream object. - - - The GetOrdinal method of the MySqlDataReader - can be used to determine the integer index of a named column. - Use of the GetOrdinal method prevents errors if the column order - of the SELECT query is changed. - - -
-
- Using the Connector/Net Interceptor Classes - - - An interceptor is a software design pattern that provides a - transparent way to extend or modify some aspect of a program, - similar to a user exit. No recompiling is required. With - Connector/Net, the interceptors are enabled and disabled by - updating the connection string to refer to different sets of - interceptor classes that you instantiate. - - - Connector/Net includes the following interceptor classes: - - - - - The - - lets you perform additional operations when a program issues a - SQL command. For example, you can examine the SQL statement - for logging or debugging purposes, substitute your own result - set to implement a caching mechanism, and so on. Depending on - the use case, your code can supplement the SQL command or - replace it entirely. - - - The BaseCommandInterceptor class has these - methods that you can override: - - -public virtual bool ExecuteScalar(string sql, ref object returnValue); -public virtual bool ExecuteNonQuery(string sql, ref int returnValue); -public virtual bool ExecuteReader(string sql, CommandBehavior behavior, ref MySqlDataReader returnValue); -public virtual void Init(MySqlConnection connection); - - - If your interceptor overrides one of the - Execute... methods, set the - returnValue output parameter and return - true if you handled the event, or - false if you did not handle the event. The - SQL command is processed normally only when all command - interceptors return false. - - - The connection passed to the Init method is - the connection that is attached to this interceptor. - - - - - The - - lets you perform additional operations when a program - encounters a SQL exception. The exception interception - mechanism is modeled after the Connector/J model. You can code - an interceptor class and connect it to an existing program - without recompiling, and intercept exceptions when they are - created. You can then change the exception type and optionally - attach information to it. This capability lets you turn on and - off logging and debugging code without hardcoding anything in - the application. This technique applies to exceptions raised - at the SQL level, not to lower-level system or I/O errors. - - - You develop an exception interceptor first by creating a - subclass of the BaseExceptionInterceptor - class. You must override the - InterceptException() method. You can also - override the Init() method to do some - one-time initialization. - - - Each exception interceptor has 2 methods: - - -public abstract Exception InterceptException(Exception exception, - MySqlConnection connection); -public virtual void Init(MySqlConnection connection); - - - The connection passed to Init() is the - connection that is attached to this interceptor. - - - Each interceptor is required to override - InterceptException and return an exception. - It can return the exception it is given, or it can wrap it in - a new exception. We currently do not offer the ability to - suppress the exception. - - - - - Here are examples of using the FQN (fully qualified name) on the - connection string: - - -MySqlConnection c1 = new MySqlConnection(@"server=localhost;pooling=false; -commandinterceptors=CommandApp.MyCommandInterceptor,CommandApp"); - -MySqlConnection c2 = new MySqlConnection(@"server=localhost;pooling=false; -exceptioninterceptors=ExceptionStackTraceTest.MyExceptionInterceptor,ExceptionStackTraceTest"); - - - In this example, the command interceptor is called - CommandApp.MyCommandInterceptor and exists in - the CommandApp assembly. The exception - interceptor is called - ExceptionStackTraceTest.MyExceptionInterceptor - and exists in the ExceptionStackTraceTest - assembly. - - - To shorten the connection string, you can register your exception - interceptors in your app.config or - web.config file like this: - - - - - Once you have done that, your connection strings can look like - these: - - -MySqlConnection c1 = new MySqlConnection(@"server=localhost;pooling=false; -commandinterceptors=myC"); - -MySqlConnection c2 = new MySqlConnection(@"server=localhost;pooling=false; -exceptioninterceptors=myE"); - - -
-
- Handling Date and Time Information in Connector/Net - - - - Introduction - - - MySQL and the .NET languages handle date and time information - differently, with MySQL allowing dates that cannot be represented - by a .NET data type, such as '0000-00-00 - 00:00:00'. These differences can cause problems if not - properly handled. - - - The following sections demonstrate how to properly handle date and - time information when using Connector/Net. - - -
-
- Fractional Seconds - - - Connector/Net 6.5 and higher support the fractional seconds - feature introduced in MySQL 5.6.4. Fractional seconds could - always be specified in a date literal or passed back and forth - as parameters and return values, but the fractional part was - always stripped off when stored in a table column. In MySQL - 5.6.4 and higher, the fractional part is now preserved in data - stored and retrieved through SQL. For fractional second handling - in MySQL 5.6.4 and higher, see - . For the - behavior of fractional seconds prior to MySQL 5.6.4, see - . - - - To use the more precise date and time types, specify a value - from 1 to 6 when creating the table column, for example - TIME(3) or DATETIME(6), - representing the number of digits of precision after the decimal - point. Specifying a precision of 0 leaves the fractional part - out entirely. In your C# or Visual Basic code, refer to the - Millisecond member to retrieve the fractional - second value from the MySqlDateTime object - returned by the GetMySqlDateTime function. - The DateTime object returned by the - GetDateTime function also contains the - fractional value, but only the first 3 digits. - - - For related code examples, see the following blog post: - https://blogs.oracle.com/MySqlOnWindows/entry/milliseconds_value_support_on_datetimehttps://blogs.oracle.com/MySqlOnWindows/entry/milliseconds_value_support_on_datetime - -
-
- Problems when Using Invalid Dates - - - The differences in date handling can cause problems for - developers who use invalid dates. Invalid MySQL dates cannot be - loaded into native .NET DateTime objects, - including NULL dates. - - - Because of this issue, .NET DataSet objects - cannot be populated by the Fill method of the - MySqlDataAdapter class as invalid dates will - cause a System.ArgumentOutOfRangeException - exception to occur. - - -
-
- Restricting Invalid Dates - - - The best solution to the date problem is to restrict users from - entering invalid dates. This can be done on either the client or - the server side. - - - Restricting invalid dates on the client side is as simple as - always using the .NET DateTime class to - handle dates. The DateTime class will only - allow valid dates, ensuring that the values in your database are - also valid. The disadvantage of this is that it is not useful in - a mixed environment where .NET and non .NET code are used to - manipulate the database, as each application must perform its - own date validation. - - - Users of MySQL 5.0.2 and higher can use the new - traditional SQL mode to restrict invalid date - values. For information on using the - traditional SQL mode, see - . - - -
-
- Handling Invalid Dates - - - Although it is strongly recommended that you avoid the use of - invalid dates within your .NET application, it is possible to - use invalid dates by means of the - MySqlDateTime data type. - - - The MySqlDateTime data type supports the same - date values that are supported by the MySQL server. The default - behavior of Connector/Net is to return a .NET DateTime object - for valid date values, and return an error for invalid dates. - This default can be modified to cause Connector/Net to return - MySqlDateTime objects for invalid dates. - - - To instruct Connector/Net to return a - MySqlDateTime object for invalid dates, add - the following line to your connection string: - - Allow Zero Datetime=True - - Please note that the use of the MySqlDateTime - class can still be problematic. The following are some known - issues: - - - - - Data binding for invalid dates can still cause errors (zero - dates like 0000-00-00 do not seem to have this problem). - - - - - The ToString method return a date - formatted in the standard MySQL format (for example, - 2005-02-23 08:50:25). This differs from - the ToString behavior of the .NET - DateTime class. - - - - - The MySqlDateTime class supports NULL - dates, while the .NET DateTime class does not. This can - cause errors when trying to convert a MySQLDateTime to a - DateTime if you do not check for NULL first. - - - - - Because of the known issues, the best recommendation is still to - use only valid dates in your application. - - -
-
- Handling NULL Dates - - - The .NET DateTime data type cannot handle - NULL values. As such, when assigning values - from a query to a DateTime variable, you must - first check whether the value is in fact - NULL. - - - When using a MySqlDataReader, use the - .IsDBNull method to check whether a value is - NULL before making the assignment: - - -If Not myReader.IsDBNull(myReader.GetOrdinal("mytime")) Then - myTime = myReader.GetDateTime(myReader.GetOrdinal("mytime")) -Else - myTime = DateTime.MinValue -End If - - -if (! myReader.IsDBNull(myReader.GetOrdinal("mytime"))) - myTime = myReader.GetDateTime(myReader.GetOrdinal("mytime")); -else - myTime = DateTime.MinValue; - - - NULL values will work in a data set and can - be bound to form controls without special handling. - - -
-
- Using the MySqlBulkLoader Class - - - features a bulk loader class that wraps the MySQL statement - LOAD DATA - INFILE. This gives the ability to load a data - file from a local or remote host to the server. The class - concerned is MySqlBulkLoader. This class has - various methods, the main one being load to - cause the specified file to be loaded to the server. Various - parameters can be set to control how the data file is processed. - This is achieved through setting various properties of the class. - For example, the field separator used, such as comma or tab, can - be specified, along with the record terminator, such as newline. - - - The following code shows a simple example of using the - MySqlBulkLoader class. First an empty table - needs to be created, in this case in the test - database: - - -CREATE TABLE Career ( - Name VARCHAR(100) NOT NULL, - Age INTEGER, - Profession VARCHAR(200) -); - - A simple tab-delimited data file is also created (it could use any - other field delimiter such as comma): - - -Table Career in Test Database -Name Age Profession - -Tony 47 Technical Writer -Ana 43 Nurse -Fred 21 IT Specialist -Simon 45 Hairy Biker - - - Note that with this test file the first three lines will need to - be ignored, as they do not contain table data. This can be - achieved using the NumberOfLinesToSkip - property. This file can then be loaded and used to populate the - Career table in the test - database: - - -using System; -using System.Text; -using MySql.Data; -using MySql.Data.MySqlClient; - -namespace ConsoleApplication1 -{ - class Program - { - static void Main(string[] args) - { - - string connStr = "server=localhost;user=root;database=test;port=3306;password=******;"; - MySqlConnection conn = new MySqlConnection(connStr); - - MySqlBulkLoader bl = new MySqlBulkLoader(conn); - bl.TableName = "Career"; - bl.FieldTerminator = "\t"; - bl.LineTerminator = "\n"; - bl.FileName = "c:/career_data.txt"; - bl.NumberOfLinesToSkip = 3; - - try - { - Console.WriteLine("Connecting to MySQL..."); - conn.Open(); - - // Upload data from file - int count = bl.Load(); - Console.WriteLine(count + " lines uploaded."); - - string sql = "SELECT Name, Age, Profession FROM Career"; - MySqlCommand cmd = new MySqlCommand(sql, conn); - MySqlDataReader rdr = cmd.ExecuteReader(); - - while (rdr.Read()) - { - Console.WriteLine(rdr[0] + " -- " + rdr[1] + " -- " + rdr[2]); - } - - rdr.Close(); - - conn.Close(); - } - catch (Exception ex) - { - Console.WriteLine(ex.ToString()); - } - Console.WriteLine("Done."); - } - } -} - - Further information on LOAD DATA INFILE can be - found in . Further information on - MySqlBulkLoader can be found in the reference - documentation that was included with your connector. - - -
-
- Using the Trace Source Object - - - - 6.2 introduced support for .NET 2.0 compatible tracing, - using TraceSource objects. - - - The .NET 2.0 tracing architecture consists of four main parts: - - - - - Source - This is the originator of the - trace information. The source is used to send trace messages. - The name of the source provided by is - mysql. - - - - - Switch - This defines the level of trace - information to emit. Typically, this is specified in the - app.config file, so that it is not - necessary to recompile an application to change the trace - level. - - - - - Listener - Trace listeners define where - the trace information will be written to. Supported listeners - include, for example, the Visual Studio Output window, the - Windows Event Log, and the console. - - - - - Filter - Filters can be attached to - listeners. Filters determine the level of trace information - that will be written. While a switch defines the level of - information that will be written to all listeners, a filter - can be applied on a per-listener basis, giving finer grained - control of trace information. - - - - - To use tracing a TraceSource object first needs - to be created. To create a TraceSource object - in you would use code similar to the following: - - TraceSource ts = new TraceSource("mysql"); - - To enable trace messages, configure a trace switch. There are - three main switch classes, BooleanSwitch, - SourceSwitch, and - TraceSwitch. Trace switches also have - associated with them a trace level enumeration, these are - Off, Error, - Warning, Info, and - Verbose. The following code snippet illustrates - creating a switch: - - -ts.Switch = new SourceSwitch("MySwitch", "Verbose"); - - - This creates a SourceSwitch, called - MySwitch, and sets the trace level to - Verbose, meaning that all trace messages will - be written. - - - It is convenient to be able to change the trace level without - having to recompile the code. This is achieved by specifying the - trace level in application configuration file, - app.config. You then simply need to specify - the desired trace level in the configuration file and restart the - application. The trace source is configured within the - system.diagnostics section of the file. The - following XML snippet illustrates this: - - - - - By default, trace information is written to the Output window of - Microsoft Visual Studio. There are a wide range of listeners that - can be attached to the trace source, so that trace messages can be - written out to various destinations. You can also create custom - listeners to allow trace messages to be written to other - destinations as mobile devices and web services. A commonly used - example of a listener is ConsoleTraceListener, - which writes trace messages to the console. - - - To add a listener at run time, use code such as the following: - - ts.Listeners.Add(new ConsoleTraceListener()); - - Then, call methods on the trace source object to generate trace - information. For example, the - TraceInformation(), - TraceEvent(), or TraceData() - methods can be used. - - - The TraceInformation() method simply prints a - string passed as a parameter. The TraceEvent() - method, as well as the optional informational string, requires a - TraceEventType value to be passed to indicate - the trace message type, and also an application specific ID. The - TraceEventType can have a value of - Verbose, Information, - Warning, Error, and - Critical. Using the - TraceData() method you can pass any object, for - example an exception object, instead of a message. - - - To ensure than these generated trace messages gets flushed from - the trace source buffers to listeners, invoke the - Flush() method. When you are finished using a - trace source, call the Close() method. The - Close() method first calls - Flush(), to ensure any remaining data is - written out. It then frees up resources, and closes the listeners - associated with the trace source. - - ts.TraceInformation("Informational message"); -ts.TraceEvent(TraceEventType.Error, 3, "Optional error message"); -ts.TraceData(TraceEventType.Error, 3, ex); // pass exception object -ts.Flush(); -... -ts.Close(); - -
-
- Viewing MySQL Trace Information - - - This section describes how to set up your application to view - MySQL trace information. - - - The first thing you need to do is create a suitable - app.config file for your application. An - example is shown in the following code: - - - - - This ensures a suitable trace source is created, along with a - switch. The switch level in this case is set to - Verbose to display the maximum amount of - information. - - - In the application the only other step required is to add - logging=true to the connection string. An - example application could be: - - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Diagnostics; -using MySql.Data; -using MySql.Data.MySqlClient; -using MySql.Web; - - -namespace ConsoleApplication1 -{ - class Program - { - static void Main(string[] args) - { - - string connStr = "server=localhost;user=root;database=world;port=3306;password=******;logging=true;"; - MySqlConnection conn = new MySqlConnection(connStr); - try - { - Console.WriteLine("Connecting to MySQL..."); - conn.Open(); - - string sql = "SELECT Name, HeadOfState FROM Country WHERE Continent='Oceania'"; - MySqlCommand cmd = new MySqlCommand(sql, conn); - MySqlDataReader rdr = cmd.ExecuteReader(); - - while (rdr.Read()) - { - Console.WriteLine(rdr[0] + " -- " + rdr[1]); - } - - rdr.Close(); - - conn.Close(); - } - catch (Exception ex) - { - Console.WriteLine(ex.ToString()); - } - Console.WriteLine("Done."); - } - } -} - - - This simple application will then generate the following output: - - -Connecting to MySQL... -mysql Information: 1 : 1: Connection Opened: connection string = 'server=localhost;User Id=root;database=world;port=3306 -;password=******;logging=True' -mysql Information: 3 : 1: Query Opened: SHOW VARIABLES -mysql Information: 4 : 1: Resultset Opened: field(s) = 2, affected rows = -1, inserted id = -1 -mysql Information: 5 : 1: Resultset Closed. Total rows=272, skipped rows=0, size (bytes)=7058 -mysql Information: 6 : 1: Query Closed -mysql Information: 3 : 1: Query Opened: SHOW COLLATION -mysql Information: 4 : 1: Resultset Opened: field(s) = 6, affected rows = -1, inserted id = -1 -mysql Information: 5 : 1: Resultset Closed. Total rows=127, skipped rows=0, size (bytes)=4102 -mysql Information: 6 : 1: Query Closed -mysql Information: 3 : 1: Query Opened: SET character_set_results=NULL -mysql Information: 4 : 1: Resultset Opened: field(s) = 0, affected rows = 0, inserted id = 0 -mysql Information: 5 : 1: Resultset Closed. Total rows=0, skipped rows=0, size (bytes)=0 -mysql Information: 6 : 1: Query Closed -mysql Information: 10 : 1: Set Database: world -mysql Information: 3 : 1: Query Opened: SELECT Name, HeadOfState FROM Country WHERE Continent='Oceania' -mysql Information: 4 : 1: Resultset Opened: field(s) = 2, affected rows = -1, inserted id = -1 -American Samoa -- George W. Bush -Australia -- Elisabeth II -... -Wallis and Futuna -- Jacques Chirac -Vanuatu -- John Bani -United States Minor Outlying Islands -- George W. Bush -mysql Information: 5 : 1: Resultset Closed. Total rows=28, skipped rows=0, size (bytes)=788 -mysql Information: 6 : 1: Query Closed -Done. -mysql Information: 2 : 1: Connection Closed - - - The first number displayed in the trace message corresponds to - the MySQL event type: - - - - - 1 - - - ConnectionOpened: connection string - - - - - 2 - - - ConnectionClosed: - - - - - 3 - - - QueryOpened: mysql server thread id, query text - - - - - 4 - - - ResultOpened: field count, affected rows (-1 if select), inserted id (-1 - if select) - - - - - 5 - - - ResultClosed: total rows read, rows skipped, size of resultset in bytes - - - - - 6 - - - QueryClosed: - - - - - 7 - - - StatementPrepared: prepared sql, statement id - - - - - 8 - - - StatementExecuted: statement id, mysql server thread id - - - - - 9 - - - StatementClosed: statement id - - - - - 10 - - - NonQuery: [varies] - - - - - 11 - - - UsageAdvisorWarning: usage advisor flag. NoIndex = 1, BadIndex = 2, - SkippedRows = 3, SkippedColumns = 4, FieldConversion = - 5. - - - - - 12 - - - Warning: level, code, message - - - - - 13 - - - Error: error number, error message - - -
- - The second number displayed in the trace message is the - connection count. - - - Although this example uses the - ConsoleTraceListener, any of the other - standard listeners could have been used. Another possibility is - to create a custom listener that uses the information passed - using the TraceEvent method. For example, a - custom trace listener could be created to perform active - monitoring of the MySQL event messages, rather than simply - writing these to an output device. - - - It is also possible to add listeners to the MySQL Trace Source - at run time. This can be done with the following code: - - MySqlTrace.Listeners.Add(new ConsoleTraceListener()); - - 6.3.2 introduced the ability to switch tracing on and off - at run time. This can be achieved using the calls - MySqlTrace.EnableQueryAnalyzer(string host, int - postInterval) and - MySqlTrace.DisableQueryAnalyzer(). The - parameter host is the URL of the MySQL - Enterprise Monitor server to monitor. The parameter - postInterval is how often to post the data to - MySQL Enterprise Monitor, in seconds. - -
-
-
- Building Custom Listeners - - - To build custom listeners that work with the Trace - Source, it is necessary to understand the key methods used, and - the event data formats used. - - - The main method involved in passing trace messages is the - TraceSource.TraceEvent method. This has the - prototype: - - -public void TraceEvent( - TraceEventType eventType, - int id, - string format, - params Object[] args -) - - - This trace source method will process the list of attached - listeners and call the listener's TraceListener.TraceEvent - method. The prototype for the - TraceListener.TraceEvent method is as - follows: - - -public virtual void TraceEvent( - TraceEventCache eventCache, - string source, - TraceEventType eventType, - int id, - string format, - params Object[] args -) - - - The first three parameters are used in the standard as - defined - by Microsofthttp://msdn.microsoft.com/en-us/library/d193webf.aspx. The last three parameters contain - MySQL-specific trace information. Each of these parameters is - now discussed in more detail. - - - int id - - - This is a MySQL-specific identifier. It identifies the MySQL - event type that has occurred, resulting in a trace message being - generated. This value is defined by the - MySqlTraceEventType public enum contained in - the code: - - -public enum MySqlTraceEventType : int -{ - ConnectionOpened = 1, - ConnectionClosed, - QueryOpened, - ResultOpened, - ResultClosed, - QueryClosed, - StatementPrepared, - StatementExecuted, - StatementClosed, - NonQuery, - UsageAdvisorWarning, - Warning, - Error -} - - - The MySQL event type also determines the contents passed using - the parameter params Object[] args. The - nature of the args parameters are described - in further detail in the following material. - - - string - format - - - This is the format string that contains zero or more format - items, which correspond to objects in the args array. This would - be used by a listener such as - ConsoleTraceListener to write a message to - the output device. - - - params Object[] - args - - - This is a list of objects that depends on the MySQL event type, - id. However, the first parameter passed using - this list is always the driver id. The driver id is a unique - number that is incremented each time the connector is opened. - This enables groups of queries on the same connection to be - identified. The parameters that follow driver id depend of the - MySQL event id, and are as follows: - - - - - ConnectionOpened - - - Connection string - - - - - ConnectionClosed - - - No additional parameters - - - - - QueryOpened - - - mysql server thread id, query text - - - - - ResultOpened - - - field count, affected rows (-1 if select), inserted id (-1 if select) - - - - - ResultClosed - - - total rows read, rows skipped, size of resultset in bytes - - - - - QueryClosed - - - No additional parameters - - - - - StatementPrepared - - - prepared sql, statement id - - - - - StatementExecuted - - - statement id, mysql server thread id - - - - - StatementClosed - - - statement id - - - - - NonQuery - - - Varies - - - - - UsageAdvisorWarning - - - usage advisor flag. NoIndex = 1, BadIndex = 2, SkippedRows = 3, - SkippedColumns = 4, FieldConversion = 5. - - - - - Warning - - - level, code, message - - - - - Error - - - error number, error message - - -
- - This information will allow you to create custom trace listeners - that can actively monitor the MySQL-specific events. - -
-
-
- Binary/Nonbinary Issues - - - There are certain situations where MySQL will return incorrect - metadata about one or more columns. More specifically, the server - will sometimes report that a column is binary when it is not and - vice versa. In these situations, it becomes practically impossible - for the connector to be able to correctly identify the correct - metadata. - - - Some examples of situations that may return incorrect metadata - are: - - - - - Execution of SHOW PROCESSLIST. - Some of the columns will be returned as binary even though - they only hold string data. - - - - - When a temporary table is used to process a resultset, some - columns may be returned with incorrect binary flags. - - - - - Some server functions such DATE_FORMAT will - incorrectly return the column as binary. - - - - - With the availability of BINARY and - VARBINARY data types, it is important that we - respect the metadata returned by the server. However, we are aware - that some existing applications may break with this change, so we - are creating a connection string option to enable or disable it. - By default, Connector/Net 5.1 respects the binary flags returned - by the server. You might need to make small changes to your - application to accommodate this change. - - - In the event that the changes required to your application would - be too large, adding 'respect binary - flags=false' to your connection string causes the - connector to use the prior behavior: any column that is marked as - string, regardless of binary flags, will be returned as string. - Only columns that are specifically marked as a - BLOB will be returned as - BLOB. - - -
-
- Character Set Considerations for Connector/Net - - - Treating Binary Blobs As UTF8 - - - - MySQL doesn't currently support 4-byte UTF8 sequences. This makes - it difficult to represent some multi-byte languages such as - Japanese. To try and alleviate this, Connector/Net now supports a - mode where binary blobs can be treated as strings. - - - To do this, you set the 'Treat Blobs As UTF8' - connection string keyword to yes. This is all - that needs to be done to enable conversion of all binary blobs to - UTF8 strings. To convert only some of your BLOB columns, you can - make use of the 'BlobAsUTF8IncludePattern' - and'BlobAsUTF8ExcludePattern' keywords. Set - these to a regular expression pattern that matches the column - names to include or exclude respectively. - - - When the regular expression patterns both match a single column, - the include pattern is applied before the exclude pattern. The - result, in this case, would be that the column would be excluded. - Also, be aware that this mode does not apply to columns of type - BINARY or VARBINARY and also - do not apply to nonbinary BLOB columns. - - - Currently, this mode only applies to reading strings out of MySQL. - To insert 4-byte UTF8 strings into blob columns, use the .NET - Encoding.GetBytes function to convert your - string to a series of bytes. You can then set this byte array as a - parameter for a BLOB column. - - -
-
- Using Connector/Net with Crystal Reports - - - - Introduction - - - Crystal Reports is a common tool used by Windows application - developers to perform reporting and document generation. In this - section we will show how to use Crystal Reports XI with MySQL and - Connector/Net. - - -
-
- Creating a Data Source - - - When creating a report in Crystal Reports there are two options - for accessing the MySQL data while designing your report. - - - The first option is to use Connector/ODBC as an ADO data source - when designing your report. You will be able to browse your - database and choose tables and fields using drag and drop to - build your report. The disadvantage of this approach is that - additional work must be performed within your application to - produce a data set that matches the one expected by your report. - - - The second option is to create a data set in VB.NET and save it - as XML. This XML file can then be used to design a report. This - works quite well when displaying the report in your application, - but is less versatile at design time because you must choose all - relevant columns when creating the data set. If you forget a - column you must re-create the data set before the column can be - added to the report. - - - The following code can be used to create a data set from a query - and write it to disk: - - -Dim myData As New DataSet -Dim conn As New MySqlConnection -Dim cmd As New MySqlCommand -Dim myAdapter As New MySqlDataAdapter - -conn.ConnectionString = "server=127.0.0.1;" _ - & "uid=root;" _ - & "pwd=12345;" _ - & "database=world" - -Try - conn.Open() - cmd.CommandText = "SELECT city.name AS cityName, city.population AS CityPopulation, " _ - & "country.name, country.population, country.continent " _ - & "FROM country, city ORDER BY country.continent, country.name" - cmd.Connection = conn - - myAdapter.SelectCommand = cmd - myAdapter.Fill(myData) - - myData.WriteXml("C:\dataset.xml", XmlWriteMode.WriteSchema) -Catch ex As Exception - MessageBox.Show(ex.Message, "Report could not be created", MessageBoxButtons.OK, MessageBoxIcon.Error) -End Try - - -DataSet myData = new DataSet(); -MySql.Data.MySqlClient.MySqlConnection conn; -MySql.Data.MySqlClient.MySqlCommand cmd; -MySql.Data.MySqlClient.MySqlDataAdapter myAdapter; - -conn = new MySql.Data.MySqlClient.MySqlConnection(); -cmd = new MySql.Data.MySqlClient.MySqlCommand(); -myAdapter = new MySql.Data.MySqlClient.MySqlDataAdapter(); - -conn.ConnectionString = "server=127.0.0.1;uid=root;" + - "pwd=12345;database=test;"; - -try -{ - cmd.CommandText = "SELECT city.name AS cityName, city.population AS CityPopulation, " + - "country.name, country.population, country.continent " + - "FROM country, city ORDER BY country.continent, country.name"; - cmd.Connection = conn; - - myAdapter.SelectCommand = cmd; - myAdapter.Fill(myData); - - myData.WriteXml(@"C:\dataset.xml", XmlWriteMode.WriteSchema); -} -catch (MySql.Data.MySqlClient.MySqlException ex) -{ - MessageBox.Show(ex.Message, "Report could not be created", - MessageBoxButtons.OK, MessageBoxIcon.Error); -} - - - The resulting XML file can be used as an ADO.NET XML datasource - when designing your report. - - - If you choose to design your reports using Connector/ODBC, it - can be downloaded from - dev.mysql.comhttp://dev.mysql.com/downloads/connector/odbc/3.51.html. - - -
-
- Creating the Report - - - For most purposes, the Standard Report wizard helps with the - initial creation of a report. To start the wizard, open Crystal - Reports and choose the option from the File menu. - - - The wizard first prompts you for a data source. If you use - Connector/ODBC as your data source, use the OLEDB provider for - ODBC option from the OLE DB (ADO) tree instead of the ODBC (RDO) - tree when choosing a data source. If using a saved data set, - choose the ADO.NET (XML) option and browse to your saved data - set. - - - The remainder of the report creation process is done - automatically by the wizard. - - - After the report is created, choose the Report Options... entry - of the File menu. Un-check the Save Data With Report option. - This prevents saved data from interfering with the loading of - data within our application. - - -
-
- Displaying the Report - - - To display a report we first populate a data set with the data - needed for the report, then load the report and bind it to the - data set. Finally we pass the report to the crViewer control for - display to the user. - - - The following references are needed in a project that displays a - report: - - - - - CrystalDecisions.CrystalReports.Engine - - - - - CrystalDecisions.ReportSource - - - - - CrystalDecisions.Shared - - - - - CrystalDecisions.Windows.Forms - - - - - The following code assumes that you created your report using a - data set saved using the code shown in - Creating a Data Source, - and have a crViewer control on your form named - myViewer. - - -Imports CrystalDecisions.CrystalReports.Engine -Imports System.Data -Imports MySql.Data.MySqlClient - -Dim myReport As New ReportDocument -Dim myData As New DataSet -Dim conn As New MySqlConnection -Dim cmd As New MySqlCommand -Dim myAdapter As New MySqlDataAdapter - -conn.ConnectionString = _ - "server=127.0.0.1;" _ - & "uid=root;" _ - & "pwd=12345;" _ - & "database=test" - -Try - conn.Open() - - cmd.CommandText = "SELECT city.name AS cityName, city.population AS CityPopulation, " _ - & "country.name, country.population, country.continent " _ - & "FROM country, city ORDER BY country.continent, country.name" - cmd.Connection = conn - - myAdapter.SelectCommand = cmd - myAdapter.Fill(myData) - - myReport.Load(".\world_report.rpt") - myReport.SetDataSource(myData) - myViewer.ReportSource = myReport -Catch ex As Exception - MessageBox.Show(ex.Message, "Report could not be created", MessageBoxButtons.OK, MessageBoxIcon.Error) -End Try - - -using CrystalDecisions.CrystalReports.Engine; -using System.Data; -using MySql.Data.MySqlClient; - -ReportDocument myReport = new ReportDocument(); -DataSet myData = new DataSet(); -MySql.Data.MySqlClient.MySqlConnection conn; -MySql.Data.MySqlClient.MySqlCommand cmd; -MySql.Data.MySqlClient.MySqlDataAdapter myAdapter; - -conn = new MySql.Data.MySqlClient.MySqlConnection(); -cmd = new MySql.Data.MySqlClient.MySqlCommand(); -myAdapter = new MySql.Data.MySqlClient.MySqlDataAdapter(); - -conn.ConnectionString = "server=127.0.0.1;uid=root;" + - "pwd=12345;database=test;"; - -try -{ - cmd.CommandText = "SELECT city.name AS cityName, city.population AS CityPopulation, " + - "country.name, country.population, country.continent " + - "FROM country, city ORDER BY country.continent, country.name"; - cmd.Connection = conn; - - myAdapter.SelectCommand = cmd; - myAdapter.Fill(myData); - - myReport.Load(@".\world_report.rpt"); - myReport.SetDataSource(myData); - myViewer.ReportSource = myReport; -} -catch (MySql.Data.MySqlClient.MySqlException ex) -{ - MessageBox.Show(ex.Message, "Report could not be created", - MessageBoxButtons.OK, MessageBoxIcon.Error); -} - - - A new data set it generated using the same query used to - generate the previously saved data set. Once the data set is - filled, a ReportDocument is used to load the report file and - bind it to the data set. The ReportDocument is the passed as the - ReportSource of the crViewer. - - - This same approach is taken when a report is created from a - single table using Connector/ODBC. The data set replaces the - table used in the report and the report is displayed properly. - - - When a report is created from multiple tables using - Connector/ODBC, a data set with multiple tables must be created - in our application. This enables each table in the report data - source to be replaced with a report in the data set. - - - We populate a data set with multiple tables by providing - multiple SELECT statements in our - MySqlCommand object. These SELECT - statements are based on the SQL query shown in Crystal Reports - in the Database menu's Show SQL Query option. Assume the - following query: - - -SELECT `country`.`Name`, `country`.`Continent`, `country`.`Population`, `city`.`Name`, `city`.`Population` -FROM `world`.`country` `country` LEFT OUTER JOIN `world`.`city` `city` ON `country`.`Code`=`city`.`CountryCode` -ORDER BY `country`.`Continent`, `country`.`Name`, `city`.`Name` - - - This query is converted to two - SELECT queries and displayed with - the following code: - - -Imports CrystalDecisions.CrystalReports.Engine -Imports System.Data -Imports MySql.Data.MySqlClient - -Dim myReport As New ReportDocument -Dim myData As New DataSet -Dim conn As New MySqlConnection -Dim cmd As New MySqlCommand -Dim myAdapter As New MySqlDataAdapter - -conn.ConnectionString = "server=127.0.0.1;" _ - & "uid=root;" _ - & "pwd=12345;" _ - & "database=world" - -Try - conn.Open() - cmd.CommandText = "SELECT name, population, countrycode FROM city ORDER BY countrycode, name; " _ - & "SELECT name, population, code, continent FROM country ORDER BY continent, name" - cmd.Connection = conn - - myAdapter.SelectCommand = cmd - myAdapter.Fill(myData) - - myReport.Load(".\world_report.rpt") - myReport.Database.Tables(0).SetDataSource(myData.Tables(0)) - myReport.Database.Tables(1).SetDataSource(myData.Tables(1)) - myViewer.ReportSource = myReport -Catch ex As Exception - MessageBox.Show(ex.Message, "Report could not be created", MessageBoxButtons.OK, MessageBoxIcon.Error) -End Try - - -using CrystalDecisions.CrystalReports.Engine; -using System.Data; -using MySql.Data.MySqlClient; - -ReportDocument myReport = new ReportDocument(); -DataSet myData = new DataSet(); -MySql.Data.MySqlClient.MySqlConnection conn; -MySql.Data.MySqlClient.MySqlCommand cmd; -MySql.Data.MySqlClient.MySqlDataAdapter myAdapter; - -conn = new MySql.Data.MySqlClient.MySqlConnection(); -cmd = new MySql.Data.MySqlClient.MySqlCommand(); -myAdapter = new MySql.Data.MySqlClient.MySqlDataAdapter(); - -conn.ConnectionString = "server=127.0.0.1;uid=root;" + - "pwd=12345;database=test;"; - -try -{ - cmd.CommandText = "SELECT name, population, countrycode FROM city ORDER " + - "BY countrycode, name; SELECT name, population, code, continent FROM " + - "country ORDER BY continent, name"; - cmd.Connection = conn; - - myAdapter.SelectCommand = cmd; - myAdapter.Fill(myData); - - myReport.Load(@".\world_report.rpt"); - myReport.Database.Tables(0).SetDataSource(myData.Tables(0)); - myReport.Database.Tables(1).SetDataSource(myData.Tables(1)); - myViewer.ReportSource = myReport; -} -catch (MySql.Data.MySqlClient.MySqlException ex) -{ - MessageBox.Show(ex.Message, "Report could not be created", - MessageBoxButtons.OK, MessageBoxIcon.Error); -} - - - It is important to order the - SELECT queries in alphabetic - order, as this is the order the report will expect its source - tables to be in. One SetDataSource statement is needed for each - table in the report. - - - This approach can cause performance problems because Crystal - Reports must bind the tables together on the client-side, which - will be slower than using a pre-saved data set. - - -
-
- ASP.NET Provider Model - - - provides support for the ASP.NET 2.0 provider model. This - model enables application developers to focus on the business - logic of their application instead of having to recreate such - boilerplate items as membership and roles support. - - - supplies the following providers: - - - - - Membership Provider - - - - - Role Provider - - - - - Profile Provider - - - - - Session State Provider ( 6.1 and later) - - - - - The following tables show the supported providers, their default - provider and the corresponding MySQL provider. - - - Membership Provider - - - - - System.Web.Security.SqlMembershipProvider - - - MySql.Web.Security.MySQLMembershipProvider - - -
- - Role Provider - - - - - System.Web.Security.SqlRoleProvider - - - MySql.Web.Security.MySQLRoleProvider - - -
- - Profile Provider - - - - - System.Web.Profile.SqlProfileProvider - - - MySql.Web.Profile.MySQLProfileProvider - - -
- - SessionState Provider - - - - - System.Web.SessionState.InProcSessionStateStore - - - MySql.Web.SessionState.MySqlSessionStateStore - - -
- - - The MySQL Session State provider uses slightly different - capitalization on the class name compared to the other MySQL - providers. - - - - Installing The Providers - - - The installation of Connector/Net 5.1 or later will install the - providers and register them in your machine's .NET configuration - file, machine.config. The additional entries - created will result in the system.web section - appearing similar to the following code: - - -<system.web> - <processModel autoConfig="true" /> - <httpHandlers /> - <membership> - <providers> - <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="LocalSqlServer" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" applicationName="/" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1" passwordAttemptWindow="10" passwordStrengthRegularExpression="" /> - <add name="MySQLMembershipProvider" type="MySql.Web.Security.MySQLMembershipProvider, MySql.Web, Version=6.1.1.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" connectionStringName="LocalMySqlServer" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" applicationName="/" requiresUniqueEmail="false" passwordFormat="Clear" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1" passwordAttemptWindow="10" passwordStrengthRegularExpression="" /> - </providers> - </membership> - <profile> - <providers> - <add name="AspNetSqlProfileProvider" connectionStringName="LocalSqlServer" applicationName="/" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> - <add name="MySQLProfileProvider" type="MySql.Web.Profile.MySQLProfileProvider, MySql.Web, Version=6.1.1.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" connectionStringName="LocalMySqlServer" applicationName="/" /> - </providers> - </profile> - <roleManager> - <providers> - <add name="AspNetSqlRoleProvider" connectionStringName="LocalSqlServer" applicationName="/" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> - <add name="AspNetWindowsTokenRoleProvider" applicationName="/" type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> - <add name="MySQLRoleProvider" type="MySql.Web.Security.MySQLRoleProvider, MySql.Web, Version=6.1.1.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" connectionStringName="LocalMySqlServer" applicationName="/" /> - </providers> - </roleManager> -</system.web> - - - Each provider type can have multiple provider implementations. The - default provider can also be set here using the - defaultProvider attribute, but usually this is - set in the web.config file either manually or - by using the ASP.NET configuration tool. - - - At time of writing, the MySqlSessionStateStore - is not added to machine.config at install - time, and so add the following: - - -<sessionState> - <providers> - <add name="MySqlSessionStateStore" type="MySql.Web.SessionState.MySqlSessionStateStore, MySql.Web, Version=6.1.1.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" connectionStringName="LocalMySqlServer" applicationName="/" /> - </providers> -</sessionState> - - - The SessionState Provider uses the - customProvider attribute, rather than - defaultProvider, to set the provider as the - default. A typical web.config file might - contain: - - - <system.web> - <membership defaultProvider="MySQLMembershipProvider" /> - <roleManager defaultProvider="MySQLRoleProvider" /> - <profile defaultProvider="MySQLProfileProvider" /> - <sessionState customProvider="MySqlSessionStateStore" /> - <compilation debug="false"> - ... - - - This sets the MySQL Providers as the defaults to be used in this - web application. - - - The providers are implemented in the file - mysql.web.dll and this file can be found in - your installation folder. There is no need to run any type - of SQL script to set up the database schema, as the providers - create and maintain the proper schema automatically. - - - Using The Providers - - - The easiest way to start using the providers is to use the ASP.NET - configuration tool that is available on the Solution Explorer - toolbar when you have a website project loaded. - - - In the web pages that open, you can select the MySQL membership - and roles providers by picking a custom provider for each area. - - - When the provider is installed, it creates a dummy connection - string named LocalMySqlServer. Although this - has to be done so that the provider will work in the ASP.NET - configuration tool, you override this connection string in your - web.config file. You do this by first - removing the dummy connection string and then adding in the proper - one, as shown in the following example: - - -<connectionStrings> - <remove name="LocalMySqlServer"/> - <add name="LocalMySqlServer" connectionString="server=xxx;uid=xxx;pwd=xxx;database=xxx;"/> -</connectionStrings> - - Note the database to connect to must be specified. - - - Rather than manually editing configuration files, consider using - the MySQL Website Configuration tool to configure your desired - provider setup. From 6.1.1 onwards, all providers can be - selected and configured from this wizard. The tool modifies your - website.config file to the desired - configuration. A tutorial on doing this is available in the - following section MySQL Website Configuration Tool. - - - A tutorial demonstrating how to use the Membership and Role - Providers can be found in the following section - Tutorial: ASP.NET Membership and Role Provider. - - - Deployment - - - To use the providers on a production server, distribute the - MySql.Data and the MySql.Web - assemblies, and either register them in the remote systems Global - Assembly Cache or keep them in your application's - bin/ directory. - -
-
-
- Working with Partial Trust - - - .NET applications operate under a given trust level. Normal - desktop applications operate under full trust, while web - applications that are hosted in shared environments are normally - run under the partial trust level (also known as ). Some hosting providers host shared applications in - their own app pools and allow the application to run under full - trust, but this configuration is relatively rare. The - Connector/Net support for partial trust has improved over time to - simplify the configuration and deployment process for hosting - providers. - - - Connector/Net 6.5 fully enables our provider to run in a partial - trust environment when the library is installed in the Global - Assembly Cache (GAC). The new - MySqlClientPermission class, derived from the - .NET DBDataPermission class, helps to simplify - the permission setup. - - - Starting from 6.5 you can use the Connector/Net library inside any - medium-trust level environment without any issue. - - - The following list shows steps and code fragments needed to run a - Connector/Net application in a partial trust environment. For - illustration purposes, we use the Pipe Connections protocol in - this example. - - - - - Configure the MySQL server to accept pipe connections, by - adding the --enable-named-pipe option on - the command line. If you need more information about this, see - . - - - - - Confirm that the hosting provider has installed the - Connector/Net library (MySql.Data.dll) in - the GAC. - - - - - Optionally, the hosting provider can avoid granting - permissions globally by using the new - MySqlClientPermission class in the trust - policies. (The alternative is to globally enable the - permissions System.Net.SocketPermission, - System.Security.Permissions.ReflectionPermission, - System.Net.DnsPermission, and - System.Security.Permissions.SecurityPermission.) - - - - - Create a simple web application using Visual Studio 2010. - - - - - Add the reference in your application for the - MySql.Data.MySqlClient library. - - - - - Edit your web.config file so that your - application runs using a Medium trust level: - - - - - - - Add the MySql.Data.MySqlClient namespace to - your server-code page. - - - - - Define the connection string: - - -MySqlConnectionStringBuilder myconnString = new MySqlConnectionStringBuilder("server=localhost;User Id=root;database=test;" ); - myconnString.PipeName = "MySQL55"; - myconnString.ConnectionProtocol = MySqlConnectionProtocol.Pipe; - - - - - Define the MySqlConnection to use: - - -MySqlConnection myconn = new MySqlConnection(myconnString.ConnectionString); -myconn.Open(); - - - - - Retrieve some data from your tables: - - -MySqlCommand cmd = new MySqlCommand("Select * from products", myconn); -MySqlDataAdapter da = new MySqlDataAdapter(cmd); -DataSet1 tds = new DataSet1(); -da.Fill(tds, tds.Tables[0].TableName); -GridView1.DataSource = tds; -GridView1.DataBind(); -myconn.Close() - - - - - Run the program. It should execute successfully, without - requiring any special code or encountering any security - problems. - - - - - Starting with these versions, Connector/Net can be used under - partial trust hosting that has been modified to allow the use of - sockets for communication. By default, partial trust does not - include SocketPermission. Connector/Net uses - sockets to talk with the MySQL server so the hosting provider must - create a new trust level that is an exact clone of partial trust - but that has the following permissions added: - - - - - System.Net.SocketPermission - - - - - System.Security.Permissions.ReflectionPermission - - - - - System.Net.DnsPermission - - - - - System.Security.Permissions.SecurityPermission - - - - - Connector/Net versions prior to 5.0.8 and 5.1.3 were not - compatible with partial trust hosting. - - -
-
-
\ No newline at end of file diff --git a/Documentation/Users Guide/connector-net-support.aml b/Documentation/Users Guide/connector-net-support.aml deleted file mode 100644 index 2ad1b2737..000000000 --- a/Documentation/Users Guide/connector-net-support.aml +++ /dev/null @@ -1,107 +0,0 @@ - - -
- Connector/Net Support - - - - The developers of Connector/Net greatly value the input of our users - in the software development process. If you find Connector/Net - lacking some feature important to you, or if you discover a bug and - need to file a bug report, please use the instructions in - . - - -
-
- Connector/Net Community Support - - - - - Community support for Connector/Net can be found through the - forums at http://forums.mysql.comhttp://forums.mysql.com. - - - - - Community support for Connector/Net can also be found through - the mailing lists at http://lists.mysql.comhttp://lists.mysql.com. - - - - - Paid support is available from Oracle. Additional information - is available at http://dev.mysql.com/support/http://dev.mysql.com/support/. - - - - -
-
- How to Report Connector/Net Problems or Bugs - - - If you encounter difficulties or problems with Connector/Net, - contact the Connector/Net community, as explained in - Connector/Net Community Support. - - - First try to execute the same SQL statements and commands from the - client program or from - admndemo. This helps you determine whether the - error is in Connector/Net or MySQL. - - - If reporting a problem, ideally include the following information - with the email: - - - - - Operating system and version. - - - - - Connector/Net version. - - - - - MySQL server version. - - - - - Copies of error messages or other unexpected output. - - - - - Simple reproducible sample. - - - - - Remember that the more information you can supply to us, the more - likely it is that we can fix the problem. - - - If you believe the problem to be a bug, then you must report the - bug through http://bugs.mysql.com/http://bugs.mysql.com/. - - -
-
- Connector/Net Change History - - - The Connector/Net Change History (Changelog) is located with the - main Changelog for MySQL. See - . - - -
-
-
\ No newline at end of file diff --git a/Documentation/Users Guide/connector-net-tutorials.aml b/Documentation/Users Guide/connector-net-tutorials.aml deleted file mode 100644 index 2af58cc37..000000000 --- a/Documentation/Users Guide/connector-net-tutorials.aml +++ /dev/null @@ -1,2831 +0,0 @@ - - -
- Connector/Net Tutorials - - - -
-
- Tutorial: An Introduction to Connector/Net Programming - - - - This section provides a gentle introduction to programming with - Connector/Net. The example code is written in C#, and is designed to - work on both Microsoft .NET Framework and Mono. - - - This tutorial is designed to get you up and running with - Connector/Net as quickly as possible, it does not go into detail on - any particular topic. However, the following sections of this manual - describe each of the topics introduced in this tutorial in more - detail. In this tutorial you are encouraged to type in and run the - code, modifying it as required for your setup. - - - This tutorial assumes you have MySQL and Connector/Net already - installed. It also assumes that you have installed the World example - database, which can be downloaded from the - MySQL Documentation - pagehttp://dev.mysql.com/doc/;index-other.html. You can also find details on how to install the - database on the same page. - - - - Before compiling the example code, make sure that you have added - References to your project as required. The References required - are System, System.Data and - MySql.Data. - - - -
-
- The MySqlConnection Object - - - For your Connector/Net application to connect to a MySQL database, - it must establish a connection by using a - MySqlConnection object. - - - The MySqlConnection constructor takes a - connection string as one of its parameters. The connection string - provides necessary information to make the connection to the MySQL - database. The connection string is discussed more fully in - Connecting to MySQL Using Connector/Net. For a list - of supported connection string options, see - . - - - The following code shows how to create a connection object: - - -using System; -using System.Data; - -using MySql.Data; -using MySql.Data.MySqlClient; - -public class Tutorial1 -{ - public static void Main() - { - string connStr = "server=localhost;user=root;database=world;port=3306;password=******;"; - MySqlConnection conn = new MySqlConnection(connStr); - try - { - Console.WriteLine("Connecting to MySQL..."); - conn.Open(); - // Perform database operations - } - catch (Exception ex) - { - Console.WriteLine(ex.ToString()); - } - conn.Close(); - Console.WriteLine("Done."); - } -} - - - When the MySqlConnection constructor is - invoked, it returns a connection object, which is used for - subsequent database operations. Open the connection before any - other operations take place. Before the application exits, close - the connection to the database by calling Close - on the connection object. - - - Sometimes an attempt to perform an Open on a - connection object can fail, generating an exception that can be - handled using standard exception handling code. - - - In this section you have learned how to create a connection to a - MySQL database, and open and close the corresponding connection - object. - - -
-
- The MySqlCommand Object - - - Once a connection has been established with the MySQL database, - the next step is do carry out the desired database operations. - This can be achieved through the use of the - MySqlCommand object. - - - You will see how to create a MySqlCommand - object. Once it has been created, there are three main methods of - interest that you can call: - - - - - ExecuteReader - used to query - the database. Results are usually returned in a - MySqlDataReader object, created by - ExecuteReader. - - - - - ExecuteNonQuery - used to - insert and delete data. - - - - - ExecuteScalar - used to - return a single value. - - - - - Once a MySqlCommand object has been created, - you will call one of the above methods on it to carry out a - database operation, such as perform a query. The results are - usually returned into a MySqlDataReader object, - and then processed, for example the results might be displayed. - The following code demonstrates how this could be done. - - -using System; -using System.Data; - -using MySql.Data; -using MySql.Data.MySqlClient; - -public class Tutorial2 -{ - public static void Main() - { - string connStr = "server=localhost;user=root;database=world;port=3306;password=******;"; - MySqlConnection conn = new MySqlConnection(connStr); - try - { - Console.WriteLine("Connecting to MySQL..."); - conn.Open(); - - string sql = "SELECT Name, HeadOfState FROM Country WHERE Continent='Oceania'"; - MySqlCommand cmd = new MySqlCommand(sql, conn); - MySqlDataReader rdr = cmd.ExecuteReader(); - - while (rdr.Read()) - { - Console.WriteLine(rdr[0]+" -- "+rdr[1]); - } - rdr.Close(); - } - catch (Exception ex) - { - Console.WriteLine(ex.ToString()); - } - - conn.Close(); - Console.WriteLine("Done."); - } -} - - - When a connection has been created and opened, the code then - creates a MySqlCommand object. Note that the - SQL query to be executed is passed to the - MySqlCommand constructor. The - ExecuteReader method is then used to generate a - MySqlReader object. The - MySqlReader object contains the results - generated by the SQL executed on the command object. Once the - results have been obtained in a MySqlReader - object, the results can be processed. In this case, the - information is printed out by a while loop. - Finally, the MySqlReader object is disposed of - by running its Close method on it. - - - In the next example, you will see how to use the - ExecuteNonQuery method. - - - The procedure for performing an ExecuteNonQuery - method call is simpler, as there is no need to create an object to - store results. This is because ExecuteNonQuery - is only used for inserting, updating and deleting data. The - following example illustrates a simple update to the - Country table: - - -using System; -using System.Data; - -using MySql.Data; -using MySql.Data.MySqlClient; - -public class Tutorial3 -{ - public static void Main() - { - string connStr = "server=localhost;user=root;database=world;port=3306;password=******;"; - MySqlConnection conn = new MySqlConnection(connStr); - try - { - Console.WriteLine("Connecting to MySQL..."); - conn.Open(); - - string sql = "INSERT INTO Country (Name, HeadOfState, Continent) VALUES ('Disneyland','Mickey Mouse', 'North America')"; - MySqlCommand cmd = new MySqlCommand(sql, conn); - cmd.ExecuteNonQuery(); - } - catch (Exception ex) - { - Console.WriteLine(ex.ToString()); - } - - conn.Close(); - Console.WriteLine("Done."); - } -} - - - The query is constructed, the command object created and the - ExecuteNonQuery method called on the command - object. You can access your MySQL database with the - command interpreter and verify that the - update was carried out correctly. - - - Finally, you will see how the ExecuteScalar - method can be used to return a single value. Again, this is - straightforward, as a MySqlDataReader object is - not required to store results, a simple variable will do. The - following code illustrates how to use - ExecuteScalar: - - -using System; -using System.Data; - -using MySql.Data; -using MySql.Data.MySqlClient; - -public class Tutorial4 -{ - public static void Main() - { - string connStr = "server=localhost;user=root;database=world;port=3306;password=******;"; - MySqlConnection conn = new MySqlConnection(connStr); - try - { - Console.WriteLine("Connecting to MySQL..."); - conn.Open(); - - string sql = "SELECT COUNT(*) FROM Country"; - MySqlCommand cmd = new MySqlCommand(sql, conn); - object result = cmd.ExecuteScalar(); - if (result != null) - { - int r = Convert.ToInt32(result); - Console.WriteLine("Number of countries in the World database is: " + r); - } - - } - catch (Exception ex) - { - Console.WriteLine(ex.ToString()); - } - - conn.Close(); - Console.WriteLine("Done."); - } -} - - - This example uses a simple query to count the rows in the - Country table. The result is obtained by - calling ExecuteScalar on the command object. - - -
-
- Working with Decoupled Data - - - Previously, when using MySqlDataReader, the - connection to the database was continually maintained, unless - explicitly closed. It is also possible to work in a manner where a - connection is only established when needed. For example, in this - mode, a connection could be established to read a chunk of data, - the data could then be modified by the application as required. A - connection could then be reestablished only if and when the - application writes data back to the database. This decouples the - working data set from the database. - - - This decoupled mode of working with data is supported by - Connector/Net. There are several parts involved in allowing this - method to work: - - - - - Data Set - The Data Set is - the area in which data is loaded to read or modify it. A - DataSet object is instantiated, which can - store multiple tables of data. - - - - - Data Adapter - The Data - Adapter is the interface between the Data Set and the database - itself. The Data Adapter is responsible for efficiently - managing connections to the database, opening and closing them - as required. The Data Adapter is created by instantiating an - object of the MySqlDataAdapter class. The - MySqlDataAdapter object has two main - methods: Fill which reads data into the - Data Set, and Update, which writes data - from the Data Set to the database. - - - - - Command Builder - The Command - Builder is a support object. The Command Builder works in - conjunction with the Data Adapter. When a - MySqlDataAdapter object is created, it is - typically given an initial SELECT statement. From this - SELECT statement the Command - Builder can work out the corresponding - INSERT, - UPDATE and - DELETE statements that would be - required to update the database. To create the Command - Builder, an object of the class - MySqlCommandBuilder is created. - - - - - Each of these classes will now be discussed in more detail. - - - Instantiating a DataSet object - - - A DataSet object can be created simply, as - shown in the following example code snippet: - - -DataSet dsCountry; -... -dsCountry = new DataSet(); - - - Although this creates the DataSet object, it - has not yet filled it with data. For that, a Data Adapter is - required. - - - Instantiating a MySqlDataAdapter - object - - - The MySqlDataAdapter can be created as - illustrated by the following example: - - -MySqlDataAdapter daCountry; -... -string sql = "SELECT Code, Name, HeadOfState FROM Country WHERE Continent='North America'"; -daCountry = new MySqlDataAdapter (sql, conn); - - - Note, the MySqlDataAdapter is given the SQL - specifying the data to work with. - - - Instantiating a MySqlCommandBuilder - object - - - Once the MySqlDataAdapter has been created, it - is necessary to generate the additional statements required for - inserting, updating and deleting data. There are several ways to - do this, but in this tutorial you will see how this can most - easily be done with MySqlCommandBuilder. The - following code snippet illustrates how this is done: - - -MySqlCommandBuilder cb = new MySqlCommandBuilder(daCountry); - - - Note that the MySqlDataAdapter object is passed - as a parameter to the command builder. - - - Filling the Data Set - - - To do anything useful with the data from your database, you need - to load it into a Data Set. This is one of the jobs of the - MySqlDataAdapter object, and is carried out - with its Fill method. The following example - code illustrates this: - - -DataSet dsCountry; -... -dsCountry = new DataSet(); -... -daCountry.Fill(dsCountry, "Country"); - - - Note the Fill method is a - MySqlDataAdapter method, the Data Adapter knows - how to establish a connec tion with the database and retrieve the - required data, and then populates the Data Set when the - Fill method is called. The second parameter - is the table in the Data Set to update. - - - Updating the Data Set - - - The data in the Data Set can now be manipulated by the application - as required. At some point, changes to data will need to be - written back to the database. This is achieved through a - MySqlDataAdapter method, the - Update method. - - -daCountry.Update(dsCountry, "Country"); - - - Again, the Data Set and the table within the Data Set to update - are specified. - - - Working Example - - - The interactions between the DataSet, - MySqlDataAdapter and - MySqlCommandBuilder classes can be a little - confusing, so their operation can perhaps be best illustrated by - working code. - - - In this example, data from the World database is read into a Data - Grid View control. Here, the data can be viewed and changed before - clicking an update button. The update button then activates code - to write changes back to the database. The code uses the - principles explained above. The application was built using the - Microsoft Visual Studio to place and create the user interface - controls, but the main code that uses the key classes described - above is shown below, and is portable. - - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -using MySql.Data; -using MySql.Data.MySqlClient; - -namespace WindowsFormsApplication5 -{ - public partial class Form1 : Form - { - MySqlDataAdapter daCountry; - DataSet dsCountry; - - public Form1() - { - InitializeComponent(); - } - - private void Form1_Load(object sender, EventArgs e) - { - - string connStr = "server=localhost;user=root;database=world;port=3306;password=******;"; - MySqlConnection conn = new MySqlConnection(connStr); - try - { - label2.Text = "Connecting to MySQL..."; - - string sql = "SELECT Code, Name, HeadOfState FROM Country WHERE Continent='North America'"; - daCountry = new MySqlDataAdapter (sql, conn); - MySqlCommandBuilder cb = new MySqlCommandBuilder(daCountry); - - dsCountry = new DataSet(); - daCountry.Fill(dsCountry, "Country"); - dataGridView1.DataSource = dsCountry; - dataGridView1.DataMember = "Country"; - } - catch (Exception ex) - { - label2.Text = ex.ToString(); - } - } - - private void button1_Click(object sender, EventArgs e) - { - daCountry.Update(dsCountry, "Country"); - label2.Text = "MySQL Database Updated!"; - } - - } -} - - - The application running is shown below: - - - - World Database Application - - - - -
-
- Working with Parameters - - - This part of the tutorial shows you how to use parameters in your - Connector/Net application. - - - Although it is possible to build SQL query strings directly from - user input, this is not advisable as it does not prevent erroneous - or malicious information being entered. It is safer to use - parameters as they will be processed as field data only. For - example, imagine the following query was constructed from user - input: - - -string sql = "SELECT Name, HeadOfState FROM Country WHERE Continent = "+user_continent; - - - If the string user_continent came from a Text - Box control, there would potentially be no control over the string - entered by the user. The user could enter a string that generates - a run time error, or in the worst case actually harms the system. - When using parameters it is not possible to do this because a - parameter is only ever treated as a field parameter, rather than - an arbitrary piece of SQL code. - - - The same query written user a parameter for user input would be: - - -string sql = "SELECT Name, HeadOfState FROM Country WHERE Continent = @Continent"; - - - Note that the parameter is preceded by an '@' symbol to indicate - it is to be treated as a parameter. - - - As well as marking the position of the parameter in the query - string, it is necessary to add a parameter to the Command object. - This is illustrated by the following code snippet: - - -cmd.Parameters.AddWithValue("@Continent", "North America"); - - - In this example the string "North America" is supplied as the - parameter value statically, but in a more practical example it - would come from a user input control. - - - A further example illustrates the complete process: - - -using System; -using System.Data; - -using MySql.Data; -using MySql.Data.MySqlClient; - -public class Tutorial5 -{ - public static void Main() - { - string connStr = "server=localhost;user=root;database=world;port=3306;password=******;"; - MySqlConnection conn = new MySqlConnection(connStr); - try - { - Console.WriteLine("Connecting to MySQL..."); - conn.Open(); - - string sql = "SELECT Name, HeadOfState FROM Country WHERE Continent=@Continent"; - MySqlCommand cmd = new MySqlCommand(sql, conn); - - Console.WriteLine("Enter a continent e.g. 'North America', 'Europe': "); - string user_input = Console.ReadLine(); - - cmd.Parameters.AddWithValue("@Continent", user_input); - - MySqlDataReader rdr = cmd.ExecuteReader(); - - while (rdr.Read()) - { - Console.WriteLine(rdr["Name"]+" --- "+rdr["HeadOfState"]); - } - rdr.Close(); - } - catch (Exception ex) - { - Console.WriteLine(ex.ToString()); - } - - conn.Close(); - Console.WriteLine("Done."); - } -} - - - In this part of the tutorial you have see how to use parameters to - make your code more secure. - - -
-
- Working with Stored Procedures - - - In this section, you will see how to work with stored procedures. - This section assumes you have a basic understanding of what a - stored procedure is, and how to create one. - - - For the purposes of this tutorial, you will create a simple Stored - Procedure to see how it can be called from Connector/Net. In the - MySQL Client program, connect to the World database and enter the - following stored procedure: - - -DELIMITER // -CREATE PROCEDURE country_hos -(IN con CHAR(20)) -BEGIN - SELECT Name, HeadOfState FROM Country - WHERE Continent = con; -END // -DELIMITER ; - - - Test that the stored procedure works as expected by typing the - following into the command interpreter: - - -CALL country_hos('Europe'); - - - Note that The stored routine takes a single parameter, which is - the continent to restrict your search to. - - - Having confirmed that the stored procedure is present and correct, - you can see how to access it from Connector/Net. - - - Calling a stored procedure from your Connector/Net application is - similar to techniques you have seen earlier in this tutorial. A - MySqlCommand object is created, but rather than - taking an SQL query as a parameter, it takes the name of the - stored procedure to call. Set the MySqlCommand - object to the type of stored procedure, as shown by the following - code snippet: - - -string rtn = "country_hos"; -MySqlCommand cmd = new MySqlCommand(rtn, conn); -cmd.CommandType = CommandType.StoredProcedure; - - - In this case, the stored procedure requires you to pass a - parameter. This can be achieved using the techniques seen in the - previous section on parameters, - Working with Parameters, as shown in - the following code snippet: - - -cmd.Parameters.AddWithValue("@con", "Europe"); - - - The value of the parameter @con could more - realistically have come from a user input control, but for - simplicity it is set as a static string in this example. - - - At this point, everything is set up and you can call the routine - using techniques also learned in earlier sections. In this case, - the ExecuteReader method of the - MySqlCommand object is used. - - - Complete working code for the stored procedure example is shown - below: - - -using System; -using System.Data; - -using MySql.Data; -using MySql.Data.MySqlClient; - -public class Tutorial6 -{ - public static void Main() - { - string connStr = "server=localhost;user=root;database=world;port=3306;password=******;"; - MySqlConnection conn = new MySqlConnection(connStr); - try - { - Console.WriteLine("Connecting to MySQL..."); - conn.Open(); - - string rtn = "country_hos"; - MySqlCommand cmd = new MySqlCommand(rtn, conn); - cmd.CommandType = CommandType.StoredProcedure; - - cmd.Parameters.AddWithValue("@con", "Europe"); - - MySqlDataReader rdr = cmd.ExecuteReader(); - while (rdr.Read()) - { - Console.WriteLine(rdr[0] + " --- " + rdr[1]); - } - rdr.Close(); - } - catch (Exception ex) - { - Console.WriteLine(ex.ToString()); - } - - conn.Close(); - Console.WriteLine("Done."); - } -} - - - In this section, you have seen how to call a stored procedure from - Connector/Net. For the moment, this concludes our introductory - tutorial on programming with Connector/Net. - - -
-
- Tutorial: ASP.NET Membership and Role Provider - - - Many web sites feature the facility for the user to create a user - account. They can then log into the web site and enjoy a - personalized experience. This requires that the developer creates - database tables to store user information, along with code to - gather and process this data. This represents a burden on the - developer, and there is the possibility for security issues to - creep into the developed code. However, ASP.NET 2.0 introduced the - Membership system. This system is designed around the concept of - Membership, Profile and Role Providers, which together provide all - of the functionality to implement a user system, that previously - would have to have been created by the developer from scratch. - - - Currently, provides Membership, Role, Profile and Session - State Providers. - - - This tutorial shows you how to set up your ASP.NET web application - to use the Membership and Role Providers. It assumes that - you have MySQL Server installed, along with and Microsoft - Visual Studio. This tutorial was tested with 6.0.4 and - Microsoft Visual Studio 2008 Professional Edition. It is - recommended you use 6.0.4 or above for this tutorial. - - - - - Create a new database in the MySQL Server using the MySQL - Command Line Client program (mysql), or - other suitable tool. It does not matter what name is used for - the database, but record it. You specify it in the connection - string constructed later in this tutorial. This database - contains the tables, automatically created for you later, used - to store data about users and roles. - - - - - Create a new ASP.NET Web Site in Visual Studio. If you are not - sure how to do this, refer to - Tutorial: Databinding in ASP.NET using LINQ on Entities, - which demonstrates how to create a simple ASP.NET web site. - - - - - Add References to MySql.Data and - MySql.Web to the web site project. - - - - - Locate the machine.config file on your - system, which is the configuration file for the .NET - Framework. - - - - - Search the machine.config file to find - the membership provider - MySQLMembershipProvider. - - - - - Add the attribute - autogenerateschema="true". The appropriate - section should now resemble the following (note: for the sake - of brevity some information has been excluded): - - -<membership> - <providers> - <add name="AspNetSqlMembershipProvider" - type="System.Web.Security.SqlMembershipProvider" - ... - connectionStringName="LocalSqlServer" - ... /> - <add name="MySQLMembershipProvider" - autogenerateschema="true" - type="MySql.Web.Security.MySQLMembershipProvider, MySql.Web, Version=6.0.4.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" - connectionStringName="LocalMySqlServer" - ... /> - </providers> -</membership> - - - Note that the name for the connection string to be used to - connect to the server that contains the membership database is - LocalMySqlServer. - - - The autogenerateschema="true" attribute - will cause to silently create, or upgrade, the schema - on the database server, to contain the required tables for - storing membership information. - - - - - It is now necessary to create the connection string referenced - in the previous step. Load the web site's - web.config file into Visual Studio. - - - - - Locate the section marked - <connectionStrings>. Add the - following connection string information: - - -<connectionStrings> - <remove name="LocalMySqlServer"/> - <add name="LocalMySqlServer" - connectionString="Datasource=localhost;Database=users;uid=root;pwd=password;" - providerName="MySql.Data.MySqlClient"/> -</connectionStrings> - - - The database specified is the one created in the first step. - You could alternatively have used an existing database. - - - - - At this point build the solution to ensure no errors are - present. This can be done by selecting - Build, Build Solution - from the main menu, or pressing . - - - - - ASP.NET supports the concept of locally and remotely - authenticated users. With local authentication the user is - validated using their Windows credentials when they attempt to - access the web site. This can be useful in an Intranet - environment. With remote authentication, a user is prompted - for their login details when accessing the web site, and these - credentials are checked against the membership information - stored in a database server such as MySQL Server. You will now - see how to choose this form of authentication. - - - Start the ASP.NET Web Site Administration Tool. This can be - done quickly by clicking the small hammer/Earth icon in the - Solution Explorer. You can also launch this tool by selecting - Website, ASP.NET - Configuration from the main menu. - - - - - In the ASP.NET Web Site Administration Tool click the - tab. - - - - - Now click the - link. - - - - - Select the radio - button. The web site will now need to provide a form to allow - the user to enter their login details. These will be checked - against membership information stored in the MySQL database. - - - - Authentication Type - - - - - - - You now need to specify the Role and Membership Provider to be - used. Click the tab. - - - - - Click the link. - - - - - Now select the - and the radio buttons. - - - - Select Membership and Role Provider - - - - - - - In Visual Studio, rebuild the solution by selecting - Build, Rebuild Solution - from the main menu. - - - - - Check that the necessary schema has been created. This can be - achieved using the command - interpreter. - - - - Membership and Role Provider Tables - - - - - - - Assuming all is present and correct, you can now create users - and roles for your web application. The easiest way to do this - is with the ASP.NET Web Site Administration Tool. However, - many web applications contain their own modules for creating - roles and users. For simplicity, the ASP.NET Web Site - Administration Tool will be used in this tutorial. - - - - - In the ASP.NET Web Site Administration Tool, click the - tab. Now that both the - Membership and Role Provider are enabled, you will see links - for creating roles and users. Click the link. - - - - Security Tab - - - - - - - You can now enter the name of a new Role and click - Add Role to create the new Role. Create - new Roles as required. - - - - - Click the Back button. - - - - - Click the link. You can now - fill in information about the user to be created, and also - allocate that user to one or more Roles. - - - - Create User - - - - - - - Using the command interpreter, you - can check that your database has been correctly populated with - the Membership and Role data. - - - - Membership and Roles Table Contents - - - - - - - In this tutorial, you have seen how to set up the - Membership and Role Providers for use in your ASP.NET web - application. - - -
-
- Tutorial: ASP.NET Session State Provider - - - from version 6.1 has included a MySQL Session State - Provider. This provider enables you to store session state in a - MySQL database. The following tutorial shows you how to prepare to - use the MySQL Session State Provider, and then store session data - into the MySQL database. This tutorial uses Microsoft Visual - Studio 2008 Professional Edition, 6.1.1 and MySQL Server - 5.1. This tutorial also assumes you have created an empty - database, for example test, where you will - store session data. You could do this using the - command interpreter. - - - - - In Visual Studio, create a new ASP.NET web site. If you are - not sure how to do this, refer to the tutorial - Tutorial: Databinding in ASP.NET using LINQ on Entities, - which demonstrates how to do this. - - - - - Launch the MySQL MySQL Website Configuration tool. Due to a - bug in 6.1.1, this may not appear unless you are connected to - a server in the Server Explorer. If you are unfamiliar with - the MySQL Website Configuration tool, consider first working - through the tutorial in - MySQL Website Configuration Tool. - - - - - Navigate through the wizard to the Session State page. Make - sure the check box is selected. - - - - - On the same page, configure the connection string to the - database that will contain your session data. If this database - is empty, will create the schema required to store - session data. - - - - - Ensure that the check box is selected so that will create the - schema in your database to store the session data correctly. - - - - - Enter the name of your application. - - - - - Click Finish. The MySQL Website - Configuration tool will now update your application's - web.config file with information about - the connection string and default providers to be used. In - this case, we have selected the MySQL Session State Provider. - - - - - At this point, you are ready to use the MySQL database to store - session data. To test that the set up has worked, you can write a - simple program that uses session variables. - - - - - Open Default.aspx.cs. In the - Page_Load method, add the following code: - - -Session["SessionVariable1"] = "Test string"; - - - - - Build your solution. - - - - - Run the solution (without debugging). When the application - runs, the provider will autogenerate tables required in the - database you chose when setting up the application. - - - - - Check that the schema was in fact created. Using the MySQL - Command Line Client use the target database and then type - SHOW TABLES;. You will see that has - created the required schema automatically, as we selected this - to happen in the MySQL Website Configuration tool. - - - - - Now view the contents of these tables by typing - SELECT * FROM my_aspnet_sessions; in the - command interpreter. This will - display the session data our application used. Note that this - is stored in binary format so some data may not display as - expected. - - - - - At this point, you have installed the Session State Provider and - carried out a preliminary test of the installation. You will now - work a bit more with the Session State Provider. - - - In this part of the tutorial, you will set and retrieve a session - variable. You can work with your existing project. - - - - - Select the Default.aspx and switch to - Design View. Add a text box and three buttons. Change the text - property for the buttons to , , and - . These will be - Button1, Button2 and - Button3 respectively. Build your solution - to ensure that no errors have been introduced. - - - - - Still in the Design View, double-click - Button1. Now to the - Button1_Click event handler add code some - the handler resembles the following: - - -protected void Button1_Click(object sender, EventArgs e) -{ - Session["SessionString"] = TextBox1.Text; -} - - - You have created a new Session variable accessed using the key - . This will be set to the text - that was entered into the text box when - Button1 is clicked. - - - - - In Design View, double-click Button2 to add - its click event handler. This button needs to clear text from - the text box. The code to do this is as follows: - - -protected void Button2_Click(object sender, EventArgs e) -{ - TextBox1.Text = ""; -} - - - The code simply assigns an empty string to the - Text property of the text box. - - - - - In the Design View double-click Button3 and - modify the click handler as follows: - - -protected void Button3_Click(object sender, EventArgs e) -{ - TextBox1.Text = (String)Session["SessionString"]; -} - - - This will retrieve the session string and display it in the - text box. - - - - - Now modify the Page_Load method as follows: - - -protected void Page_Load(object sender, EventArgs e) -{ - if (!IsPostBack) - { - TextBox1.Text = "Enter some text"; - } -} - - - This ensures that when the page loads the text box - Text property is reset. - - - - - Ensure that the solution is saved and then rebuild the - solution. - - - - - Run the solution without debugging. - - - - - The form will be displayed. Enter some text into the text box. - Now click Store Session Variable. At - this point you have stored the string in a session variable. - - - - - Now click Clear Text to clear the text - box. - - - - - Now click Show Session Variable to - retrieve and display the session variable. - - - - - Refresh the page to destroy the form and display a new form. - - - - - Click Show Session Variable the text - box will display the stored session variable, demonstrating - that the refreshing the page does not destroy the session - variable. - - - - - This illustrates that the session state data is not destroyed when - a page is reloaded. - - -
-
- Tutorial: ASP.NET Profile Provider - - - This tutorial shows you how to use the MySQL Profile Provider to - store user profile information in a MySQL database. The tutorial - uses 6.1.1, MySQL Server 5.1 and Microsoft Visual Studio - 2008 Professional Edition. - - - Many modern web sites allow the user to create a personal profile. - This requires a significant amount of code, but ASP.NET reduces - this considerable by including the functionality in its Profile - classes. The Profile Provider provides an abstraction between - these classes and a data source. The MySQL Profile Provider - enables profile data to be stored in a MySQL database. This - enables the profile properties to be written to a persistent - store, and be retrieved when required. The Profile Provider also - enables profile data to be managed effectively, for example it - enables profiles that have not been accessed since a specific date - to be deleted. - - - The following steps show you how you can select the MySQL Profile - Provider. - - - - - Create a new ASP.NET web project. - - - - - Select the MySQL Website Configuration tool. Due to a bug in - 6.1.1 you may have to first connect to a server in Server - Explorer before the tool's icon will display in the toolbar of - the Solution Explorer. - - - - - In the MySQL Website Configuration tool navigate through the - tool to the Profiles page. - - - - - Select the check box. - - - - - Select the check box. - - - - - Click the Edit... button and configure - a connection string for the database that will be used to - store user profile information. - - - - - Navigate to the last page of the tool and click - Finish to save your changes and exit - the tool. - - - - - At this point you are now ready to start using the MySQL Profile - Provider. With the following steps you can carry out a preliminary - test of your installation. - - - - - Open your web.config file. - - - - - Add a simple profile such as the following: - - -<system.web> - <anonymousIdentification enabled="true"/> - <profile defaultProvider="MySQLProfileProvider"> - ... - <properties> - <add name="Name" allowAnonymous="true"/> - <add name="Age" allowAnonymous="true" type="System.UInt16"/> - <group name="UI"> - <add name="Color" allowAnonymous="true" defaultValue="Blue"/> - <add name="Style" allowAnonymous="true" defaultValue="Plain"/> - </group> - </properties> - </profile> - ... - - - Note that anonymousIdentification has been - set to true. This enables users who have not been - authenticated to use profiles. They are identified by a GUID - in a cookie rather than by user name. - - - - - Now that the simple profile has been defined in - web.config, the next step is to write some - code to test the profile. - - - - - In Design View design a simple page with the following - controls: - - - - Simple Profile Application - - - - - These will allow the user to enter some profile information. - The user can also use the buttons to save their profile, clear - the page, and restore their profile data. - - - - - In the Code View add code as follows: - - -... -protected void Page_Load(object sender, EventArgs e) -{ - if (!IsPostBack) - { - TextBox1.Text = Profile.Name; - TextBox2.Text = Profile.Age.ToString(); - Label1.Text = Profile.UI.Color; - } -} - -// Store Profile -protected void Button1_Click(object sender, EventArgs e) -{ - Profile.Name = TextBox1.Text; - Profile.Age = UInt16.Parse(TextBox2.Text); -} - -// Clear Form -protected void Button2_Click(object sender, EventArgs e) -{ - TextBox1.Text = ""; - TextBox2.Text = ""; - Label1.Text = ""; -} - -// Retrieve Profile -protected void Button3_Click(object sender, EventArgs e) -{ - TextBox1.Text = Profile.Name; - TextBox2.Text = Profile.Age.ToString(); - Label1.Text = Profile.UI.Color; -} - -protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) -{ - Profile.UI.Color = DropDownList1.SelectedValue; -} -... - - - - - Save all files and build the solution to check that no errors - have been introduced. - - - - - Run the application. - - - - - Enter your name, age and select a color from the listbox. Now - store this information in your profile by clicking - Store Profile. Note that if you do not - select a color from the listbox your profile will use the - default color Blue that was specified in - the web.config file. - - - - - Click Clear Form to clear text from the - textboxes and the label that displays your chosen color. - - - - - Now click Retrieve Profile to restore - your profile data from the MySQL database. - - - - - Now exit the browser to terminate the application. - - - - - Run the application again. Note that when the page loads your - profile information is restored from the MySQL database. - - - - - In this tutorial you have seen how to using the MySQL Profile - Provider with . - - -
-
- Tutorial: Using an Entity Framework Entity as a Windows Forms Data - Source - - - In this tutorial you will learn how to create a Windows Forms Data - Source from an Entity in an Entity Data Model. This tutorial - assumes that you have installed the World example database, which - can be downloaded from the - MySQL Documentation - pagehttp://dev.mysql.com/doc/;index-other.html. You can also find details on how to install the - database on the same page. It will also be convenient for you to - create a connection to the World database after it is installed. - For instructions on how to do this see - Making a Connection. - - - Creating a new Windows Forms - application - - - The first step is to create a new Windows Forms application. - - - - - In Visual Studio, select File, - New, Project from the - main menu. - - - - - Choose the - installed template. Click OK. The - solution is created. - - - - - Adding an Entity Data Model - - - You will now add an Entity Data Model to your solution. - - - - - In the Solution Explorer, right-click your application and - select Add, New Item.... - From - select . Click - Add. - - - - Add Entity Data Model - - - - - - - You will now see the Entity Data Model Wizard. You will use - the wizard to generate the Entity Data Model from the world - example database. Select the icon . Click Next. - - - - Entity Data Model Wizard Screen 1 - - - - - - - You can now select the connection you made earlier to the - World database. If you have not already done so, you can - create the new connection at this time by clicking - New Connection.... For further - instructions on creating a connection to a database see - Making a Connection. - - - - Entity Data Model Wizard Screen 2 - - - - - - - Make a note of the entity connection settings to be used in - App.Config, as these will be used later to write the necessary - control code. - - - - - Click Next. - - - - - The Entity Data Model Wizard connects to the database. You are - then presented with a tree structure of the database. From - this you can select the object you would like to include in - your model. If you had created Views and Stored Routines these - will be displayed along with any tables. In this example you - just need to select the tables. Click - Finish to create the model and exit the - wizard. - - - - Entity Data Model Wizard Screen 3 - - - - - - - Visual Studio will generate the model and then display it. - - - - Entity Data Model Diagram - - - - - - - From the Visual Studio main menu select - Build, Build Solution, - to ensure that everything compiles correctly so far. - - - - - Adding a new Data Source - - - You will now add a new Data Source to your project and see how it - can be used to read and write to the database. - - - - - From the Visual Studio main menu select - Data, Add New Data - Source.... You will be presented with the Data - Source Configuration Wizard. - - - - Entity Data Source Configuration Wizard Screen 1 - - - - - - - Select the icon. Click - Next. - - - - - You will now select the Object to bind to. Expand the tree. In - this tutorial, you will select the city table. Once the city - table has been selected click Next. - - - - Entity Data Source Configuration Wizard Screen 2 - - - - - - - The wizard will confirm that the city object is to be added. - Click Finish. - - - - Entity Data Source Configuration Wizard Screen 3 - - - - - - - The city object will be display in the Data Sources panel. If - the Data Sources panel is not displayed, select - Data, Show Data Sources - from the Visual Studio main menu. The docked panel will then - be displayed. - - - - Data Sources - - - - - - - Using the Data Source in a Windows - Form - - - You will now learn how to use the Data Source in a Windows Form. - - - - - In the Data Sources panel select the Data Source you just - created and drag and drop it onto the Form Designer. By - default the Data Source object will be added as a Data Grid - View control. Note that the Data Grid View control is bound to - the cityBindingSource and the Navigator - control is bound to cityBindingNavigator. - - - - Data Form Designer - - - - - - - Save and rebuild the solution before continuing. - - - - - Adding Code to Populate the Data Grid - View - - - You are now ready to add code to ensure that the Data Grid View - control will be populated with data from the City database table. - - - - - Double-click the form to access its code. - - - - - Add code to instatiate the Entity Data Model's EntityContainer - object and retrieve data from the database to populate the - control. - - - - Adding Code to the Form - - - - - - - Save and rebuild the solution. - - - - - Run the solution. Ensure the grid is populated and you can - navigate the database. - - - - The Populated Grid Control - - - - - - - Adding Code to Save Changes to the - Database - - - You will now add code to enable you to save changes to the - database. - - - The Binding source component ensures that changes made in the Data - Grid View control are also made to the Entity classes bound to it. - However, that data needs to be saved back from the entities to the - database itself. This can be achieved by the enabling of the Save - button in the Navigator control, and the addition of some code. - - - - - In the Form Designer, click the Save icon in the Form toolbar - and ensure that its Enabled property is set to True. - - - - Save Button Enabled - - - - - - - Double-click the Save icon in the Form toolbar to display its - code. - - - - - You now need to add code to ensure that data is saved to the - database when the save button is clicked in the application. - - - - Adding Save Code to the Form - - - - - - - Once the code has been added, save the solution and rebuild - it. Run the application and verify that changes made in the - grid are saved. - - - - -
-
- Tutorial: Databinding in ASP.NET using LINQ on Entities - - - In this tutorial you create an ASP.NET web page that binds LINQ - queries to entities using the Entity Framework mapping. - - - If you have not already done so, install the World example - database prior to attempting this tutorial. See the tutorial - Tutorial: Using an Entity Framework Entity as a Windows Forms Data - Source - for instructions on downloading and installing this database. - - - Creating an ASP.NET web site - - - In this part of the tutorial, you will create an ASP.NET web site. - The web site will use the World database. The main web page will - feature a drop down list from which you can select a country, data - about that country's cities will then be displayed in a grid view - control. - - - - - From the Visual Studio main menu select - File, New, Web - Site.... - - - - - From the Visual Studio installed templates select - . Click - OK. You will be presented with the - Source view of your web page by default. - - - - - Click the Design view tab situated underneath the Source view - panel. - - - - The Design Tab - - - - - - - In the Design view panel, enter some text to decorate the - blank web page. - - - - - Click Toolbox. From the list of controls select - . Drag and drop the control - to a location beneath the text on your web page. - - - - Drop Down List - - - - - - - From the control's context - menu, ensure that the - check box is enabled. This will ensure the control's event - handler is called when an item is selected. The user's choice - will in turn be used to populate the - control. - - - - Enable AutoPostBack - - - - - - - From the Toolbox select the - control. - - - - Grid View Control - - - - - Drag and drop the Grid Vew control to a location just below - the Drop Down List you already placed. - - - - Placed Grid Vew Control - - - - - - - At this point it is recommended that you save your solution, - and build the solution to ensure that there are no errors. - - - - - If you run the solution you will see that the text and drop - down list are displayed, but the list is empty. Also, the grid - view does not appear at all. Adding this functionality is - described in the following sections. - - - - - At this stage you have a web site that will build, but further - functionality is required. The next step will be to use the Entity - Framework to create a mapping from the World database into - entities that you can control programmatically. - - - Creating an ADO.NET Entity Data - Model - - - In this stage of the tutorial you will add an ADO.NET Entity Data - Model to your project, using the World database at the storage - level. The procedure for doing this is described in the tutorial - Tutorial: Using an Entity Framework Entity as a Windows Forms Data - Source, - and so will not be repeated here. - - - Populating a Drop Data List Box with using - the results of a entity LINQ query - - - In this part of the tutorial you will write code to populate the - DropDownList control. When the web page loads the data to populate - the list will be achieved by using the results of a LINQ query on - the model created previously. - - - - - In the Design view panel, double-click any blank area. This - brings up the method. - - - - - Modify the relevant section of code according to the following - listing: - - -... -public partial class _Default : System.Web.UI.Page -{ - worldModel.worldEntities we; - - protected void Page_Load(object sender, EventArgs e) - { - we = new worldModel.worldEntities(); - - if (!IsPostBack) - { - var countryQuery = from c in we.country - orderby c.Name - select new { c.Code, c.Name }; - DropDownList1.DataValueField = "Code"; - DropDownList1.DataTextField = "Name"; - DropDownList1.DataSource = countryQuery; - DataBind(); - } - } -... - - - Note that the list control only needs to be populated when the - page first loads. The conditional code ensures that if the - page is subsequently reloaded, the list control is not - repopulated, which would cause the user selection to be lost. - - - - - Save the solution, build it and run it. You should see the - list control has been populated. You can select an item, but - as yet the grid view control does not appear. - - - - - At this point you have a working Drop Down List control, populated - by a LINQ query on your entity data model. - - - Populating a Grid View control using an - entity LINQ query - - - In the last part of this tutorial you will populate the Grid View - Control using a LINQ query on your entity data model. - - - - - In the Design view, double-click the - control. This causes its - code to be - displayed. This method is called when a user selects an item - in the list control and thus fires an AutoPostBack event. - - - - - Modify the relevant section of code accordingly to the - following listing: - - -... - protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) - { - var cityQuery = from c in we.city - where c.CountryCode == DropDownList1.SelectedValue - orderby c.Name - select new { c.Name, c.Population, c.CountryCode }; - GridView1.DataSource = cityQuery; - DataBind(); - } -... - - - The grid view control is populated from the result of the LINQ - query on the entity data model. - - - - - As a check compare your code to that shown in the following - screenshot: - - - - Source Code - - - - - - - Save, build and run the solution. As you select a country you - will see its cities are displayed in the grid view control. - - - - The Working Web Site - - - - - - - In this tutorial you have seen how to create an ASP.NET web site, - you have also seen how you can access a MySQL database using LINQ - queries on an entity data model. - - -
-
- Tutorial: Using SSL with - - - In this tutorial you will learn how you can use to connect to - a MySQL server configured to use SSL. Support for SSL client - certificates was added with 6.2. - - - MySQL Server uses the PEM format for certificates and private keys. - This tutorial will use the test certificates from the server test - suite by way of example. You can obtain the MySQL Server source code - from - MySQL - Downloadshttp://dev.mysql.com/downloads/mysql/5.1.html#source. The certificates can be found in the directory - ./mysql-test/std_data. - - - To carry out the steps in this tutorial, you must have Open SSL - installed. This can be downloaded for Microsoft Windows at no charge - from - Shining - Light Productionshttp://www.slproweb.com/products/Win32OpenSSL.html. - - - Further details on the connection string options used in this - tutorial can be found at - . - - - Configuring the MySQL Server to use - SSL - - - - - In the MySQL Server configuration file, set the SSL parameters - as follows: - - ssl-ca=path/to/repo/mysql-test/std_data/cacert.pem -ssl-cert=path/to/repo/mysql-test/std_data/server-cert.pem -ssl-key=path/to/repo/mysql-test/std_data/server-key.pem - - - Adjust the directories according to the location in which you - installed the MySQL source code. - - - - - In this step you create a test user and set the user to require - SSL. - - - Using the MySQL Command Line Client, connect as root and create - the user sslclient. - - - - - To set privileges and requirements, issue the following command: - - GRANT ALL PRIVILEGES ON *.* TO sslclient@'%' REQUIRE SSL; - - - - Creating a certificate file to use with the - .NET client - - - - - The .NET client does not use the PEM file format, as .NET does - not support this format natively. You will be using test client - certificates from the same server repository, for the purposes - of this example. Convert these to PFX format first. This format - is also known as PKCS#12. An article describing this procedure - can be found at the - Citrix - websitehttp://support.citrix.com/article/CTX106630. From the directory - server-repository-root/mysql-test/std_data, - issue the following command: - - openssl pkcs12 -export -in client-cert.pem -inkey client-key.pem -certfile cacert.pem -out client.pfx - - - - When asked for an export password, enter the password - . The file client.pfx - will be generated. This file is used in the remainder of the - tutorial. - - - - - Connecting to the server using a file-based - certificate - - - - - You will use PFX file, client.pfx you - created in the previous step to authenticate the client. The - following example demonstrates how to connect using the - SSL Mode, CertificateFile - and CertificatePassword connection string - options: - - using (MySqlConnection connection = new MySqlConnection( - "database=test;user=sslclient;" + - "CertificateFile=H:\\bzr\\mysql-trunk\\mysqlest\\std_data\\client.pfx" + - "CertificatePassword=pass;" + - "SSL Mode=Required ")) -{ - connection.Open(); -} - - The path to the certificate file will need to be changed to - reflect your individual installation. - - - - - Connecting to the server using a store-based - certificate - - - - - The first step is to import the PFX file, - client.pfx, into the Personal Store. - Double-click the file in Windows explorer. This launches the - Certificate Import Wizard. - - - - - Follow the steps dictated by the wizard, and when prompted for - the password for the PFX file, enter . - - - - - Click Finish to close the wizard and - import the certificate into the personal store. - - - - - Examine certificates in the Personal - Store - - - - - Start the Microsoft Management Console by entering - mmc.exe at a command prompt. - - - - - Select File, Add/Remove - snap-in. Click Add. Select - from the list of available - snap-ins in the dialog. - - - - - Click Add button in the dialog, and - select the radio button. - This is used for personal certificates. - - - - - Click the Finish button. - - - - - Click OK to close the Add/Remove Snap-in - dialog. - - - - - You will now have displayed in the left panel of the Microsoft - Management Console. Expand the Certificates - Current User tree - item and select , - . The right-hand panel will - display a certificate issued to MySQL. This is the certificate - that was previously imported. Double-click the certificate to - display its details. - - - - - After you have imported the certificate to the Personal Store, - you can use a more succint connection string to connect to the - database, as illustrated by the following code: - - using (MySqlConnection connection = new MySqlConnection( - "database=test;user=sslclient;" + - "Certificate Store Location=CurrentUser;" + - "SSL Mode=Required")) -{ - connection.Open(); -} - - - - Certificate Thumbprint Parameter - - - If you have a large number of certificates in your store, and many - have the same Issuer, this can be a source of confusion and result - in the wrong certificate being used. To alleviate this situation, - there is an optional Certificate Thumbprint parameter that can - additionally be specified as part of the connection string. As - mentioned before, you can double-click a certificate in the - Microsoft Management Console to display the certificate's details. - When the Certificate dialog is displayed click the - tab and scroll down to see the - thumbprint. The thumbprint will typically be a number such as - ‎47 94 36 00 9a 40 f3 01 7a 14 5c f8 47 9e 76 94 d7 aa de - f0. This thumbprint can be used in the connection string, - as the following code illustrates: - - using (MySqlConnection connection = new MySqlConnection( - "database=test;user=sslclient;" + - "Certificate Store Location=CurrentUser;" + - "Certificate Thumbprint=479436009a40f3017a145cf8479e7694d7aadef0;"+ - "SSL Mode=Required")) -{ - connection.Open(); -} - - Spaces in the thumbprint parameter are optional and the value is - case-insensitive. - - -
-
- Tutorial: Using MySqlScript - - - - This tutorial teaches you how to use the - class. This class enables you to - execute a series of statements. Depending on the circumstances, this - can be more convenient than using the - approach. - - - Further details of the class can - be found in the reference documentation supplied with . - - - To run the example programs in this tutorial, set up a simple test - database and table using the Command Line - Client or MySQL Workbench. Commands for the - Command Line Client are given here: - - - - - CREATE DATABASE TestDB; - - - - - USE TestDB; - - - - - CREATE TABLE TestTable (id INT NOT NULL PRIMARY KEY - AUTO_INCREMENT, name VARCHAR(100)); - - - - - The main method of the class is - the method. This method causes the - script (sequence of statements) assigned to the - property of the MySqlScript object to be - executed. Note the property can be set - through the constructor or using - the property. - returns the number of statements - executed. - - - The object will execute the - specified script on the connection set using the - property. Again, this property can - be set directly or through the - constructor. The following code snippets illustrate this: - - -string sql = "SELECT * FROM TestTable"; -... -MySqlScript script = new MySqlScript(conn, sql); -... -MySqlScript script = new MySqlScript(); -script.Query = sql; -script.Connection = conn; -... -script.Execute(); - - - The MySqlScript class has several events associated with it. There - are: - - - - - Error - generated if an error occurs. - - - - - ScriptCompleted - generated when the script successfully - completes execution. - - - - - StatementExecuted - generated after each statement is executed. - - - - - It is possible to assign event handlers to each of these events. - These user-provided routines are called back when the connected - event occurs. The following code shows how the event handlers are - set up. - - -script.Error += new MySqlScriptErrorEventHandler(script_Error); -script.ScriptCompleted += new EventHandler(script_ScriptCompleted); -script.StatementExecuted += new MySqlStatementExecutedEventHandler(script_StatementExecuted); - - - In VisualStudio, you can save typing by using tab completion to fill - out stub routines. Start by typing, for example, . Then press , and then press - again. The assignment is completed, and a stub - event handler created. A complete working example is shown below: - - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -using System.Data; -using MySql.Data; -using MySql.Data.MySqlClient; - -namespace MySqlScriptTest -{ - class Program - { - static void Main(string[] args) - { - string connStr = "server=localhost;user=root;database=TestDB;port=3306;password=******;"; - MySqlConnection conn = new MySqlConnection(connStr); - - try - { - Console.WriteLine("Connecting to MySQL..."); - conn.Open(); - - string sql = "INSERT INTO TestTable(name) VALUES ('Superman');" + - "INSERT INTO TestTable(name) VALUES ('Batman');" + - "INSERT INTO TestTable(name) VALUES ('Wolverine');" + - "INSERT INTO TestTable(name) VALUES ('Storm');"; - - MySqlScript script = new MySqlScript(conn, sql); - - script.Error += new MySqlScriptErrorEventHandler(script_Error); - script.ScriptCompleted += new EventHandler(script_ScriptCompleted); - script.StatementExecuted += new MySqlStatementExecutedEventHandler(script_StatementExecuted); - - int count = script.Execute(); - - Console.WriteLine("Executed " + count + " statement(s)."); - Console.WriteLine("Delimiter: " + script.Delimiter); - } - catch (Exception ex) - { - Console.WriteLine(ex.ToString()); - } - - conn.Close(); - Console.WriteLine("Done."); - } - - static void script_StatementExecuted(object sender, MySqlScriptEventArgs args) - { - Console.WriteLine("script_StatementExecuted"); - } - - static void script_ScriptCompleted(object sender, EventArgs e) - { - /// EventArgs e will be EventArgs.Empty for this method - Console.WriteLine("script_ScriptCompleted!"); - } - - static void script_Error(Object sender, MySqlScriptErrorEventArgs args) - { - Console.WriteLine("script_Error: " + args.Exception.ToString()); - } - } -} - - - Note that in the - event handler, the parameter - e will be EventArgs.Empty. In - the case of the ScriptCompleted event there is no - additional data to be obtained, which is why the event object is - EventArgs.Empty. - - -
-
- Using Delimiters with MySqlScript - - - Depending on the nature of the script, you may need control of the - delimiter used to separate the statements that will make up a - script. The most common example of this is where you have a - multi-statement stored routine as part of your script. In this - case if the default delimiter of is used you will - get an error when you attempt to execute the script. For example, - consider the following stored routine: - - -CREATE PROCEDURE test_routine() -BEGIN - SELECT name FROM TestTable ORDER BY name; - SELECT COUNT(name) FROM TestTable; -END - - - This routine actually needs to be executed on the MySQL Server as - a single statement. However, with the default delimiter of - , the class - would interpret the above as two statements, the first being: - - -CREATE PROCEDURE test_routine() -BEGIN - SELECT name FROM TestTable ORDER BY name; - - - Executing this as a statement would generate an error. To solve - this problem supports the - ability to set a different delimiter. This is achieved through the - property. For example, you could - set the delimiter to , in which case the above - stored routine would no longer generate an error when executed. - Multiple statements can be delimited in the script, so for - example, you could have a three statement script such as: - - -string sql = "DROP PROCEDURE IF EXISTS test_routine??" + - "CREATE PROCEDURE test_routine() " + - "BEGIN " + - "SELECT name FROM TestTable ORDER BY name;" + - "SELECT COUNT(name) FROM TestTable;" + - "END??" + - "CALL test_routine()"; - - - You can change the delimiter back at any point by setting the - property. The following code shows - a complete working example: - - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -using MySql.Data; -using MySql.Data.MySqlClient; - -namespace ConsoleApplication8 -{ - class Program - { - static void Main(string[] args) - { - string connStr = "server=localhost;user=root;database=TestDB;port=3306;password=******;"; - MySqlConnection conn = new MySqlConnection(connStr); - - try - { - Console.WriteLine("Connecting to MySQL..."); - conn.Open(); - - string sql = "DROP PROCEDURE IF EXISTS test_routine??" + - "CREATE PROCEDURE test_routine() " + - "BEGIN " + - "SELECT name FROM TestTable ORDER BY name;" + - "SELECT COUNT(name) FROM TestTable;" + - "END??" + - "CALL test_routine()"; - - MySqlScript script = new MySqlScript(conn); - - script.Query = sql; - script.Delimiter = "??"; - int count = script.Execute(); - Console.WriteLine("Executed " + count + " statement(s)"); - script.Delimiter = ";"; - Console.WriteLine("Delimiter: " + script.Delimiter); - Console.WriteLine("Query: " + script.Query); - } - catch (Exception ex) - { - Console.WriteLine(ex.ToString()); - } - - conn.Close(); - Console.WriteLine("Done."); - } - } -} - - -
-
- Tutorial: Generating MySQL DDL from an Entity Framework Model - - - In this tutorial, you will learn how to create MySQL - from an Entity Framework model. - Use Visual Studio 2010 and 6.3 to carry out this tutorial. - - - - - Create a new console application in Visual Studio 2010. - - - - - Using the , add a - reference to MySql.Data.Entity. - - - - - From the select - Add, New Item. In the - dialog select . Select and click Add. The - dialog will be displayed. - - - - - In the dialog select - . Click - Finish. A blank model will be created. - - - - - Create a simple model. A single Entity will do for the purposes - of this tutorial. - - - - - In the panel select - ConceptualEntityModel from the drop-down - listbox. - - - - - In the panel, locate the - in the category - . - - - - - For the property select - SSDLToMySQL.tt(VS) from the drop-down - listbox. - - - - - Save the solution. - - - - - Right-click an empty space in the model design area. The - context-sensitive menu will be displayed. - - - - - From the context-sensitive menu select Generate - Database from Model. The dialog will be displayed. - - - - - In the dialog - select an existing connection, or create a new connection to a - server. Select an appropriate radio button to show or hide - sensitive data. For the purposes of this tutorial you can select - (although you might skip this for - commercial applications). - - - - - Click Next. MySQL compatible DDL code - will be generated. Click Finish to exit - the wizard. - - - - - You have seen how to create MySQL DDL code from an Entity Framework - model. - - -
-
-
\ No newline at end of file diff --git a/Documentation/Users Guide/connector-net-versions.aml b/Documentation/Users Guide/connector-net-versions.aml deleted file mode 100644 index fafe27fbf..000000000 --- a/Documentation/Users Guide/connector-net-versions.aml +++ /dev/null @@ -1,120 +0,0 @@ - - -
- Connector/Net Versions - - - There are several versions of Connector/Net available: - - - - - Connector/Net 6.5 includes support for MySQL Server 5.6, 5.5, 5.1, - and 5.0. Important new features include - interceptor classes for exceptions and commands, - support for the MySQL 5.6 fractional seconds feature, - better partial-trust support, and - better IntelliSense, including auto-completion when editing stored procedures or .mysql files. - - - - - Connector/Net 6.4 includes support for MySQL Server 5.5, 5.1, - and 5.0. Important new features include support for Windows - authentication (when connecting to MySQL Server 5.5+), table - caching on the client side, simple connection fail-over support, - and improved SQL generation from the Entity Framework provider. - - - - - Connector/Net 6.3 includes support for MySQL Server 5.5, 5.1, - and 5.0. Important new features include integration with Visual - Studio 2010, such as availability of DDL T4 template for Entity - Framework, and a custom MySQL SQL Editor. Other features include - refactored transaction scope: Connector/Net now supports nested - transactions in a scope where they use the same connection - string. - - - - - Connector/Net 6.2 includes support for MySQL Server 5.5, 5.1, - 5.0, and 4.1. Important new features include a new logging - system and client SSL certificates. - - - - - Connector/Net 6.1 includes support for MySQL Server 5.5, 5.1, - 5.0, and 4.1. Important new features include the MySQL Website - Configuration Tool and a Session State Provider. - - - - - Connector/Net 6.0 includes support for MySQL Server 5.5, 5.1, - 5.0, and 4.1. - - - - - Connector/Net 5.2 includes support for MySQL Server 5.5, 5.1, - 5.0, and 4.1 features. Connector/Net 5.2 also includes support - for a new membership/role provider, Compact Framework 2.0, a new - stored procedure parser and improvements to - GetSchema. Connector/Net 5.2 also includes - the Visual Studio Plugin as a standard installable component. - - - - - Connector/Net 5.1 includes support for MySQL Server 5.5, 5.1, - 5.0, 4.1, and 4.0 features. Connector/Net 5.1 also includes - support for a new membership/role provider, Compact Framework - 2.0, a new stored procedure parser and improvements to - GetSchema. Connector/Net 5.1 also includes - the Visual Studio Plugin as a standard installable component. - - - - - Connector/Net 5.0 includes support for MySQL Server 5.1, 5.0, - 4.1 and 4.0 features. Connector/Net 5.0 also includes full - support for the ADO.Net 2.0 interfaces and subclasses, includes - support for the usage advisor and performance monitor (PerfMon) - hooks. - - - - - Connector/Net 1.0 includes support for MySQL Server 5.0, 4.1, - and 4.0 features, and full compatibility with the ADO.NET driver - interface. - - - - - The latest source code for Connector/Net can be downloaded from the - MySQL public Subversion server. For further details, see - Installing Connector/Net from the source code. - - - The following tables shows the .NET Framework version required, and - the MySQL Server version supported by Connector/Net: - - - - Version numbers for MySQL products are formatted as X.Y.Z, where - Z=0 indicates alpha, Z=1 indicates beta, and Z>=2 indicates GA. - However, Windows tools (Control Panel, properties display) may - show the version numbers as XX.YY.ZZ. For example, the official - MySQL formatted version number 5.0.9 may be displayed by Windows - tools as 5.00.09. The two versions are the same; only the number - display format is different. - - - -
-
-
\ No newline at end of file diff --git a/Documentation/Users Guide/media/connector-net-ddl-generate.png b/Documentation/Users Guide/media/connector-net-ddl-generate.png deleted file mode 100644 index 17d20b4c0..000000000 Binary files a/Documentation/Users Guide/media/connector-net-ddl-generate.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-ddl-properties.png b/Documentation/Users Guide/media/connector-net-ddl-properties.png deleted file mode 100644 index 885e577a3..000000000 Binary files a/Documentation/Users Guide/media/connector-net-ddl-properties.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-sql-editor-new-file-dialog.png b/Documentation/Users Guide/media/connector-net-sql-editor-new-file-dialog.png deleted file mode 100644 index 1cd976640..000000000 Binary files a/Documentation/Users Guide/media/connector-net-sql-editor-new-file-dialog.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-sql-editor-query.png b/Documentation/Users Guide/media/connector-net-sql-editor-query.png deleted file mode 100644 index a750ef077..000000000 Binary files a/Documentation/Users Guide/media/connector-net-sql-editor-query.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-tutorials-1.png b/Documentation/Users Guide/media/connector-net-tutorials-1.png deleted file mode 100644 index 3ae0d27a2..000000000 Binary files a/Documentation/Users Guide/media/connector-net-tutorials-1.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-tutorials-asp-provider-profile-simple-app.png b/Documentation/Users Guide/media/connector-net-tutorials-asp-provider-profile-simple-app.png deleted file mode 100644 index 5066a5af4..000000000 Binary files a/Documentation/Users Guide/media/connector-net-tutorials-asp-provider-profile-simple-app.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-tutorials-authentication-type.png b/Documentation/Users Guide/media/connector-net-tutorials-authentication-type.png deleted file mode 100644 index f3fcd3041..000000000 Binary files a/Documentation/Users Guide/media/connector-net-tutorials-authentication-type.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-tutorials-create-user.png b/Documentation/Users Guide/media/connector-net-tutorials-create-user.png deleted file mode 100644 index 9188fb1f4..000000000 Binary files a/Documentation/Users Guide/media/connector-net-tutorials-create-user.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-tutorials-security-tab.png b/Documentation/Users Guide/media/connector-net-tutorials-security-tab.png deleted file mode 100644 index 36ba6a02b..000000000 Binary files a/Documentation/Users Guide/media/connector-net-tutorials-security-tab.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-tutorials-select-provider.png b/Documentation/Users Guide/media/connector-net-tutorials-select-provider.png deleted file mode 100644 index f4b4481d8..000000000 Binary files a/Documentation/Users Guide/media/connector-net-tutorials-select-provider.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-tutorials-tables.png b/Documentation/Users Guide/media/connector-net-tutorials-tables.png deleted file mode 100644 index 34e089ee1..000000000 Binary files a/Documentation/Users Guide/media/connector-net-tutorials-tables.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-tutorials-users-roles-tables.png b/Documentation/Users Guide/media/connector-net-tutorials-users-roles-tables.png deleted file mode 100644 index 226d85bb9..000000000 Binary files a/Documentation/Users Guide/media/connector-net-tutorials-users-roles-tables.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-add-connection-dialog.png b/Documentation/Users Guide/media/connector-net-visual-studio-add-connection-dialog.png deleted file mode 100644 index 8cea210c7..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-add-connection-dialog.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-add-connection.png b/Documentation/Users Guide/media/connector-net-visual-studio-add-connection.png deleted file mode 100644 index 56cb5b3fe..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-add-connection.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-choose-data-source.png b/Documentation/Users Guide/media/connector-net-visual-studio-choose-data-source.png deleted file mode 100644 index 9d4410d70..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-choose-data-source.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-choose-table-name.png b/Documentation/Users Guide/media/connector-net-visual-studio-choose-table-name.png deleted file mode 100644 index 688cbb78e..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-choose-table-name.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-editing-new-table.png b/Documentation/Users Guide/media/connector-net-visual-studio-editing-new-table.png deleted file mode 100644 index ae9c86bda..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-editing-new-table.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-add-entity-data-model.png b/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-add-entity-data-model.png deleted file mode 100644 index 18f598d2e..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-add-entity-data-model.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-app-running-1.png b/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-app-running-1.png deleted file mode 100644 index 5ea4bbb14..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-app-running-1.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-data-form-design.png b/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-data-form-design.png deleted file mode 100644 index 59c9e7a5c..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-data-form-design.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-data-source-configuration-wizard-1.png b/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-data-source-configuration-wizard-1.png deleted file mode 100644 index d54a90f9b..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-data-source-configuration-wizard-1.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-data-source-configuration-wizard-2.png b/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-data-source-configuration-wizard-2.png deleted file mode 100644 index 151c6c9ec..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-data-source-configuration-wizard-2.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-data-source-configuration-wizard-3.png b/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-data-source-configuration-wizard-3.png deleted file mode 100644 index 8fe7a853a..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-data-source-configuration-wizard-3.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-data-sources.png b/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-data-sources.png deleted file mode 100644 index af3cd3e5b..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-data-sources.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-entity-data-model-diagram.png b/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-entity-data-model-diagram.png deleted file mode 100644 index af76dee6f..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-entity-data-model-diagram.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-entity-data-model-wizard-1.png b/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-entity-data-model-wizard-1.png deleted file mode 100644 index 84fe94226..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-entity-data-model-wizard-1.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-entity-data-model-wizard-2.png b/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-entity-data-model-wizard-2.png deleted file mode 100644 index 78b781801..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-entity-data-model-wizard-2.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-entity-data-model-wizard-3.png b/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-entity-data-model-wizard-3.png deleted file mode 100644 index b5bca307f..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-entity-data-model-wizard-3.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-form-add-code-save.png b/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-form-add-code-save.png deleted file mode 100644 index 59c3f556a..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-form-add-code-save.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-form-add-code.png b/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-form-add-code.png deleted file mode 100644 index 78fa128d2..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-form-add-code.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-save-enabled.png b/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-save-enabled.png deleted file mode 100644 index dcb2e1def..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-save-enabled.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-tutorial-linq-1.png b/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-tutorial-linq-1.png deleted file mode 100644 index e360c8060..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-tutorial-linq-1.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-tutorial-linq-2.png b/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-tutorial-linq-2.png deleted file mode 100644 index 1c84e6f97..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-tutorial-linq-2.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-tutorial-linq-3.png b/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-tutorial-linq-3.png deleted file mode 100644 index 2af1d067f..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-tutorial-linq-3.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-tutorial-linq-4.png b/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-tutorial-linq-4.png deleted file mode 100644 index 7b77f21ce..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-tutorial-linq-4.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-tutorial-linq-5.png b/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-tutorial-linq-5.png deleted file mode 100644 index 751fb8410..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-tutorial-linq-5.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-tutorial-linq-6.png b/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-tutorial-linq-6.png deleted file mode 100644 index fb54e52cf..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-tutorial-linq-6.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-tutorial-linq-7.png b/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-tutorial-linq-7.png deleted file mode 100644 index 373d75153..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-entity-framework-tutorial-linq-7.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-foreign-key-relationships.png b/Documentation/Users Guide/media/connector-net-visual-studio-foreign-key-relationships.png deleted file mode 100644 index 049f638fd..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-foreign-key-relationships.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-indexes-dialog.png b/Documentation/Users Guide/media/connector-net-visual-studio-indexes-dialog.png deleted file mode 100644 index fc708b329..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-indexes-dialog.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-new-data-connection.png b/Documentation/Users Guide/media/connector-net-visual-studio-new-data-connection.png deleted file mode 100644 index ed60d8156..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-new-data-connection.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-newly-created-table.png b/Documentation/Users Guide/media/connector-net-visual-studio-newly-created-table.png deleted file mode 100644 index 7f5f8c642..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-newly-created-table.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-selecting-table-properties.png b/Documentation/Users Guide/media/connector-net-visual-studio-selecting-table-properties.png deleted file mode 100644 index 7812b2f5d..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-selecting-table-properties.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-stored-procedure-edit.png b/Documentation/Users Guide/media/connector-net-visual-studio-stored-procedure-edit.png deleted file mode 100644 index 07e316b1e..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-stored-procedure-edit.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-stored-procedure-saved.png b/Documentation/Users Guide/media/connector-net-visual-studio-stored-procedure-saved.png deleted file mode 100644 index d261e60ce..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-stored-procedure-saved.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-table-designer-menu-item.png b/Documentation/Users Guide/media/connector-net-visual-studio-table-designer-menu-item.png deleted file mode 100644 index 3f490ebac..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-table-designer-menu-item.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-table-properties-menu.png b/Documentation/Users Guide/media/connector-net-visual-studio-table-properties-menu.png deleted file mode 100644 index d0404b3ba..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-table-properties-menu.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-views-edit-sql.png b/Documentation/Users Guide/media/connector-net-visual-studio-views-edit-sql.png deleted file mode 100644 index 94661930a..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-views-edit-sql.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-views-sql-added.png b/Documentation/Users Guide/media/connector-net-visual-studio-views-sql-added.png deleted file mode 100644 index c3d9166f3..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-views-sql-added.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-visual-studio-views-sql-saved.png b/Documentation/Users Guide/media/connector-net-visual-studio-views-sql-saved.png deleted file mode 100644 index 1a51259f8..000000000 Binary files a/Documentation/Users Guide/media/connector-net-visual-studio-views-sql-saved.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-website-config-tool-membership.png b/Documentation/Users Guide/media/connector-net-website-config-tool-membership.png deleted file mode 100644 index 2e9080d82..000000000 Binary files a/Documentation/Users Guide/media/connector-net-website-config-tool-membership.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-website-config-tool-options.png b/Documentation/Users Guide/media/connector-net-website-config-tool-options.png deleted file mode 100644 index 9d97d8be3..000000000 Binary files a/Documentation/Users Guide/media/connector-net-website-config-tool-options.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-website-config-tool-profiles.png b/Documentation/Users Guide/media/connector-net-website-config-tool-profiles.png deleted file mode 100644 index f4a7f1280..000000000 Binary files a/Documentation/Users Guide/media/connector-net-website-config-tool-profiles.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-website-config-tool-roles.png b/Documentation/Users Guide/media/connector-net-website-config-tool-roles.png deleted file mode 100644 index d6f2088a7..000000000 Binary files a/Documentation/Users Guide/media/connector-net-website-config-tool-roles.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-website-config-tool-session-state.png b/Documentation/Users Guide/media/connector-net-website-config-tool-session-state.png deleted file mode 100644 index 8ae4484a6..000000000 Binary files a/Documentation/Users Guide/media/connector-net-website-config-tool-session-state.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-website-config-tool-string-editor.png b/Documentation/Users Guide/media/connector-net-website-config-tool-string-editor.png deleted file mode 100644 index c402520dc..000000000 Binary files a/Documentation/Users Guide/media/connector-net-website-config-tool-string-editor.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-website-config-tool-tables.png b/Documentation/Users Guide/media/connector-net-website-config-tool-tables.png deleted file mode 100644 index 83749e3bb..000000000 Binary files a/Documentation/Users Guide/media/connector-net-website-config-tool-tables.png and /dev/null differ diff --git a/Documentation/Users Guide/media/connector-net-website-config-tool.png b/Documentation/Users Guide/media/connector-net-website-config-tool.png deleted file mode 100644 index 55dd03845..000000000 Binary files a/Documentation/Users Guide/media/connector-net-website-config-tool.png and /dev/null differ diff --git a/Documentation/config.txt b/Documentation/config.txt deleted file mode 100644 index 4458343d9..000000000 --- a/Documentation/config.txt +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - -
- - - - diff --git a/Documentation/docfx.json b/Documentation/docfx.json new file mode 100644 index 000000000..f194fe7e3 --- /dev/null +++ b/Documentation/docfx.json @@ -0,0 +1,89 @@ +{ + "metadata": [ + { + "src": [ + { + "files": ["MySql.Data.csproj"], + "src": "../MySQL.Data/src/" + } + ], + "dest": "api/data_api", + "properties": { "TargetFramework": "netstandard2.1" } + }, + { + "src": [ + { + "files": ["MySql.Data.EntityFramework.csproj"], + "src": "../EntityFramework/src/" + } + ], + "dest": "api/ef_api", + "properties": { "TargetFramework": "netstandard2.1" } + }, + { + "src": [ + { + "files": ["MySql.EntityFrameworkCore.csproj"], + "src": "../EFCore/src/" + } + ], + "dest": "api/efcore_api", + "properties": { "TargetFramework": "net9.0" } + }, + { + "src": [ + { + "files": ["MySql.Web.csproj"], + "src": "../MySql.Web/src/" + } + ], + "dest": "api/web_api", + "properties": { "TargetFramework": "net48" } + } + ], + "build": { + "template": [ + "default", + "templates/custom" + ], + "content": [ + { + "files": [ "**/*.yml"], + "src": "api/data_api", + "dest": "api/data_api" + }, + { + "files": [ "**/*.yml"], + "src": "api/efcore_api", + "dest": "api/efcore_api" + }, + { + "files": [ "**/*.yml"], + "src": "api/ef_api", + "dest": "api/ef_api" + }, + { + "files": [ "**/*.yml"], + "src": "api/web_api", + "dest": "api/web_api" + }, + { + "files": ["index.md","toc.yml"] + } + ], + "resource": [ + { + "files": "images/**" + } + ], + "globalMetadata": { + "_appFooter": "Copyright © 2021, 2025, Oracle and/or its affiliates.", + "_appLogoPath": "/images/logo.svg", + "_appFaviconPath": "/images/favicon.ico", + "_enableSearch": true + }, + "dest": "Output", + "markdownEngineName": "markdig", + "xrefService": [ "https://xref.docs.microsoft.com/query?uid={uid}" ] + } +} diff --git a/Documentation/help.shfbproj b/Documentation/help.shfbproj deleted file mode 100644 index bda93b7d0..000000000 --- a/Documentation/help.shfbproj +++ /dev/null @@ -1,117 +0,0 @@ - - - - - Debug - AnyCPU - 2.0 - {5c97df05-1229-4b30-9711-789d0d6ff81b} - 2015.6.5.0 - - Documentation - Documentation - Documentation - - .\Output\ - ConnectorNET - - - - - - - - - - - None - InheritedMembers, InheritedFrameworkMembers, Protected, SealedProtected - C:\Program Files (x86)\HTML Help Workshop\ - C:\Program Files (x86)\Common Files\microsoft shared\Help 2.0 Compiler\ - - - - - False - - - HtmlHelp1, MSHelpViewer - .NET Framework 4.5 - True - Reference - MySQL Connector/Net - http://www.mysql.com - Copyright &#169%3b 2004,2016 Oracle and/or its affiliates. All rights reserved. - support%40oracle.com - VS2013 - MemberName - - - - - - - - - - - Set of classes used for parsing JSON strings. - Set of classes to manage connections using X protocol. - Main set of classes for the X communication protocol. - - Set of classes for the Dev API with Hybrid MySQL technology. - Set of classes used for managing relational table operations. - Set of classes used for secure access user accounts in connections. - - - - - Oracle - 1.0.0.0 - 2 - False - Standard - Blank - False - en-US - AboveNamespaces - OnlyWarningsAndErrors - False - True - False - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Documentation/images.proj b/Documentation/images.proj deleted file mode 100644 index a05b43256..000000000 --- a/Documentation/images.proj +++ /dev/null @@ -1,178 +0,0 @@ - - - - connector-net-visual-studio-add-connection - - - connector-net-visual-studio-choose-data-source - - - connector-net-visual-studio-add-connection-dialog - - - connector-net-visual-studio-new-data-connection - - - connector-net-visual-studio-editing-new-table - - - connector-net-visual-studio-choose-table-name - - - connector-net-visual-studio-newly-created-table - - - connector-net-visual-studio-table-desginer-menu-item - - - connector-net-visual-studio-indexes-dialog - - - connector-net-visual-studio-foreign-key-relationships - - - connector-net-visual-studio-table-properties-menu - - - connector-net-visual-studio-selecting-table-properties - - - connector-net-visual-studio-views-edit-sql - - - connector-net-visual-studio-views-sql-added - - - connector-net-visual-studio-views-sql-saved - - - connector-net-visual-studio-stored-procedure-edit - - - connector-net-visual-studio-stored-procedure-saved - - - connector-net-website-config-tool - - - connector-net-website-config-tool-membership - - - connector-net-website-config-tool-string-editor - - - connector-net-website-config-tool-options - - - connector-net-website-config-tool-roles - - - connector-net-website-config-tool-profiles - - - connector-net-website-config-tool-session-state - - - connector-net-website-config-tool-tables - - - connector-net-sql-editor-new-file-dialog - - - connector-net-sql-editor-query - - - connector-net-ddl-t4-ef-properties - - - connector-net-ddl-t4-ef-generate - - - connector-net-tutorials-1 - - - connector-net-tutorials-authentication-type - - - connector-net-tutorials-select-provider - - - connector-net-tutorials-tables - - - connector-net-tutorials-security-tab - - - connector-net-tutorials-create-user - - - connector-net-tutorials-users-roles-tables - - - connector-net-tutorials-asp-provider-profile-simple-app - - - connector-net-visual-studio-entity-framework-add-entity-data-model - - - connector-net-visual-studio-entity-framework-entity-data-model-wizard-1 - - - connector-net-visual-studio-entity-framework-entity-data-model-wizard-2 - - - connector-net-visual-studio-entity-framework-entity-data-model-wizard-3 - - - connector-net-visual-studio-entity-framework-entity-data-model-diagram - - - connector-net-visual-studio-entity-framework-data-source-configuration-wizard-1 - - - connector-net-visual-studio-entity-framework-data-source-configuration-wizard-2 - - - connector-net-visual-studio-entity-framework-data-source-configuration-wizard-3 - - - connector-net-visual-studio-entity-framework-data-sources - - - connector-net-visual-studio-entity-framework-data-form-design - - - connector-net-visual-studio-entity-framework-form-add-code - - - connector-net-visual-studio-entity-framework-app-running-1 - - - connector-net-visual-studio-entity-framework-save-enabled - - - connector-net-visual-studio-entity-framework-form-add-code-save - - - connector-net-visual-studio-entity-framework-tutorial-linq-1 - - - connector-net-visual-studio-entity-framework-tutorial-linq-2 - - - connector-net-visual-studio-entity-framework-tutorial-linq-3 - - - connector-net-visual-studio-entity-framework-tutorial-linq-4 - - - connector-net-visual-studio-entity-framework-tutorial-linq-5 - - - connector-net-visual-studio-entity-framework-tutorial-linq-6 - - - connector-net-visual-studio-entity-framework-tutorial-linq-7 - - - \ No newline at end of file diff --git a/Documentation/images/favicon.ico b/Documentation/images/favicon.ico new file mode 100644 index 000000000..34d65bbe2 Binary files /dev/null and b/Documentation/images/favicon.ico differ diff --git a/Documentation/images/logo.svg b/Documentation/images/logo.svg new file mode 100644 index 000000000..7b89752ae --- /dev/null +++ b/Documentation/images/logo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/Documentation/index.md b/Documentation/index.md new file mode 100644 index 000000000..8fed932d0 --- /dev/null +++ b/Documentation/index.md @@ -0,0 +1,46 @@ +## MySQL Connector/NET and X DevAPI + +MySQL Connector/NET 9.4 supports X Protocol, which enables you to use X DevAPI with the .NET language of choice to develop applications that communicate with a MySQL server functioning as a document store, relational database, or both. + +To get started, review the following main classes: + +* [MySQLX](api/data_api/MySqlX.XDevAPI.MySQLX.yml): Features static methods for creating sessions using the X Protocol. +* [Session](api/data_api/MySqlX.XDevAPI.Session.yml): Represents a server session. +* [DbDoc](api/data_api/MySqlX.XDevAPI.DbDoc.yml): Represents a generic document. +* [Collection](api/data_api/MySqlX.XDevAPI.Collection.yml): Represents a collection of documents. +* [Schema](api/data_api/MySqlX.XDevAPI.Schema.yml): Represents a schema or database. +* [Result](api/data_api/MySqlX.XDevAPI.Common.Result.yml): Represents a general statement result. +* [DocResult](api/data_api/MySqlX.XDevAPI.CRUD.DocResult.yml): Represents the result of an operation that includes a collection of documents. + +For an introduction to X DevAPI concepts, see the [X DevAPI User Guide](https://dev.mysql.com/doc/x-devapi-userguide/en/). For general information about MySQL Connector/NET, see the [MySQL Connector/NET Developer Guide](https://dev.mysql.com/doc/connector-net/en/). + +## MySQL Connector/NET + +MySQL Connector/NET 9.4 also supports the development of .NET, .NET Core and .NET Framework applications that require secure, high-performance data connectivity with MySQL through the classic protocol. It supports ADO.NET, Entity Framework and various web providers. + +To get started, review the following main classes: + +* [MySqlConnection](api/data_api/MySql.Data.MySqlClient.MySqlConnection.yml): Represents an open connection to a MySQL database. +* [MySqlConnectionStringBuilder](api/data_api/MySql.Data.MySqlClient.MySqlConnectionStringBuilder.yml): Aids in the creation of a connection string by exposing the connection options as properties. +* [MySqlCommand](api/data_api/MySql.Data.MySqlClient.MySqlCommand.yml): Represents an SQL statement to execute against a MySQL database. +* [MySqlCommandBuilder](api/data_api/MySql.Data.MySqlClient.MySqlCommandBuilder.yml): Automatically generates single-table commands used to reconcile changes made to a DataSet object with the associated MySQL database. +* [MySqlDataAdapter](api/data_api/MySql.Data.MySqlClient.MySqlDataAdapter.yml): Represents a set of data commands and a database connection that are used to fill a data set and update a MySQL database. +* [MySqlDataReader](api/data_api/MySql.Data.MySqlClient.MySqlDataReader.yml): Provides a means of reading a forward-only stream of rows from a MySQL database. +* [MySqlException](api/data_api/MySql.Data.MySqlClient.MySqlException.yml): The exception that is thrown when MySQL returns an error. +* [MySqlHelper](api/data_api/MySql.Data.MySqlClient.MySqlHelper.yml): Helper class that makes it easier to work with the provider. +* [MySqlTransaction](api/data_api/MySql.Data.MySqlClient.MySqlTransaction.yml): Represents an SQL transaction to be made in a MySQL database. +* [MySQLMembershipProvider](api/web_api/MySql.Web.Security.MySQLMembershipProvider.yml): Manages storage of membership information for an ASP.NET application in a MySQL database. +* [MySQLRoleProvider](api/web_api/MySql.Web.Security.MySQLRoleProvider.yml): Manages storage of role membership information for an ASP.NET application in a MySQL database. +* [MySqlEFConfiguration](api/ef_api/MySql.Data.EntityFramework.MySqlEFConfiguration.yml): Adds the dependency resolvers for MySQL classes. +* [MySqlExecutionStrategy](api/ef_api/MySql.Data.EntityFramework.MySqlExecutionStrategy.yml): Enables automatic recovery from transient connection failures. + +For additional information about MySQL Connector/NET, see the [MySQL Connector/NET Developer Guide](https://dev.mysql.com/doc/connector-net/en/). + +### Additional Resources + +* [MySQL](http://www.mysql.com/) +* [Discussion Forum](https://forums.mysql.com/list.php?38) +* [MySql Bugs database](https://bugs.mysql.com) +* For more information about this and other MySQL products, please visit [MySQL Contact & Questions](http://www.mysql.com/about/contact/). + +[![Twitter Follow](https://img.shields.io/twitter/follow/MySQL.svg?label=Follow%20%40MySQL&style=social)](https://twitter.com/intent/follow?screen_name=MySQL) \ No newline at end of file diff --git a/Documentation/templates/custom/partials/class.header.tmpl.partial b/Documentation/templates/custom/partials/class.header.tmpl.partial new file mode 100644 index 000000000..f545c2864 --- /dev/null +++ b/Documentation/templates/custom/partials/class.header.tmpl.partial @@ -0,0 +1,103 @@ +

{{>partials/title}}

+
{{{summary}}}
+
{{{conceptual}}}
+{{#inClass}} +
+
{{__global.inheritance}}
+ {{#inheritance}} +
{{{specName.0.value}}}
+ {{/inheritance}} +
{{name.0.value}}
+ {{#derivedClasses}} +
{{{specName.0.value}}}
+ {{/derivedClasses}} +
+{{/inClass}} +{{#implements.0}} +
+
{{__global.implements}}
+{{/implements.0}} +{{#implements}} +
{{{specName.0.value}}}
+{{/implements}} +{{#implements.0}} +
+{{/implements.0}} +
{{__global.namespace}}: {{{namespace.specName.0.value}}}
+
{{__global.assembly}}: {{assemblies.0}}.dll
+
Version: 9.4.0
+
{{__global.syntax}}
+
+
{{syntax.content.0.value}}
+
+{{#syntax.parameters.0}} +
{{__global.parameters}}
+ + + + + + + + + +{{/syntax.parameters.0}} +{{#syntax.parameters}} + + + + + +{{/syntax.parameters}} +{{#syntax.parameters.0}} + +
{{__global.type}}{{__global.name}}{{__global.description}}
{{{type.specName.0.value}}}{{{id}}}{{{description}}}
+{{/syntax.parameters.0}} +{{#syntax.return}} +
{{__global.returns}}
+ + + + + + + + + + + + + +
{{__global.type}}{{__global.description}}
{{{type.specName.0.value}}}{{{description}}}
+{{/syntax.return}} +{{#syntax.typeParameters.0}} +
{{__global.typeParameters}}
+ + + + + + + + +{{/syntax.typeParameters.0}} +{{#syntax.typeParameters}} + + + + +{{/syntax.typeParameters}} +{{#syntax.typeParameters.0}} + +
{{__global.name}}{{__global.description}}
{{{id}}}{{{description}}}
+{{/syntax.typeParameters.0}} +{{#remarks}} +
{{__global.remarks}}
+
{{{remarks}}}
+{{/remarks}} +{{#example.0}} +
{{__global.examples}}
+{{/example.0}} +{{#example}} +{{{.}}} +{{/example}} diff --git a/Documentation/toc.yml b/Documentation/toc.yml new file mode 100644 index 000000000..14afda7ec --- /dev/null +++ b/Documentation/toc.yml @@ -0,0 +1,10 @@ +- name: Overview + href: index.md +- name: MySQL Data + href: api/data_api/ +- name: MySQL Entity Framework + href: api/ef_api/ +- name: MySQL Entity Framework Core + href: api/efcore_api/ +- name: MySQL Web + href: api/web_api/ \ No newline at end of file diff --git a/EFCore/MySql.EntityFrameworkCore.sln b/EFCore/MySql.EntityFrameworkCore.sln new file mode 100644 index 000000000..45cf91c73 --- /dev/null +++ b/EFCore/MySql.EntityFrameworkCore.sln @@ -0,0 +1,49 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.2.32602.215 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MySql.EntityFrameworkCore", "src\MySql.EntityFrameworkCore.csproj", "{CF32BC56-91C7-44F0-8F40-1CAE269CEDA7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MySql.Data", "..\MySQL.Data\src\MySql.Data.csproj", "{E4ADB07E-0145-4327-8F60-F7F59942B418}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MySql.EntityFrameworkCore.Basic.Tests", "tests\MySql.EFCore.Basic.Tests\MySql.EntityFrameworkCore.Basic.Tests.csproj", "{E57F1457-5607-4869-8B76-5408050E251D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MySql.EntityFrameworkCore.Design.Tests", "tests\MySql.EFCore.Design.Tests\MySql.EntityFrameworkCore.Design.Tests.csproj", "{419C9E25-7B75-49BB-9245-062A6F13AE05}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MySql.EntityFrameworkCore.Migrations.Tests", "tests\MySql.EFCore.Migrations.Tests\MySql.EntityFrameworkCore.Migrations.Tests.csproj", "{4AE0A3AA-F687-4DAC-AE1F-12BE6F55C4F3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {CF32BC56-91C7-44F0-8F40-1CAE269CEDA7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CF32BC56-91C7-44F0-8F40-1CAE269CEDA7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CF32BC56-91C7-44F0-8F40-1CAE269CEDA7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CF32BC56-91C7-44F0-8F40-1CAE269CEDA7}.Release|Any CPU.Build.0 = Release|Any CPU + {E4ADB07E-0145-4327-8F60-F7F59942B418}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E4ADB07E-0145-4327-8F60-F7F59942B418}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E4ADB07E-0145-4327-8F60-F7F59942B418}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E4ADB07E-0145-4327-8F60-F7F59942B418}.Release|Any CPU.Build.0 = Release|Any CPU + {E57F1457-5607-4869-8B76-5408050E251D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E57F1457-5607-4869-8B76-5408050E251D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E57F1457-5607-4869-8B76-5408050E251D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E57F1457-5607-4869-8B76-5408050E251D}.Release|Any CPU.Build.0 = Release|Any CPU + {419C9E25-7B75-49BB-9245-062A6F13AE05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {419C9E25-7B75-49BB-9245-062A6F13AE05}.Debug|Any CPU.Build.0 = Debug|Any CPU + {419C9E25-7B75-49BB-9245-062A6F13AE05}.Release|Any CPU.ActiveCfg = Release|Any CPU + {419C9E25-7B75-49BB-9245-062A6F13AE05}.Release|Any CPU.Build.0 = Release|Any CPU + {4AE0A3AA-F687-4DAC-AE1F-12BE6F55C4F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4AE0A3AA-F687-4DAC-AE1F-12BE6F55C4F3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4AE0A3AA-F687-4DAC-AE1F-12BE6F55C4F3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4AE0A3AA-F687-4DAC-AE1F-12BE6F55C4F3}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {644F4452-6117-4BBC-8683-F5B86A8E5203} + EndGlobalSection +EndGlobal diff --git a/EFCore/src/DataAnnotations/MySQLCharsetAttribute.cs b/EFCore/src/DataAnnotations/MySQLCharsetAttribute.cs new file mode 100644 index 000000000..6541f6d5e --- /dev/null +++ b/EFCore/src/DataAnnotations/MySQLCharsetAttribute.cs @@ -0,0 +1,53 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; + +namespace MySql.EntityFrameworkCore.DataAnnotations +{ + /// + /// Establishes the character set of an entity property. + /// + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field)] + public class MySQLCharsetAttribute : Attribute + { + /// + /// Character set to use for the attribute. + /// + public string Charset { get; } + + /// + /// Initializes a new instance of the class. + /// + /// Character set to use. + public MySQLCharsetAttribute([NotNull] string charset) : base() + { + this.Charset = charset; + } + } +} diff --git a/EFCore/src/DataAnnotations/MySQLCollationAttribute.cs b/EFCore/src/DataAnnotations/MySQLCollationAttribute.cs new file mode 100644 index 000000000..53cdb1bb8 --- /dev/null +++ b/EFCore/src/DataAnnotations/MySQLCollationAttribute.cs @@ -0,0 +1,53 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; + +namespace MySql.EntityFrameworkCore.DataAnnotations +{ + /// + /// Sets the collation in an entity property. + /// + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field)] + public class MySQLCollationAttribute : Attribute + { + /// + /// Collation set in the attribute. + /// + public string Collation { get; } + + /// + /// Initializes a new instance of the class. + /// + /// Collation to use. + public MySQLCollationAttribute([NotNull] string collation) + { + Collation = collation; + } + } +} diff --git a/EFCore/src/Design/Internal/MySQLAnnotationCodeGenerator.cs b/EFCore/src/Design/Internal/MySQLAnnotationCodeGenerator.cs new file mode 100644 index 000000000..4fce96898 --- /dev/null +++ b/EFCore/src/Design/Internal/MySQLAnnotationCodeGenerator.cs @@ -0,0 +1,125 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using MySql.EntityFrameworkCore.Extensions; +using MySql.EntityFrameworkCore.Metadata.Internal; +using MySql.EntityFrameworkCore.Utils; +using System.Reflection; + +namespace MySql.EntityFrameworkCore.Design.Internal +{ + internal class MySQLAnnotationCodeGenerator : AnnotationCodeGenerator + { + private static readonly MethodInfo _modelHasCharSetMethodInfo + = typeof(MySQLModelBuilderExtensions).GetRequiredRuntimeMethod( + nameof(MySQLModelBuilderExtensions.HasCharSet), + typeof(ModelBuilder), + typeof(string)); + + private static readonly MethodInfo _modelUseCollationMethodInfo + = typeof(MySQLModelBuilderExtensions).GetRequiredRuntimeMethod( + nameof(MySQLModelBuilderExtensions.UseCollation), + typeof(ModelBuilder), typeof(string)); + + private static readonly MethodInfo _entityTypeHasCharSetMethodInfo + = typeof(MySQLEntityTypeBuilderExtensions).GetRequiredRuntimeMethod( + nameof(MySQLEntityTypeBuilderExtensions.HasCharSet), + typeof(EntityTypeBuilder), + typeof(string)); + + private static readonly MethodInfo _entityTypeUseCollationMethodInfo + = typeof(MySQLEntityTypeBuilderExtensions).GetRequiredRuntimeMethod( + nameof(MySQLEntityTypeBuilderExtensions.UseCollation), + typeof(EntityTypeBuilder), + typeof(string)); + + private static readonly MethodInfo _propertyHasCharSetMethodInfo + = typeof(MySQLPropertyBuilderExtensions).GetRequiredRuntimeMethod( + nameof(MySQLPropertyBuilderExtensions.ForMySQLHasCharset), + typeof(PropertyBuilder), + typeof(string)); + + private static readonly MethodInfo _propertyHasCollationMethodInfo + = typeof(MySQLPropertyBuilderExtensions).GetRequiredRuntimeMethod( + nameof(MySQLPropertyBuilderExtensions.ForMySQLHasCollation), + typeof(PropertyBuilder), + typeof(string)); + + public MySQLAnnotationCodeGenerator([NotNull] AnnotationCodeGeneratorDependencies dependencies) + : base(dependencies) + { + } + + protected override bool IsHandledByConvention(IModel model, IAnnotation annotation) + { + return true; + } + + protected override MethodCallCodeFragment? GenerateFluentApi(IModel model, IAnnotation annotation) + { + if (annotation.Name == MySQLAnnotationNames.Charset) + return new MethodCallCodeFragment(_modelHasCharSetMethodInfo, annotation.Value); + + // EF Core currently just falls back on using the `Relational:Collation` annotation instead of generating the `UseCollation()` + // method call (though it could), so we can return our method call fragment here, without generating an ugly duplicate. + if (annotation.Name == RelationalAnnotationNames.Collation) + return new MethodCallCodeFragment(_modelUseCollationMethodInfo, annotation.Value); + + return null; + } + + protected override MethodCallCodeFragment? GenerateFluentApi(IEntityType entityType, IAnnotation annotation) + { + if (annotation.Name == MySQLAnnotationNames.Charset) + return new MethodCallCodeFragment(_entityTypeHasCharSetMethodInfo, annotation.Value); + + if (annotation.Name == RelationalAnnotationNames.Collation) + return new MethodCallCodeFragment(_entityTypeUseCollationMethodInfo, annotation.Value); + + return null; + } + + public static MethodCallCodeFragment? GenFluentApi(IProperty property, IAnnotation annotation) + { + Check.NotNull(property, nameof(property)); + Check.NotNull(annotation, nameof(annotation)); + + return annotation.Name switch + { + MySQLAnnotationNames.Charset when annotation.Value is string { Length: > 0 } charSet => new MethodCallCodeFragment(_propertyHasCharSetMethodInfo, charSet), + MySQLAnnotationNames.Collation when annotation.Value is string { Length: > 0 } collation => new MethodCallCodeFragment(_propertyHasCollationMethodInfo, collation), + _ => null, + }; + } + } +} diff --git a/EFCore/src/Design/Internal/MySQLDesignTimeServices.cs b/EFCore/src/Design/Internal/MySQLDesignTimeServices.cs new file mode 100644 index 000000000..30389cea5 --- /dev/null +++ b/EFCore/src/Design/Internal/MySQLDesignTimeServices.cs @@ -0,0 +1,49 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Design; +using Microsoft.EntityFrameworkCore.Scaffolding; +using Microsoft.Extensions.DependencyInjection; +using MySql.EntityFrameworkCore.Extensions; +using MySql.EntityFrameworkCore.Scaffolding.Internal; + +namespace MySql.EntityFrameworkCore.Design.Internal +{ + internal class MySQLDesignTimeServices : IDesignTimeServices + { + public void ConfigureDesignTimeServices(IServiceCollection serviceCollection) + { + serviceCollection.AddEntityFrameworkMySQL(); + new EntityFrameworkRelationalDesignServicesBuilder(serviceCollection) + .TryAdd() + .TryAdd() + .TryAdd() + .TryAddCoreServices(); + } + } +} diff --git a/EFCore/src/Diagnostics/Internal/MySQLLoggingDefinitions.cs b/EFCore/src/Diagnostics/Internal/MySQLLoggingDefinitions.cs new file mode 100644 index 000000000..6ac04605a --- /dev/null +++ b/EFCore/src/Diagnostics/Internal/MySQLLoggingDefinitions.cs @@ -0,0 +1,67 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Diagnostics; + +namespace MySql.EntityFrameworkCore.Diagnostics.Internal +{ + internal class MySQLLoggingDefinitions : RelationalLoggingDefinitions + { + public EventDefinitionBase? LogDefaultDecimalTypeColumn; + + public EventDefinitionBase? LogByteIdentityColumn; + + public EventDefinitionBase? LogFoundDefaultSchema; + + public EventDefinitionBase? LogFoundTypeAlias; + + public EventDefinitionBase? LogFoundColumn; + + public EventDefinitionBase? LogFoundForeignKey; + + public EventDefinitionBase? LogPrincipalTableNotInSelectionSet; + + public EventDefinitionBase? LogMissingSchema; + + public EventDefinitionBase? LogMissingTable; + + public EventDefinitionBase? LogFoundSequence; + + public EventDefinitionBase? LogFoundTable; + + public EventDefinitionBase? LogFoundIndex; + + public EventDefinitionBase? LogFoundPrimaryKey; + + public EventDefinitionBase? LogFoundUniqueConstraint; + + public EventDefinitionBase? LogPrincipalColumnNotFound; + + public EventDefinitionBase? LogReflexiveConstraintIgnored; + } +} diff --git a/EFCore/src/Diagnostics/MySQLEventId.cs b/EFCore/src/Diagnostics/MySQLEventId.cs new file mode 100644 index 000000000..e2a639ea6 --- /dev/null +++ b/EFCore/src/Diagnostics/MySQLEventId.cs @@ -0,0 +1,190 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.Extensions.Logging; +using System.Diagnostics; + +namespace MySql.EntityFrameworkCore.Diagnostics +{ + /// + /// + /// Event IDs for MySQL events that correspond to messages logged to an + /// and events sent to a . + /// + /// + /// These IDs are also used with to configure the + /// behavior of warnings. + /// + /// + public static class MySQLEventId + { + // Warning: These values must not change between releases. + // Only add new values to the end of sections, never in the middle. + // Try to use naming and be consistent with existing names. + private enum Id + { + // Model validation events + DecimalTypeDefaultWarning = CoreEventId.ProviderBaseId, + ByteIdentityColumnWarning, + + // Scaffolding events + ColumnFound = CoreEventId.ProviderDesignBaseId, + DefaultSchemaFound, + ForeignKeyReferencesMissingPrincipalTableWarning, + MissingSchemaWarning, + MissingTableWarning, + SequenceFound, + TableFound, + TypeAliasFound, + PrimaryKeyFound, + UniqueConstraintFound, + IndexFound, + ForeignKeyFound, + ForeignKeyPrincipalColumnMissingWarning, + ReflexiveConstraintIgnored + } + + private static readonly string _validationPrefix = DbLoggerCategory.Model.Validation.Name + "."; + private static EventId MakeValidationId(Id id) => new EventId((int)id, _validationPrefix + id); + + /// + /// + /// No explicit type for a decimal column. + /// + /// + /// This event is in the category. + /// + /// + /// This event uses the payload when used with a . + /// + /// + public static readonly EventId DecimalTypeDefaultWarning = MakeValidationId(Id.DecimalTypeDefaultWarning); + + /// + /// + /// A byte property is set up to use a MySQL identity column. + /// + /// + /// This event is in the category. + /// + /// + /// This event uses the payload when used with a . + /// + /// + public static readonly EventId ByteIdentityColumnWarning = MakeValidationId(Id.ByteIdentityColumnWarning); + + private static readonly string _scaffoldingPrefix = DbLoggerCategory.Scaffolding.Name + "."; + private static EventId MakeScaffoldingId(Id id) => new EventId((int)id, _scaffoldingPrefix + id); + + /// + /// A column was found. + /// This event is in the category. + /// + public static readonly EventId ColumnFound = MakeScaffoldingId(Id.ColumnFound); + + /// + /// A default schema was found. + /// This event is in the category. + /// + public static readonly EventId DefaultSchemaFound = MakeScaffoldingId(Id.DefaultSchemaFound); + + /// + /// A type alias was found. + /// This event is in the category. + /// + public static readonly EventId TypeAliasFound = MakeScaffoldingId(Id.TypeAliasFound); + + /// + /// The database is missing a schema. + /// This event is in the category. + /// + public static readonly EventId MissingSchemaWarning = MakeScaffoldingId(Id.MissingSchemaWarning); + + /// + /// The database is missing a table. + /// This event is in the category. + /// + public static readonly EventId MissingTableWarning = MakeScaffoldingId(Id.MissingTableWarning); + + /// + /// A foreign key references a missing table at the principal end. + /// This event is in the category. + /// + public static readonly EventId ForeignKeyReferencesMissingPrincipalTableWarning = MakeScaffoldingId(Id.ForeignKeyReferencesMissingPrincipalTableWarning); + + /// + /// A table was found. + /// This event is in the category. + /// + public static readonly EventId TableFound = MakeScaffoldingId(Id.TableFound); + + /// + /// A sequence was found. + /// This event is in the category. + /// + public static readonly EventId SequenceFound = MakeScaffoldingId(Id.SequenceFound); + + /// + /// Primary key was found. + /// This event is in the category. + /// + public static readonly EventId PrimaryKeyFound = MakeScaffoldingId(Id.PrimaryKeyFound); + + /// + /// An unique constraint was found. + /// This event is in the category. + /// + public static readonly EventId UniqueConstraintFound = MakeScaffoldingId(Id.UniqueConstraintFound); + + /// + /// An index was found. + /// This event is in the category. + /// + public static readonly EventId IndexFound = MakeScaffoldingId(Id.IndexFound); + + /// + /// A foreign key was found. + /// This event is in the category. + /// + public static readonly EventId ForeignKeyFound = MakeScaffoldingId(Id.ForeignKeyFound); + + /// + /// A principal column referenced by a foreign key was not found. + /// This event is in the category. + /// + public static readonly EventId ForeignKeyPrincipalColumnMissingWarning = MakeScaffoldingId(Id.ForeignKeyPrincipalColumnMissingWarning); + + /// + /// A reflexive foreign key constraint was skipped. + /// This event is in the category. + /// + public static readonly EventId ReflexiveConstraintIgnored = MakeScaffoldingId(Id.ReflexiveConstraintIgnored); + } +} diff --git a/EFCore/src/Extensions/MySQLDatabaseFacadeExtensions.cs b/EFCore/src/Extensions/MySQLDatabaseFacadeExtensions.cs new file mode 100644 index 000000000..43f02dfe9 --- /dev/null +++ b/EFCore/src/Extensions/MySQLDatabaseFacadeExtensions.cs @@ -0,0 +1,60 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using MySql.EntityFrameworkCore.Infrastructure.Internal; +using System; +using System.Reflection; + +namespace MySql.EntityFrameworkCore.Extensions +{ + /// + /// MySQL specific extension methods for . + /// + public static class MySQLDatabaseFacadeExtensions + { + /// + /// + /// Indicates whether the database provider currently in use is the MySQL provider. + /// + /// + /// This method can only be used after the has been configured because + /// it is only then that the provider is known. This method cannot be used + /// in because this is where application code sets the + /// provider to use as part of configuring the context. + /// + /// + /// The facade from . + /// if MySQL is being used; otherwise, . + public static bool IsMySql(this DatabaseFacade database) + => database.ProviderName!.Equals( + typeof(MySQLOptionsExtension).GetTypeInfo().Assembly.GetName().Name, + StringComparison.Ordinal); + } +} diff --git a/EFCore/src/Extensions/MySQLDbContextOptionsExtensions.cs b/EFCore/src/Extensions/MySQLDbContextOptionsExtensions.cs new file mode 100644 index 000000000..9cc0b5150 --- /dev/null +++ b/EFCore/src/Extensions/MySQLDbContextOptionsExtensions.cs @@ -0,0 +1,204 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Infrastructure; +using MySql.EntityFrameworkCore.Infrastructure; +using MySql.EntityFrameworkCore.Infrastructure.Internal; +using MySql.EntityFrameworkCore.Utils; +using System; +using System.Data.Common; + +namespace Microsoft.EntityFrameworkCore +{ + /// + /// MySQL specific extension methods for . + /// + public static class MySQLDbContextOptionsExtensions + { + /// + /// + /// Configures the context to connect to a MySQL database, but without initially setting any + /// or connection string. + /// + /// + /// The connection or connection string must be set before the is used to connect + /// to a database. Set a connection using . + /// Set a connection string using . + /// + /// + /// The builder being used to configure the context. + /// An optional action to enable additional MySQL server-specific configuration. + /// The options builder so that further configuration can be chained. + public static DbContextOptionsBuilder UseMySQL( + this DbContextOptionsBuilder optionsBuilder, + Action? mySqlOptionsAction = null) + { + Check.NotNull(optionsBuilder, nameof(optionsBuilder)); + + var extension = GetOrCreateExtension(optionsBuilder); + + ((IDbContextOptionsBuilderInfrastructure)optionsBuilder).AddOrUpdateExtension(extension); + ConfigureWarnings(optionsBuilder); + mySqlOptionsAction?.Invoke(new MySQLDbContextOptionsBuilder(optionsBuilder)); + + return optionsBuilder; + } + + /// + /// Configures the context used to connect to a MySQL database. + /// + /// The builder being used to configure the context. + /// The connection string of the database to connect to. + /// An optional action to enable additional MySQL server-specific configuration. + /// The options builder so that further configuration can be chained. + public static DbContextOptionsBuilder UseMySQL( + this DbContextOptionsBuilder optionsBuilder, + string connectionString, + Action? mySqlOptionsAction = null) + { + Check.NotNull(optionsBuilder, nameof(optionsBuilder)); + Check.NotEmpty(connectionString, nameof(connectionString)); + + var extension = (MySQLOptionsExtension)GetOrCreateExtension(optionsBuilder).WithConnectionString(connectionString); + ((IDbContextOptionsBuilderInfrastructure)optionsBuilder).AddOrUpdateExtension(extension); + + ConfigureWarnings(optionsBuilder); + + mySqlOptionsAction?.Invoke(new MySQLDbContextOptionsBuilder(optionsBuilder)); + + return optionsBuilder; + } + + /// + /// Configures the context to connect to a MySQL database. + /// + /// The builder being used to configure the context. + /// + /// An existing to be used to connect to the database. If the connection is + /// in the open state, then Entity Framework (EF) will not open or close the connection. If the connection is in the closed + /// state, then EF opens and closes the connection as needed. + /// + /// An optional action to enable additional MySQL server-specific configuration. + /// The options builder so that further configuration can be chained. + public static DbContextOptionsBuilder UseMySQL(this DbContextOptionsBuilder optionsBuilder, + DbConnection connection, + Action? mySqlOptionsAction = null) + { + Check.NotNull(optionsBuilder, nameof(optionsBuilder)); + Check.NotNull(connection, nameof(connection)); + + var extension = (MySQLOptionsExtension)GetOrCreateExtension(optionsBuilder).WithConnection(connection); + ((IDbContextOptionsBuilderInfrastructure)optionsBuilder).AddOrUpdateExtension(extension); + + ConfigureWarnings(optionsBuilder); + + mySqlOptionsAction?.Invoke(new MySQLDbContextOptionsBuilder(optionsBuilder)); + + return optionsBuilder; + } + + /// + /// + /// Configures the context to connect to a MySQL database, but without initially setting any + /// or connection string. + /// + /// + /// The connection or connection string must be set before the is used to connect + /// to a database. Set a connection using . + /// Set a connection string using . + /// + /// + /// The builder being used to configure the context. + /// An optional action to enable additional MySQL server-specific configuration. + /// The options builder so that further configuration can be chained. + public static DbContextOptionsBuilder UseMySQL( + this DbContextOptionsBuilder optionsBuilder, + Action? mySqlOptionsAction = null) + where TContext : DbContext + => (DbContextOptionsBuilder)UseMySQL( + (DbContextOptionsBuilder)optionsBuilder, mySqlOptionsAction); + + /// + /// Configures the context to connect to a MySQL database. + /// + /// The type of context to be configured. + /// The builder being used to configure the context. + /// The connection string of the database to connect to. + /// An optional action to enable additional MySQL server-specific configuration. + /// The options builder so that further configuration can be chained. + public static DbContextOptionsBuilder UseMySQL( + this DbContextOptionsBuilder optionsBuilder, + string connectionString, + Action? mySqlOptionsAction = null) + where TContext : DbContext + => (DbContextOptionsBuilder)UseMySQL( + (DbContextOptionsBuilder)optionsBuilder, connectionString, mySqlOptionsAction); + + /// + /// Configures the context to connect to a MySQL database. + /// + /// The type of context to be configured. + /// The builder being used to configure the context. + /// + /// An existing to be used to connect to the database. If the connection is + /// in the open state, then Entity Framework (EF) will not open or close the connection. If the connection is in the closed + /// state, then EF will open and close the connection as needed. + /// + /// An optional action to enable additional MySQL server-specific configuration. + /// The options builder so that further configuration can be chained. + public static DbContextOptionsBuilder UseMySQL( + this DbContextOptionsBuilder optionsBuilder, + DbConnection connection, + Action? mySqlOptionsAction = null) + where TContext : DbContext + => (DbContextOptionsBuilder)UseMySQL( + (DbContextOptionsBuilder)optionsBuilder, connection, mySqlOptionsAction); + + private static MySQLOptionsExtension GetOrCreateExtension(DbContextOptionsBuilder optionsBuilder) + { + var existing = optionsBuilder.Options.FindExtension(); + return existing != null + ? new MySQLOptionsExtension(existing) + : new MySQLOptionsExtension(); + } + + private static void ConfigureWarnings(DbContextOptionsBuilder optionsBuilder) + { + var coreOptionsExtension + = optionsBuilder.Options.FindExtension() + ?? new CoreOptionsExtension(); + + coreOptionsExtension = coreOptionsExtension.WithWarningsConfiguration( + coreOptionsExtension.WarningsConfiguration.TryWithExplicit( + RelationalEventId.AmbientTransactionWarning, WarningBehavior.Throw)); + + ((IDbContextOptionsBuilderInfrastructure)optionsBuilder).AddOrUpdateExtension(coreOptionsExtension); + } + } +} diff --git a/EFCore/src/Extensions/MySQLDbFunctionsEnums.cs b/EFCore/src/Extensions/MySQLDbFunctionsEnums.cs new file mode 100644 index 000000000..48e224773 --- /dev/null +++ b/EFCore/src/Extensions/MySQLDbFunctionsEnums.cs @@ -0,0 +1,51 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySql.EntityFrameworkCore.Extensions +{ + /// + /// Types of search to perform. + /// + public enum MySQLMatchSearchMode + { + /// + /// Performs a natural language search for a string against a text collection. + /// + NaturalLanguage = 0, + + /// + /// Performs a natural language search with query expansion for a string against a text collection. + /// + NaturalLanguageWithQueryExpansion = 1, + + /// + /// Performs a boolean search for a string against a text collection. + /// + Boolean = 2, + } +} diff --git a/EFCore/src/Extensions/MySQLDbFunctionsExtensions.cs b/EFCore/src/Extensions/MySQLDbFunctionsExtensions.cs new file mode 100644 index 000000000..6cc956262 --- /dev/null +++ b/EFCore/src/Extensions/MySQLDbFunctionsExtensions.cs @@ -0,0 +1,660 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using System; +using System.Globalization; + +namespace MySql.EntityFrameworkCore.Extensions +{ + /// + /// Provides CLR methods that are translated to database functions when used in a LINQ to Entities queries. + /// The methods in this class are accessed with . + /// + public static class MySQLDbFunctionsExtensions + { + /// + /// Counts the number of year boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(YEAR,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of year boundaries crossed between the dates. + public static int DateDiffYear( + [CanBeNull] this DbFunctions _, + DateTime startDate, + DateTime endDate) + => endDate.Year - startDate.Year; + + /// + /// Counts the number of year boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(YEAR,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of year boundaries crossed between the dates. + public static int? DateDiffYear( + [CanBeNull] this DbFunctions _, + DateTime? startDate, + DateTime? endDate) + => (startDate.HasValue && endDate.HasValue) + ? (int?)DateDiffYear(_, startDate.Value, endDate.Value) + : null; + + /// + /// Counts the number of year boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(YEAR,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of year boundaries crossed between the dates. + public static int DateDiffYear( + [CanBeNull] this DbFunctions _, + DateTimeOffset startDate, + DateTimeOffset endDate) + => DateDiffYear(_, startDate.UtcDateTime, endDate.UtcDateTime); + + /// + /// Counts the number of year boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(YEAR,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of year boundaries crossed between the dates. + public static int? DateDiffYear( + [CanBeNull] this DbFunctions _, + DateTimeOffset? startDate, + DateTimeOffset? endDate) + => (startDate.HasValue && endDate.HasValue) + ? (int?)DateDiffYear(_, startDate.Value, endDate.Value) + : null; + + /// + /// Counts the number of year boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(YEAR,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of year boundaries crossed between the dates. + public static int DateDiffYear( + [CanBeNull] this DbFunctions _, + DateOnly startDate, + DateOnly endDate) + => endDate.Year - startDate.Year; + + /// + /// Counts the number of year boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(YEAR,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of year boundaries crossed between the dates. + public static int? DateDiffYear( + [CanBeNull] this DbFunctions _, + DateOnly? startDate, + DateOnly? endDate) + => (startDate.HasValue && endDate.HasValue) + ? (int?)DateDiffYear(_, startDate.Value, endDate.Value) + : null; + + /// + /// Counts the number of month boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(MONTH,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of month boundaries crossed between the dates. + public static int DateDiffMonth( + [CanBeNull] this DbFunctions _, + DateTime startDate, + DateTime endDate) + => 12 * (endDate.Year - startDate.Year) + endDate.Month - startDate.Month; + + /// + /// Counts the number of month boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(MONTH,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of month boundaries crossed between the dates. + public static int? DateDiffMonth( + [CanBeNull] this DbFunctions _, + DateTime? startDate, + DateTime? endDate) + => (startDate.HasValue && endDate.HasValue) + ? (int?)DateDiffMonth(_, startDate.Value, endDate.Value) + : null; + + /// + /// Counts the number of month boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(MONTH,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of month boundaries crossed between the dates. + public static int DateDiffMonth( + [CanBeNull] this DbFunctions _, + DateTimeOffset startDate, + DateTimeOffset endDate) + => DateDiffMonth(_, startDate.UtcDateTime, endDate.UtcDateTime); + + /// + /// Counts the number of month boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(MONTH,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of month boundaries crossed between the dates. + public static int? DateDiffMonth( + [CanBeNull] this DbFunctions _, + DateTimeOffset? startDate, + DateTimeOffset? endDate) + => (startDate.HasValue && endDate.HasValue) + ? (int?)DateDiffMonth(_, startDate.Value, endDate.Value) + : null; + + /// + /// Counts the number of month boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(MONTH,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of month boundaries crossed between the dates. + public static int DateDiffMonth( + [CanBeNull] this DbFunctions _, + DateOnly startDate, + DateOnly endDate) + => 12 * (endDate.Year - startDate.Year) + endDate.Month - startDate.Month; + + /// + /// Counts the number of month boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(MONTH,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of month boundaries crossed between the dates. + public static int? DateDiffMonth( + [CanBeNull] this DbFunctions _, + DateOnly? startDate, + DateOnly? endDate) + => (startDate.HasValue && endDate.HasValue) + ? (int?)DateDiffMonth(_, startDate.Value, endDate.Value) + : null; + + /// + /// Counts the number of day boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(DAY,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of day boundaries crossed between the dates. + public static int DateDiffDay( + [CanBeNull] this DbFunctions _, + DateTime startDate, + DateTime endDate) + => (endDate.Date - startDate.Date).Days; + + /// + /// Counts the number of day boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(DAY,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of day boundaries crossed between the dates. + public static int? DateDiffDay( + [CanBeNull] this DbFunctions _, + DateTime? startDate, + DateTime? endDate) + => (startDate.HasValue && endDate.HasValue) + ? (int?)DateDiffDay(_, startDate.Value, endDate.Value) + : null; + + /// + /// Counts the number of day boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(DAY,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of day boundaries crossed between the dates. + public static int DateDiffDay( + [CanBeNull] this DbFunctions _, + DateTimeOffset startDate, + DateTimeOffset endDate) + => DateDiffDay(_, startDate.UtcDateTime, endDate.UtcDateTime); + + /// + /// Counts the number of day boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(DAY,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of day boundaries crossed between the dates. + public static int? DateDiffDay( + [CanBeNull] this DbFunctions _, + DateTimeOffset? startDate, + DateTimeOffset? endDate) + => (startDate.HasValue && endDate.HasValue) + ? (int?)DateDiffDay(_, startDate.Value, endDate.Value) + : null; + + /// + /// Counts the number of day boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(DAY,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of day boundaries crossed between the dates. + public static int DateDiffDay( + [CanBeNull] this DbFunctions _, + DateOnly startDate, + DateOnly endDate) + => endDate.Day - startDate.Day; + + /// + /// Counts the number of day boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(DAY,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of day boundaries crossed between the dates. + public static int? DateDiffDay( + [CanBeNull] this DbFunctions _, + DateOnly? startDate, + DateOnly? endDate) + => (startDate.HasValue && endDate.HasValue) + ? (int?)DateDiffDay(_, startDate.Value, endDate.Value) + : null; + + /// + /// Counts the number of hour boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(HOUR,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of hour boundaries crossed between the dates. + public static int DateDiffHour( + [CanBeNull] this DbFunctions _, + DateTime startDate, + DateTime endDate) + { + checked + { + return DateDiffDay(_, startDate, endDate) * 24 + endDate.Hour - startDate.Hour; + } + } + + /// + /// Counts the number of hour boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(HOUR,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of hour boundaries crossed between the dates. + public static int? DateDiffHour( + [CanBeNull] this DbFunctions _, + DateTime? startDate, + DateTime? endDate) + => (startDate.HasValue && endDate.HasValue) + ? (int?)DateDiffHour(_, startDate.Value, endDate.Value) + : null; + + /// + /// Counts the number of hour boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(HOUR,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of hour boundaries crossed between the dates. + public static int DateDiffHour( + [CanBeNull] this DbFunctions _, + DateTimeOffset startDate, + DateTimeOffset endDate) + => DateDiffHour(_, startDate.UtcDateTime, endDate.UtcDateTime); + + /// + /// Counts the number of hour boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(HOUR,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of hour boundaries crossed between the dates. + public static int? DateDiffHour( + [CanBeNull] this DbFunctions _, + DateTimeOffset? startDate, + DateTimeOffset? endDate) + => (startDate.HasValue && endDate.HasValue) + ? (int?)DateDiffHour(_, startDate.Value, endDate.Value) + : null; + + /// + /// Counts the number of minute boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(MINUTE,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of minute boundaries crossed between the dates. + public static int DateDiffMinute( + [CanBeNull] this DbFunctions _, + DateTime startDate, + DateTime endDate) + { + checked + { + return DateDiffHour(_, startDate, endDate) * 60 + endDate.Minute - startDate.Minute; + } + } + + /// + /// Counts the number of minute boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(MINUTE,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of minute boundaries crossed between the dates. + public static int? DateDiffMinute( + [CanBeNull] this DbFunctions _, + DateTime? startDate, + DateTime? endDate) + => (startDate.HasValue && endDate.HasValue) + ? (int?)DateDiffMinute(_, startDate.Value, endDate.Value) + : null; + + /// + /// Counts the number of minute boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(MINUTE,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of minute boundaries crossed between the dates. + public static int DateDiffMinute( + [CanBeNull] this DbFunctions _, + DateTimeOffset startDate, + DateTimeOffset endDate) + => DateDiffMinute(_, startDate.UtcDateTime, endDate.UtcDateTime); + + /// + /// Counts the number of minute boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(MINUTE,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of minute boundaries crossed between the dates. + public static int? DateDiffMinute( + [CanBeNull] this DbFunctions _, + DateTimeOffset? startDate, + DateTimeOffset? endDate) + => (startDate.HasValue && endDate.HasValue) + ? (int?)DateDiffMinute(_, startDate.Value, endDate.Value) + : null; + + /// + /// Counts the number of boundaries (in seconds) crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(SECOND,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of boundaries (in seconds) crossed between the dates. + public static int DateDiffSecond( + [CanBeNull] this DbFunctions _, + DateTime startDate, + DateTime endDate) + { + checked + { + return DateDiffMinute(_, startDate, endDate) * 60 + endDate.Second - startDate.Second; + } + } + + /// + /// Counts the number of boundaries (in seconds) crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(SECOND,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of boundaries (in seconds) crossed between the dates. + public static int? DateDiffSecond( + [CanBeNull] this DbFunctions _, + DateTime? startDate, + DateTime? endDate) + => (startDate.HasValue && endDate.HasValue) + ? (int?)DateDiffSecond(_, startDate.Value, endDate.Value) + : null; + + /// + /// Counts the number of boundaries (in seconds) crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(SECOND,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of boundaries (in seconds) crossed between the dates. + public static int DateDiffSecond( + [CanBeNull] this DbFunctions _, + DateTimeOffset startDate, + DateTimeOffset endDate) + => DateDiffSecond(_, startDate.UtcDateTime, endDate.UtcDateTime); + + /// + /// Counts the number of boundaries (in seconds) crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(SECOND,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of boundaries (in seconds) crossed between the dates. + public static int? DateDiffSecond( + [CanBeNull] this DbFunctions _, + DateTimeOffset? startDate, + DateTimeOffset? endDate) + => (startDate.HasValue && endDate.HasValue) + ? (int?)DateDiffSecond(_, startDate.Value, endDate.Value) + : null; + + /// + /// Counts the number of microsecond boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(MICROSECOND,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of microsecond boundaries crossed between the dates. + public static int DateDiffMicrosecond( + [CanBeNull] this DbFunctions _, + DateTime startDate, + DateTime endDate) + { + checked + { + return (int)((endDate.Ticks - startDate.Ticks) / 10); + } + } + + /// + /// Counts the number of microsecond boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(MICROSECOND,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of microsecond boundaries crossed between the dates. + public static int? DateDiffMicrosecond( + [CanBeNull] this DbFunctions _, + DateTime? startDate, + DateTime? endDate) + => (startDate.HasValue && endDate.HasValue) + ? (int?)DateDiffMicrosecond(_, startDate.Value, endDate.Value) + : null; + + /// + /// Counts the number of microsecond boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(MICROSECOND,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of microsecond boundaries crossed between the dates. + public static int DateDiffMicrosecond( + [CanBeNull] this DbFunctions _, + DateTimeOffset startDate, + DateTimeOffset endDate) + => DateDiffMicrosecond(_, startDate.UtcDateTime, endDate.UtcDateTime); + + /// + /// Counts the number of microsecond boundaries crossed between the startDate and endDate. + /// Corresponds to TIMESTAMPDIFF(MICROSECOND,startDate,endDate). + /// + /// The DbFunctions instance. + /// Starting date for the calculation. + /// Ending date for the calculation. + /// Number of microsecond boundaries crossed between the dates. + public static int? DateDiffMicrosecond( + [CanBeNull] this DbFunctions _, + DateTimeOffset? startDate, + DateTimeOffset? endDate) + => (startDate.HasValue && endDate.HasValue) + ? (int?)DateDiffMicrosecond(_, startDate.Value, endDate.Value) + : null; + + /// + /// + /// An implementation of the SQL LIKE operation. In relational databases this is usually directly + /// translated to SQL. + /// + /// + /// Note that if this function is translated into SQL, then the semantics of the comparison + /// depends on the database configuration. In particular, it may be either case-sensitive or + /// case-insensitive. If this function is evaluated on the client, then it always uses + /// a case-insensitive comparison. + /// + /// + /// The DbFunctions instance. + /// The property of entity that is to be matched. + /// A pattern that may involve wildcards %,_,[,],^. + /// if there is a match; otherwise, . + public static bool Like( + this DbFunctions _, + T matchExpression, + string pattern) + => LikeCore(matchExpression, pattern, null); + + /// + /// + /// An implementation of the SQL LIKE operation. In relational databases, this is usually directly + /// translated to SQL. + /// + /// + /// Note that if this function is translated into SQL, then the semantics of the comparison + /// depends on the database configuration. In particular, it may be either case-sensitive or + /// case-insensitive. If this function is evaluated on the client, then it always uses + /// a case-insensitive comparison. + /// + /// + /// The DbFunctions instance. + /// The property of entity that is to be matched. + /// A pattern that may involve wildcards %,_,[,],^. + /// + /// The escape character (as a single character string) to use in front of %,_,[,],^ + /// if they are not used as wildcards. + /// + /// if there is a match; otherwise, . + public static bool Like( + this DbFunctions _, + T matchExpression, + string pattern, + string? escapeCharacter) + => LikeCore(matchExpression, pattern, escapeCharacter); + + private static bool LikeCore(T matchExpression, string pattern, string? escapeCharacter) + { + if (matchExpression is IConvertible convertible) + { + return EF.Functions.Like(convertible.ToString(CultureInfo.InvariantCulture), pattern, escapeCharacter); + } + + if (matchExpression is byte[] byteArray) + { + var value = BitConverter.ToString(byteArray); + return EF.Functions.Like(value.Replace("-", string.Empty), pattern, escapeCharacter); + } + + return false; + } + + /// + /// + /// An implementation of the SQL MATCH function used to perform a natural language search for a string against a text collection. + /// A collection is a set of one or more columns included in a FULLTEXT index. + /// + /// + /// MATCH (col1,col2,...) AGAINST (expr [search_modifier]) + /// + /// + /// The DbFunctions instance. + /// The columns of the entity that is to be matched. + /// A pattern that may involve wildcards %,_,[,],^. + /// + /// Indicates what type of search to perform + /// + /// if there is a match; otherwise, . + public static bool Match( + [CanBeNull] this DbFunctions _, + [NotNull] string[] properties, + [CanBeNull] string pattern, + MySQLMatchSearchMode searchMode) + => throw new InvalidOperationException(CoreStrings.FunctionOnClient(nameof(Match))); + } +} diff --git a/EFCore/src/Extensions/MySQLEntityTypeBuilderExtensions.cs b/EFCore/src/Extensions/MySQLEntityTypeBuilderExtensions.cs new file mode 100644 index 000000000..33bc3b1e4 --- /dev/null +++ b/EFCore/src/Extensions/MySQLEntityTypeBuilderExtensions.cs @@ -0,0 +1,333 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using MySql.EntityFrameworkCore.Metadata.Internal; +using MySql.EntityFrameworkCore.Utils; +using System; +using System.Collections.Generic; + +namespace MySql.EntityFrameworkCore.Extensions +{ + /// + /// MySQL specific extension methods for . + /// + internal static class MySQLEntityTypeBuilderExtensions + { + #region CharSet + + /// + /// Sets the MySQL character set on the table associated with this entity. When you only specify the character set, MySQL implicitly + /// sets the proper collation as well. + /// + /// The builder for the entity type being configured. + /// The name of the character set. + /// The same builder instance so that multiple calls can be chained. + public static EntityTypeBuilder HasCharSet( + [NotNull] this EntityTypeBuilder entityTypeBuilder, + [CanBeNull] string charSet) + { + Check.NotNull(entityTypeBuilder, nameof(entityTypeBuilder)); + Check.NullButNotEmpty(charSet, nameof(charSet)); + + entityTypeBuilder.Metadata.SetCharSet(charSet); + + return entityTypeBuilder; + } + + /// + /// Sets the MySQL character set on the table associated with this entity. When you only specify the character set, MySQL implicitly + /// sets the proper collation as well. + /// + /// The builder for the entity type being configured. + /// The name of the character set. + /// The same builder instance so that multiple calls can be chained. + public static EntityTypeBuilder HasCharSet( + [NotNull] this EntityTypeBuilder entityTypeBuilder, + [CanBeNull] string charSet) + where TEntity : class + => (EntityTypeBuilder)HasCharSet((EntityTypeBuilder)entityTypeBuilder, charSet); + + /// + /// Sets the MySQL character set on the table associated with this entity. When you only specify the character set, MySQL implicitly + /// sets the proper collation as well. + /// + /// The builder for the entity type being configured. + /// The name of the character set. + /// Indicates whether the configuration was specified using a data annotation. + /// The same builder instance so that multiple calls can be chained. + public static IConventionEntityTypeBuilder? HasCharSet( + [NotNull] this IConventionEntityTypeBuilder entityTypeBuilder, + [CanBeNull] string charSet, + bool fromDataAnnotation = false) + { + Check.NotNull(entityTypeBuilder, nameof(entityTypeBuilder)); + Check.NullButNotEmpty(charSet, nameof(charSet)); + + if (entityTypeBuilder.CanSetCharSet(charSet, fromDataAnnotation)) + { + entityTypeBuilder.Metadata.SetCharSet(charSet, fromDataAnnotation); + + return entityTypeBuilder; + } + + return null; + } + + /// + /// Returns a value indicating whether the MySQL character set can be set on the table associated with this entity. + /// + /// The builder for the entity type being configured. + /// The name of the character set. + /// Indicates whether the configuration was specified using a data annotation. + /// if the mapped table can be configured with the collation. + public static bool CanSetCharSet( + [NotNull] this IConventionEntityTypeBuilder entityTypeBuilder, + [CanBeNull] string charSet, + bool fromDataAnnotation = false) + { + Check.NotNull(entityTypeBuilder, nameof(entityTypeBuilder)); + Check.NullButNotEmpty(charSet, nameof(charSet)); + + return entityTypeBuilder.CanSetAnnotation(MySQLAnnotationNames.Charset, charSet, fromDataAnnotation); + } + + #endregion CharSet + + #region Collation + + /// + /// Sets the MySQL collation on the table associated with this entity. When you only specify the collation, MySQL implicitly sets + /// the proper character set as well. + /// + /// The builder for the entity type being configured. + /// The name of the collation. + /// The same builder instance so that multiple calls can be chained. + public static EntityTypeBuilder UseCollation( + [NotNull] this EntityTypeBuilder entityTypeBuilder, + [CanBeNull] string collation) + { + Check.NotNull(entityTypeBuilder, nameof(entityTypeBuilder)); + Check.NullButNotEmpty(collation, nameof(collation)); + + entityTypeBuilder.Metadata.SetCollation(collation); + + return entityTypeBuilder; + } + + /// + /// Sets the MySQL collation on the table associated with this entity. When you only specify the collation, MySQL implicitly sets + /// the proper character set as well. + /// + /// The builder for the entity type being configured. + /// The name of the collation. + /// The same builder instance so that multiple calls can be chained. + public static EntityTypeBuilder UseCollation( + [NotNull] this EntityTypeBuilder entityTypeBuilder, + [CanBeNull] string collation) + where TEntity : class + => (EntityTypeBuilder)UseCollation((EntityTypeBuilder)entityTypeBuilder, collation); + + /// + /// Sets the MySQL collation on the table associated with this entity. When you only specify the collation, MySQL implicitly sets + /// the proper character set as well. + /// + /// The builder for the entity type being configured. + /// The name of the collation. + /// Indicates whether the configuration was specified using a data annotation. + /// The same builder instance so that multiple calls can be chained. + public static IConventionEntityTypeBuilder? UseCollation( + [NotNull] this IConventionEntityTypeBuilder entityTypeBuilder, + [CanBeNull] string collation, + bool fromDataAnnotation = false) + { + Check.NotNull(entityTypeBuilder, nameof(entityTypeBuilder)); + Check.NullButNotEmpty(collation, nameof(collation)); + + if (entityTypeBuilder.CanSetCollation(collation, fromDataAnnotation)) + { + entityTypeBuilder.Metadata.SetCollation(collation, fromDataAnnotation); + + return entityTypeBuilder; + } + + return null; + } + + /// + /// Returns a value indicating whether the MySQL collation can be set on the table associated with this entity. + /// + /// The builder for the entity type being configured. + /// The name of the collation. + /// Indicates whether the configuration was specified using a data annotation. + /// if the mapped table can be configured with the collation. + public static bool CanSetCollation( + [NotNull] this IConventionEntityTypeBuilder entityTypeBuilder, + [CanBeNull] string collation, + bool fromDataAnnotation = false) + { + Check.NotNull(entityTypeBuilder, nameof(entityTypeBuilder)); + Check.NullButNotEmpty(collation, nameof(collation)); + + return entityTypeBuilder.CanSetAnnotation(RelationalAnnotationNames.Collation, collation, fromDataAnnotation); + } + + /// + /// Returns a value indicating whether the given collation delegation modes can be set. + /// + /// The builder for the entity type being configured. + /// Indicates whether the configuration was specified using a data annotation. + /// if the given collation delegation modes can be set as default. + public static bool CanSetCollationDelegation( + [NotNull] this IConventionEntityTypeBuilder entityTypeBuilder, + bool fromDataAnnotation = false) + { + Check.NotNull(entityTypeBuilder, nameof(entityTypeBuilder)); + + return entityTypeBuilder.CanSetAnnotation(MySQLAnnotationNames.Collation, fromDataAnnotation); + } + + #endregion Collation + + #region Table options + + /// + /// Sets a table option for the table associated with this entity. + /// Can be called more than once to set multiple table options. + /// + /// The builder for the entity type being configured. + /// The name of the table options. + /// The value of the table options. + /// The same builder instance so that multiple calls can be chained. + public static EntityTypeBuilder HasTableOption( + [NotNull] this EntityTypeBuilder entityTypeBuilder, + [CanBeNull] string name, + [CanBeNull] string value) + { + Check.NotNull(entityTypeBuilder, nameof(entityTypeBuilder)); + + var options = entityTypeBuilder.Metadata.GetTableOptions(); + UpdateTableOption(name, value, options); + entityTypeBuilder.Metadata.SetTableOptions(options); + + return entityTypeBuilder; + } + + /// + /// Sets a table option for the table associated with this entity. + /// Can be called more than once to set multiple table options. + /// + /// The builder for the entity type being configured. + /// The name of the table options. + /// The value of the table options. + /// The same builder instance so that multiple calls can be chained. + public static EntityTypeBuilder HasTableOption( + [NotNull] this EntityTypeBuilder entityTypeBuilder, + [CanBeNull] string name, + [CanBeNull] string value) + where TEntity : class + => (EntityTypeBuilder)HasTableOption((EntityTypeBuilder)entityTypeBuilder, name, value); + + /// + /// Sets a table option for the table associated with this entity. + /// Can be called more than once to set multiple table options. + /// + /// The builder for the entity type being configured. + /// The name of the table options. + /// The value of the table options. + /// Indicates whether the configuration was specified using a data annotation. + /// The same builder instance so that multiple calls can be chained. + public static IConventionEntityTypeBuilder? HasTableOption( + [NotNull] this IConventionEntityTypeBuilder entityTypeBuilder, + [CanBeNull] string name, + [CanBeNull] string value, + bool fromDataAnnotation = false) + { + Check.NotNull(entityTypeBuilder, nameof(entityTypeBuilder)); + + if (entityTypeBuilder.CanSetTableOption(name, value, fromDataAnnotation)) + { + var options = entityTypeBuilder.Metadata.GetTableOptions(); + UpdateTableOption(name, value, options); + entityTypeBuilder.Metadata.SetTableOptions(options, fromDataAnnotation); + + return entityTypeBuilder; + } + + return null; + } + + /// + /// Returns a value indicating whether the table options for the table associated with this entity can be set. + /// + /// The builder for the entity type being configured. + /// The name of the table options. + /// The value of the table options. + /// Indicates whether the configuration was specified using a data annotation. + /// if the value can be set. + public static bool CanSetTableOption( + [NotNull] this IConventionEntityTypeBuilder entityTypeBuilder, + [CanBeNull] string name, + [CanBeNull] string value, + bool fromDataAnnotation = false) + { + Check.NotNull(entityTypeBuilder, nameof(entityTypeBuilder)); + + var options = entityTypeBuilder.Metadata.GetTableOptions(); + UpdateTableOption(name, value, options); + var optionsString = MySQLEntityTypeExtensions.SerializeTableOptions(options); + + return entityTypeBuilder.CanSetAnnotation(MySQLAnnotationNames.StoreOptions, optionsString, fromDataAnnotation); + } + + private static void UpdateTableOption(string key, string value, Dictionary options) + { + if (key == null) + { + if (value != null) + { + throw new ArgumentException(nameof(value)); + } + + options.Clear(); + return; + } + + if (value == null) + { + options.Remove(key); + return; + } + + options[key] = value; + } + + #endregion Table options + } +} diff --git a/EFCore/src/Extensions/MySQLEntityTypeExtensions.cs b/EFCore/src/Extensions/MySQLEntityTypeExtensions.cs new file mode 100644 index 000000000..9eec6cc26 --- /dev/null +++ b/EFCore/src/Extensions/MySQLEntityTypeExtensions.cs @@ -0,0 +1,258 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Metadata; +using MySql.EntityFrameworkCore.Metadata.Internal; +using MySql.EntityFrameworkCore.Utils; +using System; +using System.Collections.Generic; +using System.Text; +using System.Text.RegularExpressions; + +namespace MySql.EntityFrameworkCore.Extensions +{ + /// + /// MySQL specific extension methods for entity types. + /// + public static class MySQLEntityTypeExtensions + { + #region CharSet + + /// + /// Get the MySQL character set for the table associated with this entity. + /// + /// The entity type. + /// The name of the character set. + public static string? GetCharSet([NotNull] this IReadOnlyEntityType entityType) + => entityType[MySQLAnnotationNames.Charset] as string; + + /// + /// Sets the MySQL character set on the table associated with this entity. When you only specify the character set, MySQL implicitly + /// sets the proper collation as well. + /// + /// The entity type. + /// The name of the character set. + public static void SetCharSet( + [NotNull] this IMutableEntityType entityType, + [CanBeNull] string charSet) + { + Check.NullButNotEmpty(charSet, nameof(charSet)); + + entityType.SetOrRemoveAnnotation(MySQLAnnotationNames.Charset, charSet); + } + + /// + /// Sets the MySQL character set on the table associated with this entity. When you only specify the character set, MySQL implicitly + /// sets the proper collation as well. + /// + /// The entity type. + /// The name of the character set. + /// Indicates whether the configuration was specified using a data annotation. + /// The configured value. + public static string SetCharSet( + [NotNull] this IConventionEntityType entityType, + [CanBeNull] string charSet, + bool fromDataAnnotation = false) + { + Check.NullButNotEmpty(charSet, nameof(charSet)); + + entityType.SetOrRemoveAnnotation(MySQLAnnotationNames.Charset, charSet, fromDataAnnotation); + + return charSet; + } + + /// + /// Gets the configuration source for the character-set mode. + /// + /// The entity type. + /// The configuration source. + public static ConfigurationSource? GetCharSetConfigurationSource([NotNull] this IConventionEntityType entityType) + => entityType.FindAnnotation(MySQLAnnotationNames.Charset)?.GetConfigurationSource(); + + #endregion CharSet + + #region Collation + + /// + /// Get the MySQL collation for the table associated with this entity. + /// + /// The entity type. + /// The name of the collation. + public static string? GetCollation([NotNull] this IReadOnlyEntityType entityType) + => entityType[RelationalAnnotationNames.Collation] as string; + + /// + /// Sets the MySQL collation on the table associated with this entity. When you specify the collation, MySQL implicitly sets the + /// proper character set as well. + /// + /// The entity type. + /// The name of the collation. + public static void SetCollation( + [NotNull] this IMutableEntityType entityType, + [CanBeNull] string collation) + { + Check.NullButNotEmpty(collation, nameof(collation)); + + entityType.SetOrRemoveAnnotation(RelationalAnnotationNames.Collation, collation); + } + + /// + /// Sets the MySQL collation on the table associated with this entity. When you specify the collation, MySQL implicitly sets the + /// proper character set as well. + /// + /// The entity type. + /// The name of the collation. + /// Indicates whether the configuration was specified using a data annotation. + /// The configured value. + public static string SetCollation( + [NotNull] this IConventionEntityType entityType, + [CanBeNull] string collation, + bool fromDataAnnotation = false) + { + Check.NullButNotEmpty(collation, nameof(collation)); + + entityType.SetOrRemoveAnnotation(RelationalAnnotationNames.Collation, collation, fromDataAnnotation); + + return collation; + } + + /// + /// Gets the configuration source for the collation mode. + /// + /// The entity type. + /// The configuration source. + public static ConfigurationSource? GetCollationConfigurationSource([NotNull] this IConventionEntityType entityType) + => entityType.FindAnnotation(RelationalAnnotationNames.Collation)?.GetConfigurationSource(); + + #endregion Collation + + #region StoreOptions + + /// + /// Gets the MySQL table options for the table associated with this entity. + /// + /// The entity type. + /// A dictionary of table options. + public static Dictionary GetTableOptions([NotNull] this IReadOnlyEntityType entityType) + => DeserializeTableOptions(entityType[MySQLAnnotationNames.StoreOptions] as string); + + /// + /// Sets the MySQL table options for the table associated with this entity. + /// + /// The entity type. + /// A dictionary of table options. + public static void SetTableOptions( + [NotNull] this IMutableEntityType entityType, + [CanBeNull] Dictionary options) + => entityType.SetOrRemoveAnnotation(MySQLAnnotationNames.StoreOptions, SerializeTableOptions(options)); + + /// + /// Sets the MySQL table options for the table associated with this entity. + /// + /// The entity type. + /// A dictionary of table options. + /// Indicates whether the configuration was specified using a data annotation. + /// The configured value. + public static Dictionary SetTableOptions( + [NotNull] this IConventionEntityType entityType, + [CanBeNull] Dictionary options, + bool fromDataAnnotation = false) + { + entityType.SetOrRemoveAnnotation(MySQLAnnotationNames.StoreOptions, SerializeTableOptions(options), fromDataAnnotation); + + return options; + } + + /// + /// Gets the configuration source for the table options. + /// + /// The entity type. + /// The configuration source. + public static ConfigurationSource? GetTableOptionsConfigurationSource([NotNull] this IConventionEntityType entityType) + => entityType.FindAnnotation(MySQLAnnotationNames.StoreOptions)?.GetConfigurationSource(); + + internal static string? SerializeTableOptions(Dictionary options) + { + var tableOptionsString = new StringBuilder(); + + if (options is not null) + { + foreach (var (key, value) in options) + { + if (string.IsNullOrWhiteSpace(key) || + key.Contains(',') || + key.Contains('=') || + string.IsNullOrWhiteSpace(value)) + { + throw new ArgumentException(nameof(options)); + } + + tableOptionsString + .Append(key.Trim()) + .Append('=') + .Append(value.Trim().Replace(",", ",,")) + .Append(','); + } + } + + if (tableOptionsString.Length == 0) + return null; + + tableOptionsString.Remove(tableOptionsString.Length - 1, 1); + return tableOptionsString.ToString(); + } + + internal static Dictionary DeserializeTableOptions(string? optionsString) + { + var options = new Dictionary(); + + if (!string.IsNullOrEmpty(optionsString)) + { + var tableOptionParts = Regex.Split(optionsString, @"(?<=(?:$|[^,])(?:,,)*),(?!,)"); + + foreach (var part in tableOptionParts) + { + var firstEquals = part.IndexOf('='); + + if (firstEquals > 0 && + firstEquals < part.Length - 1) + { + var key = part[..firstEquals]; + var value = part[(firstEquals + 1)..].Replace(",,", ","); + + options[key] = value; + } + } + } + + return options; + } + + #endregion StoreOptions + } +} diff --git a/EFCore/src/Extensions/MySQLIndexExtensions.cs b/EFCore/src/Extensions/MySQLIndexExtensions.cs new file mode 100644 index 000000000..bc4be7b3c --- /dev/null +++ b/EFCore/src/Extensions/MySQLIndexExtensions.cs @@ -0,0 +1,197 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Metadata; +using MySql.EntityFrameworkCore.Metadata.Internal; + +namespace MySql.EntityFrameworkCore.Extensions +{ + /// + /// Extension methods for for MySQL specific metadata. + /// + public static class MySQLIndexExtensions + { + /// + /// Returns a value indicating whether the index is full text. + /// + /// The index. + /// if the index is clustered; otherwise, . + public static bool? IsFullText([NotNull] this IIndex index) + => (bool?)index[MySQLAnnotationNames.FullTextIndex]; + + /// + /// Sets a value indicating whether the index is full text. + /// + /// The value to set. + /// The index. + public static void SetIsFullText([NotNull] this IMutableIndex index, bool? value) + => index.SetOrRemoveAnnotation( + MySQLAnnotationNames.FullTextIndex, + value); + + /// + /// Sets a value indicating whether the index is full text. + /// + /// The value to set. + /// The index. + /// Indicates whether the configuration was specified using a data annotation. + public static void SetIsFullText( + [NotNull] this IConventionIndex index, bool? value, bool fromDataAnnotation = false) + => index.SetOrRemoveAnnotation( + MySQLAnnotationNames.FullTextIndex, + value, + fromDataAnnotation); + + /// + /// Returns the for whether the index is full text. + /// + /// The property. + /// The for whether the index is full text. + public static ConfigurationSource? GetIsFullTextConfigurationSource([NotNull] this IConventionIndex property) + => property.FindAnnotation(MySQLAnnotationNames.FullTextIndex)?.GetConfigurationSource(); + + /// + /// Returns a value indicating which full text parser to use. + /// + /// The index. + /// The name of the full text parser. + [CanBeNull] + public static string FullTextParser([NotNull] this IIndex index) + => (string)index[MySQLAnnotationNames.FullTextParser]!; + + /// + /// Sets a value indicating which full text parser to be used. + /// + /// The value to set. + /// The index. + public static void SetFullTextParser([NotNull] this IMutableIndex index, [CanBeNull] string value) + => index.SetOrRemoveAnnotation(MySQLAnnotationNames.FullTextParser, value); + + /// + /// Sets a value indicating which full text parser to be used. + /// + /// The value to set. + /// The index. + /// Indicates whether the configuration was specified using a data annotation. + public static string SetFullTextParser([NotNull] this IConventionIndex index, [CanBeNull] string value, bool fromDataAnnotation = false) + { + index.SetOrRemoveAnnotation(MySQLAnnotationNames.FullTextParser, value, fromDataAnnotation); + + return value; + } + + /// + /// Returns the for whether the index is full text. + /// + /// The property. + /// The for whether the index is full text. + public static ConfigurationSource? GetFullTextParserConfigurationSource([NotNull] this IConventionIndex property) + => property.FindAnnotation(MySQLAnnotationNames.FullTextParser)?.GetConfigurationSource(); + + /// + /// Returns a value indicating whether the index is spartial. + /// + /// The index. + /// if the index is clustered; otherwise, + public static bool? IsSpatial([NotNull] this IIndex index) + => (bool?)index[MySQLAnnotationNames.SpatialIndex]; + + /// + /// Sets a value indicating whether the index is spartial. + /// + /// The value to set. + /// The index. + public static void SetIsSpatial([NotNull] this IMutableIndex index, bool? value) + => index.SetOrRemoveAnnotation( + MySQLAnnotationNames.SpatialIndex, + value); + + /// + /// Sets a value indicating whether the index is spartial. + /// + /// The value to set. + /// The index. + /// Indicates whether the configuration was specified using a data annotation. + public static void SetIsSpatial( + [NotNull] this IConventionIndex index, bool? value, bool fromDataAnnotation = false) + => index.SetOrRemoveAnnotation( + MySQLAnnotationNames.SpatialIndex, + value, + fromDataAnnotation); + + /// + /// Indicates whether the index is spatial. + /// + /// The property. + /// The to show if the index is spartial. + public static ConfigurationSource? GetIsSpatialConfigurationSource([NotNull] this IConventionIndex property) + => property.FindAnnotation(MySQLAnnotationNames.SpatialIndex)?.GetConfigurationSource(); + + /// + /// Returns prefix lengths for the index. + /// + /// The index. + /// The prefix lengths. + /// A value of `0` indicates, that the full length should be used for that column. + public static int[] PrefixLength([NotNull] this IIndex index) + => (int[])index[MySQLAnnotationNames.IndexPrefixLength]!; + + /// + /// Sets prefix lengths for the index. + /// + /// The prefix lengths to set. + /// A value of `0` indicates, that the full length should be used for that column. + /// The index. + public static void SetPrefixLength([NotNull] this IMutableIndex index, int[] values) + => index.SetOrRemoveAnnotation( + MySQLAnnotationNames.IndexPrefixLength, + values); + + /// + /// Sets prefix lengths for the index. + /// + /// The prefix lengths to set. + /// A value of `0` indicates, that the full length should be used for that column. + /// The index. + /// Indicates whether the configuration was specified using a data annotation. + public static int[] SetPrefixLength([NotNull] this IConventionIndex index, int[] values, bool fromDataAnnotation = false) + { + index.SetOrRemoveAnnotation(MySQLAnnotationNames.IndexPrefixLength, values, fromDataAnnotation); + + return values; + } + + /// + /// Returns the for prefix lengths of the index. + /// + /// The property. + /// The for prefix lengths of the index. + public static ConfigurationSource? GetPrefixLengthConfigurationSource([NotNull] this IConventionIndex property) + => property.FindAnnotation(MySQLAnnotationNames.IndexPrefixLength)?.GetConfigurationSource(); + } +} diff --git a/EFCore/src/Extensions/MySQLKeyBuilderExtensions.cs b/EFCore/src/Extensions/MySQLKeyBuilderExtensions.cs new file mode 100644 index 000000000..72727aefb --- /dev/null +++ b/EFCore/src/Extensions/MySQLKeyBuilderExtensions.cs @@ -0,0 +1,55 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using MySql.EntityFrameworkCore.Utils; + +namespace MySql.EntityFrameworkCore.Extensions +{ + /// + /// MySQL specific extension methods for . + /// + public static class MySQLKeyBuilderExtensions + { + /// + /// Sets prefix lengths for the key. + /// + /// The key builder. + /// The prefix lengths to set in the order of the key columns where specified. + /// A value of `0` indicates, that the full length should be used for that column. + /// The key builder. + public static KeyBuilder HasPrefixLength([NotNull] this KeyBuilder keyBuilder, params int[] prefixLengths) + { + Check.NotNull(keyBuilder, nameof(keyBuilder)); + + keyBuilder.Metadata.SetPrefixLength(prefixLengths); + + return keyBuilder; + } + } +} diff --git a/EFCore/src/Extensions/MySQLKeyExtensions.cs b/EFCore/src/Extensions/MySQLKeyExtensions.cs new file mode 100644 index 000000000..2be6817e1 --- /dev/null +++ b/EFCore/src/Extensions/MySQLKeyExtensions.cs @@ -0,0 +1,75 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Metadata; +using MySql.EntityFrameworkCore.Metadata.Internal; + +namespace MySql.EntityFrameworkCore.Extensions +{ + /// + /// Extension methods for for MySQL-specific metadata. + /// + public static class MySQLKeyExtensions + { + /// + /// Returns prefix lengths for the key. + /// + /// The key. + /// The prefix lengths. + /// A value of `0` indicates, that the full length should be used for that column. + public static int[] PrefixLength([NotNull] this IKey key) + => (int[])key[MySQLAnnotationNames.IndexPrefixLength]!; + + /// + /// Sets prefix lengths for the key. + /// + /// The prefix lengths to set. + /// A value of `0` indicates, that the full length should be used for that column. + /// The key. + public static void SetPrefixLength([NotNull] this IMutableKey key, int[] values) + => key.SetOrRemoveAnnotation(MySQLAnnotationNames.IndexPrefixLength, values); + + /// + /// Sets prefix lengths for the key. + /// + /// The prefix lengths to set. + /// A value of `0` indicates, that the full length should be used for that column. + /// The key. + /// Indicates whether the configuration was specified using a data annotation. + public static void SetPrefixLength([NotNull] this IConventionKey key, int[] values, bool fromDataAnnotation = false) + => key.SetOrRemoveAnnotation(MySQLAnnotationNames.IndexPrefixLength, values, fromDataAnnotation); + + /// + /// Returns the for prefix lengths of the key. + /// + /// The property. + /// The for prefix lengths of the key. + public static ConfigurationSource? GetPrefixLengthConfigurationSource([NotNull] this IConventionKey property) + => property.FindAnnotation(MySQLAnnotationNames.IndexPrefixLength)?.GetConfigurationSource(); + } +} diff --git a/EFCore/src/Extensions/MySQLMigrationBuilderExtensions.cs b/EFCore/src/Extensions/MySQLMigrationBuilderExtensions.cs new file mode 100644 index 000000000..6aef77044 --- /dev/null +++ b/EFCore/src/Extensions/MySQLMigrationBuilderExtensions.cs @@ -0,0 +1,101 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Migrations.Operations.Builders; +using MySql.EntityFrameworkCore.Infrastructure.Internal; +using MySql.EntityFrameworkCore.Migrations.Operations; +using MySql.EntityFrameworkCore.Utils; +using System; +using System.Reflection; + +namespace MySql.EntityFrameworkCore.Extensions +{ + /// + /// MySQL extension methods for . + /// + public static class MySQLMigrationBuilderExtensions + { + /// + /// Indicates whether the database provider currently in use is the MySQL provider. + /// + /// The migrationBuilder from the parameters on + /// or . + /// if MySQL is being used; otherwise, . + public static bool IsMySql([NotNull] this MigrationBuilder migrationBuilder) + => string.Equals(migrationBuilder.ActiveProvider, + typeof(MySQLOptionsExtension).GetTypeInfo().Assembly.GetName().Name, + StringComparison.Ordinal); + + internal static OperationBuilder DropPrimaryKey( + [NotNull] this MigrationBuilder migrationBuilder, + [NotNull] string name, + [NotNull] string table, + [CanBeNull] string? schema = null, + bool recreateForeignKeys = false) + { + Check.NotNull(migrationBuilder, nameof(migrationBuilder)); + Check.NotEmpty(name, nameof(name)); + Check.NotEmpty(table, nameof(table)); + + var operation = new MySQLDropPrimaryKeyAndRecreateForeignKeysOperation + { + Schema = schema, + Table = table, + Name = name, + RecreateForeignKeys = recreateForeignKeys, + }; + migrationBuilder.Operations.Add(operation); + + return new OperationBuilder(operation); + } + + internal static OperationBuilder DropUniqueConstraint( + [NotNull] this MigrationBuilder migrationBuilder, + [NotNull] string name, + [NotNull] string table, + [CanBeNull] string? schema = null, + bool recreateForeignKeys = false) + { + Check.NotNull(migrationBuilder, nameof(migrationBuilder)); + Check.NotEmpty(name, nameof(name)); + Check.NotEmpty(table, nameof(table)); + + var operation = new MySQLDropUniqueConstraintAndRecreateForeignKeysOperation + { + Schema = schema, + Table = table, + Name = name, + RecreateForeignKeys = recreateForeignKeys, + }; + migrationBuilder.Operations.Add(operation); + + return new OperationBuilder(operation); + } + } +} diff --git a/EFCore/src/Extensions/MySQLModelBuilderExtensions.cs b/EFCore/src/Extensions/MySQLModelBuilderExtensions.cs new file mode 100644 index 000000000..89a4a2801 --- /dev/null +++ b/EFCore/src/Extensions/MySQLModelBuilderExtensions.cs @@ -0,0 +1,159 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using MySql.EntityFrameworkCore.Metadata.Internal; +using MySql.EntityFrameworkCore.Utils; + +namespace MySql.EntityFrameworkCore.Extensions +{ + /// + /// MySQL-specific extension methods for . + /// + public static class MySQLModelBuilderExtensions + { + #region CharSet + + /// + /// Sets the default character set to use for the model or database. + /// + /// The model builder. + /// The name of the character set to use. + /// The same builder instance so that multiple calls can be chained. + public static ModelBuilder HasCharSet( + [NotNull] this ModelBuilder modelBuilder, + [CanBeNull] string charSet) + { + Check.NotNull(modelBuilder, nameof(modelBuilder)); + Check.NullButNotEmpty(charSet, nameof(charSet)); + + modelBuilder.Model.SetCharSet(charSet); + + return modelBuilder; + } + + /// + /// Sets the default character set to use for the model or database. + /// + /// The model builder. + /// The name of the character set to use. + /// Indicates whether the configuration was specified using a data annotation. + /// + /// The same builder instance if the configuration was applied, + /// otherwise. + /// + public static IConventionModelBuilder? HasCharSet( + [NotNull] this IConventionModelBuilder modelBuilder, + [CanBeNull] string charSet, + bool fromDataAnnotation = false) + { + Check.NotNull(modelBuilder, nameof(modelBuilder)); + Check.NullButNotEmpty(charSet, nameof(charSet)); + + if (modelBuilder.CanSetCharSet(charSet, fromDataAnnotation)) + { + modelBuilder.Metadata.SetCharSet(charSet, fromDataAnnotation); + return modelBuilder; + } + + return null; + } + + /// + /// Returns a value indicating whether the given character set can be set as default. + /// + /// The model builder. + /// The character set. + /// Indicates whether the configuration was specified using a data annotation. + /// if the given character set can be set as default. + public static bool CanSetCharSet( + [NotNull] this IConventionModelBuilder modelBuilder, + [CanBeNull] string charSet, + bool fromDataAnnotation = false) + { + Check.NotNull(modelBuilder, nameof(modelBuilder)); + Check.NullButNotEmpty(charSet, nameof(charSet)); + + return modelBuilder.CanSetAnnotation(MySQLAnnotationNames.Charset, charSet, fromDataAnnotation); + } + + #endregion CharSet + + #region Collation + + /// + /// Configures the database collation, which will be used by all columns without an explicit collation. Also finely controls + /// where to apply the collation recursively (including this model or database). + /// + /// The model builder. + /// The collation. + /// The same builder instance so that multiple calls can be chained. + public static ModelBuilder UseCollation( + [NotNull] this ModelBuilder modelBuilder, + string collation) + { + Check.NotNull(modelBuilder, nameof(modelBuilder)); + Check.NullButNotEmpty(collation, nameof(collation)); + + modelBuilder.Model.SetCollation(collation); + + return modelBuilder; + } + + /// + /// Configures the database collation, which will be used by all columns without an explicit collation. Also finely controls + /// where to apply the collation recursively (including this model or database). + /// + /// The model builder. + /// The collation. + /// Indicates whether the configuration was specified using a data annotation. + /// + /// The same builder instance if the configuration was applied, + /// otherwise. + /// + public static IConventionModelBuilder? UseCollation( + [NotNull] this IConventionModelBuilder modelBuilder, + string collation, + bool fromDataAnnotation = false) + { + Check.NotNull(modelBuilder, nameof(modelBuilder)); + Check.NullButNotEmpty(collation, nameof(collation)); + + if (modelBuilder.CanSetCollation(collation, fromDataAnnotation)) + { + modelBuilder.Metadata.SetCollation(collation, fromDataAnnotation); + return modelBuilder; + } + + return null; + } + + #endregion Collation + } +} diff --git a/EFCore/src/Extensions/MySQLModelExtensions.cs b/EFCore/src/Extensions/MySQLModelExtensions.cs new file mode 100644 index 000000000..f2284ec4f --- /dev/null +++ b/EFCore/src/Extensions/MySQLModelExtensions.cs @@ -0,0 +1,122 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Metadata; +using MySql.EntityFrameworkCore.Metadata; +using MySql.EntityFrameworkCore.Metadata.Internal; + +namespace MySql.EntityFrameworkCore.Extensions +{ + /// + /// Extension methods for for MySQL-specific metadata. + /// + internal static class MySQLModelExtensions + { + #region ValueGeneration + + /// + /// Returns the to use for properties + /// of keys in the model, unless the property has a strategy explicitly set. + /// + /// The model. + /// The default . + public static MySQLValueGenerationStrategy? GetValueGenerationStrategy([NotNull] this IModel model) + => (MySQLValueGenerationStrategy?)model[MySQLAnnotationNames.ValueGenerationStrategy]; + + /// + /// Attempts to set the to use for properties + /// of keys in the model that do not have a strategy explicitly set. + /// + /// The model. + /// The value to set. + public static void SetValueGenerationStrategy([NotNull] this IMutableModel model, MySQLValueGenerationStrategy? value) + => model.SetOrRemoveAnnotation(MySQLAnnotationNames.ValueGenerationStrategy, value); + + /// + /// Attempts to set the to use for properties + /// of keys in the model that do not have a strategy explicitly set. + /// + /// The model. + /// The value to set. + /// Indicates whether the configuration was specified using a data annotation. + public static void SetValueGenerationStrategy( + [NotNull] this IConventionModel model, MySQLValueGenerationStrategy? value, bool fromDataAnnotation = false) + => model.SetOrRemoveAnnotation(MySQLAnnotationNames.ValueGenerationStrategy, value, fromDataAnnotation); + + /// + /// Returns the for the default . + /// + /// The model. + /// The for the default . + public static ConfigurationSource? GetValueGenerationStrategyConfigurationSource([NotNull] this IConventionModel model) + => model.FindAnnotation(MySQLAnnotationNames.ValueGenerationStrategy)?.GetConfigurationSource(); + + #endregion + + #region Charset + + /// + /// Returns the character set to use as the default for the model or database. + /// + /// The model. + /// The default character set. + public static string? GetCharSet([NotNull] this IModel model) + => model[MySQLAnnotationNames.Charset] as string; + + /// + /// Attempts to set the character set to use as the default for the model or database. + /// + /// The model. + /// The default character set. + public static void SetCharSet([NotNull] this IMutableModel model, string charSet) + => model.SetOrRemoveAnnotation(MySQLAnnotationNames.Charset, charSet); + + /// + /// Attempts to set the character set to use as the default for the model or database. + /// + /// The model. + /// The default character set. + /// Indicates whether the configuration was specified using a data annotation. + public static string SetCharSet([NotNull] this IConventionModel model, string charSet, bool fromDataAnnotation = false) + { + model.SetOrRemoveAnnotation(MySQLAnnotationNames.Charset, charSet, fromDataAnnotation); + + return charSet; + } + + /// + /// Returns the for the default character set of the model or database. + /// + /// The model. + /// The for the default character set. + public static ConfigurationSource? GetCharSetConfigurationSource([NotNull] this IConventionModel model) + => model.FindAnnotation(MySQLAnnotationNames.Charset)?.GetConfigurationSource(); + + #endregion + } +} diff --git a/EFCore/src/Extensions/MySQLPropertyBuilderExtensions.cs b/EFCore/src/Extensions/MySQLPropertyBuilderExtensions.cs new file mode 100644 index 000000000..88729618a --- /dev/null +++ b/EFCore/src/Extensions/MySQLPropertyBuilderExtensions.cs @@ -0,0 +1,155 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using MySql.EntityFrameworkCore.Metadata.Internal; +using MySql.EntityFrameworkCore.Utils; + +namespace MySql.EntityFrameworkCore.Extensions +{ + /// + /// Represents the implementation of MySQL property-builder extensions used in Fluent API. + /// + public static class MySQLPropertyBuilderExtensions + { + /// + /// Defines a MySQL auto-increment column. + /// + /// Entity property to be set. + /// MySQL column type as string. + /// Property builder of the auto-increment column. + public static PropertyBuilder UseMySQLAutoIncrementColumn( + [NotNull] this PropertyBuilder propertyBuilder, + [CanBeNull] string typeName) + { + Check.NotNull(propertyBuilder, "propertyBuilder"); + + propertyBuilder.ValueGeneratedOnAdd(); + return propertyBuilder; + } + + /// + /// Defines the default value expression for a column. + /// + /// Entity property to be set. + /// Default value expression. + /// Property builder of a MySQL column with a default value. + public static PropertyBuilder ForMySQLHasDefaultValueSql( + [NotNull] this PropertyBuilder propertyBuilder, + [CanBeNull] string sql) + { + Check.NotNull(propertyBuilder, "propertyBuilder"); + + if (sql != null && sql.Length == 0) + Check.NotEmpty(sql, nameof(sql)); + + propertyBuilder.ValueGeneratedOnAdd(); + propertyBuilder.Metadata.SetDefaultValueSql(sql); + + return propertyBuilder; + } + + /// + /// Defines the default value for a column. + /// + /// Entity property to be set. + /// Default value. + /// Property builder of a MySQL column with a default value. + public static PropertyBuilder ForMySQLHasDefaultValue( + this PropertyBuilder propertyBuilder, + object? value = null) + { + Check.NotNull(propertyBuilder, "propertyBuilder"); + + propertyBuilder.ValueGeneratedOnAdd(); + propertyBuilder.Metadata.SetDefaultValue(value);// ?? DBNull.Value; + + return propertyBuilder; + } + + /// + /// Adds the character set to an entity property. + /// + /// Property builder. + /// MySQL character set to use. + /// Property builder with a character set. + public static PropertyBuilder ForMySQLHasCharset( + [NotNull] this PropertyBuilder propertyBuilder, + [NotNull] string charset) + { + Check.NotNull(propertyBuilder, nameof(propertyBuilder)); + propertyBuilder.Metadata.AddAnnotation(MySQLAnnotationNames.Charset, charset); + + return propertyBuilder; + } + + /// + /// Adds the character set to an entity. + /// + /// Entity type builder. + /// MySQL character set to use. + /// Entity type builder with a character set. + public static EntityTypeBuilder ForMySQLHasCharset( + [NotNull] this EntityTypeBuilder entityTypeBuilder, + [NotNull] string charset) + { + entityTypeBuilder.Metadata.AddAnnotation(MySQLAnnotationNames.Charset, charset); + return entityTypeBuilder; + } + + + /// + /// Adds the collation to an entity property. + /// + /// Property builder. + /// MySQL collation to use. + /// Property builder with a collation. + public static PropertyBuilder ForMySQLHasCollation( + [NotNull] this PropertyBuilder propertyBuilder, + [NotNull] string collation) + { + propertyBuilder.Metadata.AddAnnotation(MySQLAnnotationNames.Collation, collation); + return propertyBuilder; + } + + /// + /// Adds the collation to an entity. + /// + /// Entity type builder. + /// MySQL collation to use. + /// Entity type builder with a collation. + public static EntityTypeBuilder ForMySQLHasCollation( + [NotNull] this EntityTypeBuilder entityTypeBuilder, + [NotNull] string collation) + { + entityTypeBuilder.Metadata.AddAnnotation(MySQLAnnotationNames.Collation, collation); + return entityTypeBuilder; + } + } +} diff --git a/EFCore/src/Extensions/MySQLPropertyExtensions.cs b/EFCore/src/Extensions/MySQLPropertyExtensions.cs new file mode 100644 index 000000000..ebc0ebed1 --- /dev/null +++ b/EFCore/src/Extensions/MySQLPropertyExtensions.cs @@ -0,0 +1,256 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using MySql.EntityFrameworkCore.Metadata; +using MySql.EntityFrameworkCore.Metadata.Internal; +using MySql.EntityFrameworkCore.Properties; +using MySql.EntityFrameworkCore.Storage.Internal; +using MySql.EntityFrameworkCore.Utils; +using System; +using System.Linq; + +namespace MySql.EntityFrameworkCore.Extensions +{ + /// + /// Extension methods for for MySQL metadata. + /// + public static class MySQLPropertyExtensions + { + /// + /// + /// Returns the to use for the property. + /// + /// + /// If no strategy is set for the property, then the strategy to use will be taken from the . + /// + /// + /// The strategy, or if none was set. + public static MySQLValueGenerationStrategy? GetValueGenerationStrategy([NotNull] this IReadOnlyProperty property, StoreObjectIdentifier storeObject = default) + { + var annotation = property[MySQLAnnotationNames.ValueGenerationStrategy]; + if (annotation != null) + { + return (MySQLValueGenerationStrategy)annotation; + } + + if (property.GetContainingForeignKeys().Any(fk => !fk.IsBaseLinking()) || + property.TryGetDefaultValue(storeObject, out _) || + property.GetDefaultValueSql() != null || + property.GetComputedColumnSql() != null) + { + return null; + } + + if (storeObject != default && property.ValueGenerated == ValueGenerated.Never) + return property.FindSharedStoreObjectRootProperty(storeObject)?.GetValueGenerationStrategy(storeObject); + + if (IsCompatibleIdentityColumn(property) && property.ValueGenerated == ValueGenerated.OnAdd) + return MySQLValueGenerationStrategy.IdentityColumn; + + if (IsCompatibleComputedColumn(property) && property.ValueGenerated == ValueGenerated.OnAddOrUpdate) + return MySQLValueGenerationStrategy.ComputedColumn; + + return null; + } + + + /// + /// Indicates whether the property is compatible with . + /// + /// The property. + /// if compatible; otherwise, . + public static bool IsCompatibleIdentityColumn(IReadOnlyProperty property) + => IsCompatibleAutoIncrementColumn(property) || IsCompatibleCurrentTimestampColumn(property); + + /// + /// Returns a value indicating whether the property is compatible with an `AUTO_INCREMENT` column. + /// + /// The property. + /// if compatible. + public static bool IsCompatibleAutoIncrementColumn(IReadOnlyProperty property) + { + var valueConverter = GetConverter(property); + var type = (valueConverter?.ProviderClrType ?? property.ClrType).UnwrapNullableType(); + return type.IsInteger() || type == typeof(decimal); + } + + /// + /// Returns the name of the character set used by the column of the property. + /// + /// The property that defines a column's character set. + /// The name of the charset or null, if no explicit charset was set. + public static string? GetCharSet([NotNull] this IReadOnlyProperty property) + => property[MySQLAnnotationNames.Charset] as string ?? property.GetMySqlLegacyCharSet(); + + /// + /// Returns the name of the character set used by the column of the property, defined as part of the column type. + /// + /// The property that defines a column's character set. + /// The name of the character set or null, if no explicit character set was set. + internal static string? GetMySqlLegacyCharSet([NotNull] this IReadOnlyProperty property) + { + var columnType = property.GetColumnType(); + + if (columnType is not null) + { + const string characterSet = "character set"; + const string charSet = "charset"; + + var characterSetOccurrenceIndex = columnType.IndexOf(characterSet, StringComparison.OrdinalIgnoreCase); + var clauseLength = characterSet.Length; + + if (characterSetOccurrenceIndex < 0) + { + characterSetOccurrenceIndex = columnType.IndexOf(charSet, StringComparison.OrdinalIgnoreCase); + clauseLength = charSet.Length; + } + + if (characterSetOccurrenceIndex >= 0) + { + var result = string.Concat( + columnType.Skip(characterSetOccurrenceIndex + clauseLength) + .SkipWhile(c => c == ' ') + .TakeWhile(c => c != ' ')); + + if (result.Length > 0) + { + return result; + } + } + } + + return null; + } + + /// + /// Returns a value indicating whether the property is compatible with a `CURRENT_TIMESTAMP` column default. + /// + /// The property. + /// if compatible. + public static bool IsCompatibleCurrentTimestampColumn(IReadOnlyProperty property) + { + var valueConverter = GetConverter(property); + var type = (valueConverter?.ProviderClrType ?? property.ClrType).UnwrapNullableType(); + return type == typeof(DateTime) || type == typeof(DateTimeOffset); + } + + /// + /// Indicates whether the property is compatible with . + /// + /// The property. + /// if compatible; otherwise, . + public static bool IsCompatibleComputedColumn(IReadOnlyProperty property) + { + var type = property.ClrType; + + // RowVersion uses byte[] and the BytesToDateTimeConverter. + return (type == typeof(DateTime) || type == typeof(DateTimeOffset)) && !HasConverter(property) + || type == typeof(byte[]) && !HasExternalConverter(property); + } + + private static bool HasConverter(IReadOnlyProperty property) + => GetConverter(property) != null; + + private static bool HasExternalConverter(IReadOnlyProperty property) + { + var converter = GetConverter(property); + return converter != null && !(converter is BytesToDateTimeConverter); + } + + private static ValueConverter? GetConverter(IReadOnlyProperty property) + => property.FindTypeMapping()?.Converter ?? property.GetValueConverter(); + + public static string SetCharSet([NotNull] this IMutableProperty property, string charSet) + { + property.SetOrRemoveAnnotation(MySQLAnnotationNames.Charset, charSet); + return charSet; + } + + /// + /// Sets the to use for the property. + /// + /// The property. + /// The strategy to use. + public static void SetValueGenerationStrategy([NotNull] this IMutableProperty property, MySQLValueGenerationStrategy? value) + { + CheckValueGenerationStrategy(property, value); + + property.SetOrRemoveAnnotation(MySQLAnnotationNames.ValueGenerationStrategy, value); + } + + /// + /// Sets the to use for the property. + /// + /// The property. + /// The strategy to use. + /// Indicates whether the configuration was specified using a data annotation. + /// The configured value. + public static MySQLValueGenerationStrategy? SetValueGenerationStrategy( + this IConventionProperty property, + MySQLValueGenerationStrategy? value, + bool fromDataAnnotation = false) + { + CheckValueGenerationStrategy(property, value); + property.SetOrRemoveAnnotation(MySQLAnnotationNames.ValueGenerationStrategy, value, fromDataAnnotation); + + return value; + } + + /// + /// Returns the for the . + /// + /// The property. + /// The for the . + public static ConfigurationSource? GetValueGenerationStrategyConfigurationSource(this IConventionProperty property) + => property.FindAnnotation(MySQLAnnotationNames.ValueGenerationStrategy)?.GetConfigurationSource(); + + private static void CheckValueGenerationStrategy(IReadOnlyProperty property, MySQLValueGenerationStrategy? value) + { + if (value != null) + { + var propertyType = property.ClrType; + + if (value == MySQLValueGenerationStrategy.IdentityColumn && !IsCompatibleIdentityColumn(property)) + { + throw new ArgumentException(string.Format(MySQLStrings.WrongIdentityType, + property.DeclaringEntityType.DisplayName(), property.Name, propertyType.ShortDisplayName())); + } + + if (value == MySQLValueGenerationStrategy.ComputedColumn && !IsCompatibleComputedColumn(property)) + { + throw new ArgumentException(string.Format(MySQLStrings.WrongComputedType, + property.DeclaringEntityType.DisplayName(), property.Name, propertyType.ShortDisplayName())); + } + } + } + } +} diff --git a/EFCore/src/Extensions/MySQLServiceCollectionExtensions.cs b/EFCore/src/Extensions/MySQLServiceCollectionExtensions.cs new file mode 100644 index 000000000..42317fa9b --- /dev/null +++ b/EFCore/src/Extensions/MySQLServiceCollectionExtensions.cs @@ -0,0 +1,171 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Metadata.Conventions.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Storage; +using Microsoft.EntityFrameworkCore.Update; +using Microsoft.EntityFrameworkCore.ValueGeneration; +using Microsoft.Extensions.DependencyInjection; +using MySql.EntityFrameworkCore.Diagnostics.Internal; +using MySql.EntityFrameworkCore.Infrastructure; +using MySql.EntityFrameworkCore.Infrastructure.Internal; +using MySql.EntityFrameworkCore.Internal; +using MySql.EntityFrameworkCore.Metadata.Conventions; +using MySql.EntityFrameworkCore.Metadata.Internal; +using MySql.EntityFrameworkCore.Migrations; +using MySql.EntityFrameworkCore.Migrations.Internal; +using MySql.EntityFrameworkCore.Query; +using MySql.EntityFrameworkCore.Query.Internal; +using MySql.EntityFrameworkCore.Storage.Internal; +using MySql.EntityFrameworkCore.Update; +using MySql.EntityFrameworkCore.Utils; +using MySql.EntityFrameworkCore.ValueGeneration.Internal; +using System; + +namespace MySql.EntityFrameworkCore.Extensions +{ + /// + /// MySQL extension class for . + /// + public static class MySQLServiceCollectionExtensions + { + /// + /// + /// Registers the given Entity Framework as a service in the + /// and configures it to connect to a MySQL database. + /// + /// + /// This method is a shortcut for configuring a to use MySQL. + /// + /// + /// Use this method when using dependency injection in your application, such as with ASP.NET Core. + /// For applications that don't use dependency injection, consider creating + /// instances directly with its constructor. The method can then be + /// overridden to configure the MySQL provider and connection string. + /// + /// + /// To configure the for the context, either override the + /// method in your derived context, or supply + /// an optional action to configure the for the context. + /// + /// + /// See Using DbContext with dependency injection for more information. + /// + /// + /// The type of context to be registered. + /// The to add services to. + /// The connection string of the database to connect to. + /// An optional action to enable additional MySQL server-specific configuration. + /// An optional action to configure the for the context. + /// The same service collection so that multiple calls can be chained. + public static IServiceCollection AddMySQLServer( + this IServiceCollection serviceCollection, + string connectionString, + Action? sqlServerOptionsAction = null, + Action? optionsAction = null) + where TContext : DbContext + { + Check.NotNull(serviceCollection, nameof(serviceCollection)); + Check.NotEmpty(connectionString, nameof(connectionString)); + + return serviceCollection.AddDbContext( + (serviceProvider, options) => + { + optionsAction?.Invoke(options); + options.UseMySQL(connectionString, sqlServerOptionsAction); + }); + } + + /// + /// + /// Adds the services required by the MySQL database provider for Entity Framework + /// to an . + /// + /// + /// Warning: Do not call this method by mistake. Instead, it is more likely that you need to call . + /// + /// + /// Calling this method is no longer necessary when building most applications, including those that + /// use dependency injection in ASP.NET or elsewhere. + /// It is only needed when building the internal service provider for use with + /// the method. + /// This is not recommend other than for some advanced scenarios. + /// + /// + /// The to add services to. + /// + /// The same service collection so that multiple calls can be chained. + /// + public static IServiceCollection AddEntityFrameworkMySQL(this IServiceCollection services) + { + var builder = new EntityFrameworkRelationalServicesBuilder(services) + .TryAdd() + .TryAdd>() + .TryAdd() + .TryAdd() + .TryAdd() + .TryAdd() + .TryAdd() + .TryAdd(p => p.GetRequiredService()) + .TryAdd() + .TryAdd() + .TryAdd(p => p.GetRequiredService()) + .TryAdd() + .TryAdd() + .TryAdd() + .TryAdd() + .TryAdd() + .TryAdd() + .TryAdd() + .TryAdd() + .TryAdd() + .TryAdd() + .TryAdd() + .TryAdd() + .TryAdd(p => p.GetRequiredService()) + .TryAdd() + .TryAdd() + .TryAdd() + .TryAdd() + .TryAddProviderSpecificServices(m => m + .TryAddSingleton() + .TryAddScoped() + .TryAddScoped()); + + builder.TryAddCoreServices(); + + return services; + } + } +} diff --git a/EFCore/src/Extensions/MySQLTypeBaseExtensions.cs b/EFCore/src/Extensions/MySQLTypeBaseExtensions.cs new file mode 100644 index 000000000..ba1e608bc --- /dev/null +++ b/EFCore/src/Extensions/MySQLTypeBaseExtensions.cs @@ -0,0 +1,60 @@ +// Copyright © 2023, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Metadata; +using MySql.EntityFrameworkCore.Metadata.Internal; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MySql.EntityFrameworkCore.Extensions +{ + /// + /// MySQL extension methods for type base. + /// + public static class MySQLTypeBaseExtensions + { + /// + /// Gets the MySQL character set for the table associated with this TypeBase. + /// + /// The TypeBase. + /// The name of the character set. + public static string? GetCharSet([NotNull] this IReadOnlyTypeBase typeBase) + => typeBase[MySQLAnnotationNames.Charset] as string; + + /// + /// Gets the MySQL collation for the table associated with this TypeBase. + /// + /// The TypeBase. + /// The name of the collation. + public static string? GetCollation([NotNull] this IReadOnlyTypeBase typeBase) + => typeBase[RelationalAnnotationNames.Collation] as string; + } +} diff --git a/EFCore/src/Extensions/MySqlIndexBuilderExtensions.cs b/EFCore/src/Extensions/MySqlIndexBuilderExtensions.cs new file mode 100644 index 000000000..43257933f --- /dev/null +++ b/EFCore/src/Extensions/MySqlIndexBuilderExtensions.cs @@ -0,0 +1,127 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using MySql.EntityFrameworkCore.Utils; + +namespace MySql.EntityFrameworkCore.Extensions +{ + /// + /// MySQL-specific extension methods for . + /// + public static class MySqlIndexBuilderExtensions + { + #region FullText + /// + /// Sets a value indicating whether the index is full text. + /// + /// The index builder. + /// The value to set. + /// An optional argument (for example, "ngram"), that will be used in an `WITH PARSER` clause. + /// The index builder. + public static IndexBuilder IsFullText([NotNull] this IndexBuilder indexBuilder, bool fullText = true, string parser = null) + { + Check.NotNull(indexBuilder, nameof(indexBuilder)); + + indexBuilder.Metadata.SetIsFullText(fullText); + indexBuilder.Metadata.SetFullTextParser(parser); + + return indexBuilder; + } + + /// + /// Sets a value indicating whether the index is full text. + /// + /// The index builder. + /// The value to set. + /// An optional argument (for example, "ngram") that will be used in an `WITH PARSER` clause. + /// The index builder. + public static IndexBuilder IsFullText([NotNull] this IndexBuilder indexBuilder, bool fullText = true, string parser = null) + => (IndexBuilder)((IndexBuilder)indexBuilder).IsFullText(fullText, parser); + + #endregion FullText + + #region Spatial + + /// + /// Sets a value indicating whether the index is spartial. + /// + /// The index builder. + /// The value to set. + /// The index builder. + public static IndexBuilder IsSpatial([NotNull] this IndexBuilder indexBuilder, bool spatial = true) + { + Check.NotNull(indexBuilder, nameof(indexBuilder)); + + indexBuilder.Metadata.SetIsSpatial(spatial); + + return indexBuilder; + } + + /// + /// Sets a value indicating whether the index is spartial. + /// + /// The index builder. + /// The value to set. + /// The index builder. + public static IndexBuilder IsSpatial([NotNull] this IndexBuilder indexBuilder, bool spatial = true) + => (IndexBuilder)((IndexBuilder)indexBuilder).IsSpatial(spatial); + + #endregion Spatial + + #region PrefixLength + + /// + /// Sets prefix lengths for the index. + /// + /// The index builder. + /// The prefix lengths to set in the order of the index columns where specified. + /// A value of `0` indicates, that the full length should be used for that column. + /// The index builder. + public static IndexBuilder HasPrefixLength([NotNull] this IndexBuilder indexBuilder, params int[] prefixLengths) + { + Check.NotNull(indexBuilder, nameof(indexBuilder)); + + indexBuilder.Metadata.SetPrefixLength(prefixLengths); + + return indexBuilder; + } + + /// + /// Sets prefix lengths for the index. + /// + /// The index builder. + /// The prefix lengths to set in the order of the index columns where specified. + /// A value of `0` indicates, that the full length should be used for that column. + /// The index builder. + public static IndexBuilder HasPrefixLength([NotNull] this IndexBuilder indexBuilder, params int[] prefixLengths) + => (IndexBuilder)HasPrefixLength((IndexBuilder)indexBuilder, prefixLengths); + + #endregion PrefixLength + } +} diff --git a/EFCore/src/Infrastructure/Internal/IMySQLOptions.cs b/EFCore/src/Infrastructure/Internal/IMySQLOptions.cs new file mode 100644 index 000000000..116f21644 --- /dev/null +++ b/EFCore/src/Infrastructure/Internal/IMySQLOptions.cs @@ -0,0 +1,55 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Infrastructure; +using MySql.Data.MySqlClient; + +namespace MySql.EntityFrameworkCore.Infrastructure.Internal +{ + /// + /// Options to set on the provider. + /// + public interface IMySQLOptions : ISingletonOptions + { + /// + /// The to be used by the connection. + /// + /// The character set. + CharacterSet? CharSet { get; } + /// + /// The connection settings. + /// + /// The connection string builder. + MySqlConnectionStringBuilder ConnectionSettings { get; } + /// + /// The specified . + /// + /// The SchemaNameTranslator. + MySQLSchemaNameTranslator? SchemaNameTranslator { get; } + } +} diff --git a/EFCore/src/Infrastructure/Internal/MySQLOptionsExtension.cs b/EFCore/src/Infrastructure/Internal/MySQLOptionsExtension.cs new file mode 100644 index 000000000..e2fc4616d --- /dev/null +++ b/EFCore/src/Infrastructure/Internal/MySQLOptionsExtension.cs @@ -0,0 +1,156 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.Extensions.DependencyInjection; +using MySql.Data.MySqlClient; +using MySql.EntityFrameworkCore.Extensions; +using System.Collections.Generic; +using System.Globalization; +using System.Text; + +namespace MySql.EntityFrameworkCore.Infrastructure.Internal +{ + /// + /// Represents the implementation for MySQL. + /// + public class MySQLOptionsExtension : RelationalOptionsExtension + { + private DbContextOptionsExtensionInfo? _info; + private CharacterSet? _charset; + + /// + /// Constructor of . + /// + public MySQLOptionsExtension() + { + } + + /// + /// Creates a based on another . + /// + /// The to copy. + public MySQLOptionsExtension(MySQLOptionsExtension copyFrom) + : base(copyFrom) + { + _charset = copyFrom._charset; + } + + /// + /// Information/metadata about the extension. + /// + /// The information/metadata. + public override DbContextOptionsExtensionInfo Info + => _info ??= new ExtensionInfo(this); + + /// + /// Clones a object. + /// + /// A clone of this instance, which can be modified before being returned as immutable. + protected override RelationalOptionsExtension Clone() + => new MySQLOptionsExtension(this); + + /// + /// The to use. + /// + /// The character set. + public virtual CharacterSet? CharSet => _charset; + + /// + /// Returns a copy of the current instance configured with the specified character set. + /// + /// The to use. + /// A object with the specified . + public MySQLOptionsExtension WithCharSet(CharacterSet charSet) + { + var clone = (MySQLOptionsExtension)Clone(); + + clone._charset = charSet; + + return clone; + } + + /// + /// Adds the services required to make the selected options work. + /// + /// The collection to add services to. + public override void ApplyServices(IServiceCollection services) + => services.AddEntityFrameworkMySQL(); + + private sealed class ExtensionInfo : RelationalExtensionInfo + { + private int? _serviceProviderHash; + private string? _logFragment; + + public ExtensionInfo(IDbContextOptionsExtension extension) + : base(extension) + { + } + + private new MySQLOptionsExtension Extension + => (MySQLOptionsExtension)base.Extension; + + /// + public override bool IsDatabaseProvider => true; + + /// + public override string LogFragment + { + get + { + if (_logFragment == null) + { + var builder = new StringBuilder(); + + builder.Append(base.LogFragment); + + _logFragment = builder.ToString(); + } + + return _logFragment; + } + } + + /// + public override int GetServiceProviderHashCode() + { + if (_serviceProviderHash == null) + { + _serviceProviderHash = (base.GetServiceProviderHashCode() * 397) ^ (Extension.CharSet?.GetHashCode() ?? 0); + } + + return _serviceProviderHash.Value; + } + + /// + public override void PopulateDebugInfo(IDictionary debugInfo) + => debugInfo["MySQL:" + nameof(MySQLDbContextOptionsBuilder.CharSet)] + = (Extension.CharSet?.GetHashCode() ?? 0L).ToString(CultureInfo.InvariantCulture); + } + } +} diff --git a/EFCore/src/Infrastructure/MySQLDbContextOptionsBuilder.cs b/EFCore/src/Infrastructure/MySQLDbContextOptionsBuilder.cs new file mode 100644 index 000000000..b01a40fcf --- /dev/null +++ b/EFCore/src/Infrastructure/MySQLDbContextOptionsBuilder.cs @@ -0,0 +1,88 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage; +using MySql.Data.MySqlClient; +using MySql.EntityFrameworkCore.Infrastructure.Internal; +using MySql.EntityFrameworkCore.Internal; +using System; +using System.Collections.Generic; + +namespace MySql.EntityFrameworkCore.Infrastructure +{ + /// + /// Represents the implementation for MySQL. + /// + public class MySQLDbContextOptionsBuilder : RelationalDbContextOptionsBuilder + { + /// + /// Initializes a new instance of the class. + /// + /// The options builder. + public MySQLDbContextOptionsBuilder(DbContextOptionsBuilder optionsBuilder) + : base(optionsBuilder) + { + } + + internal virtual MySQLDbContextOptionsBuilder CharSet(CharacterSet charSet) + => WithOption(e => e.WithCharSet(charSet)); + + /// + /// + /// Configures the context to use the default retrying . + /// + /// + public virtual MySQLDbContextOptionsBuilder EnableRetryOnFailure() + => ExecutionStrategy(c => new MySQLRetryingExecutionStrategy(c)); + + /// + /// + /// Configures the context to use the default retrying . + /// + /// + /// The maximum number of retry attempts. + public virtual MySQLDbContextOptionsBuilder EnableRetryOnFailure(int maxRetryCount) + => ExecutionStrategy(c => new MySQLRetryingExecutionStrategy(c, maxRetryCount)); + + /// + /// + /// Configures the context to use the default retrying . + /// + /// + /// The maximum number of retry attempts. + /// The maximum delay between retries. + /// Additional SQL error numbers that should be considered transient. + public virtual MySQLDbContextOptionsBuilder EnableRetryOnFailure( + int maxRetryCount, + TimeSpan maxRetryDelay, + ICollection? errorNumbersToAdd) + => ExecutionStrategy(c => new MySQLRetryingExecutionStrategy(c, maxRetryCount, maxRetryDelay, errorNumbersToAdd!)); + } +} diff --git a/EFCore/src/Infrastructure/MySQLSchemaBehavior.cs b/EFCore/src/Infrastructure/MySQLSchemaBehavior.cs new file mode 100644 index 000000000..75f1002e7 --- /dev/null +++ b/EFCore/src/Infrastructure/MySQLSchemaBehavior.cs @@ -0,0 +1,58 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySql.EntityFrameworkCore.Infrastructure +{ + /// + /// Translates the specified schema and object to an output object named for the schema being used. + /// + /// schema name + /// object name + public delegate string MySQLSchemaNameTranslator(string schemaName, string objectName); + + /// + /// Represents the behavior of the schema. + /// + public enum MySqlSchemaBehavior + { + /// + /// Throws an exception if a schema is being used. All specified translator delegates are ignored. + /// This is the default. + /// + Throw, + /// + /// Silently ignores any schema definitions. All specified translator delegates are ignored. + /// + Ignore, + /// + /// Uses the specified translator delegate to translate an input schema and object name to + /// an output object named for the schema being used. + /// + Translate + } +} diff --git a/EFCore/src/Internal/MySQLModelValidator.cs b/EFCore/src/Internal/MySQLModelValidator.cs new file mode 100644 index 000000000..3ffd0388f --- /dev/null +++ b/EFCore/src/Internal/MySQLModelValidator.cs @@ -0,0 +1,51 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; + +namespace MySql.EntityFrameworkCore.Internal +{ + internal class MySQLModelValidator : RelationalModelValidator + { + public MySQLModelValidator( + [NotNull] ModelValidatorDependencies dependencies, + [NotNull] RelationalModelValidatorDependencies relationalDependencies) + : base(dependencies, relationalDependencies) + { + } + + /// + public override void Validate(IModel model, IDiagnosticsLogger logger) + { + base.Validate(model, logger); + } + } +} diff --git a/EFCore/src/Internal/MySQLOptions.cs b/EFCore/src/Internal/MySQLOptions.cs new file mode 100644 index 000000000..de900fed8 --- /dev/null +++ b/EFCore/src/Internal/MySQLOptions.cs @@ -0,0 +1,64 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Infrastructure; +using MySql.Data.MySqlClient; +using MySql.EntityFrameworkCore.Infrastructure; +using MySql.EntityFrameworkCore.Infrastructure.Internal; + +namespace MySql.EntityFrameworkCore.Internal +{ + internal class MySQLOptions : IMySQLOptions + { + public virtual CharacterSet? CharSet { get; private set; } + public virtual MySqlConnectionStringBuilder ConnectionSettings { get; private set; } + public virtual MySQLSchemaNameTranslator? SchemaNameTranslator { get; private set; } + + public MySQLOptions() + { + CharSet = new CharacterSet("utf8mb4", 4); + ConnectionSettings = new MySqlConnectionStringBuilder(); + } + + public void Initialize(IDbContextOptions options) + { + var mySQLOptions = options.FindExtension() ?? new MySQLOptionsExtension(); + ConnectionSettings = GetConnectionSettings(mySQLOptions); + } + + public void Validate(IDbContextOptions options) + { + _ = options.FindExtension() ?? new MySQLOptionsExtension(); + } + + private static MySqlConnectionStringBuilder GetConnectionSettings(MySQLOptionsExtension relationalOptions) + => relationalOptions.Connection != null + ? new MySqlConnectionStringBuilder(relationalOptions.Connection.ConnectionString) + : new MySqlConnectionStringBuilder(relationalOptions.ConnectionString); + } +} diff --git a/EFCore/src/Internal/MySQLRetryingExecutionStrategy.cs b/EFCore/src/Internal/MySQLRetryingExecutionStrategy.cs new file mode 100644 index 000000000..980fce139 --- /dev/null +++ b/EFCore/src/Internal/MySQLRetryingExecutionStrategy.cs @@ -0,0 +1,126 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Storage; +using MySql.Data.MySqlClient; +using MySql.EntityFrameworkCore.Storage.Internal; +using System; +using System.Collections.Generic; + +namespace MySql.EntityFrameworkCore.Internal +{ + internal class MySQLRetryingExecutionStrategy : ExecutionStrategy + { + private readonly ICollection _additionalErrorNumbers; + + /// + /// Creates a new instance of . + /// + /// The context on which the operations will be invoked. + /// + /// The default retry limit is 6, which means that the total amount of time spent before failing is about a minute. + /// + public MySQLRetryingExecutionStrategy( + [NotNull] DbContext context) + : this(context, DefaultMaxRetryCount) + { + } + + /// + /// Creates a new instance of . + /// + /// Parameter object containing service dependencies. + public MySQLRetryingExecutionStrategy( + [NotNull] ExecutionStrategyDependencies dependencies) + : this(dependencies, DefaultMaxRetryCount) + { + } + + /// + /// Creates a new instance of . + /// + /// The context used to invoke the operations. + /// The maximum number of retry attempts. + public MySQLRetryingExecutionStrategy( + [NotNull] DbContext context, + int maxRetryCount) + : this(context, maxRetryCount, DefaultMaxDelay, errorNumbersToAdd: null) + { + } + + /// + /// Creates a new instance of . + /// + /// Parameter object containing service dependencies. + /// The maximum number of retry attempts. + public MySQLRetryingExecutionStrategy( + [NotNull] ExecutionStrategyDependencies dependencies, + int maxRetryCount) + : this(dependencies, maxRetryCount, DefaultMaxDelay, errorNumbersToAdd: null) + { + } + + /// + /// Creates a new instance of . + /// + /// The context used to invoke the operations. + /// The maximum number of retry attempts. + /// The maximum delay between retries. + /// Additional SQL error numbers that should be considered transient. + public MySQLRetryingExecutionStrategy( + [NotNull] DbContext context, + int maxRetryCount, + TimeSpan maxRetryDelay, + ICollection? errorNumbersToAdd) + : base(context, + maxRetryCount, + maxRetryDelay) + => _additionalErrorNumbers = errorNumbersToAdd!; + + /// + /// Creates a new instance of . + /// + /// Parameter object containing service dependencies. + /// The maximum number of retry attempts. + /// The maximum delay between retries. + /// Additional SQL error numbers that should be considered transient. + public MySQLRetryingExecutionStrategy( + [NotNull] ExecutionStrategyDependencies dependencies, + int maxRetryCount, + TimeSpan maxRetryDelay, + ICollection? errorNumbersToAdd) + : base(dependencies, maxRetryCount, maxRetryDelay) + => _additionalErrorNumbers = errorNumbersToAdd!; + + protected override bool ShouldRetryOn(Exception exception) + => exception is MySqlException mySqlException && + _additionalErrorNumbers?.Contains(mySqlException.Number) == true + || MySQLTransientExceptionDetector.ShouldRetryOn(exception); + } +} diff --git a/EFCore/src/Internal/MySQLValueGenerationStrategyCompatibility.cs b/EFCore/src/Internal/MySQLValueGenerationStrategyCompatibility.cs new file mode 100644 index 000000000..2697dc2e7 --- /dev/null +++ b/EFCore/src/Internal/MySQLValueGenerationStrategyCompatibility.cs @@ -0,0 +1,61 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Infrastructure; +using MySql.EntityFrameworkCore.Metadata; +using MySql.EntityFrameworkCore.Metadata.Internal; +using System.Linq; + +namespace MySql.EntityFrameworkCore.Internal +{ + internal static class MySQLValueGenerationStrategyCompatibility + { + internal static MySQLValueGenerationStrategy? GetValueGenerationStrategy(IAnnotation[] annotations) + { + var valueGenerationStrategy = annotations.FirstOrDefault(a => a.Name == MySQLAnnotationNames.ValueGenerationStrategy)?.Value as MySQLValueGenerationStrategy?; + + if (!valueGenerationStrategy.HasValue || + valueGenerationStrategy == MySQLValueGenerationStrategy.None) + { + var generatedOnAddAnnotation = annotations.FirstOrDefault(a => a.Name == MySQLAnnotationNames.LegacyValueGeneratedOnAdd)?.Value; + if (generatedOnAddAnnotation != null && (bool)generatedOnAddAnnotation) + { + valueGenerationStrategy = MySQLValueGenerationStrategy.IdentityColumn; + } + + var generatedOnAddOrUpdateAnnotation = annotations.FirstOrDefault(a => a.Name == MySQLAnnotationNames.LegacyValueGeneratedOnAddOrUpdate)?.Value; + if (generatedOnAddOrUpdateAnnotation != null && (bool)generatedOnAddOrUpdateAnnotation) + { + valueGenerationStrategy = MySQLValueGenerationStrategy.ComputedColumn; + } + } + + return valueGenerationStrategy; + } + } +} diff --git a/EFCore/src/Metadata/Conventions/MySQLConventionSetBuilder.cs b/EFCore/src/Metadata/Conventions/MySQLConventionSetBuilder.cs new file mode 100644 index 000000000..3566c9fab --- /dev/null +++ b/EFCore/src/Metadata/Conventions/MySQLConventionSetBuilder.cs @@ -0,0 +1,110 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Conventions; +using Microsoft.EntityFrameworkCore.Metadata.Conventions.Infrastructure; +using Microsoft.Extensions.DependencyInjection; +using MySql.EntityFrameworkCore.Extensions; + +namespace MySql.EntityFrameworkCore.Metadata.Conventions +{ + /// + /// + /// A convention set builder for MySQL. + /// + /// + /// The service lifetime is and multiple registrations + /// are allowed. This means that each instance uses its own + /// set of instances of this service. + /// The implementations may depend on other services registered with any lifetime. + /// The implementations do not need to be thread-safe. + /// + /// + internal class MySQLConventionSetBuilder : RelationalConventionSetBuilder + { + public MySQLConventionSetBuilder( + [NotNull] ProviderConventionSetBuilderDependencies dependencies, + [NotNull] RelationalConventionSetBuilderDependencies relationalDependencies) + : base(dependencies, relationalDependencies) + { + } + + /// + /// Builds and returns the convention set for MySQL. + /// + /// The convention set for MySQL. + public override ConventionSet CreateConventionSet() + { + var conventionSet = base.CreateConventionSet(); + + conventionSet.ModelInitializedConventions.Add(new RelationalMaxIdentifierLengthConvention(64, Dependencies, RelationalDependencies)); + + conventionSet.PropertyAddedConventions.Add(new MySqlCharsetAttributeConvention(Dependencies)); + conventionSet.PropertyAddedConventions.Add(new MySqlCollationAttributeConvention(Dependencies)); + conventionSet.EntityTypeAddedConventions.Add(new MySqlEntityCharsetAttributeConvention(Dependencies)); + conventionSet.EntityTypeAddedConventions.Add(new MySqlEntityCollationAttributeConvention(Dependencies)); + ValueGenerationConvention valueGeneratorConvention = new MySQLValueGenerationConvention(Dependencies, RelationalDependencies); + ReplaceConvention(conventionSet.EntityTypeBaseTypeChangedConventions, valueGeneratorConvention); + ReplaceConvention(conventionSet.EntityTypePrimaryKeyChangedConventions, valueGeneratorConvention); + ReplaceConvention(conventionSet.ForeignKeyAddedConventions, valueGeneratorConvention); + ReplaceConvention(conventionSet.ForeignKeyRemovedConventions, valueGeneratorConvention); + + conventionSet.PropertyAnnotationChangedConventions.Add((MySQLValueGenerationConvention)valueGeneratorConvention); + + return conventionSet; + } + + /// + /// + /// Call this method to build a for MySQL when using + /// the outside of . + /// + /// + /// Note that it is unusual to use this method. + /// Consider using in the normal way instead. + /// + /// + /// The convention set. + public static ConventionSet Build() + { + var serviceProvider = new ServiceCollection() + .AddEntityFrameworkMySQL() + .AddDbContext(o => o.UseMySQL("Server=.")) + .BuildServiceProvider(); + + using (var serviceScope = serviceProvider.GetRequiredService().CreateScope()) + { + using (var context = serviceScope.ServiceProvider.GetService()) + { + return ConventionSet.CreateConventionSet(context!); + } + } + } + } +} diff --git a/EFCore/src/Metadata/Conventions/MySQLValueGenerationConvention.cs b/EFCore/src/Metadata/Conventions/MySQLValueGenerationConvention.cs new file mode 100644 index 000000000..4088d5797 --- /dev/null +++ b/EFCore/src/Metadata/Conventions/MySQLValueGenerationConvention.cs @@ -0,0 +1,124 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using Microsoft.EntityFrameworkCore.Metadata.Conventions; +using Microsoft.EntityFrameworkCore.Metadata.Conventions.Infrastructure; +using MySql.EntityFrameworkCore.Extensions; +using MySql.EntityFrameworkCore.Metadata.Internal; + +namespace MySql.EntityFrameworkCore.Metadata.Conventions +{ + /// + /// A convention that configures store value generation as on properties that are + /// part of the primary key and not part of any foreign keys, are configured to have a database default value, or are + /// configured to use a . + /// It also configures properties as if they are configured as computed columns. + /// + internal class MySQLValueGenerationConvention : RelationalValueGenerationConvention + { + /// + /// Creates a new instance of . + /// + /// Parameter object containing dependencies for this convention. + /// Parameter object containing relational dependencies for this convention. + public MySQLValueGenerationConvention( + [NotNull] ProviderConventionSetBuilderDependencies dependencies, + [NotNull] RelationalConventionSetBuilderDependencies relationalDependencies) + : base(dependencies, relationalDependencies) + { + } + + /// + /// Called after an annotation is changed on a property. + /// + /// The builder for the property. + /// The annotation name. + /// The new annotation. + /// The old annotation. + /// Additional information associated with convention execution. + public override void ProcessPropertyAnnotationChanged( + IConventionPropertyBuilder propertyBuilder, + string name, + IConventionAnnotation? annotation, + IConventionAnnotation? oldAnnotation, + IConventionContext context) + { + if (name == MySQLAnnotationNames.ValueGenerationStrategy) + { + propertyBuilder.ValueGenerated(GetValueGenerated(propertyBuilder.Metadata)); + return; + } + + base.ProcessPropertyAnnotationChanged(propertyBuilder, name, annotation, oldAnnotation, context); + } + + /// + /// Indicates the store value generation strategy to set for the given property. + /// + /// The property. + /// The store value generation strategy to set for the given property. + protected override ValueGenerated? GetValueGenerated(IConventionProperty property) + { + var tableName = property.DeclaringEntityType.GetTableName(); + if (tableName == null) + return null; + + return GetValueGenerated(property, StoreObjectIdentifier.Table(tableName, property.DeclaringEntityType.GetSchema())); + } + + /// + /// Returns the store value generation strategy to set for the given property. + /// + /// The property. + /// The identifier of the store object. + /// The store value generation strategy to set for the given property. + public static new ValueGenerated? GetValueGenerated([NotNull] IReadOnlyProperty property, in StoreObjectIdentifier storeObject) + { + var valueGenerated = RelationalValueGenerationConvention.GetValueGenerated(property, storeObject); + if (valueGenerated != null) + return valueGenerated; + + var valueGenerationStrategy = property.GetValueGenerationStrategy(storeObject); + if (valueGenerationStrategy.HasValue) + { + switch (valueGenerationStrategy.Value) + { + case MySQLValueGenerationStrategy.IdentityColumn: + return ValueGenerated.OnAdd; + case MySQLValueGenerationStrategy.ComputedColumn: + return ValueGenerated.OnAddOrUpdate; + } + } + + return null; + } + } +} diff --git a/EFCore/src/Metadata/Conventions/MySqlCharsetAttributeConvention.cs b/EFCore/src/Metadata/Conventions/MySqlCharsetAttributeConvention.cs new file mode 100644 index 000000000..521cc2471 --- /dev/null +++ b/EFCore/src/Metadata/Conventions/MySqlCharsetAttributeConvention.cs @@ -0,0 +1,62 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using Microsoft.EntityFrameworkCore.Metadata.Conventions; +using Microsoft.EntityFrameworkCore.Metadata.Conventions.Infrastructure; +using MySql.EntityFrameworkCore.DataAnnotations; +using MySql.EntityFrameworkCore.Metadata.Internal; +using System.Reflection; + +namespace MySql.EntityFrameworkCore.Metadata.Conventions +{ + /// + /// Sets a character-set attribute for a property. + /// + internal class MySqlCharsetAttributeConvention : PropertyAttributeConventionBase + { + /// + /// Creates a new instance of . + /// + /// Parameter object containing dependencies for this convention. + public MySqlCharsetAttributeConvention([NotNull] ProviderConventionSetBuilderDependencies dependencies) + : base(dependencies) + { } + + protected override void ProcessPropertyAdded( + [NotNull] IConventionPropertyBuilder propertyBuilder, + [NotNull] MySQLCharsetAttribute attribute, + [NotNull] MemberInfo clrMember, + [NotNull] IConventionContext context) + { + propertyBuilder.Metadata.SetAnnotation(MySQLAnnotationNames.Charset, + attribute.Charset, + true); + } + } +} diff --git a/EFCore/src/Metadata/Conventions/MySqlCollationAttributeConvention.cs b/EFCore/src/Metadata/Conventions/MySqlCollationAttributeConvention.cs new file mode 100644 index 000000000..9582ae16a --- /dev/null +++ b/EFCore/src/Metadata/Conventions/MySqlCollationAttributeConvention.cs @@ -0,0 +1,62 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using Microsoft.EntityFrameworkCore.Metadata.Conventions; +using Microsoft.EntityFrameworkCore.Metadata.Conventions.Infrastructure; +using MySql.EntityFrameworkCore.DataAnnotations; +using MySql.EntityFrameworkCore.Metadata.Internal; +using System.Reflection; + +namespace MySql.EntityFrameworkCore.Metadata.Conventions +{ + /// + /// Represents a collation attribute for a property. + /// + internal class MySqlCollationAttributeConvention : PropertyAttributeConventionBase + { + /// + /// Creates a new instance of . + /// + /// Parameter object containing dependencies for this convention. + internal MySqlCollationAttributeConvention([NotNull] ProviderConventionSetBuilderDependencies dependencies) + : base(dependencies) + { } + + protected override void ProcessPropertyAdded( + [NotNull] IConventionPropertyBuilder propertyBuilder, + [NotNull] MySQLCollationAttribute attribute, + [NotNull] MemberInfo clrMember, + [NotNull] IConventionContext context) + { + propertyBuilder.Metadata.SetAnnotation(MySQLAnnotationNames.Collation, + attribute.Collation, + true); + } + } +} diff --git a/EFCore/src/Metadata/Conventions/MySqlEntityCharsetAttributeConvention.cs b/EFCore/src/Metadata/Conventions/MySqlEntityCharsetAttributeConvention.cs new file mode 100644 index 000000000..9721eac51 --- /dev/null +++ b/EFCore/src/Metadata/Conventions/MySqlEntityCharsetAttributeConvention.cs @@ -0,0 +1,88 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using Microsoft.EntityFrameworkCore.Metadata.Conventions; +using Microsoft.EntityFrameworkCore.Metadata.Conventions.Infrastructure; +using MySql.EntityFrameworkCore.DataAnnotations; +using MySql.EntityFrameworkCore.Metadata.Internal; + +namespace MySql.EntityFrameworkCore.Metadata.Conventions +{ +#if !NET8_0_OR_GREATER + /// + /// Represents a character-set attribute for an entity. + /// + internal class MySqlEntityCharsetAttributeConvention : EntityTypeAttributeConventionBase + { + /// + /// Creates a new instance of . + /// + /// Parameter object containing dependencies for this convention. + public MySqlEntityCharsetAttributeConvention([NotNull] ProviderConventionSetBuilderDependencies dependencies) + : base(dependencies) + { } + + protected override void ProcessEntityTypeAdded( + [NotNull] IConventionEntityTypeBuilder entityTypeBuilder, + [NotNull] MySQLCharsetAttribute attribute, + [NotNull] IConventionContext context) + { + entityTypeBuilder.Metadata.SetAnnotation( + MySQLAnnotationNames.Charset, + attribute.Charset, + true); + } + } +#else + /// + /// Represents a character-set attribute for a Type. + /// + internal class MySqlEntityCharsetAttributeConvention : TypeAttributeConventionBase + { + /// + /// Creates a new instance of . + /// + /// Parameter object containing dependencies for this convention. + public MySqlEntityCharsetAttributeConvention([NotNull] ProviderConventionSetBuilderDependencies dependencies) + : base(dependencies) + { } + + protected override void ProcessEntityTypeAdded( + [NotNull] IConventionEntityTypeBuilder entityTypeBuilder, + [NotNull] MySQLCharsetAttribute attribute, + [NotNull] IConventionContext context) + { + entityTypeBuilder.Metadata.SetAnnotation( + MySQLAnnotationNames.Charset, + attribute.Charset, + true); + } + } +#endif +} diff --git a/EFCore/src/Metadata/Conventions/MySqlEntityCollationAttributeConvention.cs b/EFCore/src/Metadata/Conventions/MySqlEntityCollationAttributeConvention.cs new file mode 100644 index 000000000..5c2ea15c3 --- /dev/null +++ b/EFCore/src/Metadata/Conventions/MySqlEntityCollationAttributeConvention.cs @@ -0,0 +1,88 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using Microsoft.EntityFrameworkCore.Metadata.Conventions; +using Microsoft.EntityFrameworkCore.Metadata.Conventions.Infrastructure; +using MySql.EntityFrameworkCore.DataAnnotations; +using MySql.EntityFrameworkCore.Metadata.Internal; + +namespace MySql.EntityFrameworkCore.Metadata.Conventions +{ +#if !NET8_0_OR_GREATER + /// + /// Represents a collation attribute for an entity. + /// + internal class MySqlEntityCollationAttributeConvention : EntityTypeAttributeConventionBase + { + /// + /// Creates a new instance of . + /// + /// Parameter object containing dependencies for this convention. + internal MySqlEntityCollationAttributeConvention([NotNull] ProviderConventionSetBuilderDependencies dependencies) + : base(dependencies) + { } + + protected override void ProcessEntityTypeAdded( + [NotNull] IConventionEntityTypeBuilder entityTypeBuilder, + [NotNull] MySQLCollationAttribute attribute, + [NotNull] IConventionContext context) + { + entityTypeBuilder.Metadata.SetAnnotation( + MySQLAnnotationNames.Collation, + attribute.Collation, + true); + } + } +#else + /// + /// Represents a collation attribute for an Type. + /// + internal class MySqlEntityCollationAttributeConvention : TypeAttributeConventionBase + { + /// + /// Creates a new instance of . + /// + /// Parameter object containing dependencies for this convention. + internal MySqlEntityCollationAttributeConvention([NotNull] ProviderConventionSetBuilderDependencies dependencies) + : base(dependencies) + { } + + protected override void ProcessEntityTypeAdded( + [NotNull] IConventionEntityTypeBuilder entityTypeBuilder, + [NotNull] MySQLCollationAttribute attribute, + [NotNull] IConventionContext context) + { + entityTypeBuilder.Metadata.SetAnnotation( + MySQLAnnotationNames.Collation, + attribute.Collation, + true); + } + } +#endif +} diff --git a/EFCore/src/Metadata/Internal/MySQLAnnotationNames.cs b/EFCore/src/Metadata/Internal/MySQLAnnotationNames.cs new file mode 100644 index 000000000..b60e8c7ca --- /dev/null +++ b/EFCore/src/Metadata/Internal/MySQLAnnotationNames.cs @@ -0,0 +1,51 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySql.EntityFrameworkCore.Metadata.Internal +{ + /// + /// Provides names for MySQL annotations. + /// + internal static class MySQLAnnotationNames + { + public const string Prefix = "MySQL:"; + + public const string ValueGenerationStrategy = Prefix + "ValueGenerationStrategy"; + public const string LegacyValueGeneratedOnAddOrUpdate = Prefix + "ValueGeneratedOnAddOrUpdate"; + public const string LegacyValueGeneratedOnAdd = Prefix + "ValueGeneratedOnAdd"; + public const string FullTextParser = Prefix + "FullTextParser"; + public const string FullTextIndex = Prefix + "FullTextIndex"; + public const string SpatialIndex = Prefix + "SpatialIndex"; + public const string DefaultValueSql = Prefix + "DefaultValueSql"; + public const string Charset = Prefix + "Charset"; + public const string Collation = Prefix + "Collation"; + public const string IndexPrefixLength = Prefix + "IndexPrefixLength"; + public const string StoreOptions = Prefix + "StoreOptions"; + public const string MemoryOptimized = Prefix + "MemoryOptimized"; + } +} diff --git a/EFCore/src/Metadata/Internal/MySQLAnnotationProvider.cs b/EFCore/src/Metadata/Internal/MySQLAnnotationProvider.cs new file mode 100644 index 000000000..15783391d --- /dev/null +++ b/EFCore/src/Metadata/Internal/MySQLAnnotationProvider.cs @@ -0,0 +1,299 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Metadata.Internal; +using MySql.EntityFrameworkCore.Extensions; +using MySql.EntityFrameworkCore.Infrastructure.Internal; +using MySql.EntityFrameworkCore.Storage.Internal; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace MySql.EntityFrameworkCore.Metadata.Internal +{ + internal class MySQLAnnotationProvider : RelationalAnnotationProvider + { + [NotNull] private readonly IMySQLOptions _options; + + public MySQLAnnotationProvider( + [NotNull] RelationalAnnotationProviderDependencies dependencies, + [NotNull] IMySQLOptions options) + : base(dependencies) + { + _options = options; + } + + public override IEnumerable For(IRelationalModel model, bool designTime) + { + if (!designTime) + { + yield break; + } + + if (GetActualModelCharSet(model.Model) is string charSet) + { + yield return new Annotation(MySQLAnnotationNames.Charset, charSet); + } + } + + public override IEnumerable For(ITable table, bool designTime) + { + if (!designTime) + { + yield break; + } +#if NET8_0_OR_GREATER + var entityType = table.EntityTypeMappings.First().TypeBase; + if (GetActualTypeBaseCharSet(entityType) is string charSet) + yield return new Annotation(MySQLAnnotationNames.Charset, charSet); + + if (GetActualTypeBaseCollation(entityType) is string collation) + yield return new Annotation(RelationalAnnotationNames.Collation, collation); +#else + var entityType = table.EntityTypeMappings.First().EntityType; + if (GetActualEntityTypeCharSet(entityType) is string charSet) + yield return new Annotation(MySQLAnnotationNames.Charset, charSet); + + if (GetActualEntityTypeCollation(entityType) is string collation) + yield return new Annotation(RelationalAnnotationNames.Collation, collation); +#endif + foreach (var annotation in entityType.GetAnnotations().Where(a => a.Name is MySQLAnnotationNames.StoreOptions)) + yield return annotation; + } + + public override IEnumerable For(IUniqueConstraint constraint, bool designTime) + { + if (!designTime) + yield break; + + var key = constraint.MappedKeys.First(); + + var prefixLength = key.PrefixLength(); + if (prefixLength != null && prefixLength.Length > 0) + yield return new Annotation(MySQLAnnotationNames.IndexPrefixLength, prefixLength); + } + + public override IEnumerable For(ITableIndex index, bool designTime) + { + if (!designTime) + yield break; + + var modelIndex = index.MappedIndexes.First(); + + var prefixLength = modelIndex.PrefixLength(); + if (prefixLength != null && prefixLength.Length > 0) + yield return new Annotation(MySQLAnnotationNames.IndexPrefixLength, prefixLength); + + var isFullText = modelIndex.IsFullText(); + if (isFullText.HasValue) + yield return new Annotation(MySQLAnnotationNames.FullTextIndex, isFullText.Value); + + var fullTextParser = modelIndex.FullTextParser(); + if (!string.IsNullOrEmpty(fullTextParser)) + yield return new Annotation(MySQLAnnotationNames.FullTextParser, fullTextParser); + + var isSpatial = modelIndex.IsSpatial(); + if (isSpatial.HasValue) + yield return new Annotation(MySQLAnnotationNames.SpatialIndex, isSpatial.Value); + } + + public override IEnumerable For(IColumn column, bool designTime) + { + if (!designTime) + yield break; + + var table = StoreObjectIdentifier.Table(column.Table.Name, column.Table.Schema); + var properties = column.PropertyMappings.Select(m => m.Property).ToArray(); +#if NET8_0_OR_GREATER + if (column.PropertyMappings.Where(m => m.TableMapping.IsSharedTablePrincipal ?? true && m.TableMapping.TypeBase == m.Property.DeclaringType) + .Select(m => m.Property) + .FirstOrDefault(p => p.GetValueGenerationStrategy(table) == MySQLValueGenerationStrategy.IdentityColumn) is IProperty identityProperty) +#else + if (column.PropertyMappings.Where(m => m.TableMapping.IsSharedTablePrincipal && m.TableMapping.EntityType == m.Property.DeclaringEntityType) + .Select(m => m.Property) + .FirstOrDefault(p => p.GetValueGenerationStrategy(table) == MySQLValueGenerationStrategy.IdentityColumn) is IProperty identityProperty) +#endif + { + var valueGenerationStrategy = identityProperty.GetValueGenerationStrategy(table); + yield return new Annotation(MySQLAnnotationNames.ValueGenerationStrategy, valueGenerationStrategy); + } + else if (properties.FirstOrDefault(p => p.GetValueGenerationStrategy(table) == MySQLValueGenerationStrategy.ComputedColumn) is IProperty computedProperty) + { + var valueGenerationStrategy = computedProperty.GetValueGenerationStrategy(table); + yield return new Annotation(MySQLAnnotationNames.ValueGenerationStrategy, valueGenerationStrategy); + } + } + + protected virtual string GetActualModelCharSet(IModel model) + { + return model.GetCharSet() is null && model.GetCollation() is null ? _options.CharSet.name : model.GetCharSet()!; + } + + protected virtual string GetActualModelCollation(IModel model) + { + return model.GetCollation()!; + } + +#if NET8_0_OR_GREATER + protected virtual string? GetActualTypeBaseCharSet(ITypeBase typeBase) + { + var typeBaseCharSet = typeBase.GetCharSet(); + + if (typeBaseCharSet is not null) + return typeBaseCharSet; + + if (typeBaseCharSet is null) + { + var typeBaseCollation = typeBase.GetCollation(); + var actualModelCharSet = GetActualModelCharSet(typeBase.Model); + + if (typeBaseCollation is not null) + { + return actualModelCharSet is not null && typeBaseCollation.StartsWith(actualModelCharSet, StringComparison.OrdinalIgnoreCase) + ? actualModelCharSet : null; + } + + var actualModelCollation = GetActualModelCollation(typeBase.Model); + + if (actualModelCollation is not null) + { + return actualModelCharSet is not null && actualModelCollation.StartsWith(actualModelCharSet, StringComparison.OrdinalIgnoreCase) + ? actualModelCharSet : null; + } + return actualModelCharSet; + } + return null; + } + + protected virtual string? GetActualTypeBaseCollation(ITypeBase typeBase) + { + var typeBaseCollation = typeBase.GetCollation(); + + if (typeBaseCollation is not null) + return typeBaseCollation; + + if (typeBaseCollation is null) + { + var typeBaseCharSet = typeBase.GetCharSet(); + var actualModelCollation = GetActualModelCollation(typeBase.Model); + + if (typeBaseCharSet is not null) + { + return actualModelCollation is not null && actualModelCollation.StartsWith(typeBaseCharSet, StringComparison.OrdinalIgnoreCase) + ? actualModelCollation : null; + } + return actualModelCollation; + } + return null; + } +#else + protected virtual string? GetActualEntityTypeCharSet(IEntityType entityType) + { + var entityTypeCharSet = entityType.GetCharSet(); + + if (entityTypeCharSet is not null) + return entityTypeCharSet; + + if (entityTypeCharSet is null) + { + var entityTypeCollation = entityType.GetCollation(); + var actualModelCharSet = GetActualModelCharSet(entityType.Model); + + if (entityTypeCollation is not null) + { + return actualModelCharSet is not null && entityTypeCollation.StartsWith(actualModelCharSet, StringComparison.OrdinalIgnoreCase) + ? actualModelCharSet : null; + } + + var actualModelCollation = GetActualModelCollation(entityType.Model); + + if (actualModelCollation is not null) + { + return actualModelCharSet is not null && actualModelCollation.StartsWith(actualModelCharSet, StringComparison.OrdinalIgnoreCase) + ? actualModelCharSet : null; + } + return actualModelCharSet; + } + return null; + } + + protected virtual string? GetActualEntityTypeCollation(IEntityType entityType) + { + var entityTypeCollation = entityType.GetCollation(); + + if (entityTypeCollation is not null) + return entityTypeCollation; + + if (entityTypeCollation is null) + { + var entityTypeCharSet = entityType.GetCharSet(); + var actualModelCollation = GetActualModelCollation(entityType.Model); + + if (entityTypeCharSet is not null) + { + return actualModelCollation is not null && actualModelCollation.StartsWith(entityTypeCharSet, StringComparison.OrdinalIgnoreCase) + ? actualModelCollation : null; + } + return actualModelCollation; + } + return null; + } +#endif + + protected virtual string? GetActualPropertyCharSet(IProperty[] properties) + { +#if NET8_0_OR_GREATER + return properties.Select(p => p.GetCharSet()).FirstOrDefault(s => s is not null) ?? + properties.Select( + p => p.FindTypeMapping() is MySQLStringTypeMapping + ? GetActualTypeBaseCharSet(p.DeclaringType) is string charSet && + (p.GetCollation() is not string collation || + collation.StartsWith(charSet, StringComparison.OrdinalIgnoreCase)) + ? charSet + : null + : null) + .FirstOrDefault(s => s is not null); + } +#else + return properties.Select(p => p.GetCharSet()).FirstOrDefault(s => s is not null) ?? + properties.Select( + p => p.FindTypeMapping() is MySQLStringTypeMapping + ? GetActualEntityTypeCharSet(p.DeclaringEntityType) is string charSet && + (p.GetCollation() is not string collation || + collation.StartsWith(charSet, StringComparison.OrdinalIgnoreCase)) + ? charSet + : null + : null) + .FirstOrDefault(s => s is not null); + } +#endif + } +} diff --git a/EFCore/src/Metadata/MySQLValueGenerationStrategy.cs b/EFCore/src/Metadata/MySQLValueGenerationStrategy.cs new file mode 100644 index 000000000..730a80900 --- /dev/null +++ b/EFCore/src/Metadata/MySQLValueGenerationStrategy.cs @@ -0,0 +1,50 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySql.EntityFrameworkCore.Metadata +{ + /// + /// Defines two strategies to use across the EF Core stack when generating key values + /// from MySQL database columns. + /// + public enum MySQLValueGenerationStrategy + { + /// + /// No specific MySQL strategy. + /// + None, + /// + /// A pattern that uses a standard MySQL Identity column in the same way as EF6 and previous frameworks. + /// + IdentityColumn, + /// + /// Values of a generated column are computed from an expression included in the column definition. + /// + ComputedColumn + } +} diff --git a/EFCore/src/Migrations/Internal/MySQLHistoryRepository.cs b/EFCore/src/Migrations/Internal/MySQLHistoryRepository.cs new file mode 100644 index 000000000..ce1c8d1f0 --- /dev/null +++ b/EFCore/src/Migrations/Internal/MySQLHistoryRepository.cs @@ -0,0 +1,205 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage; +using Microsoft.Extensions.DependencyInjection; +using MySql.EntityFrameworkCore.Utils; +using System; +using System.Text; +using System.Threading.Tasks; +using System.Threading; + +namespace MySql.EntityFrameworkCore.Migrations.Internal +{ + /// + /// + /// The service lifetime is . This means that each + /// instance will use its own instance of this service. + /// The implementation may depend on other services registered with any lifetime. + /// The implementation does not need to be thread-safe. + /// + /// + internal partial class MySQLHistoryRepository : HistoryRepository + { + public MySQLHistoryRepository([NotNull] HistoryRepositoryDependencies dependencies) + : base(dependencies) + { + } +#if NET9_0_OR_GREATER + public override LockReleaseBehavior LockReleaseBehavior => LockReleaseBehavior.Connection; + + public override IMigrationsDatabaseLock AcquireDatabaseLock() + { + Dependencies.MigrationsLogger.AcquiringMigrationLock(); + + var dbLock = CreateMigrationDatabaseLock(); + Int64 result; + try + { + result = (Int64)CreateGetLockCommand().ExecuteScalar(CreateRelationalCommandParameters())!; + } + catch + { + try + { + dbLock.Dispose(); + } + catch + { + } + + throw; + } + + return result < 0 + ? throw new TimeoutException() + : dbLock; + } + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + public override async Task AcquireDatabaseLockAsync(CancellationToken cancellationToken = default) + { + Dependencies.MigrationsLogger.AcquiringMigrationLock(); + + var dbLock = CreateMigrationDatabaseLock(); + Int64 result; + try + { + result = (Int64)(await CreateGetLockCommand().ExecuteScalarAsync(CreateRelationalCommandParameters(), cancellationToken) + .ConfigureAwait(false))!; + } + catch + { + try + { + await dbLock.DisposeAsync().ConfigureAwait(false); + } + catch + { + } + + throw; + } + + return result < 0 + ? throw new TimeoutException() + : dbLock; + } + + private IRelationalCommand CreateGetLockCommand() + => Dependencies.RawSqlCommandBuilder.Build("SELECT GET_LOCK('__EFMigrationsLock',-1);", []).RelationalCommand; + + private MySQLMigrationDatabaseLock CreateMigrationDatabaseLock() + => new( + Dependencies.RawSqlCommandBuilder.Build("SELECT RELEASE_LOCK('__EFMigrationsLock');"), + CreateRelationalCommandParameters(), + this); + + private RelationalCommandParameterObject CreateRelationalCommandParameters() + => new( + Dependencies.Connection, + null, + null, + Dependencies.CurrentContext.Context, + Dependencies.CommandLogger, CommandSource.Migrations); +#endif + protected override string ExistsSql + { + get + { + var stringTypeMapping = Dependencies.TypeMappingSource.GetMapping(typeof(string)); + var builder = new StringBuilder(); + + builder.Append("SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE "); + + builder + .Append("TABLE_SCHEMA=") + .Append(stringTypeMapping.GenerateSqlLiteral(TableSchema ?? Dependencies.Connection.DbConnection.Database)) + .Append(" AND TABLE_NAME=") + .Append(stringTypeMapping.GenerateSqlLiteral(TableName)) + .Append(";"); + + return builder.ToString(); + } + } + + protected override bool InterpretExistsResult(object? value) => value != null; + + public override string GetBeginIfExistsScript(string migrationId) + { + Check.NotEmpty(migrationId, nameof(migrationId)); + + var stringTypeMapping = Dependencies.TypeMappingSource.GetMapping(typeof(string)); + + return new StringBuilder() + .Append("IF EXISTS(SELECT * FROM ") + .Append(SqlGenerationHelper.DelimitIdentifier(TableName, TableSchema)) + .Append(" WHERE ") + .Append(SqlGenerationHelper.DelimitIdentifier(MigrationIdColumnName)) + .Append(" = ") + .Append(stringTypeMapping.GenerateSqlLiteral(migrationId)) + .AppendLine(")") + .Append("BEGIN") + .ToString(); + } + + public override string GetBeginIfNotExistsScript(string migrationId) + { + Check.NotEmpty(migrationId, nameof(migrationId)); + + var stringTypeMapping = Dependencies.TypeMappingSource.GetMapping(typeof(string)); + + return new StringBuilder() + .Append("IF NOT EXISTS(SELECT * FROM ") + .Append(SqlGenerationHelper.DelimitIdentifier(TableName, TableSchema)) + .Append(" WHERE ") + .Append(SqlGenerationHelper.DelimitIdentifier(MigrationIdColumnName)) + .Append(" = ") + .Append(stringTypeMapping.GenerateSqlLiteral(migrationId)) + .AppendLine(")") + .Append("BEGIN") + .ToString(); + } + + public override string GetCreateIfNotExistsScript() + { + var script = GetCreateScript(); + return script.Insert(script.IndexOf("CREATE TABLE", StringComparison.Ordinal) + 12, " IF NOT EXISTS"); + } + + public override string GetEndIfScript() => "END;" + Environment.NewLine; + } +} diff --git a/EFCore/src/Migrations/Internal/MySQLMigrationDatabaseLockcs.cs b/EFCore/src/Migrations/Internal/MySQLMigrationDatabaseLockcs.cs new file mode 100644 index 000000000..668e43971 --- /dev/null +++ b/EFCore/src/Migrations/Internal/MySQLMigrationDatabaseLockcs.cs @@ -0,0 +1,53 @@ +// Copyright © 2024, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.EntityFrameworkCore.Migrations.Internal +{ +#if NET9_0_OR_GREATER + internal class MySQLMigrationDatabaseLock( + IRelationalCommand releaseLockCommand, + RelationalCommandParameterObject relationalCommandParameters, + IHistoryRepository historyRepository, + CancellationToken cancellationToken = default) + : IMigrationsDatabaseLock + { + public virtual IHistoryRepository HistoryRepository => historyRepository; + + public void Dispose() + => releaseLockCommand.ExecuteScalar(relationalCommandParameters); + + public async ValueTask DisposeAsync() + => await releaseLockCommand.ExecuteScalarAsync(relationalCommandParameters, cancellationToken).ConfigureAwait(false); + } +#endif +} diff --git a/EFCore/src/Migrations/Internal/MySQLMigrationsModelDiffer.cs b/EFCore/src/Migrations/Internal/MySQLMigrationsModelDiffer.cs new file mode 100644 index 000000000..63ad27fb2 --- /dev/null +++ b/EFCore/src/Migrations/Internal/MySQLMigrationsModelDiffer.cs @@ -0,0 +1,123 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.ChangeTracking.Internal; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Migrations.Internal; +using Microsoft.EntityFrameworkCore.Migrations.Operations; +using Microsoft.EntityFrameworkCore.Storage; +using Microsoft.EntityFrameworkCore.Update; +using Microsoft.EntityFrameworkCore.Update.Internal; +using MySql.EntityFrameworkCore.Internal; +using MySql.EntityFrameworkCore.Metadata; +using System.Collections.Generic; +using System.Linq; + +namespace MySql.EntityFrameworkCore.Migrations.Internal +{ + + internal class MySQLMigrationsModelDiffer : MigrationsModelDiffer + { +#if NET8_0 + public MySQLMigrationsModelDiffer( + [NotNull] IRelationalTypeMappingSource typeMappingSource, + [NotNull] IMigrationsAnnotationProvider migrationsAnnotations, + [NotNull] IRowIdentityMapFactory rowIdentityMapFactory, + [NotNull] CommandBatchPreparerDependencies commandBatchPreparerDependencies) + : base( + typeMappingSource, + migrationsAnnotations, + rowIdentityMapFactory, + commandBatchPreparerDependencies) + { + } + + protected override IEnumerable Add(IColumn target, DiffContext diffContext, bool inline = false) + { + var _property = target.PropertyMappings.ToArray().FirstOrDefault()!.Property; + if (_property.FindTypeMapping() is RelationalTypeMapping storeType) + { + var valueGenerationStrategy = MySQLValueGenerationStrategyCompatibility.GetValueGenerationStrategy(MigrationsAnnotationProvider.ForRemove(target).ToArray()); + // Ensure that null will be set for the columns default value, if CURRENT_TIMESTAMP has been required, + // or when the store type of the column does not support default values at all. + inline = inline || + (storeType.StoreTypeNameBase == "datetime" || + storeType.StoreTypeNameBase == "timestamp") && + (valueGenerationStrategy == MySQLValueGenerationStrategy.IdentityColumn || + valueGenerationStrategy == MySQLValueGenerationStrategy.ComputedColumn) || + storeType.StoreTypeNameBase.Contains("text") || + storeType.StoreTypeNameBase.Contains("blob") || + storeType.StoreTypeNameBase == "geometry" || + storeType.StoreTypeNameBase == "json"; + } + return base.Add(target, diffContext, inline); + } + +#elif NET9_0_OR_GREATER + public MySQLMigrationsModelDiffer( + [NotNull] IRelationalTypeMappingSource typeMappingSource, + [NotNull] IMigrationsAnnotationProvider migrationsAnnotations, + [NotNull] IRelationalAnnotationProvider relationalAnnotationProvider, + [NotNull] IRowIdentityMapFactory rowIdentityMapFactory, + [NotNull] CommandBatchPreparerDependencies commandBatchPreparerDependencies) + : base( + typeMappingSource, + migrationsAnnotations, + relationalAnnotationProvider, + rowIdentityMapFactory, + commandBatchPreparerDependencies) + { + } + + protected override IEnumerable Add(IColumn target, DiffContext diffContext, bool inline = false) + { + var _property = target.PropertyMappings.ToArray().FirstOrDefault()!.Property; + if (_property.FindTypeMapping() is RelationalTypeMapping storeType) + { + var valueGenerationStrategy = MySQLValueGenerationStrategyCompatibility.GetValueGenerationStrategy(MigrationsAnnotationProvider.ForRemove(target).ToArray()); + // Ensure that null will be set for the columns default value, if CURRENT_TIMESTAMP has been required, + // or when the store type of the column does not support default values at all. + inline = inline || + (storeType.StoreTypeNameBase == "datetime" || + storeType.StoreTypeNameBase == "timestamp") && + (valueGenerationStrategy == MySQLValueGenerationStrategy.IdentityColumn || + valueGenerationStrategy == MySQLValueGenerationStrategy.ComputedColumn) || + storeType.StoreTypeNameBase.Contains("text") || + storeType.StoreTypeNameBase.Contains("blob") || + storeType.StoreTypeNameBase == "geometry" || + storeType.StoreTypeNameBase == "json"; + } + return base.Add(target, diffContext, inline); + } + +#endif + + + } +} diff --git a/EFCore/src/Migrations/Internal/MySQLMigrator.cs b/EFCore/src/Migrations/Internal/MySQLMigrator.cs new file mode 100644 index 000000000..416ba9ef5 --- /dev/null +++ b/EFCore/src/Migrations/Internal/MySQLMigrator.cs @@ -0,0 +1,1028 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Diagnostics.Internal; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Migrations.Internal; +using Microsoft.EntityFrameworkCore.Migrations.Operations; +using Microsoft.EntityFrameworkCore.Storage; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Threading; +using System.Transactions; + +namespace MySql.EntityFrameworkCore.Migrations.Internal +{ +#if NET9_0_OR_GREATER + public class MySQLMigrator : IMigrator + { + private readonly IMigrationsAssembly _migrationsAssembly; + private readonly IHistoryRepository _historyRepository; + private readonly IRelationalDatabaseCreator _databaseCreator; + private readonly IMigrationsSqlGenerator _migrationsSqlGenerator; + private readonly IRawSqlCommandBuilder _rawSqlCommandBuilder; + private readonly IMigrationCommandExecutor _migrationCommandExecutor; + private readonly IRelationalConnection _connection; + private readonly ISqlGenerationHelper _sqlGenerationHelper; + private readonly ICurrentDbContext _currentContext; + private readonly IModelRuntimeInitializer _modelRuntimeInitializer; + private readonly IDiagnosticsLogger _logger; + private readonly IRelationalCommandDiagnosticsLogger _commandLogger; + private readonly IMigrationsModelDiffer _migrationsModelDiffer; + private readonly IDesignTimeModel _designTimeModel; + private readonly string _activeProvider; + private readonly IDbContextOptions _dbContextOptions; + private readonly IExecutionStrategy _executionStrategy; + + public MySQLMigrator( + IMigrationsAssembly migrationsAssembly, + IHistoryRepository historyRepository, + IDatabaseCreator databaseCreator, + IMigrationsSqlGenerator migrationsSqlGenerator, + IRawSqlCommandBuilder rawSqlCommandBuilder, + IMigrationCommandExecutor migrationCommandExecutor, + IRelationalConnection connection, + ISqlGenerationHelper sqlGenerationHelper, + ICurrentDbContext currentContext, + IModelRuntimeInitializer modelRuntimeInitializer, + IDiagnosticsLogger logger, + IRelationalCommandDiagnosticsLogger commandLogger, + IDatabaseProvider databaseProvider, + IMigrationsModelDiffer migrationsModelDiffer, + IDesignTimeModel designTimeModel, + IDbContextOptions dbContextOptions, + IExecutionStrategy executionStrategy) + { + _migrationsAssembly = migrationsAssembly; + _historyRepository = historyRepository; + _databaseCreator = (IRelationalDatabaseCreator)databaseCreator; + _migrationsSqlGenerator = migrationsSqlGenerator; + _rawSqlCommandBuilder = rawSqlCommandBuilder; + _migrationCommandExecutor = migrationCommandExecutor; + _connection = connection; + _sqlGenerationHelper = sqlGenerationHelper; + _currentContext = currentContext; + _modelRuntimeInitializer = modelRuntimeInitializer; + _logger = logger; + _commandLogger = commandLogger; + _migrationsModelDiffer = migrationsModelDiffer; + _designTimeModel = designTimeModel; + _activeProvider = databaseProvider.Name; + _dbContextOptions = dbContextOptions; + _executionStrategy = executionStrategy; + } + + protected virtual System.Data.IsolationLevel? MigrationTransactionIsolationLevel => null; + + public virtual void Migrate(string? targetMigration) + { + var useTransaction = _connection.CurrentTransaction is null; + if (!useTransaction + && _executionStrategy.RetriesOnFailure) + { + throw new NotSupportedException(RelationalStrings.TransactionSuppressedMigrationInUserTransaction); + } + + if (RelationalResources.LogPendingModelChanges(_logger).WarningBehavior != WarningBehavior.Ignore + && HasPendingModelChanges()) + { + _logger.PendingModelChangesWarning(_currentContext.Context.GetType()); + } + + if (!useTransaction) + { + _logger.MigrationsUserTransactionWarning(); + } + + _logger.MigrateUsingConnection(this, _connection); + + using var transactionScope = new TransactionScope(TransactionScopeOption.Suppress, TransactionScopeAsyncFlowOption.Enabled); + + if (!_databaseCreator.Exists()) + { + _databaseCreator.Create(); + } + + _connection.Open(); + try + { + var state = new MigrationExecutionState(); + if (_historyRepository.LockReleaseBehavior != LockReleaseBehavior.Transaction + && useTransaction) + { + state.DatabaseLock = _historyRepository.AcquireDatabaseLock(); + } + + _executionStrategy.Execute( + this, + static (_, migrator) => + { + migrator._connection.Open(); + try + { + return migrator._historyRepository.CreateIfNotExists(); + } + finally + { + migrator._connection.Close(); + } + }, + verifySucceeded: null); + + _executionStrategy.Execute( + (Migrator: this, + TargetMigration: targetMigration, + State: state, + UseTransaction: useTransaction), + static (c, s) => s.Migrator.MigrateImplementation(c, s.TargetMigration, s.State, s.UseTransaction), + static (_, s) => new ExecutionResult( + successful: s.Migrator.VerifyMigrationSucceeded(s.TargetMigration, s.State), + result: true)); + } + finally + { + _connection.Close(); + } + } + + private bool MigrateImplementation(DbContext context, string? targetMigration, MigrationExecutionState state, bool useTransaction) + { + var connectionOpened = _connection.Open(); + try + { + if (useTransaction) + { + state.Transaction = MigrationTransactionIsolationLevel == null + ? _connection.BeginTransaction() + : _connection.BeginTransaction(MigrationTransactionIsolationLevel.Value); + + state.DatabaseLock = state.DatabaseLock == null + ? _historyRepository.AcquireDatabaseLock() + : state.DatabaseLock.ReacquireIfNeeded(connectionOpened, useTransaction); + } + + PopulateMigrations( + _historyRepository.GetAppliedMigrations().Select(t => t.MigrationId), + targetMigration, + out var migratorData); + + var commandLists = GetMigrationCommandLists(migratorData); + foreach (var commandList in commandLists) + { + var (id, getCommands) = commandList; + if (id != state.CurrentMigrationId) + { + state.CurrentMigrationId = id; + state.LastCommittedCommandIndex = 0; + } + + _migrationCommandExecutor.ExecuteNonQuery(getCommands(), _connection, state, commitTransaction: false, MigrationTransactionIsolationLevel); + } + + var coreOptionsExtension = + _dbContextOptions.FindExtension() + ?? new CoreOptionsExtension(); + + var seed = coreOptionsExtension.Seeder; + if (seed != null) + { + seed(context, state.AnyOperationPerformed); + } + else if (coreOptionsExtension.AsyncSeeder != null) + { + throw new InvalidOperationException(CoreStrings.MissingSeeder); + } + + state.Transaction?.Commit(); + return state.AnyOperationPerformed; + } + finally + { + state.DatabaseLock?.Dispose(); + state.DatabaseLock = null; + state.Transaction?.Dispose(); + state.Transaction = null; + _connection.Close(); + } + } + + public virtual async Task MigrateAsync( + string? targetMigration, + CancellationToken cancellationToken = default) + { + var useTransaction = _connection.CurrentTransaction is null; + if (!useTransaction + && _executionStrategy.RetriesOnFailure) + { + throw new NotSupportedException(RelationalStrings.TransactionSuppressedMigrationInUserTransaction); + } + + if (RelationalResources.LogPendingModelChanges(_logger).WarningBehavior != WarningBehavior.Ignore + && HasPendingModelChanges()) + { + _logger.PendingModelChangesWarning(_currentContext.Context.GetType()); + } + + if (!useTransaction) + { + _logger.MigrationsUserTransactionWarning(); + } + + _logger.MigrateUsingConnection(this, _connection); + + using var transactionScope = new TransactionScope(TransactionScopeOption.Suppress, TransactionScopeAsyncFlowOption.Enabled); + + if (!await _databaseCreator.ExistsAsync(cancellationToken).ConfigureAwait(false)) + { + await _databaseCreator.CreateAsync(cancellationToken).ConfigureAwait(false); + } + + await _connection.OpenAsync(cancellationToken).ConfigureAwait(false); + try + { + var state = new MigrationExecutionState(); + if (_historyRepository.LockReleaseBehavior != LockReleaseBehavior.Transaction + && useTransaction) + { + state.DatabaseLock = await _historyRepository.AcquireDatabaseLockAsync(cancellationToken).ConfigureAwait(false); + } + + await _executionStrategy.ExecuteAsync( + this, + static async (_, migrator, ct) => + { + await migrator._connection.OpenAsync(ct).ConfigureAwait(false); + try + { + return await migrator._historyRepository.CreateIfNotExistsAsync(ct).ConfigureAwait(false); + } + finally + { + await migrator._connection.CloseAsync().ConfigureAwait(false); + } + }, + verifySucceeded: null, + cancellationToken).ConfigureAwait(false); + + await _executionStrategy.ExecuteAsync( + (Migrator: this, + TargetMigration: targetMigration, + State: state, + UseTransaction: useTransaction), + async static (c, s, ct) => await s.Migrator.MigrateImplementationAsync( + c, s.TargetMigration, s.State, s.UseTransaction, ct).ConfigureAwait(false), + async static (_, s, ct) => new ExecutionResult( + successful: await s.Migrator.VerifyMigrationSucceededAsync(s.TargetMigration, s.State, ct).ConfigureAwait(false), + result: true), + cancellationToken) + .ConfigureAwait(false); + } + finally + { + await _connection.CloseAsync().ConfigureAwait(false); + } + } + + private async Task MigrateImplementationAsync( + DbContext context, string? targetMigration, MigrationExecutionState state, bool useTransaction, CancellationToken cancellationToken = default) + { + var connectionOpened = await _connection.OpenAsync(cancellationToken).ConfigureAwait(false); + try + { + if (useTransaction) + { + state.Transaction = await (MigrationTransactionIsolationLevel == null + ? context.Database.BeginTransactionAsync(cancellationToken) + : context.Database.BeginTransactionAsync(MigrationTransactionIsolationLevel.Value, cancellationToken)) + .ConfigureAwait(false); + + state.DatabaseLock = state.DatabaseLock == null + ? await _historyRepository.AcquireDatabaseLockAsync(cancellationToken).ConfigureAwait(false) + : await state.DatabaseLock.ReacquireIfNeededAsync(connectionOpened, useTransaction, cancellationToken) + .ConfigureAwait(false); + } + + PopulateMigrations( + (await _historyRepository.GetAppliedMigrationsAsync(cancellationToken).ConfigureAwait(false)).Select(t => t.MigrationId), + targetMigration, + out var migratorData); + + var commandLists = GetMigrationCommandLists(migratorData); + foreach (var commandList in commandLists) + { + var (id, getCommands) = commandList; + if (id != state.CurrentMigrationId) + { + state.CurrentMigrationId = id; + state.LastCommittedCommandIndex = 0; + } + + await _migrationCommandExecutor.ExecuteNonQueryAsync( + getCommands(), _connection, state, commitTransaction: false, MigrationTransactionIsolationLevel, cancellationToken) + .ConfigureAwait(false); + } + + var coreOptionsExtension = + _dbContextOptions.FindExtension() + ?? new CoreOptionsExtension(); + + var seedAsync = coreOptionsExtension.AsyncSeeder; + if (seedAsync != null) + { + await seedAsync(context, state.AnyOperationPerformed, cancellationToken).ConfigureAwait(false); + } + else if (coreOptionsExtension.Seeder != null) + { + throw new InvalidOperationException(CoreStrings.MissingSeeder); + } + + if (state.Transaction != null) + { + await state.Transaction.CommitAsync(cancellationToken).ConfigureAwait(false); + } + return state.AnyOperationPerformed; + } + finally + { + if (state.DatabaseLock != null) + { + state.DatabaseLock.Dispose(); + state.DatabaseLock = null; + } + if (state.Transaction != null) + { + await state.Transaction.DisposeAsync().ConfigureAwait(false); + state.Transaction = null; + } + await _connection.CloseAsync().ConfigureAwait(false); + } + } + + private IEnumerable<(string, Func>)> GetMigrationCommandLists(MigratorData parameters) + { + var migrationsToApply = parameters.AppliedMigrations; + var migrationsToRevert = parameters.RevertedMigrations; + var actualTargetMigration = parameters.TargetMigration; + + for (var i = 0; i < migrationsToRevert.Count; i++) + { + var migration = migrationsToRevert[i]; + + var index = i; + yield return (migration.GetId(), () => + { + _logger.MigrationReverting(this, migration); + + var commands = GenerateDownSql( + migration, + index != migrationsToRevert.Count - 1 + ? migrationsToRevert[index + 1] + : actualTargetMigration); + if (migration.DownOperations.Count > 1 + && commands.FirstOrDefault(c => c.TransactionSuppressed) is MigrationCommand nonTransactionalCommand) + { + _logger.NonTransactionalMigrationOperationWarning(this, migration, nonTransactionalCommand); + } + + return commands; + } + ); + } + + foreach (var migration in migrationsToApply) + { + yield return (migration.GetId(), () => + { + _logger.MigrationApplying(this, migration); + + var commands = GenerateUpSql(migration); + if (migration.UpOperations.Count > 1 + && commands.FirstOrDefault(c => c.TransactionSuppressed) is MigrationCommand nonTransactionalCommand) + { + _logger.NonTransactionalMigrationOperationWarning(this, migration, nonTransactionalCommand); + } + + return commands; + } + ); + } + + if (migrationsToRevert.Count + migrationsToApply.Count == 0) + { + _logger.MigrationsNotApplied(this); + } + } + + protected virtual void PopulateMigrations( + IEnumerable appliedMigrationEntries, + string? targetMigration, + out MigratorData parameters) + { + var appliedMigrations = new Dictionary(); + var unappliedMigrations = new Dictionary(); + var appliedMigrationEntrySet = new HashSet(appliedMigrationEntries, StringComparer.OrdinalIgnoreCase); + if (_migrationsAssembly.Migrations.Count == 0) + { + _logger.MigrationsNotFound(this, _migrationsAssembly); + } + + foreach (var (key, typeInfo) in _migrationsAssembly.Migrations) + { + if (appliedMigrationEntrySet.Contains(key)) + { + appliedMigrations.Add(key, typeInfo); + } + else + { + unappliedMigrations.Add(key, typeInfo); + } + } + + IReadOnlyList migrationsToApply; + IReadOnlyList migrationsToRevert; + Migration? actualTargetMigration = null; + if (string.IsNullOrEmpty(targetMigration)) + { + migrationsToApply = unappliedMigrations + .OrderBy(m => m.Key) + .Select(p => _migrationsAssembly.CreateMigration(p.Value, _activeProvider)) + .ToList(); + migrationsToRevert = []; + } + else if (targetMigration == Migration.InitialDatabase) + { + migrationsToApply = []; + migrationsToRevert = appliedMigrations + .OrderByDescending(m => m.Key) + .Select(p => _migrationsAssembly.CreateMigration(p.Value, _activeProvider)) + .ToList(); + } + else + { + targetMigration = _migrationsAssembly.GetMigrationId(targetMigration); + migrationsToApply = unappliedMigrations + .Where(m => string.Compare(m.Key, targetMigration, StringComparison.OrdinalIgnoreCase) <= 0) + .OrderBy(m => m.Key) + .Select(p => _migrationsAssembly.CreateMigration(p.Value, _activeProvider)) + .ToList(); + migrationsToRevert = appliedMigrations + .Where(m => string.Compare(m.Key, targetMigration, StringComparison.OrdinalIgnoreCase) > 0) + .OrderByDescending(m => m.Key) + .Select(p => _migrationsAssembly.CreateMigration(p.Value, _activeProvider)) + .ToList(); + actualTargetMigration = appliedMigrations + .Where(m => string.Compare(m.Key, targetMigration, StringComparison.OrdinalIgnoreCase) == 0) + .Select(p => _migrationsAssembly.CreateMigration(p.Value, _activeProvider)) + .SingleOrDefault(); + } + + parameters = new MigratorData(migrationsToApply, migrationsToRevert, actualTargetMigration); + } + + protected virtual bool VerifyMigrationSucceeded( + string? targetMigration, MigrationExecutionState state) + => false; + + protected virtual Task VerifyMigrationSucceededAsync( + string? targetMigration, MigrationExecutionState state, CancellationToken cancellationToken) + => Task.FromResult(false); + + public virtual string GenerateScript( + string? fromMigration = null, + string? toMigration = null, + MigrationsSqlGenerationOptions options = MigrationsSqlGenerationOptions.Default) + { + options |= MigrationsSqlGenerationOptions.Script; + + var idempotent = options.HasFlag(MigrationsSqlGenerationOptions.Idempotent); + var noTransactions = options.HasFlag(MigrationsSqlGenerationOptions.NoTransactions); + + IEnumerable appliedMigrations; + if (string.IsNullOrEmpty(fromMigration) + || fromMigration == Migration.InitialDatabase) + { + appliedMigrations = Enumerable.Empty(); + } + else + { + var fromMigrationId = _migrationsAssembly.GetMigrationId(fromMigration); + appliedMigrations = _migrationsAssembly.Migrations + .Where(t => string.Compare(t.Key, fromMigrationId, StringComparison.OrdinalIgnoreCase) <= 0) + .Select(t => t.Key); + } + + PopulateMigrations(appliedMigrations, toMigration, out var migratorData); + + var builder = new IndentedStringBuilder(); + + if (fromMigration == Migration.InitialDatabase + || string.IsNullOrEmpty(fromMigration)) + { + builder + .Append(_historyRepository.GetCreateIfNotExistsScript()) + .Append(_sqlGenerationHelper.BatchTerminator); + } + + var idempotencyEnd = idempotent + ? _historyRepository.GetEndIfScript() + : null; + var migrationsToApply = migratorData.AppliedMigrations; + var migrationsToRevert = migratorData.RevertedMigrations; + var actualTargetMigration = migratorData.TargetMigration; + var transactionStarted = false; + for (var i = 0; i < migrationsToRevert.Count; i++) + { + var migration = migrationsToRevert[i]; + var previousMigration = i != migrationsToRevert.Count - 1 + ? migrationsToRevert[i + 1] + : actualTargetMigration; + + _logger.MigrationGeneratingDownScript(this, migration, fromMigration, toMigration, idempotent); + + var idempotencyCondition = idempotent + ? _historyRepository.GetBeginIfExistsScript(migration.GetId()) + : null; + + GenerateSqlScript( + GenerateDownSql(migration, previousMigration, options), + builder, _sqlGenerationHelper, ref transactionStarted, noTransactions, idempotencyCondition, idempotencyEnd); + } + + foreach (var migration in migrationsToApply) + { + _logger.MigrationGeneratingUpScript(this, migration, fromMigration, toMigration, idempotent); + + var idempotencyCondition = idempotent + ? _historyRepository.GetBeginIfNotExistsScript(migration.GetId()) + : null; + + GenerateSqlScript( + GenerateUpSql(migration, options), + builder, _sqlGenerationHelper, ref transactionStarted, noTransactions, idempotencyCondition, idempotencyEnd); + } + + if (transactionStarted) + { + builder + .AppendLine(_sqlGenerationHelper.CommitTransactionStatement) + .Append(_sqlGenerationHelper.BatchTerminator); + } + + return builder.ToString(); + } + + private static void GenerateSqlScript( + IEnumerable commands, + IndentedStringBuilder builder, + ISqlGenerationHelper sqlGenerationHelper, + ref bool transactionStarted, + bool noTransactions = false, + string? idempotencyCondition = null, + string? idempotencyEnd = null) + { + foreach (var command in commands) + { + if (!noTransactions) + { + if (!transactionStarted && !command.TransactionSuppressed) + { + builder + .AppendLine(sqlGenerationHelper.StartTransactionStatement); + transactionStarted = true; + } + + if (transactionStarted && command.TransactionSuppressed) + { + builder + .AppendLine(sqlGenerationHelper.CommitTransactionStatement) + .Append(sqlGenerationHelper.BatchTerminator); + transactionStarted = false; + } + } + + if (idempotencyCondition != null + && idempotencyEnd != null) + { + builder.AppendLine(idempotencyCondition); + using (builder.Indent()) + { + builder.AppendLines(command.CommandText); + } + + builder.Append(idempotencyEnd); + } + else + { + builder.Append(command.CommandText); + } + + if (!transactionStarted) + { + builder.Append(sqlGenerationHelper.BatchTerminator); + } + else + { + builder.Append(Environment.NewLine); + } + } + } + + protected virtual IReadOnlyList GenerateUpSql( + Migration migration, + MigrationsSqlGenerationOptions options = MigrationsSqlGenerationOptions.Default) + { + var insertCommand = _rawSqlCommandBuilder.Build( + _historyRepository.GetInsertScript(new HistoryRow(migration.GetId(), ProductInfo.GetVersion()))); + + var operations = _migrationsSqlGenerator + .Generate( + migration.UpOperations, + FinalizeModel(migration.TargetModel), + options); + + return + [ + .. operations, + new MigrationCommand(insertCommand, _currentContext.Context, _commandLogger, + transactionSuppressed: operations.Any(o => o.TransactionSuppressed)), + ]; + } + + protected virtual IReadOnlyList GenerateDownSql( + Migration migration, + Migration? previousMigration, + MigrationsSqlGenerationOptions options = MigrationsSqlGenerationOptions.Default) + { + var deleteCommand = _rawSqlCommandBuilder.Build( + _historyRepository.GetDeleteScript(migration.GetId())); + + var operations = _migrationsSqlGenerator + .Generate( + migration.DownOperations, + previousMigration == null ? null : FinalizeModel(previousMigration.TargetModel), + options); + + return [ + .. operations, + new MigrationCommand(deleteCommand, _currentContext.Context, _commandLogger, + transactionSuppressed: operations.Any(o => o.TransactionSuppressed)) + ]; + } + + private IModel? FinalizeModel(IModel? model) + => model == null + ? null + : _modelRuntimeInitializer.Initialize(model); + + public bool HasPendingModelChanges() + => _migrationsModelDiffer.HasDifferences( + FinalizeModel(_migrationsAssembly.ModelSnapshot?.Model)?.GetRelationalModel(), + _designTimeModel.Model.GetRelationalModel()); + } +#else + + internal class MySQLMigrator : Migrator + { + private static readonly Dictionary> _customMigrationCommands = + new Dictionary> + { + { + typeof(DropPrimaryKeyOperation), + new Tuple(BeforeDropPrimaryKeyMigrationBegin, BeforeDropPrimaryKeyMigrationEnd) + }, + { + typeof(AddPrimaryKeyOperation), + new Tuple(AfterAddPrimaryKeyMigrationBegin, AfterAddPrimaryKeyMigrationEnd) + }, + }; + + private readonly IMigrationsAssembly _migrationsAssembly; + private readonly IRawSqlCommandBuilder _rawSqlCommandBuilder; + private readonly ICurrentDbContext _currentContext; + private readonly IRelationalCommandDiagnosticsLogger _commandLogger; + + public MySQLMigrator( + [NotNull] IMigrationsAssembly migrationsAssembly, + [NotNull] IHistoryRepository historyRepository, + [NotNull] IDatabaseCreator databaseCreator, + [NotNull] IMigrationsSqlGenerator migrationsSqlGenerator, + [NotNull] IRawSqlCommandBuilder rawSqlCommandBuilder, + [NotNull] IMigrationCommandExecutor migrationCommandExecutor, + [NotNull] IRelationalConnection connection, + [NotNull] ISqlGenerationHelper sqlGenerationHelper, + [NotNull] ICurrentDbContext currentContext, + [NotNull] IModelRuntimeInitializer modelRuntimeInitializer, + [NotNull] IDiagnosticsLogger logger, + [NotNull] IRelationalCommandDiagnosticsLogger commandLogger, + [NotNull] IDatabaseProvider databaseProvider) + : base( + migrationsAssembly, + historyRepository, + databaseCreator, + migrationsSqlGenerator, + rawSqlCommandBuilder, + migrationCommandExecutor, + connection, + sqlGenerationHelper, + currentContext, + modelRuntimeInitializer, + logger, + commandLogger, + databaseProvider) + { + _migrationsAssembly = migrationsAssembly; + _rawSqlCommandBuilder = rawSqlCommandBuilder; + _currentContext = currentContext; + _commandLogger = commandLogger; + } + + protected override IReadOnlyList GenerateUpSql( + Migration migration, + MigrationsSqlGenerationOptions options = MigrationsSqlGenerationOptions.Default) + { + var commands = base.GenerateUpSql(migration, options); + + return options.HasFlag(MigrationsSqlGenerationOptions.Script) && + options.HasFlag(MigrationsSqlGenerationOptions.Idempotent) + ? commands + : WrapWithCustomCommands( + migration.UpOperations, + commands.ToList(), + options); + } + + protected override IReadOnlyList GenerateDownSql( + Migration migration, + Migration? previousMigration, + MigrationsSqlGenerationOptions options = MigrationsSqlGenerationOptions.Default) + { + var commands = base.GenerateDownSql(migration, previousMigration, options); + + return options.HasFlag(MigrationsSqlGenerationOptions.Script) && + options.HasFlag(MigrationsSqlGenerationOptions.Idempotent) + ? commands + : WrapWithCustomCommands( + migration.DownOperations, + commands.ToList(), + options); + } + + public override string GenerateScript( + string? fromMigration = null, + string? toMigration = null, + MigrationsSqlGenerationOptions options = MigrationsSqlGenerationOptions.Default) + { + options |= MigrationsSqlGenerationOptions.Script; + + if (!options.HasFlag(MigrationsSqlGenerationOptions.Idempotent)) + { + return base.GenerateScript(fromMigration, toMigration, options); + } + + var operations = GetAllMigrationOperations(fromMigration, toMigration); + + var builder = new StringBuilder(); + + builder.AppendJoin(string.Empty, GetMigrationCommandTexts(operations, true, options)); + builder.Append(base.GenerateScript(fromMigration, toMigration, options)); + builder.AppendJoin(string.Empty, GetMigrationCommandTexts(operations, false, options)); + + return builder.ToString(); + } + + protected virtual List GetAllMigrationOperations(string? fromMigration, string? toMigration) + { + IEnumerable appliedMigrations; + if (string.IsNullOrEmpty(fromMigration) + || fromMigration == Migration.InitialDatabase) + { + appliedMigrations = Enumerable.Empty(); + } + else + { + var fromMigrationId = _migrationsAssembly.GetMigrationId(fromMigration); + appliedMigrations = _migrationsAssembly.Migrations + .Where(t => string.Compare(t.Key, fromMigrationId, StringComparison.OrdinalIgnoreCase) <= 0) + .Select(t => t.Key); + } + + PopulateMigrations( + appliedMigrations, + toMigration, + out var migrationsToApply, + out var migrationsToRevert, + out var actualTargetMigration); + + return migrationsToApply + .SelectMany(x => x.UpOperations) + .Concat(migrationsToRevert.SelectMany(x => x.DownOperations)) + .ToList(); + } + + protected virtual IReadOnlyList WrapWithCustomCommands( + IReadOnlyList migrationOperations, + IReadOnlyList migrationCommands, + MigrationsSqlGenerationOptions options) + { + var beginCommandTexts = GetMigrationCommandTexts(migrationOperations, true, options); + var endCommandTexts = GetMigrationCommandTexts(migrationOperations, false, options); + + return new List( + beginCommandTexts.Select(t => new MigrationCommand(_rawSqlCommandBuilder.Build(t), + _currentContext.Context, _commandLogger)) + .Concat(migrationCommands) + .Concat(endCommandTexts.Select(t => new MigrationCommand(_rawSqlCommandBuilder.Build(t), _currentContext.Context, _commandLogger))) + ); + } + + protected virtual string[] GetMigrationCommandTexts( + IReadOnlyList migrationOperations, + bool beginTexts, + MigrationsSqlGenerationOptions options) + => GetCustomCommands(migrationOperations) + .Select( + t => PrepareString( + beginTexts + ? t.Item1 + : t.Item2, + options)) + .ToArray(); + + protected virtual IReadOnlyList> GetCustomCommands(IReadOnlyList migrationOperations) + => _customMigrationCommands + .Where(c => migrationOperations.Any(o => c.Key.IsInstanceOfType(o)) && c.Value != null) + .Select(kvp => kvp.Value) + .ToList(); + + protected virtual string CleanUpScriptSpecificPseudoStatements(string commandText) + { + const string temporaryDelimiter = @"//"; + const string defaultDelimiter = @";"; + const string delimiterChangeRegexPatternFormatString = @"[\r\n]*[^\S\r\n]*DELIMITER[^\S\r\n]+{0}[^\S\r\n]*"; + const string delimiterUseRegexPatternFormatString = @"\s*{0}\s*$"; + + var temporaryDelimiterRegexPattern = string.Format( + delimiterChangeRegexPatternFormatString, + $"(?:{Regex.Escape(temporaryDelimiter)}|{Regex.Escape(defaultDelimiter)})"); + + var delimiter = Regex.Match(commandText, temporaryDelimiterRegexPattern, RegexOptions.IgnoreCase); + if (delimiter.Success) + { + commandText = Regex.Replace(commandText, temporaryDelimiterRegexPattern, string.Empty, RegexOptions.IgnoreCase); + + commandText = Regex.Replace( + commandText, + string.Format(delimiterUseRegexPatternFormatString, temporaryDelimiter), + defaultDelimiter, + RegexOptions.IgnoreCase | RegexOptions.Multiline); + } + + return commandText; + } + + protected virtual string PrepareString(string str, MigrationsSqlGenerationOptions options) + { + str = options.HasFlag(MigrationsSqlGenerationOptions.Script) + ? str + : CleanUpScriptSpecificPseudoStatements(str); + + str = str + .Replace("\r", string.Empty) + .Replace("\n", Environment.NewLine); + + str += options.HasFlag(MigrationsSqlGenerationOptions.Script) + ? Environment.NewLine + ( + options.HasFlag(MigrationsSqlGenerationOptions.Idempotent) + ? Environment.NewLine + : string.Empty) + : string.Empty; + + return str; + } + + #region Custom SQL + + private const string BeforeDropPrimaryKeyMigrationBegin = @"DROP PROCEDURE IF EXISTS `MYSQL_BEFORE_DROP_PRIMARY_KEY`; + DELIMITER // + CREATE PROCEDURE `MYSQL_BEFORE_DROP_PRIMARY_KEY`(IN `SCHEMA_NAME_ARGUMENT` VARCHAR(255), IN `TABLE_NAME_ARGUMENT` VARCHAR(255)) + BEGIN + DECLARE HAS_AUTO_INCREMENT_ID TINYINT(1); + DECLARE PRIMARY_KEY_COLUMN_NAME VARCHAR(255); + DECLARE PRIMARY_KEY_TYPE VARCHAR(255); + DECLARE SQL_EXP VARCHAR(1000); + SELECT COUNT(*) + INTO HAS_AUTO_INCREMENT_ID + FROM `information_schema`.`COLUMNS` + WHERE `TABLE_SCHEMA` = (SELECT IFNULL(SCHEMA_NAME_ARGUMENT, SCHEMA())) + AND `TABLE_NAME` = TABLE_NAME_ARGUMENT + AND `Extra` = 'auto_increment' + AND `COLUMN_KEY` = 'PRI' + LIMIT 1; + IF HAS_AUTO_INCREMENT_ID THEN + SELECT `COLUMN_TYPE` + INTO PRIMARY_KEY_TYPE + FROM `information_schema`.`COLUMNS` + WHERE `TABLE_SCHEMA` = (SELECT IFNULL(SCHEMA_NAME_ARGUMENT, SCHEMA())) + AND `TABLE_NAME` = TABLE_NAME_ARGUMENT + AND `COLUMN_KEY` = 'PRI' + LIMIT 1; + SELECT `COLUMN_NAME` + INTO PRIMARY_KEY_COLUMN_NAME + FROM `information_schema`.`COLUMNS` + WHERE `TABLE_SCHEMA` = (SELECT IFNULL(SCHEMA_NAME_ARGUMENT, SCHEMA())) + AND `TABLE_NAME` = TABLE_NAME_ARGUMENT + AND `COLUMN_KEY` = 'PRI' + LIMIT 1; + SET SQL_EXP = CONCAT('ALTER TABLE `', (SELECT IFNULL(SCHEMA_NAME_ARGUMENT, SCHEMA())), '`.`', TABLE_NAME_ARGUMENT, '` MODIFY COLUMN `', PRIMARY_KEY_COLUMN_NAME, '` ', PRIMARY_KEY_TYPE, ' NOT NULL;'); + SET @SQL_EXP = SQL_EXP; + PREPARE SQL_EXP_EXECUTE FROM @SQL_EXP; + EXECUTE SQL_EXP_EXECUTE; + DEALLOCATE PREPARE SQL_EXP_EXECUTE; + END IF; + END // + DELIMITER ;"; + + private const string BeforeDropPrimaryKeyMigrationEnd = @"DROP PROCEDURE `MYSQL_BEFORE_DROP_PRIMARY_KEY`;"; + + private const string AfterAddPrimaryKeyMigrationBegin = @"DROP PROCEDURE IF EXISTS `MYSQL_AFTER_ADD_PRIMARY_KEY`; + DELIMITER // + CREATE PROCEDURE `MYSQL_AFTER_ADD_PRIMARY_KEY`(IN `SCHEMA_NAME_ARGUMENT` VARCHAR(255), IN `TABLE_NAME_ARGUMENT` VARCHAR(255), IN `COLUMN_NAME_ARGUMENT` VARCHAR(255)) + BEGIN + DECLARE HAS_AUTO_INCREMENT_ID INT(11); + DECLARE PRIMARY_KEY_COLUMN_NAME VARCHAR(255); + DECLARE PRIMARY_KEY_TYPE VARCHAR(255); + DECLARE SQL_EXP VARCHAR(1000); + SELECT COUNT(*) + INTO HAS_AUTO_INCREMENT_ID + FROM `information_schema`.`COLUMNS` + WHERE `TABLE_SCHEMA` = (SELECT IFNULL(SCHEMA_NAME_ARGUMENT, SCHEMA())) + AND `TABLE_NAME` = TABLE_NAME_ARGUMENT + AND `COLUMN_NAME` = COLUMN_NAME_ARGUMENT + AND `COLUMN_TYPE` LIKE '%int%' + AND `COLUMN_KEY` = 'PRI'; + IF HAS_AUTO_INCREMENT_ID THEN + SELECT `COLUMN_TYPE` + INTO PRIMARY_KEY_TYPE + FROM `information_schema`.`COLUMNS` + WHERE `TABLE_SCHEMA` = (SELECT IFNULL(SCHEMA_NAME_ARGUMENT, SCHEMA())) + AND `TABLE_NAME` = TABLE_NAME_ARGUMENT + AND `COLUMN_NAME` = COLUMN_NAME_ARGUMENT + AND `COLUMN_TYPE` LIKE '%int%' + AND `COLUMN_KEY` = 'PRI'; + SELECT `COLUMN_NAME` + INTO PRIMARY_KEY_COLUMN_NAME + FROM `information_schema`.`COLUMNS` + WHERE `TABLE_SCHEMA` = (SELECT IFNULL(SCHEMA_NAME_ARGUMENT, SCHEMA())) + AND `TABLE_NAME` = TABLE_NAME_ARGUMENT + AND `COLUMN_NAME` = COLUMN_NAME_ARGUMENT + AND `COLUMN_TYPE` LIKE '%int%' + AND `COLUMN_KEY` = 'PRI'; + SET SQL_EXP = CONCAT('ALTER TABLE `', (SELECT IFNULL(SCHEMA_NAME_ARGUMENT, SCHEMA())), '`.`', TABLE_NAME_ARGUMENT, '` MODIFY COLUMN `', PRIMARY_KEY_COLUMN_NAME, '` ', PRIMARY_KEY_TYPE, ' NOT NULL AUTO_INCREMENT;'); + SET @SQL_EXP = SQL_EXP; + PREPARE SQL_EXP_EXECUTE FROM @SQL_EXP; + EXECUTE SQL_EXP_EXECUTE; + DEALLOCATE PREPARE SQL_EXP_EXECUTE; + END IF; + END // + DELIMITER ;"; + + private const string AfterAddPrimaryKeyMigrationEnd = @"DROP PROCEDURE `MYSQL_AFTER_ADD_PRIMARY_KEY`;"; + + #endregion Custom SQL + } +#endif +} diff --git a/EFCore/src/Migrations/MySQLMigrationsSqlGenerator.cs b/EFCore/src/Migrations/MySQLMigrationsSqlGenerator.cs new file mode 100644 index 000000000..e8e73db2f --- /dev/null +++ b/EFCore/src/Migrations/MySQLMigrationsSqlGenerator.cs @@ -0,0 +1,586 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Migrations.Operations; +using Microsoft.EntityFrameworkCore.Storage; +using MySql.EntityFrameworkCore.Infrastructure.Internal; +using MySql.EntityFrameworkCore.Internal; +using MySql.EntityFrameworkCore.Metadata; +using MySql.EntityFrameworkCore.Metadata.Internal; +using MySql.EntityFrameworkCore.Migrations.Operations; +using MySql.EntityFrameworkCore.Utils; +using System; +using System.Linq; +using System.Text.RegularExpressions; + +namespace MySql.EntityFrameworkCore.Migrations +{ + /// + /// MigrationSqlGenerator implementation for MySQL + /// + internal class MySQLMigrationsSqlGenerator : MigrationsSqlGenerator + { + private static readonly Regex _typeRegex = new Regex(@"([a-z0-9]+)\s*?(?:\(\s*(\d+)?\s*\))?", + RegexOptions.IgnoreCase); + + private RelationalTypeMapping _typeMapper; + private readonly IRelationalAnnotationProvider _annotationProvider; + private readonly IMySQLOptions _options; + + public MySQLMigrationsSqlGenerator( + [NotNull] MigrationsSqlGeneratorDependencies dependencies, + [NotNull] IRelationalAnnotationProvider annotationProvider, + [NotNull] IMySQLOptions options) + : base(dependencies) + { + _annotationProvider = annotationProvider; + _options = options; + _typeMapper = dependencies.TypeMappingSource.GetMapping(typeof(string)); + } + + protected override void Generate( + MigrationOperation operation, + IModel? model, + MigrationCommandListBuilder builder) + { + Check.NotNull(operation, nameof(operation)); + Check.NotNull(builder, nameof(builder)); + + switch (operation) + { + case MySQLCreateDatabaseOperation createDatabaseOperation: + Generate(createDatabaseOperation, model, builder); + break; + case MySQLDropDatabaseOperation dropDatabaseOperation: + Generate(dropDatabaseOperation, model!, builder); + break; + case MySQLDropPrimaryKeyAndRecreateForeignKeysOperation dropPrimaryKeyAndRecreateForeignKeysOperation: + Generate(dropPrimaryKeyAndRecreateForeignKeysOperation, model, builder); + break; + case MySQLDropUniqueConstraintAndRecreateForeignKeysOperation dropUniqueConstraintAndRecreateForeignKeysOperation: + Generate(dropUniqueConstraintAndRecreateForeignKeysOperation, model, builder); + break; + default: + base.Generate(operation, model, builder); + break; + } + } + + protected override void Generate(RenameColumnOperation operation, IModel? model, MigrationCommandListBuilder builder) + { + Check.NotNull(operation, nameof(operation)); + Check.NotNull(builder, nameof(builder)); + + builder.Append("ALTER TABLE ") + .Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Table, operation.Schema)); + + builder.Append(" CHANGE ") + .Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Name)) + .Append(" "); + + var column = model?.GetRelationalModel().FindTable(operation.Table, operation.Schema)?.FindColumn(operation.NewName); + if (column == null) + { + if (!(operation[RelationalAnnotationNames.ColumnType] is string type)) + { + throw new InvalidOperationException( + $"Could not find the column: {Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Table, operation.Schema)}.{Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.NewName)}. Specify the column type explicitly on 'RenameColumn' using the \"{RelationalAnnotationNames.ColumnType}\" annotation"); + } + + builder + .Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.NewName)) + .Append(" ") + .Append(type) + .AppendLine(Dependencies.SqlGenerationHelper.StatementTerminator); + + EndStatement(builder); + return; + } + + var typeMapping = column.PropertyMappings.FirstOrDefault()?.TypeMapping; + var converter = typeMapping?.Converter; + var clrType = (converter?.ProviderClrType ?? typeMapping!.ClrType).UnwrapNullableType(); + var columnType = (string)(operation[RelationalAnnotationNames.ColumnType] + ?? column[RelationalAnnotationNames.ColumnType])!; + var isNullable = column.IsNullable; + + var defaultValue = column.DefaultValue; + defaultValue = converter != null + ? converter.ConvertToProvider(defaultValue) + : defaultValue; + defaultValue = (defaultValue == DBNull.Value ? null : defaultValue) + ?? (isNullable + ? null + : clrType == typeof(string) + ? string.Empty + : clrType.IsArray + ? Array.CreateInstance(clrType.GetElementType()!, 0) + : clrType.GetDefaultValue()); + + var isRowVersion = (clrType == typeof(DateTime) || clrType == typeof(byte[])) && + column.IsRowVersion; + + var addColumnOperation = new AddColumnOperation + { + Schema = operation.Schema, + Table = operation.Table, + Name = operation.NewName, + ClrType = clrType, + ColumnType = columnType, + IsUnicode = column.IsUnicode, + MaxLength = column.MaxLength, + IsFixedLength = column.IsFixedLength, + IsRowVersion = isRowVersion, + IsNullable = isNullable, + DefaultValue = defaultValue, + DefaultValueSql = column.DefaultValueSql, + ComputedColumnSql = column.ComputedColumnSql, + IsStored = column.IsStored, + }; + + ColumnDefinition( + addColumnOperation, + model, + builder); + builder.AppendLine(Dependencies.SqlGenerationHelper.StatementTerminator); + EndStatement(builder); + + } + + protected override void Generate( + EnsureSchemaOperation operation, + IModel? model, + MigrationCommandListBuilder builder) + { + Check.NotNull(operation, nameof(operation)); + Check.NotNull(builder, nameof(builder)); + + builder + .Append("CREATE DATABASE IF NOT EXISTS ") + .Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Name)); + + EndStatement(builder, suppressTransaction: true); + } + + protected virtual void Generate( + MySQLCreateDatabaseOperation operation, + IModel? model, + MigrationCommandListBuilder builder) + { + Check.NotNull(operation, nameof(operation)); + Check.NotNull(builder, nameof(builder)); + + builder + .Append("CREATE DATABASE ") + .Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Name)); + + EndStatement(builder, suppressTransaction: true); + } + + protected virtual void Generate( + [NotNull] MySQLDropDatabaseOperation operation, + [CanBeNull] IModel model, + [NotNull] MigrationCommandListBuilder builder) + { + Check.NotNull(operation, nameof(operation)); + Check.NotNull(builder, nameof(builder)); + + builder + .Append("DROP DATABASE IF EXISTS ") + .Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Name)) + .Append(Dependencies.SqlGenerationHelper.StatementTerminator) + .AppendLine(Dependencies.SqlGenerationHelper.BatchTerminator); + + EndStatement(builder); + } + + /// + /// Generates a SQL fragment for a column definition in an . + /// + /// The operation. + /// The target model, which may be null if the operations exist without a model. + /// The command builder to use to add the SQL fragment. + protected override void ColumnDefinition(AddColumnOperation operation, IModel? model, + MigrationCommandListBuilder builder) + => ColumnDefinition( + operation.Schema, + operation.Table, + operation.Name, + operation, + model, + builder); + + /// + /// Generates a SQL fragment for a column definition for the given column metadata. + /// + /// The schema that contains the table, or null to use the default schema. + /// The table that contains the column. + /// The column name. + /// The column metadata. + /// The target model, which may be null if the operations exist without a model. + /// The command builder to use to add the SQL fragment. + protected override void ColumnDefinition( + string? schema, + string table, + string name, + ColumnOperation operation, + IModel? model, + MigrationCommandListBuilder builder) + { + Check.NotEmpty(name, nameof(name)); + Check.NotNull(operation, nameof(operation)); + Check.NotNull(builder, nameof(builder)); + + var matchType = operation.ColumnType ?? GetColumnType(schema, table, name, operation, model); + var matchLen = ""; + var match = _typeRegex.Match(matchType ?? "-"); + if (match.Success) + { + matchType = match.Groups[1].Value.ToLower(); + if (!string.IsNullOrWhiteSpace(match.Groups[2].Value)) + { + matchLen = match.Groups[2].Value; + } + } + + var valueGenerationStrategy = MySQLValueGenerationStrategyCompatibility.GetValueGenerationStrategy(operation.GetAnnotations().OfType().ToArray()); + + var autoIncrement = false; + if (valueGenerationStrategy == MySQLValueGenerationStrategy.IdentityColumn && + string.IsNullOrWhiteSpace(operation.DefaultValueSql) && operation.DefaultValue == null) + { + switch (matchType) + { + case "tinyint": + case "smallint": + case "mediumint": + case "int": + case "bigint": + autoIncrement = true; + break; + case "datetime": + case "timestamp": + operation.DefaultValueSql = $"CURRENT_TIMESTAMP({matchLen})"; + break; + } + } + + string? onUpdateSql = null; + if (operation.IsRowVersion || valueGenerationStrategy == MySQLValueGenerationStrategy.ComputedColumn) + { + switch (matchType) + { + case "datetime": + case "timestamp": + if (string.IsNullOrWhiteSpace(operation.DefaultValueSql) && operation.DefaultValue == null) + { + operation.DefaultValueSql = $"CURRENT_TIMESTAMP({matchLen})"; + } + + onUpdateSql = $"CURRENT_TIMESTAMP({matchLen})"; + break; + } + } + + if (operation.ComputedColumnSql == null) + { + ColumnDefinitionWithCharSet(schema, table, name, operation, model, builder); + + if (autoIncrement) + { + builder.Append(" AUTO_INCREMENT"); + } + else + { + if (onUpdateSql != null) + { + builder + .Append(" ON UPDATE ") + .Append(onUpdateSql); + } + } + } + else + { + builder + .Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(name)) + .Append(" ") + .Append(operation.ColumnType ?? GetColumnType(schema, table, name, operation, model)); + builder + .Append(" AS ") + .Append($"({operation.ComputedColumnSql})"); + + if (operation.IsNullable) + { + builder.Append(" NULL"); + } + } + } + + private void ColumnDefinitionWithCharSet(string? schema, string table, string name, ColumnOperation operation, IModel? model, MigrationCommandListBuilder builder) + { + if (operation.ComputedColumnSql != null) + { + ComputedColumnDefinition(schema, table, name, operation, model, builder); + return; + } + + var property = model?.GetRelationalModel().FindTable(table, schema)? + .FindColumn(name)!.PropertyMappings.FirstOrDefault()!.Property; + + var columnType = operation.ColumnType != null + ? GetColumnTypeWithCharSetAndCollation(operation, operation.ColumnType, property) + : GetColumnType(schema, table, name, operation, model); + + builder + .Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(name)) + .Append(" ") + .Append(columnType); + + builder.Append(operation.IsNullable ? " NULL" : " NOT NULL"); + + DefaultValue(operation.DefaultValue, operation.DefaultValueSql, columnType, builder); + } + + private string GetColumnTypeWithCharSetAndCollation(ColumnOperation operation, string? columnType, IProperty? property) + { + var charSet = property != null ? property[MySQLAnnotationNames.Charset] : operation[MySQLAnnotationNames.Charset]; + if (charSet != null) + { + const string characterSetClausePattern = @"CHARACTER SET \w+"; + var characterSetClause = $@"CHARACTER SET {charSet}"; + + columnType = Regex.IsMatch(columnType!, characterSetClausePattern, RegexOptions.IgnoreCase) + ? Regex.Replace(columnType!, characterSetClausePattern, characterSetClause) + : columnType!.TrimEnd() + " " + characterSetClause; + } + + var collation = property != null ? property[MySQLAnnotationNames.Collation] : operation[MySQLAnnotationNames.Collation]; + if (collation != null) + { + const string collationClausePattern = @"COLLATE \w+"; + var collationClause = $@"COLLATE {collation}"; + + columnType = Regex.IsMatch(columnType!, collationClausePattern, RegexOptions.IgnoreCase) + ? Regex.Replace(columnType!, collationClausePattern, collationClause) + : columnType!.TrimEnd() + " " + collationClause; + } + + return columnType!; + } + + protected override string GetColumnType(string? schema, string table, string name, ColumnOperation operation, IModel? model) + => GetColumnTypeWithCharSetAndCollation( + operation, + base.GetColumnType(schema, table, name, operation, model), + model?.GetRelationalModel().FindTable(table, schema)?.FindColumn(name)!.PropertyMappings.FirstOrDefault()!.Property); + + /// + /// Generates a SQL fragment for the default constraint of a column. + /// + /// The default value for the column. + /// The SQL expression to use for the column's default constraint. + /// The command builder to use to add the SQL fragment. + /// Store/database type of the column. + protected override void DefaultValue(object? defaultValue, string? defaultValueSql, string? columnType, MigrationCommandListBuilder builder) + { + Check.NotNull(builder, nameof(builder)); + + if (defaultValueSql != null) + { + builder + .Append(" DEFAULT ") + .Append(defaultValueSql); + } + else if (defaultValue != null) + { + var typeMapping = Dependencies.TypeMappingSource.GetMappingForValue(defaultValue); + builder + .Append(" DEFAULT ") + .Append(typeMapping.GenerateSqlLiteral(defaultValue)); + } + } + + + protected override void PrimaryKeyConstraint( + [NotNull] AddPrimaryKeyOperation operation, + [CanBeNull] IModel? model, + [NotNull] MigrationCommandListBuilder builder) + { + Check.NotNull(operation, nameof(operation)); + Check.NotNull(builder, nameof(builder)); + + + //MySQL always assign PRIMARY to the PK name no way to override that. + // check http://dev.mysql.com/doc/refman/5.1/en/create-table.html + + builder + .Append("PRIMARY KEY ") + .Append("(") + .Append(string.Join(", ", operation.Columns.Select(Dependencies.SqlGenerationHelper.DelimitIdentifier))) + .Append(")"); + + IndexTraits(operation, model, builder); + } + + protected override void Generate(AlterColumnOperation operation, IModel? model, MigrationCommandListBuilder builder) + { + Check.NotNull(operation, nameof(operation)); + Check.NotNull(builder, nameof(builder)); + + builder + .Append("ALTER TABLE ") + .Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Table, operation.Schema)) + .Append(" MODIFY "); + ColumnDefinition(operation.Schema, operation.Table, operation.Name, operation, model, builder); + builder + .AppendLine(Dependencies.SqlGenerationHelper.StatementTerminator); + EndStatement(builder); + } + + protected override void Generate(RenameTableOperation operation, IModel? model, MigrationCommandListBuilder builder) + { + Check.NotNull(operation, nameof(operation)); + Check.NotNull(builder, nameof(builder)); + + builder + .Append("ALTER TABLE " + operation.Name) + .Append(" RENAME " + operation.NewName) + .AppendLine(Dependencies.SqlGenerationHelper.StatementTerminator); + + EndStatement(builder); + } + + protected override void Generate(CreateIndexOperation operation, IModel? model, MigrationCommandListBuilder builder, bool terminate) + { + Check.NotNull(operation, nameof(operation)); + Check.NotNull(builder, nameof(builder)); + + builder + .Append("CREATE " + (operation.IsUnique ? "UNIQUE " : "") + "INDEX "); + + string schema = string.IsNullOrWhiteSpace(operation.Schema) ? string.Empty : $"`{operation.Schema}`."; + + builder.Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Name) + + $" ON {schema}`{operation.Table}` ({string.Join(", ", operation.Columns.Select(Dependencies.SqlGenerationHelper.DelimitIdentifier))})") + .AppendLine(Dependencies.SqlGenerationHelper.StatementTerminator); + + EndStatement(builder); + } + + protected override void Generate(RenameIndexOperation operation, IModel? model, MigrationCommandListBuilder builder) + { + Check.NotNull(operation, nameof(operation)); + Check.NotNull(builder, nameof(builder)); + string tableName = operation.Table ?? string.Empty; + + builder.Append("ALTER TABLE ") + .Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(tableName, operation.Schema)) + .Append(" RENAME INDEX ") + .Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.Name)) + .Append(" TO ") + .Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(operation.NewName)) + .AppendLine(";"); + + EndStatement(builder); + } + + protected override void Generate(DropIndexOperation operation, IModel? model, MigrationCommandListBuilder builder, bool terminate) + { + Check.NotNull(operation, nameof(operation)); + Check.NotNull(builder, nameof(builder)); + + builder + .Append("DROP INDEX ") + .Append(operation.Name) + .Append(" ON " + operation.Table) + .AppendLine(Dependencies.SqlGenerationHelper.StatementTerminator); + EndStatement(builder); + } + + protected override void Generate( + CreateTableOperation operation, + IModel? model, + MigrationCommandListBuilder builder, + bool terminate = true) + { + base.Generate(operation, model, builder, false); + + if (model?.GetRelationalModel().FindTable(operation.Name, operation.Schema) != null) + { +#if !NET8_0_OR_GREATER + var entity = model?.GetRelationalModel().FindTable(operation.Name, operation.Schema)!.EntityTypeMappings.FirstOrDefault()!.EntityType; +#else + var entity = model?.GetRelationalModel().FindTable(operation.Name, operation.Schema)!.EntityTypeMappings.FirstOrDefault()!.TypeBase; +#endif + + var charset = entity?.FindAnnotation(MySQLAnnotationNames.Charset); + if (charset != null) + { + builder.Append($" CHARACTER SET {charset.Value}"); + } + + var collation = entity?.FindAnnotation(MySQLAnnotationNames.Collation); + if (collation != null) + { + builder.Append($" COLLATE {collation.Value}"); + } + } + + if (terminate) + { + builder.AppendLine(Dependencies.SqlGenerationHelper.StatementTerminator); + EndStatement(builder); + } + } + + protected override void Generate( + DropPrimaryKeyOperation operation, + IModel? model, + MigrationCommandListBuilder builder, + bool terminate = true) + { + // It does nothing due to this operation should not be isolated for MySQL + EndStatement(builder); + } + + protected override void Generate( + AddPrimaryKeyOperation operation, + IModel? model, + MigrationCommandListBuilder builder, + bool terminate = true) + { + // It does nothing due to this operation should not be isolated for MySQL + EndStatement(builder); + } + } +} diff --git a/EFCore/src/Migrations/Operations/CreateDatabaseOperation.cs b/EFCore/src/Migrations/Operations/CreateDatabaseOperation.cs new file mode 100644 index 000000000..1e266a2ff --- /dev/null +++ b/EFCore/src/Migrations/Operations/CreateDatabaseOperation.cs @@ -0,0 +1,41 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Migrations.Operations; + +namespace MySql.EntityFrameworkCore.Migrations.Operations +{ + /// + /// Creates a database operation class for migrations. + /// + internal class MySQLCreateDatabaseOperation : DatabaseOperation + { + public virtual string Name { get; set; } = null!; + public virtual string Charset { get; set; } = null!; + } +} diff --git a/EFCore/src/Migrations/Operations/DropDatabaseOperation.cs b/EFCore/src/Migrations/Operations/DropDatabaseOperation.cs new file mode 100644 index 000000000..bb9dc3bf0 --- /dev/null +++ b/EFCore/src/Migrations/Operations/DropDatabaseOperation.cs @@ -0,0 +1,43 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Migrations.Operations; + +namespace MySql.EntityFrameworkCore.Migrations.Operations +{ + /// + /// Drops database operation for migrations. + /// + internal class MySQLDropDatabaseOperation : MigrationOperation + { + /// + /// The name of the database. + /// + public virtual string Name { get; set; } = null!; + } +} diff --git a/EFCore/src/Migrations/Operations/MySQLDropPrimaryKeyAndRecreateForeignKeysOperation.cs b/EFCore/src/Migrations/Operations/MySQLDropPrimaryKeyAndRecreateForeignKeysOperation.cs new file mode 100644 index 000000000..1626aff58 --- /dev/null +++ b/EFCore/src/Migrations/Operations/MySQLDropPrimaryKeyAndRecreateForeignKeysOperation.cs @@ -0,0 +1,46 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Migrations.Operations; +using System.Diagnostics; + +namespace MySql.EntityFrameworkCore.Migrations.Operations +{ + /// + /// A migration operation for dropping a primary key and recreating foreign keys. + /// + + [DebuggerDisplay("ALTER TABLE {Table} DROP CONSTRAINT {Name}")] + public class MySQLDropPrimaryKeyAndRecreateForeignKeysOperation : DropPrimaryKeyOperation + { + /// + /// Recreate all foreign keys or not. + /// + public virtual bool RecreateForeignKeys { get; set; } + } +} diff --git a/EFCore/src/Migrations/Operations/MySQLDropUniqueConstraintAndRecreateForeignKeysOperation.cs b/EFCore/src/Migrations/Operations/MySQLDropUniqueConstraintAndRecreateForeignKeysOperation.cs new file mode 100644 index 000000000..005a01f4b --- /dev/null +++ b/EFCore/src/Migrations/Operations/MySQLDropUniqueConstraintAndRecreateForeignKeysOperation.cs @@ -0,0 +1,46 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Migrations.Operations; +using System.Diagnostics; + +namespace MySql.EntityFrameworkCore.Migrations.Operations +{ + /// + /// A migration operation for dropping a unique constraint and recreating foreign keys. + /// + + [DebuggerDisplay("ALTER TABLE {Table} DROP CONSTRAINT {Name}")] + public class MySQLDropUniqueConstraintAndRecreateForeignKeysOperation : DropUniqueConstraintOperation + { + /// + /// Recreate all foreign keys or not. + /// + public virtual bool RecreateForeignKeys { get; set; } + } +} diff --git a/EFCore/src/MySql.EntityFrameworkCore.csproj b/EFCore/src/MySql.EntityFrameworkCore.csproj new file mode 100644 index 000000000..8a96c4f35 --- /dev/null +++ b/EFCore/src/MySql.EntityFrameworkCore.csproj @@ -0,0 +1,63 @@ + + + + MySQL Server database provider for Entity Framework Core. + MySQL Entity Framework Core + Oracle + MySql;.NET Connector;MySql Entity Framework Core;netcore;.Net Core;MySql Conector/Net Entity Framework Core;coreclr;C/NET;C/Net Core + http://www.mysql.com/common/logos/logo-mysql-170x115.png + https://github.com/mysql/mysql-connector-net + GPL-2.0-only WITH Universal-FOSS-exception-1.0 + true + 13.0 + net9.0;net8.0; + MySql.EntityFrameworkCore + MySql.EntityFrameworkCore + enable + True + True + ..\..\ConnectorNetPublicKey.snk + true + $(NoWarn);CS1591;EF1001;EF9100 + false + + + + $(TargetFrameworks);net10.0 + + + + + + + + + + + + + + + + + + + + + + + + True + True + MySQLStrings.resx + + + + + + ResXFileCodeGenerator + MySQLStrings.Designer.cs + + + + diff --git a/EFCore/src/Properties/AssemblyInfo.cs b/EFCore/src/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..48eeec93c --- /dev/null +++ b/EFCore/src/Properties/AssemblyInfo.cs @@ -0,0 +1,63 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Design; +using System.Reflection; +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +// 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. +[assembly: AssemblyTitle("MySql.EntityFrameworkCore")] +[assembly: AssemblyDescription("MySql.EntityFrameworkCore adds support for Microsoft Entity Framework Core (EF Core) 8 and 9.")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Oracle Corporation")] +[assembly: AssemblyProduct("MySQL Connector/NET")] +[assembly: AssemblyCopyright("Copyright © 2021, 2025, Oracle and/or its affiliates.")] +[assembly: AssemblyTrademark("Oracle®, Java, MySQL, and NetSuite are registered trademarks of Oracle and/or its affiliates.")] +[assembly: AssemblyCulture("")] +[assembly: SecurityRules(SecurityRuleSet.Level1)] +[assembly: CLSCompliant(false)] + +// Setting ComVisible to false makes the types in this assembly not visible to COM +// components. If you need to access a type in this assembly from COM, set the ComVisible +// attribute to true on that type. + +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM. + +[assembly: Guid("0f34159f-ed9d-450b-8f91-71e1a7bc0399")] + +[assembly: InternalsVisibleTo("MySql.EntityFrameworkCore.Basic.Tests, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] +[assembly: InternalsVisibleTo("MySql.EntityFrameworkCore.Design.Tests, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] +[assembly: InternalsVisibleTo("MySql.EntityFrameworkCore.Migrations.Tests, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] +[assembly: DesignTimeProviderServices("MySql.EntityFrameworkCore.Design.Internal.MySQLDesignTimeServices")] diff --git a/EFCore/src/Properties/MySQLStrings.Designer.cs b/EFCore/src/Properties/MySQLStrings.Designer.cs new file mode 100644 index 000000000..cf3b01c53 --- /dev/null +++ b/EFCore/src/Properties/MySQLStrings.Designer.cs @@ -0,0 +1,135 @@ +//------------------------------------------------------------------------------ +// +// 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 MySql.EntityFrameworkCore.Properties { + 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", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class MySQLStrings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal MySQLStrings() { + } + + /// + /// 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("MySql.EntityFrameworkCore.Properties.MySQLStrings", typeof(MySQLStrings).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 The specified expression does not have the correct Type.. + /// + internal static string ExpressionTypeMismatch { + get { + return ResourceManager.GetString("ExpressionTypeMismatch", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The specified table '{0}' is not valid.. + /// + internal static string InvalidTableToIncludeInScaffolding { + get { + return ResourceManager.GetString("InvalidTableToIncludeInScaffolding", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The database name could not be determined. To use EnsureDeleted, the connection string must specify Initial Catalog.. + /// + internal static string NoInitialCatalog { + get { + return ResourceManager.GetString("NoInitialCatalog", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Could not save changes. Please configure your entity type accordingly.. + /// + internal static string SaveChangesFailed { + get { + return ResourceManager.GetString("SaveChangesFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to An exception has been raised that is likely due to a transient failure. Consider enabling transient error resiliency by adding 'EnableRetryOnFailure()' to the 'UseMySql' call.. + /// + internal static string TransientExceptionDetected { + get { + return ResourceManager.GetString("TransientExceptionDetected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Missing length for data type '{0}'.. + /// + internal static string UnqualifiedDataType { + get { + return ResourceManager.GetString("UnqualifiedDataType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The specified type is invalid for computed value generation ('{0}' '{1}' '{2}'). The expected types are DateTime, and DateTimeOffset.. + /// + internal static string WrongComputedType { + get { + return ResourceManager.GetString("WrongComputedType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The specified type is invalid for identity value generation ('{0}' '{1}' '{2}'). The expected types are int, DateTime, and DateTimeOffset.. + /// + internal static string WrongIdentityType { + get { + return ResourceManager.GetString("WrongIdentityType", resourceCulture); + } + } + } +} diff --git a/EFCore/src/Properties/MySQLStrings.resx b/EFCore/src/Properties/MySQLStrings.resx new file mode 100644 index 000000000..770df8cc6 --- /dev/null +++ b/EFCore/src/Properties/MySQLStrings.resx @@ -0,0 +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 + + + The specified expression does not have the correct Type. + + + The specified table '{0}' is not valid. + + + The database name could not be determined. To use EnsureDeleted, the connection string must specify Initial Catalog. + + + Could not save changes. Please configure your entity type accordingly. + + + An exception has been raised that is likely due to a transient failure. Consider enabling transient error resiliency by adding 'EnableRetryOnFailure()' to the 'UseMySql' call. + + + Missing length for data type '{0}'. + + + The specified type is invalid for computed value generation ('{0}' '{1}' '{2}'). The expected types are DateTime, and DateTimeOffset. + + + The specified type is invalid for identity value generation ('{0}' '{1}' '{2}'). The expected types are int, DateTime, and DateTimeOffset. + + \ No newline at end of file diff --git a/EFCore/src/Properties/VersionInfo.cs b/EFCore/src/Properties/VersionInfo.cs new file mode 100644 index 000000000..2613c8c80 --- /dev/null +++ b/EFCore/src/Properties/VersionInfo.cs @@ -0,0 +1,58 @@ +// Copyright © 2024, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Reflection; +using System.Resources; + +// +// 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 Revision and Build Numbers +// by using the '*' as shown below: + +#if NET8_0 +[assembly: AssemblyVersion("9.4.0")] +[assembly: AssemblyInformationalVersion("8.0.11.0+MySQL9.4.0")] +[assembly: AssemblyFileVersion("9.4.0.0")] +[assembly: NeutralResourcesLanguage("en-US")] +#elif NET9_0 +[assembly: AssemblyVersion("9.4.0")] +[assembly: AssemblyInformationalVersion("9.0.3.0+MySQL9.4.0")] +[assembly: AssemblyFileVersion("9.4.0.0")] +[assembly: NeutralResourcesLanguage("en-US")] +#elif NET10_0 +[assembly: AssemblyVersion("9.4.0")] +[assembly: AssemblyInformationalVersion("10.0.0.0-preview+MySQL9.4.0")] +[assembly: AssemblyFileVersion("9.4.0.0")] +[assembly: NeutralResourcesLanguage("en-US")] +#endif diff --git a/EFCore/src/Query/ExpressionTranslators/Internal/MySQLByteArrayMethodTranslator.cs b/EFCore/src/Query/ExpressionTranslators/Internal/MySQLByteArrayMethodTranslator.cs new file mode 100644 index 000000000..61466321f --- /dev/null +++ b/EFCore/src/Query/ExpressionTranslators/Internal/MySQLByteArrayMethodTranslator.cs @@ -0,0 +1,103 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using MySql.EntityFrameworkCore.Query.Internal; +using MySql.EntityFrameworkCore.Storage.Internal; +using MySql.EntityFrameworkCore.Utils; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace MySql.EntityFrameworkCore.Query.ExpressionTranslators.Internal +{ + internal class MySQLByteArrayMethodTranslator : IMethodCallTranslator + { + private readonly MySQLSqlExpressionFactory _sqlExpressionFactory; + + private static readonly MethodInfo _containsMethod = typeof(Enumerable) + .GetTypeInfo() + .GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly) + .Single(m => m.Name == nameof(Enumerable.Contains) && m.GetParameters().Length == 2); + + private static readonly MethodInfo _firstWithoutPredicate = typeof(Enumerable) + .GetTypeInfo() + .GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly) + .Single(mi => mi.Name == nameof(Enumerable.First) && mi.GetParameters().Length == 1); + + public MySQLByteArrayMethodTranslator([NotNull] MySQLSqlExpressionFactory sqlExpressionFactory) + { + _sqlExpressionFactory = sqlExpressionFactory; + } + + public virtual SqlExpression? Translate( + SqlExpression? instance, + MethodInfo method, + IReadOnlyList arguments, + IDiagnosticsLogger logger) + { + Check.NotNull(method, nameof(method)); + Check.NotNull(arguments, nameof(arguments)); + Check.NotNull(logger, nameof(logger)); + + if (method.IsGenericMethod && + arguments[0].TypeMapping is MySQLByteArrayTypeMapping) + { + if (method.GetGenericMethodDefinition().Equals(_containsMethod)) + { + var source = arguments[0]; + var sourceTypeMapping = source.TypeMapping; + + var value = arguments[1] is SqlConstantExpression constantValue + ? (SqlExpression)_sqlExpressionFactory.Constant(new[] { (byte)constantValue.Value! }, sourceTypeMapping) + : _sqlExpressionFactory.Convert(arguments[1], typeof(byte[]), sourceTypeMapping); + + return _sqlExpressionFactory.GreaterThan( + _sqlExpressionFactory.NullableFunction( + "LOCATE", + new[] { value, source }, + typeof(int)), + _sqlExpressionFactory.Constant(0)); + } + + if (method.GetGenericMethodDefinition().Equals(_firstWithoutPredicate)) + { + return _sqlExpressionFactory.NullableFunction( + "ASCII", + new[] { arguments[0] }, + typeof(byte)); + } + } + + return null; + } + } +} diff --git a/EFCore/src/Query/ExpressionTranslators/Internal/MySQLDbFunctionsExtensionsMethodTranslator.cs b/EFCore/src/Query/ExpressionTranslators/Internal/MySQLDbFunctionsExtensionsMethodTranslator.cs new file mode 100644 index 000000000..82688e6cf --- /dev/null +++ b/EFCore/src/Query/ExpressionTranslators/Internal/MySQLDbFunctionsExtensionsMethodTranslator.cs @@ -0,0 +1,188 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using Microsoft.EntityFrameworkCore.Storage; +using MySql.EntityFrameworkCore.Extensions; +using MySql.EntityFrameworkCore.Query.Internal; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace MySql.EntityFrameworkCore.Query.ExpressionTranslators.Internal +{ + internal class MySQLDbFunctionsExtensionsMethodTranslator : IMethodCallTranslator + { + private readonly MySQLSqlExpressionFactory _sqlExpressionFactory; + + private static readonly Type[] _supportedTypes = { + typeof(int), + typeof(long), + typeof(DateTime), + typeof(DateOnly), + typeof(TimeOnly), + typeof(Guid), + typeof(bool), + typeof(byte), + typeof(byte[]), + typeof(double), + typeof(DateTimeOffset), + typeof(char), + typeof(short), + typeof(float), + typeof(decimal), + typeof(TimeSpan), + typeof(uint), + typeof(ushort), + typeof(ulong), + typeof(sbyte), + typeof(int?), + typeof(long?), + typeof(DateTime?), + typeof(DateOnly?), + typeof(TimeOnly?), + typeof(Guid?), + typeof(bool?), + typeof(byte?), + typeof(double?), + typeof(DateTimeOffset?), + typeof(char?), + typeof(short?), + typeof(float?), + typeof(decimal?), + typeof(TimeSpan?), + typeof(uint?), + typeof(ushort?), + typeof(ulong?), + typeof(sbyte?), + }; + + private static readonly MethodInfo[] _methodInfos + = typeof(MySQLDbFunctionsExtensions).GetRuntimeMethods() + .Where(method => method.Name == nameof(MySQLDbFunctionsExtensions.Like) + && method.IsGenericMethod + && method.GetParameters().Length >= 3 && method.GetParameters().Length <= 4) + .SelectMany(method => _supportedTypes.Select(type => method.MakeGenericMethod(type))).ToArray(); + + private static readonly MethodInfo _matchMethodInfo + = typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.Match), + new[] { typeof(DbFunctions), typeof(string), typeof(string), typeof(MySQLMatchSearchMode) })!; + + private static readonly MethodInfo _matchWithMultiplePropertiesMethodInfo + = typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.Match), + new[] { typeof(DbFunctions), typeof(string[]), typeof(string), typeof(MySQLMatchSearchMode) })!; + + public MySQLDbFunctionsExtensionsMethodTranslator(ISqlExpressionFactory sqlExpressionFactory) + { + _sqlExpressionFactory = (MySQLSqlExpressionFactory)sqlExpressionFactory; + } + + public SqlExpression? Translate(SqlExpression? instance, MethodInfo method, IReadOnlyList arguments, IDiagnosticsLogger logger) + { + if (_methodInfos.Any(m => Equals(method, m))) + { + var match = _sqlExpressionFactory.ApplyDefaultTypeMapping(arguments[1]); + + var pattern = InferStringTypeMappingOrApplyDefault( + arguments[2], + match.TypeMapping!); + + var excapeChar = arguments.Count == 4 + ? InferStringTypeMappingOrApplyDefault( + arguments[3], + match.TypeMapping!) + : null; + + return _sqlExpressionFactory.Like( + match, + pattern!, + excapeChar); + } + + if (Equals(method, _matchMethodInfo) || Equals(method, _matchWithMultiplePropertiesMethodInfo)) + { + if (arguments[3] is SqlConstantExpression constant) + { + return _sqlExpressionFactory.MakeMatch( + arguments[1], + arguments[2], + (MySQLMatchSearchMode)constant.Value!); + } + + if (arguments[3] is SqlParameterExpression parameter) + { + // Use nested OR clauses here, because MariaDB does not support MATCH...AGAINST from inside of + // CASE statements and the nested OR clauses use the fulltext index, while using CASE does not: + // = @p AND MATCH ... AGAINST ... OR + // = @p AND MATCH ... AGAINST ... OR [...] + var andClauses = Enum.GetValues(typeof(MySQLMatchSearchMode)) + .Cast() + .OrderByDescending(m => m) + .Select(m => _sqlExpressionFactory.AndAlso( + _sqlExpressionFactory.Equal(parameter, _sqlExpressionFactory.Constant(m)), + _sqlExpressionFactory.MakeMatch(arguments[1], arguments[2], m))) + .ToArray(); + + return andClauses + .Skip(1) + .Aggregate( + andClauses.First(), + (currentAnd, previousExpression) => _sqlExpressionFactory.OrElse(previousExpression, currentAnd)); + } + } + + return null; + } + + private SqlExpression? InferStringTypeMappingOrApplyDefault(SqlExpression expression, RelationalTypeMapping inferenceSourceTypeMapping) + { + if (expression == null) + { + return null; + } + + if (expression.TypeMapping != null) + { + return expression; + } + + if (expression.Type == typeof(string) && inferenceSourceTypeMapping?.ClrType == typeof(string)) + { + return _sqlExpressionFactory.ApplyTypeMapping(expression, inferenceSourceTypeMapping); + } + + return _sqlExpressionFactory.ApplyDefaultTypeMapping(expression); + } + } +} diff --git a/EFCore/src/Query/ExpressionTranslators/Internal/MySQLRegexIsMatchTranslator.cs b/EFCore/src/Query/ExpressionTranslators/Internal/MySQLRegexIsMatchTranslator.cs new file mode 100644 index 000000000..bda2f2990 --- /dev/null +++ b/EFCore/src/Query/ExpressionTranslators/Internal/MySQLRegexIsMatchTranslator.cs @@ -0,0 +1,63 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using MySql.EntityFrameworkCore.Query.Internal; +using System.Collections.Generic; +using System.Reflection; +using System.Text.RegularExpressions; + +namespace MySql.EntityFrameworkCore.Query.ExpressionTranslators.Internal +{ + internal class MySQLRegexIsMatchTranslator : IMethodCallTranslator + { + private static readonly MethodInfo _methodInfo + = typeof(Regex).GetRuntimeMethod(nameof(Regex.IsMatch), new[] { typeof(string), typeof(string) })!; + + private readonly MySQLSqlExpressionFactory _sqlExpressionFactory; + + public MySQLRegexIsMatchTranslator(ISqlExpressionFactory sqlExpressionFactory) + { + _sqlExpressionFactory = (MySQLSqlExpressionFactory)sqlExpressionFactory; + } + + public virtual SqlExpression? Translate( + SqlExpression? instance, + MethodInfo method, + IReadOnlyList arguments, + IDiagnosticsLogger logger) + => _methodInfo.Equals(method) + ? _sqlExpressionFactory.Regexp( + arguments[0], + arguments[1]) + : null; + } +} diff --git a/EFCore/src/Query/ExpressionTranslators/Internal/MySQLStringLengthTranslator.cs b/EFCore/src/Query/ExpressionTranslators/Internal/MySQLStringLengthTranslator.cs new file mode 100644 index 000000000..64d23c763 --- /dev/null +++ b/EFCore/src/Query/ExpressionTranslators/Internal/MySQLStringLengthTranslator.cs @@ -0,0 +1,69 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using System; +using System.Reflection; +using static MySql.EntityFrameworkCore.Utils.Statics; + +namespace MySql.EntityFrameworkCore.Query.ExpressionTranslators.Internal +{ + internal class MySQLStringLengthTranslator : IMemberTranslator + { + private readonly ISqlExpressionFactory _sqlExpressionFactory; + + public MySQLStringLengthTranslator(ISqlExpressionFactory sqlExpressionFactory) + { + _sqlExpressionFactory = sqlExpressionFactory; + } + + public virtual SqlExpression? Translate(SqlExpression instance, MemberInfo member, Type returnType) + { + if (member.Name == nameof(string.Length) + && instance?.Type == typeof(string)) + { + return _sqlExpressionFactory.Function( + "CHAR_LENGTH", + new[] { instance }, + nullable: true, + argumentsPropagateNullability: TrueArrays[1], + returnType); + } + + return null; + } + + public SqlExpression Translate(SqlExpression? instance, MemberInfo member, Type returnType, IDiagnosticsLogger logger) + { + throw new NotImplementedException(); + } + } +} diff --git a/EFCore/src/Query/Expressions/Internal/MySQLBinaryExpression.cs b/EFCore/src/Query/Expressions/Internal/MySQLBinaryExpression.cs new file mode 100644 index 000000000..9a3e30f10 --- /dev/null +++ b/EFCore/src/Query/Expressions/Internal/MySQLBinaryExpression.cs @@ -0,0 +1,160 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using Microsoft.EntityFrameworkCore.Storage; +using MySql.EntityFrameworkCore.Utils; +using System; +using System.Linq.Expressions; +using System.Reflection; + +namespace MySql.EntityFrameworkCore.Query.Expressions.Internal +{ + internal enum MySQLBinaryExpressionOperatorType + { + IntegerDivision, + NonOptimizedEqual + } + + internal class MySQLBinaryExpression : SqlExpression + { + public MySQLBinaryExpression( + MySQLBinaryExpressionOperatorType operatorType, + SqlExpression left, + SqlExpression right, + Type type, + RelationalTypeMapping? typeMapping) + : base(type, typeMapping) + { + Check.NotNull(left, nameof(left)); + Check.NotNull(right, nameof(right)); + + OperatorType = operatorType; + + Left = left; + Right = right; + } + +#if NET9_0_OR_GREATER + private static ConstructorInfo? _quotingConstructor; +#endif + public virtual MySQLBinaryExpressionOperatorType OperatorType { get; } + public virtual SqlExpression Left { get; } + public virtual SqlExpression Right { get; } + + protected override Expression Accept(ExpressionVisitor visitor) + => visitor is MySQLQuerySqlGenerator mySqlQuerySqlGenerator + ? mySqlQuerySqlGenerator.VisitMySQLBinaryExpression(this) + : base.Accept(visitor); + + protected override Expression VisitChildren(ExpressionVisitor visitor) + { + var left = (SqlExpression)visitor.Visit(Left); + var right = (SqlExpression)visitor.Visit(Right); + + return Update(left, right); + } + +#if NET9_0_OR_GREATER + /// + public override Expression Quote() => New( + _quotingConstructor ??= typeof(MySQLBinaryExpression).GetConstructor( + [typeof(ExpressionType), typeof(SqlExpression), typeof(SqlExpression), typeof(Type), typeof(RelationalTypeMapping)])!, + Constant(OperatorType), + Left.Quote(), + Right.Quote(), + Constant(Type), + RelationalExpressionQuotingUtilities.QuoteTypeMapping(TypeMapping)); +#endif + + public virtual MySQLBinaryExpression Update(SqlExpression left, SqlExpression right) + => left != Left || right != Right + ? new MySQLBinaryExpression(OperatorType, left, right, Type, TypeMapping) + : this; + + protected override void Print(ExpressionPrinter expressionPrinter) + { + var requiresBrackets = RequiresBrackets(Left); + + if (requiresBrackets) + { + expressionPrinter.Append("("); + } + + expressionPrinter.Visit(Left); + + if (requiresBrackets) + { + expressionPrinter.Append(")"); + } + + switch (OperatorType) + { + case MySQLBinaryExpressionOperatorType.IntegerDivision: + expressionPrinter.Append(" DIV "); + break; + } + + requiresBrackets = RequiresBrackets(Right); + + if (requiresBrackets) + { + expressionPrinter.Append("("); + } + + expressionPrinter.Visit(Right); + + if (requiresBrackets) + { + expressionPrinter.Append(")"); + } + } + + private bool RequiresBrackets(SqlExpression expression) + { + return expression is SqlBinaryExpression sqlBinary + && sqlBinary.OperatorType != ExpressionType.Coalesce + || expression is LikeExpression; + } + + public override bool Equals(object? obj) + => obj != null + && (ReferenceEquals(this, obj) + || obj is MySQLBinaryExpression sqlBinaryExpression + && Equals(sqlBinaryExpression)); + + private bool Equals(MySQLBinaryExpression sqlBinaryExpression) + => base.Equals(sqlBinaryExpression) + && OperatorType == sqlBinaryExpression.OperatorType + && Left.Equals(sqlBinaryExpression.Left) + && Right.Equals(sqlBinaryExpression.Right); + + public override int GetHashCode() => HashCode.Combine(base.GetHashCode(), OperatorType, Left, Right); + } +} diff --git a/EFCore/src/Query/Expressions/Internal/MySQLCollateExpression.cs b/EFCore/src/Query/Expressions/Internal/MySQLCollateExpression.cs new file mode 100644 index 000000000..123249735 --- /dev/null +++ b/EFCore/src/Query/Expressions/Internal/MySQLCollateExpression.cs @@ -0,0 +1,208 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using Microsoft.EntityFrameworkCore.Storage; +using System; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; + +namespace MySql.EntityFrameworkCore.Query.Expressions.Internal +{ + /// + /// An expression that explicitly specifies the collation of a string value. + /// + internal class MySQLCollateExpression : SqlExpression + { + private readonly SqlExpression _valueExpression; + private readonly string _charset; + private readonly string _collation; + +#if NET9_0_OR_GREATER + private static ConstructorInfo? _quotingConstructor; +#endif + +#if NET9_0_OR_GREATER + public MySQLCollateExpression(SqlExpression operand, string collation) + : base(operand.Type, operand.TypeMapping) + { + Operand = operand; + Collation = collation; + } +#else + public MySQLCollateExpression( + SqlExpression valueExpression, + string charset, + string collation, + RelationalTypeMapping? typeMapping) + : base(typeof(string), typeMapping) + { + _valueExpression = valueExpression; + _charset = charset; + _collation = collation; + } +#endif + + + /// + /// The expression for which a collation is being specified. + /// + public virtual SqlExpression ValueExpression => _valueExpression; + + /// + /// The character set that the string is being converted to. + /// + public virtual string Charset => _charset; + +#if NET9_0_OR_GREATER + /// + /// The expression on which collation is applied. + /// + public virtual SqlExpression Operand { get; } + + public virtual string Collation { get; } +#else + /// + /// The collation that the string is being converted to. + /// + public virtual string Collation => _collation; +#endif + + + + /// + /// Dispatches to the specific visit method for this node type. + /// + protected override Expression Accept(ExpressionVisitor visitor) + => visitor is MySQLQuerySqlGenerator mySqlQuerySqlGenerator + ? mySqlQuerySqlGenerator.VisitMySQLCollateExpression(this) + : base.Accept(visitor); + + /// + /// Reduces the node and then calls the method passing the + /// reduced expression. + /// Throws an exception if the node isn't reducible. + /// + /// An instance of . + /// The expression being visited, or an expression which should replace it in the tree. + /// + /// Override this method to provide logic to walk the node's children. + /// A typical implementation will call visitor.Visit on each of its + /// children, and if any of them change, should return a new copy of + /// itself with the modified children. + /// + protected override Expression VisitChildren(ExpressionVisitor visitor) + { + var newValueExpression = visitor.VisitAndConvert(_valueExpression, nameof(VisitChildren)); + + return Update(newValueExpression); + + } + +#if NET9_0_OR_GREATER + public virtual MySQLCollateExpression Update(SqlExpression operand) + => operand != Operand + ? new MySQLCollateExpression(operand, Collation) + : this; + /// + public override Expression Quote() => New( + _quotingConstructor ??= typeof(MySQLCollateExpression).GetConstructor([typeof(SqlExpression), typeof(string)])!, + Operand.Quote(), + Constant(Collation)); + +#else + public virtual MySQLCollateExpression Update(SqlExpression valueExpression) + => valueExpression != _valueExpression && + valueExpression != null + ? new MySQLCollateExpression(valueExpression, _charset, _collation, TypeMapping) + : this; +#endif + + /// + /// Tests if this object is considered equal to another. + /// + /// The object to compare with the current object. + /// + /// if the objects are considered equal; otherwise, . + /// + public override bool Equals(object? obj) + { + if (obj is null) + { + return false; + } + + if (ReferenceEquals(this, obj)) + { + return true; + } + + return obj.GetType() == GetType() && Equals((MySQLCollateExpression)obj); + } + + private bool Equals(MySQLCollateExpression other) + => string.Equals(_charset, other._charset, StringComparison.OrdinalIgnoreCase) + && string.Equals(_collation, other._collation, StringComparison.OrdinalIgnoreCase) + && _valueExpression.Equals(other._valueExpression); + + /// + /// Returns a hash code for this object. + /// + /// + /// A hash code for this object. + /// + public override int GetHashCode() + { + unchecked + { + var hashCodes = + new[] { + _valueExpression.GetHashCode(), + StringComparer.OrdinalIgnoreCase.GetHashCode(_charset), + StringComparer.OrdinalIgnoreCase.GetHashCode(_collation) + }; + + return hashCodes.Aggregate(0, (acc, hc) => (acc * 397) ^ hc); + } + } + + /// + /// Creates a representation of the Expression. + /// + /// A representation of the Expression. + public override string ToString() => + $"{_valueExpression} COLLATE {_collation}"; + + protected override void Print(ExpressionPrinter expressionPrinter) + { + expressionPrinter.Append(ToString()); + } + } +} diff --git a/EFCore/src/Query/Expressions/Internal/MySQLColumnAliasReferenceExpression.cs b/EFCore/src/Query/Expressions/Internal/MySQLColumnAliasReferenceExpression.cs new file mode 100644 index 000000000..50cfadc82 --- /dev/null +++ b/EFCore/src/Query/Expressions/Internal/MySQLColumnAliasReferenceExpression.cs @@ -0,0 +1,109 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using Microsoft.EntityFrameworkCore.Storage; +using System; +using System.Linq.Expressions; +using System.Reflection; + +namespace MySql.EntityFrameworkCore.Query.Expressions.Internal +{ + /// + /// Enables referencing an alias from within the same SELECT statement, such as in a HAVING clause. + /// + internal class MySQLColumnAliasReferenceExpression : SqlExpression, IEquatable + { +#if NET9_0_OR_GREATER + private static ConstructorInfo? _quotingConstructor; +#endif + + [NotNull] + public virtual string Alias { get; } + + [NotNull] + public virtual SqlExpression Expression { get; } + + public MySQLColumnAliasReferenceExpression( + [NotNull] string alias, + [NotNull] SqlExpression expression, + [NotNull] Type type, + [CanBeNull] RelationalTypeMapping typeMapping) + : base(type, typeMapping) + { + Alias = alias; + Expression = expression; + } + + protected override Expression VisitChildren(ExpressionVisitor? visitor) + => this; + + public virtual MySQLColumnAliasReferenceExpression Update( + [NotNull] string alias, + [NotNull] SqlExpression expression) + => alias == Alias && + expression.Equals(Expression) + ? this + : new MySQLColumnAliasReferenceExpression(alias, expression, Type, TypeMapping!); + +#if NET9_0_OR_GREATER + public override Expression Quote() => New( + _quotingConstructor ??= typeof(MySQLColumnAliasReferenceExpression).GetConstructor([typeof(SqlExpression), typeof(string)])!, + Constant(Alias), + Expression.Quote(), + Constant(Type), + RelationalExpressionQuotingUtilities.QuoteTypeMapping(TypeMapping)); +#endif + + public override bool Equals(object? obj) + => Equals(obj as MySQLColumnAliasReferenceExpression); + + public virtual bool Equals(MySQLColumnAliasReferenceExpression? other) + => ReferenceEquals(this, other) || + other != null && + base.Equals(other) && + Equals(Expression, other.Expression); + + public override int GetHashCode() + => HashCode.Combine(base.GetHashCode(), Expression); + + protected override void Print(ExpressionPrinter expressionPrinter) + { + expressionPrinter.Append("`"); + expressionPrinter.Append(Alias); + expressionPrinter.Append("`"); + } + + public override string ToString() + => $"`{Alias}`"; + + public virtual SqlExpression ApplyTypeMapping(RelationalTypeMapping? typeMapping) + => new MySQLColumnAliasReferenceExpression(Alias, Expression, Type, typeMapping!); + } +} diff --git a/EFCore/src/Query/Expressions/Internal/MySQLComplexFunctionArgumentExpression.cs b/EFCore/src/Query/Expressions/Internal/MySQLComplexFunctionArgumentExpression.cs new file mode 100644 index 000000000..2290f0b86 --- /dev/null +++ b/EFCore/src/Query/Expressions/Internal/MySQLComplexFunctionArgumentExpression.cs @@ -0,0 +1,135 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using Microsoft.EntityFrameworkCore.Storage; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; + +namespace MySql.EntityFrameworkCore.Query.Expressions.Internal +{ + internal class MySQLComplexFunctionArgumentExpression : SqlExpression + { + +#if NET9_0_OR_GREATER + private static ConstructorInfo? _quotingConstructor; +#endif + + /// + /// The arguments parts. + /// + public virtual IReadOnlyList ArgumentParts { get; } + public virtual string Delimiter { get; } + + public MySQLComplexFunctionArgumentExpression( + IEnumerable argumentParts, + string delimiter, + Type type, + RelationalTypeMapping typeMapping) + : base(type, typeMapping) + { + Delimiter = delimiter; + ArgumentParts = argumentParts.ToList().AsReadOnly(); + } + + /// + /// Dispatches to the specific visit method for this node type. + /// + protected override Expression Accept(ExpressionVisitor visitor) => + visitor is MySQLQuerySqlGenerator mySqlQuerySqlGenerator + ? mySqlQuerySqlGenerator.VisitMySQLComplexFunctionArgumentExpression(this) + : base.Accept(visitor); + protected override Expression VisitChildren(ExpressionVisitor visitor) + { + var argumentParts = new SqlExpression[ArgumentParts.Count]; + + for (var i = 0; i < argumentParts.Length; i++) + { + argumentParts[i] = (SqlExpression)visitor.Visit(ArgumentParts[i]); + } + + return Update(argumentParts, Delimiter); + } + +#if NET9_0_OR_GREATER + public override Expression Quote() => New( + _quotingConstructor ??= typeof(MySQLComplexFunctionArgumentExpression).GetConstructor([typeof(SqlExpression), typeof(string)])!, + Constant(ArgumentParts), + Constant(Delimiter), + Constant(Type), + RelationalExpressionQuotingUtilities.QuoteTypeMapping(TypeMapping)); +#endif + + public virtual MySQLComplexFunctionArgumentExpression Update(IReadOnlyList argumentParts, string delimiter) + => !argumentParts.SequenceEqual(ArgumentParts) + ? new MySQLComplexFunctionArgumentExpression(argumentParts, delimiter, Type, TypeMapping!) + : this; + + + protected override void Print(ExpressionPrinter expressionPrinter) + => expressionPrinter.Append(ToString()); + + public override bool Equals(object? obj) + => obj != null + && (ReferenceEquals(this, obj) + || obj is MySQLComplexFunctionArgumentExpression sqlFragmentExpression + && Equals(sqlFragmentExpression)); + + private bool Equals(MySQLComplexFunctionArgumentExpression other) + => base.Equals(other) + && Type == other.Type + && ArgumentParts.SequenceEqual(other.ArgumentParts); + + /// + /// Returns a hash code for this object. + /// + /// + /// A hash code for this object. + /// + public override int GetHashCode() + { + unchecked + { + var hashCode = ArgumentParts.Aggregate(0, (current, argument) => current + ((current * 397) ^ argument.GetHashCode())); + hashCode = (hashCode * 397) ^ Type.GetHashCode(); + return hashCode; + } + } + + /// + /// Creates a representation of the Expression. + /// + /// A representation of the Expression. + public override string ToString() + => string.Join(" ", ArgumentParts); + } +} diff --git a/EFCore/src/Query/Expressions/Internal/MySQLJsonArrayIndexExpression.cs b/EFCore/src/Query/Expressions/Internal/MySQLJsonArrayIndexExpression.cs new file mode 100644 index 000000000..a1f5f5ba2 --- /dev/null +++ b/EFCore/src/Query/Expressions/Internal/MySQLJsonArrayIndexExpression.cs @@ -0,0 +1,102 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using Microsoft.EntityFrameworkCore.Storage; +using System; +using System.Linq.Expressions; +using System.Reflection; + +namespace MySql.EntityFrameworkCore.Query.Expressions.Internal +{ + /// + /// Represents a MySQL JSON array index (x[y]). + /// + internal class MySQLJsonArrayIndexExpression : SqlExpression, IEquatable + { + +#if NET9_0_OR_GREATER + private static ConstructorInfo? _quotingConstructor; +#endif + + [NotNull] + public virtual SqlExpression Expression { get; } + + public MySQLJsonArrayIndexExpression( + [NotNull] SqlExpression expression, + [NotNull] Type type, + [CanBeNull] RelationalTypeMapping typeMapping) + : base(type, typeMapping) + { + Expression = expression; + } + + protected override Expression VisitChildren(ExpressionVisitor visitor) + => Update((SqlExpression)visitor.Visit(Expression)); + +#if NET9_0_OR_GREATER + public override Expression Quote() => New( + _quotingConstructor ??= typeof(MySQLJsonArrayIndexExpression).GetConstructor([typeof(SqlExpression), typeof(string)])!, + Expression.Quote(), + Constant(Type), + RelationalExpressionQuotingUtilities.QuoteTypeMapping(TypeMapping)); +#endif + + public virtual MySQLJsonArrayIndexExpression Update( + [NotNull] SqlExpression expression) + => expression == Expression + ? this + : new MySQLJsonArrayIndexExpression(expression, Type, TypeMapping!); + + public override bool Equals(object? obj) + => Equals(obj as MySQLJsonArrayIndexExpression); + + public virtual bool Equals(MySQLJsonArrayIndexExpression? other) + => ReferenceEquals(this, other) || + other != null && + base.Equals(other) && + Equals(Expression, other.Expression); + + public override int GetHashCode() + => HashCode.Combine(base.GetHashCode(), Expression); + + protected override void Print(ExpressionPrinter expressionPrinter) + { + expressionPrinter.Append("["); + expressionPrinter.Visit(Expression); + expressionPrinter.Append("]"); + } + + public override string ToString() + => $"[{Expression}]"; + + public virtual SqlExpression ApplyTypeMapping(RelationalTypeMapping typeMapping) + => new MySQLJsonArrayIndexExpression(Expression, Type, typeMapping); + } +} diff --git a/EFCore/src/Query/Expressions/Internal/MySQLJsonTraversalExpression.cs b/EFCore/src/Query/Expressions/Internal/MySQLJsonTraversalExpression.cs new file mode 100644 index 000000000..2b31cc35a --- /dev/null +++ b/EFCore/src/Query/Expressions/Internal/MySQLJsonTraversalExpression.cs @@ -0,0 +1,162 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using Microsoft.EntityFrameworkCore.Storage; +using MySql.EntityFrameworkCore.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; + +namespace MySql.EntityFrameworkCore.Query.Expressions.Internal +{ + /// + /// Represents a MySQL JSON operator traversing a JSON document with a path (x->y or x->>y) + /// + internal class MySQLJsonTraversalExpression : SqlExpression, IEquatable + { + +#if NET9_0_OR_GREATER + private static ConstructorInfo? _quotingConstructor; +#endif + /// + /// The JSON column. + /// + [NotNull] + public virtual SqlExpression Expression { get; } + + /// + /// The path inside the JSON column. + /// + [NotNull] + public virtual IReadOnlyList Path { get; } + + /// + /// Whether the text-returning operator (x->>y) or the object-returning operator (x->y) is used. + /// + public virtual bool ReturnsText { get; } + + public MySQLJsonTraversalExpression( + [NotNull] SqlExpression expression, + bool returnsText, + [NotNull] Type type, + [CanBeNull] RelationalTypeMapping typeMapping) + : this(expression, new SqlExpression[0], returnsText, type, typeMapping) + { + } + + protected MySQLJsonTraversalExpression( + [NotNull] SqlExpression expression, + [NotNull] IReadOnlyList path, + bool returnsText, + [NotNull] Type type, + [CanBeNull] RelationalTypeMapping typeMapping) + : base(type, typeMapping) + { + if (returnsText && !TypeReturnsText(type)) + throw new ArgumentException($"{nameof(type)} is not a type that returns text", nameof(type)); + + Expression = expression; + Path = path; + ReturnsText = returnsText; + } + + public virtual MySQLJsonTraversalExpression Clone(bool returnsText, Type type, RelationalTypeMapping typeMapping) + => new MySQLJsonTraversalExpression(Expression, Path, returnsText, type, typeMapping); + + protected override Expression VisitChildren(ExpressionVisitor visitor) + => Update((SqlExpression)visitor.Visit(Expression), + Path.Select(p => (SqlExpression)visitor.Visit(p)).ToArray()); + +#if NET9_0_OR_GREATER + public override Expression Quote() => New( + _quotingConstructor ??= typeof(MySQLJsonTraversalExpression).GetConstructor([typeof(SqlExpression), typeof(string)])!, + Expression.Quote(), + Constant(ReturnsText), + Constant(Type), + RelationalExpressionQuotingUtilities.QuoteTypeMapping(TypeMapping)); +#endif + + public virtual MySQLJsonTraversalExpression Update( + [NotNull] SqlExpression expression, + [NotNull] IReadOnlyList path) + => expression == Expression && + path.Count == Path.Count && + path.Zip(Path, (x, y) => (x, y)).All(tup => tup.x == tup.y) + ? this + : new MySQLJsonTraversalExpression(expression, path, ReturnsText, Type, TypeMapping); + + public virtual MySQLJsonTraversalExpression Append([NotNull] SqlExpression pathComponent, Type returnType, RelationalTypeMapping typeMapping) + { + var newPath = new SqlExpression[Path.Count + 1]; + for (var i = 0; i < Path.Count; i++) + { + newPath[i] = Path[i]; + } + newPath[newPath.Length - 1] = pathComponent; + return new MySQLJsonTraversalExpression(Expression, newPath, ReturnsText, returnType.UnwrapNullableType(), typeMapping); + } + + public override bool Equals(object? obj) + => Equals(obj as MySQLJsonTraversalExpression); + + public virtual bool Equals(MySQLJsonTraversalExpression? other) + => ReferenceEquals(this, other) || + other is object && + base.Equals(other) && + Equals(Expression, other.Expression) && + Path.Count == other.Path.Count && + Path.Zip(other.Path, (x, y) => (x, y)).All(tup => tup.x == tup.y); + + public override int GetHashCode() + => HashCode.Combine(base.GetHashCode(), Expression, Path); + + protected override void Print(ExpressionPrinter expressionPrinter) + { + expressionPrinter.Visit(Expression); + expressionPrinter.Append(ReturnsText ? "->>" : "->"); + expressionPrinter.Append("'$"); + foreach (var location in Path) + { + expressionPrinter.Append("."); + expressionPrinter.Visit(location); + } + expressionPrinter.Append("'"); + } + + public override string ToString() + => $"{Expression}{(ReturnsText ? "->>" : "->")}{Path}"; + + public static bool TypeReturnsText(Type type) + => type == typeof(string) || + type == typeof(Guid); + } +} diff --git a/EFCore/src/Query/Expressions/Internal/MySQLMatchExpression.cs b/EFCore/src/Query/Expressions/Internal/MySQLMatchExpression.cs new file mode 100644 index 000000000..6ada3a8d7 --- /dev/null +++ b/EFCore/src/Query/Expressions/Internal/MySQLMatchExpression.cs @@ -0,0 +1,137 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using Microsoft.EntityFrameworkCore.Storage; +using MySql.EntityFrameworkCore.Extensions; +using MySql.EntityFrameworkCore.Utils; +using System; +using System.Linq.Expressions; +using System.Reflection; + +namespace MySql.EntityFrameworkCore.Query.Expressions.Internal +{ + internal class MySQLMatchExpression : SqlExpression + { + +#if NET9_0_OR_GREATER + private static ConstructorInfo? _quotingConstructor; +#endif + + public MySQLMatchExpression( + SqlExpression match, + SqlExpression against, + MySQLMatchSearchMode searchMode, + RelationalTypeMapping? typeMapping) + : base(typeof(bool), typeMapping) + { + Check.NotNull(match, nameof(match)); + Check.NotNull(against, nameof(against)); + + Match = match; + Against = against; + SearchMode = searchMode; + } + + public virtual MySQLMatchSearchMode SearchMode { get; } + + public virtual SqlExpression Match { get; } + public virtual SqlExpression Against { get; } + + protected override Expression Accept(ExpressionVisitor visitor) + { + Check.NotNull(visitor, nameof(visitor)); + + return visitor is MySQLQuerySqlGenerator mySqlQuerySqlGenerator + ? mySqlQuerySqlGenerator.VisitMySqlMatch(this) + : base.Accept(visitor); + } + + protected override Expression VisitChildren(ExpressionVisitor visitor) + { + var match = (SqlExpression)visitor.Visit(Match); + var against = (SqlExpression)visitor.Visit(Against); + + return Update(match, against); + } + +#if NET9_0_OR_GREATER + public override Expression Quote() => New( + _quotingConstructor ??= typeof(MySQLMatchExpression).GetConstructor([typeof(SqlExpression), typeof(string)])!, + Match.Quote(), + Against.Quote(), + Constant(SearchMode), + Constant(Type), + RelationalExpressionQuotingUtilities.QuoteTypeMapping(TypeMapping)); +#endif + + public virtual MySQLMatchExpression Update(SqlExpression match, SqlExpression against) + => match != Match || against != Against + ? new MySQLMatchExpression( + match, + against, + SearchMode, + TypeMapping!) + : this; + + public override bool Equals(object? obj) + => obj != null && ReferenceEquals(this, obj) + || obj is MySQLMatchExpression matchExpression && Equals(matchExpression); + + private bool Equals(MySQLMatchExpression matchExpression) + => base.Equals(matchExpression) + && SearchMode == matchExpression.SearchMode + && Match.Equals(matchExpression.Match) + && Against.Equals(matchExpression.Against); + + public override int GetHashCode() => HashCode.Combine(base.GetHashCode(), SearchMode, Match, Against); + + protected override void Print(ExpressionPrinter expressionPrinter) + { + expressionPrinter.Append("MATCH "); + expressionPrinter.Append($"({expressionPrinter.Visit(Match)})"); + expressionPrinter.Append(" AGAINST "); + expressionPrinter.Append($"({expressionPrinter.Visit(Against)}"); + + switch (SearchMode) + { + case MySQLMatchSearchMode.NaturalLanguage: + break; + case MySQLMatchSearchMode.NaturalLanguageWithQueryExpansion: + expressionPrinter.Append(" WITH QUERY EXPANSION"); + break; + case MySQLMatchSearchMode.Boolean: + expressionPrinter.Append(" IN BOOLEAN MODE"); + break; + } + + expressionPrinter.Append(")"); + } + } +} diff --git a/EFCore/src/Query/Expressions/Internal/MySQLRegexpExpression.cs b/EFCore/src/Query/Expressions/Internal/MySQLRegexpExpression.cs new file mode 100644 index 000000000..e0e19feb6 --- /dev/null +++ b/EFCore/src/Query/Expressions/Internal/MySQLRegexpExpression.cs @@ -0,0 +1,128 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using Microsoft.EntityFrameworkCore.Storage; +using MySql.EntityFrameworkCore.Utils; +using System.Linq.Expressions; +using System.Reflection; + +namespace MySql.EntityFrameworkCore.Query.Expressions.Internal +{ + internal class MySQLRegexpExpression : SqlExpression + { + +#if NET9_0_OR_GREATER + private static ConstructorInfo? _quotingConstructor; +#endif + + public MySQLRegexpExpression( + [NotNull] SqlExpression match, + [NotNull] SqlExpression pattern, + RelationalTypeMapping? typeMapping) + : base(typeof(bool), typeMapping) + { + Check.NotNull(match, nameof(match)); + Check.NotNull(pattern, nameof(pattern)); + + Match = match; + Pattern = pattern; + } + + public virtual SqlExpression Match { get; } + public virtual SqlExpression Pattern { get; } + + protected override Expression Accept(ExpressionVisitor visitor) + { + Check.NotNull(visitor, nameof(visitor)); + + return visitor is MySQLQuerySqlGenerator mySqlQuerySqlGenerator + ? mySqlQuerySqlGenerator.VisitMySqlRegexp(this) + : base.Accept(visitor); + } + + protected override Expression VisitChildren(ExpressionVisitor visitor) + { + var match = (SqlExpression)visitor.Visit(Match); + var pattern = (SqlExpression)visitor.Visit(Pattern); + + return Update(match, pattern); + } + +#if NET9_0_OR_GREATER + public override Expression Quote() => New( + _quotingConstructor ??= typeof(MySQLMatchExpression).GetConstructor([typeof(SqlExpression), typeof(string)])!, + Match.Quote(), + Pattern.Quote(), + Constant(Type), + RelationalExpressionQuotingUtilities.QuoteTypeMapping(TypeMapping)); +#endif + + public virtual MySQLRegexpExpression Update(SqlExpression match, SqlExpression pattern) + => match != Match || + pattern != Pattern + ? new MySQLRegexpExpression(match, pattern, TypeMapping!) + : this; + + public override bool Equals(object? obj) + { + if (obj is null) + { + return false; + } + + if (ReferenceEquals(this, obj)) + { + return true; + } + + return obj.GetType() == GetType() && Equals((MySQLRegexpExpression)obj); + } + + private bool Equals(MySQLRegexpExpression other) + => Equals(Match, other.Match) + && Equals(Pattern, other.Pattern); + + public override int GetHashCode() + { + unchecked + { + var hashCode = Match.GetHashCode(); + hashCode = (hashCode * 397) ^ Pattern.GetHashCode(); + + return hashCode; + } + } + + public override string ToString() => $"{Match} REGEXP {Pattern}"; + + protected override void Print(ExpressionPrinter expressionPrinter) + => expressionPrinter.Append(ToString()); + } +} diff --git a/EFCore/src/Query/Expressions/Internal/MySQLStringComparisonMethodTranslator.cs b/EFCore/src/Query/Expressions/Internal/MySQLStringComparisonMethodTranslator.cs new file mode 100644 index 000000000..1af3ac2cb --- /dev/null +++ b/EFCore/src/Query/Expressions/Internal/MySQLStringComparisonMethodTranslator.cs @@ -0,0 +1,701 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using MySql.EntityFrameworkCore.Properties; +using MySql.EntityFrameworkCore.Query.Internal; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using static MySql.EntityFrameworkCore.Utils.Statics; + +namespace MySql.EntityFrameworkCore.Query.Expressions.Internal +{ + internal class MySQLStringComparisonMethodTranslator : IMethodCallTranslator + { + private static readonly MethodInfo? _equalsMethodInfo + = typeof(string).GetRuntimeMethod(nameof(string.Equals), new[] { typeof(string), typeof(StringComparison) }); + private static readonly MethodInfo? _staticEqualsMethodInfo + = typeof(string).GetRuntimeMethod(nameof(string.Equals), new[] { typeof(string), typeof(string), typeof(StringComparison) }); + private static readonly MethodInfo? _startsWithMethodInfo + = typeof(string).GetRuntimeMethod(nameof(string.StartsWith), new[] { typeof(string), typeof(StringComparison) }); + private static readonly MethodInfo? _endsWithMethodInfo + = typeof(string).GetRuntimeMethod(nameof(string.EndsWith), new[] { typeof(string), typeof(StringComparison) }); + private static readonly MethodInfo? _containsMethodInfo + = typeof(string).GetRuntimeMethod(nameof(string.Contains), new[] { typeof(string), typeof(StringComparison) }); + private static readonly MethodInfo? _indexOfMethodInfo + = typeof(string).GetRuntimeMethod(nameof(string.IndexOf), new[] { typeof(string), typeof(StringComparison) }); + + private readonly SqlExpression _caseSensitiveComparisons; + + private readonly MySQLSqlExpressionFactory _sqlExpressionFactory; + + public MySQLStringComparisonMethodTranslator(ISqlExpressionFactory sqlExpressionFactory) + { + _sqlExpressionFactory = (MySQLSqlExpressionFactory)sqlExpressionFactory; + _caseSensitiveComparisons = _sqlExpressionFactory.Constant( + new[] + { + StringComparison.Ordinal, + StringComparison.CurrentCulture, + StringComparison.InvariantCulture + }); + } + + public SqlExpression? Translate(SqlExpression? instance, + MethodInfo method, + IReadOnlyList arguments, + IDiagnosticsLogger logger) + { + if (Equals(method, _equalsMethodInfo) && instance != null) + { + return MakeStringEqualsExpression( + instance, + arguments[0], + arguments[1] + ); + } + else if (Equals(method, _staticEqualsMethodInfo)) + { + return MakeStringEqualsExpression( + arguments[0], + arguments[1], + arguments[2] + ); + } + else if (Equals(method, _startsWithMethodInfo) && instance != null) + { + return MakeStartsWithExpression( + instance, + arguments[0], + arguments[1] + ); + } + else if (Equals(method, _endsWithMethodInfo) && instance != null) + { + return MakeEndsWithExpression( + instance, + arguments[0], + arguments[1] + ); + } + else if (Equals(method, _containsMethodInfo) && instance != null) + { + return MakeContainsExpression( + instance, + arguments[0], + arguments[1] + ); + } + else if (Equals(method, _indexOfMethodInfo) && instance != null) + { + return MakeIndexOfExpression( + instance, + arguments[0], + arguments[1] + ); + } + + return null; + } + + public SqlExpression? MakeStringEqualsExpression( + [NotNull] SqlExpression leftValue, + [NotNull] SqlExpression rightValue, + [NotNull] SqlExpression stringComparison) + { + if (TryGetExpressionValue(stringComparison, out var cmp)) + { + return CreateExpressionForCaseSensitivity( + cmp, + () => + { + if (leftValue is ColumnExpression) + { + // Applying the binary operator to the non-column value enables SQL to + // utilize an index if one exists. + return _sqlExpressionFactory.Equal( + leftValue, + Utf8Bin(rightValue) + ); + } + else + { + return _sqlExpressionFactory.Equal( + Utf8Bin(leftValue), + rightValue + ); + } + }, + () => + _sqlExpressionFactory.Equal( + LCase(leftValue), + Utf8Bin(LCase(rightValue)) + ) + ); + } + else + { +#if !NET8_0_OR_GREATER + return new CaseExpression( + new[] + { + new CaseWhenClause( + _sqlExpressionFactory.In(stringComparison, _caseSensitiveComparisons, false), + // Case sensitive, accent sensitive + _sqlExpressionFactory.Equal( + leftValue, + Utf8Bin(rightValue) + ) + ) + }, + // Case insensitive, accent sensitive + _sqlExpressionFactory.Equal( + LCase(leftValue), + Utf8Bin(LCase(rightValue)) + ) + ); +#else + return new CaseExpression( + new[] + { + new CaseWhenClause( + _sqlExpressionFactory.In(stringComparison,(IReadOnlyList)_caseSensitiveComparisons), + // Case sensitive, accent sensitive + _sqlExpressionFactory.Equal( + leftValue, + Utf8Bin(rightValue) + ) + ) + }, + // Case insensitive, accent sensitive + _sqlExpressionFactory.Equal( + LCase(leftValue), + Utf8Bin(LCase(rightValue)) + ) + ); +#endif + } + } + + public SqlExpression? MakeStartsWithExpression( + [NotNull] SqlExpression target, + [NotNull] SqlExpression prefix, + [NotNull] SqlExpression stringComparison) + { + if (TryGetExpressionValue(stringComparison, out var cmp)) + { + return CreateExpressionForCaseSensitivity( + cmp, + () => + MakeStartsWithExpressionImpl( + target, + Utf8Bin(prefix), + originalPrefix: prefix + ), + () => + MakeStartsWithExpressionImpl( + LCase(target), + Utf8Bin(LCase(prefix)) + ) + ); + } + else + { +#if !NET8_0_OR_GREATER + return new CaseExpression( + new[] + { + new CaseWhenClause( + _sqlExpressionFactory.In(stringComparison, _caseSensitiveComparisons, false), + // Case sensitive, accent sensitive + MakeStartsWithExpressionImpl( + target, + Utf8Bin(prefix), + originalPrefix: prefix + ) + ) + }, + // Case insensitive, accent sensitive + MakeStartsWithExpressionImpl( + LCase(target), + Utf8Bin(LCase(prefix)) + ) + ); +#else + return new CaseExpression( + new[] + { + new CaseWhenClause( + _sqlExpressionFactory.In(stringComparison,(IReadOnlyList) _caseSensitiveComparisons), + // Case sensitive, accent sensitive + MakeStartsWithExpressionImpl( + target, + Utf8Bin(prefix), + originalPrefix: prefix + ) + ) + }, + // Case insensitive, accent sensitive + MakeStartsWithExpressionImpl( + LCase(target), + Utf8Bin(LCase(prefix)) + ) + ); +#endif + } + } + + private SqlBinaryExpression MakeStartsWithExpressionImpl( + SqlExpression target, + SqlExpression prefix, + SqlExpression? originalPrefix = null) + { + return (SqlBinaryExpression)_sqlExpressionFactory.AndAlso( + _sqlExpressionFactory.Like( + target, + _sqlExpressionFactory.ApplyDefaultTypeMapping(_sqlExpressionFactory.Function( + "CONCAT", + new[] { originalPrefix ?? prefix, _sqlExpressionFactory.Constant("%") }, + nullable: true, + argumentsPropagateNullability: TrueArrays[2], + typeof(string)))), + _sqlExpressionFactory.Equal( + _sqlExpressionFactory.Function( + "LEFT", + new[] + { + target, + CharLength(prefix) + }, + nullable: true, + argumentsPropagateNullability: TrueArrays[2], + typeof(string)), + prefix + )); + } + + public SqlExpression? MakeEndsWithExpression( + [NotNull] SqlExpression target, + [NotNull] SqlExpression suffix, + [NotNull] SqlExpression stringComparison) + { + if (TryGetExpressionValue(stringComparison, out var cmp)) + { + return CreateExpressionForCaseSensitivity( + cmp, + () => + MakeEndsWithExpressionImpl( + target, + Utf8Bin(suffix), + suffix + ), + () => + MakeEndsWithExpressionImpl( + LCase(target), + Utf8Bin(LCase(suffix)), + suffix + ) + ); + } + else + { +#if !NET8_0_OR_GREATER + return new CaseExpression( + new[] + { + new CaseWhenClause( + _sqlExpressionFactory.In(stringComparison, _caseSensitiveComparisons, false), + // Case sensitive, accent sensitive + MakeEndsWithExpressionImpl( + target, + Utf8Bin(suffix), + suffix + ) + ) + }, + // Case insensitive, accent sensitive + MakeEndsWithExpressionImpl( + LCase(target), + Utf8Bin(LCase(suffix)), + suffix + ) + ); +#else + return new CaseExpression( + new[] + { + new CaseWhenClause( + _sqlExpressionFactory.In(stringComparison,(IReadOnlyList) _caseSensitiveComparisons), + // Case sensitive, accent sensitive + MakeEndsWithExpressionImpl( + target, + Utf8Bin(suffix), + suffix + ) + ) + }, + // Case insensitive, accent sensitive + MakeEndsWithExpressionImpl( + LCase(target), + Utf8Bin(LCase(suffix)), + suffix + ) + ); +#endif + } + } + + private SqlExpression MakeEndsWithExpressionImpl( + SqlExpression target, + SqlExpression suffix, + SqlExpression originalSuffix) + { + var endsWithExpression = + _sqlExpressionFactory.Equal( + _sqlExpressionFactory.Function( + "RIGHT", + new[] + { + target, + CharLength(suffix) + }, + nullable: true, + argumentsPropagateNullability: TrueArrays[2], + target.Type, + null), + suffix); + + if (originalSuffix is SqlConstantExpression constantSuffix) + { + return constantSuffix.Value != null && ((string)constantSuffix.Value) == string.Empty + ? _sqlExpressionFactory.Constant(true) + : endsWithExpression; + } + else + { + return _sqlExpressionFactory.OrElse( + endsWithExpression, + _sqlExpressionFactory.Equal(originalSuffix, _sqlExpressionFactory.Constant(string.Empty))); + } + } + + public SqlExpression? MakeContainsExpression( + SqlExpression target, + SqlExpression search, + SqlExpression? stringComparison = null) + { + if (stringComparison == null) + { + return MakeContainsExpressionImpl( + target, + e => e, + search, + e => e); + } + + if (TryGetExpressionValue(stringComparison, out var cmp)) + { + return CreateExpressionForCaseSensitivity( + cmp, + () => + MakeContainsExpressionImpl( + target, + e => e, + search, + e => Utf8Bin(e) + ), + () => + MakeContainsExpressionImpl( + target, + e => LCase(e), + search, + e => Utf8Bin(LCase(e)) + ) + ); + } + else + { +#if !NET8_0_OR_GREATER + return new CaseExpression( + new[] + { + new CaseWhenClause( + _sqlExpressionFactory.In(stringComparison, _caseSensitiveComparisons, false), + // Case sensitive, accent sensitive + MakeContainsExpressionImpl( + target, + e => e, + search, + e => Utf8Bin(e) + ) + ) + }, + // Case insensitive, accent sensitive + MakeContainsExpressionImpl( + target, + e => LCase(e), + search, + e => Utf8Bin(LCase(e)) + ) + ); +#else + return new CaseExpression( + new[] + { + new CaseWhenClause( + _sqlExpressionFactory.In(stringComparison,(IReadOnlyList) _caseSensitiveComparisons), + // Case sensitive, accent sensitive + MakeContainsExpressionImpl( + target, + e => e, + search, + e => Utf8Bin(e) + ) + ) + }, + // Case insensitive, accent sensitive + MakeContainsExpressionImpl( + target, + e => LCase(e), + search, + e => Utf8Bin(LCase(e)) + ) + ); +#endif + } + } + private SqlExpression MakeContainsExpressionImpl( + SqlExpression target, + Func targetTransform, + SqlExpression pattern, + Func patternTransform) + { + var stringTypeMapping = ExpressionExtensions.InferTypeMapping(target, pattern); + target = _sqlExpressionFactory.ApplyTypeMapping(target, stringTypeMapping); + pattern = _sqlExpressionFactory.ApplyTypeMapping(pattern, stringTypeMapping); + + if (pattern is SqlConstantExpression constantPatternExpression) + { + if (constantPatternExpression.Value is string constantPatternString) + { + return constantPatternString == string.Empty + ? (SqlExpression)_sqlExpressionFactory.Constant(true) + : _sqlExpressionFactory.Like( + targetTransform(target), + patternTransform(_sqlExpressionFactory.Constant('%' + EscapeLikePattern(constantPatternString) + '%'))); + } + + + return _sqlExpressionFactory.Like(target, _sqlExpressionFactory.Constant(null, stringTypeMapping)); + } + + + return _sqlExpressionFactory.OrElse( + _sqlExpressionFactory.Like( + pattern, + _sqlExpressionFactory.Constant(string.Empty, stringTypeMapping)), + _sqlExpressionFactory.GreaterThan( + _sqlExpressionFactory.NullableFunction( + "LOCATE", + new[] { patternTransform(pattern), targetTransform(target) }, + typeof(int)), + _sqlExpressionFactory.Constant(0))); + } + + + + public SqlExpression? MakeIndexOfExpression( + SqlExpression? target, + SqlExpression search, + SqlExpression? stringComparison = null) + { + if (stringComparison == null) + { + return MakeIndexOfExpressionImpl( + target, + e => e, + search, + e => e); + } + + if (TryGetExpressionValue(stringComparison, out var cmp)) + { + return CreateExpressionForCaseSensitivity( + cmp, + () => MakeIndexOfExpressionImpl( + target, + e => e, + search, + e => Utf8Bin(e)), + () => MakeIndexOfExpressionImpl( + target, + e => LCase(e), + search, + e => Utf8Bin(LCase(e)))); + } + +#if !NET8_0_OR_GREATER + return _sqlExpressionFactory.Case( + new[] + { + new CaseWhenClause( + _sqlExpressionFactory.In(stringComparison, _caseSensitiveComparisons, false), + // Case sensitive, accent sensitive + MakeIndexOfExpressionImpl( + target, + e => e, + search, + e => Utf8Bin(e))) + }, + // Case insensitive, accent sensitive + MakeIndexOfExpressionImpl( + target, + e => LCase(e), + search, + e => Utf8Bin(LCase(e)))); +#else + return _sqlExpressionFactory.Case( + new[] + { + new CaseWhenClause( + _sqlExpressionFactory.In(stringComparison, (IReadOnlyList)_caseSensitiveComparisons), + // Case sensitive, accent sensitive + MakeIndexOfExpressionImpl( + target, + e => e, + search, + e => Utf8Bin(e))) + }, + // Case insensitive, accent sensitive + MakeIndexOfExpressionImpl( + target, + e => LCase(e), + search, + e => Utf8Bin(LCase(e)))); +#endif + } + + private SqlExpression MakeIndexOfExpressionImpl( + SqlExpression? target, + [NotNull] Func targetTransform, + SqlExpression pattern, + [NotNull] Func patternTransform) + { + return _sqlExpressionFactory.Subtract( + _sqlExpressionFactory.NullableFunction( + "LOCATE", + new[] { patternTransform(pattern), targetTransform(target!) }, + typeof(int)), + _sqlExpressionFactory.Constant(1)); + } + + private static bool TryGetExpressionValue(SqlExpression expression, out T value) + { + if (expression.Type != typeof(T)) + { + throw new ArgumentException( + MySQLStrings.ExpressionTypeMismatch, + nameof(expression) + ); + } + + if (expression is SqlConstantExpression constant) + { + value = (T)constant.Value!; + return true; + } + else + { + value = default!; + return false; + } + } + + private static SqlExpression? CreateExpressionForCaseSensitivity( + StringComparison cmp, + Func ifCaseSensitive, + Func ifCaseInsensitive) + { + switch (cmp) + { + case StringComparison.Ordinal: + case StringComparison.CurrentCulture: + case StringComparison.InvariantCulture: + return ifCaseSensitive(); + case StringComparison.OrdinalIgnoreCase: + case StringComparison.CurrentCultureIgnoreCase: + case StringComparison.InvariantCultureIgnoreCase: + return ifCaseInsensitive(); + default: + return default; + } + } + + private SqlExpression LCase(SqlExpression value) + { + return _sqlExpressionFactory.NullableFunction("LCASE", new[] { value }, value.Type); + } + + private SqlExpression Utf8Bin(SqlExpression value) + { + return _sqlExpressionFactory.Collate(value, "utf8mb4", "utf8mb4_bin"); + } + + private SqlExpression CharLength(SqlExpression value) + { + return _sqlExpressionFactory.NullableFunction("CHAR_LENGTH", new[] { value }, typeof(int)); + } + + private const char LikeEscapeChar = '\\'; + + private static bool IsLikeWildChar(char c) => c == '%' || c == '_'; + + private static string EscapeLikePattern(string pattern) + { + var builder = new StringBuilder(); + foreach (var c in pattern) + { + if (IsLikeWildChar(c) || + c == LikeEscapeChar) + { + builder.Append(LikeEscapeChar); + } + + builder.Append(c); + } + + return builder.ToString(); + } + } +} diff --git a/EFCore/src/Query/Internal/MySQLCommandParser.cs b/EFCore/src/Query/Internal/MySQLCommandParser.cs new file mode 100644 index 000000000..9b4a36f4a --- /dev/null +++ b/EFCore/src/Query/Internal/MySQLCommandParser.cs @@ -0,0 +1,287 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; + +namespace MySql.EntityFrameworkCore.Query.Internal +{ + internal class MySQLCommandParser + { + public virtual string SqlFragment { get; } + public virtual char[] States { get; } + + public MySQLCommandParser(string sqlFragment) + { + SqlFragment = sqlFragment ?? throw new ArgumentNullException(nameof(sqlFragment)); + States = new char[sqlFragment.Length]; + + Parse(); + } + + public virtual IReadOnlyList GetStateIndices(char state, int start = 0, int length = -1) + { + if (start < 0 || start >= States.Length) + throw new ArgumentOutOfRangeException(nameof(start)); + + if (length < 0 || length > 0 && start + length > States.Length) + length = States.Length - start; + + var stateIndices = new List(); + char? lastState = null; + + for (var i = start; i < length; i++) + { + var currentState = States[i]; + + if (currentState == state && currentState != lastState) + stateIndices.Add(i); + + lastState = currentState; + } + + return stateIndices.AsReadOnly(); + } + + public virtual IReadOnlyList GetStateIndices(char[] states, int start = 0, int length = -1) + { + if (states == null) + throw new ArgumentNullException(nameof(states)); + + if (states.Length <= 0) + throw new ArgumentOutOfRangeException(nameof(states)); + + if (start < 0 || start >= States.Length) + throw new ArgumentOutOfRangeException(nameof(start)); + + if (length < 0 || length > 0 && start + length > States.Length) + length = States.Length - start; + + var stateIndices = new List(); + char? lastState = null; + + for (var i = start; i < length; i++) + { + var currentState = States[i]; + + if (currentState != lastState && states.Contains(currentState)) + stateIndices.Add(i); + + lastState = currentState; + } + + return stateIndices.AsReadOnly(); + } + + protected virtual void Parse() + { + var state = '\0'; + var lastChar = '\0'; + var secondTolastChar = '\0'; + + for (var i = 0; i < SqlFragment.Length; i++) + { + var c = SqlFragment[i]; + var skipProcessing = false; + + if (state == '\'') + { + if (c == '\'') + { + if (lastChar == '\'') + lastChar = '\0'; + else + lastChar = '\''; + } + else if (lastChar == '\'') + { + state = '\0'; + lastChar = '\0'; + States[i - 1] = state; + } + } + + if (state == '"') + { + if (c == '"') + { + if (lastChar == '"') + lastChar = '\0'; + else + lastChar = '"'; + } + else if (lastChar == '"') + { + state = '\0'; + lastChar = '\0'; + States[i - 1] = state; + } + } + + if (state == '`') + { + if (c == '`') + { + if (lastChar == '`') + lastChar = '\0'; + else + lastChar = '`'; + } + else if (lastChar == '`') + { + state = '\0'; + lastChar = '\0'; + States[i - 1] = state; + } + } + + if (state == '/') + { + if (lastChar == '/') + { + Debug.Assert(c == '*'); + lastChar = '\0'; + } + else if (lastChar == '*') + { + if (c == '/') + { + lastChar = '\0'; + state = '\0'; + skipProcessing = true; + } + else + lastChar = '\0'; + } + else if (c == '*') + { + Debug.Assert(lastChar == '\0'); + lastChar = '*'; + } + else + lastChar = '\0'; + } + + if (state == '-') + { + if (lastChar == '-') + { + if (c == '-' && secondTolastChar == '\0') + secondTolastChar = '-'; + else if (secondTolastChar == '-' && (c == ' ' || c == '\t')) + { + lastChar = '\0'; + secondTolastChar = '\0'; + } + else + { + state = '\0'; + lastChar = '\0'; + States[i - 1] = state; + + if (secondTolastChar == '-') + { + secondTolastChar = '\0'; + States[i - 2] = state; + } + } + } + else + { + Debug.Assert(lastChar == '\0'); + Debug.Assert(secondTolastChar == '\0'); + + if (c == '\r' || c == '\n') + { + state = '\0'; + skipProcessing = true; + } + } + } + + if (state == '#') + { + if (c == '\r' || c == '\n') + { + state = '\0'; + skipProcessing = true; + } + } + + if (state == '\0' && !skipProcessing) + { + if (c == '"') + state = '"'; + else if (c == '\'') + state = '\''; + else if (c == '`') + state = '`'; + else if (c == '/') + { + state = '/'; + lastChar = '/'; + } + else if (c == '-') + { + state = '-'; + lastChar = '-'; + } + else if (c == '#') + state = '#'; + else if (c == '@') + state = '@'; + else if (c == ';') + States[i] = ';'; + } + else if (state == '@') + { + if (c == '@') + States[i - 1] = '$'; + + state = '\0'; + } + + if (state != '\0') + States[i] = state; + } + + if (state == '\'' && lastChar == '\'' || + state == '"' && lastChar == '"' || + state == '`' && lastChar == '`' || + state == '/' && lastChar == '/' || + state == '-' && lastChar == '-') + { + state = '\0'; + lastChar = '\0'; + States[States.Length - 1] = state; + } + } + } +} diff --git a/EFCore/src/Query/Internal/MySQLCompatibilityExpressionVisitor.cs b/EFCore/src/Query/Internal/MySQLCompatibilityExpressionVisitor.cs new file mode 100644 index 000000000..492ed5957 --- /dev/null +++ b/EFCore/src/Query/Internal/MySQLCompatibilityExpressionVisitor.cs @@ -0,0 +1,103 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using MySql.EntityFrameworkCore.Infrastructure.Internal; +using System; +using System.Linq.Expressions; + +namespace MySql.EntityFrameworkCore.Query.Internal +{ + internal class MySQLCompatibilityExpressionVisitor : ExpressionVisitor + { + private readonly IMySQLOptions _options; + + public MySQLCompatibilityExpressionVisitor(IMySQLOptions options) + { + _options = options; + } + + protected override Expression VisitExtension(Expression extensionExpression) + { + switch (extensionExpression) + { + case RowNumberExpression rowNumberExpression: + return VisitRowNumber(rowNumberExpression); + case CrossApplyExpression crossApplyExpression: + return VisitCrossApply(crossApplyExpression); + case OuterApplyExpression outerApplyExpression: + return VisitOuterApply(outerApplyExpression); + case ExceptExpression exceptExpression: + return VisitExcept(exceptExpression); + case IntersectExpression intersectExpression: + return VisitIntercept(intersectExpression); + case ShapedQueryExpression shapedQueryExpression: + return shapedQueryExpression.Update(Visit(shapedQueryExpression.QueryExpression), shapedQueryExpression.ShaperExpression); + default: + return base.VisitExtension(extensionExpression); + } + + return base.VisitExtension(extensionExpression); + } + + protected virtual Expression VisitRowNumber(RowNumberExpression rowNumberExpression) + => CheckSupport(rowNumberExpression, true); + + protected virtual Expression VisitOuterApply(OuterApplyExpression outerApplyExpression) + => CheckSupport(outerApplyExpression, true); + + protected virtual Expression VisitCrossApply(CrossApplyExpression crossApplyExpression) + => CheckSupport(crossApplyExpression, true); + protected virtual Expression VisitExcept(ExceptExpression exceptExpression) + => CheckSupport(exceptExpression, false); + + protected virtual Expression VisitIntercept(IntersectExpression intersectExpression) + => CheckSupport(intersectExpression, false); + + protected virtual Expression CheckSupport(Expression expression, bool isSupported) + => CheckTranslated( + isSupported + ? base.VisitExtension(expression) + : null, + expression); + + protected virtual Expression CheckTranslated(Expression? translated, Expression original) + { + if (translated == null) + { + throw new InvalidOperationException( + CoreStrings.TranslationFailed(original.Print())); + } + + return translated; + } + } +} diff --git a/EFCore/src/Query/Internal/MySQLCompiledQueryCacheKeyGenerator.cs b/EFCore/src/Query/Internal/MySQLCompiledQueryCacheKeyGenerator.cs new file mode 100644 index 000000000..d4658704c --- /dev/null +++ b/EFCore/src/Query/Internal/MySQLCompiledQueryCacheKeyGenerator.cs @@ -0,0 +1,87 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.Extensions.DependencyInjection; +using MySql.Data.MySqlClient; +using MySql.EntityFrameworkCore.Infrastructure.Internal; +using System; +using System.Linq.Expressions; + +namespace MySql.EntityFrameworkCore.Query.Internal +{ + /// + /// + /// The service lifetime is . This means that each + /// instance uses its own instance of this service. + /// The implementation may depend on other services registered with any lifetime. + /// The implementation does not need to be thread-safe. + /// + /// + internal class MySQLCompiledQueryCacheKeyGenerator : RelationalCompiledQueryCacheKeyGenerator + { + public MySQLCompiledQueryCacheKeyGenerator( + [NotNull] CompiledQueryCacheKeyGeneratorDependencies dependencies, + [NotNull] RelationalCompiledQueryCacheKeyGeneratorDependencies relationalDependencies) + : base(dependencies, relationalDependencies) + { + } + + /// + public override object GenerateCacheKey(Expression query, bool async) + => new MySQLCompiledQueryCacheKey( + GenerateCacheKeyCore(query, async), + RelationalDependencies.ContextOptions.FindExtension()!.CharSet!); + + private readonly struct MySQLCompiledQueryCacheKey + { + private readonly RelationalCompiledQueryCacheKey _relationalCompiledQueryCacheKey; + private readonly CharacterSet _charSet; + + public MySQLCompiledQueryCacheKey( + RelationalCompiledQueryCacheKey relationalCompiledQueryCacheKey, + CharacterSet charSet) + { + _relationalCompiledQueryCacheKey = relationalCompiledQueryCacheKey; + _charSet = charSet; + } + + public override bool Equals(object? obj) + => obj is not null + && obj is MySQLCompiledQueryCacheKey key + && Equals(key); + + private bool Equals(MySQLCompiledQueryCacheKey other) + => _relationalCompiledQueryCacheKey.Equals(other._relationalCompiledQueryCacheKey); + + public override int GetHashCode() + => HashCode.Combine(_relationalCompiledQueryCacheKey, _charSet); + } + } +} diff --git a/EFCore/src/Query/Internal/MySQLConvertTranslator.cs b/EFCore/src/Query/Internal/MySQLConvertTranslator.cs new file mode 100644 index 000000000..f600784a9 --- /dev/null +++ b/EFCore/src/Query/Internal/MySQLConvertTranslator.cs @@ -0,0 +1,73 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace MySql.EntityFrameworkCore.Query.Internal +{ + internal class MySQLConvertTranslator : IMethodCallTranslator + { + private static readonly MethodInfo[] _supportedMethods = new[] + { + nameof(Convert.ToBoolean), + nameof(Convert.ToByte), + nameof(Convert.ToDecimal), + nameof(Convert.ToDouble), + nameof(Convert.ToInt16), + nameof(Convert.ToInt32), + nameof(Convert.ToInt64), + nameof(Convert.ToString) + } + .SelectMany(t => typeof(Convert).GetTypeInfo().GetDeclaredMethods(t) + .Where(m => m.GetParameters().Length == 1)) + .ToArray(); + + private ISqlExpressionFactory _sqlExpressionFactory; + + public MySQLConvertTranslator(ISqlExpressionFactory sqlExpressionFactory) + { + _sqlExpressionFactory = sqlExpressionFactory; + } + + public SqlExpression? Translate(SqlExpression? instance, MethodInfo method, IReadOnlyList arguments, IDiagnosticsLogger logger) + { + return _supportedMethods.Contains(method) + ? _sqlExpressionFactory.Convert( + arguments[0], + method.ReturnType) + : null; + } + } +} diff --git a/EFCore/src/Query/Internal/MySQLDateDiffFunctionsTranslator.cs b/EFCore/src/Query/Internal/MySQLDateDiffFunctionsTranslator.cs new file mode 100644 index 000000000..439a3f2b3 --- /dev/null +++ b/EFCore/src/Query/Internal/MySQLDateDiffFunctionsTranslator.cs @@ -0,0 +1,286 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using MySql.EntityFrameworkCore.Extensions; +using System; +using System.Collections.Generic; +using System.Reflection; +using static MySql.EntityFrameworkCore.Utils.Statics; + +namespace MySql.EntityFrameworkCore.Query.Internal +{ + internal class MySQLDateDiffFunctionsTranslator : IMethodCallTranslator + { + private readonly Dictionary _methodInfoDateDiffMapping + = new() + { + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffYear), + new[] { typeof(DbFunctions), typeof(DateTime), typeof(DateTime) })!, + "YEAR" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffYear), + new[] { typeof(DbFunctions), typeof(DateTime?), typeof(DateTime?) })!, + "YEAR" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffYear), + new[] { typeof(DbFunctions), typeof(DateTimeOffset), typeof(DateTimeOffset) })!, + "YEAR" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffYear), + new[] { typeof(DbFunctions), typeof(DateTimeOffset?), typeof(DateTimeOffset?) })!, + "YEAR" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffYear), + new[] { typeof(DbFunctions), typeof(DateOnly), typeof(DateOnly) })!, + "YEAR" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffYear), + new[] { typeof(DbFunctions), typeof(DateOnly?), typeof(DateOnly?) })!, + "YEAR" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffMonth), + new[] { typeof(DbFunctions), typeof(DateTime), typeof(DateTime) })!, + "MONTH" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffMonth), + new[] { typeof(DbFunctions), typeof(DateTime?), typeof(DateTime?) })!, + "MONTH" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffMonth), + new[] { typeof(DbFunctions), typeof(DateTimeOffset), typeof(DateTimeOffset) })!, + "MONTH" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffMonth), + new[] { typeof(DbFunctions), typeof(DateTimeOffset?), typeof(DateTimeOffset?) })!, + "MONTH" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffMonth), + new[] { typeof(DbFunctions), typeof(DateOnly), typeof(DateOnly) })!, + "MONTH" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffMonth), + new[] { typeof(DbFunctions), typeof(DateOnly?), typeof(DateOnly?) })!, + "MONTH" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffDay), + new[] { typeof(DbFunctions), typeof(DateTime), typeof(DateTime) })!, + "DAY" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffDay), + new[] { typeof(DbFunctions), typeof(DateTime?), typeof(DateTime?) })!, + "DAY" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffDay), + new[] { typeof(DbFunctions), typeof(DateTimeOffset), typeof(DateTimeOffset) })!, + "DAY" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffDay), + new[] { typeof(DbFunctions), typeof(DateTimeOffset?), typeof(DateTimeOffset?) })!, + "DAY" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffDay), + new[] { typeof(DbFunctions), typeof(DateOnly), typeof(DateOnly) })!, + "DAY" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffDay), + new[] { typeof(DbFunctions), typeof(DateOnly?), typeof(DateOnly?) })!, + "DAY" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffHour), + new[] { typeof(DbFunctions), typeof(DateTime), typeof(DateTime) })!, + "HOUR" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffHour), + new[] { typeof(DbFunctions), typeof(DateTime?), typeof(DateTime?) })!, + "HOUR" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffHour), + new[] { typeof(DbFunctions), typeof(DateTimeOffset), typeof(DateTimeOffset) })!, + "HOUR" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffHour), + new[] { typeof(DbFunctions), typeof(DateTimeOffset?), typeof(DateTimeOffset?) })!, + "HOUR" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffMinute), + new[] { typeof(DbFunctions), typeof(DateTime), typeof(DateTime) })!, + "MINUTE" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffMinute), + new[] { typeof(DbFunctions), typeof(DateTime?), typeof(DateTime?) })!, + "MINUTE" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffMinute), + new[] { typeof(DbFunctions), typeof(DateTimeOffset), typeof(DateTimeOffset) })!, + "MINUTE" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffMinute), + new[] { typeof(DbFunctions), typeof(DateTimeOffset?), typeof(DateTimeOffset?) })!, + "MINUTE" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffSecond), + new[] { typeof(DbFunctions), typeof(DateTime), typeof(DateTime) })!, + "SECOND" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffSecond), + new[] { typeof(DbFunctions), typeof(DateTime?), typeof(DateTime?) })!, + "SECOND" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffSecond), + new[] { typeof(DbFunctions), typeof(DateTimeOffset), typeof(DateTimeOffset) })!, + "SECOND" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffSecond), + new[] { typeof(DbFunctions), typeof(DateTimeOffset?), typeof(DateTimeOffset?) })!, + "SECOND" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffMicrosecond), + new[] { typeof(DbFunctions), typeof(DateTime), typeof(DateTime) })!, + "MICROSECOND" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffMicrosecond), + new[] { typeof(DbFunctions), typeof(DateTime?), typeof(DateTime?) })!, + "MICROSECOND" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffMicrosecond), + new[] { typeof(DbFunctions), typeof(DateTimeOffset), typeof(DateTimeOffset) })!, + "MICROSECOND" + }, + { + typeof(MySQLDbFunctionsExtensions).GetRuntimeMethod( + nameof(MySQLDbFunctionsExtensions.DateDiffMicrosecond), + new[] { typeof(DbFunctions), typeof(DateTimeOffset?), typeof(DateTimeOffset?) })!, + "MICROSECOND" + } + }; + + private readonly ISqlExpressionFactory _sqlExpressionFactory; + + public MySQLDateDiffFunctionsTranslator(ISqlExpressionFactory sqlExpressionFactory) + { + _sqlExpressionFactory = sqlExpressionFactory; + } + + public virtual SqlExpression? Translate(SqlExpression? instance, MethodInfo method, IReadOnlyList arguments, IDiagnosticsLogger logger) + { + if (_methodInfoDateDiffMapping.TryGetValue(method, out var datePart)) + { + var startDate = arguments[1]; + var endDate = arguments[2]; + var typeMapping = ExpressionExtensions.InferTypeMapping(startDate, endDate); + + startDate = _sqlExpressionFactory.ApplyTypeMapping(startDate, typeMapping); + endDate = _sqlExpressionFactory.ApplyTypeMapping(endDate, typeMapping); + + return _sqlExpressionFactory.Function( + "TIMESTAMPDIFF", + new[] + { + _sqlExpressionFactory.Fragment(datePart), + startDate, + endDate + }, + nullable: true, + argumentsPropagateNullability: TrueArrays[3], + typeof(int)); + } + + return null; + } + } +} diff --git a/EFCore/src/Query/Internal/MySQLDateTimeMemberTranslator.cs b/EFCore/src/Query/Internal/MySQLDateTimeMemberTranslator.cs new file mode 100644 index 000000000..b2c62c561 --- /dev/null +++ b/EFCore/src/Query/Internal/MySQLDateTimeMemberTranslator.cs @@ -0,0 +1,162 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using System; +using System.Collections.Generic; +using System.Reflection; +using static MySql.EntityFrameworkCore.Utils.Statics; + +namespace MySql.EntityFrameworkCore.Query.Internal +{ + internal class MySQLDateTimeMemberTranslator : IMemberTranslator + { + private static readonly Dictionary _datePartMapping + = new Dictionary + { + { nameof(DateTime.Year), ("year", 1) }, + { nameof(DateTime.Month), ("month", 1) }, + { nameof(DateTime.Day), ("day", 1) }, + { nameof(DateTime.Hour), ("hour", 1) }, + { nameof(DateTime.Minute), ("minute", 1) }, + { nameof(DateTime.Second), ("second", 1) }, + { nameof(DateTime.Millisecond), ("microsecond", 1000) }, + }; + + private readonly MySQLSqlExpressionFactory _sqlExpressionFactory; + + public MySQLDateTimeMemberTranslator(ISqlExpressionFactory sqlExpressionFactory) + { + _sqlExpressionFactory = (MySQLSqlExpressionFactory)sqlExpressionFactory; + } + + public virtual SqlExpression? Translate( + SqlExpression? instance, + MemberInfo member, + Type returnType, + IDiagnosticsLogger logger) + { + var declaringType = member.DeclaringType; + + if (declaringType == typeof(DateTime) + || declaringType == typeof(DateTimeOffset) + || declaringType == typeof(DateOnly) + || declaringType == typeof(TimeOnly)) + { + var memberName = member.Name; + + if (_datePartMapping.TryGetValue(memberName, out var datePart)) + { + var extract = _sqlExpressionFactory.Function( + "EXTRACT", + new[] + { + _sqlExpressionFactory.ComplexFunctionArgument( + new [] { + _sqlExpressionFactory.Fragment($"{datePart.Part} FROM"), + instance! + }, + " ", + typeof(string)) + }, + nullable: true, + argumentsPropagateNullability: TrueArrays[1], + returnType); + + if (datePart.Divisor != 1) + { + return _sqlExpressionFactory.MySqlIntegerDivide( + extract, + _sqlExpressionFactory.Constant(datePart.Divisor)); + } + + return extract; + } + + switch (memberName) + { + case nameof(DateTime.DayOfYear): + return _sqlExpressionFactory.NullableFunction( + "DAYOFYEAR", + new[] { instance! }, + returnType, + false); + + case nameof(DateTime.Date): + return _sqlExpressionFactory.NullableFunction( + "CONVERT", + new[]{ + instance!, + _sqlExpressionFactory.Fragment("date") + }, + returnType, + false); + + case nameof(DateTime.TimeOfDay): + return _sqlExpressionFactory.Convert(instance!, returnType); + + case nameof(DateTime.Now): + return _sqlExpressionFactory.NonNullableFunction( + declaringType == typeof(DateTimeOffset) + ? "UTC_TIMESTAMP" + : "CURRENT_TIMESTAMP", + Array.Empty(), + returnType); + + case nameof(DateTime.UtcNow): + return _sqlExpressionFactory.NonNullableFunction( + "UTC_TIMESTAMP", + Array.Empty(), + returnType); + + case nameof(DateTime.Today): + return _sqlExpressionFactory.NonNullableFunction( + declaringType == typeof(DateTimeOffset) + ? "UTC_DATE" + : "CURDATE", + Array.Empty(), + returnType); + + case nameof(DateTime.DayOfWeek): + return _sqlExpressionFactory.Subtract( + _sqlExpressionFactory.NullableFunction( + "DAYOFWEEK", + new[] { instance! }, + returnType, + false), + _sqlExpressionFactory.Constant(1)); + } + } + + return null; + } + } +} diff --git a/EFCore/src/Query/Internal/MySQLDateTimeMethodTranslator.cs b/EFCore/src/Query/Internal/MySQLDateTimeMethodTranslator.cs new file mode 100644 index 000000000..dfb87f08c --- /dev/null +++ b/EFCore/src/Query/Internal/MySQLDateTimeMethodTranslator.cs @@ -0,0 +1,164 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using System; +using System.Collections.Generic; +using System.Reflection; +using static MySql.EntityFrameworkCore.Utils.Statics; + +namespace MySql.EntityFrameworkCore.Query.Internal +{ + internal class MySQLDateTimeMethodTranslator : IMethodCallTranslator + { + private readonly Dictionary _methodInfoDatePartMapping = new Dictionary + { + { typeof(DateTime).GetRuntimeMethod(nameof(DateTime.AddYears), new[] { typeof(int) })!, "year" }, + { typeof(DateTime).GetRuntimeMethod(nameof(DateTime.AddMonths), new[] { typeof(int) })!, "month" }, + { typeof(DateTime).GetRuntimeMethod(nameof(DateTime.AddDays), new[] { typeof(double) })!, "day" }, + { typeof(DateTime).GetRuntimeMethod(nameof(DateTime.AddHours), new[] { typeof(double) })!, "hour" }, + { typeof(DateTime).GetRuntimeMethod(nameof(DateTime.AddMinutes), new[] { typeof(double) })!, "minute" }, + { typeof(DateTime).GetRuntimeMethod(nameof(DateTime.AddSeconds), new[] { typeof(double) })!, "second" }, + { typeof(DateTime).GetRuntimeMethod(nameof(DateTime.AddMilliseconds), new[] { typeof(double) })!, "microsecond" }, + { typeof(DateTimeOffset).GetRuntimeMethod(nameof(DateTimeOffset.AddYears), new[] { typeof(int) })!, "year" }, + { typeof(DateTimeOffset).GetRuntimeMethod(nameof(DateTimeOffset.AddMonths), new[] { typeof(int) })!, "month" }, + { typeof(DateTimeOffset).GetRuntimeMethod(nameof(DateTimeOffset.AddDays), new[] { typeof(double) })!, "day" }, + { typeof(DateTimeOffset).GetRuntimeMethod(nameof(DateTimeOffset.AddHours), new[] { typeof(double) })!, "hour" }, + { typeof(DateTimeOffset).GetRuntimeMethod(nameof(DateTimeOffset.AddMinutes), new[] { typeof(double) })!, "minute" }, + { typeof(DateTimeOffset).GetRuntimeMethod(nameof(DateTimeOffset.AddSeconds), new[] { typeof(double) })!, "second" }, + { typeof(DateTimeOffset).GetRuntimeMethod(nameof(DateTimeOffset.AddMilliseconds), new[] { typeof(double) })!, "microsecond" }, + { typeof(DateOnly).GetRuntimeMethod(nameof(DateOnly.AddYears), new[] { typeof(int) })!, "year" }, + { typeof(DateOnly).GetRuntimeMethod(nameof(DateOnly.AddMonths), new[] { typeof(int) })!, "month" }, + { typeof(DateOnly).GetRuntimeMethod(nameof(DateOnly.AddDays), new[] { typeof(int) })!, "day" }, + { typeof(TimeOnly).GetRuntimeMethod(nameof(TimeOnly.AddHours), new[] { typeof(double) })!, "hour" }, + { typeof(TimeOnly).GetRuntimeMethod(nameof(TimeOnly.AddMinutes), new[] { typeof(double) })!, "minute" } + }; + + private static readonly MethodInfo _timeOnlyAddTimeSpanMethod = typeof(TimeOnly).GetRuntimeMethod(nameof(TimeOnly.Add), new[] { typeof(TimeSpan) })!; + private static readonly MethodInfo _timeOnlyIsBetweenMethod = typeof(TimeOnly).GetRuntimeMethod(nameof(TimeOnly.IsBetween), new[] { typeof(TimeOnly), typeof(TimeOnly) })!; + + private static readonly MethodInfo _dateOnlyFromDateTimeMethod = typeof(DateOnly).GetRuntimeMethod(nameof(DateOnly.FromDateTime), new[] { typeof(DateTime) })!; + private static readonly MethodInfo _dateOnlyToDateTimeMethod = typeof(DateOnly).GetRuntimeMethod(nameof(DateOnly.ToDateTime), new[] { typeof(TimeOnly) })!; + + private MySQLSqlExpressionFactory _sqlExpressionFactory; + + public MySQLDateTimeMethodTranslator(ISqlExpressionFactory sqlExpressionFactory) + { + _sqlExpressionFactory = (MySQLSqlExpressionFactory)sqlExpressionFactory; + } + + public virtual SqlExpression? Translate(SqlExpression? instance, MethodInfo method, IReadOnlyList arguments, IDiagnosticsLogger logger) + { + if (_methodInfoDatePartMapping.TryGetValue(method, out var datePart)) + { + return !datePart.Equals("year") + && !datePart.Equals("month") + && arguments[0] is SqlConstantExpression sqlConstant + && ((double)sqlConstant.Value! >= int.MaxValue + || (double)sqlConstant.Value <= int.MinValue) + ? null + : _sqlExpressionFactory.Function( + "DATE_ADD", + new[] + { + instance!, + _sqlExpressionFactory.ComplexFunctionArgument(new SqlExpression[] + { + _sqlExpressionFactory.Fragment("INTERVAL"), + _sqlExpressionFactory.Convert(arguments[0], typeof(int)), + _sqlExpressionFactory.Fragment(datePart) + }, + " ", + typeof(string)) + }, + nullable: true, +#if !NET9_0_OR_GREATER + argumentsPropagateNullability: TrueArrays[1], +#else + argumentsPropagateNullability: new[] { true, false }, +#endif + instance!.Type, + instance.TypeMapping); + } + + if (method.DeclaringType == typeof(TimeOnly)) + { + if (method == _timeOnlyAddTimeSpanMethod) + { + return _sqlExpressionFactory.Add(instance!, arguments[0]); + } + + if (method == _timeOnlyIsBetweenMethod) + { + return _sqlExpressionFactory.And( + _sqlExpressionFactory.GreaterThanOrEqual(instance!, arguments[0]), + _sqlExpressionFactory.LessThan(instance!, arguments[1])); + } + } + + if (method.DeclaringType == typeof(DateOnly)) + { + if (method == _dateOnlyFromDateTimeMethod) + { + return _sqlExpressionFactory.NullableFunction( + "DATE", + new[] { arguments[0] }, + method.ReturnType); + } + + if (method == _dateOnlyToDateTimeMethod) + { + var convertExpression = _sqlExpressionFactory.Convert( + instance!, + method.ReturnType); + + if (arguments[0] is SqlConstantExpression sqlConstantExpression && + sqlConstantExpression.Value is TimeOnly timeOnly && + timeOnly == default) + { + return convertExpression; + } + + return _sqlExpressionFactory.NullableFunction( + "ADDTIME", + new[] + { + convertExpression, + arguments[0] + }, + method.ReturnType); + } + } + + return null; + } + } +} diff --git a/EFCore/src/Query/Internal/MySQLEvaluatableExpressionFilter.cs b/EFCore/src/Query/Internal/MySQLEvaluatableExpressionFilter.cs new file mode 100644 index 000000000..50d159ff5 --- /dev/null +++ b/EFCore/src/Query/Internal/MySQLEvaluatableExpressionFilter.cs @@ -0,0 +1,74 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Query; +using MySql.EntityFrameworkCore.Extensions; +using System.Linq.Expressions; + +namespace Microsoft.EntityFrameworkCore.SqlServer.Query.Internal +{ + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + internal class MySQLEvaluatableExpressionFilter : RelationalEvaluatableExpressionFilter + { + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + public MySQLEvaluatableExpressionFilter( + EvaluatableExpressionFilterDependencies dependencies, + RelationalEvaluatableExpressionFilterDependencies relationalDependencies) + : base(dependencies, relationalDependencies) + { + } + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + public override bool IsEvaluatableExpression(Expression expression, IModel model) + { + if (expression is MethodCallExpression methodCallExpression + && methodCallExpression.Method.DeclaringType == typeof(MySQLDbFunctionsExtensions)) + { + return false; + } + + return base.IsEvaluatableExpression(expression, model); + } + } +} diff --git a/EFCore/src/Query/Internal/MySQLMathTranslator.cs b/EFCore/src/Query/Internal/MySQLMathTranslator.cs new file mode 100644 index 000000000..ba3f30f38 --- /dev/null +++ b/EFCore/src/Query/Internal/MySQLMathTranslator.cs @@ -0,0 +1,137 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using System; +using System.Collections.Generic; +using System.Reflection; +using static MySql.EntityFrameworkCore.Utils.Statics; + +namespace MySql.EntityFrameworkCore.Query.Internal +{ + internal class MySQLMathMethodTranslator : IMethodCallTranslator + { + private static readonly Dictionary _supportedMethodTranslations = new() + { + { typeof(Math).GetRuntimeMethod(nameof(Math.Abs), new[] { typeof(decimal) })!, "ABS" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Abs), new[] { typeof(double) })!, "ABS" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Abs), new[] { typeof(float) })!, "ABS" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Abs), new[] { typeof(int) })!, "ABS" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Abs), new[] { typeof(long) })!, "ABS" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Abs), new[] { typeof(short) })!, "ABS" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Acos), new[] { typeof(double) })!, "ACOS" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Asin), new[] { typeof(double) })!, "ASIN" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Atan), new[] { typeof(double) })!, "ATAN" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Atan2), new[] { typeof(double), typeof(double) })!, "ATAN2" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Ceiling), new[] { typeof(decimal) })!, "CEILING" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Ceiling), new[] { typeof(double) })!, "CEILING" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Cos), new[] { typeof(double) })!, "COS" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Exp), new[] { typeof(double) })!, "EXP" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Floor), new[] { typeof(decimal) })!, "FLOOR" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Floor), new[] { typeof(double) })!, "FLOOR" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Log), new[] { typeof(double) })!, "LOG" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Log), new[] { typeof(double), typeof(double) })!, "LOG" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Log10), new[] { typeof(double) })!, "LOG10" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Max), new[] { typeof(decimal), typeof(decimal) })!, "GREATEST" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Max), new[] { typeof(double), typeof(double) })!, "GREATEST" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Max), new[] { typeof(float), typeof(float) })!, "GREATEST" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Max), new[] { typeof(int), typeof(int) })!, "GREATEST" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Max), new[] { typeof(long), typeof(long) })!, "GREATEST" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Max), new[] { typeof(short), typeof(short) })!, "GREATEST" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Min), new[] { typeof(decimal), typeof(decimal) })!, "LEAST" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Min), new[] { typeof(double), typeof(double) })!, "LEAST" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Min), new[] { typeof(float), typeof(float) })!, "LEAST" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Min), new[] { typeof(int), typeof(int) })!, "LEAST" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Min), new[] { typeof(long), typeof(long) })!, "LEAST" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Min), new[] { typeof(short), typeof(short) })!, "LEAST" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Pow), new[] { typeof(double), typeof(double) })!, "POWER" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Round), new[] { typeof(double) })!, "ROUND" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Round), new[] { typeof(double), typeof(int) })!, "ROUND" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Round), new[] { typeof(decimal) })!, "ROUND" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Round), new[] { typeof(decimal), typeof(int) })!, "ROUND" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Sign), new[] { typeof(decimal) })!, "SIGN" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Sign), new[] { typeof(double) })!, "SIGN" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Sign), new[] { typeof(float) })!, "SIGN" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Sign), new[] { typeof(int) })!, "SIGN" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Sign), new[] { typeof(long) })!, "SIGN" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Sign), new[] { typeof(sbyte) })!, "SIGN" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Sign), new[] { typeof(short) })!, "SIGN" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Sin), new[] { typeof(double) })!, "SIN" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Sqrt), new[] { typeof(double) })!, "SQRT" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Tan), new[] { typeof(double) })!, "TAN" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Truncate), new[] { typeof(double) })!, "TRUNCATE" }, + { typeof(Math).GetRuntimeMethod(nameof(Math.Truncate), new[] { typeof(decimal) })!, "TRUNCATE" }, + }; + + private readonly ISqlExpressionFactory _sqlExpressionFactory; + + public MySQLMathMethodTranslator(ISqlExpressionFactory sqlExpressionFactory) + => _sqlExpressionFactory = sqlExpressionFactory; + + /// + public SqlExpression? Translate(SqlExpression? instance, MethodInfo method, IReadOnlyList arguments, IDiagnosticsLogger logger) + { + if (_supportedMethodTranslations.TryGetValue(method, out var sqlFunctionName)) + { + var targetArgumentsCount = arguments.Count; + + if (sqlFunctionName == "TRUNCATE") + { + targetArgumentsCount = 2; + } + + var newArguments = new SqlExpression[targetArgumentsCount]; + newArguments[0] = arguments[0]; + + if (targetArgumentsCount == 2) + { + if (arguments.Count == 2) + { + newArguments[1] = arguments[1]; + } + else + { + newArguments[1] = _sqlExpressionFactory.Constant(0); + } + } + + return _sqlExpressionFactory.Function( + sqlFunctionName, + newArguments, + nullable: true, + argumentsPropagateNullability: TrueArrays[newArguments.Length], + method.ReturnType); + } + + return null; + } + } +} diff --git a/EFCore/src/Query/Internal/MySQLMemberTranslatorProvider.cs b/EFCore/src/Query/Internal/MySQLMemberTranslatorProvider.cs new file mode 100644 index 000000000..7d51db057 --- /dev/null +++ b/EFCore/src/Query/Internal/MySQLMemberTranslatorProvider.cs @@ -0,0 +1,47 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Query; + +namespace MySql.EntityFrameworkCore.Query.Internal +{ + internal class MySQLMemberTranslatorProvider : RelationalMemberTranslatorProvider + { + public MySQLMemberTranslatorProvider([NotNull] RelationalMemberTranslatorProviderDependencies dependencies) + : base(dependencies) + { + var sqlExpressionFactory = dependencies.SqlExpressionFactory; + + AddTranslators( + new IMemberTranslator[] { + new MySQLDateTimeMemberTranslator(sqlExpressionFactory), + new MySQLStringMemberTranslator(sqlExpressionFactory) + }); + } + } +} diff --git a/EFCore/src/Query/Internal/MySQLMethodCallTranslatorProvider.cs b/EFCore/src/Query/Internal/MySQLMethodCallTranslatorProvider.cs new file mode 100644 index 000000000..3538d2342 --- /dev/null +++ b/EFCore/src/Query/Internal/MySQLMethodCallTranslatorProvider.cs @@ -0,0 +1,58 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Query; +using MySql.EntityFrameworkCore.Query.Expressions.Internal; +using MySql.EntityFrameworkCore.Query.ExpressionTranslators.Internal; + +namespace MySql.EntityFrameworkCore.Query.Internal +{ + internal class MySQLMethodCallTranslatorProvider : RelationalMethodCallTranslatorProvider + { + public MySQLMethodCallTranslatorProvider([NotNull] RelationalMethodCallTranslatorProviderDependencies dependencies) + : base(dependencies) + { + var sqlExpressionFactory = (MySQLSqlExpressionFactory)dependencies.SqlExpressionFactory; + + AddTranslators(new IMethodCallTranslator[] + { + new MySQLByteArrayMethodTranslator(sqlExpressionFactory), + new MySQLConvertTranslator(sqlExpressionFactory), + new MySQLDateTimeMethodTranslator(sqlExpressionFactory), + new MySQLDateDiffFunctionsTranslator(sqlExpressionFactory), + new MySQLMathMethodTranslator(sqlExpressionFactory), + new MySQLNewGuidTranslator(sqlExpressionFactory), + new MySQLObjectToStringTranslator(sqlExpressionFactory), + new MySQLStringMethodTranslator(sqlExpressionFactory), + new MySQLRegexIsMatchTranslator(sqlExpressionFactory), + new MySQLStringComparisonMethodTranslator(sqlExpressionFactory), + new MySQLDbFunctionsExtensionsMethodTranslator(sqlExpressionFactory), + }); + } + } +} diff --git a/EFCore/src/Query/Internal/MySQLNewGuidTranslator.cs b/EFCore/src/Query/Internal/MySQLNewGuidTranslator.cs new file mode 100644 index 000000000..0a2cd57dd --- /dev/null +++ b/EFCore/src/Query/Internal/MySQLNewGuidTranslator.cs @@ -0,0 +1,62 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using System; +using System.Collections.Generic; +using System.Reflection; +using static MySql.EntityFrameworkCore.Utils.Statics; + +namespace MySql.EntityFrameworkCore.Query.Internal +{ + internal class MySQLNewGuidTranslator : IMethodCallTranslator + { + private static readonly MethodInfo _methodInfo = typeof(Guid).GetRuntimeMethod(nameof(Guid.NewGuid), Array.Empty())!; + private readonly ISqlExpressionFactory _sqlExpressionFactory; + + public MySQLNewGuidTranslator(ISqlExpressionFactory sqlExpressionFactory) + { + _sqlExpressionFactory = sqlExpressionFactory; + } + + public virtual SqlExpression? Translate(SqlExpression? instance, MethodInfo method, IReadOnlyList arguments, IDiagnosticsLogger logger) + { + return _methodInfo.Equals(method) + ? _sqlExpressionFactory.Function( + "UUID", + Array.Empty(), + nullable: true, + argumentsPropagateNullability: TrueArrays[1], + method.ReturnType) + : null; + } + } +} diff --git a/EFCore/src/Query/Internal/MySQLObjectToStringTranslator.cs b/EFCore/src/Query/Internal/MySQLObjectToStringTranslator.cs new file mode 100644 index 000000000..d8455bff7 --- /dev/null +++ b/EFCore/src/Query/Internal/MySQLObjectToStringTranslator.cs @@ -0,0 +1,98 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using MySql.EntityFrameworkCore.Utils; +using System; +using System.Collections.Generic; +using System.Reflection; +using static MySql.EntityFrameworkCore.Utils.Statics; + +namespace MySql.EntityFrameworkCore.Query.Internal +{ + internal class MySQLObjectToStringTranslator : IMethodCallTranslator + { + private const int DefaultLength = 127; + + private static readonly Dictionary _typeMapping + = new Dictionary + { + { typeof(int), "CHAR(11)" }, + { typeof(long), "CHAR(20)" }, + { typeof(DateTime), $"CHAR({DefaultLength})" }, + { typeof(Guid), "CHAR(36)" }, + { typeof(bool), "CHAR(5)" }, + { typeof(byte), "CHAR(3)" }, + { typeof(byte[]), $"CHAR({DefaultLength})" }, + { typeof(double), $"CHAR({DefaultLength})" }, + { typeof(DateTimeOffset), $"CHAR({DefaultLength})" }, + { typeof(char), "CHAR(1)" }, + { typeof(short), "CHAR(6)" }, + { typeof(float), $"CHAR({DefaultLength})" }, + { typeof(decimal), $"CHAR({DefaultLength})" }, + { typeof(TimeSpan), $"CHAR({DefaultLength})" }, + { typeof(uint), "CHAR(10)" }, + { typeof(ushort), "CHAR(5)" }, + { typeof(ulong), "CHAR(19)" }, + { typeof(sbyte), "CHAR(4)" } + }; + + private readonly ISqlExpressionFactory _sqlExpressionFactory; + + public MySQLObjectToStringTranslator(ISqlExpressionFactory sqlExpressionFactory) + { + _sqlExpressionFactory = sqlExpressionFactory; + } + + public virtual SqlExpression? Translate(SqlExpression? instance, MethodInfo method, IReadOnlyList arguments, IDiagnosticsLogger logger) + { + // Translates parameterless Object.ToString() calls. + return method.Name == nameof(ToString) + && arguments.Count == 0 + && instance != null + && _typeMapping.TryGetValue( + instance.Type + .UnwrapNullableType(), + out var storeType) + ? _sqlExpressionFactory.Function( + "CONVERT", + new[] + { + instance, + _sqlExpressionFactory.Fragment(storeType) + }, + nullable: true, + argumentsPropagateNullability: TrueArrays[2], + typeof(string)) + : null; + } + } +} diff --git a/EFCore/src/Query/Internal/MySQLParameterBasedSqlProcessor.cs b/EFCore/src/Query/Internal/MySQLParameterBasedSqlProcessor.cs new file mode 100644 index 000000000..18633c334 --- /dev/null +++ b/EFCore/src/Query/Internal/MySQLParameterBasedSqlProcessor.cs @@ -0,0 +1,83 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using MySql.EntityFrameworkCore.Infrastructure.Internal; +using MySql.EntityFrameworkCore.Utils; +using System.Collections.Generic; +using System.Linq.Expressions; + +namespace MySql.EntityFrameworkCore.Query.Internal +{ + internal class MySQLParameterBasedSqlProcessor : RelationalParameterBasedSqlProcessor + { + private readonly IMySQLOptions _options; + +#if !NET9_0_OR_GREATER + public MySQLParameterBasedSqlProcessor( + RelationalParameterBasedSqlProcessorDependencies dependencies, + bool useRelationalNulls, + IMySQLOptions options) + : base(dependencies, useRelationalNulls) + { + _options = options; + } +#else + public MySQLParameterBasedSqlProcessor( + RelationalParameterBasedSqlProcessorDependencies dependencies, + RelationalParameterBasedSqlProcessorParameters parameters, + IMySQLOptions options) + : base(dependencies, parameters) + { + _options = options; + } +#endif + + /// +#if NET8_0 + protected override Expression ProcessSqlNullability( + Expression selectExpression, IReadOnlyDictionary parametersValues, out bool canCache) + { + Check.NotNull(selectExpression, nameof(selectExpression)); + Check.NotNull(parametersValues, nameof(parametersValues)); + + return new MySQLSqlNullabilityProcessor(Dependencies, UseRelationalNulls).Process(selectExpression, parametersValues, out canCache); + } +#elif NET9_0_OR_GREATER + protected override Expression ProcessSqlNullability( + Expression selectExpression, IReadOnlyDictionary parametersValues, out bool canCache) + { + Check.NotNull(selectExpression, nameof(selectExpression)); + Check.NotNull(parametersValues, nameof(parametersValues)); + + return new MySQLSqlNullabilityProcessor(Dependencies, Parameters).Process(selectExpression, parametersValues, out canCache); + } +#endif + } +} diff --git a/EFCore/src/Query/Internal/MySQLParameterBasedSqlProcessorFactory.cs b/EFCore/src/Query/Internal/MySQLParameterBasedSqlProcessorFactory.cs new file mode 100644 index 000000000..de50f63d1 --- /dev/null +++ b/EFCore/src/Query/Internal/MySQLParameterBasedSqlProcessorFactory.cs @@ -0,0 +1,53 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Query; +using MySql.EntityFrameworkCore.Infrastructure.Internal; + +namespace MySql.EntityFrameworkCore.Query.Internal +{ + internal class MySQLParameterBasedSqlProcessorFactory : IRelationalParameterBasedSqlProcessorFactory + { + private readonly RelationalParameterBasedSqlProcessorDependencies _dependencies; + [NotNull] private readonly IMySQLOptions _options; + + public MySQLParameterBasedSqlProcessorFactory(RelationalParameterBasedSqlProcessorDependencies dependencies, IMySQLOptions options) + { + _dependencies = dependencies; + _options = options; + } + +#if NET9_0_OR_GREATER + public RelationalParameterBasedSqlProcessor Create(RelationalParameterBasedSqlProcessorParameters parameters) + => new MySQLParameterBasedSqlProcessor(_dependencies, parameters, _options); +#else + public virtual RelationalParameterBasedSqlProcessor Create(bool useRelationalNulls) + => new MySQLParameterBasedSqlProcessor(_dependencies, useRelationalNulls, _options); +#endif + } +} diff --git a/EFCore/src/Query/Internal/MySQLQueryCompilationContext.cs b/EFCore/src/Query/Internal/MySQLQueryCompilationContext.cs new file mode 100644 index 000000000..821c3ac54 --- /dev/null +++ b/EFCore/src/Query/Internal/MySQLQueryCompilationContext.cs @@ -0,0 +1,45 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Query; + +namespace MySql.EntityFrameworkCore.Query.Internal +{ + internal class MySQLQueryCompilationContext : RelationalQueryCompilationContext + { + public MySQLQueryCompilationContext( + [NotNull] QueryCompilationContextDependencies dependencies, + [NotNull] RelationalQueryCompilationContextDependencies relationalDependencies, bool async) + : base(dependencies, relationalDependencies, async) + { + } + + public override bool IsBuffering + => base.IsBuffering || QuerySplittingBehavior == Microsoft.EntityFrameworkCore.QuerySplittingBehavior.SplitQuery; + } +} diff --git a/EFCore/src/Query/Internal/MySQLQueryCompilationContextFactory.cs b/EFCore/src/Query/Internal/MySQLQueryCompilationContextFactory.cs new file mode 100644 index 000000000..3629a6424 --- /dev/null +++ b/EFCore/src/Query/Internal/MySQLQueryCompilationContextFactory.cs @@ -0,0 +1,53 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Query; +using MySql.EntityFrameworkCore.Utils; + +namespace MySql.EntityFrameworkCore.Query.Internal +{ + internal class MySQLQueryCompilationContextFactory : IQueryCompilationContextFactory + { + private readonly QueryCompilationContextDependencies _dependencies; + private readonly RelationalQueryCompilationContextDependencies _relationalDependencies; + + public MySQLQueryCompilationContextFactory( + [NotNull] QueryCompilationContextDependencies dependencies, + [NotNull] RelationalQueryCompilationContextDependencies relationalDependencies) + { + Check.NotNull(dependencies, nameof(dependencies)); + Check.NotNull(relationalDependencies, nameof(relationalDependencies)); + + _dependencies = dependencies; + _relationalDependencies = relationalDependencies; + } + + public virtual QueryCompilationContext Create(bool async) + => new MySQLQueryCompilationContext(_dependencies, _relationalDependencies, async); + } +} diff --git a/EFCore/src/Query/Internal/MySQLQueryStringFactory.cs b/EFCore/src/Query/Internal/MySQLQueryStringFactory.cs new file mode 100644 index 000000000..caac3d8f1 --- /dev/null +++ b/EFCore/src/Query/Internal/MySQLQueryStringFactory.cs @@ -0,0 +1,152 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Storage; +using System; +using System.Data.Common; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; + +namespace MySql.EntityFrameworkCore.Query.Internal +{ + internal class MySQLQueryStringFactory : IRelationalQueryStringFactory + { + private static readonly Lazy _limitExpressionParameterRegex = new Lazy( + () => new Regex($@"(?<=\W)LIMIT\s+(?:(?@?\w+),\s*)?(?@?\w+)(?:\s*OFFSET\s*(?@?\w+))?", + RegexOptions.Singleline | RegexOptions.IgnoreCase)); + + private static readonly Lazy _extractParameterRegex = new Lazy(() => new Regex(@"@\w+")); + + private readonly IRelationalTypeMappingSource _typeMapper; + + public MySQLQueryStringFactory([NotNull] IRelationalTypeMappingSource typeMapper) + { + _typeMapper = typeMapper; + } + + public virtual string Create(DbCommand command) + { + if (command.Parameters.Count == 0) + { + return command.CommandText; + } + + PrepareCommand(command); + + var builder = new StringBuilder(); + foreach (DbParameter parameter in command.Parameters) + { + builder + .Append("SET ") + .Append(parameter.ParameterName) + .Append(" = ") + .Append(GetParameterValue(parameter)) + .AppendLine(";"); + } + + return builder + .AppendLine() + .Append(command.CommandText).ToString(); + } + + private string? GetParameterValue(DbParameter parameter) + { + var typeMapping = _typeMapper.FindMapping(parameter.Value!.GetType()); + + return (parameter.Value == DBNull.Value || parameter.Value == null) + ? "NULL" : typeMapping != null + ? typeMapping.GenerateSqlLiteral(parameter.Value) : parameter.Value.ToString(); + } + + protected virtual void PrepareCommand(DbCommand command) + { + var stringParameterNames = command.Parameters.Cast() + .Where(p => p.Value is string) + .Select(p => p.ParameterName) + .ToList(); + + if (!command.CommandText.Contains("LIMIT", StringComparison.OrdinalIgnoreCase) && + !stringParameterNames.Any()) + return; + + var matches = _limitExpressionParameterRegex.Value.Matches(command.CommandText); + if (matches.Count <= 0 && !stringParameterNames.Any()) + return; + + var limitGroupsWithParameter = matches.SelectMany(m => m.Groups["row_count"].Captures) + .Concat(matches.SelectMany(m => m.Groups["leading_offset"].Captures)) + .Concat(matches.SelectMany(m => m.Groups["trailing_offset"].Captures)) + .ToList(); + + if (!limitGroupsWithParameter.Any() && !stringParameterNames.Any()) + return; + + var parser = new MySQLCommandParser(command.CommandText); + var parameterPositions = parser.GetStateIndices('@'); + var parameters = parameterPositions + .Select(i => new + { + Index = i, + ParameterName = _extractParameterRegex.Value.Match(command.CommandText.Substring(i)).Value, + }) + .Where(t => !string.IsNullOrEmpty(t.ParameterName)).ToList(); + + var validParameters = (limitGroupsWithParameter.Where(c => parameterPositions.Contains(c.Index) && + command.Parameters.Contains(c.Value)).Select(c => new { Index = c.Index, ParameterName = c.Value })) + .Concat(stringParameterNames.SelectMany(s => parameters.Where(p => p.ParameterName == s))).Distinct() + .OrderByDescending(c => c.Index).ToList(); + + foreach (var validParameter in validParameters) + { + var parameterIndex = validParameter.Index; + var parameterName = validParameter.ParameterName; + + parameters.RemoveAt( + parameters.FindIndex( + t => t.Index == parameterIndex && + t.ParameterName == parameterName)); + + var parameter = command.Parameters[parameterName]; + var parameterValue = GetParameterValue(parameter); + + command.CommandText = command.CommandText.Substring(0, parameterIndex) + + parameterValue + + command.CommandText.Substring(parameterIndex + validParameter.ParameterName.Length); + } + + foreach (var parameterName in validParameters + .Select(c => c.ParameterName).Distinct() + .Where(s => parameters.FindIndex(t => t.ParameterName == s) == -1)) + { + command.Parameters.RemoveAt(parameterName); + } + } + } +} diff --git a/EFCore/src/Query/Internal/MySQLQueryTranslationPostprocessor.cs b/EFCore/src/Query/Internal/MySQLQueryTranslationPostprocessor.cs new file mode 100644 index 000000000..5112c5e0c --- /dev/null +++ b/EFCore/src/Query/Internal/MySQLQueryTranslationPostprocessor.cs @@ -0,0 +1,55 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Query; +using MySql.EntityFrameworkCore.Infrastructure.Internal; +using System.Linq.Expressions; + +namespace MySql.EntityFrameworkCore.Query.Internal +{ + internal class MySQLQueryTranslationPostprocessor : RelationalQueryTranslationPostprocessor + { + private readonly IMySQLOptions _options; + + public MySQLQueryTranslationPostprocessor( + QueryTranslationPostprocessorDependencies dependencies, + RelationalQueryTranslationPostprocessorDependencies relationalDependencies, + MySQLQueryCompilationContext queryCompilationContext, + IMySQLOptions options) + : base(dependencies, relationalDependencies, queryCompilationContext) + { + _options = options; + } + + public override Expression Process(Expression query) + { + query = base.Process(query); + return new MySQLCompatibilityExpressionVisitor(_options).Visit(query); + } + } +} diff --git a/EFCore/src/Query/Internal/MySQLQueryTranslationPostprocessorFactory.cs b/EFCore/src/Query/Internal/MySQLQueryTranslationPostprocessorFactory.cs new file mode 100644 index 000000000..147a36511 --- /dev/null +++ b/EFCore/src/Query/Internal/MySQLQueryTranslationPostprocessorFactory.cs @@ -0,0 +1,58 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Query; +using MySql.EntityFrameworkCore.Infrastructure.Internal; + +namespace MySql.EntityFrameworkCore.Query.Internal +{ + internal class MySQLQueryTranslationPostprocessorFactory : IQueryTranslationPostprocessorFactory + { + private readonly QueryTranslationPostprocessorDependencies _dependencies; + private readonly RelationalQueryTranslationPostprocessorDependencies _relationalDependencies; + private readonly IMySQLOptions _options; + + public MySQLQueryTranslationPostprocessorFactory( + QueryTranslationPostprocessorDependencies dependencies, + RelationalQueryTranslationPostprocessorDependencies relationalDependencies, + IMySQLOptions options) + { + _dependencies = dependencies; + _relationalDependencies = relationalDependencies; + _options = options; + } + + public virtual QueryTranslationPostprocessor Create(QueryCompilationContext queryCompilationContext) + => new MySQLQueryTranslationPostprocessor( + _dependencies, + _relationalDependencies, + (MySQLQueryCompilationContext)queryCompilationContext, + _options); + } + +} diff --git a/EFCore/src/Query/Internal/MySQLSqlExpressionFactory.cs b/EFCore/src/Query/Internal/MySQLSqlExpressionFactory.cs new file mode 100644 index 000000000..da1883b17 --- /dev/null +++ b/EFCore/src/Query/Internal/MySQLSqlExpressionFactory.cs @@ -0,0 +1,372 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using Microsoft.EntityFrameworkCore.Storage; +using MySql.EntityFrameworkCore.Extensions; +using MySql.EntityFrameworkCore.Query.Expressions.Internal; +using MySql.EntityFrameworkCore.Storage.Internal; +using MySql.EntityFrameworkCore.Utils; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace MySql.EntityFrameworkCore.Query.Internal +{ + internal class MySQLSqlExpressionFactory : SqlExpressionFactory + { + private readonly IRelationalTypeMappingSource _typeMappingSource; + private readonly RelationalTypeMapping? _boolTypeMapping; + + public MySQLSqlExpressionFactory(SqlExpressionFactoryDependencies dependencies) + : base(dependencies) + { + _typeMappingSource = dependencies.TypeMappingSource; + _boolTypeMapping = _typeMappingSource.FindMapping(typeof(bool)); + } + + public virtual SqlFunctionExpression NullableFunction( + string name, + IEnumerable arguments, + Type returnType, + bool onlyNullWhenAnyNullPropagatingArgumentIsNull) + => NullableFunction(name, arguments, returnType, null, onlyNullWhenAnyNullPropagatingArgumentIsNull); + + public virtual SqlFunctionExpression NullableFunction( + string name, + IEnumerable arguments, + Type returnType, + RelationalTypeMapping? typeMapping = null, + bool onlyNullWhenAnyNullPropagatingArgumentIsNull = true, + IEnumerable? argumentsPropagateNullability = null) + { + Check.NotEmpty(name, nameof(name)); + Check.NotNull(arguments, nameof(arguments)); + Check.NotNull(returnType, nameof(returnType)); + + var typeMappedArguments = new List(); + + foreach (var argument in arguments) + { + typeMappedArguments.Add(ApplyDefaultTypeMapping(argument)); + } + + return new SqlFunctionExpression( + name, + typeMappedArguments, + true, + onlyNullWhenAnyNullPropagatingArgumentIsNull + ? (argumentsPropagateNullability ?? Statics.GetTrueValues(typeMappedArguments.Count)) + : Statics.GetFalseValues(typeMappedArguments.Count), + returnType, + typeMapping); + } + + public virtual SqlFunctionExpression NonNullableFunction( + string name, + IEnumerable arguments, + Type returnType, + RelationalTypeMapping? typeMapping = null) + { + Check.NotEmpty(name, nameof(name)); + Check.NotNull(arguments, nameof(arguments)); + Check.NotNull(returnType, nameof(returnType)); + + var typeMappedArguments = new List(); + + foreach (var argument in arguments) + { + typeMappedArguments.Add(ApplyDefaultTypeMapping(argument)); + } + + return new SqlFunctionExpression( + name, + typeMappedArguments, + false, + Statics.GetFalseValues(typeMappedArguments.Count), + returnType, + typeMapping); + } + + public MySQLComplexFunctionArgumentExpression ComplexFunctionArgument( + IEnumerable argumentParts, + string delimiter, + Type argumentType, + RelationalTypeMapping? typeMapping = null) + { + var typeMappedArgumentParts = new List(); + + foreach (var argument in argumentParts) + { + typeMappedArgumentParts.Add(ApplyDefaultTypeMapping(argument)); + } + + return (MySQLComplexFunctionArgumentExpression)ApplyTypeMapping( + new MySQLComplexFunctionArgumentExpression( + typeMappedArgumentParts, + delimiter, + argumentType, + typeMapping!), + typeMapping); + } + + public MySQLCollateExpression Collate( + SqlExpression valueExpression, + string charset, + string collation) + => (MySQLCollateExpression)ApplyDefaultTypeMapping( +#if NET9_0_OR_GREATER + new MySQLCollateExpression( + valueExpression, + collation) +#else + new MySQLCollateExpression( + valueExpression, + charset, + collation, + null) +#endif + ); + + public virtual MySQLBinaryExpression MySqlIntegerDivide( + SqlExpression left, + SqlExpression right, + RelationalTypeMapping? typeMapping = null) + => MakeBinary( + MySQLBinaryExpressionOperatorType.IntegerDivision, + left, + right, + typeMapping); + + public virtual MySQLBinaryExpression NonOptimizedEqual( + SqlExpression left, + SqlExpression right, + RelationalTypeMapping? typeMapping = null) + => MakeBinary( + MySQLBinaryExpressionOperatorType.NonOptimizedEqual, + left, + right, + typeMapping); + + public virtual MySQLBinaryExpression MakeBinary( + MySQLBinaryExpressionOperatorType operatorType, + SqlExpression left, + SqlExpression right, + RelationalTypeMapping? typeMapping) + { + var returnType = left.Type; + + return (MySQLBinaryExpression)ApplyTypeMapping( + new MySQLBinaryExpression( + operatorType, + left, + right, + returnType, + null), + typeMapping); + } + + public virtual MySQLMatchExpression MakeMatch( + SqlExpression match, + SqlExpression against, + MySQLMatchSearchMode searchMode) + { + return (MySQLMatchExpression)ApplyDefaultTypeMapping( + new MySQLMatchExpression( + match, + against, + searchMode, + null)); + } + + public virtual MySQLRegexpExpression Regexp( + SqlExpression match, + SqlExpression pattern) + => (MySQLRegexpExpression)ApplyDefaultTypeMapping( + new MySQLRegexpExpression( + match, + pattern, + null)); + + public override SqlExpression ApplyTypeMapping(SqlExpression? sqlExpression, RelationalTypeMapping? typeMapping) + => sqlExpression is not { TypeMapping: null } + ? sqlExpression! + : ApplyNewTypeMapping(sqlExpression, typeMapping!); + + private SqlExpression ApplyNewTypeMapping(SqlExpression sqlExpression, RelationalTypeMapping typeMapping) + => sqlExpression switch + { + // Customize handling for binary expressions. + SqlBinaryExpression e => ApplyTypeMappingOnSqlBinary(e, typeMapping), + + // MySQL specific expression types: + MySQLComplexFunctionArgumentExpression e => ApplyTypeMappingOnComplexFunctionArgument(e), + MySQLCollateExpression e => ApplyTypeMappingOnCollate(e), + MySQLRegexpExpression e => ApplyTypeMappingOnRegexp(e), + MySQLBinaryExpression e => ApplyTypeMappingOnMySqlBinary(e, typeMapping), + MySQLMatchExpression e => ApplyTypeMappingOnMatch(e), + MySQLJsonArrayIndexExpression e => e.ApplyTypeMapping(typeMapping), + _ => base.ApplyTypeMapping(sqlExpression, typeMapping) + }; + + private SqlBinaryExpression ApplyTypeMappingOnSqlBinary(SqlBinaryExpression sqlBinaryExpression, RelationalTypeMapping typeMapping) + { + // The default SqlExpressionFactory behavior is to assume that the two operands have the same type, and so to infer one side's + // mapping from the other if needed. Here we take care of some heterogeneous operand cases where this doesn't work. + + var left = sqlBinaryExpression.Left; + var right = sqlBinaryExpression.Right; + + var newSqlBinaryExpression = (SqlBinaryExpression)base.ApplyTypeMapping(sqlBinaryExpression, typeMapping); + + // Handle the special case, that a JSON value is compared to a string (e.g. when used together with + // JSON_EXTRACT()). + // The string argument should not be interpreted as a JSON value, which it normally would due to inference + // if its type mapping hasn't been explicitly set before, but just as a string. + if (newSqlBinaryExpression.Left.TypeMapping is MySQLJsonTypeMapping newLeftTypeMapping && + newLeftTypeMapping.ClrType == typeof(string) && + right.TypeMapping is null && + right.Type == typeof(string)) + { + newSqlBinaryExpression = new SqlBinaryExpression( + sqlBinaryExpression.OperatorType, + ApplyTypeMapping(left, newLeftTypeMapping), + ApplyTypeMapping(right, _typeMappingSource.FindMapping(right.Type)), + newSqlBinaryExpression.Type, + newSqlBinaryExpression.TypeMapping); + } + else if (newSqlBinaryExpression.Right.TypeMapping is MySQLJsonTypeMapping newRightTypeMapping && + newRightTypeMapping.ClrType == typeof(string) && + left.TypeMapping is null && + left.Type == typeof(string)) + { + newSqlBinaryExpression = new SqlBinaryExpression( + sqlBinaryExpression.OperatorType, + ApplyTypeMapping(left, _typeMappingSource.FindMapping(left.Type)), + ApplyTypeMapping(right, newRightTypeMapping), + newSqlBinaryExpression.Type, + newSqlBinaryExpression.TypeMapping); + } + + return newSqlBinaryExpression; + } + + private MySQLComplexFunctionArgumentExpression ApplyTypeMappingOnComplexFunctionArgument(MySQLComplexFunctionArgumentExpression complexFunctionArgumentExpression) + { + var inferredTypeMapping = ExpressionExtensions.InferTypeMapping(complexFunctionArgumentExpression.ArgumentParts.ToArray()) + ?? _typeMappingSource.FindMapping(complexFunctionArgumentExpression.Type); + + return new MySQLComplexFunctionArgumentExpression( + complexFunctionArgumentExpression.ArgumentParts, + complexFunctionArgumentExpression.Delimiter, + complexFunctionArgumentExpression.Type, + inferredTypeMapping ?? complexFunctionArgumentExpression.TypeMapping!); + } + + private MySQLCollateExpression ApplyTypeMappingOnCollate(MySQLCollateExpression collateExpression) + { + var inferredTypeMapping = ExpressionExtensions.InferTypeMapping(collateExpression.ValueExpression) + ?? _typeMappingSource.FindMapping(collateExpression.ValueExpression.Type); + +#if NET9_0_OR_GREATER + return new MySQLCollateExpression(collateExpression.ValueExpression, collateExpression.Collation); +#else + return new MySQLCollateExpression( + ApplyTypeMapping(collateExpression.ValueExpression, inferredTypeMapping), + collateExpression.Charset, + collateExpression.Collation, + inferredTypeMapping ?? collateExpression.TypeMapping); +#endif + } + + private SqlExpression ApplyTypeMappingOnRegexp(MySQLRegexpExpression regexpExpression) + { + var inferredTypeMapping = ExpressionExtensions.InferTypeMapping(regexpExpression.Match) + ?? _typeMappingSource.FindMapping(regexpExpression.Match.Type); + + return new MySQLRegexpExpression( + ApplyTypeMapping(regexpExpression.Match, inferredTypeMapping), + ApplyTypeMapping(regexpExpression.Pattern, inferredTypeMapping), + _boolTypeMapping!); + } + + private SqlExpression ApplyTypeMappingOnMySqlBinary( + MySQLBinaryExpression sqlBinaryExpression, + RelationalTypeMapping? typeMapping) + { + var left = sqlBinaryExpression.Left; + var right = sqlBinaryExpression.Right; + + Type resultType; + RelationalTypeMapping? resultTypeMapping; + RelationalTypeMapping? inferredTypeMapping; + + switch (sqlBinaryExpression.OperatorType) + { + case MySQLBinaryExpressionOperatorType.NonOptimizedEqual: + inferredTypeMapping = ExpressionExtensions.InferTypeMapping(left, right) + ?? (left.Type != typeof(object) + ? _typeMappingSource.FindMapping(left.Type) + : _typeMappingSource.FindMapping(right.Type)); + resultType = typeof(bool); + resultTypeMapping = _boolTypeMapping; + break; + case MySQLBinaryExpressionOperatorType.IntegerDivision: + { + inferredTypeMapping = typeMapping ?? ExpressionExtensions.InferTypeMapping(left, right); + resultType = left.Type; + resultTypeMapping = inferredTypeMapping; + } + break; + + default: + throw new InvalidOperationException("Incorrect OperatorType for MySQLBinaryExpression"); + } + + return new MySQLBinaryExpression( + sqlBinaryExpression.OperatorType, + ApplyTypeMapping(left, inferredTypeMapping), + ApplyTypeMapping(right, inferredTypeMapping), + resultType, + resultTypeMapping); + } + + private SqlExpression ApplyTypeMappingOnMatch(MySQLMatchExpression matchExpression) + { + var inferredTypeMapping = ExpressionExtensions.InferTypeMapping(matchExpression.Match) ?? + _typeMappingSource.FindMapping(matchExpression.Match.Type); + + return new MySQLMatchExpression( + ApplyTypeMapping(matchExpression.Match, inferredTypeMapping), + ApplyTypeMapping(matchExpression.Against, inferredTypeMapping), + matchExpression.SearchMode, + _boolTypeMapping!); + } + } +} diff --git a/EFCore/src/Query/Internal/MySQLSqlNullabilityProcessor.cs b/EFCore/src/Query/Internal/MySQLSqlNullabilityProcessor.cs new file mode 100644 index 000000000..351fba69f --- /dev/null +++ b/EFCore/src/Query/Internal/MySQLSqlNullabilityProcessor.cs @@ -0,0 +1,141 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using MySql.EntityFrameworkCore.Query.Expressions.Internal; +using MySql.EntityFrameworkCore.Utils; + +namespace MySql.EntityFrameworkCore.Query.Internal +{ + internal class MySQLSqlNullabilityProcessor : SqlNullabilityProcessor + { + private readonly ISqlExpressionFactory _sqlExpressionFactory; + + +#if !NET9_0_OR_GREATER + /// + /// Creates a new instance of the . + /// + /// Parameter object containing dependencies for this class. + /// A bool value indicating whether relational null semantics are in use. + public MySQLSqlNullabilityProcessor( + RelationalParameterBasedSqlProcessorDependencies dependencies, + bool useRelationalNulls) + : base(dependencies, useRelationalNulls) + => _sqlExpressionFactory = dependencies.SqlExpressionFactory; +#else + /// + /// Creates a new instance of the . + /// + /// Parameter object containing dependencies for this class. + /// Parameter object containing parameters for this class. + public MySQLSqlNullabilityProcessor( + RelationalParameterBasedSqlProcessorDependencies dependencies, + RelationalParameterBasedSqlProcessorParameters parameters) + : base(dependencies, parameters) + => _sqlExpressionFactory = dependencies.SqlExpressionFactory; +#endif + /// + protected override SqlExpression VisitCustomSqlExpression( + SqlExpression sqlExpression, bool allowOptimizedExpansion, out bool nullable) + => sqlExpression switch + { + MySQLBinaryExpression binaryExpression => VisitBinary(binaryExpression, allowOptimizedExpansion, out nullable), + MySQLCollateExpression collateExpression => VisitCollate(collateExpression, allowOptimizedExpansion, out nullable), + MySQLComplexFunctionArgumentExpression complexFunctionArgumentExpression => VisitComplexFunctionArgument(complexFunctionArgumentExpression, allowOptimizedExpansion, out nullable), + _ => base.VisitCustomSqlExpression(sqlExpression, allowOptimizedExpansion, out nullable) + }; + + /// + /// Visits a and computes its nullability. + /// + /// A expression to visit. + /// A bool value indicating if optimized expansion which considers null value as false value is allowed. + /// A bool value indicating whether the sql expression is nullable. + /// An optimized sql expression. + protected virtual SqlExpression VisitBinary( + MySQLBinaryExpression binaryExpression, + bool allowOptimizedExpansion, + out bool nullable) + { + Check.NotNull(binaryExpression, nameof(binaryExpression)); + + var left = Visit(binaryExpression.Left, allowOptimizedExpansion, out var leftNullable); + var right = Visit(binaryExpression.Right, allowOptimizedExpansion, out var rightNullable); + + nullable = leftNullable || rightNullable; + + return binaryExpression.Update(left, right); + } + + /// + /// Visits a and computes its nullability. + /// + /// A expression to visit. + /// A bool value indicating if optimized expansion which considers null value as false value is allowed. + /// A bool value indicating whether the sql expression is nullable. + /// An optimized sql expression. + protected virtual SqlExpression VisitCollate( + MySQLCollateExpression collateExpression, + bool allowOptimizedExpansion, + out bool nullable) + { + Check.NotNull(collateExpression, nameof(collateExpression)); + + var valueExpression = Visit(collateExpression.ValueExpression, allowOptimizedExpansion, out nullable); + + return collateExpression.Update(valueExpression); + } + + /// + /// Visits a and computes its nullability. + /// + /// A expression to visit. + /// A bool value indicating if optimized expansion which considers null value as false value is allowed. + /// A bool value indicating whether the sql expression is nullable. + /// An optimized sql expression. + protected virtual SqlExpression VisitComplexFunctionArgument( + MySQLComplexFunctionArgumentExpression complexFunctionArgumentExpression, + bool allowOptimizedExpansion, + out bool nullable) + { + Check.NotNull(complexFunctionArgumentExpression, nameof(complexFunctionArgumentExpression)); + nullable = false; + var argumentParts = new SqlExpression[complexFunctionArgumentExpression.ArgumentParts.Count]; + + for (var i = 0; i < argumentParts.Length; i++) + { + argumentParts[i] = Visit(complexFunctionArgumentExpression.ArgumentParts[i], allowOptimizedExpansion, out var argumentPartNullable); + nullable |= argumentPartNullable; + } + + return complexFunctionArgumentExpression.Update(argumentParts, complexFunctionArgumentExpression.Delimiter); + } + } +} diff --git a/EFCore/src/Query/Internal/MySQLSqlTranslatingExpressionVisitor.cs b/EFCore/src/Query/Internal/MySQLSqlTranslatingExpressionVisitor.cs new file mode 100644 index 000000000..6ee7e7c35 --- /dev/null +++ b/EFCore/src/Query/Internal/MySQLSqlTranslatingExpressionVisitor.cs @@ -0,0 +1,125 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using System; +using System.Linq.Expressions; + +namespace MySql.EntityFrameworkCore.Query.Internal +{ + internal class MySQLSqlTranslatingExpressionVisitor : RelationalSqlTranslatingExpressionVisitor + { + private readonly ISqlExpressionFactory _sqlExpressionFactory; + + public MySQLSqlTranslatingExpressionVisitor( + RelationalSqlTranslatingExpressionVisitorDependencies dependencies, + QueryCompilationContext model, + QueryableMethodTranslatingExpressionVisitor queryableMethodTranslatingExpressionVisitor) + : base(dependencies, model, queryableMethodTranslatingExpressionVisitor) + { + _sqlExpressionFactory = dependencies.SqlExpressionFactory; + } + + protected override Expression VisitBinary(BinaryExpression binaryExpression) + { + if (binaryExpression.NodeType == ExpressionType.ArrayIndex) + { + if (binaryExpression.Left.Type == typeof(byte[])) + { + if (Visit(binaryExpression.Left) is SqlExpression leftSql && + Visit(binaryExpression.Right) is SqlExpression rightSql) + { + return _sqlExpressionFactory.Function( + "ASCII", + new[] + { + _sqlExpressionFactory.Function( + "SUBSTRING", + new[] + { + leftSql, Dependencies.SqlExpressionFactory.Add( + Dependencies.SqlExpressionFactory.ApplyDefaultTypeMapping(rightSql), + Dependencies.SqlExpressionFactory.Constant(1)), + Dependencies.SqlExpressionFactory.Constant(1) + }, + nullable: true, + argumentsPropagateNullability: new[] { true, true, true }, + typeof(byte[])) + }, + nullable: true, + argumentsPropagateNullability: new[] { true, true, true }, + typeof(byte)); + } + } + } + + if (binaryExpression.NodeType == ExpressionType.Subtract && + Visit(binaryExpression.Left) is SqlExpression subtractLeftVisited && + Visit(binaryExpression.Right) is SqlExpression subtractRightVisited && + (subtractLeftVisited.Type == typeof(TimeOnly) && subtractRightVisited.Type == typeof(TimeOnly))) + { + return _sqlExpressionFactory.Subtract( + subtractLeftVisited, + subtractRightVisited, + Dependencies.TypeMappingSource.FindMapping(typeof(TimeSpan))); + } + + return base.VisitBinary(binaryExpression); + } + + protected override Expression VisitUnary(UnaryExpression unaryExpression) + { + if (unaryExpression.NodeType == ExpressionType.ArrayLength + && unaryExpression.Operand.Type == typeof(byte[])) + { + if (!(base.Visit(unaryExpression.Operand) is SqlExpression sqlExpression)) + { + return QueryCompilationContext.NotTranslatedExpression; + } + + var isBinaryMaxDataType = GetProviderType(sqlExpression) == "varbinary(max)" || sqlExpression is SqlParameterExpression; + var dataLengthSqlFunction = Dependencies.SqlExpressionFactory.Function( + "LENGTH", + new[] { sqlExpression }, + nullable: true, + argumentsPropagateNullability: new[] { true }, + isBinaryMaxDataType ? typeof(long) : typeof(int)); + + return isBinaryMaxDataType + ? Dependencies.SqlExpressionFactory.Convert(dataLengthSqlFunction, typeof(int)) + : dataLengthSqlFunction; + } + + return base.VisitUnary(unaryExpression); + } + + private static string? GetProviderType(SqlExpression expression) + => expression.TypeMapping?.StoreType; + } +} diff --git a/EFCore/src/Query/Internal/MySQLSqlTranslatingExpressionVisitorFactory.cs b/EFCore/src/Query/Internal/MySQLSqlTranslatingExpressionVisitorFactory.cs new file mode 100644 index 000000000..7e476ba9d --- /dev/null +++ b/EFCore/src/Query/Internal/MySQLSqlTranslatingExpressionVisitorFactory.cs @@ -0,0 +1,51 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Query; + +namespace MySql.EntityFrameworkCore.Query.Internal +{ + internal class MySQLSqlTranslatingExpressionVisitorFactory : IRelationalSqlTranslatingExpressionVisitorFactory + { + private readonly RelationalSqlTranslatingExpressionVisitorDependencies _dependencies; + + public MySQLSqlTranslatingExpressionVisitorFactory( + [NotNull] RelationalSqlTranslatingExpressionVisitorDependencies dependencies) + { + _dependencies = dependencies; + } + + public virtual RelationalSqlTranslatingExpressionVisitor Create( + QueryCompilationContext model, + QueryableMethodTranslatingExpressionVisitor queryableMethodTranslatingExpressionVisitor) + => new MySQLSqlTranslatingExpressionVisitor( + _dependencies, + (MySQLQueryCompilationContext)model, + queryableMethodTranslatingExpressionVisitor); + } +} diff --git a/EFCore/src/Query/Internal/MySQLStringMemberTranslator.cs b/EFCore/src/Query/Internal/MySQLStringMemberTranslator.cs new file mode 100644 index 000000000..1dee350d7 --- /dev/null +++ b/EFCore/src/Query/Internal/MySQLStringMemberTranslator.cs @@ -0,0 +1,64 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using System; +using System.Reflection; +using static MySql.EntityFrameworkCore.Utils.Statics; + +namespace MySql.EntityFrameworkCore.Query.Internal +{ + internal class MySQLStringMemberTranslator : IMemberTranslator + { + private readonly ISqlExpressionFactory _sqlExpressionFactory; + + public MySQLStringMemberTranslator(ISqlExpressionFactory sqlExpressionFactory) + { + _sqlExpressionFactory = sqlExpressionFactory; + } + + public virtual SqlExpression? Translate(SqlExpression? instance, MemberInfo member, Type returnType, IDiagnosticsLogger logger) + { + if (member.Name == nameof(string.Length) + && instance?.Type == typeof(string)) + { + return _sqlExpressionFactory.Function( + "CHAR_LENGTH", + new[] { instance }, + nullable: true, + argumentsPropagateNullability: TrueArrays[1], + returnType); + } + + return null; + } + } +} diff --git a/EFCore/src/Query/Internal/MySQLStringMethodTranslator.cs b/EFCore/src/Query/Internal/MySQLStringMethodTranslator.cs new file mode 100644 index 000000000..c3697e56c --- /dev/null +++ b/EFCore/src/Query/Internal/MySQLStringMethodTranslator.cs @@ -0,0 +1,293 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using MySql.EntityFrameworkCore.Query.Expressions.Internal; +using System; +using System.Collections.Generic; +using System.Reflection; + +namespace MySql.EntityFrameworkCore.Query.Internal +{ + internal class MySQLStringMethodTranslator : IMethodCallTranslator + { + private static readonly MethodInfo _indexOfMethodInfo + = typeof(string).GetRuntimeMethod(nameof(string.IndexOf), new[] { typeof(string) })!; + private static readonly MethodInfo _replaceMethodInfo + = typeof(string).GetRuntimeMethod(nameof(string.Replace), new[] { typeof(string), typeof(string) })!; + private static readonly MethodInfo _toLowerMethodInfo + = typeof(string).GetRuntimeMethod(nameof(string.ToLower), Array.Empty())!; + private static readonly MethodInfo _toUpperMethodInfo + = typeof(string).GetRuntimeMethod(nameof(string.ToUpper), Array.Empty())!; + private static readonly MethodInfo _substringMethodInfo + = typeof(string).GetRuntimeMethod(nameof(string.Substring), new[] { typeof(int), typeof(int) })!; + private static readonly MethodInfo _isNullOrWhiteSpaceMethodInfo + = typeof(string).GetRuntimeMethod(nameof(string.IsNullOrWhiteSpace), new[] { typeof(string) })!; + private static readonly MethodInfo _trimStartMethodInfoWithoutArgs + = typeof(string).GetRuntimeMethod(nameof(string.TrimStart), Array.Empty())!; + private static readonly MethodInfo _trimStartMethodInfoWithCharArg + = typeof(string).GetRuntimeMethod(nameof(string.TrimStart), new[] { typeof(char) })!; + private static readonly MethodInfo _trimEndMethodInfoWithoutArgs + = typeof(string).GetRuntimeMethod(nameof(string.TrimEnd), Array.Empty())!; + private static readonly MethodInfo _trimEndMethodInfoWithCharArg + = typeof(string).GetRuntimeMethod(nameof(string.TrimEnd), new[] { typeof(char) })!; + private static readonly MethodInfo _trimMethodInfoWithoutArgs + = typeof(string).GetRuntimeMethod(nameof(string.Trim), Array.Empty())!; + private static readonly MethodInfo _trimMethodInfoWithCharArg + = typeof(string).GetRuntimeMethod(nameof(string.Trim), new[] { typeof(char) })!; + private static readonly MethodInfo _trimStartMethodInfoWithCharArrayArg + = typeof(string).GetRuntimeMethod(nameof(string.TrimStart), new[] { typeof(char[]) })!; + private static readonly MethodInfo _trimEndMethodInfoWithCharArrayArg + = typeof(string).GetRuntimeMethod(nameof(string.TrimEnd), new[] { typeof(char[]) })!; + private static readonly MethodInfo _trimMethodInfoWithCharArrayArg + = typeof(string).GetRuntimeMethod(nameof(string.Trim), new[] { typeof(char[]) })!; + private static readonly MethodInfo _startsWithMethodInfo + = typeof(string).GetRuntimeMethod(nameof(string.StartsWith), new[] { typeof(string) })!; + private static readonly MethodInfo _containsMethodInfo + = typeof(string).GetRuntimeMethod(nameof(string.Contains), new[] { typeof(string) })!; + private static readonly MethodInfo _endsWithMethodInfo + = typeof(string).GetRuntimeMethod(nameof(string.EndsWith), new[] { typeof(string) })!; + private static readonly MethodInfo _padLeftWithOneArg + = typeof(string).GetRuntimeMethod(nameof(string.PadLeft), new[] { typeof(int) })!; + private static readonly MethodInfo _padRightWithOneArg + = typeof(string).GetRuntimeMethod(nameof(string.PadRight), new[] { typeof(int) })!; + private static readonly MethodInfo _padLeftWithTwoArgs + = typeof(string).GetRuntimeMethod(nameof(string.PadLeft), new[] { typeof(int), typeof(char) })!; + private static readonly MethodInfo _padRightWithTwoArgs + = typeof(string).GetRuntimeMethod(nameof(string.PadRight), new[] { typeof(int), typeof(char) })!; + + private readonly MySQLSqlExpressionFactory _sqlExpressionFactory; + + public MySQLStringMethodTranslator(ISqlExpressionFactory sqlExpressionFactory) + { + _sqlExpressionFactory = (MySQLSqlExpressionFactory)sqlExpressionFactory; + } + + public virtual SqlExpression? Translate(SqlExpression? instance, MethodInfo method, IReadOnlyList arguments, IDiagnosticsLogger logger) + { + if (_indexOfMethodInfo.Equals(method)) + { + return new MySQLStringComparisonMethodTranslator(_sqlExpressionFactory) + .MakeIndexOfExpression(instance, arguments[0]); + } + + if (_replaceMethodInfo.Equals(method)) + { + var stringTypeMapping = ExpressionExtensions.InferTypeMapping(instance!, arguments[0], arguments[1]); + + return _sqlExpressionFactory.NullableFunction( + "REPLACE", + new[] + { + _sqlExpressionFactory.ApplyTypeMapping(instance!, stringTypeMapping), + _sqlExpressionFactory.ApplyTypeMapping(arguments[0], stringTypeMapping), + _sqlExpressionFactory.ApplyTypeMapping(arguments[1], stringTypeMapping) + }, + method.ReturnType, + stringTypeMapping); + } + + if (_toLowerMethodInfo.Equals(method) + || _toUpperMethodInfo.Equals(method)) + { + return _sqlExpressionFactory.NullableFunction( + _toLowerMethodInfo.Equals(method) ? "LOWER" : "UPPER", + new[] { instance! }, + method.ReturnType, + instance!.TypeMapping); + } + + if (_substringMethodInfo.Equals(method)) + { + return _sqlExpressionFactory.NullableFunction( + "SUBSTRING", + new[] + { + instance!, + _sqlExpressionFactory.Add( + arguments[0], + _sqlExpressionFactory.Constant(1)), + arguments[1] + }, + method.ReturnType, + instance!.TypeMapping); + } + + if (_isNullOrWhiteSpaceMethodInfo.Equals(method)) + { + return _sqlExpressionFactory.OrElse( + _sqlExpressionFactory.IsNull(arguments[0]), + _sqlExpressionFactory.Equal( + ProcessTrimMethod(arguments[0], null, null), + _sqlExpressionFactory.Constant(string.Empty))); + } + + if (_trimStartMethodInfoWithoutArgs?.Equals(method) == true + || _trimStartMethodInfoWithCharArg?.Equals(method) == true + || _trimStartMethodInfoWithCharArrayArg.Equals(method)) + { + return ProcessTrimMethod(instance!, arguments.Count > 0 ? arguments[0] : null, "LEADING"); + } + + if (_trimEndMethodInfoWithoutArgs?.Equals(method) == true + || _trimEndMethodInfoWithCharArg?.Equals(method) == true + || _trimEndMethodInfoWithCharArrayArg.Equals(method)) + { + return ProcessTrimMethod(instance!, arguments.Count > 0 ? arguments[0] : null, "TRAILING"); + } + + if (_trimMethodInfoWithoutArgs?.Equals(method) == true + || _trimMethodInfoWithCharArg?.Equals(method) == true + || _trimMethodInfoWithCharArrayArg.Equals(method)) + { + return ProcessTrimMethod(instance!, arguments.Count > 0 ? arguments[0] : null, null); + } + + if (_containsMethodInfo.Equals(method)) + { + return new MySQLStringComparisonMethodTranslator(_sqlExpressionFactory) + .MakeContainsExpression(instance!, arguments[0]); + } + + if (_startsWithMethodInfo.Equals(method)) + { + return new MySQLStringComparisonMethodTranslator(_sqlExpressionFactory) + .MakeStartsWithExpression(instance!, arguments[0], _sqlExpressionFactory.Constant(StringComparison.CurrentCulture)); + } + + if (_endsWithMethodInfo.Equals(method)) + { + return new MySQLStringComparisonMethodTranslator(_sqlExpressionFactory) + .MakeEndsWithExpression(instance!, arguments[0], _sqlExpressionFactory.Constant(StringComparison.CurrentCulture)); + } + + if (_padLeftWithOneArg.Equals(method)) + { + return TranslatePadLeftRight( + true, + instance!, + arguments[0], + _sqlExpressionFactory.Constant(" "), + method.ReturnType); + } + + if (_padRightWithOneArg.Equals(method)) + { + return TranslatePadLeftRight( + false, + instance!, + arguments[0], + _sqlExpressionFactory.Constant(" "), + method.ReturnType); + } + + if (_padLeftWithTwoArgs.Equals(method)) + { + return TranslatePadLeftRight( + true, + instance!, + arguments[0], + arguments[1], + method.ReturnType); + } + + if (_padRightWithTwoArgs.Equals(method)) + { + return TranslatePadLeftRight( + false, + instance!, + arguments[0], + arguments[1], + method.ReturnType); + } + + return null; + } + + private SqlExpression? TranslatePadLeftRight(bool leftPad, SqlExpression instance, SqlExpression length, SqlExpression padString, Type returnType) + => length is SqlConstantExpression && padString is SqlConstantExpression + ? _sqlExpressionFactory.NullableFunction( + leftPad ? "LPAD" : "RPAD", + new[] { + instance, + length, + padString + }, + returnType, + false) + : null; + + private SqlExpression ProcessTrimMethod(SqlExpression instance, SqlExpression? trimChar, string? locationSpecifier) + { + // Builds a TRIM({BOTH | LEADING | TRAILING} remstr FROM str) expression. + + var sqlArguments = new List(); + + if (locationSpecifier != null) + { + sqlArguments.Add(_sqlExpressionFactory.Fragment(locationSpecifier)); + } + + if (trimChar != null) + { + var constantValue = (trimChar as SqlConstantExpression)?.Value; + + if (constantValue is char singleChar) + { + sqlArguments.Add(_sqlExpressionFactory.Constant(singleChar)); + } + else if (constantValue is char[] charArray && charArray.Length <= 1) + { + if (charArray.Length == 1) + { + sqlArguments.Add(_sqlExpressionFactory.Constant(charArray[0])); + } + } + } + + if (sqlArguments.Count > 0) + { + sqlArguments.Add(_sqlExpressionFactory.Fragment("FROM")); + } + + sqlArguments.Add(instance); + + return _sqlExpressionFactory.NullableFunction( + "TRIM", + new[] { _sqlExpressionFactory.ComplexFunctionArgument( + sqlArguments.ToArray(), + " ", + typeof(string)), + }, + typeof(string)); + } + } +} diff --git a/EFCore/src/Query/MySQLJsonString.cs b/EFCore/src/Query/MySQLJsonString.cs new file mode 100644 index 000000000..809869338 --- /dev/null +++ b/EFCore/src/Query/MySQLJsonString.cs @@ -0,0 +1,128 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; + +namespace MySql.EntityFrameworkCore.Query +{ + /// + /// This class can be used to represent a string that contains valid JSON data. + /// To mark a string as containing JSON data, just cast the string to `MySQLJsonString`. + /// + + public sealed class MySQLJsonString : IConvertible + { + private readonly string _json; + + private MySQLJsonString(string json) + => _json = json; + + public static implicit operator string(MySQLJsonString jsonStringObject) + => jsonStringObject._json; + + public static implicit operator MySQLJsonString(string stringObject) + => new MySQLJsonString(stringObject); + + public static bool operator ==(MySQLJsonString left, MySQLJsonString right) + => left?.Equals(right) ?? ReferenceEquals(right, null); + + public static bool operator !=(MySQLJsonString left, MySQLJsonString right) + => !(left == right); + + public static bool operator ==(MySQLJsonString left, string right) + => left?.Equals(right) ?? ReferenceEquals(right, null); + + public static bool operator !=(MySQLJsonString left, string right) + => !(left == right); + + private bool Equals(MySQLJsonString other) + => _json == other._json; + + private bool Equals(string other) + => _json == other; + + public override bool Equals(object? obj) + => ReferenceEquals(this, obj) || + obj is MySQLJsonString other && Equals(other) || + obj is string otherString && Equals(otherString); + + public override int GetHashCode() + => HashCode.Combine(_json); + + public TypeCode GetTypeCode() + => TypeCode.Object; + + public bool ToBoolean(IFormatProvider? provider) + => Convert.ToBoolean(_json, provider); + + public byte ToByte(IFormatProvider? provider) + => Convert.ToByte(_json, provider); + + public char ToChar(IFormatProvider? provider) + => Convert.ToChar(_json, provider); + + public DateTime ToDateTime(IFormatProvider? provider) + => Convert.ToDateTime(_json, provider); + + public decimal ToDecimal(IFormatProvider? provider) + => Convert.ToDecimal(_json, provider); + + public double ToDouble(IFormatProvider? provider) + => Convert.ToDouble(_json, provider); + + public short ToInt16(IFormatProvider? provider) + => Convert.ToInt16(_json, provider); + + public int ToInt32(IFormatProvider? provider) + => Convert.ToInt32(_json, provider); + + public long ToInt64(IFormatProvider? provider) + => Convert.ToInt64(_json, provider); + + public sbyte ToSByte(IFormatProvider? provider) + => Convert.ToSByte(_json, provider); + + public float ToSingle(IFormatProvider? provider) + => Convert.ToSingle(_json, provider); + + public string ToString(IFormatProvider? provider) + => Convert.ToString(_json, provider); + + public object ToType(Type conversionType, IFormatProvider? provider) + => Convert.ChangeType(_json, conversionType, provider); + + public ushort ToUInt16(IFormatProvider? provider) + => Convert.ToUInt16(_json, provider); + + public uint ToUInt32(IFormatProvider? provider) + => Convert.ToUInt32(_json, provider); + + public ulong ToUInt64(IFormatProvider? provider) + => Convert.ToUInt64(_json, provider); + } +} diff --git a/EFCore/src/Query/Sql/Internal/MySQLQueryGeneratorFactory.cs b/EFCore/src/Query/Sql/Internal/MySQLQueryGeneratorFactory.cs new file mode 100644 index 000000000..75844a37e --- /dev/null +++ b/EFCore/src/Query/Sql/Internal/MySQLQueryGeneratorFactory.cs @@ -0,0 +1,48 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Query; + +namespace MySql.EntityFrameworkCore.Query +{ + /// + /// Implementation for QuerySqlGeneratorFactoryBase + /// + internal class MySQLQueryGeneratorFactory : IQuerySqlGeneratorFactory + { + private readonly QuerySqlGeneratorDependencies _dependencies; + + public MySQLQueryGeneratorFactory(QuerySqlGeneratorDependencies dependencies) + { + _dependencies = dependencies; + } + + public QuerySqlGenerator Create() + => new MySQLQuerySqlGenerator(_dependencies); + } +} diff --git a/EFCore/src/Query/Sql/Internal/MySQLQuerySqlGenerator.cs b/EFCore/src/Query/Sql/Internal/MySQLQuerySqlGenerator.cs new file mode 100644 index 000000000..e986d1f97 --- /dev/null +++ b/EFCore/src/Query/Sql/Internal/MySQLQuerySqlGenerator.cs @@ -0,0 +1,424 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Query; +using Microsoft.EntityFrameworkCore.Query.SqlExpressions; +using Microsoft.EntityFrameworkCore.Storage; +using MySql.EntityFrameworkCore.Extensions; +using MySql.EntityFrameworkCore.Query.Expressions.Internal; +using MySql.EntityFrameworkCore.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; + +namespace MySql.EntityFrameworkCore.Query +{ + internal class MySQLQuerySqlGenerator : QuerySqlGenerator + { + private const ulong LimitUpperBound = 18446744073709551610; + private static readonly Dictionary _castMappings = new Dictionary + { + { "signed", new []{ "tinyint", "smallint", "mediumint", "int", "bigint", "bit" }}, + { "decimal(65,30)", new []{ "decimal" } }, + { "double", new []{ "double" } }, + { "float", new []{ "float" } }, + { "binary", new []{ "binary", "varbinary", "tinyblob", "blob", "mediumblob", "longblob" } }, + { "datetime(6)", new []{ "datetime(6)" } }, + { "datetime", new []{ "datetime" } }, + { "date", new []{ "date" } }, + { "timestamp(6)", new []{ "timestamp(6)" } }, + { "timestamp", new []{ "timestamp" } }, + { "time(6)", new []{ "time(6)" } }, + { "time", new []{ "time" } }, + { "json", new []{ "json" } }, + { "char", new []{ "char", "varchar", "text", "tinytext", "mediumtext", "longtext" } }, + { "nchar", new []{ "nchar", "nvarchar" } }, + }; + + public MySQLQuerySqlGenerator([NotNull] QuerySqlGeneratorDependencies dependencies) + : base(dependencies) + { + } + + protected override Expression VisitExtension(Expression extensionExpression) + => extensionExpression switch + { + MySQLJsonTraversalExpression jsonTraversalExpression => VisitJsonPathTraversal(jsonTraversalExpression), + MySQLColumnAliasReferenceExpression columnAliasReferenceExpression => VisitColumnAliasReference(columnAliasReferenceExpression), + _ => base.VisitExtension(extensionExpression) + }; + + private Expression VisitColumnAliasReference(MySQLColumnAliasReferenceExpression columnAliasReferenceExpression) + { + Sql.Append(Dependencies.SqlGenerationHelper.DelimitIdentifier(columnAliasReferenceExpression.Alias)); + return columnAliasReferenceExpression; + } + + protected virtual Expression VisitJsonPathTraversal(MySQLJsonTraversalExpression expression) + { + // If the path contains parameters, then the -> and ->> aliases are not supported by MySQL, because + // we need to concatenate the path and the parameters. + // We will use JSON_EXTRACT (and JSON_UNQUOTE if needed) only in this case, because the aliases + // are much more readable. + var isSimplePath = expression.Path.All( + l => l is SqlConstantExpression || + l is MySQLJsonArrayIndexExpression e && e.Expression is SqlConstantExpression); + + if (expression.ReturnsText) + Sql.Append("JSON_UNQUOTE("); + + if (expression.Path.Count > 0) + Sql.Append("JSON_EXTRACT("); + + Visit(expression.Expression); + + if (expression.Path.Count > 0) + { + Sql.Append(", "); + + if (!isSimplePath) + Sql.Append("CONCAT("); + + Sql.Append("'$"); + + foreach (var location in expression.Path) + { + if (location is MySQLJsonArrayIndexExpression arrayIndexExpression) + { + var isConstantExpression = arrayIndexExpression.Expression is SqlConstantExpression; + + Sql.Append("["); + + if (!isConstantExpression) + Sql.Append("', "); + + Visit(arrayIndexExpression.Expression); + + if (!isConstantExpression) + Sql.Append(", '"); + + Sql.Append("]"); + } + else + { + Sql.Append("."); + Visit(location); + } + } + + Sql.Append("'"); + + if (!isSimplePath) + Sql.Append(")"); + + Sql.Append(")"); + } + + if (expression.ReturnsText) + Sql.Append(")"); + + return expression; + } + + protected override Expression VisitSqlFunction(SqlFunctionExpression sqlFunctionExpression) + { + if (sqlFunctionExpression.Name.StartsWith("@@", StringComparison.Ordinal)) + { + Sql.Append(sqlFunctionExpression.Name); + + return sqlFunctionExpression; + } + + return base.VisitSqlFunction(sqlFunctionExpression); + } + + public virtual Expression VisitMySqlMatch(MySQLMatchExpression mySqlMatchExpression) + { + Check.NotNull(mySqlMatchExpression, nameof(mySqlMatchExpression)); + + Sql.Append("MATCH "); + Sql.Append("("); + Visit(mySqlMatchExpression.Match); + Sql.Append(")"); + Sql.Append(" AGAINST "); + Sql.Append("("); + Visit(mySqlMatchExpression.Against); + + switch (mySqlMatchExpression.SearchMode) + { + case MySQLMatchSearchMode.NaturalLanguage: + break; + case MySQLMatchSearchMode.NaturalLanguageWithQueryExpansion: + Sql.Append(" WITH QUERY EXPANSION"); + break; + case MySQLMatchSearchMode.Boolean: + Sql.Append(" IN BOOLEAN MODE"); + break; + } + + Sql.Append(")"); + + return mySqlMatchExpression; + } + + protected override Expression VisitSqlBinary(SqlBinaryExpression sqlBinaryExpression) + { + Check.NotNull(sqlBinaryExpression, nameof(sqlBinaryExpression)); + + if (sqlBinaryExpression.OperatorType == ExpressionType.Add && + sqlBinaryExpression.Type == typeof(string) && + sqlBinaryExpression.Left.TypeMapping?.ClrType == typeof(string) && + sqlBinaryExpression.Right.TypeMapping?.ClrType == typeof(string)) + { + Sql.Append("CONCAT("); + Visit(sqlBinaryExpression.Left); + Sql.Append(", "); + Visit(sqlBinaryExpression.Right); + Sql.Append(")"); + + return sqlBinaryExpression; + } + + var requiresBrackets = RequiresBrackets(sqlBinaryExpression.Left); + + if (requiresBrackets) + { + Sql.Append("("); + } + + Visit(sqlBinaryExpression.Left); + + if (requiresBrackets) + { + Sql.Append(")"); + } + + Sql.Append(GetOperator(sqlBinaryExpression)); + + requiresBrackets = RequiresBrackets(sqlBinaryExpression.Right) || + !requiresBrackets && + sqlBinaryExpression.Right is SqlUnaryExpression sqlUnaryExpression && + (sqlUnaryExpression.OperatorType == ExpressionType.Equal || sqlUnaryExpression.OperatorType == ExpressionType.NotEqual); + + if (requiresBrackets) + { + Sql.Append("("); + } + + Visit(sqlBinaryExpression.Right); + + if (requiresBrackets) + { + Sql.Append(")"); + } + + return sqlBinaryExpression; + } + + private SqlUnaryExpression VisitConvert(SqlUnaryExpression sqlUnaryExpression) + { + var castMapping = GetCastStoreType(sqlUnaryExpression.TypeMapping!); + + if (castMapping == "binary") + { + Sql.Append("UNHEX(HEX("); + Visit(sqlUnaryExpression.Operand); + Sql.Append("))"); + return sqlUnaryExpression; + } + + var sameInnerCastStoreType = sqlUnaryExpression.Operand is SqlUnaryExpression operandUnary && + operandUnary.OperatorType == ExpressionType.Convert && + castMapping.Equals(GetCastStoreType(operandUnary.TypeMapping!), StringComparison.OrdinalIgnoreCase); + + Visit(sqlUnaryExpression.Operand); + + return sqlUnaryExpression; + } + + public virtual Expression VisitMySqlRegexp(MySQLRegexpExpression mySqlRegexpExpression) + { + Check.NotNull(mySqlRegexpExpression, nameof(mySqlRegexpExpression)); + + Visit(mySqlRegexpExpression.Match); + Sql.Append(" REGEXP "); + Visit(mySqlRegexpExpression.Pattern); + + return mySqlRegexpExpression; + } + + private static bool RequiresBrackets(SqlExpression expression) + => expression is SqlBinaryExpression || + expression is LikeExpression; + + protected override Expression VisitSqlUnary(SqlUnaryExpression sqlUnaryExpression) + => sqlUnaryExpression.OperatorType == ExpressionType.Convert + ? VisitConvert(sqlUnaryExpression) + : base.VisitSqlUnary(sqlUnaryExpression); + + private string GetCastStoreType(RelationalTypeMapping typeMapping) + { + var storeTypeLower = typeMapping.StoreType.ToLower(); + string? castMapping = null; + foreach (var kvp in _castMappings) + { + foreach (var storeType in kvp.Value) + { + if (storeTypeLower.StartsWith(storeType)) + { + castMapping = kvp.Key; + break; + } + } + + if (castMapping != null) + { + break; + } + } + + if (castMapping == null) + throw new InvalidOperationException($"Invalid cast '{typeMapping.StoreType}'"); + + if (castMapping == "signed" && storeTypeLower.Contains("unsigned")) + { + castMapping = "unsigned"; + } + + return castMapping; + } + + protected override void GenerateLimitOffset([NotNull] SelectExpression selectExpression) + { + Check.NotNull(selectExpression, nameof(selectExpression)); + + if (selectExpression.Limit != null) + { + Sql.AppendLine().Append("LIMIT "); + Visit(selectExpression.Limit); + } + + if (selectExpression.Offset != null) + { + if (selectExpression.Limit == null) + { + // if we want to use Skip() without Take() we have to define the upper limit of LIMIT + Sql.AppendLine().Append("LIMIT ").Append(LimitUpperBound.ToString()); + } + + Sql.Append(" OFFSET "); + Visit(selectExpression.Offset); + } + } + + public Expression VisitMySQLComplexFunctionArgumentExpression(MySQLComplexFunctionArgumentExpression mySqlComplexFunctionArgumentExpression) + { + Check.NotNull(mySqlComplexFunctionArgumentExpression, nameof(mySqlComplexFunctionArgumentExpression)); + + var first = true; + foreach (var argument in mySqlComplexFunctionArgumentExpression.ArgumentParts) + { + if (first) + { + first = false; + } + else + { + Sql.Append(" "); + } + + Visit(argument); + } + + return mySqlComplexFunctionArgumentExpression; + } + + public Expression VisitMySQLBinaryExpression(MySQLBinaryExpression mySqlBinaryExpression) + { + Sql.Append("("); + Visit(mySqlBinaryExpression.Left); + Sql.Append(")"); + + switch (mySqlBinaryExpression.OperatorType) + { + case MySQLBinaryExpressionOperatorType.IntegerDivision: + Sql.Append(" DIV "); + break; + + default: + throw new ArgumentOutOfRangeException(); + } + + Sql.Append("("); + Visit(mySqlBinaryExpression.Right); + Sql.Append(")"); + + return mySqlBinaryExpression; + } + + public Expression VisitMySQLCollateExpression(MySQLCollateExpression mySqlCollateExpression) + { + Check.NotNull(mySqlCollateExpression, nameof(mySqlCollateExpression)); + + Sql.Append("CONVERT("); + + Visit(mySqlCollateExpression.ValueExpression); + + Sql.Append($" USING {mySqlCollateExpression.Charset}) COLLATE {mySqlCollateExpression.Collation}"); + + return mySqlCollateExpression; + } + + protected override Expression VisitCrossApply(CrossApplyExpression crossApplyExpression) + { + Sql.Append("JOIN "); + + if (crossApplyExpression.Table is not TableExpression) + Sql.Append("LATERAL "); + + Visit(crossApplyExpression.Table); + Sql.Append(" ON TRUE"); + + return crossApplyExpression; + } + + protected override Expression VisitOuterApply(OuterApplyExpression outerApplyExpression) + { + Sql.Append("LEFT JOIN "); + + if (outerApplyExpression.Table is not TableExpression) + Sql.Append("LATERAL "); + + Visit(outerApplyExpression.Table); + Sql.Append(" ON TRUE"); + + return outerApplyExpression; + } + } +} diff --git a/EFCore/src/Scaffolding/Internal/MySQLCodeGenerator.cs b/EFCore/src/Scaffolding/Internal/MySQLCodeGenerator.cs new file mode 100644 index 000000000..51b081e41 --- /dev/null +++ b/EFCore/src/Scaffolding/Internal/MySQLCodeGenerator.cs @@ -0,0 +1,58 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; +using Microsoft.EntityFrameworkCore.Scaffolding; +using MySql.EntityFrameworkCore.Infrastructure; +using System; +using System.Reflection; + +namespace MySql.EntityFrameworkCore.Scaffolding.Internal +{ + internal class MySQLCodeGenerator : ProviderCodeGenerator + { + private static readonly MethodInfo UseMySqlServerMethodInfo + = typeof(MySQLDbContextOptionsExtensions).GetRuntimeMethod( + nameof(MySQLDbContextOptionsExtensions.UseMySQL), + new[] { typeof(DbContextOptionsBuilder), typeof(string), typeof(Action) })!; + + public MySQLCodeGenerator( + [NotNull] ProviderCodeGeneratorDependencies dependencies) + : base(dependencies) + { + } + + /// + public override MethodCallCodeFragment GenerateUseProvider(string connectionString, MethodCallCodeFragment? providerOptions) + => new(UseMySqlServerMethodInfo, + providerOptions == null + ? new object[] { connectionString } + : new object[] { connectionString, new NestedClosureCodeFragment("x", providerOptions) }); + } +} diff --git a/EFCore/src/Scaffolding/Internal/MySQLDataReaderExtension.cs b/EFCore/src/Scaffolding/Internal/MySQLDataReaderExtension.cs new file mode 100644 index 000000000..a68236874 --- /dev/null +++ b/EFCore/src/Scaffolding/Internal/MySQLDataReaderExtension.cs @@ -0,0 +1,51 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Data.Common; + +namespace MySql.EntityFrameworkCore.Scaffolding.Internal +{ + internal static class MySQLDataReaderExtension + { + public static T? GetValueOrDefault([NotNull] this DbDataReader reader, [NotNull] string name) + { + var idx = reader.GetOrdinal(name); + return reader.IsDBNull(idx) + ? default + : reader.GetFieldValue(idx); + } + + public static T? GetValueOrDefault(this DbDataRecord record, string name) + { + var idx = record.GetOrdinal(name); + return record.IsDBNull(idx) + ? default + : (T)record.GetValue(idx); + } + } +} diff --git a/EFCore/src/Scaffolding/Internal/MySQLDatabaseModelFactory.cs b/EFCore/src/Scaffolding/Internal/MySQLDatabaseModelFactory.cs new file mode 100644 index 000000000..9818f28dc --- /dev/null +++ b/EFCore/src/Scaffolding/Internal/MySQLDatabaseModelFactory.cs @@ -0,0 +1,663 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Scaffolding; +using Microsoft.EntityFrameworkCore.Scaffolding.Metadata; +using Microsoft.Extensions.Logging; +using MySql.Data.MySqlClient; +using MySql.EntityFrameworkCore.Infrastructure.Internal; +using MySql.EntityFrameworkCore.Internal; +using MySql.EntityFrameworkCore.Properties; +using MySql.EntityFrameworkCore.Utils; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; + +namespace MySql.EntityFrameworkCore.Scaffolding.Internal +{ + internal class MySQLDatabaseModelFactory : DatabaseModelFactory + { + private readonly IDiagnosticsLogger _logger; + private readonly IMySQLOptions _options; + + public MySQLDatabaseModelFactory([NotNull] IDiagnosticsLogger logger, IMySQLOptions options) + { + Check.NotNull(logger, nameof(logger)); + + _logger = logger; + _options = options; + } + + /// + public override DatabaseModel Create(string connectionString, DatabaseModelFactoryOptions options) + { + Check.NotEmpty(connectionString, nameof(connectionString)); + Check.NotNull(options, nameof(options)); + + using (var connection = new MySqlConnection(connectionString)) + { + return Create(connection, options); + } + } + + public override DatabaseModel Create(DbConnection connection, DatabaseModelFactoryOptions options) + { + Check.NotNull(connection, nameof(connection)); + Check.NotNull(options, nameof(options)); + + SetupMySQLOptions(connection); + + var connectionStartedOpen = connection.State == ConnectionState.Open; + if (!connectionStartedOpen) + connection.Open(); + + try + { + var databaseModel = new DatabaseModel(); + databaseModel.DatabaseName = connection.Database; + databaseModel.DefaultSchema = GetDefaultSchema(connection); + + var schemaList = options.Schemas.ToList(); + var schemaFilter = GenerateSchemaFilter(schemaList, databaseModel.DefaultSchema); + var tableList = options.Tables.ToList(); + var tableFilter = GenerateTableFilter(tableList.Select(Parse).ToList(), schemaFilter); + + var tables = GetTables(connection, tableFilter); + foreach (var table in tables) + { + table.Database = databaseModel; + databaseModel.Tables.Add(table); + } + + return databaseModel; + } + finally + { + if (!connectionStartedOpen) + { + connection.Close(); + } + } + } + + private void SetupMySQLOptions(DbConnection connection) + { + if (_options.ConnectionSettings.Equals(new MySQLOptions().ConnectionSettings)) + _options.Initialize(new DbContextOptionsBuilder() + .UseMySQL(connection).Options); + } + + private string? GetDefaultSchema(DbConnection connection) + { + using (var command = connection.CreateCommand()) + { + command.CommandText = "SELECT SCHEMA()"; + if (command.ExecuteScalar() is string schema) + return schema; + return null; + } + } + + private static (string? Schema, string Table) Parse(string table) + { + var match = _partExtractor.Match(table.Trim()); + + if (!match.Success) + { + throw new InvalidOperationException(string.Format(MySQLStrings.InvalidTableToIncludeInScaffolding, table)); + } + + var part1 = match.Groups["part1"].Value.Replace("]]", string.Empty); + var part2 = match.Groups["part2"].Value.Replace("]]", string.Empty); + + return string.IsNullOrEmpty(part2) ? (null, part1) : (part1, part2); + } + + private const string NamePartRegex + = @"(?:(?:\[(?(?:(?:\]\])|[^\]])+)\])|(?[^\.\[\]]+))"; + + private static readonly Regex _partExtractor + = new Regex( + string.Format( + CultureInfo.InvariantCulture, + @"^{0}(?:\.{1})?$", + string.Format(CultureInfo.InvariantCulture, NamePartRegex, 1), + string.Format(CultureInfo.InvariantCulture, NamePartRegex, 2)), + RegexOptions.Compiled, + TimeSpan.FromMilliseconds(1000)); + + private static Func? GenerateSchemaFilter(IReadOnlyList schemas, string? defaultSchema) + { + return schemas.Count > 0 || defaultSchema != null + ? (s => + { + var schemaFilterBuilder = new StringBuilder(); + schemaFilterBuilder.Append(s); + schemaFilterBuilder.Append(" IN ("); + if (schemas.Count > 0) + schemaFilterBuilder.Append(string.Join(", ", schemas.Select(EscapeLiteral))); + else + schemaFilterBuilder.Append(EscapeLiteral(defaultSchema!)); + schemaFilterBuilder.Append(")"); + return schemaFilterBuilder.ToString(); + }) + : null; + } + + private static Func? GenerateTableFilter(IReadOnlyList<(string? Schema, string Table)> tables, Func? schemaFilter) + { + return schemaFilter != null || tables.Count > 0 + ? ((s, t) => + { + var tableFilterBuilder = new StringBuilder(); + + var openBracket = false; + if (schemaFilter != null) + { + tableFilterBuilder + .Append("(") + .Append(schemaFilter(s)); + openBracket = true; + } + + if (tables.Count > 0) + { + if (openBracket) + { + tableFilterBuilder + .AppendLine() + .Append("AND "); + } + else + { + tableFilterBuilder.Append("("); + openBracket = true; + } + + var tablesWithoutSchema = tables.Where(e => string.IsNullOrEmpty(e.Schema)).ToList(); + if (tablesWithoutSchema.Count > 0) + { + tableFilterBuilder.Append(t); + tableFilterBuilder.Append(" IN ("); + tableFilterBuilder.Append(string.Join(", ", tablesWithoutSchema.Select(e => EscapeLiteral(e.Table)))); + tableFilterBuilder.Append(")"); + } + + var tablesWithSchema = tables.Where(e => !string.IsNullOrEmpty(e.Schema)).ToList(); + if (tablesWithSchema.Count > 0) + { + if (tablesWithoutSchema.Count > 0) + tableFilterBuilder.Append(" OR "); + + tableFilterBuilder.Append("CONCAT_WS(N'.',"); + tableFilterBuilder.Append(string.Join(",", s, t)); + tableFilterBuilder.Append(") IN ("); + tableFilterBuilder.Append(string.Join(", ", tablesWithSchema.Select(e => EscapeLiteral($"{e.Schema}.{e.Table}")))); + tableFilterBuilder.Append(")"); + } + } + + if (openBracket) + tableFilterBuilder.Append(")"); + + return tableFilterBuilder.ToString(); + }) : null; + } + + private static ReferentialAction? ConvertToReferentialAction(string deleteAction) + { + switch (deleteAction.ToUpperInvariant()) + { + case "RESTRICT": + return ReferentialAction.Restrict; + + case "CASCADE": + return ReferentialAction.Cascade; + + case "SET NULL": + return ReferentialAction.SetNull; + + case "SET DEFAULT": + return ReferentialAction.SetDefault; + + case "NO ACTION": + return ReferentialAction.NoAction; + + default: + return null; + } + } + + private const string GetTablesQuery = @"SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, + IF(TABLE_COMMENT = 'VIEW' AND TABLE_TYPE = 'VIEW', '', TABLE_COMMENT) AS TABLE_COMMENT + FROM INFORMATION_SCHEMA.TABLES + WHERE TABLE_TYPE IN ('BASE TABLE', 'VIEW') + AND {0};"; + + private const string GetPrimaryQuery = @"SELECT + `TABLE_SCHEMA`, + `TABLE_NAME`, + `INDEX_NAME`, + GROUP_CONCAT(`COLUMN_NAME` ORDER BY `SEQ_IN_INDEX` SEPARATOR ',') AS COLUMNS + FROM `INFORMATION_SCHEMA`.`STATISTICS` + WHERE {0} + AND `INDEX_NAME` = 'PRIMARY' + GROUP BY `TABLE_SCHEMA`, `TABLE_NAME`, `INDEX_NAME`, `NON_UNIQUE`;"; + + private const string GetColumnsQuery = @"SELECT + `TABLE_SCHEMA`, + `TABLE_NAME`, + `COLUMN_NAME`, + `ORDINAL_POSITION`, + `COLUMN_DEFAULT`, + `IS_NULLABLE`, + `DATA_TYPE`, + `CHARACTER_SET_NAME`, + `COLLATION_NAME`, + `COLUMN_TYPE`, + `COLUMN_COMMENT`, + `EXTRA` + FROM + `INFORMATION_SCHEMA`.`COLUMNS` + WHERE {0} + ORDER BY + `ORDINAL_POSITION`;"; + + private const string GetIndexesQuery = @"SELECT + `TABLE_SCHEMA`, + `TABLE_NAME`, + `INDEX_NAME`, + IF(`NON_UNIQUE`, 'TRUE', 'FALSE') AS NON_UNIQUE, + GROUP_CONCAT(`COLUMN_NAME` ORDER BY `SEQ_IN_INDEX` SEPARATOR ',') AS COLUMNS + FROM `INFORMATION_SCHEMA`.`STATISTICS` + WHERE {0} + AND `INDEX_NAME` <> 'PRIMARY' + GROUP BY `TABLE_SCHEMA`, `TABLE_NAME`, `INDEX_NAME`, `NON_UNIQUE`;"; + + private const string GetConstraintsQuery = @"SELECT + `TABLE_SCHEMA`, + `TABLE_NAME`, + `CONSTRAINT_NAME`, + `REFERENCED_TABLE_NAME`, + GROUP_CONCAT(CONCAT_WS('|', `COLUMN_NAME`, `REFERENCED_COLUMN_NAME`) ORDER BY `ORDINAL_POSITION` SEPARATOR ',') AS PAIRED_COLUMNS, + (SELECT `DELETE_RULE` FROM `INFORMATION_SCHEMA`.`REFERENTIAL_CONSTRAINTS` + WHERE `REFERENTIAL_CONSTRAINTS`.`CONSTRAINT_NAME` = `KEY_COLUMN_USAGE`.`CONSTRAINT_NAME` + AND `REFERENTIAL_CONSTRAINTS`.`CONSTRAINT_SCHEMA` = `KEY_COLUMN_USAGE`.`CONSTRAINT_SCHEMA`) AS `DELETE_RULE` + FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` + WHERE {0} + AND `CONSTRAINT_NAME` <> 'PRIMARY' + AND `REFERENCED_TABLE_NAME` IS NOT NULL + GROUP BY `TABLE_SCHEMA`, `TABLE_NAME`, + `CONSTRAINT_SCHEMA`, `CONSTRAINT_NAME`, + `TABLE_NAME`, `REFERENCED_TABLE_NAME`;"; + + private IEnumerable GetTables(DbConnection connection, Func? tableFilter) + { + using (var command = connection.CreateCommand()) + { + var tables = new List(); + string filter = tableFilter!("TABLE_SCHEMA", "TABLE_NAME"); + command.CommandText = string.Format(GetTablesQuery, filter); + using (var reader = command.ExecuteReader()) + { + while (reader.Read()) + { + var schema = reader.GetValueOrDefault("TABLE_SCHEMA"); + var name = reader.GetValueOrDefault("TABLE_NAME"); + var type = reader.GetValueOrDefault("TABLE_TYPE"); + var comment = reader.GetValueOrDefault("TABLE_COMMENT"); + + var table = string.Equals(type, "base table", StringComparison.OrdinalIgnoreCase) + ? new DatabaseTable() + : new DatabaseView(); + + table.Schema = schema; + table.Name = name!; + table.Comment = string.IsNullOrEmpty(comment) ? null : comment; + + tables.Add(table); + } + } + + // This is done separately due to MARS property may be turned off + GetColumns(connection, tables, filter); + GetPrimaryKeys(connection, tables, filter); + GetIndexes(connection, tables, filter); + GetConstraints(connection, tables, filter); + + return tables; + } + } + + private void GetColumns(DbConnection connection, IReadOnlyList tables, string tableFilter) + { + using (var command = connection.CreateCommand()) + { + command.CommandText = string.Format(GetColumnsQuery, tableFilter); + using (var reader = command.ExecuteReader()) + { + var tableColumnGroups = reader.Cast() + .GroupBy( + ddr => (tableSchema: ddr.GetValueOrDefault("TABLE_SCHEMA"), + tableName: ddr.GetValueOrDefault("TABLE_NAME"))); + + foreach (var tableColumnGroup in tableColumnGroups) + { + var tableSchema = tableColumnGroup.Key.tableSchema; + var tableName = tableColumnGroup.Key.tableName; + + var table = tables.Single(t => t.Schema == tableSchema && t.Name == tableName); + + foreach (var dataRecord in tableColumnGroup) + { + var name = dataRecord.GetValueOrDefault("COLUMN_NAME"); + var defaultValue = dataRecord.GetValueOrDefault("COLUMN_DEFAULT"); + var nullable = dataRecord.GetValueOrDefault("IS_NULLABLE")!.Contains("YES"); + var dataType = dataRecord.GetValueOrDefault("DATA_TYPE"); + var charset = dataRecord.GetValueOrDefault("CHARACTER_SET_NAME"); + var collation = dataRecord.GetValueOrDefault("COLLATION_NAME"); + var columType = dataRecord.GetValueOrDefault("COLUMN_TYPE"); + var extra = dataRecord.GetValueOrDefault("EXTRA"); + var comment = dataRecord.GetValueOrDefault("COLUMN_COMMENT"); + + ValueGenerated valueGenerated; + + if (extra!.IndexOf("auto_increment", StringComparison.Ordinal) >= 0) + { + valueGenerated = ValueGenerated.OnAdd; + } + else if (extra.IndexOf("on update", StringComparison.Ordinal) >= 0) + { + if (defaultValue != null && extra.IndexOf(defaultValue, StringComparison.Ordinal) > 0 || + (string.Equals(dataType, "timestamp", StringComparison.OrdinalIgnoreCase) || + string.Equals(dataType, "datetime", StringComparison.OrdinalIgnoreCase)) && + extra.IndexOf("CURRENT_TIMESTAMP", StringComparison.Ordinal) > 0) + { + valueGenerated = ValueGenerated.OnAddOrUpdate; + } + else + { + if (defaultValue != null) + { + valueGenerated = ValueGenerated.OnAddOrUpdate; + } + else + { + valueGenerated = ValueGenerated.OnUpdate; + } + } + } + else + { + valueGenerated = ValueGenerated.Never; + } + + defaultValue = FilterClrDefaults(dataType!, nullable, defaultValue); + + var column = new DatabaseColumn + { + Table = table, + Name = name!, + StoreType = columType, + IsNullable = nullable, + DefaultValueSql = CreateDefaultValueString(defaultValue, dataType!), + ValueGenerated = valueGenerated, + Comment = string.IsNullOrEmpty(comment) ? null : comment + }; + + table.Columns.Add(column); + } + } + } + } + } + + private void GetPrimaryKeys(DbConnection connection, IReadOnlyList tables, string tableFilter) + { + using (var command = connection.CreateCommand()) + { + command.CommandText = string.Format(GetPrimaryQuery, tableFilter); + using (var reader = command.ExecuteReader()) + { + var tablePrimaryKeyGroups = reader.Cast() + .GroupBy( + ddr => (tableSchema: ddr.GetValueOrDefault("TABLE_SCHEMA"), + tableName: ddr.GetValueOrDefault("TABLE_NAME"))); + + foreach (var tablePrimaryKeyGroup in tablePrimaryKeyGroups) + { + var tableSchema = tablePrimaryKeyGroup.Key.tableSchema; + var tableName = tablePrimaryKeyGroup.Key.tableName; + + var table = tables.Single(t => t.Schema == tableSchema && t.Name == tableName); + + foreach (var dataRecord in tablePrimaryKeyGroup) + { + try + { + var index = new DatabasePrimaryKey + { + Table = table, + Name = dataRecord.GetValueOrDefault("INDEX_NAME") + }; + + foreach (var column in dataRecord.GetValueOrDefault("COLUMNS")!.Split(',')) + { + index.Columns.Add(table.Columns.Single(y => y.Name == column)); + } + + table.PrimaryKey = index; + } + catch (Exception ex) + { + _logger.Logger.LogError(ex, "Error assigning PK for {table}.", table.Name); + } + } + } + } + } + } + + private void GetIndexes(DbConnection connection, IReadOnlyList tables, string tableFilter) + { + using (var command = connection.CreateCommand()) + { + command.CommandText = string.Format(GetIndexesQuery, tableFilter); + using (var reader = command.ExecuteReader()) + { + var tableIndexGroups = reader.Cast() + .GroupBy( + ddr => (tableSchema: ddr.GetValueOrDefault("TABLE_SCHEMA"), + tableName: ddr.GetValueOrDefault("TABLE_NAME"))); + + foreach (var tableIndexGroup in tableIndexGroups) + { + var tableSchema = tableIndexGroup.Key.tableSchema; + var tableName = tableIndexGroup.Key.tableName; + + var table = tables.Single(t => t.Schema == tableSchema && t.Name == tableName); + + foreach (var dataRecord in tableIndexGroup) + { + try + { + var index = new DatabaseIndex + { + Table = table, + Name = dataRecord.GetValueOrDefault("INDEX_NAME"), + IsUnique = !bool.Parse(dataRecord.GetValueOrDefault("NON_UNIQUE")!) + }; + + foreach (var column in dataRecord.GetValueOrDefault("COLUMNS")!.Split(',')) + { + index.Columns.Add(table.Columns.Single(y => y.Name == column)); + } + + table.Indexes.Add(index); + } + catch (Exception ex) + { + _logger.Logger.LogError(ex, "Error assigning index for {table}.", table.Name); + } + } + } + } + } + } + + private void GetConstraints(DbConnection connection, IReadOnlyList tables, string tableFilter) + { + using (var command = connection.CreateCommand()) + { + command.CommandText = string.Format(GetConstraintsQuery, tableFilter); + + using (var reader = command.ExecuteReader()) + { + var tableConstraintGroups = reader.Cast() + .GroupBy( + ddr => (tableSchema: ddr.GetValueOrDefault("TABLE_SCHEMA"), + tableName: ddr.GetValueOrDefault("TABLE_NAME"))); + + foreach (var tableConstraintGroup in tableConstraintGroups) + { + var tableSchema = tableConstraintGroup.Key.tableSchema; + var tableName = tableConstraintGroup.Key.tableName; + + var table = tables.Single(t => t.Schema == tableSchema && t.Name == tableName); + + foreach (var dataRecord in tableConstraintGroup) + { + var referencedTableName = dataRecord.GetValueOrDefault("REFERENCED_TABLE_NAME"); + var referencedTable = tables.FirstOrDefault(t => t.Name == referencedTableName); + if (referencedTable != null) + { + var fkInfo = new DatabaseForeignKey + { + Name = dataRecord.GetValueOrDefault("CONSTRAINT_NAME"), + OnDelete = ConvertToReferentialAction(dataRecord.GetValueOrDefault("DELETE_RULE")!), + Table = table, + PrincipalTable = referencedTable + }; + foreach (var pair in dataRecord.GetValueOrDefault("PAIRED_COLUMNS")!.Split(',')) + { + fkInfo.Columns.Add(table.Columns.Single(y => + string.Equals(y.Name, pair.Split('|')[0], StringComparison.OrdinalIgnoreCase))); + fkInfo.PrincipalColumns.Add(fkInfo.PrincipalTable.Columns.Single(y => + string.Equals(y.Name, pair.Split('|')[1], StringComparison.OrdinalIgnoreCase))); + } + + table.ForeignKeys.Add(fkInfo); + } + else + { + _logger.Logger.LogWarning($"Referenced table `{referencedTableName}` is not in dictionary."); + } + } + } + } + } + } + + private static string? FilterClrDefaults(string dataTypeName, bool nullable, string? defaultValue) + { + if (defaultValue == null) + { + return null; + } + + if (nullable) + { + return defaultValue; + } + + if (defaultValue == "0") + { + if (dataTypeName == "bit" + || dataTypeName == "tinyint" + || dataTypeName == "smallint" + || dataTypeName == "int" + || dataTypeName == "bigint" + || dataTypeName == "decimal" + || dataTypeName == "double" + || dataTypeName == "float") + { + return null; + } + } + else if (Regex.IsMatch(defaultValue, @"^0\.0+$")) + { + if (dataTypeName == "decimal" + || dataTypeName == "double" + || dataTypeName == "float") + { + return null; + } + } + + return defaultValue; + } + + private string? CreateDefaultValueString(string? defaultValue, string dataType) + { + if (defaultValue == null) + { + return null; + } + + if ((string.Equals(dataType, "timestamp", StringComparison.OrdinalIgnoreCase) || + string.Equals(dataType, "datetime", StringComparison.OrdinalIgnoreCase)) && + string.Equals(defaultValue, "CURRENT_TIMESTAMP", StringComparison.OrdinalIgnoreCase)) + { + return defaultValue; + } + + // Handle bit values. + if (string.Equals(dataType, "bit", StringComparison.OrdinalIgnoreCase) + && defaultValue.StartsWith("b'")) + { + return defaultValue; + } + + return "'" + defaultValue.Replace(@"\", @"\\").Replace("'", "''") + "'"; + } + + private static string EscapeLiteral(string s) + { + return $"N'{s}'"; + } + } +} diff --git a/EFCore/src/Storage/Internal/ByteArrayComparer.cs b/EFCore/src/Storage/Internal/ByteArrayComparer.cs new file mode 100644 index 000000000..c99fda081 --- /dev/null +++ b/EFCore/src/Storage/Internal/ByteArrayComparer.cs @@ -0,0 +1,47 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.ChangeTracking; +using System.Collections; +using System.Linq; + +namespace MySql.EntityFrameworkCore.Storage.Internal +{ + internal class ByteArrayComparer : ValueComparer + { + public ByteArrayComparer() + : base( + (v1, v2) => StructuralComparisons.StructuralEqualityComparer.Equals(v1, v2), + v => StructuralComparisons.StructuralEqualityComparer.GetHashCode(v), +#pragma warning disable CS8603 // Possible null reference return. + v => v == null ? null : v.ToArray()) +#pragma warning restore CS8603 // Possible null reference return. + { + } + } +} diff --git a/EFCore/src/Storage/Internal/BytesToDateTimeConverter.cs b/EFCore/src/Storage/Internal/BytesToDateTimeConverter.cs new file mode 100644 index 000000000..d92aefb1d --- /dev/null +++ b/EFCore/src/Storage/Internal/BytesToDateTimeConverter.cs @@ -0,0 +1,46 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using System; + +namespace MySql.EntityFrameworkCore.Storage.Internal +{ + internal class BytesToDateTimeConverter : ValueConverter + { + private static readonly NumberToBytesConverter _longToBytes + = new NumberToBytesConverter(); + + public BytesToDateTimeConverter() + : base( + v => DateTime.FromBinary((long)_longToBytes.ConvertFromProvider(v)!), + v => (byte[])_longToBytes.ConvertToProvider(v.ToBinary())!) + { + } + } +} diff --git a/EFCore/src/Storage/Internal/IMySQLRelationalConnection.cs b/EFCore/src/Storage/Internal/IMySQLRelationalConnection.cs new file mode 100644 index 000000000..32a6c4ae9 --- /dev/null +++ b/EFCore/src/Storage/Internal/IMySQLRelationalConnection.cs @@ -0,0 +1,37 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Storage; + +namespace MySql.EntityFrameworkCore.Storage.Internal +{ + internal interface IMySQLRelationalConnection : IRelationalConnection + { + IMySQLRelationalConnection CreateSourceConnection(); + } +} diff --git a/EFCore/src/Storage/Internal/MySQLBoolTypeMapping.cs b/EFCore/src/Storage/Internal/MySQLBoolTypeMapping.cs new file mode 100644 index 000000000..f1b7d2148 --- /dev/null +++ b/EFCore/src/Storage/Internal/MySQLBoolTypeMapping.cs @@ -0,0 +1,65 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Storage; +using System.Data; + +namespace MySql.EntityFrameworkCore.Storage.Internal +{ + internal class MySQLBoolTypeMapping : BoolTypeMapping + { + public MySQLBoolTypeMapping( + [NotNull] string storeType, + DbType? dbType = null, + int? size = null) + : this(new RelationalTypeMappingParameters( + new CoreTypeMappingParameters(typeof(bool)), + storeType, + size == null ? StoreTypePostfix.None : StoreTypePostfix.Size, + dbType, size: size)) + { + } + + protected MySQLBoolTypeMapping(RelationalTypeMappingParameters parameters) + : base(parameters) + { + } + + /// + /// Creates a copy of this mapping. + /// + /// The parameters for this mapping. + /// The newly created mapping. + protected override RelationalTypeMapping Clone(RelationalTypeMappingParameters parameters) + => new MySQLBoolTypeMapping(parameters); + + /// + protected override string GenerateNonNullSqlLiteral(object value) + => (bool)value ? "TRUE" : "FALSE"; + } +} diff --git a/EFCore/src/Storage/Internal/MySQLByteArrayTypeMapping.cs b/EFCore/src/Storage/Internal/MySQLByteArrayTypeMapping.cs new file mode 100644 index 000000000..f95732c81 --- /dev/null +++ b/EFCore/src/Storage/Internal/MySQLByteArrayTypeMapping.cs @@ -0,0 +1,120 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Storage; +using MySql.EntityFrameworkCore.Utils; +using System; +using System.Data; +using System.Data.Common; + +namespace MySql.EntityFrameworkCore.Storage.Internal +{ + internal class MySQLByteArrayTypeMapping : ByteArrayTypeMapping + { + private const int MaxSize = System.Int32.MaxValue; + + private readonly int _maxSpecificSize; + + public MySQLByteArrayTypeMapping( + string? storeType = null, + int? size = null, + bool fixedLength = false) + : this(System.Data.DbType.Binary, + storeType!, + size.HasValue && size < MaxSize ? size : null, + fixedLength) + { + } + + protected MySQLByteArrayTypeMapping( + DbType type, + string storeType, + int? size, + bool fixedLength) + : this( + new RelationalTypeMappingParameters( + new CoreTypeMappingParameters(typeof(byte[])), + storeType ?? GetBaseType(size, fixedLength), + GetStoreTypePostfix(size), + type, + size: size, + fixedLength: fixedLength)) + { + } + + private static string GetBaseType(int? size, bool isFixedLength) + => size == null + ? "longblob" + : isFixedLength ? "binary" : "varbinary"; + + private static StoreTypePostfix GetStoreTypePostfix(int? size) + => size != null && size <= MaxSize ? StoreTypePostfix.Size : StoreTypePostfix.None; + + protected MySQLByteArrayTypeMapping(RelationalTypeMappingParameters parameters) + : base(parameters) + { + _maxSpecificSize = CalculateSize(parameters.Size); + } + + /// + /// Creates a copy of this mapping. + /// + /// The parameters for this mapping. + /// The newly created mapping. + protected override RelationalTypeMapping Clone(RelationalTypeMappingParameters parameters) + => new MySQLByteArrayTypeMapping(parameters); + + private static int CalculateSize(int? size) + => size.HasValue && size < MaxSize ? size.Value : MaxSize; + + /// + protected override void ConfigureParameter(DbParameter parameter) + { + // For strings and byte arrays, set the max length to the size facet if specified, or + // 8000 bytes if no size facet specified, if the data will fit so as to avoid query cache + // fragmentation by setting lots of different Size values otherwise always set to + // -1 (unbounded) to avoid SQL client size inference. + + var value = parameter.Value; + var length = (value as string)?.Length ?? (value as byte[])?.Length; + + parameter.Size = value == null || value == DBNull.Value || length != null && length <= _maxSpecificSize + ? _maxSpecificSize + : -1; + } + + /// + /// Generates the SQL representation of a literal value. + /// + /// The literal value. + /// + /// The generated string. + /// + protected override string GenerateNonNullSqlLiteral(object value) => ByteArrayFormatter.ToHex((byte[])value); + } +} diff --git a/EFCore/src/Storage/Internal/MySQLDatabaseCreator.cs b/EFCore/src/Storage/Internal/MySQLDatabaseCreator.cs new file mode 100644 index 000000000..21ef77904 --- /dev/null +++ b/EFCore/src/Storage/Internal/MySQLDatabaseCreator.cs @@ -0,0 +1,271 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Migrations.Operations; +using Microsoft.EntityFrameworkCore.Storage; +using MySql.Data.MySqlClient; +using MySql.EntityFrameworkCore.Migrations.Operations; +using MySql.EntityFrameworkCore.Properties; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.EntityFrameworkCore.Storage.Internal +{ + /// + /// Relational Database creator implementation in MySQL + /// + internal class MySQLDatabaseCreator : RelationalDatabaseCreator + { + private readonly MySQLRelationalConnection _connection; + private readonly IRawSqlCommandBuilder _rawSqlCommandBuilder; + + public MySQLDatabaseCreator( + [NotNull] RelationalDatabaseCreatorDependencies dependencies, + [NotNull] IRawSqlCommandBuilder rawSqlCommandBuilder) + : base(dependencies) + { + _connection = (MySQLRelationalConnection)dependencies.Connection; + _rawSqlCommandBuilder = rawSqlCommandBuilder; + } + + public virtual TimeSpan RetryDelay { get; set; } = TimeSpan.FromMilliseconds(500); + + public virtual TimeSpan RetryTimeout { get; set; } = TimeSpan.FromMinutes(1); + + public override void Create() + { + using (var workingConnection = _connection.CreateSourceConnection()) + { + Dependencies.MigrationCommandExecutor.ExecuteNonQuery(CreateCreateOperations(), workingConnection); + ClearPool(); + } + + Exists(retryOnNotExists: true); + } + + public override async Task CreateAsync(CancellationToken cancellationToken = default(CancellationToken)) + { + using (var workingConnection = _connection.CreateSourceConnection()) + { + await Dependencies.MigrationCommandExecutor.ExecuteNonQueryAsync(CreateCreateOperations(), workingConnection, cancellationToken); + ClearPool(); + } + } + + /// + public override void Delete() + { + ClearAllPools(); + using (var sourceConnection = _connection.CreateSourceConnection()) + { + Dependencies.MigrationCommandExecutor.ExecuteNonQuery(CreateDropCommands(), sourceConnection); + } + } + + public override async Task DeleteAsync(CancellationToken cancellationToken = default(CancellationToken)) + { + ClearAllPools(); + using (var sourceConnection = _connection.CreateSourceConnection()) + { + await Dependencies.MigrationCommandExecutor.ExecuteNonQueryAsync(CreateDropCommands(), sourceConnection, cancellationToken); + } + } + + /// + public override bool Exists() + => Exists(retryOnNotExists: false); + + private bool Exists(bool retryOnNotExists) + => Dependencies.ExecutionStrategy.Execute( + DateTime.UtcNow + RetryTimeout, giveUp => + { + while (true) + { + try + { + MySqlConnectionStringBuilder settings = new MySqlConnectionStringBuilder(_connection.ConnectionString); + string database = settings.Database; + if (string.IsNullOrWhiteSpace(database)) + throw new ArgumentNullException("Database"); + settings.Database = string.Empty; + using (var conn = new MySqlConnection(settings.ToString())) + { + conn.Open(); + MySqlCommand cmd = conn.CreateCommand(); + cmd.CommandText = $"SHOW DATABASES LIKE '{database}'"; + var result = cmd.ExecuteScalar(); + if (result == null) + return false; + else + return ((string)result).Equals(database, StringComparison.OrdinalIgnoreCase); + } + } + catch (MySqlException e) + { + if (!retryOnNotExists && IsDoesNotExist(e)) + return false; + + if (DateTime.UtcNow > giveUp + || !RetryOnExistsFailure(e)) + throw; + + Thread.Sleep(RetryDelay); + } + } + }); + + /// + public override Task ExistsAsync(CancellationToken cancellationToken = default) + => ExistsAsync(retryOnNotExists: false, cancellationToken: cancellationToken); + + private Task ExistsAsync(bool retryOnNotExists, CancellationToken cancellationToken) + => Dependencies.ExecutionStrategy.ExecuteAsync( + DateTime.UtcNow + RetryTimeout, async (giveUp, ct) => + { + while (true) + { + try + { + MySqlConnectionStringBuilder settings = new MySqlConnectionStringBuilder(_connection.ConnectionString); + string database = settings.Database; + if (string.IsNullOrWhiteSpace(database)) + throw new ArgumentNullException("Database"); + settings.Database = string.Empty; + using (MySqlConnection conn = new MySqlConnection(settings.ToString())) + { + await conn.OpenAsync(cancellationToken); + MySqlCommand cmd = conn.CreateCommand(); + cmd.CommandText = $"SHOW DATABASES LIKE '{database}'"; + var result = await cmd.ExecuteScalarAsync(cancellationToken); + if (result == null) + return false; + else + return ((string)result).Equals(database, StringComparison.OrdinalIgnoreCase); + } + } + catch (MySqlException e) + { + if (!retryOnNotExists + && IsDoesNotExist(e)) + { + return false; + } + + if (DateTime.UtcNow > giveUp + || !RetryOnExistsFailure(e)) + { + throw; + } + + await Task.Delay(RetryDelay, ct); + } + } + }, cancellationToken); + + private static bool IsDoesNotExist(MySqlException exception) => exception.Number == 1049; + + private bool RetryOnExistsFailure(MySqlException e) + { + if (e.Number == 1049) + { + ClearPool(); + return true; + } + return false; + } + + /// + public override bool HasTables() + => Dependencies.ExecutionStrategy.Execute( + _connection, + connection => Convert.ToInt64(CreateHasTablesCommand() + .ExecuteScalar( + new RelationalCommandParameterObject( + connection, + null, + null, + Dependencies.CurrentContext.Context, + Dependencies.CommandLogger))) + != 0); + + /// + public override Task HasTablesAsync(CancellationToken cancellationToken = default(CancellationToken)) + => Dependencies.ExecutionStrategy.ExecuteAsync( + _connection, + async (connection, ct) => Convert.ToInt64(await CreateHasTablesCommand() + .ExecuteScalarAsync( + new RelationalCommandParameterObject( + connection, + null, + null, + Dependencies.CurrentContext.Context, + Dependencies.CommandLogger), + cancellationToken: ct)) + != 0, cancellationToken); + + private IRelationalCommand CreateHasTablesCommand() + => _rawSqlCommandBuilder + .Build(@"SELECT CASE WHEN COUNT(*) = 0 THEN FALSE ELSE TRUE END + FROM information_schema.tables + WHERE table_type = 'BASE TABLE' AND table_schema = '" + _connection.DbConnection.Database + "'"); + + private IReadOnlyList CreateCreateOperations() + { + var operations = new MigrationOperation[] + { + new MySQLCreateDatabaseOperation { Name = _connection.DbConnection.Database } + }; + + return Dependencies.MigrationsSqlGenerator.Generate(operations); + } + + private IReadOnlyList CreateDropCommands() + { + var databaseName = _connection.DbConnection.Database; + if (string.IsNullOrEmpty(databaseName)) + { + throw new InvalidOperationException(MySQLStrings.NoInitialCatalog); + } + + var operations = new MigrationOperation[] { new MySQLDropDatabaseOperation { Name = databaseName } }; + + return Dependencies.MigrationsSqlGenerator.Generate(operations); + } + + // Clear connection pools in case there are active connections that are pooled + private static void ClearAllPools() => MySqlConnection.ClearAllPools(); + + // Clear connection pool for the database connection since after the 'create database' call, a previously + // invalid connection may now be valid. + private void ClearPool() => MySqlConnection.ClearPool((MySqlConnection)_connection.DbConnection); + } +} diff --git a/EFCore/src/Storage/Internal/MySQLDateTimeOffsetTypeMapping.cs b/EFCore/src/Storage/Internal/MySQLDateTimeOffsetTypeMapping.cs new file mode 100644 index 000000000..d63ac03bf --- /dev/null +++ b/EFCore/src/Storage/Internal/MySQLDateTimeOffsetTypeMapping.cs @@ -0,0 +1,122 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Storage; +using System; +using System.Data; + +namespace MySql.EntityFrameworkCore.Storage.Internal +{ + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + internal class MySQLDateTimeOffsetTypeMapping : DateTimeOffsetTypeMapping + { + private const string _dateTimeFormatConst = @"'{0:yyyy-MM-dd HH:mm:ss.fff}'"; + // Note: this array will be accessed using the precision as an index + // so the order of the entries in this array is important + private readonly string[] _dateTimeOffsetFormats = + { + "'{0:yyyy-MM-dd HH:mm:ss}'", + "'{0:yyyy-MM-dd HH:mm:ss.f}'", + "'{0:yyyy-MM-dd HH:mm:ss.ff}'", + "'{0:yyyy-MM-dd HH:mm:ss.fff}'", + "'{0:yyyy-MM-dd HH:mm:ss.ffff}'", + "'{0:yyyy-MM-dd HH:mm:ss.fffff}'", + "'{0:yyyy-MM-dd HH:mm:ss.ffffff}'", + "'{0:yyyy-MM-dd HH:mm:ss.fffffff}'" + }; + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + public MySQLDateTimeOffsetTypeMapping( + string storeType, + DbType? dbType = System.Data.DbType.DateTimeOffset, + int? precision = null, + StoreTypePostfix storeTypePostfix = StoreTypePostfix.Precision) + : base( + new RelationalTypeMappingParameters( + new CoreTypeMappingParameters(typeof(DateTimeOffset)), + storeType, + storeTypePostfix, + dbType, + precision: precision)) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// Parameter object for . + protected MySQLDateTimeOffsetTypeMapping(RelationalTypeMappingParameters parameters) + : base(parameters) + { + } + + /// + /// Creates a copy of this mapping. + /// + /// The parameters for this mapping. + /// The newly created mapping. + protected override RelationalTypeMapping Clone(RelationalTypeMappingParameters parameters) + => new MySQLDateTimeOffsetTypeMapping(parameters); + + public override string GenerateProviderValueSqlLiteral(object? value) + => value == null + ? "NULL" + : GenerateNonNullSqlLiteral( + value is DateTimeOffset dateTimeOffset + ? dateTimeOffset.UtcDateTime + : value); + + /// + /// Gets the string format to be used to generate SQL literals of this type. + /// + protected override string SqlLiteralFormatString + { + get + { + if (Precision.HasValue) + { + var precision = Precision.Value; + if (precision <= 7 && precision >= 0) + return "TIMESTAMP " + _dateTimeOffsetFormats[precision]; + } + + return "TIMESTAMP " + _dateTimeFormatConst; + } + } + } +} diff --git a/EFCore/src/Storage/Internal/MySQLDateTypeMapping.cs b/EFCore/src/Storage/Internal/MySQLDateTypeMapping.cs new file mode 100644 index 000000000..68f939a73 --- /dev/null +++ b/EFCore/src/Storage/Internal/MySQLDateTypeMapping.cs @@ -0,0 +1,92 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Storage; +using System; + +namespace MySql.EntityFrameworkCore.Storage.Internal +{ + /// + /// + /// Represents the mapping between a .NET type and a database type. + /// + /// + /// This type is typically used by database providers (and other extensions). It is generally + /// not used in application code. + /// + /// + internal class MySQLDateTypeMapping : RelationalTypeMapping + { + private readonly bool _isDefaultValueCompatible; + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + public MySQLDateTypeMapping([NotNull] string storeType, Type clrType, bool isDefaultValueCompatible = false) + : this( + new RelationalTypeMappingParameters( + new CoreTypeMappingParameters(clrType), + storeType, + dbType: System.Data.DbType.Date)) + { + } + + /// + /// This API supports the Entity Framework Core infrastructure and is not intended to be used + /// directly from your code. This API may change or be removed in future releases. + /// + protected MySQLDateTypeMapping(RelationalTypeMappingParameters parameters) + : base(parameters) + { + } + + /// + /// Creates a copy of this mapping. + /// + /// The parameters for this mapping. + /// The newly created mapping. + protected override RelationalTypeMapping Clone(RelationalTypeMappingParameters parameters) + => new MySQLDateTypeMapping(parameters); + + /// + /// Creates a copy of this mapping. + /// + /// Use a default value compatible syntax, or not. + /// The newly created mapping. + public virtual RelationalTypeMapping Clone(bool isDefaultValueCompatible = false) + => new MySQLDateTypeMapping(Parameters); + + /// + /// Gets the string format to be used to generate SQL literals of this type. + /// + protected override string SqlLiteralFormatString => $@"{(_isDefaultValueCompatible ? null : "DATE ")}'{{0:yyyy-MM-dd}}'"; + } +} diff --git a/EFCore/src/Storage/Internal/MySQLDatetimeTypeMapping.cs b/EFCore/src/Storage/Internal/MySQLDatetimeTypeMapping.cs new file mode 100644 index 000000000..269566f6c --- /dev/null +++ b/EFCore/src/Storage/Internal/MySQLDatetimeTypeMapping.cs @@ -0,0 +1,115 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Storage; +using System; +using System.Data; +using System.Data.Common; + +namespace MySql.EntityFrameworkCore.Storage.Internal +{ + internal class MySQLDateTimeTypeMapping : DateTimeTypeMapping + { + private const string _dateTimeFormatConst = "'{0:yyyy-MM-dd HH:mm:ss.fff}'"; + private const string _dateFormatConst = "'{0:yyyy-MM-dd}'"; + + // Note: this array will be accessed using the precision as an index + // so the order of the entries in this array is important + private readonly string[] _dateTimeFormats = + { + "'{0:yyyy-MM-dd HH:mm:ss}'", + "'{0:yyyy-MM-dd HH:mm:ss.f}'", + "'{0:yyyy-MM-dd HH:mm:ss.ff}'", + "'{0:yyyy-MM-dd HH:mm:ss.fff}'", + "'{0:yyyy-MM-dd HH:mm:ss.ffff}'", + "'{0:yyyy-MM-dd HH:mm:ss.fffff}'", + "'{0:yyyy-MM-dd HH:mm:ss.ffffff}'" + }; + + public MySQLDateTimeTypeMapping( + string storeType, + int? precision = null, + DbType? dbType = System.Data.DbType.DateTime, + StoreTypePostfix storeTypePostfix = StoreTypePostfix.Precision) + : base( + new RelationalTypeMappingParameters( + new CoreTypeMappingParameters(typeof(DateTime)), + storeType, + storeTypePostfix, + dbType, + precision: precision)) + { + } + + protected MySQLDateTimeTypeMapping(RelationalTypeMappingParameters parameters) + : base(parameters) + { + } + + /// + /// Creates a copy of this mapping. + /// + /// The parameters for this mapping. + /// The newly created mapping. + protected override RelationalTypeMapping Clone(RelationalTypeMappingParameters parameters) + => new MySQLDateTimeTypeMapping(parameters); + + protected override string SqlLiteralFormatString + { + get + { + switch (StoreType) + { + case "date": + return _dateFormatConst; + case "datetime": + return _dateTimeFormatConst; + case "timestamp": + return $"({_dateTimeFormatConst})"; + default: + if (Precision.HasValue) + { + var precision = Precision.Value; + if (precision <= 6 && precision >= 0) + return _dateTimeFormats[precision]; + } + + return _dateTimeFormats[6]; + } + } + } + + protected override void ConfigureParameter([NotNull] DbParameter parameter) + { + if (parameter.Value!.GetType() == typeof(DateTimeOffset)) + { + parameter.Value = ((DateTimeOffset)parameter.Value).DateTime; + } + } + } +} diff --git a/EFCore/src/Storage/Internal/MySQLDecimalTypeMapping.cs b/EFCore/src/Storage/Internal/MySQLDecimalTypeMapping.cs new file mode 100644 index 000000000..1520a8164 --- /dev/null +++ b/EFCore/src/Storage/Internal/MySQLDecimalTypeMapping.cs @@ -0,0 +1,79 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Storage; +using System.Data; +using System.Data.Common; + +namespace MySql.EntityFrameworkCore.Storage.Internal +{ + internal class MySQLDecimalTypeMapping : DecimalTypeMapping + { + public MySQLDecimalTypeMapping( + string storeType, + DbType? dbType = System.Data.DbType.Decimal, + int? precision = null, + int? scale = null, + StoreTypePostfix storeTypePostfix = StoreTypePostfix.PrecisionAndScale) + : base( + new RelationalTypeMappingParameters( + new CoreTypeMappingParameters(typeof(decimal)), + storeType, + storeTypePostfix, + dbType) + .WithPrecisionAndScale(precision, scale)) + { + } + + /// + /// This API supports the Entity Framework Core infrastructure and is not intended to be used + /// directly from your code. This API may change or be removed in future releases. + /// + protected MySQLDecimalTypeMapping(RelationalTypeMappingParameters parameters) + : base(parameters) + { + } + + protected override RelationalTypeMapping Clone(RelationalTypeMappingParameters parameters) + => new MySQLDecimalTypeMapping(parameters); + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + protected override void ConfigureParameter(DbParameter parameter) + { + base.ConfigureParameter(parameter); + + if (Size.HasValue && Size.Value != -1) + parameter.Size = Size.Value; + } + } +} diff --git a/EFCore/src/Storage/Internal/MySQLDoubleTypeMapping.cs b/EFCore/src/Storage/Internal/MySQLDoubleTypeMapping.cs new file mode 100644 index 000000000..401846f59 --- /dev/null +++ b/EFCore/src/Storage/Internal/MySQLDoubleTypeMapping.cs @@ -0,0 +1,81 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Storage; +using System.Data; +using System.Data.Common; + +namespace MySql.EntityFrameworkCore.Storage.Internal +{ + internal class MySQLDoubleTypeMapping : DoubleTypeMapping + { + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + public MySQLDoubleTypeMapping( + [NotNull] string storeType, + DbType? dbType = null) + : base(storeType, dbType) + { + } + + /// + /// This API supports the Entity Framework Core infrastructure and is not intended to be used + /// directly from your code. This API may change or be removed in future releases. + /// + protected MySQLDoubleTypeMapping(RelationalTypeMappingParameters parameters) + : base(parameters) + { + } + + /// + /// Creates a copy of this mapping. + /// + /// The parameters for this mapping. + /// The newly created mapping. + protected override RelationalTypeMapping Clone(RelationalTypeMappingParameters parameters) + => new MySQLDoubleTypeMapping(parameters); + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + protected override void ConfigureParameter(DbParameter parameter) + { + base.ConfigureParameter(parameter); + + if (Size.HasValue && Size.Value != -1) + parameter.Size = Size.Value; + } + } +} diff --git a/EFCore/src/Storage/Internal/MySQLExecutionStrategy.cs b/EFCore/src/Storage/Internal/MySQLExecutionStrategy.cs new file mode 100644 index 000000000..cc0793aa7 --- /dev/null +++ b/EFCore/src/Storage/Internal/MySQLExecutionStrategy.cs @@ -0,0 +1,83 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Storage; +using MySql.EntityFrameworkCore.Properties; +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.EntityFrameworkCore.Storage.Internal +{ + internal class MySQLExecutionStrategy : IExecutionStrategy + { + private ExecutionStrategyDependencies Dependencies { get; } + + public MySQLExecutionStrategy([NotNull] ExecutionStrategyDependencies dependencies) + { + Dependencies = dependencies; + } + + /// + public virtual bool RetriesOnFailure => false; + + /// + public virtual TResult Execute( + TState state, + Func operation, + Func>? verifySucceeded) + { + try + { + return operation(Dependencies.CurrentContext.Context, state); + } + catch (Exception ex) when (ExecutionStrategy.CallOnWrappedException(ex, MySQLTransientExceptionDetector.ShouldRetryOn!)) + { + throw new InvalidOperationException(MySQLStrings.TransientExceptionDetected, ex); + } + } + + /// + public virtual async Task ExecuteAsync( + TState state, + Func> operation, + Func>>? verifySucceeded, + CancellationToken cancellationToken) + { + try + { + return await operation(Dependencies.CurrentContext.Context, state, cancellationToken).ConfigureAwait(false); + } + catch (Exception ex) when (ExecutionStrategy.CallOnWrappedException(ex, MySQLTransientExceptionDetector.ShouldRetryOn!)) + { + throw new InvalidOperationException(MySQLStrings.TransientExceptionDetected, ex); + } + } + } +} diff --git a/EFCore/src/Storage/Internal/MySQLExecutionStrategyFactory.cs b/EFCore/src/Storage/Internal/MySQLExecutionStrategyFactory.cs new file mode 100644 index 000000000..b7caac1b4 --- /dev/null +++ b/EFCore/src/Storage/Internal/MySQLExecutionStrategyFactory.cs @@ -0,0 +1,45 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Storage; + +namespace MySql.EntityFrameworkCore.Storage.Internal +{ + internal class MySQLExecutionStrategyFactory : RelationalExecutionStrategyFactory + { + public MySQLExecutionStrategyFactory( + [NotNull] ExecutionStrategyDependencies dependencies) + : base(dependencies) + { + } + + /// + protected override IExecutionStrategy CreateDefaultStrategy(ExecutionStrategyDependencies dependencies) + => new MySQLExecutionStrategy(dependencies); + } +} diff --git a/EFCore/src/Storage/Internal/MySQLFloatTypeMapping.cs b/EFCore/src/Storage/Internal/MySQLFloatTypeMapping.cs new file mode 100644 index 000000000..9db0bee5e --- /dev/null +++ b/EFCore/src/Storage/Internal/MySQLFloatTypeMapping.cs @@ -0,0 +1,95 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Storage; +using System.Data; +using System.Data.Common; +using System.Globalization; + +namespace MySql.EntityFrameworkCore.Storage.Internal +{ + internal class MySQLFloatTypeMapping : FloatTypeMapping + { + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + public MySQLFloatTypeMapping( + string storeType, + DbType? dbType = System.Data.DbType.Single) + : base( + storeType, + dbType) + { + } + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + protected MySQLFloatTypeMapping(RelationalTypeMappingParameters parameters) + : base(parameters) + { + } + + /// + /// Creates a copy of this mapping. + /// + /// The parameters for this mapping. + /// The newly created mapping. + protected override RelationalTypeMapping Clone(RelationalTypeMappingParameters parameters) + => new MySQLFloatTypeMapping(parameters); + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + protected override string GenerateNonNullSqlLiteral(object value) + => ((float)value).ToString("R", CultureInfo.InvariantCulture); + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + protected override void ConfigureParameter(DbParameter parameter) + { + base.ConfigureParameter(parameter); + + if (Size.HasValue && Size.Value != -1) + parameter.Size = (byte)Size.Value; + } + } +} diff --git a/EFCore/src/Storage/Internal/MySQLGeometryTypeMapping.cs b/EFCore/src/Storage/Internal/MySQLGeometryTypeMapping.cs new file mode 100644 index 000000000..deb61e2c0 --- /dev/null +++ b/EFCore/src/Storage/Internal/MySQLGeometryTypeMapping.cs @@ -0,0 +1,75 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Storage; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using MySql.Data.MySqlClient; +using System; +using System.Data; +using System.Data.Common; +using System.Reflection; + +namespace MySql.EntityFrameworkCore.Storage.Internal +{ + internal class MySQLGeometryTypeMapping : MySQLTypeMapping + { + protected MySQLGeometryTypeMapping(RelationalTypeMappingParameters parameters) + : base(parameters) + { + } + +#if NET8_0_OR_GREATER + public CoreTypeMapping Clone(ValueConverter? converter) + => new MySQLGeometryTypeMapping(Parameters.WithComposedConverter(converter,null,null,null,null)); +#else + public override CoreTypeMapping Clone(ValueConverter? converter) + => new MySQLGeometryTypeMapping(Parameters.WithComposedConverter(converter)); +#endif + + protected override void ConfigureParameter(DbParameter parameter) + { + MySqlParameter mysqlParameter = (MySqlParameter)parameter; + mysqlParameter.MySqlDbType = MySqlDbType.Geometry; + } + + public override MethodInfo GetDataReaderMethod() + { + return typeof(MySqlDataReader).GetMethod("GetMySqlGeometry", new Type[] { typeof(int) })!; + } + + public MySQLGeometryTypeMapping( + string storeType, + DbType dbType = System.Data.DbType.Binary) + : base(storeType, typeof(Data.Types.MySqlGeometry), dbType) + { + } + + protected override RelationalTypeMapping Clone(RelationalTypeMappingParameters parameters) + => new MySQLGeometryTypeMapping(parameters); + } +} diff --git a/EFCore/src/Storage/Internal/MySQLGuidTypeMapping.cs b/EFCore/src/Storage/Internal/MySQLGuidTypeMapping.cs new file mode 100644 index 000000000..3aee65a32 --- /dev/null +++ b/EFCore/src/Storage/Internal/MySQLGuidTypeMapping.cs @@ -0,0 +1,147 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Storage; +using MySql.Data.MySqlClient; +using MySql.EntityFrameworkCore.Utils; +using System; + +namespace MySql.EntityFrameworkCore.Storage.Internal +{ + internal class MySQLGuidTypeMapping : GuidTypeMapping + { + private readonly MySqlGuidFormat _guidFormat; + + public MySQLGuidTypeMapping(MySqlGuidFormat guidFormat) + : this(new RelationalTypeMappingParameters( + new CoreTypeMappingParameters(typeof(Guid)), + GetStoreType(guidFormat), + StoreTypePostfix.Size, + System.Data.DbType.Guid, + false, + GetSize(guidFormat), + true), + guidFormat) + { + } + + protected MySQLGuidTypeMapping(RelationalTypeMappingParameters parameters, MySqlGuidFormat guidFormat) + : base(parameters) + { + _guidFormat = guidFormat; + } + + protected override RelationalTypeMapping Clone(RelationalTypeMappingParameters parameters) + => new MySQLGuidTypeMapping(parameters, _guidFormat); + + protected override string GenerateNonNullSqlLiteral(object value) + { + switch (_guidFormat) + { + case MySqlGuidFormat.Char36: + return $"'{value:D}'"; + + case MySqlGuidFormat.Char32: + return $"'{value:N}'"; + + case MySqlGuidFormat.Binary16: + case MySqlGuidFormat.TimeSwapBinary16: + case MySqlGuidFormat.LittleEndianBinary16: + return ByteArrayFormatter.ToHex(GetBytesFromGuid(_guidFormat, (Guid)value)); + + case MySqlGuidFormat.None: + case MySqlGuidFormat.Default: + default: + throw new ArgumentOutOfRangeException(); + } + } + + private static string GetStoreType(MySqlGuidFormat guidFormat) + { + switch (guidFormat) + { + case MySqlGuidFormat.Char36: + case MySqlGuidFormat.Char32: + return "char"; + + case MySqlGuidFormat.Binary16: + case MySqlGuidFormat.TimeSwapBinary16: + case MySqlGuidFormat.LittleEndianBinary16: + return "binary"; + + case MySqlGuidFormat.None: + case MySqlGuidFormat.Default: + default: + throw new InvalidOperationException(); + } + } + + private static int GetSize(MySqlGuidFormat guidFormat) + { + switch (guidFormat) + { + case MySqlGuidFormat.Char36: + return 36; + + case MySqlGuidFormat.Char32: + return 32; + + case MySqlGuidFormat.Binary16: + case MySqlGuidFormat.TimeSwapBinary16: + case MySqlGuidFormat.LittleEndianBinary16: + return 16; + + case MySqlGuidFormat.None: + case MySqlGuidFormat.Default: + default: + throw new InvalidOperationException(); + } + } + + public static bool IsValidGuidFormat(MySqlGuidFormat guidFormat) + => guidFormat != MySqlGuidFormat.None && + guidFormat != MySqlGuidFormat.Default; + + protected static byte[] GetBytesFromGuid(MySqlGuidFormat guidFormat, Guid guid) + { + var bytes = guid.ToByteArray(); + + if (guidFormat == MySqlGuidFormat.Binary16) + { + return new[] { bytes[3], bytes[2], bytes[1], bytes[0], bytes[5], bytes[4], bytes[7], bytes[6], bytes[8], bytes[9], bytes[10], bytes[11], bytes[12], bytes[13], bytes[14], bytes[15] }; + } + + if (guidFormat == MySqlGuidFormat.TimeSwapBinary16) + { + return new[] { bytes[7], bytes[6], bytes[5], bytes[4], bytes[3], bytes[2], bytes[1], bytes[0], bytes[8], bytes[9], bytes[10], bytes[11], bytes[12], bytes[13], bytes[14], bytes[15] }; + } + + return bytes; + } + } +} diff --git a/EFCore/src/Storage/Internal/MySQLJsonChangeTrackingOptions.cs b/EFCore/src/Storage/Internal/MySQLJsonChangeTrackingOptions.cs new file mode 100644 index 000000000..2e7ab243c --- /dev/null +++ b/EFCore/src/Storage/Internal/MySQLJsonChangeTrackingOptions.cs @@ -0,0 +1,82 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySql.EntityFrameworkCore.Storage.Internal +{ + internal enum MySQLJsonChangeTrackingOptions + { + /// + /// The default is to serialize everything, which is the most precise, but also the slowest. + /// + None = 0, + + /// + /// Do not track changes inside of JSON mapped properties but only for the root property itself. + /// For example, if the JSON mapped property is a top level array of `int`, then changes to items of the + /// array are not tracked, but changes to the array property itself (the reference) are. + /// + CompareRootPropertyOnly = 0x00000001 | CompareStringRootPropertyByEquals | CompareDomRootPropertyByEquals, + + /// + /// Compare strings as is, without further processing. This means that adding whitespaces between inner + /// properties of a JSON object, that have no effect at all to the JSON object itself, would lead to a change + /// being discovered to the JSON object, resulting in the JSON mapped property being marked as modified. + /// + CompareStringRootPropertyByEquals = 0x00000002, + + /// + /// Only check the JSON root property for DOM objects. + /// + CompareDomRootPropertyByEquals = 0x00000004, + + /// + /// Traverse the DOM to check for changes. + /// + CompareDomSemantically = 0x00000008, + + /// + /// Fully traverse the DOM to generate a hash. + /// + HashDomSemantially = 0x00010000, + + /// + /// Traverse part of the DOM to generate a hash. + /// + HashDomSemantiallyOptimized = 0x00020000, + + /// + /// Call DeepClone() whenever a type, for which a snapshot needs to be generated, implements it. + /// + SnapshotCallsDeepClone = 0x01000000, + + /// + /// Call Clone() whenever a type, for which a snapshot needs to be generated, implements it. + /// + SnapshotCallsClone = 0x02000000, + } +} diff --git a/EFCore/src/Storage/Internal/MySQLJsonTypeMapping.cs b/EFCore/src/Storage/Internal/MySQLJsonTypeMapping.cs new file mode 100644 index 000000000..332ca01ee --- /dev/null +++ b/EFCore/src/Storage/Internal/MySQLJsonTypeMapping.cs @@ -0,0 +1,111 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.ChangeTracking; +using Microsoft.EntityFrameworkCore.Storage; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using MySql.Data.MySqlClient; +using MySql.EntityFrameworkCore.Infrastructure.Internal; +using MySql.EntityFrameworkCore.Query; +using System; +using System.Data.Common; + +namespace MySql.EntityFrameworkCore.Storage.Internal +{ + internal class MySQLJsonTypeMapping : MySQLJsonTypeMapping + { + public MySQLJsonTypeMapping( + [NotNull] string storeType, + [CanBeNull] ValueConverter valueConverter, + [CanBeNull] ValueComparer valueComparer, + [NotNull] IMySQLOptions options) + : base( + storeType, + typeof(T), + valueConverter, + valueComparer, + options) + { + } + + protected MySQLJsonTypeMapping( + RelationalTypeMappingParameters parameters, + MySqlDbType mySqlDbType) + : base(parameters, mySqlDbType) + { + } + + protected override RelationalTypeMapping Clone(RelationalTypeMappingParameters parameters) + => new MySQLJsonTypeMapping(parameters, MySqlDbType); + } + + internal abstract class MySQLJsonTypeMapping : MySQLStringTypeMapping + { + [NotNull] + protected virtual IMySQLOptions? Options { get; } + + public MySQLJsonTypeMapping( + [NotNull] string storeType, + [NotNull] Type clrType, + [CanBeNull] ValueConverter valueConverter, + [CanBeNull] ValueComparer valueComparer, + [NotNull] IMySQLOptions options) + : base( + new RelationalTypeMappingParameters( + new CoreTypeMappingParameters( + clrType, + valueConverter, + valueComparer), + storeType, + unicode: true), + MySqlDbType.JSON) + { + if (storeType != "json") + throw new ArgumentException($"The store type '{nameof(storeType)}' must be 'json'.", nameof(storeType)); + + Options = options; + } + + protected MySQLJsonTypeMapping( + RelationalTypeMappingParameters parameters, + MySqlDbType mySqlDbType) + : base(parameters, mySqlDbType) + { + } + + protected override void ConfigureParameter(DbParameter parameter) + { + base.ConfigureParameter(parameter); + + if (parameter.Value is MySQLJsonString mySqlJsonString) + { + parameter.Value = (string)mySqlJsonString; + } + } + } +} diff --git a/EFCore/src/Storage/Internal/MySQLRelationalConnection.cs b/EFCore/src/Storage/Internal/MySQLRelationalConnection.cs new file mode 100644 index 000000000..cc1e391e7 --- /dev/null +++ b/EFCore/src/Storage/Internal/MySQLRelationalConnection.cs @@ -0,0 +1,99 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage; +using MySql.Data.MySqlClient; +using MySql.EntityFrameworkCore.Infrastructure.Internal; +using System.Data.Common; +using System.Diagnostics.CodeAnalysis; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.EntityFrameworkCore.Storage.Internal +{ + internal class MySQLRelationalConnection : RelationalConnection, IMySQLRelationalConnection + { + /// + /// Indicates whether the store connection supports ambient transactions + /// + protected override bool SupportsAmbientTransactions => true; + + private readonly MySQLOptionsExtension _mySqlOptionsExtension; + + public MySQLRelationalConnection([NotNull] RelationalConnectionDependencies dependencies) + : base(dependencies) + { + _mySqlOptionsExtension = Dependencies.ContextOptions.FindExtension() ?? new MySQLOptionsExtension(); + } + + protected override DbConnection CreateDbConnection() => new MySqlConnection(ConnectionString); + + [AllowNull] + public new virtual MySqlConnection DbConnection + { + get => (MySqlConnection)base.DbConnection; + set => base.DbConnection = value; + } + + public virtual IMySQLRelationalConnection CreateSourceConnection() + { + MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder(ConnectionString); + builder.Database = string.Empty; + builder.Pooling = false; + + var connectionString = builder.ConnectionString; + var relationalOptions = RelationalOptionsExtension.Extract(Dependencies.ContextOptions); + + relationalOptions = relationalOptions.Connection is not null + ? relationalOptions.WithConnection(DbConnection.CloneWith(connectionString)) + : relationalOptions.WithConnectionString(connectionString); + + var optionsBuilder = new DbContextOptionsBuilder(); + ((IDbContextOptionsBuilderInfrastructure)optionsBuilder).AddOrUpdateExtension(relationalOptions); + + return new MySQLRelationalConnection(Dependencies with { ContextOptions = optionsBuilder.Options }); + } + + public override bool Open(bool errorsExpected = false) + { + if (DbConnection.IsDisposed) + DbConnection = (MySqlConnection)CreateDbConnection(); + var result = base.Open(errorsExpected); + return result; + } + + public override async Task OpenAsync(CancellationToken cancellationToken, bool errorsExpected = false) + { + if (DbConnection.IsDisposed) + DbConnection = (MySqlConnection)CreateDbConnection(); + return await base.OpenAsync(cancellationToken, errorsExpected).ConfigureAwait(false); + } + } +} diff --git a/EFCore/src/Storage/Internal/MySQLScaffoldingConnectionSettings.cs b/EFCore/src/Storage/Internal/MySQLScaffoldingConnectionSettings.cs new file mode 100644 index 000000000..9f4b301f7 --- /dev/null +++ b/EFCore/src/Storage/Internal/MySQLScaffoldingConnectionSettings.cs @@ -0,0 +1,137 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Data.Common; + +namespace MySql.EntityFrameworkCore.Storage.Internal +{ + internal class MySQLScaffoldingConnectionSettings + { + public const string ScaffoldPrefix = "Scaffold:"; + public const string CharSetKey = ScaffoldPrefix + "CharSet"; + public const string CollationKey = ScaffoldPrefix + "Collation"; + public const string ViewsKey = ScaffoldPrefix + "Views"; + + private readonly DbConnectionStringBuilder _csb; + + public MySQLScaffoldingConnectionSettings(string connectionString) + { + _csb = new DbConnectionStringBuilder { ConnectionString = connectionString }; + + CharSet = GetBoolean(CharSetKey, true); + Collation = GetBoolean(CollationKey, true); + Views = GetBoolean(ViewsKey, true); + } + + public virtual bool CharSet { get; set; } + public virtual bool Collation { get; set; } + public virtual bool Views { get; set; } + + public virtual string GetProviderCompatibleConnectionString() + { + var csb = new DbConnectionStringBuilder { ConnectionString = _csb.ConnectionString }; + + csb.Remove(CharSetKey); + csb.Remove(CollationKey); + csb.Remove(ViewsKey); + + return csb.ConnectionString; + } + + protected virtual bool GetBoolean(string key, bool defaultValue = default) + { + if (_csb.TryGetValue(key, out var value)) + { + if (value is string stringValue) + { + if (int.TryParse(stringValue, out var intValue)) + { + return intValue != 0; + } + + if (bool.TryParse(stringValue, out var boolValue)) + { + return boolValue; + } + + if (stringValue.Equals("on", StringComparison.OrdinalIgnoreCase) || + stringValue.Equals("yes", StringComparison.OrdinalIgnoreCase) || + stringValue.Equals("enable", StringComparison.OrdinalIgnoreCase) || + stringValue.Equals("enabled", StringComparison.OrdinalIgnoreCase)) + return true; + + if (stringValue.Equals("off", StringComparison.OrdinalIgnoreCase) || + stringValue.Equals("no", StringComparison.OrdinalIgnoreCase) || + stringValue.Equals("disable", StringComparison.OrdinalIgnoreCase) || + stringValue.Equals("disabled", StringComparison.OrdinalIgnoreCase)) + return false; + } + + return Convert.ToBoolean(value); + } + + return defaultValue; + } + + protected virtual bool Equals(MySQLScaffoldingConnectionSettings other) + { + return CharSet == other.CharSet && + Collation == other.Collation && + Views == other.Views; + } + + public override bool Equals(object? obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + if (ReferenceEquals(this, obj)) + { + return true; + } + + if (obj.GetType() != this.GetType()) + { + return false; + } + + return Equals((MySQLScaffoldingConnectionSettings)obj); + } + + public override int GetHashCode() + { + unchecked + { + return (CharSet.GetHashCode() * 397) ^ Collation.GetHashCode(); + } + } + } +} diff --git a/EFCore/src/Storage/Internal/MySQLSqlGenerationHelper.cs b/EFCore/src/Storage/Internal/MySQLSqlGenerationHelper.cs new file mode 100644 index 000000000..4bcb445f6 --- /dev/null +++ b/EFCore/src/Storage/Internal/MySQLSqlGenerationHelper.cs @@ -0,0 +1,88 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Storage; +using MySql.EntityFrameworkCore.Infrastructure.Internal; +using MySql.EntityFrameworkCore.Utils; +using System.Text; + +namespace MySql.EntityFrameworkCore.Storage.Internal +{ + /// + /// Provides the service to assist in generating SQL commands. + /// + internal class MySQLSqlGenerationHelper : RelationalSqlGenerationHelper + { + private readonly IMySQLOptions _options; + + public MySQLSqlGenerationHelper([NotNull] RelationalSqlGenerationHelperDependencies dependencies, IMySQLOptions options) + : base(dependencies) + { + _options = options; + } + + /// + public override string EscapeIdentifier(string identifier) + => Check.NotEmpty(identifier, nameof(identifier)).Replace("`", "``"); + + /// + public override void EscapeIdentifier(StringBuilder builder, string identifier) + { + Check.NotEmpty(identifier, nameof(identifier)); + + var initialLength = builder.Length; + builder.Append(identifier); + builder.Replace("`", "``", initialLength, identifier.Length); + } + + /// + public override void DelimitIdentifier(StringBuilder builder, string identifier) + { + Check.NotEmpty(identifier, nameof(identifier)); + + builder.Append('`'); + EscapeIdentifier(builder, identifier); + builder.Append('`'); + } + + /// + public override string DelimitIdentifier(string identifier) + => $"`{EscapeIdentifier(Check.NotEmpty(identifier, nameof(identifier)))}`"; + + /// + public override string DelimitIdentifier(string name, string? schema) + => base.DelimitIdentifier(GetObjectName(name, schema!), GetSchemaName(name, schema!)); + + protected virtual string GetObjectName(string name, string schema) + => !string.IsNullOrEmpty(schema) && _options.SchemaNameTranslator != null + ? _options.SchemaNameTranslator(schema, name) + : name; + + protected virtual string? GetSchemaName(string name, string schema) => schema; + } +} diff --git a/EFCore/src/Storage/Internal/MySQLStringTypeMapping.cs b/EFCore/src/Storage/Internal/MySQLStringTypeMapping.cs new file mode 100644 index 000000000..4979b239f --- /dev/null +++ b/EFCore/src/Storage/Internal/MySQLStringTypeMapping.cs @@ -0,0 +1,132 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Storage; +using MySql.Data.MySqlClient; +using System; +using System.Data; +using System.Data.Common; + +namespace MySql.EntityFrameworkCore.Storage.Internal +{ + internal class MySQLStringTypeMapping : MySQLTypeMapping + { + private const int UnicodeMax = 4000; + private const int AnsiMax = 8000; + + private readonly int _maxSpecificSize; + + public MySQLStringTypeMapping( + [NotNull] string storeType, + bool unicode = true, + int? size = null, + bool fixedLength = false, + StoreTypePostfix? storeTypePostfix = null) + : this( + new RelationalTypeMappingParameters( + new CoreTypeMappingParameters(typeof(string)), + storeType, + storeTypePostfix ?? StoreTypePostfix.None, + GetDbType(unicode, fixedLength), + unicode, + size, + fixedLength), + fixedLength + ? MySqlDbType.String + : MySqlDbType.VarString) + { + } + + private static DbType? GetDbType(bool unicode, bool fixedLength) + => unicode + ? fixedLength + ? System.Data.DbType.StringFixedLength + : System.Data.DbType.String + : fixedLength + ? System.Data.DbType.AnsiStringFixedLength + : System.Data.DbType.AnsiString; + + protected MySQLStringTypeMapping(RelationalTypeMappingParameters parameters, MySqlDbType mySqlDbType) + : base(parameters, mySqlDbType) + { + _maxSpecificSize = CalculateSize(parameters.Unicode, parameters.Size); + } + + private static int CalculateSize(bool unicode, int? size) + => unicode + ? size.HasValue && size <= UnicodeMax ? size.Value : UnicodeMax + : size.HasValue && size <= AnsiMax ? size.Value : AnsiMax; + + /// + /// Creates a copy of this mapping. + /// + /// The parameters for this mapping. + /// The newly created mapping. + protected override RelationalTypeMapping Clone(RelationalTypeMappingParameters parameters) + => new MySQLStringTypeMapping(parameters, MySqlDbType); + + /// + protected override void ConfigureParameter(DbParameter parameter) + { + var value = parameter.Value; + int? length; + + if (value is string stringValue) + length = stringValue.Length; + else if (value is byte[] byteArray) + length = byteArray.Length; + else + length = null; + + parameter.Value = value; + parameter.Size = value == null || value == DBNull.Value || length != null && length <= _maxSpecificSize + ? _maxSpecificSize + : -1; + } + + protected override string GenerateNonNullSqlLiteral(object value) + => EscapeLineBreaks((string)value); + + protected string EscapeSqlLiteral(string literal) + => literal.Replace("'", "''"); + + private static readonly char[] LineBreakChars = new char[] { '\r', '\n' }; + private string EscapeLineBreaks(string value) + { + var escapedLiteral = $"'{EscapeSqlLiteral(value)}'"; + + if (value.IndexOfAny(LineBreakChars) != -1) + escapedLiteral = "CONCAT(" + escapedLiteral + .Replace("\r\n", "', CHAR(13, 10), '") + .Replace("\r", "', CHAR(13), '") + .Replace("\n", "', CHAR(10), '") + ")"; + + return escapedLiteral; + } + } +} diff --git a/EFCore/src/Storage/Internal/MySQLTimeSpanMapping.cs b/EFCore/src/Storage/Internal/MySQLTimeSpanMapping.cs new file mode 100644 index 000000000..9af35fb0a --- /dev/null +++ b/EFCore/src/Storage/Internal/MySQLTimeSpanMapping.cs @@ -0,0 +1,95 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Storage; +using System; +using System.Globalization; + +namespace MySql.EntityFrameworkCore.Storage.Internal +{ + internal class MySQLTimeSpanMapping : TimeSpanTypeMapping + { + public MySQLTimeSpanMapping( + [NotNull] string storeType, + [NotNull] Type clrType, + int? precision = null) + : this( + new RelationalTypeMappingParameters( + new CoreTypeMappingParameters(clrType), + storeType, + StoreTypePostfix.Precision, + System.Data.DbType.Time, + precision: precision)) + { + } + + protected MySQLTimeSpanMapping(RelationalTypeMappingParameters parameters) + : base(parameters) + { + } + + /// + /// Creates a copy of this mapping. + /// + /// The parameters for this mapping. + /// The newly created mapping. + protected override RelationalTypeMapping Clone(RelationalTypeMappingParameters parameters) + => new MySQLTimeSpanMapping(parameters); + + /// + /// Generates the MySQL representation of a non-null literal value. + /// + /// The literal value. + /// + /// The generated string. + /// + protected override string GenerateNonNullSqlLiteral(object value) + { + var literal = string.Format(CultureInfo.InvariantCulture, $"{{0:{GetTimeFormatString(value, Precision)}}}", value); + return literal.EndsWith(".") + ? $"TIME '{literal[..^1]}'" + : $"TIME '{literal}'"; + } + + protected static string GetTimeFormatString(object value, int? precision) + { + var validPrecision = Math.Min(Math.Max(precision.GetValueOrDefault(), 0), 6); + + var format = value switch + { + TimeOnly => @"HH\:mm\:ss", + TimeSpan => @"hh\:mm\:ss", + _ => throw new InvalidCastException($"Can't generate time SQL literal for CLR type '{value.GetType()}'.") + }; + + return validPrecision > 0 + ? $@"{format}\.{new string('F', validPrecision)}" + : format; + } + } +} diff --git a/EFCore/src/Storage/Internal/MySQLTransientExceptionDetector.cs b/EFCore/src/Storage/Internal/MySQLTransientExceptionDetector.cs new file mode 100644 index 000000000..d608ea6c7 --- /dev/null +++ b/EFCore/src/Storage/Internal/MySQLTransientExceptionDetector.cs @@ -0,0 +1,44 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; + +namespace MySql.EntityFrameworkCore.Storage.Internal +{ + /// + /// Detects the exceptions caused by MySQL Server transient failures. + /// + internal class MySQLTransientExceptionDetector + { + public static bool ShouldRetryOn([NotNull] Exception ex) + => ex is MySqlException mySqlException + ? mySqlException.IsTransient + : ex is TimeoutException; + } +} diff --git a/EFCore/src/Storage/Internal/MySQLTypeMapping.cs b/EFCore/src/Storage/Internal/MySQLTypeMapping.cs new file mode 100644 index 000000000..94b3ba746 --- /dev/null +++ b/EFCore/src/Storage/Internal/MySQLTypeMapping.cs @@ -0,0 +1,77 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Storage; +using MySql.Data.MySqlClient; +using System; +using System.Data; +using System.Data.Common; + +namespace MySql.EntityFrameworkCore.Storage.Internal +{ + internal abstract class MySQLTypeMapping : RelationalTypeMapping + { + /// + /// The database type used by MySQL. + /// + public virtual MySqlDbType MySqlDbType { get; } + public MySQLTypeMapping( + [NotNull] string storeType, + [NotNull] Type clrType, + DbType? dbType = null, + MySqlDbType? mySqlDbType = null, + bool unicode = false, + int? size = null) + : base( + new RelationalTypeMappingParameters( + new CoreTypeMappingParameters(clrType), storeType, StoreTypePostfix.None, dbType, unicode, size)) + { + if (mySqlDbType != null) + MySqlDbType = (MySqlDbType)mySqlDbType; + } + + protected MySQLTypeMapping(RelationalTypeMappingParameters parameters, MySqlDbType? mySqlDbType = null) + : base(parameters) + { + if (mySqlDbType != null) + MySqlDbType = (MySqlDbType)mySqlDbType; + } + + protected override void ConfigureParameter(DbParameter parameter) + { + if (!(parameter is MySqlParameter mySqlParameter)) + { + throw new ArgumentException($"MySQL-specific type mapping {GetType()} being used with non-MySQL parameter type {parameter.GetType().Name}"); + } + + base.ConfigureParameter(parameter); + + mySqlParameter.MySqlDbType = MySqlDbType; + } + } +} diff --git a/EFCore/src/Storage/Internal/MySQLTypeMappingSource.cs b/EFCore/src/Storage/Internal/MySQLTypeMappingSource.cs new file mode 100644 index 000000000..831d01a94 --- /dev/null +++ b/EFCore/src/Storage/Internal/MySQLTypeMappingSource.cs @@ -0,0 +1,343 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Storage; +using MySql.Data.MySqlClient; +using MySql.EntityFrameworkCore.Infrastructure.Internal; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; + +namespace MySql.EntityFrameworkCore.Storage.Internal +{ + internal class MySQLTypeMappingSource : RelationalTypeMappingSource + { + private const int MAXKEYLENGTH = 3072; + + private readonly IntTypeMapping _int = new IntTypeMapping("int", DbType.Int32); + private readonly UIntTypeMapping _uint = new UIntTypeMapping("int unsigned", DbType.UInt32); + private readonly LongTypeMapping _bigint = new LongTypeMapping("bigint", DbType.Int64); + private readonly ULongTypeMapping _ubigint = new ULongTypeMapping("bigint unsigned", DbType.UInt64); + private readonly ShortTypeMapping _smallint = new ShortTypeMapping("smallint", DbType.Int16); + private readonly UShortTypeMapping _usmallint = new UShortTypeMapping("smallint unsigned", DbType.UInt16); + private readonly SByteTypeMapping _tinyint = new SByteTypeMapping("tinyint", DbType.SByte); + private readonly ByteTypeMapping _utinyint = new ByteTypeMapping("tinyint unsigned", DbType.Byte); + + private readonly ULongTypeMapping _bit = new ULongTypeMapping("bit", DbType.UInt64); + private readonly MySQLStringTypeMapping _charUnicode = new MySQLStringTypeMapping("char", fixedLength: true, storeTypePostfix: StoreTypePostfix.Size); + private readonly MySQLStringTypeMapping _varcharUnicode = new MySQLStringTypeMapping("varchar", storeTypePostfix: StoreTypePostfix.Size); + private readonly MySQLStringTypeMapping _textUnicode = new MySQLStringTypeMapping("text"); + private readonly MySQLStringTypeMapping _longtextUnicode = new MySQLStringTypeMapping("longtext"); + private readonly MySQLStringTypeMapping _mediumTextUnicode = new MySQLStringTypeMapping("mediumtext"); + private readonly MySQLStringTypeMapping _tinyTextUnicode = new MySQLStringTypeMapping("tinytext"); + + private readonly MySQLStringTypeMapping _nchar = new MySQLStringTypeMapping("nchar", fixedLength: true, storeTypePostfix: StoreTypePostfix.Size); + private readonly MySQLStringTypeMapping _nvarchar = new MySQLStringTypeMapping("nvarchar", storeTypePostfix: StoreTypePostfix.Size); + + private readonly MySQLDateTimeTypeMapping _datetime = new MySQLDateTimeTypeMapping("datetime", dbType: DbType.DateTime); + private readonly MySQLDateTimeTypeMapping _timeStamp = new MySQLDateTimeTypeMapping("timestamp", dbType: DbType.DateTime); + private readonly MySQLDateTimeOffsetTypeMapping _datetimeoffset = new MySQLDateTimeOffsetTypeMapping("datetime"); + private readonly MySQLDateTimeOffsetTypeMapping _timestampoffset = new MySQLDateTimeOffsetTypeMapping("timestamp"); + private readonly MySQLDateTypeMapping _date = new MySQLDateTypeMapping("date", typeof(DateTime)); + private readonly MySQLDateTypeMapping _dateonly = new MySQLDateTypeMapping("date", typeof(DateOnly)); + private readonly MySQLTimeSpanMapping _time = new MySQLTimeSpanMapping("time", typeof(TimeSpan)); + private readonly MySQLTimeSpanMapping _timeonly = new MySQLTimeSpanMapping("time", typeof(TimeOnly)); + + private readonly MySQLFloatTypeMapping _float = new MySQLFloatTypeMapping("float", DbType.Single); + private readonly MySQLDoubleTypeMapping _double = new MySQLDoubleTypeMapping("double", DbType.Double); + private readonly MySQLDecimalTypeMapping _decimal = new MySQLDecimalTypeMapping("decimal", precision: 18, scale: 2); + + private readonly RelationalTypeMapping _binary = new MySQLByteArrayTypeMapping(fixedLength: true); + private readonly RelationalTypeMapping _varbinary = new MySQLByteArrayTypeMapping(); + + private readonly MySQLStringTypeMapping _enum = new MySQLStringTypeMapping("enum"); + private readonly MySQLStringTypeMapping _set = new MySQLStringTypeMapping("set"); + private readonly MySQLGeometryTypeMapping _geometry = new MySQLGeometryTypeMapping("geometry"); + + private readonly MySQLBoolTypeMapping _bitBool = new MySQLBoolTypeMapping("bit", size: 1); + private readonly MySQLBoolTypeMapping _tinyintBool = new MySQLBoolTypeMapping("tinyint", size: 1); + + private GuidTypeMapping? _guid; + private MySqlGuidFormat guidFormat = MySqlGuidFormat.Default; + + private Dictionary? _storeTypeMappings; + private Dictionary? _clrTypeMappings; + + private readonly IMySQLOptions _options; + private bool _initialized; + + public MySQLTypeMappingSource(TypeMappingSourceDependencies dependencies, + RelationalTypeMappingSourceDependencies relationalDependencies, + IMySQLOptions options) + : base(dependencies, relationalDependencies) + { + _options = options; + } + + protected void Initialize() + { + if (guidFormat == MySqlGuidFormat.Default) + { + guidFormat = _options.ConnectionSettings.OldGuids + ? MySqlGuidFormat.LittleEndianBinary16 + : MySqlGuidFormat.Char36; + } + + _guid = MySQLGuidTypeMapping.IsValidGuidFormat(guidFormat) + ? new MySQLGuidTypeMapping(guidFormat) + : null; + + _storeTypeMappings = new Dictionary(StringComparer.OrdinalIgnoreCase) + { + // integers + { "bigint", new[] { _bigint } }, + { "bigint unsigned", new[] { _ubigint } }, + { "int", new[] { _int } }, + { "int unsigned", new[] { _uint } }, + { "integer", new[] { _int } }, + { "integer unsigned", new[] { _uint } }, + { "mediumint", new[] { _int }}, + { "mediumint unsigned",new[] { _uint }}, + { "smallint", new[] { _smallint }}, + { "smallint unsigned", new[] { _usmallint }}, + { "tinyint", new[] { _tinyint }}, + { "tinyint unsigned", new[] { _utinyint }}, + + // decimals + { "decimal", new[] { _decimal }}, + { "numeric",new[] { _decimal }}, + { "dec", new[] { _decimal }}, + { "fixed",new[] { _decimal }}, + { "double",new[] { _double }}, + { "float", new[] { _float }}, + { "real",new[] { _double }}, + + // binary + { "binary", new[] { _binary }}, + { "varbinary",new[] { _varbinary }}, + { "tinyblob", new[] { _varbinary }}, + { "blob",new[] { _varbinary }}, + { "mediumblob",new[] { _varbinary }}, + { "longblob",new[] { _varbinary }}, + + // string + { "char",new[] { _charUnicode }}, + { "varchar",new[] { _varcharUnicode }}, + { "nchar", new[] { _nchar }}, + { "nvarchar", new[] { _nvarchar }}, + { "tinytext",new[] { _tinyTextUnicode }}, + { "text", new[] { _textUnicode }}, + { "mediumtext", new[] { _mediumTextUnicode }}, + { "longtext",new[] { _longtextUnicode }}, + { "enum",new[] { _enum }}, + { "set",new[] { _set }}, + + // DateTime + { "year",new[] { _int }}, + { "date", new RelationalTypeMapping[] { _date, _dateonly }}, + { "time", new RelationalTypeMapping[] { _time, _timeonly }}, + { "timestamp", new RelationalTypeMapping[] { _timeStamp, _timestampoffset }}, + { "datetime", new RelationalTypeMapping[] { _datetime, _datetimeoffset }}, + + // bit + { "bit",new[] { _bit }}, + + // other + { "geometry", new[] { _geometry }}, + { "json", new[] { _longtextUnicode } } + }; + + _clrTypeMappings = new Dictionary + { + // integers + { typeof(short), _smallint }, + { typeof(ushort), _usmallint }, + { typeof(int), _int }, + { typeof(uint), _uint }, + { typeof(long), _bigint }, + { typeof(ulong), _ubigint }, + + // byte / char + { typeof(byte), _utinyint }, + { typeof(sbyte), _tinyint }, + + #if !NET8_0_OR_GREATER + // DateTime + { typeof(DateTime), _datetime.Clone(6, null) }, + { typeof(DateOnly), _dateonly }, + { typeof(DateTimeOffset), _datetimeoffset.Clone(6, null) }, + { typeof(TimeSpan), _time.Clone(6, null) }, + { typeof(TimeOnly), _timeonly }, + #else + // DateTime + { typeof(DateTime), _datetime.WithPrecisionAndScale(6, null) }, + { typeof(DateOnly), _dateonly }, + { typeof(DateTimeOffset), _datetimeoffset.Clone() }, + { typeof(TimeSpan), _time.WithPrecisionAndScale(6, null) }, + { typeof(TimeOnly), _timeonly }, + #endif + + // decimals + { typeof(float), _float }, + { typeof(double), _double }, + { typeof(decimal), _decimal }, + + { typeof(Data.Types.MySqlGeometry), _geometry } + }; + + // bool + bool tinyAsBool = _options.ConnectionSettings.TreatTinyAsBoolean; + _storeTypeMappings[tinyAsBool ? "tinyint(1)" : "bit(1)"] = new RelationalTypeMapping[] { tinyAsBool ? _tinyintBool : _bitBool }; + _clrTypeMappings[typeof(bool)] = tinyAsBool ? _tinyintBool : _bitBool; + + // Guid + if (_guid != null) + { + _storeTypeMappings[_guid!.StoreType] = new RelationalTypeMapping[] { _guid }; + _clrTypeMappings[typeof(Guid)] = _guid; + } + } + + /// + protected override RelationalTypeMapping? FindMapping(in RelationalTypeMappingInfo mappingInfo) + => base.FindMapping(mappingInfo) ?? + FindRawMapping(mappingInfo)?.Clone(mappingInfo); + + private RelationalTypeMapping? FindRawMapping(RelationalTypeMappingInfo mappingInfo) + { + if (!_initialized) + { + Initialize(); + _initialized = true; + } + + var clrType = mappingInfo.ClrType; + var storeTypeName = mappingInfo.StoreTypeName; + var storeTypeNameBase = mappingInfo.StoreTypeNameBase; + + if (storeTypeName != null) + { + if (_storeTypeMappings!.TryGetValue(storeTypeName, out var mapping)) + { + return clrType == null + ? mapping[0] + : mapping.FirstOrDefault(m => m.ClrType == clrType); + } + + if (_storeTypeMappings.TryGetValue(storeTypeNameBase!, out mapping)) + { +#if !NET8_0_OR_GREATER + return clrType == null + ? mapping[0].Clone(in mappingInfo) + : mapping.FirstOrDefault(m => m.ClrType == clrType)?.Clone(in mappingInfo); +#else + return clrType == null + ? mapping[0].WithTypeMappingInfo(mappingInfo) + : mapping.FirstOrDefault(m => m.ClrType == clrType)?.WithTypeMappingInfo(mappingInfo); +#endif + } + } + + if (clrType != null) + { + if (_clrTypeMappings!.TryGetValue(clrType, out var mapping)) + { + if (mappingInfo.Precision.HasValue) + { + if (clrType == typeof(DateTime) || + clrType == typeof(DateTimeOffset) || + clrType == typeof(TimeSpan)) + { +#if !NET8_0_OR_GREATER + return mapping.Clone(mappingInfo.Precision.Value, null); +#else + return mapping.WithPrecisionAndScale(mappingInfo.Precision.Value, null); +#endif + } + } + + return mapping; + } + else if (clrType == typeof(string)) + { + var isAnsi = mappingInfo.IsUnicode == false; + var isFixedLength = mappingInfo.IsFixedLength == true; + var size = mappingInfo.Size ?? (mappingInfo.IsKeyOrIndex ? + Math.Min(MAXKEYLENGTH / (_options.CharSet!.byteCount * 2), 255) + : null); + + if (size > 65_553 / _options.CharSet!.byteCount) + { + size = null; + isFixedLength = false; + } + + mapping = isFixedLength ? _charUnicode : size == null + ? _longtextUnicode : _varcharUnicode; + +#if !NET8_0_OR_GREATER + return size == null ? mapping : mapping.Clone($"{mapping.StoreTypeNameBase}({size})", size); +#else + return size == null ? mapping : mapping.WithStoreTypeAndSize($"{mapping.StoreTypeNameBase}({size})", size); +#endif + } + else if (clrType == typeof(byte[])) + { + bool isFixedLength = mappingInfo.IsFixedLength == true; + var size = mappingInfo.Size ?? (mappingInfo.IsKeyOrIndex ? MAXKEYLENGTH : null); + return new MySQLByteArrayTypeMapping( + size: size, + fixedLength: isFixedLength); + } + } + + return null; + } + +#if !NET8_0_OR_GREATER + protected override string ParseStoreTypeName(string? storeTypeName, out bool? unicode, out int? size, out int? precision, out int? scale) + { + var storeTypeBaseName = base.ParseStoreTypeName(storeTypeName, out unicode, out size, out precision, out scale); + + return (storeTypeName?.IndexOf("unsigned", StringComparison.OrdinalIgnoreCase) ?? -1) >= 0 + ? storeTypeBaseName + " unsigned" + : storeTypeBaseName!; + } +#else + protected string ParseStoreTypeName(string? storeTypeName, ref bool? unicode, ref int? size, ref int? precision, ref int? scale) + { + var storeTypeBaseName = base.ParseStoreTypeName(storeTypeName, ref unicode, ref size, ref precision, ref scale); + + return (storeTypeName?.IndexOf("unsigned", StringComparison.OrdinalIgnoreCase) ?? -1) >= 0 + ? storeTypeBaseName + " unsigned" + : storeTypeBaseName!; + } +#endif + } +} diff --git a/EFCore/src/Update/IMySQLUpdateSqlGenerator.cs b/EFCore/src/Update/IMySQLUpdateSqlGenerator.cs new file mode 100644 index 000000000..c27d2f48d --- /dev/null +++ b/EFCore/src/Update/IMySQLUpdateSqlGenerator.cs @@ -0,0 +1,65 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Update; +using Microsoft.Extensions.DependencyInjection; +using System.Collections.Generic; +using System.Text; + +namespace MySql.EntityFrameworkCore.Update +{ + /// + /// + /// The service lifetime is . This means a single instance + /// is used by many instances. The implementation must be thread-safe. + /// This service cannot depend on services registered as . + /// + /// + internal interface IMySQLUpdateSqlGenerator : IUpdateSqlGenerator + { + ResultSetMapping AppendBulkInsertOperation( + StringBuilder commandStringBuilder, + IReadOnlyList modificationCommands, + int commandPosition, + out bool requiresTransaction); + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + ResultSetMapping AppendBulkInsertOperation( + StringBuilder commandStringBuilder, + IReadOnlyList modificationCommands, + int commandPosition) + => AppendBulkInsertOperation(commandStringBuilder, modificationCommands, commandPosition, out _); + } + +} diff --git a/EFCore/src/Update/MySQLModificationCommandBatch.cs b/EFCore/src/Update/MySQLModificationCommandBatch.cs new file mode 100644 index 000000000..bb93a4762 --- /dev/null +++ b/EFCore/src/Update/MySQLModificationCommandBatch.cs @@ -0,0 +1,197 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Storage; +using Microsoft.EntityFrameworkCore.Update; +using MySql.Data.MySqlClient; +using MySql.EntityFrameworkCore.Properties; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.EntityFrameworkCore.Update +{ + /// + /// AffectedCountModificationCommandBatch implementation for MySQL + /// + internal class MySQLModificationCommandBatch : AffectedCountModificationCommandBatch + { + private const int DefaultNetworkPacketSizeBytes = 4096; + private const int MaxScriptLength = 65536 * DefaultNetworkPacketSizeBytes / 2; + private const int MaxParameterCount = 2100; + private readonly List _pendingBulkInsertCommands = new(); + + + + + + protected new virtual IMySQLUpdateSqlGenerator UpdateSqlGenerator => (IMySQLUpdateSqlGenerator)base.UpdateSqlGenerator; + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + public MySQLModificationCommandBatch(ModificationCommandBatchFactoryDependencies dependencies, int maxBatchSize) + : base(dependencies) => MaxBatchSize = maxBatchSize; + + /// + /// The maximum number of instances that can be added to a single batch. + /// + protected override int MaxBatchSize { get; } + + protected override void RollbackLastCommand(IReadOnlyModificationCommand modificationCommand) + { + if (_pendingBulkInsertCommands.Count > 0) + { + _pendingBulkInsertCommands.RemoveAt(_pendingBulkInsertCommands.Count - 1); + return; + } + + base.RollbackLastCommand(modificationCommand); + } + + protected override bool IsValid() + => SqlBuilder.Length < MaxScriptLength + && ParameterValues.Count + 1 < MaxParameterCount; + + private void ApplyPendingBulkInsertCommands() + { + if (_pendingBulkInsertCommands.Count == 0) + return; + + var commandPosition = ResultSetMappings.Count; + var resultSetMapping = UpdateSqlGenerator.AppendBulkInsertOperation( + SqlBuilder, _pendingBulkInsertCommands, commandPosition, out var requiresTransaction); + + foreach (var pendingCommand in _pendingBulkInsertCommands) + { + AddParameters(pendingCommand); + + ResultSetMappings.Add(resultSetMapping); + } + + if (resultSetMapping != ResultSetMapping.NoResults) + ResultSetMappings[^1] = ResultSetMapping.LastInResultSet; + } + + protected override void AddCommand(IReadOnlyModificationCommand modificationCommand) + { + if (modificationCommand.EntityState == EntityState.Added) + { + if (_pendingBulkInsertCommands.Count > 0 + && !CanBeInsertedInSameStatement(_pendingBulkInsertCommands[0], modificationCommand)) + { + ApplyPendingBulkInsertCommands(); + _pendingBulkInsertCommands.Clear(); + } + + _pendingBulkInsertCommands.Add(modificationCommand); + } + else + { + if (_pendingBulkInsertCommands.Count > 0) + { + ApplyPendingBulkInsertCommands(); + _pendingBulkInsertCommands.Clear(); + } + + base.AddCommand(modificationCommand); + } + } + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + public override void Complete(bool moreBatchesExpected) + { + ApplyPendingBulkInsertCommands(); + base.Complete(moreBatchesExpected); + } + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + public override void Execute(IRelationalConnection connection) + { + try + { + base.Execute(connection); + } + catch (DbUpdateException e) when (e.InnerException is MySqlException) + { + throw new DbUpdateException(MySQLStrings.SaveChangesFailed, e.InnerException, e.Entries); + } + } + + /// + /// This is an internal API that supports the Entity Framework Core infrastructure and not subject to + /// the same compatibility standards as public APIs. It may be changed or removed without notice in + /// any release. You should only use it directly in your code with extreme caution and knowing that + /// doing so can result in application failures when updating to a new Entity Framework Core release. + /// + public override async Task ExecuteAsync(IRelationalConnection connection, CancellationToken cancellationToken = default) + { + try + { + await base.ExecuteAsync(connection, cancellationToken).ConfigureAwait(false); + } + catch (DbUpdateException e) when (e.InnerException is MySqlException) + { + throw new DbUpdateException(MySQLStrings.SaveChangesFailed, e.InnerException, e.Entries); + } + } + + + private static bool CanBeInsertedInSameStatement( + IReadOnlyModificationCommand firstCommand, + IReadOnlyModificationCommand secondCommand) + => firstCommand.TableName == secondCommand.TableName + && firstCommand.Schema == secondCommand.Schema + && firstCommand.ColumnModifications.Where(o => o.IsWrite).Select(o => o.ColumnName).SequenceEqual( + secondCommand.ColumnModifications.Where(o => o.IsWrite).Select(o => o.ColumnName)) + && firstCommand.ColumnModifications.Where(o => o.IsRead).Select(o => o.ColumnName).SequenceEqual( + secondCommand.ColumnModifications.Where(o => o.IsRead).Select(o => o.ColumnName)); + + + + + } +} diff --git a/EFCore/src/Update/MySQLModificationCommandBatchFactory.cs b/EFCore/src/Update/MySQLModificationCommandBatchFactory.cs new file mode 100644 index 000000000..e03dd8e76 --- /dev/null +++ b/EFCore/src/Update/MySQLModificationCommandBatchFactory.cs @@ -0,0 +1,76 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Update; +using MySql.EntityFrameworkCore.Infrastructure.Internal; +using MySql.EntityFrameworkCore.Utils; +using System; +using System.Linq; + +namespace MySql.EntityFrameworkCore.Update +{ + /// + /// IModificationCommandBatchFactory implemntation for MySQL + /// + internal class MySQLModificationCommandBatchFactory : IModificationCommandBatchFactory + { + private const int DefaultMaxBatchSize = 42; + private const int MaxMaxBatchSize = 1000; + private readonly int _maxBatchSize; + + /// + /// Relational provider-specific dependencies for this service. + /// + protected virtual ModificationCommandBatchFactoryDependencies Dependencies { get; } + + public MySQLModificationCommandBatchFactory( + [NotNull] ModificationCommandBatchFactoryDependencies dependencies, + [NotNull] IDbContextOptions options) + { + Check.NotNull(dependencies, nameof(dependencies)); + Check.NotNull(options, nameof(options)); + + Dependencies = dependencies; + + _maxBatchSize = Math.Min( + options.Extensions.OfType().FirstOrDefault()?.MaxBatchSize ?? DefaultMaxBatchSize, + MaxMaxBatchSize); + + if (_maxBatchSize <= 0) + { + throw new ArgumentOutOfRangeException( + nameof(RelationalOptionsExtension.MaxBatchSize), RelationalStrings.InvalidMaxBatchSize(_maxBatchSize)); + } + } + + public virtual ModificationCommandBatch Create() + => new MySQLModificationCommandBatch(Dependencies, _maxBatchSize); + } +} diff --git a/EFCore/src/Update/MySQLUpdateSqlGenerator.cs b/EFCore/src/Update/MySQLUpdateSqlGenerator.cs new file mode 100644 index 000000000..7caf477ec --- /dev/null +++ b/EFCore/src/Update/MySQLUpdateSqlGenerator.cs @@ -0,0 +1,427 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Update; +using Microsoft.Extensions.DependencyInjection; +using MySql.EntityFrameworkCore.Extensions; +using MySql.EntityFrameworkCore.Metadata; +using MySql.EntityFrameworkCore.Update; +using MySql.EntityFrameworkCore.Utils; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.Linq; +using System.Text; + +namespace MySql.EntityFrameworkCore +{ + /// + /// + /// The service lifetime is . This means a single instance + /// is used by many instances. The implementation must be thread-safe. + /// This service cannot depend on services registered as . + /// + /// + internal class MySQLUpdateSqlGenerator : UpdateAndSelectSqlGenerator, IMySQLUpdateSqlGenerator + { + public MySQLUpdateSqlGenerator([NotNull] UpdateSqlGeneratorDependencies dependencies) + : base(dependencies) + { + } + +#if NET8_0_OR_GREATER + public virtual ResultSetMapping AppendBulkInsertOperation( + StringBuilder commandStringBuilder, + IReadOnlyList modificationCommands, + int commandPosition, + out bool requiresTransaction) + { + requiresTransaction = false; + var firstCommand = modificationCommands[0]; + var table = StoreObjectIdentifier.Table(firstCommand.TableName, firstCommand.Schema); + + if (modificationCommands.Count == 1 + && firstCommand.ColumnModifications.All( + o => !o.IsKey + || !o.IsRead + || o.Property?.GetValueGenerationStrategy(table) == MySQLValueGenerationStrategy.IdentityColumn)) + { + return AppendInsertOperation(commandStringBuilder, firstCommand, commandPosition, out requiresTransaction); + } + + var readOperations = firstCommand.ColumnModifications.Where(o => o.IsRead).ToList(); + var writeOperations = firstCommand.ColumnModifications.Where(o => o.IsWrite).ToList(); + var keyOperations = firstCommand.ColumnModifications.Where(o => o.IsKey).ToList(); + + var defaultValuesOnly = writeOperations.Count == 0; + var nonIdentityOperations = firstCommand.ColumnModifications + .Where(o => o.Property?.GetValueGenerationStrategy(table) != MySQLValueGenerationStrategy.IdentityColumn) + .ToList(); + + if (defaultValuesOnly) + { + if (nonIdentityOperations.Count == 0 || readOperations.Count == 0) + { + requiresTransaction = modificationCommands.Count > 1; + foreach (var modification in modificationCommands) + { + AppendInsertOperation(commandStringBuilder, modification, commandPosition, out var localRequiresTransaction); + requiresTransaction = requiresTransaction || localRequiresTransaction; + } + + return readOperations.Count == 0 + ? ResultSetMapping.NoResults + : ResultSetMapping.LastInResultSet; + } + + if (nonIdentityOperations.Count > 1) + { + nonIdentityOperations = new List { nonIdentityOperations.First() }; + } + } + + if (readOperations.Count == 0) + { + return AppendInsertMultipleRows(commandStringBuilder, modificationCommands, writeOperations, out requiresTransaction); + } + + foreach (var modification in modificationCommands) + { + AppendInsertOperation(commandStringBuilder, modification, commandPosition, out requiresTransaction); + } + + return ResultSetMapping.LastInResultSet; + } + + + private ResultSetMapping AppendInsertMultipleRows( + StringBuilder commandStringBuilder, + IReadOnlyList modificationCommands, + List writeOperations, + out bool requiresTransaction) + { + Debug.Assert(writeOperations.Count > 0); + + var name = modificationCommands[0].TableName; + var schema = modificationCommands[0].Schema; + + AppendInsertCommandHeader(commandStringBuilder, name, schema, writeOperations); + AppendValuesHeader(commandStringBuilder, writeOperations); + AppendValues(commandStringBuilder, name, schema, writeOperations); + + for (var i = 1; i < modificationCommands.Count; i++) + { + commandStringBuilder.Append(","); + AppendValues(commandStringBuilder, name, schema, modificationCommands[i].ColumnModifications.Where(o => o.IsWrite).ToList()); + } + + commandStringBuilder.Append(SqlGenerationHelper.StatementTerminator).AppendLine(); + requiresTransaction = false; + + return ResultSetMapping.NoResults; + } + + public override ResultSetMapping AppendInsertOperation( + StringBuilder commandStringBuilder, + IReadOnlyModificationCommand command, + int commandPosition, + out bool requiresTransaction) + => AppendInsertOperation(commandStringBuilder, command, commandPosition, overridingSystemValue: false, out requiresTransaction); + + public virtual ResultSetMapping AppendInsertOperation( + StringBuilder commandStringBuilder, + IReadOnlyModificationCommand command, + int commandPosition, + bool overridingSystemValue, + out bool requiresTransaction) + { + requiresTransaction = false; + var name = command.TableName; + var schema = command.Schema; + var operations = command.ColumnModifications; + + var writeOperations = operations.Where(o => o.IsWrite).ToList(); + var readOperations = operations.Where(o => o.IsRead).ToList(); + + AppendInsertCommand(commandStringBuilder, name, schema, writeOperations, readOperations, overridingSystemValue); + + if (readOperations.Count > 0) + { + var keyOperations = operations.Where(o => o.IsKey).ToList(); + return AppendSelectAffectedCommand(commandStringBuilder, name, schema, readOperations, keyOperations); + } + + return AppendSelectAffectedCountCommand(commandStringBuilder, name, schema, commandPosition); + } + + protected virtual void AppendInsertCommand( + StringBuilder commandStringBuilder, + string name, + string? schema, + IReadOnlyList writeOperations, + IReadOnlyList readOperations, + bool overridingSystemValue) + { + AppendInsertCommandHeader(commandStringBuilder, name, schema, writeOperations); + AppendValuesHeader(commandStringBuilder, writeOperations); + AppendValues(commandStringBuilder, name, schema, writeOperations); + commandStringBuilder.AppendLine(SqlGenerationHelper.StatementTerminator); + } + + public override ResultSetMapping AppendUpdateOperation( + StringBuilder commandStringBuilder, + IReadOnlyModificationCommand command, + int commandPosition, + out bool requiresTransaction) + { + Check.NotNull(commandStringBuilder, nameof(commandStringBuilder)); + Check.NotNull(command, nameof(command)); + + requiresTransaction = false; + var name = command.TableName; + var schema = command.Schema; + var operations = command.ColumnModifications; + + var writeOperations = operations.Where(o => o.IsWrite).ToList(); + var conditionOperations = operations.Where(o => o.IsCondition).ToList(); + var readOperations = operations.Where(o => o.IsRead).ToList(); + + AppendUpdateCommand(commandStringBuilder, name, schema, writeOperations, readOperations, conditionOperations); + + if (readOperations.Count > 0) + { + var keyOperations = operations.Where(o => o.IsKey).ToList(); + + return AppendSelectAffectedCommand(commandStringBuilder, name, schema, readOperations, keyOperations); + } + + return AppendSelectAffectedCountCommand(commandStringBuilder, name, schema, commandPosition); + } + + public override ResultSetMapping AppendDeleteOperation( + StringBuilder commandStringBuilder, + IReadOnlyModificationCommand command, + int commandPosition, + out bool requiresTransaction) + { + // The default implementation adds RETURNING 1 to do concurrency check (was the row actually deleted), but in PostgreSQL we check + // the per-statement row-affected value exposed by Npgsql in the batch; so no need for RETURNING 1. + var name = command.TableName; + var schema = command.Schema; + var conditionOperations = command.ColumnModifications.Where(o => o.IsCondition).ToList(); + + requiresTransaction = false; + + AppendDeleteCommand(commandStringBuilder, name, schema, Array.Empty(), conditionOperations); + + return AppendSelectAffectedCountCommand(commandStringBuilder, name, schema,commandPosition); + } + + protected override void AppendValues( + [NotNull] StringBuilder commandStringBuilder, + [NotNull] string name, + string? schema, + [NotNull] IReadOnlyList operations) + { + base.AppendValues(commandStringBuilder, name, schema, operations); + + if (operations.Count <= 0) + { + commandStringBuilder.Append("()"); + } + } + + /// + /// Appends a SQL command for selecting affected data. + /// + /// The builder to which the SQL should be appended. + /// The name of the table. + /// The table schema, or to use the default schema. + /// The operations representing the data to be read. + /// The operations used to generate the WHERE clause for the select. + /// The for this command. + private ResultSetMapping AppendSelectAffectedCommand( + StringBuilder commandStringBuilder, + string name, + string? schema, + IReadOnlyList readOperations, + IReadOnlyList conditionOperations) + { + Check.NotNull(commandStringBuilder, nameof(commandStringBuilder)); + Check.NotEmpty(name, nameof(name)); + Check.NotNull(readOperations, nameof(readOperations)); + Check.NotNull(conditionOperations, nameof(conditionOperations)); + + AppendSelectCommandHeader(commandStringBuilder, readOperations); + AppendFromClause(commandStringBuilder, name, schema); + AppendWhereAffectedClause(commandStringBuilder, conditionOperations); + commandStringBuilder.AppendLine(SqlGenerationHelper.StatementTerminator) + .AppendLine(); + + return ResultSetMapping.LastInResultSet; + } + + /// + /// Appends a SQL fragment for starting a SELECT. + /// + /// The builder to which the SQL should be appended. + /// The operations representing the data to be read. + private void AppendSelectCommandHeader( + StringBuilder commandStringBuilder, + IReadOnlyList operations) + { + Check.NotNull(commandStringBuilder, nameof(commandStringBuilder)); + Check.NotNull(operations, nameof(operations)); + + commandStringBuilder + .Append("SELECT ") + .AppendJoin( + operations, + SqlGenerationHelper, + (sb, o, helper) => helper.DelimitIdentifier(sb, o.ColumnName)); + } + + /// + /// Appends a SQL fragment for starting a FROM clause. + /// + /// The builder to which the SQL should be appended. + /// The name of the table. + /// The table schema, or to use the default schema. + private void AppendFromClause( + StringBuilder commandStringBuilder, + string name, + string? schema) + { + Check.NotNull(commandStringBuilder, nameof(commandStringBuilder)); + Check.NotEmpty(name, nameof(name)); + + commandStringBuilder + .AppendLine() + .Append("FROM "); + + SqlGenerationHelper.DelimitIdentifier(commandStringBuilder, name, schema); + } + + /// + /// Appends a WHERE clause involving rows affected. + /// + /// The builder to which the SQL should be appended. + /// The operations from which to build the conditions. + protected virtual void AppendWhereAffectedClause( + StringBuilder commandStringBuilder, + IReadOnlyList operations) + { + Check.NotNull(commandStringBuilder, nameof(commandStringBuilder)); + Check.NotNull(operations, nameof(operations)); + + commandStringBuilder + .AppendLine() + .Append("WHERE "); + + AppendRowsAffectedWhereCondition(commandStringBuilder, 1); + + if (operations.Count > 0) + { + commandStringBuilder + .Append(" AND ") + .AppendJoin( + operations, (sb, v) => + { + if (v.IsKey) + { + if (!v.IsRead) + { + AppendWhereCondition(sb, v, v.UseOriginalValueParameter); + return true; + } + } + + if (IsIdentityOperation(v)) + { + AppendIdentityWhereCondition(sb, v); + return true; + } + + return false; + }, " AND "); + } + } + + protected override void AppendReturningClause(StringBuilder commandStringBuilder, IReadOnlyList operations, string? additionalValues = null) + { + if (additionalValues is not null) + { + if (operations.Count > 0) + { + commandStringBuilder.Append(", "); + } + + commandStringBuilder.Append('1'); + } + } + + protected override void AppendRowsAffectedWhereCondition(StringBuilder commandStringBuilder, int expectedRowsAffected) + { + Check.NotNull(commandStringBuilder, "commandStringBuilder"); + commandStringBuilder + .Append("ROW_COUNT() = " + expectedRowsAffected.ToString(CultureInfo.InvariantCulture)); + } + + /// + /// Returns a value indicating whether the given modification represents an auto-incrementing column. + /// + /// The column modification. + /// if the given modification represents an auto-incrementing column. + protected virtual bool IsIdentityOperation(IColumnModification modification) + => modification.IsKey && modification.IsRead; + + protected override void AppendIdentityWhereCondition(StringBuilder commandStringBuilder, IColumnModification columnModification) + { + Check.NotNull(columnModification, "columnModification"); + Check.NotNull(commandStringBuilder, "commandStringBuilder"); + commandStringBuilder.AppendFormat("{0} = LAST_INSERT_ID()", SqlGenerationHelper.DelimitIdentifier(columnModification.ColumnName)); + } + + protected override ResultSetMapping AppendSelectAffectedCountCommand(StringBuilder commandStringBuilder, string name, string? schemaName, int commandPosition) + { + Check.NotNull(commandStringBuilder, "commandStringBuilder"); + Check.NotEmpty(name, "name"); + + commandStringBuilder + .Append("SELECT ROW_COUNT()") + .Append(SqlGenerationHelper.StatementTerminator).AppendLine() + .AppendLine(); + + return ResultSetMapping.ResultSetWithRowsAffectedOnly; + } +#endif + } +} diff --git a/EFCore/src/Utils/Check.cs b/EFCore/src/Utils/Check.cs new file mode 100644 index 000000000..2b6408fdb --- /dev/null +++ b/EFCore/src/Utils/Check.cs @@ -0,0 +1,193 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Diagnostics; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using System.Reflection; +using static MySql.EntityFrameworkCore.Utils.CodeAnnotations; + +namespace MySql.EntityFrameworkCore.Utils +{ + [DebuggerStepThrough] + internal static class Check + { + [ContractAnnotation("value:null => halt")] + public static T NotNull([NoEnumeration] T value, [InvokerParameterName][NotNull] string parameterName) + { + if (value == null) + { + NotEmpty(parameterName, nameof(parameterName)); + + throw new ArgumentNullException(parameterName); + } + + return value; + } + + [ContractAnnotation("value:null => halt")] + public static T NotNull( + [NoEnumeration] T value, + [InvokerParameterName][NotNull] string parameterName, + [NotNull] string propertyName) + { + if (value == null) + { + NotEmpty(parameterName, nameof(parameterName)); + NotEmpty(propertyName, nameof(propertyName)); + + throw new ArgumentException(CoreStrings.ArgumentPropertyNull(propertyName, parameterName)); + } + + return value; + } + + [ContractAnnotation("value:null => halt")] + public static IReadOnlyList NotEmpty(IReadOnlyList value, [InvokerParameterName][NotNull] string parameterName) + { + NotNull(value, parameterName); + + if (value.Count == 0) + { + NotEmpty(parameterName, nameof(parameterName)); + + throw new ArgumentException(CoreStrings.ArgumentPropertyNull(value, parameterName)); + } + + return value; + } + + [ContractAnnotation("value:null => halt")] + public static string NotEmpty(string value, [InvokerParameterName][NotNull] string parameterName) + { + Exception? e = null; + if (value is null) + { + e = new ArgumentNullException(parameterName); + } + else if (value.Trim().Length == 0) + { + e = new ArgumentException(CoreStrings.ArgumentPropertyNull(value, parameterName)); + } + + if (e != null) + { + NotEmpty(parameterName, nameof(parameterName)); + + throw e; + } + + return value!; + } + + public static string? NullButNotEmpty(string value, [InvokerParameterName][NotNull] string parameterName) + { + if (value is object + && value.Length == 0) + { + NotEmpty(parameterName, nameof(parameterName)); + + throw new ArgumentException(CoreStrings.ArgumentPropertyNull(value, parameterName)); + } + + return value; + } + + public static TEnum? NullOrEnumValue(TEnum? value, [InvokerParameterName][NotNull] string parameterName) where TEnum : struct + { + if (value is not null) + { + if (!Enum.IsDefined(typeof(TEnum), value)) + { + throw new ArgumentOutOfRangeException(parameterName, value, null); + } + } + + return value; + } + + public static IReadOnlyList HasNoNulls(IReadOnlyList value, [InvokerParameterName][NotNull] string parameterName) + where T : class + { + NotNull(value, parameterName); + + if (value.Any(e => e == null)) + { + NotEmpty(parameterName, nameof(parameterName)); + + throw new ArgumentException(parameterName); + } + + return value; + } + + public static T IsDefined(T value, [InvokerParameterName][NotNull] string parameterName) + where T : struct + { + if (!Enum.IsDefined(typeof(T), value)) + { + NotEmpty(parameterName, nameof(parameterName)); + + throw new ArgumentException(CoreStrings.InvalidEnumValue(value, parameterName, typeof(T))); + } + + return value; + } + + public static Type ValidEntityType(Type value, [InvokerParameterName][NotNull] string parameterName) + { + if (!value.GetTypeInfo().IsClass) + { + NotEmpty(parameterName, nameof(parameterName)); + + throw new ArgumentException(CoreStrings.InvalidEntityType(value)); + } + + return value; + } + + [Conditional("DEBUG")] + public static void DebugAssert([DoesNotReturnIf(false)] bool condition, string message) + { + if (!condition) + { + throw new Exception($"Check.DebugAssert failed: {message}"); + } + } + + internal static IEnumerable GetTrueValuesArray(int counter) + => Enumerable.Repeat(true, counter); + + internal static IEnumerable GetFalseValuesArray(int counter) + => Enumerable.Repeat(false, counter); + + } +} diff --git a/EFCore/src/Utils/CodeAnnotations.cs b/EFCore/src/Utils/CodeAnnotations.cs new file mode 100644 index 000000000..1ee0e5880 --- /dev/null +++ b/EFCore/src/Utils/CodeAnnotations.cs @@ -0,0 +1,60 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; + +namespace MySql.EntityFrameworkCore.Utils +{ + internal class CodeAnnotations + { + [AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] + internal sealed class ContractAnnotationAttribute : Attribute + { + public string Contract { get; } + + public bool ForceFullStates { get; } + + public ContractAnnotationAttribute([NotNull] string contract) + : this(contract, false) + { + } + + public ContractAnnotationAttribute([NotNull] string contract, bool forceFullStates) + { + Contract = contract; + ForceFullStates = forceFullStates; + } + } + + [AttributeUsage(AttributeTargets.Parameter)] + internal sealed class NoEnumerationAttribute : Attribute { } + + [AttributeUsage(AttributeTargets.Parameter)] + internal sealed class InvokerParameterNameAttribute : Attribute { } + } +} diff --git a/EFCore/src/Utils/CodeAttributes.cs b/EFCore/src/Utils/CodeAttributes.cs new file mode 100644 index 000000000..dda508d4f --- /dev/null +++ b/EFCore/src/Utils/CodeAttributes.cs @@ -0,0 +1,38 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; + +namespace MySql.EntityFrameworkCore +{ + [AttributeUsage(AttributeTargets.All)] + internal sealed class NotNullAttribute : Attribute { } + + [AttributeUsage(AttributeTargets.All)] + internal sealed class CanBeNullAttribute : Attribute { } +} diff --git a/EFCore/src/Utils/SharedTypeExtensions.cs b/EFCore/src/Utils/SharedTypeExtensions.cs new file mode 100644 index 000000000..b09c5b396 --- /dev/null +++ b/EFCore/src/Utils/SharedTypeExtensions.cs @@ -0,0 +1,109 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Reflection; + +namespace MySql.EntityFrameworkCore.Utils +{ + [DebuggerStepThrough] + internal static class SharedTypeExtensions + { + public static Type UnwrapNullableType(this Type type) => Nullable.GetUnderlyingType(type) ?? type; + + public static bool IsNullableType(this Type type) + { + var typeInfo = type.GetTypeInfo(); + + return !typeInfo.IsValueType + || (typeInfo.IsGenericType + && typeInfo.GetGenericTypeDefinition() == typeof(Nullable<>)); + } + + public static bool IsInteger(this Type type) + { + type = type.UnwrapNullableType(); + + return type == typeof(int) + || type == typeof(long) + || type == typeof(short) + || type == typeof(byte) + || type == typeof(uint) + || type == typeof(ulong) + || type == typeof(ushort) + || type == typeof(sbyte) + || type == typeof(char); + } + + public static bool CanBeAutoIncrement(this Type type) + { + return IsInteger(type) + || type == typeof(float) + || type == typeof(double); + } + + private static readonly Dictionary _commonTypeDictionary = new Dictionary + { + { typeof(int), default(int) }, + { typeof(Guid), default(Guid) }, + { typeof(DateOnly), default(DateOnly) }, + { typeof(DateTime), default(DateTime) }, + { typeof(DateTimeOffset), default(DateTimeOffset) }, + { typeof(TimeOnly), default(TimeOnly) }, + { typeof(long), default(long) }, + { typeof(bool), default(bool) }, + { typeof(double), default(double) }, + { typeof(short), default(short) }, + { typeof(float), default(float) }, + { typeof(byte), default(byte) }, + { typeof(char), default(char) }, + { typeof(uint), default(uint) }, + { typeof(ushort), default(ushort) }, + { typeof(ulong), default(ulong) }, + { typeof(sbyte), default(sbyte) } + }; + + public static object? GetDefaultValue(this Type type) + { + if (!type.GetTypeInfo().IsValueType) + { + return null; + } + + return _commonTypeDictionary.TryGetValue(type, out var value) + ? value + : Activator.CreateInstance(type); + } + + public static MethodInfo GetRequiredRuntimeMethod(this Type type, string name, params Type[] parameters) + => type.GetTypeInfo().GetRuntimeMethod(name, parameters) + ?? throw new InvalidOperationException($"Could not find method '{name}' on type '{type}'"); + } +} diff --git a/EFCore/src/Utils/Static.cs b/EFCore/src/Utils/Static.cs new file mode 100644 index 000000000..42e67383d --- /dev/null +++ b/EFCore/src/Utils/Static.cs @@ -0,0 +1,118 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace MySql.EntityFrameworkCore.Utils +{ + /// + /// Initializes and retrieves an array of Boolean values with an specific number of elements and values. + /// + internal static class Statics + { + internal static readonly bool[][] TrueArrays = + { + Array.Empty(), + new[] { true }, + new[] { true, true }, + new[] { true, true, true }, + new[] { true, true, true, true }, + new[] { true, true, true, true, true }, + new[] { true, true, true, true, true, true }, + new[] { true, true, true, true, true, true, true }, + new[] { true, true, true, true, true, true, true, true }, + new[] { true, true, true, true, true, true, true, true, true }, + new[] { true, true, true, true, true, true, true, true, true, true }, + new[] { true, true, true, true, true, true, true, true, true, true, true }, + new[] { true, true, true, true, true, true, true, true, true, true, true, true }, + new[] { true, true, true, true, true, true, true, true, true, true, true, true, true }, + new[] { true, true, true, true, true, true, true, true, true, true, true, true, true, true }, + new[] { true, true, true, true, true, true, true, true, true, true, true, true, true, true, true }, + new[] { true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true }, + }; + + internal static readonly bool[][] FalseArrays = + { + Array.Empty(), + new[] { false }, + new[] { false, false }, + new[] { false, false, false }, + new[] { false, false, false, false }, + new[] { false, false, false, false, false }, + new[] { false, false, false, false, false, false }, + new[] { false, false, false, false, false, false, false }, + new[] { false, false, false, false, false, false, false, false }, + new[] { false, false, false, false, false, false, false, false, false }, + new[] { false, false, false, false, false, false, false, false, false, false }, + new[] { false, false, false, false, false, false, false, false, false, false, false }, + new[] { false, false, false, false, false, false, false, false, false, false, false, false }, + new[] { false, false, false, false, false, false, false, false, false, false, false, false, false }, + new[] { false, false, false, false, false, false, false, false, false, false, false, false, false, false }, + new[] { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, + new[] { false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false }, + }; + + internal static IEnumerable GetTrueValues(int dimensions) + => dimensions <= 16 + ? TrueArrays[dimensions] + : Enumerable.Repeat(true, dimensions); + + internal static IEnumerable GetFalseValues(int dimensions) + => dimensions <= 16 + ? FalseArrays[dimensions] + : Enumerable.Repeat(true, dimensions); + } + internal static class ByteArrayFormatter + { + private static readonly char[] _lookup = new char[16] + { + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' + }; + + public static string ToHex([NotNull] byte[] b) + { + if (b.Length == 0) + { + return "X''"; + } + + var builder = new StringBuilder("0x", 2 + (b.Length * 2)); + for (var i = 0; i < b.Length; i++) + { + var b1 = (byte)(b[i] >> 4); + var b2 = (byte)(b[i] & 0xF); + builder.Append(_lookup[b1]); + builder.Append(_lookup[b2]); + } + return builder.ToString(); + } + } +} diff --git a/EFCore/src/Utils/StringBuilderExtensions.cs b/EFCore/src/Utils/StringBuilderExtensions.cs new file mode 100644 index 000000000..1a431a88d --- /dev/null +++ b/EFCore/src/Utils/StringBuilderExtensions.cs @@ -0,0 +1,137 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Collections.Generic; +using System.Globalization; + +namespace System.Text; + +internal static class StringBuilderExtensions +{ + public static StringBuilder AppendJoin( + this StringBuilder stringBuilder, + IEnumerable values, + string separator = ", ") + => stringBuilder.AppendJoin(values, (sb, value) => sb.Append(value), separator); + + public static StringBuilder AppendJoin( + this StringBuilder stringBuilder, + string separator, + params string[] values) + => stringBuilder.AppendJoin(values, (sb, value) => sb.Append(value), separator); + + public static StringBuilder AppendJoin( + this StringBuilder stringBuilder, + IEnumerable values, + Action joinAction, + string separator = ", ") + { + var appended = false; + + foreach (var value in values) + { + joinAction(stringBuilder, value); + stringBuilder.Append(separator); + appended = true; + } + + if (appended) + { + stringBuilder.Length -= separator.Length; + } + + return stringBuilder; + } + + public static StringBuilder AppendJoin( + this StringBuilder stringBuilder, + IEnumerable values, + Func joinFunc, + string separator = ", ") + { + var appended = false; + + foreach (var value in values) + { + if (joinFunc(stringBuilder, value)) + { + stringBuilder.Append(separator); + appended = true; + } + } + + if (appended) + { + stringBuilder.Length -= separator.Length; + } + + return stringBuilder; + } + + public static StringBuilder AppendJoin( + this StringBuilder stringBuilder, + IEnumerable values, + TParam param, + Action joinAction, + string separator = ", ") + { + var appended = false; + + foreach (var value in values) + { + joinAction(stringBuilder, value, param); + stringBuilder.Append(separator); + appended = true; + } + + if (appended) + { + stringBuilder.Length -= separator.Length; + } + + return stringBuilder; + } + + public static void AppendBytes(this StringBuilder builder, byte[] bytes) + { + builder.Append("'0x"); + + for (var i = 0; i < bytes.Length; i++) + { + if (i > 31) + { + builder.Append("..."); + break; + } + + builder.Append(bytes[i].ToString("X2", CultureInfo.InvariantCulture)); + } + + builder.Append('\''); + } +} diff --git a/EFCore/src/ValueGeneration/Internal/MySQLValueGeneratorSelector.cs b/EFCore/src/ValueGeneration/Internal/MySQLValueGeneratorSelector.cs new file mode 100644 index 000000000..81137081b --- /dev/null +++ b/EFCore/src/ValueGeneration/Internal/MySQLValueGeneratorSelector.cs @@ -0,0 +1,87 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.ValueGeneration; +using Microsoft.Extensions.DependencyInjection; +using MySql.EntityFrameworkCore.Utils; +using System; + +namespace MySql.EntityFrameworkCore.ValueGeneration.Internal +{ + /// + /// + /// The service lifetime is . This means that each + /// instance will use its own instance of this service. + /// The implementation may depend on other services registered with any lifetime. + /// The implementation does not need to be thread-safe. + /// + /// + internal class MySQLValueGeneratorSelector : RelationalValueGeneratorSelector + { + public MySQLValueGeneratorSelector( + [NotNull] ValueGeneratorSelectorDependencies dependencies) + : base(dependencies) + { + } + + + #if NET8_0_OR_GREATER + /// + public ValueGenerator Create(IProperty property, IEntityType entityType) + { + Check.NotNull(property, nameof(property)); + Check.NotNull(entityType, nameof(entityType)); + + var ret = property.ClrType.UnwrapNullableType() == typeof(Guid) + ? property.ValueGenerated == ValueGenerated.Never + || property.GetDefaultValueSql() != null + ? (ValueGenerator)new TemporaryGuidValueGenerator() + : new SequentialGuidValueGenerator() + : base.Create(property, entityType); + return ret; + } +#else + /// + public override ValueGenerator Create(IProperty property, IEntityType entityType) + { + Check.NotNull(property, nameof(property)); + Check.NotNull(entityType, nameof(entityType)); + + var ret = property.ClrType.UnwrapNullableType() == typeof(Guid) + ? property.ValueGenerated == ValueGenerated.Never + || property.GetDefaultValueSql() != null + ? (ValueGenerator)new TemporaryGuidValueGenerator() + : new SequentialGuidValueGenerator() + : base.Create(property, entityType); + return ret; + } +#endif + } +} diff --git a/EFCore/tests/MySql.EFCore.Basic.Tests/BasicGuidTests.cs b/EFCore/tests/MySql.EFCore.Basic.Tests/BasicGuidTests.cs new file mode 100644 index 000000000..413d83328 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Basic.Tests/BasicGuidTests.cs @@ -0,0 +1,113 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using MySql.EntityFrameworkCore.Basic.Tests.Utils; +using MySql.EntityFrameworkCore.Infrastructure.Internal; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Linq; + +namespace MySql.EntityFrameworkCore.Basic.Tests +{ + public class BasicGuidTests + { + [OneTimeTearDown] + public void OneTimeTearDown() + { + using (var context = new ContextGUID()) + context.Database.EnsureDeleted(); + } + + /// + /// Bug #32173133 CAN'T FILTER WITH CONTAINS IN ENTITYFRAMEWORKCORE FOR GUID OR BYTE[] FIELDS + /// + + [Test] + public void TestEmptyGUID() + { + MySQLTestStore.Execute("drop database if exists DbContextGuid; Create database DbContextGuid; "); + using (var context = new ContextGUID()) + { + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + var filter = new[] { Guid.Empty }; + var resultFilter = context.Guidtable.Where(t => filter.Contains(t.Uuid)).ToArray(); + Assert.That(resultFilter, Is.Not.Null); + Random rnd = new Random(); + var guid = Guid.NewGuid(); + var record = new GuidTable { Id = rnd.Next(100), Uuid = guid }; + context.Guidtable.Add(record); + context.SaveChanges(); + var rows = context.Guidtable.Count(); + Assert.That(rows, Is.EqualTo(1)); + filter[0] = guid; + var resultFilter2 = context.Guidtable.Where(t => filter.Contains(t.Uuid)).ToArray(); + Assert.That(resultFilter2.Count(), Is.EqualTo(1)); + } + } + + public class GuidTable + { + public int Id { get; set; } + public Guid Uuid { get; set; } + } + + public class ContextGUID : DbContext + { + public DbSet Guidtable { get; set; } + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + // get the class name of the caller to get a unique name for the database + if (!optionsBuilder.IsConfigured + || optionsBuilder.Options.FindExtension() == null) + { + optionsBuilder.UseMySQL($"server=localhost;user id=root;password=;port={MySQLTestStore.Port()};OldGuids=true;pooling = false;database=DbContextGuid;defaultcommandtimeout=50;"); + } + } + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id); + + entity.ToTable("GuidTable"); + + entity.Property(e => e.Id) + .HasColumnName("id") + .HasColumnType("int"); + + entity.Property(e => e.Uuid) + .HasColumnName("uuid") + .HasColumnType("binary(16)"); + }); + } + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Basic.Tests/ConcurrencyTests.cs b/EFCore/tests/MySql.EFCore.Basic.Tests/ConcurrencyTests.cs new file mode 100644 index 000000000..feb4024b3 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Basic.Tests/ConcurrencyTests.cs @@ -0,0 +1,192 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using MySql.EntityFrameworkCore.Basic.Tests.DbContextClasses; +using MySql.EntityFrameworkCore.Extensions; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Linq; + +namespace MySql.EntityFrameworkCore.Basic.Tests +{ + public class ConcurrencyTests + { + [Test] + public void CanHandleConcurrencyConflicts() + { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddEntityFrameworkMySQL().AddDbContext(); + + var serviceProvider = serviceCollection.BuildServiceProvider(); + + using (var context = serviceProvider.GetRequiredService()) + { + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + + context.People.Add(new Person { Name = "John Doe", PersonNumber = "3333333333", PhoneNumber = "1111111111" }); + context.SaveChanges(); + + var person = context.People.Single(p => p.PersonId == 1); + person.PersonNumber = "4444444444"; + + context.Database.ExecuteSqlInterpolated($"UPDATE People SET Name = 'Jane' WHERE PersonId = 1"); + + try + { + context.SaveChanges(); + } + catch (DbUpdateConcurrencyException ex) + { + foreach (var entry in ex.Entries) + { + if (entry.Entity is Person) + { + // Using a NoTracking query means we get the entity but it is not tracked by the context + // and will not be merged with existing entities in the context. + var databaseEntity = context.People.AsNoTracking().Single(p => p.PersonId == ((Person)entry.Entity).PersonId); + var databaseEntry = context.Entry(databaseEntity); + + foreach (var property in entry.Metadata.GetProperties()) + { + if (property.Name.Equals("Name")) + { + var proposedValue = entry.Property(property.Name).CurrentValue; + var originalValue = entry.Property(property.Name).OriginalValue; + var databaseValue = databaseEntry.Property(property.Name).CurrentValue; + entry.Property(property.Name).OriginalValue = databaseEntry.Property(property.Name).CurrentValue; + Assert.That(databaseValue, Is.EqualTo("Jane")); + } + } + } + else + { + throw new NotSupportedException("Don't know how to handle concurrency conflicts for " + entry.Metadata.Name); + } + } + + // Retry the save operation + context.SaveChanges(); + } + finally + { + context.Database.EnsureDeleted(); + } + } + } + + [Test] + public void CanHandleUpdateConcurrencyConflicts() + { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddEntityFrameworkMySQL().AddDbContext(); + + var serviceProvider = serviceCollection.BuildServiceProvider(); + + using (var context = serviceProvider.GetRequiredService()) + { + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + + context.People.Add(new Person + { Name = "John Doe", PersonNumber = "3333333333", PhoneNumber = "1111111111" }); + context.SaveChanges(); + + var updatePerson1 = context.People.Single(p => p.PersonId == 1); + var updatePerson2 = context.People.Single(p => p.PersonId == 1); + + updatePerson1.PersonNumber = "2222222222"; + updatePerson1.PhoneNumber = "555555555"; + + context.SaveChanges(); + + var item = context.ChangeTracker.Entries().First(x => Object.ReferenceEquals(x.Entity, updatePerson2)); + item.OriginalValues["PersonNumber"] = "3333333333"; + updatePerson2.PersonNumber = "44444444"; + updatePerson2.PhoneNumber = "666666666"; + + TestDelegate action = () => context.SaveChanges(); + Assert.Throws(action); + } + } + + [Test] + public void CanHandleDeleteConcurrencyConflicts() + { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddEntityFrameworkMySQL().AddDbContext(); + + var serviceProvider = serviceCollection.BuildServiceProvider(); + + using (var context = serviceProvider.GetRequiredService()) + { + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + context.Remove(new Person { PersonId = 2 , PersonNumber = "88888888" }); + + TestDelegate action = () => context.SaveChanges(); + Assert.Throws(action); + } + } + + [Test] + public void CanHandleInsertConcurrencyConflicts() + { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddEntityFrameworkMySQL().AddDbContext(); + + var serviceProvider = serviceCollection.BuildServiceProvider(); + + using (var context = serviceProvider.GetRequiredService()) + { + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + context.People.Add(new Person + { Name = "John Doe", PersonNumber = "3333333333", PhoneNumber = "1111111111" }); + context.SaveChanges(); + + var insertedPerson1 = context.People.Single(p => p.PersonId == 1); + insertedPerson1.PersonNumber = "1111111111"; + + context.SaveChanges(); + + var item = context.ChangeTracker.Entries().First(x => Object.ReferenceEquals(x.Entity, insertedPerson1)); + item.OriginalValues["PersonNumber"] = "3333333333"; + + context.People.Add(new Person + { Name = "John Doe", PersonNumber = "3333333333", PhoneNumber = "1111111111" }); + + TestDelegate action = () => context.SaveChanges(); + Assert.Throws(action); + } + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Basic.Tests/ConnectionTests.cs b/EFCore/tests/MySql.EFCore.Basic.Tests/ConnectionTests.cs new file mode 100644 index 000000000..ef30d7d57 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Basic.Tests/ConnectionTests.cs @@ -0,0 +1,240 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics.Internal; +using Microsoft.EntityFrameworkCore.Infrastructure.Internal; +using Microsoft.EntityFrameworkCore.Storage; +using Microsoft.EntityFrameworkCore.Storage.Internal; +using Microsoft.EntityFrameworkCore.TestUtilities; +using Microsoft.Extensions.Logging; +using MySql.Data.MySqlClient; +using MySql.EntityFrameworkCore.Basic.Tests.DbContextClasses; +using MySql.EntityFrameworkCore.Basic.Tests.Utils; +using MySql.EntityFrameworkCore.Diagnostics.Internal; +using MySql.EntityFrameworkCore.Internal; +using MySql.EntityFrameworkCore.Storage.Internal; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System.Diagnostics; + +namespace MySql.EntityFrameworkCore.Basic.Tests +{ + public class ConnectionTests + { + private static MySQLRelationalConnection CreateConnection(DbContextOptions options) + { + var dependencies = CreateDependencies(options); + + return new MySQLRelationalConnection(dependencies); + } + +#if NET6_0 + public static RelationalConnectionDependencies CreateDependencies(DbContextOptions options = null) + { + options ??= new DbContextOptionsBuilder() + .UseMySQL(MySQLTestStore.BaseConnectionString + "database=test;") + .Options; + + return new RelationalConnectionDependencies( + options, + new DiagnosticsLogger( + new LoggerFactory(), + new LoggingOptions(), + new DiagnosticListener("FakeDiagnosticListener"), + new MySQLLoggingDefinitions(), null), + new RelationalConnectionDiagnosticsLogger( + new LoggerFactory(), + new LoggingOptions(), + new DiagnosticListener("FakeDiagnosticListener"), + new TestRelationalLoggingDefinitions(), + new NullDbContextLogger(), + CreateOptions()), + new NamedConnectionStringResolver(options), + new RelationalTransactionFactory(new RelationalTransactionFactoryDependencies( + new RelationalSqlGenerationHelper(new RelationalSqlGenerationHelperDependencies()))), + new CurrentDbContext(new FakeDbContext()), + new RelationalCommandBuilderFactory(new RelationalCommandBuilderDependencies( + new MySQLTypeMappingSource( + TestServiceFactory.Instance.Create(), + TestServiceFactory.Instance.Create(), + new MySQLOptions())))); + } +#elif NET8_0 || NET9_0 + public static RelationalConnectionDependencies CreateDependencies(DbContextOptions? options = null) + { + options ??= new DbContextOptionsBuilder() + .UseMySQL(MySQLTestStore.BaseConnectionString + "database=test;") + .Options; + + return new RelationalConnectionDependencies( + options, + new DiagnosticsLogger( + new LoggerFactory(), + new LoggingOptions(), + new DiagnosticListener("FakeDiagnosticListener"), + new MySQLLoggingDefinitions(), new NullDbContextLogger()), + new RelationalConnectionDiagnosticsLogger( + new LoggerFactory(), + new LoggingOptions(), + new DiagnosticListener("FakeDiagnosticListener"), + new TestRelationalLoggingDefinitions(), + new NullDbContextLogger(), + CreateOptions()), + new NamedConnectionStringResolver(options), + new RelationalTransactionFactory(new RelationalTransactionFactoryDependencies( + new RelationalSqlGenerationHelper(new RelationalSqlGenerationHelperDependencies()))), + new CurrentDbContext(new FakeDbContext()), + new RelationalCommandBuilderFactory(new RelationalCommandBuilderDependencies( + new MySQLTypeMappingSource( + TestServiceFactory.Instance.Create(), + TestServiceFactory.Instance.Create(), + new MySQLOptions()), new ExceptionDetector()))); + } +#elif NET10_0_OR_GREATER + public static RelationalConnectionDependencies CreateDependencies(DbContextOptions? options = null) + { + options ??= new DbContextOptionsBuilder() + .UseMySQL(MySQLTestStore.BaseConnectionString + "database=test;") + .Options; + + return new RelationalConnectionDependencies( + options, + new DiagnosticsLogger( + new LoggerFactory(), + new LoggingOptions(), + new DiagnosticListener("FakeDiagnosticListener"), + new MySQLLoggingDefinitions(), new NullDbContextLogger()), + new RelationalConnectionDiagnosticsLogger( + new LoggerFactory(), + new LoggingOptions(), + new DiagnosticListener("FakeDiagnosticListener"), + new TestRelationalLoggingDefinitions(), + new NullDbContextLogger(), + CreateOptions()), + new NamedConnectionStringResolver(options), + new RelationalTransactionFactory(new RelationalTransactionFactoryDependencies( + new RelationalSqlGenerationHelper(new RelationalSqlGenerationHelperDependencies()))), + new CurrentDbContext(new FakeDbContext()), + new RelationalCommandBuilderFactory(new RelationalCommandBuilderDependencies( + new MySQLTypeMappingSource( + TestServiceFactory.Instance.Create(), + TestServiceFactory.Instance.Create(), + new MySQLOptions()), new ExceptionDetector(), new LoggingOptions())), + new ExceptionDetector()); + } +#endif + + + [TearDown] + public void TearDown() + { + using (var context = new SakilaLiteUpdateContext()) + { + context.DropContext(); + } + } + + private class FakeDbContext : DbContext + { + } + + [Test] + public void CanCreateConnectionString() + { + using (var connection = CreateConnection(CreateOptions())) + { + Assert.That(connection.DbConnection, Is.InstanceOf()); + } + } + + [Test] + public void CanCreateMainConnection() + { + using (var connection = CreateConnection(CreateOptions())) + { + using (var source = connection.CreateSourceConnection()) + { + var csb = new MySqlConnectionStringBuilder(source.ConnectionString); + var csb1 = new MySqlConnectionStringBuilder(MySQLTestStore.BaseConnectionString); + Assert.That(csb.Database, Is.EqualTo(csb1.Database)); + Assert.That(csb.Port, Is.EqualTo(csb1.Port)); + Assert.That(csb.Server, Is.EqualTo(csb1.Server)); + Assert.That(csb.UserID, Is.EqualTo(csb1.UserID)); + } + } + } + + public static DbContextOptions CreateOptions() + { + var optionsBuilder = new DbContextOptionsBuilder(); + optionsBuilder.UseMySQL(MySQLTestStore.BaseConnectionString + "database=test;"); + return optionsBuilder.Options; + } + + [Test] + public void TransactionTest() + { + using (var context = new SakilaLiteUpdateContext()) + { + context.InitContext(false); + MySqlTrace.LogInformation(9966, "EF Model CREATED"); + } + + using (MySqlConnection connection = new MySqlConnection(MySQLTestStore.GetContextConnectionString())) + { + connection.Open(); + + using (MySqlTransaction transaction = connection.BeginTransaction()) + { + + MySqlCommand command = connection.CreateCommand(); + command.CommandText = "DELETE FROM actor"; + command.ExecuteNonQuery(); + + var options = new DbContextOptionsBuilder() + .UseMySQL(connection) + .Options; + + using (var context = new SakilaLiteUpdateContext(options)) + { + context.Database.UseTransaction(transaction); + context.Actor.Add(new Actor + { + FirstName = "PENELOPE", + LastName = "GUINESS" + }); + context.SaveChanges(); + } + + transaction.Commit(); + } + } + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Basic.Tests/DataTests.cs b/EFCore/tests/MySql.EFCore.Basic.Tests/DataTests.cs new file mode 100644 index 000000000..c8c9f227e --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Basic.Tests/DataTests.cs @@ -0,0 +1,114 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using MySql.Data.MySqlClient; +using MySql.EntityFrameworkCore.Basic.Tests.DbContextClasses; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Linq; +using System.Threading.Tasks; + +namespace MySql.EntityFrameworkCore.Basic.Tests +{ + public class DataTests + { + [TearDown] + public void TearDown() + { + using (var context = new WorldContext()) + context.Database.EnsureDeleted(); + using (var context = new MyContext()) + context.Database.EnsureDeleted(); + using (var context = new SakilaLiteContext()) + context.Database.EnsureDeleted(); + } + + [Test] + public async Task AsyncData() + { + using (var context = new WorldContext()) + { + await context.Database.EnsureDeletedAsync(); + await context.Database.EnsureCreatedAsync(); + + var america = new Continent { Code = "AM", Name = "America" }; + var europe = new Continent { Code = "EU", Name = "Europe" }; + var asia = new Continent { Code = "AS", Name = "Asia" }; + var africa = new Continent { Code = "AF", Name = "Africa" }; + + await context.AddAsync(america); + await context.AddRangeAsync(europe, asia, africa); + + var result = context.SaveChangesAsync(); + result.Wait(30_000); + Assert.That(result.Exception, Is.Null); + Assert.That(result.Result, Is.EqualTo(4)); + } + + using (var context = new WorldContext()) + { + var continent = await context.FindAsync("AS"); + Assert.That(continent!.Name, Is.EqualTo("Asia")); + + var continents = await context.Continents.ToListAsync(); + Assert.That(continents.Count, Is.EqualTo(4)); + } + } + + [Test] + public void ZeroDatetime() + { + using (MyContext context = new MyContext()) + { + MySqlConnectionStringBuilder sb = new MySqlConnectionStringBuilder(context.Database.GetDbConnection().ConnectionString); + sb.ConvertZeroDateTime = true; + + context.Database.GetDbConnection().ConnectionString = sb.ToString(); + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + + Assert.That(context.Database.ExecuteSqlInterpolated($"INSERT IGNORE INTO MyTest (`Date`) VALUES('0000-00-00')"), Is.EqualTo(1)); + + var item = context.MyTest.First(); + Assert.That(item.Date, Is.EqualTo(DateTime.MinValue)); + } + } + + [Test] + public void SakilaLiteTest() + { + using (SakilaLiteContext context = new SakilaLiteContext()) + { + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + } + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Basic.Tests/DbContextClasses/ConventionsContexts.cs b/EFCore/tests/MySql.EFCore.Basic.Tests/DbContextClasses/ConventionsContexts.cs new file mode 100644 index 000000000..c5f089188 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Basic.Tests/DbContextClasses/ConventionsContexts.cs @@ -0,0 +1,53 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using MySql.EntityFrameworkCore.Basic.Tests.Utils; + +namespace MySql.EntityFrameworkCore.Basic.Tests.DbContextClasses +{ + public class SimpleContextWithIgnore : MyTestContext + { + + public DbSet Blogs { get; set; } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + + modelBuilder.Entity() + .HasOne(p => p.RecentPost) + .WithOne(i => i.Blog) + .HasForeignKey(b => b.PostId); + + + modelBuilder.Ignore(); // ignoring entity type + modelBuilder.Entity() // ignoring property + .Ignore(b => b.Url); + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Basic.Tests/DbContextClasses/EFFluentAPIContexts.cs b/EFCore/tests/MySql.EFCore.Basic.Tests/DbContextClasses/EFFluentAPIContexts.cs new file mode 100644 index 000000000..ea30b2019 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Basic.Tests/DbContextClasses/EFFluentAPIContexts.cs @@ -0,0 +1,158 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using MySql.EntityFrameworkCore.Basic.Tests.Utils; +using MySql.EntityFrameworkCore.Extensions; +using System; + +namespace MySql.EntityFrameworkCore.Basic.Tests.DbContextClasses +{ + public class ComputedColumnContext : MyTestContext + { + public DbSet Employees { get; set; } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity() + .HasKey(b => b.EmployeeId) + .HasName("PrimaryKey_EmployeeId"); + + modelBuilder.Entity() + .Property(p => p.DisplayName) + .HasComputedColumnSql("CONCAT_WS(' ', LastName , FirstName)"); + + modelBuilder.Entity() + .Property(p => p.Timestamp) + .HasDefaultValue(DateTime.Now) + .ValueGeneratedOnAddOrUpdate(); + + } + } + + public class QuickContext : MyTestContext + { + public DbSet QuickEntity { get; set; } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity() + .HasKey(b => b.Id) + .HasName("PrimaryKey_Id"); + + modelBuilder.Entity() + .Property(b => b.Created) + .HasColumnType("Timestamp"); + } + } + + public class TableConventionsContext : MyTestContext + { + public DbSet Cars { get; set; } + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + string name = $"db-{this.GetType().Name.ToLowerInvariant()}"; + optionsBuilder.UseMySQL(MySQLTestStore.RootConnectionString + ";database=" + name + ";charset=latin1"); + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity(e => + { + e.ToTable("somecars"); + + e.Property(p => p.LicensePlate).HasColumnType("VARCHAR(384)"); + + e.Property(p => p.State).HasColumnType("VARCHAR(384)"); + + e.HasKey(c => new { c.State, c.LicensePlate }); + }); + + + modelBuilder.Entity() + .HasOne(s => s.Car) + .WithMany(c => c.SaleHistory) + .HasForeignKey(s => new { s.CarState, s.CarLicensePlate }) + .HasPrincipalKey(c => new { c.State, c.LicensePlate }); + } + } + + public class KeyConventionsContext : MyTestContext + { + public DbSet Cars { get; set; } + public DbSet Blogs { get; set; } + + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity() + .HasAlternateKey(c => c.LicensePlate) + .HasName("AlternateKey_LicensePlate"); + + modelBuilder.Entity() + .HasIndex(b => b.Url) + .HasDatabaseName("Index_Url"); + + modelBuilder.Entity() + .Property(b => b.Url) + .HasColumnType("varchar(400)"); + + modelBuilder.Entity() + .HasOne(p => p.Metadata) + .WithOne(i => i.Blog) + .HasForeignKey(b => b.BlogId); + + modelBuilder.Entity() + .HasOne(p => p.RecentPost) + .WithOne(i => i.Blog) + .HasForeignKey(b => b.PostId); + + modelBuilder.Entity() + .Property(b => b.Make) + .HasColumnType("varchar(100)"); + + modelBuilder.Entity() + .Property(b => b.Model) + .HasColumnType("varchar(4)") + .ForMySQLHasDefaultValue("1999"); + } + } + + public class ConcurrencyTestsContext : MyTestContext + { + public DbSet People { get; set; } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity() + .Property(p => p.PersonNumber).IsConcurrencyToken(); + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Basic.Tests/DbContextClasses/EntitiesClasses.cs b/EFCore/tests/MySql.EFCore.Basic.Tests/DbContextClasses/EntitiesClasses.cs new file mode 100644 index 000000000..e63c36c4c --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Basic.Tests/DbContextClasses/EntitiesClasses.cs @@ -0,0 +1,353 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.EntityFrameworkCore.DataAnnotations; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.EntityFrameworkCore.Basic.Tests.DbContextClasses +{ + public class Bug + { + public int Id { get; set; } + public DateTime CreatedDate { get; set; } + } + + public class Blog + { + public int BlogId { get; set; } + public string? Url { get; set; } + + //public List Posts { get; set; } + + public Post? RecentPost { get; set; } + public BlogMetadata? Metadata { get; set; } + + } + + public class Post + { + public int PostId { get; set; } + public string? Title { get; set; } + public string? Content { get; set; } + + public int BlogIdFK { get; set; } + + public string? Url { get; set; } + + public Blog? Blog { get; set; } + } + + + public class Read + { + public int ReadId { get; set; } + public string? Title { get; set; } + public string? Content { get; set; } + + public List? ReadTags { get; set; } + } + + public class Tag + { + public int TagId { get; set; } + + public List? ReadTags { get; set; } + } + + public class ReadTag + { + public int ReadId { get; set; } + public Read? Read { get; set; } + + public int TagId { get; set; } + public Tag? Tag { get; set; } + } + + + public class AuditEntry + { + public int AuditEntryId { get; set; } + public string? Username { get; set; } + public string? Action { get; set; } + } + + public class BlogMetadata + { + [Key] + public int BlogId { get; set; } + public Blog? Blog { get; set; } + public DateTime LoadedFromDatabase { get; set; } + } + + + public class Employee + { + public int EmployeeId { get; set; } + public string? FirstName { get; set; } + public string? LastName { get; set; } + [DatabaseGenerated(DatabaseGeneratedOption.Computed)] + public string? DisplayName { get; set; } + + public DateTime Timestamp { get; set; } + + } + + public class BodyShop + { + public int BodyShopId { get; set; } + + public string? Name { get; set; } + + public string? City { get; set; } + + public string? State { get; set; } + + public string? Brand { get; set; } + } + + + public class Car + { + public int CarId { get; set; } + [MaxLength(30)] + public string? LicensePlate { get; set; } + [MaxLength(30)] + public string? State { get; set; } + public string? Make { get; set; } + public string? Model { get; set; } + + public List? SaleHistory { get; set; } + } + + + public class RecordOfSale + { + public int RecordOfSaleId { get; set; } + public DateTime DateSold { get; set; } + public decimal Price { get; set; } + [MaxLength(30)] + public string? CarState { get; set; } + [MaxLength(30)] + public string? CarLicensePlate { get; set; } + public Car? Car { get; set; } + } + + public class Person + { + public int PersonId { get; set; } + + [ConcurrencyCheck] + public string? PersonNumber { get; set; } + public string? PhoneNumber { get; set; } + [ConcurrencyCheck] + public string? Name { get; set; } + } + + public class Bug35392218_1 + { + public int Id { get; set; } + + public string? Name { get; set; } + } + + public class Bug35392218_2 + { + public int Id { get; set; } + + public string? Name { get; set; } + } + + public class Guest + { + [Key] + public int IdGuest { get; set; } + public string? Name { get; set; } + public Address? Address { get; set; } + } + + public class Address + { + [Key] + public int IdAddress { get; set; } + public string? Street { get; set; } + public string? City { get; set; } + public Guest? Guest { get; set; } + } + + public class Relative + { + [Key] + public int IdRelative { get; set; } + public string? Name { get; set; } + public AddressRelative? Address { get; set; } + } + + public class AddressRelative + { + [Key] + public int IdAddressRelative { get; set; } + public string? Street { get; set; } + public string? City { get; set; } + public Relative? Relative { get; set; } + } + + + public class QuickEntity + { + [Key] + public int Id { get; set; } + public string? Name { get; set; } + public DateTimeOffset Created { get; set; } + + } + + public class JsonData + { + [Key] + [Column(TypeName = "smallint")] + public short Id { get; set; } + + [Column(TypeName = "json")] + public string? jsoncol { get; set; } + } + + public partial class AllBlobTypes + { + public byte Id { get; set; } + public byte[]? Example1 { get; set; } + public byte[]? Example2 { get; set; } + public byte[]? Example3 { get; set; } + + } + + public partial class AllDataTypes + { + public byte AddressNumber1 { get; set; } + public short AddressNumber2 { get; set; } + public int AddressNumber3 { get; set; } + public int AddressNumber4 { get; set; } + public long AddressNumber5 { get; set; } + public float AddressNumber6 { get; set; } + public float AddressNumber7 { get; set; } + public double AddressNumber8 { get; set; } + public decimal AddressNumber9 { get; set; } + public short AddressNumber10 { get; set; } + public string? BuildingName1 { get; set; } + public string? BuildingName2 { get; set; } + public string? BuildingName3 { get; set; } + public string? BuildingName4 { get; set; } + public string? BuildingName5 { get; set; } + public byte[]? BuildingName6 { get; set; } + public byte[]? BuildingName7 { get; set; } + public byte[]? BuildingName8 { get; set; } + public byte[]? BuildingName9 { get; set; } + public byte[]? BuildingName10 { get; set; } + public string? BuildingName11 { get; set; } + public string? BuildingName12 { get; set; } + public DateTime BuildingName13 { get; set; } + public DateTime BuildingName14 { get; set; } + public TimeSpan BuildingName15 { get; set; } + public DateTime BuildingName16 { get; set; } + public short BuildingName17 { get; set; } + } + + [Table("CountryList")] + public class Country + { + [Key] + public string? Code { get; set; } + public string? Name { get; set; } + public virtual Continent? Continent { get; set; } + public string? Region { get; set; } + public int IndepYear { get; set; } + } + + public class Continent + { + public string? Code { get; set; } + + public string? Name { get; set; } + + public virtual ICollection? Countries { get; set; } + } + + public class Triangle + { + public int Id { get; set; } + + public int Base { get; set; } + + public int Height { get; set; } + [DatabaseGenerated(DatabaseGeneratedOption.Computed)] + public int Area { get; set; } + } + + public class StringTypes + { + public string? TinyString { get; set; } + public string? NormalString { get; set; } + public string? MediumString { get; set; } + public string? LongString { get; set; } + } + + public class MyTest + { + public int MyTestId { get; set; } + + public DateTime Date { get; set; } + } + + [MySQLCharset("ascii")] + public class TestCharsetDA + { + [MySQLCharset("binary")] + [MaxLength(255)] + public string? TestCharsetDAId { get; set; } + } + + public class TestCharsetFA + { + public string? TestCharsetFAId { get; set; } + } + + [MySQLCollation("cp932_bin")] + public class TestCollationDA + { + [MySQLCollation("greek_bin")] + [MaxLength(255)] + public string? TestCollationDAId { get; set; } + } + + public class TestCollationFA + { + public string? TestCollationFAId { get; set; } + } +} diff --git a/EFCore/tests/MySql.EFCore.Basic.Tests/DbContextClasses/SakilaLiteContext.cs b/EFCore/tests/MySql.EFCore.Basic.Tests/DbContextClasses/SakilaLiteContext.cs new file mode 100644 index 000000000..25f240287 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Basic.Tests/DbContextClasses/SakilaLiteContext.cs @@ -0,0 +1,8446 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using Microsoft.EntityFrameworkCore.Metadata.Internal; +using MySql.EntityFrameworkCore.Basic.Tests.Utils; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.EntityFrameworkCore.Basic.Tests.DbContextClasses +{ + #region Contexts + + public partial class SakilaLiteContext : MyTestContext + { + public DbSet Actor { get; set; } + public DbSet Film { get; set; } + public DbSet Customer { get; set; } + public DbSet Address { get; set; } + + public SakilaLiteContext() + : base() { } + + public SakilaLiteContext(DbContextOptions options) + : base(options) { } + + public void OnModelCreating20(ModelBuilder modelBuilder) + { + // Self-contained type configuration for code first + modelBuilder.ApplyConfiguration(new CustomerConfiguration()); + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + + SetActorEntity(modelBuilder); + + SetFilmEntity(modelBuilder); + + SetFilmActorEntity(modelBuilder); + + SetAddressEntity(modelBuilder); + + SetCustomerEntity(modelBuilder); + + OnModelCreating20(modelBuilder); + } + + public virtual void PopulateData() + { + // Actor data + this.Database.ExecuteSqlRaw(SakilaLiteData.ActorData); + // Film data + this.Database.ExecuteSqlRaw(SakilaLiteData.FilmData); + // FilmActor data + this.Database.ExecuteSqlRaw(SakilaLiteData.FilmActorData); + // Address data + this.Database.ExecuteSqlRaw(SakilaLiteData.AddressData); + // Customer data + this.Database.ExecuteSqlRaw(SakilaLiteData.CustomerData); + } + + public virtual void InitContext(bool populateData = true) + { + Database.EnsureDeleted(); + Database.EnsureCreated(); + if (populateData) + PopulateData(); + } + + public void DropContext() + { + Database.EnsureDeleted(); + } + + protected virtual void SetActorEntity(ModelBuilder modelBuilder) + { + modelBuilder.Entity(entity => + { + entity.ToTable("actor"); + + entity.HasIndex(e => e.LastName) + .HasDatabaseName("idx_actor_last_name"); + + entity.Property(e => e.ActorId) + .HasColumnName("actor_id") + .HasColumnType("smallint(5) unsigned"); + + entity.Property(e => e.FirstName) + .IsRequired() + .HasColumnName("first_name") + .HasColumnType("varchar(45)") + .HasMaxLength(45); + + entity.Property(e => e.LastName) + .IsRequired() + .HasColumnName("last_name") + .HasColumnType("varchar(45)") + .HasMaxLength(45); + + entity.Property(e => e.LastUpdate) + .HasColumnName("last_update") + .HasColumnType("timestamp") + .HasDefaultValueSql("CURRENT_TIMESTAMP"); + }); + } + + protected virtual void SetFilmEntity(ModelBuilder modelBuilder) + { + modelBuilder.Entity(entity => + { + entity.ToTable("film"); + + entity.HasIndex(e => e.LanguageId) + .HasDatabaseName("idx_fk_language_id"); + + entity.HasIndex(e => e.OriginalLanguageId) + .HasDatabaseName("idx_fk_original_language_id"); + + entity.HasIndex(e => e.Title) + .HasDatabaseName("idx_title"); + + entity.Property(e => e.FilmId) + .HasColumnName("film_id") + .HasColumnType("smallint unsigned"); + + entity.Property(e => e.Description) + .HasColumnName("description") + .HasColumnType("text"); + + entity.Property(e => e.LanguageId) + .HasColumnName("language_id") + .HasColumnType("tinyint unsigned") + ; + + entity.Property(e => e.LastUpdate) + .HasColumnName("last_update") + .HasColumnType("timestamp") + .HasDefaultValueSql("CURRENT_TIMESTAMP") + .IsRequired(); + + entity.Property(e => e.Length) + .HasColumnName("length") + .HasColumnType("smallint unsigned") + .HasDefaultValue(null); + + entity.Property(e => e.OriginalLanguageId) + .HasColumnName("original_language_id") + .HasColumnType("tinyint unsigned") + .HasDefaultValue(null); + + entity.Property(e => e.Rating) + .HasColumnName("rating") + .HasColumnType("enum('G','PG','PG-13','R','NC-17')") + .HasDefaultValue("G"); + + entity.Property(e => e.ReleaseYear) + .HasColumnName("release_year") + .HasColumnType("year"); + + entity.Property(e => e.RentalDuration) + .HasColumnName("rental_duration") + .HasColumnType("tinyint unsigned") + .HasDefaultValue((byte)3) + .IsRequired(); + + entity.Property(e => e.RentalRate) + .HasColumnName("rental_rate") + .HasColumnType("decimal(4,2)") + .HasDefaultValue("4.99") + .IsRequired(); + + entity.Property(e => e.ReplacementCost) + .HasColumnName("replacement_cost") + .HasColumnType("decimal(5,2)") + .HasDefaultValue("19.99") + .IsRequired(); + + entity.Property(e => e.SpecialFeatures) + .HasColumnName("special_features") + .HasColumnType("set('Trailers','Commentaries','Deleted Scenes','Behind the Scenes')") + .HasDefaultValue(null); + + entity.Property(e => e.Title) + .IsRequired() + .HasColumnName("title") + .HasColumnType("varchar(255)") + .HasMaxLength(255); + }); + } + + protected virtual void SetFilmActorEntity(ModelBuilder modelBuilder) + { + modelBuilder.Entity(entity => + { + entity.HasKey(e => new { e.ActorId, e.FilmId }) + .HasName("PK_film_actor"); + + entity.ToTable("film_actor"); + + entity.HasOne(p => p.Actor) + .WithMany(p => p.FilmActors) + .HasForeignKey(p => p.ActorId) + .HasConstraintName("fk_film_actor_actor"); + + entity.HasOne(p => p.Film) + .WithMany(p => p.FilmActors) + .HasForeignKey(p => p.FilmId) + .HasConstraintName("fk_film_actor_film"); + + entity.Property(e => e.ActorId) + .HasColumnName("actor_id") + .HasColumnType("smallint(5) unsigned"); + + entity.Property(e => e.FilmId) + .HasColumnName("film_id") + .HasColumnType("smallint(5) unsigned"); + + entity.Property(e => e.LastUpdate) + .HasColumnName("last_update") + .HasColumnType("timestamp") + .HasDefaultValueSql("CURRENT_TIMESTAMP"); + }); + } + + protected virtual void SetCustomerEntity(ModelBuilder modelBuilder) + { + modelBuilder.Entity(entity => + { + entity.ToTable("customer"); + + entity.HasOne(p => p.Address) + .WithMany() + .HasForeignKey("AddressId"); + + entity.HasIndex(e => e.AddressId) + .HasDatabaseName("idx_fk_address_id"); + + entity.HasIndex(e => e.LastName) + .HasDatabaseName("idx_last_name"); + + entity.HasIndex(e => e.StoreId) + .HasDatabaseName("idx_fk_store_id"); + + entity.Property(e => e.CustomerId) + .HasColumnName("customer_id") + .HasColumnType("smallint(5) unsigned"); + + entity.Property(e => e.Active) + .HasColumnName("active") + .HasColumnType("tinyint(1)") + .HasDefaultValueSql("1"); + + entity.Property(e => e.AddressId) + .HasColumnName("address_id") + .HasColumnType("smallint(5) unsigned"); + + entity.Property(e => e.CreateDate).HasColumnName("create_date"); + + entity.Property(e => e.Email) + .HasColumnName("email") + .HasColumnType("varchar(50)") + .HasMaxLength(50); + + entity.Property(e => e.FirstName) + .IsRequired() + .HasColumnName("first_name") + .HasColumnType("varchar(45)") + .HasMaxLength(45); + + entity.Property(e => e.LastName) + .IsRequired() + .HasColumnName("last_name") + .HasColumnType("varchar(45)") + .HasMaxLength(45); + + entity.Property(e => e.LastUpdate) + .HasColumnName("last_update") + .HasColumnType("timestamp") + .HasDefaultValueSql("CURRENT_TIMESTAMP"); + + entity.Property(e => e.StoreId) + .HasColumnName("store_id") + .HasColumnType("tinyint(3) unsigned"); + }); + } + + protected virtual void SetAddressEntity(ModelBuilder modelBuilder) + { + SetAddressEntity(modelBuilder.Entity()); + } + + protected virtual void SetAddressEntity(EntityTypeBuilder entity) + { + entity.HasKey(p => p.AddressId); + + entity.ToTable("address"); + + entity.HasIndex(e => e.CityId) + .HasDatabaseName("idx_fk_city_id"); + + entity.Property(e => e.AddressId) + .HasColumnName("address_id") + .HasColumnType("smallint(5) unsigned"); + + entity.Property(e => e.Address) + .IsRequired() + .HasColumnName("address") + .HasColumnType("varchar(50)") + .HasMaxLength(50); + + entity.Property(e => e.Address2) + .HasColumnName("address2") + .HasColumnType("varchar(50)") + .HasMaxLength(50); + + entity.Property(e => e.CityId) + .HasColumnName("city_id") + .HasColumnType("smallint(5) unsigned"); + + entity.Property(e => e.District) + .IsRequired() + .HasColumnName("district") + .HasColumnType("varchar(20)") + .HasMaxLength(20); + + entity.Property("location") + .HasColumnType("geometry") + .IsRequired(false); + + entity.Property(e => e.LastUpdate) + .HasColumnName("last_update") + .HasColumnType("timestamp") + .HasDefaultValueSql("CURRENT_TIMESTAMP"); + + entity.Property(e => e.Phone) + .IsRequired() + .HasColumnName("phone") + .HasColumnType("varchar(20)") + .HasMaxLength(20); + + entity.Property(e => e.PostalCode) + .HasColumnName("postal_code") + .HasColumnType("varchar(10)") + .HasMaxLength(10); + } + + // Database scalar function mapping + [DbFunction] + public static int FilmsByActorCount(short actorId) + { + throw new Exception(); + } + } + + public class SakilaLiteUpdateContext : SakilaLiteContext + { + public SakilaLiteUpdateContext() + : base() { } + + public SakilaLiteUpdateContext(DbContextOptions options) + : base(options) { } + + public override void PopulateData() + { + // no data loaded + } + } + + public class SakilaLiteTableSplittingContext : MyTestContext + { + public DbSet Films { get; set; } + public DbSet FilmDetails { get; set; } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + modelBuilder.Entity() + .HasOne(t => t.Details).WithOne(t => t.Film) + .HasForeignKey(t => t.FilmId); + modelBuilder.Entity().ToTable("Film"); + modelBuilder.Entity().ToTable("Film"); + } + } + + public class SakilaLiteOwnedTypesContext : SakilaLiteContext + { + protected override void SetCustomerEntity(ModelBuilder modelBuilder) + { + // configures Address as an owned Customer type + base.SetCustomerEntity(modelBuilder); + modelBuilder.Entity() + .OwnsOne(e => e.Address, + owned => + { + //EntityTypeBuilder entity = new EntityTypeBuilder(((IInfrastructure)owned).Instance); + //base.SetAddressEntity(entity); + }); + } + + protected override void SetAddressEntity(ModelBuilder modelBuilder) + { + // configuration is set as owned entity + } + + public override void PopulateData() + { + // Customer data + this.Database.ExecuteSqlInterpolated($"{SakilaLiteData.CustomerData}"); + } + } + + #endregion + + #region Configurations + class CustomerConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + // defines a model-level query filter + builder.HasQueryFilter(e => e.Active); + } + } + + #endregion + + #region Entities + + public partial class Actor + { + public short ActorId { get; set; } + public string? FirstName { get; set; } + public string? LastName { get; set; } + [DatabaseGenerated(DatabaseGeneratedOption.Computed)] + public DateTime LastUpdate { get; set; } + + public List? FilmActors { get; set; } + } + + public partial class Film + { + public short FilmId { get; set; } + public string? Title { get; set; } + public string? Description { get; set; } + public short? ReleaseYear { get; set; } + public byte LanguageId { get; set; } + public byte? OriginalLanguageId { get; set; } + public byte RentalDuration { get; set; } + public decimal RentalRate { get; set; } + public short? Length { get; set; } + public decimal ReplacementCost { get; set; } + public string? Rating { get; set; } + public string? SpecialFeatures { get; set; } + public DateTime LastUpdate { get; set; } + + public List? FilmActors { get; set; } + } + + public partial class FilmActor + { + public short ActorId { get; set; } + public Actor? Actor { get; set; } + + public short FilmId { get; set; } + public Film? Film { get; set; } + + public DateTime LastUpdate { get; set; } + } + + public partial class Customer + { + public short CustomerId { get; set; } + public byte StoreId { get; set; } + public string? FirstName { get; set; } + public string? LastName { get; set; } + public string? Email { get; set; } + public short AddressId { get; set; } + public bool Active { get; set; } + public DateTime CreateDate { get; set; } + public DateTime LastUpdate { get; set; } + + public virtual SakilaAddress? Address { get; set; } + } + + public partial class SakilaAddress + { + public short AddressId { get; set; } + public string? Address { get; set; } + public string? Address2 { get; set; } + public string? District { get; set; } + public short CityId { get; set; } + public string? PostalCode { get; set; } + public string? Phone { get; set; } + public DateTime LastUpdate { get; set; } + } + + public class FilmLite + { + [Key] + public short FilmId { get; set; } + public string? Title { get; set; } + public string? Description { get; set; } + + public FilmDetails? Details { get; set; } + } + + public class FilmDetails + { + [Key] + public short FilmId { get; set; } + public short? ReleaseYear { get; set; } + [Required] + public byte LanguageId { get; set; } + public byte? OriginalLanguageId { get; set; } + public byte RentalDuration { get; set; } + public decimal RentalRate { get; set; } + public short? Length { get; set; } + public decimal ReplacementCost { get; set; } + public string? Rating { get; set; } + public string? SpecialFeatures { get; set; } + public DateTime LastUpdate { get; set; } + + public FilmLite? Film { get; set; } + } + + public class ActorTest + { + public string? Value { get; set; } + public string? Text { get; set; } + public int Number { get; set; } + } + + #endregion + + #region Data scripts + + internal class SakilaLiteData + { + + internal static string ActorData { get; } = @"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'); +"; + + internal static string FilmData { get; } = @"INSERT INTO film(`film_id`, `title`, `description`, `release_year`, `language_id`, `original_language_id`, `rental_duration`, `rental_rate`, `length`, `replacement_cost`, `rating`, `special_features`, `last_update`) 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'); +"; + + internal static string FilmActorData { get; } = @"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'); +"; + + internal static string CustomerData { get; } = @"INSERT INTO customer(customer_id, store_id, first_name, last_name, email, address_id, active, create_date, last_update) 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');"; + + internal static string AddressData { get; } = @"INSERT INTO `address`(address_id, address, address2, district, city_id, postal_code, phone,/*!50705 location,*/ last_update) VALUES +(1,'47 MySakila Drive',NULL,'Alberta',300,'','',/*!50705 0x0000000001010000003E0A325D63345CC0761FDB8D99D94840,*/'2014-09-25 22:30:27'), +(2,'28 MySQL Boulevard',NULL,'QLD',576,'','',/*!50705 0x0000000001010000008E10D4DF812463404EE08C5022A23BC0,*/'2014-09-25 22:30:09'), +(3,'23 Workhaven Lane',NULL,'Alberta',300,'','14033335568',/*!50705 0x000000000101000000CDC4196863345CC01DEE7E7099D94840,*/'2014-09-25 22:30:27'), +(4,'1411 Lillydale Drive',NULL,'QLD',576,'','6172235589',/*!50705 0x0000000001010000005B0DE4341F26634042D6AE6422A23BC0,*/'2014-09-25 22:30:09'), +(5,'1913 Hanoi Way','','Nagasaki',463,'35200','28303384290',/*!50705 0x00000000010100000028D1370E21376040ABB58BC45F944040,*/'2014-09-25 22:31:53'), +(6,'1121 Loja Avenue','','California',449,'17886','838635286649',/*!50705 0x0000000001010000003C94579D8B525DC0E860472DDE0D4140,*/'2014-09-25 22:34:01'), +(7,'692 Joliet Street','','Attika',38,'83579','448477190408',/*!50705 0x000000000101000000076F59CF5AB737404105D1A45EFD4240,*/'2014-09-25 22:31:07'), +(8,'1566 Inegl Manor','','Mandalay',349,'53561','705814003527',/*!50705 0x00000000010100000006240626DCD857403C45B357C4753540,*/'2014-09-25 22:32:18'), +(9,'53 Idfu Parkway','','Nantou',361,'42399','10655648674',/*!50705 0x0000000001010000001F813FFC7C2A5E40357A354069EA3740,*/'2014-09-25 22:33:16'), +(10,'1795 Santiago de Compostela Way','','Texas',295,'18743','860452626434',/*!50705 0x00000000010100000050502F9D7BE058C0D0CF7932A4813B40,*/'2014-09-25 22:33:55'), +(11,'900 Santiago de Compostela Parkway','','Central Serbia',280,'93896','716571220373',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:34:11'), +(12,'478 Joliet Way','','Hamilton',200,'77948','657282285970',/*!50705 0x000000000101000000DC84D61E11E9654072B7353344E442C0,*/'2014-09-25 22:32:22'), +(13,'613 Korolev Drive','','Masqat',329,'45844','380657522649',/*!50705 0x00000000010100000001023164D04B4D40CEAC003A279D3740,*/'2014-09-25 22:32:29'), +(14,'1531 Sal Drive','','Esfahan',162,'53628','648856936185',/*!50705 0x000000000101000000DE0951195AD64940635A400D84534040,*/'2014-09-25 22:31:36'), +(15,'1542 Tarlac Parkway','','Kanagawa',440,'1027','635297277345',/*!50705 0x000000000101000000B4CDE8A27C6B61406B7D361724C74140,*/'2014-09-25 22:31:53'), +(16,'808 Bhopal Manor','','Haryana',582,'10672','465887807014',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:30'), +(17,'270 Amroha Parkway','','Osmaniye',384,'29610','695479687538',/*!50705 0x0000000001010000001F436C55B71F4240A11408967E894240,*/'2014-09-25 22:33:27'), +(18,'770 Bydgoszcz Avenue','','California',120,'16266','517338314235',/*!50705 0x0000000001010000006D63A2F7FC515EC04C040539835A4340,*/'2014-09-25 22:33:47'), +(19,'419 Iligan Lane','','Madhya Pradesh',76,'72878','990911107354',/*!50705 0x000000000101000000B7B01303C9595340E6F10FB633413740,*/'2014-09-25 22:31:13'), +(20,'360 Toulouse Parkway','','England',495,'54308','949312333307',/*!50705 0x000000000101000000860FDBCCD7DBE63FFDCFAB4BD7C44940,*/'2014-09-25 22:33:40'), +(21,'270 Toulon Boulevard','','Kalmykia',156,'81766','407752414682',/*!50705 0x000000000101000000FD0BA947BF204640316D495865274740,*/'2014-09-25 22:32:48'), +(22,'320 Brest Avenue','','Kaduna',252,'43331','747791594069',/*!50705 0x0000000001010000006D3425FECDC01D40623FD532630B2540,*/'2014-09-25 22:32:25'), +(23,'1417 Lancaster Avenue','','Northern Cape',267,'72192','272572357893',/*!50705 0x000000000101000000FEE8E5C127C338404DED56E075BB3CC0,*/'2014-09-25 22:33:03'), +(24,'1688 Okara Way','','Nothwest Border Prov',327,'21954','144453869132',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:30'), +(25,'262 A Corua (La Corua) Parkway','','Dhaka',525,'34418','892775750063',/*!50705 0x000000000101000000F13790E4A87A5640E7F6370DF63F3840,*/'2014-09-25 22:30:12'), +(26,'28 Charlotte Amalie Street','','Rabat-Sal-Zammour-Z',443,'37551','161968374323',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:16'), +(27,'1780 Hino Boulevard','','Liepaja',303,'7716','902731229323',/*!50705 0x000000000101000000360F1604450435403CA3AD4A22424C40,*/'2014-09-25 22:31:58'), +(28,'96 Tafuna Way','','Crdoba',128,'99865','934730187245',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:05'), +(29,'934 San Felipe de Puerto Plata Street','','Sind',472,'99780','196495945706',/*!50705 0x0000000001010000008E6B8D52D3285140D58E876302F53B40,*/'2014-09-25 22:32:31'), +(30,'18 Duisburg Boulevard','','',121,'58327','998009777982',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:08'), +(31,'217 Botshabelo Place','','Southern Mindanao',138,'49521','665356572025',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:36'), +(32,'1425 Shikarpur Manor','','Bihar',346,'65599','678220867005',/*!50705 0x0000000001010000007F9F16284E9E55408201840F25603940,*/'2014-09-25 22:31:20'), +(33,'786 Aurora Avenue','','Yamaguchi',474,'65750','18461860151',/*!50705 0x000000000101000000E712584AA05E6040D15735ADB9FA4040,*/'2014-09-25 22:31:53'), +(34,'1668 Anpolis Street','','Taipei',316,'50199','525255540978',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:15'), +(35,'33 Gorontalo Way','','West Bengali',257,'30348','745994947458',/*!50705 0x0000000001010000001A828879FB17564061585936CEAB3640,*/'2014-09-25 22:31:18'), +(36,'176 Mandaluyong Place','','Uttar Pradesh',239,'65213','627705991774',/*!50705 0x00000000010100000073309B0043A553409E3AA0B657743940,*/'2014-09-25 22:31:17'), +(37,'127 Purnea (Purnia) Manor','','Piemonte',17,'79388','911872220378',/*!50705 0x0000000001010000002A2B97D75B382140F2892B1D62744640,*/'2014-09-25 22:31:42'), +(38,'61 Tama Street','','Okayama',284,'94065','708403338270',/*!50705 0x0000000001010000001F7013A488B86040670696C8AA4A4140,*/'2014-09-25 22:31:49'), +(39,'391 Callao Drive','','Midi-Pyrnes',544,'34021','440512153169',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:01'), +(40,'334 Munger (Monghyr) Lane','','Markazi',31,'38145','481183273622',/*!50705 0x000000000101000000737275B636D848404B958334BE0B4140,*/'2014-09-25 22:31:36'), +(41,'1440 Fukuyama Loop','','Henan',362,'47929','912257250465',/*!50705 0x0000000001010000005E3CCD1319225C405886DD1C537F4040,*/'2014-09-25 22:30:40'), +(42,'269 Cam Ranh Parkway','','Chisinau',115,'34689','489783829737',/*!50705 0x000000000101000000AD97F0958ADB3C40CCD47F31B6804740,*/'2014-09-25 22:32:15'), +(43,'306 Antofagasta Place','','Esprito Santo',569,'3989','378318851631',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:23'), +(44,'671 Graz Street','','Oriental',353,'94399','680768868518',/*!50705 0x00000000010100000083F7FAFFDD7707C0F7B7BA5285954140,*/'2014-09-25 22:32:16'), +(45,'42 Brindisi Place','','Yerevan',586,'16744','42384721397',/*!50705 0x000000000101000000281BC528BE4146403BD400EF2E174440,*/'2014-09-25 22:30:08'), +(46,'1632 Bislig Avenue','','Nonthaburi',394,'61117','471675840679',/*!50705 0x000000000101000000935C59FDEC1F5940D5D0611976D32B40,*/'2014-09-25 22:33:20'), +(47,'1447 Imus Way','','Tahiti',167,'48942','539758313890',/*!50705 0x00000000010100000090CE0A56E6B562C059BB9289008E31C0,*/'2014-09-25 22:31:02'), +(48,'1998 Halifax Drive','','Lipetsk',308,'76022','177727722820',/*!50705 0x00000000010100000087985CD60EC943409F1738EA324D4A40,*/'2014-09-25 22:32:54'), +(49,'1718 Valencia Street','','Antofagasta',27,'37359','675292816413',/*!50705 0x0000000001010000007E82D5A24F9951C0C46B4DA901A737C0,*/'2014-09-25 22:30:29'), +(50,'46 Pjatigorsk Lane','','Moscow (City)',343,'23616','262076994845',/*!50705 0x0000000001010000009C51F355F2C4424002E3CFA6D9DF4B40,*/'2014-09-25 22:32:55'), +(51,'686 Garland Manor','','Cear',247,'52535','69493378813',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:19'), +(52,'909 Garland Manor','','Tatarstan',367,'69367','705800322606',/*!50705 0x000000000101000000376DC66988E949402CA85E6D7BD14B40,*/'2014-09-25 22:32:55'), +(53,'725 Isesaki Place','','Mekka',237,'74428','876295323994',/*!50705 0x000000000101000000213361455799434061EB0896D98A3540,*/'2014-09-25 22:33:00'), +(54,'115 Hidalgo Parkway','','Khartum',379,'80168','307703950263',/*!50705 0x00000000010100000004503173263D40404D0DD9E5004A2F40,*/'2014-09-25 22:33:11'), +(55,'1135 Izumisano Parkway','','California',171,'48150','171822533480',/*!50705 0x0000000001010000009763C3E4D75B5DC0799A2732CE0B4140,*/'2014-09-25 22:33:50'), +(56,'939 Probolinggo Loop','','Galicia',1,'4166','680428310138',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:08'), +(57,'17 Kabul Boulevard','','Chiba',355,'38594','697760867968',/*!50705 0x000000000101000000EB257CA5E27C61406F70D86C9BED4140,*/'2014-09-25 22:31:51'), +(58,'1964 Allappuzha (Alleppey) Street','','Yamaguchi',227,'48980','920811325222',/*!50705 0x000000000101000000C2572A5E1B876040D19A7A38DC144140,*/'2014-09-25 22:31:47'), +(59,'1697 Kowloon and New Kowloon Loop','','Moskova',49,'57807','499352017190',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:47'), +(60,'1668 Saint Louis Place','','Tahiti',397,'39072','347487831378',/*!50705 0x0000000001010000006FF3C64921B262C0F8F47DDD8E8931C0,*/'2014-09-25 22:31:02'), +(61,'943 Tokat Street','','Vaduz',560,'45428','889318963672',/*!50705 0x0000000001010000007F784C93080B23400341800C1D924740,*/'2014-09-25 22:31:58'), +(62,'1114 Liepaja Street','','Sarawak',282,'69226','212869228936',/*!50705 0x000000000101000000047FAE6C55955B408285DDC199E9F83F,*/'2014-09-25 22:32:00'), +(63,'1213 Ranchi Parkway','','Karnataka',350,'94352','800024380485',/*!50705 0x000000000101000000000080279AD7C641AA21BB1CC0202B40,*/'2014-09-25 22:31:21'), +(64,'81 Hodeida Way','','Rajasthan',231,'55561','250767749542',/*!50705 0x0000000001010000000A09BDA36BF25240F8B138526CEB3A40,*/'2014-09-25 22:31:17'), +(65,'915 Ponce Place','','Basel-Stadt',56,'83980','1395251317',/*!50705 0x0000000001010000000D6146C2084B1E40E58B07A579C74740,*/'2014-09-25 22:33:12'), +(66,'1717 Guadalajara Lane','','Missouri',441,'85505','914090181665',/*!50705 0x000000000101000000A926D247AA8C56C0A456F3774A504340,*/'2014-09-25 22:33:59'), +(67,'1214 Hanoi Way','','Nebraska',306,'67055','491001136577',/*!50705 0x000000000101000000D6671888AF2A58C0C0E2152DE5684440,*/'2014-09-25 22:33:56'), +(68,'1966 Amroha Avenue','','Sichuan',139,'70385','333489324603',/*!50705 0x0000000001010000000A7778190FE05A402F6013E346373F40,*/'2014-09-25 22:30:32'), +(69,'698 Otsu Street','','Cayenne',105,'71110','409983924481',/*!50705 0x000000000101000000D879C0E1AA2A4AC0D57EC6E0BCBB1340,*/'2014-09-25 22:31:02'), +(70,'1150 Kimchon Manor','','Skne ln',321,'96109','663449333709',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:11'), +(71,'1586 Guaruj Place','','Hunan',579,'5135','947233365992',/*!50705 0x000000000101000000AD3A06BFE83F5C4083047B0217DA3B40,*/'2014-09-25 22:30:46'), +(72,'57 Arlington Manor','','Madhya Pradesh',475,'48960','990214419142',/*!50705 0x0000000001010000008E6D63FDB069534027D9EA724A6E3940,*/'2014-09-25 22:31:27'), +(73,'1031 Daugavpils Parkway','','Bchar',63,'59025','107137400143',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:29:59'), +(74,'1124 Buenaventura Drive','','Mekka',13,'6856','407733804223',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:59'), +(75,'492 Cam Ranh Street','','Eastern Visayas',61,'50805','565018274456',/*!50705 0x0000000001010000007500C45D3D335F40B90265AE675B2540,*/'2014-09-25 22:32:34'), +(76,'89 Allappuzha (Alleppey) Manor','','National Capital Reg',517,'75444','255800440636',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:39'), +(77,'1947 Poos de Caldas Boulevard','','Chiayi',114,'60951','427454485876',/*!50705 0x0000000001010000002F06C54524195E40B4475E8C37763740,*/'2014-09-25 22:33:14'), +(78,'1206 Dos Quebradas Place','','So Paulo',431,'20207','241832790687',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:21'), +(79,'1551 Rampur Lane','','Changhwa',108,'72394','251164340471',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:14'), +(80,'602 Paarl Street','','Pavlodar',402,'98889','896314772871',/*!50705 0x000000000101000000359078C34740534032D010E912234A40,*/'2014-09-25 22:31:55'), +(81,'1692 Ede Loop','','So Paulo',30,'9223','918711376618',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:16'), +(82,'936 Salzburg Lane','','Uttar Pradesh',425,'96709','875756771675',/*!50705 0x0000000001010000000C0EE5FAAD4F5440CBF8F71917383A40,*/'2014-09-25 22:31:24'), +(83,'586 Tete Way','','Kanagawa',256,'1079','18581624103',/*!50705 0x000000000101000000783B0CF79B716140E96D22E989A74140,*/'2014-09-25 22:31:48'), +(84,'1888 Kabul Drive','','Oyo & Osun',217,'20936','701457319790',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:24'), +(85,'320 Baiyin Parkway','','Mahajanga',319,'37307','223664661973',/*!50705 0x000000000101000000EAFD90C888284740CDC75AE8EF6E2FC0,*/'2014-09-25 22:31:59'), +(86,'927 Baha Blanca Parkway','','Krim',479,'9495','821972242086',/*!50705 0x000000000101000000417DCB9C2E0E4140BC29406F857A4640,*/'2014-09-25 22:33:33'), +(87,'929 Tallahassee Loop','','Gauteng',497,'74671','800716535041',/*!50705 0x000000000101000000647F8FB05E6B3C407F60D8ABD9403AC0,*/'2014-09-25 22:33:06'), +(88,'125 Citt del Vaticano Boulevard','','Puebla',40,'67912','48417642933',/*!50705 0x000000000101000000536232B0E99B58C03D0D18247DE83240,*/'2014-09-25 22:32:02'), +(89,'1557 Ktahya Boulevard','','England',88,'88002','720998247660',/*!50705 0x0000000001010000001B43A5B67908FCBF439D03159FE54A40,*/'2014-09-25 22:33:36'), +(90,'870 Ashqelon Loop','','Songkhla',489,'84931','135117278909',/*!50705 0x000000000101000000E82510C017265940115A6A1899CB1C40,*/'2014-09-25 22:33:20'), +(91,'1740 Portoviejo Avenue','','Sucre',480,'29932','198123170793',/*!50705 0x000000000101000000C4AD275F75D952C07A51BB5F059C2240,*/'2014-09-25 22:30:53'), +(92,'1942 Ciparay Parkway','','Cheju',113,'82624','978987363654',/*!50705 0x00000000010100000048F13B97F3A25F40358EA2186AB34040,*/'2014-09-25 22:33:06'), +(93,'1926 El Alto Avenue','','Buenos Aires',289,'75543','846225459260',/*!50705 0x000000000101000000AD05AC0B2EFA4CC0C5D0A057F27541C0,*/'2014-09-25 22:30:05'), +(94,'1952 Chatsworth Drive','','Guangdong',332,'25958','991562402283',/*!50705 0x000000000101000000A5F386A08F085D406DF65157885A3840,*/'2014-09-25 22:30:40'), +(95,'1370 Le Mans Avenue','','Brunei and Muara',53,'52163','345679835036',/*!50705 0x00000000010100000013E85D06ADBC5C402A0E5652DDC21340,*/'2014-09-25 22:30:23'), +(96,'984 Effon-Alaiye Avenue','','Gois',183,'17119','132986892228',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:17'), +(97,'832 Nakhon Sawan Manor','','Inner Mongolia',592,'49021','275595571388',/*!50705 0x000000000101000000535C55F6DDAD5E400000001D69FABC41,*/'2014-09-25 22:30:50'), +(98,'152 Kitwe Parkway','','Caraga',82,'53182','835433605312',/*!50705 0x000000000101000000DF652BD43F945F4006CAB788396E2040,*/'2014-09-25 22:32:35'), +(99,'1697 Tanauan Lane','','Punjab',399,'22870','4764773857',/*!50705 0x000000000101000000CA97063447E95240B933B852742A4040,*/'2014-09-25 22:31:22'), +(100,'1308 Arecibo Way','','Georgia',41,'30695','6171054059',/*!50705 0x000000000101000000FC00FFEF637E54C0BD9EF9E648BC4040,*/'2014-09-25 22:33:43'), +(101,'1599 Plock Drive','','Tete',534,'71986','817248913162',/*!50705 0x000000000101000000DC77561C18CB4040B443577D092830C0,*/'2014-09-25 22:32:18'), +(102,'669 Firozabad Loop','','Abu Dhabi',12,'92265','412903167998',/*!50705 0x0000000001010000009C76E73F5AE14B404AD05FE811313840,*/'2014-09-25 22:33:35'), +(103,'588 Vila Velha Manor','','Kyongsangbuk',268,'51540','333339908719',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:07'), +(104,'1913 Kamakura Place','','Lipetsk',238,'97287','942570536750',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:49'), +(105,'733 Mandaluyong Place','','Asir',2,'77459','196568435814',/*!50705 0x0000000001010000007823980FAD404540798FD89365373240,*/'2014-09-25 22:32:59'), +(106,'659 Vaduz Drive','','Ha Darom',34,'49708','709935135487',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:40'), +(107,'1177 Jelets Way','','Kwara & Kogi',220,'3305','484292626944',/*!50705 0x0000000001010000001767672CF53712407E3E25427E192140,*/'2014-09-25 22:32:24'), +(108,'1386 Yangor Avenue','','Provence-Alpes-Cte',543,'80720','449216226468',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:01'), +(109,'454 Nakhon Sawan Boulevard','','Funafuti',173,'76383','963887147572',/*!50705 0x0000000001010000005822ABB636666640FF74A84B6B0C21C0,*/'2014-09-25 22:33:31'), +(110,'1867 San Juan Bautista Tuxtepec Avenue','','Ivanovo',225,'78311','547003310357',/*!50705 0x000000000101000000BC6DF0CF567C4440E2B034F0A37F4C40,*/'2014-09-25 22:32:48'), +(111,'1532 Dzerzinsk Way','','Buenos Aires',334,'9599','330838016880',/*!50705 0x000000000101000000BF93BB74385D4DC0E207420D3A5541C0,*/'2014-09-25 22:30:06'), +(112,'1002 Ahmadnagar Manor','','Mxico',213,'93026','371490777743',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:07'), +(113,'682 Junan Way','','North West',273,'30418','622255216127',/*!50705 0x000000000101000000714683CAAEAA3A406AEDC73725DA3AC0,*/'2014-09-25 22:33:04'), +(114,'804 Elista Drive','','Hubei',159,'61069','379804592943',/*!50705 0x0000000001010000009E013FF4EE5E5B40E7E099D0245F3E40,*/'2014-09-25 22:30:33'), +(115,'1378 Alvorada Avenue','','Distrito Federal',102,'75834','272234298332',/*!50705 0x0000000001010000000C3444BA44B850C047B1378CDDF92440,*/'2014-09-25 22:34:03'), +(116,'793 Cam Ranh Avenue','','California',292,'87057','824370924746',/*!50705 0x00000000010100000003AF3B82C0885DC0610212A859594140,*/'2014-09-25 22:33:55'), +(117,'1079 Tel Aviv-Jaffa Boulevard','','Sucre',132,'10885','358178933857',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:34:04'), +(118,'442 Rae Bareli Place','','Nordrhein-Westfalen',148,'24321','886636413768',/*!50705 0x000000000101000000C19EC085860F1B40E37ED12F5BB74940,*/'2014-09-25 22:31:04'), +(119,'1107 Nakhon Sawan Avenue','','Mxico',365,'75149','867546627903',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:11'), +(120,'544 Malm Parkway','','Central Java',403,'63502','386759646229',/*!50705 0x0000000001010000003AEF5A9D77575B4026F103A106C51BC0,*/'2014-09-25 22:31:34'), +(121,'1967 Sincelejo Place','','Gujarat',176,'73644','577812616052',/*!50705 0x00000000010100000059912CBBBB2B52408DBC074378373740,*/'2014-09-25 22:31:16'), +(122,'333 Goinia Way','','Texas',185,'78625','909029256431',/*!50705 0x0000000001010000002AE67BA1DB3F58C0E46B2AE67B5F4040,*/'2014-09-25 22:33:51'), +(123,'1987 Coacalco de Berriozbal Loop','','al-Qalyubiya',476,'96065','787654415858',/*!50705 0x000000000101000000595AFC5C23403F40AFBA698E07203E40,*/'2014-09-25 22:30:58'), +(124,'241 Mosul Lane','','Risaralda',147,'76157','765345144779',/*!50705 0x000000000101000000983A23A5B4EA52C06155BDFC4E5B1340,*/'2014-09-25 22:30:52'), +(125,'211 Chiayi Drive','','Uttar Pradesh',164,'58186','665993880048',/*!50705 0x000000000101000000A44BA4D961C1534007F247AC20C73A40,*/'2014-09-25 22:31:15'), +(126,'1175 Tanauan Way','','Lima',305,'64615','937222955822',/*!50705 0x000000000101000000848A60D2CE4153C0E5417A8A1C1628C0,*/'2014-09-25 22:32:33'), +(127,'117 Boa Vista Way','','Uttar Pradesh',566,'6804','677976133614',/*!50705 0x00000000010100000085364AA8AAC0544086BAFE1312513940,*/'2014-09-25 22:31:29'), +(128,'848 Tafuna Manor','','Ktahya',281,'45142','614935229095',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:27'), +(129,'569 Baicheng Lane','','Gauteng',85,'60304','490211944645',/*!50705 0x000000000101000000D71E51FC73423C4048AE51C543363AC0,*/'2014-09-25 22:33:02'), +(130,'1666 Qomsheh Drive','','So Paulo',410,'66255','582835362905',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:20'), +(131,'801 Hagonoy Drive','','Smolensk',484,'8439','237426099212',/*!50705 0x0000000001010000001EB814A122054040BB8509FE12644B40,*/'2014-09-25 22:32:57'), +(132,'1050 Garden Grove Avenue','','Slaskie',236,'4999','973047364353',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:42'), +(133,'1854 Tieli Street','','Shandong',302,'15819','509492324775',/*!50705 0x0000000001010000007A820E0492FE5C408F0475255D3A4240,*/'2014-09-25 22:30:39'), +(134,'758 Junan Lane','','Gois',190,'82639','935448624185',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:18'), +(135,'1752 So Leopoldo Parkway','','Taka-Karpatia',345,'14014','252265130067',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:32'), +(136,'898 Belm Manor','','Free State',87,'49757','707169393853',/*!50705 0x000000000101000000ED4CFCAC8DB43A409EAC623B29453DC0,*/'2014-09-25 22:33:02'), +(137,'261 Saint Louis Way','','Coahuila de Zaragoza',541,'83401','321944036800',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:13'), +(138,'765 Southampton Drive','','al-Qalyubiya',421,'4285','23712411567',/*!50705 0x0000000001010000001BEB877DA7343F409FBC7E77E12D3E40,*/'2014-09-25 22:30:57'), +(139,'943 Johannesburg Avenue','','Maharashtra',417,'5892','90921003005',/*!50705 0x000000000101000000F27A3029BE7652405E2ADB2C03853240,*/'2014-09-25 22:31:24'), +(140,'788 Atinsk Street','','Karnataka',211,'81691','146497509724',/*!50705 0x0000000001010000000000801B1998C64157A945E977E62E40,*/'2014-09-25 22:31:17'), +(141,'1749 Daxian Place','','Gelderland',29,'11044','963369996279',/*!50705 0x000000000101000000E4CE96BDB6E0174000B0952B171C4A40,*/'2014-09-25 22:32:20'), +(142,'1587 Sullana Lane','','Inner Mongolia',207,'85769','468060467018',/*!50705 0x000000000101000000870CF505BEE95B407422669BC0674440,*/'2014-09-25 22:30:35'), +(143,'1029 Dzerzinsk Manor','','Ynlin',542,'57519','33173584456',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:16'), +(144,'1666 Beni-Mellal Place','','Tennessee',123,'13377','9099941466',/*!50705 0x00000000010100000005D1A45E01D755C084CCDFCECF434240,*/'2014-09-25 22:33:48'), +(145,'928 Jaffna Loop','','Hiroshima',172,'93762','581852137991',/*!50705 0x0000000001010000002F2988CBBBAB6040E2FF33EFDD3D4140,*/'2014-09-25 22:31:45'), +(146,'483 Ljubertsy Parkway','','Scotland',149,'60562','581174211853',/*!50705 0x000000000101000000C53E5CCD95CC07C0FAFD518A0C3C4C40,*/'2014-09-25 22:33:36'), +(147,'374 Bat Yam Boulevard','','Kilis',266,'97700','923261616249',/*!50705 0x000000000101000000184FF344C68E4240FD55DBA8A95B4240,*/'2014-09-25 22:33:26'), +(148,'1027 Songkhla Manor','','Minsk',340,'30861','563660187896',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:13'), +(149,'999 Sanaa Loop','','Gauteng',491,'3439','918032330119',/*!50705 0x0000000001010000000E0D309864193C40F234AA1D0F7939C0,*/'2014-09-25 22:33:05'), +(150,'879 Newcastle Way','','Michigan',499,'90732','206841104594',/*!50705 0x000000000101000000916A8E62EFC154C08244C99A474A4540,*/'2014-09-25 22:34:01'), +(151,'1337 Lincoln Parkway','','Saitama',555,'99457','597815221267',/*!50705 0x0000000001010000005E0E6036A6746140456227614BEE4140,*/'2014-09-25 22:31:55'), +(152,'1952 Pune Lane','','Saint-Denis',442,'92150','354615066969',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:46'), +(153,'782 Mosul Street','','Massachusetts',94,'25545','885899703621',/*!50705 0x000000000101000000E9C4D44C2DC151C0D1686105AE0A4540,*/'2014-09-25 22:33:46'), +(154,'781 Shimonoseki Drive','','Michoacn de Ocampo',202,'95444','632316273199',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:06'), +(155,'1560 Jelets Boulevard','','Shandong',291,'77777','189446090264',/*!50705 0x00000000010100000018D57D5B0B6A5D40ADDA3521AD184240,*/'2014-09-25 22:30:38'), +(156,'1963 Moscow Place','','Assam',354,'64863','761379480249',/*!50705 0x000000000101000000203BB9F04D2C57405D595826B2593A40,*/'2014-09-25 22:31:21'), +(157,'456 Escobar Way','','Jakarta Raya',232,'36061','719202533520',/*!50705 0x000000000101000000DDC2A9C516B65A4095CCFB49C6DB18C0,*/'2014-09-25 22:31:33'), +(158,'798 Cianjur Avenue','','Shanxi',590,'76990','499408708580',/*!50705 0x00000000010100000013D6C6D889BF5B409B4BBBE2F3824140,*/'2014-09-25 22:30:49'), +(159,'185 Novi Sad Place','','Bern',72,'41778','904253967161',/*!50705 0x00000000010100000000D0BC772FCA1D40377D2C335B794740,*/'2014-09-25 22:33:13'), +(160,'1367 Yantai Manor','','Ondo & Ekiti',381,'21294','889538496300',/*!50705 0x000000000101000000C25E72ED555514408A7A1C61ACAA1C40,*/'2014-09-25 22:32:26'), +(161,'1386 Nakhon Sawan Boulevard','','Pyongyang-si',420,'53502','368899174225',/*!50705 0x000000000101000000F4BA8FED46705F40A55F6C6B55844340,*/'2014-09-25 22:32:28'), +(162,'369 Papeete Way','','North Carolina',187,'66639','170117068815',/*!50705 0x000000000101000000C49D66DCAFF253C07A2D324B4C094240,*/'2014-09-25 22:33:52'), +(163,'1440 Compton Place','','North Austria',307,'81037','931059836497',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:10'), +(164,'1623 Baha Blanca Manor','','Moskova',310,'81511','149981248346',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:54'), +(165,'97 Shimoga Avenue','','Tel Aviv',533,'44660','177167004331',/*!50705 0x0000000001010000009A56AFC7E96341403192E2885A0A4040,*/'2014-09-25 22:31:41'), +(166,'1740 Le Mans Loop','','Pays de la Loire',297,'22853','168476538960',/*!50705 0x000000000101000000452A8C2D04B9D23F0000006AB82DBD41,*/'2014-09-25 22:31:01'), +(167,'1287 Xiangfan Boulevard','','Gifu',253,'57844','819416131190',/*!50705 0x0000000001010000006AE514D3BB1B61408141D2A755B54140,*/'2014-09-25 22:31:48'), +(168,'842 Salzburg Lane','','Adana',529,'3313','697151428760',/*!50705 0x0000000001010000007207A0072DD5414093228D6555A64240,*/'2014-09-25 22:33:29'), +(169,'154 Tallahassee Loop','','Xinxiang',199,'62250','935508855935',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:34'), +(170,'710 San Felipe del Progreso Avenue','','Lilongwe',304,'76901','843801144113',/*!50705 0x00000000010100000089C855D1C4E44040501D064E11EF2BC0,*/'2014-09-25 22:31:59'), +(171,'1540 Wroclaw Drive','','Maharashtra',107,'62686','182363341674',/*!50705 0x0000000001010000004E10D0D8F2D253407CFB294476F23340,*/'2014-09-25 22:31:14'), +(172,'475 Atinsk Way','','Gansu',240,'59571','201705577290',/*!50705 0x0000000001010000007872970E678C59405544978114404340,*/'2014-09-25 22:30:36'), +(173,'1294 Firozabad Drive','','Jiangxi',407,'70618','161801569569',/*!50705 0x000000000101000000EED7F8A7AF775C402332079C00943B40,*/'2014-09-25 22:30:40'), +(174,'1877 Ezhou Lane','','Rajasthan',550,'63337','264541743403',/*!50705 0x00000000010100000029722DFF466C52401969F34938923840,*/'2014-09-25 22:31:28'), +(175,'316 Uruapan Street','','Perak',223,'58194','275788967899',/*!50705 0x0000000001010000005A3629BB4F4559400AC5B18927561240,*/'2014-09-25 22:31:59'), +(176,'29 Pyongyang Loop','','Batman',58,'47753','734780743462',/*!50705 0x0000000001010000001C430070EC9044403C8963B895F14240,*/'2014-09-25 22:33:23'), +(177,'1010 Klerksdorp Way','','Steiermark',186,'6802','493008546874',/*!50705 0x000000000101000000CFEE35A90DE72E409C0425BB88884740,*/'2014-09-25 22:30:10'), +(178,'1848 Salala Boulevard','','Miranda',373,'25220','48265851133',/*!50705 0x0000000001010000006D08E984ABB150C02F90FBB1A43B2440,*/'2014-09-25 22:34:04'), +(179,'431 Xiangtan Avenue','','Kerala',18,'4854','230250973122',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:10'), +(180,'757 Rustenburg Avenue','','Skikda',483,'89668','506134035434',/*!50705 0x000000000101000000BFD76BD509A31B4063867C8626704240,*/'2014-09-25 22:30:01'), +(181,'146 Johannesburg Way','','Tamaulipas',330,'54132','953689007081',/*!50705 0x0000000001010000003C45B357446058C0EAD621ED35E13940,*/'2014-09-25 22:32:09'), +(182,'1891 Rizhao Boulevard','','So Paulo',456,'47288','391065549876',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:21'), +(183,'1089 Iwatsuki Avenue','','Kirov',270,'35109','866092335135',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:50'), +(184,'1410 Benin City Parkway','','Risaralda',405,'29747','104150372603',/*!50705 0x0000000001010000007C4F9B278DEC52C0795BE9B5D9401340,*/'2014-09-25 22:30:52'), +(185,'682 Garden Grove Place','','Tennessee',333,'67497','72136330362',/*!50705 0x0000000001010000004204C188228356C06B4F24F323934140,*/'2014-09-25 22:33:57'), +(186,'533 al-Ayn Boulevard','','California',126,'8862','662227486184',/*!50705 0x000000000101000000BF2264C5158E5DC08533AE6EABF24040,*/'2014-09-25 22:33:48'), +(187,'1839 Szkesfehrvr Parkway','','Gois',317,'55709','947468818183',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:20'), +(188,'741 Ambattur Manor','','Noord-Brabant',438,'43310','302590383819',/*!50705 0x000000000101000000699E6D7F78371540EF0D74A37ED94940,*/'2014-09-25 22:32:21'), +(189,'927 Barcelona Street','','Chaharmahal va Bakht',467,'65121','951486492670',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:38'), +(190,'435 0 Way','','West Bengali',195,'74750','760171523969',/*!50705 0x000000000101000000D9846A3906075640037168DB7A0F3640,*/'2014-09-25 22:31:16'), +(191,'140 Chiayi Parkway','','Sumy',506,'38982','855863906434',/*!50705 0x0000000001010000002C43C1317066414051BB5F05F8754940,*/'2014-09-25 22:33:34'), +(192,'1166 Changhwa Street','','Caraga',62,'58852','650752094490',/*!50705 0x0000000001010000009DB756201F715F40F53E9F1221832140,*/'2014-09-25 22:32:34'), +(193,'891 Novi Sad Manor','','Ontario',383,'5379','247646995453',/*!50705 0x0000000001010000005E49F25C5FB653C0DE6AE74537F34540,*/'2014-09-25 22:30:28'), +(194,'605 Rio Claro Parkway','','Tabora',513,'49348','352469351088',/*!50705 0x0000000001010000004E8B0B51CF694040DF67017F9D1014C0,*/'2014-09-25 22:33:18'), +(195,'1077 San Felipe de Puerto Plata Place','','Rostov-na-Donu',369,'65387','812824036424',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:56'), +(196,'9 San Miguel de Tucumn Manor','','Uttar Pradesh',169,'90845','956188728558',/*!50705 0x00000000010100000067DBC424B7995340A461E75C40263B40,*/'2014-09-25 22:31:15'), +(197,'447 Surakarta Loop','','Nyanza',271,'10428','940830176580',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:56'), +(198,'345 Oshawa Boulevard','','Tokyo-to',204,'32114','104491201771',/*!50705 0x000000000101000000FB5E9E29CF6C61404BFCF61A27D64140,*/'2014-09-25 22:31:45'), +(199,'1792 Valle de la Pascua Place','','Nordrhein-Westfalen',477,'15540','419419591240',/*!50705 0x000000000101000000E9BD8CBD720C204056725F18FA6F4940,*/'2014-09-25 22:31:06'), +(200,'1074 Binzhou Manor','','Baden-Wrttemberg',325,'36490','331132568928',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:05'), +(201,'817 Bradford Loop','','Jiangsu',109,'89459','264286442804',/*!50705 0x000000000101000000C3E1BB830EFD5D4006B243A10AC63F40,*/'2014-09-25 22:30:31'), +(202,'955 Bamenda Way','','Ondo & Ekiti',218,'1545','768481779568',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:24'), +(203,'1149 A Corua (La Corua) Boulevard','','Haiphong',194,'95824','470884141195',/*!50705 0x0000000001010000007573F1B7BDAB5A4050A0997164DD3440,*/'2014-09-25 22:34:06'), +(204,'387 Mwene-Ditu Drive','','Ahal',35,'8073','764477681869',/*!50705 0x000000000101000000B0253F3D11314D40A538A2D68FFA4240,*/'2014-09-25 22:33:30'), +(205,'68 Molodetno Manor','','Nordrhein-Westfalen',575,'4662','146640639760',/*!50705 0x000000000101000000EEF3739E0C691D40FE486CD2C8B84940,*/'2014-09-25 22:31:06'), +(206,'642 Nador Drive','','Maharashtra',77,'3924','369050085652',/*!50705 0x000000000101000000559D7A4908F25240E010AAD4EC0B3540,*/'2014-09-25 22:31:13'), +(207,'1688 Nador Lane','','Sulawesi Utara',184,'61613','652218196731',/*!50705 0x000000000101000000E358727044945E4093F139C148B9E83F,*/'2014-09-25 22:31:32'), +(208,'1215 Pyongyang Parkway','','Usak',557,'25238','646237101779',/*!50705 0x000000000101000000019E59B7E6673D40735E08DE35564340,*/'2014-09-25 22:33:30'), +(209,'1679 Antofagasta Street','','Alto Paran',122,'86599','905903574913',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:32'), +(210,'1304 s-Hertogenbosch Way','','Santa Catarina',83,'10925','90336226227',/*!50705 0x000000000101000000BDEAB765768848C05755D40561EB3AC0,*/'2014-09-25 22:30:16'), +(211,'850 Salala Loop','','Kitaa',371,'10800','403404780639',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:07'), +(212,'624 Oshawa Boulevard','','West Bengali',51,'89959','49677664184',/*!50705 0x0000000001010000000FBCB5A7BF315640EA7CD34F93383940,*/'2014-09-25 22:31:11'), +(213,'43 Dadu Avenue','','Rajasthan',74,'4855','95666951770',/*!50705 0x000000000101000000BCF957A0A7A852404046E5CBB0583940,*/'2014-09-25 22:31:12'), +(214,'751 Lima Loop','','Aden',7,'99405','756460337785',/*!50705 0x0000000001010000005ECF21BAB1844640A9007388138F2940,*/'2014-09-25 22:34:08'), +(215,'1333 Haldia Street','','Jilin',174,'82161','408304391718',/*!50705 0x00000000010100000007A51E5844345F404CE71E6D77974640,*/'2014-09-25 22:30:33'), +(216,'660 Jedda Boulevard','','Washington',65,'25053','168758068397',/*!50705 0x00000000010100000009EEF60FD88C5EC03C331C2A21CE4740,*/'2014-09-25 22:33:45'), +(217,'1001 Miyakonojo Lane','','Taizz',518,'67924','584316724815',/*!50705 0x0000000001010000006642DD51AD024640782C1103B8282B40,*/'2014-09-25 22:34:11'), +(218,'226 Brest Manor','','California',508,'2299','785881412500',/*!50705 0x000000000101000000CF9F36AA53825EC0B54D96FF35AF4240,*/'2014-09-25 22:34:02'), +(219,'1229 Valencia Parkway','','Haskovo',498,'99124','352679173732',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:24'), +(220,'1201 Qomsheh Manor','','Gois',28,'21464','873492228462',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:15'), +(221,'866 Shivapuri Manor','','Uttar Pradesh',448,'22474','778502731092',/*!50705 0x000000000101000000940BDF0C48A4534072648ADE4E953C40,*/'2014-09-25 22:31:26'), +(222,'1168 Najafabad Parkway','','Kabol',251,'40301','886649065861',/*!50705 0x0000000001010000009173AC9C074B51408EBDCDD199434140,*/'2014-09-25 22:29:59'), +(223,'1244 Allappuzha (Alleppey) Place','','Buenos Aires',567,'20657','991802825778',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:08'), +(224,'1842 Luzinia Boulevard','','Zanzibar West',593,'94420','706878974831',/*!50705 0x00000000010100000045E169E855994340B62C5F97E1A718C0,*/'2014-09-25 22:33:19'), +(225,'1926 Gingoog Street','','Sisilia',511,'22824','469738825391',/*!50705 0x0000000001010000004DD9E907758D2E40719AF4ADC58A4240,*/'2014-09-25 22:31:44'), +(226,'810 Palghat (Palakkad) Boulevard','','Jaroslavl',235,'73431','516331171356',/*!50705 0x00000000010100000069D48DC1D4EF43400294D0A79FD04C40,*/'2014-09-25 22:32:49'), +(227,'1820 Maring Parkway','','Punjab',324,'88307','99760893676',/*!50705 0x0000000001010000001E053EF5FE5E52406C617193AC4A4040,*/'2014-09-25 22:32:30'), +(228,'60 Poos de Caldas Street','','Rajasthan',243,'82338','963063788669',/*!50705 0x00000000010100000069EED7536140524079605B9AB6443A40,*/'2014-09-25 22:31:18'), +(229,'1014 Loja Manor','','Tamil Nadu',22,'66851','460795526514',/*!50705 0x000000000101000000803E366E560A5440A1212DDF44322A40,*/'2014-09-25 22:31:10'), +(230,'201 Effon-Alaiye Way','','Asuncin',37,'64344','684192903087',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:31'), +(231,'430 Alessandria Loop','','Saarland',439,'47446','669828224459',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:06'), +(232,'754 Valencia Place','','Phnom Penh',406,'87911','594319417514',/*!50705 0x0000000001010000009093D3E89F3A5A40AACCDE63FA1F2740,*/'2014-09-25 22:30:25'), +(233,'356 Olomouc Manor','','Gois',26,'93323','22326410776',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:15'), +(234,'1256 Bislig Boulevard','','Botosani',86,'50598','479007229460',/*!50705 0x00000000010100000085059C4AABAA3A408DAC46C032E04740,*/'2014-09-25 22:32:46'), +(235,'954 Kimchon Place','','West Bengali',559,'42420','541327526474',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:28'), +(236,'885 Yingkou Manor','','Kaduna',596,'31390','588964509072',/*!50705 0x00000000010100000006CF296D16E41E4038E3EAB6FA382640,*/'2014-09-25 22:32:28'), +(237,'1736 Cavite Place','','Qina',216,'98775','431770603551',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:56'), +(238,'346 Skikda Parkway','','Hawalli',233,'90628','630424482919',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:57'), +(239,'98 Stara Zagora Boulevard','','Valle',96,'76448','610173756082',/*!50705 0x00000000010100000084CD4AA4FE4153C0DB9953138E0A0F40,*/'2014-09-25 22:30:51'), +(240,'1479 Rustenburg Boulevard','','Southern Tagalog',527,'18727','727785483194',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:40'), +(241,'647 A Corua (La Corua) Street','','Chollanam',357,'36971','792557457753',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:07'), +(242,'1964 Gijn Manor','','Karnataka',473,'14408','918119601885',/*!50705 0x000000000101000000BBC3DCA458E45240DA4246F6F7DC2B40,*/'2014-09-25 22:31:26'), +(243,'47 Syktyvkar Lane','','West Java',118,'22236','63937119031',/*!50705 0x000000000101000000EDABBC2E8DB05A40C3C1397E037E1AC0,*/'2014-09-25 22:31:31'), +(244,'1148 Saarbrcken Parkway','','Fukushima',226,'1921','137773001988',/*!50705 0x000000000101000000AD8ACB4C449C614053F8229001874240,*/'2014-09-25 22:31:47'), +(245,'1103 Bilbays Parkway','','Hubei',578,'87660','279979529227',/*!50705 0x000000000101000000A76ED34444095C401234C1CB67054040,*/'2014-09-25 22:30:45'), +(246,'1246 Boksburg Parkway','','Hebei',422,'28349','890283544295',/*!50705 0x000000000101000000B66A323EA7E55D40E508BE0E41F74340,*/'2014-09-25 22:30:41'), +(247,'1483 Pathankot Street','','Tucumn',454,'37288','686015532180',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:06'), +(248,'582 Papeete Loop','','Central Visayas',294,'27722','569868543137',/*!50705 0x0000000001010000001F189BB1C3FC5E407DC4F9E5DD9E2440,*/'2014-09-25 22:32:38'), +(249,'300 Junan Street','','Kyonggi',553,'81314','890289150158',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:08'), +(250,'829 Grand Prairie Way','','Paran',328,'6461','741070712873',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:20'), +(251,'1473 Changhwa Parkway','','Mxico',124,'75933','266798132374',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:03'), +(252,'1309 Weifang Street','','Florida',520,'57338','435785045362',/*!50705 0x000000000101000000EC0CF8A1F71155C0995A006432703E40,*/'2014-09-25 22:34:02'), +(253,'1760 Oshawa Manor','','Tianjin',535,'38140','56257502250',/*!50705 0x000000000101000000FBBD5EAB4E4B5D40EB0A6C8434924340,*/'2014-09-25 22:30:43'), +(254,'786 Stara Zagora Way','','Oyo & Osun',390,'98332','716256596301',/*!50705 0x000000000101000000DB45E22F77770F4073C8BC44AB691F40,*/'2014-09-25 22:32:27'), +(255,'1966 Tonghae Street','','Anhalt Sachsen',198,'36481','567359279425',/*!50705 0x0000000001010000000000009825D59D41450A0A2879C84940,*/'2014-09-25 22:31:05'), +(256,'1497 Yuzhou Drive','','England',312,'3433','246810237916',/*!50705 0x000000000101000000CC4642B68718C0BFCA822E8617C14940,*/'2014-09-25 22:33:37'), +(258,'752 Ondo Loop','','Miyazaki',338,'32474','134673576619',/*!50705 0x00000000010100000048AD8B36226260408871EDFABBBB3F40,*/'2014-09-25 22:31:50'), +(259,'1338 Zalantun Lane','','Minas Gerais',413,'45403','840522972766',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:21'), +(260,'127 Iwakuni Boulevard','','Central Luzon',192,'20777','987442542471',/*!50705 0x0000000001010000000E6954E0E42E5E40AF05627E13AB2D40,*/'2014-09-25 22:32:37'), +(261,'51 Laredo Avenue','','Sagaing',342,'68146','884536620568',/*!50705 0x0000000001010000008720BD97B1C85740D4D7F335CB1B3640,*/'2014-09-25 22:32:18'), +(262,'771 Yaound Manor','','Sofala',64,'86768','245477603573',/*!50705 0x000000000101000000103345CA606B414046CB2665F7D733C0,*/'2014-09-25 22:32:17'), +(263,'532 Toulon Street','','Santiago',460,'69517','46871694740',/*!50705 0x000000000101000000ECD33B269CAC51C09AB67F65A5733340,*/'2014-09-25 22:30:55'), +(264,'1027 Banjul Place','','West Bengali',197,'50390','538241037443',/*!50705 0x000000000101000000FE14223BCA1A5640AC6F6072A3EE3640,*/'2014-09-25 22:31:16'), +(265,'1158 Mandi Bahauddin Parkway','','Shanxi',136,'98484','276555730211',/*!50705 0x000000000101000000ECC84741A6525C40A93C7084FB0B4440,*/'2014-09-25 22:30:32'), +(266,'862 Xintai Lane','','Cagayan Valley',548,'30065','265153400632',/*!50705 0x00000000010100000015580053866E5E408A5CCBBFF19C3140,*/'2014-09-25 22:32:41'), +(267,'816 Cayenne Parkway','','Manab',414,'93629','282874611748',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:56'), +(268,'1831 Nam Dinh Loop','','National Capital Reg',323,'51990','322888976727',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:38'), +(269,'446 Kirovo-Tepetsk Lane','','Osaka',203,'19428','303967439816',/*!50705 0x0000000001010000008D94D2D8C3F36040608CED5AE7554140,*/'2014-09-25 22:31:45'), +(270,'682 Halisahar Place','','Severn Morava',378,'20536','475553436330',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:54'), +(271,'1587 Loja Manor','','Salzburg',447,'5410','621625204422',/*!50705 0x0000000001010000002C83C53C86162A405886DD1C53E64740,*/'2014-09-25 22:30:10'), +(272,'1762 Paarl Parkway','','Hunan',298,'53928','192459639410',/*!50705 0x00000000010100000067333D177CDB5B40DBA8A9C024B03B40,*/'2014-09-25 22:30:39'), +(273,'1519 Ilorin Place','','Kerala',395,'49298','357445645426',/*!50705 0x0000000001010000000C4FF921002A5340BD772F52838C2540,*/'2014-09-25 22:31:21'), +(274,'920 Kumbakonam Loop','','California',446,'75090','685010736240',/*!50705 0x00000000010100000012EF4ADCF4695EC01B95E535C0564240,*/'2014-09-25 22:34:00'), +(275,'906 Goinia Way','','Wielkopolskie',255,'83565','701767622697',/*!50705 0x0000000001010000007FA2B2614D1732404064366D6BE14940,*/'2014-09-25 22:32:42'), +(276,'1675 Xiangfan Manor','','Tamil Nadu',283,'11763','271149517630',/*!50705 0x00000000010100000042B687180AD95340EE4108C897EC2540,*/'2014-09-25 22:31:20'), +(277,'85 San Felipe de Puerto Plata Drive','','Shandong',584,'46063','170739645687',/*!50705 0x000000000101000000EA605859365C5E40EF1010DDFDBC4240,*/'2014-09-25 22:30:48'), +(278,'144 South Hill Loop','','Guanajuato',445,'2012','45387294817',/*!50705 0x0000000001010000002B84D558424C59C0699B2CFF6B923440,*/'2014-09-25 22:32:11'), +(279,'1884 Shikarpur Avenue','','Haryana',263,'85548','959949395183',/*!50705 0x0000000001010000002CE395DA413F5340EB460EC7A9B03D40,*/'2014-09-25 22:31:19'), +(280,'1980 Kamjanets-Podilskyi Street','','Illinois',404,'89502','874337098891',/*!50705 0x000000000101000000167CE420B26556C0B7966EB7C9584440,*/'2014-09-25 22:33:57'), +(281,'1944 Bamenda Way','','Michigan',573,'24645','75975221996',/*!50705 0x000000000101000000B8B64B76C7C154C0EF254344203D4540,*/'2014-09-25 22:34:03'), +(282,'556 Baybay Manor','','Oyo & Osun',374,'55802','363982224739',/*!50705 0x000000000101000000F5C6FFD3C30E1140FC30E7BE41502040,*/'2014-09-25 22:32:25'), +(283,'457 Tongliao Loop','','Bursa',222,'56254','880756161823',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:25'), +(284,'600 Bradford Street','','East Azerbaidzan',514,'96204','117592274996',/*!50705 0x000000000101000000EE4E2D115E25474044FF5FD09D0A4340,*/'2014-09-25 22:31:40'), +(285,'1006 Santa Brbara dOeste Manor','','Ondo & Ekiti',389,'36229','85059738746',/*!50705 0x000000000101000000FBC67CE5E6581640531A7B40EAC81C40,*/'2014-09-25 22:32:26'), +(286,'1308 Sumy Loop','','Fujian',175,'30657','583021225407',/*!50705 0x000000000101000000DC7AF25597D35D409617AAACB70F3A40,*/'2014-09-25 22:30:34'), +(287,'1405 Chisinau Place','','Ponce',411,'8160','62781725285',/*!50705 0x000000000101000000974341DF4CA750C03F219628D6023240,*/'2014-09-25 22:32:45'), +(288,'226 Halifax Street','','Xinxiang',277,'58492','790651020929',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:38'), +(289,'1279 Udine Parkway','','Edo & Delta',69,'75860','195003555232',/*!50705 0x000000000101000000FFB7EDD68D8216408FF4B3A217571940,*/'2014-09-25 22:32:23'), +(290,'1336 Benin City Drive','','Shiga',386,'46044','341242939532',/*!50705 0x000000000101000000D5810761C9FB60401B07A8BA91804140,*/'2014-09-25 22:31:53'), +(291,'1155 Liaocheng Place','','Oyo & Osun',152,'22650','558236142492',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:23'), +(292,'1993 Tabuk Lane','','Tamil Nadu',522,'64221','648482415405',/*!50705 0x0000000001010000002AF3A0EA210854407F94C78965D92940,*/'2014-09-25 22:31:27'), +(293,'86 Higashiosaka Lane','','Guanajuato',563,'33768','957128697225',/*!50705 0x0000000001010000002DAF5C6F1B4C59C07F34F7EBA9643440,*/'2014-09-25 22:32:14'), +(294,'1912 Allende Manor','','Kowloon and New Kowl',279,'58124','172262454487',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:09'), +(295,'544 Tarsus Boulevard','','Gurico',562,'53145','892523334',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:34:05'), +(296,'1936 Cuman Avenue','','Virginia',433,'61195','976798660411',/*!50705 0x000000000101000000FD7B3A6840FC53C065F4ED6EAFA24240,*/'2014-09-25 22:33:58'), +(297,'1192 Tongliao Street','','Sharja',470,'19065','350970907017',/*!50705 0x000000000101000000AA27F38FBEB44B4053E68B625E563940,*/'2014-09-25 22:33:35'), +(298,'44 Najafabad Way','','Baskimaa',146,'61391','96604821070',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:08'), +(299,'32 Pudukkottai Lane','','Ohio',140,'38834','967274728547',/*!50705 0x000000000101000000077AA86D430C55C0409C2C5A25E14340,*/'2014-09-25 22:33:49'), +(300,'661 Chisinau Lane','','Pietari',274,'8856','816436065431',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:51'), +(301,'951 Stara Zagora Manor','','Punjab',400,'98573','429925609431',/*!50705 0x0000000001010000001E296C50C51953405651723DC0533E40,*/'2014-09-25 22:31:22'), +(302,'922 Vila Velha Loop','','Maharashtra',9,'4085','510737228015',/*!50705 0x000000000101000000738F5B8242AF5240612129D835183340,*/'2014-09-25 22:31:10'), +(303,'898 Jining Lane','','Pohjois-Pohjanmaa',387,'40070','161643343536',/*!50705 0x0000000001010000003DFB80F6D9773940C8D0B183CA405040,*/'2014-09-25 22:31:00'), +(304,'1635 Kuwana Boulevard','','Hiroshima',205,'52137','710603868323',/*!50705 0x000000000101000000AA944330B38E6040247035FCB8324140,*/'2014-09-25 22:31:46'), +(305,'41 El Alto Parkway','','Maharashtra',398,'56883','51917807050',/*!50705 0x000000000101000000D487E41A55315340BC3088FEBF443340,*/'2014-09-25 22:31:22'), +(306,'1883 Maikop Lane','','Kaliningrad',254,'68469','96110042435',/*!50705 0x00000000010100000020DF94A8CD82344015D918856E5A4B40,*/'2014-09-25 22:32:50'), +(307,'1908 Gaziantep Place','','Liaoning',536,'58979','108053751300',/*!50705 0x0000000001010000004DAA6C0EC6E65E408E9F7C30DF344540,*/'2014-09-25 22:30:43'), +(308,'687 Alessandria Parkway','','Sanaa',455,'57587','407218522294',/*!50705 0x0000000001010000000C60257A741A4640854A123A9EB52E40,*/'2014-09-25 22:34:10'), +(309,'827 Yuncheng Drive','','Callao',99,'79047','504434452842',/*!50705 0x000000000101000000C2514DA48F4753C0271CD544FA1C28C0,*/'2014-09-25 22:32:32'), +(310,'913 Coacalco de Berriozbal Loop','','Texas',33,'42141','262088367001',/*!50705 0x00000000010100000023371EC7EA4658C0A86851442B5E4040,*/'2014-09-25 22:33:43'), +(311,'715 So Bernardo do Campo Lane','','Kedah',507,'84804','181179321332',/*!50705 0x000000000101000000D8DBC1E3361F5940520DFB3DB1961640,*/'2014-09-25 22:32:00'), +(312,'1354 Siegen Street','','Rio de Janeiro',25,'80184','573441801529',/*!50705 0x0000000001010000009146054EB62846C0FCA0D398B50137C0,*/'2014-09-25 22:30:15'), +(313,'1191 Sungai Petani Boulevard','','Missouri',262,'9668','983259819766',/*!50705 0x00000000010100000055890D7107A557C0CB7564F6C38C4340,*/'2014-09-25 22:33:54'), +(314,'1224 Huejutla de Reyes Boulevard','','Lombardia',91,'70923','806016930576',/*!50705 0x000000000101000000D85B6F40F06D24405EEE38EA8DC44640,*/'2014-09-25 22:31:43'), +(315,'543 Bergamo Avenue','','Minas Gerais',215,'59686','103602195112',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:18'), +(316,'746 Joliet Lane','','Kursk',286,'94878','688485191923',/*!50705 0x00000000010100000085949F54FB174240E0DCBAF660DE4940,*/'2014-09-25 22:32:52'), +(317,'780 Kimberley Way','','Tabuk',515,'17032','824396883951',/*!50705 0x0000000001010000001BD47E6B274942408B53AD8559663C40,*/'2014-09-25 22:33:00'), +(318,'1774 Yaound Place','','Hubei',166,'91400','613124286867',/*!50705 0x0000000001010000002A00C633E8B15C404C63C5BA027D3E40,*/'2014-09-25 22:30:33'), +(319,'1957 Yantai Lane','','So Paulo',490,'59255','704948322302',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:22'), +(320,'1542 Lubumbashi Boulevard','','Tel Aviv',57,'62472','508800331065',/*!50705 0x000000000101000000765F84DF3C6041403CAB60AF0B034040,*/'2014-09-25 22:31:41'), +(321,'651 Pathankot Loop','','Maharashtra',336,'59811','139378397418',/*!50705 0x0000000001010000002198FE8062A952408AC168FBFCD23040,*/'2014-09-25 22:31:20'), +(322,'1359 Zhoushan Parkway','','Streymoyar',545,'29763','46568045367',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:59'), +(323,'1769 Iwaki Lane','','Kujawsko-Pomorskie',97,'25787','556100547674',/*!50705 0x000000000101000000487B7203F4013240837EF0EBD18F4A40,*/'2014-09-25 22:32:41'), +(324,'1145 Vilnius Manor','','Mxico',451,'73170','674805712553',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:12'), +(325,'1892 Nabereznyje Telny Lane','','Tutuila',516,'28396','478229987054',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:02'), +(326,'470 Boksburg Street','','Central',81,'97960','908029859266',/*!50705 0x000000000101000000DAE78C83263855405BE21291AB023B40,*/'2014-09-25 22:32:19'), +(327,'1427 A Corua (La Corua) Place','','Buenos Aires',45,'85799','972574862516',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:04'), +(328,'479 San Felipe del Progreso Avenue','','Morelos',130,'54949','869051782691',/*!50705 0x000000000101000000C87E710484BC58C039FD8F02FACD3240,*/'2014-09-25 22:32:04'), +(329,'867 Benin City Avenue','','Henan',591,'78543','168884817145',/*!50705 0x000000000101000000A0F2F972B05D5C405D68531AD6144140,*/'2014-09-25 22:30:50'), +(330,'981 Kumbakonam Place','','Distrito Federal',89,'87611','829116184079',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:17'), +(331,'1016 Iwakuni Street','','St George',269,'49833','961370847344',/*!50705 0x000000000101000000A1DC11A9C49C4EC0D11B936A44512A40,*/'2014-09-25 22:32:59'), +(332,'663 Baha Blanca Parkway','','Adana',5,'33463','834418779292',/*!50705 0x000000000101000000BE72182719AA4140CCD1E3F736804240,*/'2014-09-25 22:33:22'), +(333,'1860 Taguig Loop','','West Java',119,'59550','38158430589',/*!50705 0x00000000010100000042ACA34FD0E55A40D698C6E52ED81BC0,*/'2014-09-25 22:31:32'), +(334,'1816 Bydgoszcz Loop','','Dhaka',234,'64308','965273813662',/*!50705 0x000000000101000000A717C627AE7C564080BD1D3C6EEB3840,*/'2014-09-25 22:30:12'), +(335,'587 Benguela Manor','','Illinois',42,'91590','165450987037',/*!50705 0x00000000010100000097CEE2207C1456C0DDEFABCD5AE14440,*/'2014-09-25 22:33:44'), +(336,'430 Kumbakonam Drive','','Santa F',457,'28814','105470691550',/*!50705 0x00000000010100000004C1882249304DC055DF54FF7B4E41C0,*/'2014-09-25 22:30:07'), +(337,'1838 Tabriz Lane','','Dhaka',143,'1195','38988715447',/*!50705 0x0000000001010000001A5D948F139A5640C4D21B49DDB53740,*/'2014-09-25 22:30:12'), +(338,'431 Szkesfehrvr Avenue','','Baki',48,'57828','119501405123',/*!50705 0x000000000101000000A77686A92DF248400FAECACF57304440,*/'2014-09-25 22:30:11'), +(339,'503 Sogamoso Loop','','Sumqayit',505,'49812','834626715837',/*!50705 0x0000000001010000006C83C94395D548402C8EB9217C4B4440,*/'2014-09-25 22:30:11'), +(340,'507 Smolensk Loop','','Sousse',492,'22971','80303246192',/*!50705 0x000000000101000000298EA8F52346254075DA649EA6E94140,*/'2014-09-25 22:33:21'), +(341,'1920 Weifang Avenue','','Uttar Pradesh',427,'15643','869507847714',/*!50705 0x0000000001010000001F3EFA70DAC153407410CF6D1DCF3C40,*/'2014-09-25 22:31:25'), +(342,'124 al-Manama Way','','Hiroshima',382,'52368','647899404952',/*!50705 0x0000000001010000004BE07B244AA760407B0ED18D55354140,*/'2014-09-25 22:31:52'), +(343,'1443 Mardan Street','','Western Cape',392,'31483','231383037471',/*!50705 0x000000000101000000FB6074D42CF73240B0B03B3833DA40C0,*/'2014-09-25 22:33:05'), +(344,'1909 Benguela Lane','','Henan',581,'19913','624138001031',/*!50705 0x000000000101000000F4AD6AA480775C4066EB2AEE89A74140,*/'2014-09-25 22:30:47'), +(345,'68 Ponce Parkway','','Hanoi',201,'85926','870635127812',/*!50705 0x0000000001010000005DF525C0D5755A4000F61B3746063540,*/'2014-09-25 22:34:06'), +(346,'1217 Konotop Avenue','','Gelderland',151,'504','718917251754',/*!50705 0x000000000101000000F438679F22A2164019B4EB3944044A40,*/'2014-09-25 22:32:20'), +(347,'1293 Nam Dinh Way','','Roraima',84,'71583','697656479977',/*!50705 0x0000000001010000008EE6C8CA2F564EC0D9C23DE0CB8E0640,*/'2014-09-25 22:30:17'), +(348,'785 Vaduz Street','','Baja California',335,'36170','895616862749',/*!50705 0x0000000001010000000D61EB0816DD5CC07DB328475C504040,*/'2014-09-25 22:32:10'), +(349,'1516 Escobar Drive','','Tongatapu',370,'46069','64536069371',/*!50705 0x0000000001010000009132987575E665C0BE11DDB3AE2335C0,*/'2014-09-25 22:33:20'), +(350,'1628 Nagareyama Lane','','Central',453,'60079','20064292617',/*!50705 0x00000000010100000019A5F04520C14CC029006B7AF55639C0,*/'2014-09-25 22:32:32'), +(351,'1157 Nyeri Loop','','Adygea',320,'56380','262744791493',/*!50705 0x000000000101000000AC91B8228C0D4440EBD10AC2CB4D4640,*/'2014-09-25 22:32:55'), +(352,'1673 Tangail Drive','','Daugavpils',137,'26857','627924259271',/*!50705 0x0000000001010000004377A45588883A40E580B80611F14B40,*/'2014-09-25 22:31:57'), +(353,'381 Kabul Way','','Taipei',209,'87272','55477302294',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:15'), +(354,'953 Hodeida Street','','Southern Tagalog',221,'18841','53912826864',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:37'), +(355,'469 Nakhon Sawan Street','','Tuvassia',531,'58866','689199636560',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:58'), +(356,'1378 Beira Loop','','Krasnojarsk',597,'40792','840957664136',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:58'), +(357,'1641 Changhwa Place','','Nord-Ouest',52,'37636','256546485220',/*!50705 0x000000000101000000103B53E8BC4A2440A4C0A7DEBFD61740,*/'2014-09-25 22:30:25'), +(358,'1698 Southport Loop','','Hidalgo',393,'49009','754358349853',/*!50705 0x0000000001010000007AB82E46EEAE58C03DED951EF21D3440,*/'2014-09-25 22:32:11'), +(359,'519 Nyeri Manor','','So Paulo',461,'37650','764680915323',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:21'), +(360,'619 Hunuco Avenue','','Shimane',331,'81508','142596392389',/*!50705 0x000000000101000000A09ADC399EA160405B1D4AFE71BC4140,*/'2014-09-25 22:31:50'), +(361,'45 Aparecida de Goinia Place','','Madhya Pradesh',464,'7431','650496654258',/*!50705 0x0000000001010000009E0CE94BCA345440C9FDB38B0E953840,*/'2014-09-25 22:31:26'), +(362,'482 Kowloon and New Kowloon Manor','','Bratislava',90,'97056','738968474939',/*!50705 0x00000000010100000070DC18F1531B3140BDB90908F7124840,*/'2014-09-25 22:33:02'), +(363,'604 Bern Place','','Jharkhand',429,'5373','620719383725',/*!50705 0x000000000101000000799F9916AB55554037CC86EB07593740,*/'2014-09-25 22:31:25'), +(364,'1623 Kingstown Drive','','Buenos Aires',20,'91299','296394569728',/*!50705 0x000000000101000000791563AAAA2A4DC0E4839ECDAA6A41C0,*/'2014-09-25 22:30:04'), +(365,'1009 Zanzibar Lane','','Arecibo',32,'64875','102396298916',/*!50705 0x000000000101000000FBBD5EABCEAD50C0E9787187F2783240,*/'2014-09-25 22:32:45'), +(366,'114 Jalib al-Shuyukh Manor','','Centre',585,'60440','845378657301',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:25'), +(367,'1163 London Parkway','','Par',66,'6066','675120358494',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:16'), +(368,'1658 Jastrzebie-Zdrj Loop','','Central',372,'96584','568367775448',/*!50705 0x0000000001010000002B73A900CEEF4240660811BA956FB9BF,*/'2014-09-25 22:31:56'), +(369,'817 Laredo Avenue','','Jalisco',188,'77449','151249681135',/*!50705 0x000000000101000000F00BF9B113D959C03E4EE2BDB4AA3440,*/'2014-09-25 22:32:06'), +(370,'1565 Tangail Manor','','Okinawa',377,'45750','634445428822',/*!50705 0x000000000101000000D94C744CCCAA5F4045A1C096B2C53940,*/'2014-09-25 22:31:52'), +(371,'1912 Emeishan Drive','','Balikesir',50,'33050','99883471275',/*!50705 0x000000000101000000F1074D5CD8E23B400B2A053818D34340,*/'2014-09-25 22:33:22'), +(372,'230 Urawa Drive','','Andhra Pradesh',8,'2738','166898395731',/*!50705 0x0000000001010000008B04AE869F515340B2930BDF0C402F40,*/'2014-09-25 22:31:09'), +(373,'1922 Miraj Way','','Esfahan',356,'13203','320471479776',/*!50705 0x00000000010100000017050B71F6AE494026231DD434514040,*/'2014-09-25 22:31:37'), +(374,'433 Florencia Street','','Chihuahua',250,'91330','561729882725',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:08'), +(375,'1049 Matamoros Parkway','','Karnataka',191,'69640','960505250340',/*!50705 0x0000000001010000007923F3C89F355340386744696F563140,*/'2014-09-25 22:31:16'), +(376,'1061 Ede Avenue','','Southern Tagalog',98,'57810','333390595558',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:35'), +(377,'154 Oshawa Manor','','East Java',415,'72771','440365973660',/*!50705 0x00000000010100000005B93077D24D5C4065074B2B74041FC0,*/'2014-09-25 22:31:34'), +(378,'1191 Tandil Drive','','Southern Tagalog',523,'6362','45554316010',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:40'), +(379,'1133 Rizhao Avenue','','Pernambuco',572,'2800','600264533987',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:23'), +(380,'1519 Santiago de los Caballeros Loop','','East Kasai',348,'22025','409315295763',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:53'), +(381,'1618 Olomouc Manor','','Kurgan',285,'26385','96846695220',/*!50705 0x000000000101000000B1694A5755555040EA8FD552E5B94B40,*/'2014-09-25 22:32:51'), +(382,'220 Hidalgo Drive','','Kermanshah',265,'45298','342720754566',/*!50705 0x0000000001010000004E7A843F6888474008605EDB36284140,*/'2014-09-25 22:31:37'), +(383,'686 Donostia-San Sebastin Lane','','Guangdong',471,'97390','71857599858',/*!50705 0x000000000101000000F90A1C1A60845C400FDB711EA98B3640,*/'2014-09-25 22:30:42'), +(384,'97 Mogiljov Lane','','Gujarat',73,'89294','924815207181',/*!50705 0x000000000101000000B4F116FEC209524097DB076A42C63540,*/'2014-09-25 22:31:11'), +(385,'1642 Charlotte Amalie Drive','','Slaskie',549,'75442','821476736117',/*!50705 0x000000000101000000DDC4DA2967F73240D5D6E3198F114940,*/'2014-09-25 22:32:44'), +(386,'1368 Maracabo Boulevard','','',493,'32716','934352415130',/*!50705 0x000000000101000000731074B4AA8A4FC050920953EF2E3240,*/'2014-09-25 22:30:03'), +(387,'401 Sucre Boulevard','','New Hampshire',322,'25007','486395999608',/*!50705 0x000000000101000000817FA54E1BDD51C013718456717F4540,*/'2014-09-25 22:33:56'), +(388,'368 Hunuco Boulevard','','Namibe',360,'17165','106439158941',/*!50705 0x000000000101000000B5858CECEF4D28404D8EF11769642EC0,*/'2014-09-25 22:30:03'), +(389,'500 Lincoln Parkway','','Jiangsu',210,'95509','550306965159',/*!50705 0x0000000001010000003C399E2A3AC15D404409449957CB4040,*/'2014-09-25 22:30:35'), +(390,'102 Chapra Drive','','Ibaragi',521,'14073','776031833752',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:54'), +(391,'1793 Meixian Place','','Hmelnytskyi',258,'33535','619966287415',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:31'), +(392,'514 Ife Way','','Shaba',315,'69973','900235712074',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:53'), +(393,'717 Changzhou Lane','','Southern Tagalog',104,'21615','426255288071',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:36'), +(394,'753 Ilorin Avenue','','Sichuan',157,'3656','464511145118',/*!50705 0x0000000001010000008531D8C3CDD8594059D70D805D883D40,*/'2014-09-25 22:30:32'), +(395,'1337 Mit Ghamr Avenue','','Nakhon Sawan',358,'29810','175283210378',/*!50705 0x0000000001010000009A588572C70859404D237722D2682F40,*/'2014-09-25 22:33:19'), +(396,'767 Pyongyang Drive','','Osaka',229,'83536','667736124769',/*!50705 0x000000000101000000149A7F4FC7EA6040A02413A6DE2F4140,*/'2014-09-25 22:31:48'), +(397,'614 Pak Kret Street','','Addis Abeba',6,'27796','47808359842',/*!50705 0x0000000001010000009F84E3439A5F43402233BCFEC90C2240,*/'2014-09-25 22:30:59'), +(398,'954 Lapu-Lapu Way','','Moskova',278,'8816','737229003916',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:51'), +(399,'331 Bydgoszcz Parkway','','Asturia',181,'966','537374465982',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:09'), +(400,'1152 Citrus Heights Manor','','al-Qadarif',15,'5239','765957414528',/*!50705 0x00000000010100000084F6459D14B14140AA36EE83E2112C40,*/'2014-09-25 22:33:11'), +(401,'168 Cianjur Manor','','Saitama',228,'73824','679095087143',/*!50705 0x000000000101000000DEA925C2EB75614032005471E3F94140,*/'2014-09-25 22:31:48'), +(402,'616 Hagonoy Avenue','','Krasnojarsk',39,'46043','604177838256',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:47'), +(403,'1190 0 Place','','Rio Grande do Sul',44,'10417','841876514789',/*!50705 0x0000000001010000002347DF49B00D4BC086151340D6543FC0,*/'2014-09-25 22:30:16'), +(404,'734 Bchar Place','','Punjab',375,'30586','280578750435',/*!50705 0x0000000001010000006D3B6D8D885C5240C4A40925DDCE3E40,*/'2014-09-25 22:32:31'), +(405,'530 Lausanne Lane','','Texas',135,'11067','775235029633',/*!50705 0x0000000001010000009C830C89A03358C0E2D3F7753B644040,*/'2014-09-25 22:33:49'), +(406,'454 Patiala Lane','','Fukushima',276,'13496','794553031307',/*!50705 0x000000000101000000EC3D4B46448C614091306711E5BB4240,*/'2014-09-25 22:31:49'), +(407,'1346 Mysore Drive','','Bretagne',92,'61507','516647474029',/*!50705 0x0000000001010000004474BE8EEEEE11C070010DDBBB3F4840,*/'2014-09-25 22:31:00'), +(408,'990 Etawah Loop','','Tamil Nadu',564,'79940','206169448769',/*!50705 0x000000000101000000D54B42D8DF3C5340FE518A0C61A72440,*/'2014-09-25 22:31:29'), +(409,'1266 Laredo Parkway','','Saitama',380,'7664','1483365694',/*!50705 0x000000000101000000FBD97EE8F87361403BA5283C0DF44140,*/'2014-09-25 22:31:52'), +(410,'88 Nagaon Manor','','Buenos Aires',524,'86868','779461480495',/*!50705 0x000000000101000000CA3736960B914DC0D78A91802CA942C0,*/'2014-09-25 22:30:07'), +(411,'264 Bhimavaram Manor','','St Thomas',111,'54749','302526949177',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:34:08'), +(412,'1639 Saarbrcken Drive','','North West',437,'9827','328494873422',/*!50705 0x00000000010100000015CB8866F93D3B40E48AE65CE5AA39C0,*/'2014-09-25 22:33:05'), +(413,'692 Amroha Drive','','Northern',230,'35575','359478883004',/*!50705 0x00000000010100000027648CB47900544098E777503F562340,*/'2014-09-25 22:33:10'), +(414,'1936 Lapu-Lapu Parkway','','Bauchi & Gombe',141,'7122','653436985797',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:23'), +(415,'432 Garden Grove Street','','Ontario',430,'65630','615964523510',/*!50705 0x0000000001010000003E867DF1FBDB53C05900AEBF80EF4540,*/'2014-09-25 22:30:28'), +(416,'1445 Carmen Parkway','','West Java',117,'70809','598912394463',/*!50705 0x000000000101000000957950F550C55A40B3BFA21122171BC0,*/'2014-09-25 22:31:30'), +(417,'791 Salinas Street','','Punjab',208,'40509','129953030512',/*!50705 0x000000000101000000579E9B911CFA524075D256804A883F40,*/'2014-09-25 22:31:17'), +(418,'126 Acua Parkway','','West Bengali',71,'58888','480039662421',/*!50705 0x000000000101000000C3013E89191056404E9F7829D01A3840,*/'2014-09-25 22:31:11'), +(419,'397 Sunnyvale Avenue','','Guanajuato',19,'55566','680851640676',/*!50705 0x000000000101000000754419059C2F59C02409C21550EA3440,*/'2014-09-25 22:32:01'), +(420,'992 Klerksdorp Loop','','Utrecht',23,'33711','855290087237',/*!50705 0x000000000101000000C1DFD4ACD88C15404FDC3BB4D9134A40,*/'2014-09-25 22:32:19'), +(421,'966 Arecibo Loop','','Sind',134,'94018','15273765306',/*!50705 0x000000000101000000BE9B1320AFF15040D93400659DBB3A40,*/'2014-09-25 22:32:30'), +(422,'289 Santo Andr Manor','','al-Sharqiya',16,'72410','214976066017',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:59'), +(423,'437 Chungho Drive','','Puerto Plata',450,'59489','491271355190',/*!50705 0x000000000101000000225A86930FAC51C0082692431FCB3340,*/'2014-09-25 22:30:55'), +(424,'1948 Bayugan Parkway','','Bihar',264,'60622','987306329957',/*!50705 0x0000000001010000007613211A82E45540D685C4E2DC893940,*/'2014-09-25 22:31:19'), +(425,'1866 al-Qatif Avenue','','California',155,'89420','546793516940',/*!50705 0x000000000101000000B4EE7AC4C3815DC0165D28AAC8084140,*/'2014-09-25 22:33:50'), +(426,'1661 Abha Drive','','Tamil Nadu',416,'14400','270456873752',/*!50705 0x000000000101000000D3B36A2192B45340FBC5111038C32440,*/'2014-09-25 22:31:23'), +(427,'1557 Cape Coral Parkway','','Hubei',293,'46875','368284120423',/*!50705 0x00000000010100000034CC1A06BDEA5B402D5A25FD62314040,*/'2014-09-25 22:30:38'), +(428,'1727 Matamoros Place','','Sawhaj',465,'78813','129673677866',/*!50705 0x00000000010100000083E38D27DDB13F40555BA093948E3A40,*/'2014-09-25 22:30:57'), +(429,'1269 Botosani Manor','','Guangdong',468,'47394','736517327853',/*!50705 0x000000000101000000C8E1DDDB3ED65C40281B20E230C83640,*/'2014-09-25 22:30:42'), +(430,'355 Vitria de Santo Anto Way','','Oaxaca',452,'81758','548003849552',/*!50705 0x0000000001010000000363D8BC050858C0503750E09D163240,*/'2014-09-25 22:32:13'), +(431,'1596 Acua Parkway','','Jharkhand',418,'70425','157133457169',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:24'), +(432,'259 Ipoh Drive','','So Paulo',189,'64964','419009857119',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:18'), +(433,'1823 Hoshiarpur Lane','','Komi',510,'33191','307133768620',/*!50705 0x000000000101000000C6DA8420AC674940DD9ACF1495D64E40,*/'2014-09-25 22:32:57'), +(434,'1404 Taguig Drive','','Okayama',547,'87212','572068624538',/*!50705 0x000000000101000000205D11A1F6BF6040BFE90203AD864140,*/'2014-09-25 22:31:54'), +(435,'740 Udaipur Lane','','Nizni Novgorod',150,'33505','497288595103',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:47'), +(436,'287 Cuautla Boulevard','','Chuquisaca',501,'72736','82619513349',/*!50705 0x0000000001010000002A0B15D2D05050C049C44ABB870833C0,*/'2014-09-25 22:30:14'), +(437,'1766 Almirante Brown Street','','KwaZulu-Natal',364,'63104','617567598243',/*!50705 0x000000000101000000FDAB7DF090EE3D40488D64EA09C23BC0,*/'2014-09-25 22:33:04'), +(438,'596 Huixquilucan Place','','Nampula',351,'65892','342709348083',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:17'), +(439,'1351 Aparecida de Goinia Parkway','','Northern Mindanao',391,'41775','959834530529',/*!50705 0x000000000101000000DAFF006B55F55E40898C58D5DC4F2040,*/'2014-09-25 22:32:38'), +(440,'722 Bradford Lane','','Shandong',249,'90920','746251338300',/*!50705 0x000000000101000000653E7B890CB55D4078A0A932E7954140,*/'2014-09-25 22:30:37'), +(441,'983 Santa F Way','','British Colombia',565,'47472','145720452260',/*!50705 0x000000000101000000719CCA58A3C75EC0EEE7B92AF59F4840,*/'2014-09-25 22:30:28'), +(442,'1245 Ibirit Way','','La Romana',290,'40926','331888642162',/*!50705 0x0000000001010000006D59BE2E433E51C04FC87322666D3240,*/'2014-09-25 22:30:54'), +(443,'1836 Korla Parkway','','Copperbelt',272,'55405','689681677428',/*!50705 0x000000000101000000064257C796363C40BB7EC16ED89A29C0,*/'2014-09-25 22:34:11'), +(444,'231 Kaliningrad Place','','Lombardia',70,'57833','575081026569',/*!50705 0x0000000001010000007A185A9D9C552340A77E390E17D94640,*/'2014-09-25 22:31:42'), +(445,'495 Bhimavaram Lane','','Maharashtra',144,'3','82088937724',/*!50705 0x0000000001010000003EE1911DC0B15240B39943520BE73440,*/'2014-09-25 22:31:15'), +(446,'1924 Shimonoseki Drive','','Batna',59,'52625','406784385440',/*!50705 0x000000000101000000347CB03154B21840DF814B112AC74140,*/'2014-09-25 22:29:59'), +(447,'105 Dzerzinsk Manor','','Inner Mongolia',540,'48570','240776414296',/*!50705 0x000000000101000000F1C05B7BFA905E40F5EC03DA67CE4540,*/'2014-09-25 22:30:44'), +(448,'614 Denizli Parkway','','Rio Grande do Sul',486,'29444','876491807547',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:22'), +(449,'1289 Belm Boulevard','','Tartumaa',530,'88306','237368926031',/*!50705 0x00000000010100000079680EFF9FB93A406C7E575FB8304D40,*/'2014-09-25 22:30:58'), +(450,'203 Tambaram Street','','Buenos Aires',161,'73942','411549550611',/*!50705 0x000000000101000000E753C72AA5604DC0438CD7BCAA2A41C0,*/'2014-09-25 22:30:05'), +(451,'1704 Tambaram Manor','','West Bengali',554,'2834','39463554936',/*!50705 0x000000000101000000A4E9A2D755065640F598EDAFC3793640,*/'2014-09-25 22:31:28'), +(452,'207 Cuernavaca Loop','','Tatarstan',352,'52671','782900030287',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:55'), +(453,'319 Springs Loop','','Baijeri',160,'99552','72524459905',/*!50705 0x0000000001010000006A62CB3C0304264081FEE7D5A5CB4840,*/'2014-09-25 22:31:05'), +(454,'956 Nam Dinh Manor','','Kerman',481,'21872','474047727727',/*!50705 0x000000000101000000F16206CF29D74B40CFA91A738D733D40,*/'2014-09-25 22:31:39'), +(455,'1947 Paarl Way','','Central Java',509,'23636','834061016202',/*!50705 0x000000000101000000C4D78D2D3AB55B40AC996B8775391EC0,*/'2014-09-25 22:31:35'), +(456,'814 Simferopol Loop','','Sinaloa',154,'48745','524567129902',/*!50705 0x000000000101000000954330B3F42F5BC090CCD9F115313A40,*/'2014-09-25 22:32:05'), +(457,'535 Ahmadnagar Manor','','Abu Dhabi',3,'41136','985109775584',/*!50705 0x000000000101000000D3E6EE29EF2E4B4099C6E52E78773840,*/'2014-09-25 22:33:34'), +(458,'138 Caracas Boulevard','','Zulia',326,'16790','974433019532',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:34:04'), +(459,'251 Florencia Drive','','Michoacn de Ocampo',556,'16119','118011831565',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:13'), +(460,'659 Gatineau Boulevard','','La Paz',153,'28587','205524798287',/*!50705 0x00000000010100000017E7B9CFBB0B51C0A029858ABB7B30C0,*/'2014-09-25 22:30:13'), +(461,'1889 Valparai Way','','Ziguinchor',600,'75559','670370974122',/*!50705 0x00000000010100000020E1C50C9E4530C0FC219111AB2A2940,*/'2014-09-25 22:33:01'), +(462,'1485 Bratislava Place','','Illinois',435,'83183','924663855568',/*!50705 0x000000000101000000A081A2C30D4656C04453D1B3B4224540,*/'2014-09-25 22:33:59'), +(463,'935 Aden Boulevard','','Central Java',532,'64709','335052544020',/*!50705 0x000000000101000000C7139C55FA485B40BEE435655D7A1BC0,*/'2014-09-25 22:31:35'), +(464,'76 Kermanshah Manor','','Esfahan',423,'23343','762361821578',/*!50705 0x000000000101000000FF66182DF6EE4940A60BB1FA23014040,*/'2014-09-25 22:31:37'), +(465,'734 Tanshui Avenue','','Caquet',170,'70664','366776723320',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:52'), +(466,'118 Jaffna Loop','','Northern Mindanao',182,'10447','325526730021',/*!50705 0x00000000010100000028B27B9777475F40BAEA4B80ABAA2140,*/'2014-09-25 22:32:36'), +(467,'1621 Tongliao Avenue','','Irkutsk',558,'22173','209342540247',/*!50705 0x000000000101000000C7269E584CE95940E56A1ACA3F604A40,*/'2014-09-25 22:32:58'), +(468,'1844 Usak Avenue','','Nova Scotia',196,'84461','164414772677',/*!50705 0x0000000001010000004205871744C94FC0162B0F779A524640,*/'2014-09-25 22:30:27'), +(469,'1872 Toulon Loop','','OHiggins',428,'7939','928809465153',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:30'), +(470,'1088 Ibirit Place','','Jalisco',595,'88502','49084281333',/*!50705 0x0000000001010000007820578FA0D859C06AE514D33BB93440,*/'2014-09-25 22:32:15'), +(471,'1322 Mosul Parkway','','Shandong',145,'95400','268053970382',/*!50705 0x0000000001010000002856574F779F5D402425E2523ABB4240,*/'2014-09-25 22:30:32'), +(472,'1447 Chatsworth Place','','Chihuahua',129,'41545','769370126331',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:04'), +(473,'1257 Guadalajara Street','','Karnataka',78,'33599','195337700615',/*!50705 0x000000000101000000052049A4C8ED5240E702F2800DD33040,*/'2014-09-25 22:31:14'), +(474,'1469 Plock Lane','','Galicia',388,'95835','622884741180',/*!50705 0x000000000101000000FB44F9DDCF741FC0ED9A90D6182B4540,*/'2014-09-25 22:33:09'), +(475,'434 Ourense (Orense) Manor','','Hodeida',206,'14122','562370137426',/*!50705 0x000000000101000000F56FF2B62D7A4540DF80E03B7B982D40,*/'2014-09-25 22:34:10'), +(476,'270 Tambaram Parkway','','Gauteng',244,'9668','248446668735',/*!50705 0x0000000001010000005B5540EB2B0B3C4082412D61C8333AC0,*/'2014-09-25 22:33:03'), +(477,'1786 Salinas Place','','Nam Ha',359,'66546','206060652238',/*!50705 0x00000000010100000044BD851A2A7E5A40C2DB8310908D3440,*/'2014-09-25 22:34:07'), +(478,'1078 Stara Zagora Drive','','Aceh',301,'69221','932992626595',/*!50705 0x00000000010100000034057CC8A5495840D2C9ADA470B81440,*/'2014-09-25 22:31:33'), +(479,'1854 Okara Boulevard','','Drenthe',158,'42123','131912793873',/*!50705 0x0000000001010000006E8AC745B5A01B40947BCBE6BB634A40,*/'2014-09-25 22:32:21'), +(480,'421 Yaound Street','','Sumy',385,'11363','726875628268',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:33'), +(481,'1153 Allende Way','','Qubec',179,'20336','856872225376',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:26'), +(482,'808 Naala-Porto Parkway','','England',500,'41060','553452430707',/*!50705 0x0000000001010000000E6036A6CC4201C0B9D7930A74B44A40,*/'2014-09-25 22:33:41'), +(483,'632 Usolje-Sibirskoje Parkway','','Ha Darom',36,'73085','667648979883',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:41'), +(484,'98 Pyongyang Boulevard','','Ohio',11,'88749','191958435142',/*!50705 0x0000000001010000008AB1A778376154C0990524AB6C8A4440,*/'2014-09-25 22:33:42'), +(485,'984 Novoterkassk Loop','','Gaziantep',180,'28165','435118527255',/*!50705 0x000000000101000000CAAF7A1BF6B04240AA8889BC9B874240,*/'2014-09-25 22:33:25'), +(486,'64 Korla Street','','Mwanza',347,'25145','510383179153',/*!50705 0x0000000001010000002A28FB9DDC7B40402EBB719C252204C0,*/'2014-09-25 22:33:17'), +(487,'1785 So Bernardo do Campo Street','','Veracruz',125,'71182','684529463244',/*!50705 0x000000000101000000A1551CBD509C57C0141F44D72A223240,*/'2014-09-25 22:32:04'), +(488,'698 Jelets Boulevard','','Denizli',142,'2596','975185523021',/*!50705 0x000000000101000000EECD6F9868163D40B226BB3E18E34240,*/'2014-09-25 22:33:24'), +(489,'1297 Alvorada Parkway','','Ningxia',587,'11839','508348602835',/*!50705 0x0000000001010000001583D1F679915A4029876066E93B4340,*/'2014-09-25 22:30:49'), +(490,'1909 Dayton Avenue','','Guangdong',469,'88513','702955450528',/*!50705 0x0000000001010000007BE0BE6955655C405457998466E43840,*/'2014-09-25 22:30:42'), +(491,'1789 Saint-Denis Parkway','','Coahuila de Zaragoza',4,'8268','936806643983',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:01'), +(492,'185 Mannheim Lane','','Stavropol',408,'23661','589377568313',/*!50705 0x000000000101000000333E82D19B87454024592CEA38064640,*/'2014-09-25 22:32:56'), +(493,'184 Mandaluyong Street','','Baja California Sur',288,'94239','488425406814',/*!50705 0x000000000101000000173B2BB3D2935BC078F6F0C05B233840,*/'2014-09-25 22:32:09'), +(494,'591 Sungai Petani Drive','','Okayama',376,'46400','37247325001',/*!50705 0x0000000001010000001966B2C9EBBD60404CC054D8B1544140,*/'2014-09-25 22:31:51'), +(495,'656 Matamoros Drive','','Boyac',487,'19489','17305839123',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:53'), +(496,'775 ostka Drive','','al-Daqahliya',337,'22358','171973024401',/*!50705 0x000000000101000000FC4DCD8A4D423F403EDF60B9EFB63E40,*/'2014-09-25 22:30:57'), +(497,'1013 Tabuk Boulevard','','West Bengali',261,'96203','158399646978',/*!50705 0x0000000001010000005D1B857F6C1B5640793BC269C1F53640,*/'2014-09-25 22:31:19'), +(498,'319 Plock Parkway','','Istanbul',504,'26101','854259976812',/*!50705 0x000000000101000000B6EFF6C54A453D40277E3100F97A4440,*/'2014-09-25 22:33:28'), +(499,'1954 Kowloon and New Kowloon Way','','Chimborazo',434,'63667','898559280434',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:56'), +(500,'362 Rajkot Lane','','Gansu',47,'98030','962020153680',/*!50705 0x0000000001010000004F6FEB13E50A5A4028733D1B03464240,*/'2014-09-25 22:30:31'), +(501,'1060 Tandil Lane','','Shandong',432,'72349','211256301880',/*!50705 0x000000000101000000CAB61D6423DD5D40ADF1E379BAB64140,*/'2014-09-25 22:30:41'), +(502,'1515 Korla Way','','England',589,'57197','959467760895',/*!50705 0x0000000001010000004C42D8DFC852F1BFBA826DC493FA4A40,*/'2014-09-25 22:33:42'), +(503,'1416 San Juan Bautista Tuxtepec Avenue','','Zufar',444,'50592','144206758053',/*!50705 0x000000000101000000A6684018D30B4B40078662E1DA033140,*/'2014-09-25 22:32:29'), +(504,'1 Valle de Santiago Avenue','','Apulia',93,'86208','465897838272',/*!50705 0x000000000101000000CAFED4D3A2EF3140584D7C5AEA504440,*/'2014-09-25 22:31:43'), +(505,'519 Brescia Parkway','','East Java',318,'69504','793996678771',/*!50705 0x000000000101000000A3C794B487E15B400A230736F8841EC0,*/'2014-09-25 22:31:33'), +(506,'414 Mandaluyong Street','','Lubelskie',314,'16370','52709222667',/*!50705 0x0000000001010000000FE6C0BC1191364020F0C000C2A04940,*/'2014-09-25 22:32:43'), +(507,'1197 Sokoto Boulevard','','West Bengali',478,'87687','868602816371',/*!50705 0x000000000101000000109546CC6C1B56408F0FC4C3C5B53A40,*/'2014-09-25 22:31:27'), +(508,'496 Celaya Drive','','Nagano',552,'90797','759586584889',/*!50705 0x000000000101000000254E3805034961402486D3388A334240,*/'2014-09-25 22:31:54'), +(509,'786 Matsue Way','','Illinois',245,'37469','111177206479',/*!50705 0x0000000001010000000F3B9D75570556C0FA91C77839C34440,*/'2014-09-25 22:33:54'), +(510,'48 Maracabo Place','','Central Luzon',519,'1570','82671830126',/*!50705 0x000000000101000000223999B8D53A5E408D87AD8F3D2D2F40,*/'2014-09-25 22:32:39'), +(511,'1152 al-Qatif Lane','','Kalimantan Barat',412,'44816','131370665218',/*!50705 0x000000000101000000107FA88F9B545B4021037976F9D69FBF,*/'2014-09-25 22:31:34'), +(512,'1269 Ipoh Avenue','','Eskisehir',163,'54674','402630109080',/*!50705 0x000000000101000000E9D32AFA43853E40767D303A6AE34340,*/'2014-09-25 22:33:24'), +(513,'758 Korolev Parkway','','Andhra Pradesh',568,'75474','441628280920',/*!50705 0x00000000010100000031DA99F859285440AF528BD2EF843040,*/'2014-09-25 22:31:29'), +(514,'1747 Rustenburg Place','','Bihar',110,'51369','442673923363',/*!50705 0x0000000001010000000BFD5DE9C62E554041C4BC7D0CC83940,*/'2014-09-25 22:31:14'), +(515,'886 Tonghae Place','','Volgograd',259,'19450','711928348157',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:50'), +(516,'1574 Goinia Boulevard','','Heilongjiang',502,'39529','59634255214',/*!50705 0x00000000010100000017128B73AFBF5F40C5ECC094DC514740,*/'2014-09-25 22:30:43'), +(517,'548 Uruapan Street','','Ontario',312,'35653','879347453467',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:38'), +(519,'962 Tama Loop','','',583,'65952','282667506728',/*!50705 0x000000000101000000FA545FA722DD6440AA7A9EE4B321E1BF,*/'2014-09-25 22:32:19'), +(520,'1778 Gijn Manor','','Hubei',594,'35156','288910576761',/*!50705 0x000000000101000000E358727044305C40A58A3D0F49104040,*/'2014-09-25 22:30:50'), +(521,'568 Dhule (Dhulia) Loop','','Coquimbo',127,'92568','602101369463',/*!50705 0x0000000001010000000000804A296FC5C1DDA85F330AC13EC0,*/'2014-09-25 22:30:30'), +(522,'1768 Udine Loop','','Battambang',60,'32347','448876499197',/*!50705 0x000000000101000000708802C7AFCC59402ABC15D396342A40,*/'2014-09-25 22:30:24'), +(523,'608 Birgunj Parkway','','Taipei',116,'400','627425618482',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:14'), +(524,'680 A Corua (La Corua) Manor','','Sivas',482,'49806','158326114853',/*!50705 0x000000000101000000936EF02A10824240F2F6D676C9DF4340,*/'2014-09-25 22:33:28'), +(525,'1949 Sanya Street','','Gumma',224,'61244','132100972047',/*!50705 0x000000000101000000943F29A406696140E4CA8FAE88284240,*/'2014-09-25 22:31:47'), +(526,'617 Klerksdorp Place','','Khanh Hoa',366,'94707','574973479129',/*!50705 0x0000000001010000004A1751C96F4C5B4032F504D37A7D2840,*/'2014-09-25 22:34:07'), +(527,'1993 0 Loop','','Liaoning',588,'41214','25865528181',/*!50705 0x000000000101000000B65E1D119D8E5E40171A3ED818554440,*/'2014-09-25 22:30:49'), +(528,'1176 Southend-on-Sea Manor','','Southern Tagalog',458,'81651','236679267178',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:39'), +(529,'600 Purnea (Purnia) Avenue','','Nghe An',571,'18043','638409958875',/*!50705 0x000000000101000000962364204F6C5A407A6D365662AC3240,*/'2014-09-25 22:34:07'), +(530,'1003 Qinhuangdao Street','','West Java',419,'25972','35533115997',/*!50705 0x0000000001010000005EA516A55FDC5A40A21639FA4E3A1AC0,*/'2014-09-25 22:31:35'), +(531,'1986 Sivas Place','','Friuli-Venezia Giuli',551,'95775','182059202712',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:44'), +(532,'1427 Tabuk Place','','Florida',101,'31342','214756839122',/*!50705 0x0000000001010000003C702942C57C54C02A5D555117903A40,*/'2014-09-25 22:33:47'), +(533,'556 Asuncin Way','','Mogiljov',339,'35364','338244023543',/*!50705 0x0000000001010000006B6DD04D51583E40673513C259F54A40,*/'2014-09-25 22:30:13'), +(534,'486 Ondo Parkway','','Benguela',67,'35202','105882218332',/*!50705 0x000000000101000000BD83E9C59ACF2A40B9FA56900B2729C0,*/'2014-09-25 22:30:02'), +(535,'635 Brest Manor','','Andhra Pradesh',75,'40899','80593242951',/*!50705 0x00000000010100000079FA52897C615440D2C9ADA4708A3040,*/'2014-09-25 22:31:13'), +(536,'166 Jinchang Street','','Buenos Aires',165,'86760','717566026669',/*!50705 0x0000000001010000003EB896242A434DC0E0771DBB556D41C0,*/'2014-09-25 22:30:05'), +(537,'958 Sagamihara Lane','','Mie',287,'88408','427274926505',/*!50705 0x000000000101000000BED29E37BA1761409B5F837467884140,*/'2014-09-25 22:31:50'), +(538,'1817 Livorno Way','','Khanh Hoa',100,'79401','478380208348',/*!50705 0x000000000101000000944A78422F4A5B40236D3E09C7D72740,*/'2014-09-25 22:34:05'), +(539,'1332 Gaziantep Lane','','Shandong',80,'22813','383353187467',/*!50705 0x000000000101000000BC2F1D2911815D4074B0A316EFAE4240,*/'2014-09-25 22:30:31'), +(540,'949 Allende Lane','','Uttar Pradesh',24,'67521','122981120653',/*!50705 0x0000000001010000008C91DBE5119E534039A8B34934E73C40,*/'2014-09-25 22:31:11'), +(541,'195 Ilorin Street','','Chari-Baguirmi',363,'49250','8912935608',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:29'), +(542,'193 Bhusawal Place','','Kang-won',539,'9750','745267607502',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:07'), +(543,'43 Vilnius Manor','','Colorado',42,'79814','484500282381',/*!50705 0x0000000001010000009389004C3E355AC0D03582435EDD4340,*/'2014-09-25 22:33:44'), +(544,'183 Haiphong Street','','Jilin',46,'69953','488600270038',/*!50705 0x000000000101000000AFA3607C87B45E4038A85890C1CD4640,*/'2014-09-25 22:30:30'), +(545,'163 Augusta-Richmond County Loop','','Carabobo',561,'33030','754579047924',/*!50705 0x000000000101000000CC0C1B657D0051C06B7F677BF4522440,*/'2014-09-25 22:34:05'), +(546,'191 Jos Azueta Parkway','','Ruse',436,'13629','932156667696',/*!50705 0x00000000010100000067A9ABF188F83940CD6CA1759EED4540,*/'2014-09-25 22:30:23'), +(547,'379 Lublin Parkway','','Toscana',309,'74568','921960450089',/*!50705 0x00000000010100000090920D5AFEA62440CC13BEADAAC54540,*/'2014-09-25 22:31:44'), +(548,'1658 Cuman Loop','','Sumatera Selatan',396,'51309','784907335610',/*!50705 0x00000000010100000018D75306E9885A40E8209EDB3A4E01C0,*/'2014-09-25 22:31:34'), +(549,'454 Qinhuangdao Drive','','Tadla-Azilal',68,'25866','786270036240',/*!50705 0x000000000101000000419479F53B6619C04F09E3022B2B4040,*/'2014-09-25 22:32:16'), +(550,'1715 Okayama Street','','So Paulo',485,'55676','169352919175',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:22'), +(551,'182 Nukualofa Drive','','Sumy',275,'15414','426346224043',/*!50705 0x00000000010100000079F71109F099404055BBCBEAC29E4940,*/'2014-09-25 22:33:32'), +(552,'390 Wroclaw Way','','Hainan',462,'5753','357593328658',/*!50705 0x000000000101000000F70FD88B57605B40364E5480393E3240,*/'2014-09-25 22:30:41'), +(553,'1421 Quilmes Lane','','Ishikawa',260,'19151','135407755975',/*!50705 0x0000000001010000008F9F32A30414614053AEF02E174C4240,*/'2014-09-25 22:31:49'), +(554,'947 Trshavn Place','','Central Luzon',528,'841','50898428626',/*!50705 0x000000000101000000C56DD9C644265E4002B5BD82D9F52E40,*/'2014-09-25 22:32:40'), +(555,'1764 Jalib al-Shuyukh Parkway','','Galicia',459,'77642','84794532510',/*!50705 0x00000000010100000090FFB8B3651721C09DB23FF5B4704540,*/'2014-09-25 22:33:10'), +(556,'346 Cam Ranh Avenue','','Zhejiang',599,'39976','978430786151',/*!50705 0x000000000101000000A0E63FFF188D5E4056DBA8A9C0023E40,*/'2014-09-25 22:30:51'), +(557,'1407 Pachuca de Soto Place','','Rio Grande do Sul',21,'26284','380077794770',/*!50705 0x000000000101000000A3CEDC43C28449C0608209922DFD3DC0,*/'2014-09-25 22:30:14'), +(558,'904 Clarksville Drive','','Zhejiang',193,'52234','955349440539',/*!50705 0x000000000101000000E5886B6BFA2A5E4038E04E7D7B7A3E40,*/'2014-09-25 22:30:34'), +(559,'1917 Kumbakonam Parkway','','Vojvodina',368,'11892','698182547686',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:34:11'), +(560,'1447 Imus Place','','Gujarat',426,'12905','62127829280',/*!50705 0x000000000101000000667F4523C4B25140819C8B1AA74A3640,*/'2014-09-25 22:31:25'), +(561,'1497 Fengshan Drive','','KwaZulu-Natal',112,'63022','368738360376',/*!50705 0x000000000101000000938FDD054AE43E402AF97DA42DEB3DC0,*/'2014-09-25 22:33:03'), +(562,'869 Shikarpur Way','','England',496,'57380','590764256785',/*!50705 0x000000000101000000894FF003460D08C0828472ECEAD24A40,*/'2014-09-25 22:33:40'), +(563,'1059 Yuncheng Avenue','','Vilna',570,'47498','107092893983',/*!50705 0x00000000010100000046B82462A5473940BA0ACE8536584B40,*/'2014-09-25 22:31:58'), +(564,'505 Madiun Boulevard','','Dolnoslaskie',577,'97271','970638808606',/*!50705 0x000000000101000000F0D46D9A8808314023A93B05AF914940,*/'2014-09-25 22:32:44'), +(565,'1741 Hoshiarpur Boulevard','','al-Sharqiya',79,'22372','855066328617',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:56'), +(566,'1229 Varanasi (Benares) Manor','','Buenos Aires',43,'40195','817740355461',/*!50705 0x00000000010100000014DA28A1AA2A4DC02E156580555541C0,*/'2014-09-25 22:30:04'), +(567,'1894 Boa Vista Way','','Texas',178,'77464','239357986667',/*!50705 0x000000000101000000C1D1448EE32858C0AD8D0CCDD0744040,*/'2014-09-25 22:33:51'), +(568,'1342 Sharja Way','','Sokoto & Kebbi & Zam',488,'93655','946114054231',/*!50705 0x0000000001010000005B087250C2F41440E711ED74311F2A40,*/'2014-09-25 22:32:27'), +(569,'1342 Abha Boulevard','','Bukarest',95,'10714','997453607116',/*!50705 0x000000000101000000924FD9FA331B3A40B1CBA61254374640,*/'2014-09-25 22:32:46'), +(570,'415 Pune Avenue','','Shandong',580,'44274','203202500108',/*!50705 0x000000000101000000CC3857DE1F705D408F26CDD545F34140,*/'2014-09-25 22:30:47'), +(571,'1746 Faaa Way','','Huanuco',214,'32515','863080561151',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:33'), +(572,'539 Hami Way','','Tokat',538,'52196','525518075499',/*!50705 0x0000000001010000006F302F1BF8464240AD7B759F2D284440,*/'2014-09-25 22:33:29'), +(573,'1407 Surakarta Manor','','Moskova',466,'33224','324346485054',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:56'), +(574,'502 Mandi Bahauddin Parkway','','Anzotegui',55,'15992','618156722572',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:34:03'), +(575,'1052 Pathankot Avenue','','Sichuan',299,'77397','128499386727',/*!50705 0x000000000101000000AA054026E3F05940CCC12275F18F3D40,*/'2014-09-25 22:30:39'), +(576,'1351 Sousse Lane','','Coahuila de Zaragoza',341,'37815','203804046132',/*!50705 0x0000000001010000006AB86D84EA5A59C027AA12C028E83A40,*/'2014-09-25 22:32:10'), +(577,'1501 Pangkal Pinang Avenue','','Mazowieckie',409,'943','770864062795',/*!50705 0x0000000001010000001646C4DED5B43340308AD46AFE454A40,*/'2014-09-25 22:32:43'), +(578,'1405 Hagonoy Avenue','','Slaskie',133,'86587','867287719310',/*!50705 0x0000000001010000002431F77FC41F3340F5B06197F2654940,*/'2014-09-25 22:32:42'), +(579,'521 San Juan Bautista Tuxtepec Place','','Qaraghandy',598,'95093','844018348565',/*!50705 0x0000000001010000006848CB3711F15040E32A604C44E44740,*/'2014-09-25 22:31:56'), +(580,'923 Tangail Boulevard','','Tokyo-to',10,'33384','315528269898',/*!50705 0x00000000010100000078E5C468A76B6140C3A27D079ADA4140,*/'2014-09-25 22:31:45'), +(581,'186 Skikda Lane','','Morelos',131,'89422','14465669789',/*!50705 0x00000000010100000048C2BE9DC4CE58C0DA3DD4111BED3240,*/'2014-09-25 22:32:05'), +(582,'1568 Celaya Parkway','','Kaohsiung',168,'34750','278669994384',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:15'), +(583,'1489 Kakamigahara Lane','','Taipei',526,'98883','29341849811',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:16'), +(584,'1819 Alessandria Loop','','Campeche',103,'53829','377633994405',/*!50705 0x0000000001010000008636A5611DF556C0374F1A0F5BA53240,*/'2014-09-25 22:32:02'), +(585,'1208 Tama Loop','','Ninawa',344,'73605','954786054144',/*!50705 0x000000000101000000314F9DFD378F4540961EF23BF22A4240,*/'2014-09-25 22:31:40'), +(586,'951 Springs Lane','','Central Mindanao',219,'96115','165164761435',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:37'), +(587,'760 Miyakonojo Drive','','Guerrero',246,'64682','294449058179',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:08'), +(588,'966 Asuncin Way','','Hidalgo',212,'62703','995527378381',/*!50705 0x000000000101000000EBBD4230D89A58C0E30632F1FD233540,*/'2014-09-25 22:32:07'), +(589,'1584 Ljubertsy Lane','','England',494,'22954','285710089439',/*!50705 0x00000000010100000035385B8AF577F6BF8C7560EFB4734940,*/'2014-09-25 22:33:38'), +(590,'247 Jining Parkway','','Banjul',54,'53446','170115379190',/*!50705 0x0000000001010000001BE4E434FA9330C08A8F4FC8CEE72A40,*/'2014-09-25 22:31:04'), +(591,'773 Dallas Manor','','Buenos Aires',424,'12664','914466027044',/*!50705 0x00000000010100000009C3802557204DC0B75CA21FB25C41C0,*/'2014-09-25 22:30:06'), +(592,'1923 Stara Zagora Lane','','Nantou',546,'95179','182178609211',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:17'), +(593,'1402 Zanzibar Boulevard','','Guanajuato',106,'71102','387448063440',/*!50705 0x000000000101000000FCB7DCAA353459C05CA8A1B206863440,*/'2014-09-25 22:32:03'), +(594,'1464 Kursk Parkway','','Shandong',574,'17381','338758048786',/*!50705 0x0000000001010000008CA2073E86C65D40055669E6245B4240,*/'2014-09-25 22:30:44'), +(595,'1074 Sanaa Parkway','','Loja',311,'22474','154124128457',/*!50705 0x00000000010100000092DBE51112CD53C00EF96706F1F10FC0,*/'2014-09-25 22:30:55'), +(596,'1759 Niznekamsk Avenue','','al-Manama',14,'39414','864392582257',/*!50705 0x000000000101000000044D9539A74A49401224004922373A40,*/'2014-09-25 22:30:11'), +(597,'32 Liaocheng Way','','Minas Gerais',248,'1944','410877354933',/*!50705 0x000000000101000000C2757BFFD5AC45C0424F1432A1C335C0,*/'2014-09-25 22:30:19'), +(598,'42 Fontana Avenue','','Fejr',512,'14684','437829801725',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:09'), +(599,'1895 Zhezqazghan Drive','','California',177,'36693','137809746111',/*!50705 0x0000000001010000003EC7ECD1407C5DC057FA1A930FE34040,*/'2014-09-25 22:33:51'), +(600,'1837 Kaduna Parkway','','Inner Mongolia',241,'82580','640843562301',/*!50705 0x000000000101000000D61A4AEDC5465C400E64E2FB87834440,*/'2014-09-25 22:30:37'), +(601,'844 Bucuresti Place','','Liaoning',242,'36603','935952366111',/*!50705 0x000000000101000000B88086EDDD6D5E407CED9925018D4340,*/'2014-09-25 22:30:37'), +(602,'1101 Bucuresti Boulevard','','West Greece',401,'97661','199514580428',/*!50705 0x000000000101000000AAC1EA7E04BC3540E65F26E5491F4340,*/'2014-09-25 22:31:07'), +(603,'1103 Quilmes Boulevard','','Piura',503,'52137','644021380889',/*!50705 0x000000000101000000AD9685C0DB2B54C09B012EC8969D13C0,*/'2014-09-25 22:32:34'), +(604,'1331 Usak Boulevard','','Vaud',296,'61960','145308717464',/*!50705 0x000000000101000000CE273CB203881A40205734E72A424740,*/'2014-09-25 22:33:14'), +(605,'1325 Fukuyama Street','','Heilongjiang',537,'27107','288241215394',/*!50705 0x00000000010100000017540A70700160401E1C47077F7D4740,*/'2014-09-25 22:30:44'); +"; + } + #endregion +} diff --git a/EFCore/tests/MySql.EFCore.Basic.Tests/DbContextClasses/TestsContexts.cs b/EFCore/tests/MySql.EFCore.Basic.Tests/DbContextClasses/TestsContexts.cs new file mode 100644 index 000000000..2bed1347e --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Basic.Tests/DbContextClasses/TestsContexts.cs @@ -0,0 +1,604 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.ChangeTracking; +using MySql.EntityFrameworkCore.Basic.Tests.Utils; +using MySql.EntityFrameworkCore.Extensions; +using System; + +namespace MySql.EntityFrameworkCore.Basic.Tests.DbContextClasses +{ + public class BugContext : MyTestContext + { + public BugContext() : base() + { + } + + public virtual DbSet Bugs { get; set; } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity(entity => + { + entity.ToTable("Bug"); + + entity.Property(e => e.Id).HasColumnName("id"); + + entity.Property(e => e.CreatedDate) + .HasColumnType("date") + .HasColumnName("createdDate"); + }); + } + } + + public class Bug35392218Context : DbContext + { + public Bug35392218Context() : base() + { + } + + public Bug35392218Context(DbContextOptions options) : base(options) + { + } + + public virtual DbSet NameList { get; set; } + + private string schemaName = "schema_bug35392218_1"; + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + + modelBuilder.Entity(entity => + { + entity.ToTable("bug35392218_table1", "schema_bug35392218_1"); + + entity.HasKey(e => e.Id).HasName("id"); + + entity.Property(e => e.Name) + .HasColumnType("varchar(40)") + .HasColumnName("name"); + }); + + modelBuilder.Entity(entity => + { + entity.ToTable("bug35392218_table2", "schema_bug35392218_2"); + + entity.HasKey(e => e.Id).HasName("id"); + + entity.Property(e => e.Name) + .HasColumnType("varchar(40)") + .HasColumnName("name"); + }); + } + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + optionsBuilder.UseMySQL(MySQLTestStore.GetContextConnectionStringWithName(schemaName)); + } + } + + public class NoConfigurationContext : DbContext + { + public DbSet Blogs { get; set; } + //Empty configuration + } + + public class SimpleContext : DbContext + { + public DbSet Blogs { get; set; } + public DbSet Posts { get; set; } + + public SimpleContext() : base() + { + } + + public SimpleContext(DbContextOptions options) : base(options) + { + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity() + .HasOne(p => p.RecentPost) + .WithOne(i => i.Blog) + .HasForeignKey(b => b.PostId); + + + modelBuilder.Entity() + .HasOne(p => p.Metadata) + .WithOne(i => i.Blog) + .HasForeignKey(b => b.BlogId); + + } + + } + + public class TestsContext : MyTestContext + { + public DbSet Blogs { get; set; } + public DbSet Posts { get; set; } + public DbSet Reads { get; set; } + public DbSet Tags { get; set; } + + public DbSet ReadTags { get; set; } + + public TestsContext() + { } + + public TestsContext(DbContextOptions options) : base(options) + { + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity() + .HasOne(p => p.RecentPost) + .WithOne(i => i.Blog) + .HasPrincipalKey(p => new { p.BlogId, p.Url }) + .HasForeignKey(b => new { b.BlogIdFK, b.Url }); + + modelBuilder.Entity() + .HasOne(p => p.Blog) + .WithOne(i => i.Metadata) + .HasForeignKey(b => b.BlogId); + + + modelBuilder.Entity() + .HasKey(t => new { t.ReadId, t.TagId }); + + modelBuilder.Entity() + .HasOne(pt => pt.Read) + .WithMany(p => p.ReadTags) + .HasForeignKey(pt => pt.ReadId) + .OnDelete(DeleteBehavior.Cascade); + + modelBuilder.Entity() + .HasOne(pt => pt.Tag) + .WithMany(t => t.ReadTags) + .HasForeignKey(pt => pt.TagId); + + } + } + + public class ContextWithShadowProperty : MyTestContext + { + public DbSet Guests { get; set; } + + public ContextWithShadowProperty(DbContextOptions options) : base(options) + { + ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.TrackAll; + } + + public override int SaveChanges() + { + var now = DateTime.Now; + foreach (EntityEntry entry in ChangeTracker.Entries()) + { + if (entry.State == EntityState.Added) + { + entry.Property("CreatedAt").CurrentValue = now; + } + else if (entry.State == EntityState.Modified) + { + entry.Property("UpdatedAt").CurrentValue = now; + } + } + return base.SaveChanges(); + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder + .Entity(e => e.HasOne(a => a.Address).WithOne(p => p.Guest) + .HasForeignKey
(a => a.IdAddress) + ); + + modelBuilder.Entity().Property("CreatedAt"); + modelBuilder.Entity().Property("UpdatedAt"); + } + } + + + public class EagerLoadingContext : MyTestContext + { + public DbSet Guests { get; set; } + public DbSet Persons2 { get; set; } + + public EagerLoadingContext() + { + } + + public EagerLoadingContext(DbContextOptions options) : base(options) + { + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity() + .HasOne(p => p.Address) + .WithOne(i => i.Guest) + .HasForeignKey
(i => i.IdAddress) + .HasConstraintName("FKGuestAddress"); + + modelBuilder.Entity() + .HasOne(p => p.Address) + .WithOne(i => i.Relative) + .HasForeignKey(i => i.IdAddressRelative) + .HasConstraintName("FKRelativeAddress"); + + // add shadow property + modelBuilder.Entity().Property("RelativeId"); + } + } + + public class JsonContext : MyTestContext + { + public DbSet JsonEntity { get; set; } + } + + public partial class AllDataTypesContext : MyTestContext + { + public virtual DbSet AllDataTypes { get; set; } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.AddressNumber1) + .HasName("PRIMARY"); + + entity.ToTable("all_data_types"); + + entity.Property(e => e.AddressNumber1) + .HasColumnName("address_number1") + .HasColumnType("tinyint(4)"); + + entity.Property(e => e.AddressNumber10) + .HasColumnName("address_number10") + .HasColumnType("bit(8)"); + + entity.Property(e => e.AddressNumber2) + .HasColumnName("address_number2") + .HasColumnType("smallint(6)"); + + entity.Property(e => e.AddressNumber3) + .HasColumnName("address_number3") + .HasColumnType("mediumint(9)"); + + entity.Property(e => e.AddressNumber4) + .HasColumnName("address_number4") + .HasColumnType("int(11)"); + + entity.Property(e => e.AddressNumber5) + .HasColumnName("address_number5") + .HasColumnType("bigint(20)"); + + entity.Property(e => e.AddressNumber6) + .HasColumnName("address_number6"); + + entity.Property(e => e.AddressNumber7) + .HasColumnName("address_number7") + .HasColumnType("float(10,2)"); + + entity.Property(e => e.AddressNumber8) + .HasColumnName("address_number8") + .HasColumnType("double(10,2)"); + + entity.Property(e => e.AddressNumber9) + .HasColumnName("address_number9") + .HasColumnType("decimal(6,4)"); + + entity.Property(e => e.BuildingName1) + .IsRequired() + .HasColumnName("building_name1") + .HasColumnType("char(100)") + .HasMaxLength(100); + + entity.Property(e => e.BuildingName10) + .IsRequired() + .HasColumnName("building_name10") + .HasColumnType("longblob"); + + entity.Property(e => e.BuildingName11) + .IsRequired() + .HasColumnName("building_name11") + .HasColumnType("enum('x-small','small','medium','large','x-large')") + .HasMaxLength(7); + + entity.Property(e => e.BuildingName12) + .IsRequired() + .HasColumnName("building_name12") + .HasColumnType("set('x-small','small','medium','large','x-large')") + .HasMaxLength(34); + + entity.Property(e => e.BuildingName13) + .HasColumnName("building_name13") + .HasColumnType("date"); + + entity.Property(e => e.BuildingName14) + .HasColumnName("building_name14") + .HasColumnType("datetime(6)"); + + entity.Property(e => e.BuildingName15) + .HasColumnName("building_name15") + .HasColumnType("time(6)"); + + entity.Property(e => e.BuildingName16) + .HasColumnName("building_name16") + .HasColumnType("timestamp(6)") + .HasDefaultValueSql("CURRENT_TIMESTAMP(6)"); + + entity.Property(e => e.BuildingName17) + .HasColumnName("building_name17") + .HasColumnType("year(4)"); + + entity.Property(e => e.BuildingName2) + .IsRequired() + .HasColumnName("building_name2") + .HasColumnType("varchar(100)") + .HasMaxLength(100); + + entity.Property(e => e.BuildingName3) + .IsRequired() + .HasColumnName("building_name3") + .HasColumnType("tinytext") + .HasMaxLength(255); + + entity.Property(e => e.BuildingName4) + .IsRequired() + .HasColumnName("building_name4") + .HasColumnType("mediumtext") + .HasMaxLength(16777215); + + entity.Property(e => e.BuildingName5) + .IsRequired() + .HasColumnName("building_name5") + .HasColumnType("longtext"); + + entity.Property(e => e.BuildingName6) + .IsRequired() + .HasColumnName("building_name6") + .HasColumnType("binary(120)") + .HasMaxLength(120); + + entity.Property(e => e.BuildingName7) + .IsRequired() + .HasColumnName("building_name7") + .HasColumnType("varbinary(120)") + .HasMaxLength(120); + + entity.Property(e => e.BuildingName8) + .IsRequired() + .HasColumnName("building_name8") + .HasColumnType("blob") + .HasMaxLength(65535); + + entity.Property(e => e.BuildingName9) + .IsRequired() + .HasColumnName("building_name9") + .HasColumnType("mediumblob") + .HasMaxLength(16777215); + }); + } + } + + public partial class AllBlobTypesContext : MyTestContext + { + public virtual DbSet AllBlobTypes { get; set; } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id) + .HasName("PRIMARY"); + + entity.ToTable("all_blob_types"); + + entity.Property(e => e.Example1) + .HasColumnName("blob_column") + .HasColumnType("blob"); + + entity.Property(e => e.Example2) + .HasColumnName("mediumblob_column") + .HasColumnType("mediumblob") + .HasMaxLength(65535); + + entity.Property(e => e.Example3) + .HasColumnName("longblob_column") + .HasColumnType("longblob") + .HasMaxLength(16777215); + }); + } + } + + public class WorldContext : MyTestContext + { + public virtual DbSet Countries { get; set; } + public virtual DbSet Continents { get; set; } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + modelBuilder.Entity(entity => + { + entity.ToTable("ContinentList", "db-worldcontext"); + + entity.HasKey(p => p.Code); + + entity.HasMany(c => c.Countries) + .WithOne(c => c.Continent); + }); + } + + public void PopulateData() + { + using (WorldContext context = new WorldContext()) + { + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + + var america = new Continent { Code = "AM", Name = "America" }; + var europe = new Continent { Code = "EU", Name = "Europe" }; + var asia = new Continent { Code = "AS", Name = "Asia" }; + var africa = new Continent { Code = "AF", Name = "Africa" }; + + context.AddRange(america, europe, asia, africa); + + var unitedStates = new Country { Code = "US", Name = "United States", Continent = america }; + var canada = new Country { Code = "CA", Name = "Canada", Continent = america }; + var mexico = new Country { Code = "MX", Name = "Mexico", Continent = america }; + var brazil = new Country { Code = "BR", Name = "Brazil", Continent = america }; + var argentina = new Country { Code = "AR", Name = "Argentina", Continent = america }; + context.AddRange(unitedStates, canada, mexico, brazil, argentina); + + var unitedKingdom = new Country { Code = "UK", Name = "United Kingdom", Continent = europe }; + var germany = new Country { Code = "DE", Name = "Germany", Continent = europe }; + var italy = new Country { Code = "IT", Name = "Italy", Continent = europe }; + var spain = new Country { Code = "ES", Name = "Spain", Continent = europe }; + var france = new Country { Code = "FR", Name = "France", Continent = europe }; + context.AddRange(unitedKingdom, germany, italy, spain, france); + + var china = new Country { Code = "CN", Name = "China", Continent = asia }; + var india = new Country { Code = "IN", Name = "India", Continent = asia }; + var japan = new Country { Code = "JP", Name = "Japan", Continent = asia }; + var southKorea = new Country { Code = "KR", Name = "South Korea", Continent = asia }; + context.AddRange(china, india, japan, southKorea); + + var nigeria = new Country { Code = "NG", Name = "Nigeria", Continent = africa }; + var egypt = new Country { Code = "EG", Name = "Egypt", Continent = africa }; + var southAfrica = new Country { Code = "ZA", Name = "South Africa", Continent = africa }; + var algeria = new Country { Code = "DZ", Name = "Algeria", Continent = africa }; + context.AddRange(nigeria, egypt, southAfrica, algeria); + + context.SaveChanges(); + } + } + } + + public class FiguresContext : MyTestContext + { + public DbSet Triangle { get; set; } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + modelBuilder.Entity(entity => + { + entity.HasKey(p => p.Id); + + entity.Property(p => p.Area) + .HasComputedColumnSql("base * height / 2"); + }); + } + } + + public class StringTypesContext : MyTestContext + { + public DbSet StringType { get; set; } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + modelBuilder.Entity(entity => + { + entity.HasKey(p => p.TinyString); + + entity.Property(p => p.NormalString) + .HasColumnType("varchar(3000)"); + + entity.Property(p => p.MediumString) + .HasColumnType("mediumtext"); + }); + } + } + + public class BodyShopContext : MyTestContext + { + public DbSet Car { get; set; } + + public DbSet BodyShop { get; set; } + + public DbSet Employee { get; set; } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + + modelBuilder.Entity().ToTable("Car", "01cars"); + modelBuilder.Entity().ToTable("BodyShop", "02bodyshops"); + modelBuilder.Entity().ToTable("Employee", "03employees"); + } + } + public class BodyShopInsertContext : MyTestContext + { + public DbSet Car { get; set; } + + public DbSet BodyShop { get; set; } + + public DbSet Employee { get; set; } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + } + } + + + public class MyContext : MyTestContext + { + public DbSet MyTest { get; set; } + } + + public class ConnStringOnConfiguringContext : MyTestContext + { + public DbSet TestCharsetDA { get; set; } + public DbSet TestCharsetFA { get; set; } + public DbSet TestCollationDA { get; set; } + public DbSet TestCollationFA { get; set; } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity(e => + { + e.ForMySQLHasCharset("utf16"); + e.Property(p => p.TestCharsetFAId).ForMySQLHasCharset("latin7").HasMaxLength(255); + }); + + modelBuilder.Entity(e => + { + e.ForMySQLHasCollation("koi8u_bin"); + e.Property(p => p.TestCollationFAId) + .ForMySQLHasCollation("ucs2_bin") + .HasMaxLength(255); + }); + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Basic.Tests/DbFunctionsMySQLTest.cs b/EFCore/tests/MySql.EFCore.Basic.Tests/DbFunctionsMySQLTest.cs new file mode 100644 index 000000000..645045092 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Basic.Tests/DbFunctionsMySQLTest.cs @@ -0,0 +1,185 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using MySql.EntityFrameworkCore.Basic.Tests.DbContextClasses; +using MySql.EntityFrameworkCore.Extensions; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Linq; + +namespace MySql.EntityFrameworkCore.Basic.Tests +{ + public class DbFunctionsMySQLTest + { + DateTime lastUpdate = new DateTime(2006, 02, 15, 04, 34, 33); // same date for all data (taken from ActorData) + + [OneTimeSetUp] + public void OneTimeSetUp() + { + using (var context = new SakilaLiteContext()) + { + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + context.PopulateData(); + } + } + + [OneTimeTearDown] + public void OneTimeTearDown() + { + using (var context = new SakilaLiteContext()) + { + context.Database.EnsureDeleted(); + } + } + + [Test] + public void DateDiffYear() + { + using (var context = new SakilaLiteContext()) + { + var yearsDiff = DateTime.Now.Year - lastUpdate.Year; + var count = context.Actor.Count(a => EF.Functions.DateDiffYear(a.LastUpdate, DateTime.Now) > 0); + + Assert.That(count, Is.EqualTo(200)); + } + } + + [Test] + public void DateDiffMonth() + { + using (var context = new SakilaLiteContext()) + { + var monthsDiff = ((DateTime.Now.Year - lastUpdate.Year) * 12) + DateTime.Now.Month - lastUpdate.Month; + var count = context.Actor + .Count(a => EF.Functions.DateDiffMonth(a.LastUpdate, DateTime.Now) >= monthsDiff - 1); + + Assert.That(count, Is.EqualTo(200)); + } + } + + [Test] + public void DateDiffDay() + { + using (var context = new SakilaLiteContext()) + { + var daysDiff = (int)(DateTime.Now - lastUpdate).TotalDays; + var count = context.Actor + .Count(a => EF.Functions.DateDiffDay(a.LastUpdate, DateTime.Now) == daysDiff); + + Assert.That(count, Is.EqualTo(200), "TotalDays: " + daysDiff); + } + } + + [Test] + public void DateDiffHour() + { + using (var context = new SakilaLiteContext()) + { + var hoursDiff = (int)(DateTime.Now - lastUpdate).TotalHours; + var count = context.Actor + .Count(a => EF.Functions.DateDiffHour(a.LastUpdate, DateTime.Now) == hoursDiff); + + Assert.That(count, Is.EqualTo(200), "TotalHours: " + hoursDiff); + } + } + + [Test] + public void DateDiffMinute() + { + using (var context = new SakilaLiteContext()) + { + var minutesDiff = (int)(DateTime.Now - lastUpdate).TotalMinutes; + var count = context.Actor + .Count(a => EF.Functions.DateDiffMinute(a.LastUpdate, DateTime.Now) == minutesDiff); + + Assert.That(count, Is.EqualTo(200), "TotalMinutes: " + minutesDiff); + } + } + + [Test] + public void DateDiffSecond() + { + using (var context = new SakilaLiteContext()) + { + var secondsDiff = (int)(DateTime.Now - lastUpdate).TotalSeconds; + var count = context.Actor + .Count(a => EF.Functions.DateDiffSecond(a.LastUpdate, DateTime.Now) >= secondsDiff); + + Assert.That(count, Is.EqualTo(200), "TotalSeconds: " + secondsDiff); + } + } + + [Test] + public void DateDiffMicrosecond() + { + using (var context = new SakilaLiteContext()) + { + var count = context.Actor + .Count(a => EF.Functions.DateDiffMicrosecond(a.LastUpdate, DateTime.Now) == 0); + + Assert.That(count, Is.EqualTo(0)); + } + } + + [Test] + public void LikeIntLiteral() + { + using (var context = new SakilaLiteContext()) + { + var count = context.Actor.Count(o => EF.Functions.Like(o.ActorId, "%A%")); + + Assert.That(count, Is.EqualTo(0)); + } + } + + [Test] + public void LikeDateTimeLiteral() + { + using (var context = new SakilaLiteContext()) + { + var count = context.Actor.Count(o => EF.Functions.Like(o.LastUpdate, "%A%")); + + Assert.That(count, Is.EqualTo(0)); + } + } + + [Test] + public void LikeIntLiteralWithEscape() + { + using (var context = new SakilaLiteContext()) + { + var count = context.Actor.Count(o => EF.Functions.Like(o.ActorId, "!%", "!")); + + Assert.That(count, Is.EqualTo(0)); + } + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Basic.Tests/EFCoreTests.cs b/EFCore/tests/MySql.EFCore.Basic.Tests/EFCoreTests.cs new file mode 100644 index 000000000..35a7593a5 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Basic.Tests/EFCoreTests.cs @@ -0,0 +1,296 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using MySql.Data.MySqlClient; +using MySql.EntityFrameworkCore.Basic.Tests.DbContextClasses; +using MySql.EntityFrameworkCore.Basic.Tests.Utils; +using NUnit.Framework; +using System; +using System.Linq; +using System.Transactions; + +namespace MySql.EntityFrameworkCore.Basic.Tests +{ + public class EFCoreTests : SakilaLiteFixture + { + // Explicitly compiled query + private static Func _customerById = + EF.CompileQuery((SakilaLiteContext context, int id) => + context.Customer.Single(p => p.CustomerId == id)); + + [Test] + public void ExplicitlyCompiledQueries() + { + using (SakilaLiteContext context = new SakilaLiteContext()) + { + var customer = _customerById(context, 9); + Assert.That(customer.CustomerId, Is.EqualTo(9)); + Assert.That(customer.LastName, Is.EqualTo("MOORE")); + } + } + + [Test] + public void GraphNewAndExistingEntities() + { + using (SakilaLiteUpdateContext context = new SakilaLiteUpdateContext()) + { + context.InitContext(); + + Actor actorNoId, actor; + context.Attach(actorNoId = new Actor { FirstName = "PENELOPE", LastName = "GUINESS" }); + context.Attach(actor = new Actor { ActorId = 21, FirstName = "KIRSTEN", LastName = "PALTROW" }); + + var changes = context.ChangeTracker.Entries(); + Assert.That(changes.Count(), Is.EqualTo(2)); + Assert.That(changes.Select(c => c.State), Has.Exactly(1).Matches(state => state.Equals(EntityState.Added))); + Assert.That(changes.Select(c => c.State), Has.Exactly(1).Matches(state => state.Equals(EntityState.Unchanged))); + + context.SaveChanges(); + + var list = context.Actor.ToList(); + Assert.That(list.Count, Is.EqualTo(1)); + } + } + + [Test] + public void StringInterpolationInSqlCommands() + { + using (SakilaLiteUpdateContext context = new SakilaLiteUpdateContext()) + { + context.InitContext(); + + int id = 1; + string firstName = "PENELOPE"; + string lastName = "GUINESS"; + DateTime lastUpdate = DateTime.Parse("2006-02-15 04:34:33"); + context.Database.ExecuteSqlInterpolated($"INSERT INTO actor(actor_id, first_name, last_name, last_update) VALUES ({id}, {firstName}, {lastName}, {lastUpdate:u})"); + Actor actor = context.Set().FromSqlInterpolated($"SELECT * FROM actor WHERE actor_id={id} and last_name={lastName}").First(); + + Assert.That(actor.ActorId, Is.EqualTo(id)); + Assert.That(actor.FirstName, Is.EqualTo(firstName)); + } + } + + [Test] + public void TransactionScopeTest() + { + using (var context = new SakilaLiteUpdateContext()) + { + context.InitContext(false); + } + + using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, + new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted })) + { + using (MySqlConnection connection = new MySqlConnection(MySQLTestStore.GetContextConnectionString())) + { + connection.Open(); + + MySqlCommand command = connection.CreateCommand(); + command.CommandText = "DELETE FROM actor"; + command.ExecuteNonQuery(); + + var options = new DbContextOptionsBuilder() + .UseMySQL(connection) + .Options; + + using (TransactionScope innerScope = new TransactionScope(TransactionScopeOption.Required)) + { + using (var context = new SakilaLiteUpdateContext(options)) + { + context.Actor.Add(new Actor + { + FirstName = "PENELOPE", + LastName = "GUINESS" + }); + context.SaveChanges(); + innerScope.Complete(); + } + } + + // Commit transaction if all commands succeed, transaction will auto-rollback + // when disposed if either commands fails + scope.Complete(); + } + } + } + + /// + /// Bug #103436 SqlNullabilityProcessor error when using EF and filter by Date/Time + /// + [Test] + public void QueryWithDate() + { + using (SakilaLiteContext context = new SakilaLiteContext()) + { + var scenario1 = context.Actor.Where( + w => w.FirstName == "GARY" + && w.LastName == "PENN" + && w.LastUpdate >= DateTime.Today.AddDays(-15)); + + var res = scenario1.Count(); + Assert.That(res, Is.EqualTo(0)); + + var dt = DateTime.Today.AddDays(-15); + var scenario2 = context.Actor.Where( + w => w.FirstName == "GARY" + && w.LastName == "PENN" + && w.LastUpdate >= dt); + + var res2 = scenario2.Count(); + Assert.That(res2, Is.EqualTo(0)); + + var scenario3 = context.Actor.Where( + w => w.FirstName == "GARY" + && w.LastName == "PENN" + && w.LastUpdate >= DateTime.Today.AddDays(3)); + + var res3 = scenario3.Count(); + Assert.That(res3, Is.EqualTo(0)); + } + } + + /// + /// Bug#34317220 [.NET 6 - equality check on Datetime.Date throws ArgumentOutOfRangeException] + /// + [Test] + public void DateTimeEqualityCheck() + { + using (BugContext context = new BugContext()) + { + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + + context.Add(new Bug { Id = 1, CreatedDate = DateTime.Today }); + context.SaveChanges(); + + var test = context.Bugs.Where(x => x.CreatedDate == DateTime.Today).ToList(); + Assert.That(test.Count, Is.EqualTo(1)); + test = context.Bugs.Where(x => x.CreatedDate.Date > DateTime.Today).ToList(); + Assert.That(test.Count, Is.EqualTo(0)); + test = context.Bugs.Where(x => x.CreatedDate.Date < DateTime.Today).ToList(); + Assert.That(test.Count, Is.EqualTo(0)); + test = context.Bugs.Where(x => x.CreatedDate.Date == DateTime.Today).ToList(); + Assert.That(test.Count, Is.EqualTo(1)); + } + } + + /// + /// Bug#35392218 [bugfix schema name (specially usefull when use multiple schema..] + /// + [Test] + public void MultipleSchemaContext() + { + try + { + using (Bug35392218Context context = new Bug35392218Context()) + { + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + + context.Add(new Bug35392218_1 { Id = 1, Name = "John Doe" }); + context.Add(new Bug35392218_2 { Id = 1, Name = "John Doe" }); + context.SaveChanges(); + + using (MySqlConnection connection = new MySqlConnection(MySQLTestStore.BaseConnectionString)) + { + connection.Open(); + + MySqlCommand command = connection.CreateCommand(); + command.CommandText = "SHOW DATABASES LIKE '%bug35392218%';"; + + MySqlDataReader reader = command.ExecuteReader(); + int rowCount = 0; + while (reader.Read()) + { + rowCount++; + } + + //Checking if 2 databases related to the bug number are created in the server; + Assert.That(rowCount, Is.EqualTo(2)); + reader.Close(); + } + + using (MySqlConnection connection = new MySqlConnection(MySQLTestStore.BaseConnectionString + "database=schema_bug35392218_1;")) + { + connection.Open(); + + MySqlCommand command = connection.CreateCommand(); + command.CommandText = "SELECT * FROM bug35392218_table1"; + + MySqlDataReader reader = command.ExecuteReader(); + int rowCount = 0; + while (reader.Read()) + { + rowCount++; + } + + //Checking if the data is available in 'schemaBug35392218_1' as its the default database definded in the context configuration. + Assert.That(rowCount, Is.EqualTo(1)); + Assert.That(reader.GetString(1), Is.EqualTo("John Doe")); + + reader.Close(); + } + + using (MySqlConnection connection = new MySqlConnection(MySQLTestStore.BaseConnectionString + "database=schema_bug35392218_2;")) + { + connection.Open(); + + MySqlCommand command = connection.CreateCommand(); + command.CommandText = "SELECT * FROM bug35392218_table2"; + + MySqlDataReader reader = command.ExecuteReader(); + int rowCount = 0; + while (reader.Read()) + { + rowCount++; + } + + //Checking if the same data is also inserted into 'schemaBug35392218_2' which is the other database defined in model creation. + Assert.That(rowCount, Is.EqualTo(1)); + Assert.That(reader.GetString(1), Is.EqualTo("John Doe")); + + reader.Close(); + } + } + } + finally + { + using (MySqlConnection connection = new MySqlConnection(MySQLTestStore.BaseConnectionString)) + { + connection.Open(); + + MySqlCommand command = connection.CreateCommand(); + command.CommandText = "DROP DATABASE IF EXISTS schema_bug35392218_2;DROP DATABASE IF EXISTS schema_bug35392218_1;"; + command.ExecuteNonQuery(); + } + } + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Basic.Tests/FluentAPITests.cs b/EFCore/tests/MySql.EFCore.Basic.Tests/FluentAPITests.cs new file mode 100644 index 000000000..37c27ffbb --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Basic.Tests/FluentAPITests.cs @@ -0,0 +1,439 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using MySql.Data.MySqlClient; +using MySql.EntityFrameworkCore.Basic.Tests.DbContextClasses; +using MySql.EntityFrameworkCore.Basic.Tests.Utils; +using MySql.EntityFrameworkCore.Extensions; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Linq; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +namespace MySql.EntityFrameworkCore.Basic.Tests +{ + public class FluentAPITests + { + [OneTimeTearDown] + public void OneTimeTearDown() + { + using (ConnStringOnConfiguringContext context = new ConnStringOnConfiguringContext()) + context.Database.EnsureDeleted(); + using (KeyConventionsContext context = new KeyConventionsContext()) + context.Database.EnsureDeleted(); + using (WorldContext context = new WorldContext()) + context.Database.EnsureDeleted(); + } + + [Test] + public void EnsureRelationalPatterns() + { + Assume.That(TestUtils.IsAtLeast(5, 7, 0)); + + var serviceCollection = new ServiceCollection(); + serviceCollection.AddEntityFrameworkMySQL() + .AddDbContext(); + + var serviceProvider = serviceCollection.BuildServiceProvider(); + + using (var context = serviceProvider.GetRequiredService()) + { + context.Database.EnsureCreated(); + + var e = new Employee { FirstName = "Jos", LastName = "Stuart", Timestamp = DateTime.Now }; + context.Employees.Add(e); + context.SaveChanges(); + var employeeComputedColumn = context.Employees.FirstOrDefault(); + Assert.That(employeeComputedColumn!.DisplayName!.Equals("Stuart Jos"), "Wrong computed column"); + context.Database.EnsureDeleted(); + } + } + + + [Test] + public void CanUseModelWithDateTimeOffset() + { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddEntityFrameworkMySQL() + .AddDbContext(); + + var serviceProvider = serviceCollection.BuildServiceProvider(); + + using (var context = serviceProvider.GetRequiredService()) + { + try + { + context.Database.EnsureCreated(); + DateTimeOffset dt = DateTime.Now; + var e = new QuickEntity { Name = "Jos", Created = dt }; + context.QuickEntity.Add(e); + context.SaveChanges(); + var row = context.QuickEntity.FirstOrDefault(); + Assert.That(row!.Created, Is.EqualTo(dt)); + } + finally + { + context.Database.EnsureDeleted(); + } + } + } + + + [Test] + public async Task CanUseModelWithDateTimeOffsetAsync() + { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddEntityFrameworkMySQL() + .AddDbContext(); + + var serviceProvider = serviceCollection.BuildServiceProvider(); + + using (var context = serviceProvider.GetRequiredService()) + { + try + { + context.Database.EnsureCreated(); + DateTimeOffset dt = DateTime.Now; + var e = new QuickEntity { Name = "Jos", Created = dt }; + context.QuickEntity.Add(e); + context.SaveChanges(); + var result = await context.QuickEntity.FirstOrDefaultAsync(); + Assert.That(result!.Created, Is.EqualTo(dt)); + } + catch (Exception) + { + throw; + } + finally + { + context.Database.EnsureDeleted(); + } + } + } + + + [Test] + public void CanNameAlternateKey() + { + var serviceCollection = new ServiceCollection(); + + serviceCollection.AddEntityFrameworkMySQL() + .AddDbContext(); + + var serviceProvider = serviceCollection.BuildServiceProvider(); + + using (var context = serviceProvider.GetRequiredService()) + { + context.Database.EnsureCreated(); + using (var cnn = new MySqlConnection(MySQLTestStore.BaseConnectionString)) + { + cnn.Open(); + var cmd = new MySqlCommand("SELECT DISTINCT table_name, index_name FROM INFORMATION_SCHEMA.STATISTICS where table_name like 'cars' and index_name not like 'PRIMARY' ", cnn); + var reader = cmd.ExecuteReader(); + while (reader.Read()) + { + Assert.That(reader.GetString(1).ToString().Equals("AlternateKey_LicensePlate"), "Wrong index creation"); + } + } + } + } + + [Test] + public void CanUseToTable() + { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddEntityFrameworkMySQL() + .AddDbContext(); + + var serviceProvider = serviceCollection.BuildServiceProvider(); + + using (var context = serviceProvider.GetRequiredService()) + { + context.Database.EnsureCreated(); + using (var cnn = new MySqlConnection(MySQLTestStore.BaseConnectionString)) + { + cnn.Open(); + var cmd = new MySqlCommand("SELECT table_name FROM INFORMATION_SCHEMA.STATISTICS where table_name like 'somecars' ", cnn); + var reader = cmd.ExecuteReader(); + while (reader.Read()) + { + Assert.That(reader.GetString(0).ToString().Equals("somecars"), "Wrong table name"); + } + } + context.Database.EnsureDeleted(); + } + } + + + [Test] + public void CanUseConcurrency() + { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddEntityFrameworkMySQL() + .AddDbContext(); + + var serviceProvider = serviceCollection.BuildServiceProvider(); + + using (var context = serviceProvider.GetRequiredService()) + { + context.Database.EnsureCreated(); + using (var cnn = new MySqlConnection(MySQLTestStore.BaseConnectionString)) + { + cnn.Open(); + var cmd = new MySqlCommand("SELECT table_name FROM INFORMATION_SCHEMA.STATISTICS where table_schema like 'somecars' ", cnn); + var reader = cmd.ExecuteReader(); + while (reader.Read()) + { + Assert.That(reader.GetString(0).ToString().Equals("somecars"), "Wrong table name"); + } + } + context.Database.EnsureDeleted(); + } + } + + + [Test] + public void CanUseConcurrencyToken() + { + Assume.That(TestUtils.IsAtLeast(5, 7, 0)); + + var serviceCollection = new ServiceCollection(); + serviceCollection.AddEntityFrameworkMySQL() + .AddDbContext(); + + var serviceProvider = serviceCollection.BuildServiceProvider(); + + using (var context = serviceProvider.GetRequiredService()) + { + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + + var e = new Employee { FirstName = "Jos", LastName = "Stuart" }; + context.Employees.Add(e); + context.SaveChanges(); + var employeeComputedColumn = context.Employees.SingleOrDefault(); + Assert.That(employeeComputedColumn!.DisplayName!.Equals("Stuart Jos"), "Wrong computed column"); + context.Database.EnsureDeleted(); + } + } + + + [Test] + public void CanUseContainsInQuery() + { + Assume.That(TestUtils.IsAtLeast(5, 7, 0)); + + var serviceCollection = new ServiceCollection(); + serviceCollection.AddEntityFrameworkMySQL() + .AddDbContext(); + + var serviceProvider = serviceCollection.BuildServiceProvider(); + + using (var context = serviceProvider.GetRequiredService()) + { + context.Database.EnsureCreated(); + var e = new Employee { FirstName = "Jos", LastName = "Stuart" }; + context.Employees.Add(e); + context.SaveChanges(); + var result = context.Employees.Where(t => t.FirstName!.Contains("jo")).ToList(); + Assert.That(result, Has.One.Items); + context.Database.EnsureDeleted(); + } + } + + + [Test] + public void CanUseContainsVarInQuery() + { + Assume.That(TestUtils.IsAtLeast(5, 7, 0)); + + var serviceCollection = new ServiceCollection(); + serviceCollection.AddEntityFrameworkMySQL() + .AddDbContext(); + + var serviceProvider = serviceCollection.BuildServiceProvider(); + + using (var context = serviceProvider.GetRequiredService()) + { + context.Database.EnsureCreated(); + var e = new Employee { FirstName = "Jos", LastName = "Stuart" }; + context.Employees.Add(e); + context.SaveChanges(); + var test = "jo"; + var result = context.Employees.Where(t => t.FirstName!.Contains(test)).ToList(); + Assert.That(result, Has.One.Items); + context.Database.EnsureDeleted(); + } + } + + + [Test] + public void CanUseContainsWithInvalidValue() + { + Assume.That(TestUtils.IsAtLeast(5, 7, 0)); + + var serviceCollection = new ServiceCollection(); + serviceCollection.AddEntityFrameworkMySQL() + .AddDbContext(); + + var serviceProvider = serviceCollection.BuildServiceProvider(); + + using (var context = serviceProvider.GetRequiredService()) + { + context.Database.EnsureCreated(); + var e = new Employee { FirstName = "Jos", LastName = "Stuart" }; + context.Employees.Add(e); + context.SaveChanges(); + var result = context.Employees.Where(t => t.FirstName!.Contains("XXXXXXXX$%^&*()!")).ToList(); + Assert.That(result, Is.Empty); + result = context.Employees.Where(t => t.FirstName!.Contains("null")).ToList(); + Assert.That(result, Is.Empty); + context.Database.EnsureDeleted(); + } + } + + + [Test] + public void CanUseContainsWithVariableInQuery() + { + Assume.That(TestUtils.IsAtLeast(5, 7, 0)); + + var serviceCollection = new ServiceCollection(); + serviceCollection.AddEntityFrameworkMySQL() + .AddDbContext(); + + var serviceProvider = serviceCollection.BuildServiceProvider(); + + using (var context = serviceProvider.GetRequiredService()) + { + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + var e = new Employee { FirstName = "Jos", LastName = "Stuart" }; + context.Employees.Add(e); + context.SaveChanges(); + var avalue = "jo"; + var result = context.Employees.Where(t => t.FirstName!.Contains(avalue)).ToList(); + Assert.That(result, Has.One.Items); + context.Database.EnsureDeleted(); + } + } + + [Test] + public void TableAttributeTest() + { + using (WorldContext context = new WorldContext()) + { + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + using (MySqlConnection conn = new MySqlConnection(context.Database.GetDbConnection().ConnectionString)) + { + conn.Open(); + MySqlCommand cmd = new MySqlCommand("SHOW TABLES", conn); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetString(0), Is.EqualTo("continentlist").IgnoreCase); + Assert.That(reader.Read()); + Assert.That(reader.GetString(0), Is.EqualTo("countrylist").IgnoreCase); + } + + } + } + } + + [Test] + public void CharsetTest() + { + using (ConnStringOnConfiguringContext context = new ConnStringOnConfiguringContext()) + { + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + + using (MySqlConnection conn = (MySqlConnection)context.Database.GetDbConnection()) + { + conn.Open(); + MySqlCommand cmd = conn.CreateCommand(); + cmd.CommandText = "SHOW CREATE TABLE `TestCharsetDA`"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + string createTable = reader.GetString(1); + createTable = Regex.Replace(createTable, @"\t|\n|\r", string.Empty); + string txt = "CREATE TABLE `testcharsetda` ( `TestCharsetDAId` varbinary(255) NOT NULL, PRIMARY KEY (`TestCharsetDAId`)) ENGINE=InnoDB DEFAULT CHARSET=ascii"; + Assert.That(createTable, Is.EqualTo(txt).IgnoreCase); + } + + cmd.CommandText = "SHOW CREATE TABLE `TestCharsetFA`"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + string createTable = reader.GetString(1); + string txt = string.Empty; + createTable = Regex.Replace(createTable, @"\t|\n|\r", string.Empty); + + //Adding "COLLATION" to the string validation at table creation (this happens since MySql 8.0.5 Server) + if (createTable.Contains("COLLATE latin7_general_ci")) + { + txt = "CREATE TABLE `testcharsetfa` ( `TestCharsetFAId` varchar(255) CHARACTER SET latin7 COLLATE latin7_general_ci NOT NULL, PRIMARY KEY (`TestCharsetFAId`)) ENGINE=InnoDB DEFAULT CHARSET=utf16"; + Assert.That(createTable, Is.EqualTo(txt).IgnoreCase); + } + else + { + txt = "CREATE TABLE `testcharsetfa` ( `TestCharsetFAId` varchar(255) CHARACTER SET latin7 NOT NULL, PRIMARY KEY (`TestCharsetFAId`)) ENGINE=InnoDB DEFAULT CHARSET=utf16"; + Assert.That(createTable, Is.EqualTo(txt).IgnoreCase); + } + } + + cmd.CommandText = "SHOW CREATE TABLE `TestCollationDA`"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + string createTable = reader.GetString(1); + createTable = Regex.Replace(createTable, @"\t|\n|\r", string.Empty); + string txt = "CREATE TABLE `testcollationda` ( `TestCollationDAId` varchar(255) CHARACTER SET greek COLLATE greek_bin NOT NULL, PRIMARY KEY (`TestCollationDAId`)) ENGINE=InnoDB DEFAULT CHARSET=cp932 COLLATE=cp932_bin"; + Assert.That(createTable, Is.EqualTo(txt).IgnoreCase); + } + + cmd.CommandText = "SHOW CREATE TABLE `TestCollationFA`"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + string createTable = reader.GetString(1); + createTable = Regex.Replace(createTable, @"\t|\n|\r", string.Empty); + string txt = "CREATE TABLE `testcollationfa` ( `TestCollationFAId` varchar(255) CHARACTER SET ucs2 COLLATE ucs2_bin NOT NULL, PRIMARY KEY (`TestCollationFAId`)) ENGINE=InnoDB DEFAULT CHARSET=koi8u COLLATE=koi8u_bin"; + Assert.That(createTable, Is.EqualTo(txt).IgnoreCase); + } + } + } + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Basic.Tests/FunctionalTests.cs b/EFCore/tests/MySql.EFCore.Basic.Tests/FunctionalTests.cs new file mode 100644 index 000000000..b12e73b80 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Basic.Tests/FunctionalTests.cs @@ -0,0 +1,253 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.Extensions.DependencyInjection; +using MySql.Data.MySqlClient; +using MySql.EntityFrameworkCore.Basic.Tests.DbContextClasses; +using MySql.EntityFrameworkCore.Basic.Tests.Utils; +using MySql.EntityFrameworkCore.Extensions; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Linq; + +namespace MySql.EntityFrameworkCore.Basic.Tests +{ + public class FunctionalTests + { + [OneTimeTearDown] + public void OneTimeTearDown() + { + using (WorldContext context = new WorldContext()) + context.Database.EnsureDeleted(); + } + + [Test] + public void CanConnectWithConnectionOnConfiguring() + { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddEntityFrameworkMySQL() + .AddDbContext(); + + var serviceProvider = serviceCollection.BuildServiceProvider(); + + using (var context = serviceProvider.GetRequiredService()) + { + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + Assert.That(context.Posts.Count(), Is.EqualTo(0)); + context.Database.EnsureDeleted(); + } + } + + + [Test] + public void CanThrowExceptionWhenNoConfiguration() + { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddEntityFrameworkMySQL() + .AddDbContext(); + + var serviceProvider = serviceCollection.BuildServiceProvider(); + + using (var context = serviceProvider.GetRequiredService()) + { + Assert.That(Assert.Throws(() => context.Blogs.Any())!.Message, Is.EqualTo(CoreStrings.NoProviderConfigured)); + } + } + + + [Test] + public void CreatedDb() + { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddEntityFrameworkMySQL() + .AddDbContext(); + + var serviceProvider = serviceCollection.BuildServiceProvider(); + + using (var context = serviceProvider.GetRequiredService()) + { + context.Database.EnsureCreated(); + var dbname = context.Database.GetDbConnection().Database; + using (var cnn = new MySqlConnection(MySQLTestStore.BaseConnectionString + string.Format(";database={0}", context.Database.GetDbConnection().Database))) + { + cnn.Open(); + var cmd = new MySqlCommand(string.Format("SHOW DATABASES LIKE '{0}'", context.Database.GetDbConnection().Database), cnn); + var reader = cmd.ExecuteReader(); + while (reader.Read()) + { + Assert.That(string.Equals(dbname, reader.GetString(0), StringComparison.CurrentCultureIgnoreCase), "Database was not created"); + } + } + context.Database.EnsureDeleted(); + } + } + + + [Test] + public void EnsureRelationalPatterns() + { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddEntityFrameworkMySQL() + .AddDbContext(); + + var serviceProvider = serviceCollection.BuildServiceProvider(); + + using (var context = serviceProvider.GetRequiredService()) + { + context.Database.EnsureCreated(); + using (var cnn = new MySqlConnection(MySQLTestStore.BaseConnectionString + string.Format(";database={0}", context.Database.GetDbConnection().Database))) + { + var dbname = context.Database.GetDbConnection().Database; + cnn.Open(); + var cmd = new MySqlCommand(string.Format("SHOW DATABASES LIKE '{0}'", context.Database.GetDbConnection().Database), cnn); + var reader = cmd.ExecuteReader(); + while (reader.Read()) + { + Assert.That(string.Equals(dbname, reader.GetString(0), StringComparison.CurrentCultureIgnoreCase), "Database was not created"); + } + } + context.Database.EnsureDeleted(); + } + } + + + [Test] + public void CanUseIgnoreEntity() + { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddEntityFrameworkMySQL() + .AddDbContext(); + + var serviceProvider = serviceCollection.BuildServiceProvider(); + + using (var context = serviceProvider.GetRequiredService()) + { + context.Database.EnsureCreated(); + Assert.That(context.Model.GetEntityTypes().Count(), Is.EqualTo(2), "Wrong model generation"); + Assert.That(context.Blogs.ToList().Count, Is.EqualTo(0), ""); + context.Database.EnsureDeleted(); + } + } + + + + [Test] + public void CanUseOptionsInDbContextCtor() + { + using (var context = new OptionsContext(new DbContextOptions(), + new MySqlConnection(MySQLTestStore.CreateConnectionString("db-optionsindbcontext")))) + { + context.Database.EnsureCreated(); + Assert.That(context.Blogs.Count(), Is.EqualTo(0)); + context.Database.EnsureDeleted(); + } + + } + + [Test] + public void TestEnsureSchemaOperation() + { + using (var context = new WorldContext()) + { + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + context.Countries.Add(new Country() + { + Code = "1", + Name = "London" + }); + context.SaveChanges(); + } + } + + #region ContextClasses + + protected class OptionsContext : SimpleContext + { + private readonly MySqlConnection _connection; + private readonly DbContextOptions _options; + + public OptionsContext(DbContextOptions options, MySqlConnection connection) + : base(options) + { + _options = options; + _connection = connection; + } + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + Assert.That(optionsBuilder.Options, Is.SameAs(_options)); + + optionsBuilder.UseMySQL(_connection); + + Assert.That(optionsBuilder.Options, Is.Not.SameAs(_options)); + } + + public override void Dispose() + { + _connection.Dispose(); + base.Dispose(); + } + } + + private class ConnStringOnConfiguringContext : TestsContext + { + public ConnStringOnConfiguringContext(DbContextOptions options) + : base(options) + { + } + } + + + private class UseConnectionInOnConfiguring : TestsContext + { + private MySqlConnection _connection; + + public UseConnectionInOnConfiguring(MySqlConnection connection) + { + _connection = connection; + } + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + optionsBuilder.UseMySQL(_connection); + } + + public override void Dispose() + { + _connection.Dispose(); + base.Dispose(); + } + } + #endregion + } +} diff --git a/EFCore/tests/MySql.EFCore.Basic.Tests/LoadingRelatedDataTests.cs b/EFCore/tests/MySql.EFCore.Basic.Tests/LoadingRelatedDataTests.cs new file mode 100644 index 000000000..c73eb25c1 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Basic.Tests/LoadingRelatedDataTests.cs @@ -0,0 +1,329 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using MySql.Data.MySqlClient; +using MySql.EntityFrameworkCore.Basic.Tests.DbContextClasses; +using MySql.EntityFrameworkCore.Basic.Tests.Utils; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System.Linq; + +namespace MySql.EntityFrameworkCore.Basic.Tests +{ + public class LoadingRelatedDataTests + { + DbContext context; + + public LoadingRelatedDataTests() + { + context = new EagerLoadingContext(); + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + AddData(context); + } + + [OneTimeTearDown] + public void OneTimeTearDown() + { + using (FiguresContext context = new FiguresContext()) + context.Database.EnsureDeleted(); + using (JsonContext context = new JsonContext()) + context.Database.EnsureDeleted(); + using (WorldContext context = new WorldContext()) + context.Database.EnsureDeleted(); + context.Database.EnsureDeleted(); + } + + [Test] + public void CanUseSkipAndTake() + { + Assert.That(!context.Database.EnsureCreated()); + var people + = context.Set() + .Skip(2) + .Take(1) + .ToList(); + + Assert.That(people, Has.One.Items); + } + + [Test] + public void CanIncludeAddressData() + { + Assert.That(!context.Database.EnsureCreated()); + var people + = context.Set() + .Include(p => p.Address) + .ToList(); + + Assert.That(people.Count, Is.EqualTo(4)); + Assert.That(people.Count(p => p.Address != null), Is.EqualTo(3)); + } + + [Test] + public void CanIncludeGuestData() + { + Assert.That(!context.Database.EnsureCreated()); + var ad + = context.Set
() + .Include(p => p.Guest) + .ToList(); + + Assert.That(ad.Count, Is.EqualTo(3)); + var rows = ad.Select(g => g.Guest).Where(a => a != null).ToList(); + Assert.That(rows.Count(), Is.EqualTo(3)); + } + + + [Test] + public void CanIncludeGuestShadowProperty() + { + Assert.That(!context.Database.EnsureCreated()); + var addressRelative + = context.Set() + .Include(a => a.Relative) + .ToList(); + + Assert.That(addressRelative.Count, Is.EqualTo(3)); + Assert.That(addressRelative.All(p => p.Relative != null)); + } + + [Test] + public void MixClientServerEvaluation() + { + Assert.That(!context.Database.EnsureCreated()); + var list + = context.Set
() + .OrderByDescending(a => a.City) + .Select(a => new { Id = a.IdAddress, City = SetCity(a.City!) }) + .ToList(); + + Assert.That(list.Count, Is.EqualTo(3)); + Assert.That(list.First().City, Does.EndWith(" city")); + } + + private static string SetCity(string name) + { + return name + " city"; + } + + [Test] + public void RawSqlQueries() + { + Assert.That(!context.Database.EnsureCreated()); + var guests = context.Set().FromSqlRaw("SELECT * FROM Guests") + .ToList(); + Assert.That(guests.Count, Is.EqualTo(4)); + } + + [Test] + public void UsingTransactions() + { + Assert.That(!context.Database.EnsureCreated()); + using (var transaction = context.Database.BeginTransaction()) + { + context.Set().Add(new Guest() + { + Name = "Guest five" + }); + context.SaveChanges(); + } + Assert.That(context.Set().Count(), Is.EqualTo(4)); + } + + [Test] + public void DbSetFind() + { + var address = context.Set
().Find(1); + Assert.That(address, Is.Not.Null); + Assert.That(address!.City, Is.EqualTo("Michigan")); + } + + + [Test] + public void JsonDataTest() + { + Assume.That(TestUtils.IsAtLeast(5, 7, 0)); + + using (JsonContext context = new JsonContext()) + { + var model = context.Model; + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + + using (MySqlConnection conn = (MySqlConnection)context.Database.GetDbConnection()) + { + conn.Open(); + MySqlCommand cmd = new MySqlCommand("SHOW CREATE TABLE JsonEntity", conn); + string jsonTableDesc; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + jsonTableDesc = reader.GetString(1); + } + string charset = "latin1"; + string smallintWidth = "(6)"; + if (conn.driver.Version.isAtLeast(8, 0, 1)) + { + charset = "utf8mb4"; + smallintWidth = string.Empty; + } + //Adding "COLLATION" to the string validation at table creation (this happens since MySql 8.0.5 Server) + if (jsonTableDesc.Contains("COLLATE=utf8mb4_0900_ai_ci")) + Assert.That(jsonTableDesc, Is.EqualTo($"CREATE TABLE `jsonentity` (\n `Id` smallint{smallintWidth} NOT NULL AUTO_INCREMENT," + + $"\n `jsoncol` json DEFAULT NULL,\n PRIMARY KEY (`Id`)\n) ENGINE=InnoDB DEFAULT CHARSET={charset} COLLATE=utf8mb4_0900_ai_ci").IgnoreCase); + else Assert.That(jsonTableDesc, Is.EqualTo($"CREATE TABLE `jsonentity` (\n `Id` smallint{smallintWidth} NOT NULL AUTO_INCREMENT,\n `jsoncol` json DEFAULT NULL,\n PRIMARY KEY (`Id`)\n) " + + $"ENGINE=InnoDB DEFAULT CHARSET={charset}").IgnoreCase); + } + + context.JsonEntity.Add(new JsonData() + { + jsoncol = "{ \"name\": \"Ronald\", \"city\": \"Austin\" }" + }); + context.SaveChanges(); + JsonData json = context.JsonEntity.First(); + Assert.That(json.jsoncol, Is.EqualTo("{ \"name\": \"Ronald\", \"city\": \"Austin\" }")); + } + } + + + [Test] + public void JsonInvalidData() + { + Assume.That(TestUtils.IsAtLeast(5, 7, 0)); + + using (JsonContext context = new JsonContext()) + { + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + context.JsonEntity.Add(new JsonData() + { + jsoncol = "{ name: Ronald, city: Austin }" + }); + + var ex = Assert.Throws(() => context.SaveChanges())?.GetBaseException(); + Assert.That(((MySqlException)ex!).Number, Is.EqualTo(3140)); + } + } + + + [Test] + public void ComputedColumns() + { + Assume.That(TestUtils.IsAtLeast(5, 7, 0)); + + using (FiguresContext context = new FiguresContext()) + { + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + Triangle[] data = new Triangle[2]; + data[0] = new Triangle() + { + Id = 33, + Base = 15, + Height = 10 + }; + data[1] = new Triangle() + { + Base = 20, + Height = 5 + }; + context.Triangle.AddRange(data); + context.Triangle.Add(data[1]); + context.SaveChanges(); + Assert.That(data[0].Area, Is.EqualTo(75)); + Assert.That(data[1].Area, Is.EqualTo(50)); + } + } + + [Test] + public void ExplicitLoading() + { + using (var context = new WorldContext()) + { + context.PopulateData(); + var america = context.Continents.Single(c => c.Code == "AM"); + Assert.That(america.Countries, Is.Null); + context.Entry(america) + .Collection(c => c.Countries!) + .Load(); + Assert.That(america.Countries!.Count, Is.EqualTo(5)); + Assert.That(america.Countries.Single(c => c.Code == "US").Name, Is.EqualTo("United States")); + } + } + + [Test] + public void ExplicitLoadingQueryingRelatedEntitites() + { + using (var context = new WorldContext()) + { + context.PopulateData(); + var asia = context.Continents.Single(c => c.Code == "AS"); + Assert.That(asia.Countries, Is.Null); + var list = context.Entry(asia) + .Collection(c => c.Countries!) + .Query() + .Where(c => c.Name!.Contains("i")) + .ToList(); + } + } + + + + private void AddData(DbContext context) + { + var d = new Address { Street = "Street one", City = "Michigan" }; + var d1 = new Address { Street = "Street two", City = "San Francisco" }; + var d2 = new Address { Street = "Street three", City = "Denver" }; + + context.Set().AddRange( + new Guest { Name = "Guest one", Address = d }, + new Guest { Name = "Guest two", Address = d1 }, + new Guest { Name = "Guest three", Address = d2 }, + new Guest { Name = "Guest four" } + ); + + context.Set
().AddRange(d, d1, d2); + + var ad = new AddressRelative { Street = "Street one", City = "Michigan" }; + var ad1 = new AddressRelative { Street = "Street two", City = "San Francisco" }; + var ad2 = new AddressRelative { Street = "Street three", City = "Denver" }; + + context.Set().AddRange( + new Relative { Name = "L. J.", Address = ad }, + new Relative { Name = "M. M.", Address = ad1 }, + new Relative { Name = "Z. Z.", Address = ad2 } + ); + + context.Set().AddRange(ad, ad1, ad2); + + context.SaveChanges(); + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Basic.Tests/ModelingTests.cs b/EFCore/tests/MySql.EFCore.Basic.Tests/ModelingTests.cs new file mode 100644 index 000000000..d20647d7b --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Basic.Tests/ModelingTests.cs @@ -0,0 +1,201 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using MySql.EntityFrameworkCore.Basic.Tests.DbContextClasses; +using MySql.EntityFrameworkCore.Basic.Tests.Utils; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace MySql.EntityFrameworkCore.Basic.Tests +{ + [TestFixture] + public class ModelingTests : SakilaLiteFixture + { + [Test] + public void TableSplitting() + { + // Inserting data + using (SakilaLiteTableSplittingContext context = new SakilaLiteTableSplittingContext()) + { + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + + context.Films.Add(new FilmLite + { + FilmId = 1, + Title = "ACADEMY DINOSAUR", + Description = "A Epic Drama of a Feminist And a Mad Scientist who must Battle a Teacher in The Canadian Rockies", + Details = new FilmDetails + { + FilmId = 1, + ReleaseYear = 2006, + LanguageId = 1, + OriginalLanguageId = null, + RentalDuration = 6, + RentalRate = 0.99m, + Length = 86, + ReplacementCost = 20.99m, + Rating = "PG", + SpecialFeatures = "Deleted Scenes,Behind the Scenes", + LastUpdate = DateTime.Parse("2006-02-15 05:03:42") + } + }); + context.Films.Add(new FilmLite + { + FilmId = 2, + Title = "ACE GOLDFINGER", + Description = "A Astounding Epistle of a Database Administrator And a Explorer who must Find a Car in Ancient China" + }); + context.FilmDetails.Add(new FilmDetails + { + FilmId = 2, + ReleaseYear = 2006, + LanguageId = 1, + OriginalLanguageId = null, + RentalDuration = 3, + RentalRate = 4.99m, + Length = 48, + ReplacementCost = 12.99m, + Rating = "G", + SpecialFeatures = "Trailers,Deleted Scenes", + LastUpdate = DateTime.Parse("2006-02-15 05:03:42") + }); + + context.SaveChanges(); + } + + // Validating data + using (SakilaLiteTableSplittingContext context = new SakilaLiteTableSplittingContext()) + { + var films = context.Films.Include(e => e.Details).ToList(); + + Assert.That(films.Where(a => a.FilmId == 1), Has.One.Items); + Assert.That(films.Where(a => a.FilmId == 2), Has.One.Items); + Assert.That(films.Select(c => c.Title), Has.Exactly(1).Matches(Title => Title.Contains("ACADEMY DINOSAUR"))); + Assert.That(films.Select(c => c.Title), Has.Exactly(1).Matches(Title => Title.Contains("ACE GOLDFINGER"))); + Assert.That(films.Where(a => a.Details!.Film!.Details!.ReleaseYear == 2006), Has.Exactly(2).Items); + } + } + + [Test] + public void ScalarFunctionMapping() + { + using (SakilaLiteContext context = new SakilaLiteContext()) + { + context.Database.ExecuteSqlInterpolated($"CREATE FUNCTION FilmsByActorCount(id SMALLINT) RETURNS INT RETURN (SELECT COUNT(*) FROM film_actor WHERE actor_id = id);"); + var query = context.Actor.Where(c => SakilaLiteContext.FilmsByActorCount(c.ActorId) == 18).ToList(); + Assert.That(query.Select(a => a.ActorId), Has.Exactly(1).Matches(actorid => actorid.Equals(31))); + Assert.That(query.Select(a => a.ActorId), Has.Exactly(1).Matches(actorid => actorid.Equals(71))); + } + } + + [Test] + public void LikeFunction() + { + using (SakilaLiteContext context = new SakilaLiteContext()) + { + var query = context.Actor.Where(c => EF.Functions.Like(c.LastName!, "A%")).ToList(); + Assert.That(query, Is.Not.Empty); + foreach (Actor actor in query) + { + Assert.That(actor.LastName, Does.StartWith("A")); + } + } + } + + [Test] + [Ignore("Fix this")] + public void OwnedEntityTypes() + { + using (SakilaLiteOwnedTypesContext context = new SakilaLiteOwnedTypesContext()) + { + try + { + context.InitContext(); + + SakilaAddress address = new SakilaAddress + { + Address = "47 MySakila Drive", + Address2 = null, + AddressId = 1, + CityId = 300, + District = "Alberta", + Phone = "", + PostalCode = "", + LastUpdate = DateTime.Parse("2014-09-25 22:30:27") + }; + + context.Customer.Find((short)1)!.Address = address; + context.SaveChanges(); + + var customer = context.Customer.Where(p => p.Address!.AddressId == 1).First(); + Assert.That(customer.CustomerId, Is.EqualTo(1)); + Assert.That(customer.Address!.Address, Is.EqualTo("47 MySakila Drive")); + } + finally + { + context.Database.EnsureDeleted(); + } + } + } + + [Test] + public void ModelLevelQueryFilter() + { + using (SakilaLiteContext context = new SakilaLiteContext()) + { + Assert.That(context.Customer.Count(), Is.EqualTo(584)); + Assert.That(context.Customer.IgnoreQueryFilters().Count(), Is.EqualTo(599)); + } + } + + /// + /// Bug 31337609 - MySql.EntityFrameworkCore NUGET PACKAGE 8.0.20 + /// + [Test] + public void ConvertToType() + { + using (var context = new SakilaLiteContext()) + { + var ls = new List(); + ls = context.Actor.OrderBy(a => a.ActorId).Select(b => new ActorTest + { + Number = Convert.ToInt32(b.ActorId), + Value = b.LastUpdate.ToString(), + Text = b.FirstName, + }).ToList(); + + Assert.That(ls, Is.Not.Empty); + } + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Basic.Tests/MultiSchemaTests.cs b/EFCore/tests/MySql.EFCore.Basic.Tests/MultiSchemaTests.cs new file mode 100644 index 000000000..8a82615aa --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Basic.Tests/MultiSchemaTests.cs @@ -0,0 +1,159 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using MySql.Data.MySqlClient; +using MySql.EntityFrameworkCore.Basic.Tests.DbContextClasses; +using MySql.EntityFrameworkCore.Basic.Tests.Utils; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace MySql.EntityFrameworkCore.Basic.Tests +{ + public class MultiSchemaTests + { + [OneTimeTearDown] + public void OneTimeTearDown() + { + using (BodyShopContext context = new BodyShopContext()) + { + using (MySqlConnection conn = (MySqlConnection)context.Database.GetDbConnection()) + { + MySqlCommand cmd = conn.CreateCommand(); + cmd.CommandText = @"DROP DATABASE IF EXISTS `01cars`; + DROP DATABASE IF EXISTS `02bodyshops`; + DROP DATABASE IF EXISTS `03employees`; + DROP DATABASE IF EXISTS `db-bodyshopinsertcontext`;"; + conn.Open(); + context.Database.EnsureDeleted(); + cmd.Connection = conn; + cmd.ExecuteNonQuery(); + } + } + } + + [Test] + public void MultiSchemaTest() + { + PopulateData(); + using (BodyShopContext context = new BodyShopContext()) + { + using (MySqlConnection conn = (MySqlConnection)context.Database.GetDbConnection()) + { + MySqlCommand cmd = conn.CreateCommand(); + cmd.CommandText = "SHOW DATABASES WHERE `Database` IN('01cars', '02bodyshops', '03employees')"; + conn.Open(); + List databases = new List(new string[] { "01cars", "02bodyshops", "03employees" }); + int count = 0; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + Assert.That(databases.Contains(reader.GetString(0))); + count++; + } + } + Assert.That(count, Is.EqualTo(3)); + } + } + } + + [Test] + public void LoadingData() + { + using (BodyShopInsertContext context = new BodyShopInsertContext()) + { + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + context.BodyShop.AddRange(new BodyShop + { + Name = "Western Collision Works", + City = "Hollywood", + State = "California", + Brand = "Chevrolet" + }, + new BodyShop + { + Name = "Yosemite Auto Body Shop", + City = "Pico-Union", + State = "California", + Brand = "Ford" + }); + + context.Car.AddRange(new Car + { + LicensePlate = "ATD 427", + Make = "Chevrolet", + Model = "Cruze", + State = "New" + }, + new Car + { + LicensePlate = "TJC 265", + Make = "Fore", + Model = "Escape", + State = "Used" + }); + + context.Employee.AddRange(new Employee + { + FirstName = "Jonh", + LastName = "Doe", + Timestamp = DateTime.Now + }, + new Employee + { + FirstName = "Maurice", + LastName = "Kent", + Timestamp = DateTime.Now + }); + + context.SaveChanges(); + Assert.That(context.Car.Count(), Is.EqualTo(2)); + Assert.That(context.BodyShop.Count(), Is.EqualTo(2)); + Assert.That(context.Employee.Count(), Is.EqualTo(2)); + } + } + + private void PopulateData() + { + using (BodyShopContext context = new BodyShopContext()) + { + // Clean databases + context.Database.EnsureDeleted(); + MySQLTestStore.DeleteDatabase("01cars"); + MySQLTestStore.DeleteDatabase("02bodyshops"); + MySQLTestStore.DeleteDatabase("03employees"); + context.Database.EnsureCreated(); + } + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Basic.Tests/MySQLDatabaseFacadeTest.cs b/EFCore/tests/MySql.EFCore.Basic.Tests/MySQLDatabaseFacadeTest.cs new file mode 100644 index 000000000..1c203cc07 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Basic.Tests/MySQLDatabaseFacadeTest.cs @@ -0,0 +1,224 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Castle.Core.Logging; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics; +using Microsoft.EntityFrameworkCore.TestUtilities; +using Microsoft.Extensions.DependencyInjection; +using MySql.EntityFrameworkCore.Basic.Tests.Utils; +using MySql.EntityFrameworkCore.Extensions; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; + +namespace MySql.EntityFrameworkCore.Basic.Tests +{ + public class MySQLDatabaseFacadeTest + { + [Test] + public void IsMySQLWhenUsingOnConfiguring() + { + using (var context = new MySQLOnConfiguringContext()) + { + Assert.That(context.Database.IsMySql()); + } + } + + [Test] + public void IsMySQLInOnModelCreatingWhenUsingOnConfiguring() + { + using (var context = new MySQLOnModelContext()) + { + var _ = context.Model; // Trigger context initialization + Assert.That(context.IsMySQLSet == true); + } + } + + [Test] + public void IsMySQLInConstructorWhenUsingOnConfiguring() + { + using (var context = new MySQLConstructorContext()) + { + var _ = context.Model; // Trigger context initialization + Assert.That(context.IsMySQLSet == true); + } + } + + [Test] + public void CannotUseIsMySQLInOnConfiguring() + { + using (var context = new MySQLUseInOnConfiguringContext()) + { + Assert.That( + Assert.Throws( + () => + { + var _ = context.Model; // Trigger context initialization + })!.Message, Is.EqualTo(CoreStrings.RecursiveOnConfiguring)); + } + } + + [Test] + public void IsMySQLWhenUsingConstructor() + { + using (var context = new ProviderContext( + new DbContextOptionsBuilder() + .UseInternalServiceProvider(MySQLFixture.DefaultServiceProvider) + .UseMySQL("Database=Maltesers").Options)) + { + Assert.That(context.Database.IsMySql()); + } + } + + [Test] + public void IsMySQLInOnModelCreatingWhenUsingConstructor() + { + using (var context = new ProviderOnModelContext( + new DbContextOptionsBuilder() + .UseInternalServiceProvider(MySQLFixture.DefaultServiceProvider) + .UseMySQL("Database=Maltesers").Options)) + { + var _ = context.Model; // Trigger context initialization + Assert.That(context.IsMySQLSet == true); + } + } + + [Test] + public void IsMySQLInConstructorWhenUsingConstructor() + { + using (var context = new ProviderConstructorContext( + new DbContextOptionsBuilder() + .UseInternalServiceProvider(MySQLFixture.DefaultServiceProvider) + .UseMySQL("Database=Maltesers").Options)) + { + var _ = context.Model; // Trigger context initialization + Assert.That(context.IsMySQLSet == true); + } + } + + [Test] + public void CannotUseIsMySQLInOnConfiguringWithConstructor() + { + using (var context = new ProviderUseInOnConfiguringContext( + new DbContextOptionsBuilder() + .UseInternalServiceProvider(MySQLFixture.DefaultServiceProvider) + .UseMySQL("Database=Maltesers").Options)) + { + Assert.That( + Assert.Throws( + () => + { + var _ = context.Model; // Trigger context initialization + })!.Message, Is.EqualTo(CoreStrings.RecursiveOnConfiguring)); + } + } + + private class ProviderContext : DbContext + { + protected ProviderContext() + { + } + + public ProviderContext(DbContextOptions options) + : base(options) + { + } + + public bool? IsMySQLSet { get; protected set; } + } + + private class MySQLFixture : ServiceProviderFixtureBase + { + public static IServiceProvider DefaultServiceProvider { get; } + = new ServiceCollection().AddEntityFrameworkMySQL().BuildServiceProvider(); + + public TestSqlLoggerFactory TestSqlLoggerFactory => (TestSqlLoggerFactory)ServiceProvider.GetRequiredService(); + protected override ITestStoreFactory TestStoreFactory => MySQLTestStoreFactory.Instance; + } + + private class MySQLOnConfiguringContext : ProviderContext + { + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + => optionsBuilder + .UseInternalServiceProvider(MySQLFixture.DefaultServiceProvider) + .UseMySQL("Database=Maltesers"); + } + + private class MySQLOnModelContext : MySQLOnConfiguringContext + { + protected override void OnModelCreating(ModelBuilder modelBuilder) + => IsMySQLSet = Database.IsMySql(); + } + + private class MySQLConstructorContext : MySQLOnConfiguringContext + { + public MySQLConstructorContext() + => IsMySQLSet = Database.IsMySql(); + } + + private class MySQLUseInOnConfiguringContext : MySQLOnConfiguringContext + { + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + base.OnConfiguring(optionsBuilder); + + IsMySQLSet = Database.IsMySql(); + } + } + + private class ProviderOnModelContext : ProviderContext + { + public ProviderOnModelContext(DbContextOptions options) + : base(options) + { + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + => IsMySQLSet = Database.IsMySql(); + } + + private class ProviderConstructorContext : ProviderContext + { + public ProviderConstructorContext(DbContextOptions options) + : base(options) + => IsMySQLSet = Database.IsMySql(); + } + + private class ProviderUseInOnConfiguringContext : ProviderContext + { + public ProviderUseInOnConfiguringContext(DbContextOptions options) + : base(options) + { + } + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + => IsMySQLSet = Database.IsMySql(); + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Basic.Tests/MySQLTypeMapperTests.cs b/EFCore/tests/MySql.EFCore.Basic.Tests/MySQLTypeMapperTests.cs new file mode 100644 index 000000000..03a06aac0 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Basic.Tests/MySQLTypeMapperTests.cs @@ -0,0 +1,211 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using MySql.Data.MySqlClient; +using MySql.EntityFrameworkCore.Basic.Tests.DbContextClasses; +using MySql.EntityFrameworkCore.Basic.Tests.Utils; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace MySql.EntityFrameworkCore.Basic.Tests +{ + public class MySQLTypeMapperTests + { + [OneTimeTearDown] + public void OneTimeTearDown() + { + using (var context = new AllDataTypesContext()) + context.Database.EnsureDeleted(); + using (var context = new StringTypesContext()) + context.Database.EnsureDeleted(); + using (var context = new AllBlobTypesContext()) + context.Database.EnsureDeleted(); + } + + [Test] + public void InsertAllDataTypes() + { + Assume.That(TestUtils.IsAtLeast(5, 7, 0)); + + DateTime now = new DateTime(DateTime.Today.AddSeconds(1).AddMilliseconds(1).AddTicks(10).Ticks); + + using (var context = new AllDataTypesContext()) + { + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + + context.AllDataTypes.Add(new AllDataTypes() + { + AddressNumber1 = 1, + AddressNumber2 = 2, + AddressNumber3 = 3, + AddressNumber4 = 4, + AddressNumber5 = (long)5, + AddressNumber6 = 6.36f, + AddressNumber7 = 7.49f, + AddressNumber8 = 8.64d, + AddressNumber9 = 9.81m, + AddressNumber10 = 10, + BuildingName1 = "BuildingName1", + BuildingName2 = "BuildingName2", + BuildingName3 = "BuildingName3", + BuildingName4 = "BuildingName4", + BuildingName5 = "BuildingName5", + BuildingName6 = UTF8Encoding.UTF8.GetBytes("BuildingName6"), + BuildingName7 = UTF8Encoding.UTF8.GetBytes("BuildingName7"), + BuildingName8 = UTF8Encoding.UTF8.GetBytes("BuildingName8"), + BuildingName9 = UTF8Encoding.UTF8.GetBytes("BuildingName9"), + BuildingName10 = UTF8Encoding.UTF8.GetBytes("BuildingName10"), + BuildingName11 = "small", + BuildingName12 = "small,medium,large,medium", + BuildingName13 = now, + BuildingName14 = now, + BuildingName15 = now.TimeOfDay, + BuildingName16 = now, + BuildingName17 = (short)now.Year + }); + context.SaveChanges(); + } + + using (var context = new AllDataTypesContext()) + { + var data = context.AllDataTypes.First(); + Assert.That(data.AddressNumber1, Is.EqualTo(1)); + Assert.That(data.AddressNumber2, Is.EqualTo(2)); + Assert.That(data.AddressNumber3, Is.EqualTo(3)); + Assert.That(data.AddressNumber4, Is.EqualTo(4)); + Assert.That(data.AddressNumber5, Is.EqualTo((long)5)); + Assert.That(data.AddressNumber6, Is.EqualTo(6.36f)); + Assert.That(data.AddressNumber7, Is.EqualTo(7.49f)); + Assert.That(data.AddressNumber8, Is.EqualTo(8.64d)); + Assert.That(data.AddressNumber9, Is.EqualTo(9.81m)); + Assert.That(data.AddressNumber10, Is.EqualTo(10)); + Assert.That(data.BuildingName1, Is.EqualTo("BuildingName1")); + Assert.That(data.BuildingName2, Is.EqualTo("BuildingName2")); + Assert.That(data.BuildingName3, Is.EqualTo("BuildingName3")); + Assert.That(data.BuildingName4, Is.EqualTo("BuildingName4")); + Assert.That(data.BuildingName5, Is.EqualTo("BuildingName5")); + Assert.That(UTF8Encoding.UTF8.GetString(data.BuildingName6!), Is.EqualTo("BuildingName6".PadRight(120, '\0'))); + Assert.That(UTF8Encoding.UTF8.GetString(data.BuildingName7!), Is.EqualTo("BuildingName7")); + Assert.That(UTF8Encoding.UTF8.GetString(data.BuildingName8!), Is.EqualTo("BuildingName8")); + Assert.That(UTF8Encoding.UTF8.GetString(data.BuildingName9!), Is.EqualTo("BuildingName9")); + Assert.That(UTF8Encoding.UTF8.GetString(data.BuildingName10!), Is.EqualTo("BuildingName10")); + Assert.That(data.BuildingName11, Is.EqualTo("small")); + Assert.That(data.BuildingName12, Is.EqualTo("small,medium,large")); + Assert.That(data.BuildingName13, Is.EqualTo(now.Date)); + Assert.That(data.BuildingName14, Is.EqualTo(now)); + Assert.That(data.BuildingName15, Is.EqualTo(now.TimeOfDay)); + Assert.That(data.BuildingName16, Is.EqualTo(now)); + Assert.That(data.BuildingName17, Is.EqualTo(now.Year)); + } + } + + /// + /// Bug#36208913 Byte array type mapping has a fixed limit of 8000 in EFCore + /// + [Test] + public void LongBlobMapping() + { + using (var context = new AllBlobTypesContext()) + { + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + + + var data1 = new byte[7000]; + var data2 = new byte[60000]; + var data3 = new byte[90000]; + + + context.AllBlobTypes.Add(new AllBlobTypes() + { + Id = 1, + Example1 = data1, + Example2 = data2, + Example3 = data3, + }); + context.SaveChanges(); + } + + using (var context = new AllBlobTypesContext()) + { + + var data1 = new byte[7000]; + var data2 = new byte[60000]; + var data3 = new byte[90000]; + + var data = context.AllBlobTypes.First(); + + Assert.That(data.Example1.Length, Is.EqualTo(data1.Length)); + Assert.That(data.Example2.Length, Is.EqualTo(data2.Length)); + Assert.That(data.Example3.Length, Is.EqualTo(data3.Length)); + } + } + + [Test] + public void ValidateStringLength() + { + using (var context = new StringTypesContext()) + { + context.Database.EnsureDeleted(); + context.Database.EnsureCreated(); + + Dictionary validation = new Dictionary + { + { "TinyString", "varchar(255)" }, + { "NormalString", "varchar(3000)" }, + { "MediumString", "mediumtext" }, + { "LongString", "longtext" } + }; + + context.Database.OpenConnection(); + MySqlConnection conn = (MySqlConnection)context.Database.GetDbConnection(); + MySqlCommand cmd = new MySqlCommand( + $"DESC StringType", + conn); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + int counter = 0; + while (reader.Read()) + { + string field = reader.GetString("field"); + string type = validation[field]; + Assert.That(reader.GetString("type"), Is.EqualTo(type)); + counter++; + } + Assert.That(counter, Is.EqualTo(validation.Count)); + } + } + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Basic.Tests/MySql.EntityFrameworkCore.Basic.Tests.csproj b/EFCore/tests/MySql.EFCore.Basic.Tests/MySql.EntityFrameworkCore.Basic.Tests.csproj new file mode 100644 index 000000000..f3c7b8036 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Basic.Tests/MySql.EntityFrameworkCore.Basic.Tests.csproj @@ -0,0 +1,44 @@ + + + + MySql.EntityFrameworkCore.Basic.Tests Class Library + net9.0;net8.0; + MySql.EntityFrameworkCore.Basic.Tests + MySql.EntityFrameworkCore.Basic.Tests + true + True + True + enable + ..\..\..\ConnectorNetPublicKey.snk + CS1591,CS1701,CS1702,EF1001 + + + + $(TargetFrameworks);net10.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/EFCore/tests/MySql.EFCore.Basic.Tests/Properties/DatabaseSetup.sql b/EFCore/tests/MySql.EFCore.Basic.Tests/Properties/DatabaseSetup.sql new file mode 100644 index 000000000..6a67848d2 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Basic.Tests/Properties/DatabaseSetup.sql @@ -0,0 +1,43 @@ +/* +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +DROP USER 'test'; +create user 'test'@'localhost' identified by 'test'; +grant all privileges on *.* to 'test'@'localhost'; +flush privileges; + +DROP DATABASE IF EXISTS `[database0]`; CREATE DATABASE `[database0]`; +GRANT ALL ON `[database0]`.* to 'test'@'localhost' IDENTIFIED BY 'test'; +GRANT ALL ON `[database0]`.* to 'test'@'%' IDENTIFIED BY 'test'; +FLUSH PRIVILEGES; + +SET GLOBAL max_allowed_packet = 1048576; + +FLUSH PRIVILEGES; diff --git a/EFCore/tests/MySql.EFCore.Basic.Tests/ShadowPropertiesTests.cs b/EFCore/tests/MySql.EFCore.Basic.Tests/ShadowPropertiesTests.cs new file mode 100644 index 000000000..faf443047 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Basic.Tests/ShadowPropertiesTests.cs @@ -0,0 +1,117 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using MySql.Data.MySqlClient; +using MySql.EntityFrameworkCore.Basic.Tests.DbContextClasses; +using MySql.EntityFrameworkCore.Extensions; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Data; +using System.Linq; + +namespace MySql.EntityFrameworkCore.Basic.Tests +{ + public class ShadowPropertiesTests : IDisposable + { + + ServiceCollection serviceCollection; + IServiceProvider serviceProvider; + DbContext context; + + public ShadowPropertiesTests() + { + serviceCollection = new ServiceCollection(); + serviceCollection.AddEntityFrameworkMySQL() + .AddDbContext(); + + serviceProvider = serviceCollection.BuildServiceProvider(); + context = serviceProvider.GetRequiredService(); + context.Database.EnsureCreated(); + } + + [Test] + public void CanUseShadowPropertyWhenUpdatingEntry() + { + Assert.That(!context.Database.EnsureCreated()); + var ad = new Address { Street = "New street two", City = "Chicago" }; + var g = new Guest { Name = "Guest number two", Address = ad }; + context.Set().Add(g); + context.SaveChanges(); + + // update entry + var entry = context.Set().Where(t => t.Name!.Equals("Guest number two")).First(); + Assert.That(entry, Is.Not.Null); + + entry!.Name = "Guest number two updated"; + context.SaveChanges(); + + // check data using MySqlCommand + using (var cnn = new MySqlConnection(context.Database.GetDbConnection().ConnectionString)) + { + if (cnn.State != ConnectionState.Open) + cnn.Open(); + + var cmd = new MySqlCommand("Select UpdatedAt from Guests where IdGuest=" + entry.IdGuest, cnn); + var updatedAt = cmd.ExecuteScalar(); + Assert.That(updatedAt, Is.Not.Null); + Assert.That(((DateTime)updatedAt!).Date.CompareTo(DateTime.Now.Date) == 0); + } + } + + [Test] + public void CanUseShadowPropertyWhenAddingEntry() + { + Assert.That(!context.Database.EnsureCreated()); + var ad = new Address { Street = "New street", City = "Oregon" }; + var g = new Guest { Name = "Guest number one", Address = ad }; + context.Set().Add(g); + + context.SaveChanges(); + + // check data using MySqlCommand + using (var cnn = new MySqlConnection(context.Database.GetDbConnection().ConnectionString)) + { + if (cnn.State != ConnectionState.Open) + cnn.Open(); + + var cmd = new MySqlCommand("Select CreatedAt from Guests Limit 1", cnn); + var createdAt = cmd.ExecuteScalar(); + Assert.That(createdAt, Is.Not.Null); + Assert.That(((DateTime)createdAt!).Date.CompareTo(DateTime.Now.Date) == 0); + } + } + + public void Dispose() + { + context.Database.EnsureDeleted(); + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Basic.Tests/UpdateTests.cs b/EFCore/tests/MySql.EFCore.Basic.Tests/UpdateTests.cs new file mode 100644 index 000000000..0a95d864b --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Basic.Tests/UpdateTests.cs @@ -0,0 +1,87 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using MySql.EntityFrameworkCore.Basic.Tests.Utils; +using NUnit.Framework; +using System; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.EntityFrameworkCore.Basic.Tests +{ + +#region Bug113443 + + [Table("Bug113443Table")] + public record Bug113443Record + { + [Key] + [Column("id")] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; init; } + [Column("name")] + public string? Name { get; set;} + + [Column("time_created", TypeName = "TIMESTAMP(6)")] + [DatabaseGenerated(DatabaseGeneratedOption.Computed)] + public DateTime TimeCreated { get; init; } + + [Column("time_updated", TypeName = "TIMESTAMP(6)")] + [DatabaseGenerated(DatabaseGeneratedOption.Computed)] + public DateTime TimeUpdated { get; init; } + } + + public class Bug113443Context : MyTestContext + { + public DbSet Bug113443 { get; set; } + } + +#endregion + + public class UpdateTests + { + [Test] + public void Bug113443() { + using var ctx = new Bug113443Context(); + ctx.Database.EnsureCreated(); + try + { + Bug113443Record data = new() { Name = "Sample1"}; + ctx.Bug113443.Add(data); + ctx.SaveChanges(); + data.Name = "Changed!"; + ctx.SaveChanges(); + } + finally + { + ctx.Database.EnsureDeleted(); + } + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Basic.Tests/Utils/EntityTestsFixtureClass.cs b/EFCore/tests/MySql.EFCore.Basic.Tests/Utils/EntityTestsFixtureClass.cs new file mode 100644 index 000000000..2903470fa --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Basic.Tests/Utils/EntityTestsFixtureClass.cs @@ -0,0 +1,159 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.Extensions.DependencyInjection; +using MySql.Data.MySqlClient; +using MySql.EntityFrameworkCore.Basic.Tests.DbContextClasses; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Diagnostics; +using System.Text; + +namespace MySql.EntityFrameworkCore.Basic.Tests.Utils +{ + public class EntityTestsFixtureClass : IDisposable + { + // A trace listener to use during testing. + private AssertFailTraceListener asertFailListener = new AssertFailTraceListener(); + private readonly IServiceProvider _serviceProvider; + + + public EntityTestsFixtureClass() + { + //TODO check if we still need this listener + // Replace existing listeners with listener for testing. + Trace.Listeners.Clear(); + Trace.Listeners.Add(this.asertFailListener); + + var serviceCollection = new ServiceCollection(); + + serviceCollection.AddDbContext(); + + _serviceProvider = serviceCollection.BuildServiceProvider(); + + } + + //public void CreateContext(MySQLTestStore testStore) + //{ + // var optionsBuilder = new DbContextOptionsBuilder(); + // optionsBuilder.UseMySQL(MySQLTestStore.CreateConnectionString(_databaseName)); + + // using (var context = new TestsContext(optionsBuilder.Options)) + // { + // context.Database.EnsureDeleted(); + // context.Database.EnsureCreated(); + // } + //} + + public void Dispose() + { + // ensure database deletion + using (var cnn = new MySqlConnection(MySQLTestStore.BaseConnectionString)) + { + cnn.Open(); + var cmd = new MySqlCommand("DROP DATABASE IF EXISTS test", cnn); + cmd.ExecuteNonQuery(); + } + } + + + protected internal void CheckSql(string sql, string refSql) + { + StringBuilder str1 = new StringBuilder(); + StringBuilder str2 = new StringBuilder(); + foreach (char c in sql) + if (!Char.IsWhiteSpace(c)) + str1.Append(c); + foreach (char c in refSql) + if (!Char.IsWhiteSpace(c)) + str2.Append(c); + Assert.That(String.Compare(str1.ToString(), str2.ToString(), true), Is.EqualTo(0)); + } + + + private class AssertFailTraceListener : DefaultTraceListener + { + public override void Fail(string? message) + { + //Assert.Fail("Assertion failure: " + message); + } + + public override void Fail(string? message, string? detailMessage) + { + //Assert.Fail("Assertion failure: " + detailMessage); + } + } + } + + public class SakilaLiteFixture : IDisposable + { + public SakilaLiteFixture() + { + using (SakilaLiteContext context = new SakilaLiteContext()) + { + context.InitContext(); + } + } + + private void DeleteDatabase() where TDbContext : MyTestContext, new() + { + using (TDbContext context = new TDbContext()) + { + context.Database.EnsureDeleted(); + } + } + + #region IDisposable Support + private bool disposedValue = false; // To detect redundant calls + + protected virtual void Dispose(bool disposing) + { + if (!disposedValue) + { + if (disposing) + { + DeleteDatabase(); + DeleteDatabase(); + DeleteDatabase(); + } + + disposedValue = true; + } + } + + // This code added to correctly implement the disposable pattern. + public void Dispose() + { + // Do not change this code. Put cleanup code in Dispose(bool disposing) above. + Dispose(true); + } + #endregion + + } +} diff --git a/EFCore/tests/MySql.EFCore.Basic.Tests/Utils/MySqlTestStore.cs b/EFCore/tests/MySql.EFCore.Basic.Tests/Utils/MySqlTestStore.cs new file mode 100644 index 000000000..59b4bf5a7 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Basic.Tests/Utils/MySqlTestStore.cs @@ -0,0 +1,301 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.TestUtilities; +using Microsoft.Extensions.DependencyInjection; +using MySql.Data.MySqlClient; +using MySql.EntityFrameworkCore.Extensions; +using MySql.EntityFrameworkCore.Infrastructure.Internal; +using System; +using System.Data; +using System.Data.Common; + +namespace MySql.EntityFrameworkCore.Basic.Tests.Utils +{ + public class MyTestContext : DbContext + { + public MyTestContext() + { + } + + public MyTestContext(DbContextOptions options) : base(options) + { + } + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + // get the class name of the caller to get a unique name for the database + if (!optionsBuilder.IsConfigured + || optionsBuilder.Options.FindExtension() == null) + { + optionsBuilder.UseMySQL(MySQLTestStore.GetContextConnectionString(this.GetType())); + } + } + } + + public class MySQLTestStore : RelationalTestStore + { + public static bool SslMode { get; set; } + private static string SslString + { + get { return SslMode ? "sslmode=Required;" : string.Empty; } + } + + public static string BaseConnectionString + { + get { return $"server=localhost;user id=root;password=;port={Port()};{SslString}pooling=false;defaultcommandtimeout=50;"; } + } + + public static string RootConnectionString + { + get { return $"server=localhost;user id=root;password=;port={Port()};{SslString}pooling=false;defaultcommandtimeout=50;"; } + } + + internal static string GetContextConnectionString() + where T : DbContext + { + return GetContextConnectionString(typeof(T)); + } + + internal static string GetContextConnectionString(Type type) + { + string name = $"db-{type.Name.ToLowerInvariant()}"; + return MySQLTestStore.RootConnectionString + $";database={name};"; + } + + internal static string GetContextConnectionStringWithName(string name) + { + return MySQLTestStore.RootConnectionString + $";database={name};"; + } + + public static string Port() + { + var port = Environment.GetEnvironmentVariable("MYSQL_PORT"); + return port ?? "3306"; + } + + public static void CreateDatabase(string databaseName, bool deleteifExists = false, string? script = null) + { + if (script != null) + { + if (deleteifExists) + script = "Drop database if exists [database0];" + script; + + script = script.Replace("[database0]", databaseName); + //execute + using (var cnn = new MySqlConnection(RootConnectionString)) + { + cnn.Open(); + MySqlScript s = new MySqlScript(cnn, script); + s.Execute(); + } + } + else + { + using (var cnn = new MySqlConnection(RootConnectionString)) + { + cnn.Open(); + var cmd = new MySqlCommand(string.Format("Drop database {0}; Create Database {0};", databaseName), cnn); + cmd.ExecuteNonQuery(); + } + } + } + + public static void Execute(string sql) + { + using (var cnn = new MySqlConnection(RootConnectionString)) + { + cnn.Open(); + var cmd = new MySqlCommand(sql, cnn); + cmd.ExecuteNonQuery(); + } + } + + public static void ExecuteScript(string sql) + { + using (var cnn = new MySqlConnection(RootConnectionString)) + { + cnn.Open(); + var scr = new MySqlScript(cnn, sql); + scr.Execute(); + } + } + + public int ExecuteNonQuery(string sql, params object[] parameters) + { + using (var cnn = new MySqlConnection(RootConnectionString)) + { + cnn.Open(); + var scr = new MySqlScript(cnn, sql); + ExecuteNonQuery(cnn, sql, parameters); + return scr.Execute(); + } + } + + private static int ExecuteNonQuery(MySqlConnection connection, string sql, object[]? parameters = null) + => Execute(connection, command => command.ExecuteNonQuery(), sql, false, parameters); + + private static T Execute( + MySqlConnection connection, Func execute, string sql, + bool useTransaction = false, object[]? parameters = null) + => ExecuteCommand(connection, execute, sql, useTransaction, parameters!); + + private static T ExecuteCommand( + MySqlConnection connection, Func execute, string sql, bool useTransaction, object[] parameters) + { + if (connection.State != ConnectionState.Open) + { + connection.Close(); + } + + connection.Open(); + + try + { + using (var transaction = useTransaction + ? connection.BeginTransaction() + : null) + { + T result; + var command = (MySqlCommand)connection.CreateCommand(); + command.CommandText = sql; + + command.Transaction = transaction; + result = execute(command); + + transaction?.Commit(); + + return result; + } + } + finally + { + if (connection.State != ConnectionState.Closed) + { + connection.Close(); + } + } + } + + + public static string CreateConnectionString(string databasename) + { + MySqlConnectionStringBuilder csb = new MySqlConnectionStringBuilder(); + csb.Database = databasename; + csb.Port = Convert.ToUInt32(Port()); + csb.UserID = "root"; + csb.Password = ""; + csb.Server = "localhost"; + csb.Pooling = false; + csb.SslMode = MySqlSslMode.Disabled; + + return csb.ConnectionString; + } + + public static void DeleteDatabase(string name) + { + using (var cnn = new MySqlConnection(RootConnectionString)) + { + cnn.Open(); + var cmd = new MySqlCommand(string.Format("DROP DATABASE IF EXISTS {0}", name), cnn); + cmd.ExecuteNonQuery(); + } + } + + public override DbContextOptionsBuilder AddProviderOptions(DbContextOptionsBuilder builder) + => builder.UseMySQL(GetContextConnectionString()); + +#if NET9_0_OR_GREATER + public virtual void Clean(DbContext context) + => context.Database.EnsureDeleted(); +#else + public override void Clean(DbContext context) + => context.Database.EnsureDeleted(); +#endif + + + +#if NET9_0_OR_GREATER + private MySQLTestStore(string name, DbConnection connection) + : base(name, true, connection) + { + SslMode = true; + connection = new MySqlConnection(RootConnectionString); + } + public static MySQLTestStore Create(string name, DbConnection connection) + => new MySQLTestStore(name, connection); + + public static MySQLTestStore GetOrCreate(string name, DbConnection connection) + => new MySQLTestStore(name, connection); +#else + private MySQLTestStore(string name) + : base(name, true) + { + SslMode = true; + Connection = new MySqlConnection(RootConnectionString); + } + + public static MySQLTestStore Create(string name) + => new MySQLTestStore(name); + + public static MySQLTestStore GetOrCreate(string name) + => new MySQLTestStore(name); +#endif + } + + public class MySQLTestStoreFactory : RelationalTestStoreFactory + { + public static MySQLTestStoreFactory Instance { get; } = new MySQLTestStoreFactory(); + + protected MySQLTestStoreFactory() + { + } + +#if NET9_0_OR_GREATER + public override TestStore Create(string storeName) + => MySQLTestStore.Create(storeName, new MySqlConnection(MySQLTestStore.RootConnectionString)); + + public override TestStore GetOrCreate(string storeName) + => MySQLTestStore.GetOrCreate(storeName, new MySqlConnection(MySQLTestStore.RootConnectionString)); +#else + public override TestStore Create(string storeName) + => MySQLTestStore.Create(storeName); + + public override TestStore GetOrCreate(string storeName) + => MySQLTestStore.GetOrCreate(storeName); +#endif + + + + + public override IServiceCollection AddProviderServices(IServiceCollection serviceCollection) + => serviceCollection.AddEntityFrameworkMySQL(); + + } +} diff --git a/EFCore/tests/MySql.EFCore.Basic.Tests/Utils/TestUtils.cs b/EFCore/tests/MySql.EFCore.Basic.Tests/Utils/TestUtils.cs new file mode 100644 index 000000000..7b9b59314 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Basic.Tests/Utils/TestUtils.cs @@ -0,0 +1,66 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using MySql.Data.MySqlClient; +using System; + +namespace MySql.EntityFrameworkCore.Basic.Tests.Utils +{ + public class TestUtils + { + private static Version? _version = null; + + public static Version Version + { + get + { + if (_version == null) + { + MySQLTestStore.SslMode = false; + using (MySqlConnection conn = new MySqlConnection(MySQLTestStore.BaseConnectionString)) + { + conn.Open(); + _version = new Version(conn.driver.Version.Major + , conn.driver.Version.Minor + , conn.driver.Version.Build); + } + } + return _version; + } + } + public static bool IsAtLeast(int major, int minor, int build) + { + if (DBVersion.Parse(Version.ToString()).isAtLeast(major, minor, build)) + { + return true; + } + return false; + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Design.Tests/Extensions.cs b/EFCore/tests/MySql.EFCore.Design.Tests/Extensions.cs new file mode 100644 index 000000000..1543ee7ab --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Design.Tests/Extensions.cs @@ -0,0 +1,102 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Scaffolding.Metadata; +using System.Collections.Generic; +using System.Linq; + +namespace MySql.EntityFrameworkCore.Design.Tests +{ + internal static class Extensions + { + public static string GetSchema(this DatabaseTable table) + { + return table.Schema!; + } + + public static string GetDataType(this DatabaseColumn column) + { + return column.StoreType!; + } + + public static int? GetPrimaryKeyOrdinal(this DatabaseColumn column, int? ordinal) + { + return ordinal; + } + + public static int? GetOrdinal(this DatabaseColumn column, int ordinal) + { + return ordinal; + } + + public static int? GetMaxLength(this DatabaseColumn column, int? maxlength) + { + return maxlength; + } + + public static int? GetPrecision(this DatabaseColumn column, int? precision) + { + return precision; + } + + public static int? GetScale(this DatabaseColumn column, int? scale) + { + return scale; + } + + public static string GetDefaultValue(this DatabaseColumn column) + { + return column.DefaultValueSql!; + } + + public static DatabaseColumn GetColumn(this DatabaseForeignKey fk) + { + return fk.Columns.Single(); + } + + public static DatabaseColumn GetPrincipalColumn(this DatabaseForeignKey fk) + { + return fk.PrincipalColumns.Single(); + } + + public static DatabaseColumn GetColumn(this DatabaseIndex index) + { + return index.Columns.Single(); + } + + public static IList GetColumns(this DatabaseIndex index) + { + return index.Columns; + } + + public static DatabaseColumn GetColumn(this DatabaseColumn column) + { + return column; + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Design.Tests/MySQLAnnotationCodeGeneratorTest.cs b/EFCore/tests/MySql.EFCore.Design.Tests/MySQLAnnotationCodeGeneratorTest.cs new file mode 100644 index 000000000..7f0ed3e2a --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Design.Tests/MySQLAnnotationCodeGeneratorTest.cs @@ -0,0 +1,72 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; +using Microsoft.EntityFrameworkCore.Storage; +using Microsoft.EntityFrameworkCore.TestUtilities; +using MySql.EntityFrameworkCore.Design.Internal; +using MySql.EntityFrameworkCore.Internal; +using MySql.EntityFrameworkCore.Metadata.Conventions; +using MySql.EntityFrameworkCore.Metadata.Internal; +using MySql.EntityFrameworkCore.Storage.Internal; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System.Linq; + +namespace MySql.EntityFrameworkCore.Design.Tests +{ + public class MySQLAnnotationCodeGeneratorTest + { + [TestCase(MySQLAnnotationNames.Charset)] + [TestCase(MySQLAnnotationNames.Collation)] + public void GenerateFluentApiHasCharset(string mySQLAnnotation) + { + var typeMappingSource = new MySQLTypeMappingSource( + TestServiceFactory.Instance.Create(), + TestServiceFactory.Instance.Create(), + TestServiceFactory.Instance.Create()); + + var generator = new MySQLAnnotationCodeGenerator(new AnnotationCodeGeneratorDependencies(typeMappingSource)); + var modelBuilder = new ModelBuilder(MySQLConventionSetBuilder.Build()); + modelBuilder.Entity( + "Post", + x => + { + x.Property("Id").HasAnnotation(mySQLAnnotation, "utf8mb4"); + }); + + var key = modelBuilder.Model.FindEntityType("Post")?.GetProperties().Single(); + var annotation = key?.FindAnnotation(mySQLAnnotation); + var result = MySQLAnnotationCodeGenerator.GenFluentApi((Microsoft.EntityFrameworkCore.Metadata.IProperty)key!, annotation!); + + Assert.That(result?.Method, Is.EqualTo(mySQLAnnotation == MySQLAnnotationNames.Charset ? "ForMySQLHasCharset" : "ForMySQLHasCollation")); + Assert.That(result?.Arguments.Count, Is.EqualTo(1)); + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Design.Tests/MySQLCodeGeneratorTest.cs b/EFCore/tests/MySql.EFCore.Design.Tests/MySQLCodeGeneratorTest.cs new file mode 100644 index 000000000..42f3804c9 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Design.Tests/MySQLCodeGeneratorTest.cs @@ -0,0 +1,83 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Design; +using Microsoft.EntityFrameworkCore.Scaffolding; +using MySql.EntityFrameworkCore.Infrastructure; +using MySql.EntityFrameworkCore.Scaffolding.Internal; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Linq; +using System.Reflection; + +namespace MySql.EntityFrameworkCore.Design.Tests +{ + public class MySQLCodeGeneratorTest + { + [Test] + public virtual void UseProviderMethodIsGeneratedCorrectly() + { + var codeGenerator = new MySQLCodeGenerator( + new ProviderCodeGeneratorDependencies( + Enumerable.Empty())); + + var result = codeGenerator.GenerateUseProvider("Data Source=Test", providerOptions: null); + + Assert.That(result.Method, Is.EqualTo("UseMySQL")); + Assert.That(result.Arguments, Has.Exactly(1).EqualTo("Data Source=Test")); + Assert.That(result.ChainedCall, Is.Null); + } + + [Test] + public virtual void UseProviderMethodIsGeneratedCorrectlyWithOptions() + { + var codeGenerator = new MySQLCodeGenerator( + new ProviderCodeGeneratorDependencies( + Enumerable.Empty())); + + var providerOptions = new MethodCallCodeFragment(UseMySqlServerMethodInfo); + + var result = codeGenerator.GenerateUseProvider("Data Source=Test", providerOptions); + + Assert.That(result.Method, Is.EqualTo("UseMySQL")); + Assert.That(result.Arguments, Has.Exactly(1).EqualTo("Data Source=Test")); + Assert.That(result.Arguments[1], Is.InstanceOf()); + NestedClosureCodeFragment nestedClosure = (NestedClosureCodeFragment)result.Arguments[1]!; + Assert.That(nestedClosure?.Parameter, Is.EqualTo("x")); + Assert.That(nestedClosure?.MethodCalls[0], Is.SameAs(providerOptions)); + Assert.That(result.ChainedCall, Is.Null); + } + + private static readonly MethodInfo UseMySqlServerMethodInfo + = typeof(MySQLDbContextOptionsExtensions).GetRuntimeMethod( + nameof(MySQLDbContextOptionsExtensions.UseMySQL), + new[] { typeof(DbContextOptionsBuilder), typeof(string), typeof(Action) })!; + } +} diff --git a/EFCore/tests/MySql.EFCore.Design.Tests/MySQLDatabaseModelFactoryTest.cs b/EFCore/tests/MySql.EFCore.Design.Tests/MySQLDatabaseModelFactoryTest.cs new file mode 100644 index 000000000..beb0ab423 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Design.Tests/MySQLDatabaseModelFactoryTest.cs @@ -0,0 +1,348 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics.Internal; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Scaffolding; +using Microsoft.EntityFrameworkCore.Scaffolding.Metadata; +using MySql.EntityFrameworkCore.Basic.Tests.Utils; +using MySql.EntityFrameworkCore.Diagnostics.Internal; +using MySql.EntityFrameworkCore.Scaffolding.Internal; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Reflection; + + +namespace MySql.EntityFrameworkCore.Design.Tests +{ + public class MySQLDatabaseModelFactoryTest : MySQLDatabaseModelFixture + { + private MySQLDatabaseModelFixture? _fixture; + + [SetUp] + public void Init() + { + this._fixture = new MySQLDatabaseModelFixture(); + } + + [OneTimeTearDown] + public void OneTimeTearDown() + { + MySQLTestStore.DeleteDatabase("blogman"); + MySQLTestStore.DeleteDatabase("sakiladb"); + MySQLTestStore.DeleteDatabase("sakilaindex"); + MySQLTestStore.DeleteDatabase("testview"); + MySQLTestStore.DeleteDatabase("world"); + } + + + [Test] + public void CanReadTables() + { + var sql = @" + DROP DATABASE IF EXISTS blogman; + CREATE DATABASE blogman; + USE blogman; + CREATE TABLE blogs (id int); + CREATE TABLE posts (id int);"; + var dbModel = _fixture!.CreateModel("blogman", sql, new List { "blogs", "posts" }, new List()); + + Assert.That(dbModel.Tables.Select(c => c.Name), Has.Exactly(1).Matches(table => table.Contains("blogs"))); + Assert.That(dbModel.Tables.Select(c => c.Name), Has.Exactly(1).Matches(table => table.Contains("posts"))); + } + + [Test] + public void CanReadColumns() + { + var sql = @" + DROP DATABASE IF EXISTS blogman; + CREATE DATABASE blogman; + USE blogman; + CREATE TABLE blogs ( + id int, + description varchar(100) NOT NULL, + rate decimal(5,2) DEFAULT 0.0, + created timestamp DEFAULT now(), + PRIMARY KEY (description, id) + );"; + var dbModel = _fixture!.CreateModel("blogman", sql, new List { "blogs" }, new List()); + + var columns = dbModel.Tables.Single().Columns; + + Assert.Multiple(() => + { + Assert.That(dbModel.DatabaseName, Is.EqualTo("blogman")); + Assert.That(dbModel.Tables.Select(c => c.Name), Has.Exactly(1).Matches(table => table.Contains("blogs"))); + }); + + string smallintWidth = TestUtils.Version >= new Version("8.0.0") ? string.Empty : "(11)"; + + Assert.That(columns.Where(n => n.Name == "id").Select(a => a.Name), Has.Exactly(1).Matches(name => name.Contains("id"))); + Assert.That(columns.Where(n => n.Name == "id").Select(a => a.GetDataType()), Has.One.Items.EqualTo("int" + smallintWidth)); + Assert.That(columns.Where(n => n.Name == "id").Select(a => a.GetPrimaryKeyOrdinal(2)), Has.One.Items.EqualTo(2)); + Assert.That(!columns.Where(n => n.Name == "id").Select(a => a.IsNullable).FirstOrDefault()); + Assert.That(columns.Where(n => n.Name == "id").Select(a => a.GetOrdinal(0)), Has.One.Items.EqualTo(0)); + Assert.That(columns.Where(n => n.Name == "id").Select(a => a.GetDefaultValue()).FirstOrDefault(), Is.Null); + + Assert.That(columns.Where(n => n.Name == "description").Select(a => a.Name), Has.Exactly(1).Matches(name => name.Contains("description"))); + Assert.That(columns.Where(n => n.Name == "description").Select(a => a.GetDataType()), Has.One.Items.EqualTo("varchar(100)")); + Assert.That(columns.Where(n => n.Name == "description").Select(a => a.GetPrimaryKeyOrdinal(1)), Has.One.Items.EqualTo(1)); + Assert.That(!columns.Where(n => n.Name == "description").Select(a => a.IsNullable).FirstOrDefault()); + Assert.That(columns.Where(n => n.Name == "description").Select(a => a.GetOrdinal(1)), Has.One.Items.EqualTo(1)); + Assert.That(columns.Where(n => n.Name == "description").Select(a => a.GetDefaultValue()).FirstOrDefault(), Is.Null); + Assert.That(columns.Where(n => n.Name == "description").Select(a => a.GetMaxLength(100)), Has.One.Items.EqualTo(100)); + + Assert.That(columns.Where(n => n.Name == "rate").Select(a => a.Name), Has.Exactly(1).Matches(name => name.Contains("rate"))); + Assert.That(columns.Where(n => n.Name == "rate").Select(a => a.GetDataType()), Has.One.Items.EqualTo("decimal(5,2)")); + Assert.That(columns.Where(n => n.Name == "rate").Select(a => a.GetPrimaryKeyOrdinal(null)).FirstOrDefault(), Is.Null); + Assert.That(columns.Where(n => n.Name == "rate").Select(a => a.IsNullable).FirstOrDefault()); + Assert.That(columns.Where(n => n.Name == "rate").Select(a => a.GetOrdinal(2)), Has.One.Items.EqualTo(2)); + Assert.That("'0.00'", Is.EqualTo(columns.Where(n => n.Name == "rate").Select(a => a.GetDefaultValue()).FirstOrDefault()).IgnoreCase); + Assert.That(columns.Where(n => n.Name == "rate").Select(a => a.GetPrecision(5)), Has.One.Items.EqualTo(5)); + Assert.That(columns.Where(n => n.Name == "rate").Select(a => a.GetScale(2)), Has.One.Items.EqualTo(2)); + Assert.That(columns.Where(n => n.Name == "rate").Select(a => a.GetMaxLength(null)).FirstOrDefault(), Is.Null); + + Assert.That(columns.Where(n => n.Name == "created").Select(a => a.Name), Has.Exactly(1).Matches(name => name.Contains("created"))); + Assert.That(columns.Where(n => n.Name == "created").Select(a => a.GetDefaultValue()), Has.One.Items.EqualTo("CURRENT_TIMESTAMP")); + } + + + [Test] + public void CanReadFKs() + { + var sql = @" + DROP DATABASE IF EXISTS sakiladb; + CREATE DATABASE sakiladb; + USE sakiladb; + CREATE TABLE country ( + country_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, + country VARCHAR(50) NOT NULL, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (country_id) + ); + CREATE TABLE city ( + city_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, + city VARCHAR(50) NOT NULL, + country_id SMALLINT UNSIGNED NOT NULL, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (city_id), + KEY idx_fk_country_id (country_id), + CONSTRAINT `fk_city_country` FOREIGN KEY (country_id) REFERENCES country (country_id) ON DELETE RESTRICT ON UPDATE CASCADE + );"; + var dbModel = _fixture!.CreateModel("sakiladb", sql, new List { "city", "country" }, new List()); + + var fk = (dbModel.Tables.Single(t => t.ForeignKeys.Count > 0).ForeignKeys); + Assert.That(fk, Is.Not.Null); + Assert.That(fk[0].Table.Database!.DatabaseName, Is.EqualTo("sakiladb")); + Assert.That(fk[0].Table.Name, Is.EqualTo("city")); + Assert.That(fk[0].PrincipalTable.Database!.DatabaseName, Is.EqualTo("sakiladb")); + Assert.That(fk[0].PrincipalTable.Name, Is.EqualTo("country")); + Assert.That(fk[0].GetColumn().Name, Is.EqualTo("country_id")); + Assert.That(fk[0].GetPrincipalColumn().Name, Is.EqualTo("country_id")); + Assert.That(fk[0].OnDelete, Is.EqualTo(ReferentialAction.Restrict)); + } + + [Test] + public void CanReadIndexes() + { + var sql = @" + DROP DATABASE IF EXISTS sakilaIndex; + CREATE DATABASE sakilaIndex; + use sakilaIndex; + CREATE TABLE actor( + actor_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, + first_name VARCHAR(45) NOT NULL, + last_name VARCHAR(45) NOT NULL UNIQUE, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY(actor_id), + KEY idx_actor_first_last_name(first_name, last_name))"; + + var dbModel = _fixture!.CreateModel("sakilaIndex", sql, new List { "actor" }, new List()); + + var indexes = dbModel.Tables.Single().Indexes; + + Assert.Multiple(() => + { + var c = indexes[0]; + Assert.That(c.Table!.Database!.DatabaseName, Is.EqualTo("sakilaIndex")); + Assert.That(c.Table.Name, Is.EqualTo("actor")); + }); + + Assert.Multiple(() => + { + var composite = indexes[0]; + Assert.That(composite.Name, Is.EqualTo("idx_actor_first_last_name")); + Assert.That(!composite.IsUnique); + Assert.That(composite.GetColumns().Select(c => c.GetColumn().Name).ToList(), Is.EqualTo(new List { "first_name", "last_name" })); + }); + + Assert.Multiple(() => + { + var onecolumn = indexes[1]; + Assert.That(onecolumn.GetColumn().Name, Is.EqualTo("last_name")); + Assert.That(onecolumn.IsUnique); + } + ); + } + + + [Test] + public void CanCreateModelForWorldDB() + { + Assembly executingAssembly = typeof(MySQLDatabaseModelFixture).GetTypeInfo().Assembly; + Stream stream = executingAssembly.GetManifestResourceStream("MySql.EntityFrameworkCore.Design.Tests.Properties.world.sql")!; + StreamReader sr = new StreamReader(stream); + string sql = sr.ReadToEnd(); + sr.Dispose(); + + var dbModel = _fixture!.CreateModel("world", sql, new List { "city", "country", "countrylanguage" }, new List(), true); + var tables = dbModel.Tables.OrderBy(t => t.Name); + + Assert.That(tables.Select(a => a.Name), Has.One.Items.EqualTo("city")); + Assert.That(tables.Select(a => a.Name), Has.One.Items.EqualTo("country")); + Assert.That(tables.Select(a => a.Name), Has.One.Items.EqualTo("countrylanguage")); + } + private void Test(string createSql, IEnumerable tables, IEnumerable schemas, Action asserter, string cleanupSql) + { + _fixture!.TestStore.ExecuteNonQuery(createSql); + + try + { + var databaseModelFactory = new MySQLDatabaseModelFactory( + new DiagnosticsLogger( + _fixture.ListLoggerFactory, + new LoggingOptions(), + new DiagnosticListener("Fake"), + new MySQLLoggingDefinitions(), + new NullDbContextLogger()), + _fixture.options); + + var databaseModel = databaseModelFactory.Create(_fixture.TestStore.ConnectionString, + new DatabaseModelFactoryOptions(tables, schemas)); + Assert.That(databaseModel, Is.Not.Null); + asserter(databaseModel); + } + finally + { + if (!string.IsNullOrEmpty(cleanupSql)) + { + _fixture.TestStore.ExecuteNonQuery(cleanupSql); + } + } + } + + [Test] + public void CanCreateModelForSakila() + { + Assume.That(TestUtils.IsAtLeast(5, 6, 0)); + + Assembly executingAssembly = typeof(MySQLDatabaseModelFixture).GetTypeInfo().Assembly; + Stream stream = executingAssembly.GetManifestResourceStream("MySql.EntityFrameworkCore.Design.Tests.Properties.sakiladb-schema.sql")!; + StreamReader sr = new StreamReader(stream); + string sql = sr.ReadToEnd(); + sr.Dispose(); + + var dbModel = _fixture!.CreateModel("sakiladb", sql, new List { "actor", "address", "category", + "city", "country", "customer", + "film", "film_actor", "film_category", "film_text", + "inventory", "language", "payment", "rental", "staff", "store"}, new List(), true); + var tables = dbModel.Tables.OrderBy(t => t.Name); + + Assert.That(tables.Select(a => a.Name), Has.One.Items.EqualTo("actor")); + Assert.That(tables.Select(a => a.Name), Has.One.Items.EqualTo("address")); + Assert.That(tables.Select(a => a.Name), Has.One.Items.EqualTo("category")); + Assert.That(tables.Select(a => a.Name), Has.One.Items.EqualTo("city")); + Assert.That(tables.Select(a => a.Name), Has.One.Items.EqualTo("country")); + Assert.That(tables.Select(a => a.Name), Has.One.Items.EqualTo("customer")); + Assert.That(tables.Select(a => a.Name), Has.One.Items.EqualTo("film")); + Assert.That(tables.Select(a => a.Name), Has.One.Items.EqualTo("film_actor")); + Assert.That(tables.Select(a => a.Name), Has.One.Items.EqualTo("film_category")); + Assert.That(tables.Select(a => a.Name), Has.One.Items.EqualTo("film_text")); + Assert.That(tables.Select(a => a.Name), Has.One.Items.EqualTo("inventory")); + Assert.That(tables.Select(a => a.Name), Has.One.Items.EqualTo("language")); + Assert.That(tables.Select(a => a.Name), Has.One.Items.EqualTo("payment")); + Assert.That(tables.Select(a => a.Name), Has.One.Items.EqualTo("rental")); + Assert.That(tables.Select(a => a.Name), Has.One.Items.EqualTo("staff")); + Assert.That(tables.Select(a => a.Name), Has.One.Items.EqualTo("store")); + } + + + + /// + /// No support for views added in EF Core + /// issue for follow up https://github.com/aspnet/EntityFramework/issues/827 + /// views should be ignored + /// + + [Test] + public void CanCreateModelOfDBWithViews() + { + var sql = @"DROP DATABASE IF EXISTS testview; + create database testview character set utf8mb4; + use testview; + create table t1(a serial, b int); + create table t2 like t1; + create view x1 as select t1.a as a, t1.b as b1, t2.b as b2 from t1 + join t2 using (a) ; + create view y1 as select t1.a as a, t1.b as b1, t2.b as b2 from t1 + join t2 using (a) ; + create view z1 as select t1.a as a, t1.b as b1, t2.b as b2 from t1 + join t2 using (a) ; + create view b1 as select x1.a as a, x1.b1 as b1, y1.b1 as b2 from x1 + join y1 using (a) ;"; + + var dbModel = _fixture!.CreateModel("testview", sql, new List { "t1", "t2" }, new List()); + var tables = dbModel.Tables.OrderBy(t => t.Name); + + Assert.That(tables.Select(a => a.Name), Has.One.Items.EqualTo("t1")); + Assert.That(tables.Select(a => a.Name), Has.One.Items.EqualTo("t2")); + } + + [Test] + public void CanFiltersViews() + { + var sql = @"DROP DATABASE IF EXISTS testview; + create database testview character set utf8mb4; + use testview; + create table t1(a serial, b int); + create view x1 as select t1.a as a, t1.b as b1 from t1; + "; + + var selectionSet = new List { "t1", "x1" }; + + var dbModel = _fixture!.CreateModel("testview", sql, selectionSet, new List()); + Assert.That(dbModel.Tables.Count == 2); + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Design.Tests/MySQLDatabaseModelFixture.cs b/EFCore/tests/MySql.EFCore.Design.Tests/MySQLDatabaseModelFixture.cs new file mode 100644 index 000000000..fc586e967 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Design.Tests/MySQLDatabaseModelFixture.cs @@ -0,0 +1,78 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Diagnostics.Internal; +using Microsoft.EntityFrameworkCore.Scaffolding; +using Microsoft.EntityFrameworkCore.Scaffolding.Metadata; +using Microsoft.EntityFrameworkCore.TestUtilities; +using Microsoft.Extensions.Logging; +using MySql.EntityFrameworkCore.Basic.Tests.Utils; +using MySql.EntityFrameworkCore.Diagnostics.Internal; +using MySql.EntityFrameworkCore.Infrastructure.Internal; +using MySql.EntityFrameworkCore.Internal; +using MySql.EntityFrameworkCore.Scaffolding.Internal; +using System.Collections.Generic; +using System.Diagnostics; + +namespace MySql.EntityFrameworkCore.Design.Tests +{ + public class MySQLDatabaseModelFixture : SharedStoreFixtureBase + { + protected override string StoreName { get; } = nameof(MySQLDatabaseModelFactoryTest); + + protected override ITestStoreFactory TestStoreFactory => MySQLTestStoreFactory.Instance; + public new MySQLTestStore TestStore => (MySQLTestStore)base.TestStore; + + protected override bool ShouldLogCategory(string logCategory) + => logCategory == DbLoggerCategory.Scaffolding.Name; + + internal static DiagnosticsLogger? _logger; + internal IMySQLOptions options = new MySQLOptions(); + + public DatabaseModel CreateModel(string dbName, string sql, IEnumerable tables, IEnumerable schemas, bool executeScript = false) + { + if (executeScript) + MySQLTestStore.ExecuteScript(sql); + else + MySQLTestStore.Execute(sql); + ILoggerFactory loggerFactory = (ILoggerFactory)new LoggerFactory(); + + _logger = new DiagnosticsLogger( + loggerFactory, + new LoggingOptions(), + new DiagnosticListener("Fake"), + new MySQLLoggingDefinitions(), + new NullDbContextLogger(), null); + + return new MySQLDatabaseModelFactory(_logger, options). + Create(MySQLTestStore.RootConnectionString + ";database=" + dbName + ";", + new DatabaseModelFactoryOptions(tables, schemas)); + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Design.Tests/MySQLDesignTimeProviderServicesTest.cs b/EFCore/tests/MySql.EFCore.Design.Tests/MySQLDesignTimeProviderServicesTest.cs new file mode 100644 index 000000000..8c30712d7 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Design.Tests/MySQLDesignTimeProviderServicesTest.cs @@ -0,0 +1,59 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore.Design; +using MySql.EntityFrameworkCore.Design.Internal; +using MySql.EntityFrameworkCore.Storage.Internal; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Reflection; + +namespace MySql.EntityFrameworkCore.Design.Tests +{ + public class MySQLDesignTimeProviderServicesTest + { + private Assembly GetRuntimeAssembly() + => typeof(MySQLRelationalConnection).GetTypeInfo().Assembly; + + private Type GetDesignTimeServicesType() + => typeof(MySQLDesignTimeServices); + + [Test] + public void EnsureAssemblyIdentityMatches() + { + var runtimeAssembly = GetRuntimeAssembly(); + var dtAttribute = runtimeAssembly.GetCustomAttribute(); + var dtType = GetDesignTimeServicesType(); + + Assert.That(dtType, Is.Not.Null); + Assert.That(dtAttribute, Is.Not.Null); + Assert.That(dtAttribute?.TypeName, Is.EqualTo(dtType.FullName)); + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Design.Tests/MySql.EntityFrameworkCore.Design.Tests.csproj b/EFCore/tests/MySql.EFCore.Design.Tests/MySql.EntityFrameworkCore.Design.Tests.csproj new file mode 100644 index 000000000..632c8baa4 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Design.Tests/MySql.EntityFrameworkCore.Design.Tests.csproj @@ -0,0 +1,53 @@ + + + + MySql.EntityFrameworkCore.Design.Tests Class Library + net9.0;net8.0; + MySql.EntityFrameworkCore.Design.Tests + MySql.EntityFrameworkCore.Design.Tests + true + True + True + enable + ..\..\..\ConnectorNetPublicKey.snk + $(NoWarn);CS1591,EF1001 + + + + $(TargetFrameworks);net10.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/EFCore/tests/MySql.EFCore.Design.Tests/Properties/sakiladb-schema.sql b/EFCore/tests/MySql.EFCore.Design.Tests/Properties/sakiladb-schema.sql new file mode 100644 index 000000000..33a025602 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Design.Tests/Properties/sakiladb-schema.sql @@ -0,0 +1,667 @@ +/* +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +-- Sakila Sample Database Schema +-- Version 1.0 + +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'; + +DROP SCHEMA IF EXISTS sakiladb; +CREATE SCHEMA sakiladb; +USE sakiladb; + +-- +-- Table structure for table `actor` +-- + +CREATE TABLE actor ( + actor_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, + first_name VARCHAR(45) NOT NULL, + last_name VARCHAR(45) NOT NULL, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (actor_id), + KEY idx_actor_last_name (last_name) +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `address` +-- + +CREATE TABLE address ( + address_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, + address VARCHAR(50) NOT NULL, + address2 VARCHAR(50) DEFAULT NULL, + district VARCHAR(20) NOT NULL, + city_id SMALLINT UNSIGNED NOT NULL, + postal_code VARCHAR(10) DEFAULT NULL, + phone VARCHAR(20) NOT NULL, + /*!50705 location GEOMETRY NOT NULL,*/ + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (address_id), + KEY idx_fk_city_id (city_id), + /*!50705 SPATIAL KEY `idx_location` (location),*/ + CONSTRAINT `fk_address_city` FOREIGN KEY (city_id) REFERENCES city (city_id) ON DELETE RESTRICT ON UPDATE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `category` +-- + +CREATE TABLE category ( + category_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, + name VARCHAR(25) NOT NULL, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (category_id) +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `city` +-- + +CREATE TABLE city ( + city_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, + city VARCHAR(50) NOT NULL, + country_id SMALLINT UNSIGNED NOT NULL, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (city_id), + KEY idx_fk_country_id (country_id), + CONSTRAINT `fk_city_country` FOREIGN KEY (country_id) REFERENCES country (country_id) ON DELETE RESTRICT ON UPDATE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `country` +-- + +CREATE TABLE country ( + country_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, + country VARCHAR(50) NOT NULL, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (country_id) +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `customer` +-- + +CREATE TABLE customer ( + customer_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, + store_id TINYINT UNSIGNED NOT NULL, + first_name VARCHAR(45) NOT NULL, + last_name VARCHAR(45) NOT NULL, + email VARCHAR(50) DEFAULT NULL, + address_id SMALLINT UNSIGNED NOT NULL, + active BOOLEAN NOT NULL DEFAULT TRUE, + create_date DATETIME NOT NULL, + last_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (customer_id), + KEY idx_fk_store_id (store_id), + KEY idx_fk_address_id (address_id), + KEY idx_last_name (last_name), + CONSTRAINT fk_customer_address FOREIGN KEY (address_id) REFERENCES address (address_id) ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT fk_customer_store FOREIGN KEY (store_id) REFERENCES store (store_id) ON DELETE RESTRICT ON UPDATE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `film` +-- + +CREATE TABLE film ( + film_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, + title VARCHAR(255) NOT NULL, + description TEXT DEFAULT NULL, + release_year YEAR DEFAULT NULL, + language_id TINYINT UNSIGNED NOT NULL, + original_language_id TINYINT UNSIGNED DEFAULT NULL, + rental_duration TINYINT UNSIGNED NOT NULL DEFAULT 3, + rental_rate DECIMAL(4,2) NOT NULL DEFAULT 4.99, + length SMALLINT UNSIGNED DEFAULT NULL, + replacement_cost DECIMAL(5,2) NOT NULL DEFAULT 19.99, + rating ENUM('G','PG','PG-13','R','NC-17') DEFAULT 'G', + special_features SET('Trailers','Commentaries','Deleted Scenes','Behind the Scenes') DEFAULT NULL, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (film_id), + KEY idx_title (title), + KEY idx_fk_language_id (language_id), + KEY idx_fk_original_language_id (original_language_id), + CONSTRAINT fk_film_language FOREIGN KEY (language_id) REFERENCES language (language_id) ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT fk_film_language_original FOREIGN KEY (original_language_id) REFERENCES language (language_id) ON DELETE RESTRICT ON UPDATE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `film_actor` +-- + +CREATE TABLE film_actor ( + actor_id SMALLINT UNSIGNED NOT NULL, + film_id SMALLINT UNSIGNED NOT NULL, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (actor_id,film_id), + KEY idx_fk_film_id (`film_id`), + CONSTRAINT fk_film_actor_actor FOREIGN KEY (actor_id) REFERENCES actor (actor_id) ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT fk_film_actor_film FOREIGN KEY (film_id) REFERENCES film (film_id) ON DELETE RESTRICT ON UPDATE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `film_category` +-- + +CREATE TABLE film_category ( + film_id SMALLINT UNSIGNED NOT NULL, + category_id TINYINT UNSIGNED NOT NULL, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (film_id, category_id), + CONSTRAINT fk_film_category_film FOREIGN KEY (film_id) REFERENCES film (film_id) ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT fk_film_category_category FOREIGN KEY (category_id) REFERENCES category (category_id) ON DELETE RESTRICT ON UPDATE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `film_text` +-- +-- InnoDB added FULLTEXT support in 5.6.10. If you use an +-- earlier version, then consider upgrading (recommended) or +-- changing InnoDB to MyISAM as the film_text engine +-- + +CREATE TABLE film_text ( + film_id SMALLINT NOT NULL, + title VARCHAR(255) NOT NULL, + description TEXT, + PRIMARY KEY (film_id), + FULLTEXT KEY idx_title_description (title,description) +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Triggers for loading film_text from film +-- + +DELIMITER ;; +CREATE TRIGGER `ins_film` AFTER INSERT ON `film` FOR EACH ROW BEGIN + INSERT INTO film_text (film_id, title, description) + VALUES (new.film_id, new.title, new.description); + END;; + + +CREATE TRIGGER `upd_film` AFTER UPDATE ON `film` FOR EACH ROW BEGIN + IF (old.title != new.title) OR (old.description != new.description) OR (old.film_id != new.film_id) + THEN + UPDATE film_text + SET title=new.title, + description=new.description, + film_id=new.film_id + WHERE film_id=old.film_id; + END IF; + END;; + + +CREATE TRIGGER `del_film` AFTER DELETE ON `film` FOR EACH ROW BEGIN + DELETE FROM film_text WHERE film_id = old.film_id; + END;; + +DELIMITER ; + +-- +-- Table structure for table `inventory` +-- + +CREATE TABLE inventory ( + inventory_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT, + film_id SMALLINT UNSIGNED NOT NULL, + store_id TINYINT UNSIGNED NOT NULL, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (inventory_id), + KEY idx_fk_film_id (film_id), + KEY idx_store_id_film_id (store_id,film_id), + CONSTRAINT fk_inventory_store FOREIGN KEY (store_id) REFERENCES store (store_id) ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT fk_inventory_film FOREIGN KEY (film_id) REFERENCES film (film_id) ON DELETE RESTRICT ON UPDATE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `language` +-- + +CREATE TABLE language ( + language_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, + name CHAR(20) NOT NULL, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (language_id) +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `payment` +-- + +CREATE TABLE payment ( + payment_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, + customer_id SMALLINT UNSIGNED NOT NULL, + staff_id TINYINT UNSIGNED NOT NULL, + rental_id INT DEFAULT NULL, + amount DECIMAL(5,2) NOT NULL, + payment_date DATETIME NOT NULL, + last_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (payment_id), + KEY idx_fk_staff_id (staff_id), + KEY idx_fk_customer_id (customer_id), + CONSTRAINT fk_payment_rental FOREIGN KEY (rental_id) REFERENCES rental (rental_id) ON DELETE SET NULL ON UPDATE CASCADE, + CONSTRAINT fk_payment_customer FOREIGN KEY (customer_id) REFERENCES customer (customer_id) ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT fk_payment_staff FOREIGN KEY (staff_id) REFERENCES staff (staff_id) ON DELETE RESTRICT ON UPDATE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +-- +-- Table structure for table `rental` +-- + +CREATE TABLE rental ( + rental_id INT NOT NULL AUTO_INCREMENT, + rental_date DATETIME NOT NULL, + inventory_id MEDIUMINT UNSIGNED NOT NULL, + customer_id SMALLINT UNSIGNED NOT NULL, + return_date DATETIME DEFAULT NULL, + staff_id TINYINT UNSIGNED NOT NULL, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (rental_id), + UNIQUE KEY (rental_date,inventory_id,customer_id), + KEY idx_fk_inventory_id (inventory_id), + KEY idx_fk_customer_id (customer_id), + KEY idx_fk_staff_id (staff_id), + CONSTRAINT fk_rental_staff FOREIGN KEY (staff_id) REFERENCES staff (staff_id) ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT fk_rental_inventory FOREIGN KEY (inventory_id) REFERENCES inventory (inventory_id) ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT fk_rental_customer FOREIGN KEY (customer_id) REFERENCES customer (customer_id) ON DELETE RESTRICT ON UPDATE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `staff` +-- + +CREATE TABLE staff ( + staff_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, + first_name VARCHAR(45) NOT NULL, + last_name VARCHAR(45) NOT NULL, + address_id SMALLINT UNSIGNED NOT NULL, + picture BLOB DEFAULT NULL, + email VARCHAR(50) DEFAULT NULL, + store_id TINYINT UNSIGNED NOT NULL, + active BOOLEAN NOT NULL DEFAULT TRUE, + username VARCHAR(16) NOT NULL, + password VARCHAR(40) BINARY DEFAULT NULL, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (staff_id), + KEY idx_fk_store_id (store_id), + KEY idx_fk_address_id (address_id), + CONSTRAINT fk_staff_store FOREIGN KEY (store_id) REFERENCES store (store_id) ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT fk_staff_address FOREIGN KEY (address_id) REFERENCES address (address_id) ON DELETE RESTRICT ON UPDATE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `store` +-- + +CREATE TABLE store ( + store_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, + manager_staff_id TINYINT UNSIGNED NOT NULL, + address_id SMALLINT UNSIGNED NOT NULL, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (store_id), + UNIQUE KEY idx_unique_manager (manager_staff_id), + KEY idx_fk_address_id (address_id), + CONSTRAINT fk_store_staff FOREIGN KEY (manager_staff_id) REFERENCES staff (staff_id) ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT fk_store_address FOREIGN KEY (address_id) REFERENCES address (address_id) ON DELETE RESTRICT ON UPDATE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- View structure for view `customer_list` +-- + +CREATE VIEW customer_list +AS +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; + +-- +-- View structure for view `film_list` +-- + +CREATE VIEW film_list +AS +SELECT film.film_id AS FID, film.title AS title, film.description AS description, category.name AS category, film.rental_rate AS price, + film.length AS length, film.rating AS rating, GROUP_CONCAT(CONCAT(actor.first_name, _utf8' ', actor.last_name) SEPARATOR ', ') AS actors +FROM category LEFT JOIN film_category ON category.category_id = film_category.category_id LEFT JOIN film ON film_category.film_id = film.film_id + JOIN film_actor ON film.film_id = film_actor.film_id + JOIN actor ON film_actor.actor_id = actor.actor_id +GROUP BY film.film_id, category.name; + +-- +-- View structure for view `nicer_but_slower_film_list` +-- + +CREATE VIEW nicer_but_slower_film_list +AS +SELECT film.film_id AS FID, film.title AS title, film.description AS description, category.name AS category, film.rental_rate AS price, + film.length AS length, film.rating AS rating, GROUP_CONCAT(CONCAT(CONCAT(UCASE(SUBSTR(actor.first_name,1,1)), + LCASE(SUBSTR(actor.first_name,2,LENGTH(actor.first_name))),_utf8' ',CONCAT(UCASE(SUBSTR(actor.last_name,1,1)), + LCASE(SUBSTR(actor.last_name,2,LENGTH(actor.last_name)))))) SEPARATOR ', ') AS actors +FROM category LEFT JOIN film_category ON category.category_id = film_category.category_id LEFT JOIN film ON film_category.film_id = film.film_id + JOIN film_actor ON film.film_id = film_actor.film_id + JOIN actor ON film_actor.actor_id = actor.actor_id +GROUP BY film.film_id, category.name; + +-- +-- View structure for view `staff_list` +-- + +CREATE VIEW staff_list +AS +SELECT s.staff_id AS ID, CONCAT(s.first_name, _utf8' ', s.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, s.store_id AS SID +FROM staff AS s JOIN address AS a ON s.address_id = a.address_id JOIN city ON a.city_id = city.city_id + JOIN country ON city.country_id = country.country_id; + +-- +-- View structure for view `sales_by_store` +-- + +CREATE VIEW sales_by_store +AS +SELECT +CONCAT(c.city, _utf8',', cy.country) AS store +, CONCAT(m.first_name, _utf8' ', m.last_name) AS manager +, SUM(p.amount) AS total_sales +FROM payment AS p +INNER JOIN rental AS r ON p.rental_id = r.rental_id +INNER JOIN inventory AS i ON r.inventory_id = i.inventory_id +INNER JOIN store AS s ON i.store_id = s.store_id +INNER JOIN address AS a ON s.address_id = a.address_id +INNER JOIN city AS c ON a.city_id = c.city_id +INNER JOIN country AS cy ON c.country_id = cy.country_id +INNER JOIN staff AS m ON s.manager_staff_id = m.staff_id +GROUP BY s.store_id +ORDER BY cy.country, c.city; + +-- +-- View structure for view `sales_by_film_category` +-- +-- Note that total sales will add up to >100% because +-- some titles belong to more than 1 category +-- + +CREATE VIEW sales_by_film_category +AS +SELECT +c.name AS category +, SUM(p.amount) AS total_sales +FROM payment AS p +INNER JOIN rental AS r ON p.rental_id = r.rental_id +INNER JOIN inventory AS i ON r.inventory_id = i.inventory_id +INNER JOIN film AS f ON i.film_id = f.film_id +INNER JOIN film_category AS fc ON f.film_id = fc.film_id +INNER JOIN category AS c ON fc.category_id = c.category_id +GROUP BY c.name +ORDER BY total_sales DESC; + +-- +-- View structure for view `actor_info` +-- + +CREATE DEFINER=CURRENT_USER SQL SECURITY INVOKER VIEW actor_info +AS +SELECT +a.actor_id, +a.first_name, +a.last_name, +GROUP_CONCAT(DISTINCT CONCAT(c.name, ': ', + (SELECT GROUP_CONCAT(f.title ORDER BY f.title SEPARATOR ', ') + FROM sakiladb.film f + INNER JOIN sakiladb.film_category fc + ON f.film_id = fc.film_id + INNER JOIN sakiladb.film_actor fa + ON f.film_id = fa.film_id + WHERE fc.category_id = c.category_id + AND fa.actor_id = a.actor_id + ) + ) + ORDER BY c.name SEPARATOR '; ') +AS film_info +FROM sakiladb.actor a +LEFT JOIN sakiladb.film_actor fa + ON a.actor_id = fa.actor_id +LEFT JOIN sakiladb.film_category fc + ON fa.film_id = fc.film_id +LEFT JOIN sakiladb.category c + ON fc.category_id = c.category_id +GROUP BY a.actor_id, a.first_name, a.last_name; + +-- +-- Procedure structure for procedure `rewards_report` +-- + +DELIMITER // + +CREATE PROCEDURE rewards_report ( + IN min_monthly_purchases TINYINT UNSIGNED + , IN min_dollar_amount_purchased DECIMAL(10,2) UNSIGNED + , OUT count_rewardees INT +) +LANGUAGE SQL +NOT DETERMINISTIC +READS SQL DATA +SQL SECURITY DEFINER +COMMENT 'Provides a customizable report on best customers' +proc: BEGIN + + DECLARE last_month_start DATE; + DECLARE last_month_end DATE; + + /* Some sanity checks... */ + IF min_monthly_purchases = 0 THEN + SELECT 'Minimum monthly purchases parameter must be > 0'; + LEAVE proc; + END IF; + IF min_dollar_amount_purchased = 0.00 THEN + SELECT 'Minimum monthly dollar amount purchased parameter must be > $0.00'; + LEAVE proc; + END IF; + + /* Determine start and end time periods */ + SET last_month_start = DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH); + SET last_month_start = STR_TO_DATE(CONCAT(YEAR(last_month_start),'-',MONTH(last_month_start),'-01'),'%Y-%m-%d'); + SET last_month_end = LAST_DAY(last_month_start); + + /* + Create a temporary storage area for + Customer IDs. + */ + CREATE TEMPORARY TABLE tmpCustomer (customer_id SMALLINT UNSIGNED NOT NULL PRIMARY KEY); + + /* + Find all customers meeting the + monthly purchase requirements + */ + INSERT INTO tmpCustomer (customer_id) + SELECT p.customer_id + FROM payment AS p + WHERE DATE(p.payment_date) BETWEEN last_month_start AND last_month_end + GROUP BY customer_id + HAVING SUM(p.amount) > min_dollar_amount_purchased + AND COUNT(customer_id) > min_monthly_purchases; + + /* Populate OUT parameter with count of found customers */ + SELECT COUNT(*) FROM tmpCustomer INTO count_rewardees; + + /* + Output ALL customer information of matching rewardees. + Customize output as needed. + */ + SELECT c.* + FROM tmpCustomer AS t + INNER JOIN customer AS c ON t.customer_id = c.customer_id; + + /* Clean up */ + DROP TABLE tmpCustomer; +END // + +DELIMITER ; + +DELIMITER $$ + +CREATE FUNCTION get_customer_balance(p_customer_id INT, p_effective_date DATETIME) RETURNS DECIMAL(5,2) + DETERMINISTIC + READS SQL DATA +BEGIN + + #OK, WE NEED TO CALCULATE THE CURRENT BALANCE GIVEN A CUSTOMER_ID AND A DATE + #THAT WE WANT THE BALANCE TO BE EFFECTIVE FOR. THE BALANCE IS: + # 1) RENTAL FEES FOR ALL PREVIOUS RENTALS + # 2) ONE DOLLAR FOR EVERY DAY THE PREVIOUS RENTALS ARE OVERDUE + # 3) IF A FILM IS MORE THAN RENTAL_DURATION * 2 OVERDUE, CHARGE THE REPLACEMENT_COST + # 4) SUBTRACT ALL PAYMENTS MADE BEFORE THE DATE SPECIFIED + + DECLARE v_rentfees DECIMAL(5,2); #FEES PAID TO RENT THE VIDEOS INITIALLY + DECLARE v_overfees INTEGER; #LATE FEES FOR PRIOR RENTALS + DECLARE v_payments DECIMAL(5,2); #SUM OF PAYMENTS MADE PREVIOUSLY + + SELECT IFNULL(SUM(film.rental_rate),0) INTO v_rentfees + FROM film, inventory, rental + WHERE film.film_id = inventory.film_id + AND inventory.inventory_id = rental.inventory_id + AND rental.rental_date <= p_effective_date + AND rental.customer_id = p_customer_id; + + SELECT IFNULL(SUM(IF((TO_DAYS(rental.return_date) - TO_DAYS(rental.rental_date)) > film.rental_duration, + ((TO_DAYS(rental.return_date) - TO_DAYS(rental.rental_date)) - film.rental_duration),0)),0) INTO v_overfees + FROM rental, inventory, film + WHERE film.film_id = inventory.film_id + AND inventory.inventory_id = rental.inventory_id + AND rental.rental_date <= p_effective_date + AND rental.customer_id = p_customer_id; + + + SELECT IFNULL(SUM(payment.amount),0) INTO v_payments + FROM payment + + WHERE payment.payment_date <= p_effective_date + AND payment.customer_id = p_customer_id; + + RETURN v_rentfees + v_overfees - v_payments; +END $$ + +DELIMITER ; + +DELIMITER $$ + +CREATE PROCEDURE film_in_stock(IN p_film_id INT, IN p_store_id INT, OUT p_film_count INT) +READS SQL DATA +BEGIN + SELECT inventory_id + FROM inventory + WHERE film_id = p_film_id + AND store_id = p_store_id + AND inventory_in_stock(inventory_id); + + SELECT FOUND_ROWS() INTO p_film_count; +END $$ + +DELIMITER ; + +DELIMITER $$ + +CREATE PROCEDURE film_not_in_stock(IN p_film_id INT, IN p_store_id INT, OUT p_film_count INT) +READS SQL DATA +BEGIN + SELECT inventory_id + FROM inventory + WHERE film_id = p_film_id + AND store_id = p_store_id + AND NOT inventory_in_stock(inventory_id); + + SELECT FOUND_ROWS() INTO p_film_count; +END $$ + +DELIMITER ; + +DELIMITER $$ + +CREATE FUNCTION inventory_held_by_customer(p_inventory_id INT) RETURNS INT +READS SQL DATA +BEGIN + DECLARE v_customer_id INT; + DECLARE EXIT HANDLER FOR NOT FOUND RETURN NULL; + + SELECT customer_id INTO v_customer_id + FROM rental + WHERE return_date IS NULL + AND inventory_id = p_inventory_id; + + RETURN v_customer_id; +END $$ + +DELIMITER ; + +DELIMITER $$ + +CREATE FUNCTION inventory_in_stock(p_inventory_id INT) RETURNS BOOLEAN +READS SQL DATA +BEGIN + DECLARE v_rentals INT; + DECLARE v_out INT; + + #AN ITEM IS IN-STOCK IF THERE ARE EITHER NO ROWS IN THE rental TABLE + #FOR THE ITEM OR ALL ROWS HAVE return_date POPULATED + + SELECT COUNT(*) INTO v_rentals + FROM rental + WHERE inventory_id = p_inventory_id; + + IF v_rentals = 0 THEN + RETURN TRUE; + END IF; + + SELECT COUNT(rental_id) INTO v_out + FROM inventory LEFT JOIN rental USING(inventory_id) + WHERE inventory.inventory_id = p_inventory_id + AND rental.return_date IS NULL; + + IF v_out > 0 THEN + RETURN FALSE; + ELSE + RETURN TRUE; + END IF; +END $$ + +DELIMITER ; + +SET SQL_MODE=@OLD_SQL_MODE; +SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; +SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; + + diff --git a/EFCore/tests/MySql.EFCore.Design.Tests/Properties/world.sql b/EFCore/tests/MySql.EFCore.Design.Tests/Properties/world.sql new file mode 100644 index 000000000..9374e9c57 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Design.Tests/Properties/world.sql @@ -0,0 +1,5450 @@ +/* +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +-- MySQL dump 10.13 Distrib 5.1.51, for pc-linux-gnu (i686) +-- +-- Host: 127.0.0.1 Database: world +-- ------------------------------------------------------ +-- Server version 5.1.51-debug-log + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES latin1 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +DROP SCHEMA IF EXISTS world; +CREATE SCHEMA world; +USE world; +SET AUTOCOMMIT=0; + +-- +-- Table structure for table `city` +-- + +DROP TABLE IF EXISTS `city`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `city` ( + `ID` INT(11) NOT NULL AUTO_INCREMENT, + `Name` CHAR(35) NOT NULL DEFAULT '', + `CountryCode` CHAR(3) NOT NULL DEFAULT '', + `District` CHAR(20) NOT NULL DEFAULT '', + `Population` INT(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`ID`), + KEY `CountryCode` (`CountryCode`), + CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`) +) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `city` +-- +-- ORDER BY: `ID` + +INSERT INTO `city` VALUES (1,'Kabul','AFG','Kabol',1780000); +INSERT INTO `city` VALUES (2,'Qandahar','AFG','Qandahar',237500); +INSERT INTO `city` VALUES (3,'Herat','AFG','Herat',186800); +INSERT INTO `city` VALUES (4,'Mazar-e-Sharif','AFG','Balkh',127800); +INSERT INTO `city` VALUES (5,'Amsterdam','NLD','Noord-Holland',731200); +INSERT INTO `city` VALUES (6,'Rotterdam','NLD','Zuid-Holland',593321); +INSERT INTO `city` VALUES (7,'Haag','NLD','Zuid-Holland',440900); +INSERT INTO `city` VALUES (8,'Utrecht','NLD','Utrecht',234323); +INSERT INTO `city` VALUES (9,'Eindhoven','NLD','Noord-Brabant',201843); +INSERT INTO `city` VALUES (10,'Tilburg','NLD','Noord-Brabant',193238); +INSERT INTO `city` VALUES (11,'Groningen','NLD','Groningen',172701); +INSERT INTO `city` VALUES (12,'Breda','NLD','Noord-Brabant',160398); +INSERT INTO `city` VALUES (13,'Apeldoorn','NLD','Gelderland',153491); +INSERT INTO `city` VALUES (14,'Nijmegen','NLD','Gelderland',152463); +INSERT INTO `city` VALUES (15,'Enschede','NLD','Overijssel',149544); +INSERT INTO `city` VALUES (16,'Haarlem','NLD','Noord-Holland',148772); +INSERT INTO `city` VALUES (17,'Almere','NLD','Flevoland',142465); +INSERT INTO `city` VALUES (18,'Arnhem','NLD','Gelderland',138020); +INSERT INTO `city` VALUES (19,'Zaanstad','NLD','Noord-Holland',135621); +INSERT INTO `city` VALUES (20,'�s-Hertogenbosch','NLD','Noord-Brabant',129170); +INSERT INTO `city` VALUES (21,'Amersfoort','NLD','Utrecht',126270); +INSERT INTO `city` VALUES (22,'Maastricht','NLD','Limburg',122087); +INSERT INTO `city` VALUES (23,'Dordrecht','NLD','Zuid-Holland',119811); +INSERT INTO `city` VALUES (24,'Leiden','NLD','Zuid-Holland',117196); +INSERT INTO `city` VALUES (25,'Haarlemmermeer','NLD','Noord-Holland',110722); +INSERT INTO `city` VALUES (26,'Zoetermeer','NLD','Zuid-Holland',110214); +INSERT INTO `city` VALUES (27,'Emmen','NLD','Drenthe',105853); +INSERT INTO `city` VALUES (28,'Zwolle','NLD','Overijssel',105819); +INSERT INTO `city` VALUES (29,'Ede','NLD','Gelderland',101574); +INSERT INTO `city` VALUES (30,'Delft','NLD','Zuid-Holland',95268); +INSERT INTO `city` VALUES (31,'Heerlen','NLD','Limburg',95052); +INSERT INTO `city` VALUES (32,'Alkmaar','NLD','Noord-Holland',92713); +INSERT INTO `city` VALUES (33,'Willemstad','ANT','Cura�ao',2345); +INSERT INTO `city` VALUES (34,'Tirana','ALB','Tirana',270000); +INSERT INTO `city` VALUES (35,'Alger','DZA','Alger',2168000); +INSERT INTO `city` VALUES (36,'Oran','DZA','Oran',609823); +INSERT INTO `city` VALUES (37,'Constantine','DZA','Constantine',443727); +INSERT INTO `city` VALUES (38,'Annaba','DZA','Annaba',222518); +INSERT INTO `city` VALUES (39,'Batna','DZA','Batna',183377); +INSERT INTO `city` VALUES (40,'S�tif','DZA','S�tif',179055); +INSERT INTO `city` VALUES (41,'Sidi Bel Abb�s','DZA','Sidi Bel Abb�s',153106); +INSERT INTO `city` VALUES (42,'Skikda','DZA','Skikda',128747); +INSERT INTO `city` VALUES (43,'Biskra','DZA','Biskra',128281); +INSERT INTO `city` VALUES (44,'Blida (el-Boulaida)','DZA','Blida',127284); +INSERT INTO `city` VALUES (45,'B�ja�a','DZA','B�ja�a',117162); +INSERT INTO `city` VALUES (46,'Mostaganem','DZA','Mostaganem',115212); +INSERT INTO `city` VALUES (47,'T�bessa','DZA','T�bessa',112007); +INSERT INTO `city` VALUES (48,'Tlemcen (Tilimsen)','DZA','Tlemcen',110242); +INSERT INTO `city` VALUES (49,'B�char','DZA','B�char',107311); +INSERT INTO `city` VALUES (50,'Tiaret','DZA','Tiaret',100118); +INSERT INTO `city` VALUES (51,'Ech-Chleff (el-Asnam)','DZA','Chlef',96794); +INSERT INTO `city` VALUES (52,'Gharda�a','DZA','Gharda�a',89415); +INSERT INTO `city` VALUES (53,'Tafuna','ASM','Tutuila',5200); +INSERT INTO `city` VALUES (54,'Fagatogo','ASM','Tutuila',2323); +INSERT INTO `city` VALUES (55,'Andorra la Vella','AND','Andorra la Vella',21189); +INSERT INTO `city` VALUES (56,'Luanda','AGO','Luanda',2022000); +INSERT INTO `city` VALUES (57,'Huambo','AGO','Huambo',163100); +INSERT INTO `city` VALUES (58,'Lobito','AGO','Benguela',130000); +INSERT INTO `city` VALUES (59,'Benguela','AGO','Benguela',128300); +INSERT INTO `city` VALUES (60,'Namibe','AGO','Namibe',118200); +INSERT INTO `city` VALUES (61,'South Hill','AIA','�',961); +INSERT INTO `city` VALUES (62,'The Valley','AIA','�',595); +INSERT INTO `city` VALUES (63,'Saint John�s','ATG','St John',24000); +INSERT INTO `city` VALUES (64,'Dubai','ARE','Dubai',669181); +INSERT INTO `city` VALUES (65,'Abu Dhabi','ARE','Abu Dhabi',398695); +INSERT INTO `city` VALUES (66,'Sharja','ARE','Sharja',320095); +INSERT INTO `city` VALUES (67,'al-Ayn','ARE','Abu Dhabi',225970); +INSERT INTO `city` VALUES (68,'Ajman','ARE','Ajman',114395); +INSERT INTO `city` VALUES (69,'Buenos Aires','ARG','Distrito Federal',2982146); +INSERT INTO `city` VALUES (70,'La Matanza','ARG','Buenos Aires',1266461); +INSERT INTO `city` VALUES (71,'C�rdoba','ARG','C�rdoba',1157507); +INSERT INTO `city` VALUES (72,'Rosario','ARG','Santa F�',907718); +INSERT INTO `city` VALUES (73,'Lomas de Zamora','ARG','Buenos Aires',622013); +INSERT INTO `city` VALUES (74,'Quilmes','ARG','Buenos Aires',559249); +INSERT INTO `city` VALUES (75,'Almirante Brown','ARG','Buenos Aires',538918); +INSERT INTO `city` VALUES (76,'La Plata','ARG','Buenos Aires',521936); +INSERT INTO `city` VALUES (77,'Mar del Plata','ARG','Buenos Aires',512880); +INSERT INTO `city` VALUES (78,'San Miguel de Tucum�n','ARG','Tucum�n',470809); +INSERT INTO `city` VALUES (79,'Lan�s','ARG','Buenos Aires',469735); +INSERT INTO `city` VALUES (80,'Merlo','ARG','Buenos Aires',463846); +INSERT INTO `city` VALUES (81,'General San Mart�n','ARG','Buenos Aires',422542); +INSERT INTO `city` VALUES (82,'Salta','ARG','Salta',367550); +INSERT INTO `city` VALUES (83,'Moreno','ARG','Buenos Aires',356993); +INSERT INTO `city` VALUES (84,'Santa F�','ARG','Santa F�',353063); +INSERT INTO `city` VALUES (85,'Avellaneda','ARG','Buenos Aires',353046); +INSERT INTO `city` VALUES (86,'Tres de Febrero','ARG','Buenos Aires',352311); +INSERT INTO `city` VALUES (87,'Mor�n','ARG','Buenos Aires',349246); +INSERT INTO `city` VALUES (88,'Florencio Varela','ARG','Buenos Aires',315432); +INSERT INTO `city` VALUES (89,'San Isidro','ARG','Buenos Aires',306341); +INSERT INTO `city` VALUES (90,'Tigre','ARG','Buenos Aires',296226); +INSERT INTO `city` VALUES (91,'Malvinas Argentinas','ARG','Buenos Aires',290335); +INSERT INTO `city` VALUES (92,'Vicente L�pez','ARG','Buenos Aires',288341); +INSERT INTO `city` VALUES (93,'Berazategui','ARG','Buenos Aires',276916); +INSERT INTO `city` VALUES (94,'Corrientes','ARG','Corrientes',258103); +INSERT INTO `city` VALUES (95,'San Miguel','ARG','Buenos Aires',248700); +INSERT INTO `city` VALUES (96,'Bah�a Blanca','ARG','Buenos Aires',239810); +INSERT INTO `city` VALUES (97,'Esteban Echeverr�a','ARG','Buenos Aires',235760); +INSERT INTO `city` VALUES (98,'Resistencia','ARG','Chaco',229212); +INSERT INTO `city` VALUES (99,'Jos� C. Paz','ARG','Buenos Aires',221754); +INSERT INTO `city` VALUES (100,'Paran�','ARG','Entre Rios',207041); +INSERT INTO `city` VALUES (101,'Godoy Cruz','ARG','Mendoza',206998); +INSERT INTO `city` VALUES (102,'Posadas','ARG','Misiones',201273); +INSERT INTO `city` VALUES (103,'Guaymall�n','ARG','Mendoza',200595); +INSERT INTO `city` VALUES (104,'Santiago del Estero','ARG','Santiago del Estero',189947); +INSERT INTO `city` VALUES (105,'San Salvador de Jujuy','ARG','Jujuy',178748); +INSERT INTO `city` VALUES (106,'Hurlingham','ARG','Buenos Aires',170028); +INSERT INTO `city` VALUES (107,'Neuqu�n','ARG','Neuqu�n',167296); +INSERT INTO `city` VALUES (108,'Ituzaing�','ARG','Buenos Aires',158197); +INSERT INTO `city` VALUES (109,'San Fernando','ARG','Buenos Aires',153036); +INSERT INTO `city` VALUES (110,'Formosa','ARG','Formosa',147636); +INSERT INTO `city` VALUES (111,'Las Heras','ARG','Mendoza',145823); +INSERT INTO `city` VALUES (112,'La Rioja','ARG','La Rioja',138117); +INSERT INTO `city` VALUES (113,'San Fernando del Valle de Cata','ARG','Catamarca',134935); +INSERT INTO `city` VALUES (114,'R�o Cuarto','ARG','C�rdoba',134355); +INSERT INTO `city` VALUES (115,'Comodoro Rivadavia','ARG','Chubut',124104); +INSERT INTO `city` VALUES (116,'Mendoza','ARG','Mendoza',123027); +INSERT INTO `city` VALUES (117,'San Nicol�s de los Arroyos','ARG','Buenos Aires',119302); +INSERT INTO `city` VALUES (118,'San Juan','ARG','San Juan',119152); +INSERT INTO `city` VALUES (119,'Escobar','ARG','Buenos Aires',116675); +INSERT INTO `city` VALUES (120,'Concordia','ARG','Entre Rios',116485); +INSERT INTO `city` VALUES (121,'Pilar','ARG','Buenos Aires',113428); +INSERT INTO `city` VALUES (122,'San Luis','ARG','San Luis',110136); +INSERT INTO `city` VALUES (123,'Ezeiza','ARG','Buenos Aires',99578); +INSERT INTO `city` VALUES (124,'San Rafael','ARG','Mendoza',94651); +INSERT INTO `city` VALUES (125,'Tandil','ARG','Buenos Aires',91101); +INSERT INTO `city` VALUES (126,'Yerevan','ARM','Yerevan',1248700); +INSERT INTO `city` VALUES (127,'Gjumri','ARM','�irak',211700); +INSERT INTO `city` VALUES (128,'Vanadzor','ARM','Lori',172700); +INSERT INTO `city` VALUES (129,'Oranjestad','ABW','�',29034); +INSERT INTO `city` VALUES (130,'Sydney','AUS','New South Wales',3276207); +INSERT INTO `city` VALUES (131,'Melbourne','AUS','Victoria',2865329); +INSERT INTO `city` VALUES (132,'Brisbane','AUS','Queensland',1291117); +INSERT INTO `city` VALUES (133,'Perth','AUS','West Australia',1096829); +INSERT INTO `city` VALUES (134,'Adelaide','AUS','South Australia',978100); +INSERT INTO `city` VALUES (135,'Canberra','AUS','Capital Region',322723); +INSERT INTO `city` VALUES (136,'Gold Coast','AUS','Queensland',311932); +INSERT INTO `city` VALUES (137,'Newcastle','AUS','New South Wales',270324); +INSERT INTO `city` VALUES (138,'Central Coast','AUS','New South Wales',227657); +INSERT INTO `city` VALUES (139,'Wollongong','AUS','New South Wales',219761); +INSERT INTO `city` VALUES (140,'Hobart','AUS','Tasmania',126118); +INSERT INTO `city` VALUES (141,'Geelong','AUS','Victoria',125382); +INSERT INTO `city` VALUES (142,'Townsville','AUS','Queensland',109914); +INSERT INTO `city` VALUES (143,'Cairns','AUS','Queensland',92273); +INSERT INTO `city` VALUES (144,'Baku','AZE','Baki',1787800); +INSERT INTO `city` VALUES (145,'G�nc�','AZE','G�nc�',299300); +INSERT INTO `city` VALUES (146,'Sumqayit','AZE','Sumqayit',283000); +INSERT INTO `city` VALUES (147,'Ming��evir','AZE','Ming��evir',93900); +INSERT INTO `city` VALUES (148,'Nassau','BHS','New Providence',172000); +INSERT INTO `city` VALUES (149,'al-Manama','BHR','al-Manama',148000); +INSERT INTO `city` VALUES (150,'Dhaka','BGD','Dhaka',3612850); +INSERT INTO `city` VALUES (151,'Chittagong','BGD','Chittagong',1392860); +INSERT INTO `city` VALUES (152,'Khulna','BGD','Khulna',663340); +INSERT INTO `city` VALUES (153,'Rajshahi','BGD','Rajshahi',294056); +INSERT INTO `city` VALUES (154,'Narayanganj','BGD','Dhaka',202134); +INSERT INTO `city` VALUES (155,'Rangpur','BGD','Rajshahi',191398); +INSERT INTO `city` VALUES (156,'Mymensingh','BGD','Dhaka',188713); +INSERT INTO `city` VALUES (157,'Barisal','BGD','Barisal',170232); +INSERT INTO `city` VALUES (158,'Tungi','BGD','Dhaka',168702); +INSERT INTO `city` VALUES (159,'Jessore','BGD','Khulna',139710); +INSERT INTO `city` VALUES (160,'Comilla','BGD','Chittagong',135313); +INSERT INTO `city` VALUES (161,'Nawabganj','BGD','Rajshahi',130577); +INSERT INTO `city` VALUES (162,'Dinajpur','BGD','Rajshahi',127815); +INSERT INTO `city` VALUES (163,'Bogra','BGD','Rajshahi',120170); +INSERT INTO `city` VALUES (164,'Sylhet','BGD','Sylhet',117396); +INSERT INTO `city` VALUES (165,'Brahmanbaria','BGD','Chittagong',109032); +INSERT INTO `city` VALUES (166,'Tangail','BGD','Dhaka',106004); +INSERT INTO `city` VALUES (167,'Jamalpur','BGD','Dhaka',103556); +INSERT INTO `city` VALUES (168,'Pabna','BGD','Rajshahi',103277); +INSERT INTO `city` VALUES (169,'Naogaon','BGD','Rajshahi',101266); +INSERT INTO `city` VALUES (170,'Sirajganj','BGD','Rajshahi',99669); +INSERT INTO `city` VALUES (171,'Narsinghdi','BGD','Dhaka',98342); +INSERT INTO `city` VALUES (172,'Saidpur','BGD','Rajshahi',96777); +INSERT INTO `city` VALUES (173,'Gazipur','BGD','Dhaka',96717); +INSERT INTO `city` VALUES (174,'Bridgetown','BRB','St Michael',6070); +INSERT INTO `city` VALUES (175,'Antwerpen','BEL','Antwerpen',446525); +INSERT INTO `city` VALUES (176,'Gent','BEL','East Flanderi',224180); +INSERT INTO `city` VALUES (177,'Charleroi','BEL','Hainaut',200827); +INSERT INTO `city` VALUES (178,'Li�ge','BEL','Li�ge',185639); +INSERT INTO `city` VALUES (179,'Bruxelles [Brussel]','BEL','Bryssel',133859); +INSERT INTO `city` VALUES (180,'Brugge','BEL','West Flanderi',116246); +INSERT INTO `city` VALUES (181,'Schaerbeek','BEL','Bryssel',105692); +INSERT INTO `city` VALUES (182,'Namur','BEL','Namur',105419); +INSERT INTO `city` VALUES (183,'Mons','BEL','Hainaut',90935); +INSERT INTO `city` VALUES (184,'Belize City','BLZ','Belize City',55810); +INSERT INTO `city` VALUES (185,'Belmopan','BLZ','Cayo',7105); +INSERT INTO `city` VALUES (186,'Cotonou','BEN','Atlantique',536827); +INSERT INTO `city` VALUES (187,'Porto-Novo','BEN','Ou�m�',194000); +INSERT INTO `city` VALUES (188,'Djougou','BEN','Atacora',134099); +INSERT INTO `city` VALUES (189,'Parakou','BEN','Borgou',103577); +INSERT INTO `city` VALUES (190,'Saint George','BMU','Saint George�s',1800); +INSERT INTO `city` VALUES (191,'Hamilton','BMU','Hamilton',1200); +INSERT INTO `city` VALUES (192,'Thimphu','BTN','Thimphu',22000); +INSERT INTO `city` VALUES (193,'Santa Cruz de la Sierra','BOL','Santa Cruz',935361); +INSERT INTO `city` VALUES (194,'La Paz','BOL','La Paz',758141); +INSERT INTO `city` VALUES (195,'El Alto','BOL','La Paz',534466); +INSERT INTO `city` VALUES (196,'Cochabamba','BOL','Cochabamba',482800); +INSERT INTO `city` VALUES (197,'Oruro','BOL','Oruro',223553); +INSERT INTO `city` VALUES (198,'Sucre','BOL','Chuquisaca',178426); +INSERT INTO `city` VALUES (199,'Potos�','BOL','Potos�',140642); +INSERT INTO `city` VALUES (200,'Tarija','BOL','Tarija',125255); +INSERT INTO `city` VALUES (201,'Sarajevo','BIH','Federaatio',360000); +INSERT INTO `city` VALUES (202,'Banja Luka','BIH','Republika Srpska',143079); +INSERT INTO `city` VALUES (203,'Zenica','BIH','Federaatio',96027); +INSERT INTO `city` VALUES (204,'Gaborone','BWA','Gaborone',213017); +INSERT INTO `city` VALUES (205,'Francistown','BWA','Francistown',101805); +INSERT INTO `city` VALUES (206,'S�o Paulo','BRA','S�o Paulo',9968485); +INSERT INTO `city` VALUES (207,'Rio de Janeiro','BRA','Rio de Janeiro',5598953); +INSERT INTO `city` VALUES (208,'Salvador','BRA','Bahia',2302832); +INSERT INTO `city` VALUES (209,'Belo Horizonte','BRA','Minas Gerais',2139125); +INSERT INTO `city` VALUES (210,'Fortaleza','BRA','Cear�',2097757); +INSERT INTO `city` VALUES (211,'Bras�lia','BRA','Distrito Federal',1969868); +INSERT INTO `city` VALUES (212,'Curitiba','BRA','Paran�',1584232); +INSERT INTO `city` VALUES (213,'Recife','BRA','Pernambuco',1378087); +INSERT INTO `city` VALUES (214,'Porto Alegre','BRA','Rio Grande do Sul',1314032); +INSERT INTO `city` VALUES (215,'Manaus','BRA','Amazonas',1255049); +INSERT INTO `city` VALUES (216,'Bel�m','BRA','Par�',1186926); +INSERT INTO `city` VALUES (217,'Guarulhos','BRA','S�o Paulo',1095874); +INSERT INTO `city` VALUES (218,'Goi�nia','BRA','Goi�s',1056330); +INSERT INTO `city` VALUES (219,'Campinas','BRA','S�o Paulo',950043); +INSERT INTO `city` VALUES (220,'S�o Gon�alo','BRA','Rio de Janeiro',869254); +INSERT INTO `city` VALUES (221,'Nova Igua�u','BRA','Rio de Janeiro',862225); +INSERT INTO `city` VALUES (222,'S�o Lu�s','BRA','Maranh�o',837588); +INSERT INTO `city` VALUES (223,'Macei�','BRA','Alagoas',786288); +INSERT INTO `city` VALUES (224,'Duque de Caxias','BRA','Rio de Janeiro',746758); +INSERT INTO `city` VALUES (225,'S�o Bernardo do Campo','BRA','S�o Paulo',723132); +INSERT INTO `city` VALUES (226,'Teresina','BRA','Piau�',691942); +INSERT INTO `city` VALUES (227,'Natal','BRA','Rio Grande do Norte',688955); +INSERT INTO `city` VALUES (228,'Osasco','BRA','S�o Paulo',659604); +INSERT INTO `city` VALUES (229,'Campo Grande','BRA','Mato Grosso do Sul',649593); +INSERT INTO `city` VALUES (230,'Santo Andr�','BRA','S�o Paulo',630073); +INSERT INTO `city` VALUES (231,'Jo�o Pessoa','BRA','Para�ba',584029); +INSERT INTO `city` VALUES (232,'Jaboat�o dos Guararapes','BRA','Pernambuco',558680); +INSERT INTO `city` VALUES (233,'Contagem','BRA','Minas Gerais',520801); +INSERT INTO `city` VALUES (234,'S�o Jos� dos Campos','BRA','S�o Paulo',515553); +INSERT INTO `city` VALUES (235,'Uberl�ndia','BRA','Minas Gerais',487222); +INSERT INTO `city` VALUES (236,'Feira de Santana','BRA','Bahia',479992); +INSERT INTO `city` VALUES (237,'Ribeir�o Preto','BRA','S�o Paulo',473276); +INSERT INTO `city` VALUES (238,'Sorocaba','BRA','S�o Paulo',466823); +INSERT INTO `city` VALUES (239,'Niter�i','BRA','Rio de Janeiro',459884); +INSERT INTO `city` VALUES (240,'Cuiab�','BRA','Mato Grosso',453813); +INSERT INTO `city` VALUES (241,'Juiz de Fora','BRA','Minas Gerais',450288); +INSERT INTO `city` VALUES (242,'Aracaju','BRA','Sergipe',445555); +INSERT INTO `city` VALUES (243,'S�o Jo�o de Meriti','BRA','Rio de Janeiro',440052); +INSERT INTO `city` VALUES (244,'Londrina','BRA','Paran�',432257); +INSERT INTO `city` VALUES (245,'Joinville','BRA','Santa Catarina',428011); +INSERT INTO `city` VALUES (246,'Belford Roxo','BRA','Rio de Janeiro',425194); +INSERT INTO `city` VALUES (247,'Santos','BRA','S�o Paulo',408748); +INSERT INTO `city` VALUES (248,'Ananindeua','BRA','Par�',400940); +INSERT INTO `city` VALUES (249,'Campos dos Goytacazes','BRA','Rio de Janeiro',398418); +INSERT INTO `city` VALUES (250,'Mau�','BRA','S�o Paulo',375055); +INSERT INTO `city` VALUES (251,'Carapicu�ba','BRA','S�o Paulo',357552); +INSERT INTO `city` VALUES (252,'Olinda','BRA','Pernambuco',354732); +INSERT INTO `city` VALUES (253,'Campina Grande','BRA','Para�ba',352497); +INSERT INTO `city` VALUES (254,'S�o Jos� do Rio Preto','BRA','S�o Paulo',351944); +INSERT INTO `city` VALUES (255,'Caxias do Sul','BRA','Rio Grande do Sul',349581); +INSERT INTO `city` VALUES (256,'Moji das Cruzes','BRA','S�o Paulo',339194); +INSERT INTO `city` VALUES (257,'Diadema','BRA','S�o Paulo',335078); +INSERT INTO `city` VALUES (258,'Aparecida de Goi�nia','BRA','Goi�s',324662); +INSERT INTO `city` VALUES (259,'Piracicaba','BRA','S�o Paulo',319104); +INSERT INTO `city` VALUES (260,'Cariacica','BRA','Esp�rito Santo',319033); +INSERT INTO `city` VALUES (261,'Vila Velha','BRA','Esp�rito Santo',318758); +INSERT INTO `city` VALUES (262,'Pelotas','BRA','Rio Grande do Sul',315415); +INSERT INTO `city` VALUES (263,'Bauru','BRA','S�o Paulo',313670); +INSERT INTO `city` VALUES (264,'Porto Velho','BRA','Rond�nia',309750); +INSERT INTO `city` VALUES (265,'Serra','BRA','Esp�rito Santo',302666); +INSERT INTO `city` VALUES (266,'Betim','BRA','Minas Gerais',302108); +INSERT INTO `city` VALUES (267,'Jund�a�','BRA','S�o Paulo',296127); +INSERT INTO `city` VALUES (268,'Canoas','BRA','Rio Grande do Sul',294125); +INSERT INTO `city` VALUES (269,'Franca','BRA','S�o Paulo',290139); +INSERT INTO `city` VALUES (270,'S�o Vicente','BRA','S�o Paulo',286848); +INSERT INTO `city` VALUES (271,'Maring�','BRA','Paran�',286461); +INSERT INTO `city` VALUES (272,'Montes Claros','BRA','Minas Gerais',286058); +INSERT INTO `city` VALUES (273,'An�polis','BRA','Goi�s',282197); +INSERT INTO `city` VALUES (274,'Florian�polis','BRA','Santa Catarina',281928); +INSERT INTO `city` VALUES (275,'Petr�polis','BRA','Rio de Janeiro',279183); +INSERT INTO `city` VALUES (276,'Itaquaquecetuba','BRA','S�o Paulo',270874); +INSERT INTO `city` VALUES (277,'Vit�ria','BRA','Esp�rito Santo',270626); +INSERT INTO `city` VALUES (278,'Ponta Grossa','BRA','Paran�',268013); +INSERT INTO `city` VALUES (279,'Rio Branco','BRA','Acre',259537); +INSERT INTO `city` VALUES (280,'Foz do Igua�u','BRA','Paran�',259425); +INSERT INTO `city` VALUES (281,'Macap�','BRA','Amap�',256033); +INSERT INTO `city` VALUES (282,'Ilh�us','BRA','Bahia',254970); +INSERT INTO `city` VALUES (283,'Vit�ria da Conquista','BRA','Bahia',253587); +INSERT INTO `city` VALUES (284,'Uberaba','BRA','Minas Gerais',249225); +INSERT INTO `city` VALUES (285,'Paulista','BRA','Pernambuco',248473); +INSERT INTO `city` VALUES (286,'Limeira','BRA','S�o Paulo',245497); +INSERT INTO `city` VALUES (287,'Blumenau','BRA','Santa Catarina',244379); +INSERT INTO `city` VALUES (288,'Caruaru','BRA','Pernambuco',244247); +INSERT INTO `city` VALUES (289,'Santar�m','BRA','Par�',241771); +INSERT INTO `city` VALUES (290,'Volta Redonda','BRA','Rio de Janeiro',240315); +INSERT INTO `city` VALUES (291,'Novo Hamburgo','BRA','Rio Grande do Sul',239940); +INSERT INTO `city` VALUES (292,'Caucaia','BRA','Cear�',238738); +INSERT INTO `city` VALUES (293,'Santa Maria','BRA','Rio Grande do Sul',238473); +INSERT INTO `city` VALUES (294,'Cascavel','BRA','Paran�',237510); +INSERT INTO `city` VALUES (295,'Guaruj�','BRA','S�o Paulo',237206); +INSERT INTO `city` VALUES (296,'Ribeir�o das Neves','BRA','Minas Gerais',232685); +INSERT INTO `city` VALUES (297,'Governador Valadares','BRA','Minas Gerais',231724); +INSERT INTO `city` VALUES (298,'Taubat�','BRA','S�o Paulo',229130); +INSERT INTO `city` VALUES (299,'Imperatriz','BRA','Maranh�o',224564); +INSERT INTO `city` VALUES (300,'Gravata�','BRA','Rio Grande do Sul',223011); +INSERT INTO `city` VALUES (301,'Embu','BRA','S�o Paulo',222223); +INSERT INTO `city` VALUES (302,'Mossor�','BRA','Rio Grande do Norte',214901); +INSERT INTO `city` VALUES (303,'V�rzea Grande','BRA','Mato Grosso',214435); +INSERT INTO `city` VALUES (304,'Petrolina','BRA','Pernambuco',210540); +INSERT INTO `city` VALUES (305,'Barueri','BRA','S�o Paulo',208426); +INSERT INTO `city` VALUES (306,'Viam�o','BRA','Rio Grande do Sul',207557); +INSERT INTO `city` VALUES (307,'Ipatinga','BRA','Minas Gerais',206338); +INSERT INTO `city` VALUES (308,'Juazeiro','BRA','Bahia',201073); +INSERT INTO `city` VALUES (309,'Juazeiro do Norte','BRA','Cear�',199636); +INSERT INTO `city` VALUES (310,'Tabo�o da Serra','BRA','S�o Paulo',197550); +INSERT INTO `city` VALUES (311,'S�o Jos� dos Pinhais','BRA','Paran�',196884); +INSERT INTO `city` VALUES (312,'Mag�','BRA','Rio de Janeiro',196147); +INSERT INTO `city` VALUES (313,'Suzano','BRA','S�o Paulo',195434); +INSERT INTO `city` VALUES (314,'S�o Leopoldo','BRA','Rio Grande do Sul',189258); +INSERT INTO `city` VALUES (315,'Mar�lia','BRA','S�o Paulo',188691); +INSERT INTO `city` VALUES (316,'S�o Carlos','BRA','S�o Paulo',187122); +INSERT INTO `city` VALUES (317,'Sumar�','BRA','S�o Paulo',186205); +INSERT INTO `city` VALUES (318,'Presidente Prudente','BRA','S�o Paulo',185340); +INSERT INTO `city` VALUES (319,'Divin�polis','BRA','Minas Gerais',185047); +INSERT INTO `city` VALUES (320,'Sete Lagoas','BRA','Minas Gerais',182984); +INSERT INTO `city` VALUES (321,'Rio Grande','BRA','Rio Grande do Sul',182222); +INSERT INTO `city` VALUES (322,'Itabuna','BRA','Bahia',182148); +INSERT INTO `city` VALUES (323,'Jequi�','BRA','Bahia',179128); +INSERT INTO `city` VALUES (324,'Arapiraca','BRA','Alagoas',178988); +INSERT INTO `city` VALUES (325,'Colombo','BRA','Paran�',177764); +INSERT INTO `city` VALUES (326,'Americana','BRA','S�o Paulo',177409); +INSERT INTO `city` VALUES (327,'Alvorada','BRA','Rio Grande do Sul',175574); +INSERT INTO `city` VALUES (328,'Araraquara','BRA','S�o Paulo',174381); +INSERT INTO `city` VALUES (329,'Itabora�','BRA','Rio de Janeiro',173977); +INSERT INTO `city` VALUES (330,'Santa B�rbara d�Oeste','BRA','S�o Paulo',171657); +INSERT INTO `city` VALUES (331,'Nova Friburgo','BRA','Rio de Janeiro',170697); +INSERT INTO `city` VALUES (332,'Jacare�','BRA','S�o Paulo',170356); +INSERT INTO `city` VALUES (333,'Ara�atuba','BRA','S�o Paulo',169303); +INSERT INTO `city` VALUES (334,'Barra Mansa','BRA','Rio de Janeiro',168953); +INSERT INTO `city` VALUES (335,'Praia Grande','BRA','S�o Paulo',168434); +INSERT INTO `city` VALUES (336,'Marab�','BRA','Par�',167795); +INSERT INTO `city` VALUES (337,'Crici�ma','BRA','Santa Catarina',167661); +INSERT INTO `city` VALUES (338,'Boa Vista','BRA','Roraima',167185); +INSERT INTO `city` VALUES (339,'Passo Fundo','BRA','Rio Grande do Sul',166343); +INSERT INTO `city` VALUES (340,'Dourados','BRA','Mato Grosso do Sul',164716); +INSERT INTO `city` VALUES (341,'Santa Luzia','BRA','Minas Gerais',164704); +INSERT INTO `city` VALUES (342,'Rio Claro','BRA','S�o Paulo',163551); +INSERT INTO `city` VALUES (343,'Maracana�','BRA','Cear�',162022); +INSERT INTO `city` VALUES (344,'Guarapuava','BRA','Paran�',160510); +INSERT INTO `city` VALUES (345,'Rondon�polis','BRA','Mato Grosso',155115); +INSERT INTO `city` VALUES (346,'S�o Jos�','BRA','Santa Catarina',155105); +INSERT INTO `city` VALUES (347,'Cachoeiro de Itapemirim','BRA','Esp�rito Santo',155024); +INSERT INTO `city` VALUES (348,'Nil�polis','BRA','Rio de Janeiro',153383); +INSERT INTO `city` VALUES (349,'Itapevi','BRA','S�o Paulo',150664); +INSERT INTO `city` VALUES (350,'Cabo de Santo Agostinho','BRA','Pernambuco',149964); +INSERT INTO `city` VALUES (351,'Cama�ari','BRA','Bahia',149146); +INSERT INTO `city` VALUES (352,'Sobral','BRA','Cear�',146005); +INSERT INTO `city` VALUES (353,'Itaja�','BRA','Santa Catarina',145197); +INSERT INTO `city` VALUES (354,'Chapec�','BRA','Santa Catarina',144158); +INSERT INTO `city` VALUES (355,'Cotia','BRA','S�o Paulo',140042); +INSERT INTO `city` VALUES (356,'Lages','BRA','Santa Catarina',139570); +INSERT INTO `city` VALUES (357,'Ferraz de Vasconcelos','BRA','S�o Paulo',139283); +INSERT INTO `city` VALUES (358,'Indaiatuba','BRA','S�o Paulo',135968); +INSERT INTO `city` VALUES (359,'Hortol�ndia','BRA','S�o Paulo',135755); +INSERT INTO `city` VALUES (360,'Caxias','BRA','Maranh�o',133980); +INSERT INTO `city` VALUES (361,'S�o Caetano do Sul','BRA','S�o Paulo',133321); +INSERT INTO `city` VALUES (362,'Itu','BRA','S�o Paulo',132736); +INSERT INTO `city` VALUES (363,'Nossa Senhora do Socorro','BRA','Sergipe',131351); +INSERT INTO `city` VALUES (364,'Parna�ba','BRA','Piau�',129756); +INSERT INTO `city` VALUES (365,'Po�os de Caldas','BRA','Minas Gerais',129683); +INSERT INTO `city` VALUES (366,'Teres�polis','BRA','Rio de Janeiro',128079); +INSERT INTO `city` VALUES (367,'Barreiras','BRA','Bahia',127801); +INSERT INTO `city` VALUES (368,'Castanhal','BRA','Par�',127634); +INSERT INTO `city` VALUES (369,'Alagoinhas','BRA','Bahia',126820); +INSERT INTO `city` VALUES (370,'Itapecerica da Serra','BRA','S�o Paulo',126672); +INSERT INTO `city` VALUES (371,'Uruguaiana','BRA','Rio Grande do Sul',126305); +INSERT INTO `city` VALUES (372,'Paranagu�','BRA','Paran�',126076); +INSERT INTO `city` VALUES (373,'Ibirit�','BRA','Minas Gerais',125982); +INSERT INTO `city` VALUES (374,'Timon','BRA','Maranh�o',125812); +INSERT INTO `city` VALUES (375,'Luzi�nia','BRA','Goi�s',125597); +INSERT INTO `city` VALUES (376,'Maca�','BRA','Rio de Janeiro',125597); +INSERT INTO `city` VALUES (377,'Te�filo Otoni','BRA','Minas Gerais',124489); +INSERT INTO `city` VALUES (378,'Moji-Gua�u','BRA','S�o Paulo',123782); +INSERT INTO `city` VALUES (379,'Palmas','BRA','Tocantins',121919); +INSERT INTO `city` VALUES (380,'Pindamonhangaba','BRA','S�o Paulo',121904); +INSERT INTO `city` VALUES (381,'Francisco Morato','BRA','S�o Paulo',121197); +INSERT INTO `city` VALUES (382,'Bag�','BRA','Rio Grande do Sul',120793); +INSERT INTO `city` VALUES (383,'Sapucaia do Sul','BRA','Rio Grande do Sul',120217); +INSERT INTO `city` VALUES (384,'Cabo Frio','BRA','Rio de Janeiro',119503); +INSERT INTO `city` VALUES (385,'Itapetininga','BRA','S�o Paulo',119391); +INSERT INTO `city` VALUES (386,'Patos de Minas','BRA','Minas Gerais',119262); +INSERT INTO `city` VALUES (387,'Camaragibe','BRA','Pernambuco',118968); +INSERT INTO `city` VALUES (388,'Bragan�a Paulista','BRA','S�o Paulo',116929); +INSERT INTO `city` VALUES (389,'Queimados','BRA','Rio de Janeiro',115020); +INSERT INTO `city` VALUES (390,'Aragua�na','BRA','Tocantins',114948); +INSERT INTO `city` VALUES (391,'Garanhuns','BRA','Pernambuco',114603); +INSERT INTO `city` VALUES (392,'Vit�ria de Santo Ant�o','BRA','Pernambuco',113595); +INSERT INTO `city` VALUES (393,'Santa Rita','BRA','Para�ba',113135); +INSERT INTO `city` VALUES (394,'Barbacena','BRA','Minas Gerais',113079); +INSERT INTO `city` VALUES (395,'Abaetetuba','BRA','Par�',111258); +INSERT INTO `city` VALUES (396,'Ja�','BRA','S�o Paulo',109965); +INSERT INTO `city` VALUES (397,'Lauro de Freitas','BRA','Bahia',109236); +INSERT INTO `city` VALUES (398,'Franco da Rocha','BRA','S�o Paulo',108964); +INSERT INTO `city` VALUES (399,'Teixeira de Freitas','BRA','Bahia',108441); +INSERT INTO `city` VALUES (400,'Varginha','BRA','Minas Gerais',108314); +INSERT INTO `city` VALUES (401,'Ribeir�o Pires','BRA','S�o Paulo',108121); +INSERT INTO `city` VALUES (402,'Sabar�','BRA','Minas Gerais',107781); +INSERT INTO `city` VALUES (403,'Catanduva','BRA','S�o Paulo',107761); +INSERT INTO `city` VALUES (404,'Rio Verde','BRA','Goi�s',107755); +INSERT INTO `city` VALUES (405,'Botucatu','BRA','S�o Paulo',107663); +INSERT INTO `city` VALUES (406,'Colatina','BRA','Esp�rito Santo',107354); +INSERT INTO `city` VALUES (407,'Santa Cruz do Sul','BRA','Rio Grande do Sul',106734); +INSERT INTO `city` VALUES (408,'Linhares','BRA','Esp�rito Santo',106278); +INSERT INTO `city` VALUES (409,'Apucarana','BRA','Paran�',105114); +INSERT INTO `city` VALUES (410,'Barretos','BRA','S�o Paulo',104156); +INSERT INTO `city` VALUES (411,'Guaratinguet�','BRA','S�o Paulo',103433); +INSERT INTO `city` VALUES (412,'Cachoeirinha','BRA','Rio Grande do Sul',103240); +INSERT INTO `city` VALUES (413,'Cod�','BRA','Maranh�o',103153); +INSERT INTO `city` VALUES (414,'Jaragu� do Sul','BRA','Santa Catarina',102580); +INSERT INTO `city` VALUES (415,'Cubat�o','BRA','S�o Paulo',102372); +INSERT INTO `city` VALUES (416,'Itabira','BRA','Minas Gerais',102217); +INSERT INTO `city` VALUES (417,'Itaituba','BRA','Par�',101320); +INSERT INTO `city` VALUES (418,'Araras','BRA','S�o Paulo',101046); +INSERT INTO `city` VALUES (419,'Resende','BRA','Rio de Janeiro',100627); +INSERT INTO `city` VALUES (420,'Atibaia','BRA','S�o Paulo',100356); +INSERT INTO `city` VALUES (421,'Pouso Alegre','BRA','Minas Gerais',100028); +INSERT INTO `city` VALUES (422,'Toledo','BRA','Paran�',99387); +INSERT INTO `city` VALUES (423,'Crato','BRA','Cear�',98965); +INSERT INTO `city` VALUES (424,'Passos','BRA','Minas Gerais',98570); +INSERT INTO `city` VALUES (425,'Araguari','BRA','Minas Gerais',98399); +INSERT INTO `city` VALUES (426,'S�o Jos� de Ribamar','BRA','Maranh�o',98318); +INSERT INTO `city` VALUES (427,'Pinhais','BRA','Paran�',98198); +INSERT INTO `city` VALUES (428,'Sert�ozinho','BRA','S�o Paulo',98140); +INSERT INTO `city` VALUES (429,'Conselheiro Lafaiete','BRA','Minas Gerais',97507); +INSERT INTO `city` VALUES (430,'Paulo Afonso','BRA','Bahia',97291); +INSERT INTO `city` VALUES (431,'Angra dos Reis','BRA','Rio de Janeiro',96864); +INSERT INTO `city` VALUES (432,'Eun�polis','BRA','Bahia',96610); +INSERT INTO `city` VALUES (433,'Salto','BRA','S�o Paulo',96348); +INSERT INTO `city` VALUES (434,'Ourinhos','BRA','S�o Paulo',96291); +INSERT INTO `city` VALUES (435,'Parnamirim','BRA','Rio Grande do Norte',96210); +INSERT INTO `city` VALUES (436,'Jacobina','BRA','Bahia',96131); +INSERT INTO `city` VALUES (437,'Coronel Fabriciano','BRA','Minas Gerais',95933); +INSERT INTO `city` VALUES (438,'Birigui','BRA','S�o Paulo',94685); +INSERT INTO `city` VALUES (439,'Tatu�','BRA','S�o Paulo',93897); +INSERT INTO `city` VALUES (440,'Ji-Paran�','BRA','Rond�nia',93346); +INSERT INTO `city` VALUES (441,'Bacabal','BRA','Maranh�o',93121); +INSERT INTO `city` VALUES (442,'Camet�','BRA','Par�',92779); +INSERT INTO `city` VALUES (443,'Gua�ba','BRA','Rio Grande do Sul',92224); +INSERT INTO `city` VALUES (444,'S�o Louren�o da Mata','BRA','Pernambuco',91999); +INSERT INTO `city` VALUES (445,'Santana do Livramento','BRA','Rio Grande do Sul',91779); +INSERT INTO `city` VALUES (446,'Votorantim','BRA','S�o Paulo',91777); +INSERT INTO `city` VALUES (447,'Campo Largo','BRA','Paran�',91203); +INSERT INTO `city` VALUES (448,'Patos','BRA','Para�ba',90519); +INSERT INTO `city` VALUES (449,'Ituiutaba','BRA','Minas Gerais',90507); +INSERT INTO `city` VALUES (450,'Corumb�','BRA','Mato Grosso do Sul',90111); +INSERT INTO `city` VALUES (451,'Palho�a','BRA','Santa Catarina',89465); +INSERT INTO `city` VALUES (452,'Barra do Pira�','BRA','Rio de Janeiro',89388); +INSERT INTO `city` VALUES (453,'Bento Gon�alves','BRA','Rio Grande do Sul',89254); +INSERT INTO `city` VALUES (454,'Po�','BRA','S�o Paulo',89236); +INSERT INTO `city` VALUES (455,'�guas Lindas de Goi�s','BRA','Goi�s',89200); +INSERT INTO `city` VALUES (456,'London','GBR','England',7285000); +INSERT INTO `city` VALUES (457,'Birmingham','GBR','England',1013000); +INSERT INTO `city` VALUES (458,'Glasgow','GBR','Scotland',619680); +INSERT INTO `city` VALUES (459,'Liverpool','GBR','England',461000); +INSERT INTO `city` VALUES (460,'Edinburgh','GBR','Scotland',450180); +INSERT INTO `city` VALUES (461,'Sheffield','GBR','England',431607); +INSERT INTO `city` VALUES (462,'Manchester','GBR','England',430000); +INSERT INTO `city` VALUES (463,'Leeds','GBR','England',424194); +INSERT INTO `city` VALUES (464,'Bristol','GBR','England',402000); +INSERT INTO `city` VALUES (465,'Cardiff','GBR','Wales',321000); +INSERT INTO `city` VALUES (466,'Coventry','GBR','England',304000); +INSERT INTO `city` VALUES (467,'Leicester','GBR','England',294000); +INSERT INTO `city` VALUES (468,'Bradford','GBR','England',289376); +INSERT INTO `city` VALUES (469,'Belfast','GBR','North Ireland',287500); +INSERT INTO `city` VALUES (470,'Nottingham','GBR','England',287000); +INSERT INTO `city` VALUES (471,'Kingston upon Hull','GBR','England',262000); +INSERT INTO `city` VALUES (472,'Plymouth','GBR','England',253000); +INSERT INTO `city` VALUES (473,'Stoke-on-Trent','GBR','England',252000); +INSERT INTO `city` VALUES (474,'Wolverhampton','GBR','England',242000); +INSERT INTO `city` VALUES (475,'Derby','GBR','England',236000); +INSERT INTO `city` VALUES (476,'Swansea','GBR','Wales',230000); +INSERT INTO `city` VALUES (477,'Southampton','GBR','England',216000); +INSERT INTO `city` VALUES (478,'Aberdeen','GBR','Scotland',213070); +INSERT INTO `city` VALUES (479,'Northampton','GBR','England',196000); +INSERT INTO `city` VALUES (480,'Dudley','GBR','England',192171); +INSERT INTO `city` VALUES (481,'Portsmouth','GBR','England',190000); +INSERT INTO `city` VALUES (482,'Newcastle upon Tyne','GBR','England',189150); +INSERT INTO `city` VALUES (483,'Sunderland','GBR','England',183310); +INSERT INTO `city` VALUES (484,'Luton','GBR','England',183000); +INSERT INTO `city` VALUES (485,'Swindon','GBR','England',180000); +INSERT INTO `city` VALUES (486,'Southend-on-Sea','GBR','England',176000); +INSERT INTO `city` VALUES (487,'Walsall','GBR','England',174739); +INSERT INTO `city` VALUES (488,'Bournemouth','GBR','England',162000); +INSERT INTO `city` VALUES (489,'Peterborough','GBR','England',156000); +INSERT INTO `city` VALUES (490,'Brighton','GBR','England',156124); +INSERT INTO `city` VALUES (491,'Blackpool','GBR','England',151000); +INSERT INTO `city` VALUES (492,'Dundee','GBR','Scotland',146690); +INSERT INTO `city` VALUES (493,'West Bromwich','GBR','England',146386); +INSERT INTO `city` VALUES (494,'Reading','GBR','England',148000); +INSERT INTO `city` VALUES (495,'Oldbury/Smethwick (Warley)','GBR','England',145542); +INSERT INTO `city` VALUES (496,'Middlesbrough','GBR','England',145000); +INSERT INTO `city` VALUES (497,'Huddersfield','GBR','England',143726); +INSERT INTO `city` VALUES (498,'Oxford','GBR','England',144000); +INSERT INTO `city` VALUES (499,'Poole','GBR','England',141000); +INSERT INTO `city` VALUES (500,'Bolton','GBR','England',139020); +INSERT INTO `city` VALUES (501,'Blackburn','GBR','England',140000); +INSERT INTO `city` VALUES (502,'Newport','GBR','Wales',139000); +INSERT INTO `city` VALUES (503,'Preston','GBR','England',135000); +INSERT INTO `city` VALUES (504,'Stockport','GBR','England',132813); +INSERT INTO `city` VALUES (505,'Norwich','GBR','England',124000); +INSERT INTO `city` VALUES (506,'Rotherham','GBR','England',121380); +INSERT INTO `city` VALUES (507,'Cambridge','GBR','England',121000); +INSERT INTO `city` VALUES (508,'Watford','GBR','England',113080); +INSERT INTO `city` VALUES (509,'Ipswich','GBR','England',114000); +INSERT INTO `city` VALUES (510,'Slough','GBR','England',112000); +INSERT INTO `city` VALUES (511,'Exeter','GBR','England',111000); +INSERT INTO `city` VALUES (512,'Cheltenham','GBR','England',106000); +INSERT INTO `city` VALUES (513,'Gloucester','GBR','England',107000); +INSERT INTO `city` VALUES (514,'Saint Helens','GBR','England',106293); +INSERT INTO `city` VALUES (515,'Sutton Coldfield','GBR','England',106001); +INSERT INTO `city` VALUES (516,'York','GBR','England',104425); +INSERT INTO `city` VALUES (517,'Oldham','GBR','England',103931); +INSERT INTO `city` VALUES (518,'Basildon','GBR','England',100924); +INSERT INTO `city` VALUES (519,'Worthing','GBR','England',100000); +INSERT INTO `city` VALUES (520,'Chelmsford','GBR','England',97451); +INSERT INTO `city` VALUES (521,'Colchester','GBR','England',96063); +INSERT INTO `city` VALUES (522,'Crawley','GBR','England',97000); +INSERT INTO `city` VALUES (523,'Gillingham','GBR','England',92000); +INSERT INTO `city` VALUES (524,'Solihull','GBR','England',94531); +INSERT INTO `city` VALUES (525,'Rochdale','GBR','England',94313); +INSERT INTO `city` VALUES (526,'Birkenhead','GBR','England',93087); +INSERT INTO `city` VALUES (527,'Worcester','GBR','England',95000); +INSERT INTO `city` VALUES (528,'Hartlepool','GBR','England',92000); +INSERT INTO `city` VALUES (529,'Halifax','GBR','England',91069); +INSERT INTO `city` VALUES (530,'Woking/Byfleet','GBR','England',92000); +INSERT INTO `city` VALUES (531,'Southport','GBR','England',90959); +INSERT INTO `city` VALUES (532,'Maidstone','GBR','England',90878); +INSERT INTO `city` VALUES (533,'Eastbourne','GBR','England',90000); +INSERT INTO `city` VALUES (534,'Grimsby','GBR','England',89000); +INSERT INTO `city` VALUES (535,'Saint Helier','GBR','Jersey',27523); +INSERT INTO `city` VALUES (536,'Douglas','GBR','�',23487); +INSERT INTO `city` VALUES (537,'Road Town','VGB','Tortola',8000); +INSERT INTO `city` VALUES (538,'Bandar Seri Begawan','BRN','Brunei and Muara',21484); +INSERT INTO `city` VALUES (539,'Sofija','BGR','Grad Sofija',1122302); +INSERT INTO `city` VALUES (540,'Plovdiv','BGR','Plovdiv',342584); +INSERT INTO `city` VALUES (541,'Varna','BGR','Varna',299801); +INSERT INTO `city` VALUES (542,'Burgas','BGR','Burgas',195255); +INSERT INTO `city` VALUES (543,'Ruse','BGR','Ruse',166467); +INSERT INTO `city` VALUES (544,'Stara Zagora','BGR','Haskovo',147939); +INSERT INTO `city` VALUES (545,'Pleven','BGR','Lovec',121952); +INSERT INTO `city` VALUES (546,'Sliven','BGR','Burgas',105530); +INSERT INTO `city` VALUES (547,'Dobric','BGR','Varna',100399); +INSERT INTO `city` VALUES (548,'�umen','BGR','Varna',94686); +INSERT INTO `city` VALUES (549,'Ouagadougou','BFA','Kadiogo',824000); +INSERT INTO `city` VALUES (550,'Bobo-Dioulasso','BFA','Houet',300000); +INSERT INTO `city` VALUES (551,'Koudougou','BFA','Boulkiemd�',105000); +INSERT INTO `city` VALUES (552,'Bujumbura','BDI','Bujumbura',300000); +INSERT INTO `city` VALUES (553,'George Town','CYM','Grand Cayman',19600); +INSERT INTO `city` VALUES (554,'Santiago de Chile','CHL','Santiago',4703954); +INSERT INTO `city` VALUES (555,'Puente Alto','CHL','Santiago',386236); +INSERT INTO `city` VALUES (556,'Vi�a del Mar','CHL','Valpara�so',312493); +INSERT INTO `city` VALUES (557,'Valpara�so','CHL','Valpara�so',293800); +INSERT INTO `city` VALUES (558,'Talcahuano','CHL','B�ob�o',277752); +INSERT INTO `city` VALUES (559,'Antofagasta','CHL','Antofagasta',251429); +INSERT INTO `city` VALUES (560,'San Bernardo','CHL','Santiago',241910); +INSERT INTO `city` VALUES (561,'Temuco','CHL','La Araucan�a',233041); +INSERT INTO `city` VALUES (562,'Concepci�n','CHL','B�ob�o',217664); +INSERT INTO `city` VALUES (563,'Rancagua','CHL','O�Higgins',212977); +INSERT INTO `city` VALUES (564,'Arica','CHL','Tarapac�',189036); +INSERT INTO `city` VALUES (565,'Talca','CHL','Maule',187557); +INSERT INTO `city` VALUES (566,'Chill�n','CHL','B�ob�o',178182); +INSERT INTO `city` VALUES (567,'Iquique','CHL','Tarapac�',177892); +INSERT INTO `city` VALUES (568,'Los Angeles','CHL','B�ob�o',158215); +INSERT INTO `city` VALUES (569,'Puerto Montt','CHL','Los Lagos',152194); +INSERT INTO `city` VALUES (570,'Coquimbo','CHL','Coquimbo',143353); +INSERT INTO `city` VALUES (571,'Osorno','CHL','Los Lagos',141468); +INSERT INTO `city` VALUES (572,'La Serena','CHL','Coquimbo',137409); +INSERT INTO `city` VALUES (573,'Calama','CHL','Antofagasta',137265); +INSERT INTO `city` VALUES (574,'Valdivia','CHL','Los Lagos',133106); +INSERT INTO `city` VALUES (575,'Punta Arenas','CHL','Magallanes',125631); +INSERT INTO `city` VALUES (576,'Copiap�','CHL','Atacama',120128); +INSERT INTO `city` VALUES (577,'Quilpu�','CHL','Valpara�so',118857); +INSERT INTO `city` VALUES (578,'Curic�','CHL','Maule',115766); +INSERT INTO `city` VALUES (579,'Ovalle','CHL','Coquimbo',94854); +INSERT INTO `city` VALUES (580,'Coronel','CHL','B�ob�o',93061); +INSERT INTO `city` VALUES (581,'San Pedro de la Paz','CHL','B�ob�o',91684); +INSERT INTO `city` VALUES (582,'Melipilla','CHL','Santiago',91056); +INSERT INTO `city` VALUES (583,'Avarua','COK','Rarotonga',11900); +INSERT INTO `city` VALUES (584,'San Jos�','CRI','San Jos�',339131); +INSERT INTO `city` VALUES (585,'Djibouti','DJI','Djibouti',383000); +INSERT INTO `city` VALUES (586,'Roseau','DMA','St George',16243); +INSERT INTO `city` VALUES (587,'Santo Domingo de Guzm�n','DOM','Distrito Nacional',1609966); +INSERT INTO `city` VALUES (588,'Santiago de los Caballeros','DOM','Santiago',365463); +INSERT INTO `city` VALUES (589,'La Romana','DOM','La Romana',140204); +INSERT INTO `city` VALUES (590,'San Pedro de Macor�s','DOM','San Pedro de Macor�s',124735); +INSERT INTO `city` VALUES (591,'San Francisco de Macor�s','DOM','Duarte',108485); +INSERT INTO `city` VALUES (592,'San Felipe de Puerto Plata','DOM','Puerto Plata',89423); +INSERT INTO `city` VALUES (593,'Guayaquil','ECU','Guayas',2070040); +INSERT INTO `city` VALUES (594,'Quito','ECU','Pichincha',1573458); +INSERT INTO `city` VALUES (595,'Cuenca','ECU','Azuay',270353); +INSERT INTO `city` VALUES (596,'Machala','ECU','El Oro',210368); +INSERT INTO `city` VALUES (597,'Santo Domingo de los Colorados','ECU','Pichincha',202111); +INSERT INTO `city` VALUES (598,'Portoviejo','ECU','Manab�',176413); +INSERT INTO `city` VALUES (599,'Ambato','ECU','Tungurahua',169612); +INSERT INTO `city` VALUES (600,'Manta','ECU','Manab�',164739); +INSERT INTO `city` VALUES (601,'Duran [Eloy Alfaro]','ECU','Guayas',152514); +INSERT INTO `city` VALUES (602,'Ibarra','ECU','Imbabura',130643); +INSERT INTO `city` VALUES (603,'Quevedo','ECU','Los R�os',129631); +INSERT INTO `city` VALUES (604,'Milagro','ECU','Guayas',124177); +INSERT INTO `city` VALUES (605,'Loja','ECU','Loja',123875); +INSERT INTO `city` VALUES (606,'R�obamba','ECU','Chimborazo',123163); +INSERT INTO `city` VALUES (607,'Esmeraldas','ECU','Esmeraldas',123045); +INSERT INTO `city` VALUES (608,'Cairo','EGY','Kairo',6789479); +INSERT INTO `city` VALUES (609,'Alexandria','EGY','Aleksandria',3328196); +INSERT INTO `city` VALUES (610,'Giza','EGY','Giza',2221868); +INSERT INTO `city` VALUES (611,'Shubra al-Khayma','EGY','al-Qalyubiya',870716); +INSERT INTO `city` VALUES (612,'Port Said','EGY','Port Said',469533); +INSERT INTO `city` VALUES (613,'Suez','EGY','Suez',417610); +INSERT INTO `city` VALUES (614,'al-Mahallat al-Kubra','EGY','al-Gharbiya',395402); +INSERT INTO `city` VALUES (615,'Tanta','EGY','al-Gharbiya',371010); +INSERT INTO `city` VALUES (616,'al-Mansura','EGY','al-Daqahliya',369621); +INSERT INTO `city` VALUES (617,'Luxor','EGY','Luxor',360503); +INSERT INTO `city` VALUES (618,'Asyut','EGY','Asyut',343498); +INSERT INTO `city` VALUES (619,'Bahtim','EGY','al-Qalyubiya',275807); +INSERT INTO `city` VALUES (620,'Zagazig','EGY','al-Sharqiya',267351); +INSERT INTO `city` VALUES (621,'al-Faiyum','EGY','al-Faiyum',260964); +INSERT INTO `city` VALUES (622,'Ismailia','EGY','Ismailia',254477); +INSERT INTO `city` VALUES (623,'Kafr al-Dawwar','EGY','al-Buhayra',231978); +INSERT INTO `city` VALUES (624,'Assuan','EGY','Assuan',219017); +INSERT INTO `city` VALUES (625,'Damanhur','EGY','al-Buhayra',212203); +INSERT INTO `city` VALUES (626,'al-Minya','EGY','al-Minya',201360); +INSERT INTO `city` VALUES (627,'Bani Suwayf','EGY','Bani Suwayf',172032); +INSERT INTO `city` VALUES (628,'Qina','EGY','Qina',171275); +INSERT INTO `city` VALUES (629,'Sawhaj','EGY','Sawhaj',170125); +INSERT INTO `city` VALUES (630,'Shibin al-Kawm','EGY','al-Minufiya',159909); +INSERT INTO `city` VALUES (631,'Bulaq al-Dakrur','EGY','Giza',148787); +INSERT INTO `city` VALUES (632,'Banha','EGY','al-Qalyubiya',145792); +INSERT INTO `city` VALUES (633,'Warraq al-Arab','EGY','Giza',127108); +INSERT INTO `city` VALUES (634,'Kafr al-Shaykh','EGY','Kafr al-Shaykh',124819); +INSERT INTO `city` VALUES (635,'Mallawi','EGY','al-Minya',119283); +INSERT INTO `city` VALUES (636,'Bilbays','EGY','al-Sharqiya',113608); +INSERT INTO `city` VALUES (637,'Mit Ghamr','EGY','al-Daqahliya',101801); +INSERT INTO `city` VALUES (638,'al-Arish','EGY','Shamal Sina',100447); +INSERT INTO `city` VALUES (639,'Talkha','EGY','al-Daqahliya',97700); +INSERT INTO `city` VALUES (640,'Qalyub','EGY','al-Qalyubiya',97200); +INSERT INTO `city` VALUES (641,'Jirja','EGY','Sawhaj',95400); +INSERT INTO `city` VALUES (642,'Idfu','EGY','Qina',94200); +INSERT INTO `city` VALUES (643,'al-Hawamidiya','EGY','Giza',91700); +INSERT INTO `city` VALUES (644,'Disuq','EGY','Kafr al-Shaykh',91300); +INSERT INTO `city` VALUES (645,'San Salvador','SLV','San Salvador',415346); +INSERT INTO `city` VALUES (646,'Santa Ana','SLV','Santa Ana',139389); +INSERT INTO `city` VALUES (647,'Mejicanos','SLV','San Salvador',138800); +INSERT INTO `city` VALUES (648,'Soyapango','SLV','San Salvador',129800); +INSERT INTO `city` VALUES (649,'San Miguel','SLV','San Miguel',127696); +INSERT INTO `city` VALUES (650,'Nueva San Salvador','SLV','La Libertad',98400); +INSERT INTO `city` VALUES (651,'Apopa','SLV','San Salvador',88800); +INSERT INTO `city` VALUES (652,'Asmara','ERI','Maekel',431000); +INSERT INTO `city` VALUES (653,'Madrid','ESP','Madrid',2879052); +INSERT INTO `city` VALUES (654,'Barcelona','ESP','Katalonia',1503451); +INSERT INTO `city` VALUES (655,'Valencia','ESP','Valencia',739412); +INSERT INTO `city` VALUES (656,'Sevilla','ESP','Andalusia',701927); +INSERT INTO `city` VALUES (657,'Zaragoza','ESP','Aragonia',603367); +INSERT INTO `city` VALUES (658,'M�laga','ESP','Andalusia',530553); +INSERT INTO `city` VALUES (659,'Bilbao','ESP','Baskimaa',357589); +INSERT INTO `city` VALUES (660,'Las Palmas de Gran Canaria','ESP','Canary Islands',354757); +INSERT INTO `city` VALUES (661,'Murcia','ESP','Murcia',353504); +INSERT INTO `city` VALUES (662,'Palma de Mallorca','ESP','Balears',326993); +INSERT INTO `city` VALUES (663,'Valladolid','ESP','Castilla and Le�n',319998); +INSERT INTO `city` VALUES (664,'C�rdoba','ESP','Andalusia',311708); +INSERT INTO `city` VALUES (665,'Vigo','ESP','Galicia',283670); +INSERT INTO `city` VALUES (666,'Alicante [Alacant]','ESP','Valencia',272432); +INSERT INTO `city` VALUES (667,'Gij�n','ESP','Asturia',267980); +INSERT INTO `city` VALUES (668,'L�Hospitalet de Llobregat','ESP','Katalonia',247986); +INSERT INTO `city` VALUES (669,'Granada','ESP','Andalusia',244767); +INSERT INTO `city` VALUES (670,'A Coru�a (La Coru�a)','ESP','Galicia',243402); +INSERT INTO `city` VALUES (671,'Vitoria-Gasteiz','ESP','Baskimaa',217154); +INSERT INTO `city` VALUES (672,'Santa Cruz de Tenerife','ESP','Canary Islands',213050); +INSERT INTO `city` VALUES (673,'Badalona','ESP','Katalonia',209635); +INSERT INTO `city` VALUES (674,'Oviedo','ESP','Asturia',200453); +INSERT INTO `city` VALUES (675,'M�stoles','ESP','Madrid',195351); +INSERT INTO `city` VALUES (676,'Elche [Elx]','ESP','Valencia',193174); +INSERT INTO `city` VALUES (677,'Sabadell','ESP','Katalonia',184859); +INSERT INTO `city` VALUES (678,'Santander','ESP','Cantabria',184165); +INSERT INTO `city` VALUES (679,'Jerez de la Frontera','ESP','Andalusia',182660); +INSERT INTO `city` VALUES (680,'Pamplona [Iru�a]','ESP','Navarra',180483); +INSERT INTO `city` VALUES (681,'Donostia-San Sebasti�n','ESP','Baskimaa',179208); +INSERT INTO `city` VALUES (682,'Cartagena','ESP','Murcia',177709); +INSERT INTO `city` VALUES (683,'Legan�s','ESP','Madrid',173163); +INSERT INTO `city` VALUES (684,'Fuenlabrada','ESP','Madrid',171173); +INSERT INTO `city` VALUES (685,'Almer�a','ESP','Andalusia',169027); +INSERT INTO `city` VALUES (686,'Terrassa','ESP','Katalonia',168695); +INSERT INTO `city` VALUES (687,'Alcal� de Henares','ESP','Madrid',164463); +INSERT INTO `city` VALUES (688,'Burgos','ESP','Castilla and Le�n',162802); +INSERT INTO `city` VALUES (689,'Salamanca','ESP','Castilla and Le�n',158720); +INSERT INTO `city` VALUES (690,'Albacete','ESP','Kastilia-La Mancha',147527); +INSERT INTO `city` VALUES (691,'Getafe','ESP','Madrid',145371); +INSERT INTO `city` VALUES (692,'C�diz','ESP','Andalusia',142449); +INSERT INTO `city` VALUES (693,'Alcorc�n','ESP','Madrid',142048); +INSERT INTO `city` VALUES (694,'Huelva','ESP','Andalusia',140583); +INSERT INTO `city` VALUES (695,'Le�n','ESP','Castilla and Le�n',139809); +INSERT INTO `city` VALUES (696,'Castell�n de la Plana [Castell','ESP','Valencia',139712); +INSERT INTO `city` VALUES (697,'Badajoz','ESP','Extremadura',136613); +INSERT INTO `city` VALUES (698,'[San Crist�bal de] la Laguna','ESP','Canary Islands',127945); +INSERT INTO `city` VALUES (699,'Logro�o','ESP','La Rioja',127093); +INSERT INTO `city` VALUES (700,'Santa Coloma de Gramenet','ESP','Katalonia',120802); +INSERT INTO `city` VALUES (701,'Tarragona','ESP','Katalonia',113016); +INSERT INTO `city` VALUES (702,'Lleida (L�rida)','ESP','Katalonia',112207); +INSERT INTO `city` VALUES (703,'Ja�n','ESP','Andalusia',109247); +INSERT INTO `city` VALUES (704,'Ourense (Orense)','ESP','Galicia',109120); +INSERT INTO `city` VALUES (705,'Matar�','ESP','Katalonia',104095); +INSERT INTO `city` VALUES (706,'Algeciras','ESP','Andalusia',103106); +INSERT INTO `city` VALUES (707,'Marbella','ESP','Andalusia',101144); +INSERT INTO `city` VALUES (708,'Barakaldo','ESP','Baskimaa',98212); +INSERT INTO `city` VALUES (709,'Dos Hermanas','ESP','Andalusia',94591); +INSERT INTO `city` VALUES (710,'Santiago de Compostela','ESP','Galicia',93745); +INSERT INTO `city` VALUES (711,'Torrej�n de Ardoz','ESP','Madrid',92262); +INSERT INTO `city` VALUES (712,'Cape Town','ZAF','Western Cape',2352121); +INSERT INTO `city` VALUES (713,'Soweto','ZAF','Gauteng',904165); +INSERT INTO `city` VALUES (714,'Johannesburg','ZAF','Gauteng',756653); +INSERT INTO `city` VALUES (715,'Port Elizabeth','ZAF','Eastern Cape',752319); +INSERT INTO `city` VALUES (716,'Pretoria','ZAF','Gauteng',658630); +INSERT INTO `city` VALUES (717,'Inanda','ZAF','KwaZulu-Natal',634065); +INSERT INTO `city` VALUES (718,'Durban','ZAF','KwaZulu-Natal',566120); +INSERT INTO `city` VALUES (719,'Vanderbijlpark','ZAF','Gauteng',468931); +INSERT INTO `city` VALUES (720,'Kempton Park','ZAF','Gauteng',442633); +INSERT INTO `city` VALUES (721,'Alberton','ZAF','Gauteng',410102); +INSERT INTO `city` VALUES (722,'Pinetown','ZAF','KwaZulu-Natal',378810); +INSERT INTO `city` VALUES (723,'Pietermaritzburg','ZAF','KwaZulu-Natal',370190); +INSERT INTO `city` VALUES (724,'Benoni','ZAF','Gauteng',365467); +INSERT INTO `city` VALUES (725,'Randburg','ZAF','Gauteng',341288); +INSERT INTO `city` VALUES (726,'Umlazi','ZAF','KwaZulu-Natal',339233); +INSERT INTO `city` VALUES (727,'Bloemfontein','ZAF','Free State',334341); +INSERT INTO `city` VALUES (728,'Vereeniging','ZAF','Gauteng',328535); +INSERT INTO `city` VALUES (729,'Wonderboom','ZAF','Gauteng',283289); +INSERT INTO `city` VALUES (730,'Roodepoort','ZAF','Gauteng',279340); +INSERT INTO `city` VALUES (731,'Boksburg','ZAF','Gauteng',262648); +INSERT INTO `city` VALUES (732,'Klerksdorp','ZAF','North West',261911); +INSERT INTO `city` VALUES (733,'Soshanguve','ZAF','Gauteng',242727); +INSERT INTO `city` VALUES (734,'Newcastle','ZAF','KwaZulu-Natal',222993); +INSERT INTO `city` VALUES (735,'East London','ZAF','Eastern Cape',221047); +INSERT INTO `city` VALUES (736,'Welkom','ZAF','Free State',203296); +INSERT INTO `city` VALUES (737,'Kimberley','ZAF','Northern Cape',197254); +INSERT INTO `city` VALUES (738,'Uitenhage','ZAF','Eastern Cape',192120); +INSERT INTO `city` VALUES (739,'Chatsworth','ZAF','KwaZulu-Natal',189885); +INSERT INTO `city` VALUES (740,'Mdantsane','ZAF','Eastern Cape',182639); +INSERT INTO `city` VALUES (741,'Krugersdorp','ZAF','Gauteng',181503); +INSERT INTO `city` VALUES (742,'Botshabelo','ZAF','Free State',177971); +INSERT INTO `city` VALUES (743,'Brakpan','ZAF','Gauteng',171363); +INSERT INTO `city` VALUES (744,'Witbank','ZAF','Mpumalanga',167183); +INSERT INTO `city` VALUES (745,'Oberholzer','ZAF','Gauteng',164367); +INSERT INTO `city` VALUES (746,'Germiston','ZAF','Gauteng',164252); +INSERT INTO `city` VALUES (747,'Springs','ZAF','Gauteng',162072); +INSERT INTO `city` VALUES (748,'Westonaria','ZAF','Gauteng',159632); +INSERT INTO `city` VALUES (749,'Randfontein','ZAF','Gauteng',120838); +INSERT INTO `city` VALUES (750,'Paarl','ZAF','Western Cape',105768); +INSERT INTO `city` VALUES (751,'Potchefstroom','ZAF','North West',101817); +INSERT INTO `city` VALUES (752,'Rustenburg','ZAF','North West',97008); +INSERT INTO `city` VALUES (753,'Nigel','ZAF','Gauteng',96734); +INSERT INTO `city` VALUES (754,'George','ZAF','Western Cape',93818); +INSERT INTO `city` VALUES (755,'Ladysmith','ZAF','KwaZulu-Natal',89292); +INSERT INTO `city` VALUES (756,'Addis Abeba','ETH','Addis Abeba',2495000); +INSERT INTO `city` VALUES (757,'Dire Dawa','ETH','Dire Dawa',164851); +INSERT INTO `city` VALUES (758,'Nazret','ETH','Oromia',127842); +INSERT INTO `city` VALUES (759,'Gonder','ETH','Amhara',112249); +INSERT INTO `city` VALUES (760,'Dese','ETH','Amhara',97314); +INSERT INTO `city` VALUES (761,'Mekele','ETH','Tigray',96938); +INSERT INTO `city` VALUES (762,'Bahir Dar','ETH','Amhara',96140); +INSERT INTO `city` VALUES (763,'Stanley','FLK','East Falkland',1636); +INSERT INTO `city` VALUES (764,'Suva','FJI','Central',77366); +INSERT INTO `city` VALUES (765,'Quezon','PHL','National Capital Reg',2173831); +INSERT INTO `city` VALUES (766,'Manila','PHL','National Capital Reg',1581082); +INSERT INTO `city` VALUES (767,'Kalookan','PHL','National Capital Reg',1177604); +INSERT INTO `city` VALUES (768,'Davao','PHL','Southern Mindanao',1147116); +INSERT INTO `city` VALUES (769,'Cebu','PHL','Central Visayas',718821); +INSERT INTO `city` VALUES (770,'Zamboanga','PHL','Western Mindanao',601794); +INSERT INTO `city` VALUES (771,'Pasig','PHL','National Capital Reg',505058); +INSERT INTO `city` VALUES (772,'Valenzuela','PHL','National Capital Reg',485433); +INSERT INTO `city` VALUES (773,'Las Pi�as','PHL','National Capital Reg',472780); +INSERT INTO `city` VALUES (774,'Antipolo','PHL','Southern Tagalog',470866); +INSERT INTO `city` VALUES (775,'Taguig','PHL','National Capital Reg',467375); +INSERT INTO `city` VALUES (776,'Cagayan de Oro','PHL','Northern Mindanao',461877); +INSERT INTO `city` VALUES (777,'Para�aque','PHL','National Capital Reg',449811); +INSERT INTO `city` VALUES (778,'Makati','PHL','National Capital Reg',444867); +INSERT INTO `city` VALUES (779,'Bacolod','PHL','Western Visayas',429076); +INSERT INTO `city` VALUES (780,'General Santos','PHL','Southern Mindanao',411822); +INSERT INTO `city` VALUES (781,'Marikina','PHL','National Capital Reg',391170); +INSERT INTO `city` VALUES (782,'Dasmari�as','PHL','Southern Tagalog',379520); +INSERT INTO `city` VALUES (783,'Muntinlupa','PHL','National Capital Reg',379310); +INSERT INTO `city` VALUES (784,'Iloilo','PHL','Western Visayas',365820); +INSERT INTO `city` VALUES (785,'Pasay','PHL','National Capital Reg',354908); +INSERT INTO `city` VALUES (786,'Malabon','PHL','National Capital Reg',338855); +INSERT INTO `city` VALUES (787,'San Jos� del Monte','PHL','Central Luzon',315807); +INSERT INTO `city` VALUES (788,'Bacoor','PHL','Southern Tagalog',305699); +INSERT INTO `city` VALUES (789,'Iligan','PHL','Central Mindanao',285061); +INSERT INTO `city` VALUES (790,'Calamba','PHL','Southern Tagalog',281146); +INSERT INTO `city` VALUES (791,'Mandaluyong','PHL','National Capital Reg',278474); +INSERT INTO `city` VALUES (792,'Butuan','PHL','Caraga',267279); +INSERT INTO `city` VALUES (793,'Angeles','PHL','Central Luzon',263971); +INSERT INTO `city` VALUES (794,'Tarlac','PHL','Central Luzon',262481); +INSERT INTO `city` VALUES (795,'Mandaue','PHL','Central Visayas',259728); +INSERT INTO `city` VALUES (796,'Baguio','PHL','CAR',252386); +INSERT INTO `city` VALUES (797,'Batangas','PHL','Southern Tagalog',247588); +INSERT INTO `city` VALUES (798,'Cainta','PHL','Southern Tagalog',242511); +INSERT INTO `city` VALUES (799,'San Pedro','PHL','Southern Tagalog',231403); +INSERT INTO `city` VALUES (800,'Navotas','PHL','National Capital Reg',230403); +INSERT INTO `city` VALUES (801,'Cabanatuan','PHL','Central Luzon',222859); +INSERT INTO `city` VALUES (802,'San Fernando','PHL','Central Luzon',221857); +INSERT INTO `city` VALUES (803,'Lipa','PHL','Southern Tagalog',218447); +INSERT INTO `city` VALUES (804,'Lapu-Lapu','PHL','Central Visayas',217019); +INSERT INTO `city` VALUES (805,'San Pablo','PHL','Southern Tagalog',207927); +INSERT INTO `city` VALUES (806,'Bi�an','PHL','Southern Tagalog',201186); +INSERT INTO `city` VALUES (807,'Taytay','PHL','Southern Tagalog',198183); +INSERT INTO `city` VALUES (808,'Lucena','PHL','Southern Tagalog',196075); +INSERT INTO `city` VALUES (809,'Imus','PHL','Southern Tagalog',195482); +INSERT INTO `city` VALUES (810,'Olongapo','PHL','Central Luzon',194260); +INSERT INTO `city` VALUES (811,'Binangonan','PHL','Southern Tagalog',187691); +INSERT INTO `city` VALUES (812,'Santa Rosa','PHL','Southern Tagalog',185633); +INSERT INTO `city` VALUES (813,'Tagum','PHL','Southern Mindanao',179531); +INSERT INTO `city` VALUES (814,'Tacloban','PHL','Eastern Visayas',178639); +INSERT INTO `city` VALUES (815,'Malolos','PHL','Central Luzon',175291); +INSERT INTO `city` VALUES (816,'Mabalacat','PHL','Central Luzon',171045); +INSERT INTO `city` VALUES (817,'Cotabato','PHL','Central Mindanao',163849); +INSERT INTO `city` VALUES (818,'Meycauayan','PHL','Central Luzon',163037); +INSERT INTO `city` VALUES (819,'Puerto Princesa','PHL','Southern Tagalog',161912); +INSERT INTO `city` VALUES (820,'Legazpi','PHL','Bicol',157010); +INSERT INTO `city` VALUES (821,'Silang','PHL','Southern Tagalog',156137); +INSERT INTO `city` VALUES (822,'Ormoc','PHL','Eastern Visayas',154297); +INSERT INTO `city` VALUES (823,'San Carlos','PHL','Ilocos',154264); +INSERT INTO `city` VALUES (824,'Kabankalan','PHL','Western Visayas',149769); +INSERT INTO `city` VALUES (825,'Talisay','PHL','Central Visayas',148110); +INSERT INTO `city` VALUES (826,'Valencia','PHL','Northern Mindanao',147924); +INSERT INTO `city` VALUES (827,'Calbayog','PHL','Eastern Visayas',147187); +INSERT INTO `city` VALUES (828,'Santa Maria','PHL','Central Luzon',144282); +INSERT INTO `city` VALUES (829,'Pagadian','PHL','Western Mindanao',142515); +INSERT INTO `city` VALUES (830,'Cadiz','PHL','Western Visayas',141954); +INSERT INTO `city` VALUES (831,'Bago','PHL','Western Visayas',141721); +INSERT INTO `city` VALUES (832,'Toledo','PHL','Central Visayas',141174); +INSERT INTO `city` VALUES (833,'Naga','PHL','Bicol',137810); +INSERT INTO `city` VALUES (834,'San Mateo','PHL','Southern Tagalog',135603); +INSERT INTO `city` VALUES (835,'Panabo','PHL','Southern Mindanao',133950); +INSERT INTO `city` VALUES (836,'Koronadal','PHL','Southern Mindanao',133786); +INSERT INTO `city` VALUES (837,'Marawi','PHL','Central Mindanao',131090); +INSERT INTO `city` VALUES (838,'Dagupan','PHL','Ilocos',130328); +INSERT INTO `city` VALUES (839,'Sagay','PHL','Western Visayas',129765); +INSERT INTO `city` VALUES (840,'Roxas','PHL','Western Visayas',126352); +INSERT INTO `city` VALUES (841,'Lubao','PHL','Central Luzon',125699); +INSERT INTO `city` VALUES (842,'Digos','PHL','Southern Mindanao',125171); +INSERT INTO `city` VALUES (843,'San Miguel','PHL','Central Luzon',123824); +INSERT INTO `city` VALUES (844,'Malaybalay','PHL','Northern Mindanao',123672); +INSERT INTO `city` VALUES (845,'Tuguegarao','PHL','Cagayan Valley',120645); +INSERT INTO `city` VALUES (846,'Ilagan','PHL','Cagayan Valley',119990); +INSERT INTO `city` VALUES (847,'Baliuag','PHL','Central Luzon',119675); +INSERT INTO `city` VALUES (848,'Surigao','PHL','Caraga',118534); +INSERT INTO `city` VALUES (849,'San Carlos','PHL','Western Visayas',118259); +INSERT INTO `city` VALUES (850,'San Juan del Monte','PHL','National Capital Reg',117680); +INSERT INTO `city` VALUES (851,'Tanauan','PHL','Southern Tagalog',117539); +INSERT INTO `city` VALUES (852,'Concepcion','PHL','Central Luzon',115171); +INSERT INTO `city` VALUES (853,'Rodriguez (Montalban)','PHL','Southern Tagalog',115167); +INSERT INTO `city` VALUES (854,'Sariaya','PHL','Southern Tagalog',114568); +INSERT INTO `city` VALUES (855,'Malasiqui','PHL','Ilocos',113190); +INSERT INTO `city` VALUES (856,'General Mariano Alvarez','PHL','Southern Tagalog',112446); +INSERT INTO `city` VALUES (857,'Urdaneta','PHL','Ilocos',111582); +INSERT INTO `city` VALUES (858,'Hagonoy','PHL','Central Luzon',111425); +INSERT INTO `city` VALUES (859,'San Jose','PHL','Southern Tagalog',111009); +INSERT INTO `city` VALUES (860,'Polomolok','PHL','Southern Mindanao',110709); +INSERT INTO `city` VALUES (861,'Santiago','PHL','Cagayan Valley',110531); +INSERT INTO `city` VALUES (862,'Tanza','PHL','Southern Tagalog',110517); +INSERT INTO `city` VALUES (863,'Ozamis','PHL','Northern Mindanao',110420); +INSERT INTO `city` VALUES (864,'Mexico','PHL','Central Luzon',109481); +INSERT INTO `city` VALUES (865,'San Jose','PHL','Central Luzon',108254); +INSERT INTO `city` VALUES (866,'Silay','PHL','Western Visayas',107722); +INSERT INTO `city` VALUES (867,'General Trias','PHL','Southern Tagalog',107691); +INSERT INTO `city` VALUES (868,'Tabaco','PHL','Bicol',107166); +INSERT INTO `city` VALUES (869,'Cabuyao','PHL','Southern Tagalog',106630); +INSERT INTO `city` VALUES (870,'Calapan','PHL','Southern Tagalog',105910); +INSERT INTO `city` VALUES (871,'Mati','PHL','Southern Mindanao',105908); +INSERT INTO `city` VALUES (872,'Midsayap','PHL','Central Mindanao',105760); +INSERT INTO `city` VALUES (873,'Cauayan','PHL','Cagayan Valley',103952); +INSERT INTO `city` VALUES (874,'Gingoog','PHL','Northern Mindanao',102379); +INSERT INTO `city` VALUES (875,'Dumaguete','PHL','Central Visayas',102265); +INSERT INTO `city` VALUES (876,'San Fernando','PHL','Ilocos',102082); +INSERT INTO `city` VALUES (877,'Arayat','PHL','Central Luzon',101792); +INSERT INTO `city` VALUES (878,'Bayawan (Tulong)','PHL','Central Visayas',101391); +INSERT INTO `city` VALUES (879,'Kidapawan','PHL','Central Mindanao',101205); +INSERT INTO `city` VALUES (880,'Daraga (Locsin)','PHL','Bicol',101031); +INSERT INTO `city` VALUES (881,'Marilao','PHL','Central Luzon',101017); +INSERT INTO `city` VALUES (882,'Malita','PHL','Southern Mindanao',100000); +INSERT INTO `city` VALUES (883,'Dipolog','PHL','Western Mindanao',99862); +INSERT INTO `city` VALUES (884,'Cavite','PHL','Southern Tagalog',99367); +INSERT INTO `city` VALUES (885,'Danao','PHL','Central Visayas',98781); +INSERT INTO `city` VALUES (886,'Bislig','PHL','Caraga',97860); +INSERT INTO `city` VALUES (887,'Talavera','PHL','Central Luzon',97329); +INSERT INTO `city` VALUES (888,'Guagua','PHL','Central Luzon',96858); +INSERT INTO `city` VALUES (889,'Bayambang','PHL','Ilocos',96609); +INSERT INTO `city` VALUES (890,'Nasugbu','PHL','Southern Tagalog',96113); +INSERT INTO `city` VALUES (891,'Baybay','PHL','Eastern Visayas',95630); +INSERT INTO `city` VALUES (892,'Capas','PHL','Central Luzon',95219); +INSERT INTO `city` VALUES (893,'Sultan Kudarat','PHL','ARMM',94861); +INSERT INTO `city` VALUES (894,'Laoag','PHL','Ilocos',94466); +INSERT INTO `city` VALUES (895,'Bayugan','PHL','Caraga',93623); +INSERT INTO `city` VALUES (896,'Malungon','PHL','Southern Mindanao',93232); +INSERT INTO `city` VALUES (897,'Santa Cruz','PHL','Southern Tagalog',92694); +INSERT INTO `city` VALUES (898,'Sorsogon','PHL','Bicol',92512); +INSERT INTO `city` VALUES (899,'Candelaria','PHL','Southern Tagalog',92429); +INSERT INTO `city` VALUES (900,'Ligao','PHL','Bicol',90603); +INSERT INTO `city` VALUES (901,'T�rshavn','FRO','Streymoyar',14542); +INSERT INTO `city` VALUES (902,'Libreville','GAB','Estuaire',419000); +INSERT INTO `city` VALUES (903,'Serekunda','GMB','Kombo St Mary',102600); +INSERT INTO `city` VALUES (904,'Banjul','GMB','Banjul',42326); +INSERT INTO `city` VALUES (905,'Tbilisi','GEO','Tbilisi',1235200); +INSERT INTO `city` VALUES (906,'Kutaisi','GEO','Imereti',240900); +INSERT INTO `city` VALUES (907,'Rustavi','GEO','Kvemo Kartli',155400); +INSERT INTO `city` VALUES (908,'Batumi','GEO','Adzaria [At�ara]',137700); +INSERT INTO `city` VALUES (909,'Sohumi','GEO','Abhasia [Aphazeti]',111700); +INSERT INTO `city` VALUES (910,'Accra','GHA','Greater Accra',1070000); +INSERT INTO `city` VALUES (911,'Kumasi','GHA','Ashanti',385192); +INSERT INTO `city` VALUES (912,'Tamale','GHA','Northern',151069); +INSERT INTO `city` VALUES (913,'Tema','GHA','Greater Accra',109975); +INSERT INTO `city` VALUES (914,'Sekondi-Takoradi','GHA','Western',103653); +INSERT INTO `city` VALUES (915,'Gibraltar','GIB','�',27025); +INSERT INTO `city` VALUES (916,'Saint George�s','GRD','St George',4621); +INSERT INTO `city` VALUES (917,'Nuuk','GRL','Kitaa',13445); +INSERT INTO `city` VALUES (918,'Les Abymes','GLP','Grande-Terre',62947); +INSERT INTO `city` VALUES (919,'Basse-Terre','GLP','Basse-Terre',12433); +INSERT INTO `city` VALUES (920,'Tamuning','GUM','�',9500); +INSERT INTO `city` VALUES (921,'Aga�a','GUM','�',1139); +INSERT INTO `city` VALUES (922,'Ciudad de Guatemala','GTM','Guatemala',823301); +INSERT INTO `city` VALUES (923,'Mixco','GTM','Guatemala',209791); +INSERT INTO `city` VALUES (924,'Villa Nueva','GTM','Guatemala',101295); +INSERT INTO `city` VALUES (925,'Quetzaltenango','GTM','Quetzaltenango',90801); +INSERT INTO `city` VALUES (926,'Conakry','GIN','Conakry',1090610); +INSERT INTO `city` VALUES (927,'Bissau','GNB','Bissau',241000); +INSERT INTO `city` VALUES (928,'Georgetown','GUY','Georgetown',254000); +INSERT INTO `city` VALUES (929,'Port-au-Prince','HTI','Ouest',884472); +INSERT INTO `city` VALUES (930,'Carrefour','HTI','Ouest',290204); +INSERT INTO `city` VALUES (931,'Delmas','HTI','Ouest',240429); +INSERT INTO `city` VALUES (932,'Le-Cap-Ha�tien','HTI','Nord',102233); +INSERT INTO `city` VALUES (933,'Tegucigalpa','HND','Distrito Central',813900); +INSERT INTO `city` VALUES (934,'San Pedro Sula','HND','Cort�s',383900); +INSERT INTO `city` VALUES (935,'La Ceiba','HND','Atl�ntida',89200); +INSERT INTO `city` VALUES (936,'Kowloon and New Kowloon','HKG','Kowloon and New Kowl',1987996); +INSERT INTO `city` VALUES (937,'Victoria','HKG','Hongkong',1312637); +INSERT INTO `city` VALUES (938,'Longyearbyen','SJM','L�nsimaa',1438); +INSERT INTO `city` VALUES (939,'Jakarta','IDN','Jakarta Raya',9604900); +INSERT INTO `city` VALUES (940,'Surabaya','IDN','East Java',2663820); +INSERT INTO `city` VALUES (941,'Bandung','IDN','West Java',2429000); +INSERT INTO `city` VALUES (942,'Medan','IDN','Sumatera Utara',1843919); +INSERT INTO `city` VALUES (943,'Palembang','IDN','Sumatera Selatan',1222764); +INSERT INTO `city` VALUES (944,'Tangerang','IDN','West Java',1198300); +INSERT INTO `city` VALUES (945,'Semarang','IDN','Central Java',1104405); +INSERT INTO `city` VALUES (946,'Ujung Pandang','IDN','Sulawesi Selatan',1060257); +INSERT INTO `city` VALUES (947,'Malang','IDN','East Java',716862); +INSERT INTO `city` VALUES (948,'Bandar Lampung','IDN','Lampung',680332); +INSERT INTO `city` VALUES (949,'Bekasi','IDN','West Java',644300); +INSERT INTO `city` VALUES (950,'Padang','IDN','Sumatera Barat',534474); +INSERT INTO `city` VALUES (951,'Surakarta','IDN','Central Java',518600); +INSERT INTO `city` VALUES (952,'Banjarmasin','IDN','Kalimantan Selatan',482931); +INSERT INTO `city` VALUES (953,'Pekan Baru','IDN','Riau',438638); +INSERT INTO `city` VALUES (954,'Denpasar','IDN','Bali',435000); +INSERT INTO `city` VALUES (955,'Yogyakarta','IDN','Yogyakarta',418944); +INSERT INTO `city` VALUES (956,'Pontianak','IDN','Kalimantan Barat',409632); +INSERT INTO `city` VALUES (957,'Samarinda','IDN','Kalimantan Timur',399175); +INSERT INTO `city` VALUES (958,'Jambi','IDN','Jambi',385201); +INSERT INTO `city` VALUES (959,'Depok','IDN','West Java',365200); +INSERT INTO `city` VALUES (960,'Cimahi','IDN','West Java',344600); +INSERT INTO `city` VALUES (961,'Balikpapan','IDN','Kalimantan Timur',338752); +INSERT INTO `city` VALUES (962,'Manado','IDN','Sulawesi Utara',332288); +INSERT INTO `city` VALUES (963,'Mataram','IDN','Nusa Tenggara Barat',306600); +INSERT INTO `city` VALUES (964,'Pekalongan','IDN','Central Java',301504); +INSERT INTO `city` VALUES (965,'Tegal','IDN','Central Java',289744); +INSERT INTO `city` VALUES (966,'Bogor','IDN','West Java',285114); +INSERT INTO `city` VALUES (967,'Ciputat','IDN','West Java',270800); +INSERT INTO `city` VALUES (968,'Pondokgede','IDN','West Java',263200); +INSERT INTO `city` VALUES (969,'Cirebon','IDN','West Java',254406); +INSERT INTO `city` VALUES (970,'Kediri','IDN','East Java',253760); +INSERT INTO `city` VALUES (971,'Ambon','IDN','Molukit',249312); +INSERT INTO `city` VALUES (972,'Jember','IDN','East Java',218500); +INSERT INTO `city` VALUES (973,'Cilacap','IDN','Central Java',206900); +INSERT INTO `city` VALUES (974,'Cimanggis','IDN','West Java',205100); +INSERT INTO `city` VALUES (975,'Pematang Siantar','IDN','Sumatera Utara',203056); +INSERT INTO `city` VALUES (976,'Purwokerto','IDN','Central Java',202500); +INSERT INTO `city` VALUES (977,'Ciomas','IDN','West Java',187400); +INSERT INTO `city` VALUES (978,'Tasikmalaya','IDN','West Java',179800); +INSERT INTO `city` VALUES (979,'Madiun','IDN','East Java',171532); +INSERT INTO `city` VALUES (980,'Bengkulu','IDN','Bengkulu',146439); +INSERT INTO `city` VALUES (981,'Karawang','IDN','West Java',145000); +INSERT INTO `city` VALUES (982,'Banda Aceh','IDN','Aceh',143409); +INSERT INTO `city` VALUES (983,'Palu','IDN','Sulawesi Tengah',142800); +INSERT INTO `city` VALUES (984,'Pasuruan','IDN','East Java',134019); +INSERT INTO `city` VALUES (985,'Kupang','IDN','Nusa Tenggara Timur',129300); +INSERT INTO `city` VALUES (986,'Tebing Tinggi','IDN','Sumatera Utara',129300); +INSERT INTO `city` VALUES (987,'Percut Sei Tuan','IDN','Sumatera Utara',129000); +INSERT INTO `city` VALUES (988,'Binjai','IDN','Sumatera Utara',127222); +INSERT INTO `city` VALUES (989,'Sukabumi','IDN','West Java',125766); +INSERT INTO `city` VALUES (990,'Waru','IDN','East Java',124300); +INSERT INTO `city` VALUES (991,'Pangkal Pinang','IDN','Sumatera Selatan',124000); +INSERT INTO `city` VALUES (992,'Magelang','IDN','Central Java',123800); +INSERT INTO `city` VALUES (993,'Blitar','IDN','East Java',122600); +INSERT INTO `city` VALUES (994,'Serang','IDN','West Java',122400); +INSERT INTO `city` VALUES (995,'Probolinggo','IDN','East Java',120770); +INSERT INTO `city` VALUES (996,'Cilegon','IDN','West Java',117000); +INSERT INTO `city` VALUES (997,'Cianjur','IDN','West Java',114300); +INSERT INTO `city` VALUES (998,'Ciparay','IDN','West Java',111500); +INSERT INTO `city` VALUES (999,'Lhokseumawe','IDN','Aceh',109600); +INSERT INTO `city` VALUES (1000,'Taman','IDN','East Java',107000); +INSERT INTO `city` VALUES (1001,'Depok','IDN','Yogyakarta',106800); +INSERT INTO `city` VALUES (1002,'Citeureup','IDN','West Java',105100); +INSERT INTO `city` VALUES (1003,'Pemalang','IDN','Central Java',103500); +INSERT INTO `city` VALUES (1004,'Klaten','IDN','Central Java',103300); +INSERT INTO `city` VALUES (1005,'Salatiga','IDN','Central Java',103000); +INSERT INTO `city` VALUES (1006,'Cibinong','IDN','West Java',101300); +INSERT INTO `city` VALUES (1007,'Palangka Raya','IDN','Kalimantan Tengah',99693); +INSERT INTO `city` VALUES (1008,'Mojokerto','IDN','East Java',96626); +INSERT INTO `city` VALUES (1009,'Purwakarta','IDN','West Java',95900); +INSERT INTO `city` VALUES (1010,'Garut','IDN','West Java',95800); +INSERT INTO `city` VALUES (1011,'Kudus','IDN','Central Java',95300); +INSERT INTO `city` VALUES (1012,'Kendari','IDN','Sulawesi Tenggara',94800); +INSERT INTO `city` VALUES (1013,'Jaya Pura','IDN','West Irian',94700); +INSERT INTO `city` VALUES (1014,'Gorontalo','IDN','Sulawesi Utara',94058); +INSERT INTO `city` VALUES (1015,'Majalaya','IDN','West Java',93200); +INSERT INTO `city` VALUES (1016,'Pondok Aren','IDN','West Java',92700); +INSERT INTO `city` VALUES (1017,'Jombang','IDN','East Java',92600); +INSERT INTO `city` VALUES (1018,'Sunggal','IDN','Sumatera Utara',92300); +INSERT INTO `city` VALUES (1019,'Batam','IDN','Riau',91871); +INSERT INTO `city` VALUES (1020,'Padang Sidempuan','IDN','Sumatera Utara',91200); +INSERT INTO `city` VALUES (1021,'Sawangan','IDN','West Java',91100); +INSERT INTO `city` VALUES (1022,'Banyuwangi','IDN','East Java',89900); +INSERT INTO `city` VALUES (1023,'Tanjung Pinang','IDN','Riau',89900); +INSERT INTO `city` VALUES (1024,'Mumbai (Bombay)','IND','Maharashtra',10500000); +INSERT INTO `city` VALUES (1025,'Delhi','IND','Delhi',7206704); +INSERT INTO `city` VALUES (1026,'Calcutta [Kolkata]','IND','West Bengali',4399819); +INSERT INTO `city` VALUES (1027,'Chennai (Madras)','IND','Tamil Nadu',3841396); +INSERT INTO `city` VALUES (1028,'Hyderabad','IND','Andhra Pradesh',2964638); +INSERT INTO `city` VALUES (1029,'Ahmedabad','IND','Gujarat',2876710); +INSERT INTO `city` VALUES (1030,'Bangalore','IND','Karnataka',2660088); +INSERT INTO `city` VALUES (1031,'Kanpur','IND','Uttar Pradesh',1874409); +INSERT INTO `city` VALUES (1032,'Nagpur','IND','Maharashtra',1624752); +INSERT INTO `city` VALUES (1033,'Lucknow','IND','Uttar Pradesh',1619115); +INSERT INTO `city` VALUES (1034,'Pune','IND','Maharashtra',1566651); +INSERT INTO `city` VALUES (1035,'Surat','IND','Gujarat',1498817); +INSERT INTO `city` VALUES (1036,'Jaipur','IND','Rajasthan',1458483); +INSERT INTO `city` VALUES (1037,'Indore','IND','Madhya Pradesh',1091674); +INSERT INTO `city` VALUES (1038,'Bhopal','IND','Madhya Pradesh',1062771); +INSERT INTO `city` VALUES (1039,'Ludhiana','IND','Punjab',1042740); +INSERT INTO `city` VALUES (1040,'Vadodara (Baroda)','IND','Gujarat',1031346); +INSERT INTO `city` VALUES (1041,'Kalyan','IND','Maharashtra',1014557); +INSERT INTO `city` VALUES (1042,'Madurai','IND','Tamil Nadu',977856); +INSERT INTO `city` VALUES (1043,'Haora (Howrah)','IND','West Bengali',950435); +INSERT INTO `city` VALUES (1044,'Varanasi (Benares)','IND','Uttar Pradesh',929270); +INSERT INTO `city` VALUES (1045,'Patna','IND','Bihar',917243); +INSERT INTO `city` VALUES (1046,'Srinagar','IND','Jammu and Kashmir',892506); +INSERT INTO `city` VALUES (1047,'Agra','IND','Uttar Pradesh',891790); +INSERT INTO `city` VALUES (1048,'Coimbatore','IND','Tamil Nadu',816321); +INSERT INTO `city` VALUES (1049,'Thane (Thana)','IND','Maharashtra',803389); +INSERT INTO `city` VALUES (1050,'Allahabad','IND','Uttar Pradesh',792858); +INSERT INTO `city` VALUES (1051,'Meerut','IND','Uttar Pradesh',753778); +INSERT INTO `city` VALUES (1052,'Vishakhapatnam','IND','Andhra Pradesh',752037); +INSERT INTO `city` VALUES (1053,'Jabalpur','IND','Madhya Pradesh',741927); +INSERT INTO `city` VALUES (1054,'Amritsar','IND','Punjab',708835); +INSERT INTO `city` VALUES (1055,'Faridabad','IND','Haryana',703592); +INSERT INTO `city` VALUES (1056,'Vijayawada','IND','Andhra Pradesh',701827); +INSERT INTO `city` VALUES (1057,'Gwalior','IND','Madhya Pradesh',690765); +INSERT INTO `city` VALUES (1058,'Jodhpur','IND','Rajasthan',666279); +INSERT INTO `city` VALUES (1059,'Nashik (Nasik)','IND','Maharashtra',656925); +INSERT INTO `city` VALUES (1060,'Hubli-Dharwad','IND','Karnataka',648298); +INSERT INTO `city` VALUES (1061,'Solapur (Sholapur)','IND','Maharashtra',604215); +INSERT INTO `city` VALUES (1062,'Ranchi','IND','Jharkhand',599306); +INSERT INTO `city` VALUES (1063,'Bareilly','IND','Uttar Pradesh',587211); +INSERT INTO `city` VALUES (1064,'Guwahati (Gauhati)','IND','Assam',584342); +INSERT INTO `city` VALUES (1065,'Shambajinagar (Aurangabad)','IND','Maharashtra',573272); +INSERT INTO `city` VALUES (1066,'Cochin (Kochi)','IND','Kerala',564589); +INSERT INTO `city` VALUES (1067,'Rajkot','IND','Gujarat',559407); +INSERT INTO `city` VALUES (1068,'Kota','IND','Rajasthan',537371); +INSERT INTO `city` VALUES (1069,'Thiruvananthapuram (Trivandrum','IND','Kerala',524006); +INSERT INTO `city` VALUES (1070,'Pimpri-Chinchwad','IND','Maharashtra',517083); +INSERT INTO `city` VALUES (1071,'Jalandhar (Jullundur)','IND','Punjab',509510); +INSERT INTO `city` VALUES (1072,'Gorakhpur','IND','Uttar Pradesh',505566); +INSERT INTO `city` VALUES (1073,'Chandigarh','IND','Chandigarh',504094); +INSERT INTO `city` VALUES (1074,'Mysore','IND','Karnataka',480692); +INSERT INTO `city` VALUES (1075,'Aligarh','IND','Uttar Pradesh',480520); +INSERT INTO `city` VALUES (1076,'Guntur','IND','Andhra Pradesh',471051); +INSERT INTO `city` VALUES (1077,'Jamshedpur','IND','Jharkhand',460577); +INSERT INTO `city` VALUES (1078,'Ghaziabad','IND','Uttar Pradesh',454156); +INSERT INTO `city` VALUES (1079,'Warangal','IND','Andhra Pradesh',447657); +INSERT INTO `city` VALUES (1080,'Raipur','IND','Chhatisgarh',438639); +INSERT INTO `city` VALUES (1081,'Moradabad','IND','Uttar Pradesh',429214); +INSERT INTO `city` VALUES (1082,'Durgapur','IND','West Bengali',425836); +INSERT INTO `city` VALUES (1083,'Amravati','IND','Maharashtra',421576); +INSERT INTO `city` VALUES (1084,'Calicut (Kozhikode)','IND','Kerala',419831); +INSERT INTO `city` VALUES (1085,'Bikaner','IND','Rajasthan',416289); +INSERT INTO `city` VALUES (1086,'Bhubaneswar','IND','Orissa',411542); +INSERT INTO `city` VALUES (1087,'Kolhapur','IND','Maharashtra',406370); +INSERT INTO `city` VALUES (1088,'Kataka (Cuttack)','IND','Orissa',403418); +INSERT INTO `city` VALUES (1089,'Ajmer','IND','Rajasthan',402700); +INSERT INTO `city` VALUES (1090,'Bhavnagar','IND','Gujarat',402338); +INSERT INTO `city` VALUES (1091,'Tiruchirapalli','IND','Tamil Nadu',387223); +INSERT INTO `city` VALUES (1092,'Bhilai','IND','Chhatisgarh',386159); +INSERT INTO `city` VALUES (1093,'Bhiwandi','IND','Maharashtra',379070); +INSERT INTO `city` VALUES (1094,'Saharanpur','IND','Uttar Pradesh',374945); +INSERT INTO `city` VALUES (1095,'Ulhasnagar','IND','Maharashtra',369077); +INSERT INTO `city` VALUES (1096,'Salem','IND','Tamil Nadu',366712); +INSERT INTO `city` VALUES (1097,'Ujjain','IND','Madhya Pradesh',362266); +INSERT INTO `city` VALUES (1098,'Malegaon','IND','Maharashtra',342595); +INSERT INTO `city` VALUES (1099,'Jamnagar','IND','Gujarat',341637); +INSERT INTO `city` VALUES (1100,'Bokaro Steel City','IND','Jharkhand',333683); +INSERT INTO `city` VALUES (1101,'Akola','IND','Maharashtra',328034); +INSERT INTO `city` VALUES (1102,'Belgaum','IND','Karnataka',326399); +INSERT INTO `city` VALUES (1103,'Rajahmundry','IND','Andhra Pradesh',324851); +INSERT INTO `city` VALUES (1104,'Nellore','IND','Andhra Pradesh',316606); +INSERT INTO `city` VALUES (1105,'Udaipur','IND','Rajasthan',308571); +INSERT INTO `city` VALUES (1106,'New Bombay','IND','Maharashtra',307297); +INSERT INTO `city` VALUES (1107,'Bhatpara','IND','West Bengali',304952); +INSERT INTO `city` VALUES (1108,'Gulbarga','IND','Karnataka',304099); +INSERT INTO `city` VALUES (1109,'New Delhi','IND','Delhi',301297); +INSERT INTO `city` VALUES (1110,'Jhansi','IND','Uttar Pradesh',300850); +INSERT INTO `city` VALUES (1111,'Gaya','IND','Bihar',291675); +INSERT INTO `city` VALUES (1112,'Kakinada','IND','Andhra Pradesh',279980); +INSERT INTO `city` VALUES (1113,'Dhule (Dhulia)','IND','Maharashtra',278317); +INSERT INTO `city` VALUES (1114,'Panihati','IND','West Bengali',275990); +INSERT INTO `city` VALUES (1115,'Nanded (Nander)','IND','Maharashtra',275083); +INSERT INTO `city` VALUES (1116,'Mangalore','IND','Karnataka',273304); +INSERT INTO `city` VALUES (1117,'Dehra Dun','IND','Uttaranchal',270159); +INSERT INTO `city` VALUES (1118,'Kamarhati','IND','West Bengali',266889); +INSERT INTO `city` VALUES (1119,'Davangere','IND','Karnataka',266082); +INSERT INTO `city` VALUES (1120,'Asansol','IND','West Bengali',262188); +INSERT INTO `city` VALUES (1121,'Bhagalpur','IND','Bihar',253225); +INSERT INTO `city` VALUES (1122,'Bellary','IND','Karnataka',245391); +INSERT INTO `city` VALUES (1123,'Barddhaman (Burdwan)','IND','West Bengali',245079); +INSERT INTO `city` VALUES (1124,'Rampur','IND','Uttar Pradesh',243742); +INSERT INTO `city` VALUES (1125,'Jalgaon','IND','Maharashtra',242193); +INSERT INTO `city` VALUES (1126,'Muzaffarpur','IND','Bihar',241107); +INSERT INTO `city` VALUES (1127,'Nizamabad','IND','Andhra Pradesh',241034); +INSERT INTO `city` VALUES (1128,'Muzaffarnagar','IND','Uttar Pradesh',240609); +INSERT INTO `city` VALUES (1129,'Patiala','IND','Punjab',238368); +INSERT INTO `city` VALUES (1130,'Shahjahanpur','IND','Uttar Pradesh',237713); +INSERT INTO `city` VALUES (1131,'Kurnool','IND','Andhra Pradesh',236800); +INSERT INTO `city` VALUES (1132,'Tiruppur (Tirupper)','IND','Tamil Nadu',235661); +INSERT INTO `city` VALUES (1133,'Rohtak','IND','Haryana',233400); +INSERT INTO `city` VALUES (1134,'South Dum Dum','IND','West Bengali',232811); +INSERT INTO `city` VALUES (1135,'Mathura','IND','Uttar Pradesh',226691); +INSERT INTO `city` VALUES (1136,'Chandrapur','IND','Maharashtra',226105); +INSERT INTO `city` VALUES (1137,'Barahanagar (Baranagar)','IND','West Bengali',224821); +INSERT INTO `city` VALUES (1138,'Darbhanga','IND','Bihar',218391); +INSERT INTO `city` VALUES (1139,'Siliguri (Shiliguri)','IND','West Bengali',216950); +INSERT INTO `city` VALUES (1140,'Raurkela','IND','Orissa',215489); +INSERT INTO `city` VALUES (1141,'Ambattur','IND','Tamil Nadu',215424); +INSERT INTO `city` VALUES (1142,'Panipat','IND','Haryana',215218); +INSERT INTO `city` VALUES (1143,'Firozabad','IND','Uttar Pradesh',215128); +INSERT INTO `city` VALUES (1144,'Ichalkaranji','IND','Maharashtra',214950); +INSERT INTO `city` VALUES (1145,'Jammu','IND','Jammu and Kashmir',214737); +INSERT INTO `city` VALUES (1146,'Ramagundam','IND','Andhra Pradesh',214384); +INSERT INTO `city` VALUES (1147,'Eluru','IND','Andhra Pradesh',212866); +INSERT INTO `city` VALUES (1148,'Brahmapur','IND','Orissa',210418); +INSERT INTO `city` VALUES (1149,'Alwar','IND','Rajasthan',205086); +INSERT INTO `city` VALUES (1150,'Pondicherry','IND','Pondicherry',203065); +INSERT INTO `city` VALUES (1151,'Thanjavur','IND','Tamil Nadu',202013); +INSERT INTO `city` VALUES (1152,'Bihar Sharif','IND','Bihar',201323); +INSERT INTO `city` VALUES (1153,'Tuticorin','IND','Tamil Nadu',199854); +INSERT INTO `city` VALUES (1154,'Imphal','IND','Manipur',198535); +INSERT INTO `city` VALUES (1155,'Latur','IND','Maharashtra',197408); +INSERT INTO `city` VALUES (1156,'Sagar','IND','Madhya Pradesh',195346); +INSERT INTO `city` VALUES (1157,'Farrukhabad-cum-Fatehgarh','IND','Uttar Pradesh',194567); +INSERT INTO `city` VALUES (1158,'Sangli','IND','Maharashtra',193197); +INSERT INTO `city` VALUES (1159,'Parbhani','IND','Maharashtra',190255); +INSERT INTO `city` VALUES (1160,'Nagar Coil','IND','Tamil Nadu',190084); +INSERT INTO `city` VALUES (1161,'Bijapur','IND','Karnataka',186939); +INSERT INTO `city` VALUES (1162,'Kukatpalle','IND','Andhra Pradesh',185378); +INSERT INTO `city` VALUES (1163,'Bally','IND','West Bengali',184474); +INSERT INTO `city` VALUES (1164,'Bhilwara','IND','Rajasthan',183965); +INSERT INTO `city` VALUES (1165,'Ratlam','IND','Madhya Pradesh',183375); +INSERT INTO `city` VALUES (1166,'Avadi','IND','Tamil Nadu',183215); +INSERT INTO `city` VALUES (1167,'Dindigul','IND','Tamil Nadu',182477); +INSERT INTO `city` VALUES (1168,'Ahmadnagar','IND','Maharashtra',181339); +INSERT INTO `city` VALUES (1169,'Bilaspur','IND','Chhatisgarh',179833); +INSERT INTO `city` VALUES (1170,'Shimoga','IND','Karnataka',179258); +INSERT INTO `city` VALUES (1171,'Kharagpur','IND','West Bengali',177989); +INSERT INTO `city` VALUES (1172,'Mira Bhayandar','IND','Maharashtra',175372); +INSERT INTO `city` VALUES (1173,'Vellore','IND','Tamil Nadu',175061); +INSERT INTO `city` VALUES (1174,'Jalna','IND','Maharashtra',174985); +INSERT INTO `city` VALUES (1175,'Burnpur','IND','West Bengali',174933); +INSERT INTO `city` VALUES (1176,'Anantapur','IND','Andhra Pradesh',174924); +INSERT INTO `city` VALUES (1177,'Allappuzha (Alleppey)','IND','Kerala',174666); +INSERT INTO `city` VALUES (1178,'Tirupati','IND','Andhra Pradesh',174369); +INSERT INTO `city` VALUES (1179,'Karnal','IND','Haryana',173751); +INSERT INTO `city` VALUES (1180,'Burhanpur','IND','Madhya Pradesh',172710); +INSERT INTO `city` VALUES (1181,'Hisar (Hissar)','IND','Haryana',172677); +INSERT INTO `city` VALUES (1182,'Tiruvottiyur','IND','Tamil Nadu',172562); +INSERT INTO `city` VALUES (1183,'Mirzapur-cum-Vindhyachal','IND','Uttar Pradesh',169336); +INSERT INTO `city` VALUES (1184,'Secunderabad','IND','Andhra Pradesh',167461); +INSERT INTO `city` VALUES (1185,'Nadiad','IND','Gujarat',167051); +INSERT INTO `city` VALUES (1186,'Dewas','IND','Madhya Pradesh',164364); +INSERT INTO `city` VALUES (1187,'Murwara (Katni)','IND','Madhya Pradesh',163431); +INSERT INTO `city` VALUES (1188,'Ganganagar','IND','Rajasthan',161482); +INSERT INTO `city` VALUES (1189,'Vizianagaram','IND','Andhra Pradesh',160359); +INSERT INTO `city` VALUES (1190,'Erode','IND','Tamil Nadu',159232); +INSERT INTO `city` VALUES (1191,'Machilipatnam (Masulipatam)','IND','Andhra Pradesh',159110); +INSERT INTO `city` VALUES (1192,'Bhatinda (Bathinda)','IND','Punjab',159042); +INSERT INTO `city` VALUES (1193,'Raichur','IND','Karnataka',157551); +INSERT INTO `city` VALUES (1194,'Agartala','IND','Tripura',157358); +INSERT INTO `city` VALUES (1195,'Arrah (Ara)','IND','Bihar',157082); +INSERT INTO `city` VALUES (1196,'Satna','IND','Madhya Pradesh',156630); +INSERT INTO `city` VALUES (1197,'Lalbahadur Nagar','IND','Andhra Pradesh',155500); +INSERT INTO `city` VALUES (1198,'Aizawl','IND','Mizoram',155240); +INSERT INTO `city` VALUES (1199,'Uluberia','IND','West Bengali',155172); +INSERT INTO `city` VALUES (1200,'Katihar','IND','Bihar',154367); +INSERT INTO `city` VALUES (1201,'Cuddalore','IND','Tamil Nadu',153086); +INSERT INTO `city` VALUES (1202,'Hugli-Chinsurah','IND','West Bengali',151806); +INSERT INTO `city` VALUES (1203,'Dhanbad','IND','Jharkhand',151789); +INSERT INTO `city` VALUES (1204,'Raiganj','IND','West Bengali',151045); +INSERT INTO `city` VALUES (1205,'Sambhal','IND','Uttar Pradesh',150869); +INSERT INTO `city` VALUES (1206,'Durg','IND','Chhatisgarh',150645); +INSERT INTO `city` VALUES (1207,'Munger (Monghyr)','IND','Bihar',150112); +INSERT INTO `city` VALUES (1208,'Kanchipuram','IND','Tamil Nadu',150100); +INSERT INTO `city` VALUES (1209,'North Dum Dum','IND','West Bengali',149965); +INSERT INTO `city` VALUES (1210,'Karimnagar','IND','Andhra Pradesh',148583); +INSERT INTO `city` VALUES (1211,'Bharatpur','IND','Rajasthan',148519); +INSERT INTO `city` VALUES (1212,'Sikar','IND','Rajasthan',148272); +INSERT INTO `city` VALUES (1213,'Hardwar (Haridwar)','IND','Uttaranchal',147305); +INSERT INTO `city` VALUES (1214,'Dabgram','IND','West Bengali',147217); +INSERT INTO `city` VALUES (1215,'Morena','IND','Madhya Pradesh',147124); +INSERT INTO `city` VALUES (1216,'Noida','IND','Uttar Pradesh',146514); +INSERT INTO `city` VALUES (1217,'Hapur','IND','Uttar Pradesh',146262); +INSERT INTO `city` VALUES (1218,'Bhusawal','IND','Maharashtra',145143); +INSERT INTO `city` VALUES (1219,'Khandwa','IND','Madhya Pradesh',145133); +INSERT INTO `city` VALUES (1220,'Yamuna Nagar','IND','Haryana',144346); +INSERT INTO `city` VALUES (1221,'Sonipat (Sonepat)','IND','Haryana',143922); +INSERT INTO `city` VALUES (1222,'Tenali','IND','Andhra Pradesh',143726); +INSERT INTO `city` VALUES (1223,'Raurkela Civil Township','IND','Orissa',140408); +INSERT INTO `city` VALUES (1224,'Kollam (Quilon)','IND','Kerala',139852); +INSERT INTO `city` VALUES (1225,'Kumbakonam','IND','Tamil Nadu',139483); +INSERT INTO `city` VALUES (1226,'Ingraj Bazar (English Bazar)','IND','West Bengali',139204); +INSERT INTO `city` VALUES (1227,'Timkur','IND','Karnataka',138903); +INSERT INTO `city` VALUES (1228,'Amroha','IND','Uttar Pradesh',137061); +INSERT INTO `city` VALUES (1229,'Serampore','IND','West Bengali',137028); +INSERT INTO `city` VALUES (1230,'Chapra','IND','Bihar',136877); +INSERT INTO `city` VALUES (1231,'Pali','IND','Rajasthan',136842); +INSERT INTO `city` VALUES (1232,'Maunath Bhanjan','IND','Uttar Pradesh',136697); +INSERT INTO `city` VALUES (1233,'Adoni','IND','Andhra Pradesh',136182); +INSERT INTO `city` VALUES (1234,'Jaunpur','IND','Uttar Pradesh',136062); +INSERT INTO `city` VALUES (1235,'Tirunelveli','IND','Tamil Nadu',135825); +INSERT INTO `city` VALUES (1236,'Bahraich','IND','Uttar Pradesh',135400); +INSERT INTO `city` VALUES (1237,'Gadag Betigeri','IND','Karnataka',134051); +INSERT INTO `city` VALUES (1238,'Proddatur','IND','Andhra Pradesh',133914); +INSERT INTO `city` VALUES (1239,'Chittoor','IND','Andhra Pradesh',133462); +INSERT INTO `city` VALUES (1240,'Barrackpur','IND','West Bengali',133265); +INSERT INTO `city` VALUES (1241,'Bharuch (Broach)','IND','Gujarat',133102); +INSERT INTO `city` VALUES (1242,'Naihati','IND','West Bengali',132701); +INSERT INTO `city` VALUES (1243,'Shillong','IND','Meghalaya',131719); +INSERT INTO `city` VALUES (1244,'Sambalpur','IND','Orissa',131138); +INSERT INTO `city` VALUES (1245,'Junagadh','IND','Gujarat',130484); +INSERT INTO `city` VALUES (1246,'Rae Bareli','IND','Uttar Pradesh',129904); +INSERT INTO `city` VALUES (1247,'Rewa','IND','Madhya Pradesh',128981); +INSERT INTO `city` VALUES (1248,'Gurgaon','IND','Haryana',128608); +INSERT INTO `city` VALUES (1249,'Khammam','IND','Andhra Pradesh',127992); +INSERT INTO `city` VALUES (1250,'Bulandshahr','IND','Uttar Pradesh',127201); +INSERT INTO `city` VALUES (1251,'Navsari','IND','Gujarat',126089); +INSERT INTO `city` VALUES (1252,'Malkajgiri','IND','Andhra Pradesh',126066); +INSERT INTO `city` VALUES (1253,'Midnapore (Medinipur)','IND','West Bengali',125498); +INSERT INTO `city` VALUES (1254,'Miraj','IND','Maharashtra',125407); +INSERT INTO `city` VALUES (1255,'Raj Nandgaon','IND','Chhatisgarh',125371); +INSERT INTO `city` VALUES (1256,'Alandur','IND','Tamil Nadu',125244); +INSERT INTO `city` VALUES (1257,'Puri','IND','Orissa',125199); +INSERT INTO `city` VALUES (1258,'Navadwip','IND','West Bengali',125037); +INSERT INTO `city` VALUES (1259,'Sirsa','IND','Haryana',125000); +INSERT INTO `city` VALUES (1260,'Korba','IND','Chhatisgarh',124501); +INSERT INTO `city` VALUES (1261,'Faizabad','IND','Uttar Pradesh',124437); +INSERT INTO `city` VALUES (1262,'Etawah','IND','Uttar Pradesh',124072); +INSERT INTO `city` VALUES (1263,'Pathankot','IND','Punjab',123930); +INSERT INTO `city` VALUES (1264,'Gandhinagar','IND','Gujarat',123359); +INSERT INTO `city` VALUES (1265,'Palghat (Palakkad)','IND','Kerala',123289); +INSERT INTO `city` VALUES (1266,'Veraval','IND','Gujarat',123000); +INSERT INTO `city` VALUES (1267,'Hoshiarpur','IND','Punjab',122705); +INSERT INTO `city` VALUES (1268,'Ambala','IND','Haryana',122596); +INSERT INTO `city` VALUES (1269,'Sitapur','IND','Uttar Pradesh',121842); +INSERT INTO `city` VALUES (1270,'Bhiwani','IND','Haryana',121629); +INSERT INTO `city` VALUES (1271,'Cuddapah','IND','Andhra Pradesh',121463); +INSERT INTO `city` VALUES (1272,'Bhimavaram','IND','Andhra Pradesh',121314); +INSERT INTO `city` VALUES (1273,'Krishnanagar','IND','West Bengali',121110); +INSERT INTO `city` VALUES (1274,'Chandannagar','IND','West Bengali',120378); +INSERT INTO `city` VALUES (1275,'Mandya','IND','Karnataka',120265); +INSERT INTO `city` VALUES (1276,'Dibrugarh','IND','Assam',120127); +INSERT INTO `city` VALUES (1277,'Nandyal','IND','Andhra Pradesh',119813); +INSERT INTO `city` VALUES (1278,'Balurghat','IND','West Bengali',119796); +INSERT INTO `city` VALUES (1279,'Neyveli','IND','Tamil Nadu',118080); +INSERT INTO `city` VALUES (1280,'Fatehpur','IND','Uttar Pradesh',117675); +INSERT INTO `city` VALUES (1281,'Mahbubnagar','IND','Andhra Pradesh',116833); +INSERT INTO `city` VALUES (1282,'Budaun','IND','Uttar Pradesh',116695); +INSERT INTO `city` VALUES (1283,'Porbandar','IND','Gujarat',116671); +INSERT INTO `city` VALUES (1284,'Silchar','IND','Assam',115483); +INSERT INTO `city` VALUES (1285,'Berhampore (Baharampur)','IND','West Bengali',115144); +INSERT INTO `city` VALUES (1286,'Purnea (Purnia)','IND','Jharkhand',114912); +INSERT INTO `city` VALUES (1287,'Bankura','IND','West Bengali',114876); +INSERT INTO `city` VALUES (1288,'Rajapalaiyam','IND','Tamil Nadu',114202); +INSERT INTO `city` VALUES (1289,'Titagarh','IND','West Bengali',114085); +INSERT INTO `city` VALUES (1290,'Halisahar','IND','West Bengali',114028); +INSERT INTO `city` VALUES (1291,'Hathras','IND','Uttar Pradesh',113285); +INSERT INTO `city` VALUES (1292,'Bhir (Bid)','IND','Maharashtra',112434); +INSERT INTO `city` VALUES (1293,'Pallavaram','IND','Tamil Nadu',111866); +INSERT INTO `city` VALUES (1294,'Anand','IND','Gujarat',110266); +INSERT INTO `city` VALUES (1295,'Mango','IND','Jharkhand',110024); +INSERT INTO `city` VALUES (1296,'Santipur','IND','West Bengali',109956); +INSERT INTO `city` VALUES (1297,'Bhind','IND','Madhya Pradesh',109755); +INSERT INTO `city` VALUES (1298,'Gondiya','IND','Maharashtra',109470); +INSERT INTO `city` VALUES (1299,'Tiruvannamalai','IND','Tamil Nadu',109196); +INSERT INTO `city` VALUES (1300,'Yeotmal (Yavatmal)','IND','Maharashtra',108578); +INSERT INTO `city` VALUES (1301,'Kulti-Barakar','IND','West Bengali',108518); +INSERT INTO `city` VALUES (1302,'Moga','IND','Punjab',108304); +INSERT INTO `city` VALUES (1303,'Shivapuri','IND','Madhya Pradesh',108277); +INSERT INTO `city` VALUES (1304,'Bidar','IND','Karnataka',108016); +INSERT INTO `city` VALUES (1305,'Guntakal','IND','Andhra Pradesh',107592); +INSERT INTO `city` VALUES (1306,'Unnao','IND','Uttar Pradesh',107425); +INSERT INTO `city` VALUES (1307,'Barasat','IND','West Bengali',107365); +INSERT INTO `city` VALUES (1308,'Tambaram','IND','Tamil Nadu',107187); +INSERT INTO `city` VALUES (1309,'Abohar','IND','Punjab',107163); +INSERT INTO `city` VALUES (1310,'Pilibhit','IND','Uttar Pradesh',106605); +INSERT INTO `city` VALUES (1311,'Valparai','IND','Tamil Nadu',106523); +INSERT INTO `city` VALUES (1312,'Gonda','IND','Uttar Pradesh',106078); +INSERT INTO `city` VALUES (1313,'Surendranagar','IND','Gujarat',105973); +INSERT INTO `city` VALUES (1314,'Qutubullapur','IND','Andhra Pradesh',105380); +INSERT INTO `city` VALUES (1315,'Beawar','IND','Rajasthan',105363); +INSERT INTO `city` VALUES (1316,'Hindupur','IND','Andhra Pradesh',104651); +INSERT INTO `city` VALUES (1317,'Gandhidham','IND','Gujarat',104585); +INSERT INTO `city` VALUES (1318,'Haldwani-cum-Kathgodam','IND','Uttaranchal',104195); +INSERT INTO `city` VALUES (1319,'Tellicherry (Thalassery)','IND','Kerala',103579); +INSERT INTO `city` VALUES (1320,'Wardha','IND','Maharashtra',102985); +INSERT INTO `city` VALUES (1321,'Rishra','IND','West Bengali',102649); +INSERT INTO `city` VALUES (1322,'Bhuj','IND','Gujarat',102176); +INSERT INTO `city` VALUES (1323,'Modinagar','IND','Uttar Pradesh',101660); +INSERT INTO `city` VALUES (1324,'Gudivada','IND','Andhra Pradesh',101656); +INSERT INTO `city` VALUES (1325,'Basirhat','IND','West Bengali',101409); +INSERT INTO `city` VALUES (1326,'Uttarpara-Kotrung','IND','West Bengali',100867); +INSERT INTO `city` VALUES (1327,'Ongole','IND','Andhra Pradesh',100836); +INSERT INTO `city` VALUES (1328,'North Barrackpur','IND','West Bengali',100513); +INSERT INTO `city` VALUES (1329,'Guna','IND','Madhya Pradesh',100490); +INSERT INTO `city` VALUES (1330,'Haldia','IND','West Bengali',100347); +INSERT INTO `city` VALUES (1331,'Habra','IND','West Bengali',100223); +INSERT INTO `city` VALUES (1332,'Kanchrapara','IND','West Bengali',100194); +INSERT INTO `city` VALUES (1333,'Tonk','IND','Rajasthan',100079); +INSERT INTO `city` VALUES (1334,'Champdani','IND','West Bengali',98818); +INSERT INTO `city` VALUES (1335,'Orai','IND','Uttar Pradesh',98640); +INSERT INTO `city` VALUES (1336,'Pudukkottai','IND','Tamil Nadu',98619); +INSERT INTO `city` VALUES (1337,'Sasaram','IND','Bihar',98220); +INSERT INTO `city` VALUES (1338,'Hazaribag','IND','Jharkhand',97712); +INSERT INTO `city` VALUES (1339,'Palayankottai','IND','Tamil Nadu',97662); +INSERT INTO `city` VALUES (1340,'Banda','IND','Uttar Pradesh',97227); +INSERT INTO `city` VALUES (1341,'Godhra','IND','Gujarat',96813); +INSERT INTO `city` VALUES (1342,'Hospet','IND','Karnataka',96322); +INSERT INTO `city` VALUES (1343,'Ashoknagar-Kalyangarh','IND','West Bengali',96315); +INSERT INTO `city` VALUES (1344,'Achalpur','IND','Maharashtra',96216); +INSERT INTO `city` VALUES (1345,'Patan','IND','Gujarat',96109); +INSERT INTO `city` VALUES (1346,'Mandasor','IND','Madhya Pradesh',95758); +INSERT INTO `city` VALUES (1347,'Damoh','IND','Madhya Pradesh',95661); +INSERT INTO `city` VALUES (1348,'Satara','IND','Maharashtra',95133); +INSERT INTO `city` VALUES (1349,'Meerut Cantonment','IND','Uttar Pradesh',94876); +INSERT INTO `city` VALUES (1350,'Dehri','IND','Bihar',94526); +INSERT INTO `city` VALUES (1351,'Delhi Cantonment','IND','Delhi',94326); +INSERT INTO `city` VALUES (1352,'Chhindwara','IND','Madhya Pradesh',93731); +INSERT INTO `city` VALUES (1353,'Bansberia','IND','West Bengali',93447); +INSERT INTO `city` VALUES (1354,'Nagaon','IND','Assam',93350); +INSERT INTO `city` VALUES (1355,'Kanpur Cantonment','IND','Uttar Pradesh',93109); +INSERT INTO `city` VALUES (1356,'Vidisha','IND','Madhya Pradesh',92917); +INSERT INTO `city` VALUES (1357,'Bettiah','IND','Bihar',92583); +INSERT INTO `city` VALUES (1358,'Purulia','IND','Jharkhand',92574); +INSERT INTO `city` VALUES (1359,'Hassan','IND','Karnataka',90803); +INSERT INTO `city` VALUES (1360,'Ambala Sadar','IND','Haryana',90712); +INSERT INTO `city` VALUES (1361,'Baidyabati','IND','West Bengali',90601); +INSERT INTO `city` VALUES (1362,'Morvi','IND','Gujarat',90357); +INSERT INTO `city` VALUES (1363,'Raigarh','IND','Chhatisgarh',89166); +INSERT INTO `city` VALUES (1364,'Vejalpur','IND','Gujarat',89053); +INSERT INTO `city` VALUES (1365,'Baghdad','IRQ','Baghdad',4336000); +INSERT INTO `city` VALUES (1366,'Mosul','IRQ','Ninawa',879000); +INSERT INTO `city` VALUES (1367,'Irbil','IRQ','Irbil',485968); +INSERT INTO `city` VALUES (1368,'Kirkuk','IRQ','al-Tamim',418624); +INSERT INTO `city` VALUES (1369,'Basra','IRQ','Basra',406296); +INSERT INTO `city` VALUES (1370,'al-Sulaymaniya','IRQ','al-Sulaymaniya',364096); +INSERT INTO `city` VALUES (1371,'al-Najaf','IRQ','al-Najaf',309010); +INSERT INTO `city` VALUES (1372,'Karbala','IRQ','Karbala',296705); +INSERT INTO `city` VALUES (1373,'al-Hilla','IRQ','Babil',268834); +INSERT INTO `city` VALUES (1374,'al-Nasiriya','IRQ','DhiQar',265937); +INSERT INTO `city` VALUES (1375,'al-Amara','IRQ','Maysan',208797); +INSERT INTO `city` VALUES (1376,'al-Diwaniya','IRQ','al-Qadisiya',196519); +INSERT INTO `city` VALUES (1377,'al-Ramadi','IRQ','al-Anbar',192556); +INSERT INTO `city` VALUES (1378,'al-Kut','IRQ','Wasit',183183); +INSERT INTO `city` VALUES (1379,'Baquba','IRQ','Diyala',114516); +INSERT INTO `city` VALUES (1380,'Teheran','IRN','Teheran',6758845); +INSERT INTO `city` VALUES (1381,'Mashhad','IRN','Khorasan',1887405); +INSERT INTO `city` VALUES (1382,'Esfahan','IRN','Esfahan',1266072); +INSERT INTO `city` VALUES (1383,'Tabriz','IRN','East Azerbaidzan',1191043); +INSERT INTO `city` VALUES (1384,'Shiraz','IRN','Fars',1053025); +INSERT INTO `city` VALUES (1385,'Karaj','IRN','Teheran',940968); +INSERT INTO `city` VALUES (1386,'Ahvaz','IRN','Khuzestan',804980); +INSERT INTO `city` VALUES (1387,'Qom','IRN','Qom',777677); +INSERT INTO `city` VALUES (1388,'Kermanshah','IRN','Kermanshah',692986); +INSERT INTO `city` VALUES (1389,'Urmia','IRN','West Azerbaidzan',435200); +INSERT INTO `city` VALUES (1390,'Zahedan','IRN','Sistan va Baluchesta',419518); +INSERT INTO `city` VALUES (1391,'Rasht','IRN','Gilan',417748); +INSERT INTO `city` VALUES (1392,'Hamadan','IRN','Hamadan',401281); +INSERT INTO `city` VALUES (1393,'Kerman','IRN','Kerman',384991); +INSERT INTO `city` VALUES (1394,'Arak','IRN','Markazi',380755); +INSERT INTO `city` VALUES (1395,'Ardebil','IRN','Ardebil',340386); +INSERT INTO `city` VALUES (1396,'Yazd','IRN','Yazd',326776); +INSERT INTO `city` VALUES (1397,'Qazvin','IRN','Qazvin',291117); +INSERT INTO `city` VALUES (1398,'Zanjan','IRN','Zanjan',286295); +INSERT INTO `city` VALUES (1399,'Sanandaj','IRN','Kordestan',277808); +INSERT INTO `city` VALUES (1400,'Bandar-e-Abbas','IRN','Hormozgan',273578); +INSERT INTO `city` VALUES (1401,'Khorramabad','IRN','Lorestan',272815); +INSERT INTO `city` VALUES (1402,'Eslamshahr','IRN','Teheran',265450); +INSERT INTO `city` VALUES (1403,'Borujerd','IRN','Lorestan',217804); +INSERT INTO `city` VALUES (1404,'Abadan','IRN','Khuzestan',206073); +INSERT INTO `city` VALUES (1405,'Dezful','IRN','Khuzestan',202639); +INSERT INTO `city` VALUES (1406,'Kashan','IRN','Esfahan',201372); +INSERT INTO `city` VALUES (1407,'Sari','IRN','Mazandaran',195882); +INSERT INTO `city` VALUES (1408,'Gorgan','IRN','Golestan',188710); +INSERT INTO `city` VALUES (1409,'Najafabad','IRN','Esfahan',178498); +INSERT INTO `city` VALUES (1410,'Sabzevar','IRN','Khorasan',170738); +INSERT INTO `city` VALUES (1411,'Khomeynishahr','IRN','Esfahan',165888); +INSERT INTO `city` VALUES (1412,'Amol','IRN','Mazandaran',159092); +INSERT INTO `city` VALUES (1413,'Neyshabur','IRN','Khorasan',158847); +INSERT INTO `city` VALUES (1414,'Babol','IRN','Mazandaran',158346); +INSERT INTO `city` VALUES (1415,'Khoy','IRN','West Azerbaidzan',148944); +INSERT INTO `city` VALUES (1416,'Malayer','IRN','Hamadan',144373); +INSERT INTO `city` VALUES (1417,'Bushehr','IRN','Bushehr',143641); +INSERT INTO `city` VALUES (1418,'Qaemshahr','IRN','Mazandaran',143286); +INSERT INTO `city` VALUES (1419,'Qarchak','IRN','Teheran',142690); +INSERT INTO `city` VALUES (1420,'Qods','IRN','Teheran',138278); +INSERT INTO `city` VALUES (1421,'Sirjan','IRN','Kerman',135024); +INSERT INTO `city` VALUES (1422,'Bojnurd','IRN','Khorasan',134835); +INSERT INTO `city` VALUES (1423,'Maragheh','IRN','East Azerbaidzan',132318); +INSERT INTO `city` VALUES (1424,'Birjand','IRN','Khorasan',127608); +INSERT INTO `city` VALUES (1425,'Ilam','IRN','Ilam',126346); +INSERT INTO `city` VALUES (1426,'Bukan','IRN','West Azerbaidzan',120020); +INSERT INTO `city` VALUES (1427,'Masjed-e-Soleyman','IRN','Khuzestan',116883); +INSERT INTO `city` VALUES (1428,'Saqqez','IRN','Kordestan',115394); +INSERT INTO `city` VALUES (1429,'Gonbad-e Qabus','IRN','Mazandaran',111253); +INSERT INTO `city` VALUES (1430,'Saveh','IRN','Qom',111245); +INSERT INTO `city` VALUES (1431,'Mahabad','IRN','West Azerbaidzan',107799); +INSERT INTO `city` VALUES (1432,'Varamin','IRN','Teheran',107233); +INSERT INTO `city` VALUES (1433,'Andimeshk','IRN','Khuzestan',106923); +INSERT INTO `city` VALUES (1434,'Khorramshahr','IRN','Khuzestan',105636); +INSERT INTO `city` VALUES (1435,'Shahrud','IRN','Semnan',104765); +INSERT INTO `city` VALUES (1436,'Marv Dasht','IRN','Fars',103579); +INSERT INTO `city` VALUES (1437,'Zabol','IRN','Sistan va Baluchesta',100887); +INSERT INTO `city` VALUES (1438,'Shahr-e Kord','IRN','Chaharmahal va Bakht',100477); +INSERT INTO `city` VALUES (1439,'Bandar-e Anzali','IRN','Gilan',98500); +INSERT INTO `city` VALUES (1440,'Rafsanjan','IRN','Kerman',98300); +INSERT INTO `city` VALUES (1441,'Marand','IRN','East Azerbaidzan',96400); +INSERT INTO `city` VALUES (1442,'Torbat-e Heydariyeh','IRN','Khorasan',94600); +INSERT INTO `city` VALUES (1443,'Jahrom','IRN','Fars',94200); +INSERT INTO `city` VALUES (1444,'Semnan','IRN','Semnan',91045); +INSERT INTO `city` VALUES (1445,'Miandoab','IRN','West Azerbaidzan',90100); +INSERT INTO `city` VALUES (1446,'Qomsheh','IRN','Esfahan',89800); +INSERT INTO `city` VALUES (1447,'Dublin','IRL','Leinster',481854); +INSERT INTO `city` VALUES (1448,'Cork','IRL','Munster',127187); +INSERT INTO `city` VALUES (1449,'Reykjav�k','ISL','H�fu�borgarsv��i',109184); +INSERT INTO `city` VALUES (1450,'Jerusalem','ISR','Jerusalem',633700); +INSERT INTO `city` VALUES (1451,'Tel Aviv-Jaffa','ISR','Tel Aviv',348100); +INSERT INTO `city` VALUES (1452,'Haifa','ISR','Haifa',265700); +INSERT INTO `city` VALUES (1453,'Rishon Le Ziyyon','ISR','Ha Merkaz',188200); +INSERT INTO `city` VALUES (1454,'Beerseba','ISR','Ha Darom',163700); +INSERT INTO `city` VALUES (1455,'Holon','ISR','Tel Aviv',163100); +INSERT INTO `city` VALUES (1456,'Petah Tiqwa','ISR','Ha Merkaz',159400); +INSERT INTO `city` VALUES (1457,'Ashdod','ISR','Ha Darom',155800); +INSERT INTO `city` VALUES (1458,'Netanya','ISR','Ha Merkaz',154900); +INSERT INTO `city` VALUES (1459,'Bat Yam','ISR','Tel Aviv',137000); +INSERT INTO `city` VALUES (1460,'Bene Beraq','ISR','Tel Aviv',133900); +INSERT INTO `city` VALUES (1461,'Ramat Gan','ISR','Tel Aviv',126900); +INSERT INTO `city` VALUES (1462,'Ashqelon','ISR','Ha Darom',92300); +INSERT INTO `city` VALUES (1463,'Rehovot','ISR','Ha Merkaz',90300); +INSERT INTO `city` VALUES (1464,'Roma','ITA','Latium',2643581); +INSERT INTO `city` VALUES (1465,'Milano','ITA','Lombardia',1300977); +INSERT INTO `city` VALUES (1466,'Napoli','ITA','Campania',1002619); +INSERT INTO `city` VALUES (1467,'Torino','ITA','Piemonte',903705); +INSERT INTO `city` VALUES (1468,'Palermo','ITA','Sisilia',683794); +INSERT INTO `city` VALUES (1469,'Genova','ITA','Liguria',636104); +INSERT INTO `city` VALUES (1470,'Bologna','ITA','Emilia-Romagna',381161); +INSERT INTO `city` VALUES (1471,'Firenze','ITA','Toscana',376662); +INSERT INTO `city` VALUES (1472,'Catania','ITA','Sisilia',337862); +INSERT INTO `city` VALUES (1473,'Bari','ITA','Apulia',331848); +INSERT INTO `city` VALUES (1474,'Venezia','ITA','Veneto',277305); +INSERT INTO `city` VALUES (1475,'Messina','ITA','Sisilia',259156); +INSERT INTO `city` VALUES (1476,'Verona','ITA','Veneto',255268); +INSERT INTO `city` VALUES (1477,'Trieste','ITA','Friuli-Venezia Giuli',216459); +INSERT INTO `city` VALUES (1478,'Padova','ITA','Veneto',211391); +INSERT INTO `city` VALUES (1479,'Taranto','ITA','Apulia',208214); +INSERT INTO `city` VALUES (1480,'Brescia','ITA','Lombardia',191317); +INSERT INTO `city` VALUES (1481,'Reggio di Calabria','ITA','Calabria',179617); +INSERT INTO `city` VALUES (1482,'Modena','ITA','Emilia-Romagna',176022); +INSERT INTO `city` VALUES (1483,'Prato','ITA','Toscana',172473); +INSERT INTO `city` VALUES (1484,'Parma','ITA','Emilia-Romagna',168717); +INSERT INTO `city` VALUES (1485,'Cagliari','ITA','Sardinia',165926); +INSERT INTO `city` VALUES (1486,'Livorno','ITA','Toscana',161673); +INSERT INTO `city` VALUES (1487,'Perugia','ITA','Umbria',156673); +INSERT INTO `city` VALUES (1488,'Foggia','ITA','Apulia',154891); +INSERT INTO `city` VALUES (1489,'Reggio nell� Emilia','ITA','Emilia-Romagna',143664); +INSERT INTO `city` VALUES (1490,'Salerno','ITA','Campania',142055); +INSERT INTO `city` VALUES (1491,'Ravenna','ITA','Emilia-Romagna',138418); +INSERT INTO `city` VALUES (1492,'Ferrara','ITA','Emilia-Romagna',132127); +INSERT INTO `city` VALUES (1493,'Rimini','ITA','Emilia-Romagna',131062); +INSERT INTO `city` VALUES (1494,'Syrakusa','ITA','Sisilia',126282); +INSERT INTO `city` VALUES (1495,'Sassari','ITA','Sardinia',120803); +INSERT INTO `city` VALUES (1496,'Monza','ITA','Lombardia',119516); +INSERT INTO `city` VALUES (1497,'Bergamo','ITA','Lombardia',117837); +INSERT INTO `city` VALUES (1498,'Pescara','ITA','Abruzzit',115698); +INSERT INTO `city` VALUES (1499,'Latina','ITA','Latium',114099); +INSERT INTO `city` VALUES (1500,'Vicenza','ITA','Veneto',109738); +INSERT INTO `city` VALUES (1501,'Terni','ITA','Umbria',107770); +INSERT INTO `city` VALUES (1502,'Forl�','ITA','Emilia-Romagna',107475); +INSERT INTO `city` VALUES (1503,'Trento','ITA','Trentino-Alto Adige',104906); +INSERT INTO `city` VALUES (1504,'Novara','ITA','Piemonte',102037); +INSERT INTO `city` VALUES (1505,'Piacenza','ITA','Emilia-Romagna',98384); +INSERT INTO `city` VALUES (1506,'Ancona','ITA','Marche',98329); +INSERT INTO `city` VALUES (1507,'Lecce','ITA','Apulia',98208); +INSERT INTO `city` VALUES (1508,'Bolzano','ITA','Trentino-Alto Adige',97232); +INSERT INTO `city` VALUES (1509,'Catanzaro','ITA','Calabria',96700); +INSERT INTO `city` VALUES (1510,'La Spezia','ITA','Liguria',95504); +INSERT INTO `city` VALUES (1511,'Udine','ITA','Friuli-Venezia Giuli',94932); +INSERT INTO `city` VALUES (1512,'Torre del Greco','ITA','Campania',94505); +INSERT INTO `city` VALUES (1513,'Andria','ITA','Apulia',94443); +INSERT INTO `city` VALUES (1514,'Brindisi','ITA','Apulia',93454); +INSERT INTO `city` VALUES (1515,'Giugliano in Campania','ITA','Campania',93286); +INSERT INTO `city` VALUES (1516,'Pisa','ITA','Toscana',92379); +INSERT INTO `city` VALUES (1517,'Barletta','ITA','Apulia',91904); +INSERT INTO `city` VALUES (1518,'Arezzo','ITA','Toscana',91729); +INSERT INTO `city` VALUES (1519,'Alessandria','ITA','Piemonte',90289); +INSERT INTO `city` VALUES (1520,'Cesena','ITA','Emilia-Romagna',89852); +INSERT INTO `city` VALUES (1521,'Pesaro','ITA','Marche',88987); +INSERT INTO `city` VALUES (1522,'Dili','TMP','Dili',47900); +INSERT INTO `city` VALUES (1523,'Wien','AUT','Wien',1608144); +INSERT INTO `city` VALUES (1524,'Graz','AUT','Steiermark',240967); +INSERT INTO `city` VALUES (1525,'Linz','AUT','North Austria',188022); +INSERT INTO `city` VALUES (1526,'Salzburg','AUT','Salzburg',144247); +INSERT INTO `city` VALUES (1527,'Innsbruck','AUT','Tiroli',111752); +INSERT INTO `city` VALUES (1528,'Klagenfurt','AUT','K�rnten',91141); +INSERT INTO `city` VALUES (1529,'Spanish Town','JAM','St. Catherine',110379); +INSERT INTO `city` VALUES (1530,'Kingston','JAM','St. Andrew',103962); +INSERT INTO `city` VALUES (1531,'Portmore','JAM','St. Andrew',99799); +INSERT INTO `city` VALUES (1532,'Tokyo','JPN','Tokyo-to',7980230); +INSERT INTO `city` VALUES (1533,'Jokohama [Yokohama]','JPN','Kanagawa',3339594); +INSERT INTO `city` VALUES (1534,'Osaka','JPN','Osaka',2595674); +INSERT INTO `city` VALUES (1535,'Nagoya','JPN','Aichi',2154376); +INSERT INTO `city` VALUES (1536,'Sapporo','JPN','Hokkaido',1790886); +INSERT INTO `city` VALUES (1537,'Kioto','JPN','Kyoto',1461974); +INSERT INTO `city` VALUES (1538,'Kobe','JPN','Hyogo',1425139); +INSERT INTO `city` VALUES (1539,'Fukuoka','JPN','Fukuoka',1308379); +INSERT INTO `city` VALUES (1540,'Kawasaki','JPN','Kanagawa',1217359); +INSERT INTO `city` VALUES (1541,'Hiroshima','JPN','Hiroshima',1119117); +INSERT INTO `city` VALUES (1542,'Kitakyushu','JPN','Fukuoka',1016264); +INSERT INTO `city` VALUES (1543,'Sendai','JPN','Miyagi',989975); +INSERT INTO `city` VALUES (1544,'Chiba','JPN','Chiba',863930); +INSERT INTO `city` VALUES (1545,'Sakai','JPN','Osaka',797735); +INSERT INTO `city` VALUES (1546,'Kumamoto','JPN','Kumamoto',656734); +INSERT INTO `city` VALUES (1547,'Okayama','JPN','Okayama',624269); +INSERT INTO `city` VALUES (1548,'Sagamihara','JPN','Kanagawa',586300); +INSERT INTO `city` VALUES (1549,'Hamamatsu','JPN','Shizuoka',568796); +INSERT INTO `city` VALUES (1550,'Kagoshima','JPN','Kagoshima',549977); +INSERT INTO `city` VALUES (1551,'Funabashi','JPN','Chiba',545299); +INSERT INTO `city` VALUES (1552,'Higashiosaka','JPN','Osaka',517785); +INSERT INTO `city` VALUES (1553,'Hachioji','JPN','Tokyo-to',513451); +INSERT INTO `city` VALUES (1554,'Niigata','JPN','Niigata',497464); +INSERT INTO `city` VALUES (1555,'Amagasaki','JPN','Hyogo',481434); +INSERT INTO `city` VALUES (1556,'Himeji','JPN','Hyogo',475167); +INSERT INTO `city` VALUES (1557,'Shizuoka','JPN','Shizuoka',473854); +INSERT INTO `city` VALUES (1558,'Urawa','JPN','Saitama',469675); +INSERT INTO `city` VALUES (1559,'Matsuyama','JPN','Ehime',466133); +INSERT INTO `city` VALUES (1560,'Matsudo','JPN','Chiba',461126); +INSERT INTO `city` VALUES (1561,'Kanazawa','JPN','Ishikawa',455386); +INSERT INTO `city` VALUES (1562,'Kawaguchi','JPN','Saitama',452155); +INSERT INTO `city` VALUES (1563,'Ichikawa','JPN','Chiba',441893); +INSERT INTO `city` VALUES (1564,'Omiya','JPN','Saitama',441649); +INSERT INTO `city` VALUES (1565,'Utsunomiya','JPN','Tochigi',440353); +INSERT INTO `city` VALUES (1566,'Oita','JPN','Oita',433401); +INSERT INTO `city` VALUES (1567,'Nagasaki','JPN','Nagasaki',432759); +INSERT INTO `city` VALUES (1568,'Yokosuka','JPN','Kanagawa',430200); +INSERT INTO `city` VALUES (1569,'Kurashiki','JPN','Okayama',425103); +INSERT INTO `city` VALUES (1570,'Gifu','JPN','Gifu',408007); +INSERT INTO `city` VALUES (1571,'Hirakata','JPN','Osaka',403151); +INSERT INTO `city` VALUES (1572,'Nishinomiya','JPN','Hyogo',397618); +INSERT INTO `city` VALUES (1573,'Toyonaka','JPN','Osaka',396689); +INSERT INTO `city` VALUES (1574,'Wakayama','JPN','Wakayama',391233); +INSERT INTO `city` VALUES (1575,'Fukuyama','JPN','Hiroshima',376921); +INSERT INTO `city` VALUES (1576,'Fujisawa','JPN','Kanagawa',372840); +INSERT INTO `city` VALUES (1577,'Asahikawa','JPN','Hokkaido',364813); +INSERT INTO `city` VALUES (1578,'Machida','JPN','Tokyo-to',364197); +INSERT INTO `city` VALUES (1579,'Nara','JPN','Nara',362812); +INSERT INTO `city` VALUES (1580,'Takatsuki','JPN','Osaka',361747); +INSERT INTO `city` VALUES (1581,'Iwaki','JPN','Fukushima',361737); +INSERT INTO `city` VALUES (1582,'Nagano','JPN','Nagano',361391); +INSERT INTO `city` VALUES (1583,'Toyohashi','JPN','Aichi',360066); +INSERT INTO `city` VALUES (1584,'Toyota','JPN','Aichi',346090); +INSERT INTO `city` VALUES (1585,'Suita','JPN','Osaka',345750); +INSERT INTO `city` VALUES (1586,'Takamatsu','JPN','Kagawa',332471); +INSERT INTO `city` VALUES (1587,'Koriyama','JPN','Fukushima',330335); +INSERT INTO `city` VALUES (1588,'Okazaki','JPN','Aichi',328711); +INSERT INTO `city` VALUES (1589,'Kawagoe','JPN','Saitama',327211); +INSERT INTO `city` VALUES (1590,'Tokorozawa','JPN','Saitama',325809); +INSERT INTO `city` VALUES (1591,'Toyama','JPN','Toyama',325790); +INSERT INTO `city` VALUES (1592,'Kochi','JPN','Kochi',324710); +INSERT INTO `city` VALUES (1593,'Kashiwa','JPN','Chiba',320296); +INSERT INTO `city` VALUES (1594,'Akita','JPN','Akita',314440); +INSERT INTO `city` VALUES (1595,'Miyazaki','JPN','Miyazaki',303784); +INSERT INTO `city` VALUES (1596,'Koshigaya','JPN','Saitama',301446); +INSERT INTO `city` VALUES (1597,'Naha','JPN','Okinawa',299851); +INSERT INTO `city` VALUES (1598,'Aomori','JPN','Aomori',295969); +INSERT INTO `city` VALUES (1599,'Hakodate','JPN','Hokkaido',294788); +INSERT INTO `city` VALUES (1600,'Akashi','JPN','Hyogo',292253); +INSERT INTO `city` VALUES (1601,'Yokkaichi','JPN','Mie',288173); +INSERT INTO `city` VALUES (1602,'Fukushima','JPN','Fukushima',287525); +INSERT INTO `city` VALUES (1603,'Morioka','JPN','Iwate',287353); +INSERT INTO `city` VALUES (1604,'Maebashi','JPN','Gumma',284473); +INSERT INTO `city` VALUES (1605,'Kasugai','JPN','Aichi',282348); +INSERT INTO `city` VALUES (1606,'Otsu','JPN','Shiga',282070); +INSERT INTO `city` VALUES (1607,'Ichihara','JPN','Chiba',279280); +INSERT INTO `city` VALUES (1608,'Yao','JPN','Osaka',276421); +INSERT INTO `city` VALUES (1609,'Ichinomiya','JPN','Aichi',270828); +INSERT INTO `city` VALUES (1610,'Tokushima','JPN','Tokushima',269649); +INSERT INTO `city` VALUES (1611,'Kakogawa','JPN','Hyogo',266281); +INSERT INTO `city` VALUES (1612,'Ibaraki','JPN','Osaka',261020); +INSERT INTO `city` VALUES (1613,'Neyagawa','JPN','Osaka',257315); +INSERT INTO `city` VALUES (1614,'Shimonoseki','JPN','Yamaguchi',257263); +INSERT INTO `city` VALUES (1615,'Yamagata','JPN','Yamagata',255617); +INSERT INTO `city` VALUES (1616,'Fukui','JPN','Fukui',254818); +INSERT INTO `city` VALUES (1617,'Hiratsuka','JPN','Kanagawa',254207); +INSERT INTO `city` VALUES (1618,'Mito','JPN','Ibaragi',246559); +INSERT INTO `city` VALUES (1619,'Sasebo','JPN','Nagasaki',244240); +INSERT INTO `city` VALUES (1620,'Hachinohe','JPN','Aomori',242979); +INSERT INTO `city` VALUES (1621,'Takasaki','JPN','Gumma',239124); +INSERT INTO `city` VALUES (1622,'Shimizu','JPN','Shizuoka',239123); +INSERT INTO `city` VALUES (1623,'Kurume','JPN','Fukuoka',235611); +INSERT INTO `city` VALUES (1624,'Fuji','JPN','Shizuoka',231527); +INSERT INTO `city` VALUES (1625,'Soka','JPN','Saitama',222768); +INSERT INTO `city` VALUES (1626,'Fuchu','JPN','Tokyo-to',220576); +INSERT INTO `city` VALUES (1627,'Chigasaki','JPN','Kanagawa',216015); +INSERT INTO `city` VALUES (1628,'Atsugi','JPN','Kanagawa',212407); +INSERT INTO `city` VALUES (1629,'Numazu','JPN','Shizuoka',211382); +INSERT INTO `city` VALUES (1630,'Ageo','JPN','Saitama',209442); +INSERT INTO `city` VALUES (1631,'Yamato','JPN','Kanagawa',208234); +INSERT INTO `city` VALUES (1632,'Matsumoto','JPN','Nagano',206801); +INSERT INTO `city` VALUES (1633,'Kure','JPN','Hiroshima',206504); +INSERT INTO `city` VALUES (1634,'Takarazuka','JPN','Hyogo',205993); +INSERT INTO `city` VALUES (1635,'Kasukabe','JPN','Saitama',201838); +INSERT INTO `city` VALUES (1636,'Chofu','JPN','Tokyo-to',201585); +INSERT INTO `city` VALUES (1637,'Odawara','JPN','Kanagawa',200171); +INSERT INTO `city` VALUES (1638,'Kofu','JPN','Yamanashi',199753); +INSERT INTO `city` VALUES (1639,'Kushiro','JPN','Hokkaido',197608); +INSERT INTO `city` VALUES (1640,'Kishiwada','JPN','Osaka',197276); +INSERT INTO `city` VALUES (1641,'Hitachi','JPN','Ibaragi',196622); +INSERT INTO `city` VALUES (1642,'Nagaoka','JPN','Niigata',192407); +INSERT INTO `city` VALUES (1643,'Itami','JPN','Hyogo',190886); +INSERT INTO `city` VALUES (1644,'Uji','JPN','Kyoto',188735); +INSERT INTO `city` VALUES (1645,'Suzuka','JPN','Mie',184061); +INSERT INTO `city` VALUES (1646,'Hirosaki','JPN','Aomori',177522); +INSERT INTO `city` VALUES (1647,'Ube','JPN','Yamaguchi',175206); +INSERT INTO `city` VALUES (1648,'Kodaira','JPN','Tokyo-to',174984); +INSERT INTO `city` VALUES (1649,'Takaoka','JPN','Toyama',174380); +INSERT INTO `city` VALUES (1650,'Obihiro','JPN','Hokkaido',173685); +INSERT INTO `city` VALUES (1651,'Tomakomai','JPN','Hokkaido',171958); +INSERT INTO `city` VALUES (1652,'Saga','JPN','Saga',170034); +INSERT INTO `city` VALUES (1653,'Sakura','JPN','Chiba',168072); +INSERT INTO `city` VALUES (1654,'Kamakura','JPN','Kanagawa',167661); +INSERT INTO `city` VALUES (1655,'Mitaka','JPN','Tokyo-to',167268); +INSERT INTO `city` VALUES (1656,'Izumi','JPN','Osaka',166979); +INSERT INTO `city` VALUES (1657,'Hino','JPN','Tokyo-to',166770); +INSERT INTO `city` VALUES (1658,'Hadano','JPN','Kanagawa',166512); +INSERT INTO `city` VALUES (1659,'Ashikaga','JPN','Tochigi',165243); +INSERT INTO `city` VALUES (1660,'Tsu','JPN','Mie',164543); +INSERT INTO `city` VALUES (1661,'Sayama','JPN','Saitama',162472); +INSERT INTO `city` VALUES (1662,'Yachiyo','JPN','Chiba',161222); +INSERT INTO `city` VALUES (1663,'Tsukuba','JPN','Ibaragi',160768); +INSERT INTO `city` VALUES (1664,'Tachikawa','JPN','Tokyo-to',159430); +INSERT INTO `city` VALUES (1665,'Kumagaya','JPN','Saitama',157171); +INSERT INTO `city` VALUES (1666,'Moriguchi','JPN','Osaka',155941); +INSERT INTO `city` VALUES (1667,'Otaru','JPN','Hokkaido',155784); +INSERT INTO `city` VALUES (1668,'Anjo','JPN','Aichi',153823); +INSERT INTO `city` VALUES (1669,'Narashino','JPN','Chiba',152849); +INSERT INTO `city` VALUES (1670,'Oyama','JPN','Tochigi',152820); +INSERT INTO `city` VALUES (1671,'Ogaki','JPN','Gifu',151758); +INSERT INTO `city` VALUES (1672,'Matsue','JPN','Shimane',149821); +INSERT INTO `city` VALUES (1673,'Kawanishi','JPN','Hyogo',149794); +INSERT INTO `city` VALUES (1674,'Hitachinaka','JPN','Tokyo-to',148006); +INSERT INTO `city` VALUES (1675,'Niiza','JPN','Saitama',147744); +INSERT INTO `city` VALUES (1676,'Nagareyama','JPN','Chiba',147738); +INSERT INTO `city` VALUES (1677,'Tottori','JPN','Tottori',147523); +INSERT INTO `city` VALUES (1678,'Tama','JPN','Ibaragi',146712); +INSERT INTO `city` VALUES (1679,'Iruma','JPN','Saitama',145922); +INSERT INTO `city` VALUES (1680,'Ota','JPN','Gumma',145317); +INSERT INTO `city` VALUES (1681,'Omuta','JPN','Fukuoka',142889); +INSERT INTO `city` VALUES (1682,'Komaki','JPN','Aichi',139827); +INSERT INTO `city` VALUES (1683,'Ome','JPN','Tokyo-to',139216); +INSERT INTO `city` VALUES (1684,'Kadoma','JPN','Osaka',138953); +INSERT INTO `city` VALUES (1685,'Yamaguchi','JPN','Yamaguchi',138210); +INSERT INTO `city` VALUES (1686,'Higashimurayama','JPN','Tokyo-to',136970); +INSERT INTO `city` VALUES (1687,'Yonago','JPN','Tottori',136461); +INSERT INTO `city` VALUES (1688,'Matsubara','JPN','Osaka',135010); +INSERT INTO `city` VALUES (1689,'Musashino','JPN','Tokyo-to',134426); +INSERT INTO `city` VALUES (1690,'Tsuchiura','JPN','Ibaragi',134072); +INSERT INTO `city` VALUES (1691,'Joetsu','JPN','Niigata',133505); +INSERT INTO `city` VALUES (1692,'Miyakonojo','JPN','Miyazaki',133183); +INSERT INTO `city` VALUES (1693,'Misato','JPN','Saitama',132957); +INSERT INTO `city` VALUES (1694,'Kakamigahara','JPN','Gifu',131831); +INSERT INTO `city` VALUES (1695,'Daito','JPN','Osaka',130594); +INSERT INTO `city` VALUES (1696,'Seto','JPN','Aichi',130470); +INSERT INTO `city` VALUES (1697,'Kariya','JPN','Aichi',127969); +INSERT INTO `city` VALUES (1698,'Urayasu','JPN','Chiba',127550); +INSERT INTO `city` VALUES (1699,'Beppu','JPN','Oita',127486); +INSERT INTO `city` VALUES (1700,'Niihama','JPN','Ehime',127207); +INSERT INTO `city` VALUES (1701,'Minoo','JPN','Osaka',127026); +INSERT INTO `city` VALUES (1702,'Fujieda','JPN','Shizuoka',126897); +INSERT INTO `city` VALUES (1703,'Abiko','JPN','Chiba',126670); +INSERT INTO `city` VALUES (1704,'Nobeoka','JPN','Miyazaki',125547); +INSERT INTO `city` VALUES (1705,'Tondabayashi','JPN','Osaka',125094); +INSERT INTO `city` VALUES (1706,'Ueda','JPN','Nagano',124217); +INSERT INTO `city` VALUES (1707,'Kashihara','JPN','Nara',124013); +INSERT INTO `city` VALUES (1708,'Matsusaka','JPN','Mie',123582); +INSERT INTO `city` VALUES (1709,'Isesaki','JPN','Gumma',123285); +INSERT INTO `city` VALUES (1710,'Zama','JPN','Kanagawa',122046); +INSERT INTO `city` VALUES (1711,'Kisarazu','JPN','Chiba',121967); +INSERT INTO `city` VALUES (1712,'Noda','JPN','Chiba',121030); +INSERT INTO `city` VALUES (1713,'Ishinomaki','JPN','Miyagi',120963); +INSERT INTO `city` VALUES (1714,'Fujinomiya','JPN','Shizuoka',119714); +INSERT INTO `city` VALUES (1715,'Kawachinagano','JPN','Osaka',119666); +INSERT INTO `city` VALUES (1716,'Imabari','JPN','Ehime',119357); +INSERT INTO `city` VALUES (1717,'Aizuwakamatsu','JPN','Fukushima',119287); +INSERT INTO `city` VALUES (1718,'Higashihiroshima','JPN','Hiroshima',119166); +INSERT INTO `city` VALUES (1719,'Habikino','JPN','Osaka',118968); +INSERT INTO `city` VALUES (1720,'Ebetsu','JPN','Hokkaido',118805); +INSERT INTO `city` VALUES (1721,'Hofu','JPN','Yamaguchi',118751); +INSERT INTO `city` VALUES (1722,'Kiryu','JPN','Gumma',118326); +INSERT INTO `city` VALUES (1723,'Okinawa','JPN','Okinawa',117748); +INSERT INTO `city` VALUES (1724,'Yaizu','JPN','Shizuoka',117258); +INSERT INTO `city` VALUES (1725,'Toyokawa','JPN','Aichi',115781); +INSERT INTO `city` VALUES (1726,'Ebina','JPN','Kanagawa',115571); +INSERT INTO `city` VALUES (1727,'Asaka','JPN','Saitama',114815); +INSERT INTO `city` VALUES (1728,'Higashikurume','JPN','Tokyo-to',111666); +INSERT INTO `city` VALUES (1729,'Ikoma','JPN','Nara',111645); +INSERT INTO `city` VALUES (1730,'Kitami','JPN','Hokkaido',111295); +INSERT INTO `city` VALUES (1731,'Koganei','JPN','Tokyo-to',110969); +INSERT INTO `city` VALUES (1732,'Iwatsuki','JPN','Saitama',110034); +INSERT INTO `city` VALUES (1733,'Mishima','JPN','Shizuoka',109699); +INSERT INTO `city` VALUES (1734,'Handa','JPN','Aichi',108600); +INSERT INTO `city` VALUES (1735,'Muroran','JPN','Hokkaido',108275); +INSERT INTO `city` VALUES (1736,'Komatsu','JPN','Ishikawa',107937); +INSERT INTO `city` VALUES (1737,'Yatsushiro','JPN','Kumamoto',107661); +INSERT INTO `city` VALUES (1738,'Iida','JPN','Nagano',107583); +INSERT INTO `city` VALUES (1739,'Tokuyama','JPN','Yamaguchi',107078); +INSERT INTO `city` VALUES (1740,'Kokubunji','JPN','Tokyo-to',106996); +INSERT INTO `city` VALUES (1741,'Akishima','JPN','Tokyo-to',106914); +INSERT INTO `city` VALUES (1742,'Iwakuni','JPN','Yamaguchi',106647); +INSERT INTO `city` VALUES (1743,'Kusatsu','JPN','Shiga',106232); +INSERT INTO `city` VALUES (1744,'Kuwana','JPN','Mie',106121); +INSERT INTO `city` VALUES (1745,'Sanda','JPN','Hyogo',105643); +INSERT INTO `city` VALUES (1746,'Hikone','JPN','Shiga',105508); +INSERT INTO `city` VALUES (1747,'Toda','JPN','Saitama',103969); +INSERT INTO `city` VALUES (1748,'Tajimi','JPN','Gifu',103171); +INSERT INTO `city` VALUES (1749,'Ikeda','JPN','Osaka',102710); +INSERT INTO `city` VALUES (1750,'Fukaya','JPN','Saitama',102156); +INSERT INTO `city` VALUES (1751,'Ise','JPN','Mie',101732); +INSERT INTO `city` VALUES (1752,'Sakata','JPN','Yamagata',101651); +INSERT INTO `city` VALUES (1753,'Kasuga','JPN','Fukuoka',101344); +INSERT INTO `city` VALUES (1754,'Kamagaya','JPN','Chiba',100821); +INSERT INTO `city` VALUES (1755,'Tsuruoka','JPN','Yamagata',100713); +INSERT INTO `city` VALUES (1756,'Hoya','JPN','Tokyo-to',100313); +INSERT INTO `city` VALUES (1757,'Nishio','JPN','Chiba',100032); +INSERT INTO `city` VALUES (1758,'Tokai','JPN','Aichi',99738); +INSERT INTO `city` VALUES (1759,'Inazawa','JPN','Aichi',98746); +INSERT INTO `city` VALUES (1760,'Sakado','JPN','Saitama',98221); +INSERT INTO `city` VALUES (1761,'Isehara','JPN','Kanagawa',98123); +INSERT INTO `city` VALUES (1762,'Takasago','JPN','Hyogo',97632); +INSERT INTO `city` VALUES (1763,'Fujimi','JPN','Saitama',96972); +INSERT INTO `city` VALUES (1764,'Urasoe','JPN','Okinawa',96002); +INSERT INTO `city` VALUES (1765,'Yonezawa','JPN','Yamagata',95592); +INSERT INTO `city` VALUES (1766,'Konan','JPN','Aichi',95521); +INSERT INTO `city` VALUES (1767,'Yamatokoriyama','JPN','Nara',95165); +INSERT INTO `city` VALUES (1768,'Maizuru','JPN','Kyoto',94784); +INSERT INTO `city` VALUES (1769,'Onomichi','JPN','Hiroshima',93756); +INSERT INTO `city` VALUES (1770,'Higashimatsuyama','JPN','Saitama',93342); +INSERT INTO `city` VALUES (1771,'Kimitsu','JPN','Chiba',93216); +INSERT INTO `city` VALUES (1772,'Isahaya','JPN','Nagasaki',93058); +INSERT INTO `city` VALUES (1773,'Kanuma','JPN','Tochigi',93053); +INSERT INTO `city` VALUES (1774,'Izumisano','JPN','Osaka',92583); +INSERT INTO `city` VALUES (1775,'Kameoka','JPN','Kyoto',92398); +INSERT INTO `city` VALUES (1776,'Mobara','JPN','Chiba',91664); +INSERT INTO `city` VALUES (1777,'Narita','JPN','Chiba',91470); +INSERT INTO `city` VALUES (1778,'Kashiwazaki','JPN','Niigata',91229); +INSERT INTO `city` VALUES (1779,'Tsuyama','JPN','Okayama',91170); +INSERT INTO `city` VALUES (1780,'Sanaa','YEM','Sanaa',503600); +INSERT INTO `city` VALUES (1781,'Aden','YEM','Aden',398300); +INSERT INTO `city` VALUES (1782,'Taizz','YEM','Taizz',317600); +INSERT INTO `city` VALUES (1783,'Hodeida','YEM','Hodeida',298500); +INSERT INTO `city` VALUES (1784,'al-Mukalla','YEM','Hadramawt',122400); +INSERT INTO `city` VALUES (1785,'Ibb','YEM','Ibb',103300); +INSERT INTO `city` VALUES (1786,'Amman','JOR','Amman',1000000); +INSERT INTO `city` VALUES (1787,'al-Zarqa','JOR','al-Zarqa',389815); +INSERT INTO `city` VALUES (1788,'Irbid','JOR','Irbid',231511); +INSERT INTO `city` VALUES (1789,'al-Rusayfa','JOR','al-Zarqa',137247); +INSERT INTO `city` VALUES (1790,'Wadi al-Sir','JOR','Amman',89104); +INSERT INTO `city` VALUES (1791,'Flying Fish Cove','CXR','�',700); +INSERT INTO `city` VALUES (1792,'Beograd','YUG','Central Serbia',1204000); +INSERT INTO `city` VALUES (1793,'Novi Sad','YUG','Vojvodina',179626); +INSERT INTO `city` VALUES (1794,'Ni�','YUG','Central Serbia',175391); +INSERT INTO `city` VALUES (1795,'Pri�tina','YUG','Kosovo and Metohija',155496); +INSERT INTO `city` VALUES (1796,'Kragujevac','YUG','Central Serbia',147305); +INSERT INTO `city` VALUES (1797,'Podgorica','YUG','Montenegro',135000); +INSERT INTO `city` VALUES (1798,'Subotica','YUG','Vojvodina',100386); +INSERT INTO `city` VALUES (1799,'Prizren','YUG','Kosovo and Metohija',92303); +INSERT INTO `city` VALUES (1800,'Phnom Penh','KHM','Phnom Penh',570155); +INSERT INTO `city` VALUES (1801,'Battambang','KHM','Battambang',129800); +INSERT INTO `city` VALUES (1802,'Siem Reap','KHM','Siem Reap',105100); +INSERT INTO `city` VALUES (1803,'Douala','CMR','Littoral',1448300); +INSERT INTO `city` VALUES (1804,'Yaound�','CMR','Centre',1372800); +INSERT INTO `city` VALUES (1805,'Garoua','CMR','Nord',177000); +INSERT INTO `city` VALUES (1806,'Maroua','CMR','Extr�me-Nord',143000); +INSERT INTO `city` VALUES (1807,'Bamenda','CMR','Nord-Ouest',138000); +INSERT INTO `city` VALUES (1808,'Bafoussam','CMR','Ouest',131000); +INSERT INTO `city` VALUES (1809,'Nkongsamba','CMR','Littoral',112454); +INSERT INTO `city` VALUES (1810,'Montr�al','CAN','Qu�bec',1016376); +INSERT INTO `city` VALUES (1811,'Calgary','CAN','Alberta',768082); +INSERT INTO `city` VALUES (1812,'Toronto','CAN','Ontario',688275); +INSERT INTO `city` VALUES (1813,'North York','CAN','Ontario',622632); +INSERT INTO `city` VALUES (1814,'Winnipeg','CAN','Manitoba',618477); +INSERT INTO `city` VALUES (1815,'Edmonton','CAN','Alberta',616306); +INSERT INTO `city` VALUES (1816,'Mississauga','CAN','Ontario',608072); +INSERT INTO `city` VALUES (1817,'Scarborough','CAN','Ontario',594501); +INSERT INTO `city` VALUES (1818,'Vancouver','CAN','British Colombia',514008); +INSERT INTO `city` VALUES (1819,'Etobicoke','CAN','Ontario',348845); +INSERT INTO `city` VALUES (1820,'London','CAN','Ontario',339917); +INSERT INTO `city` VALUES (1821,'Hamilton','CAN','Ontario',335614); +INSERT INTO `city` VALUES (1822,'Ottawa','CAN','Ontario',335277); +INSERT INTO `city` VALUES (1823,'Laval','CAN','Qu�bec',330393); +INSERT INTO `city` VALUES (1824,'Surrey','CAN','British Colombia',304477); +INSERT INTO `city` VALUES (1825,'Brampton','CAN','Ontario',296711); +INSERT INTO `city` VALUES (1826,'Windsor','CAN','Ontario',207588); +INSERT INTO `city` VALUES (1827,'Saskatoon','CAN','Saskatchewan',193647); +INSERT INTO `city` VALUES (1828,'Kitchener','CAN','Ontario',189959); +INSERT INTO `city` VALUES (1829,'Markham','CAN','Ontario',189098); +INSERT INTO `city` VALUES (1830,'Regina','CAN','Saskatchewan',180400); +INSERT INTO `city` VALUES (1831,'Burnaby','CAN','British Colombia',179209); +INSERT INTO `city` VALUES (1832,'Qu�bec','CAN','Qu�bec',167264); +INSERT INTO `city` VALUES (1833,'York','CAN','Ontario',154980); +INSERT INTO `city` VALUES (1834,'Richmond','CAN','British Colombia',148867); +INSERT INTO `city` VALUES (1835,'Vaughan','CAN','Ontario',147889); +INSERT INTO `city` VALUES (1836,'Burlington','CAN','Ontario',145150); +INSERT INTO `city` VALUES (1837,'Oshawa','CAN','Ontario',140173); +INSERT INTO `city` VALUES (1838,'Oakville','CAN','Ontario',139192); +INSERT INTO `city` VALUES (1839,'Saint Catharines','CAN','Ontario',136216); +INSERT INTO `city` VALUES (1840,'Longueuil','CAN','Qu�bec',127977); +INSERT INTO `city` VALUES (1841,'Richmond Hill','CAN','Ontario',116428); +INSERT INTO `city` VALUES (1842,'Thunder Bay','CAN','Ontario',115913); +INSERT INTO `city` VALUES (1843,'Nepean','CAN','Ontario',115100); +INSERT INTO `city` VALUES (1844,'Cape Breton','CAN','Nova Scotia',114733); +INSERT INTO `city` VALUES (1845,'East York','CAN','Ontario',114034); +INSERT INTO `city` VALUES (1846,'Halifax','CAN','Nova Scotia',113910); +INSERT INTO `city` VALUES (1847,'Cambridge','CAN','Ontario',109186); +INSERT INTO `city` VALUES (1848,'Gloucester','CAN','Ontario',107314); +INSERT INTO `city` VALUES (1849,'Abbotsford','CAN','British Colombia',105403); +INSERT INTO `city` VALUES (1850,'Guelph','CAN','Ontario',103593); +INSERT INTO `city` VALUES (1851,'Saint John�s','CAN','Newfoundland',101936); +INSERT INTO `city` VALUES (1852,'Coquitlam','CAN','British Colombia',101820); +INSERT INTO `city` VALUES (1853,'Saanich','CAN','British Colombia',101388); +INSERT INTO `city` VALUES (1854,'Gatineau','CAN','Qu�bec',100702); +INSERT INTO `city` VALUES (1855,'Delta','CAN','British Colombia',95411); +INSERT INTO `city` VALUES (1856,'Sudbury','CAN','Ontario',92686); +INSERT INTO `city` VALUES (1857,'Kelowna','CAN','British Colombia',89442); +INSERT INTO `city` VALUES (1858,'Barrie','CAN','Ontario',89269); +INSERT INTO `city` VALUES (1859,'Praia','CPV','S�o Tiago',94800); +INSERT INTO `city` VALUES (1860,'Almaty','KAZ','Almaty Qalasy',1129400); +INSERT INTO `city` VALUES (1861,'Qaraghandy','KAZ','Qaraghandy',436900); +INSERT INTO `city` VALUES (1862,'Shymkent','KAZ','South Kazakstan',360100); +INSERT INTO `city` VALUES (1863,'Taraz','KAZ','Taraz',330100); +INSERT INTO `city` VALUES (1864,'Astana','KAZ','Astana',311200); +INSERT INTO `city` VALUES (1865,'�skemen','KAZ','East Kazakstan',311000); +INSERT INTO `city` VALUES (1866,'Pavlodar','KAZ','Pavlodar',300500); +INSERT INTO `city` VALUES (1867,'Semey','KAZ','East Kazakstan',269600); +INSERT INTO `city` VALUES (1868,'Aqt�be','KAZ','Aqt�be',253100); +INSERT INTO `city` VALUES (1869,'Qostanay','KAZ','Qostanay',221400); +INSERT INTO `city` VALUES (1870,'Petropavl','KAZ','North Kazakstan',203500); +INSERT INTO `city` VALUES (1871,'Oral','KAZ','West Kazakstan',195500); +INSERT INTO `city` VALUES (1872,'Temirtau','KAZ','Qaraghandy',170500); +INSERT INTO `city` VALUES (1873,'Qyzylorda','KAZ','Qyzylorda',157400); +INSERT INTO `city` VALUES (1874,'Aqtau','KAZ','Mangghystau',143400); +INSERT INTO `city` VALUES (1875,'Atyrau','KAZ','Atyrau',142500); +INSERT INTO `city` VALUES (1876,'Ekibastuz','KAZ','Pavlodar',127200); +INSERT INTO `city` VALUES (1877,'K�kshetau','KAZ','North Kazakstan',123400); +INSERT INTO `city` VALUES (1878,'Rudnyy','KAZ','Qostanay',109500); +INSERT INTO `city` VALUES (1879,'Taldyqorghan','KAZ','Almaty',98000); +INSERT INTO `city` VALUES (1880,'Zhezqazghan','KAZ','Qaraghandy',90000); +INSERT INTO `city` VALUES (1881,'Nairobi','KEN','Nairobi',2290000); +INSERT INTO `city` VALUES (1882,'Mombasa','KEN','Coast',461753); +INSERT INTO `city` VALUES (1883,'Kisumu','KEN','Nyanza',192733); +INSERT INTO `city` VALUES (1884,'Nakuru','KEN','Rift Valley',163927); +INSERT INTO `city` VALUES (1885,'Machakos','KEN','Eastern',116293); +INSERT INTO `city` VALUES (1886,'Eldoret','KEN','Rift Valley',111882); +INSERT INTO `city` VALUES (1887,'Meru','KEN','Eastern',94947); +INSERT INTO `city` VALUES (1888,'Nyeri','KEN','Central',91258); +INSERT INTO `city` VALUES (1889,'Bangui','CAF','Bangui',524000); +INSERT INTO `city` VALUES (1890,'Shanghai','CHN','Shanghai',9696300); +INSERT INTO `city` VALUES (1891,'Peking','CHN','Peking',7472000); +INSERT INTO `city` VALUES (1892,'Chongqing','CHN','Chongqing',6351600); +INSERT INTO `city` VALUES (1893,'Tianjin','CHN','Tianjin',5286800); +INSERT INTO `city` VALUES (1894,'Wuhan','CHN','Hubei',4344600); +INSERT INTO `city` VALUES (1895,'Harbin','CHN','Heilongjiang',4289800); +INSERT INTO `city` VALUES (1896,'Shenyang','CHN','Liaoning',4265200); +INSERT INTO `city` VALUES (1897,'Kanton [Guangzhou]','CHN','Guangdong',4256300); +INSERT INTO `city` VALUES (1898,'Chengdu','CHN','Sichuan',3361500); +INSERT INTO `city` VALUES (1899,'Nanking [Nanjing]','CHN','Jiangsu',2870300); +INSERT INTO `city` VALUES (1900,'Changchun','CHN','Jilin',2812000); +INSERT INTO `city` VALUES (1901,'Xi�an','CHN','Shaanxi',2761400); +INSERT INTO `city` VALUES (1902,'Dalian','CHN','Liaoning',2697000); +INSERT INTO `city` VALUES (1903,'Qingdao','CHN','Shandong',2596000); +INSERT INTO `city` VALUES (1904,'Jinan','CHN','Shandong',2278100); +INSERT INTO `city` VALUES (1905,'Hangzhou','CHN','Zhejiang',2190500); +INSERT INTO `city` VALUES (1906,'Zhengzhou','CHN','Henan',2107200); +INSERT INTO `city` VALUES (1907,'Shijiazhuang','CHN','Hebei',2041500); +INSERT INTO `city` VALUES (1908,'Taiyuan','CHN','Shanxi',1968400); +INSERT INTO `city` VALUES (1909,'Kunming','CHN','Yunnan',1829500); +INSERT INTO `city` VALUES (1910,'Changsha','CHN','Hunan',1809800); +INSERT INTO `city` VALUES (1911,'Nanchang','CHN','Jiangxi',1691600); +INSERT INTO `city` VALUES (1912,'Fuzhou','CHN','Fujian',1593800); +INSERT INTO `city` VALUES (1913,'Lanzhou','CHN','Gansu',1565800); +INSERT INTO `city` VALUES (1914,'Guiyang','CHN','Guizhou',1465200); +INSERT INTO `city` VALUES (1915,'Ningbo','CHN','Zhejiang',1371200); +INSERT INTO `city` VALUES (1916,'Hefei','CHN','Anhui',1369100); +INSERT INTO `city` VALUES (1917,'Urumt�i [�r�mqi]','CHN','Xinxiang',1310100); +INSERT INTO `city` VALUES (1918,'Anshan','CHN','Liaoning',1200000); +INSERT INTO `city` VALUES (1919,'Fushun','CHN','Liaoning',1200000); +INSERT INTO `city` VALUES (1920,'Nanning','CHN','Guangxi',1161800); +INSERT INTO `city` VALUES (1921,'Zibo','CHN','Shandong',1140000); +INSERT INTO `city` VALUES (1922,'Qiqihar','CHN','Heilongjiang',1070000); +INSERT INTO `city` VALUES (1923,'Jilin','CHN','Jilin',1040000); +INSERT INTO `city` VALUES (1924,'Tangshan','CHN','Hebei',1040000); +INSERT INTO `city` VALUES (1925,'Baotou','CHN','Inner Mongolia',980000); +INSERT INTO `city` VALUES (1926,'Shenzhen','CHN','Guangdong',950500); +INSERT INTO `city` VALUES (1927,'Hohhot','CHN','Inner Mongolia',916700); +INSERT INTO `city` VALUES (1928,'Handan','CHN','Hebei',840000); +INSERT INTO `city` VALUES (1929,'Wuxi','CHN','Jiangsu',830000); +INSERT INTO `city` VALUES (1930,'Xuzhou','CHN','Jiangsu',810000); +INSERT INTO `city` VALUES (1931,'Datong','CHN','Shanxi',800000); +INSERT INTO `city` VALUES (1932,'Yichun','CHN','Heilongjiang',800000); +INSERT INTO `city` VALUES (1933,'Benxi','CHN','Liaoning',770000); +INSERT INTO `city` VALUES (1934,'Luoyang','CHN','Henan',760000); +INSERT INTO `city` VALUES (1935,'Suzhou','CHN','Jiangsu',710000); +INSERT INTO `city` VALUES (1936,'Xining','CHN','Qinghai',700200); +INSERT INTO `city` VALUES (1937,'Huainan','CHN','Anhui',700000); +INSERT INTO `city` VALUES (1938,'Jixi','CHN','Heilongjiang',683885); +INSERT INTO `city` VALUES (1939,'Daqing','CHN','Heilongjiang',660000); +INSERT INTO `city` VALUES (1940,'Fuxin','CHN','Liaoning',640000); +INSERT INTO `city` VALUES (1941,'Amoy [Xiamen]','CHN','Fujian',627500); +INSERT INTO `city` VALUES (1942,'Liuzhou','CHN','Guangxi',610000); +INSERT INTO `city` VALUES (1943,'Shantou','CHN','Guangdong',580000); +INSERT INTO `city` VALUES (1944,'Jinzhou','CHN','Liaoning',570000); +INSERT INTO `city` VALUES (1945,'Mudanjiang','CHN','Heilongjiang',570000); +INSERT INTO `city` VALUES (1946,'Yinchuan','CHN','Ningxia',544500); +INSERT INTO `city` VALUES (1947,'Changzhou','CHN','Jiangsu',530000); +INSERT INTO `city` VALUES (1948,'Zhangjiakou','CHN','Hebei',530000); +INSERT INTO `city` VALUES (1949,'Dandong','CHN','Liaoning',520000); +INSERT INTO `city` VALUES (1950,'Hegang','CHN','Heilongjiang',520000); +INSERT INTO `city` VALUES (1951,'Kaifeng','CHN','Henan',510000); +INSERT INTO `city` VALUES (1952,'Jiamusi','CHN','Heilongjiang',493409); +INSERT INTO `city` VALUES (1953,'Liaoyang','CHN','Liaoning',492559); +INSERT INTO `city` VALUES (1954,'Hengyang','CHN','Hunan',487148); +INSERT INTO `city` VALUES (1955,'Baoding','CHN','Hebei',483155); +INSERT INTO `city` VALUES (1956,'Hunjiang','CHN','Jilin',482043); +INSERT INTO `city` VALUES (1957,'Xinxiang','CHN','Henan',473762); +INSERT INTO `city` VALUES (1958,'Huangshi','CHN','Hubei',457601); +INSERT INTO `city` VALUES (1959,'Haikou','CHN','Hainan',454300); +INSERT INTO `city` VALUES (1960,'Yantai','CHN','Shandong',452127); +INSERT INTO `city` VALUES (1961,'Bengbu','CHN','Anhui',449245); +INSERT INTO `city` VALUES (1962,'Xiangtan','CHN','Hunan',441968); +INSERT INTO `city` VALUES (1963,'Weifang','CHN','Shandong',428522); +INSERT INTO `city` VALUES (1964,'Wuhu','CHN','Anhui',425740); +INSERT INTO `city` VALUES (1965,'Pingxiang','CHN','Jiangxi',425579); +INSERT INTO `city` VALUES (1966,'Yingkou','CHN','Liaoning',421589); +INSERT INTO `city` VALUES (1967,'Anyang','CHN','Henan',420332); +INSERT INTO `city` VALUES (1968,'Panzhihua','CHN','Sichuan',415466); +INSERT INTO `city` VALUES (1969,'Pingdingshan','CHN','Henan',410775); +INSERT INTO `city` VALUES (1970,'Xiangfan','CHN','Hubei',410407); +INSERT INTO `city` VALUES (1971,'Zhuzhou','CHN','Hunan',409924); +INSERT INTO `city` VALUES (1972,'Jiaozuo','CHN','Henan',409100); +INSERT INTO `city` VALUES (1973,'Wenzhou','CHN','Zhejiang',401871); +INSERT INTO `city` VALUES (1974,'Zhangjiang','CHN','Guangdong',400997); +INSERT INTO `city` VALUES (1975,'Zigong','CHN','Sichuan',393184); +INSERT INTO `city` VALUES (1976,'Shuangyashan','CHN','Heilongjiang',386081); +INSERT INTO `city` VALUES (1977,'Zaozhuang','CHN','Shandong',380846); +INSERT INTO `city` VALUES (1978,'Yakeshi','CHN','Inner Mongolia',377869); +INSERT INTO `city` VALUES (1979,'Yichang','CHN','Hubei',371601); +INSERT INTO `city` VALUES (1980,'Zhenjiang','CHN','Jiangsu',368316); +INSERT INTO `city` VALUES (1981,'Huaibei','CHN','Anhui',366549); +INSERT INTO `city` VALUES (1982,'Qinhuangdao','CHN','Hebei',364972); +INSERT INTO `city` VALUES (1983,'Guilin','CHN','Guangxi',364130); +INSERT INTO `city` VALUES (1984,'Liupanshui','CHN','Guizhou',363954); +INSERT INTO `city` VALUES (1985,'Panjin','CHN','Liaoning',362773); +INSERT INTO `city` VALUES (1986,'Yangquan','CHN','Shanxi',362268); +INSERT INTO `city` VALUES (1987,'Jinxi','CHN','Liaoning',357052); +INSERT INTO `city` VALUES (1988,'Liaoyuan','CHN','Jilin',354141); +INSERT INTO `city` VALUES (1989,'Lianyungang','CHN','Jiangsu',354139); +INSERT INTO `city` VALUES (1990,'Xianyang','CHN','Shaanxi',352125); +INSERT INTO `city` VALUES (1991,'Tai�an','CHN','Shandong',350696); +INSERT INTO `city` VALUES (1992,'Chifeng','CHN','Inner Mongolia',350077); +INSERT INTO `city` VALUES (1993,'Shaoguan','CHN','Guangdong',350043); +INSERT INTO `city` VALUES (1994,'Nantong','CHN','Jiangsu',343341); +INSERT INTO `city` VALUES (1995,'Leshan','CHN','Sichuan',341128); +INSERT INTO `city` VALUES (1996,'Baoji','CHN','Shaanxi',337765); +INSERT INTO `city` VALUES (1997,'Linyi','CHN','Shandong',324720); +INSERT INTO `city` VALUES (1998,'Tonghua','CHN','Jilin',324600); +INSERT INTO `city` VALUES (1999,'Siping','CHN','Jilin',317223); +INSERT INTO `city` VALUES (2000,'Changzhi','CHN','Shanxi',317144); +INSERT INTO `city` VALUES (2001,'Tengzhou','CHN','Shandong',315083); +INSERT INTO `city` VALUES (2002,'Chaozhou','CHN','Guangdong',313469); +INSERT INTO `city` VALUES (2003,'Yangzhou','CHN','Jiangsu',312892); +INSERT INTO `city` VALUES (2004,'Dongwan','CHN','Guangdong',308669); +INSERT INTO `city` VALUES (2005,'Ma�anshan','CHN','Anhui',305421); +INSERT INTO `city` VALUES (2006,'Foshan','CHN','Guangdong',303160); +INSERT INTO `city` VALUES (2007,'Yueyang','CHN','Hunan',302800); +INSERT INTO `city` VALUES (2008,'Xingtai','CHN','Hebei',302789); +INSERT INTO `city` VALUES (2009,'Changde','CHN','Hunan',301276); +INSERT INTO `city` VALUES (2010,'Shihezi','CHN','Xinxiang',299676); +INSERT INTO `city` VALUES (2011,'Yancheng','CHN','Jiangsu',296831); +INSERT INTO `city` VALUES (2012,'Jiujiang','CHN','Jiangxi',291187); +INSERT INTO `city` VALUES (2013,'Dongying','CHN','Shandong',281728); +INSERT INTO `city` VALUES (2014,'Shashi','CHN','Hubei',281352); +INSERT INTO `city` VALUES (2015,'Xintai','CHN','Shandong',281248); +INSERT INTO `city` VALUES (2016,'Jingdezhen','CHN','Jiangxi',281183); +INSERT INTO `city` VALUES (2017,'Tongchuan','CHN','Shaanxi',280657); +INSERT INTO `city` VALUES (2018,'Zhongshan','CHN','Guangdong',278829); +INSERT INTO `city` VALUES (2019,'Shiyan','CHN','Hubei',273786); +INSERT INTO `city` VALUES (2020,'Tieli','CHN','Heilongjiang',265683); +INSERT INTO `city` VALUES (2021,'Jining','CHN','Shandong',265248); +INSERT INTO `city` VALUES (2022,'Wuhai','CHN','Inner Mongolia',264081); +INSERT INTO `city` VALUES (2023,'Mianyang','CHN','Sichuan',262947); +INSERT INTO `city` VALUES (2024,'Luzhou','CHN','Sichuan',262892); +INSERT INTO `city` VALUES (2025,'Zunyi','CHN','Guizhou',261862); +INSERT INTO `city` VALUES (2026,'Shizuishan','CHN','Ningxia',257862); +INSERT INTO `city` VALUES (2027,'Neijiang','CHN','Sichuan',256012); +INSERT INTO `city` VALUES (2028,'Tongliao','CHN','Inner Mongolia',255129); +INSERT INTO `city` VALUES (2029,'Tieling','CHN','Liaoning',254842); +INSERT INTO `city` VALUES (2030,'Wafangdian','CHN','Liaoning',251733); +INSERT INTO `city` VALUES (2031,'Anqing','CHN','Anhui',250718); +INSERT INTO `city` VALUES (2032,'Shaoyang','CHN','Hunan',247227); +INSERT INTO `city` VALUES (2033,'Laiwu','CHN','Shandong',246833); +INSERT INTO `city` VALUES (2034,'Chengde','CHN','Hebei',246799); +INSERT INTO `city` VALUES (2035,'Tianshui','CHN','Gansu',244974); +INSERT INTO `city` VALUES (2036,'Nanyang','CHN','Henan',243303); +INSERT INTO `city` VALUES (2037,'Cangzhou','CHN','Hebei',242708); +INSERT INTO `city` VALUES (2038,'Yibin','CHN','Sichuan',241019); +INSERT INTO `city` VALUES (2039,'Huaiyin','CHN','Jiangsu',239675); +INSERT INTO `city` VALUES (2040,'Dunhua','CHN','Jilin',235100); +INSERT INTO `city` VALUES (2041,'Yanji','CHN','Jilin',230892); +INSERT INTO `city` VALUES (2042,'Jiangmen','CHN','Guangdong',230587); +INSERT INTO `city` VALUES (2043,'Tongling','CHN','Anhui',228017); +INSERT INTO `city` VALUES (2044,'Suihua','CHN','Heilongjiang',227881); +INSERT INTO `city` VALUES (2045,'Gongziling','CHN','Jilin',226569); +INSERT INTO `city` VALUES (2046,'Xiantao','CHN','Hubei',222884); +INSERT INTO `city` VALUES (2047,'Chaoyang','CHN','Liaoning',222394); +INSERT INTO `city` VALUES (2048,'Ganzhou','CHN','Jiangxi',220129); +INSERT INTO `city` VALUES (2049,'Huzhou','CHN','Zhejiang',218071); +INSERT INTO `city` VALUES (2050,'Baicheng','CHN','Jilin',217987); +INSERT INTO `city` VALUES (2051,'Shangzi','CHN','Heilongjiang',215373); +INSERT INTO `city` VALUES (2052,'Yangjiang','CHN','Guangdong',215196); +INSERT INTO `city` VALUES (2053,'Qitaihe','CHN','Heilongjiang',214957); +INSERT INTO `city` VALUES (2054,'Gejiu','CHN','Yunnan',214294); +INSERT INTO `city` VALUES (2055,'Jiangyin','CHN','Jiangsu',213659); +INSERT INTO `city` VALUES (2056,'Hebi','CHN','Henan',212976); +INSERT INTO `city` VALUES (2057,'Jiaxing','CHN','Zhejiang',211526); +INSERT INTO `city` VALUES (2058,'Wuzhou','CHN','Guangxi',210452); +INSERT INTO `city` VALUES (2059,'Meihekou','CHN','Jilin',209038); +INSERT INTO `city` VALUES (2060,'Xuchang','CHN','Henan',208815); +INSERT INTO `city` VALUES (2061,'Liaocheng','CHN','Shandong',207844); +INSERT INTO `city` VALUES (2062,'Haicheng','CHN','Liaoning',205560); +INSERT INTO `city` VALUES (2063,'Qianjiang','CHN','Hubei',205504); +INSERT INTO `city` VALUES (2064,'Baiyin','CHN','Gansu',204970); +INSERT INTO `city` VALUES (2065,'Bei�an','CHN','Heilongjiang',204899); +INSERT INTO `city` VALUES (2066,'Yixing','CHN','Jiangsu',200824); +INSERT INTO `city` VALUES (2067,'Laizhou','CHN','Shandong',198664); +INSERT INTO `city` VALUES (2068,'Qaramay','CHN','Xinxiang',197602); +INSERT INTO `city` VALUES (2069,'Acheng','CHN','Heilongjiang',197595); +INSERT INTO `city` VALUES (2070,'Dezhou','CHN','Shandong',195485); +INSERT INTO `city` VALUES (2071,'Nanping','CHN','Fujian',195064); +INSERT INTO `city` VALUES (2072,'Zhaoqing','CHN','Guangdong',194784); +INSERT INTO `city` VALUES (2073,'Beipiao','CHN','Liaoning',194301); +INSERT INTO `city` VALUES (2074,'Fengcheng','CHN','Jiangxi',193784); +INSERT INTO `city` VALUES (2075,'Fuyu','CHN','Jilin',192981); +INSERT INTO `city` VALUES (2076,'Xinyang','CHN','Henan',192509); +INSERT INTO `city` VALUES (2077,'Dongtai','CHN','Jiangsu',192247); +INSERT INTO `city` VALUES (2078,'Yuci','CHN','Shanxi',191356); +INSERT INTO `city` VALUES (2079,'Honghu','CHN','Hubei',190772); +INSERT INTO `city` VALUES (2080,'Ezhou','CHN','Hubei',190123); +INSERT INTO `city` VALUES (2081,'Heze','CHN','Shandong',189293); +INSERT INTO `city` VALUES (2082,'Daxian','CHN','Sichuan',188101); +INSERT INTO `city` VALUES (2083,'Linfen','CHN','Shanxi',187309); +INSERT INTO `city` VALUES (2084,'Tianmen','CHN','Hubei',186332); +INSERT INTO `city` VALUES (2085,'Yiyang','CHN','Hunan',185818); +INSERT INTO `city` VALUES (2086,'Quanzhou','CHN','Fujian',185154); +INSERT INTO `city` VALUES (2087,'Rizhao','CHN','Shandong',185048); +INSERT INTO `city` VALUES (2088,'Deyang','CHN','Sichuan',182488); +INSERT INTO `city` VALUES (2089,'Guangyuan','CHN','Sichuan',182241); +INSERT INTO `city` VALUES (2090,'Changshu','CHN','Jiangsu',181805); +INSERT INTO `city` VALUES (2091,'Zhangzhou','CHN','Fujian',181424); +INSERT INTO `city` VALUES (2092,'Hailar','CHN','Inner Mongolia',180650); +INSERT INTO `city` VALUES (2093,'Nanchong','CHN','Sichuan',180273); +INSERT INTO `city` VALUES (2094,'Jiutai','CHN','Jilin',180130); +INSERT INTO `city` VALUES (2095,'Zhaodong','CHN','Heilongjiang',179976); +INSERT INTO `city` VALUES (2096,'Shaoxing','CHN','Zhejiang',179818); +INSERT INTO `city` VALUES (2097,'Fuyang','CHN','Anhui',179572); +INSERT INTO `city` VALUES (2098,'Maoming','CHN','Guangdong',178683); +INSERT INTO `city` VALUES (2099,'Qujing','CHN','Yunnan',178669); +INSERT INTO `city` VALUES (2100,'Ghulja','CHN','Xinxiang',177193); +INSERT INTO `city` VALUES (2101,'Jiaohe','CHN','Jilin',176367); +INSERT INTO `city` VALUES (2102,'Puyang','CHN','Henan',175988); +INSERT INTO `city` VALUES (2103,'Huadian','CHN','Jilin',175873); +INSERT INTO `city` VALUES (2104,'Jiangyou','CHN','Sichuan',175753); +INSERT INTO `city` VALUES (2105,'Qashqar','CHN','Xinxiang',174570); +INSERT INTO `city` VALUES (2106,'Anshun','CHN','Guizhou',174142); +INSERT INTO `city` VALUES (2107,'Fuling','CHN','Sichuan',173878); +INSERT INTO `city` VALUES (2108,'Xinyu','CHN','Jiangxi',173524); +INSERT INTO `city` VALUES (2109,'Hanzhong','CHN','Shaanxi',169930); +INSERT INTO `city` VALUES (2110,'Danyang','CHN','Jiangsu',169603); +INSERT INTO `city` VALUES (2111,'Chenzhou','CHN','Hunan',169400); +INSERT INTO `city` VALUES (2112,'Xiaogan','CHN','Hubei',166280); +INSERT INTO `city` VALUES (2113,'Shangqiu','CHN','Henan',164880); +INSERT INTO `city` VALUES (2114,'Zhuhai','CHN','Guangdong',164747); +INSERT INTO `city` VALUES (2115,'Qingyuan','CHN','Guangdong',164641); +INSERT INTO `city` VALUES (2116,'Aqsu','CHN','Xinxiang',164092); +INSERT INTO `city` VALUES (2117,'Jining','CHN','Inner Mongolia',163552); +INSERT INTO `city` VALUES (2118,'Xiaoshan','CHN','Zhejiang',162930); +INSERT INTO `city` VALUES (2119,'Zaoyang','CHN','Hubei',162198); +INSERT INTO `city` VALUES (2120,'Xinghua','CHN','Jiangsu',161910); +INSERT INTO `city` VALUES (2121,'Hami','CHN','Xinxiang',161315); +INSERT INTO `city` VALUES (2122,'Huizhou','CHN','Guangdong',161023); +INSERT INTO `city` VALUES (2123,'Jinmen','CHN','Hubei',160794); +INSERT INTO `city` VALUES (2124,'Sanming','CHN','Fujian',160691); +INSERT INTO `city` VALUES (2125,'Ulanhot','CHN','Inner Mongolia',159538); +INSERT INTO `city` VALUES (2126,'Korla','CHN','Xinxiang',159344); +INSERT INTO `city` VALUES (2127,'Wanxian','CHN','Sichuan',156823); +INSERT INTO `city` VALUES (2128,'Rui�an','CHN','Zhejiang',156468); +INSERT INTO `city` VALUES (2129,'Zhoushan','CHN','Zhejiang',156317); +INSERT INTO `city` VALUES (2130,'Liangcheng','CHN','Shandong',156307); +INSERT INTO `city` VALUES (2131,'Jiaozhou','CHN','Shandong',153364); +INSERT INTO `city` VALUES (2132,'Taizhou','CHN','Jiangsu',152442); +INSERT INTO `city` VALUES (2133,'Suzhou','CHN','Anhui',151862); +INSERT INTO `city` VALUES (2134,'Yichun','CHN','Jiangxi',151585); +INSERT INTO `city` VALUES (2135,'Taonan','CHN','Jilin',150168); +INSERT INTO `city` VALUES (2136,'Pingdu','CHN','Shandong',150123); +INSERT INTO `city` VALUES (2137,'Ji�an','CHN','Jiangxi',148583); +INSERT INTO `city` VALUES (2138,'Longkou','CHN','Shandong',148362); +INSERT INTO `city` VALUES (2139,'Langfang','CHN','Hebei',148105); +INSERT INTO `city` VALUES (2140,'Zhoukou','CHN','Henan',146288); +INSERT INTO `city` VALUES (2141,'Suining','CHN','Sichuan',146086); +INSERT INTO `city` VALUES (2142,'Yulin','CHN','Guangxi',144467); +INSERT INTO `city` VALUES (2143,'Jinhua','CHN','Zhejiang',144280); +INSERT INTO `city` VALUES (2144,'Liu�an','CHN','Anhui',144248); +INSERT INTO `city` VALUES (2145,'Shuangcheng','CHN','Heilongjiang',142659); +INSERT INTO `city` VALUES (2146,'Suizhou','CHN','Hubei',142302); +INSERT INTO `city` VALUES (2147,'Ankang','CHN','Shaanxi',142170); +INSERT INTO `city` VALUES (2148,'Weinan','CHN','Shaanxi',140169); +INSERT INTO `city` VALUES (2149,'Longjing','CHN','Jilin',139417); +INSERT INTO `city` VALUES (2150,'Da�an','CHN','Jilin',138963); +INSERT INTO `city` VALUES (2151,'Lengshuijiang','CHN','Hunan',137994); +INSERT INTO `city` VALUES (2152,'Laiyang','CHN','Shandong',137080); +INSERT INTO `city` VALUES (2153,'Xianning','CHN','Hubei',136811); +INSERT INTO `city` VALUES (2154,'Dali','CHN','Yunnan',136554); +INSERT INTO `city` VALUES (2155,'Anda','CHN','Heilongjiang',136446); +INSERT INTO `city` VALUES (2156,'Jincheng','CHN','Shanxi',136396); +INSERT INTO `city` VALUES (2157,'Longyan','CHN','Fujian',134481); +INSERT INTO `city` VALUES (2158,'Xichang','CHN','Sichuan',134419); +INSERT INTO `city` VALUES (2159,'Wendeng','CHN','Shandong',133910); +INSERT INTO `city` VALUES (2160,'Hailun','CHN','Heilongjiang',133565); +INSERT INTO `city` VALUES (2161,'Binzhou','CHN','Shandong',133555); +INSERT INTO `city` VALUES (2162,'Linhe','CHN','Inner Mongolia',133183); +INSERT INTO `city` VALUES (2163,'Wuwei','CHN','Gansu',133101); +INSERT INTO `city` VALUES (2164,'Duyun','CHN','Guizhou',132971); +INSERT INTO `city` VALUES (2165,'Mishan','CHN','Heilongjiang',132744); +INSERT INTO `city` VALUES (2166,'Shangrao','CHN','Jiangxi',132455); +INSERT INTO `city` VALUES (2167,'Changji','CHN','Xinxiang',132260); +INSERT INTO `city` VALUES (2168,'Meixian','CHN','Guangdong',132156); +INSERT INTO `city` VALUES (2169,'Yushu','CHN','Jilin',131861); +INSERT INTO `city` VALUES (2170,'Tiefa','CHN','Liaoning',131807); +INSERT INTO `city` VALUES (2171,'Huai�an','CHN','Jiangsu',131149); +INSERT INTO `city` VALUES (2172,'Leiyang','CHN','Hunan',130115); +INSERT INTO `city` VALUES (2173,'Zalantun','CHN','Inner Mongolia',130031); +INSERT INTO `city` VALUES (2174,'Weihai','CHN','Shandong',128888); +INSERT INTO `city` VALUES (2175,'Loudi','CHN','Hunan',128418); +INSERT INTO `city` VALUES (2176,'Qingzhou','CHN','Shandong',128258); +INSERT INTO `city` VALUES (2177,'Qidong','CHN','Jiangsu',126872); +INSERT INTO `city` VALUES (2178,'Huaihua','CHN','Hunan',126785); +INSERT INTO `city` VALUES (2179,'Luohe','CHN','Henan',126438); +INSERT INTO `city` VALUES (2180,'Chuzhou','CHN','Anhui',125341); +INSERT INTO `city` VALUES (2181,'Kaiyuan','CHN','Liaoning',124219); +INSERT INTO `city` VALUES (2182,'Linqing','CHN','Shandong',123958); +INSERT INTO `city` VALUES (2183,'Chaohu','CHN','Anhui',123676); +INSERT INTO `city` VALUES (2184,'Laohekou','CHN','Hubei',123366); +INSERT INTO `city` VALUES (2185,'Dujiangyan','CHN','Sichuan',123357); +INSERT INTO `city` VALUES (2186,'Zhumadian','CHN','Henan',123232); +INSERT INTO `city` VALUES (2187,'Linchuan','CHN','Jiangxi',121949); +INSERT INTO `city` VALUES (2188,'Jiaonan','CHN','Shandong',121397); +INSERT INTO `city` VALUES (2189,'Sanmenxia','CHN','Henan',120523); +INSERT INTO `city` VALUES (2190,'Heyuan','CHN','Guangdong',120101); +INSERT INTO `city` VALUES (2191,'Manzhouli','CHN','Inner Mongolia',120023); +INSERT INTO `city` VALUES (2192,'Lhasa','CHN','Tibet',120000); +INSERT INTO `city` VALUES (2193,'Lianyuan','CHN','Hunan',118858); +INSERT INTO `city` VALUES (2194,'Kuytun','CHN','Xinxiang',118553); +INSERT INTO `city` VALUES (2195,'Puqi','CHN','Hubei',117264); +INSERT INTO `city` VALUES (2196,'Hongjiang','CHN','Hunan',116188); +INSERT INTO `city` VALUES (2197,'Qinzhou','CHN','Guangxi',114586); +INSERT INTO `city` VALUES (2198,'Renqiu','CHN','Hebei',114256); +INSERT INTO `city` VALUES (2199,'Yuyao','CHN','Zhejiang',114065); +INSERT INTO `city` VALUES (2200,'Guigang','CHN','Guangxi',114025); +INSERT INTO `city` VALUES (2201,'Kaili','CHN','Guizhou',113958); +INSERT INTO `city` VALUES (2202,'Yan�an','CHN','Shaanxi',113277); +INSERT INTO `city` VALUES (2203,'Beihai','CHN','Guangxi',112673); +INSERT INTO `city` VALUES (2204,'Xuangzhou','CHN','Anhui',112673); +INSERT INTO `city` VALUES (2205,'Quzhou','CHN','Zhejiang',112373); +INSERT INTO `city` VALUES (2206,'Yong�an','CHN','Fujian',111762); +INSERT INTO `city` VALUES (2207,'Zixing','CHN','Hunan',110048); +INSERT INTO `city` VALUES (2208,'Liyang','CHN','Jiangsu',109520); +INSERT INTO `city` VALUES (2209,'Yizheng','CHN','Jiangsu',109268); +INSERT INTO `city` VALUES (2210,'Yumen','CHN','Gansu',109234); +INSERT INTO `city` VALUES (2211,'Liling','CHN','Hunan',108504); +INSERT INTO `city` VALUES (2212,'Yuncheng','CHN','Shanxi',108359); +INSERT INTO `city` VALUES (2213,'Shanwei','CHN','Guangdong',107847); +INSERT INTO `city` VALUES (2214,'Cixi','CHN','Zhejiang',107329); +INSERT INTO `city` VALUES (2215,'Yuanjiang','CHN','Hunan',107004); +INSERT INTO `city` VALUES (2216,'Bozhou','CHN','Anhui',106346); +INSERT INTO `city` VALUES (2217,'Jinchang','CHN','Gansu',105287); +INSERT INTO `city` VALUES (2218,'Fu�an','CHN','Fujian',105265); +INSERT INTO `city` VALUES (2219,'Suqian','CHN','Jiangsu',105021); +INSERT INTO `city` VALUES (2220,'Shishou','CHN','Hubei',104571); +INSERT INTO `city` VALUES (2221,'Hengshui','CHN','Hebei',104269); +INSERT INTO `city` VALUES (2222,'Danjiangkou','CHN','Hubei',103211); +INSERT INTO `city` VALUES (2223,'Fujin','CHN','Heilongjiang',103104); +INSERT INTO `city` VALUES (2224,'Sanya','CHN','Hainan',102820); +INSERT INTO `city` VALUES (2225,'Guangshui','CHN','Hubei',102770); +INSERT INTO `city` VALUES (2226,'Huangshan','CHN','Anhui',102628); +INSERT INTO `city` VALUES (2227,'Xingcheng','CHN','Liaoning',102384); +INSERT INTO `city` VALUES (2228,'Zhucheng','CHN','Shandong',102134); +INSERT INTO `city` VALUES (2229,'Kunshan','CHN','Jiangsu',102052); +INSERT INTO `city` VALUES (2230,'Haining','CHN','Zhejiang',100478); +INSERT INTO `city` VALUES (2231,'Pingliang','CHN','Gansu',99265); +INSERT INTO `city` VALUES (2232,'Fuqing','CHN','Fujian',99193); +INSERT INTO `city` VALUES (2233,'Xinzhou','CHN','Shanxi',98667); +INSERT INTO `city` VALUES (2234,'Jieyang','CHN','Guangdong',98531); +INSERT INTO `city` VALUES (2235,'Zhangjiagang','CHN','Jiangsu',97994); +INSERT INTO `city` VALUES (2236,'Tong Xian','CHN','Peking',97168); +INSERT INTO `city` VALUES (2237,'Ya�an','CHN','Sichuan',95900); +INSERT INTO `city` VALUES (2238,'Jinzhou','CHN','Liaoning',95761); +INSERT INTO `city` VALUES (2239,'Emeishan','CHN','Sichuan',94000); +INSERT INTO `city` VALUES (2240,'Enshi','CHN','Hubei',93056); +INSERT INTO `city` VALUES (2241,'Bose','CHN','Guangxi',93009); +INSERT INTO `city` VALUES (2242,'Yuzhou','CHN','Henan',92889); +INSERT INTO `city` VALUES (2243,'Kaiyuan','CHN','Yunnan',91999); +INSERT INTO `city` VALUES (2244,'Tumen','CHN','Jilin',91471); +INSERT INTO `city` VALUES (2245,'Putian','CHN','Fujian',91030); +INSERT INTO `city` VALUES (2246,'Linhai','CHN','Zhejiang',90870); +INSERT INTO `city` VALUES (2247,'Xilin Hot','CHN','Inner Mongolia',90646); +INSERT INTO `city` VALUES (2248,'Shaowu','CHN','Fujian',90286); +INSERT INTO `city` VALUES (2249,'Junan','CHN','Shandong',90222); +INSERT INTO `city` VALUES (2250,'Huaying','CHN','Sichuan',89400); +INSERT INTO `city` VALUES (2251,'Pingyi','CHN','Shandong',89373); +INSERT INTO `city` VALUES (2252,'Huangyan','CHN','Zhejiang',89288); +INSERT INTO `city` VALUES (2253,'Bishkek','KGZ','Bishkek shaary',589400); +INSERT INTO `city` VALUES (2254,'Osh','KGZ','Osh',222700); +INSERT INTO `city` VALUES (2255,'Bikenibeu','KIR','South Tarawa',5055); +INSERT INTO `city` VALUES (2256,'Bairiki','KIR','South Tarawa',2226); +INSERT INTO `city` VALUES (2257,'Santaf� de Bogot�','COL','Santaf� de Bogot�',6260862); +INSERT INTO `city` VALUES (2258,'Cali','COL','Valle',2077386); +INSERT INTO `city` VALUES (2259,'Medell�n','COL','Antioquia',1861265); +INSERT INTO `city` VALUES (2260,'Barranquilla','COL','Atl�ntico',1223260); +INSERT INTO `city` VALUES (2261,'Cartagena','COL','Bol�var',805757); +INSERT INTO `city` VALUES (2262,'C�cuta','COL','Norte de Santander',606932); +INSERT INTO `city` VALUES (2263,'Bucaramanga','COL','Santander',515555); +INSERT INTO `city` VALUES (2264,'Ibagu�','COL','Tolima',393664); +INSERT INTO `city` VALUES (2265,'Pereira','COL','Risaralda',381725); +INSERT INTO `city` VALUES (2266,'Santa Marta','COL','Magdalena',359147); +INSERT INTO `city` VALUES (2267,'Manizales','COL','Caldas',337580); +INSERT INTO `city` VALUES (2268,'Bello','COL','Antioquia',333470); +INSERT INTO `city` VALUES (2269,'Pasto','COL','Nari�o',332396); +INSERT INTO `city` VALUES (2270,'Neiva','COL','Huila',300052); +INSERT INTO `city` VALUES (2271,'Soledad','COL','Atl�ntico',295058); +INSERT INTO `city` VALUES (2272,'Armenia','COL','Quind�o',288977); +INSERT INTO `city` VALUES (2273,'Villavicencio','COL','Meta',273140); +INSERT INTO `city` VALUES (2274,'Soacha','COL','Cundinamarca',272058); +INSERT INTO `city` VALUES (2275,'Valledupar','COL','Cesar',263247); +INSERT INTO `city` VALUES (2276,'Monter�a','COL','C�rdoba',248245); +INSERT INTO `city` VALUES (2277,'Itag��','COL','Antioquia',228985); +INSERT INTO `city` VALUES (2278,'Palmira','COL','Valle',226509); +INSERT INTO `city` VALUES (2279,'Buenaventura','COL','Valle',224336); +INSERT INTO `city` VALUES (2280,'Floridablanca','COL','Santander',221913); +INSERT INTO `city` VALUES (2281,'Sincelejo','COL','Sucre',220704); +INSERT INTO `city` VALUES (2282,'Popay�n','COL','Cauca',200719); +INSERT INTO `city` VALUES (2283,'Barrancabermeja','COL','Santander',178020); +INSERT INTO `city` VALUES (2284,'Dos Quebradas','COL','Risaralda',159363); +INSERT INTO `city` VALUES (2285,'Tulu�','COL','Valle',152488); +INSERT INTO `city` VALUES (2286,'Envigado','COL','Antioquia',135848); +INSERT INTO `city` VALUES (2287,'Cartago','COL','Valle',125884); +INSERT INTO `city` VALUES (2288,'Girardot','COL','Cundinamarca',110963); +INSERT INTO `city` VALUES (2289,'Buga','COL','Valle',110699); +INSERT INTO `city` VALUES (2290,'Tunja','COL','Boyac�',109740); +INSERT INTO `city` VALUES (2291,'Florencia','COL','Caquet�',108574); +INSERT INTO `city` VALUES (2292,'Maicao','COL','La Guajira',108053); +INSERT INTO `city` VALUES (2293,'Sogamoso','COL','Boyac�',107728); +INSERT INTO `city` VALUES (2294,'Giron','COL','Santander',90688); +INSERT INTO `city` VALUES (2295,'Moroni','COM','Njazidja',36000); +INSERT INTO `city` VALUES (2296,'Brazzaville','COG','Brazzaville',950000); +INSERT INTO `city` VALUES (2297,'Pointe-Noire','COG','Kouilou',500000); +INSERT INTO `city` VALUES (2298,'Kinshasa','COD','Kinshasa',5064000); +INSERT INTO `city` VALUES (2299,'Lubumbashi','COD','Shaba',851381); +INSERT INTO `city` VALUES (2300,'Mbuji-Mayi','COD','East Kasai',806475); +INSERT INTO `city` VALUES (2301,'Kolwezi','COD','Shaba',417810); +INSERT INTO `city` VALUES (2302,'Kisangani','COD','Haute-Za�re',417517); +INSERT INTO `city` VALUES (2303,'Kananga','COD','West Kasai',393030); +INSERT INTO `city` VALUES (2304,'Likasi','COD','Shaba',299118); +INSERT INTO `city` VALUES (2305,'Bukavu','COD','South Kivu',201569); +INSERT INTO `city` VALUES (2306,'Kikwit','COD','Bandundu',182142); +INSERT INTO `city` VALUES (2307,'Tshikapa','COD','West Kasai',180860); +INSERT INTO `city` VALUES (2308,'Matadi','COD','Bas-Za�re',172730); +INSERT INTO `city` VALUES (2309,'Mbandaka','COD','Equateur',169841); +INSERT INTO `city` VALUES (2310,'Mwene-Ditu','COD','East Kasai',137459); +INSERT INTO `city` VALUES (2311,'Boma','COD','Bas-Za�re',135284); +INSERT INTO `city` VALUES (2312,'Uvira','COD','South Kivu',115590); +INSERT INTO `city` VALUES (2313,'Butembo','COD','North Kivu',109406); +INSERT INTO `city` VALUES (2314,'Goma','COD','North Kivu',109094); +INSERT INTO `city` VALUES (2315,'Kalemie','COD','Shaba',101309); +INSERT INTO `city` VALUES (2316,'Bantam','CCK','Home Island',503); +INSERT INTO `city` VALUES (2317,'West Island','CCK','West Island',167); +INSERT INTO `city` VALUES (2318,'Pyongyang','PRK','Pyongyang-si',2484000); +INSERT INTO `city` VALUES (2319,'Hamhung','PRK','Hamgyong N',709730); +INSERT INTO `city` VALUES (2320,'Chongjin','PRK','Hamgyong P',582480); +INSERT INTO `city` VALUES (2321,'Nampo','PRK','Nampo-si',566200); +INSERT INTO `city` VALUES (2322,'Sinuiju','PRK','Pyongan P',326011); +INSERT INTO `city` VALUES (2323,'Wonsan','PRK','Kangwon',300148); +INSERT INTO `city` VALUES (2324,'Phyongsong','PRK','Pyongan N',272934); +INSERT INTO `city` VALUES (2325,'Sariwon','PRK','Hwanghae P',254146); +INSERT INTO `city` VALUES (2326,'Haeju','PRK','Hwanghae N',229172); +INSERT INTO `city` VALUES (2327,'Kanggye','PRK','Chagang',223410); +INSERT INTO `city` VALUES (2328,'Kimchaek','PRK','Hamgyong P',179000); +INSERT INTO `city` VALUES (2329,'Hyesan','PRK','Yanggang',178020); +INSERT INTO `city` VALUES (2330,'Kaesong','PRK','Kaesong-si',171500); +INSERT INTO `city` VALUES (2331,'Seoul','KOR','Seoul',9981619); +INSERT INTO `city` VALUES (2332,'Pusan','KOR','Pusan',3804522); +INSERT INTO `city` VALUES (2333,'Inchon','KOR','Inchon',2559424); +INSERT INTO `city` VALUES (2334,'Taegu','KOR','Taegu',2548568); +INSERT INTO `city` VALUES (2335,'Taejon','KOR','Taejon',1425835); +INSERT INTO `city` VALUES (2336,'Kwangju','KOR','Kwangju',1368341); +INSERT INTO `city` VALUES (2337,'Ulsan','KOR','Kyongsangnam',1084891); +INSERT INTO `city` VALUES (2338,'Songnam','KOR','Kyonggi',869094); +INSERT INTO `city` VALUES (2339,'Puchon','KOR','Kyonggi',779412); +INSERT INTO `city` VALUES (2340,'Suwon','KOR','Kyonggi',755550); +INSERT INTO `city` VALUES (2341,'Anyang','KOR','Kyonggi',591106); +INSERT INTO `city` VALUES (2342,'Chonju','KOR','Chollabuk',563153); +INSERT INTO `city` VALUES (2343,'Chongju','KOR','Chungchongbuk',531376); +INSERT INTO `city` VALUES (2344,'Koyang','KOR','Kyonggi',518282); +INSERT INTO `city` VALUES (2345,'Ansan','KOR','Kyonggi',510314); +INSERT INTO `city` VALUES (2346,'Pohang','KOR','Kyongsangbuk',508899); +INSERT INTO `city` VALUES (2347,'Chang-won','KOR','Kyongsangnam',481694); +INSERT INTO `city` VALUES (2348,'Masan','KOR','Kyongsangnam',441242); +INSERT INTO `city` VALUES (2349,'Kwangmyong','KOR','Kyonggi',350914); +INSERT INTO `city` VALUES (2350,'Chonan','KOR','Chungchongnam',330259); +INSERT INTO `city` VALUES (2351,'Chinju','KOR','Kyongsangnam',329886); +INSERT INTO `city` VALUES (2352,'Iksan','KOR','Chollabuk',322685); +INSERT INTO `city` VALUES (2353,'Pyongtaek','KOR','Kyonggi',312927); +INSERT INTO `city` VALUES (2354,'Kumi','KOR','Kyongsangbuk',311431); +INSERT INTO `city` VALUES (2355,'Uijongbu','KOR','Kyonggi',276111); +INSERT INTO `city` VALUES (2356,'Kyongju','KOR','Kyongsangbuk',272968); +INSERT INTO `city` VALUES (2357,'Kunsan','KOR','Chollabuk',266569); +INSERT INTO `city` VALUES (2358,'Cheju','KOR','Cheju',258511); +INSERT INTO `city` VALUES (2359,'Kimhae','KOR','Kyongsangnam',256370); +INSERT INTO `city` VALUES (2360,'Sunchon','KOR','Chollanam',249263); +INSERT INTO `city` VALUES (2361,'Mokpo','KOR','Chollanam',247452); +INSERT INTO `city` VALUES (2362,'Yong-in','KOR','Kyonggi',242643); +INSERT INTO `city` VALUES (2363,'Wonju','KOR','Kang-won',237460); +INSERT INTO `city` VALUES (2364,'Kunpo','KOR','Kyonggi',235233); +INSERT INTO `city` VALUES (2365,'Chunchon','KOR','Kang-won',234528); +INSERT INTO `city` VALUES (2366,'Namyangju','KOR','Kyonggi',229060); +INSERT INTO `city` VALUES (2367,'Kangnung','KOR','Kang-won',220403); +INSERT INTO `city` VALUES (2368,'Chungju','KOR','Chungchongbuk',205206); +INSERT INTO `city` VALUES (2369,'Andong','KOR','Kyongsangbuk',188443); +INSERT INTO `city` VALUES (2370,'Yosu','KOR','Chollanam',183596); +INSERT INTO `city` VALUES (2371,'Kyongsan','KOR','Kyongsangbuk',173746); +INSERT INTO `city` VALUES (2372,'Paju','KOR','Kyonggi',163379); +INSERT INTO `city` VALUES (2373,'Yangsan','KOR','Kyongsangnam',163351); +INSERT INTO `city` VALUES (2374,'Ichon','KOR','Kyonggi',155332); +INSERT INTO `city` VALUES (2375,'Asan','KOR','Chungchongnam',154663); +INSERT INTO `city` VALUES (2376,'Koje','KOR','Kyongsangnam',147562); +INSERT INTO `city` VALUES (2377,'Kimchon','KOR','Kyongsangbuk',147027); +INSERT INTO `city` VALUES (2378,'Nonsan','KOR','Chungchongnam',146619); +INSERT INTO `city` VALUES (2379,'Kuri','KOR','Kyonggi',142173); +INSERT INTO `city` VALUES (2380,'Chong-up','KOR','Chollabuk',139111); +INSERT INTO `city` VALUES (2381,'Chechon','KOR','Chungchongbuk',137070); +INSERT INTO `city` VALUES (2382,'Sosan','KOR','Chungchongnam',134746); +INSERT INTO `city` VALUES (2383,'Shihung','KOR','Kyonggi',133443); +INSERT INTO `city` VALUES (2384,'Tong-yong','KOR','Kyongsangnam',131717); +INSERT INTO `city` VALUES (2385,'Kongju','KOR','Chungchongnam',131229); +INSERT INTO `city` VALUES (2386,'Yongju','KOR','Kyongsangbuk',131097); +INSERT INTO `city` VALUES (2387,'Chinhae','KOR','Kyongsangnam',125997); +INSERT INTO `city` VALUES (2388,'Sangju','KOR','Kyongsangbuk',124116); +INSERT INTO `city` VALUES (2389,'Poryong','KOR','Chungchongnam',122604); +INSERT INTO `city` VALUES (2390,'Kwang-yang','KOR','Chollanam',122052); +INSERT INTO `city` VALUES (2391,'Miryang','KOR','Kyongsangnam',121501); +INSERT INTO `city` VALUES (2392,'Hanam','KOR','Kyonggi',115812); +INSERT INTO `city` VALUES (2393,'Kimje','KOR','Chollabuk',115427); +INSERT INTO `city` VALUES (2394,'Yongchon','KOR','Kyongsangbuk',113511); +INSERT INTO `city` VALUES (2395,'Sachon','KOR','Kyongsangnam',113494); +INSERT INTO `city` VALUES (2396,'Uiwang','KOR','Kyonggi',108788); +INSERT INTO `city` VALUES (2397,'Naju','KOR','Chollanam',107831); +INSERT INTO `city` VALUES (2398,'Namwon','KOR','Chollabuk',103544); +INSERT INTO `city` VALUES (2399,'Tonghae','KOR','Kang-won',95472); +INSERT INTO `city` VALUES (2400,'Mun-gyong','KOR','Kyongsangbuk',92239); +INSERT INTO `city` VALUES (2401,'Athenai','GRC','Attika',772072); +INSERT INTO `city` VALUES (2402,'Thessaloniki','GRC','Central Macedonia',383967); +INSERT INTO `city` VALUES (2403,'Pireus','GRC','Attika',182671); +INSERT INTO `city` VALUES (2404,'Patras','GRC','West Greece',153344); +INSERT INTO `city` VALUES (2405,'Peristerion','GRC','Attika',137288); +INSERT INTO `city` VALUES (2406,'Herakleion','GRC','Crete',116178); +INSERT INTO `city` VALUES (2407,'Kallithea','GRC','Attika',114233); +INSERT INTO `city` VALUES (2408,'Larisa','GRC','Thessalia',113090); +INSERT INTO `city` VALUES (2409,'Zagreb','HRV','Grad Zagreb',706770); +INSERT INTO `city` VALUES (2410,'Split','HRV','Split-Dalmatia',189388); +INSERT INTO `city` VALUES (2411,'Rijeka','HRV','Primorje-Gorski Kota',167964); +INSERT INTO `city` VALUES (2412,'Osijek','HRV','Osijek-Baranja',104761); +INSERT INTO `city` VALUES (2413,'La Habana','CUB','La Habana',2256000); +INSERT INTO `city` VALUES (2414,'Santiago de Cuba','CUB','Santiago de Cuba',433180); +INSERT INTO `city` VALUES (2415,'Camag�ey','CUB','Camag�ey',298726); +INSERT INTO `city` VALUES (2416,'Holgu�n','CUB','Holgu�n',249492); +INSERT INTO `city` VALUES (2417,'Santa Clara','CUB','Villa Clara',207350); +INSERT INTO `city` VALUES (2418,'Guant�namo','CUB','Guant�namo',205078); +INSERT INTO `city` VALUES (2419,'Pinar del R�o','CUB','Pinar del R�o',142100); +INSERT INTO `city` VALUES (2420,'Bayamo','CUB','Granma',141000); +INSERT INTO `city` VALUES (2421,'Cienfuegos','CUB','Cienfuegos',132770); +INSERT INTO `city` VALUES (2422,'Victoria de las Tunas','CUB','Las Tunas',132350); +INSERT INTO `city` VALUES (2423,'Matanzas','CUB','Matanzas',123273); +INSERT INTO `city` VALUES (2424,'Manzanillo','CUB','Granma',109350); +INSERT INTO `city` VALUES (2425,'Sancti-Sp�ritus','CUB','Sancti-Sp�ritus',100751); +INSERT INTO `city` VALUES (2426,'Ciego de �vila','CUB','Ciego de �vila',98505); +INSERT INTO `city` VALUES (2427,'al-Salimiya','KWT','Hawalli',130215); +INSERT INTO `city` VALUES (2428,'Jalib al-Shuyukh','KWT','Hawalli',102178); +INSERT INTO `city` VALUES (2429,'Kuwait','KWT','al-Asima',28859); +INSERT INTO `city` VALUES (2430,'Nicosia','CYP','Nicosia',195000); +INSERT INTO `city` VALUES (2431,'Limassol','CYP','Limassol',154400); +INSERT INTO `city` VALUES (2432,'Vientiane','LAO','Viangchan',531800); +INSERT INTO `city` VALUES (2433,'Savannakhet','LAO','Savannakhet',96652); +INSERT INTO `city` VALUES (2434,'Riga','LVA','Riika',764328); +INSERT INTO `city` VALUES (2435,'Daugavpils','LVA','Daugavpils',114829); +INSERT INTO `city` VALUES (2436,'Liepaja','LVA','Liepaja',89439); +INSERT INTO `city` VALUES (2437,'Maseru','LSO','Maseru',297000); +INSERT INTO `city` VALUES (2438,'Beirut','LBN','Beirut',1100000); +INSERT INTO `city` VALUES (2439,'Tripoli','LBN','al-Shamal',240000); +INSERT INTO `city` VALUES (2440,'Monrovia','LBR','Montserrado',850000); +INSERT INTO `city` VALUES (2441,'Tripoli','LBY','Tripoli',1682000); +INSERT INTO `city` VALUES (2442,'Bengasi','LBY','Bengasi',804000); +INSERT INTO `city` VALUES (2443,'Misrata','LBY','Misrata',121669); +INSERT INTO `city` VALUES (2444,'al-Zawiya','LBY','al-Zawiya',89338); +INSERT INTO `city` VALUES (2445,'Schaan','LIE','Schaan',5346); +INSERT INTO `city` VALUES (2446,'Vaduz','LIE','Vaduz',5043); +INSERT INTO `city` VALUES (2447,'Vilnius','LTU','Vilna',577969); +INSERT INTO `city` VALUES (2448,'Kaunas','LTU','Kaunas',412639); +INSERT INTO `city` VALUES (2449,'Klaipeda','LTU','Klaipeda',202451); +INSERT INTO `city` VALUES (2450,'�iauliai','LTU','�iauliai',146563); +INSERT INTO `city` VALUES (2451,'Panevezys','LTU','Panevezys',133695); +INSERT INTO `city` VALUES (2452,'Luxembourg [Luxemburg/L�tzebuerg]','LUX','Luxembourg',80700); +INSERT INTO `city` VALUES (2453,'El-Aai�n','ESH','El-Aai�n',169000); +INSERT INTO `city` VALUES (2454,'Macao','MAC','Macau',437500); +INSERT INTO `city` VALUES (2455,'Antananarivo','MDG','Antananarivo',675669); +INSERT INTO `city` VALUES (2456,'Toamasina','MDG','Toamasina',127441); +INSERT INTO `city` VALUES (2457,'Antsirab�','MDG','Antananarivo',120239); +INSERT INTO `city` VALUES (2458,'Mahajanga','MDG','Mahajanga',100807); +INSERT INTO `city` VALUES (2459,'Fianarantsoa','MDG','Fianarantsoa',99005); +INSERT INTO `city` VALUES (2460,'Skopje','MKD','Skopje',444299); +INSERT INTO `city` VALUES (2461,'Blantyre','MWI','Blantyre',478155); +INSERT INTO `city` VALUES (2462,'Lilongwe','MWI','Lilongwe',435964); +INSERT INTO `city` VALUES (2463,'Male','MDV','Maale',71000); +INSERT INTO `city` VALUES (2464,'Kuala Lumpur','MYS','Wilayah Persekutuan',1297526); +INSERT INTO `city` VALUES (2465,'Ipoh','MYS','Perak',382853); +INSERT INTO `city` VALUES (2466,'Johor Baharu','MYS','Johor',328436); +INSERT INTO `city` VALUES (2467,'Petaling Jaya','MYS','Selangor',254350); +INSERT INTO `city` VALUES (2468,'Kelang','MYS','Selangor',243355); +INSERT INTO `city` VALUES (2469,'Kuala Terengganu','MYS','Terengganu',228119); +INSERT INTO `city` VALUES (2470,'Pinang','MYS','Pulau Pinang',219603); +INSERT INTO `city` VALUES (2471,'Kota Bharu','MYS','Kelantan',219582); +INSERT INTO `city` VALUES (2472,'Kuantan','MYS','Pahang',199484); +INSERT INTO `city` VALUES (2473,'Taiping','MYS','Perak',183261); +INSERT INTO `city` VALUES (2474,'Seremban','MYS','Negeri Sembilan',182869); +INSERT INTO `city` VALUES (2475,'Kuching','MYS','Sarawak',148059); +INSERT INTO `city` VALUES (2476,'Sibu','MYS','Sarawak',126381); +INSERT INTO `city` VALUES (2477,'Sandakan','MYS','Sabah',125841); +INSERT INTO `city` VALUES (2478,'Alor Setar','MYS','Kedah',124412); +INSERT INTO `city` VALUES (2479,'Selayang Baru','MYS','Selangor',124228); +INSERT INTO `city` VALUES (2480,'Sungai Petani','MYS','Kedah',114763); +INSERT INTO `city` VALUES (2481,'Shah Alam','MYS','Selangor',102019); +INSERT INTO `city` VALUES (2482,'Bamako','MLI','Bamako',809552); +INSERT INTO `city` VALUES (2483,'Birkirkara','MLT','Outer Harbour',21445); +INSERT INTO `city` VALUES (2484,'Valletta','MLT','Inner Harbour',7073); +INSERT INTO `city` VALUES (2485,'Casablanca','MAR','Casablanca',2940623); +INSERT INTO `city` VALUES (2486,'Rabat','MAR','Rabat-Sal�-Zammour-Z',623457); +INSERT INTO `city` VALUES (2487,'Marrakech','MAR','Marrakech-Tensift-Al',621914); +INSERT INTO `city` VALUES (2488,'F�s','MAR','F�s-Boulemane',541162); +INSERT INTO `city` VALUES (2489,'Tanger','MAR','Tanger-T�touan',521735); +INSERT INTO `city` VALUES (2490,'Sal�','MAR','Rabat-Sal�-Zammour-Z',504420); +INSERT INTO `city` VALUES (2491,'Mekn�s','MAR','Mekn�s-Tafilalet',460000); +INSERT INTO `city` VALUES (2492,'Oujda','MAR','Oriental',365382); +INSERT INTO `city` VALUES (2493,'K�nitra','MAR','Gharb-Chrarda-B�ni H',292600); +INSERT INTO `city` VALUES (2494,'T�touan','MAR','Tanger-T�touan',277516); +INSERT INTO `city` VALUES (2495,'Safi','MAR','Doukkala-Abda',262300); +INSERT INTO `city` VALUES (2496,'Agadir','MAR','Souss Massa-Dra�',155244); +INSERT INTO `city` VALUES (2497,'Mohammedia','MAR','Casablanca',154706); +INSERT INTO `city` VALUES (2498,'Khouribga','MAR','Chaouia-Ouardigha',152090); +INSERT INTO `city` VALUES (2499,'Beni-Mellal','MAR','Tadla-Azilal',140212); +INSERT INTO `city` VALUES (2500,'T�mara','MAR','Rabat-Sal�-Zammour-Z',126303); +INSERT INTO `city` VALUES (2501,'El Jadida','MAR','Doukkala-Abda',119083); +INSERT INTO `city` VALUES (2502,'Nador','MAR','Oriental',112450); +INSERT INTO `city` VALUES (2503,'Ksar el Kebir','MAR','Tanger-T�touan',107065); +INSERT INTO `city` VALUES (2504,'Settat','MAR','Chaouia-Ouardigha',96200); +INSERT INTO `city` VALUES (2505,'Taza','MAR','Taza-Al Hoceima-Taou',92700); +INSERT INTO `city` VALUES (2506,'El Araich','MAR','Tanger-T�touan',90400); +INSERT INTO `city` VALUES (2507,'Dalap-Uliga-Darrit','MHL','Majuro',28000); +INSERT INTO `city` VALUES (2508,'Fort-de-France','MTQ','Fort-de-France',94050); +INSERT INTO `city` VALUES (2509,'Nouakchott','MRT','Nouakchott',667300); +INSERT INTO `city` VALUES (2510,'Nou�dhibou','MRT','Dakhlet Nou�dhibou',97600); +INSERT INTO `city` VALUES (2511,'Port-Louis','MUS','Port-Louis',138200); +INSERT INTO `city` VALUES (2512,'Beau Bassin-Rose Hill','MUS','Plaines Wilhelms',100616); +INSERT INTO `city` VALUES (2513,'Vacoas-Phoenix','MUS','Plaines Wilhelms',98464); +INSERT INTO `city` VALUES (2514,'Mamoutzou','MYT','Mamoutzou',12000); +INSERT INTO `city` VALUES (2515,'Ciudad de M�xico','MEX','Distrito Federal',8591309); +INSERT INTO `city` VALUES (2516,'Guadalajara','MEX','Jalisco',1647720); +INSERT INTO `city` VALUES (2517,'Ecatepec de Morelos','MEX','M�xico',1620303); +INSERT INTO `city` VALUES (2518,'Puebla','MEX','Puebla',1346176); +INSERT INTO `city` VALUES (2519,'Nezahualc�yotl','MEX','M�xico',1224924); +INSERT INTO `city` VALUES (2520,'Ju�rez','MEX','Chihuahua',1217818); +INSERT INTO `city` VALUES (2521,'Tijuana','MEX','Baja California',1212232); +INSERT INTO `city` VALUES (2522,'Le�n','MEX','Guanajuato',1133576); +INSERT INTO `city` VALUES (2523,'Monterrey','MEX','Nuevo Le�n',1108499); +INSERT INTO `city` VALUES (2524,'Zapopan','MEX','Jalisco',1002239); +INSERT INTO `city` VALUES (2525,'Naucalpan de Ju�rez','MEX','M�xico',857511); +INSERT INTO `city` VALUES (2526,'Mexicali','MEX','Baja California',764902); +INSERT INTO `city` VALUES (2527,'Culiac�n','MEX','Sinaloa',744859); +INSERT INTO `city` VALUES (2528,'Acapulco de Ju�rez','MEX','Guerrero',721011); +INSERT INTO `city` VALUES (2529,'Tlalnepantla de Baz','MEX','M�xico',720755); +INSERT INTO `city` VALUES (2530,'M�rida','MEX','Yucat�n',703324); +INSERT INTO `city` VALUES (2531,'Chihuahua','MEX','Chihuahua',670208); +INSERT INTO `city` VALUES (2532,'San Luis Potos�','MEX','San Luis Potos�',669353); +INSERT INTO `city` VALUES (2533,'Guadalupe','MEX','Nuevo Le�n',668780); +INSERT INTO `city` VALUES (2534,'Toluca','MEX','M�xico',665617); +INSERT INTO `city` VALUES (2535,'Aguascalientes','MEX','Aguascalientes',643360); +INSERT INTO `city` VALUES (2536,'Quer�taro','MEX','Quer�taro de Arteaga',639839); +INSERT INTO `city` VALUES (2537,'Morelia','MEX','Michoac�n de Ocampo',619958); +INSERT INTO `city` VALUES (2538,'Hermosillo','MEX','Sonora',608697); +INSERT INTO `city` VALUES (2539,'Saltillo','MEX','Coahuila de Zaragoza',577352); +INSERT INTO `city` VALUES (2540,'Torre�n','MEX','Coahuila de Zaragoza',529093); +INSERT INTO `city` VALUES (2541,'Centro (Villahermosa)','MEX','Tabasco',519873); +INSERT INTO `city` VALUES (2542,'San Nicol�s de los Garza','MEX','Nuevo Le�n',495540); +INSERT INTO `city` VALUES (2543,'Durango','MEX','Durango',490524); +INSERT INTO `city` VALUES (2544,'Chimalhuac�n','MEX','M�xico',490245); +INSERT INTO `city` VALUES (2545,'Tlaquepaque','MEX','Jalisco',475472); +INSERT INTO `city` VALUES (2546,'Atizap�n de Zaragoza','MEX','M�xico',467262); +INSERT INTO `city` VALUES (2547,'Veracruz','MEX','Veracruz',457119); +INSERT INTO `city` VALUES (2548,'Cuautitl�n Izcalli','MEX','M�xico',452976); +INSERT INTO `city` VALUES (2549,'Irapuato','MEX','Guanajuato',440039); +INSERT INTO `city` VALUES (2550,'Tuxtla Guti�rrez','MEX','Chiapas',433544); +INSERT INTO `city` VALUES (2551,'Tultitl�n','MEX','M�xico',432411); +INSERT INTO `city` VALUES (2552,'Reynosa','MEX','Tamaulipas',419776); +INSERT INTO `city` VALUES (2553,'Benito Ju�rez','MEX','Quintana Roo',419276); +INSERT INTO `city` VALUES (2554,'Matamoros','MEX','Tamaulipas',416428); +INSERT INTO `city` VALUES (2555,'Xalapa','MEX','Veracruz',390058); +INSERT INTO `city` VALUES (2556,'Celaya','MEX','Guanajuato',382140); +INSERT INTO `city` VALUES (2557,'Mazatl�n','MEX','Sinaloa',380265); +INSERT INTO `city` VALUES (2558,'Ensenada','MEX','Baja California',369573); +INSERT INTO `city` VALUES (2559,'Ahome','MEX','Sinaloa',358663); +INSERT INTO `city` VALUES (2560,'Cajeme','MEX','Sonora',355679); +INSERT INTO `city` VALUES (2561,'Cuernavaca','MEX','Morelos',337966); +INSERT INTO `city` VALUES (2562,'Tonal�','MEX','Jalisco',336109); +INSERT INTO `city` VALUES (2563,'Valle de Chalco Solidaridad','MEX','M�xico',323113); +INSERT INTO `city` VALUES (2564,'Nuevo Laredo','MEX','Tamaulipas',310277); +INSERT INTO `city` VALUES (2565,'Tepic','MEX','Nayarit',305025); +INSERT INTO `city` VALUES (2566,'Tampico','MEX','Tamaulipas',294789); +INSERT INTO `city` VALUES (2567,'Ixtapaluca','MEX','M�xico',293160); +INSERT INTO `city` VALUES (2568,'Apodaca','MEX','Nuevo Le�n',282941); +INSERT INTO `city` VALUES (2569,'Guasave','MEX','Sinaloa',277201); +INSERT INTO `city` VALUES (2570,'G�mez Palacio','MEX','Durango',272806); +INSERT INTO `city` VALUES (2571,'Tapachula','MEX','Chiapas',271141); +INSERT INTO `city` VALUES (2572,'Nicol�s Romero','MEX','M�xico',269393); +INSERT INTO `city` VALUES (2573,'Coatzacoalcos','MEX','Veracruz',267037); +INSERT INTO `city` VALUES (2574,'Uruapan','MEX','Michoac�n de Ocampo',265211); +INSERT INTO `city` VALUES (2575,'Victoria','MEX','Tamaulipas',262686); +INSERT INTO `city` VALUES (2576,'Oaxaca de Ju�rez','MEX','Oaxaca',256848); +INSERT INTO `city` VALUES (2577,'Coacalco de Berrioz�bal','MEX','M�xico',252270); +INSERT INTO `city` VALUES (2578,'Pachuca de Soto','MEX','Hidalgo',244688); +INSERT INTO `city` VALUES (2579,'General Escobedo','MEX','Nuevo Le�n',232961); +INSERT INTO `city` VALUES (2580,'Salamanca','MEX','Guanajuato',226864); +INSERT INTO `city` VALUES (2581,'Santa Catarina','MEX','Nuevo Le�n',226573); +INSERT INTO `city` VALUES (2582,'Tehuac�n','MEX','Puebla',225943); +INSERT INTO `city` VALUES (2583,'Chalco','MEX','M�xico',222201); +INSERT INTO `city` VALUES (2584,'C�rdenas','MEX','Tabasco',216903); +INSERT INTO `city` VALUES (2585,'Campeche','MEX','Campeche',216735); +INSERT INTO `city` VALUES (2586,'La Paz','MEX','M�xico',213045); +INSERT INTO `city` VALUES (2587,'Oth�n P. Blanco (Chetumal)','MEX','Quintana Roo',208014); +INSERT INTO `city` VALUES (2588,'Texcoco','MEX','M�xico',203681); +INSERT INTO `city` VALUES (2589,'La Paz','MEX','Baja California Sur',196708); +INSERT INTO `city` VALUES (2590,'Metepec','MEX','M�xico',194265); +INSERT INTO `city` VALUES (2591,'Monclova','MEX','Coahuila de Zaragoza',193657); +INSERT INTO `city` VALUES (2592,'Huixquilucan','MEX','M�xico',193156); +INSERT INTO `city` VALUES (2593,'Chilpancingo de los Bravo','MEX','Guerrero',192509); +INSERT INTO `city` VALUES (2594,'Puerto Vallarta','MEX','Jalisco',183741); +INSERT INTO `city` VALUES (2595,'Fresnillo','MEX','Zacatecas',182744); +INSERT INTO `city` VALUES (2596,'Ciudad Madero','MEX','Tamaulipas',182012); +INSERT INTO `city` VALUES (2597,'Soledad de Graciano S�nchez','MEX','San Luis Potos�',179956); +INSERT INTO `city` VALUES (2598,'San Juan del R�o','MEX','Quer�taro',179300); +INSERT INTO `city` VALUES (2599,'San Felipe del Progreso','MEX','M�xico',177330); +INSERT INTO `city` VALUES (2600,'C�rdoba','MEX','Veracruz',176952); +INSERT INTO `city` VALUES (2601,'Tec�mac','MEX','M�xico',172410); +INSERT INTO `city` VALUES (2602,'Ocosingo','MEX','Chiapas',171495); +INSERT INTO `city` VALUES (2603,'Carmen','MEX','Campeche',171367); +INSERT INTO `city` VALUES (2604,'L�zaro C�rdenas','MEX','Michoac�n de Ocampo',170878); +INSERT INTO `city` VALUES (2605,'Jiutepec','MEX','Morelos',170428); +INSERT INTO `city` VALUES (2606,'Papantla','MEX','Veracruz',170123); +INSERT INTO `city` VALUES (2607,'Comalcalco','MEX','Tabasco',164640); +INSERT INTO `city` VALUES (2608,'Zamora','MEX','Michoac�n de Ocampo',161191); +INSERT INTO `city` VALUES (2609,'Nogales','MEX','Sonora',159103); +INSERT INTO `city` VALUES (2610,'Huimanguillo','MEX','Tabasco',158335); +INSERT INTO `city` VALUES (2611,'Cuautla','MEX','Morelos',153132); +INSERT INTO `city` VALUES (2612,'Minatitl�n','MEX','Veracruz',152983); +INSERT INTO `city` VALUES (2613,'Poza Rica de Hidalgo','MEX','Veracruz',152678); +INSERT INTO `city` VALUES (2614,'Ciudad Valles','MEX','San Luis Potos�',146411); +INSERT INTO `city` VALUES (2615,'Navolato','MEX','Sinaloa',145396); +INSERT INTO `city` VALUES (2616,'San Luis R�o Colorado','MEX','Sonora',145276); +INSERT INTO `city` VALUES (2617,'P�njamo','MEX','Guanajuato',143927); +INSERT INTO `city` VALUES (2618,'San Andr�s Tuxtla','MEX','Veracruz',142251); +INSERT INTO `city` VALUES (2619,'Guanajuato','MEX','Guanajuato',141215); +INSERT INTO `city` VALUES (2620,'Navojoa','MEX','Sonora',140495); +INSERT INTO `city` VALUES (2621,'Zit�cuaro','MEX','Michoac�n de Ocampo',137970); +INSERT INTO `city` VALUES (2622,'Boca del R�o','MEX','Veracruz-Llave',135721); +INSERT INTO `city` VALUES (2623,'Allende','MEX','Guanajuato',134645); +INSERT INTO `city` VALUES (2624,'Silao','MEX','Guanajuato',134037); +INSERT INTO `city` VALUES (2625,'Macuspana','MEX','Tabasco',133795); +INSERT INTO `city` VALUES (2626,'San Juan Bautista Tuxtepec','MEX','Oaxaca',133675); +INSERT INTO `city` VALUES (2627,'San Crist�bal de las Casas','MEX','Chiapas',132317); +INSERT INTO `city` VALUES (2628,'Valle de Santiago','MEX','Guanajuato',130557); +INSERT INTO `city` VALUES (2629,'Guaymas','MEX','Sonora',130108); +INSERT INTO `city` VALUES (2630,'Colima','MEX','Colima',129454); +INSERT INTO `city` VALUES (2631,'Dolores Hidalgo','MEX','Guanajuato',128675); +INSERT INTO `city` VALUES (2632,'Lagos de Moreno','MEX','Jalisco',127949); +INSERT INTO `city` VALUES (2633,'Piedras Negras','MEX','Coahuila de Zaragoza',127898); +INSERT INTO `city` VALUES (2634,'Altamira','MEX','Tamaulipas',127490); +INSERT INTO `city` VALUES (2635,'T�xpam','MEX','Veracruz',126475); +INSERT INTO `city` VALUES (2636,'San Pedro Garza Garc�a','MEX','Nuevo Le�n',126147); +INSERT INTO `city` VALUES (2637,'Cuauht�moc','MEX','Chihuahua',124279); +INSERT INTO `city` VALUES (2638,'Manzanillo','MEX','Colima',124014); +INSERT INTO `city` VALUES (2639,'Iguala de la Independencia','MEX','Guerrero',123883); +INSERT INTO `city` VALUES (2640,'Zacatecas','MEX','Zacatecas',123700); +INSERT INTO `city` VALUES (2641,'Tlajomulco de Z��iga','MEX','Jalisco',123220); +INSERT INTO `city` VALUES (2642,'Tulancingo de Bravo','MEX','Hidalgo',121946); +INSERT INTO `city` VALUES (2643,'Zinacantepec','MEX','M�xico',121715); +INSERT INTO `city` VALUES (2644,'San Mart�n Texmelucan','MEX','Puebla',121093); +INSERT INTO `city` VALUES (2645,'Tepatitl�n de Morelos','MEX','Jalisco',118948); +INSERT INTO `city` VALUES (2646,'Mart�nez de la Torre','MEX','Veracruz',118815); +INSERT INTO `city` VALUES (2647,'Orizaba','MEX','Veracruz',118488); +INSERT INTO `city` VALUES (2648,'Apatzing�n','MEX','Michoac�n de Ocampo',117849); +INSERT INTO `city` VALUES (2649,'Atlixco','MEX','Puebla',117019); +INSERT INTO `city` VALUES (2650,'Delicias','MEX','Chihuahua',116132); +INSERT INTO `city` VALUES (2651,'Ixtlahuaca','MEX','M�xico',115548); +INSERT INTO `city` VALUES (2652,'El Mante','MEX','Tamaulipas',112453); +INSERT INTO `city` VALUES (2653,'Lerdo','MEX','Durango',112272); +INSERT INTO `city` VALUES (2654,'Almoloya de Ju�rez','MEX','M�xico',110550); +INSERT INTO `city` VALUES (2655,'Ac�mbaro','MEX','Guanajuato',110487); +INSERT INTO `city` VALUES (2656,'Acu�a','MEX','Coahuila de Zaragoza',110388); +INSERT INTO `city` VALUES (2657,'Guadalupe','MEX','Zacatecas',108881); +INSERT INTO `city` VALUES (2658,'Huejutla de Reyes','MEX','Hidalgo',108017); +INSERT INTO `city` VALUES (2659,'Hidalgo','MEX','Michoac�n de Ocampo',106198); +INSERT INTO `city` VALUES (2660,'Los Cabos','MEX','Baja California Sur',105199); +INSERT INTO `city` VALUES (2661,'Comit�n de Dom�nguez','MEX','Chiapas',104986); +INSERT INTO `city` VALUES (2662,'Cunduac�n','MEX','Tabasco',104164); +INSERT INTO `city` VALUES (2663,'R�o Bravo','MEX','Tamaulipas',103901); +INSERT INTO `city` VALUES (2664,'Temapache','MEX','Veracruz',102824); +INSERT INTO `city` VALUES (2665,'Chilapa de Alvarez','MEX','Guerrero',102716); +INSERT INTO `city` VALUES (2666,'Hidalgo del Parral','MEX','Chihuahua',100881); +INSERT INTO `city` VALUES (2667,'San Francisco del Rinc�n','MEX','Guanajuato',100149); +INSERT INTO `city` VALUES (2668,'Taxco de Alarc�n','MEX','Guerrero',99907); +INSERT INTO `city` VALUES (2669,'Zumpango','MEX','M�xico',99781); +INSERT INTO `city` VALUES (2670,'San Pedro Cholula','MEX','Puebla',99734); +INSERT INTO `city` VALUES (2671,'Lerma','MEX','M�xico',99714); +INSERT INTO `city` VALUES (2672,'Tecom�n','MEX','Colima',99296); +INSERT INTO `city` VALUES (2673,'Las Margaritas','MEX','Chiapas',97389); +INSERT INTO `city` VALUES (2674,'Cosoleacaque','MEX','Veracruz',97199); +INSERT INTO `city` VALUES (2675,'San Luis de la Paz','MEX','Guanajuato',96763); +INSERT INTO `city` VALUES (2676,'Jos� Azueta','MEX','Guerrero',95448); +INSERT INTO `city` VALUES (2677,'Santiago Ixcuintla','MEX','Nayarit',95311); +INSERT INTO `city` VALUES (2678,'San Felipe','MEX','Guanajuato',95305); +INSERT INTO `city` VALUES (2679,'Tejupilco','MEX','M�xico',94934); +INSERT INTO `city` VALUES (2680,'Tantoyuca','MEX','Veracruz',94709); +INSERT INTO `city` VALUES (2681,'Salvatierra','MEX','Guanajuato',94322); +INSERT INTO `city` VALUES (2682,'Tultepec','MEX','M�xico',93364); +INSERT INTO `city` VALUES (2683,'Temixco','MEX','Morelos',92686); +INSERT INTO `city` VALUES (2684,'Matamoros','MEX','Coahuila de Zaragoza',91858); +INSERT INTO `city` VALUES (2685,'P�nuco','MEX','Veracruz',90551); +INSERT INTO `city` VALUES (2686,'El Fuerte','MEX','Sinaloa',89556); +INSERT INTO `city` VALUES (2687,'Tierra Blanca','MEX','Veracruz',89143); +INSERT INTO `city` VALUES (2688,'Weno','FSM','Chuuk',22000); +INSERT INTO `city` VALUES (2689,'Palikir','FSM','Pohnpei',8600); +INSERT INTO `city` VALUES (2690,'Chisinau','MDA','Chisinau',719900); +INSERT INTO `city` VALUES (2691,'Tiraspol','MDA','Dnjestria',194300); +INSERT INTO `city` VALUES (2692,'Balti','MDA','Balti',153400); +INSERT INTO `city` VALUES (2693,'Bender (T�ghina)','MDA','Bender (T�ghina)',125700); +INSERT INTO `city` VALUES (2694,'Monte-Carlo','MCO','�',13154); +INSERT INTO `city` VALUES (2695,'Monaco-Ville','MCO','�',1234); +INSERT INTO `city` VALUES (2696,'Ulan Bator','MNG','Ulaanbaatar',773700); +INSERT INTO `city` VALUES (2697,'Plymouth','MSR','Plymouth',2000); +INSERT INTO `city` VALUES (2698,'Maputo','MOZ','Maputo',1018938); +INSERT INTO `city` VALUES (2699,'Matola','MOZ','Maputo',424662); +INSERT INTO `city` VALUES (2700,'Beira','MOZ','Sofala',397368); +INSERT INTO `city` VALUES (2701,'Nampula','MOZ','Nampula',303346); +INSERT INTO `city` VALUES (2702,'Chimoio','MOZ','Manica',171056); +INSERT INTO `city` VALUES (2703,'Na�ala-Porto','MOZ','Nampula',158248); +INSERT INTO `city` VALUES (2704,'Quelimane','MOZ','Zamb�zia',150116); +INSERT INTO `city` VALUES (2705,'Mocuba','MOZ','Zamb�zia',124700); +INSERT INTO `city` VALUES (2706,'Tete','MOZ','Tete',101984); +INSERT INTO `city` VALUES (2707,'Xai-Xai','MOZ','Gaza',99442); +INSERT INTO `city` VALUES (2708,'Gurue','MOZ','Zamb�zia',99300); +INSERT INTO `city` VALUES (2709,'Maxixe','MOZ','Inhambane',93985); +INSERT INTO `city` VALUES (2710,'Rangoon (Yangon)','MMR','Rangoon [Yangon]',3361700); +INSERT INTO `city` VALUES (2711,'Mandalay','MMR','Mandalay',885300); +INSERT INTO `city` VALUES (2712,'Moulmein (Mawlamyine)','MMR','Mon',307900); +INSERT INTO `city` VALUES (2713,'Pegu (Bago)','MMR','Pegu [Bago]',190900); +INSERT INTO `city` VALUES (2714,'Bassein (Pathein)','MMR','Irrawaddy [Ayeyarwad',183900); +INSERT INTO `city` VALUES (2715,'Monywa','MMR','Sagaing',138600); +INSERT INTO `city` VALUES (2716,'Sittwe (Akyab)','MMR','Rakhine',137600); +INSERT INTO `city` VALUES (2717,'Taunggyi (Taunggye)','MMR','Shan',131500); +INSERT INTO `city` VALUES (2718,'Meikhtila','MMR','Mandalay',129700); +INSERT INTO `city` VALUES (2719,'Mergui (Myeik)','MMR','Tenasserim [Tanintha',122700); +INSERT INTO `city` VALUES (2720,'Lashio (Lasho)','MMR','Shan',107600); +INSERT INTO `city` VALUES (2721,'Prome (Pyay)','MMR','Pegu [Bago]',105700); +INSERT INTO `city` VALUES (2722,'Henzada (Hinthada)','MMR','Irrawaddy [Ayeyarwad',104700); +INSERT INTO `city` VALUES (2723,'Myingyan','MMR','Mandalay',103600); +INSERT INTO `city` VALUES (2724,'Tavoy (Dawei)','MMR','Tenasserim [Tanintha',96800); +INSERT INTO `city` VALUES (2725,'Pagakku (Pakokku)','MMR','Magwe [Magway]',94800); +INSERT INTO `city` VALUES (2726,'Windhoek','NAM','Khomas',169000); +INSERT INTO `city` VALUES (2727,'Yangor','NRU','�',4050); +INSERT INTO `city` VALUES (2728,'Yaren','NRU','�',559); +INSERT INTO `city` VALUES (2729,'Kathmandu','NPL','Central',591835); +INSERT INTO `city` VALUES (2730,'Biratnagar','NPL','Eastern',157764); +INSERT INTO `city` VALUES (2731,'Pokhara','NPL','Western',146318); +INSERT INTO `city` VALUES (2732,'Lalitapur','NPL','Central',145847); +INSERT INTO `city` VALUES (2733,'Birgunj','NPL','Central',90639); +INSERT INTO `city` VALUES (2734,'Managua','NIC','Managua',959000); +INSERT INTO `city` VALUES (2735,'Le�n','NIC','Le�n',123865); +INSERT INTO `city` VALUES (2736,'Chinandega','NIC','Chinandega',97387); +INSERT INTO `city` VALUES (2737,'Masaya','NIC','Masaya',88971); +INSERT INTO `city` VALUES (2738,'Niamey','NER','Niamey',420000); +INSERT INTO `city` VALUES (2739,'Zinder','NER','Zinder',120892); +INSERT INTO `city` VALUES (2740,'Maradi','NER','Maradi',112965); +INSERT INTO `city` VALUES (2741,'Lagos','NGA','Lagos',1518000); +INSERT INTO `city` VALUES (2742,'Ibadan','NGA','Oyo & Osun',1432000); +INSERT INTO `city` VALUES (2743,'Ogbomosho','NGA','Oyo & Osun',730000); +INSERT INTO `city` VALUES (2744,'Kano','NGA','Kano & Jigawa',674100); +INSERT INTO `city` VALUES (2745,'Oshogbo','NGA','Oyo & Osun',476800); +INSERT INTO `city` VALUES (2746,'Ilorin','NGA','Kwara & Kogi',475800); +INSERT INTO `city` VALUES (2747,'Abeokuta','NGA','Ogun',427400); +INSERT INTO `city` VALUES (2748,'Port Harcourt','NGA','Rivers & Bayelsa',410000); +INSERT INTO `city` VALUES (2749,'Zaria','NGA','Kaduna',379200); +INSERT INTO `city` VALUES (2750,'Ilesha','NGA','Oyo & Osun',378400); +INSERT INTO `city` VALUES (2751,'Onitsha','NGA','Anambra & Enugu & Eb',371900); +INSERT INTO `city` VALUES (2752,'Iwo','NGA','Oyo & Osun',362000); +INSERT INTO `city` VALUES (2753,'Ado-Ekiti','NGA','Ondo & Ekiti',359400); +INSERT INTO `city` VALUES (2754,'Abuja','NGA','Federal Capital Dist',350100); +INSERT INTO `city` VALUES (2755,'Kaduna','NGA','Kaduna',342200); +INSERT INTO `city` VALUES (2756,'Mushin','NGA','Lagos',333200); +INSERT INTO `city` VALUES (2757,'Maiduguri','NGA','Borno & Yobe',320000); +INSERT INTO `city` VALUES (2758,'Enugu','NGA','Anambra & Enugu & Eb',316100); +INSERT INTO `city` VALUES (2759,'Ede','NGA','Oyo & Osun',307100); +INSERT INTO `city` VALUES (2760,'Aba','NGA','Imo & Abia',298900); +INSERT INTO `city` VALUES (2761,'Ife','NGA','Oyo & Osun',296800); +INSERT INTO `city` VALUES (2762,'Ila','NGA','Oyo & Osun',264000); +INSERT INTO `city` VALUES (2763,'Oyo','NGA','Oyo & Osun',256400); +INSERT INTO `city` VALUES (2764,'Ikerre','NGA','Ondo & Ekiti',244600); +INSERT INTO `city` VALUES (2765,'Benin City','NGA','Edo & Delta',229400); +INSERT INTO `city` VALUES (2766,'Iseyin','NGA','Oyo & Osun',217300); +INSERT INTO `city` VALUES (2767,'Katsina','NGA','Katsina',206500); +INSERT INTO `city` VALUES (2768,'Jos','NGA','Plateau & Nassarawa',206300); +INSERT INTO `city` VALUES (2769,'Sokoto','NGA','Sokoto & Kebbi & Zam',204900); +INSERT INTO `city` VALUES (2770,'Ilobu','NGA','Oyo & Osun',199000); +INSERT INTO `city` VALUES (2771,'Offa','NGA','Kwara & Kogi',197200); +INSERT INTO `city` VALUES (2772,'Ikorodu','NGA','Lagos',184900); +INSERT INTO `city` VALUES (2773,'Ilawe-Ekiti','NGA','Ondo & Ekiti',184500); +INSERT INTO `city` VALUES (2774,'Owo','NGA','Ondo & Ekiti',183500); +INSERT INTO `city` VALUES (2775,'Ikirun','NGA','Oyo & Osun',181400); +INSERT INTO `city` VALUES (2776,'Shaki','NGA','Oyo & Osun',174500); +INSERT INTO `city` VALUES (2777,'Calabar','NGA','Cross River',174400); +INSERT INTO `city` VALUES (2778,'Ondo','NGA','Ondo & Ekiti',173600); +INSERT INTO `city` VALUES (2779,'Akure','NGA','Ondo & Ekiti',162300); +INSERT INTO `city` VALUES (2780,'Gusau','NGA','Sokoto & Kebbi & Zam',158000); +INSERT INTO `city` VALUES (2781,'Ijebu-Ode','NGA','Ogun',156400); +INSERT INTO `city` VALUES (2782,'Effon-Alaiye','NGA','Oyo & Osun',153100); +INSERT INTO `city` VALUES (2783,'Kumo','NGA','Bauchi & Gombe',148000); +INSERT INTO `city` VALUES (2784,'Shomolu','NGA','Lagos',147700); +INSERT INTO `city` VALUES (2785,'Oka-Akoko','NGA','Ondo & Ekiti',142900); +INSERT INTO `city` VALUES (2786,'Ikare','NGA','Ondo & Ekiti',140800); +INSERT INTO `city` VALUES (2787,'Sapele','NGA','Edo & Delta',139200); +INSERT INTO `city` VALUES (2788,'Deba Habe','NGA','Bauchi & Gombe',138600); +INSERT INTO `city` VALUES (2789,'Minna','NGA','Niger',136900); +INSERT INTO `city` VALUES (2790,'Warri','NGA','Edo & Delta',126100); +INSERT INTO `city` VALUES (2791,'Bida','NGA','Niger',125500); +INSERT INTO `city` VALUES (2792,'Ikire','NGA','Oyo & Osun',123300); +INSERT INTO `city` VALUES (2793,'Makurdi','NGA','Benue',123100); +INSERT INTO `city` VALUES (2794,'Lafia','NGA','Plateau & Nassarawa',122500); +INSERT INTO `city` VALUES (2795,'Inisa','NGA','Oyo & Osun',119800); +INSERT INTO `city` VALUES (2796,'Shagamu','NGA','Ogun',117200); +INSERT INTO `city` VALUES (2797,'Awka','NGA','Anambra & Enugu & Eb',111200); +INSERT INTO `city` VALUES (2798,'Gombe','NGA','Bauchi & Gombe',107800); +INSERT INTO `city` VALUES (2799,'Igboho','NGA','Oyo & Osun',106800); +INSERT INTO `city` VALUES (2800,'Ejigbo','NGA','Oyo & Osun',105900); +INSERT INTO `city` VALUES (2801,'Agege','NGA','Lagos',105000); +INSERT INTO `city` VALUES (2802,'Ise-Ekiti','NGA','Ondo & Ekiti',103400); +INSERT INTO `city` VALUES (2803,'Ugep','NGA','Cross River',102600); +INSERT INTO `city` VALUES (2804,'Epe','NGA','Lagos',101000); +INSERT INTO `city` VALUES (2805,'Alofi','NIU','�',682); +INSERT INTO `city` VALUES (2806,'Kingston','NFK','�',800); +INSERT INTO `city` VALUES (2807,'Oslo','NOR','Oslo',508726); +INSERT INTO `city` VALUES (2808,'Bergen','NOR','Hordaland',230948); +INSERT INTO `city` VALUES (2809,'Trondheim','NOR','S�r-Tr�ndelag',150166); +INSERT INTO `city` VALUES (2810,'Stavanger','NOR','Rogaland',108848); +INSERT INTO `city` VALUES (2811,'B�rum','NOR','Akershus',101340); +INSERT INTO `city` VALUES (2812,'Abidjan','CIV','Abidjan',2500000); +INSERT INTO `city` VALUES (2813,'Bouak�','CIV','Bouak�',329850); +INSERT INTO `city` VALUES (2814,'Yamoussoukro','CIV','Yamoussoukro',130000); +INSERT INTO `city` VALUES (2815,'Daloa','CIV','Daloa',121842); +INSERT INTO `city` VALUES (2816,'Korhogo','CIV','Korhogo',109445); +INSERT INTO `city` VALUES (2817,'al-Sib','OMN','Masqat',155000); +INSERT INTO `city` VALUES (2818,'Salala','OMN','Zufar',131813); +INSERT INTO `city` VALUES (2819,'Bawshar','OMN','Masqat',107500); +INSERT INTO `city` VALUES (2820,'Suhar','OMN','al-Batina',90814); +INSERT INTO `city` VALUES (2821,'Masqat','OMN','Masqat',51969); +INSERT INTO `city` VALUES (2822,'Karachi','PAK','Sindh',9269265); +INSERT INTO `city` VALUES (2823,'Lahore','PAK','Punjab',5063499); +INSERT INTO `city` VALUES (2824,'Faisalabad','PAK','Punjab',1977246); +INSERT INTO `city` VALUES (2825,'Rawalpindi','PAK','Punjab',1406214); +INSERT INTO `city` VALUES (2826,'Multan','PAK','Punjab',1182441); +INSERT INTO `city` VALUES (2827,'Hyderabad','PAK','Sindh',1151274); +INSERT INTO `city` VALUES (2828,'Gujranwala','PAK','Punjab',1124749); +INSERT INTO `city` VALUES (2829,'Peshawar','PAK','Nothwest Border Prov',988005); +INSERT INTO `city` VALUES (2830,'Quetta','PAK','Baluchistan',560307); +INSERT INTO `city` VALUES (2831,'Islamabad','PAK','Islamabad',524500); +INSERT INTO `city` VALUES (2832,'Sargodha','PAK','Punjab',455360); +INSERT INTO `city` VALUES (2833,'Sialkot','PAK','Punjab',417597); +INSERT INTO `city` VALUES (2834,'Bahawalpur','PAK','Punjab',403408); +INSERT INTO `city` VALUES (2835,'Sukkur','PAK','Sindh',329176); +INSERT INTO `city` VALUES (2836,'Jhang','PAK','Punjab',292214); +INSERT INTO `city` VALUES (2837,'Sheikhupura','PAK','Punjab',271875); +INSERT INTO `city` VALUES (2838,'Larkana','PAK','Sindh',270366); +INSERT INTO `city` VALUES (2839,'Gujrat','PAK','Punjab',250121); +INSERT INTO `city` VALUES (2840,'Mardan','PAK','Nothwest Border Prov',244511); +INSERT INTO `city` VALUES (2841,'Kasur','PAK','Punjab',241649); +INSERT INTO `city` VALUES (2842,'Rahim Yar Khan','PAK','Punjab',228479); +INSERT INTO `city` VALUES (2843,'Sahiwal','PAK','Punjab',207388); +INSERT INTO `city` VALUES (2844,'Okara','PAK','Punjab',200901); +INSERT INTO `city` VALUES (2845,'Wah','PAK','Punjab',198400); +INSERT INTO `city` VALUES (2846,'Dera Ghazi Khan','PAK','Punjab',188100); +INSERT INTO `city` VALUES (2847,'Mirpur Khas','PAK','Sind',184500); +INSERT INTO `city` VALUES (2848,'Nawabshah','PAK','Sind',183100); +INSERT INTO `city` VALUES (2849,'Mingora','PAK','Nothwest Border Prov',174500); +INSERT INTO `city` VALUES (2850,'Chiniot','PAK','Punjab',169300); +INSERT INTO `city` VALUES (2851,'Kamoke','PAK','Punjab',151000); +INSERT INTO `city` VALUES (2852,'Mandi Burewala','PAK','Punjab',149900); +INSERT INTO `city` VALUES (2853,'Jhelum','PAK','Punjab',145800); +INSERT INTO `city` VALUES (2854,'Sadiqabad','PAK','Punjab',141500); +INSERT INTO `city` VALUES (2855,'Jacobabad','PAK','Sind',137700); +INSERT INTO `city` VALUES (2856,'Shikarpur','PAK','Sind',133300); +INSERT INTO `city` VALUES (2857,'Khanewal','PAK','Punjab',133000); +INSERT INTO `city` VALUES (2858,'Hafizabad','PAK','Punjab',130200); +INSERT INTO `city` VALUES (2859,'Kohat','PAK','Nothwest Border Prov',125300); +INSERT INTO `city` VALUES (2860,'Muzaffargarh','PAK','Punjab',121600); +INSERT INTO `city` VALUES (2861,'Khanpur','PAK','Punjab',117800); +INSERT INTO `city` VALUES (2862,'Gojra','PAK','Punjab',115000); +INSERT INTO `city` VALUES (2863,'Bahawalnagar','PAK','Punjab',109600); +INSERT INTO `city` VALUES (2864,'Muridke','PAK','Punjab',108600); +INSERT INTO `city` VALUES (2865,'Pak Pattan','PAK','Punjab',107800); +INSERT INTO `city` VALUES (2866,'Abottabad','PAK','Nothwest Border Prov',106000); +INSERT INTO `city` VALUES (2867,'Tando Adam','PAK','Sind',103400); +INSERT INTO `city` VALUES (2868,'Jaranwala','PAK','Punjab',103300); +INSERT INTO `city` VALUES (2869,'Khairpur','PAK','Sind',102200); +INSERT INTO `city` VALUES (2870,'Chishtian Mandi','PAK','Punjab',101700); +INSERT INTO `city` VALUES (2871,'Daska','PAK','Punjab',101500); +INSERT INTO `city` VALUES (2872,'Dadu','PAK','Sind',98600); +INSERT INTO `city` VALUES (2873,'Mandi Bahauddin','PAK','Punjab',97300); +INSERT INTO `city` VALUES (2874,'Ahmadpur East','PAK','Punjab',96000); +INSERT INTO `city` VALUES (2875,'Kamalia','PAK','Punjab',95300); +INSERT INTO `city` VALUES (2876,'Khuzdar','PAK','Baluchistan',93100); +INSERT INTO `city` VALUES (2877,'Vihari','PAK','Punjab',92300); +INSERT INTO `city` VALUES (2878,'Dera Ismail Khan','PAK','Nothwest Border Prov',90400); +INSERT INTO `city` VALUES (2879,'Wazirabad','PAK','Punjab',89700); +INSERT INTO `city` VALUES (2880,'Nowshera','PAK','Nothwest Border Prov',89400); +INSERT INTO `city` VALUES (2881,'Koror','PLW','Koror',12000); +INSERT INTO `city` VALUES (2882,'Ciudad de Panam�','PAN','Panam�',471373); +INSERT INTO `city` VALUES (2883,'San Miguelito','PAN','San Miguelito',315382); +INSERT INTO `city` VALUES (2884,'Port Moresby','PNG','National Capital Dis',247000); +INSERT INTO `city` VALUES (2885,'Asunci�n','PRY','Asunci�n',557776); +INSERT INTO `city` VALUES (2886,'Ciudad del Este','PRY','Alto Paran�',133881); +INSERT INTO `city` VALUES (2887,'San Lorenzo','PRY','Central',133395); +INSERT INTO `city` VALUES (2888,'Lambar�','PRY','Central',99681); +INSERT INTO `city` VALUES (2889,'Fernando de la Mora','PRY','Central',95287); +INSERT INTO `city` VALUES (2890,'Lima','PER','Lima',6464693); +INSERT INTO `city` VALUES (2891,'Arequipa','PER','Arequipa',762000); +INSERT INTO `city` VALUES (2892,'Trujillo','PER','La Libertad',652000); +INSERT INTO `city` VALUES (2893,'Chiclayo','PER','Lambayeque',517000); +INSERT INTO `city` VALUES (2894,'Callao','PER','Callao',424294); +INSERT INTO `city` VALUES (2895,'Iquitos','PER','Loreto',367000); +INSERT INTO `city` VALUES (2896,'Chimbote','PER','Ancash',336000); +INSERT INTO `city` VALUES (2897,'Huancayo','PER','Jun�n',327000); +INSERT INTO `city` VALUES (2898,'Piura','PER','Piura',325000); +INSERT INTO `city` VALUES (2899,'Cusco','PER','Cusco',291000); +INSERT INTO `city` VALUES (2900,'Pucallpa','PER','Ucayali',220866); +INSERT INTO `city` VALUES (2901,'Tacna','PER','Tacna',215683); +INSERT INTO `city` VALUES (2902,'Ica','PER','Ica',194820); +INSERT INTO `city` VALUES (2903,'Sullana','PER','Piura',147361); +INSERT INTO `city` VALUES (2904,'Juliaca','PER','Puno',142576); +INSERT INTO `city` VALUES (2905,'Hu�nuco','PER','Huanuco',129688); +INSERT INTO `city` VALUES (2906,'Ayacucho','PER','Ayacucho',118960); +INSERT INTO `city` VALUES (2907,'Chincha Alta','PER','Ica',110016); +INSERT INTO `city` VALUES (2908,'Cajamarca','PER','Cajamarca',108009); +INSERT INTO `city` VALUES (2909,'Puno','PER','Puno',101578); +INSERT INTO `city` VALUES (2910,'Ventanilla','PER','Callao',101056); +INSERT INTO `city` VALUES (2911,'Castilla','PER','Piura',90642); +INSERT INTO `city` VALUES (2912,'Adamstown','PCN','�',42); +INSERT INTO `city` VALUES (2913,'Garapan','MNP','Saipan',9200); +INSERT INTO `city` VALUES (2914,'Lisboa','PRT','Lisboa',563210); +INSERT INTO `city` VALUES (2915,'Porto','PRT','Porto',273060); +INSERT INTO `city` VALUES (2916,'Amadora','PRT','Lisboa',122106); +INSERT INTO `city` VALUES (2917,'Co�mbra','PRT','Co�mbra',96100); +INSERT INTO `city` VALUES (2918,'Braga','PRT','Braga',90535); +INSERT INTO `city` VALUES (2919,'San Juan','PRI','San Juan',434374); +INSERT INTO `city` VALUES (2920,'Bayam�n','PRI','Bayam�n',224044); +INSERT INTO `city` VALUES (2921,'Ponce','PRI','Ponce',186475); +INSERT INTO `city` VALUES (2922,'Carolina','PRI','Carolina',186076); +INSERT INTO `city` VALUES (2923,'Caguas','PRI','Caguas',140502); +INSERT INTO `city` VALUES (2924,'Arecibo','PRI','Arecibo',100131); +INSERT INTO `city` VALUES (2925,'Guaynabo','PRI','Guaynabo',100053); +INSERT INTO `city` VALUES (2926,'Mayag�ez','PRI','Mayag�ez',98434); +INSERT INTO `city` VALUES (2927,'Toa Baja','PRI','Toa Baja',94085); +INSERT INTO `city` VALUES (2928,'Warszawa','POL','Mazowieckie',1615369); +INSERT INTO `city` VALUES (2929,'L�dz','POL','Lodzkie',800110); +INSERT INTO `city` VALUES (2930,'Krak�w','POL','Malopolskie',738150); +INSERT INTO `city` VALUES (2931,'Wroclaw','POL','Dolnoslaskie',636765); +INSERT INTO `city` VALUES (2932,'Poznan','POL','Wielkopolskie',576899); +INSERT INTO `city` VALUES (2933,'Gdansk','POL','Pomorskie',458988); +INSERT INTO `city` VALUES (2934,'Szczecin','POL','Zachodnio-Pomorskie',416988); +INSERT INTO `city` VALUES (2935,'Bydgoszcz','POL','Kujawsko-Pomorskie',386855); +INSERT INTO `city` VALUES (2936,'Lublin','POL','Lubelskie',356251); +INSERT INTO `city` VALUES (2937,'Katowice','POL','Slaskie',345934); +INSERT INTO `city` VALUES (2938,'Bialystok','POL','Podlaskie',283937); +INSERT INTO `city` VALUES (2939,'Czestochowa','POL','Slaskie',257812); +INSERT INTO `city` VALUES (2940,'Gdynia','POL','Pomorskie',253521); +INSERT INTO `city` VALUES (2941,'Sosnowiec','POL','Slaskie',244102); +INSERT INTO `city` VALUES (2942,'Radom','POL','Mazowieckie',232262); +INSERT INTO `city` VALUES (2943,'Kielce','POL','Swietokrzyskie',212383); +INSERT INTO `city` VALUES (2944,'Gliwice','POL','Slaskie',212164); +INSERT INTO `city` VALUES (2945,'Torun','POL','Kujawsko-Pomorskie',206158); +INSERT INTO `city` VALUES (2946,'Bytom','POL','Slaskie',205560); +INSERT INTO `city` VALUES (2947,'Zabrze','POL','Slaskie',200177); +INSERT INTO `city` VALUES (2948,'Bielsko-Biala','POL','Slaskie',180307); +INSERT INTO `city` VALUES (2949,'Olsztyn','POL','Warminsko-Mazurskie',170904); +INSERT INTO `city` VALUES (2950,'Rzesz�w','POL','Podkarpackie',162049); +INSERT INTO `city` VALUES (2951,'Ruda Slaska','POL','Slaskie',159665); +INSERT INTO `city` VALUES (2952,'Rybnik','POL','Slaskie',144582); +INSERT INTO `city` VALUES (2953,'Walbrzych','POL','Dolnoslaskie',136923); +INSERT INTO `city` VALUES (2954,'Tychy','POL','Slaskie',133178); +INSERT INTO `city` VALUES (2955,'Dabrowa G�rnicza','POL','Slaskie',131037); +INSERT INTO `city` VALUES (2956,'Plock','POL','Mazowieckie',131011); +INSERT INTO `city` VALUES (2957,'Elblag','POL','Warminsko-Mazurskie',129782); +INSERT INTO `city` VALUES (2958,'Opole','POL','Opolskie',129553); +INSERT INTO `city` VALUES (2959,'Gorz�w Wielkopolski','POL','Lubuskie',126019); +INSERT INTO `city` VALUES (2960,'Wloclawek','POL','Kujawsko-Pomorskie',123373); +INSERT INTO `city` VALUES (2961,'Chorz�w','POL','Slaskie',121708); +INSERT INTO `city` VALUES (2962,'Tarn�w','POL','Malopolskie',121494); +INSERT INTO `city` VALUES (2963,'Zielona G�ra','POL','Lubuskie',118182); +INSERT INTO `city` VALUES (2964,'Koszalin','POL','Zachodnio-Pomorskie',112375); +INSERT INTO `city` VALUES (2965,'Legnica','POL','Dolnoslaskie',109335); +INSERT INTO `city` VALUES (2966,'Kalisz','POL','Wielkopolskie',106641); +INSERT INTO `city` VALUES (2967,'Grudziadz','POL','Kujawsko-Pomorskie',102434); +INSERT INTO `city` VALUES (2968,'Slupsk','POL','Pomorskie',102370); +INSERT INTO `city` VALUES (2969,'Jastrzebie-Zdr�j','POL','Slaskie',102294); +INSERT INTO `city` VALUES (2970,'Jaworzno','POL','Slaskie',97929); +INSERT INTO `city` VALUES (2971,'Jelenia G�ra','POL','Dolnoslaskie',93901); +INSERT INTO `city` VALUES (2972,'Malabo','GNQ','Bioko',40000); +INSERT INTO `city` VALUES (2973,'Doha','QAT','Doha',355000); +INSERT INTO `city` VALUES (2974,'Paris','FRA','�le-de-France',2125246); +INSERT INTO `city` VALUES (2975,'Marseille','FRA','Provence-Alpes-C�te',798430); +INSERT INTO `city` VALUES (2976,'Lyon','FRA','Rh�ne-Alpes',445452); +INSERT INTO `city` VALUES (2977,'Toulouse','FRA','Midi-Pyr�n�es',390350); +INSERT INTO `city` VALUES (2978,'Nice','FRA','Provence-Alpes-C�te',342738); +INSERT INTO `city` VALUES (2979,'Nantes','FRA','Pays de la Loire',270251); +INSERT INTO `city` VALUES (2980,'Strasbourg','FRA','Alsace',264115); +INSERT INTO `city` VALUES (2981,'Montpellier','FRA','Languedoc-Roussillon',225392); +INSERT INTO `city` VALUES (2982,'Bordeaux','FRA','Aquitaine',215363); +INSERT INTO `city` VALUES (2983,'Rennes','FRA','Haute-Normandie',206229); +INSERT INTO `city` VALUES (2984,'Le Havre','FRA','Champagne-Ardenne',190905); +INSERT INTO `city` VALUES (2985,'Reims','FRA','Nord-Pas-de-Calais',187206); +INSERT INTO `city` VALUES (2986,'Lille','FRA','Rh�ne-Alpes',184657); +INSERT INTO `city` VALUES (2987,'St-�tienne','FRA','Bretagne',180210); +INSERT INTO `city` VALUES (2988,'Toulon','FRA','Provence-Alpes-C�te',160639); +INSERT INTO `city` VALUES (2989,'Grenoble','FRA','Rh�ne-Alpes',153317); +INSERT INTO `city` VALUES (2990,'Angers','FRA','Pays de la Loire',151279); +INSERT INTO `city` VALUES (2991,'Dijon','FRA','Bourgogne',149867); +INSERT INTO `city` VALUES (2992,'Brest','FRA','Bretagne',149634); +INSERT INTO `city` VALUES (2993,'Le Mans','FRA','Pays de la Loire',146105); +INSERT INTO `city` VALUES (2994,'Clermont-Ferrand','FRA','Auvergne',137140); +INSERT INTO `city` VALUES (2995,'Amiens','FRA','Picardie',135501); +INSERT INTO `city` VALUES (2996,'Aix-en-Provence','FRA','Provence-Alpes-C�te',134222); +INSERT INTO `city` VALUES (2997,'Limoges','FRA','Limousin',133968); +INSERT INTO `city` VALUES (2998,'N�mes','FRA','Languedoc-Roussillon',133424); +INSERT INTO `city` VALUES (2999,'Tours','FRA','Centre',132820); +INSERT INTO `city` VALUES (3000,'Villeurbanne','FRA','Rh�ne-Alpes',124215); +INSERT INTO `city` VALUES (3001,'Metz','FRA','Lorraine',123776); +INSERT INTO `city` VALUES (3002,'Besan�on','FRA','Franche-Comt�',117733); +INSERT INTO `city` VALUES (3003,'Caen','FRA','Basse-Normandie',113987); +INSERT INTO `city` VALUES (3004,'Orl�ans','FRA','Centre',113126); +INSERT INTO `city` VALUES (3005,'Mulhouse','FRA','Alsace',110359); +INSERT INTO `city` VALUES (3006,'Rouen','FRA','Haute-Normandie',106592); +INSERT INTO `city` VALUES (3007,'Boulogne-Billancourt','FRA','�le-de-France',106367); +INSERT INTO `city` VALUES (3008,'Perpignan','FRA','Languedoc-Roussillon',105115); +INSERT INTO `city` VALUES (3009,'Nancy','FRA','Lorraine',103605); +INSERT INTO `city` VALUES (3010,'Roubaix','FRA','Nord-Pas-de-Calais',96984); +INSERT INTO `city` VALUES (3011,'Argenteuil','FRA','�le-de-France',93961); +INSERT INTO `city` VALUES (3012,'Tourcoing','FRA','Nord-Pas-de-Calais',93540); +INSERT INTO `city` VALUES (3013,'Montreuil','FRA','�le-de-France',90674); +INSERT INTO `city` VALUES (3014,'Cayenne','GUF','Cayenne',50699); +INSERT INTO `city` VALUES (3015,'Faaa','PYF','Tahiti',25888); +INSERT INTO `city` VALUES (3016,'Papeete','PYF','Tahiti',25553); +INSERT INTO `city` VALUES (3017,'Saint-Denis','REU','Saint-Denis',131480); +INSERT INTO `city` VALUES (3018,'Bucuresti','ROM','Bukarest',2016131); +INSERT INTO `city` VALUES (3019,'Iasi','ROM','Iasi',348070); +INSERT INTO `city` VALUES (3020,'Constanta','ROM','Constanta',342264); +INSERT INTO `city` VALUES (3021,'Cluj-Napoca','ROM','Cluj',332498); +INSERT INTO `city` VALUES (3022,'Galati','ROM','Galati',330276); +INSERT INTO `city` VALUES (3023,'Timisoara','ROM','Timis',324304); +INSERT INTO `city` VALUES (3024,'Brasov','ROM','Brasov',314225); +INSERT INTO `city` VALUES (3025,'Craiova','ROM','Dolj',313530); +INSERT INTO `city` VALUES (3026,'Ploiesti','ROM','Prahova',251348); +INSERT INTO `city` VALUES (3027,'Braila','ROM','Braila',233756); +INSERT INTO `city` VALUES (3028,'Oradea','ROM','Bihor',222239); +INSERT INTO `city` VALUES (3029,'Bacau','ROM','Bacau',209235); +INSERT INTO `city` VALUES (3030,'Pitesti','ROM','Arges',187170); +INSERT INTO `city` VALUES (3031,'Arad','ROM','Arad',184408); +INSERT INTO `city` VALUES (3032,'Sibiu','ROM','Sibiu',169611); +INSERT INTO `city` VALUES (3033,'T�rgu Mures','ROM','Mures',165153); +INSERT INTO `city` VALUES (3034,'Baia Mare','ROM','Maramures',149665); +INSERT INTO `city` VALUES (3035,'Buzau','ROM','Buzau',148372); +INSERT INTO `city` VALUES (3036,'Satu Mare','ROM','Satu Mare',130059); +INSERT INTO `city` VALUES (3037,'Botosani','ROM','Botosani',128730); +INSERT INTO `city` VALUES (3038,'Piatra Neamt','ROM','Neamt',125070); +INSERT INTO `city` VALUES (3039,'R�mnicu V�lcea','ROM','V�lcea',119741); +INSERT INTO `city` VALUES (3040,'Suceava','ROM','Suceava',118549); +INSERT INTO `city` VALUES (3041,'Drobeta-Turnu Severin','ROM','Mehedinti',117865); +INSERT INTO `city` VALUES (3042,'T�rgoviste','ROM','D�mbovita',98980); +INSERT INTO `city` VALUES (3043,'Focsani','ROM','Vrancea',98979); +INSERT INTO `city` VALUES (3044,'T�rgu Jiu','ROM','Gorj',98524); +INSERT INTO `city` VALUES (3045,'Tulcea','ROM','Tulcea',96278); +INSERT INTO `city` VALUES (3046,'Resita','ROM','Caras-Severin',93976); +INSERT INTO `city` VALUES (3047,'Kigali','RWA','Kigali',286000); +INSERT INTO `city` VALUES (3048,'Stockholm','SWE','Lisboa',750348); +INSERT INTO `city` VALUES (3049,'Gothenburg [G�teborg]','SWE','West G�tanmaan l�n',466990); +INSERT INTO `city` VALUES (3050,'Malm�','SWE','Sk�ne l�n',259579); +INSERT INTO `city` VALUES (3051,'Uppsala','SWE','Uppsala l�n',189569); +INSERT INTO `city` VALUES (3052,'Link�ping','SWE','East G�tanmaan l�n',133168); +INSERT INTO `city` VALUES (3053,'V�ster�s','SWE','V�stmanlands l�n',126328); +INSERT INTO `city` VALUES (3054,'�rebro','SWE','�rebros l�n',124207); +INSERT INTO `city` VALUES (3055,'Norrk�ping','SWE','East G�tanmaan l�n',122199); +INSERT INTO `city` VALUES (3056,'Helsingborg','SWE','Sk�ne l�n',117737); +INSERT INTO `city` VALUES (3057,'J�nk�ping','SWE','J�nk�pings l�n',117095); +INSERT INTO `city` VALUES (3058,'Ume�','SWE','V�sterbottens l�n',104512); +INSERT INTO `city` VALUES (3059,'Lund','SWE','Sk�ne l�n',98948); +INSERT INTO `city` VALUES (3060,'Bor�s','SWE','West G�tanmaan l�n',96883); +INSERT INTO `city` VALUES (3061,'Sundsvall','SWE','V�sternorrlands l�n',93126); +INSERT INTO `city` VALUES (3062,'G�vle','SWE','G�vleborgs l�n',90742); +INSERT INTO `city` VALUES (3063,'Jamestown','SHN','Saint Helena',1500); +INSERT INTO `city` VALUES (3064,'Basseterre','KNA','St George Basseterre',11600); +INSERT INTO `city` VALUES (3065,'Castries','LCA','Castries',2301); +INSERT INTO `city` VALUES (3066,'Kingstown','VCT','St George',17100); +INSERT INTO `city` VALUES (3067,'Saint-Pierre','SPM','Saint-Pierre',5808); +INSERT INTO `city` VALUES (3068,'Berlin','DEU','Berliini',3386667); +INSERT INTO `city` VALUES (3069,'Hamburg','DEU','Hamburg',1704735); +INSERT INTO `city` VALUES (3070,'Munich [M�nchen]','DEU','Baijeri',1194560); +INSERT INTO `city` VALUES (3071,'K�ln','DEU','Nordrhein-Westfalen',962507); +INSERT INTO `city` VALUES (3072,'Frankfurt am Main','DEU','Hessen',643821); +INSERT INTO `city` VALUES (3073,'Essen','DEU','Nordrhein-Westfalen',599515); +INSERT INTO `city` VALUES (3074,'Dortmund','DEU','Nordrhein-Westfalen',590213); +INSERT INTO `city` VALUES (3075,'Stuttgart','DEU','Baden-W�rttemberg',582443); +INSERT INTO `city` VALUES (3076,'D�sseldorf','DEU','Nordrhein-Westfalen',568855); +INSERT INTO `city` VALUES (3077,'Bremen','DEU','Bremen',540330); +INSERT INTO `city` VALUES (3078,'Duisburg','DEU','Nordrhein-Westfalen',519793); +INSERT INTO `city` VALUES (3079,'Hannover','DEU','Niedersachsen',514718); +INSERT INTO `city` VALUES (3080,'Leipzig','DEU','Saksi',489532); +INSERT INTO `city` VALUES (3081,'N�rnberg','DEU','Baijeri',486628); +INSERT INTO `city` VALUES (3082,'Dresden','DEU','Saksi',476668); +INSERT INTO `city` VALUES (3083,'Bochum','DEU','Nordrhein-Westfalen',392830); +INSERT INTO `city` VALUES (3084,'Wuppertal','DEU','Nordrhein-Westfalen',368993); +INSERT INTO `city` VALUES (3085,'Bielefeld','DEU','Nordrhein-Westfalen',321125); +INSERT INTO `city` VALUES (3086,'Mannheim','DEU','Baden-W�rttemberg',307730); +INSERT INTO `city` VALUES (3087,'Bonn','DEU','Nordrhein-Westfalen',301048); +INSERT INTO `city` VALUES (3088,'Gelsenkirchen','DEU','Nordrhein-Westfalen',281979); +INSERT INTO `city` VALUES (3089,'Karlsruhe','DEU','Baden-W�rttemberg',277204); +INSERT INTO `city` VALUES (3090,'Wiesbaden','DEU','Hessen',268716); +INSERT INTO `city` VALUES (3091,'M�nster','DEU','Nordrhein-Westfalen',264670); +INSERT INTO `city` VALUES (3092,'M�nchengladbach','DEU','Nordrhein-Westfalen',263697); +INSERT INTO `city` VALUES (3093,'Chemnitz','DEU','Saksi',263222); +INSERT INTO `city` VALUES (3094,'Augsburg','DEU','Baijeri',254867); +INSERT INTO `city` VALUES (3095,'Halle/Saale','DEU','Anhalt Sachsen',254360); +INSERT INTO `city` VALUES (3096,'Braunschweig','DEU','Niedersachsen',246322); +INSERT INTO `city` VALUES (3097,'Aachen','DEU','Nordrhein-Westfalen',243825); +INSERT INTO `city` VALUES (3098,'Krefeld','DEU','Nordrhein-Westfalen',241769); +INSERT INTO `city` VALUES (3099,'Magdeburg','DEU','Anhalt Sachsen',235073); +INSERT INTO `city` VALUES (3100,'Kiel','DEU','Schleswig-Holstein',233795); +INSERT INTO `city` VALUES (3101,'Oberhausen','DEU','Nordrhein-Westfalen',222349); +INSERT INTO `city` VALUES (3102,'L�beck','DEU','Schleswig-Holstein',213326); +INSERT INTO `city` VALUES (3103,'Hagen','DEU','Nordrhein-Westfalen',205201); +INSERT INTO `city` VALUES (3104,'Rostock','DEU','Mecklenburg-Vorpomme',203279); +INSERT INTO `city` VALUES (3105,'Freiburg im Breisgau','DEU','Baden-W�rttemberg',202455); +INSERT INTO `city` VALUES (3106,'Erfurt','DEU','Th�ringen',201267); +INSERT INTO `city` VALUES (3107,'Kassel','DEU','Hessen',196211); +INSERT INTO `city` VALUES (3108,'Saarbr�cken','DEU','Saarland',183836); +INSERT INTO `city` VALUES (3109,'Mainz','DEU','Rheinland-Pfalz',183134); +INSERT INTO `city` VALUES (3110,'Hamm','DEU','Nordrhein-Westfalen',181804); +INSERT INTO `city` VALUES (3111,'Herne','DEU','Nordrhein-Westfalen',175661); +INSERT INTO `city` VALUES (3112,'M�lheim an der Ruhr','DEU','Nordrhein-Westfalen',173895); +INSERT INTO `city` VALUES (3113,'Solingen','DEU','Nordrhein-Westfalen',165583); +INSERT INTO `city` VALUES (3114,'Osnabr�ck','DEU','Niedersachsen',164539); +INSERT INTO `city` VALUES (3115,'Ludwigshafen am Rhein','DEU','Rheinland-Pfalz',163771); +INSERT INTO `city` VALUES (3116,'Leverkusen','DEU','Nordrhein-Westfalen',160841); +INSERT INTO `city` VALUES (3117,'Oldenburg','DEU','Niedersachsen',154125); +INSERT INTO `city` VALUES (3118,'Neuss','DEU','Nordrhein-Westfalen',149702); +INSERT INTO `city` VALUES (3119,'Heidelberg','DEU','Baden-W�rttemberg',139672); +INSERT INTO `city` VALUES (3120,'Darmstadt','DEU','Hessen',137776); +INSERT INTO `city` VALUES (3121,'Paderborn','DEU','Nordrhein-Westfalen',137647); +INSERT INTO `city` VALUES (3122,'Potsdam','DEU','Brandenburg',128983); +INSERT INTO `city` VALUES (3123,'W�rzburg','DEU','Baijeri',127350); +INSERT INTO `city` VALUES (3124,'Regensburg','DEU','Baijeri',125236); +INSERT INTO `city` VALUES (3125,'Recklinghausen','DEU','Nordrhein-Westfalen',125022); +INSERT INTO `city` VALUES (3126,'G�ttingen','DEU','Niedersachsen',124775); +INSERT INTO `city` VALUES (3127,'Bremerhaven','DEU','Bremen',122735); +INSERT INTO `city` VALUES (3128,'Wolfsburg','DEU','Niedersachsen',121954); +INSERT INTO `city` VALUES (3129,'Bottrop','DEU','Nordrhein-Westfalen',121097); +INSERT INTO `city` VALUES (3130,'Remscheid','DEU','Nordrhein-Westfalen',120125); +INSERT INTO `city` VALUES (3131,'Heilbronn','DEU','Baden-W�rttemberg',119526); +INSERT INTO `city` VALUES (3132,'Pforzheim','DEU','Baden-W�rttemberg',117227); +INSERT INTO `city` VALUES (3133,'Offenbach am Main','DEU','Hessen',116627); +INSERT INTO `city` VALUES (3134,'Ulm','DEU','Baden-W�rttemberg',116103); +INSERT INTO `city` VALUES (3135,'Ingolstadt','DEU','Baijeri',114826); +INSERT INTO `city` VALUES (3136,'Gera','DEU','Th�ringen',114718); +INSERT INTO `city` VALUES (3137,'Salzgitter','DEU','Niedersachsen',112934); +INSERT INTO `city` VALUES (3138,'Cottbus','DEU','Brandenburg',110894); +INSERT INTO `city` VALUES (3139,'Reutlingen','DEU','Baden-W�rttemberg',110343); +INSERT INTO `city` VALUES (3140,'F�rth','DEU','Baijeri',109771); +INSERT INTO `city` VALUES (3141,'Siegen','DEU','Nordrhein-Westfalen',109225); +INSERT INTO `city` VALUES (3142,'Koblenz','DEU','Rheinland-Pfalz',108003); +INSERT INTO `city` VALUES (3143,'Moers','DEU','Nordrhein-Westfalen',106837); +INSERT INTO `city` VALUES (3144,'Bergisch Gladbach','DEU','Nordrhein-Westfalen',106150); +INSERT INTO `city` VALUES (3145,'Zwickau','DEU','Saksi',104146); +INSERT INTO `city` VALUES (3146,'Hildesheim','DEU','Niedersachsen',104013); +INSERT INTO `city` VALUES (3147,'Witten','DEU','Nordrhein-Westfalen',103384); +INSERT INTO `city` VALUES (3148,'Schwerin','DEU','Mecklenburg-Vorpomme',102878); +INSERT INTO `city` VALUES (3149,'Erlangen','DEU','Baijeri',100750); +INSERT INTO `city` VALUES (3150,'Kaiserslautern','DEU','Rheinland-Pfalz',100025); +INSERT INTO `city` VALUES (3151,'Trier','DEU','Rheinland-Pfalz',99891); +INSERT INTO `city` VALUES (3152,'Jena','DEU','Th�ringen',99779); +INSERT INTO `city` VALUES (3153,'Iserlohn','DEU','Nordrhein-Westfalen',99474); +INSERT INTO `city` VALUES (3154,'G�tersloh','DEU','Nordrhein-Westfalen',95028); +INSERT INTO `city` VALUES (3155,'Marl','DEU','Nordrhein-Westfalen',93735); +INSERT INTO `city` VALUES (3156,'L�nen','DEU','Nordrhein-Westfalen',92044); +INSERT INTO `city` VALUES (3157,'D�ren','DEU','Nordrhein-Westfalen',91092); +INSERT INTO `city` VALUES (3158,'Ratingen','DEU','Nordrhein-Westfalen',90951); +INSERT INTO `city` VALUES (3159,'Velbert','DEU','Nordrhein-Westfalen',89881); +INSERT INTO `city` VALUES (3160,'Esslingen am Neckar','DEU','Baden-W�rttemberg',89667); +INSERT INTO `city` VALUES (3161,'Honiara','SLB','Honiara',50100); +INSERT INTO `city` VALUES (3162,'Lusaka','ZMB','Lusaka',1317000); +INSERT INTO `city` VALUES (3163,'Ndola','ZMB','Copperbelt',329200); +INSERT INTO `city` VALUES (3164,'Kitwe','ZMB','Copperbelt',288600); +INSERT INTO `city` VALUES (3165,'Kabwe','ZMB','Central',154300); +INSERT INTO `city` VALUES (3166,'Chingola','ZMB','Copperbelt',142400); +INSERT INTO `city` VALUES (3167,'Mufulira','ZMB','Copperbelt',123900); +INSERT INTO `city` VALUES (3168,'Luanshya','ZMB','Copperbelt',118100); +INSERT INTO `city` VALUES (3169,'Apia','WSM','Upolu',35900); +INSERT INTO `city` VALUES (3170,'Serravalle','SMR','Serravalle/Dogano',4802); +INSERT INTO `city` VALUES (3171,'San Marino','SMR','San Marino',2294); +INSERT INTO `city` VALUES (3172,'S�o Tom�','STP','Aqua Grande',49541); +INSERT INTO `city` VALUES (3173,'Riyadh','SAU','Riyadh',3324000); +INSERT INTO `city` VALUES (3174,'Jedda','SAU','Mekka',2046300); +INSERT INTO `city` VALUES (3175,'Mekka','SAU','Mekka',965700); +INSERT INTO `city` VALUES (3176,'Medina','SAU','Medina',608300); +INSERT INTO `city` VALUES (3177,'al-Dammam','SAU','al-Sharqiya',482300); +INSERT INTO `city` VALUES (3178,'al-Taif','SAU','Mekka',416100); +INSERT INTO `city` VALUES (3179,'Tabuk','SAU','Tabuk',292600); +INSERT INTO `city` VALUES (3180,'Burayda','SAU','al-Qasim',248600); +INSERT INTO `city` VALUES (3181,'al-Hufuf','SAU','al-Sharqiya',225800); +INSERT INTO `city` VALUES (3182,'al-Mubarraz','SAU','al-Sharqiya',219100); +INSERT INTO `city` VALUES (3183,'Khamis Mushayt','SAU','Asir',217900); +INSERT INTO `city` VALUES (3184,'Hail','SAU','Hail',176800); +INSERT INTO `city` VALUES (3185,'al-Kharj','SAU','Riad',152100); +INSERT INTO `city` VALUES (3186,'al-Khubar','SAU','al-Sharqiya',141700); +INSERT INTO `city` VALUES (3187,'Jubayl','SAU','al-Sharqiya',140800); +INSERT INTO `city` VALUES (3188,'Hafar al-Batin','SAU','al-Sharqiya',137800); +INSERT INTO `city` VALUES (3189,'al-Tuqba','SAU','al-Sharqiya',125700); +INSERT INTO `city` VALUES (3190,'Yanbu','SAU','Medina',119800); +INSERT INTO `city` VALUES (3191,'Abha','SAU','Asir',112300); +INSERT INTO `city` VALUES (3192,'Ara�ar','SAU','al-Khudud al-Samaliy',108100); +INSERT INTO `city` VALUES (3193,'al-Qatif','SAU','al-Sharqiya',98900); +INSERT INTO `city` VALUES (3194,'al-Hawiya','SAU','Mekka',93900); +INSERT INTO `city` VALUES (3195,'Unayza','SAU','Qasim',91100); +INSERT INTO `city` VALUES (3196,'Najran','SAU','Najran',91000); +INSERT INTO `city` VALUES (3197,'Pikine','SEN','Cap-Vert',855287); +INSERT INTO `city` VALUES (3198,'Dakar','SEN','Cap-Vert',785071); +INSERT INTO `city` VALUES (3199,'Thi�s','SEN','Thi�s',248000); +INSERT INTO `city` VALUES (3200,'Kaolack','SEN','Kaolack',199000); +INSERT INTO `city` VALUES (3201,'Ziguinchor','SEN','Ziguinchor',192000); +INSERT INTO `city` VALUES (3202,'Rufisque','SEN','Cap-Vert',150000); +INSERT INTO `city` VALUES (3203,'Saint-Louis','SEN','Saint-Louis',132400); +INSERT INTO `city` VALUES (3204,'Mbour','SEN','Thi�s',109300); +INSERT INTO `city` VALUES (3205,'Diourbel','SEN','Diourbel',99400); +INSERT INTO `city` VALUES (3206,'Victoria','SYC','Mah�',41000); +INSERT INTO `city` VALUES (3207,'Freetown','SLE','Western',850000); +INSERT INTO `city` VALUES (3208,'Singapore','SGP','�',4017733); +INSERT INTO `city` VALUES (3209,'Bratislava','SVK','Bratislava',448292); +INSERT INTO `city` VALUES (3210,'Ko�ice','SVK','V�chodn� Slovensko',241874); +INSERT INTO `city` VALUES (3211,'Pre�ov','SVK','V�chodn� Slovensko',93977); +INSERT INTO `city` VALUES (3212,'Ljubljana','SVN','Osrednjeslovenska',270986); +INSERT INTO `city` VALUES (3213,'Maribor','SVN','Podravska',115532); +INSERT INTO `city` VALUES (3214,'Mogadishu','SOM','Banaadir',997000); +INSERT INTO `city` VALUES (3215,'Hargeysa','SOM','Woqooyi Galbeed',90000); +INSERT INTO `city` VALUES (3216,'Kismaayo','SOM','Jubbada Hoose',90000); +INSERT INTO `city` VALUES (3217,'Colombo','LKA','Western',645000); +INSERT INTO `city` VALUES (3218,'Dehiwala','LKA','Western',203000); +INSERT INTO `city` VALUES (3219,'Moratuwa','LKA','Western',190000); +INSERT INTO `city` VALUES (3220,'Jaffna','LKA','Northern',149000); +INSERT INTO `city` VALUES (3221,'Kandy','LKA','Central',140000); +INSERT INTO `city` VALUES (3222,'Sri Jayawardenepura Kotte','LKA','Western',118000); +INSERT INTO `city` VALUES (3223,'Negombo','LKA','Western',100000); +INSERT INTO `city` VALUES (3224,'Omdurman','SDN','Khartum',1271403); +INSERT INTO `city` VALUES (3225,'Khartum','SDN','Khartum',947483); +INSERT INTO `city` VALUES (3226,'Sharq al-Nil','SDN','Khartum',700887); +INSERT INTO `city` VALUES (3227,'Port Sudan','SDN','al-Bahr al-Ahmar',308195); +INSERT INTO `city` VALUES (3228,'Kassala','SDN','Kassala',234622); +INSERT INTO `city` VALUES (3229,'Obeid','SDN','Kurdufan al-Shamaliy',229425); +INSERT INTO `city` VALUES (3230,'Nyala','SDN','Darfur al-Janubiya',227183); +INSERT INTO `city` VALUES (3231,'Wad Madani','SDN','al-Jazira',211362); +INSERT INTO `city` VALUES (3232,'al-Qadarif','SDN','al-Qadarif',191164); +INSERT INTO `city` VALUES (3233,'Kusti','SDN','al-Bahr al-Abyad',173599); +INSERT INTO `city` VALUES (3234,'al-Fashir','SDN','Darfur al-Shamaliya',141884); +INSERT INTO `city` VALUES (3235,'Juba','SDN','Bahr al-Jabal',114980); +INSERT INTO `city` VALUES (3236,'Helsinki [Helsingfors]','FIN','Newmaa',555474); +INSERT INTO `city` VALUES (3237,'Espoo','FIN','Newmaa',213271); +INSERT INTO `city` VALUES (3238,'Tampere','FIN','Pirkanmaa',195468); +INSERT INTO `city` VALUES (3239,'Vantaa','FIN','Newmaa',178471); +INSERT INTO `city` VALUES (3240,'Turku [�bo]','FIN','Varsinais-Suomi',172561); +INSERT INTO `city` VALUES (3241,'Oulu','FIN','Pohjois-Pohjanmaa',120753); +INSERT INTO `city` VALUES (3242,'Lahti','FIN','P�ij�t-H�me',96921); +INSERT INTO `city` VALUES (3243,'Paramaribo','SUR','Paramaribo',112000); +INSERT INTO `city` VALUES (3244,'Mbabane','SWZ','Hhohho',61000); +INSERT INTO `city` VALUES (3245,'Z�rich','CHE','Z�rich',336800); +INSERT INTO `city` VALUES (3246,'Geneve','CHE','Geneve',173500); +INSERT INTO `city` VALUES (3247,'Basel','CHE','Basel-Stadt',166700); +INSERT INTO `city` VALUES (3248,'Bern','CHE','Bern',122700); +INSERT INTO `city` VALUES (3249,'Lausanne','CHE','Vaud',114500); +INSERT INTO `city` VALUES (3250,'Damascus','SYR','Damascus',1347000); +INSERT INTO `city` VALUES (3251,'Aleppo','SYR','Aleppo',1261983); +INSERT INTO `city` VALUES (3252,'Hims','SYR','Hims',507404); +INSERT INTO `city` VALUES (3253,'Hama','SYR','Hama',343361); +INSERT INTO `city` VALUES (3254,'Latakia','SYR','Latakia',264563); +INSERT INTO `city` VALUES (3255,'al-Qamishliya','SYR','al-Hasaka',144286); +INSERT INTO `city` VALUES (3256,'Dayr al-Zawr','SYR','Dayr al-Zawr',140459); +INSERT INTO `city` VALUES (3257,'Jaramana','SYR','Damaskos',138469); +INSERT INTO `city` VALUES (3258,'Duma','SYR','Damaskos',131158); +INSERT INTO `city` VALUES (3259,'al-Raqqa','SYR','al-Raqqa',108020); +INSERT INTO `city` VALUES (3260,'Idlib','SYR','Idlib',91081); +INSERT INTO `city` VALUES (3261,'Dushanbe','TJK','Karotegin',524000); +INSERT INTO `city` VALUES (3262,'Khujand','TJK','Khujand',161500); +INSERT INTO `city` VALUES (3263,'Taipei','TWN','Taipei',2641312); +INSERT INTO `city` VALUES (3264,'Kaohsiung','TWN','Kaohsiung',1475505); +INSERT INTO `city` VALUES (3265,'Taichung','TWN','Taichung',940589); +INSERT INTO `city` VALUES (3266,'Tainan','TWN','Tainan',728060); +INSERT INTO `city` VALUES (3267,'Panchiao','TWN','Taipei',523850); +INSERT INTO `city` VALUES (3268,'Chungho','TWN','Taipei',392176); +INSERT INTO `city` VALUES (3269,'Keelung (Chilung)','TWN','Keelung',385201); +INSERT INTO `city` VALUES (3270,'Sanchung','TWN','Taipei',380084); +INSERT INTO `city` VALUES (3271,'Hsinchuang','TWN','Taipei',365048); +INSERT INTO `city` VALUES (3272,'Hsinchu','TWN','Hsinchu',361958); +INSERT INTO `city` VALUES (3273,'Chungli','TWN','Taoyuan',318649); +INSERT INTO `city` VALUES (3274,'Fengshan','TWN','Kaohsiung',318562); +INSERT INTO `city` VALUES (3275,'Taoyuan','TWN','Taoyuan',316438); +INSERT INTO `city` VALUES (3276,'Chiayi','TWN','Chiayi',265109); +INSERT INTO `city` VALUES (3277,'Hsintien','TWN','Taipei',263603); +INSERT INTO `city` VALUES (3278,'Changhwa','TWN','Changhwa',227715); +INSERT INTO `city` VALUES (3279,'Yungho','TWN','Taipei',227700); +INSERT INTO `city` VALUES (3280,'Tucheng','TWN','Taipei',224897); +INSERT INTO `city` VALUES (3281,'Pingtung','TWN','Pingtung',214727); +INSERT INTO `city` VALUES (3282,'Yungkang','TWN','Tainan',193005); +INSERT INTO `city` VALUES (3283,'Pingchen','TWN','Taoyuan',188344); +INSERT INTO `city` VALUES (3284,'Tali','TWN','Taichung',171940); +INSERT INTO `city` VALUES (3285,'Taiping','TWN','',165524); +INSERT INTO `city` VALUES (3286,'Pate','TWN','Taoyuan',161700); +INSERT INTO `city` VALUES (3287,'Fengyuan','TWN','Taichung',161032); +INSERT INTO `city` VALUES (3288,'Luchou','TWN','Taipei',160516); +INSERT INTO `city` VALUES (3289,'Hsichuh','TWN','Taipei',154976); +INSERT INTO `city` VALUES (3290,'Shulin','TWN','Taipei',151260); +INSERT INTO `city` VALUES (3291,'Yuanlin','TWN','Changhwa',126402); +INSERT INTO `city` VALUES (3292,'Yangmei','TWN','Taoyuan',126323); +INSERT INTO `city` VALUES (3293,'Taliao','TWN','',115897); +INSERT INTO `city` VALUES (3294,'Kueishan','TWN','',112195); +INSERT INTO `city` VALUES (3295,'Tanshui','TWN','Taipei',111882); +INSERT INTO `city` VALUES (3296,'Taitung','TWN','Taitung',111039); +INSERT INTO `city` VALUES (3297,'Hualien','TWN','Hualien',108407); +INSERT INTO `city` VALUES (3298,'Nantou','TWN','Nantou',104723); +INSERT INTO `city` VALUES (3299,'Lungtan','TWN','Taipei',103088); +INSERT INTO `city` VALUES (3300,'Touliu','TWN','Y�nlin',98900); +INSERT INTO `city` VALUES (3301,'Tsaotun','TWN','Nantou',96800); +INSERT INTO `city` VALUES (3302,'Kangshan','TWN','Kaohsiung',92200); +INSERT INTO `city` VALUES (3303,'Ilan','TWN','Ilan',92000); +INSERT INTO `city` VALUES (3304,'Miaoli','TWN','Miaoli',90000); +INSERT INTO `city` VALUES (3305,'Dar es Salaam','TZA','Dar es Salaam',1747000); +INSERT INTO `city` VALUES (3306,'Dodoma','TZA','Dodoma',189000); +INSERT INTO `city` VALUES (3307,'Mwanza','TZA','Mwanza',172300); +INSERT INTO `city` VALUES (3308,'Zanzibar','TZA','Zanzibar West',157634); +INSERT INTO `city` VALUES (3309,'Tanga','TZA','Tanga',137400); +INSERT INTO `city` VALUES (3310,'Mbeya','TZA','Mbeya',130800); +INSERT INTO `city` VALUES (3311,'Morogoro','TZA','Morogoro',117800); +INSERT INTO `city` VALUES (3312,'Arusha','TZA','Arusha',102500); +INSERT INTO `city` VALUES (3313,'Moshi','TZA','Kilimanjaro',96800); +INSERT INTO `city` VALUES (3314,'Tabora','TZA','Tabora',92800); +INSERT INTO `city` VALUES (3315,'K�benhavn','DNK','K�benhavn',495699); +INSERT INTO `city` VALUES (3316,'�rhus','DNK','�rhus',284846); +INSERT INTO `city` VALUES (3317,'Odense','DNK','Fyn',183912); +INSERT INTO `city` VALUES (3318,'Aalborg','DNK','Nordjylland',161161); +INSERT INTO `city` VALUES (3319,'Frederiksberg','DNK','Frederiksberg',90327); +INSERT INTO `city` VALUES (3320,'Bangkok','THA','Bangkok',6320174); +INSERT INTO `city` VALUES (3321,'Nonthaburi','THA','Nonthaburi',292100); +INSERT INTO `city` VALUES (3322,'Nakhon Ratchasima','THA','Nakhon Ratchasima',181400); +INSERT INTO `city` VALUES (3323,'Chiang Mai','THA','Chiang Mai',171100); +INSERT INTO `city` VALUES (3324,'Udon Thani','THA','Udon Thani',158100); +INSERT INTO `city` VALUES (3325,'Hat Yai','THA','Songkhla',148632); +INSERT INTO `city` VALUES (3326,'Khon Kaen','THA','Khon Kaen',126500); +INSERT INTO `city` VALUES (3327,'Pak Kret','THA','Nonthaburi',126055); +INSERT INTO `city` VALUES (3328,'Nakhon Sawan','THA','Nakhon Sawan',123800); +INSERT INTO `city` VALUES (3329,'Ubon Ratchathani','THA','Ubon Ratchathani',116300); +INSERT INTO `city` VALUES (3330,'Songkhla','THA','Songkhla',94900); +INSERT INTO `city` VALUES (3331,'Nakhon Pathom','THA','Nakhon Pathom',94100); +INSERT INTO `city` VALUES (3332,'Lom�','TGO','Maritime',375000); +INSERT INTO `city` VALUES (3333,'Fakaofo','TKL','Fakaofo',300); +INSERT INTO `city` VALUES (3334,'Nuku�alofa','TON','Tongatapu',22400); +INSERT INTO `city` VALUES (3335,'Chaguanas','TTO','Caroni',56601); +INSERT INTO `city` VALUES (3336,'Port-of-Spain','TTO','Port-of-Spain',43396); +INSERT INTO `city` VALUES (3337,'N�Djam�na','TCD','Chari-Baguirmi',530965); +INSERT INTO `city` VALUES (3338,'Moundou','TCD','Logone Occidental',99500); +INSERT INTO `city` VALUES (3339,'Praha','CZE','Hlavn� mesto Praha',1181126); +INSERT INTO `city` VALUES (3340,'Brno','CZE','Jizn� Morava',381862); +INSERT INTO `city` VALUES (3341,'Ostrava','CZE','Severn� Morava',320041); +INSERT INTO `city` VALUES (3342,'Plzen','CZE','Zapadn� Cechy',166759); +INSERT INTO `city` VALUES (3343,'Olomouc','CZE','Severn� Morava',102702); +INSERT INTO `city` VALUES (3344,'Liberec','CZE','Severn� Cechy',99155); +INSERT INTO `city` VALUES (3345,'Cesk� Budejovice','CZE','Jizn� Cechy',98186); +INSERT INTO `city` VALUES (3346,'Hradec Kr�lov�','CZE','V�chodn� Cechy',98080); +INSERT INTO `city` VALUES (3347,'�st� nad Labem','CZE','Severn� Cechy',95491); +INSERT INTO `city` VALUES (3348,'Pardubice','CZE','V�chodn� Cechy',91309); +INSERT INTO `city` VALUES (3349,'Tunis','TUN','Tunis',690600); +INSERT INTO `city` VALUES (3350,'Sfax','TUN','Sfax',257800); +INSERT INTO `city` VALUES (3351,'Ariana','TUN','Ariana',197000); +INSERT INTO `city` VALUES (3352,'Ettadhamen','TUN','Ariana',178600); +INSERT INTO `city` VALUES (3353,'Sousse','TUN','Sousse',145900); +INSERT INTO `city` VALUES (3354,'Kairouan','TUN','Kairouan',113100); +INSERT INTO `city` VALUES (3355,'Biserta','TUN','Biserta',108900); +INSERT INTO `city` VALUES (3356,'Gab�s','TUN','Gab�s',106600); +INSERT INTO `city` VALUES (3357,'Istanbul','TUR','Istanbul',8787958); +INSERT INTO `city` VALUES (3358,'Ankara','TUR','Ankara',3038159); +INSERT INTO `city` VALUES (3359,'Izmir','TUR','Izmir',2130359); +INSERT INTO `city` VALUES (3360,'Adana','TUR','Adana',1131198); +INSERT INTO `city` VALUES (3361,'Bursa','TUR','Bursa',1095842); +INSERT INTO `city` VALUES (3362,'Gaziantep','TUR','Gaziantep',789056); +INSERT INTO `city` VALUES (3363,'Konya','TUR','Konya',628364); +INSERT INTO `city` VALUES (3364,'Mersin (I�el)','TUR','I�el',587212); +INSERT INTO `city` VALUES (3365,'Antalya','TUR','Antalya',564914); +INSERT INTO `city` VALUES (3366,'Diyarbakir','TUR','Diyarbakir',479884); +INSERT INTO `city` VALUES (3367,'Kayseri','TUR','Kayseri',475657); +INSERT INTO `city` VALUES (3368,'Eskisehir','TUR','Eskisehir',470781); +INSERT INTO `city` VALUES (3369,'Sanliurfa','TUR','Sanliurfa',405905); +INSERT INTO `city` VALUES (3370,'Samsun','TUR','Samsun',339871); +INSERT INTO `city` VALUES (3371,'Malatya','TUR','Malatya',330312); +INSERT INTO `city` VALUES (3372,'Gebze','TUR','Kocaeli',264170); +INSERT INTO `city` VALUES (3373,'Denizli','TUR','Denizli',253848); +INSERT INTO `city` VALUES (3374,'Sivas','TUR','Sivas',246642); +INSERT INTO `city` VALUES (3375,'Erzurum','TUR','Erzurum',246535); +INSERT INTO `city` VALUES (3376,'Tarsus','TUR','Adana',246206); +INSERT INTO `city` VALUES (3377,'Kahramanmaras','TUR','Kahramanmaras',245772); +INSERT INTO `city` VALUES (3378,'El�zig','TUR','El�zig',228815); +INSERT INTO `city` VALUES (3379,'Van','TUR','Van',219319); +INSERT INTO `city` VALUES (3380,'Sultanbeyli','TUR','Istanbul',211068); +INSERT INTO `city` VALUES (3381,'Izmit (Kocaeli)','TUR','Kocaeli',210068); +INSERT INTO `city` VALUES (3382,'Manisa','TUR','Manisa',207148); +INSERT INTO `city` VALUES (3383,'Batman','TUR','Batman',203793); +INSERT INTO `city` VALUES (3384,'Balikesir','TUR','Balikesir',196382); +INSERT INTO `city` VALUES (3385,'Sakarya (Adapazari)','TUR','Sakarya',190641); +INSERT INTO `city` VALUES (3386,'Iskenderun','TUR','Hatay',153022); +INSERT INTO `city` VALUES (3387,'Osmaniye','TUR','Osmaniye',146003); +INSERT INTO `city` VALUES (3388,'�orum','TUR','�orum',145495); +INSERT INTO `city` VALUES (3389,'K�tahya','TUR','K�tahya',144761); +INSERT INTO `city` VALUES (3390,'Hatay (Antakya)','TUR','Hatay',143982); +INSERT INTO `city` VALUES (3391,'Kirikkale','TUR','Kirikkale',142044); +INSERT INTO `city` VALUES (3392,'Adiyaman','TUR','Adiyaman',141529); +INSERT INTO `city` VALUES (3393,'Trabzon','TUR','Trabzon',138234); +INSERT INTO `city` VALUES (3394,'Ordu','TUR','Ordu',133642); +INSERT INTO `city` VALUES (3395,'Aydin','TUR','Aydin',128651); +INSERT INTO `city` VALUES (3396,'Usak','TUR','Usak',128162); +INSERT INTO `city` VALUES (3397,'Edirne','TUR','Edirne',123383); +INSERT INTO `city` VALUES (3398,'�orlu','TUR','Tekirdag',123300); +INSERT INTO `city` VALUES (3399,'Isparta','TUR','Isparta',121911); +INSERT INTO `city` VALUES (3400,'Karab�k','TUR','Karab�k',118285); +INSERT INTO `city` VALUES (3401,'Kilis','TUR','Kilis',118245); +INSERT INTO `city` VALUES (3402,'Alanya','TUR','Antalya',117300); +INSERT INTO `city` VALUES (3403,'Kiziltepe','TUR','Mardin',112000); +INSERT INTO `city` VALUES (3404,'Zonguldak','TUR','Zonguldak',111542); +INSERT INTO `city` VALUES (3405,'Siirt','TUR','Siirt',107100); +INSERT INTO `city` VALUES (3406,'Viransehir','TUR','Sanliurfa',106400); +INSERT INTO `city` VALUES (3407,'Tekirdag','TUR','Tekirdag',106077); +INSERT INTO `city` VALUES (3408,'Karaman','TUR','Karaman',104200); +INSERT INTO `city` VALUES (3409,'Afyon','TUR','Afyon',103984); +INSERT INTO `city` VALUES (3410,'Aksaray','TUR','Aksaray',102681); +INSERT INTO `city` VALUES (3411,'Ceyhan','TUR','Adana',102412); +INSERT INTO `city` VALUES (3412,'Erzincan','TUR','Erzincan',102304); +INSERT INTO `city` VALUES (3413,'Bismil','TUR','Diyarbakir',101400); +INSERT INTO `city` VALUES (3414,'Nazilli','TUR','Aydin',99900); +INSERT INTO `city` VALUES (3415,'Tokat','TUR','Tokat',99500); +INSERT INTO `city` VALUES (3416,'Kars','TUR','Kars',93000); +INSERT INTO `city` VALUES (3417,'Ineg�l','TUR','Bursa',90500); +INSERT INTO `city` VALUES (3418,'Bandirma','TUR','Balikesir',90200); +INSERT INTO `city` VALUES (3419,'Ashgabat','TKM','Ahal',540600); +INSERT INTO `city` VALUES (3420,'Ch�rjew','TKM','Lebap',189200); +INSERT INTO `city` VALUES (3421,'Dashhowuz','TKM','Dashhowuz',141800); +INSERT INTO `city` VALUES (3422,'Mary','TKM','Mary',101000); +INSERT INTO `city` VALUES (3423,'Cockburn Town','TCA','Grand Turk',4800); +INSERT INTO `city` VALUES (3424,'Funafuti','TUV','Funafuti',4600); +INSERT INTO `city` VALUES (3425,'Kampala','UGA','Central',890800); +INSERT INTO `city` VALUES (3426,'Kyiv','UKR','Kiova',2624000); +INSERT INTO `city` VALUES (3427,'Harkova [Harkiv]','UKR','Harkova',1500000); +INSERT INTO `city` VALUES (3428,'Dnipropetrovsk','UKR','Dnipropetrovsk',1103000); +INSERT INTO `city` VALUES (3429,'Donetsk','UKR','Donetsk',1050000); +INSERT INTO `city` VALUES (3430,'Odesa','UKR','Odesa',1011000); +INSERT INTO `city` VALUES (3431,'Zaporizzja','UKR','Zaporizzja',848000); +INSERT INTO `city` VALUES (3432,'Lviv','UKR','Lviv',788000); +INSERT INTO `city` VALUES (3433,'Kryvyi Rig','UKR','Dnipropetrovsk',703000); +INSERT INTO `city` VALUES (3434,'Mykolajiv','UKR','Mykolajiv',508000); +INSERT INTO `city` VALUES (3435,'Mariupol','UKR','Donetsk',490000); +INSERT INTO `city` VALUES (3436,'Lugansk','UKR','Lugansk',469000); +INSERT INTO `city` VALUES (3437,'Vinnytsja','UKR','Vinnytsja',391000); +INSERT INTO `city` VALUES (3438,'Makijivka','UKR','Donetsk',384000); +INSERT INTO `city` VALUES (3439,'Herson','UKR','Herson',353000); +INSERT INTO `city` VALUES (3440,'Sevastopol','UKR','Krim',348000); +INSERT INTO `city` VALUES (3441,'Simferopol','UKR','Krim',339000); +INSERT INTO `city` VALUES (3442,'Pultava [Poltava]','UKR','Pultava',313000); +INSERT INTO `city` VALUES (3443,'T�ernigiv','UKR','T�ernigiv',313000); +INSERT INTO `city` VALUES (3444,'T�erkasy','UKR','T�erkasy',309000); +INSERT INTO `city` VALUES (3445,'Gorlivka','UKR','Donetsk',299000); +INSERT INTO `city` VALUES (3446,'Zytomyr','UKR','Zytomyr',297000); +INSERT INTO `city` VALUES (3447,'Sumy','UKR','Sumy',294000); +INSERT INTO `city` VALUES (3448,'Dniprodzerzynsk','UKR','Dnipropetrovsk',270000); +INSERT INTO `city` VALUES (3449,'Kirovograd','UKR','Kirovograd',265000); +INSERT INTO `city` VALUES (3450,'Hmelnytskyi','UKR','Hmelnytskyi',262000); +INSERT INTO `city` VALUES (3451,'T�ernivtsi','UKR','T�ernivtsi',259000); +INSERT INTO `city` VALUES (3452,'Rivne','UKR','Rivne',245000); +INSERT INTO `city` VALUES (3453,'Krement�uk','UKR','Pultava',239000); +INSERT INTO `city` VALUES (3454,'Ivano-Frankivsk','UKR','Ivano-Frankivsk',237000); +INSERT INTO `city` VALUES (3455,'Ternopil','UKR','Ternopil',236000); +INSERT INTO `city` VALUES (3456,'Lutsk','UKR','Volynia',217000); +INSERT INTO `city` VALUES (3457,'Bila Tserkva','UKR','Kiova',215000); +INSERT INTO `city` VALUES (3458,'Kramatorsk','UKR','Donetsk',186000); +INSERT INTO `city` VALUES (3459,'Melitopol','UKR','Zaporizzja',169000); +INSERT INTO `city` VALUES (3460,'Kert�','UKR','Krim',162000); +INSERT INTO `city` VALUES (3461,'Nikopol','UKR','Dnipropetrovsk',149000); +INSERT INTO `city` VALUES (3462,'Berdjansk','UKR','Zaporizzja',130000); +INSERT INTO `city` VALUES (3463,'Pavlograd','UKR','Dnipropetrovsk',127000); +INSERT INTO `city` VALUES (3464,'Sjeverodonetsk','UKR','Lugansk',127000); +INSERT INTO `city` VALUES (3465,'Slovjansk','UKR','Donetsk',127000); +INSERT INTO `city` VALUES (3466,'Uzgorod','UKR','Taka-Karpatia',127000); +INSERT INTO `city` VALUES (3467,'Alt�evsk','UKR','Lugansk',119000); +INSERT INTO `city` VALUES (3468,'Lysyt�ansk','UKR','Lugansk',116000); +INSERT INTO `city` VALUES (3469,'Jevpatorija','UKR','Krim',112000); +INSERT INTO `city` VALUES (3470,'Kamjanets-Podilskyi','UKR','Hmelnytskyi',109000); +INSERT INTO `city` VALUES (3471,'Jenakijeve','UKR','Donetsk',105000); +INSERT INTO `city` VALUES (3472,'Krasnyi Lut�','UKR','Lugansk',101000); +INSERT INTO `city` VALUES (3473,'Stahanov','UKR','Lugansk',101000); +INSERT INTO `city` VALUES (3474,'Oleksandrija','UKR','Kirovograd',99000); +INSERT INTO `city` VALUES (3475,'Konotop','UKR','Sumy',96000); +INSERT INTO `city` VALUES (3476,'Kostjantynivka','UKR','Donetsk',95000); +INSERT INTO `city` VALUES (3477,'Berdyt�iv','UKR','Zytomyr',90000); +INSERT INTO `city` VALUES (3478,'Izmajil','UKR','Odesa',90000); +INSERT INTO `city` VALUES (3479,'�ostka','UKR','Sumy',90000); +INSERT INTO `city` VALUES (3480,'Uman','UKR','T�erkasy',90000); +INSERT INTO `city` VALUES (3481,'Brovary','UKR','Kiova',89000); +INSERT INTO `city` VALUES (3482,'Mukat�eve','UKR','Taka-Karpatia',89000); +INSERT INTO `city` VALUES (3483,'Budapest','HUN','Budapest',1811552); +INSERT INTO `city` VALUES (3484,'Debrecen','HUN','Hajd�-Bihar',203648); +INSERT INTO `city` VALUES (3485,'Miskolc','HUN','Borsod-Aba�j-Zempl�n',172357); +INSERT INTO `city` VALUES (3486,'Szeged','HUN','Csongr�d',158158); +INSERT INTO `city` VALUES (3487,'P�cs','HUN','Baranya',157332); +INSERT INTO `city` VALUES (3488,'Gy�r','HUN','Gy�r-Moson-Sopron',127119); +INSERT INTO `city` VALUES (3489,'Nyiregyh�za','HUN','Szabolcs-Szatm�r-Ber',112419); +INSERT INTO `city` VALUES (3490,'Kecskem�t','HUN','B�cs-Kiskun',105606); +INSERT INTO `city` VALUES (3491,'Sz�kesfeh�rv�r','HUN','Fej�r',105119); +INSERT INTO `city` VALUES (3492,'Montevideo','URY','Montevideo',1236000); +INSERT INTO `city` VALUES (3493,'Noum�a','NCL','�',76293); +INSERT INTO `city` VALUES (3494,'Auckland','NZL','Auckland',381800); +INSERT INTO `city` VALUES (3495,'Christchurch','NZL','Canterbury',324200); +INSERT INTO `city` VALUES (3496,'Manukau','NZL','Auckland',281800); +INSERT INTO `city` VALUES (3497,'North Shore','NZL','Auckland',187700); +INSERT INTO `city` VALUES (3498,'Waitakere','NZL','Auckland',170600); +INSERT INTO `city` VALUES (3499,'Wellington','NZL','Wellington',166700); +INSERT INTO `city` VALUES (3500,'Dunedin','NZL','Dunedin',119600); +INSERT INTO `city` VALUES (3501,'Hamilton','NZL','Hamilton',117100); +INSERT INTO `city` VALUES (3502,'Lower Hutt','NZL','Wellington',98100); +INSERT INTO `city` VALUES (3503,'Toskent','UZB','Toskent Shahri',2117500); +INSERT INTO `city` VALUES (3504,'Namangan','UZB','Namangan',370500); +INSERT INTO `city` VALUES (3505,'Samarkand','UZB','Samarkand',361800); +INSERT INTO `city` VALUES (3506,'Andijon','UZB','Andijon',318600); +INSERT INTO `city` VALUES (3507,'Buhoro','UZB','Buhoro',237100); +INSERT INTO `city` VALUES (3508,'Karsi','UZB','Qashqadaryo',194100); +INSERT INTO `city` VALUES (3509,'Nukus','UZB','Karakalpakistan',194100); +INSERT INTO `city` VALUES (3510,'K�kon','UZB','Fargona',190100); +INSERT INTO `city` VALUES (3511,'Fargona','UZB','Fargona',180500); +INSERT INTO `city` VALUES (3512,'Circik','UZB','Toskent',146400); +INSERT INTO `city` VALUES (3513,'Margilon','UZB','Fargona',140800); +INSERT INTO `city` VALUES (3514,'�rgenc','UZB','Khorazm',138900); +INSERT INTO `city` VALUES (3515,'Angren','UZB','Toskent',128000); +INSERT INTO `city` VALUES (3516,'Cizah','UZB','Cizah',124800); +INSERT INTO `city` VALUES (3517,'Navoi','UZB','Navoi',116300); +INSERT INTO `city` VALUES (3518,'Olmalik','UZB','Toskent',114900); +INSERT INTO `city` VALUES (3519,'Termiz','UZB','Surkhondaryo',109500); +INSERT INTO `city` VALUES (3520,'Minsk','BLR','Horad Minsk',1674000); +INSERT INTO `city` VALUES (3521,'Gomel','BLR','Gomel',475000); +INSERT INTO `city` VALUES (3522,'Mogiljov','BLR','Mogiljov',356000); +INSERT INTO `city` VALUES (3523,'Vitebsk','BLR','Vitebsk',340000); +INSERT INTO `city` VALUES (3524,'Grodno','BLR','Grodno',302000); +INSERT INTO `city` VALUES (3525,'Brest','BLR','Brest',286000); +INSERT INTO `city` VALUES (3526,'Bobruisk','BLR','Mogiljov',221000); +INSERT INTO `city` VALUES (3527,'Baranovit�i','BLR','Brest',167000); +INSERT INTO `city` VALUES (3528,'Borisov','BLR','Minsk',151000); +INSERT INTO `city` VALUES (3529,'Pinsk','BLR','Brest',130000); +INSERT INTO `city` VALUES (3530,'Or�a','BLR','Vitebsk',124000); +INSERT INTO `city` VALUES (3531,'Mozyr','BLR','Gomel',110000); +INSERT INTO `city` VALUES (3532,'Novopolotsk','BLR','Vitebsk',106000); +INSERT INTO `city` VALUES (3533,'Lida','BLR','Grodno',101000); +INSERT INTO `city` VALUES (3534,'Soligorsk','BLR','Minsk',101000); +INSERT INTO `city` VALUES (3535,'Molodet�no','BLR','Minsk',97000); +INSERT INTO `city` VALUES (3536,'Mata-Utu','WLF','Wallis',1137); +INSERT INTO `city` VALUES (3537,'Port-Vila','VUT','Shefa',33700); +INSERT INTO `city` VALUES (3538,'Citt� del Vaticano','VAT','�',455); +INSERT INTO `city` VALUES (3539,'Caracas','VEN','Distrito Federal',1975294); +INSERT INTO `city` VALUES (3540,'Maraca�bo','VEN','Zulia',1304776); +INSERT INTO `city` VALUES (3541,'Barquisimeto','VEN','Lara',877239); +INSERT INTO `city` VALUES (3542,'Valencia','VEN','Carabobo',794246); +INSERT INTO `city` VALUES (3543,'Ciudad Guayana','VEN','Bol�var',663713); +INSERT INTO `city` VALUES (3544,'Petare','VEN','Miranda',488868); +INSERT INTO `city` VALUES (3545,'Maracay','VEN','Aragua',444443); +INSERT INTO `city` VALUES (3546,'Barcelona','VEN','Anzo�tegui',322267); +INSERT INTO `city` VALUES (3547,'Matur�n','VEN','Monagas',319726); +INSERT INTO `city` VALUES (3548,'San Crist�bal','VEN','T�chira',319373); +INSERT INTO `city` VALUES (3549,'Ciudad Bol�var','VEN','Bol�var',301107); +INSERT INTO `city` VALUES (3550,'Cuman�','VEN','Sucre',293105); +INSERT INTO `city` VALUES (3551,'M�rida','VEN','M�rida',224887); +INSERT INTO `city` VALUES (3552,'Cabimas','VEN','Zulia',221329); +INSERT INTO `city` VALUES (3553,'Barinas','VEN','Barinas',217831); +INSERT INTO `city` VALUES (3554,'Turmero','VEN','Aragua',217499); +INSERT INTO `city` VALUES (3555,'Baruta','VEN','Miranda',207290); +INSERT INTO `city` VALUES (3556,'Puerto Cabello','VEN','Carabobo',187722); +INSERT INTO `city` VALUES (3557,'Santa Ana de Coro','VEN','Falc�n',185766); +INSERT INTO `city` VALUES (3558,'Los Teques','VEN','Miranda',178784); +INSERT INTO `city` VALUES (3559,'Punto Fijo','VEN','Falc�n',167215); +INSERT INTO `city` VALUES (3560,'Guarenas','VEN','Miranda',165889); +INSERT INTO `city` VALUES (3561,'Acarigua','VEN','Portuguesa',158954); +INSERT INTO `city` VALUES (3562,'Puerto La Cruz','VEN','Anzo�tegui',155700); +INSERT INTO `city` VALUES (3563,'Ciudad Losada','VEN','',134501); +INSERT INTO `city` VALUES (3564,'Guacara','VEN','Carabobo',131334); +INSERT INTO `city` VALUES (3565,'Valera','VEN','Trujillo',130281); +INSERT INTO `city` VALUES (3566,'Guanare','VEN','Portuguesa',125621); +INSERT INTO `city` VALUES (3567,'Car�pano','VEN','Sucre',119639); +INSERT INTO `city` VALUES (3568,'Catia La Mar','VEN','Distrito Federal',117012); +INSERT INTO `city` VALUES (3569,'El Tigre','VEN','Anzo�tegui',116256); +INSERT INTO `city` VALUES (3570,'Guatire','VEN','Miranda',109121); +INSERT INTO `city` VALUES (3571,'Calabozo','VEN','Gu�rico',107146); +INSERT INTO `city` VALUES (3572,'Pozuelos','VEN','Anzo�tegui',105690); +INSERT INTO `city` VALUES (3573,'Ciudad Ojeda','VEN','Zulia',99354); +INSERT INTO `city` VALUES (3574,'Ocumare del Tuy','VEN','Miranda',97168); +INSERT INTO `city` VALUES (3575,'Valle de la Pascua','VEN','Gu�rico',95927); +INSERT INTO `city` VALUES (3576,'Araure','VEN','Portuguesa',94269); +INSERT INTO `city` VALUES (3577,'San Fernando de Apure','VEN','Apure',93809); +INSERT INTO `city` VALUES (3578,'San Felipe','VEN','Yaracuy',90940); +INSERT INTO `city` VALUES (3579,'El Lim�n','VEN','Aragua',90000); +INSERT INTO `city` VALUES (3580,'Moscow','RUS','Moscow (City)',8389200); +INSERT INTO `city` VALUES (3581,'St Petersburg','RUS','Pietari',4694000); +INSERT INTO `city` VALUES (3582,'Novosibirsk','RUS','Novosibirsk',1398800); +INSERT INTO `city` VALUES (3583,'Nizni Novgorod','RUS','Nizni Novgorod',1357000); +INSERT INTO `city` VALUES (3584,'Jekaterinburg','RUS','Sverdlovsk',1266300); +INSERT INTO `city` VALUES (3585,'Samara','RUS','Samara',1156100); +INSERT INTO `city` VALUES (3586,'Omsk','RUS','Omsk',1148900); +INSERT INTO `city` VALUES (3587,'Kazan','RUS','Tatarstan',1101000); +INSERT INTO `city` VALUES (3588,'Ufa','RUS','Ba�kortostan',1091200); +INSERT INTO `city` VALUES (3589,'T�eljabinsk','RUS','T�eljabinsk',1083200); +INSERT INTO `city` VALUES (3590,'Rostov-na-Donu','RUS','Rostov-na-Donu',1012700); +INSERT INTO `city` VALUES (3591,'Perm','RUS','Perm',1009700); +INSERT INTO `city` VALUES (3592,'Volgograd','RUS','Volgograd',993400); +INSERT INTO `city` VALUES (3593,'Voronez','RUS','Voronez',907700); +INSERT INTO `city` VALUES (3594,'Krasnojarsk','RUS','Krasnojarsk',875500); +INSERT INTO `city` VALUES (3595,'Saratov','RUS','Saratov',874000); +INSERT INTO `city` VALUES (3596,'Toljatti','RUS','Samara',722900); +INSERT INTO `city` VALUES (3597,'Uljanovsk','RUS','Uljanovsk',667400); +INSERT INTO `city` VALUES (3598,'Izevsk','RUS','Udmurtia',652800); +INSERT INTO `city` VALUES (3599,'Krasnodar','RUS','Krasnodar',639000); +INSERT INTO `city` VALUES (3600,'Jaroslavl','RUS','Jaroslavl',616700); +INSERT INTO `city` VALUES (3601,'Habarovsk','RUS','Habarovsk',609400); +INSERT INTO `city` VALUES (3602,'Vladivostok','RUS','Primorje',606200); +INSERT INTO `city` VALUES (3603,'Irkutsk','RUS','Irkutsk',593700); +INSERT INTO `city` VALUES (3604,'Barnaul','RUS','Altai',580100); +INSERT INTO `city` VALUES (3605,'Novokuznetsk','RUS','Kemerovo',561600); +INSERT INTO `city` VALUES (3606,'Penza','RUS','Penza',532200); +INSERT INTO `city` VALUES (3607,'Rjazan','RUS','Rjazan',529900); +INSERT INTO `city` VALUES (3608,'Orenburg','RUS','Orenburg',523600); +INSERT INTO `city` VALUES (3609,'Lipetsk','RUS','Lipetsk',521000); +INSERT INTO `city` VALUES (3610,'Nabereznyje T�elny','RUS','Tatarstan',514700); +INSERT INTO `city` VALUES (3611,'Tula','RUS','Tula',506100); +INSERT INTO `city` VALUES (3612,'Tjumen','RUS','Tjumen',503400); +INSERT INTO `city` VALUES (3613,'Kemerovo','RUS','Kemerovo',492700); +INSERT INTO `city` VALUES (3614,'Astrahan','RUS','Astrahan',486100); +INSERT INTO `city` VALUES (3615,'Tomsk','RUS','Tomsk',482100); +INSERT INTO `city` VALUES (3616,'Kirov','RUS','Kirov',466200); +INSERT INTO `city` VALUES (3617,'Ivanovo','RUS','Ivanovo',459200); +INSERT INTO `city` VALUES (3618,'T�eboksary','RUS','T�uvassia',459200); +INSERT INTO `city` VALUES (3619,'Brjansk','RUS','Brjansk',457400); +INSERT INTO `city` VALUES (3620,'Tver','RUS','Tver',454900); +INSERT INTO `city` VALUES (3621,'Kursk','RUS','Kursk',443500); +INSERT INTO `city` VALUES (3622,'Magnitogorsk','RUS','T�eljabinsk',427900); +INSERT INTO `city` VALUES (3623,'Kaliningrad','RUS','Kaliningrad',424400); +INSERT INTO `city` VALUES (3624,'Nizni Tagil','RUS','Sverdlovsk',390900); +INSERT INTO `city` VALUES (3625,'Murmansk','RUS','Murmansk',376300); +INSERT INTO `city` VALUES (3626,'Ulan-Ude','RUS','Burjatia',370400); +INSERT INTO `city` VALUES (3627,'Kurgan','RUS','Kurgan',364700); +INSERT INTO `city` VALUES (3628,'Arkangeli','RUS','Arkangeli',361800); +INSERT INTO `city` VALUES (3629,'Sot�i','RUS','Krasnodar',358600); +INSERT INTO `city` VALUES (3630,'Smolensk','RUS','Smolensk',353400); +INSERT INTO `city` VALUES (3631,'Orjol','RUS','Orjol',344500); +INSERT INTO `city` VALUES (3632,'Stavropol','RUS','Stavropol',343300); +INSERT INTO `city` VALUES (3633,'Belgorod','RUS','Belgorod',342000); +INSERT INTO `city` VALUES (3634,'Kaluga','RUS','Kaluga',339300); +INSERT INTO `city` VALUES (3635,'Vladimir','RUS','Vladimir',337100); +INSERT INTO `city` VALUES (3636,'Mahat�kala','RUS','Dagestan',332800); +INSERT INTO `city` VALUES (3637,'T�erepovets','RUS','Vologda',324400); +INSERT INTO `city` VALUES (3638,'Saransk','RUS','Mordva',314800); +INSERT INTO `city` VALUES (3639,'Tambov','RUS','Tambov',312000); +INSERT INTO `city` VALUES (3640,'Vladikavkaz','RUS','North Ossetia-Alania',310100); +INSERT INTO `city` VALUES (3641,'T�ita','RUS','T�ita',309900); +INSERT INTO `city` VALUES (3642,'Vologda','RUS','Vologda',302500); +INSERT INTO `city` VALUES (3643,'Veliki Novgorod','RUS','Novgorod',299500); +INSERT INTO `city` VALUES (3644,'Komsomolsk-na-Amure','RUS','Habarovsk',291600); +INSERT INTO `city` VALUES (3645,'Kostroma','RUS','Kostroma',288100); +INSERT INTO `city` VALUES (3646,'Volzski','RUS','Volgograd',286900); +INSERT INTO `city` VALUES (3647,'Taganrog','RUS','Rostov-na-Donu',284400); +INSERT INTO `city` VALUES (3648,'Petroskoi','RUS','Karjala',282100); +INSERT INTO `city` VALUES (3649,'Bratsk','RUS','Irkutsk',277600); +INSERT INTO `city` VALUES (3650,'Dzerzinsk','RUS','Nizni Novgorod',277100); +INSERT INTO `city` VALUES (3651,'Surgut','RUS','Hanti-Mansia',274900); +INSERT INTO `city` VALUES (3652,'Orsk','RUS','Orenburg',273900); +INSERT INTO `city` VALUES (3653,'Sterlitamak','RUS','Ba�kortostan',265200); +INSERT INTO `city` VALUES (3654,'Angarsk','RUS','Irkutsk',264700); +INSERT INTO `city` VALUES (3655,'Jo�kar-Ola','RUS','Marinmaa',249200); +INSERT INTO `city` VALUES (3656,'Rybinsk','RUS','Jaroslavl',239600); +INSERT INTO `city` VALUES (3657,'Prokopjevsk','RUS','Kemerovo',237300); +INSERT INTO `city` VALUES (3658,'Niznevartovsk','RUS','Hanti-Mansia',233900); +INSERT INTO `city` VALUES (3659,'Nalt�ik','RUS','Kabardi-Balkaria',233400); +INSERT INTO `city` VALUES (3660,'Syktyvkar','RUS','Komi',229700); +INSERT INTO `city` VALUES (3661,'Severodvinsk','RUS','Arkangeli',229300); +INSERT INTO `city` VALUES (3662,'Bijsk','RUS','Altai',225000); +INSERT INTO `city` VALUES (3663,'Niznekamsk','RUS','Tatarstan',223400); +INSERT INTO `city` VALUES (3664,'Blagove�t�ensk','RUS','Amur',222000); +INSERT INTO `city` VALUES (3665,'�ahty','RUS','Rostov-na-Donu',221800); +INSERT INTO `city` VALUES (3666,'Staryi Oskol','RUS','Belgorod',213800); +INSERT INTO `city` VALUES (3667,'Zelenograd','RUS','Moscow (City)',207100); +INSERT INTO `city` VALUES (3668,'Balakovo','RUS','Saratov',206000); +INSERT INTO `city` VALUES (3669,'Novorossijsk','RUS','Krasnodar',203300); +INSERT INTO `city` VALUES (3670,'Pihkova','RUS','Pihkova',201500); +INSERT INTO `city` VALUES (3671,'Zlatoust','RUS','T�eljabinsk',196900); +INSERT INTO `city` VALUES (3672,'Jakutsk','RUS','Saha (Jakutia)',195400); +INSERT INTO `city` VALUES (3673,'Podolsk','RUS','Moskova',194300); +INSERT INTO `city` VALUES (3674,'Petropavlovsk-Kamt�atski','RUS','Kamt�atka',194100); +INSERT INTO `city` VALUES (3675,'Kamensk-Uralski','RUS','Sverdlovsk',190600); +INSERT INTO `city` VALUES (3676,'Engels','RUS','Saratov',189000); +INSERT INTO `city` VALUES (3677,'Syzran','RUS','Samara',186900); +INSERT INTO `city` VALUES (3678,'Grozny','RUS','T�et�enia',186000); +INSERT INTO `city` VALUES (3679,'Novot�erkassk','RUS','Rostov-na-Donu',184400); +INSERT INTO `city` VALUES (3680,'Berezniki','RUS','Perm',181900); +INSERT INTO `city` VALUES (3681,'Juzno-Sahalinsk','RUS','Sahalin',179200); +INSERT INTO `city` VALUES (3682,'Volgodonsk','RUS','Rostov-na-Donu',178200); +INSERT INTO `city` VALUES (3683,'Abakan','RUS','Hakassia',169200); +INSERT INTO `city` VALUES (3684,'Maikop','RUS','Adygea',167300); +INSERT INTO `city` VALUES (3685,'Miass','RUS','T�eljabinsk',166200); +INSERT INTO `city` VALUES (3686,'Armavir','RUS','Krasnodar',164900); +INSERT INTO `city` VALUES (3687,'Ljubertsy','RUS','Moskova',163900); +INSERT INTO `city` VALUES (3688,'Rubtsovsk','RUS','Altai',162600); +INSERT INTO `city` VALUES (3689,'Kovrov','RUS','Vladimir',159900); +INSERT INTO `city` VALUES (3690,'Nahodka','RUS','Primorje',157700); +INSERT INTO `city` VALUES (3691,'Ussurijsk','RUS','Primorje',157300); +INSERT INTO `city` VALUES (3692,'Salavat','RUS','Ba�kortostan',156800); +INSERT INTO `city` VALUES (3693,'Myti�t�i','RUS','Moskova',155700); +INSERT INTO `city` VALUES (3694,'Kolomna','RUS','Moskova',150700); +INSERT INTO `city` VALUES (3695,'Elektrostal','RUS','Moskova',147000); +INSERT INTO `city` VALUES (3696,'Murom','RUS','Vladimir',142400); +INSERT INTO `city` VALUES (3697,'Kolpino','RUS','Pietari',141200); +INSERT INTO `city` VALUES (3698,'Norilsk','RUS','Krasnojarsk',140800); +INSERT INTO `city` VALUES (3699,'Almetjevsk','RUS','Tatarstan',140700); +INSERT INTO `city` VALUES (3700,'Novomoskovsk','RUS','Tula',138100); +INSERT INTO `city` VALUES (3701,'Dimitrovgrad','RUS','Uljanovsk',137000); +INSERT INTO `city` VALUES (3702,'Pervouralsk','RUS','Sverdlovsk',136100); +INSERT INTO `city` VALUES (3703,'Himki','RUS','Moskova',133700); +INSERT INTO `city` VALUES (3704,'Bala�iha','RUS','Moskova',132900); +INSERT INTO `city` VALUES (3705,'Nevinnomyssk','RUS','Stavropol',132600); +INSERT INTO `city` VALUES (3706,'Pjatigorsk','RUS','Stavropol',132500); +INSERT INTO `city` VALUES (3707,'Korolev','RUS','Moskova',132400); +INSERT INTO `city` VALUES (3708,'Serpuhov','RUS','Moskova',132000); +INSERT INTO `city` VALUES (3709,'Odintsovo','RUS','Moskova',127400); +INSERT INTO `city` VALUES (3710,'Orehovo-Zujevo','RUS','Moskova',124900); +INSERT INTO `city` VALUES (3711,'Kamy�in','RUS','Volgograd',124600); +INSERT INTO `city` VALUES (3712,'Novot�eboksarsk','RUS','T�uvassia',123400); +INSERT INTO `city` VALUES (3713,'T�erkessk','RUS','Karat�ai-T�erkessia',121700); +INSERT INTO `city` VALUES (3714,'At�insk','RUS','Krasnojarsk',121600); +INSERT INTO `city` VALUES (3715,'Magadan','RUS','Magadan',121000); +INSERT INTO `city` VALUES (3716,'Mit�urinsk','RUS','Tambov',120700); +INSERT INTO `city` VALUES (3717,'Kislovodsk','RUS','Stavropol',120400); +INSERT INTO `city` VALUES (3718,'Jelets','RUS','Lipetsk',119400); +INSERT INTO `city` VALUES (3719,'Seversk','RUS','Tomsk',118600); +INSERT INTO `city` VALUES (3720,'Noginsk','RUS','Moskova',117200); +INSERT INTO `city` VALUES (3721,'Velikije Luki','RUS','Pihkova',116300); +INSERT INTO `city` VALUES (3722,'Novokuiby�evsk','RUS','Samara',116200); +INSERT INTO `city` VALUES (3723,'Neftekamsk','RUS','Ba�kortostan',115700); +INSERT INTO `city` VALUES (3724,'Leninsk-Kuznetski','RUS','Kemerovo',113800); +INSERT INTO `city` VALUES (3725,'Oktjabrski','RUS','Ba�kortostan',111500); +INSERT INTO `city` VALUES (3726,'Sergijev Posad','RUS','Moskova',111100); +INSERT INTO `city` VALUES (3727,'Arzamas','RUS','Nizni Novgorod',110700); +INSERT INTO `city` VALUES (3728,'Kiseljovsk','RUS','Kemerovo',110000); +INSERT INTO `city` VALUES (3729,'Novotroitsk','RUS','Orenburg',109600); +INSERT INTO `city` VALUES (3730,'Obninsk','RUS','Kaluga',108300); +INSERT INTO `city` VALUES (3731,'Kansk','RUS','Krasnojarsk',107400); +INSERT INTO `city` VALUES (3732,'Glazov','RUS','Udmurtia',106300); +INSERT INTO `city` VALUES (3733,'Solikamsk','RUS','Perm',106000); +INSERT INTO `city` VALUES (3734,'Sarapul','RUS','Udmurtia',105700); +INSERT INTO `city` VALUES (3735,'Ust-Ilimsk','RUS','Irkutsk',105200); +INSERT INTO `city` VALUES (3736,'�t�olkovo','RUS','Moskova',104900); +INSERT INTO `city` VALUES (3737,'Mezduret�ensk','RUS','Kemerovo',104400); +INSERT INTO `city` VALUES (3738,'Usolje-Sibirskoje','RUS','Irkutsk',103500); +INSERT INTO `city` VALUES (3739,'Elista','RUS','Kalmykia',103300); +INSERT INTO `city` VALUES (3740,'Novo�ahtinsk','RUS','Rostov-na-Donu',101900); +INSERT INTO `city` VALUES (3741,'Votkinsk','RUS','Udmurtia',101700); +INSERT INTO `city` VALUES (3742,'Kyzyl','RUS','Tyva',101100); +INSERT INTO `city` VALUES (3743,'Serov','RUS','Sverdlovsk',100400); +INSERT INTO `city` VALUES (3744,'Zelenodolsk','RUS','Tatarstan',100200); +INSERT INTO `city` VALUES (3745,'Zeleznodoroznyi','RUS','Moskova',100100); +INSERT INTO `city` VALUES (3746,'Kine�ma','RUS','Ivanovo',100000); +INSERT INTO `city` VALUES (3747,'Kuznetsk','RUS','Penza',98200); +INSERT INTO `city` VALUES (3748,'Uhta','RUS','Komi',98000); +INSERT INTO `city` VALUES (3749,'Jessentuki','RUS','Stavropol',97900); +INSERT INTO `city` VALUES (3750,'Tobolsk','RUS','Tjumen',97600); +INSERT INTO `city` VALUES (3751,'Neftejugansk','RUS','Hanti-Mansia',97400); +INSERT INTO `city` VALUES (3752,'Bataisk','RUS','Rostov-na-Donu',97300); +INSERT INTO `city` VALUES (3753,'Nojabrsk','RUS','Yamalin Nenetsia',97300); +INSERT INTO `city` VALUES (3754,'Bala�ov','RUS','Saratov',97100); +INSERT INTO `city` VALUES (3755,'Zeleznogorsk','RUS','Kursk',96900); +INSERT INTO `city` VALUES (3756,'Zukovski','RUS','Moskova',96500); +INSERT INTO `city` VALUES (3757,'Anzero-Sudzensk','RUS','Kemerovo',96100); +INSERT INTO `city` VALUES (3758,'Bugulma','RUS','Tatarstan',94100); +INSERT INTO `city` VALUES (3759,'Zeleznogorsk','RUS','Krasnojarsk',94000); +INSERT INTO `city` VALUES (3760,'Novouralsk','RUS','Sverdlovsk',93300); +INSERT INTO `city` VALUES (3761,'Pu�kin','RUS','Pietari',92900); +INSERT INTO `city` VALUES (3762,'Vorkuta','RUS','Komi',92600); +INSERT INTO `city` VALUES (3763,'Derbent','RUS','Dagestan',92300); +INSERT INTO `city` VALUES (3764,'Kirovo-T�epetsk','RUS','Kirov',91600); +INSERT INTO `city` VALUES (3765,'Krasnogorsk','RUS','Moskova',91000); +INSERT INTO `city` VALUES (3766,'Klin','RUS','Moskova',90000); +INSERT INTO `city` VALUES (3767,'T�aikovski','RUS','Perm',90000); +INSERT INTO `city` VALUES (3768,'Novyi Urengoi','RUS','Yamalin Nenetsia',89800); +INSERT INTO `city` VALUES (3769,'Ho Chi Minh City','VNM','Ho Chi Minh City',3980000); +INSERT INTO `city` VALUES (3770,'Hanoi','VNM','Hanoi',1410000); +INSERT INTO `city` VALUES (3771,'Haiphong','VNM','Haiphong',783133); +INSERT INTO `city` VALUES (3772,'Da Nang','VNM','Quang Nam-Da Nang',382674); +INSERT INTO `city` VALUES (3773,'Bi�n Hoa','VNM','Dong Nai',282095); +INSERT INTO `city` VALUES (3774,'Nha Trang','VNM','Khanh Hoa',221331); +INSERT INTO `city` VALUES (3775,'Hue','VNM','Thua Thien-Hue',219149); +INSERT INTO `city` VALUES (3776,'Can Tho','VNM','Can Tho',215587); +INSERT INTO `city` VALUES (3777,'Cam Pha','VNM','Quang Binh',209086); +INSERT INTO `city` VALUES (3778,'Nam Dinh','VNM','Nam Ha',171699); +INSERT INTO `city` VALUES (3779,'Quy Nhon','VNM','Binh Dinh',163385); +INSERT INTO `city` VALUES (3780,'Vung Tau','VNM','Ba Ria-Vung Tau',145145); +INSERT INTO `city` VALUES (3781,'Rach Gia','VNM','Kien Giang',141132); +INSERT INTO `city` VALUES (3782,'Long Xuyen','VNM','An Giang',132681); +INSERT INTO `city` VALUES (3783,'Thai Nguyen','VNM','Bac Thai',127643); +INSERT INTO `city` VALUES (3784,'Hong Gai','VNM','Quang Ninh',127484); +INSERT INTO `city` VALUES (3785,'Phan Thi�t','VNM','Binh Thuan',114236); +INSERT INTO `city` VALUES (3786,'Cam Ranh','VNM','Khanh Hoa',114041); +INSERT INTO `city` VALUES (3787,'Vinh','VNM','Nghe An',112455); +INSERT INTO `city` VALUES (3788,'My Tho','VNM','Tien Giang',108404); +INSERT INTO `city` VALUES (3789,'Da Lat','VNM','Lam Dong',106409); +INSERT INTO `city` VALUES (3790,'Buon Ma Thuot','VNM','Dac Lac',97044); +INSERT INTO `city` VALUES (3791,'Tallinn','EST','Harjumaa',403981); +INSERT INTO `city` VALUES (3792,'Tartu','EST','Tartumaa',101246); +INSERT INTO `city` VALUES (3793,'New York','USA','New York',8008278); +INSERT INTO `city` VALUES (3794,'Los Angeles','USA','California',3694820); +INSERT INTO `city` VALUES (3795,'Chicago','USA','Illinois',2896016); +INSERT INTO `city` VALUES (3796,'Houston','USA','Texas',1953631); +INSERT INTO `city` VALUES (3797,'Philadelphia','USA','Pennsylvania',1517550); +INSERT INTO `city` VALUES (3798,'Phoenix','USA','Arizona',1321045); +INSERT INTO `city` VALUES (3799,'San Diego','USA','California',1223400); +INSERT INTO `city` VALUES (3800,'Dallas','USA','Texas',1188580); +INSERT INTO `city` VALUES (3801,'San Antonio','USA','Texas',1144646); +INSERT INTO `city` VALUES (3802,'Detroit','USA','Michigan',951270); +INSERT INTO `city` VALUES (3803,'San Jose','USA','California',894943); +INSERT INTO `city` VALUES (3804,'Indianapolis','USA','Indiana',791926); +INSERT INTO `city` VALUES (3805,'San Francisco','USA','California',776733); +INSERT INTO `city` VALUES (3806,'Jacksonville','USA','Florida',735167); +INSERT INTO `city` VALUES (3807,'Columbus','USA','Ohio',711470); +INSERT INTO `city` VALUES (3808,'Austin','USA','Texas',656562); +INSERT INTO `city` VALUES (3809,'Baltimore','USA','Maryland',651154); +INSERT INTO `city` VALUES (3810,'Memphis','USA','Tennessee',650100); +INSERT INTO `city` VALUES (3811,'Milwaukee','USA','Wisconsin',596974); +INSERT INTO `city` VALUES (3812,'Boston','USA','Massachusetts',589141); +INSERT INTO `city` VALUES (3813,'Washington','USA','District of Columbia',572059); +INSERT INTO `city` VALUES (3814,'Nashville-Davidson','USA','Tennessee',569891); +INSERT INTO `city` VALUES (3815,'El Paso','USA','Texas',563662); +INSERT INTO `city` VALUES (3816,'Seattle','USA','Washington',563374); +INSERT INTO `city` VALUES (3817,'Denver','USA','Colorado',554636); +INSERT INTO `city` VALUES (3818,'Charlotte','USA','North Carolina',540828); +INSERT INTO `city` VALUES (3819,'Fort Worth','USA','Texas',534694); +INSERT INTO `city` VALUES (3820,'Portland','USA','Oregon',529121); +INSERT INTO `city` VALUES (3821,'Oklahoma City','USA','Oklahoma',506132); +INSERT INTO `city` VALUES (3822,'Tucson','USA','Arizona',486699); +INSERT INTO `city` VALUES (3823,'New Orleans','USA','Louisiana',484674); +INSERT INTO `city` VALUES (3824,'Las Vegas','USA','Nevada',478434); +INSERT INTO `city` VALUES (3825,'Cleveland','USA','Ohio',478403); +INSERT INTO `city` VALUES (3826,'Long Beach','USA','California',461522); +INSERT INTO `city` VALUES (3827,'Albuquerque','USA','New Mexico',448607); +INSERT INTO `city` VALUES (3828,'Kansas City','USA','Missouri',441545); +INSERT INTO `city` VALUES (3829,'Fresno','USA','California',427652); +INSERT INTO `city` VALUES (3830,'Virginia Beach','USA','Virginia',425257); +INSERT INTO `city` VALUES (3831,'Atlanta','USA','Georgia',416474); +INSERT INTO `city` VALUES (3832,'Sacramento','USA','California',407018); +INSERT INTO `city` VALUES (3833,'Oakland','USA','California',399484); +INSERT INTO `city` VALUES (3834,'Mesa','USA','Arizona',396375); +INSERT INTO `city` VALUES (3835,'Tulsa','USA','Oklahoma',393049); +INSERT INTO `city` VALUES (3836,'Omaha','USA','Nebraska',390007); +INSERT INTO `city` VALUES (3837,'Minneapolis','USA','Minnesota',382618); +INSERT INTO `city` VALUES (3838,'Honolulu','USA','Hawaii',371657); +INSERT INTO `city` VALUES (3839,'Miami','USA','Florida',362470); +INSERT INTO `city` VALUES (3840,'Colorado Springs','USA','Colorado',360890); +INSERT INTO `city` VALUES (3841,'Saint Louis','USA','Missouri',348189); +INSERT INTO `city` VALUES (3842,'Wichita','USA','Kansas',344284); +INSERT INTO `city` VALUES (3843,'Santa Ana','USA','California',337977); +INSERT INTO `city` VALUES (3844,'Pittsburgh','USA','Pennsylvania',334563); +INSERT INTO `city` VALUES (3845,'Arlington','USA','Texas',332969); +INSERT INTO `city` VALUES (3846,'Cincinnati','USA','Ohio',331285); +INSERT INTO `city` VALUES (3847,'Anaheim','USA','California',328014); +INSERT INTO `city` VALUES (3848,'Toledo','USA','Ohio',313619); +INSERT INTO `city` VALUES (3849,'Tampa','USA','Florida',303447); +INSERT INTO `city` VALUES (3850,'Buffalo','USA','New York',292648); +INSERT INTO `city` VALUES (3851,'Saint Paul','USA','Minnesota',287151); +INSERT INTO `city` VALUES (3852,'Corpus Christi','USA','Texas',277454); +INSERT INTO `city` VALUES (3853,'Aurora','USA','Colorado',276393); +INSERT INTO `city` VALUES (3854,'Raleigh','USA','North Carolina',276093); +INSERT INTO `city` VALUES (3855,'Newark','USA','New Jersey',273546); +INSERT INTO `city` VALUES (3856,'Lexington-Fayette','USA','Kentucky',260512); +INSERT INTO `city` VALUES (3857,'Anchorage','USA','Alaska',260283); +INSERT INTO `city` VALUES (3858,'Louisville','USA','Kentucky',256231); +INSERT INTO `city` VALUES (3859,'Riverside','USA','California',255166); +INSERT INTO `city` VALUES (3860,'Saint Petersburg','USA','Florida',248232); +INSERT INTO `city` VALUES (3861,'Bakersfield','USA','California',247057); +INSERT INTO `city` VALUES (3862,'Stockton','USA','California',243771); +INSERT INTO `city` VALUES (3863,'Birmingham','USA','Alabama',242820); +INSERT INTO `city` VALUES (3864,'Jersey City','USA','New Jersey',240055); +INSERT INTO `city` VALUES (3865,'Norfolk','USA','Virginia',234403); +INSERT INTO `city` VALUES (3866,'Baton Rouge','USA','Louisiana',227818); +INSERT INTO `city` VALUES (3867,'Hialeah','USA','Florida',226419); +INSERT INTO `city` VALUES (3868,'Lincoln','USA','Nebraska',225581); +INSERT INTO `city` VALUES (3869,'Greensboro','USA','North Carolina',223891); +INSERT INTO `city` VALUES (3870,'Plano','USA','Texas',222030); +INSERT INTO `city` VALUES (3871,'Rochester','USA','New York',219773); +INSERT INTO `city` VALUES (3872,'Glendale','USA','Arizona',218812); +INSERT INTO `city` VALUES (3873,'Akron','USA','Ohio',217074); +INSERT INTO `city` VALUES (3874,'Garland','USA','Texas',215768); +INSERT INTO `city` VALUES (3875,'Madison','USA','Wisconsin',208054); +INSERT INTO `city` VALUES (3876,'Fort Wayne','USA','Indiana',205727); +INSERT INTO `city` VALUES (3877,'Fremont','USA','California',203413); +INSERT INTO `city` VALUES (3878,'Scottsdale','USA','Arizona',202705); +INSERT INTO `city` VALUES (3879,'Montgomery','USA','Alabama',201568); +INSERT INTO `city` VALUES (3880,'Shreveport','USA','Louisiana',200145); +INSERT INTO `city` VALUES (3881,'Augusta-Richmond County','USA','Georgia',199775); +INSERT INTO `city` VALUES (3882,'Lubbock','USA','Texas',199564); +INSERT INTO `city` VALUES (3883,'Chesapeake','USA','Virginia',199184); +INSERT INTO `city` VALUES (3884,'Mobile','USA','Alabama',198915); +INSERT INTO `city` VALUES (3885,'Des Moines','USA','Iowa',198682); +INSERT INTO `city` VALUES (3886,'Grand Rapids','USA','Michigan',197800); +INSERT INTO `city` VALUES (3887,'Richmond','USA','Virginia',197790); +INSERT INTO `city` VALUES (3888,'Yonkers','USA','New York',196086); +INSERT INTO `city` VALUES (3889,'Spokane','USA','Washington',195629); +INSERT INTO `city` VALUES (3890,'Glendale','USA','California',194973); +INSERT INTO `city` VALUES (3891,'Tacoma','USA','Washington',193556); +INSERT INTO `city` VALUES (3892,'Irving','USA','Texas',191615); +INSERT INTO `city` VALUES (3893,'Huntington Beach','USA','California',189594); +INSERT INTO `city` VALUES (3894,'Modesto','USA','California',188856); +INSERT INTO `city` VALUES (3895,'Durham','USA','North Carolina',187035); +INSERT INTO `city` VALUES (3896,'Columbus','USA','Georgia',186291); +INSERT INTO `city` VALUES (3897,'Orlando','USA','Florida',185951); +INSERT INTO `city` VALUES (3898,'Boise City','USA','Idaho',185787); +INSERT INTO `city` VALUES (3899,'Winston-Salem','USA','North Carolina',185776); +INSERT INTO `city` VALUES (3900,'San Bernardino','USA','California',185401); +INSERT INTO `city` VALUES (3901,'Jackson','USA','Mississippi',184256); +INSERT INTO `city` VALUES (3902,'Little Rock','USA','Arkansas',183133); +INSERT INTO `city` VALUES (3903,'Salt Lake City','USA','Utah',181743); +INSERT INTO `city` VALUES (3904,'Reno','USA','Nevada',180480); +INSERT INTO `city` VALUES (3905,'Newport News','USA','Virginia',180150); +INSERT INTO `city` VALUES (3906,'Chandler','USA','Arizona',176581); +INSERT INTO `city` VALUES (3907,'Laredo','USA','Texas',176576); +INSERT INTO `city` VALUES (3908,'Henderson','USA','Nevada',175381); +INSERT INTO `city` VALUES (3909,'Arlington','USA','Virginia',174838); +INSERT INTO `city` VALUES (3910,'Knoxville','USA','Tennessee',173890); +INSERT INTO `city` VALUES (3911,'Amarillo','USA','Texas',173627); +INSERT INTO `city` VALUES (3912,'Providence','USA','Rhode Island',173618); +INSERT INTO `city` VALUES (3913,'Chula Vista','USA','California',173556); +INSERT INTO `city` VALUES (3914,'Worcester','USA','Massachusetts',172648); +INSERT INTO `city` VALUES (3915,'Oxnard','USA','California',170358); +INSERT INTO `city` VALUES (3916,'Dayton','USA','Ohio',166179); +INSERT INTO `city` VALUES (3917,'Garden Grove','USA','California',165196); +INSERT INTO `city` VALUES (3918,'Oceanside','USA','California',161029); +INSERT INTO `city` VALUES (3919,'Tempe','USA','Arizona',158625); +INSERT INTO `city` VALUES (3920,'Huntsville','USA','Alabama',158216); +INSERT INTO `city` VALUES (3921,'Ontario','USA','California',158007); +INSERT INTO `city` VALUES (3922,'Chattanooga','USA','Tennessee',155554); +INSERT INTO `city` VALUES (3923,'Fort Lauderdale','USA','Florida',152397); +INSERT INTO `city` VALUES (3924,'Springfield','USA','Massachusetts',152082); +INSERT INTO `city` VALUES (3925,'Springfield','USA','Missouri',151580); +INSERT INTO `city` VALUES (3926,'Santa Clarita','USA','California',151088); +INSERT INTO `city` VALUES (3927,'Salinas','USA','California',151060); +INSERT INTO `city` VALUES (3928,'Tallahassee','USA','Florida',150624); +INSERT INTO `city` VALUES (3929,'Rockford','USA','Illinois',150115); +INSERT INTO `city` VALUES (3930,'Pomona','USA','California',149473); +INSERT INTO `city` VALUES (3931,'Metairie','USA','Louisiana',149428); +INSERT INTO `city` VALUES (3932,'Paterson','USA','New Jersey',149222); +INSERT INTO `city` VALUES (3933,'Overland Park','USA','Kansas',149080); +INSERT INTO `city` VALUES (3934,'Santa Rosa','USA','California',147595); +INSERT INTO `city` VALUES (3935,'Syracuse','USA','New York',147306); +INSERT INTO `city` VALUES (3936,'Kansas City','USA','Kansas',146866); +INSERT INTO `city` VALUES (3937,'Hampton','USA','Virginia',146437); +INSERT INTO `city` VALUES (3938,'Lakewood','USA','Colorado',144126); +INSERT INTO `city` VALUES (3939,'Vancouver','USA','Washington',143560); +INSERT INTO `city` VALUES (3940,'Irvine','USA','California',143072); +INSERT INTO `city` VALUES (3941,'Aurora','USA','Illinois',142990); +INSERT INTO `city` VALUES (3942,'Moreno Valley','USA','California',142381); +INSERT INTO `city` VALUES (3943,'Pasadena','USA','California',141674); +INSERT INTO `city` VALUES (3944,'Hayward','USA','California',140030); +INSERT INTO `city` VALUES (3945,'Brownsville','USA','Texas',139722); +INSERT INTO `city` VALUES (3946,'Bridgeport','USA','Connecticut',139529); +INSERT INTO `city` VALUES (3947,'Hollywood','USA','Florida',139357); +INSERT INTO `city` VALUES (3948,'Warren','USA','Michigan',138247); +INSERT INTO `city` VALUES (3949,'Torrance','USA','California',137946); +INSERT INTO `city` VALUES (3950,'Eugene','USA','Oregon',137893); +INSERT INTO `city` VALUES (3951,'Pembroke Pines','USA','Florida',137427); +INSERT INTO `city` VALUES (3952,'Salem','USA','Oregon',136924); +INSERT INTO `city` VALUES (3953,'Pasadena','USA','Texas',133936); +INSERT INTO `city` VALUES (3954,'Escondido','USA','California',133559); +INSERT INTO `city` VALUES (3955,'Sunnyvale','USA','California',131760); +INSERT INTO `city` VALUES (3956,'Savannah','USA','Georgia',131510); +INSERT INTO `city` VALUES (3957,'Fontana','USA','California',128929); +INSERT INTO `city` VALUES (3958,'Orange','USA','California',128821); +INSERT INTO `city` VALUES (3959,'Naperville','USA','Illinois',128358); +INSERT INTO `city` VALUES (3960,'Alexandria','USA','Virginia',128283); +INSERT INTO `city` VALUES (3961,'Rancho Cucamonga','USA','California',127743); +INSERT INTO `city` VALUES (3962,'Grand Prairie','USA','Texas',127427); +INSERT INTO `city` VALUES (3963,'East Los Angeles','USA','California',126379); +INSERT INTO `city` VALUES (3964,'Fullerton','USA','California',126003); +INSERT INTO `city` VALUES (3965,'Corona','USA','California',124966); +INSERT INTO `city` VALUES (3966,'Flint','USA','Michigan',124943); +INSERT INTO `city` VALUES (3967,'Paradise','USA','Nevada',124682); +INSERT INTO `city` VALUES (3968,'Mesquite','USA','Texas',124523); +INSERT INTO `city` VALUES (3969,'Sterling Heights','USA','Michigan',124471); +INSERT INTO `city` VALUES (3970,'Sioux Falls','USA','South Dakota',123975); +INSERT INTO `city` VALUES (3971,'New Haven','USA','Connecticut',123626); +INSERT INTO `city` VALUES (3972,'Topeka','USA','Kansas',122377); +INSERT INTO `city` VALUES (3973,'Concord','USA','California',121780); +INSERT INTO `city` VALUES (3974,'Evansville','USA','Indiana',121582); +INSERT INTO `city` VALUES (3975,'Hartford','USA','Connecticut',121578); +INSERT INTO `city` VALUES (3976,'Fayetteville','USA','North Carolina',121015); +INSERT INTO `city` VALUES (3977,'Cedar Rapids','USA','Iowa',120758); +INSERT INTO `city` VALUES (3978,'Elizabeth','USA','New Jersey',120568); +INSERT INTO `city` VALUES (3979,'Lansing','USA','Michigan',119128); +INSERT INTO `city` VALUES (3980,'Lancaster','USA','California',118718); +INSERT INTO `city` VALUES (3981,'Fort Collins','USA','Colorado',118652); +INSERT INTO `city` VALUES (3982,'Coral Springs','USA','Florida',117549); +INSERT INTO `city` VALUES (3983,'Stamford','USA','Connecticut',117083); +INSERT INTO `city` VALUES (3984,'Thousand Oaks','USA','California',117005); +INSERT INTO `city` VALUES (3985,'Vallejo','USA','California',116760); +INSERT INTO `city` VALUES (3986,'Palmdale','USA','California',116670); +INSERT INTO `city` VALUES (3987,'Columbia','USA','South Carolina',116278); +INSERT INTO `city` VALUES (3988,'El Monte','USA','California',115965); +INSERT INTO `city` VALUES (3989,'Abilene','USA','Texas',115930); +INSERT INTO `city` VALUES (3990,'North Las Vegas','USA','Nevada',115488); +INSERT INTO `city` VALUES (3991,'Ann Arbor','USA','Michigan',114024); +INSERT INTO `city` VALUES (3992,'Beaumont','USA','Texas',113866); +INSERT INTO `city` VALUES (3993,'Waco','USA','Texas',113726); +INSERT INTO `city` VALUES (3994,'Macon','USA','Georgia',113336); +INSERT INTO `city` VALUES (3995,'Independence','USA','Missouri',113288); +INSERT INTO `city` VALUES (3996,'Peoria','USA','Illinois',112936); +INSERT INTO `city` VALUES (3997,'Inglewood','USA','California',112580); +INSERT INTO `city` VALUES (3998,'Springfield','USA','Illinois',111454); +INSERT INTO `city` VALUES (3999,'Simi Valley','USA','California',111351); +INSERT INTO `city` VALUES (4000,'Lafayette','USA','Louisiana',110257); +INSERT INTO `city` VALUES (4001,'Gilbert','USA','Arizona',109697); +INSERT INTO `city` VALUES (4002,'Carrollton','USA','Texas',109576); +INSERT INTO `city` VALUES (4003,'Bellevue','USA','Washington',109569); +INSERT INTO `city` VALUES (4004,'West Valley City','USA','Utah',108896); +INSERT INTO `city` VALUES (4005,'Clarksville','USA','Tennessee',108787); +INSERT INTO `city` VALUES (4006,'Costa Mesa','USA','California',108724); +INSERT INTO `city` VALUES (4007,'Peoria','USA','Arizona',108364); +INSERT INTO `city` VALUES (4008,'South Bend','USA','Indiana',107789); +INSERT INTO `city` VALUES (4009,'Downey','USA','California',107323); +INSERT INTO `city` VALUES (4010,'Waterbury','USA','Connecticut',107271); +INSERT INTO `city` VALUES (4011,'Manchester','USA','New Hampshire',107006); +INSERT INTO `city` VALUES (4012,'Allentown','USA','Pennsylvania',106632); +INSERT INTO `city` VALUES (4013,'McAllen','USA','Texas',106414); +INSERT INTO `city` VALUES (4014,'Joliet','USA','Illinois',106221); +INSERT INTO `city` VALUES (4015,'Lowell','USA','Massachusetts',105167); +INSERT INTO `city` VALUES (4016,'Provo','USA','Utah',105166); +INSERT INTO `city` VALUES (4017,'West Covina','USA','California',105080); +INSERT INTO `city` VALUES (4018,'Wichita Falls','USA','Texas',104197); +INSERT INTO `city` VALUES (4019,'Erie','USA','Pennsylvania',103717); +INSERT INTO `city` VALUES (4020,'Daly City','USA','California',103621); +INSERT INTO `city` VALUES (4021,'Citrus Heights','USA','California',103455); +INSERT INTO `city` VALUES (4022,'Norwalk','USA','California',103298); +INSERT INTO `city` VALUES (4023,'Gary','USA','Indiana',102746); +INSERT INTO `city` VALUES (4024,'Berkeley','USA','California',102743); +INSERT INTO `city` VALUES (4025,'Santa Clara','USA','California',102361); +INSERT INTO `city` VALUES (4026,'Green Bay','USA','Wisconsin',102313); +INSERT INTO `city` VALUES (4027,'Cape Coral','USA','Florida',102286); +INSERT INTO `city` VALUES (4028,'Arvada','USA','Colorado',102153); +INSERT INTO `city` VALUES (4029,'Pueblo','USA','Colorado',102121); +INSERT INTO `city` VALUES (4030,'Sandy','USA','Utah',101853); +INSERT INTO `city` VALUES (4031,'Athens-Clarke County','USA','Georgia',101489); +INSERT INTO `city` VALUES (4032,'Cambridge','USA','Massachusetts',101355); +INSERT INTO `city` VALUES (4033,'Westminster','USA','Colorado',100940); +INSERT INTO `city` VALUES (4034,'San Buenaventura','USA','California',100916); +INSERT INTO `city` VALUES (4035,'Portsmouth','USA','Virginia',100565); +INSERT INTO `city` VALUES (4036,'Livonia','USA','Michigan',100545); +INSERT INTO `city` VALUES (4037,'Burbank','USA','California',100316); +INSERT INTO `city` VALUES (4038,'Clearwater','USA','Florida',99936); +INSERT INTO `city` VALUES (4039,'Midland','USA','Texas',98293); +INSERT INTO `city` VALUES (4040,'Davenport','USA','Iowa',98256); +INSERT INTO `city` VALUES (4041,'Mission Viejo','USA','California',98049); +INSERT INTO `city` VALUES (4042,'Miami Beach','USA','Florida',97855); +INSERT INTO `city` VALUES (4043,'Sunrise Manor','USA','Nevada',95362); +INSERT INTO `city` VALUES (4044,'New Bedford','USA','Massachusetts',94780); +INSERT INTO `city` VALUES (4045,'El Cajon','USA','California',94578); +INSERT INTO `city` VALUES (4046,'Norman','USA','Oklahoma',94193); +INSERT INTO `city` VALUES (4047,'Richmond','USA','California',94100); +INSERT INTO `city` VALUES (4048,'Albany','USA','New York',93994); +INSERT INTO `city` VALUES (4049,'Brockton','USA','Massachusetts',93653); +INSERT INTO `city` VALUES (4050,'Roanoke','USA','Virginia',93357); +INSERT INTO `city` VALUES (4051,'Billings','USA','Montana',92988); +INSERT INTO `city` VALUES (4052,'Compton','USA','California',92864); +INSERT INTO `city` VALUES (4053,'Gainesville','USA','Florida',92291); +INSERT INTO `city` VALUES (4054,'Fairfield','USA','California',92256); +INSERT INTO `city` VALUES (4055,'Arden-Arcade','USA','California',92040); +INSERT INTO `city` VALUES (4056,'San Mateo','USA','California',91799); +INSERT INTO `city` VALUES (4057,'Visalia','USA','California',91762); +INSERT INTO `city` VALUES (4058,'Boulder','USA','Colorado',91238); +INSERT INTO `city` VALUES (4059,'Cary','USA','North Carolina',91213); +INSERT INTO `city` VALUES (4060,'Santa Monica','USA','California',91084); +INSERT INTO `city` VALUES (4061,'Fall River','USA','Massachusetts',90555); +INSERT INTO `city` VALUES (4062,'Kenosha','USA','Wisconsin',89447); +INSERT INTO `city` VALUES (4063,'Elgin','USA','Illinois',89408); +INSERT INTO `city` VALUES (4064,'Odessa','USA','Texas',89293); +INSERT INTO `city` VALUES (4065,'Carson','USA','California',89089); +INSERT INTO `city` VALUES (4066,'Charleston','USA','South Carolina',89063); +INSERT INTO `city` VALUES (4067,'Charlotte Amalie','VIR','St Thomas',13000); +INSERT INTO `city` VALUES (4068,'Harare','ZWE','Harare',1410000); +INSERT INTO `city` VALUES (4069,'Bulawayo','ZWE','Bulawayo',621742); +INSERT INTO `city` VALUES (4070,'Chitungwiza','ZWE','Harare',274912); +INSERT INTO `city` VALUES (4071,'Mount Darwin','ZWE','Harare',164362); +INSERT INTO `city` VALUES (4072,'Mutare','ZWE','Manicaland',131367); +INSERT INTO `city` VALUES (4073,'Gweru','ZWE','Midlands',128037); +INSERT INTO `city` VALUES (4074,'Gaza','PSE','Gaza',353632); +INSERT INTO `city` VALUES (4075,'Khan Yunis','PSE','Khan Yunis',123175); +INSERT INTO `city` VALUES (4076,'Hebron','PSE','Hebron',119401); +INSERT INTO `city` VALUES (4077,'Jabaliya','PSE','North Gaza',113901); +INSERT INTO `city` VALUES (4078,'Nablus','PSE','Nablus',100231); +INSERT INTO `city` VALUES (4079,'Rafah','PSE','Rafah',92020); +COMMIT; +-- +-- Table structure for table `country` +-- + +DROP TABLE IF EXISTS `country`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `country` ( + `Code` CHAR(3) NOT NULL DEFAULT '', + `Name` CHAR(52) NOT NULL DEFAULT '', + `Continent` enum('Asia','Europe','North America','Africa','Oceania','Antarctica','South America') NOT NULL DEFAULT 'Asia', + `Region` CHAR(26) NOT NULL DEFAULT '', + `SurfaceArea` FLOAT(10,2) NOT NULL DEFAULT '0.00', + `IndepYear` SMALLINT(6) DEFAULT NULL, + `Population` INT(11) NOT NULL DEFAULT '0', + `LifeExpectancy` FLOAT(3,1) DEFAULT NULL, + `GNP` FLOAT(10,2) DEFAULT NULL, + `GNPOld` FLOAT(10,2) DEFAULT NULL, + `LocalName` CHAR(45) NOT NULL DEFAULT '', + `GovernmentForm` CHAR(45) NOT NULL DEFAULT '', + `HeadOfState` CHAR(60) DEFAULT NULL, + `Capital` INT(11) DEFAULT NULL, + `Code2` CHAR(2) NOT NULL DEFAULT '', + PRIMARY KEY (`Code`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `country` +-- +-- ORDER BY: `Code` + +INSERT INTO `country` VALUES ('ABW','Aruba','North America','Caribbean',193.00,NULL,103000,78.4,828.00,793.00,'Aruba','Nonmetropolitan Territory of The Netherlands','Beatrix',129,'AW'); +INSERT INTO `country` VALUES ('AFG','Afghanistan','Asia','Southern and Central Asia',652090.00,1919,22720000,45.9,5976.00,NULL,'Afganistan/Afqanestan','Islamic Emirate','Mohammad Omar',1,'AF'); +INSERT INTO `country` VALUES ('AGO','Angola','Africa','Central Africa',1246700.00,1975,12878000,38.3,6648.00,7984.00,'Angola','Republic','Jos� Eduardo dos Santos',56,'AO'); +INSERT INTO `country` VALUES ('AIA','Anguilla','North America','Caribbean',96.00,NULL,8000,76.1,63.20,NULL,'Anguilla','Dependent Territory of the UK','Elisabeth II',62,'AI'); +INSERT INTO `country` VALUES ('ALB','Albania','Europe','Southern Europe',28748.00,1912,3401200,71.6,3205.00,2500.00,'Shqip�ria','Republic','Rexhep Mejdani',34,'AL'); +INSERT INTO `country` VALUES ('AND','Andorra','Europe','Southern Europe',468.00,1278,78000,83.5,1630.00,NULL,'Andorra','Parliamentary Coprincipality','',55,'AD'); +INSERT INTO `country` VALUES ('ANT','Netherlands Antilles','North America','Caribbean',800.00,NULL,217000,74.7,1941.00,NULL,'Nederlandse Antillen','Nonmetropolitan Territory of The Netherlands','Beatrix',33,'AN'); +INSERT INTO `country` VALUES ('ARE','United Arab Emirates','Asia','Middle East',83600.00,1971,2441000,74.1,37966.00,36846.00,'Al-Imarat al-�Arabiya al-Muttahida','Emirate Federation','Zayid bin Sultan al-Nahayan',65,'AE'); +INSERT INTO `country` VALUES ('ARG','Argentina','South America','South America',2780400.00,1816,37032000,75.1,340238.00,323310.00,'Argentina','Federal Republic','Fernando de la R�a',69,'AR'); +INSERT INTO `country` VALUES ('ARM','Armenia','Asia','Middle East',29800.00,1991,3520000,66.4,1813.00,1627.00,'Hajastan','Republic','Robert Kot�arjan',126,'AM'); +INSERT INTO `country` VALUES ('ASM','American Samoa','Oceania','Polynesia',199.00,NULL,68000,75.1,334.00,NULL,'Amerika Samoa','US Territory','George W. Bush',54,'AS'); +INSERT INTO `country` VALUES ('ATA','Antarctica','Antarctica','Antarctica',13120000.00,NULL,0,NULL,0.00,NULL,'�','Co-administrated','',NULL,'AQ'); +INSERT INTO `country` VALUES ('ATF','French Southern territories','Antarctica','Antarctica',7780.00,NULL,0,NULL,0.00,NULL,'Terres australes fran�aises','Nonmetropolitan Territory of France','Jacques Chirac',NULL,'TF'); +INSERT INTO `country` VALUES ('ATG','Antigua and Barbuda','North America','Caribbean',442.00,1981,68000,70.5,612.00,584.00,'Antigua and Barbuda','Constitutional Monarchy','Elisabeth II',63,'AG'); +INSERT INTO `country` VALUES ('AUS','Australia','Oceania','Australia and New Zealand',7741220.00,1901,18886000,79.8,351182.00,392911.00,'Australia','Constitutional Monarchy, Federation','Elisabeth II',135,'AU'); +INSERT INTO `country` VALUES ('AUT','Austria','Europe','Western Europe',83859.00,1918,8091800,77.7,211860.00,206025.00,'�sterreich','Federal Republic','Thomas Klestil',1523,'AT'); +INSERT INTO `country` VALUES ('AZE','Azerbaijan','Asia','Middle East',86600.00,1991,7734000,62.9,4127.00,4100.00,'Az�rbaycan','Federal Republic','Heyd�r �liyev',144,'AZ'); +INSERT INTO `country` VALUES ('BDI','Burundi','Africa','Eastern Africa',27834.00,1962,6695000,46.2,903.00,982.00,'Burundi/Uburundi','Republic','Pierre Buyoya',552,'BI'); +INSERT INTO `country` VALUES ('BEL','Belgium','Europe','Western Europe',30518.00,1830,10239000,77.8,249704.00,243948.00,'Belgi�/Belgique','Constitutional Monarchy, Federation','Albert II',179,'BE'); +INSERT INTO `country` VALUES ('BEN','Benin','Africa','Western Africa',112622.00,1960,6097000,50.2,2357.00,2141.00,'B�nin','Republic','Mathieu K�r�kou',187,'BJ'); +INSERT INTO `country` VALUES ('BFA','Burkina Faso','Africa','Western Africa',274000.00,1960,11937000,46.7,2425.00,2201.00,'Burkina Faso','Republic','Blaise Compaor�',549,'BF'); +INSERT INTO `country` VALUES ('BGD','Bangladesh','Asia','Southern and Central Asia',143998.00,1971,129155000,60.2,32852.00,31966.00,'Bangladesh','Republic','Shahabuddin Ahmad',150,'BD'); +INSERT INTO `country` VALUES ('BGR','Bulgaria','Europe','Eastern Europe',110994.00,1908,8190900,70.9,12178.00,10169.00,'Balgarija','Republic','Petar Stojanov',539,'BG'); +INSERT INTO `country` VALUES ('BHR','Bahrain','Asia','Middle East',694.00,1971,617000,73.0,6366.00,6097.00,'Al-Bahrayn','Monarchy (Emirate)','Hamad ibn Isa al-Khalifa',149,'BH'); +INSERT INTO `country` VALUES ('BHS','Bahamas','North America','Caribbean',13878.00,1973,307000,71.1,3527.00,3347.00,'The Bahamas','Constitutional Monarchy','Elisabeth II',148,'BS'); +INSERT INTO `country` VALUES ('BIH','Bosnia and Herzegovina','Europe','Southern Europe',51197.00,1992,3972000,71.5,2841.00,NULL,'Bosna i Hercegovina','Federal Republic','Ante Jelavic',201,'BA'); +INSERT INTO `country` VALUES ('BLR','Belarus','Europe','Eastern Europe',207600.00,1991,10236000,68.0,13714.00,NULL,'Belarus','Republic','Aljaksandr Luka�enka',3520,'BY'); +INSERT INTO `country` VALUES ('BLZ','Belize','North America','Central America',22696.00,1981,241000,70.9,630.00,616.00,'Belize','Constitutional Monarchy','Elisabeth II',185,'BZ'); +INSERT INTO `country` VALUES ('BMU','Bermuda','North America','North America',53.00,NULL,65000,76.9,2328.00,2190.00,'Bermuda','Dependent Territory of the UK','Elisabeth II',191,'BM'); +INSERT INTO `country` VALUES ('BOL','Bolivia','South America','South America',1098581.00,1825,8329000,63.7,8571.00,7967.00,'Bolivia','Republic','Hugo B�nzer Su�rez',194,'BO'); +INSERT INTO `country` VALUES ('BRA','Brazil','South America','South America',8547403.00,1822,170115000,62.9,776739.00,804108.00,'Brasil','Federal Republic','Fernando Henrique Cardoso',211,'BR'); +INSERT INTO `country` VALUES ('BRB','Barbados','North America','Caribbean',430.00,1966,270000,73.0,2223.00,2186.00,'Barbados','Constitutional Monarchy','Elisabeth II',174,'BB'); +INSERT INTO `country` VALUES ('BRN','Brunei','Asia','Southeast Asia',5765.00,1984,328000,73.6,11705.00,12460.00,'Brunei Darussalam','Monarchy (Sultanate)','Haji Hassan al-Bolkiah',538,'BN'); +INSERT INTO `country` VALUES ('BTN','Bhutan','Asia','Southern and Central Asia',47000.00,1910,2124000,52.4,372.00,383.00,'Druk-Yul','Monarchy','Jigme Singye Wangchuk',192,'BT'); +INSERT INTO `country` VALUES ('BVT','Bouvet Island','Antarctica','Antarctica',59.00,NULL,0,NULL,0.00,NULL,'Bouvet�ya','Dependent Territory of Norway','Harald V',NULL,'BV'); +INSERT INTO `country` VALUES ('BWA','Botswana','Africa','Southern Africa',581730.00,1966,1622000,39.3,4834.00,4935.00,'Botswana','Republic','Festus G. Mogae',204,'BW'); +INSERT INTO `country` VALUES ('CAF','Central African Republic','Africa','Central Africa',622984.00,1960,3615000,44.0,1054.00,993.00,'Centrafrique/B�-Afr�ka','Republic','Ange-F�lix Patass�',1889,'CF'); +INSERT INTO `country` VALUES ('CAN','Canada','North America','North America',9970610.00,1867,31147000,79.4,598862.00,625626.00,'Canada','Constitutional Monarchy, Federation','Elisabeth II',1822,'CA'); +INSERT INTO `country` VALUES ('CCK','Cocos (Keeling) Islands','Oceania','Australia and New Zealand',14.00,NULL,600,NULL,0.00,NULL,'Cocos (Keeling) Islands','Territory of Australia','Elisabeth II',2317,'CC'); +INSERT INTO `country` VALUES ('CHE','Switzerland','Europe','Western Europe',41284.00,1499,7160400,79.6,264478.00,256092.00,'Schweiz/Suisse/Svizzera/Svizra','Federation','Adolf Ogi',3248,'CH'); +INSERT INTO `country` VALUES ('CHL','Chile','South America','South America',756626.00,1810,15211000,75.7,72949.00,75780.00,'Chile','Republic','Ricardo Lagos Escobar',554,'CL'); +INSERT INTO `country` VALUES ('CHN','China','Asia','Eastern Asia',9572900.00,-1523,1277558000,71.4,982268.00,917719.00,'Zhongquo','People\'sRepublic','Jiang Zemin',1891,'CN'); +INSERT INTO `country` VALUES ('CIV','C�te d�Ivoire','Africa','Western Africa',322463.00,1960,14786000,45.2,11345.00,10285.00,'C�te d�Ivoire','Republic','Laurent Gbagbo',2814,'CI'); +INSERT INTO `country` VALUES ('CMR','Cameroon','Africa','Central Africa',475442.00,1960,15085000,54.8,9174.00,8596.00,'Cameroun/Cameroon','Republic','Paul Biya',1804,'CM'); +INSERT INTO `country` VALUES ('COD','Congo, The Democratic Republic of the','Africa','Central Africa',2344858.00,1960,51654000,48.8,6964.00,2474.00,'R�publique D�mocratique du Congo','Republic','Joseph Kabila',2298,'CD'); +INSERT INTO `country` VALUES ('COG','Congo','Africa','Central Africa',342000.00,1960,2943000,47.4,2108.00,2287.00,'Congo','Republic','Denis Sassou-Nguesso',2296,'CG'); +INSERT INTO `country` VALUES ('COK','Cook Islands','Oceania','Polynesia',236.00,NULL,20000,71.1,100.00,NULL,'The Cook Islands','Nonmetropolitan Territory of New Zealand','Elisabeth II',583,'CK'); +INSERT INTO `country` VALUES ('COL','Colombia','South America','South America',1138914.00,1810,42321000,70.3,102896.00,105116.00,'Colombia','Republic','Andr�s Pastrana Arango',2257,'CO'); +INSERT INTO `country` VALUES ('COM','Comoros','Africa','Eastern Africa',1862.00,1975,578000,60.0,4401.00,4361.00,'Komori/Comores','Republic','Azali Assoumani',2295,'KM'); +INSERT INTO `country` VALUES ('CPV','Cape Verde','Africa','Western Africa',4033.00,1975,428000,68.9,435.00,420.00,'Cabo Verde','Republic','Ant�nio Mascarenhas Monteiro',1859,'CV'); +INSERT INTO `country` VALUES ('CRI','Costa Rica','North America','Central America',51100.00,1821,4023000,75.8,10226.00,9757.00,'Costa Rica','Republic','Miguel �ngel Rodr�guez Echeverr�a',584,'CR'); +INSERT INTO `country` VALUES ('CUB','Cuba','North America','Caribbean',110861.00,1902,11201000,76.2,17843.00,18862.00,'Cuba','Socialistic Republic','Fidel Castro Ruz',2413,'CU'); +INSERT INTO `country` VALUES ('CXR','Christmas Island','Oceania','Australia and New Zealand',135.00,NULL,2500,NULL,0.00,NULL,'Christmas Island','Territory of Australia','Elisabeth II',1791,'CX'); +INSERT INTO `country` VALUES ('CYM','Cayman Islands','North America','Caribbean',264.00,NULL,38000,78.9,1263.00,1186.00,'Cayman Islands','Dependent Territory of the UK','Elisabeth II',553,'KY'); +INSERT INTO `country` VALUES ('CYP','Cyprus','Asia','Middle East',9251.00,1960,754700,76.7,9333.00,8246.00,'K�pros/Kibris','Republic','Glafkos Klerides',2430,'CY'); +INSERT INTO `country` VALUES ('CZE','Czech Republic','Europe','Eastern Europe',78866.00,1993,10278100,74.5,55017.00,52037.00,'�esko','Republic','V�clav Havel',3339,'CZ'); +INSERT INTO `country` VALUES ('DEU','Germany','Europe','Western Europe',357022.00,1955,82164700,77.4,2133367.00,2102826.00,'Deutschland','Federal Republic','Johannes Rau',3068,'DE'); +INSERT INTO `country` VALUES ('DJI','Djibouti','Africa','Eastern Africa',23200.00,1977,638000,50.8,382.00,373.00,'Djibouti/Jibuti','Republic','Ismail Omar Guelleh',585,'DJ'); +INSERT INTO `country` VALUES ('DMA','Dominica','North America','Caribbean',751.00,1978,71000,73.4,256.00,243.00,'Dominica','Republic','Vernon Shaw',586,'DM'); +INSERT INTO `country` VALUES ('DNK','Denmark','Europe','Nordic Countries',43094.00,800,5330000,76.5,174099.00,169264.00,'Danmark','Constitutional Monarchy','Margrethe II',3315,'DK'); +INSERT INTO `country` VALUES ('DOM','Dominican Republic','North America','Caribbean',48511.00,1844,8495000,73.2,15846.00,15076.00,'Rep�blica Dominicana','Republic','Hip�lito Mej�a Dom�nguez',587,'DO'); +INSERT INTO `country` VALUES ('DZA','Algeria','Africa','Northern Africa',2381741.00,1962,31471000,69.7,49982.00,46966.00,'Al-Jaza�ir/Alg�rie','Republic','Abdelaziz Bouteflika',35,'DZ'); +INSERT INTO `country` VALUES ('ECU','Ecuador','South America','South America',283561.00,1822,12646000,71.1,19770.00,19769.00,'Ecuador','Republic','Gustavo Noboa Bejarano',594,'EC'); +INSERT INTO `country` VALUES ('EGY','Egypt','Africa','Northern Africa',1001449.00,1922,68470000,63.3,82710.00,75617.00,'Misr','Republic','Hosni Mubarak',608,'EG'); +INSERT INTO `country` VALUES ('ERI','Eritrea','Africa','Eastern Africa',117600.00,1993,3850000,55.8,650.00,755.00,'Ertra','Republic','Isayas Afewerki [Isaias Afwerki]',652,'ER'); +INSERT INTO `country` VALUES ('ESH','Western Sahara','Africa','Northern Africa',266000.00,NULL,293000,49.8,60.00,NULL,'As-Sahrawiya','Occupied by Marocco','Mohammed Abdel Aziz',2453,'EH'); +INSERT INTO `country` VALUES ('ESP','Spain','Europe','Southern Europe',505992.00,1492,39441700,78.8,553233.00,532031.00,'Espa�a','Constitutional Monarchy','Juan Carlos I',653,'ES'); +INSERT INTO `country` VALUES ('EST','Estonia','Europe','Baltic Countries',45227.00,1991,1439200,69.5,5328.00,3371.00,'Eesti','Republic','Lennart Meri',3791,'EE'); +INSERT INTO `country` VALUES ('ETH','Ethiopia','Africa','Eastern Africa',1104300.00,-1000,62565000,45.2,6353.00,6180.00,'YeItyop�iya','Republic','Negasso Gidada',756,'ET'); +INSERT INTO `country` VALUES ('FIN','Finland','Europe','Nordic Countries',338145.00,1917,5171300,77.4,121914.00,119833.00,'Suomi','Republic','Tarja Halonen',3236,'FI'); +INSERT INTO `country` VALUES ('FJI','Fiji Islands','Oceania','Melanesia',18274.00,1970,817000,67.9,1536.00,2149.00,'Fiji Islands','Republic','Josefa Iloilo',764,'FJ'); +INSERT INTO `country` VALUES ('FLK','Falkland Islands','South America','South America',12173.00,NULL,2000,NULL,0.00,NULL,'Falkland Islands','Dependent Territory of the UK','Elisabeth II',763,'FK'); +INSERT INTO `country` VALUES ('FRA','France','Europe','Western Europe',551500.00,843,59225700,78.8,1424285.00,1392448.00,'France','Republic','Jacques Chirac',2974,'FR'); +INSERT INTO `country` VALUES ('FRO','Faroe Islands','Europe','Nordic Countries',1399.00,NULL,43000,78.4,0.00,NULL,'F�royar','Part of Denmark','Margrethe II',901,'FO'); +INSERT INTO `country` VALUES ('FSM','Micronesia, Federated States of','Oceania','Micronesia',702.00,1990,119000,68.6,212.00,NULL,'Micronesia','Federal Republic','Leo A. Falcam',2689,'FM'); +INSERT INTO `country` VALUES ('GAB','Gabon','Africa','Central Africa',267668.00,1960,1226000,50.1,5493.00,5279.00,'Le Gabon','Republic','Omar Bongo',902,'GA'); +INSERT INTO `country` VALUES ('GBR','United Kingdom','Europe','British Islands',242900.00,1066,59623400,77.7,1378330.00,1296830.00,'United Kingdom','Constitutional Monarchy','Elisabeth II',456,'GB'); +INSERT INTO `country` VALUES ('GEO','Georgia','Asia','Middle East',69700.00,1991,4968000,64.5,6064.00,5924.00,'Sakartvelo','Republic','Eduard �evardnadze',905,'GE'); +INSERT INTO `country` VALUES ('GHA','Ghana','Africa','Western Africa',238533.00,1957,20212000,57.4,7137.00,6884.00,'Ghana','Republic','John Kufuor',910,'GH'); +INSERT INTO `country` VALUES ('GIB','Gibraltar','Europe','Southern Europe',6.00,NULL,25000,79.0,258.00,NULL,'Gibraltar','Dependent Territory of the UK','Elisabeth II',915,'GI'); +INSERT INTO `country` VALUES ('GIN','Guinea','Africa','Western Africa',245857.00,1958,7430000,45.6,2352.00,2383.00,'Guin�e','Republic','Lansana Cont�',926,'GN'); +INSERT INTO `country` VALUES ('GLP','Guadeloupe','North America','Caribbean',1705.00,NULL,456000,77.0,3501.00,NULL,'Guadeloupe','Overseas Department of France','Jacques Chirac',919,'GP'); +INSERT INTO `country` VALUES ('GMB','Gambia','Africa','Western Africa',11295.00,1965,1305000,53.2,320.00,325.00,'The Gambia','Republic','Yahya Jammeh',904,'GM'); +INSERT INTO `country` VALUES ('GNB','Guinea-Bissau','Africa','Western Africa',36125.00,1974,1213000,49.0,293.00,272.00,'Guin�-Bissau','Republic','Kumba Ial�',927,'GW'); +INSERT INTO `country` VALUES ('GNQ','Equatorial Guinea','Africa','Central Africa',28051.00,1968,453000,53.6,283.00,542.00,'Guinea Ecuatorial','Republic','Teodoro Obiang Nguema Mbasogo',2972,'GQ'); +INSERT INTO `country` VALUES ('GRC','Greece','Europe','Southern Europe',131626.00,1830,10545700,78.4,120724.00,119946.00,'Ell�da','Republic','Kostis Stefanopoulos',2401,'GR'); +INSERT INTO `country` VALUES ('GRD','Grenada','North America','Caribbean',344.00,1974,94000,64.5,318.00,NULL,'Grenada','Constitutional Monarchy','Elisabeth II',916,'GD'); +INSERT INTO `country` VALUES ('GRL','Greenland','North America','North America',2166090.00,NULL,56000,68.1,0.00,NULL,'Kalaallit Nunaat/Gr�nland','Part of Denmark','Margrethe II',917,'GL'); +INSERT INTO `country` VALUES ('GTM','Guatemala','North America','Central America',108889.00,1821,11385000,66.2,19008.00,17797.00,'Guatemala','Republic','Alfonso Portillo Cabrera',922,'GT'); +INSERT INTO `country` VALUES ('GUF','French Guiana','South America','South America',90000.00,NULL,181000,76.1,681.00,NULL,'Guyane fran�aise','Overseas Department of France','Jacques Chirac',3014,'GF'); +INSERT INTO `country` VALUES ('GUM','Guam','Oceania','Micronesia',549.00,NULL,168000,77.8,1197.00,1136.00,'Guam','US Territory','George W. Bush',921,'GU'); +INSERT INTO `country` VALUES ('GUY','Guyana','South America','South America',214969.00,1966,861000,64.0,722.00,743.00,'Guyana','Republic','Bharrat Jagdeo',928,'GY'); +INSERT INTO `country` VALUES ('HKG','Hong Kong','Asia','Eastern Asia',1075.00,NULL,6782000,79.5,166448.00,173610.00,'Xianggang/Hong Kong','Special Administrative Region of China','Jiang Zemin',937,'HK'); +INSERT INTO `country` VALUES ('HMD','Heard Island and McDonald Islands','Antarctica','Antarctica',359.00,NULL,0,NULL,0.00,NULL,'Heard and McDonald Islands','Territory of Australia','Elisabeth II',NULL,'HM'); +INSERT INTO `country` VALUES ('HND','Honduras','North America','Central America',112088.00,1838,6485000,69.9,5333.00,4697.00,'Honduras','Republic','Carlos Roberto Flores Facuss�',933,'HN'); +INSERT INTO `country` VALUES ('HRV','Croatia','Europe','Southern Europe',56538.00,1991,4473000,73.7,20208.00,19300.00,'Hrvatska','Republic','�tipe Mesic',2409,'HR'); +INSERT INTO `country` VALUES ('HTI','Haiti','North America','Caribbean',27750.00,1804,8222000,49.2,3459.00,3107.00,'Ha�ti/Dayti','Republic','Jean-Bertrand Aristide',929,'HT'); +INSERT INTO `country` VALUES ('HUN','Hungary','Europe','Eastern Europe',93030.00,1918,10043200,71.4,48267.00,45914.00,'Magyarorsz�g','Republic','Ferenc M�dl',3483,'HU'); +INSERT INTO `country` VALUES ('IDN','Indonesia','Asia','Southeast Asia',1904569.00,1945,212107000,68.0,84982.00,215002.00,'Indonesia','Republic','Abdurrahman Wahid',939,'ID'); +INSERT INTO `country` VALUES ('IND','India','Asia','Southern and Central Asia',3287263.00,1947,1013662000,62.5,447114.00,430572.00,'Bharat/India','Federal Republic','Kocheril Raman Narayanan',1109,'IN'); +INSERT INTO `country` VALUES ('IOT','British Indian Ocean Territory','Africa','Eastern Africa',78.00,NULL,0,NULL,0.00,NULL,'British Indian Ocean Territory','Dependent Territory of the UK','Elisabeth II',NULL,'IO'); +INSERT INTO `country` VALUES ('IRL','Ireland','Europe','British Islands',70273.00,1921,3775100,76.8,75921.00,73132.00,'Ireland/�ire','Republic','Mary McAleese',1447,'IE'); +INSERT INTO `country` VALUES ('IRN','Iran','Asia','Southern and Central Asia',1648195.00,1906,67702000,69.7,195746.00,160151.00,'Iran','Islamic Republic','Ali Mohammad Khatami-Ardakani',1380,'IR'); +INSERT INTO `country` VALUES ('IRQ','Iraq','Asia','Middle East',438317.00,1932,23115000,66.5,11500.00,NULL,'Al-�Iraq','Republic','Saddam Hussein al-Takriti',1365,'IQ'); +INSERT INTO `country` VALUES ('ISL','Iceland','Europe','Nordic Countries',103000.00,1944,279000,79.4,8255.00,7474.00,'�sland','Republic','�lafur Ragnar Gr�msson',1449,'IS'); +INSERT INTO `country` VALUES ('ISR','Israel','Asia','Middle East',21056.00,1948,6217000,78.6,97477.00,98577.00,'Yisra�el/Isra�il','Republic','Moshe Katzav',1450,'IL'); +INSERT INTO `country` VALUES ('ITA','Italy','Europe','Southern Europe',301316.00,1861,57680000,79.0,1161755.00,1145372.00,'Italia','Republic','Carlo Azeglio Ciampi',1464,'IT'); +INSERT INTO `country` VALUES ('JAM','Jamaica','North America','Caribbean',10990.00,1962,2583000,75.2,6871.00,6722.00,'Jamaica','Constitutional Monarchy','Elisabeth II',1530,'JM'); +INSERT INTO `country` VALUES ('JOR','Jordan','Asia','Middle East',88946.00,1946,5083000,77.4,7526.00,7051.00,'Al-Urdunn','Constitutional Monarchy','Abdullah II',1786,'JO'); +INSERT INTO `country` VALUES ('JPN','Japan','Asia','Eastern Asia',377829.00,-660,126714000,80.7,3787042.00,4192638.00,'Nihon/Nippon','Constitutional Monarchy','Akihito',1532,'JP'); +INSERT INTO `country` VALUES ('KAZ','Kazakstan','Asia','Southern and Central Asia',2724900.00,1991,16223000,63.2,24375.00,23383.00,'Qazaqstan','Republic','Nursultan Nazarbajev',1864,'KZ'); +INSERT INTO `country` VALUES ('KEN','Kenya','Africa','Eastern Africa',580367.00,1963,30080000,48.0,9217.00,10241.00,'Kenya','Republic','Daniel arap Moi',1881,'KE'); +INSERT INTO `country` VALUES ('KGZ','Kyrgyzstan','Asia','Southern and Central Asia',199900.00,1991,4699000,63.4,1626.00,1767.00,'Kyrgyzstan','Republic','Askar Akajev',2253,'KG'); +INSERT INTO `country` VALUES ('KHM','Cambodia','Asia','Southeast Asia',181035.00,1953,11168000,56.5,5121.00,5670.00,'K�mpuch�a','Constitutional Monarchy','Norodom Sihanouk',1800,'KH'); +INSERT INTO `country` VALUES ('KIR','Kiribati','Oceania','Micronesia',726.00,1979,83000,59.8,40.70,NULL,'Kiribati','Republic','Teburoro Tito',2256,'KI'); +INSERT INTO `country` VALUES ('KNA','Saint Kitts and Nevis','North America','Caribbean',261.00,1983,38000,70.7,299.00,NULL,'Saint Kitts and Nevis','Constitutional Monarchy','Elisabeth II',3064,'KN'); +INSERT INTO `country` VALUES ('KOR','South Korea','Asia','Eastern Asia',99434.00,1948,46844000,74.4,320749.00,442544.00,'Taehan Min�guk (Namhan)','Republic','Kim Dae-jung',2331,'KR'); +INSERT INTO `country` VALUES ('KWT','Kuwait','Asia','Middle East',17818.00,1961,1972000,76.1,27037.00,30373.00,'Al-Kuwayt','Constitutional Monarchy (Emirate)','Jabir al-Ahmad al-Jabir al-Sabah',2429,'KW'); +INSERT INTO `country` VALUES ('LAO','Laos','Asia','Southeast Asia',236800.00,1953,5433000,53.1,1292.00,1746.00,'Lao','Republic','Khamtay Siphandone',2432,'LA'); +INSERT INTO `country` VALUES ('LBN','Lebanon','Asia','Middle East',10400.00,1941,3282000,71.3,17121.00,15129.00,'Lubnan','Republic','�mile Lahoud',2438,'LB'); +INSERT INTO `country` VALUES ('LBR','Liberia','Africa','Western Africa',111369.00,1847,3154000,51.0,2012.00,NULL,'Liberia','Republic','Charles Taylor',2440,'LR'); +INSERT INTO `country` VALUES ('LBY','Libyan Arab Jamahiriya','Africa','Northern Africa',1759540.00,1951,5605000,75.5,44806.00,40562.00,'Libiya','Socialistic State','Muammar al-Qadhafi',2441,'LY'); +INSERT INTO `country` VALUES ('LCA','Saint Lucia','North America','Caribbean',622.00,1979,154000,72.3,571.00,NULL,'Saint Lucia','Constitutional Monarchy','Elisabeth II',3065,'LC'); +INSERT INTO `country` VALUES ('LIE','Liechtenstein','Europe','Western Europe',160.00,1806,32300,78.8,1119.00,1084.00,'Liechtenstein','Constitutional Monarchy','Hans-Adam II',2446,'LI'); +INSERT INTO `country` VALUES ('LKA','Sri Lanka','Asia','Southern and Central Asia',65610.00,1948,18827000,71.8,15706.00,15091.00,'Sri Lanka/Ilankai','Republic','Chandrika Kumaratunga',3217,'LK'); +INSERT INTO `country` VALUES ('LSO','Lesotho','Africa','Southern Africa',30355.00,1966,2153000,50.8,1061.00,1161.00,'Lesotho','Constitutional Monarchy','Letsie III',2437,'LS'); +INSERT INTO `country` VALUES ('LTU','Lithuania','Europe','Baltic Countries',65301.00,1991,3698500,69.1,10692.00,9585.00,'Lietuva','Republic','Valdas Adamkus',2447,'LT'); +INSERT INTO `country` VALUES ('LUX','Luxembourg','Europe','Western Europe',2586.00,1867,435700,77.1,16321.00,15519.00,'Luxembourg/L�tzebuerg','Constitutional Monarchy','Henri',2452,'LU'); +INSERT INTO `country` VALUES ('LVA','Latvia','Europe','Baltic Countries',64589.00,1991,2424200,68.4,6398.00,5639.00,'Latvija','Republic','Vaira Vike-Freiberga',2434,'LV'); +INSERT INTO `country` VALUES ('MAC','Macao','Asia','Eastern Asia',18.00,NULL,473000,81.6,5749.00,5940.00,'Macau/Aomen','Special Administrative Region of China','Jiang Zemin',2454,'MO'); +INSERT INTO `country` VALUES ('MAR','Morocco','Africa','Northern Africa',446550.00,1956,28351000,69.1,36124.00,33514.00,'Al-Maghrib','Constitutional Monarchy','Mohammed VI',2486,'MA'); +INSERT INTO `country` VALUES ('MCO','Monaco','Europe','Western Europe',1.50,1861,34000,78.8,776.00,NULL,'Monaco','Constitutional Monarchy','Rainier III',2695,'MC'); +INSERT INTO `country` VALUES ('MDA','Moldova','Europe','Eastern Europe',33851.00,1991,4380000,64.5,1579.00,1872.00,'Moldova','Republic','Vladimir Voronin',2690,'MD'); +INSERT INTO `country` VALUES ('MDG','Madagascar','Africa','Eastern Africa',587041.00,1960,15942000,55.0,3750.00,3545.00,'Madagasikara/Madagascar','Federal Republic','Didier Ratsiraka',2455,'MG'); +INSERT INTO `country` VALUES ('MDV','Maldives','Asia','Southern and Central Asia',298.00,1965,286000,62.2,199.00,NULL,'Dhivehi Raajje/Maldives','Republic','Maumoon Abdul Gayoom',2463,'MV'); +INSERT INTO `country` VALUES ('MEX','Mexico','North America','Central America',1958201.00,1810,98881000,71.5,414972.00,401461.00,'M�xico','Federal Republic','Vicente Fox Quesada',2515,'MX'); +INSERT INTO `country` VALUES ('MHL','Marshall Islands','Oceania','Micronesia',181.00,1990,64000,65.5,97.00,NULL,'Marshall Islands/Majol','Republic','Kessai Note',2507,'MH'); +INSERT INTO `country` VALUES ('MKD','Macedonia','Europe','Southern Europe',25713.00,1991,2024000,73.8,1694.00,1915.00,'Makedonija','Republic','Boris Trajkovski',2460,'MK'); +INSERT INTO `country` VALUES ('MLI','Mali','Africa','Western Africa',1240192.00,1960,11234000,46.7,2642.00,2453.00,'Mali','Republic','Alpha Oumar Konar�',2482,'ML'); +INSERT INTO `country` VALUES ('MLT','Malta','Europe','Southern Europe',316.00,1964,380200,77.9,3512.00,3338.00,'Malta','Republic','Guido de Marco',2484,'MT'); +INSERT INTO `country` VALUES ('MMR','Myanmar','Asia','Southeast Asia',676578.00,1948,45611000,54.9,180375.00,171028.00,'Myanma Pye','Republic','kenraali Than Shwe',2710,'MM'); +INSERT INTO `country` VALUES ('MNG','Mongolia','Asia','Eastern Asia',1566500.00,1921,2662000,67.3,1043.00,933.00,'Mongol Uls','Republic','Natsagiin Bagabandi',2696,'MN'); +INSERT INTO `country` VALUES ('MNP','Northern Mariana Islands','Oceania','Micronesia',464.00,NULL,78000,75.5,0.00,NULL,'Northern Mariana Islands','Commonwealth of the US','George W. Bush',2913,'MP'); +INSERT INTO `country` VALUES ('MOZ','Mozambique','Africa','Eastern Africa',801590.00,1975,19680000,37.5,2891.00,2711.00,'Mo�ambique','Republic','Joaqu�m A. Chissano',2698,'MZ'); +INSERT INTO `country` VALUES ('MRT','Mauritania','Africa','Western Africa',1025520.00,1960,2670000,50.8,998.00,1081.00,'Muritaniya/Mauritanie','Republic','Maaouiya Ould Sid�Ahmad Taya',2509,'MR'); +INSERT INTO `country` VALUES ('MSR','Montserrat','North America','Caribbean',102.00,NULL,11000,78.0,109.00,NULL,'Montserrat','Dependent Territory of the UK','Elisabeth II',2697,'MS'); +INSERT INTO `country` VALUES ('MTQ','Martinique','North America','Caribbean',1102.00,NULL,395000,78.3,2731.00,2559.00,'Martinique','Overseas Department of France','Jacques Chirac',2508,'MQ'); +INSERT INTO `country` VALUES ('MUS','Mauritius','Africa','Eastern Africa',2040.00,1968,1158000,71.0,4251.00,4186.00,'Mauritius','Republic','Cassam Uteem',2511,'MU'); +INSERT INTO `country` VALUES ('MWI','Malawi','Africa','Eastern Africa',118484.00,1964,10925000,37.6,1687.00,2527.00,'Malawi','Republic','Bakili Muluzi',2462,'MW'); +INSERT INTO `country` VALUES ('MYS','Malaysia','Asia','Southeast Asia',329758.00,1957,22244000,70.8,69213.00,97884.00,'Malaysia','Constitutional Monarchy, Federation','Salahuddin Abdul Aziz Shah Alhaj',2464,'MY'); +INSERT INTO `country` VALUES ('MYT','Mayotte','Africa','Eastern Africa',373.00,NULL,149000,59.5,0.00,NULL,'Mayotte','Territorial Collectivity of France','Jacques Chirac',2514,'YT'); +INSERT INTO `country` VALUES ('NAM','Namibia','Africa','Southern Africa',824292.00,1990,1726000,42.5,3101.00,3384.00,'Namibia','Republic','Sam Nujoma',2726,'NA'); +INSERT INTO `country` VALUES ('NCL','New Caledonia','Oceania','Melanesia',18575.00,NULL,214000,72.8,3563.00,NULL,'Nouvelle-Cal�donie','Nonmetropolitan Territory of France','Jacques Chirac',3493,'NC'); +INSERT INTO `country` VALUES ('NER','Niger','Africa','Western Africa',1267000.00,1960,10730000,41.3,1706.00,1580.00,'Niger','Republic','Mamadou Tandja',2738,'NE'); +INSERT INTO `country` VALUES ('NFK','Norfolk Island','Oceania','Australia and New Zealand',36.00,NULL,2000,NULL,0.00,NULL,'Norfolk Island','Territory of Australia','Elisabeth II',2806,'NF'); +INSERT INTO `country` VALUES ('NGA','Nigeria','Africa','Western Africa',923768.00,1960,111506000,51.6,65707.00,58623.00,'Nigeria','Federal Republic','Olusegun Obasanjo',2754,'NG'); +INSERT INTO `country` VALUES ('NIC','Nicaragua','North America','Central America',130000.00,1838,5074000,68.7,1988.00,2023.00,'Nicaragua','Republic','Arnoldo Alem�n Lacayo',2734,'NI'); +INSERT INTO `country` VALUES ('NIU','Niue','Oceania','Polynesia',260.00,NULL,2000,NULL,0.00,NULL,'Niue','Nonmetropolitan Territory of New Zealand','Elisabeth II',2805,'NU'); +INSERT INTO `country` VALUES ('NLD','Netherlands','Europe','Western Europe',41526.00,1581,15864000,78.3,371362.00,360478.00,'Nederland','Constitutional Monarchy','Beatrix',5,'NL'); +INSERT INTO `country` VALUES ('NOR','Norway','Europe','Nordic Countries',323877.00,1905,4478500,78.7,145895.00,153370.00,'Norge','Constitutional Monarchy','Harald V',2807,'NO'); +INSERT INTO `country` VALUES ('NPL','Nepal','Asia','Southern and Central Asia',147181.00,1769,23930000,57.8,4768.00,4837.00,'Nepal','Constitutional Monarchy','Gyanendra Bir Bikram',2729,'NP'); +INSERT INTO `country` VALUES ('NRU','Nauru','Oceania','Micronesia',21.00,1968,12000,60.8,197.00,NULL,'Naoero/Nauru','Republic','Bernard Dowiyogo',2728,'NR'); +INSERT INTO `country` VALUES ('NZL','New Zealand','Oceania','Australia and New Zealand',270534.00,1907,3862000,77.8,54669.00,64960.00,'New Zealand/Aotearoa','Constitutional Monarchy','Elisabeth II',3499,'NZ'); +INSERT INTO `country` VALUES ('OMN','Oman','Asia','Middle East',309500.00,1951,2542000,71.8,16904.00,16153.00,'�Uman','Monarchy (Sultanate)','Qabus ibn Sa�id',2821,'OM'); +INSERT INTO `country` VALUES ('PAK','Pakistan','Asia','Southern and Central Asia',796095.00,1947,156483000,61.1,61289.00,58549.00,'Pakistan','Republic','Mohammad Rafiq Tarar',2831,'PK'); +INSERT INTO `country` VALUES ('PAN','Panama','North America','Central America',75517.00,1903,2856000,75.5,9131.00,8700.00,'Panam�','Republic','Mireya Elisa Moscoso Rodr�guez',2882,'PA'); +INSERT INTO `country` VALUES ('PCN','Pitcairn','Oceania','Polynesia',49.00,NULL,50,NULL,0.00,NULL,'Pitcairn','Dependent Territory of the UK','Elisabeth II',2912,'PN'); +INSERT INTO `country` VALUES ('PER','Peru','South America','South America',1285216.00,1821,25662000,70.0,64140.00,65186.00,'Per�/Piruw','Republic','Valentin Paniagua Corazao',2890,'PE'); +INSERT INTO `country` VALUES ('PHL','Philippines','Asia','Southeast Asia',300000.00,1946,75967000,67.5,65107.00,82239.00,'Pilipinas','Republic','Gloria Macapagal-Arroyo',766,'PH'); +INSERT INTO `country` VALUES ('PLW','Palau','Oceania','Micronesia',459.00,1994,19000,68.6,105.00,NULL,'Belau/Palau','Republic','Kuniwo Nakamura',2881,'PW'); +INSERT INTO `country` VALUES ('PNG','Papua New Guinea','Oceania','Melanesia',462840.00,1975,4807000,63.1,4988.00,6328.00,'Papua New Guinea/Papua Niugini','Constitutional Monarchy','Elisabeth II',2884,'PG'); +INSERT INTO `country` VALUES ('POL','Poland','Europe','Eastern Europe',323250.00,1918,38653600,73.2,151697.00,135636.00,'Polska','Republic','Aleksander Kwasniewski',2928,'PL'); +INSERT INTO `country` VALUES ('PRI','Puerto Rico','North America','Caribbean',8875.00,NULL,3869000,75.6,34100.00,32100.00,'Puerto Rico','Commonwealth of the US','George W. Bush',2919,'PR'); +INSERT INTO `country` VALUES ('PRK','North Korea','Asia','Eastern Asia',120538.00,1948,24039000,70.7,5332.00,NULL,'Choson Minjujuui In�min Konghwaguk (Bukhan)','Socialistic Republic','Kim Jong-il',2318,'KP'); +INSERT INTO `country` VALUES ('PRT','Portugal','Europe','Southern Europe',91982.00,1143,9997600,75.8,105954.00,102133.00,'Portugal','Republic','Jorge Samp�io',2914,'PT'); +INSERT INTO `country` VALUES ('PRY','Paraguay','South America','South America',406752.00,1811,5496000,73.7,8444.00,9555.00,'Paraguay','Republic','Luis �ngel Gonz�lez Macchi',2885,'PY'); +INSERT INTO `country` VALUES ('PSE','Palestine','Asia','Middle East',6257.00,NULL,3101000,71.4,4173.00,NULL,'Filastin','Autonomous Area','Yasser (Yasir) Arafat',4074,'PS'); +INSERT INTO `country` VALUES ('PYF','French Polynesia','Oceania','Polynesia',4000.00,NULL,235000,74.8,818.00,781.00,'Polyn�sie fran�aise','Nonmetropolitan Territory of France','Jacques Chirac',3016,'PF'); +INSERT INTO `country` VALUES ('QAT','Qatar','Asia','Middle East',11000.00,1971,599000,72.4,9472.00,8920.00,'Qatar','Monarchy','Hamad ibn Khalifa al-Thani',2973,'QA'); +INSERT INTO `country` VALUES ('REU','R�union','Africa','Eastern Africa',2510.00,NULL,699000,72.7,8287.00,7988.00,'R�union','Overseas Department of France','Jacques Chirac',3017,'RE'); +INSERT INTO `country` VALUES ('ROM','Romania','Europe','Eastern Europe',238391.00,1878,22455500,69.9,38158.00,34843.00,'Rom�nia','Republic','Ion Iliescu',3018,'RO'); +INSERT INTO `country` VALUES ('RUS','Russian Federation','Europe','Eastern Europe',17075400.00,1991,146934000,67.2,276608.00,442989.00,'Rossija','Federal Republic','Vladimir Putin',3580,'RU'); +INSERT INTO `country` VALUES ('RWA','Rwanda','Africa','Eastern Africa',26338.00,1962,7733000,39.3,2036.00,1863.00,'Rwanda/Urwanda','Republic','Paul Kagame',3047,'RW'); +INSERT INTO `country` VALUES ('SAU','Saudi Arabia','Asia','Middle East',2149690.00,1932,21607000,67.8,137635.00,146171.00,'Al-�Arabiya as-Sa�udiya','Monarchy','Fahd ibn Abdul-Aziz al-Sa�ud',3173,'SA'); +INSERT INTO `country` VALUES ('SDN','Sudan','Africa','Northern Africa',2505813.00,1956,29490000,56.6,10162.00,NULL,'As-Sudan','Islamic Republic','Omar Hassan Ahmad al-Bashir',3225,'SD'); +INSERT INTO `country` VALUES ('SEN','Senegal','Africa','Western Africa',196722.00,1960,9481000,62.2,4787.00,4542.00,'S�n�gal/Sounougal','Republic','Abdoulaye Wade',3198,'SN'); +INSERT INTO `country` VALUES ('SGP','Singapore','Asia','Southeast Asia',618.00,1965,3567000,80.1,86503.00,96318.00,'Singapore/Singapura/Xinjiapo/Singapur','Republic','Sellapan Rama Nathan',3208,'SG'); +INSERT INTO `country` VALUES ('SGS','South Georgia and the South Sandwich Islands','Antarctica','Antarctica',3903.00,NULL,0,NULL,0.00,NULL,'South Georgia and the South Sandwich Islands','Dependent Territory of the UK','Elisabeth II',NULL,'GS'); +INSERT INTO `country` VALUES ('SHN','Saint Helena','Africa','Western Africa',314.00,NULL,6000,76.8,0.00,NULL,'Saint Helena','Dependent Territory of the UK','Elisabeth II',3063,'SH'); +INSERT INTO `country` VALUES ('SJM','Svalbard and Jan Mayen','Europe','Nordic Countries',62422.00,NULL,3200,NULL,0.00,NULL,'Svalbard og Jan Mayen','Dependent Territory of Norway','Harald V',938,'SJ'); +INSERT INTO `country` VALUES ('SLB','Solomon Islands','Oceania','Melanesia',28896.00,1978,444000,71.3,182.00,220.00,'Solomon Islands','Constitutional Monarchy','Elisabeth II',3161,'SB'); +INSERT INTO `country` VALUES ('SLE','Sierra Leone','Africa','Western Africa',71740.00,1961,4854000,45.3,746.00,858.00,'Sierra Leone','Republic','Ahmed Tejan Kabbah',3207,'SL'); +INSERT INTO `country` VALUES ('SLV','El Salvador','North America','Central America',21041.00,1841,6276000,69.7,11863.00,11203.00,'El Salvador','Republic','Francisco Guillermo Flores P�rez',645,'SV'); +INSERT INTO `country` VALUES ('SMR','San Marino','Europe','Southern Europe',61.00,885,27000,81.1,510.00,NULL,'San Marino','Republic',NULL,3171,'SM'); +INSERT INTO `country` VALUES ('SOM','Somalia','Africa','Eastern Africa',637657.00,1960,10097000,46.2,935.00,NULL,'Soomaaliya','Republic','Abdiqassim Salad Hassan',3214,'SO'); +INSERT INTO `country` VALUES ('SPM','Saint Pierre and Miquelon','North America','North America',242.00,NULL,7000,77.6,0.00,NULL,'Saint-Pierre-et-Miquelon','Territorial Collectivity of France','Jacques Chirac',3067,'PM'); +INSERT INTO `country` VALUES ('STP','Sao Tome and Principe','Africa','Central Africa',964.00,1975,147000,65.3,6.00,NULL,'S�o Tom� e Pr�ncipe','Republic','Miguel Trovoada',3172,'ST'); +INSERT INTO `country` VALUES ('SUR','Suriname','South America','South America',163265.00,1975,417000,71.4,870.00,706.00,'Suriname','Republic','Ronald Venetiaan',3243,'SR'); +INSERT INTO `country` VALUES ('SVK','Slovakia','Europe','Eastern Europe',49012.00,1993,5398700,73.7,20594.00,19452.00,'Slovensko','Republic','Rudolf Schuster',3209,'SK'); +INSERT INTO `country` VALUES ('SVN','Slovenia','Europe','Southern Europe',20256.00,1991,1987800,74.9,19756.00,18202.00,'Slovenija','Republic','Milan Kucan',3212,'SI'); +INSERT INTO `country` VALUES ('SWE','Sweden','Europe','Nordic Countries',449964.00,836,8861400,79.6,226492.00,227757.00,'Sverige','Constitutional Monarchy','Carl XVI Gustaf',3048,'SE'); +INSERT INTO `country` VALUES ('SWZ','Swaziland','Africa','Southern Africa',17364.00,1968,1008000,40.4,1206.00,1312.00,'kaNgwane','Monarchy','Mswati III',3244,'SZ'); +INSERT INTO `country` VALUES ('SYC','Seychelles','Africa','Eastern Africa',455.00,1976,77000,70.4,536.00,539.00,'Sesel/Seychelles','Republic','France-Albert Ren�',3206,'SC'); +INSERT INTO `country` VALUES ('SYR','Syria','Asia','Middle East',185180.00,1941,16125000,68.5,65984.00,64926.00,'Suriya','Republic','Bashar al-Assad',3250,'SY'); +INSERT INTO `country` VALUES ('TCA','Turks and Caicos Islands','North America','Caribbean',430.00,NULL,17000,73.3,96.00,NULL,'The Turks and Caicos Islands','Dependent Territory of the UK','Elisabeth II',3423,'TC'); +INSERT INTO `country` VALUES ('TCD','Chad','Africa','Central Africa',1284000.00,1960,7651000,50.5,1208.00,1102.00,'Tchad/Tshad','Republic','Idriss D�by',3337,'TD'); +INSERT INTO `country` VALUES ('TGO','Togo','Africa','Western Africa',56785.00,1960,4629000,54.7,1449.00,1400.00,'Togo','Republic','Gnassingb� Eyad�ma',3332,'TG'); +INSERT INTO `country` VALUES ('THA','Thailand','Asia','Southeast Asia',513115.00,1350,61399000,68.6,116416.00,153907.00,'Prathet Thai','Constitutional Monarchy','Bhumibol Adulyadej',3320,'TH'); +INSERT INTO `country` VALUES ('TJK','Tajikistan','Asia','Southern and Central Asia',143100.00,1991,6188000,64.1,1990.00,1056.00,'To�ikiston','Republic','Emomali Rahmonov',3261,'TJ'); +INSERT INTO `country` VALUES ('TKL','Tokelau','Oceania','Polynesia',12.00,NULL,2000,NULL,0.00,NULL,'Tokelau','Nonmetropolitan Territory of New Zealand','Elisabeth II',3333,'TK'); +INSERT INTO `country` VALUES ('TKM','Turkmenistan','Asia','Southern and Central Asia',488100.00,1991,4459000,60.9,4397.00,2000.00,'T�rkmenostan','Republic','Saparmurad Nijazov',3419,'TM'); +INSERT INTO `country` VALUES ('TMP','East Timor','Asia','Southeast Asia',14874.00,NULL,885000,46.0,0.00,NULL,'Timor Timur','Administrated by the UN','Jos� Alexandre Gusm�o',1522,'TP'); +INSERT INTO `country` VALUES ('TON','Tonga','Oceania','Polynesia',650.00,1970,99000,67.9,146.00,170.00,'Tonga','Monarchy','Taufa\'ahau Tupou IV',3334,'TO'); +INSERT INTO `country` VALUES ('TTO','Trinidad and Tobago','North America','Caribbean',5130.00,1962,1295000,68.0,6232.00,5867.00,'Trinidad and Tobago','Republic','Arthur N. R. Robinson',3336,'TT'); +INSERT INTO `country` VALUES ('TUN','Tunisia','Africa','Northern Africa',163610.00,1956,9586000,73.7,20026.00,18898.00,'Tunis/Tunisie','Republic','Zine al-Abidine Ben Ali',3349,'TN'); +INSERT INTO `country` VALUES ('TUR','Turkey','Asia','Middle East',774815.00,1923,66591000,71.0,210721.00,189122.00,'T�rkiye','Republic','Ahmet Necdet Sezer',3358,'TR'); +INSERT INTO `country` VALUES ('TUV','Tuvalu','Oceania','Polynesia',26.00,1978,12000,66.3,6.00,NULL,'Tuvalu','Constitutional Monarchy','Elisabeth II',3424,'TV'); +INSERT INTO `country` VALUES ('TWN','Taiwan','Asia','Eastern Asia',36188.00,1945,22256000,76.4,256254.00,263451.00,'T�ai-wan','Republic','Chen Shui-bian',3263,'TW'); +INSERT INTO `country` VALUES ('TZA','Tanzania','Africa','Eastern Africa',883749.00,1961,33517000,52.3,8005.00,7388.00,'Tanzania','Republic','Benjamin William Mkapa',3306,'TZ'); +INSERT INTO `country` VALUES ('UGA','Uganda','Africa','Eastern Africa',241038.00,1962,21778000,42.9,6313.00,6887.00,'Uganda','Republic','Yoweri Museveni',3425,'UG'); +INSERT INTO `country` VALUES ('UKR','Ukraine','Europe','Eastern Europe',603700.00,1991,50456000,66.0,42168.00,49677.00,'Ukrajina','Republic','Leonid Kut�ma',3426,'UA'); +INSERT INTO `country` VALUES ('UMI','United States Minor Outlying Islands','Oceania','Micronesia/Caribbean',16.00,NULL,0,NULL,0.00,NULL,'United States Minor Outlying Islands','Dependent Territory of the US','George W. Bush',NULL,'UM'); +INSERT INTO `country` VALUES ('URY','Uruguay','South America','South America',175016.00,1828,3337000,75.2,20831.00,19967.00,'Uruguay','Republic','Jorge Batlle Ib��ez',3492,'UY'); +INSERT INTO `country` VALUES ('USA','United States','North America','North America',9363520.00,1776,278357000,77.1,8510700.00,8110900.00,'United States','Federal Republic','George W. Bush',3813,'US'); +INSERT INTO `country` VALUES ('UZB','Uzbekistan','Asia','Southern and Central Asia',447400.00,1991,24318000,63.7,14194.00,21300.00,'Uzbekiston','Republic','Islam Karimov',3503,'UZ'); +INSERT INTO `country` VALUES ('VAT','Holy See (Vatican City State)','Europe','Southern Europe',0.40,1929,1000,NULL,9.00,NULL,'Santa Sede/Citt� del Vaticano','Independent Church State','Johannes Paavali II',3538,'VA'); +INSERT INTO `country` VALUES ('VCT','Saint Vincent and the Grenadines','North America','Caribbean',388.00,1979,114000,72.3,285.00,NULL,'Saint Vincent and the Grenadines','Constitutional Monarchy','Elisabeth II',3066,'VC'); +INSERT INTO `country` VALUES ('VEN','Venezuela','South America','South America',912050.00,1811,24170000,73.1,95023.00,88434.00,'Venezuela','Federal Republic','Hugo Ch�vez Fr�as',3539,'VE'); +INSERT INTO `country` VALUES ('VGB','Virgin Islands, British','North America','Caribbean',151.00,NULL,21000,75.4,612.00,573.00,'British Virgin Islands','Dependent Territory of the UK','Elisabeth II',537,'VG'); +INSERT INTO `country` VALUES ('VIR','Virgin Islands, U.S.','North America','Caribbean',347.00,NULL,93000,78.1,0.00,NULL,'Virgin Islands of the United States','US Territory','George W. Bush',4067,'VI'); +INSERT INTO `country` VALUES ('VNM','Vietnam','Asia','Southeast Asia',331689.00,1945,79832000,69.3,21929.00,22834.00,'Vi�t Nam','Socialistic Republic','Tr�n Duc Luong',3770,'VN'); +INSERT INTO `country` VALUES ('VUT','Vanuatu','Oceania','Melanesia',12189.00,1980,190000,60.6,261.00,246.00,'Vanuatu','Republic','John Bani',3537,'VU'); +INSERT INTO `country` VALUES ('WLF','Wallis and Futuna','Oceania','Polynesia',200.00,NULL,15000,NULL,0.00,NULL,'Wallis-et-Futuna','Nonmetropolitan Territory of France','Jacques Chirac',3536,'WF'); +INSERT INTO `country` VALUES ('WSM','Samoa','Oceania','Polynesia',2831.00,1962,180000,69.2,141.00,157.00,'Samoa','Parlementary Monarchy','Malietoa Tanumafili II',3169,'WS'); +INSERT INTO `country` VALUES ('YEM','Yemen','Asia','Middle East',527968.00,1918,18112000,59.8,6041.00,5729.00,'Al-Yaman','Republic','Ali Abdallah Salih',1780,'YE'); +INSERT INTO `country` VALUES ('YUG','Yugoslavia','Europe','Southern Europe',102173.00,1918,10640000,72.4,17000.00,NULL,'Jugoslavija','Federal Republic','Vojislav Ko�tunica',1792,'YU'); +INSERT INTO `country` VALUES ('ZAF','South Africa','Africa','Southern Africa',1221037.00,1910,40377000,51.1,116729.00,129092.00,'South Africa','Republic','Thabo Mbeki',716,'ZA'); +INSERT INTO `country` VALUES ('ZMB','Zambia','Africa','Eastern Africa',752618.00,1964,9169000,37.2,3377.00,3922.00,'Zambia','Republic','Frederick Chiluba',3162,'ZM'); +INSERT INTO `country` VALUES ('ZWE','Zimbabwe','Africa','Eastern Africa',390757.00,1980,11669000,37.8,5951.00,8670.00,'Zimbabwe','Republic','Robert G. Mugabe',4068,'ZW'); +COMMIT; +-- +-- Table structure for table `countrylanguage` +-- + +DROP TABLE IF EXISTS `countrylanguage`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `countrylanguage` ( + `CountryCode` CHAR(3) NOT NULL DEFAULT '', + `Language` CHAR(30) NOT NULL DEFAULT '', + `IsOfficial` enum('T','F') NOT NULL DEFAULT 'F', + `Percentage` FLOAT(4,1) NOT NULL DEFAULT '0.0', + PRIMARY KEY (`CountryCode`,`Language`), + KEY `CountryCode` (`CountryCode`), + CONSTRAINT `countryLanguage_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`) +) ENGINE=InnoDB DEFAULT CHARSET=latin1; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Dumping data for table `countrylanguage` +-- +-- ORDER BY: `CountryCode`,`Language` + +INSERT INTO `countrylanguage` VALUES ('ABW','Dutch','T',5.3); +INSERT INTO `countrylanguage` VALUES ('ABW','English','F',9.5); +INSERT INTO `countrylanguage` VALUES ('ABW','Papiamento','F',76.7); +INSERT INTO `countrylanguage` VALUES ('ABW','Spanish','F',7.4); +INSERT INTO `countrylanguage` VALUES ('AFG','Balochi','F',0.9); +INSERT INTO `countrylanguage` VALUES ('AFG','Dari','T',32.1); +INSERT INTO `countrylanguage` VALUES ('AFG','Pashto','T',52.4); +INSERT INTO `countrylanguage` VALUES ('AFG','Turkmenian','F',1.9); +INSERT INTO `countrylanguage` VALUES ('AFG','Uzbek','F',8.8); +INSERT INTO `countrylanguage` VALUES ('AGO','Ambo','F',2.4); +INSERT INTO `countrylanguage` VALUES ('AGO','Chokwe','F',4.2); +INSERT INTO `countrylanguage` VALUES ('AGO','Kongo','F',13.2); +INSERT INTO `countrylanguage` VALUES ('AGO','Luchazi','F',2.4); +INSERT INTO `countrylanguage` VALUES ('AGO','Luimbe-nganguela','F',5.4); +INSERT INTO `countrylanguage` VALUES ('AGO','Luvale','F',3.6); +INSERT INTO `countrylanguage` VALUES ('AGO','Mbundu','F',21.6); +INSERT INTO `countrylanguage` VALUES ('AGO','Nyaneka-nkhumbi','F',5.4); +INSERT INTO `countrylanguage` VALUES ('AGO','Ovimbundu','F',37.2); +INSERT INTO `countrylanguage` VALUES ('AIA','English','T',0.0); +INSERT INTO `countrylanguage` VALUES ('ALB','Albaniana','T',97.9); +INSERT INTO `countrylanguage` VALUES ('ALB','Greek','F',1.8); +INSERT INTO `countrylanguage` VALUES ('ALB','Macedonian','F',0.1); +INSERT INTO `countrylanguage` VALUES ('AND','Catalan','T',32.3); +INSERT INTO `countrylanguage` VALUES ('AND','French','F',6.2); +INSERT INTO `countrylanguage` VALUES ('AND','Portuguese','F',10.8); +INSERT INTO `countrylanguage` VALUES ('AND','Spanish','F',44.6); +INSERT INTO `countrylanguage` VALUES ('ANT','Dutch','T',0.0); +INSERT INTO `countrylanguage` VALUES ('ANT','English','F',7.8); +INSERT INTO `countrylanguage` VALUES ('ANT','Papiamento','T',86.2); +INSERT INTO `countrylanguage` VALUES ('ARE','Arabic','T',42.0); +INSERT INTO `countrylanguage` VALUES ('ARE','Hindi','F',0.0); +INSERT INTO `countrylanguage` VALUES ('ARG','Indian Languages','F',0.3); +INSERT INTO `countrylanguage` VALUES ('ARG','Italian','F',1.7); +INSERT INTO `countrylanguage` VALUES ('ARG','Spanish','T',96.8); +INSERT INTO `countrylanguage` VALUES ('ARM','Armenian','T',93.4); +INSERT INTO `countrylanguage` VALUES ('ARM','Azerbaijani','F',2.6); +INSERT INTO `countrylanguage` VALUES ('ASM','English','T',3.1); +INSERT INTO `countrylanguage` VALUES ('ASM','Samoan','T',90.6); +INSERT INTO `countrylanguage` VALUES ('ASM','Tongan','F',3.1); +INSERT INTO `countrylanguage` VALUES ('ATG','Creole English','F',95.7); +INSERT INTO `countrylanguage` VALUES ('ATG','English','T',0.0); +INSERT INTO `countrylanguage` VALUES ('AUS','Arabic','F',1.0); +INSERT INTO `countrylanguage` VALUES ('AUS','Canton Chinese','F',1.1); +INSERT INTO `countrylanguage` VALUES ('AUS','English','T',81.2); +INSERT INTO `countrylanguage` VALUES ('AUS','German','F',0.6); +INSERT INTO `countrylanguage` VALUES ('AUS','Greek','F',1.6); +INSERT INTO `countrylanguage` VALUES ('AUS','Italian','F',2.2); +INSERT INTO `countrylanguage` VALUES ('AUS','Serbo-Croatian','F',0.6); +INSERT INTO `countrylanguage` VALUES ('AUS','Vietnamese','F',0.8); +INSERT INTO `countrylanguage` VALUES ('AUT','Czech','F',0.2); +INSERT INTO `countrylanguage` VALUES ('AUT','German','T',92.0); +INSERT INTO `countrylanguage` VALUES ('AUT','Hungarian','F',0.4); +INSERT INTO `countrylanguage` VALUES ('AUT','Polish','F',0.2); +INSERT INTO `countrylanguage` VALUES ('AUT','Romanian','F',0.2); +INSERT INTO `countrylanguage` VALUES ('AUT','Serbo-Croatian','F',2.2); +INSERT INTO `countrylanguage` VALUES ('AUT','Slovene','F',0.4); +INSERT INTO `countrylanguage` VALUES ('AUT','Turkish','F',1.5); +INSERT INTO `countrylanguage` VALUES ('AZE','Armenian','F',2.0); +INSERT INTO `countrylanguage` VALUES ('AZE','Azerbaijani','T',89.0); +INSERT INTO `countrylanguage` VALUES ('AZE','Lezgian','F',2.3); +INSERT INTO `countrylanguage` VALUES ('AZE','Russian','F',3.0); +INSERT INTO `countrylanguage` VALUES ('BDI','French','T',0.0); +INSERT INTO `countrylanguage` VALUES ('BDI','Kirundi','T',98.1); +INSERT INTO `countrylanguage` VALUES ('BDI','Swahili','F',0.0); +INSERT INTO `countrylanguage` VALUES ('BEL','Arabic','F',1.6); +INSERT INTO `countrylanguage` VALUES ('BEL','Dutch','T',59.2); +INSERT INTO `countrylanguage` VALUES ('BEL','French','T',32.6); +INSERT INTO `countrylanguage` VALUES ('BEL','German','T',1.0); +INSERT INTO `countrylanguage` VALUES ('BEL','Italian','F',2.4); +INSERT INTO `countrylanguage` VALUES ('BEL','Turkish','F',0.9); +INSERT INTO `countrylanguage` VALUES ('BEN','Adja','F',11.1); +INSERT INTO `countrylanguage` VALUES ('BEN','Aizo','F',8.7); +INSERT INTO `countrylanguage` VALUES ('BEN','Bariba','F',8.7); +INSERT INTO `countrylanguage` VALUES ('BEN','Fon','F',39.8); +INSERT INTO `countrylanguage` VALUES ('BEN','Ful','F',5.6); +INSERT INTO `countrylanguage` VALUES ('BEN','Joruba','F',12.2); +INSERT INTO `countrylanguage` VALUES ('BEN','Somba','F',6.7); +INSERT INTO `countrylanguage` VALUES ('BFA','Busansi','F',3.5); +INSERT INTO `countrylanguage` VALUES ('BFA','Dagara','F',3.1); +INSERT INTO `countrylanguage` VALUES ('BFA','Dyula','F',2.6); +INSERT INTO `countrylanguage` VALUES ('BFA','Ful','F',9.7); +INSERT INTO `countrylanguage` VALUES ('BFA','Gurma','F',5.7); +INSERT INTO `countrylanguage` VALUES ('BFA','Mossi','F',50.2); +INSERT INTO `countrylanguage` VALUES ('BGD','Bengali','T',97.7); +INSERT INTO `countrylanguage` VALUES ('BGD','Chakma','F',0.4); +INSERT INTO `countrylanguage` VALUES ('BGD','Garo','F',0.1); +INSERT INTO `countrylanguage` VALUES ('BGD','Khasi','F',0.1); +INSERT INTO `countrylanguage` VALUES ('BGD','Marma','F',0.2); +INSERT INTO `countrylanguage` VALUES ('BGD','Santhali','F',0.1); +INSERT INTO `countrylanguage` VALUES ('BGD','Tripuri','F',0.1); +INSERT INTO `countrylanguage` VALUES ('BGR','Bulgariana','T',83.2); +INSERT INTO `countrylanguage` VALUES ('BGR','Macedonian','F',2.6); +INSERT INTO `countrylanguage` VALUES ('BGR','Romani','F',3.7); +INSERT INTO `countrylanguage` VALUES ('BGR','Turkish','F',9.4); +INSERT INTO `countrylanguage` VALUES ('BHR','Arabic','T',67.7); +INSERT INTO `countrylanguage` VALUES ('BHR','English','F',0.0); +INSERT INTO `countrylanguage` VALUES ('BHS','Creole English','F',89.7); +INSERT INTO `countrylanguage` VALUES ('BHS','Creole French','F',10.3); +INSERT INTO `countrylanguage` VALUES ('BIH','Serbo-Croatian','T',99.2); +INSERT INTO `countrylanguage` VALUES ('BLR','Belorussian','T',65.6); +INSERT INTO `countrylanguage` VALUES ('BLR','Polish','F',0.6); +INSERT INTO `countrylanguage` VALUES ('BLR','Russian','T',32.0); +INSERT INTO `countrylanguage` VALUES ('BLR','Ukrainian','F',1.3); +INSERT INTO `countrylanguage` VALUES ('BLZ','English','T',50.8); +INSERT INTO `countrylanguage` VALUES ('BLZ','Garifuna','F',6.8); +INSERT INTO `countrylanguage` VALUES ('BLZ','Maya Languages','F',9.6); +INSERT INTO `countrylanguage` VALUES ('BLZ','Spanish','F',31.6); +INSERT INTO `countrylanguage` VALUES ('BMU','English','T',100.0); +INSERT INTO `countrylanguage` VALUES ('BOL','Aimar�','T',3.2); +INSERT INTO `countrylanguage` VALUES ('BOL','Guaran�','F',0.1); +INSERT INTO `countrylanguage` VALUES ('BOL','Ket�ua','T',8.1); +INSERT INTO `countrylanguage` VALUES ('BOL','Spanish','T',87.7); +INSERT INTO `countrylanguage` VALUES ('BRA','German','F',0.5); +INSERT INTO `countrylanguage` VALUES ('BRA','Indian Languages','F',0.2); +INSERT INTO `countrylanguage` VALUES ('BRA','Italian','F',0.4); +INSERT INTO `countrylanguage` VALUES ('BRA','Japanese','F',0.4); +INSERT INTO `countrylanguage` VALUES ('BRA','Portuguese','T',97.5); +INSERT INTO `countrylanguage` VALUES ('BRB','Bajan','F',95.1); +INSERT INTO `countrylanguage` VALUES ('BRB','English','T',0.0); +INSERT INTO `countrylanguage` VALUES ('BRN','Chinese','F',9.3); +INSERT INTO `countrylanguage` VALUES ('BRN','English','F',3.1); +INSERT INTO `countrylanguage` VALUES ('BRN','Malay','T',45.5); +INSERT INTO `countrylanguage` VALUES ('BRN','Malay-English','F',28.8); +INSERT INTO `countrylanguage` VALUES ('BTN','Asami','F',15.2); +INSERT INTO `countrylanguage` VALUES ('BTN','Dzongkha','T',50.0); +INSERT INTO `countrylanguage` VALUES ('BTN','Nepali','F',34.8); +INSERT INTO `countrylanguage` VALUES ('BWA','Khoekhoe','F',2.5); +INSERT INTO `countrylanguage` VALUES ('BWA','Ndebele','F',1.3); +INSERT INTO `countrylanguage` VALUES ('BWA','San','F',3.5); +INSERT INTO `countrylanguage` VALUES ('BWA','Shona','F',12.3); +INSERT INTO `countrylanguage` VALUES ('BWA','Tswana','F',75.5); +INSERT INTO `countrylanguage` VALUES ('CAF','Banda','F',23.5); +INSERT INTO `countrylanguage` VALUES ('CAF','Gbaya','F',23.8); +INSERT INTO `countrylanguage` VALUES ('CAF','Mandjia','F',14.8); +INSERT INTO `countrylanguage` VALUES ('CAF','Mbum','F',6.4); +INSERT INTO `countrylanguage` VALUES ('CAF','Ngbaka','F',7.5); +INSERT INTO `countrylanguage` VALUES ('CAF','Sara','F',6.4); +INSERT INTO `countrylanguage` VALUES ('CAN','Chinese','F',2.5); +INSERT INTO `countrylanguage` VALUES ('CAN','Dutch','F',0.5); +INSERT INTO `countrylanguage` VALUES ('CAN','English','T',60.4); +INSERT INTO `countrylanguage` VALUES ('CAN','Eskimo Languages','F',0.1); +INSERT INTO `countrylanguage` VALUES ('CAN','French','T',23.4); +INSERT INTO `countrylanguage` VALUES ('CAN','German','F',1.6); +INSERT INTO `countrylanguage` VALUES ('CAN','Italian','F',1.7); +INSERT INTO `countrylanguage` VALUES ('CAN','Polish','F',0.7); +INSERT INTO `countrylanguage` VALUES ('CAN','Portuguese','F',0.7); +INSERT INTO `countrylanguage` VALUES ('CAN','Punjabi','F',0.7); +INSERT INTO `countrylanguage` VALUES ('CAN','Spanish','F',0.7); +INSERT INTO `countrylanguage` VALUES ('CAN','Ukrainian','F',0.6); +INSERT INTO `countrylanguage` VALUES ('CCK','English','T',0.0); +INSERT INTO `countrylanguage` VALUES ('CCK','Malay','F',0.0); +INSERT INTO `countrylanguage` VALUES ('CHE','French','T',19.2); +INSERT INTO `countrylanguage` VALUES ('CHE','German','T',63.6); +INSERT INTO `countrylanguage` VALUES ('CHE','Italian','T',7.7); +INSERT INTO `countrylanguage` VALUES ('CHE','Romansh','T',0.6); +INSERT INTO `countrylanguage` VALUES ('CHL','Aimar�','F',0.5); +INSERT INTO `countrylanguage` VALUES ('CHL','Araucan','F',9.6); +INSERT INTO `countrylanguage` VALUES ('CHL','Rapa nui','F',0.2); +INSERT INTO `countrylanguage` VALUES ('CHL','Spanish','T',89.7); +INSERT INTO `countrylanguage` VALUES ('CHN','Chinese','T',92.0); +INSERT INTO `countrylanguage` VALUES ('CHN','Dong','F',0.2); +INSERT INTO `countrylanguage` VALUES ('CHN','Hui','F',0.8); +INSERT INTO `countrylanguage` VALUES ('CHN','Mant�u','F',0.9); +INSERT INTO `countrylanguage` VALUES ('CHN','Miao','F',0.7); +INSERT INTO `countrylanguage` VALUES ('CHN','Mongolian','F',0.4); +INSERT INTO `countrylanguage` VALUES ('CHN','Puyi','F',0.2); +INSERT INTO `countrylanguage` VALUES ('CHN','Tibetan','F',0.4); +INSERT INTO `countrylanguage` VALUES ('CHN','Tujia','F',0.5); +INSERT INTO `countrylanguage` VALUES ('CHN','Uighur','F',0.6); +INSERT INTO `countrylanguage` VALUES ('CHN','Yi','F',0.6); +INSERT INTO `countrylanguage` VALUES ('CHN','Zhuang','F',1.4); +INSERT INTO `countrylanguage` VALUES ('CIV','Akan','F',30.0); +INSERT INTO `countrylanguage` VALUES ('CIV','Gur','F',11.7); +INSERT INTO `countrylanguage` VALUES ('CIV','Kru','F',10.5); +INSERT INTO `countrylanguage` VALUES ('CIV','Malinke','F',11.4); +INSERT INTO `countrylanguage` VALUES ('CIV','[South]Mande','F',7.7); +INSERT INTO `countrylanguage` VALUES ('CMR','Bamileke-bamum','F',18.6); +INSERT INTO `countrylanguage` VALUES ('CMR','Duala','F',10.9); +INSERT INTO `countrylanguage` VALUES ('CMR','Fang','F',19.7); +INSERT INTO `countrylanguage` VALUES ('CMR','Ful','F',9.6); +INSERT INTO `countrylanguage` VALUES ('CMR','Maka','F',4.9); +INSERT INTO `countrylanguage` VALUES ('CMR','Mandara','F',5.7); +INSERT INTO `countrylanguage` VALUES ('CMR','Masana','F',3.9); +INSERT INTO `countrylanguage` VALUES ('CMR','Tikar','F',7.4); +INSERT INTO `countrylanguage` VALUES ('COD','Boa','F',2.3); +INSERT INTO `countrylanguage` VALUES ('COD','Chokwe','F',1.8); +INSERT INTO `countrylanguage` VALUES ('COD','Kongo','F',16.0); +INSERT INTO `countrylanguage` VALUES ('COD','Luba','F',18.0); +INSERT INTO `countrylanguage` VALUES ('COD','Mongo','F',13.5); +INSERT INTO `countrylanguage` VALUES ('COD','Ngala and Bangi','F',5.8); +INSERT INTO `countrylanguage` VALUES ('COD','Rundi','F',3.8); +INSERT INTO `countrylanguage` VALUES ('COD','Rwanda','F',10.3); +INSERT INTO `countrylanguage` VALUES ('COD','Teke','F',2.7); +INSERT INTO `countrylanguage` VALUES ('COD','Zande','F',6.1); +INSERT INTO `countrylanguage` VALUES ('COG','Kongo','F',51.5); +INSERT INTO `countrylanguage` VALUES ('COG','Mbete','F',4.8); +INSERT INTO `countrylanguage` VALUES ('COG','Mboshi','F',11.4); +INSERT INTO `countrylanguage` VALUES ('COG','Punu','F',2.9); +INSERT INTO `countrylanguage` VALUES ('COG','Sango','F',2.6); +INSERT INTO `countrylanguage` VALUES ('COG','Teke','F',17.3); +INSERT INTO `countrylanguage` VALUES ('COK','English','F',0.0); +INSERT INTO `countrylanguage` VALUES ('COK','Maori','T',0.0); +INSERT INTO `countrylanguage` VALUES ('COL','Arawakan','F',0.1); +INSERT INTO `countrylanguage` VALUES ('COL','Caribbean','F',0.1); +INSERT INTO `countrylanguage` VALUES ('COL','Chibcha','F',0.4); +INSERT INTO `countrylanguage` VALUES ('COL','Creole English','F',0.1); +INSERT INTO `countrylanguage` VALUES ('COL','Spanish','T',99.0); +INSERT INTO `countrylanguage` VALUES ('COM','Comorian','T',75.0); +INSERT INTO `countrylanguage` VALUES ('COM','Comorian-Arabic','F',1.6); +INSERT INTO `countrylanguage` VALUES ('COM','Comorian-French','F',12.9); +INSERT INTO `countrylanguage` VALUES ('COM','Comorian-madagassi','F',5.5); +INSERT INTO `countrylanguage` VALUES ('COM','Comorian-Swahili','F',0.5); +INSERT INTO `countrylanguage` VALUES ('CPV','Crioulo','F',100.0); +INSERT INTO `countrylanguage` VALUES ('CPV','Portuguese','T',0.0); +INSERT INTO `countrylanguage` VALUES ('CRI','Chibcha','F',0.3); +INSERT INTO `countrylanguage` VALUES ('CRI','Chinese','F',0.2); +INSERT INTO `countrylanguage` VALUES ('CRI','Creole English','F',2.0); +INSERT INTO `countrylanguage` VALUES ('CRI','Spanish','T',97.5); +INSERT INTO `countrylanguage` VALUES ('CUB','Spanish','T',100.0); +INSERT INTO `countrylanguage` VALUES ('CXR','Chinese','F',0.0); +INSERT INTO `countrylanguage` VALUES ('CXR','English','T',0.0); +INSERT INTO `countrylanguage` VALUES ('CYM','English','T',0.0); +INSERT INTO `countrylanguage` VALUES ('CYP','Greek','T',74.1); +INSERT INTO `countrylanguage` VALUES ('CYP','Turkish','T',22.4); +INSERT INTO `countrylanguage` VALUES ('CZE','Czech','T',81.2); +INSERT INTO `countrylanguage` VALUES ('CZE','German','F',0.5); +INSERT INTO `countrylanguage` VALUES ('CZE','Hungarian','F',0.2); +INSERT INTO `countrylanguage` VALUES ('CZE','Moravian','F',12.9); +INSERT INTO `countrylanguage` VALUES ('CZE','Polish','F',0.6); +INSERT INTO `countrylanguage` VALUES ('CZE','Romani','F',0.3); +INSERT INTO `countrylanguage` VALUES ('CZE','Silesiana','F',0.4); +INSERT INTO `countrylanguage` VALUES ('CZE','Slovak','F',3.1); +INSERT INTO `countrylanguage` VALUES ('DEU','German','T',91.3); +INSERT INTO `countrylanguage` VALUES ('DEU','Greek','F',0.4); +INSERT INTO `countrylanguage` VALUES ('DEU','Italian','F',0.7); +INSERT INTO `countrylanguage` VALUES ('DEU','Polish','F',0.3); +INSERT INTO `countrylanguage` VALUES ('DEU','Southern Slavic Languages','F',1.4); +INSERT INTO `countrylanguage` VALUES ('DEU','Turkish','F',2.6); +INSERT INTO `countrylanguage` VALUES ('DJI','Afar','F',34.8); +INSERT INTO `countrylanguage` VALUES ('DJI','Arabic','T',10.6); +INSERT INTO `countrylanguage` VALUES ('DJI','Somali','F',43.9); +INSERT INTO `countrylanguage` VALUES ('DMA','Creole English','F',100.0); +INSERT INTO `countrylanguage` VALUES ('DMA','Creole French','F',0.0); +INSERT INTO `countrylanguage` VALUES ('DNK','Arabic','F',0.7); +INSERT INTO `countrylanguage` VALUES ('DNK','Danish','T',93.5); +INSERT INTO `countrylanguage` VALUES ('DNK','English','F',0.3); +INSERT INTO `countrylanguage` VALUES ('DNK','German','F',0.5); +INSERT INTO `countrylanguage` VALUES ('DNK','Norwegian','F',0.3); +INSERT INTO `countrylanguage` VALUES ('DNK','Swedish','F',0.3); +INSERT INTO `countrylanguage` VALUES ('DNK','Turkish','F',0.8); +INSERT INTO `countrylanguage` VALUES ('DOM','Creole French','F',2.0); +INSERT INTO `countrylanguage` VALUES ('DOM','Spanish','T',98.0); +INSERT INTO `countrylanguage` VALUES ('DZA','Arabic','T',86.0); +INSERT INTO `countrylanguage` VALUES ('DZA','Berberi','F',14.0); +INSERT INTO `countrylanguage` VALUES ('ECU','Ket�ua','F',7.0); +INSERT INTO `countrylanguage` VALUES ('ECU','Spanish','T',93.0); +INSERT INTO `countrylanguage` VALUES ('EGY','Arabic','T',98.8); +INSERT INTO `countrylanguage` VALUES ('EGY','Sinaberberi','F',0.0); +INSERT INTO `countrylanguage` VALUES ('ERI','Afar','F',4.3); +INSERT INTO `countrylanguage` VALUES ('ERI','Bilin','F',3.0); +INSERT INTO `countrylanguage` VALUES ('ERI','Hadareb','F',3.8); +INSERT INTO `countrylanguage` VALUES ('ERI','Saho','F',3.0); +INSERT INTO `countrylanguage` VALUES ('ERI','Tigre','F',31.7); +INSERT INTO `countrylanguage` VALUES ('ERI','Tigrinja','T',49.1); +INSERT INTO `countrylanguage` VALUES ('ESH','Arabic','T',100.0); +INSERT INTO `countrylanguage` VALUES ('ESP','Basque','F',1.6); +INSERT INTO `countrylanguage` VALUES ('ESP','Catalan','F',16.9); +INSERT INTO `countrylanguage` VALUES ('ESP','Galecian','F',6.4); +INSERT INTO `countrylanguage` VALUES ('ESP','Spanish','T',74.4); +INSERT INTO `countrylanguage` VALUES ('EST','Belorussian','F',1.4); +INSERT INTO `countrylanguage` VALUES ('EST','Estonian','T',65.3); +INSERT INTO `countrylanguage` VALUES ('EST','Finnish','F',0.7); +INSERT INTO `countrylanguage` VALUES ('EST','Russian','F',27.8); +INSERT INTO `countrylanguage` VALUES ('EST','Ukrainian','F',2.8); +INSERT INTO `countrylanguage` VALUES ('ETH','Amhara','F',30.0); +INSERT INTO `countrylanguage` VALUES ('ETH','Gurage','F',4.7); +INSERT INTO `countrylanguage` VALUES ('ETH','Oromo','F',31.0); +INSERT INTO `countrylanguage` VALUES ('ETH','Sidamo','F',3.2); +INSERT INTO `countrylanguage` VALUES ('ETH','Somali','F',4.1); +INSERT INTO `countrylanguage` VALUES ('ETH','Tigrinja','F',7.2); +INSERT INTO `countrylanguage` VALUES ('ETH','Walaita','F',2.8); +INSERT INTO `countrylanguage` VALUES ('FIN','Estonian','F',0.2); +INSERT INTO `countrylanguage` VALUES ('FIN','Finnish','T',92.7); +INSERT INTO `countrylanguage` VALUES ('FIN','Russian','F',0.4); +INSERT INTO `countrylanguage` VALUES ('FIN','Saame','F',0.0); +INSERT INTO `countrylanguage` VALUES ('FIN','Swedish','T',5.7); +INSERT INTO `countrylanguage` VALUES ('FJI','Fijian','T',50.8); +INSERT INTO `countrylanguage` VALUES ('FJI','Hindi','F',43.7); +INSERT INTO `countrylanguage` VALUES ('FLK','English','T',0.0); +INSERT INTO `countrylanguage` VALUES ('FRA','Arabic','F',2.5); +INSERT INTO `countrylanguage` VALUES ('FRA','French','T',93.6); +INSERT INTO `countrylanguage` VALUES ('FRA','Italian','F',0.4); +INSERT INTO `countrylanguage` VALUES ('FRA','Portuguese','F',1.2); +INSERT INTO `countrylanguage` VALUES ('FRA','Spanish','F',0.4); +INSERT INTO `countrylanguage` VALUES ('FRA','Turkish','F',0.4); +INSERT INTO `countrylanguage` VALUES ('FRO','Danish','T',0.0); +INSERT INTO `countrylanguage` VALUES ('FRO','Faroese','T',100.0); +INSERT INTO `countrylanguage` VALUES ('FSM','Kosrean','F',7.3); +INSERT INTO `countrylanguage` VALUES ('FSM','Mortlock','F',7.6); +INSERT INTO `countrylanguage` VALUES ('FSM','Pohnpei','F',23.8); +INSERT INTO `countrylanguage` VALUES ('FSM','Trukese','F',41.6); +INSERT INTO `countrylanguage` VALUES ('FSM','Wolea','F',3.7); +INSERT INTO `countrylanguage` VALUES ('FSM','Yap','F',5.8); +INSERT INTO `countrylanguage` VALUES ('GAB','Fang','F',35.8); +INSERT INTO `countrylanguage` VALUES ('GAB','Mbete','F',13.8); +INSERT INTO `countrylanguage` VALUES ('GAB','Mpongwe','F',14.6); +INSERT INTO `countrylanguage` VALUES ('GAB','Punu-sira-nzebi','F',17.1); +INSERT INTO `countrylanguage` VALUES ('GBR','English','T',97.3); +INSERT INTO `countrylanguage` VALUES ('GBR','Gaeli','F',0.1); +INSERT INTO `countrylanguage` VALUES ('GBR','Kymri','F',0.9); +INSERT INTO `countrylanguage` VALUES ('GEO','Abhyasi','F',1.7); +INSERT INTO `countrylanguage` VALUES ('GEO','Armenian','F',6.8); +INSERT INTO `countrylanguage` VALUES ('GEO','Azerbaijani','F',5.5); +INSERT INTO `countrylanguage` VALUES ('GEO','Georgiana','T',71.7); +INSERT INTO `countrylanguage` VALUES ('GEO','Osseetti','F',2.4); +INSERT INTO `countrylanguage` VALUES ('GEO','Russian','F',8.8); +INSERT INTO `countrylanguage` VALUES ('GHA','Akan','F',52.4); +INSERT INTO `countrylanguage` VALUES ('GHA','Ewe','F',11.9); +INSERT INTO `countrylanguage` VALUES ('GHA','Ga-adangme','F',7.8); +INSERT INTO `countrylanguage` VALUES ('GHA','Gurma','F',3.3); +INSERT INTO `countrylanguage` VALUES ('GHA','Joruba','F',1.3); +INSERT INTO `countrylanguage` VALUES ('GHA','Mossi','F',15.8); +INSERT INTO `countrylanguage` VALUES ('GIB','Arabic','F',7.4); +INSERT INTO `countrylanguage` VALUES ('GIB','English','T',88.9); +INSERT INTO `countrylanguage` VALUES ('GIN','Ful','F',38.6); +INSERT INTO `countrylanguage` VALUES ('GIN','Kissi','F',6.0); +INSERT INTO `countrylanguage` VALUES ('GIN','Kpelle','F',4.6); +INSERT INTO `countrylanguage` VALUES ('GIN','Loma','F',2.3); +INSERT INTO `countrylanguage` VALUES ('GIN','Malinke','F',23.2); +INSERT INTO `countrylanguage` VALUES ('GIN','Susu','F',11.0); +INSERT INTO `countrylanguage` VALUES ('GIN','Yalunka','F',2.9); +INSERT INTO `countrylanguage` VALUES ('GLP','Creole French','F',95.0); +INSERT INTO `countrylanguage` VALUES ('GLP','French','T',0.0); +INSERT INTO `countrylanguage` VALUES ('GMB','Diola','F',9.2); +INSERT INTO `countrylanguage` VALUES ('GMB','Ful','F',16.2); +INSERT INTO `countrylanguage` VALUES ('GMB','Malinke','F',34.1); +INSERT INTO `countrylanguage` VALUES ('GMB','Soninke','F',7.6); +INSERT INTO `countrylanguage` VALUES ('GMB','Wolof','F',12.6); +INSERT INTO `countrylanguage` VALUES ('GNB','Balante','F',14.6); +INSERT INTO `countrylanguage` VALUES ('GNB','Crioulo','F',36.4); +INSERT INTO `countrylanguage` VALUES ('GNB','Ful','F',16.6); +INSERT INTO `countrylanguage` VALUES ('GNB','Malinke','F',6.9); +INSERT INTO `countrylanguage` VALUES ('GNB','Mandyako','F',4.9); +INSERT INTO `countrylanguage` VALUES ('GNB','Portuguese','T',8.1); +INSERT INTO `countrylanguage` VALUES ('GNQ','Bubi','F',8.7); +INSERT INTO `countrylanguage` VALUES ('GNQ','Fang','F',84.8); +INSERT INTO `countrylanguage` VALUES ('GRC','Greek','T',98.5); +INSERT INTO `countrylanguage` VALUES ('GRC','Turkish','F',0.9); +INSERT INTO `countrylanguage` VALUES ('GRD','Creole English','F',100.0); +INSERT INTO `countrylanguage` VALUES ('GRL','Danish','T',12.5); +INSERT INTO `countrylanguage` VALUES ('GRL','Greenlandic','T',87.5); +INSERT INTO `countrylanguage` VALUES ('GTM','Cakchiquel','F',8.9); +INSERT INTO `countrylanguage` VALUES ('GTM','Kekch�','F',4.9); +INSERT INTO `countrylanguage` VALUES ('GTM','Mam','F',2.7); +INSERT INTO `countrylanguage` VALUES ('GTM','Quich�','F',10.1); +INSERT INTO `countrylanguage` VALUES ('GTM','Spanish','T',64.7); +INSERT INTO `countrylanguage` VALUES ('GUF','Creole French','F',94.3); +INSERT INTO `countrylanguage` VALUES ('GUF','Indian Languages','F',1.9); +INSERT INTO `countrylanguage` VALUES ('GUM','Chamorro','T',29.6); +INSERT INTO `countrylanguage` VALUES ('GUM','English','T',37.5); +INSERT INTO `countrylanguage` VALUES ('GUM','Japanese','F',2.0); +INSERT INTO `countrylanguage` VALUES ('GUM','Korean','F',3.3); +INSERT INTO `countrylanguage` VALUES ('GUM','Philippene Languages','F',19.7); +INSERT INTO `countrylanguage` VALUES ('GUY','Arawakan','F',1.4); +INSERT INTO `countrylanguage` VALUES ('GUY','Caribbean','F',2.2); +INSERT INTO `countrylanguage` VALUES ('GUY','Creole English','F',96.4); +INSERT INTO `countrylanguage` VALUES ('HKG','Canton Chinese','F',88.7); +INSERT INTO `countrylanguage` VALUES ('HKG','Chiu chau','F',1.4); +INSERT INTO `countrylanguage` VALUES ('HKG','English','T',2.2); +INSERT INTO `countrylanguage` VALUES ('HKG','Fukien','F',1.9); +INSERT INTO `countrylanguage` VALUES ('HKG','Hakka','F',1.6); +INSERT INTO `countrylanguage` VALUES ('HND','Creole English','F',0.2); +INSERT INTO `countrylanguage` VALUES ('HND','Garifuna','F',1.3); +INSERT INTO `countrylanguage` VALUES ('HND','Miskito','F',0.2); +INSERT INTO `countrylanguage` VALUES ('HND','Spanish','T',97.2); +INSERT INTO `countrylanguage` VALUES ('HRV','Serbo-Croatian','T',95.9); +INSERT INTO `countrylanguage` VALUES ('HRV','Slovene','F',0.0); +INSERT INTO `countrylanguage` VALUES ('HTI','French','T',0.0); +INSERT INTO `countrylanguage` VALUES ('HTI','Haiti Creole','F',100.0); +INSERT INTO `countrylanguage` VALUES ('HUN','German','F',0.4); +INSERT INTO `countrylanguage` VALUES ('HUN','Hungarian','T',98.5); +INSERT INTO `countrylanguage` VALUES ('HUN','Romani','F',0.5); +INSERT INTO `countrylanguage` VALUES ('HUN','Romanian','F',0.1); +INSERT INTO `countrylanguage` VALUES ('HUN','Serbo-Croatian','F',0.2); +INSERT INTO `countrylanguage` VALUES ('HUN','Slovak','F',0.1); +INSERT INTO `countrylanguage` VALUES ('IDN','Bali','F',1.7); +INSERT INTO `countrylanguage` VALUES ('IDN','Banja','F',1.8); +INSERT INTO `countrylanguage` VALUES ('IDN','Batakki','F',2.2); +INSERT INTO `countrylanguage` VALUES ('IDN','Bugi','F',2.2); +INSERT INTO `countrylanguage` VALUES ('IDN','Javanese','F',39.4); +INSERT INTO `countrylanguage` VALUES ('IDN','Madura','F',4.3); +INSERT INTO `countrylanguage` VALUES ('IDN','Malay','T',12.1); +INSERT INTO `countrylanguage` VALUES ('IDN','Minangkabau','F',2.4); +INSERT INTO `countrylanguage` VALUES ('IDN','Sunda','F',15.8); +INSERT INTO `countrylanguage` VALUES ('IND','Asami','F',1.5); +INSERT INTO `countrylanguage` VALUES ('IND','Bengali','F',8.2); +INSERT INTO `countrylanguage` VALUES ('IND','Gujarati','F',4.8); +INSERT INTO `countrylanguage` VALUES ('IND','Hindi','T',39.9); +INSERT INTO `countrylanguage` VALUES ('IND','Kannada','F',3.9); +INSERT INTO `countrylanguage` VALUES ('IND','Malajalam','F',3.6); +INSERT INTO `countrylanguage` VALUES ('IND','Marathi','F',7.4); +INSERT INTO `countrylanguage` VALUES ('IND','Orija','F',3.3); +INSERT INTO `countrylanguage` VALUES ('IND','Punjabi','F',2.8); +INSERT INTO `countrylanguage` VALUES ('IND','Tamil','F',6.3); +INSERT INTO `countrylanguage` VALUES ('IND','Telugu','F',7.8); +INSERT INTO `countrylanguage` VALUES ('IND','Urdu','F',5.1); +INSERT INTO `countrylanguage` VALUES ('IRL','English','T',98.4); +INSERT INTO `countrylanguage` VALUES ('IRL','Irish','T',1.6); +INSERT INTO `countrylanguage` VALUES ('IRN','Arabic','F',2.2); +INSERT INTO `countrylanguage` VALUES ('IRN','Azerbaijani','F',16.8); +INSERT INTO `countrylanguage` VALUES ('IRN','Bakhtyari','F',1.7); +INSERT INTO `countrylanguage` VALUES ('IRN','Balochi','F',2.3); +INSERT INTO `countrylanguage` VALUES ('IRN','Gilaki','F',5.3); +INSERT INTO `countrylanguage` VALUES ('IRN','Kurdish','F',9.1); +INSERT INTO `countrylanguage` VALUES ('IRN','Luri','F',4.3); +INSERT INTO `countrylanguage` VALUES ('IRN','Mazandarani','F',3.6); +INSERT INTO `countrylanguage` VALUES ('IRN','Persian','T',45.7); +INSERT INTO `countrylanguage` VALUES ('IRN','Turkmenian','F',1.6); +INSERT INTO `countrylanguage` VALUES ('IRQ','Arabic','T',77.2); +INSERT INTO `countrylanguage` VALUES ('IRQ','Assyrian','F',0.8); +INSERT INTO `countrylanguage` VALUES ('IRQ','Azerbaijani','F',1.7); +INSERT INTO `countrylanguage` VALUES ('IRQ','Kurdish','F',19.0); +INSERT INTO `countrylanguage` VALUES ('IRQ','Persian','F',0.8); +INSERT INTO `countrylanguage` VALUES ('ISL','English','F',0.0); +INSERT INTO `countrylanguage` VALUES ('ISL','Icelandic','T',95.7); +INSERT INTO `countrylanguage` VALUES ('ISR','Arabic','T',18.0); +INSERT INTO `countrylanguage` VALUES ('ISR','Hebrew','T',63.1); +INSERT INTO `countrylanguage` VALUES ('ISR','Russian','F',8.9); +INSERT INTO `countrylanguage` VALUES ('ITA','Albaniana','F',0.2); +INSERT INTO `countrylanguage` VALUES ('ITA','French','F',0.5); +INSERT INTO `countrylanguage` VALUES ('ITA','Friuli','F',1.2); +INSERT INTO `countrylanguage` VALUES ('ITA','German','F',0.5); +INSERT INTO `countrylanguage` VALUES ('ITA','Italian','T',94.1); +INSERT INTO `countrylanguage` VALUES ('ITA','Romani','F',0.2); +INSERT INTO `countrylanguage` VALUES ('ITA','Sardinian','F',2.7); +INSERT INTO `countrylanguage` VALUES ('ITA','Slovene','F',0.2); +INSERT INTO `countrylanguage` VALUES ('JAM','Creole English','F',94.2); +INSERT INTO `countrylanguage` VALUES ('JAM','Hindi','F',1.9); +INSERT INTO `countrylanguage` VALUES ('JOR','Arabic','T',97.9); +INSERT INTO `countrylanguage` VALUES ('JOR','Armenian','F',1.0); +INSERT INTO `countrylanguage` VALUES ('JOR','Circassian','F',1.0); +INSERT INTO `countrylanguage` VALUES ('JPN','Ainu','F',0.0); +INSERT INTO `countrylanguage` VALUES ('JPN','Chinese','F',0.2); +INSERT INTO `countrylanguage` VALUES ('JPN','English','F',0.1); +INSERT INTO `countrylanguage` VALUES ('JPN','Japanese','T',99.1); +INSERT INTO `countrylanguage` VALUES ('JPN','Korean','F',0.5); +INSERT INTO `countrylanguage` VALUES ('JPN','Philippene Languages','F',0.1); +INSERT INTO `countrylanguage` VALUES ('KAZ','German','F',3.1); +INSERT INTO `countrylanguage` VALUES ('KAZ','Kazakh','T',46.0); +INSERT INTO `countrylanguage` VALUES ('KAZ','Russian','F',34.7); +INSERT INTO `countrylanguage` VALUES ('KAZ','Tatar','F',2.0); +INSERT INTO `countrylanguage` VALUES ('KAZ','Ukrainian','F',5.0); +INSERT INTO `countrylanguage` VALUES ('KAZ','Uzbek','F',2.3); +INSERT INTO `countrylanguage` VALUES ('KEN','Gusii','F',6.1); +INSERT INTO `countrylanguage` VALUES ('KEN','Kalenjin','F',10.8); +INSERT INTO `countrylanguage` VALUES ('KEN','Kamba','F',11.2); +INSERT INTO `countrylanguage` VALUES ('KEN','Kikuyu','F',20.9); +INSERT INTO `countrylanguage` VALUES ('KEN','Luhya','F',13.8); +INSERT INTO `countrylanguage` VALUES ('KEN','Luo','F',12.8); +INSERT INTO `countrylanguage` VALUES ('KEN','Masai','F',1.6); +INSERT INTO `countrylanguage` VALUES ('KEN','Meru','F',5.5); +INSERT INTO `countrylanguage` VALUES ('KEN','Nyika','F',4.8); +INSERT INTO `countrylanguage` VALUES ('KEN','Turkana','F',1.4); +INSERT INTO `countrylanguage` VALUES ('KGZ','Kazakh','F',0.8); +INSERT INTO `countrylanguage` VALUES ('KGZ','Kirgiz','T',59.7); +INSERT INTO `countrylanguage` VALUES ('KGZ','Russian','T',16.2); +INSERT INTO `countrylanguage` VALUES ('KGZ','Tadzhik','F',0.8); +INSERT INTO `countrylanguage` VALUES ('KGZ','Tatar','F',1.3); +INSERT INTO `countrylanguage` VALUES ('KGZ','Ukrainian','F',1.7); +INSERT INTO `countrylanguage` VALUES ('KGZ','Uzbek','F',14.1); +INSERT INTO `countrylanguage` VALUES ('KHM','Chinese','F',3.1); +INSERT INTO `countrylanguage` VALUES ('KHM','Khmer','T',88.6); +INSERT INTO `countrylanguage` VALUES ('KHM','T�am','F',2.4); +INSERT INTO `countrylanguage` VALUES ('KHM','Vietnamese','F',5.5); +INSERT INTO `countrylanguage` VALUES ('KIR','Kiribati','T',98.9); +INSERT INTO `countrylanguage` VALUES ('KIR','Tuvalu','F',0.5); +INSERT INTO `countrylanguage` VALUES ('KNA','Creole English','F',100.0); +INSERT INTO `countrylanguage` VALUES ('KNA','English','T',0.0); +INSERT INTO `countrylanguage` VALUES ('KOR','Chinese','F',0.1); +INSERT INTO `countrylanguage` VALUES ('KOR','Korean','T',99.9); +INSERT INTO `countrylanguage` VALUES ('KWT','Arabic','T',78.1); +INSERT INTO `countrylanguage` VALUES ('KWT','English','F',0.0); +INSERT INTO `countrylanguage` VALUES ('LAO','Lao','T',67.2); +INSERT INTO `countrylanguage` VALUES ('LAO','Lao-Soung','F',5.2); +INSERT INTO `countrylanguage` VALUES ('LAO','Mon-khmer','F',16.5); +INSERT INTO `countrylanguage` VALUES ('LAO','Thai','F',7.8); +INSERT INTO `countrylanguage` VALUES ('LBN','Arabic','T',93.0); +INSERT INTO `countrylanguage` VALUES ('LBN','Armenian','F',5.9); +INSERT INTO `countrylanguage` VALUES ('LBN','French','F',0.0); +INSERT INTO `countrylanguage` VALUES ('LBR','Bassa','F',13.7); +INSERT INTO `countrylanguage` VALUES ('LBR','Gio','F',7.9); +INSERT INTO `countrylanguage` VALUES ('LBR','Grebo','F',8.9); +INSERT INTO `countrylanguage` VALUES ('LBR','Kpelle','F',19.5); +INSERT INTO `countrylanguage` VALUES ('LBR','Kru','F',7.2); +INSERT INTO `countrylanguage` VALUES ('LBR','Loma','F',5.8); +INSERT INTO `countrylanguage` VALUES ('LBR','Malinke','F',5.1); +INSERT INTO `countrylanguage` VALUES ('LBR','Mano','F',7.2); +INSERT INTO `countrylanguage` VALUES ('LBY','Arabic','T',96.0); +INSERT INTO `countrylanguage` VALUES ('LBY','Berberi','F',1.0); +INSERT INTO `countrylanguage` VALUES ('LCA','Creole French','F',80.0); +INSERT INTO `countrylanguage` VALUES ('LCA','English','T',20.0); +INSERT INTO `countrylanguage` VALUES ('LIE','German','T',89.0); +INSERT INTO `countrylanguage` VALUES ('LIE','Italian','F',2.5); +INSERT INTO `countrylanguage` VALUES ('LIE','Turkish','F',2.5); +INSERT INTO `countrylanguage` VALUES ('LKA','Mixed Languages','F',19.6); +INSERT INTO `countrylanguage` VALUES ('LKA','Singali','T',60.3); +INSERT INTO `countrylanguage` VALUES ('LKA','Tamil','T',19.6); +INSERT INTO `countrylanguage` VALUES ('LSO','English','T',0.0); +INSERT INTO `countrylanguage` VALUES ('LSO','Sotho','T',85.0); +INSERT INTO `countrylanguage` VALUES ('LSO','Zulu','F',15.0); +INSERT INTO `countrylanguage` VALUES ('LTU','Belorussian','F',1.4); +INSERT INTO `countrylanguage` VALUES ('LTU','Lithuanian','T',81.6); +INSERT INTO `countrylanguage` VALUES ('LTU','Polish','F',7.0); +INSERT INTO `countrylanguage` VALUES ('LTU','Russian','F',8.1); +INSERT INTO `countrylanguage` VALUES ('LTU','Ukrainian','F',1.1); +INSERT INTO `countrylanguage` VALUES ('LUX','French','T',4.2); +INSERT INTO `countrylanguage` VALUES ('LUX','German','T',2.3); +INSERT INTO `countrylanguage` VALUES ('LUX','Italian','F',4.6); +INSERT INTO `countrylanguage` VALUES ('LUX','Luxembourgish','T',64.4); +INSERT INTO `countrylanguage` VALUES ('LUX','Portuguese','F',13.0); +INSERT INTO `countrylanguage` VALUES ('LVA','Belorussian','F',4.1); +INSERT INTO `countrylanguage` VALUES ('LVA','Latvian','T',55.1); +INSERT INTO `countrylanguage` VALUES ('LVA','Lithuanian','F',1.2); +INSERT INTO `countrylanguage` VALUES ('LVA','Polish','F',2.1); +INSERT INTO `countrylanguage` VALUES ('LVA','Russian','F',32.5); +INSERT INTO `countrylanguage` VALUES ('LVA','Ukrainian','F',2.9); +INSERT INTO `countrylanguage` VALUES ('MAC','Canton Chinese','F',85.6); +INSERT INTO `countrylanguage` VALUES ('MAC','English','F',0.5); +INSERT INTO `countrylanguage` VALUES ('MAC','Mandarin Chinese','F',1.2); +INSERT INTO `countrylanguage` VALUES ('MAC','Portuguese','T',2.3); +INSERT INTO `countrylanguage` VALUES ('MAR','Arabic','T',65.0); +INSERT INTO `countrylanguage` VALUES ('MAR','Berberi','F',33.0); +INSERT INTO `countrylanguage` VALUES ('MCO','English','F',6.5); +INSERT INTO `countrylanguage` VALUES ('MCO','French','T',41.9); +INSERT INTO `countrylanguage` VALUES ('MCO','Italian','F',16.1); +INSERT INTO `countrylanguage` VALUES ('MCO','Monegasque','F',16.1); +INSERT INTO `countrylanguage` VALUES ('MDA','Bulgariana','F',1.6); +INSERT INTO `countrylanguage` VALUES ('MDA','Gagauzi','F',3.2); +INSERT INTO `countrylanguage` VALUES ('MDA','Romanian','T',61.9); +INSERT INTO `countrylanguage` VALUES ('MDA','Russian','F',23.2); +INSERT INTO `countrylanguage` VALUES ('MDA','Ukrainian','F',8.6); +INSERT INTO `countrylanguage` VALUES ('MDG','French','T',0.0); +INSERT INTO `countrylanguage` VALUES ('MDG','Malagasy','T',98.9); +INSERT INTO `countrylanguage` VALUES ('MDV','Dhivehi','T',100.0); +INSERT INTO `countrylanguage` VALUES ('MDV','English','F',0.0); +INSERT INTO `countrylanguage` VALUES ('MEX','Mixtec','F',0.6); +INSERT INTO `countrylanguage` VALUES ('MEX','N�huatl','F',1.8); +INSERT INTO `countrylanguage` VALUES ('MEX','Otom�','F',0.4); +INSERT INTO `countrylanguage` VALUES ('MEX','Spanish','T',92.1); +INSERT INTO `countrylanguage` VALUES ('MEX','Yucatec','F',1.1); +INSERT INTO `countrylanguage` VALUES ('MEX','Zapotec','F',0.6); +INSERT INTO `countrylanguage` VALUES ('MHL','English','T',0.0); +INSERT INTO `countrylanguage` VALUES ('MHL','Marshallese','T',96.8); +INSERT INTO `countrylanguage` VALUES ('MKD','Albaniana','F',22.9); +INSERT INTO `countrylanguage` VALUES ('MKD','Macedonian','T',66.5); +INSERT INTO `countrylanguage` VALUES ('MKD','Romani','F',2.3); +INSERT INTO `countrylanguage` VALUES ('MKD','Serbo-Croatian','F',2.0); +INSERT INTO `countrylanguage` VALUES ('MKD','Turkish','F',4.0); +INSERT INTO `countrylanguage` VALUES ('MLI','Bambara','F',31.8); +INSERT INTO `countrylanguage` VALUES ('MLI','Ful','F',13.9); +INSERT INTO `countrylanguage` VALUES ('MLI','Senufo and Minianka','F',12.0); +INSERT INTO `countrylanguage` VALUES ('MLI','Songhai','F',6.9); +INSERT INTO `countrylanguage` VALUES ('MLI','Soninke','F',8.7); +INSERT INTO `countrylanguage` VALUES ('MLI','Tamashek','F',7.3); +INSERT INTO `countrylanguage` VALUES ('MLT','English','T',2.1); +INSERT INTO `countrylanguage` VALUES ('MLT','Maltese','T',95.8); +INSERT INTO `countrylanguage` VALUES ('MMR','Burmese','T',69.0); +INSERT INTO `countrylanguage` VALUES ('MMR','Chin','F',2.2); +INSERT INTO `countrylanguage` VALUES ('MMR','Kachin','F',1.4); +INSERT INTO `countrylanguage` VALUES ('MMR','Karen','F',6.2); +INSERT INTO `countrylanguage` VALUES ('MMR','Kayah','F',0.4); +INSERT INTO `countrylanguage` VALUES ('MMR','Mon','F',2.4); +INSERT INTO `countrylanguage` VALUES ('MMR','Rakhine','F',4.5); +INSERT INTO `countrylanguage` VALUES ('MMR','Shan','F',8.5); +INSERT INTO `countrylanguage` VALUES ('MNG','Bajad','F',1.9); +INSERT INTO `countrylanguage` VALUES ('MNG','Buryat','F',1.7); +INSERT INTO `countrylanguage` VALUES ('MNG','Dariganga','F',1.4); +INSERT INTO `countrylanguage` VALUES ('MNG','Dorbet','F',2.7); +INSERT INTO `countrylanguage` VALUES ('MNG','Kazakh','F',5.9); +INSERT INTO `countrylanguage` VALUES ('MNG','Mongolian','T',78.8); +INSERT INTO `countrylanguage` VALUES ('MNP','Carolinian','F',4.8); +INSERT INTO `countrylanguage` VALUES ('MNP','Chamorro','F',30.0); +INSERT INTO `countrylanguage` VALUES ('MNP','Chinese','F',7.1); +INSERT INTO `countrylanguage` VALUES ('MNP','English','T',4.8); +INSERT INTO `countrylanguage` VALUES ('MNP','Korean','F',6.5); +INSERT INTO `countrylanguage` VALUES ('MNP','Philippene Languages','F',34.1); +INSERT INTO `countrylanguage` VALUES ('MOZ','Chuabo','F',5.7); +INSERT INTO `countrylanguage` VALUES ('MOZ','Lomwe','F',7.8); +INSERT INTO `countrylanguage` VALUES ('MOZ','Makua','F',27.8); +INSERT INTO `countrylanguage` VALUES ('MOZ','Marendje','F',3.5); +INSERT INTO `countrylanguage` VALUES ('MOZ','Nyanja','F',3.3); +INSERT INTO `countrylanguage` VALUES ('MOZ','Ronga','F',3.7); +INSERT INTO `countrylanguage` VALUES ('MOZ','Sena','F',9.4); +INSERT INTO `countrylanguage` VALUES ('MOZ','Shona','F',6.5); +INSERT INTO `countrylanguage` VALUES ('MOZ','Tsonga','F',12.4); +INSERT INTO `countrylanguage` VALUES ('MOZ','Tswa','F',6.0); +INSERT INTO `countrylanguage` VALUES ('MRT','Ful','F',1.2); +INSERT INTO `countrylanguage` VALUES ('MRT','Hassaniya','F',81.7); +INSERT INTO `countrylanguage` VALUES ('MRT','Soninke','F',2.7); +INSERT INTO `countrylanguage` VALUES ('MRT','Tukulor','F',5.4); +INSERT INTO `countrylanguage` VALUES ('MRT','Wolof','F',6.6); +INSERT INTO `countrylanguage` VALUES ('MRT','Zenaga','F',1.2); +INSERT INTO `countrylanguage` VALUES ('MSR','English','T',0.0); +INSERT INTO `countrylanguage` VALUES ('MTQ','Creole French','F',96.6); +INSERT INTO `countrylanguage` VALUES ('MTQ','French','T',0.0); +INSERT INTO `countrylanguage` VALUES ('MUS','Bhojpuri','F',21.1); +INSERT INTO `countrylanguage` VALUES ('MUS','Creole French','F',70.6); +INSERT INTO `countrylanguage` VALUES ('MUS','French','F',3.4); +INSERT INTO `countrylanguage` VALUES ('MUS','Hindi','F',1.2); +INSERT INTO `countrylanguage` VALUES ('MUS','Marathi','F',0.7); +INSERT INTO `countrylanguage` VALUES ('MUS','Tamil','F',0.8); +INSERT INTO `countrylanguage` VALUES ('MWI','Chichewa','T',58.3); +INSERT INTO `countrylanguage` VALUES ('MWI','Lomwe','F',18.4); +INSERT INTO `countrylanguage` VALUES ('MWI','Ngoni','F',6.7); +INSERT INTO `countrylanguage` VALUES ('MWI','Yao','F',13.2); +INSERT INTO `countrylanguage` VALUES ('MYS','Chinese','F',9.0); +INSERT INTO `countrylanguage` VALUES ('MYS','Dusun','F',1.1); +INSERT INTO `countrylanguage` VALUES ('MYS','English','F',1.6); +INSERT INTO `countrylanguage` VALUES ('MYS','Iban','F',2.8); +INSERT INTO `countrylanguage` VALUES ('MYS','Malay','T',58.4); +INSERT INTO `countrylanguage` VALUES ('MYS','Tamil','F',3.9); +INSERT INTO `countrylanguage` VALUES ('MYT','French','T',20.3); +INSERT INTO `countrylanguage` VALUES ('MYT','Mahor�','F',41.9); +INSERT INTO `countrylanguage` VALUES ('MYT','Malagasy','F',16.1); +INSERT INTO `countrylanguage` VALUES ('NAM','Afrikaans','F',9.5); +INSERT INTO `countrylanguage` VALUES ('NAM','Caprivi','F',4.7); +INSERT INTO `countrylanguage` VALUES ('NAM','German','F',0.9); +INSERT INTO `countrylanguage` VALUES ('NAM','Herero','F',8.0); +INSERT INTO `countrylanguage` VALUES ('NAM','Kavango','F',9.7); +INSERT INTO `countrylanguage` VALUES ('NAM','Nama','F',12.4); +INSERT INTO `countrylanguage` VALUES ('NAM','Ovambo','F',50.7); +INSERT INTO `countrylanguage` VALUES ('NAM','San','F',1.9); +INSERT INTO `countrylanguage` VALUES ('NCL','French','T',34.3); +INSERT INTO `countrylanguage` VALUES ('NCL','Malenasian Languages','F',45.4); +INSERT INTO `countrylanguage` VALUES ('NCL','Polynesian Languages','F',11.6); +INSERT INTO `countrylanguage` VALUES ('NER','Ful','F',9.7); +INSERT INTO `countrylanguage` VALUES ('NER','Hausa','F',53.1); +INSERT INTO `countrylanguage` VALUES ('NER','Kanuri','F',4.4); +INSERT INTO `countrylanguage` VALUES ('NER','Songhai-zerma','F',21.2); +INSERT INTO `countrylanguage` VALUES ('NER','Tamashek','F',10.4); +INSERT INTO `countrylanguage` VALUES ('NFK','English','T',0.0); +INSERT INTO `countrylanguage` VALUES ('NGA','Bura','F',1.6); +INSERT INTO `countrylanguage` VALUES ('NGA','Edo','F',3.3); +INSERT INTO `countrylanguage` VALUES ('NGA','Ful','F',11.3); +INSERT INTO `countrylanguage` VALUES ('NGA','Hausa','F',21.1); +INSERT INTO `countrylanguage` VALUES ('NGA','Ibibio','F',5.6); +INSERT INTO `countrylanguage` VALUES ('NGA','Ibo','F',18.1); +INSERT INTO `countrylanguage` VALUES ('NGA','Ijo','F',1.8); +INSERT INTO `countrylanguage` VALUES ('NGA','Joruba','F',21.4); +INSERT INTO `countrylanguage` VALUES ('NGA','Kanuri','F',4.1); +INSERT INTO `countrylanguage` VALUES ('NGA','Tiv','F',2.3); +INSERT INTO `countrylanguage` VALUES ('NIC','Creole English','F',0.5); +INSERT INTO `countrylanguage` VALUES ('NIC','Miskito','F',1.6); +INSERT INTO `countrylanguage` VALUES ('NIC','Spanish','T',97.6); +INSERT INTO `countrylanguage` VALUES ('NIC','Sumo','F',0.2); +INSERT INTO `countrylanguage` VALUES ('NIU','English','T',0.0); +INSERT INTO `countrylanguage` VALUES ('NIU','Niue','F',0.0); +INSERT INTO `countrylanguage` VALUES ('NLD','Arabic','F',0.9); +INSERT INTO `countrylanguage` VALUES ('NLD','Dutch','T',95.6); +INSERT INTO `countrylanguage` VALUES ('NLD','Fries','F',3.7); +INSERT INTO `countrylanguage` VALUES ('NLD','Turkish','F',0.8); +INSERT INTO `countrylanguage` VALUES ('NOR','Danish','F',0.4); +INSERT INTO `countrylanguage` VALUES ('NOR','English','F',0.5); +INSERT INTO `countrylanguage` VALUES ('NOR','Norwegian','T',96.6); +INSERT INTO `countrylanguage` VALUES ('NOR','Saame','F',0.0); +INSERT INTO `countrylanguage` VALUES ('NOR','Swedish','F',0.3); +INSERT INTO `countrylanguage` VALUES ('NPL','Bhojpuri','F',7.5); +INSERT INTO `countrylanguage` VALUES ('NPL','Hindi','F',3.0); +INSERT INTO `countrylanguage` VALUES ('NPL','Maithili','F',11.9); +INSERT INTO `countrylanguage` VALUES ('NPL','Nepali','T',50.4); +INSERT INTO `countrylanguage` VALUES ('NPL','Newari','F',3.7); +INSERT INTO `countrylanguage` VALUES ('NPL','Tamang','F',4.9); +INSERT INTO `countrylanguage` VALUES ('NPL','Tharu','F',5.4); +INSERT INTO `countrylanguage` VALUES ('NRU','Chinese','F',8.5); +INSERT INTO `countrylanguage` VALUES ('NRU','English','T',7.5); +INSERT INTO `countrylanguage` VALUES ('NRU','Kiribati','F',17.9); +INSERT INTO `countrylanguage` VALUES ('NRU','Nauru','T',57.5); +INSERT INTO `countrylanguage` VALUES ('NRU','Tuvalu','F',8.5); +INSERT INTO `countrylanguage` VALUES ('NZL','English','T',87.0); +INSERT INTO `countrylanguage` VALUES ('NZL','Maori','F',4.3); +INSERT INTO `countrylanguage` VALUES ('OMN','Arabic','T',76.7); +INSERT INTO `countrylanguage` VALUES ('OMN','Balochi','F',0.0); +INSERT INTO `countrylanguage` VALUES ('PAK','Balochi','F',3.0); +INSERT INTO `countrylanguage` VALUES ('PAK','Brahui','F',1.2); +INSERT INTO `countrylanguage` VALUES ('PAK','Hindko','F',2.4); +INSERT INTO `countrylanguage` VALUES ('PAK','Pashto','F',13.1); +INSERT INTO `countrylanguage` VALUES ('PAK','Punjabi','F',48.2); +INSERT INTO `countrylanguage` VALUES ('PAK','Saraiki','F',9.8); +INSERT INTO `countrylanguage` VALUES ('PAK','Sindhi','F',11.8); +INSERT INTO `countrylanguage` VALUES ('PAK','Urdu','T',7.6); +INSERT INTO `countrylanguage` VALUES ('PAN','Arabic','F',0.6); +INSERT INTO `countrylanguage` VALUES ('PAN','Creole English','F',14.0); +INSERT INTO `countrylanguage` VALUES ('PAN','Cuna','F',2.0); +INSERT INTO `countrylanguage` VALUES ('PAN','Embera','F',0.6); +INSERT INTO `countrylanguage` VALUES ('PAN','Guaym�','F',5.3); +INSERT INTO `countrylanguage` VALUES ('PAN','Spanish','T',76.8); +INSERT INTO `countrylanguage` VALUES ('PCN','Pitcairnese','F',0.0); +INSERT INTO `countrylanguage` VALUES ('PER','Aimar�','T',2.3); +INSERT INTO `countrylanguage` VALUES ('PER','Ket�ua','T',16.4); +INSERT INTO `countrylanguage` VALUES ('PER','Spanish','T',79.8); +INSERT INTO `countrylanguage` VALUES ('PHL','Bicol','F',5.7); +INSERT INTO `countrylanguage` VALUES ('PHL','Cebuano','F',23.3); +INSERT INTO `countrylanguage` VALUES ('PHL','Hiligaynon','F',9.1); +INSERT INTO `countrylanguage` VALUES ('PHL','Ilocano','F',9.3); +INSERT INTO `countrylanguage` VALUES ('PHL','Maguindanao','F',1.4); +INSERT INTO `countrylanguage` VALUES ('PHL','Maranao','F',1.3); +INSERT INTO `countrylanguage` VALUES ('PHL','Pampango','F',3.0); +INSERT INTO `countrylanguage` VALUES ('PHL','Pangasinan','F',1.8); +INSERT INTO `countrylanguage` VALUES ('PHL','Pilipino','T',29.3); +INSERT INTO `countrylanguage` VALUES ('PHL','Waray-waray','F',3.8); +INSERT INTO `countrylanguage` VALUES ('PLW','Chinese','F',1.6); +INSERT INTO `countrylanguage` VALUES ('PLW','English','T',3.2); +INSERT INTO `countrylanguage` VALUES ('PLW','Palau','T',82.2); +INSERT INTO `countrylanguage` VALUES ('PLW','Philippene Languages','F',9.2); +INSERT INTO `countrylanguage` VALUES ('PNG','Malenasian Languages','F',20.0); +INSERT INTO `countrylanguage` VALUES ('PNG','Papuan Languages','F',78.1); +INSERT INTO `countrylanguage` VALUES ('POL','Belorussian','F',0.5); +INSERT INTO `countrylanguage` VALUES ('POL','German','F',1.3); +INSERT INTO `countrylanguage` VALUES ('POL','Polish','T',97.6); +INSERT INTO `countrylanguage` VALUES ('POL','Ukrainian','F',0.6); +INSERT INTO `countrylanguage` VALUES ('PRI','English','F',47.4); +INSERT INTO `countrylanguage` VALUES ('PRI','Spanish','T',51.3); +INSERT INTO `countrylanguage` VALUES ('PRK','Chinese','F',0.1); +INSERT INTO `countrylanguage` VALUES ('PRK','Korean','T',99.9); +INSERT INTO `countrylanguage` VALUES ('PRT','Portuguese','T',99.0); +INSERT INTO `countrylanguage` VALUES ('PRY','German','F',0.9); +INSERT INTO `countrylanguage` VALUES ('PRY','Guaran�','T',40.1); +INSERT INTO `countrylanguage` VALUES ('PRY','Portuguese','F',3.2); +INSERT INTO `countrylanguage` VALUES ('PRY','Spanish','T',55.1); +INSERT INTO `countrylanguage` VALUES ('PSE','Arabic','F',95.9); +INSERT INTO `countrylanguage` VALUES ('PSE','Hebrew','F',4.1); +INSERT INTO `countrylanguage` VALUES ('PYF','Chinese','F',2.9); +INSERT INTO `countrylanguage` VALUES ('PYF','French','T',40.8); +INSERT INTO `countrylanguage` VALUES ('PYF','Tahitian','F',46.4); +INSERT INTO `countrylanguage` VALUES ('QAT','Arabic','T',40.7); +INSERT INTO `countrylanguage` VALUES ('QAT','Urdu','F',0.0); +INSERT INTO `countrylanguage` VALUES ('REU','Chinese','F',2.8); +INSERT INTO `countrylanguage` VALUES ('REU','Comorian','F',2.8); +INSERT INTO `countrylanguage` VALUES ('REU','Creole French','F',91.5); +INSERT INTO `countrylanguage` VALUES ('REU','Malagasy','F',1.4); +INSERT INTO `countrylanguage` VALUES ('REU','Tamil','F',0.0); +INSERT INTO `countrylanguage` VALUES ('ROM','German','F',0.4); +INSERT INTO `countrylanguage` VALUES ('ROM','Hungarian','F',7.2); +INSERT INTO `countrylanguage` VALUES ('ROM','Romani','T',0.7); +INSERT INTO `countrylanguage` VALUES ('ROM','Romanian','T',90.7); +INSERT INTO `countrylanguage` VALUES ('ROM','Serbo-Croatian','F',0.1); +INSERT INTO `countrylanguage` VALUES ('ROM','Ukrainian','F',0.3); +INSERT INTO `countrylanguage` VALUES ('RUS','Avarian','F',0.4); +INSERT INTO `countrylanguage` VALUES ('RUS','Bashkir','F',0.7); +INSERT INTO `countrylanguage` VALUES ('RUS','Belorussian','F',0.3); +INSERT INTO `countrylanguage` VALUES ('RUS','Chechen','F',0.6); +INSERT INTO `countrylanguage` VALUES ('RUS','Chuvash','F',0.9); +INSERT INTO `countrylanguage` VALUES ('RUS','Kazakh','F',0.4); +INSERT INTO `countrylanguage` VALUES ('RUS','Mari','F',0.4); +INSERT INTO `countrylanguage` VALUES ('RUS','Mordva','F',0.5); +INSERT INTO `countrylanguage` VALUES ('RUS','Russian','T',86.6); +INSERT INTO `countrylanguage` VALUES ('RUS','Tatar','F',3.2); +INSERT INTO `countrylanguage` VALUES ('RUS','Udmur','F',0.3); +INSERT INTO `countrylanguage` VALUES ('RUS','Ukrainian','F',1.3); +INSERT INTO `countrylanguage` VALUES ('RWA','French','T',0.0); +INSERT INTO `countrylanguage` VALUES ('RWA','Rwanda','T',100.0); +INSERT INTO `countrylanguage` VALUES ('SAU','Arabic','T',95.0); +INSERT INTO `countrylanguage` VALUES ('SDN','Arabic','T',49.4); +INSERT INTO `countrylanguage` VALUES ('SDN','Bari','F',2.5); +INSERT INTO `countrylanguage` VALUES ('SDN','Beja','F',6.4); +INSERT INTO `countrylanguage` VALUES ('SDN','Chilluk','F',1.7); +INSERT INTO `countrylanguage` VALUES ('SDN','Dinka','F',11.5); +INSERT INTO `countrylanguage` VALUES ('SDN','Fur','F',2.1); +INSERT INTO `countrylanguage` VALUES ('SDN','Lotuko','F',1.5); +INSERT INTO `countrylanguage` VALUES ('SDN','Nubian Languages','F',8.1); +INSERT INTO `countrylanguage` VALUES ('SDN','Nuer','F',4.9); +INSERT INTO `countrylanguage` VALUES ('SDN','Zande','F',2.7); +INSERT INTO `countrylanguage` VALUES ('SEN','Diola','F',5.0); +INSERT INTO `countrylanguage` VALUES ('SEN','Ful','F',21.7); +INSERT INTO `countrylanguage` VALUES ('SEN','Malinke','F',3.8); +INSERT INTO `countrylanguage` VALUES ('SEN','Serer','F',12.5); +INSERT INTO `countrylanguage` VALUES ('SEN','Soninke','F',1.3); +INSERT INTO `countrylanguage` VALUES ('SEN','Wolof','T',48.1); +INSERT INTO `countrylanguage` VALUES ('SGP','Chinese','T',77.1); +INSERT INTO `countrylanguage` VALUES ('SGP','Malay','T',14.1); +INSERT INTO `countrylanguage` VALUES ('SGP','Tamil','T',7.4); +INSERT INTO `countrylanguage` VALUES ('SHN','English','T',0.0); +INSERT INTO `countrylanguage` VALUES ('SJM','Norwegian','T',0.0); +INSERT INTO `countrylanguage` VALUES ('SJM','Russian','F',0.0); +INSERT INTO `countrylanguage` VALUES ('SLB','Malenasian Languages','F',85.6); +INSERT INTO `countrylanguage` VALUES ('SLB','Papuan Languages','F',8.6); +INSERT INTO `countrylanguage` VALUES ('SLB','Polynesian Languages','F',3.8); +INSERT INTO `countrylanguage` VALUES ('SLE','Bullom-sherbro','F',3.8); +INSERT INTO `countrylanguage` VALUES ('SLE','Ful','F',3.8); +INSERT INTO `countrylanguage` VALUES ('SLE','Kono-vai','F',5.1); +INSERT INTO `countrylanguage` VALUES ('SLE','Kuranko','F',3.4); +INSERT INTO `countrylanguage` VALUES ('SLE','Limba','F',8.3); +INSERT INTO `countrylanguage` VALUES ('SLE','Mende','F',34.8); +INSERT INTO `countrylanguage` VALUES ('SLE','Temne','F',31.8); +INSERT INTO `countrylanguage` VALUES ('SLE','Yalunka','F',3.4); +INSERT INTO `countrylanguage` VALUES ('SLV','Nahua','F',0.0); +INSERT INTO `countrylanguage` VALUES ('SLV','Spanish','T',100.0); +INSERT INTO `countrylanguage` VALUES ('SMR','Italian','T',100.0); +INSERT INTO `countrylanguage` VALUES ('SOM','Arabic','T',0.0); +INSERT INTO `countrylanguage` VALUES ('SOM','Somali','T',98.3); +INSERT INTO `countrylanguage` VALUES ('SPM','French','T',0.0); +INSERT INTO `countrylanguage` VALUES ('STP','Crioulo','F',86.3); +INSERT INTO `countrylanguage` VALUES ('STP','French','F',0.7); +INSERT INTO `countrylanguage` VALUES ('SUR','Hindi','F',0.0); +INSERT INTO `countrylanguage` VALUES ('SUR','Sranantonga','F',81.0); +INSERT INTO `countrylanguage` VALUES ('SVK','Czech and Moravian','F',1.1); +INSERT INTO `countrylanguage` VALUES ('SVK','Hungarian','F',10.5); +INSERT INTO `countrylanguage` VALUES ('SVK','Romani','F',1.7); +INSERT INTO `countrylanguage` VALUES ('SVK','Slovak','T',85.6); +INSERT INTO `countrylanguage` VALUES ('SVK','Ukrainian and Russian','F',0.6); +INSERT INTO `countrylanguage` VALUES ('SVN','Hungarian','F',0.5); +INSERT INTO `countrylanguage` VALUES ('SVN','Serbo-Croatian','F',7.9); +INSERT INTO `countrylanguage` VALUES ('SVN','Slovene','T',87.9); +INSERT INTO `countrylanguage` VALUES ('SWE','Arabic','F',0.8); +INSERT INTO `countrylanguage` VALUES ('SWE','Finnish','F',2.4); +INSERT INTO `countrylanguage` VALUES ('SWE','Norwegian','F',0.5); +INSERT INTO `countrylanguage` VALUES ('SWE','Southern Slavic Languages','F',1.3); +INSERT INTO `countrylanguage` VALUES ('SWE','Spanish','F',0.6); +INSERT INTO `countrylanguage` VALUES ('SWE','Swedish','T',89.5); +INSERT INTO `countrylanguage` VALUES ('SWZ','Swazi','T',89.9); +INSERT INTO `countrylanguage` VALUES ('SWZ','Zulu','F',2.0); +INSERT INTO `countrylanguage` VALUES ('SYC','English','T',3.8); +INSERT INTO `countrylanguage` VALUES ('SYC','French','T',1.3); +INSERT INTO `countrylanguage` VALUES ('SYC','Seselwa','F',91.3); +INSERT INTO `countrylanguage` VALUES ('SYR','Arabic','T',90.0); +INSERT INTO `countrylanguage` VALUES ('SYR','Kurdish','F',9.0); +INSERT INTO `countrylanguage` VALUES ('TCA','English','T',0.0); +INSERT INTO `countrylanguage` VALUES ('TCD','Arabic','T',12.3); +INSERT INTO `countrylanguage` VALUES ('TCD','Gorane','F',6.2); +INSERT INTO `countrylanguage` VALUES ('TCD','Hadjarai','F',6.7); +INSERT INTO `countrylanguage` VALUES ('TCD','Kanem-bornu','F',9.0); +INSERT INTO `countrylanguage` VALUES ('TCD','Mayo-kebbi','F',11.5); +INSERT INTO `countrylanguage` VALUES ('TCD','Ouaddai','F',8.7); +INSERT INTO `countrylanguage` VALUES ('TCD','Sara','F',27.7); +INSERT INTO `countrylanguage` VALUES ('TCD','Tandjile','F',6.5); +INSERT INTO `countrylanguage` VALUES ('TGO','Ane','F',5.7); +INSERT INTO `countrylanguage` VALUES ('TGO','Ewe','T',23.2); +INSERT INTO `countrylanguage` VALUES ('TGO','Gurma','F',3.4); +INSERT INTO `countrylanguage` VALUES ('TGO','Kaby�','T',13.8); +INSERT INTO `countrylanguage` VALUES ('TGO','Kotokoli','F',5.7); +INSERT INTO `countrylanguage` VALUES ('TGO','Moba','F',5.4); +INSERT INTO `countrylanguage` VALUES ('TGO','Naudemba','F',4.1); +INSERT INTO `countrylanguage` VALUES ('TGO','Watyi','F',10.3); +INSERT INTO `countrylanguage` VALUES ('THA','Chinese','F',12.1); +INSERT INTO `countrylanguage` VALUES ('THA','Khmer','F',1.3); +INSERT INTO `countrylanguage` VALUES ('THA','Kuy','F',1.1); +INSERT INTO `countrylanguage` VALUES ('THA','Lao','F',26.9); +INSERT INTO `countrylanguage` VALUES ('THA','Malay','F',3.6); +INSERT INTO `countrylanguage` VALUES ('THA','Thai','T',52.6); +INSERT INTO `countrylanguage` VALUES ('TJK','Russian','F',9.7); +INSERT INTO `countrylanguage` VALUES ('TJK','Tadzhik','T',62.2); +INSERT INTO `countrylanguage` VALUES ('TJK','Uzbek','F',23.2); +INSERT INTO `countrylanguage` VALUES ('TKL','English','T',0.0); +INSERT INTO `countrylanguage` VALUES ('TKL','Tokelau','F',0.0); +INSERT INTO `countrylanguage` VALUES ('TKM','Kazakh','F',2.0); +INSERT INTO `countrylanguage` VALUES ('TKM','Russian','F',6.7); +INSERT INTO `countrylanguage` VALUES ('TKM','Turkmenian','T',76.7); +INSERT INTO `countrylanguage` VALUES ('TKM','Uzbek','F',9.2); +INSERT INTO `countrylanguage` VALUES ('TMP','Portuguese','T',0.0); +INSERT INTO `countrylanguage` VALUES ('TMP','Sunda','F',0.0); +INSERT INTO `countrylanguage` VALUES ('TON','English','T',0.0); +INSERT INTO `countrylanguage` VALUES ('TON','Tongan','T',98.3); +INSERT INTO `countrylanguage` VALUES ('TTO','Creole English','F',2.9); +INSERT INTO `countrylanguage` VALUES ('TTO','English','F',93.5); +INSERT INTO `countrylanguage` VALUES ('TTO','Hindi','F',3.4); +INSERT INTO `countrylanguage` VALUES ('TUN','Arabic','T',69.9); +INSERT INTO `countrylanguage` VALUES ('TUN','Arabic-French','F',26.3); +INSERT INTO `countrylanguage` VALUES ('TUN','Arabic-French-English','F',3.2); +INSERT INTO `countrylanguage` VALUES ('TUR','Arabic','F',1.4); +INSERT INTO `countrylanguage` VALUES ('TUR','Kurdish','F',10.6); +INSERT INTO `countrylanguage` VALUES ('TUR','Turkish','T',87.6); +INSERT INTO `countrylanguage` VALUES ('TUV','English','T',0.0); +INSERT INTO `countrylanguage` VALUES ('TUV','Kiribati','F',7.5); +INSERT INTO `countrylanguage` VALUES ('TUV','Tuvalu','T',92.5); +INSERT INTO `countrylanguage` VALUES ('TWN','Ami','F',0.6); +INSERT INTO `countrylanguage` VALUES ('TWN','Atayal','F',0.4); +INSERT INTO `countrylanguage` VALUES ('TWN','Hakka','F',11.0); +INSERT INTO `countrylanguage` VALUES ('TWN','Mandarin Chinese','T',20.1); +INSERT INTO `countrylanguage` VALUES ('TWN','Min','F',66.7); +INSERT INTO `countrylanguage` VALUES ('TWN','Paiwan','F',0.3); +INSERT INTO `countrylanguage` VALUES ('TZA','Chaga and Pare','F',4.9); +INSERT INTO `countrylanguage` VALUES ('TZA','Gogo','F',3.9); +INSERT INTO `countrylanguage` VALUES ('TZA','Ha','F',3.5); +INSERT INTO `countrylanguage` VALUES ('TZA','Haya','F',5.9); +INSERT INTO `countrylanguage` VALUES ('TZA','Hehet','F',6.9); +INSERT INTO `countrylanguage` VALUES ('TZA','Luguru','F',4.9); +INSERT INTO `countrylanguage` VALUES ('TZA','Makonde','F',5.9); +INSERT INTO `countrylanguage` VALUES ('TZA','Nyakusa','F',5.4); +INSERT INTO `countrylanguage` VALUES ('TZA','Nyamwesi','F',21.1); +INSERT INTO `countrylanguage` VALUES ('TZA','Shambala','F',4.3); +INSERT INTO `countrylanguage` VALUES ('TZA','Swahili','T',8.8); +INSERT INTO `countrylanguage` VALUES ('UGA','Acholi','F',4.4); +INSERT INTO `countrylanguage` VALUES ('UGA','Ganda','F',18.1); +INSERT INTO `countrylanguage` VALUES ('UGA','Gisu','F',4.5); +INSERT INTO `countrylanguage` VALUES ('UGA','Kiga','F',8.3); +INSERT INTO `countrylanguage` VALUES ('UGA','Lango','F',5.9); +INSERT INTO `countrylanguage` VALUES ('UGA','Lugbara','F',4.7); +INSERT INTO `countrylanguage` VALUES ('UGA','Nkole','F',10.7); +INSERT INTO `countrylanguage` VALUES ('UGA','Rwanda','F',3.2); +INSERT INTO `countrylanguage` VALUES ('UGA','Soga','F',8.2); +INSERT INTO `countrylanguage` VALUES ('UGA','Teso','F',6.0); +INSERT INTO `countrylanguage` VALUES ('UKR','Belorussian','F',0.3); +INSERT INTO `countrylanguage` VALUES ('UKR','Bulgariana','F',0.3); +INSERT INTO `countrylanguage` VALUES ('UKR','Hungarian','F',0.3); +INSERT INTO `countrylanguage` VALUES ('UKR','Polish','F',0.1); +INSERT INTO `countrylanguage` VALUES ('UKR','Romanian','F',0.7); +INSERT INTO `countrylanguage` VALUES ('UKR','Russian','F',32.9); +INSERT INTO `countrylanguage` VALUES ('UKR','Ukrainian','T',64.7); +INSERT INTO `countrylanguage` VALUES ('UMI','English','T',0.0); +INSERT INTO `countrylanguage` VALUES ('URY','Spanish','T',95.7); +INSERT INTO `countrylanguage` VALUES ('USA','Chinese','F',0.6); +INSERT INTO `countrylanguage` VALUES ('USA','English','T',86.2); +INSERT INTO `countrylanguage` VALUES ('USA','French','F',0.7); +INSERT INTO `countrylanguage` VALUES ('USA','German','F',0.7); +INSERT INTO `countrylanguage` VALUES ('USA','Italian','F',0.6); +INSERT INTO `countrylanguage` VALUES ('USA','Japanese','F',0.2); +INSERT INTO `countrylanguage` VALUES ('USA','Korean','F',0.3); +INSERT INTO `countrylanguage` VALUES ('USA','Polish','F',0.3); +INSERT INTO `countrylanguage` VALUES ('USA','Portuguese','F',0.2); +INSERT INTO `countrylanguage` VALUES ('USA','Spanish','F',7.5); +INSERT INTO `countrylanguage` VALUES ('USA','Tagalog','F',0.4); +INSERT INTO `countrylanguage` VALUES ('USA','Vietnamese','F',0.2); +INSERT INTO `countrylanguage` VALUES ('UZB','Karakalpak','F',2.0); +INSERT INTO `countrylanguage` VALUES ('UZB','Kazakh','F',3.8); +INSERT INTO `countrylanguage` VALUES ('UZB','Russian','F',10.9); +INSERT INTO `countrylanguage` VALUES ('UZB','Tadzhik','F',4.4); +INSERT INTO `countrylanguage` VALUES ('UZB','Tatar','F',1.8); +INSERT INTO `countrylanguage` VALUES ('UZB','Uzbek','T',72.6); +INSERT INTO `countrylanguage` VALUES ('VAT','Italian','T',0.0); +INSERT INTO `countrylanguage` VALUES ('VCT','Creole English','F',99.1); +INSERT INTO `countrylanguage` VALUES ('VCT','English','T',0.0); +INSERT INTO `countrylanguage` VALUES ('VEN','Goajiro','F',0.4); +INSERT INTO `countrylanguage` VALUES ('VEN','Spanish','T',96.9); +INSERT INTO `countrylanguage` VALUES ('VEN','Warrau','F',0.1); +INSERT INTO `countrylanguage` VALUES ('VGB','English','T',0.0); +INSERT INTO `countrylanguage` VALUES ('VIR','English','T',81.7); +INSERT INTO `countrylanguage` VALUES ('VIR','French','F',2.5); +INSERT INTO `countrylanguage` VALUES ('VIR','Spanish','F',13.3); +INSERT INTO `countrylanguage` VALUES ('VNM','Chinese','F',1.4); +INSERT INTO `countrylanguage` VALUES ('VNM','Khmer','F',1.4); +INSERT INTO `countrylanguage` VALUES ('VNM','Man','F',0.7); +INSERT INTO `countrylanguage` VALUES ('VNM','Miao','F',0.9); +INSERT INTO `countrylanguage` VALUES ('VNM','Muong','F',1.5); +INSERT INTO `countrylanguage` VALUES ('VNM','Nung','F',1.1); +INSERT INTO `countrylanguage` VALUES ('VNM','Thai','F',1.6); +INSERT INTO `countrylanguage` VALUES ('VNM','Tho','F',1.8); +INSERT INTO `countrylanguage` VALUES ('VNM','Vietnamese','T',86.8); +INSERT INTO `countrylanguage` VALUES ('VUT','Bislama','T',56.6); +INSERT INTO `countrylanguage` VALUES ('VUT','English','T',28.3); +INSERT INTO `countrylanguage` VALUES ('VUT','French','T',14.2); +INSERT INTO `countrylanguage` VALUES ('WLF','Futuna','F',0.0); +INSERT INTO `countrylanguage` VALUES ('WLF','Wallis','F',0.0); +INSERT INTO `countrylanguage` VALUES ('WSM','English','T',0.6); +INSERT INTO `countrylanguage` VALUES ('WSM','Samoan','T',47.5); +INSERT INTO `countrylanguage` VALUES ('WSM','Samoan-English','F',52.0); +INSERT INTO `countrylanguage` VALUES ('YEM','Arabic','T',99.6); +INSERT INTO `countrylanguage` VALUES ('YEM','Soqutri','F',0.0); +INSERT INTO `countrylanguage` VALUES ('YUG','Albaniana','F',16.5); +INSERT INTO `countrylanguage` VALUES ('YUG','Hungarian','F',3.4); +INSERT INTO `countrylanguage` VALUES ('YUG','Macedonian','F',0.5); +INSERT INTO `countrylanguage` VALUES ('YUG','Romani','F',1.4); +INSERT INTO `countrylanguage` VALUES ('YUG','Serbo-Croatian','T',75.2); +INSERT INTO `countrylanguage` VALUES ('YUG','Slovak','F',0.7); +INSERT INTO `countrylanguage` VALUES ('ZAF','Afrikaans','T',14.3); +INSERT INTO `countrylanguage` VALUES ('ZAF','English','T',8.5); +INSERT INTO `countrylanguage` VALUES ('ZAF','Ndebele','F',1.5); +INSERT INTO `countrylanguage` VALUES ('ZAF','Northsotho','F',9.1); +INSERT INTO `countrylanguage` VALUES ('ZAF','Southsotho','F',7.6); +INSERT INTO `countrylanguage` VALUES ('ZAF','Swazi','F',2.5); +INSERT INTO `countrylanguage` VALUES ('ZAF','Tsonga','F',4.3); +INSERT INTO `countrylanguage` VALUES ('ZAF','Tswana','F',8.1); +INSERT INTO `countrylanguage` VALUES ('ZAF','Venda','F',2.2); +INSERT INTO `countrylanguage` VALUES ('ZAF','Xhosa','T',17.7); +INSERT INTO `countrylanguage` VALUES ('ZAF','Zulu','T',22.7); +INSERT INTO `countrylanguage` VALUES ('ZMB','Bemba','F',29.7); +INSERT INTO `countrylanguage` VALUES ('ZMB','Chewa','F',5.7); +INSERT INTO `countrylanguage` VALUES ('ZMB','Lozi','F',6.4); +INSERT INTO `countrylanguage` VALUES ('ZMB','Nsenga','F',4.3); +INSERT INTO `countrylanguage` VALUES ('ZMB','Nyanja','F',7.8); +INSERT INTO `countrylanguage` VALUES ('ZMB','Tongan','F',11.0); +INSERT INTO `countrylanguage` VALUES ('ZWE','English','T',2.2); +INSERT INTO `countrylanguage` VALUES ('ZWE','Ndebele','F',16.2); +INSERT INTO `countrylanguage` VALUES ('ZWE','Nyanja','F',2.2); +INSERT INTO `countrylanguage` VALUES ('ZWE','Shona','F',72.1); +COMMIT; + +SET AUTOCOMMIT=1; + +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2010-09-30 11:01:37 diff --git a/EFCore/tests/MySql.EFCore.Migrations.Tests/MySQLHistoryRepositoryTests.cs b/EFCore/tests/MySql.EFCore.Migrations.Tests/MySQLHistoryRepositoryTests.cs new file mode 100644 index 000000000..6421977d3 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Migrations.Tests/MySQLHistoryRepositoryTests.cs @@ -0,0 +1,88 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage; +using Microsoft.Extensions.DependencyInjection; +using MySql.EntityFrameworkCore.Basic.Tests.Utils; +using MySql.EntityFrameworkCore.Extensions; +using NUnit.Framework; +using NUnit.Framework.Legacy; + +namespace MySql.EntityFrameworkCore.Migrations.Tests +{ + public partial class MySQLHistoryRepositoryTests + { + private static IHistoryRepository CreateHistoryRepository() + { + var optionsBuilder = new DbContextOptionsBuilder(); + optionsBuilder.UseMySQL(MySQLTestStore.RootConnectionString + "database=test;"); + + var serviceCollection = new ServiceCollection(); + serviceCollection.AddEntityFrameworkMySQL() + .AddDbContext(); + + optionsBuilder.UseInternalServiceProvider(serviceCollection.BuildServiceProvider()); + + return new DbContext(optionsBuilder.Options).GetService(); + } + + [Test] + public void GetBeginIfNotExistsScript_works() + { + var repository = CreateHistoryRepository(); + var script = repository.GetBeginIfNotExistsScript("Migration1"); + } + + [Test] + public void GetBeginIfExistsScript_works() + { + var repository = CreateHistoryRepository(); + var script = repository.GetBeginIfExistsScript("Migration1"); + } + + [Test] + public void CanCreateDatabase() + { + var repository = CreateHistoryRepository(); + var serviceCollection = new ServiceCollection(); + serviceCollection.AddEntityFrameworkMySQL() + .AddDbContext(); + + var serviceProvider = serviceCollection.BuildServiceProvider(); + var context = serviceProvider.GetRequiredService(); + var creator = context.GetService(); + + var cmdBuilder = context.GetService(); + Assert.That(!creator.Exists()); + Assert.That(cmdBuilder.Build(repository.GetBeginIfExistsScript("MigrationId")).CommandText.Replace("\r", string.Empty), Is.EqualTo("IF EXISTS(SELECT * FROM `__EFMigrationsHistory` WHERE `MigrationId` = 'MigrationId')\nBEGIN")); + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Migrations.Tests/MySQLMigrationsTests.cs b/EFCore/tests/MySql.EFCore.Migrations.Tests/MySQLMigrationsTests.cs new file mode 100644 index 000000000..c19d102ca --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Migrations.Tests/MySQLMigrationsTests.cs @@ -0,0 +1,87 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.Extensions.DependencyInjection; +using MySql.EntityFrameworkCore.Basic.Tests.Utils; +using MySql.EntityFrameworkCore.Migrations.Tests.TestData; +using NUnit.Framework; +using System.Threading.Tasks; + +namespace MySql.EntityFrameworkCore.Migrations.Tests +{ + public class MySQLMigrationsTests + { + [Test] + public void Can_generate_migration_from_initial_database_to_initial() + { + // create the context + var optionsBuilder = new DbContextOptionsBuilder(); + optionsBuilder.UseMySQL(MySQLTestStore.RootConnectionString + "database=test;"); + + using (var mytestContext = new MyTestContext(optionsBuilder.Options)) + { + var migrator = mytestContext.GetInfrastructure().GetRequiredService(); + + migrator.GenerateScript(fromMigration: Migration.InitialDatabase, toMigration: Migration.InitialDatabase); + } + } + + //Bug #37513445 Cannot Perform Database Migration using MySql.EntityFrameworkCore 9.0.0 + [Test] + public void TryPerformMigration() + { + var optionsBuilder = new DbContextOptionsBuilder(); + optionsBuilder.UseMySQL(MySQLTestStore.RootConnectionString + "database=test;"); + + using (var mytestContext = new MyTestContext(optionsBuilder.Options)) + { + mytestContext.Database.EnsureCreated(); + mytestContext.Database.EnsureDeleted(); + mytestContext.Database.Migrate(); + + Assert.That(mytestContext.Database.CanConnect(), Is.True); + mytestContext.Database.EnsureDeleted(); + } + } + + //Bug#37462099 MySql.EntityFrameworkCore 8.0.8 rename bug + [Test] + public async Task MigrationFailsWIthRenameColumn() + { + Bug37462099Context context = new Bug37462099Context(); + + context.Database.EnsureCreated(); + context.Database.EnsureDeleted(); + await context.Database.MigrateAsync(); + context.Database.EnsureDeleted(); + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Migrations.Tests/MySql.EntityFrameworkCore.Migrations.Tests.csproj b/EFCore/tests/MySql.EFCore.Migrations.Tests/MySql.EntityFrameworkCore.Migrations.Tests.csproj new file mode 100644 index 000000000..dca0d5bed --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Migrations.Tests/MySql.EntityFrameworkCore.Migrations.Tests.csproj @@ -0,0 +1,31 @@ + + + + MySql.EntityFrameworkCore.Migrations.Tests Class Library + net9.0;net8.0; + MySql.EntityFrameworkCore.Migrations.Tests + MySql.EntityFrameworkCore.Migrations.Tests + true + True + True + enable + ..\..\..\ConnectorNetPublicKey.snk + $(NoWarn);CS1591,EF1001 + + + + $(TargetFrameworks);net10.0 + + + + + + + + + + + + + + diff --git a/EFCore/tests/MySql.EFCore.Migrations.Tests/MySqlMigrationsGeneratorTest.cs b/EFCore/tests/MySql.EFCore.Migrations.Tests/MySqlMigrationsGeneratorTest.cs new file mode 100644 index 000000000..53b36fcaa --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Migrations.Tests/MySqlMigrationsGeneratorTest.cs @@ -0,0 +1,167 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.Extensions.DependencyInjection; +using MySql.EntityFrameworkCore.Basic.Tests.Utils; +using MySql.EntityFrameworkCore.Extensions; +using NUnit.Framework; +using NUnit.Framework.Legacy; + +namespace MySql.EntityFrameworkCore.Migrations.Tests +{ + public class MySQLMigrationsGeneratorTest : MySQLMigrationsGeneratorTestBase + { + protected override IMigrationsSqlGenerator SqlGenerator + { + get + { + var optionsBuilder = new DbContextOptionsBuilder(); + optionsBuilder.UseMySQL(MySQLTestStore.RootConnectionString + "database=test;"); + + var serviceCollection = new ServiceCollection(); + serviceCollection.AddEntityFrameworkMySQL() + .AddDbContext(); + + optionsBuilder.UseInternalServiceProvider(serviceCollection.BuildServiceProvider()); + + return new DbContext(optionsBuilder.Options).GetService(); + } + } + + [Test] + public override void CreateTableOperation() + { + base.CreateTableOperation(); + + string result = + "CREATE TABLE `People` (" + EOL + + " `Id` int NOT NULL AUTO_INCREMENT," + EOL + + " `EmployerId` int NULL," + EOL + + " `SSN` char(11) NULL," + EOL + + " PRIMARY KEY (`Id`)," + EOL + + " UNIQUE (`SSN`)," + EOL + + " FOREIGN KEY (`EmployerId`) REFERENCES `Companies` (`Id`)" + EOL + + ");" + EOL; + string fullResult = result.Replace(" NULL,", ","); + + Assert.That(result == Sql || fullResult == Sql); + } + + [Test] + public override void AddColumnOperation_with_maxLength() + { + base.AddColumnOperation_with_maxLength(); + string result = "ALTER TABLE `Person` ADD `Name` varchar(30);" + EOL; + string fullResult = "ALTER TABLE `Person` ADD `Name` varchar(30) NULL;" + EOL; + Assert.That(result == Sql || fullResult == Sql); + } + + [Test] + public override void AddColumnOperationWithComputedValueSql() + { + base.AddColumnOperationWithComputedValueSql(); + Assert.That(Sql, Is.EqualTo("ALTER TABLE `People` ADD `DisplayName` varchar(50) AS (CONCAT_WS(' ', LastName , FirstName));" + EOL)); + } + + [Test] + public override void AddColumnOperationWithDefaultValueSql() + { + base.AddColumnOperationWithDefaultValueSql(); + Assert.That(Sql, Is.EqualTo("ALTER TABLE `People` ADD `Timestamp` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP;" + EOL)); + } + + [Test] + public override void AlterColumnOperation() + { + base.AlterColumnOperation(); + Assert.That(Sql, Is.EqualTo("ALTER TABLE `Person` MODIFY `Age` int NOT NULL DEFAULT 7;" + EOL)); + } + + + [Test] + public override void AlterColumnOperationWithoutType() + { + base.AlterColumnOperationWithoutType(); + Assert.That(Sql, Is.EqualTo("ALTER TABLE `Person` MODIFY `Age` int NOT NULL;" + EOL)); + } + + [Test] + public override void RenameTableOperationInSchema() + { + base.RenameTableOperationInSchema(); + Assert.That(Sql, Is.EqualTo("ALTER TABLE t1 RENAME t2;" + EOL)); + } + + [Test] + public override void CreateUniqueIndexOperation() + { + base.CreateUniqueIndexOperation(); + Assert.That(Sql, Is.EqualTo("CREATE UNIQUE INDEX `IXPersonName` ON `Person` (`FirstName`, `LastName`);" + EOL)); + } + + [Test] + public override void CreateNonUniqueIndexOperation() + { + base.CreateNonUniqueIndexOperation(); + + Assert.That(Sql, Is.EqualTo("CREATE INDEX `IXPersonName` ON `Person` (`Name`);" + EOL)); + } + + [Test] + [Ignore("Rename index not supported yet")] + public override void RenameIndexOperation() + { + base.RenameIndexOperation(); + Assert.That(Sql, Is.EqualTo("DROP INDEX IXPersonName ON Person; CREATE INDEX IXNombre;" + EOL)); + } + + [Test] + public override void DropIndexOperation() + { + base.DropIndexOperation(); + Assert.That(Sql, Is.EqualTo("DROP INDEX IXPersonName ON Person;" + EOL)); + } + + [Test] + public override void DropPrimaryKeyOperation() + { + base.DropPrimaryKeyOperation(); + Assert.That(Sql, Is.EqualTo(string.Empty)); + } + + [Test] + public override void AddPrimaryKeyOperation() + { + base.AddPrimaryKeyOperation(); + Assert.That(Sql, Is.EqualTo(string.Empty)); + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Migrations.Tests/MySqlMigrationsGeneratorTestBase.cs b/EFCore/tests/MySql.EFCore.Migrations.Tests/MySqlMigrationsGeneratorTestBase.cs new file mode 100644 index 000000000..402723c3e --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Migrations.Tests/MySqlMigrationsGeneratorTestBase.cs @@ -0,0 +1,303 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Migrations.Operations; +using MySql.EntityFrameworkCore.Metadata.Internal; +using MySql.EntityFrameworkCore.Migrations.Tests.Utilities; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Linq; + +namespace MySql.EntityFrameworkCore.Migrations.Tests +{ + public abstract class MySQLMigrationsGeneratorTestBase + { + protected abstract IMigrationsSqlGenerator SqlGenerator { get; } + protected virtual string? Sql { get; set; } + protected static string EOL => Environment.NewLine; + + [Test] + public virtual void CreateTableOperation() + { + Generate( + new CreateTableOperation + { + Name = "People", + Schema = null, + Columns = + { + new AddColumnOperation + { + Name = "Id", + Table ="People", + ClrType = typeof(int), + IsNullable = false, + [MySQLAnnotationNames.LegacyValueGeneratedOnAdd] = true + }, + new AddColumnOperation + { + Name = "EmployerId", + Table ="People", + ClrType = typeof(int), + IsNullable = true + }, + new AddColumnOperation + { + Name = "SSN", + Table ="People", + ClrType = typeof(string), + ColumnType = "char(11)", + IsNullable = true + } + }, + PrimaryKey = new AddPrimaryKeyOperation + { + Table = "People", + Columns = new[] { "Id" } + }, + UniqueConstraints = + { + new AddUniqueConstraintOperation + { + Columns = new[] { "SSN" } + } + }, + ForeignKeys = + { + new AddForeignKeyOperation + { + Columns = new[] { "EmployerId" }, + PrincipalTable = "Companies", + PrincipalColumns = new[] { "Id" } + } + } + }); + } + + + [Test] + public void AddColumnOperation() + { + Generate(new AddColumnOperation + { + Table = "People", + Schema = null, + Name = "Name", + ClrType = typeof(string), + ColumnType = "varchar(50)", + IsNullable = false + } + ); + } + + + [Test] + public virtual void AddColumnOperationWithComputedValueSql() + { + Generate(new AddColumnOperation + { + Table = "People", + Schema = null, + Name = "DisplayName", + ClrType = typeof(string), + ColumnType = "varchar(50)", + IsNullable = false, + ComputedColumnSql = "CONCAT_WS(' ', LastName , FirstName)" + } + ); + } + + [Test] + public virtual void AddColumnOperationWithDefaultValueSql() + { + Generate(new AddColumnOperation + { + Table = "People", + Schema = null, + Name = "Timestamp", + ClrType = typeof(DateTime), + ColumnType = "datetime", + IsNullable = false, + DefaultValueSql = "CURRENT_TIMESTAMP" + } + ); + } + + + [Test] + public virtual void AddColumnOperation_with_maxLength() + { + Generate( + new AddColumnOperation + { + Table = "Person", + Name = "Name", + ClrType = typeof(string), + ColumnType = "varchar(30)", + IsNullable = true, + MaxLength = 30 + }); + + } + + + [Test] + public virtual void AlterColumnOperation() + { + Generate(new AlterColumnOperation + { + Table = "Person", + Schema = "", + Name = "Age", + ClrType = typeof(int), + ColumnType = "int", + IsNullable = false, + DefaultValue = 7 + }); + } + + + [Test] + public virtual void AlterColumnOperationWithoutType() + { + Generate( + new AlterColumnOperation + { + Table = "Person", + Name = "Age", + ClrType = typeof(int) + }); + } + + + [Test] + public virtual void RenameTableOperationInSchema() + { + Generate( + new RenameTableOperation + { + Name = "t1", + Schema = "", + NewName = "t2", + NewSchema = "" + }); + } + + [Test] + public virtual void CreateUniqueIndexOperation() + { + Generate( + new CreateIndexOperation + { + Name = "IXPersonName", + Table = "Person", + Schema = "", + Columns = new[] { "FirstName", "LastName" }, + IsUnique = true + }); + } + + + [Test] + public virtual void CreateNonUniqueIndexOperation() + { + Generate( + new CreateIndexOperation + { + Name = "IXPersonName", + Table = "Person", + Columns = new[] { "Name" }, + IsUnique = false + }); + } + + [Test] + public virtual void RenameIndexOperation() + { + Generate( + new RenameIndexOperation + { + Name = "IXPersonName", + Table = "Person", + NewName = "IXNombre" + }); + } + + [Test] + public virtual void DropIndexOperation() + { + Generate( + new DropIndexOperation + { + Name = "IXPersonName", + Table = "Person" + }); + } + + [Test] + public virtual void DropPrimaryKeyOperation() + { + Generate( + new DropPrimaryKeyOperation + { + Name = "IXPersonName", + Table = "Person" + }); + } + + [Test] + public virtual void AddPrimaryKeyOperation() + { + Generate( + new AddPrimaryKeyOperation + { + Name = "IXPersonName", + Table = "Person" + }); + } + + protected virtual void Generate(MigrationOperation operation) + { + Generate(_ => { }, new[] { operation }); + } + + protected virtual void Generate(Action buildAction, params MigrationOperation[] operation) + { + var modelBuilder = ContextUtils.Instance.CreateModelBuilder(); + buildAction(modelBuilder); + + var batch = SqlGenerator.Generate(operation, (IModel)modelBuilder.Model); + + Sql = string.Join(EOL, batch.Select(b => b.CommandText)); + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Migrations.Tests/TestData/Bug37462099Context.cs b/EFCore/tests/MySql.EFCore.Migrations.Tests/TestData/Bug37462099Context.cs new file mode 100644 index 000000000..f01d4eb3a --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Migrations.Tests/TestData/Bug37462099Context.cs @@ -0,0 +1,74 @@ +// Copyright © 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using System; +using System.ComponentModel.DataAnnotations; +using MySql.EntityFrameworkCore.Basic.Tests.Utils; + +namespace MySql.EntityFrameworkCore.Migrations.Tests.TestData +{ + public class Bug37462099Context : DbContext + { + public DbSet Entity { get; set; } + + public Bug37462099Context() : base() + { + } + + public Bug37462099Context(DbContextOptions options) : base(options) + { + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity(builder => + { + builder.ToTable("Bug37462099"); + + builder.HasKey(p => p.Id); + + builder.Property(p => p.Name); + + builder.Property(p => p.Created); + }); + } + + protected override void OnConfiguring(DbContextOptionsBuilder options) + => options.UseMySQL(MySQLTestStore.RootConnectionString + "database=test;"); + } + + public class Bug37462099 + { + [Key] + public int Id { get; set; } + public string? Name { get; set; } + public DateTimeOffset Created { get; set; } + + } +} diff --git a/EFCore/tests/MySql.EFCore.Migrations.Tests/TestData/Bug37462099ContextModelSnapshot.cs b/EFCore/tests/MySql.EFCore.Migrations.Tests/TestData/Bug37462099ContextModelSnapshot.cs new file mode 100644 index 000000000..41a49b529 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Migrations.Tests/TestData/Bug37462099ContextModelSnapshot.cs @@ -0,0 +1,68 @@ +// Copyright © 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace MySql.EntityFrameworkCore.Migrations.Tests.TestData +{ + [DbContext(typeof(Bug37462099Context))] + partial class Bug37462099ContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.3") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("MySql.EntityFrameworkCore.Migrations.Tests.TestData.Bug37462099", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Created") + .HasColumnType("datetime"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Bug37462099", (string)null); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Migrations.Tests/TestData/Bug37462099Migrations.Designer.cs b/EFCore/tests/MySql.EFCore.Migrations.Tests/TestData/Bug37462099Migrations.Designer.cs new file mode 100644 index 000000000..898193d40 --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Migrations.Tests/TestData/Bug37462099Migrations.Designer.cs @@ -0,0 +1,71 @@ +// Copyright © 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace MySql.EntityFrameworkCore.Migrations.Tests.TestData +{ + [DbContext(typeof(Bug37462099Context))] + [Migration("Bug37462099Migrations")] + partial class Bug37462099Migrations + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.3") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + modelBuilder.Entity("MySql.EntityFrameworkCore.Migrations.Tests.TestData.Bug37462099", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int"); + + b.Property("Created") + .HasColumnType("datetime"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Bug37462099", (string)null); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Migrations.Tests/TestData/Bug37462099Migrations.cs b/EFCore/tests/MySql.EFCore.Migrations.Tests/TestData/Bug37462099Migrations.cs new file mode 100644 index 000000000..9e85e86ac --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Migrations.Tests/TestData/Bug37462099Migrations.cs @@ -0,0 +1,78 @@ +// Copyright © 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using Microsoft.EntityFrameworkCore.Migrations; +using MySql.EntityFrameworkCore.Metadata; + +#nullable disable + +namespace MySql.EntityFrameworkCore.Migrations.Tests.TestData +{ + /// + public partial class Bug37462099Migrations : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterDatabase() + .Annotation("MySQL:Charset", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "Bug37462099", + columns: table => new + { + Id = table.Column(type: "int", nullable: false).Annotation("MySQL:ValueGenerationStrategy", MySQLValueGenerationStrategy.IdentityColumn), + Name = table.Column(type: "longtext", nullable: true), + Created = table.Column(type: "datetime", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Bug37462099", x => x.Id); + }) + .Annotation("MySQL:Charset", "utf8mb4"); + + migrationBuilder.RenameColumn( + name: "Name", + table: "Bug37462099", + newName: "ChangedName").Annotation("Relational:ColumnType", "LONGTEXT;"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Bug37462099"); + + migrationBuilder.RenameColumn( + name: "ChangedName", + table: "Bug37462099", + newName: "Name").Annotation("Relational:ColumnType", "LONGTEXT;"); + } + } +} diff --git a/EFCore/tests/MySql.EFCore.Migrations.Tests/Utilities/ContextUtils.cs b/EFCore/tests/MySql.EFCore.Migrations.Tests/Utilities/ContextUtils.cs new file mode 100644 index 000000000..813de5cde --- /dev/null +++ b/EFCore/tests/MySql.EFCore.Migrations.Tests/Utilities/ContextUtils.cs @@ -0,0 +1,90 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Metadata.Conventions.Infrastructure; +using Microsoft.Extensions.DependencyInjection; +using MySql.EntityFrameworkCore.Basic.Tests.Utils; +using MySql.EntityFrameworkCore.Extensions; +using System; + +namespace MySql.EntityFrameworkCore.Migrations.Tests.Utilities +{ + public class ContextUtils + { + protected ContextUtils() + { + } + public static ContextUtils Instance { get; } = new ContextUtils(); + + public DbContext CreateContext() => new DbContext(CreateOptions()); + + public IServiceProvider CreateContextServices() + => ((IInfrastructure)CreateContext()).Instance; + + private IServiceProvider CreateServiceProvider() + { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddEntityFrameworkMySQL(); + + return serviceCollection.BuildServiceProvider(); + + } + + protected virtual void UseProviderOptions(DbContextOptionsBuilder optionsBuilder) => optionsBuilder.UseMySQL(MySQLTestStore.BaseConnectionString); + + public DbContextOptions CreateOptions(IModel model) + { + var optionsBuilder = new DbContextOptionsBuilder(); + UseProviderOptions(optionsBuilder.UseModel(model)); + + return optionsBuilder.Options; + } + + public DbContextOptions CreateOptions() + { + var optionsBuilder = new DbContextOptionsBuilder(); + UseProviderOptions(optionsBuilder); + return optionsBuilder.Options; + } + + private ModelBuilder CreateConventionBuilder() + { + var contextServices = CreateContextServices(); + var modelBuilder = new ModelBuilder(contextServices.GetRequiredService().CreateConventionSet()); + contextServices.GetRequiredService().Initialize(modelBuilder.FinalizeModel()); + + return modelBuilder; + } + + public ModelBuilder CreateModelBuilder() => CreateConventionBuilder(); + + } +} diff --git a/EntityFramework/MySql.Data.EntityFramework.sln b/EntityFramework/MySql.Data.EntityFramework.sln new file mode 100644 index 000000000..de7d5db50 --- /dev/null +++ b/EntityFramework/MySql.Data.EntityFramework.sln @@ -0,0 +1,49 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26228.9 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MySql.Data.EntityFramework", "src\MySql.Data.EntityFramework.csproj", "{014A33CB-29B4-44F5-B1E6-F4638737C083}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MySql.Data", "..\MySQL.Data\src\MySql.Data.csproj", "{5B2B1F22-0C4C-4260-B806-2817AB1AF904}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MySql.EntityFramework.Basic.Tests", "tests\MySql.EntityFramework.Basic.Tests\MySql.EntityFramework.Basic.Tests.csproj", "{8B915A81-E17A-489D-9B4D-3AA5C2E72D9A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MySql.EntityFramework.CodeFirst.Tests", "tests\MySql.EntityFramework.CodeFirst.Tests\MySql.EntityFramework.CodeFirst.Tests.csproj", "{12009757-61C3-4C6C-953F-7A62A449E057}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MySql.EntityFramework.Migrations.Tests", "tests\MySql.EntityFramework.Migrations.Tests\MySql.EntityFramework.Migrations.Tests.csproj", "{8C750081-85B8-4111-A803-A11BF29AC7FF}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {014A33CB-29B4-44F5-B1E6-F4638737C083}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {014A33CB-29B4-44F5-B1E6-F4638737C083}.Debug|Any CPU.Build.0 = Debug|Any CPU + {014A33CB-29B4-44F5-B1E6-F4638737C083}.Release|Any CPU.ActiveCfg = Release|Any CPU + {014A33CB-29B4-44F5-B1E6-F4638737C083}.Release|Any CPU.Build.0 = Release|Any CPU + {5B2B1F22-0C4C-4260-B806-2817AB1AF904}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5B2B1F22-0C4C-4260-B806-2817AB1AF904}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5B2B1F22-0C4C-4260-B806-2817AB1AF904}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5B2B1F22-0C4C-4260-B806-2817AB1AF904}.Release|Any CPU.Build.0 = Release|Any CPU + {8B915A81-E17A-489D-9B4D-3AA5C2E72D9A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8B915A81-E17A-489D-9B4D-3AA5C2E72D9A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8B915A81-E17A-489D-9B4D-3AA5C2E72D9A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8B915A81-E17A-489D-9B4D-3AA5C2E72D9A}.Release|Any CPU.Build.0 = Release|Any CPU + {12009757-61C3-4C6C-953F-7A62A449E057}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {12009757-61C3-4C6C-953F-7A62A449E057}.Debug|Any CPU.Build.0 = Debug|Any CPU + {12009757-61C3-4C6C-953F-7A62A449E057}.Release|Any CPU.ActiveCfg = Release|Any CPU + {12009757-61C3-4C6C-953F-7A62A449E057}.Release|Any CPU.Build.0 = Release|Any CPU + {8C750081-85B8-4111-A803-A11BF29AC7FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8C750081-85B8-4111-A803-A11BF29AC7FF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8C750081-85B8-4111-A803-A11BF29AC7FF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8C750081-85B8-4111-A803-A11BF29AC7FF}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {8086A9BC-EBB3-411C-948E-00D8C55D9E16} + EndGlobalSection +EndGlobal diff --git a/Source/MySql.Data.Entity.EF6/App.config b/EntityFramework/src/App.config similarity index 100% rename from Source/MySql.Data.Entity.EF6/App.config rename to EntityFramework/src/App.config diff --git a/EntityFramework/src/EFMySqlCommand.cs b/EntityFramework/src/EFMySqlCommand.cs new file mode 100644 index 000000000..9fcb1a1c9 --- /dev/null +++ b/EntityFramework/src/EFMySqlCommand.cs @@ -0,0 +1,181 @@ +// Copyright © 2008, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Data; +using System.Data.Common; +using System.Data.Entity.Core.Metadata.Edm; + +namespace MySql.Data.EntityFramework +{ + class EFMySqlCommand : DbCommand, ICloneable + { + private bool designTimeVisible = true; + private DbConnection connection; + private MySqlCommand command = new MySqlCommand(); + + internal PrimitiveType[] ColumnTypes; + + #region Properties + + public override string CommandText + { + get { return command.CommandText; } + set { command.CommandText = value; } + } + + public override int CommandTimeout + { + get { return command.CommandTimeout; } + set { command.CommandTimeout = value; } + } + + public override CommandType CommandType + { + get { return command.CommandType; } + set { command.CommandType = value; } + } + + public override bool DesignTimeVisible + { + get { return designTimeVisible; } + set { designTimeVisible = value; } + } + + protected override DbConnection DbConnection + { + get { return connection; } + set + { + connection = value; + command.Connection = (MySqlConnection)value; + MySqlConnection _con = (MySqlConnection)connection; + if (_con.Settings.UseDefaultCommandTimeoutForEF) + { + command.CommandTimeout = (int)(_con.Settings.DefaultCommandTimeout); + } + } + } + + protected override DbTransaction DbTransaction + { + get { return command.Transaction; } + set { command.Transaction = (MySqlTransaction)value; } + } + + protected override DbParameterCollection DbParameterCollection + { + get { return command.Parameters; } + } + + public override UpdateRowSource UpdatedRowSource + { + get { return command.UpdatedRowSource; } + set { command.UpdatedRowSource = value; } + } + + #endregion + + public override void Cancel() + { + command.Cancel(); + } + + protected override DbParameter CreateDbParameter() + { + return new MySqlParameter(); + } + + protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior) + { + return new EFMySqlDataReader(this, command.ExecuteReader(behavior)); + } + + public override int ExecuteNonQuery() + { + return command.ExecuteNonQuery(); + } + + public override object ExecuteScalar() + { + return command.ExecuteScalar(); + } + + public override void Prepare() + { + command.Prepare(); + } + + #region ICloneable Members + + public object Clone() + { + EFMySqlCommand clone = new EFMySqlCommand(); + + clone.connection = connection; + clone.ColumnTypes = ColumnTypes; + clone.command = (MySqlCommand)((ICloneable)command).Clone(); + + return clone; + } + + #endregion + + /// + /// Async version of Prepare + /// + /// Information about the task executed. + //public Task PrepareAsync() + //{ + // return PrepareAsync(CancellationToken.None); + //} + + //public Task PrepareAsync(CancellationToken cancellationToken) + //{ + // var result = new TaskCompletionSource(); + // if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + // { + // try + // { + // Prepare(); + // result.SetResult(true); + // } + // catch (Exception ex) + // { + // result.SetException(ex); + // } + // } + // else + // { + // result.SetCanceled(); + // } + // return result.Task; + //} + } +} diff --git a/Source/MySql.Data.Entity.EF6/EFMySqlDataReader.cs b/EntityFramework/src/EFMySqlDataReader.cs similarity index 81% rename from Source/MySql.Data.Entity.EF6/EFMySqlDataReader.cs rename to EntityFramework/src/EFMySqlDataReader.cs index fde2cd2dd..68d923bf4 100644 --- a/Source/MySql.Data.Entity.EF6/EFMySqlDataReader.cs +++ b/EntityFramework/src/EFMySqlDataReader.cs @@ -1,277 +1,273 @@ -// Copyright © 2008, 2013, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Data.Common; -using MySql.Data.MySqlClient; -using System.Collections; -using System.Data; -using System.Globalization; -using System.Text; -using MySql.Data.Types; -#if EF6 -using System.Data.Entity.Core.Metadata.Edm; -using System.Data.Entity.Spatial; -#else -using System.Data.Metadata.Edm; -#if NET_45_OR_GREATER -using System.Data.Spatial; -#endif -#endif - - -namespace MySql.Data.Entity -{ - class EFMySqlDataReader : DbDataReader - { - private EFMySqlCommand command; - private MySqlDataReader reader; - private PrimitiveType[] types; - - public EFMySqlDataReader(EFMySqlCommand cmd, MySqlDataReader wrappedReader) - { - command = cmd; - reader = wrappedReader; - types = command.ColumnTypes; - } - - #region Properties - - public override int Depth - { - get { return reader.Depth; } - } - - public override int FieldCount - { - get { return reader.FieldCount; } - } - - public override bool HasRows - { - get { return reader.HasRows; } - } - - public override bool IsClosed - { - get { return reader.IsClosed; } - } - - public override int RecordsAffected - { - get { return reader.RecordsAffected; } - } - - public override object this[string name] - { - get { return GetValue(GetOrdinal(name)); } - } - - public override object this[int ordinal] - { - get { return GetValue(ordinal); } - } - - #endregion - - public override void Close() - { - GC.SuppressFinalize(this); - reader.Close(); - } - - public override bool GetBoolean(int ordinal) - { - return (bool)GetValue(ordinal); - } - - public override byte GetByte(int ordinal) - { - return reader.GetByte(ordinal); - } - - public override long GetBytes(int ordinal, long dataOffset, byte[] buffer, int bufferOffset, int length) - { - return reader.GetBytes(ordinal, dataOffset, buffer, bufferOffset, length); - } - - public override char GetChar(int ordinal) - { - return reader.GetChar(ordinal); - } - - public override long GetChars(int ordinal, long dataOffset, char[] buffer, int bufferOffset, int length) - { - return reader.GetChars(ordinal, dataOffset, buffer, bufferOffset, length); - } - - public override string GetDataTypeName(int ordinal) - { - if (types != null) - return types[ordinal].Name; - return reader.GetDataTypeName(ordinal); - } - - public override DateTime GetDateTime(int ordinal) - { - return reader.GetDateTime(ordinal); - } - - public override decimal GetDecimal(int ordinal) - { - return reader.GetDecimal(ordinal); - } - - public override double GetDouble(int ordinal) - { - return reader.GetDouble(ordinal); - } - - public override IEnumerator GetEnumerator() - { - return reader.GetEnumerator(); - } - - public override Type GetFieldType(int ordinal) - { - if (types != null) - return types[ordinal].ClrEquivalentType; - return reader.GetFieldType(ordinal); - } - - public override float GetFloat(int ordinal) - { - return reader.GetFloat(ordinal); - } - - public override Guid GetGuid(int ordinal) - { - return reader.GetGuid(ordinal); - } - - public override short GetInt16(int ordinal) - { - return reader.GetInt16(ordinal); - } - - public override int GetInt32(int ordinal) - { - return reader.GetInt32(ordinal); - } - - public override long GetInt64(int ordinal) - { - return reader.GetInt64(ordinal); - } - - public override string GetName(int ordinal) - { - return reader.GetName(ordinal); - } - - public override int GetOrdinal(string name) - { - return reader.GetOrdinal(name); - } - - public override DataTable GetSchemaTable() - { - return reader.GetSchemaTable(); - } - - public override string GetString(int ordinal) - { - return reader.GetString(ordinal); - } - - public override object GetValue(int ordinal) - { - object value = reader.GetValue(ordinal); - - if (types != null) - { - if (!(value is DBNull) && value.GetType() - != types[ordinal].ClrEquivalentType) - value = ChangeType(value, types[ordinal].ClrEquivalentType); - } - return value; - } - - private object ChangeType(object sourceValue, Type targetType) - { - if (sourceValue is byte[]) - { - if (targetType == typeof(Guid)) - return new Guid((byte[])sourceValue); - else if (targetType == typeof(bool)) - { - byte[] bytes = (byte[])sourceValue; - return bytes[0] == '1'; - } - } - - if (sourceValue is DateTime && targetType == typeof(DateTimeOffset)) - { - return new DateTimeOffset((DateTime)sourceValue); - } -#if NET_45_OR_GREATER - if (sourceValue is Byte[] && targetType == typeof(DbGeometry)) - { - return new MySqlGeometry(MySqlDbType.Geometry, sourceValue as Byte[]); - } -#endif - - return Convert.ChangeType(sourceValue, targetType, CultureInfo.InvariantCulture); - } - - public override int GetValues(object[] values) - { - for (int i = 0; i < values.Length; ++i) - values[i] = GetValue(i); - return values.Length; - } - - public override bool IsDBNull(int ordinal) - { - return reader.IsDBNull(ordinal); - } - - public override bool NextResult() - { - return reader.NextResult(); - } - - public override bool Read() - { - return reader.Read(); - } - - protected override void Dispose(bool disposing) - { - GC.SuppressFinalize(this); - if (disposing) - reader.Dispose(); - base.Dispose(disposing); - } - - } -} +// Copyright © 2008, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Data.Common; +using MySql.Data.MySqlClient; +using System.Collections; +using System.Data; +using System.Globalization; +using System.Data.Entity.Core.Metadata.Edm; +using System.Data.Entity.Spatial; +using MySql.Data.Types; + +namespace MySql.Data.EntityFramework +{ + class EFMySqlDataReader : DbDataReader + { + private EFMySqlCommand command; + private MySqlDataReader reader; + private PrimitiveType[] types; + + public EFMySqlDataReader(EFMySqlCommand cmd, MySqlDataReader wrappedReader) + { + command = cmd; + reader = wrappedReader; + types = command.ColumnTypes; + } + + #region Properties + + public override int Depth + { + get { return reader.Depth; } + } + + public override int FieldCount + { + get { return reader.FieldCount; } + } + + public override bool HasRows + { + get { return reader.HasRows; } + } + + public override bool IsClosed + { + get { return reader.IsClosed; } + } + + public override int RecordsAffected + { + get { return reader.RecordsAffected; } + } + + public override object this[string name] + { + get { return GetValue(GetOrdinal(name)); } + } + + public override object this[int ordinal] + { + get { return GetValue(ordinal); } + } + + #endregion + + public override void Close() + { + GC.SuppressFinalize(this); + reader.Close(); + } + + public override bool GetBoolean(int ordinal) + { + return (bool)GetValue(ordinal); + } + + public override byte GetByte(int ordinal) + { + return reader.GetByte(ordinal); + } + + public override long GetBytes(int ordinal, long dataOffset, byte[] buffer, int bufferOffset, int length) + { + return reader.GetBytes(ordinal, dataOffset, buffer, bufferOffset, length); + } + + public override char GetChar(int ordinal) + { + return reader.GetChar(ordinal); + } + + public override long GetChars(int ordinal, long dataOffset, char[] buffer, int bufferOffset, int length) + { + return reader.GetChars(ordinal, dataOffset, buffer, bufferOffset, length); + } + + public override string GetDataTypeName(int ordinal) + { + if (types != null) + return types[ordinal].Name; + return reader.GetDataTypeName(ordinal); + } + + public override DateTime GetDateTime(int ordinal) + { + return reader.GetDateTime(ordinal); + } + + public override decimal GetDecimal(int ordinal) + { + return reader.GetDecimal(ordinal); + } + + public override double GetDouble(int ordinal) + { + return reader.GetDouble(ordinal); + } + + public override IEnumerator GetEnumerator() + { + return reader.GetEnumerator(); + } + + public override Type GetFieldType(int ordinal) + { + if (types != null) + return types[ordinal].ClrEquivalentType; + return reader.GetFieldType(ordinal); + } + + public override float GetFloat(int ordinal) + { + return reader.GetFloat(ordinal); + } + + public override Guid GetGuid(int ordinal) + { + return reader.GetGuid(ordinal); + } + + public override short GetInt16(int ordinal) + { + return reader.GetInt16(ordinal); + } + + public override int GetInt32(int ordinal) + { + return reader.GetInt32(ordinal); + } + + public override long GetInt64(int ordinal) + { + return reader.GetInt64(ordinal); + } + + public override string GetName(int ordinal) + { + return reader.GetName(ordinal); + } + + public override int GetOrdinal(string name) + { + return reader.GetOrdinal(name); + } + + public override DataTable GetSchemaTable() + { + return reader.GetSchemaTable(); + } + + public override string GetString(int ordinal) + { + return reader.GetString(ordinal); + } + + public override object GetValue(int ordinal) + { + object value = reader.GetValue(ordinal); + + if (types != null) + { + if (!(value is DBNull) && value.GetType() + != types[ordinal].ClrEquivalentType) + value = ChangeType(value, types[ordinal].ClrEquivalentType); + } + return value; + } + + private object ChangeType(object sourceValue, Type targetType) + { + if (sourceValue is byte[]) + { + if (targetType == typeof(Guid)) + return new Guid((byte[])sourceValue); + else if (targetType == typeof(bool)) + { + byte[] bytes = (byte[])sourceValue; + return bytes[0] == '1'; + } + } + + if (sourceValue is DateTime && targetType == typeof(DateTimeOffset)) + { + return new DateTimeOffset((DateTime)sourceValue); + } + + if (sourceValue is Byte[] && targetType == typeof(DbGeometry)) + { + return new MySqlGeometry(MySqlDbType.Geometry, sourceValue as Byte[]); + } + + return Convert.ChangeType(sourceValue, targetType, CultureInfo.InvariantCulture); + } + + public override int GetValues(object[] values) + { + for (int i = 0; i < values.Length; ++i) + values[i] = GetValue(i); + return values.Length; + } + + public override bool IsDBNull(int ordinal) + { + return reader.IsDBNull(ordinal); + } + + public override bool NextResult() + { + return reader.NextResult(); + } + + public override bool Read() + { + return reader.Read(); + } + + protected override void Dispose(bool disposing) + { + GC.SuppressFinalize(this); + if (disposing) + reader.Dispose(); + base.Dispose(disposing); + } + + } +} diff --git a/EntityFramework/src/Fragments/InputFragment.cs b/EntityFramework/src/Fragments/InputFragment.cs new file mode 100644 index 000000000..f55461249 --- /dev/null +++ b/EntityFramework/src/Fragments/InputFragment.cs @@ -0,0 +1,102 @@ +// Copyright © 2008, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace MySql.Data.EntityFramework +{ + abstract class InputFragment : SqlFragment + { + // not all input classes will support two inputs but union and join do + // in cases where only one input is used, Left is it + public InputFragment Left; + public InputFragment Right; + + public InputFragment() + { + } + + public InputFragment(string name) + { + Name = name; + } + + public string Name { get; set; } + public bool IsWrapped { get; private set; } + public bool Scoped { get; set; } + + public virtual void Wrap(Scope scope) + { + IsWrapped = true; + Scoped = true; + + if (scope == null) return; + if (Left != null) + scope.Remove(Left); + if (Right != null) + scope.Remove(Right); + } + + public virtual void WriteInnerSql(StringBuilder sql) + { + } + + public override void WriteSql(StringBuilder sql) + { + if (IsWrapped) + sql.Append("("); + WriteInnerSql(sql); + if (IsWrapped) + sql.Append(")"); + if (Name == null) return; + if (this is TableFragment || + (IsWrapped && !(this is JoinFragment))) + sql.AppendFormat(" AS {0}", QuoteIdentifier(Name)); + } + + public ColumnFragment GetColumnFromProperties(PropertyFragment properties) + { + ColumnFragment col = Left.GetColumnFromProperties(properties); + if (col == null) + col = Right.GetColumnFromProperties(properties); + return col; + } + + internal override void Accept(SqlFragmentVisitor visitor) + { + if (Left != null) + Left.Accept(visitor); + if (Right != null) + Right.Accept(visitor); + } + } +} + diff --git a/EntityFramework/src/Fragments/JoinFragment.cs b/EntityFramework/src/Fragments/JoinFragment.cs new file mode 100644 index 000000000..dde7a8608 --- /dev/null +++ b/EntityFramework/src/Fragments/JoinFragment.cs @@ -0,0 +1,68 @@ +// Copyright © 2008, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Text; +using System.Diagnostics; + +namespace MySql.Data.EntityFramework +{ + class JoinFragment : InputFragment + { + public SqlFragment Condition; + public string JoinType; + + public override void WriteInnerSql(StringBuilder sql) + { + Left.WriteSql(sql); + sql.AppendFormat(" {0} ", JoinType); + Right.WriteSql(sql); + if (Condition != null) + { + sql.Append(" ON "); + Condition.WriteSql(sql); + } + } + + //public override void WriteSql(StringBuilder sql) + //{ + // // we don't want our join to write out its name + // string name = Name; + // Name = null; + // base.WriteSql(sql); + // Name = name; + //} + + internal override void Accept(SqlFragmentVisitor visitor) + { + base.Accept(visitor); + if (Condition != null) + Condition.Accept(visitor); + visitor.Visit(this); + } + } +} diff --git a/Source/MySql.Data.Entity.EF6/Fragments/SqlFragment.cs b/EntityFramework/src/Fragments/SqlFragment.cs similarity index 88% rename from Source/MySql.Data.Entity.EF6/Fragments/SqlFragment.cs rename to EntityFramework/src/Fragments/SqlFragment.cs index 1ed77cc25..1e16b734f 100644 --- a/Source/MySql.Data.Entity.EF6/Fragments/SqlFragment.cs +++ b/EntityFramework/src/Fragments/SqlFragment.cs @@ -1,23 +1,29 @@ -// Copyright © 2008, 2015, Oracle and/or its affiliates. All rights reserved. +// Copyright © 2008, 2025, Oracle and/or its affiliates. // -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. // -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. // -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. // -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., // 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA using System; @@ -26,7 +32,7 @@ using System.Collections; using System.Diagnostics; -namespace MySql.Data.Entity +namespace MySql.Data.EntityFramework { internal abstract class SqlFragment { @@ -262,6 +268,23 @@ internal class CaseFragment : SqlFragment public override void WriteSql(StringBuilder sql) { sql.Append("CASE"); + + // If CASE clause contains an IS NULL value in WHEN statement and has an Else statement, negate WHEN and invert the CASE, + // otherwise THEN statement will not be considered and the value will be set to NULL. + if (When.Count == 1 && When[0] is IsNullFragment && !(((NegatableFragment)When[0]).IsNegated) && Else != null) + { + sql.Append(" WHEN ("); + ((NegatableFragment)When[0]).IsNegated = true; + When[0].WriteSql(sql); + sql.Append(") THEN ("); + Else.WriteSql(sql); + sql.Append(") "); + sql.Append(" ELSE ("); + Then[0].WriteSql(sql); + sql.Append(") "); + } + else + { for (int i = 0; i < When.Count; i++) { sql.Append(" WHEN ("); @@ -276,6 +299,8 @@ public override void WriteSql(StringBuilder sql) Else.WriteSql(sql); sql.Append(") "); } + } + sql.Append("END"); } diff --git a/EntityFramework/src/Fragments/TableFragment.cs b/EntityFramework/src/Fragments/TableFragment.cs new file mode 100644 index 000000000..a0371d500 --- /dev/null +++ b/EntityFramework/src/Fragments/TableFragment.cs @@ -0,0 +1,71 @@ +// Copyright © 2008, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Collections.Generic; +using System.Data.Entity.Core.Metadata.Edm; +using System.Text; + +namespace MySql.Data.EntityFramework +{ + class TableFragment : InputFragment + { + public string Schema; + public string Table; + public SqlFragment DefiningQuery; + public TypeUsage Type; + public List Columns; + + public TableFragment() + { + Scoped = true; + } + + public override void WriteSql(StringBuilder sql) + { + if (DefiningQuery != null) + sql.AppendFormat("({0})", DefiningQuery); + else + sql.AppendFormat("{0}", + string.IsNullOrWhiteSpace(Schema) || Schema.Equals("dbo", System.StringComparison.OrdinalIgnoreCase) + ? QuoteIdentifier(Table) : QuoteIdentifier($"{Schema}.{Table}")); + base.WriteSql(sql); + } + + internal override void Accept(SqlFragmentVisitor visitor) + { + if (Columns != null) + { + foreach (ColumnFragment cf in Columns) + { + cf.Accept(visitor); + } + } + visitor.Visit(this); + } + } +} diff --git a/EntityFramework/src/Generators/DeleteGenerator.cs b/EntityFramework/src/Generators/DeleteGenerator.cs new file mode 100644 index 000000000..d23018443 --- /dev/null +++ b/EntityFramework/src/Generators/DeleteGenerator.cs @@ -0,0 +1,49 @@ +// Copyright © 2008, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Data.Entity.Core.Common.CommandTrees; + +namespace MySql.Data.EntityFramework +{ + class DeleteGenerator : SqlGenerator + { + public override string GenerateSQL(DbCommandTree tree) + { + DbDeleteCommandTree commandTree = tree as DbDeleteCommandTree; + + DeleteStatement statement = new DeleteStatement(); + + statement.Target = commandTree.Target.Expression.Accept(this); + scope.Add("target", statement.Target as InputFragment); + + statement.Where = commandTree.Predicate.Accept(this); + + return statement.ToString(); + } + } +} diff --git a/EntityFramework/src/Generators/FunctionGenerator.cs b/EntityFramework/src/Generators/FunctionGenerator.cs new file mode 100644 index 000000000..b5f9f6197 --- /dev/null +++ b/EntityFramework/src/Generators/FunctionGenerator.cs @@ -0,0 +1,67 @@ +// Copyright © 2008, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Data; +using System.Data.Entity.Core.Common.CommandTrees; +using System.Data.Entity.Core.Metadata.Edm; + + +namespace MySql.Data.EntityFramework +{ + class FunctionGenerator : SqlGenerator + { + public CommandType CommandType { get; private set; } + + public override string GenerateSQL(DbCommandTree commandTree) + { + DbFunctionCommandTree tree = (commandTree as DbFunctionCommandTree); + EdmFunction function = tree.EdmFunction; + CommandType = CommandType.StoredProcedure; + + string cmdText = (string)function.MetadataProperties["CommandTextAttribute"].Value; + if (String.IsNullOrEmpty(cmdText)) + { + string schema = (string)function.MetadataProperties["Schema"].Value; + if (String.IsNullOrEmpty(schema)) + schema = function.NamespaceName; + + string functionName = (string)function.MetadataProperties["StoreFunctionNameAttribute"].Value; + if (String.IsNullOrEmpty(functionName)) + functionName = function.Name; + + return String.Format("`{0}`", functionName); + } + else + { + CommandType = CommandType.Text; + return cmdText; + } + } + } +} diff --git a/Source/MySql.Data.Entity.EF6/Generators/FunctionProcessor.cs b/EntityFramework/src/Generators/FunctionProcessor.cs similarity index 84% rename from Source/MySql.Data.Entity.EF6/Generators/FunctionProcessor.cs rename to EntityFramework/src/Generators/FunctionProcessor.cs index 22fe06e1b..0db93eafa 100644 --- a/Source/MySql.Data.Entity.EF6/Generators/FunctionProcessor.cs +++ b/EntityFramework/src/Generators/FunctionProcessor.cs @@ -1,213 +1,214 @@ -// Copyright © 2008, 2013, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Diagnostics; -#if EF6 -using System.Data.Entity.Core.Common.CommandTrees; -#else -using System.Data.Common.CommandTrees; -#endif - - -namespace MySql.Data.Entity -{ - class FunctionProcessor - { - private static readonly Dictionary bitwiseFunctions = - new Dictionary(); - private static readonly Dictionary dateFunctions = - new Dictionary(); - private static readonly Dictionary stringFunctions = - new Dictionary(); - private static readonly Dictionary mathFunctions = - new Dictionary(); - - private static readonly Dictionary geoFunctions = - new Dictionary(); - - private SqlGenerator callingGenerator; - - static FunctionProcessor() - { - bitwiseFunctions.Add("BitwiseAnd", "&"); - bitwiseFunctions.Add("BitwiseNot", "!"); - bitwiseFunctions.Add("BitwiseOr", "|"); - bitwiseFunctions.Add("BitwiseXor", "^"); - - dateFunctions.Add("CurrentDateTime", "NOW()"); - dateFunctions.Add("Year", "YEAR({0})"); - dateFunctions.Add("Month", "MONTH({0})"); - dateFunctions.Add("Day", "DAY({0})"); - dateFunctions.Add("Hour", "HOUR({0})"); - dateFunctions.Add("Minute", "MINUTE({0})"); - dateFunctions.Add("Second", "SECOND({0})"); - - stringFunctions.Add("Concat", "CONCAT({0}, {1})"); - stringFunctions.Add("IndexOf", "LOCATE({0}, {1})"); - stringFunctions.Add("Left", "LEFT({0}, {1})"); - stringFunctions.Add("Length", "LENGTH({0})"); - stringFunctions.Add("LTrim", "LTRIM({0})"); - stringFunctions.Add("Replace", "REPLACE({0}, {1}, {2})"); - stringFunctions.Add("Reverse", "REVERSE({0})"); - stringFunctions.Add("Right", "RIGHT({0}, {1})"); - stringFunctions.Add("RTrim", "RTRIM({0})"); - stringFunctions.Add("Substring", "SUBSTR({0}, {1}, {2})"); - stringFunctions.Add("ToLower", "LOWER({0})"); - stringFunctions.Add("ToUpper", "UPPER({0})"); - stringFunctions.Add("Trim", "TRIM({0})"); - - mathFunctions.Add("Abs", "ABS({0})"); - mathFunctions.Add("Ceiling", "CEILING({0})"); - mathFunctions.Add("Floor", "FLOOR({0})"); - mathFunctions.Add("Round", "ROUND"); - - geoFunctions.Add("SpatialDimension", "Dimension({0})"); - geoFunctions.Add("SpatialEnvelope", "Envelope({0})"); - geoFunctions.Add("IsSimpleGeometry", "IsSimple({0})"); - geoFunctions.Add("SpatialTypeName", "GeometryType({0})"); - geoFunctions.Add("CoordinateSystemId", "SRID({0})"); - geoFunctions.Add("Point", "POINT({0}, {1})"); - geoFunctions.Add("XCoordinate", "X({0})"); - geoFunctions.Add("YCoordinate", "Y({0})"); - geoFunctions.Add("GeometryFromText", "GeomFromText({0})"); - geoFunctions.Add("SpatialContains", "MBRContains({0}, {1})"); - geoFunctions.Add("AsText", "AsText({0})"); - geoFunctions.Add("SpatialBuffer", "Buffer({0}, {1})"); - geoFunctions.Add("SpatialDifference", "Difference({0}, {1})"); - geoFunctions.Add("SpatialIntersection", "Intersection({0},{1})"); - geoFunctions.Add("Distance", "GLength(LineString(GEOMFROMWKB(ASBINARY({0})), GEOMFROMWKB(ASBINARY({1}))))"); - - } - - public SqlFragment Generate(DbFunctionExpression e, SqlGenerator caller) - { - callingGenerator = caller; - if (bitwiseFunctions.ContainsKey(e.Function.Name)) - return BitwiseFunction(e); - else if (dateFunctions.ContainsKey(e.Function.Name)) - return GenericFunction(dateFunctions, e); - else if (stringFunctions.ContainsKey(e.Function.Name)) - return GenericFunction(stringFunctions, e); - else if (mathFunctions.ContainsKey(e.Function.Name)) - return GenericFunction(mathFunctions, e); - else if (geoFunctions.ContainsKey(e.Function.Name)) - return GenericFunction(geoFunctions, e); - else - return UserDefinedFunction(e); - } - - private SqlFragment UserDefinedFunction(DbFunctionExpression e) - { - FunctionFragment f = new FunctionFragment(); - f.Name = Metadata.TryGetValueMetadataProperty(e.Function, - "StoreFunctionNameAttribute"); - - if (String.IsNullOrEmpty(f.Name)) - f.Name = e.Function.Name; - - f.Quoted = !Metadata.TryGetValueMetadataProperty(e.Function, "BuiltInAttribute"); - - bool isFuncNiladic = Metadata.TryGetValueMetadataProperty(e.Function, "NiladicFunctionAttribute"); - if (isFuncNiladic && e.Arguments.Count > 0) - throw new InvalidOperationException("Niladic functions cannot have parameters"); - - ListFragment list = new ListFragment(); - string delimiter = ""; - foreach (DbExpression arg in e.Arguments) - { - if (delimiter.Length > 0) - list.Append(new LiteralFragment(delimiter)); - list.Append(arg.Accept(callingGenerator)); - delimiter = ", "; - } - f.Argument = list; - - return f; - } - - private SqlFragment BitwiseFunction(DbFunctionExpression e) - { - StringBuilder sql = new StringBuilder(); - - int arg = 0; - if (e.Arguments.Count > 1) - sql.AppendFormat("({0})", e.Arguments[arg++].Accept(callingGenerator)); - - sql.AppendFormat(" {0} ({1})", bitwiseFunctions[e.Function.Name], - e.Arguments[arg].Accept(callingGenerator)); - return new LiteralFragment(sql.ToString()); - } - - private SqlFragment GenericFunction(Dictionary funcs, - DbFunctionExpression e) - { - SqlFragment[] frags = new SqlFragment[e.Arguments.Count]; - - for (int i = 0; i < e.Arguments.Count; i++) - frags[i] = e.Arguments[i].Accept(callingGenerator); - - string sql; - - switch (e.Function.Name) - { - case "Round": - // Special handling for Round as it has more than one signature. - sql = HandleFunctionRound(e); - break; - default: - sql = String.Format(funcs[e.Function.Name], frags); - break; - } - - return new LiteralFragment(sql); - } - - private string HandleFunctionRound(DbFunctionExpression e) - { - StringBuilder sqlBuilder = new StringBuilder(); - - sqlBuilder.Append(mathFunctions[e.Function.Name]); - sqlBuilder.Append("("); - - Debug.Assert(e.Arguments.Count <= 2, "Round should have at most 2 arguments"); - sqlBuilder.Append(e.Arguments[0].Accept(callingGenerator)); - sqlBuilder.Append(", "); - - if (e.Arguments.Count > 1) - { - sqlBuilder.Append(e.Arguments[1].Accept(callingGenerator)); - } - else - { - sqlBuilder.Append("0"); - } - - sqlBuilder.Append(")"); - - return sqlBuilder.ToString(); - } - } -} +// Copyright © 2008, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Text; +using System.Diagnostics; +using System.Data.Entity.Core.Common.CommandTrees; + + +namespace MySql.Data.EntityFramework +{ + class FunctionProcessor + { + private static readonly Dictionary bitwiseFunctions = + new Dictionary(); + private static readonly Dictionary dateFunctions = + new Dictionary(); + private static readonly Dictionary stringFunctions = + new Dictionary(); + private static readonly Dictionary mathFunctions = + new Dictionary(); + + private static readonly Dictionary geoFunctions = + new Dictionary(); + + private SqlGenerator callingGenerator; + + static FunctionProcessor() + { + bitwiseFunctions.Add("BitwiseAnd", "&"); + bitwiseFunctions.Add("BitwiseNot", "!"); + bitwiseFunctions.Add("BitwiseOr", "|"); + bitwiseFunctions.Add("BitwiseXor", "^"); + + dateFunctions.Add("CurrentDateTime", "NOW()"); + dateFunctions.Add("Year", "YEAR({0})"); + dateFunctions.Add("Month", "MONTH({0})"); + dateFunctions.Add("Day", "DAY({0})"); + dateFunctions.Add("Hour", "HOUR({0})"); + dateFunctions.Add("Minute", "MINUTE({0})"); + dateFunctions.Add("Second", "SECOND({0})"); + + stringFunctions.Add("Concat", "CONCAT({0}, {1})"); + stringFunctions.Add("IndexOf", "LOCATE({0}, {1})"); + stringFunctions.Add("Left", "LEFT({0}, {1})"); + stringFunctions.Add("Length", "LENGTH({0})"); + stringFunctions.Add("LTrim", "LTRIM({0})"); + stringFunctions.Add("Replace", "REPLACE({0}, {1}, {2})"); + stringFunctions.Add("Reverse", "REVERSE({0})"); + stringFunctions.Add("Right", "RIGHT({0}, {1})"); + stringFunctions.Add("RTrim", "RTRIM({0})"); + stringFunctions.Add("Substring", "SUBSTR({0}, {1}, {2})"); + stringFunctions.Add("ToLower", "LOWER({0})"); + stringFunctions.Add("ToUpper", "UPPER({0})"); + stringFunctions.Add("Trim", "TRIM({0})"); + + mathFunctions.Add("Abs", "ABS({0})"); + mathFunctions.Add("Ceiling", "CEILING({0})"); + mathFunctions.Add("Floor", "FLOOR({0})"); + mathFunctions.Add("Round", "ROUND"); + + geoFunctions.Add("SpatialDimension", "Dimension({0})"); + geoFunctions.Add("SpatialEnvelope", "Envelope({0})"); + geoFunctions.Add("IsSimpleGeometry", "IsSimple({0})"); + geoFunctions.Add("SpatialTypeName", "GeometryType({0})"); + geoFunctions.Add("CoordinateSystemId", "ST_SRID({0})"); + geoFunctions.Add("Point", "POINT({0}, {1})"); + geoFunctions.Add("XCoordinate", "X({0})"); + geoFunctions.Add("YCoordinate", "Y({0})"); + geoFunctions.Add("GeometryFromText", "GeomFromText({0})"); + geoFunctions.Add("SpatialContains", "MBRContains({0}, {1})"); + geoFunctions.Add("AsText", "AsText({0})"); + geoFunctions.Add("SpatialBuffer", "Buffer({0}, {1})"); + geoFunctions.Add("SpatialDifference", "Difference({0}, {1})"); + geoFunctions.Add("SpatialIntersection", "Intersection({0},{1})"); + geoFunctions.Add("Distance", "GLength(LineString(GEOMFROMWKB(ASBINARY({0})), GEOMFROMWKB(ASBINARY({1}))))"); + + } + + public SqlFragment Generate(DbFunctionExpression e, SqlGenerator caller) + { + callingGenerator = caller; + if (bitwiseFunctions.ContainsKey(e.Function.Name)) + return BitwiseFunction(e); + else if (dateFunctions.ContainsKey(e.Function.Name)) + return GenericFunction(dateFunctions, e); + else if (stringFunctions.ContainsKey(e.Function.Name)) + return GenericFunction(stringFunctions, e); + else if (mathFunctions.ContainsKey(e.Function.Name)) + return GenericFunction(mathFunctions, e); + else if (geoFunctions.ContainsKey(e.Function.Name)) + return GenericFunction(geoFunctions, e); + else + return UserDefinedFunction(e); + } + + private SqlFragment UserDefinedFunction(DbFunctionExpression e) + { + FunctionFragment f = new FunctionFragment(); + f.Name = Metadata.TryGetValueMetadataProperty(e.Function, + "StoreFunctionNameAttribute"); + + if (String.IsNullOrEmpty(f.Name)) + f.Name = e.Function.Name; + + f.Quoted = !Metadata.TryGetValueMetadataProperty(e.Function, "BuiltInAttribute"); + + bool isFuncNiladic = Metadata.TryGetValueMetadataProperty(e.Function, "NiladicFunctionAttribute"); + if (isFuncNiladic && e.Arguments.Count > 0) + throw new InvalidOperationException("Niladic functions cannot have parameters"); + + ListFragment list = new ListFragment(); + string delimiter = ""; + foreach (DbExpression arg in e.Arguments) + { + if (delimiter.Length > 0) + list.Append(new LiteralFragment(delimiter)); + list.Append(arg.Accept(callingGenerator)); + delimiter = ", "; + } + f.Argument = list; + + return f; + } + + private SqlFragment BitwiseFunction(DbFunctionExpression e) + { + StringBuilder sql = new StringBuilder(); + + int arg = 0; + if (e.Arguments.Count > 1) + sql.AppendFormat("({0})", e.Arguments[arg++].Accept(callingGenerator)); + + sql.AppendFormat(" {0} ({1})", bitwiseFunctions[e.Function.Name], + e.Arguments[arg].Accept(callingGenerator)); + return new LiteralFragment(sql.ToString()); + } + + private SqlFragment GenericFunction(Dictionary funcs, + DbFunctionExpression e) + { + SqlFragment[] frags = new SqlFragment[e.Arguments.Count]; + + for (int i = 0; i < e.Arguments.Count; i++) + frags[i] = e.Arguments[i].Accept(callingGenerator); + + string sql; + + switch (e.Function.Name) + { + case "Round": + // Special handling for Round as it has more than one signature. + sql = HandleFunctionRound(e); + break; + default: + sql = String.Format(funcs[e.Function.Name], frags); + break; + } + + return new LiteralFragment(sql); + } + + private string HandleFunctionRound(DbFunctionExpression e) + { + StringBuilder sqlBuilder = new StringBuilder(); + + sqlBuilder.Append(mathFunctions[e.Function.Name]); + sqlBuilder.Append("("); + + Debug.Assert(e.Arguments.Count <= 2, "Round should have at most 2 arguments"); + sqlBuilder.Append(e.Arguments[0].Accept(callingGenerator)); + sqlBuilder.Append(", "); + + if (e.Arguments.Count > 1) + { + sqlBuilder.Append(e.Arguments[1].Accept(callingGenerator)); + } + else + { + sqlBuilder.Append("0"); + } + + sqlBuilder.Append(")"); + + return sqlBuilder.ToString(); + } + } +} diff --git a/EntityFramework/src/Generators/InsertGenerator.cs b/EntityFramework/src/Generators/InsertGenerator.cs new file mode 100644 index 000000000..9dda3075a --- /dev/null +++ b/EntityFramework/src/Generators/InsertGenerator.cs @@ -0,0 +1,114 @@ +// Copyright © 2008, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Collections.Generic; +using System; +using System.Data.Entity.Core.Common.CommandTrees; +using System.Data.Entity.Core.Metadata.Edm; + + +namespace MySql.Data.EntityFramework +{ + class InsertGenerator : SqlGenerator + { + public override string GenerateSQL(DbCommandTree tree) + { + DbInsertCommandTree commandTree = tree as DbInsertCommandTree; + + InsertStatement statement = new InsertStatement(); + + DbExpressionBinding e = commandTree.Target; + statement.Target = (InputFragment)e.Expression.Accept(this); + + scope.Add("target", statement.Target); + + foreach (DbSetClause setClause in commandTree.SetClauses) + statement.Sets.Add(setClause.Property.Accept(this)); + + if (values == null) + values = new Dictionary(); + + foreach (DbSetClause setClause in commandTree.SetClauses) + { + DbExpression value = setClause.Value; + SqlFragment valueFragment = value.Accept(this); + statement.Values.Add(valueFragment); + + if (value.ExpressionKind != DbExpressionKind.Null) + { + EdmMember property = ((DbPropertyExpression)setClause.Property).Property; + values.Add(property, valueFragment); + } + } + + if (commandTree.Returning != null) + statement.ReturningSelect = GenerateReturningSql(commandTree, commandTree.Returning); + + return statement.ToString(); + } + + protected virtual SelectStatement GenerateReturningSql(DbModificationCommandTree tree, DbExpression returning) + { + SelectStatement select = base.GenerateReturningSql(tree, returning); + + ListFragment where = new ListFragment(); + + EntitySetBase table = ((DbScanExpression)tree.Target.Expression).Target; + bool foundIdentity = false; + where.Append(" row_count() > 0"); + foreach (EdmMember keyMember in table.ElementType.KeyMembers) + { + SqlFragment value; + if (!values.TryGetValue(keyMember, out value)) + { + if (foundIdentity) + throw new NotSupportedException(); + foundIdentity = true; + PrimitiveTypeKind type = ((PrimitiveType)keyMember.TypeUsage.EdmType.BaseType).PrimitiveTypeKind; + if ((type == PrimitiveTypeKind.Byte) || (type == PrimitiveTypeKind.SByte) || + (type == PrimitiveTypeKind.Int16) || (type == PrimitiveTypeKind.Int32) || + (type == PrimitiveTypeKind.Int64) || (type == PrimitiveTypeKind.Decimal && IsValidMySqlDataType(keyMember.TypeUsage.EdmType.FullName))) + { + value = new LiteralFragment("last_insert_id()"); + } + else if (keyMember.TypeUsage.EdmType.BaseType.Name == "Guid") + value = new LiteralFragment(string.Format("ANY(SELECT guid FROM tmpIdentity_{0})", (table as MetadataItem).MetadataProperties["Table"].Value)); + } + where.Append(String.Format(" AND `{0}`=", keyMember)); + where.Append(value); + } + select.Where = where; + return select; + } + + private bool IsValidMySqlDataType(string dataType) + { + return (new List() { "MySql.ubigint" }).Contains(dataType); + } + } +} diff --git a/EntityFramework/src/Generators/Scope.cs b/EntityFramework/src/Generators/Scope.cs new file mode 100644 index 000000000..cf7b7d873 --- /dev/null +++ b/EntityFramework/src/Generators/Scope.cs @@ -0,0 +1,114 @@ +// Copyright © 2008, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Diagnostics; + +namespace MySql.Data.EntityFramework +{ + class Scope + { + private Dictionary scopeTable = new Dictionary(); + + public void Add(string name, InputFragment fragment) + { + scopeTable.Add(name, fragment); + } + + public void Remove( string Name, InputFragment fragment) + { + if (fragment == null) return; + if (Name != null) + scopeTable.Remove(Name); + + if (fragment is SelectStatement) + Remove((fragment as SelectStatement).From); + else if (fragment is JoinFragment) + { + JoinFragment j = fragment as JoinFragment; + Remove(j.Left); + Remove(j.Right); + } + else if (fragment is UnionFragment) + { + UnionFragment u = fragment as UnionFragment; + Remove(u.Left); + Remove(u.Right); + } + } + + public void Remove(InputFragment fragment) + { + if( fragment == null ) return; + Remove(fragment.Name, fragment); + } + + public InputFragment GetFragment(string name) + { + if (!scopeTable.ContainsKey(name)) + return null; + return scopeTable[name]; + } + + public InputFragment FindInputFromProperties(PropertyFragment fragment) + { + Debug.Assert(fragment != null); + PropertyFragment propertyFragment = fragment as PropertyFragment; + Debug.Assert(propertyFragment != null); + + if (propertyFragment.Properties.Count >= 2) + { + for (int x = propertyFragment.Properties.Count - 2; x >= 0; x--) + { + string reference = propertyFragment.Properties[x]; + if (reference == null) continue; + InputFragment input = GetFragment(reference); + if (input == null) continue; + if (input.Scoped) return input; + if (input is SelectStatement) + return (input as SelectStatement).From; + continue; + } + } + Debug.Fail("Should have found an input"); + return null; + } + } + + /// + /// Specifies the operation types supported. + /// + public enum OpType : int + { + Join = 1, + Union = 2 + } +} diff --git a/Source/MySql.Data.Entity.EF6/Generators/SelectGenerator.cs b/EntityFramework/src/Generators/SelectGenerator.cs similarity index 91% rename from Source/MySql.Data.Entity.EF6/Generators/SelectGenerator.cs rename to EntityFramework/src/Generators/SelectGenerator.cs index 168de458b..5ef0362af 100644 --- a/Source/MySql.Data.Entity.EF6/Generators/SelectGenerator.cs +++ b/EntityFramework/src/Generators/SelectGenerator.cs @@ -1,524 +1,522 @@ -// Copyright © 2008, 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Text; -using System.Diagnostics; -using System.Collections.Generic; -using MySql.Data.MySqlClient; -using System.Data; -#if EF6 -using System.Data.Entity.Core.Common.CommandTrees; -using System.Data.Entity.Core.Metadata.Edm; -#else -using System.Data.Common.CommandTrees; -using System.Data.Metadata.Edm; -#endif - - -namespace MySql.Data.Entity -{ - class SelectGenerator : SqlGenerator - { - Stack selectStatements = new Stack(); - - #region Properties - - private SelectStatement CurrentSelect - { - get { return selectStatements.Count == 0 ? null : selectStatements.Peek(); } - } - - #endregion - - public override string GenerateSQL(DbCommandTree tree) - { - DbQueryCommandTree commandTree = tree as DbQueryCommandTree; - - SqlFragment fragment = null; - - DbExpression e = commandTree.Query; - switch (commandTree.Query.ExpressionKind) - { - case DbExpressionKind.Project: - fragment = e.Accept(this); - Debug.Assert(fragment is SelectStatement); - break; - } - // Apply post-optimizations here: - fragment = TryFlatteningGroupBy(fragment); - return fragment.ToString(); - } - - /// - /// If input sqlFragment is a group by structure, is flattened to remove some nested correlation queries. - /// - /// - /// - private SqlFragment TryFlatteningGroupBy(SqlFragment input) - { - SelectStatement select = null; - SelectStatement tmpFrag = null, tmpFrag2 = null, tmpFrag3 = null; - InputFragment table = null; - string objName = null, colName = null, queryName = null; - // First part assert is a kind-of structure we are looking for - tmpFrag = input as SelectStatement; - if (tmpFrag == null) goto NoChanges; - tmpFrag = ( tmpFrag ).From as SelectStatement; - if (tmpFrag == null) goto NoChanges; - queryName = tmpFrag.Name; - if (tmpFrag.Columns.Count < 2) goto NoChanges; - if (!(tmpFrag.Columns[0] is ColumnFragment)) goto NoChanges; - colName = objName = (tmpFrag.Columns[0] as ColumnFragment).ActualColumnName; - tmpFrag2 = tmpFrag.From as SelectStatement; - if (tmpFrag2 == null) goto NoChanges; - if (tmpFrag2.Columns.Count < 1 || !(tmpFrag2.Columns[0] is ColumnFragment)) goto NoChanges; - if (string.CompareOrdinal(objName, tmpFrag2.Columns[0].ActualColumnName) != 0) goto NoChanges; - if (tmpFrag.Columns[1].Literal == null ) goto NoChanges; - tmpFrag2 = tmpFrag.Columns[1].Literal as SelectStatement; - if (tmpFrag2 == null) goto NoChanges; - if ((tmpFrag2.Columns.Count != 1) || !(tmpFrag2.Columns[0].Literal != null)) goto NoChanges; - tmpFrag3 = tmpFrag2.From as SelectStatement; - if (tmpFrag3 == null) goto NoChanges; - table = tmpFrag3.From as InputFragment; - if (table == null) goto NoChanges; - FunctionFragment func = tmpFrag2.Columns[0].Literal as FunctionFragment; - if( tmpFrag3.Columns.Count != 1 || !( tmpFrag3.Columns[ 0 ] is ColumnFragment )) goto NoChanges; - if (func == null) goto NoChanges; - // Yes it is the kind-of type we like, then optimize it - select = new SelectStatement(this); - table.Name = null; - string tableName = null; - TableFragment t = tmpFrag3.From as TableFragment; - if (t == null) - tableName = tmpFrag3.Columns[0].TableName; - else - tableName = t.Table; - select.From = table; - select.Columns.Add(new ColumnFragment(tableName, colName)); - select.Columns.Add(new ColumnFragment(tableName, "C0") - { - ColumnAlias = "C1", - Literal = new FunctionFragment() { - Argument = new ColumnFragment(tableName, tmpFrag3.Columns[0].ActualColumnName), - Distinct = tmpFrag3.IsDistinct, - Name = func.Name - } - }); - select.Wrap(null); - select.Name = queryName; - select.AddGroupBy(select.Columns[0]); - (input as SelectStatement).From = select; -NoChanges: - return input; - } - - public override SqlFragment Visit(DbDistinctExpression expression) - { - SelectStatement select = VisitInputExpressionEnsureSelect(expression.Argument, null, null); - select.IsDistinct = true; - return select; - } - - public override SqlFragment Visit(DbFilterExpression expression) - { - SelectStatement select = VisitInputExpressionEnsureSelect(expression.Input.Expression, - expression.Input.VariableName, expression.Input.VariableType); - select = WrapIfNotCompatible(select, expression.ExpressionKind); - select.Where = expression.Predicate.Accept(this); - return select; - } - - public override SqlFragment Visit(DbGroupByExpression expression) - { - // first process the input - DbGroupExpressionBinding e = expression.Input; - SelectStatement innerSelect = VisitInputExpressionEnsureSelect(e.Expression, e.VariableName, e.VariableType); - scope.Add(e.GroupVariableName, innerSelect); - - SelectStatement select = WrapIfNotCompatible(innerSelect, expression.ExpressionKind); - - CollectionType ct = (CollectionType)expression.ResultType.EdmType; - RowType rt = (RowType)ct.TypeUsage.EdmType; - - int propIndex = 0; - - foreach (DbExpression key in expression.Keys) - { - var fragment = key.Accept(this); - select.AddGroupBy(fragment); - propIndex++; - - var colFragment = fragment as ColumnFragment; - - if (colFragment != null) - { - colFragment = colFragment.Clone(); - colFragment.ColumnAlias = String.Format("K{0}", propIndex); - select.Columns.Add(colFragment); - } - } - - for (int agg = 0; agg < expression.Aggregates.Count; agg++) - { - DbAggregate a = expression.Aggregates[agg]; - DbFunctionAggregate fa = a as DbFunctionAggregate; - if (fa == null) throw new NotSupportedException(); - - string alias = rt.Properties[propIndex++].Name; - ColumnFragment functionCol = new ColumnFragment(null, null); - functionCol.Literal = HandleFunction(fa, a.Arguments[0].Accept(this)); - functionCol.ColumnAlias = alias; - select.Columns.Add(functionCol); - } - - return select; - } - - private SqlFragment HandleFunction(DbFunctionAggregate fa, SqlFragment arg) - { - Debug.Assert(fa.Arguments.Count == 1); - - if (fa.Function.NamespaceName != "Edm") - throw new NotSupportedException(); - - FunctionFragment fragment = new FunctionFragment(); - fragment.Name = fa.Function.Name; - if (fa.Function.Name == "BigCount") - fragment.Name = "COUNT"; - else - fragment.Name = fa.Function.Name.ToUpperInvariant(); - - fragment.Distinct = fa.Distinct; - fragment.Argument = arg; - return fragment; - //return new CastExpression(aggregate, GetDbType(functionAggregate.ResultType.EdmType)); - } - - public override SqlFragment Visit(DbCrossJoinExpression expression) - { - Debug.Assert(expression.Inputs.Count == 2); - return HandleJoinExpression(expression.Inputs[0], expression.Inputs[1], - expression.ExpressionKind, null); - } - - public override SqlFragment Visit(DbApplyExpression expression) - { - - DbExpressionBinding inputBinding = expression.Input; - InputFragment input = VisitInputExpression(inputBinding.Expression, inputBinding.VariableName, inputBinding.VariableType); - DbExpressionBinding applyBinding = expression.Apply; - InputFragment apply = VisitInputExpression(applyBinding.Expression, applyBinding.VariableName, applyBinding.VariableType); - SelectStatement select = new SelectStatement(this); - bool isInputSelect = false; - if (!(input is TableFragment)) - { - input.Wrap(scope); - isInputSelect = true; - } - apply.Wrap(scope); - select.From = input; - select.Wrap(scope); - if (apply is SelectStatement) - { - SelectStatement applySel = apply as SelectStatement; - foreach (ColumnFragment f in applySel.Columns) - { - SelectStatement newColSelect = new SelectStatement(this); - newColSelect.From = applySel.From; - newColSelect.Where = applySel.Where; - if (isInputSelect) - { - VisitAndReplaceTableName(newColSelect.Where, (input as SelectStatement).From.Name, input.Name, null); - } - newColSelect.Limit = applySel.Limit; - newColSelect.OrderBy = applySel.OrderBy; - newColSelect.Skip = applySel.Skip; - newColSelect.GroupBy = applySel.GroupBy; - newColSelect.IsDistinct = applySel.IsDistinct; - newColSelect.Columns.Add(f); - - newColSelect.Wrap(scope); - scope.Add(applySel.From.Name, applySel.From); - - ColumnFragment newCol = new ColumnFragment(apply.Name, f.ColumnName); - newCol.Literal = newColSelect; - newCol.PushInput(newCol.ColumnName); - newCol.PushInput(apply.Name); - select.AddColumn(newCol, scope); - if (string.IsNullOrEmpty(newCol.ColumnAlias)) - { - newColSelect.Name = newCol.ColumnName; - newCol.ColumnAlias = newCol.ColumnName; - } - scope.Remove(newColSelect); - } - scope.Remove(applySel.From); - scope.Remove(apply); - } - else if (apply is UnionFragment) - { - UnionFragment uf = apply as UnionFragment; - if (uf.Left == null || uf.Right == null) - throw new Exception("Union fragment is not properly formed."); - - var left = uf.Left as SelectStatement; - var right = uf.Right as SelectStatement; - - if (left == null || right == null) - throw new NotImplementedException(); - - var whereleft = left.Where as BinaryFragment; - var whereright = right.Where as BinaryFragment; - - if (whereleft == null || whereright == null) - throw new NotImplementedException(); - - LiteralFragment literalFragmentWhere = null; - - //checking where left - if (whereleft.Left is ColumnFragment && whereleft.Right is ColumnFragment) - { - // we replace the where part for a dummy one - if (whereright.Left is ColumnFragment && whereright.Right is ColumnFragment) - { - literalFragmentWhere = new LiteralFragment("1 = 1"); - } - } - - if (literalFragmentWhere == null) - throw new NotImplementedException(); - - var leftouterjoin = new JoinFragment(); - leftouterjoin.JoinType = Metadata.GetOperator(DbExpressionKind.LeftOuterJoin); - leftouterjoin.Name = apply.Name; - - // validating that column fragment on the left matches the name - // for the input fragment - var leftColumnFragment = whereleft.Left as ColumnFragment; - - if (leftColumnFragment == null) - throw new NotImplementedException(); - - if (!leftColumnFragment.TableName.Equals(input.Name)) - new NotImplementedException(); - - var conditionJoin = new BinaryFragment(); - conditionJoin.Left = whereleft.Left; - - //update to the new reference - var newColumnFragment = whereright.Right as ColumnFragment; - if (newColumnFragment != null) - { - newColumnFragment.TableName = uf.Name; - } - conditionJoin.Right = newColumnFragment; - conditionJoin.Operator = whereleft.Operator; - - leftouterjoin.Condition = conditionJoin; - - (uf.Left as SelectStatement).Where = literalFragmentWhere; - (uf.Right as SelectStatement).Where = literalFragmentWhere; - - leftouterjoin.Left = input; - leftouterjoin.Right = uf; - - return leftouterjoin; - } - return select; - } - - public override SqlFragment Visit(DbJoinExpression expression) - { - return HandleJoinExpression(expression.Left, expression.Right, - expression.ExpressionKind, expression.JoinCondition); - } - - - private SqlFragment HandleJoinExpression(DbExpressionBinding left, DbExpressionBinding right, - DbExpressionKind joinType, DbExpression joinCondition) - { - JoinFragment join = new JoinFragment(); - join.JoinType = Metadata.GetOperator(joinType); - - join.Left = VisitInputExpression(left.Expression, left.VariableName, left.VariableType); - join.Left = WrapJoinInputIfNecessary(join.Left, false); - - join.Right = VisitInputExpression(right.Expression, right.VariableName, right.VariableType); - join.Right = WrapJoinInputIfNecessary(join.Right, true); - - if (join.Right is SelectStatement) - { - SelectStatement select = join.Right as SelectStatement; - if (select.IsWrapped) - select.Name = right.VariableName; - } - - // now handle the ON case - if (joinCondition != null) - join.Condition = joinCondition.Accept(this); - return join; - } - - public SelectStatement WrapIfNotCompatible(SelectStatement select, DbExpressionKind expressionKind) - { - if (select.IsCompatible(expressionKind)) return select; - SelectStatement newSelect = new SelectStatement(this); - select.Wrap(scope); - select.Scoped = true; - newSelect.From = select; - return newSelect; - } - - private InputFragment WrapJoinInputIfNecessary(InputFragment fragment, bool isRightPart) - { - if (fragment is SelectStatement || fragment is UnionFragment) - { - fragment.Wrap(scope); - fragment.Scoped = true; - } - else if (fragment is JoinFragment && isRightPart) - { - SelectStatement select = new SelectStatement(this); - select.From = fragment; - select.Name = fragment.Name; - select.Wrap(scope); - return select; - } - return fragment; - } - - public override SqlFragment Visit(DbNewInstanceExpression expression) - { - Debug.Assert(expression.ResultType.EdmType is CollectionType); - - SelectStatement s = new SelectStatement(this); - - ColumnFragment c = new ColumnFragment(null, null); - if (expression.Arguments.Count != 0) - c.Literal = (LiteralFragment)expression.Arguments[0].Accept(this); - else - c.Literal = new LiteralFragment("NULL"); - c.ColumnAlias = "X"; - s.Columns.Add(c); - return s; - } - - public override SqlFragment Visit(DbProjectExpression expression) - { - SelectStatement select = VisitInputExpressionEnsureSelect(expression.Input.Expression, - expression.Input.VariableName, expression.Input.VariableType); - - // see if we need to wrap this select inside a new select - select = WrapIfNotCompatible(select, expression.ExpressionKind); - - Debug.Assert(expression.Projection is DbNewInstanceExpression); - VisitNewInstanceExpression(select, expression.Projection as DbNewInstanceExpression); - - return select; - } - - private SelectStatement VisitInputExpressionEnsureSelect(DbExpression e, string name, TypeUsage type) - { - InputFragment fragment = VisitInputExpression(e, name, type); - if (fragment is SelectStatement) return (fragment as SelectStatement); - - SelectStatement s = new SelectStatement(this); - - // if the fragment is a union then it needs to be wrapped - if (fragment is UnionFragment) - (fragment as UnionFragment).Wrap(scope); - - s.From = fragment; - return s; - } - - public override SqlFragment Visit(DbElementExpression expression) - { - SelectStatement s = VisitInputExpressionEnsureSelect(expression.Argument, null, null); - s.Wrap(scope); - return s; - } - - public override SqlFragment Visit(DbSortExpression expression) - { - SelectStatement select = VisitInputExpressionEnsureSelect(expression.Input.Expression, - expression.Input.VariableName, expression.Input.VariableType); - - select = WrapIfNotCompatible(select, expression.ExpressionKind); - - foreach (DbSortClause sortClause in expression.SortOrder) - { - select.AddOrderBy(new SortFragment( - sortClause.Expression.Accept(this), sortClause.Ascending)); - } - return select; - } - - public override SqlFragment Visit(DbLimitExpression expression) - { - SelectStatement select = (SelectStatement)VisitInputExpressionEnsureSelect( - expression.Argument, null, null); - select = WrapIfNotCompatible(select, expression.ExpressionKind); - select.Limit = expression.Limit.Accept(this); - return select; - } - - public override SqlFragment Visit(DbSkipExpression expression) - { - SelectStatement select = VisitInputExpressionEnsureSelect(expression.Input.Expression, expression.Input.VariableName, - expression.Input.VariableType); - - select = WrapIfNotCompatible(select, DbExpressionKind.Sort); - foreach (DbSortClause sortClause in expression.SortOrder) - { - select.AddOrderBy( - new SortFragment(sortClause.Expression.Accept(this), sortClause.Ascending)); - } - - // if we wrapped above, then this wrap will not create a new one so there - // is no harm in calling it - select = WrapIfNotCompatible(select, expression.ExpressionKind); - select.Skip = expression.Count.Accept(this); - return select; - } - - public override SqlFragment Visit(DbUnionAllExpression expression) - { - UnionFragment f = new UnionFragment(); - Debug.Assert(expression.Left is DbProjectExpression); - Debug.Assert(expression.Right is DbProjectExpression); - - SelectStatement left = VisitInputExpressionEnsureSelect(expression.Left, null, null); - Debug.Assert(left.Name == null); - // left.Wrap(null); - - SelectStatement right = VisitInputExpressionEnsureSelect(expression.Right, null, null); - Debug.Assert(right.Name == null); - // right.Wrap(null); - f.Left = left; - f.Right = right; - - return f; - } - } -} +// Copyright © 2008, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Diagnostics; +using System.Collections.Generic; +using System.Data.Entity.Core.Common.CommandTrees; +using System.Data.Entity.Core.Metadata.Edm; + + +namespace MySql.Data.EntityFramework +{ + class SelectGenerator : SqlGenerator + { + Stack selectStatements = new Stack(); + + #region Properties + + private SelectStatement CurrentSelect + { + get { return selectStatements.Count == 0 ? null : selectStatements.Peek(); } + } + + #endregion + + public override string GenerateSQL(DbCommandTree tree) + { + DbQueryCommandTree commandTree = tree as DbQueryCommandTree; + + SqlFragment fragment = null; + + DbExpression e = commandTree.Query; + switch (commandTree.Query.ExpressionKind) + { + case DbExpressionKind.Project: + fragment = e.Accept(this); + Debug.Assert(fragment is SelectStatement); + break; + } + // Apply post-optimizations here: + fragment = TryFlatteningGroupBy(fragment); + return fragment.ToString(); + } + + /// + /// If input sqlFragment is a group by structure, is flattened to remove some nested correlation queries. + /// + /// + /// + private SqlFragment TryFlatteningGroupBy(SqlFragment input) + { + SelectStatement select = null; + SelectStatement tmpFrag = null, tmpFrag2 = null, tmpFrag3 = null; + InputFragment table = null; + string objName = null, colName = null, queryName = null; + // First part assert is a kind-of structure we are looking for + tmpFrag = input as SelectStatement; + if (tmpFrag == null) goto NoChanges; + tmpFrag = ( tmpFrag ).From as SelectStatement; + if (tmpFrag == null) goto NoChanges; + queryName = tmpFrag.Name; + if (tmpFrag.Columns.Count < 2) goto NoChanges; + if (!(tmpFrag.Columns[0] is ColumnFragment)) goto NoChanges; + colName = objName = (tmpFrag.Columns[0] as ColumnFragment).ActualColumnName; + tmpFrag2 = tmpFrag.From as SelectStatement; + if (tmpFrag2 == null) goto NoChanges; + if (tmpFrag2.Columns.Count < 1 || !(tmpFrag2.Columns[0] is ColumnFragment)) goto NoChanges; + if (string.CompareOrdinal(objName, tmpFrag2.Columns[0].ActualColumnName) != 0) goto NoChanges; + if (tmpFrag.Columns[1].Literal == null ) goto NoChanges; + tmpFrag2 = tmpFrag.Columns[1].Literal as SelectStatement; + if (tmpFrag2 == null) goto NoChanges; + if ((tmpFrag2.Columns.Count != 1) || !(tmpFrag2.Columns[0].Literal != null)) goto NoChanges; + tmpFrag3 = tmpFrag2.From as SelectStatement; + if (tmpFrag3 == null) goto NoChanges; + table = tmpFrag3.From as InputFragment; + if (table == null) goto NoChanges; + FunctionFragment func = tmpFrag2.Columns[0].Literal as FunctionFragment; + if( tmpFrag3.Columns.Count != 1 || !( tmpFrag3.Columns[ 0 ] is ColumnFragment )) goto NoChanges; + if (func == null) goto NoChanges; + // Yes it is the kind-of type we like, then optimize it + select = new SelectStatement(this); + table.Name = null; + string tableName = null; + TableFragment t = tmpFrag3.From as TableFragment; + if (t == null) + tableName = tmpFrag3.Columns[0].TableName; + else + tableName = t.Table; + select.From = table; + select.Columns.Add(new ColumnFragment(tableName, colName)); + select.Columns.Add(new ColumnFragment(tableName, "C0") + { + ColumnAlias = "C1", + Literal = new FunctionFragment() { + Argument = new ColumnFragment(tableName, tmpFrag3.Columns[0].ActualColumnName), + Distinct = tmpFrag3.IsDistinct, + Name = func.Name + } + }); + select.Wrap(null); + select.Name = queryName; + select.AddGroupBy(select.Columns[0]); + (input as SelectStatement).From = select; +NoChanges: + return input; + } + + public override SqlFragment Visit(DbDistinctExpression expression) + { + SelectStatement select = VisitInputExpressionEnsureSelect(expression.Argument, null, null); + select.IsDistinct = true; + return select; + } + + public override SqlFragment Visit(DbFilterExpression expression) + { + SelectStatement select = VisitInputExpressionEnsureSelect(expression.Input.Expression, + expression.Input.VariableName, expression.Input.VariableType); + select = WrapIfNotCompatible(select, expression.ExpressionKind); + select.Where = expression.Predicate.Accept(this); + return select; + } + + public override SqlFragment Visit(DbGroupByExpression expression) + { + // first process the input + DbGroupExpressionBinding e = expression.Input; + SelectStatement innerSelect = VisitInputExpressionEnsureSelect(e.Expression, e.VariableName, e.VariableType); + scope.Add(e.GroupVariableName, innerSelect); + + SelectStatement select = WrapIfNotCompatible(innerSelect, expression.ExpressionKind); + + CollectionType ct = (CollectionType)expression.ResultType.EdmType; + RowType rt = (RowType)ct.TypeUsage.EdmType; + + int propIndex = 0; + + foreach (DbExpression key in expression.Keys) + { + var fragment = key.Accept(this); + select.AddGroupBy(fragment); + propIndex++; + + var colFragment = fragment as ColumnFragment; + + if (colFragment != null) + { + colFragment = colFragment.Clone(); + colFragment.ColumnAlias = String.Format("K{0}", propIndex); + select.Columns.Add(colFragment); + } + } + + for (int agg = 0; agg < expression.Aggregates.Count; agg++) + { + DbAggregate a = expression.Aggregates[agg]; + DbFunctionAggregate fa = a as DbFunctionAggregate; + if (fa == null) throw new NotSupportedException(); + + string alias = rt.Properties[propIndex++].Name; + ColumnFragment functionCol = new ColumnFragment(null, null); + functionCol.Literal = HandleFunction(fa, a.Arguments[0].Accept(this)); + functionCol.ColumnAlias = alias; + select.Columns.Add(functionCol); + } + + return select; + } + + private SqlFragment HandleFunction(DbFunctionAggregate fa, SqlFragment arg) + { + Debug.Assert(fa.Arguments.Count == 1); + + if (fa.Function.NamespaceName != "Edm") + throw new NotSupportedException(); + + FunctionFragment fragment = new FunctionFragment(); + fragment.Name = fa.Function.Name; + if (fa.Function.Name == "BigCount") + fragment.Name = "COUNT"; + else + fragment.Name = fa.Function.Name.ToUpperInvariant(); + + fragment.Distinct = fa.Distinct; + fragment.Argument = arg; + return fragment; + //return new CastExpression(aggregate, GetDbType(functionAggregate.ResultType.EdmType)); + } + + public override SqlFragment Visit(DbCrossJoinExpression expression) + { + Debug.Assert(expression.Inputs.Count == 2); + return HandleJoinExpression(expression.Inputs[0], expression.Inputs[1], + expression.ExpressionKind, null); + } + + public override SqlFragment Visit(DbApplyExpression expression) + { + + DbExpressionBinding inputBinding = expression.Input; + InputFragment input = VisitInputExpression(inputBinding.Expression, inputBinding.VariableName, inputBinding.VariableType); + DbExpressionBinding applyBinding = expression.Apply; + InputFragment apply = VisitInputExpression(applyBinding.Expression, applyBinding.VariableName, applyBinding.VariableType); + SelectStatement select = new SelectStatement(this); + bool isInputSelect = false; + if (!(input is TableFragment)) + { + input.Wrap(scope); + isInputSelect = true; + } + apply.Wrap(scope); + select.From = input; + select.Wrap(scope); + if (apply is SelectStatement) + { + SelectStatement applySel = apply as SelectStatement; + foreach (ColumnFragment f in applySel.Columns) + { + SelectStatement newColSelect = new SelectStatement(this); + newColSelect.From = applySel.From; + newColSelect.Where = applySel.Where; + if (isInputSelect) + { + VisitAndReplaceTableName(newColSelect.Where, (input as SelectStatement).From.Name, input.Name, null); + } + newColSelect.Limit = applySel.Limit; + newColSelect.OrderBy = applySel.OrderBy; + newColSelect.Skip = applySel.Skip; + newColSelect.GroupBy = applySel.GroupBy; + newColSelect.IsDistinct = applySel.IsDistinct; + newColSelect.Columns.Add(f); + + newColSelect.Wrap(scope); + scope.Add(applySel.From.Name, applySel.From); + + ColumnFragment newCol = new ColumnFragment(apply.Name, f.ColumnName); + newCol.Literal = newColSelect; + newCol.PushInput(newCol.ColumnName); + newCol.PushInput(apply.Name); + select.AddColumn(newCol, scope); + if (string.IsNullOrEmpty(newCol.ColumnAlias)) + { + newColSelect.Name = newCol.ColumnName; + newCol.ColumnAlias = newCol.ColumnName; + } + scope.Remove(newColSelect); + } + scope.Remove(applySel.From); + scope.Remove(apply); + } + else if (apply is UnionFragment) + { + UnionFragment uf = apply as UnionFragment; + if (uf.Left == null || uf.Right == null) + throw new Exception("Union fragment is not properly formed."); + + var left = uf.Left as SelectStatement; + var right = uf.Right as SelectStatement; + + if (left == null || right == null) + throw new NotImplementedException(); + + var whereleft = left.Where as BinaryFragment; + var whereright = right.Where as BinaryFragment; + + if (whereleft == null || whereright == null) + throw new NotImplementedException(); + + LiteralFragment literalFragmentWhere = null; + + //checking where left + if (whereleft.Left is ColumnFragment && whereleft.Right is ColumnFragment) + { + // we replace the where part for a dummy one + if (whereright.Left is ColumnFragment && whereright.Right is ColumnFragment) + { + literalFragmentWhere = new LiteralFragment("1 = 1"); + } + } + + if (literalFragmentWhere == null) + throw new NotImplementedException(); + + var leftouterjoin = new JoinFragment(); + leftouterjoin.JoinType = Metadata.GetOperator(DbExpressionKind.LeftOuterJoin); + leftouterjoin.Name = apply.Name; + + // validating that column fragment on the left matches the name + // for the input fragment + var leftColumnFragment = whereleft.Left as ColumnFragment; + + if (leftColumnFragment == null) + throw new NotImplementedException(); + + if (!leftColumnFragment.TableName.Equals(input.Name)) + new NotImplementedException(); + + var conditionJoin = new BinaryFragment(); + conditionJoin.Left = whereleft.Left; + + //update to the new reference + var newColumnFragment = whereright.Right as ColumnFragment; + if (newColumnFragment != null) + { + newColumnFragment.TableName = uf.Name; + } + conditionJoin.Right = newColumnFragment; + conditionJoin.Operator = whereleft.Operator; + + leftouterjoin.Condition = conditionJoin; + + (uf.Left as SelectStatement).Where = literalFragmentWhere; + (uf.Right as SelectStatement).Where = literalFragmentWhere; + + leftouterjoin.Left = input; + leftouterjoin.Right = uf; + + return leftouterjoin; + } + return select; + } + + public override SqlFragment Visit(DbJoinExpression expression) + { + return HandleJoinExpression(expression.Left, expression.Right, + expression.ExpressionKind, expression.JoinCondition); + } + + + private SqlFragment HandleJoinExpression(DbExpressionBinding left, DbExpressionBinding right, + DbExpressionKind joinType, DbExpression joinCondition) + { + JoinFragment join = new JoinFragment(); + join.JoinType = Metadata.GetOperator(joinType); + + join.Left = VisitInputExpression(left.Expression, left.VariableName, left.VariableType); + join.Left = WrapJoinInputIfNecessary(join.Left, false); + + join.Right = VisitInputExpression(right.Expression, right.VariableName, right.VariableType); + join.Right = WrapJoinInputIfNecessary(join.Right, true); + + if (join.Right is SelectStatement) + { + SelectStatement select = join.Right as SelectStatement; + if (select.IsWrapped) + select.Name = right.VariableName; + } + + // now handle the ON case + if (joinCondition != null) + join.Condition = joinCondition.Accept(this); + return join; + } + + public SelectStatement WrapIfNotCompatible(SelectStatement select, DbExpressionKind expressionKind) + { + if (select.IsCompatible(expressionKind)) return select; + SelectStatement newSelect = new SelectStatement(this); + select.Wrap(scope); + select.Scoped = true; + newSelect.From = select; + return newSelect; + } + + private InputFragment WrapJoinInputIfNecessary(InputFragment fragment, bool isRightPart) + { + if (fragment is SelectStatement || fragment is UnionFragment) + { + fragment.Wrap(scope); + fragment.Scoped = true; + } + else if (fragment is JoinFragment && isRightPart) + { + SelectStatement select = new SelectStatement(this); + select.From = fragment; + select.Name = fragment.Name; + select.Wrap(scope); + return select; + } + return fragment; + } + + public override SqlFragment Visit(DbNewInstanceExpression expression) + { + Debug.Assert(expression.ResultType.EdmType is CollectionType); + + SelectStatement s = new SelectStatement(this); + + ColumnFragment c = new ColumnFragment(null, null); + if (expression.Arguments.Count != 0) + c.Literal = (LiteralFragment)expression.Arguments[0].Accept(this); + else + c.Literal = new LiteralFragment("NULL"); + c.ColumnAlias = "X"; + s.Columns.Add(c); + return s; + } + + public override SqlFragment Visit(DbProjectExpression expression) + { + SelectStatement select = VisitInputExpressionEnsureSelect(expression.Input.Expression, + expression.Input.VariableName, expression.Input.VariableType); + + // see if we need to wrap this select inside a new select + select = WrapIfNotCompatible(select, expression.ExpressionKind); + + Debug.Assert(expression.Projection is DbNewInstanceExpression); + VisitNewInstanceExpression(select, expression.Projection as DbNewInstanceExpression); + + return select; + } + + private SelectStatement VisitInputExpressionEnsureSelect(DbExpression e, string name, TypeUsage type) + { + InputFragment fragment = VisitInputExpression(e, name, type); + if (fragment is SelectStatement) return (fragment as SelectStatement); + + SelectStatement s = new SelectStatement(this); + + // if the fragment is a union then it needs to be wrapped + if (fragment is UnionFragment) + (fragment as UnionFragment).Wrap(scope); + + s.From = fragment; + return s; + } + + public override SqlFragment Visit(DbElementExpression expression) + { + SelectStatement s = VisitInputExpressionEnsureSelect(expression.Argument, null, null); + s.Wrap(scope); + return s; + } + + public override SqlFragment Visit(DbSortExpression expression) + { + SelectStatement select = VisitInputExpressionEnsureSelect(expression.Input.Expression, + expression.Input.VariableName, expression.Input.VariableType); + + select = WrapIfNotCompatible(select, expression.ExpressionKind); + + foreach (DbSortClause sortClause in expression.SortOrder) + { + select.AddOrderBy(new SortFragment( + sortClause.Expression.Accept(this), sortClause.Ascending)); + } + return select; + } + + public override SqlFragment Visit(DbLimitExpression expression) + { + SelectStatement select = (SelectStatement)VisitInputExpressionEnsureSelect( + expression.Argument, null, null); + select = WrapIfNotCompatible(select, expression.ExpressionKind); + select.Limit = expression.Limit.Accept(this); + return select; + } + + public override SqlFragment Visit(DbSkipExpression expression) + { + SelectStatement select = VisitInputExpressionEnsureSelect(expression.Input.Expression, expression.Input.VariableName, + expression.Input.VariableType); + + select = WrapIfNotCompatible(select, DbExpressionKind.Sort); + foreach (DbSortClause sortClause in expression.SortOrder) + { + select.AddOrderBy( + new SortFragment(sortClause.Expression.Accept(this), sortClause.Ascending)); + } + + // if we wrapped above, then this wrap will not create a new one so there + // is no harm in calling it + select = WrapIfNotCompatible(select, expression.ExpressionKind); + select.Skip = expression.Count.Accept(this); + return select; + } + + public override SqlFragment Visit(DbUnionAllExpression expression) + { + UnionFragment f = new UnionFragment(); + Debug.Assert(expression.Left is DbProjectExpression); + Debug.Assert(expression.Right is DbProjectExpression); + + SelectStatement left = VisitInputExpressionEnsureSelect(expression.Left, null, null); + Debug.Assert(left.Name == null); + // left.Wrap(null); + + SelectStatement right = VisitInputExpressionEnsureSelect(expression.Right, null, null); + Debug.Assert(right.Name == null); + // right.Wrap(null); + f.Left = left; + f.Right = right; + + return f; + } + } +} diff --git a/Source/MySql.Data.Entity.EF6/Generators/SqlGenerator.cs b/EntityFramework/src/Generators/SqlGenerator.cs similarity index 85% rename from Source/MySql.Data.Entity.EF6/Generators/SqlGenerator.cs rename to EntityFramework/src/Generators/SqlGenerator.cs index 2b0ae8e48..a7cf234d3 100644 --- a/Source/MySql.Data.Entity.EF6/Generators/SqlGenerator.cs +++ b/EntityFramework/src/Generators/SqlGenerator.cs @@ -1,911 +1,916 @@ -// Copyright © 2008, 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Diagnostics; -using System.Text; -using System.Data; -using System.Collections.Generic; -using MySql.Data.MySqlClient; -using System.Globalization; -#if EF6 -using System.Data.Entity.Core.Common.CommandTrees; -using System.Data.Entity.Core.Metadata.Edm; -#else -using System.Data.Common.CommandTrees; -using System.Data.Metadata.Edm; -#endif - - -namespace MySql.Data.Entity -{ - abstract class SqlGenerator : DbExpressionVisitor - { - protected string tabs = String.Empty; - private int parameterCount = 1; - protected Scope scope = new Scope(); - protected int propertyLevel; - protected Dictionary values; - protected internal Stack Ops = new Stack(); - - public SqlGenerator() - { - Parameters = new List(); - } - - protected internal OpType GetTopOp() - { - if (Ops.Count == 0) - return OpType.Join; - else - return Ops.Peek(); - } - - #region Properties - - public List Parameters { get; private set; } - // protected SymbolTable Symbols { get; private set; } - - #endregion - - public virtual string GenerateSQL(DbCommandTree commandTree) - { - throw new NotImplementedException(); - } - - protected string CreateUniqueParameterName() - { - return String.Format("@gp{0}", parameterCount++); - } - - #region DbExpressionVisitor Base Implementations - - public override SqlFragment Visit(DbVariableReferenceExpression expression) - { - PropertyFragment fragment = new PropertyFragment(); - fragment.Properties.Add(expression.VariableName); - return fragment; - } - - public override SqlFragment Visit(DbPropertyExpression expression) - { - propertyLevel++; - PropertyFragment fragment = expression.Instance.Accept(this) as PropertyFragment; - fragment.Properties.Add(expression.Property.Name); - propertyLevel--; - - // if we are not at the top level property then just return - if (propertyLevel > 0) return fragment; - - ColumnFragment column = new ColumnFragment(null, fragment.LastProperty); - column.PropertyFragment = fragment; - InputFragment input = scope.FindInputFromProperties(fragment); - if (input != null) - column.TableName = input.Name; - - // now we need to check if our column name was possibly renamed - if (input is TableFragment ) - { - if (!string.IsNullOrEmpty(input.Name)) - { - SelectStatement sf = scope.GetFragment(input.Name) as SelectStatement; - if (sf != null) - { - // Special case: undo alias in case of query fusing - for (int i = 0; i < sf.Columns.Count; i++) - { - ColumnFragment cf = sf.Columns[i]; - if (column.ColumnName == cf.ColumnAlias) - { - column.ColumnName = cf.ColumnName; - column.ColumnAlias = cf.ColumnAlias; - column.TableName = input.Name; - return column; - } - } - } - } - return column; - } - - SelectStatement select = input as SelectStatement; - UnionFragment union = input as UnionFragment; - - if (select != null) - select.HasDifferentNameForColumn(column); - else if (union != null) - union.HasDifferentNameForColumn(column); - - // input is a table, selectstatement, or unionstatement - return column; - } - - public override SqlFragment Visit(DbScanExpression expression) - { - EntitySetBase target = expression.Target; - TableFragment fragment = new TableFragment(); - - MetadataProperty property; - bool propExists = target.MetadataProperties.TryGetValue("DefiningQuery", true, out property); - if (propExists && property.Value != null) +// Copyright © 2008, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Collections.Generic; +using System.Data.Entity.Core.Common.CommandTrees; +using System.Data.Entity.Core.Metadata.Edm; +using System.Diagnostics; + + +namespace MySql.Data.EntityFramework +{ + abstract class SqlGenerator : DbExpressionVisitor + { + protected string tabs = String.Empty; + private int parameterCount = 1; + protected Scope scope = new Scope(); + protected int propertyLevel; + protected Dictionary values; + protected internal Stack Ops = new Stack(); + + public SqlGenerator() + { + Parameters = new List(); + } + + protected internal OpType GetTopOp() + { + if (Ops.Count == 0) + return OpType.Join; + else + return Ops.Peek(); + } + + #region Properties + + public List Parameters { get; private set; } + // protected SymbolTable Symbols { get; private set; } + + #endregion + + public virtual string GenerateSQL(DbCommandTree commandTree) + { + throw new NotImplementedException(); + } + + protected string CreateUniqueParameterName() + { + return String.Format("@gp{0}", parameterCount++); + } + + #region DbExpressionVisitor Base Implementations + + public override SqlFragment Visit(DbVariableReferenceExpression expression) + { + PropertyFragment fragment = new PropertyFragment(); + fragment.Properties.Add(expression.VariableName); + return fragment; + } + + public override SqlFragment Visit(DbPropertyExpression expression) + { + propertyLevel++; + PropertyFragment fragment = expression.Instance.Accept(this) as PropertyFragment; + fragment.Properties.Add(expression.Property.Name); + propertyLevel--; + + // if we are not at the top level property then just return + if (propertyLevel > 0) return fragment; + + ColumnFragment column = new ColumnFragment(null, fragment.LastProperty); + column.PropertyFragment = fragment; + InputFragment input = scope.FindInputFromProperties(fragment); + if (input != null) + column.TableName = input.Name; + + // now we need to check if our column name was possibly renamed + if (input is TableFragment) { - + if (!string.IsNullOrEmpty(input.Name)) + { + SelectStatement sf = scope.GetFragment(input.Name) as SelectStatement; + if (sf != null) + { + // Special case: undo alias in case of query fusing + for (int i = 0; i < sf.Columns.Count; i++) + { + ColumnFragment cf = sf.Columns[i]; + if (column.ColumnName == cf.ColumnAlias) + { + column.ColumnName = cf.ColumnName; + column.ColumnAlias = cf.ColumnAlias; + column.TableName = input.Name; + return column; + } + } + } + } + return column; + } + + SelectStatement select = input as SelectStatement; + UnionFragment union = input as UnionFragment; + + if (select != null) + select.HasDifferentNameForColumn(column); + else if (union != null) + union.HasDifferentNameForColumn(column); + + // input is a table, selectstatement, or unionstatement + return column; + } + + public override SqlFragment Visit(DbScanExpression expression) + { + EntitySetBase target = expression.Target; + TableFragment fragment = new TableFragment(); + + MetadataProperty property; + bool propExists = target.MetadataProperties.TryGetValue("DefiningQuery", true, out property); + if (propExists && property.Value != null) + { + MetadataProperty prop2; - - if( target.MetadataProperties.TryGetValue( "http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator:Type", true, out prop2 ) && ( prop2.Value as string == "Views" )) - + + if (target.MetadataProperties.TryGetValue("http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator:Type", true, out prop2) && (prop2.Value as string == "Views")) + { - - // avoid storing view query as DefiningQuery because that hurts query fusing. - fragment.Schema = target.MetadataProperties.GetValue("http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator:Schema", true).Value as string; + + // avoid storing view query as DefiningQuery because that hurts query fusing. + fragment.Schema = target.MetadataProperties.GetValue("http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator:Schema", true).Value as string; fragment.Table = target.Name; - - } else { + + } + else + { fragment.DefiningQuery = new LiteralFragment(property.Value as string); - + + } + + } + + else + { + fragment.Schema = target.EntityContainer.Name; + fragment.Table = target.Name; + + propExists = target.MetadataProperties.TryGetValue("Schema", true, out property); + if (propExists && property.Value != null) + { + if (target.Table != null) + fragment.Schema = property.Value as string; + else + fragment.Schema = "dbo"; + } + propExists = target.MetadataProperties.TryGetValue("Table", true, out property); + if (propExists && property.Value != null) + fragment.Table = property.Value as string; + } + return fragment; + } + + public override SqlFragment Visit(DbParameterReferenceExpression expression) + { + return new LiteralFragment("@" + expression.ParameterName); + } + + public override SqlFragment Visit(DbNotExpression expression) + { + SqlFragment f = expression.Argument.Accept(this); + Debug.Assert(f is NegatableFragment); + NegatableFragment nf = f as NegatableFragment; + nf.Negate(); + return nf; + } + + public override SqlFragment Visit(DbIsEmptyExpression expression) + { + ExistsFragment f = new ExistsFragment(expression.Argument.Accept(this)); + f.Negate(); + return f; + } + + public override SqlFragment Visit(DbFunctionExpression expression) + { + FunctionProcessor gen = new FunctionProcessor(); + return gen.Generate(expression, this); + } + + public override SqlFragment Visit(DbConstantExpression expression) + { + PrimitiveTypeKind pt = ((PrimitiveType)expression.ResultType.EdmType).PrimitiveTypeKind; + string literal = Metadata.GetNumericLiteral(pt, expression.Value); + if (literal != null) + return new LiteralFragment(literal); + else if (pt == PrimitiveTypeKind.Boolean) + return new LiteralFragment((bool)expression.Value ? "1" : "0"); + else + { + // use a parameter for non-numeric types so we get proper + // quoting + MySqlParameter p = new MySqlParameter(); + p.ParameterName = CreateUniqueParameterName(); + p.DbType = Metadata.GetDbType(expression.ResultType); + p.Value = Metadata.NormalizeValue(expression.ResultType, expression.Value); + Parameters.Add(p); + return new LiteralFragment(p.ParameterName); + } + } + + public override SqlFragment Visit(DbComparisonExpression expression) + { + return VisitBinaryExpression(expression.Left, expression.Right, + Metadata.GetOperator(expression.ExpressionKind)); + } + + public override SqlFragment Visit(DbAndExpression expression) + { + return VisitBinaryExpression(expression.Left, expression.Right, "AND"); + } + + public override SqlFragment Visit(DbOrExpression expression) + { + return VisitBinaryExpression(expression.Left, expression.Right, "OR"); + } + + public override SqlFragment Visit(DbCastExpression expression) + { + //TODO: handle casting + return expression.Argument.Accept(this); + } + + public override SqlFragment Visit(DbInExpression expression) + { + SqlFragment sf = expression.Item.Accept(this); + InFragment inf = new InFragment(); + inf.Argument = sf; + for (int i = 0; i < expression.List.Count; i++) + { + LiteralFragment lf = Visit(expression.List[i] as DbConstantExpression) as LiteralFragment; + inf.InList.Add(lf); + } + return inf; + } + + public override SqlFragment Visit(DbLambdaExpression expression) + { + throw new NotImplementedException(); + } + + public override SqlFragment Visit(DbLikeExpression expression) + { + LikeFragment f = new LikeFragment(); + + f.Argument = expression.Argument.Accept(this); + f.Pattern = expression.Pattern.Accept(this); + + return f; + } + + public override SqlFragment Visit(DbCaseExpression expression) + { + CaseFragment c = new CaseFragment(); + + Debug.Assert(expression.When.Count == expression.Then.Count); + + for (int i = 0; i < expression.When.Count; ++i) + { + c.When.Add(expression.When[i].Accept(this)); + c.Then.Add(expression.Then[i].Accept(this)); + } + if (expression.Else != null && !(expression.Else is DbNullExpression)) + c.Else = expression.Else.Accept(this); + return c; + } + + public override SqlFragment Visit(DbIsNullExpression expression) + { + IsNullFragment f = new IsNullFragment(); + f.Argument = expression.Argument.Accept(this); + return f; + } + + public override SqlFragment Visit(DbIntersectExpression expression) + { + throw new NotSupportedException(); + } + + public override SqlFragment Visit(DbNullExpression expression) + { + return new LiteralFragment("NULL"); + } + + public override SqlFragment Visit(DbArithmeticExpression expression) + { + if (expression.ExpressionKind == DbExpressionKind.UnaryMinus) + { + ListFragment f = new ListFragment(); + f.Append("-("); + f.Append(expression.Arguments[0].Accept(this)); + f.Append(")"); + return f; + } + + string op = String.Empty; + switch (expression.ExpressionKind) + { + case DbExpressionKind.Divide: + op = "/"; break; + case DbExpressionKind.Minus: + op = "-"; break; + case DbExpressionKind.Modulo: + op = "%"; break; + case DbExpressionKind.Multiply: + op = "*"; break; + case DbExpressionKind.Plus: + op = "+"; break; + default: + throw new NotSupportedException(); + } + return VisitBinaryExpression(expression.Arguments[0], expression.Arguments[1], op); + } + + protected void VisitNewInstanceExpression(SelectStatement select, + DbNewInstanceExpression expression) + { + Debug.Assert(expression.ResultType.EdmType is RowType); + + RowType row = expression.ResultType.EdmType as RowType; + + for (int i = 0; i < expression.Arguments.Count; i++) + { + ColumnFragment col; + + SqlFragment fragment = expression.Arguments[i].Accept(this); + if (fragment is ColumnFragment) + col = fragment as ColumnFragment; + else + { + col = new ColumnFragment(null, null); + col.Literal = fragment; + } + + col.ColumnAlias = row.Properties[i].Name; + select.Columns.Add(col); + } + } + + public override SqlFragment Visit(DbTreatExpression expression) + { + throw new NotSupportedException(); + } + + public override SqlFragment Visit(DbRelationshipNavigationExpression expression) + { + throw new NotSupportedException(); + } + + public override SqlFragment Visit(DbRefExpression expression) + { + throw new NotSupportedException(); + } + + public override SqlFragment Visit(DbOfTypeExpression expression) + { + throw new NotSupportedException(); + } + + public override SqlFragment Visit(DbIsOfExpression expression) + { + throw new NotSupportedException(); + } + + public override SqlFragment Visit(DbRefKeyExpression expression) + { + throw new NotSupportedException(); + } + + public override SqlFragment Visit(DbEntityRefExpression expression) + { + throw new NotSupportedException(); + } + + public override SqlFragment Visit(DbExceptExpression expression) + { + throw new NotSupportedException(); + } + + public override SqlFragment Visit(DbExpression expression) + { + throw new InvalidOperationException(); + } + + public override SqlFragment Visit(DbDerefExpression expression) + { + throw new NotImplementedException(); + } + + public override SqlFragment Visit(DbApplyExpression expression) + { + throw new NotSupportedException(); + } + + #endregion + + #region DBExpressionVisitor methods normally overridden + + public override SqlFragment Visit(DbUnionAllExpression expression) + { + throw new NotImplementedException(); + } + + public override SqlFragment Visit(DbSortExpression expression) + { + throw new NotImplementedException(); + } + + public override SqlFragment Visit(DbSkipExpression expression) + { + throw new NotImplementedException(); + } + + public override SqlFragment Visit(DbQuantifierExpression expression) + { + throw new NotImplementedException(); + } + + public override SqlFragment Visit(DbProjectExpression expression) + { + throw new NotImplementedException(); + } + + public override SqlFragment Visit(DbNewInstanceExpression expression) + { + throw new NotImplementedException(); + } + + public override SqlFragment Visit(DbLimitExpression expression) + { + throw new NotImplementedException(); + } + + public override SqlFragment Visit(DbJoinExpression expression) + { + throw new NotImplementedException(); + } + + public override SqlFragment Visit(DbGroupByExpression expression) + { + throw new NotImplementedException(); + } + + public override SqlFragment Visit(DbFilterExpression expression) + { + throw new NotImplementedException(); + } + + public override SqlFragment Visit(DbElementExpression expression) + { + throw new NotImplementedException(); + } + + public override SqlFragment Visit(DbDistinctExpression expression) + { + throw new NotImplementedException(); + } + + public override SqlFragment Visit(DbCrossJoinExpression expression) + { + throw new NotImplementedException(); + } + + #endregion + + #region "Optimization" + + /// + /// If current fragment is select and its from clause is another select, try fuse the inner select with the outer select. + /// (Thus removing a nested query, which may have bad performance in Mysql). + /// + /// The fragment to probe and posibly optimize + /// The fragment fused, or the original one. + protected internal InputFragment TryFusingSelect(InputFragment f) + { + SelectStatement result = f as SelectStatement; + if (!CanFuseSelect(f as SelectStatement)) return f; + result = FuseSelectWithInnerSelect(result, result.From as SelectStatement); + return result; + } + + protected internal SelectStatement FuseSelectWithInnerSelect(SelectStatement outer, SelectStatement inner) + { + string oldTableName = (inner.From as TableFragment).Name; + string newTableName = inner.Name; + Dictionary dicColumns = new Dictionary(); + + foreach (ColumnFragment cf in inner.Columns) + { + if (cf.ColumnAlias != null) + dicColumns.Add(cf.ColumnAlias, cf); + } + outer.From = inner.From; + (outer.From as TableFragment).Name = newTableName; + // Dispatch Where + if (outer.Where == null) + { + outer.Where = inner.Where; + } + else if (inner.Where != null) + { + outer.Where = new BinaryFragment() { Left = outer.Where, Right = inner.Where, Operator = "AND" }; + } + VisitAndReplaceTableName(outer.Where, oldTableName, newTableName, dicColumns); + // For the next constructions, either is defined on outer or at inner, not both + // Dispatch Limit + if (outer.Limit == null) + { + outer.Limit = inner.Limit; + VisitAndReplaceTableName(outer.Limit, oldTableName, newTableName, dicColumns); + } + // Dispatch GroupBy + if (outer.GroupBy == null && inner.GroupBy != null) + { + foreach (SqlFragment sf in inner.GroupBy) + outer.AddGroupBy(sf); + foreach (SqlFragment sf in outer.GroupBy) + VisitAndReplaceTableName(sf, oldTableName, newTableName, dicColumns); + } + // Dispatch OrderBy + if (outer.OrderBy != null || inner.OrderBy != null) + { + if (inner.OrderBy != null) + { + foreach (SortFragment sf in inner.OrderBy) + outer.AddOrderBy(sf); + } + foreach (SortFragment sf in outer.OrderBy) + VisitAndReplaceTableName(sf, oldTableName, newTableName, dicColumns); + } + // Dispatch Skip + if (outer.Skip == null) + outer.Skip = inner.Skip; + return outer; + } + + protected internal bool CanFuseSelect(SelectStatement select) + { + SelectStatement innerSelect = null; + if (select == null || select.Columns.Count != 0) return false; + innerSelect = select.From as SelectStatement; + if ((innerSelect == null) || !(innerSelect.From is TableFragment)) return false; + // Cannot fuse, unless construction is semantically compatible + // ie. Where's can be combined, Group by's no. + if ((select.Limit == null || innerSelect.Limit == null) && + (select.GroupBy == null || innerSelect.GroupBy == null) && + (select.OrderBy == null || innerSelect.OrderBy == null) && + (select.Skip == null || innerSelect.Skip == null) && + (select.IsDistinct == innerSelect.IsDistinct)) + { + List cols = innerSelect.Columns; + for (int i = 0; i < cols.Count; i++) + if (cols[i].Literal != null) + return false; + return true; + } + else + { + return false; + } + } + + protected internal void VisitAndReplaceTableName(SqlFragment sf, string oldTable, string newTable, + Dictionary dicColumns) + { + if (sf == null) return; + ReplaceTableNameVisitor visitor = new ReplaceTableNameVisitor(oldTable, newTable, dicColumns); + sf.Accept(visitor); + } + + #endregion + + protected InputFragment VisitInputExpression(DbExpression e, string name, TypeUsage type) + { + SqlFragment f = e.Accept(this); + Debug.Assert(f is InputFragment); + + InputFragment inputFragment = f as InputFragment; + inputFragment.Name = name; + TryFusingSelect(inputFragment); + + if (inputFragment is TableFragment && type != null) + (inputFragment as TableFragment).Type = type; + + SelectStatement select = inputFragment as SelectStatement; + if ((select != null) && (select.From is TableFragment)) + { + (select.From as TableFragment).Type = type; + } + + if (name != null) + scope.Add(name, inputFragment); + + return inputFragment; + } + + protected virtual SelectStatement GenerateReturningSql(DbModificationCommandTree tree, DbExpression returning) + { + SelectStatement select = new SelectStatement(this); + + Debug.Assert(returning is DbNewInstanceExpression); + VisitNewInstanceExpression(select, returning as DbNewInstanceExpression); + + select.From = (InputFragment)tree.Target.Expression.Accept(this); + + ListFragment where = new ListFragment(); + select.Where = where; + return select; + } + + #region Private Methods + + /// + /// Examines a binary expression to see if it is an special case suitable to conversion + /// to a more efficient and equivalent LIKE sql expression. + /// + /// + /// + /// + /// + protected LikeFragment TryPromoteToLike(DbExpression left, DbExpression right, string op) + { + DbFunctionExpression fl = left as DbFunctionExpression; + if ((fl != null) && (right is DbConstantExpression)) + { + LikeFragment like = new LikeFragment(); + if (fl.Function.FullName == "Edm.IndexOf") + { + DbParameterReferenceExpression par; + DbPropertyExpression prop; + int value = Convert.ToInt32(((DbConstantExpression)right).Value); + like.Argument = fl.Arguments[1].Accept(this); + if ((value == 1) && (op == "=")) + { + DbFunctionExpression fr1; + DbFunctionExpression fr2; + if ((fl.Arguments[0] is DbConstantExpression)) + { + // Case LIKE 'pattern%' + DbConstantExpression c = (DbConstantExpression)fl.Arguments[0]; + like.Pattern = new LiteralFragment(string.Format("'{0}%'", EscapeLikeLiteralValue(c.Value.ToString()))); + return like; + } + else if ((fl.Arguments.Count == 2) && + ((fr1 = fl.Arguments[0] as DbFunctionExpression) != null) && + ((fr2 = fl.Arguments[1] as DbFunctionExpression) != null) && + (fr1.Function.FullName == "Edm.Reverse") && + (fr2.Function.FullName == "Edm.Reverse")) + { + // Case LIKE '%pattern' in EF .NET 4.0 + if (fr1.Arguments[0] is DbConstantExpression) + { + DbConstantExpression c = (DbConstantExpression)fr1.Arguments[0]; + like.Pattern = new LiteralFragment(string.Format("'%{0}'", EscapeLikeLiteralValue(c.Value.ToString()))); + like.Argument = fr2.Arguments[0].Accept(this); + return like; + } + else if ( /* For EF6 */ + ((par = fr1.Arguments[0] as DbParameterReferenceExpression) != null) && + ((prop = fr2.Arguments[0] as DbPropertyExpression) != null)) + { + // Pattern LIKE "%..." in EF6 + like.Pattern = par.Accept(this); + like.Argument = prop.Accept(this); + return like; + } + } + else if ((fl.Arguments.Count == 2) && + ((par = fl.Arguments[0] as DbParameterReferenceExpression) != null) && + ((prop = fl.Arguments[1] as DbPropertyExpression) != null)) + { + // Case LIKE "pattern%" in EF6 + like.Pattern = par.Accept(this); + like.Argument = prop.Accept(this); + return like; + } + } + else if (value == 0) + { + if (op == ">") + { + if (fl.Arguments[0] is DbConstantExpression) + { + // Case LIKE '%pattern%' + DbConstantExpression c = (DbConstantExpression)fl.Arguments[0]; + like.Pattern = new LiteralFragment(string.Format("'%{0}%'", EscapeLikeLiteralValue(c.Value.ToString()))); + return like; + } + else if ((par = fl.Arguments[0] as DbParameterReferenceExpression) != null) + { + // Case LIKE "%pattern%" in EF6 + like.Pattern = fl.Arguments[0].Accept(this); + return like; + } + } + } + } + // Like '%pattern' in EF .NET 3.5 (yes, is different than in .NET 4.0) + else if (fl.Function.FullName == "Edm.Right") + { + DbFunctionExpression fLength = fl.Arguments[1] as DbFunctionExpression; + if ((fLength != null) && (fLength.Function.FullName == "Edm.Length") && (fLength.Arguments[0] is DbConstantExpression)) + { + DbConstantExpression c2 = fLength.Arguments[0] as DbConstantExpression; + DbConstantExpression c1 = (DbConstantExpression)right; + if (c1.Value == c2.Value) + { + like.Argument = fl.Arguments[0].Accept(this); + like.Pattern = new LiteralFragment(string.Format("'%{0}'", EscapeLikeLiteralValue(c1.Value.ToString()))); + return like; + } + } + } + } + return null; + } + + protected virtual SqlFragment VisitBinaryExpression(DbExpression left, DbExpression right, string op) + { + // Optimization: try to use 'like' instead of 'locate' (Edm.IndexOf) for these + // cases: (like 'word%'), (like '%word') & (like '%word%'). + LikeFragment like = TryPromoteToLike(left, right, op); + if (like != null) + return like; + // normal flow + BinaryFragment f = new BinaryFragment(); + f.Operator = op; + f.Left = left.Accept(this); + f.WrapLeft = ShouldWrapExpression(left); + f.Right = right.Accept(this); + f.WrapRight = ShouldWrapExpression(right); + // Optimization, try to promote to In expression + // NOTE: In EF6, this optimization is already done, we just implement Visit(DbInExpression). + return f; + } + + protected virtual SqlFragment TryToPromoteToIn(BinaryFragment bf) + { + // TODO: Remember Morgan's theorem + // Only try to merge if they are OR'ed. + if ((bf.Operator == "OR")) + { + InFragment inf = bf.Left as InFragment; + InFragment inf2 = bf.Right as InFragment; + if (inf == null) + { + BinaryFragment bfLeft = bf.Left as BinaryFragment; + if (bfLeft == null) + return bf; + if (inf2 == null) + { + // try to create a new infragment + BinaryFragment bfRight = bf.Right as BinaryFragment; + if (bfRight == null) + return bf; + InFragment inff = TryMergeTwoBinaryFragments(bfLeft, bfRight); + if (inff != null) + return inff; + } + else + { + // try to merge an existing infragment & a binaryfragment. + SqlFragment sf = TryMergeBinaryFragmentAndInFragment(bfLeft, inf2); + if (sf != null) + return sf; + } } - + else if (inf2 == null) + { + BinaryFragment bfRight = bf.Right as BinaryFragment; + if (bfRight == null) + return bf; + else + { + // try to merge an existing infragment & a binaryfragment. + SqlFragment sf = TryMergeBinaryFragmentAndInFragment(bfRight, inf); + if (sf != null) + return sf; + } + } + else + { + // try to merge both InFragments + SqlFragment sf = TryMergeTwoInFragments(inf, inf2); + if (sf != null) + return sf; + } + } + return bf; + } + + protected InFragment TryMergeTwoInFragments(InFragment infLeft, InFragment infRight) + { + if (infLeft.Argument.Equals(infRight.Argument) && + (infLeft.IsNegated == infRight.IsNegated) && (!infLeft.IsNegated)) + { + infLeft.InList.AddRange(infRight.InList); + return infLeft; + } + return null; + } + + protected InFragment TryMergeTwoBinaryFragments(BinaryFragment left, BinaryFragment right) + { + if ((left.IsNegated == right.IsNegated) && (!left.IsNegated) && + (left.Operator == "=") && (right.Operator == "=")) + { + ColumnFragment cf; + LiteralFragment lf; + GetBinaryFragmentPartsForIn(left, out lf, out cf); + if ((lf != null) && (cf != null)) + { + ColumnFragment cf2; + LiteralFragment lf2; + GetBinaryFragmentPartsForIn(right, out lf2, out cf2); + if ((lf2 != null) && (cf2 != null) && cf.Equals(cf2)) + { + InFragment inf = new InFragment(); + inf.Argument = cf; + inf.InList.Add(lf); + inf.InList.Add(lf2); + return inf; + } + } + } + return null; + } + + protected InFragment TryMergeBinaryFragmentAndInFragment(BinaryFragment bf, InFragment inf) + { + if (!bf.IsNegated && (bf.Operator == "=")) + { + ColumnFragment cf; + LiteralFragment lf; + GetBinaryFragmentPartsForIn(bf, out lf, out cf); + if ((lf != null) && (cf != null)) + { + if (inf.Argument.Equals(cf)) + { + if (!inf.InList.Contains(lf)) + inf.InList.Add(lf); + return inf; + } + } + } + return null; + } + + protected void GetBinaryFragmentPartsForIn(BinaryFragment bf, out LiteralFragment lf, out ColumnFragment cf) + { + cf = bf.Right as ColumnFragment; + lf = bf.Left as LiteralFragment; + if (lf == null) + { + lf = bf.Right as LiteralFragment; + cf = bf.Left as ColumnFragment; + } + } + + protected bool ShouldWrapExpression(DbExpression e) + { + switch (e.ExpressionKind) + { + case DbExpressionKind.Property: + case DbExpressionKind.ParameterReference: + case DbExpressionKind.Constant: + return false; } - - else - { - fragment.Schema = target.EntityContainer.Name; - fragment.Table = target.Name; - - propExists = target.MetadataProperties.TryGetValue("Schema", true, out property); - if (propExists && property.Value != null) - fragment.Schema = property.Value as string; - propExists = target.MetadataProperties.TryGetValue("Table", true, out property); - if (propExists && property.Value != null) - fragment.Table = property.Value as string; - } - return fragment; - } - - public override SqlFragment Visit(DbParameterReferenceExpression expression) - { - return new LiteralFragment("@" + expression.ParameterName); - } - - public override SqlFragment Visit(DbNotExpression expression) - { - SqlFragment f = expression.Argument.Accept(this); - Debug.Assert(f is NegatableFragment); - NegatableFragment nf = f as NegatableFragment; - nf.Negate(); - return nf; - } - - public override SqlFragment Visit(DbIsEmptyExpression expression) - { - ExistsFragment f = new ExistsFragment(expression.Argument.Accept(this)); - f.Negate(); - return f; - } - - public override SqlFragment Visit(DbFunctionExpression expression) - { - FunctionProcessor gen = new FunctionProcessor(); - return gen.Generate(expression, this); - } - - public override SqlFragment Visit(DbConstantExpression expression) - { - PrimitiveTypeKind pt = ((PrimitiveType)expression.ResultType.EdmType).PrimitiveTypeKind; - string literal = Metadata.GetNumericLiteral(pt, expression.Value); - if (literal != null) - return new LiteralFragment(literal); - else if (pt == PrimitiveTypeKind.Boolean) - return new LiteralFragment((bool)expression.Value ? "1" : "0"); - else - { - // use a parameter for non-numeric types so we get proper - // quoting - MySqlParameter p = new MySqlParameter(); - p.ParameterName = CreateUniqueParameterName(); - p.DbType = Metadata.GetDbType(expression.ResultType); - p.Value = Metadata.NormalizeValue(expression.ResultType, expression.Value); - Parameters.Add(p); - return new LiteralFragment(p.ParameterName); - } - } - - public override SqlFragment Visit(DbComparisonExpression expression) - { - return VisitBinaryExpression(expression.Left, expression.Right, - Metadata.GetOperator(expression.ExpressionKind)); - } - - public override SqlFragment Visit(DbAndExpression expression) - { - return VisitBinaryExpression(expression.Left, expression.Right, "AND"); - } - - public override SqlFragment Visit(DbOrExpression expression) - { - return VisitBinaryExpression(expression.Left, expression.Right, "OR"); - } - - public override SqlFragment Visit(DbCastExpression expression) - { - //TODO: handle casting - return expression.Argument.Accept(this); - } - -#if EF6 - public override SqlFragment Visit(DbInExpression expression) - { - SqlFragment sf = expression.Item.Accept(this); - InFragment inf = new InFragment(); - inf.Argument = sf; - for( int i = 0; i < expression.List.Count; i++ ) - { - LiteralFragment lf = Visit( expression.List[ i ] as DbConstantExpression ) as LiteralFragment; - inf.InList.Add( lf ); - } - return inf; - } - - public override SqlFragment Visit(DbLambdaExpression expression) - { - throw new NotImplementedException(); - } -#endif - - public override SqlFragment Visit(DbLikeExpression expression) - { - LikeFragment f = new LikeFragment(); - - f.Argument = expression.Argument.Accept(this); - f.Pattern = expression.Pattern.Accept(this); - - return f; - } - - public override SqlFragment Visit(DbCaseExpression expression) - { - CaseFragment c = new CaseFragment(); - - Debug.Assert(expression.When.Count == expression.Then.Count); - - for (int i = 0; i < expression.When.Count; ++i) - { - c.When.Add(expression.When[i].Accept(this)); - c.Then.Add(expression.Then[i].Accept(this)); - } - if (expression.Else != null && !(expression.Else is DbNullExpression)) - c.Else = expression.Else.Accept(this); - return c; - } - - public override SqlFragment Visit(DbIsNullExpression expression) - { - IsNullFragment f = new IsNullFragment(); - f.Argument = expression.Argument.Accept(this); - return f; - } - - public override SqlFragment Visit(DbIntersectExpression expression) - { - throw new NotSupportedException(); - } - - public override SqlFragment Visit(DbNullExpression expression) - { - return new LiteralFragment("NULL"); - } - - public override SqlFragment Visit(DbArithmeticExpression expression) - { - if (expression.ExpressionKind == DbExpressionKind.UnaryMinus) - { - ListFragment f = new ListFragment(); - f.Append("-("); - f.Append(expression.Arguments[0].Accept(this)); - f.Append(")"); - return f; - } - - string op = String.Empty; - switch (expression.ExpressionKind) - { - case DbExpressionKind.Divide: - op = "/"; break; - case DbExpressionKind.Minus: - op = "-"; break; - case DbExpressionKind.Modulo: - op = "%"; break; - case DbExpressionKind.Multiply: - op = "*"; break; - case DbExpressionKind.Plus: - op = "+"; break; - default: - throw new NotSupportedException(); - } - return VisitBinaryExpression(expression.Arguments[0], expression.Arguments[1], op); - } - - protected void VisitNewInstanceExpression(SelectStatement select, - DbNewInstanceExpression expression) - { - Debug.Assert(expression.ResultType.EdmType is RowType); - - RowType row = expression.ResultType.EdmType as RowType; - - for (int i = 0; i < expression.Arguments.Count; i++) - { - ColumnFragment col; - - SqlFragment fragment = expression.Arguments[i].Accept(this); - if (fragment is ColumnFragment) - col = fragment as ColumnFragment; - else - { - col = new ColumnFragment(null, null); - col.Literal = fragment; - } - - col.ColumnAlias = row.Properties[i].Name; - select.Columns.Add(col); - } - } - - public override SqlFragment Visit(DbTreatExpression expression) - { - throw new NotSupportedException(); - } - - public override SqlFragment Visit(DbRelationshipNavigationExpression expression) - { - throw new NotSupportedException(); - } - - public override SqlFragment Visit(DbRefExpression expression) - { - throw new NotSupportedException(); - } - - public override SqlFragment Visit(DbOfTypeExpression expression) - { - throw new NotSupportedException(); - } - - public override SqlFragment Visit(DbIsOfExpression expression) - { - throw new NotSupportedException(); - } - - public override SqlFragment Visit(DbRefKeyExpression expression) - { - throw new NotSupportedException(); - } - - public override SqlFragment Visit(DbEntityRefExpression expression) - { - throw new NotSupportedException(); - } - - public override SqlFragment Visit(DbExceptExpression expression) - { - throw new NotSupportedException(); - } - - public override SqlFragment Visit(DbExpression expression) - { - throw new InvalidOperationException(); - } - - public override SqlFragment Visit(DbDerefExpression expression) - { - throw new NotImplementedException(); - } - - public override SqlFragment Visit(DbApplyExpression expression) - { - throw new NotSupportedException(); - } - - #endregion - - #region DBExpressionVisitor methods normally overridden - - public override SqlFragment Visit(DbUnionAllExpression expression) - { - throw new NotImplementedException(); - } - - public override SqlFragment Visit(DbSortExpression expression) - { - throw new NotImplementedException(); - } - - public override SqlFragment Visit(DbSkipExpression expression) - { - throw new NotImplementedException(); - } - - public override SqlFragment Visit(DbQuantifierExpression expression) - { - throw new NotImplementedException(); - } - - public override SqlFragment Visit(DbProjectExpression expression) - { - throw new NotImplementedException(); - } - - public override SqlFragment Visit(DbNewInstanceExpression expression) - { - throw new NotImplementedException(); - } - - public override SqlFragment Visit(DbLimitExpression expression) - { - throw new NotImplementedException(); - } - - public override SqlFragment Visit(DbJoinExpression expression) - { - throw new NotImplementedException(); - } - - public override SqlFragment Visit(DbGroupByExpression expression) - { - throw new NotImplementedException(); - } - - public override SqlFragment Visit(DbFilterExpression expression) - { - throw new NotImplementedException(); - } - - public override SqlFragment Visit(DbElementExpression expression) - { - throw new NotImplementedException(); - } - - public override SqlFragment Visit(DbDistinctExpression expression) - { - throw new NotImplementedException(); - } - - public override SqlFragment Visit(DbCrossJoinExpression expression) - { - throw new NotImplementedException(); - } - - #endregion - - #region "Optimization" - - /// - /// If current fragment is select and its from clause is another select, try fuse the inner select with the outer select. - /// (Thus removing a nested query, which may have bad performance in Mysql). - /// - /// The fragment to probe and posibly optimize - /// The fragment fused, or the original one. - protected internal InputFragment TryFusingSelect(InputFragment f) - { - SelectStatement result = f as SelectStatement; - if (!CanFuseSelect(f as SelectStatement)) return f; - result = FuseSelectWithInnerSelect(result, result.From as SelectStatement); - return result; - } - - protected internal SelectStatement FuseSelectWithInnerSelect(SelectStatement outer, SelectStatement inner) - { - string oldTableName = (inner.From as TableFragment).Name; - string newTableName = inner.Name; - Dictionary dicColumns = new Dictionary(); - - foreach (ColumnFragment cf in inner.Columns) - { - if (cf.ColumnAlias != null) - dicColumns.Add(cf.ColumnAlias, cf); - } - outer.From = inner.From; - (outer.From as TableFragment).Name = newTableName; - // Dispatch Where - if (outer.Where == null) - { - outer.Where = inner.Where; - } - else if (inner.Where != null) - { - outer.Where = new BinaryFragment() { Left = outer.Where, Right = inner.Where, Operator = "AND" }; - } - VisitAndReplaceTableName(outer.Where, oldTableName, newTableName, dicColumns); - // For the next constructions, either is defined on outer or at inner, not both - // Dispatch Limit - if (outer.Limit == null) - { - outer.Limit = inner.Limit; - VisitAndReplaceTableName(outer.Limit, oldTableName, newTableName, dicColumns); - } - // Dispatch GroupBy - if (outer.GroupBy == null && inner.GroupBy != null) - { - foreach (SqlFragment sf in inner.GroupBy) - outer.AddGroupBy(sf); - foreach (SqlFragment sf in outer.GroupBy) - VisitAndReplaceTableName(sf, oldTableName, newTableName, dicColumns); - } - // Dispatch OrderBy - if (outer.OrderBy != null || inner.OrderBy != null) - { - if (inner.OrderBy != null) - { - foreach (SortFragment sf in inner.OrderBy) - outer.AddOrderBy(sf); - } - foreach (SortFragment sf in outer.OrderBy) - VisitAndReplaceTableName(sf, oldTableName, newTableName, dicColumns); - } - // Dispatch Skip - if (outer.Skip == null) - outer.Skip = inner.Skip; - return outer; - } - - protected internal bool CanFuseSelect(SelectStatement select) - { - SelectStatement innerSelect = null; - if (select == null || select.Columns.Count != 0) return false; - innerSelect = select.From as SelectStatement; - if ((innerSelect == null) || !( innerSelect.From is TableFragment )) return false; - // Cannot fuse, unless construction is semantically compatible - // ie. Where's can be combined, Group by's no. - if ((select.Limit == null || innerSelect.Limit == null) && - (select.GroupBy == null || innerSelect.GroupBy == null) && - (select.OrderBy == null || innerSelect.OrderBy == null) && - (select.Skip == null || innerSelect.Skip == null) && - ( select.IsDistinct == innerSelect.IsDistinct ) ) - { - List cols = innerSelect.Columns; - for (int i = 0; i < cols.Count; i++) - if (cols[i].Literal != null) - return false; - return true; - } - else - { - return false; - } - } - - protected internal void VisitAndReplaceTableName(SqlFragment sf, string oldTable, string newTable, - Dictionary dicColumns) - { - if (sf == null) return; - ReplaceTableNameVisitor visitor = new ReplaceTableNameVisitor(oldTable, newTable, dicColumns); - sf.Accept(visitor); - } - - #endregion - - protected InputFragment VisitInputExpression(DbExpression e, string name, TypeUsage type) - { - SqlFragment f = e.Accept(this); - Debug.Assert(f is InputFragment); - - InputFragment inputFragment = f as InputFragment; - inputFragment.Name = name; - TryFusingSelect(inputFragment); - - if (inputFragment is TableFragment && type != null) - (inputFragment as TableFragment).Type = type; - - SelectStatement select = inputFragment as SelectStatement; - if ((select != null) && (select.From is TableFragment)) - { - (select.From as TableFragment).Type = type; - } - - if (name != null) - scope.Add(name, inputFragment); - - return inputFragment; - } - - protected virtual SelectStatement GenerateReturningSql(DbModificationCommandTree tree, DbExpression returning) - { - SelectStatement select = new SelectStatement(this); - - Debug.Assert(returning is DbNewInstanceExpression); - VisitNewInstanceExpression(select, returning as DbNewInstanceExpression); - - select.From = (InputFragment)tree.Target.Expression.Accept(this); - - ListFragment where = new ListFragment(); - select.Where = where; - return select; - } - - #region Private Methods - - /// - /// Examines a binary expression to see if it is an special case suitable to conversion - /// to a more efficient and equivalent LIKE sql expression. - /// - /// - /// - /// - /// - protected LikeFragment TryPromoteToLike(DbExpression left, DbExpression right, string op) - { - DbFunctionExpression fl = left as DbFunctionExpression; - if ((fl != null) && (right is DbConstantExpression)) - { - LikeFragment like = new LikeFragment(); - if (fl.Function.FullName == "Edm.IndexOf") - { - DbParameterReferenceExpression par; - DbPropertyExpression prop; - int value = Convert.ToInt32(((DbConstantExpression)right).Value); - like.Argument = fl.Arguments[1].Accept(this); - if ((value == 1) && (op == "=")) - { - DbFunctionExpression fr1; - DbFunctionExpression fr2; - if ((fl.Arguments[0] is DbConstantExpression)) - { - // Case LIKE 'pattern%' - DbConstantExpression c = (DbConstantExpression)fl.Arguments[0]; - like.Pattern = new LiteralFragment(string.Format("'{0}%'", c.Value.ToString().Replace( "'", "''" ) )); - return like; - } - else if ((fl.Arguments.Count == 2) && - ((fr1 = fl.Arguments[0] as DbFunctionExpression) != null) && - ((fr2 = fl.Arguments[1] as DbFunctionExpression) != null) && - (fr1.Function.FullName == "Edm.Reverse") && - (fr2.Function.FullName == "Edm.Reverse")) - { - // Case LIKE '%pattern' in EF .NET 4.0 - if (fr1.Arguments[0] is DbConstantExpression) - { - DbConstantExpression c = (DbConstantExpression)fr1.Arguments[0]; - like.Pattern = new LiteralFragment(string.Format("'%{0}'", c.Value.ToString().Replace("'", "''") )); - like.Argument = fr2.Arguments[0].Accept(this); - return like; - } - else if( /* For EF6 */ - (( par = fr1.Arguments[0] as DbParameterReferenceExpression ) != null ) && - (( prop = fr2.Arguments[0] as DbPropertyExpression) != null )) - { - // Pattern LIKE "%..." in EF6 - like.Pattern = par.Accept(this); - like.Argument = prop.Accept(this); - return like; - } - } - else if( ( fl.Arguments.Count == 2) && - (( par = fl.Arguments[0] as DbParameterReferenceExpression ) != null ) && - (( prop = fl.Arguments[1] as DbPropertyExpression ) != null ) ) - { - // Case LIKE "pattern%" in EF6 - like.Pattern = par.Accept(this); - like.Argument = prop.Accept(this); - return like; - } - } - else if (value == 0) - { - if ( op == ">") - { - if (fl.Arguments[0] is DbConstantExpression) - { - // Case LIKE '%pattern%' - DbConstantExpression c = (DbConstantExpression)fl.Arguments[0]; - like.Pattern = new LiteralFragment(string.Format("%{0}%", c.Value.ToString())); - return like; - } - else if ((par = fl.Arguments[0] as DbParameterReferenceExpression) != null) - { - // Case LIKE "%pattern%" in EF6 - like.Pattern = fl.Arguments[0].Accept(this); - return like; - } - } - } - } - // Like '%pattern' in EF .NET 3.5 (yes, is different than in .NET 4.0) - else if (fl.Function.FullName == "Edm.Right") - { - DbFunctionExpression fLength = fl.Arguments[1] as DbFunctionExpression; - if ((fLength != null) && (fLength.Function.FullName == "Edm.Length") && (fLength.Arguments[0] is DbConstantExpression)) - { - DbConstantExpression c2 = fLength.Arguments[0] as DbConstantExpression; - DbConstantExpression c1 = (DbConstantExpression)right; - if (c1.Value == c2.Value) - { - like.Argument = fl.Arguments[0].Accept(this); - like.Pattern = new LiteralFragment(string.Format("'%{0}'", c1.Value.ToString().Replace("'", "''") )); - return like; - } - } - } - } - return null; - } - - protected virtual SqlFragment VisitBinaryExpression(DbExpression left, DbExpression right, string op) - { - // Optimization: try to use 'like' instead of 'locate' (Edm.IndexOf) for these - // cases: (like 'word%'), (like '%word') & (like '%word%'). - LikeFragment like = TryPromoteToLike(left, right, op); - if (like != null) - return like; - // normal flow - BinaryFragment f = new BinaryFragment(); - f.Operator = op; - f.Left = left.Accept(this); - f.WrapLeft = ShouldWrapExpression(left); - f.Right = right.Accept(this); - f.WrapRight = ShouldWrapExpression(right); - // Optimization, try to promote to In expression - // NOTE: In EF6, this optimization is already done, we just implement Visit(DbInExpression). -#if !EF6 - return TryToPromoteToIn(f); -#else - return f; -#endif - } - - protected virtual SqlFragment TryToPromoteToIn(BinaryFragment bf) - { - // TODO: Remember Morgan's theorem - // Only try to merge if they are OR'ed. - if ((bf.Operator == "OR") ) - { - InFragment inf = bf.Left as InFragment; - InFragment inf2 = bf.Right as InFragment; - if (inf == null) - { - BinaryFragment bfLeft = bf.Left as BinaryFragment; - if( bfLeft == null ) - return bf; - if (inf2 == null) - { - // try to create a new infragment - BinaryFragment bfRight = bf.Right as BinaryFragment; - if (bfRight == null) - return bf; - InFragment inff = TryMergeTwoBinaryFragments(bfLeft, bfRight); - if (inff != null) - return inff; - } - else - { - // try to merge an existing infragment & a binaryfragment. - SqlFragment sf = TryMergeBinaryFragmentAndInFragment(bfLeft, inf2); - if (sf != null) - return sf; - } - } - else if (inf2 == null) - { - BinaryFragment bfRight = bf.Right as BinaryFragment; - if (bfRight == null) - return bf; - else - { - // try to merge an existing infragment & a binaryfragment. - SqlFragment sf = TryMergeBinaryFragmentAndInFragment(bfRight, inf); - if (sf != null) - return sf; - } - } - else - { - // try to merge both InFragments - SqlFragment sf = TryMergeTwoInFragments( inf, inf2 ); - if (sf != null) - return sf; - } - } - return bf; - } - - protected InFragment TryMergeTwoInFragments(InFragment infLeft, InFragment infRight) - { - if (infLeft.Argument.Equals(infRight.Argument) && - ( infLeft.IsNegated == infRight.IsNegated ) && ( !infLeft.IsNegated ) ) - { - infLeft.InList.AddRange(infRight.InList); - return infLeft; - } - return null; - } - - protected InFragment TryMergeTwoBinaryFragments(BinaryFragment left, BinaryFragment right) - { - if( ( left.IsNegated == right.IsNegated ) && ( ! left.IsNegated ) && - ( left.Operator == "=" ) && ( right.Operator == "=" ) ) - { - ColumnFragment cf; - LiteralFragment lf; - GetBinaryFragmentPartsForIn(left, out lf, out cf); - if ((lf != null) && (cf != null)) - { - ColumnFragment cf2; - LiteralFragment lf2; - GetBinaryFragmentPartsForIn(right, out lf2, out cf2); - if ( (lf2 != null) && (cf2 != null) && cf.Equals(cf2)) - { - InFragment inf = new InFragment(); - inf.Argument = cf; - inf.InList.Add(lf); - inf.InList.Add(lf2); - return inf; - } - } - } - return null; - } - - protected InFragment TryMergeBinaryFragmentAndInFragment(BinaryFragment bf, InFragment inf) - { - if( !bf.IsNegated && ( bf.Operator == "=" )) - { - ColumnFragment cf; - LiteralFragment lf; - GetBinaryFragmentPartsForIn(bf, out lf, out cf); - if ((lf != null) && (cf != null)) - { - if (inf.Argument.Equals(cf)) - { - if (!inf.InList.Contains(lf)) - inf.InList.Add(lf); - return inf; - } - } - } - return null; - } - - protected void GetBinaryFragmentPartsForIn(BinaryFragment bf, out LiteralFragment lf, out ColumnFragment cf) - { - cf = bf.Right as ColumnFragment; - lf = bf.Left as LiteralFragment; - if (lf == null) - { - lf = bf.Right as LiteralFragment; - cf = bf.Left as ColumnFragment; - } - } - - protected bool ShouldWrapExpression(DbExpression e) - { - switch (e.ExpressionKind) - { - case DbExpressionKind.Property: - case DbExpressionKind.ParameterReference: - case DbExpressionKind.Constant: - return false; - } - return true; - } - - #endregion - - } -} + return true; + } + + private string EscapeLikeLiteralValue(string s) => s.Replace(@"\", @"\\\\") + .Replace("'", @"\'") + .Replace("�", @"\'") + .Replace(((char)0).ToString(), @"\0") + .Replace("%", @"\%") + .Replace("_", @"\_"); + + #endregion + } +} diff --git a/EntityFramework/src/Generators/UpdateGenerator.cs b/EntityFramework/src/Generators/UpdateGenerator.cs new file mode 100644 index 000000000..ac8c1aee8 --- /dev/null +++ b/EntityFramework/src/Generators/UpdateGenerator.cs @@ -0,0 +1,158 @@ +// Copyright © 2008, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System.Collections.Generic; +using System.Data.Entity.Core.Common.CommandTrees; +using System.Data.Entity.Core.Metadata.Edm; + + +namespace MySql.Data.EntityFramework +{ + class UpdateGenerator : SqlGenerator + { + private bool _onReturningSelect; + + public override string GenerateSQL(DbCommandTree tree) + { + DbUpdateCommandTree commandTree = tree as DbUpdateCommandTree; + + UpdateStatement statement = new UpdateStatement(); + + _onReturningSelect = false; + statement.Target = commandTree.Target.Expression.Accept(this); + scope.Add("target", statement.Target as InputFragment); + + if (values == null) + values = new Dictionary(); + + foreach (DbSetClause setClause in commandTree.SetClauses) + { + statement.Properties.Add(setClause.Property.Accept(this)); + DbExpression value = setClause.Value; + SqlFragment valueFragment = value.Accept(this); + statement.Values.Add(valueFragment); + + if (value.ExpressionKind != DbExpressionKind.Null) + { + EdmMember property = ((DbPropertyExpression)setClause.Property).Property; + values.Add(property, valueFragment); + } + } + + statement.Where = commandTree.Predicate.Accept(this); + + _onReturningSelect = true; + if (commandTree.Returning != null) + statement.ReturningSelect = GenerateReturningSql(commandTree, commandTree.Returning); + + return statement.ToString(); + } + + protected override SelectStatement GenerateReturningSql(DbModificationCommandTree tree, DbExpression returning) + { + SelectStatement select = base.GenerateReturningSql(tree, returning); + ListFragment where = new ListFragment(); + where.Append(" row_count() = 1 and ("); + where.Append( ((DbUpdateCommandTree)tree).Predicate.Accept(this) ); + where.Append(")"); + select.Where = where; + + return select; + } + + private Stack _columnsVisited = new Stack(); + + public override SqlFragment Visit(DbAndExpression expression) + { + if (_onReturningSelect) + { + if (IsExcludedCondition(expression.Left)) + { + return expression.Right.Accept(this); + } + + if (IsExcludedCondition(expression.Right)) + { + return expression.Left.Accept(this); + } + } + + return base.Visit(expression); + } + + private bool IsExcludedCondition(DbExpression e) + { + var expr = e as DbComparisonExpression; + if (expr == null) return false; + var propExpr = expr.Left as DbPropertyExpression; + if (propExpr == null) return false; + + Facet item = null; + if (propExpr.Property.TypeUsage.Facets.TryGetValue("StoreGeneratedPattern", false, out item)) + { + return (StoreGeneratedPattern)item.Value == StoreGeneratedPattern.Computed; + } + return false; + } + + protected override SqlFragment VisitBinaryExpression(DbExpression left, DbExpression right, string op) + { + BinaryFragment f = new BinaryFragment(); + f.Operator = op; + f.Left = left.Accept(this); + f.WrapLeft = ShouldWrapExpression(left); + if (f.Left is ColumnFragment) + { + _columnsVisited.Push( (( DbPropertyExpression )left ).Property ); + } + f.Right = right.Accept(this); + if (f.Left is ColumnFragment) + { + _columnsVisited.Pop(); + } + f.WrapRight = ShouldWrapExpression(right); + return f; + } + + public override SqlFragment Visit(DbConstantExpression expression) + { + SqlFragment value = null; + if ( _onReturningSelect && values.TryGetValue(_columnsVisited.Peek(), out value)) + { + if (value is LiteralFragment) + { + MySqlParameter par = Parameters.Find(p => p.ParameterName == ( value as LiteralFragment ).Literal ); + if (par != null) + return new LiteralFragment(par.ParameterName); + } + } + return base.Visit(expression); + } + } +} diff --git a/Source/MySql.Data.Entity.EF6/Metadata.cs b/EntityFramework/src/Metadata.cs similarity index 83% rename from Source/MySql.Data.Entity.EF6/Metadata.cs rename to EntityFramework/src/Metadata.cs index 5a088416f..414c4726f 100644 --- a/Source/MySql.Data.Entity.EF6/Metadata.cs +++ b/EntityFramework/src/Metadata.cs @@ -1,213 +1,211 @@ -// Copyright © 2008, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Data; -using System.Collections.Generic; -using System.Globalization; -using System.Diagnostics; -#if EF6 -using System.Data.Entity.Core.Common.CommandTrees; -using System.Data.Entity.Core.Metadata.Edm; -using System.Data.Entity.Spatial; -#else -using System.Data.Metadata.Edm; -using System.Data.Common.CommandTrees; -#if NET_45_OR_GREATER -using System.Data.Spatial; -#endif -#endif - - -namespace MySql.Data.Entity -{ - class Metadata - { - public static string GetNumericLiteral(PrimitiveTypeKind type, object value) - { - switch (type) - { - case PrimitiveTypeKind.Byte: - case PrimitiveTypeKind.Int16: - case PrimitiveTypeKind.Int32: - case PrimitiveTypeKind.Int64: - case PrimitiveTypeKind.SByte: - return value.ToString(); - case PrimitiveTypeKind.Double: - return ((double)value).ToString("R", CultureInfo.InvariantCulture); - case PrimitiveTypeKind.Single: - return ((float)value).ToString("R", CultureInfo.InvariantCulture); - case PrimitiveTypeKind.Decimal: - return ((decimal)value).ToString(CultureInfo.InvariantCulture); - } - return null; - } - - public static bool IsNumericType(TypeUsage typeUsage) - { - PrimitiveType pt = (PrimitiveType)typeUsage.EdmType; - - switch (pt.PrimitiveTypeKind) - { - case PrimitiveTypeKind.Byte: - case PrimitiveTypeKind.Double: - case PrimitiveTypeKind.Single: - case PrimitiveTypeKind.Int16: - case PrimitiveTypeKind.Int32: - case PrimitiveTypeKind.Int64: - case PrimitiveTypeKind.SByte: - return true; - default: - return false; - } - } - - public static DbType GetDbType(TypeUsage typeUsage) - { - PrimitiveType pt = (PrimitiveType)typeUsage.EdmType; - - switch (pt.PrimitiveTypeKind) - { - case PrimitiveTypeKind.Geometry: return DbType.Object; - case PrimitiveTypeKind.Binary: return DbType.Binary; - case PrimitiveTypeKind.Boolean: return DbType.Boolean; - case PrimitiveTypeKind.Byte: return DbType.Byte; - case PrimitiveTypeKind.DateTime: return DbType.DateTime; - case PrimitiveTypeKind.DateTimeOffset: return DbType.DateTime; - case PrimitiveTypeKind.Decimal: return DbType.Decimal; - case PrimitiveTypeKind.Double: return DbType.Double; - case PrimitiveTypeKind.Single: return DbType.Single; - case PrimitiveTypeKind.Guid: return DbType.Guid; - case PrimitiveTypeKind.Int16: return DbType.Int16; - case PrimitiveTypeKind.Int32: return DbType.Int32; - case PrimitiveTypeKind.Int64: return DbType.Int64; - case PrimitiveTypeKind.SByte: return DbType.SByte; - case PrimitiveTypeKind.String: return DbType.String; - case PrimitiveTypeKind.Time: return DbType.Time; - // case PrimitiveTypeKind.UInt16: return DbType.UInt16; - // case PrimitiveTypeKind.UInt32: return DbType.UInt32; - // case PrimitiveTypeKind.UInt64: return DbType.UInt64; - default: - throw new InvalidOperationException( - string.Format("Unknown PrimitiveTypeKind {0}", pt.PrimitiveTypeKind)); - } - } - - - public static object NormalizeValue(TypeUsage type, object value) - { - PrimitiveType pt = (PrimitiveType)type.EdmType; - if (value != null && - value != DBNull.Value && - Type.GetTypeCode(value.GetType()) == TypeCode.Object) - { - DbGeometry geometryValue = value as DbGeometry; - if (geometryValue != null) - { - Byte[] geometryValBinary = new Byte[25]; - var buffer = geometryValue.AsBinary(); - var srid = geometryValue.WellKnownValue.CoordinateSystemId; - for (int i = 0; i < buffer.Length; i++) - { - if (i < 4) - { - geometryValBinary[i] = (byte)(srid & 0xff); - srid >>= 8; - } - geometryValBinary[i + 4] = buffer[i]; - } - return geometryValBinary; - } - } - if (pt.PrimitiveTypeKind != PrimitiveTypeKind.DateTimeOffset) return value; - DateTimeOffset dto = (DateTimeOffset)value; - DateTime dt = dto.DateTime; - if (dt.Year < 1970) - return new DateTime(1970, 1, 1, 0, 0, 1); - return dt; - } - - public static ParameterDirection ModeToDirection(ParameterMode mode) - { - switch (mode) - { - case ParameterMode.In: return ParameterDirection.Input; - case ParameterMode.Out: return ParameterDirection.Output; - case ParameterMode.InOut: return ParameterDirection.InputOutput; - default: - Debug.Assert(mode == ParameterMode.ReturnValue); - return ParameterDirection.ReturnValue; - } - } - - public static bool IsComparisonOperator(string op) - { - switch (op) - { - case "=": - case "<": - case ">": - case "<=": - case ">=": - case "!=": return true; - default: return false; - } - } - - public static string GetOperator(DbExpressionKind expressionKind) - { - switch (expressionKind) - { - case DbExpressionKind.Equals: return "="; - case DbExpressionKind.LessThan: return "<"; - case DbExpressionKind.GreaterThan: return ">"; - case DbExpressionKind.LessThanOrEquals: return "<="; - case DbExpressionKind.GreaterThanOrEquals: return ">="; - case DbExpressionKind.NotEquals: return "!="; - case DbExpressionKind.LeftOuterJoin: return "LEFT OUTER JOIN"; - case DbExpressionKind.InnerJoin: return "INNER JOIN"; - case DbExpressionKind.CrossJoin: return "CROSS JOIN"; - case DbExpressionKind.FullOuterJoin: return "OUTER JOIN"; - } - throw new NotSupportedException("expression kind not supported"); - } - - internal static IList GetProperties(EdmType type) - { - if (type is EntityType) - return ((EntityType)type).Properties; - if (type is ComplexType) - return ((ComplexType)type).Properties; - if (type is RowType) - return ((RowType)type).Properties; - throw new NotSupportedException(); - } - - internal static T TryGetValueMetadataProperty(MetadataItem mi, string name) - { - MetadataProperty property; - bool exists = mi.MetadataProperties.TryGetValue(name, true, out property); - if (exists) return (T)property.Value; - return default(T); - } - } -} +// Copyright © 2008, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Data; +using System.Collections.Generic; +using System.Globalization; +using System.Diagnostics; +using System.Data.Entity.Core.Common.CommandTrees; +using System.Data.Entity.Core.Metadata.Edm; +using System.Data.Entity.Spatial; + + +namespace MySql.Data.EntityFramework +{ + class Metadata + { + public static string GetNumericLiteral(PrimitiveTypeKind type, object value) + { + switch (type) + { + case PrimitiveTypeKind.Byte: + case PrimitiveTypeKind.Int16: + case PrimitiveTypeKind.Int32: + case PrimitiveTypeKind.Int64: + case PrimitiveTypeKind.SByte: + return value.ToString(); + case PrimitiveTypeKind.Double: + return ((double)value).ToString("R", CultureInfo.InvariantCulture); + case PrimitiveTypeKind.Single: + return ((float)value).ToString("R", CultureInfo.InvariantCulture); + case PrimitiveTypeKind.Decimal: + return ((decimal)value).ToString(CultureInfo.InvariantCulture); + } + return null; + } + + public static bool IsNumericType(TypeUsage typeUsage) + { + PrimitiveType pt = (PrimitiveType)typeUsage.EdmType; + + switch (pt.PrimitiveTypeKind) + { + case PrimitiveTypeKind.Byte: + case PrimitiveTypeKind.Double: + case PrimitiveTypeKind.Single: + case PrimitiveTypeKind.Int16: + case PrimitiveTypeKind.Int32: + case PrimitiveTypeKind.Int64: + case PrimitiveTypeKind.SByte: + return true; + default: + return false; + } + } + + public static DbType GetDbType(TypeUsage typeUsage) + { + PrimitiveType pt = (PrimitiveType)typeUsage.EdmType; + + switch (pt.PrimitiveTypeKind) + { + case PrimitiveTypeKind.Geometry: return DbType.Object; + case PrimitiveTypeKind.Binary: return DbType.Binary; + case PrimitiveTypeKind.Boolean: return DbType.Boolean; + case PrimitiveTypeKind.Byte: return DbType.Byte; + case PrimitiveTypeKind.DateTime: return DbType.DateTime; + case PrimitiveTypeKind.DateTimeOffset: return DbType.DateTime; + case PrimitiveTypeKind.Decimal: return DbType.Decimal; + case PrimitiveTypeKind.Double: return DbType.Double; + case PrimitiveTypeKind.Single: return DbType.Single; + case PrimitiveTypeKind.Guid: return DbType.Guid; + case PrimitiveTypeKind.Int16: return DbType.Int16; + case PrimitiveTypeKind.Int32: return DbType.Int32; + case PrimitiveTypeKind.Int64: return DbType.Int64; + case PrimitiveTypeKind.SByte: return DbType.SByte; + case PrimitiveTypeKind.String: return DbType.String; + case PrimitiveTypeKind.Time: return DbType.Time; + // case PrimitiveTypeKind.UInt16: return DbType.UInt16; + // case PrimitiveTypeKind.UInt32: return DbType.UInt32; + // case PrimitiveTypeKind.UInt64: return DbType.UInt64; + default: + throw new InvalidOperationException( + string.Format("Unknown PrimitiveTypeKind {0}", pt.PrimitiveTypeKind)); + } + } + + + public static object NormalizeValue(TypeUsage type, object value) + { + PrimitiveType pt = (PrimitiveType)type.EdmType; + if (value != null && + value != DBNull.Value && + Type.GetTypeCode(value.GetType()) == TypeCode.Object) + { + DbGeometry geometryValue = value as DbGeometry; + if (geometryValue != null) + { + Byte[] geometryValBinary = new Byte[25]; + var buffer = geometryValue.AsBinary(); + var srid = geometryValue.WellKnownValue.CoordinateSystemId; + for (int i = 0; i < buffer.Length; i++) + { + if (i < 4) + { + geometryValBinary[i] = (byte)(srid & 0xff); + srid >>= 8; + } + geometryValBinary[i + 4] = buffer[i]; + } + return geometryValBinary; + } + } + if (pt.PrimitiveTypeKind != PrimitiveTypeKind.DateTimeOffset) return value; + DateTimeOffset dto = (DateTimeOffset)value; + DateTime dt = dto.DateTime; + if (dt.Year < 1970) + return new DateTime(1970, 1, 1, 0, 0, 1); + return dt; + } + + public static ParameterDirection ModeToDirection(ParameterMode mode) + { + switch (mode) + { + case ParameterMode.In: return ParameterDirection.Input; + case ParameterMode.Out: return ParameterDirection.Output; + case ParameterMode.InOut: return ParameterDirection.InputOutput; + default: + Debug.Assert(mode == ParameterMode.ReturnValue); + return ParameterDirection.ReturnValue; + } + } + + public static bool IsComparisonOperator(string op) + { + switch (op) + { + case "=": + case "<": + case ">": + case "<=": + case ">=": + case "!=": return true; + default: return false; + } + } + + public static string GetOperator(DbExpressionKind expressionKind) + { + switch (expressionKind) + { + case DbExpressionKind.Equals: return "="; + case DbExpressionKind.LessThan: return "<"; + case DbExpressionKind.GreaterThan: return ">"; + case DbExpressionKind.LessThanOrEquals: return "<="; + case DbExpressionKind.GreaterThanOrEquals: return ">="; + case DbExpressionKind.NotEquals: return "!="; + case DbExpressionKind.LeftOuterJoin: return "LEFT OUTER JOIN"; + case DbExpressionKind.InnerJoin: return "INNER JOIN"; + case DbExpressionKind.CrossJoin: return "CROSS JOIN"; + case DbExpressionKind.FullOuterJoin: return "OUTER JOIN"; + } + throw new NotSupportedException("expression kind not supported"); + } + + internal static IList GetProperties(EdmType type) + { + if (type is EntityType) + return ((EntityType)type).Properties; + if (type is ComplexType) + return ((ComplexType)type).Properties; + if (type is RowType) + return ((RowType)type).Properties; + throw new NotSupportedException(); + } + + internal static T TryGetValueMetadataProperty(MetadataItem mi, string name) + { + MetadataProperty property; + bool exists = mi.MetadataProperties.TryGetValue(name, true, out property); + if (exists) return (T)property.Value; + return default(T); + } + } +} diff --git a/EntityFramework/src/MySql.Data.EntityFramework.csproj b/EntityFramework/src/MySql.Data.EntityFramework.csproj new file mode 100644 index 000000000..8f33df2a4 --- /dev/null +++ b/EntityFramework/src/MySql.Data.EntityFramework.csproj @@ -0,0 +1,110 @@ + + + + MySql.Data.EntityFramework + Copyright © 2008, 2025, Oracle and/or its affiliates. + en-US + 9.4.0 + Oracle Corporation + net462;net48;netstandard2.1 + $(NoWarn);CS1591 + MySql.Data.EntityFramework + MySql.Data.EntityFramework + MySql;.NET Connector;MySql Connector/NET + logo-mysql-170x115.png + README.md + https://dev.mysql.com/downloads/ + GPL-2.0-only WITH Universal-FOSS-exception-1.0 + true + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + True + ../../ConnectorNetPublicKey.snk + True + MySql.Data.EntityFramework + + + + $(DefineConstants);TRACE;DEBUG + true + + + + $(DefineConstants);RELEASE + true + + + + + + + + + + + + + + + + + + + + + + + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + \ No newline at end of file diff --git a/EntityFramework/src/MySqlConnectionFactory.cs b/EntityFramework/src/MySqlConnectionFactory.cs new file mode 100644 index 000000000..6777c323f --- /dev/null +++ b/EntityFramework/src/MySqlConnectionFactory.cs @@ -0,0 +1,56 @@ +// Copyright © 2008, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Data.Common; +using System.Data.Entity.Infrastructure; +using MySql.Data.MySqlClient; + +namespace MySql.Data.EntityFramework +{ + /// + /// Used for creating connections in Code First 4.3. + /// + public class MySqlConnectionFactory : IDbConnectionFactory + { + string baseConnString; + + public MySqlConnectionFactory() + { + } + + public MySqlConnectionFactory(string connStr) + { + baseConnString = connStr; + } + + public DbConnection CreateConnection(string connectionString) + { + return new MySqlConnection(connectionString); + } + } +} diff --git a/EntityFramework/src/MySqlDependencyResolver.cs b/EntityFramework/src/MySqlDependencyResolver.cs new file mode 100644 index 000000000..189c23353 --- /dev/null +++ b/EntityFramework/src/MySqlDependencyResolver.cs @@ -0,0 +1,237 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Data.Entity.Infrastructure.DependencyResolution; +using System.Data.Entity.Infrastructure; + +namespace MySql.Data.EntityFramework +{ + /// + /// Provides the capability to resolve a dependency. + /// + public class MySqlDependencyResolver : IDbDependencyResolver + { + /// + /// Attempts to resolve a dependency for a given contract type and optionally a given key. + /// + /// The base class that defines the dependency to be resolved. + /// Optionally, the key of the dependency to be resolved. + /// The resolved dependency. + public object GetService(Type type, object key) + { + EServiceType servType; + if (Enum.TryParse(type.Name, true, out servType)) + { + switch (servType) + { + case EServiceType.DbProviderFactory: + return new MySqlClient.MySqlClientFactory(); + case EServiceType.IDbConnectionFactory: + return new MySqlConnectionFactory(); + case EServiceType.MigrationSqlGenerator: + return new MySqlMigrationSqlGenerator(); + case EServiceType.DbProviderServices: + return new MySqlClient.MySqlProviderServices(); + case EServiceType.IProviderInvariantName: + return new MySqlProviderInvariantName(); + case EServiceType.IDbProviderFactoryResolver: + return new MySqlProviderFactoryResolver(); + case EServiceType.IManifestTokenResolver: + return new MySqlManifestTokenResolver(); + case EServiceType.IDbModelCacheKey: + return new SingletonDependencyResolver>(new MySqlModelCacheKeyFactory().Create); + case EServiceType.IDbExecutionStrategy: + return new MySqlExecutionStrategy(); + } + } + return null; + } + + /// + /// Attempts to resolve a dependency for all of the registered services with the given type and key combination. + /// + /// The base class that defines the dependency to be resolved. + /// Optionally, the key of the dependency to be resolved. + /// All services that resolve the dependency. + public IEnumerable GetServices(Type type, object key) + { + var service = GetService(type, key); + return service == null ? Enumerable.Empty() : new[] { service }; + } + } + + /// + /// Used to resolve a provider invariant name from a provider factory. + /// + public class MySqlProviderInvariantName : IProviderInvariantName + { + private const string _providerName = "MySql.Data.MySqlClient"; + + /// + /// Gets the name of the provider. + /// + public string Name + { + get { return _providerName; } + } + + /// + /// Gets the name of the provider. + /// + public static string ProviderName + { + get { return MySqlProviderInvariantName._providerName; } + } + } + + /// + /// Service that obtains the provider factory from a given connection. + /// + public class MySqlProviderFactoryResolver : IDbProviderFactoryResolver + { + /// + /// Returns the for the given connection. + /// + /// The database connection. + /// The provider factory for the connection. + public DbProviderFactory ResolveProviderFactory(DbConnection connection) + { + return DbProviderFactories.GetFactory(connection); + } + } + + /// + /// Gets a provider manifest token for the given connection. + /// + public class MySqlManifestTokenResolver : IManifestTokenResolver + { + /// + /// Returns the manifest token to use for the given connection. + /// + /// The connection for which a manifest token is required. + /// The manifest token to use. + public string ResolveManifestToken(System.Data.Common.DbConnection connection) + { + return MySqlClient.MySqlProviderServices.GetProviderServices(connection).GetProviderManifestToken(connection); + } + } + + /// + /// Represents a key value that uniquely identifies an Entity Framework model that has been loaded into memory. + /// + public class MySqlModelCacheKey : IDbModelCacheKey + { + private readonly Type _ctxType; + private readonly string _providerName; + private readonly Type _providerType; + private readonly string _customKey; + + public MySqlModelCacheKey(Type contextType, string providerName, Type providerType, string customKey) + { + _ctxType = contextType; + _providerName = providerName; + _providerType = providerType; + _customKey = customKey; + } + + /// + /// Determines whether the current cached model key is equal to the specified cached + /// model key. + /// + /// The cached model key to compare to the current cached model key. + /// true if the current cached model key is equal to the specified cached model key; + /// otherwise, false. + public bool Equals(object other) + { + if (ReferenceEquals(this, other)) + return true; + + var modelCacheKey = other as MySqlModelCacheKey; + return (modelCacheKey != null) && Equals(modelCacheKey); + } + + /// + /// Returns the hash function for this cached model key. + /// + /// The hash function for this cached model key. + public int GetHashCode() + { + unchecked + { + int hash = 43; + hash = hash * 47 + _ctxType.GetHashCode(); + hash = hash * 47 + _providerName.GetHashCode(); + hash = hash * 47 + _providerType.GetHashCode(); + hash = hash * 47 + (!string.IsNullOrWhiteSpace(_customKey) ? _customKey.GetHashCode() : 0); + return hash; + } + } + + private bool Equals(MySqlModelCacheKey other) + { + return (_ctxType == other._ctxType && string.Equals(_providerName, other._providerName) && Equals(_providerType, other._providerType) && string.Equals(_customKey, other._customKey)); + } + } + + internal class MySqlModelCacheKeyFactory + { + public IDbModelCacheKey Create(System.Data.Entity.DbContext context) + { + string customKey = null; + + var modelCacheKeyProvider = context as IDbModelCacheKeyProvider; + if (modelCacheKeyProvider != null) + { + customKey = modelCacheKeyProvider.CacheKey; + } + + return new MySqlModelCacheKey(context.GetType(), MySqlProviderInvariantName.ProviderName, typeof(MySqlClient.MySqlClientFactory), customKey); + } + } + + internal enum EServiceType + { + DbProviderFactory, + DbProviderServices, + IDbConnectionFactory, + DbSpatialServices, + MigrationSqlGenerator, + IProviderInvariantName, + IDbProviderFactoryResolver, + IManifestTokenResolver, + HistoryContext, + IDbModelCacheKey, + IDbExecutionStrategy + } +} diff --git a/EntityFramework/src/MySqlEFConfiguration.cs b/EntityFramework/src/MySqlEFConfiguration.cs new file mode 100644 index 000000000..36ce383f7 --- /dev/null +++ b/EntityFramework/src/MySqlEFConfiguration.cs @@ -0,0 +1,65 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Data.Entity; +using System.Data.Entity.Infrastructure; +using System.Data.Entity.Internal; +using MySql.Data.MySqlClient; + +namespace MySql.Data.EntityFramework +{ + /// + /// Defines the configuration of an application to be used with Entity Framework. + /// + public class MySqlEFConfiguration : DbConfiguration + { + /// + /// Initializes a new instance of class. + /// + public MySqlEFConfiguration() + { + AddDependencyResolver(new MySqlDependencyResolver()); + + SetProviderFactory(MySqlProviderInvariantName.ProviderName, new MySqlClientFactory()); + SetProviderServices(MySqlProviderInvariantName.ProviderName, new MySqlProviderServices()); + SetDefaultConnectionFactory(new MySqlConnectionFactory()); + SetMigrationSqlGenerator(MySqlProviderInvariantName.ProviderName, () => new MySqlMigrationSqlGenerator()); + SetProviderFactoryResolver(new MySqlProviderFactoryResolver()); + SetManifestTokenResolver(new MySqlManifestTokenResolver()); + SetHistoryContext(MySqlProviderInvariantName.ProviderName, (existingConnection, defaultSchema) => new MySqlHistoryContext(existingConnection, defaultSchema)); + // //CURRENTLY IS NOT SUPPORTED WORK WITH TRANSACTIONS AND EXECUTION STRATEGY AT THE SAME TIME: http://msdn.microsoft.com/en-US/data/dn307226 + // //IF WE SET THE EXECUTION STRATEGY HERE THAT WILL AFFECT THE USERS WHEN THEY TRY TO USE TRANSACTIONS, FOR THAT REASON EXECUTION STRATEGY WILL BE ENABLED ON DEMAND BY THEM + // //SetExecutionStrategy(MySqlProviderInvariantName.ProviderName, () => { return new MySqlExecutionStrategy(); }); + } + } +} diff --git a/Source/MySql.Data.Entity.EF6/MySqlExecutionStrategy.cs b/EntityFramework/src/MySqlExecutionStrategy.cs similarity index 85% rename from Source/MySql.Data.Entity.EF6/MySqlExecutionStrategy.cs rename to EntityFramework/src/MySqlExecutionStrategy.cs index ccd915533..1fa6a8348 100644 --- a/Source/MySql.Data.Entity.EF6/MySqlExecutionStrategy.cs +++ b/EntityFramework/src/MySqlExecutionStrategy.cs @@ -1,23 +1,29 @@ -// Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. +// Copyright © 2013, 2025, Oracle and/or its affiliates. // -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. // -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. // -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. // -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., // 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA using System; @@ -37,7 +43,7 @@ * these algorithms include recommendations gathered on input from MySql Support team. * */ -namespace MySql.Data.Entity +namespace MySql.Data.EntityFramework { /// /// An execution strategy tailored for handling MySql Server transient errors. @@ -238,4 +244,4 @@ public BackoffAlgorithmNdb() { } } -} \ No newline at end of file +} diff --git a/EntityFramework/src/MySqlHistoryContext.cs b/EntityFramework/src/MySqlHistoryContext.cs new file mode 100644 index 000000000..8154745b2 --- /dev/null +++ b/EntityFramework/src/MySqlHistoryContext.cs @@ -0,0 +1,51 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Data.Common; +using System.Data.Entity.Migrations.History; + +namespace MySql.Data.EntityFramework +{ + /// + /// This class is used by Code First Migrations to read and write migration history + /// from the database. + /// + public class MySqlHistoryContext : HistoryContext + { + public MySqlHistoryContext(DbConnection existingConnection, string defaultSchema) + : base(existingConnection, defaultSchema) + { + } + + protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + modelBuilder.Entity().HasKey(h => new { h.MigrationId }); + } + } +} diff --git a/EntityFramework/src/MySqlLogger.cs b/EntityFramework/src/MySqlLogger.cs new file mode 100644 index 000000000..9b7863bf3 --- /dev/null +++ b/EntityFramework/src/MySqlLogger.cs @@ -0,0 +1,67 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Linq; +using System.Text; +using System.IO; + +namespace MySql.Data.EntityFramework +{ + /// + /// Provides the capability to write a log. + /// + public class MySqlLogger : TextWriter + { + private readonly Action _action; + public MySqlLogger(Action action) + { + _action = action; + } + + public override void Write(char[] buffer, int index, int count) + { + Write(new string(buffer, index, count)); + } + + public override void Write(string value) + { + _action.Invoke(value); + } + + public override Encoding Encoding + { + get { return Encoding.Default; } + } + + public static StreamWriter Logger(string logPath, bool append) + { + return new StreamWriter(path: logPath, append: append) { AutoFlush = true }; + } + } +} diff --git a/Source/MySql.Data.Entity.EF6/MySqlMigrationSqlGenerator.cs b/EntityFramework/src/MySqlMigrationSqlGenerator.cs similarity index 77% rename from Source/MySql.Data.Entity.EF6/MySqlMigrationSqlGenerator.cs rename to EntityFramework/src/MySqlMigrationSqlGenerator.cs index 47f15ce82..5fc83f782 100644 --- a/Source/MySql.Data.Entity.EF6/MySqlMigrationSqlGenerator.cs +++ b/EntityFramework/src/MySqlMigrationSqlGenerator.cs @@ -1,925 +1,976 @@ -// Copyright © 2008, 2015 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Data.Common; -using System.Data.Entity.Migrations.Sql; -using System.Data.Entity.Migrations.Model; -using MySql.Data.MySqlClient; -using System.Data.Entity.Migrations.Design; -using System.Data.Entity.Migrations.Utilities; -using System.Collections; -#if EF6 -using System.Data.Entity.Core.Common; -using System.Data.Entity.Core.Metadata.Edm; -using System.Data.Entity.Core.Common.CommandTrees; -#else -using System.Data.Metadata.Edm; -#endif - - -namespace MySql.Data.Entity -{ - - /// - /// Class used to customized code generation - /// to avoid dbo. prefix added on table names. - /// - public class MySqlMigrationCodeGenerator : CSharpMigrationCodeGenerator - { - private IEnumerable> _foreignKeys; - private IEnumerable> _tableIndexes; - - private string TrimSchemaPrefix(string table) - { - if (table.StartsWith("dbo.")) - return table.Replace("dbo.", ""); - - return table; - } - - private string PrepareSql(string sql, bool removeNonMySqlChars) - { - var sqlResult = sql; - if (removeNonMySqlChars) - { - sqlResult = sql.Replace("[", "").Replace("]", "").Replace("@", ""); - } - sqlResult = sqlResult.Replace("dbo.", ""); - return sqlResult; - } - - private IEnumerable ReorderOperations(IEnumerable operations) - { - if (operations.Where(operation => operation.GetType() == typeof(AddPrimaryKeyOperation)).Count() > 0 && - operations.Where(operation => operation.GetType() == typeof(DropPrimaryKeyOperation)).Count() > 0) - { - List reorderedOpes = new List(); - reorderedOpes.AddRange(operations.Where(operation => operation.GetType() == typeof(AlterColumnOperation))); - reorderedOpes.AddRange(operations.Where(operation => operation.GetType() == typeof(DropPrimaryKeyOperation))); - reorderedOpes.AddRange(operations.Where(operation => operation.GetType() != typeof(DropPrimaryKeyOperation) && operation.GetType() != typeof(AlterColumnOperation))); - return reorderedOpes; - } - return operations; - } - - public override ScaffoldedMigration Generate(string migrationId, IEnumerable operations, string sourceModel, string targetModel, string @namespace, string className) - { - _foreignKeys = (from tbl in operations.OfType() - from fk in operations.OfType() - where tbl.Name.Equals(fk.DependentTable, StringComparison.InvariantCultureIgnoreCase) - select new KeyValuePair(tbl, fk)).ToList(); - - _tableIndexes = (from tbl in operations.OfType() - from idx in operations.OfType() - where tbl.Name.Equals(idx.Table, StringComparison.InvariantCultureIgnoreCase) - select new KeyValuePair(tbl, idx)).ToList(); - - return base.Generate(migrationId, ReorderOperations(operations), sourceModel, targetModel, @namespace, className); - } - - protected override void Generate(AddColumnOperation addColumnOperation, IndentedTextWriter writer) - { - var add = new AddColumnOperation(TrimSchemaPrefix(addColumnOperation.Table), addColumnOperation.Column); - base.Generate(add, writer); - } - - protected override void Generate(AddForeignKeyOperation addForeignKeyOperation, IndentedTextWriter writer) - { - addForeignKeyOperation.PrincipalTable = TrimSchemaPrefix(addForeignKeyOperation.PrincipalTable); - addForeignKeyOperation.DependentTable = TrimSchemaPrefix(addForeignKeyOperation.DependentTable); - addForeignKeyOperation.Name = PrepareSql(addForeignKeyOperation.Name, false); - base.Generate(addForeignKeyOperation, writer); - } - - protected override void GenerateInline(AddForeignKeyOperation addForeignKeyOperation, IndentedTextWriter writer) - { - writer.WriteLine(); - writer.Write(".ForeignKey(\"" + TrimSchemaPrefix(addForeignKeyOperation.PrincipalTable) + "\", "); - Generate(addForeignKeyOperation.DependentColumns, writer); - writer.Write(addForeignKeyOperation.CascadeDelete ? ", cascadeDelete: true)" : ")"); - } - - protected override void Generate(AddPrimaryKeyOperation addPrimaryKeyOperation, IndentedTextWriter writer) - { - addPrimaryKeyOperation.Table = TrimSchemaPrefix(addPrimaryKeyOperation.Table); - base.Generate(addPrimaryKeyOperation, writer); - } - - protected override void Generate(AlterColumnOperation alterColumnOperation, IndentedTextWriter writer) - { - AlterColumnOperation alter = null; - if (alterColumnOperation.Inverse != null) - alter = new AlterColumnOperation(TrimSchemaPrefix(alterColumnOperation.Table), alterColumnOperation.Column, alterColumnOperation.IsDestructiveChange, (AlterColumnOperation)alterColumnOperation.Inverse); - else - alter = new AlterColumnOperation(TrimSchemaPrefix(alterColumnOperation.Table), alterColumnOperation.Column, alterColumnOperation.IsDestructiveChange); - - if (alter != null) - base.Generate(alter, writer); - else - base.Generate(alterColumnOperation); - } - - protected override void Generate(CreateIndexOperation createIndexOperation, IndentedTextWriter writer) - { - createIndexOperation.Table = TrimSchemaPrefix(createIndexOperation.Table); - base.Generate(createIndexOperation, writer); - } - - protected override void GenerateInline(CreateIndexOperation createIndexOperation, IndentedTextWriter writer) - { - writer.WriteLine(); - writer.Write(".Index("); - - Generate(createIndexOperation.Columns, writer); - - writer.Write(createIndexOperation.IsUnique ? ", unique: true" : ""); - writer.Write(!createIndexOperation.HasDefaultName ? string.Format(", name: {0}", TrimSchemaPrefix(createIndexOperation.Name)) : ""); - - writer.Write(")"); - } - - protected override void Generate(CreateTableOperation createTableOperation, IndentedTextWriter writer) - { - var create = new CreateTableOperation(TrimSchemaPrefix(createTableOperation.Name)); - - foreach (var item in createTableOperation.Columns) - create.Columns.Add(item); - - create.PrimaryKey = createTableOperation.PrimaryKey; - - base.Generate(create, writer); - - System.IO.StringWriter innerWriter = writer.InnerWriter as System.IO.StringWriter; - if (innerWriter != null) - { - innerWriter.GetStringBuilder().Remove(innerWriter.ToString().LastIndexOf(";"), innerWriter.ToString().Length - innerWriter.ToString().LastIndexOf(";")); - writer.Indent++; - _foreignKeys.Where(tbl => tbl.Key == createTableOperation).ToList().ForEach(fk => GenerateInline(fk.Value, writer)); - _tableIndexes.Where(tbl => tbl.Key == createTableOperation).ToList().ForEach(idx => GenerateInline(idx.Value, writer)); - writer.WriteLine(";"); - writer.Indent--; - writer.WriteLine(); - } - } - - protected override void Generate(DropColumnOperation dropColumnOperation, IndentedTextWriter writer) - { - var drop = new DropColumnOperation(TrimSchemaPrefix(dropColumnOperation.Table), dropColumnOperation.Name); - base.Generate(drop, writer); - } - - protected override void Generate(DropForeignKeyOperation dropForeignKeyOperation, IndentedTextWriter writer) - { - dropForeignKeyOperation.PrincipalTable = TrimSchemaPrefix(dropForeignKeyOperation.PrincipalTable); - dropForeignKeyOperation.DependentTable = TrimSchemaPrefix(dropForeignKeyOperation.DependentTable); - dropForeignKeyOperation.Name = PrepareSql(dropForeignKeyOperation.Name, false); - base.Generate(dropForeignKeyOperation, writer); - } - - protected override void Generate(DropIndexOperation dropIndexOperation, IndentedTextWriter writer) - { - dropIndexOperation.Table = TrimSchemaPrefix(dropIndexOperation.Table); - base.Generate(dropIndexOperation, writer); - } - - protected override void Generate(DropPrimaryKeyOperation dropPrimaryKeyOperation, IndentedTextWriter writer) - { - dropPrimaryKeyOperation.Table = TrimSchemaPrefix(dropPrimaryKeyOperation.Table); - base.Generate(dropPrimaryKeyOperation, writer); - } - - protected override void Generate(DropTableOperation dropTableOperation, IndentedTextWriter writer) - { - var drop = new DropTableOperation(TrimSchemaPrefix(dropTableOperation.Name)); - base.Generate(drop, writer); - } - - protected override void Generate(MoveTableOperation moveTableOperation, IndentedTextWriter writer) - { - var move = new MoveTableOperation(TrimSchemaPrefix(moveTableOperation.Name), moveTableOperation.NewSchema); - base.Generate(move, writer); - } - - protected override void Generate(RenameColumnOperation renameColumnOperation, IndentedTextWriter writer) - { - var rename = new RenameColumnOperation(TrimSchemaPrefix(renameColumnOperation.Table), renameColumnOperation.Name, renameColumnOperation.NewName); - base.Generate(rename, writer); - } - - protected override void Generate(RenameTableOperation renameTableOperation, IndentedTextWriter writer) - { - var rename = new RenameTableOperation(TrimSchemaPrefix(renameTableOperation.Name), renameTableOperation.NewName); - base.Generate(rename, writer); - } - } - - - /// - /// Implementation of a MySql's Sql generator for EF 4.3 data migrations. - /// - public class MySqlMigrationSqlGenerator : MigrationSqlGenerator - { - private List _specialStmts = new List(); - private DbProviderManifest _providerManifest; - private Dictionary _dispatcher = new Dictionary(); - private List _generatedTables { get; set; } - private string _tableName { get; set; } - private string _providerManifestToken; - private List autoIncrementCols { get; set; } - private List primaryKeyCols { get; set; } - private IEnumerable _pkOperations = new List(); - - delegate MigrationStatement OpDispatcher(MigrationOperation op); - - - public MySqlMigrationSqlGenerator() - { - - _dispatcher.Add("AddColumnOperation", (OpDispatcher)((op) => { return Generate(op as AddColumnOperation); })); - _dispatcher.Add("AddForeignKeyOperation", (OpDispatcher)((op) => { return Generate(op as AddForeignKeyOperation); })); - _dispatcher.Add("AddPrimaryKeyOperation", (OpDispatcher)((op) => { return Generate(op as AddPrimaryKeyOperation); })); - _dispatcher.Add("AlterColumnOperation", (OpDispatcher)((op) => { return Generate(op as AlterColumnOperation); })); - _dispatcher.Add("CreateIndexOperation", (OpDispatcher)((op) => { return Generate(op as CreateIndexOperation); })); - _dispatcher.Add("CreateTableOperation", (OpDispatcher)((op) => { return Generate(op as CreateTableOperation); })); - _dispatcher.Add("DropColumnOperation", (OpDispatcher)((op) => { return Generate(op as DropColumnOperation); })); - _dispatcher.Add("DropForeignKeyOperation", (OpDispatcher)((op) => { return Generate(op as DropForeignKeyOperation); })); - _dispatcher.Add("DropIndexOperation", (OpDispatcher)((op) => { return Generate(op as DropIndexOperation); })); - _dispatcher.Add("DropPrimaryKeyOperation", (OpDispatcher)((op) => { return Generate(op as DropPrimaryKeyOperation); })); - _dispatcher.Add("DropTableOperation", (OpDispatcher)((op) => { return Generate(op as DropTableOperation); })); - _dispatcher.Add("MoveTableOperation", (OpDispatcher)((op) => { return Generate(op as MoveTableOperation); })); - _dispatcher.Add("RenameColumnOperation", (OpDispatcher)((op) => { return Generate(op as RenameColumnOperation); })); - _dispatcher.Add("RenameTableOperation", (OpDispatcher)((op) => { return Generate(op as RenameTableOperation); })); - _dispatcher.Add("SqlOperation", (OpDispatcher)((op) => { return Generate(op as SqlOperation); })); - autoIncrementCols = new List(); - primaryKeyCols = new List(); -#if EF6 - _dispatcher.Add("HistoryOperation", (OpDispatcher)((op) => { return Generate(op as HistoryOperation); })); - _dispatcher.Add("CreateProcedureOperation", (OpDispatcher)((op) => { return Generate(op as CreateProcedureOperation); })); - _dispatcher.Add("UpdateDatabaseOperation", (OpDispatcher)((op) => { return Generate(op as UpdateDatabaseOperation); })); -#endif -#if !EF6 - _dispatcher.Add("DeleteHistoryOperation", (OpDispatcher)((op) => { return Generate(op as DeleteHistoryOperation); })); - _dispatcher.Add("InsertHistoryOperation", (OpDispatcher)((op) => { return Generate(op as InsertHistoryOperation); })); -#endif - } - - public override IEnumerable Generate(IEnumerable migrationOperations, string providerManifestToken) - { - MySqlConnection con = new MySqlConnection(); - List stmts = new List(); - _providerManifestToken = providerManifestToken; - _providerManifest = DbProviderServices.GetProviderServices(con).GetProviderManifest(providerManifestToken); - - //verify if there is one or more add/alter column operation, if there is then look for primary key operations. Alter in case that the user wants to change the current PK column - if ((from cols in migrationOperations.OfType() select cols).Count() > 0 || (from cols in migrationOperations.OfType() select cols).Count() > 0) - _pkOperations = (from pks in migrationOperations.OfType() select pks).ToList(); - - foreach (MigrationOperation op in migrationOperations) - { - if (!_dispatcher.ContainsKey(op.GetType().Name)) - throw new NotImplementedException(op.GetType().Name); - OpDispatcher opdis = _dispatcher[op.GetType().Name]; - stmts.Add(opdis(op)); - } - if (_specialStmts.Count > 0) - { - foreach (var item in _specialStmts) - stmts.Add(item); - } - return stmts; - } - -#if EF6 - - private MigrationStatement Generate(UpdateDatabaseOperation updateDatabaseOperation) - { - if (updateDatabaseOperation == null) - throw new ArgumentNullException("UpdateDatabaseOperation"); - - MigrationStatement statement = new MigrationStatement(); - StringBuilder sql = new StringBuilder(); - const string idempotentScriptName = "_idempotent_script"; - SelectGenerator generator = new SelectGenerator(); - - if (!updateDatabaseOperation.Migrations.Any()) - return statement; - - sql.AppendFormat("DROP PROCEDURE IF EXISTS `{0}`;", idempotentScriptName); - sql.AppendLine(); - sql.AppendLine(); - - sql.AppendLine("DELIMITER //"); - sql.AppendLine(); - - sql.AppendFormat("CREATE PROCEDURE `{0}`()", idempotentScriptName); - sql.AppendLine(); - sql.AppendLine("BEGIN"); - sql.AppendLine(" DECLARE CurrentMigration TEXT;"); - sql.AppendLine(); - sql.AppendLine(" IF EXISTS(SELECT 1 FROM information_schema.tables "); - sql.AppendLine(" WHERE table_name = '__MigrationHistory' "); - sql.AppendLine(" AND table_schema = DATABASE()) THEN "); - - foreach (var historyQueryTree in updateDatabaseOperation.HistoryQueryTrees) - { - string historyQuery = generator.GenerateSQL(historyQueryTree); - ReplaceParemeters(ref historyQuery, generator.Parameters); - sql.AppendLine(@" SET CurrentMigration = (" + historyQuery + ");"); - sql.AppendLine(" END IF;"); - sql.AppendLine(); - } - - sql.AppendLine(" IF CurrentMigration IS NULL THEN"); - sql.AppendLine(" SET CurrentMigration = '0';"); - sql.AppendLine(" END IF;"); - sql.AppendLine(); - - // Migrations - foreach (var migration in updateDatabaseOperation.Migrations) - { - if (migration.Operations.Count == 0) - continue; - - sql.AppendLine(" IF CurrentMigration < '" + migration.MigrationId + "' THEN "); - var statements = Generate(migration.Operations, _providerManifestToken); - foreach (var migrationStatement in statements) - { - string sqlStatement = migrationStatement.Sql; - if (!sqlStatement.EndsWith(";")) - sqlStatement += ";"; - sql.AppendLine(sqlStatement); - } - sql.AppendLine(" END IF;"); - sql.AppendLine(); - } - - sql.AppendLine("END //"); - sql.AppendLine(); - sql.AppendLine("DELIMITER ;"); - sql.AppendLine(); - sql.AppendFormat("CALL `{0}`();", idempotentScriptName); - sql.AppendLine(); - sql.AppendLine(); - sql.AppendFormat("DROP PROCEDURE IF EXISTS `{0}`;", idempotentScriptName); - sql.AppendLine(); - - statement.Sql = sql.ToString(); - - return statement; - } - - protected virtual MigrationStatement Generate(HistoryOperation op) - { - if (op == null) return null; - - MigrationStatement stmt = new MigrationStatement(); - - var cmdStr = ""; - SqlGenerator generator = new SelectGenerator(); - foreach (var commandTree in op.CommandTrees) - { - switch (commandTree.CommandTreeKind) - { - case DbCommandTreeKind.Insert: - generator = new InsertGenerator(); - break; - case DbCommandTreeKind.Delete: - generator = new DeleteGenerator(); - break; - case DbCommandTreeKind.Update: - generator = new UpdateGenerator(); - break; - case DbCommandTreeKind.Query: - generator = new SelectGenerator(); - break; - case DbCommandTreeKind.Function: - generator = new FunctionGenerator(); - break; - default: - throw new NotImplementedException(commandTree.CommandTreeKind.ToString()); - } - cmdStr = generator.GenerateSQL(commandTree); - - ReplaceParemeters(ref cmdStr, generator.Parameters); - stmt.Sql += cmdStr.Replace("dbo", "") + ";"; - } - return stmt; - } - - private void ReplaceParemeters(ref string sql, IList parameters) - { - foreach (var parameter in parameters) - { - if (parameter.DbType == System.Data.DbType.String) - sql = sql.Replace(parameter.ParameterName, "'" + parameter.Value.ToString() + "'"); - else if (parameter.DbType == System.Data.DbType.Binary) - sql = sql.Replace(parameter.ParameterName, "0x" + BitConverter.ToString((byte[])parameter.Value).Replace("-", "")); - else - sql = sql.Replace(parameter.ParameterName, parameter.Value.ToString()); - } - } - - public override string GenerateProcedureBody(ICollection commandTrees, string rowsAffectedParameter, string providerManifestToken) - { - MySqlConnection con = new MySqlConnection(); - MigrationStatement stmt = new MigrationStatement(); - _providerManifest = DbProviderServices.GetProviderServices(con).GetProviderManifest(providerManifestToken); - - var cmdStr = ""; - SqlGenerator generator = new SelectGenerator(); - foreach (var commandTree in commandTrees) - { - switch (commandTree.CommandTreeKind) - { - case DbCommandTreeKind.Insert: - generator = new InsertGenerator(); - cmdStr = generator.GenerateSQL(commandTree); - break; - case DbCommandTreeKind.Delete: - generator = new DeleteGenerator(); - cmdStr = generator.GenerateSQL(commandTree); - break; - case DbCommandTreeKind.Update: - generator = new UpdateGenerator(); - cmdStr = generator.GenerateSQL(commandTree); - break; - case DbCommandTreeKind.Query: - generator = new SelectGenerator(); - cmdStr = generator.GenerateSQL(commandTree); - break; - case DbCommandTreeKind.Function: - generator = new FunctionGenerator(); - cmdStr = generator.GenerateSQL(commandTree); - break; - } - stmt.Sql += cmdStr.Replace("dbo.", "") + ";"; - } - return stmt.Sql; - } - - protected virtual MigrationStatement Generate(CreateProcedureOperation op) - { - MigrationStatement stmt = new MigrationStatement(); - stmt.Sql = GenerateProcedureCmd(op); - return stmt; - } - - private string GenerateProcedureCmd(CreateProcedureOperation po) - { - StringBuilder sql = new StringBuilder(); - sql.AppendLine(string.Format("CREATE PROCEDURE `{0}`({1})", po.Name.Replace("dbo.", ""), GenerateParamSentence(po.Parameters))); - sql.AppendLine("BEGIN "); - sql.AppendLine(po.BodySql); - sql.AppendLine(" END"); - return sql.ToString().Replace("@", ""); - } - - private string GenerateParamSentence(IList Parameters) - { - StringBuilder sql = new StringBuilder(); - foreach (ParameterModel param in Parameters) - { - sql.AppendFormat("{0} {1} {2},", - (param.IsOutParameter ? "OUT" : "IN"), - param.Name, - BuildParamType(param)); - } - - return sql.ToString().Substring(0, sql.ToString().LastIndexOf(",")); - } - - private string BuildParamType(ParameterModel param) - { - string type = MySqlProviderServices.Instance.GetColumnType(_providerManifest.GetStoreType(param.TypeUsage)); - StringBuilder sb = new StringBuilder(); - sb.Append(type); - - if (new string[] { "char", "varchar" }.Contains(type.ToLower())) - { - if (param.MaxLength.HasValue) - { - sb.AppendFormat("({0}) ", param.MaxLength.Value); - } - } - - if (param.Precision.HasValue && param.Scale.HasValue) - { - sb.AppendFormat("( {0}, {1} ) ", param.Precision.Value, param.Scale.Value); - } - - return sb.ToString(); - } -#endif - - protected virtual MigrationStatement Generate(AddColumnOperation op) - { - if (op == null) return null; - - _tableName = op.Table; - - MigrationStatement stmt = new MigrationStatement(); - //verify if there is any "AddPrimaryKeyOperation" related with the column that will be added and if it is defined as identity (auto_increment) - bool uniqueAttr = (from pkOpe in _pkOperations - where (from col in pkOpe.Columns - where col == op.Column.Name - select col).Count() > 0 - select pkOpe).Count() > 0 & op.Column.IsIdentity; - - //if the column to be added is PK as well as identity we need to specify the column as unique to avoid the error: "Incorrect table definition there can be only one auto column and it must be defined as a key", since unique and PK are almost equivalent we'll be able to add the new column and later add the PK related to it, this because the "AddPrimaryKeyOperation" is executed after the column is added - stmt.Sql = string.Format("alter table `{0}` add column `{1}` {2} {3}", TrimSchemaPrefix(op.Table), op.Column.Name, Generate(op.Column), (uniqueAttr ? " unique " : "")); - - return stmt; - } - - protected virtual MigrationStatement Generate(DropColumnOperation op) - { - if (op == null) return null; - - MigrationStatement stmt = new MigrationStatement(); - StringBuilder sb = new StringBuilder(); - stmt.Sql = string.Format("alter table `{0}` drop column `{1}`", - TrimSchemaPrefix(op.Table), op.Name); - return stmt; - } - - protected virtual MigrationStatement Generate(AlterColumnOperation op) - { - if (op == null) return null; - - ColumnModel column = op.Column; - StringBuilder sb = new StringBuilder(); - _tableName = op.Table; - - //verify if there is any "AddPrimaryKeyOperation" related with the column that will be added and if it is defined as identity (auto_increment) - bool uniqueAttr = (from pkOpe in _pkOperations - where (from col in pkOpe.Columns - where col == op.Column.Name - select col).Count() > 0 - select pkOpe).Count() > 0 & op.Column.IsIdentity; - - // for existing columns - sb.Append("alter table `" + TrimSchemaPrefix(op.Table) + "` modify `" + column.Name + "` "); - - // add definition - sb.Append(Generate(column) + (uniqueAttr ? " unique " : "")); - - return new MigrationStatement { Sql = sb.ToString() }; - } - - protected virtual MigrationStatement Generate(RenameColumnOperation op) - { - if (op == null) return null; - - StringBuilder sb = new StringBuilder(); - - sb.Append("set @columnType := (select case lower(IS_NULLABLE) when 'no' then CONCAT(column_type, ' not null ') when 'yes' then column_type end from information_schema.columns where table_name = '" + TrimSchemaPrefix(op.Table) + "' and column_name = '" + op.Name + "');"); - sb.AppendLine(); - sb.Append("set @sqlstmt := (select concat('alter table `" + TrimSchemaPrefix(op.Table) + "` change `" + op.Name + "` `" + op.NewName + "` ' , @columnType));"); - sb.AppendLine(); - sb.Append("prepare stmt from @sqlstmt;"); - sb.AppendLine(); - sb.Append("execute stmt;"); - sb.AppendLine(); - sb.Append("deallocate prepare stmt;"); - return new MigrationStatement { Sql = sb.ToString() }; - - } - - - protected virtual MigrationStatement Generate(AddForeignKeyOperation op) - { - - StringBuilder sb = new StringBuilder(); - string fkName = op.Name; - if (fkName.Length > 64) - { - fkName = "FK_" + Guid.NewGuid().ToString().Replace("-", ""); - } - sb.Append("alter table `" + TrimSchemaPrefix(op.DependentTable) + "` add constraint `" + TrimSchemaPrefix(fkName) + "` " + - " foreign key "); - - sb.Append("(" + string.Join(",", op.DependentColumns.Select(c => "`" + c + "`")) + ") "); - sb.Append("references `" + TrimSchemaPrefix(op.PrincipalTable) + "` ( " + string.Join(",", op.PrincipalColumns.Select(c => "`" + c + "`")) + ") "); - - if (op.CascadeDelete) - { - sb.Append(" on update cascade on delete cascade "); - } - - return new MigrationStatement { Sql = sb.ToString() }; - } - - protected virtual string Generate(ColumnModel op) - { - TypeUsage typeUsage = _providerManifest.GetStoreType(op.TypeUsage); - StringBuilder sb = new StringBuilder(); -#if EF6 - string type = op.StoreType; - if (type == null) - { - type = MySqlProviderServices.Instance.GetColumnType(typeUsage); - } -#else - string type = MySqlProviderServices.Instance.GetColumnType(typeUsage); -#endif - - sb.Append(type); - - if (!type.EndsWith(")", StringComparison.InvariantCulture)) - { - if ((op.ClrType == typeof(string)) || - ((op.ClrType == typeof(byte)) && (op.ClrType.IsArray))) - { - if (op.MaxLength.HasValue) - { - sb.AppendFormat("({0}) ", op.MaxLength.Value); - } - } - if (op.Precision.HasValue && op.Scale.HasValue) - { - sb.AppendFormat("( {0}, {1} ) ", op.Precision.Value, op.Scale.Value); - } - else - { - if (type == "datetime" || type == "timestamp" || type == "time") - { - if (op.Precision.HasValue && op.Precision.Value >= 1) - { - sb.AppendFormat("({0}) ", op.Precision.Value <= 6 ? op.Precision.Value : 6); - } - if (op.IsIdentity && (String.Compare(type, "datetime", true) == 0 || String.Compare(type, "timestamp", true) == 0)) - { - sb.AppendFormat(" DEFAULT CURRENT_TIMESTAMP{0}", op.Precision.HasValue && op.Precision.Value >= 1 ? "( " + op.Precision.Value.ToString() + " )" : ""); - } - } - } - } - - op.StoreType = type; - - if (!(op.IsNullable ?? true)) - { - sb.Append(string.Format("{0} not null ", - ((!primaryKeyCols.Contains(op.Name) && op.IsIdentity && op.Type != PrimitiveTypeKind.Guid ) ? " unsigned" : - (( op.Type == PrimitiveTypeKind.Guid )? " default '' " : "" ) ))); - } - if (op.IsIdentity && (new string[] { "tinyint", "smallint", "mediumint", "int", "bigint" }).Contains(type.ToLower())) - { - sb.Append(" auto_increment "); - autoIncrementCols.Add(op.Name); - } - else - { - // nothing - } - if (!string.IsNullOrEmpty(op.DefaultValueSql)) - { - sb.Append(string.Format(" default {0}", op.DefaultValueSql)); - } - return sb.ToString(); - } - - protected virtual MigrationStatement Generate(DropForeignKeyOperation op) - { - StringBuilder sb = new StringBuilder(); - sb = sb.AppendFormat("alter table `{0}` drop foreign key `{1}`", op.DependentTable, op.Name); - return new MigrationStatement { Sql = sb.ToString() }; - } - - protected virtual MigrationStatement Generate(CreateIndexOperation op) - { - StringBuilder sb = new StringBuilder(); - - sb = sb.Append("CREATE "); - - if (op.IsUnique) - { - sb.Append("UNIQUE "); - } - - //index_col_name specification can end with ASC or DESC. - // sort order are permitted for future extensions for specifying ascending or descending index value storage - //Currently, they are parsed but ignored; index values are always stored in ascending order. - - object sort; - op.AnonymousArguments.TryGetValue("Sort", out sort); - var sortOrder = sort != null && sort.ToString() == "Ascending" ? - "ASC" : "DESC"; - - sb.AppendFormat("index `{0}` on `{1}` (", op.Name, TrimSchemaPrefix(op.Table)); - sb.Append(string.Join(",", op.Columns.Select(c => "`" + c + "` " + sortOrder)) + ") "); - - object indexTypeDefinition; - op.AnonymousArguments.TryGetValue("Type", out indexTypeDefinition); - var indexType = indexTypeDefinition != null && string.Compare(indexTypeDefinition.ToString(), "BTree", StringComparison.InvariantCultureIgnoreCase) > 0 ? - "BTREE" : "HASH"; - - sb.Append("using " + indexType); - - return new MigrationStatement() { Sql = sb.ToString() }; - } - - protected virtual MigrationStatement Generate(DropIndexOperation op) - { - return new MigrationStatement() - { - Sql = string.Format("alter table `{0}` drop index `{1}`", - TrimSchemaPrefix(op.Table), op.Name) - }; - } - - - protected virtual MigrationStatement Generate(CreateTableOperation op) - { - StringBuilder sb = new StringBuilder(); - string tableName = TrimSchemaPrefix(op.Name); - primaryKeyCols.Clear(); - autoIncrementCols.Clear(); - if (_generatedTables == null) - _generatedTables = new List(); - - if (!_generatedTables.Contains(tableName)) - { - _generatedTables.Add(tableName); - } - sb.Append("create table " + "`" + tableName + "`" + " ("); - - _tableName = op.Name; - - if (op.PrimaryKey != null) - { - op.PrimaryKey.Columns.ToList().ForEach(col => primaryKeyCols.Add(col)); - } - - //columns - sb.Append(string.Join(",", op.Columns.Select(c => "`" + c.Name + "` " + Generate(c)))); - - // Determine columns that are GUID & identity - List guidCols = new List(); - ColumnModel guidPK = null; - foreach( ColumnModel opCol in op.Columns ) - { - if (opCol.Type == PrimitiveTypeKind.Guid && opCol.IsIdentity && String.Compare(opCol.StoreType, "CHAR(36) BINARY", true) == 0) - { - if( primaryKeyCols.Contains( opCol.Name ) ) - guidPK = opCol; - guidCols.Add(opCol); - } - } - - if (guidCols.Count != 0) - { - var createTrigger = new StringBuilder(); - createTrigger.AppendLine(string.Format("DROP TRIGGER IF EXISTS `{0}_IdentityTgr`;", TrimSchemaPrefix(_tableName))); - createTrigger.AppendLine(string.Format("CREATE TRIGGER `{0}_IdentityTgr` BEFORE INSERT ON `{0}`", TrimSchemaPrefix(_tableName))); - createTrigger.AppendLine("FOR EACH ROW BEGIN"); - for (int i = 0; i < guidCols.Count; i++) - { - ColumnModel opCol = guidCols[i]; - createTrigger.AppendLine(string.Format("SET NEW.{0} = UUID();", opCol.Name)); - } - createTrigger.AppendLine(string.Format("DROP TEMPORARY TABLE IF EXISTS tmpIdentity_{0};", TrimSchemaPrefix(_tableName))); - createTrigger.AppendLine(string.Format("CREATE TEMPORARY TABLE tmpIdentity_{0} (guid CHAR(36))ENGINE=MEMORY;", TrimSchemaPrefix(_tableName))); - createTrigger.AppendLine(string.Format("INSERT INTO tmpIdentity_{0} VALUES(New.{1});", TrimSchemaPrefix(_tableName), guidPK.Name)); - createTrigger.AppendLine("END"); - var sqlOp = new SqlOperation(createTrigger.ToString()); - _specialStmts.Add(Generate(sqlOp)); - } - - if (op.PrimaryKey != null)// && !sb.ToString().Contains("primary key")) - { - sb.Append(","); - sb.Append("primary key ( " + string.Join(",", op.PrimaryKey.Columns.Select(c => "`" + c + "`")) + ") "); - } - - string keyFields = ","; - autoIncrementCols.ForEach(col => keyFields += (!primaryKeyCols.Contains(col) ? string.Format(" KEY (`{0}`),", col) : "")); - sb.Append(keyFields.Substring(0, keyFields.LastIndexOf(","))); - sb.Append(") engine=InnoDb auto_increment=0"); - - return new MigrationStatement() { Sql = sb.ToString() }; - } - - protected virtual MigrationStatement Generate(DropTableOperation op) - { - return new MigrationStatement() { Sql = "drop table " + "`" + TrimSchemaPrefix(op.Name) + "`" }; - } - -#if !EF6 - protected virtual MigrationStatement Generate(DeleteHistoryOperation op) - { - return new MigrationStatement { Sql = string.Format("delete from `{0}` where MigrationId = '{1}'", TrimSchemaPrefix(op.Table), op.MigrationId) }; - } - - protected virtual MigrationStatement Generate(InsertHistoryOperation op) - { - - if (op == null) return null; - - StringBuilder sb = new StringBuilder(); - StringBuilder model = new StringBuilder(); - - model.Append(BitConverter.ToString(op.Model).Replace("-", "")); - - sb.Append("insert into `" + TrimSchemaPrefix(op.Table) + "` (`migrationId`, `model`, `productVersion`) "); - sb.AppendFormat(" values ( '{0}', {1}, '{2}') ", - op.MigrationId, - "0x" + model.ToString(), - op.ProductVersion); - - return new MigrationStatement { Sql = sb.ToString() }; - - } -#endif - - protected virtual MigrationStatement Generate(AddPrimaryKeyOperation op) - { - StringBuilder sb = new StringBuilder(); - sb.Append("alter table `" + TrimSchemaPrefix(op.Table) + "` add primary key "); - sb.Append(" `" + op.Name + "` "); - - if (op.Columns.Count > 0) - sb.Append("( " + string.Join(",", op.Columns.Select(c => "`" + c + "`")) + ") "); - - return new MigrationStatement { Sql = sb.ToString() }; - } - - - protected virtual MigrationStatement Generate(DropPrimaryKeyOperation op) - { - object obj2; - bool deleteAutoIncrement = false; - StringBuilder sb = new StringBuilder(); - - - op.AnonymousArguments.TryGetValue("DeleteAutoIncrement", out obj2); - if (obj2 != null) - bool.TryParse(obj2.ToString(), out deleteAutoIncrement); - - if (deleteAutoIncrement && op.Columns.Count == 1) - { - var newColumn = new ColumnModel(PrimitiveTypeKind.Int32, null); - newColumn.Name = op.Columns[0]; - var alterColumn = new AlterColumnOperation(op.Table, newColumn, false); - var ms = Generate(alterColumn); - sb.Append(ms.Sql + "; "); - } - - return new MigrationStatement { Sql = sb.ToString() + " alter table `" + op.Table + "` drop primary key " }; - } - - - protected virtual MigrationStatement Generate(RenameTableOperation op) - { - if (op == null) return null; - - StringBuilder sb = new StringBuilder(); - sb.AppendFormat("rename table `{0}` to `{1}`", op.Name, op.NewName); - return new MigrationStatement { Sql = sb.ToString() }; - } - - - protected virtual MigrationStatement Generate(MoveTableOperation op) - { - return null; // TODO :check if we'll suppport this operation - } - - protected virtual MigrationStatement Generate(SqlOperation op) - { - return new MigrationStatement { Sql = op.Sql, SuppressTransaction = op.SuppressTransaction }; - } - - private string TrimSchemaPrefix(string table) - { - if (table.StartsWith("dbo.") || table.Contains("dbo.")) - return table.Replace("dbo.", ""); - - return table; - } - } -} - - +// Copyright © 2008, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Collections.Generic; +using System.Data.Entity.Core.Common; +using System.Data.Entity.Core.Common.CommandTrees; +using System.Data.Entity.Core.Metadata.Edm; +using System.Data.Entity.Migrations.Design; +using System.Data.Entity.Migrations.Model; +using System.Data.Entity.Migrations.Sql; +using System.Data.Entity.Migrations.Utilities; +using System.Linq; +using System.Text; + +namespace MySql.Data.EntityFramework +{ + + /// + /// Class used to customized code generation + /// to avoid dbo. prefix added on table names. + /// + public class MySqlMigrationCodeGenerator : CSharpMigrationCodeGenerator + { + private IEnumerable> _foreignKeys; + private IEnumerable> _tableIndexes; + + private string TrimSchemaPrefix(string table) + { + if (table.StartsWith("dbo.")) + return table.Replace("dbo.", ""); + + return table; + } + + private string PrepareSql(string sql, bool removeNonMySqlChars) + { + var sqlResult = sql; + if (removeNonMySqlChars) + { + sqlResult = sql.Replace("[", "").Replace("]", "").Replace("@", ""); + } + sqlResult = sqlResult.Replace("dbo.", ""); + return sqlResult; + } + + private IEnumerable ReorderOperations(IEnumerable operations) + { + if (operations.Where(operation => operation.GetType() == typeof(AddPrimaryKeyOperation)).Count() > 0 && + operations.Where(operation => operation.GetType() == typeof(DropPrimaryKeyOperation)).Count() > 0) + { + List reorderedOpes = new List(); + reorderedOpes.AddRange(operations.Where(operation => operation.GetType() == typeof(AlterColumnOperation))); + reorderedOpes.AddRange(operations.Where(operation => operation.GetType() == typeof(DropPrimaryKeyOperation))); + reorderedOpes.AddRange(operations.Where(operation => operation.GetType() != typeof(DropPrimaryKeyOperation) && operation.GetType() != typeof(AlterColumnOperation))); + return reorderedOpes; + } + return operations; + } + + public override ScaffoldedMigration Generate(string migrationId, IEnumerable operations, string sourceModel, string targetModel, string @namespace, string className) + { + _foreignKeys = (from tbl in operations.OfType() + from fk in operations.OfType() + where tbl.Name.Equals(fk.DependentTable, StringComparison.InvariantCultureIgnoreCase) + select new KeyValuePair(tbl, fk)).ToList(); + + _tableIndexes = (from tbl in operations.OfType() + from idx in operations.OfType() + where tbl.Name.Equals(idx.Table, StringComparison.InvariantCultureIgnoreCase) + select new KeyValuePair(tbl, idx)).ToList(); + + return base.Generate(migrationId, ReorderOperations(operations), sourceModel, targetModel, @namespace, className); + } + + protected override void Generate(AddColumnOperation addColumnOperation, IndentedTextWriter writer) + { + var add = new AddColumnOperation(TrimSchemaPrefix(addColumnOperation.Table), addColumnOperation.Column); + base.Generate(add, writer); + } + + protected override void Generate(AddForeignKeyOperation addForeignKeyOperation, IndentedTextWriter writer) + { + addForeignKeyOperation.PrincipalTable = TrimSchemaPrefix(addForeignKeyOperation.PrincipalTable); + addForeignKeyOperation.DependentTable = TrimSchemaPrefix(addForeignKeyOperation.DependentTable); + addForeignKeyOperation.Name = PrepareSql(addForeignKeyOperation.Name, false); + base.Generate(addForeignKeyOperation, writer); + } + + protected override void GenerateInline(AddForeignKeyOperation addForeignKeyOperation, IndentedTextWriter writer) + { + writer.WriteLine(); + writer.Write(".ForeignKey(\"" + TrimSchemaPrefix(addForeignKeyOperation.PrincipalTable) + "\", "); + Generate(addForeignKeyOperation.DependentColumns, writer); + writer.Write(addForeignKeyOperation.CascadeDelete ? ", cascadeDelete: true)" : ")"); + } + + protected override void Generate(AddPrimaryKeyOperation addPrimaryKeyOperation, IndentedTextWriter writer) + { + addPrimaryKeyOperation.Table = TrimSchemaPrefix(addPrimaryKeyOperation.Table); + base.Generate(addPrimaryKeyOperation, writer); + } + + protected override void Generate(AlterColumnOperation alterColumnOperation, IndentedTextWriter writer) + { + AlterColumnOperation alter = null; + if (alterColumnOperation.Inverse != null) + alter = new AlterColumnOperation(TrimSchemaPrefix(alterColumnOperation.Table), alterColumnOperation.Column, alterColumnOperation.IsDestructiveChange, (AlterColumnOperation)alterColumnOperation.Inverse); + else + alter = new AlterColumnOperation(TrimSchemaPrefix(alterColumnOperation.Table), alterColumnOperation.Column, alterColumnOperation.IsDestructiveChange); + + if (alter != null) + base.Generate(alter, writer); + else + base.Generate(alterColumnOperation); + } + + protected override void Generate(CreateIndexOperation createIndexOperation, IndentedTextWriter writer) + { + createIndexOperation.Table = TrimSchemaPrefix(createIndexOperation.Table); + base.Generate(createIndexOperation, writer); + } + + protected override void GenerateInline(CreateIndexOperation createIndexOperation, IndentedTextWriter writer) + { + writer.WriteLine(); + writer.Write(".Index("); + + Generate(createIndexOperation.Columns, writer); + + writer.Write(createIndexOperation.IsUnique ? ", unique: true" : ""); + writer.Write(!createIndexOperation.HasDefaultName ? string.Format(", name: {0}", TrimSchemaPrefix(createIndexOperation.Name)) : ""); + + writer.Write(")"); + } + + protected override void Generate(CreateTableOperation createTableOperation, IndentedTextWriter writer) + { + var create = new CreateTableOperation(TrimSchemaPrefix(createTableOperation.Name)); + + foreach (var item in createTableOperation.Columns) + create.Columns.Add(item); + + create.PrimaryKey = createTableOperation.PrimaryKey; + + base.Generate(create, writer); + + System.IO.StringWriter innerWriter = writer.InnerWriter as System.IO.StringWriter; + if (innerWriter != null) + { + innerWriter.GetStringBuilder().Remove(innerWriter.ToString().LastIndexOf(";"), innerWriter.ToString().Length - innerWriter.ToString().LastIndexOf(";")); + writer.Indent++; + _foreignKeys.Where(tbl => tbl.Key == createTableOperation).ToList().ForEach(fk => GenerateInline(fk.Value, writer)); + _tableIndexes.Where(tbl => tbl.Key == createTableOperation).ToList().ForEach(idx => GenerateInline(idx.Value, writer)); + writer.WriteLine(";"); + writer.Indent--; + writer.WriteLine(); + } + } + + protected override void Generate(DropColumnOperation dropColumnOperation, IndentedTextWriter writer) + { + var drop = new DropColumnOperation(TrimSchemaPrefix(dropColumnOperation.Table), dropColumnOperation.Name); + base.Generate(drop, writer); + } + + protected override void Generate(DropForeignKeyOperation dropForeignKeyOperation, IndentedTextWriter writer) + { + dropForeignKeyOperation.PrincipalTable = TrimSchemaPrefix(dropForeignKeyOperation.PrincipalTable); + dropForeignKeyOperation.DependentTable = TrimSchemaPrefix(dropForeignKeyOperation.DependentTable); + dropForeignKeyOperation.Name = PrepareSql(dropForeignKeyOperation.Name, false); + base.Generate(dropForeignKeyOperation, writer); + } + + protected override void Generate(DropIndexOperation dropIndexOperation, IndentedTextWriter writer) + { + dropIndexOperation.Table = TrimSchemaPrefix(dropIndexOperation.Table); + base.Generate(dropIndexOperation, writer); + } + + protected override void Generate(DropPrimaryKeyOperation dropPrimaryKeyOperation, IndentedTextWriter writer) + { + dropPrimaryKeyOperation.Table = TrimSchemaPrefix(dropPrimaryKeyOperation.Table); + base.Generate(dropPrimaryKeyOperation, writer); + } + + protected override void Generate(DropTableOperation dropTableOperation, IndentedTextWriter writer) + { + var drop = new DropTableOperation(TrimSchemaPrefix(dropTableOperation.Name)); + base.Generate(drop, writer); + } + + protected override void Generate(MoveTableOperation moveTableOperation, IndentedTextWriter writer) + { + var move = new MoveTableOperation(TrimSchemaPrefix(moveTableOperation.Name), moveTableOperation.NewSchema); + base.Generate(move, writer); + } + + protected override void Generate(RenameColumnOperation renameColumnOperation, IndentedTextWriter writer) + { + var rename = new RenameColumnOperation(TrimSchemaPrefix(renameColumnOperation.Table), renameColumnOperation.Name, renameColumnOperation.NewName); + base.Generate(rename, writer); + } + + protected override void Generate(RenameTableOperation renameTableOperation, IndentedTextWriter writer) + { + var rename = new RenameTableOperation(TrimSchemaPrefix(renameTableOperation.Name), renameTableOperation.NewName); + base.Generate(rename, writer); + } + } + + + /// + /// Implementation of a MySql's Sql generator for EF 4.3 data migrations. + /// + public class MySqlMigrationSqlGenerator : MigrationSqlGenerator + { + private List _specialStmts = new List(); + private DbProviderManifest _providerManifest; + private Dictionary _dispatcher = new Dictionary(); + private List _generatedTables { get; set; } + private string _tableName { get; set; } + private string _providerManifestToken; + private List autoIncrementCols { get; set; } + private List primaryKeyCols { get; set; } + private IEnumerable _pkOperations = new List(); + + delegate MigrationStatement OpDispatcher(MigrationOperation op); + + + public MySqlMigrationSqlGenerator() + { + + _dispatcher.Add("AddColumnOperation", (OpDispatcher)((op) => { return Generate(op as AddColumnOperation); })); + _dispatcher.Add("AddForeignKeyOperation", (OpDispatcher)((op) => { return Generate(op as AddForeignKeyOperation); })); + _dispatcher.Add("AddPrimaryKeyOperation", (OpDispatcher)((op) => { return Generate(op as AddPrimaryKeyOperation); })); + _dispatcher.Add("AlterColumnOperation", (OpDispatcher)((op) => { return Generate(op as AlterColumnOperation); })); + _dispatcher.Add("CreateIndexOperation", (OpDispatcher)((op) => { return Generate(op as CreateIndexOperation); })); + _dispatcher.Add("CreateTableOperation", (OpDispatcher)((op) => { return Generate(op as CreateTableOperation); })); + _dispatcher.Add("DropColumnOperation", (OpDispatcher)((op) => { return Generate(op as DropColumnOperation); })); + _dispatcher.Add("DropForeignKeyOperation", (OpDispatcher)((op) => { return Generate(op as DropForeignKeyOperation); })); + _dispatcher.Add("DropIndexOperation", (OpDispatcher)((op) => { return Generate(op as DropIndexOperation); })); + _dispatcher.Add("DropPrimaryKeyOperation", (OpDispatcher)((op) => { return Generate(op as DropPrimaryKeyOperation); })); + _dispatcher.Add("DropTableOperation", (OpDispatcher)((op) => { return Generate(op as DropTableOperation); })); + _dispatcher.Add("MoveTableOperation", (OpDispatcher)((op) => { return Generate(op as MoveTableOperation); })); + _dispatcher.Add("RenameColumnOperation", (OpDispatcher)((op) => { return Generate(op as RenameColumnOperation); })); + _dispatcher.Add("RenameTableOperation", (OpDispatcher)((op) => { return Generate(op as RenameTableOperation); })); + _dispatcher.Add("SqlOperation", (OpDispatcher)((op) => { return Generate(op as SqlOperation); })); + autoIncrementCols = new List(); + primaryKeyCols = new List(); + _dispatcher.Add("HistoryOperation", (OpDispatcher)((op) => { return Generate(op as HistoryOperation); })); + _dispatcher.Add("CreateProcedureOperation", (OpDispatcher)((op) => { return Generate(op as CreateProcedureOperation); })); + _dispatcher.Add("UpdateDatabaseOperation", (OpDispatcher)((op) => { return Generate(op as UpdateDatabaseOperation); })); + } + + public override IEnumerable Generate(IEnumerable migrationOperations, string providerManifestToken) + { + MySqlConnection con = new MySqlConnection(); + List stmts = new List(); + _providerManifestToken = providerManifestToken; + _providerManifest = DbProviderServices.GetProviderServices(con).GetProviderManifest(providerManifestToken); + + //verify if there is one or more add/alter column operation, if there is then look for primary key operations. Alter in case that the user wants to change the current PK column + if ((from cols in migrationOperations.OfType() select cols).Count() > 0 || (from cols in migrationOperations.OfType() select cols).Count() > 0) + _pkOperations = (from pks in migrationOperations.OfType() select pks).ToList(); + + foreach (MigrationOperation op in migrationOperations) + { + if (!_dispatcher.ContainsKey(op.GetType().Name)) + throw new NotImplementedException(op.GetType().Name); + OpDispatcher opdis = _dispatcher[op.GetType().Name]; + stmts.Add(opdis(op)); + } + if (_specialStmts.Count > 0) + { + foreach (var item in _specialStmts) + stmts.Add(item); + } + return stmts; + } + + private MigrationStatement Generate(UpdateDatabaseOperation updateDatabaseOperation) + { + if (updateDatabaseOperation == null) + throw new ArgumentNullException("UpdateDatabaseOperation"); + + MigrationStatement statement = new MigrationStatement(); + StringBuilder sql = new StringBuilder(); + const string idempotentScriptName = "_idempotent_script"; + SelectGenerator generator = new SelectGenerator(); + + if (!updateDatabaseOperation.Migrations.Any()) + return statement; + + sql.AppendFormat("DROP PROCEDURE IF EXISTS `{0}`;", idempotentScriptName); + sql.AppendLine(); + sql.AppendLine(); + + sql.AppendLine("DELIMITER //"); + sql.AppendLine(); + + sql.AppendFormat("CREATE PROCEDURE `{0}`()", idempotentScriptName); + sql.AppendLine(); + sql.AppendLine("BEGIN"); + sql.AppendLine(" DECLARE CurrentMigration TEXT;"); + sql.AppendLine(); + sql.AppendLine(" IF EXISTS(SELECT 1 FROM information_schema.tables "); + sql.AppendLine(" WHERE table_name = '__MigrationHistory' "); + sql.AppendLine(" AND table_schema = DATABASE()) THEN "); + + foreach (var historyQueryTree in updateDatabaseOperation.HistoryQueryTrees) + { + string historyQuery = generator.GenerateSQL(historyQueryTree); + ReplaceParemeters(ref historyQuery, generator.Parameters); + sql.AppendLine(@" SET CurrentMigration = (" + historyQuery + ");"); + sql.AppendLine(" END IF;"); + sql.AppendLine(); + } + + sql.AppendLine(" IF CurrentMigration IS NULL THEN"); + sql.AppendLine(" SET CurrentMigration = '0';"); + sql.AppendLine(" END IF;"); + sql.AppendLine(); + + // Migrations + foreach (var migration in updateDatabaseOperation.Migrations) + { + if (migration.Operations.Count == 0) + continue; + + sql.AppendLine(" IF CurrentMigration < '" + migration.MigrationId + "' THEN "); + var statements = Generate(migration.Operations, _providerManifestToken); + foreach (var migrationStatement in statements) + { + string sqlStatement = migrationStatement.Sql; + if (!sqlStatement.EndsWith(";")) + sqlStatement += ";"; + sql.AppendLine(sqlStatement); + } + sql.AppendLine(" END IF;"); + sql.AppendLine(); + } + + sql.AppendLine("END //"); + sql.AppendLine(); + sql.AppendLine("DELIMITER ;"); + sql.AppendLine(); + sql.AppendFormat("CALL `{0}`();", idempotentScriptName); + sql.AppendLine(); + sql.AppendLine(); + sql.AppendFormat("DROP PROCEDURE IF EXISTS `{0}`;", idempotentScriptName); + sql.AppendLine(); + + statement.Sql = sql.ToString(); + + return statement; + } + + protected virtual MigrationStatement Generate(HistoryOperation op) + { + if (op == null) return null; + + MigrationStatement stmt = new MigrationStatement(); + + var cmdStr = ""; + SqlGenerator generator = new SelectGenerator(); + foreach (var commandTree in op.CommandTrees) + { + switch (commandTree.CommandTreeKind) + { + case DbCommandTreeKind.Insert: + generator = new InsertGenerator(); + break; + case DbCommandTreeKind.Delete: + generator = new DeleteGenerator(); + break; + case DbCommandTreeKind.Update: + generator = new UpdateGenerator(); + break; + case DbCommandTreeKind.Query: + generator = new SelectGenerator(); + break; + case DbCommandTreeKind.Function: + generator = new FunctionGenerator(); + break; + default: + throw new NotImplementedException(commandTree.CommandTreeKind.ToString()); + } + cmdStr = generator.GenerateSQL(commandTree); + + ReplaceParemeters(ref cmdStr, generator.Parameters); + stmt.Sql += cmdStr.Replace("dbo.", "") + ";"; + } + return stmt; + } + + private void ReplaceParemeters(ref string sql, IList parameters) + { + foreach (var parameter in parameters) + { + if (parameter.DbType == System.Data.DbType.String) + sql = sql.Replace(parameter.ParameterName, "'" + parameter.Value.ToString() + "'"); + else if (parameter.DbType == System.Data.DbType.Binary) + sql = sql.Replace(parameter.ParameterName, "0x" + BitConverter.ToString((byte[])parameter.Value).Replace("-", "")); + else + sql = sql.Replace(parameter.ParameterName, parameter.Value.ToString()); + } + } + + public override string GenerateProcedureBody(ICollection commandTrees, string rowsAffectedParameter, string providerManifestToken) + { + MySqlConnection con = new MySqlConnection(); + MigrationStatement stmt = new MigrationStatement(); + _providerManifest = DbProviderServices.GetProviderServices(con).GetProviderManifest(providerManifestToken); + + var cmdStr = ""; + SqlGenerator generator = new SelectGenerator(); + foreach (var commandTree in commandTrees) + { + switch (commandTree.CommandTreeKind) + { + case DbCommandTreeKind.Insert: + generator = new InsertGenerator(); + cmdStr = generator.GenerateSQL(commandTree); + break; + case DbCommandTreeKind.Delete: + generator = new DeleteGenerator(); + cmdStr = generator.GenerateSQL(commandTree); + break; + case DbCommandTreeKind.Update: + generator = new UpdateGenerator(); + cmdStr = generator.GenerateSQL(commandTree); + break; + case DbCommandTreeKind.Query: + generator = new SelectGenerator(); + cmdStr = generator.GenerateSQL(commandTree); + break; + case DbCommandTreeKind.Function: + generator = new FunctionGenerator(); + cmdStr = generator.GenerateSQL(commandTree); + break; + } + stmt.Sql += cmdStr.Replace("dbo.", "") + ";"; + } + return stmt.Sql; + } + + protected virtual MigrationStatement Generate(CreateProcedureOperation op) + { + MigrationStatement stmt = new MigrationStatement(); + stmt.Sql = GenerateProcedureCmd(op); + return stmt; + } + + private string GenerateProcedureCmd(CreateProcedureOperation po) + { + StringBuilder sql = new StringBuilder(); + sql.AppendLine(string.Format("CREATE PROCEDURE `{0}`({1})", po.Name.Replace("dbo.", ""), GenerateParamSentence(po.Parameters))); + sql.AppendLine("BEGIN "); + sql.AppendLine(po.BodySql); + sql.AppendLine(" END"); + return sql.ToString().Replace("@", ""); + } + + private string GenerateParamSentence(IList Parameters) + { + StringBuilder sql = new StringBuilder(); + foreach (ParameterModel param in Parameters) + { + sql.AppendFormat("{0} {1} {2},", + (param.IsOutParameter ? "OUT" : "IN"), + param.Name, + BuildParamType(param)); + } + + return sql.ToString().Substring(0, sql.ToString().LastIndexOf(",")); + } + + private string BuildParamType(ParameterModel param) + { + string type = MySqlProviderServices.Instance.GetColumnType(_providerManifest.GetStoreType(param.TypeUsage)); + StringBuilder sb = new StringBuilder(); + sb.Append(type); + + if (new string[] { "char", "varchar" }.Contains(type.ToLower())) + { + if (param.MaxLength.HasValue) + { + sb.AppendFormat("({0}) ", param.MaxLength.Value); + } + } + + if (param.Precision.HasValue && param.Scale.HasValue) + { + sb.AppendFormat("( {0}, {1} ) ", param.Precision.Value, param.Scale.Value); + } + + return sb.ToString(); + } + + /// + /// Generates a migration operation to add a column. + /// + /// The operation that represents a column being added to a table. + /// A migration operation to add a column. + protected virtual MigrationStatement Generate(AddColumnOperation op) + { + if (op == null) return null; + + _tableName = op.Table; + + MigrationStatement stmt = new MigrationStatement(); + //verify if there is any "AddPrimaryKeyOperation" related with the column that will be added and if it is defined as identity (auto_increment) + bool uniqueAttr = (from pkOpe in _pkOperations + where (from col in pkOpe.Columns + where col == op.Column.Name + select col).Count() > 0 + select pkOpe).Count() > 0 & op.Column.IsIdentity; + + // if the column to be added is PK as well as identity we need to specify the column as unique to avoid the error: + // "Incorrect table definition there can be only one auto column and it must be defined as a key", + // since unique and PK are almost equivalent we'll be able to add the new column and later add the PK related to it, + // this because the "AddPrimaryKeyOperation" is executed after the column is added + stmt.Sql = EndsWithSemicolon(string.Format("alter table `{0}` add column `{1}` {2} {3}", TrimSchemaPrefix(op.Table), + op.Column.Name, Generate(op.Column), (uniqueAttr ? " unique " : ""))); + + return stmt; + } + + /// + /// Generates a migration operation to drop a column. + /// + /// The operation that represents a column being dropped from a table. + /// The migration operation to drop a column. + protected virtual MigrationStatement Generate(DropColumnOperation op) + { + if (op == null) return null; + + MigrationStatement stmt = new MigrationStatement(); + stmt.Sql = EndsWithSemicolon(string.Format("alter table `{0}` drop column `{1}`", + TrimSchemaPrefix(op.Table), op.Name)); + return stmt; + } + + /// + /// Generates a migration operation to alter a column. + /// + /// The operation that represents altering an existing column. + /// A migration operation to alter a column. + protected virtual MigrationStatement Generate(AlterColumnOperation op) + { + if (op == null) return null; + + ColumnModel column = op.Column; + StringBuilder sb = new StringBuilder(); + _tableName = op.Table; + + //verify if there is any "AddPrimaryKeyOperation" related with the column that will be added and if it is defined as identity (auto_increment) + bool uniqueAttr = (from pkOpe in _pkOperations + where (from col in pkOpe.Columns + where col == op.Column.Name + select col).Count() > 0 + select pkOpe).Count() > 0 & op.Column.IsIdentity; + + // for existing columns + sb.Append("alter table `" + TrimSchemaPrefix(op.Table) + "` modify `" + column.Name + "` "); + + // add definition + sb.Append(Generate(column) + (uniqueAttr ? " unique " : "")); + + return new MigrationStatement { Sql = EndsWithSemicolon(sb.ToString()) }; + } + + /// + /// Generates a migration operation to rename a column. + /// + /// The operation that represents a column being renamed. + /// A migration operation to rename a column. + protected virtual MigrationStatement Generate(RenameColumnOperation op) + { + if (op == null) return null; + + StringBuilder sb = new StringBuilder(); + + sb.Append("set @columnType := (select case lower(IS_NULLABLE) when 'no' then CONCAT(column_type, ' not null ') " + + "when 'yes' then column_type end from information_schema.columns " + + "where table_name = '" + TrimSchemaPrefix(op.Table) + "' and column_name = '" + op.Name + "' and table_schema = DATABASE());"); + sb.AppendLine(); + sb.Append("set @sqlstmt := (select concat('alter table `" + TrimSchemaPrefix(op.Table) + "` change `" + op.Name + "` `" + op.NewName + "` ' , @columnType));"); + sb.AppendLine(); + sb.Append("prepare stmt from @sqlstmt;"); + sb.AppendLine(); + sb.Append("execute stmt;"); + sb.AppendLine(); + sb.Append("deallocate prepare stmt;"); + return new MigrationStatement { Sql = EndsWithSemicolon(sb.ToString()) }; + + } + + /// + /// Generates a migration operation to add a foreign key. + /// + /// the operation that represents a foreing key constraint being added to a table. + /// A migration operation to add a foreign key constraint. + protected virtual MigrationStatement Generate(AddForeignKeyOperation op) + { + + StringBuilder sb = new StringBuilder(); + string fkName = op.Name; + if (fkName.Length > 64) + { + fkName = "FK_" + Guid.NewGuid().ToString().Replace("-", ""); + } + sb.Append("alter table `" + TrimSchemaPrefix(op.DependentTable) + "` add constraint `" + TrimSchemaPrefix(fkName) + "` " + + " foreign key "); + + sb.Append("(" + string.Join(",", op.DependentColumns.Select(c => "`" + c + "`")) + ") "); + sb.Append("references `" + TrimSchemaPrefix(op.PrincipalTable) + "` ( " + string.Join(",", op.PrincipalColumns.Select(c => "`" + c + "`")) + ") "); + + if (op.CascadeDelete) + { + sb.Append(" on update cascade on delete cascade "); + } + + return new MigrationStatement { Sql = EndsWithSemicolon(sb.ToString()) }; + } + + /// + /// Generates an SQL statement of a column model. + /// + /// The model that represents a column. + /// A string containing an SQL statement of a column model. + protected virtual string Generate(ColumnModel op) + { + TypeUsage typeUsage = _providerManifest.GetStoreType(op.TypeUsage); + StringBuilder sb = new StringBuilder(); + string type = op.StoreType; + if (type == null) + { + type = MySqlProviderServices.Instance.GetColumnType(typeUsage); + } + + sb.Append(type); + + if (!type.EndsWith(")", StringComparison.InvariantCulture)) + { + if ((op.ClrType == typeof(string)) || + ((op.ClrType == typeof(byte) || op.ClrType == typeof(byte[])) && op.ClrType.IsArray)) + { + if (op.MaxLength.HasValue) + { + sb.AppendFormat("({0}) ", op.MaxLength.Value); + } + } + if (op.Precision.HasValue && op.Scale.HasValue) + { + sb.AppendFormat("( {0}, {1} ) ", op.Precision.Value, op.Scale.Value); + } + else + { + if (type == "datetime" || type == "timestamp" || type == "time") + { + if (op.Precision.HasValue && op.Precision.Value >= 1) + { + sb.AppendFormat("({0}) ", op.Precision.Value <= 6 ? op.Precision.Value : 6); + } + if (op.IsIdentity && (String.Compare(type, "datetime", true) == 0 || String.Compare(type, "timestamp", true) == 0)) + { + sb.AppendFormat(" DEFAULT CURRENT_TIMESTAMP{0}", op.Precision.HasValue && op.Precision.Value >= 1 ? "( " + op.Precision.Value.ToString() + " )" : ""); + } + } + } + } + + op.StoreType = type; + + if (!(op.IsNullable ?? true)) + { + sb.Append(string.Format("{0} not null ", + ((!primaryKeyCols.Contains(op.Name) && op.IsIdentity && op.Type != PrimitiveTypeKind.Guid) ? " unsigned" : + ((op.Type == PrimitiveTypeKind.Guid) ? " default '' " : "")))); + } + if (op.IsIdentity && (new string[] { "tinyint", "smallint", "mediumint", "int", "bigint" }).Contains(type.ToLower())) + { + sb.Append(" auto_increment "); + autoIncrementCols.Add(op.Name); + } + else + { + // nothing + } + if (!string.IsNullOrEmpty(op.DefaultValueSql)) + { + sb.Append(string.Format(" default {0}", op.DefaultValueSql)); + } + return sb.ToString(); + } + + /// + /// Generates a migration operation to drop a foreign key constraint from a table. + /// + /// The operation that represents a foreign key being added from a table. + /// A migration operation to drop a foreign key. + protected virtual MigrationStatement Generate(DropForeignKeyOperation op) + { + StringBuilder sb = new StringBuilder(); + sb = sb.AppendFormat("alter table `{0}` drop foreign key `{1}`", op.DependentTable, op.Name); + return new MigrationStatement { Sql = EndsWithSemicolon(sb.ToString()) }; + } + + /// + /// Generates a migration operation to create a database index. + /// + /// The operation that represents creating a database index. + /// A migration operation to create a database index. + protected virtual MigrationStatement Generate(CreateIndexOperation op) + { + StringBuilder sb = new StringBuilder(); + + sb = sb.Append("CREATE "); + + if (op.IsUnique) + { + sb.Append("UNIQUE "); + } + + //index_col_name specification can end with ASC or DESC. + // sort order are permitted for future extensions for specifying ascending or descending index value storage + //Currently, they are parsed but ignored; index values are always stored in ascending order. + + object sort; + op.AnonymousArguments.TryGetValue("Sort", out sort); + var sortOrder = sort != null && sort.ToString() == "Ascending" ? + "ASC" : "DESC"; + + sb.AppendFormat("index `{0}` on `{1}` (", op.Name, TrimSchemaPrefix(op.Table)); + sb.Append(string.Join(",", op.Columns.Select(c => "`" + c + "` " + sortOrder)) + ") "); + + object indexTypeDefinition; + op.AnonymousArguments.TryGetValue("Type", out indexTypeDefinition); + var indexType = indexTypeDefinition != null && string.Compare(indexTypeDefinition.ToString(), "BTree", StringComparison.InvariantCultureIgnoreCase) > 0 ? + "BTREE" : "HASH"; + + sb.Append("using " + indexType); + + // As of MySQL 8.0, ASC and DESC are not permitted for HASH indexes. + if (Convert.ToDouble(_providerManifestToken, System.Globalization.CultureInfo.InvariantCulture) >= 8.0 && indexType == "HASH") + sb.Replace(sortOrder, string.Empty); + + return new MigrationStatement() { Sql = EndsWithSemicolon(sb.ToString()) }; + } + + /// + /// Generates a migration operation to drop an existing database index. + /// + /// The operation that represents dropping am existing database index. + /// A migration operation to drop an existing database index. + protected virtual MigrationStatement Generate(DropIndexOperation op) + { + return new MigrationStatement() + { + Sql = EndsWithSemicolon(string.Format("alter table `{0}` drop index `{1}`", + TrimSchemaPrefix(op.Table), op.Name)) + }; + } + + /// + /// Generates a migration operation to create a table. + /// + /// The operation that represents creating a table. + /// A migration operation to create a table. + protected virtual MigrationStatement Generate(CreateTableOperation op) + { + StringBuilder sb = new StringBuilder(); + string tableName = TrimSchemaPrefix(op.Name); + primaryKeyCols.Clear(); + autoIncrementCols.Clear(); + if (_generatedTables == null) + _generatedTables = new List(); + + if (!_generatedTables.Contains(tableName)) + { + _generatedTables.Add(tableName); + } + sb.Append("create table " + "`" + tableName + "`" + " ("); + + _tableName = op.Name; + + if (op.PrimaryKey != null) + { + op.PrimaryKey.Columns.ToList().ForEach(col => primaryKeyCols.Add(col)); + } + + //columns + sb.Append(string.Join(",", op.Columns.Select(c => "`" + c.Name + "` " + Generate(c)))); + + // Determine columns that are GUID & identity + List guidCols = new List(); + ColumnModel guidPK = null; + foreach (ColumnModel opCol in op.Columns) + { + if (opCol.Type == PrimitiveTypeKind.Guid && opCol.IsIdentity && String.Compare(opCol.StoreType, "CHAR(36) BINARY", true) == 0) + { + if (primaryKeyCols.Contains(opCol.Name)) + guidPK = opCol; + guidCols.Add(opCol); + } + } + + if (guidCols.Count != 0) + { + var createTrigger = new StringBuilder(); + createTrigger.AppendLine(string.Format("DROP TRIGGER IF EXISTS `{0}_IdentityTgr`;", TrimSchemaPrefix(_tableName))); + createTrigger.AppendLine(string.Format("CREATE TRIGGER `{0}_IdentityTgr` BEFORE INSERT ON `{0}`", TrimSchemaPrefix(_tableName))); + createTrigger.AppendLine("FOR EACH ROW BEGIN"); + for (int i = 0; i < guidCols.Count; i++) + { + ColumnModel opCol = guidCols[i]; + createTrigger.AppendLine(string.Format("SET NEW.{0} = UUID();", opCol.Name)); + } + createTrigger.AppendLine(string.Format("DROP TEMPORARY TABLE IF EXISTS tmpIdentity_{0};", TrimSchemaPrefix(_tableName))); + createTrigger.AppendLine(string.Format("CREATE TEMPORARY TABLE tmpIdentity_{0} (guid CHAR(36))ENGINE=MEMORY;", TrimSchemaPrefix(_tableName))); + createTrigger.AppendLine(string.Format("INSERT INTO tmpIdentity_{0} VALUES(New.{1});", TrimSchemaPrefix(_tableName), guidPK.Name)); + createTrigger.AppendLine("END"); + var sqlOp = new SqlOperation(createTrigger.ToString()); + _specialStmts.Add(Generate(sqlOp)); + } + + if (op.PrimaryKey != null)// && !sb.ToString().Contains("primary key")) + { + sb.Append(","); + sb.Append("primary key ( " + string.Join(",", op.PrimaryKey.Columns.Select(c => "`" + c + "`")) + ") "); + } + + string keyFields = ","; + autoIncrementCols.ForEach(col => keyFields += (!primaryKeyCols.Contains(col) ? string.Format(" KEY (`{0}`),", col) : "")); + sb.Append(keyFields.Substring(0, keyFields.LastIndexOf(","))); + sb.Append(") engine=InnoDb auto_increment=0"); + + return new MigrationStatement() { Sql = EndsWithSemicolon(sb.ToString()) }; + } + + /// + /// Generates a migration operation to drop an existing table. + /// + /// The operation that represents dropping an existing table. + /// A migration operation to drop an existing table. + protected virtual MigrationStatement Generate(DropTableOperation op) + { + return new MigrationStatement() { Sql = EndsWithSemicolon("drop table " + "`" + TrimSchemaPrefix(op.Name) + "`") }; + } + + /// + /// Generates a migration operation to add a primary key to a table. + /// + /// The operation that represents adding a primary key to a table. + /// A migration operation to add a primary key to a table. + protected virtual MigrationStatement Generate(AddPrimaryKeyOperation op) + { + StringBuilder sb = new StringBuilder(); + sb.Append("alter table `" + TrimSchemaPrefix(op.Table) + "` add primary key "); + sb.Append(" `" + op.Name + "` "); + + if (op.Columns.Count > 0) + sb.Append("( " + string.Join(",", op.Columns.Select(c => "`" + c + "`")) + ") "); + + return new MigrationStatement { Sql = EndsWithSemicolon(sb.ToString()) }; + } + + /// + /// Generates a migration operation to drpo an existing primary key. + /// + /// The operation that represents dropping an existing primary key. + /// A migration operation to drop an existing primary key. + protected virtual MigrationStatement Generate(DropPrimaryKeyOperation op) + { + object obj2; + bool deleteAutoIncrement = false; + StringBuilder sb = new StringBuilder(); + + + op.AnonymousArguments.TryGetValue("DeleteAutoIncrement", out obj2); + if (obj2 != null) + bool.TryParse(obj2.ToString(), out deleteAutoIncrement); + + if (deleteAutoIncrement && op.Columns.Count == 1) + { + var newColumn = new ColumnModel(PrimitiveTypeKind.Int32, null); + newColumn.Name = op.Columns[0]; + var alterColumn = new AlterColumnOperation(op.Table, newColumn, false); + var ms = Generate(alterColumn); + sb.Append(ms.Sql); + } + + return new MigrationStatement { Sql = EndsWithSemicolon(sb.ToString() + " alter table `" + op.Table + "` drop primary key ") }; + } + + /// + /// Generates a migration operation to rename an existing table. + /// + /// The operation that represents renaming an existing table. + /// A migration operation to rename an existing table. + protected virtual MigrationStatement Generate(RenameTableOperation op) + { + if (op == null) return null; + + StringBuilder sb = new StringBuilder(); + sb.AppendFormat("rename table `{0}` to `{1}`", op.Name, op.NewName); + return new MigrationStatement { Sql = EndsWithSemicolon(sb.ToString()) }; + } + + /// + /// Not implemented yet. + /// + /// NA + /// NA + protected virtual MigrationStatement Generate(MoveTableOperation op) + { + return new MigrationStatement { Sql = "" }; // TODO :check if we'll suppport this operation + } + + private string EndsWithSemicolon(string str) + { + //remove last linefeed or whitespace end of string + string strSemiColon = str.TrimEnd(new char[] { ' ', '\r', '\n', ';' }); + strSemiColon += ";"; + return strSemiColon; + } + + /// + /// Generates a migration operation with a MySQL statement to be executed. + /// + /// The operation representing a MySQL statement to be executed directly against the database. + /// A migration operation with a MySQL statement to be executed. + protected virtual MigrationStatement Generate(SqlOperation op) + { + return new MigrationStatement { Sql = op.Sql, SuppressTransaction = op.SuppressTransaction }; + } + + private string TrimSchemaPrefix(string table) + { + if (table.StartsWith("dbo.") || table.Contains("dbo.")) + return table.Replace("dbo.", ""); + + return table; + } + } +} + + diff --git a/EntityFramework/src/MySqlSpatialDataReader.cs b/EntityFramework/src/MySqlSpatialDataReader.cs new file mode 100644 index 000000000..8425a70da --- /dev/null +++ b/EntityFramework/src/MySqlSpatialDataReader.cs @@ -0,0 +1,95 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using MySql.Data.Types; +using System.Data.Entity.Spatial; + + +namespace MySql.Data.EntityFramework +{ + internal sealed class MySqlSpatialDataReader : DbSpatialDataReader + { + private readonly EFMySqlDataReader reader; + + static MySqlSpatialDataReader() + { + } + + public MySqlSpatialDataReader(EFMySqlDataReader underlyingReader) + { + this.reader = underlyingReader; + } + + public override DbGeography GetGeography(int ordinal) + { + throw new NotImplementedException(); + } + + public override DbGeometry GetGeometry(int ordinal) + { + ReturnGeometryColumn(ordinal); + + var geometryBytes = this.reader.GetValue(ordinal); + Type t = geometryBytes.GetType(); + + object geometry = Activator.CreateInstance(t); + + var providerValue = new MySqlGeometry(); + + MySqlGeometry.TryParse(geometryBytes.ToString(), out providerValue); + + return MySqlSpatialServices.Instance.GeometryFromProviderValue(providerValue); + + } + + private void ReturnGeometryColumn(int ordinal) + { + string fieldTypeName = this.reader.GetDataTypeName(ordinal); + if (!fieldTypeName.Equals("Geometry", StringComparison.Ordinal)) + { + throw new InvalidOperationException( + string.Format( + "Invalid Geometry type reading operation on type {0}", + fieldTypeName)); + } + } + + public override bool IsGeographyColumn(int ordinal) + { + //throw new NotImplementedException(); + return false; + } + + public override bool IsGeometryColumn(int ordinal) + { + //throw new NotImplementedException(); + return false; + } + } +} diff --git a/Source/MySql.Data.Entity.EF6/MySqlSpatialServices.cs b/EntityFramework/src/MySqlSpatialServices.cs similarity index 93% rename from Source/MySql.Data.Entity.EF6/MySqlSpatialServices.cs rename to EntityFramework/src/MySqlSpatialServices.cs index 193d27852..bd7071d35 100644 --- a/Source/MySql.Data.Entity.EF6/MySqlSpatialServices.cs +++ b/EntityFramework/src/MySqlSpatialServices.cs @@ -1,991 +1,989 @@ -// Copyright © 2013, 2014, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using MySql.Data.Types; -using MySql.Data.MySqlClient; -#if EF6 -using System.Data.Entity.Spatial; -#else -using System.Data.Spatial; -#endif - - -namespace MySql.Data.Entity -{ - internal sealed class MySqlSpatialServices : DbSpatialServices - { - - internal static readonly MySqlSpatialServices Instance = new MySqlSpatialServices(); - - private MySqlSpatialServices() - { - } - - #region overriden methods - - public override byte[] AsBinary(DbGeography geographyValue) - { - throw new NotImplementedException(); - } - - public override byte[] AsBinary(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var providerValue = new MySqlGeometry(); - MySqlGeometry.TryParse(geometryValue.ProviderValue.ToString(), out providerValue); - - return providerValue.Value; - } - - public override string AsGml(DbGeometry geometryValue) - { - throw new NotImplementedException(); - } - - public override string AsGml(DbGeography geographyValue) - { - throw new NotImplementedException(); - } - - public override string AsText(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var providerValue = new MySqlGeometry(); - MySqlGeometry.TryParse(geometryValue.ProviderValue.ToString(), out providerValue); - - return providerValue.ToString(); - } - - public override string AsText(DbGeography geographyValue) - { - throw new NotImplementedException(); - } - - public override DbGeometry Buffer(DbGeometry geometryValue, double distance) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - DbGeometry mysqlValue = DbGeometry.FromText(geometryValue.ProviderValue.ToString()); - return mysqlValue.Buffer(distance); - } - - public override DbGeography Buffer(DbGeography geographyValue, double distance) - { - throw new NotImplementedException(); - } - - public override bool Contains(DbGeometry geometryValue, DbGeometry otherGeometry) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - if (otherGeometry == null) - throw new ArgumentNullException("otherGeometry"); - - DbGeometry mysqlValue = DbGeometry.FromText(geometryValue.ProviderValue.ToString()); - return mysqlValue.Contains(otherGeometry); - - } - - public override object CreateProviderValue(DbGeometryWellKnownValue wellKnownValue) - { - if (wellKnownValue == null) - throw new ArgumentNullException("wellKnownValue"); - - if (wellKnownValue.WellKnownText != null) - { - var mysqlGeometry = new MySqlGeometry(true); - MySqlGeometry.TryParse(wellKnownValue.WellKnownText.ToString(), out mysqlGeometry); - return mysqlGeometry; - } - else if (wellKnownValue.WellKnownBinary != null) - { - var mysqlGeometry = new MySqlGeometry(MySqlDbType.Geometry, wellKnownValue.WellKnownBinary); - return mysqlGeometry; - } - return null; - } - - public override object CreateProviderValue(DbGeographyWellKnownValue wellKnownValue) - { - throw new NotImplementedException(); - } - - public override DbGeometryWellKnownValue CreateWellKnownValue(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - return mysqlValue.WellKnownValue; - - } - - public override DbGeographyWellKnownValue CreateWellKnownValue(DbGeography geographyValue) - { - throw new NotImplementedException(); - } - - public override bool Crosses(DbGeometry geometryValue, DbGeometry otherGeometry) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - if (otherGeometry == null) - throw new ArgumentNullException("otherGeometry"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - var mysqlOtherValue = GeometryFromProviderValue(otherGeometry); - - return mysqlValue.Crosses(mysqlOtherValue); - } - - public override DbGeometry Difference(DbGeometry geometryValue, DbGeometry otherGeometry) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - if (otherGeometry == null) - throw new ArgumentNullException("otherGeometry"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - var mysqlOtherValue = GeometryFromProviderValue(otherGeometry); - - return mysqlValue.Difference(mysqlOtherValue); - - } - - public override DbGeography Difference(DbGeography geographyValue, DbGeography otherGeography) - { - throw new System.NotImplementedException(); - } - - public override bool Disjoint(DbGeometry geometryValue, DbGeometry otherGeometry) - { - throw new System.NotImplementedException(); - } - - public override bool Disjoint(DbGeography geographyValue, DbGeography otherGeography) - { - throw new System.NotImplementedException(); - } - - public override double Distance(DbGeometry geometryValue, DbGeometry otherGeometry) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - if (otherGeometry == null) - throw new ArgumentNullException("otherGeometry"); - - DbGeometry mysqlValue = DbGeometry.FromText(geometryValue.ProviderValue.ToString()); - - Double? result = mysqlValue.Distance(otherGeometry); - if (result != null) - return result.Value; - return 0; - } - - public override double Distance(DbGeography geographyValue, DbGeography otherGeography) - { - throw new NotImplementedException(); - } - - public override DbGeometry ElementAt(DbGeometry geometryValue, int index) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - return mysqlValue.ElementAt(index); - } - - public override DbGeography ElementAt(DbGeography geographyValue, int index) - { - throw new System.NotImplementedException(); - } - - public override DbGeography GeographyCollectionFromBinary(byte[] geographyCollectionWellKnownBinary, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeography GeographyCollectionFromText(string geographyCollectionWellKnownText, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeography GeographyFromBinary(byte[] wellKnownBinary, int coordinateSystemId) - { - throw new NotImplementedException(); - } - - public override DbGeography GeographyFromBinary(byte[] wellKnownBinary) - { - throw new System.NotImplementedException(); - } - - public override DbGeography GeographyFromGml(string geographyMarkup, int coordinateSystemId) - { - throw new NotImplementedException(); - } - - public override DbGeography GeographyFromGml(string geographyMarkup) - { - throw new System.NotImplementedException(); - } - - public override DbGeography GeographyFromProviderValue(object providerValue) - { - throw new NotImplementedException(); - } - - public override DbGeography GeographyFromText(string wellKnownText, int coordinateSystemId) - { - throw new NotImplementedException(); - } - - public override DbGeography GeographyFromText(string wellKnownText) - { - throw new NotImplementedException(); - } - - public override DbGeography GeographyLineFromBinary(byte[] lineWellKnownBinary, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeography GeographyLineFromText(string lineWellKnownText, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeography GeographyMultiLineFromBinary(byte[] multiLineWellKnownBinary, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeography GeographyMultiLineFromText(string multiLineWellKnownText, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeography GeographyMultiPointFromBinary(byte[] multiPointWellKnownBinary, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeography GeographyMultiPointFromText(string multiPointWellKnownText, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeography GeographyMultiPolygonFromBinary(byte[] multiPolygonWellKnownBinary, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeography GeographyMultiPolygonFromText(string multiPolygonWellKnownText, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeography GeographyPointFromBinary(byte[] pointWellKnownBinary, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeography GeographyPointFromText(string pointWellKnownText, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeography GeographyPolygonFromBinary(byte[] polygonWellKnownBinary, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeography GeographyPolygonFromText(string polygonWellKnownText, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeometry GeometryCollectionFromBinary(byte[] geometryCollectionWellKnownBinary, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeometry GeometryCollectionFromText(string geometryCollectionWellKnownText, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeometry GeometryFromBinary(byte[] wellKnownBinary, int coordinateSystemId) - { - if (wellKnownBinary == null) - throw new ArgumentNullException("wellKnownBinary"); - - DbGeometry mysqlValue = DbGeometry.FromBinary(wellKnownBinary, coordinateSystemId); - - return GeometryFromProviderValue(mysqlValue); - } - - public override DbGeometry GeometryFromBinary(byte[] wellKnownBinary) - { - if (wellKnownBinary == null) - throw new ArgumentNullException("wellKnownBinary"); - - DbGeometry mysqlValue = DbGeometry.FromBinary(wellKnownBinary); - - return GeometryFromProviderValue(mysqlValue); - } - - public override DbGeometry GeometryFromGml(string geometryMarkup, int coordinateSystemId) - { - throw new NotImplementedException(); - } - - public override DbGeometry GeometryFromGml(string geometryMarkup) - { - throw new System.NotImplementedException(); - } - - public override DbGeometry GeometryFromProviderValue(object providerValue) - { - if (providerValue == null) - throw new ArgumentNullException("provider value"); - - var myGeom = new MySqlGeometry(); - - if (MySqlGeometry.TryParse(providerValue.ToString(), out myGeom)) - return DbGeometry.FromText(myGeom.GetWKT(), myGeom.SRID.Value); - else - return null; - } - - public override DbGeometry GeometryFromText(string wellKnownText, int coordinateSystemId) - { - if (String.IsNullOrEmpty(wellKnownText)) - throw new ArgumentNullException("wellKnownText"); - - var geomValue = DbGeometry.FromText(wellKnownText, coordinateSystemId); - - var mysqlValue = GeometryFromProviderValue(geomValue); - - return mysqlValue; - } - - public override DbGeometry GeometryFromText(string wellKnownText) - { - if (String.IsNullOrEmpty(wellKnownText) == null) - throw new ArgumentNullException("wellKnownText"); - - var geomValue = DbGeometry.FromText(wellKnownText); - - var mysqlValue = GeometryFromProviderValue(geomValue); - - return mysqlValue; - - } - - public override DbGeometry GeometryLineFromBinary(byte[] lineWellKnownBinary, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeometry GeometryLineFromText(string lineWellKnownText, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeometry GeometryMultiLineFromBinary(byte[] multiLineWellKnownBinary, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeometry GeometryMultiLineFromText(string multiLineWellKnownText, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeometry GeometryMultiPointFromBinary(byte[] multiPointWellKnownBinary, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeometry GeometryMultiPointFromText(string multiPointWellKnownText, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeometry GeometryMultiPolygonFromBinary(byte[] multiPolygonWellKnownBinary, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeometry GeometryMultiPolygonFromText(string multiPolygonKnownText, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeometry GeometryPointFromBinary(byte[] pointWellKnownBinary, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeometry GeometryPointFromText(string pointWellKnownText, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeometry GeometryPolygonFromBinary(byte[] polygonWellKnownBinary, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override DbGeometry GeometryPolygonFromText(string polygonWellKnownText, int coordinateSystemId) - { - throw new System.NotImplementedException(); - } - - public override double? GetArea(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - return mysqlValue.Area; - } - - public override double? GetArea(DbGeography geographyValue) - { - throw new NotImplementedException(); - } - - public override DbGeometry GetBoundary(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - return mysqlValue.Boundary; - } - - public override DbGeometry GetCentroid(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - return mysqlValue.Centroid; - } - - public override DbGeometry GetConvexHull(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - return mysqlValue.ConvexHull; - } - - public override int GetCoordinateSystemId(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - return mysqlValue.CoordinateSystemId; - } - - public override int GetCoordinateSystemId(DbGeography geographyValue) - { - throw new NotImplementedException(); - } - - public override int GetDimension(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - return mysqlValue.Dimension; - } - - public override int GetDimension(DbGeography geographyValue) - { - throw new System.NotImplementedException(); - } - - public override int? GetElementCount(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - return mysqlValue.ElementCount; - } - - public override int? GetElementCount(DbGeography geographyValue) - { - throw new System.NotImplementedException(); - } - - public override double? GetElevation(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - return mysqlValue.Elevation; - } - - public override double? GetElevation(DbGeography geographyValue) - { - throw new System.NotImplementedException(); - } - - public override DbGeometry GetEndPoint(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - return mysqlValue.EndPoint; - } - - public override DbGeography GetEndPoint(DbGeography geographyValue) - { - throw new System.NotImplementedException(); - } - - public override DbGeometry GetEnvelope(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - return mysqlValue.Envelope; - } - - public override DbGeometry GetExteriorRing(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - return mysqlValue.ExteriorRing; - } - - public override int? GetInteriorRingCount(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - return mysqlValue.InteriorRingCount; - } - - public override bool? GetIsClosed(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - return mysqlValue.IsClosed; - } - - public override bool? GetIsClosed(DbGeography geographyValue) - { - throw new System.NotImplementedException(); - } - - public override bool GetIsEmpty(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - return mysqlValue.IsEmpty; - } - - public override bool GetIsEmpty(DbGeography geographyValue) - { - throw new System.NotImplementedException(); - } - - public override bool? GetIsRing(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - return mysqlValue.IsRing; - } - - public override bool GetIsSimple(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - return mysqlValue.IsSimple; - } - - public override bool GetIsValid(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - return mysqlValue.IsValid; - } - - public override double? GetLatitude(DbGeography geographyValue) - { - throw new NotImplementedException(); - } - - public override double? GetLength(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - return mysqlValue.Length; - } - - public override double? GetLength(DbGeography geographyValue) - { - throw new System.NotImplementedException(); - } - - public override double? GetLongitude(DbGeography geographyValue) - { - throw new NotImplementedException(); - } - - public override double? GetMeasure(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - return mysqlValue.Measure; - } - - public override double? GetMeasure(DbGeography geographyValue) - { - throw new System.NotImplementedException(); - } - - public override int? GetPointCount(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - return mysqlValue.PointCount; - } - - public override int? GetPointCount(DbGeography geographyValue) - { - throw new System.NotImplementedException(); - } - - public override DbGeometry GetPointOnSurface(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - return mysqlValue.PointOnSurface; - } - - public override string GetSpatialTypeName(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - return mysqlValue.SpatialTypeName; - } - - public override string GetSpatialTypeName(DbGeography geographyValue) - { - throw new System.NotImplementedException(); - } - - public override DbGeometry GetStartPoint(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - return mysqlValue.StartPoint; - } - - public override DbGeography GetStartPoint(DbGeography geographyValue) - { - throw new System.NotImplementedException(); - } - - public override double? GetXCoordinate(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var providerValue = new MySqlGeometry(); - MySqlGeometry.TryParse(geometryValue.ProviderValue.ToString(), out providerValue); - return providerValue.XCoordinate; - } - - public override double? GetYCoordinate(DbGeometry geometryValue) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var providerValue = new MySqlGeometry(); - MySqlGeometry.TryParse(geometryValue.ProviderValue.ToString(), out providerValue); - return providerValue.YCoordinate; - } - - public override DbGeometry InteriorRingAt(DbGeometry geometryValue, int index) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - return mysqlValue.InteriorRingAt(index); - } - - public override DbGeometry Intersection(DbGeometry geometryValue, DbGeometry otherGeometry) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - if (otherGeometry == null) - throw new ArgumentNullException("otherGeometry"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - var mysqlOtherValue = GeometryFromProviderValue(otherGeometry); - - return mysqlValue.Intersection(mysqlOtherValue); - } - - public override DbGeography Intersection(DbGeography geographyValue, DbGeography otherGeography) - { - throw new System.NotImplementedException(); - } - - public override bool Intersects(DbGeometry geometryValue, DbGeometry otherGeometry) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - if (otherGeometry == null) - throw new ArgumentNullException("otherGeometry"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - var mysqlOtherValue = GeometryFromProviderValue(otherGeometry); - - return mysqlValue.Intersects(mysqlOtherValue); - - } - - public override bool Intersects(DbGeography geographyValue, DbGeography otherGeography) - { - throw new System.NotImplementedException(); - } - - public override bool Overlaps(DbGeometry geometryValue, DbGeometry otherGeometry) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - if (otherGeometry == null) - throw new ArgumentNullException("otherGeometry"); - - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - var mysqlOtherValue = GeometryFromProviderValue(otherGeometry); - - return mysqlValue.Overlaps(mysqlOtherValue); - } - - public override DbGeometry PointAt(DbGeometry geometryValue, int index) - { - throw new System.NotImplementedException(); - } - - public override DbGeography PointAt(DbGeography geographyValue, int index) - { - throw new System.NotImplementedException(); - } - - public override bool Relate(DbGeometry geometryValue, DbGeometry otherGeometry, string matrix) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - if (otherGeometry == null) - throw new ArgumentNullException("otherGeometry"); - - if (String.IsNullOrEmpty(matrix)) - throw new ArgumentNullException("matrix"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - var mysqlOtherValue = GeometryFromProviderValue(otherGeometry); - - return mysqlValue.Relate(mysqlOtherValue, matrix); - } - - public override bool SpatialEquals(DbGeometry geometryValue, DbGeometry otherGeometry) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - if (otherGeometry == null) - throw new ArgumentNullException("otherGeometry"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - var mysqlOtherValue = GeometryFromProviderValue(otherGeometry); - - return mysqlValue.SpatialEquals(mysqlOtherValue); - } - - public override bool SpatialEquals(DbGeography geographyValue, DbGeography otherGeography) - { - throw new NotImplementedException(); - } - - public override DbGeometry SymmetricDifference(DbGeometry geometryValue, DbGeometry otherGeometry) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - if (otherGeometry == null) - throw new ArgumentNullException("otherGeometry"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - var mysqlOtherValue = GeometryFromProviderValue(otherGeometry); - - return mysqlValue.SymmetricDifference(mysqlOtherValue); - } - - public override DbGeography SymmetricDifference(DbGeography geographyValue, DbGeography otherGeography) - { - throw new System.NotImplementedException(); - } - - public override bool Touches(DbGeometry geometryValue, DbGeometry otherGeometry) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - if (otherGeometry == null) - throw new ArgumentNullException("otherGeometry"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - var mysqlOtherValue = GeometryFromProviderValue(otherGeometry); - - return mysqlValue.Touches(mysqlOtherValue); - } - - public override DbGeometry Union(DbGeometry geometryValue, DbGeometry otherGeometry) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - if (otherGeometry == null) - throw new ArgumentNullException("otherGeometry"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - - var mysqlOtherValue = GeometryFromProviderValue(otherGeometry); - - return mysqlValue.Union(mysqlOtherValue); - } - - public override DbGeography Union(DbGeography geographyValue, DbGeography otherGeography) - { - throw new System.NotImplementedException(); - } - - public override bool Within(DbGeometry geometryValue, DbGeometry otherGeometry) - { - if (geometryValue == null) - throw new ArgumentNullException("geometryValue"); - - if (otherGeometry == null) - throw new ArgumentNullException("otherGeometry"); - - var mysqlValue = GeometryFromProviderValue(geometryValue); - var mysqlOtherValue = GeometryFromProviderValue(otherGeometry); - return mysqlValue.Within(mysqlOtherValue); - } - - #endregion - } -} +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using MySql.Data.Types; +using MySql.Data.MySqlClient; +using System.Data.Entity.Spatial; + + +namespace MySql.Data.EntityFramework +{ + internal sealed class MySqlSpatialServices : DbSpatialServices + { + + internal static readonly MySqlSpatialServices Instance = new MySqlSpatialServices(); + + private MySqlSpatialServices() + { + } + + #region overriden methods + + public override byte[] AsBinary(DbGeography geographyValue) + { + throw new NotImplementedException(); + } + + public override byte[] AsBinary(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var providerValue = new MySqlGeometry(); + MySqlGeometry.TryParse(geometryValue.ProviderValue.ToString(), out providerValue); + + return providerValue.Value; + } + + public override string AsGml(DbGeometry geometryValue) + { + throw new NotImplementedException(); + } + + public override string AsGml(DbGeography geographyValue) + { + throw new NotImplementedException(); + } + + public override string AsText(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var providerValue = new MySqlGeometry(); + MySqlGeometry.TryParse(geometryValue.ProviderValue.ToString(), out providerValue); + + return providerValue.ToString(); + } + + public override string AsText(DbGeography geographyValue) + { + throw new NotImplementedException(); + } + + public override DbGeometry Buffer(DbGeometry geometryValue, double distance) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + DbGeometry mysqlValue = DbGeometry.FromText(geometryValue.ProviderValue.ToString()); + return mysqlValue.Buffer(distance); + } + + public override DbGeography Buffer(DbGeography geographyValue, double distance) + { + throw new NotImplementedException(); + } + + public override bool Contains(DbGeometry geometryValue, DbGeometry otherGeometry) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + if (otherGeometry == null) + throw new ArgumentNullException("otherGeometry"); + + DbGeometry mysqlValue = DbGeometry.FromText(geometryValue.ProviderValue.ToString()); + return mysqlValue.Contains(otherGeometry); + + } + + public override object CreateProviderValue(DbGeometryWellKnownValue wellKnownValue) + { + if (wellKnownValue == null) + throw new ArgumentNullException("wellKnownValue"); + + if (wellKnownValue.WellKnownText != null) + { + var mysqlGeometry = new MySqlGeometry(true); + MySqlGeometry.TryParse(wellKnownValue.WellKnownText.ToString(), out mysqlGeometry); + return mysqlGeometry; + } + else if (wellKnownValue.WellKnownBinary != null) + { + var mysqlGeometry = new MySqlGeometry(MySqlDbType.Geometry, wellKnownValue.WellKnownBinary); + return mysqlGeometry; + } + return null; + } + + public override object CreateProviderValue(DbGeographyWellKnownValue wellKnownValue) + { + throw new NotImplementedException(); + } + + public override DbGeometryWellKnownValue CreateWellKnownValue(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + return mysqlValue.WellKnownValue; + + } + + public override DbGeographyWellKnownValue CreateWellKnownValue(DbGeography geographyValue) + { + throw new NotImplementedException(); + } + + public override bool Crosses(DbGeometry geometryValue, DbGeometry otherGeometry) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + if (otherGeometry == null) + throw new ArgumentNullException("otherGeometry"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + var mysqlOtherValue = GeometryFromProviderValue(otherGeometry); + + return mysqlValue.Crosses(mysqlOtherValue); + } + + public override DbGeometry Difference(DbGeometry geometryValue, DbGeometry otherGeometry) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + if (otherGeometry == null) + throw new ArgumentNullException("otherGeometry"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + var mysqlOtherValue = GeometryFromProviderValue(otherGeometry); + + return mysqlValue.Difference(mysqlOtherValue); + + } + + public override DbGeography Difference(DbGeography geographyValue, DbGeography otherGeography) + { + throw new System.NotImplementedException(); + } + + public override bool Disjoint(DbGeometry geometryValue, DbGeometry otherGeometry) + { + throw new System.NotImplementedException(); + } + + public override bool Disjoint(DbGeography geographyValue, DbGeography otherGeography) + { + throw new System.NotImplementedException(); + } + + public override double Distance(DbGeometry geometryValue, DbGeometry otherGeometry) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + if (otherGeometry == null) + throw new ArgumentNullException("otherGeometry"); + + DbGeometry mysqlValue = DbGeometry.FromText(geometryValue.ProviderValue.ToString()); + + Double? result = mysqlValue.Distance(otherGeometry); + if (result != null) + return result.Value; + return 0; + } + + public override double Distance(DbGeography geographyValue, DbGeography otherGeography) + { + throw new NotImplementedException(); + } + + public override DbGeometry ElementAt(DbGeometry geometryValue, int index) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + return mysqlValue.ElementAt(index); + } + + public override DbGeography ElementAt(DbGeography geographyValue, int index) + { + throw new System.NotImplementedException(); + } + + public override DbGeography GeographyCollectionFromBinary(byte[] geographyCollectionWellKnownBinary, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeography GeographyCollectionFromText(string geographyCollectionWellKnownText, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeography GeographyFromBinary(byte[] wellKnownBinary, int coordinateSystemId) + { + throw new NotImplementedException(); + } + + public override DbGeography GeographyFromBinary(byte[] wellKnownBinary) + { + throw new System.NotImplementedException(); + } + + public override DbGeography GeographyFromGml(string geographyMarkup, int coordinateSystemId) + { + throw new NotImplementedException(); + } + + public override DbGeography GeographyFromGml(string geographyMarkup) + { + throw new System.NotImplementedException(); + } + + public override DbGeography GeographyFromProviderValue(object providerValue) + { + throw new NotImplementedException(); + } + + public override DbGeography GeographyFromText(string wellKnownText, int coordinateSystemId) + { + throw new NotImplementedException(); + } + + public override DbGeography GeographyFromText(string wellKnownText) + { + throw new NotImplementedException(); + } + + public override DbGeography GeographyLineFromBinary(byte[] lineWellKnownBinary, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeography GeographyLineFromText(string lineWellKnownText, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeography GeographyMultiLineFromBinary(byte[] multiLineWellKnownBinary, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeography GeographyMultiLineFromText(string multiLineWellKnownText, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeography GeographyMultiPointFromBinary(byte[] multiPointWellKnownBinary, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeography GeographyMultiPointFromText(string multiPointWellKnownText, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeography GeographyMultiPolygonFromBinary(byte[] multiPolygonWellKnownBinary, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeography GeographyMultiPolygonFromText(string multiPolygonWellKnownText, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeography GeographyPointFromBinary(byte[] pointWellKnownBinary, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeography GeographyPointFromText(string pointWellKnownText, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeography GeographyPolygonFromBinary(byte[] polygonWellKnownBinary, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeography GeographyPolygonFromText(string polygonWellKnownText, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeometry GeometryCollectionFromBinary(byte[] geometryCollectionWellKnownBinary, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeometry GeometryCollectionFromText(string geometryCollectionWellKnownText, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeometry GeometryFromBinary(byte[] wellKnownBinary, int coordinateSystemId) + { + if (wellKnownBinary == null) + throw new ArgumentNullException("wellKnownBinary"); + + DbGeometry mysqlValue = DbGeometry.FromBinary(wellKnownBinary, coordinateSystemId); + + return GeometryFromProviderValue(mysqlValue); + } + + public override DbGeometry GeometryFromBinary(byte[] wellKnownBinary) + { + if (wellKnownBinary == null) + throw new ArgumentNullException("wellKnownBinary"); + + DbGeometry mysqlValue = DbGeometry.FromBinary(wellKnownBinary); + + return GeometryFromProviderValue(mysqlValue); + } + + public override DbGeometry GeometryFromGml(string geometryMarkup, int coordinateSystemId) + { + throw new NotImplementedException(); + } + + public override DbGeometry GeometryFromGml(string geometryMarkup) + { + throw new System.NotImplementedException(); + } + + public override DbGeometry GeometryFromProviderValue(object providerValue) + { + if (providerValue == null) + throw new ArgumentNullException("provider value"); + + var myGeom = new MySqlGeometry(); + + if (MySqlGeometry.TryParse(providerValue.ToString(), out myGeom)) + return DbGeometry.FromText(myGeom.GetWKT(), myGeom.SRID.Value); + else + return null; + } + + public override DbGeometry GeometryFromText(string wellKnownText, int coordinateSystemId) + { + if (String.IsNullOrEmpty(wellKnownText)) + throw new ArgumentNullException("wellKnownText"); + + var geomValue = DbGeometry.FromText(wellKnownText, coordinateSystemId); + + var mysqlValue = GeometryFromProviderValue(geomValue); + + return mysqlValue; + } + + public override DbGeometry GeometryFromText(string wellKnownText) + { + if (String.IsNullOrEmpty(wellKnownText)) + throw new ArgumentNullException("wellKnownText"); + + var geomValue = DbGeometry.FromText(wellKnownText); + + var mysqlValue = GeometryFromProviderValue(geomValue); + + return mysqlValue; + + } + + public override DbGeometry GeometryLineFromBinary(byte[] lineWellKnownBinary, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeometry GeometryLineFromText(string lineWellKnownText, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeometry GeometryMultiLineFromBinary(byte[] multiLineWellKnownBinary, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeometry GeometryMultiLineFromText(string multiLineWellKnownText, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeometry GeometryMultiPointFromBinary(byte[] multiPointWellKnownBinary, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeometry GeometryMultiPointFromText(string multiPointWellKnownText, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeometry GeometryMultiPolygonFromBinary(byte[] multiPolygonWellKnownBinary, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeometry GeometryMultiPolygonFromText(string multiPolygonKnownText, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeometry GeometryPointFromBinary(byte[] pointWellKnownBinary, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeometry GeometryPointFromText(string pointWellKnownText, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeometry GeometryPolygonFromBinary(byte[] polygonWellKnownBinary, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override DbGeometry GeometryPolygonFromText(string polygonWellKnownText, int coordinateSystemId) + { + throw new System.NotImplementedException(); + } + + public override double? GetArea(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + return mysqlValue.Area; + } + + public override double? GetArea(DbGeography geographyValue) + { + throw new NotImplementedException(); + } + + public override DbGeometry GetBoundary(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + return mysqlValue.Boundary; + } + + public override DbGeometry GetCentroid(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + return mysqlValue.Centroid; + } + + public override DbGeometry GetConvexHull(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + return mysqlValue.ConvexHull; + } + + public override int GetCoordinateSystemId(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + return mysqlValue.CoordinateSystemId; + } + + public override int GetCoordinateSystemId(DbGeography geographyValue) + { + throw new NotImplementedException(); + } + + public override int GetDimension(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + return mysqlValue.Dimension; + } + + public override int GetDimension(DbGeography geographyValue) + { + throw new System.NotImplementedException(); + } + + public override int? GetElementCount(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + return mysqlValue.ElementCount; + } + + public override int? GetElementCount(DbGeography geographyValue) + { + throw new System.NotImplementedException(); + } + + public override double? GetElevation(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + return mysqlValue.Elevation; + } + + public override double? GetElevation(DbGeography geographyValue) + { + throw new System.NotImplementedException(); + } + + public override DbGeometry GetEndPoint(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + return mysqlValue.EndPoint; + } + + public override DbGeography GetEndPoint(DbGeography geographyValue) + { + throw new System.NotImplementedException(); + } + + public override DbGeometry GetEnvelope(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + return mysqlValue.Envelope; + } + + public override DbGeometry GetExteriorRing(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + return mysqlValue.ExteriorRing; + } + + public override int? GetInteriorRingCount(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + return mysqlValue.InteriorRingCount; + } + + public override bool? GetIsClosed(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + return mysqlValue.IsClosed; + } + + public override bool? GetIsClosed(DbGeography geographyValue) + { + throw new System.NotImplementedException(); + } + + public override bool GetIsEmpty(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + return mysqlValue.IsEmpty; + } + + public override bool GetIsEmpty(DbGeography geographyValue) + { + throw new System.NotImplementedException(); + } + + public override bool? GetIsRing(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + return mysqlValue.IsRing; + } + + public override bool GetIsSimple(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + return mysqlValue.IsSimple; + } + + public override bool GetIsValid(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + return mysqlValue.IsValid; + } + + public override double? GetLatitude(DbGeography geographyValue) + { + throw new NotImplementedException(); + } + + public override double? GetLength(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + return mysqlValue.Length; + } + + public override double? GetLength(DbGeography geographyValue) + { + throw new System.NotImplementedException(); + } + + public override double? GetLongitude(DbGeography geographyValue) + { + throw new NotImplementedException(); + } + + public override double? GetMeasure(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + return mysqlValue.Measure; + } + + public override double? GetMeasure(DbGeography geographyValue) + { + throw new System.NotImplementedException(); + } + + public override int? GetPointCount(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + return mysqlValue.PointCount; + } + + public override int? GetPointCount(DbGeography geographyValue) + { + throw new System.NotImplementedException(); + } + + public override DbGeometry GetPointOnSurface(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + return mysqlValue.PointOnSurface; + } + + public override string GetSpatialTypeName(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + return mysqlValue.SpatialTypeName; + } + + public override string GetSpatialTypeName(DbGeography geographyValue) + { + throw new System.NotImplementedException(); + } + + public override DbGeometry GetStartPoint(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + return mysqlValue.StartPoint; + } + + public override DbGeography GetStartPoint(DbGeography geographyValue) + { + throw new System.NotImplementedException(); + } + + public override double? GetXCoordinate(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var providerValue = new MySqlGeometry(); + MySqlGeometry.TryParse(geometryValue.ProviderValue.ToString(), out providerValue); + return providerValue.XCoordinate; + } + + public override double? GetYCoordinate(DbGeometry geometryValue) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var providerValue = new MySqlGeometry(); + MySqlGeometry.TryParse(geometryValue.ProviderValue.ToString(), out providerValue); + return providerValue.YCoordinate; + } + + public override DbGeometry InteriorRingAt(DbGeometry geometryValue, int index) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + return mysqlValue.InteriorRingAt(index); + } + + public override DbGeometry Intersection(DbGeometry geometryValue, DbGeometry otherGeometry) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + if (otherGeometry == null) + throw new ArgumentNullException("otherGeometry"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + var mysqlOtherValue = GeometryFromProviderValue(otherGeometry); + + return mysqlValue.Intersection(mysqlOtherValue); + } + + public override DbGeography Intersection(DbGeography geographyValue, DbGeography otherGeography) + { + throw new System.NotImplementedException(); + } + + public override bool Intersects(DbGeometry geometryValue, DbGeometry otherGeometry) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + if (otherGeometry == null) + throw new ArgumentNullException("otherGeometry"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + var mysqlOtherValue = GeometryFromProviderValue(otherGeometry); + + return mysqlValue.Intersects(mysqlOtherValue); + + } + + public override bool Intersects(DbGeography geographyValue, DbGeography otherGeography) + { + throw new System.NotImplementedException(); + } + + public override bool Overlaps(DbGeometry geometryValue, DbGeometry otherGeometry) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + if (otherGeometry == null) + throw new ArgumentNullException("otherGeometry"); + + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + var mysqlOtherValue = GeometryFromProviderValue(otherGeometry); + + return mysqlValue.Overlaps(mysqlOtherValue); + } + + public override DbGeometry PointAt(DbGeometry geometryValue, int index) + { + throw new System.NotImplementedException(); + } + + public override DbGeography PointAt(DbGeography geographyValue, int index) + { + throw new System.NotImplementedException(); + } + + public override bool Relate(DbGeometry geometryValue, DbGeometry otherGeometry, string matrix) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + if (otherGeometry == null) + throw new ArgumentNullException("otherGeometry"); + + if (String.IsNullOrEmpty(matrix)) + throw new ArgumentNullException("matrix"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + var mysqlOtherValue = GeometryFromProviderValue(otherGeometry); + + return mysqlValue.Relate(mysqlOtherValue, matrix); + } + + public override bool SpatialEquals(DbGeometry geometryValue, DbGeometry otherGeometry) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + if (otherGeometry == null) + throw new ArgumentNullException("otherGeometry"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + var mysqlOtherValue = GeometryFromProviderValue(otherGeometry); + + return mysqlValue.SpatialEquals(mysqlOtherValue); + } + + public override bool SpatialEquals(DbGeography geographyValue, DbGeography otherGeography) + { + throw new NotImplementedException(); + } + + public override DbGeometry SymmetricDifference(DbGeometry geometryValue, DbGeometry otherGeometry) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + if (otherGeometry == null) + throw new ArgumentNullException("otherGeometry"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + var mysqlOtherValue = GeometryFromProviderValue(otherGeometry); + + return mysqlValue.SymmetricDifference(mysqlOtherValue); + } + + public override DbGeography SymmetricDifference(DbGeography geographyValue, DbGeography otherGeography) + { + throw new System.NotImplementedException(); + } + + public override bool Touches(DbGeometry geometryValue, DbGeometry otherGeometry) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + if (otherGeometry == null) + throw new ArgumentNullException("otherGeometry"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + var mysqlOtherValue = GeometryFromProviderValue(otherGeometry); + + return mysqlValue.Touches(mysqlOtherValue); + } + + public override DbGeometry Union(DbGeometry geometryValue, DbGeometry otherGeometry) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + if (otherGeometry == null) + throw new ArgumentNullException("otherGeometry"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + + var mysqlOtherValue = GeometryFromProviderValue(otherGeometry); + + return mysqlValue.Union(mysqlOtherValue); + } + + public override DbGeography Union(DbGeography geographyValue, DbGeography otherGeography) + { + throw new System.NotImplementedException(); + } + + public override bool Within(DbGeometry geometryValue, DbGeometry otherGeometry) + { + if (geometryValue == null) + throw new ArgumentNullException("geometryValue"); + + if (otherGeometry == null) + throw new ArgumentNullException("otherGeometry"); + + var mysqlValue = GeometryFromProviderValue(geometryValue); + var mysqlOtherValue = GeometryFromProviderValue(otherGeometry); + return mysqlValue.Within(mysqlOtherValue); + } + + #endregion + } +} diff --git a/EntityFramework/src/Properties/AssemblyInfo.cs b/EntityFramework/src/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..b99934a90 --- /dev/null +++ b/EntityFramework/src/Properties/AssemblyInfo.cs @@ -0,0 +1,61 @@ +// Copyright © 2008, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Security; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System; + +// 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. +[assembly: AssemblyTitle("MySql.Data.EntityFramework")] +[assembly: AssemblyDescription("MySql.Data.EntityFramework adds support for cross-platform application deployment with the Entity Framework 6.4 version.")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Oracle Corporation")] +[assembly: AssemblyProduct("MySQL Connector/NET")] +[assembly: AssemblyCopyright("Copyright © 2008, 2025, Oracle and/or its affiliates.")] +[assembly: AssemblyTrademark("Oracle®, Java, MySQL, and NetSuite are registered trademarks of Oracle and/or its affiliates.")] +[assembly: AssemblyCulture("")] +[assembly: SecurityRules(SecurityRuleSet.Level1)] +[assembly: CLSCompliant(false)] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] +// The following GUID is for the ID of the typelib if this project is exposed to COM +// [assembly: Guid("540e7b3c-bd0b-4980-96d1-5d140d303f7e")] + + +[assembly: InternalsVisibleTo("MySql.EntityFramework.Basic.Tests, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] +[assembly: InternalsVisibleTo("MySql.EntityFramework.Migrations.Tests, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] + + + diff --git a/Source/MySql.Data.Entity.EF6/Properties/ProviderManifest.xml b/EntityFramework/src/Properties/ProviderManifest.xml similarity index 99% rename from Source/MySql.Data.Entity.EF6/Properties/ProviderManifest.xml rename to EntityFramework/src/Properties/ProviderManifest.xml index 8d55da9fc..31834644d 100644 --- a/Source/MySql.Data.Entity.EF6/Properties/ProviderManifest.xml +++ b/EntityFramework/src/Properties/ProviderManifest.xml @@ -1733,14 +1733,14 @@ PROCESS - - + + - + diff --git a/EntityFramework/src/Properties/Resources.Designer.cs b/EntityFramework/src/Properties/Resources.Designer.cs new file mode 100644 index 000000000..3dd3a9932 --- /dev/null +++ b/EntityFramework/src/Properties/Resources.Designer.cs @@ -0,0 +1,99 @@ +//------------------------------------------------------------------------------ +// +// 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 MySql.Data.EntityFramework.Properties { + 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", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 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("MySql.Data.EntityFramework.Properties.Resources", typeof(Resources).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 The connection parameter must reference an object of type MySql.Data.MySqlConnection. + /// + internal static string ConnectionMustBeOfTypeMySqlConnection { + get { + return ResourceManager.GetString("ConnectionMustBeOfTypeMySqlConnection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There is no store type corresponding to the EDM type '{0}' of primitive type '{1}'.. + /// + internal static string NoStoreTypeForEdmType { + get { + return ResourceManager.GetString("NoStoreTypeForEdmType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The underlying provider does not support the type '{0}'.. + /// + internal static string TypeNotSupported { + get { + return ResourceManager.GetString("TypeNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Result type of a function is expected to be a collection of RowType or PrimitiveType. + /// + internal static string WrongFunctionResultType { + get { + return ResourceManager.GetString("WrongFunctionResultType", resourceCulture); + } + } + } +} diff --git a/Source/MySql.Data.Entity.EF6/Properties/Resources.resx b/EntityFramework/src/Properties/Resources.resx similarity index 100% rename from Source/MySql.Data.Entity.EF6/Properties/Resources.resx rename to EntityFramework/src/Properties/Resources.resx diff --git a/Source/MySql.Data.Entity.EF6/Properties/SchemaDefinition-5.6.ssdl b/EntityFramework/src/Properties/SchemaDefinition-5.6.ssdl similarity index 100% rename from Source/MySql.Data.Entity.EF6/Properties/SchemaDefinition-5.6.ssdl rename to EntityFramework/src/Properties/SchemaDefinition-5.6.ssdl diff --git a/Source/MySql.Data.Entity.EF6/Properties/SchemaDefinition-5.7.ssdl b/EntityFramework/src/Properties/SchemaDefinition-5.7.ssdl similarity index 100% rename from Source/MySql.Data.Entity.EF6/Properties/SchemaDefinition-5.7.ssdl rename to EntityFramework/src/Properties/SchemaDefinition-5.7.ssdl diff --git a/EntityFramework/src/Properties/SchemaDefinition-8.0.ssdl b/EntityFramework/src/Properties/SchemaDefinition-8.0.ssdl new file mode 100644 index 000000000..1baf1d4ff --- /dev/null +++ b/EntityFramework/src/Properties/SchemaDefinition-8.0.ssdl @@ -0,0 +1,793 @@ + + + + + + + SELECT /* Tables */ + CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS `Id`, + TABLE_CATALOG AS `Catalog`, + TABLE_SCHEMA AS `Schema`, + TABLE_NAME AS `Name` + FROM INFORMATION_SCHEMA.TABLES + WHERE TABLE_TYPE = 'BASE TABLE' + AND TABLE_SCHEMA=schema() + + + + + + SELECT /* Table columns */ + CONCAT(TABLE_SCHEMA, '.', TABLE_NAME, '.', COLUMN_NAME) AS `Id`, + CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS `ParentId`, + COLUMN_NAME AS `Name`, + ORDINAL_POSITION AS `Ordinal`, + CASE IS_NULLABLE WHEN 'YES' THEN 1 ELSE 0 END AS `IsNullable`, + IF(LEFT(COLUMN_TYPE,10) = 'tinyint(1)', 'bool', + IF (LEFT(COLUMN_TYPE,10) = 'binary(16)' OR LEFT(COLUMN_TYPE,8) = 'char(36)', 'guid', + IF (INSTR(COLUMN_TYPE, 'unsigned') = 0, DATA_TYPE, + CONCAT('u', DATA_TYPE)))) AS `TypeName`, + IF (CHARACTER_MAXIMUM_LENGTH > 2147483647, 2147483647, CHARACTER_MAXIMUM_LENGTH) AS `MaxLength`, + CASE WHEN NUMERIC_PRECISION > 0 THEN CAST(NUMERIC_PRECISION AS CHAR) + WHEN DATETIME_PRECISION > 0 THEN CAST(DATETIME_PRECISION AS CHAR) + ELSE 0 + END AS `Precision`, + DATETIME_PRECISION AS `DateTimePrecision`, + NUMERIC_SCALE AS `Scale`, + NULL AS `CollationCatalog`, + NULL AS `CollationSchema`, + COLLATION_NAME AS `CollationName`, + NULL AS `CharacterSetCatalog`, + NULL AS `CharacterSetSchema`, + CHARACTER_SET_NAME AS `CharacterSetName`, + 0 AS `IsMultiSet`, + CASE WHEN COLUMN_DEFAULT LIKE 'CURRENT_TIMESTAMP' THEN 1 + WHEN EXTRA LIKE '%auto%' THEN 1 + ELSE 0 + END AS `IsIdentity`, + CASE WHEN COLUMN_DEFAULT LIKE 'CURRENT_TIMESTAMP' THEN 1 + WHEN EXTRA LIKE '%auto%' THEN 1 + ELSE 0 + END AS `IsStoreGenerated`, + COLUMN_DEFAULT AS `Default` + FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=schema() + + + + + + SELECT /* Views */ + CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS `Id`, + TABLE_CATALOG AS`CatalogName`, + TABLE_SCHEMA AS `SchemaName`, + TABLE_NAME AS `Name`, + VIEW_DEFINITION AS `ViewDefinition`, + CASE IS_UPDATABLE WHEN 'YES' THEN 1 ELSE 0 END AS `IsUpdatable` + FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA=schema() + + + + + + SELECT /* View columns */ + CONCAT(TABLE_SCHEMA, '.', TABLE_NAME, '.', COLUMN_NAME) AS `Id`, + CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS `ParentId`, + COLUMN_NAME AS `Name`, + ORDINAL_POSITION AS `Ordinal`, + CASE IS_NULLABLE WHEN 'YES' THEN 1 ELSE 0 END AS `IsNullable`, + IF(LEFT(COLUMN_TYPE,10) = 'tinyint(1)', 'bool', + IF (LEFT(COLUMN_TYPE,10) = 'binary(16)' OR LEFT(COLUMN_TYPE,8) = 'char(36)', 'guid', + IF (INSTR(COLUMN_TYPE, 'unsigned') = 0, DATA_TYPE, + CONCAT('u', DATA_TYPE)))) AS `TypeName`, + IF (CHARACTER_MAXIMUM_LENGTH > 2147483647, 2147483647, CHARACTER_MAXIMUM_LENGTH) AS `MaxLength`, + CASE WHEN NUMERIC_PRECISION > 0 THEN CAST(NUMERIC_PRECISION AS UNSIGNED INTEGER) + WHEN DATETIME_PRECISION > 0 THEN CAST(DATETIME_PRECISION AS UNSIGNED INTEGER) + ELSE 0 + END AS `Precision`, + 0 AS `DateTimePrecision`, + NUMERIC_SCALE AS `Scale`, + NULL AS `CollationCatalog`, + NULL AS `CollationSchema`, + COLLATION_NAME AS `CollationName`, + NULL AS `CharacterSetCatalog`, + NULL AS `CharacterSetSchema`, + CHARACTER_SET_NAME AS `CharacterSetName`, + 0 AS `IsMultiSet`, + CASE WHEN COLUMN_DEFAULT LIKE 'CURRENT_TIMESTAMP' THEN 1 + WHEN EXTRA LIKE '%auto%' THEN 1 + ELSE 0 + END AS `IsIdentity`, + CASE WHEN COLUMN_DEFAULT LIKE 'CURRENT_TIMESTAMP' THEN 1 + WHEN EXTRA LIKE '%auto%' THEN 1 + ELSE 0 + END AS `IsStoreGenerated`, + COLUMN_DEFAULT AS `Default` + FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=schema() + + + + + + SELECT /* Functions */ + CONCAT(ROUTINE_SCHEMA, '.', SPECIFIC_NAME) AS `Id`, + ROUTINE_CATALOG AS `CatalogName`, + ROUTINE_SCHEMA AS `SchemaName`, + ROUTINE_NAME AS `Name`, + SUBSTRING_INDEX(DTD_IDENTIFIER, '(', 1) AS `ReturnTypeName`, + NULL AS `ReturnMaxLength`, + NULL AS `ReturnPrecision`, + 0 AS `ReturnDateTimePrecision`, + NULL AS `ReturnScale`, + NULL AS `ReturnCollationCatalog`, + NULL AS `ReturnCollationSchema`, + NULL AS `ReturnCollationName`, + NULL AS `ReturnCharacterSetCatalog`, + NULL AS `ReturnCharacterSetSchema`, + NULL AS `ReturnCharacterSetName`, + NULL AS `ReturnIsMultiSet`, + NULL AS `IsAggregate`, + NULL AS `IsBuiltIn`, + NULL AS `IsNiladic` + FROM INFORMATION_SCHEMA.ROUTINES + WHERE ROUTINE_TYPE='FUNCTION' + AND ROUTINE_SCHEMA=schema() + + + + + + SELECT /* Procedures */ + CONCAT(ROUTINE_SCHEMA, '.', SPECIFIC_NAME) AS `Id`, + ROUTINE_CATALOG AS `CatalogName`, + ROUTINE_SCHEMA AS `SchemaName`, + ROUTINE_NAME AS `Name` + FROM INFORMATION_SCHEMA.ROUTINES + WHERE ROUTINE_TYPE='PROCEDURE' + AND ROUTINE_SCHEMA=schema() + + + + + + SELECT + CONCAT(f.SPECIFIC_SCHEMA, '.', f.SPECIFIC_NAME, '.', f.PARAMETER_NAME) AS `Id`, + CONCAT(f.SPECIFIC_SCHEMA, '.', f.SPECIFIC_NAME) AS `ParentId`, + f.PARAMETER_NAME AS `Name`, + f.ORDINAL_POSITION `Ordinal`, + f.DATA_TYPE AS `TypeName`, + f.CHARACTER_MAXIMUM_LENGTH AS `MaxLength`, + f.NUMERIC_PRECISION AS`Precision`, + NULL AS `DateTimePrecision`, + f.NUMERIC_SCALE AS `Scale`, + NULL AS `CollationCatalog`, + NULL AS `CollationSchema`, + f.COLLATION_NAME AS `CollationName`, + NULL AS `CharacterSetCatalog`, + NULL AS `CharacterSetSchema`, + f.CHARACTER_SET_NAME AS `CharacterSetName`, + CAST(0 as decimal(0,0)) AS `IsMultiSet`, + f.PARAMETER_MODE AS `Mode`, + NULL AS `Default` + FROM + INFORMATION_SCHEMA.PARAMETERS f + INNER JOIN INFORMATION_SCHEMA.ROUTINES r ON + f.SPECIFIC_SCHEMA = r.ROUTINE_SCHEMA AND + f.SPECIFIC_NAME = r.SPECIFIC_NAME AND + r.ROUTINE_TYPE = 'FUNCTION' + WHERE + r.ROUTINE_SCHEMA=schema() AND f.ORDINAL_POSITION > 0 + + + + + + SELECT + CONCAT(f.SPECIFIC_SCHEMA, '.', f.SPECIFIC_NAME, '.', f.PARAMETER_NAME) AS `Id`, + CONCAT(f.SPECIFIC_SCHEMA, '.', f.SPECIFIC_NAME) COLLATE utf8_tolower_ci AS `ParentId`, + f.PARAMETER_NAME AS `Name`, + f.ORDINAL_POSITION `Ordinal`, + f.DATA_TYPE AS `TypeName`, + f.CHARACTER_MAXIMUM_LENGTH AS `MaxLength`, + f.NUMERIC_PRECISION AS`Precision`, + NULL AS `DateTimePrecision`, + f.NUMERIC_SCALE AS `Scale`, + NULL AS `CollationCatalog`, + NULL AS `CollationSchema`, + f.COLLATION_NAME AS `CollationName`, + NULL AS `CharacterSetCatalog`, + NULL AS `CharacterSetSchema`, + f.CHARACTER_SET_NAME AS `CharacterSetName`, + CAST(0 as decimal(0,0)) AS `IsMultiSet`, + f.PARAMETER_MODE AS `Mode`, + NULL AS `Default` + FROM + INFORMATION_SCHEMA.PARAMETERS f + INNER JOIN INFORMATION_SCHEMA.ROUTINES r ON + f.SPECIFIC_SCHEMA = r.ROUTINE_SCHEMA AND + f.SPECIFIC_NAME = r.SPECIFIC_NAME AND + r.ROUTINE_TYPE = 'PROCEDURE' + WHERE + r.ROUTINE_SCHEMA=schema() AND f.ORDINAL_POSITION > 0 + + + + + + SELECT /* Constraints */ + CONCAT(CONSTRAINT_SCHEMA, '.', TABLE_NAME, '.', CONSTRAINT_NAME) AS `Id`, + CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS `ParentId`, + CONSTRAINT_NAME AS `Name`, + CONSTRAINT_TYPE AS `ConstraintType`, + 0 AS `IsDeferrable`, + 0 AS `IsInitiallyDeferred` + FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS + WHERE CONSTRAINT_TYPE != 'CHECK' AND TABLE_SCHEMA=schema() + + + + + + SELECT /* Check constraints */ + NULL AS `Id`, + NULL AS `Expression` + + + + + + SELECT /* Constraint columns */ + CONCAT(CONSTRAINT_SCHEMA, '.', TABLE_NAME, '.', CONSTRAINT_NAME) AS `ConstraintId`, + CONCAT(TABLE_SCHEMA, '.', TABLE_NAME, '.', COLUMN_NAME) AS `ColumnId` + FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA=schema() + + + + + + + + SELECT + CONCAT(CONSTRAINT_SCHEMA, '.', TABLE_NAME, '.', CONSTRAINT_NAME) AS `Id`, + UPDATE_RULE AS `UpdateRule`, + DELETE_RULE AS `DeleteRule` + FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS + + + + + + SELECT + CONCAT(FC.CONSTRAINT_SCHEMA, '.', FC.CONSTRAINT_NAME, '.', FC.ORDINAL_POSITION) AS `Id`, + CONCAT(PC.TABLE_SCHEMA, '.', PC.TABLE_NAME, '.', PC.COLUMN_NAME) AS `ToColumnId`, + CONCAT(FC.TABLE_SCHEMA, '.', FC.TABLE_NAME, '.', FC.COLUMN_NAME) AS `FromColumnId`, + CONCAT(FC.CONSTRAINT_SCHEMA, '.', FC.TABLE_NAME, '.', FC.CONSTRAINT_NAME) AS `ConstraintId`, + FC.ORDINAL_POSITION AS `Ordinal` + FROM + INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC + INNER JOIN + INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS PC /* PRIMARY KEY COLS*/ + ON RC.UNIQUE_CONSTRAINT_SCHEMA = PC.CONSTRAINT_SCHEMA + AND RC.UNIQUE_CONSTRAINT_NAME = PC.CONSTRAINT_NAME + AND RC.REFERENCED_TABLE_NAME = PC.TABLE_NAME + INNER JOIN + INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS FC /* FOREIGN KEY COLS*/ + ON RC.CONSTRAINT_SCHEMA = FC.CONSTRAINT_SCHEMA + AND RC.CONSTRAINT_NAME = FC.CONSTRAINT_NAME + AND RC.TABLE_NAME = FC.TABLE_NAME + AND PC.ORDINAL_POSITION = FC.ORDINAL_POSITION + + + + + + + + + SELECT /* View constraints */ + CONCAT(_utf8'' COLLATE utf8_tolower_ci, NULL) AS `Id`, + NULL AS `ParentId`, + NULL AS `Name`, + NULL AS `ConstraintType`, + NULL AS `Expression`, + NULL AS `UpdateRule`, + NULL AS `DeleteRule` + + + + + + SELECT /* View constraint columns */ + NULL AS `ConstraintId`, + NULL AS `ColumnId` + + + + + + SELECT /* View foreign keys */ + NULL AS `Id`, + NULL AS `ToColumnId`, + NULL AS `FromColumnId`, + NULL AS `ConstraintId`, + 0 AS `Ordinal` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/MySql.Data.Entity.EF6/Properties/SchemaMapping.msl b/EntityFramework/src/Properties/SchemaMapping.msl similarity index 100% rename from Source/MySql.Data.Entity.EF6/Properties/SchemaMapping.msl rename to EntityFramework/src/Properties/SchemaMapping.msl diff --git a/EntityFramework/src/Properties/VersionInfo.cs b/EntityFramework/src/Properties/VersionInfo.cs new file mode 100644 index 000000000..e577111b1 --- /dev/null +++ b/EntityFramework/src/Properties/VersionInfo.cs @@ -0,0 +1,46 @@ +// Copyright © 2024, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Reflection; +using System.Resources; + +// +// 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 Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("9.4.0")] +[assembly: AssemblyInformationalVersion("9.4.0.0")] +[assembly: AssemblyFileVersion("9.4.0.0")] +[assembly: NeutralResourcesLanguage("en-US")] diff --git a/Source/MySql.Data.Entity.EF6/ProviderManifest.cs b/EntityFramework/src/ProviderManifest.cs similarity index 86% rename from Source/MySql.Data.Entity.EF6/ProviderManifest.cs rename to EntityFramework/src/ProviderManifest.cs index ad75174fe..e2cf1a83a 100644 --- a/Source/MySql.Data.Entity.EF6/ProviderManifest.cs +++ b/EntityFramework/src/ProviderManifest.cs @@ -1,335 +1,335 @@ -// Copyright © 2008, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.IO; -using System.Reflection; -using System.Data; -using System.Xml; -using System.Data.Common; -using System.Diagnostics; -using System.Globalization; -using System.Text; -using System.Data.Entity.Core; -using System.Data.Entity.Core.Common; -using System.Data.Entity.Core.Metadata.Edm; - - -namespace MySql.Data.MySqlClient -{ - internal class MySqlProviderManifest : DbXmlEnabledProviderManifest - { - string manifestToken; - - internal const char LikeEscapeChar = '\u005c'; - internal const string LikeEscapeCharToString = "\u005c"; - - public MySqlProviderManifest(string version) - : base(GetManifest()) - { - manifestToken = version; - } - - private static XmlReader GetManifest() - { - return GetXmlResource("MySql.Data.Entity.Properties.ProviderManifest.xml"); - } - - protected override XmlReader GetDbInformation(string informationType) - { - if (informationType == DbProviderManifest.StoreSchemaDefinition) - { - return GetStoreSchemaDescription(); - } - - if (informationType == DbProviderManifest.StoreSchemaMapping) - { - return GetStoreSchemaMapping(); - } - - throw new ProviderIncompatibleException(String.Format("The provider returned null for the informationType '{0}'.", informationType)); - } - - private XmlReader GetStoreSchemaMapping() - { - return GetMappingResource("SchemaMapping.msl"); - } - - private XmlReader GetStoreSchemaDescription() - { - double version = double.Parse(manifestToken, CultureInfo.InvariantCulture); - - if (version < 5.0) throw new NotSupportedException("Your version of MySQL is not currently supported"); - if (version < 5.1) return GetMappingResource("SchemaDefinition-5.0.ssdl"); - if (version < 5.5) return GetMappingResource("SchemaDefinition-5.1.ssdl"); - if (version < 5.6) return GetMappingResource("SchemaDefinition-5.5.ssdl"); - if (version < 5.7) return GetMappingResource("SchemaDefinition-5.6.ssdl"); - return GetMappingResource("SchemaDefinition-5.7.ssdl"); - } - - public override TypeUsage GetEdmType(TypeUsage storeType) - { - if (storeType == null) - { - throw new ArgumentNullException("storeType"); - } - - string storeTypeName = storeType.EdmType.Name.ToLowerInvariant(); - - if (!base.StoreTypeNameToEdmPrimitiveType.ContainsKey(storeTypeName)) - { - throw new ArgumentException(String.Format("The underlying provider does not support the type '{0}'.", storeTypeName)); - } - - PrimitiveType edmPrimitiveType = base.StoreTypeNameToEdmPrimitiveType[storeTypeName]; - - if (edmPrimitiveType.PrimitiveTypeKind == PrimitiveTypeKind.Binary) - { - return TypeUsage.CreateBinaryTypeUsage(edmPrimitiveType, false); - } - - if (edmPrimitiveType.PrimitiveTypeKind == PrimitiveTypeKind.String) - { - Facet facet; - if (storeType.Facets.TryGetValue("MaxLength", false, out facet) && !facet.IsUnbounded && facet.Value != null) - return TypeUsage.CreateStringTypeUsage(edmPrimitiveType, false, false, (int)facet.Value); - else - return TypeUsage.CreateStringTypeUsage(edmPrimitiveType, false, false); - } - - return TypeUsage.CreateDefaultTypeUsage(edmPrimitiveType); - } - - private const int CHAR_MAXLEN = 255; - private const int VARCHAR_MAXLEN = 65535; - private const int MEDIUMTEXT_MAXLEN = 16777215; - private const int LONGTEXT_MAXLEN = 1073741823; - - private const int BINARY_MAXLEN = 255; - private const int VARBINARY_MAXLEN = 65535; - private const int MEDIUMBLOB_MAXLEN = 16777215; - private const int LONGBLOB_MAXLEN = 2147483647; - - internal const int DEFAULT_DECIMAL_PRECISION = 10; - internal const int DEFAULT_DECIMAL_SCALE = 2; - - public override TypeUsage GetStoreType(TypeUsage edmType) - { - if (edmType == null) - throw new ArgumentNullException("edmType"); - - Debug.Assert(edmType.EdmType.BuiltInTypeKind == BuiltInTypeKind.PrimitiveType); - - PrimitiveType primitiveType = edmType.EdmType as PrimitiveType; - if (primitiveType == null) - throw new ArgumentException(String.Format(Entity.Properties.Resources.TypeNotSupported, edmType)); - - ReadOnlyMetadataCollection facets = edmType.Facets; - - switch (primitiveType.PrimitiveTypeKind) - { - case PrimitiveTypeKind.Boolean: - return TypeUsage.CreateDefaultTypeUsage(StoreTypeNameToStorePrimitiveType["bool"]); - - case PrimitiveTypeKind.Byte: - return TypeUsage.CreateDefaultTypeUsage(StoreTypeNameToStorePrimitiveType["utinyint"]); - - case PrimitiveTypeKind.SByte: - return TypeUsage.CreateDefaultTypeUsage(StoreTypeNameToStorePrimitiveType["tinyint"]); - - case PrimitiveTypeKind.Int16: - return TypeUsage.CreateDefaultTypeUsage(StoreTypeNameToStorePrimitiveType["smallint"]); - - case PrimitiveTypeKind.Int32: - return TypeUsage.CreateDefaultTypeUsage(StoreTypeNameToStorePrimitiveType["int"]); - - case PrimitiveTypeKind.Int64: - return TypeUsage.CreateDefaultTypeUsage(StoreTypeNameToStorePrimitiveType["bigint"]); - - case PrimitiveTypeKind.Guid: - return TypeUsage.CreateDefaultTypeUsage(StoreTypeNameToStorePrimitiveType["guid"]); - - case PrimitiveTypeKind.Double: - return TypeUsage.CreateDefaultTypeUsage(StoreTypeNameToStorePrimitiveType["double"]); - - case PrimitiveTypeKind.Single: - return TypeUsage.CreateDefaultTypeUsage(StoreTypeNameToStorePrimitiveType["float"]); - - case PrimitiveTypeKind.Decimal: - { - byte precision = DEFAULT_DECIMAL_PRECISION; - byte scale = DEFAULT_DECIMAL_SCALE; - Facet facet; - - if (edmType.Facets.TryGetValue("Precision", false, out facet)) - { - if (!facet.IsUnbounded && facet.Value != null) - precision = (byte)facet.Value; - } - - if (edmType.Facets.TryGetValue("Scale", false, out facet)) - { - if (!facet.IsUnbounded && facet.Value != null ) - scale = (byte)facet.Value; - } - - return TypeUsage.CreateDecimalTypeUsage(StoreTypeNameToStorePrimitiveType["decimal"], precision, scale); - } - - case PrimitiveTypeKind.Binary: - { - bool isFixedLength = null != facets["FixedLength"].Value && (bool)facets["FixedLength"].Value; - Facet f = facets["MaxLength"]; - bool isMaxLength = f.IsUnbounded || null == f.Value || (int)f.Value > MEDIUMBLOB_MAXLEN; - int maxLength = !isMaxLength ? (int)f.Value : LONGBLOB_MAXLEN; - - string typeName = String.Empty; - - // now this applies for both isFixedLength and !isFixedLength - if (maxLength < CHAR_MAXLEN) typeName = "tinyblob"; - else if (maxLength < MEDIUMBLOB_MAXLEN) typeName = "blob"; - else if (maxLength < LONGTEXT_MAXLEN) typeName = "mediumblob"; - else typeName = "longblob"; - - return TypeUsage.CreateBinaryTypeUsage(StoreTypeNameToStorePrimitiveType[typeName], isFixedLength, maxLength); - } - - case PrimitiveTypeKind.String: - { - string typeName = String.Empty; - bool isUnicode = null != facets["Unicode"].Value && (bool)facets["Unicode"].Value; - bool isFixedLength = null != facets["FixedLength"].Value && (bool)facets["FixedLength"].Value; - int maxLenghtValue; - - Facet maxLengthFacet = facets["MaxLength"]; - if (isFixedLength) - { - typeName = isUnicode ? "nchar" : "char"; - if (maxLengthFacet.Value != null && Int32.TryParse(maxLengthFacet.Value.ToString(), out maxLenghtValue) && maxLenghtValue <= CHAR_MAXLEN) - return TypeUsage.CreateStringTypeUsage(StoreTypeNameToStorePrimitiveType[typeName], isUnicode, isFixedLength, (int)maxLengthFacet.Value); - else if (maxLengthFacet.Value != null && maxLengthFacet.Value.ToString() == "Max") - return TypeUsage.CreateStringTypeUsage(StoreTypeNameToStorePrimitiveType[typeName], isUnicode, isFixedLength, CHAR_MAXLEN); - else - return TypeUsage.CreateStringTypeUsage(StoreTypeNameToStorePrimitiveType[typeName], isUnicode, isFixedLength); - } - else - { - typeName = isUnicode ? "nvarchar" : "varchar"; - if (maxLengthFacet.Value != null && Int32.TryParse(maxLengthFacet.Value.ToString(), out maxLenghtValue)) - { - if (maxLenghtValue > VARCHAR_MAXLEN && maxLenghtValue <= MEDIUMTEXT_MAXLEN) typeName = "mediumtext"; - else if ((int)maxLengthFacet.Value > MEDIUMTEXT_MAXLEN) typeName = "longtext"; - return TypeUsage.CreateStringTypeUsage(StoreTypeNameToStorePrimitiveType[typeName], isUnicode, isFixedLength, (int)maxLengthFacet.Value); - } - else - return TypeUsage.CreateStringTypeUsage(StoreTypeNameToStorePrimitiveType["longtext"], isUnicode, isFixedLength, LONGBLOB_MAXLEN); - } - } - - case PrimitiveTypeKind.DateTimeOffset: - return TypeUsage.CreateDefaultTypeUsage(StoreTypeNameToStorePrimitiveType["timestamp"]); - case PrimitiveTypeKind.DateTime: - return TypeUsage.CreateDefaultTypeUsage(StoreTypeNameToStorePrimitiveType["datetime"]); - case PrimitiveTypeKind.Time: - return TypeUsage.CreateDefaultTypeUsage(StoreTypeNameToStorePrimitiveType["time"]); - case PrimitiveTypeKind.Geometry: - return TypeUsage.CreateDefaultTypeUsage(StoreTypeNameToStorePrimitiveType["geometry"]); - default: - throw new NotSupportedException(String.Format(Entity.Properties.Resources.NoStoreTypeForEdmType, edmType, primitiveType.PrimitiveTypeKind)); - } - } - - private static XmlReader GetXmlResource(string resourceName) - { - Assembly executingAssembly = Assembly.GetExecutingAssembly(); - Stream stream = executingAssembly.GetManifestResourceStream(resourceName); - return XmlReader.Create(stream); - } - - private static XmlReader GetMappingResource(string resourceBaseName) - { - string rez = GetResourceAsString( - String.Format("MySql.Data.Entity.Properties.{0}", resourceBaseName)); - - StringReader sr = new StringReader(rez); - return XmlReader.Create(sr); - - } - - private static string GetResourceAsString(string resourceName) - { - Assembly executingAssembly = Assembly.GetExecutingAssembly(); - Stream s = executingAssembly.GetManifestResourceStream(resourceName); - StreamReader sr = new StreamReader(s); - string resourceAsString = sr.ReadToEnd(); - sr.Close(); - s.Close(); - return resourceAsString; - } - - #if NET_40_OR_GREATER - public override bool SupportsEscapingLikeArgument(out char escapeCharacter) - { - escapeCharacter = LikeEscapeChar; - return true; - } - - public override string EscapeLikeArgument(string argument) - { - - bool usedEscapeCharacter; - return EscapeLikeArgument(argument, out usedEscapeCharacter); - } -#endif - - internal static string EscapeLikeArgument(string argument, out bool usedEscapeChar) - { - usedEscapeChar = false; - if (argument == null) - return string.Empty; - - if (!(argument.Contains("%") || argument.Contains("_") || argument.Contains(LikeEscapeCharToString))) - { - return argument; - } - var sb = new StringBuilder(argument.Length); - foreach (var c in argument) - { - if (c == '%' || c == '_' || c == LikeEscapeChar) - { - sb.Append(LikeEscapeChar); - usedEscapeChar = true; - } - sb.Append(c); - } - return sb.ToString(); - } - - -#if EF6 - public override bool SupportsInExpression() - { - return true; - } -#endif - } -} +// Copyright © 2008, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.IO; +using System.Reflection; +using System.Xml; +using System.Diagnostics; +using System.Globalization; +using System.Text; +using System.Data.Entity.Core; +using System.Data.Entity.Core.Common; +using System.Data.Entity.Core.Metadata.Edm; + + +namespace MySql.Data.MySqlClient +{ + internal class MySqlProviderManifest : DbXmlEnabledProviderManifest + { + string manifestToken; + + internal const char LikeEscapeChar = '\u005c'; + internal const string LikeEscapeCharToString = "\u005c"; + + public MySqlProviderManifest(string version) + : base(GetManifest()) + { + manifestToken = version; + } + + private static XmlReader GetManifest() + { + return GetXmlResource("MySql.Data.EntityFramework.Properties.ProviderManifest.xml"); + } + + protected override XmlReader GetDbInformation(string informationType) + { + if (informationType == DbProviderManifest.StoreSchemaDefinition) + { + return GetStoreSchemaDescription(); + } + + if (informationType == DbProviderManifest.StoreSchemaMapping) + { + return GetStoreSchemaMapping(); + } + + throw new ProviderIncompatibleException(String.Format("The provider returned null for the informationType '{0}'.", informationType)); + } + + private XmlReader GetStoreSchemaMapping() + { + return GetMappingResource("SchemaMapping.msl"); + } + + private XmlReader GetStoreSchemaDescription() + { + double version = double.Parse(manifestToken, CultureInfo.InvariantCulture); + + if (version < 5.0) throw new NotSupportedException("Your version of MySQL is not currently supported"); + if (version < 5.1) return GetMappingResource("SchemaDefinition-5.0.ssdl"); + if (version < 5.5) return GetMappingResource("SchemaDefinition-5.1.ssdl"); + if (version < 5.6) return GetMappingResource("SchemaDefinition-5.5.ssdl"); + if (version < 5.7) return GetMappingResource("SchemaDefinition-5.6.ssdl"); + if (version < 8.0) return GetMappingResource("SchemaDefinition-5.7.ssdl"); + return GetMappingResource("SchemaDefinition-8.0.ssdl"); + } + + public override TypeUsage GetEdmType(TypeUsage storeType) + { + if (storeType == null) + { + throw new ArgumentNullException("storeType"); + } + + string storeTypeName = storeType.EdmType.Name.ToLowerInvariant(); + + if (!base.StoreTypeNameToEdmPrimitiveType.ContainsKey(storeTypeName)) + { + throw new ArgumentException(String.Format("The underlying provider does not support the type '{0}'.", storeTypeName)); + } + + PrimitiveType edmPrimitiveType = base.StoreTypeNameToEdmPrimitiveType[storeTypeName]; + + if (edmPrimitiveType.PrimitiveTypeKind == PrimitiveTypeKind.Binary) + { + return TypeUsage.CreateBinaryTypeUsage(edmPrimitiveType, false); + } + + if (edmPrimitiveType.PrimitiveTypeKind == PrimitiveTypeKind.String) + { + Facet facet; + if (storeType.Facets.TryGetValue("MaxLength", false, out facet) && !facet.IsUnbounded && facet.Value != null) + return TypeUsage.CreateStringTypeUsage(edmPrimitiveType, false, false, (int)facet.Value); + else + return TypeUsage.CreateStringTypeUsage(edmPrimitiveType, false, false); + } + + return TypeUsage.CreateDefaultTypeUsage(edmPrimitiveType); + } + + private const int CHAR_MAXLEN = 255; + private const int VARCHAR_MAXLEN = 65535; + private const int MEDIUMTEXT_MAXLEN = 16777215; + private const int LONGTEXT_MAXLEN = 1073741823; + + private const int BINARY_MAXLEN = 255; + private const int VARBINARY_MAXLEN = 65535; + private const int MEDIUMBLOB_MAXLEN = 16777215; + private const int LONGBLOB_MAXLEN = 2147483647; + + internal const int DEFAULT_DECIMAL_PRECISION = 10; + internal const int DEFAULT_DECIMAL_SCALE = 2; + + public override TypeUsage GetStoreType(TypeUsage edmType) + { + if (edmType == null) + throw new ArgumentNullException("edmType"); + + Debug.Assert(edmType.EdmType.BuiltInTypeKind == BuiltInTypeKind.PrimitiveType); + + PrimitiveType primitiveType = edmType.EdmType as PrimitiveType; + if (primitiveType == null) + throw new ArgumentException(String.Format(EntityFramework.Properties.Resources.TypeNotSupported, edmType)); + + ReadOnlyMetadataCollection facets = edmType.Facets; + + switch (primitiveType.PrimitiveTypeKind) + { + case PrimitiveTypeKind.Boolean: + return TypeUsage.CreateDefaultTypeUsage(StoreTypeNameToStorePrimitiveType["bool"]); + + case PrimitiveTypeKind.Byte: + return TypeUsage.CreateDefaultTypeUsage(StoreTypeNameToStorePrimitiveType["utinyint"]); + + case PrimitiveTypeKind.SByte: + return TypeUsage.CreateDefaultTypeUsage(StoreTypeNameToStorePrimitiveType["tinyint"]); + + case PrimitiveTypeKind.Int16: + return TypeUsage.CreateDefaultTypeUsage(StoreTypeNameToStorePrimitiveType["smallint"]); + + case PrimitiveTypeKind.Int32: + return TypeUsage.CreateDefaultTypeUsage(StoreTypeNameToStorePrimitiveType["int"]); + + case PrimitiveTypeKind.Int64: + return TypeUsage.CreateDefaultTypeUsage(StoreTypeNameToStorePrimitiveType["bigint"]); + + case PrimitiveTypeKind.Guid: + return TypeUsage.CreateDefaultTypeUsage(StoreTypeNameToStorePrimitiveType["guid"]); + + case PrimitiveTypeKind.Double: + return TypeUsage.CreateDefaultTypeUsage(StoreTypeNameToStorePrimitiveType["double"]); + + case PrimitiveTypeKind.Single: + return TypeUsage.CreateDefaultTypeUsage(StoreTypeNameToStorePrimitiveType["float"]); + + case PrimitiveTypeKind.Decimal: + { + byte precision = DEFAULT_DECIMAL_PRECISION; + byte scale = DEFAULT_DECIMAL_SCALE; + Facet facet; + + if (edmType.Facets.TryGetValue("Precision", false, out facet)) + { + if (!facet.IsUnbounded && facet.Value != null) + precision = (byte)facet.Value; + } + + if (edmType.Facets.TryGetValue("Scale", false, out facet)) + { + if (!facet.IsUnbounded && facet.Value != null ) + scale = (byte)facet.Value; + } + + return TypeUsage.CreateDecimalTypeUsage(StoreTypeNameToStorePrimitiveType["decimal"], precision, scale); + } + + case PrimitiveTypeKind.Binary: + { + bool isFixedLength = null != facets["FixedLength"].Value && (bool)facets["FixedLength"].Value; + Facet f = facets["MaxLength"]; + bool isMaxLength = f.IsUnbounded || null == f.Value || (int)f.Value > MEDIUMBLOB_MAXLEN; + int maxLength = !isMaxLength ? (int)f.Value : LONGBLOB_MAXLEN; + + string typeName = String.Empty; + + // now this applies for both isFixedLength and !isFixedLength + if (maxLength < CHAR_MAXLEN) typeName = "tinyblob"; + else if (maxLength < MEDIUMBLOB_MAXLEN) typeName = "blob"; + else if (maxLength < LONGTEXT_MAXLEN) typeName = "mediumblob"; + else typeName = "longblob"; + + return TypeUsage.CreateBinaryTypeUsage(StoreTypeNameToStorePrimitiveType[typeName], isFixedLength, maxLength); + } + + case PrimitiveTypeKind.String: + { + string typeName = String.Empty; + bool isUnicode = null != facets["Unicode"].Value && (bool)facets["Unicode"].Value; + bool isFixedLength = null != facets["FixedLength"].Value && (bool)facets["FixedLength"].Value; + int maxLenghtValue; + + Facet maxLengthFacet = facets["MaxLength"]; + if (isFixedLength) + { + typeName = isUnicode ? "nchar" : "char"; + if (maxLengthFacet.Value != null && Int32.TryParse(maxLengthFacet.Value.ToString(), out maxLenghtValue) && maxLenghtValue <= CHAR_MAXLEN) + return TypeUsage.CreateStringTypeUsage(StoreTypeNameToStorePrimitiveType[typeName], isUnicode, isFixedLength, (int)maxLengthFacet.Value); + else if (maxLengthFacet.Value != null && maxLengthFacet.Value.ToString() == "Max") + return TypeUsage.CreateStringTypeUsage(StoreTypeNameToStorePrimitiveType[typeName], isUnicode, isFixedLength, CHAR_MAXLEN); + else + return TypeUsage.CreateStringTypeUsage(StoreTypeNameToStorePrimitiveType[typeName], isUnicode, isFixedLength); + } + else + { + typeName = isUnicode ? "nvarchar" : "varchar"; + if (maxLengthFacet.Value != null && Int32.TryParse(maxLengthFacet.Value.ToString(), out maxLenghtValue)) + { + if (maxLenghtValue > VARCHAR_MAXLEN && maxLenghtValue <= MEDIUMTEXT_MAXLEN) typeName = "mediumtext"; + else if ((int)maxLengthFacet.Value > MEDIUMTEXT_MAXLEN) typeName = "longtext"; + return TypeUsage.CreateStringTypeUsage(StoreTypeNameToStorePrimitiveType[typeName], isUnicode, isFixedLength, (int)maxLengthFacet.Value); + } + else + return TypeUsage.CreateStringTypeUsage(StoreTypeNameToStorePrimitiveType["longtext"], isUnicode, isFixedLength, LONGBLOB_MAXLEN); + } + } + + case PrimitiveTypeKind.DateTimeOffset: + return TypeUsage.CreateDefaultTypeUsage(StoreTypeNameToStorePrimitiveType["timestamp"]); + case PrimitiveTypeKind.DateTime: + return TypeUsage.CreateDefaultTypeUsage(StoreTypeNameToStorePrimitiveType["datetime"]); + case PrimitiveTypeKind.Time: + return TypeUsage.CreateDefaultTypeUsage(StoreTypeNameToStorePrimitiveType["time"]); + case PrimitiveTypeKind.Geometry: + return TypeUsage.CreateDefaultTypeUsage(StoreTypeNameToStorePrimitiveType["geometry"]); + default: + throw new NotSupportedException(String.Format(EntityFramework.Properties.Resources.NoStoreTypeForEdmType, edmType, primitiveType.PrimitiveTypeKind)); + } + } + + private static XmlReader GetXmlResource(string resourceName) + { + Assembly executingAssembly = Assembly.GetExecutingAssembly(); + Stream stream = executingAssembly.GetManifestResourceStream(resourceName); + return XmlReader.Create(stream); + } + + private static XmlReader GetMappingResource(string resourceBaseName) + { + string rez = GetResourceAsString( + String.Format("MySql.Data.EntityFramework.Properties.{0}", resourceBaseName)); + + StringReader sr = new StringReader(rez); + return XmlReader.Create(sr); + + } + + private static string GetResourceAsString(string resourceName) + { + Assembly executingAssembly = Assembly.GetExecutingAssembly(); + Stream s = executingAssembly.GetManifestResourceStream(resourceName); + StreamReader sr = new StreamReader(s); + string resourceAsString = sr.ReadToEnd(); + sr.Close(); + s.Close(); + return resourceAsString; + } + + public override bool SupportsEscapingLikeArgument(out char escapeCharacter) + { + escapeCharacter = LikeEscapeChar; + return true; + } + + public override string EscapeLikeArgument(string argument) + { + + bool usedEscapeCharacter; + return EscapeLikeArgument(argument, out usedEscapeCharacter); + } + + internal static string EscapeLikeArgument(string argument, out bool usedEscapeChar) + { + usedEscapeChar = false; + if (argument == null) + return string.Empty; + + if (!(argument.Contains("%") || argument.Contains("_") || argument.Contains(LikeEscapeCharToString))) + { + return argument; + } + var sb = new StringBuilder(argument.Length); + foreach (var c in argument) + { + if (c == '%' || c == '_' || c == LikeEscapeChar) + { + sb.Append(LikeEscapeChar); + usedEscapeChar = true; + } + sb.Append(c); + } + return sb.ToString(); + } + + public override bool SupportsInExpression() + { + return true; + } + } +} diff --git a/Source/MySql.Data.Entity.EF6/ProviderServices.cs b/EntityFramework/src/ProviderServices.cs similarity index 86% rename from Source/MySql.Data.Entity.EF6/ProviderServices.cs rename to EntityFramework/src/ProviderServices.cs index c2d796d53..e48803aad 100644 --- a/Source/MySql.Data.Entity.EF6/ProviderServices.cs +++ b/EntityFramework/src/ProviderServices.cs @@ -1,576 +1,568 @@ -// Copyright (c) 2014, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Data.Common; -using System.Collections.Generic; -using System.Data; -using MySql.Data.Entity; -using System.Reflection; -using System.Diagnostics; -using MySql.Data.Entity.Properties; -using System.Text; -using System.Linq; -using System.Globalization; -using MySql.Data.Common; -#if EF6 -using System.Data.Entity.Core.Common; -using System.Data.Entity.Core.Common.CommandTrees; -using System.Data.Entity.Core.Metadata.Edm; -using System.Data.Entity.Spatial; -using System.Data.Entity.Infrastructure; -#else -using System.Data.Common.CommandTrees; -using System.Data.Metadata.Edm; -#if NET_45_OR_GREATER -using System.Data.Spatial; -#endif -#endif - -namespace MySql.Data.MySqlClient -{ - public class MySqlScriptServices - { - public string GetTableCreateScript(EntitySet entitySet, string connectionString, string version) - { - MySqlProviderServices service = new MySqlProviderServices(); - - if (!String.IsNullOrEmpty(version)) - service.serverVersion = new Version(version); - else - { - using (var conn = new MySqlConnection(connectionString.Replace(@"""", ""))) - { - conn.Open(); - var v = DBVersion.Parse(conn.ServerVersion.ToString()); - service.serverVersion = new Version(v.Major + "." + v.Minor); - } - } - if (service.serverVersion == null) service.serverVersion = new Version("5.5"); - return service.GetTableCreateScript(entitySet); - } - } - -#if EF6 - public sealed class MySqlProviderServices : DbProviderServices -#else - internal partial class MySqlProviderServices : System.Data.Common.DbProviderServices -#endif - { - internal static readonly MySqlProviderServices Instance; - internal Version serverVersion { get; set; } - - static MySqlProviderServices() - { - Instance = new MySqlProviderServices(); - } - -#if NET_45_OR_GREATER - protected override DbSpatialDataReader GetDbSpatialDataReader(DbDataReader fromReader, string manifestToken) - { - if (fromReader == null) - throw new ArgumentNullException("fromReader must not be null"); - - EFMySqlDataReader efReader = fromReader as EFMySqlDataReader; - if (efReader == null) - { - throw new ArgumentException( - string.Format( - "Spatial readers can only be produced from readers of type EFMySqlDataReader. A reader of type {0} was provided.", - fromReader.GetType())); - } - - return new MySqlSpatialDataReader(efReader); - } -#endif - - protected override DbCommandDefinition CreateDbCommandDefinition( - DbProviderManifest providerManifest, DbCommandTree commandTree) - { - if (commandTree == null) - throw new ArgumentNullException("commandTree"); - - SqlGenerator generator = null; - if (commandTree is DbQueryCommandTree) - generator = new SelectGenerator(); - else if (commandTree is DbInsertCommandTree) - generator = new InsertGenerator(); - else if (commandTree is DbUpdateCommandTree) - generator = new UpdateGenerator(); - else if (commandTree is DbDeleteCommandTree) - generator = new DeleteGenerator(); - else if (commandTree is DbFunctionCommandTree) - generator = new FunctionGenerator(); - - string sql = generator.GenerateSQL(commandTree); - - EFMySqlCommand cmd = new EFMySqlCommand(); - cmd.CommandText = sql; - if (generator is FunctionGenerator) - cmd.CommandType = (generator as FunctionGenerator).CommandType; - - SetExpectedTypes(commandTree, cmd); - - EdmFunction function = null; - if (commandTree is DbFunctionCommandTree) - function = (commandTree as DbFunctionCommandTree).EdmFunction; - - // Now make sure we populate the command's parameters from the CQT's parameters: - foreach (KeyValuePair queryParameter in commandTree.Parameters) - { - DbParameter parameter = cmd.CreateParameter(); - parameter.ParameterName = queryParameter.Key; - parameter.Direction = ParameterDirection.Input; - parameter.DbType = Metadata.GetDbType(queryParameter.Value); - -#if NET_45_OR_GREATER - if (queryParameter.Value.EdmType is PrimitiveType && - ((PrimitiveType)queryParameter.Value.EdmType).PrimitiveTypeKind == PrimitiveTypeKind.Geometry) - { - ((MySqlParameter)parameter).MySqlDbType = MySqlDbType.Geometry; - } -#endif - - FunctionParameter funcParam; - if (function != null && - function.Parameters.TryGetValue(queryParameter.Key, false, out funcParam)) - { - parameter.ParameterName = funcParam.Name; - parameter.Direction = Metadata.ModeToDirection(funcParam.Mode); - parameter.DbType = Metadata.GetDbType(funcParam.TypeUsage); - } - cmd.Parameters.Add(parameter); - } - - // Now add parameters added as part of SQL gen - foreach (DbParameter p in generator.Parameters) - cmd.Parameters.Add(p); - - return CreateCommandDefinition(cmd); - } - - /// - /// Sets the expected column types - /// - private void SetExpectedTypes(DbCommandTree commandTree, EFMySqlCommand cmd) - { - if (commandTree is DbQueryCommandTree) - SetQueryExpectedTypes(commandTree as DbQueryCommandTree, cmd); - else if (commandTree is DbFunctionCommandTree) - SetFunctionExpectedTypes(commandTree as DbFunctionCommandTree, cmd); - } - - /// - /// Sets the expected column types for a given query command tree - /// - private void SetQueryExpectedTypes(DbQueryCommandTree tree, EFMySqlCommand cmd) - { - DbProjectExpression projectExpression = tree.Query as DbProjectExpression; - if (projectExpression != null) - { - EdmType resultsType = projectExpression.Projection.ResultType.EdmType; - - StructuralType resultsAsStructuralType = resultsType as StructuralType; - if (resultsAsStructuralType != null) - { - cmd.ColumnTypes = new PrimitiveType[resultsAsStructuralType.Members.Count]; - - for (int ordinal = 0; ordinal < resultsAsStructuralType.Members.Count; ordinal++) - { - EdmMember member = resultsAsStructuralType.Members[ordinal]; - PrimitiveType primitiveType = member.TypeUsage.EdmType as PrimitiveType; - cmd.ColumnTypes[ordinal] = primitiveType; - } - } - } - } - - /// - /// Sets the expected column types for a given function command tree - /// - private void SetFunctionExpectedTypes(DbFunctionCommandTree tree, EFMySqlCommand cmd) - { - if (tree.ResultType != null) - { - Debug.Assert(tree.ResultType.EdmType.BuiltInTypeKind == BuiltInTypeKind.CollectionType, - Entity.Properties.Resources.WrongFunctionResultType); - - CollectionType collectionType = (CollectionType)(tree.ResultType.EdmType); - EdmType elementType = collectionType.TypeUsage.EdmType; - - if (elementType.BuiltInTypeKind == BuiltInTypeKind.RowType) - { - ReadOnlyMetadataCollection members = ((RowType)elementType).Members; - cmd.ColumnTypes = new PrimitiveType[members.Count]; - - for (int ordinal = 0; ordinal < members.Count; ordinal++) - { - EdmMember member = members[ordinal]; - PrimitiveType primitiveType = (PrimitiveType)member.TypeUsage.EdmType; - cmd.ColumnTypes[ordinal] = primitiveType; - } - - } - else if (elementType.BuiltInTypeKind == BuiltInTypeKind.PrimitiveType) - { - cmd.ColumnTypes = new PrimitiveType[1]; - cmd.ColumnTypes[0] = (PrimitiveType)elementType; - } - else - { - Debug.Fail(Entity.Properties.Resources.WrongFunctionResultType); - } - } - } - - protected override string GetDbProviderManifestToken(DbConnection connection) - { - // we need the connection option to determine what version of the server - // we are connected to - MySqlConnectionStringBuilder msb = new MySqlConnectionStringBuilder((connection as MySqlConnection).Settings.ConnectionString); - msb.Database = null; - using (MySqlConnection c = new MySqlConnection(msb.ConnectionString)) - { - c.Open(); - - var v = DBVersion.Parse(c.ServerVersion); - serverVersion = new Version(v.Major + "." + v.Minor); - - double version = double.Parse(c.ServerVersion.Substring(0, 3), CultureInfo.InvariantCulture); - if (version < 5.0) throw new NotSupportedException("Versions of MySQL prior to 5.0 are not currently supported"); - if (version < 5.1) return "5.0"; - if (version < 5.5) return "5.1"; - if (version < 5.6) return "5.5"; - if (version < 5.7) return "5.6"; - return "5.7"; - - } - } - - protected override DbProviderManifest GetDbProviderManifest(string manifestToken) - { - return new MySqlProviderManifest(manifestToken); - } - -#if NET_40_OR_GREATER - protected override void DbCreateDatabase(DbConnection connection, int? commandTimeout, StoreItemCollection storeItemCollection) - { - if (connection == null) - throw new ArgumentNullException("connection"); - MySqlConnection conn = connection as MySqlConnection; - if (conn == null) - throw new ArgumentException(Entity.Properties.Resources.ConnectionMustBeOfTypeMySqlConnection, "connection"); - // Ensure a valid provider manifest token. - string providerManifestToken = this.GetDbProviderManifestToken(connection); - string query = DbCreateDatabaseScript(providerManifestToken, storeItemCollection); - - using (MySqlConnection c = new MySqlConnection()) - { - MySqlConnectionStringBuilder sb = new MySqlConnectionStringBuilder(conn.ConnectionString); - string dbName = sb.Database; - sb.Database = null; - c.ConnectionString = sb.ConnectionString; - c.Open(); - - string fullQuery = String.Format("CREATE DATABASE `{0}`; USE `{0}`; {1}", dbName, query); - MySqlScript s = new MySqlScript(c, fullQuery); - s.Execute(); - } - } - - protected override bool DbDatabaseExists(DbConnection connection, int? commandTimeout, StoreItemCollection storeItemCollection) - { - if (connection == null) - throw new ArgumentNullException("connection"); - MySqlConnection conn = connection as MySqlConnection; - if (conn == null) - throw new ArgumentException(Entity.Properties.Resources.ConnectionMustBeOfTypeMySqlConnection, "connection"); - - MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder(); - builder.ConnectionString = conn.ConnectionString; - string dbName = builder.Database; - builder.Database = null; - - using (MySqlConnection c = new MySqlConnection(builder.ConnectionString)) - { - c.Open(); - DataTable table = c.GetSchema("Databases", new string[] { dbName }); - if (table != null && table.Rows.Count == 1) return true; - return false; - } - } - - protected override void DbDeleteDatabase(DbConnection connection, int? commandTimeout, StoreItemCollection storeItemCollection) - { - if (connection == null) - throw new ArgumentNullException("connection"); - MySqlConnection conn = connection as MySqlConnection; - if (conn == null) - throw new ArgumentException(Entity.Properties.Resources.ConnectionMustBeOfTypeMySqlConnection, "connection"); - - MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder(); - builder.ConnectionString = conn.ConnectionString; - string dbName = builder.Database; - builder.Database = null; - - using (MySqlConnection c = new MySqlConnection(builder.ConnectionString)) - { - c.Open(); - MySqlCommand cmd = new MySqlCommand(String.Format("DROP DATABASE IF EXISTS `{0}`", dbName), c); - if (commandTimeout.HasValue) - cmd.CommandTimeout = commandTimeout.Value; - cmd.ExecuteNonQuery(); - } - } - - protected override string DbCreateDatabaseScript(string providerManifestToken, - StoreItemCollection storeItemCollection) - { - StringBuilder sql = new StringBuilder(); - - sql.AppendLine("-- MySql script"); - sql.AppendLine("-- Created on " + DateTime.Now); - - if (serverVersion == null) - serverVersion = new Version(providerManifestToken == null ? "5.5" : providerManifestToken); - - foreach (EntityContainer container in storeItemCollection.GetItems()) - { - // now output the tables - foreach (EntitySet es in container.BaseEntitySets.OfType()) - { - sql.Append(GetTableCreateScript(es)); - } - - // now output the foreign keys - foreach (AssociationSet a in container.BaseEntitySets.OfType()) - { - sql.Append(GetAssociationCreateScript(a.ElementType)); - } - } - - return sql.ToString(); - } - - private string GetAssociationCreateScript(AssociationType a) - { - StringBuilder sql = new StringBuilder(); - StringBuilder keySql = new StringBuilder(); - - if (a.IsForeignKey) - { - EntityType childType = (EntityType)a.ReferentialConstraints[0].ToProperties[0].DeclaringType; - EntityType parentType = (EntityType)a.ReferentialConstraints[0].FromProperties[0].DeclaringType; - string fkName = a.Name; - if (fkName.Length > 64) - { - fkName = "FK_" + Guid.NewGuid().ToString().Replace("-", ""); - } - sql.AppendLine(String.Format( - "ALTER TABLE `{0}` ADD CONSTRAINT {1}", _pluralizedNames[ childType.Name ], fkName)); - sql.Append("\t FOREIGN KEY ("); - string delimiter = ""; - foreach (EdmProperty p in a.ReferentialConstraints[0].ToProperties) - { - EdmMember member; - if (!childType.KeyMembers.TryGetValue(p.Name, false, out member)) - keySql.AppendLine(String.Format( - "ALTER TABLE `{0}` ADD KEY (`{1}`);", _pluralizedNames[childType.Name], p.Name)); - sql.AppendFormat("{0}{1}", delimiter, p.Name); - delimiter = ", "; - } - sql.AppendLine(")"); - delimiter = ""; - sql.Append(String.Format("\tREFERENCES `{0}` (", _pluralizedNames[parentType.Name])); - foreach (EdmProperty p in a.ReferentialConstraints[0].FromProperties) - { - EdmMember member; - if (!parentType.KeyMembers.TryGetValue(p.Name, false, out member)) - keySql.AppendLine(String.Format( - "ALTER TABLE `{0}` ADD KEY (`{1}`);", _pluralizedNames[parentType.Name], p.Name)); - sql.AppendFormat("{0}{1}", delimiter, p.Name); - delimiter = ", "; - } - sql.AppendLine(")"); - OperationAction oa = a.AssociationEndMembers[0].DeleteBehavior; - sql.AppendLine(String.Format(" ON DELETE {0} ON UPDATE {1};", - oa == OperationAction.None ? "NO ACTION" : oa.ToString(), "NO ACTION")); - sql.AppendLine(); - } - - keySql.Append(sql.ToString()); - return keySql.ToString(); - } - -#endif - - private Dictionary _pluralizedNames = new Dictionary(); - private List _guidIdentityColumns; - - internal string GetTableCreateScript(EntitySet entitySet) - { - EntityType e = entitySet.ElementType; - _guidIdentityColumns = new List(); - - string typeName = null; - if (_pluralizedNames.ContainsKey(e.Name)) - { - typeName = _pluralizedNames[e.Name]; - } - else - { - _pluralizedNames.Add(e.Name, - (string)entitySet.MetadataProperties["Table"].Value == null ? - e.Name : (string)entitySet.MetadataProperties["Table"].Value); - typeName = _pluralizedNames[e.Name]; - } - - StringBuilder sql = new StringBuilder("CREATE TABLE "); - sql.AppendFormat("`{0}`(", typeName ); - string delimiter = ""; - foreach (EdmProperty c in e.Properties) - { - sql.AppendFormat("{0}{1}\t`{2}` {3}{4}", delimiter, Environment.NewLine, c.Name, - GetColumnType(c.TypeUsage), GetFacetString(c, e.KeyMembers.Contains(c.Name))); - delimiter = ", "; - } - sql.AppendLine(");"); - sql.AppendLine(); - if (e.KeyMembers.Count > 0) - { - sql.Append(String.Format( - "ALTER TABLE `{0}` ADD PRIMARY KEY (", typeName )); - delimiter = ""; - foreach (EdmMember m in e.KeyMembers) - { - sql.AppendFormat("{0}`{1}`", delimiter, m.Name); - delimiter = ", "; - } - sql.AppendLine(");"); - sql.AppendLine(); - } - if (_guidIdentityColumns.Count > 0) - { - sql.AppendLine("DELIMITER ||"); - sql.AppendLine(string.Format("CREATE TRIGGER `{0}` BEFORE INSERT ON `{1}`", typeName + "_IdentityTgr", typeName)); - sql.AppendLine("\tFOR EACH ROW BEGIN"); - foreach (string guidColumn in _guidIdentityColumns) - { - if (e.KeyMembers.Contains(guidColumn)) - { - sql.AppendLine(string.Format("\t\tDROP TEMPORARY TABLE IF EXISTS tmpIdentity_{0};", typeName)); - sql.AppendLine(string.Format("\t\tCREATE TEMPORARY TABLE tmpIdentity_{0} (guid CHAR(36))ENGINE=MEMORY;", typeName)); - sql.AppendLine(string.Format("\t\tSET @var_{0} = UUID();", guidColumn)); - sql.AppendLine(string.Format("\t\tINSERT INTO tmpIdentity_{0} VALUES(@var_{1});", typeName, guidColumn)); - sql.AppendLine(string.Format("\t\tSET new.{0} = @var_{0};", guidColumn)); - } - else - sql.AppendLine(string.Format("\t\tSET new.{0} = UUID();", guidColumn)); - } - sql.AppendLine("\tEND ||"); - sql.AppendLine("DELIMITER ;"); - } - sql.AppendLine(); - return sql.ToString(); - } - - internal string GetColumnType(TypeUsage type) - { - string t = type.EdmType.Name; - if (t.StartsWith("u", StringComparison.OrdinalIgnoreCase)) - { - t = t.Substring(1).ToUpperInvariant() + " UNSIGNED"; - } - else if (String.Compare(t, "guid", true) == 0) - return "CHAR(36) BINARY"; - return t; - } - - private string GetFacetString(EdmProperty column, bool IsKeyMember) - { - StringBuilder sql = new StringBuilder(); - Facet facet; - Facet fcDateTimePrecision = null; - - ReadOnlyMetadataCollection facets = column.TypeUsage.Facets; - - if (column.TypeUsage.EdmType.BaseType.Name == "String") - { - // types tinytext, mediumtext, text & longtext don't have a length. - if (!column.TypeUsage.EdmType.Name.EndsWith("text", StringComparison.OrdinalIgnoreCase)) - { - if (facets.TryGetValue("MaxLength", true, out facet)) - { - sql.AppendFormat(" ({0})", facet.Value); - } - } - } - else if (column.TypeUsage.EdmType.BaseType.Name == "Decimal") - { - Facet fcScale; - Facet fcPrecision; - if (facets.TryGetValue("Scale", true, out fcScale) && facets.TryGetValue("Precision", true, out fcPrecision)) - { - // Enforce scale to a reasonable value. - int scale = fcScale.Value == null ? 0 : ( int )( byte )fcScale.Value; - if (scale == 0) - scale = MySqlProviderManifest.DEFAULT_DECIMAL_SCALE; - sql.AppendFormat("( {0}, {1} ) ", fcPrecision.Value, scale); - } - } - else if (column.TypeUsage.EdmType.BaseType.Name == "DateTime") - { - if (serverVersion >= new Version(5, 6) && facets.TryGetValue("Precision", true, out fcDateTimePrecision)) - { - if (Convert.ToByte(fcDateTimePrecision.Value) >= 1) - sql.AppendFormat("( {0} ) ", fcDateTimePrecision.Value); - } - } - - - if (facets.TryGetValue("Nullable", true, out facet) && (bool)facet.Value == false) - sql.Append(" NOT NULL"); - - if (facets.TryGetValue("StoreGeneratedPattern", true, out facet)) - { - if (facet.Value.Equals(StoreGeneratedPattern.Identity)) - { - - if (column.TypeUsage.EdmType.BaseType.Name.StartsWith("Int")) - sql.Append(" AUTO_INCREMENT UNIQUE"); - else if (column.TypeUsage.EdmType.BaseType.Name == "Guid") - _guidIdentityColumns.Add(column.Name); - else if (serverVersion >= new Version(5, 6) && column.TypeUsage.EdmType.BaseType.Name == "DateTime") - sql.AppendFormat(" DEFAULT CURRENT_TIMESTAMP{0}", fcDateTimePrecision != null && Convert.ToByte(fcDateTimePrecision.Value) >= 1 ? "( " + fcDateTimePrecision.Value.ToString() + " )" : ""); - else - throw new MySqlException("Invalid identity column type."); - } - } - return sql.ToString(); - } - - private bool IsStringType(TypeUsage type) - { - return false; - } - } -} +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Data.Common; +using System.Collections.Generic; +using System.Data; +using MySql.Data.EntityFramework; +using System.Diagnostics; +using System.Text; +using System.Globalization; +using MySql.Data.Common; +using System.Data.Entity.Core.Common; +using System.Data.Entity.Core.Common.CommandTrees; +using System.Data.Entity.Core.Metadata.Edm; +using System.Data.Entity.Spatial; +using System.Linq; + +namespace MySql.Data.MySqlClient +{ + /// + /// Constructs a script that generates a table. + /// + public class MySqlScriptServices + { + public string GetTableCreateScript(EntitySet entitySet, string connectionString, string version) + { + MySqlProviderServices service = new MySqlProviderServices(); + + if (!String.IsNullOrEmpty(version)) + service.serverVersion = new Version(version); + else + { + using (var conn = new MySqlConnection(connectionString.Replace(@"""", ""))) + { + conn.Open(); + var v = DBVersion.Parse(conn.ServerVersion.ToString()); + service.serverVersion = new Version(v.Major + "." + v.Minor); + } + } + if (service.serverVersion == null) service.serverVersion = new Version("5.5"); + return service.GetTableCreateScript(entitySet); + } + } + + /// + /// The implementation for the MySqlClient provider for MySQL Server. + /// + public sealed class MySqlProviderServices : DbProviderServices + { + internal static readonly MySqlProviderServices Instance; + internal Version serverVersion { get; set; } + + static MySqlProviderServices() + { + Instance = new MySqlProviderServices(); + } + + protected override DbSpatialDataReader GetDbSpatialDataReader(DbDataReader fromReader, string manifestToken) + { + if (fromReader == null) + throw new ArgumentNullException("fromReader must not be null"); + + EFMySqlDataReader efReader = fromReader as EFMySqlDataReader; + if (efReader == null) + { + throw new ArgumentException( + string.Format( + "Spatial readers can only be produced from readers of type EFMySqlDataReader. A reader of type {0} was provided.", + fromReader.GetType())); + } + + return new MySqlSpatialDataReader(efReader); + } + + protected override DbCommandDefinition CreateDbCommandDefinition( + DbProviderManifest providerManifest, DbCommandTree commandTree) + { + if (commandTree == null) + throw new ArgumentNullException("commandTree"); + + SqlGenerator generator = null; + if (commandTree is DbQueryCommandTree) + generator = new SelectGenerator(); + else if (commandTree is DbInsertCommandTree) + generator = new InsertGenerator(); + else if (commandTree is DbUpdateCommandTree) + generator = new UpdateGenerator(); + else if (commandTree is DbDeleteCommandTree) + generator = new DeleteGenerator(); + else if (commandTree is DbFunctionCommandTree) + generator = new FunctionGenerator(); + + string sql = generator.GenerateSQL(commandTree); + + EFMySqlCommand cmd = new EFMySqlCommand(); + cmd.CommandText = sql; + if (generator is FunctionGenerator) + cmd.CommandType = (generator as FunctionGenerator).CommandType; + + SetExpectedTypes(commandTree, cmd); + + EdmFunction function = null; + if (commandTree is DbFunctionCommandTree) + function = (commandTree as DbFunctionCommandTree).EdmFunction; + + // Now make sure we populate the command's parameters from the CQT's parameters: + foreach (KeyValuePair queryParameter in commandTree.Parameters) + { + DbParameter parameter = cmd.CreateParameter(); + parameter.ParameterName = queryParameter.Key; + parameter.Direction = ParameterDirection.Input; + parameter.DbType = Metadata.GetDbType(queryParameter.Value); + + if (queryParameter.Value.EdmType is PrimitiveType && + ((PrimitiveType)queryParameter.Value.EdmType).PrimitiveTypeKind == PrimitiveTypeKind.Geometry) + { + ((MySqlParameter)parameter).MySqlDbType = MySqlDbType.Geometry; + } + + FunctionParameter funcParam; + if (function != null && + function.Parameters.TryGetValue(queryParameter.Key, false, out funcParam)) + { + parameter.ParameterName = funcParam.Name; + parameter.Direction = Metadata.ModeToDirection(funcParam.Mode); + parameter.DbType = Metadata.GetDbType(funcParam.TypeUsage); + } + cmd.Parameters.Add(parameter); + } + + // Now add parameters added as part of SQL gen + foreach (DbParameter p in generator.Parameters) + cmd.Parameters.Add(p); + + return CreateCommandDefinition(cmd); + } + + /// + /// Sets the expected column types + /// + private void SetExpectedTypes(DbCommandTree commandTree, EFMySqlCommand cmd) + { + if (commandTree is DbQueryCommandTree) + SetQueryExpectedTypes(commandTree as DbQueryCommandTree, cmd); + else if (commandTree is DbFunctionCommandTree) + SetFunctionExpectedTypes(commandTree as DbFunctionCommandTree, cmd); + } + + /// + /// Sets the expected column types for a given query command tree + /// + private void SetQueryExpectedTypes(DbQueryCommandTree tree, EFMySqlCommand cmd) + { + DbProjectExpression projectExpression = tree.Query as DbProjectExpression; + if (projectExpression != null) + { + EdmType resultsType = projectExpression.Projection.ResultType.EdmType; + + StructuralType resultsAsStructuralType = resultsType as StructuralType; + if (resultsAsStructuralType != null) + { + cmd.ColumnTypes = new PrimitiveType[resultsAsStructuralType.Members.Count]; + + for (int ordinal = 0; ordinal < resultsAsStructuralType.Members.Count; ordinal++) + { + EdmMember member = resultsAsStructuralType.Members[ordinal]; + PrimitiveType primitiveType = member.TypeUsage.EdmType as PrimitiveType; + cmd.ColumnTypes[ordinal] = primitiveType; + } + } + } + } + + /// + /// Sets the expected column types for a given function command tree + /// + private void SetFunctionExpectedTypes(DbFunctionCommandTree tree, EFMySqlCommand cmd) + { + if (tree.ResultType != null) + { + Debug.Assert(tree.ResultType.EdmType.BuiltInTypeKind == BuiltInTypeKind.CollectionType, + EntityFramework.Properties.Resources.WrongFunctionResultType); + + CollectionType collectionType = (CollectionType)(tree.ResultType.EdmType); + EdmType elementType = collectionType.TypeUsage.EdmType; + + if (elementType.BuiltInTypeKind == BuiltInTypeKind.RowType) + { + ReadOnlyMetadataCollection members = ((RowType)elementType).Members; + cmd.ColumnTypes = new PrimitiveType[members.Count]; + + for (int ordinal = 0; ordinal < members.Count; ordinal++) + { + EdmMember member = members[ordinal]; + PrimitiveType primitiveType = (PrimitiveType)member.TypeUsage.EdmType; + cmd.ColumnTypes[ordinal] = primitiveType; + } + + } + else if (elementType.BuiltInTypeKind == BuiltInTypeKind.PrimitiveType) + { + cmd.ColumnTypes = new PrimitiveType[1]; + cmd.ColumnTypes[0] = (PrimitiveType)elementType; + } + else + { + Debug.Fail(EntityFramework.Properties.Resources.WrongFunctionResultType); + } + } + } + + protected override string GetDbProviderManifestToken(DbConnection connection) + { + // we need the connection option to determine what version of the server + // we are connected to + MySqlConnectionStringBuilder msb = new MySqlConnectionStringBuilder((connection as MySqlConnection).Settings.ConnectionString); + msb.Database = null; + using (MySqlConnection c = new MySqlConnection(msb.ConnectionString)) + { + c.Open(); + + var v = DBVersion.Parse(c.ServerVersion); + serverVersion = new Version(v.Major + "." + v.Minor); + + double version = double.Parse(c.ServerVersion.Substring(0, 3), CultureInfo.InvariantCulture); + if (version < 5.6) throw new NotSupportedException("Versions of MySQL prior to 5.6 are not currently supported"); + if (version < 5.7) return "5.6"; + if (version < 8.0) return "5.7"; + return "8.0"; + } + } + + protected override DbProviderManifest GetDbProviderManifest(string manifestToken) + { + return new MySqlProviderManifest(manifestToken); + } + + protected override void DbCreateDatabase(DbConnection connection, int? commandTimeout, StoreItemCollection storeItemCollection) + { + if (connection == null) + throw new ArgumentNullException("connection"); + MySqlConnection conn = connection as MySqlConnection; + if (conn == null) + throw new ArgumentException(EntityFramework.Properties.Resources.ConnectionMustBeOfTypeMySqlConnection, "connection"); + // Ensure a valid provider manifest token. + string providerManifestToken = this.GetDbProviderManifestToken(connection); + string query = DbCreateDatabaseScript(providerManifestToken, storeItemCollection); + + using (MySqlConnection c = new MySqlConnection()) + { + MySqlConnectionStringBuilder sb = new MySqlConnectionStringBuilder(conn.ConnectionString); + string dbName = sb.Database; + sb.Database = null; + c.ConnectionString = sb.ConnectionString; + c.Open(); + + string fullQuery = String.Format("CREATE DATABASE `{0}`; USE `{0}`; {1}", dbName, query); + MySqlScript s = new MySqlScript(c, fullQuery); + s.Execute(); + } + } + + protected override bool DbDatabaseExists(DbConnection connection, int? commandTimeout, StoreItemCollection storeItemCollection) + { + if (connection == null) + throw new ArgumentNullException("connection"); + MySqlConnection conn = connection as MySqlConnection; + if (conn == null) + throw new ArgumentException(EntityFramework.Properties.Resources.ConnectionMustBeOfTypeMySqlConnection, "connection"); + + MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder(); + builder.ConnectionString = conn.ConnectionString; + string dbName = builder.Database; + builder.Database = null; + + using (MySqlConnection c = new MySqlConnection(builder.ConnectionString)) + { + c.Open(); + DataTable table = c.GetSchema("Databases", new string[] { dbName }); + if (table != null && table.Rows.Count == 1) return true; + return false; + } + } + + protected override void DbDeleteDatabase(DbConnection connection, int? commandTimeout, StoreItemCollection storeItemCollection) + { + if (connection == null) + throw new ArgumentNullException("connection"); + MySqlConnection conn = connection as MySqlConnection; + if (conn == null) + throw new ArgumentException(EntityFramework.Properties.Resources.ConnectionMustBeOfTypeMySqlConnection, "connection"); + + MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder(); + builder.ConnectionString = conn.ConnectionString; + string dbName = builder.Database; + builder.Database = null; + + using (MySqlConnection c = new MySqlConnection(builder.ConnectionString)) + { + c.Open(); + MySqlCommand cmd = new MySqlCommand(String.Format("DROP DATABASE IF EXISTS `{0}`", dbName), c); + if (commandTimeout.HasValue) + cmd.CommandTimeout = commandTimeout.Value; + cmd.ExecuteNonQuery(); + } + } + + protected override string DbCreateDatabaseScript(string providerManifestToken, + StoreItemCollection storeItemCollection) + { + StringBuilder sql = new StringBuilder(); + + sql.AppendLine("-- MySql script"); + sql.AppendLine("-- Created on " + DateTime.Now); + + if (serverVersion == null) + serverVersion = new Version(providerManifestToken == null ? "5.5" : providerManifestToken); + + foreach (EntityContainer container in storeItemCollection.GetItems()) + { + // now output the tables + foreach (EntitySet es in container.BaseEntitySets.OfType()) + { + sql.Append(GetTableCreateScript(es)); + } + + // now output the foreign keys + foreach (AssociationSet a in container.BaseEntitySets.OfType()) + { + sql.Append(GetAssociationCreateScript(a.ElementType)); + } + } + + return sql.ToString(); + } + + private string GetAssociationCreateScript(AssociationType a) + { + StringBuilder sql = new StringBuilder(); + StringBuilder keySql = new StringBuilder(); + + if (a.IsForeignKey) + { + EntityType childType = (EntityType)a.ReferentialConstraints[0].ToProperties[0].DeclaringType; + EntityType parentType = (EntityType)a.ReferentialConstraints[0].FromProperties[0].DeclaringType; + string fkName = a.Name; + if (fkName.Length > 64) + { + fkName = "FK_" + Guid.NewGuid().ToString().Replace("-", ""); + } + sql.AppendLine(String.Format( + "ALTER TABLE `{0}` ADD CONSTRAINT {1}", _pluralizedNames[ childType.Name ], fkName)); + sql.Append("\t FOREIGN KEY ("); + string delimiter = ""; + foreach (EdmProperty p in a.ReferentialConstraints[0].ToProperties) + { + EdmMember member; + if (!childType.KeyMembers.TryGetValue(p.Name, false, out member)) + keySql.AppendLine(String.Format( + "ALTER TABLE `{0}` ADD KEY (`{1}`);", _pluralizedNames[childType.Name], p.Name)); + sql.AppendFormat("{0}{1}", delimiter, p.Name); + delimiter = ", "; + } + sql.AppendLine(")"); + delimiter = ""; + sql.Append(String.Format("\tREFERENCES `{0}` (", _pluralizedNames[parentType.Name])); + foreach (EdmProperty p in a.ReferentialConstraints[0].FromProperties) + { + EdmMember member; + if (!parentType.KeyMembers.TryGetValue(p.Name, false, out member)) + keySql.AppendLine(String.Format( + "ALTER TABLE `{0}` ADD KEY (`{1}`);", _pluralizedNames[parentType.Name], p.Name)); + sql.AppendFormat("{0}{1}", delimiter, p.Name); + delimiter = ", "; + } + sql.AppendLine(")"); + OperationAction oa = a.AssociationEndMembers[0].DeleteBehavior; + sql.AppendLine(String.Format(" ON DELETE {0} ON UPDATE {1};", + oa == OperationAction.None ? "NO ACTION" : oa.ToString(), "NO ACTION")); + sql.AppendLine(); + } + + keySql.Append(sql.ToString()); + return keySql.ToString(); + } + + private Dictionary _pluralizedNames = new Dictionary(); + private List _guidIdentityColumns; + + internal string GetTableCreateScript(EntitySet entitySet) + { + EntityType e = entitySet.ElementType; + _guidIdentityColumns = new List(); + + string typeName = null; + if (_pluralizedNames.ContainsKey(e.Name)) + { + typeName = _pluralizedNames[e.Name]; + } + else + { + _pluralizedNames.Add(e.Name, + (string)entitySet.MetadataProperties["Table"].Value == null ? + e.Name : (string)entitySet.MetadataProperties["Table"].Value); + typeName = _pluralizedNames[e.Name]; + } + + StringBuilder sql = new StringBuilder("CREATE TABLE "); + sql.AppendFormat("`{0}`(", typeName ); + string delimiter = ""; + foreach (EdmProperty c in e.Properties) + { + sql.AppendFormat("{0}{1}\t`{2}` {3}{4}", delimiter, Environment.NewLine, c.Name, + GetColumnType(c.TypeUsage), GetFacetString(c, e.KeyMembers.Contains(c.Name))); + delimiter = ", "; + } + sql.AppendLine(");"); + sql.AppendLine(); + if (e.KeyMembers.Count > 0) + { + sql.Append(String.Format( + "ALTER TABLE `{0}` ADD PRIMARY KEY (", typeName )); + delimiter = ""; + foreach (EdmMember m in e.KeyMembers) + { + sql.AppendFormat("{0}`{1}`", delimiter, m.Name); + delimiter = ", "; + } + sql.AppendLine(");"); + sql.AppendLine(); + } + if (_guidIdentityColumns.Count > 0) + { + sql.AppendLine("DELIMITER ||"); + sql.AppendLine(string.Format("CREATE TRIGGER `{0}` BEFORE INSERT ON `{1}`", typeName + "_IdentityTgr", typeName)); + sql.AppendLine("\tFOR EACH ROW BEGIN"); + foreach (string guidColumn in _guidIdentityColumns) + { + if (e.KeyMembers.Contains(guidColumn)) + { + sql.AppendLine(string.Format("\t\tDROP TEMPORARY TABLE IF EXISTS tmpIdentity_{0};", typeName)); + sql.AppendLine(string.Format("\t\tCREATE TEMPORARY TABLE tmpIdentity_{0} (guid CHAR(36))ENGINE=MEMORY;", typeName)); + sql.AppendLine(string.Format("\t\tSET @var_{0} = UUID();", guidColumn)); + sql.AppendLine(string.Format("\t\tINSERT INTO tmpIdentity_{0} VALUES(@var_{1});", typeName, guidColumn)); + sql.AppendLine(string.Format("\t\tSET new.{0} = @var_{0};", guidColumn)); + } + else + sql.AppendLine(string.Format("\t\tSET new.{0} = UUID();", guidColumn)); + } + sql.AppendLine("\tEND ||"); + sql.AppendLine("DELIMITER ;"); + } + sql.AppendLine(); + return sql.ToString(); + } + + internal string GetColumnType(TypeUsage type) + { + string t = type.EdmType.Name; + if (t.StartsWith("u", StringComparison.OrdinalIgnoreCase)) + { + t = t.Substring(1).ToUpperInvariant() + " UNSIGNED"; + } + else if (String.Compare(t, "guid", true) == 0) + return "CHAR(36) BINARY"; + return t; + } + + private string GetFacetString(EdmProperty column, bool IsKeyMember) + { + StringBuilder sql = new StringBuilder(); + Facet facet; + Facet fcDateTimePrecision = null; + + ReadOnlyMetadataCollection facets = column.TypeUsage.Facets; + + if (column.TypeUsage.EdmType.BaseType.Name == "String") + { + // types tinytext, mediumtext, text & longtext don't have a length. + if (!column.TypeUsage.EdmType.Name.EndsWith("text", StringComparison.OrdinalIgnoreCase)) + { + if (facets.TryGetValue("MaxLength", true, out facet)) + { + sql.AppendFormat(" ({0})", facet.Value); + } + } + } + else if (column.TypeUsage.EdmType.BaseType.Name == "Decimal") + { + Facet fcScale; + Facet fcPrecision; + if (facets.TryGetValue("Scale", true, out fcScale) && facets.TryGetValue("Precision", true, out fcPrecision)) + { + // Enforce scale to a reasonable value. + int scale = fcScale.Value == null ? 0 : ( int )( byte )fcScale.Value; + if (scale == 0) + scale = MySqlProviderManifest.DEFAULT_DECIMAL_SCALE; + sql.AppendFormat("( {0}, {1} ) ", fcPrecision.Value, scale); + } + } + else if (column.TypeUsage.EdmType.BaseType.Name == "DateTime") + { + if (serverVersion >= new Version(5, 6) && facets.TryGetValue("Precision", true, out fcDateTimePrecision)) + { + if (Convert.ToByte(fcDateTimePrecision.Value) >= 1) + sql.AppendFormat("( {0} ) ", fcDateTimePrecision.Value); + } + } + + + if (facets.TryGetValue("Nullable", true, out facet) && (bool)facet.Value == false) + sql.Append(" NOT NULL"); + + if (facets.TryGetValue("StoreGeneratedPattern", true, out facet)) + { + if (facet.Value.Equals(StoreGeneratedPattern.Identity)) + { + + if (column.TypeUsage.EdmType.BaseType.Name.StartsWith("Int")) + sql.Append(" AUTO_INCREMENT UNIQUE"); + else if (column.TypeUsage.EdmType.BaseType.Name == "Guid") + _guidIdentityColumns.Add(column.Name); + else if (serverVersion >= new Version(5, 6) && column.TypeUsage.EdmType.BaseType.Name == "DateTime") + sql.AppendFormat(" DEFAULT CURRENT_TIMESTAMP{0}", fcDateTimePrecision != null && Convert.ToByte(fcDateTimePrecision.Value) >= 1 ? "( " + fcDateTimePrecision.Value.ToString() + " )" : ""); + else + throw new MySqlException("Invalid identity column type."); + } + else if (facet.Value.Equals(StoreGeneratedPattern.Computed)) + { + if (serverVersion >= new Version(5, 6) && column.TypeUsage.EdmType.BaseType.Name == "DateTime") + sql.AppendFormat(" DEFAULT CURRENT_TIMESTAMP{0}", fcDateTimePrecision != null && Convert.ToByte(fcDateTimePrecision.Value) >= 1 ? "( " + fcDateTimePrecision.Value.ToString() + " )" : ""); + } + } + return sql.ToString(); + } + + private bool IsStringType(TypeUsage type) + { + return false; + } + } +} diff --git a/EntityFramework/src/Statements/DeleteStatement.cs b/EntityFramework/src/Statements/DeleteStatement.cs new file mode 100644 index 000000000..28dab1486 --- /dev/null +++ b/EntityFramework/src/Statements/DeleteStatement.cs @@ -0,0 +1,53 @@ +// Copyright © 2008, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Text; +namespace MySql.Data.EntityFramework +{ + class DeleteStatement : SqlFragment + { + public SqlFragment Target { get; set; } + public SqlFragment Where { get; set; } + + public override void WriteSql(StringBuilder sql) + { + sql.Append("DELETE FROM "); + Target.WriteSql(sql); + if (Where != null) + { + sql.Append(" WHERE "); + Where.WriteSql(sql); + } + } + + internal override void Accept(SqlFragmentVisitor visitor) + { + throw new System.NotImplementedException(); + } + } +} diff --git a/EntityFramework/src/Statements/InsertStatement.cs b/EntityFramework/src/Statements/InsertStatement.cs new file mode 100644 index 000000000..0b22db824 --- /dev/null +++ b/EntityFramework/src/Statements/InsertStatement.cs @@ -0,0 +1,74 @@ +// Copyright © 2008, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Collections.Generic; +using System.Text; + +namespace MySql.Data.EntityFramework +{ + class InsertStatement : SqlFragment + { + public InsertStatement() + { + Sets = new List(); + Values = new List(); + } + + public InputFragment Target { get; set; } + public List Sets { get; private set; } + public List Values { get; private set; } + public SelectStatement ReturningSelect; + + public override void WriteSql(StringBuilder sql) + { + sql.Append("INSERT INTO "); + Target.WriteSql(sql); + if (Sets.Count > 0) + { + sql.Append("("); + WriteList(Sets, sql); + sql.Append(")"); + } + sql.Append(" VALUES "); + sql.Append("("); + WriteList(Values, sql); + sql.Append(")"); + + if (ReturningSelect != null) + { + sql.Append(";\r\n"); + ReturningSelect.WriteSql(sql); + } + } + + internal override void Accept(SqlFragmentVisitor visitor) + { + throw new System.NotImplementedException(); + } + } +} diff --git a/Source/MySql.Data.Entity.EF6/Statements/SelectStatement.cs b/EntityFramework/src/Statements/SelectStatement.cs similarity index 84% rename from Source/MySql.Data.Entity.EF6/Statements/SelectStatement.cs rename to EntityFramework/src/Statements/SelectStatement.cs index ca4e4f226..cf355998e 100644 --- a/Source/MySql.Data.Entity.EF6/Statements/SelectStatement.cs +++ b/EntityFramework/src/Statements/SelectStatement.cs @@ -1,360 +1,360 @@ -// Copyright © 2008, 2014, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Collections.Generic; -using System.Text; -using System; -using System.Collections; -using System.Diagnostics; -#if EF6 -using System.Data.Entity.Core.Common.CommandTrees; -using System.Data.Entity.Core.Metadata.Edm; -#else -using System.Data.Metadata.Edm; -using System.Data.Common.CommandTrees; -#endif - - -namespace MySql.Data.Entity -{ - class SelectStatement : InputFragment - { - private Dictionary columnHash; - private bool hasRenamedColumns; - private SqlGenerator generator; - - public SelectStatement(SqlGenerator generator) - : base(null) - { - Columns = new List(); - this.generator = generator; - } - - public InputFragment From; - public List Columns { get; private set; } - public SqlFragment Where; - public SqlFragment Limit; - public SqlFragment Skip; - public List GroupBy { get; internal set; } - public List OrderBy { get; internal set; } - public bool IsDistinct; - - public void AddGroupBy(SqlFragment f) - { - if (GroupBy == null) - GroupBy = new List(); - GroupBy.Add(f); - } - - public void AddOrderBy(SortFragment f) - { - if (OrderBy == null) - OrderBy = new List(); - OrderBy.Add(f); - } - - public override void WriteSql(StringBuilder sql) - { - if (IsWrapped) - sql.Append("("); - sql.Append("SELECT"); - if (IsDistinct) - sql.Append(" DISTINCT "); - - WriteList(Columns, sql); - - if (From != null) - { - sql.Append("\r\nFROM "); - From.WriteSql(sql); - } - if (Where != null) - { - sql.Append("\r\n WHERE "); - Where.WriteSql(sql); - } - if (GroupBy != null) - { - sql.Append("\r\n GROUP BY "); - WriteList(GroupBy, sql); - } - WriteOrderBy(sql); - if (Limit != null || Skip != null) - { - sql.Append(" LIMIT "); - if (Skip != null) - sql.AppendFormat("{0},", Skip); - if (Limit == null) - sql.Append("18446744073709551615"); - else - sql.AppendFormat("{0}", Limit); - } - if (IsWrapped) - { - sql.Append(")"); - if (Name != null) - sql.AppendFormat(" AS {0}", QuoteIdentifier(Name)); - } - } - - private void WriteOrderBy(StringBuilder sql) - { - if (OrderBy == null) return; - sql.Append("\r\n ORDER BY "); - WriteList(OrderBy, sql); - } - - public override void Wrap(Scope scope) - { - base.Wrap(scope); - - // now we need to add default columns if necessary - if (Columns.Count == 0) - AddDefaultColumns(scope); - - // next we need to remove child extents of the select from scope - if (Name != null) - { - scope.Remove(this); - scope.Add(Name, this); - } - } - - void AddDefaultColumns(Scope scope) - { - if (columnHash == null) - columnHash = new Dictionary(); - - List columns = GetDefaultColumnsForFragment(From); - bool Exists = false; - if (From is TableFragment && scope.GetFragment((From as TableFragment).Table) == null) - { - scope.Add((From as TableFragment).Table, From); - Exists = true; - } - - foreach (ColumnFragment column in columns) - { - // first we need to set the input for this column - InputFragment input = scope.FindInputFromProperties(column.PropertyFragment); - column.TableName = input.Name; - - // then we rename the column if necessary - if (columnHash.ContainsKey(column.ColumnName.ToUpper())) - { - column.ColumnAlias = MakeColumnNameUnique(column.ColumnName); - columnHash.Add(column.ColumnAlias, column); - } - else - columnHash.Add(column.ColumnName.ToUpper(), column); - Columns.Add(column); - } - if (Exists) - { - scope.Remove((From as TableFragment).Table, From); - } - } - - internal void AddColumn(ColumnFragment column, Scope scope) - { - InputFragment input = scope.FindInputFromProperties(column.PropertyFragment); - column.TableName = input.Name; - - // then we rename the column if necessary - if (columnHash.ContainsKey(column.ColumnName.ToUpper())) - { - column.ColumnAlias = MakeColumnNameUnique(column.ColumnName); - columnHash.Add(column.ColumnAlias, column); - } - else - { - if( !string.IsNullOrEmpty(column.ColumnAlias) ) - columnHash.Add(column.ColumnAlias.ToUpper(), column); - else - columnHash.Add(column.ColumnName.ToUpper(), column); - } - Columns.Add(column); - } - - List GetDefaultColumnsForFragment(InputFragment input) - { - List columns = new List(); - - if (input is TableFragment) - { - return GetDefaultColumnsForTable(input as TableFragment); - } - else if (input is JoinFragment || input is UnionFragment) - { - Debug.Assert(input.Left != null); - if (input is UnionFragment) - { - generator.Ops.Push(OpType.Union); - } - columns = GetDefaultColumnsForFragment(input.Left); - if (input is JoinFragment && input.Right != null) - { - List right = GetDefaultColumnsForFragment(input.Right); - columns.AddRange(right); - } - if (input is UnionFragment) - { - generator.Ops.Pop(); - } - } - else if (input is SelectStatement) - { - SelectStatement select = input as SelectStatement; - foreach (ColumnFragment cf in select.Columns) - { - ColumnFragment newColumn = new ColumnFragment(cf.TableName, - string.IsNullOrEmpty(cf.ColumnAlias) ? cf.ActualColumnName : cf.ColumnAlias - ); - if ( generator.GetTopOp() == OpType.Join ) - { - newColumn.ColumnAlias = cf.ColumnAlias; - newColumn.PushInput(cf.ColumnName); - if (cf.TableName != null) - newColumn.PushInput(cf.TableName); - } - else - { - newColumn.PushInput(cf.ActualColumnName); - if (cf.TableName != null && cf.ColumnAlias == null) - newColumn.PushInput(cf.TableName); - } - if (select.Name != null) - { - newColumn.PushInput(select.Name); // add the scope - } - columns.Add(newColumn); - } - return columns; - } - else - throw new NotImplementedException(); - if (!String.IsNullOrEmpty(input.Name) && input.Name != From.Name) - foreach (ColumnFragment c in columns) - { - c.PushInput(input.Name); - } - return columns; - } - - List GetDefaultColumnsForTable(TableFragment table) - { - List columns = new List(); - - foreach (EdmProperty property in Metadata.GetProperties(table.Type.EdmType)) - { - ColumnFragment col = new ColumnFragment(table.Name, property.Name); - col.PushInput(property.Name); - col.PushInput((table.Name != null) ? table.Name : table.Table); - columns.Add(col); - } - return columns; - } - - private string MakeColumnNameUnique(string baseName) - { - int i = 1; - baseName = baseName.ToUpper(); - hasRenamedColumns = true; - while (true) - { - string name = String.Format("{0}{1}", baseName, i); - if (!columnHash.ContainsKey(name)) return name; - i++; - } - } - - public bool HasDifferentNameForColumn(ColumnFragment column) - { - if (!hasRenamedColumns) return false; - foreach (ColumnFragment c in Columns) - { - if (!c.Equals(column)) continue; - if (String.IsNullOrEmpty(c.ColumnAlias)) return false; - column.ColumnName = c.ColumnAlias; - return true; - } - return false; - } - - public bool IsCompatible(DbExpressionKind expressionKind) - { - switch (expressionKind) - { - case DbExpressionKind.Filter: - return Where == null && Columns.Count == 0; - case DbExpressionKind.Project: - return Columns.Count == 0; - case DbExpressionKind.Limit: - return Limit == null; - case DbExpressionKind.Skip: - return Skip == null; - case DbExpressionKind.Sort: - return Columns.Count == 0 && - GroupBy == null && - OrderBy == null; - case DbExpressionKind.GroupBy: - return Columns.Count == 0 && - GroupBy == null && - OrderBy == null && - Limit == null; - } - throw new InvalidOperationException(); - } - - internal override void Accept(SqlFragmentVisitor visitor) - { - if (From != null) From.Accept(visitor); - if (Columns != null) - { - foreach (ColumnFragment cf in Columns) - { - cf.Accept(visitor); - } - } - if (Where != null) Where.Accept(visitor); - if (Limit != null) Limit.Accept(visitor); - if (Skip != null) Skip.Accept(visitor); - if (GroupBy != null) - { - foreach (SqlFragment grp in GroupBy) - { - grp.Accept(visitor); - } - } - if (OrderBy != null) - { - foreach (SortFragment sort in OrderBy) - { - sort.Accept(visitor); - } - } - - visitor.Visit(this); - - } - } -} +// Copyright © 2008, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Data.Entity.Core.Common.CommandTrees; +using System.Data.Entity.Core.Metadata.Edm; +using System.Diagnostics; +using System.Text; + + +namespace MySql.Data.EntityFramework +{ + class SelectStatement : InputFragment + { + private Dictionary columnHash; + private bool hasRenamedColumns; + private SqlGenerator generator; + + public SelectStatement(SqlGenerator generator) + : base(null) + { + Columns = new List(); + this.generator = generator; + } + + public InputFragment From; + public List Columns { get; private set; } + public SqlFragment Where; + public SqlFragment Limit; + public SqlFragment Skip; + public List GroupBy { get; internal set; } + public List OrderBy { get; internal set; } + public bool IsDistinct; + + public void AddGroupBy(SqlFragment f) + { + if (GroupBy == null) + GroupBy = new List(); + GroupBy.Add(f); + } + + public void AddOrderBy(SortFragment f) + { + if (OrderBy == null) + OrderBy = new List(); + OrderBy.Add(f); + } + + public override void WriteSql(StringBuilder sql) + { + if (IsWrapped) + sql.Append("("); + sql.Append("SELECT "); + if (IsDistinct) + sql.Append(" DISTINCT "); + + WriteList(Columns, sql); + + if (From != null) + { + sql.Append("\r\n FROM "); + From.WriteSql(sql); + } + if (Where != null) + { + sql.Append("\r\n WHERE "); + Where.WriteSql(sql); + } + if (GroupBy != null) + { + sql.Append("\r\n GROUP BY "); + WriteList(GroupBy, sql); + } + WriteOrderBy(sql); + if (Limit != null || Skip != null) + { + sql.Append(" LIMIT "); + if (Skip != null) + sql.AppendFormat("{0},", Skip); + if (Limit == null) + sql.Append("18446744073709551615"); + else + sql.AppendFormat("{0}", Limit); + } + if (IsWrapped) + { + sql.Append(")"); + if (Name != null) + sql.AppendFormat(" AS {0}", QuoteIdentifier(Name)); + } + } + + private void WriteOrderBy(StringBuilder sql) + { + if (OrderBy == null) return; + sql.Append("\r\n ORDER BY "); + WriteList(OrderBy, sql); + } + + public override void Wrap(Scope scope) + { + base.Wrap(scope); + + // now we need to add default columns if necessary + if (Columns.Count == 0) + AddDefaultColumns(scope); + + // next we need to remove child extents of the select from scope + if (Name != null) + { + scope.Remove(this); + scope.Add(Name, this); + } + } + + void AddDefaultColumns(Scope scope) + { + if (columnHash == null) + columnHash = new Dictionary(); + + List columns = GetDefaultColumnsForFragment(From); + bool Exists = false; + if (From is TableFragment && scope.GetFragment((From as TableFragment).Table) == null) + { + scope.Add((From as TableFragment).Table, From); + Exists = true; + } + + foreach (ColumnFragment column in columns) + { + // first we need to set the input for this column + InputFragment input = scope.FindInputFromProperties(column.PropertyFragment); + column.TableName = input.Name; + + // then we rename the column if necessary + if (columnHash.ContainsKey(column.ColumnName.ToUpper())) + { + column.ColumnAlias = MakeColumnNameUnique(column.ColumnName); + columnHash.Add(column.ColumnAlias, column); + } + else + columnHash.Add(column.ColumnName.ToUpper(), column); + Columns.Add(column); + } + if (Exists) + { + scope.Remove((From as TableFragment).Table, From); + } + } + + internal void AddColumn(ColumnFragment column, Scope scope) + { + InputFragment input = scope.FindInputFromProperties(column.PropertyFragment); + column.TableName = input.Name; + + // then we rename the column if necessary + if (columnHash.ContainsKey(column.ColumnName.ToUpper())) + { + column.ColumnAlias = MakeColumnNameUnique(column.ColumnName); + columnHash.Add(column.ColumnAlias, column); + } + else + { + if (!string.IsNullOrEmpty(column.ColumnAlias)) + columnHash.Add(column.ColumnAlias.ToUpper(), column); + else + columnHash.Add(column.ColumnName.ToUpper(), column); + } + Columns.Add(column); + } + + List GetDefaultColumnsForFragment(InputFragment input) + { + List columns = new List(); + + if (input is TableFragment) + { + return GetDefaultColumnsForTable(input as TableFragment); + } + else if (input is JoinFragment || input is UnionFragment) + { + Debug.Assert(input.Left != null); + if (input is UnionFragment) + { + generator.Ops.Push(OpType.Union); + } + columns = GetDefaultColumnsForFragment(input.Left); + if (input is JoinFragment && input.Right != null) + { + List right = GetDefaultColumnsForFragment(input.Right); + columns.AddRange(right); + } + if (input is UnionFragment) + { + generator.Ops.Pop(); + } + } + else if (input is SelectStatement) + { + SelectStatement select = input as SelectStatement; + foreach (ColumnFragment cf in select.Columns) + { + ColumnFragment newColumn = new ColumnFragment(cf.TableName, + string.IsNullOrEmpty(cf.ColumnAlias) ? cf.ActualColumnName : cf.ColumnAlias + ); + if (generator.GetTopOp() == OpType.Join) + { + newColumn.ColumnAlias = cf.ColumnAlias; + newColumn.PushInput(cf.ActualColumnName); + if (cf.TableName != null) + newColumn.PushInput(cf.TableName); + } + else + { + newColumn.PushInput(cf.ActualColumnName); + if (cf.TableName != null && cf.ColumnAlias == null) + newColumn.PushInput(cf.TableName); + } + if (select.Name != null) + { + newColumn.PushInput(select.Name); // add the scope + } + columns.Add(newColumn); + } + return columns; + } + else + throw new NotImplementedException(); + if (!String.IsNullOrEmpty(input.Name) && input.Name != From.Name) + foreach (ColumnFragment c in columns) + { + c.PushInput(input.Name); + } + return columns; + } + + List GetDefaultColumnsForTable(TableFragment table) + { + List columns = new List(); + + foreach (EdmProperty property in Metadata.GetProperties(table.Type.EdmType)) + { + ColumnFragment col = new ColumnFragment(table.Name, property.Name); + col.PushInput(property.Name); + col.PushInput((table.Name != null) ? table.Name : table.Table); + columns.Add(col); + } + return columns; + } + + private string MakeColumnNameUnique(string baseName) + { + int i = 1; + baseName = baseName.ToUpper(); + hasRenamedColumns = true; + while (true) + { + string name = String.Format("{0}{1}", baseName, i); + if (!columnHash.ContainsKey(name)) return name; + i++; + } + } + + public bool HasDifferentNameForColumn(ColumnFragment column) + { + if (!hasRenamedColumns) return false; + foreach (ColumnFragment c in Columns) + { + if (!c.Equals(column)) continue; + if (String.IsNullOrEmpty(c.ColumnAlias)) return false; + column.ColumnName = c.ColumnAlias; + return true; + } + return false; + } + + public bool IsCompatible(DbExpressionKind expressionKind) + { + switch (expressionKind) + { + case DbExpressionKind.Filter: + return Where == null && Columns.Count == 0; + case DbExpressionKind.Project: + return Columns.Count == 0; + case DbExpressionKind.Limit: + return Limit == null; + case DbExpressionKind.Skip: + return Skip == null; + case DbExpressionKind.Sort: + return Columns.Count == 0 && + GroupBy == null && + OrderBy == null; + case DbExpressionKind.GroupBy: + return Columns.Count == 0 && + GroupBy == null && + OrderBy == null && + Limit == null; + } + throw new InvalidOperationException(); + } + + internal override void Accept(SqlFragmentVisitor visitor) + { + if (From != null) From.Accept(visitor); + if (Columns != null) + { + foreach (ColumnFragment cf in Columns) + { + cf.Accept(visitor); + } + } + if (Where != null) Where.Accept(visitor); + if (Limit != null) Limit.Accept(visitor); + if (Skip != null) Skip.Accept(visitor); + if (GroupBy != null) + { + foreach (SqlFragment grp in GroupBy) + { + grp.Accept(visitor); + } + } + if (OrderBy != null) + { + foreach (SortFragment sort in OrderBy) + { + sort.Accept(visitor); + } + } + + visitor.Visit(this); + + } + } +} diff --git a/EntityFramework/src/Statements/UpdateStatement.cs b/EntityFramework/src/Statements/UpdateStatement.cs new file mode 100644 index 000000000..110106dd4 --- /dev/null +++ b/EntityFramework/src/Statements/UpdateStatement.cs @@ -0,0 +1,79 @@ +// Copyright © 2008, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Text; +using System.Collections.Generic; +namespace MySql.Data.EntityFramework +{ + class UpdateStatement : SqlFragment + { + public UpdateStatement() + { + Properties = new List(); + Values = new List(); + } + + public SqlFragment Target { get; set; } + public List Properties { get; private set; } + public List Values { get; private set; } + public SqlFragment Where { get; set; } + public SelectStatement ReturningSelect; + + public override void WriteSql(StringBuilder sql) + { + sql.Append("UPDATE "); + Target.WriteSql(sql); + sql.Append(" SET "); + + string seperator = ""; + for (int i = 0; i < Properties.Count; i++) + { + sql.Append(seperator); + Properties[i].WriteSql(sql); + sql.Append("="); + Values[i].WriteSql(sql); + seperator = ", "; + } + if (Where != null) + { + sql.Append(" WHERE "); + Where.WriteSql(sql); + } + if (ReturningSelect != null) + { + sql.Append(";\r\n"); + ReturningSelect.WriteSql(sql); + } + } + + internal override void Accept(SqlFragmentVisitor visitor) + { + throw new System.NotImplementedException(); + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/AggregateOperators.cs b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/AggregateOperators.cs new file mode 100644 index 000000000..2a19d098a --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/AggregateOperators.cs @@ -0,0 +1,213 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Linq; +using System.Data.Common; +using System.Data; +using NUnit.Framework; + +namespace MySql.Data.EntityFramework.Tests +{ + public class AggregateOperators : DefaultFixture + { + [Test] + public void CountSimple() + { + TestESql( + "SELECT VALUE Count(b.Id) FROM Books as b", + @"SELECT `GroupBy1`.`A1` AS `C1` FROM(SELECT COUNT(`Extent1`.`Id`) AS `A1` + FROM `Books` AS `Extent1`) AS `GroupBy1`"); + } + + [Test] + public void BigCountSimple() + { + TestESql( + "SELECT VALUE BigCount(b.Id) FROM Books as b", + @"SELECT `GroupBy1`.`A1` AS `C1` FROM (SELECT COUNT(`Extent1`.`Id`) AS `A1` + FROM `Books` AS `Extent1`) AS `GroupBy1`"); + } + + [Test] + public void CountWithPredicate() + { + TestESql("SELECT VALUE Count(b.Id) FROM Books AS b WHERE b.Pages > 3", + @"SELECT `GroupBy1`.`A1` AS `C1` FROM (SELECT COUNT(`Extent1`.`Id`) AS `A1` + FROM `Books` AS `Extent1` WHERE `Extent1`.`Pages` > 3) AS `GroupBy1`"); + } + + [Test] + public void MinSimple() + { + TestESql( + "SELECT VALUE MIN(b.Pages) FROM Books AS b", + @"SELECT `GroupBy1`.`A1` AS `C1` FROM (SELECT MIN(`Extent1`.`Pages`) AS `A1` + FROM `Books` AS `Extent1`) AS `GroupBy1`"); + } + + [Test] + public void MinWithPredicate() + { + TestESql( + "SELECT Min(b.Pages) FROM Books AS b WHERE b.Author.Age > 50", + @"SELECT 1 AS `C1`, `GroupBy1`.`A1` AS `C2` FROM(SELECT MIN(`Extent1`.`Pages`) AS `A1` + FROM `Books` AS `Extent1` INNER JOIN `Authors` AS `Extent2` ON `Extent1`.`Author_Id` = `Extent2`.`Id` + WHERE `Extent2`.`Age` > 50) AS `GroupBy1`"); + } + + [Test] + public void MinWithGrouping() + { + TestESql( + "SELECT VALUE Min(b.Pages) FROM Books AS b GROUP BY b.Author.Id", + @"SELECT `GroupBy1`.`A1` AS `C1` FROM (SELECT `Extent1`.`Author_Id` AS `K1`, + MIN(`Extent1`.`Pages`) AS `A1` FROM `Books` AS `Extent1` GROUP BY + `Extent1`.`Author_Id`) AS `GroupBy1`" + ); + } + + [Test] + public void MaxSimple() + { + TestESql( + "SELECT VALUE MAX(b.Pages) FROM Books AS b", + @"SELECT `GroupBy1`.`A1` AS `C1` FROM (SELECT MAX(`Extent1`.`Pages`) AS `A1` + FROM `Books` AS `Extent1`) AS `GroupBy1`"); + } + + [Test] + public void MaxWithPredicate() + { + TestESql( + "SELECT MAX(b.Pages) FROM Books AS b WHERE b.Author.Id=2", + @"SELECT 1 AS `C1`, `GroupBy1`.`A1` AS `C2` FROM (SELECT MAX(`Extent1`.`Pages`) AS `A1` + FROM `Books` AS `Extent1` WHERE `Extent1`.`Author_Id` = 2) AS `GroupBy1`"); + } + + [Test] + public void MaxWithGrouping() + { + TestESql( + "SELECT VALUE MAX(b.Pages) FROM Books AS b GROUP BY b.Author.Id", + @"SELECT `GroupBy1`.`A1` AS `C1` FROM (SELECT `Extent1`.`Author_Id` AS `K1`, MAX(`Extent1`.`Pages`) AS `A1` + FROM `Books` AS `Extent1` GROUP BY `Extent1`.`Author_Id`) AS `GroupBy1`"); + } + + [Test] + public void AverageSimple() + { + TestESql( + "SELECT VALUE Avg(b.Pages) FROM Books AS b", + @"SELECT `GroupBy1`.`A1` AS `C1` FROM (SELECT AVG(`Extent1`.`Pages`) AS `A1` + FROM `Books` AS `Extent1`) AS `GroupBy1`"); + } + + [Test] + public void AverageWithPredicate() + { + TestESql( + "SELECT VALUE AVG(b.Pages) FROM Books AS b WHERE b.Author.Id = 3", + @"SELECT `GroupBy1`.`A1` AS `C1` FROM (SELECT AVG(`Extent1`.`Pages`) AS `A1` + FROM `Books` AS `Extent1` WHERE `Extent1`.`Author_Id` = 3) AS `GroupBy1`"); + } + + [Test] + public void AverageWithGrouping() + { + TestESql( + "SELECT AVG(b.Pages) FROM Books AS b GROUP BY b.Author.Id", + @"SELECT 1 AS `C1`, `GroupBy1`.`A1` AS `C2` FROM (SELECT `Extent1`.`Author_Id` AS `K1`, + AVG(`Extent1`.`Pages`) AS `A1` FROM `Books` AS `Extent1` GROUP BY `Extent1`.`Author_Id`) AS `GroupBy1`"); + } + + [Test] + public void SumSimple() + { + TestESql( + "SELECT VALUE SUM(b.Pages) FROM Books AS b", + @"SELECT `GroupBy1`.`A1` AS `C1` FROM (SELECT SUM(`Extent1`.`Pages`) AS `A1` + FROM `Books` AS `Extent1`) AS `GroupBy1`"); + } + + [Test] + public void SumWithPredicate() + { + TestESql( + "SELECT VALUE SUM(b.Pages) FROM Books AS b WHERE b.Author.Id = 3", + @"SELECT `GroupBy1`.`A1` AS `C1` FROM (SELECT SUM(`Extent1`.`Pages`) AS `A1` + FROM `Books` AS `Extent1` WHERE `Extent1`.`Author_Id` = 3) AS `GroupBy1`"); + } + + [Test] + public void SumWithGrouping() + { + TestESql( + "SELECT VALUE SUM(b.Pages) FROM Books AS b GROUP BY b.Author.Id", + @"SELECT `GroupBy1`.`A1` AS `C1` FROM (SELECT `Extent1`.`Author_Id` AS `K1`, + SUM(`Extent1`.`Pages`) AS `A1` FROM `Books` AS `Extent1` GROUP BY + `Extent1`.`Author_Id`) AS `GroupBy1`"); + } + + [Test] + public void MaxInSubQuery1() + { + TestESql( + "SELECT VALUE a FROM Authors AS a WHERE a.Id = MAX(SELECT VALUE b.Author.Id FROM Books AS b)", + @"SELECT `Extent1`.`Id`, `Extent1`.`Name`, `Extent1`.`Age`, `Extent1`.`Address_City`, `Extent1`.`Address_Street`, + `Extent1`.`Address_State`, `Extent1`.`Address_ZipCode` FROM `Authors` AS `Extent1` INNER JOIN (SELECT + MAX(`Extent2`.`Author_Id`) AS `A1` FROM `Books` AS `Extent2`) AS `GroupBy1` ON `Extent1`.`Id` = `GroupBy1`.`A1`"); + } + + [Test] + public void MaxInSubQuery2() + { + TestESql( + "SELECT VALUE a FROM Authors AS a WHERE a.Id = ANYELEMENT(SELECT VALUE MAX(b.Author.Id) FROM Books AS b)", + @"SELECT `Extent1`.`Id`, `Extent1`.`Name`, `Extent1`.`Age`, `Extent1`.`Address_City`, `Extent1`.`Address_Street`, + `Extent1`.`Address_State`, `Extent1`.`Address_ZipCode` FROM `Authors` AS `Extent1` INNER JOIN (SELECT + MAX(`Extent2`.`Author_Id`) AS `A1` FROM `Books` AS `Extent2`) AS `GroupBy1` ON `Extent1`.`Id` = `GroupBy1`.`A1`"); + } + + /// + /// This test the fix for bug 67377. + /// + [Test] + public void FirstOrDefaultNested() + { + using (DefaultContext ctx = GetDefaultContext()) + { + var q = ctx.Authors.Where(p => p.Id == 1).Select(p => new { AuthorId = p.Id, FirstBook = (int?)p.Books.FirstOrDefault().Id }); + var s = q.ToString(); + CheckSql(q.ToString(), + @"SELECT `Extent1`.`Id`, (SELECT `Extent2`.`Id` FROM `Books` AS `Extent2` WHERE `Extent1`.`Id` = `Extent2`.`Author_Id` LIMIT 1) AS `C1` + FROM `Authors` AS `Extent1` WHERE 1 = `Extent1`.`Id`"); + } + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/App.Config b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/App.Config new file mode 100644 index 000000000..3a61b8166 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/App.Config @@ -0,0 +1,20 @@ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/CanonicalFunctions.cs b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/CanonicalFunctions.cs new file mode 100644 index 000000000..1d9e66635 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/CanonicalFunctions.cs @@ -0,0 +1,412 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Linq; +using NUnit.Framework; +using System.Data.Common; +using System.Data.Entity.Core.Objects; +using System.Data.Entity.Infrastructure; + +namespace MySql.Data.EntityFramework.Tests +{ + public class CanonicalFunctions : DefaultFixture + { + public override void LoadData() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + ctx.Products.Add(new Product() { Id = 1, Name = "Garbage Truck", Weight = 8.865f }); + ctx.Products.Add(new Product() { Id = 2, Name = "Fire Truck", Weight = 12.623f }); + ctx.Products.Add(new Product() { Id = 3, Name = "Hula Hoop", Weight = 2.687f }); + ctx.SaveChanges(); + } + } + + //private EntityConnection GetEntityConnection() + //{ + // string connectionString = String.Format( + // "metadata=TestDB.csdl|TestDB.msl|TestDB.ssdl;provider=MySql.Data.MySqlClient; provider connection string=\"{0}\"", GetConnectionString(true)); + // EntityConnection connection = new EntityConnection(connectionString); + // return connection; + //} + + [Test] + public void Bitwise() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + var context = ((IObjectContextAdapter)ctx).ObjectContext; + ObjectQuery q = context.CreateQuery("BitwiseAnd(255,15)"); + foreach (int i in q) + Assert.That(i, Is.EqualTo(15)); + q = context.CreateQuery("BitwiseOr(240,31)"); + foreach (int i in q) + Assert.That(i, Is.EqualTo(255)); + q = context.CreateQuery("BitwiseXor(255,15)"); + foreach (int i in q) + Assert.That(i, Is.EqualTo(240)); + } + } + + [Test] + public void CurrentDateTime() + { + DateTime current = DateTime.Now; + + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + var context = ((IObjectContextAdapter)ctx).ObjectContext; + ObjectQuery q = context.CreateQuery("CurrentDateTime()"); + foreach (DateTime dt in q) + { + Assert.That(dt.Year, Is.EqualTo(current.Year)); + Assert.That(dt.Month, Is.EqualTo(current.Month)); + Assert.That(dt.Day, Is.EqualTo(current.Day)); + // we don't check time as that will be always be different + } + } + } + + [Test] + public void YearMonthDay() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + var context = ((IObjectContextAdapter)ctx).ObjectContext; + ObjectQuery q = context.CreateQuery( + @"SELECT c.DateBegan, Year(c.DateBegan), Month(c.DateBegan), Day(c.DateBegan) + FROM Companies AS c WHERE c.Id=1"); + foreach (DbDataRecord record in q) + { + Assert.That(record[1], Is.EqualTo(1996)); + Assert.That(record[2], Is.EqualTo(11)); + Assert.That(record[3], Is.EqualTo(15)); + } + } + } + + [Test] + public void HourMinuteSecond() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + var context = ((IObjectContextAdapter)ctx).ObjectContext; + ObjectQuery q = context.CreateQuery( + @"SELECT c.DateBegan, Hour(c.DateBegan), Minute(c.DateBegan), Second(c.DateBegan) + FROM Companies AS c WHERE c.Id=1"); + foreach (DbDataRecord record in q) + { + Assert.That(record[1], Is.EqualTo(5)); + Assert.That(record[2], Is.EqualTo(18)); + Assert.That(record[3], Is.EqualTo(23)); + } + } + } + + [Test] + public void IndexOf() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + var context = ((IObjectContextAdapter)ctx).ObjectContext; + ObjectQuery q = context.CreateQuery(@"IndexOf('needle', 'haystackneedle')"); + foreach (int index in q) + Assert.That(index, Is.EqualTo(9)); + + q = context.CreateQuery(@"IndexOf('haystack', 'needle')"); + foreach (int index in q) + Assert.That(index, Is.EqualTo(0)); + } + } + + [Test] + public void LeftRight() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + var context = ((IObjectContextAdapter)ctx).ObjectContext; + string entitySQL = "CONCAT(LEFT('foo',3),RIGHT('bar',3))"; + ObjectQuery query = context.CreateQuery(entitySQL); + foreach (string s in query) + Assert.That(s, Is.EqualTo("foobar")); + + entitySQL = "CONCAT(LEFT('foobar',3),RIGHT('barfoo',3))"; + query = context.CreateQuery(entitySQL); + foreach (string s in query) + Assert.That(s, Is.EqualTo("foofoo")); + + entitySQL = "CONCAT(LEFT('foobar',8),RIGHT('barfoo',8))"; + query = context.CreateQuery(entitySQL); + foreach (string s in query) + Assert.That(s, Is.EqualTo("foobarbarfoo")); + } + } + + [Test] + public void Length() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + var context = ((IObjectContextAdapter)ctx).ObjectContext; + string entitySQL = "Length('abc')"; + ObjectQuery query = context.CreateQuery(entitySQL); + foreach (int len in query) + Assert.That(len, Is.EqualTo(3)); + } + } + + [Test] + public void Trims() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + var context = ((IObjectContextAdapter)ctx).ObjectContext; + ObjectQuery query = context.CreateQuery("LTrim(' text ')"); + foreach (string s in query) + Assert.That(s, Is.EqualTo("text ")); + query = context.CreateQuery("RTrim(' text ')"); + foreach (string s in query) + Assert.That(s, Is.EqualTo(" text")); + query = context.CreateQuery("Trim(' text ')"); + foreach (string s in query) + Assert.That(s, Is.EqualTo("text")); + } + } + + [Test] + public void Round() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + var context = ((IObjectContextAdapter)ctx).ObjectContext; + ObjectQuery q = context.CreateQuery(@" + SELECT p.Id, p.Weight, + Round(p.Weight) AS [Rounded Weight], + Floor(p.Weight) AS [Floor of Weight], + Ceiling(p.Weight) AS [Ceiling of Weight] + FROM Products AS p WHERE p.Id=1"); + foreach (DbDataRecord r in q) + { + Assert.That(r[0], Is.EqualTo(1)); + Assert.That((float)r[1], Is.EqualTo(8.865f)); + Assert.That(Convert.ToInt32(r[2]), Is.EqualTo(9)); + Assert.That(Convert.ToInt32(r[3]), Is.EqualTo(8)); + Assert.That(Convert.ToInt32(r[4]), Is.EqualTo(9)); + } + } + } + + [Test] + public void Substring() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + var context = ((IObjectContextAdapter)ctx).ObjectContext; + ObjectQuery query = context.CreateQuery("SUBSTRING('foobarfoo',4,3)"); + query = context.CreateQuery("SUBSTRING('foobarfoo',4,30)"); + foreach (string s in query) + Assert.That(s, Is.EqualTo("barfoo")); + } + } + + [Test] + public void ToUpperToLowerReverse() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + var context = ((IObjectContextAdapter)ctx).ObjectContext; + ObjectQuery q = context.CreateQuery( + @"SELECT ToUpper(c.Name),ToLower(c.Name), + Reverse(c.Name) FROM Companies AS c WHERE c.Id=1"); + foreach (DbDataRecord r in q) + { + Assert.That(r[0], Is.EqualTo("HASBRO")); + Assert.That(r[1], Is.EqualTo("hasbro")); + Assert.That(r[2], Is.EqualTo("orbsaH")); + } + } + } + + [Test] + public void Replace() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + var context = ((IObjectContextAdapter)ctx).ObjectContext; + ObjectQuery q = context.CreateQuery( + @"Replace('abcdefghi', 'def', 'zzz')"); + foreach (string s in q) + Assert.That(s, Is.EqualTo("abczzzghi")); + } + } + + [Test] + public void CanRoundToNonZeroDigits() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + var context = ((IObjectContextAdapter)ctx).ObjectContext; + DbDataRecord product = context.CreateQuery(@" + SELECT p.Id, p.Weight, + Round(p.Weight, 2) AS [Rounded Weight] + FROM Products AS p WHERE p.Id=1").First(); + + Assert.That((float)product[1], Is.EqualTo((float)8.865)); + Assert.That((double)product[2], Is.EqualTo((double)8.86) ); + } + } + + /// + /// Fix for bug "Using LiContains in Linq to EF generates many ORs instead of more efficient IN" + /// (http://bugs.mysql.com/bug.php?id=64934 / http://www.google.com ). + /// + [Test] + public void ListContains2In() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + int[] Ages = new int[] { 8, 9, 10 }; + var q = from e in ctx.Products + where Ages.Contains(e.MinAge) + orderby e.Name + select e; + var sql = q.ToString(); + CheckSql(sql, + @"SELECT `Extent1`.`Id`, `Extent1`.`Name`, `Extent1`.`MinAge`, `Extent1`.`Weight`, + `Extent1`.`CreatedDate` FROM `Products` AS `Extent1` WHERE `Extent1`.`MinAge` IN ( 8,9,10 ) + ORDER BY `Extent1`.`Name` ASC"); + } + } + + [Test] + public void ComplexListIn() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + int[] Ages = new int[] { 8, 9, 10 }; + var q = from e in ctx.Products + where (Ages.Contains(e.MinAge) && e.Name.Contains("Hoop")) || + !Ages.Contains(e.MinAge) + orderby e.Name + select e; + var sql = q.ToString(); + CheckSql(sql, + @"SELECT `Extent1`.`Id`, `Extent1`.`Name`, `Extent1`.`MinAge`, `Extent1`.`Weight`, `Extent1`.`CreatedDate` + FROM `Products` AS `Extent1` WHERE ((`Extent1`.`MinAge` IN ( 8,9,10 )) AND + (`Extent1`.`Name` LIKE @gp1)) OR (`Extent1`.`MinAge` NOT IN ( 8,9,10 )) ORDER BY + `Extent1`.`Name` ASC"); + } + } + + [Test] + public void MultipleOrs() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + // 3rd test, using only ||'s + var q = from e in ctx.Products + where e.MinAge == 37 || e.MinAge == 38 || e.MinAge == 39 || + e.MinAge == 40 || e.MinAge == 40 || e.MinAge == 41 || + e.MinAge == 42 || e.MinAge == 43 + orderby e.Name + select e; + var sql = q.ToString(); + CheckSql(sql, + @"SELECT `Extent1`.`Id`, `Extent1`.`Name`, `Extent1`.`MinAge`, `Extent1`.`Weight`, `Extent1`.`CreatedDate` + FROM `Products` AS `Extent1` WHERE (((((((37 = `Extent1`.`MinAge`) OR (38 = `Extent1`.`MinAge`)) OR + (39 = `Extent1`.`MinAge`)) OR (40 = `Extent1`.`MinAge`)) OR (40 = `Extent1`.`MinAge`)) OR + (41 = `Extent1`.`MinAge`)) OR (42 = `Extent1`.`MinAge`)) OR (43 = `Extent1`.`MinAge`) + ORDER BY `Extent1`.`Name` ASC"); + } + } + + /// + /// Fix for bug LINQ to SQL's StartsWith() and Contains() generate slow LOCATE() + /// instead of LIKE (bug http://bugs.mysql.com/bug.php?id=64935 / http://clustra.no.oracle.com/orabugs/14009363). + /// + [Test] + public void ConversionToLike() + { + // Generates queries for each LIKE + wildcards case and checks SQL generated. + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + // Like 'pattern%' + var q = from c in ctx.Products + where c.Name.StartsWith("B") + orderby c.Name + select c; + var sql = q.ToString(); + CheckSql(sql, + @"SELECT `Extent1`.`Id`, `Extent1`.`Name`, `Extent1`.`MinAge`, `Extent1`.`Weight`, + `Extent1`.`CreatedDate` FROM `Products` AS `Extent1` WHERE `Extent1`.`Name` LIKE @gp1 + ORDER BY `Extent1`.`Name` ASC"); + + // Like '%pattern%' + q = from c in ctx.Products + where c.Name.Contains("r") + orderby c.Name + select c; + sql = q.ToString(); + CheckSql(sql, + @"SELECT `Extent1`.`Id`, `Extent1`.`Name`, `Extent1`.`MinAge`, `Extent1`.`Weight`, + `Extent1`.`CreatedDate` FROM `Products` AS `Extent1` WHERE `Extent1`.`Name` LIKE @gp1 + ORDER BY `Extent1`.`Name` ASC"); + + // Like '%pattern' + q = from c in ctx.Products + where c.Name.EndsWith("y") + orderby c.Name + select c; + sql = q.ToString(); + CheckSql(sql, + @"SELECT `Extent1`.`Id`, `Extent1`.`Name`, `Extent1`.`MinAge`, `Extent1`.`Weight`, `Extent1`.`CreatedDate` + FROM `Products` AS `Extent1` WHERE `Extent1`.`Name` LIKE @gp1 ORDER BY `Extent1`.`Name` ASC"); + } + } + + ///// + ///// Tests fix for bug http://bugs.mysql.com/bug.php?id=69409, Entity Framework Syntax Error in Where clause. + ///// + [Test] + public void EFSyntaxErrorApostrophe() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + var q = from c in ctx.Products + where c.Name.EndsWith("y'") + orderby c.Name + select c; + var sql = q.ToString(); + CheckSql(sql, + @"SELECT `Extent1`.`Id`, `Extent1`.`Name`, `Extent1`.`MinAge`, `Extent1`.`Weight`, `Extent1`.`CreatedDate` + FROM `Products` AS `Extent1` WHERE `Extent1`.`Name` LIKE @gp1 ORDER BY `Extent1`.`Name` ASC"); + } + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/DataTypeTests.cs b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/DataTypeTests.cs new file mode 100644 index 000000000..7e5471d39 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/DataTypeTests.cs @@ -0,0 +1,162 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Linq; +using NUnit.Framework; +using MySql.Data.MySqlClient; +using System.Data; +using System.Globalization; +using System.Threading; + +namespace MySql.Data.EntityFramework.Tests +{ + public class DataTypeTests : DefaultFixture + { + /// + /// Bug #45457 DbType Time is not supported in entity framework + /// + [Test] + public void TimeType() + { + using (DefaultContext ctx = GetDefaultContext()) + { + TimeSpan birth = new TimeSpan(11, 3, 2); + + Child c = new Child(); + c.ChildId = "ABC"; + c.Name = "first"; + c.BirthTime = birth; + c.Label = Guid.NewGuid(); + ctx.Children.Add(c); + ctx.SaveChanges(); + + Child d = ctx.Children.Where(x => x.ChildId == "ABC").Single(); + Assert.That(d.BirthTime, Is.EqualTo(birth)); + } + } + + /// + /// Bug #44455 insert and update error with entity framework + /// + [Test] + public void DoubleValuesNonEnglish() + { + CultureInfo curCulture = Thread.CurrentThread.CurrentCulture; + CultureInfo curUICulture = Thread.CurrentThread.CurrentUICulture; + CultureInfo newCulture = new CultureInfo("da-DK"); + Thread.CurrentThread.CurrentCulture = newCulture; + Thread.CurrentThread.CurrentUICulture = newCulture; + + try + { + using (DefaultContext ctx = GetDefaultContext()) + { + Product p = new Product(); + p.Name = "New Product"; + p.Weight = 8.65f; + p.CreatedDate = DateTime.Now; + ctx.Products.Add(p); + ctx.SaveChanges(); + } + } + finally + { + Thread.CurrentThread.CurrentCulture = curCulture; + Thread.CurrentThread.CurrentUICulture = curUICulture; + } + } + + /// + /// Bug #46311 TimeStamp table column Entity Framework issue. + /// + [Ignore("Fix Me")] + public void TimestampColumn() + { + DateTime now = DateTime.Now; + + using (DefaultContext ctx = GetDefaultContext()) + { + Product p = new Product() { Name = "My Product", MinAge = 7, Weight = 8.0f }; + ctx.Products.Add(p); + ctx.SaveChanges(); + + p = ctx.Products.First(); + p.CreatedDate = now; + ctx.SaveChanges(); + + p = ctx.Products.First(); + Assert.That(p.CreatedDate, Is.EqualTo(now)); + } + } + + /// + /// Bug #48417 Invalid cast from 'System.String' to 'System.Guid' + /// + [Test] + public void GuidType() + { + using (DefaultContext ctx = GetDefaultContext()) + { + TimeSpan birth = new TimeSpan(11, 3, 2); + Guid g = Guid.NewGuid(); + + Child c = new Child(); + c.ChildId = "GUID"; + c.Name = "first"; + c.BirthTime = birth; + c.Label = g; + ctx.Children.Add(c); + ctx.SaveChanges(); + + Child d = ctx.Children.Where(x => x.ChildId == "GUID").Single(); + Assert.That(d.Label, Is.EqualTo(g)); + + } + } + + /// + /// Bug #62246 Connector/NET Incorrectly Maps Decimal To AnsiString + /// + [Test] + public void CanSetDbTypeDecimalFromNewDecimalParameter() + { + MySqlParameter newDecimalParameter = new MySqlParameter + { + ParameterName = "TestNewDecimal", + Size = 10, + Scale = 2, + MySqlDbType = MySqlDbType.NewDecimal, + Value = 1111111.12, + IsNullable = true + }; + + Assert.That(newDecimalParameter.DbType, Is.EqualTo(DbType.Decimal)); + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/DatesTypesTests.cs b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/DatesTypesTests.cs new file mode 100644 index 000000000..801858c3c --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/DatesTypesTests.cs @@ -0,0 +1,98 @@ +// Copyright © 2011, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using NUnit.Framework; +using MySql.Data.MySqlClient; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Data.Entity; +using System.Data.Entity.Infrastructure; +using System.Data; + +namespace MySql.Data.EntityFramework.Tests +{ + public class Widget + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public DateTime DateCreated { get; set; } + + public DateTime Timestamp { get; set; } + + public DateTime DateTimeWithPrecision { get; set; } + } + + public class TestContext : DbContext + { + public TestContext(string connStr) : base(connStr) + { + Database.SetInitializer(null); + } + + protected override void OnModelCreating(DbModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + modelBuilder.Entity() + .Property(e => e.DateTimeWithPrecision) + .HasPrecision(6); + } + + public DbSet Widgets { get; set; } + } + + public class DatesTypesTests : DefaultFixture + { + [Test] + public void CanCreateDBScriptWithDateTimePrecision() + { + Assume.That(Version >= new Version(5, 6, 5)); + + using (var ctx = new TestContext(ConnectionString)) + { + var script = new MySqlScript(Connection); + var context = ((IObjectContextAdapter)ctx).ObjectContext; + script.Query = context.CreateDatabaseScript(); + script.Execute(); + + DataTable schema = Connection.GetSchema("COLUMNS", new string[] { null, Connection.Database, "widgets" }); + + DataRow row = schema.Rows[3]; + Assert.That((string)row["DATA_TYPE"], Is.EqualTo("datetime")); + Assert.That((string)row["IS_NULLABLE"], Is.EqualTo("NO")); + if (Version < new Version(8, 0)) + Assert.That((UInt64)row["DATETIME_PRECISION"], Is.EqualTo((uint)6)); + else + Assert.That((UInt32)row["DATETIME_PRECISION"], Is.EqualTo((uint)6)); + } + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/DefaultContext.cs b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/DefaultContext.cs new file mode 100644 index 000000000..4c2b5ca82 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/DefaultContext.cs @@ -0,0 +1,152 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Data.Entity; + +namespace MySql.Data.EntityFramework.Tests +{ + public class Book + { + public int Id { get; set; } + public string Name { get; set; } + public DateTime PubDate { get; set; } + public Author Author { get; set; } + public int Pages { get; set; } + } + + public class Author + { + public int Id { get; set; } + public string Name { get; set; } + public int Age { get; set; } + public List Books { get; set; } + public Address Address { get; set; } + } + + public class Product + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + public string Name { get; set; } + public int MinAge { get; set; } + public float Weight { get; set; } + [Required, DatabaseGenerated(DatabaseGeneratedOption.Computed)] + public DateTime CreatedDate { get; set; } + } + + public class Child + { + public string ChildId { get; set; } + public string Name { get; set; } + public Guid Label { get; set; } + public TimeSpan BirthTime { get; set; } + } + + public class ContractAuthor + { + public int Id { get; set; } + public Author Author { get; set; } + public DateTime StartDate { get; set; } + } + + [ComplexType] + public class Address + { + public string City { get; set; } + public string Street { get; set; } + public string State { get; set; } + public string ZipCode { get; set; } + } + + public class Company + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + public string Name { get; set; } + public DateTime DateBegan { get; set; } + public int NumEmployees { get; set; } + public Address Address { get; set; } + } + + [DbConfigurationType(typeof(MySqlEFConfiguration))] + public class DefaultContext : DbContext + { + public DefaultContext(string connStr) : base(connStr) + { + Database.SetInitializer(null); + } + + public DbSet Books { get; set; } + public DbSet Authors { get; set; } + public DbSet Products { get; set; } + public DbSet ContractAuthors { get; set; } + public DbSet Companies { get; set; } + public DbSet Children { get; set; } + public DbSet LongDataTests { get; set; } + } + + public class BlogContext : DbContext + { + public BlogContext(string connStr) : base(connStr) + { + Database.SetInitializer(null); + } + + public virtual DbSet User { get; set; } + + protected override void OnModelCreating(DbModelBuilder modelBuilder) + { + modelBuilder.Entity() + .Property(e => e.Name) + .IsUnicode(false); + } + } + + [Table("usertable", Schema = "blogcontext")] + public class User + { + [DatabaseGenerated(DatabaseGeneratedOption.None)] + public int Id { get; set; } + [StringLength(45)] + public string Name { get; set; } + } + + public class LongDataTest + { + public int Id { get; set; } + + [StringLength(15)] + public string Data { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/DefaultFixture.cs b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/DefaultFixture.cs new file mode 100644 index 000000000..8efdebde4 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/DefaultFixture.cs @@ -0,0 +1,179 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Data.Entity.Core.Objects; +using System.Text.RegularExpressions; +using System.Data.Entity.Infrastructure; +using NUnit.Framework; +using System; +using MySql.Data.MySqlClient; + +namespace MySql.Data.EntityFramework.Tests +{ + public class DefaultFixture + { + public string host { get; set; } + public string user { get; set; } + public string password { get; set; } + public uint Port { get; set; } + public string database { get; set; } + public Version version { get; set; } + public MySqlConnection Connection { get; set; } + public string ConnectionString { get; set; } + public bool NeedSetup { get; set; } + + public DefaultFixture() + { + NeedSetup = true; + } + + [OneTimeSetUp] + public void OneTimeSetup() + { + if (NeedSetup) + { + NeedSetup = false; + + database = "db-" + this.GetType().Name.ToLower(); + if (database.Length > 32) + database = database.Substring(0, 32); + + MySqlConnectionStringBuilder sb = new MySqlConnectionStringBuilder(); + sb.Server = "localhost"; + string port = Environment.GetEnvironmentVariable("MYSQL_PORT"); + sb.Port = Port = string.IsNullOrEmpty(port) ? 3306 : uint.Parse(port); + sb.UserID = "root"; + sb.Pooling = false; + sb.AllowUserVariables = true; + sb.Database = database; + ConnectionString = sb.ToString(); + + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + if (ctx.Database.Exists()) + ctx.Database.Delete(); + var context = ((IObjectContextAdapter)ctx).ObjectContext; + context.CreateDatabase(); + } + + Connection = new MySqlConnection(ConnectionString); + Connection.Open(); + LoadData(); + } + } + + [OneTimeTearDown] + public void OneTimeTearDown() + { + MySqlConnection.ClearAllPools(); + ExecSQL($"DROP DATABASE IF EXISTS `{Connection.Database}`"); + Connection.Close(); + } + + [SetUp] + public virtual void SetUp() + { + if (NeedSetup) + { + NeedSetup = false; + + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + if (ctx.Database.Exists()) + ctx.Database.Delete(); + var context = ((IObjectContextAdapter)ctx).ObjectContext; + context.CreateDatabase(); + } + + LoadData(); + } + } + + [TearDown] + public virtual void TearDown() { } + + public virtual void LoadData() { } + + public Version Version + { + get + { + if (version == null) + { + string versionString = Connection.ServerVersion; + int i = 0; + while (i < versionString.Length && + (Char.IsDigit(versionString[i]) || versionString[i] == '.')) + i++; + + version = new Version(versionString.Substring(0, i)); + } + return version; + } + } + + public void ExecSQL(string sql) + { + MySqlCommand cmd = new MySqlCommand(sql, Connection); + cmd.ExecuteNonQuery(); + } + + public static void CheckSql(string actual, string expected) + { + var exp = Regex.Replace(expected, @"\s", string.Empty); + var act = Regex.Replace(actual, @"\s", string.Empty); + Assert.That(exp, Is.EqualTo(act)); + } + + public static void CheckSqlContains(string actual, string expected) + { + var exp = Regex.Replace(expected, @"\s", string.Empty); + var act = Regex.Replace(actual, @"\s", string.Empty); + Assert.That(act.Contains(exp)); + } + + public DefaultContext GetDefaultContext() + { + return new DefaultContext(ConnectionString); + } + + public void TestESql(string eSql, string expected, params ObjectParameter[] parms) + { + using (DefaultContext ctx = GetDefaultContext()) + { + var context = ((IObjectContextAdapter)ctx).ObjectContext; + ObjectQuery q = context.CreateQuery(eSql); + foreach (var p in parms) + q.Parameters.Add(p); + + string sql = q.ToTraceString(); + CheckSql(sql, expected); + } + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/DeleteTests.cs b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/DeleteTests.cs new file mode 100644 index 000000000..8429f1f6f --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/DeleteTests.cs @@ -0,0 +1,136 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Linq; +using NUnit.Framework; +using System.Data; +using System.Data.Entity; +using System.Data.Entity.Infrastructure; + +namespace MySql.Data.EntityFramework.Tests +{ + + public class DeleteTests : DefaultFixture + { + public override void LoadData() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + ctx.Products.Add(new Product() { Name = "Garbage Truck", MinAge = 8 }); + ctx.Products.Add(new Product() { Name = "Fire Truck", MinAge = 12 }); + ctx.Products.Add(new Product() { Name = "Hula Hoop", MinAge = 18 }); + ctx.SaveChanges(); + } + } + + [Test] + public void SimpleDeleteAllRows() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + Assert.That(ctx.Products.Count() > 0); + + foreach (Product p in ctx.Products) + ctx.Products.Remove(p); + ctx.SaveChanges(); + + Assert.That(ctx.Products.Count(), Is.EqualTo(0)); + } + // set the flag that will cause the setup to happen again + // since we just blew away a table + NeedSetup = true; + } + + [Test] + public void SimpleDeleteRowByParameter() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + int total = ctx.Products.Count(); + int cntLeft = ctx.Products.Where(b => b.MinAge >= 18).Count(); + // make sure the test is valid + Assert.That(total > cntLeft); + + foreach (Product p in ctx.Products.Where(b => b.MinAge < 18).ToList()) + ctx.Products.Remove(p); + ctx.SaveChanges(); + Assert.That(ctx.Products.Count(), Is.EqualTo(cntLeft)); + } + // set the flag that will cause the setup to happen again + // since we just blew away a table + NeedSetup = true; + } + + + public class Widget + { + public int Id { get; set; } + public WidgetDetail Detail { get; set; } + } + + public class WidgetDetail + { + public int Id { get; set; } + public Widget Widget { get; set; } + } + + public class WidgetContext : DbContext + { + public WidgetContext(string connStr) : base(connStr) + { + Database.SetInitializer(null); + } + + protected override void OnModelCreating(DbModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + modelBuilder.Entity() + .HasRequired(b => b.Widget) + .WithOptional(a => a.Detail) + .WillCascadeOnDelete(true); + } + } + + /// + /// Fix for bug Cascading delete using CreateDatabase in Entity Framework + /// (http://bugs.mysql.com/bug.php?id=64779) using ModelFirst. + /// + [Test] + public void XOnDeleteCascade() + { + using (WidgetContext ctx = new WidgetContext(ConnectionString)) + { + var context = ((IObjectContextAdapter)ctx).ObjectContext; + var sql = context.CreateDatabaseScript(); + CheckSqlContains(sql, + @"ALTER TABLE `WidgetDetails` ADD CONSTRAINT WidgetDetail_Widget + FOREIGN KEY (Id) REFERENCES `Widgets` (Id) ON DELETE Cascade ON UPDATE NO ACTION;"); + } + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/ExpressionTests.cs b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/ExpressionTests.cs new file mode 100644 index 000000000..44667e099 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/ExpressionTests.cs @@ -0,0 +1,144 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Linq; +using NUnit.Framework; + +namespace MySql.Data.EntityFramework.Tests +{ + public class ExpressionTests : DefaultFixture + { + public override void LoadData() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + ctx.Products.Add(new Product() { Name = "Garbage Truck", MinAge = 8 }); + ctx.Products.Add(new Product() { Name = "Fire Truck", MinAge = 12 }); + ctx.Products.Add(new Product() { Name = "Hula Hoop", MinAge = 18 }); + ctx.SaveChanges(); + } + } + + /// + /// Using StartsWith on a list when using variable as parameter + /// + [Test] + public void CheckStartsWithWhenUsingVariable() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + string str = "Garbage"; + var records = ctx.Products.Where(p => p.Name.StartsWith(str)).ToArray(); + Assert.That(records.Count(), Is.EqualTo(1)); + } + } + + /// + /// Using StartsWith on a list when using a hardcoded value + /// + [Test] + public void CheckStartsWithWhenUsingValue() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + var records = ctx.Products.Where(p => p.Name.StartsWith("Garbage")).ToArray(); + Assert.That(records.Count(), Is.EqualTo(1)); + } + } + + /// + /// Using EndsWith on a list when using a variable as parameter + /// + [Test] + public void CheckEndsWithWhenUsingVariable() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + string str = "Hoop"; + var records = ctx.Products.Where(p => p.Name.EndsWith(str)).ToArray(); + Assert.That(records.Count(), Is.EqualTo(1)); + } + } + + /// + /// Using EndsWith on a list when using a hardcoded value + /// + [Test] + public void CheckEndsWithWhenUsingValue() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + var records = ctx.Products.Where(p => p.Name.EndsWith("Hoop")).ToArray(); + Assert.That(records.Count(), Is.EqualTo(1)); + } + } + + + /// + /// Using Contains on a list when using a variable + /// + [Test] + public void CheckContainsWhenUsingVariable() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + string str = "bage"; + var records = ctx.Products.Where(p => p.Name.Contains(str)).ToArray(); + Assert.That(records.Count(), Is.EqualTo(1)); + } + } + + + /// + /// Using Contains on a list when using a hardcoded value + /// + [Test] + public void CheckContainsWhenUsingHardCodedValue() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + var records = ctx.Products.Where(p => p.Name.Contains("bage")).ToArray(); + Assert.That(records.Count(), Is.EqualTo(1)); + } + } + + /// + /// Using Contains on a list when using a hardcoded value + /// + [Test] + public void CheckContainsWhenUsingHardCodedValueWithPercentageSymbol() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + var records = ctx.Products.Where(p => p.Name.Contains("%")).ToArray(); + Assert.That(records.Count(), Is.EqualTo(0)); + } + } + + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/GenericListener.cs b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/GenericListener.cs new file mode 100644 index 000000000..dec000e96 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/GenericListener.cs @@ -0,0 +1,87 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Text; +using System.Diagnostics; +using System.Collections.Specialized; + +namespace MySql.Data.EntityFramework.Tests +{ + public class GenericListener : TraceListener + { + + StringCollection strings; + StringBuilder partial; + + public GenericListener() + { + strings = new StringCollection(); + partial = new StringBuilder(); + } + + public StringCollection Strings + { + get { return strings; } + } + + public int Find(string sToFind) + { + int count = 0; + foreach (string s in strings) + if (s.IndexOf(sToFind) != -1) + count++; + return count; + } + + public void Clear() + { + partial.Remove(0, partial.Length); + strings.Clear(); + } + + public override void Write(string message) + { + partial.Append(message); + } + + public override void WriteLine(string message) + { + Write(message); + strings.Add(partial.ToString()); + partial.Remove(0, partial.Length); + } + + public int CountLinesContaining(string text) + { + int count = 0; + foreach (string s in strings) + if (s.Contains(text)) count++; + return count; + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/InsertTests.cs b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/InsertTests.cs new file mode 100644 index 000000000..2f1174097 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/InsertTests.cs @@ -0,0 +1,161 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using NUnit.Framework; +using System; +using System.Data; +using System.Data.Entity.Infrastructure; +using System.Linq; +using System.Threading.Tasks; + +namespace MySql.Data.EntityFramework.Tests +{ + public class InsertTests : DefaultFixture + { + [Test] + public void InsertSingleRow() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + int beforeCnt = ctx.Companies.Count(); + + Company c = new Company(); + c.Name = "Yoyo"; + c.NumEmployees = 486; + c.DateBegan = DateTime.Now; + c.Address = new Address(); + c.Address.Street = "212 My Street."; + c.Address.City = "Helena"; + c.Address.State = "MT"; + c.Address.ZipCode = "44558"; + + ctx.Companies.Add(c); + int result = ctx.SaveChanges(); + + Assert.That(ctx.Companies.Count(), Is.EqualTo(beforeCnt + 1)); + + Company d = ctx.Companies.Find(c.Id); + d.Id = c.Id; + Assert.That(d, Is.EqualTo(c)); + } + } + + [Ignore("Fix Me")] + public void CanInsertRowWithDefaultTimeStamp() + { + // using (var context = GetContext()) + // { + // // The default timestamp is in the CreatedDate column. + // Company c = new Company(); + // c.Nameproduct.Name = "Coca Cola"; + + // context.AddToProducts(product); + // context.SaveChanges(); + + // Assert.AreEqual(DateTime.Today.Day, product.CreatedDate.Day); + // } + } + + [Test] + public async Task ExecuteNonQueryAndScalarAsyncAwait() + { + ExecSQL("CREATE TABLE NonQueryAndScalarAsyncAwaitTest (id int)"); + ExecSQL("CREATE PROCEDURE NonQueryAndScalarAsyncAwaitSpTest() BEGIN SET @x=0; REPEAT INSERT INTO NonQueryAndScalarAsyncAwaitTest VALUES(@x); " + + "SET @x=@x+1; UNTIL @x = 100 END REPEAT; END"); + + EFMySqlCommand proc = new EFMySqlCommand() { CommandText = "NonQueryAndScalarAsyncAwaitSpTest", Connection = Connection }; + proc.CommandType = CommandType.StoredProcedure; + int result = await proc.ExecuteNonQueryAsync(); + + Assert.That(result, Is.Not.EqualTo(-1)); + + EFMySqlCommand cmd = new EFMySqlCommand() { CommandText = "SELECT COUNT(*) FROM NonQueryAndScalarAsyncAwaitTest;", Connection = Connection }; + cmd.CommandType = CommandType.Text; + object cnt = await cmd.ExecuteScalarAsync(); + Assert.That(Convert.ToInt32(cnt), Is.EqualTo(100)); + } + + [Test] + public async Task PrepareAsyncAwait() + { + ExecSQL("CREATE TABLE PrepareAsyncAwaitTest (val1 varchar(20), numbercol int, numbername varchar(50));"); + EFMySqlCommand cmd = new EFMySqlCommand() { CommandText = "INSERT INTO PrepareAsyncAwaitTest VALUES(NULL, @number, @text)", Connection = Connection }; + //TODO: Fix me + // await cmd.PrepareAsync(); + + cmd.Parameters.Add(new MySqlParameter("@number", 1)); + cmd.Parameters.Add(new MySqlParameter("@text", "One")); + + for (int i = 1; i <= 100; i++) + { + cmd.Parameters["@number"].Value = i; + cmd.Parameters["@text"].Value = "A string value"; + cmd.ExecuteNonQuery(); + } + } + + ///// + ///// Test for fix for "NullReferenceException when try to save entity with TINYINY or BIGINT as PK" (MySql bug #70888, Oracle bug #17866076). + ///// + [Ignore("Fix Me")] + public void NullReferenceWhenInsertingPk() + { + //using (testEntities1 ctx = new testEntities1()) + //{ + // gamingplatform gp = new gamingplatform() { Name = "PlayStation2" }; + // ctx.AddTogamingplatform(gp); + // ctx.SaveChanges(); + //} + } + + /// + /// Bug#22564126 [SERVER SQL_MODE REPLACED WITH ANSI ONLY BY THE CONNECTOR] + /// + [Test] + public void SqlModeReplacedByANSI() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + ctx.Configuration.ValidateOnSaveEnabled = false; + + LongDataTest longData = new LongDataTest(); + longData.Data = "This does fit."; + ctx.LongDataTests.Add(longData); + Assert.That(ctx.SaveChanges() == 1); + + // Try to insert a value that is larger than the max lenght of the column + longData.Data = "This does not fit in the column!!!"; + ctx.LongDataTests.Add(longData); + var ex = Assert.Throws(() => ctx.SaveChanges()); + Assert.That(ex.InnerException.InnerException is MySqlException); + Assert.That(ex.InnerException.InnerException.Message, Is.EqualTo("Data too long for column 'Data' at row 1").IgnoreCase); + } + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/JoinTests.cs b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/JoinTests.cs new file mode 100644 index 000000000..bad80f7c0 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/JoinTests.cs @@ -0,0 +1,295 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +using System.Linq; +using NUnit.Framework; + +namespace MySql.Data.EntityFramework.Tests +{ + public class JoinTests : DefaultFixture + { + [Test] + public void SimpleJoin() + { + using (DefaultContext ctx = GetDefaultContext()) + { + var q = from b in ctx.Books + join a in ctx.Authors + on b.Author.Id equals a.Id + select new + { + bookId = b.Id, + bookName = b.Name, + authorName = a.Name + }; + var expected = @"SELECT `Extent1`.`Id`, `Extent1`.`Name`, `Extent2`.`Name` AS `Name1` + FROM `Books` AS `Extent1` INNER JOIN `Authors` AS `Extent2` ON `Extent1`.`Author_Id` = `Extent2`.`Id`"; + CheckSql(q.ToString(), expected); + } + } + + [Test] + public void SimpleJoinWithPredicate() + { + using (DefaultContext ctx = GetDefaultContext()) + { + var q = from b in ctx.Books + join a in ctx.Authors + on b.Author.Id equals a.Id + where b.Pages > 300 + select new + { + bookId = b.Id, + bookName = b.Name, + authorName = a.Name + }; + + var expected = @"SELECT `Extent1`.`Id`, `Extent1`.`Name`, `Extent2`.`Name` AS `Name1` FROM `Books` AS `Extent1` + INNER JOIN `Authors` AS `Extent2` ON `Extent1`.`Author_Id` = `Extent2`.`Id` + WHERE `Extent1`.`Pages` > 300"; + CheckSql(q.ToString(), expected); + } + } + + [Test] + public void JoinOnRightSideAsDerivedTable() + { + using (DefaultContext ctx = GetDefaultContext()) + { + var q = from b in ctx.Books + join a in ctx.ContractAuthors + on b.Author.Id equals a.Author.Id + where b.Pages > 300 + select b; + string sql = q.ToString(); + var expected = @"SELECT `Extent1`.`Id`, `Extent1`.`Name`, `Extent1`.`PubDate`, `Extent1`.`Pages`, `Extent1`.`Author_Id` + FROM `Books` AS `Extent1` INNER JOIN `ContractAuthors` AS `Extent2` ON (`Extent1`.`Author_Id` = + `Extent2`.`Author_Id`) OR ((`Extent1`.`Author_Id` IS NULL) AND (`Extent2`.`Author_Id` IS NULL)) + WHERE `Extent1`.`Pages` > 300"; + CheckSql(sql, expected); + } + } + + // [Test] + // public void JoinOfUnionsOnRightSideofJoin() + // { + // using (testEntities context = new testEntities()) + // { + // string eSql = @"SELECT c.Id, c.Name, Union1.Id, Union1.Name, + // Union2.Id, Union2.Name FROM + // testEntities.Companies AS c JOIN ( + // ((SELECT t.Id, t.Name FROM testEntities.Toys as t) + // UNION ALL + // (SELECT s.Id, s.Name FROM testEntities.Shops as s)) AS Union1 + // JOIN + // ((SELECT a.Id, a.Name FROM testEntities.Authors AS a) + // UNION ALL + // (SELECT b.Id, b.Name FROM testEntities.Books AS b)) AS Union2 + // ON Union1.Id = Union2.Id) ON c.Id = Union1.Id"; + // ObjectQuery query = context.CreateQuery(eSql); + + // string[] data = new string[] { + // "1,Hasbro,1,Slinky,1,Tom Clancy", + // "1,Hasbro,1,Target,1,Tom Clancy", + // "1,Hasbro,1,Slinky,1,Debt of Honor", + // "1,Hasbro,1,Target,1,Debt of Honor", + // "2,Acme,2,K-Mart,2,Insomnia", + // "2,Acme,2,Rubiks Cube,2,Stephen King", + // "2,Acme,2,K-Mart,2,Stephen King", + // "2,Acme,2,Rubiks Cube,2,Insomnia", + // "3,Bandai America,3,Wal-Mart,3,Rainmaker", + // "3,Bandai America,3,Lincoln Logs,3,John Grisham", + // "3,Bandai America,3,Wal-Mart,3,John Grisham", + // "3,Bandai America,3,Lincoln Logs,3,Rainmaker", + // "4,Lego Group,4,Legos,4,Hallo", + // "4,Lego Group,4,Legos,4,Dean Koontz" + // }; + // Dictionary outData = new Dictionary(); + // string sql = query.ToTraceString(); + // CheckSql(sql, SQLSyntax.JoinOfUnionsOnRightSideOfJoin); + // // check data integrity + // foreach (DbDataRecord record in query) + // { + // outData.Add(string.Format("{0},{1},{2},{3},{4},{5}", record.GetInt32( 0 ), + // record.GetString( 1 ), record.GetInt32( 2 ), record.GetString( 3 ), + // record.GetInt32( 4 ), record.GetString( 5 )), null); + // } + // Assert.AreEqual(data.Length, outData.Count); + // for( int i = 0; i < data.Length; i++ ) + // { + // Assert.True(outData.ContainsKey(data[i])); + // } + // } + // } + + // [Test] + // public void t() + // { + // using (testEntities context = new testEntities()) + // { + // var q = from d in context.Computers + // join l in context.Computers on d.Id equals l.Id + // where (d is DesktopComputer) + // select new { d.Id, d.Brand }; + // foreach (var o in q) + // { + // } + // } + // } + + // /// + // /// Tests for bug http://bugs.mysql.com/bug.php?id=61729 + // /// (Skip/Take Clauses Causes Null Reference Exception in 6.3.7 and 6.4.1 Only). + // /// + // [Test] + // public void JoinOfNestedUnionsWithLimit() + // { + // using (testEntities context = new testEntities()) + // { + // var q = context.Books.Include("Author"); + // q = q.Include("Publisher"); + // q = q.Include("Publisher.Books"); + // string sql = q.ToTraceString(); + + // var i = 0; + // foreach (var o in q.Where(p => p.Id > 0).OrderBy(p => p.Name).ThenByDescending(p => p.Id).Skip(0).Take(32).ToList()) + // { + // switch (i) + // { + // case 0: + // Assert.AreEqual(5, o.Id); + // Assert.AreEqual("Debt of Honor", o.Name); + // break; + // case 1: + // Assert.AreEqual(1, o.Id); + // Assert.AreEqual("Debt of Honor", o.Name); + // break; + // case 4: + // Assert.AreEqual(3, o.Id); + // Assert.AreEqual("Rainmaker", o.Name); + // break; + // } + // i++; + // } + // } + // } + + // [Test] + // public void JoinOnRightSideNameClash() + // { + // using (testEntities context = new testEntities()) + // { + // string eSql = @"SELECT c.Id, c.Name, a.Id, a.Name, b.Id, b.Name FROM + // testEntities.Companies AS c JOIN (testEntities.Authors AS a + // JOIN testEntities.Books AS b ON a.Id = b.Id) ON c.Id = a.Id"; + // ObjectQuery query = context.CreateQuery(eSql); + // string sql = query.ToTraceString(); + // CheckSql(sql, SQLSyntax.JoinOnRightSideNameClash); + // foreach (DbDataRecord record in query) + // { + // Assert.AreEqual(6, record.FieldCount); + // } + // } + // } + + // /// + // /// Test for fix of Oracle bug 12807366. + // /// + // [Test] + // public void JoinsAndConcatsWithComposedKeys() + // { + // using (testEntities1 ctx = new testEntities1()) + // { + // IQueryable l2 = ctx.gamingplatform.Where(p => string.IsNullOrEmpty(p.Name)).Take(10); + // IQueryable l = ctx.gamingplatform.Where(p => string.IsNullOrEmpty(p.Name)).Take(10); + // var l4 = ctx.gamingplatform.Where(p => string.IsNullOrEmpty(p.Name)).Take(10); + // l = l.Concat(l4); + // l = l.Concat(ctx.gamingplatform.Where(p => string.IsNullOrEmpty(p.Name)).Take(10).Distinct()); + + // IQueryable q = (from i in l join i2 in l2 on i.Id equals i2.Id select i); + // IQueryable l3 = from t1 in q + // join t2 in q.SelectMany(p => p.videogameplatform) + // on t1.Id equals t2.IdGamingPlatform + // select t2; + // videogameplatform pu = null; + + // pu = l3.FirstOrDefault(); + // } + // } + + // /// + // /// Test to fix Oracle bug 13491698 + // /// + // [Test] + // public void CanIncludeWithEagerLoading() + // { + // var myarray = new ArrayList(); + // using (var db = new mybooksEntities()) + // { + // var author = db.myauthors.Include("mybooks.myeditions").AsEnumerable().First(); + // var strquery = ((ObjectQuery)db.myauthors.Include("mybooks.myeditions").AsEnumerable()).ToTraceString(); + // CheckSql(strquery, SQLSyntax.JoinUsingInclude); + // foreach (var book in author.mybooks.ToList()) + // { + // foreach (var edition in book.myeditions.ToList()) + // { + // myarray.Add(edition.Title); + // } + // } + // myarray.Sort(); + // Assert.AreEqual(0, myarray.IndexOf("Another Book First Edition")); + // Assert.AreEqual(1, myarray.IndexOf("Another Book Second Edition")); + // Assert.AreEqual(2, myarray.IndexOf("Another Book Third Edition")); + // Assert.AreEqual(3, myarray.IndexOf("Some Book First Edition")); + // Assert.AreEqual(myarray.Count, 4); + // } + // } + + // /// + // /// Tests Fix for Error of "Every derived table must have an alias" in LINQ to Entities when using EF6 + DbFirst + View + Take (MySql Bug #72148, Oracle bug #19356006). + // /// + // [Test] + // public void TakeWithView() + // { + // using (testEntities1 ctx = new testEntities1()) + // { + // var q = ctx.vivideogametitle.Take(10); + // string sql = q.ToTraceString(); + // CheckSql(sql, SQLSyntax.TakeWithView); + //#if DEBUG + // Debug.WriteLine(sql); + //#endif + // foreach( var row in q ) + // { + // // + // } + // } + // } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/MySql.EntityFramework.Basic.Tests.csproj b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/MySql.EntityFramework.Basic.Tests.csproj new file mode 100644 index 000000000..74db78daf --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/MySql.EntityFramework.Basic.Tests.csproj @@ -0,0 +1,65 @@ + + + + MySql.Data.EntityFramework.CodeFirTests + Copyright © 2016, 2025, Oracle and/or its affiliates. + en-US + 9.4.0 + Oracle + net462;net48;net9.0 + MySql.EntityFramework.Basic.Tests + MySql.EntityFramework.Basic.Tests + MySql;.NET Connector;MySql Connector/NET + http://www.mysql.com/common/logos/logo-mysql-170x115.png + http://dev.mysql.com/downloads/ + GPL-2.0-only WITH Universal-FOSS-exception-1.0 + true + false + false + false + false + false + false + True + True + ..\..\..\ConnectorNetPublicKey.snk + MySql.EntityFramework.Basic.Tests + CA2100 + latest + + + + + + + + + + + + + + + + + + + + + + + + + + TRACE;DEBUG;NET462; + + + + TRACE;RELEASE;NET462; + + + + + + + \ No newline at end of file diff --git a/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/OrderingAndGrouping.cs b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/OrderingAndGrouping.cs new file mode 100644 index 000000000..c95c995df --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/OrderingAndGrouping.cs @@ -0,0 +1,109 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +using System.Data; +using System.Linq; +using NUnit.Framework; + +namespace MySql.Data.EntityFramework.Tests +{ + public class OrderingAndGrouping : DefaultFixture + { + [Test] + public void OrderBySimple() + { + TestESql( + "SELECT VALUE b FROM Books AS b ORDER BY b.Pages", + @"SELECT `Extent1`.`Id`, `Extent1`.`Name`, `Extent1`.`PubDate`, `Extent1`.`Pages`, + `Extent1`.`Author_Id` FROM `Books` AS `Extent1` ORDER BY `Extent1`.`Pages` ASC"); + } + + [Test] + public void OrderByWithPredicate() + { + TestESql( + "SELECT VALUE b FROM Books AS b WHERE b.Pages > 200 ORDER BY b.Pages", + @"SELECT `Extent1`.`Id`, `Extent1`.`Name`, `Extent1`.`PubDate`, `Extent1`.`Pages`, + `Extent1`.`Author_Id` FROM `Books` AS `Extent1` WHERE `Extent1`.`Pages` > 200 + ORDER BY `Extent1`.`Pages` ASC"); + } + + [Test] + public void CanGroupBySingleColumn() + { + using (DefaultContext ctx = GetDefaultContext()) + { + var authors = from a in ctx.Authors + group a by a.Age into cgroup + select new + { + Name = cgroup.Key, + Count = cgroup.Count() + }; + string sql = authors.ToString(); + CheckSql(sql, + @"SELECT `GroupBy1`.`K1` AS `Age`, `GroupBy1`.`A1` AS `C1` FROM (SELECT + `Extent1`.`Age` AS `K1`, COUNT(1) AS `A1` FROM `Authors` AS `Extent1` + GROUP BY `Extent1`.`Age`) AS `GroupBy1`"); + } + } + + [Test] + public void CanGroupByMultipleColumns() + { + using (DefaultContext ctx = GetDefaultContext()) + { + var authors = from a in ctx.Authors + group a by new { a.Age, a.Name } into cgroup + select new + { + Name = cgroup.Key.Name, + Count = cgroup.Count() + }; + + string sql = authors.ToString(); + CheckSql(sql, + @"SELECT `GroupBy1`.`K2` AS `Age`, `GroupBy1`.`K1` AS `Name`, `GroupBy1`.`A1` AS `C1` + FROM (SELECT `Extent1`.`Name` AS `K1`, `Extent1`.`Age` AS `K2`, COUNT(1) AS `A1` + FROM `Authors` AS `Extent1` GROUP BY `Extent1`.`Name`, `Extent1`.`Age`) AS `GroupBy1`"); + } + } + + [Ignore("Fix Me")] + public void OrdersTableDoesNotProvokeSyntaxError() + { + //using (model2Entities context = new model2Entities()) + //{ + // var customers = from c in context.customer + // select c; + // customers.ToList().ForEach(c => c.order.Load()); + //} + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/Paging.cs b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/Paging.cs new file mode 100644 index 000000000..aab415d67 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/Paging.cs @@ -0,0 +1,104 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Data; +using System.Linq; +using NUnit.Framework; + +namespace MySql.Data.EntityFramework.Tests +{ + public class Paging : DefaultFixture + { + public override void SetUp() + { + LoadData(); + } + + void LoadData() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + ctx.Products.Add(new Product() { Name = "Garbage Truck", MinAge = 8 }); + ctx.Products.Add(new Product() { Name = "Fire Truck", MinAge = 12 }); + ctx.Products.Add(new Product() { Name = "Hula Hoop", MinAge = 18 }); + ctx.SaveChanges(); + } + } + + [Test] + public void Take() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + var q = ctx.Books.Take(2); + var sql = q.ToString(); + CheckSql(sql, + @"SELECT `Id`, `Name`, `PubDate`, `Pages`, `Author_Id` FROM `Books` LIMIT 2"); + } + } + + [Test] + public void Skip() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + var q = ctx.Books.OrderBy(b=>b.Pages).Skip(3); + var sql = q.ToString(); + CheckSql(sql, + @"SELECT `Extent1`.`Id`, `Extent1`.`Name`, `Extent1`.`PubDate`, `Extent1`.`Pages`, `Extent1`.`Author_Id` + FROM `Books` AS `Extent1` ORDER BY `Extent1`.`Pages` ASC LIMIT 3,18446744073709551615"); + } + } + + [Test] + public void SkipAndTakeSimple() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + var q = ctx.Books.OrderBy(b => b.Pages).Skip(3).Take(4); + var sql = q.ToString(); + CheckSql(sql, + @"SELECT `Extent1`.`Id`, `Extent1`.`Name`, `Extent1`.`PubDate`, `Extent1`.`Pages`, `Extent1`.`Author_Id` + FROM `Books` AS `Extent1` ORDER BY `Extent1`.`Pages` ASC LIMIT 3,4"); + } + } + + // + // Tests fix for bug #64749 - Entity Framework - Take().Count() fails with EntityCommandCompilationException. + // + [Test] + public void TakeWithCount() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + int cnt = ctx.Products.Take(2).Count(); + Assert.That(cnt, Is.EqualTo(2)); + } + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/ProceduresAndFunctions.cs b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/ProceduresAndFunctions.cs new file mode 100644 index 000000000..6a23d1b88 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/ProceduresAndFunctions.cs @@ -0,0 +1,97 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Data; +using MySql.Data.MySqlClient; +using System.Linq; +using NUnit.Framework; +using System; + +namespace MySql.Data.EntityFramework.Tests +{ + public class ProceduresAndFunctions : DefaultFixture + { + public override void TearDown() + { + ExecSQL($"DROP FUNCTION IF EXISTS `spFunc`"); + } + + /// + /// Validates a stored procedure call using Code First + /// Bug #14008699 + [Test] + public void CallStoredProcedure() + { + MySqlCommand cmd = new MySqlCommand("CREATE PROCEDURE CallStoredProcedure() BEGIN SELECT 5; END", Connection); + cmd.ExecuteNonQuery(); + + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + long count = ctx.Database.SqlQuery("call CallStoredProcedure").First(); + Assert.That(count, Is.EqualTo(5)); + } + } + + /// + /// Bug #45277 Calling User Defined Function using eSql causes NullReferenceException + /// + [Test] + public void UserDefinedFunction() + { + MySqlCommand cmd = new MySqlCommand("CREATE FUNCTION spFunc() RETURNS INT BEGIN RETURN 3; END", Connection); + cmd.ExecuteNonQuery(); + + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + int val = ctx.Database.SqlQuery(@"SELECT spFunc()").Single(); + Assert.That(val, Is.EqualTo(3)); + } + } + + /// + /// Bug #56806 Default Command Timeout has no effect in connection string + /// + [Test] + public void CommandTimeout() + { + MySqlCommand cmd = new MySqlCommand("CREATE FUNCTION spFunc() RETURNS INT BEGIN DO SLEEP(5); RETURN 4; END", Connection); + cmd.ExecuteNonQuery(); + + var sb = new MySqlConnectionStringBuilder(ConnectionString); + sb.DefaultCommandTimeout = 3; + sb.UseDefaultCommandTimeoutForEF = true; + using (DefaultContext ctx = new DefaultContext(sb.ToString())) + { + var exception = Assert.Throws(() => + { + int val = ctx.Database.SqlQuery(@"SELECT spFunc()").Single(); + }); + } + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/Properties/AssemblyInfo.cs b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..2bd86ed8d --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,55 @@ +// Copyright © 2008, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Reflection; +using System.Runtime.InteropServices; +using NUnit.Framework; + +// 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. +[assembly: AssemblyTitle("MySql.Data.EntityFramework.Tests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Oracle")] +[assembly: AssemblyProduct("MySql.Data.EntityFramework.Tests")] +[assembly: AssemblyCopyright("Copyright © 2008, 2025, Oracle and/or its affiliates.")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("a4c0a8f2-5e48-4227-a712-bf8ae7446101")] + +//[assembly: InternalsVisibleTo("MySql.Data.EntityFramework.CodeFirTests, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] + +[assembly: NonParallelizable] diff --git a/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/ProviderManifestTests.cs b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/ProviderManifestTests.cs new file mode 100644 index 000000000..aae8e618c --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/ProviderManifestTests.cs @@ -0,0 +1,103 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using MySql.Data.MySqlClient; +using System.Data.Entity.Core.Metadata.Edm; +using NUnit.Framework; + +namespace MySql.Data.EntityFramework.Tests +{ + public class ProviderManifestTests : DefaultFixture + { + [Test] + public void TestingMaxLengthFacet() + { + using (MySqlConnection connection = new MySqlConnection(ConnectionString)) + { + MySqlProviderManifest pm = new MySqlProviderManifest(Version.ToString()); + TypeUsage tu = TypeUsage.CreateStringTypeUsage( + PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.String), false, false); + TypeUsage result = pm.GetStoreType(tu); + Assert.That(result.EdmType.Name, Is.EqualTo("longtext")); + + tu = TypeUsage.CreateStringTypeUsage( + PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.String), false, false, Int32.MaxValue); + result = pm.GetStoreType(tu); + Assert.That(result.EdmType.Name, Is.EqualTo("longtext")); + + tu = TypeUsage.CreateStringTypeUsage( + PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.String), false, false, 70000); + result = pm.GetStoreType(tu); + Assert.That(result.EdmType.Name, Is.EqualTo("mediumtext")); + + } + } + + /// + /// Bug #62135 Connector/NET Incorrectly Maps PrimitiveTypeKind.Byte to "tinyint" + /// + /// ( + @"(SELECT b.Id, b.Name FROM Books AS b) + UNION ALL (SELECT c.Id, c.Name FROM Companies AS c)", + @"SELECT `UnionAll1`.`Id` AS `C1`, `UnionAll1`.`Id1` AS `C2`, `UnionAll1`.`Name` AS `C3` + FROM ((SELECT `Extent1`.`Id`, `Extent1`.`Id` AS `Id1`, `Extent1`.`Name` FROM `Books` AS `Extent1`) + UNION ALL (SELECT `Extent2`.`Id`, `Extent2`.`Id` AS `Id1`, `Extent2`.`Name` + FROM `Companies` AS `Extent2`)) AS `UnionAll1`"); + } + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/RestrictionOperators.cs b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/RestrictionOperators.cs new file mode 100644 index 000000000..ee2e87f67 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/RestrictionOperators.cs @@ -0,0 +1,78 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Data.Entity.Core.Objects; +using NUnit.Framework; + +namespace MySql.Data.EntityFramework.Tests +{ + public class RestrictionOperators : DefaultFixture + { + [Test] + public void SimpleSelectWithParam() + { + TestESql( + "SELECT VALUE b FROM Books AS b WHERE b.Pages > @pages", + @"SELECT `Extent1`.`Id`, `Extent1`.`Name`, `Extent1`.`PubDate`, `Extent1`.`Pages`, + `Extent1`.`Author_Id` FROM `Books` AS `Extent1` WHERE `Extent1`.`Pages` > @pages", + new ObjectParameter("pages", 200)); + } + + [Test] + public void WhereLiteralOnRelation() + { + TestESql( + "SELECT VALUE a FROM Authors AS a WHERE a.Address.City = 'Dallas'", + @"SELECT `Extent1`.`Id`, `Extent1`.`Name`, `Extent1`.`Age`, `Extent1`.`Address_City`, + `Extent1`.`Address_Street`, `Extent1`.`Address_State`, `Extent1`.`Address_ZipCode` + FROM `Authors` AS `Extent1` WHERE `Extent1`.`Address_City` = @gp1"); + } + + [Test] + public void WhereWithRelatedEntities1() + { + TestESql( + "SELECT VALUE b FROM Books AS b WHERE b.Author.Address.State = 'TX'", + @"SELECT `Extent1`.`Id`, `Extent1`.`Name`, `Extent1`.`PubDate`, `Extent1`.`Pages`, + `Extent1`.`Author_Id` FROM `Books` AS `Extent1` INNER JOIN `Authors` AS `Extent2` + ON `Extent1`.`Author_Id` = `Extent2`.`Id` WHERE `Extent2`.`Address_State` = @gp1"); + } + + [Test] + public void Exists() + { + TestESql( + @"SELECT VALUE a FROM Authors AS a WHERE EXISTS( + SELECT b FROM a.Books AS b WHERE b.Pages > 200)", + @"SELECT `Extent1`.`Id`, `Extent1`.`Name`, `Extent1`.`Age`, `Extent1`.`Address_City`, + `Extent1`.`Address_Street`, `Extent1`.`Address_State`, `Extent1`.`Address_ZipCode` + FROM `Authors` AS `Extent1` WHERE EXISTS(SELECT 1 AS `C1` FROM `Books` AS `Extent2` + WHERE (`Extent1`.`Id` = `Extent2`.`Author_Id`) AND (`Extent2`.`Pages` > 200))"); + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/SchemaInformation.cs b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/SchemaInformation.cs new file mode 100644 index 000000000..533520f5d --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/SchemaInformation.cs @@ -0,0 +1,2387 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4900 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +[assembly: global::System.Data.Entity.Core.Objects.DataClasses.EdmSchemaAttribute()] +[assembly: global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipAttribute("Store", "TableOrViewColumn", "Parent", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.One, typeof(Store.TableOrView), "Column", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Store.Column))] +[assembly: global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipAttribute("Store", "TableOrViewConstraint", "Parent", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.One, typeof(Store.TableOrView), "Constraint", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Store.Constraint))] +[assembly: global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipAttribute("Store", "TableOrViewConstraintColumn", "Constraint", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Store.TableOrViewColumnConstraint), "Column", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Store.Column))] +[assembly: global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipAttribute("Store", "ConstraintForeignKey", "Constraint", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.One, typeof(Store.ForeignKeyConstraint), "ForeignKey", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Store.ForeignKey))] +[assembly: global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipAttribute("Store", "ToForeignKeyColumn", "ForeignKey", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Store.ForeignKey), "Column", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.One, typeof(Store.Column))] +[assembly: global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipAttribute("Store", "FromForeignKeyColumn", "ForeignKey", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Store.ForeignKey), "Column", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.One, typeof(Store.Column))] +[assembly: global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipAttribute("Store", "RoutineParameter", "Routine", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.One, typeof(Store.Routine), "Parameter", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Store.Parameter))] + +// Original file name: SchemaInformation.cs +// Generation date: 2/11/2009 2:18:33 PM +namespace Store +{ + + /// + /// There are no comments for SchemaInformation in the schema. + /// + public partial class SchemaInformation : global::System.Data.Entity.Core.Objects.ObjectContext + { + /// + /// Initializes a new SchemaInformation object using the connection string found in the 'SchemaInformation' section of the application configuration file. + /// + public SchemaInformation() : + base("name=SchemaInformation", "SchemaInformation") + { + this.OnContextCreated(); + } + /// + /// Initialize a new SchemaInformation object. + /// + public SchemaInformation(string connectionString) : + base(connectionString, "SchemaInformation") + { + this.OnContextCreated(); + } + /// + /// Initialize a new SchemaInformation object. + /// + public SchemaInformation(global::System.Data.Entity.Core.EntityClient.EntityConnection connection) + : base(connection, "SchemaInformation") + { + this.OnContextCreated(); + } + partial void OnContextCreated(); + /// + /// There are no comments for Tables in the schema. + /// + public global::System.Data.Entity.Core.Objects.ObjectQuery Tables + { + get + { + if ((this._Tables == null)) + { + this._Tables = base.CreateQuery
("[Tables]"); + } + return this._Tables; + } + } + + private global::System.Data.Entity.Core.Objects.ObjectQuery
_Tables; + + /// + /// There are no comments for TableColumns in the schema. + /// + public global::System.Data.Entity.Core.Objects.ObjectQuery TableColumns + { + get + { + if ((this._TableColumns == null)) + { + this._TableColumns = base.CreateQuery("[TableColumns]"); + } + return this._TableColumns; + } + } + + private global::System.Data.Entity.Core.Objects.ObjectQuery _TableColumns; + + /// + /// There are no comments for TableConstraints in the schema. + /// + public global::System.Data.Entity.Core.Objects.ObjectQuery TableConstraints + { + get + { + if ((this._TableConstraints == null)) + { + this._TableConstraints = base.CreateQuery("[TableConstraints]"); + } + return this._TableConstraints; + } + } + + private global::System.Data.Entity.Core.Objects.ObjectQuery _TableConstraints; + + /// + /// There are no comments for TableForeignKeys in the schema. + /// + public global::System.Data.Entity.Core.Objects.ObjectQuery TableForeignKeys + { + get + { + if ((this._TableForeignKeys == null)) + { + this._TableForeignKeys = base.CreateQuery("[TableForeignKeys]"); + } + return this._TableForeignKeys; + } + } + + private global::System.Data.Entity.Core.Objects.ObjectQuery _TableForeignKeys; + + /// + /// There are no comments for Views in the schema. + /// + public global::System.Data.Entity.Core.Objects.ObjectQuery Views + { + get + { + if ((this._Views == null)) + { + this._Views = base.CreateQuery("[Views]"); + } + return this._Views; + } + } + + private global::System.Data.Entity.Core.Objects.ObjectQuery _Views; + /// + /// There are no comments for ViewColumns in the schema. + /// + public global::System.Data.Entity.Core.Objects.ObjectQuery ViewColumns + { + get + { + if ((this._ViewColumns == null)) + { + this._ViewColumns = base.CreateQuery("[ViewColumns]"); + } + return this._ViewColumns; + } + } + + private global::System.Data.Entity.Core.Objects.ObjectQuery _ViewColumns; + /// + /// There are no comments for ViewConstraints in the schema. + /// + public global::System.Data.Entity.Core.Objects.ObjectQuery ViewConstraints + { + get + { + if ((this._ViewConstraints == null)) + { + this._ViewConstraints = base.CreateQuery("[ViewConstraints]"); + } + return this._ViewConstraints; + } + } + + private global::System.Data.Entity.Core.Objects.ObjectQuery _ViewConstraints; + /// + /// There are no comments for ViewForeignKeys in the schema. + /// + public global::System.Data.Entity.Core.Objects.ObjectQuery ViewForeignKeys + { + get + { + if ((this._ViewForeignKeys == null)) + { + this._ViewForeignKeys = base.CreateQuery("[ViewForeignKeys]"); + } + return this._ViewForeignKeys; + } + } + + private global::System.Data.Entity.Core.Objects.ObjectQuery _ViewForeignKeys; + /// + /// There are no comments for Functions in the schema. + /// + public global::System.Data.Entity.Core.Objects.ObjectQuery Functions + { + get + { + if ((this._Functions == null)) + { + this._Functions = base.CreateQuery("[Functions]"); + } + return this._Functions; + } + } + + private global::System.Data.Entity.Core.Objects.ObjectQuery _Functions; + /// + /// There are no comments for FunctionParameters in the schema. + /// + public global::System.Data.Entity.Core.Objects.ObjectQuery FunctionParameters + { + get + { + if ((this._FunctionParameters == null)) + { + this._FunctionParameters = base.CreateQuery("[FunctionParameters]"); + } + return this._FunctionParameters; + } + } + + private global::System.Data.Entity.Core.Objects.ObjectQuery _FunctionParameters; + /// + /// There are no comments for Procedures in the schema. + /// + public global::System.Data.Entity.Core.Objects.ObjectQuery Procedures + { + get + { + if ((this._Procedures == null)) + { + this._Procedures = base.CreateQuery("[Procedures]"); + } + return this._Procedures; + } + } + + private global::System.Data.Entity.Core.Objects.ObjectQuery _Procedures; + /// + /// There are no comments for ProcedureParameters in the schema. + /// + public global::System.Data.Entity.Core.Objects.ObjectQuery ProcedureParameters + { + get + { + if ((this._ProcedureParameters == null)) + { + this._ProcedureParameters = base.CreateQuery("[ProcedureParameters]"); + } + return this._ProcedureParameters; + } + } + + private global::System.Data.Entity.Core.Objects.ObjectQuery _ProcedureParameters; + /// + /// There are no comments for Tables in the schema. + /// + public void AddToTables(Table table) + { + base.AddObject("Tables", table); + } + + /// + /// There are no comments for TableColumns in the schema. + /// + public void AddToTableColumns(Column column) + { + base.AddObject("TableColumns", column); + } + + /// + /// There are no comments for TableConstraints in the schema. + /// + public void AddToTableConstraints(Constraint constraint) + { + base.AddObject("TableConstraints", constraint); + } + + /// + /// There are no comments for TableForeignKeys in the schema. + /// + public void AddToTableForeignKeys(ForeignKey foreignKey) + { + base.AddObject("TableForeignKeys", foreignKey); + } + + /// + /// There are no comments for Views in the schema. + /// + public void AddToViews(View view) + { + base.AddObject("Views", view); + } + + /// + /// There are no comments for ViewColumns in the schema. + /// + public void AddToViewColumns(Column column) + { + base.AddObject("ViewColumns", column); + } + + /// + /// There are no comments for ViewConstraints in the schema. + /// + public void AddToViewConstraints(Constraint constraint) + { + base.AddObject("ViewConstraints", constraint); + } + + /// + /// There are no comments for ViewForeignKeys in the schema. + /// + public void AddToViewForeignKeys(ForeignKey foreignKey) + { + base.AddObject("ViewForeignKeys", foreignKey); + } + + /// + /// There are no comments for Functions in the schema. + /// + public void AddToFunctions(Function function) + { + base.AddObject("Functions", function); + } + + /// + /// There are no comments for FunctionParameters in the schema. + /// + public void AddToFunctionParameters(Parameter parameter) + { + base.AddObject("FunctionParameters", parameter); + } + /// + /// There are no comments for Procedures in the schema. + /// + public void AddToProcedures(Procedure procedure) + { + base.AddObject("Procedures", procedure); + } + /// + /// There are no comments for ProcedureParameters in the schema. + /// + public void AddToProcedureParameters(Parameter parameter) + { + base.AddObject("ProcedureParameters", parameter); + } + } + /// + /// There are no comments for ComplexType Store.TypeSpecification in the schema. + /// + [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] + [global::System.Serializable()] + [global::System.Data.Entity.Core.Objects.DataClasses.EdmComplexTypeAttribute(NamespaceName = "Store", Name = "TypeSpecification")] + public partial class TypeSpecification : global::System.Data.Entity.Core.Objects.DataClasses.ComplexObject + { + /// + /// Create a new TypeSpecification object. + /// + /// Initial value of TypeName. + /// Initial value of Collation. + /// Initial value of CharacterSet. + /// Initial value of IsMultiSet. + public static TypeSpecification CreateTypeSpecification(string typeName, Collation collation, CharacterSet characterSet, bool isMultiSet) + { + TypeSpecification typeSpecification = new TypeSpecification(); + typeSpecification.TypeName = typeName; + typeSpecification.Collation = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.VerifyComplexObjectIsNotNull(collation, "Collation"); + typeSpecification.CharacterSet = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.VerifyComplexObjectIsNotNull(characterSet, "CharacterSet"); + typeSpecification.IsMultiSet = isMultiSet; + return typeSpecification; + } + /// + /// There are no comments for Property TypeName in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string TypeName + { + get + { + return this._TypeName; + } + set + { + this.OnTypeNameChanging(value); + this.ReportPropertyChanging("TypeName"); + this._TypeName = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); + this.ReportPropertyChanged("TypeName"); + this.OnTypeNameChanged(); + } + } + private string _TypeName; + partial void OnTypeNameChanging(string value); + partial void OnTypeNameChanged(); + /// + /// There are no comments for Property MaxLength in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public global::System.Nullable MaxLength + { + get + { + return this._MaxLength; + } + set + { + this.OnMaxLengthChanging(value); + this.ReportPropertyChanging("MaxLength"); + this._MaxLength = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); + this.ReportPropertyChanged("MaxLength"); + this.OnMaxLengthChanged(); + } + } + private global::System.Nullable _MaxLength; + partial void OnMaxLengthChanging(global::System.Nullable value); + partial void OnMaxLengthChanged(); + /// + /// There are no comments for Property Precision in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public global::System.Nullable Precision + { + get + { + return this._Precision; + } + set + { + this.OnPrecisionChanging(value); + this.ReportPropertyChanging("Precision"); + this._Precision = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); + this.ReportPropertyChanged("Precision"); + this.OnPrecisionChanged(); + } + } + private global::System.Nullable _Precision; + partial void OnPrecisionChanging(global::System.Nullable value); + partial void OnPrecisionChanged(); + /// + /// There are no comments for Property DateTimePrecision in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public global::System.Nullable DateTimePrecision + { + get + { + return this._DateTimePrecision; + } + set + { + this.OnDateTimePrecisionChanging(value); + this.ReportPropertyChanging("DateTimePrecision"); + this._DateTimePrecision = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); + this.ReportPropertyChanged("DateTimePrecision"); + this.OnDateTimePrecisionChanged(); + } + } + private global::System.Nullable _DateTimePrecision; + partial void OnDateTimePrecisionChanging(global::System.Nullable value); + partial void OnDateTimePrecisionChanged(); + /// + /// There are no comments for Property Scale in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public global::System.Nullable Scale + { + get + { + return this._Scale; + } + set + { + this.OnScaleChanging(value); + this.ReportPropertyChanging("Scale"); + this._Scale = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); + this.ReportPropertyChanged("Scale"); + this.OnScaleChanged(); + } + } + private global::System.Nullable _Scale; + partial void OnScaleChanging(global::System.Nullable value); + partial void OnScaleChanged(); + /// + /// There are no comments for Property Collation in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmComplexPropertyAttribute()] + [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)] + [global::System.Xml.Serialization.XmlElement(IsNullable = true)] + [global::System.Xml.Serialization.SoapElement(IsNullable = true)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public Collation Collation + { + get + { + this._Collation = this.GetValidValue(this._Collation, "Collation", false, this._CollationInitialized); + this._CollationInitialized = true; + return this._Collation; + } + set + { + this.OnCollationChanging(value); + this.ReportPropertyChanging("Collation"); + this._Collation = this.SetValidValue(this._Collation, value, "Collation"); + this._CollationInitialized = true; + this.ReportPropertyChanged("Collation"); + this.OnCollationChanged(); + } + } + private Collation _Collation; + private bool _CollationInitialized; + partial void OnCollationChanging(Collation value); + partial void OnCollationChanged(); + /// + /// There are no comments for Property CharacterSet in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmComplexPropertyAttribute()] + [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)] + [global::System.Xml.Serialization.XmlElement(IsNullable = true)] + [global::System.Xml.Serialization.SoapElement(IsNullable = true)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public CharacterSet CharacterSet + { + get + { + this._CharacterSet = this.GetValidValue(this._CharacterSet, "CharacterSet", false, this._CharacterSetInitialized); + this._CharacterSetInitialized = true; + return this._CharacterSet; + } + set + { + this.OnCharacterSetChanging(value); + this.ReportPropertyChanging("CharacterSet"); + this._CharacterSet = this.SetValidValue(this._CharacterSet, value, "CharacterSet"); + this._CharacterSetInitialized = true; + this.ReportPropertyChanged("CharacterSet"); + this.OnCharacterSetChanged(); + } + } + private CharacterSet _CharacterSet; + private bool _CharacterSetInitialized; + partial void OnCharacterSetChanging(CharacterSet value); + partial void OnCharacterSetChanged(); + /// + /// There are no comments for Property IsMultiSet in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public bool IsMultiSet + { + get + { + return this._IsMultiSet; + } + set + { + this.OnIsMultiSetChanging(value); + this.ReportPropertyChanging("IsMultiSet"); + this._IsMultiSet = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); + this.ReportPropertyChanged("IsMultiSet"); + this.OnIsMultiSetChanged(); + } + } + private bool _IsMultiSet; + partial void OnIsMultiSetChanging(bool value); + partial void OnIsMultiSetChanged(); + } + /// + /// There are no comments for ComplexType Store.Collation in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmComplexTypeAttribute(NamespaceName = "Store", Name = "Collation")] + [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] + [global::System.Serializable()] + public partial class Collation : global::System.Data.Entity.Core.Objects.DataClasses.ComplexObject + { + /// + /// There are no comments for Property CatalogName in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string CatalogName + { + get + { + return this._CatalogName; + } + set + { + this.OnCatalogNameChanging(value); + this.ReportPropertyChanging("CatalogName"); + this._CatalogName = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); + this.ReportPropertyChanged("CatalogName"); + this.OnCatalogNameChanged(); + } + } + private string _CatalogName; + partial void OnCatalogNameChanging(string value); + partial void OnCatalogNameChanged(); + /// + /// There are no comments for Property SchemaName in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string SchemaName + { + get + { + return this._SchemaName; + } + set + { + this.OnSchemaNameChanging(value); + this.ReportPropertyChanging("SchemaName"); + this._SchemaName = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); + this.ReportPropertyChanged("SchemaName"); + this.OnSchemaNameChanged(); + } + } + private string _SchemaName; + partial void OnSchemaNameChanging(string value); + partial void OnSchemaNameChanged(); + /// + /// There are no comments for Property Name in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string Name + { + get + { + return this._Name; + } + set + { + this.OnNameChanging(value); + this.ReportPropertyChanging("Name"); + this._Name = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); + this.ReportPropertyChanged("Name"); + this.OnNameChanged(); + } + } + private string _Name; + partial void OnNameChanging(string value); + partial void OnNameChanged(); + } + /// + /// There are no comments for ComplexType Store.CharacterSet in the schema. + /// + [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] + [global::System.Serializable()] + [global::System.Data.Entity.Core.Objects.DataClasses.EdmComplexTypeAttribute(NamespaceName = "Store", Name = "CharacterSet")] + public partial class CharacterSet : global::System.Data.Entity.Core.Objects.DataClasses.ComplexObject + { + /// + /// There are no comments for Property CatalogName in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string CatalogName + { + get + { + return this._CatalogName; + } + set + { + this.OnCatalogNameChanging(value); + this.ReportPropertyChanging("CatalogName"); + this._CatalogName = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); + this.ReportPropertyChanged("CatalogName"); + this.OnCatalogNameChanged(); + } + } + private string _CatalogName; + partial void OnCatalogNameChanging(string value); + partial void OnCatalogNameChanged(); + /// + /// There are no comments for Property SchemaName in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string SchemaName + { + get + { + return this._SchemaName; + } + set + { + this.OnSchemaNameChanging(value); + this.ReportPropertyChanging("SchemaName"); + this._SchemaName = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); + this.ReportPropertyChanged("SchemaName"); + this.OnSchemaNameChanged(); + } + } + private string _SchemaName; + partial void OnSchemaNameChanging(string value); + partial void OnSchemaNameChanged(); + /// + /// There are no comments for Property Name in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string Name + { + get + { + return this._Name; + } + set + { + this.OnNameChanging(value); + this.ReportPropertyChanging("Name"); + this._Name = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); + this.ReportPropertyChanged("Name"); + this.OnNameChanged(); + } + } + private string _Name; + partial void OnNameChanging(string value); + partial void OnNameChanged(); + } + /// + /// There are no comments for Store.TableOrView in the schema. + /// + /// + /// Id + /// + [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] + [global::System.Serializable()] + [global::System.Runtime.Serialization.KnownTypeAttribute(typeof(global::Store.Table))] + [global::System.Runtime.Serialization.KnownTypeAttribute(typeof(global::Store.View))] + [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "TableOrView")] + public abstract partial class TableOrView : global::System.Data.Entity.Core.Objects.DataClasses.EntityObject + { + /// + /// There are no comments for Property Id in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string Id + { + get + { + return this._Id; + } + set + { + this.OnIdChanging(value); + this.ReportPropertyChanging("Id"); + this._Id = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); + this.ReportPropertyChanged("Id"); + this.OnIdChanged(); + } + } + private string _Id; + partial void OnIdChanging(string value); + partial void OnIdChanged(); + /// + /// There are no comments for Property Name in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string Name + { + get + { + return this._Name; + } + set + { + this.OnNameChanging(value); + this.ReportPropertyChanging("Name"); + this._Name = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); + this.ReportPropertyChanged("Name"); + this.OnNameChanged(); + } + } + private string _Name; + partial void OnNameChanging(string value); + partial void OnNameChanged(); + /// + /// There are no comments for Property CatalogName in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string CatalogName + { + get + { + return this._CatalogName; + } + set + { + this.OnCatalogNameChanging(value); + this.ReportPropertyChanging("CatalogName"); + this._CatalogName = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); + this.ReportPropertyChanged("CatalogName"); + this.OnCatalogNameChanged(); + } + } + private string _CatalogName; + partial void OnCatalogNameChanging(string value); + partial void OnCatalogNameChanged(); + /// + /// There are no comments for Property SchemaName in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string SchemaName + { + get + { + return this._SchemaName; + } + set + { + this.OnSchemaNameChanging(value); + this.ReportPropertyChanging("SchemaName"); + this._SchemaName = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); + this.ReportPropertyChanged("SchemaName"); + this.OnSchemaNameChanged(); + } + } + private string _SchemaName; + partial void OnSchemaNameChanging(string value); + partial void OnSchemaNameChanged(); + /// + /// There are no comments for Columns in the schema. + /// + [global::System.Xml.Serialization.XmlIgnoreAttribute()] + [global::System.Xml.Serialization.SoapIgnoreAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "TableOrViewColumn", "Column")] + public global::System.Data.Entity.Core.Objects.DataClasses.EntityCollection Columns + { + get + { + return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection("Store.TableOrViewColumn", "Column"); + } + set + { + if ((value != null)) + { + ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection("Store.TableOrViewColumn", "Column", value); + } + } + } + /// + /// There are no comments for Constraints in the schema. + /// + [global::System.Xml.Serialization.XmlIgnoreAttribute()] + [global::System.Xml.Serialization.SoapIgnoreAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "TableOrViewConstraint", "Constraint")] + public global::System.Data.Entity.Core.Objects.DataClasses.EntityCollection Constraints + { + get + { + return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection("Store.TableOrViewConstraint", "Constraint"); + } + set + { + if ((value != null)) + { + ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection("Store.TableOrViewConstraint", "Constraint", value); + } + } + } + } + /// + /// There are no comments for Store.Table in the schema. + /// + /// + /// Id + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "Table")] + [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] + [global::System.Serializable()] + public partial class Table : TableOrView + { + /// + /// Create a new Table object. + /// + /// Initial value of Id. + /// Initial value of Name. + public static Table CreateTable(string id, string name) + { + Table table = new Table(); + table.Id = id; + table.Name = name; + return table; + } + } + /// + /// There are no comments for Store.Column in the schema. + /// + /// + /// Id + /// + [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] + [global::System.Serializable()] + [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "Column")] + public partial class Column : global::System.Data.Entity.Core.Objects.DataClasses.EntityObject + { + /// + /// Create a new Column object. + /// + /// Initial value of Id. + /// Initial value of Name. + /// Initial value of Ordinal. + /// Initial value of IsNullable. + /// Initial value of ColumnType. + /// Initial value of IsIdentity. + /// Initial value of IsStoreGenerated. + public static Column CreateColumn(string id, string name, int ordinal, bool isNullable, TypeSpecification columnType, bool isIdentity, bool isStoreGenerated) + { + Column column = new Column(); + column.Id = id; + column.Name = name; + column.Ordinal = ordinal; + column.IsNullable = isNullable; + column.ColumnType = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.VerifyComplexObjectIsNotNull(columnType, "ColumnType"); + column.IsIdentity = isIdentity; + column.IsStoreGenerated = isStoreGenerated; + return column; + } + /// + /// There are no comments for Property Id in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string Id + { + get + { + return this._Id; + } + set + { + this.OnIdChanging(value); + this.ReportPropertyChanging("Id"); + this._Id = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); + this.ReportPropertyChanged("Id"); + this.OnIdChanged(); + } + } + private string _Id; + partial void OnIdChanging(string value); + partial void OnIdChanged(); + /// + /// There are no comments for Property Name in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string Name + { + get + { + return this._Name; + } + set + { + this.OnNameChanging(value); + this.ReportPropertyChanging("Name"); + this._Name = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); + this.ReportPropertyChanged("Name"); + this.OnNameChanged(); + } + } + private string _Name; + partial void OnNameChanging(string value); + partial void OnNameChanged(); + /// + /// There are no comments for Property Ordinal in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public int Ordinal + { + get + { + return this._Ordinal; + } + set + { + this.OnOrdinalChanging(value); + this.ReportPropertyChanging("Ordinal"); + this._Ordinal = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); + this.ReportPropertyChanged("Ordinal"); + this.OnOrdinalChanged(); + } + } + private int _Ordinal; + partial void OnOrdinalChanging(int value); + partial void OnOrdinalChanged(); + /// + /// There are no comments for Property IsNullable in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public bool IsNullable + { + get + { + return this._IsNullable; + } + set + { + this.OnIsNullableChanging(value); + this.ReportPropertyChanging("IsNullable"); + this._IsNullable = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); + this.ReportPropertyChanged("IsNullable"); + this.OnIsNullableChanged(); + } + } + private bool _IsNullable; + partial void OnIsNullableChanging(bool value); + partial void OnIsNullableChanged(); + /// + /// There are no comments for Property ColumnType in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmComplexPropertyAttribute()] + [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)] + [global::System.Xml.Serialization.XmlElement(IsNullable = true)] + [global::System.Xml.Serialization.SoapElement(IsNullable = true)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public TypeSpecification ColumnType + { + get + { + this._ColumnType = this.GetValidValue(this._ColumnType, "ColumnType", false, this._ColumnTypeInitialized); + this._ColumnTypeInitialized = true; + return this._ColumnType; + } + set + { + this.OnColumnTypeChanging(value); + this.ReportPropertyChanging("ColumnType"); + this._ColumnType = this.SetValidValue(this._ColumnType, value, "ColumnType"); + this._ColumnTypeInitialized = true; + this.ReportPropertyChanged("ColumnType"); + this.OnColumnTypeChanged(); + } + } + private TypeSpecification _ColumnType; + private bool _ColumnTypeInitialized; + partial void OnColumnTypeChanging(TypeSpecification value); + partial void OnColumnTypeChanged(); + /// + /// There are no comments for Property IsIdentity in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public bool IsIdentity + { + get + { + return this._IsIdentity; + } + set + { + this.OnIsIdentityChanging(value); + this.ReportPropertyChanging("IsIdentity"); + this._IsIdentity = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); + this.ReportPropertyChanged("IsIdentity"); + this.OnIsIdentityChanged(); + } + } + private bool _IsIdentity; + partial void OnIsIdentityChanging(bool value); + partial void OnIsIdentityChanged(); + /// + /// There are no comments for Property IsStoreGenerated in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public bool IsStoreGenerated + { + get + { + return this._IsStoreGenerated; + } + set + { + this.OnIsStoreGeneratedChanging(value); + this.ReportPropertyChanging("IsStoreGenerated"); + this._IsStoreGenerated = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); + this.ReportPropertyChanged("IsStoreGenerated"); + this.OnIsStoreGeneratedChanged(); + } + } + private bool _IsStoreGenerated; + partial void OnIsStoreGeneratedChanging(bool value); + partial void OnIsStoreGeneratedChanged(); + /// + /// There are no comments for Property Default in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string Default + { + get + { + return this._Default; + } + set + { + this.OnDefaultChanging(value); + this.ReportPropertyChanging("Default"); + this._Default = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); + this.ReportPropertyChanged("Default"); + this.OnDefaultChanged(); + } + } + private string _Default; + partial void OnDefaultChanging(string value); + partial void OnDefaultChanged(); + /// + /// There are no comments for Parent in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "TableOrViewColumn", "Parent")] + [global::System.Xml.Serialization.XmlIgnoreAttribute()] + [global::System.Xml.Serialization.SoapIgnoreAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public TableOrView Parent + { + get + { + return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.TableOrViewColumn", "Parent").Value; + } + set + { + ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.TableOrViewColumn", "Parent").Value = value; + } + } + /// + /// There are no comments for Parent in the schema. + /// + [global::System.ComponentModel.BrowsableAttribute(false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public global::System.Data.Entity.Core.Objects.DataClasses.EntityReference ParentReference + { + get + { + return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.TableOrViewColumn", "Parent"); + } + set + { + if ((value != null)) + { + ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedReference("Store.TableOrViewColumn", "Parent", value); + } + } + } + /// + /// There are no comments for Constraints in the schema. + /// + [global::System.Xml.Serialization.XmlIgnoreAttribute()] + [global::System.Xml.Serialization.SoapIgnoreAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "TableOrViewConstraintColumn", "Constraint")] + public global::System.Data.Entity.Core.Objects.DataClasses.EntityCollection Constraints + { + get + { + return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection("Store.TableOrViewConstraintColumn", "Constraint"); + } + set + { + if ((value != null)) + { + ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection("Store.TableOrViewConstraintColumn", "Constraint", value); + } + } + } + /// + /// There are no comments for ToForeignKeys in the schema. + /// + [global::System.Xml.Serialization.XmlIgnoreAttribute()] + [global::System.Xml.Serialization.SoapIgnoreAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "ToForeignKeyColumn", "ForeignKey")] + public global::System.Data.Entity.Core.Objects.DataClasses.EntityCollection ToForeignKeys + { + get + { + return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection("Store.ToForeignKeyColumn", "ForeignKey"); + } + set + { + if ((value != null)) + { + ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection("Store.ToForeignKeyColumn", "ForeignKey", value); + } + } + } + /// + /// There are no comments for FromForeignKeys in the schema. + /// + [global::System.Xml.Serialization.XmlIgnoreAttribute()] + [global::System.Xml.Serialization.SoapIgnoreAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "FromForeignKeyColumn", "ForeignKey")] + public global::System.Data.Entity.Core.Objects.DataClasses.EntityCollection FromForeignKeys + { + get + { + return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection("Store.FromForeignKeyColumn", "ForeignKey"); + } + set + { + if ((value != null)) + { + ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection("Store.FromForeignKeyColumn", "ForeignKey", value); + } + } + } + } + /// + /// There are no comments for Store.View in the schema. + /// + /// + /// Id + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "View")] + [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] + [global::System.Serializable()] + public partial class View : TableOrView + { + /// + /// Create a new View object. + /// + /// Initial value of Id. + /// Initial value of Name. + /// Initial value of IsUpdatable. + public static View CreateView(string id, string name, bool isUpdatable) + { + View view = new View(); + view.Id = id; + view.Name = name; + view.IsUpdatable = isUpdatable; + return view; + } + /// + /// There are no comments for Property IsUpdatable in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public bool IsUpdatable + { + get + { + return this._IsUpdatable; + } + set + { + this.OnIsUpdatableChanging(value); + this.ReportPropertyChanging("IsUpdatable"); + this._IsUpdatable = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); + this.ReportPropertyChanged("IsUpdatable"); + this.OnIsUpdatableChanged(); + } + } + private bool _IsUpdatable; + partial void OnIsUpdatableChanging(bool value); + partial void OnIsUpdatableChanged(); + /// + /// There are no comments for Property ViewDefinition in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string ViewDefinition + { + get + { + return this._ViewDefinition; + } + set + { + this.OnViewDefinitionChanging(value); + this.ReportPropertyChanging("ViewDefinition"); + this._ViewDefinition = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); + this.ReportPropertyChanged("ViewDefinition"); + this.OnViewDefinitionChanged(); + } + } + private string _ViewDefinition; + partial void OnViewDefinitionChanging(string value); + partial void OnViewDefinitionChanged(); + } + /// + /// There are no comments for Store.Routine in the schema. + /// + /// + /// Id + /// + [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] + [global::System.Serializable()] + [global::System.Runtime.Serialization.KnownTypeAttribute(typeof(global::Store.Function))] + [global::System.Runtime.Serialization.KnownTypeAttribute(typeof(global::Store.Procedure))] + [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "Routine")] + public abstract partial class Routine : global::System.Data.Entity.Core.Objects.DataClasses.EntityObject + { + /// + /// There are no comments for Property Id in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string Id + { + get + { + return this._Id; + } + set + { + this.OnIdChanging(value); + this.ReportPropertyChanging("Id"); + this._Id = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); + this.ReportPropertyChanged("Id"); + this.OnIdChanged(); + } + } + private string _Id; + partial void OnIdChanging(string value); + partial void OnIdChanged(); + /// + /// There are no comments for Property CatalogName in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string CatalogName + { + get + { + return this._CatalogName; + } + set + { + this.OnCatalogNameChanging(value); + this.ReportPropertyChanging("CatalogName"); + this._CatalogName = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); + this.ReportPropertyChanged("CatalogName"); + this.OnCatalogNameChanged(); + } + } + private string _CatalogName; + partial void OnCatalogNameChanging(string value); + partial void OnCatalogNameChanged(); + /// + /// There are no comments for Property SchemaName in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string SchemaName + { + get + { + return this._SchemaName; + } + set + { + this.OnSchemaNameChanging(value); + this.ReportPropertyChanging("SchemaName"); + this._SchemaName = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); + this.ReportPropertyChanged("SchemaName"); + this.OnSchemaNameChanged(); + } + } + private string _SchemaName; + partial void OnSchemaNameChanging(string value); + partial void OnSchemaNameChanged(); + /// + /// There are no comments for Property Name in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string Name + { + get + { + return this._Name; + } + set + { + this.OnNameChanging(value); + this.ReportPropertyChanging("Name"); + this._Name = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); + this.ReportPropertyChanged("Name"); + this.OnNameChanged(); + } + } + private string _Name; + partial void OnNameChanging(string value); + partial void OnNameChanged(); + /// + /// There are no comments for Parameters in the schema. + /// + [global::System.Xml.Serialization.XmlIgnoreAttribute()] + [global::System.Xml.Serialization.SoapIgnoreAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "RoutineParameter", "Parameter")] + public global::System.Data.Entity.Core.Objects.DataClasses.EntityCollection Parameters + { + get + { + return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection("Store.RoutineParameter", "Parameter"); + } + set + { + if ((value != null)) + { + ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection("Store.RoutineParameter", "Parameter", value); + } + } + } + } + /// + /// There are no comments for Store.Parameter in the schema. + /// + /// + /// Id + /// + [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] + [global::System.Serializable()] + [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "Parameter")] + public partial class Parameter : global::System.Data.Entity.Core.Objects.DataClasses.EntityObject + { + /// + /// Create a new Parameter object. + /// + /// Initial value of Id. + /// Initial value of Name. + /// Initial value of Ordinal. + /// Initial value of ParameterType. + public static Parameter CreateParameter(string id, string name, int ordinal, TypeSpecification parameterType) + { + Parameter parameter = new Parameter(); + parameter.Id = id; + parameter.Name = name; + parameter.Ordinal = ordinal; + parameter.ParameterType = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.VerifyComplexObjectIsNotNull(parameterType, "ParameterType"); + return parameter; + } + /// + /// There are no comments for Property Id in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string Id + { + get + { + return this._Id; + } + set + { + this.OnIdChanging(value); + this.ReportPropertyChanging("Id"); + this._Id = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); + this.ReportPropertyChanged("Id"); + this.OnIdChanged(); + } + } + private string _Id; + partial void OnIdChanging(string value); + partial void OnIdChanged(); + /// + /// There are no comments for Property Name in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string Name + { + get + { + return this._Name; + } + set + { + this.OnNameChanging(value); + this.ReportPropertyChanging("Name"); + this._Name = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); + this.ReportPropertyChanged("Name"); + this.OnNameChanged(); + } + } + private string _Name; + partial void OnNameChanging(string value); + partial void OnNameChanged(); + /// + /// There are no comments for Property Ordinal in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public int Ordinal + { + get + { + return this._Ordinal; + } + set + { + this.OnOrdinalChanging(value); + this.ReportPropertyChanging("Ordinal"); + this._Ordinal = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); + this.ReportPropertyChanged("Ordinal"); + this.OnOrdinalChanged(); + } + } + private int _Ordinal; + partial void OnOrdinalChanging(int value); + partial void OnOrdinalChanged(); + /// + /// There are no comments for Property ParameterType in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmComplexPropertyAttribute()] + [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)] + [global::System.Xml.Serialization.XmlElement(IsNullable = true)] + [global::System.Xml.Serialization.SoapElement(IsNullable = true)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public TypeSpecification ParameterType + { + get + { + this._ParameterType = this.GetValidValue(this._ParameterType, "ParameterType", false, this._ParameterTypeInitialized); + this._ParameterTypeInitialized = true; + return this._ParameterType; + } + set + { + this.OnParameterTypeChanging(value); + this.ReportPropertyChanging("ParameterType"); + this._ParameterType = this.SetValidValue(this._ParameterType, value, "ParameterType"); + this._ParameterTypeInitialized = true; + this.ReportPropertyChanged("ParameterType"); + this.OnParameterTypeChanged(); + } + } + private TypeSpecification _ParameterType; + private bool _ParameterTypeInitialized; + partial void OnParameterTypeChanging(TypeSpecification value); + partial void OnParameterTypeChanged(); + /// + /// There are no comments for Property Mode in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string Mode + { + get + { + return this._Mode; + } + set + { + this.OnModeChanging(value); + this.ReportPropertyChanging("Mode"); + this._Mode = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); + this.ReportPropertyChanged("Mode"); + this.OnModeChanged(); + } + } + private string _Mode; + partial void OnModeChanging(string value); + partial void OnModeChanged(); + /// + /// There are no comments for Property Default in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string Default + { + get + { + return this._Default; + } + set + { + this.OnDefaultChanging(value); + this.ReportPropertyChanging("Default"); + this._Default = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); + this.ReportPropertyChanged("Default"); + this.OnDefaultChanged(); + } + } + private string _Default; + partial void OnDefaultChanging(string value); + partial void OnDefaultChanged(); + /// + /// There are no comments for Routine in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "RoutineParameter", "Routine")] + [global::System.Xml.Serialization.XmlIgnoreAttribute()] + [global::System.Xml.Serialization.SoapIgnoreAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public Routine Routine + { + get + { + return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.RoutineParameter", "Routine").Value; + } + set + { + ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.RoutineParameter", "Routine").Value = value; + } + } + /// + /// There are no comments for Routine in the schema. + /// + [global::System.ComponentModel.BrowsableAttribute(false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public global::System.Data.Entity.Core.Objects.DataClasses.EntityReference RoutineReference + { + get + { + return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.RoutineParameter", "Routine"); + } + set + { + if ((value != null)) + { + ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedReference("Store.RoutineParameter", "Routine", value); + } + } + } + } + /// + /// There are no comments for Store.Function in the schema. + /// + /// + /// Id + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "Function")] + [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] + [global::System.Serializable()] + [global::System.Runtime.Serialization.KnownTypeAttribute(typeof(global::Store.ScalarFunction))] + public abstract partial class Function : Routine + { + /// + /// There are no comments for Property IsBuiltIn in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public global::System.Nullable IsBuiltIn + { + get + { + return this._IsBuiltIn; + } + set + { + this.OnIsBuiltInChanging(value); + this.ReportPropertyChanging("IsBuiltIn"); + this._IsBuiltIn = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); + this.ReportPropertyChanged("IsBuiltIn"); + this.OnIsBuiltInChanged(); + } + } + private global::System.Nullable _IsBuiltIn; + partial void OnIsBuiltInChanging(global::System.Nullable value); + partial void OnIsBuiltInChanged(); + /// + /// There are no comments for Property IsNiladic in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public global::System.Nullable IsNiladic + { + get + { + return this._IsNiladic; + } + set + { + this.OnIsNiladicChanging(value); + this.ReportPropertyChanging("IsNiladic"); + this._IsNiladic = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); + this.ReportPropertyChanged("IsNiladic"); + this.OnIsNiladicChanged(); + } + } + private global::System.Nullable _IsNiladic; + partial void OnIsNiladicChanging(global::System.Nullable value); + partial void OnIsNiladicChanged(); + } + /// + /// There are no comments for Store.ScalarFunction in the schema. + /// + /// + /// Id + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "ScalarFunction")] + [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] + [global::System.Serializable()] + public partial class ScalarFunction : Function + { + /// + /// Create a new ScalarFunction object. + /// + /// Initial value of Id. + /// Initial value of Name. + /// Initial value of ReturnType. + public static ScalarFunction CreateScalarFunction(string id, string name, TypeSpecification returnType) + { + ScalarFunction scalarFunction = new ScalarFunction(); + scalarFunction.Id = id; + scalarFunction.Name = name; + scalarFunction.ReturnType = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.VerifyComplexObjectIsNotNull(returnType, "ReturnType"); + return scalarFunction; + } + /// + /// There are no comments for Property ReturnType in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmComplexPropertyAttribute()] + [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)] + [global::System.Xml.Serialization.XmlElement(IsNullable = true)] + [global::System.Xml.Serialization.SoapElement(IsNullable = true)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public TypeSpecification ReturnType + { + get + { + this._ReturnType = this.GetValidValue(this._ReturnType, "ReturnType", false, this._ReturnTypeInitialized); + this._ReturnTypeInitialized = true; + return this._ReturnType; + } + set + { + this.OnReturnTypeChanging(value); + this.ReportPropertyChanging("ReturnType"); + this._ReturnType = this.SetValidValue(this._ReturnType, value, "ReturnType"); + this._ReturnTypeInitialized = true; + this.ReportPropertyChanged("ReturnType"); + this.OnReturnTypeChanged(); + } + } + private TypeSpecification _ReturnType; + private bool _ReturnTypeInitialized; + partial void OnReturnTypeChanging(TypeSpecification value); + partial void OnReturnTypeChanged(); + /// + /// There are no comments for Property IsAggregate in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public global::System.Nullable IsAggregate + { + get + { + return this._IsAggregate; + } + set + { + this.OnIsAggregateChanging(value); + this.ReportPropertyChanging("IsAggregate"); + this._IsAggregate = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); + this.ReportPropertyChanged("IsAggregate"); + this.OnIsAggregateChanged(); + } + } + private global::System.Nullable _IsAggregate; + partial void OnIsAggregateChanging(global::System.Nullable value); + partial void OnIsAggregateChanged(); + } + /// + /// There are no comments for Store.Procedure in the schema. + /// + /// + /// Id + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "Procedure")] + [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] + [global::System.Serializable()] + public partial class Procedure : Routine + { + /// + /// Create a new Procedure object. + /// + /// Initial value of Id. + /// Initial value of Name. + public static Procedure CreateProcedure(string id, string name) + { + Procedure procedure = new Procedure(); + procedure.Id = id; + procedure.Name = name; + return procedure; + } + } + /// + /// There are no comments for Store.Constraint in the schema. + /// + /// + /// Id + /// + [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] + [global::System.Serializable()] + [global::System.Runtime.Serialization.KnownTypeAttribute(typeof(global::Store.TableOrViewColumnConstraint))] + [global::System.Runtime.Serialization.KnownTypeAttribute(typeof(global::Store.ForeignKeyConstraint))] + [global::System.Runtime.Serialization.KnownTypeAttribute(typeof(global::Store.CheckConstraint))] + [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "Constraint")] + public abstract partial class Constraint : global::System.Data.Entity.Core.Objects.DataClasses.EntityObject + { + /// + /// There are no comments for Property Id in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string Id + { + get + { + return this._Id; + } + set + { + this.OnIdChanging(value); + this.ReportPropertyChanging("Id"); + this._Id = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); + this.ReportPropertyChanged("Id"); + this.OnIdChanged(); + } + } + private string _Id; + partial void OnIdChanging(string value); + partial void OnIdChanged(); + /// + /// There are no comments for Property Name in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string Name + { + get + { + return this._Name; + } + set + { + this.OnNameChanging(value); + this.ReportPropertyChanging("Name"); + this._Name = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); + this.ReportPropertyChanged("Name"); + this.OnNameChanged(); + } + } + private string _Name; + partial void OnNameChanging(string value); + partial void OnNameChanged(); + /// + /// There are no comments for Property IsDeferrable in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public bool IsDeferrable + { + get + { + return this._IsDeferrable; + } + set + { + this.OnIsDeferrableChanging(value); + this.ReportPropertyChanging("IsDeferrable"); + this._IsDeferrable = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); + this.ReportPropertyChanged("IsDeferrable"); + this.OnIsDeferrableChanged(); + } + } + private bool _IsDeferrable; + partial void OnIsDeferrableChanging(bool value); + partial void OnIsDeferrableChanged(); + /// + /// There are no comments for Property IsInitiallyDeferred in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public bool IsInitiallyDeferred + { + get + { + return this._IsInitiallyDeferred; + } + set + { + this.OnIsInitiallyDeferredChanging(value); + this.ReportPropertyChanging("IsInitiallyDeferred"); + this._IsInitiallyDeferred = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); + this.ReportPropertyChanged("IsInitiallyDeferred"); + this.OnIsInitiallyDeferredChanged(); + } + } + private bool _IsInitiallyDeferred; + partial void OnIsInitiallyDeferredChanging(bool value); + partial void OnIsInitiallyDeferredChanged(); + /// + /// There are no comments for Parent in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "TableOrViewConstraint", "Parent")] + [global::System.Xml.Serialization.XmlIgnoreAttribute()] + [global::System.Xml.Serialization.SoapIgnoreAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public TableOrView Parent + { + get + { + return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.TableOrViewConstraint", "Parent").Value; + } + set + { + ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.TableOrViewConstraint", "Parent").Value = value; + } + } + /// + /// There are no comments for Parent in the schema. + /// + [global::System.ComponentModel.BrowsableAttribute(false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public global::System.Data.Entity.Core.Objects.DataClasses.EntityReference ParentReference + { + get + { + return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.TableOrViewConstraint", "Parent"); + } + set + { + if ((value != null)) + { + ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedReference("Store.TableOrViewConstraint", "Parent", value); + } + } + } + } + /// + /// There are no comments for Store.CheckConstraint in the schema. + /// + /// + /// Id + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "CheckConstraint")] + [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] + [global::System.Serializable()] + public partial class CheckConstraint : Constraint + { + /// + /// Create a new CheckConstraint object. + /// + /// Initial value of Id. + /// Initial value of Name. + /// Initial value of IsDeferrable. + /// Initial value of IsInitiallyDeferred. + public static CheckConstraint CreateCheckConstraint(string id, string name, bool isDeferrable, bool isInitiallyDeferred) + { + CheckConstraint checkConstraint = new CheckConstraint(); + checkConstraint.Id = id; + checkConstraint.Name = name; + checkConstraint.IsDeferrable = isDeferrable; + checkConstraint.IsInitiallyDeferred = isInitiallyDeferred; + return checkConstraint; + } + /// + /// There are no comments for Property Expression in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string Expression + { + get + { + return this._Expression; + } + set + { + this.OnExpressionChanging(value); + this.ReportPropertyChanging("Expression"); + this._Expression = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); + this.ReportPropertyChanged("Expression"); + this.OnExpressionChanged(); + } + } + private string _Expression; + partial void OnExpressionChanging(string value); + partial void OnExpressionChanged(); + } + /// + /// There are no comments for Store.TableOrViewColumnConstraint in the schema. + /// + /// + /// Id + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "TableOrViewColumnConstraint")] + [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] + [global::System.Serializable()] + [global::System.Runtime.Serialization.KnownTypeAttribute(typeof(global::Store.PrimaryKeyConstraint))] + [global::System.Runtime.Serialization.KnownTypeAttribute(typeof(global::Store.UniqueConstraint))] + public abstract partial class TableOrViewColumnConstraint : Constraint + { + /// + /// There are no comments for Columns in the schema. + /// + [global::System.Xml.Serialization.XmlIgnoreAttribute()] + [global::System.Xml.Serialization.SoapIgnoreAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "TableOrViewConstraintColumn", "Column")] + public global::System.Data.Entity.Core.Objects.DataClasses.EntityCollection Columns + { + get + { + return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection("Store.TableOrViewConstraintColumn", "Column"); + } + set + { + if ((value != null)) + { + ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection("Store.TableOrViewConstraintColumn", "Column", value); + } + } + } + } + /// + /// There are no comments for Store.PrimaryKeyConstraint in the schema. + /// + /// + /// Id + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "PrimaryKeyConstraint")] + [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] + [global::System.Serializable()] + public partial class PrimaryKeyConstraint : TableOrViewColumnConstraint + { + /// + /// Create a new PrimaryKeyConstraint object. + /// + /// Initial value of Id. + /// Initial value of Name. + /// Initial value of IsDeferrable. + /// Initial value of IsInitiallyDeferred. + public static PrimaryKeyConstraint CreatePrimaryKeyConstraint(string id, string name, bool isDeferrable, bool isInitiallyDeferred) + { + PrimaryKeyConstraint primaryKeyConstraint = new PrimaryKeyConstraint(); + primaryKeyConstraint.Id = id; + primaryKeyConstraint.Name = name; + primaryKeyConstraint.IsDeferrable = isDeferrable; + primaryKeyConstraint.IsInitiallyDeferred = isInitiallyDeferred; + return primaryKeyConstraint; + } + } + /// + /// There are no comments for Store.UniqueConstraint in the schema. + /// + /// + /// Id + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "UniqueConstraint")] + [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] + [global::System.Serializable()] + public partial class UniqueConstraint : TableOrViewColumnConstraint + { + /// + /// Create a new UniqueConstraint object. + /// + /// Initial value of Id. + /// Initial value of Name. + /// Initial value of IsDeferrable. + /// Initial value of IsInitiallyDeferred. + public static UniqueConstraint CreateUniqueConstraint(string id, string name, bool isDeferrable, bool isInitiallyDeferred) + { + UniqueConstraint uniqueConstraint = new UniqueConstraint(); + uniqueConstraint.Id = id; + uniqueConstraint.Name = name; + uniqueConstraint.IsDeferrable = isDeferrable; + uniqueConstraint.IsInitiallyDeferred = isInitiallyDeferred; + return uniqueConstraint; + } + } + /// + /// There are no comments for Store.ForeignKeyConstraint in the schema. + /// + /// + /// Id + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "ForeignKeyConstraint")] + [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] + [global::System.Serializable()] + public partial class ForeignKeyConstraint : Constraint + { + /// + /// Create a new ForeignKeyConstraint object. + /// + /// Initial value of Id. + /// Initial value of Name. + /// Initial value of IsDeferrable. + /// Initial value of IsInitiallyDeferred. + /// Initial value of UpdateRule. + /// Initial value of DeleteRule. + public static ForeignKeyConstraint CreateForeignKeyConstraint(string id, string name, bool isDeferrable, bool isInitiallyDeferred, string updateRule, string deleteRule) + { + ForeignKeyConstraint foreignKeyConstraint = new ForeignKeyConstraint(); + foreignKeyConstraint.Id = id; + foreignKeyConstraint.Name = name; + foreignKeyConstraint.IsDeferrable = isDeferrable; + foreignKeyConstraint.IsInitiallyDeferred = isInitiallyDeferred; + foreignKeyConstraint.UpdateRule = updateRule; + foreignKeyConstraint.DeleteRule = deleteRule; + return foreignKeyConstraint; + } + /// + /// There are no comments for Property UpdateRule in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string UpdateRule + { + get + { + return this._UpdateRule; + } + set + { + this.OnUpdateRuleChanging(value); + this.ReportPropertyChanging("UpdateRule"); + this._UpdateRule = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); + this.ReportPropertyChanged("UpdateRule"); + this.OnUpdateRuleChanged(); + } + } + private string _UpdateRule; + partial void OnUpdateRuleChanging(string value); + partial void OnUpdateRuleChanged(); + /// + /// There are no comments for Property DeleteRule in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string DeleteRule + { + get + { + return this._DeleteRule; + } + set + { + this.OnDeleteRuleChanging(value); + this.ReportPropertyChanging("DeleteRule"); + this._DeleteRule = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); + this.ReportPropertyChanged("DeleteRule"); + this.OnDeleteRuleChanged(); + } + } + private string _DeleteRule; + partial void OnDeleteRuleChanging(string value); + partial void OnDeleteRuleChanged(); + /// + /// There are no comments for ForeignKeys in the schema. + /// + [global::System.Xml.Serialization.XmlIgnoreAttribute()] + [global::System.Xml.Serialization.SoapIgnoreAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "ConstraintForeignKey", "ForeignKey")] + public global::System.Data.Entity.Core.Objects.DataClasses.EntityCollection ForeignKeys + { + get + { + return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection("Store.ConstraintForeignKey", "ForeignKey"); + } + set + { + if ((value != null)) + { + ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection("Store.ConstraintForeignKey", "ForeignKey", value); + } + } + } + } + /// + /// There are no comments for Store.ForeignKey in the schema. + /// + /// + /// Id + /// + [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] + [global::System.Serializable()] + [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "ForeignKey")] + public partial class ForeignKey : global::System.Data.Entity.Core.Objects.DataClasses.EntityObject + { + /// + /// Create a new ForeignKey object. + /// + /// Initial value of Id. + /// Initial value of Ordinal. + public static ForeignKey CreateForeignKey(string id, int ordinal) + { + ForeignKey foreignKey = new ForeignKey(); + foreignKey.Id = id; + foreignKey.Ordinal = ordinal; + return foreignKey; + } + /// + /// There are no comments for Property Id in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public string Id + { + get + { + return this._Id; + } + set + { + this.OnIdChanging(value); + this.ReportPropertyChanging("Id"); + this._Id = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); + this.ReportPropertyChanged("Id"); + this.OnIdChanged(); + } + } + private string _Id; + partial void OnIdChanging(string value); + partial void OnIdChanged(); + /// + /// There are no comments for Property Ordinal in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public int Ordinal + { + get + { + return this._Ordinal; + } + set + { + this.OnOrdinalChanging(value); + this.ReportPropertyChanging("Ordinal"); + this._Ordinal = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); + this.ReportPropertyChanged("Ordinal"); + this.OnOrdinalChanged(); + } + } + private int _Ordinal; + partial void OnOrdinalChanging(int value); + partial void OnOrdinalChanged(); + /// + /// There are no comments for Constraint in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "ConstraintForeignKey", "Constraint")] + [global::System.Xml.Serialization.XmlIgnoreAttribute()] + [global::System.Xml.Serialization.SoapIgnoreAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public ForeignKeyConstraint Constraint + { + get + { + return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.ConstraintForeignKey", "Constraint").Value; + } + set + { + ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.ConstraintForeignKey", "Constraint").Value = value; + } + } + /// + /// There are no comments for Constraint in the schema. + /// + [global::System.ComponentModel.BrowsableAttribute(false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public global::System.Data.Entity.Core.Objects.DataClasses.EntityReference ConstraintReference + { + get + { + return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.ConstraintForeignKey", "Constraint"); + } + set + { + if ((value != null)) + { + ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedReference("Store.ConstraintForeignKey", "Constraint", value); + } + } + } + /// + /// There are no comments for FromColumn in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "FromForeignKeyColumn", "Column")] + [global::System.Xml.Serialization.XmlIgnoreAttribute()] + [global::System.Xml.Serialization.SoapIgnoreAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public Column FromColumn + { + get + { + return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.FromForeignKeyColumn", "Column").Value; + } + set + { + ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.FromForeignKeyColumn", "Column").Value = value; + } + } + /// + /// There are no comments for FromColumn in the schema. + /// + [global::System.ComponentModel.BrowsableAttribute(false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public global::System.Data.Entity.Core.Objects.DataClasses.EntityReference FromColumnReference + { + get + { + return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.FromForeignKeyColumn", "Column"); + } + set + { + if ((value != null)) + { + ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedReference("Store.FromForeignKeyColumn", "Column", value); + } + } + } + /// + /// There are no comments for ToColumn in the schema. + /// + [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "ToForeignKeyColumn", "Column")] + [global::System.Xml.Serialization.XmlIgnoreAttribute()] + [global::System.Xml.Serialization.SoapIgnoreAttribute()] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public Column ToColumn + { + get + { + return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.ToForeignKeyColumn", "Column").Value; + } + set + { + ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.ToForeignKeyColumn", "Column").Value = value; + } + } + /// + /// There are no comments for ToColumn in the schema. + /// + [global::System.ComponentModel.BrowsableAttribute(false)] + [global::System.Runtime.Serialization.DataMemberAttribute()] + public global::System.Data.Entity.Core.Objects.DataClasses.EntityReference ToColumnReference + { + get + { + return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.ToForeignKeyColumn", "Column"); + } + set + { + if ((value != null)) + { + ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedReference("Store.ToForeignKeyColumn", "Column", value); + } + } + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/SetOperators.cs b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/SetOperators.cs new file mode 100644 index 000000000..831028559 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/SetOperators.cs @@ -0,0 +1,101 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Data; +using MySql.Data.MySqlClient; +using System.Linq; +using NUnit.Framework; + +namespace MySql.Data.EntityFramework.Tests +{ + public class SetOperators : DefaultFixture + { + public override void SetUp() + { + LoadData(); + } + + public override void LoadData() + { + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + ctx.Products.Add(new Product() { Name = "Garbage Truck", MinAge = 8 }); + ctx.Products.Add(new Product() { Name = "Fire Truck", MinAge = 12 }); + ctx.Products.Add(new Product() { Name = "Hula Hoop", MinAge = 18 }); + ctx.SaveChanges(); + } + } + + [Test] + public void Any() + { + // find all authors that are in our db with no books + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + var q = from a in ctx.Authors where !a.Books.Any() select a; + string sql = q.ToString(); + CheckSql(sql, + @"SELECT `Extent1`.`Id`, `Extent1`.`Name`, `Extent1`.`Age`, `Extent1`.`Address_City`, `Extent1`.`Address_Street`, + `Extent1`.`Address_State`, `Extent1`.`Address_ZipCode` FROM `Authors` AS `Extent1` WHERE NOT EXISTS(SELECT + 1 AS `C1` FROM `Books` AS `Extent2` WHERE `Extent1`.`Id` = `Extent2`.`Author_Id`)"); + } + } + + [Test] + public void FirstSimple() + { + MySqlCommand cmd = new MySqlCommand("SELECT Id FROM Products", Connection); + int id = (int)cmd.ExecuteScalar(); + + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + var q = from p in ctx.Products + select p; + Product product = q.First() as Product; + + Assert.That(product.Id, Is.EqualTo(id)); + } + } + + [Test] + public void FirstPredicate() + { + MySqlCommand cmd = new MySqlCommand("SELECT Id FROM Products WHERE MinAge > 8", Connection); + int id = (int)cmd.ExecuteScalar(); + + using (DefaultContext ctx = new DefaultContext(ConnectionString)) + { + var q = from p in ctx.Products + where p.MinAge > 8 + select p; + Product product = q.First() as Product; + Assert.That(product.Id, Is.EqualTo(id)); + } + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/SimpleQuery.cs b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/SimpleQuery.cs new file mode 100644 index 000000000..5b5a5f857 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/SimpleQuery.cs @@ -0,0 +1,91 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Linq; +using NUnit.Framework; + +namespace MySql.Data.EntityFramework.Tests +{ + public class SimpleQuery : DefaultFixture + { + [OneTimeTearDown] + public new void OneTimeTearDown() + { + ExecSQL($"DROP DATABASE IF EXISTS `blogcontext`;"); + } + + [Test] + public void SimpleFindAll() + { + + using (DefaultContext ctx = GetDefaultContext()) + { + var q = from b in ctx.Books select b; + string sql = q.ToString(); + + var expected = @"SELECT `Extent1`.`Id`, `Extent1`.`Name`, `Extent1`.`PubDate`, `Extent1`.`Pages`, + `Extent1`.`Author_Id` FROM `Books` AS `Extent1`"; + CheckSql(sql, expected); + } + } + + [Test] + public void SimpleFindAllWithCondition() + { + + using (DefaultContext ctx = GetDefaultContext()) + { + var q = from b in ctx.Books where b.Id == 1 select b; + string sql = q.ToString(); + + var expected = @"SELECT `Extent1`.`Id`, `Extent1`.`Name`, `Extent1`.`PubDate`, `Extent1`.`Pages`, + `Extent1`.`Author_Id` FROM `Books` AS `Extent1` WHERE 1 = `Extent1`.`Id`"; + CheckSql(sql, expected); + } + } + + /// + /// Bug #32358174 - MYSQL.DATA.MYSQLCLIENT.MYSQLEXCEPTION: TABLE 'DB.DB.DB.TABLE' DOESN'T EXIST + /// + [Test] + public void TablesWithSchemaWithoutUsingProperty() + { + using (BlogContext context = new BlogContext(ConnectionString.Replace("db-simplequery", "blogcontext"))) + { + context.Database.CreateIfNotExists(); + + context.User.Add(new User { Id = 1, Name = "foo" }); + context.User.Add(new User { Id = 2, Name = "bar" }); + context.SaveChanges(); + + var q = (from u in context.User select u).ToArray(); + Assert.That(q.Length == 2); + } + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/UpdateTests.cs b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/UpdateTests.cs new file mode 100644 index 000000000..887e14908 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/UpdateTests.cs @@ -0,0 +1,74 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Diagnostics; +using System.Text.RegularExpressions; +using MySql.Data.MySqlClient; +using NUnit.Framework; + +namespace MySql.Data.EntityFramework.Tests +{ + public class UpdateTests : DefaultFixture + { + /// + /// Fix for "Connector/NET Generates Incorrect SELECT Clause after UPDATE" (MySql bug #62134, Oracle bug #13491689). + /// + [Test] + public void UpdateSimple() + { + var sb = new MySqlConnectionStringBuilder(ConnectionString); + sb.Logging = true; + using (DefaultContext ctx = new DefaultContext(sb.ToString())) + { + MySqlTrace.Listeners.Clear(); + MySqlTrace.Switch.Level = SourceLevels.All; + GenericListener listener = new GenericListener(); + MySqlTrace.Listeners.Add(listener); + + Product p = new Product() { Name = "Acme" }; + ctx.Products.Add(p); + ctx.SaveChanges(); + + p.Name = "Acme 2"; + ctx.SaveChanges(); + + Regex rx = new Regex(@"Query Opened: (?UPDATE .*)", RegexOptions.Compiled | RegexOptions.Singleline); + foreach (string s in listener.Strings) + { + Match m = rx.Match(s); + if (m.Success) + { + CheckSqlContains(m.Groups["item"].Value, + @"UPDATE `Products` SET `Name`='Acme 2' WHERE `Id` = 1; + SELECT `CreatedDate` FROM `Products` WHERE row_count() = 1 and (`Id` = 1)"); + } + } + } + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/Wizard.cs b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/Wizard.cs new file mode 100644 index 000000000..331db08b4 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Basic.Tests/Wizard.cs @@ -0,0 +1,71 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using MySql.Data.MySqlClient; +using System.Xml; +using NUnit.Framework; +using System.Data.Entity.Core.Common; + +namespace MySql.Data.EntityFramework.Tests +{ + // This test unit covers the tests that the wizard runs when generating a model + // from an existing database + public class WizardTests : DefaultFixture + { + [Test] + public void GetDbProviderManifestTokenReturnsCorrectSchemaVersion() + { + MySqlProviderServices services = new MySqlProviderServices(); + string token = services.GetProviderManifestToken(Connection); + + if (Version < new Version(5, 1)) + Assert.That(token, Is.EqualTo("5.0")); + else if (Version < new Version(5, 5)) + Assert.That(token, Is.EqualTo("5.1")); + else if (Version < new Version(5, 6)) + Assert.That(token, Is.EqualTo("5.5")); + else if (Version < new Version(5, 7)) + Assert.That(token, Is.EqualTo("5.6")); + else if (Version < new Version(8, 0)) + Assert.That(token, Is.EqualTo("5.7")); + else + Assert.That(token, Is.EqualTo("8.0")); + } + + [Test] + public void GetStoreSchemaDescriptionDoesNotThrowForServer50OrGreater() + { + MySqlProviderManifest manifest = new MySqlProviderManifest(Version.Major + "." + Version.Minor); + using (XmlReader reader = manifest.GetInformation(DbXmlEnabledProviderManifest.StoreSchemaDefinition)) + { + Assert.That(reader, Is.Not.Null); + } + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/App.config b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/App.config new file mode 100644 index 000000000..a7204de23 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/App.config @@ -0,0 +1,20 @@ + + + +
+ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Blogs.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Blogs.cs new file mode 100644 index 000000000..46654e07f --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Blogs.cs @@ -0,0 +1,50 @@ +// Copyright © 2020, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Data.Entity; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + public class BlogContext : DbContext + { + public BlogContext() : base(CodeFirstFixture.GetEFConnectionString()) { } + + public DbSet Blog { get; set; } + + } + + [Table("blogtable", Schema = "blogschema")] + public class Blog + { + [Key] + public int BlogId { get; set; } + public string Title { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/CodeFirstFixture.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/CodeFirstFixture.cs new file mode 100644 index 000000000..95fe2c649 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/CodeFirstFixture.cs @@ -0,0 +1,194 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System.Data; +using System.Configuration; +using System.Reflection; +using System; +using System.Diagnostics; +using System.IO; +using System.Text; +using NUnit.Framework; +using System.Data.Entity.Core.EntityClient; +using System.Data.Entity; +using MySql.Data.EntityFramework.Tests; +using MySql.EntityFramework.CodeFirst.Tests; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + public class CodeFirstFixture : DefaultFixture + { + // A trace listener to use during testing. + private AssertFailTraceListener asertFailListener = new AssertFailTraceListener(); + + public CodeFirstFixture() + { + // Initilizes MySql EF configuration + MySqlEFConfiguration.SetConfiguration(new MySqlEFConfiguration()); + } + + [OneTimeSetUp] + public new void OneTimeSetup() + { + // Override sql_mode so it converts automatically from varchar(65535) to text + MySqlCommand cmd = new MySqlCommand("SET GLOBAL SQL_MODE=``", Connection); + cmd.ExecuteNonQuery(); + + // Replace existing listeners with listener for testing. + Trace.Listeners.Clear(); + Trace.Listeners.Add(this.asertFailListener); + + DataSet dataSet = ConfigurationManager.GetSection("system.data") as DataSet; + if (dataSet != null) + { + DataView vi = dataSet.Tables[0].DefaultView; + vi.Sort = "Name"; + int idx = -1; + if (((idx = vi.Find("MySql")) != -1) || ((idx = vi.Find("MySQL Data Provider")) != -1)) + { + DataRow row = vi[idx].Row; + dataSet.Tables[0].Rows.Remove(row); + } + dataSet.Tables[0].Rows.Add("MySql" + , "MySql.Data.MySqlClient" + , "MySql.Data.MySqlClient" + , + typeof(MySqlClientFactory).AssemblyQualifiedName); + } + + cmd = new MySqlCommand("SELECT COUNT(SCHEMA_NAME) FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'sakila'", Connection); + + if (Convert.ToInt32(cmd.ExecuteScalar() ?? 0) == 0) + { + Assembly executingAssembly = Assembly.GetExecutingAssembly(); + using (var stream = executingAssembly.GetManifestResourceStream("MySql.EntityFramework.CodeFirst.Tests.Properties.sakila-schema.sql")) + { + using (StreamReader sr = new StreamReader(stream)) + { + string sql = sr.ReadToEnd(); + MySqlScript s = new MySqlScript(Connection, sql); + s.Execute(); + } + } + + using (var stream = executingAssembly.GetManifestResourceStream("MySql.EntityFramework.CodeFirst.Tests.Properties.sakila-data.sql")) + { + using (StreamReader sr = new StreamReader(stream)) + { + string sql = sr.ReadToEnd(); + MySqlScript s = new MySqlScript(Connection, sql); + s.Execute(); + } + } + } + } + + [OneTimeTearDown] + public new void OneTimeTearDown() + { + DeleteContext(); + DeleteContext(); + DeleteContext(); + DeleteContext(); + DeleteContext(); + DeleteContext(); + DeleteContext(); + DeleteContext(); + DeleteContext(); + DeleteContext(); + DeleteContext(); + DeleteContext(); + DeleteContext(); + DeleteContext(); + DeleteContext(); + DeleteContext(); + DeleteContext(); + DeleteContext(); + DeleteContext(); + DeleteContext(); + DeleteContext(); + DeleteContext(); + DeleteContext(); + DeleteContext(); + } + + public static string GetEFConnectionString(string database = null) where T : DbContext + { + MySqlConnectionStringBuilder sb = new MySqlConnectionStringBuilder(); + sb.Server = "localhost"; + string port = Environment.GetEnvironmentVariable("MYSQL_PORT"); + sb.Port = string.IsNullOrEmpty(port) ? 3306 : uint.Parse(port); + sb.UserID = "root"; + sb.Pooling = false; + sb.AllowUserVariables = true; + sb.Database = database ?? typeof(T).Name; + + return sb.ToString(); + } + + private void DeleteContext() where T : DbContext, new() + { + using (var context = new T()) + { + context.Database.Delete(); + } + } + + private EntityConnection GetEntityConnection() + { + return null; + } + + internal protected static new void CheckSql(string sql, string refSql) + { + StringBuilder str1 = new StringBuilder(); + StringBuilder str2 = new StringBuilder(); + foreach (char c in sql) + if (!Char.IsWhiteSpace(c)) + str1.Append(c); + foreach (char c in refSql) + if (!Char.IsWhiteSpace(c)) + str2.Append(c); + Assert.That(String.Compare(str1.ToString(), str2.ToString(), true), Is.EqualTo(0)); + } + + private class AssertFailTraceListener : DefaultTraceListener + { + public override void Fail(string message) + { + Assert.That(message == String.Empty, "Failure: " + message); + } + + public override void Fail(string message, string detailMessage) + { + Assert.That(message == String.Empty, "Failure: " + message); + } + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/CodeFirstTests.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/CodeFirstTests.cs new file mode 100644 index 000000000..5796c3e1e --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/CodeFirstTests.cs @@ -0,0 +1,2292 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.EntityFramework.Tests; +using MySql.Data.MySqlClient; +using MySql.EntityFramework.CodeFirst.Tests; +using MySql.EntityFramework.CodeFirst.Tests.Properties; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Entity; +using System.Data.Entity.Infrastructure; +using System.Data.Entity.Spatial; +using System.Diagnostics; +using System.Linq; +using System.Text.RegularExpressions; +using System.Threading; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + public class CodeFirstTests : CodeFirstFixture + { + /// + /// Tests for fix of http://bugs.mysql.com/bug.php?id=61230 + /// ("The provider did not return a ProviderManifestToken string."). + /// + [Test] + public void SimpleCodeFirstSelect() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + MovieDBContext db = new MovieDBContext(); + db.Database.Initialize(true); + MovieDBInitialize.DoDataPopulation(db); + var l = db.Movies.ToList(); + int j = l.Count; + foreach (var i in l) + { + j--; + } + Assert.That(j, Is.EqualTo(0)); + } + + /// + /// Tests for fix of http://bugs.mysql.com/bug.php?id=62150 + /// ("EF4.1, Code First, CreateDatabaseScript() generates an invalid MySQL script."). + /// + [Test] + public void AlterTableTest() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + MovieDBContext db = new MovieDBContext(); + db.Database.Initialize(true); + MovieDBInitialize.DoDataPopulation(db); + var l = db.MovieFormats.ToList(); + int j = l.Count; + foreach (var i in l) + { + j--; + } + Assert.That(j, Is.EqualTo(0)); + MovieFormat m = new MovieFormat(); + m.Format = 8.0f; + db.MovieFormats.Add(m); + db.SaveChanges(); + MovieFormat m2 = db.MovieFormats.Where(p => p.Format == 8.0f).FirstOrDefault(); + Assert.That(m2, Is.Not.Null); + Assert.That(m2.Format, Is.EqualTo(8.0f)); + } + + /// + /// Fix for "Connector/Net Generates Incorrect SELECT Clause after UPDATE" (MySql bug #62134, Oracle bug #13491689). + /// + [Test] + public void ConcurrencyCheckWithNonDbGeneratedColumn() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + using (MovieDBContext db = new MovieDBContext()) + { + db.Database.Delete(); + db.Database.CreateIfNotExists(); + MovieDBInitialize.DoDataPopulation(db); + db.Database.ExecuteSqlCommand(@"DROP TABLE IF EXISTS `MovieReleases`"); + + db.Database.ExecuteSqlCommand( +@"CREATE TABLE IF NOT EXISTS `MovieReleases` ( + `Id` int(11) NOT NULL, + `Name` varbinary(45) NOT NULL, + `Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`Id`) +) ENGINE=InnoDB DEFAULT CHARSET=binary"); + MySqlTrace.Listeners.Clear(); + MySqlTrace.Switch.Level = SourceLevels.All; + GenericListener listener = new GenericListener(); + MySqlTrace.Listeners.Add(listener); + try + { + MovieRelease mr = db.MovieReleases.Create(); + mr.Id = 1; + mr.Name = "Commercial"; + db.MovieReleases.Add(mr); + db.SaveChanges(); + mr.Name = "Director's Cut"; + db.SaveChanges(); + } + finally + { + db.Database.ExecuteSqlCommand(@"DROP TABLE IF EXISTS `MovieReleases`"); + } + // Check sql + Regex rx = new Regex(@"Query Opened: (?UPDATE .*)", RegexOptions.Compiled | RegexOptions.Singleline); + foreach (string s in listener.Strings) + { + Match m = rx.Match(s); + if (m.Success) + { + CheckSql(m.Groups["item"].Value, SQLSyntax.UpdateWithSelectWithNonDbGeneratedLock); + //Assert.Pass(); + } + } + //Assert.Fail(); + } + } + + /// + /// This tests fix for http://bugs.mysql.com/bug.php?id=64216. + /// + [Test] + public void CheckByteArray() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + MovieDBContext db = new MovieDBContext(); + db.Database.Initialize(true); + string dbCreationScript = + ((IObjectContextAdapter)db).ObjectContext.CreateDatabaseScript(); + Regex rx = new Regex(@"`Data` (?[^\),]*)", RegexOptions.Compiled | RegexOptions.Singleline); + Match m = rx.Match(dbCreationScript); + Assert.That(m.Groups["type"].Value, Is.EqualTo("longblob")); + } + + /// + /// Validates a stored procedure call using Code First + /// Bug #14008699 + [Test] + public void CallStoredProcedure() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + using (MovieDBContext context = new MovieDBContext()) + { + context.Database.Initialize(true); + context.Database.ExecuteSqlCommand(@"drop procedure if exists `GetCount`"); + context.Database.ExecuteSqlCommand(@"create procedure `GetCount`() begin select 5; end;"); + long count = context.Database.SqlQuery("call GetCount").First(); + + Assert.That(count, Is.EqualTo(5)); + } + } + + /// + /// Tests for fix of http://bugs.mysql.com/bug.php?id=116028 + /// Incorrect discriminator generated column values when it's used code-first, inheritance and in a join statement + /// + [Test] + public void Bug116028_Test1() + { + List vehicles; + using (VehicleDbContext4 context = new VehicleDbContext4()) + { + context.Database.Delete(); + context.Database.Initialize(true); + var manuf = context.Manufacturers.Add(new Manufacturer4 { Name = "ACME" }); + context.Vehicles.Add(new Car4 { Id = 1, Name = "Mustang", Year = 2012, CarProperty = "Car", Manufacturer = manuf }); + context.Vehicles.Add(new Bike4 { Id = 101, Name = "Mountain", Year = 2011, BikeProperty = "Bike", Manufacturer = manuf }); + context.SaveChanges(); + + vehicles = context.Manufacturers.SelectMany(v => v.Vehicles).ToList(); + + int records = -1; + using (MySqlConnection conn = new MySqlConnection(context.Database.Connection.ConnectionString)) + { + conn.Open(); + MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM Vehicles", conn); + records = Convert.ToInt32(cmd.ExecuteScalar()); + } + + Assert.That(records, Is.EqualTo(context.Vehicles.Count())); + } + using (VehicleDbContext4 context = new VehicleDbContext4()) + { + var vehiclesfromdb = context.Manufacturers.SelectMany(v => v.Vehicles).ToList(); + Assert.That(vehiclesfromdb.OfType().Single().CarProperty, Is.EqualTo(vehicles.OfType().Single().CarProperty)); + Assert.That(vehiclesfromdb.OfType().Single().BikeProperty, Is.EqualTo(vehicles.OfType().Single().BikeProperty)); + } + } + + /// + /// Tests for fix of http://bugs.mysql.com/bug.php?id=63920 + /// Maxlength error when it's used code-first and inheritance (discriminator generated column) + /// + [Test] + public void Bug63920_Test1() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + using (VehicleDbContext context = new VehicleDbContext()) + { + context.Database.Delete(); + context.Database.Initialize(true); + + context.Vehicles.Add(new Car { Id = 1, Name = "Mustang", Year = 2012, CarProperty = "Car" }); + context.Vehicles.Add(new Bike { Id = 101, Name = "Mountain", Year = 2011, BikeProperty = "Bike" }); + context.SaveChanges(); + + var list = context.Vehicles.ToList(); + + int records = -1; + using (MySqlConnection conn = new MySqlConnection(context.Database.Connection.ConnectionString)) + { + conn.Open(); + MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM Vehicles", conn); + records = Convert.ToInt32(cmd.ExecuteScalar()); + } + + Assert.That(records, Is.EqualTo(context.Vehicles.Count())); + } + } + + /// + /// Tests for fix of http://bugs.mysql.com/bug.php?id=63920 + /// Key reference generation script error when it's used code-first and a single table for the inherited models + /// + [Test] + public void Bug63920_Test2() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + using (VehicleDbContext2 context = new VehicleDbContext2()) + { + context.Database.Delete(); + context.Database.Initialize(true); + + context.Vehicles.Add(new Car2 { Id = 1, Name = "Mustang", Year = 2012, CarProperty = "Car" }); + context.Vehicles.Add(new Bike2 { Id = 101, Name = "Mountain", Year = 2011, BikeProperty = "Bike" }); + context.SaveChanges(); + + var list = context.Vehicles.ToList(); + + int records = -1; + using (MySqlConnection conn = new MySqlConnection(context.Database.Connection.ConnectionString)) + { + conn.Open(); + MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM Vehicle2", conn); + records = Convert.ToInt32(cmd.ExecuteScalar()); + } + + Assert.That(records, Is.EqualTo(context.Vehicles.Count())); + } + } + + /// + /// This test fix for precision customization for columns bug (http://bugs.mysql.com/bug.php?id=65001), + /// Trying to customize column precision in Code First does not work). + /// + [Test] + [Ignore("Fix this")] + public void TestPrecisionNscale() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + MovieDBContext db = new MovieDBContext(); + db.Database.Initialize(true); + var l = db.Movies.ToList(); + using (MySqlDataReader r = new MySqlCommand($@"select numeric_precision, numeric_scale from information_schema.columns +where table_schema = '{Connection.Database}' and table_name = 'movies' and column_name = 'Price'", Connection).ExecuteReader()) + { + r.Read(); + Assert.That(r.GetInt32(0), Is.EqualTo(16)); + Assert.That(r.GetInt32(1), Is.EqualTo(2)); + } + } + + /// + /// Test String types to StoreType for String + /// A string with FixedLength=true will become a char + /// Max Length left empty will be char(max) + /// Max Length(100) will be char(100) + /// while FixedLength=false will result in nvarchar. + /// Max Length left empty will be nvarchar(max) + /// Max Length(100) will be nvarchar(100) + /// + [Test] + public void TestStringTypeToStoreType() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + using (VehicleDbContext3 context = new VehicleDbContext3()) + { + if (context.Database.Exists()) context.Database.Delete(); + context.Database.CreateIfNotExists(); + context.Accessories.Add(new Accessory { Name = "Accesory One", Description = "Accesories descriptions", LongDescription = "Some long description" }); + context.SaveChanges(); + + using (MySqlConnection conn = new MySqlConnection(context.Database.Connection.ConnectionString)) + { + conn.Open(); + MySqlCommand query = new MySqlCommand("Select Column_name, Is_Nullable, Data_Type from information_schema.Columns where table_schema ='" + conn.Database + "' and table_name = 'Accessories' and column_name ='Description'", conn); + query.Connection = conn; + MySqlDataReader reader = query.ExecuteReader(); + while (reader.Read()) + { + Assert.That(reader[0].ToString(), Is.EqualTo("Description")); + Assert.That(reader[1].ToString(), Is.EqualTo("NO")); + Assert.That(reader[2].ToString(), Is.EqualTo("mediumtext")); + } + reader.Close(); + + query = new MySqlCommand("Select Column_name, Is_Nullable, Data_Type, character_maximum_length from information_schema.Columns where table_schema ='" + conn.Database + "' and table_name = 'Accessories' and column_name ='Name'", conn); + reader = query.ExecuteReader(); + while (reader.Read()) + { + Assert.That(reader[0].ToString(), Is.EqualTo("Name")); + Assert.That(reader[1].ToString(), Is.EqualTo("NO")); + Assert.That(reader[2].ToString(), Is.EqualTo("varchar")); + Assert.That(reader[3].ToString(), Is.EqualTo("255")); + } + reader.Close(); + + query = new MySqlCommand("Select Column_name, Is_Nullable, Data_Type, character_maximum_length from information_schema.Columns where table_schema ='" + conn.Database + "' and table_name = 'Accessories' and column_name ='LongDescription'", conn); + reader = query.ExecuteReader(); + while (reader.Read()) + { + Assert.That(reader[0].ToString(), Is.EqualTo("LongDescription")); + Assert.That(reader[1].ToString(), Is.EqualTo("NO")); + Assert.That(reader[2].ToString(), Is.EqualTo("longtext")); + Assert.That(reader[3].ToString(), Is.EqualTo("4294967295")); + } + } + } + } + + /// + /// Test fix for http://bugs.mysql.com/bug.php?id=66066 / http://clustra.no.oracle.com/orabugs/bug.php?id=14479715 + /// (Using EF, crash when generating insert with no values.). + /// + [Test] + public void AddingEmptyRow() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + using (MovieDBContext ctx = new MovieDBContext()) + { + ctx.Database.Initialize(true); + ctx.EntitySingleColumns.Add(new EntitySingleColumn()); + ctx.SaveChanges(); + } + + using (MovieDBContext ctx2 = new MovieDBContext()) + { + var q = from esc in ctx2.EntitySingleColumns where esc.Id == 1 select esc; + Assert.That(q.Count(), Is.EqualTo(1)); + } + } + + /// + /// Test for identity columns when type is Integer or Guid (auto-generate + /// values) + /// + [Test] + public void IdentityTest() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + using (VehicleDbContext context = new VehicleDbContext()) + { + context.Database.ExecuteSqlCommand("SET GLOBAL sql_mode='STRICT_ALL_TABLES'"); + if (context.Database.Exists()) context.Database.Delete(); + context.Database.CreateIfNotExists(); + + // Identity as Guid + Manufacturer nissan = new Manufacturer + { + Name = "Nissan" + }; + Manufacturer ford = new Manufacturer + { + Name = "Ford" + }; + context.Manufacturers.Add(nissan); + context.Manufacturers.Add(ford); + + // Identity as Integer + Distributor dis1 = new Distributor + { + Name = "Distributor1" + }; + Distributor dis2 = new Distributor + { + Name = "Distributor2" + }; + context.Distributors.Add(dis1); + context.Distributors.Add(dis2); + + context.SaveChanges(); + + using (MySqlConnection conn = new MySqlConnection(context.Database.Connection.ConnectionString)) + { + conn.Open(); + + // Validates Guid + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Manufacturers", conn); + MySqlDataReader dr = cmd.ExecuteReader(); + Assert.That(dr.HasRows, "No records found"); + + while (dr.Read()) + { + string name = dr.GetString(1); + switch (name) + { + case "Nissan": + Assert.That(nissan.ManufacturerId, Is.EqualTo(dr.GetGuid(0))); + Assert.That(nissan.GroupIdentifier, Is.EqualTo(dr.GetGuid(2))); + break; + case "Ford": + Assert.That(ford.ManufacturerId, Is.EqualTo(dr.GetGuid(0))); + Assert.That(ford.GroupIdentifier, Is.EqualTo(dr.GetGuid(2))); + break; + default: + //Assert.Fail(); + break; + } + } + dr.Close(); + + // Validates Integer + cmd = new MySqlCommand("SELECT * FROM Distributors", conn); + dr = cmd.ExecuteReader(); + if (!dr.HasRows) + //Assert.Fail("No records found"); + while (dr.Read()) + { + string name = dr.GetString(1); + switch (name) + { + case "Distributor1": + Assert.That(dis1.DistributorId, Is.EqualTo(dr.GetInt32(0))); + break; + case "Distributor2": + Assert.That(dis2.DistributorId, Is.EqualTo(dr.GetInt32(0))); + break; + default: + //Assert.Fail(); + break; + } + } + dr.Close(); + } + } + } + + /// + /// This test the fix for bug 67377. + /// + [Test] + public void FirstOrDefaultNested() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + using (MovieDBContext ctx = new MovieDBContext()) + { + ctx.Database.Initialize(true); + MovieDBInitialize.DoDataPopulation(ctx); + int DirectorId = 1; + var q = ctx.Movies.Where(p => p.Director.ID == DirectorId).Select(p => + new + { + Id = p.ID, + FirstMovieFormat = p.Formats.Count == 0 ? 0.0 : p.Formats.FirstOrDefault().Format + }); + string sql = q.ToString(); +#if DEBUG + Debug.WriteLine(sql); +#endif + int j = q.Count(); + foreach (var r in q) + { + j--; + } + Assert.That(j, Is.EqualTo(0)); + } + } + + /// + /// This tests the fix for bug 73549, Generated Sql does not contain ORDER BY statement whose is requested by LINQ. + /// + [Test] + public void FirstOrDefaultNestedWithOrderBy() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + using (SakilaDb db = new SakilaDb()) + { + var q = from cu in db.customers + let curAddr = db.addresses.OrderByDescending(p => p.address_id).Where(p => p.address_id == cu.address_id).FirstOrDefault() + join sto in db.stores on cu.store_id equals sto.store_id + orderby cu.customer_id descending + select new + { + curAddr.city.country.country1 + }; + string sql = q.ToString(); + CheckSql(sql, SQLSyntax.FirstOrDefaultNestedWithOrderBy); +#if DEBUG + Debug.WriteLine(sql); +#endif + int j = q.Count(); + foreach (var r in q) + { + //Debug.WriteLine( r.country1 ); + } + Assert.That(j, Is.EqualTo(599)); + } + } + + /// + /// SUPPORT FOR DATE TYPES WITH PRECISION + /// + [Test] + public void CanDefineDatesWithPrecisionFor56() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + + if (Version < new Version(5, 6)) return; + + using (var db = new ProductsDbContext()) + { + db.Database.Initialize(true); + using (MySqlConnection conn = new MySqlConnection(db.Database.Connection.ConnectionString)) + { + conn.Open(); + MySqlCommand query = new MySqlCommand("Select Column_name, Is_Nullable, Data_Type, DateTime_Precision from information_schema.Columns where table_schema ='" + conn.Database + "' and table_name = 'Products' and column_name ='DateTimeWithPrecision'", conn); + query.Connection = conn; + MySqlDataReader reader = query.ExecuteReader(); + while (reader.Read()) + { + Assert.That(reader[0].ToString(), Is.EqualTo("DateTimeWithPrecision")); + Assert.That(reader[1].ToString(), Is.EqualTo("NO")); + Assert.That(reader[2].ToString(), Is.EqualTo("datetime")); + Assert.That(reader[3].ToString(), Is.EqualTo("3")); + } + reader.Close(); + + query = new MySqlCommand("Select Column_name, Is_Nullable, Data_Type, DateTime_Precision from information_schema.Columns where table_schema ='" + conn.Database + "' and table_name = 'Products' and column_name ='TimeStampWithPrecision'", conn); + query.Connection = conn; + reader = query.ExecuteReader(); + while (reader.Read()) + { + Assert.That(reader[0].ToString(), Is.EqualTo("TimeStampWithPrecision")); + Assert.That(reader[1].ToString(), Is.EqualTo("NO")); + Assert.That(reader[2].ToString(), Is.EqualTo("timestamp")); + Assert.That(reader[3].ToString(), Is.EqualTo("3")); + } + reader.Close(); + } + db.Database.Delete(); + } + } + + /// + /// Orabug #15935094 SUPPORT FOR CURRENT_TIMESTAMP AS DEFAULT FOR DATETIME WITH EF + /// + [Test] + [Ignore("Fix this")] + public void CanDefineDateTimeAndTimestampWithIdentity() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + if (Version < new Version(5, 6)) return; + + using (var db = new ProductsDbContext()) + { + db.Database.Initialize(true); + MySqlConnection con = (MySqlConnection)db.Database.Connection; + MySqlCommand cmd = new MySqlCommand("set session sql_mode = '';", con); + con.Open(); + cmd.ExecuteNonQuery(); + con.Close(); + + Product product = new Product + { + //Omitting Identity Columns + DateTimeWithPrecision = DateTime.Now, + TimeStampWithPrecision = DateTime.Now + }; + + db.Products.Add(product); + db.SaveChanges(); + + var updateProduct = db.Products.First(); + updateProduct.DateTimeWithPrecision = new DateTime(2012, 3, 18, 23, 9, 7, 6); + db.SaveChanges(); + + Assert.That(db.Products.First().Timestamp, Is.Not.Empty); + Assert.That(db.Products.First().DateCreated, Is.Not.Empty); + Assert.That(db.Products.First().DateTimeWithPrecision, Is.EqualTo(new DateTime(2012, 3, 18, 23, 9, 7, 6))); + Assert.That(db.Products.Count(), Is.EqualTo(1)); + db.Database.Delete(); + } + } + + + /// + /// Test of fix for bug Support for EntityFramework 4.3 Code First Generated Identifiers (MySql Bug #67285, Oracle bug #16286397). + /// FKs are renamed to met http://dev.mysql.com/doc/refman/5.0/en/identifiers.html limitations. + /// + [Test] + public void LongIdentifiersInheritanceTPT() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + using (DinosauriaDBContext db = new DinosauriaDBContext()) + { + db.Database.Initialize(true); + Tyrannosauridae ty = new Tyrannosauridae() { Id = 1, Name = "Genghis Rex", SpecieName = "TRex", Weight = 1000 }; + db.dinos.Add(ty); + Oviraptorosauria ovi = new Oviraptorosauria() { Id = 2, EggsPerYear = 100, Name = "John the Velociraptor", SpecieName = "Oviraptor" }; + db.dinos.Add(ovi); + db.SaveChanges(); + } + } + + + /// + /// Test fix for http://bugs.mysql.com/bug.php?id=67183 + /// (Malformed Query while eager loading with EF 4 due to multiple projections). + /// + [Test] + public void ShipTest() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + using (var context = new ShipContext()) + { + context.Database.Initialize(true); + + var harbor = new Harbor + { + Ships = new HashSet + { + new Ship + { + CrewMembers = new HashSet + { + new CrewMember + { + Rank = new Rank { Description = "Rank A" }, + Clearance = new Clearance { Description = "Clearance A" }, + Description = "CrewMember A" + }, + new CrewMember + { + Rank = new Rank { Description = "Rank B" }, + Clearance = new Clearance { Description = "Clearance B" }, + Description = "CrewMember B" + } + }, + Description = "Ship AB" + }, + new Ship + { + CrewMembers = new HashSet + { + new CrewMember + { + Rank = new Rank { Description = "Rank C" }, + Clearance = new Clearance { Description = "Clearance C" }, + Description = "CrewMember C" + }, + new CrewMember + { + Rank = new Rank { Description = "Rank D" }, + Clearance = new Clearance { Description = "Clearance D" }, + Description = "CrewMember D" + } + }, + Description = "Ship CD" + } + }, + Description = "Harbor ABCD" + }; + + context.Harbors.Add(harbor); + context.SaveChanges(); + } + + using (var context = new ShipContext()) + { + DbSet dbSet = context.Set(); + IQueryable query = dbSet; + query = query.Include(entity => entity.Ships); + query = query.Include(entity => entity.Ships.Select(s => s.CrewMembers)); + query = query.Include(entity => entity.Ships.Select(s => s.CrewMembers.Select(cm => cm.Rank))); + query = query.Include(entity => entity.Ships.Select(s => s.CrewMembers.Select(cm => cm.Clearance))); + + string[] data = new string[] { + "1,Harbor ABCD,1,1,1,Ship AB,1,1,1,1,1,CrewMember A,1,Rank A,1,Clearance A", + "1,Harbor ABCD,1,1,1,Ship AB,1,2,1,2,2,CrewMember B,2,Rank B,2,Clearance B", + "1,Harbor ABCD,1,2,1,Ship CD,1,3,2,3,3,CrewMember C,3,Rank C,3,Clearance C", + "1,Harbor ABCD,1,2,1,Ship CD,1,4,2,4,4,CrewMember D,4,Rank D,4,Clearance D" + }; + Dictionary outData = new Dictionary(); + + var sqlString = query.ToString(); + CheckSql(sqlString, SQLSyntax.ShipQueryMalformedDueMultipleProjecttionsCorrectedEF6); + // see below for the generated SQL query + + var harbor = query.Single(); + + foreach (var ship in harbor.Ships) + { + foreach (var crewMember in ship.CrewMembers) + { + outData.Add(string.Format( + "{0},{1},1,{2},{3},{4},1,{5},{6},{7},{8},{9},{10},{11},{12},{13}", + harbor.HarborId, harbor.Description, ship.ShipId, harbor.HarborId, + ship.Description, crewMember.CrewMemberId, crewMember.ShipId, crewMember.RankId, + crewMember.ClearanceId, crewMember.Description, crewMember.Rank.RankId, + crewMember.Rank.Description, crewMember.Clearance.ClearanceId, + crewMember.Clearance.Description), null); + } + } + // check data integrity + Assert.That(data.Length, Is.EqualTo(outData.Count)); + for (int i = 0; i < data.Length; i++) + { + Assert.That(outData.ContainsKey(data[i])); + } + } + } + + /// + /// Tests fix for bug http://bugs.mysql.com/bug.php?id=68513, Error in LINQ to Entities query when using Distinct().Count(). + /// + [Test] + public void DistinctCount() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + using (SiteDbContext ctx = new SiteDbContext()) + { + ctx.Database.Initialize(true); + visitante v1 = new visitante() { nCdSite = 1, nCdVisitante = 1, sDsIp = "x1" }; + visitante v2 = new visitante() { nCdSite = 1, nCdVisitante = 2, sDsIp = "x2" }; + site s1 = new site() { nCdSite = 1, sDsTitulo = "MyNewsPage" }; + site s2 = new site() { nCdSite = 2, sDsTitulo = "MySearchPage" }; + ctx.Visitante.Add(v1); + ctx.Visitante.Add(v2); + ctx.Site.Add(s1); + ctx.Site.Add(s2); + ctx.SaveChanges(); + + var q = (from vis in ctx.Visitante.Include("site") + group vis by vis.nCdSite into g + select new retorno + { + Key = g.Key, + Online = g.Select(e => e.sDsIp).Distinct().Count() + }); + string sql = q.ToString(); + CheckSql(sql, SQLSyntax.CountGroupBy); + var q2 = q.ToList(); + foreach (var row in q2) + { + } + } + } + + /// + /// Tests fix for bug http://bugs.mysql.com/bug.php?id=68513, Error in LINQ to Entities query when using Distinct().Count(). + /// + [Test] + public void DistinctCount2() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + using (SiteDbContext ctx = new SiteDbContext()) + { + ctx.Database.Initialize(true); + visitante v1 = new visitante() { nCdSite = 1, nCdVisitante = 1, sDsIp = "x1" }; + visitante v2 = new visitante() { nCdSite = 1, nCdVisitante = 2, sDsIp = "x2" }; + site s1 = new site() { nCdSite = 1, sDsTitulo = "MyNewsPage" }; + site s2 = new site() { nCdSite = 2, sDsTitulo = "MySearchPage" }; + pagina p1 = new pagina() { nCdPagina = 1, nCdVisitante = 1, sDsTitulo = "index.html" }; + ctx.Visitante.Add(v1); + ctx.Visitante.Add(v2); + ctx.Site.Add(s1); + ctx.Site.Add(s2); + ctx.Pagina.Add(p1); + ctx.SaveChanges(); + + var q = (from pag in ctx.Pagina.Include("visitante").Include("site") + group pag by pag.visitante.nCdSite into g + select new retorno + { + Key = g.Key, + Online = g.Select(e => e.visitante.sDsIp).Distinct().Count() + }); + string sql = q.ToString(); + CheckSql(sql, SQLSyntax.CountGroupBy2); + var q2 = q.ToList(); + foreach (var row in q2) + { + } + } + } + + /// + /// Tests fix for bug http://bugs.mysql.com/bug.php?id=65723, MySql Provider for EntityFramework produces "bad" SQL for OrderBy. + /// + [Test] + public void BadOrderBy() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + using (MovieDBContext db = new MovieDBContext()) + { + db.Database.Initialize(true); + MovieDBInitialize.DoDataPopulation(db); + DateTime filterDate = new DateTime(1986, 1, 1); + var q = db.Movies.Where(p => p.ReleaseDate >= filterDate). + OrderByDescending(p => p.ReleaseDate).Take(2); + string sql = q.ToString(); + CheckSql(SQLSyntax.NestedOrderBy, sql); + // Data integrity testing + Movie[] data = new Movie[] { + new Movie() { ID = 4, Title = "Star Wars, The Sith Revenge", ReleaseDate = new DateTime( 2005, 5, 19 ) }, + new Movie() { ID = 2, Title = "The Matrix", ReleaseDate = new DateTime( 1999, 3, 31 ) } + }; + int i = 0; + foreach (Movie m in q) + { + Assert.That(m.ID, Is.EqualTo(data[i].ID)); + Assert.That(m.Title, Is.EqualTo(data[i].Title)); + Assert.That(m.ReleaseDate, Is.EqualTo(data[i].ReleaseDate)); + i++; + } + Assert.That(i, Is.EqualTo(2)); + } + } + + /// + /// Tests fix for bug http://bugs.mysql.com/bug.php?id=69751, Invalid SQL query generated for query with Contains, OrderBy, and Take. + /// + [Test] + public void BadContainsOrderByTake() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + using (MovieDBContext db = new MovieDBContext()) + { + db.Database.Initialize(true); + MovieDBInitialize.DoDataPopulation(db); + string title = "T"; + var q = from m in db.Movies + where m.Title.Contains(title) + orderby m.ID descending + select m; + var q1 = q.Take(10); + string sql = q1.ToString(); + + CheckSql(SQLSyntax.QueryWithOrderByTakeContains, sql); + + int i = 0; + foreach (var row in q1) + { + Assert.That(row.ID, Is.EqualTo(MovieDBInitialize.data[i].ID)); + Assert.That(row.Title, Is.EqualTo(MovieDBInitialize.data[i].Title)); + Assert.That(row.ReleaseDate, Is.EqualTo(MovieDBInitialize.data[i].ReleaseDate)); + i++; + } + } + } + + /// + /// Tests fix for bug http://bugs.mysql.com/bug.php?id=69922, Unknown column Extent1... + /// + [Test] + public void BadAliasTable() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + using (PromotionsDB db = new PromotionsDB()) + { + db.Database.Initialize(true); + DateTime now = DateTime.Now; + var q = db + .HomePromoes + .Where(x => + x.Active + && + (x.ActiveFrom == null || x.ActiveFrom <= now) + && + (x.ActiveTo == null || x.ActiveTo >= now) + ) + .OrderBy(x => x.DisplayOrder).Select(d => d); + string sql = q.ToString(); + foreach (var row in q) + { + } + } + } + + /// + /// Tests other variants of bug http://bugs.mysql.com/bug.php?id=69751, Invalid SQL query generated for query with Contains, OrderBy, and Take. + /// + [Test] + public void BadContainsOrderByTake2() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + using (MovieDBContext db = new MovieDBContext()) + { + db.Database.Initialize(true); + MovieDBInitialize.DoDataPopulation(db); + var q = db.Movies. + Where(m => !string.IsNullOrEmpty(m.Title) && m.Title.Contains("x")). + OrderByDescending(m => m.ID). + Skip(1). + Take(1); + string sql = q.ToString(); +#if DEBUG + Debug.WriteLine(sql); +#endif + List l = q.ToList(); + int j = l.Count; + foreach (Movie m in l) + { + j--; + } + Assert.That(j, Is.EqualTo(0)); + } + } + + /// + /// Tests other variants of bug http://bugs.mysql.com/bug.php?id=69751, Invalid SQL query generated for query with Contains, OrderBy, and Take. + /// + [Test] + public void BadContainsOrderByTake3() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + using (MovieDBContext db = new MovieDBContext()) + { + db.Database.Initialize(true); + MovieDBInitialize.DoDataPopulation(db); + var q = db.Movies. + Where(m => !string.IsNullOrEmpty(m.Title) && m.Title.Contains("x")). + OrderByDescending(m => m.ID). + Skip(1). + Take(1).Select(m => new + { + Id = m.ID, + CriticsScore = ( + m.Title == "Terminator 1" ? "Good" : + m.Title == "Predator" ? "Sunday best, cheese" : + m.Title == "The Matrix" ? "Really Good" : + m.Title == "Star Wars, The Sith Revenge" ? "Really Good" : "Unknown") + }); + string sql = q.ToString(); +#if DEBUG + Debug.WriteLine(sql); +#endif + int j = q.Count(); + foreach (var row in q) + { + j--; + } + Assert.That(j, Is.EqualTo(0)); + } + } + + /// + /// Tests other variants of bug http://bugs.mysql.com/bug.php?id=69751, Invalid SQL query generated for query with Contains, OrderBy, and Take. + /// + [Test] + public void BadContainsOrderByTake4() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + using (MovieDBContext db = new MovieDBContext()) + { + db.Database.Initialize(true); + MovieDBInitialize.DoDataPopulation(db); + bool q = db.Movies.Any(m => m.ReleaseDate.Year > 1985); + // string sql = q.ToString(); + //#if DEBUG + // Debug.WriteLine(sql); + //#endif + //foreach (var row in q) + //{ + //} + } + } + + /// + /// Tests other variants of bug http://bugs.mysql.com/bug.php?id=69751, Invalid SQL query generated for query with Contains, OrderBy, and Take. + /// + [Test] + public void BadContainsOrderByTake5() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + using (MovieDBContext db = new MovieDBContext()) + { + db.Database.Initialize(true); + MovieDBInitialize.DoDataPopulation(db); + // TODO: add subquery like + // var shifts = Shifts.Where(s => !EmployeeShifts.Where(es => es.ShiftID == s.ShiftID).Any()); + bool q = db.Movies.Where(m => m.ReleaseDate.Month != 10).Any(m => m.ReleaseDate.Year > 1985); + // string sql = q.ToString(); + //#if DEBUG + // Debug.WriteLine(sql); + //#endif + // foreach (var row in q) + // { + // } + } + } + + /// + /// Tests other variants of bug http://bugs.mysql.com/bug.php?id=69751, Invalid SQL query generated for query with Contains, OrderBy, and Take. + /// + [Test] + public void BadContainsOrderByTake6() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + using (MovieDBContext db = new MovieDBContext()) + { + db.Database.Initialize(true); + MovieDBInitialize.DoDataPopulation(db); + var q = from m in db.Movies + where m.Title.Contains("x") && db.Medias.Where(mm => mm.Format == "Digital").Any() + select m; + string sql = q.ToString(); +#if DEBUG + Debug.WriteLine(sql); +#endif + int j = q.Count(); + foreach (var row in q) + { + j--; + } + Assert.That(j, Is.EqualTo(0)); + } + } + + /// + /// Test for Mysql Bug 70602: http://bugs.mysql.com/bug.php?id=70602 + /// + [Test] + public void AutoIncrementBug() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + AutoIncrementBugContext dbContext = new AutoIncrementBugContext(); + + dbContext.Database.Initialize(true); + dbContext.AutoIncrementBug.Add(new AutoIncrementBug() { Description = "Test" }); + dbContext.SaveChanges(); + using (var reader = MySqlHelper.ExecuteReader(dbContext.Database.Connection.ConnectionString, + $"SHOW COLUMNS FROM {nameof(dbContext.AutoIncrementBug)}s WHERE UPPER(EXTRA) LIKE '%AUTO_INCREMENT%'")) + { + Assert.That(reader.HasRows); + } + dbContext.Database.Delete(); + } + + [Test] + public void SimpleCodeFirstSelectCbc() + { + MovieCodedBasedConfigDBContext db = new MovieCodedBasedConfigDBContext(); + db.Database.Initialize(true); + var l = db.Movies.ToList(); + foreach (var i in l) + { + Console.WriteLine(i); + } + } + + [Test] + [Ignore("Need to check. Bad statemen: CALL `MovieCodedBasedConfigDBContext`.``insert_movie``(@movie_name, @ReleaseDate, @Genre, @Price)")] + public void TestStoredProcedureMapping() + { + using (var db = new MovieCodedBasedConfigDBContext()) + { + db.Database.Initialize(true); + var movie = new MovieCBC() + { + Title = "Sharknado", + Genre = "Documental", + Price = 1.50M, + ReleaseDate = DateTime.Parse("01/07/2013") + }; + + db.Movies.Add(movie); + db.SaveChanges(); + movie.Genre = "Fiction"; + db.SaveChanges(); + db.Movies.Remove(movie); + db.SaveChanges(); + } + } + + [Test] + public void MigrationHistoryConfigurationTest() + { + MovieCodedBasedConfigDBContext db = new MovieCodedBasedConfigDBContext(); + db.Database.Initialize(true); + var l = db.Movies.ToList(); + foreach (var i in l) + { + } + var result = MySqlHelper.ExecuteScalar($"server=localhost;User Id=root;database={db.Database.Connection.Database};logging=true; port=" + Port + ";", "SELECT COUNT(_MigrationId) FROM __MySqlMigrations;"); + Assert.That(int.Parse(result.ToString()), Is.EqualTo(1)); + } + + [Test] + public void DbSetRangeTest() + { + using (MovieDBContext db = new MovieDBContext()) + { + db.Database.Initialize(true); + Movie m1 = new Movie() { Title = "Terminator 1", ReleaseDate = new DateTime(1984, 10, 26) }; + Movie m2 = new Movie() { Title = "The Matrix", ReleaseDate = new DateTime(1999, 3, 31) }; + Movie m3 = new Movie() { Title = "Predator", ReleaseDate = new DateTime(1987, 6, 12) }; + Movie m4 = new Movie() { Title = "Star Wars, The Sith Revenge", ReleaseDate = new DateTime(2005, 5, 19) }; + db.Movies.AddRange(new Movie[] { m1, m2, m3, m4 }); + db.SaveChanges(); + var q = from m in db.Movies select m; + Assert.That(q.Count(), Is.EqualTo(4)); + foreach (var row in q) + { + } + db.Movies.RemoveRange(q.ToList()); + db.SaveChanges(); + var q2 = from m in db.Movies select m; + Assert.That(q2.Count(), Is.EqualTo(0)); + } + } + + [Test] + public void EnumSupportTest() + { + using (var dbCtx = new EnumTestSupportContext()) + { + dbCtx.Database.Initialize(true); + dbCtx.SchoolSchedules.Add(new SchoolSchedule() { TeacherName = "Pako", Subject = SchoolSubject.History }); + dbCtx.SaveChanges(); + + var schedule = (from s in dbCtx.SchoolSchedules + where s.Subject == SchoolSubject.History + select s).FirstOrDefault(); + + Assert.That(schedule, Is.Not.EqualTo(null)); + Assert.That(schedule.Subject, Is.EqualTo(SchoolSubject.History)); + } + } + + + [Test] + [Ignore("This test needs MicrosoftSqlServer.Types which is not available for all the target frameworks.")] + public void SpatialSupportTest() + { + using (var dbCtx = new JourneyContext()) + { + dbCtx.Database.Initialize(true); + dbCtx.MyPlaces.Add(new MyPlace() + { + name = "JFK INTERNATIONAL AIRPORT OF NEW YORK", + location = DbGeometry.FromText("POINT(40.644047 -73.782291)"), + }); + dbCtx.MyPlaces.Add(new MyPlace + { + name = "ALLEY POND PARK", + location = DbGeometry.FromText("POINT(40.745696 -73.742638)") + }); + dbCtx.MyPlaces.Add(new MyPlace + { + name = "CUNNINGHAM PARK", + location = DbGeometry.FromText("POINT(40.735031 -73.768387)") + }); + dbCtx.MyPlaces.Add(new MyPlace + { + name = "QUEENS VILLAGE STATION", + location = DbGeometry.FromText("POINT(40.717957 -73.736501)") + }); + dbCtx.SaveChanges(); + + var place = (from p in dbCtx.MyPlaces + where p.name == "JFK INTERNATIONAL AIRPORT OF NEW YORK" + select p).FirstOrDefault(); + + var point = DbGeometry.FromText("POINT(40.717957 -73.736501)"); + + var distance = (point.Distance(place.location) * 100); + + Assert.That(place, Is.Not.Null); + Assert.That(distance.Value, Is.EqualTo(8.6944880240295852D)); + + var points = from p in dbCtx.MyPlaces + select new { name = p.name, location = p.location }; + foreach (var item in points) + { + var distanceX = DbGeometry.FromText("POINT(40.717957 -73.736501)").Distance(item.location) * 100; + Assert.That(distanceX, Is.Not.Null); + } + + foreach (MyPlace p in dbCtx.MyPlaces) + dbCtx.MyPlaces.Remove(p); + dbCtx.SaveChanges(); + + dbCtx.MyPlaces.Add(new MyPlace + { + name = "AGraphic Design Institute", + location = DbGeometry.FromText(string.Format("POINT({0} {1})", -122.336106, 47.605049), 101) + }); + + dbCtx.MyPlaces.Add(new MyPlace + { + name = "AGraphic Design Institute", + location = DbGeometry.FromText("POINT(-123.336106 47.605049)", 102) + }); + + dbCtx.MyPlaces.Add(new MyPlace + { + name = "BGraphic Design Institute", + location = DbGeometry.FromText("POINT(-113.336106 47.605049)", 103) + }); + + dbCtx.MyPlaces.Add(new MyPlace + { + name = "Graphic Design Institute", + location = DbGeometry.FromText(string.Format("POINT({0} {1})", 51.5, -1.28), 4326) + }); + dbCtx.SaveChanges(); + + var result = (from u in dbCtx.MyPlaces select u.location.CoordinateSystemId).ToList(); + foreach (var item in result) + Assert.That(item, Is.Not.Empty); + var res = dbCtx.MyPlaces.OrderBy(q => q.name.Take(1).Skip(1).ToList()); + Assert.That(res, Is.Not.Null); + + var pointA1 = DbGeometry.FromText(string.Format("POINT(40.644047 -73.782291)")); + var pointB1 = DbGeometry.FromText("POINT(40.717957 -73.736501)"); + var distance1 = pointA1.Distance(pointB1); + + var pointA2 = DbGeometry.FromText("POINT(2.5 2.5)"); + var pointB2 = DbGeometry.FromText("POINT(4 0.8)"); + var distance2 = pointA2.Distance(pointB2); + + var pointA3 = DbGeometry.FromText("POINT(3 -4)"); + var pointB3 = DbGeometry.FromText("POINT(-1 3)"); + var distance3 = pointA3.Distance(pointB3); + + Assert.That(distance1.Value == 0.086944880240295855 && distance2.Value == 2.2671568097509267 && + distance3.Value == 8.06225774829855); + + } + } + + [Test] + public void BeginTransactionSupportTest() + { + using (var dbcontext = new MovieCodedBasedConfigDBContext()) + { + dbcontext.Database.Initialize(true); + using (var transaction = dbcontext.Database.BeginTransaction()) + { + try + { + dbcontext.Movies.Add(new MovieCBC() + { + Title = "Sharknado", + Genre = "Documental", + Price = 1.50M, + ReleaseDate = DateTime.Parse("01/07/2013") + }); + + dbcontext.SaveChanges(); + var result = MySqlHelper.ExecuteScalar("server=localhost;User Id=root;database=test;logging=true;port=" + Port + ";", "select COUNT(*) from moviecbcs;"); + Assert.That(int.Parse(result.ToString()), Is.EqualTo(0)); + + transaction.Commit(); + + result = MySqlHelper.ExecuteScalar("server=localhost;User Id=root;database=test;logging=true; port=" + Port + ";", "select COUNT(*) from moviecbcs;"); + Assert.That(int.Parse(result.ToString()), Is.EqualTo(1)); + } + catch (Exception) + { + transaction.Rollback(); + } + } + } + } + + /// + /// This test covers two new features on EF6: + /// 1- "DbContext.Database.UseTransaction, that use a transaction created from an open connection" + /// 2- "DbContext can now be created with a DbConnection that is already opened" + /// + [Test] + public void UseTransactionSupportTest() + { + using (var context = new MovieCodedBasedConfigDBContext()) + { + context.Database.CreateIfNotExists(); + } + using (var connection = new MySqlConnection($"server=localhost;User Id=root;database={nameof(MovieCodedBasedConfigDBContext)};logging=true; port=" + Port + ";")) + { + connection.Open(); + using (var transaction = connection.BeginTransaction()) + { + try + { + using (var dbcontext = new MovieCodedBasedConfigDBContext(connection, contextOwnsConnection: false)) + { + dbcontext.Database.Initialize(true); + dbcontext.Database.UseTransaction(transaction); + dbcontext.Movies.Add(new MovieCBC() + { + Title = "Sharknado", + Genre = "Documental", + Price = 1.50M, + ReleaseDate = DateTime.Parse("01/07/2013") + }); + + dbcontext.SaveChanges(); + } + var result = MySqlHelper.ExecuteScalar("server=localhost;User Id=root;database=test;logging=true; port=" + Port + ";", "select COUNT(*) from moviecbcs;"); + Assert.That(int.Parse(result.ToString()), Is.EqualTo(0)); + + transaction.Commit(); + + result = MySqlHelper.ExecuteScalar("server=localhost;User Id=root;database=test;logging=true; port=" + Port + ";", "select COUNT(*) from moviecbcs;"); + Assert.That(int.Parse(result.ToString()), Is.EqualTo(1)); + } + catch (Exception) + { + transaction.Rollback(); + } + } + } + } + + [Test] + [Ignore("Need to check. Bad statemen: CALL `MovieCodedBasedConfigDBContext`.``insert_movie``(@movie_name, @ReleaseDate, @Genre, @Price)")] + public void HasChangesSupportTest() + { + using (var dbcontext = new MovieCodedBasedConfigDBContext()) + { + dbcontext.Database.Initialize(true); + + dbcontext.Movies.Add(new MovieCBC() + { + Title = "Sharknado", + Genre = "Documental", + Price = 1.50M, + ReleaseDate = DateTime.Parse("01/07/2013") + }); + + Assert.That(dbcontext.ChangeTracker.HasChanges()); + dbcontext.SaveChanges(); + Assert.That(!dbcontext.ChangeTracker.HasChanges()); + } + } + + [Test] + [Ignore("Need to check. Bad statemen: CALL `MovieCodedBasedConfigDBContext`.``insert_movie``(@movie_name, @ReleaseDate, @Genre, @Price)")] + public void MySqlLoggingToFileSupportTest() + { + string logName = "mysql.log"; + //if (System.IO.File.Exists(logName)) + // System.IO.File.Delete(logName); + + using (var dbcontext = new MovieCodedBasedConfigDBContext()) + { + dbcontext.Database.Log = MySqlLogger.Logger(logName, true).Write; + + dbcontext.Database.Initialize(true); + dbcontext.Movies.Add(new MovieCBC() + { + Title = "Sharknado", + Genre = "Documental", + Price = 1.50M, + ReleaseDate = DateTime.Parse("01/07/2013") + }); + dbcontext.SaveChanges(); + } + + Assert.That(System.IO.File.Exists(logName), Is.EqualTo(true)); + } + + [Test] + [Ignore("Need to check. Bad statemen: CALL `MovieCodedBasedConfigDBContext`.``insert_movie``(@movie_name, @ReleaseDate, @Genre, @Price)")] + public void MySqlLoggingToConsoleSupportTest() + { + string logName = "mysql_2.log"; + if (System.IO.File.Exists(logName)) + System.IO.File.Delete(logName); + + System.IO.FileStream file; + System.IO.StreamWriter writer; + System.IO.TextWriter txtOut = Console.Out; + try + { + file = new System.IO.FileStream(logName, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write); + writer = new System.IO.StreamWriter(file); + } + catch (Exception e) + { + throw e; + } + Console.SetOut(writer); + + using (var dbcontext = new MovieCodedBasedConfigDBContext()) + { + dbcontext.Database.Log = new MySqlLogger(s => Console.Write(s)).Write; + + dbcontext.Database.Initialize(true); + dbcontext.Movies.Add(new MovieCBC() + { + Title = "Sharknado", + Genre = "Documental", + Price = 1.50M, + ReleaseDate = DateTime.Parse("01/07/2013") + }); + dbcontext.SaveChanges(); + } + Console.SetOut(txtOut); + writer.Close(); + file.Close(); + + Assert.That(System.IO.File.Exists(logName), Is.EqualTo(true)); + } + + [Test] + public void EntityAndComplexTypeSupportTest() + { + using (var dbContext = new EntityAndComplexTypeContext()) + { + dbContext.Database.Initialize(true); + dbContext.Students.Add( + new Student() + { + Name = "Pakorasu Pakolas", + Address = new Address() { City = "Mazatlan", Street = "Tierra de Venados 440" }, + Schedule = new List() { new SchoolSchedule() { TeacherName = "Pako", Subject = SchoolSubject.History } } + }); + dbContext.SaveChanges(); + + var student = (from s in dbContext.Students + select s).FirstOrDefault(); + + Assert.That(student, Is.Not.Null); + Assert.That(student.Schedule, Is.Not.Null); + Assert.That(student.Address.Street, Is.Not.Null); + Assert.That(student.Address.Street, Is.Not.Empty); + Assert.That(student.Schedule.Count(), Is.Not.EqualTo(0)); + } + } + + /// + /// TO RUN THIS TEST ITS NECESSARY TO ENABLE THE EXECUTION STRATEGY IN THE CLASS MySqlEFConfiguration (Source\MySql.Data.Entity\MySqlConfiguration.cs) AS WELL AS START A MYSQL SERVER INSTACE WITH THE OPTION "--max_connections=3" + /// WHY 3?: 1)For main process (User: root, DB: mysql). 2)For Setup Class. 3)For the connections in this test. + /// The expected result is that opening a third connection and trying to open a fourth(with an asynchronous task) the execution strategy implementation handle the reconnection process until the third one is closed. + /// + //[Test] //<---DON'T FORGET ME TO RUN! =D + public void ExecutionStrategyTest() + { + var connection = new MySqlConnection("server=localhost;User Id=root;logging=true; port=" + Port + ";"); + using (var dbcontext = new MovieCodedBasedConfigDBContext()) + { + dbcontext.Database.Initialize(true); + dbcontext.Movies.Add(new MovieCBC() + { + Title = "Sharknado", + Genre = "Documental", + Price = 1.50M, + ReleaseDate = DateTime.Parse("01/07/2013") + }); + connection.Open(); + System.Threading.Tasks.Task.Factory.StartNew(() => { dbcontext.SaveChanges(); }); + Thread.Sleep(1000); + connection.Close(); + connection.Dispose(); + } + var result = MySqlHelper.ExecuteScalar("server=localhost;User Id=root;database=test;logging=true; port=" + Port + ";", "select COUNT(*) from moviecbcs;"); + Assert.That(int.Parse(result.ToString()), Is.EqualTo(1)); + } + + [Test] + public void UnknownProjectC1() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + using (MovieDBContext db = new MovieDBContext()) + { + db.Database.Initialize(true); + MovieDBInitialize.DoDataPopulation(db); + long myKey = 20; + var q = (from r in db.Movies where (r.ID == myKey) select (long)r.ID).OrderBy(p => p); + string sql = q.ToString(); + CheckSql(sql, SQLSyntax.UnknownProjectC1EF6); + +#if DEBUG + Debug.WriteLine(sql); +#endif + long[] array = (from r in db.Movies where (r.ID == myKey) select (long)r.ID).OrderBy(p => p).ToArray(); + } + } + + [Test] + public void StartsWithTest() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + MovieDBContext db = new MovieDBContext(); + db.Database.Initialize(true); + MovieDBInitialize.DoDataPopulation(db); + string term = "The"; + var l = db.Movies.Where(p => p.Title.StartsWith(term)); + + string sql = l.ToString(); + + CheckSql(sql, SQLSyntax.QueryWithStartsWith); + +#if DEBUG + Debug.WriteLine(sql); +#endif + int j = l.Count(); + foreach (var i in l) + { + j--; + } + Assert.That(j, Is.EqualTo(0)); + } + + [Test] + public void EndsWithTest() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + MovieDBContext db = new MovieDBContext(); + db.Database.Initialize(true); + MovieDBInitialize.DoDataPopulation(db); + string term = "The"; + var l = db.Movies.Where(p => p.Title.EndsWith(term)); + + string sql = l.ToString(); + + CheckSql(sql, SQLSyntax.QueryWithEndsWith); + +#if DEBUG + Debug.WriteLine(sql); +#endif + int j = l.Count(); + foreach (var i in l) + { + j--; + } + Assert.That(j, Is.EqualTo(0)); + } + + [Test] + public void ContainsTest() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + MovieDBContext db = new MovieDBContext(); + db.Database.Initialize(true); + MovieDBInitialize.DoDataPopulation(db); + string term = "The"; + var l = db.Movies.Where(p => p.Title.Contains(term)); + + string sql = l.ToString(); + CheckSql(sql, SQLSyntax.QueryWithContains); + +#if DEBUG + Debug.WriteLine(sql); +#endif + int j = l.Count(); + foreach (var i in l) + { + j--; + } + Assert.That(j, Is.EqualTo(0)); + } + + + /// + /// Test to reproduce bug http://bugs.mysql.com/bug.php?id=73643, Exception when using IEnumera.Contains(model.property) in Where predicate + /// + [Test] + public void TestContainsListWithCast() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + using (MovieDBContext db = new MovieDBContext()) + { + db.Database.Initialize(true); + + long[] longs = new long[] { 1, 2, 3 }; + var q = db.Movies.Where(p => longs.Contains((long)p.ID)); + string sql = q.ToString(); + CheckSql(sql, SQLSyntax.TestContainsListWithCast); +#if DEBUG + Debug.WriteLine(sql); +#endif + var l = q.ToList(); + } + } + + /// + /// Test to reproduce bug http://bugs.mysql.com/bug.php?id=73643, Exception when using IEnumera.Contains(model.property) in Where predicate + /// + [Test] + public void TestContainsListWitConstant() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + using (MovieDBContext db = new MovieDBContext()) + { + db.Database.Initialize(true); + + List strIds = new List(new string[] { "two" }); + var q = db.Movies.Where(p => strIds.Contains("two")); + string sql = q.ToString(); + CheckSql(sql, SQLSyntax.TestContainsListWitConstant); +#if DEBUG + Debug.WriteLine(sql); +#endif + var l = q.ToList(); + } + } + + /// + /// Test to reproduce bug http://bugs.mysql.com/bug.php?id=73643, Exception when using IEnumera.Contains(model.property) in Where predicate + /// + [Test] + public void TestContainsListWithParameterReference() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + using (MovieDBContext db = new MovieDBContext()) + { + db.Database.Initialize(true); + + long[] longs = new long[] { 1, 2, 3 }; + int myNum = 1; + var q = db.Movies.Where(p => longs.Contains(myNum)); + string sql = q.ToString(); + CheckSql(sql, SQLSyntax.TestContainsListWithParameterReference); +#if DEBUG + Debug.WriteLine(sql); +#endif + var l = q.ToList(); + } + } + + [Test] + public void ReplaceTableNameVisitor() + { + using (SakilaDb context = new SakilaDb()) + { + var date = new DateTime(2005, 6, 1); + var rentals = context.customers.Where(t => t.rentals.Any(r => r.rental_date < date)).OrderBy(o => o.customer_id); + string sql = rentals.ToString(); + CheckSql(sql, SQLSyntax.ReplaceNameVisitorQuery); +#if DEBUG + Debug.WriteLine(sql); +#endif + var result = rentals.ToList(); + Assert.That(rentals.Count(), Is.EqualTo(520)); + } + } + + + /// + /// Bug #70941 - Invalid SQL query when eager loading two nested collections + /// + [Test] + public void InvalidQuery() + { + using (UsingUnionContext context = new UsingUnionContext()) + { + if (context.Database.Exists()) + context.Database.Delete(); + + context.Database.Create(); + + for (int i = 1; i <= 3; i++) + { + var order = new Order(); + var items = new List(); + + items.Add(new Item { Id = 1 }); + items.Add(new Item { Id = 2 }); + items.Add(new Item { Id = 3 }); + + order.Items = items; + var client = new Client { Id = i }; + client.Orders = new List(); + client.Orders.Add(order); + + context.Clients.Add(client); + } + context.SaveChanges(); + + var clients = context.Clients + .Include(c => c.Orders.Select(o => o.Items)) + .Include(c => c.Orders.Select(o => o.Discounts)).ToList(); + + Assert.That(3, Is.EqualTo(clients.Count())); + Assert.That(1, Is.EqualTo(clients.Where(t => t.Id == 1).Single().Orders.Count())); + Assert.That(3, Is.EqualTo(clients.Where(t => t.Id == 1).Single().Orders.Where(j => j.Id == 1).Single().Items.Count())); + } + } + + /// + /// Bug #28095165 - CONTRIBUTION: FIX CONCURRENCYCHECK + DATABASEGENERATEDOPTION.COMPUTED + /// + [Test] + public void ConcurrencyCheckWithDbGeneratedColumn() + { +#if DEBUG + Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); +#endif + using (MovieDBContext db = new MovieDBContext()) + { + db.Database.Delete(); + db.Database.CreateIfNotExists(); + db.Database.Log = (e) => Debug.WriteLine(e); + db.Database.ExecuteSqlCommand(@"DROP TABLE IF EXISTS `MovieReleases2`"); + + db.Database.ExecuteSqlCommand( + @"CREATE TABLE IF NOT EXISTS `MovieRelease2` ( + `Id` int(11) NOT NULL, + `Name` varchar(45) NOT NULL, + `Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `RowVersion` bigint NOT NULL DEFAULT 0, + PRIMARY KEY (`Id`) + ) ENGINE=InnoDB DEFAULT CHARSET=binary"); + + db.Database.ExecuteSqlCommand( + @"CREATE TRIGGER `trg_MovieRelease2_before_update` + BEFORE UPDATE ON `MovieRelease2` + FOR EACH ROW SET NEW.RowVersion = OLD.RowVersion + 1;"); + + MySqlTrace.Listeners.Clear(); + MySqlTrace.Switch.Level = SourceLevels.All; + GenericListener listener = new GenericListener(); + MySqlTrace.Listeners.Add(listener); + + try + { + MovieRelease2 mr = db.MovieReleases2.Create(); + mr.Id = 1; + mr.Name = "Commercial"; + db.MovieReleases2.Add(mr); + Assert.That(0, Is.EqualTo(mr.RowVersion)); + db.SaveChanges(); // ADD + Assert.That(0, Is.EqualTo(mr.RowVersion)); + + mr.Name = "Director's Cut"; + db.SaveChanges(); // UPDATE #1 + Assert.That(1, Is.EqualTo(mr.RowVersion)); + + mr.Name = "Avengers"; + db.SaveChanges(); // UPDATE #2 + Assert.That(2, Is.EqualTo(mr.RowVersion)); + } + finally + { + db.Database.ExecuteSqlCommand(@"DROP TABLE IF EXISTS `MovieReleases2`"); + } + // Check sql + Regex rx = new Regex(@"Query Opened: (?UPDATE .*)", RegexOptions.Compiled | RegexOptions.Singleline); + int n = 0; + foreach (string s in listener.Strings) + { + Match m = rx.Match(s); + if (m.Success) + { + if (n++ == 0) + { + CheckSql(m.Groups["item"].Value, SQLSyntax.UpdateWithSelectWithDbGeneratedLock1); + } + else + { + CheckSql(m.Groups["item"].Value, SQLSyntax.UpdateWithSelectWithDbGeneratedLock2); + } + } + } + } + } + + /// + /// Bug #31323788 - EF6 CODE FIRST - TABLE SCHEMAS ARE LOST, BUT AUTOMATIC MIGRATIONS USES THEM + /// + [Test] + public void TablesWithSchema() + { + using (BlogContext context = new BlogContext()) + { + var blog = new Blog { Title = "Blog_1" }; + context.Blog.Add(blog); + + blog = new Blog { Title = "Blog_2" }; + context.Blog.Add(blog); + + context.SaveChanges(); + Assert.That(context.Blog.Count(), Is.EqualTo(2)); + Assert.That(context.Blog.First(b => b.Title == "Blog_2").BlogId, Is.EqualTo(2)); + + context.Blog.Remove(blog); + context.SaveChanges(); + Assert.That(context.Blog.Count(), Is.EqualTo(1)); + Assert.That(context.Blog.First().Title, Is.EqualTo("Blog_1")); + } + } + + [Test, Description("UNION SYNTAX MISSING REQUIRED PARENTHESIS")] + public void UnionSyntax() + { + using (var context = new ContextForString()) + { + context.Database.Delete(); + context.Database.Create(); + context.StringUsers.Add(new StringUser + { + StringUserId = 1, + Name50 = "Juan", + Name100 = "100", + Name200 = "200", + Name300 = "300" + }); + context.StringUsers.Add(new StringUser + { + StringUserId = 2, + Name50 = "Pedro", + Name100 = "cien", + Name200 = "doscientos", + Name300 = "trescientos" + }); + context.StringUsers.Add(new StringUser + { + StringUserId = 3, + Name50 = "Lupe", + Name100 = "101", + Name200 = "cxvbx", + Name300 = "301" + }); + context.StringUsers.Add(new StringUser + { + StringUserId = 4, + Name50 = "Luis", + Name100 = "asdf", + Name200 = "wrwe", + Name300 = "xcvb" + }); + context.StringUsers.Add(new StringUser + { + StringUserId = 5, + Name50 = "Pepe", + Name100 = "asdf", + Name200 = "zxvz", + Name300 = "fgsd" + }); + context.SaveChanges(); + + var query1 = context.StringUsers; + var query2 = query1.Take(0).Concat(query1); + var query3 = query1.Concat(query1.Take(0)); + Assert.That((query1.Count() == 5) & (query2.Count() == 5) & (query3.Count() == 5)); + } + } + + [Test, Description("FK name ,longer than 64 chars are named to FK_")] + public void NormalForeignKey() + { + using (var context = new ContextForNormalFk()) + { + context.Database.Initialize(true); + using (MySqlConnection conn = new MySqlConnection(context.Database.Connection.ConnectionString)) + { + conn.Open(); + var cmd = new MySqlCommand(); + var entityName = (context.Permisos.GetType().FullName.Split(',')[0]).Substring(66).ToLowerInvariant(); + var contextName = context.GetType().Name.ToLowerInvariant(); + cmd.Connection = conn; + cmd.CommandText = + $"SELECT CONSTRAINT_NAME FROM information_schema.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_SCHEMA = '{contextName}' and TABLE_NAME = '{entityName}';"; + cmd.ExecuteNonQuery(); + + using (var reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + var val = reader.GetValue(0); + Assert.That(val.ToString().Contains("FK_")); + } + } + } + } + } + + [Test, Description("FK name ,longer than 64 chars are named to FK_")] + public void LongForeignKey() + { + using (var context = new ContextForLongFk()) + { + context.Database.Initialize(true); + var entityName = (context.Permisos.GetType().FullName.Split(',')[0]).Substring(66).ToLowerInvariant(); + var contextName = context.GetType().Name.ToLowerInvariant(); + using (MySqlConnection conn = new MySqlConnection(context.Database.Connection.ConnectionString)) + { + conn.Open(); + var cmd = new MySqlCommand(); + cmd.Connection = conn; + cmd.CommandText = + $"SELECT CONSTRAINT_NAME FROM information_schema.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_SCHEMA = '{contextName}' and TABLE_NAME = '{entityName}';"; + cmd.ExecuteNonQuery(); + + using (var reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + var val = reader.GetValue(0); + Assert.That(val.ToString().Contains("FK_")); + } + } + } + } + } + + [Test, Description("Verify that Null Reference Exception is not thrown when try to save entity with TINYINT AS PK ")] + public void SaveTinyIntAsPK() + { + using (var context = new ContextForTinyPk()) + { + context.Database.Delete(); + context.Database.Create(); + context.TinyPkUseRs.Add(new TinyPkUser + { + StringUserId = 1, + Name50 = "Juan", + Name100 = "100", + Name200 = "200", + Name300 = "300" + }); + + context.TinyPkUseRs.Add(new TinyPkUser + { + StringUserId = 2, + Name50 = "Pedro", + Name100 = "cien", + Name200 = "doscientos", + Name300 = "trescientos" + }); + + context.TinyPkUseRs.Add(new TinyPkUser + { + StringUserId = 3, + Name50 = "Lupe", + Name100 = "101", + Name200 = "cxvbx", + Name300 = "301" + }); + + context.TinyPkUseRs.Add(new TinyPkUser + { + StringUserId = 4, + Name50 = "Luis", + Name100 = "asdf", + Name200 = "wrwe", + Name300 = "xcvb" + }); + + context.TinyPkUseRs.Add(new TinyPkUser + { + StringUserId = 5, + Name50 = "Pepe", + Name100 = "asdf", + Name200 = "zxvz", + Name300 = "fgsd" + }); + context.SaveChanges(); + var query1 = context.TinyPkUseRs; + var query2 = query1.Take(0).Concat(query1); + var query3 = query1.Concat(query1.Take(0)); + Assert.That((query1.Count() == 5) & (query2.Count() == 5) & (query3.Count() == 5)); + } + } + + [Test, Description("Verify that Null Reference Exception is not thrown when try to save entity with BIGINT AS PK ")] + public void SaveBigIntAsPK() + { + using (var context = new ContextForBigIntPk()) + { + context.Database.Delete(); + context.Database.Create(); + context.BigIntPkUseRs.Add(new BigIntPkUser + { + StringUserId = 934157136952, + Name50 = "Juan", + Name100 = "100", + Name200 = "200", + Name300 = "300" + }); + + context.BigIntPkUseRs.Add(new BigIntPkUser + { + StringUserId = 934157136953, + Name50 = "Pedro", + Name100 = "cien", + Name200 = "doscientos", + Name300 = "trescientos" + }); + + context.BigIntPkUseRs.Add(new BigIntPkUser + { + StringUserId = 9223372036854775807, + Name50 = "Lupe", + Name100 = "101", + Name200 = "cxvbx", + Name300 = "301" + }); + + context.BigIntPkUseRs.Add(new BigIntPkUser + { + StringUserId = 0, + Name50 = "Luis", + Name100 = "asdf", + Name200 = "wrwe", + Name300 = "xcvb" + }); + + context.BigIntPkUseRs.Add(new BigIntPkUser + { + StringUserId = -9223372036854775808, + Name50 = "Pepe", + Name100 = "asdf", + Name200 = "zxvz", + Name300 = "fgsd" + }); + context.SaveChanges(); + var query1 = context.BigIntPkUseRs; + var query2 = query1.Take(0).Concat(query1); + var query3 = query1.Concat(query1.Take(0)); + Assert.That((query1.Count() == 5) & (query2.Count() == 5) & (query3.Count() == 5)); + } + } + + [Test, Description("TRANSACTION AFTER A FAILED TRANSACTION((USING BeginTransaction)) Commit")] + public void BeginTransNested() + { + using (var context = new EnumTestSupportContext()) + { + using (var trans = context.Database.BeginTransaction()) + { + Thread.Sleep(5000); + Assert.Catch(() => context.Database.ExecuteSqlCommand("update table schoolschedule")); + trans.Commit(); + } + using (var trans = context.Database.BeginTransaction()) + { + context.SchoolSchedules.Add(new SchoolSchedule + { + TeacherName = "Ruben", + Subject = SchoolSubject.History + }); + ; + + context.SchoolSchedules.Add(new SchoolSchedule + { + TeacherName = "Peter", + Subject = SchoolSubject.Chemistry + }); + ; + + context.SchoolSchedules.Add(new SchoolSchedule + { + TeacherName = "Juan", + Subject = SchoolSubject.Math + }); + ; + context.SaveChanges(); + trans.Commit(); + } + var count = context.SchoolSchedules.Count(); + Assert.That(count, Is.EqualTo(3)); + //Rollback + using (var trans = context.Database.BeginTransaction()) + { + Assert.Catch(() => context.Database.ExecuteSqlCommand("update table schoolschedule")); + trans.Rollback(); + } + using (var trans = context.Database.BeginTransaction()) + { + context.SchoolSchedules.Add(new SchoolSchedule + { + TeacherName = "Andrew", + Subject = SchoolSubject.History + }); ; + ; + context.SaveChanges(); + trans.Commit(); + } + count = context.SchoolSchedules.Count(); + Assert.That(count, Is.EqualTo(4)); + } + + } + + [Test, Description("TRANSACTION AFTER A FAILED TRANSACTION((USING BeginTransaction)) Stress Test")] + public void TransactionAfterFailStressTest() + { + for (var i = 0; i < 100; i++) + { + using (var context = new EnumTestSupportContext()) + { + using (var trans = context.Database.BeginTransaction()) + { + Assert.Catch(() => context.Database.ExecuteSqlCommand("update table schoolschedule")); + trans.Commit(); + } + using (var trans = context.Database.BeginTransaction()) + { + context.SchoolSchedules.Add(new SchoolSchedule + { + TeacherName = "Ruben", + Subject = SchoolSubject.History + }); + ; + + context.SchoolSchedules.Add(new SchoolSchedule + { + TeacherName = "Peter", + Subject = SchoolSubject.Chemistry + }); + ; + + context.SchoolSchedules.Add(new SchoolSchedule + { + TeacherName = "Juan", + Subject = SchoolSubject.Math + }); + context.SaveChanges(); + trans.Commit(); + var count = context.SchoolSchedules.Count(); + Assert.That(count > 0); + } + } + } + } + + + [Test, Description("Wrong SQL Statement to set primary key ")] + public void WrongSQLStatementPK() + { + using (var context = new EducationContext()) + { + context.Database.Delete(); + context.Database.Create(); + context.Passports.Add(new Passport { Key = 1 }); + context.SaveChanges(); + context.Database.ExecuteSqlCommand("ALTER TABLE `passports` CHANGE `Key` `Key1` int NOT NULL AUTO_INCREMENT UNIQUE"); + context.Database.ExecuteSqlCommand("ALTER TABLE `passports` DROP PRIMARY KEY"); + } + + using (var context = new EducationContext()) + { + context.Passports.Add(new Passport { Key = 1 }); + Exception ex = Assert.Catch(() => context.SaveChanges()); + context.Database.Delete(); + } + } + + /// + /// Bug #34498485 [MySQL.Data.EntityFramework does not handle LIKE (Edm.IndexOf) cases] + /// + [Test] + public void TestListMatchingLike() + { + using (VehicleDbContext2 context = new VehicleDbContext2()) + { + context.Database.Delete(); + context.Database.Initialize(true); + + context.Vehicles.Add(new Car2 { Id = 1, Name = "Mustang", Year = 2012, CarProperty = "Car" }); + context.Vehicles.Add(new Bike2 { Id = 101, Name = "Mountain", Year = 2011, BikeProperty = "Bike" }); + context.SaveChanges(); + + string[] matchText = new string[] { "must", "tan" }; + var list = context.Vehicles.Where(v => matchText.Any(t => v.Name.Contains(t))); + Assert.That(list.Count(), Is.EqualTo(1)); + + matchText = new string[] { "mus't", "tan" }; + list = context.Vehicles.Where(v => matchText.Any(t => v.Name.Contains(t))); + Assert.That(list.Count(), Is.EqualTo(1)); + + matchText = new string[] { "%" }; + list = context.Vehicles.Where(v => matchText.Any(t => v.Name.Contains(t))); + Assert.That(list.Count(), Is.EqualTo(0)); + + matchText = new string[] { "tan" }; + list = context.Vehicles.Where(v => matchText.Any(t => v.Name.Contains(t))); + Assert.That(list.Count(), Is.EqualTo(1)); + + matchText = new string[] { "_" }; + list = context.Vehicles.Where(v => matchText.Any(t => v.Name.Contains(t))); + Assert.That(list.Count(), Is.EqualTo(0)); + } + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/ContextForNormalFk.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/ContextForNormalFk.cs new file mode 100644 index 000000000..4f867370d --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/ContextForNormalFk.cs @@ -0,0 +1,184 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.ComponentModel.DataAnnotations; +using System.Data.Entity; +using System.ComponentModel.DataAnnotations.Schema; +using MySql.Data.EntityFramework; +using MySql.Data.EntityFramework.CodeFirst.Tests; +using System.Collections.Generic; + +namespace MySql.EntityFramework.CodeFirst.Tests +{ + //ContextForNormalFk + [DbConfigurationType(typeof(MySqlEFConfiguration))] + public class ContextForNormalFk : DbContext + { + public ContextForNormalFk() : base(CodeFirstFixture.GetEFConnectionString()) + { + Database.SetInitializer(new DropCreateDatabaseAlways()); + } + + public DbSet Usuarios { get; set; } + public DbSet Perfiles { get; set; } + public DbSet Permisos { get; set; } + + protected override void OnModelCreating(DbModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + modelBuilder.Configurations.AddFromAssembly(System.Reflection.Assembly.GetExecutingAssembly()); + modelBuilder.Entity().HasKey(c => c.Id); + modelBuilder.Entity().Property(c => c.Nombre).IsRequired().HasMaxLength(50); + } + } + + public class Usuario + { + public int Id { get; set; } + [Required] + [StringLength(100)] + public string NombreCompleto { get; set; } + [Required] + [StringLength(100)] + [DataType(DataType.EmailAddress)] + public string Email { get; set; } + [Required] + [StringLength(30)] + public string Login { get; set; } + [Required] + [StringLength(64)] + public string Senha { get; set; } + [Required] + public bool Activo { get; set; } + [ConcurrencyCheck] + public int Version { get; set; } + } + + [Table("perfiles")] + public class Perfil + { + public int Id { get; set; } + [Required] + [StringLength(50)] + public string Nombre { get; set; } + [StringLength(100)] + public string Descripcion { get; set; } + [ConcurrencyCheck] + public int Version { get; set; } + public virtual ICollection Usuarios { get; set; } + public virtual ICollection Permisos { get; set; } + } + + + [Table("permisos")] + public class Permiso + { + public int Id { get; set; } + + public string Nombre { get; set; } + + public string Descripcion { get; set; } + + public int Version { get; set; } + } + + //ContextForLongFk + public class Usuario0123456789012345567890123456789012345678901234567890 + { + public int Id { get; set; } + + [Required] + [StringLength(100)] + public string NombreCompleto { get; set; } + + [Required] + [StringLength(100)] + [DataType(DataType.EmailAddress)] + public string Email { get; set; } + + [Required] + [StringLength(30)] + public string Login { get; set; } + + [Required] + [StringLength(64)] + public string Senha { get; set; } + + [Required] + public bool Activo { get; set; } + + //[Timestamp] + [ConcurrencyCheck] + public int Version { get; set; } + } + + public class Perfil0123456789012345567890123456789012345678901234567890 + { + public int Id { get; set; } + + [Required] + [StringLength(50)] + public string Nombre { get; set; } + + [StringLength(100)] + public string Descripcion { get; set; } + + //[Timestamp] + [ConcurrencyCheck] + public int Version { get; set; } + + public virtual ICollection Usuarios { get; set; } + public virtual ICollection Permisos { get; set; } + } + + public class Permiso0123456789012345567890123456789012345678901234567890 + { + public int Id { get; set; } + + [Required] + [StringLength(50)] + public string Nombre { get; set; } + + [StringLength(100)] + public string Descripcion { get; set; } + + [ConcurrencyCheck] + public int Vesion { get; set; } + } + + public class ContextForLongFk : DbContext + { + public ContextForLongFk() : base(CodeFirstFixture.GetEFConnectionString()) + { + Database.SetInitializer(new DropCreateDatabaseAlways()); + } + public DbSet Usuarios { get; set; } + public DbSet Perfiles { get; set; } + public DbSet Permisos { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/ContextForString.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/ContextForString.cs new file mode 100644 index 000000000..131e32d2b --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/ContextForString.cs @@ -0,0 +1,124 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Data.Entity; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using MySql.Data.EntityFramework.CodeFirst.Tests; + +namespace MySql.EntityFramework.CodeFirst.Tests +{ + //ContextForString + class ContextForString : DbContext + { + public ContextForString() : base(CodeFirstFixture.GetEFConnectionString()) { } + public DbSet StringUsers { get; set; } + } + public class StringUser + { + public int StringUserId { get; set; } + + [StringLength(50)] + public string Name50 { get; set; } + + [StringLength(100)] + public string Name100 { get; set; } + + [StringLength(200)] + public string Name200 { get; set; } + + [StringLength(300)] + public string Name300 { get; set; } + } + + //ContextForTinyPk + public class ContextForTinyPk : DbContext + { + public ContextForTinyPk() : base(CodeFirstFixture.GetEFConnectionString()) { } + public DbSet TinyPkUseRs { get; set; } + } + + public class TinyPkUser + { + [Key] + [DataType("TINYINT")] + public byte StringUserId { get; set; } + + [StringLength(50)] + public string Name50 { get; set; } + + [StringLength(100)] + public string Name100 { get; set; } + + [StringLength(200)] + public string Name200 { get; set; } + + [StringLength(300)] + public string Name300 { get; set; } + } + + //ContextForBigIntPk + public class ContextForBigIntPk : DbContext + { + public ContextForBigIntPk() : base(CodeFirstFixture.GetEFConnectionString()) { } + public DbSet BigIntPkUseRs { get; set; } + } + + public class BigIntPkUser + { + [Key] + [DataType("BIGINT")] + public long StringUserId { get; set; } + + [StringLength(50)] + public string Name50 { get; set; } + + [StringLength(100)] + public string Name100 { get; set; } + + [StringLength(200)] + public string Name200 { get; set; } + + [StringLength(300)] + public string Name300 { get; set; } + } + + //EducationContext + [Table("passports")] + public class Passport + { + [Key] + public int Key { get; set; } + } + + public class EducationContext : DbContext + { + public EducationContext() : base(CodeFirstFixture.GetEFConnectionString()) { } + public DbSet Passports { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Dinosauria.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Dinosauria.cs new file mode 100644 index 000000000..fcbd96de0 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Dinosauria.cs @@ -0,0 +1,89 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.ComponentModel.DataAnnotations; +using System.Data.Entity; +using System.ComponentModel.DataAnnotations.Schema; + + + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + /* + * This data model tests very long names to break FK limit of 64 chars. + * Also uses Table per Type inheritance (TPT). + * */ + public class Animalia_Chordata_Dinosauria_Eusaurischia_Theropoda + { + [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] + public int Id { get; set; } + + [MaxLength(40)] + public string Name { get; set; } + } + + [Table("Tyrannosauridaes")] + public class Tyrannosauridae : Animalia_Chordata_Dinosauria_Eusaurischia_Theropoda + { + public string SpecieName { get; set; } + public float Weight { get; set; } + } + + [Table("Oviraptorosaurias")] + public class Oviraptorosauria : Animalia_Chordata_Dinosauria_Eusaurischia_Theropoda + { + public string SpecieName { get; set; } + public int EggsPerYear { get; set; } + } + + [DbConfigurationType(typeof(MySqlEFConfiguration))] + public class DinosauriaDBContext : DbContext + { + public DbSet dinos { get; set; } + + public DinosauriaDBContext() : base(CodeFirstFixture.GetEFConnectionString()) + { + Database.SetInitializer(new DinosauriaDBInitializer()); + } + + protected override void OnModelCreating(DbModelBuilder modelBuilder) + { + modelBuilder.Entity().ToTable("Tyrannosauridaes"); + modelBuilder.Entity().ToTable("Oviraptorosaurias"); + } + } + + public class DinosauriaDBInitializer : DropCreateDatabaseReallyAlways + { + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Movie.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Movie.cs new file mode 100644 index 000000000..e7a03477e --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Movie.cs @@ -0,0 +1,176 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Linq; +using System.Text; +using System.Data.Entity; +using System.Data.Entity.ModelConfiguration.Conventions; +using System.Data.Entity.Migrations; +using System.ComponentModel.DataAnnotations.Schema; + + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + public class Movie + { + public int ID { get; set; } + public string Title { get; set; } + public DateTime ReleaseDate { get; set; } + public string Genre { get; set; } + public decimal Price { get; set; } + public Director Director { get; set; } + public virtual ICollection Formats { get; set; } + public virtual ICollection Medias { get; set; } + public byte[] Data { get; set; } + } + + public class MovieMedia + { + public int ID { get; set; } + public int MovieID { get; set; } + public string Format { get; set; } + } + + public class Director + { + public int ID { get; set; } + public string Name { get; set; } + public int YearBorn { get; set; } + } + + public class MovieFormat + { + [Key] + public float Format { get; set; } + } + + [DbConfigurationType(typeof(MySqlEFConfiguration))] + public class MovieDBContext : DbContext + { + public DbSet Movies { get; set; } + public DbSet MovieFormats { get; set; } + public DbSet MovieReleases { get; set; } + public DbSet MovieReleases2 { get; set; } + public DbSet EntitySingleColumns { get; set; } + public DbSet Medias { get; set; } + + + + public MovieDBContext() : base(CodeFirstFixture.GetEFConnectionString()) + { + //Database.SetInitializer(new MigrateDatabaseToLatestVersion>()); + Database.SetInitializer(new DropCreateDatabaseAlways()); + } + + protected override void OnModelCreating(DbModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + modelBuilder.Configurations.AddFromAssembly(System.Reflection.Assembly.GetExecutingAssembly()); + modelBuilder.Entity().Property(x => x.Price).HasPrecision(16, 2); + modelBuilder.Entity().HasMany(p => p.Formats); + modelBuilder.Entity().HasMany( p => p.Medias ); +} + } + + public class EntitySingleColumn + { + public int Id { get; set; } + } + + public class MovieRelease + { + [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] + public virtual int Id { get; set; } + + [DatabaseGenerated(DatabaseGeneratedOption.Computed)] + public virtual DateTime Timestamp { get; set; } + + // Test: ConcurrencyCheck + Not Computed + [ConcurrencyCheck, Required, MaxLength(45)] + public virtual string Name { get; set; } + } + + public class MovieRelease2 + { + [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] + public virtual int Id { get; set; } + + //[DatabaseGenerated(DatabaseGeneratedOption.Computed)] + //public virtual DateTime Timestamp { get; set; } + + // Test: non computed column + [Required, MaxLength(45)] + public virtual string Name { get; set; } + + // Test: ConcurrencyCheck + Computed + [ConcurrencyCheck, DatabaseGenerated(DatabaseGeneratedOption.Computed)] + [Column(TypeName = "bigint")] + public virtual long RowVersion { get; set; } + } + + public class MovieDBInitialize : DropCreateDatabaseReallyAlways + { + public static Movie[] data = new Movie[] { + new Movie() { ID = 4, Title = "Star Wars, The Sith Revenge", ReleaseDate = new DateTime( 2005, 5, 19 ) }, + new Movie() { ID = 3, Title = "Predator", ReleaseDate = new DateTime(1987, 6, 12) }, + new Movie() { ID = 2, Title = "The Matrix", ReleaseDate = new DateTime( 1999, 3, 31 ) }, + new Movie() { ID = 1, Title = "Terminator 1", ReleaseDate = new DateTime(1984, 10, 26) } + }; + + internal static void DoDataPopulation( MovieDBContext ctx ) + { + ctx.Database.ExecuteSqlCommand("CREATE PROCEDURE GetCount() BEGIN SELECT 5; END"); + Movie m1 = new Movie() { Title = "Terminator 1", ReleaseDate = new DateTime(1984, 10, 26) }; + Movie m2 = new Movie() { Title = "The Matrix", ReleaseDate = new DateTime(1999, 3, 31) }; + Movie m3 = new Movie() { Title = "Predator", ReleaseDate = new DateTime(1987, 6, 12) }; + Movie m4 = new Movie() { Title = "Star Wars, The Sith Revenge", ReleaseDate = new DateTime(2005, 5, 19) }; + ctx.Movies.Add(m1); + ctx.Movies.Add(m2); + ctx.Movies.Add(m3); + ctx.Movies.Add(m4); + ctx.SaveChanges(); + ctx.Entry(m1).Collection(p => p.Medias).Load(); + m1.Medias.Add( new MovieMedia() { Format = "DVD" } ); + m1.Medias.Add( new MovieMedia() { Format = "BlueRay" } ); + ctx.Entry(m2).Collection(p => p.Medias).Load(); + m2.Medias.Add(new MovieMedia() { Format = "DVD" }); + m2.Medias.Add(new MovieMedia() { Format = "Digital" }); + ctx.Entry(m3).Collection(p => p.Medias).Load(); + m3.Medias.Add(new MovieMedia() { Format = "DVD" }); + m3.Medias.Add(new MovieMedia() { Format = "VHS" }); + ctx.Entry(m4).Collection(p => p.Medias).Load(); + m4.Medias.Add(new MovieMedia() { Format = "Digital" }); + m4.Medias.Add(new MovieMedia() { Format = "VHS" }); + ctx.SaveChanges(); + } + } +} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/MovieContextCodeBasedConfiguration.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/MovieContextCodeBasedConfiguration.cs similarity index 80% rename from Tests/MySql.EntityFramework6.CodeFirst.Tests/MovieContextCodeBasedConfiguration.cs rename to EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/MovieContextCodeBasedConfiguration.cs index 8d7b409b3..eba30e4e5 100644 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/MovieContextCodeBasedConfiguration.cs +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/MovieContextCodeBasedConfiguration.cs @@ -1,23 +1,29 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. +// Copyright © 2013, 2025, Oracle and/or its affiliates. // -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. // -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. // -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. // -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., // 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA @@ -29,20 +35,13 @@ using System.ComponentModel.DataAnnotations.Schema; using System.Data.Entity; using MySql.Data.MySqlClient; -using MySql.Data.Entity; using System.Data.Common; -#if EF6 using System.Data.Entity.Migrations; using System.Data.Entity.Migrations.Infrastructure; using System.Data.Entity.Migrations.History; using System.Data.Entity.Spatial; -#else -#if NET_45_OR_GREATER -using System.Data.Spatial; -#endif -#endif -namespace MySql.Data.Entity.CodeFirst.Tests +namespace MySql.Data.EntityFramework.CodeFirst.Tests { public class MovieCBC { @@ -53,9 +52,7 @@ public class MovieCBC public decimal Price { get; set; } } -#if EF6 - [DbConfigurationType(typeof(MySqlEFConfiguration))] -#endif + [DbConfigurationType(typeof(MySqlEFConfiguration))] public class MovieCodedBasedConfigDBContext : DbContext { public DbSet Movies { get; set; } @@ -64,30 +61,24 @@ public MovieCodedBasedConfigDBContext(DbConnection existingConnection, bool cont : base(existingConnection, contextOwnsConnection) { Database.SetInitializer(new MovieCBCDBInitialize()); -#if EF6 Database.SetInitializer(new MigrateDatabaseToLatestVersion>()); -#endif } - public MovieCodedBasedConfigDBContext() + public MovieCodedBasedConfigDBContext() : base(CodeFirstFixture.GetEFConnectionString()) { Database.SetInitializer(new MovieCBCDBInitialize()); -#if EF6 Database.SetInitializer(new MigrateDatabaseToLatestVersion>()); -#endif } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); -#if EF6 //modelBuilder.Entity().Property(x => x.Price).HasPrecision(16, 2); modelBuilder.Conventions.Add(); modelBuilder.Entity().MapToStoredProcedures( - sp => sp.Insert( i => i.HasName("insert_movie").Parameter(p => p.Title, "movie_name")) + sp => sp.Insert(i => i.HasName("insert_movie").Parameter(p => p.Title, "movie_name")) .Update(u => u.HasName("update_movie").Parameter(p => p.Title, "movie_name")) .Delete(d => d.HasName("delete_movie")) ); -#endif } } @@ -106,7 +97,6 @@ protected virtual void Seed(TContext context) } } -#if EF6 public class MyHistoryContext : MySqlHistoryContext { public MyHistoryContext(DbConnection existingConnection, string defaultSchema) @@ -132,7 +122,7 @@ public Configuration() { CodeGenerator = new MySqlMigrationCodeGenerator(); AutomaticMigrationsEnabled = true; - SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator()); + SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.EntityFramework.MySqlMigrationSqlGenerator()); SetHistoryContextFactory("MySql.Data.MySqlClient", (existingConnection, defaultSchema) => new MyHistoryContext(existingConnection, defaultSchema)); } } @@ -157,7 +147,7 @@ public class EnumTestSupportContext : DbContext { public DbSet SchoolSchedules { get; set; } - public EnumTestSupportContext() + public EnumTestSupportContext() : base(CodeFirstFixture.GetEFConnectionString()) { Database.SetInitializer(new EnumTestSupportInitialize()); Database.SetInitializer(new MigrateDatabaseToLatestVersion()); @@ -190,7 +180,7 @@ public EnumCtxConfiguration() { CodeGenerator = new MySqlMigrationCodeGenerator(); AutomaticMigrationsEnabled = true; - SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator()); + SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.EntityFramework.MySqlMigrationSqlGenerator()); SetHistoryContextFactory("MySql.Data.MySqlClient", (existingConnection, defaultSchema) => new MyHistoryContext(existingConnection, defaultSchema)); } } @@ -209,7 +199,7 @@ public class MyPlace public class JourneyContext : DbContext { public DbSet MyPlaces { get; set; } - public JourneyContext() + public JourneyContext() : base(CodeFirstFixture.GetEFConnectionString()) { Database.SetInitializer(new JourneyInitialize()); Database.SetInitializer(new MigrateDatabaseToLatestVersion()); @@ -242,7 +232,7 @@ public JourneyConfiguration() { CodeGenerator = new MySqlMigrationCodeGenerator(); AutomaticMigrationsEnabled = true; - SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator()); + SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.EntityFramework.MySqlMigrationSqlGenerator()); SetHistoryContextFactory("MySql.Data.MySqlClient", (existingConnection, defaultSchema) => new MyHistoryContext(existingConnection, defaultSchema)); } } @@ -280,7 +270,7 @@ public class EntityAndComplexTypeContext : DbContext public DbSet Students { get; set; } public DbSet Schedules { get; set; } - public EntityAndComplexTypeContext() + public EntityAndComplexTypeContext() : base(CodeFirstFixture.GetEFConnectionString()) { Database.SetInitializer(new MovieCBCDBInitialize()); Database.SetInitializer(new MigrateDatabaseToLatestVersion>()); @@ -292,5 +282,4 @@ protected override void OnModelCreating(DbModelBuilder modelBuilder) } } #endregion -#endif -} \ No newline at end of file +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/MySql.EntityFramework.CodeFirst.Tests.csproj b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/MySql.EntityFramework.CodeFirst.Tests.csproj new file mode 100644 index 000000000..f1a6065cc --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/MySql.EntityFramework.CodeFirst.Tests.csproj @@ -0,0 +1,92 @@ + + + + MySql.Data.EntityFramework.CodeFirst.Tests + Copyright © 2016, 2025, Oracle and/or its affiliates. + en-US + 9.4.0 + Oracle + net462;net48;net9.0 + MySql.EntityFramework.CodeFirst.Tests + MySql.EntityFramework.CodeFirst.Tests + MySql;.NET Connector;MySql Connector/NET + http://www.mysql.com/common/logos/logo-mysql-170x115.png + http://dev.mysql.com/downloads/ + GPL-2.0-only WITH Universal-FOSS-exception-1.0 + true + false + false + false + false + false + false + MySql.EntityFramework.CodeFirst.Tests + True + True + ..\..\..\ConnectorNetPublicKey.snk + CA2100 + latest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + true + + + + + True + True + SQLSyntax.resx + + + + + + ResXFileCodeGenerator + SQLSyntax.Designer.cs + + + + \ No newline at end of file diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/PromotionsDB.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/PromotionsDB.cs new file mode 100644 index 000000000..9ac820133 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/PromotionsDB.cs @@ -0,0 +1,89 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Data.Entity; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + [DbConfigurationType(typeof(MySqlEFConfiguration))] + public class PromotionsDB : DbContext + { + private bool disposed = false; + + public virtual DbSet HomePromoes { get; set; } + + public PromotionsDB() : base(CodeFirstFixture.GetEFConnectionString()) + { + Database.SetInitializer(new PromotionsDBInitializer()); + } + + protected override void Dispose(bool disposing) + { + if (disposed) + return; + + if (disposing) + { + Database.Delete(); + } + + base.Dispose(disposing); + disposed = true; + } + } + + public class PromotionsDBInitializer : DropCreateDatabaseReallyAlways + { + } + + public class HomePromo + { + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + [Key] + public int ID { get; set; } + + public string Image { get; set; } + + public string Url { get; set; } + + public int DisplayOrder { get; set; } + + [Column("Active")] + public bool Active { get; set; } + [Column("ActiveFrom")] + public DateTime? ActiveFrom { get; set; } + [Column("ActiveTo")] + public DateTime? ActiveTo { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Properties/AssemblyInfo.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..deb966b88 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,56 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Reflection; +using System.Runtime.InteropServices; +using NUnit.Framework; + +// 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. +[assembly: AssemblyTitle("MySql.EntityFramework.CodeFirst.Tests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Oracle")] +[assembly: AssemblyProduct("MySql.EntityFramework.CodeFirst.Tests")] +[assembly: AssemblyCopyright("Copyright © 2011, 2025, Oracle and/or its affiliates.")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("9390d98e-16dc-4846-a1bb-19487a499a34")] + +#if !DEBUG +[assembly: AssemblyKeyName("ConnectorNet")] +#endif +[assembly: NonParallelizable] diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Properties/SQLSyntax.Designer.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Properties/SQLSyntax.Designer.cs new file mode 100644 index 000000000..f96530dd5 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Properties/SQLSyntax.Designer.cs @@ -0,0 +1,383 @@ +//------------------------------------------------------------------------------ +// +// 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 MySql.EntityFramework.CodeFirst.Tests.Properties { + 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", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class SQLSyntax { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal SQLSyntax() { + } + + /// + /// 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("MySql.EntityFramework.CodeFirst.Tests.Properties.SQLSyntax", typeof(SQLSyntax).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 SELECT + ///1 AS `C1`, + ///`Project3`.`nCdSite`, + ///`Project3`.`C1` AS `C2` + ///FROM (SELECT + ///`visitante`.`nCdSite`, + ///COUNT(DISTINCT `visitante`.`sDsIp`) AS `C1` + ///FROM `visitante` + /// GROUP BY + ///`visitante`.`nCdSite`) AS `Project3`. + /// + internal static string CountGroupBy { + get { + return ResourceManager.GetString("CountGroupBy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SELECT + ///1 AS `C1`, + ///`Project3`.`nCdSite`, + ///`Project3`.`C1` AS `C2` + ///FROM (SELECT + ///`Extent4`.`nCdSite`, + ///COUNT(DISTINCT `Extent4`.`sDsIp`) AS `C1` + ///FROM `pagina` AS `Extent3` INNER JOIN `visitante` AS `Extent4` ON `Extent3`.`nCdVisitante` = `Extent4`.`nCdVisitante` + /// GROUP BY + ///`Extent4`.`nCdSite`) AS `Project3`. + /// + internal static string CountGroupBy2 { + get { + return ResourceManager.GetString("CountGroupBy2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SELECT + /// `Apply1`.`customer_id`, + /// `Extent5`.`country` + /// FROM (SELECT + /// `Extent1`.`customer_id`, + /// `Extent1`.`store_id`, + /// `Extent1`.`first_name`, + /// `Extent1`.`last_name`, + /// `Extent1`.`email`, + /// `Extent1`.`address_id`, + /// `Extent1`.`active`, + /// `Extent1`.`create_date`, + /// `Extent1`.`last_update`, + /// (SELECT + /// `Project1`.`address_id` + /// FROM `address` AS `Project1` + /// WHERE `Project1`.`address_id` = `Extent1`.`address_id` + /// ORDER BY + /// `Project1`.`address_id` DESC LIMIT 1) AS `ADDRESS [rest of string was truncated]";. + /// + internal static string FirstOrDefaultNestedWithOrderBy { + get { + return ResourceManager.GetString("FirstOrDefaultNestedWithOrderBy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SELECT + /// `Project1`.`ID`, + /// `Project1`.`Title`, + /// `Project1`.`ReleaseDate`, + /// `Project1`.`Genre`, + /// `Project1`.`Price`, + /// `Project1`.`Data`, + /// `Project1`.`Director_ID` + /// FROM `Movies` AS `Project1` + /// WHERE `Project1`.`ReleaseDate` >= @p__linq__0 + /// ORDER BY + /// `Project1`.`ReleaseDate` DESC LIMIT 2. + /// + internal static string NestedOrderBy { + get { + return ResourceManager.GetString("NestedOrderBy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SELECT + ///`Extent1`.`ID`, + ///`Extent1`.`Title`, + ///`Extent1`.`ReleaseDate`, + ///`Extent1`.`Genre`, + ///`Extent1`.`Price`, + ///`Extent1`.`Data`, + ///`Extent1`.`Director_ID` + ///FROM `Movies` AS `Extent1` + /// WHERE `Extent1`.`Title` LIKE @p__linq__0. + /// + internal static string QueryWithContains { + get { + return ResourceManager.GetString("QueryWithContains", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SELECT + ///`Extent1`.`ID`, + ///`Extent1`.`Title`, + ///`Extent1`.`ReleaseDate`, + ///`Extent1`.`Genre`, + ///`Extent1`.`Price`, + ///`Extent1`.`Data`, + ///`Extent1`.`Director_ID` + ///FROM `Movies` AS `Extent1` + /// WHERE `Extent1`.`Title` LIKE @p__linq__0. + /// + internal static string QueryWithEndsWith { + get { + return ResourceManager.GetString("QueryWithEndsWith", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SELECT + ///`Project1`.`ID`, + ///`Project1`.`Title`, + ///`Project1`.`ReleaseDate`, + ///`Project1`.`Genre`, + ///`Project1`.`Price`, + ///`Project1`.`Data`, + ///`Project1`.`Director_ID` + ///FROM `Movies` AS `Project1` + /// WHERE `Project1`.`Title` LIKE @p__linq__0 + /// ORDER BY + ///`Project1`.`ID` DESC LIMIT 10. + /// + internal static string QueryWithOrderByTakeContains { + get { + return ResourceManager.GetString("QueryWithOrderByTakeContains", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SELECT + ///`Extent1`.`ID`, + ///`Extent1`.`Title`, + ///`Extent1`.`ReleaseDate`, + ///`Extent1`.`Genre`, + ///`Extent1`.`Price`, + ///`Extent1`.`Data`, + ///`Extent1`.`Director_ID` + ///FROM `Movies` AS `Extent1` + /// WHERE `Extent1`.`Title` LIKE @p__linq__0. + /// + internal static string QueryWithStartsWith { + get { + return ResourceManager.GetString("QueryWithStartsWith", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SELECT + /// `Project2`.`customer_id`, + /// `Project2`.`store_id`, + /// `Project2`.`first_name`, + /// `Project2`.`last_name`, + /// `Project2`.`email`, + /// `Project2`.`address_id`, + /// `Project2`.`active`, + /// `Project2`.`create_date`, + /// `Project2`.`last_update` + /// FROM `customer` AS `Project2` + /// WHERE EXISTS(SELECT + /// 1 AS `C1` + /// FROM `rental` AS `Extent2` + /// WHERE (`Project2`.`customer_id` = `Extent2`.`customer_id`) AND (`Extent2`.`rental_date` < @p__linq__0)) + /// ORDER BY + /// `Project2`.`customer_id` ASC. + /// + internal static string ReplaceNameVisitorQuery { + get { + return ResourceManager.GetString("ReplaceNameVisitorQuery", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SELECT + ///`Project1`.`HarborId`, + ///`Project1`.`Description`, + ///`Project1`.`C2` AS `C1`, + ///`Project1`.`ShipId`, + ///`Project1`.`HarborId1`, + ///`Project1`.`Description1`, + ///`Project1`.`C1` AS `C2`, + ///`Project1`.`CrewMemberId`, + ///`Project1`.`ShipId1`, + ///`Project1`.`RankId`, + ///`Project1`.`ClearanceId`, + ///`Project1`.`Description2`, + ///`Project1`.`RankId1`, + ///`Project1`.`Description3`, + ///`Project1`.`ClearanceId1`, + ///`Project1`.`Description4` + ///FROM (SELECT + ///`Extent1`.`HarborId`, + ///`Extent1`.`Description`, + ///`Join3`.`Shi [rest of string was truncated]";. + /// + internal static string ShipQueryMalformedDueMultipleProjecttionsCorrectedEF6 { + get { + return ResourceManager.GetString("ShipQueryMalformedDueMultipleProjecttionsCorrectedEF6", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SELECT + /// `Extent1`.`ID`, + /// `Extent1`.`Title`, + /// `Extent1`.`ReleaseDate`, + /// `Extent1`.`Genre`, + /// `Extent1`.`Price`, + /// `Extent1`.`Data`, + /// `Extent1`.`Director_ID` + /// FROM `Movies` AS `Extent1` + /// WHERE (@gp1 IN ( @gp2 )) AND (@gp3 IS NOT NULL). + /// + internal static string TestContainsListWitConstant { + get { + return ResourceManager.GetString("TestContainsListWitConstant", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SELECT + /// `Extent1`.`ID`, + /// `Extent1`.`Title`, + /// `Extent1`.`ReleaseDate`, + /// `Extent1`.`Genre`, + /// `Extent1`.`Price`, + /// `Extent1`.`Data`, + /// `Extent1`.`Director_ID` + /// FROM `Movies` AS `Extent1` + /// WHERE (`Extent1`.`ID` IN ( 1,2,3 )) AND (`Extent1`.`ID` IS NOT NULL). + /// + internal static string TestContainsListWithCast { + get { + return ResourceManager.GetString("TestContainsListWithCast", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SELECT + ///`Extent1`.`ID`, + ///`Extent1`.`Title`, + ///`Extent1`.`ReleaseDate`, + ///`Extent1`.`Genre`, + ///`Extent1`.`Price`, + ///`Extent1`.`Data`, + ///`Extent1`.`Director_ID` + ///FROM `Movies` AS `Extent1` + /// WHERE @p__linq__0 IN ( 1,2,3 ). + /// + internal static string TestContainsListWithParameterReference { + get { + return ResourceManager.GetString("TestContainsListWithParameterReference", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SELECT + /// `Project1`.`ID` AS `C1` + /// FROM `Movies` AS `Project1` + /// WHERE (`Project1`.`ID`) = @p__linq__0 + /// ORDER BY + /// `Project1`.`ID` ASC. + /// + internal static string UnknownProjectC1 { + get { + return ResourceManager.GetString("UnknownProjectC1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SELECT + ///`Project1`.`ID` AS `C1` + ///FROM `Movies` AS `Project1` + /// WHERE (`Project1`.`ID`) = @p__linq__0 + /// ORDER BY + ///`Project1`.`ID` ASC. + /// + internal static string UnknownProjectC1EF6 { + get { + return ResourceManager.GetString("UnknownProjectC1EF6", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to UPDATE `MovieRelease2` SET `Name`='Director\'s Cut' WHERE (`Id` = 1) AND (`RowVersion` = 0); SELECT `RowVersion` FROM `MovieRelease2` WHERE row_count() = 1 and (`Id` = 1). + /// + internal static string UpdateWithSelectWithDbGeneratedLock1 { + get { + return ResourceManager.GetString("UpdateWithSelectWithDbGeneratedLock1", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to UPDATE `MovieRelease2` SET `Name`='Avengers' WHERE (`Id` = 1) AND (`RowVersion` = 1); SELECT `RowVersion` FROM `MovieRelease2` WHERE row_count() = 1 and (`Id` = 1). + /// + internal static string UpdateWithSelectWithDbGeneratedLock2 { + get { + return ResourceManager.GetString("UpdateWithSelectWithDbGeneratedLock2", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to UPDATE `MovieReleases` SET `Name`='Director\'s Cut' WHERE (`Id` = 1) AND (`Name` = 'Commercial'); SELECT `Timestamp` FROM `MovieReleases` WHERE row_count() = 1 and ((`Id` = 1) AND (`Name` = 'Director\'s Cut')). + /// + internal static string UpdateWithSelectWithNonDbGeneratedLock { + get { + return ResourceManager.GetString("UpdateWithSelectWithNonDbGeneratedLock", resourceCulture); + } + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Properties/SQLSyntax.resx b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Properties/SQLSyntax.resx new file mode 100644 index 000000000..1b18232db --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Properties/SQLSyntax.resx @@ -0,0 +1,385 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + SELECT +1 AS `C1`, +`Project3`.`nCdSite`, +`Project3`.`C1` AS `C2` +FROM (SELECT +`visitante`.`nCdSite`, +COUNT(DISTINCT `visitante`.`sDsIp`) AS `C1` +FROM `visitante` + GROUP BY +`visitante`.`nCdSite`) AS `Project3` + + + SELECT +1 AS `C1`, +`Project3`.`nCdSite`, +`Project3`.`C1` AS `C2` +FROM (SELECT +`Extent4`.`nCdSite`, +COUNT(DISTINCT `Extent4`.`sDsIp`) AS `C1` +FROM `pagina` AS `Extent3` INNER JOIN `visitante` AS `Extent4` ON `Extent3`.`nCdVisitante` = `Extent4`.`nCdVisitante` + GROUP BY +`Extent4`.`nCdSite`) AS `Project3` + + + SELECT + `Project1`.`ID`, + `Project1`.`Title`, + `Project1`.`ReleaseDate`, + `Project1`.`Genre`, + `Project1`.`Price`, + `Project1`.`Data`, + `Project1`.`Director_ID` + FROM `Movies` AS `Project1` + WHERE `Project1`.`ReleaseDate` >= @p__linq__0 + ORDER BY + `Project1`.`ReleaseDate` DESC LIMIT 2 + + + SELECT +`Project1`.`ID`, +`Project1`.`Title`, +`Project1`.`ReleaseDate`, +`Project1`.`Genre`, +`Project1`.`Price`, +`Project1`.`Data`, +`Project1`.`Director_ID` +FROM `Movies` AS `Project1` + WHERE `Project1`.`Title` LIKE @p__linq__0 + ORDER BY +`Project1`.`ID` DESC LIMIT 10 + + + SELECT +`Project1`.`HarborId`, +`Project1`.`Description`, +`Project1`.`C2` AS `C1`, +`Project1`.`ShipId`, +`Project1`.`HarborId1`, +`Project1`.`Description1`, +`Project1`.`C1` AS `C2`, +`Project1`.`CrewMemberId`, +`Project1`.`ShipId1`, +`Project1`.`RankId`, +`Project1`.`ClearanceId`, +`Project1`.`Description2`, +`Project1`.`RankId1`, +`Project1`.`Description3`, +`Project1`.`ClearanceId1`, +`Project1`.`Description4` +FROM (SELECT +`Extent1`.`HarborId`, +`Extent1`.`Description`, +`Join3`.`ShipId`, +`Join3`.`HarborId` AS `HarborId1`, +`Join3`.`Description` AS `Description1`, +`Join3`.`CrewMemberId`, +`Join3`.`SHIPID1` AS `ShipId1`, +`Join3`.`RankId`, +`Join3`.`ClearanceId`, +`Join3`.`DESCRIPTION1` AS `Description2`, +`Join3`.`RANKID1` AS `RankId1`, +`Join3`.`DESCRIPTION11` AS `Description3`, +`Join3`.`CLEARANCEID1` AS `ClearanceId1`, +`Join3`.`DESCRIPTION2` AS `Description4`, +CASE WHEN (`Join3`.`ShipId` IS NULL) THEN (NULL) WHEN (`Join3`.`CrewMemberId` IS NULL) THEN (NULL) ELSE (1) END AS `C1`, +CASE WHEN (`Join3`.`ShipId` IS NOT NULL) THEN (1) ELSE (NULL) END AS `C2` +FROM `Harbors` AS `Extent1` LEFT OUTER JOIN (SELECT +`Extent2`.`ShipId`, +`Extent2`.`HarborId`, +`Extent2`.`Description`, +`Join2`.`CrewMemberId`, +`Join2`.`ShipId` AS `SHIPID1`, +`Join2`.`RankId`, +`Join2`.`ClearanceId`, +`Join2`.`Description` AS `DESCRIPTION1`, +`Join2`.`RANKID1`, +`Join2`.`DESCRIPTION1` AS `DESCRIPTION11`, +`Join2`.`CLEARANCEID1`, +`Join2`.`DESCRIPTION2` +FROM `Ships` AS `Extent2` LEFT OUTER JOIN (SELECT +`Extent3`.`CrewMemberId`, +`Extent3`.`ShipId`, +`Extent3`.`RankId`, +`Extent3`.`ClearanceId`, +`Extent3`.`Description`, +`Extent4`.`RankId` AS `RANKID1`, +`Extent4`.`Description` AS `DESCRIPTION1`, +`Extent5`.`ClearanceId` AS `CLEARANCEID1`, +`Extent5`.`Description` AS `DESCRIPTION2` +FROM `CrewMembers` AS `Extent3` INNER JOIN `Ranks` AS `Extent4` ON `Extent3`.`RankId` = `Extent4`.`RankId` INNER JOIN `Clearances` AS `Extent5` ON `Extent3`.`ClearanceId` = `Extent5`.`ClearanceId`) AS `Join2` ON `Extent2`.`ShipId` = `Join2`.`ShipId`) AS `Join3` ON `Extent1`.`HarborId` = `Join3`.`HarborId`) AS `Project1` + ORDER BY +`Project1`.`HarborId` ASC, +`Project1`.`C2` ASC, +`Project1`.`ShipId` ASC, +`Project1`.`C1` ASC + + + SELECT + `Project1`.`ID` AS `C1` + FROM `Movies` AS `Project1` + WHERE (`Project1`.`ID`) = @p__linq__0 + ORDER BY + `Project1`.`ID` ASC + + + SELECT +`Project1`.`ID` AS `C1` +FROM `Movies` AS `Project1` + WHERE (`Project1`.`ID`) = @p__linq__0 + ORDER BY +`Project1`.`ID` ASC + + + SELECT +`Extent1`.`ID`, +`Extent1`.`Title`, +`Extent1`.`ReleaseDate`, +`Extent1`.`Genre`, +`Extent1`.`Price`, +`Extent1`.`Data`, +`Extent1`.`Director_ID` +FROM `Movies` AS `Extent1` + WHERE `Extent1`.`Title` LIKE @p__linq__0 + + + SELECT +`Extent1`.`ID`, +`Extent1`.`Title`, +`Extent1`.`ReleaseDate`, +`Extent1`.`Genre`, +`Extent1`.`Price`, +`Extent1`.`Data`, +`Extent1`.`Director_ID` +FROM `Movies` AS `Extent1` + WHERE `Extent1`.`Title` LIKE @p__linq__0 + + + SELECT +`Extent1`.`ID`, +`Extent1`.`Title`, +`Extent1`.`ReleaseDate`, +`Extent1`.`Genre`, +`Extent1`.`Price`, +`Extent1`.`Data`, +`Extent1`.`Director_ID` +FROM `Movies` AS `Extent1` + WHERE `Extent1`.`Title` LIKE @p__linq__0 + + + SELECT + `Extent1`.`ID`, + `Extent1`.`Title`, + `Extent1`.`ReleaseDate`, + `Extent1`.`Genre`, + `Extent1`.`Price`, + `Extent1`.`Data`, + `Extent1`.`Director_ID` + FROM `Movies` AS `Extent1` + WHERE (@gp1 IN ( @gp2 )) AND (@gp3 IS NOT NULL) + + + SELECT + `Extent1`.`ID`, + `Extent1`.`Title`, + `Extent1`.`ReleaseDate`, + `Extent1`.`Genre`, + `Extent1`.`Price`, + `Extent1`.`Data`, + `Extent1`.`Director_ID` + FROM `Movies` AS `Extent1` + WHERE (`Extent1`.`ID` IN ( 1,2,3 )) AND (`Extent1`.`ID` IS NOT NULL) + + + SELECT +`Extent1`.`ID`, +`Extent1`.`Title`, +`Extent1`.`ReleaseDate`, +`Extent1`.`Genre`, +`Extent1`.`Price`, +`Extent1`.`Data`, +`Extent1`.`Director_ID` +FROM `Movies` AS `Extent1` + WHERE @p__linq__0 IN ( 1,2,3 ) + + + SELECT + `Apply1`.`customer_id`, + `Extent5`.`country` + FROM (SELECT + `Extent1`.`customer_id`, + `Extent1`.`store_id`, + `Extent1`.`first_name`, + `Extent1`.`last_name`, + `Extent1`.`email`, + `Extent1`.`address_id`, + `Extent1`.`active`, + `Extent1`.`create_date`, + `Extent1`.`last_update`, + (SELECT + `Project1`.`address_id` + FROM `address` AS `Project1` + WHERE `Project1`.`address_id` = `Extent1`.`address_id` + ORDER BY + `Project1`.`address_id` DESC LIMIT 1) AS `ADDRESS_ID1`, + (SELECT + `Project1`.`city_id` + FROM `address` AS `Project1` + WHERE `Project1`.`address_id` = `Extent1`.`address_id` + ORDER BY + `Project1`.`address_id` DESC LIMIT 1) AS `city_id` + FROM `customer` AS `Extent1`) AS `Apply1` INNER JOIN `store` AS `Extent3` ON `Apply1`.`store_id` = + `Extent3`.`store_id` LEFT OUTER JOIN `city` AS `Extent4` ON `Apply1`.`city_id` = `Extent4`.`city_id` + LEFT OUTER JOIN `country` AS `Extent5` ON `Extent4`.`country_id` = `Extent5`.`country_id` + ORDER BY + `Apply1`.`customer_id` DESC + + + SELECT + `Project2`.`customer_id`, + `Project2`.`store_id`, + `Project2`.`first_name`, + `Project2`.`last_name`, + `Project2`.`email`, + `Project2`.`address_id`, + `Project2`.`active`, + `Project2`.`create_date`, + `Project2`.`last_update` + FROM `customer` AS `Project2` + WHERE EXISTS(SELECT + 1 AS `C1` + FROM `rental` AS `Extent2` + WHERE (`Project2`.`customer_id` = `Extent2`.`customer_id`) AND (`Extent2`.`rental_date` < @p__linq__0)) + ORDER BY + `Project2`.`customer_id` ASC + + + UPDATE `MovieRelease2` SET `Name`='Director\'s Cut' WHERE (`Id` = 1) AND (`RowVersion` = 0); SELECT `RowVersion` FROM `MovieRelease2` WHERE row_count() = 1 and (`Id` = 1) + + + UPDATE `MovieRelease2` SET `Name`='Avengers' WHERE (`Id` = 1) AND (`RowVersion` = 1); SELECT `RowVersion` FROM `MovieRelease2` WHERE row_count() = 1 and (`Id` = 1) + + + UPDATE `MovieReleases` SET `Name`='Director\'s Cut' WHERE (`Id` = 1) AND (`Name` = 'Commercial'); SELECT `Timestamp` FROM `MovieReleases` WHERE row_count() = 1 and ((`Id` = 1) AND (`Name` = 'Director\'s Cut')) + + \ No newline at end of file diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Properties/sakila-data.sql b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Properties/sakila-data.sql new file mode 100644 index 000000000..8d8cf971f --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Properties/sakila-data.sql @@ -0,0 +1,46430 @@ +-- Sakila Sample Database Data +-- Version 1.0 + +-- Copyright © 2006, 2025, Oracle and/or its affiliates. + +-- 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 Oracle 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,'','',/*!50705 0x0000000001010000003E0A325D63345CC0761FDB8D99D94840,*/'2014-09-25 22:30:27'), +(2,'28 MySQL Boulevard',NULL,'QLD',576,'','',/*!50705 0x0000000001010000008E10D4DF812463404EE08C5022A23BC0,*/'2014-09-25 22:30:09'), +(3,'23 Workhaven Lane',NULL,'Alberta',300,'','14033335568',/*!50705 0x000000000101000000CDC4196863345CC01DEE7E7099D94840,*/'2014-09-25 22:30:27'), +(4,'1411 Lillydale Drive',NULL,'QLD',576,'','6172235589',/*!50705 0x0000000001010000005B0DE4341F26634042D6AE6422A23BC0,*/'2014-09-25 22:30:09'), +(5,'1913 Hanoi Way','','Nagasaki',463,'35200','28303384290',/*!50705 0x00000000010100000028D1370E21376040ABB58BC45F944040,*/'2014-09-25 22:31:53'), +(6,'1121 Loja Avenue','','California',449,'17886','838635286649',/*!50705 0x0000000001010000003C94579D8B525DC0E860472DDE0D4140,*/'2014-09-25 22:34:01'), +(7,'692 Joliet Street','','Attika',38,'83579','448477190408',/*!50705 0x000000000101000000076F59CF5AB737404105D1A45EFD4240,*/'2014-09-25 22:31:07'), +(8,'1566 Inegl Manor','','Mandalay',349,'53561','705814003527',/*!50705 0x00000000010100000006240626DCD857403C45B357C4753540,*/'2014-09-25 22:32:18'), +(9,'53 Idfu Parkway','','Nantou',361,'42399','10655648674',/*!50705 0x0000000001010000001F813FFC7C2A5E40357A354069EA3740,*/'2014-09-25 22:33:16'), +(10,'1795 Santiago de Compostela Way','','Texas',295,'18743','860452626434',/*!50705 0x00000000010100000050502F9D7BE058C0D0CF7932A4813B40,*/'2014-09-25 22:33:55'), +(11,'900 Santiago de Compostela Parkway','','Central Serbia',280,'93896','716571220373',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:34:11'), +(12,'478 Joliet Way','','Hamilton',200,'77948','657282285970',/*!50705 0x000000000101000000DC84D61E11E9654072B7353344E442C0,*/'2014-09-25 22:32:22'), +(13,'613 Korolev Drive','','Masqat',329,'45844','380657522649',/*!50705 0x00000000010100000001023164D04B4D40CEAC003A279D3740,*/'2014-09-25 22:32:29'), +(14,'1531 Sal Drive','','Esfahan',162,'53628','648856936185',/*!50705 0x000000000101000000DE0951195AD64940635A400D84534040,*/'2014-09-25 22:31:36'), +(15,'1542 Tarlac Parkway','','Kanagawa',440,'1027','635297277345',/*!50705 0x000000000101000000B4CDE8A27C6B61406B7D361724C74140,*/'2014-09-25 22:31:53'), +(16,'808 Bhopal Manor','','Haryana',582,'10672','465887807014',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:30'), +(17,'270 Amroha Parkway','','Osmaniye',384,'29610','695479687538',/*!50705 0x0000000001010000001F436C55B71F4240A11408967E894240,*/'2014-09-25 22:33:27'), +(18,'770 Bydgoszcz Avenue','','California',120,'16266','517338314235',/*!50705 0x0000000001010000006D63A2F7FC515EC04C040539835A4340,*/'2014-09-25 22:33:47'), +(19,'419 Iligan Lane','','Madhya Pradesh',76,'72878','990911107354',/*!50705 0x000000000101000000B7B01303C9595340E6F10FB633413740,*/'2014-09-25 22:31:13'), +(20,'360 Toulouse Parkway','','England',495,'54308','949312333307',/*!50705 0x000000000101000000860FDBCCD7DBE63FFDCFAB4BD7C44940,*/'2014-09-25 22:33:40'), +(21,'270 Toulon Boulevard','','Kalmykia',156,'81766','407752414682',/*!50705 0x000000000101000000FD0BA947BF204640316D495865274740,*/'2014-09-25 22:32:48'), +(22,'320 Brest Avenue','','Kaduna',252,'43331','747791594069',/*!50705 0x0000000001010000006D3425FECDC01D40623FD532630B2540,*/'2014-09-25 22:32:25'), +(23,'1417 Lancaster Avenue','','Northern Cape',267,'72192','272572357893',/*!50705 0x000000000101000000FEE8E5C127C338404DED56E075BB3CC0,*/'2014-09-25 22:33:03'), +(24,'1688 Okara Way','','Nothwest Border Prov',327,'21954','144453869132',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:30'), +(25,'262 A Corua (La Corua) Parkway','','Dhaka',525,'34418','892775750063',/*!50705 0x000000000101000000F13790E4A87A5640E7F6370DF63F3840,*/'2014-09-25 22:30:12'), +(26,'28 Charlotte Amalie Street','','Rabat-Sal-Zammour-Z',443,'37551','161968374323',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:16'), +(27,'1780 Hino Boulevard','','Liepaja',303,'7716','902731229323',/*!50705 0x000000000101000000360F1604450435403CA3AD4A22424C40,*/'2014-09-25 22:31:58'), +(28,'96 Tafuna Way','','Crdoba',128,'99865','934730187245',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:05'), +(29,'934 San Felipe de Puerto Plata Street','','Sind',472,'99780','196495945706',/*!50705 0x0000000001010000008E6B8D52D3285140D58E876302F53B40,*/'2014-09-25 22:32:31'), +(30,'18 Duisburg Boulevard','','',121,'58327','998009777982',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:08'), +(31,'217 Botshabelo Place','','Southern Mindanao',138,'49521','665356572025',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:36'), +(32,'1425 Shikarpur Manor','','Bihar',346,'65599','678220867005',/*!50705 0x0000000001010000007F9F16284E9E55408201840F25603940,*/'2014-09-25 22:31:20'), +(33,'786 Aurora Avenue','','Yamaguchi',474,'65750','18461860151',/*!50705 0x000000000101000000E712584AA05E6040D15735ADB9FA4040,*/'2014-09-25 22:31:53'), +(34,'1668 Anpolis Street','','Taipei',316,'50199','525255540978',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:15'), +(35,'33 Gorontalo Way','','West Bengali',257,'30348','745994947458',/*!50705 0x0000000001010000001A828879FB17564061585936CEAB3640,*/'2014-09-25 22:31:18'), +(36,'176 Mandaluyong Place','','Uttar Pradesh',239,'65213','627705991774',/*!50705 0x00000000010100000073309B0043A553409E3AA0B657743940,*/'2014-09-25 22:31:17'), +(37,'127 Purnea (Purnia) Manor','','Piemonte',17,'79388','911872220378',/*!50705 0x0000000001010000002A2B97D75B382140F2892B1D62744640,*/'2014-09-25 22:31:42'), +(38,'61 Tama Street','','Okayama',284,'94065','708403338270',/*!50705 0x0000000001010000001F7013A488B86040670696C8AA4A4140,*/'2014-09-25 22:31:49'), +(39,'391 Callao Drive','','Midi-Pyrnes',544,'34021','440512153169',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:01'), +(40,'334 Munger (Monghyr) Lane','','Markazi',31,'38145','481183273622',/*!50705 0x000000000101000000737275B636D848404B958334BE0B4140,*/'2014-09-25 22:31:36'), +(41,'1440 Fukuyama Loop','','Henan',362,'47929','912257250465',/*!50705 0x0000000001010000005E3CCD1319225C405886DD1C537F4040,*/'2014-09-25 22:30:40'), +(42,'269 Cam Ranh Parkway','','Chisinau',115,'34689','489783829737',/*!50705 0x000000000101000000AD97F0958ADB3C40CCD47F31B6804740,*/'2014-09-25 22:32:15'), +(43,'306 Antofagasta Place','','Esprito Santo',569,'3989','378318851631',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:23'), +(44,'671 Graz Street','','Oriental',353,'94399','680768868518',/*!50705 0x00000000010100000083F7FAFFDD7707C0F7B7BA5285954140,*/'2014-09-25 22:32:16'), +(45,'42 Brindisi Place','','Yerevan',586,'16744','42384721397',/*!50705 0x000000000101000000281BC528BE4146403BD400EF2E174440,*/'2014-09-25 22:30:08'), +(46,'1632 Bislig Avenue','','Nonthaburi',394,'61117','471675840679',/*!50705 0x000000000101000000935C59FDEC1F5940D5D0611976D32B40,*/'2014-09-25 22:33:20'), +(47,'1447 Imus Way','','Tahiti',167,'48942','539758313890',/*!50705 0x00000000010100000090CE0A56E6B562C059BB9289008E31C0,*/'2014-09-25 22:31:02'), +(48,'1998 Halifax Drive','','Lipetsk',308,'76022','177727722820',/*!50705 0x00000000010100000087985CD60EC943409F1738EA324D4A40,*/'2014-09-25 22:32:54'), +(49,'1718 Valencia Street','','Antofagasta',27,'37359','675292816413',/*!50705 0x0000000001010000007E82D5A24F9951C0C46B4DA901A737C0,*/'2014-09-25 22:30:29'), +(50,'46 Pjatigorsk Lane','','Moscow (City)',343,'23616','262076994845',/*!50705 0x0000000001010000009C51F355F2C4424002E3CFA6D9DF4B40,*/'2014-09-25 22:32:55'), +(51,'686 Garland Manor','','Cear',247,'52535','69493378813',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:19'), +(52,'909 Garland Manor','','Tatarstan',367,'69367','705800322606',/*!50705 0x000000000101000000376DC66988E949402CA85E6D7BD14B40,*/'2014-09-25 22:32:55'), +(53,'725 Isesaki Place','','Mekka',237,'74428','876295323994',/*!50705 0x000000000101000000213361455799434061EB0896D98A3540,*/'2014-09-25 22:33:00'), +(54,'115 Hidalgo Parkway','','Khartum',379,'80168','307703950263',/*!50705 0x00000000010100000004503173263D40404D0DD9E5004A2F40,*/'2014-09-25 22:33:11'), +(55,'1135 Izumisano Parkway','','California',171,'48150','171822533480',/*!50705 0x0000000001010000009763C3E4D75B5DC0799A2732CE0B4140,*/'2014-09-25 22:33:50'), +(56,'939 Probolinggo Loop','','Galicia',1,'4166','680428310138',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:08'), +(57,'17 Kabul Boulevard','','Chiba',355,'38594','697760867968',/*!50705 0x000000000101000000EB257CA5E27C61406F70D86C9BED4140,*/'2014-09-25 22:31:51'), +(58,'1964 Allappuzha (Alleppey) Street','','Yamaguchi',227,'48980','920811325222',/*!50705 0x000000000101000000C2572A5E1B876040D19A7A38DC144140,*/'2014-09-25 22:31:47'), +(59,'1697 Kowloon and New Kowloon Loop','','Moskova',49,'57807','499352017190',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:47'), +(60,'1668 Saint Louis Place','','Tahiti',397,'39072','347487831378',/*!50705 0x0000000001010000006FF3C64921B262C0F8F47DDD8E8931C0,*/'2014-09-25 22:31:02'), +(61,'943 Tokat Street','','Vaduz',560,'45428','889318963672',/*!50705 0x0000000001010000007F784C93080B23400341800C1D924740,*/'2014-09-25 22:31:58'), +(62,'1114 Liepaja Street','','Sarawak',282,'69226','212869228936',/*!50705 0x000000000101000000047FAE6C55955B408285DDC199E9F83F,*/'2014-09-25 22:32:00'), +(63,'1213 Ranchi Parkway','','Karnataka',350,'94352','800024380485',/*!50705 0x000000000101000000000080279AD7C641AA21BB1CC0202B40,*/'2014-09-25 22:31:21'), +(64,'81 Hodeida Way','','Rajasthan',231,'55561','250767749542',/*!50705 0x0000000001010000000A09BDA36BF25240F8B138526CEB3A40,*/'2014-09-25 22:31:17'), +(65,'915 Ponce Place','','Basel-Stadt',56,'83980','1395251317',/*!50705 0x0000000001010000000D6146C2084B1E40E58B07A579C74740,*/'2014-09-25 22:33:12'), +(66,'1717 Guadalajara Lane','','Missouri',441,'85505','914090181665',/*!50705 0x000000000101000000A926D247AA8C56C0A456F3774A504340,*/'2014-09-25 22:33:59'), +(67,'1214 Hanoi Way','','Nebraska',306,'67055','491001136577',/*!50705 0x000000000101000000D6671888AF2A58C0C0E2152DE5684440,*/'2014-09-25 22:33:56'), +(68,'1966 Amroha Avenue','','Sichuan',139,'70385','333489324603',/*!50705 0x0000000001010000000A7778190FE05A402F6013E346373F40,*/'2014-09-25 22:30:32'), +(69,'698 Otsu Street','','Cayenne',105,'71110','409983924481',/*!50705 0x000000000101000000D879C0E1AA2A4AC0D57EC6E0BCBB1340,*/'2014-09-25 22:31:02'), +(70,'1150 Kimchon Manor','','Skne ln',321,'96109','663449333709',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:11'), +(71,'1586 Guaruj Place','','Hunan',579,'5135','947233365992',/*!50705 0x000000000101000000AD3A06BFE83F5C4083047B0217DA3B40,*/'2014-09-25 22:30:46'), +(72,'57 Arlington Manor','','Madhya Pradesh',475,'48960','990214419142',/*!50705 0x0000000001010000008E6D63FDB069534027D9EA724A6E3940,*/'2014-09-25 22:31:27'), +(73,'1031 Daugavpils Parkway','','Bchar',63,'59025','107137400143',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:29:59'), +(74,'1124 Buenaventura Drive','','Mekka',13,'6856','407733804223',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:59'), +(75,'492 Cam Ranh Street','','Eastern Visayas',61,'50805','565018274456',/*!50705 0x0000000001010000007500C45D3D335F40B90265AE675B2540,*/'2014-09-25 22:32:34'), +(76,'89 Allappuzha (Alleppey) Manor','','National Capital Reg',517,'75444','255800440636',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:39'), +(77,'1947 Poos de Caldas Boulevard','','Chiayi',114,'60951','427454485876',/*!50705 0x0000000001010000002F06C54524195E40B4475E8C37763740,*/'2014-09-25 22:33:14'), +(78,'1206 Dos Quebradas Place','','So Paulo',431,'20207','241832790687',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:21'), +(79,'1551 Rampur Lane','','Changhwa',108,'72394','251164340471',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:14'), +(80,'602 Paarl Street','','Pavlodar',402,'98889','896314772871',/*!50705 0x000000000101000000359078C34740534032D010E912234A40,*/'2014-09-25 22:31:55'), +(81,'1692 Ede Loop','','So Paulo',30,'9223','918711376618',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:16'), +(82,'936 Salzburg Lane','','Uttar Pradesh',425,'96709','875756771675',/*!50705 0x0000000001010000000C0EE5FAAD4F5440CBF8F71917383A40,*/'2014-09-25 22:31:24'), +(83,'586 Tete Way','','Kanagawa',256,'1079','18581624103',/*!50705 0x000000000101000000783B0CF79B716140E96D22E989A74140,*/'2014-09-25 22:31:48'), +(84,'1888 Kabul Drive','','Oyo & Osun',217,'20936','701457319790',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:24'), +(85,'320 Baiyin Parkway','','Mahajanga',319,'37307','223664661973',/*!50705 0x000000000101000000EAFD90C888284740CDC75AE8EF6E2FC0,*/'2014-09-25 22:31:59'), +(86,'927 Baha Blanca Parkway','','Krim',479,'9495','821972242086',/*!50705 0x000000000101000000417DCB9C2E0E4140BC29406F857A4640,*/'2014-09-25 22:33:33'), +(87,'929 Tallahassee Loop','','Gauteng',497,'74671','800716535041',/*!50705 0x000000000101000000647F8FB05E6B3C407F60D8ABD9403AC0,*/'2014-09-25 22:33:06'), +(88,'125 Citt del Vaticano Boulevard','','Puebla',40,'67912','48417642933',/*!50705 0x000000000101000000536232B0E99B58C03D0D18247DE83240,*/'2014-09-25 22:32:02'), +(89,'1557 Ktahya Boulevard','','England',88,'88002','720998247660',/*!50705 0x0000000001010000001B43A5B67908FCBF439D03159FE54A40,*/'2014-09-25 22:33:36'), +(90,'870 Ashqelon Loop','','Songkhla',489,'84931','135117278909',/*!50705 0x000000000101000000E82510C017265940115A6A1899CB1C40,*/'2014-09-25 22:33:20'), +(91,'1740 Portoviejo Avenue','','Sucre',480,'29932','198123170793',/*!50705 0x000000000101000000C4AD275F75D952C07A51BB5F059C2240,*/'2014-09-25 22:30:53'), +(92,'1942 Ciparay Parkway','','Cheju',113,'82624','978987363654',/*!50705 0x00000000010100000048F13B97F3A25F40358EA2186AB34040,*/'2014-09-25 22:33:06'), +(93,'1926 El Alto Avenue','','Buenos Aires',289,'75543','846225459260',/*!50705 0x000000000101000000AD05AC0B2EFA4CC0C5D0A057F27541C0,*/'2014-09-25 22:30:05'), +(94,'1952 Chatsworth Drive','','Guangdong',332,'25958','991562402283',/*!50705 0x000000000101000000A5F386A08F085D406DF65157885A3840,*/'2014-09-25 22:30:40'), +(95,'1370 Le Mans Avenue','','Brunei and Muara',53,'52163','345679835036',/*!50705 0x00000000010100000013E85D06ADBC5C402A0E5652DDC21340,*/'2014-09-25 22:30:23'), +(96,'984 Effon-Alaiye Avenue','','Gois',183,'17119','132986892228',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:17'), +(97,'832 Nakhon Sawan Manor','','Inner Mongolia',592,'49021','275595571388',/*!50705 0x000000000101000000535C55F6DDAD5E400000001D69FABC41,*/'2014-09-25 22:30:50'), +(98,'152 Kitwe Parkway','','Caraga',82,'53182','835433605312',/*!50705 0x000000000101000000DF652BD43F945F4006CAB788396E2040,*/'2014-09-25 22:32:35'), +(99,'1697 Tanauan Lane','','Punjab',399,'22870','4764773857',/*!50705 0x000000000101000000CA97063447E95240B933B852742A4040,*/'2014-09-25 22:31:22'), +(100,'1308 Arecibo Way','','Georgia',41,'30695','6171054059',/*!50705 0x000000000101000000FC00FFEF637E54C0BD9EF9E648BC4040,*/'2014-09-25 22:33:43'), +(101,'1599 Plock Drive','','Tete',534,'71986','817248913162',/*!50705 0x000000000101000000DC77561C18CB4040B443577D092830C0,*/'2014-09-25 22:32:18'), +(102,'669 Firozabad Loop','','Abu Dhabi',12,'92265','412903167998',/*!50705 0x0000000001010000009C76E73F5AE14B404AD05FE811313840,*/'2014-09-25 22:33:35'), +(103,'588 Vila Velha Manor','','Kyongsangbuk',268,'51540','333339908719',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:07'), +(104,'1913 Kamakura Place','','Lipetsk',238,'97287','942570536750',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:49'), +(105,'733 Mandaluyong Place','','Asir',2,'77459','196568435814',/*!50705 0x0000000001010000007823980FAD404540798FD89365373240,*/'2014-09-25 22:32:59'), +(106,'659 Vaduz Drive','','Ha Darom',34,'49708','709935135487',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:40'), +(107,'1177 Jelets Way','','Kwara & Kogi',220,'3305','484292626944',/*!50705 0x0000000001010000001767672CF53712407E3E25427E192140,*/'2014-09-25 22:32:24'), +(108,'1386 Yangor Avenue','','Provence-Alpes-Cte',543,'80720','449216226468',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:01'), +(109,'454 Nakhon Sawan Boulevard','','Funafuti',173,'76383','963887147572',/*!50705 0x0000000001010000005822ABB636666640FF74A84B6B0C21C0,*/'2014-09-25 22:33:31'), +(110,'1867 San Juan Bautista Tuxtepec Avenue','','Ivanovo',225,'78311','547003310357',/*!50705 0x000000000101000000BC6DF0CF567C4440E2B034F0A37F4C40,*/'2014-09-25 22:32:48'), +(111,'1532 Dzerzinsk Way','','Buenos Aires',334,'9599','330838016880',/*!50705 0x000000000101000000BF93BB74385D4DC0E207420D3A5541C0,*/'2014-09-25 22:30:06'), +(112,'1002 Ahmadnagar Manor','','Mxico',213,'93026','371490777743',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:07'), +(113,'682 Junan Way','','North West',273,'30418','622255216127',/*!50705 0x000000000101000000714683CAAEAA3A406AEDC73725DA3AC0,*/'2014-09-25 22:33:04'), +(114,'804 Elista Drive','','Hubei',159,'61069','379804592943',/*!50705 0x0000000001010000009E013FF4EE5E5B40E7E099D0245F3E40,*/'2014-09-25 22:30:33'), +(115,'1378 Alvorada Avenue','','Distrito Federal',102,'75834','272234298332',/*!50705 0x0000000001010000000C3444BA44B850C047B1378CDDF92440,*/'2014-09-25 22:34:03'), +(116,'793 Cam Ranh Avenue','','California',292,'87057','824370924746',/*!50705 0x00000000010100000003AF3B82C0885DC0610212A859594140,*/'2014-09-25 22:33:55'), +(117,'1079 Tel Aviv-Jaffa Boulevard','','Sucre',132,'10885','358178933857',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:34:04'), +(118,'442 Rae Bareli Place','','Nordrhein-Westfalen',148,'24321','886636413768',/*!50705 0x000000000101000000C19EC085860F1B40E37ED12F5BB74940,*/'2014-09-25 22:31:04'), +(119,'1107 Nakhon Sawan Avenue','','Mxico',365,'75149','867546627903',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:11'), +(120,'544 Malm Parkway','','Central Java',403,'63502','386759646229',/*!50705 0x0000000001010000003AEF5A9D77575B4026F103A106C51BC0,*/'2014-09-25 22:31:34'), +(121,'1967 Sincelejo Place','','Gujarat',176,'73644','577812616052',/*!50705 0x00000000010100000059912CBBBB2B52408DBC074378373740,*/'2014-09-25 22:31:16'), +(122,'333 Goinia Way','','Texas',185,'78625','909029256431',/*!50705 0x0000000001010000002AE67BA1DB3F58C0E46B2AE67B5F4040,*/'2014-09-25 22:33:51'), +(123,'1987 Coacalco de Berriozbal Loop','','al-Qalyubiya',476,'96065','787654415858',/*!50705 0x000000000101000000595AFC5C23403F40AFBA698E07203E40,*/'2014-09-25 22:30:58'), +(124,'241 Mosul Lane','','Risaralda',147,'76157','765345144779',/*!50705 0x000000000101000000983A23A5B4EA52C06155BDFC4E5B1340,*/'2014-09-25 22:30:52'), +(125,'211 Chiayi Drive','','Uttar Pradesh',164,'58186','665993880048',/*!50705 0x000000000101000000A44BA4D961C1534007F247AC20C73A40,*/'2014-09-25 22:31:15'), +(126,'1175 Tanauan Way','','Lima',305,'64615','937222955822',/*!50705 0x000000000101000000848A60D2CE4153C0E5417A8A1C1628C0,*/'2014-09-25 22:32:33'), +(127,'117 Boa Vista Way','','Uttar Pradesh',566,'6804','677976133614',/*!50705 0x00000000010100000085364AA8AAC0544086BAFE1312513940,*/'2014-09-25 22:31:29'), +(128,'848 Tafuna Manor','','Ktahya',281,'45142','614935229095',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:27'), +(129,'569 Baicheng Lane','','Gauteng',85,'60304','490211944645',/*!50705 0x000000000101000000D71E51FC73423C4048AE51C543363AC0,*/'2014-09-25 22:33:02'), +(130,'1666 Qomsheh Drive','','So Paulo',410,'66255','582835362905',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:20'), +(131,'801 Hagonoy Drive','','Smolensk',484,'8439','237426099212',/*!50705 0x0000000001010000001EB814A122054040BB8509FE12644B40,*/'2014-09-25 22:32:57'), +(132,'1050 Garden Grove Avenue','','Slaskie',236,'4999','973047364353',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:42'), +(133,'1854 Tieli Street','','Shandong',302,'15819','509492324775',/*!50705 0x0000000001010000007A820E0492FE5C408F0475255D3A4240,*/'2014-09-25 22:30:39'), +(134,'758 Junan Lane','','Gois',190,'82639','935448624185',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:18'), +(135,'1752 So Leopoldo Parkway','','Taka-Karpatia',345,'14014','252265130067',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:32'), +(136,'898 Belm Manor','','Free State',87,'49757','707169393853',/*!50705 0x000000000101000000ED4CFCAC8DB43A409EAC623B29453DC0,*/'2014-09-25 22:33:02'), +(137,'261 Saint Louis Way','','Coahuila de Zaragoza',541,'83401','321944036800',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:13'), +(138,'765 Southampton Drive','','al-Qalyubiya',421,'4285','23712411567',/*!50705 0x0000000001010000001BEB877DA7343F409FBC7E77E12D3E40,*/'2014-09-25 22:30:57'), +(139,'943 Johannesburg Avenue','','Maharashtra',417,'5892','90921003005',/*!50705 0x000000000101000000F27A3029BE7652405E2ADB2C03853240,*/'2014-09-25 22:31:24'), +(140,'788 Atinsk Street','','Karnataka',211,'81691','146497509724',/*!50705 0x0000000001010000000000801B1998C64157A945E977E62E40,*/'2014-09-25 22:31:17'), +(141,'1749 Daxian Place','','Gelderland',29,'11044','963369996279',/*!50705 0x000000000101000000E4CE96BDB6E0174000B0952B171C4A40,*/'2014-09-25 22:32:20'), +(142,'1587 Sullana Lane','','Inner Mongolia',207,'85769','468060467018',/*!50705 0x000000000101000000870CF505BEE95B407422669BC0674440,*/'2014-09-25 22:30:35'), +(143,'1029 Dzerzinsk Manor','','Ynlin',542,'57519','33173584456',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:16'), +(144,'1666 Beni-Mellal Place','','Tennessee',123,'13377','9099941466',/*!50705 0x00000000010100000005D1A45E01D755C084CCDFCECF434240,*/'2014-09-25 22:33:48'), +(145,'928 Jaffna Loop','','Hiroshima',172,'93762','581852137991',/*!50705 0x0000000001010000002F2988CBBBAB6040E2FF33EFDD3D4140,*/'2014-09-25 22:31:45'), +(146,'483 Ljubertsy Parkway','','Scotland',149,'60562','581174211853',/*!50705 0x000000000101000000C53E5CCD95CC07C0FAFD518A0C3C4C40,*/'2014-09-25 22:33:36'), +(147,'374 Bat Yam Boulevard','','Kilis',266,'97700','923261616249',/*!50705 0x000000000101000000184FF344C68E4240FD55DBA8A95B4240,*/'2014-09-25 22:33:26'), +(148,'1027 Songkhla Manor','','Minsk',340,'30861','563660187896',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:13'), +(149,'999 Sanaa Loop','','Gauteng',491,'3439','918032330119',/*!50705 0x0000000001010000000E0D309864193C40F234AA1D0F7939C0,*/'2014-09-25 22:33:05'), +(150,'879 Newcastle Way','','Michigan',499,'90732','206841104594',/*!50705 0x000000000101000000916A8E62EFC154C08244C99A474A4540,*/'2014-09-25 22:34:01'), +(151,'1337 Lincoln Parkway','','Saitama',555,'99457','597815221267',/*!50705 0x0000000001010000005E0E6036A6746140456227614BEE4140,*/'2014-09-25 22:31:55'), +(152,'1952 Pune Lane','','Saint-Denis',442,'92150','354615066969',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:46'), +(153,'782 Mosul Street','','Massachusetts',94,'25545','885899703621',/*!50705 0x000000000101000000E9C4D44C2DC151C0D1686105AE0A4540,*/'2014-09-25 22:33:46'), +(154,'781 Shimonoseki Drive','','Michoacn de Ocampo',202,'95444','632316273199',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:06'), +(155,'1560 Jelets Boulevard','','Shandong',291,'77777','189446090264',/*!50705 0x00000000010100000018D57D5B0B6A5D40ADDA3521AD184240,*/'2014-09-25 22:30:38'), +(156,'1963 Moscow Place','','Assam',354,'64863','761379480249',/*!50705 0x000000000101000000203BB9F04D2C57405D595826B2593A40,*/'2014-09-25 22:31:21'), +(157,'456 Escobar Way','','Jakarta Raya',232,'36061','719202533520',/*!50705 0x000000000101000000DDC2A9C516B65A4095CCFB49C6DB18C0,*/'2014-09-25 22:31:33'), +(158,'798 Cianjur Avenue','','Shanxi',590,'76990','499408708580',/*!50705 0x00000000010100000013D6C6D889BF5B409B4BBBE2F3824140,*/'2014-09-25 22:30:49'), +(159,'185 Novi Sad Place','','Bern',72,'41778','904253967161',/*!50705 0x00000000010100000000D0BC772FCA1D40377D2C335B794740,*/'2014-09-25 22:33:13'), +(160,'1367 Yantai Manor','','Ondo & Ekiti',381,'21294','889538496300',/*!50705 0x000000000101000000C25E72ED555514408A7A1C61ACAA1C40,*/'2014-09-25 22:32:26'), +(161,'1386 Nakhon Sawan Boulevard','','Pyongyang-si',420,'53502','368899174225',/*!50705 0x000000000101000000F4BA8FED46705F40A55F6C6B55844340,*/'2014-09-25 22:32:28'), +(162,'369 Papeete Way','','North Carolina',187,'66639','170117068815',/*!50705 0x000000000101000000C49D66DCAFF253C07A2D324B4C094240,*/'2014-09-25 22:33:52'), +(163,'1440 Compton Place','','North Austria',307,'81037','931059836497',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:10'), +(164,'1623 Baha Blanca Manor','','Moskova',310,'81511','149981248346',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:54'), +(165,'97 Shimoga Avenue','','Tel Aviv',533,'44660','177167004331',/*!50705 0x0000000001010000009A56AFC7E96341403192E2885A0A4040,*/'2014-09-25 22:31:41'), +(166,'1740 Le Mans Loop','','Pays de la Loire',297,'22853','168476538960',/*!50705 0x000000000101000000452A8C2D04B9D23F0000006AB82DBD41,*/'2014-09-25 22:31:01'), +(167,'1287 Xiangfan Boulevard','','Gifu',253,'57844','819416131190',/*!50705 0x0000000001010000006AE514D3BB1B61408141D2A755B54140,*/'2014-09-25 22:31:48'), +(168,'842 Salzburg Lane','','Adana',529,'3313','697151428760',/*!50705 0x0000000001010000007207A0072DD5414093228D6555A64240,*/'2014-09-25 22:33:29'), +(169,'154 Tallahassee Loop','','Xinxiang',199,'62250','935508855935',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:34'), +(170,'710 San Felipe del Progreso Avenue','','Lilongwe',304,'76901','843801144113',/*!50705 0x00000000010100000089C855D1C4E44040501D064E11EF2BC0,*/'2014-09-25 22:31:59'), +(171,'1540 Wroclaw Drive','','Maharashtra',107,'62686','182363341674',/*!50705 0x0000000001010000004E10D0D8F2D253407CFB294476F23340,*/'2014-09-25 22:31:14'), +(172,'475 Atinsk Way','','Gansu',240,'59571','201705577290',/*!50705 0x0000000001010000007872970E678C59405544978114404340,*/'2014-09-25 22:30:36'), +(173,'1294 Firozabad Drive','','Jiangxi',407,'70618','161801569569',/*!50705 0x000000000101000000EED7F8A7AF775C402332079C00943B40,*/'2014-09-25 22:30:40'), +(174,'1877 Ezhou Lane','','Rajasthan',550,'63337','264541743403',/*!50705 0x00000000010100000029722DFF466C52401969F34938923840,*/'2014-09-25 22:31:28'), +(175,'316 Uruapan Street','','Perak',223,'58194','275788967899',/*!50705 0x0000000001010000005A3629BB4F4559400AC5B18927561240,*/'2014-09-25 22:31:59'), +(176,'29 Pyongyang Loop','','Batman',58,'47753','734780743462',/*!50705 0x0000000001010000001C430070EC9044403C8963B895F14240,*/'2014-09-25 22:33:23'), +(177,'1010 Klerksdorp Way','','Steiermark',186,'6802','493008546874',/*!50705 0x000000000101000000CFEE35A90DE72E409C0425BB88884740,*/'2014-09-25 22:30:10'), +(178,'1848 Salala Boulevard','','Miranda',373,'25220','48265851133',/*!50705 0x0000000001010000006D08E984ABB150C02F90FBB1A43B2440,*/'2014-09-25 22:34:04'), +(179,'431 Xiangtan Avenue','','Kerala',18,'4854','230250973122',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:10'), +(180,'757 Rustenburg Avenue','','Skikda',483,'89668','506134035434',/*!50705 0x000000000101000000BFD76BD509A31B4063867C8626704240,*/'2014-09-25 22:30:01'), +(181,'146 Johannesburg Way','','Tamaulipas',330,'54132','953689007081',/*!50705 0x0000000001010000003C45B357446058C0EAD621ED35E13940,*/'2014-09-25 22:32:09'), +(182,'1891 Rizhao Boulevard','','So Paulo',456,'47288','391065549876',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:21'), +(183,'1089 Iwatsuki Avenue','','Kirov',270,'35109','866092335135',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:50'), +(184,'1410 Benin City Parkway','','Risaralda',405,'29747','104150372603',/*!50705 0x0000000001010000007C4F9B278DEC52C0795BE9B5D9401340,*/'2014-09-25 22:30:52'), +(185,'682 Garden Grove Place','','Tennessee',333,'67497','72136330362',/*!50705 0x0000000001010000004204C188228356C06B4F24F323934140,*/'2014-09-25 22:33:57'), +(186,'533 al-Ayn Boulevard','','California',126,'8862','662227486184',/*!50705 0x000000000101000000BF2264C5158E5DC08533AE6EABF24040,*/'2014-09-25 22:33:48'), +(187,'1839 Szkesfehrvr Parkway','','Gois',317,'55709','947468818183',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:20'), +(188,'741 Ambattur Manor','','Noord-Brabant',438,'43310','302590383819',/*!50705 0x000000000101000000699E6D7F78371540EF0D74A37ED94940,*/'2014-09-25 22:32:21'), +(189,'927 Barcelona Street','','Chaharmahal va Bakht',467,'65121','951486492670',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:38'), +(190,'435 0 Way','','West Bengali',195,'74750','760171523969',/*!50705 0x000000000101000000D9846A3906075640037168DB7A0F3640,*/'2014-09-25 22:31:16'), +(191,'140 Chiayi Parkway','','Sumy',506,'38982','855863906434',/*!50705 0x0000000001010000002C43C1317066414051BB5F05F8754940,*/'2014-09-25 22:33:34'), +(192,'1166 Changhwa Street','','Caraga',62,'58852','650752094490',/*!50705 0x0000000001010000009DB756201F715F40F53E9F1221832140,*/'2014-09-25 22:32:34'), +(193,'891 Novi Sad Manor','','Ontario',383,'5379','247646995453',/*!50705 0x0000000001010000005E49F25C5FB653C0DE6AE74537F34540,*/'2014-09-25 22:30:28'), +(194,'605 Rio Claro Parkway','','Tabora',513,'49348','352469351088',/*!50705 0x0000000001010000004E8B0B51CF694040DF67017F9D1014C0,*/'2014-09-25 22:33:18'), +(195,'1077 San Felipe de Puerto Plata Place','','Rostov-na-Donu',369,'65387','812824036424',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:56'), +(196,'9 San Miguel de Tucumn Manor','','Uttar Pradesh',169,'90845','956188728558',/*!50705 0x00000000010100000067DBC424B7995340A461E75C40263B40,*/'2014-09-25 22:31:15'), +(197,'447 Surakarta Loop','','Nyanza',271,'10428','940830176580',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:56'), +(198,'345 Oshawa Boulevard','','Tokyo-to',204,'32114','104491201771',/*!50705 0x000000000101000000FB5E9E29CF6C61404BFCF61A27D64140,*/'2014-09-25 22:31:45'), +(199,'1792 Valle de la Pascua Place','','Nordrhein-Westfalen',477,'15540','419419591240',/*!50705 0x000000000101000000E9BD8CBD720C204056725F18FA6F4940,*/'2014-09-25 22:31:06'), +(200,'1074 Binzhou Manor','','Baden-Wrttemberg',325,'36490','331132568928',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:05'), +(201,'817 Bradford Loop','','Jiangsu',109,'89459','264286442804',/*!50705 0x000000000101000000C3E1BB830EFD5D4006B243A10AC63F40,*/'2014-09-25 22:30:31'), +(202,'955 Bamenda Way','','Ondo & Ekiti',218,'1545','768481779568',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:24'), +(203,'1149 A Corua (La Corua) Boulevard','','Haiphong',194,'95824','470884141195',/*!50705 0x0000000001010000007573F1B7BDAB5A4050A0997164DD3440,*/'2014-09-25 22:34:06'), +(204,'387 Mwene-Ditu Drive','','Ahal',35,'8073','764477681869',/*!50705 0x000000000101000000B0253F3D11314D40A538A2D68FFA4240,*/'2014-09-25 22:33:30'), +(205,'68 Molodetno Manor','','Nordrhein-Westfalen',575,'4662','146640639760',/*!50705 0x000000000101000000EEF3739E0C691D40FE486CD2C8B84940,*/'2014-09-25 22:31:06'), +(206,'642 Nador Drive','','Maharashtra',77,'3924','369050085652',/*!50705 0x000000000101000000559D7A4908F25240E010AAD4EC0B3540,*/'2014-09-25 22:31:13'), +(207,'1688 Nador Lane','','Sulawesi Utara',184,'61613','652218196731',/*!50705 0x000000000101000000E358727044945E4093F139C148B9E83F,*/'2014-09-25 22:31:32'), +(208,'1215 Pyongyang Parkway','','Usak',557,'25238','646237101779',/*!50705 0x000000000101000000019E59B7E6673D40735E08DE35564340,*/'2014-09-25 22:33:30'), +(209,'1679 Antofagasta Street','','Alto Paran',122,'86599','905903574913',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:32'), +(210,'1304 s-Hertogenbosch Way','','Santa Catarina',83,'10925','90336226227',/*!50705 0x000000000101000000BDEAB765768848C05755D40561EB3AC0,*/'2014-09-25 22:30:16'), +(211,'850 Salala Loop','','Kitaa',371,'10800','403404780639',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:07'), +(212,'624 Oshawa Boulevard','','West Bengali',51,'89959','49677664184',/*!50705 0x0000000001010000000FBCB5A7BF315640EA7CD34F93383940,*/'2014-09-25 22:31:11'), +(213,'43 Dadu Avenue','','Rajasthan',74,'4855','95666951770',/*!50705 0x000000000101000000BCF957A0A7A852404046E5CBB0583940,*/'2014-09-25 22:31:12'), +(214,'751 Lima Loop','','Aden',7,'99405','756460337785',/*!50705 0x0000000001010000005ECF21BAB1844640A9007388138F2940,*/'2014-09-25 22:34:08'), +(215,'1333 Haldia Street','','Jilin',174,'82161','408304391718',/*!50705 0x00000000010100000007A51E5844345F404CE71E6D77974640,*/'2014-09-25 22:30:33'), +(216,'660 Jedda Boulevard','','Washington',65,'25053','168758068397',/*!50705 0x00000000010100000009EEF60FD88C5EC03C331C2A21CE4740,*/'2014-09-25 22:33:45'), +(217,'1001 Miyakonojo Lane','','Taizz',518,'67924','584316724815',/*!50705 0x0000000001010000006642DD51AD024640782C1103B8282B40,*/'2014-09-25 22:34:11'), +(218,'226 Brest Manor','','California',508,'2299','785881412500',/*!50705 0x000000000101000000CF9F36AA53825EC0B54D96FF35AF4240,*/'2014-09-25 22:34:02'), +(219,'1229 Valencia Parkway','','Haskovo',498,'99124','352679173732',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:24'), +(220,'1201 Qomsheh Manor','','Gois',28,'21464','873492228462',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:15'), +(221,'866 Shivapuri Manor','','Uttar Pradesh',448,'22474','778502731092',/*!50705 0x000000000101000000940BDF0C48A4534072648ADE4E953C40,*/'2014-09-25 22:31:26'), +(222,'1168 Najafabad Parkway','','Kabol',251,'40301','886649065861',/*!50705 0x0000000001010000009173AC9C074B51408EBDCDD199434140,*/'2014-09-25 22:29:59'), +(223,'1244 Allappuzha (Alleppey) Place','','Buenos Aires',567,'20657','991802825778',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:08'), +(224,'1842 Luzinia Boulevard','','Zanzibar West',593,'94420','706878974831',/*!50705 0x00000000010100000045E169E855994340B62C5F97E1A718C0,*/'2014-09-25 22:33:19'), +(225,'1926 Gingoog Street','','Sisilia',511,'22824','469738825391',/*!50705 0x0000000001010000004DD9E907758D2E40719AF4ADC58A4240,*/'2014-09-25 22:31:44'), +(226,'810 Palghat (Palakkad) Boulevard','','Jaroslavl',235,'73431','516331171356',/*!50705 0x00000000010100000069D48DC1D4EF43400294D0A79FD04C40,*/'2014-09-25 22:32:49'), +(227,'1820 Maring Parkway','','Punjab',324,'88307','99760893676',/*!50705 0x0000000001010000001E053EF5FE5E52406C617193AC4A4040,*/'2014-09-25 22:32:30'), +(228,'60 Poos de Caldas Street','','Rajasthan',243,'82338','963063788669',/*!50705 0x00000000010100000069EED7536140524079605B9AB6443A40,*/'2014-09-25 22:31:18'), +(229,'1014 Loja Manor','','Tamil Nadu',22,'66851','460795526514',/*!50705 0x000000000101000000803E366E560A5440A1212DDF44322A40,*/'2014-09-25 22:31:10'), +(230,'201 Effon-Alaiye Way','','Asuncin',37,'64344','684192903087',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:31'), +(231,'430 Alessandria Loop','','Saarland',439,'47446','669828224459',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:06'), +(232,'754 Valencia Place','','Phnom Penh',406,'87911','594319417514',/*!50705 0x0000000001010000009093D3E89F3A5A40AACCDE63FA1F2740,*/'2014-09-25 22:30:25'), +(233,'356 Olomouc Manor','','Gois',26,'93323','22326410776',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:15'), +(234,'1256 Bislig Boulevard','','Botosani',86,'50598','479007229460',/*!50705 0x00000000010100000085059C4AABAA3A408DAC46C032E04740,*/'2014-09-25 22:32:46'), +(235,'954 Kimchon Place','','West Bengali',559,'42420','541327526474',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:28'), +(236,'885 Yingkou Manor','','Kaduna',596,'31390','588964509072',/*!50705 0x00000000010100000006CF296D16E41E4038E3EAB6FA382640,*/'2014-09-25 22:32:28'), +(237,'1736 Cavite Place','','Qina',216,'98775','431770603551',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:56'), +(238,'346 Skikda Parkway','','Hawalli',233,'90628','630424482919',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:57'), +(239,'98 Stara Zagora Boulevard','','Valle',96,'76448','610173756082',/*!50705 0x00000000010100000084CD4AA4FE4153C0DB9953138E0A0F40,*/'2014-09-25 22:30:51'), +(240,'1479 Rustenburg Boulevard','','Southern Tagalog',527,'18727','727785483194',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:40'), +(241,'647 A Corua (La Corua) Street','','Chollanam',357,'36971','792557457753',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:07'), +(242,'1964 Gijn Manor','','Karnataka',473,'14408','918119601885',/*!50705 0x000000000101000000BBC3DCA458E45240DA4246F6F7DC2B40,*/'2014-09-25 22:31:26'), +(243,'47 Syktyvkar Lane','','West Java',118,'22236','63937119031',/*!50705 0x000000000101000000EDABBC2E8DB05A40C3C1397E037E1AC0,*/'2014-09-25 22:31:31'), +(244,'1148 Saarbrcken Parkway','','Fukushima',226,'1921','137773001988',/*!50705 0x000000000101000000AD8ACB4C449C614053F8229001874240,*/'2014-09-25 22:31:47'), +(245,'1103 Bilbays Parkway','','Hubei',578,'87660','279979529227',/*!50705 0x000000000101000000A76ED34444095C401234C1CB67054040,*/'2014-09-25 22:30:45'), +(246,'1246 Boksburg Parkway','','Hebei',422,'28349','890283544295',/*!50705 0x000000000101000000B66A323EA7E55D40E508BE0E41F74340,*/'2014-09-25 22:30:41'), +(247,'1483 Pathankot Street','','Tucumn',454,'37288','686015532180',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:06'), +(248,'582 Papeete Loop','','Central Visayas',294,'27722','569868543137',/*!50705 0x0000000001010000001F189BB1C3FC5E407DC4F9E5DD9E2440,*/'2014-09-25 22:32:38'), +(249,'300 Junan Street','','Kyonggi',553,'81314','890289150158',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:08'), +(250,'829 Grand Prairie Way','','Paran',328,'6461','741070712873',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:20'), +(251,'1473 Changhwa Parkway','','Mxico',124,'75933','266798132374',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:03'), +(252,'1309 Weifang Street','','Florida',520,'57338','435785045362',/*!50705 0x000000000101000000EC0CF8A1F71155C0995A006432703E40,*/'2014-09-25 22:34:02'), +(253,'1760 Oshawa Manor','','Tianjin',535,'38140','56257502250',/*!50705 0x000000000101000000FBBD5EAB4E4B5D40EB0A6C8434924340,*/'2014-09-25 22:30:43'), +(254,'786 Stara Zagora Way','','Oyo & Osun',390,'98332','716256596301',/*!50705 0x000000000101000000DB45E22F77770F4073C8BC44AB691F40,*/'2014-09-25 22:32:27'), +(255,'1966 Tonghae Street','','Anhalt Sachsen',198,'36481','567359279425',/*!50705 0x0000000001010000000000009825D59D41450A0A2879C84940,*/'2014-09-25 22:31:05'), +(256,'1497 Yuzhou Drive','','England',312,'3433','246810237916',/*!50705 0x000000000101000000CC4642B68718C0BFCA822E8617C14940,*/'2014-09-25 22:33:37'), +(258,'752 Ondo Loop','','Miyazaki',338,'32474','134673576619',/*!50705 0x00000000010100000048AD8B36226260408871EDFABBBB3F40,*/'2014-09-25 22:31:50'), +(259,'1338 Zalantun Lane','','Minas Gerais',413,'45403','840522972766',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:21'), +(260,'127 Iwakuni Boulevard','','Central Luzon',192,'20777','987442542471',/*!50705 0x0000000001010000000E6954E0E42E5E40AF05627E13AB2D40,*/'2014-09-25 22:32:37'), +(261,'51 Laredo Avenue','','Sagaing',342,'68146','884536620568',/*!50705 0x0000000001010000008720BD97B1C85740D4D7F335CB1B3640,*/'2014-09-25 22:32:18'), +(262,'771 Yaound Manor','','Sofala',64,'86768','245477603573',/*!50705 0x000000000101000000103345CA606B414046CB2665F7D733C0,*/'2014-09-25 22:32:17'), +(263,'532 Toulon Street','','Santiago',460,'69517','46871694740',/*!50705 0x000000000101000000ECD33B269CAC51C09AB67F65A5733340,*/'2014-09-25 22:30:55'), +(264,'1027 Banjul Place','','West Bengali',197,'50390','538241037443',/*!50705 0x000000000101000000FE14223BCA1A5640AC6F6072A3EE3640,*/'2014-09-25 22:31:16'), +(265,'1158 Mandi Bahauddin Parkway','','Shanxi',136,'98484','276555730211',/*!50705 0x000000000101000000ECC84741A6525C40A93C7084FB0B4440,*/'2014-09-25 22:30:32'), +(266,'862 Xintai Lane','','Cagayan Valley',548,'30065','265153400632',/*!50705 0x00000000010100000015580053866E5E408A5CCBBFF19C3140,*/'2014-09-25 22:32:41'), +(267,'816 Cayenne Parkway','','Manab',414,'93629','282874611748',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:56'), +(268,'1831 Nam Dinh Loop','','National Capital Reg',323,'51990','322888976727',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:38'), +(269,'446 Kirovo-Tepetsk Lane','','Osaka',203,'19428','303967439816',/*!50705 0x0000000001010000008D94D2D8C3F36040608CED5AE7554140,*/'2014-09-25 22:31:45'), +(270,'682 Halisahar Place','','Severn Morava',378,'20536','475553436330',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:54'), +(271,'1587 Loja Manor','','Salzburg',447,'5410','621625204422',/*!50705 0x0000000001010000002C83C53C86162A405886DD1C53E64740,*/'2014-09-25 22:30:10'), +(272,'1762 Paarl Parkway','','Hunan',298,'53928','192459639410',/*!50705 0x00000000010100000067333D177CDB5B40DBA8A9C024B03B40,*/'2014-09-25 22:30:39'), +(273,'1519 Ilorin Place','','Kerala',395,'49298','357445645426',/*!50705 0x0000000001010000000C4FF921002A5340BD772F52838C2540,*/'2014-09-25 22:31:21'), +(274,'920 Kumbakonam Loop','','California',446,'75090','685010736240',/*!50705 0x00000000010100000012EF4ADCF4695EC01B95E535C0564240,*/'2014-09-25 22:34:00'), +(275,'906 Goinia Way','','Wielkopolskie',255,'83565','701767622697',/*!50705 0x0000000001010000007FA2B2614D1732404064366D6BE14940,*/'2014-09-25 22:32:42'), +(276,'1675 Xiangfan Manor','','Tamil Nadu',283,'11763','271149517630',/*!50705 0x00000000010100000042B687180AD95340EE4108C897EC2540,*/'2014-09-25 22:31:20'), +(277,'85 San Felipe de Puerto Plata Drive','','Shandong',584,'46063','170739645687',/*!50705 0x000000000101000000EA605859365C5E40EF1010DDFDBC4240,*/'2014-09-25 22:30:48'), +(278,'144 South Hill Loop','','Guanajuato',445,'2012','45387294817',/*!50705 0x0000000001010000002B84D558424C59C0699B2CFF6B923440,*/'2014-09-25 22:32:11'), +(279,'1884 Shikarpur Avenue','','Haryana',263,'85548','959949395183',/*!50705 0x0000000001010000002CE395DA413F5340EB460EC7A9B03D40,*/'2014-09-25 22:31:19'), +(280,'1980 Kamjanets-Podilskyi Street','','Illinois',404,'89502','874337098891',/*!50705 0x000000000101000000167CE420B26556C0B7966EB7C9584440,*/'2014-09-25 22:33:57'), +(281,'1944 Bamenda Way','','Michigan',573,'24645','75975221996',/*!50705 0x000000000101000000B8B64B76C7C154C0EF254344203D4540,*/'2014-09-25 22:34:03'), +(282,'556 Baybay Manor','','Oyo & Osun',374,'55802','363982224739',/*!50705 0x000000000101000000F5C6FFD3C30E1140FC30E7BE41502040,*/'2014-09-25 22:32:25'), +(283,'457 Tongliao Loop','','Bursa',222,'56254','880756161823',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:25'), +(284,'600 Bradford Street','','East Azerbaidzan',514,'96204','117592274996',/*!50705 0x000000000101000000EE4E2D115E25474044FF5FD09D0A4340,*/'2014-09-25 22:31:40'), +(285,'1006 Santa Brbara dOeste Manor','','Ondo & Ekiti',389,'36229','85059738746',/*!50705 0x000000000101000000FBC67CE5E6581640531A7B40EAC81C40,*/'2014-09-25 22:32:26'), +(286,'1308 Sumy Loop','','Fujian',175,'30657','583021225407',/*!50705 0x000000000101000000DC7AF25597D35D409617AAACB70F3A40,*/'2014-09-25 22:30:34'), +(287,'1405 Chisinau Place','','Ponce',411,'8160','62781725285',/*!50705 0x000000000101000000974341DF4CA750C03F219628D6023240,*/'2014-09-25 22:32:45'), +(288,'226 Halifax Street','','Xinxiang',277,'58492','790651020929',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:38'), +(289,'1279 Udine Parkway','','Edo & Delta',69,'75860','195003555232',/*!50705 0x000000000101000000FFB7EDD68D8216408FF4B3A217571940,*/'2014-09-25 22:32:23'), +(290,'1336 Benin City Drive','','Shiga',386,'46044','341242939532',/*!50705 0x000000000101000000D5810761C9FB60401B07A8BA91804140,*/'2014-09-25 22:31:53'), +(291,'1155 Liaocheng Place','','Oyo & Osun',152,'22650','558236142492',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:23'), +(292,'1993 Tabuk Lane','','Tamil Nadu',522,'64221','648482415405',/*!50705 0x0000000001010000002AF3A0EA210854407F94C78965D92940,*/'2014-09-25 22:31:27'), +(293,'86 Higashiosaka Lane','','Guanajuato',563,'33768','957128697225',/*!50705 0x0000000001010000002DAF5C6F1B4C59C07F34F7EBA9643440,*/'2014-09-25 22:32:14'), +(294,'1912 Allende Manor','','Kowloon and New Kowl',279,'58124','172262454487',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:09'), +(295,'544 Tarsus Boulevard','','Gurico',562,'53145','892523334',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:34:05'), +(296,'1936 Cuman Avenue','','Virginia',433,'61195','976798660411',/*!50705 0x000000000101000000FD7B3A6840FC53C065F4ED6EAFA24240,*/'2014-09-25 22:33:58'), +(297,'1192 Tongliao Street','','Sharja',470,'19065','350970907017',/*!50705 0x000000000101000000AA27F38FBEB44B4053E68B625E563940,*/'2014-09-25 22:33:35'), +(298,'44 Najafabad Way','','Baskimaa',146,'61391','96604821070',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:08'), +(299,'32 Pudukkottai Lane','','Ohio',140,'38834','967274728547',/*!50705 0x000000000101000000077AA86D430C55C0409C2C5A25E14340,*/'2014-09-25 22:33:49'), +(300,'661 Chisinau Lane','','Pietari',274,'8856','816436065431',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:51'), +(301,'951 Stara Zagora Manor','','Punjab',400,'98573','429925609431',/*!50705 0x0000000001010000001E296C50C51953405651723DC0533E40,*/'2014-09-25 22:31:22'), +(302,'922 Vila Velha Loop','','Maharashtra',9,'4085','510737228015',/*!50705 0x000000000101000000738F5B8242AF5240612129D835183340,*/'2014-09-25 22:31:10'), +(303,'898 Jining Lane','','Pohjois-Pohjanmaa',387,'40070','161643343536',/*!50705 0x0000000001010000003DFB80F6D9773940C8D0B183CA405040,*/'2014-09-25 22:31:00'), +(304,'1635 Kuwana Boulevard','','Hiroshima',205,'52137','710603868323',/*!50705 0x000000000101000000AA944330B38E6040247035FCB8324140,*/'2014-09-25 22:31:46'), +(305,'41 El Alto Parkway','','Maharashtra',398,'56883','51917807050',/*!50705 0x000000000101000000D487E41A55315340BC3088FEBF443340,*/'2014-09-25 22:31:22'), +(306,'1883 Maikop Lane','','Kaliningrad',254,'68469','96110042435',/*!50705 0x00000000010100000020DF94A8CD82344015D918856E5A4B40,*/'2014-09-25 22:32:50'), +(307,'1908 Gaziantep Place','','Liaoning',536,'58979','108053751300',/*!50705 0x0000000001010000004DAA6C0EC6E65E408E9F7C30DF344540,*/'2014-09-25 22:30:43'), +(308,'687 Alessandria Parkway','','Sanaa',455,'57587','407218522294',/*!50705 0x0000000001010000000C60257A741A4640854A123A9EB52E40,*/'2014-09-25 22:34:10'), +(309,'827 Yuncheng Drive','','Callao',99,'79047','504434452842',/*!50705 0x000000000101000000C2514DA48F4753C0271CD544FA1C28C0,*/'2014-09-25 22:32:32'), +(310,'913 Coacalco de Berriozbal Loop','','Texas',33,'42141','262088367001',/*!50705 0x00000000010100000023371EC7EA4658C0A86851442B5E4040,*/'2014-09-25 22:33:43'), +(311,'715 So Bernardo do Campo Lane','','Kedah',507,'84804','181179321332',/*!50705 0x000000000101000000D8DBC1E3361F5940520DFB3DB1961640,*/'2014-09-25 22:32:00'), +(312,'1354 Siegen Street','','Rio de Janeiro',25,'80184','573441801529',/*!50705 0x0000000001010000009146054EB62846C0FCA0D398B50137C0,*/'2014-09-25 22:30:15'), +(313,'1191 Sungai Petani Boulevard','','Missouri',262,'9668','983259819766',/*!50705 0x00000000010100000055890D7107A557C0CB7564F6C38C4340,*/'2014-09-25 22:33:54'), +(314,'1224 Huejutla de Reyes Boulevard','','Lombardia',91,'70923','806016930576',/*!50705 0x000000000101000000D85B6F40F06D24405EEE38EA8DC44640,*/'2014-09-25 22:31:43'), +(315,'543 Bergamo Avenue','','Minas Gerais',215,'59686','103602195112',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:18'), +(316,'746 Joliet Lane','','Kursk',286,'94878','688485191923',/*!50705 0x00000000010100000085949F54FB174240E0DCBAF660DE4940,*/'2014-09-25 22:32:52'), +(317,'780 Kimberley Way','','Tabuk',515,'17032','824396883951',/*!50705 0x0000000001010000001BD47E6B274942408B53AD8559663C40,*/'2014-09-25 22:33:00'), +(318,'1774 Yaound Place','','Hubei',166,'91400','613124286867',/*!50705 0x0000000001010000002A00C633E8B15C404C63C5BA027D3E40,*/'2014-09-25 22:30:33'), +(319,'1957 Yantai Lane','','So Paulo',490,'59255','704948322302',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:22'), +(320,'1542 Lubumbashi Boulevard','','Tel Aviv',57,'62472','508800331065',/*!50705 0x000000000101000000765F84DF3C6041403CAB60AF0B034040,*/'2014-09-25 22:31:41'), +(321,'651 Pathankot Loop','','Maharashtra',336,'59811','139378397418',/*!50705 0x0000000001010000002198FE8062A952408AC168FBFCD23040,*/'2014-09-25 22:31:20'), +(322,'1359 Zhoushan Parkway','','Streymoyar',545,'29763','46568045367',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:59'), +(323,'1769 Iwaki Lane','','Kujawsko-Pomorskie',97,'25787','556100547674',/*!50705 0x000000000101000000487B7203F4013240837EF0EBD18F4A40,*/'2014-09-25 22:32:41'), +(324,'1145 Vilnius Manor','','Mxico',451,'73170','674805712553',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:12'), +(325,'1892 Nabereznyje Telny Lane','','Tutuila',516,'28396','478229987054',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:02'), +(326,'470 Boksburg Street','','Central',81,'97960','908029859266',/*!50705 0x000000000101000000DAE78C83263855405BE21291AB023B40,*/'2014-09-25 22:32:19'), +(327,'1427 A Corua (La Corua) Place','','Buenos Aires',45,'85799','972574862516',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:04'), +(328,'479 San Felipe del Progreso Avenue','','Morelos',130,'54949','869051782691',/*!50705 0x000000000101000000C87E710484BC58C039FD8F02FACD3240,*/'2014-09-25 22:32:04'), +(329,'867 Benin City Avenue','','Henan',591,'78543','168884817145',/*!50705 0x000000000101000000A0F2F972B05D5C405D68531AD6144140,*/'2014-09-25 22:30:50'), +(330,'981 Kumbakonam Place','','Distrito Federal',89,'87611','829116184079',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:17'), +(331,'1016 Iwakuni Street','','St George',269,'49833','961370847344',/*!50705 0x000000000101000000A1DC11A9C49C4EC0D11B936A44512A40,*/'2014-09-25 22:32:59'), +(332,'663 Baha Blanca Parkway','','Adana',5,'33463','834418779292',/*!50705 0x000000000101000000BE72182719AA4140CCD1E3F736804240,*/'2014-09-25 22:33:22'), +(333,'1860 Taguig Loop','','West Java',119,'59550','38158430589',/*!50705 0x00000000010100000042ACA34FD0E55A40D698C6E52ED81BC0,*/'2014-09-25 22:31:32'), +(334,'1816 Bydgoszcz Loop','','Dhaka',234,'64308','965273813662',/*!50705 0x000000000101000000A717C627AE7C564080BD1D3C6EEB3840,*/'2014-09-25 22:30:12'), +(335,'587 Benguela Manor','','Illinois',42,'91590','165450987037',/*!50705 0x00000000010100000097CEE2207C1456C0DDEFABCD5AE14440,*/'2014-09-25 22:33:44'), +(336,'430 Kumbakonam Drive','','Santa F',457,'28814','105470691550',/*!50705 0x00000000010100000004C1882249304DC055DF54FF7B4E41C0,*/'2014-09-25 22:30:07'), +(337,'1838 Tabriz Lane','','Dhaka',143,'1195','38988715447',/*!50705 0x0000000001010000001A5D948F139A5640C4D21B49DDB53740,*/'2014-09-25 22:30:12'), +(338,'431 Szkesfehrvr Avenue','','Baki',48,'57828','119501405123',/*!50705 0x000000000101000000A77686A92DF248400FAECACF57304440,*/'2014-09-25 22:30:11'), +(339,'503 Sogamoso Loop','','Sumqayit',505,'49812','834626715837',/*!50705 0x0000000001010000006C83C94395D548402C8EB9217C4B4440,*/'2014-09-25 22:30:11'), +(340,'507 Smolensk Loop','','Sousse',492,'22971','80303246192',/*!50705 0x000000000101000000298EA8F52346254075DA649EA6E94140,*/'2014-09-25 22:33:21'), +(341,'1920 Weifang Avenue','','Uttar Pradesh',427,'15643','869507847714',/*!50705 0x0000000001010000001F3EFA70DAC153407410CF6D1DCF3C40,*/'2014-09-25 22:31:25'), +(342,'124 al-Manama Way','','Hiroshima',382,'52368','647899404952',/*!50705 0x0000000001010000004BE07B244AA760407B0ED18D55354140,*/'2014-09-25 22:31:52'), +(343,'1443 Mardan Street','','Western Cape',392,'31483','231383037471',/*!50705 0x000000000101000000FB6074D42CF73240B0B03B3833DA40C0,*/'2014-09-25 22:33:05'), +(344,'1909 Benguela Lane','','Henan',581,'19913','624138001031',/*!50705 0x000000000101000000F4AD6AA480775C4066EB2AEE89A74140,*/'2014-09-25 22:30:47'), +(345,'68 Ponce Parkway','','Hanoi',201,'85926','870635127812',/*!50705 0x0000000001010000005DF525C0D5755A4000F61B3746063540,*/'2014-09-25 22:34:06'), +(346,'1217 Konotop Avenue','','Gelderland',151,'504','718917251754',/*!50705 0x000000000101000000F438679F22A2164019B4EB3944044A40,*/'2014-09-25 22:32:20'), +(347,'1293 Nam Dinh Way','','Roraima',84,'71583','697656479977',/*!50705 0x0000000001010000008EE6C8CA2F564EC0D9C23DE0CB8E0640,*/'2014-09-25 22:30:17'), +(348,'785 Vaduz Street','','Baja California',335,'36170','895616862749',/*!50705 0x0000000001010000000D61EB0816DD5CC07DB328475C504040,*/'2014-09-25 22:32:10'), +(349,'1516 Escobar Drive','','Tongatapu',370,'46069','64536069371',/*!50705 0x0000000001010000009132987575E665C0BE11DDB3AE2335C0,*/'2014-09-25 22:33:20'), +(350,'1628 Nagareyama Lane','','Central',453,'60079','20064292617',/*!50705 0x00000000010100000019A5F04520C14CC029006B7AF55639C0,*/'2014-09-25 22:32:32'), +(351,'1157 Nyeri Loop','','Adygea',320,'56380','262744791493',/*!50705 0x000000000101000000AC91B8228C0D4440EBD10AC2CB4D4640,*/'2014-09-25 22:32:55'), +(352,'1673 Tangail Drive','','Daugavpils',137,'26857','627924259271',/*!50705 0x0000000001010000004377A45588883A40E580B80611F14B40,*/'2014-09-25 22:31:57'), +(353,'381 Kabul Way','','Taipei',209,'87272','55477302294',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:15'), +(354,'953 Hodeida Street','','Southern Tagalog',221,'18841','53912826864',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:37'), +(355,'469 Nakhon Sawan Street','','Tuvassia',531,'58866','689199636560',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:58'), +(356,'1378 Beira Loop','','Krasnojarsk',597,'40792','840957664136',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:58'), +(357,'1641 Changhwa Place','','Nord-Ouest',52,'37636','256546485220',/*!50705 0x000000000101000000103B53E8BC4A2440A4C0A7DEBFD61740,*/'2014-09-25 22:30:25'), +(358,'1698 Southport Loop','','Hidalgo',393,'49009','754358349853',/*!50705 0x0000000001010000007AB82E46EEAE58C03DED951EF21D3440,*/'2014-09-25 22:32:11'), +(359,'519 Nyeri Manor','','So Paulo',461,'37650','764680915323',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:21'), +(360,'619 Hunuco Avenue','','Shimane',331,'81508','142596392389',/*!50705 0x000000000101000000A09ADC399EA160405B1D4AFE71BC4140,*/'2014-09-25 22:31:50'), +(361,'45 Aparecida de Goinia Place','','Madhya Pradesh',464,'7431','650496654258',/*!50705 0x0000000001010000009E0CE94BCA345440C9FDB38B0E953840,*/'2014-09-25 22:31:26'), +(362,'482 Kowloon and New Kowloon Manor','','Bratislava',90,'97056','738968474939',/*!50705 0x00000000010100000070DC18F1531B3140BDB90908F7124840,*/'2014-09-25 22:33:02'), +(363,'604 Bern Place','','Jharkhand',429,'5373','620719383725',/*!50705 0x000000000101000000799F9916AB55554037CC86EB07593740,*/'2014-09-25 22:31:25'), +(364,'1623 Kingstown Drive','','Buenos Aires',20,'91299','296394569728',/*!50705 0x000000000101000000791563AAAA2A4DC0E4839ECDAA6A41C0,*/'2014-09-25 22:30:04'), +(365,'1009 Zanzibar Lane','','Arecibo',32,'64875','102396298916',/*!50705 0x000000000101000000FBBD5EABCEAD50C0E9787187F2783240,*/'2014-09-25 22:32:45'), +(366,'114 Jalib al-Shuyukh Manor','','Centre',585,'60440','845378657301',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:25'), +(367,'1163 London Parkway','','Par',66,'6066','675120358494',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:16'), +(368,'1658 Jastrzebie-Zdrj Loop','','Central',372,'96584','568367775448',/*!50705 0x0000000001010000002B73A900CEEF4240660811BA956FB9BF,*/'2014-09-25 22:31:56'), +(369,'817 Laredo Avenue','','Jalisco',188,'77449','151249681135',/*!50705 0x000000000101000000F00BF9B113D959C03E4EE2BDB4AA3440,*/'2014-09-25 22:32:06'), +(370,'1565 Tangail Manor','','Okinawa',377,'45750','634445428822',/*!50705 0x000000000101000000D94C744CCCAA5F4045A1C096B2C53940,*/'2014-09-25 22:31:52'), +(371,'1912 Emeishan Drive','','Balikesir',50,'33050','99883471275',/*!50705 0x000000000101000000F1074D5CD8E23B400B2A053818D34340,*/'2014-09-25 22:33:22'), +(372,'230 Urawa Drive','','Andhra Pradesh',8,'2738','166898395731',/*!50705 0x0000000001010000008B04AE869F515340B2930BDF0C402F40,*/'2014-09-25 22:31:09'), +(373,'1922 Miraj Way','','Esfahan',356,'13203','320471479776',/*!50705 0x00000000010100000017050B71F6AE494026231DD434514040,*/'2014-09-25 22:31:37'), +(374,'433 Florencia Street','','Chihuahua',250,'91330','561729882725',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:08'), +(375,'1049 Matamoros Parkway','','Karnataka',191,'69640','960505250340',/*!50705 0x0000000001010000007923F3C89F355340386744696F563140,*/'2014-09-25 22:31:16'), +(376,'1061 Ede Avenue','','Southern Tagalog',98,'57810','333390595558',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:35'), +(377,'154 Oshawa Manor','','East Java',415,'72771','440365973660',/*!50705 0x00000000010100000005B93077D24D5C4065074B2B74041FC0,*/'2014-09-25 22:31:34'), +(378,'1191 Tandil Drive','','Southern Tagalog',523,'6362','45554316010',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:40'), +(379,'1133 Rizhao Avenue','','Pernambuco',572,'2800','600264533987',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:23'), +(380,'1519 Santiago de los Caballeros Loop','','East Kasai',348,'22025','409315295763',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:53'), +(381,'1618 Olomouc Manor','','Kurgan',285,'26385','96846695220',/*!50705 0x000000000101000000B1694A5755555040EA8FD552E5B94B40,*/'2014-09-25 22:32:51'), +(382,'220 Hidalgo Drive','','Kermanshah',265,'45298','342720754566',/*!50705 0x0000000001010000004E7A843F6888474008605EDB36284140,*/'2014-09-25 22:31:37'), +(383,'686 Donostia-San Sebastin Lane','','Guangdong',471,'97390','71857599858',/*!50705 0x000000000101000000F90A1C1A60845C400FDB711EA98B3640,*/'2014-09-25 22:30:42'), +(384,'97 Mogiljov Lane','','Gujarat',73,'89294','924815207181',/*!50705 0x000000000101000000B4F116FEC209524097DB076A42C63540,*/'2014-09-25 22:31:11'), +(385,'1642 Charlotte Amalie Drive','','Slaskie',549,'75442','821476736117',/*!50705 0x000000000101000000DDC4DA2967F73240D5D6E3198F114940,*/'2014-09-25 22:32:44'), +(386,'1368 Maracabo Boulevard','','',493,'32716','934352415130',/*!50705 0x000000000101000000731074B4AA8A4FC050920953EF2E3240,*/'2014-09-25 22:30:03'), +(387,'401 Sucre Boulevard','','New Hampshire',322,'25007','486395999608',/*!50705 0x000000000101000000817FA54E1BDD51C013718456717F4540,*/'2014-09-25 22:33:56'), +(388,'368 Hunuco Boulevard','','Namibe',360,'17165','106439158941',/*!50705 0x000000000101000000B5858CECEF4D28404D8EF11769642EC0,*/'2014-09-25 22:30:03'), +(389,'500 Lincoln Parkway','','Jiangsu',210,'95509','550306965159',/*!50705 0x0000000001010000003C399E2A3AC15D404409449957CB4040,*/'2014-09-25 22:30:35'), +(390,'102 Chapra Drive','','Ibaragi',521,'14073','776031833752',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:54'), +(391,'1793 Meixian Place','','Hmelnytskyi',258,'33535','619966287415',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:31'), +(392,'514 Ife Way','','Shaba',315,'69973','900235712074',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:53'), +(393,'717 Changzhou Lane','','Southern Tagalog',104,'21615','426255288071',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:36'), +(394,'753 Ilorin Avenue','','Sichuan',157,'3656','464511145118',/*!50705 0x0000000001010000008531D8C3CDD8594059D70D805D883D40,*/'2014-09-25 22:30:32'), +(395,'1337 Mit Ghamr Avenue','','Nakhon Sawan',358,'29810','175283210378',/*!50705 0x0000000001010000009A588572C70859404D237722D2682F40,*/'2014-09-25 22:33:19'), +(396,'767 Pyongyang Drive','','Osaka',229,'83536','667736124769',/*!50705 0x000000000101000000149A7F4FC7EA6040A02413A6DE2F4140,*/'2014-09-25 22:31:48'), +(397,'614 Pak Kret Street','','Addis Abeba',6,'27796','47808359842',/*!50705 0x0000000001010000009F84E3439A5F43402233BCFEC90C2240,*/'2014-09-25 22:30:59'), +(398,'954 Lapu-Lapu Way','','Moskova',278,'8816','737229003916',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:51'), +(399,'331 Bydgoszcz Parkway','','Asturia',181,'966','537374465982',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:09'), +(400,'1152 Citrus Heights Manor','','al-Qadarif',15,'5239','765957414528',/*!50705 0x00000000010100000084F6459D14B14140AA36EE83E2112C40,*/'2014-09-25 22:33:11'), +(401,'168 Cianjur Manor','','Saitama',228,'73824','679095087143',/*!50705 0x000000000101000000DEA925C2EB75614032005471E3F94140,*/'2014-09-25 22:31:48'), +(402,'616 Hagonoy Avenue','','Krasnojarsk',39,'46043','604177838256',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:47'), +(403,'1190 0 Place','','Rio Grande do Sul',44,'10417','841876514789',/*!50705 0x0000000001010000002347DF49B00D4BC086151340D6543FC0,*/'2014-09-25 22:30:16'), +(404,'734 Bchar Place','','Punjab',375,'30586','280578750435',/*!50705 0x0000000001010000006D3B6D8D885C5240C4A40925DDCE3E40,*/'2014-09-25 22:32:31'), +(405,'530 Lausanne Lane','','Texas',135,'11067','775235029633',/*!50705 0x0000000001010000009C830C89A03358C0E2D3F7753B644040,*/'2014-09-25 22:33:49'), +(406,'454 Patiala Lane','','Fukushima',276,'13496','794553031307',/*!50705 0x000000000101000000EC3D4B46448C614091306711E5BB4240,*/'2014-09-25 22:31:49'), +(407,'1346 Mysore Drive','','Bretagne',92,'61507','516647474029',/*!50705 0x0000000001010000004474BE8EEEEE11C070010DDBBB3F4840,*/'2014-09-25 22:31:00'), +(408,'990 Etawah Loop','','Tamil Nadu',564,'79940','206169448769',/*!50705 0x000000000101000000D54B42D8DF3C5340FE518A0C61A72440,*/'2014-09-25 22:31:29'), +(409,'1266 Laredo Parkway','','Saitama',380,'7664','1483365694',/*!50705 0x000000000101000000FBD97EE8F87361403BA5283C0DF44140,*/'2014-09-25 22:31:52'), +(410,'88 Nagaon Manor','','Buenos Aires',524,'86868','779461480495',/*!50705 0x000000000101000000CA3736960B914DC0D78A91802CA942C0,*/'2014-09-25 22:30:07'), +(411,'264 Bhimavaram Manor','','St Thomas',111,'54749','302526949177',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:34:08'), +(412,'1639 Saarbrcken Drive','','North West',437,'9827','328494873422',/*!50705 0x00000000010100000015CB8866F93D3B40E48AE65CE5AA39C0,*/'2014-09-25 22:33:05'), +(413,'692 Amroha Drive','','Northern',230,'35575','359478883004',/*!50705 0x00000000010100000027648CB47900544098E777503F562340,*/'2014-09-25 22:33:10'), +(414,'1936 Lapu-Lapu Parkway','','Bauchi & Gombe',141,'7122','653436985797',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:23'), +(415,'432 Garden Grove Street','','Ontario',430,'65630','615964523510',/*!50705 0x0000000001010000003E867DF1FBDB53C05900AEBF80EF4540,*/'2014-09-25 22:30:28'), +(416,'1445 Carmen Parkway','','West Java',117,'70809','598912394463',/*!50705 0x000000000101000000957950F550C55A40B3BFA21122171BC0,*/'2014-09-25 22:31:30'), +(417,'791 Salinas Street','','Punjab',208,'40509','129953030512',/*!50705 0x000000000101000000579E9B911CFA524075D256804A883F40,*/'2014-09-25 22:31:17'), +(418,'126 Acua Parkway','','West Bengali',71,'58888','480039662421',/*!50705 0x000000000101000000C3013E89191056404E9F7829D01A3840,*/'2014-09-25 22:31:11'), +(419,'397 Sunnyvale Avenue','','Guanajuato',19,'55566','680851640676',/*!50705 0x000000000101000000754419059C2F59C02409C21550EA3440,*/'2014-09-25 22:32:01'), +(420,'992 Klerksdorp Loop','','Utrecht',23,'33711','855290087237',/*!50705 0x000000000101000000C1DFD4ACD88C15404FDC3BB4D9134A40,*/'2014-09-25 22:32:19'), +(421,'966 Arecibo Loop','','Sind',134,'94018','15273765306',/*!50705 0x000000000101000000BE9B1320AFF15040D93400659DBB3A40,*/'2014-09-25 22:32:30'), +(422,'289 Santo Andr Manor','','al-Sharqiya',16,'72410','214976066017',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:59'), +(423,'437 Chungho Drive','','Puerto Plata',450,'59489','491271355190',/*!50705 0x000000000101000000225A86930FAC51C0082692431FCB3340,*/'2014-09-25 22:30:55'), +(424,'1948 Bayugan Parkway','','Bihar',264,'60622','987306329957',/*!50705 0x0000000001010000007613211A82E45540D685C4E2DC893940,*/'2014-09-25 22:31:19'), +(425,'1866 al-Qatif Avenue','','California',155,'89420','546793516940',/*!50705 0x000000000101000000B4EE7AC4C3815DC0165D28AAC8084140,*/'2014-09-25 22:33:50'), +(426,'1661 Abha Drive','','Tamil Nadu',416,'14400','270456873752',/*!50705 0x000000000101000000D3B36A2192B45340FBC5111038C32440,*/'2014-09-25 22:31:23'), +(427,'1557 Cape Coral Parkway','','Hubei',293,'46875','368284120423',/*!50705 0x00000000010100000034CC1A06BDEA5B402D5A25FD62314040,*/'2014-09-25 22:30:38'), +(428,'1727 Matamoros Place','','Sawhaj',465,'78813','129673677866',/*!50705 0x00000000010100000083E38D27DDB13F40555BA093948E3A40,*/'2014-09-25 22:30:57'), +(429,'1269 Botosani Manor','','Guangdong',468,'47394','736517327853',/*!50705 0x000000000101000000C8E1DDDB3ED65C40281B20E230C83640,*/'2014-09-25 22:30:42'), +(430,'355 Vitria de Santo Anto Way','','Oaxaca',452,'81758','548003849552',/*!50705 0x0000000001010000000363D8BC050858C0503750E09D163240,*/'2014-09-25 22:32:13'), +(431,'1596 Acua Parkway','','Jharkhand',418,'70425','157133457169',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:24'), +(432,'259 Ipoh Drive','','So Paulo',189,'64964','419009857119',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:18'), +(433,'1823 Hoshiarpur Lane','','Komi',510,'33191','307133768620',/*!50705 0x000000000101000000C6DA8420AC674940DD9ACF1495D64E40,*/'2014-09-25 22:32:57'), +(434,'1404 Taguig Drive','','Okayama',547,'87212','572068624538',/*!50705 0x000000000101000000205D11A1F6BF6040BFE90203AD864140,*/'2014-09-25 22:31:54'), +(435,'740 Udaipur Lane','','Nizni Novgorod',150,'33505','497288595103',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:47'), +(436,'287 Cuautla Boulevard','','Chuquisaca',501,'72736','82619513349',/*!50705 0x0000000001010000002A0B15D2D05050C049C44ABB870833C0,*/'2014-09-25 22:30:14'), +(437,'1766 Almirante Brown Street','','KwaZulu-Natal',364,'63104','617567598243',/*!50705 0x000000000101000000FDAB7DF090EE3D40488D64EA09C23BC0,*/'2014-09-25 22:33:04'), +(438,'596 Huixquilucan Place','','Nampula',351,'65892','342709348083',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:17'), +(439,'1351 Aparecida de Goinia Parkway','','Northern Mindanao',391,'41775','959834530529',/*!50705 0x000000000101000000DAFF006B55F55E40898C58D5DC4F2040,*/'2014-09-25 22:32:38'), +(440,'722 Bradford Lane','','Shandong',249,'90920','746251338300',/*!50705 0x000000000101000000653E7B890CB55D4078A0A932E7954140,*/'2014-09-25 22:30:37'), +(441,'983 Santa F Way','','British Colombia',565,'47472','145720452260',/*!50705 0x000000000101000000719CCA58A3C75EC0EEE7B92AF59F4840,*/'2014-09-25 22:30:28'), +(442,'1245 Ibirit Way','','La Romana',290,'40926','331888642162',/*!50705 0x0000000001010000006D59BE2E433E51C04FC87322666D3240,*/'2014-09-25 22:30:54'), +(443,'1836 Korla Parkway','','Copperbelt',272,'55405','689681677428',/*!50705 0x000000000101000000064257C796363C40BB7EC16ED89A29C0,*/'2014-09-25 22:34:11'), +(444,'231 Kaliningrad Place','','Lombardia',70,'57833','575081026569',/*!50705 0x0000000001010000007A185A9D9C552340A77E390E17D94640,*/'2014-09-25 22:31:42'), +(445,'495 Bhimavaram Lane','','Maharashtra',144,'3','82088937724',/*!50705 0x0000000001010000003EE1911DC0B15240B39943520BE73440,*/'2014-09-25 22:31:15'), +(446,'1924 Shimonoseki Drive','','Batna',59,'52625','406784385440',/*!50705 0x000000000101000000347CB03154B21840DF814B112AC74140,*/'2014-09-25 22:29:59'), +(447,'105 Dzerzinsk Manor','','Inner Mongolia',540,'48570','240776414296',/*!50705 0x000000000101000000F1C05B7BFA905E40F5EC03DA67CE4540,*/'2014-09-25 22:30:44'), +(448,'614 Denizli Parkway','','Rio Grande do Sul',486,'29444','876491807547',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:22'), +(449,'1289 Belm Boulevard','','Tartumaa',530,'88306','237368926031',/*!50705 0x00000000010100000079680EFF9FB93A406C7E575FB8304D40,*/'2014-09-25 22:30:58'), +(450,'203 Tambaram Street','','Buenos Aires',161,'73942','411549550611',/*!50705 0x000000000101000000E753C72AA5604DC0438CD7BCAA2A41C0,*/'2014-09-25 22:30:05'), +(451,'1704 Tambaram Manor','','West Bengali',554,'2834','39463554936',/*!50705 0x000000000101000000A4E9A2D755065640F598EDAFC3793640,*/'2014-09-25 22:31:28'), +(452,'207 Cuernavaca Loop','','Tatarstan',352,'52671','782900030287',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:55'), +(453,'319 Springs Loop','','Baijeri',160,'99552','72524459905',/*!50705 0x0000000001010000006A62CB3C0304264081FEE7D5A5CB4840,*/'2014-09-25 22:31:05'), +(454,'956 Nam Dinh Manor','','Kerman',481,'21872','474047727727',/*!50705 0x000000000101000000F16206CF29D74B40CFA91A738D733D40,*/'2014-09-25 22:31:39'), +(455,'1947 Paarl Way','','Central Java',509,'23636','834061016202',/*!50705 0x000000000101000000C4D78D2D3AB55B40AC996B8775391EC0,*/'2014-09-25 22:31:35'), +(456,'814 Simferopol Loop','','Sinaloa',154,'48745','524567129902',/*!50705 0x000000000101000000954330B3F42F5BC090CCD9F115313A40,*/'2014-09-25 22:32:05'), +(457,'535 Ahmadnagar Manor','','Abu Dhabi',3,'41136','985109775584',/*!50705 0x000000000101000000D3E6EE29EF2E4B4099C6E52E78773840,*/'2014-09-25 22:33:34'), +(458,'138 Caracas Boulevard','','Zulia',326,'16790','974433019532',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:34:04'), +(459,'251 Florencia Drive','','Michoacn de Ocampo',556,'16119','118011831565',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:13'), +(460,'659 Gatineau Boulevard','','La Paz',153,'28587','205524798287',/*!50705 0x00000000010100000017E7B9CFBB0B51C0A029858ABB7B30C0,*/'2014-09-25 22:30:13'), +(461,'1889 Valparai Way','','Ziguinchor',600,'75559','670370974122',/*!50705 0x00000000010100000020E1C50C9E4530C0FC219111AB2A2940,*/'2014-09-25 22:33:01'), +(462,'1485 Bratislava Place','','Illinois',435,'83183','924663855568',/*!50705 0x000000000101000000A081A2C30D4656C04453D1B3B4224540,*/'2014-09-25 22:33:59'), +(463,'935 Aden Boulevard','','Central Java',532,'64709','335052544020',/*!50705 0x000000000101000000C7139C55FA485B40BEE435655D7A1BC0,*/'2014-09-25 22:31:35'), +(464,'76 Kermanshah Manor','','Esfahan',423,'23343','762361821578',/*!50705 0x000000000101000000FF66182DF6EE4940A60BB1FA23014040,*/'2014-09-25 22:31:37'), +(465,'734 Tanshui Avenue','','Caquet',170,'70664','366776723320',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:52'), +(466,'118 Jaffna Loop','','Northern Mindanao',182,'10447','325526730021',/*!50705 0x00000000010100000028B27B9777475F40BAEA4B80ABAA2140,*/'2014-09-25 22:32:36'), +(467,'1621 Tongliao Avenue','','Irkutsk',558,'22173','209342540247',/*!50705 0x000000000101000000C7269E584CE95940E56A1ACA3F604A40,*/'2014-09-25 22:32:58'), +(468,'1844 Usak Avenue','','Nova Scotia',196,'84461','164414772677',/*!50705 0x0000000001010000004205871744C94FC0162B0F779A524640,*/'2014-09-25 22:30:27'), +(469,'1872 Toulon Loop','','OHiggins',428,'7939','928809465153',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:30'), +(470,'1088 Ibirit Place','','Jalisco',595,'88502','49084281333',/*!50705 0x0000000001010000007820578FA0D859C06AE514D33BB93440,*/'2014-09-25 22:32:15'), +(471,'1322 Mosul Parkway','','Shandong',145,'95400','268053970382',/*!50705 0x0000000001010000002856574F779F5D402425E2523ABB4240,*/'2014-09-25 22:30:32'), +(472,'1447 Chatsworth Place','','Chihuahua',129,'41545','769370126331',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:04'), +(473,'1257 Guadalajara Street','','Karnataka',78,'33599','195337700615',/*!50705 0x000000000101000000052049A4C8ED5240E702F2800DD33040,*/'2014-09-25 22:31:14'), +(474,'1469 Plock Lane','','Galicia',388,'95835','622884741180',/*!50705 0x000000000101000000FB44F9DDCF741FC0ED9A90D6182B4540,*/'2014-09-25 22:33:09'), +(475,'434 Ourense (Orense) Manor','','Hodeida',206,'14122','562370137426',/*!50705 0x000000000101000000F56FF2B62D7A4540DF80E03B7B982D40,*/'2014-09-25 22:34:10'), +(476,'270 Tambaram Parkway','','Gauteng',244,'9668','248446668735',/*!50705 0x0000000001010000005B5540EB2B0B3C4082412D61C8333AC0,*/'2014-09-25 22:33:03'), +(477,'1786 Salinas Place','','Nam Ha',359,'66546','206060652238',/*!50705 0x00000000010100000044BD851A2A7E5A40C2DB8310908D3440,*/'2014-09-25 22:34:07'), +(478,'1078 Stara Zagora Drive','','Aceh',301,'69221','932992626595',/*!50705 0x00000000010100000034057CC8A5495840D2C9ADA470B81440,*/'2014-09-25 22:31:33'), +(479,'1854 Okara Boulevard','','Drenthe',158,'42123','131912793873',/*!50705 0x0000000001010000006E8AC745B5A01B40947BCBE6BB634A40,*/'2014-09-25 22:32:21'), +(480,'421 Yaound Street','','Sumy',385,'11363','726875628268',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:33'), +(481,'1153 Allende Way','','Qubec',179,'20336','856872225376',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:26'), +(482,'808 Naala-Porto Parkway','','England',500,'41060','553452430707',/*!50705 0x0000000001010000000E6036A6CC4201C0B9D7930A74B44A40,*/'2014-09-25 22:33:41'), +(483,'632 Usolje-Sibirskoje Parkway','','Ha Darom',36,'73085','667648979883',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:41'), +(484,'98 Pyongyang Boulevard','','Ohio',11,'88749','191958435142',/*!50705 0x0000000001010000008AB1A778376154C0990524AB6C8A4440,*/'2014-09-25 22:33:42'), +(485,'984 Novoterkassk Loop','','Gaziantep',180,'28165','435118527255',/*!50705 0x000000000101000000CAAF7A1BF6B04240AA8889BC9B874240,*/'2014-09-25 22:33:25'), +(486,'64 Korla Street','','Mwanza',347,'25145','510383179153',/*!50705 0x0000000001010000002A28FB9DDC7B40402EBB719C252204C0,*/'2014-09-25 22:33:17'), +(487,'1785 So Bernardo do Campo Street','','Veracruz',125,'71182','684529463244',/*!50705 0x000000000101000000A1551CBD509C57C0141F44D72A223240,*/'2014-09-25 22:32:04'), +(488,'698 Jelets Boulevard','','Denizli',142,'2596','975185523021',/*!50705 0x000000000101000000EECD6F9868163D40B226BB3E18E34240,*/'2014-09-25 22:33:24'), +(489,'1297 Alvorada Parkway','','Ningxia',587,'11839','508348602835',/*!50705 0x0000000001010000001583D1F679915A4029876066E93B4340,*/'2014-09-25 22:30:49'), +(490,'1909 Dayton Avenue','','Guangdong',469,'88513','702955450528',/*!50705 0x0000000001010000007BE0BE6955655C405457998466E43840,*/'2014-09-25 22:30:42'), +(491,'1789 Saint-Denis Parkway','','Coahuila de Zaragoza',4,'8268','936806643983',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:01'), +(492,'185 Mannheim Lane','','Stavropol',408,'23661','589377568313',/*!50705 0x000000000101000000333E82D19B87454024592CEA38064640,*/'2014-09-25 22:32:56'), +(493,'184 Mandaluyong Street','','Baja California Sur',288,'94239','488425406814',/*!50705 0x000000000101000000173B2BB3D2935BC078F6F0C05B233840,*/'2014-09-25 22:32:09'), +(494,'591 Sungai Petani Drive','','Okayama',376,'46400','37247325001',/*!50705 0x0000000001010000001966B2C9EBBD60404CC054D8B1544140,*/'2014-09-25 22:31:51'), +(495,'656 Matamoros Drive','','Boyac',487,'19489','17305839123',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:53'), +(496,'775 ostka Drive','','al-Daqahliya',337,'22358','171973024401',/*!50705 0x000000000101000000FC4DCD8A4D423F403EDF60B9EFB63E40,*/'2014-09-25 22:30:57'), +(497,'1013 Tabuk Boulevard','','West Bengali',261,'96203','158399646978',/*!50705 0x0000000001010000005D1B857F6C1B5640793BC269C1F53640,*/'2014-09-25 22:31:19'), +(498,'319 Plock Parkway','','Istanbul',504,'26101','854259976812',/*!50705 0x000000000101000000B6EFF6C54A453D40277E3100F97A4440,*/'2014-09-25 22:33:28'), +(499,'1954 Kowloon and New Kowloon Way','','Chimborazo',434,'63667','898559280434',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:56'), +(500,'362 Rajkot Lane','','Gansu',47,'98030','962020153680',/*!50705 0x0000000001010000004F6FEB13E50A5A4028733D1B03464240,*/'2014-09-25 22:30:31'), +(501,'1060 Tandil Lane','','Shandong',432,'72349','211256301880',/*!50705 0x000000000101000000CAB61D6423DD5D40ADF1E379BAB64140,*/'2014-09-25 22:30:41'), +(502,'1515 Korla Way','','England',589,'57197','959467760895',/*!50705 0x0000000001010000004C42D8DFC852F1BFBA826DC493FA4A40,*/'2014-09-25 22:33:42'), +(503,'1416 San Juan Bautista Tuxtepec Avenue','','Zufar',444,'50592','144206758053',/*!50705 0x000000000101000000A6684018D30B4B40078662E1DA033140,*/'2014-09-25 22:32:29'), +(504,'1 Valle de Santiago Avenue','','Apulia',93,'86208','465897838272',/*!50705 0x000000000101000000CAFED4D3A2EF3140584D7C5AEA504440,*/'2014-09-25 22:31:43'), +(505,'519 Brescia Parkway','','East Java',318,'69504','793996678771',/*!50705 0x000000000101000000A3C794B487E15B400A230736F8841EC0,*/'2014-09-25 22:31:33'), +(506,'414 Mandaluyong Street','','Lubelskie',314,'16370','52709222667',/*!50705 0x0000000001010000000FE6C0BC1191364020F0C000C2A04940,*/'2014-09-25 22:32:43'), +(507,'1197 Sokoto Boulevard','','West Bengali',478,'87687','868602816371',/*!50705 0x000000000101000000109546CC6C1B56408F0FC4C3C5B53A40,*/'2014-09-25 22:31:27'), +(508,'496 Celaya Drive','','Nagano',552,'90797','759586584889',/*!50705 0x000000000101000000254E3805034961402486D3388A334240,*/'2014-09-25 22:31:54'), +(509,'786 Matsue Way','','Illinois',245,'37469','111177206479',/*!50705 0x0000000001010000000F3B9D75570556C0FA91C77839C34440,*/'2014-09-25 22:33:54'), +(510,'48 Maracabo Place','','Central Luzon',519,'1570','82671830126',/*!50705 0x000000000101000000223999B8D53A5E408D87AD8F3D2D2F40,*/'2014-09-25 22:32:39'), +(511,'1152 al-Qatif Lane','','Kalimantan Barat',412,'44816','131370665218',/*!50705 0x000000000101000000107FA88F9B545B4021037976F9D69FBF,*/'2014-09-25 22:31:34'), +(512,'1269 Ipoh Avenue','','Eskisehir',163,'54674','402630109080',/*!50705 0x000000000101000000E9D32AFA43853E40767D303A6AE34340,*/'2014-09-25 22:33:24'), +(513,'758 Korolev Parkway','','Andhra Pradesh',568,'75474','441628280920',/*!50705 0x00000000010100000031DA99F859285440AF528BD2EF843040,*/'2014-09-25 22:31:29'), +(514,'1747 Rustenburg Place','','Bihar',110,'51369','442673923363',/*!50705 0x0000000001010000000BFD5DE9C62E554041C4BC7D0CC83940,*/'2014-09-25 22:31:14'), +(515,'886 Tonghae Place','','Volgograd',259,'19450','711928348157',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:50'), +(516,'1574 Goinia Boulevard','','Heilongjiang',502,'39529','59634255214',/*!50705 0x00000000010100000017128B73AFBF5F40C5ECC094DC514740,*/'2014-09-25 22:30:43'), +(517,'548 Uruapan Street','','Ontario',312,'35653','879347453467',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:38'), +(519,'962 Tama Loop','','',583,'65952','282667506728',/*!50705 0x000000000101000000FA545FA722DD6440AA7A9EE4B321E1BF,*/'2014-09-25 22:32:19'), +(520,'1778 Gijn Manor','','Hubei',594,'35156','288910576761',/*!50705 0x000000000101000000E358727044305C40A58A3D0F49104040,*/'2014-09-25 22:30:50'), +(521,'568 Dhule (Dhulia) Loop','','Coquimbo',127,'92568','602101369463',/*!50705 0x0000000001010000000000804A296FC5C1DDA85F330AC13EC0,*/'2014-09-25 22:30:30'), +(522,'1768 Udine Loop','','Battambang',60,'32347','448876499197',/*!50705 0x000000000101000000708802C7AFCC59402ABC15D396342A40,*/'2014-09-25 22:30:24'), +(523,'608 Birgunj Parkway','','Taipei',116,'400','627425618482',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:14'), +(524,'680 A Corua (La Corua) Manor','','Sivas',482,'49806','158326114853',/*!50705 0x000000000101000000936EF02A10824240F2F6D676C9DF4340,*/'2014-09-25 22:33:28'), +(525,'1949 Sanya Street','','Gumma',224,'61244','132100972047',/*!50705 0x000000000101000000943F29A406696140E4CA8FAE88284240,*/'2014-09-25 22:31:47'), +(526,'617 Klerksdorp Place','','Khanh Hoa',366,'94707','574973479129',/*!50705 0x0000000001010000004A1751C96F4C5B4032F504D37A7D2840,*/'2014-09-25 22:34:07'), +(527,'1993 0 Loop','','Liaoning',588,'41214','25865528181',/*!50705 0x000000000101000000B65E1D119D8E5E40171A3ED818554440,*/'2014-09-25 22:30:49'), +(528,'1176 Southend-on-Sea Manor','','Southern Tagalog',458,'81651','236679267178',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:39'), +(529,'600 Purnea (Purnia) Avenue','','Nghe An',571,'18043','638409958875',/*!50705 0x000000000101000000962364204F6C5A407A6D365662AC3240,*/'2014-09-25 22:34:07'), +(530,'1003 Qinhuangdao Street','','West Java',419,'25972','35533115997',/*!50705 0x0000000001010000005EA516A55FDC5A40A21639FA4E3A1AC0,*/'2014-09-25 22:31:35'), +(531,'1986 Sivas Place','','Friuli-Venezia Giuli',551,'95775','182059202712',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:44'), +(532,'1427 Tabuk Place','','Florida',101,'31342','214756839122',/*!50705 0x0000000001010000003C702942C57C54C02A5D555117903A40,*/'2014-09-25 22:33:47'), +(533,'556 Asuncin Way','','Mogiljov',339,'35364','338244023543',/*!50705 0x0000000001010000006B6DD04D51583E40673513C259F54A40,*/'2014-09-25 22:30:13'), +(534,'486 Ondo Parkway','','Benguela',67,'35202','105882218332',/*!50705 0x000000000101000000BD83E9C59ACF2A40B9FA56900B2729C0,*/'2014-09-25 22:30:02'), +(535,'635 Brest Manor','','Andhra Pradesh',75,'40899','80593242951',/*!50705 0x00000000010100000079FA52897C615440D2C9ADA4708A3040,*/'2014-09-25 22:31:13'), +(536,'166 Jinchang Street','','Buenos Aires',165,'86760','717566026669',/*!50705 0x0000000001010000003EB896242A434DC0E0771DBB556D41C0,*/'2014-09-25 22:30:05'), +(537,'958 Sagamihara Lane','','Mie',287,'88408','427274926505',/*!50705 0x000000000101000000BED29E37BA1761409B5F837467884140,*/'2014-09-25 22:31:50'), +(538,'1817 Livorno Way','','Khanh Hoa',100,'79401','478380208348',/*!50705 0x000000000101000000944A78422F4A5B40236D3E09C7D72740,*/'2014-09-25 22:34:05'), +(539,'1332 Gaziantep Lane','','Shandong',80,'22813','383353187467',/*!50705 0x000000000101000000BC2F1D2911815D4074B0A316EFAE4240,*/'2014-09-25 22:30:31'), +(540,'949 Allende Lane','','Uttar Pradesh',24,'67521','122981120653',/*!50705 0x0000000001010000008C91DBE5119E534039A8B34934E73C40,*/'2014-09-25 22:31:11'), +(541,'195 Ilorin Street','','Chari-Baguirmi',363,'49250','8912935608',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:29'), +(542,'193 Bhusawal Place','','Kang-won',539,'9750','745267607502',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:07'), +(543,'43 Vilnius Manor','','Colorado',42,'79814','484500282381',/*!50705 0x0000000001010000009389004C3E355AC0D03582435EDD4340,*/'2014-09-25 22:33:44'), +(544,'183 Haiphong Street','','Jilin',46,'69953','488600270038',/*!50705 0x000000000101000000AFA3607C87B45E4038A85890C1CD4640,*/'2014-09-25 22:30:30'), +(545,'163 Augusta-Richmond County Loop','','Carabobo',561,'33030','754579047924',/*!50705 0x000000000101000000CC0C1B657D0051C06B7F677BF4522440,*/'2014-09-25 22:34:05'), +(546,'191 Jos Azueta Parkway','','Ruse',436,'13629','932156667696',/*!50705 0x00000000010100000067A9ABF188F83940CD6CA1759EED4540,*/'2014-09-25 22:30:23'), +(547,'379 Lublin Parkway','','Toscana',309,'74568','921960450089',/*!50705 0x00000000010100000090920D5AFEA62440CC13BEADAAC54540,*/'2014-09-25 22:31:44'), +(548,'1658 Cuman Loop','','Sumatera Selatan',396,'51309','784907335610',/*!50705 0x00000000010100000018D75306E9885A40E8209EDB3A4E01C0,*/'2014-09-25 22:31:34'), +(549,'454 Qinhuangdao Drive','','Tadla-Azilal',68,'25866','786270036240',/*!50705 0x000000000101000000419479F53B6619C04F09E3022B2B4040,*/'2014-09-25 22:32:16'), +(550,'1715 Okayama Street','','So Paulo',485,'55676','169352919175',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:22'), +(551,'182 Nukualofa Drive','','Sumy',275,'15414','426346224043',/*!50705 0x00000000010100000079F71109F099404055BBCBEAC29E4940,*/'2014-09-25 22:33:32'), +(552,'390 Wroclaw Way','','Hainan',462,'5753','357593328658',/*!50705 0x000000000101000000F70FD88B57605B40364E5480393E3240,*/'2014-09-25 22:30:41'), +(553,'1421 Quilmes Lane','','Ishikawa',260,'19151','135407755975',/*!50705 0x0000000001010000008F9F32A30414614053AEF02E174C4240,*/'2014-09-25 22:31:49'), +(554,'947 Trshavn Place','','Central Luzon',528,'841','50898428626',/*!50705 0x000000000101000000C56DD9C644265E4002B5BD82D9F52E40,*/'2014-09-25 22:32:40'), +(555,'1764 Jalib al-Shuyukh Parkway','','Galicia',459,'77642','84794532510',/*!50705 0x00000000010100000090FFB8B3651721C09DB23FF5B4704540,*/'2014-09-25 22:33:10'), +(556,'346 Cam Ranh Avenue','','Zhejiang',599,'39976','978430786151',/*!50705 0x000000000101000000A0E63FFF188D5E4056DBA8A9C0023E40,*/'2014-09-25 22:30:51'), +(557,'1407 Pachuca de Soto Place','','Rio Grande do Sul',21,'26284','380077794770',/*!50705 0x000000000101000000A3CEDC43C28449C0608209922DFD3DC0,*/'2014-09-25 22:30:14'), +(558,'904 Clarksville Drive','','Zhejiang',193,'52234','955349440539',/*!50705 0x000000000101000000E5886B6BFA2A5E4038E04E7D7B7A3E40,*/'2014-09-25 22:30:34'), +(559,'1917 Kumbakonam Parkway','','Vojvodina',368,'11892','698182547686',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:34:11'), +(560,'1447 Imus Place','','Gujarat',426,'12905','62127829280',/*!50705 0x000000000101000000667F4523C4B25140819C8B1AA74A3640,*/'2014-09-25 22:31:25'), +(561,'1497 Fengshan Drive','','KwaZulu-Natal',112,'63022','368738360376',/*!50705 0x000000000101000000938FDD054AE43E402AF97DA42DEB3DC0,*/'2014-09-25 22:33:03'), +(562,'869 Shikarpur Way','','England',496,'57380','590764256785',/*!50705 0x000000000101000000894FF003460D08C0828472ECEAD24A40,*/'2014-09-25 22:33:40'), +(563,'1059 Yuncheng Avenue','','Vilna',570,'47498','107092893983',/*!50705 0x00000000010100000046B82462A5473940BA0ACE8536584B40,*/'2014-09-25 22:31:58'), +(564,'505 Madiun Boulevard','','Dolnoslaskie',577,'97271','970638808606',/*!50705 0x000000000101000000F0D46D9A8808314023A93B05AF914940,*/'2014-09-25 22:32:44'), +(565,'1741 Hoshiarpur Boulevard','','al-Sharqiya',79,'22372','855066328617',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:30:56'), +(566,'1229 Varanasi (Benares) Manor','','Buenos Aires',43,'40195','817740355461',/*!50705 0x00000000010100000014DA28A1AA2A4DC02E156580555541C0,*/'2014-09-25 22:30:04'), +(567,'1894 Boa Vista Way','','Texas',178,'77464','239357986667',/*!50705 0x000000000101000000C1D1448EE32858C0AD8D0CCDD0744040,*/'2014-09-25 22:33:51'), +(568,'1342 Sharja Way','','Sokoto & Kebbi & Zam',488,'93655','946114054231',/*!50705 0x0000000001010000005B087250C2F41440E711ED74311F2A40,*/'2014-09-25 22:32:27'), +(569,'1342 Abha Boulevard','','Bukarest',95,'10714','997453607116',/*!50705 0x000000000101000000924FD9FA331B3A40B1CBA61254374640,*/'2014-09-25 22:32:46'), +(570,'415 Pune Avenue','','Shandong',580,'44274','203202500108',/*!50705 0x000000000101000000CC3857DE1F705D408F26CDD545F34140,*/'2014-09-25 22:30:47'), +(571,'1746 Faaa Way','','Huanuco',214,'32515','863080561151',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:33'), +(572,'539 Hami Way','','Tokat',538,'52196','525518075499',/*!50705 0x0000000001010000006F302F1BF8464240AD7B759F2D284440,*/'2014-09-25 22:33:29'), +(573,'1407 Surakarta Manor','','Moskova',466,'33224','324346485054',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:56'), +(574,'502 Mandi Bahauddin Parkway','','Anzotegui',55,'15992','618156722572',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:34:03'), +(575,'1052 Pathankot Avenue','','Sichuan',299,'77397','128499386727',/*!50705 0x000000000101000000AA054026E3F05940CCC12275F18F3D40,*/'2014-09-25 22:30:39'), +(576,'1351 Sousse Lane','','Coahuila de Zaragoza',341,'37815','203804046132',/*!50705 0x0000000001010000006AB86D84EA5A59C027AA12C028E83A40,*/'2014-09-25 22:32:10'), +(577,'1501 Pangkal Pinang Avenue','','Mazowieckie',409,'943','770864062795',/*!50705 0x0000000001010000001646C4DED5B43340308AD46AFE454A40,*/'2014-09-25 22:32:43'), +(578,'1405 Hagonoy Avenue','','Slaskie',133,'86587','867287719310',/*!50705 0x0000000001010000002431F77FC41F3340F5B06197F2654940,*/'2014-09-25 22:32:42'), +(579,'521 San Juan Bautista Tuxtepec Place','','Qaraghandy',598,'95093','844018348565',/*!50705 0x0000000001010000006848CB3711F15040E32A604C44E44740,*/'2014-09-25 22:31:56'), +(580,'923 Tangail Boulevard','','Tokyo-to',10,'33384','315528269898',/*!50705 0x00000000010100000078E5C468A76B6140C3A27D079ADA4140,*/'2014-09-25 22:31:45'), +(581,'186 Skikda Lane','','Morelos',131,'89422','14465669789',/*!50705 0x00000000010100000048C2BE9DC4CE58C0DA3DD4111BED3240,*/'2014-09-25 22:32:05'), +(582,'1568 Celaya Parkway','','Kaohsiung',168,'34750','278669994384',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:15'), +(583,'1489 Kakamigahara Lane','','Taipei',526,'98883','29341849811',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:16'), +(584,'1819 Alessandria Loop','','Campeche',103,'53829','377633994405',/*!50705 0x0000000001010000008636A5611DF556C0374F1A0F5BA53240,*/'2014-09-25 22:32:02'), +(585,'1208 Tama Loop','','Ninawa',344,'73605','954786054144',/*!50705 0x000000000101000000314F9DFD378F4540961EF23BF22A4240,*/'2014-09-25 22:31:40'), +(586,'951 Springs Lane','','Central Mindanao',219,'96115','165164761435',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:37'), +(587,'760 Miyakonojo Drive','','Guerrero',246,'64682','294449058179',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:32:08'), +(588,'966 Asuncin Way','','Hidalgo',212,'62703','995527378381',/*!50705 0x000000000101000000EBBD4230D89A58C0E30632F1FD233540,*/'2014-09-25 22:32:07'), +(589,'1584 Ljubertsy Lane','','England',494,'22954','285710089439',/*!50705 0x00000000010100000035385B8AF577F6BF8C7560EFB4734940,*/'2014-09-25 22:33:38'), +(590,'247 Jining Parkway','','Banjul',54,'53446','170115379190',/*!50705 0x0000000001010000001BE4E434FA9330C08A8F4FC8CEE72A40,*/'2014-09-25 22:31:04'), +(591,'773 Dallas Manor','','Buenos Aires',424,'12664','914466027044',/*!50705 0x00000000010100000009C3802557204DC0B75CA21FB25C41C0,*/'2014-09-25 22:30:06'), +(592,'1923 Stara Zagora Lane','','Nantou',546,'95179','182178609211',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:33:17'), +(593,'1402 Zanzibar Boulevard','','Guanajuato',106,'71102','387448063440',/*!50705 0x000000000101000000FCB7DCAA353459C05CA8A1B206863440,*/'2014-09-25 22:32:03'), +(594,'1464 Kursk Parkway','','Shandong',574,'17381','338758048786',/*!50705 0x0000000001010000008CA2073E86C65D40055669E6245B4240,*/'2014-09-25 22:30:44'), +(595,'1074 Sanaa Parkway','','Loja',311,'22474','154124128457',/*!50705 0x00000000010100000092DBE51112CD53C00EF96706F1F10FC0,*/'2014-09-25 22:30:55'), +(596,'1759 Niznekamsk Avenue','','al-Manama',14,'39414','864392582257',/*!50705 0x000000000101000000044D9539A74A49401224004922373A40,*/'2014-09-25 22:30:11'), +(597,'32 Liaocheng Way','','Minas Gerais',248,'1944','410877354933',/*!50705 0x000000000101000000C2757BFFD5AC45C0424F1432A1C335C0,*/'2014-09-25 22:30:19'), +(598,'42 Fontana Avenue','','Fejr',512,'14684','437829801725',/*!50705 0x00000000010100000000000000000000000000000000000000,*/'2014-09-25 22:31:09'), +(599,'1895 Zhezqazghan Drive','','California',177,'36693','137809746111',/*!50705 0x0000000001010000003EC7ECD1407C5DC057FA1A930FE34040,*/'2014-09-25 22:33:51'), +(600,'1837 Kaduna Parkway','','Inner Mongolia',241,'82580','640843562301',/*!50705 0x000000000101000000D61A4AEDC5465C400E64E2FB87834440,*/'2014-09-25 22:30:37'), +(601,'844 Bucuresti Place','','Liaoning',242,'36603','935952366111',/*!50705 0x000000000101000000B88086EDDD6D5E407CED9925018D4340,*/'2014-09-25 22:30:37'), +(602,'1101 Bucuresti Boulevard','','West Greece',401,'97661','199514580428',/*!50705 0x000000000101000000AAC1EA7E04BC3540E65F26E5491F4340,*/'2014-09-25 22:31:07'), +(603,'1103 Quilmes Boulevard','','Piura',503,'52137','644021380889',/*!50705 0x000000000101000000AD9685C0DB2B54C09B012EC8969D13C0,*/'2014-09-25 22:32:34'), +(604,'1331 Usak Boulevard','','Vaud',296,'61960','145308717464',/*!50705 0x000000000101000000CE273CB203881A40205734E72A424740,*/'2014-09-25 22:33:14'), +(605,'1325 Fukuyama Street','','Heilongjiang',537,'27107','288241215394',/*!50705 0x00000000010100000017540A70700160401E1C47077F7D4740,*/'2014-09-25 22:30:44'); +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; + +-- +-- Dumping data for table `staff` +-- + +LOCK TABLES `staff` WRITE; +/*!40000 ALTER TABLE `staff` DISABLE KEYS */; +INSERT INTO `staff` VALUES (1,'Mike','Hillyer',3,0x89504E470D0A1A0A0000000D4948445200000079000000750802000000E55AD965000000097048597300000EC300000EC301C76FA8640000200049444154789C4CBB7794246779FFBBF78F7B7EBE466177677772CE3D9D667AA67BA62776CE39545557CE3974EE9EB049AB95563922104142580830D10203061BB049064CB031D916C160100284505AEDEE4CDD3F16B8B7CE73DE53F5D61F75CEE7BCF53CCFF7FB561DBB7CE9AD972FBDF5AECB6FBD74E7A3B75F7EF4CE7BDE72E9AE375FBAFFCD676EBFF7E29D0F9F3D7BD9303A92AC8360A5522E61088A00300622188051204102385644C8124E950912204880C0F21853A6A92209676012C06990A0CB3859C62808C3CB3003A1641921CB180D6234003325902D95C94C86C966A86C9ACEA5CA81CDB27F1D8DF9F14490CDC5D95C5CCE27B472522EC49844B05E29184056C945D552422D25D84C90CD04F95C984985F8748C4F44D46C522F64D864442EA6A572462C25996C8429249098BF12D9C1E20120B8C91653643E51490489428A2E66987249ACA002849145982EA322C112658C864812C0E90ACEC0040D123AAD8A284F950906205810672B140D900226B218C713028F0A5C85E32A0C03522C44E34504875008A8C8927EEEFCA5BBEE7DE8AE871EBDF0C003F73CFAC8B1BB2EBFEDF29D8F5FB8F8F0A5BB1EBD7CEF5BCEDD71FF85CB0F9EBD78E7DE99DB74AD45E10250444B0510016014800800C14B2809E07809C54B1851C689328E17501220D0324602045E40C9124E02C48DBB1480D365942CC26C056311944711122813C5229ECBE2990C914E9603DB807F13086CD0F190988DC9F94415CCB570A0854335B824173242294D6782423E24E443423E822536E1B897486DD3A91D3AB5C366FC74C2C7A5836C3CC0C6035C2C40C5FC7432C8642368C247A4835436CC64634C22C8A7237236C6A5C27C3AC2656242298D6523C5F0269189C2B11099CF50C502532EB330C256300AC2049C61119C81310240280067408A0648B642B1158286480A2469882201820249A642B310CD801403527C85E1209A85691663A1228C54F05AB5D5DADDBBE7D147EE7AF8A163E72F3E7AFB9D8F9DBFFD814B773D7C70F1AE33B7DDD1E81E08A24A935C2A9C2EA64A4809C5000C2FA16419A3009C2A134419BFF124B480604594047012C0310027CA380D90741967201C2F827419654A0857869862498241B298C6F3712413CEFAD7C0C8361A0F10C980524AE950BA43011DA2A8436915CAF2C514920856627E20E4A3B2692693147209261562124134B84DC6FD74324865C3487C07087841DF1AB0B30AFBD74B1B1E787B1DDCF696FDEBE5C00618D929873673016F251980C2DB68CC4FC6836C3A7C23986C84CC84A85C8407E25A252396E22290620A09BA98A24A19B29CC70A39A602321590864012006910E16092063106C24910254194A9504C85A20192020916A6599826CA1803910C48B120C5C32C0B3354851571A152A8948B2545931B9DEEB14BF7BFE5D2BD8F9EBD748F5A6BC98A41537C269E85CB289005299044F2305644711027011C2F22371063008E9631285F21CA380352148451084102385142D9322A962B7CB1CC95CB5CBE48C49368288004B6A84480CB47944ABACD426DBA52830B6A31A514925C2622E6E364CA4F27835822145F77D3A57C53128058ACC5F1171BEDBE1327FA7A4F0C8EF44E4E8DF69C38393F3A3BD33FE199B56CDAEC6BB3B39BF316EFCCECDAF48CCF66DFB6D9B61D8E759B6DDD665BB558D66D36AFD5BA323BBB3C35E5181EF4DB6DA125BBCF3A1B5D7164B63CA98D95D4C64A39B0412676D88C9F48FAB0A49FCAC5987C98CE45D8629203334C39451412443EC3944B3C54E64080AB54681061419C2EE31C4453004E43248D92144290304E02380D512C44B3104D81340D0B6C45A0218A822914C62A25F8D8F93B1F508DB6C8A918846300564A9780220C1730B48C61008E9410A484A005182FA11C4C13259402701AA2D03286161034073300C15530AA5CE12A0857A960D90C968997039B683450F6AF51898001645B70B105E7CFF26815CA08F988988DB1C98896CF70B1041E89947C3B21CFF2A6C3E15B5983A2D9C72EDCDDA0C58991C11DFFA6DD6E8F6D47DE7AFB83055F86CEE1E570E1AECE9D5327A7C74E8FCF0E4C0596BC2B13733BB6C5B06B25EEF6445CCB21B72BE45A0CB95C81C5C56DABDD333BE7999DF33B1683CEA51D8B6D7BDEBABD60DDB25A5DE3E37EBBC33B37B36D5BF03916226E477AD35DF07B8B813534E1C3E2DB543AC0E4A35426CA1693742949151364362694F31C50E421882D43540961008C054906227984A1009CA9504C85A6409A85580A247954A0409AA9B03444B13043812455618FF19C0697513007DD286568BE82830454ACA020766304732005925499C0F3085644E15C052FA14C85C28B150EC0D862450041329FC1B309A694CEFBD6887490C946A4726297812E6A740B2B1AA5A4928BF2C90019DBD6F34922E8CB6DAC6FCCDBE6FBC6E6FBA796275D3E977F71CADDF3D7438E593703323ECFF6DA8ADBBFB1E1B63993A1D4AA737D62CAB9B916298481B7DDF97630494C4D2EF69D189BEA9F754E39DDF3CE7224CE148B125886A37E381C404301381CA0B3C962C85F8A04CBC120140815BC9BE995B5AC7733E1590BDA9D914557C8B1E85BB06D5AACDB56FBD6826DDB6ADFB6D9422E47C2EBCA6CB9735BAB40700B8D07F144904A87B84C84CBC4F044902F66D9428E2E1479A02240185F2139886020122FA11CC252204D012C0B334C85A6409204081EE5688864619A01A963A574192D205499C072305140A9124E0244A504574A3090072B25B852A8E0258C2CE168B6821511BA8233102A61049EC98A00C017F248D457F2AFA3091F96DCA1B2FE265DEAB2151D4A8BA538990AF2D9A8544849B92416F2C51C76F7D4C4DAFCFCF8ADA7E77B266FD72E9CE5CF465CC9A953D6FBF61E640BF4A7DEFD91AF7EE4D3C5ED6868C3679FB7B99D4B81ADE0F0F0F49B4E0E5A2CCBBDBDA354857FF4F263B3D34BCB4BDB7DA7272D73AE9E937D03A74FAD2DDA7DEEA5947F0B4E46E86C92CBA5B9420A4985E174188A07E068108FC7A04008F487E048140947E14000DCF617D7B7B3EB3BE9B5ADE0E2CAEAF4BC676ACE3536611F1A724F4D6D5AAC3EBB33EE5E2DEE6C83812D2CECA713113A192693112A93A033693A9763F345AE0CD045808550B64250204143140B7302C6B33073A372F208C3C1348F5064193B861551BC84B1108D6610228F93058228E34809858B085C84310043CB2892AF50004E14501EA1F002C043105D28E0A918998E96031B5422241512B7E9CC818434C882588E4AC5189B0E93E90818DA8A7B167DD679F7F8987B6CC237B7B03636B338343DDF3BB9A79EF9CE3F7FBFEC87B3DE9C06AABFFAF62F7EF895EF7CE2BD1F4C6C04FA6FE9EB3F3DDA7362787AC2F657379D762FED6029E2E1330FC6E3C5891947AB7EC6625D8D07F3B37D0BF99DF2A6D377FAE4C0C0E070DF70BFCD6AF13AED602CCC17B37C31CD43D94A2A88E642702A486793543A852792642A4DA553783CC6263354328D4513782255094791700C8B26B26BDBE9B5ADE0A2C73BEFD8B42E3B4666BCB30B5B566B687129ED5DCB6FAF43E11D3C1946E3612C1EA3B3C91BD0E95289AB60375A141AA2B0224E02140D312C44B3154A4458BE428A047B8C2893952C8C1630AC886345F4461626CA185EC2F012861610BC841225B8CA8A54A18C65F26034866753E5E00E14F5E1C95087410F44AA8A16A5728A4A07C8949F4A872AD1ADE4DA926766747566C23339B1393FE7199FDC9CB284AD9EB873B3E88D9C97DBEF79E4C9076E7BE4AD0FBCEBD5DF5CF9FAE7BEEA77BBFD5ECFCCD0000BC1B1EDE82DA7C7FA86E68E9F1A5F746CCC2E2CF7F74F6EAF852EECDE21D3DA7D17EF8532151EE2C60627D2C18C757E7966CAD1DF3736303CD173AADF32679B1C1D9B9D1849473665129091928C9578282B560A742EC516726CA1C0158B54362B56003C9BA2D2593693E7B205269BA73359B15066B2F94A2496F70722ABEBC165CFDABC7571646A7966C63936B969B3FB975DD13537120FC3611F9608A1F1209A0C6199289ECB9225808371B642D0659C0609A28C513045FFB939218BF0B11B94D102F627D0650C0330B80863204200085E045908E640A0928822A9786667BD1209A0D180544875A9CA059996C034960A20091F9208147DDEF4FACAFADCC48E6DD6353EBC3A35B93A3519762EE5D6D64AEB1B44284E470A6A1A3B4355DF7EFBA37489424AE8F9B317280CFDC033EFFADEBFFEEB45BD3172B29F28A05812A172F43DDA25280A1752F0A99323E56CE52DF7BDB9C6AB3A275F689F7DDF934FEB185723C50F3DFC546A3B3D3562ED1B9A3D3934DD3734776270AA7F6CE664DFE0C050BFD33613D9710B58C9A0611ACCC3F914512A4838CA43A008410C04F010284215B654668A25B654624B25329F21F319269F253319229DC6532920120522D1B87733B8ECD998B72D4E4CAF596CEB0BD66D9B2DBFEDCBEFEC94833B9564008CFB2AA90859C852C52253020508612A300154E80A4E96311E6138883886E531BC8063798428627811C14A15048091729904402C9FA74B45329F02233B50D497D958A1D2915D0E3F2391B7A994588ADF900CB9E07A62CBBDB368F5CECDAC4E4D7A26A7DC139341E76276DD8B04C25236A7E6B25C3CC6A7B24CBCF0CCFD6FA73395DB9BE72E76CF7FEF6BDF345F7BED4B9FFED403976E0FF9FCE303E32B4E8F8A2BF18D58EFE941B7C3ED5FF73F7CDB7D3ECF8E460A3A4EBDF9EECB0FDF7D9902219D65E85229B0B989E5C091BE89C153E3AB2B3B3373CBBDC3F3C70726DF746AE4E4C0544FFF68EFE0C0E0D0E96DEF32944F8A389A8F86C9524925491682781896494A262909C6040851304CC410B6027230C440000D1629A080E7D264214B15B2782683A5334CAE804653B9ADE096CDE599B5D847C6D72DCE4DEBD2966329B6EE2D4782E5C80E1C0F208920934BD1B9140B142502A32B3003A13CC2A0F9CA312A8F72108D6440B20833208297CA2450C68B59BA9841E2E17260B3ECDB108B993A0E9E535815C943B18DF496034B050AC1CDF8BA7B67D1EA1C1B738E8DBBC626020E676A6DB5E4DB2192292C9EC4E2093A93653269369B497BD7F164765FAD3D7ED7231F7FFF473EF9B1673FF8DEBF3138C6E772CD8F8E2D599D17C5FD3BF4B36C119B1C9F9A1B9DA8F3F2D30FBD850660AB6DCE62B1CC4C4FEA0205A6433A85843CEE9999A9E9D999C1C1E1F1A189E1D3239363F3A3A3F376FB6A3E0E8C0D4FC5A2D9F1516BCF89B15B8E0FDFDA3B7CD39B8E3B2CF644284657D0A4DFA731549DE70D8613704263059D93658A574856A16885226592127082C5710AAAC8384E978A2C50E411900620B2502073792E57A652792A51C02299CC7A30E2DEB28ECED9261796666DFEE5E5E89A3BBFBD0E057D4070AB1CD981B2312497A10A65B942F115F21856C4498020CB185600A872998740AA904512C1ECA69B48863420776755BE54935B2C9AD85C2E86372B495F7C63716D61626972646972CC3539E99D9B0BBB56B21B9B6030406512442A82262254364D65B36CA1C0154A78322DC3D83BEE7BF0E37FFB810F3FF3F4673EF1EC57FEE51FDF7CFF1DB968C0B7B2B2ED5E1F3835B4BDBC5A8EA46580FAC0DB9F79E0ECE56D9767C5B6B0B2EC08EFF8458C991D199F9D1CF3781CB353A3BE8D35DB9CB5E7446F7FDF484FCFD0891343030353836333A706C6A6A71D9313B36B9E8D9D359F7DC675FAC458CF89D1D3FD63274F0F8E8D4EC100584E278972B1C6B367EB759DE34582964951177485165486D7395E657891667992E6495A24480E814512E330844350A602536590072A3C0032C512932B109912922840D17CDC1B5C9B77D947671C63939ED9B9A0D351F06D17433B85A8BF140F83F1185D285265F0185242A06C09C91744B842E653703C000637A974A886951EDAAF5E5048BE10AFC47CB9E0466AC71B5F75EF2C5A9726879C93C3CBD313EE999990CB5509879068048946C8749CCE27F06C0CCF27D14C922A16381024F3253C5BFAD87BDFFFD98F7FACA50A4F3C76CF079F7EFC0BFFF091671E7FF01B9FFDE4279E79E652736F6DDE550AA62B89FCD966EBF2D983E9B121EBCCCCC2F4ECE4F0F8D4C4349AAFACD9DDD36353535353531393F393D3B3C3D3237D13A74F8EF41C1FEA3B3132D6373D3F6E9D9BB49C1E1C1D181C9D199FF6D85D5B8BDEA981E9C193133323B6B909E760DFF89AC71B0D06B28948259FE9EA5A5BD35BAAA189BACCA9222349ACAC098AC249322B0A342F509C4CB13C490B0C2BB28CC20902C570284101B088E23400B0104496002455A472309D47CAC16CD21B0EB83657E79D6BF356AFC5B66577A4B6B7D281ED4C70078885E154F218552853C5229E4D8091EDD4FA6225BC5E437277D5E5F32A45A4FDB980BB10F216829B51F7D2B6D5BE69B17BA6A76D23836B96E9E89A1B0805A050904CC78964824826D04404CBC48952062FE76808A44B251A00F042E1AEB3075FFED4DF1F18D2C5B6FEAF9F79F6814BFB675A3209678AA90005E5AD03036778F5EFDEF2AE80CBEDF7AE62859CDD323F3B3EBD30639B1B9A999F9A9B9F989F1A98589C754E0D4F8F0D8E8F0E8F8D0E8C0DF78D0E9E1AED3F393C706278BC776CAC7F6C667CBAE7C4A9533D03837DA3B639AB656A6E7C607CF0F4F0D8C0DCF4B863626C616EDEB6B4ECDA58F7847D5B3C863765A92AC88AA4CB922189BA2C6AAAA0A982268B8ACC49322BCA14AF32A240F30CC54AAC28D2BC444B554EA3009447081A44C872850260AC006105184E03957811CF40D9ED987F6563D3E95999B1392667B75DAEF8CE563AB49309EE1CC3324920B88344FCE5ED35A590BC6C884D12E4C05472CB05C67D05BF37BEB6B4B930BF3E3FBF3C3EB9343AE9B55A239BEB99E00E1409A0F130998C6199389E4D51852C59C8E3C53C059619B84C43000D403C526970F42FBEFFEF77765B89B595F39AD055E865DBE4CCE4C0827D7A7A66ECF4F19B6518FEC1E73F0BFB433A04D76906CE16EDB30EDBB4D33669B74FD8A7062696E69C0B6373F3A3B3AEF9C5F989F989E1F1D1BED1C19EC1FE13FD233DA343C7474FDD3470F2D6DE5B6FE93979FCF4F15BFB6EB9A5B7E764FFE0C068DFE9FEBED383274E8DF40C4EF78ECCDC7C6A706074727276CEE6B00603BE7C324D21982A6B8AA2C98AA1C8862A6812AF899C2A8B9A24A822AF48ACACB0AA44CB0AAF72A4C053224F0802C6F3282B621C07E30C4CF0188D1560A280D00594CC4395441E8DE50BFE78D0B5BE3C6B772F385C16DB8E6735B1B17D0C8C8589540C0BFB0F18F44E836B92E5A8D796DB59CD6CAEC557DDCB1313CBA353AEB129E7F0A877763EBFEDCB0783F958B0140FC2E9289A8EE1A904954D53F93C5B2A89302C2008538178149671DC20992A4D3FF3D8638F5CB8B0BD60958AE5BB6AC69B77BB17758D2E021B8B1E4BDF946F764988E7E10D5F6E736B71623AE4DD5998B22E59561646173CD3AE886B7B7D61C539695D18B72C8C5BA64766A607A7C67BC7267A47077B067B4EF49EBCB5BFE7F8D0F19B066F7953EF4D6FEAB9E94D3DB7DC3470EBCD83274F0C9C3E39D073BCAFEFE440EFF1D1A1BE99FEFEE9E1B1F9BEE1C9DEA1B1DEC111ABCD914DE47882D7D59AAC18A2A4297255167459A80AACA28886C8A912AB28ACAA31AAC6A832A748ACCC5382408A322989382F138240711CC110304E54300A40C164162F95B17C194E16D074A91CCEA67DF1ADC5F5E5B925FB84D533673B96F36FD7C8CADD9DEA1989C453BEB8D7960AAC25D63CA145D7FACC827BDCE29958F04E5BC32E0F180E23C954391AA96412703E05E753582143E6724CAEC09501B60CF130CAC2088F622ACD180CD3E4C403D540E3C926497709AE59C1DF7BF7BD2B1323B3C38343BD837FF57FFD3F68ACF8ECA34F7CFCCD6FBB535323AE9535CBE29A6D2DB59D2E050A882FFB9EBBDEDA86A56DBBDB36363F3F3A3B333A3BDC373A7C6A6CA86774E8C4707FCF607FDFF0F1E3FDC78F0FF69C183D7ED3E02D7FDD7FFC96A15BFE7AA8E7D6D1D327C67A8F0F9FBE75A8E7E6A113378F1EBF69A4E7C4E8E99ED1A1C1C9E1A1A9A971CBDC843D164CD4E4BA26EA8656576443936B865CD3D4BAA6D60551E30595E71481554446D2445D14654190785E147985A70481160552100956A03806A3880A2662140BC13400502044952B58BE8C648B3788A736A32BD3CEE5C98563B7D7B4068D00B19D6C7035B6BD92F16F6CDA6C2BD373CEE149C7D0C4CAD87464C953F205A050048D258048144FA5F04C062B64D0521E2DE4895C512801328C8828AED09C4CB11ACBA90C5BE3E506AFB578A51C8E9D95AAEFB9F7E1CFBCEB3D77A97A6A6D756BC161ED9B4CACF8BEF881BFFBE3F7BEFBC67FFFB05ACAC75736D6665D22C03FFBF60F3C75DB437BB000AC46BDA3CEE99BC75C43CEB99333F3A7E7674FCF4FF6CC8EF7CC0C9F9A3A7D72E454CF407FDF48CFF181DEE3C3276F1A3C79CB70EFF1D1C11393C33DD3433D93FDC7C74EDF327AEAE6B1DE9BA67B6F9E3C75F3C8895B067A4F8F0CF48FF79D1A9B9F59B4CEDA399C93295613A4AAAC1B9C5665F586566B190D43D67549D34455979566B5A6F2BCA1C88AC04B1CAFF2B2C12B355E6D2BB57DBD5517B48E5A6FF0DA9E526FB1729564BA92AEA00C55A8A0E9828E712248492083A76028523A16D95CCE84367291ADF8F6FA9ACDB6383DEB989CB60C8E6DD8968AC108148E22F138994955A2613293C253292295C1D2391E840504112A904191225C9170B4C671755150285AA1E82A2F7434BD29AA4D56F8C83B9EB86F77EFDDF7DDFBC977BEE32E454283D1BC67EB6D676E7BEF030F986FBCF48EBBCF4EDEF27F9C23439955BF7BD0725939F795F7FCD325A28BB932CC52495F27D575525CC7293750B22722D33B9BA36BAB236B967EEB54EFFCC4C0FC58DFF454FFEC74FFECDCB0CD3AEA5C1A756D5B36B7E637BCB35ED794C736E1EA3B3E3970F354DF2D13278F8FFCF55F9FEC393978FAE4C8C0E9A98911AB7D6129B011886DF9F39154D217CB0553397F2CB5158A6F06635BFEF87620B2E5DBF17A53914878C7EF5D5973D91C6E9BD3B7BABE6C5F5A5D727B9DABAB8EE5F9B169C7BC6DC3EDB54ECEB9E6ECAE19DBA67D25B4BCE15FDA70CF38379DDE0DAB67DBE1F55A563616568E1563A16C68DBE75ADAB42F3AC6669726AC1B56777865138AA6CB81483918AC44C34034508E05C058984865B8324466CB54BEC495011182340C3728AACEF0128C7115A4C6092A46CA084EE64B1AC51DA8C613F7DE7B57BBFED885837F7AE65DE7782AE158B853129E7DEC913BABF2036D63E14D7FF568B5C9049272A8F244FBC1A7F7DFFE54F76D5F7CFB3F993F78C3FCDE15F3EB2F1E7EF9977FFCF4F77FF8D4673F79DB130F1207ED18C7788AC04AD63BB6B63AB1B63CE9764D795C539E55CBBAD7BA99742732EE44692357F101900F0838C31B16BF63C23D707CA2E7D6919E9EB19B6FEEEBE919E9ED1D3FDD37353232E3B2AF6C2C7957AD6EB7D5E3985AB28E3BBC76EFCAFCCABA636D7D71CD396377D91697ED4B8BB38EC5E9C5558BC735695F995B5C9E5BF22CAC6C3937D79D5B3E77706379DBE3F0BA16DCCB9695CDC54DC7A4C33EB3689F59F438BC4BB32B2BF39EC5C925F79CC7B7B875CCE77285573D8ED109D7E89C67D2EE997478E75DA1E5ADF0CA66606935BABA1E5A598D7ABD51AF37B2BE1E5AF76E2DAF84BC5B3EB737BAB1B5ED72F9DDAB1EFBA273D6BABDB2B9B1E45D73AEAC3BDD6E8B7DDDBA58DC893D75CFFD4FDF7BF99EA6FAED4F7FE873EF7FC77D2DE9BEAAF889C71F69C0650329CCDDF27F1ED2D58F5EBA3F36E67C4FE7D14FDCF78157BFFF92F9AA695E33CD43D3BC669AAF1F9A3FFBA5F99F3FFEE3E7BFFEEB4FFCCBCF3FF2F99F7DE80BDF7AFC631FD87D0C5B29A41CB1882316B08603CE70D81549AC26F21B39C807200108D82A96B7CAF9F5526239BB3CB13A3F641F393577EAF8C4F15B864F9E18EB393D716BCFE8C8F0C2C49025B0E40F2E06E36BC9A4371B5F4D473DF1DC4E21BF9DCF6E664BFE526E279FDCCA647CF962A00C8640305C2E45F3C568114E55CA51000883501404E3502952248A049EC3D00C82A7313483605914CD20953890DB4E6131904E22496FF4987D7462AEAF7F757ADE33B1E01EB37AC6EDDE19C7F294DD6B59599D5DDCB6AF6ED93CEE19E7967D75656EC96D5D765B966DE336D7F4D2BA7DD53DBFB4346D5F9C5D5AB2AC2C8C5B972D2B6ECBB273D2B632B7E89D7765D702EFBDF7A1A72EDD7687427EEDA34FD591F8ED1AF2E65DBDE475013BDE75CB58D831FB9BAF7C89F2EC109EC83FBFF393E68BA6F9AA79EDDAE175F3F0E8E8BA79EDC8FCDDCBD7BFFBBD173FF7B95F7DF463FFF1C4BB9EFBD0477FFCBE0FFDE793EFFFD203EFBD8C74E1B522B80E14BC40691300B6818A1FACF8003C5021823019C2103F0A6E41C57530E408AE4C79660717474E597A4FCCF4F64CBFE9E6815B7B477BFA2627C716344C6E12D536D3AEE1F53DE9A0C5B615581601DE80952AA2AA15B546D6254891408D2F8B7245E2619604080111144C6D732DA1C25365022F22148093658C2CE16409C74B2851C6907C4540388356906439ECDED9747A8F2D8F4FAF4E5A3C130B2BA30BCB2316CFA47D79D2E69AB0AECDBBB69D9E807B33E0DE8C78039BB6D5D0CA4EC41B8C6D84F3FE54CE970442B9FC4EB21CCC2219084E8344010513252C0DE26990C9227C962213009BCCEF91440BCE3FD8148D62F8C1B604FA3D21D77C66C3BD70FAE4072EDFFB9E33776C1D9F79F68EA7CC3F9AE675F32FC7E1E1A179649A57AEBCFCF5AFBFF80FFFF0D3F77CE04B0F3E76F46FDFF8EE537FF3E587DEF2E1FDBBBB195689B37C9C43FC2819C2983041053136424A714A8CD24284E1223CEE27E06D30E349F99DE1D9E195B1C1C5E17E4B7FEFF4A993E3A77A676EED9B9C9C710059B0CAEA0226CAB8AC108A408A1CCE4B842011028F3002C2B1102B618A848812264898C0B3024B730C4E73042393A280712C42722845000803130C8C912588292174199550A6104D07D77CAB768F6B7EC93A613916727A5C23B32BA30BAE61CBCAB86D79C2BE6EF780B17425912D8563595F104E66A07806CB94E16481CA237C9990209A29A0741E618B980852780160419C830816C425985011A68A0A4D5CB9A775DBDD8D7D3691D4F219BD98D2CA4928B09A5BF3C456DC8BC3A32B83530FB1DDC2E4FA6E5AFCF9E77F7C74DD3C324DD33C348FCC1B67E6D1A1F9EAAB2F7FED5F7FFDEC477FF8D4D35F79E42DE68F7EF8B9071EF8E0998B0FB07AA7C0F271824D5268B0C22629220873715A4AF34A8253E3422357ADA63531CAD32112DC2947DD49EB987BACCF36D6BFD07F6AAAF7D464CFC9C953C396D303D3384A7138A7B3AAC22A122D2994A45092C64A12CECA0477E352C07881142542940881A7388E643982516841664589E1789266608443311127B80AA662748757A91C90F545D7ECEE0DA7D735BFE49874EC2C6F1D0B2FAEBAC72DCB238F89FB0000200049444154A373DB0BEEED05F7F2A4CD35BBB0E9F4045737F2813007545800A04B25325F22F325B20411C5325E2891258006201646980AC4A1D80DF9C463B484D30242A8247BAEDA79DB5D0F7CECC9A7F0700C0DF8F9745CC82613AB4B5B76C7FCE9016023E4EE99AED8231FB8F484F9AA69BE6E1E99E675F3D0340FCDC3A33FADEBD75F3B7AFED72F7DE95FFEF7231FFCEE934F7EF8E0DCD1BF7DEB5DF5D6E37AB79545AB5952C9D06DB84A475025CB496956CE0B5256D4B28A92E01A79B95E90B5ACC4C739245849AFE7562DBEE9A1C591DED9FE5393BDBD93274F4DF40D5A4EF74D6108A9B3AA464A554E33244DE33583D3545A36385D262583D36546D1054316749953355E57249DA1788116554E151941E16599E5159A5169C620B936A7F065AC18486CD89617A76CF3A3738E499BDFBD03A74111A18F8596DC4BA3D3CEC1A9D4AAAFB8134B7877366CCE158BD33A3EBF383D1F72AF15C3611E023918A2CA6516426900E62A9842300282F128C621A880920A298A182713824C300A41D5686E5FD11FBF74FBFB1F7A4848263A950ABCBEA1E573E0D676CCB9DC05C9CF3FF8AE2F3DFAFE5F7CEADFCDD74DF3D0BC625E378FCCA3A323D334CD23F3E806ED177F6FFECFCF5EF8ECA7FEFB7DEFFEEA238FBCAFD9FD8F279FBE07659B49A49DA7B50459CB8B6A861793949C66E40CA7E6043EC32A59B19A136B79BE5612F5B22CE644324210317AD316B18C2C8F0F5806FA264FF78FF58ECC0C0C5B87A7ECDB3BC14EBD5BE50D8DD734A5AA4B5595AFEA7C4D650D8DAB1A42DD10EA55B1A14A7595AF1A724D91744DAD29A2210BBAC82B3C2BE8B222B3EC41B58EA50A255FDC3BB3B832B7681BB32CCD3813BEB888F24DA12AC32C9A2F1FF339576D43538EC1A9C256080A456E88432C91C9FB62BEC5F59579D7E2B4C335BBB8B5B85A0AA70C826E8BA24A9206C72A0C25919442732A2D6BB46CB0AA42493AABE98CD295AA1765FD2E43A71309369B092F3AFDB63924E2DF5998B940D1FFF9771F7AEE9F3EF1AB6F7DC3BC76CD340F0FFFFF79FAE8CFE395D7CC3FFCDEFC9F9FFCF263CF7EFDC1473FD23E7890E0DEAE75F672F86E896B141825811919464BB35A9AD333BC9AE5D42CA7A7C566516C14B86691AF978566453500A58337A938135E4E3BA7BCD323F6A181E9BEC189FEE199C161CBF4F4E2D6BA9F230555D06B7AABAA350DB95655EA9ADCD095A6263754A9AE2B4D5DA96B724D97AA55A956556A8656AF197543ABD6557DAFD66C882A98CC6E3856D717DC4B130EDB9035B8189461A123D46482D3399982101641191839E65FD9B08D4C2F4F2E147682370C7E349EA633393A5D600A7021908EAC451D938BCE29A76BC6115E590722718D209A92D0942595615586D7184567359556645A9328B52ED676C5EAE57AF3FE76F3DE66FDED775C0A2C2E2E4D4CB827C69DA74FDD8681DFFFFBF7FFEADF3E73ED85E7CCC3374CF3DA9179F817C87F617DEDA53F9A7F7CF9DA7FFFF8971FFBC4D71F7EFC83CD338FF1F5F300DBCA518D126FE4E86A9E5153949666F50CA7A55925496A695649324686A9E59856496896857A59A8019294E36A60B5BC0D6DD8FC3323B6A971EBA953A3FD83B3E363F6B91957702BAAF255436DD4AAED5AB55B37DA0DBDD5A8EEEA5ACBD0BABAD632F4B6AEB5AA5ABBAEB61B6AD390344D506AA2B267346A9C548EA4BD36F7F2ECE2D2F8E2A6758BC89012209DD3CF56194D26381E23798C94299AC3101A458F4556B7E7FBC69646A7A1600C8DC5D1589C48E5A874964CE6981C406400325BC13395CC76D235E974CD2E2ECD3AD69DCB50268D150B1777BB555ED05849675595D3645657B89A2E1867F4061C0E6970E99987EE7DE2EEBB626B5EDFD2CAEAD48CA77FF0A96EFD7B1FFD9B2B3FFEAAF9879F9B575E368FAE99E6E15FCAA1691E9AE6E1D1D56BE6EB578E7EF382F93F3FFBED673EFB1F6F7FEA1F2E3D743F6D9C87A54E9957F3AC96639524A92449394D8949424AD142921292149F20D51425C5F15A9ED7F39C5E106B90D6451B35B0CA2499D052D839E19A18981D1E981E1FB5CECD2C2FCCAE90105757BB55AD6DE8ED6AB55BAFB5EBD556DD686B4ADBD0F66E84AEEE56D5BDBADC69CA8D3BF62FDCB177562758389E5D9CB15AC7E797A6169746970A3BC57D71BF2B74AAB4B1AB75244290188E235991E6798C960986238863999DC8C2C0C4EAF44261C78FC51378228927B3642AC3E44A6C09E441940620AE82E9048F2421DF4AC035EB5A18B758672C8B367B707D83875183E1349AD70445936B92A86BA27E60B44B3BA14A28F8E49D173FF68EC7341808BBD7FC0ED7FAC8D88322F95F7FFFCC8BFFF985EBBF79CE7CE315D3BC7A74F88679787464FE395F9BE6D1D537CC2BAF9BBFFD9DF93FBFFCFD17BFF4930F3FFBC5071E7F52DD3FC8B39D92A8E705218A2A499A4F507C821213341BC1F938C1C6703649B251444BD34696D5F3829617F592D6429A67A82E1B23B2DE8C6BDA3DDA3F7BBA677472DC3E3BB93C3034DFD03ABB7BE714BD5533F6DA8DB3F55AA75EEB34EA7B55AD5D533A3565D750767575AF661CECD70EF695964250B140C83A61599E5B9EEB9D5D9A5A89AF252540BEA05FE8485D9DD57441AFF286CCC83223F324CB1194CCF22C4E720C7F2CE1DDB1F48F2E8ECD542231229D445271BA54C2331916006800A24088811111273818674152256516604AA1FCAAC5E398B4D9262CAE393B94CAB4657557ABEDEACD86546BC8C6B9E65E2118B10CF62556972AE1ED77DD73F9CE46CB677186E62C9D6CF46BEF79B3F98BEF982F3FFFFFB13EFA53CA3E3A3A3A3A3A328F0ECDD75E35FFF007F3D7CFFFF4539FFAF5273FF3BDA7DEFFC98B0F5EC8310705FE5C45DF2B291D4051322C1B23D818C1C5493A4E60A14AC50708494AC9B04641AC9614BDA455A16AA3526F80D52654CB6FE43C968D9961FB50DF8CDDBA363DEDE81D9C22604AD31B7AADDBA81D34AB676BDA7EA376B65ADDABD7F7EA46B765ECD6A46657DF3D573FE80875289AF53A56E626E717A6ACD671476E3BD3A49AE76AB735F84E8D6FCA8C7263B741E3759192245A921841A0380167648A6730EA5872D36F1D1C5F1818C3D219249D220B592893C68A790A045804A55194230816C7798C14304E40E92AA9EC0AAD2AAEA3496C65D6ED9A5E5A9E77B82DF6F466A046F27B4AF58EBDB3BB5AAD1C89AFDBAC9115D7FADC8458CC5D9024B5503E43D2A27FFD679FF9B0F99B1FBFFEFC73E6F537CCA3378E0EAF9847578F8E8E4CF3F0F0FA55F3E8BA79FD0DF3CA6BE64B2F992FFCEE0F5FFDDA1FFEE58BCF7FFCD35FBEFFF13331E81397DEFA44EDD2C3E241354B4B29524CD1540CA762389BA4980489071031C5A8395EC97206A0D62AB53A5C6FA1F51A583DCF9F0343F0F2ECFADCA87364607EC9B9393A65E91B9B2CA44BD56AD730766BB53355FDA0619CAF1967AA8D835AB5DDAAB6F76BBBB775CE9DADED6503C94DE79A6BC6E19C72DA279CB940B1C9B42EB66E6B2BBBBAD854A5BAC4681AAFABB45C13AA9A5093584564E4AA54A5115A26451E6539843D16F3FAE607C62D83137032C794CB74A988170A1408D0159842301A27789A12288A232811E7154E92295EA5A43A675C685DD049038E23AB56EFE2B46379D6B9615BCEEC84885CF940A9754839B3BA53DC0E82C15076DD1B73D89FBC70E173EF7AE276A4FCD37FFCE8D5FFF9AEF9C64BE6D1B5EB8757CCA337CCA3AB4747D76FB03E3A7CE34FAC5F7DD9FCE3CBE64F9EBBFACD6FFCE6539FF9D9079F7DF6ECDD5F7BDBFB1E661A0F0BDD7A8E5252B89022D41C8FEC007C82A2C2281326942CAFE5050350EA15BD8D351A48A38E181DA2755E3C0F45D06D5764AC7FDE32B33C3262E91D9BFDBF8FF796B358BD7ED6D00F0CFDACA19E33F4034DEB687AA3A1D7CF36769B9C5A891757E75C8E498775CC6A1F732009EC8C71FE62F78E83E6859A5CD7444395AA8A5833A48621D475BEA6F2D51B9B3B02ABE89221D1124F0812210A98782CBD1999EF9B708CCE677D51225726F325BA54622B188B902C427238C713BC48892C4E53082153BC420B2A236ABC2ED39ACAD6DAFA6E936F4111C0EFF0DBC71CF629877DCAEA77ADB6318A4A66B8542E6475CAF912ECF34BC9F8C71F7AE05111FBAF4F7DF0CA2F7E6C5E7DC53CBA6A1E5DBF510FAF1F1D1E1E5E33CDC3AB6FBCFAC69557CCA36BE6EBAF9AAFBE72E57BFFF9C2E7FEF1854F7FE2DBEF7CC7B3172EBD43DFBF13D53A39464B5142821453B492618D2CDF2C286A82E363A49AE58C826814A51AA4D560DD0035159655503E279CC1126472BBB030E1B2CE2C0F0FCEDD7C7ABCBF775A645B8DFAED9A7A50D5CED6AAE76BB533B56A7BB7B3A7906CDA17754DDA17C79C8B63AECD797FD8155341F962EB8E33F5DB6A4A47D35A9A68D4958621566FF4E0BA58574443127551D0784E91C4AAC06A022D09A4C8138244C8C7525B21CBE0C4F2B4B5104920D9229A2B60F93C55AEB020CE2394440837C4ABC8082223889428B3A2C22A32A70A94C2110A4FAA0AA3B7E4EE9EBA4F97B89037BA32EF5A9973E437834C3A776FAD9D5FDED0B3E53604BF7DB7FBE1CB97DE77A6F9DBAFFDB3F9FB5F9B47576F50368FAE9AE6B53FC78D996BE6F537CC575E32FFF882F9931F3CFFD94F7DFFA9A7DE576B7EEEDE47CE17B0BD3CD5CE3346861112A49C62950CAB24692DCD4A714A4DD0529C34B2AC92A18DA254AFE85550954A4C1DD3CF4B6774C42846A0E9219B6D76657CD47AD3C9F14D6F626FF72EA376BE513B575376F7EAE7CE36CF74B5165680D6ACAEE5D945E7A8C333B3165F4DB7D9BDB3DAF98BAD3B6A7CBBA91FE8725757DA75ADA9F3B59AD4D4C5BA26D434A1A62B7545ACA95253959A1CAD09BCCE332A474B3C258AB47A2CBD1D768ECF59C7A632810805C05801204A300B9202CCF0082360BC44CB2AA7898CCC5302C7CA22AFA882A6B0AA4C6B22A9A8ACA12B758937AA5A77BF75B1A51DECEA0775B6965C0F65573612F39EBB893ABD1C55B7939FBCFBBE1F3DFBB75F7CD7A3577FF203F3EAEBA67978F8A7BEE306E5ABE6D11BE6D115F3F015F3F025F3F5E7CDD77E75F4B36FBDF68DCF7CEB9D0FBF8D219F10D4C745FD224475F2683B8DE9314C89E15A8AD293849A40A43824252A721C9693081D05D050010EE5CBBE6C6E3B15F106032B7E34899DAFDDCE80CAE2DCBA7DD6333BE65C9EF776E48386B2B75B3B7BB17DFEBCB18B65CA5EE7AA75C2B6306AF3DAB632BEFC59E3B6DB5B97CF546FD3E56E55EBB66BDD86D6A929BB55B95B95BB2A5FAFAB5D43EDDC80ABF25585330CB966087595AF2B5C4DE46B02AF73ACCA328A2818C7921B61CBE08473D25288246810C18B2005E02C44F328C7C20C878922A908842CD39AC26B3CA7F0ACA4F15A9537EA62C3E0AA8658D559CD901A9250E7F9BA24340DA179C7DE1D68B21C9875DD2FEC99BF33CD6F3DBF17842E152A5F7FE2ADAF7CE78B47BFFE6FF3EA6BA6695E37FFEC3799D75EFBD54FDFF8E58F5EFEFE575FFEF63FFEF6CB1FF9DF4F3FF5938F3EF6DF1F78F8F30FEEBE852EDD0314AADBFE7339E0A08818D15C3552D0A3B01EC38410A44621255AE64259642B5A5A0F479CDEF0A2D76FF7AC2FACACCC2DBA2DCB8BF3CBABCE4D8F6543C1EB688E8FED942CE3EEA5D95509E4CE889DBB76EF38ABEFE6B7E2DB0B6EE7F89C75C2B638B5B269F735B9BD5DED42BB7E41D37615A35B6D1C548D4E5D6B34B55653EDD494DD1B4B5B608DBAB1A74A4D5D696B7243136A55B1A1F1BA2AE8BAD29484BA24D479D6E0688DA1D463595FD43238611F9D4192653C03E179982C635499E01086C3398E96385AE1195DE10C895554D950055DE37583D3ABBC5113AA35B96E480D4D6EE862B321B69B52A7AEB6778DAE01D1E846C0FCE36BE6B557CD6B87E6CBD7BFF4E05B9F69377FF0C9F799D75E348FAEFE59BA5C3F32AF9A4787BFFF8F6FFDEC0B9F79FE0B9FFAE9479FFE97FBCEBD5BC61E80538F32A55A78AD6C9F8297ECDCC6A6BA131236C3D5484E0FE58C08A08641350A09FE0CEB4BA01B8192673BE658B5F48FCEF68D2E0C4E5B87666D6316E794D33DE759B36FA5B6CB1C586B52E7D08C387A7A8188A0FB901A5BF0A800BD386E774E381CA3D6B599B5E052B4C1EE77E58B75FD8CA67524BD296B6D556D1B7AB36AB4EA46B7A5B71B5AA7AE7635A953537635A953FD8BBC549A86DAD295A6AA3454A5A14A4D4568497C4DE4748E56445A3D16DDD8B18FCE38C7E78AA1249E872900C740E4C62F37122D49AC2272BAC4D724DE105845E1355D306E24A91B6557E3AA9A68A852FD06EB96D46A29CD5DA9B157A19F68B7CD577F7BF4BB1F9B872F99575E315F7BCDFCAF1F3D7DAE63BEFC8279FDB5A31B86DE8DECFCEAAB7FFCE1770F7FFA83E7BFF40F3F7FF699BFEB1A8FC24023E8A7BDAB59DB7CD66E05979791152FE1D9AE86B35A20A5055246B8A8040ABC2F2D05739837585ED94A39D676661637E797DCD38ECDF9E5F5D9A52D8B7BC7EE8DAF8633BE6C2108B08056A3F665B8B561F1DF4EEE29FE726CDA55D9CE5A4F2FCCF45AB25BC51AD63D5BBDF3A071B9A59FAFEA07B2D696F58EA2B7B46A47D35AAAD2A86ADDBADA6ED6F60CB5A3295D43D9ABAA7B9AD2ADEABBBADE5594962AB774B5A3CA2D5D692B62A3AA7525BEF627DC8C7E2CBAEEB78ECED84767C0689E28204419C3109C82299160658A971959E53499ADCAC28DCF277455AA1A5243136ABAD8AC299D9AD2B961D6D4944E43E9B694764B69EE29F53328F3ED27DF6AFED737EF0B7BCDEF7DE38D9FFED8BCFA8AF9DA4B5F79FA89D77EFE63F3F0F523F3AA691E1E5EBF621EBEF6C2CF7E605EF99DF9FAEFCD5FFFF4671F79DFFBEAD5CB10A445E2B5745E0BA7D5684608C48D68965AF5939E801C48EB812CBF99E0B7D2F46692DC8CC1DE50D1BD13B3AD25ACEB51E76669335E588F029BF1D2663CEF8D94B79248B84027113ACFD499EEEDEDFBD2DBE507944B8AAFE41F5A903254722D75AE7EFBD9D6E533B53B3BFA859A7620CB4D596B6BDAAEAEEF695A4735DAAADAD4B48EA1755BF57D436D35EB6714A95DD30EDAD5B35575CFD0F674BDABAA6D55EDDE10F486DA51C48626B774A52D0A86C0EB0CA31DCB0553B3BDE3B6E1592C0D120584047002232984B8C15A67559DD514A66A480D453464C950959AAEB534B569A89DBADA35A4564D69196AA7AA75EB6AB7A5755B7AFB4CB553CB81E6733F323FF9E1277371F395DFFDEA1BDFBCFEDC73AF7DFB1BAFFCC7BF9B575E79E9B7FFFB87DF3E6F1E5E37CDABE6B53F9AD75F34AFBCF8EA77FEFD9B6F7BE2BD6AFD2194BD50C43A69B01E2BD4D3652351B89310DFD938F3E1F3F7FD4DF54233546A4421D69B42DD517C3D565ED94939D60A6BC19C2758F6C6428EF580DD13595A4FAFF9F39BE1EC46888C958534A4E5493289F2A02CD1CDA193730FD7EF967D406C6AE53CD7BD50BFB45B3BDFAC9F6935CEB78C33CDDA5EB5D6D6F5B6A175ABEA5EA3BAAFAACD6AB55BABED1B5AB751DDAD1BDDBAB167687B9DDAB94EED5C4DDBD7D58E61EC6A5A47D3767575D750760DB5A3C92D55AA2B628DA6245569B0AC7A2CBAEA9FEA1D5B9CB295A2391624F1128A222483B32CC62AACA2F1BA42A93A6B684243955B8A5C57959AAE3534B5AE6B0D5D6BE94AF3C69B65E8EDAAD6EE56F79B5A6BCF68750AB0F9FBDFFDFC91073E46A2E66BAF5DFBD5FFBEF89D6F5FF9EEBF1FFEF267E6D557CDA3AB7FF8C52F7EF08DAF1FBDF4C2ABCFFDC0BCFAA2F9DB9FBFC5D0DEA535DF293405B77FFBD4B86FC2E2E819DC9E99DF9898CE2DAF229B0139927BF7EE9DFB599C580C404BA1AC7D1B5C8B669777505FAABC1DF3DBD7DC13B685D185B19EB1D193A3B651AB63626171CAE61CB1ACCF2E7169188B00AB0B9BDB2B6930CADE215D56C2F8DA49CBFD7B97BAB5DDBADA6E68BBB56AB7AAB50DB561E86D5DED68DAAEA6EE19DA5EADDA35B46E55DFAD197BF5EA7E55DFADD7761BF5BD86B6DB32F66BFAAEAEB40DADAB69BB9AB6ABCA1D5DEE6A5247111BB25C97E5BA2CD514B1C131FAB1E446787660DC31310F26B32C8452004A112C47F21CC9F3ACA4F09A2ED6AB7253111B9A72A34AB475AD55ABB675AD51ABB6AB5AB3A677EA6ABBAAB5EB46BBA9765A7A7BBFDA3E0071F3F72F3E77EF83EF2B95CC37AE98E6CBE6E14BE61B2F1FBEF0ABC3D7FE609A574DF3DAD16B2F9B2FFDEE936F7EE4E94EF3871F7CBFF9DC7F99575E335FBB66FEE2F79F79F0A98B80CCEFE4A1F54872D19B707AB24B5E6C2B062EFBDFD9B8F36FDBF7319E34E1CD9556E3157F968897539EC0C68CCB3BE7F658D63DF3DEC05230B19AC8AEA5B0085405D5BC374E468AE04E96C9B197DA8F3C76DB7BDBD0593E84794E2F9CD53A0DBD5537BA35A565E8ED4675BFAAB50DB5A5295D43DB37B4FD8671A66EECB5AB078DEA7E4DDFAD197B8DFA5EADB65BADB55BF5FDA6DEADE9BB9AD2D6D55DC3D8D7B45D55ED6AEA9E243415A9CD4B75596E4A4253E69B02AB1D0BAF07C6FB866747C6A16C81284134485008C7E01C430A3CA78882210B7585ABC97C53E69B8AD2529496A23434B5A92A0D4D6D1A6A4B97BB3565D7D0BA55ADDDD03AAD6AA75B6FB701C4FCE6B7AF7FFAB3FF7CE19C79F5C557BFFE99E7DE71EFD71FBBC3BCFEF29F2C27F3DAD15F9CBD2B47CF7FF56BBFFCDA17CC5FFDD07CFEFB2F7DF99FDED3E9EC264AED04B89FA3BA19BA1AC1854D905ACDFEE6F33FF8C187BF687EF7056D0390B6206A0B0C2EEC544260713B9F594D66D752D9ED5C76330B068A5808A442101502B0AD02E607F92C5303AB757CF77CF59EC7EF78BA8DEC611B001F42F7B5BDBAD1ADE9BB2D635F57DA55754F57DA86DE6ED40E1AB5B38DDAD9BA7ED0A8EED76BBB8DEA6EDDD86B18671AB5B3F5FAD96AF5A051DFAB57F755B9A36BFB9ABAF79790D5AE2CB715B92B295D59EA085C5D64EB2A5B3B960BA7C74E0DCF0C8E130042810453A13958A4099E65149ED304AE2AF23549A88B6C5D91DA9C5813E486A4B634ADA3AA6D49A82B5253573B357DD7903A4D75BFA5ED75F54E476E1C70DAA71F79CC7CF1A51FFEEDBBCD577FFBC3872EFEECFCEEC778D4BCFAB2F9C6CBE6F5D7FFAC12CD1B5B8DE6ABAFFCEE9BFFF66F6F7BFCE37BDDBFDBED3E2E886732C06E12D84DE3CD04ADFB716313811D51F3E77F3CFCF10BAF7CF5471F6C3D7C5B4A35A234E603CA9B7934580177C0A2AF04FA4A68102243301180A82042F82B6408E6E264136CB4D14E13EB34C9DD47CF3FDE463BF87A494D317BFAC15EE77CBB71B6631C1852A75E3F5BAF9F6DD40E1AD5FD4EF39CA1756FCCD48CBD66FD4CDDD86BD5CE35EBE76AD5B38DFAF956E3EC0DFAF5EA19CDD8D7AB67547DBF6A9CD1D55D5DDDD3D5BDAABEAFABBB8AD212C5BACCD68F6582C9A1E3FDB689B97222C740240D912CCC7184C4522ACFE8225B17D9FF978AEF8E6EE3BAB386889901D8AB8A6DD9922DC96AA63A7B4721409020584082047B033BD131BD577480942DD7D829B6E39475BC291BA7387136D59BB25FB289B3E9C58913775B9225ABCDF70768EF2ECE3DEFCCE19973005EDC777FF7FD30EF05563CA1D5E5C8CA52786525B4B212D936A635C4EFC5C241CAB781073688B097DC588AA0411AF1E1B81F5342F4D646587DEFE23B3F78517DEFCD97D0F08BA3235F59F5A8372EA957DFBB75FDFDFFE13A47F707D7D4D7DF505FFECD6F3EF9D433BEC8D6A4E75301EAD36854766FE05DF3CB670739C7C62B2FBEAC5E55D56BEA1BBF78F9AD6FFDBFF87060B5CDED318E8D36F42D744DCF77CF0CB5395D6D43E326F770CBE058DBF0B46962CA383E6B9D59ED5D090E8702A391C8141A99C5A3E114E56186EBFBD6FA3CB0170B87C9508888042938CC05FD7438C886FD341260C25E3CECA7837E0A0E739108130C9218C2E3088F450424C247422C1C64910003FBE9A0970C04287F900E87D9B09F0E7BC9D00601FB18D8C7F857D11CBCABA8A6D7D87D47C9EE7B6FBB67B86B606164667E746661D2935BBF2CCE7B7344AF2D45D65660EF3AB6B612F66DA0EBEBA8CF47048374D04F047C78284087834CC847A11116833934C2E2615A80596666597DE79D57BFFD75F59D777F9FD8FAB4A9E7D6B7FF5DFDE0A27AF53DF5C6955B373FB8B5DD78FAF00799772FDDFCCD9FFEF2C5AFFFE8FCC79E67D289614F72640DB78E7D49BCF0E7AFBEA4BEAFAA1FA8B76EDC546F5CBB75F1ED4B3F7EF9E1396CA57E08ED5F5BB3CDC1AE8DD5BEB9FEC6DE51C3F068876BAE7B6EACC33DD13E3E65989CEB9A5FEA5DF53A838151383C89E18B0CBB2E25C2E98EA36DCBCE452488FAC3483882C3211289B0E1301B0AD0413F110A90C10006472804A611840BA1344AF0E13089C0244908084C4722542444C361060ED1E120B3EE4383113A182111940A04E14010F6FBC2411F9C837F23BCB11ED6D85A4CC7EE3C7864CF3DD37D6ECFF0F4F2A4C733E5F1CC2C2DCFAD2FCEAFAF2E05375623DE35D8EFC5BC1B11EF1A1CF0E1E120E5F7628100110A51A120EEF7A3C1200E4728384261288B232C09B332CCB173ABEAC577AFFCF425F5ADB7D4EFFFF4E343A3EAEFFFA05E7947FDE0A27AFD8A7AFDEACD1B573FEAF3A9B754F5E2E55B7FFEDB3BDFFBF1DF9FFBFACF1F7EFA291FF5B1653C3632FFFBCF3DAB5E7C5B7DFF2D55BDAAAAD73F78FB2DF5FAF55F7EF6F94F2CB1EB75AE40D7B2AF7771DE384C8CAFCE989D5326D7B87164DC38EAB1CDCD5B6796BB1716ED9E35C7AADF190C8EC0A109149927A38154CC9F3AB1E724B74E2181088E623C49B31122BC118603281EA6D1108604613810A1714260D89818A53186426981E258842422188BD3702022D2BC48897136265212470A0C2910308987510A438908C2E22407933CC270308DAC87512FACB1341BEEAEBAE3BE3B0F7A862656466756A6165696563796BD2B4BEB2B4BABABCB6B5EAF7F6DD5170CC0C1001208223E6F381C4231948A84B170180E04C3C1603812820982884422300CA330C2A1541CA1C4C5C5CB3FFFB1FAC6DF5FFDECE7D55FFDFAE66F7F73F31FAFDEBCFA9E7AED927AFDB27AE38A7AE3835B373FEAEDA9372F5E52FFF1FADBDFFBD1EF9EFCCC9770E1EBE2D65341EE774F3FF7558CFC7E9C7FFD9B5F50AFBFA65E7C457DE79FEAF5EBAFBEF09F9F09A4379A47E9FE8D70D7ACBF6F66DDEE5E300FCC1A07E74DA3739DE333E6F109937BA16776B17B7EB17BDE3BB4B131BC111A0F61F37834185302D1B6C32D4A50E0BD08BB11A256FDF48A5FF1E3DC061A0B319199157C6903595C879756C39EE58D890564DE0BCF6D042617C3332BBEA985C0CC22B6EA0BCC2C7B273D4BCE89B59139CFC044606675AC6770617462C9ED9E19189A1D1C9976B872BB6966FBC726BA5D9A9E76D3D13D7755DFBEDFD33F822DAEC34BEB81E535643D48FAC3BE8565CC1B44BC013C1096291EF72151421242341720C975580851714A96508EF263714A6682588C14648C1523A4E04592EB487466F69BE733EAC5377FFDB9CFFFFE8B5F56AFBDAD771EBF080000200049444154DEBA7CEB838BEAB54BEAB5F7D51B576EDEB8FA3F4E72F396FAC1956B7FFAE36BDF7EF1E5273EF99D68E6692FB635B9F43C293EED5999DFBFEF298FE78FCF7EF677CF7E46FDDB9FD5AB57D5ABEADF9EFBA1605F11DD6162D83B6F1C9E6CEEB19F6C986EB72F989DB3C6C139D3F0A26D72D136BDDC3DB76C9FF7395742E301782A8CCE2189485209449D8D83E422517BECDCBD7B0F9E3E76FADCB1B3C7F71D3D79E8C4A943D5678F9C3A7BECE4C9A3C70FECDB7FEEC4A993F71EAFBEE7D88903C78FED3F527D6FF5A9A3A70EDF73E4AEBDFBF6DFB1EF9EBDFBF7EDD9577DE0F88983D507EF3C74F7DE03C7EFBDEFF0DD07EEBBF7D8917BEEBDEF9E63F7DD73FCBEFDC78EDD75ECDEBD873586D37547F7DC756CF79D7D2DC6FE5653674D93C3D0D5DB66EA6D330D5ABA1C46B3C364B5B67474B59A06CCBDE69A36C3D946736D8BADA9BDE9444DFDF1332D671A1B4E9CAB3D7EBAA3B6F9C481A3CDA7EB1AAA4F9B4ED774569F6EBDE7EE9EFDFBD48BEFAAD72EBEFBF3FF54AFBDA35E7A5DBDFE9E7AFDB27AE3AA7AE38A7AE38A7AF3EAB52BEFA937AFAAD72EA91FBC7BE5573FBBF2D2F7BE93CA7C26889E1F5F880F4F4A8EA1B5D37553878FA9972FA9972F7E277BFEBB171E7DFBAF7F53AF5CFBFED6A7226DC3C4B0D7EB58749EB64CD4DBCC87CED9ABEBA7DB6C1ED3C0B2C5B5DAE5F6D9E7BCBD33EBBDD3A19145787C9D580887A67CF41A2D069431D3E4EAC8C6C13DF79E3D5C53BDEFC4D13D47EA0ED69DB8F3D4893B4FD6DD5B7FF6D0B9E3FBAA4F1F3A5B7FB8AEE69E9ADA437575F7D6D71EAA3B7ED7C9D3076BAAEF39537BBCC978C6D07EA2D574DA5477B0AEE94853EBF1B6A6632DC633E6D6EA96FAC375F5C71A5A4EB6B7DCD75677B0B1ED68BBB1DAA039BCF7E0C1DBEE3E7BE4D4A1DB0EDCB7FFD83DBBF6571F3871F6C08993FB8E1DBBF3DED307ABEFBDFDE0E13B0E9F3B525B7BACFEECFEB367F69FAA3974E6DCC1D3CD279A4E1FAC693D6B6A3F6B3E77B8C15CDFD37CCAD4D5EAB0B5F6F436DB06EB3A67DAFBAD474F7CF9C14DF5DADB377FF35F7FF8FC336FFCEC47EA8DF76F5DBFA4DEB8ACDEB8ACDE785FBDFA8E7AE92DF5F29BEA6B7FBCFAAB97DEFAF6177FB499DC724F47DAED94CD15313916EA1A1B4ACB3ECB11EAB5B7D5F75EFF463AA15EB9A8DEBC76FDD7BF7B60C2136EEF93DCFEA0DDB3DE331372CCAC5BDD3DF79EB61E3C32D9D8BC68B22E77DA7D3D2341BBDBDBED5AB30FC1A373C4AC975808E31E3889C4910554F289FC0ACD2C93EC1ACD785936242968228E24F0154242A25C48A43758D12B64908CE097591F8FAF90C80ACA073821C4B25E52090AE8224C6F506C900B79C2C1C520B286D07E8A58C543F37E62030F2E04B065343C1B46E790D05C50E36CEF9AE8728E5B9D431DF65173DF7CDFE844B76BB26BC4E398591D5E5C19F278DDAB91297F707C039F0D0746D7E8258CF420C1492F3C1BC49751620523D7287C85E0FC02B64C880151F032D100C7AE60719857560259EF867AE56DF5EA9BAF7EEB9BAFFDC70FD56BEFA9D72EA937AEA8D72EA957DFB975E975F5AD57AEBFFABB5B7FF87F6FBFF8A55F7EECC2A3CB9E88B91BB60E444C8EE5C676C7F1939D77ED639DFDEAA57FA8BFF9F133DE79F5CDDFAB37DFF8F1830FF3260766EAE707E7320B91F87C04195C58E9740E9DA9EF3A7CA4EFC4C9A9A6B68576CB5A67FFBA6560A5AB6FA9CB018F4C12934B21F722B904F3010E5FC1B00D0CF34790753FE60DA31B91C85A38B41246FD446403857D081AC0502F420508CA8F633E04F7A3B931E20B2181081288900104F3C2F07A040D60FE950016C4A8304606228837006F04317F04D98820EBE1F04A00590D21AB214D70DC13995C5D77CDCDF5BA9686C6165DEE95B1D9D5B105DFDC5A6829B03AB3E25FF4F917BCFEF98DF0923FBC14087A7CFEF90D782514F4F8222BA1C84A28B21A44362291B530E643432B01D40BE3BE0813C4E81046F97CA161E73FFEFDEBEAFBAFA97FFBCDADD7FEAC5E7F4FBD7151BDFE9E7AF59D5B975E53DFF9ABFA8FDFDCFCF32FAEFDEC5B7FFACCC7FE05F6E1B64EB4BBD76BB0ACB61AA7EB9AECD5675C0D4DB63BF747ED8EA8B573E6D09D7FFFC253EAA5BF7E83C0168F9EC0ADFDA4631C714CCCB5750F56372E59FAC61BDA5C35B58EE3D58EE3D539BA17DA2D6B965E5FF780BF77081D9D0F8E7AD0D98010E0181F498729381CA130948844A8304206103288A30114F687B110424770C21B61FC08E385A94084F48789409089C064288C078254384286602288207E04F12378080F7B83F0869F8EA04410417D613C0023EB4164DD8F6D0470AF1F59F76B424B2BB837B83A35B330E65E9D995A9F9B599B9B0FCC7982F3CBBEF925BF67CDB7B816585C8FACFAE1157F687523B21E40D6C3C87A185EDB66990E21B82F8207603284D2119C0C207410A602113610E642216E69F1637040FDEF9FA8EFFEF9EA6F7FA2DEBCA45E7B4FBDF28EFAFE9BB7DEFCABFAEA6F6FFDE167577FF1E2E517BFF43516233A4D6BADEDCB6D1D8BAD86D19ABABEEAD3FDA71A469BCC23B5A6B11AC340758DF98E3B470F1CF8D166FA6B343B71FCC44A5BE74A7BCF6C47CF508D61AAC53E6DE8996CB38CD4B5F69E386B3C70AFE5F0317763CB5473BBC7D0E9B3F6ADDBFAFD8313FE510F3CEBA73728D24F623E140E2348280CFB832C4262FE48C41B817D301642607F98082264204207502E88517E84F487715F880C85317F08F505D16038EC0D86D643C1B56078231C58F285567DC87A7075DA135A0984560291B510BC16C2D643B8371859D9082D7B35F0DA0AE65DDF989EF2CE4C861667FCB353C1B9F9E0C242C0B3E45F5C0AAD6E0457D603CB6BFEA555BF6705F16D8457D722CB3E742D8CAC8622CB01CC0BA3BE7070DD0FFB60D807E37E940AA2843742FAC35420C204312588898BCB8F86375EF9D2675E7AE2BC7AE3A27AE51DF5F2DBEAC5D76EBDF6C7CB2FFFF8F2CFBEF3C68B5FF8415696FBEC4BB50D1B26EB5247E774436BF791137D67EB6D0D1DB646737F63CF68D3E0788363BCBEB3FE8E7D03878E054D36FBC16363B52D13750677936DA4A577A27DC0DD6E9F6CEF196D300DD5B6F69FA937DE7BACFDC0E1A1BA86D936E36CA361D1685F758C79473DC1192FBE4E84D731C487237E04F321749824C20401937888C043040193481025601CF687C910CA46283A48D221820C603C46533085870812A1893049230C8D305488A042041BA1083FCA842826C2221B2819A4081F46FA713A40507E8CF0A39AB0672AB2381B5A989D773AA7FAFBA7FAFBE78787E79D43F0F2F2DAF4ECCA8CC7BBBCEEF5ACFA97D67D8B6B1B0B4BB90B9F6723B41240D683C87A10F60723BE10E247103F8AF85164030EAF06A930460551264C8A615A09E3CA865FF12CA4973DEAF54BEAD5776F5D7C537DEF9FB7FEFEBBF7FFEB87AFBDF0DCEF3EF7046FEF5EACAB5968A85F686999AC6BB41F3B3570A6C551D3DED76CE96DB00E36F7B95B9D93AD8333EDFDCE731DAEDAB60543D75CBB65AAD532D9DA3DD1DA3B61189C340ECF5B5D331DBDB3C66E577387E35CC3405DB3F94875FFD99AE976A3A7B37BD9D6E71B9A5C77CDF92637D03592C6A32C2EF3A82011A244883C210884CC913C87F33C2E71382F609C80711CC2F2A810A5631CC2CBA42260A2408A3C2170384F632C87F312218A289F0387B0222E7008CFA2028D8A34427308C3451821C44A88A8F14F0D8567C710CF2CB5B1E19F995D9B98F6CD2FF91796D18D50642D145A0FE780F8112C8891411C0FE15810A3609A8C90144C31304161381EC1688CA1108EC1241A15595CA43196C1590E136522A660F13419DF2224797955FDE0B27AED927AF14DF5ADBF5FFFD3CB1FFCD77FBCF6C2975F7A68D35D7D6AB1A563A1D538D9D8EAAE6D1C385D3F54D7E66EB3BADA7AE6ACAEF1B6FE198373BAA57FDE30B86076CE1B0666DBFBE60D03F38681658B6BC33EE9734C7BCC23A181B9F0E0CC5AB773AEB3DBD9D0EA6C6875D4363A6A6A67CD5D0B9D3DABBD83EB4EB767606C7D62850A30513ECBE3B1289590494524159E94395A115845626212155508254ACA0A210984CCE2324B45394211E9B840C54452D9062571382FE2DBDF96880B3C21F084C021AC80891CC2730823E16C9410654C106141135918833D53E8CA22B2B282AEFB43CBDEF06A10F386512F8C7A112244E3C1DC94A1089824231405D334CAA31192C2398A60598211198123798E14184CE0C9680E02A5F0A42C52529456643A166752193A2A2C6FA81F5C523F784FBDF4E6AD37FF76F36FBFBDFAAB9FFCE35BCFFFF4E31F5B69B3AE1A6C6B26FB545D9BBBA679B2C930D2D0613FD3D47BAE65A8C9E4AC37B91B2D130D1677BD75ACC936DDDA3BDBDE3F6F1874D758A65A7A3DA6A139E3C09CB16FD13C386DB0B9DB4CE623D5DDA76A869A0DCE3693DB6459E81958B20DACF60EAEF58F04263CBEC93536CC0B4C4AE132321153C8B8482A02A548AC22F28AC02A3C29C7B8648C89F2B8C49351914E72748C67E2029BE06845A0148152643A2693520E12218A942452124F893C21C8B828208244C802C6C90417A36585901442D2445697236B2B886F3DECF546FC613880C03E18F5C25488C023188E12384A10184D22148BB13CCCB230C7E30A854B2421502447911C89332CC18B7494C1241697052AC6118A48C6382216653332118B92D1F342F67E36F10021BEF18B9FA9D72EAA175FBBF9FA9F6FBCF2EBCBFFFDD3D7BFFFC28F1E7D68E464CD93A4880D4D8CD71B46EA0CDD279B4EDD76E050F9DE03157BAD27EAE64C3DA13EF7648B75D6E0186BEE9E6BB3F79FE9301EA91BA8B18C77F48D770E8C1BBAC9498F6FC8BD475BB05757766ACF21F3F15A574BE74847D7A4C5BED0ED5CEE1E5AED71FAFAC602230BC1197F8ADDE488984827376317E27C466192329D90A838CFC822171558456063021B13E9A8C4C4625C5261E2513621D2518E8DF25C4C6063321D8B314A9456245A162845A4A33C1915085920648996E36C4C26258196045A1248512625911235D8DA1AE65DC7833E34184483613484E0619408605488206092C41912A7489CC9712D209C888A3C223188C860024DF02C25B2B8C89012434A1C1D63A928472B3C23F34C94A3920A9711C9589C4D64F94C868A5D6062BFFEC6F3EAB58B37DFFEBBFAFA9FD457FEFBD2AFFEE3F5EF7EF3574F7DCA6BB6FCEE8BFF96F26C4CD61B5D3546C7A9B6FE5AB3B9BA659F7EEF9DFA3B06EA6CDC982F6076C76682C1A199AD30EB1B9D83C7961FA3524FB0D96490F1589DE4CCFA893B0F1FA9D8D779A2B9F9E099F6233543ADD6714BEF8C6D60DE36E8B10D2F58FAD7FAC6D75DF3E1F9508C4EF34C9C67E20CA9487C4AE4920A9712E9B84044252A2E3109818AC96C52E152321B979898C22514262E31315148F06C426013329D50A8A842450542CEDD2051519154142A1AA56585926394225292C4CA3223CBA428329286F206A840800CFAF170180FC378182522181522A81099E39A22588A602994A6608A8B303CCCB31141406581905954E0712537B95846F91012C7CA2C23714C52E253312195903229219D15520F8999E72E3CA05EBBA8BEF5CAADD7FEA8BEF2EBCBBFFCE13F5F7CFEE5A73E218FB9FFFA95E71FF6C3534DE6F1E62EDB899629D3D0BC65A2BAF4F8C992EA9D9A8AE6DBEA8EE6DFED6CB0594E354A6BB07F6C71B6676463786ECC3278E2EEE347EF3C7C7BD16DFB4BEF1E6872CC59C7BA4E7718AB1B075A3AC72D7DD35DFD735D4E4FCFE86AFFE4B2637C65681E5DC7793CC63371868A0A7C5C129351252309699E4D284C5A2253717E53E132329B8E0999289F8CF249918EF2A4AC7009814B8A7C4AE2530A975298B44425052A96D3B5C2C4A3B422934A9456A2A49C6062122D49AC2CB3A2420B122B6BA840840E86C950180FC3780423609284713A4C32119A446802A3499C21303AD754E4708E27041E974452C98D2C1EA5708926649A923836CAD032C328021F178504C7C4452E2E0B719157626222CEC6D25CFC419E51AF5D54DFFBE7ADD7FE78F3AFBF7AFF573FFAC7779EFFCD334F3E11F2FFF8634F7C02A63C46DB684BD76053D748937DB6CD35DF34AAFE5955DF507FF7D40F11E3CC6263BFE9CE53BD27DB1A0E9CB29E69EB3EDB613F63EC3AD3D971A8D9784FCB608D7DCD36BBDC33ED6CB699CEB6F4359BC73A1D9E9EA1E9CEFE799B6BDA3AB43430B93AE689ACA2229DE4F0384F27099C67D9A828C464292172518E90443AAE88199E898B5C3C2AA565212E725159486E93CE25453E25B26985CB086452A012029B10D898CCC6653A1663E20A198FD2B118158B51318955245691394561158995355418C1FC2112C6B1304AC0E4B67E1196851902A6088CA6498EC618066779826722148BB1342192B8C45051914EB2A8C2E3124748142193A48C5332412BA2981485842CA465361E9792929C1095A42C25B2522AEAF7ABD72EAA1FBCABBEF177F595DF5F79F9C7AF7FEFABBF7AE6939FC422FF7EE1FC37CE9FF7F60C8CB674BBDB06E68D23CEFB4CDF7EE473EAFB37D56B37D5CBAAFAF7ABAF7CE63B3F4C3CF90524BB50D33D53671FAFB50F9EB20E9CB42C9927A65A86562C531B8E998DC1F9B1CEA1EE3AE370876DBAD3316373CE5A07C70D8E599B6BC631E1712F05573199CF4A4296A7938A9811A5382FC7784111B9284BC98A989285A4C845253E260B718989494C8C671392909685B4C424A27C5AE492029312C5EC871A4FC8744C2064998E45A9448C4CC5C8548C4ECA744CE11232179585B8CC4535144290304EA13401933842132843632C8B710CCA92084D622C857324C6B2B8C860028B0A1C21D1844CE2124DC6783A2931098190453ACA3371964E304C82A513229F12B9A42CA4152E119792921897A454544AA7F924BFEE555FFB9B7AFDA2FAD6ABEA2BBFBDF59B9FFEE3DB5FFAF707B35B6B8B5F8ACB2F3EF27078C8EDAAB774DFD73AD5DCE738D2A8BE7359BD76457DE79FEA2B7F79F7DBDF7DEDB9AFFD24FBD80BE283947D7AA9A56FB6A977A6D1315E6B9F6A1858EB9A090D2EF99C73F33DE38EC6AEBE269BABA377D2D23F6B1F1E35F44C5AFAA72CCEE5A19995F165780D4B8AE7253EC5D34949C84A528A136382189385A42C666429254B29498C8B4242E2132297E49938C72504212509699E898B5C521133229FE2D994CC67152E15E5D3312E19E75351361165530A938E71D9289B5298B8CCC6395A11B9B8C4C4345818276092C6581A63199CA3700EC71812630994C9514F1202854B2426529842E1128D47294CA1882843C5695261A8284BC9221DE7E9A4C0A4793A23305985CD8A548A27E3129310B938CF4425211D17B3312E99C6E8FFF7FCF3EAB58BEA3BFF50DFF8CBDF5FF8D2EF9FFBF4D7B652F4B83BD8EF48ACAF72734BA30DA6F146EBA311FE9FDFFD0FF5EA25F5CADBEAEB7FBAF6CB9FBCF3CD6F7C8DE69136EBEC89A685DA4E4F53CF6C937DA2B66BC538E2B34D11A35E62627DD531396D1D19EE18186C75385BECB3B6918156CB50876DCCDC3F6975CE0F4C863CC1F9D145854966942D994D0A5C5A1052A29896A40CCF2745312D8A69514C4A524AE0E3029794B88CC867583E2D499BB298E199B8C4A724219D7392A8B8A570A95C92897169854B295C4AE132B9BAAA700981520436267271918E6AD0084922348D304498A4609AC1399260499CA1498EA54486141852A2708944650A8BB25494A5A22C19E7A8044F27192ACAD231868A72748CA793229B1198AC48A56426A3306985CB28624614128A945584CDA47C7F52DE1242F0E3B1A87AF55DF58377D48BFFF8F5173EFDB18D95D4CACA6ACFC08CC93A69B6FA86DCDEBE914F09D1375EFA917AF96DF5F2ABEAEBBF575FFDEDD59F7CF70FCF3CF9C0CCE2CC89B6C5D6DE55CBD0A27968CE30B86074AE9846033D331BF6699F736ECEEA9A300F8D5BDC032D7D231DFDAEB69E114BBFABB3CF6D754EF68C4CF54FC25EE2F489864E63EFA71EFC444CC848C2A6C465B72D45CC725C4AFC904A41480942461236453E2B0A9BA2B029099B329F15D9B4C86724219BBB96D9F4878925998B34129F8AF2E9289F56B8445C4CCB6C5CA014898A6A72FAA5508682690665189C235086C06812A7688C61099EC54506531822461332432A0CA970548227E32C15656899A2059E89B2649C63923C9BE2D984226638221665B6647E5364D3029312F96CEE5F92B8CC03D14D7EDDAB5E7A53BDF1B67AE99F3F7DF2F1A0CDEA7538273AFB9C6D9D83ED9D2346DBB8A17BB8A175A3DB119D9BFD179EF8F113F7BFFAFCE7AE7CFF5B2F3FFDF443AB619F7978E0B461B8A17BB8C1DE7FCE3AD6DC3BDDD13F6F1C5EEA1A9BEB1E9BB48C4E748E8C189D333D13032D3DC31D7D831D76A7C9316E1B9EEC1F9B1F5EA0D7E883074E6B80C2381B7DE0FE876525C9B3099E4D8BC279893F2F8B9B029714B8A42426652925096941C888C2A6C0657288CB0F084C8AA1E23C9B90B88C2266643193BB59E453329F959894442515262DD3A9289F8E0919854B494C42A2E21A02A3199CA531265718698C253116C73802656882A709912664964C30448CC6A3242E51844C93319A8C51449426158A92185AE499284BC7783641E0BCC026382AA1B05B229592D9B4CC67252EAB08F78BECA6CC6F26F97886C07FFFA3EFA837DE563F78FB5B0F3DB06432ADF438C7CC032326C780A1A7B7A3BBBFA377B0AD7BB8B57BA0D6B062B62F1B2CF490EBC908F1F5E8E66749E5212F498DAF4DB539FB4E59461A07DC2D8353C6D1F9AEF169937BD4E09CB08E8E5A5C2EF3507F9BC369E8EB6FEBEE33DA9D26C7986570A2DBB53834876E103B0A2A3560FEB0D3F5C8FD0F65B25B5C2C29082989CB726C5A923625695392328A9455A4AC2C66143123F359964CB0644260D2329389729B129761885854DE9484B428242429254929514C2BCA7999DF94998C48A5243A2D31A9289F1598144F27453AAEA1509AC1590AA5719422500683190A97705440618EC07902132922CA10711A8FD284CCD03245C824AEB0749226E3341963E9184BC72421CD31498E494A429A67532C9D94D8FB652623B369914D8B6C4616B7647E53E2320FA41F38CF708FF0B47AFDA2FAC1C55F7FE5CB7346EB8CC5E9EEEC771AEDF6768BDDD86337F6DA9ABB068DBD93B6E1C59E8955C7E4B2C535DFE258E918A4DDABC955FC313CFAB4F4083E1698318E8DB50D8F1B47C74C23A31DAE11A373C43C32699F70599C43E63E7B73A7B3BDDB69E81D35F78D5B0727EDAE55F7FCF8D084264FA7ADD8A9D1E53736B56DA5361FB8F0483491653999E714864F704286E5D39C9091C5CDA8B8151336653A2571598149F3745266D30A9789F15B0A9B9584ACC867783E29CB5949CA705C4A96CE0B5C46E2B2229B51D8ACCC6464262330699E4E494C4A43221485D234C1E3088D232C8172242A53441443781C17094222718522A20CA90894C232CA87BA8ED3649C25132C19E79814C7A4042E23F2DB6F2FF2599EDAFC1FAEF98C246415292B89C90B9907D786C6DA0EDDAB5E7D4FBDFAFEF5DFFE2EE874AFF54F8F750E0D77F6F71A7ABA8DBDA6E6AEEE367B57936DA2677CD43A36DAE91E6973CE98DC33ED43B366D7946568B16B2832E499358C4E1BDC63869109D3A8DBE81AE9181A35385DE6A169C7545FBBDDDE6271B476F636758C187BC68C7DB3BDAE49FB103CB776F4E0318D162ADB79075479874697BFEFEEFD9303C38F64CE6F9EDFA2A2222DC76829C508499A4F094246E2B2516E33CE6D495C46E6B3029B90D9A4C265443AC9D329993F2F099B3C9B92E52D4148715C8AE732029F15F98CC0A4657E5361B3129D96F94D9E4DF3745283233489B134CA13A880E780B00C26919888E3224A880415A3E938454479324E6151868831549426159A54182ACE9209964EF26C5AE0D21C9314F98CC86FD71381CBC87C36F7296571331ADD52C484CFB3D170E8D4998ABBD56BAA7AE39AFAC61BA267CD6D708CD99C23D6C10153BFC3D8DFDDDEDBD5DA6369EA1AB40CBA3A4706DA06C7CCEE31E3A8DB30326E1C196D1F5CB24FBADA1CA306E768FB90BB63D8DD313C6A708E740E0F773847ADEEF1DE315B4BA7F15C93BDD9E432F6F4379B5D9DBD53B6C185BED1A981318D465751B1B7A4E8F6C2923BC1D23D1A9D4E03688E1F3F1A1585679F792673FEC2F90B8FA6372FD08CC87232CFC51439ADC86959CC48425664330293E299384F27453E23F39B229B11B88C246C8AC2A6C06773A296E8B444A7252EAB089B12B7EDD71CAD681098C6111683391CE1094C243091C2051266295CC07111A7648C8A12541C23A21411A3B02885456932CED2899CB4192A41D3718649F06CEA237C540C453623B26999CF8A7C4611330F641F3434771EDB7B74CA38A0DE50D59B37D50FAE7FF9C2E30B5D43D38ED171DBF09079C0DED6DBDD66B7B6745B5BBBCC4D9DC3B69141F3F090C935D8EE1C31B85CEDCE31D3C854E7D842D794BB6378C63A36D3393A6118727738478C036EEB88B373A8A7ADABFD6C634F8BA1BBD1D0DB68761ABBFBDBAD4E63B7CBE63CB2BF1AD0941415DE56567C5769D1BEE2FCDBF5FA320D006900A062CF9EBA33B53673D7D8D028EE8B3C9A7EE0E9873FFEC9071FBD3F9D4DC613BC101584842C67793E297049914DCBFCA6CC9F17D84D81DD1485F3A2705EE0B3398589DC96C06E0A5C46E43322978CF2E9389F8909190D0A732426128884450402132952A450060FD304CAE1388F91124E2B181525A8188E290C91A4F11845C4483C9A239AA5931C97A049856753029312983447E5E6D7A6C46D495C5664D339638909994D255B7FA6F9C0EE038FF119F5A67AEBD62DF59AFAD71FFC029F58F68E2EB83B07C6BA5CFD1DBDDD2DB6EEB6EECE66B3B9C9E830F7F599061C1D7D7D6DFD03ED7DAEF601B76160B4B977B26370BCA3CFDD6A9F6A774CB53BC6DA7A478D7DC3A63E7B7B97A9AED5DCD0646B6AED6FEFEC6B363B5A3B075A2D2E4B7FFDD9C63C4D61BEAEAAA8604F7EE1ED0545B7E5EB77E9C08AD2D23BF4453B35BA420DA8D3E46B347A8D46A7014A0B0F1C3AE8EA1F6403E127325B1F7FE491F399AC2C2ABCA0F082C2738A2CA465719367532C93B38E2D81CFCAE296C867456E4BE2CF8B7C561637653E1BE5B3312E2BF3590D0A0B0422D1A84C201289891429B20447133C8E71042190A448D00AC944095AA1A8184B261822CE90290A4F50649C65522C93A22949E4531C951098B4C86E4A7456A2B33C9D11D84D89CBE68C85E7D3D9D443E1D5505FF7C09EC2AAE7EEFF78EEB132F5BAAABE7BE37389873CBD63F3BD63535DC36EB373C060B7B7DBBA5A3B0DF5ED96964E5BABADA7D5EE68EBB13775395BBBC73A7A879B2DC36D5D231D5D83CDA6E166F3689BCDD56E7334987B9ACCC6734DE686264B5393ADB9B9A7B96DB0D5DCDF6A9AB0F6773518F56091565BA803CB0A0B77EB0A77E90BAB8A0A76EAC04A3D5405E49516EB76960255A5BA2A28AFACA868577ED91E0DA4D7E8418D4E53CE72EF8E000020004944415458513860300808F2C4230F4A3297CA2465598E4553C9C4663AF58028A6192621F0D91CD7DB36C265453E9B4B04516E5366323C9BD6E0A8940381290426939848E11C458A393FC9F53D284AA1288564A22419A5E9B8C0A5593AC9D2498E49716C9A61623C9BE2E994C46D89544660B2B919C4335991DB92844D49C846E5CD989CB277F7F5D81C1550D9C35C66FBA1C99BB7D4EBEABB3FFF33EA5EDB189CF738A6DC56E78875B0B7C3D6DD6AB1B5749A1B0DBD1DB69EC64E4753676FBDA9AFC1E8A86F1FE9B00C347574D7D40F34B4F4D7373BEA5B1D8D1DB69A66F3E946736D8BE16CADBDA5B5BBBEB1ABB6D1DE6C72B45A07DB6C77DF7E779E062A82CA0AF495F9F93BF3753B0BF277EB753B21A01C02CAF540453E58990F56EAC04A3D50990F56EA814A3DB80BD455EA4AAA76141669A03C0DA83D70E0EEC9A1618560CE0BA907E3F73F9A7DE8B10B8F7CFCF1272E3CF460229995C4644C3A1FE3B7243E1595B25129AB485945DA12C5AC246D8A7C4683213C8E0A249EA35B26718540240C91084C61C9782E56D3648C22621411A3C83845C6593AC151098149714C926593349560A8044BA5057693A5D22C93E1842D86DFE4842C27645936298B9BA9F8036BCB015387D5D0DC795BE1ED1F8F5E506FAADB0F4EDE52D56BEA7F7CEE05658944267C73BD33239651A771D065E8EF6BB4D89B4DDD8DED5D0DCD96BA46734DBDF1D4B98E13676A0E1D693F75D674BAC670F2747BF5E9CEB375C633F5D6BA96AEDAE68E3375C6BA264B7D8BA9A6D9DA64EE38671EB44C34D6D9B43B4A8B753B0B7415F9F99505FA9D45FA5D85BA9D85BA9D05BA8A625D791154A6CF2B82340585DA927C6DB10E2CD382E55AA81482CA20A0B4505FA9D757E9A1F2F292DD50618906823420A0D1EB34851A4D814653AADB7BCF3DBDA61E31443D113FFFE4E6831FBBFFC1471F78702BB51993535129CD3351918BF36C4283A23C8E8B2429E3B8886139D205028F1278747BB542446932C77292A6520C99E2A8B4CC6C4A749A63521C97A2D914C7665926257019964EF25C4690B6683ECD706949DC9284CD64F4021EE6A747162C6DB6FDB71FD1690A7FF18D9FAA1FE47692DECC39C9F5572E7DEB135F391F8A0B1E2A341E705BC6DC4697ABB5BFAFD9D2D364EC6A6C31373419CFD5996A1A8DE79A8C679A3B4E359A4E35D8EA5ABA6A9BAD354D9D671BCCE71A3BCE34981A0DA646A3A1DE587BA2A5EEA4C5669C1DED5B2FDD7514D4ED2AD1561682E505FACA02A8AA08AA2A04AA0A808A02A0AC102CD5834505BA123D58940F1440DA02102C05746580AE04048A8A0B7616829525E0AE02A0A200AAD28165F9507959C1AE5D85B795E92BCB4B766A0B8B357AAD46BF43A3DBA129D4DD7ED73E7373CB68EF4064D5FF48F6A1F3E9AD6C764B94255989696054443009252518663194C5310EC3389410094221088526630C15A788184D24692A4513699ED962A92C4F6D0A645A61B31C93A2A90443A7397A93A3D22295E2A8842C9DA7D80CC5A5182E2570E984F200EC27A75CF33D1D8E83BBAA6DF5BD975FCD1DA7A5DECA3DA4AAAAEA0DF5F25F2F7EF7A9179E141ECF0693C41CEA75AF4FF6B8FBDABA1CED96AE968ECEC6E6AEC616736D43674D93F55C8BE56CABF95C6B675D6B577DABB5A6C97CBAD174B6C5D2686A3ADBDE586BDEB7BFE6E851F3D418B132CDDF7DDCA4C9DBA9052B7460453E58A9072A8AF2AB8AA0B202A8AA505B51A4ADD2ED28D541253AA808020B20B018D49668B5C55A6D3100944040290416EBC0323D50A1072AA0BCB202A82A1FACD4811585F9BB8A8BAA0AF3ABF4506561C19EA2C2DBCACAF61617EFCE038B3400A8C90734F99ADB0FDDDDDB6527FCE803D1CD0712E735282CA0A81882191C177154205001C7451497094221718526632C196788384B27293CC1D119864ED34492A733029996E82C4B26786E93A453389960B814CFC7053ECA71319A8B734286E7D39290F6AD44BC8BA1B9D1F9C6138D0932F3E9FB3FFD979FFF51FDDF07F26D6F2D50D5D7AEBFF8E96F3E93796A13C972CB74D0ED1BEB1C721AEDDDCD46737D9BA9AED55CD3663A971BDBCC35EDD65A83B5AEC37CB6CD70A6ADE55447DB19D38993A623C76D1D1D8BE1C063FEE04375ED531AED1D1A60B70EAACA715D00ED2CD45716EA4B754071BEB6B408A8D40315A0B604028B21B010D016024009006CD30D41652058AAD5160379A53A6D798E713D5896AFABD043E57AA83C5F57A587AA0AF4BBC0BC4A08AC2C28D85558B8B3B8F8B622FDAEB2923B34804EA30334853AA0B8E0F8F16A0D0673488447100185050C11715442511EC5651C974932CA507186887154F2A384C7D0498A4C52788221923C91E2A8244327713286B17156497172ECFE071E8CC5D389C4F970980D85281C15C201DCB7141C1F9868A8AEFBFC639FF9DCC39F7E28BAF5D18602F5D687C34D55BDA1AAD7D45F7CFB174FA79FFE98F078C21B5FEA9F99EE71398D5DB6A676E3B9868E330DEDA71A3B4ED5779C6A349F6D339D69379FEA309DED34D5DA6BEF331FBBB7A3A3797E662A8311CF7A361EED1C8CEC3AD8AAD15442FADD7AA8B2B870971EAAD481953AB04C0714E643C5054049BEB6540796415019A82D81805250BB4D748E71002881A012082AD3E92AF550A51EAACC87CA216D891E2C8380521D58A687CA21A01CD49683DA723D5455A0DF59A8DB5904951517DF06E8ABF2F57B4A8BEF28AFDC97575CA901410D1E66B18880C2021C113044C25109C6058490114CCAD908892B3419CF056A964C9078942462241163E9044DC6683A4AB2315A88F14A2A993D2F8AB277DD37313ED3D8689A9A59F705289F0FDB580F6F2C05861DAED3874F7D62F3F1C7940BBEA9E5FF39296E7B2FD8CDED5DD3B754F59AFAEE1FDE7B2AFDCC83D423A131FF986978C4E4E8693276D6B4184F36B6DF57D771BCCE70A6ADF96447C32973F3B99E73C77A4E1D71185B96E767B728E1AB1BF01796439FEB9F489E699BD5807B77E455E9B4E57AB0440F964150050455E875A53AB040071541DA221D509C23779B38B018028B41A008F8086001001401500500940179A57AA042A72D2F80AAF4404581AE4C071417E8CA7440694EECF9BA0A1D5896AFAB28D2EF2A2BD85354789BBE60B75EB7BB38FFF67CFD1E0D1AA17154C0510989086858C0101121448C50104CC288288646093C8EA1510C954922469149028F13789C22930C9DA42885A4F8782CCD738A67716D7874BAB6C57CE464DDD1EAFAF1F1259F8FD8F011CBEB919595D0D2826FB86FBCB9D6406F5017840BF3FDF3EA0739FFB8BE7D3EDF878C6F0FD754F59AFACBEFBE1CF3A7967A57274D13D6B39DD65A53EB7DCD75F79C6DAB6E3A73ACE15C75DBD9EAAEA6BAF1D17ECEE379D88F7F21227E632AFC2FAED5A7C6D63ED5E5E4EE38D6A581F616E8771541158560A90E282CD095E443C53AA0F0236C6B39AF18D49640403900948060695E5E415E5E010815825021001680603104940279A51050A183760140990E2CD34125DB008A7540693E54FED15F0AA0AA7CA8BC30BF0AD09643E04E1DB40BD096EB0A776B309425301145790C933044446101C6051497093C8A630A81C670244A600A814751444211892462141523C9A8226553C9FB498C9D995D6CEDE83C7EAAB6FA7463F5E9E6BA06B3C1D0BB341F585CF4AFAC4796D6C20B0BDE85F9B5B191993E9B73C9BDFCA5C7FF75A677F60FFFF947F5C6B69CFFD75188376FA9376FDDBAA5DEDA3E56E4E67BEA05E5F1BE6657DDA11663ADADE9A4F1F491A65307CED59F3287D7E222FF594AFA322E7D8390BFE5639FDF10BF3EE8FBF4E0F2272D23A98E3E5C53784CA3D909021585BA9D7AB04C0714EBC1927CA834275E1D500CE6150279DBA6AC03CB746019081481401104168240810E2AD2EB4A41B018D4966CD746A042AB2907F24AB7B9DE76928A1C20A80C008AF2F565F950794EEF7AA022E7E63AB0A248BF7BBB36C2A84850311415314C82510945241C53084C26303997BE192A4A1132852951292B4BA9B555FFF0A0DBD0D6696CEF329B1DE7EA8DF5EDDDE71A3B6BEB2D3D56D7ECD8EAD2AC2FB777756525B4E4F12FCCAEAE2E78FBECC3D666DB579F7C7ED5B9119A8BA8D772277ADEF8E874BEFFFDCA1D69A67EA07EFEFE277FFEB97F7FEDDBBF62DC5E8FD93DDA3278EEE069CD8EC27B4F18371FFD5664F36B9ED8D7D613DFF1882F8C125F716C3CED987FACA99BB8F3E4A066C7ED5A6837A02D0773B31EDC9EEC10500E6ACB20B018008A3EF4E522002882A0129DBE18D0E68379F9605EBE1E2CC995CA9C9B7F28FC3200D836770028D3415520500168CB21B0520B9683BA4A4057A6D79542607181AEAC00AA2AD4EDD1013B756065917EB70687150496C3B010414414911058C6D02846C5104CC6300945798696498C674829937C50A493EB2BE13EFB707B9BB9A9B1BDADB5B3A3CD666CB39B8D7DCDED3DC7AA9BCD26E7A46B7962D83337B3B1B604AF2E865796C22B8B81354FC0B71474740D1A6A4D5F7DFA6BD140C2651EBBFAE6CD0F6BE2CDFF4BF387B8A9FEE05FBF3E78ACFEFE292FD6DCCD1807C49EB107E64293A7CDE585BB359A8A10FE60FAC99FAE64BE351B7F7188FC6A7FF05FBB3C4F5846321627AB29BC4FA3BD0D042A40A002D496E58395F9DAD27C6D69BEB61CCA2B03B565397EB550B1565B0882C50058A005F2B5DA426D5E019857A8030AC1BCFC8F8C1B028B75BA5210DC466E2A404039A4AD02F32A41A00A042A00A8420B966B7565507EC58713A55207ECD6417BB4609516ACD004C3420411FD61360C0B28A2206129024723A882E20A824914A5908440E14232B63537B1DC6D196AAC373735749A0C8E1EEBB0CD3460EAE831B4DB3B0D7D16E340976160766CD5D5373DE6F2AC2FC36BCBA1354F6879CEBF30E70BFBE9354FA0B5C9D454DDF88DCF7FE7F1CCE73D83FEFB850B391BB97EF3C636C3B7B653F7FB17AFFDED2FAFBFFDCA7BE6FD67FCAD0E6F8D71E5BE26DF998EB533EDAE43A7DA6F3F7C7AD7618DA6545372F0C2932F118FBD34257D7318F9B7FE8D2F18A71FB5BA52351DAB9ABCBD00785B01B4331FDC050115A0B60C82CA00A004C82B86807228AF2C17A541B01C00CAB4DA62102CD602F93BF274795A3DA02DCC95CD9CF641A0480F9615EA2B7372868052102C0580921D40B1162C07810A08A880A00A102CCD83CA77E82BF2A072BDBE2A5F57A5032B7550950EDA05813BF3753B3541980BC25C1815C2B080C0221C91602C1A8AF008266198C0F349494C1238EF764DDB2C0386B63EABC5D5691EEC774CF4DBC72CC6FE8ED62E8BB1BFBDD1DA631E1A1D98EDB38D0CF54F4D8C2E2ECC6DAC2F0637E6FCF3E3ABEBCB70C447ADCE6DB4D4B61EBBEBC8E71EFBC226FF04E7DFDA98443F78EB867A4BBD79F3BA7A4BBD91E3FA86AADE52DFBFA15E7E4F7DF6A12F0C1FEB183FD2DA7F57B56DEF51F3EE8375C5BB0F43C5C7F4BBEE29BE2B1FDCA5C9DB39B5914C3CFDF331EEEBCEF057ED2BFFD2EEBED03B9AD6DDD6A281EECAD3EED4439505D0CEFFC335500201E53AB00204738A2ED56A0B01A0480BE4E769F5795ABD16C807B4F93AA804048A3EF499A20F4DA3E4A3FBB73D072CD34395B9780E82C579409916AC0081AA02FD2E9DB6420F5569F32A40DD2E10D8A583AA3441980B44D840840D45B848844351112164825672BF6C057C786F8FCBD4DE6B350DD83A9D56D3A0CD3A6CED745A3B07BBAD836683DD60B0B5B47419DA7BDDC3F38E2E57AF757864687A7AC2B3ECF12ECFADCF8F2F4FBB97D656600CE696A6577B0CB6BD15B77FEBB9EF6C898F33A10743CBF1A71EFE57F5DAFF718F9BD7D5FFFAED9B3FFEAFD77FF1937FF69CED6FDA79AC6DE7D1E6DD471B6EBFEF4CC5E1EAB27B8F571CBA277FEF6DF90776686ED78007EE3CDEAB3CF6D22CF7CDBE8D2FF52CFE8B7DE211AB53D2E41DD08077E8A0AA7CA85CA72D07B56540DEF65210044BB5DA520828D76A8B7391439B570068F3B579FABC1DBA1D793A2D900F0045793BF23F2A9B00500200DB17B96F28C7B50E2AD2832505BA0A1028D2412520580A00655AB00A0476E543BBF3C12A9DAE520B5600D04E10A882A00A4D30CC86103E0873C1300BC33C8AF22423B28C343BB56435F7B53575195AEDF6AE117B97BBD736D66D1EB4981C76DB505767BFC5E4686D317798BA4DD6417B8FBBBB6BB8C73ADCDB3DEC76CDCE4D2FAF2DFBA6273C33638B4BF301BF9F84C38CD3317CE6BE53BB2BF6FCE7F77EF9EC275E40D6EF5F7073EBD3548EEB6D13B9A9FEEE2FEF7DF5FB7FFAE2377E1FF166CA347BDAF6D5B6DE79A6E6F6E3F7ED3E72A4FCC091D27B0E96DE7547C1DE7CCD5E103C5E7DDFF059C3EA02FAD945F685EEB5E7CC134F0EB81FDA7B6444B3E32E207FAF1EA8C80532505BA603B70D3A2FAF48A7AB04810AADB614004A72C143ABD1E56920302F1F840AF3F20A727ACF4D02102C8772E11A28D16A8BA1ED60570481857AB0A4082A83B44590B608028B41B05C9B5706682BF3804A405B0E6ACBA0FC0A5D41250896EBC04A08AAD04410210CF3A108178A70C1088D12E2EA6AD835346D35F70D3A26FA7AC61CDD6E47B7BBDB3264EB74DA3B87AD863EABB9CF6CEAE9B4F4983BBBCD9DDDCE21F7C080DB60E8ED6875F4585D9323F3CBF3ABD3139E6EEBE0E49827182471845F5DF29FAA6928DF755BE18EFCE73EF1E5EF7DE3E547D25FF6AE6CAE2C249FFDCC8BEAF50FCDFAA6FAB517FEFB99AFFFF12B2FFCB5EEBEDE52707FCB3D358DFB4E9DDD73BCBAEAF0E1CA7D07CAF7ED2FDEBFB3F04071FE89C347863B2CB8DD9D3E50EF1F43BE6459FEB469EA5363B30F690A4E6834B7EBA03D05FA5D05DA4A9DB602D496E54C390FCC2D05CB80BCE23CB004044B016D3EB0430FECD0E7EDC8CFDB919FB308102880805228AF0CC82B03B565A0B644079681DA92BCBC22082ACB798B0E28D683657AB00CD296E4F262CE9A74DA0A10A882C04A08AAD08115F9BA9D7A7017A4AD02B5E51A38CC60080FC32C45292C9B5C5A0A593B077B7B467B7B4607FA26FA7AC7ECDD2339F4F68CF6F58EDAAC8366538FD1D46534596D5DBDF69E81A1E1B173E79A5B5B6D6663BFAB7F626674DEBBE2EFB30FF7760FAFAD8451982371A9A9D50295EEDAB9F71E30AF5080A3CF3DFB83CF3FF3523CFEDCFC5C72719E57AF6F57C53FFDFE9D4F3CFD934F7CF18FB1F4BFDD7D7BD3DED2A34DFB6A6AEE3C7EE2B6234776DD7BB4EAC081927D7716DE9D0FEE3F7E62ACD940197B33F6F1C78FB7D3AD235BC3C167BBA71F37F6919A1D776980DD20500141157AA032D7C180C0621D540480053AFDF6CA500B958260718E6860871ED2E63A7CC580B610048A2060BB01920B8B90AE08D2158160B11E2A8780523D5091AF2DD781953AB012022A20A022777321585E0055E9753B735910022A406D39A4AD82B4553A6D9506C33804E1705C9C9959B5778F8C386747076607FBC6FA7B47071C23CEC1B1DE1E577797B3B373C06A755AAD03566B5F4ECE5D36474FF7E0A86BB6AED178B6A6A3B9D96A310F0C39467D4BC1A9D185B616DBC2FCDAD2922F1C20FB1D6E4DF1CEFC3DFB4A2BF769F4551383ABCF3CF96D2CF290CC3EAB285FF3463E41E31FCB19C8131FFFF6439FF9D5E3CFFEA5A669F5E4E991C633AE8315C78E941FDA5F71F71D65FBEF28BE6BA7EE2E00D87FC7FE4E63AF649FFC64CFF433C3EB5F6C1CD83CD004774E6C8D7A1ED6000735DADBF450950E2CD3E92AF3C12A1D580901E53AA804020B21B01002738BF252505B960B24605E31985708680BB5797A485BA0038A732A068022102AD46A8B01A00C022A746065CEFA739D905CBE86A00A405B0E68CB7374EB80D202A00C028B732D1408DC0901157AA0B200A800B5651A98927C21B2B76FDCE59A1BEC9F720DCE0E3A2687FBDCC3FD23CEFE91C13E577FAFABDB366031F7F5F6B89CFDE316739FD96CB7581C36EBA0DD3634D83FD9691D6A37F49E3EDDD46519181C9C181D9D3B7BBA756A6C79717E75797E351224F6EE3B925FB6A764E7BE92B23B750577380C93BFF8C1EB78E889F5E54782F0D311EC339E8D47AFDF52AFA8EAFD4FFCFF26BDB449B2EA4CEFDCB39F73F7256FEEB55775373483C440831034BD5655566E95FBCDE5E65A5B37DDD02C12308C101A8B9160D04802216B24C4CC74E0A625B460B0253934310E3C580A3BFC451F663C1361FB1FD8FFC0617F38590D11E74365454665D67BDEFBBCCFFB3CCFDFFDF0A7FFF3CFDEFCFDF2E95EF1F233DDD273F7A41F38E99C5CD69772FA424ACF0B9C05207FE60B7BB5D1DB9BF1DF1626EFC5CFFFF64CF5BBF76FBF528EBE73E3F99F0094433CAB7A4A109F11076347D3744A1D84E68543D041D021C8C5D051FD489145A0AE0EC3E6675907C616633E4521813E41AEE21B945A84988C5A0459043958F310700972297439F60836287528F518F189E6E8D0B75020340B44A32B8DCEB4D99ED66BA3A8BDD7AA8D3B8D69ABDA6F56A266ADD7D8EDD6AABD72B15DDA6995763A9B172BDB9BB59D9DE6F666ADBCD3AA577BCD7A5CA9F51A8DB8B8DDE8B627A59DCED9470AC5ADF67470753A38B832BB5EDE6905C142905AB5FD05DB5D00C87BE8F4A57FFEAFFFFBC7DFFB8FCF3CF9B78757DE7EFCE95B4F3CFFFEBF7EF7F7FFE7FFFEBF773EF8E737DFFB1FFDEB7FBD764F7B7FF6CDCDC7868BEEC9656B7981E773229F9679475F017071A7F6950BCDEF5D88DFDD9AFDACFEE447AB8FBC74B6FEEDFD1BB72F545F04348F449A121F23976297101B11971017211B2113211B211B41076A2E462E820EC5AE1243083630D2093409349166106461ECA8F71FEF8AC7CD4E4C480C480CE5DA50EC329C50884C349B634FB117881D8C7C8A0283240C14E8C801D383A7A3DE61AB356935C6FDCE7EB735EB34A6517DDCAAF6CB3BADE276A352EAEC6CD52B3B51E162AD5EED15B6EADB9B8D62A15DDC6ED4ABBD6AA55DDEED148B8DFA6E3F6ACF0A85D6A5CDFA6070D4694C9EB9F2ECD5C31BA74F9F41CC7313CBA69D33ACAC17AEF8F6D27FFECD3F7DF0B33FBCF8C2EDC3A377F66FDC9A3C7E6BFFC59FFEAB77FECB6BB7FEE98DF7FED77D676F142B2F3477BFE459A796C313393D9BE7D945B190E10BA65801DAC285F28B0F57DF782CBEB5B5F74161FF176B8FBE5C19BF73F4A59F6AC103806520F520B1547D3176207635E4A8275DD55749A018B9C74CCEA0D422D8809A4050CED11C99101AAACA73C6424CC66CCA0CCC2C480C482C7ADCD7446108F12976959A88A987A94F7040512048C890A7131F4C46D727F1E3DDF6A41F4DFAD16434D86F3747D1EEA8531DD68A9DF24E6B67AB5E2DB46A85E8D2D9D2F666A358E89476A27221AAEDF41AE5FE6EA5DB687677AB9D52A139880E1AB5E1C58BE572B9D58F4657A657CE3CF0A8B4D2DCCA18F6826EE6A49195411E20FBD68F7FF3EB5FFFCBABAFFFFAC9A7DE1D3E7173F0F8BBD7FEFCE3C75FFBF86B7FF32FDF7CFB0FF77C2EEE365E487B7F8C409095B90C4F85285C3156F362C5E26B002C7DF1E2B317DB3FDA9AFEB270F0E1F6FEFBA72E7C7DFAF42FCE575F067485E09070971013124B230E633EA301C101463E820E5607581858183A18DA849894197397409308320D10C5B215F9BBE3D1606C30662BF68D9985A8ADA6A5A2D5183B943A8CD994988CF918B9047B18F958F3280AB0E631E48161BC3F191EF6A3D1A03FE9F76751348E5AE36E63D2AAC7D552AB526E558ACD6AA155BEDC2C6FB6372FD50B5BCDC256BD5C6C574ADD62B153ACB4EAA576AF1E17B71BF7DEF7C52B936BA3DEA45CAE964A95B38F5E5C5EBC4BE769DB5876AC35CAB25CCFB8FE12C0CEB75EBDF9D147FFF8E60F3F79EAF99F8DAFDD1A5CBB3DFD935F1D7CEB775F7DE7BF5FFBF2FB77DDDB39B17651E285245BCECA4C9E6757E5D29AB1B6C0176DB204C0CAF9E29F6EB5DEBE30FA79FDFADF5F18BCB7BAF5CAB5173EC89CAA0398A5C427C484CC44D4C6705E058C3FED6B821C865CAAD0035B889A4A41C548C748C7D0C4D05455C6D8F8F49744122C11E40049851E4A8DE2D45570819807B14390A398224501D6029D67290A14880BE881717C30ECEF0DFB7BFDDEB4D79B767A93767B1CB586AD7ABFB1DB55B5AE14DBD542A75688CA5BAD7A296A55FBAD6A7F77A7BD5B8E9AB568D089CBDB95FB3FFF90ED259F3CBAB13F3EBC707EF3739F7FC0F7B38691B28DBCEFACBBE69AA52F197ADE72160172BAAD1B376F7EF2D6DBBF7BEEA50FA74FDCEE1EBE5B39B8357BE593977FF88FB5E82F57364A8E712269AE67F49594CC667976CD585992CB79B9E4B2150056EE7FE4FAF9E8ED73F1FBD5ABBF3DD3FEEBB3F18F0F9EB90DF4CF019466C42358AAED9929ED027D5A6B4A7C0C1DA2D9143A1C5A3AB109961809A831A8318C74A41DD717E90AC19500A268B53216143127C43DDE424D446DC43C446D8C2D821C8A3D4E42AC7904FA48B3E7B7823D308CF6A6BDC371EF601C1FC4F17E77306B77C79D66BF55EFB69ABD6AA55D29B7CA3BADCA76B356ECB4CA834E75306C8EA24AB75668B62BDD381A6E5DD83CFB8547D3C9CCE2D24AABD898C67B671E7CC44BE40C3BE53839CBC89832EB99CB96C8EB3C6D5A4B007AE71E8D5E7FFD83EFFEE093AF7DF3EF0F9FFAC5E0F0BDF2F4DFF49FFEF77FF2DAEF2AB5AF437622E3DD95E09994CCFA24CCE9F90D677DD158C9B0BC4397015858BF6FF450F3AD8BE35F349FFA78E5D2EBA3673FDA895E0578159294649EE426253A45068716C10641D6A70D8E145B7004722D6C1BC42488438D22C810E418E908E9F34D124A0275820DD5E9EA69D089ABFE14212E21EE71C51D425C482C0D9B185B8A6BAAD809231E230EA596520AC1A47B34684EF6E3AB7BC3A3D1702F1ECE7ADD51A73D68D4A372B955AC740AA556B5DA2D17A36AB9572975BBEDC96EB95D2BB63E77CF997C66D573C395E513D9D4E2D2C2EAC953F76C3E72E99E93F75A5668BA7929B2869E35F5B463651D2B6BEAA1A9A7A4486B327B72F5FCCF7FFE8797BFF1D1D7BEFEDBEBCFFC72FFFACF9A07B72A831FDD78E1C3D3F70E005AF4EDA584990965CA81EE9ABFBEE1AC2FC9C52C4D3B3803E812B0CE9C6D7FFFF2958F1ACF7D7CCFF6B79F7AF13F00ED14D0B292644DE67362706271600BE42A9C4548D7B0A96113D179A528B274624B622044102208320425043A4273E0C61A57145039329CFA4CB385E650E860EC701E2866AD781E23BEAA3E632E86A672733833954D03A144D4C4D802A3C1E168B03F1D1D4D4707A3C12C1E4C7BBD69A73D6C36FAF5FAA058EED6EBC34AA9DBA8C6CD4AAFBDDB6B56A2DA6EF4C0C3E7A49F32DCA46327134ED23213B697F6C37C102C58564AE8492A4329D29C257599B1F49CA9A74D3D65C88494213052882FFCE8CDDF7CEBAD7F78FDADFFF6D5573FB9F1FCAF46D73ED8BBF293C1E40700AC72B9E8C9B4A587A1C8A66476C3DF583196F32C9722699BE4115E0168E37CF4A38BB30FAAD77FF558F7FBCDE17781B6CAF0A2454293041C3A6AC184FC0E00000D8F494441541961D8E6D0C0D0BC638D2B0440C485D841C8C448A710518830240830A809A831AC714E0C81758EA44E6C8A0C4EEEF00D87629BE0F948549E03410E233E412E231EC52EA7FE5C9F42FA67852A822C30ECEFC5BDD9B03F1DC77BC3FE743CDAEFF5A6516B18D587EDC6B0511B544ADD6A392A159A8D72B7526C771BA37A293AFFD80E93BE10BE4E5C5BF8961EEA22D04568EA29D3C84891143CD4F524E7812E538287BA4C19322579C29049626600484E26AF5C7BE1D6132F7EF8DC37FED373DFF88783673FFAF3D77E7FFEC2D300E493D6AAC792A14C85229B3716578CE545632527F22996B6480A910560FED176FC76F5FAAF0A073F1DBFF04B7F690768594253260D75E84BEC31E229F744853DD40C4474CE8B113511323134B126A94608C2181EB7B62630D219D6D5CACEB0CE89C1A1A16AAD3CF8B9AA872CB5AFABB58552EF33B8E10B96A0D855641C219D528B62174C46573BEDE1383E887BB3717C301D1DF53AD37E6BD2DE1D342BBD5AA55BABF676CB51AB1ED72ADD72B15D2B76A3DD51541F1B32A9EB499D8592799C3826F30D1108E10BE14BEE4BE6491970EE319190465A9729299292878CF9C24C0398385FB8DE99BDD939BCD979FC76FFFACF0FBFF4E16B7FF1713A7B1E82548266532C9DC4491F27D7ACD5356B352797922213D08485028C73405B89AEDE8EBEF4DBC2F4E6F9C62B405B013487C81D01C427684EAE09B218F1E68E2D31103529B52831119473C909620D10A8314D139AA643288FE540A96A2A99A36C338A3D8CDC3B2391114F7934F397CCC5D8A1D8E5346028A0D853B566CCC64867C461C803D3D1D5D1E070323C9C0E0E86D1743A38EAB766C3F6ACDF9A342BBD56BD5FAB743AED61ADDADBAD746BD541B5D0E954879DDAE8EE530FAA86953C9434619084CE422943881DC67CC93C5D4F501E3091107A8ACBA4E0A16081103E97498013777F61D099BD558EFFAA32FE9BCAF8E6E4C6FBFDEE5F0090F3D96282A693309197F98CC86DD8ABCBC6624E5F08582AE4091B27045B0468B97BE5DDD94B1FB7AFDD5EFAA31868CB4C2C20E26AC4A2C4574551AB0A86360616231E86A6D2F018B538B1746263C810641AA440A3000A0075002D84740DEB00CD115699380CCD432018F9103B88DA84D88CF9403311B521B1307338574F92AB041095EF21C4C4D85092A1443E18C747D3D1D5417F160FF6D4E945B3617FAFDF8E3BCD7EBBD18B5AC3DD4AB7BEDBAFD7BAB55ABF51EE360B9D56A1B3F558C592699DA73909054B70EA4BEEEB22E0D455B115C94343A6743DA9EB09290329031510C5320540D2CE9FDBBB71B3D07D6BBBF383FAFE7B474FDC4E2D9780964AF2BC47C2244EE658262FF3EBDEFA82B99495B994CC062C65A040E759A02DF5AEBC7BF495BFAB0EDE04E46E20363049AB1591105BB134257262E4AA97C744DB62D4E2C46050604820C400324D13084A45F88E03663A803AC48E5AF439F5190A280AD49E498882664F431E2273699B1EE71A30B4390D18F32975103229B639F5297418F2C0383E9A0C0F67E32BE3786F1CEF8DE38361B4D7EB8C07DD71D4EE77DA8346BDD7AC0D3ACD9162DCF552BBBED3AA5EDEEDD54777ADDD0781C57082D380119F535F17A1E4099D853A0B7591943C346452CA50CA90F340F05017492ED300E500D988F6BEBFD97EE3B1C61B676B6F35A26F037CB7616CF834E3A130CB734B7C61DD5E3BE16E2CE88B59994BEB199F252C9A306516680B87CFFEE4E0CBFF76E3CC2100AB002D509264C443C4A3D439CE6C984ADC60C865C845DADC5B41501228A8C6A9C69046E718AD1908E810E818DE09E25818B99C25D99C923B82F814BB4A96521962A5BAA80D9E528B339B6083118F608F10172952882C866D3AE7D7FD3DB5CE8CE383C9F070D4DD8F5B7B516B3CE84EFBD1281E4CE3C15ED49EB49BA3A835EE5407F552BB566CED5CAAB4CAD1B9873725F719F10509049B579C628FD3409080535FB040D12325E9F279FB871ACD00B2DC9FBD51EEBE79AEFEC6E5E65F3D76F16900962C9CF75098C0614EE4D78CB50D637DD55CCB89C59CC8A758D225BE817D83A701CACF9EBAF9ECCBFF0EB0D3002F0896E39A2F69C0884790A572201419049A02D92A5F8A344BD9AF041B040A8E0483738B000141A049B10D156941BA5A61D45672876C70EC11CD56FE80520715F1B8937A50DAF771EACC21C4557D2D9827A8CBA90F26A3ABF160EF60766D7FFAF86870D86FCD068DBD5E73DC6B0EE3DE2C1EECF5BB7B51B4D7E9CCEABBFD4E75D8ACF4CA3BADE276AD52D8DDBCB8B3B07CD2D24383069226044B50E213EC091630E209E133E6721E3091202C60229446DAD44343041A4E02946DC7AF965AAF5FA8FFE576ED7BB9C51D0072697DCDC7C914492D5B2BA7EC93A7CC8D25B19AE3CB39914FD3B487130E094D9A0220FFD24B1F8C7ADF01DA0A128B02A7244D70EAEAC467D8E6C4E2C4A2F3008DCFA1730CB80E8626D418860C03822123502028B12609D419B534AC1F5F9521A8CD9486471C461CC18239704347855D1972295236E39CD811AA336A10A81B34A0C71F8AA189A024D8C0D00671FF6036B9368A8FC6F151DCDBEF77F6DBF571A719F7A3C9A03B556734D81FF6F7BAED517B77502FF54ADB9D9DCDD6D6E5FAE6A56AA5D4A1D41322217982200743F5FD7C4A3D444D426CCE3DC65C2E43AE9084FA5286980700268BA5E71BBDEF5C2C7DA3DB7B1380931659F148E8136F592EDC65AD9F764E9C763616F4E50C5F48B094CF120E752DEA73EC019018C47F2ABCCF032D4B4992319F335B509B604330EF3830A616748B40537D2B821CA4594833B026B1263540A04611E40872B52B2AE943FD178C78043977429473978B989FAEFBD8BD2364DF9981CA2B10D49534A0D8558E04A72EC326C536188FAFC6F1FE6878308E0F4683C36E7B32EA5FE93587FDD668D49D296C190DF6E3DEA4DB8E9BB55EBDDA2B16DADB9BCDADCBF5CB17CA95EDB66165280F28F1054B309C103C4589AF210731073347089F52473538E7811009C65C2642A025EE3ADD887ADF2A14BE3A1B7E0F80A580AC24692A2DC2756BE994B37ECA593F69AF2DE8CB197D29E4690FBB2EB10D6CEBDCD780F7C7F76E032D09518AC190115F105F29CE101A84D842B8041B8C3892FB6A6AA9BA6B4022A0D64289348A358EA05477733C186D082D65B828195AC3264226C1066736674AE9F6307620B454AD213130B3E6616DECCEBB9ECCDFA3AE8D638F11070C2747C3E1C1647C341E1DF6A3493F9A759AA3F66E6F184D07EDB1AA75DC9BF5A351BF376E3706AD7A5CDAE95CBE5CBB7CB172F942F1C2239BEB27EF25DC65CC67C4A72860384158888887982F4552F284426D2943C143446DC65CCC7DA0054EFAA1C3A3EF172E3F77E9E29304AF25D95A9A6652343CE9AE9E723636AC8D13E6468E2F67F8528A654292F44960E3C0A649499336CF7035007082E30422C1DCD9A31E8486DACB2975203420919419080B04A506F89C7240AE6A0DA101A1A58AC2A9AF4808B9130B5119126C50645164E8DC15746E411CC74BCCE3BEB61871187205F1551C851017C279B084224BEDE8FBC378BF17CD86C3A35E6F2F6A4F3AB538DA8DE3D674184D4783FDC9F0F098081E349BC3466D50DCA96F5F2E6D5D2A5E3EB775E1D18B5B9B45216D2A3CC143C1129287047B88A849A8A2E009461C217C45BD197130F5104E012DDB8EBE56DDFAF2D90727265C09F94A407219965FB3D6379C136BD6FAAAB996E3AB59B692668B01C93828B0B12734CBC6810E7D9D859C841C27040929F40908184EA81583520700A9A467447595D2838043209166602434A8D0431EFB353A423A841223819190C2265050248F5D2E8B619B619B619333136141A88EA84EA9A55296947CD60EF695678FB10111C7D860442DF72E38983D31E8EEF5BB7BE3E1955E34EB76A6EDDD41B3D419F7F6A2D660323E188F0E87F1FEA0B73F1C5C6937868DDD6EA950DFBCB873F9D2CEB9C72E5D38BFF9E823E757574E32E962EE236A13EE2A4851F92E41428E7D463C4A3D443C4A128C78940784A701CA34A3AF544ACFDE7B4FDD418B49B69C24D9BC5C583557D6CDF593CEC945B1B4A8AFE5E5528AE65C98B0A16F2157479684B64E7C8A956118A843A0CF5592113B4224141A70EA236A626CDC61D0489BA7AA11E450139FAD3542FA1DD9881293D1B9EBA842C09CBA44ED818A72A8EC19B315D553B55633535D0F463AC192337B1E7F50DA53DCDB5783B1D7990EBA7B8DDD7EA7D957A07170782D1ECE86C383517CD4ED4C1BF55EB3D6AB555A854BC5F30F9F3FFBE0D97367CE3E74EFFD0F3FF0C5C0CF4A19203477F519F1244D3014089C9234C9B1CF884F4902A304C51E222E1329A0254F7FBE5A2E3D6138F7847C3120A9344DAFD92B1BD6DA86B5B1225796F8D2B2BE9413F90CCBBA28B091AB234720D3E21E9B8771FD4F776225B6293704F904076A822164422895BFA5045284748838460243F3386433AFB5863F958A9872B3B083887B07BE39F7309E37FB9DA9A8C09A5397CDC7A325A84D91A14470359F11B2413F9A8D068783EE9E12A17A9D71371AB7EA71D4190DE3FD413C9D4C0FC7A3FDF1E870DCDB3B1A3F3EE94D2B85DD2F9E79E4FEFB1E3C75EAEEF5F5138B0BAB613267DB69463CA63E92F9CA512538A028A428A4703E39194E30E432E652EA01CD3F71F776B97055D74F84229FA0E934CF2C994B1BCEFAAAB9B6ACAFE4596ED9585C94F90CCB0434E960CF249E413D4E5D463C4603041D656F2364CF257CEC61E423E8CDED44645164616D0E0E739305E99FFE8C1D088D3BC88B90AE4A39CF0D2B2E415C4A3D425CCC1C426CA5654BEC29C2A7EE40DD8DA29B921802EB080855EB3B499DFF0F62B8BC81C396A2930000000049454E44AE426082,'Mike.Hillyer@sakilastaff.com',1,1,'Mike','8cb2237d0679ca88db6464eac60da96345513964','2006-02-15 03:57:16'), +(2,'Jon','Stephens',4,NULL,'Jon.Stephens@sakilastaff.com',2,1,'Jon',NULL,'2006-02-15 03:57:16'); +/*!40000 ALTER TABLE `staff` ENABLE KEYS */; +UNLOCK TABLES; +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; diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Properties/sakila-schema.sql b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Properties/sakila-schema.sql new file mode 100644 index 000000000..27d72af88 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Properties/sakila-schema.sql @@ -0,0 +1,647 @@ +-- Sakila Sample Database Schema +-- Version 1.0 + +-- Copyright © 2006, 2025, Oracle and/or its affiliates. + +-- 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 Oracle 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'; + +DROP SCHEMA IF EXISTS sakila; +CREATE SCHEMA sakila; +USE sakila; + +-- +-- Table structure for table `actor` +-- + +CREATE TABLE actor ( + actor_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, + first_name VARCHAR(45) NOT NULL, + last_name VARCHAR(45) NOT NULL, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (actor_id), + KEY idx_actor_last_name (last_name) +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `address` +-- + +CREATE TABLE address ( + address_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, + address VARCHAR(50) NOT NULL, + address2 VARCHAR(50) DEFAULT NULL, + district VARCHAR(20) NOT NULL, + city_id SMALLINT UNSIGNED NOT NULL, + postal_code VARCHAR(10) DEFAULT NULL, + phone VARCHAR(20) NOT NULL, + /*!50705 location GEOMETRY NOT NULL,*/ + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (address_id), + KEY idx_fk_city_id (city_id), + /*!50705 SPATIAL KEY `idx_location` (location),*/ + CONSTRAINT `fk_address_city` FOREIGN KEY (city_id) REFERENCES city (city_id) ON DELETE RESTRICT ON UPDATE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `category` +-- + +CREATE TABLE category ( + category_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, + name VARCHAR(25) NOT NULL, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (category_id) +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `city` +-- + +CREATE TABLE city ( + city_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, + city VARCHAR(50) NOT NULL, + country_id SMALLINT UNSIGNED NOT NULL, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (city_id), + KEY idx_fk_country_id (country_id), + CONSTRAINT `fk_city_country` FOREIGN KEY (country_id) REFERENCES country (country_id) ON DELETE RESTRICT ON UPDATE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `country` +-- + +CREATE TABLE country ( + country_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, + country VARCHAR(50) NOT NULL, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (country_id) +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `customer` +-- + +CREATE TABLE customer ( + customer_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, + store_id TINYINT UNSIGNED NOT NULL, + first_name VARCHAR(45) NOT NULL, + last_name VARCHAR(45) NOT NULL, + email VARCHAR(50) DEFAULT NULL, + address_id SMALLINT UNSIGNED NOT NULL, + active BOOLEAN NOT NULL DEFAULT TRUE, + create_date DATETIME NOT NULL, + last_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (customer_id), + KEY idx_fk_store_id (store_id), + KEY idx_fk_address_id (address_id), + KEY idx_last_name (last_name), + CONSTRAINT fk_customer_address FOREIGN KEY (address_id) REFERENCES address (address_id) ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT fk_customer_store FOREIGN KEY (store_id) REFERENCES store (store_id) ON DELETE RESTRICT ON UPDATE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `film` +-- + +CREATE TABLE film ( + film_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, + title VARCHAR(255) NOT NULL, + description TEXT DEFAULT NULL, + release_year YEAR DEFAULT NULL, + language_id TINYINT UNSIGNED NOT NULL, + original_language_id TINYINT UNSIGNED DEFAULT NULL, + rental_duration TINYINT UNSIGNED NOT NULL DEFAULT 3, + rental_rate DECIMAL(4,2) NOT NULL DEFAULT 4.99, + length SMALLINT UNSIGNED DEFAULT NULL, + replacement_cost DECIMAL(5,2) NOT NULL DEFAULT 19.99, + rating ENUM('G','PG','PG-13','R','NC-17') DEFAULT 'G', + special_features SET('Trailers','Commentaries','Deleted Scenes','Behind the Scenes') DEFAULT NULL, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (film_id), + KEY idx_title (title), + KEY idx_fk_language_id (language_id), + KEY idx_fk_original_language_id (original_language_id), + CONSTRAINT fk_film_language FOREIGN KEY (language_id) REFERENCES language (language_id) ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT fk_film_language_original FOREIGN KEY (original_language_id) REFERENCES language (language_id) ON DELETE RESTRICT ON UPDATE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `film_actor` +-- + +CREATE TABLE film_actor ( + actor_id SMALLINT UNSIGNED NOT NULL, + film_id SMALLINT UNSIGNED NOT NULL, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (actor_id,film_id), + KEY idx_fk_film_id (`film_id`), + CONSTRAINT fk_film_actor_actor FOREIGN KEY (actor_id) REFERENCES actor (actor_id) ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT fk_film_actor_film FOREIGN KEY (film_id) REFERENCES film (film_id) ON DELETE RESTRICT ON UPDATE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `film_category` +-- + +CREATE TABLE film_category ( + film_id SMALLINT UNSIGNED NOT NULL, + category_id TINYINT UNSIGNED NOT NULL, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (film_id, category_id), + CONSTRAINT fk_film_category_film FOREIGN KEY (film_id) REFERENCES film (film_id) ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT fk_film_category_category FOREIGN KEY (category_id) REFERENCES category (category_id) ON DELETE RESTRICT ON UPDATE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `film_text` +-- +-- InnoDB added FULLTEXT support in 5.6.10. If you use an +-- earlier version, then consider upgrading (recommended) or +-- changing InnoDB to MyISAM as the film_text engine +-- + +CREATE TABLE film_text ( + film_id SMALLINT NOT NULL, + title VARCHAR(255) NOT NULL, + description TEXT, + PRIMARY KEY (film_id), + FULLTEXT KEY idx_title_description (title,description) +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Triggers for loading film_text from film +-- + +DELIMITER ;; +CREATE TRIGGER `ins_film` AFTER INSERT ON `film` FOR EACH ROW BEGIN + INSERT INTO film_text (film_id, title, description) + VALUES (new.film_id, new.title, new.description); + END;; + + +CREATE TRIGGER `upd_film` AFTER UPDATE ON `film` FOR EACH ROW BEGIN + IF (old.title != new.title) OR (old.description != new.description) OR (old.film_id != new.film_id) + THEN + UPDATE film_text + SET title=new.title, + description=new.description, + film_id=new.film_id + WHERE film_id=old.film_id; + END IF; + END;; + + +CREATE TRIGGER `del_film` AFTER DELETE ON `film` FOR EACH ROW BEGIN + DELETE FROM film_text WHERE film_id = old.film_id; + END;; + +DELIMITER ; + +-- +-- Table structure for table `inventory` +-- + +CREATE TABLE inventory ( + inventory_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT, + film_id SMALLINT UNSIGNED NOT NULL, + store_id TINYINT UNSIGNED NOT NULL, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (inventory_id), + KEY idx_fk_film_id (film_id), + KEY idx_store_id_film_id (store_id,film_id), + CONSTRAINT fk_inventory_store FOREIGN KEY (store_id) REFERENCES store (store_id) ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT fk_inventory_film FOREIGN KEY (film_id) REFERENCES film (film_id) ON DELETE RESTRICT ON UPDATE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `language` +-- + +CREATE TABLE language ( + language_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, + name CHAR(20) NOT NULL, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (language_id) +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `payment` +-- + +CREATE TABLE payment ( + payment_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, + customer_id SMALLINT UNSIGNED NOT NULL, + staff_id TINYINT UNSIGNED NOT NULL, + rental_id INT DEFAULT NULL, + amount DECIMAL(5,2) NOT NULL, + payment_date DATETIME NOT NULL, + last_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (payment_id), + KEY idx_fk_staff_id (staff_id), + KEY idx_fk_customer_id (customer_id), + CONSTRAINT fk_payment_rental FOREIGN KEY (rental_id) REFERENCES rental (rental_id) ON DELETE SET NULL ON UPDATE CASCADE, + CONSTRAINT fk_payment_customer FOREIGN KEY (customer_id) REFERENCES customer (customer_id) ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT fk_payment_staff FOREIGN KEY (staff_id) REFERENCES staff (staff_id) ON DELETE RESTRICT ON UPDATE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +-- +-- Table structure for table `rental` +-- + +CREATE TABLE rental ( + rental_id INT NOT NULL AUTO_INCREMENT, + rental_date DATETIME NOT NULL, + inventory_id MEDIUMINT UNSIGNED NOT NULL, + customer_id SMALLINT UNSIGNED NOT NULL, + return_date DATETIME DEFAULT NULL, + staff_id TINYINT UNSIGNED NOT NULL, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (rental_id), + UNIQUE KEY (rental_date,inventory_id,customer_id), + KEY idx_fk_inventory_id (inventory_id), + KEY idx_fk_customer_id (customer_id), + KEY idx_fk_staff_id (staff_id), + CONSTRAINT fk_rental_staff FOREIGN KEY (staff_id) REFERENCES staff (staff_id) ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT fk_rental_inventory FOREIGN KEY (inventory_id) REFERENCES inventory (inventory_id) ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT fk_rental_customer FOREIGN KEY (customer_id) REFERENCES customer (customer_id) ON DELETE RESTRICT ON UPDATE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `staff` +-- + +CREATE TABLE staff ( + staff_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, + first_name VARCHAR(45) NOT NULL, + last_name VARCHAR(45) NOT NULL, + address_id SMALLINT UNSIGNED NOT NULL, + picture BLOB DEFAULT NULL, + email VARCHAR(50) DEFAULT NULL, + store_id TINYINT UNSIGNED NOT NULL, + active BOOLEAN NOT NULL DEFAULT TRUE, + username VARCHAR(16) NOT NULL, + password VARCHAR(40) BINARY DEFAULT NULL, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (staff_id), + KEY idx_fk_store_id (store_id), + KEY idx_fk_address_id (address_id), + CONSTRAINT fk_staff_store FOREIGN KEY (store_id) REFERENCES store (store_id) ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT fk_staff_address FOREIGN KEY (address_id) REFERENCES address (address_id) ON DELETE RESTRICT ON UPDATE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Table structure for table `store` +-- + +CREATE TABLE store ( + store_id TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, + manager_staff_id TINYINT UNSIGNED NOT NULL, + address_id SMALLINT UNSIGNED NOT NULL, + last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (store_id), + UNIQUE KEY idx_unique_manager (manager_staff_id), + KEY idx_fk_address_id (address_id), + CONSTRAINT fk_store_staff FOREIGN KEY (manager_staff_id) REFERENCES staff (staff_id) ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT fk_store_address FOREIGN KEY (address_id) REFERENCES address (address_id) ON DELETE RESTRICT ON UPDATE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- View structure for view `customer_list` +-- + +CREATE VIEW customer_list +AS +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; + +-- +-- View structure for view `film_list` +-- + +CREATE VIEW film_list +AS +SELECT film.film_id AS FID, film.title AS title, film.description AS description, category.name AS category, film.rental_rate AS price, + film.length AS length, film.rating AS rating, GROUP_CONCAT(CONCAT(actor.first_name, _utf8' ', actor.last_name) SEPARATOR ', ') AS actors +FROM category LEFT JOIN film_category ON category.category_id = film_category.category_id LEFT JOIN film ON film_category.film_id = film.film_id + JOIN film_actor ON film.film_id = film_actor.film_id + JOIN actor ON film_actor.actor_id = actor.actor_id +GROUP BY film.film_id, category.name; + +-- +-- View structure for view `nicer_but_slower_film_list` +-- + +CREATE VIEW nicer_but_slower_film_list +AS +SELECT film.film_id AS FID, film.title AS title, film.description AS description, category.name AS category, film.rental_rate AS price, + film.length AS length, film.rating AS rating, GROUP_CONCAT(CONCAT(CONCAT(UCASE(SUBSTR(actor.first_name,1,1)), + LCASE(SUBSTR(actor.first_name,2,LENGTH(actor.first_name))),_utf8' ',CONCAT(UCASE(SUBSTR(actor.last_name,1,1)), + LCASE(SUBSTR(actor.last_name,2,LENGTH(actor.last_name)))))) SEPARATOR ', ') AS actors +FROM category LEFT JOIN film_category ON category.category_id = film_category.category_id LEFT JOIN film ON film_category.film_id = film.film_id + JOIN film_actor ON film.film_id = film_actor.film_id + JOIN actor ON film_actor.actor_id = actor.actor_id +GROUP BY film.film_id, category.name; + +-- +-- View structure for view `staff_list` +-- + +CREATE VIEW staff_list +AS +SELECT s.staff_id AS ID, CONCAT(s.first_name, _utf8' ', s.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, s.store_id AS SID +FROM staff AS s JOIN address AS a ON s.address_id = a.address_id JOIN city ON a.city_id = city.city_id + JOIN country ON city.country_id = country.country_id; + +-- +-- View structure for view `sales_by_store` +-- + +CREATE VIEW sales_by_store +AS +SELECT +CONCAT(c.city, _utf8',', cy.country) AS store +, CONCAT(m.first_name, _utf8' ', m.last_name) AS manager +, SUM(p.amount) AS total_sales +FROM payment AS p +INNER JOIN rental AS r ON p.rental_id = r.rental_id +INNER JOIN inventory AS i ON r.inventory_id = i.inventory_id +INNER JOIN store AS s ON i.store_id = s.store_id +INNER JOIN address AS a ON s.address_id = a.address_id +INNER JOIN city AS c ON a.city_id = c.city_id +INNER JOIN country AS cy ON c.country_id = cy.country_id +INNER JOIN staff AS m ON s.manager_staff_id = m.staff_id +GROUP BY s.store_id +ORDER BY cy.country, c.city; + +-- +-- View structure for view `sales_by_film_category` +-- +-- Note that total sales will add up to >100% because +-- some titles belong to more than 1 category +-- + +CREATE VIEW sales_by_film_category +AS +SELECT +c.name AS category +, SUM(p.amount) AS total_sales +FROM payment AS p +INNER JOIN rental AS r ON p.rental_id = r.rental_id +INNER JOIN inventory AS i ON r.inventory_id = i.inventory_id +INNER JOIN film AS f ON i.film_id = f.film_id +INNER JOIN film_category AS fc ON f.film_id = fc.film_id +INNER JOIN category AS c ON fc.category_id = c.category_id +GROUP BY c.name +ORDER BY total_sales DESC; + +-- +-- View structure for view `actor_info` +-- + +CREATE DEFINER=CURRENT_USER SQL SECURITY INVOKER VIEW actor_info +AS +SELECT +a.actor_id, +a.first_name, +a.last_name, +GROUP_CONCAT(DISTINCT CONCAT(c.name, ': ', + (SELECT GROUP_CONCAT(f.title ORDER BY f.title SEPARATOR ', ') + FROM sakila.film f + INNER JOIN sakila.film_category fc + ON f.film_id = fc.film_id + INNER JOIN sakila.film_actor fa + ON f.film_id = fa.film_id + WHERE fc.category_id = c.category_id + AND fa.actor_id = a.actor_id + ) + ) + ORDER BY c.name SEPARATOR '; ') +AS film_info +FROM sakila.actor a +LEFT JOIN sakila.film_actor fa + ON a.actor_id = fa.actor_id +LEFT JOIN sakila.film_category fc + ON fa.film_id = fc.film_id +LEFT JOIN sakila.category c + ON fc.category_id = c.category_id +GROUP BY a.actor_id, a.first_name, a.last_name; + +-- +-- Procedure structure for procedure `rewards_report` +-- + +DELIMITER // + +CREATE PROCEDURE rewards_report ( + IN min_monthly_purchases TINYINT UNSIGNED + , IN min_dollar_amount_purchased DECIMAL(10,2) UNSIGNED + , OUT count_rewardees INT +) +LANGUAGE SQL +NOT DETERMINISTIC +READS SQL DATA +SQL SECURITY DEFINER +COMMENT 'Provides a customizable report on best customers' +proc: BEGIN + + DECLARE last_month_start DATE; + DECLARE last_month_end DATE; + + /* Some sanity checks... */ + IF min_monthly_purchases = 0 THEN + SELECT 'Minimum monthly purchases parameter must be > 0'; + LEAVE proc; + END IF; + IF min_dollar_amount_purchased = 0.00 THEN + SELECT 'Minimum monthly dollar amount purchased parameter must be > $0.00'; + LEAVE proc; + END IF; + + /* Determine start and end time periods */ + SET last_month_start = DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH); + SET last_month_start = STR_TO_DATE(CONCAT(YEAR(last_month_start),'-',MONTH(last_month_start),'-01'),'%Y-%m-%d'); + SET last_month_end = LAST_DAY(last_month_start); + + /* + Create a temporary storage area for + Customer IDs. + */ + CREATE TEMPORARY TABLE tmpCustomer (customer_id SMALLINT UNSIGNED NOT NULL PRIMARY KEY); + + /* + Find all customers meeting the + monthly purchase requirements + */ + INSERT INTO tmpCustomer (customer_id) + SELECT p.customer_id + FROM payment AS p + WHERE DATE(p.payment_date) BETWEEN last_month_start AND last_month_end + GROUP BY customer_id + HAVING SUM(p.amount) > min_dollar_amount_purchased + AND COUNT(customer_id) > min_monthly_purchases; + + /* Populate OUT parameter with count of found customers */ + SELECT COUNT(*) FROM tmpCustomer INTO count_rewardees; + + /* + Output ALL customer information of matching rewardees. + Customize output as needed. + */ + SELECT c.* + FROM tmpCustomer AS t + INNER JOIN customer AS c ON t.customer_id = c.customer_id; + + /* Clean up */ + DROP TABLE tmpCustomer; +END // + +DELIMITER ; + +DELIMITER $$ + +CREATE FUNCTION get_customer_balance(p_customer_id INT, p_effective_date DATETIME) RETURNS DECIMAL(5,2) + DETERMINISTIC + READS SQL DATA +BEGIN + + #OK, WE NEED TO CALCULATE THE CURRENT BALANCE GIVEN A CUSTOMER_ID AND A DATE + #THAT WE WANT THE BALANCE TO BE EFFECTIVE FOR. THE BALANCE IS: + # 1) RENTAL FEES FOR ALL PREVIOUS RENTALS + # 2) ONE DOLLAR FOR EVERY DAY THE PREVIOUS RENTALS ARE OVERDUE + # 3) IF A FILM IS MORE THAN RENTAL_DURATION * 2 OVERDUE, CHARGE THE REPLACEMENT_COST + # 4) SUBTRACT ALL PAYMENTS MADE BEFORE THE DATE SPECIFIED + + DECLARE v_rentfees DECIMAL(5,2); #FEES PAID TO RENT THE VIDEOS INITIALLY + DECLARE v_overfees INTEGER; #LATE FEES FOR PRIOR RENTALS + DECLARE v_payments DECIMAL(5,2); #SUM OF PAYMENTS MADE PREVIOUSLY + + SELECT IFNULL(SUM(film.rental_rate),0) INTO v_rentfees + FROM film, inventory, rental + WHERE film.film_id = inventory.film_id + AND inventory.inventory_id = rental.inventory_id + AND rental.rental_date <= p_effective_date + AND rental.customer_id = p_customer_id; + + SELECT IFNULL(SUM(IF((TO_DAYS(rental.return_date) - TO_DAYS(rental.rental_date)) > film.rental_duration, + ((TO_DAYS(rental.return_date) - TO_DAYS(rental.rental_date)) - film.rental_duration),0)),0) INTO v_overfees + FROM rental, inventory, film + WHERE film.film_id = inventory.film_id + AND inventory.inventory_id = rental.inventory_id + AND rental.rental_date <= p_effective_date + AND rental.customer_id = p_customer_id; + + + SELECT IFNULL(SUM(payment.amount),0) INTO v_payments + FROM payment + + WHERE payment.payment_date <= p_effective_date + AND payment.customer_id = p_customer_id; + + RETURN v_rentfees + v_overfees - v_payments; +END $$ + +DELIMITER ; + +DELIMITER $$ + +CREATE PROCEDURE film_in_stock(IN p_film_id INT, IN p_store_id INT, OUT p_film_count INT) +READS SQL DATA +BEGIN + SELECT inventory_id + FROM inventory + WHERE film_id = p_film_id + AND store_id = p_store_id + AND inventory_in_stock(inventory_id); + + SELECT FOUND_ROWS() INTO p_film_count; +END $$ + +DELIMITER ; + +DELIMITER $$ + +CREATE PROCEDURE film_not_in_stock(IN p_film_id INT, IN p_store_id INT, OUT p_film_count INT) +READS SQL DATA +BEGIN + SELECT inventory_id + FROM inventory + WHERE film_id = p_film_id + AND store_id = p_store_id + AND NOT inventory_in_stock(inventory_id); + + SELECT FOUND_ROWS() INTO p_film_count; +END $$ + +DELIMITER ; + +DELIMITER $$ + +CREATE FUNCTION inventory_held_by_customer(p_inventory_id INT) RETURNS INT +READS SQL DATA +BEGIN + DECLARE v_customer_id INT; + DECLARE EXIT HANDLER FOR NOT FOUND RETURN NULL; + + SELECT customer_id INTO v_customer_id + FROM rental + WHERE return_date IS NULL + AND inventory_id = p_inventory_id; + + RETURN v_customer_id; +END $$ + +DELIMITER ; + +DELIMITER $$ + +CREATE FUNCTION inventory_in_stock(p_inventory_id INT) RETURNS BOOLEAN +READS SQL DATA +BEGIN + DECLARE v_rentals INT; + DECLARE v_out INT; + + #AN ITEM IS IN-STOCK IF THERE ARE EITHER NO ROWS IN THE rental TABLE + #FOR THE ITEM OR ALL ROWS HAVE return_date POPULATED + + SELECT COUNT(*) INTO v_rentals + FROM rental + WHERE inventory_id = p_inventory_id; + + IF v_rentals = 0 THEN + RETURN TRUE; + END IF; + + SELECT COUNT(rental_id) INTO v_out + FROM inventory LEFT JOIN rental USING(inventory_id) + WHERE inventory.inventory_id = p_inventory_id + AND rental.return_date IS NULL; + + IF v_out > 0 THEN + RETURN FALSE; + ELSE + RETURN TRUE; + END IF; +END $$ + +DELIMITER ; + +SET SQL_MODE=@OLD_SQL_MODE; +SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; +SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; + + diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/SakilaDb.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/SakilaDb.cs new file mode 100644 index 000000000..f85c5e1aa --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/SakilaDb.cs @@ -0,0 +1,399 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Data.Entity; +using System.Data.Common; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + [DbConfigurationType(typeof(MySqlEFConfiguration))] + public partial class SakilaDb : DbContext + { + + public SakilaDb() + : base(CodeFirstFixture.GetEFConnectionString("sakila")) + { + } + + public SakilaDb(DbConnection existingConnection, bool contextOwnsConnection) + : base(existingConnection, contextOwnsConnection) + { + } + + public virtual DbSet actors { get; set; } + public virtual DbSet
addresses { get; set; } + public virtual DbSet categories { get; set; } + public virtual DbSet cities { get; set; } + public virtual DbSet countries { get; set; } + public virtual DbSet customers { get; set; } + public virtual DbSet films { get; set; } + public virtual DbSet film_actor { get; set; } + public virtual DbSet film_category { get; set; } + public virtual DbSet film_text { get; set; } + public virtual DbSet inventories { get; set; } + public virtual DbSet languages { get; set; } + public virtual DbSet payments { get; set; } + public virtual DbSet rentals { get; set; } + public virtual DbSet staffs { get; set; } + public virtual DbSet stores { get; set; } + public virtual DbSet actor_info { get; set; } + public virtual DbSet customer_list { get; set; } + public virtual DbSet film_list { get; set; } + public virtual DbSet nicer_but_slower_film_list { get; set; } + public virtual DbSet sales_by_film_category { get; set; } + public virtual DbSet sales_by_store { get; set; } + public virtual DbSet staff_list { get; set; } + + protected override void OnModelCreating(DbModelBuilder modelBuilder) + { + modelBuilder.Entity() + .Property(e => e.first_name) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.last_name) + .IsUnicode(false); + + modelBuilder.Entity() + .HasMany(e => e.film_actor) + .WithRequired(e => e.actor) + .WillCascadeOnDelete(false); + + modelBuilder.Entity
() + .Property(e => e.address1) + .IsUnicode(false); + + modelBuilder.Entity
() + .Property(e => e.address2) + .IsUnicode(false); + + modelBuilder.Entity
() + .Property(e => e.district) + .IsUnicode(false); + + modelBuilder.Entity
() + .Property(e => e.postal_code) + .IsUnicode(false); + + modelBuilder.Entity
() + .Property(e => e.phone) + .IsUnicode(false); + + modelBuilder.Entity
() + .HasMany(e => e.customers) + .WithRequired(e => e.address) + .WillCascadeOnDelete(false); + + modelBuilder.Entity
() + .HasMany(e => e.staffs) + .WithRequired(e => e.address) + .WillCascadeOnDelete(false); + + modelBuilder.Entity
() + .HasMany(e => e.stores) + .WithRequired(e => e.address) + .WillCascadeOnDelete(false); + + modelBuilder.Entity() + .Property(e => e.name) + .IsUnicode(false); + + modelBuilder.Entity() + .HasMany(e => e.film_category) + .WithRequired(e => e.category) + .WillCascadeOnDelete(false); + + modelBuilder.Entity() + .Property(e => e.city1) + .IsUnicode(false); + + modelBuilder.Entity() + .HasMany(e => e.addresses) + .WithRequired(e => e.city) + .WillCascadeOnDelete(false); + + modelBuilder.Entity() + .Property(e => e.country1) + .IsUnicode(false); + + modelBuilder.Entity() + .HasMany(e => e.cities) + .WithRequired(e => e.country) + .WillCascadeOnDelete(false); + + modelBuilder.Entity() + .Property(e => e.first_name) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.last_name) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.email) + .IsUnicode(false); + + modelBuilder.Entity() + .HasMany(e => e.payments) + .WithRequired(e => e.customer) + .WillCascadeOnDelete(false); + + modelBuilder.Entity() + .HasMany(e => e.rentals) + .WithRequired(e => e.customer) + .WillCascadeOnDelete(false); + + modelBuilder.Entity() + .Property(e => e.title) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.description) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.rating) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.special_features) + .IsUnicode(false); + + modelBuilder.Entity() + .HasMany(e => e.film_actor) + .WithRequired(e => e.film) + .WillCascadeOnDelete(false); + + modelBuilder.Entity() + .HasMany(e => e.film_category) + .WithRequired(e => e.film) + .WillCascadeOnDelete(false); + + modelBuilder.Entity() + .HasMany(e => e.inventories) + .WithRequired(e => e.film) + .WillCascadeOnDelete(false); + + modelBuilder.Entity() + .Property(e => e.title) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.description) + .IsUnicode(false); + + modelBuilder.Entity() + .HasMany(e => e.rentals) + .WithRequired(e => e.inventory) + .WillCascadeOnDelete(false); + + modelBuilder.Entity() + .Property(e => e.name) + .IsUnicode(false); + + modelBuilder.Entity() + .HasMany(e => e.films) + .WithRequired(e => e.language) + .HasForeignKey(e => e.language_id) + .WillCascadeOnDelete(false); + + modelBuilder.Entity() + .HasMany(e => e.films1) + .WithOptional(e => e.language1) + .HasForeignKey(e => e.original_language_id); + + modelBuilder.Entity() + .Property(e => e.first_name) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.last_name) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.email) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.username) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.password) + .IsUnicode(false); + + modelBuilder.Entity() + .HasMany(e => e.payments) + .WithRequired(e => e.staff) + .WillCascadeOnDelete(false); + + modelBuilder.Entity() + .HasMany(e => e.rentals) + .WithRequired(e => e.staff) + .WillCascadeOnDelete(false); + + modelBuilder.Entity() + .HasMany(e => e.stores) + .WithRequired(e => e.staff) + .HasForeignKey(e => e.manager_staff_id) + .WillCascadeOnDelete(false); + + modelBuilder.Entity() + .HasMany(e => e.customers) + .WithRequired(e => e.store) + .WillCascadeOnDelete(false); + + modelBuilder.Entity() + .HasMany(e => e.inventories) + .WithRequired(e => e.store) + .WillCascadeOnDelete(false); + + modelBuilder.Entity() + .HasMany(e => e.staffs) + .WithRequired(e => e.store) + .HasForeignKey(e => e.store_id) + .WillCascadeOnDelete(false); + + modelBuilder.Entity() + .Property(e => e.first_name) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.last_name) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.film_info) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.name) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.address) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.zip_code) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.phone) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.city) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.country) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.notes) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.title) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.description) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.category) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.rating) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.actors) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.title) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.description) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.category) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.rating) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.actors) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.category) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.store) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.manager) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.name) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.address) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.zip_code) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.phone) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.city) + .IsUnicode(false); + + modelBuilder.Entity() + .Property(e => e.country) + .IsUnicode(false); + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/actor.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/actor.cs new file mode 100644 index 000000000..593109cba --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/actor.cs @@ -0,0 +1,61 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + [Table("actor")] + public partial class actor + { + public actor() + { + film_actor = new HashSet(); + } + + [Key] + [Column(TypeName = "usmallint")] + public int actor_id { get; set; } + + [Required] + [StringLength(45)] + public string first_name { get; set; } + + [Required] + [StringLength(45)] + public string last_name { get; set; } + + [Column(TypeName = "timestamp")] + public DateTime last_update { get; set; } + + public virtual ICollection film_actor { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/actor_info.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/actor_info.cs new file mode 100644 index 000000000..6d67e3e3b --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/actor_info.cs @@ -0,0 +1,56 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + [Table("actor_info")] + public partial class actor_info + { + [Key] + [Column(Order = 0, TypeName = "usmallint")] + [DatabaseGenerated(DatabaseGeneratedOption.None)] + public int actor_id { get; set; } + + [Key] + [Column(Order = 1)] + [StringLength(45)] + public string first_name { get; set; } + + [Key] + [Column(Order = 2)] + [StringLength(45)] + public string last_name { get; set; } + + [Column(TypeName = "text")] + [StringLength(65535)] + public string film_info { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/address.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/address.cs new file mode 100644 index 000000000..57de2b153 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/address.cs @@ -0,0 +1,83 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + [Table("address")] + public partial class address + { + public address() + { + customers = new HashSet(); + staffs = new HashSet(); + stores = new HashSet(); + } + + [Key] + [Column(TypeName = "usmallint")] + public int address_id { get; set; } + + [Column("address")] + [Required] + [StringLength(50)] + public string address1 { get; set; } + + [StringLength(50)] + public string address2 { get; set; } + + [Required] + [StringLength(20)] + public string district { get; set; } + + [Column(TypeName = "usmallint")] + public int city_id { get; set; } + + [StringLength(10)] + public string postal_code { get; set; } + + [Required] + [StringLength(20)] + public string phone { get; set; } + + [Column(TypeName = "timestamp")] + public DateTime last_update { get; set; } + + public virtual city city { get; set; } + + public virtual ICollection customers { get; set; } + + public virtual ICollection staffs { get; set; } + + public virtual ICollection stores { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/category.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/category.cs new file mode 100644 index 000000000..ef201da34 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/category.cs @@ -0,0 +1,57 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + [Table("category")] + public partial class category + { + public category() + { + film_category = new HashSet(); + } + + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public byte category_id { get; set; } + + [Required] + [StringLength(25)] + public string name { get; set; } + + [Column(TypeName = "timestamp")] + public DateTime last_update { get; set; } + + public virtual ICollection film_category { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/city.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/city.cs new file mode 100644 index 000000000..6df411949 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/city.cs @@ -0,0 +1,63 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + [Table("city")] + public partial class city + { + public city() + { + addresses = new HashSet
(); + } + + [Key] + [Column(TypeName = "usmallint")] + public int city_id { get; set; } + + [Column("city")] + [Required] + [StringLength(50)] + public string city1 { get; set; } + + [Column(TypeName = "usmallint")] + public int country_id { get; set; } + + [Column(TypeName = "timestamp")] + public DateTime last_update { get; set; } + + public virtual ICollection
addresses { get; set; } + + public virtual country country { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/country.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/country.cs new file mode 100644 index 000000000..85a4613db --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/country.cs @@ -0,0 +1,58 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + [Table("country")] + public partial class country + { + public country() + { + cities = new HashSet(); + } + + [Key] + [Column(TypeName = "usmallint")] + public int country_id { get; set; } + + [Column("country")] + [Required] + [StringLength(50)] + public string country1 { get; set; } + + [Column(TypeName = "timestamp")] + public DateTime last_update { get; set; } + + public virtual ICollection cities { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/customer.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/customer.cs new file mode 100644 index 000000000..5d6fbbeca --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/customer.cs @@ -0,0 +1,80 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + [Table("customer")] + public partial class customer + { + public customer() + { + payments = new HashSet(); + rentals = new HashSet(); + } + + [Key] + [Column(TypeName = "usmallint")] + public int customer_id { get; set; } + + public byte store_id { get; set; } + + [Required] + [StringLength(45)] + public string first_name { get; set; } + + [Required] + [StringLength(45)] + public string last_name { get; set; } + + [StringLength(50)] + public string email { get; set; } + + [Column(TypeName = "usmallint")] + public int address_id { get; set; } + + public bool active { get; set; } + + public DateTime create_date { get; set; } + + [Column(TypeName = "timestamp")] + public DateTime last_update { get; set; } + + public virtual address address { get; set; } + + public virtual store store { get; set; } + + public virtual ICollection payments { get; set; } + + public virtual ICollection rentals { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/customer_list.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/customer_list.cs new file mode 100644 index 000000000..a0440407f --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/customer_list.cs @@ -0,0 +1,80 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + [Table("customer_list")] + public partial class customer_list + { + [Key] + [Column(Order = 0, TypeName = "usmallint")] + [DatabaseGenerated(DatabaseGeneratedOption.None)] + public int ID { get; set; } + + [Key] + [Column(Order = 1)] + [StringLength(91)] + public string name { get; set; } + + [Key] + [Column(Order = 2)] + [StringLength(50)] + public string address { get; set; } + + [Column("zip code")] + [StringLength(10)] + public string zip_code { get; set; } + + [Key] + [Column(Order = 3)] + [StringLength(20)] + public string phone { get; set; } + + [Key] + [Column(Order = 4)] + [StringLength(50)] + public string city { get; set; } + + [Key] + [Column(Order = 5)] + [StringLength(50)] + public string country { get; set; } + + [Key] + [Column(Order = 6)] + [StringLength(6)] + public string notes { get; set; } + + [Key] + [Column(Order = 7)] + public byte SID { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film.cs new file mode 100644 index 000000000..715aa9f60 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film.cs @@ -0,0 +1,95 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + [Table("film")] + public partial class film + { + public film() + { + film_actor = new HashSet(); + film_category = new HashSet(); + inventories = new HashSet(); + } + + [Key] + [Column(TypeName = "usmallint")] + public int film_id { get; set; } + + [Required] + [StringLength(255)] + public string title { get; set; } + + [Column(TypeName = "text")] + [StringLength(65535)] + public string description { get; set; } + + [Column(TypeName = "year")] + public short? release_year { get; set; } + + public byte language_id { get; set; } + + public byte? original_language_id { get; set; } + + public byte rental_duration { get; set; } + + public decimal rental_rate { get; set; } + + [Column(TypeName = "usmallint")] + public int? length { get; set; } + + public decimal replacement_cost { get; set; } + + [Column(TypeName = "enum")] + [StringLength(65532)] + public string rating { get; set; } + + [Column(TypeName = "set")] + [StringLength(65531)] + public string special_features { get; set; } + + [Column(TypeName = "timestamp")] + public DateTime last_update { get; set; } + + public virtual ICollection film_actor { get; set; } + + public virtual ICollection film_category { get; set; } + + public virtual language language { get; set; } + + public virtual language language1 { get; set; } + + public virtual ICollection inventories { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film_actor.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film_actor.cs new file mode 100644 index 000000000..572dd915f --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film_actor.cs @@ -0,0 +1,56 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + [Table("film_actor")] + public partial class film_actor + { + [Key] + [Column(Order = 0, TypeName = "usmallint")] + [DatabaseGenerated(DatabaseGeneratedOption.None)] + public int actor_id { get; set; } + + [Key] + [Column(Order = 1, TypeName = "usmallint")] + [DatabaseGenerated(DatabaseGeneratedOption.None)] + public int film_id { get; set; } + + [Column(TypeName = "timestamp")] + public DateTime last_update { get; set; } + + public virtual actor actor { get; set; } + + public virtual film film { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film_category.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film_category.cs new file mode 100644 index 000000000..f76371277 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film_category.cs @@ -0,0 +1,55 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + [Table("film_category")] + public partial class film_category + { + [Key] + [Column(Order = 0, TypeName = "usmallint")] + [DatabaseGenerated(DatabaseGeneratedOption.None)] + public int film_id { get; set; } + + [Key] + [Column(Order = 1)] + public byte category_id { get; set; } + + [Column(TypeName = "timestamp")] + public DateTime last_update { get; set; } + + public virtual category category { get; set; } + + public virtual film film { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film_list.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film_list.cs new file mode 100644 index 000000000..cfb3c6c80 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film_list.cs @@ -0,0 +1,64 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + [Table("film_list")] + public partial class film_list + { + [Column(TypeName = "usmallint")] + public int? FID { get; set; } + + [StringLength(255)] + public string title { get; set; } + + [Column(TypeName = "text")] + [StringLength(65535)] + public string description { get; set; } + + [Key] + [StringLength(25)] + public string category { get; set; } + + public decimal? price { get; set; } + + [Column(TypeName = "usmallint")] + public int? length { get; set; } + + [Column(TypeName = "enum")] + [StringLength(65532)] + public string rating { get; set; } + + [Column(TypeName = "text")] + [StringLength(65535)] + public string actors { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film_text.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film_text.cs new file mode 100644 index 000000000..327a9b74e --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film_text.cs @@ -0,0 +1,49 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + [Table("film_text")] + public partial class film_text + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.None)] + public short film_id { get; set; } + + [Required] + [StringLength(255)] + public string title { get; set; } + + [Column(TypeName = "text")] + [StringLength(65535)] + public string description { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/inventory.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/inventory.cs new file mode 100644 index 000000000..c8506e285 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/inventory.cs @@ -0,0 +1,62 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + [Table("inventory")] + public partial class inventory + { + public inventory() + { + rentals = new HashSet(); + } + + [Key] + [Column(TypeName = "umediumint")] + public int inventory_id { get; set; } + + [Column(TypeName = "usmallint")] + public int film_id { get; set; } + + public byte store_id { get; set; } + + [Column(TypeName = "timestamp")] + public DateTime last_update { get; set; } + + public virtual film film { get; set; } + + public virtual store store { get; set; } + + public virtual ICollection rentals { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/language.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/language.cs new file mode 100644 index 000000000..f725d5b97 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/language.cs @@ -0,0 +1,61 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + [Table("language")] + public partial class language + { + public language() + { + films = new HashSet(); + films1 = new HashSet(); + } + + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public byte language_id { get; set; } + + [Column(TypeName = "char")] + [Required] + [StringLength(20)] + public string name { get; set; } + + [Column(TypeName = "timestamp")] + public DateTime last_update { get; set; } + + public virtual ICollection films { get; set; } + + public virtual ICollection films1 { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/nicer_but_slower_film_list.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/nicer_but_slower_film_list.cs new file mode 100644 index 000000000..c6bbcc04f --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/nicer_but_slower_film_list.cs @@ -0,0 +1,64 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + [Table("nicer_but_slower_film_list")] + public partial class nicer_but_slower_film_list + { + [Column(TypeName = "usmallint")] + public int? FID { get; set; } + + [StringLength(255)] + public string title { get; set; } + + [Column(TypeName = "text")] + [StringLength(65535)] + public string description { get; set; } + + [Key] + [StringLength(25)] + public string category { get; set; } + + public decimal? price { get; set; } + + [Column(TypeName = "usmallint")] + public int? length { get; set; } + + [Column(TypeName = "enum")] + [StringLength(65532)] + public string rating { get; set; } + + [Column(TypeName = "text")] + [StringLength(65535)] + public string actors { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/payment.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/payment.cs new file mode 100644 index 000000000..5e2f44097 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/payment.cs @@ -0,0 +1,62 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + [Table("payment")] + public partial class payment + { + [Key] + [Column(TypeName = "usmallint")] + public int payment_id { get; set; } + + [Column(TypeName = "usmallint")] + public int customer_id { get; set; } + + public byte staff_id { get; set; } + + public int? rental_id { get; set; } + + public decimal amount { get; set; } + + public DateTime payment_date { get; set; } + + [Column(TypeName = "timestamp")] + public DateTime last_update { get; set; } + + public virtual customer customer { get; set; } + + public virtual rental rental { get; set; } + + public virtual staff staff { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/rental.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/rental.cs new file mode 100644 index 000000000..676725c55 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/rental.cs @@ -0,0 +1,70 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + [Table("rental")] + public partial class rental + { + public rental() + { + payments = new HashSet(); + } + + [Key] + public int rental_id { get; set; } + + public DateTime rental_date { get; set; } + + [Column(TypeName = "umediumint")] + public int inventory_id { get; set; } + + [Column(TypeName = "usmallint")] + public int customer_id { get; set; } + + public DateTime? return_date { get; set; } + + public byte staff_id { get; set; } + + [Column(TypeName = "timestamp")] + public DateTime last_update { get; set; } + + public virtual customer customer { get; set; } + + public virtual inventory inventory { get; set; } + + public virtual ICollection payments { get; set; } + + public virtual staff staff { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/sales_by_film_category.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/sales_by_film_category.cs new file mode 100644 index 000000000..92f6a88a8 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/sales_by_film_category.cs @@ -0,0 +1,43 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + [Table("sales_by_film_category")] + public partial class sales_by_film_category + { + [Key] + [StringLength(25)] + public string category { get; set; } + + public decimal? total_sales { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/sales_by_store.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/sales_by_store.cs new file mode 100644 index 000000000..d6c5e81dc --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/sales_by_store.cs @@ -0,0 +1,49 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + [Table("sales_by_store")] + public partial class sales_by_store + { + [Key] + [Column(Order = 0)] + [StringLength(101)] + public string store { get; set; } + + [Key] + [Column(Order = 1)] + [StringLength(91)] + public string manager { get; set; } + + public decimal? total_sales { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/staff.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/staff.cs new file mode 100644 index 000000000..d117df6ff --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/staff.cs @@ -0,0 +1,91 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + [Table("staff")] + public partial class staff + { + public staff() + { + payments = new HashSet(); + rentals = new HashSet(); + stores = new HashSet(); + } + + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public byte staff_id { get; set; } + + [Required] + [StringLength(45)] + public string first_name { get; set; } + + [Required] + [StringLength(45)] + public string last_name { get; set; } + + [Column(TypeName = "usmallint")] + public int address_id { get; set; } + + [Column(TypeName = "blob")] + public byte[] picture { get; set; } + + [StringLength(50)] + public string email { get; set; } + + public byte store_id { get; set; } + + public bool active { get; set; } + + [Required] + [StringLength(16)] + public string username { get; set; } + + [StringLength(40)] + public string password { get; set; } + + [Column(TypeName = "timestamp")] + public DateTime last_update { get; set; } + + public virtual address address { get; set; } + + public virtual ICollection payments { get; set; } + + public virtual ICollection rentals { get; set; } + + public virtual store store { get; set; } + + public virtual ICollection stores { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/staff_list.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/staff_list.cs new file mode 100644 index 000000000..3ed986485 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/staff_list.cs @@ -0,0 +1,74 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + [Table("staff_list")] + public partial class staff_list + { + [Key] + [Column(Order = 0)] + public byte ID { get; set; } + + [Key] + [Column(Order = 1)] + [StringLength(91)] + public string name { get; set; } + + [Key] + [Column(Order = 2)] + [StringLength(50)] + public string address { get; set; } + + [Column("zip code")] + [StringLength(10)] + public string zip_code { get; set; } + + [Key] + [Column(Order = 3)] + [StringLength(20)] + public string phone { get; set; } + + [Key] + [Column(Order = 4)] + [StringLength(50)] + public string city { get; set; } + + [Key] + [Column(Order = 5)] + [StringLength(50)] + public string country { get; set; } + + [Key] + [Column(Order = 6)] + public byte SID { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/store.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/store.cs new file mode 100644 index 000000000..e32a13c0c --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/store.cs @@ -0,0 +1,68 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + [Table("store")] + public partial class store + { + public store() + { + customers = new HashSet(); + inventories = new HashSet(); + staffs = new HashSet(); + } + + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public byte store_id { get; set; } + + public byte manager_staff_id { get; set; } + + [Column(TypeName = "usmallint")] + public int address_id { get; set; } + + [Column(TypeName = "timestamp")] + public DateTime last_update { get; set; } + + public virtual address address { get; set; } + + public virtual ICollection customers { get; set; } + + public virtual ICollection inventories { get; set; } + + public virtual ICollection staffs { get; set; } + + public virtual staff staff { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Ship.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Ship.cs new file mode 100644 index 000000000..b25950334 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Ship.cs @@ -0,0 +1,99 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Data.Entity; + + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + public class Harbor + { + public int HarborId { get; set; } + public virtual ICollection Ships { get; set; } + + public string Description { get; set; } + } + + public class Ship + { + public int ShipId { get; set; } + public int HarborId { get; set; } + public virtual Harbor Harbor { get; set; } + public virtual ICollection CrewMembers { get; set; } + + public string Description { get; set; } + } + + public class CrewMember + { + public int CrewMemberId { get; set; } + public int ShipId { get; set; } + public virtual Ship Ship { get; set; } + public int RankId { get; set; } + public virtual Rank Rank { get; set; } + public int ClearanceId { get; set; } + public virtual Clearance Clearance { get; set; } + + public string Description { get; set; } + } + + public class Rank + { + public int RankId { get; set; } + public virtual ICollection CrewMembers { get; set; } + + public string Description { get; set; } + } + + public class Clearance + { + public int ClearanceId { get; set; } + public virtual ICollection CrewMembers { get; set; } + + public string Description { get; set; } + } + + [DbConfigurationType(typeof(MySqlEFConfiguration))] + public class ShipContext : DbContext + { + public DbSet Harbors { get; set; } + public DbSet Ships { get; set; } + public DbSet CrewMembers { get; set; } + public DbSet Ranks { get; set; } + public DbSet Clearances { get; set; } + + public ShipContext() : base(CodeFirstFixture.GetEFConnectionString()) + { + Database.SetInitializer(new DropCreateDatabaseAlways()); + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SiteDB.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SiteDB.cs new file mode 100644 index 000000000..8e30623d4 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/SiteDB.cs @@ -0,0 +1,103 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Data.Entity; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + [Table("pagina")] + public class pagina + { + [Key] + public long nCdPagina { get; set; } + public long nCdVisitante { get; set; } + public string sDsUrlReferencia { get; set; } + public string sDsPalavraChave { get; set; } + public string sDsTitulo { get; set; } + + [ForeignKey("nCdVisitante")] + public visitante visitante { get; set; } + } + + public class retorno + { + //[Key] + public long Key { get; set; } + public int Online { get; set; } + } + + [Table("site")] + public class site + { + [Key] + public long nCdSite { get; set; } + public string sDsTitulo { get; set; } + public string sDsUrl { get; set; } + public DateTime tDtCadastro { get; set; } + } + + [Table("visitante")] + public class visitante + { + [Key] + public long nCdVisitante { get; set; } + public long nCdSite { get; set; } + public string sDsIp { get; set; } + public DateTime tDtCadastro { get; set; } + public DateTime tDtAtualizacao { get; set; } + + [ForeignKey("nCdSite")] + public site site { get; set; } + } + + [DbConfigurationType(typeof(MySqlEFConfiguration))] + public class SiteDbContext : DbContext + { + public DbSet Visitante { get; set; } + public DbSet Site { get; set; } + //public DbSet Retorno { get; set; } + public DbSet Pagina { get; set; } + + public SiteDbContext() : base(CodeFirstFixture.GetEFConnectionString()) + { + Database.SetInitializer(new SiteDbInitializer()); + Database.SetInitializer(new MigrateDatabaseToLatestVersion>()); + } + } + + public class SiteDbInitializer : DropCreateDatabaseReallyAlways + { + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/TransactionTests.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/TransactionTests.cs new file mode 100644 index 000000000..15be38e01 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/TransactionTests.cs @@ -0,0 +1,75 @@ +// Copyright © 2016, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System.Data.Entity.Infrastructure; +using NUnit.Framework; + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + public class TransactionTests : CodeFirstFixture + { + [Test] + public void DisposeNestedTransactions() + { + using (SakilaDb context = new SakilaDb()) + { + using (var trans = context.Database.BeginTransaction()) + { + Assert.Throws(() => context.Database.ExecuteSqlCommand("update abc")); + } + } + + // new second transaction + using (SakilaDb context = new SakilaDb()) + { + using (var trans = context.Database.BeginTransaction()) + { + Assert.Throws(() => context.Database.ExecuteSqlCommand("update abc")); + } + } + } + + [Test] + public void NestedTransactionsUniqueKey() + { + using (SakilaDb context = new SakilaDb()) + { + var store = new store + { + manager_staff_id = 1 + }; + context.stores.Add(store); + for (int i = 0; i < 10; i++) + { + Assert.Throws(() => context.SaveChanges()); + } + } + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Vehicle.cs b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Vehicle.cs new file mode 100644 index 000000000..f95bbbfa1 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.CodeFirst.Tests/Vehicle.cs @@ -0,0 +1,414 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Data.Entity; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + + +namespace MySql.Data.EntityFramework.CodeFirst.Tests +{ + + [DbConfigurationType(typeof(MySqlEFConfiguration))] + public class VehicleDbContext : DbContext + { + public DbSet Vehicles { get; set; } + public DbSet Manufacturers { get; set; } + public DbSet Distributors { get; set; } + + public VehicleDbContext() : base(CodeFirstFixture.GetEFConnectionString()) + { + Database.SetInitializer(new VehicleDBInitializer()); + } + + protected override void OnModelCreating(DbModelBuilder modelBuilder) + { + //modelBuilder.Entity() + // .Map(o => o.ToTable("Cars")) + // .Map(o => o.ToTable("Bikes")); + modelBuilder.Entity().ToTable("Cars"); + modelBuilder.Entity().ToTable("Bikes"); + } + } + + public class VehicleDBInitializer : DropCreateDatabaseReallyAlways + { + } + + [DbConfigurationType(typeof(MySqlEFConfiguration))] + public class VehicleDbContext2 : DbContext + { + public DbSet Vehicles { get; set; } + + public VehicleDbContext2() : base(CodeFirstFixture.GetEFConnectionString()) + { + Database.SetInitializer(new VehicleDBInitializer2()); + } + } + + public class VehicleDBInitializer2 : DropCreateDatabaseReallyAlways + { + } + + /// + /// This initializer really drops the database, not just once per AppDomain (like the DropCreateDatabaseAlways). + /// + /// + public class DropCreateDatabaseReallyAlways : IDatabaseInitializer where TContext : DbContext + { + public void InitializeDatabase(TContext context) + { + context.Database.Delete(); + context.Database.CreateIfNotExists(); + this.Seed(context); + context.SaveChanges(); + } + + protected virtual void Seed(TContext context) + { + } + } + + public class Vehicle + { + public int Id { get; set; } + public int Year { get; set; } + + [MaxLength(1024)] + public string Name { get; set; } + } + + [DbConfigurationType(typeof(MySqlEFConfiguration))] + public class VehicleDbContext3 : DbContext + { + public DbSet Accessories { get; set; } + + public VehicleDbContext3() : base(CodeFirstFixture.GetEFConnectionString()) + { + + } + } + + public class Car4 : Vehicle4 + { + public string CarProperty { get; set; } + } + + public class Bike4 : Vehicle4 + { + public string BikeProperty { get; set; } + } + public class Manufacturer4 + { + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public Guid ManufacturerId { get; set; } + public string Name { get; set; } + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public Guid GroupIdentifier { get; set; } + public virtual ICollection Vehicles { get; set; } + } + public class Vehicle4 + { + public int Id { get; set; } + public int Year { get; set; } + + [MaxLength(1024)] + public string Name { get; set; } + public Guid ManufacturerId { get; set; } + [ForeignKey(nameof(ManufacturerId))] + public virtual Manufacturer4 Manufacturer { get; set; } + } + [DbConfigurationType(typeof(MySqlEFConfiguration))] + public class VehicleDbContext4 : DbContext + { + public DbSet Vehicles { get; set; } + public DbSet Manufacturers { get; set; } + + public VehicleDbContext4() : base(CodeFirstFixture.GetEFConnectionString()) + { + Database.SetInitializer(new VehicleDBInitializer4()); + + } + protected override void OnModelCreating(DbModelBuilder modelBuilder) + { + modelBuilder.Entity().ToTable("Vehicles"); + modelBuilder.Entity().ToTable("Cars"); + modelBuilder.Entity().ToTable("Bikes"); + } + } + public class VehicleDBInitializer4 : DropCreateDatabaseReallyAlways + { + } + + public class Accessory + { + [Key] + [MaxLength(255)] + public string Name { get; set; } + + [Required] + [MaxLength(80000)] + public string Description { get; set; } + + [Required] + [MaxLength(16777216)] + public string LongDescription { get; set; } + + } + + public class Car : Vehicle + { + public string CarProperty { get; set; } + } + + public class Bike : Vehicle + { + public string BikeProperty { get; set; } + } + public class Vehicle2 + { + public int Id { get; set; } + public int Year { get; set; } + [MaxLength(1024)] + public string Name { get; set; } + } + + public class Car2 : Vehicle2 + { + public string CarProperty { get; set; } + } + + public class Bike2 : Vehicle2 + { + public string BikeProperty { get; set; } + } + + public class Manufacturer + { + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public Guid ManufacturerId { get; set; } + public string Name { get; set; } + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public Guid GroupIdentifier { get; set; } + } + + public class Distributor + { + public int DistributorId { get; set; } + public string Name { get; set; } + } + + + public class Product + { + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public DateTime DateCreated { get; set; } + + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + [Column(TypeName = "timestamp")] + public DateTime Timestamp { get; set; } + + public DateTime DateTimeWithPrecision { get; set; } + + [Column(TypeName = "TimeStamp")] + public DateTime TimeStampWithPrecision { get; set; } + + } + + [DbConfigurationType(typeof(MySqlEFConfiguration))] + public class ProductsDbContext : DbContext + { + public DbSet Products { get; set; } + + public ProductsDbContext() : base(CodeFirstFixture.GetEFConnectionString()) + { + + } + + protected override void OnModelCreating(DbModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + + Database.SetInitializer(new ProductDBInitializer()); + + modelBuilder.Entity() + .Property(f => f.DateTimeWithPrecision) + .HasColumnType("DateTime") + .HasPrecision(3); + + modelBuilder.Entity() + .Property(f => f.TimeStampWithPrecision) + .HasColumnType("Timestamp") + .HasPrecision(3); + + Database.SetInitializer(new MigrateDatabaseToLatestVersion>()); + } + } + + public class ProductDBInitializer : DropCreateDatabaseReallyAlways + { + } + + public class Names + { + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + + public DateTime DateCreated { get; set; } + } + + [DbConfigurationType(typeof(MySqlEFConfiguration))] + public class ShortDbContext : DbContext + { + public DbSet Names { get; set; } + + public ShortDbContext() : base(CodeFirstFixture.GetEFConnectionString()) + { + + } + + protected override void OnModelCreating(DbModelBuilder modelBuilder) + { + modelBuilder.Entity() + .Property(f => f.DateCreated) + .HasColumnType("DateTime") + .HasPrecision(9); + } + } + + [DbConfigurationType(typeof(MySqlEFConfiguration))] + public class AutoIncrementBugContext : DbContext + { + public DbSet AutoIncrementBug { get; set; } + + public AutoIncrementBugContext() : base(CodeFirstFixture.GetEFConnectionString()) + { + Database.SetInitializer(new AutoIncrementBugInitialize()); + Database.SetInitializer(new DropCreateDatabaseAlways()); + } + + protected override void OnModelCreating(DbModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + } + } + + public class AutoIncrementBugInitialize : IDatabaseInitializer where TContext : DbContext + { + public void InitializeDatabase(TContext context) + { + context.Database.Delete(); + context.Database.CreateIfNotExists(); + this.Seed(context); + context.SaveChanges(); + } + + protected virtual void Seed(TContext context) + { + } + } + + public class AutoIncrementBug + { + [Key] + public short MyKey { get; set; } + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public long AutoIncrementBugId { get; set; } + public string Description { get; set; } + } + + public class AutoIncrementConfiguration : System.Data.Entity.Migrations.DbMigrationsConfiguration where TContext : DbContext + { + public AutoIncrementConfiguration() + { + AutomaticMigrationsEnabled = true; + //CodeGenerator = new MySqlMigrationCodeGenerator(); + SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.EntityFramework.MySqlMigrationSqlGenerator()); + } + } + + + [Table("client")] + public class Client + { + [Key] + public int Id { get; set; } + public ICollection Orders { get; set; } + } + + [Table("order")] + public class Order + { + [Key] + public int Id { get; set; } + public ICollection Items { get; set; } + public ICollection Discounts { get; set; } + } + + [Table("item")] + public class Item + { + [Key] + public int Id { get; set; } + } + + [Table("discount")] + public class Discount + { + [Key] + public int Id { get; set; } + } + + + [DbConfigurationType(typeof(MySqlEFConfiguration))] + public class UsingUnionContext : DbContext + { + public DbSet Clients { get; set; } + public DbSet Items { get; set; } + + public DbSet Orders { get; set; } + + public DbSet Discounts { get; set; } + + public UsingUnionContext() : base(CodeFirstFixture.GetEFConnectionString()) + { + + } + } + + + +} diff --git a/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/App.config b/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/App.config new file mode 100644 index 000000000..36cf34dcf --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/App.config @@ -0,0 +1,14 @@ + + + +
+ + + + + + + + + + \ No newline at end of file diff --git a/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/BlogsModel.cs b/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/BlogsModel.cs new file mode 100644 index 000000000..d2b4b4cf7 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/BlogsModel.cs @@ -0,0 +1,49 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Data.Entity; +using System.ComponentModel.DataAnnotations; + +namespace MySql.Data.EntityFramework.Migrations.Tests +{ + [DbConfigurationType(typeof(MySqlEFConfiguration))] + public class BlogContext : DbContext + { + public BlogContext() : base(SetUpMigrationsTests.ConnectionStringBlogContext) { } + + public DbSet Blog { get; set; } + + } + + public class Blog + { + [Key] + public int BlogId { get; set; } + public string Title { get; set; } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/MyConfiguration.cs b/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/MyConfiguration.cs new file mode 100644 index 000000000..b316b0781 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/MyConfiguration.cs @@ -0,0 +1,45 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using MySql.Data.EntityFramework; + +namespace MySql.Data.EntityFramework.Migrations.Tests +{ + public class MyConfiguration : MySqlEFConfiguration + { + public MyConfiguration() + : base() + { + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/MySql.EntityFramework.Migrations.Tests.csproj b/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/MySql.EntityFramework.Migrations.Tests.csproj new file mode 100644 index 000000000..dacd09bc8 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/MySql.EntityFramework.Migrations.Tests.csproj @@ -0,0 +1,61 @@ + + + + MySql.Data.EntityFramework.Migrations.Tests + Copyright © 2016, 2025, Oracle and/or its affiliates. + en-US + 9.4.0 + Oracle + net462;net48;net9.0 + MySql.EntityFramework.Migrations.Tests + MySql.EntityFramework.Migrations.Tests + MySql;.NET Connector;MySql Connector/NET + http://www.mysql.com/common/logos/logo-mysql-170x115.png + http://dev.mysql.com/downloads/ + GPL-2.0-only WITH Universal-FOSS-exception-1.0 + true + false + false + false + false + false + false + true + ..\..\..\ConnectorNetPublicKey.snk + true + CA2100 + latest + + + + + + + + + + + + + + + + + + + + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + \ No newline at end of file diff --git a/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/MySqlMigrationsTests.cs b/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/MySqlMigrationsTests.cs new file mode 100644 index 000000000..1fe29388d --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/MySqlMigrationsTests.cs @@ -0,0 +1,460 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Data.Entity; +using System.Data.Entity.Infrastructure; +using System.Data.Entity.Migrations.Model; +using System.Data.Entity.Migrations.Sql; +using System.Linq; +using NUnit.Framework; +using MySql.Data.MySqlClient; +using System.Data.Entity.Core.EntityClient; +using System.Data.Entity.Core.Metadata.Edm; + +namespace MySql.Data.EntityFramework.Migrations.Tests +{ + public class MySqlMigrationsTests : SetUpMigrationsTests + { + private MySqlProviderManifest ProviderManifest; + + public MySqlMigrationsTests() + { + Database.SetInitializer(new MigrateDatabaseToLatestVersion()); + } + + private MySqlConnection GetConnectionFromContext(DbContext ctx) + { + return (MySqlConnection)((EntityConnection)(((IObjectContextAdapter)ctx).ObjectContext.Connection)).StoreConnection; + } + + /// + /// Add int32 type column to existing table + /// + [Test] + public void AddColumnOperationMigration() + { + var migrationOperations = new List(); + + if (ProviderManifest == null) + ProviderManifest = new MySqlProviderManifest(Version.ToString()); + + TypeUsage tu = TypeUsage.CreateDefaultTypeUsage(PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.Int32)); + TypeUsage result = ProviderManifest.GetStoreType(tu); + + var intColumn = new ColumnModel(PrimitiveTypeKind.Int32, result) + { + Name = "TotalPosts", + IsNullable = false + }; + + var addColumnMigratioOperation = new AddColumnOperation("Blogs", intColumn); + migrationOperations.Add(addColumnMigratioOperation); + + using (BlogContext context = new BlogContext()) + { + if (context.Database.Exists()) context.Database.Delete(); + context.Database.Create(); + + using (MySqlConnection conn = new MySqlConnection(context.Database.Connection.ConnectionString)) + { + if (conn.State == System.Data.ConnectionState.Closed) conn.Open(); + Assert.That(GenerateAndExecuteMySQLStatements(migrationOperations), Is.EqualTo(true)); + + MySqlCommand query = new MySqlCommand("Select Column_name, Is_Nullable, Data_Type from information_schema.Columns where table_schema ='" + conn.Database + "' and table_name = 'Blogs' and column_name ='TotalPosts'", conn); + MySqlDataReader reader = query.ExecuteReader(); + while (reader.Read()) + { + Assert.That(reader[0].ToString(), Is.EqualTo("TotalPosts")); + Assert.That(reader[1].ToString(), Is.EqualTo("NO")); + Assert.That(reader[2].ToString(), Is.EqualTo("int")); + } + reader.Close(); + conn.Close(); + } + } + } + + /// + /// CreateTable operation + /// with the following columns int PostId string Title string Body + /// + [Test] + public void CreateTableOperationMigration() + { + + var migrationOperations = new List(); + var createTableOperation = CreateTableOperation(); + + migrationOperations.Add(createTableOperation); + + using (BlogContext context = new BlogContext()) + { + if (context.Database.Exists()) context.Database.Delete(); + context.Database.Create(); + + using (var conn = new MySqlConnection(context.Database.Connection.ConnectionString)) + { + if (conn.State == System.Data.ConnectionState.Closed) conn.Open(); + Assert.That(GenerateAndExecuteMySQLStatements(migrationOperations)); + using (MySqlCommand query = new MySqlCommand($"SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA ='{conn.Database}'" + + $" AND TABLE_NAME = 'Posts'", conn)) + { + using (MySqlDataReader reader = query.ExecuteReader()) + { + while (reader.Read()) + Assert.That(createTableOperation.Columns.Where(t => t.Name.Equals(reader[0].ToString())), Has.One.Items); + reader.Close(); + } + + + query.CommandText = $"SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '{conn.Database}' AND " + + $"TABLE_NAME = 'Posts' AND COLUMN_NAME = 'Password'"; + + Assert.That(query.ExecuteScalar().ToString(), Is.EqualTo("binary(10)").IgnoreCase); + } + } + } + } + + /// + /// CreateForeignKey operation + /// between Blogs and Posts table + /// + [Test] + public void CreateForeignKeyOperation() + { + var migrationOperations = new List(); + + // create dependant table Posts + var createTableOperation = CreateTableOperation(); + migrationOperations.Add(createTableOperation); + + // Add column BlogId to create the constraints + + if (ProviderManifest == null) + ProviderManifest = new MySqlProviderManifest(Version.ToString()); + + TypeUsage tu = TypeUsage.CreateDefaultTypeUsage(PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.Int32)); + TypeUsage result = ProviderManifest.GetStoreType(tu); + + var intColumn = new ColumnModel(PrimitiveTypeKind.Int32, result) + { + Name = "BlogId", + IsNullable = false + }; + + var addColumnMigratioOperation = new AddColumnOperation("Posts", intColumn); + migrationOperations.Add(addColumnMigratioOperation); + + // create constrain object + var createForeignkeyOperation = new AddForeignKeyOperation(); + + createForeignkeyOperation.Name = "FKBlogs"; + createForeignkeyOperation.DependentTable = "Posts"; + createForeignkeyOperation.DependentColumns.Add("BlogId"); + createForeignkeyOperation.CascadeDelete = true; + createForeignkeyOperation.PrincipalTable = "Blogs"; + createForeignkeyOperation.PrincipalColumns.Add("BlogId"); + + //create index to use + migrationOperations.Add(createForeignkeyOperation.CreateCreateIndexOperation()); + + migrationOperations.Add(createForeignkeyOperation); + + + using (BlogContext context = new BlogContext()) + { + + if (context.Database.Exists()) context.Database.Delete(); + context.Database.Create(); + + Assert.That(GenerateAndExecuteMySQLStatements(migrationOperations), Is.EqualTo(true)); + + using (var conn = new MySqlConnection(context.Database.Connection.ConnectionString)) + { + if (conn.State == System.Data.ConnectionState.Closed) conn.Open(); + // check for foreign key creation + MySqlCommand query = new MySqlCommand("select Count(*) from information_schema.table_constraints where LOWER(constraint_type) = 'foreign key' and constraint_schema = '" + conn.Database + "' and constraint_name = 'FKBlogs'", conn); + int rows = Convert.ToInt32(query.ExecuteScalar()); + Assert.That(rows, Is.EqualTo(1)); + // check for table creation + query = new MySqlCommand("select Count(*) from information_schema.Tables WHERE `table_name` = 'Posts' and `table_schema` = '" + conn.Database + "' ", conn); + rows = Convert.ToInt32(query.ExecuteScalar()); + Assert.That(rows, Is.EqualTo(1)); + conn.Close(); + } + + // Test fix for + MySqlConnection con = GetConnectionFromContext(context); + con.Open(); + try + { + MySqlCommand cmd = new MySqlCommand("show create table `Posts`", con); + using (MySqlDataReader r = cmd.ExecuteReader()) + { + r.Read(); + string sql = r.GetString(1); + Assert.That(sql.IndexOf( + " CONSTRAINT `FKBlogs` FOREIGN KEY (`BlogId`) REFERENCES `blogs` (`BlogId`) ON DELETE CASCADE ON UPDATE CASCADE", + StringComparison.OrdinalIgnoreCase) != -1); + } + } + finally + { + con.Close(); + } + } + } + + + /// + /// Remove PK and the autoincrement property for the column + /// + + [Test] + public void DropPrimaryKeyOperationWithAnonymousArguments() + { + + var migrationOperations = new List(); + + // create table where the PK exists + var createTableOperation = CreateTableOperation(); + migrationOperations.Add(createTableOperation); + + var createDropPKOperation = new DropPrimaryKeyOperation(anonymousArguments: new { DeleteAutoIncrement = true }); + createDropPKOperation.Table = "Posts"; + createDropPKOperation.Columns.Add("PostId"); + migrationOperations.Add(createDropPKOperation); + + using (BlogContext context = new BlogContext()) + { + if (context.Database.Exists()) context.Database.Delete(); + context.Database.Create(); + + + Assert.That(GenerateAndExecuteMySQLStatements(migrationOperations), Is.EqualTo(true)); + + using (var conn = new MySqlConnection(context.Database.Connection.ConnectionString)) + { + if (conn.State == System.Data.ConnectionState.Closed) conn.Open(); + + // check for table creation + var query = new MySqlCommand("select Count(*) from information_schema.Tables WHERE `table_name` = 'Posts' and `table_schema` = '" + conn.Database + "' ", conn); + int rows = Convert.ToInt32(query.ExecuteScalar()); + Assert.That(rows, Is.EqualTo(1)); + + // check if PK exists + query = new MySqlCommand("select Count(*) from information_schema.table_constraints where `constraint_type` = 'primary key' and `constraint_schema` = '" + conn.Database + "' and table_name= 'Posts'", conn); + rows = Convert.ToInt32(query.ExecuteScalar()); + Assert.That(rows, Is.EqualTo(0)); + + //check the definition of the column that was PK + query = new MySqlCommand("Select Column_name, Is_Nullable, Data_Type from information_schema.Columns where table_schema ='" + conn.Database + "' and table_name = 'Posts' and column_name ='PostId'", conn); + MySqlDataReader reader = query.ExecuteReader(); + while (reader.Read()) + { + Assert.That(reader[0].ToString(), Is.EqualTo("PostId")); + Assert.That(reader[1].ToString(), Is.EqualTo("NO")); + Assert.That(reader[2].ToString(), Is.EqualTo("int")); + } + reader.Close(); + conn.Close(); + } + } + } + + + /// + /// Drop primary key. No anonymous arguments + /// + [Test] + public void DropPrimaryKeyOperation() + { + + var migrationOperations = new List(); + + // create table where the PK exists + var createTableOperation = CreateTableOperation(); + migrationOperations.Add(createTableOperation); + + var createDropPKOperation = new DropPrimaryKeyOperation(anonymousArguments: new { DeleteAutoIncrement = true }); + createDropPKOperation.Table = "Posts"; + createDropPKOperation.Columns.Add("PostId"); + migrationOperations.Add(createDropPKOperation); + + using (BlogContext context = new BlogContext()) + { + if (context.Database.Exists()) context.Database.Delete(); + context.Database.Create(); + + + Assert.That(GenerateAndExecuteMySQLStatements(migrationOperations), Is.EqualTo(true)); + + using (var conn = new MySqlConnection(context.Database.Connection.ConnectionString)) + { + if (conn.State == System.Data.ConnectionState.Closed) conn.Open(); + + // check for table creation + var query = new MySqlCommand("select Count(*) from information_schema.Tables WHERE `table_name` = 'Posts' and `table_schema` = '" + conn.Database + "' ", conn); + int rows = Convert.ToInt32(query.ExecuteScalar()); + Assert.That(rows, Is.EqualTo(1)); + + // check if PK exists + query = new MySqlCommand("select Count(*) from information_schema.table_constraints where `constraint_type` = 'primary key' and `constraint_schema` = '" + conn.Database + "' and table_name= 'Posts'", conn); + rows = Convert.ToInt32(query.ExecuteScalar()); + Assert.That(rows, Is.EqualTo(0)); + + //check the definition of the column that was PK + query = new MySqlCommand("Select Column_name, Is_Nullable, Data_Type from information_schema.Columns where table_schema ='" + conn.Database + "' and table_name = 'Posts' and column_name ='PostId'", conn); + MySqlDataReader reader = query.ExecuteReader(); + while (reader.Read()) + { + Assert.That(reader[0].ToString(), Is.EqualTo("PostId")); + Assert.That(reader[1].ToString(), Is.EqualTo("NO")); + Assert.That(reader[2].ToString(), Is.EqualTo("int")); + } + reader.Close(); + conn.Close(); + } + } + } + + + /// + /// Creates a table named Posts + /// and columns int PostId, string Title, string Body + /// + /// + + private CreateTableOperation CreateTableOperation() + { + TypeUsage tu; + TypeUsage result; + + if (ProviderManifest == null) + ProviderManifest = new MySqlProviderManifest(Version.ToString()); + + var createTableOperation = new CreateTableOperation("Posts"); + + //Column model for int IdPost + tu = TypeUsage.CreateDefaultTypeUsage(PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.Int32)); + result = ProviderManifest.GetStoreType(tu); + + var intColumn = new ColumnModel(PrimitiveTypeKind.Int32, result) + { + Name = "PostId", + IsNullable = false, + IsIdentity = true + }; + + createTableOperation.Columns.Add(intColumn); + + //Column model for string + tu = TypeUsage.CreateDefaultTypeUsage(PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.String)); + result = ProviderManifest.GetStoreType(tu); + + var stringColumnTitle = new ColumnModel(PrimitiveTypeKind.String, result) + { + Name = "Title", + IsNullable = false + }; + + var stringColumnBody = new ColumnModel(PrimitiveTypeKind.String, result) + { + Name = "Body", + IsNullable = true + }; + + createTableOperation.Columns.Add(stringColumnTitle); + createTableOperation.Columns.Add(stringColumnBody); + + //Column model for binary + tu = TypeUsage.CreateDefaultTypeUsage(PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.Binary)); + result = ProviderManifest.GetStoreType(tu); + + var binaryColumn = new ColumnModel(PrimitiveTypeKind.Binary, result) + { + Name = "Password", + MaxLength = 10, + StoreType = "binary" + }; + + createTableOperation.Columns.Add(binaryColumn); + + var primaryKey = new AddPrimaryKeyOperation(); + + primaryKey.Columns.Add("PostId"); + + createTableOperation.PrimaryKey = primaryKey; + + return createTableOperation; + + } + + + /// + /// Generate and apply sql statemens from the + /// migration operations list + /// return false is case of fail or if database doesn't exist + /// + private bool GenerateAndExecuteMySQLStatements(List migrationOperations) + { + MySqlProviderServices ProviderServices; + + ProviderServices = new MySqlProviderServices(); + + using (BlogContext context = new BlogContext()) + { + if (!context.Database.Exists()) return false; + + using (MySqlConnection conn = new MySqlConnection(context.Database.Connection.ConnectionString)) + { + var migratorGenerator = new MySqlMigrationSqlGenerator(); + var Token = ProviderServices.GetProviderManifestToken(conn); + var sqlStmts = migratorGenerator.Generate(migrationOperations, providerManifestToken: Token); + if (conn.State == System.Data.ConnectionState.Closed) conn.Open(); + foreach (MigrationStatement stmt in sqlStmts) + { + try + { + MySqlCommand cmd = new MySqlCommand(stmt.Sql, conn); + cmd.ExecuteNonQuery(); + } + catch (Exception) + { + return false; + } + } + } + } + return true; + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/Properties/AssemblyInfo.cs b/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..c337fd60a --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,57 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using NUnit.Framework; + +// 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. +[assembly: AssemblyTitle("MySql.Data.EntityFramework.Migrations.Tests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Oracle")] +[assembly: AssemblyProduct("MySql.Data.EntityFramework.Migrations.Tests")] +[assembly: AssemblyCopyright("Copyright © 2013, 2025, Oracle and/or its affiliates.")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("13e45075-7292-42a8-a5a5-41a014ab2224")] + +#if !DEBUG +[assembly: AssemblyKeyName("ConnectorNet")] +#endif +[assembly: NonParallelizable] diff --git a/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/Properties/Resources.Designer.cs b/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/Properties/Resources.Designer.cs new file mode 100644 index 000000000..4019f6a7d --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/Properties/Resources.Designer.cs @@ -0,0 +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 MySql.EntityFramework.Migrations.Tests.Properties { + 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", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 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("MySql.EntityFramework.Migrations.Tests.Properties.Resources", typeof(Resources).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 server=localhost;User Id=root;database=test;port=11240. + /// + internal static string ConnString { + get { + return ResourceManager.GetString("ConnString", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to server=localhost;User Id=root;database=test;port=11140. + /// + internal static string ConnStringMacOS { + get { + return ResourceManager.GetString("ConnStringMacOS", resourceCulture); + } + } + } +} diff --git a/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/Properties/Resources.resx b/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/Properties/Resources.resx new file mode 100644 index 000000000..49ed86e84 --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/Properties/Resources.resx @@ -0,0 +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 + + + server=localhost;User Id=root;database=test;port=11240 + + + server=localhost;User Id=root;database=test;port=11140 + + \ No newline at end of file diff --git a/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/SetUpMigrationsTests.cs b/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/SetUpMigrationsTests.cs new file mode 100644 index 000000000..f39c7375e --- /dev/null +++ b/EntityFramework/tests/MySql.EntityFramework.Migrations.Tests/SetUpMigrationsTests.cs @@ -0,0 +1,116 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.EntityFramework.Properties; +using MySql.Data.EntityFramework.Tests; +using NUnit.Framework; +using NUnit.Framework.Internal; +using System; +using System.Configuration; +using System.Data; +using System.Data.Entity.Migrations; +using System.IO; +using System.Reflection; +using System.Runtime.InteropServices; + +namespace MySql.Data.EntityFramework.Migrations.Tests +{ + public class SetUpMigrationsTests : DefaultFixture + { + + private Configuration configuration; + public DbMigrator Migrator; + public static string ConnectionStringBlogContext { get; set; } + + [OneTimeSetUp] + public new void OneTimeSetup() + { + ConnectionStringBlogContext = System.Environment.OSVersion.Platform == PlatformID.MacOSX ? MySql.EntityFramework.Migrations.Tests.Properties.Resources.ConnStringMacOS : MySql.EntityFramework.Migrations.Tests.Properties.Resources.ConnString; + + configuration = new Configuration(); + DataSet dataSet = ConfigurationManager.GetSection("system.data") as System.Data.DataSet; + if (dataSet != null) + { + DataView vi = dataSet.Tables[0].DefaultView; + vi.Sort = "Name"; + int idx = -1; + if (((idx = vi.Find("MySql")) != -1) || ((idx = vi.Find("MySQL Data Provider")) != -1)) + { + DataRow row = vi[idx].Row; + dataSet.Tables[0].Rows.Remove(row); + } + dataSet.Tables[0].Rows.Add("MySql" + , "MySql.Data.MySqlClient" + , "MySql.Data.MySqlClient" + , + typeof(MySql.Data.MySqlClient.MySqlClientFactory).AssemblyQualifiedName); + } + Migrator = new DbMigrator(configuration); + } + + [OneTimeTearDown] + public new void OneTimeTearDown() + { + using (BlogContext context = new BlogContext()) + { + if (context.Database.Exists()) + { + context.Database.Delete(); + } + } + } + } + + internal sealed class Configuration : DbMigrationsConfiguration + { + public Configuration() + { + CodeGenerator = new MySqlMigrationCodeGenerator(); + AutomaticMigrationsEnabled = false; + SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.EntityFramework.MySqlMigrationSqlGenerator()); + } + + protected override void Seed(BlogContext context) + { + } + } + + internal sealed class EF6Configuration : DbMigrationsConfiguration + { + public EF6Configuration() + { + CodeGenerator = new MySqlMigrationCodeGenerator(); + AutomaticMigrationsEnabled = true; + SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.EntityFramework.MySqlMigrationSqlGenerator()); + } + + protected override void Seed(BlogContext context) + { + } + } +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..5bd685ccc --- /dev/null +++ b/LICENSE @@ -0,0 +1,2267 @@ +Licensing Information User Manual + +MySQL Connector/NET 9.4.0 Community + __________________________________________________________________ + +Introduction + + This License Information User Manual contains Oracle's product license + and other licensing information, including licensing information for + third-party software which may be included in this distribution of + MySQL Connector/NET 9.4.0 Community. + + Last updated: June 2025 + +Licensing Information + + This release of MySQL Connector/NET 9.4.0 Community is brought to you + by the MySQL team at Oracle. This software is released under version 2 + of the GNU General Public License (GPLv2), as set forth below, with the + following additional permissions: + + This distribution of MySQL Connector/NET 9.4.0 Community is designed to + work with certain software (including but not limited to OpenSSL) that + is licensed under separate terms, as designated in a particular file or + component or in the license documentation. Without limiting your rights + under the GPLv2, the authors of MySQL hereby grant you an additional + permission to link the program and your derivative works with the + separately licensed software that they have either included with the + program or referenced in the documentation. + + Without limiting the foregoing grant of rights under the GPLv2 and + additional permission as to separately licensed software, this + Connector is also subject to the Universal FOSS Exception, version 1.0, + a copy of which is reproduced below and can also be found along with + its FAQ at http://oss.oracle.com/licenses/universal-foss-exception. + + Copyright (c) 2004, 2025, Oracle and/or its affiliates. + +Election of GPLv2 + + For the avoidance of doubt, except that if any license choice other + than GPL or LGPL is available it will apply instead, Oracle elects to + use only the General Public License version 2 (GPLv2) at this time for + any software where a choice of GPL license versions is made available + with the language indicating that GPLv2 or any later version may be + used, or where a choice of which version of the GPL is applied is + otherwise unspecified. + +GNU General Public License Version 2.0, June 1991 + +The following applies to all products licensed under the GNU General +Public License, Version 2.0: You may not use the identified files +except in compliance with the GNU General Public License, Version +2.0 (the "License.") You may obtain a copy of the License at +http://www.gnu.org/licenses/gpl-2.0.txt. A copy of the license is +also reproduced below. Unless required by applicable law or agreed +to in writing, software distributed under the License is distributed +on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, +either express or implied. See the License for the specific language +governing permissions and limitations under the License. + + + ====================================================================== + ====================================================================== + + +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +Everyone is permitted to copy and distribute verbatim +copies of this license document, but changing it is not +allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, +and (2) offer you this license which gives you legal permission to +copy, distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, +we want its recipients to know that what they have is not the original, +so that any problems introduced by others will not reflect on the +original authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software + interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as +a special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new +versions of the General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Program does not specify a +version number of this License, you may choose any version ever +published by the Free Software Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the +author to ask for permission. For software which is copyrighted by the +Free Software Foundation, write to the Free Software Foundation; we +sometimes make exceptions for this. Our decision will be guided by the +two goals of preserving the free status of all derivatives of our free +software and of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, +EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS +WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of + + the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details + type 'show w'. This is free software, and you are welcome + to redistribute it under certain conditions; type 'show c' + for details. + +The hypothetical commands 'show w' and 'show c' should show the +appropriate parts of the General Public License. Of course, the +commands you use may be called something other than 'show w' and +'show c'; they could even be mouse-clicks or menu items--whatever +suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + program 'Gnomovision' (which makes passes at compilers) written + by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, +you may consider it more useful to permit linking proprietary +applications with the library. If this is what you want to do, use +the GNU Lesser General Public License instead of this License. + + ====================================================================== + ====================================================================== + +The Universal FOSS Exception, Version 1.0 + + In addition to the rights set forth in the other license(s) included in + the distribution for this software, data, and/or documentation + (collectively the "Software", and such licenses collectively with this + additional permission the "Software License"), the copyright holders + wish to facilitate interoperability with other software, data, and/or + documentation distributed with complete corresponding source under a + license that is OSI-approved and/or categorized by the FSF as free + (collectively "Other FOSS"). We therefore hereby grant the following + additional permission with respect to the use and distribution of the + Software with Other FOSS, and the constants, function signatures, data + structures and other invocation methods used to run or interact with + each of them (as to each, such software's "Interfaces"): + + i. The Software's Interfaces may, to the extent permitted by the + license of the Other FOSS, be copied into, used and distributed in + the Other FOSS in order to enable interoperability, without + requiring a change to the license of the Other FOSS other than as + to any Interfaces of the Software embedded therein. The Software's + Interfaces remain at all times under the Software License, + including without limitation as used in the Other FOSS (which upon + any such use also then contains a portion of the Software under the + Software License). + + ii. The Other FOSS's Interfaces may, to the extent permitted by the + license of the Other FOSS, be copied into, used and distributed in + the Software in order to enable interoperability, without requiring + that such Interfaces be licensed under the terms of the Software + License or otherwise altering their original terms, if this does + not require any portion of the Software other than such Interfaces + to be licensed under the terms other than the Software License. + + iii. If only Interfaces and no other code is copied between the + Software and the Other FOSS in either direction, the use and/or + distribution of the Software with the Other FOSS shall not be + deemed to require that the Other FOSS be licensed under the license + of the Software, other than as to any Interfaces of the Software + copied into the Other FOSS. This includes, by way of example and + without limitation, statically or dynamically linking the Software + together with Other FOSS after enabling interoperability using the + Interfaces of one or both, and distributing the resulting + combination under different licenses for the respective portions + thereof. + + For avoidance of doubt, a license which is OSI-approved or + categorized by the FSF as free, includes, for the purpose of this + permission, such licenses with additional permissions, and any + license that has previously been so approved or categorized as + free, even if now deprecated or otherwise no longer recognized as + approved or free. Nothing in this additional permission grants any + right to distribute any portion of the Software on terms other than + those of the Software License or grants any additional permission + of any kind for use or distribution of the Software in conjunction + with software other than Other FOSS. + + ====================================================================== + ====================================================================== + +Licenses for Third-Party Components + + The following sections contain licensing information for libraries that + may be included with this product. We are thankful to all individuals + that have created these. Standard licenses referenced herein are + detailed in the Standard Licenses section. + +Google Protocol Buffers + +Copyright 2008 Google Inc. 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 Google Inc. 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. + +Code generated by the Protocol Buffer compiler is owned by the owner +of the input file used when generating it. This code is not +standalone and requires a support library to be linked with it. This +support library is itself covered by the above license. + + ====================================================================== + ====================================================================== + +Kerberos5 + +You may be receiving a copy of the kerberos documentation as part of this +product. The terms of the Oracle license do NOT apply to Kerberos documentation. + +Kerberos documentation is licensed under the CC-BY-SA 3.0 license, separate from + +the Oracle product. +If you do not wish to install this library, you may remove it, but +the Oracle program might not operate properly or at all without it. + +Copyright (C) 1985-2019 by the Massachusetts Institute of Technology. + +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. + +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 +HOLDER 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. + +Downloading of this software may constitute an export of cryptographic +software from the United States of America that is subject to the +United States Export Administration Regulations (EAR), 15 CFR 730-774. +Additional laws or regulations may apply. It is the responsibility of +the person or entity contemplating export to comply with all +applicable export laws and regulations, including obtaining any +required license from the U.S. government. + +The U.S. government prohibits export of encryption source code to +certain countries and individuals, including, but not limited to, the +countries of Cuba, Iran, North Korea, Sudan, Syria, and residents and +nationals of those countries. + +Documentation components of this software distribution are licensed +under a Creative Commons Attribution-ShareAlike 3.0 Unported License. +(http://creativecommons.org/licenses/by-sa/3.0/) + +Individual source code files are copyright MIT, Cygnus Support, +Novell, OpenVision Technologies, Oracle, Red Hat, Sun Microsystems, +FundsXpress, and others. + +Project Athena, Athena, Athena MUSE, Discuss, Hesiod, Kerberos, Moira, +and Zephyr are trademarks of the Massachusetts Institute of Technology +(MIT). No commercial use of these trademarks may be made without +prior written permission of MIT. + +"Commercial use" means use of a name in a product or other for-profit +manner. It does NOT prevent a commercial firm from referring to the +MIT trademarks in order to convey information (although in doing so, +recognition of their trademark status should be given). + +====================================================================== + +The following copyright and permission notice applies to the +OpenVision Kerberos Administration system located in "kadmin/create", +"kadmin/dbutil", "kadmin/passwd", "kadmin/server", "lib/kadm5", and +portions of "lib/rpc": + + Copyright, OpenVision Technologies, Inc., 1993-1996, All Rights + Reserved + + WARNING: Retrieving the OpenVision Kerberos Administration system + source code, as described below, indicates your acceptance of the + following terms. If you do not agree to the following terms, do + not retrieve the OpenVision Kerberos administration system. + + You may freely use and distribute the Source Code and Object Code + compiled from it, with or without modification, but this Source + Code is provided to you "AS IS" EXCLUSIVE OF ANY WARRANTY, + INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY OR + FITNESS FOR A PARTICULAR PURPOSE, OR ANY OTHER WARRANTY, WHETHER + EXPRESS OR IMPLIED. IN NO EVENT WILL OPENVISION HAVE ANY LIABILITY + FOR ANY LOST PROFITS, LOSS OF DATA OR COSTS OF PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES, OR FOR ANY SPECIAL, INDIRECT, OR + CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, INCLUDING, + WITHOUT LIMITATION, THOSE RESULTING FROM THE USE OF THE SOURCE + CODE, OR THE FAILURE OF THE SOURCE CODE TO PERFORM, OR FOR ANY + OTHER REASON. + + OpenVision retains all copyrights in the donated Source Code. + OpenVision also retains copyright to derivative works of the Source + Code, whether created by OpenVision or by a third party. The + OpenVision copyright notice must be preserved if derivative works + are made based on the donated Source Code. + + OpenVision Technologies, Inc. has donated this Kerberos + Administration system to MIT for inclusion in the standard Kerberos + 5 distribution. This donation underscores our commitment to + continuing Kerberos technology development and our gratitude for + the valuable work which has been performed by MIT and the Kerberos + community. + +====================================================================== + + Portions contributed by Matt Crawford "crawdad@fnal.gov" were work +performed at Fermi National Accelerator Laboratory, which is + operated by Universities Research Association, Inc., under contract + DE-AC02-76CHO3000 with the U.S. Department of Energy. + +====================================================================== + +Portions of "src/lib/crypto" have the following copyright: + + Copyright (C) 1998 by the FundsXpress, INC. + + All rights reserved. + + Export of this software from the United States of America may + require a specific license from the United States Government. + It is the responsibility of any person or organization + contemplating export to obtain such a license before exporting. + + WITHIN THAT CONSTRAINT, permission to use, copy, modify, and + distribute this software and its documentation for any purpose and + without fee is hereby granted, provided that the above copyright + notice appear in all copies and that both that copyright notice and + this permission notice appear in supporting documentation, and that + the name of FundsXpress. not be used in advertising or publicity + pertaining to distribution of the software without specific, + written prior permission. FundsXpress makes no representations + about the suitability of this software for any purpose. It is + provided "as is" without express or implied warranty. + + THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + +====================================================================== + +The implementation of the AES encryption algorithm in +"src/lib/crypto/builtin/aes" has the following copyright: + + Copyright (C) 2001, Dr Brian Gladman "brg@gladman.uk.net", Worcester, UK. + All rights reserved. + + LICENSE TERMS + + The free distribution and use of this software in both source and + binary form is allowed (with or without changes) provided that: + + 1. distributions of this source code include the above copyright + notice, this list of conditions and the following disclaimer; + + 2. distributions in binary form include the above copyright notice, + this list of conditions and the following disclaimer in the + documentation and/or other associated materials; + + 3. the copyright holder's name is not used to endorse products + built using this software without specific written permission. + + DISCLAIMER + + This software is provided 'as is' with no explcit or implied + warranties in respect of any properties, including, but not limited + to, correctness and fitness for purpose. + +====================================================================== + +Portions contributed by Red Hat, including the pre-authentication +plug-in framework and the NSS crypto implementation, contain the +following copyright: + + Copyright (C) 2006 Red Hat, Inc. + Portions copyright (C) 2006 Massachusetts Institute of Technology + 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 Red Hat, Inc., 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. + +====================================================================== + +The bundled verto source code is subject to the following license: + + Copyright 2011 Red Hat, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + +====================================================================== + +The MS-KKDCP client implementation has the following copyright: + + Copyright 2013,2014 Red Hat, Inc. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above + copyright notice, this list of conditions and the following + disclaimer. + + 2. 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. + + 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. + +====================================================================== + +The implementations of GSSAPI mechglue in GSSAPI-SPNEGO in +"src/lib/gssapi", including the following files: + + lib/gssapi/generic/gssapi_err_generic.et + lib/gssapi/mechglue/g_accept_sec_context.c + lib/gssapi/mechglue/g_acquire_cred.c + lib/gssapi/mechglue/g_canon_name.c + lib/gssapi/mechglue/g_compare_name.c + lib/gssapi/mechglue/g_context_time.c + lib/gssapi/mechglue/g_delete_sec_context.c + lib/gssapi/mechglue/g_dsp_name.c + lib/gssapi/mechglue/g_dsp_status.c + lib/gssapi/mechglue/g_dup_name.c + lib/gssapi/mechglue/g_exp_sec_context.c + lib/gssapi/mechglue/g_export_name.c + lib/gssapi/mechglue/g_glue.c + lib/gssapi/mechglue/g_imp_name.c + lib/gssapi/mechglue/g_imp_sec_context.c + lib/gssapi/mechglue/g_init_sec_context.c + lib/gssapi/mechglue/g_initialize.c + lib/gssapi/mechglue/g_inquire_context.c + lib/gssapi/mechglue/g_inquire_cred.c + lib/gssapi/mechglue/g_inquire_names.c + lib/gssapi/mechglue/g_process_context.c + lib/gssapi/mechglue/g_rel_buffer.c + lib/gssapi/mechglue/g_rel_cred.c + lib/gssapi/mechglue/g_rel_name.c + lib/gssapi/mechglue/g_rel_oid_set.c + lib/gssapi/mechglue/g_seal.c + lib/gssapi/mechglue/g_sign.c + lib/gssapi/mechglue/g_store_cred.c + lib/gssapi/mechglue/g_unseal.c + lib/gssapi/mechglue/g_userok.c + lib/gssapi/mechglue/g_utils.c + lib/gssapi/mechglue/g_verify.c + lib/gssapi/mechglue/gssd_pname_to_uid.c + lib/gssapi/mechglue/mglueP.h + lib/gssapi/mechglue/oid_ops.c + lib/gssapi/spnego/gssapiP_spnego.h + lib/gssapi/spnego/spnego_mech.c + +and the initial implementation of incremental propagation, including +the following new or changed files: + + include/iprop_hdr.h + kadmin/server/ipropd_svc.c + lib/kdb/iprop.x + lib/kdb/kdb_convert.c + lib/kdb/kdb_log.c + lib/kdb/kdb_log.h + lib/krb5/error_tables/kdb5_err.et + slave/kpropd_rpc.c + slave/kproplog.c + +are subject to the following license: + + Copyright (C) 2004 Sun Microsystems, Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + +====================================================================== + +Kerberos V5 includes documentation and software developed at the +University of California at Berkeley, which includes this copyright +notice: + + Copyright (C) 1983 Regents of the University of California. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. 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. + + 3. Neither the name of the University 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 REGENTS 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 REGENTS + 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. + +====================================================================== + +Portions contributed by Novell, Inc., including the LDAP database +backend, are subject to the following license: + + Copyright (C) 2004-2005, Novell, Inc. + 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. + + * The copyright holder's name is not 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. + +====================================================================== + +Portions funded by Sandia National Laboratory and developed by the +University of Michigan's Center for Information Technology +Integration, including the PKINIT implementation, are subject to the +following license: + + COPYRIGHT (C) 2006-2007 + THE REGENTS OF THE UNIVERSITY OF MICHIGAN + ALL RIGHTS RESERVED + + Permission is granted to use, copy, create derivative works and + redistribute this software and such derivative works for any + purpose, so long as the name of The University of Michigan is not + used in any advertising or publicity pertaining to the use of + distribution of this software without specific, written prior + authorization. If the above copyright notice or any other + identification of the University of Michigan is included in any + copy of any portion of this software, then the disclaimer below + must also be included. + + THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE + UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND + WITHOUT WARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER + EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + THE REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE LIABLE FOR + ANY DAMAGES, INCLUDING SPECIAL, INDIRECT, INCIDENTAL, OR + CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM ARISING OUT OF OR + IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN IF IT HAS BEEN OR + IS HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +====================================================================== + +The pkcs11.h file included in the PKINIT code has the following +license: + + Copyright 2006 g10 Code GmbH + Copyright 2006 Andreas Jellinghaus + + This file is free software; as a special exception the author gives + unlimited permission to copy and/or distribute it, with or without + modifications, as long as this notice is preserved. + + This file is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY, to the extent permitted by law; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. + +====================================================================== + +Portions contributed by Apple Inc. are subject to the following +license: + + Copyright 2004-2008 Apple Inc. All Rights Reserved. + + Export of this software from the United States of America may + require a specific license from the United States Government. + It is the responsibility of any person or organization + contemplating export to obtain such a license before exporting. + + WITHIN THAT CONSTRAINT, permission to use, copy, modify, and + distribute this software and its documentation for any purpose and + without fee is hereby granted, provided that the above copyright + notice appear in all copies and that both that copyright notice and + this permission notice appear in supporting documentation, and that + the name of Apple Inc. not be used in advertising or publicity + pertaining to distribution of the software without specific, + written prior permission. Apple Inc. makes no representations + about the suitability of this software for any purpose. It is + provided "as is" without express or implied warranty. + + THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + +====================================================================== + +The implementations of UTF-8 string handling in src/util/support and +src/lib/krb5/unicode are subject to the following copyright and +permission notice: + + The OpenLDAP Public License + Version 2.8, 17 August 2003 + + Redistribution and use of this software and associated + documentation ("Software"), with or without modification, are + permitted provided that the following conditions are met: + + 1. Redistributions in source form must retain copyright statements + and notices, + + 2. Redistributions in binary form must reproduce applicable + copyright statements and notices, this list of conditions, and + the following disclaimer in the documentation and/or other + materials provided with the distribution, and + + 3. Redistributions must contain a verbatim copy of this document. + + The OpenLDAP Foundation may revise this license from time to time. + Each revision is distinguished by a version number. You may use + this Software under terms of this license revision or under the + terms of any subsequent revision of the license. + + THIS SOFTWARE IS PROVIDED BY THE OPENLDAP FOUNDATION AND ITS + CONTRIBUTORS "AS IS" AND ANY EXPRESSED 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 OPENLDAP FOUNDATION, ITS + CONTRIBUTORS, OR THE AUTHOR(S) OR OWNER(S) OF THE SOFTWARE 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. + + The names of the authors and copyright holders must not be used in + advertising or otherwise to promote the sale, use or other dealing + in this Software without specific, written prior permission. Title + to copyright in this Software shall at all times remain with + copyright holders. + + OpenLDAP is a registered trademark of the OpenLDAP Foundation. + + Copyright 1999-2003 The OpenLDAP Foundation, Redwood City, + California, USA. All Rights Reserved. Permission to copy and + distribute verbatim copies of this document is granted. + +Marked test programs in src/lib/krb5/krb have the following copyright: + + + Copyright (C) 2006 Kungliga Tekniska Högskolan + (Royal Institute of Technology, Stockholm, Sweden). + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. 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. + + 3. Neither the name of KTH 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 KTH AND ITS 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 KTH OR ITS + 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. + +====================================================================== + +The KCM Mach RPC definition file used on macOS has the following +copyright: + + Copyright (C) 2009 Kungliga Tekniska Högskolan + (Royal Institute of Technology, Stockholm, Sweden). + All rights reserved. + + Portions Copyright (C) 2009 Apple Inc. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above + copyright notice, this list of conditions and the following + disclaimer. + + 2. 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. + + 3. Neither the name of the Institute 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 INSTITUTE 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 INSTITUTE + 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. + +====================================================================== + +Portions of the RPC implementation in src/lib/rpc and +src/include/gssrpc have the following copyright and permission notice: + + Copyright (C) 2010, Oracle America, Inc. + + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. 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. + + 3. Neither the name of the "Oracle America, Inc." 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 HOLDER 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. + +====================================================================== + + Copyright (C) 2006,2007,2009 NTT (Nippon Telegraph and Telephone + Corporation). All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer as + the first lines of this file unmodified. + + 2. 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. + + THIS SOFTWARE IS PROVIDED BY NTT "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 NTT 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. + +====================================================================== + + Copyright 2000 by Carnegie Mellon University + + All Rights Reserved + + Permission to use, copy, modify, and distribute this software and + its documentation for any purpose and without fee is hereby + granted, provided that the above copyright notice appear in all + copies and that both that copyright notice and this permission + notice appear in supporting documentation, and that the name of + Carnegie Mellon University not be used in advertising or publicity + pertaining to distribution of the software without specific, + written prior permission. + + CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO + THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE + FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + SOFTWARE. + +====================================================================== + + Copyright (C) 2002 Naval Research Laboratory (NRL/CCS) + + Permission to use, copy, modify and distribute this software and + its documentation is hereby granted, provided that both the + copyright notice and this permission notice appear in all copies of + the software, derivative works or modified versions, and any + portions thereof. + + NRL ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION AND + DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES WHATSOEVER + RESULTING FROM THE USE OF THIS SOFTWARE. + +====================================================================== + +Portions extracted from Internet RFCs have the following copyright +notice: + + Copyright (C) The Internet Society (2006). + + This document is subject to the rights, licenses and restrictions + contained in BCP 78, and except as set forth therein, the authors + retain all their rights. + + This document and the information contained herein are provided on + an "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE + REPRESENTS OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND + THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT + THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR + ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A + PARTICULAR PURPOSE. + +====================================================================== + + Copyright (C) 1991, 1992, 1994 by Cygnus Support. + + Permission to use, copy, modify, and distribute this software and + its documentation for any purpose and without fee is hereby + granted, provided that the above copyright notice appear in all + copies and that both that copyright notice and this permission + notice appear in supporting documentation. Cygnus Support makes no + representations about the suitability of this software for any + purpose. It is provided "as is" without express or implied + warranty. + +====================================================================== + + Copyright (C) 2006 Secure Endpoints Inc. + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + +====================================================================== + +Portions of the implementation of the Fortuna-like PRNG are subject to +the following notice: + + + Copyright (C) 2005 Marko Kreen + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. 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. + + THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + + Copyright (C) 1994 by the University of Southern California + + EXPORT OF THIS SOFTWARE from the United States of America may + require a specific license from the United States Government. It + is the responsibility of any person or organization + contemplating export to obtain such a license before exporting. + + WITHIN THAT CONSTRAINT, permission to copy, modify, and distribute + this software and its documentation in source and binary forms is + hereby granted, provided that any documentation or other materials + related to such distribution or use acknowledge that the software + was developed by the University of Southern California. + + DISCLAIMER OF WARRANTY. THIS SOFTWARE IS PROVIDED "AS IS". The + University of Southern California MAKES NO REPRESENTATIONS OR + WARRANTIES, EXPRESS OR IMPLIED. By way of example, but not + limitation, the University of Southern California MAKES NO + REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY + PARTICULAR PURPOSE. The University of Southern California shall not + be held liable for any liability nor for any direct, indirect, or + consequential damages with respect to any claim by the user or + distributor of the ksu software. + +====================================================================== + + Copyright (C) 1995 + The President and Fellows of Harvard University + + This code is derived from software contributed to Harvard by Jeremy + Rassen. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. 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. + + 3. All advertising materials mentioning features or use of this + software must display the following acknowledgement: + + This product includes software developed by the University of + California, Berkeley and its contributors. + + 4. Neither the name of the University 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 REGENTS 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 REGENTS + 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. + +====================================================================== + + Copyright (C) 2008 by the Massachusetts Institute of Technology. + Copyright 1995 by Richard P. Basch. All Rights Reserved. + Copyright 1995 by Lehman Brothers, Inc. All Rights Reserved. + + Export of this software from the United States of America may + require a specific license from the United States Government. It + is the responsibility of any person or organization + contemplating export to obtain such a license before exporting. + + WITHIN THAT CONSTRAINT, permission to use, copy, modify, and + distribute this software and its documentation for any purpose and + without fee is hereby granted, provided that the above copyright + notice appear in all copies and that both that copyright notice and + this permission notice appear in supporting documentation, and that + the name of Richard P. Basch, Lehman Brothers and M.I.T. not be + used in advertising or publicity pertaining to distribution of the + software without specific, written prior permission. Richard P. + Basch, Lehman Brothers and M.I.T. make no representations about the + suitability of this software for any purpose. It is provided "as + is" without express or implied warranty. + +====================================================================== + +The following notice applies to "src/lib/krb5/krb/strptime.c" and +"src/include/k5-queue.h". + + Copyright (C) 1997, 1998 The NetBSD Foundation, Inc. + All rights reserved. + + This code was contributed to The NetBSD Foundation by Klaus Klein. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. 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. + + 3. All advertising materials mentioning features or use of this + software must display the following acknowledgement: + + This product includes software developed by the NetBSD + Foundation, Inc. and its contributors. + + 4. Neither the name of The NetBSD Foundation 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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. + +====================================================================== + +The following notice applies to Unicode library files in +"src/lib/krb5/unicode": + + Copyright 1997, 1998, 1999 Computing Research Labs, + New Mexico State University + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE COMPUTING RESEARCH LAB OR + NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE + OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +====================================================================== + +The following notice applies to "src/util/support/strlcpy.c": + + Copyright (C) 1998 Todd C. Miller "Todd.Miller@courtesan.com" + + Permission to use, copy, modify, and distribute this software for + any purpose with or without fee is hereby granted, provided that + the above copyright notice and this permission notice appear in all + copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL + WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE + AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR + CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +====================================================================== + +The following notice applies to "src/util/profile/argv_parse.c" and +"src/util/profile/argv_parse.h": + + Copyright 1999 by Theodore Ts'o. + + Permission to use, copy, modify, and distribute this software for + any purpose with or without fee is hereby granted, provided that + the above copyright notice and this permission notice appear in all + copies. THE SOFTWARE IS PROVIDED "AS IS" AND THEODORE TS'O (THE + AUTHOR) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR + IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. (Isn't + it sick that the U.S. culture of lawsuit-happy lawyers requires + this kind of disclaimer?) + +====================================================================== + +The following notice applies to SWIG-generated code in +"src/util/profile/profile_tcl.c": + + Copyright (C) 1999-2000, The University of Chicago + + This file may be freely redistributed without license or fee + provided this copyright message remains intact. + +====================================================================== + +The following notice applies to portiions of "src/lib/rpc" and +"src/include/gssrpc": + + Copyright (C) 2000 The Regents of the University of Michigan. All + rights reserved. + + Copyright (C) 2000 Dug Song "dugsong@UMICH.EDU". All rights + reserved, all wrongs reversed. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. 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. + + 3. Neither the name of the University 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 "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 REGENTS 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. + +Implementations of the MD4 algorithm are subject to the following +notice: + + Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. + + License to copy and use this software is granted provided that it + is identified as the "RSA Data Security, Inc. MD4 Message Digest + Algorithm" in all material mentioning or referencing this software + or this function. + + License is also granted to make and use derivative works provided + that such works are identified as "derived from the RSA Data + Security, Inc. MD4 Message Digest Algorithm" in all material + mentioning or referencing the derived work. + + RSA Data Security, Inc. makes no representations concerning either + the merchantability of this software or the suitability of this + software for any particular purpose. It is provided "as is" + without express or implied warranty of any kind. + + These notices must be retained in any copies of any part of this + documentation and/or software. + +====================================================================== + +Implementations of the MD5 algorithm are subject to the following +notice: + + Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. + + License to copy and use this software is granted provided that it + is identified as the "RSA Data Security, Inc. MD5 Message- Digest + Algorithm" in all material mentioning or referencing this software + or this function. + + License is also granted to make and use derivative works provided + that such works are identified as "derived from the RSA Data + Security, Inc. MD5 Message-Digest Algorithm" in all material + mentioning or referencing the derived work. + + RSA Data Security, Inc. makes no representations concerning either + the merchantability of this software or the suitability of this + software for any particular purpose. It is provided "as is" + without express or implied warranty of any kind. + + These notices must be retained in any copies of any part of this + documentation and/or software. + +====================================================================== + +The following notice applies to +"src/lib/crypto/crypto_tests/t_mddriver.c": + + Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All + rights reserved. + + RSA Data Security, Inc. makes no representations concerning either + the merchantability of this software or the suitability of this + software for any particular purpose. It is provided "as is" without + express or implied warranty of any kind. + + These notices must be retained in any copies of any part of this + documentation and/or software. + +====================================================================== + +Portions of "src/lib/krb5" are subject to the following notice: + + Copyright (C) 1994 CyberSAFE Corporation. + Copyright 1990,1991,2007,2008 by the Massachusetts Institute of +Technology. + All Rights Reserved. + + Export of this software from the United States of America may + require a specific license from the United States Government. It + is the responsibility of any person or organization + contemplating export to obtain such a license before exporting. + + WITHIN THAT CONSTRAINT, permission to use, copy, modify, and + distribute this software and its documentation for any purpose and + without fee is hereby granted, provided that the above copyright + notice appear in all copies and that both that copyright notice and + this permission notice appear in supporting documentation, and that + the name of M.I.T. not be used in advertising or publicity + pertaining to distribution of the software without specific, + written prior permission. Furthermore if you modify this software + you must label your software as modified software and not + distribute it in such a fashion that it might be confused with the + original M.I.T. software. Neither M.I.T., the Open Computing + Security Group, nor CyberSAFE Corporation make any representations + about the suitability of this software for any purpose. It is + provided "as is" without express or implied warranty. + +====================================================================== + +Portions contributed by PADL Software are subject to the following +license: + + Copyright (c) 2011, PADL Software Pty Ltd. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + 2. 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. + + 3. Neither the name of PADL Software 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 PADL SOFTWARE 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 PADL SOFTWARE + 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. + +====================================================================== + +The bundled libev source code is subject to the following license: + + All files in libev are Copyright (C)2007,2008,2009 Marc Alexander + Lehmann. + + 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. + + 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. + + Alternatively, the contents of this package may be used under the + terms of the GNU General Public License ("GPL") version 2 or any + later version, in which case the provisions of the GPL are + applicable instead of the above. If you wish to allow the use of + your version of this package only under the terms of the GPL and + not to allow others to use your version of this file under the BSD + license, indicate your decision by deleting the provisions above + and replace them with the notice and other provisions required by + the GPL in this and the other files of this package. If you do not + delete the provisions above, a recipient may use your version of + this file under either the BSD or the GPL. + +====================================================================== + +Files copied from the Intel AESNI Sample Library are subject to the +following license: + + Copyright (C) 2010, Intel Corporation + 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 Intel Corporation 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. + +====================================================================== + +The following notice applies to +"src/ccapi/common/win/OldCC/autolock.hxx": + + Copyright (C) 1998 by Danilo Almeida. 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. + + 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 HOLDER 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. + + ====================================================================== + ====================================================================== + +LibFIDO + +Copyright (c) 2018-2021 Yubico 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: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. 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. + +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 +HOLDER 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. + +4th Party +========= + +libcbor +------- + +MIT License + +Copyright (c) 2014-2017 Pavel Kalvoda + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +------------------------------------------------------------------------------ +---- +zlib +---- + +Copyright notice: + + (C) 1995-2017 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + +If you use the zlib library in a product, we would appreciate *not* receiving +lengthy legal documents to sign. The sources are provided for free but +without warranty of any kind. The library has been entirely written by +Jean-loup Gailly and Mark Adler; it does not include third-party code. + +If you redistribute modified sources, we would appreciate that you include in +the file ChangeLog history information documenting your changes. Please read +the FAQ for more information on the distribution of modified source versions. + +------------------------------------------------------------------------------ +OpenSSL (See its own license section) +------------------------------------------------------------------------------ + + ====================================================================== + ====================================================================== + +OpenSSL 3.0 + +You may be receiving a copy of OpenSSL 3.0 as part of this product in +object code form. +The terms of the Oracle license do NOT apply to OpenSSL 3.0. +OpenSSL 3.0 is licensed under the Apache 2.0 license, separate from +the Oracle product. +If you do not wish to install this library, you may remove it, but +the Oracle program might not operate properly or at all without it. + +/* + * Copyright 2003-2022 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html +*/ + +See Apache License v2.0, January 2004 in the +'Standard Licenses' section. + + ====================================================================== + ====================================================================== + +opentelemetry-dotnet-dll + +You may be receiving a copy of the opentelemetry-dotnet-dll library with this +MySQL product. +The terms of the Oracle license do NOT apply to the opentelemetry-dotnet-dll +library; it is licensed under the following license, separately from the +Oracle programs you receive. +If you do not wish to install this program, you may delete its files but the +Oracle program might not operate properly or at all without it. + +// Copyright The OpenTelemetry Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +See Apache License v2.0, January 2004 in the 'Standard Licenses' section. + + ====================================================================== + ====================================================================== + +Standard Licenses + +Apache License v2.0, January 2004 + +The following applies to all products licensed under the Apache 2.0 +License: You may not use the identified files except in compliance +with the Apache License, Version 2.0 (the "License.") You may obtain a +copy of the License at http://www.apache.org/licenses/LICENSE-2.0. A +copy of the license is also reproduced below. Unless required by +applicable law or agreed to in writing, software distributed under the +License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied. See the License for +the specific language governing permissions and limitations under the +License. + +Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, +and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the +copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other +entities that control, are controlled by, or are under common control +with that entity. For the purposes of this definition, "control" means +(i) the power, direct or indirect, to cause the direction or +management of such entity, whether by contract or otherwise, or (ii) +ownership of fifty percent (50%) or more of the outstanding shares, or +(iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, +including but not limited to software source code, documentation +source, and configuration files. + +"Object" form shall mean any form resulting from mechanical +transformation or translation of a Source form, including but not +limited to compiled object code, generated documentation, and +conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object +form, made available under the License, as indicated by a copyright +notice that is included in or attached to the work (an example is +provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object +form, that is based on (or derived from) the Work and for which the +editorial revisions, annotations, elaborations, or other modifications +represent, as a whole, an original work of authorship. For the +purposes of this License, Derivative Works shall not include works +that remain separable from, or merely link (or bind by name) to the +interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the +original version of the Work and any modifications or additions to +that Work or Derivative Works thereof, that is intentionally submitted +to Licensor for inclusion in the Work by the copyright owner or by an +individual or Legal Entity authorized to submit on behalf of the +copyright owner. For the purposes of this definition, "submitted" +means any form of electronic, verbal, or written communication sent to +the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control +systems, and issue tracking systems that are managed by, or on behalf +of, the Licensor for the purpose of discussing and improving the Work, +but excluding communication that is conspicuously marked or otherwise +designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity +on behalf of whom a Contribution has been received by Licensor and +subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +copyright license to reproduce, prepare Derivative Works of, publicly +display, publicly perform, sublicense, and distribute the Work and +such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except +as stated in this section) patent license to make, have made, use, +offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such +Contributor that are necessarily infringed by their Contribution(s) +alone or by combination of their Contribution(s) with the Work to +which such Contribution(s) was submitted. If You institute patent +litigation against any entity (including a cross-claim or counterclaim +in a lawsuit) alleging that the Work or a Contribution incorporated +within the Work constitutes direct or contributory patent +infringement, then any patent licenses granted to You under this +License for that Work shall terminate as of the date such litigation +is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work +or Derivative Works thereof in any medium, with or without +modifications, and in Source or Object form, provided that You meet +the following conditions: + +(a) You must give any other recipients of the Work or Derivative Works +a copy of this License; and + +(b) You must cause any modified files to carry prominent notices +stating that You changed the files; and + +(c) You must retain, in the Source form of any Derivative Works that +You distribute, all copyright, patent, trademark, and attribution +notices from the Source form of the Work, excluding those notices that +do not pertain to any part of the Derivative Works; and + +(d) If the Work includes a "NOTICE" text file as part of its +distribution, then any Derivative Works that You distribute must +include a readable copy of the attribution notices contained + +within such NOTICE file, excluding those notices that do not pertain +to any part of the Derivative Works, in at least one of the following +places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided +along with the Derivative Works; or, within a display generated by the +Derivative Works, if and wherever such third-party notices normally +appear. The contents of the NOTICE file are for informational purposes +only and do not modify the License. You may add Your own attribution +notices within Derivative Works that You distribute, alongside or as +an addendum to the NOTICE text from the Work, provided that such +additional attribution notices cannot be construed as modifying the +License. + +You may add Your own copyright statement to Your modifications and may +provide additional or different license terms and conditions for use, +reproduction, or distribution of Your modifications, or for any such +Derivative Works as a whole, provided Your use, reproduction, and +distribution of the Work otherwise complies with the conditions stated +in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, +any Contribution intentionally submitted for inclusion in the Work by +You to the Licensor shall be under the terms and conditions of this +License, without any additional terms or conditions. Notwithstanding +the above, nothing herein shall supersede or modify the terms of any +separate license agreement you may have executed with Licensor +regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade +names, trademarks, service marks, or product names of the Licensor, +except as required for reasonable and customary use in describing the +origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed +to in writing, Licensor provides the Work (and each Contributor +provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR +CONDITIONS OF ANY KIND, either express or implied, including, without +limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, +MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely +responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your +exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, +whether in tort (including negligence), contract, or otherwise, unless +required by applicable law (such as deliberate and grossly negligent +acts) or agreed to in writing, shall any Contributor be liable to You +for damages, including any direct, indirect, special, incidental, or +consequential damages of any character arising as a result of this +License or out of the use or inability to use the Work (including but +not limited to damages for loss of goodwill, work stoppage, computer +failure or malfunction, or any and all other commercial damages or +losses), even if such Contributor has been advised of the possibility +of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing +the Work or Derivative Works thereof, You may choose to offer, and +charge a fee for, acceptance of support, warranty, indemnity, or other +liability obligations and/or rights consistent with this +License. However, in accepting such obligations, You may act only on +Your own behalf and on Your sole responsibility, not on behalf of any +other Contributor, and only if You agree to indemnify, defend, and +hold each Contributor harmless for any liability incurred by, or +claims asserted against, such Contributor by reason of your accepting +any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "[]" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included +on the same "printed page" as the copyright notice for easier identification +within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied. See the License for the specific language governing permissions +and limitations under the License. + + ====================================================================== + ====================================================================== + +Written Offer for Source Code + + For any software that you receive from Oracle in binary form which is + licensed under an open source license that gives you the right to + receive the source code for that binary, you can obtain a copy of the + applicable source code by visiting + http://www.oracle.com/goto/opensourcecode. If the source code for the + binary was not provided to you with the binary, you can also receive a + copy of the source code on physical media by submitting a written + request to the address listed below or by sending an email to Oracle + using the following link: + http://www.oracle.com/goto/opensourcecode/request. + + Oracle America, Inc. + Attn: Senior Vice President + Development and Engineering Legal + 500 Oracle Parkway, 10th Floor + Redwood Shores, CA 94065 + + Your request should include: + + * The name of the binary for which you are requesting the source code + + * The name and version number of the Oracle product containing the + binary + + * The date you received the Oracle product + + * Your name + + * Your company name (if applicable) + + * Your return mailing address and email, and + + * A telephone number in the event we need to reach you. + + + We may charge you a fee to cover the cost of physical media and + processing. + + Your request must be sent + + a. within three (3) years of the date you received the Oracle product + that included the binary that is the subject of your request, or + + b. in the case of code licensed under the GPL v3 for as long as Oracle + offers spare parts or customer support for that product model. \ No newline at end of file diff --git a/MySQL.Data.OpenTelemetry/MySQL.Data.OpenTelemetry.sln b/MySQL.Data.OpenTelemetry/MySQL.Data.OpenTelemetry.sln new file mode 100644 index 000000000..d2ae08ae9 --- /dev/null +++ b/MySQL.Data.OpenTelemetry/MySQL.Data.OpenTelemetry.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33103.184 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MySQL.Data.OpenTelemetry", "src\MySQL.Data.OpenTelemetry.csproj", "{60C2984E-BF90-43AA-83CC-47F5BFF8459A}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {60C2984E-BF90-43AA-83CC-47F5BFF8459A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {60C2984E-BF90-43AA-83CC-47F5BFF8459A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {60C2984E-BF90-43AA-83CC-47F5BFF8459A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {60C2984E-BF90-43AA-83CC-47F5BFF8459A}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {C2FF3DAD-CC92-43CB-9E98-480F4E9FDD32} + EndGlobalSection +EndGlobal diff --git a/MySQL.Data.OpenTelemetry/src/MySQL.Data.OpenTelemetry.csproj b/MySQL.Data.OpenTelemetry/src/MySQL.Data.OpenTelemetry.csproj new file mode 100644 index 000000000..589d41210 --- /dev/null +++ b/MySQL.Data.OpenTelemetry/src/MySQL.Data.OpenTelemetry.csproj @@ -0,0 +1,43 @@ + + + + MySql.Data.OpenTelemetry + Copyright © 2023, 2025, Oracle and/or its affiliates. + en-US + 9.4.0 + Oracle Corporation + netstandard2.0 + MySql.Data.OpenTelemetry + MySql.Data.OpenTelemetry + MySql;.NET Connector;MySql Connector/NET;ado;ado.net;database;sql;opentelemetry;tracing;diagnostics;instrumentation + logo-mysql-170x115.png + README.md + https://dev.mysql.com/downloads/ + GPL-2.0-only WITH Universal-FOSS-exception-1.0 + true + True + True + ..\..\ConnectorNetPublicKey.snk + True + MySql.Data.OpenTelemetry + false + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/MySQL.Data.OpenTelemetry/src/Properties/AssemblyInfo.cs b/MySQL.Data.OpenTelemetry/src/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..50362f2a6 --- /dev/null +++ b/MySQL.Data.OpenTelemetry/src/Properties/AssemblyInfo.cs @@ -0,0 +1,55 @@ +// Copyright © 2024, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; + +// 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. +[assembly: AssemblyTitle("MySql.Data.OpenTelemetry")] +[assembly: AssemblyDescription("MySql.Data.OpenTelemetry activates telemetry capabilities when the target MySQL server is configured to support telemetry.")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Oracle Corporation")] +[assembly: AssemblyProduct("MySQL Connector/NET")] +[assembly: AssemblyCopyright("Copyright © 2023, 2025, Oracle and/or its affiliates.")] +[assembly: AssemblyTrademark("Oracle®, Java, MySQL, and NetSuite are registered trademarks of Oracle and/or its affiliates.")] +[assembly: AssemblyCulture("")] +[assembly: SecurityRules(SecurityRuleSet.Level1)] +[assembly: CLSCompliant(false)] + +// Setting ComVisible to false makes the types in this assembly not visible to COM +// components. If you need to access a type in this assembly from COM, set the ComVisible +// attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM. + +[assembly: Guid("e33f787c-329b-410a-ab72-37126450cd7b")] diff --git a/MySQL.Data.OpenTelemetry/src/Properties/VersionInfo.cs b/MySQL.Data.OpenTelemetry/src/Properties/VersionInfo.cs new file mode 100644 index 000000000..05488fcf7 --- /dev/null +++ b/MySQL.Data.OpenTelemetry/src/Properties/VersionInfo.cs @@ -0,0 +1,47 @@ +// Copyright © 2024, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Reflection; +using System.Resources; + +// +// 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 Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("9.4.0")] +[assembly: AssemblyInformationalVersion("9.4.0.0")] +[assembly: AssemblyFileVersion("9.4.0.0")] +[assembly: NeutralResourcesLanguage("en-US")] + diff --git a/MySQL.Data.OpenTelemetry/src/TraceProviderBuilderExtension.cs b/MySQL.Data.OpenTelemetry/src/TraceProviderBuilderExtension.cs new file mode 100644 index 000000000..0844c66db --- /dev/null +++ b/MySQL.Data.OpenTelemetry/src/TraceProviderBuilderExtension.cs @@ -0,0 +1,40 @@ +// Copyright © 2023, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using OpenTelemetry.Trace; + +/// +/// Extension method for setting up Connector/Net OpenTelemetry tracing. +/// +public static class TracerProviderBuilderExtensions +{ + public static TracerProviderBuilder AddConnectorNet( + this TracerProviderBuilder builder) + => builder.AddSource("connector-net"); +} diff --git a/MySQL.Data/MySql.Data.sln b/MySQL.Data/MySql.Data.sln new file mode 100644 index 000000000..3d178e566 --- /dev/null +++ b/MySQL.Data/MySql.Data.sln @@ -0,0 +1,41 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30011.22 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MySql.Data", "src\MySql.Data.csproj", "{7A633828-462A-4D97-A99B-48AAB8DF21F4}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MySqlX.Data.Tests", "tests\MySqlX.Data.Tests\MySqlX.Data.Tests.csproj", "{C411C777-FBE2-4F27-BDE1-2B69001320BC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MySql.Data.Tests", "tests\MySql.Data.Tests\MySql.Data.Tests.csproj", "{951A6C18-E97C-4F6A-A52C-B6FC4DECABAE}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {7A633828-462A-4D97-A99B-48AAB8DF21F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7A633828-462A-4D97-A99B-48AAB8DF21F4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7A633828-462A-4D97-A99B-48AAB8DF21F4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7A633828-462A-4D97-A99B-48AAB8DF21F4}.Release|Any CPU.Build.0 = Release|Any CPU + {C411C777-FBE2-4F27-BDE1-2B69001320BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C411C777-FBE2-4F27-BDE1-2B69001320BC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C411C777-FBE2-4F27-BDE1-2B69001320BC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C411C777-FBE2-4F27-BDE1-2B69001320BC}.Release|Any CPU.Build.0 = Release|Any CPU + {951A6C18-E97C-4F6A-A52C-B6FC4DECABAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {951A6C18-E97C-4F6A-A52C-B6FC4DECABAE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {951A6C18-E97C-4F6A-A52C-B6FC4DECABAE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {951A6C18-E97C-4F6A-A52C-B6FC4DECABAE}.Release|Any CPU.Build.0 = Release|Any CPU + {9D5EDC76-5A1C-46C9-A4F2-CF57F276E537}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9D5EDC76-5A1C-46C9-A4F2-CF57F276E537}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9D5EDC76-5A1C-46C9-A4F2-CF57F276E537}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9D5EDC76-5A1C-46C9-A4F2-CF57F276E537}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {A739F0C4-9EBB-412D-ADDB-E269E453AF5B} + EndGlobalSection +EndGlobal diff --git a/MySQL.Data/MySql.Replication.Tests/App.config b/MySQL.Data/MySql.Replication.Tests/App.config new file mode 100644 index 000000000..5e7e74fe0 --- /dev/null +++ b/MySQL.Data/MySql.Replication.Tests/App.config @@ -0,0 +1,29 @@ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MySQL.Data/MySql.Replication.Tests/BaseTest.cs b/MySQL.Data/MySql.Replication.Tests/BaseTest.cs new file mode 100644 index 000000000..0857d727a --- /dev/null +++ b/MySQL.Data/MySql.Replication.Tests/BaseTest.cs @@ -0,0 +1,172 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; +using System.Reflection; +using MySql.Data.MySqlClient; +using System.Configuration; + +namespace MySql.LoadBalancing.Tests +{ + public class BaseTest + { + protected string databaseName; + protected int sourcePort; + protected int replicaPort; + protected string server; + private MySqlConnectionStringBuilder connStringRootSource; + private MySqlConnectionStringBuilder connStringReplica; + + protected string ConnectionString + { + get + { + return string.Format("{0}database={1};", ConnectionStringNoDb, databaseName); + } + } + + protected string ConnectionStringNoDb + { + get + { + return string.Format("server={0};", server); + } + } + + protected string ConnectionStringRootSource + { + get + { + return connStringRootSource.ConnectionString; + } + } + + protected string ConnectionStringReplica + { + get + { + return connStringReplica.ConnectionString; + } + } + + + + public BaseTest() + { + Initialize(); + LoadBaseConfiguration(); + } + + protected void LoadBaseConfiguration() + { + string sourcePortString = ValueIfEmpty(ConfigurationManager.AppSettings["sourcePort"], "3305"); + string replicaPortString = ValueIfEmpty(ConfigurationManager.AppSettings["replicaPort"], "3307"); + server = ValueIfEmpty(ConfigurationManager.AppSettings["server"], "Group1"); + + sourcePort = int.Parse(sourcePortString); + replicaPort = int.Parse(replicaPortString); + + connStringRootSource = new MySqlConnectionStringBuilder(); + connStringRootSource.UserID = ValueIfEmpty(ConfigurationManager.AppSettings["rootuser"], "root"); + connStringRootSource.Password = ValueIfEmpty(ConfigurationManager.AppSettings["rootpassword"], string.Empty); + connStringRootSource.Server = ValueIfEmpty(ConfigurationManager.AppSettings["host"], "localhost"); + connStringRootSource.Port = (uint)sourcePort; + + connStringReplica = new MySqlConnectionStringBuilder(); + connStringReplica.UserID = ValueIfEmpty(ConfigurationManager.AppSettings["replicaUser"], "lbuser"); + connStringReplica.Password = ValueIfEmpty(ConfigurationManager.AppSettings["replicaPassword"], "lbpass"); + connStringReplica.Server = ValueIfEmpty(ConfigurationManager.AppSettings["replicaHost"], "localhost"); + connStringReplica.Port = (uint)replicaPort; + connStringReplica.Database = databaseName; + } + + protected virtual void Initialize() + { + // we don't use FileVersion because it's not available + // on the compact framework + string fullname = Assembly.GetExecutingAssembly().FullName; + string[] parts = fullname.Split(new char[] { '=' }); + string[] versionParts = parts[1].Split(new char[] { '.' }); + databaseName = String.Format("dblb{0}{1}", versionParts[0], versionParts[1]); + } + + [SetUp] + public void Setup() + { + using (MySqlConnection connection = new MySqlConnection(ConnectionStringRootSource)) + { + connection.Open(); + MySqlScript script = new MySqlScript(connection); + + // Sets users + script.Query = Properties.Resources._01_Startup_root_script; + script.Execute(); + + // Sets database objects + script.Query = string.Format(Properties.Resources._02_Startup_script, databaseName); + script.Execute(); + } + } + + //[TearDown] + public void Teardown() + { + using (MySqlConnection connection = new MySqlConnection(ConnectionStringRootSource)) + { + connection.Open(); + MySqlCommand cmd = new MySqlCommand(string.Empty, connection); + + cmd.CommandText = "DROP USER lbuser@localhost;"; + cmd.CommandText += "DROP DATABASE IF EXISTS " + databaseName; + cmd.ExecuteNonQuery(); + } + } + + protected MySqlDataReader ExecuteQuery(MySqlConnection connection, string query) + { + MySqlCommand cmd = new MySqlCommand(query, connection); + return cmd.ExecuteReader(); + } + + protected int ExecuteNonQuery(MySqlConnection connection, string query) + { + MySqlCommand cmd = new MySqlCommand(query, connection); + return cmd.ExecuteNonQuery(); + } + + private string ValueIfEmpty(string value, string valueIfEmtpy) + { + if (string.IsNullOrEmpty(value)) return valueIfEmtpy; + return value; + } + } +} diff --git a/Tests/MySql.Replication.Tests/MySql.Replication.Tests.csproj b/MySQL.Data/MySql.Replication.Tests/MySql.Replication.Tests.csproj similarity index 100% rename from Tests/MySql.Replication.Tests/MySql.Replication.Tests.csproj rename to MySQL.Data/MySql.Replication.Tests/MySql.Replication.Tests.csproj diff --git a/MySQL.Data/MySql.Replication.Tests/Properties/AssemblyInfo.cs b/MySQL.Data/MySql.Replication.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..cc810761b --- /dev/null +++ b/MySQL.Data/MySql.Replication.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,55 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +using System.Reflection; +using System.Runtime.CompilerServices; +using 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. +[assembly: AssemblyTitle("MySql.LoadBalancing.Tests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Oracle Corporation")] +[assembly: AssemblyProduct("MySql.LoadBalancing.Tests")] +[assembly: AssemblyCopyright("Copyright © 2013, 2025, Oracle and/or its affiliates.")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("02681727-f306-4923-8c16-717d6f1716ce")] + +[assembly: AssemblyDelaySign(true)] +[assembly: AssemblyKeyFileAttribute(@"..\..\ConnectorNetPublicKey.snk")] diff --git a/MySQL.Data/MySql.Replication.Tests/Properties/Resources.Designer.cs b/MySQL.Data/MySql.Replication.Tests/Properties/Resources.Designer.cs new file mode 100644 index 000000000..72af81f13 --- /dev/null +++ b/MySQL.Data/MySql.Replication.Tests/Properties/Resources.Designer.cs @@ -0,0 +1,112 @@ +//------------------------------------------------------------------------------ +// +// 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 MySql.Replication.Tests.Properties { + 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", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 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("MySql.Replication.Tests.Properties.Resources", typeof(Resources).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 -- Users + /// + ///GRANT ALL ON *.* TO lbuser@localhost IDENTIFIED BY 'lbpass'; + /// + ///REVOKE SUPER ON *.* FROM lbuser@localhost; + ///. + /// + internal static string _01_Startup_root_script { + get { + return ResourceManager.GetString("_01_Startup_root_script", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DROP DATABASE IF EXISTS {0}; + /// + /// + ///CREATE DATABASE {0}; + ///USE {0}; + /// + ///CREATE TABLE items ( + /// item_id int primary key auto_increment, + /// description varchar(50) not null, + /// brand varchar(50), + /// price float not null, + /// quantity int not null + ///); + /// + ///CREATE TABLE stores( + /// store_id int primary key auto_increment, + /// name varchar(50) not null, + /// address varchar(100) + ///); + /// + ///CREATE TABLE employees( + /// employee_id int primary key auto_increment, + /// name varchar(50) not null, + /// store_id int, + /// active bool + ///); + /// [rest of string was truncated]";. + /// + internal static string _02_Startup_script { + get { + return ResourceManager.GetString("_02_Startup_script", resourceCulture); + } + } + } +} diff --git a/Tests/MySql.Replication.Tests/Properties/Resources.resx b/MySQL.Data/MySql.Replication.Tests/Properties/Resources.resx similarity index 100% rename from Tests/MySql.Replication.Tests/Properties/Resources.resx rename to MySQL.Data/MySql.Replication.Tests/Properties/Resources.resx diff --git a/MySQL.Data/MySql.Replication.Tests/ReplicationTest.cs b/MySQL.Data/MySql.Replication.Tests/ReplicationTest.cs new file mode 100644 index 000000000..b6f53f857 --- /dev/null +++ b/MySQL.Data/MySql.Replication.Tests/ReplicationTest.cs @@ -0,0 +1,246 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using MySql.Data.MySqlClient; +using Xunit; +using System.Diagnostics; +using MySql.Data; + +namespace MySql.Replication.Tests +{ + public class ReplicationTest : IUseFixture, IDisposable + { + + private SetUp st; + + public void SetFixture(SetUp data) + { + st = data; + } + + public void Dispose() + { + MySqlConnectionStringBuilder connString = new MySqlConnectionStringBuilder(st.ConnectionStringRootSource); + connString.Database = st.databaseName; + using (MySqlConnection conn = new MySqlConnection(connString.ToString())) + { + conn.Open(); + st.ExecuteNonQuery(conn, "DELETE FROM orders"); + st.ExecuteNonQuery(conn, "DELETE FROM order_details"); + } + } + + /// + /// Validates that the replica is readonly + /// + [Fact] + public void _ReplicaAsReadOnly() + { + using (MySqlConnection conn = new MySqlConnection(st.ConnectionStringReplica)) + { + conn.Open(); + MySqlException ex = Assert.Throws(() => st.ExecuteNonQuery(conn, "INSERT INTO orders VALUES(null, 1, 'James')")); + // Error 1290: The MySQL server is running with the --read-only option so + // it cannot execute this statement + Assert.Equal(1290, ex.Number); + } + } + + /// + /// Validates that each request for a connection is switched between the + /// source and replica; also validates that all non-read statements are sent + /// to the source + /// + [Fact] + public void RoundRobinWritting() + { + using (MySqlConnection conn = new MySqlConnection(st.ConnectionString)) + { + conn.Open(); + + st.ExecuteNonQuery(conn, "INSERT INTO orders VALUES(null, 1, 'James')"); + st.ExecuteNonQuery(conn, "INSERT INTO order_details VALUES(1, 1, 1, 0, 0)"); + st.ExecuteNonQuery(conn, "INSERT INTO order_details VALUES(1, 2, 1, 0, 0)"); + + Assert.Equal(st.replicaPort, GetPort(conn)); + Assert.Equal(st.sourcePort, GetPort(conn)); + Assert.Equal(st.replicaPort, GetPort(conn)); + Assert.Equal(st.sourcePort, GetPort(conn)); + + st.ExecuteNonQuery(conn, "INSERT INTO order_details VALUES(1, 3, 1, 0, 0)"); + } + } + + /// + /// Test for a source connection failure + /// + [Fact] + public void RoundRobinReadOnly() + { + using (MySqlConnection conn = new MySqlConnection("server=Group2;")) + { + conn.Open(); + + + MySqlException ex = Assert.Throws(() => st.ExecuteNonQuery(conn, "INSERT INTO orders VALUES(null, 1, 'James')")); + + Assert.Equal(Resources.Replication_NoAvailableServer, ex.Message); + + int currentPort = GetPort(conn); + Assert.True(currentPort != (currentPort = GetPort(conn)), "1st try"); + Assert.True(currentPort != (currentPort = GetPort(conn)), "2nd try"); + Assert.True(currentPort != (currentPort = GetPort(conn)), "3rd try"); + Assert.True(currentPort != (currentPort = GetPort(conn)), "4th try"); + } + } + + /// + /// Validates that data inserted in source is replicated into replica + /// + [Fact] + public void RoundRobinValidateReplicaData() + { + using (MySqlConnection conn = new MySqlConnection(st.ConnectionString)) + { + conn.Open(); + + st.ExecuteNonQuery(conn, "INSERT INTO orders VALUES(null, 2, 'Bruce')"); + } + + // Waits for replication on replica + System.Threading.Thread.Sleep(3000); + + // validates data on replica + using (MySqlConnection replicaConn = new MySqlConnection(st.ConnectionStringReplica)) + { + replicaConn.Open(); + MySqlDataReader dr = st.ExecuteQuery(replicaConn, "SELECT * FROM orders"); + Assert.True(dr.Read()); + Assert.Equal(2, dr.GetValue(1)); + Assert.Equal("Bruce", dr.GetValue(2)); + } + } + + [Fact] + public void ValidateLogging() + { + MySqlTrace.Listeners.Clear(); + MySqlTrace.Switch.Level = SourceLevels.All; + MySql.Data.MySqlClient.Tests.GenericListener listener = new MySql.Data.MySqlClient.Tests.GenericListener(); + MySqlTrace.Listeners.Add(listener); + using (MySqlConnection conn = new MySqlConnection(st.ConnectionString )) + { + conn.Open(); + + st.ExecuteNonQuery(conn, "INSERT INTO orders VALUES(null, 2, 'Bruce')"); + st.ExecuteNonQuery(conn, "INSERT INTO orders VALUES(null, 1, 'James')"); + st.ExecuteNonQuery(conn, "INSERT INTO order_details VALUES(1, 1, 1, 0, 0)"); + st.ExecuteNonQuery(conn, "INSERT INTO order_details VALUES(1, 2, 1, 0, 0)"); + } + + // Waits for replication on replica + System.Threading.Thread.Sleep(3000); + + // validates data on replica + using (MySqlConnection replicaConn = new MySqlConnection(st.ConnectionStringReplica)) + { + replicaConn.Open(); + MySqlDataReader dr = st.ExecuteQuery(replicaConn, "SELECT * FROM orders"); + Assert.True(dr.Read()); + Assert.Equal(2, dr.GetValue(1)); + Assert.Equal("Bruce", dr.GetValue(2)); + } + Debug.WriteLine("Start of tracing"); + foreach (string s in listener.Strings) + { + Debug.WriteLine(s); + } + Debug.WriteLine("End of tracing"); + } + + /// + /// When using transactions, load balancing must lock on the current server. + /// + [Fact] + public void ValidateTransactions() + { + MySqlTrace.Listeners.Clear(); + MySqlTrace.Switch.Level = SourceLevels.All; + MySql.Data.MySqlClient.Tests.GenericListener listener = new MySql.Data.MySqlClient.Tests.GenericListener(); + MySqlTrace.Listeners.Add(listener); + using (MySqlConnection conn = new MySqlConnection(st.ConnectionString)) + { + conn.Open(); + MySqlTransaction tx = conn.BeginTransaction(); + st.ExecuteNonQuery(conn, "INSERT INTO orders VALUES(null, 2, 'Bruce')"); + st.ExecuteNonQuery(conn, "INSERT INTO orders VALUES(null, 1, 'James')"); + st.ExecuteNonQuery(conn, "INSERT INTO order_details VALUES(1, 1, 1, 0, 0)"); + st.ExecuteNonQuery(conn, "INSERT INTO order_details VALUES(1, 2, 1, 0, 0)"); + tx.Commit(); + } + + // Waits for replication on replica + System.Threading.Thread.Sleep(3000); + + // validates data on replica + using (MySqlConnection replicaConn = new MySqlConnection(st.ConnectionStringReplica)) + { + replicaConn.Open(); + MySqlDataReader dr = st.ExecuteQuery(replicaConn, "SELECT * FROM orders"); + Assert.True(dr.Read()); + Assert.Equal(2, dr.GetValue(1)); + Assert.Equal("Bruce", dr.GetValue(2)); + } + Debug.WriteLine("Start of tracing"); + foreach (string s in listener.Strings) + { + Debug.WriteLine(s); + } + Debug.WriteLine("End of tracing"); + } + + #region Private methods + + private int GetPort(MySqlConnection connection) + { + MySqlDataReader dr = st.ExecuteQuery(connection, "SHOW VARIABLES LIKE 'port';"); + + dr.Read(); + int port = dr.GetInt32(1); + dr.Close(); + + return port; + } + + #endregion + } +} diff --git a/Tests/MySql.Replication.Tests/Resources/01_Startup_root_script.sql b/MySQL.Data/MySql.Replication.Tests/Resources/01_Startup_root_script.sql similarity index 100% rename from Tests/MySql.Replication.Tests/Resources/01_Startup_root_script.sql rename to MySQL.Data/MySql.Replication.Tests/Resources/01_Startup_root_script.sql diff --git a/Tests/MySql.Replication.Tests/Resources/02_Startup_script.sql b/MySQL.Data/MySql.Replication.Tests/Resources/02_Startup_script.sql similarity index 100% rename from Tests/MySql.Replication.Tests/Resources/02_Startup_script.sql rename to MySQL.Data/MySql.Replication.Tests/Resources/02_Startup_script.sql diff --git a/MySQL.Data/MySql.Replication.Tests/SetUp.cs b/MySQL.Data/MySql.Replication.Tests/SetUp.cs new file mode 100644 index 000000000..88edd19b7 --- /dev/null +++ b/MySQL.Data/MySql.Replication.Tests/SetUp.cs @@ -0,0 +1,158 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Reflection; +using MySql.Data.MySqlClient; +using System.Configuration; + +namespace MySql.Replication.Tests +{ + public class SetUp : IDisposable + { + protected internal string databaseName; + protected internal int sourcePort; + protected internal int replicaPort; + protected internal string groupName; + private MySqlConnectionStringBuilder connStringRootSource; + private MySqlConnectionStringBuilder connStringReplica; + + protected internal string ConnectionString + { + get + { + return string.Format("{0}database={1};", ConnectionStringNoDb, databaseName); + } + } + + protected internal string ConnectionStringNoDb + { + get + { + return string.Format("server={0};", groupName); + } + } + + protected internal string ConnectionStringRootSource + { + get + { + return connStringRootSource.ConnectionString; + } + } + + protected internal string ConnectionStringReplica + { + get + { + return connStringReplica.ConnectionString; + } + } + + public SetUp() + { + Initialize(); + LoadBaseConfiguration(); + + using (MySqlConnection connection = new MySqlConnection(ConnectionStringRootSource)) + { + connection.Open(); + MySqlScript script = new MySqlScript(connection); + + // Sets users + script.Query = Properties.Resources._01_Startup_root_script; + script.Execute(); + + // Sets database objects + script.Query = string.Format(Properties.Resources._02_Startup_script, databaseName); + script.Execute(); + } + } + + protected internal void LoadBaseConfiguration() + { + ReplicationServerGroupConfigurationElement group1 = (ConfigurationManager.GetSection("MySQL") as MySqlConfiguration).Replication.ServerGroups.ToArray()[0]; + ReplicationServerConfigurationElement sourceConfiguration = group1.Servers.ToArray()[0]; + ReplicationServerConfigurationElement replicaConfiguration = group1.Servers.ToArray()[1]; + + groupName = group1.Name; + + connStringRootSource = new MySqlConnectionStringBuilder(sourceConfiguration.ConnectionString); + sourcePort = (int)connStringRootSource.Port; + + connStringReplica = new MySqlConnectionStringBuilder(replicaConfiguration.ConnectionString); + replicaPort = (int)connStringReplica.Port; + connStringReplica.Database = databaseName; + } + + protected virtual void Initialize() + { + // we don't use FileVersion because it's not available + // on the compact framework + string fullname = Assembly.GetExecutingAssembly().FullName; + string[] parts = fullname.Split(new char[] { '=' }); + string[] versionParts = parts[1].Split(new char[] { '.' }); + databaseName = String.Format("dblb{0}{1}", versionParts[0], versionParts[1]); + } + + + public void Dispose() + { + using (MySqlConnection connection = new MySqlConnection(ConnectionStringRootSource)) + { + connection.Open(); + MySqlCommand cmd = new MySqlCommand(string.Empty, connection); + + cmd.CommandText = "DROP USER lbuser@localhost;"; + cmd.CommandText += "DROP DATABASE IF EXISTS " + databaseName; + cmd.ExecuteNonQuery(); + } + } + + protected internal MySqlDataReader ExecuteQuery(MySqlConnection connection, string query) + { + MySqlCommand cmd = new MySqlCommand(query, connection); + return cmd.ExecuteReader(); + } + + protected internal int ExecuteNonQuery(MySqlConnection connection, string query) + { + MySqlCommand cmd = new MySqlCommand(query, connection); + return cmd.ExecuteNonQuery(); + } + + private string ValueIfEmpty(string value, string valueIfEmtpy) + { + if (string.IsNullOrEmpty(value)) return valueIfEmtpy; + return value; + } + } +} diff --git a/Tests/MySql.Replication.Tests/packages.config b/MySQL.Data/MySql.Replication.Tests/packages.config similarity index 100% rename from Tests/MySql.Replication.Tests/packages.config rename to MySQL.Data/MySql.Replication.Tests/packages.config diff --git a/MySQL.Data/src/Authentication/AuthenticationManager.cs b/MySQL.Data/src/Authentication/AuthenticationManager.cs new file mode 100644 index 000000000..92435f652 --- /dev/null +++ b/MySQL.Data/src/Authentication/AuthenticationManager.cs @@ -0,0 +1,97 @@ +// Copyright © 2012, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Reflection; + +namespace MySql.Data.MySqlClient.Authentication +{ + internal partial class AuthenticationPluginManager + { + private static readonly Dictionary Plugins = new Dictionary(); + + static partial void AuthenticationManagerCtorConfiguration(); + + static AuthenticationPluginManager() + { + Plugins["mysql_native_password"] = new PluginInfo("MySql.Data.MySqlClient.Authentication.MySqlNativePasswordPlugin"); + Plugins["sha256_password"] = new PluginInfo("MySql.Data.MySqlClient.Authentication.Sha256AuthenticationPlugin"); + Plugins["authentication_windows_client"] = new PluginInfo("MySql.Data.MySqlClient.Authentication.MySqlWindowsAuthenticationPlugin"); + Plugins["caching_sha2_password"] = new PluginInfo("MySql.Data.MySqlClient.Authentication.CachingSha2AuthenticationPlugin"); + Plugins["authentication_ldap_sasl_client"] = new PluginInfo("MySql.Data.MySqlClient.Authentication.MySqlSASLPlugin"); + Plugins["mysql_clear_password"] = new PluginInfo("MySql.Data.MySqlClient.Authentication.MySqlClearPasswordPlugin"); + Plugins["authentication_kerberos_client"] = new PluginInfo("MySql.Data.MySqlClient.Authentication.KerberosAuthenticationPlugin"); + Plugins["authentication_oci_client"] = new PluginInfo("MySql.Data.MySqlClient.Authentication.OciAuthenticationPlugin"); + Plugins["authentication_webauthn_client"] = new PluginInfo("MySql.Data.MySqlClient.Authentication.WebAuthnAuthenticationPlugin"); + Plugins["authentication_openid_connect_client"] = new PluginInfo("MySql.Data.MySqlClient.Authentication.OpenIdConnectClientAuthentication"); + + AuthenticationManagerCtorConfiguration(); + } + + public static MySqlAuthenticationPlugin GetPlugin(string method) + { + ValidateAuthenticationPlugin(method); + return CreatePlugin(method); + } + + private static MySqlAuthenticationPlugin CreatePlugin(string method) + { + PluginInfo pi = Plugins[method]; + + try + { + Type t = Type.GetType(pi.Type); + MySqlAuthenticationPlugin o = (MySqlAuthenticationPlugin)Activator.CreateInstance(t); + return o; + } + catch (Exception e) + { + throw new MySqlException(String.Format(Resources.UnableToCreateAuthPlugin, method), e); + } + } + + public static void ValidateAuthenticationPlugin(string method) + { + if (!Plugins.ContainsKey(method)) + throw new MySqlException(String.Format(Resources.AuthenticationMethodNotSupported, method)); + } + } + + struct PluginInfo + { + public string Type; + public Assembly Assembly; + + public PluginInfo(string type) + { + Type = type; + Assembly = null; + } + } +} diff --git a/MySQL.Data/src/Authentication/CachingSha2AuthenticationPlugin.cs b/MySQL.Data/src/Authentication/CachingSha2AuthenticationPlugin.cs new file mode 100644 index 000000000..96295a57c --- /dev/null +++ b/MySQL.Data/src/Authentication/CachingSha2AuthenticationPlugin.cs @@ -0,0 +1,181 @@ +// Copyright © 2017, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient.Authentication +{ + /// + /// The implementation of the caching_sha2_password authentication plugin. + /// + internal class CachingSha2AuthenticationPlugin : Sha256AuthenticationPlugin + { + internal static AuthStage _authStage; + + public override string PluginName => "caching_sha2_password"; + + protected override void SetAuthData(byte[] data) + { + // If the data given to us is a null terminated string, we need to trim off the trailing zero. + if (data[data.Length - 1] == 0) + { + byte[] b = new byte[data.Length - 1]; + Buffer.BlockCopy(data, 0, b, 0, data.Length - 1); + base.SetAuthData(b); + } + else base.SetAuthData(data); + } + + protected override Task MoreDataAsync(byte[] data, bool execAsync) + { + rawPubkey = data; + + // Generate scramble. + if (data == null) + { + byte[] scramble = GetPassword() as byte[]; + byte[] buffer = new byte[scramble.Length - 1]; + Array.Copy(scramble, 1, buffer, 0, scramble.Length - 1); + return Task.FromResult(buffer); + } + // Fast authentication. + else if (data[0] == 3) + { + _authStage = AuthStage.FAST_AUTH; + return Task.FromResult(null); + } + else + return Task.FromResult(GeneratePassword()); + } + + /// + /// Generates a byte array set with the password of the user in the expected format based on the + /// SSL settings of the current connection. + /// + /// A byte array that contains the password of the user in the expected format. + protected byte[] GeneratePassword() + { + // If connection is secure perform full authentication. + if (Settings.SslMode != MySqlSslMode.Disabled) + { + _authStage = AuthStage.FULL_AUTH; + + // Send as clear text since the channel is already encrypted. + byte[] passBytes = Encoding.GetBytes(GetMFAPassword()); + byte[] buffer = new byte[passBytes.Length + 1]; + Array.Copy(passBytes, 0, buffer, 0, passBytes.Length); + buffer[passBytes.Length] = 0; + return buffer; + } + else + { + // Request RSA key from server. + if (rawPubkey != null && rawPubkey[0] == 4) + { + _authStage = AuthStage.REQUEST_RSA_KEY; + return new byte[] { 0x02 }; + } + else if (!Settings.AllowPublicKeyRetrieval) + throw new MySqlException(Resources.RSAPublicKeyRetrievalNotEnabled); + // Full authentication. + else + { + _authStage = AuthStage.FULL_AUTH; + byte[] bytes = GetRsaPassword(GetMFAPassword(), AuthenticationData, rawPubkey); + if (bytes != null && bytes.Length == 1 && bytes[0] == 0) return null; + return bytes; + } + } + } + + private byte[] GetRsaPassword(string password, byte[] seedBytes, byte[] rawPublicKey) + { + if (password.Length == 0) return new byte[1]; + if (rawPubkey == null) return null; + // Obfuscate the plain text password with the session scramble. + byte[] obfuscated = GetXor(Encoding.Default.GetBytes(password), seedBytes); + + // Encrypt the password and send it to the server. + if (this.ServerVersion >= new Version("8.0.5")) + { + RSACryptoServiceProvider rsa = MySqlPemReader.ConvertPemToRSAProvider(rawPublicKey); + if (rsa == null) throw new MySqlException(Resources.UnableToReadRSAKey); + + return rsa.Encrypt(obfuscated, true); + } + else + { + RSACryptoServiceProvider rsa = MySqlPemReader.ConvertPemToRSAProvider(rawPublicKey); + if (rsa == null) throw new MySqlException(Resources.UnableToReadRSAKey); + + return rsa.Encrypt(obfuscated, false); + } + } + + public override object GetPassword() + { + _authStage = AuthStage.GENERATE_SCRAMBLE; + + // If we have no password then we just return 1 zero byte. + if (GetMFAPassword().Length == 0) return new byte[1]; + + SHA256 sha = SHA256.Create(); + + byte[] firstHash = sha.ComputeHash(Encoding.Default.GetBytes(GetMFAPassword())); + byte[] secondHash = sha.ComputeHash(firstHash); + + byte[] input = new byte[AuthenticationData.Length + secondHash.Length]; + Array.Copy(secondHash, 0, input, 0, secondHash.Length); + Array.Copy(AuthenticationData, 0, input, secondHash.Length, AuthenticationData.Length); + byte[] thirdHash = sha.ComputeHash(input); + + byte[] finalHash = new byte[thirdHash.Length]; + for (int i = 0; i < firstHash.Length; i++) + finalHash[i] = (byte)(firstHash[i] ^ thirdHash[i]); + + byte[] buffer = new byte[finalHash.Length + 1]; + Array.Copy(finalHash, 0, buffer, 1, finalHash.Length); + buffer[0] = 0x20; + return buffer; + } + } + + /// + /// Defines the stage of the authentication. + /// + internal enum AuthStage + { + GENERATE_SCRAMBLE = 0, + REQUEST_RSA_KEY = 1, + FAST_AUTH = 2, + FULL_AUTH = 3 + } +} diff --git a/MySQL.Data/src/Authentication/ClearPasswordPlugin.cs b/MySQL.Data/src/Authentication/ClearPasswordPlugin.cs new file mode 100644 index 000000000..b42ebda36 --- /dev/null +++ b/MySQL.Data/src/Authentication/ClearPasswordPlugin.cs @@ -0,0 +1,55 @@ +// Copyright © 2020, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient.Authentication +{ + /// + /// Allows connections to a user account set with the mysql_clear_password authentication plugin. + /// + public class MySqlClearPasswordPlugin : MySqlAuthenticationPlugin + { + private byte[] passBytes; + public override string PluginName => "mysql_clear_password"; + protected override Task MoreDataAsync(byte[] data, bool execAsync) + { + if ((Settings.SslMode != MySqlSslMode.Disabled && + Settings.ConnectionProtocol != MySqlConnectionProtocol.UnixSocket) || + (Settings.ConnectionProtocol == MySqlConnectionProtocol.UnixSocket)) + { + passBytes = System.Text.Encoding.UTF8.GetBytes(GetMFAPassword()); + return Task.FromResult(passBytes); + } + else + { + throw new MySqlException(Resources.ClearPasswordNotSupported); + } + } + } +} diff --git a/MySQL.Data/src/Authentication/FIDO/FidoAssertion.cs b/MySQL.Data/src/Authentication/FIDO/FidoAssertion.cs new file mode 100644 index 000000000..4df6de4e4 --- /dev/null +++ b/MySQL.Data/src/Authentication/FIDO/FidoAssertion.cs @@ -0,0 +1,197 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Authentication.FIDO.Native; +using MySql.Data.Authentication.FIDO.Utility; +using System; + +namespace MySql.Data.Authentication.FIDO +{ + /// + /// A reference struct representing a statement contained within a object + /// + internal unsafe ref struct FidoAssertionStatement + { + #region Properties + /// + /// WebAuthn §6.1 https://www.w3.org/TR/webauthn-1/#sec-authenticator-data + /// Gets the authenticator data for the assertion statement. + /// + public ReadOnlySpan AuthData { get; } + + /// + /// Gets the authenticator data length for the assertion statement. + /// + public int AuthDataLen { get; } + + /// + /// Gets the ID for this assertion statement + /// + public ReadOnlySpan Id { get; } + + /// + /// Gets the signature for this assertion statement + /// + public ReadOnlySpan Signature { get; } + + /// + /// Gets the signature length for this assertion statement + /// + public int SignatureLen { get; } + #endregion + + #region Constructors + internal FidoAssertionStatement(fido_assert_t* native, int idx) + { + IntPtr index = new IntPtr(idx); + AuthDataLen = NativeMethods.fido_assert_authdata_len(native, index); + AuthData = new ReadOnlySpan(NativeMethods.fido_assert_authdata_ptr(native, index), AuthDataLen); + Id = new ReadOnlySpan(NativeMethods.fido_assert_id_ptr(native, index), NativeMethods.fido_assert_id_len(native, index)); + SignatureLen = NativeMethods.fido_assert_sig_len(native, index); + Signature = new ReadOnlySpan(NativeMethods.fido_assert_sig_ptr(native, index), SignatureLen); + } + #endregion + } + + /// + /// Creates an object for holding data about a given assertion. In FIDO2, an assertion + /// is proof that the authenticator being used has knowledge of the private key associated + /// with the public key that the other party is in posession of. + /// + internal sealed unsafe class FidoAssertion : IDisposable + { + private fido_assert_t* _assert; + + #region Constructors + static FidoAssertion() + { + Init.Call(); + } + + /// + /// Default Constructor + /// + /// + public FidoAssertion() + { + _assert = NativeMethods.fido_assert_new(); + if (_assert == null) + throw new OutOfMemoryException(); + } + + /// + /// Finalizer + /// + ~FidoAssertion() => ReleaseUnmanagedResources(); + #endregion + + #region Properties + /// + /// Gets or sets the hash of the client data object that the assertion is based on. + /// + /// Thrown if an error occurs while setting the hash + public ReadOnlySpan ClientDataHash + { + set + { + fixed (byte* value_ = value) + { + NativeMethods.fido_assert_set_clientdata_hash(_assert, value_, (IntPtr)value.Length).Check(); + } + } + } + + /// + /// Gets or sets the relying party that requested this assertion + /// + /// Thrown if an error occurs while setting the relying party + public string Rp + { + set => NativeMethods.fido_assert_set_rp(_assert, value).Check(); + } + #endregion + + /// + /// Adds an allowed credential to this assertion. If used, only credential objects + /// with the IDs added via this method will be considered when making an assertion. + /// + /// The ID of the credential to add to the whitelist + /// Thrown if an error occurs while adding the credential + public void AllowCredential(ReadOnlySpan credentialId) + { + fixed (byte* cred = credentialId) + { + NativeMethods.fido_assert_allow_cred(_assert, cred, (IntPtr)credentialId.Length).Check(); + } + } + + /// + /// Cast operator for using this object as a native handle + /// + /// The object to use + public static explicit operator fido_assert_t*(FidoAssertion assert) + { + return assert._assert; + } + + /// + /// Gets the assertion statement at the index provided. + /// + /// The index of the assertion statement to retrieve + /// The assertion statement object + /// The index is not in the range [0, count) + public FidoAssertionStatement GetFidoAssertionStatement(int idx=0) + { + return new FidoAssertionStatement(_assert, idx); + } + + /// + /// Gets the number of assertions contained in the authentication device. + /// + /// The number of assertions contained in the authentication device. + public int GetAssertCount() + { + return NativeMethods.fido_assert_count(_assert); + } + + private void ReleaseUnmanagedResources() + { + var native = _assert; + NativeMethods.fido_assert_free(&native); + _assert = null; + } + + #region IDisposable + public void Dispose() + { + ReleaseUnmanagedResources(); + GC.SuppressFinalize(this); + } + #endregion + } +} diff --git a/MySQL.Data/src/Authentication/FIDO/FidoDevice.cs b/MySQL.Data/src/Authentication/FIDO/FidoDevice.cs new file mode 100644 index 000000000..71a20e1cb --- /dev/null +++ b/MySQL.Data/src/Authentication/FIDO/FidoDevice.cs @@ -0,0 +1,103 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Authentication.FIDO.Native; +using MySql.Data.Authentication.FIDO.Utility; +using System; + +namespace MySql.Data.Authentication.FIDO +{ + internal sealed unsafe class FidoDevice : IDisposable + { + private fido_dev_t* _device; + + #region Constructors + static FidoDevice() + { + Init.Call(); + } + + /// + /// Default constructor + /// + /// + public FidoDevice() + { + _device = NativeMethods.fido_dev_new(); + if (_device == null) + throw new OutOfMemoryException(); + } + + /// + /// Finalizer + /// + ~FidoDevice() => ReleaseUnmanagedResources(); + #endregion + + /// + /// Opens the device at the given path. + /// + /// The path of the device + /// Thrown if an error occurs while opening the device + public void Open(string path) => NativeMethods.fido_dev_open(_device, path).Check(); + + /// + /// Closes the device, preventing further use + /// + /// Thrown if an error occurs while closing + public void Close() => NativeMethods.fido_dev_close(_device).Check(); + + /// + /// Determines whether this device supports CTAP 2.1 Credential Management. + /// + public bool SupportsCredman => NativeMethods.fido_dev_supports_credman(_device); + + /// + /// Uses the device to generate an assertion + /// + /// The assertion object with its input properties properly set + /// Thrown if an error occurs while generating the assertion + public void GetAssert(FidoAssertion assert) => + NativeMethods.fido_dev_get_assert(_device, (fido_assert_t*)assert, null).Check(); + + private void ReleaseUnmanagedResources() + { + var native = _device; + NativeMethods.fido_dev_free(&native); + _device = null; + } + + #region IDisposable + public void Dispose() + { + ReleaseUnmanagedResources(); + GC.SuppressFinalize(this); + } + #endregion + } +} diff --git a/MySQL.Data/src/Authentication/FIDO/FidoDeviceInfo.cs b/MySQL.Data/src/Authentication/FIDO/FidoDeviceInfo.cs new file mode 100644 index 000000000..d38a265bb --- /dev/null +++ b/MySQL.Data/src/Authentication/FIDO/FidoDeviceInfo.cs @@ -0,0 +1,121 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Authentication.FIDO.Native; +using MySql.Data.Authentication.FIDO.Utility; +using System; + +namespace MySql.Data.Authentication.FIDO +{ + /// + /// A class representing external info about a particular FIDO capable device + /// + internal sealed unsafe class FidoDeviceInfo : IDisposable + { + private fido_dev_info_t* _devInfo; + private readonly fido_dev_info_t* _current; + private readonly int _size = 5; + + #region Properties + /// + /// Gets the manufacturer of the device + /// + public string Manufacturer => NativeMethods.fido_dev_info_manufacturer_string(_current); + + /// + /// Gets the path of the device (for use in ) + /// + public string Path => NativeMethods.fido_dev_info_path(_current); + + /// + /// Gets the product ID of the device + /// + public short Product => NativeMethods.fido_dev_info_product(_current); + + /// + /// Gets a string representation of the product ID + /// + public string ProductString => NativeMethods.fido_dev_info_product_string(_current); + + /// + /// Gets the vendor ID of the device + /// + public short Vendor => NativeMethods.fido_dev_info_vendor(_current); + #endregion + + #region Constructors + static FidoDeviceInfo() + { + Init.Call(); + } + + internal FidoDeviceInfo() + { + _devInfo = NativeMethods.fido_dev_info_new((IntPtr)_size); + if (_devInfo == null) + throw new OutOfMemoryException(); + + var olen = IntPtr.Zero; + NativeMethods.fido_dev_info_manifest(_devInfo, (IntPtr)_size, &olen).Check(); + + for (int i = 0; i < (int)olen; i++) + { + _current = NativeMethods.fido_dev_info_ptr(_devInfo, (IntPtr)i); + + if (Product != 1) + break; + } + } + + /// + /// Finalizer + /// + ~FidoDeviceInfo() => ReleaseUnmanagedResources(); + #endregion + + private void ReleaseUnmanagedResources() + { + if (_devInfo == null) + { + return; + } + + var native = _devInfo; + NativeMethods.fido_dev_info_free(&native, (IntPtr)_size); + _devInfo = null; + } + + #region IDisposable + public void Dispose() + { + ReleaseUnmanagedResources(); + GC.SuppressFinalize(this); + } + #endregion + } +} diff --git a/MySQL.Data/src/Authentication/FIDO/Native/NativeMethods.cs b/MySQL.Data/src/Authentication/FIDO/Native/NativeMethods.cs new file mode 100644 index 000000000..2931a61b3 --- /dev/null +++ b/MySQL.Data/src/Authentication/FIDO/Native/NativeMethods.cs @@ -0,0 +1,324 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General internal License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General internal License, version 2.0, for more details. +// +// You should have received a copy of the GNU General internal License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Authentication.FIDO.Utility; +using System; +using System.Runtime.InteropServices; + +namespace MySql.Data.Authentication.FIDO.Native +{ + /// + /// P/Invoke methods + /// + internal static unsafe class NativeMethods + { + private const string DllName = "fido2"; + + /// + /// The fido_init() function initialises the libfido2 library. + /// Its invocation must precede that of any other libfido2 function. + /// If FIDO_DEBUG is set in flags, then debug output will be emitted by libfido2 on stderr. + /// Alternatively, the FIDO_DEBUG environment variable may be set. + /// + /// The flags to use during initialization + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + internal static extern void fido_init(int flags); + + #region FidoDevice + /// + /// Returns a pointer to a newly allocated, empty fido_dev_t type. + /// If memory cannot be allocated, null is returned. + /// + /// A newly allocated, empty fido_dev_t type + [DllImport(DllName)] + internal static extern fido_dev_t* fido_dev_new(); + + /// + /// Releases the memory backing *dev_p, where *dev_p must have been previously allocated by . + /// On return, *dev_p is set to null. Either dev_p or *dev_p may be null, in which case fido_dev_free() is a NOP. + /// + /// + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + internal static extern void fido_dev_free(fido_dev_t** dev_p); + + /// + /// Closes the device represented by dev. If dev is already closed, this is a NOP. + /// + /// The device to close + /// on success, anything else on failure + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + internal static extern int fido_dev_close(fido_dev_t* dev); + + /// + /// Opens the device pointed to by path, where dev is a freshly allocated or otherwise closed fido_dev_t. + /// + /// The device handle to store the result + /// The unique path to the device + /// on success, anything else on failure + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + internal static extern int fido_dev_open(fido_dev_t* dev, string path); + + /// + /// Asks the FIDO device represented by dev for an assertion according to the following parameters defined in assert: + /// relying party ID; + /// client data hash; + /// list of allowed credential IDs; + /// user presence and user verification attributes. + /// See fido_assert_set(3) for information on how these values are set. + /// If a PIN is not needed to authenticate the request against dev, then pin may be NULL. + /// Otherwise pin must point to a NUL-terminated UTF-8 string. + /// Please note that fido_dev_get_assert() is synchronous and will block if necessary. + /// + /// The device to use for generation + /// The assert to use for generation + /// The pin of the device + /// on success, anything else on failure + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + internal static extern int fido_dev_get_assert(fido_dev_t* dev, fido_assert_t* assert, string pin); + + /// + /// Returns if supports CTAP 2.1 Credential Management. + /// + /// The device to check. + /// if supports CTAP 2.1 Credential Management; otherwise, . + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + //[return: MarshalAs(UnmanagedType.U1)] + internal static extern bool fido_dev_supports_credman(fido_dev_t* dev); + #endregion + + #region FidoDeviceInfo + /// + /// Returns a pointer to a newly allocated, empty fido_dev_info_t type. + /// If memory cannot be allocated, null is returned. + /// + /// A newly allocated, empty fido_dev_info_t type + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + public static extern fido_dev_info_t* fido_dev_info_new(IntPtr n); + + /// + /// Returns a pointer to the path of di + /// + /// The object to act on + /// A pointer to the path of di + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(ConstStringMarshaler))] + internal static extern string fido_dev_info_path(fido_dev_info_t* di); + + /// + /// Returns a pointer to the idx entry of di + /// + /// The object to act on + /// The index of the object to retrieve + /// A pointer to the idx entry of di + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + internal static extern fido_dev_info_t* fido_dev_info_ptr(fido_dev_info_t* di, IntPtr idx); + + /// + /// Fills devlist with up to ilen FIDO devices found by the underlying operating system. + /// Currently only USB HID devices are supported. + /// The number of discovered devices is returned in olen, where olen is an addressable pointer. + /// + /// The devlist pointer to store the result in + /// The number of entries that the list can hold + /// A pointer to where the number of entries that were written will be stored + /// on success, anything else on failure + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + public static extern int fido_dev_info_manifest(fido_dev_info_t* devlist, IntPtr ilen, IntPtr* olen); + + /// + /// Releases the memory backing *devlist_p, where *devlist_p must have been previously allocated by . + /// On return, *devlist_p is set to null. Either devlist_p or *devlist_p may be null, in which case fido_dev_info_free() is a NOP. + /// + /// + /// The number of entries this object was allocated to hold + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + public static extern void fido_dev_info_free(fido_dev_info_t** devlist_p, IntPtr n); + + /// + /// Returns the vendor of the device + /// + /// The object to act on + /// The vendor of the device + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + public static extern short fido_dev_info_vendor(fido_dev_info_t* di); + + /// + /// Returns the product of the device + /// + /// The object to act on + /// The product of the device + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + public static extern short fido_dev_info_product(fido_dev_info_t* di); + + /// + /// Returns a pointer to the product string of di + /// + /// The object to act on + /// A pointer to the product string of di + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(ConstStringMarshaler))] + public static extern string fido_dev_info_product_string(fido_dev_info_t* di); + + /// + /// Returns a pointer to the manufacturer string of di + /// + /// The object to act on + /// A pointer to the manufacturer string of di + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + [return: MarshalAs(UnmanagedType.CustomMarshaler, MarshalTypeRef = typeof(ConstStringMarshaler))] + public static extern string fido_dev_info_manufacturer_string(fido_dev_info_t* di); + #endregion + + #region FidoAssert + /// + /// Returns a pointer to a newly allocated, empty fido_assert_t type. + /// If memory cannot be allocated, null is returned + /// + /// A newly allocated, empty fido_assert_t type + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + internal static extern fido_assert_t* fido_assert_new(); + + /// + /// Releases the memory backing *assert_p, where *assert_p must have been previously allocated by . + /// On return, *assert_p is set to null. Either assert_p or *assert_p may be null, in which case fido_assert_free() is a NOP. + /// + /// The object to free + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + internal static extern void fido_assert_free(fido_assert_t** assert_p); + + /// + /// Adds ptr to the list of credentials allowed in assert, where ptr points to a credential ID of len bytes. + /// A copy of ptr is made, and no references to the passed pointer are kept. + /// If this call fails, the existing list of allowed credentials is preserved. + /// + /// The object to act on + /// A pointer to the ID of the credential to allow + /// The length of the data inside of + /// + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + internal static extern int fido_assert_allow_cred(fido_assert_t* assert, byte* ptr, IntPtr len); + + /// + /// Set the client data hash of assert + /// + /// The assertion object to act on + /// The client data hash to set + /// The length of the data in + /// on success, anything else on failure + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + internal static extern int fido_assert_set_clientdata_hash(fido_assert_t* assert, byte* ptr, IntPtr len); + + /// + /// Sets the relying party of assert + /// + /// The assertion object to act on + /// The ID of the the relying party + /// on success, anything else on failure + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + internal static extern int fido_assert_set_rp(fido_assert_t* assert, string id); + + /// + /// Returns the length of the authenticator data of statement idx in assert + /// + /// The assertion object to act on + /// The index to retrieve + /// The length of the authenticator data of statement idx in assert + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + public static extern int fido_assert_authdata_len(fido_assert_t* assert, IntPtr idx); + + /// + /// Returns a pointer to the authenticator data of statement idx in assert + /// + /// The assertion object to act on + /// The index to retrieve + /// A pointer to the authenticator data of statement idx in assert + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + public static extern byte* fido_assert_authdata_ptr(fido_assert_t* assert, IntPtr idx); + + /// + /// Returns the length of the signature of statement idx in assert + /// + /// The assertion object to act on + /// The index to retrieve + /// The length of the signature of statement idx in assert + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + public static extern int fido_assert_sig_len(fido_assert_t* assert, IntPtr idx); + + /// + /// Returns a pointer to the signature of statement idx in assert + /// + /// The assertion object to act on + /// The index to retrieve + /// A pointer to the signatureof statement idx in assert + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + public static extern byte* fido_assert_sig_ptr(fido_assert_t* assert, IntPtr idx); + + /// + /// Returns the length of the ID of statement idx in assert + /// + /// The assertion object to act on + /// The index to retrieve + /// The length of the ID of statement idx in assert + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + public static extern int fido_assert_id_len(fido_assert_t* assert, IntPtr idx); + + /// + /// Returns a pointer to the ID of statement idx in assert. + /// + /// The assertion object to act on. + /// The index to retrieve. + /// A pointer to the ID of statement idx in assert. + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + public static extern byte* fido_assert_id_ptr(fido_assert_t* assert, IntPtr idx); + + /// + /// Returns the length of the client data hash of an assertion. + /// + /// The assertion object to act on. + /// The length of the client data hash of statement idx of the assertion. + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + public static extern int fido_assert_clientdata_hash_len(fido_assert_t* assert); + + /// + /// Returns a pointer to the client data hash of an assertion. + /// + /// The assertion object to act on. + /// A pointer to the client data hash of the assertion. + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + public static extern byte* fido_assert_clientdata_hash_ptr(fido_assert_t* assert); + + /// + /// Returns the number of statements in assertion. + /// + /// The assertion object to act on. + /// The number of statements in assertion. + [DllImport(DllName, CallingConvention = CallingConvention.Cdecl)] + public static extern int fido_assert_count(fido_assert_t* assert); + #endregion + } +} diff --git a/MySQL.Data/src/Authentication/FIDO/Native/Structs.cs b/MySQL.Data/src/Authentication/FIDO/Native/Structs.cs new file mode 100644 index 000000000..29a2a24a6 --- /dev/null +++ b/MySQL.Data/src/Authentication/FIDO/Native/Structs.cs @@ -0,0 +1,45 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySql.Data.Authentication.FIDO.Native +{ + /// + /// FIDO assertion handle + /// + internal struct fido_assert_t { } + + /// + /// FIDO device handle + /// + internal struct fido_dev_t { } + + /// + /// FIDO device info handle + /// + internal struct fido_dev_info_t { } +} diff --git a/MySQL.Data/src/Authentication/FIDO/Utility/ConstStringMarshaler.cs b/MySQL.Data/src/Authentication/FIDO/Utility/ConstStringMarshaler.cs new file mode 100644 index 000000000..0129ab241 --- /dev/null +++ b/MySQL.Data/src/Authentication/FIDO/Utility/ConstStringMarshaler.cs @@ -0,0 +1,69 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Runtime.InteropServices; + +namespace MySql.Data.Authentication.FIDO.Utility +{ + internal sealed class ConstStringMarshaler : ICustomMarshaler + { + private static readonly ConstStringMarshaler Instance = new ConstStringMarshaler(); + + /// + /// Gets the global instance of this class as required by + /// + /// The cookie to use when getting the global instance (ignored) + /// The global instance + public static ICustomMarshaler GetInstance(string cookie) => Instance; + + #region ICustomMarshaler + public void CleanUpManagedData(object ManagedObj) + { + throw new NotImplementedException(); + } + + public void CleanUpNativeData(IntPtr pNativeData) { } + + public int GetNativeDataSize() + { + return IntPtr.Size; + } + + public IntPtr MarshalManagedToNative(object ManagedObj) + { + throw new NotImplementedException(); + } + + public object MarshalNativeToManaged(IntPtr pNativeData) + { + return Marshal.PtrToStringAnsi(pNativeData); + } + #endregion + } +} diff --git a/MySQL.Data/src/Authentication/FIDO/Utility/Enums.cs b/MySQL.Data/src/Authentication/FIDO/Utility/Enums.cs new file mode 100644 index 000000000..41503cb68 --- /dev/null +++ b/MySQL.Data/src/Authentication/FIDO/Utility/Enums.cs @@ -0,0 +1,291 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySql.Data.Authentication.FIDO.Utility +{ + internal enum FidoStatus + { + Ok = 0, + TxErr = -1, + RxErr = -2, + RxNotCbor = -3, + RxInvalidCbor = -4, + InvalidParam = -5, + InvalidSignature = -6, + InvalidArgument = -7, + UserPresenceRequired = -8, + InternalError = -9 + } + + /// + /// Status codes as defined in Client to Authenticator Protocol (CTAP) standard + /// Error response values in the range between and are reserved for spec purposes. + /// Error response values in the range between and + /// may be used for vendor-specific implementations. All other response values are reserved for future use and may not be used. + /// These vendor specific error codes are not interoperable and the platform should treat these errors as any other unknown error codes. + /// Error response values in the range between and + /// may be used for extension-specific implementations. + /// + internal enum CtapStatus : int + { + /// + /// Indicates successful response. + /// + Ok = 0, + + /// + /// The command is not a valid CTAP command. + /// + InvalidCommand = 0x01, + + /// + /// The command included an invalid parameter. + /// + InvalidParameter = 0x02, + + /// + /// Invalid message or item length. + /// + InvalidLength = 0x03, + + /// + /// Invalid message sequencing. + /// + InvalidSeq = 0x04, + + /// + /// Message timed out. + /// + Timeout = 0x05, + + /// + /// Channel busy. + /// + ChannelBusy = 0x06, + + /// + /// Command requires channel lock. + /// + LockRequired = 0x0a, + + /// + /// Command not allowed on this cid. + /// + InvalidChannel = 0x0b, + + /// + /// Invalid/unexpected CBOR error. + /// + CborUnexpectedType = 0x11, + + /// + /// Error when parsing CBOR. + /// + InvalidCbor = 0x12, + + /// + /// Missing non-optional parameter. + /// + MissingParameter = 0x14, + + /// + /// Limit for number of items exceeded. + /// + LimitExceeded = 0x15, + + /// + /// Unsupported extension. + /// + UnsupportedExtension = 0x16, + + /// + /// Valid credential found in the exclude list. + /// + CredentialExcluded = 0x19, + + /// + /// Processing (Lengthy operation is in progress). + /// + Processing = 0x21, + + /// + /// Credential not valid for the authenticator. + /// + InvalidCredential = 0x22, + + /// + /// Authentication is waiting for user interaction. + /// + UserActionPending = 0x23, + + /// + /// Processing, lengthy operation is in progress. + /// + OperationPending = 0x24, + + /// + /// No request is pending. + /// + NoOperations = 0x25, + + /// + /// Authenticator does not support requested algorithm. + /// + UnsupportedAlgorithm = 0x26, + + /// + /// Not authorized for requested operation. + /// + OperationDenied = 0x27, + + /// + /// Internal key storage is full. + /// + KeyStoreFull = 0x28, + + /// + /// No outstanding operations. + /// + NoOperationPending = 0x2a, + + /// + /// Unsupported option. + /// + UnsupportedOption = 0x2b, + + /// + /// Not a valid option for current operation. + /// + InvalidOption = 0x2c, + + /// + /// Pending keep alive was cancelled. + /// + KeepAliveCancel = 0x2d, + + /// + /// No valid credentials provided. + /// + NoCredentials = 0x2e, + + /// + /// Timeout waiting for user interaction. + /// + UserActionTimeout = 0x2f, + + /// + /// Continuation command, such as, authenticatorGetNextAssertion not allowed. + /// + NotAllowed = 0x30, + + /// + /// PIN Invalid. + /// + PinInvalid = 0x31, + + /// + /// PIN Blocked. + /// + PinBlocked = 0x32, + + /// + /// PIN authentication,pinAuth, verification failed. + /// + PinAuthInvalid = 0x33, + + /// + /// PIN authentication,pinAuth, blocked. Requires power recycle to reset. + /// + PinAuthBlocked = 0x34, + + /// + /// No PIN has been set. + /// + PinNotSet = 0x35, + + /// + /// PIN is required for the selected operation. + /// + PinRequired = 0x36, + + /// + /// PIN policy violation. Currently only enforces minimum length. + /// + PolicyViolation = 0x37, + + /// + /// pinToken expired on authenticator. + /// + PinTokenExpired = 0x38, + + /// + /// Authenticator cannot handle this request due to memory constraints. + /// + RequestTooLarge = 0x39, + + /// + /// The current operation has timed out. + /// + ActionTimeout = 0x3a, + + /// + /// User presence is required for the requested operation. + /// + UpRequired = 0x3b, + + /// + /// Other unspecified error. + /// + Other = 0x7f, + + /// + /// CTAP 2 spec last error. + /// + SpecLast = 0xdf, + + /// + /// Extension specific error. + /// + ExtensionFirst = 0xe0, + + /// + /// Extension specific error. + /// + ExtensionLast = 0xef, + + /// + /// Vendor specific error. + /// + VendorFirst = 0xf0, + + /// + /// Vendor specific error. + /// + VendorLast = 0xff + } +} diff --git a/MySQL.Data/src/Authentication/FIDO/Utility/Extensions.cs b/MySQL.Data/src/Authentication/FIDO/Utility/Extensions.cs new file mode 100644 index 000000000..b141dc1af --- /dev/null +++ b/MySQL.Data/src/Authentication/FIDO/Utility/Extensions.cs @@ -0,0 +1,46 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySql.Data.Authentication.FIDO.Utility +{ + internal static class Extensions + { + public static void Check(this int err) + { + if (err > (int)CtapStatus.Ok) + { + throw new CtapException((CtapStatus)err); + } + + if (err < (int)FidoStatus.Ok) + { + throw new FidoException((FidoStatus)err); + } + } + } +} diff --git a/MySQL.Data/src/Authentication/FIDO/Utility/FidoExceptions.cs b/MySQL.Data/src/Authentication/FIDO/Utility/FidoExceptions.cs new file mode 100644 index 000000000..b0d5ce8dc --- /dev/null +++ b/MySQL.Data/src/Authentication/FIDO/Utility/FidoExceptions.cs @@ -0,0 +1,72 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; + +namespace MySql.Data.Authentication.FIDO.Utility +{ + /// + /// An exception representing a return status that is non-successful according to the CTAP specification + /// + internal sealed class CtapException : Exception + { + /// + /// The status code that was returned + /// + internal CtapStatus Code { get; } + + /// + /// Default constructor + /// + /// The status code to use + internal CtapException(CtapStatus err) : base($"CTAP response indicated non-success status ({err})") + { + Code = err; + } + } + + /// + /// An exception indicating that there was some problem with the FIDO2 device + /// + internal sealed class FidoException : Exception + { + /// + /// The code returned from the device + /// + internal FidoStatus Code { get; set; } + + /// + /// Default constructor + /// + /// The code to use + internal FidoException(FidoStatus code) : base($"FIDO2 operation failed ({code})") + { + Code = code; + } + } +} diff --git a/MySQL.Data/src/Authentication/FIDO/Utility/Init.cs b/MySQL.Data/src/Authentication/FIDO/Utility/Init.cs new file mode 100644 index 000000000..20d5584e5 --- /dev/null +++ b/MySQL.Data/src/Authentication/FIDO/Utility/Init.cs @@ -0,0 +1,49 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Authentication.FIDO.Native; + +namespace MySql.Data.Authentication.FIDO.Utility +{ + /// + /// This class represent the function that should precede any invocation to libfido2 library. + /// + internal class Init + { + private static bool _called; + + internal static void Call() + { + if (_called) + return; + + _called = true; + NativeMethods.fido_init(0); + } + } +} diff --git a/MySQL.Data/src/Authentication/GSSAPI/Const.cs b/MySQL.Data/src/Authentication/GSSAPI/Const.cs new file mode 100644 index 000000000..8f153be0c --- /dev/null +++ b/MySQL.Data/src/Authentication/GSSAPI/Const.cs @@ -0,0 +1,110 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Authentication.GSSAPI.Native; +using System; +using System.Runtime.InteropServices; + +namespace MySql.Data.Authentication.GSSAPI +{ + /// + /// GSS API constants + /// + internal static class Const + { + #region GSS Constants + internal const uint GSS_S_COMPLETE = 0U; + internal const uint GSS_S_CONTINUE_NEEDED = 1U; + + internal const uint GSS_C_INDEFINITE = 0xFFFFFFFFU; + internal static IntPtr GSS_C_NO_BUFFER = IntPtr.Zero; + internal static IntPtr GSS_C_NO_CREDENTIAL = IntPtr.Zero; + internal static IntPtr GSS_C_NO_NAME = IntPtr.Zero; + + internal static GssOidDescStruct GSS_C_NO_OID = default(GssOidDescStruct); + internal static GssOidSetStruct GSS_C_NO_OID_SET = default(GssOidSetStruct); + + internal static uint GSS_C_QOP_DEFAULT = 0U; + #endregion + + #region GSS OIDs + /// + /// GSS_C_NT_HOSTBASED_SERVICE (1.2.840.113554.1.2.1.4) + /// + private static readonly byte[] GssNtHostBasedServiceOid = { 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x01, 0x02, 0x01, 0x04 }; + + internal static GssOidDescStruct GssNtHostBasedService = new GssOidDescStruct + { + length = (uint)GssNtHostBasedServiceOid.Length, + elements = GCHandle.Alloc(GssNtHostBasedServiceOid, GCHandleType.Pinned).AddrOfPinnedObject() + }; + + /// + /// GSS_KRB5_NT_PRINCIPAL_NAME (1.2.840.113554.1.2.2.1) + /// + private static readonly byte[] GssNtPrincipalNameOid = { 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x01, 0x02, 0x02, 0x01 }; + + internal static GssOidDescStruct GssNtPrincipalName = new GssOidDescStruct + { + length = (uint)GssNtPrincipalNameOid.Length, + elements = GCHandle.Alloc(GssNtPrincipalNameOid, GCHandleType.Pinned).AddrOfPinnedObject() + }; + + /// + /// GSS_C_NT_USER_NAME (1.2.840.113554.1.2.1.1) + /// + private static readonly byte[] GssNtUserNameOid = { 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x01, 0x02, 0x01, 0x01 }; + + internal static GssOidDescStruct GssNtUserName = new GssOidDescStruct + { + length = (uint)GssNtUserNameOid.Length, + elements = GCHandle.Alloc(GssNtUserNameOid, GCHandleType.Pinned).AddrOfPinnedObject() + }; + + /// + /// GSS_KRB5_MECH_OID_DESC (1.2.840.113554.1.2.2) + /// + private static readonly byte[] GssKrb5MechOid = { 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x12, 0x01, 0x02, 0x02 }; + + internal static GssOidDescStruct GssKrb5MechOidDesc = new GssOidDescStruct + { + length = (uint)GssKrb5MechOid.Length, + elements = GCHandle.Alloc(GssKrb5MechOid, GCHandleType.Pinned).AddrOfPinnedObject() + }; + + /// + /// GSS_KRB5_MECH_OID_DESC Set + /// + internal static GssOidSetStruct GssKrb5MechOidSet = new GssOidSetStruct + { + count = 1, + elements = GCHandle.Alloc(GssKrb5MechOidDesc, GCHandleType.Pinned).AddrOfPinnedObject() + }; + #endregion + } +} diff --git a/MySQL.Data/src/Authentication/GSSAPI/GssContext.cs b/MySQL.Data/src/Authentication/GSSAPI/GssContext.cs new file mode 100644 index 000000000..877656696 --- /dev/null +++ b/MySQL.Data/src/Authentication/GSSAPI/GssContext.cs @@ -0,0 +1,234 @@ +// Copyright © 2020, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Authentication.GSSAPI.Native; +using MySql.Data.Authentication.GSSAPI.Utility; +using MySql.Data.MySqlClient; +using System; +using System.Runtime.InteropServices; + +namespace MySql.Data.Authentication.GSSAPI +{ + /// + /// Defines a security context + /// + internal class GssContext : IDisposable + { + private bool disposed; + + internal bool IsEstablished = false; + private GssCredentials Credentials; + private GssContextFlags Flags; + + private IntPtr _context; + private IntPtr _gssTargetName; + + /// + /// Sets the main properties to create and initiate a security context. + /// + /// Service Principal Name. + /// Credentials. + /// Requested flags. + internal GssContext(string spn, GssCredentials credentials, GssContextFlags flags) + { + Credentials = credentials; + Flags = flags; + + using (var gssTargetNameBuffer = GssType.GetBufferFromString(spn)) + { + // use the buffer to import the name into a gss_name + var majorStatus = NativeMethods.gss_import_name( + out var minorStatus, + ref gssTargetNameBuffer.Value, + ref Const.GssNtPrincipalName, + out _gssTargetName + ); + + if (majorStatus != Const.GSS_S_COMPLETE) + throw new MySqlException(ExceptionMessages.FormatGssMessage("GSSAPI: Unable to import the supplied target name (SPN).", + majorStatus, minorStatus, Const.GssNtPrincipalName)); + } + } + + /// + /// Initiate the security context + /// + /// Challenge received by the server. + /// A byte array containing the response to be sent to the server + internal byte[] InitSecContext(byte[] token) + { + // If the token is null, supply a NULL pointer as the input + var inputToken = token == null + ? Disposable.From(default(GssBufferDescStruct)) + : GssType.GetBufferFromBytes(token); + + var majorStatus = NativeMethods.gss_init_sec_context( + out var minorStatus, + Credentials._credentials, + ref _context, + _gssTargetName, + ref Const.GssKrb5MechOidDesc, + (uint)Flags, + 0, + IntPtr.Zero, + ref inputToken.Value, + IntPtr.Zero, + out var output, + IntPtr.Zero, + IntPtr.Zero + ); + + switch (majorStatus) + { + case Const.GSS_S_COMPLETE: + IsEstablished = true; + return MarshalOutputToken(output); + + case Const.GSS_S_CONTINUE_NEEDED: + return MarshalOutputToken(output); + + default: + throw new MySqlException(ExceptionMessages.FormatGssMessage("GSSAPI: Unable to generate the token from the supplied credentials.", + majorStatus, minorStatus, Const.GssKrb5MechOidDesc)); + } + } + + /// + /// Unwrap a message. + /// + /// Message acquired from the server. + /// Unwrapped message. + internal byte[] Unwrap(byte[] message) + { + var inputMessage = GssType.GetBufferFromBytes(message); + + var majorStatus = NativeMethods.gss_unwrap( + out var minorStatus, + _context, + ref inputMessage.Value, + out var outputMessage, + out var confState, + out var qopState); + + if (majorStatus == Const.GSS_S_COMPLETE) + return MarshalOutputToken(outputMessage); + else + throw new MySqlException(ExceptionMessages.FormatGssMessage("GSSAPI: Unable to unwrap the message provided.", + majorStatus, minorStatus, Const.GssKrb5MechOidDesc)); + } + + /// + /// Wrap a message. + /// + /// Message to be wrapped. + /// A byte array containing the wrapped message. + internal byte[] Wrap(byte[] message) + { + var inputMessage = GssType.GetBufferFromBytes(message); + + var majorStatus = NativeMethods.gss_wrap( + out var minorStatus, + _context, + ref inputMessage.Value, + out var outputMessage); + + if (majorStatus == Const.GSS_S_COMPLETE) + return MarshalOutputToken(outputMessage); + else + throw new MySqlException(ExceptionMessages.FormatGssMessage("GSSAPI: Unable to unwrap the message provided.", + majorStatus, minorStatus, Const.GssKrb5MechOidDesc)); + } + + /// + /// Allocate a clr byte array and copy the token data over + /// + /// Buffer. + /// A byte array + private static byte[] MarshalOutputToken(GssBufferDescStruct gssToken) + { + if (gssToken.length > 0) + { + var buffer = new byte[gssToken.length]; + Marshal.Copy(gssToken.value, buffer, 0, (int)gssToken.length); + + // Finally, release the underlying gss buffer + var majorStatus = NativeMethods.gss_release_buffer(out var minorStatus, ref gssToken); + if (majorStatus != Const.GSS_S_COMPLETE) + throw new MySqlException(ExceptionMessages.FormatGssMessage("GSSAPI: An error occurred releasing the token buffer allocated.", + majorStatus, minorStatus, Const.GssKrb5MechOidDesc)); + + return buffer; + } + return new byte[0]; + } + + /// + /// Cleanups unmanaged resources + /// + public void Cleanup() + { + if (_context != IntPtr.Zero) + { + var majStat = NativeMethods.gss_delete_sec_context(out var minStat, ref _context); + if (majStat != Const.GSS_S_COMPLETE) + throw new MySqlException(ExceptionMessages.FormatGssMessage("GSSAPI: An error occurred when releasing the token buffer allocated by the GSS provider", + majStat, minStat, Const.GssKrb5MechOidDesc)); + } + + if (_gssTargetName != IntPtr.Zero) + { + var majStat = NativeMethods.gss_release_name(out var minStat, ref _gssTargetName); + if (majStat != Const.GSS_S_COMPLETE) + throw new MySqlException(ExceptionMessages.FormatGssMessage("GSSAPI: An error occurred when releasing the gss service principal name", + majStat, minStat, Const.GssNtHostBasedService)); + } + } + + protected virtual void Dispose(bool disposing) + { + if (!disposed) + { + if (disposing) + Cleanup(); + + disposed = true; + } + } + + ~GssContext() + { + Cleanup(); + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + } +} diff --git a/MySQL.Data/src/Authentication/GSSAPI/GssContextFlags.cs b/MySQL.Data/src/Authentication/GSSAPI/GssContextFlags.cs new file mode 100644 index 000000000..e0bb81172 --- /dev/null +++ b/MySQL.Data/src/Authentication/GSSAPI/GssContextFlags.cs @@ -0,0 +1,80 @@ +// Copyright © 2020, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; + +namespace MySql.Data.Authentication.GSSAPI +{ + [Flags] + internal enum GssContextFlags + { + /// + /// No flags provided + /// + None = 0, + /// + /// Delegates credentials to a remote peer. Do not delegate the credentials if the value is false. + /// + Deleg = 1, + /// + /// Requests that the peer authenticate itself. If false, authenticate to the remote peer only. + /// + Mutual = 2, + /// + /// Enables replay detection for messages protected with gss_wrap(3GSS) or gss_get_mic(3GSS). Do not attempt to detect replayed messages if false. + /// + Replay = 4, + /// + /// Enables detection of out-of-sequence protected messages. Do not attempt to detect out-of-sequence messages if false. + /// + Sequence = 8, + /// + /// Requests that confidential service be made available by means of gss_wrap(3GSS). If false, no per-message confidential service is required. + /// + Conf = 16, + /// + /// Requests that integrity service be made available by means of gss_wrap(3GSS) or gss_get_mic(3GSS). If false, no per-message integrity service is required. + /// + Integ = 32, + /// + /// Does not reveal the initiator's identify to the acceptor. Otherwise, authenticate normally. + /// + Anon = 64, + /// + /// (Returned only) If true, the protection services specified by the states of GSS_C_CONF_FLAG and GSS_C_INTEG_FLAG are available + /// if the accompanying major status return value is either GSS_S_COMPLETE or GSS_S_CONTINUE_NEEDED. If false, the protection services are available + /// only if the accompanying major status return value is GSS_S_COMPLETE. + /// + ProtReady = 128, + /// + /// (Returned only) If true, the resultant security context may be transferred to other processes by means of a call to gss_export_sec_context(3GSS). If false, the security context cannot be transferred. + /// + Trans = 256, + DelegPolicy = 32768 + } +} diff --git a/MySQL.Data/src/Authentication/GSSAPI/GssCredentials.cs b/MySQL.Data/src/Authentication/GSSAPI/GssCredentials.cs new file mode 100644 index 000000000..ce0908868 --- /dev/null +++ b/MySQL.Data/src/Authentication/GSSAPI/GssCredentials.cs @@ -0,0 +1,228 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Authentication.GSSAPI.Native; +using MySql.Data.Authentication.GSSAPI.Utility; +using MySql.Data.MySqlClient; +using System; +using System.Runtime.InteropServices; +using static MySql.Data.Authentication.GSSAPI.Native.NativeMethods; + +namespace MySql.Data.Authentication.GSSAPI +{ + internal enum CredentialUsage + { + Both = 0, + Initiate = 1, + Accept = 2 + } + + /// + /// Credentials to use to establish the context + /// + internal class GssCredentials : IDisposable + { + internal IntPtr _credentials; + private IntPtr _gssUsername; + + internal string UserName { get; set; } + + /// + /// Acquires credentials for the supplied principal using the supplied password + /// + /// Username + /// Password + /// GSS_C_BOTH - Credentials may be used either to initiate or accept security contexts. + /// GSS_C_INITIATE - Credentials will only be used to initiate security contexts. + /// GSS_C_ACCEPT - Credentials will only be used to accept security contexts. + /// An object containing the credentials + internal GssCredentials(string username, string password, CredentialUsage usage = CredentialUsage.Initiate) + { + UserName = username; + + uint minorStatus; + uint majorStatus; + + // copy the principal name to a gss_buffer + using (var gssUsernameBuffer = GssType.GetBufferFromString(username)) + using (var gssPasswordBuffer = GssType.GetBufferFromString(password)) + { + // use the buffer to import the name into a gss_name + majorStatus = gss_import_name( + out minorStatus, + ref gssUsernameBuffer.Value, + ref Const.GssNtUserName, + out _gssUsername + ); + if (majorStatus != Const.GSS_S_COMPLETE) + throw new MySqlException(ExceptionMessages.FormatGssMessage("GSSAPI: Unable to import the supplied user name.", + majorStatus, minorStatus, Const.GssNtHostBasedService)); + + majorStatus = gss_acquire_cred_with_password( + out minorStatus, + _gssUsername, + ref gssPasswordBuffer.Value, + 0, + ref Const.GssKrb5MechOidSet, + (int)usage, + ref _credentials, + IntPtr.Zero, + out var actualExpiry); + + if (majorStatus != Const.GSS_S_COMPLETE) + throw new MySqlException(ExceptionMessages.FormatGssMessage("GSSAPI: Unable to acquire credentials for authentication.", + majorStatus, minorStatus, Const.GssKrb5MechOidDesc)); + } + } + + /// + /// Acquires credentials for the supplied principal using material stored in a valid keytab + /// + /// Username + /// GSS_C_BOTH - Credentials may be used either to initiate or accept security contexts. + /// GSS_C_INITIATE - Credentials will only be used to initiate security contexts. + /// GSS_C_ACCEPT - Credentials will only be used to accept security contexts. + /// An object containing the credentials + internal GssCredentials(string username, CredentialUsage usage = CredentialUsage.Initiate) + { + UserName = username; + + // allocate a gss buffer and copy the principal name to it + using (var gssNameBuffer = GssType.GetBufferFromString(username)) + { + uint minorStatus; + uint majorStatus; + + // use the buffer to import the name into a gss_name + majorStatus = gss_import_name( + out minorStatus, + ref gssNameBuffer.Value, + ref Const.GssNtUserName, + out var _gssUsername + ); + if (majorStatus != Const.GSS_S_COMPLETE) + throw new MySqlException(ExceptionMessages.FormatGssMessage("GSSAPI: Unable to import the supplied user name.", + majorStatus, minorStatus, Const.GssNtHostBasedService)); + + majorStatus = gss_acquire_cred( + out minorStatus, + _gssUsername, + Const.GSS_C_INDEFINITE, + ref Const.GssKrb5MechOidSet, + (int)usage, + ref _credentials, + IntPtr.Zero, + out var actualExpiry); + + if (majorStatus != Const.GSS_S_COMPLETE) + throw new MySqlException(ExceptionMessages.FormatGssMessage("GSSAPI: Unable acquire credentials for authentication.", + majorStatus, minorStatus, Const.GssKrb5MechOidDesc)); + } + } + + /// + /// Acquires default credentials stored in the cache + /// + /// GSS_C_BOTH - Credentials may be used either to initiate or accept security contexts. + /// GSS_C_INITIATE - Credentials will only be used to initiate security contexts. + /// GSS_C_ACCEPT - Credentials will only be used to accept security contexts. + /// An object containing the credentials + internal GssCredentials(CredentialUsage usage = CredentialUsage.Initiate) + { + uint minorStatus, lifetime; + int credentialUsage; + IntPtr name, mechs; + + var majorStatus = gss_acquire_cred( + out minorStatus, + Const.GSS_C_NO_NAME, + Const.GSS_C_INDEFINITE, + ref Const.GssKrb5MechOidSet, + (int)usage, + ref _credentials, + IntPtr.Zero, + out var actualExpiry); + + if (majorStatus != Const.GSS_S_COMPLETE) + throw new MySqlException(ExceptionMessages.FormatGssMessage("GSSAPI: Unable acquire credentials for authentication.", + majorStatus, minorStatus, Const.GssKrb5MechOidDesc)); + + majorStatus = gss_inquire_cred( + out minorStatus, + _credentials, + out name, + out lifetime, + out credentialUsage, + out mechs); + + if (majorStatus != Const.GSS_S_COMPLETE) + throw new MySqlException(ExceptionMessages.FormatGssMessage("GSSAPI: Unable to obtain information about the credentials provided.", + majorStatus, minorStatus, Const.GssKrb5MechOidDesc)); + + UserName = TranslateDisplayName(name); + } + + /// + /// Translates a name in internal form to a textual representation. + /// + /// Name in internal form (GSSAPI). + /// + private static string TranslateDisplayName(IntPtr name) + { + string userName; + + GssBufferDescStruct buffer; + gss_display_name(out _, name, out buffer, out _); + + userName = buffer.value == IntPtr.Zero ? string.Empty : Marshal.PtrToStringAnsi(buffer.value); + + var majorStatus = gss_release_buffer(out var minorStatus, ref buffer); + if (majorStatus != Const.GSS_S_COMPLETE) + throw new MySqlException(ExceptionMessages.FormatGssMessage("GSSAPI: An error occurred releasing a buffer.", + majorStatus, minorStatus, Const.GSS_C_NO_OID)); + + return userName; + } + + public void Dispose() + { + uint minorStatus; + uint majorStatus; + + majorStatus = gss_release_name(out minorStatus, ref _gssUsername); + if (majorStatus != Const.GSS_S_COMPLETE) + throw new MySqlException(ExceptionMessages.FormatGssMessage("GSSAPI: Unable to release the user name handle.", + majorStatus, minorStatus, Const.GssNtHostBasedService)); + + majorStatus = gss_release_cred(out minorStatus, ref _credentials); + if (majorStatus != Const.GSS_S_COMPLETE) + throw new MySqlException(ExceptionMessages.FormatGssMessage("GSSAPI: Unable to release the credential handle.", + majorStatus, minorStatus, Const.GssNtHostBasedService)); + } + } +} diff --git a/MySQL.Data/src/Authentication/GSSAPI/GssapiMechanism.cs b/MySQL.Data/src/Authentication/GSSAPI/GssapiMechanism.cs new file mode 100644 index 000000000..d786785f8 --- /dev/null +++ b/MySQL.Data/src/Authentication/GSSAPI/GssapiMechanism.cs @@ -0,0 +1,127 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Authentication.GSSAPI.Utility; +using MySql.Data.MySqlClient; +using System; + +namespace MySql.Data.Authentication.GSSAPI +{ + /// + /// The GSSAPI mechanism. + /// + internal class GssapiMechanism + { + private bool finalHandshake = false; + private GssCredentials gssCredentials = null; + internal GssContext gssContext = null; + + internal string MechanismName + { + get { return "GSSAPI"; } + } + + /// + /// Obtain credentials to be used to create a security context + /// + /// username + /// password + /// host + public GssapiMechanism(string username, string password, string krbServicePrincipal = null) + { + // Gets the Service Principal Name from the Kerberos configuration file. + krbServicePrincipal = krbServicePrincipal ?? KerberosConfig.GetServicePrincipalName(username); + + try + { + // Attempt to retrieve credentials from default cache file. + gssCredentials = new GssCredentials(username); + } + catch (Exception ex) + { + if (string.IsNullOrWhiteSpace(password)) + throw new MySqlException("Unable to retrieve stored credentials from default cache file.", ex); + + // Attempt to retrieve credentials using username and password. + gssCredentials = new GssCredentials(username, password); + } + + gssContext = new GssContext(krbServicePrincipal, gssCredentials, GssContextFlags.Deleg | GssContextFlags.Mutual); + } + + /// + /// Processes the challenge data. + /// + /// A byte array containing the challenge data from the server + /// A byte array containing the response to be sent to the server + internal byte[] Challenge(byte[] data) + { + byte[] response = null; + + if (finalHandshake) + return DoFinalHandshake(data); + else + { + try + { + // Initiate Security Context + response = gssContext.InitSecContext(data); + } + catch (Exception ex) + { + throw new MySqlException("Unable to initiate security context.", ex); + } + + if (gssContext.IsEstablished) + finalHandshake = true; + + return response; + } + } + + /// + /// Security context already established. + /// + /// A byte array containing the challenge data from the server + /// A non-null byte array containing the response to be sent to the server + internal byte[] DoFinalHandshake(byte[] data) + { + // if the authentication is complete, then we can pass null so the OK packet could be read from server + if (data.Length == 0) + return null; + + var unwrapped = gssContext.Unwrap(data); + + byte[] outPutMessage = new byte[4]; + outPutMessage[0] = 1; + var response = gssContext.Wrap(outPutMessage); + + return response; + } + } +} diff --git a/MySQL.Data/src/Authentication/GSSAPI/Native/GssBufferDescStruct.cs b/MySQL.Data/src/Authentication/GSSAPI/Native/GssBufferDescStruct.cs new file mode 100644 index 000000000..36932ed2d --- /dev/null +++ b/MySQL.Data/src/Authentication/GSSAPI/Native/GssBufferDescStruct.cs @@ -0,0 +1,43 @@ +// Copyright © 2020, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Runtime.InteropServices; + +namespace MySql.Data.Authentication.GSSAPI.Native +{ + [StructLayout(LayoutKind.Sequential)] + internal struct GssBufferDescStruct + { + /// size_t->unsigned int + public uint length; + + /// void* + public IntPtr value; + } +} diff --git a/MySQL.Data/src/Authentication/GSSAPI/Native/GssOidStruct.cs b/MySQL.Data/src/Authentication/GSSAPI/Native/GssOidStruct.cs new file mode 100644 index 000000000..14165a5f9 --- /dev/null +++ b/MySQL.Data/src/Authentication/GSSAPI/Native/GssOidStruct.cs @@ -0,0 +1,53 @@ +// Copyright © 2020, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Runtime.InteropServices; + +namespace MySql.Data.Authentication.GSSAPI.Native +{ + [StructLayout(LayoutKind.Sequential)] + internal struct GssOidDescStruct + { + /// OM_uint32->gss_uint32->unsigned int + public uint length; + + /// void* + public IntPtr elements; + } + + [StructLayout(LayoutKind.Sequential)] + internal struct GssOidSetStruct + { + /// OM_uint32->gss_uint32->unsigned int + public uint count; + + /// void* + public IntPtr elements; + } +} diff --git a/MySQL.Data/src/Authentication/GSSAPI/Native/NativeMethods.cs b/MySQL.Data/src/Authentication/GSSAPI/Native/NativeMethods.cs new file mode 100644 index 000000000..7f4fe0c39 --- /dev/null +++ b/MySQL.Data/src/Authentication/GSSAPI/Native/NativeMethods.cs @@ -0,0 +1,474 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; + +namespace MySql.Data.Authentication.GSSAPI.Native +{ + internal static class NativeMethods + { + private static bool? _isWin; + private static bool IsWin => _isWin ?? (_isWin = Environment.OSVersion.Platform.ToString().StartsWith("Win")).Value; + + /// + /// Converts a contiguous string name to GSS_API internal format + /// The gss_import_name() function converts a contiguous string name to internal form. In general, + /// the internal name returned by means of the output_name parameter will not be a mechanism name; the exception to this is if the input_name_type + /// indicates that the contiguous string provided by means of the input_name_buffer parameter is of type GSS_C_NT_EXPORT_NAME, in which case, + /// the returned internal name will be a mechanism name for the mechanism that exported the name. + /// + /// Status code returned by the underlying mechanism. + /// The gss_buffer_desc structure containing the name to be imported. + /// A gss_OID that specifies the format that the input_name_buffer is in. + /// The gss_name_t structure to receive the returned name in internal form. Storage associated with this name must be freed by the application after use with a call to gss_release_name(). + /// + /// The gss_import_name() function may return the following status codes: + /// GSS_S_COMPLETE: The gss_import_name() function completed successfully. + /// GSS_S_BAD_NAMETYPE: The input_name_type was unrecognized. + /// GSS_S_BAD_NAME: The input_name parameter could not be interpreted as a name of the specified type. + /// GSS_S_BAD_MECH: The input_name_type was GSS_C_NT_EXPORT_NAME, but the mechanism contained within the input_name is not supported. + /// + internal static uint gss_import_name( + out uint minorStatus, + ref GssBufferDescStruct inputNameBuffer, + ref GssOidDescStruct inputNameType, + out IntPtr outputName) + { + return IsWin + ? NativeMethodsWin64.gss_import_name(out minorStatus, ref inputNameBuffer, ref inputNameType, out outputName) + : NativeMethodsLinux.gss_import_name(out minorStatus, ref inputNameBuffer, ref inputNameType, out outputName); + } + + /// + /// Allows an application to acquire a handle for a pre-existing credential by name. GSS-API implementations must impose a local access-control + /// policy on callers of this routine to prevent unauthorized callers from acquiring credentials to which they are not entitled. + /// This routine is not intended to provide a "login to the network" function, as such a function would involve the creation of new credentials + /// rather than merely acquiring a handle to existing credentials + /// + /// Mechanism specific status code. + /// Name of principal whose credential should be acquired. + /// Number of seconds that credentials should remain valid. + /// Specify GSS_C_INDEFINITE to request that the credentials have the maximum permitted lifetime. + /// Set of underlying security mechanisms that may be used. + /// GSS_C_NO_OID_SET may be used to obtain an implementation-specific default. + /// GSS_C_BOTH - Credentials may be used either to initiate or accept security contexts. + /// GSS_C_INITIATE - Credentials will only be used to initiate security contexts. + /// GSS_C_ACCEPT - Credentials will only be used to accept security contexts. + /// The returned credential handle. Resources associated with this credential handle must be released + /// by the application after use with a call to gss_release_cred(). + /// The set of mechanisms for which the credential is valid. Storage associated with the returned OID-set must + /// be released by the application after use with a call to gss_release_oid_set(). Specify NULL if not required. + /// Actual number of seconds for which the returned credentials will remain valid. If the implementation does not + /// support expiration of credentials, the value GSS_C_INDEFINITE will be returned. Specify NULL if not required. + /// + /// gss_acquire_cred() may return the following status codes: + /// GSS_S_COMPLETE: Successful completion. + /// GSS_S_BAD_MECH: Unavailable mechanism requested. + /// GSS_S_BAD_NAMETYPE: Type contained within desired_name parameter is not supported. + /// GSS_S_BAD_NAME: Value supplied for desired_name parameter is ill formed. + /// GSS_S_CREDENTIALS_EXPIRED: The credentials could not be acquired Because they have expired. + /// GSS_S_NO_CRED: No credentials were found for the specified name. + /// + internal static uint gss_acquire_cred( + out uint minorStatus, + IntPtr desiredName, + uint timeRequired, + ref GssOidSetStruct desiredMechanisms, + int credentialUsage, + ref IntPtr credentialHandle, + IntPtr actualMech, + out uint expiryTime) + { + return IsWin + ? NativeMethodsWin64.gss_acquire_cred(out minorStatus, desiredName, timeRequired, ref desiredMechanisms, + credentialUsage, ref credentialHandle, actualMech, out expiryTime) + : NativeMethodsLinux.gss_acquire_cred(out minorStatus, desiredName, timeRequired, ref desiredMechanisms, + credentialUsage, ref credentialHandle, actualMech, out expiryTime); + } + + /// + /// Acquires a credential for use in establishing a security context using a password. + /// + /// Mechanism specific status code. + /// Name of principal whose credential should be acquired. + /// The password. + /// Number of seconds that credentials should remain valid. + /// Specify GSS_C_INDEFINITE to request that the credentials have the maximum permitted lifetime. + /// Set of underlying security mechanisms that may be used. + /// GSS_C_NO_OID_SET may be used to obtain an implementation-specific default. + /// GSS_C_BOTH - Credentials may be used either to initiate or accept security contexts. + /// GSS_C_INITIATE - Credentials will only be used to initiate security contexts. + /// GSS_C_ACCEPT - Credentials will only be used to accept security contexts. + /// The returned credential handle. Resources associated with this credential handle must be released + /// by the application after use with a call to gss_release_cred(). + /// The set of mechanisms for which the credential is valid. Storage associated with the returned OID-set must + /// be released by the application after use with a call to gss_release_oid_set(). Specify NULL if not required. + /// Actual number of seconds for which the returned credentials will remain valid. If the implementation does not + /// support expiration of credentials, the value GSS_C_INDEFINITE will be returned. Specify NULL if not required. + /// + /// gss_acquire_cred_with_password() may return the following status codes: + /// GSS_S_COMPLETE: Successful completion. + /// GSS_S_BAD_MECH: Unavailable mechanism requested. + /// GSS_S_BAD_NAMETYPE: Type contained within desired_name parameter is not supported. + /// GSS_S_BAD_NAME: Value supplied for desired_name parameter is ill formed. + /// GSS_S_CREDENTIALS_EXPIRED: The credentials could not be acquired Because they have expired. + /// GSS_S_NO_CRED: No credentials were found for the specified name. + /// + internal static uint gss_acquire_cred_with_password( + out uint minorStatus, + IntPtr desiredName, + ref GssBufferDescStruct password, + uint timeRequired, + ref GssOidSetStruct desiredMechanisms, + int credentialUsage, + ref IntPtr credentialHandle, + IntPtr actualMechs, + out uint expiryTime) + { + return IsWin + ? NativeMethodsWin64.gss_acquire_cred_with_password(out minorStatus, desiredName, ref password, timeRequired, + ref desiredMechanisms, credentialUsage, ref credentialHandle, actualMechs, out expiryTime) + : NativeMethodsLinux.gss_acquire_cred_with_password(out minorStatus, desiredName, ref password, timeRequired, + ref desiredMechanisms, credentialUsage, ref credentialHandle, actualMechs, out expiryTime); + } + + /// + /// Obtains information about a credential. + /// + /// Mechanism specific status code. + /// A handle that refers to the target credential. + /// The name whose identity the credential asserts. + /// The number of seconds for which the credential remain valid. + /// If the credential has expired, this parameter is set to zero. + /// How the credential may be used. + /// Set of mechanisms supported by the credential. + /// + /// gss_init_sec_context() may return the following status codes: + /// GSS_S_COMPLETE: Successful completion. + /// GSS_S_NO_CRED: The referenced credentials could not be accessed. + /// GSS_S_DEFECTIVE_CREDENTIAL: The referenced credentials were invalid. + /// GSS_S_CREDENTIALS_EXPIRED: The referenced credentials have expired. + /// If the lifetime parameter is not passed in as NULL, then its value is set to 0. + /// + internal static uint gss_inquire_cred( + out uint minorStatus, + IntPtr credentialHandle, + out IntPtr name, + out uint lifetime, + out int credentialUsage, + out IntPtr mechs) + { + return IsWin + ? NativeMethodsWin64.gss_inquire_cred(out minorStatus, credentialHandle, out name, out lifetime, out credentialUsage, out mechs) + : NativeMethodsLinux.gss_inquire_cred(out minorStatus, credentialHandle, out name, out lifetime, out credentialUsage, out mechs); + } + + /// + /// Initiates the establishment of a security context between the application and a remote peer. + /// Initially, the input_token parameter should be specified either as GSS_C_NO_BUFFER, or as a pointer to a gss_buffer_desc object whose length field + /// contains the value zero. The routine may return a output_token which should be transferred to the peer application, where the peer application will + /// present it to gss_accept_sec_context. If no token need be sent, gss_init_sec_context will indicate this by setting the length field of the output_token + /// argument to zero. To complete the context establishment, one or more reply tokens may be required from the peer application; if so, gss_init_sec_context + /// will return a status containing the supplementary information bit GSS_S_CONTINUE_NEEDED. In this case, gss_init_sec_context should be called again when the + /// reply token is received from the peer application, passing the reply token to gss_init_sec_context via the input_token parameters. + /// + /// Mechanism specific status code. + /// Handle for credentials claimed. Supply GSS_C_NO_CREDENTIAL to act as a default initiator principal. + /// If no default initiator is defined, the function will return GSS_S_NO_CRED. + /// Context handle for new context. Supply GSS_C_NO_CONTEXT for first call; use value returned by first call in continuation calls. + /// Resources associated with this context-handle must be released by the application after use with a call to gss_delete_sec_context(). + /// Name of target. + /// Object ID of desired mechanism. Supply GSS_C_NO_OID to obtain an implementation specific default. + /// Contains various independent flags, each of which requests that the context support a specific service option. + /// Symbolic names are provided for each flag, and the symbolic names corresponding to the required flags should be logically-ORed together to form the bit-mask value. + /// Desired number of seconds for which context should remain valid. Supply 0 to request a default validity period. + /// Application-specified bindings. Allows application to securely bind channel identification information to the security context. + /// Specify GSS_C_NO_CHANNEL_BINDINGS if channel bindings are not used. + /// Token received from peer application. Supply GSS_C_NO_BUFFER, or a pointer to a buffer containing the value GSS_C_EMPTY_BUFFER on initial call. + /// Actual mechanism used. The OID returned via this parameter will be a pointer to static storage that should be treated as read-only; + /// In particular the application should not attempt to free it. Specify NULL if not required. + /// Token to be sent to peer application. If the length field of the returned buffer is zero, no token need be sent to the peer application. + /// Storage associated with this buffer must be freed by the application after use with a call to gss_release_buffer(). + /// Contains various independent flags, each of which indicates that the context supports a specific service option. + /// Specify NULL if not required. Symbolic names are provided for each flag, and the symbolic names corresponding to the required flags should be + /// logically-ANDed with the ret_flags value to test whether a given option is supported by the context. + /// Number of seconds for which the context will remain valid. If the implementation does not support context expiration, + /// the value GSS_C_INDEFINITE will be returned. Specify NULL if not required. + /// + /// gss_init_sec_context() may return the following status codes: + /// + /// GSS_S_COMPLETE: Successful completion. + /// GSS_S_CONTINUE_NEEDED: A token from the peer application is required to complete the context, and gss_init_sec_context() must be called again with that token. + /// GSS_S_DEFECTIVE_TOKEN: Consistency checks performed on the input_token failed. + /// GSS_S_DEFECTIVE_CREDENTIAL: Consistency checks performed on the credential failed. + /// GSS_S_NO_CRED: The supplied credentials are not valid for context acceptance, or the credential handle does not reference any credentials. + /// GSS_S_CREDENTIALS_EXPIRED: The referenced credentials have expired. + /// GSS_S_BAD_BINDINGS: The input_token contains different channel bindings than those specified by means of the input_chan_bindings parameter. + /// GSS_S_BAD_SIG: The input_token contains an invalid MIC or a MIC that cannot be verified. + /// GSS_S_OLD_TOKEN: The input_token is too old. This is a fatal error while establishing context. + /// GSS_S_DUPLICATE_TOKEN: The input_token is valid, but it is a duplicate of a token already processed.This is a fatal error while establishing context. + /// GSS_S_NO_CONTEXT: The supplied context handle does not refer to a valid context. + /// GSS_S_BAD_NAMETYPE: The provided target_name parameter contains an invalid or unsupported name type. + /// GSS_S_BAD_NAME: The supplied target_name parameter is ill-formed. + /// GSS_S_BAD_MECH: The token received specifies a mechanism that is not supported by the implementation or the provided credential. + /// + internal static uint gss_init_sec_context( + out uint minorStatus, + IntPtr claimantCredHandle, + ref IntPtr contextHandle, + IntPtr targetName, + ref GssOidDescStruct mechType, + uint reqFlags, + uint timeReq, + IntPtr inputChanBindings, + ref GssBufferDescStruct inputToken, + IntPtr actualMechType, + out GssBufferDescStruct outputToken, + IntPtr retFlags, + IntPtr timeRec) + { + return IsWin + ? NativeMethodsWin64.gss_init_sec_context(out minorStatus, claimantCredHandle, ref contextHandle, targetName, + ref mechType, reqFlags, timeReq, inputChanBindings, ref inputToken, actualMechType, + out outputToken, retFlags, timeRec) + : NativeMethodsLinux.gss_init_sec_context(out minorStatus, claimantCredHandle, ref contextHandle, targetName, + ref mechType, reqFlags, timeReq, inputChanBindings, ref inputToken, actualMechType, + out outputToken, retFlags, timeRec); + } + + /// + /// Allows an application to obtain a textual representation of a GSS-API status code, for display to the user or for logging purposes. + /// Since some status values may indicate multiple conditions, applications may need to call gss_display_status multiple times, + /// each call generating a single text string. The message_context parameter is used by gss_display_status to store state information about which + /// error messages have already been extracted from a given status_value; message_context must be initialized to 0 by the application prior to the first call, + /// and gss_display_status will return a non-zero value in this parameter if there are further messages to extract. + /// + /// Mechanism specific status code. + /// Status value to be converted. + /// GSS_C_GSS_CODE - status_value is a GSS status code. GSS_C_MECH_CODE - status_value is a mechanism status code. + /// Underlying mechanism (used to interpret a minor status value). Supply GSS_C_NO_OID to obtain the system default. + /// Should be initialized to zero by the application prior to the first call. + /// On return from gss_display_status(), a non-zero status_value parameter indicates that additional messages may be extracted from the status code via + /// subsequent calls to gss_display_status(), passing the same status_value, status_type, mech_type, and message_context parameters. + /// Textual interpretation of the status_value. Storage associated with this parameter must be freed by the application + /// after use with a call to gss_release_buffer(). + /// + /// gss_display_status() may return the following status codes: + /// GSS_S_COMPLETE: Successful completion. + /// GSS_S_BAD_MECH: Indicates that translation in accordance with an unsupported mechanism type was requested. + /// GSS_S_BAD_STATUS: The status value was not recognized, or the status type was neither GSS_C_GSS_CODE nor GSS_C_MECH_CODE. + /// + internal static uint gss_display_status( + out uint minorStatus, + uint status, + int statusType, + ref GssOidDescStruct mechType, + ref IntPtr messageContext, + ref GssBufferDescStruct statusString) + { + return IsWin + ? NativeMethodsWin64.gss_display_status(out minorStatus, status, statusType, ref mechType, ref messageContext, + ref statusString) + : NativeMethodsLinux.gss_display_status(out minorStatus, status, statusType, ref mechType, ref messageContext, + ref statusString); + } + + /// + /// Allows an application to obtain a textual representation of an opaque internal-form name for display purposes. + /// The syntax of a printable name is defined by the GSS-API implementation. + /// + /// Mechanism specific status code. + /// Name to be displayed. + /// Buffer to receive textual name string. + /// The type of the returned name. + /// + /// gss_display_name() may return the following status codes: + /// GSS_S_COMPLETE: Successful completion. + /// GSS_S_BAD_NAME: input_name was ill-formed. + /// + internal static uint gss_display_name( + out uint minorStatus, + IntPtr inputName, + out GssBufferDescStruct nameBuffer, + out GssOidDescStruct nameType) + { + return IsWin + ? NativeMethodsWin64.gss_display_name(out minorStatus, inputName, out nameBuffer, out nameType) + : NativeMethodsLinux.gss_display_name(out minorStatus, inputName, out nameBuffer, out nameType); + } + + /// + /// Free storage associated with a buffer. The storage must have been allocated by a GSS-API routine. + /// In addition to freeing the associated storage, the routine will zero the length field in the descriptor to which the buffer parameter refers, + /// and implementations are encouraged to additionally set the pointer field in the descriptor to NULL. Any buffer object returned by a GSS-API routine + /// may be passed to gss_release_buffer (even if there is no storage associated with the buffer). + /// + /// Mechanism-specific status code. + /// The storage associated with the buffer will be deleted. The gss_buffer_desc object will not be freed, + /// but its length field will be zeroed. + /// + /// The gss_release_buffer() function may return the following status codes: + /// GSS_S_COMPLETE: Successful completion + /// + internal static uint gss_release_buffer( + out uint minorStatus, + ref GssBufferDescStruct buffer) + { + return IsWin + ? NativeMethodsWin64.gss_release_buffer(out minorStatus, ref buffer) + : NativeMethodsLinux.gss_release_buffer(out minorStatus, ref buffer); + } + + /// + /// Delete a security context. gss_delete_sec_context will delete the local data structures associated with the specified security context, + /// and may generate an output_token, which when passed to the peer gss_process_context_token will instruct it to do likewise. + /// If no token is required by the mechanism, the GSS-API should set the length field of the output_token (if provided) to zero. + /// No further security services may be obtained using the context specified by context_handle. + /// + /// Mechanism specific status code. + /// Context handle identifying context to delete. After deleting the context, + /// the GSS-API will set this context handle to GSS_C_NO_CONTEXT. + /// + /// The gss_delete_sec_context() function may return the following status codes: + /// GSS_S_COMPLETE: Successful completion. + /// GSS_S_NO_CONTEXT: No valid context was supplied. + /// + internal static uint gss_delete_sec_context( + out uint minorStatus, + ref IntPtr contextHandle) + { + return IsWin + ? NativeMethodsWin64.gss_delete_sec_context(out minorStatus, ref contextHandle, Const.GSS_C_NO_BUFFER) + : NativeMethodsLinux.gss_delete_sec_context(out minorStatus, ref contextHandle, Const.GSS_C_NO_BUFFER); + } + + /// + /// Free GSSAPI-allocated storage associated with an internal-form name. The name is set to GSS_C_NO_NAME on successful completion of this call. + /// + /// Mechanism specific status code. + /// The name to be deleted. + /// + /// The gss_release_name() function may return the following status codes: + /// GSS_S_COMPLETE: Successful completion. + /// GSS_S_BAD_NAME: The name parameter did not contain a valid name. + /// + internal static uint gss_release_name( + out uint minorStatus, + ref IntPtr inputName) + { + return IsWin + ? NativeMethodsWin64.gss_release_name(out minorStatus, ref inputName) + : NativeMethodsLinux.gss_release_name(out minorStatus, ref inputName); + } + + /// + /// Informs GSS-API that the specified credential handle is no longer required by the application, and frees associated resources. + /// The cred_handle is set to GSS_C_NO_CREDENTIAL on successful completion of this call. + /// + /// Mechanism specific status code. + /// Opaque handle identifying credential to be released. If GSS_C_NO_CREDENTIAL is supplied, + /// the routine will complete successfully, but will do nothing. + /// + /// The gss_release_cred() function may return the following status codes: + /// GSS_S_COMPLETE: Successful completion. + /// GSS_S_NO_CRED: Credentials could not be accessed. + /// + internal static uint gss_release_cred( + out uint minorStatus, + ref IntPtr credentialHandle) + { + return IsWin + ? NativeMethodsWin64.gss_release_cred(out minorStatus, ref credentialHandle) + : NativeMethodsLinux.gss_release_cred(out minorStatus, ref credentialHandle); + } + + /// + /// Converts a message previously protected by gss_wrap back to a usable form, verifying the embedded MIC. + /// The conf_state parameter indicates whether the message was encrypted; the qop_state parameter indicates the strength of + /// protection that was used to provide the confidentiality and integrity services. + /// + /// Mechanism specific status code. + /// Identifies the context on which the message arrived. + /// Protected message. + /// Buffer to receive unwrapped message. + /// State of the configuration. + /// State of the QoP. + /// + /// The gss_unwrap() function may return the following status codes: + /// GSS_S_COMPLETE: Successful completion. + /// GSS_S_DEFECTIVE_TOKEN: The token failed consistency checks. + /// GSS_S_BAD_SIG: The MIC was incorrect. + /// GSS_S_DUPLICATE_TOKEN: The token was valid, and contained a correct MIC for the message, but it had already been processed. + /// GSS_S_OLD_TOKEN: The token was valid, and contained a correct MIC for the message, but it is too old to check for duplication. + /// GSS_S_UNSEQ_TOKEN: The token was valid, and contained a correct MIC for the message, but has been verified out of sequence; + /// a later token has already been received. + /// GSS_S_GAP_TOKEN: The token was valid, and contained a correct MIC for the message, but has been verified out of sequence; + /// an earlier expected token has not yet been received. + /// GSS_S_CONTEXT_EXPIRED: The context has already expired. + /// GSS_S_NO_CONTEXT: The context_handle parameter did not identify a valid context. + /// + internal static uint gss_unwrap( + out uint minorStatus, + IntPtr contextHandle, + ref GssBufferDescStruct inputMessage, + out GssBufferDescStruct outputMessage, + out int confState, + out uint qopState) + { + return IsWin + ? NativeMethodsWin64.gss_unwrap(out minorStatus, contextHandle, ref inputMessage, out outputMessage, out confState, out qopState) + : NativeMethodsLinux.gss_unwrap(out minorStatus, contextHandle, ref inputMessage, out outputMessage, out confState, out qopState); + } + + /// + /// Attaches a cryptographic MIC and optionally encrypts the specified input_message. The output_message contains both the MIC and the message. + /// The qop_req parameter allows a choice between several cryptographic algorithms, if supported by the chosen mechanism. + /// + /// Mechanism specific status code. + /// Identifies the context on which the message arrived. + /// Message to be protected. + /// Buffer to receive protected message. + /// + /// The gss_unwrap() function may return the following status codes: + /// GSS_S_COMPLETE: Successful completion. + /// GSS_S_CONTEXT_EXPIRED: The context has already expired. + /// GSS_S_NO_CONTEXT: The context_handle parameter did not identify a valid context. + /// GSS_S_BAD_QOP: The specified QOP is not supported by the mechanism. + /// + internal static uint gss_wrap( + out uint minorStatus, + IntPtr contextHandle, + ref GssBufferDescStruct inputMessage, + out GssBufferDescStruct outputMessage) + { + return IsWin + ? NativeMethodsWin64.gss_wrap(out minorStatus, contextHandle, 0, Const.GSS_C_QOP_DEFAULT, ref inputMessage, 0, out outputMessage) + : NativeMethodsLinux.gss_wrap(out minorStatus, contextHandle, 0, Const.GSS_C_QOP_DEFAULT, ref inputMessage, 0, out outputMessage); + } + } +} diff --git a/MySQL.Data/src/Authentication/GSSAPI/Native/NativeMethodsLinux.cs b/MySQL.Data/src/Authentication/GSSAPI/Native/NativeMethodsLinux.cs new file mode 100644 index 000000000..0d8c060e8 --- /dev/null +++ b/MySQL.Data/src/Authentication/GSSAPI/Native/NativeMethodsLinux.cs @@ -0,0 +1,152 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Runtime.InteropServices; + +namespace MySql.Data.Authentication.GSSAPI.Native +{ + /// + /// MIT Kerberos 5 GSS Bindings Linux + /// + internal static class NativeMethodsLinux + { + private const string GSS_MODULE_NAME = "libgssapi_krb5.so.2"; + + [DllImport(GSS_MODULE_NAME, EntryPoint = "gss_import_name")] + internal static extern uint gss_import_name( + out uint minorStatus, + ref GssBufferDescStruct inputNameBuffer, + ref GssOidDescStruct inputNameType, + out IntPtr outputName); + + [DllImport(GSS_MODULE_NAME, EntryPoint = "gss_acquire_cred")] + internal static extern uint gss_acquire_cred( + out uint minorStatus, + IntPtr desiredName, + uint timeRequired, + ref GssOidSetStruct desiredMechanisms, + int credentialUsage, + ref IntPtr credentialHandle, + IntPtr actualMech, + out uint expiryTime); + + [DllImport(GSS_MODULE_NAME, EntryPoint = "gss_acquire_cred_with_password")] + internal static extern uint gss_acquire_cred_with_password( + out uint minorStatus, + IntPtr desiredName, + ref GssBufferDescStruct password, + uint timeRequired, + ref GssOidSetStruct desiredMechanisms, + int credentialUsage, + ref IntPtr credentialHandle, + IntPtr actualMechs, + out uint expiryTime); + + [DllImport(GSS_MODULE_NAME, EntryPoint = "gss_init_sec_context")] + internal static extern uint gss_init_sec_context( + out uint minorStatus, + IntPtr claimantCredHandle, + ref IntPtr contextHandle, + IntPtr targetName, + ref GssOidDescStruct mechType, + uint reqFlags, + uint timeReq, + IntPtr inputChanBindings, + ref GssBufferDescStruct inputToken, + IntPtr actualMechType, + out GssBufferDescStruct outputToken, + IntPtr retFlags, + IntPtr timeRec); + + [DllImport(GSS_MODULE_NAME, EntryPoint = "gss_display_status")] + internal static extern uint gss_display_status( + out uint minorStatus, + uint status, + int statusType, + ref GssOidDescStruct mechType, + ref IntPtr messageContext, + ref GssBufferDescStruct statusString); + + [DllImport(GSS_MODULE_NAME, EntryPoint = "gss_release_buffer")] + internal static extern uint gss_release_buffer( + out uint minorStatus, + ref GssBufferDescStruct buffer); + + [DllImport(GSS_MODULE_NAME, EntryPoint = "gss_release_cred")] + internal static extern uint gss_release_cred( + out uint minorStatus, + ref IntPtr credentialHandle); + + [DllImport(GSS_MODULE_NAME, EntryPoint = "gss_release_name")] + internal static extern uint gss_release_name( + out uint minorStatus, + ref IntPtr inputName); + + [DllImport(GSS_MODULE_NAME, EntryPoint = "gss_delete_sec_context")] + internal static extern uint gss_delete_sec_context( + out uint minorStatus, + ref IntPtr contextHandle, + IntPtr outputToken); + + [DllImport(GSS_MODULE_NAME, EntryPoint = "gss_unwrap")] + internal static extern uint gss_unwrap( + out uint minorStatus, + IntPtr contextHandle, + ref GssBufferDescStruct inputMessage, + out GssBufferDescStruct outputMessage, + out int confState, + out uint qopState); + + [DllImport(GSS_MODULE_NAME, EntryPoint = "gss_wrap")] + internal static extern uint gss_wrap( + out uint minorStatus, + IntPtr contextHandle, + int confReqFlag, + uint qopReq, + ref GssBufferDescStruct inputMessage, + int confState, + out GssBufferDescStruct outputMessage); + + [DllImport(GSS_MODULE_NAME, EntryPoint = "gss_inquire_cred")] + internal static extern uint gss_inquire_cred( + out uint minorStatus, + IntPtr credentialHandle, + out IntPtr name, + out uint lifetime, + out int credentialUsage, + out IntPtr mechs); + + [DllImport(GSS_MODULE_NAME, EntryPoint = "gss_display_name")] + internal static extern uint gss_display_name( + out uint minorStatus, + IntPtr inputName, + out GssBufferDescStruct NameBuffer, + out GssOidDescStruct nameType); + } +} diff --git a/MySQL.Data/src/Authentication/GSSAPI/Native/NativeMethodsWin64.cs b/MySQL.Data/src/Authentication/GSSAPI/Native/NativeMethodsWin64.cs new file mode 100644 index 000000000..0615eae73 --- /dev/null +++ b/MySQL.Data/src/Authentication/GSSAPI/Native/NativeMethodsWin64.cs @@ -0,0 +1,152 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Runtime.InteropServices; + +namespace MySql.Data.Authentication.GSSAPI.Native +{ + /// + /// MIT Kerberos 5 GSS Bindings Windows 64bit + /// + internal static class NativeMethodsWin64 + { + private const string GSS_MODULE_NAME = "gssapi64.dll"; + + [DllImport(GSS_MODULE_NAME, EntryPoint = "gss_import_name")] + internal static extern uint gss_import_name( + out uint minorStatus, + ref GssBufferDescStruct inputNameBuffer, + ref GssOidDescStruct inputNameType, + out IntPtr outputName); + + [DllImport(GSS_MODULE_NAME, EntryPoint = "gss_acquire_cred")] + internal static extern uint gss_acquire_cred( + out uint minorStatus, + IntPtr desiredName, + uint timeRequired, + ref GssOidSetStruct desiredMechanisms, + int credentialUsage, + ref IntPtr credentialHandle, + IntPtr actualMech, + out uint expiryTime); + + [DllImport(GSS_MODULE_NAME, EntryPoint = "gss_acquire_cred_with_password")] + internal static extern uint gss_acquire_cred_with_password( + out uint minorStatus, + IntPtr desiredName, + ref GssBufferDescStruct password, + uint timeRequired, + ref GssOidSetStruct desiredMechanisms, + int credentialUsage, + ref IntPtr credentialHandle, + IntPtr actualMechs, + out uint expiryTime); + + [DllImport(GSS_MODULE_NAME, EntryPoint = "gss_init_sec_context")] + internal static extern uint gss_init_sec_context( + out uint minorStatus, + IntPtr claimantCredHandle, + ref IntPtr contextHandle, + IntPtr targetName, + ref GssOidDescStruct mechType, + uint reqFlags, + uint timeReq, + IntPtr inputChanBindings, + ref GssBufferDescStruct inputToken, + IntPtr actualMechType, + out GssBufferDescStruct outputToken, + IntPtr retFlags, + IntPtr timeRec); + + [DllImport(GSS_MODULE_NAME, EntryPoint = "gss_display_status")] + internal static extern uint gss_display_status( + out uint minorStatus, + uint status, + int statusType, + ref GssOidDescStruct mechType, + ref IntPtr messageContext, + ref GssBufferDescStruct statusString); + + [DllImport(GSS_MODULE_NAME, EntryPoint = "gss_release_buffer")] + internal static extern uint gss_release_buffer( + out uint minorStatus, + ref GssBufferDescStruct buffer); + + [DllImport(GSS_MODULE_NAME, EntryPoint = "gss_release_cred")] + internal static extern uint gss_release_cred( + out uint minorStatus, + ref IntPtr credentialHandle); + + [DllImport(GSS_MODULE_NAME, EntryPoint = "gss_release_name")] + internal static extern uint gss_release_name( + out uint minorStatus, + ref IntPtr inputName); + + [DllImport(GSS_MODULE_NAME, EntryPoint = "gss_delete_sec_context")] + internal static extern uint gss_delete_sec_context( + out uint minorStatus, + ref IntPtr contextHandle, + IntPtr outputToken); + + [DllImport(GSS_MODULE_NAME, EntryPoint = "gss_unwrap")] + internal static extern uint gss_unwrap( + out uint minorStatus, + IntPtr contextHandle, + ref GssBufferDescStruct inputMessage, + out GssBufferDescStruct outputMessage, + out int confState, + out uint qopState); + + [DllImport(GSS_MODULE_NAME, EntryPoint = "gss_wrap")] + internal static extern uint gss_wrap( + out uint minorStatus, + IntPtr contextHandle, + int confReqFlag, + uint qopReq, + ref GssBufferDescStruct inputMessage, + int confState, + out GssBufferDescStruct outputMessage); + + [DllImport(GSS_MODULE_NAME, EntryPoint = "gss_inquire_cred")] + internal static extern uint gss_inquire_cred( + out uint minorStatus, + IntPtr credentialHandle, + out IntPtr name, + out uint lifetime, + out int credentialUsage, + out IntPtr mechs); + + [DllImport(GSS_MODULE_NAME, EntryPoint = "gss_display_name")] + internal static extern uint gss_display_name( + out uint minorStatus, + IntPtr inputName, + out GssBufferDescStruct NameBuffer, + out GssOidDescStruct nameType); + } +} diff --git a/MySQL.Data/src/Authentication/GSSAPI/Utility/Disposable.cs b/MySQL.Data/src/Authentication/GSSAPI/Utility/Disposable.cs new file mode 100644 index 000000000..45274babe --- /dev/null +++ b/MySQL.Data/src/Authentication/GSSAPI/Utility/Disposable.cs @@ -0,0 +1,120 @@ +// Copyright © 2020, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; + +namespace MySql.Data.Authentication.GSSAPI.Utility +{ + /// + /// Automatic dynamic disposable + /// + internal static class Disposable + { + /// + /// Automatic dynamic disposable storing + /// + public static Disposable From(T value) => + From(value, (IDisposable[])null, (Action)null); + + /// + /// Automatic dynamic disposable storing , will be called at dispose + /// + public static Disposable From(T value, Action disposeAction) => + From(value, null, disposeAction); + + /// + /// Automatic dynamic disposable storing , will be disposed + /// + public static Disposable From(D disposable, Func loader) where D : IDisposable => + From(loader(disposable), disposable); + /// + /// Automatic dynamic disposable storing , will be disposed + /// + public static Disposable From(D disposable, Func loader, Action disposer) where D : IDisposable => + From(loader(disposable), disposable); + + /// + /// Automatic dynamic disposable storing , will be disposed + /// + public static Disposable From(T value, params IDisposable[] disposables) => + From(value, disposables, null); + + /// + /// Automatic dynamic disposable storing , will be disposed and will be called at dispose + /// + public static Disposable From(T value, IDisposable[] disposables, Action disposeAction) => + new Disposable(value, disposables, disposeAction); + } + + /// + /// Automatic dynamic disposable + /// + internal sealed class Disposable : IDisposable + { + /// + /// Original value, can be used with ref + /// + public T Value; + + private readonly IDisposable[] _disposables; + private readonly Action _disposeAction; + + /// + /// Automatic dynamic disposable storing , will be disposed and will be called at dispose + /// + public Disposable(T value, IDisposable[] disposables, Action disposeAction) + { + Value = value; + _disposables = disposables; + _disposeAction = disposeAction; + } + + /// + /// Returns stored value + /// + public static implicit operator T(Disposable p) + { + return p.Value; + } + + private bool _disposed = false; + + public void Dispose() + { + if (_disposed) + return; + _disposed = true; + + if (_disposables != null) + foreach (var t in _disposables) + t?.Dispose(); + + _disposeAction?.Invoke(); + } + } +} diff --git a/MySQL.Data/src/Authentication/GSSAPI/Utility/ExceptionMessages.cs b/MySQL.Data/src/Authentication/GSSAPI/Utility/ExceptionMessages.cs new file mode 100644 index 000000000..c0947f76c --- /dev/null +++ b/MySQL.Data/src/Authentication/GSSAPI/Utility/ExceptionMessages.cs @@ -0,0 +1,68 @@ +// Copyright © 2020, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Runtime.InteropServices; +using MySql.Data.Authentication.GSSAPI.Native; + +namespace MySql.Data.Authentication.GSSAPI.Utility +{ + internal static class ExceptionMessages + { + private const int GssCGssCode = 1; + private const int GssCMechCode = 2; + + internal static string FormatGssMessage(string message, uint majorStatus, uint minorStatus, GssOidDescStruct oid) + { + var majorMessage = TranslateMajorStatusCode(majorStatus); + var minorMessage = TranslateMinorStatusCode(minorStatus, oid); + return $"{message}{Environment.NewLine}" + + $"GSS Major: ({majorStatus:x8}) {majorMessage}{Environment.NewLine}" + + $"GSS Minor: ({minorStatus:x8}) {minorMessage}"; + } + + private static string TranslateMajorStatusCode(uint status) + { + var context = IntPtr.Zero; + var buffer = default(GssBufferDescStruct); + var oid = default(GssOidDescStruct); + + NativeMethods.gss_display_status(out var _, status, GssCGssCode, ref oid, ref context, ref buffer); + return buffer.value == IntPtr.Zero ? string.Empty : Marshal.PtrToStringAnsi(buffer.value); + } + + private static string TranslateMinorStatusCode(uint status, GssOidDescStruct oid) + { + var context = IntPtr.Zero; + var buffer = default(GssBufferDescStruct); + + NativeMethods.gss_display_status(out var _, status, GssCMechCode, ref oid, ref context, ref buffer); + return buffer.value == IntPtr.Zero ? string.Empty : Marshal.PtrToStringAnsi(buffer.value); + } + } +} diff --git a/MySQL.Data/src/Authentication/GSSAPI/Utility/GssType.cs b/MySQL.Data/src/Authentication/GSSAPI/Utility/GssType.cs new file mode 100644 index 000000000..49943759f --- /dev/null +++ b/MySQL.Data/src/Authentication/GSSAPI/Utility/GssType.cs @@ -0,0 +1,56 @@ +// Copyright © 2020, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Authentication.GSSAPI.Native; +using MySql.Data.MySqlClient; +using System.Text; + +namespace MySql.Data.Authentication.GSSAPI.Utility +{ + internal static class GssType + { + private static readonly Encoding Iso = Encoding.GetEncoding("iso-8859-1"); + + internal static Disposable GetBufferFromString(string buffer) => + GetBufferFromBytes(Iso.GetBytes(buffer)); + + public static Disposable GetBufferFromBytes(byte[] buffer) => + Disposable.From( + Pinned.From(buffer), p => new GssBufferDescStruct + { + length = (uint)p.Value.Length, + value = p.Address + }, p => + { + var majorStatus = NativeMethods.gss_release_buffer(out var minorStatus, ref p); + if (majorStatus != Const.GSS_S_COMPLETE) + throw new MySqlException(ExceptionMessages.FormatGssMessage("GSSAPI: An error occurred releasing a buffer.", + majorStatus, minorStatus, Const.GSS_C_NO_OID)); + }); + } +} diff --git a/MySQL.Data/src/Authentication/GSSAPI/Utility/KerberosConfig.cs b/MySQL.Data/src/Authentication/GSSAPI/Utility/KerberosConfig.cs new file mode 100644 index 000000000..6d86220e6 --- /dev/null +++ b/MySQL.Data/src/Authentication/GSSAPI/Utility/KerberosConfig.cs @@ -0,0 +1,228 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace MySql.Data.Authentication.GSSAPI.Utility +{ + /// + /// Gets the Kerberos configuration from the "krb5.conf/krb5.ini" file + /// + internal class KerberosConfig + { + private const string KRBCONFIG_LINUX = @"/etc/krb5.conf"; + + private const char COMMENT_HASH = '#'; + private const char COMMENT_SEMI = ';'; + private const char SECTION_OPEN = '['; + private const char SECTION_CLOSE = ']'; + private const char GROUP_OPEN = '{'; + private const char GROUP_CLOSE = '}'; + private static readonly char[] Equal = new char[] { '=' }; + + static List> LibDefaults = new List>(); + static List> Realms = new List>(); + static List> AppDefaults = new List>(); + + private const string SERVICE_NAME = "ldap/"; + private static string Domain; + + private static void ReadConfig() + { + StringReader reader; + + // Tries to get Kerberos configuration file path from environment variables, otherwise + // set the default path. + string krbConfigPath = Environment.GetEnvironmentVariable("KRB5_CONFIG"); + + if (string.IsNullOrEmpty(krbConfigPath)) + krbConfigPath = KRBCONFIG_LINUX; + + if (File.Exists(krbConfigPath)) + { + try { reader = new StringReader(File.ReadAllText(krbConfigPath)); } + catch { throw new MySqlException("Unable to read Kerberos configuration file."); } + } + else + throw new MySqlException("Kerberos configuration file is missing."); + + while (TryReadLine(reader, out string currentLine)) + { + if (CanSkip(currentLine)) + continue; + + while (IsSectionLine(currentLine)) + currentLine = ReadSection(currentLine, reader); + } + } + + internal static string GetServicePrincipalName(string username) + { + Domain = SplitUserNameDomain(username); + ReadConfig(); + + string kdc; + + // Try to obtain the LDAP server hostname from AppDefaults section first then on the Realms section + try { kdc = AppDefaults.First(e => e.Key == "ldap_server_host").Value.Trim().Replace("\"", string.Empty).ToLowerInvariant(); } + catch { kdc = Realms.First(e => e.Key == "kdc").Value.Trim().ToLowerInvariant(); } + + if (kdc.IndexOf('.') > 0) + kdc = kdc.Substring(0, kdc.IndexOf('.')).ToLowerInvariant(); + + return SERVICE_NAME + kdc; + } + + private static string SplitUserNameDomain(string original) + { + if (string.IsNullOrWhiteSpace(original)) + throw new InvalidOperationException("Username cannot be an empty string."); + + var index = original.IndexOf('@'); + string domain; + + if (index == 0) + throw new InvalidOperationException("Domain cannot be an empty string."); + else + domain = original.Substring(index + 1, original.Length - index - 1); + + return domain; + } + + #region ReadConfigFile + private static bool TryReadLine(StringReader reader, out string currentLine) + { + currentLine = reader.ReadLine(); + + if (currentLine == null) + return false; + + for (var i = 0; i < currentLine.Length; i++) + { + if (IsComment(currentLine[i])) + { + currentLine = currentLine.Substring(0, i); + break; + } + } + + currentLine = currentLine.Trim().Trim('\uFEFF', '\u200B'); + + return true; + } + + private static bool IsComment(char ch) + { + return ch.Equals(COMMENT_HASH) || ch.Equals(COMMENT_SEMI); + } + + private static bool CanSkip(string trimmed) + { + if (trimmed.Length == 0) + return true; + + return IsComment(trimmed[0]); + } + + private static bool IsSectionLine(string currentLine) + { + if (string.IsNullOrWhiteSpace(currentLine)) + return false; + + return currentLine[0] == SECTION_OPEN && currentLine[currentLine.Length - 1] == SECTION_CLOSE; + } + + private static string ReadSection(string currentLine, StringReader reader) + { + string name = currentLine.Substring(1, currentLine.Length - 2).ToLower(); + + while (TryReadLine(reader, out currentLine)) + { + if (CanSkip(currentLine)) + continue; + + if (currentLine[0] == SECTION_OPEN) + break; + + switch (name) + { + case "libdefaults": + ReadValue(currentLine, reader, LibDefaults); + break; + case "realms": + ReadValue(currentLine, reader, Realms); + break; + case "appdefaults": + ReadValue(currentLine, reader, AppDefaults); + break; + } + } + + return currentLine; + } + + private static void ReadValue(string currentLine, StringReader reader, List> section) + { + if (currentLine.IndexOf(GROUP_OPEN) >= 0) + ReadValues(currentLine, reader, section); + else + { + var split = currentLine.Split(Equal, 2); + + if (split.Length == 2) + section.Add(new KeyValuePair(split[0].Trim(), split[1].Trim())); + } + } + + private static void ReadValues(string currentLine, StringReader reader, List> section) + { + var split = currentLine.Split(Equal, 2); + + if (split.Length != 2) + return; + + while (TryReadLine(reader, out currentLine)) + { + if (CanSkip(currentLine)) + continue; + + if (currentLine[0] == GROUP_CLOSE) + break; + + if (split[0].Trim().Equals(Domain, StringComparison.OrdinalIgnoreCase) + || split[0].Trim().Equals("mysql", StringComparison.OrdinalIgnoreCase)) + ReadValue(currentLine, reader, section); + } + } + #endregion + } +} diff --git a/MySQL.Data/src/Authentication/GSSAPI/Utility/Pinned.cs b/MySQL.Data/src/Authentication/GSSAPI/Utility/Pinned.cs new file mode 100644 index 000000000..ebfad7e84 --- /dev/null +++ b/MySQL.Data/src/Authentication/GSSAPI/Utility/Pinned.cs @@ -0,0 +1,98 @@ +// Copyright © 2020, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Runtime.InteropServices; + +namespace MySql.Data.Authentication.GSSAPI.Utility +{ + /// + /// Memory pinned object + /// + internal static class Pinned + { + /// + /// Create memory pinned object from + /// + /// Any class type + /// Value to pin + /// Pinned value + internal static Pinned From(T value) where T : class => new Pinned(value); + } + + /// + /// Memory pinned object + /// + /// Any class type + internal sealed class Pinned : IDisposable where T : class + { + /// + /// Original object value, can be used with ref + /// + internal readonly T Value; + + /// + /// In memory address of the object + /// + internal IntPtr Address { get; } + + private GCHandle _handle; + + /// + /// Create memory pinned object from + /// + /// Value to pin + internal Pinned(T value) + { + Value = value; + _handle = GCHandle.Alloc(value, GCHandleType.Pinned); + Address = _handle.AddrOfPinnedObject(); + } + + /// + /// Returns address of object in memory + /// + public static implicit operator IntPtr(Pinned p) + { + return p.Address; + } + + /// + /// Returns original object value + /// + public static implicit operator T(Pinned p) + { + return p.Value; + } + + public void Dispose() + { + _handle.Free(); + } + } +} diff --git a/MySQL.Data/src/Authentication/KerberosAuthenticationPlugin.cs b/MySQL.Data/src/Authentication/KerberosAuthenticationPlugin.cs new file mode 100644 index 000000000..57b30c6d4 --- /dev/null +++ b/MySQL.Data/src/Authentication/KerberosAuthenticationPlugin.cs @@ -0,0 +1,144 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Authentication.GSSAPI; +using MySql.Data.Authentication.SSPI; +using System; +using System.Text; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient.Authentication +{ + /// + /// Enables connections to a user account set with the authentication_kerberos authentication plugin. + /// + internal class KerberosAuthenticationPlugin : MySqlAuthenticationPlugin + { + private const string PACKAGE = "Kerberos"; + public override string PluginName => "authentication_kerberos_client"; + protected string Username { get; private set; } + protected string Password => GetMFAPassword(); + private string _servicePrincipal; + private string _realm; + private GssapiMechanism _gssapiMechanism; + private SspiSecurityContext _sspiSecurityContext; + + protected override void SetAuthData(byte[] data) + { + Username = GetUsername(); + + //Protocol::AuthSwitchRequest plugin data contains: + // int<2> SPN string length + // string SPN string + // int<2> User Principal Name realm string length + // string User Principal Name realm string + short servicePrincipalNameLength = BitConverter.ToInt16(data, 0); + if (servicePrincipalNameLength > data.Length) return; // not an AuthSwitchRequest + _servicePrincipal = Encoding.GetString(data, 2, servicePrincipalNameLength); + short userPrincipalRealmLength = BitConverter.ToInt16(data, servicePrincipalNameLength + 2); + _realm = Encoding.GetString(data, servicePrincipalNameLength + 4, userPrincipalRealmLength); + } + + public override string GetUsername() + { + Username = string.IsNullOrWhiteSpace(Username) ? Settings.UserID : Username; + + if (string.IsNullOrWhiteSpace(Username)) + { + if (Settings.KerberosAuthMode == KerberosAuthMode.GSSAPI) + { + try + { + // Try to obtain the user name from a cached TGT + Username = new GssCredentials().UserName.Trim(); + } + catch (Exception) + { + // Fall-back to system login user + Username = base.GetUsername(); + } + } + else + { + // Use system login user + Username = base.GetUsername(); + } + } + else + { + // If no password is provided, MySQL user and Windows logged-in user should match for SSPI mode + if (Settings.KerberosAuthMode == KerberosAuthMode.SSPI && string.IsNullOrWhiteSpace(Password) && Username != Environment.UserName) + throw new MySqlException(string.Format(Resources.UnmatchedWinUserAndMySqlUser, Username, Environment.UserName)); + } + + int posAt = Username.IndexOf('@'); + return posAt < 0 ? Username : Username.Substring(0, posAt); + } + + protected override Task MoreDataAsync(byte[] data, bool execAsync) + { + if (Settings.KerberosAuthMode == KerberosAuthMode.GSSAPI) + return Task.FromResult(GssapiMode(data)); + else + return Task.FromResult(SspiMode(data)); + } + + private byte[] SspiMode(byte[] data) + { + if (_sspiSecurityContext == null) + { + string upn = $"{Username}@{_realm}"; + var sspiCreds = string.IsNullOrWhiteSpace(Password) ? new SspiCredentials(PACKAGE) : new SspiCredentials(_servicePrincipal, upn, Password, _realm, PACKAGE); + _sspiSecurityContext = new SspiSecurityContext(sspiCreds); + } + + var status = _sspiSecurityContext.InitializeSecurityContext(out byte[] clientBlob, data, _servicePrincipal); + + if (clientBlob.Length == 0 && status == ContextStatus.Accepted) + return null; + + return clientBlob; + } + + private byte[] GssapiMode(byte[] data) + { + if (_gssapiMechanism == null) + { + string upn = $"{Username}@{_realm}"; + _gssapiMechanism = new GssapiMechanism(upn, Password, _servicePrincipal); + } + + var response = _gssapiMechanism.Challenge(data); + + if (response.Length == 0 && _gssapiMechanism.gssContext.IsEstablished) + return null; + + return response; + } + } +} diff --git a/MySQL.Data/src/Authentication/MySQLAuthenticationPlugin.cs b/MySQL.Data/src/Authentication/MySQLAuthenticationPlugin.cs new file mode 100644 index 000000000..48b2d38cc --- /dev/null +++ b/MySQL.Data/src/Authentication/MySQLAuthenticationPlugin.cs @@ -0,0 +1,343 @@ +// Copyright © 2012, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Diagnostics; +using System.Text; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient.Authentication +{ + /// + /// Defines the default behavior for an authentication plugin. + /// + public abstract class MySqlAuthenticationPlugin + { + internal NativeDriver _driver; + + /// + /// Handles the iteration of the multifactor authentication. + /// + private int _mfaIteration = 1; + + /// + /// Gets the AuthPlugin name of the AuthSwitchRequest. + /// + internal string SwitchedPlugin { get; private set; } + + /// + /// Gets or sets the authentication data returned by the server. + /// + protected byte[] AuthenticationData; + + /// + /// This is a factory method that is used only internally. It creates an auth plugin based on the method type + /// + /// Authentication method. + /// The driver. + /// The authentication data. + /// Boolean that indicates if the function will be executed asynchronously. + /// MultiFactorAuthentication iteration. + /// + internal static async Task GetPluginAsync(string method, NativeDriver driver, byte[] authData, bool execAsync, int mfaIteration = 1) + { + if (method == "mysql_old_password") + { + await driver.CloseAsync(true, execAsync).ConfigureAwait(false); + throw new MySqlException(Resources.OldPasswordsNotSupported); + } + MySqlAuthenticationPlugin plugin = AuthenticationPluginManager.GetPlugin(method); + if (plugin == null) + throw new MySqlException(String.Format(Resources.UnknownAuthenticationMethod, method)); + + plugin._driver = driver; + plugin._mfaIteration = mfaIteration; + plugin.SetAuthData(authData); + return plugin; + } + + /// + /// Gets the connection option settings. + /// + protected MySqlConnectionStringBuilder Settings => _driver.Settings; + + /// + /// Gets the server version associated with this authentication plugin. + /// + protected Version ServerVersion => new Version(_driver.Version.Major, _driver.Version.Minor, _driver.Version.Build); + + internal ClientFlags Flags => _driver.Flags; + + /// + /// Gets the encoding assigned to the native driver. + /// + protected Encoding Encoding => _driver.Encoding; + + /// + /// Sets the authentication data required to encode, encrypt, or convert the password of the user. + /// + /// A byte array containing the authentication data provided by the server. + /// This method may be overriden based on the requirements by the implementing authentication plugin. + protected virtual void SetAuthData(byte[] data) + { + AuthenticationData = data; + } + + /// + /// Defines the behavior when checking for constraints. + /// + /// This method is intended to be overriden. + protected virtual void CheckConstraints() + { + } + + /// + /// Throws a that encapsulates the original exception. + /// + /// The exception to encapsulate. + protected virtual void AuthenticationFailed(MySqlException ex) + { + string msg = String.Format(Resources.AuthenticationFailed, Settings.Server, GetUsername(), PluginName, ex.Message); + throw new MySqlException(msg, ex.Number, ex); + } + + /// + /// Defines the behavior when authentication is successful. + /// + /// This method is intended to be overriden. + protected virtual void AuthenticationSuccessful() + { + } + + /// + /// Defines the behavior when more data is required from the server. + /// + /// The data returned by the server. + /// Boolean that indicates if the function will be executed asynchronously. + /// The data to return to the server. + /// This method is intended to be overriden. + protected virtual Task MoreDataAsync(byte[] data, bool execAsync) + { + return Task.FromResult(null); + } + + internal async Task AuthenticateAsync(bool reset, bool execAsync) + { + CheckConstraints(); + + MySqlPacket packet = _driver.Packet; + + // send auth response + await packet.WriteStringAsync(GetUsername(), execAsync).ConfigureAwait(false); + + // now write the password + await WritePasswordAsync(packet, execAsync).ConfigureAwait(false); + + if ((Flags & ClientFlags.CONNECT_WITH_DB) != 0 || reset) + { + if (!String.IsNullOrEmpty(Settings.Database)) + await packet.WriteStringAsync(Settings.Database, execAsync).ConfigureAwait(false); + } + + if (reset) + await packet.WriteIntegerAsync(8, 2, execAsync).ConfigureAwait(false); + + if ((Flags & ClientFlags.PLUGIN_AUTH) != 0) + await packet.WriteStringAsync(PluginName, execAsync).ConfigureAwait(false); + + await _driver.SetConnectAttrsAsync(execAsync).ConfigureAwait(false); + await _driver.SendPacketAsync(packet, execAsync).ConfigureAwait(false); + + // Read server response. + packet = await ReadPacketAsync(execAsync).ConfigureAwait(false); + byte[] b = packet.Buffer; + + if (PluginName == "caching_sha2_password" && b[0] == 0x01) + { + // React to the authentication type set by server: FAST, FULL. + await ContinueAuthenticationAsync(execAsync, new byte[] { b[1] }).ConfigureAwait(false); + } + + // Auth switch request Protocol::AuthSwitchRequest. + if (b[0] == 0xfe) + { + if (packet.IsLastPacket) + { + await _driver.CloseAsync(true, execAsync).ConfigureAwait(false); + throw new MySqlException(Resources.OldPasswordsNotSupported); + } + else + { + await HandleAuthChangeAsync(packet, execAsync).ConfigureAwait(false); + } + } + + // Auth request Protocol::AuthNextFactor. + while (packet.Buffer[0] == 0x02) + { + ++_mfaIteration; + await HandleMFAAsync(packet, execAsync).ConfigureAwait(false); + } + + await _driver.ReadOkAsync(false, execAsync).ConfigureAwait(false); + + AuthenticationSuccessful(); + } + + private async Task WritePasswordAsync(MySqlPacket packet, bool execAsync) + { + bool secure = (Flags & ClientFlags.SECURE_CONNECTION) != 0; + object password = GetPassword(); + if (password is string) + { + if (secure) + await packet.WriteLenStringAsync((string)password, execAsync).ConfigureAwait(false); + else + await packet.WriteStringAsync((string)password, execAsync).ConfigureAwait(false); + } + else if (password == null) + packet.WriteByte(0); + else if (password is byte[]) + await packet.WriteAsync(password as byte[], execAsync).ConfigureAwait(false); + else throw new MySqlException("Unexpected password format: " + password.GetType()); + } + + internal async Task ReadPacketAsync(bool execAsync) + { + try + { + MySqlPacket p = await _driver.ReadPacketAsync(execAsync).ConfigureAwait(false); + return p; + } + catch (MySqlException ex) + { + // Make sure this is an auth failed ex + AuthenticationFailed(ex); + return null; + } + } + + private async Task HandleMFAAsync(MySqlPacket packet, bool execAsync) + { + byte b = packet.ReadByte(); + Debug.Assert(b == 0x02); + + var nextPlugin = await NextPluginAsync(packet, execAsync).ConfigureAwait(false); + nextPlugin.CheckConstraints(); + await nextPlugin.ContinueAuthenticationAsync(execAsync).ConfigureAwait(false); + } + + private async Task HandleAuthChangeAsync(MySqlPacket packet, bool execAsync) + { + byte b = packet.ReadByte(); + Debug.Assert(b == 0xfe); + + var nextPlugin = await NextPluginAsync(packet, execAsync).ConfigureAwait(false); + nextPlugin.CheckConstraints(); + await nextPlugin.ContinueAuthenticationAsync(execAsync).ConfigureAwait(false); + } + + private async Task NextPluginAsync(MySqlPacket packet, bool execAsync) + { + string method = packet.ReadString(); + SwitchedPlugin = method; + byte[] authData = new byte[packet.Length - packet.Position]; + Array.Copy(packet.Buffer, packet.Position, authData, 0, authData.Length); + + MySqlAuthenticationPlugin plugin = await GetPluginAsync(method, _driver, authData, execAsync, _mfaIteration).ConfigureAwait(false); + return plugin; + } + + private async Task ContinueAuthenticationAsync(bool execAsync, byte[] data = null) + { + MySqlPacket packet = _driver.Packet; + packet.Clear(); + + byte[] moreData = await MoreDataAsync(data, execAsync).ConfigureAwait(false); + + while (moreData != null) + { + packet.Clear(); + await packet.WriteAsync(moreData, execAsync).ConfigureAwait(false); + await _driver.SendPacketAsync(packet, execAsync).ConfigureAwait(false); + + packet = await ReadPacketAsync(execAsync).ConfigureAwait(false); + byte prefixByte = packet.Buffer[0]; + if (prefixByte != 1) return; + + // A prefix of 0x01 means need more auth data. + byte[] responseData = new byte[packet.Length - 1]; + Array.Copy(packet.Buffer, 1, responseData, 0, responseData.Length); + moreData = await MoreDataAsync(responseData, execAsync).ConfigureAwait(false); + } + // We get here if MoreData returned null but the last packet read was a more data packet. + await ReadPacketAsync(execAsync).ConfigureAwait(false); + } + + /// + /// Gets the password for the iteration of the multifactor authentication + /// + /// A password + protected string GetMFAPassword() + { + switch (_mfaIteration) + { + case 2: + return Settings.Password2; + case 3: + return Settings.Password3; + default: + return Settings.Password; + } + } + + /// + /// Gets the plugin name based on the authentication plugin type defined during the creation of this object. + /// + public abstract string PluginName { get; } + + /// + /// Gets the user name associated to the connection settings. + /// + /// The user name associated to the connection settings. + public virtual string GetUsername() + { + return !string.IsNullOrWhiteSpace(Settings.UserID) ? Settings.UserID : Environment.UserName; + } + + /// + /// Gets the encoded, encrypted, or converted password based on the authentication plugin type defined during the creation of this object. + /// This method is intended to be overriden. + /// + /// An object containing the encoded, encrypted, or converted password. + public virtual object GetPassword() + { + return null; + } + } +} diff --git a/MySQL.Data/src/Authentication/MySqlPemReader.cs b/MySQL.Data/src/Authentication/MySqlPemReader.cs new file mode 100644 index 000000000..e89272f0e --- /dev/null +++ b/MySQL.Data/src/Authentication/MySqlPemReader.cs @@ -0,0 +1,234 @@ +// Copyright © 2017, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Security.Cryptography; +using System.Text; + +namespace MySql.Data.MySqlClient.Authentication +{ + /// + /// Provides functionality to read, decode and convert PEM files to objects supported in .NET. + /// + public class MySqlPemReader + { + /// + /// Converts the binary data of a PEM file to an object. + /// + /// A binary representation of the public key provided by the server. + /// An object containing the data found in the public key. + public static RSACryptoServiceProvider ConvertPemToRSAProvider(byte[] rawPublicKey) + { + byte[] decodedKey = DecodeOpenSslKey(rawPublicKey); + return DecodeX509Key(decodedKey); + } + + static RSACryptoServiceProvider DecodeX509Key(byte[] key) + { + if (key == null) return null; + + byte[] oidSequence = { 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01, 0x05, 0x00 }; + using (var memoryStream = new MemoryStream(key)) + { + using (var reader = new BinaryReader(memoryStream)) + { + try + { + var bytes = reader.ReadUInt16(); + switch (bytes) + { + case 0x8130: + reader.ReadByte(); + break; + case 0x8230: + reader.ReadInt16(); + break; + default: + return null; + } + + var sequence = reader.ReadBytes(15); + + // Compare arrays. + bool arraysAreEqual = true; + if (sequence.Length == oidSequence.Length) + { + for (int i = 0; i < oidSequence.Length; i++) + if (sequence[i] != oidSequence[i]) + { + arraysAreEqual = false; + } + } + + if (!arraysAreEqual) return null; + + bytes = reader.ReadUInt16(); + if (bytes == 0x8103) reader.ReadByte(); + else if (bytes == 0x8203) reader.ReadInt16(); + else return null; + + if (reader.ReadByte() != 0x00) return null; + + bytes = reader.ReadUInt16(); + if (bytes == 0x8130) reader.ReadByte(); + else if (bytes == 0x8230) reader.ReadInt16(); + else return null; + + bytes = reader.ReadUInt16(); + byte lowByte = 0x00; + byte highByte = 0x00; + if (bytes == 0x8102) lowByte = reader.ReadByte(); + else if (bytes == 0x8202) + { + highByte = reader.ReadByte(); + lowByte = reader.ReadByte(); + } + else return null; + + int modulusSize = highByte << 8 | lowByte; + byte firstByte = reader.ReadByte(); + reader.BaseStream.Seek(-1, SeekOrigin.Current); + + if (firstByte == 0x00) + { + reader.ReadByte(); + modulusSize -= 1; + } + + // Read modulus. + byte[] modulus = reader.ReadBytes(modulusSize); + if (reader.ReadByte() != 0x02) return null; + + // Read exponent. + byte[] exponent = reader.ReadBytes(reader.ReadByte()); + RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); + RSAParameters rsaKeyInfo = new RSAParameters + { + Modulus = modulus, + Exponent = exponent + }; + rsa.ImportParameters(rsaKeyInfo); + return rsa; + } + catch (Exception) + { + return null; + } + } + } + } + + static byte[] DecodeOpenSslKey(byte[] rawPublicKey) + { + if (rawPublicKey == null) return null; + + // Remove line breaks and carriage returns. + rawPublicKey = rawPublicKey.Where(b => b != 0x0D).ToArray(); + rawPublicKey = rawPublicKey.Where(b => b != 0x0A).ToArray(); + + // Trim. + rawPublicKey = TrimByteArray(rawPublicKey); + + // Remove header and footer + byte[] headerSequence = { 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20, 0x50, 0x55, 0x42, 0x4C, 0x49, 0x43, 0x20, 0x4B, 0x45, 0x59, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D }; + byte[] footerSequence = { 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x50, 0x55, 0x42, 0x4C, 0x49, 0x43, 0x20, 0x4B, 0x45, 0x59, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D }; + if (!StartsWith(rawPublicKey, headerSequence) || !EndsWith(rawPublicKey, footerSequence)) return null; + byte[] formattedRawPublicKey = new byte[rawPublicKey.Length - headerSequence.Length - footerSequence.Length]; + Array.Copy(rawPublicKey, headerSequence.Length, formattedRawPublicKey, 0, formattedRawPublicKey.Length); + byte[] binaryKey; + + try + { + binaryKey = Convert.FromBase64String(Encoding.Default.GetString(formattedRawPublicKey)); + } + catch (FormatException) + { + return null; + } + + return binaryKey; + } + + private static byte[] TrimByteArray(byte[] array) + { + List trimmedArray = new List(); + bool startCopying = false; + + foreach (var item in array) + { + if (!startCopying) + { + if (item == 0x20) continue; + else startCopying = true; + } + + trimmedArray.Add(item); + } + array = trimmedArray.ToArray(); + trimmedArray = new List(); + + for (int i = array.Length - 1; i >= 0; i--) + { + if (!startCopying) + { + if (array[i] == 0x20) continue; + else startCopying = true; + } + + trimmedArray.Add(array[i]); + } + + return trimmedArray.ToArray().Reverse().ToArray(); + } + + private static bool StartsWith(byte[] array, byte[] containedArray) + { + for (int i = 0; i < array.Length; i++) + { + if (i == containedArray.Length) break; + if (array[i] != containedArray[i]) return false; + } + + return true; + } + + private static bool EndsWith(byte[] array, byte[] containedArray) + { + for (int i = array.Length - 1, j = 0; i >= 0; i--, j++) + { + if (j == containedArray.Length) break; + if (array[i] != containedArray[containedArray.Length - j - 1]) return false; + } + + return true; + } + } +} diff --git a/MySQL.Data/src/Authentication/MySqlSASLPlugin.cs b/MySQL.Data/src/Authentication/MySqlSASLPlugin.cs new file mode 100644 index 000000000..db8532905 --- /dev/null +++ b/MySQL.Data/src/Authentication/MySqlSASLPlugin.cs @@ -0,0 +1,256 @@ +// Copyright © 2020, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at + +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Authentication.GSSAPI; +using MySql.Data.Common; +using System; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient.Authentication +{ + /// + /// Allows connections to a user account set with the authentication_ldap_sasl authentication plugin. + /// + internal class MySqlSASLPlugin : MySqlAuthenticationPlugin + { + public override string PluginName => "mysql_ldap_sasl"; + string _mechanismName; + internal static ScramBase scramMechanism; + internal static GssapiMechanism gssapiMechanism; + + protected override void SetAuthData(byte[] data) + { + _mechanismName = Encoding.UTF8.GetString(data); + switch (_mechanismName) + { + case "SCRAM-SHA-1": + scramMechanism = new ScramSha1Mechanism(GetUsername(), GetMFAPassword(), Settings.Server); + break; + case "SCRAM-SHA-256": + scramMechanism = new ScramSha256Mechanism(GetUsername(), GetMFAPassword(), Settings.Server); + break; + case "GSSAPI": + gssapiMechanism = new GssapiMechanism(GetUsername(), GetMFAPassword()); + break; + } + } + + protected override Task MoreDataAsync(byte[] data, bool execAsync) + { + if (_mechanismName == "GSSAPI") + return Task.FromResult(gssapiMechanism.Challenge(data)); + else + return Task.FromResult(scramMechanism.Challenge(data)); + } + + /// + /// Determines if the character is a non-ASCII space. + /// + /// + /// This list was obtained from http://tools.ietf.org/html/rfc3454#appendix-C.1.2 + /// + /// true if the character is a non-ASCII space; otherwise, false. + /// The character. + internal static bool IsNonAsciiSpace(char c) + { + switch (c) + { + case '\u00A0': // NO-BREAK SPACE + case '\u1680': // OGHAM SPACE MARK + case '\u2000': // EN QUAD + case '\u2001': // EM QUAD + case '\u2002': // EN SPACE + case '\u2003': // EM SPACE + case '\u2004': // THREE-PER-EM SPACE + case '\u2005': // FOUR-PER-EM SPACE + case '\u2006': // SIX-PER-EM SPACE + case '\u2007': // FIGURE SPACE + case '\u2008': // PUNCTUATION SPACE + case '\u2009': // THIN SPACE + case '\u200A': // HAIR SPACE + case '\u200B': // ZERO WIDTH SPACE + case '\u202F': // NARROW NO-BREAK SPACE + case '\u205F': // MEDIUM MATHEMATICAL SPACE + case '\u3000': // IDEOGRAPHIC SPACE + return true; + default: + return false; + } + } + + /// + /// Determines if the character is commonly mapped to nothing. + /// + /// + /// This list was obtained from http://tools.ietf.org/html/rfc3454#appendix-B.1 + /// + /// true if the character is commonly mapped to nothing; otherwise, false. + /// The character. + internal static bool IsCommonlyMappedToNothing(char c) + { + return c == '\u00AD' || c == '\u034F' || c == '\u1806' || c >= '\u180B' && c <= '\u180D' || c >= '\u200B' && c <= '\u200D' + || c == '\u2060' || c >= '\uFE00' && c <= '\uFE0F' || c == '\uFEFF'; + } + + /// + /// Determines if the character is prohibited. + /// + /// + /// This list was obtained from http://tools.ietf.org/html/rfc3454#appendix-C.3 + /// + /// true if the character is prohibited; otherwise, false. + /// The string. + /// The character index. + internal static bool IsProhibited(string s, int index) + { + int u = char.ConvertToUtf32(s, index); + + // Non-ASCII control characters: https://tools.ietf.org/html/rfc3454#appendix-C.2.2 + if ((u >= 0x0080 && u <= 0x009F) || u == 0x06DD || u == 0x070F || u == 0x180E || u == 0x200C || u == 0x200D || + u == 0x2028 || u == 0x2029 || (u >= 0x2060 && u <= 0x2063) || (u >= 0x206A && u <= 0x206F) || u == 0xFEFF || + (u >= 0xFFF9 && u <= 0xFFFC) || (u >= 0x1D173 && u <= 0x1D17A)) + return true; + + // Private Use characters: http://tools.ietf.org/html/rfc3454#appendix-C.3 + if ((u >= 0xE000 && u <= 0xF8FF) || (u >= 0xF0000 && u <= 0xFFFFD) || (u >= 0x100000 && u <= 0x10FFFD)) + return true; + + // Non-character code points: http://tools.ietf.org/html/rfc3454#appendix-C.4 + if ((u >= 0xFDD0 && u <= 0xFDEF) || (u >= 0xFFFE && u <= 0xFFFF) || (u >= 0x1FFFE && u <= 0x1FFFF) || + (u >= 0x2FFFE && u <= 0x2FFFF) || (u >= 0x3FFFE && u <= 0x3FFFF) || (u >= 0x4FFFE && u <= 0x4FFFF) || + (u >= 0x5FFFE && u <= 0x5FFFF) || (u >= 0x6FFFE && u <= 0x6FFFF) || (u >= 0x7FFFE && u <= 0x7FFFF) || + (u >= 0x8FFFE && u <= 0x8FFFF) || (u >= 0x9FFFE && u <= 0x9FFFF) || (u >= 0xAFFFE && u <= 0xAFFFF) || + (u >= 0xBFFFE && u <= 0xBFFFF) || (u >= 0xCFFFE && u <= 0xCFFFF) || (u >= 0xDFFFE && u <= 0xDFFFF) || + (u >= 0xEFFFE && u <= 0xEFFFF) || (u >= 0xFFFFE && u <= 0xFFFFF) || (u >= 0x10FFFE && u <= 0x10FFFF)) + return true; + + // Surrogate code points: http://tools.ietf.org/html/rfc3454#appendix-C.5 + if (char.IsSurrogate(s, index)) + return true; + + // Inappropriate for plain text: http://tools.ietf.org/html/rfc3454#appendix-C.6 + switch (u) + { + case 0xFFF9: // INTERLINEAR ANNOTATION ANCHOR + case 0xFFFA: // INTERLINEAR ANNOTATION SEPARATOR + case 0xFFFB: // INTERLINEAR ANNOTATION TERMINATOR + case 0xFFFC: // OBJECT REPLACEMENT CHARACTER + case 0xFFFD: // REPLACEMENT CHARACTER + return true; + } + + // Inappropriate for canonical representation: http://tools.ietf.org/html/rfc3454#appendix-C.7 + if (u >= 0x2FF0 && u <= 0x2FFB) + return true; + + // Change display properties or are deprecated: http://tools.ietf.org/html/rfc3454#appendix-C.8 + switch (u) + { + case 0x0340: // COMBINING GRAVE TONE MARK + case 0x0341: // COMBINING ACUTE TONE MARK + case 0x200E: // LEFT-TO-RIGHT MARK + case 0x200F: // RIGHT-TO-LEFT MARK + case 0x202A: // LEFT-TO-RIGHT EMBEDDING + case 0x202B: // RIGHT-TO-LEFT EMBEDDING + case 0x202C: // POP DIRECTIONAL FORMATTING + case 0x202D: // LEFT-TO-RIGHT OVERRIDE + case 0x202E: // RIGHT-TO-LEFT OVERRIDE + case 0x206A: // INHIBIT SYMMETRIC SWAPPING + case 0x206B: // ACTIVATE SYMMETRIC SWAPPING + case 0x206C: // INHIBIT ARABIC FORM SHAPING + case 0x206D: // ACTIVATE ARABIC FORM SHAPING + case 0x206E: // NATIONAL DIGIT SHAPES + case 0x206F: // NOMINAL DIGIT SHAPES + return true; + } + + // Tagging characters: http://tools.ietf.org/html/rfc3454#appendix-C.9 + if (u == 0xE0001 || (u >= 0xE0020 && u <= 0xE007F)) + return true; + + return false; + } + + /// + /// Prepares the user name or password string. + /// + /// The string to prepare. + /// The prepared string. + internal static string SaslPrep(string s) + { + if (s == null) + throw new ArgumentNullException(nameof(s)); + + if (s.Length == 0) + return s; + + var builder = new StringBuilder(s.Length); + for (int i = 0; i < s.Length; i++) + { + if (IsNonAsciiSpace(s[i])) + { + // non-ASII space characters [StringPrep, C.1.2] that can be + // mapped to SPACE (U+0020). + builder.Append(' '); + } + else if (IsCommonlyMappedToNothing(s[i])) + { + // the "commonly mapped to nothing" characters [StringPrep, B.1] + // that can be mapped to nothing. + } + else if (char.IsControl(s[i])) + { + throw new ArgumentException("Control characters are prohibited.", nameof(s)); + } + else if (IsProhibited(s, i)) + { + throw new ArgumentException("One or more characters in the string are prohibited.", nameof(s)); + } + else + { + builder.Append(s[i]); + } + } + + return builder.ToString().Normalize(NormalizationForm.FormKC); + } + + internal static string GetRandomBytes(int n) + { + var bytes = new byte[n]; + + using (var rng = RandomNumberGenerator.Create()) + rng.GetBytes(bytes); + + return Convert.ToBase64String(bytes); + } + } +} diff --git a/MySQL.Data/src/Authentication/NativePasswordPlugins.cs b/MySQL.Data/src/Authentication/NativePasswordPlugins.cs new file mode 100644 index 000000000..248a93d02 --- /dev/null +++ b/MySQL.Data/src/Authentication/NativePasswordPlugins.cs @@ -0,0 +1,110 @@ +// Copyright © 2012, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient.Authentication +{ + /// + /// Allows connections to a user account set with the mysql_native_password authentication plugin. + /// + public class MySqlNativePasswordPlugin : MySqlAuthenticationPlugin + { + public override string PluginName => "mysql_native_password"; + + protected override void SetAuthData(byte[] data) + { + // if the data given to us is a null terminated string, we need to trim off the trailing zero + if (data[data.Length - 1] == 0) + { + byte[] b = new byte[data.Length - 1]; + Buffer.BlockCopy(data, 0, b, 0, data.Length - 1); + base.SetAuthData(b); + } + else + base.SetAuthData(data); + } + + protected override Task MoreDataAsync(byte[] data, bool execAsync) + { + byte[] passBytes = (GetPassword() ?? new byte[1]) as byte[]; + byte[] buffer = new byte[passBytes.Length - 1]; + Array.Copy(passBytes, 1, buffer, 0, passBytes.Length - 1); + return Task.FromResult(buffer); + } + + public override object GetPassword() + { + byte[] bytes = Get411Password(GetMFAPassword(), AuthenticationData); + if (bytes != null && bytes.Length == 1 && bytes[0] == 0) return null; + return bytes; + } + + /// + /// Returns a byte array containing the proper encryption of the + /// given password/seed according to the new 4.1.1 authentication scheme. + /// + /// + /// + /// + protected byte[] Get411Password(string password, byte[] seedBytes) + { + // if we have no password, then we just return 1 zero byte + if (password.Length == 0) return new byte[1]; + //SHA1 sha = new SHA1CryptoServiceProvider(); + SHA1 sha = SHA1.Create(); + byte[] firstHash = null; + try + { + firstHash = sha.ComputeHash(this.Encoding.GetBytes(password)); + } + catch (NullReferenceException) + { + firstHash = sha.ComputeHash(Encoding.Default.GetBytes(password)); + } + + byte[] secondHash = sha.ComputeHash(firstHash); + + byte[] input = new byte[seedBytes.Length + secondHash.Length]; + Array.Copy(seedBytes, 0, input, 0, seedBytes.Length); + Array.Copy(secondHash, 0, input, seedBytes.Length, secondHash.Length); + byte[] thirdHash = sha.ComputeHash(input); + + byte[] finalHash = new byte[thirdHash.Length + 1]; + finalHash[0] = 0x14; + Array.Copy(thirdHash, 0, finalHash, 1, thirdHash.Length); + + for (int i = 1; i < finalHash.Length; i++) + finalHash[i] = (byte)(finalHash[i] ^ firstHash[i - 1]); + return finalHash; + } + } +} diff --git a/MySQL.Data/src/Authentication/OciAuthenticationPlugin.cs b/MySQL.Data/src/Authentication/OciAuthenticationPlugin.cs new file mode 100644 index 000000000..dc3ade5f0 --- /dev/null +++ b/MySQL.Data/src/Authentication/OciAuthenticationPlugin.cs @@ -0,0 +1,225 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Org.BouncyCastle.Crypto.Digests; +using Org.BouncyCastle.Crypto.Parameters; +using Org.BouncyCastle.Crypto.Signers; +using Org.BouncyCastle.OpenSsl; +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient.Authentication +{ + /// + /// Enables connections from a user account set with the authentication_iam authentication plugin. + /// + internal class OciAuthenticationPlugin : MySqlAuthenticationPlugin + { + public override string PluginName => "authentication_oci_client"; + private Assembly _ociAssembly; + internal string _ociConfigProfile; + + private const string KEY_FILE = "key_file"; + private const string FINGERPRINT = "fingerprint"; + private const string SECURITY_TOKEN_FILE = "security_token_file"; + + /// + /// Verify that OCI .NET SDK is referenced. + /// + protected override void CheckConstraints() + { + try + { + _ociAssembly = Assembly.Load("OCI.DotNetSDK.Common"); + } + catch (Exception ex) + { + throw new MySqlException(Resources.OciSDKNotFound, ex); + } + } + + protected override void SetAuthData(byte[] data) + { + base.SetAuthData(data); + } + + protected override Task MoreDataAsync(byte[] data, bool execAsync) + { + Dictionary> profiles = LoadOciConfigProfiles(); + GetOciConfigValues(profiles, out string keyFilePath, out string fingerprint, out string securityTokenFilePath); + string signedToken = SignData(AuthenticationData, keyFilePath); + string securityToken = LoadSecurityToken(securityTokenFilePath); + byte[] response = BuildResponse(fingerprint, signedToken, securityToken); + + return Task.FromResult(response); + } + + /// + /// Loads the profiles from the OCI config file. + /// + internal Dictionary> LoadOciConfigProfiles() + { + string ociConfigPath = Settings.OciConfigFile; + _ociConfigProfile = Settings.OciConfigProfile; + var configFileReaderType = _ociAssembly.GetType("Oci.Common.ConfigFileReader"); + Dictionary> profiles; + + if (string.IsNullOrWhiteSpace(ociConfigPath)) + { + FieldInfo pathField = configFileReaderType.GetField("DEFAULT_FILE_PATH"); + ociConfigPath = (string)pathField.GetValue(null); + } + + try + { + MethodInfo methodInfo = configFileReaderType.GetMethod("Parse", new Type[] { typeof(string), typeof(string) }); + var configFile = methodInfo.Invoke(null, new object[] { ociConfigPath, _ociConfigProfile }); + profiles = (Dictionary>)configFile.GetType().GetMethod("GetConfiguration").Invoke(configFile, null); + } + catch (Exception ex) + { + switch (ex.InnerException) + { + case IOException: + throw new MySqlException(Resources.OciConfigFileNotFound, ex); + case ArgumentException: + throw new MySqlException(Resources.OciConfigProfileNotFound, ex); + default: + throw new MySqlException(string.Format(Resources.AuthenticationFailed, Settings.Server, Settings.UserID, ex.InnerException)); + } + } + + return profiles; + } + + /// + /// Get the values for the key_file, fingerprint and security_token_file entries. + /// + internal void GetOciConfigValues(Dictionary> profiles, out string keyFilePath, out string fingerprint, out string securityTokenFilePath) + { + profiles.TryGetValue(_ociConfigProfile, out Dictionary profileData); + + keyFilePath = profileData.TryGetValue(KEY_FILE, out string keyFilePathValue) + ? keyFilePathValue : string.Empty; + fingerprint = profileData.TryGetValue(FINGERPRINT, out string fingerprintValue) + ? fingerprintValue : string.Empty; + securityTokenFilePath = profileData.TryGetValue(SECURITY_TOKEN_FILE, out string securityTokenFilePathValue) + ? securityTokenFilePathValue : string.Empty; + + if (string.IsNullOrEmpty(keyFilePath) || string.IsNullOrEmpty(fingerprint)) + throw new MySqlException(Resources.OciEntryNotFound); + } + + /// + /// Sign nonce sent by server using SHA256 algorithm and the private key provided by the user. + /// + internal static string SignData(byte[] data, string keyFilePath) + { + // Init algorithm + RsaDigestSigner signer256 = new RsaDigestSigner(new Sha256Digest()); + RsaPrivateCrtKeyParameters rsaPrivate; + + // Read key file and security token + try + { + using StreamReader reader = File.OpenText(keyFilePath); + PemReader pemReader = new PemReader(reader); + rsaPrivate = (RsaPrivateCrtKeyParameters)pemReader.ReadObject(); + } + catch (Exception ex) + { + throw new MySqlException(Resources.OciKeyFileDoesNotExists, ex); + } + + if (rsaPrivate == null) + throw new MySqlException(Resources.OciInvalidKeyFile); + + // Populate with key + signer256.Init(true, rsaPrivate); + // Calculate the signature + signer256.BlockUpdate(data, 0, data.Length); + // Generates signature + byte[] sig = signer256.GenerateSignature(); + // Base 64 encode the sig so its 8-bit clean + string signedString = Convert.ToBase64String(sig); + + return signedString; + } + + /// + /// Reads the security token file and verify it does not exceed the maximum value of 10KB. + /// + /// The path to the security token. + internal static string LoadSecurityToken(string securityTokenFilePath) + { + byte[] securityToken = new byte[0]; + + try + { + if (!string.IsNullOrWhiteSpace(securityTokenFilePath)) + { + using var reader = File.OpenRead(securityTokenFilePath); + + if (reader.Length > 10240) + throw new MySqlException(Resources.OciSecurityTokenFileExceeds10KB); + + securityToken = new byte[reader.Length]; + reader.Read(securityToken, 0, securityToken.Length); + } + } + catch (FileNotFoundException ex) + { + throw new MySqlException(Resources.OciSecurityTokenDoesNotExists, ex); + } + catch (MySqlException ex) + { + throw ex; + } + + return Encoding.UTF8.GetString(securityToken); + } + + /// + /// Wraps up the fingerprint, signature and the token into a JSON format and encode it to a byte array. + /// + /// The response packet that will be sent to the server. + internal static byte[] BuildResponse(string fingerprint, string signature, string token) + { + string payload = + "{ \"fingerprint\" : \"" + fingerprint + "\" ," + + " \"signature\": \"" + signature + "\"," + + " \"token\": \"" + token + "\" }"; + + return Encoding.UTF8.GetBytes(payload); + } + } +} diff --git a/MySQL.Data/src/Authentication/OpenIdConnectClientAuthentication.cs b/MySQL.Data/src/Authentication/OpenIdConnectClientAuthentication.cs new file mode 100644 index 000000000..b4ad5b251 --- /dev/null +++ b/MySQL.Data/src/Authentication/OpenIdConnectClientAuthentication.cs @@ -0,0 +1,69 @@ +// Copyright © 2024, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySql.Data.MySqlClient.Authentication; +using Org.BouncyCastle.Utilities.Encoders; +using System; +using System.Collections.Generic; +using System.Configuration; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient.Authentication +{ + internal class OpenIdConnectClientAuthentication : MySqlAuthenticationPlugin + { + public override string PluginName => "authentication_openid_connect_client"; + + private static int IdentityToken_sizelimit = 10 * 1024; + + protected override Task MoreDataAsync(byte[] data, bool execAsync) + { + byte[] IdToken = Encoding.GetBytes(Settings.OpenIdIdentityToken); + int responseLength = 10;//1 Byte for capability flag. the rest is for Bytes lenenc. + responseLength += IdToken.Length; + + if (IdToken == null || IdToken.Length == 0) + throw new ArgumentException(Resources.OpenIdIdentityTokenIsEmpty); + + if (IdToken.Length > IdentityToken_sizelimit) + throw new ArgumentException(Resources.OpenIdIdentityTokenTooBig); + + var response = new MySqlPacket(new MemoryStream(responseLength)); + response.Write(new byte[] { 0x01 }); //capability flag. + response.WriteLength(IdToken.Length); + response.Write(IdToken); + + response.Position = 0; + return Task.FromResult(response.Buffer); + } + } +} diff --git a/MySQL.Data/src/Authentication/SSPI/Const.cs b/MySQL.Data/src/Authentication/SSPI/Const.cs new file mode 100644 index 000000000..de84e35ca --- /dev/null +++ b/MySQL.Data/src/Authentication/SSPI/Const.cs @@ -0,0 +1,53 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySql.Data.Authentication.SSPI +{ + /// + /// SSPI constants + /// + internal static class Const + { + internal const int SECPKG_CRED_BOTH = 0x00000003; + internal const int SECURITY_NETWORK_DREP = 0; + internal const int SECURITY_NATIVE_DREP = 0x10; + internal const int SECPKG_CRED_INBOUND = 1; + internal const int MAX_TOKEN_SIZE = 12288; + internal const int SECPKG_ATTR_SIZES = 0; + internal const int STANDARD_CONTEXT_ATTRIBUTES = 0; + internal const uint SEC_WINNT_AUTH_IDENTITY_UNICODE = 2; + } + + internal enum SecStatus : uint + { + SEC_E_OK = 0, + SEC_I_CONTINUE_NEEDED = 0x90312, + SEC_I_COMPLETE_NEEDED = 0x1013, + SEC_I_COMPLETE_AND_CONTINUE = 0x1014, + } +} diff --git a/MySQL.Data/src/Authentication/SSPI/NativeMethods.cs b/MySQL.Data/src/Authentication/SSPI/NativeMethods.cs new file mode 100644 index 000000000..3cc1277ca --- /dev/null +++ b/MySQL.Data/src/Authentication/SSPI/NativeMethods.cs @@ -0,0 +1,130 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Runtime.InteropServices; + +namespace MySql.Data.Authentication.SSPI +{ + /// + /// SSPI Bindings + /// + internal static class NativeMethods + { + private const string SECUR32 = "secur32.dll"; + + #region Imports + [DllImport( + SECUR32, + CharSet = CharSet.Unicode)] + internal static extern SecStatus AcquireCredentialsHandle( + string pszPrincipal, + string pszPackage, + int fCredentialUse, + IntPtr PAuthenticationID, + IntPtr pAuthData, + int pGetKeyFn, + IntPtr pvGetKeyArgument, + ref SECURITY_HANDLE phCredential, + IntPtr ptsExpiry); + + [DllImport( + SECUR32, + CharSet = CharSet.Unicode)] + internal static extern SecStatus AcquireCredentialsHandle( + string pszPrincipal, + string pszPackage, + int fCredentialUse, + IntPtr PAuthenticationID, + SEC_WINNT_AUTH_IDENTITY pAuthData, + int pGetKeyFn, + IntPtr pvGetKeyArgument, + ref SECURITY_HANDLE phCredential, + IntPtr ptsExpiry); + + [DllImport( + SECUR32, + CharSet = CharSet.Unicode, + SetLastError = true, + EntryPoint = "InitializeSecurityContext")] + internal static extern SecStatus InitializeSecurityContext_0( + ref SECURITY_HANDLE phCredential, + IntPtr phContext, + string pszTargetName, + int fContextReq, + int Reserved1, + int TargetDataRep, + IntPtr pInput, + int Reserved2, + out SECURITY_HANDLE phNewContext, + out SecBufferDesc pOutput, + out uint pfContextAttr, + out SECURITY_INTEGER ptsExpiry); + + [DllImport( + SECUR32, + CharSet = CharSet.Unicode, + SetLastError = true, + EntryPoint = "InitializeSecurityContext")] + internal static extern SecStatus InitializeSecurityContext_1( + ref SECURITY_HANDLE phCredential, + ref SECURITY_HANDLE phContext, + string pszTargetName, + int fContextReq, + int Reserved1, + int TargetDataRep, + ref SecBufferDesc SecBufferDesc, + int Reserved2, + out SECURITY_HANDLE phNewContext, + out SecBufferDesc pOutput, + out uint pfContextAttr, + out SECURITY_INTEGER ptsExpiry); + + [DllImport(SECUR32, CharSet = CharSet.Unicode, SetLastError = true)] + internal static extern int CompleteAuthToken( + ref SECURITY_HANDLE phContext, + ref SecBufferDesc pToken); + + [DllImport( + SECUR32, + CharSet = CharSet.Unicode, + SetLastError = false, + EntryPoint = "QueryContextAttributes")] + internal static extern int QueryContextAttributes_String( + ref SECURITY_HANDLE phContext, + uint ulAttribute, + ref SecPkgContext_SecString pBuffer); + + [DllImport(SECUR32, CharSet = CharSet.Unicode, SetLastError = false)] + internal static extern int FreeCredentialsHandle(ref SECURITY_HANDLE pCred); + + [DllImport(SECUR32, CharSet = CharSet.Unicode, SetLastError = false)] + internal static extern int DeleteSecurityContext(ref SECURITY_HANDLE pContext); + #endregion + } +} diff --git a/MySQL.Data/src/Authentication/SSPI/SspiCredentials.cs b/MySQL.Data/src/Authentication/SSPI/SspiCredentials.cs new file mode 100644 index 000000000..682401d24 --- /dev/null +++ b/MySQL.Data/src/Authentication/SSPI/SspiCredentials.cs @@ -0,0 +1,90 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using static MySql.Data.Authentication.SSPI.NativeMethods; + +namespace MySql.Data.Authentication.SSPI +{ + internal class SspiCredentials + { + /// + /// A safe handle to the credential's handle. + /// + internal SECURITY_HANDLE credentialsHandle = default; + + /// + /// Acquires a handle to preexisting credentials of a security principal. + /// + internal SspiCredentials(string package) + { + var result = AcquireCredentialsHandle( + null, + package, + Const.SECPKG_CRED_BOTH, + IntPtr.Zero, + IntPtr.Zero, + 0, + IntPtr.Zero, + ref credentialsHandle, + IntPtr.Zero); + + if (result != SecStatus.SEC_E_OK) + throw new MySqlException($"AcquireCredentialsHandle failed with error code: {result}"); + } + + internal SspiCredentials(string principal, string username, string password, string domain, string package) + { + var authenticationData = new SEC_WINNT_AUTH_IDENTITY + { + User = username, + UserLength = username.Length, + Domain = domain, + DomainLength = domain.Length, + Password = password, + PasswordLength = password.Length, + Flags = Const.SEC_WINNT_AUTH_IDENTITY_UNICODE + }; + + var result = AcquireCredentialsHandle( + principal, + package, + Const.SECPKG_CRED_BOTH, + IntPtr.Zero, + authenticationData, + 0, + IntPtr.Zero, + ref credentialsHandle, + IntPtr.Zero); + + if (result != SecStatus.SEC_E_OK) + throw new Exception($"Unable to aquire credentials for {principal} with error code: {result}"); + } + } +} diff --git a/MySQL.Data/src/Authentication/SSPI/SspiSecurityContext.cs b/MySQL.Data/src/Authentication/SSPI/SspiSecurityContext.cs new file mode 100644 index 000000000..0f04fd1b0 --- /dev/null +++ b/MySQL.Data/src/Authentication/SSPI/SspiSecurityContext.cs @@ -0,0 +1,148 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using static MySql.Data.Authentication.SSPI.NativeMethods; + +namespace MySql.Data.Authentication.SSPI +{ + internal class SspiSecurityContext : IDisposable + { + private SECURITY_HANDLE securityContext = default; + private SspiCredentials credentials; + + /// + /// Creates an instance of SspiSecurityContext with credentials provided. + /// + /// Credentials to be used with the Security Context + internal SspiSecurityContext(SspiCredentials credentials) + { + this.credentials = credentials; + } + + /// + /// Initiates the client side, outbound security context from a credential handle. + /// + /// Byte array to be sent to the server. + /// Byte array received by the server. + /// The target. + internal ContextStatus InitializeSecurityContext(out byte[] clientBlob, byte[] serverBlob, string targetName) + { + clientBlob = null; + SecBufferDesc clientBufferDesc = new SecBufferDesc(Const.MAX_TOKEN_SIZE); + SECURITY_INTEGER initLifetime = new SECURITY_INTEGER(0); + SecStatus result = 0; + + try + { + uint ContextAttributes = 0; + + if (serverBlob == null) + { + result = InitializeSecurityContext_0( + ref credentials.credentialsHandle, + IntPtr.Zero, + targetName, + Const.STANDARD_CONTEXT_ATTRIBUTES, + 0, + Const.SECURITY_NETWORK_DREP, + IntPtr.Zero, /* always zero first time around */ + 0, + out securityContext, + out clientBufferDesc, + out ContextAttributes, + out initLifetime); + } + else + { + SecBufferDesc serverBufferDesc = new SecBufferDesc(serverBlob); + + try + { + result = InitializeSecurityContext_1( + ref credentials.credentialsHandle, + ref securityContext, + targetName, + Const.STANDARD_CONTEXT_ATTRIBUTES, + 0, + Const.SECURITY_NETWORK_DREP, + ref serverBufferDesc, + 0, + out securityContext, + out clientBufferDesc, + out ContextAttributes, + out initLifetime); + } + finally + { + serverBufferDesc.Dispose(); + } + } + + if ((SecStatus.SEC_I_COMPLETE_NEEDED == result) + || (SecStatus.SEC_I_COMPLETE_AND_CONTINUE == result)) + { + CompleteAuthToken(ref securityContext, ref clientBufferDesc); + } + + if (result != SecStatus.SEC_E_OK && + result != SecStatus.SEC_I_CONTINUE_NEEDED && + result != SecStatus.SEC_I_COMPLETE_NEEDED && + result != SecStatus.SEC_I_COMPLETE_AND_CONTINUE) + { + throw new MySqlException("InitializeSecurityContext() failed with errorcode " + result); + } + + clientBlob = clientBufferDesc.GetSecBufferByteArray(); + } + finally + { + clientBufferDesc.Dispose(); + } + + if (result == SecStatus.SEC_I_CONTINUE_NEEDED) + return ContextStatus.RequiresContinuation; + + return ContextStatus.Accepted; + } + + public void Dispose() + { + FreeCredentialsHandle(ref credentials.credentialsHandle); + DeleteSecurityContext(ref securityContext); + } + } + + internal enum ContextStatus + { + RequiresContinuation, + Accepted, + Error + } +} diff --git a/MySQL.Data/src/Authentication/SSPI/Structs.cs b/MySQL.Data/src/Authentication/SSPI/Structs.cs new file mode 100644 index 000000000..15d329fb4 --- /dev/null +++ b/MySQL.Data/src/Authentication/SSPI/Structs.cs @@ -0,0 +1,266 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; + +namespace MySql.Data.Authentication.SSPI +{ + [StructLayout(LayoutKind.Sequential)] + internal struct SecBufferDesc : IDisposable + { + private int _ulVersion; + private int _cBuffers; + private IntPtr _pBuffers; //Point to SecBuffer + + internal SecBufferDesc(int bufferSize) + { + _ulVersion = (int)SecBufferType.SECBUFFER_VERSION; + _cBuffers = 1; + SecBuffer secBuffer = new SecBuffer(bufferSize); + _pBuffers = Marshal.AllocHGlobal(Marshal.SizeOf(secBuffer)); + Marshal.StructureToPtr(secBuffer, _pBuffers, false); + } + + internal SecBufferDesc(byte[] secBufferBytes) + { + _ulVersion = (int)SecBufferType.SECBUFFER_VERSION; + _cBuffers = 1; + SecBuffer thisSecBuffer = new SecBuffer(secBufferBytes); + _pBuffers = Marshal.AllocHGlobal(Marshal.SizeOf(thisSecBuffer)); + Marshal.StructureToPtr(thisSecBuffer, _pBuffers, false); + } + + public void Dispose() + { + if (_pBuffers != IntPtr.Zero) + { + Debug.Assert(_cBuffers == 1); + SecBuffer ThisSecBuffer = Marshal.PtrToStructure(_pBuffers); + ThisSecBuffer.Dispose(); + Marshal.FreeHGlobal(_pBuffers); + _pBuffers = IntPtr.Zero; + } + } + + internal byte[] GetSecBufferByteArray() + { + byte[] Buffer = null; + + if (_pBuffers == IntPtr.Zero) + { + throw new InvalidOperationException("Object has already been disposed!!!"); + } + Debug.Assert(_cBuffers == 1); + SecBuffer secBuffer = Marshal.PtrToStructure(_pBuffers); + if (secBuffer.cbBuffer > 0) + { + Buffer = new byte[secBuffer.cbBuffer]; + Marshal.Copy(secBuffer.pvBuffer, Buffer, 0, secBuffer.cbBuffer); + } + return (Buffer); + } + } + + /// + /// Defines the type of the security buffer. + /// + internal enum SecBufferType + { + SECBUFFER_VERSION = 0, + SECBUFFER_EMPTY = 0, + SECBUFFER_DATA = 1, + SECBUFFER_TOKEN = 2 + } + + /// + /// Defines a security handle. + /// + [StructLayout(LayoutKind.Sequential)] + internal struct SecHandle //=PCtxtHandle + { + IntPtr dwLower; // ULONG_PTR translates to IntPtr not to uint + IntPtr dwUpper; // this is crucial for 64-Bit Platforms + } + + /// + /// Describes a buffer allocated by a transport to pass to a security package. + /// + [StructLayout(LayoutKind.Sequential)] + internal struct SecBuffer : IDisposable + { + /// + /// Specifies the size, in bytes, of the buffer. + /// + internal int cbBuffer; + + /// + /// Bit flags that indicate the type of the buffer. + /// + internal int BufferType; + + /// + /// Pointer to a buffer. + /// + internal IntPtr pvBuffer; + + + internal SecBuffer(int bufferSize) + { + cbBuffer = bufferSize; + BufferType = (int)SecBufferType.SECBUFFER_TOKEN; + pvBuffer = Marshal.AllocHGlobal(bufferSize); + } + + internal SecBuffer(byte[] secBufferBytes) + { + cbBuffer = secBufferBytes.Length; + BufferType = (int)SecBufferType.SECBUFFER_TOKEN; + pvBuffer = Marshal.AllocHGlobal(cbBuffer); + Marshal.Copy(secBufferBytes, 0, pvBuffer, cbBuffer); + } + + internal SecBuffer(byte[] secBufferBytes, SecBufferType bufferType) + { + cbBuffer = secBufferBytes.Length; + BufferType = (int)bufferType; + pvBuffer = Marshal.AllocHGlobal(cbBuffer); + Marshal.Copy(secBufferBytes, 0, pvBuffer, cbBuffer); + } + + public void Dispose() + { + if (pvBuffer != IntPtr.Zero) + { + Marshal.FreeHGlobal(pvBuffer); + pvBuffer = IntPtr.Zero; + } + } + } + + /// + /// Hold a numeric value used in defining other data types. + /// + [StructLayout(LayoutKind.Sequential)] + internal struct SECURITY_INTEGER + { + /// + /// Least significant digits. + /// + uint LowPart; + + /// + /// Most significant digits. + /// + int HighPart; + internal SECURITY_INTEGER(int dummy) + { + LowPart = 0; + HighPart = 0; + } + } + + /// + /// Holds a pointer used to define a security handle. + /// + [StructLayout(LayoutKind.Sequential)] + internal struct SECURITY_HANDLE + { + /// + /// Least significant digits. + /// + ulong LowPart; + + /// + /// Most significant digits. + /// + ulong HighPart; + + bool IsSet => this.LowPart > 0 || this.HighPart > 0; + + internal SECURITY_HANDLE(int dummy) + { + LowPart = HighPart = 0; + } + } + + /// + /// Indicates the sizes of important structures used in the message support functions. + /// + [StructLayout(LayoutKind.Sequential)] + internal struct SecPkgContext_Sizes + { + /// + /// Specifies the maximum size of the security token used in the authentication changes. + /// + uint cbMaxToken; + + /// + /// Specifies the maximum size of the signature created by the MakeSignature function. + /// This member must be zero if integrity services are not requested or available. + /// + uint cbMaxSignature; + + /// + /// Specifies the preferred integral size of the messages. + /// + uint cbBlockSize; + + /// + /// Size of the security trailer to be appended to messages. + /// This member should be zero if the relevant services are not requested or available. + /// + uint cbSecurityTrailer; + } + + [StructLayout(LayoutKind.Sequential)] + internal struct SecPkgContext_SecString + { + public IntPtr sValue; + } + + /// + /// Implements the 'SEC_WINNT_AUTH_IDENTITY' structure. See: + /// https://msdn.microsoft.com/en-us/library/windows/desktop/aa380131(v=vs.85).aspx + /// + [StructLayout(LayoutKind.Sequential)] + internal struct SEC_WINNT_AUTH_IDENTITY + { + [MarshalAs(UnmanagedType.LPWStr)] + public string User; + public int UserLength; + [MarshalAs(UnmanagedType.LPWStr)] + public string Domain; + public int DomainLength; + [MarshalAs(UnmanagedType.LPWStr)] + public string Password; + public int PasswordLength; + public uint Flags; + } +} diff --git a/MySQL.Data/src/Authentication/ScramBase.cs b/MySQL.Data/src/Authentication/ScramBase.cs new file mode 100644 index 000000000..1a6a36192 --- /dev/null +++ b/MySQL.Data/src/Authentication/ScramBase.cs @@ -0,0 +1,282 @@ +// Copyright © 2020, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at + +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Security.Cryptography; +using System.Text; + +namespace MySql.Data.MySqlClient.Authentication +{ + /// + /// Base class to handle SCRAM authentication methods + /// + internal abstract class ScramBase : MySqlSASLPlugin + { + /// + /// Defines the state of the authentication process. + /// + internal enum AuthState + { + INITIAL, + FINAL, + VALIDATE + } + + protected string Host { get; private set; } + protected string Username { get; private set; } + protected string Password { get; private set; } + + internal string _cnonce, client; + internal byte[] salted, auth; + internal AuthState _state; + + protected ScramBase(string username, string password, string host) + { + Host = host; + Username = username; + Password = password; + } + + /// + /// Gets the name of the method. + /// + internal abstract string MechanismName + { + get; + } + + /// + /// Parses the server's challenge token and returns the next challenge response. + /// + /// The next challenge response. + internal byte[] Challenge(byte[] token) + { + byte[] response = null; + + switch (_state) + { + case AuthState.INITIAL: + response = ClientInitial(); + _state = AuthState.FINAL; + break; + case AuthState.FINAL: + response = ProcessServerResponse(token); + _state = AuthState.VALIDATE; + break; + case AuthState.VALIDATE: + ValidateAuth(token); + break; + default: + throw new Exception("Unexpected SCRAM authentication message."); + } + + return response; + } + + /// + /// Builds up the client-first message. + /// + /// An array of bytes containig the client-first message. + internal byte[] ClientInitial() + { + _cnonce = _cnonce ?? GetRandomBytes(32); + client = $"n={Normalize(Username)},r={_cnonce}"; + return Encoding.UTF8.GetBytes($"n,a={Normalize(Username)}," + client); + } + + /// + /// Processes the server response from the client-first message and + /// builds up the client-final message. + /// + /// Response from the server. + /// An array of bytes containing the client-final message. + internal byte[] ProcessServerResponse(byte[] data) + { + string response = Encoding.UTF8.GetString(data, 0, data.Length); + var tokens = ParseServerChallenge(response); + + if (!tokens.TryGetValue('s', out string salt)) throw new MySqlException(string.Format(Resources.AuthenticationFailed, Host, Username, + MechanismName, "salt is missing.")); + if (!tokens.TryGetValue('r', out string snonce)) throw new MySqlException(string.Format(Resources.AuthenticationFailed, Host, Username, + MechanismName, "nonce is missing.")); + if (!tokens.TryGetValue('i', out string iterations)) throw new MySqlException(string.Format(Resources.AuthenticationFailed, Host, Username, + MechanismName, "iteration count is missing.")); + if (!tokens['r'].StartsWith(_cnonce, StringComparison.Ordinal)) throw new MySqlException(string.Format(Resources.AuthenticationFailed, Host, Username, + MechanismName, "invalid nonce.")); + if (!int.TryParse(iterations, out int count)) throw new MySqlException(string.Format(Resources.AuthenticationFailed, Host, Username, + MechanismName, "invalid iteration count.")); + + var password = Encoding.UTF8.GetBytes(Password); + salted = Hi(password, Convert.FromBase64String(salt), count); + Array.Clear(password, 0, password.Length); + + var withoutProof = "c=" + Convert.ToBase64String(Encoding.ASCII.GetBytes($"n,a={Username},")) + ",r=" + snonce; + auth = Encoding.UTF8.GetBytes(client + "," + response + "," + withoutProof); + + var ckey = HMAC(salted, Encoding.ASCII.GetBytes("Client Key")); + Xor(ckey, HMAC(Hash(ckey), auth)); + + return Encoding.UTF8.GetBytes(withoutProof + ",p=" + Convert.ToBase64String(ckey)); + } + + /// + /// Validates the server response. + /// + /// Server-final message + internal void ValidateAuth(byte[] data) + { + string response = Encoding.UTF8.GetString(data, 0, data.Length); + + if (!response.StartsWith("v=", StringComparison.Ordinal)) + throw new MySqlException(string.Format(Resources.AuthenticationFailed, Host, Username, MechanismName, "challenge did not start with a signature.")); + + var signature = Convert.FromBase64String(response.Substring(2)); + var skey = HMAC(salted, Encoding.ASCII.GetBytes("Server Key")); + var calculated = HMAC(skey, auth); + + if (signature.Length != calculated.Length) + throw new MySqlException(string.Format(Resources.AuthenticationFailed, Host, Username, MechanismName, "challenge contained a signature with an invalid length.")); + + for (int i = 0; i < signature.Length; i++) + { + if (signature[i] != calculated[i]) + throw new MySqlException(string.Format(Resources.AuthenticationFailed, Host, Username, MechanismName, "challenge contained an invalid signature.")); + } + } + + static string Normalize(string str) + { + var builder = new StringBuilder(); + var prepared = SaslPrep(str); + + for (int i = 0; i < prepared.Length; i++) + { + switch (prepared[i]) + { + case ',': builder.Append("=2C"); break; + case '=': builder.Append("=3D"); break; + default: + builder.Append(prepared[i]); + break; + } + } + + return builder.ToString(); + } + + /// + /// Creates the HMAC SHA1 context. + /// + /// The HMAC context. + /// The secret key. + protected abstract KeyedHashAlgorithm CreateHMAC(byte[] key); + + /// + /// Apply the HMAC keyed algorithm. + /// + /// The results of the HMAC keyed algorithm. + /// The key. + /// The string. + byte[] HMAC(byte[] key, byte[] str) + { + using (var hmac = CreateHMAC(key)) + return hmac.ComputeHash(str); + } + + /// + /// Applies the cryptographic hash function. + /// + /// The results of the hash. + /// The string. + protected abstract byte[] Hash(byte[] str); + + /// + /// Applies the exclusive-or operation to combine two octet strings. + /// + /// The alpha component. + /// The blue component. + private static void Xor(byte[] a, byte[] b) + { + for (int i = 0; i < a.Length; i++) + a[i] = (byte)(a[i] ^ b[i]); + } + + // Hi(str, salt, i): + // + // U1 := HMACSHA1(str, salt + INT(1)) + // U2 := HMACSHA1(str, U1) + // ... + // Ui-1 := HMACSHA1(str, Ui-2) + // Ui := HMACSHA1(str, Ui-1) + // + // Hi := U1 XOR U2 XOR ... XOR Ui + // + // where "i" is the iteration count, "+" is the string concatenation + // operator, and INT(g) is a 4-octet encoding of the integer g, most + // significant octet first. + // + // Hi() is, essentially, PBKDF2 [RFC2898] with HMACSHA1() as the + // pseudorandom function (PRF) and with dkLen == output length of + // HMACSHA1() == output length of H(). + private byte[] Hi(byte[] str, byte[] salt, int count) + { + using (var hmac = CreateHMAC(str)) + { + var salt1 = new byte[salt.Length + 4]; + byte[] hi, u1; + + Buffer.BlockCopy(salt, 0, salt1, 0, salt.Length); + salt1[salt1.Length - 1] = (byte)1; + + hi = u1 = hmac.ComputeHash(salt1); + + for (int i = 1; i < count; i++) + { + var u2 = hmac.ComputeHash(u1); + Xor(hi, u2); + u1 = u2; + } + + return hi; + } + } + + static Dictionary ParseServerChallenge(string challenge) + { + var results = new Dictionary(); + + foreach (string part in challenge.Split(',')) + if (part[1] == '=') + results.Add(part[0], part.Substring(2)); + + return results; + } + } +} diff --git a/MySQL.Data/src/Authentication/ScramSha1Mechanism.cs b/MySQL.Data/src/Authentication/ScramSha1Mechanism.cs new file mode 100644 index 000000000..d3e8ca6f8 --- /dev/null +++ b/MySQL.Data/src/Authentication/ScramSha1Mechanism.cs @@ -0,0 +1,72 @@ +// Copyright © 2020, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at + +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Security.Cryptography; + +namespace MySql.Data.MySqlClient.Authentication +{ + /// + /// The SCRAM-SHA-1 SASL mechanism. + /// + /// + /// A salted challenge/response SASL mechanism that uses the HMAC SHA-1 algorithm. + /// + internal class ScramSha1Mechanism : ScramBase + { + /// + /// Initializes a new instance of the class. + /// + /// + /// Creates a new SCRAM-SHA-1 SASL context. + /// + /// The user name. + /// The password. + /// The host. + internal ScramSha1Mechanism(string username, string password, string host) : base(username, password, host) { } + + /// + /// Gets the name of the method. + /// + internal override string MechanismName + { + get { return "SCRAM-SHA-1"; } + } + + protected override KeyedHashAlgorithm CreateHMAC(byte[] key) + { + return new HMACSHA1(key); + } + + protected override byte[] Hash(byte[] str) + { + using (var sha1 = SHA1.Create()) + return sha1.ComputeHash(str); + } + } +} diff --git a/MySQL.Data/src/Authentication/ScramSha256Mechanism.cs b/MySQL.Data/src/Authentication/ScramSha256Mechanism.cs new file mode 100644 index 000000000..807d81853 --- /dev/null +++ b/MySQL.Data/src/Authentication/ScramSha256Mechanism.cs @@ -0,0 +1,72 @@ +// Copyright © 2020, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at + +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Security.Cryptography; + +namespace MySql.Data.MySqlClient.Authentication +{ + /// + /// The SCRAM-SHA-256 SASL mechanism. + /// + /// + /// A salted challenge/response SASL mechanism that uses the HMAC SHA-256 algorithm. + /// + internal class ScramSha256Mechanism : ScramBase + { + /// + /// Initializes a new instance of the class. + /// + /// + /// Creates a new SCRAM-SHA-256 SASL context. + /// + /// The user name. + /// The password. + /// The host. + internal ScramSha256Mechanism(string username, string password, string host) : base(username, password, host) { } + + /// + /// Gets the name of the method. + /// + internal override string MechanismName + { + get { return "SCRAM-SHA-256"; } + } + + protected override KeyedHashAlgorithm CreateHMAC(byte[] key) + { + return new HMACSHA256(key); + } + + protected override byte[] Hash(byte[] str) + { + using (var sha256 = SHA256.Create()) + return sha256.ComputeHash(str); + } + } +} diff --git a/MySQL.Data/src/Authentication/Sha256AuthenticationPlugin.cs b/MySQL.Data/src/Authentication/Sha256AuthenticationPlugin.cs new file mode 100644 index 000000000..b6882ea70 --- /dev/null +++ b/MySQL.Data/src/Authentication/Sha256AuthenticationPlugin.cs @@ -0,0 +1,126 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient.Authentication +{ + /// + /// The implementation of the sha256_password authentication plugin. + /// + internal class Sha256AuthenticationPlugin : MySqlAuthenticationPlugin + { + /// + /// The byte array representation of the public key provided by the server. + /// + protected byte[] rawPubkey; + + public override string PluginName => "sha256_password"; + + protected override Task MoreDataAsync(byte[] data, bool execAsync) + { + rawPubkey = data; + byte[] buffer = GetNonLengthEncodedPassword(); + return Task.FromResult(buffer); + } + + public override object GetPassword() + { + if (Settings.SslMode != MySqlSslMode.Disabled) + { + // send as clear text, since the channel is already encrypted + byte[] passBytes = Encoding.GetBytes(GetMFAPassword()); + byte[] buffer = new byte[passBytes.Length + 2]; + Array.Copy(passBytes, 0, buffer, 1, passBytes.Length); + buffer[0] = (byte)(passBytes.Length + 1); + buffer[buffer.Length - 1] = 0x00; + return buffer; + } + else + { + if (GetMFAPassword().Length == 0) return new byte[1]; + // send RSA encrypted, since the channel is not protected + else if (rawPubkey == null) return new byte[] { 0x01 }; + else if (!Settings.AllowPublicKeyRetrieval) + throw new MySqlException(Resources.RSAPublicKeyRetrievalNotEnabled); + else + { + byte[] bytes = GetRsaPassword(GetMFAPassword(), AuthenticationData, rawPubkey); + if (bytes != null && bytes.Length == 1 && bytes[0] == 0) return null; + return bytes; + } + } + } + + private byte[] GetNonLengthEncodedPassword() + { + // Required for AuthChange requests. + if (Settings.SslMode != MySqlSslMode.Disabled) + { + // Send as clear text, since the channel is already encrypted. + byte[] passBytes = Encoding.GetBytes(GetMFAPassword()); + byte[] buffer = new byte[passBytes.Length + 1]; + Array.Copy(passBytes, 0, buffer, 0, passBytes.Length); + buffer[passBytes.Length] = 0; + return buffer; + } + else return GetPassword() as byte[]; + } + + private byte[] GetRsaPassword(string password, byte[] seedBytes, byte[] rawPublicKey) + { + if (password.Length == 0) return new byte[1]; + // Obfuscate the plain text password with the session scramble + byte[] obfuscated = GetXor(Encoding.Default.GetBytes(password), seedBytes); + // Encrypt the password and send it to the server + RSACryptoServiceProvider rsa = MySqlPemReader.ConvertPemToRSAProvider(rawPublicKey); + if (rsa == null) throw new MySqlException(Resources.UnableToReadRSAKey); + return rsa.Encrypt(obfuscated, true); + } + + /// + /// Applies XOR to the byte arrays provided as input. + /// + /// A byte array that contains the results of the XOR operation. + protected byte[] GetXor(byte[] src, byte[] pattern) + { + byte[] src2 = new byte[src.Length + 1]; + Array.Copy(src, 0, src2, 0, src.Length); + src2[src.Length] = 0; + byte[] result = new byte[src2.Length]; + for (int i = 0; i < src2.Length; i++) + { + result[i] = (byte)(src2[i] ^ (pattern[i % pattern.Length])); + } + return result; + } + } +} diff --git a/MySQL.Data/src/Authentication/Sha256MemoryAuthenticationPlugin.cs b/MySQL.Data/src/Authentication/Sha256MemoryAuthenticationPlugin.cs new file mode 100644 index 000000000..8c6a6161c --- /dev/null +++ b/MySQL.Data/src/Authentication/Sha256MemoryAuthenticationPlugin.cs @@ -0,0 +1,71 @@ +// Copyright © 2018, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Security.Cryptography; +using System.Text; + +namespace MySql.Data.MySqlClient.Authentication +{ + internal class Sha256MemoryAuthenticationPlugin : MySqlAuthenticationPlugin + { + public override string PluginName => "SHA256_MEMORY"; + + public byte[] GetClientHash(string data, byte[] nonce) + { + if (string.IsNullOrEmpty(data)) + return new byte[0]; + + SHA256 sha = SHA256.Create(); + byte[] dataBytes = Encoding.UTF8.GetBytes(data); + byte[] firstHash = sha.ComputeHash(dataBytes); + byte[] secondHash = sha.ComputeHash(firstHash); + byte[] thirdHash = new byte[secondHash.Length + nonce.Length]; + secondHash.CopyTo(thirdHash, 0); + nonce.CopyTo(thirdHash, secondHash.Length); + thirdHash = sha.ComputeHash(thirdHash); + byte[] xor = GetXOr(thirdHash, firstHash); + + return Encoding.UTF8.GetBytes(BitConverter.ToString(xor).Replace("-", "")); + } + + protected byte[] GetXOr(byte[] left, byte[] right) + { + if (left.Length != right.Length) + throw new ArrayTypeMismatchException(); + + byte[] result = new byte[left.Length]; + for (int i = 0; i < left.Length; i++) + { + result[i] = (byte)(left[i] ^ right[i]); + } + + return result; + } + } +} diff --git a/MySQL.Data/src/Authentication/WebAuthnAuthenticationPlugin.cs b/MySQL.Data/src/Authentication/WebAuthnAuthenticationPlugin.cs new file mode 100644 index 000000000..08375cae9 --- /dev/null +++ b/MySQL.Data/src/Authentication/WebAuthnAuthenticationPlugin.cs @@ -0,0 +1,233 @@ +// Copyright © 2023, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Authentication.FIDO; +using Org.BouncyCastle.Utilities.Encoders; +using System; +using System.IO; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient.Authentication +{ + internal class WebAuthnAuthenticationPlugin : MySqlAuthenticationPlugin + { + public override string PluginName => "authentication_webauthn_client"; + + private enum AuthState + { + INITIAL, + REQUEST_CREDENTIAL_ID + } + + // Constants + private const int RANDOM_BYTES_LENGTH = 32; + private const int RELYING_PARTY_ID_MAX_LENGTH = 255; + + // Fields + private string _devicePath; + private string _relyingPartyId; + private string _clientDataJson; + private byte[] _credentialId; + private byte[] _clientDataHash; + private byte[] _challenge; + private AuthState _state; + + protected override void SetAuthData(byte[] data) + { + if (data.Length > 0) + ParseChallenge(data); + else + throw new MySqlException(Resources.FidoRegistrationMissing); + } + + protected byte[] MoreData(byte[] data) + { + switch (_state) + { + default: + case AuthState.INITIAL: + using (var fidoDeviceInfo = new FidoDeviceInfo()) + _devicePath = fidoDeviceInfo.Path; + + SetClientData(); + + using (var fidoDevice = new FidoDevice()) + { + fidoDevice.Open(_devicePath); + + if (fidoDevice.SupportsCredman) + return GetAssertion(fidoDevice); + else + { + _state = AuthState.REQUEST_CREDENTIAL_ID; + return new byte[] { 0x01 }; // status_tag + } + } + + case AuthState.REQUEST_CREDENTIAL_ID: + ParseChallenge(data); + + using (var fidoDevice = new FidoDevice()) + { + fidoDevice.Open(_devicePath); + return GetAssertion(fidoDevice); + } + } + } + + /// + /// Method that parse the challenge received from server during authentication process. + /// This method extracts salt and relying party name. + /// + /// Buffer holding the server challenge. + /// Thrown if an error occurs while parsing the challenge. + private void ParseChallenge(byte[] data) + { + switch (_state) + { + case AuthState.INITIAL: + int pos = 0; + // capability (1 byte flag that will be used in the future) + int capability = data[pos]; + pos++; + + // random bytes (challenge) length should be 32 bytes + int challengeLength = data[pos]; + pos++; + if (challengeLength != RANDOM_BYTES_LENGTH) throw new MySqlException(Resources.FidoChallengeCorrupt); + // client_data_hash + _challenge = new byte[challengeLength]; + Array.Copy(data, pos, _challenge, 0, challengeLength); + pos += challengeLength; + + // relyting_party_id length + int relyingPartyIdLength = data[pos]; + pos++; + if (relyingPartyIdLength > RELYING_PARTY_ID_MAX_LENGTH) throw new MySqlException(Resources.FidoChallengeCorrupt); + // relying_party_id (value defined by the @@authentication_webauth_rp_id variable) + _relyingPartyId = Encoding.GetString(data, pos, relyingPartyIdLength); + + break; + case AuthState.REQUEST_CREDENTIAL_ID: + // credential_id length + int credentialIdLength = data[0]; + // credential_id + _credentialId = new byte[credentialIdLength]; + Array.Copy(data, 1, _credentialId, 0, credentialIdLength); + + break; + } + } + + /// + /// Sets the ClientDataHash for the assertion + /// + private void SetClientData() + { + // The challenge should be encoded in base64 which should be url safe. + string safeUrlEncoded = Encoding.GetString(UrlBase64.Encode(_challenge)); + + // ClientDataHash: + // --------------- + // ClientDataHash is represented as: SHA256(JSON object{ client data}) + // ex: + // SHA256( + // { + // "type": "webauthn.get", + // "challenge": "", + // "origin": "" + // } + // ); + _clientDataJson = $"{{\"type\": \"webauthn.get\"," + + $"\"challenge\":\"{safeUrlEncoded}\"," + + $"\"origin\":\"https://{_relyingPartyId}\"," + + $"\"crossOrigin\":false}}"; + + using (var sha256 = SHA256.Create()) + _clientDataHash = sha256.ComputeHash(Encoding.GetBytes(_clientDataJson)); + } + + /// + /// Method to obtains an assertion from a FIDO device. + /// + /// The assertion. + /// Thrown if an error occurs while getting the assertion. + private byte[] GetAssertion(FidoDevice fidoDevice) + { + byte[] clientDataJson = Encoding.GetBytes(_clientDataJson); + + using (var fidoAssertion = new FidoAssertion()) + { + fidoAssertion.Rp = _relyingPartyId; + fidoAssertion.ClientDataHash = _clientDataHash; + + if (_state == AuthState.REQUEST_CREDENTIAL_ID) + fidoAssertion.AllowCredential(_credentialId); + + if (_driver.Settings.WebAuthnActionRequested != null) + _driver.Settings.WebAuthnActionRequested?.Invoke(); + else + throw new MySqlException(Resources.WebAuthnMissingHandler); + + var task = Task.Run(() => fidoDevice.GetAssert(fidoAssertion)); + // wait for user interaction with FIDO device (15 seconds) + if (!task.Wait(15000)) + throw new MySqlException(Resources.WebAuthnTimeout); + + int responseLength = 0; + int assertionsCount = fidoAssertion.GetAssertCount(); + for (int i = 0; i < assertionsCount; i++) + { + var fidoAssertionStatement = fidoAssertion.GetFidoAssertionStatement(i); + responseLength += Utils.GetLengthSize((ulong)fidoAssertionStatement.SignatureLen) + 1; // +1 for length encoding + responseLength += Utils.GetLengthSize((ulong)fidoAssertionStatement.AuthDataLen) + 1; // +1 for length encoding + } + int clientDataLengthSize = Utils.GetLengthSize((ulong)_clientDataJson.Length); + responseLength += clientDataJson.Length + clientDataLengthSize + 1 + 2; // +1 for status_tag & +2 for number of assertions and length encoding + + var response = new MySqlPacket(new MemoryStream(responseLength)); + response.Write(new byte[] { 0x02 }); // status_tag + response.Write(BitConverter.GetBytes(assertionsCount)); // assertions count + for (int i = 0; i < assertionsCount; i++) + { + var fidoAssertionStatement = fidoAssertion.GetFidoAssertionStatement(i); + response.WriteLength(fidoAssertionStatement.AuthDataLen); + response.Write(fidoAssertionStatement.AuthData.ToArray()); + response.WriteLength(fidoAssertionStatement.SignatureLen); + response.Write(fidoAssertionStatement.Signature.ToArray()); + } + response.WriteLength(clientDataJson.Length); + response.Write(clientDataJson); + + return response.Buffer; + } + } + } +} diff --git a/MySQL.Data/src/Authentication/WindowsAuthenticationPlugin.cs b/MySQL.Data/src/Authentication/WindowsAuthenticationPlugin.cs new file mode 100644 index 000000000..393c52967 --- /dev/null +++ b/MySQL.Data/src/Authentication/WindowsAuthenticationPlugin.cs @@ -0,0 +1,85 @@ +// Copyright © 2012, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Authentication.SSPI; +using System; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient.Authentication +{ + /// + /// Allows connections to a user account set with the authentication_windows authentication plugin. + /// + internal class MySqlWindowsAuthenticationPlugin : MySqlAuthenticationPlugin + { + string targetName = null; + SspiSecurityContext securityContext = null; + + protected override void CheckConstraints() + { + string platform = String.Empty; + + int p = (int)Environment.OSVersion.Platform; + if ((p == 4) || (p == 128)) + platform = "Unix"; + else if (Environment.OSVersion.Platform == PlatformID.MacOSX) + platform = "Mac OS/X"; + + if (!String.IsNullOrEmpty(platform)) + throw new MySqlException(String.Format(Resources.WinAuthNotSupportOnPlatform, platform)); + + base.CheckConstraints(); + } + + public override string GetUsername() + { + string username = Settings.UserID; + if (String.IsNullOrEmpty(username)) + return "auth_windows"; + return username; + } + + public override string PluginName + { + get { return "authentication_windows_client"; } + } + + protected override Task MoreDataAsync(byte[] data, bool execAsync) + { + if (data == null) + securityContext = new SspiSecurityContext(new SspiCredentials("Negotiate")); + + var status = securityContext.InitializeSecurityContext(out byte[] clientBlob, data, targetName); + + if (status == ContextStatus.Accepted) + securityContext.Dispose(); + + return Task.FromResult(clientBlob); + } + } +} diff --git a/MySQL.Data/src/BulkLoader.cs b/MySQL.Data/src/BulkLoader.cs new file mode 100644 index 000000000..3d9d80359 --- /dev/null +++ b/MySQL.Data/src/BulkLoader.cs @@ -0,0 +1,365 @@ +// Copyright © 2006, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + /// + /// Allows importing large amounts of data into a database with bulk loading. + /// + public class MySqlBulkLoader + { + // constant values + private const string defaultFieldTerminator = "\t"; + private const string defaultLineTerminator = "\n"; + private const char defaultEscapeCharacter = '\\'; + + /// + /// Initializes a new instance of the class using the specified instance of . + /// + /// The that will be used to perform the bulk operation. + public MySqlBulkLoader(MySqlConnection connection) + { + Connection = connection; + Local = false; + FieldTerminator = defaultFieldTerminator; + LineTerminator = defaultLineTerminator; + FieldQuotationCharacter = Char.MinValue; + ConflictOption = MySqlBulkLoaderConflictOption.None; + Columns = new List(); + Expressions = new List(); + } + + #region Properties + + /// + /// Gets or sets the connection. + /// + /// The connection. + public MySqlConnection Connection { get; set; } + + /// + /// Gets or sets the field terminator. + /// + /// The field terminator. + public string FieldTerminator { get; set; } + + /// + /// Gets or sets the line terminator. + /// + /// The line terminator. + public string LineTerminator { get; set; } + + /// + /// Gets or sets the name of the table. + /// + /// The name of the table. + public string TableName { get; set; } + + /// + /// Gets or sets the character set. + /// + /// The character set. + public string CharacterSet { get; set; } + + /// + /// Gets or sets the name of the file. + /// + /// The name of the file. + public string FileName { get; set; } + + /// + /// Gets or sets the timeout. + /// + /// The timeout. + public int Timeout { get; set; } + + /// + /// Gets or sets a value indicating whether the file name that is to be loaded + /// is local to the client or not. The default value is false. + /// + /// true if local; otherwise, false. + public bool Local { get; set; } + + /// + /// Gets or sets the number of lines to skip. + /// + /// The number of lines to skip. + public int NumberOfLinesToSkip { get; set; } + + /// + /// Gets or sets the line prefix. + /// + /// The line prefix. + public string LinePrefix { get; set; } + + /// + /// Gets or sets the field quotation character. + /// + /// The field quotation character. + public char FieldQuotationCharacter { get; set; } + + /// + /// Gets or sets a value indicating whether [field quotation optional]. + /// + /// + /// true if [field quotation optional]; otherwise, false. + /// + public bool FieldQuotationOptional { get; set; } + + /// + /// Gets or sets the escape character. + /// + /// The escape character. + public char EscapeCharacter { get; set; } + + /// + /// Gets or sets the conflict option. + /// + /// The conflict option. + public MySqlBulkLoaderConflictOption ConflictOption { get; set; } + + /// + /// Gets or sets the priority. + /// + /// The priority. + public MySqlBulkLoaderPriority Priority { get; set; } + + /// + /// Gets the columns. + /// + /// The columns. + public List Columns { get; } + + /// + /// Gets the expressions. + /// + /// The expressions. + public List Expressions { get; } + + #endregion + + /// + /// Executes the load operation. + /// + /// The number of rows inserted. + public int Load() + { + if (string.IsNullOrWhiteSpace(FileName)) + throw new MySqlException("FileName property of MySqlBulkLoader cannot be null or an empty string."); + + return LoadAsync(null, false).GetAwaiter().GetResult(); + } + + /// + /// Executes the load operation. + /// + /// A object containing the data to be loaded. + /// The number of rows inserted. + public int Load(Stream stream) => LoadAsync(stream, false).GetAwaiter().GetResult(); + + /// + /// Asynchronous version of the load operation. + /// + /// The number of rows inserted. + public Task LoadAsync() => LoadAsync(null, true); + + /// + /// Asynchronous version of the load operation that accepts a data stream. + /// + /// A containing the data to be loaded. + /// The number of rows inserted. + public Task LoadAsync(Stream stream) => LoadAsync(stream, true); + + /// + /// Executes the load operation asynchronously while the cancellation isn't requested. + /// + /// The cancellation token. + /// A containing the data to be loaded. + /// The number of rows inserted. + public Task LoadAsync(Stream stream, CancellationToken cancellationToken) => LoadAsync(stream, true, cancellationToken); + + private async Task LoadAsync(Stream stream, bool execAsync, CancellationToken cancellationToken = default) + { + bool openedConnection = false; + + if (Connection == null) + throw new InvalidOperationException(Resources.ConnectionNotSet); + + // next we open up the connetion if it is not already open + if (Connection.State != ConnectionState.Open) + { + await Connection.OpenAsync(execAsync, cancellationToken).ConfigureAwait(false); + openedConnection = true; + } + + try + { + string sql = BuildSqlCommand(stream is not null); + Connection.driver.BulkLoaderStream = stream; + using MySqlCommand cmd = new MySqlCommand(sql, Connection) { CommandTimeout = Timeout }; + return await cmd.ExecuteNonQueryAsync(execAsync, cancellationToken).ConfigureAwait(false); + } + finally + { + if (stream is not null) + Connection.driver.BulkLoaderStream.Dispose(); + + if (openedConnection) + await Connection.CloseAsync(execAsync).ConfigureAwait(false); + } + } + + private string BuildSqlCommand(bool useStream) + { + StringBuilder sql = new StringBuilder("LOAD DATA "); + if (Priority == MySqlBulkLoaderPriority.Low) + sql.Append("LOW_PRIORITY "); + else if (Priority == MySqlBulkLoaderPriority.Concurrent) + sql.Append("CONCURRENT "); + + if (useStream) + sql.Append("LOCAL INFILE 'MySQLTempFile' "); + else + { + if (Local) + sql.Append("LOCAL "); + + sql.Append("INFILE "); + + if (Path.DirectorySeparatorChar == '\\') + sql.AppendFormat("'{0}' ", FileName.Replace(@"\", @"\\")); + else + sql.AppendFormat("'{0}' ", FileName); + } + + if (ConflictOption == MySqlBulkLoaderConflictOption.Ignore) + sql.Append("IGNORE "); + else if (ConflictOption == MySqlBulkLoaderConflictOption.Replace) + sql.Append("REPLACE "); + + sql.AppendFormat("INTO TABLE {0} ", TableName); + + if (CharacterSet != null) + sql.AppendFormat("CHARACTER SET {0} ", CharacterSet); + + StringBuilder optionSql = new StringBuilder(String.Empty); + if (FieldTerminator != defaultFieldTerminator) + optionSql.AppendFormat("TERMINATED BY '{0}' ", FieldTerminator); + if (FieldQuotationCharacter != Char.MinValue) + optionSql.AppendFormat("{0} ENCLOSED BY '{1}' ", + FieldQuotationOptional ? "OPTIONALLY" : "", FieldQuotationCharacter); + if (EscapeCharacter != defaultEscapeCharacter && + EscapeCharacter != Char.MinValue) + optionSql.AppendFormat("ESCAPED BY '{0}' ", EscapeCharacter); + if (optionSql.Length > 0) + sql.AppendFormat("FIELDS {0}", optionSql.ToString()); + + optionSql = new StringBuilder(String.Empty); + if (!string.IsNullOrEmpty(LinePrefix)) + optionSql.AppendFormat("STARTING BY '{0}' ", LinePrefix); + if (LineTerminator != defaultLineTerminator) + optionSql.AppendFormat("TERMINATED BY '{0}' ", LineTerminator); + if (optionSql.Length > 0) + sql.AppendFormat("LINES {0}", optionSql.ToString()); + + if (NumberOfLinesToSkip > 0) + sql.AppendFormat("IGNORE {0} LINES ", NumberOfLinesToSkip); + + if (Columns.Count > 0) + { + sql.Append("("); + sql.Append(Columns[0]); + for (int i = 1; i < Columns.Count; i++) + sql.AppendFormat(",{0}", Columns[i]); + sql.Append(") "); + } + + if (Expressions.Count > 0) + { + sql.Append("SET "); + sql.Append(Expressions[0]); + for (int i = 1; i < Expressions.Count; i++) + sql.AppendFormat(",{0}", Expressions[i]); + } + + return sql.ToString(); + } + } + + /// + /// Represents the priority set for bulk loading operations. + /// + public enum MySqlBulkLoaderPriority + { + /// + /// This is the default and indicates normal priority + /// + None, + /// + /// Low priority will cause the load operation to wait until all readers of the table + /// have finished. This only affects storage engines that use only table-level locking + /// such as MyISAM, Memory, and Merge. + /// + Low, + /// + /// Concurrent priority is only relevant for MyISAM tables and signals that if the table + /// has no free blocks in the middle that other readers can retrieve data from the table + /// while the load operation is happening. + /// + Concurrent + } + + /// + /// Represents the behavior when conflicts arise during bulk loading operations. + /// + public enum MySqlBulkLoaderConflictOption + { + /// + /// This is the default and indicates normal operation. In the event of a LOCAL load, this + /// is the same as ignore. When the data file is on the server, then a key conflict will + /// cause an error to be thrown and the rest of the data file ignored. + /// + None, + /// + /// Replace column values when a key conflict occurs. + /// + Replace, + /// + /// Ignore any rows where the primary key conflicts. + /// + Ignore + } +} diff --git a/MySQL.Data/src/CharSetMap.cs b/MySQL.Data/src/CharSetMap.cs new file mode 100644 index 000000000..2d4f18e7d --- /dev/null +++ b/MySQL.Data/src/CharSetMap.cs @@ -0,0 +1,244 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + /// + /// Summary description for CharSetMap. + /// + internal class CharSetMap + { + private static Dictionary _defaultCollations; + private static Dictionary _maxLengths; + private static Dictionary _mapping; + private static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1, 1); + + // we use a static constructor here since we only want to init + // the mapping once + static CharSetMap() + { + InitializeMapping(); + } + + public static CharacterSet GetCharacterSet(string charSetName) + { + if (charSetName == null) + throw new ArgumentNullException("CharSetName is null"); + CharacterSet cs = null; + if (_mapping.TryGetValue(charSetName, out var charset)) + cs = charset; + + if (cs == null) + throw new NotSupportedException("Character set '" + charSetName + "' is not supported by .Net Framework."); + return cs; + } + + /// + /// Returns the text encoding for a given MySQL character set name + /// + /// Name of the character set to get the encoding for + /// Encoding object for the given character set name + public static Encoding GetEncoding(string charSetName) + { + try + { + CharacterSet cs = GetCharacterSet(charSetName); + + return Encoding.GetEncoding(cs.name); + } + catch (ArgumentException) + { + return Encoding.GetEncoding("utf-8"); + } + catch (NotSupportedException) + { + return Encoding.GetEncoding("utf-8"); + } + } + + /// + /// Initializes the mapping. + /// + private static void InitializeMapping() + { + LoadCharsetMap(); + } + + private static void LoadCharsetMap() + { + _mapping = new Dictionary(); + + _mapping.Add("latin1", new CharacterSet("windows-1252", 1)); + _mapping.Add("big5", new CharacterSet("big5", 2)); + _mapping.Add("dec8", _mapping["latin1"]); + _mapping.Add("cp850", new CharacterSet("ibm850", 1)); + _mapping.Add("hp8", _mapping["latin1"]); + _mapping.Add("koi8r", new CharacterSet("koi8-u", 1)); + _mapping.Add("latin2", new CharacterSet("latin2", 1)); + _mapping.Add("swe7", _mapping["latin1"]); + _mapping.Add("ujis", new CharacterSet("EUC-JP", 3)); + _mapping.Add("eucjpms", _mapping["ujis"]); + _mapping.Add("sjis", new CharacterSet("sjis", 2)); + _mapping.Add("cp932", _mapping["sjis"]); + _mapping.Add("hebrew", new CharacterSet("hebrew", 1)); + _mapping.Add("tis620", new CharacterSet("windows-874", 1)); + _mapping.Add("euckr", new CharacterSet("euc-kr", 2)); + _mapping.Add("euc_kr", _mapping["euckr"]); + _mapping.Add("koi8u", new CharacterSet("koi8-u", 1)); + _mapping.Add("koi8_ru", _mapping["koi8u"]); + _mapping.Add("gb2312", new CharacterSet("gb2312", 2)); + _mapping.Add("gbk", _mapping["gb2312"]); + _mapping.Add("greek", new CharacterSet("greek", 1)); + _mapping.Add("cp1250", new CharacterSet("windows-1250", 1)); + _mapping.Add("win1250", _mapping["cp1250"]); + _mapping.Add("latin5", new CharacterSet("latin5", 1)); + _mapping.Add("armscii8", _mapping["latin1"]); + _mapping.Add("utf8", new CharacterSet("utf-8", 3)); + _mapping.Add("ucs2", new CharacterSet("UTF-16BE", 2)); + _mapping.Add("cp866", new CharacterSet("cp866", 1)); + _mapping.Add("keybcs2", _mapping["latin1"]); + _mapping.Add("macce", new CharacterSet("x-mac-ce", 1)); + _mapping.Add("macroman", new CharacterSet("x-mac-romanian", 1)); + _mapping.Add("cp852", new CharacterSet("ibm852", 2)); + _mapping.Add("latin7", new CharacterSet("iso-8859-7", 1)); + _mapping.Add("cp1251", new CharacterSet("windows-1251", 1)); + _mapping.Add("win1251ukr", _mapping["cp1251"]); + _mapping.Add("cp1251csas", _mapping["cp1251"]); + _mapping.Add("cp1251cias", _mapping["cp1251"]); + _mapping.Add("win1251", _mapping["cp1251"]); + _mapping.Add("cp1256", new CharacterSet("cp1256", 1)); + _mapping.Add("cp1257", new CharacterSet("windows-1257", 1)); + _mapping.Add("ascii", new CharacterSet("us-ascii", 1)); + _mapping.Add("usa7", _mapping["ascii"]); + _mapping.Add("binary", _mapping["ascii"]); + _mapping.Add("latin3", new CharacterSet("latin3", 1)); + _mapping.Add("latin4", new CharacterSet("latin4", 1)); + _mapping.Add("latin1_de", new CharacterSet("iso-8859-1", 1)); + _mapping.Add("german1", new CharacterSet("iso-8859-1", 1)); + _mapping.Add("danish", new CharacterSet("iso-8859-1", 1)); + _mapping.Add("czech", new CharacterSet("iso-8859-2", 1)); + _mapping.Add("hungarian", new CharacterSet("iso-8859-2", 1)); + _mapping.Add("croat", new CharacterSet("iso-8859-2", 1)); + _mapping.Add("latvian", new CharacterSet("iso-8859-13", 1)); + _mapping.Add("latvian1", new CharacterSet("iso-8859-13", 1)); + _mapping.Add("estonia", new CharacterSet("iso-8859-13", 1)); + _mapping.Add("dos", new CharacterSet("ibm437", 1)); + _mapping.Add("utf8mb3", _mapping["utf8"]); + _mapping.Add("utf8mb4", new CharacterSet("utf-8", 4)); + _mapping.Add("utf16", new CharacterSet("utf-16BE", 2)); + _mapping.Add("utf16le", new CharacterSet("utf-16", 2)); + _mapping.Add("utf32", new CharacterSet("utf-32BE", 4)); + _mapping.Add("gb18030", new CharacterSet("gb18030", 4)); + } + + internal static async Task InitCollectionsAsync(MySqlConnection connection, bool execAsync, CancellationToken cancellationToken = default) + { + _defaultCollations = new Dictionary(); + _maxLengths = new Dictionary(); + + MySqlCommand cmd = new MySqlCommand("SHOW CHARSET", connection); + using (MySqlDataReader reader = await cmd.ExecuteReaderAsync(default, execAsync, cancellationToken).ConfigureAwait(false)) + { + while (await reader.ReadAsync(execAsync, cancellationToken).ConfigureAwait(false)) + { + _defaultCollations.Add(reader.GetString(0), reader.GetString(2)); + _maxLengths.Add(reader.GetString(0), Convert.ToInt32(reader.GetValue(3))); + } + } + } + + internal static async Task GetDefaultCollationAsync(string charset, MySqlConnection connection, bool execAsync, CancellationToken cancellationToken = default) + { + if (execAsync) + await semaphoreSlim.WaitAsync(cancellationToken); + else + semaphoreSlim.Wait(cancellationToken); + + try + { + if (_defaultCollations == null) + await InitCollectionsAsync(connection, execAsync, cancellationToken).ConfigureAwait(false); + } + finally + { + semaphoreSlim.Release(); + } + + return !_defaultCollations.TryGetValue(charset, out string collation) ? null : collation; + } + + internal static async Task GetMaxLengthAsync(string charset, MySqlConnection connection, bool execAsync, CancellationToken cancellationToken = default) + { + if (execAsync) + await semaphoreSlim.WaitAsync(cancellationToken); + else + semaphoreSlim.Wait(cancellationToken); + + try + { + if (_maxLengths == null) + await InitCollectionsAsync(connection, execAsync, cancellationToken).ConfigureAwait(false); + } + finally + { + semaphoreSlim.Release(); + } + + return !_maxLengths.TryGetValue(charset, out int maxLength) ? 1 : maxLength; + } + } + + /// + /// Represents a character set object. + /// + public class CharacterSet + { + public string name; + public int byteCount; + + public CharacterSet(string name, int byteCount) + { + this.name = name; + this.byteCount = byteCount; + } + + public override int GetHashCode() + { + unchecked + { + return ((name != null ? name.GetHashCode() : 0) * 397) ^ byteCount; + } + } + } +} diff --git a/MySQL.Data/src/CompressedStream.cs b/MySQL.Data/src/CompressedStream.cs new file mode 100644 index 000000000..631cbe975 --- /dev/null +++ b/MySQL.Data/src/CompressedStream.cs @@ -0,0 +1,369 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using System; +using System.IO; +using System.IO.Compression; +using System.Net; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + /// + /// Summary description for CompressedStream. + /// + internal class CompressedStream : Stream + { + // writing fields + private Stream baseStream; + private MemoryStream cache; + + // reading fields + private byte[] localByte; + private byte[] inBuffer; + private byte[] lengthBytes; + private WeakReference inBufferRef; + private int inPos; + private int maxInPos; + private DeflateStream compInStream; + + public CompressedStream(Stream baseStream) + { + this.baseStream = baseStream; + localByte = new byte[1]; + lengthBytes = new byte[7]; + cache = new MemoryStream(); + inBufferRef = new WeakReference(inBuffer, false); + } + + #region Properties + + + public override bool CanRead => baseStream.CanRead; + + public override bool CanWrite => baseStream.CanWrite; + + public override bool CanSeek => baseStream.CanSeek; + + public override long Length => baseStream.Length; + + public override long Position + { + get { return baseStream.Position; } + set { baseStream.Position = value; } + } + + #endregion + + public override void Close() + { + base.Close(); + baseStream.Close(); + cache.Dispose(); + } + + public override void SetLength(long value) + { + throw new NotSupportedException(Resources.CSNoSetLength); + } + + public override int ReadByte() + { + try + { + Read(localByte, 0, 1); + return localByte[0]; + } + catch (EndOfStreamException) + { + return -1; + } + } + + public override bool CanTimeout => baseStream.CanTimeout; + + public override int ReadTimeout + { + get + { + return baseStream.ReadTimeout; + } + set + { + baseStream.ReadTimeout = value; + } + } + + public override int WriteTimeout + { + get + { + return baseStream.WriteTimeout; + } + set + { + baseStream.WriteTimeout = value; + } + } + + public override int Read(byte[] buffer, int offset, int count) => ReadAsync(buffer, offset, count, false).GetAwaiter().GetResult(); + + public override Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken = default) => ReadAsync(buffer, offset, count, true); + + private async Task ReadAsync(byte[] buffer, int offset, int count, bool execAsync) + { + if (buffer == null) + throw new ArgumentNullException(nameof(buffer), Resources.BufferCannotBeNull); + if (offset < 0 || offset >= buffer.Length) + throw new ArgumentOutOfRangeException(nameof(offset), Resources.OffsetMustBeValid); + if ((offset + count) > buffer.Length) + throw new ArgumentException(Resources.BufferNotLargeEnough, nameof(buffer)); + + if (inPos == maxInPos) + await PrepareNextPacketAsync(execAsync).ConfigureAwait(false); + + int countToRead = Math.Min(count, maxInPos - inPos); + int countRead; + + if (compInStream != null) + countRead = execAsync + ? await compInStream.ReadAsync(buffer, offset, count).ConfigureAwait(false) + : compInStream.Read(buffer, offset, countToRead); + else + countRead = execAsync + ? await baseStream.ReadAsync(buffer, offset, count).ConfigureAwait(false) + : baseStream.Read(buffer, offset, countToRead); + + inPos += countRead; + + // release the weak reference + if (inPos == maxInPos) + { + compInStream = null; + + if (!Platform.IsMono()) + { + inBufferRef = new WeakReference(inBuffer, false); + inBuffer = null; + } + } + + return countRead; + } + + private async Task PrepareNextPacketAsync(bool execAsync) + { + await MySqlStream.ReadFullyAsync(baseStream, lengthBytes, 0, 7, execAsync).ConfigureAwait(false); + int compressedLength = lengthBytes[0] + (lengthBytes[1] << 8) + (lengthBytes[2] << 16); + // lengthBytes[3] is seq + int unCompressedLength = lengthBytes[4] + (lengthBytes[5] << 8) + + (lengthBytes[6] << 16); + + if (unCompressedLength == 0) + { + unCompressedLength = compressedLength; + compInStream = null; + } + else + { + await ReadNextPacketAsync(compressedLength, execAsync).ConfigureAwait(false); + MemoryStream ms = new MemoryStream(inBuffer, 2, compressedLength - 2); + compInStream = new DeflateStream(ms, CompressionMode.Decompress); + } + + inPos = 0; + maxInPos = unCompressedLength; + } + + private async Task ReadNextPacketAsync(int len, bool execAsync) + { + inBuffer = inBufferRef.Target as byte[]; + + if (inBuffer == null || inBuffer.Length < len) + inBuffer = new byte[len]; + await MySqlStream.ReadFullyAsync(baseStream, inBuffer, 0, len, execAsync).ConfigureAwait(false); + } + + private async Task CompressCacheAsync(bool execAsync) + { + // small arrays almost never yeild a benefit from compressing + if (cache.Length < 50) + return null; + + byte[] cacheBytes = cache.GetBuffer(); + + MemoryStream compressedBuffer = new MemoryStream(); + + compressedBuffer.WriteByte(0x78); + compressedBuffer.WriteByte(0x9c); + var outCompStream = new DeflateStream(compressedBuffer, CompressionMode.Compress, true); + + if (execAsync) + await outCompStream.WriteAsync(cacheBytes, 0, (int)cacheBytes.Length).ConfigureAwait(false); + else + outCompStream.Write(cacheBytes, 0, (int)cache.Length); + + outCompStream.Dispose(); + int adler = IPAddress.HostToNetworkOrder(Adler32(cacheBytes, 0, (int)cache.Length)); + + if (execAsync) + await compressedBuffer.WriteAsync(BitConverter.GetBytes(adler), 0, sizeof(uint)).ConfigureAwait(false); + else + compressedBuffer.Write(BitConverter.GetBytes(adler), 0, sizeof(uint)); + + // if the compression hasn't helped, then just return null + if (compressedBuffer.Length >= cache.Length) + return null; + return compressedBuffer; + } + + int Adler32(byte[] bytes, int index, int length) + { + const uint a32mod = 65521; + uint s1 = 1, s2 = 0; + for (int i = index; i < length; i++) + { + byte b = bytes[i]; + s1 = (s1 + b) % a32mod; + s2 = (s2 + s1) % a32mod; + } + return unchecked((int)((s2 << 16) + s1)); + } + + private async Task CompressAndSendCacheAsync(bool execAsync) + { + long compressedLength, uncompressedLength; + + // we need to save the sequence byte that is written + byte[] cacheBuffer = cache.GetBuffer(); + + byte seq = cacheBuffer[3]; + cacheBuffer[3] = 0; + + // first we compress our current cache + MemoryStream compressedBuffer = await CompressCacheAsync(execAsync).ConfigureAwait(false); + + // now we set our compressed and uncompressed lengths + // based on if our compression is going to help or not + MemoryStream memStream; + + if (compressedBuffer == null) + { + compressedLength = cache.Length; + uncompressedLength = 0; + memStream = cache; + } + else + { + compressedLength = compressedBuffer.Length; + uncompressedLength = cache.Length; + memStream = compressedBuffer; + } + + // Make space for length prefix (7 bytes) at the start of output + long dataLength = memStream.Length; + int bytesToWrite = (int)dataLength + 7; + memStream.SetLength(bytesToWrite); + byte[] buffer = memStream.GetBuffer(); + Array.Copy(buffer, 0, buffer, 7, (int)dataLength); + + // Write length prefix + buffer[0] = (byte)(compressedLength & 0xff); + buffer[1] = (byte)((compressedLength >> 8) & 0xff); + buffer[2] = (byte)((compressedLength >> 16) & 0xff); + buffer[3] = seq; + buffer[4] = (byte)(uncompressedLength & 0xff); + buffer[5] = (byte)((uncompressedLength >> 8) & 0xff); + buffer[6] = (byte)((uncompressedLength >> 16) & 0xff); + + if (execAsync) + { + await baseStream.WriteAsync(buffer, 0, bytesToWrite).ConfigureAwait(false); + await baseStream.FlushAsync().ConfigureAwait(false); + } + else + { + baseStream.Write(buffer, 0, bytesToWrite); + baseStream.Flush(); + } + + cache.SetLength(0); + + compressedBuffer?.Dispose(); + } + + public override void Flush() => FlushAsync(false).GetAwaiter().GetResult(); + + public override Task FlushAsync(CancellationToken cancellationToken) => FlushAsync(true); + + private async Task FlushAsync(bool execAsync) + { + if (!InputDone()) return; + + if (execAsync) + await CompressAndSendCacheAsync(true).ConfigureAwait(false); + else + CompressAndSendCacheAsync(false).GetAwaiter().GetResult(); + } + + private bool InputDone() + { + // if we have not done so yet, see if we can calculate how many bytes we are expecting + if (baseStream is TimedStream && ((TimedStream)baseStream).IsClosed) return false; + if (cache.Length < 4) return false; + byte[] buf = cache.GetBuffer(); + int expectedLen = buf[0] + (buf[1] << 8) + (buf[2] << 16); + if (cache.Length < (expectedLen + 4)) return false; + return true; + } + + public override void WriteByte(byte value) + { + cache.WriteByte(value); + } + + public override void Write(byte[] buffer, int offset, int count) => WriteAsync(buffer, offset, count, false).GetAwaiter().GetResult(); + + public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken = default) => WriteAsync(buffer, offset, count, true); + + private async Task WriteAsync(byte[] buffer, int offset, int count, bool execAsync) + { + if (execAsync) + await cache.WriteAsync(buffer, offset, count).ConfigureAwait(false); + else + cache.Write(buffer, offset, count); + } + + public override long Seek(long offset, SeekOrigin origin) + { + return baseStream.Seek(offset, origin); + } + } +} diff --git a/Source/MySql.Data/Crypt.cs b/MySQL.Data/src/Crypt.cs similarity index 83% rename from Source/MySql.Data/Crypt.cs rename to MySQL.Data/src/Crypt.cs index 27a8ba9fe..3f897479e 100644 --- a/Source/MySql.Data/Crypt.cs +++ b/MySQL.Data/src/Crypt.cs @@ -1,186 +1,187 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Security.Cryptography; - -#if NETCORE10 -using MySql.Data.MySqlClient.Framework.NetCore10; -#else -using System.Text; -#endif - -namespace MySql.Data.MySqlClient -{ - /// - /// Summary description for Crypt. - /// - internal class Crypt - { - /// - /// Simple XOR scramble - /// - /// Source array - /// Index inside source array - /// Destination array - /// Index inside destination array - /// Password used to xor the bits - /// Number of bytes to scramble - private static void XorScramble(byte[] from, int fromIndex, byte[] to, int toIndex, - byte[] password, int length) - { - // make sure we were called properly - if (fromIndex < 0 || fromIndex >= from.Length) - throw new ArgumentException(Resources.IndexMustBeValid, nameof(fromIndex)); - if ((fromIndex + length) > from.Length) - throw new ArgumentException(Resources.FromAndLengthTooBig, nameof(fromIndex)); - if (from == null) - throw new ArgumentException(Resources.BufferCannotBeNull, nameof(@from)); - if (to == null) - throw new ArgumentException(Resources.BufferCannotBeNull, nameof(to)); - if (toIndex < 0 || toIndex >= to.Length) - throw new ArgumentException(Resources.IndexMustBeValid, nameof(toIndex)); - if ((toIndex + length) > to.Length) - throw new ArgumentException(Resources.IndexAndLengthTooBig, nameof(toIndex)); - if (password == null || password.Length < length) - throw new ArgumentException(Resources.PasswordMustHaveLegalChars, nameof(password)); - if (length < 0) - throw new ArgumentException(Resources.ParameterCannotBeNegative, nameof(length)); - - // now perform the work - for (int i = 0; i < length; i++) - to[toIndex++] = (byte)(from[fromIndex++] ^ password[i]); - } - - /// - /// Returns a byte array containing the proper encryption of the - /// given password/seed according to the new 4.1.1 authentication scheme. - /// - /// - /// - /// - public static byte[] Get411Password(string password, string seed) - { - // if we have no password, then we just return 2 zero bytes - if (password.Length == 0) return new byte[1]; - - SHA1 sha = SHA1.Create(); - - byte[] firstHash = sha.ComputeHash(Encoding.Default.GetBytes(password)); - byte[] secondHash = sha.ComputeHash(firstHash); - byte[] seedBytes = Encoding.Default.GetBytes(seed); - - byte[] input = new byte[seedBytes.Length + secondHash.Length]; - Array.Copy(seedBytes, 0, input, 0, seedBytes.Length); - Array.Copy(secondHash, 0, input, seedBytes.Length, secondHash.Length); - byte[] thirdHash = sha.ComputeHash(input); - - byte[] finalHash = new byte[thirdHash.Length + 1]; - finalHash[0] = 0x14; - Array.Copy(thirdHash, 0, finalHash, 1, thirdHash.Length); - - for (int i = 1; i < finalHash.Length; i++) - finalHash[i] = (byte)(finalHash[i] ^ firstHash[i - 1]); - return finalHash; - //byte[] buffer = new byte[finalHash.Length - 1]; - //Array.Copy(finalHash, 1, buffer, 0, finalHash.Length - 1); - //return buffer; - } - - private static double rand(ref long seed1, ref long seed2, long max) - { - seed1 = (seed1 * 3) + seed2; - seed1 %= max; - seed2 = (seed1 + seed2 + 33) % max; - return (seed1 / (double)max); - } - - /// - /// Encrypts a password using the MySql encryption scheme - /// - /// The password to encrypt - /// The encryption seed the server gave us - /// Indicates if we should use the old or new encryption scheme - /// - public static String EncryptPassword(String password, String seed, bool new_ver) - { - long max = 0x3fffffff; - if (!new_ver) - max = 0x01FFFFFF; - if (string.IsNullOrEmpty(password)) - return password; - - long[] hash_seed = Hash(seed); - long[] hash_pass = Hash(password); - - long seed1 = (hash_seed[0] ^ hash_pass[0]) % max; - long seed2 = (hash_seed[1] ^ hash_pass[1]) % max; - if (!new_ver) - seed2 = seed1 / 2; - - char[] scrambled = new char[seed.Length]; - for (int x = 0; x < seed.Length; x++) - { - double r = rand(ref seed1, ref seed2, max); - scrambled[x] = (char)(Math.Floor(r * 31) + 64); - } - - if (new_ver) - { - /* Make it harder to break */ - char extra = (char)Math.Floor(rand(ref seed1, ref seed2, max) * 31); - for (int x = 0; x < scrambled.Length; x++) - scrambled[x] ^= extra; - } - - return new string(scrambled); - } - - /// - /// Hashes a password using the algorithm from Monty's code. - /// The first element in the return is the result of the "old" hash. - /// The second element is the rest of the "new" hash. - /// - /// Password to be hashed - /// Two element array containing the hashed values - private static long[] Hash(String P) - { - long val1 = 1345345333; - long val2 = 0x12345671; - long inc = 7; - - for (int i = 0; i < P.Length; i++) - { - if (P[i] == ' ' || P[i] == '\t') continue; - long temp = (0xff & P[i]); - val1 ^= (((val1 & 63) + inc) * temp) + (val1 << 8); - val2 += (val2 << 8) ^ val1; - inc += temp; - } - - long[] hash = new long[2]; - hash[0] = val1 & 0x7fffffff; - hash[1] = val2 & 0x7fffffff; - return hash; - } - } -} \ No newline at end of file +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Security.Cryptography; +using System.Text; + +namespace MySql.Data.MySqlClient +{ + /// + /// Summary description for Crypt. + /// + internal class Crypt + { + /// + /// Simple XOR scramble + /// + /// Source array + /// Index inside source array + /// Destination array + /// Index inside destination array + /// Password used to xor the bits + /// Number of bytes to scramble + private static void XorScramble(byte[] from, int fromIndex, byte[] to, int toIndex, + byte[] password, int length) + { + // make sure we were called properly + if (fromIndex < 0 || fromIndex >= from.Length) + throw new ArgumentException(Resources.IndexMustBeValid, nameof(fromIndex)); + if ((fromIndex + length) > from.Length) + throw new ArgumentException(Resources.FromAndLengthTooBig, nameof(fromIndex)); + if (from == null) + throw new ArgumentException(Resources.BufferCannotBeNull, nameof(@from)); + if (to == null) + throw new ArgumentException(Resources.BufferCannotBeNull, nameof(to)); + if (toIndex < 0 || toIndex >= to.Length) + throw new ArgumentException(Resources.IndexMustBeValid, nameof(toIndex)); + if ((toIndex + length) > to.Length) + throw new ArgumentException(Resources.IndexAndLengthTooBig, nameof(toIndex)); + if (password == null || password.Length < length) + throw new ArgumentException(Resources.PasswordMustHaveLegalChars, nameof(password)); + if (length < 0) + throw new ArgumentException(Resources.ParameterCannotBeNegative, nameof(length)); + + // now perform the work + for (int i = 0; i < length; i++) + to[toIndex++] = (byte)(from[fromIndex++] ^ password[i]); + } + + /// + /// Returns a byte array containing the proper encryption of the + /// given password/seed according to the new 4.1.1 authentication scheme. + /// + /// + /// + /// + public static byte[] Get411Password(string password, string seed) + { + // if we have no password, then we just return 2 zero bytes + if (password.Length == 0) return new byte[1]; + + SHA1 sha = SHA1.Create(); + + byte[] firstHash = sha.ComputeHash(Encoding.Default.GetBytes(password)); + byte[] secondHash = sha.ComputeHash(firstHash); + byte[] seedBytes = Encoding.Default.GetBytes(seed); + + byte[] input = new byte[seedBytes.Length + secondHash.Length]; + Array.Copy(seedBytes, 0, input, 0, seedBytes.Length); + Array.Copy(secondHash, 0, input, seedBytes.Length, secondHash.Length); + byte[] thirdHash = sha.ComputeHash(input); + + byte[] finalHash = new byte[thirdHash.Length + 1]; + finalHash[0] = 0x14; + Array.Copy(thirdHash, 0, finalHash, 1, thirdHash.Length); + + for (int i = 1; i < finalHash.Length; i++) + finalHash[i] = (byte)(finalHash[i] ^ firstHash[i - 1]); + return finalHash; + //byte[] buffer = new byte[finalHash.Length - 1]; + //Array.Copy(finalHash, 1, buffer, 0, finalHash.Length - 1); + //return buffer; + } + + private static double rand(ref long seed1, ref long seed2, long max) + { + seed1 = (seed1 * 3) + seed2; + seed1 %= max; + seed2 = (seed1 + seed2 + 33) % max; + return (seed1 / (double)max); + } + + /// + /// Encrypts a password using the MySql encryption scheme + /// + /// The password to encrypt + /// The encryption seed the server gave us + /// Indicates if we should use the old or new encryption scheme + /// + public static String EncryptPassword(String password, String seed, bool new_ver) + { + long max = 0x3fffffff; + if (!new_ver) + max = 0x01FFFFFF; + if (string.IsNullOrEmpty(password)) + return password; + + long[] hash_seed = Hash(seed); + long[] hash_pass = Hash(password); + + long seed1 = (hash_seed[0] ^ hash_pass[0]) % max; + long seed2 = (hash_seed[1] ^ hash_pass[1]) % max; + if (!new_ver) + seed2 = seed1 / 2; + + char[] scrambled = new char[seed.Length]; + for (int x = 0; x < seed.Length; x++) + { + double r = rand(ref seed1, ref seed2, max); + scrambled[x] = (char)(Math.Floor(r * 31) + 64); + } + + if (new_ver) + { + /* Make it harder to break */ + char extra = (char)Math.Floor(rand(ref seed1, ref seed2, max) * 31); + for (int x = 0; x < scrambled.Length; x++) + scrambled[x] ^= extra; + } + + return new string(scrambled); + } + + /// + /// Hashes a password using the algorithm from Monty's code. + /// The first element in the return is the result of the "old" hash. + /// The second element is the rest of the "new" hash. + /// + /// Password to be hashed + /// Two element array containing the hashed values + private static long[] Hash(String P) + { + long val1 = 1345345333; + long val2 = 0x12345671; + long inc = 7; + + for (int i = 0; i < P.Length; i++) + { + if (P[i] == ' ' || P[i] == '\t') continue; + long temp = (0xff & P[i]); + val1 ^= (((val1 & 63) + inc) * temp) + (val1 << 8); + val2 += (val2 << 8) ^ val1; + inc += temp; + } + + long[] hash = new long[2]; + hash[0] = val1 & 0x7fffffff; + hash[1] = val2 & 0x7fffffff; + return hash; + } + } +} diff --git a/MySQL.Data/src/Driver.cs b/MySQL.Data/src/Driver.cs new file mode 100644 index 000000000..3ae102d32 --- /dev/null +++ b/MySQL.Data/src/Driver.cs @@ -0,0 +1,569 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using MySql.Data.Types; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Security; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + /// + /// Summary description for BaseDriver. + /// + internal class Driver : IDisposable + { + protected Encoding encoding; + protected MySqlConnectionStringBuilder ConnectionString; + protected DateTime creationTime; + protected string serverCharSet; + protected Dictionary serverProps; + internal int timeZoneOffset; + private bool firstResult; + protected IDriver handler; + internal MySqlDataReader reader; + private bool disposed; + + /// + /// For pooled connections, time when the driver was + /// put into idle queue + /// + public DateTime IdleSince { get; set; } + + public Driver(MySqlConnectionStringBuilder settings) + { + encoding = Encoding.GetEncoding("UTF-8"); + if (encoding == null) + throw new MySqlException(Resources.DefaultEncodingNotFound); + ConnectionString = settings; + serverCharSet = "utf8"; + ConnectionCharSetIndex = -1; + MaxPacketSize = 1024; + handler = new NativeDriver(this); + } + + ~Driver() + { + DisposeAsync(false, false).GetAwaiter().GetResult(); + } + + #region Properties + + public int ThreadID => handler.ThreadId; + + public DBVersion Version => handler.Version; + + public MySqlConnectionStringBuilder Settings + { + get { return ConnectionString; } + set { ConnectionString = value; } + } + public Encoding Encoding + { + get { return encoding; } + set { encoding = value; } + } + + public MySqlPromotableTransaction currentTransaction { get; set; } + + public bool IsInActiveUse { get; set; } + + public bool IsOpen { get; protected set; } + + public MySqlPool Pool { get; set; } + + public long MaxPacketSize { get; protected set; } + + protected internal int ConnectionCharSetIndex { get; set; } + + protected internal Dictionary CharacterSets { get; protected set; } + + public bool SupportsOutputParameters => Version.isAtLeast(5, 5, 0); + + public bool SupportsBatch => (handler.Flags & ClientFlags.MULTI_STATEMENTS) != 0; + + public bool SupportsConnectAttrs => (handler.Flags & ClientFlags.CONNECT_ATTRS) != 0; + + public bool SupportsPasswordExpiration => (handler.Flags & ClientFlags.CAN_HANDLE_EXPIRED_PASSWORD) != 0; + + public bool SupportsQueryAttributes => (handler.Flags & ClientFlags.CLIENT_QUERY_ATTRIBUTES) != 0; + + public bool IsPasswordExpired { get; internal set; } + + public Stream BulkLoaderStream { get; set; } + #endregion + + public string Property(string key) + { + return serverProps[key]; + } + + public bool ConnectionLifetimeExpired() + { + TimeSpan ts = DateTime.Now.Subtract(creationTime); + return Settings.ConnectionLifeTime != 0 && + ts.TotalSeconds > Settings.ConnectionLifeTime; + } + + public static async Task CreateAsync(MySqlConnectionStringBuilder settings, bool execAsync, CancellationToken cancellationToken) + { + Driver d = null; + + try + { + if (settings.Logging || settings.UseUsageAdvisor) + d = new TracingDriver(settings); + } + catch (TypeInitializationException ex) + { + if (ex.InnerException is not SecurityException) + throw; + //Only rethrow if InnerException is not a SecurityException. If it is a SecurityException then + //we couldn't initialize MySqlTrace because we don't have unmanaged code permissions. + } + + d ??= new Driver(settings); + + CancellationTokenSource connTimeoutSource = null; + CancellationTokenSource linkedSource = null; + + if (settings.ConnectionTimeout != 0) + connTimeoutSource = new CancellationTokenSource((int)settings.ConnectionTimeout * 1000); + + if (cancellationToken.CanBeCanceled && connTimeoutSource is not null) + linkedSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, connTimeoutSource.Token); + + var connToken = linkedSource?.Token ?? connTimeoutSource?.Token ?? cancellationToken; + + //this try was added as suggested fix submitted on MySql Bug 72025, socket connections are left in CLOSE_WAIT status when connector fails to open a new connection. + //the bug is present when the client try to get more connections that the server support or has configured in the max_connections variable. + try + { + await d.OpenAsync(execAsync, connToken).ConfigureAwait(false); + } + catch + { + await d.CloseAsync(execAsync).ConfigureAwait(false); + throw; + } + return d; + } + + public bool HasStatus(ServerStatusFlags flag) + { + return (handler.ServerStatus & flag) != 0; + } + + public virtual async Task OpenAsync(bool execAsync, CancellationToken cancellationToken) + { + int count = 0; + do + { + try + { + creationTime = DateTime.Now; + await handler.OpenAsync(execAsync, cancellationToken).ConfigureAwait(false); + IsOpen = true; + break; + } + catch (IOException) + { + if (count++ >= 5) throw; + } + } while (true); + } + + public virtual async Task CloseAsync(bool execAsync) + { + await DisposeAsync(true, execAsync).ConfigureAwait(false); + } + + public virtual async Task ConfigureAsync(MySqlConnection connection, bool execAsync, CancellationToken cancellationToken) + { + bool firstConfigure = false; + + // if we have not already configured our server variables + // then do so now + if (serverProps == null) + { + firstConfigure = true; + + // if we are in a pool and the user has said it's ok to cache the + // properties, then grab it from the pool + try + { + if (Pool != null && Settings.CacheServerProperties) + { + if (Pool.ServerProperties == null) + Pool.ServerProperties = await LoadServerPropertiesAsync(connection, execAsync, cancellationToken).ConfigureAwait(false); + serverProps = Pool.ServerProperties; + } + else + serverProps = await LoadServerPropertiesAsync(connection, execAsync, cancellationToken).ConfigureAwait(false); + + await LoadCharacterSetsAsync(connection, execAsync, cancellationToken).ConfigureAwait(false); + } + catch (MySqlException ex) + { + // expired password capability + if (ex.Number == 1820) + { + IsPasswordExpired = true; + return; + } + throw; + } + } + + // if the user has indicated that we are not to reset + // the connection and this is not our first time through, + // then we are done. + if (!Settings.ConnectionReset && !firstConfigure) return; + + string charSet = ConnectionString.CharacterSet; + if (string.IsNullOrEmpty(charSet)) + { + if (ConnectionCharSetIndex >= 0 && CharacterSets.ContainsKey(ConnectionCharSetIndex)) + charSet = CharacterSets[ConnectionCharSetIndex]; + else + charSet = serverCharSet; + } + + if (serverProps.ContainsKey("max_allowed_packet")) + MaxPacketSize = Convert.ToInt64(serverProps["max_allowed_packet"]); + + // now tell the server which character set we will send queries in and which charset we + // want results in + MySqlCommand charSetCmd = new MySqlCommand("SET character_set_results=NULL", + connection) + { InternallyCreated = true }; + + string clientCharSet; + serverProps.TryGetValue("character_set_client", out clientCharSet); + string connCharSet; + serverProps.TryGetValue("character_set_connection", out connCharSet); + if ((clientCharSet != null && clientCharSet.ToString() != charSet) || + (connCharSet != null && connCharSet.ToString() != charSet)) + { + using MySqlCommand setNamesCmd = new MySqlCommand("SET NAMES " + charSet, connection); + setNamesCmd.InternallyCreated = true; + await setNamesCmd.ExecuteNonQueryAsync(execAsync, cancellationToken).ConfigureAwait(false); + } + // sets character_set_results to null to return values in their original character set + await charSetCmd.ExecuteNonQueryAsync(execAsync, cancellationToken).ConfigureAwait(false); + + Encoding = CharSetMap.GetEncoding(charSet ?? "utf-8"); + + handler.Configure(); + } + + /// + /// Loads the properties from the connected server into a hashtable + /// + /// The connection to be used. + /// Boolean that indicates if the function will be executed asynchronously. + /// The cancellation token. + /// + private async Task> LoadServerPropertiesAsync(MySqlConnection connection, bool execAsync, CancellationToken cancellationToken) + { + // load server properties + Dictionary hash = new Dictionary(); + MySqlCommand cmd = new MySqlCommand(@"SELECT @@max_allowed_packet, @@character_set_client, + @@character_set_connection, @@license, @@sql_mode, @@lower_case_table_names, @@autocommit;", connection); + try + { + using (MySqlDataReader reader = await cmd.ExecuteReaderAsync(default, execAsync, cancellationToken).ConfigureAwait(false)) + { + while (await reader.ReadAsync(execAsync, cancellationToken).ConfigureAwait(false)) + { + for (int i = 0; i <= reader.FieldCount - 1; i++) + { + string key = reader.GetName(i).Remove(0, 2); + string value = reader[i].ToString(); + hash[key] = value; + } + } + } + // Get time zone offset as numerical value + timeZoneOffset = await GetTimeZoneOffsetAsync(connection, execAsync, cancellationToken).ConfigureAwait(false); + return hash; + } + catch (Exception ex) + { + MySqlTrace.LogError(ThreadID, ex.Message); + throw; + } + } + + private async Task GetTimeZoneOffsetAsync(MySqlConnection con, bool execAsync, CancellationToken cancellationToken) + { + MySqlCommand cmd = new MySqlCommand("SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP())", con); + TimeSpan? timeZoneDiff = await cmd.ExecuteScalarAsync(execAsync, cancellationToken).ConfigureAwait(false) as TimeSpan?; + string timeZoneString = "0:00"; + if (timeZoneDiff.HasValue) + timeZoneString = timeZoneDiff.ToString(); + + return int.Parse(timeZoneString.Substring(0, timeZoneString.IndexOf(':')), CultureInfo.InvariantCulture); + } + + /// + /// Loads all the current character set names and ids for this server + /// into the charSets hashtable + /// + private async Task LoadCharacterSetsAsync(MySqlConnection connection, bool execAsync, CancellationToken cancellationToken) + { + serverProps.TryGetValue("autocommit", out var serverAutocommit); + MySqlCommand cmd = new MySqlCommand("SHOW COLLATION", connection); + + // now we load all the currently active collations + try + { + using (MySqlDataReader reader = await cmd.ExecuteReaderAsync(default, execAsync, cancellationToken).ConfigureAwait(false)) + { + CharacterSets = new Dictionary(); + while (await reader.ReadAsync(execAsync, cancellationToken).ConfigureAwait(false)) + { + CharacterSets[Convert.ToInt32(reader["id"], NumberFormatInfo.InvariantInfo)] = + reader.GetString(reader.GetOrdinal("charset")); + } + } + + if (Convert.ToInt32(serverAutocommit) == 0 && Version.isAtLeast(8, 0, 0)) + { + cmd = new MySqlCommand("commit", connection); + await cmd.ExecuteNonQueryAsync(execAsync, cancellationToken).ConfigureAwait(false); + } + } + catch (Exception ex) + { + MySqlTrace.LogError(ThreadID, ex.Message); + throw; + } + } + + public virtual async Task> ReportWarningsAsync(MySqlConnection connection, bool execAsync) + { + List warnings = new List(); + + MySqlCommand cmd = new MySqlCommand("SHOW WARNINGS", connection) { InternallyCreated = true }; + using (MySqlDataReader reader = await cmd.ExecuteReaderAsync(System.Data.CommandBehavior.Default, execAsync, CancellationToken.None).ConfigureAwait(false)) + { + while (await reader.ReadAsync(execAsync).ConfigureAwait(false)) + warnings.Add(new MySqlError(reader.GetString(0), reader.GetInt32(1), reader.GetString(2))); + } + + MySqlInfoMessageEventArgs args = new MySqlInfoMessageEventArgs(); + args.errors = warnings.ToArray(); + connection?.OnInfoMessage(args); + return warnings; + } + + public virtual async Task SendQueryAsync(MySqlPacket p, int paramsPosition, bool execAsync) + { + await handler.SendQueryAsync(p, execAsync, paramsPosition).ConfigureAwait(false); + firstResult = true; + } + + public virtual async Task NextResultAsync(int statementId, bool force, bool execAsync) + { + if (!force && !firstResult && !HasStatus(ServerStatusFlags.AnotherQuery | ServerStatusFlags.MoreResults)) + return null; + firstResult = false; + + int affectedRows = -1; + long insertedId = -1; + var result = await GetResultAsync(statementId, affectedRows, insertedId, execAsync).ConfigureAwait(false); + int fieldCount = result.Item1; + if (fieldCount == -1) + return null; + if (fieldCount > 0) + return await ResultSet.CreateResultSetAsync(this, statementId, fieldCount, execAsync).ConfigureAwait(false); + else + return new ResultSet(result.Item2, result.Item3); + } + + protected virtual async Task> GetResultAsync(int statementId, int affectedRows, long insertedId, bool execAsync) + { + return await handler.GetResultAsync(affectedRows, insertedId, execAsync).ConfigureAwait(false); + } + + public virtual async Task FetchDataRowAsync(int statementId, int columns, bool execAsync) + { + return await handler.FetchDataRowAsync(statementId, columns, execAsync).ConfigureAwait(false); + } + + public virtual async Task SkipDataRowAsync(bool execAsync) + { + return await FetchDataRowAsync(-1, 0, execAsync).ConfigureAwait(false); + } + + public virtual async Task ExecuteDirectAsync(string sql, bool execAsync) + { + MySqlPacket p = new MySqlPacket(Encoding); + await p.WriteStringAsync(sql, execAsync).ConfigureAwait(false); + await SendQueryAsync(p, 0, execAsync).ConfigureAwait(false); + await NextResultAsync(0, false, execAsync).ConfigureAwait(false); + } + + public async Task GetColumnsAsync(int count, bool execAsync) + { + MySqlField[] fields = new MySqlField[count]; + for (int i = 0; i < count; i++) + fields[i] = new MySqlField(this); + await handler.GetColumnsDataAsync(fields, execAsync).ConfigureAwait(false); + + return fields; + } + + public virtual async Task> PrepareStatementAsync(string sql, bool execAsync) + { + return await handler.PrepareStatementAsync(sql, execAsync).ConfigureAwait(false); + } + + public async Task ReadColumnValueAsync(int index, MySqlField field, IMySqlValue value, bool execAsync) + { + return await handler.ReadColumnValueAsync(index, field, value, execAsync).ConfigureAwait(false); + } + + public void SkipColumnValue(IMySqlValue valObject) + { + handler.SkipColumnValue(valObject); + } + + public void ResetTimeout(int timeoutMilliseconds) + { + handler.ResetTimeout(timeoutMilliseconds); + } + + public async Task PingAsync(bool execAsync) + { + return await handler.PingAsync(execAsync).ConfigureAwait(false); + } + + public virtual async Task SetDatabaseAsync(string dbName, bool execAsync) + { + await handler.SetDatabaseAsync(dbName, execAsync).ConfigureAwait(false); + } + + public virtual async Task ExecuteStatementAsync(MySqlPacket packetToExecute, bool execAsync) + { + await handler.ExecuteStatementAsync(packetToExecute, execAsync).ConfigureAwait(false); + } + + + public virtual async Task CloseStatementAsync(int id, bool execAsync) + { + await handler.CloseStatementAsync(id, execAsync).ConfigureAwait(false); + } + + public virtual async Task ResetAsync(bool execAsync) + { + await handler.ResetAsync(execAsync).ConfigureAwait(false); + } + + public virtual async Task CloseQueryAsync(MySqlConnection connection, int statementId, bool execAsync) + { + if (handler.WarningCount > 0) + await ReportWarningsAsync(connection, execAsync).ConfigureAwait(false); + } + + #region IDisposable Members + + protected virtual async Task DisposeAsync(bool disposing, bool execAsync) + { + if (disposed) + return; + + // Avoid cyclic calls to Dispose. + try + { + ResetTimeout(1000); + await handler.CloseAsync(IsOpen, execAsync).ConfigureAwait(false); + // if we are pooling, then release ourselves + if (ConnectionString.Pooling) + MySqlPoolManager.RemoveConnection(this); + } + catch (Exception ex) + { + if (disposing) + { + MySqlException mysqlEx = ex as MySqlException; + if (mysqlEx == null) + MySqlTrace.LogError(0, ex.GetBaseException().Message); + else + MySqlTrace.LogError(mysqlEx.Number, ex.GetBaseException().Message); + } + } + finally + { + disposed = true; + reader = null; + IsOpen = false; + } + } + + public void Dispose() + { + DisposeAsync(true, false).GetAwaiter().GetResult(); + GC.SuppressFinalize(this); + } + + #endregion + } + + internal interface IDriver + { + int ThreadId { get; } + DBVersion Version { get; } + ServerStatusFlags ServerStatus { get; } + ClientFlags Flags { get; } + void Configure(); + Task OpenAsync(bool execAsync, CancellationToken cancellationToken); + Task SendQueryAsync(MySqlPacket packet, bool execAsync, int paramsPosition = 0); + Task CloseAsync(bool isOpen, bool execAsync); + Task PingAsync(bool execAsync); + Task> GetResultAsync(int affectedRows, long insertedId, bool execAsync); + Task FetchDataRowAsync(int statementId, int columns, bool execAsync); + Task> PrepareStatementAsync(string sql, bool execAsync); + Task ExecuteStatementAsync(MySqlPacket packet, bool execAsync); + Task CloseStatementAsync(int statementId, bool execAsync); + Task SetDatabaseAsync(string dbName, bool execAsync); + Task ResetAsync(bool execAsync); + Task ReadColumnValueAsync(int index, MySqlField field, IMySqlValue valObject, bool execAsync); + void SkipColumnValue(IMySqlValue valueObject); + Task GetColumnsDataAsync(MySqlField[] columns, bool execAsync); + void ResetTimeout(int timeout); + int WarningCount { get; } + } +} diff --git a/MySQL.Data/src/Exception.cs b/MySQL.Data/src/Exception.cs new file mode 100644 index 000000000..701ca4bd0 --- /dev/null +++ b/MySQL.Data/src/Exception.cs @@ -0,0 +1,125 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Data.Common; +using System.Runtime.Serialization; + +namespace MySql.Data.MySqlClient +{ + /// + /// The exception that is thrown when MySQL returns an error. This class cannot be inherited. + /// + /// + /// + /// This class is created whenever the MySQL Data Provider encounters an error generated from the server. + /// + /// + /// Any open connections are not automatically closed when an exception is thrown. If + /// the client application determines that the exception is fatal, it should close any open + /// objects or objects. + /// + /// + [Serializable] + public sealed class MySqlException : DbException + { + internal MySqlException() + { + } + + internal MySqlException(string msg) + : base(msg) + { + } + + internal MySqlException(string msg, Exception ex) + : base(msg, ex) + { + } + + internal MySqlException(string msg, bool isFatal, Exception inner) + : base(msg, inner) + { + IsFatal = isFatal; + } + + internal MySqlException(string msg, int errno, Exception inner) + : this(msg, inner) + { + Number = errno; + Data.Add("Server Error Code", errno); + } + + internal MySqlException(string msg, int errno, bool isFatal) + : this(msg) + { + Number = errno; + IsFatal = isFatal; + Data.Add("Server Error Code", errno); + } + + internal MySqlException(string msg, int errno) + : this(msg, errno, null) + { + } + + internal MySqlException(UInt32 code, string sqlState, string msg) : base(msg) + { + Code = code; + SqlState = sqlState; + } + + private MySqlException(SerializationInfo info, StreamingContext context) + : base(info, context) + { + } + + /// + /// Gets a number that identifies the type of error. + /// + public int Number { get; } + + /// + /// True if this exception was fatal and cause the closing of the connection, false otherwise. + /// + internal bool IsFatal { get; } + + internal bool IsQueryAborted => (Number == (int)MySqlErrorCode.QueryInterrupted || + Number == (int)MySqlErrorCode.FileSortAborted); + + /// + /// Gets the SQL state. + /// + public string SqlState { get; private set; } + + /// + /// Gets an integer that representes the MySQL error code. + /// + public UInt32 Code { get; private set; } + } +} diff --git a/MySQL.Data/src/Failover/FailoverGroup.cs b/MySQL.Data/src/Failover/FailoverGroup.cs new file mode 100644 index 000000000..34d8765f8 --- /dev/null +++ b/MySQL.Data/src/Failover/FailoverGroup.cs @@ -0,0 +1,93 @@ +// Copyright © 2017, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Collections.Generic; + +namespace MySql.Data.Failover +{ + internal abstract class FailoverGroup + { + #region Properties + + /// + /// Gets and sets the host list. + /// + protected internal List Hosts { get; set; } + + /// + /// Gets the active host. + /// + protected internal FailoverServer ActiveHost + { + get + { + if (Hosts == null) + return null; + + if (_activeHost != null) + return _activeHost; + + foreach (var host in Hosts) + { + if (host.IsActive) + return host; + } + + return null; + } + } + + #endregion + + #region Fields + + /// + /// Active host. + /// + protected internal FailoverServer _activeHost; + + #endregion + + internal FailoverGroup(List hosts) + { + Hosts = hosts; + SetInitialActiveServer(); + } + + /// + /// Sets the initial active host. + /// + protected internal abstract void SetInitialActiveServer(); + + /// + /// Determines the next host. + /// + /// object that represents the next available host. + protected internal abstract FailoverServer GetNextHost(); + } +} diff --git a/MySQL.Data/src/Failover/FailoverManager.cs b/MySQL.Data/src/Failover/FailoverManager.cs new file mode 100644 index 000000000..faba5ad35 --- /dev/null +++ b/MySQL.Data/src/Failover/FailoverManager.cs @@ -0,0 +1,395 @@ +// Copyright © 2017, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySqlX.Sessions; +using MySqlX.XDevAPI; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.Data.Failover +{ + /// + /// Implements common elements that allow to manage the hosts available for client side failover. + /// + internal static class FailoverManager + { + /// + /// Gets and sets the failover group which consists of a host list. + /// + internal static FailoverGroup FailoverGroup { get; private set; } + + /// + /// Resets the manager. + /// + internal static void Reset() + { + if (FailoverGroup != null) + FailoverGroup = null; + } + + /// + /// Sets the host list to be used during failover operations. + /// + /// The host list. + /// The failover method. + internal static void SetHostList(List hostList, FailoverMethod failoverMethod) + { + if (FailoverGroup != null) + return; + + switch (failoverMethod) + { + case FailoverMethod.Sequential: + FailoverGroup = new SequentialFailoverGroup(hostList); + break; + case FailoverMethod.Priority: + FailoverGroup = new SequentialFailoverGroup(hostList.OrderByDescending(o => o.Priority).ToList()); + break; + case FailoverMethod.Random: + FailoverGroup = new RandomFailoverGroup(hostList); + break; + } + } + + /// + /// Attempts to establish a connection to a host specified from the list. + /// + /// The original connection string set by the user. + /// An out parameter that stores the updated connection string. + /// A object in case this is a pooling scenario. + /// A flag indicating if the default port is used in the connection. + /// An instance if the connection was succesfully established, a exception is thrown otherwise. + internal static InternalSession AttemptConnectionXProtocol(string originalConnectionString, out string connectionString, bool isDefaultPort, Client client = null) + { + connectionString = null; + + if (FailoverGroup == null || originalConnectionString == null) + return null; + + if (client != null) + { + if (client.Hosts == null) + { + client.Hosts = FailoverGroup.Hosts; + client.DemotedHosts = new ConcurrentQueue(); + } + else + { + FailoverGroup.Hosts = client.Hosts; + } + } + + FailoverServer currentHost = FailoverGroup.ActiveHost; + FailoverServer initialHost = currentHost; + MySqlXConnectionStringBuilder Settings = null; + InternalSession internalSession = null; + int attempts = 0; + + do + { + // Attempt to connect to each host by retrieving the next host based on the failover method being used. + connectionString = originalConnectionString.Contains("server") ? + originalConnectionString.Replace(originalConnectionString.Split(';').First(p => p.Contains("server")).Split('=')[1], currentHost.Host) : + "server=" + currentHost.Host + ";" + originalConnectionString; + if (currentHost != null && currentHost.Port != -1) + connectionString = connectionString.Replace(connectionString.Split(';').First(p => p.Contains("port")).Split('=')[1], currentHost.Port.ToString()); + Settings = new MySqlXConnectionStringBuilder(connectionString, isDefaultPort); + + try + { + internalSession = InternalSession.GetSession(Settings); + } + catch (Exception ex) + { + if (ex.GetType() == typeof(MySqlException) && attempts == FailoverGroup.Hosts.Count) + throw; + } + + if (internalSession != null) + break; + + var tmpHost = currentHost; + currentHost = FailoverGroup.GetNextHost(); + + if (client != null) + { + tmpHost.DemotedTime = DateTime.Now; + client.Hosts.Remove(tmpHost); + client.DemotedHosts.Enqueue(tmpHost); + + if (client.DemotedServersTimer == null) + client.DemotedServersTimer = new Timer(new TimerCallback(client.ReleaseDemotedHosts), + null, Client.DEMOTED_TIMEOUT, Timeout.Infinite); + } + + attempts++; + } + while (!currentHost.Equals(initialHost)); + + // All connection attempts failed. + if (internalSession == null) + throw new MySqlException(Resources.UnableToConnectToHost); + + return internalSession; + } + + /// + /// Attempts to establish a connection to a host specified from the list. + /// + /// MySqlConnection object where the new driver will be assigned + /// The original connection string set by the user. + /// An out parameter that stores the updated connection string. + /// A in case this is a pooling scenario."/> + internal static async Task AttemptConnectionAsync(MySqlConnection connection, string originalConnectionString, bool execAsync, CancellationToken cancellationToken, bool mySqlPoolManager = false) + { + if (mySqlPoolManager) + if (MySqlPoolManager.Hosts == null) + { + MySqlPoolManager.Hosts = FailoverGroup.Hosts; + MySqlPoolManager.DemotedHosts = new ConcurrentQueue(); + } + else + FailoverGroup.Hosts = MySqlPoolManager.Hosts; + + FailoverServer currentHost = FailoverGroup.ActiveHost; + FailoverServer initialHost = currentHost; + Driver driver = null; + int attempts = 0; + MySqlConnectionStringBuilder msb; + string connectionString; + + do + { + // Attempt to connect to each host by retrieving the next host based on the failover method being used + connectionString = "server=" + currentHost.Host + ";" + originalConnectionString.Substring(originalConnectionString.IndexOf(';') + 1); + if (currentHost != null && currentHost.Port != -1) + connectionString += ";port=" + currentHost.Port; + msb = new MySqlConnectionStringBuilder(connectionString, connection.IsConnectionStringAnalyzed); + + if ((FailoverGroup.Hosts.Count == 1 && !mySqlPoolManager) || + (mySqlPoolManager && MySqlPoolManager.Hosts.Count == 1 && MySqlPoolManager.DemotedHosts.IsEmpty)) + return msb.ConnectionString; + + try + { + driver = await Driver.CreateAsync(msb, execAsync, cancellationToken).ConfigureAwait(false); + if (!mySqlPoolManager) + connection.driver = driver; + break; + } + catch (Exception ex) + { + if (ex.GetType() == typeof(MySqlException) && attempts == FailoverGroup.Hosts.Count) + throw; + } + + var tmpHost = currentHost; + currentHost = FailoverGroup.GetNextHost(); + + if (mySqlPoolManager) + { + tmpHost.DemotedTime = DateTime.Now; + MySqlPoolManager.Hosts.Remove(tmpHost); + MySqlPoolManager.DemotedHosts.Enqueue(tmpHost); + + if (MySqlPoolManager.DemotedServersTimer == null) + MySqlPoolManager.DemotedServersTimer = new Timer(new TimerCallback(MySqlPoolManager.ReleaseDemotedHosts), + null, MySqlPoolManager.DEMOTED_TIMEOUT, Timeout.Infinite); + } + + attempts++; + } while (!currentHost.Equals(initialHost)); + + // All connection attempts failed. + if (driver == null) + throw new MySqlException(Resources.UnableToConnectToHost); + + return msb.ConnectionString; + } + + /// + /// Creates a if more than one host is found. + /// + /// A string containing an unparsed list of hosts. + /// true if the connection is X Protocol; otherwise false. + /// true if the connection data is a URI; otherwise false. + /// The number of hosts found, -1 if an error was raised during parsing. + internal static int ParseHostList(string hierPart, bool isXProtocol, bool connectionDataIsUri = true) + { + if (string.IsNullOrWhiteSpace(hierPart)) return -1; + + int hostCount = -1; + FailoverMethod failoverMethod = FailoverMethod.Random; + string[] hostArray = null; + List hostList = new List(); + hierPart = hierPart.Replace(" ", ""); + + if (!hierPart.StartsWith("(") && !hierPart.EndsWith(")")) + { + hostArray = hierPart.Split(','); + if (hostArray.Length == 1) + return 1; + + foreach (var host in hostArray) + hostList.Add(ConvertToFailoverServer(host, connectionDataIsUri: connectionDataIsUri)); + + hostCount = hostArray.Length; + } + else + { + string[] groups = hierPart.Split(new string[] { "),(" }, StringSplitOptions.RemoveEmptyEntries); + bool? allHavePriority = null; + int defaultPriority = -1; + foreach (var group in groups) + { + // Remove leading parenthesis. + var normalizedGroup = group; + if (normalizedGroup.StartsWith("(")) + normalizedGroup = group.Substring(1); + + if (normalizedGroup.EndsWith(")")) + normalizedGroup = normalizedGroup.Substring(0, normalizedGroup.Length - 1); + + string[] items = normalizedGroup.Split(','); + string[] keyValuePairs = items[0].Split('='); + if (keyValuePairs[0].ToLowerInvariant() != "address") + throw new KeyNotFoundException(string.Format(ResourcesX.KeywordNotFound, "address")); + + string host = keyValuePairs[1]; + if (string.IsNullOrWhiteSpace(host)) + throw new ArgumentNullException("server"); + + if (items.Length == 2) + { + if (allHavePriority != null && allHavePriority == false) + throw new ArgumentException(ResourcesX.PriorityForAllOrNoHosts); + + allHavePriority = allHavePriority ?? true; + keyValuePairs = items[1].Split('='); + if (keyValuePairs[0].ToLowerInvariant() != "priority") + throw new KeyNotFoundException(string.Format(ResourcesX.KeywordNotFound, "priority")); + + if (string.IsNullOrWhiteSpace(keyValuePairs[1])) + throw new ArgumentNullException("priority"); + + int priority = -1; + Int32.TryParse(keyValuePairs[1], out priority); + if (priority < 0 || priority > 100) + throw new ArgumentException(ResourcesX.PriorityOutOfLimits); + + if (isXProtocol) + hostList.Add(ConvertToFailoverServer(BaseSession.IsUnixSocket(host) ? BaseSession.NormalizeUnixSocket(host) : host, priority, connectionDataIsUri: connectionDataIsUri)); + else + hostList.Add(ConvertToFailoverServer(host, priority)); + } + else + { + if (allHavePriority != null && allHavePriority == true) + throw new ArgumentException(ResourcesX.PriorityForAllOrNoHosts); + + allHavePriority = allHavePriority ?? false; + + hostList.Add(ConvertToFailoverServer(host, defaultPriority, connectionDataIsUri: connectionDataIsUri)); + } + } + + hostCount = groups.Length; + if (hostList.GroupBy(h => h.Priority).ToList().Count > 1) + failoverMethod = FailoverMethod.Priority; + else + failoverMethod = FailoverMethod.Random; + } + + SetHostList(hostList, failoverMethod); + return hostCount; + } + + /// + /// Creates a object based on the provided parameters. + /// + /// The host string that can be a simple host name or a host name and port. + /// The priority of the host. + /// The port number of the host. + /// true if the connection data is a URI; otherwise false. + /// + private static FailoverServer ConvertToFailoverServer(string host, int priority = -1, int port = -1, bool connectionDataIsUri = true) + { + host = host.Trim(); + int colonIndex = -1; + if (IPAddress.TryParse(host, out IPAddress address)) + { + switch (address.AddressFamily) + { + case System.Net.Sockets.AddressFamily.InterNetworkV6: + if (host.StartsWith("[") && host.Contains("]") && !host.EndsWith("]")) + colonIndex = host.LastIndexOf(":"); + + break; + default: + colonIndex = host.IndexOf(":"); + break; + } + } + else + colonIndex = host.IndexOf(":"); + + if (colonIndex != -1) + { + if (!connectionDataIsUri) + throw new ArgumentException(ResourcesX.PortNotSupported); + + int.TryParse(host.Substring(colonIndex + 1), out port); + host = host.Substring(0, colonIndex); + } + + return new FailoverServer(host, port, priority); + } + } + + internal enum FailoverMethod + { + /// + /// Attempts the next host in the list. Moves to the first element if the end of the list is reached. + /// + Sequential, + /// + /// Determines the next host on which to attempt a connection by checking the value of the Priority property in descending order. + /// + Priority, + /// + /// Determines the next host on which to attempt a connection randomly. + /// + Random + } +} diff --git a/MySQL.Data/src/Failover/FailoverServer.cs b/MySQL.Data/src/Failover/FailoverServer.cs new file mode 100644 index 000000000..b0e7a7fb2 --- /dev/null +++ b/MySQL.Data/src/Failover/FailoverServer.cs @@ -0,0 +1,92 @@ +// Copyright © 2017, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using System; + +namespace MySql.Data.Failover +{ + /// + /// Depicts a host which can be failed over to. + /// + internal class FailoverServer : IEquatable + { + #region Properties + + /// + /// Gets and sets the name or address of the host. + /// + internal string Host { get; private set; } + /// + /// Gets and sets the port number. + /// + internal int Port { get; private set; } + /// + /// Gets a value between 0 and 100 which represents the priority of the host. + /// + internal int Priority { get; private set; } + /// + /// Flag to indicate if this host is currently being used. + /// + internal bool IsActive { get; set; } + /// + /// Flag to indicate if this host has been attempted to connection. + /// + internal bool Attempted { get; set; } + /// + /// Time since the host has been demoted. + /// + internal DateTime DemotedTime { get; set; } + + #endregion + + /// + /// Initializes a object. + /// + /// The host. + /// The port. + /// The priority. + internal FailoverServer(string host, int port, int? priority) + { + this.Host = host; + this.Port = port; + this.Priority = priority ?? -1; + } + + /// + /// Compares two objects of type . + /// + /// FailoverServer object to compare. + /// True if host properties are the same. Otherwise, false. + public bool Equals(FailoverServer other) + { + if (other == null) return false; + return (this.Host == other.Host && this.Port == other.Port); + } + } +} diff --git a/MySQL.Data/src/Failover/RandomFailoverGroup.cs b/MySQL.Data/src/Failover/RandomFailoverGroup.cs new file mode 100644 index 000000000..66db9d1ef --- /dev/null +++ b/MySQL.Data/src/Failover/RandomFailoverGroup.cs @@ -0,0 +1,99 @@ +// Copyright © 2019, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Collections.Generic; + +namespace MySql.Data.Failover +{ + /// + /// Manages the hosts available for client side failover using the Random Failover method. + /// The Random Failover method attempts to connect to the hosts specified in the list randomly until all the hosts have been attempted. + /// + internal class RandomFailoverGroup : FailoverGroup + { + /// + /// The initial host taken from the list. + /// + private FailoverServer _initialHost; + /// + /// The host for the current connection attempt. + /// + private FailoverServer _currentHost; + /// + /// Random object to get the next host. + /// + private readonly Random rnd = new Random(); + + + public RandomFailoverGroup(List hosts) : base(hosts) { } + + /// + /// Sets the initial active host. + /// + protected internal override void SetInitialActiveServer() + { + if (Hosts == null || Hosts.Count == 0) + throw new MySqlException(Resources.Replication_NoAvailableServer); + + var initialIndex = rnd.Next(Hosts.Count); + _initialHost = Hosts[initialIndex]; + + _initialHost.IsActive = true; + _initialHost.Attempted = true; + _activeHost = _initialHost; + _currentHost = _activeHost; + } + + /// + /// Determines the next host. + /// + /// A object that represents the next available host. + protected internal override FailoverServer GetNextHost() + { + if (Hosts == null || Hosts?.Count == 0) + throw new MySqlException(Resources.Replication_NoAvailableServer); + + Hosts.Find(h => h.Host == _currentHost.Host && h.Port == _currentHost.Port).IsActive = false; + var notAttemptedHosts = Hosts.FindAll(h => h.Attempted == false); + + if (notAttemptedHosts.Count > 0) + { + _activeHost = notAttemptedHosts[rnd.Next(notAttemptedHosts.Count)]; + _activeHost.IsActive = true; + _activeHost.Attempted = true; + _currentHost = _activeHost; + } + else + _activeHost = _initialHost; + + return _activeHost; + } + } +} diff --git a/MySQL.Data/src/Failover/SequentialFailoverGroup.cs b/MySQL.Data/src/Failover/SequentialFailoverGroup.cs new file mode 100644 index 000000000..998b077c5 --- /dev/null +++ b/MySQL.Data/src/Failover/SequentialFailoverGroup.cs @@ -0,0 +1,97 @@ +// Copyright © 2017, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System.Collections.Generic; + +namespace MySql.Data.Failover +{ + /// + /// Manages the hosts available for client side failover using the Sequential Failover method. + /// The Sequential Failover method attempts to connect to the hosts specified in the list one after another until the initial host is reached. + /// + internal class SequentialFailoverGroup : FailoverGroup + { + /// + /// The initial host taken from the list. + /// + private FailoverServer _initialHost; + /// + /// The index of the current host. + /// + private int _hostIndex; + /// + /// The host for the current connection attempt. + /// + private FailoverServer _currentHost; + + public SequentialFailoverGroup(List hosts) : base(hosts) + { + _hostIndex = 0; + } + + /// + /// Sets the initial active host. + /// + protected internal override void SetInitialActiveServer() + { + if (Hosts == null || Hosts.Count == 0) + throw new MySqlException(Resources.Replication_NoAvailableServer); + + _initialHost = Hosts[0]; + Hosts[0].IsActive = true; + _activeHost = Hosts[0]; + _currentHost = _activeHost; + } + + /// + /// Determines the next host. + /// + /// A object that represents the next available host. + protected internal override FailoverServer GetNextHost() + { + if (Hosts == null || Hosts?.Count == 0) + throw new MySqlException(Resources.Replication_NoAvailableServer); + + var currentServer = Hosts.Find(h => h.Host == _currentHost.Host && h.Port == _currentHost.Port); + currentServer.IsActive = false; + _hostIndex = Hosts.IndexOf(currentServer); + if (Hosts.Count > 1) + { + _activeHost = _hostIndex == Hosts.Count - 1 ? Hosts[0] : Hosts[_hostIndex + 1]; + _activeHost.IsActive = true; + _currentHost = _activeHost; + _hostIndex++; + } + else + _activeHost = _initialHost; + + return _activeHost; + } + } +} diff --git a/Source/MySql.Data/Field.cs b/MySQL.Data/src/Field.cs similarity index 79% rename from Source/MySql.Data/Field.cs rename to MySQL.Data/src/Field.cs index bb5686582..29966d31b 100644 --- a/Source/MySql.Data/Field.cs +++ b/MySQL.Data/src/Field.cs @@ -1,352 +1,369 @@ -// Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using System.Text.RegularExpressions; -using MySql.Data.Common; -using MySql.Data.Types; - -namespace MySql.Data.MySqlClient -{ - [Flags] - internal enum ColumnFlags : int - { - NOT_NULL = 1, - PRIMARY_KEY = 2, - UNIQUE_KEY = 4, - MULTIPLE_KEY = 8, - BLOB = 16, - UNSIGNED = 32, - ZERO_FILL = 64, - BINARY = 128, - ENUM = 256, - AUTO_INCREMENT = 512, - TIMESTAMP = 1024, - SET = 2048, - NUMBER = 32768 - } ; - - /// - /// Summary description for Field. - /// - internal class MySqlField - { - #region Fields - - // public fields - public string CatalogName; - public int ColumnLength; - public string ColumnName; - public string OriginalColumnName; - public string TableName; - public string RealTableName; - public string DatabaseName; - public Encoding Encoding; - - // protected fields - protected int charSetIndex; - protected DBVersion connVersion; - protected Driver driver; - protected bool binaryOk; - - #endregion - - public MySqlField(Driver driver) - { - this.driver = driver; - connVersion = driver.Version; - MaxLength = 1; - binaryOk = true; - } - - #region Properties - - public int CharacterSetIndex - { - get { return charSetIndex; } - set { charSetIndex = value; SetFieldEncoding(); } - } - - public MySqlDbType Type { get; protected set; } - - public byte Precision { get; set; } - - public byte Scale { get; set; } - - public int MaxLength { get; set; } - - public ColumnFlags Flags { get; protected set; } - - public bool IsAutoIncrement => (Flags & ColumnFlags.AUTO_INCREMENT) > 0; - - public bool IsNumeric => (Flags & ColumnFlags.NUMBER) > 0; - - public bool AllowsNull => (Flags & ColumnFlags.NOT_NULL) == 0; - - public bool IsUnique => (Flags & ColumnFlags.UNIQUE_KEY) > 0; - - public bool IsPrimaryKey => (Flags & ColumnFlags.PRIMARY_KEY) > 0; - - public bool IsBlob => (Type >= MySqlDbType.TinyBlob && - Type <= MySqlDbType.Blob) || - (Type >= MySqlDbType.TinyText && - Type <= MySqlDbType.Text) || - (Flags & ColumnFlags.BLOB) > 0; - - public bool IsBinary => binaryOk && (CharacterSetIndex == 63); - - public bool IsUnsigned => (Flags & ColumnFlags.UNSIGNED) > 0; - - public bool IsTextField => Type == MySqlDbType.VarString || Type == MySqlDbType.VarChar || - Type == MySqlDbType.String || (IsBlob && !IsBinary); - - private int CharacterLength => ColumnLength / MaxLength; - - public List TypeConversions { get; } = new List(); - - #endregion - - public void SetTypeAndFlags(MySqlDbType type, ColumnFlags flags) - { - Flags = flags; - Type = type; - - if (String.IsNullOrEmpty(TableName) && String.IsNullOrEmpty(RealTableName) && - IsBinary && driver.Settings.FunctionsReturnString) - { - CharacterSetIndex = driver.ConnectionCharSetIndex; - } - - // if our type is an unsigned number, then we need - // to bump it up into our unsigned types - // we're trusting that the server is not going to set the UNSIGNED - // flag unless we are a number - if (IsUnsigned) - { - switch (type) - { - case MySqlDbType.Byte: - Type = MySqlDbType.UByte; - return; - case MySqlDbType.Int16: - Type = MySqlDbType.UInt16; - return; - case MySqlDbType.Int24: - Type = MySqlDbType.UInt24; - return; - case MySqlDbType.Int32: - Type = MySqlDbType.UInt32; - return; - case MySqlDbType.Int64: - Type = MySqlDbType.UInt64; - return; - } - } - - if (IsBlob) - { - // handle blob to UTF8 conversion if requested. This is only activated - // on binary blobs - if (IsBinary && driver.Settings.TreatBlobsAsUTF8) - { - bool convertBlob = false; - Regex includeRegex = driver.Settings.GetBlobAsUTF8IncludeRegex(); - Regex excludeRegex = driver.Settings.GetBlobAsUTF8ExcludeRegex(); - if (includeRegex != null && includeRegex.IsMatch(ColumnName)) - convertBlob = true; - else if (includeRegex == null && excludeRegex != null && - !excludeRegex.IsMatch(ColumnName)) - convertBlob = true; - - if (convertBlob) - { - binaryOk = false; - Encoding = System.Text.Encoding.GetEncoding("UTF-8"); - charSetIndex = -1; // lets driver know we are in charge of encoding - MaxLength = 4; - } - } - - if (!IsBinary) - { - if (type == MySqlDbType.TinyBlob) - Type = MySqlDbType.TinyText; - else if (type == MySqlDbType.MediumBlob) - Type = MySqlDbType.MediumText; - else if (type == MySqlDbType.Blob) - Type = MySqlDbType.Text; - else if (type == MySqlDbType.LongBlob) - Type = MySqlDbType.LongText; - } - } - - // now determine if we really should be binary - if (driver.Settings.RespectBinaryFlags) - CheckForExceptions(); - - if (Type == MySqlDbType.String && CharacterLength == 36 && !driver.Settings.OldGuids) - Type = MySqlDbType.Guid; - - if (!IsBinary) return; - - if (driver.Settings.RespectBinaryFlags) - { - if (type == MySqlDbType.String) - Type = MySqlDbType.Binary; - else if (type == MySqlDbType.VarChar || - type == MySqlDbType.VarString) - Type = MySqlDbType.VarBinary; - } - - if (CharacterSetIndex == 63) - CharacterSetIndex = driver.ConnectionCharSetIndex; - - if (Type == MySqlDbType.Binary && ColumnLength == 16 && driver.Settings.OldGuids) - Type = MySqlDbType.Guid; - } - - public void AddTypeConversion(Type t) - { - if (TypeConversions.Contains(t)) return; - TypeConversions.Add(t); - } - - private void CheckForExceptions() - { - string colName = String.Empty; - if (OriginalColumnName != null) - colName = StringUtility.ToUpperInvariant(OriginalColumnName); - if (colName.StartsWith("CHAR(", StringComparison.Ordinal)) - binaryOk = false; - } - - public IMySqlValue GetValueObject() - { - IMySqlValue v = GetIMySqlValue(Type); - if (v is MySqlByte && ColumnLength == 1 && driver.Settings.TreatTinyAsBoolean) - { - MySqlByte b = (MySqlByte)v; - b.TreatAsBoolean = true; - v = b; - } - else if (v is MySqlGuid) - { - MySqlGuid g = (MySqlGuid)v; - g.OldGuids = driver.Settings.OldGuids; - v = g; - } - return v; - } - - public static IMySqlValue GetIMySqlValue(MySqlDbType type) - { - switch (type) - { - case MySqlDbType.Byte: - return new MySqlByte(); - case MySqlDbType.UByte: - return new MySqlUByte(); - case MySqlDbType.Int16: - return new MySqlInt16(); - case MySqlDbType.UInt16: - return new MySqlUInt16(); - case MySqlDbType.Int24: - case MySqlDbType.Int32: - case MySqlDbType.Year: - return new MySqlInt32(type, true); - case MySqlDbType.UInt24: - case MySqlDbType.UInt32: - return new MySqlUInt32(type, true); - case MySqlDbType.Bit: - return new MySqlBit(); - case MySqlDbType.Int64: - return new MySqlInt64(); - case MySqlDbType.UInt64: - return new MySqlUInt64(); - case MySqlDbType.Time: - return new MySqlTimeSpan(); - case MySqlDbType.Date: - case MySqlDbType.DateTime: - case MySqlDbType.Newdate: - case MySqlDbType.Timestamp: - return new MySqlDateTime(type, true); - case MySqlDbType.Decimal: - case MySqlDbType.NewDecimal: - return new MySqlDecimal(); - case MySqlDbType.Float: - return new MySqlSingle(); - case MySqlDbType.Double: - return new MySqlDouble(); - case MySqlDbType.Set: - case MySqlDbType.Enum: - case MySqlDbType.String: - case MySqlDbType.VarString: - case MySqlDbType.VarChar: - case MySqlDbType.Text: - case MySqlDbType.TinyText: - case MySqlDbType.MediumText: - case MySqlDbType.LongText: - case MySqlDbType.JSON: - case (MySqlDbType)Field_Type.NULL: - return new MySqlString(type, true); - case MySqlDbType.Geometry: - return new MySqlGeometry(type, true); - case MySqlDbType.Blob: - case MySqlDbType.MediumBlob: - case MySqlDbType.LongBlob: - case MySqlDbType.TinyBlob: - case MySqlDbType.Binary: - case MySqlDbType.VarBinary: - return new MySqlBinary(type, true); - case MySqlDbType.Guid: - return new MySqlGuid(); - default: - throw new MySqlException("Unknown data type"); - } - } - - private void SetFieldEncoding() - { - Dictionary charSets = driver.CharacterSets; - DBVersion version = driver.Version; - - if (charSets == null || charSets.Count == 0 || CharacterSetIndex == -1) return; - if (charSets[CharacterSetIndex] == null) return; - - CharacterSet cs = CharSetMap.GetCharacterSet(version, (string)charSets[CharacterSetIndex]); - // starting with 6.0.4 utf8 has a maxlen of 4 instead of 3. The old - // 3 byte utf8 is utf8mb3 -#if !NETCORE10 - if (cs.name.ToLower(System.Globalization.CultureInfo.InvariantCulture) == "utf-8" && -#else - if (cs.name.ToLowerInvariant() == "utf-8" && -#endif - version.Major >= 6) - MaxLength = 4; - else - MaxLength = cs.byteCount; - Encoding = CharSetMap.GetEncoding(version, (string)charSets[CharacterSetIndex]); - } - } -} +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using MySql.Data.Types; +using System; +using System.Collections.Generic; +using System.Security; +using System.Text; +using System.Text.RegularExpressions; + +namespace MySql.Data.MySqlClient +{ + [Flags] + internal enum ColumnFlags : int + { + NOT_NULL = 1, + PRIMARY_KEY = 2, + UNIQUE_KEY = 4, + MULTIPLE_KEY = 8, + BLOB = 16, + UNSIGNED = 32, + ZERO_FILL = 64, + BINARY = 128, + ENUM = 256, + AUTO_INCREMENT = 512, + TIMESTAMP = 1024, + SET = 2048, + NUMBER = 32768 + }; + + /// + /// Summary description for Field. + /// + internal class MySqlField + { + #region Fields + + // public fields + public string CatalogName; + public int ColumnLength; + public string ColumnName; + public string OriginalColumnName; + public string TableName; + public string RealTableName; + public string DatabaseName; + public Encoding Encoding; + + // protected fields + protected int charSetIndex; + protected DBVersion connVersion; + protected bool binaryOk; + + // internal fields + internal Driver driver; + + #endregion + + [SecuritySafeCritical] + public MySqlField(Driver driver) + { + this.driver = driver; + connVersion = driver.Version; + MaxLength = 1; + binaryOk = true; +#if !NETFRAMEWORK + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); +#endif + } + + #region Properties + + public int CharacterSetIndex + { + get { return charSetIndex; } + set { charSetIndex = value; SetFieldEncoding(); } + } + + public MySqlDbType Type { get; internal set; } + + public byte Precision { get; set; } + + public byte Scale { get; set; } + + public int MaxLength { get; set; } + + public ColumnFlags Flags { get; protected set; } + + public bool IsAutoIncrement => (Flags & ColumnFlags.AUTO_INCREMENT) > 0; + + public bool IsNumeric => (Flags & ColumnFlags.NUMBER) > 0; + + public bool AllowsNull => (Flags & ColumnFlags.NOT_NULL) == 0; + + public bool IsUnique => (Flags & ColumnFlags.UNIQUE_KEY) > 0; + + public bool IsPrimaryKey => (Flags & ColumnFlags.PRIMARY_KEY) > 0; + + public bool IsBlob => (Type >= MySqlDbType.TinyBlob && + Type <= MySqlDbType.Blob) || + (Type >= MySqlDbType.TinyText && + Type <= MySqlDbType.Text) || + (Flags & ColumnFlags.BLOB) > 0; + + public bool IsBinary => binaryOk && (CharacterSetIndex == 63); + + public bool IsUnsigned => (Flags & ColumnFlags.UNSIGNED) > 0; + + public bool IsTextField + { + get + { + return Type == MySqlDbType.VarString || Type == MySqlDbType.VarChar || + Type == MySqlDbType.String || (Type == MySqlDbType.Guid && !driver.Settings.OldGuids); + } + } + + private int CharacterLength => ColumnLength / MaxLength; + + public List TypeConversions { get; } = new List(); + + #endregion + + public void SetTypeAndFlags(MySqlDbType type, ColumnFlags flags) + { + Flags = flags; + Type = type; + + if (String.IsNullOrEmpty(TableName) && String.IsNullOrEmpty(RealTableName) && + IsBinary && driver.Settings.FunctionsReturnString) + { + CharacterSetIndex = driver.ConnectionCharSetIndex; + } + + // if our type is an unsigned number, then we need + // to bump it up into our unsigned types + // we're trusting that the server is not going to set the UNSIGNED + // flag unless we are a number + if (IsUnsigned) + { + switch (type) + { + case MySqlDbType.Byte: + Type = MySqlDbType.UByte; + return; + case MySqlDbType.Int16: + Type = MySqlDbType.UInt16; + return; + case MySqlDbType.Int24: + Type = MySqlDbType.UInt24; + return; + case MySqlDbType.Int32: + Type = MySqlDbType.UInt32; + return; + case MySqlDbType.Int64: + Type = MySqlDbType.UInt64; + return; + } + } + + if (IsBlob) + { + // handle blob to UTF8 conversion if requested. This is only activated + // on binary blobs + if (IsBinary && driver.Settings.TreatBlobsAsUTF8) + { + bool convertBlob = false; + Regex includeRegex = driver.Settings.GetBlobAsUTF8IncludeRegex(); + Regex excludeRegex = driver.Settings.GetBlobAsUTF8ExcludeRegex(); + if (includeRegex != null && includeRegex.IsMatch(ColumnName)) + convertBlob = true; + else if (includeRegex == null && excludeRegex != null && + !excludeRegex.IsMatch(ColumnName)) + convertBlob = true; + + if (convertBlob) + { + binaryOk = false; + Encoding = Encoding.GetEncoding("UTF-8"); + charSetIndex = -1; // lets driver know we are in charge of encoding + MaxLength = 4; + } + } + + if (!IsBinary) + { + if (type == MySqlDbType.TinyBlob) + Type = MySqlDbType.TinyText; + else if (type == MySqlDbType.MediumBlob) + Type = MySqlDbType.MediumText; + else if (type == MySqlDbType.Blob) + Type = MySqlDbType.Text; + else if (type == MySqlDbType.LongBlob) + Type = MySqlDbType.LongText; + } + + if (type == MySqlDbType.JSON) + { + binaryOk = false; + Encoding = Encoding.GetEncoding("UTF-8"); + charSetIndex = -1; // lets driver know we are in charge of encoding + MaxLength = 4; + } + } + + // now determine if we really should be binary + if (driver.Settings.RespectBinaryFlags) + CheckForExceptions(); + + if (Type == MySqlDbType.String && CharacterLength == 36 && !driver.Settings.OldGuids) + Type = MySqlDbType.Guid; + + if (!IsBinary) return; + + if (driver.Settings.RespectBinaryFlags) + { + if (type == MySqlDbType.String) + Type = MySqlDbType.Binary; + else if (type == MySqlDbType.VarChar || + type == MySqlDbType.VarString) + Type = MySqlDbType.VarBinary; + } + + if (CharacterSetIndex == 63) + CharacterSetIndex = driver.ConnectionCharSetIndex; + + if (Type == MySqlDbType.Binary && ColumnLength == 16 && driver.Settings.OldGuids) + Type = MySqlDbType.Guid; + } + + public void AddTypeConversion(Type t) + { + if (TypeConversions.Contains(t)) return; + TypeConversions.Add(t); + } + + private void CheckForExceptions() + { + string colName = String.Empty; + if (OriginalColumnName != null) + colName = StringUtility.ToUpperInvariant(OriginalColumnName); + if (colName.StartsWith("CHAR(", StringComparison.Ordinal)) + binaryOk = false; + } + + public IMySqlValue GetValueObject() + { + IMySqlValue v = GetIMySqlValue(Type); + if (v is MySqlByte && ColumnLength == 1 && driver.Settings.TreatTinyAsBoolean) + { + MySqlByte b = (MySqlByte)v; + b.TreatAsBoolean = true; + v = b; + } + else if (v is MySqlGuid) + { + MySqlGuid g = (MySqlGuid)v; + g.OldGuids = driver.Settings.OldGuids; + v = g; + } + return v; + } + + public static IMySqlValue GetIMySqlValue(MySqlDbType type) + { + switch (type) + { + case MySqlDbType.Byte: + return new MySqlByte(); + case MySqlDbType.UByte: + return new MySqlUByte(); + case MySqlDbType.Year: + case MySqlDbType.Int16: + return new MySqlInt16(); + case MySqlDbType.UInt16: + return new MySqlUInt16(); + case MySqlDbType.Int24: + case MySqlDbType.Int32: + return new MySqlInt32(type, true); + case MySqlDbType.UInt24: + case MySqlDbType.UInt32: + return new MySqlUInt32(type, true); + case MySqlDbType.Bit: + return new MySqlBit(); + case MySqlDbType.Int64: + return new MySqlInt64(); + case MySqlDbType.UInt64: + return new MySqlUInt64(); + case MySqlDbType.Time: + return new MySqlTimeSpan(); + case MySqlDbType.Date: + case MySqlDbType.DateTime: + case MySqlDbType.Newdate: + case MySqlDbType.Timestamp: + return new MySqlDateTime(type, true); + case MySqlDbType.Decimal: + case MySqlDbType.NewDecimal: + return new MySqlDecimal(); + case MySqlDbType.Float: + return new MySqlSingle(); + case MySqlDbType.Double: + return new MySqlDouble(); + case MySqlDbType.Set: + case MySqlDbType.Enum: + case MySqlDbType.String: + case MySqlDbType.VarString: + case MySqlDbType.VarChar: + case MySqlDbType.Text: + case MySqlDbType.TinyText: + case MySqlDbType.MediumText: + case MySqlDbType.LongText: + case MySqlDbType.JSON: + case (MySqlDbType)Field_Type.NULL: + return new MySqlString(type, true); + case MySqlDbType.Geometry: + return new MySqlGeometry(type, true); + case MySqlDbType.Blob: + case MySqlDbType.MediumBlob: + case MySqlDbType.LongBlob: + case MySqlDbType.TinyBlob: + case MySqlDbType.Binary: + case MySqlDbType.VarBinary: + case MySqlDbType.Vector: + return new MySqlBinary(type, true); + case MySqlDbType.Guid: + return new MySqlGuid(); + default: + throw new MySqlException("Unknown data type"); + } + } + + private void SetFieldEncoding() + { + Dictionary charSets = driver.CharacterSets; + + if (charSets == null || charSets.Count == 0 || CharacterSetIndex == -1) return; + if (charSets[CharacterSetIndex] == null) return; + + CharacterSet cs = CharSetMap.GetCharacterSet(charSets[CharacterSetIndex]); + MaxLength = cs.byteCount; + Encoding = CharSetMap.GetEncoding(charSets[CharacterSetIndex]); + } + } +} diff --git a/MySQL.Data/src/Framework/net462/SystemPerformanceMonitor.cs b/MySQL.Data/src/Framework/net462/SystemPerformanceMonitor.cs new file mode 100644 index 000000000..736383f6d --- /dev/null +++ b/MySQL.Data/src/Framework/net462/SystemPerformanceMonitor.cs @@ -0,0 +1,92 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Diagnostics; + + +namespace MySql.Data.MySqlClient +{ +#if NETFRAMEWORK + internal class SystemPerformanceMonitor : PerformanceMonitor + { + private static PerformanceCounter procedureHardQueries; + private static PerformanceCounter procedureSoftQueries; + + public SystemPerformanceMonitor(MySqlConnection connection) : base(connection) + { + string categoryName = Resources.PerfMonCategoryName; + + if (connection.Settings.UsePerformanceMonitor && procedureHardQueries == null) + { + try + { + procedureHardQueries = new PerformanceCounter(categoryName, + "HardProcedureQueries", false); + procedureSoftQueries = new PerformanceCounter(categoryName, + "SoftProcedureQueries", false); + } + catch (Exception ex) + { + MySqlTrace.LogError(connection.ServerThread, ex.Message); + } + } + } + + private void EnsurePerfCategoryExist() + { + CounterCreationDataCollection ccdc = new CounterCreationDataCollection(); + CounterCreationData ccd = new CounterCreationData(); + ccd.CounterType = PerformanceCounterType.NumberOfItems32; + ccd.CounterName = "HardProcedureQueries"; + ccdc.Add(ccd); + + ccd = new CounterCreationData(); + ccd.CounterType = PerformanceCounterType.NumberOfItems32; + ccd.CounterName = "SoftProcedureQueries"; + ccdc.Add(ccd); + if (!PerformanceCounterCategory.Exists(Resources.PerfMonCategoryName)) + PerformanceCounterCategory.Create(Resources.PerfMonCategoryName,"", new PerformanceCounterCategoryType(), ccdc); + } + + public override void AddHardProcedureQuery() + { + if (!Connection.Settings.UsePerformanceMonitor || + procedureHardQueries == null) return; + procedureHardQueries.Increment(); + } + + public override void AddSoftProcedureQuery() + { + if (!Connection.Settings.UsePerformanceMonitor || + procedureSoftQueries == null) return; + procedureSoftQueries.Increment(); + } + } +#endif +} diff --git a/MySQL.Data/src/Framework/netstandard2_0/AuthenticationManager.cs b/MySQL.Data/src/Framework/netstandard2_0/AuthenticationManager.cs new file mode 100644 index 000000000..75d6356e9 --- /dev/null +++ b/MySQL.Data/src/Framework/netstandard2_0/AuthenticationManager.cs @@ -0,0 +1,50 @@ +// Copyright © 2012, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Reflection; +using MySql.Data.MySqlClient; + + +namespace MySql.Data.MySqlClient.Authentication +{ + internal partial class AuthenticationPluginManager + { + static partial void AuthenticationManagerCtorConfiguration() + { + //TODO: TEST (CHANGE THIS CODE TO AuthenticationManagerCtorConfiguration in 452 and 46 project) + Plugins["authentication_windows_client"] = new PluginInfo("MySql.Data.MySqlClient.Authentication.MySqlWindowsAuthenticationPlugin"); + if (MySqlConfiguration.Settings != null && MySqlConfiguration.Settings.AuthenticationPlugins != null) + { + foreach (AuthenticationPluginConfigurationElement e in MySqlConfiguration.Settings.AuthenticationPlugins) + Plugins[e.Name] = new PluginInfo(e.Type); + } + } + } +} diff --git a/MySQL.Data/src/Framework/netstandard2_0/CommandBuilder.cs b/MySQL.Data/src/Framework/netstandard2_0/CommandBuilder.cs new file mode 100644 index 000000000..64a00b0df --- /dev/null +++ b/MySQL.Data/src/Framework/netstandard2_0/CommandBuilder.cs @@ -0,0 +1,437 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using MySql.Data.Types; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Data.Common; +using System.Globalization; +using System.Text; + +namespace MySql.Data.MySqlClient +{ + /// + /// Automatically generates single-table commands used to reconcile changes made to a with the associated MySQL database. + /// This class cannot be inherited. + /// + /// + /// + /// The does not automatically generate the SQL statements required to + /// reconcile changes made to a with the associated instance of MySQL. + /// However, you can create a object to automatically generate SQL statements for + /// single-table updates if you set the property + /// of the . Then, any additional SQL statements that you do not set are generated by the + /// . + /// + /// + /// The registers itself as a listener for RowUpdating + /// events whenever you set the property. You can only associate one + /// or object with each other at one time. + /// + /// + /// To generate INSERT, UPDATE, or DELETE statements, the uses the + /// property to retrieve a required set of metadata automatically. If you change + /// the after the metadata has is retrieved (for example, after the first update), you + /// should call the method to update the metadata. + /// + /// + /// The must also return at least one primary key or unique + /// column. If none are present, an exception is generated, + /// and the commands are not generated. + /// + /// + /// The also uses the , + /// , and + /// properties referenced by the . The user should call + /// if any of these properties are modified, or if the + /// itself is replaced. Otherwise the , + /// , and properties retain + /// their previous values. + /// + /// + /// If you call , the is disassociated + /// from the , and the generated commands are no longer used. + /// + /// + /// + /// The following example uses the , along + /// and , to + /// select rows from a data source. The example is passed an initialized + /// , a connection string, a + /// query string that is a SQL SELECT statement, and a string that is the + /// name of the database table. The example then creates a . + /// + /// public static DataSet SelectRows(string myConnection, string mySelectQuery, string myTableName) + /// { + /// MySqlConnection myConn = new MySqlConnection(myConnection); + /// MySqlDataAdapter myDataAdapter = new MySqlDataAdapter(); + /// myDataAdapter.SelectCommand = new MySqlCommand(mySelectQuery, myConn); + /// MySqlCommandBuilder cb = new MySqlCommandBuilder(myDataAdapter); + /// + /// myConn.Open(); + /// + /// DataSet ds = new DataSet(); + /// myDataAdapter.Fill(ds, myTableName); + /// + /// ///code to modify data in DataSet here + /// ///Without the MySqlCommandBuilder this line would fail + /// myDataAdapter.Update(ds, myTableName); + /// myConn.Close(); + /// return ds; + /// } + /// + /// + [ToolboxItem(false)] + [System.ComponentModel.DesignerCategory("Code")] + public sealed class MySqlCommandBuilder : DbCommandBuilder + { + /// + /// Initializes a new instance of the class. + /// + public MySqlCommandBuilder() + { + QuotePrefix = QuoteSuffix = "`"; + } + + /// + /// Initializes a new instance of the class with the associated object. + /// + /// The to use. + /// + /// + /// The registers itself as a listener for + /// events that are generated by the + /// specified in this property. + /// + /// + /// When you create a new instance , any existing + /// associated with this is released. + /// + /// + public MySqlCommandBuilder(MySqlDataAdapter adapter) + : this() + { + DataAdapter = adapter; + } + + /// + /// Gets or sets a object for which SQL statements are automatically generated. + /// + /// + /// A object. + /// + /// + /// + /// The registers itself as a listener for + /// events that are generated by the + /// specified in this property. + /// + /// + /// When you create a new instance , any existing + /// associated with this + /// is released. + /// + /// + public new MySqlDataAdapter DataAdapter + { + get { return (MySqlDataAdapter)base.DataAdapter; } + set { base.DataAdapter = value; } + } + + #region Public Methods + + /// + /// Retrieves parameter information from the stored procedure specified in the + /// and populates the Parameters collection of the specified object. + /// This method is not currently supported since stored procedures are not available in MySQL. + /// + /// The referencing the stored + /// procedure from which the parameter information is to be derived. The derived parameters are added to the Parameters collection of the + /// . + /// The command text is not a valid stored procedure name. + public static void DeriveParameters(MySqlCommand command) + { + if (command.CommandType != CommandType.StoredProcedure) + throw new InvalidOperationException(Resources.CanNotDeriveParametersForTextCommands); + + // retrieve the proc definition from the cache. + string spName = StoredProcedure.FixProcedureName(command.CommandText); + + try + { + ProcedureCacheEntry entry = command.Connection.ProcedureCache.GetProcedureAsync(command.Connection, spName, null, false).GetAwaiter().GetResult(); + command.Parameters.Clear(); + foreach (MySqlSchemaRow row in entry.parameters.Rows) + { + MySqlParameter p = new MySqlParameter(); + p.ParameterName = String.Format("@{0}", row["PARAMETER_NAME"]); + if (row["ORDINAL_POSITION"].Equals(0) && p.ParameterName == "@") + p.ParameterName = "@RETURN_VALUE"; + p.Direction = GetDirection(row); + bool unsigned = StoredProcedure.GetFlags(row["DTD_IDENTIFIER"].ToString()).IndexOf("UNSIGNED") != -1; + bool real_as_float = entry.procedure.Rows[0]["SQL_MODE"].ToString().IndexOf("REAL_AS_FLOAT") != -1; + p.MySqlDbType = MetaData.NameToType(row["DATA_TYPE"].ToString(), + unsigned, real_as_float, command.Connection); + if (row["CHARACTER_MAXIMUM_LENGTH"] != null && row["CHARACTER_MAXIMUM_LENGTH"] != System.DBNull.Value) + p.Size = Convert.ToInt32(row["CHARACTER_MAXIMUM_LENGTH"]); + if (row["NUMERIC_PRECISION"] != null && row["NUMERIC_PRECISION"] != System.DBNull.Value) + p.Precision = Convert.ToByte(row["NUMERIC_PRECISION"]); + if (row["NUMERIC_SCALE"] != null && row["NUMERIC_SCALE"] != System.DBNull.Value) + p.Scale = Convert.ToByte(row["NUMERIC_SCALE"]); + if (p.MySqlDbType == MySqlDbType.Set || p.MySqlDbType == MySqlDbType.Enum) + p.PossibleValues = GetPossibleValues(row); + command.Parameters.Add(p); + } + } + catch (InvalidOperationException ioe) + { + throw new MySqlException(Resources.UnableToDeriveParameters, ioe); + } + } + + private static List GetPossibleValues(MySqlSchemaRow row) + { + string[] types = new string[] { "ENUM", "SET" }; + string dtdIdentifier = row["DTD_IDENTIFIER"].ToString().Trim(); + + int index = 0; + for (; index < 2; index++) + if (dtdIdentifier.StartsWith(types[index], StringComparison.OrdinalIgnoreCase)) + break; + if (index == 2) return null; + dtdIdentifier = dtdIdentifier.Substring(types[index].Length).Trim(); + dtdIdentifier = dtdIdentifier.Trim('(', ')').Trim(); + + List values = new List(); + MySqlTokenizer tokenzier = new MySqlTokenizer(dtdIdentifier); + string token = tokenzier.NextToken(); + int start = tokenzier.StartIndex; + while (true) + { + if (token == null || token == ",") + { + int end = dtdIdentifier.Length - 1; + if (token == ",") + end = tokenzier.StartIndex; + + string value = dtdIdentifier.Substring(start, end - start).Trim('\'', '\"').Trim(); + values.Add(value); + start = tokenzier.StopIndex; + } + if (token == null) break; + token = tokenzier.NextToken(); + } + return values; + } + + private static ParameterDirection GetDirection(MySqlSchemaRow row) + { + string mode = row["PARAMETER_MODE"].ToString(); + int ordinal = Convert.ToInt32(row["ORDINAL_POSITION"]); + + if (0 == ordinal) + return ParameterDirection.ReturnValue; + else if (mode == "IN") + return ParameterDirection.Input; + else if (mode == "OUT") + return ParameterDirection.Output; + return ParameterDirection.InputOutput; + } + + /// + /// Gets the delete command. + /// + /// The object required to perform deletions. + public new MySqlCommand GetDeleteCommand() + { + return (MySqlCommand)base.GetDeleteCommand(); + } + + /// + /// Gets the update command. + /// + /// The object required to perform updates. + public new MySqlCommand GetUpdateCommand() + { + return (MySqlCommand)base.GetUpdateCommand(); + } + + /// + /// Gets the insert command. + /// + /// The object required to perform inserts. + public new MySqlCommand GetInsertCommand() + { + return (MySqlCommand)GetInsertCommand(false); + } + + /// + /// Given an unquoted identifier in the correct catalog case, returns the correct quoted form of that identifier, + /// including properly escaping any embedded quotes in the identifier. + /// + /// The original unquoted identifier. + /// The quoted version of the identifier. Embedded quotes within the identifier are properly escaped. + /// If the unquotedIdentifier is null. + public override string QuoteIdentifier(string unquotedIdentifier) + { + if (unquotedIdentifier == null) throw new + ArgumentNullException("unquotedIdentifier"); + + // don't quote again if it is already quoted + if (unquotedIdentifier.StartsWith(QuotePrefix) && + unquotedIdentifier.EndsWith(QuoteSuffix)) + return unquotedIdentifier; + + unquotedIdentifier = unquotedIdentifier.Replace(QuotePrefix, QuotePrefix + QuotePrefix); + + return String.Format("{0}{1}{2}", QuotePrefix, unquotedIdentifier, QuoteSuffix); + } + + /// + /// Given a quoted identifier, returns the correct unquoted form of that identifier, + /// including properly un-escaping any embedded quotes in the identifier. + /// + /// The identifier that will have its embedded quotes removed. + /// The unquoted identifier, with embedded quotes properly un-escaped. + /// If the quotedIdentifier is null. + public override string UnquoteIdentifier(string quotedIdentifier) + { + if (quotedIdentifier == null) throw new + ArgumentNullException("quotedIdentifier"); + + // don't unquote again if it is already unquoted + if (!quotedIdentifier.StartsWith(QuotePrefix) || + !quotedIdentifier.EndsWith(QuoteSuffix)) + return quotedIdentifier; + + if (quotedIdentifier.StartsWith(QuotePrefix)) + quotedIdentifier = quotedIdentifier.Substring(1); + if (quotedIdentifier.EndsWith(QuoteSuffix)) + quotedIdentifier = quotedIdentifier.Substring(0, quotedIdentifier.Length - 1); + + quotedIdentifier = quotedIdentifier.Replace(QuotePrefix + QuotePrefix, QuotePrefix); + + return quotedIdentifier; + } + + #endregion + + /// + /// Returns the schema table for the + /// + /// The for which to retrieve the corresponding schema table. + /// A that represents the schema for the specific . + protected override DataTable GetSchemaTable(DbCommand sourceCommand) + { + DataTable schemaTable = base.GetSchemaTable(sourceCommand); + + foreach (DataRow row in schemaTable.Rows) + if (row["BaseSchemaName"].Equals(sourceCommand.Connection.Database)) + row["BaseSchemaName"] = null; + + return schemaTable; + } + + /// + /// Returns the full parameter name, given the partial parameter name. + /// + /// The partial name of the parameter. + /// The full parameter name corresponding to the partial parameter name requested. + protected override string GetParameterName(string parameterName) + { + StringBuilder sb = new StringBuilder(parameterName); + sb.Replace(" ", ""); + sb.Replace("/", "_per_"); + sb.Replace("-", "_"); + sb.Replace(")", "_cb_"); + sb.Replace("(", "_ob_"); + sb.Replace("%", "_pct_"); + sb.Replace("<", "_lt_"); + sb.Replace(">", "_gt_"); + sb.Replace(".", "_pt_"); + return String.Format("@{0}", sb.ToString()); + } + + /// + /// Allows the provider implementation of the class to handle additional parameter properties. + /// + /// A to which the additional modifications are applied. + /// The from the schema table provided by . + /// The type of command being generated; INSERT, UPDATE or DELETE. + /// true if the parameter is part of the update or delete WHERE clause, + /// false if it is part of the insert or update values. + protected override void ApplyParameterInfo(DbParameter parameter, DataRow row, + StatementType statementType, bool whereClause) + { + ((MySqlParameter)parameter).MySqlDbType = (MySqlDbType)row["ProviderType"]; + } + + /// + /// Returns the name of the specified parameter in the format of @p#. Use when building a custom command builder. + /// + /// The number to be included as part of the parameter's name. + /// The name of the parameter with the specified number appended as part of the parameter name. + protected override string GetParameterName(int parameterOrdinal) + { + return String.Format("@p{0}", parameterOrdinal.ToString(CultureInfo.InvariantCulture)); + } + + /// + /// Returns the placeholder for the parameter in the associated SQL statement. + /// + /// The number to be included as part of the parameter's name. + /// The name of the parameter with the specified number appended. + protected override string GetParameterPlaceholder(int parameterOrdinal) + { + return String.Format("@p{0}", parameterOrdinal.ToString(CultureInfo.InvariantCulture)); + } + + /// + /// Registers the to handle the + /// event for a . + /// + /// + protected override void SetRowUpdatingHandler(DbDataAdapter adapter) + { + MySqlDataAdapter myAdapter = (adapter as MySqlDataAdapter); + if (adapter != base.DataAdapter) + myAdapter.RowUpdating += new MySqlRowUpdatingEventHandler(RowUpdating); + else + myAdapter.RowUpdating -= new MySqlRowUpdatingEventHandler(RowUpdating); + } + + private void RowUpdating(object sender, MySqlRowUpdatingEventArgs args) + { + base.RowUpdatingHandler(args); + } + + } +} diff --git a/MySQL.Data/src/Framework/netstandard2_0/MySqlClientPermission.cs b/MySQL.Data/src/Framework/netstandard2_0/MySqlClientPermission.cs new file mode 100644 index 000000000..8284cc347 --- /dev/null +++ b/MySQL.Data/src/Framework/netstandard2_0/MySqlClientPermission.cs @@ -0,0 +1,102 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Security; +using System.Security.Permissions; + +namespace MySql.Data.MySqlClient +{ + /// + /// Enables the provider to help ensure that a user has a security level adequate for accessing data. + /// + [Serializable] + public sealed class MySqlClientPermission : DBDataPermission + { + + #region Contructors + + public MySqlClientPermission(PermissionState permissionState) + : base(permissionState) + { + } + + private MySqlClientPermission(MySqlClientPermission permission):base(permission) + { + } + + internal MySqlClientPermission(MySqlClientPermissionAttribute permissionAttribute):base(permissionAttribute) + { + } + + internal MySqlClientPermission (DBDataPermission permission) + : base (permission) + { + } + + internal MySqlClientPermission(string connectionString) + : base(PermissionState.None) + { + if ((connectionString == null) || connectionString.Length == 0) + base.Add(string.Empty, string.Empty, KeyRestrictionBehavior.AllowOnly); + else + base.Add(connectionString, string.Empty, KeyRestrictionBehavior.AllowOnly); + } + + + #endregion + + #region Methods + + /// + /// Adds a new connection string with set of restricted keywords to the MySqlClientPermission object + /// + ///Settings to be used for the connection + ///Keywords to define the restrictions + ///KeyRestrictionBehavior to be used + public override void Add(string connectionString, string restrictions, KeyRestrictionBehavior behavior) + { + base.Add(connectionString, restrictions, behavior); + } + + /// + /// Returns MySqlClientPermission as an IPermission + /// + /// + public override IPermission Copy() + { + return new MySqlClientPermission(this); + } + + #endregion + + } +} diff --git a/MySQL.Data/src/Framework/netstandard2_0/MySqlClientPermissionAttribute.cs b/MySQL.Data/src/Framework/netstandard2_0/MySqlClientPermissionAttribute.cs new file mode 100644 index 000000000..e2ee73a4a --- /dev/null +++ b/MySQL.Data/src/Framework/netstandard2_0/MySqlClientPermissionAttribute.cs @@ -0,0 +1,53 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Data.Common; +using System.Security; +using System.Security.Permissions; + +namespace MySql.Data.MySqlClient +{ + /// + /// Associates a security action with a custom security attribute. + /// + [Serializable, AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Struct | AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = true, Inherited = false)] + public sealed class MySqlClientPermissionAttribute : DBDataPermissionAttribute + { + // Methods + public MySqlClientPermissionAttribute(SecurityAction action) : base(action) + { + } + + public override IPermission CreatePermission() + { + return new MySqlClientPermission(this); + } + } +} diff --git a/MySQL.Data/src/Framework/netstandard2_0/MySqlConfiguration.cs b/MySQL.Data/src/Framework/netstandard2_0/MySqlConfiguration.cs new file mode 100644 index 000000000..af38bb5f9 --- /dev/null +++ b/MySQL.Data/src/Framework/netstandard2_0/MySqlConfiguration.cs @@ -0,0 +1,205 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Text; +using System.Configuration; + +namespace MySql.Data.MySqlClient +{ + /// + /// Represents a section within a configuration file. + /// + public sealed class MySqlConfiguration : ConfigurationSection + { + private static MySqlConfiguration settings + = ConfigurationManager.GetSection("MySQL") as MySqlConfiguration; + + /// + /// Gets the MySQL configuations associated to the current configuration. + /// + public static MySqlConfiguration Settings + { + get { return settings; } + } + + /// + /// Gets a collection of the exception interceptors available in the current configuration. + /// + [ConfigurationProperty("ExceptionInterceptors", IsRequired = false)] + [ConfigurationCollection(typeof(InterceptorConfigurationElement), AddItemName = "add", ClearItemsName = "clear", RemoveItemName = "remove")] + public GenericConfigurationElementCollection ExceptionInterceptors + { + get { return (GenericConfigurationElementCollection)this["ExceptionInterceptors"]; } + } + + /// + /// Gets a collection of the command interceptors available in the current configuration. + /// + [ConfigurationProperty("CommandInterceptors", IsRequired = false)] + [ConfigurationCollection(typeof(InterceptorConfigurationElement), AddItemName = "add", ClearItemsName = "clear", RemoveItemName = "remove")] + public GenericConfigurationElementCollection CommandInterceptors + { + get { return (GenericConfigurationElementCollection)this["CommandInterceptors"]; } + } + + /// + /// Gets a collection of the authentication plugins available in the current configuration. + /// + [ConfigurationProperty("AuthenticationPlugins", IsRequired = false)] + [ConfigurationCollection(typeof(AuthenticationPluginConfigurationElement), AddItemName = "add", ClearItemsName = "clear", RemoveItemName = "remove")] + public GenericConfigurationElementCollection AuthenticationPlugins + { + get { return (GenericConfigurationElementCollection)this["AuthenticationPlugins"]; } + } + + /// + /// Gets or sets the replication configurations. + /// + [ConfigurationProperty("Replication", IsRequired = true)] + public ReplicationConfigurationElement Replication + { + get + { + return (ReplicationConfigurationElement)this["Replication"]; + } + set + { + this["Replication"] = value; + } + } + + } + + /// + /// Defines the configurations allowed for an authentication plugin. + /// + public sealed class AuthenticationPluginConfigurationElement : ConfigurationElement + { + /// + /// Gets or sets the name of the authentication plugin. + /// + [ConfigurationProperty("name", IsRequired = true)] + public string Name + { + get + { + return (string)this["name"]; + } + set + { + this["name"] = value; + } + } + + /// + /// Gets or sets the type of the authentication plugin. + /// + [ConfigurationProperty("type", IsRequired = true)] + public string Type + { + get + { + return (string)this["type"]; + } + set + { + this["type"] = value; + } + } + } + + /// + /// Defines the configurations allowed for an interceptor. + /// + public sealed class InterceptorConfigurationElement : ConfigurationElement + { + /// + /// Gets or sets the name of the interceptor. + /// + [ConfigurationProperty("name", IsRequired = true)] + public string Name + { + get + { + return (string)this["name"]; + } + set + { + this["name"] = value; + } + } + + /// + /// Gets or sets the type of the interceptor. + /// + [ConfigurationProperty("type", IsRequired = true)] + public string Type + { + get + { + return (string)this["type"]; + } + set + { + this["type"] = value; + } + } + } + + /// + /// Represents a generic configuration element. + /// + /// + public sealed class GenericConfigurationElementCollection : ConfigurationElementCollection, IEnumerable where T : ConfigurationElement, new() + { + List _elements = new List(); + + protected override ConfigurationElement CreateNewElement() + { + T newElement = new T(); + _elements.Add(newElement); + return newElement; + } + + protected override object GetElementKey(ConfigurationElement element) + { + return _elements.Find(e => e.Equals(element)); + } + + /// + /// Gets an enumerator that iterates through the returned list. + /// + /// An enumerator that iterates through the returned list. + public new IEnumerator GetEnumerator() + { + return _elements.GetEnumerator(); + } + } +} diff --git a/MySQL.Data/src/Framework/netstandard2_0/MySqlHelper.cs b/MySQL.Data/src/Framework/netstandard2_0/MySqlHelper.cs new file mode 100644 index 000000000..4b88132c7 --- /dev/null +++ b/MySQL.Data/src/Framework/netstandard2_0/MySqlHelper.cs @@ -0,0 +1,341 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +using System; +using System.Data; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + public partial class MySqlHelper + { + #region DataRow + /// + /// Asynchronous version of ExecuteDataRow. + /// + /// The settings to be used for the connection. + /// The command to execute. + /// The parameters to use for the command. + /// The DataRow containing the first row of the resultset. + public static Task ExecuteDataRowAsync(string connectionString, string commandText, params MySqlParameter[] parms) + { + return ExecuteDataRowAsync(connectionString, commandText, CancellationToken.None, parms); + } + + /// + /// Asynchronous version of ExecuteDataRow. + /// + /// The settings to be used for the connection. + /// The command to execute. + /// The cancellation token. + /// The parameters to use for the command. + /// The DataRow containing the first row of the resultset. + public static Task ExecuteDataRowAsync(string connectionString, string commandText, CancellationToken cancellationToken, params MySqlParameter[] parms) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + var row = ExecuteDataRow(connectionString, commandText, parms); + result.SetResult(row); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + #endregion + + #region DataSet + + /// + /// Executes a single SQL command and returns the first row of the resultset. A new MySqlConnection object + /// is created, opened, and closed during this method. + /// + /// Settings to be used for the connection + /// Command to execute + /// Parameters to use for the command + /// DataRow containing the first row of the resultset + public static DataRow ExecuteDataRow(string connectionString, string commandText, params MySqlParameter[] parms) + { + DataSet ds = ExecuteDataset(connectionString, commandText, parms); + if (ds == null) return null; + if (ds.Tables.Count == 0) return null; + if (ds.Tables[0].Rows.Count == 0) return null; + return ds.Tables[0].Rows[0]; + } + + /// + /// Executes a single SQL command and returns the resultset in a . + /// A new MySqlConnection object is created, opened, and closed during this method. + /// + /// Settings to be used for the connection + /// Command to execute + /// containing the resultset + public static DataSet ExecuteDataset(string connectionString, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(connectionString, commandText, (MySqlParameter[])null); + } + + /// + /// Executes a single SQL command and returns the resultset in a . + /// A new MySqlConnection object is created, opened, and closed during this method. + /// + /// Settings to be used for the connection + /// Command to execute + /// Parameters to use for the command + /// containing the resultset + public static DataSet ExecuteDataset(string connectionString, string commandText, params MySqlParameter[] commandParameters) + { + //create & open a SqlConnection, and dispose of it after we are done. + using (MySqlConnection cn = new MySqlConnection(connectionString)) + { + cn.Open(); + + //call the overload that takes a connection in place of the connection string + return ExecuteDataset(cn, commandText, commandParameters); + } + } + + /// + /// Executes a single SQL command and returns the resultset in a . + /// The state of the object remains unchanged after execution + /// of this method. + /// + /// object to use + /// Command to execute + /// containing the resultset + public static DataSet ExecuteDataset(MySqlConnection connection, string commandText) + { + //pass through the call providing null for the set of SqlParameters + return ExecuteDataset(connection, commandText, (MySqlParameter[])null); + } + + /// + /// Executes a single SQL command and returns the resultset in a . + /// The state of the object remains unchanged after execution + /// of this method. + /// + /// object to use + /// Command to execute + /// Parameters to use for the command + /// containing the resultset + public static DataSet ExecuteDataset(MySqlConnection connection, string commandText, params MySqlParameter[] commandParameters) + { + //create a command and prepare it for execution + MySqlCommand cmd = new MySqlCommand(); + cmd.Connection = connection; + cmd.CommandText = commandText; + cmd.CommandType = CommandType.Text; + + if (commandParameters != null) + foreach (MySqlParameter p in commandParameters) + cmd.Parameters.Add(p); + + //create the DataAdapter & DataSet + MySqlDataAdapter da = new MySqlDataAdapter(cmd); + DataSet ds = new DataSet(); + + //fill the DataSet using default values for DataTable names, etc. + da.Fill(ds); + + // detach the MySqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + //return the dataset + return ds; + } + + /// + /// Updates the given table with data from the given + /// + /// Settings to use for the update + /// Command text to use for the update + /// containing the new data to use in the update + /// Tablename in the dataset to update + public static void UpdateDataSet(string connectionString, string commandText, DataSet ds, string tablename) + { + MySqlConnection cn = new MySqlConnection(connectionString); + cn.Open(); + MySqlDataAdapter da = new MySqlDataAdapter(commandText, cn); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + cb.ToString(); + da.Update(ds, tablename); + cn.Close(); + } + + /// + /// Async version of ExecuteDataset + /// + /// Settings to be used for the connection + /// Command to execute + /// containing the resultset + public static Task ExecuteDatasetAsync(string connectionString, string commandText) + { + return ExecuteDatasetAsync(connectionString, commandText, CancellationToken.None, (MySqlParameter[])null); + } + + public static Task ExecuteDatasetAsync(string connectionString, string commandText, CancellationToken cancellationToken) + { + return ExecuteDatasetAsync(connectionString, commandText, cancellationToken, (MySqlParameter[])null); + } + + /// + /// Async version of ExecuteDataset + /// + /// Settings to be used for the connection + /// Command to execute + /// Parameters to use for the command + /// containing the resultset + public static Task ExecuteDatasetAsync(string connectionString, string commandText, params MySqlParameter[] commandParameters) + { + return ExecuteDatasetAsync(connectionString, commandText, CancellationToken.None, commandParameters); + } + + public static Task ExecuteDatasetAsync(string connectionString, string commandText, CancellationToken cancellationToken, params MySqlParameter[] commandParameters) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + var dataset = ExecuteDataset(connectionString, commandText, commandParameters); + result.SetResult(dataset); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + + /// + /// Async version of ExecuteDataset + /// + /// object to use + /// Command to execute + /// containing the resultset + public static Task ExecuteDatasetAsync(MySqlConnection connection, string commandText) + { + return ExecuteDatasetAsync(connection, commandText, CancellationToken.None, (MySqlParameter[])null); + } + + public static Task ExecuteDatasetAsync(MySqlConnection connection, string commandText, CancellationToken cancellationToken) + { + return ExecuteDatasetAsync(connection, commandText, cancellationToken, (MySqlParameter[])null); + } + + /// + /// Async version of ExecuteDataset + /// + /// object to use + /// Command to execute + /// Parameters to use for the command + /// containing the resultset + public static Task ExecuteDatasetAsync(MySqlConnection connection, string commandText, params MySqlParameter[] commandParameters) + { + return ExecuteDatasetAsync(connection, commandText, CancellationToken.None, commandParameters); + } + + public static Task ExecuteDatasetAsync(MySqlConnection connection, string commandText, CancellationToken cancellationToken, params MySqlParameter[] commandParameters) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + var dataset = ExecuteDataset(connection, commandText, commandParameters); + result.SetResult(dataset); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + + /// + /// Async version of UpdateDataset + /// + /// Settings to use for the update + /// Command text to use for the update + /// containing the new data to use in the update + /// Tablename in the dataset to update + public static Task UpdateDataSetAsync(string connectionString, string commandText, DataSet ds, string tablename) + { + return UpdateDataSetAsync(connectionString, commandText, ds, tablename, CancellationToken.None); + } + + public static Task UpdateDataSetAsync(string connectionString, string commandText, DataSet ds, string tablename, CancellationToken cancellationToken) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + UpdateDataSet(connectionString, commandText, ds, tablename); + result.SetResult(true); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + + + #endregion + + } +} + diff --git a/MySQL.Data/src/Framework/netstandard2_0/MySqlPromotableTransaction.cs b/MySQL.Data/src/Framework/netstandard2_0/MySqlPromotableTransaction.cs new file mode 100644 index 000000000..c5e304829 --- /dev/null +++ b/MySQL.Data/src/Framework/netstandard2_0/MySqlPromotableTransaction.cs @@ -0,0 +1,231 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Transactions; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + /// + /// Represents a single(not nested) TransactionScope + /// + internal class MySqlTransactionScope + { + public MySqlConnection connection; + public Transaction baseTransaction; + public MySqlTransaction simpleTransaction; + public int rollbackThreadId; + + public MySqlTransactionScope(MySqlConnection con, Transaction trans, + MySqlTransaction simpleTransaction) + { + connection = con; + baseTransaction = trans; + this.simpleTransaction = simpleTransaction; + } + + public async Task RollbackAsync(SinglePhaseEnlistment singlePhaseEnlistment, bool execAsync) + { + // prevent commands in main thread to run concurrently + Driver driver = connection.driver; + + SemaphoreSlim semaphoreSlim = new(1); + semaphoreSlim.Wait(); + + rollbackThreadId = Thread.CurrentThread.ManagedThreadId; + while (connection.Reader != null) + { + // wait for reader to finish. Maybe we should not wait + // forever and cancel it after some time? + System.Threading.Thread.Sleep(100); + } + simpleTransaction.Rollback(); + singlePhaseEnlistment.Aborted(); + DriverTransactionManager.RemoveDriverInTransaction(baseTransaction); + + driver.currentTransaction = null; + + if (connection.State == ConnectionState.Closed) + await connection.CloseFullyAsync(execAsync).ConfigureAwait(false); + rollbackThreadId = 0; + + semaphoreSlim.Release(); + } + + public async Task SinglePhaseCommitAsync(SinglePhaseEnlistment singlePhaseEnlistment, bool execAsync) + { + simpleTransaction.Commit(); + singlePhaseEnlistment.Committed(); + DriverTransactionManager.RemoveDriverInTransaction(baseTransaction); + connection.driver.currentTransaction = null; + + if (connection.State == ConnectionState.Closed) + await connection.CloseFullyAsync(execAsync).ConfigureAwait(false); + } + + public void ChangeConnection(MySqlConnection connection) + { + this.connection = connection; + this.simpleTransaction.Connection = connection; + } + } + + internal sealed class MySqlPromotableTransaction : IPromotableSinglePhaseNotification, ITransactionPromoter + { + // Per-thread stack to manage nested transaction scopes + [ThreadStatic] + static Stack globalScopeStack; + + MySqlConnection connection; + Transaction baseTransaction; + Stack scopeStack; + + + public MySqlPromotableTransaction(MySqlConnection connection, Transaction baseTransaction) + { + this.connection = connection; + this.baseTransaction = baseTransaction; + } + + public Transaction BaseTransaction + { + get + { + if (scopeStack.Count > 0) + return scopeStack.Peek().baseTransaction; + else + return null; + } + } + + public MySqlConnection Connection + { + get + { + return connection; + } + set + { + connection = value; + if (scopeStack.Count > 0) + scopeStack.Peek().ChangeConnection(value); + } + } + + public bool InRollback + { + get + { + if (scopeStack.Count > 0) + { + MySqlTransactionScope currentScope = scopeStack.Peek(); + if (currentScope.rollbackThreadId == Thread.CurrentThread.ManagedThreadId) + { + return true; + } + } + return false; + } + } + void IPromotableSinglePhaseNotification.Initialize() + { + string valueName = Enum.GetName( + typeof(System.Transactions.IsolationLevel), baseTransaction.IsolationLevel); + System.Data.IsolationLevel dataLevel = (System.Data.IsolationLevel)Enum.Parse( + typeof(System.Data.IsolationLevel), valueName); + MySqlTransaction simpleTransaction = connection.BeginTransaction(dataLevel, "SESSION"); + + // We need to save the per-thread scope stack locally. + // We cannot always use thread static variable in rollback: when scope + // times out, rollback is issued by another thread. + if (globalScopeStack == null) + { + globalScopeStack = new Stack(); + } + + scopeStack = globalScopeStack; + scopeStack.Push(new MySqlTransactionScope(connection, baseTransaction, + simpleTransaction)); + } + + void IPromotableSinglePhaseNotification.Rollback(SinglePhaseEnlistment singlePhaseEnlistment) + { + + MySqlTransactionScope current = scopeStack.Peek(); + current.RollbackAsync(singlePhaseEnlistment, false).GetAwaiter().GetResult(); + scopeStack.Pop(); + } + + void IPromotableSinglePhaseNotification.SinglePhaseCommit(SinglePhaseEnlistment singlePhaseEnlistment) + { + scopeStack.Pop().SinglePhaseCommitAsync(singlePhaseEnlistment, false).GetAwaiter().GetResult(); + } + + byte[] ITransactionPromoter.Promote() + { + throw new NotSupportedException(); + } + } + + internal class DriverTransactionManager + { + private static Hashtable driversInUse = new Hashtable(); + + public static Driver GetDriverInTransaction(Transaction transaction) + { + lock (driversInUse.SyncRoot) + { + Driver d = (Driver)driversInUse[transaction.GetHashCode()]; + return d; + } + } + + public static void SetDriverInTransaction(Driver driver) + { + lock (driversInUse.SyncRoot) + { + driversInUse[driver.currentTransaction.BaseTransaction.GetHashCode()] = driver; + } + } + + public static void RemoveDriverInTransaction(Transaction transaction) + { + lock (driversInUse.SyncRoot) + { + driversInUse.Remove(transaction.GetHashCode()); + } + } + } +} + diff --git a/MySQL.Data/src/Framework/netstandard2_0/MySqlSecurityPermission.cs b/MySQL.Data/src/Framework/netstandard2_0/MySqlSecurityPermission.cs new file mode 100644 index 000000000..3319eb2cd --- /dev/null +++ b/MySQL.Data/src/Framework/netstandard2_0/MySqlSecurityPermission.cs @@ -0,0 +1,65 @@ +// Copyright © 2011, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Net; +using System.Security; +using System.Security.Permissions; + +namespace MySql.Data.MySqlClient +{ + /// + /// Defines security permissions assigned to a MySQL object. + /// + public sealed class MySqlSecurityPermission : MarshalByRefObject + { + private MySqlSecurityPermission() + { + } + + /// + /// Creates a set of permissions. + /// + /// A flag indicating if the reflection permission should be included. + /// A object representing a collection of permissions. + public static PermissionSet CreatePermissionSet(bool includeReflectionPermission) + { + PermissionSet permissionsSet = new PermissionSet(null); + permissionsSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution)); + permissionsSet.AddPermission(new SocketPermission(PermissionState.Unrestricted)); + permissionsSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.UnmanagedCode)); + permissionsSet.AddPermission(new DnsPermission(PermissionState.Unrestricted)); + permissionsSet.AddPermission(new FileIOPermission(PermissionState.Unrestricted)); + permissionsSet.AddPermission(new EnvironmentPermission(PermissionState.Unrestricted)); + + if (includeReflectionPermission) permissionsSet.AddPermission(new ReflectionPermission(PermissionState.Unrestricted)); + + return permissionsSet; + } + } +} diff --git a/MySQL.Data/src/Framework/netstandard2_0/dataadapter.cs b/MySQL.Data/src/Framework/netstandard2_0/dataadapter.cs new file mode 100644 index 000000000..402fcb3a9 --- /dev/null +++ b/MySQL.Data/src/Framework/netstandard2_0/dataadapter.cs @@ -0,0 +1,1595 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Data.Common; +using System.Drawing; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + /// + /// Represents a set of data commands and a database connection that are used to fill a dataset and update a MySQL database. + /// This class cannot be inherited. + /// + /// + /// + /// The , serves as a bridge between a + /// and MySQL for retrieving and saving data. The provides this + /// bridge by mapping , which changes the data in the + /// to match the data in the data source, and , + /// which changes the data in the data source to match the data in the , + /// using the appropriate SQL statements against the data source. + /// + /// + /// When the fills a , it will create the necessary + /// tables and columns for the returned data if they do not already exist. However, primary + /// key information will not be included in the implicitly created schema unless the + /// property is set to . + /// You may also have the create the schema of the , + /// including primary key information, before filling it with data using . + /// + /// + /// is used in conjunction with + /// and to increase performance when connecting to a MySQL database. + /// + /// + /// The also includes the , + /// , , + /// , and + /// properties to facilitate the loading and updating of data. + /// + /// + /// When an instance of is created, the read/write properties + /// are set to initial values. For a list of these values, see the + /// constructor. + /// + /// + /// Please be aware that the class allows only + /// Int16, Int32, and Int64 to have the AutoIncrement property set. + /// If you plan to use autoincremement columns with MySQL, you should consider + /// using signed integer columns. + /// + /// + /// + /// The following example creates a and a . + /// The is opened and set as the for the + /// . The example then calls , and closes + /// the connection. To accomplish this, the is + /// passed a connection string and a query string that is a SQL INSERT + /// statement. + /// + /// public DataSet SelectRows(DataSet dataset,string connection,string query) + /// { + /// MySqlConnection conn = new MySqlConnection(connection); + /// MySqlDataAdapter adapter = new MySqlDataAdapter(); + /// adapter.SelectCommand = new MySqlCommand(query, conn); + /// adapter.Fill(dataset); + /// return dataset; + /// } + /// + /// +#if NET452 + [ToolboxBitmap(typeof(MySqlDataAdapter), "MySqlClient.resources.dataadapter.bmp")] +#endif + [DesignerCategory("Code")] + [Designer("MySql.Data.MySqlClient.Design.MySqlDataAdapterDesigner,MySqlClient.Design")] + public sealed class MySqlDataAdapter : DbDataAdapter, IDbDataAdapter, IDataAdapter + { + private bool loadingDefaults; + private int updateBatchSize; + List commandBatch; + + /// + /// Occurs during Update before a command is executed against the data source. The attempt to update is made, so the event fires. + /// + public event MySqlRowUpdatingEventHandler RowUpdating; + + /// + /// Occurs during Update after a command is executed against the data source. The attempt to update is made, so the event fires. + /// + public event MySqlRowUpdatedEventHandler RowUpdated; + + /// + /// Initializes a new instance of the class. + /// + /// + /// + /// When an instance of is created, + /// the following read/write properties are set to the following initial + /// values. + /// + /// + /// + /// Properties + /// Initial Value + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// You can change the value of any of these properties through a separate call to the property. + /// + /// + public MySqlDataAdapter() + { + loadingDefaults = true; + updateBatchSize = 1; + } + + /// + /// Initializes a new instance of the class with + /// the specified as the + /// property. + /// + /// + /// that is a SQL SELECT statement or stored procedure and is set + /// as the property of the . + /// + public MySqlDataAdapter(MySqlCommand selectCommand) + : this() + { + SelectCommand = selectCommand; + } + + /// + /// Initializes a new instance of the class with + /// a and a object. + /// + /// + /// A String that is a SQL SELECT statement or stored procedure to be used by + /// the property of the . + /// + /// + /// A that represents the connection. + /// + /// + /// + /// This implementation of the opens and closes a + /// if it is not already open. This can be useful in a an application that must call the + /// method for two or more MySqlDataAdapter objects. + /// If the MySqlConnection is already open, you must explicitly call + /// or to close it. + /// + /// + public MySqlDataAdapter(string selectCommandText, MySqlConnection connection) + : this() + { + SelectCommand = new MySqlCommand(selectCommandText, connection); + } + + /// + /// Initializes a new instance of the class with + /// a and a connection string. + /// + /// + /// A that is a SQL SELECT statement or stored procedure to + /// be used by the property of the . + /// + /// The connection string + public MySqlDataAdapter(string selectCommandText, string selectConnString) + : this() + { + SelectCommand = new MySqlCommand(selectCommandText, + new MySqlConnection(selectConnString)); + } + + #region Properties + + /// + /// Gets or sets a SQL statement or stored procedure used to delete records from the data set. + /// + /// + /// A used during to delete records in the + /// database that correspond to deleted rows in the . + /// + /// + /// + /// During , if this property is not set and primary key information + /// is present in the , the can be generated + /// automatically if you set the property and use the + /// . Then, any additional commands that you do not set are + /// generated by the . This generation logic requires key column + /// information to be present in the . + /// + /// + /// When is assigned to a previously created , + /// the is not cloned. The maintains a reference + /// to the previously created object. + /// + /// + [Description("Used during Update for deleted rows in Dataset.")] + public new MySqlCommand DeleteCommand + { + get { return (MySqlCommand)base.DeleteCommand; } + set { base.DeleteCommand = value; } + } + + /// + /// Gets or sets a SQL statement or stored procedure used to insert records into the data set. + /// + /// + /// A used during to insert records into the + /// database that correspond to new rows in the . + /// + /// + /// + /// During , if this property is not set and primary key information + /// is present in the , the InsertCommand can be generated + /// automatically if you set the property and use the + /// . Then, any additional commands that you do not set are + /// generated by the MySqlCommandBuilder. This generation logic requires key column + /// information to be present in the DataSet. + /// + /// + /// When InsertCommand is assigned to a previously created , + /// the is not cloned. The InsertCommand maintains a reference + /// to the previously created object. + /// + /// + /// If execution of this command returns rows, these rows may be added to the DataSet + /// depending on how you set the property of the object. + /// + /// + [Description("Used during Update for new rows in Dataset.")] + public new MySqlCommand InsertCommand + { + get { return (MySqlCommand)base.InsertCommand; } + set { base.InsertCommand = value; } + } + + /// + /// Gets or sets a SQL statement or stored procedure used to select records in the data source. + /// + /// + /// A used during to select records from the + /// database for placement in the . + /// + /// + /// + /// When is assigned to a previously created , + /// the is not cloned. The maintains a reference to the + /// previously created object. + /// + /// + /// If the does not return any rows, no tables are added to the + /// , and no exception is raised. + /// + /// + [Description("Used during Fill/FillSchema")] + [Category("Fill")] + public new MySqlCommand SelectCommand + { + get { return (MySqlCommand)base.SelectCommand; } + set { base.SelectCommand = value; } + } + + /// + /// Gets or sets a SQL statement or stored procedure used to updated records in the data source. + /// + /// + /// A used during to update records in the + /// database with data from the . + /// + /// + /// + /// During , if this property is not set and primary key information + /// is present in the , the can be generated + /// automatically if you set the property and use the + /// . Then, any additional commands that you do not set are + /// generated by the . This generation logic requires key column + /// information to be present in the DataSet. + /// + /// + /// When is assigned to a previously created , + /// the is not cloned. The maintains a reference + /// to the previously created object. + /// + /// + /// If execution of this command returns rows, these rows may be merged with the DataSet + /// depending on how you set the property of the object. + /// + /// + [Description("Used during Update for modified rows in Dataset.")] + public new MySqlCommand UpdateCommand + { + get { return (MySqlCommand)base.UpdateCommand; } + set { base.UpdateCommand = value; } + } + + internal bool LoadDefaults + { + get { return loadingDefaults; } + set { loadingDefaults = value; } + } + + #endregion + + /// + /// Open connection if it was closed. + /// Necessary to workaround "connection must be open and valid" error + /// with batched updates. + /// + /// Row state + /// list of opened connections + /// If connection is opened by this function, the list is updated + /// + /// true if connection was opened + private void OpenConnectionIfClosed(DataRowState state, + List openedConnections) + { + MySqlCommand cmd = null; + switch (state) + { + case DataRowState.Added: + cmd = InsertCommand; + break; + case DataRowState.Deleted: + cmd = DeleteCommand; + break; + case DataRowState.Modified: + cmd = UpdateCommand; + break; + default: + return; + } + + if (cmd != null && cmd.Connection != null && + cmd.Connection.connectionState == ConnectionState.Closed) + { + cmd.Connection.Open(); + openedConnections.Add(cmd.Connection); + } + } + + protected override int Update(DataRow[] dataRows, DataTableMapping tableMapping) + { + + List connectionsOpened = new List(); + + try + { + // Open connections for insert/update/update commands, if + // connections are closed. + foreach (DataRow row in dataRows) + { + OpenConnectionIfClosed(row.RowState, connectionsOpened); + } + + int ret = base.Update(dataRows, tableMapping); + + return ret; + } + finally + { + foreach (MySqlConnection c in connectionsOpened) + c.Close(); + } + } + + #region Batching Support + /// + /// Gets or sets a value that enables or disables batch processing support, + /// and specifies the number of commands that can be executed in a batch. + /// + /// + /// Returns the number of rows to process for each batch. + /// + /// + /// Value is + /// Effect + /// + /// + /// + /// 0 + /// + /// + /// There is no limit on the batch size. + /// + /// + /// + /// + /// 1 + /// + /// + /// Disables batch updating. + /// + /// + /// + /// + /// > 1 + /// + /// + /// Changes are sent using batches of operations at a time. + /// + /// + /// + /// + /// When setting this to a value other than 1, all the commands associated with the + /// must have their property set to None or OutputParameters. An exception will be thrown otherwise. + /// + /// + public override int UpdateBatchSize + { + get { return updateBatchSize; } + set { updateBatchSize = value; } + } + + /// + /// Initializes batching for the . + /// + protected override void InitializeBatching() + { + commandBatch = new List(); + } + + /// + /// Adds a to the current batch. + /// + /// The to add to the batch. + /// The number of commands in the batch before adding the . + protected override int AddToBatch(IDbCommand command) + { + // the first time each command is asked to be batched, we ask + // that command to prepare its batchable command text. We only want + // to do this one time for each command + MySqlCommand commandToBatch = (MySqlCommand)command; + if (commandToBatch.BatchableCommandText == null) + commandToBatch.GetCommandTextForBatching(); + + IDbCommand cloneCommand = (IDbCommand)((ICloneable)command).Clone(); + commandBatch.Add(cloneCommand); + + return commandBatch.Count - 1; + } + + /// + /// Executes the current batch. + /// + /// The return value from the last command in the batch. + protected override int ExecuteBatch() + { + int recordsAffected = 0; + int index = 0; + while (index < commandBatch.Count) + { + MySqlCommand cmd = (MySqlCommand)commandBatch[index++]; + for (int index2 = index; index2 < commandBatch.Count; index2++, index++) + { + MySqlCommand cmd2 = (MySqlCommand)commandBatch[index2]; + if (cmd2.BatchableCommandText == null || + cmd2.CommandText != cmd.CommandText) break; + cmd.AddToBatch(cmd2); + } + recordsAffected += cmd.ExecuteNonQuery(); + } + return recordsAffected; + } + + /// + /// Removes all objects from the batch. + /// + protected override void ClearBatch() + { + if (commandBatch.Count > 0) + { + MySqlCommand cmd = (MySqlCommand)commandBatch[0]; + if (cmd.Batch != null) + cmd.Batch.Clear(); + } + commandBatch.Clear(); + } + + /// + /// Ends batching for the . + /// + protected override void TerminateBatching() + { + ClearBatch(); + commandBatch = null; + } + + /// + /// Returns a System.Data.IDataParameter from one of the commands in the current batch. + /// + /// The index of the command to retrieve the parameter from. + /// The index of the parameter within the command. + /// The specified. + protected override IDataParameter GetBatchedParameter(int commandIdentifier, int parameterIndex) + { + return (IDataParameter)commandBatch[commandIdentifier].Parameters[parameterIndex]; + } + + #endregion + + /// + /// Overridden. See . + /// + /// + /// + /// + /// + /// + override protected RowUpdatedEventArgs CreateRowUpdatedEvent(DataRow dataRow, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) + { + return new MySqlRowUpdatedEventArgs(dataRow, command, statementType, tableMapping); + } + + /// + /// Initializes a new instance of the class. + /// + /// The that updates the data source. + /// The to execute during the . + /// Whether the command is an UPDATE, INSERT, DELETE, or SELECT statement. + /// A object. + /// + override protected RowUpdatingEventArgs CreateRowUpdatingEvent(DataRow dataRow, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) + { + return new MySqlRowUpdatingEventArgs(dataRow, command, statementType, tableMapping); + } + + /// + /// Overridden. Raises the RowUpdating event. + /// + /// A MySqlRowUpdatingEventArgs that contains the event data. + override protected void OnRowUpdating(RowUpdatingEventArgs value) + { + if (RowUpdating != null) + RowUpdating(this, (value as MySqlRowUpdatingEventArgs)); + } + + /// + /// Overridden. Raises the RowUpdated event. + /// + /// A MySqlRowUpdatedEventArgs that contains the event data. + override protected void OnRowUpdated(RowUpdatedEventArgs value) + { + if (RowUpdated != null) + RowUpdated(this, (value as MySqlRowUpdatedEventArgs)); + } + + #region Async + #region Fill + /// + /// Asynchronous version of the method. + /// + /// The to fill records with. + /// The number of rows successfully added to or refreshed in the . + public Task FillAsync(DataSet dataSet) + { + return FillAsync(dataSet, CancellationToken.None); + } + + /// + /// Asynchronous version of the method. + /// + /// The to fill records with. + /// The cancellation token. + /// The number of rows successfully added to or refreshed in the . + public Task FillAsync(DataSet dataSet, CancellationToken cancellationToken) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + var fillResult = base.Fill(dataSet); + result.SetResult(fillResult); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + + /// + /// Asynchronous version of the method. + /// + /// The name of the to use for table mapping. + /// The number of rows successfully added to or refreshed in the . + public Task FillAsync(DataTable dataTable) + { + return FillAsync(dataTable, CancellationToken.None); + } + + /// + /// Asynchronous version of the method. + /// + /// The name of the to use for table mapping. + /// The cancellation token. + /// The number of rows successfully added to or refreshed in the . + public Task FillAsync(DataTable dataTable, CancellationToken cancellationToken) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + var fillResult = base.Fill(dataTable); + result.SetResult(fillResult); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + + /// + /// Asynchronous version of the method. + /// + /// The to fill with records. + /// The name of the source table to use for table mapping. + /// The number of rows successfully added to or refreshed in the . + public Task FillAsync(DataSet dataSet, string srcTable) + { + return FillAsync(dataSet, srcTable, CancellationToken.None); + } + + /// + /// Asynchronous version of the method. + /// + /// The to fill with records. + /// The name of the source table to use for table mapping. + /// The cancellation token. + /// The number of rows successfully added to or refreshed in the . + public Task FillAsync(DataSet dataSet, string srcTable, CancellationToken cancellationToken) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + var fillResult = base.Fill(dataSet, srcTable); + result.SetResult(fillResult); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + + /// + /// Asynchronous version of the method. + /// + /// The to fill with records. + /// An instance of . + /// The number of rows successfully added to or refreshed in the . + public Task FillAsync(DataTable dataTable, IDataReader dataReader) + { + return FillAsync(dataTable, dataReader, CancellationToken.None); + } + + /// + /// Asynchronous version of the method. + /// + /// The to fill with records. + /// An instance of . + /// The cancellation token. + /// The number of rows successfully added to or refreshed in the . + public Task FillAsync(DataTable dataTable, IDataReader dataReader, CancellationToken cancellationToken) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + var fillResult = base.Fill(dataTable, dataReader); + result.SetResult(fillResult); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + + /// + /// Asynchronous version of the method. + /// + /// The to fill with records. + /// The SQL SELECT statement used to retrieve rows from the data source. + /// One of the values. + /// The number of rows successfully added to or refreshed in the . + public Task FillAsync(DataTable dataTable, IDbCommand command, CommandBehavior behavior) + { + return FillAsync(dataTable, command, behavior, CancellationToken.None); + } + + /// + /// Asynchronous version of the method. + /// + /// The to fill with records. + /// The SQL SELECT statement used to retrieve rows from the data source. + /// One of the values. + /// The cancellation token. + /// The number of rows successfully added to or refreshed in the . + public Task FillAsync(DataTable dataTable, IDbCommand command, CommandBehavior behavior, CancellationToken cancellationToken) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + var fillResult = base.Fill(dataTable, command, behavior); + result.SetResult(fillResult); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + + /// + /// Asynchronous version of the method. + /// + /// The start record. + /// The max number of affected records. + /// The s to fill with records. + /// The number of rows successfully added to or refreshed in the . + public Task FillAsync(int startRecord, int maxRecords, params DataTable[] dataTables) + { + return FillAsync(startRecord, maxRecords, CancellationToken.None, dataTables); + } + + /// + /// Asynchronous version of the method. + /// + /// The start record. + /// The max number of affected records. + /// The cancellation token. + /// The s to fill with records. + /// The number of rows successfully added to or refreshed in the . + public Task FillAsync(int startRecord, int maxRecords, CancellationToken cancellationToken, params DataTable[] dataTables) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + var fillResult = base.Fill(startRecord, maxRecords, dataTables); + result.SetResult(fillResult); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + + /// + /// Asynchronous version of the method. + /// + /// The to fill with records. + /// The start record. + /// The max number of affected records. + /// The name of the source table to use for table mapping. + /// The number of rows successfully added to or refreshed in the . + public Task FillAsync(DataSet dataSet, int startRecord, int maxRecords, string srcTable) + { + return FillAsync(dataSet, startRecord, maxRecords, srcTable, CancellationToken.None); + } + + /// + /// Asynchronous version of the method. + /// + /// The to fill with records. + /// The start record. + /// The max number of affected records. + /// The name of the source table to use for table mapping. + /// The cancellation token. + /// The number of rows successfully added to or refreshed in the . + public Task FillAsync(DataSet dataSet, int startRecord, int maxRecords, string srcTable, CancellationToken cancellationToken) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + var fillResult = base.Fill(dataSet, startRecord, maxRecords, srcTable); + result.SetResult(fillResult); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + + /// + /// Asynchronous version of the method. + /// + /// The to fill with records. + /// The name of the source table to use for table mapping. + /// An instance of . + /// The start record. + /// The max number of affected records. + /// The number of rows successfully added to or refreshed in the . + public Task FillAsync(DataSet dataSet, string srcTable, IDataReader dataReader, int startRecord, int maxRecords) + { + return FillAsync(dataSet, srcTable, dataReader, startRecord, maxRecords, CancellationToken.None); + } + + /// + /// Asynchronous version of the method. + /// + /// The to fill with records. + /// The name of the source table to use for table mapping. + /// An instance of . + /// The start record. + /// The max number of affected records. + /// The cancellation token. + /// The number of rows successfully added to or refreshed in the . + public Task FillAsync(DataSet dataSet, string srcTable, IDataReader dataReader, int startRecord, int maxRecords, CancellationToken cancellationToken) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + var fillResult = base.Fill(dataSet, srcTable, dataReader, startRecord, maxRecords); + result.SetResult(fillResult); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + + /// + /// Asynchronous version of the method. + /// + /// The s to fill with records. + /// The start record. + /// The max number of affected records. + /// The SQL SELECT statement used to retrieve rows from the data source. + /// One of the values. + /// The number of rows successfully added to or refreshed in the s. + public Task FillAsync(DataTable[] dataTables, int startRecord, int maxRecords, IDbCommand command, CommandBehavior behavior) + { + return FillAsync(dataTables, startRecord, maxRecords, command, behavior, CancellationToken.None); + } + + /// + /// Asynchronous version of the method. + /// + /// The s to fill with records. + /// The start record. + /// The max number of affected records. + /// The SQL SELECT statement used to retrieve rows from the data source. + /// One of the values. + /// The cancellation token. + /// The number of rows successfully added to or refreshed in the s. + public Task FillAsync(DataTable[] dataTables, int startRecord, int maxRecords, IDbCommand command, CommandBehavior behavior, CancellationToken cancellationToken) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + var fillResult = base.Fill(dataTables, startRecord, maxRecords, command, behavior); + result.SetResult(fillResult); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + + /// + /// Asynchronous version of the method. + /// + /// The to fill with records. + /// The start record. + /// The max number of affected records. + /// The name of the source table to use for table mapping. + /// The SQL SELECT statement used to retrieve rows from the data source. + /// One of the values. + /// The number of rows successfully added to or refreshed in the . + public Task FillAsync(DataSet dataSet, int startRecord, int maxRecords, string srcTable, IDbCommand command, CommandBehavior behavior) + { + return FillAsync(dataSet, startRecord, maxRecords, srcTable, command, behavior, CancellationToken.None); + } + + /// + /// Asynchronous version of the method. + /// + /// The to fill with records. + /// The start record. + /// The max number of affected records. + /// The name of the source table to use for table mapping. + /// The SQL SELECT statement used to retrieve rows from the data source. + /// One of the values. + /// The cancellation token. + /// The number of rows successfully added to or refreshed in the . + public Task FillAsync(DataSet dataSet, int startRecord, int maxRecords, string srcTable, IDbCommand command, CommandBehavior behavior, CancellationToken cancellationToken) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + var fillResult = base.Fill(dataSet, startRecord, maxRecords, srcTable, command, behavior); + result.SetResult(fillResult); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + + #endregion + + #region FillSchema + /// + /// Asynchronous version of the method. + /// + /// DataSet to use. + /// Schema type to use. + /// [] + public Task FillSchemaAsync(DataSet dataSet, SchemaType schemaType) + { + return FillSchemaAsync(dataSet, schemaType, CancellationToken.None); + } + + /// + /// Asynchronous version of the method. + /// + /// DataSet to use. + /// Schema type to use. + /// to use. + /// [] + public Task FillSchemaAsync(DataSet dataSet, SchemaType schemaType, CancellationToken cancellationToken) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + var schemaResult = base.FillSchema(dataSet, schemaType); + result.SetResult(schemaResult); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + + /// + /// Asynchronous version of the method. + /// + /// DataSet to use. + /// Schema type to use. + /// Source table to use. + /// [] + public Task FillSchemaAsync(DataSet dataSet, SchemaType schemaType, string srcTable) + { + return FillSchemaAsync(dataSet, schemaType, srcTable, CancellationToken.None); + } + + /// + /// Asynchronous version of the method. + /// + /// DataSet to use. + /// Schema type to use. + /// Source table to use. + /// to use. + /// [] + public Task FillSchemaAsync(DataSet dataSet, SchemaType schemaType, string srcTable, CancellationToken cancellationToken) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + var schemaResult = base.FillSchema(dataSet, schemaType, srcTable); + result.SetResult(schemaResult); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + + /// + /// Asynchronous version of the method. + /// + /// DataSet to use. + /// Schema type to use. + /// Source table to use. + /// DataReader to use. + /// [] + public Task FillSchemaAsync(DataSet dataSet, SchemaType schemaType, string srcTable, IDataReader dataReader) + { + return FillSchemaAsync(dataSet, schemaType, srcTable, dataReader, CancellationToken.None); + } + + /// + /// Asynchronous version of the method. + /// + /// DataSet to use. + /// Schema type to use. + /// Source table to use. + /// to use. + /// to use. + /// [] + public Task FillSchemaAsync(DataSet dataSet, SchemaType schemaType, string srcTable, IDataReader dataReader, CancellationToken cancellationToken) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + var schemaResult = base.FillSchema(dataSet, schemaType, srcTable, dataReader); + result.SetResult(schemaResult); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + + /// + /// Asynchronous version of the method. + /// + /// DataSet to use. + /// Schema type to use. + /// DBCommand to use. + /// Source table to use. + /// Command Behavior + /// [] + public Task FillSchemaAsync(DataSet dataSet, SchemaType schemaType, IDbCommand command, string srcTable, CommandBehavior behavior) + { + return FillSchemaAsync(dataSet, schemaType, command, srcTable, behavior, CancellationToken.None); + } + + /// + /// Asynchronous version of the method. + /// + /// DataSet to use. + /// Schema type to use. + /// DBCommand to use. + /// Source table to use. + /// Command Behavior + /// to use. + /// [] + public Task FillSchemaAsync(DataSet dataSet, SchemaType schemaType, IDbCommand command, string srcTable, CommandBehavior behavior, CancellationToken cancellationToken) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + var schemaResult = base.FillSchema(dataSet, schemaType, command, srcTable, behavior); + result.SetResult(schemaResult); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + + /// + /// Asynchronous version of the method. + /// + /// DataTable to use. + /// Schema type to use. + /// DataTable + public Task FillSchemaAsync(DataTable dataTable, SchemaType schemaType) + { + return FillSchemaAsync(dataTable, schemaType, CancellationToken.None); + } + + /// + /// Asynchronous version of the method. + /// + /// DataTable to use. + /// Schema type to use. + /// to use. + /// + public Task FillSchemaAsync(DataTable dataTable, SchemaType schemaType, CancellationToken cancellationToken) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + var schemaResult = base.FillSchema(dataTable, schemaType); + result.SetResult(schemaResult); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + + /// + /// Asynchronous version of the method. + /// + /// DataTable to use. + /// Schema type to use. + /// DataReader to use. + /// + public Task FillSchemaAsync(DataTable dataTable, SchemaType schemaType, IDataReader dataReader) + { + return FillSchemaAsync(dataTable, schemaType, dataReader, CancellationToken.None); + } + + /// + /// Asynchronous version of the method. + /// + /// DataTable to use. + /// Schema type to use. + /// DataReader to use. + /// to use. + /// + public Task FillSchemaAsync(DataTable dataTable, SchemaType schemaType, IDataReader dataReader, CancellationToken cancellationToken) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + var schemaResult = base.FillSchema(dataTable, schemaType, dataReader); + result.SetResult(schemaResult); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + + /// + /// Asynchronous version of the method. + /// + /// DataTable to use. + /// Schema type to use. + /// DBCommand to use. + /// Command Behavior + /// + public Task FillSchemaAsync(DataTable dataTable, SchemaType schemaType, IDbCommand command, CommandBehavior behavior) + { + return FillSchemaAsync(dataTable, schemaType, command, behavior, CancellationToken.None); + } + + /// + /// Asynchronous version of the method. + /// + /// DataTable to use. + /// Schema type to use. + /// DBCommand to use. + /// Command behavior. + /// to use. + /// + public Task FillSchemaAsync(DataTable dataTable, SchemaType schemaType, IDbCommand command, CommandBehavior behavior, CancellationToken cancellationToken) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + var schemaResult = base.FillSchema(dataTable, schemaType, command, behavior); + result.SetResult(schemaResult); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + + #endregion + + #region Update + /// + /// Asynchronous version of the method. + /// + /// DataRow[] to use. + /// The number of rows successfully updated from the . + public Task UpdateAsync(DataRow[] dataRows) + { + return UpdateAsync(dataRows, CancellationToken.None); + } + + /// + /// Asynchronous version of the method. + /// + /// DataRow[] to use. + /// to use. + /// The number of rows successfully updated from the . + + public Task UpdateAsync(DataRow[] dataRows, CancellationToken cancellationToken) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + var update = base.Update(dataRows); + result.SetResult(update); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + + /// + /// Asynchronous version of the method. + /// + /// DataSet to use. + /// The number of rows successfully updated from the . + + public Task UpdateAsync(DataSet dataSet) + { + return UpdateAsync(dataSet, CancellationToken.None); + } + + /// + /// Asynchronous version of the method. + /// + /// DataSet to use. + /// to use. + /// The number of rows successfully updated from the . + + public Task UpdateAsync(DataSet dataSet, CancellationToken cancellationToken) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + var update = base.Update(dataSet); + result.SetResult(update); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + + /// + /// Asynchronous version of the method. + /// + /// DataTable to use. + /// The number of rows successfully updated from the . + + public Task UpdateAsync(DataTable dataTable) + { + return UpdateAsync(dataTable, CancellationToken.None); + } + + /// + /// Asynchronous version of the method. + /// + /// DataTable to use. + /// to use. + /// The number of rows successfully updated from the . + + public Task UpdateAsync(DataTable dataTable, CancellationToken cancellationToken) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + var update = base.Update(dataTable); + result.SetResult(update); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + + /// + /// Asynchronous version of the method. + /// + /// DataRow[] to use. + /// Data Table Mapping + /// The number of rows successfully updated from the . + + public Task UpdateAsync(DataRow[] dataRows, DataTableMapping tableMapping) + { + return UpdateAsync(dataRows, tableMapping, CancellationToken.None); + } + + /// + /// Asynchronous version of the method. + /// + /// DataRow[] to use. + /// Data Table Mapping + /// to use. + /// The number of rows successfully updated from the . + + public Task UpdateAsync(DataRow[] dataRows, DataTableMapping tableMapping, CancellationToken cancellationToken) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + var update = base.Update(dataRows, tableMapping); + result.SetResult(update); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + + /// + /// Asynchronous version of the method. + /// + /// DataSet to use. + /// Source table to use. + /// The number of rows successfully updated from the . + + public Task UpdateAsync(DataSet dataSet, string srcTable) + { + return UpdateAsync(dataSet, srcTable, CancellationToken.None); + } + + /// + /// Asynchronous version of the method. + /// + /// DataSet to use. + /// Source table to use. + /// to use. + /// The number of rows successfully updated from the . + + public Task UpdateAsync(DataSet dataSet, string srcTable, CancellationToken cancellationToken) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + var update = base.Update(dataSet, srcTable); + result.SetResult(update); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + + #endregion + #endregion + + } + + /// + /// Represents the method that will handle the event of a . + /// + public delegate void MySqlRowUpdatingEventHandler(object sender, MySqlRowUpdatingEventArgs e); + + /// + /// Represents the method that will handle the event of a . + /// + public delegate void MySqlRowUpdatedEventHandler(object sender, MySqlRowUpdatedEventArgs e); + + /// + /// Provides data for the RowUpdating event. This class cannot be inherited. + /// + public sealed class MySqlRowUpdatingEventArgs : RowUpdatingEventArgs + { + /// + /// Initializes a new instance of the MySqlRowUpdatingEventArgs class. + /// + /// The to + /// . + /// The to execute during . + /// One of the values that specifies the type of query executed. + /// The sent through an . + public MySqlRowUpdatingEventArgs(DataRow row, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) + : base(row, command, statementType, tableMapping) + { + } + + /// + /// Gets or sets the MySqlCommand to execute when performing the Update. + /// + new public MySqlCommand Command + { + get { return (MySqlCommand)base.Command; } + set { base.Command = value; } + } + } + + /// + /// Provides data for the RowUpdated event. This class cannot be inherited. + /// + public sealed class MySqlRowUpdatedEventArgs : RowUpdatedEventArgs + { + /// + /// Initializes a new instance of the MySqlRowUpdatedEventArgs class. + /// + /// The sent through an . + /// The executed when is called. + /// One of the values that specifies the type of query executed. + /// The sent through an . + public MySqlRowUpdatedEventArgs(DataRow row, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) + : base(row, command, statementType, tableMapping) + { + } + + /// + /// Gets or sets the MySqlCommand executed when Update is called. + /// + new public MySqlCommand Command + { + get { return (MySqlCommand)base.Command; } + } + } +} diff --git a/MySQL.Data/src/ISSchemaProvider.cs b/MySQL.Data/src/ISSchemaProvider.cs new file mode 100644 index 000000000..545466a28 --- /dev/null +++ b/MySQL.Data/src/ISSchemaProvider.cs @@ -0,0 +1,397 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using MySql.Data.Types; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + internal class ISSchemaProvider : SchemaProvider + { + public ISSchemaProvider(MySqlConnection connection) + : base(connection) + { + } + + protected override MySqlSchemaCollection GetCollections() + { + MySqlSchemaCollection dt = base.GetCollections(); + + object[][] collections = { + new object[] {"Views", 2, 3}, + new object[] {"ViewColumns", 3, 4}, + new object[] {"Procedure Parameters", 5, 1}, + new object[] {"Procedures", 4, 3}, + new object[] {"Triggers", 2, 4} + }; + + FillTable(dt, collections); + return dt; + } + + protected override MySqlSchemaCollection GetRestrictions() + { + MySqlSchemaCollection dt = base.GetRestrictions(); + + object[][] restrictions = new object[][] + { + new object[] {"Procedure Parameters", "Database", "", 0}, + new object[] {"Procedure Parameters", "Schema", "", 1}, + new object[] {"Procedure Parameters", "Name", "", 2}, + new object[] {"Procedure Parameters", "Type", "", 3}, + new object[] {"Procedure Parameters", "Parameter", "", 4}, + new object[] {"Procedures", "Database", "", 0}, + new object[] {"Procedures", "Schema", "", 1}, + new object[] {"Procedures", "Name", "", 2}, + new object[] {"Procedures", "Type", "", 3}, + new object[] {"Views", "Database", "", 0}, + new object[] {"Views", "Schema", "", 1}, + new object[] {"Views", "Table", "", 2}, + new object[] {"ViewColumns", "Database", "", 0}, + new object[] {"ViewColumns", "Schema", "", 1}, + new object[] {"ViewColumns", "Table", "", 2}, + new object[] {"ViewColumns", "Column", "", 3}, + new object[] {"Triggers", "Database", "", 0}, + new object[] {"Triggers", "Schema", "", 1}, + new object[] {"Triggers", "Name", "", 2}, + new object[] {"Triggers", "EventObjectTable", "", 3}, + }; + FillTable(dt, restrictions); + return dt; + } + + public override async Task GetDatabasesAsync(string[] restrictions, bool execAsync, CancellationToken cancellationToken = default) + { + string[] keys = new string[1]; + keys[0] = "SCHEMA_NAME"; + MySqlSchemaCollection dt = await QueryAsync("SCHEMATA", "", keys, restrictions, execAsync, cancellationToken).ConfigureAwait(false); + dt.Columns[1].Name = "database_name"; + dt.Name = "Databases"; + return dt; + } + + public override async Task GetTablesAsync(string[] restrictions, bool execAsync, CancellationToken cancellationToken = default) + { + string[] keys = new string[4]; + keys[0] = "TABLE_CATALOG"; + keys[1] = "TABLE_SCHEMA"; + keys[2] = "TABLE_NAME"; + keys[3] = "TABLE_TYPE"; + MySqlSchemaCollection dt = await QueryAsync("TABLES", "TABLE_TYPE != 'VIEW'", keys, restrictions, execAsync, cancellationToken).ConfigureAwait(false); + dt.Name = "Tables"; + return dt; + } + + public override async Task GetColumnsAsync(string[] restrictions, bool execAsync, CancellationToken cancellationToken = default) + { + string[] keys = new string[4]; + keys[0] = "TABLE_CATALOG"; + keys[1] = "TABLE_SCHEMA"; + keys[2] = "TABLE_NAME"; + keys[3] = "COLUMN_NAME"; + MySqlSchemaCollection dt = await QueryAsync("COLUMNS", null, keys, restrictions, execAsync, cancellationToken).ConfigureAwait(false); + dt.RemoveColumn("CHARACTER_OCTET_LENGTH"); + dt.Name = "Columns"; + QuoteDefaultValues(dt); + return dt; + } + + private async Task GetViewsAsync(string[] restrictions, bool execAsync, CancellationToken cancellationToken = default) + { + string[] keys = new string[3]; + keys[0] = "TABLE_CATALOG"; + keys[1] = "TABLE_SCHEMA"; + keys[2] = "TABLE_NAME"; + MySqlSchemaCollection dt = await QueryAsync("VIEWS", null, keys, restrictions, execAsync, cancellationToken).ConfigureAwait(false); + dt.Name = "Views"; + return dt; + } + + private async Task GetViewColumnsAsync(string[] restrictions, bool execAsync, CancellationToken cancellationToken = default) + { + StringBuilder where = new StringBuilder(); + StringBuilder sql = new StringBuilder( + "SELECT C.* FROM information_schema.columns C"); + sql.Append(" JOIN information_schema.views V "); + sql.Append("ON C.table_schema=V.table_schema AND C.table_name=V.table_name "); + if (restrictions != null && restrictions.Length >= 2 && + restrictions[1] != null) + where.AppendFormat(CultureInfo.InvariantCulture, "C.table_schema='{0}' ", restrictions[1]); + if (restrictions != null && restrictions.Length >= 3 && + restrictions[2] != null) + { + if (where.Length > 0) + where.Append("AND "); + where.AppendFormat(CultureInfo.InvariantCulture, "C.table_name='{0}' ", restrictions[2]); + } + if (restrictions != null && restrictions.Length == 4 && + restrictions[3] != null) + { + if (where.Length > 0) + where.Append("AND "); + where.AppendFormat(CultureInfo.InvariantCulture, "C.column_name='{0}' ", restrictions[3]); + } + if (where.Length > 0) + sql.AppendFormat(CultureInfo.InvariantCulture, " WHERE {0}", where); + MySqlSchemaCollection dt = await GetTableAsync(sql.ToString(), execAsync, cancellationToken).ConfigureAwait(false); + dt.Name = "ViewColumns"; + dt.Columns[0].Name = "VIEW_CATALOG"; + dt.Columns[1].Name = "VIEW_SCHEMA"; + dt.Columns[2].Name = "VIEW_NAME"; + QuoteDefaultValues(dt); + return dt; + } + + private async Task GetTriggersAsync(string[] restrictions, bool execAsync, CancellationToken cancellationToken = default) + { + string[] keys = new string[4]; + keys[0] = "TRIGGER_CATALOG"; + keys[1] = "TRIGGER_SCHEMA"; + keys[2] = "EVENT_OBJECT_TABLE"; + keys[3] = "TRIGGER_NAME"; + MySqlSchemaCollection dt = await QueryAsync("TRIGGERS", null, keys, restrictions, execAsync, cancellationToken).ConfigureAwait(false); + dt.Name = "Triggers"; + return dt; + } + + /// + /// Return schema information about procedures and functions + /// Restrictions supported are: + /// schema, name, type + /// + /// + /// Boolean that indicates if the function will be executed asynchronously. + /// The cancellation token. + public async Task GetProceduresAsync(string[] restrictions, bool execAsync, CancellationToken cancellationToken = default) + { + string[] keys = new string[4]; + keys[0] = "ROUTINE_CATALOG"; + keys[1] = "ROUTINE_SCHEMA"; + keys[2] = "ROUTINE_NAME"; + keys[3] = "ROUTINE_TYPE"; + + MySqlSchemaCollection dt = await QueryAsync("ROUTINES", null, keys, restrictions, execAsync, cancellationToken).ConfigureAwait(false); + dt.Name = "Procedures"; + return dt; + } + + private async Task GetParametersForRoutineFromexecAsync(string[] restrictions, bool execAsync, CancellationToken cancellationToken = default) + { + string[] keys = new string[5]; + keys[0] = "SPECIFIC_CATALOG"; + keys[1] = "SPECIFIC_SCHEMA"; + keys[2] = "SPECIFIC_NAME"; + keys[3] = "ROUTINE_TYPE"; + keys[4] = "PARAMETER_NAME"; + + StringBuilder sql = new StringBuilder(@"SELECT * FROM INFORMATION_SCHEMA.PARAMETERS"); + // now get our where clause and append it if there is one + string where = GetWhereClause(null, keys, restrictions); + if (!String.IsNullOrEmpty(where)) + sql.AppendFormat(CultureInfo.InvariantCulture, " WHERE {0}", where); + + MySqlSchemaCollection coll = await QueryCollectionAsync("parameters", sql.ToString(), execAsync, cancellationToken).ConfigureAwait(false); + + if ((coll.Rows.Count != 0) && ((string)coll.Rows[0]["routine_type"] == "FUNCTION")) + { + // update missing data for the first row (function return value). + // (using sames valus than GetParametersFromShowCreate). + coll.Rows[0]["parameter_mode"] = "IN"; + coll.Rows[0]["parameter_name"] = "return_value"; // "FUNCTION"; + } + return coll; + } + + /// + /// Return schema information about parameters for procedures and functions + /// Restrictions supported are: + /// schema, name, type, parameter name + /// + public virtual async Task GetProcedureParametersAsync(string[] restrictions, + MySqlSchemaCollection routines, bool execAsync, CancellationToken cancellationToken = default) + { + MySqlSchemaCollection parms = null; + + if (routines == null || routines.Rows.Count == 0) + { + parms = await GetParametersForRoutineFromexecAsync(restrictions, execAsync, cancellationToken).ConfigureAwait(false); + } + else foreach (MySqlSchemaRow routine in routines.Rows) + { + if (restrictions != null && restrictions.Length >= 3) + restrictions[2] = routine["ROUTINE_NAME"].ToString(); + + parms = await GetParametersForRoutineFromexecAsync(restrictions, execAsync, cancellationToken).ConfigureAwait(false); + } + parms.Name = "Procedure Parameters"; + return parms; + } + + protected override async Task GetSchemaInternalAsync(string collection, string[] restrictions, bool execAsync, CancellationToken cancellationToken = default) + { + MySqlSchemaCollection dt = await base.GetSchemaInternalAsync(collection, restrictions, execAsync, cancellationToken).ConfigureAwait(false); + if (dt != null) + return dt; + + switch (collection) + { + case "VIEWS": + return await GetViewsAsync(restrictions, execAsync, cancellationToken).ConfigureAwait(false); + case "PROCEDURES": + return await GetProceduresAsync(restrictions, execAsync, cancellationToken).ConfigureAwait(false); + case "PROCEDURE PARAMETERS": + return await GetProcedureParametersAsync(restrictions, null, execAsync, cancellationToken).ConfigureAwait(false); + case "TRIGGERS": + return await GetTriggersAsync(restrictions, execAsync, cancellationToken).ConfigureAwait(false); + case "VIEWCOLUMNS": + return await GetViewColumnsAsync(restrictions, execAsync, cancellationToken).ConfigureAwait(false); + } + return null; + } + + private static string GetWhereClause(string initial_where, string[] keys, string[] values) + { + StringBuilder where = new StringBuilder(initial_where); + if (values != null) + { + for (int i = 0; i < keys.Length; i++) + { + if (i >= values.Length) break; + if (values[i] == null || values[i] == String.Empty) continue; + if (where.Length > 0) + where.Append(" AND "); + where.AppendFormat(CultureInfo.InvariantCulture, + "{0} LIKE '{1}'", keys[i], values[i]); + } + } + return where.ToString(); + } + + private async Task QueryAsync(string tableName, string initialWhere, string[] keys, string[] values, bool execAsync, CancellationToken cancellationToken = default) + { + StringBuilder query = new StringBuilder("SELECT * FROM INFORMATION_SCHEMA."); + query.Append(tableName); + + string where = GetWhereClause(initialWhere, keys, values); + + if (where.Length > 0) + query.AppendFormat(CultureInfo.InvariantCulture, " WHERE {0}", where); + + if (tableName.Equals("COLUMNS", StringComparison.OrdinalIgnoreCase)) + query.Append(" ORDER BY ORDINAL_POSITION"); + + return await GetTableAsync(query.ToString(), execAsync, cancellationToken).ConfigureAwait(false); + } + + private async Task GetTableAsync(string sql, bool execAsync, CancellationToken cancellationToken = default) + { + MySqlSchemaCollection c = new MySqlSchemaCollection(); + using MySqlCommand cmd = new MySqlCommand(sql, connection); + MySqlDataReader reader = await cmd.ExecuteReaderAsync(default, execAsync, cancellationToken).ConfigureAwait(false); + + // add columns + for (int i = 0; i < reader.FieldCount; i++) + c.AddColumn(reader.GetName(i), reader.GetFieldType(i)); + + using (reader) + { + while (await reader.ReadAsync(execAsync, cancellationToken).ConfigureAwait(false)) + { + MySqlSchemaRow row = c.AddRow(); + for (int i = 0; i < reader.FieldCount; i++) + row[i] = reader.GetValue(i); + } + } + + return c; + } + + public override async Task GetForeignKeysAsync(string[] restrictions, bool execAsync, CancellationToken cancellationToken = default) + { + if (!connection.driver.Version.isAtLeast(5, 1, 16)) + return await base.GetForeignKeysAsync(restrictions, execAsync, cancellationToken).ConfigureAwait(false); + + string sql = @"SELECT rc.constraint_catalog, rc.constraint_schema, + rc.constraint_name, kcu.table_catalog, kcu.table_schema, rc.table_name, + rc.match_option, rc.update_rule, rc.delete_rule, + NULL as referenced_table_catalog, + kcu.referenced_table_schema, rc.referenced_table_name + FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc + LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu ON + kcu.constraint_catalog <=> rc.constraint_catalog AND + kcu.constraint_schema <=> rc.constraint_schema AND + kcu.constraint_name <=> rc.constraint_name + WHERE 1=1 AND kcu.ORDINAL_POSITION=1"; + + StringBuilder where = new StringBuilder(); + if (restrictions.Length >= 2 && !String.IsNullOrEmpty(restrictions[1])) + where.AppendFormat(CultureInfo.InvariantCulture, + " AND rc.constraint_schema LIKE '{0}'", restrictions[1]); + if (restrictions.Length >= 3 && !String.IsNullOrEmpty(restrictions[2])) + where.AppendFormat(CultureInfo.InvariantCulture, + " AND rc.table_name LIKE '{0}'", restrictions[2]); + if (restrictions.Length >= 4 && !String.IsNullOrEmpty(restrictions[3])) + where.AppendFormat(CultureInfo.InvariantCulture, + " AND rc.constraint_name LIKE '{0}'", restrictions[2]); + + sql += where.ToString(); + + return await GetTableAsync(sql, execAsync, cancellationToken).ConfigureAwait(false); + } + + public override async Task GetForeignKeyColumnsAsync(string[] restrictions, bool execAsync, CancellationToken cancellationToken = default) + { + if (!connection.driver.Version.isAtLeast(5, 0, 6)) + return await base.GetForeignKeyColumnsAsync(restrictions, execAsync, cancellationToken).ConfigureAwait(false); + + string sql = @"SELECT kcu.* FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu + WHERE kcu.referenced_table_name IS NOT NULL"; + + StringBuilder where = new StringBuilder(); + if (restrictions.Length >= 2 && !String.IsNullOrEmpty(restrictions[1])) + where.AppendFormat(CultureInfo.InvariantCulture, + " AND kcu.constraint_schema LIKE '{0}'", restrictions[1]); + if (restrictions.Length >= 3 && !String.IsNullOrEmpty(restrictions[2])) + where.AppendFormat(CultureInfo.InvariantCulture, + " AND kcu.table_name LIKE '{0}'", restrictions[2]); + if (restrictions.Length >= 4 && !String.IsNullOrEmpty(restrictions[3])) + where.AppendFormat(CultureInfo.InvariantCulture, + " AND kcu.constraint_name LIKE '{0}'", restrictions[3]); + + sql += where.ToString(); + + return await GetTableAsync(sql, execAsync, cancellationToken).ConfigureAwait(false); + } + } +} diff --git a/MySQL.Data/src/Interceptors/CommandInterceptor.cs b/MySQL.Data/src/Interceptors/CommandInterceptor.cs new file mode 100644 index 000000000..34e0ebb32 --- /dev/null +++ b/MySQL.Data/src/Interceptors/CommandInterceptor.cs @@ -0,0 +1,175 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Data; + +namespace MySql.Data.MySqlClient +{ + /// + /// BaseCommandInterceptor is the base class that should be used for all userland + /// command interceptors + /// + public abstract class BaseCommandInterceptor + { + /// + /// Gets the active connection. + /// + protected MySqlConnection ActiveConnection { get; private set; } + + /// + /// Executes an SQL statements that returns a scalar value such as a calculation. + /// + /// The SQL statement to execute. + /// A scalar value that represents the result returned by the execution of the SQL statement. + /// false. + /// This method is intended to be overriden. + public virtual bool ExecuteScalar(string sql, ref object returnValue) + { + return false; + } + + /// + /// Executes an SQL statement that returns the number of affected rows. + /// + /// The SQL statement to execute. + /// The number of affected rows. + /// false. + /// This method is intended to be overriden. + public virtual bool ExecuteNonQuery(string sql, ref int returnValue) + { + return false; + } + + /// + /// Executes an SQL statement that will return a resultset. + /// + /// The SQL statement to execute. + /// A value that describes the results of the query and its effect on the database. + /// A object containing the result of the statement execution. + /// false. + /// This method is intended to be overriden. + public virtual bool ExecuteReader(string sql, CommandBehavior behavior, ref MySqlDataReader returnValue) + { + return false; + } + + /// + /// Sets the active connection. + /// + /// The active connection. + public virtual void Init(MySqlConnection connection) + { + ActiveConnection = connection; + } + } + + /// + /// CommandInterceptor is the "manager" class that keeps the list of registered interceptors + /// for the given connection. + /// + internal sealed partial class CommandInterceptor : Interceptor + { + bool _insideInterceptor = false; + readonly List _interceptors = new List(); + + public CommandInterceptor(MySqlConnection connection) + { + Connection = connection; + + LoadInterceptors(connection.Settings.CommandInterceptors); + } + + public bool ExecuteScalar(string sql, ref object returnValue) + { + if (_insideInterceptor) return false; + _insideInterceptor = true; + + bool handled = false; + + foreach (BaseCommandInterceptor bci in _interceptors) + handled |= bci.ExecuteScalar(sql, ref returnValue); + + _insideInterceptor = false; + return handled; + } + + public bool ExecuteNonQuery(string sql, ref int returnValue) + { + if (_insideInterceptor) return false; + _insideInterceptor = true; + + bool handled = false; + + foreach (BaseCommandInterceptor bci in _interceptors) + handled |= bci.ExecuteNonQuery(sql, ref returnValue); + + _insideInterceptor = false; + return handled; + } + + public bool ExecuteReader(string sql, CommandBehavior behavior, ref MySqlDataReader returnValue) + { + if (_insideInterceptor) return false; + _insideInterceptor = true; + + bool handled = false; + + foreach (BaseCommandInterceptor bci in _interceptors) + handled |= bci.ExecuteReader(sql, behavior, ref returnValue); + + _insideInterceptor = false; + return handled; + } + + protected override void AddInterceptor(object o) + { + if (o == null) + throw new ArgumentException("Unable to instantiate CommandInterceptor"); + + if (!(o is BaseCommandInterceptor)) + throw new InvalidOperationException(String.Format(Resources.TypeIsNotCommandInterceptor, + o.GetType())); + BaseCommandInterceptor ie = (BaseCommandInterceptor) o; + ie.Init(Connection); + _interceptors.Insert(0, (BaseCommandInterceptor)o); + } + + + protected override string ResolveType(string nameOrType) + { + if (MySqlConfiguration.Settings == null || MySqlConfiguration.Settings.CommandInterceptors == null) + return base.ResolveType(nameOrType); + foreach (InterceptorConfigurationElement e in MySqlConfiguration.Settings.CommandInterceptors) + if (String.Compare(e.Name, nameOrType, true) == 0) + return e.Type; + return base.ResolveType(nameOrType); + } + } +} diff --git a/MySQL.Data/src/Interceptors/ExceptionInterceptor.cs b/MySQL.Data/src/Interceptors/ExceptionInterceptor.cs new file mode 100644 index 000000000..475c6dc30 --- /dev/null +++ b/MySQL.Data/src/Interceptors/ExceptionInterceptor.cs @@ -0,0 +1,130 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Linq; +using MySql.Data.MySqlClient; + + +namespace MySql.Data.MySqlClient.Interceptors +{ + /// + /// BaseExceptionInterceptor is the base class that should be used for all userland + /// exception interceptors. + /// + public abstract class BaseExceptionInterceptor + { + /// + /// Returns the received exception. + /// + /// The exception to be returned. + /// The exception originally received. + public abstract Exception InterceptException(Exception exception); + + /// + /// Gets the active connection. + /// + protected MySqlConnection ActiveConnection { get; private set; } + + /// + /// Initilizes this object by setting the active connection. + /// + /// The connection to become active. + public virtual void Init(MySqlConnection connection) + { + ActiveConnection = connection; + } + } + + /// + /// StandardExceptionInterceptor is the standard interceptor that simply returns the exception. + /// It is the default action. + /// + internal sealed class StandardExceptionInterceptor : BaseExceptionInterceptor + { + /// + /// Returns the received exception, which is the default action + /// + /// The exception to be returned. + /// The exception originally received. + public override Exception InterceptException(Exception exception) + { + return exception; + } + } + + /// + /// ExceptionInterceptor is the "manager" class that keeps the list of registered interceptors + /// for the given connection. + /// + internal sealed class ExceptionInterceptor : Interceptor + { + readonly List _interceptors = new List(); + + public ExceptionInterceptor(MySqlConnection connection) + { + Connection = connection; + + LoadInterceptors(connection.Settings.ExceptionInterceptors); + + // we always have the standard interceptor + _interceptors.Add(new StandardExceptionInterceptor()); + + } + + protected override void AddInterceptor(object o) + { + if (o == null) + throw new ArgumentException("Unable to instantiate ExceptionInterceptor"); + + if (!(o is BaseExceptionInterceptor)) + throw new InvalidOperationException(String.Format(Resources.TypeIsNotExceptionInterceptor, + o.GetType())); + BaseExceptionInterceptor ie = o as BaseExceptionInterceptor; + ie.Init(Connection); + _interceptors.Insert(0, (BaseExceptionInterceptor)o); + } + + public void Throw(Exception exception) + { + Exception e = _interceptors.Aggregate(exception, (current, ie) => ie.InterceptException(current)); + throw e; + } + + protected override string ResolveType(string nameOrType) + { + if (MySqlConfiguration.Settings == null || MySqlConfiguration.Settings.ExceptionInterceptors == null) + return base.ResolveType(nameOrType); + foreach (InterceptorConfigurationElement e in MySqlConfiguration.Settings.ExceptionInterceptors) + if (String.Compare(e.Name, nameOrType, true) == 0) + return e.Type; + return base.ResolveType(nameOrType); + } + } +} diff --git a/MySQL.Data/src/Interceptors/Interceptor.cs b/MySQL.Data/src/Interceptors/Interceptor.cs new file mode 100644 index 000000000..87dd0c572 --- /dev/null +++ b/MySQL.Data/src/Interceptors/Interceptor.cs @@ -0,0 +1,64 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; + +namespace MySql.Data.MySqlClient +{ + /// + /// Interceptor is the base class for the "manager" classes such as ExceptionInterceptor, + /// CommandInterceptor, etc + /// + internal abstract class Interceptor + { + protected MySqlConnection Connection; + + protected void LoadInterceptors(string interceptorList) + { + if (String.IsNullOrEmpty(interceptorList)) return; + + string[] interceptors = interceptorList.Split('|'); + foreach (string interceptorType in interceptors) + { + if (String.IsNullOrEmpty(interceptorType)) continue; + + string type = ResolveType(interceptorType); + Type t = Type.GetType(type); + object interceptorObject = Activator.CreateInstance(t); + AddInterceptor(interceptorObject); + } + } + + protected abstract void AddInterceptor(object o); + + protected virtual string ResolveType(string nameOrType) + { + return nameOrType; + } + } +} diff --git a/MySQL.Data/src/MySQLActivitySource.cs b/MySQL.Data/src/MySQLActivitySource.cs new file mode 100644 index 000000000..739bcee09 --- /dev/null +++ b/MySQL.Data/src/MySQLActivitySource.cs @@ -0,0 +1,137 @@ +// Copyright © 2023, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Data; +using System.Diagnostics; +using System.Reflection; +using System.Threading; +using MySql.Data.MySqlClient; + +namespace MySql.Data +{ +#if NET5_0_OR_GREATER + static class MySQLActivitySource + { + static readonly ActivitySource Source; + + static MySQLActivitySource() + { + var assembly = typeof(MySQLActivitySource).Assembly; + var version = assembly.GetCustomAttribute()?.Version ?? "0.0.0"; + Source = new("connector-net", version); + } + + private static bool Active => Source.HasListeners(); + + internal static Activity OpenConnection(MySqlConnectionStringBuilder settings) + { + return InternalOpenConnection(settings, "Connection"); + } + + internal static Activity OpenPooledConnection(MySqlConnectionStringBuilder settings) + { + return InternalOpenConnection(settings, "Connection (pooled)"); + } + + private static Activity InternalOpenConnection(MySqlConnectionStringBuilder settings, string name) + { + if (!Active) return null; + + var activity = Source.StartActivity(name, ActivityKind.Client); + activity?.SetTag("net.transport", settings.ConnectionProtocol); + activity?.SetTag("db.connection_string", settings.GetConnectionString(false)); + if (settings.ConnectionProtocol == MySqlConnectionProtocol.Tcp) + activity?.SetTag("net.peer.port", settings.Port); + + return activity; + } + + internal static void CloseConnection(Activity activity) + { + activity?.SetTag("otel.status_code", "OK"); + activity?.Dispose(); + } + + internal static void SetException(Activity activity, Exception ex) + { + var tags = new ActivityTagsCollection + { + { "exception.type", ex.GetType().FullName }, + { "exception.message", ex.Message }, + { "exception.stacktrace", ex.ToString() }, + }; + + var activityEvent = new ActivityEvent("exception", tags: tags); + activity?.AddEvent(activityEvent); + activity?.SetTag("otel.status_code", "ERROR"); + activity?.SetTag("otel.status_description", ex is MySqlException ? (ex as MySqlException).SqlState : ex.Message); + activity?.Dispose(); + } + + + internal static Activity CommandStart(MySqlCommand command) + { + if (!Active) return null; + + var settings = command.Connection.Settings; + var activity = Activity.Current != null ? Source.StartActivity("SQL Statement", ActivityKind.Client, Activity.Current.Context) : Source.StartActivity("SQL Statement", ActivityKind.Client); + + if (Activity.Current != null) + { + // passing through this attribute will propagate the context into the server + string query_attr = $"00-{Activity.Current.Context.TraceId}-{Activity.Current.Context.SpanId}-00"; + command.Attributes.SetAttribute("traceparent", query_attr); + } + + activity?.SetTag("db.system", "mysql"); + activity?.SetTag("db.name", command.Connection.Database); + activity?.SetTag("db.user", command.Connection.Settings.UserID); + activity?.SetTag("db.statement", command.OriginalCommandText); + activity?.SetTag("thread.id", Thread.CurrentThread.ManagedThreadId); + activity?.SetTag("thread.name", Thread.CurrentThread.Name); + if (command.CommandType == CommandType.TableDirect) + activity?.SetTag("db.sql.table", command.CommandText); + return activity; + } + + internal static void ReceivedFirstResponse(Activity activity) + { + var activityEvent = new ActivityEvent("first-packet-received"); + activity.AddEvent(activityEvent); + } + + internal static void CommandStop(Activity activity) + { + activity?.SetTag("otel.status_code", "OK"); + activity?.Dispose(); + } + } +#endif +} + diff --git a/MySQL.Data/src/MySql.Data.csproj b/MySQL.Data/src/MySql.Data.csproj new file mode 100644 index 000000000..e8d4a0b3c --- /dev/null +++ b/MySQL.Data/src/MySql.Data.csproj @@ -0,0 +1,131 @@ + + + + + MySql.Data.MySqlClient .Net Core Class Library + Copyright © 2004, 2025, Oracle and/or its affiliates. + en-US + 9.4.0 + Oracle Corporation + MySql.Data + netstandard2.0;netstandard2.1;net9.0;net8.0; + MySql.Data + MySql;.NET Connector;MySql Connector/NET;netcore;.Net Core;MySql Conector/Net Core;coreclr;C/NET;C/Net Core + Review ReleaseNotes.txt for details. + logo-mysql-170x115.png + README.md + https://dev.mysql.com/downloads/ + GPL-2.0-only WITH Universal-FOSS-exception-1.0 + true + false + True + True + ..\..\ConnectorNetPublicKey.snk + CS1591,CS1587,CS1574,CS1570,SYSLIB0003,CA1416,CS8981 + latest + true + + + + $(TargetFrameworks);net10.0 + + + + net462;net48;$(TargetFrameworks) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(DefineConstants);DEBUG + true + + + + $(DefineConstants);RELEASE + true + + + + $(DefineConstants);RELEASE;COMMERCIAL + true + + + + + True + True + Resources.resx + + + True + True + ResourcesX.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + ResXFileCodeGenerator + ResourcesX.Designer.cs + + + + + \ No newline at end of file diff --git a/MySQL.Data/src/MySqlAttribute.cs b/MySQL.Data/src/MySqlAttribute.cs new file mode 100644 index 000000000..370b7c16a --- /dev/null +++ b/MySQL.Data/src/MySqlAttribute.cs @@ -0,0 +1,235 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Types; +using System; +using System.Reflection; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + /// + /// Represents a query attribute to a . + /// + public class MySqlAttribute : ICloneable + { + private const int UNSIGNED_MASK = 0x8000; + private string _attributeName; + private object _attributeValue; + private MySqlDbType _mySqlDbType; + private int _size; + + #region Constructors + /// + /// Initializes a new instance of the class. + /// + public MySqlAttribute() { } + + /// + /// Initializes a new instance of the class with the attribute name and its value. + /// + /// Name of the attribute. + /// Value of the attribute. + public MySqlAttribute(string attributeName, object attributeValue) + { + AttributeName = attributeName; + Value = attributeValue; + } + #endregion + + #region Properties + internal MySqlAttributeCollection Collection { get; set; } + + /// + /// Name of the query attribute. + /// + public String AttributeName + { + get { return _attributeName; } + set + { + if (String.IsNullOrWhiteSpace(value)) + throw new ArgumentException("'AttributeName' property can not be null or empty string.", "AttributeName"); + _attributeName = value; + } + } + + /// + /// Value of the query attribute. + /// + public object Value + { + get { return _attributeValue; } + set + { + _attributeValue = value; + + if (value is byte[] valueAsByte) + _size = valueAsByte.Length; + else if (value is string valueAsString) + _size = valueAsString.Length; + + SetTypeFromValue(); + } + } + + /// + /// Gets or sets the of the attribute. + /// + public MySqlDbType MySqlDbType + { + get { return _mySqlDbType; } + set + { + SetMySqlDbType(value); + } + } + + internal IMySqlValue ValueObject { get; private set; } + #endregion + + /// + /// Sets the MySqlDbType from the Value + /// + private void SetTypeFromValue() + { + if (_attributeValue == null || _attributeValue == DBNull.Value) return; + + if (_attributeValue is Guid) + MySqlDbType = MySqlDbType.Guid; + else if (_attributeValue is TimeSpan) + MySqlDbType = MySqlDbType.Time; + else if (_attributeValue is bool) + MySqlDbType = MySqlDbType.Byte; + else + { + Type t = _attributeValue.GetType(); + if (t.GetTypeInfo().BaseType == typeof(Enum)) + t = t.GetTypeInfo().GetEnumUnderlyingType(); + switch (t.Name) + { + case "SByte": MySqlDbType = MySqlDbType.Byte; break; + case "Byte": MySqlDbType = MySqlDbType.UByte; break; + case "Int16": MySqlDbType = MySqlDbType.Int16; break; + case "UInt16": MySqlDbType = MySqlDbType.UInt16; break; + case "Int32": MySqlDbType = MySqlDbType.Int32; break; + case "UInt32": MySqlDbType = MySqlDbType.UInt32; break; + case "Int64": MySqlDbType = MySqlDbType.Int64; break; + case "UInt64": MySqlDbType = MySqlDbType.UInt64; break; + case "DateTime": MySqlDbType = MySqlDbType.DateTime; break; + case "String": MySqlDbType = MySqlDbType.VarChar; break; + case "Single": MySqlDbType = MySqlDbType.Float; break; + case "Double": MySqlDbType = MySqlDbType.Double; break; + case "MySqlGeometry": MySqlDbType = MySqlDbType.Geometry; break; + case "Decimal": MySqlDbType = MySqlDbType.Decimal; break; + case "Object": + default: + MySqlDbType = MySqlDbType.Blob; + break; + } + } + } + + private void SetMySqlDbType(MySqlDbType mysqlDbtype) + { + _mySqlDbType = mysqlDbtype == MySqlDbType.JSON ? MySqlDbType.VarChar : mysqlDbtype; + ValueObject = MySqlField.GetIMySqlValue(_mySqlDbType); + } + + /// + /// Gets the value for the attribute type. + /// + internal int GetPSType() + { + switch (_mySqlDbType) + { + case MySqlDbType.Bit: + return (int)MySqlDbType.Int64 | UNSIGNED_MASK; + case MySqlDbType.UByte: + return (int)MySqlDbType.Byte | UNSIGNED_MASK; + case MySqlDbType.UInt64: + return (int)MySqlDbType.Int64 | UNSIGNED_MASK; + case MySqlDbType.UInt32: + return (int)MySqlDbType.Int32 | UNSIGNED_MASK; + case MySqlDbType.UInt24: + return (int)MySqlDbType.Int32 | UNSIGNED_MASK; + case MySqlDbType.UInt16: + return (int)MySqlDbType.Int16 | UNSIGNED_MASK; + case MySqlDbType.Guid: + return (int)MySqlDbType.Guid - 600; + default: + int value = (int)_mySqlDbType; + value = value > 255 ? value - 500 : value; + return value; + } + } + + /// + /// Serialize the value of the query attribute. + /// + internal async Task SerializeAsync(MySqlPacket packet, bool binary, MySqlConnectionStringBuilder settings, bool execAsync) + { + if (!binary && (_attributeValue == null || _attributeValue == DBNull.Value)) + await packet.WriteStringNoNullAsync("NULL", execAsync).ConfigureAwait(false); + else + { + if (ValueObject.MySqlDbType == MySqlDbType.Guid) + { + MySqlGuid g = (MySqlGuid)ValueObject; + g.OldGuids = settings.OldGuids; + ValueObject = g; + } + if (ValueObject.MySqlDbType == MySqlDbType.Geometry) + { + MySqlGeometry v = (MySqlGeometry)ValueObject; + if (v.IsNull && Value != null) + { + MySqlGeometry.TryParse(Value.ToString(), out v); + } + ValueObject = v; + } + await ValueObject.WriteValueAsync(packet, binary, _attributeValue, _size, execAsync).ConfigureAwait(false); + } + } + + /// + /// Clones this object. + /// + /// An object that is a clone of this object. + public MySqlAttribute Clone() + { + MySqlAttribute clone = new MySqlAttribute(_attributeName, _attributeValue); + return clone; + } + + object ICloneable.Clone() + { + return this.Clone(); + } + } +} diff --git a/MySQL.Data/src/MySqlAttributeCollection.cs b/MySQL.Data/src/MySqlAttributeCollection.cs new file mode 100644 index 000000000..4c66ca4b9 --- /dev/null +++ b/MySQL.Data/src/MySqlAttributeCollection.cs @@ -0,0 +1,124 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; + +namespace MySql.Data.MySqlClient +{ + /// + /// Represents a collection of query attributes relevant to a . + /// + public class MySqlAttributeCollection + { + readonly List _items = new List(); + + internal MySqlAttributeCollection(MySqlCommand cmd) + { + Clear(); + } + + #region Public Methods + /// + /// Gets the at the specified index. + /// + public MySqlAttribute this[int index] + { + get { return InternalGetParameter(index); } + } + + /// + /// Gets the number of objects in the collection. + /// + public int Count => _items.Count; + + /// + /// Adds the specified object to the . + /// + /// object to add. + public MySqlAttribute SetAttribute(MySqlAttribute value) + { + return InternalAdd(value); + } + + /// + /// Adds a query attribute and its value. + /// + /// Name of the query attribute. + /// Value of the query attribute. + public MySqlAttribute SetAttribute(string attributeName, object value) + { + return InternalAdd(new MySqlAttribute(attributeName, value)); + } + + /// + /// Removes all items from the collection. + /// + public void Clear() + { + foreach (MySqlAttribute attr in _items) + attr.Collection = null; + _items.Clear(); + } + #endregion + + #region Private Methods + private MySqlAttribute InternalAdd(MySqlAttribute value) + { + if (value == null) + throw new ArgumentException("The MySqlAttributeCollection only accepts non-null MySqlAttribute type objects.", "value"); + + _items.Add(value); + value.Collection = this; + return value; + } + + private void CheckIndex(int index) + { + if (index < 0 || index >= Count) + throw new IndexOutOfRangeException("Attribute index is out of range."); + } + + private MySqlAttribute InternalGetParameter(int index) + { + CheckIndex(index); + return _items[index]; + } + #endregion + + #region MySqlCollection Implementation + /// + /// Returns an enumerator that iterates through the . + /// + public IEnumerator GetEnumerator() + { + return _items.GetEnumerator(); + } + #endregion + } +} diff --git a/MySQL.Data/src/MySqlBaseConnectionStringBuilder.cs b/MySQL.Data/src/MySqlBaseConnectionStringBuilder.cs new file mode 100644 index 000000000..278cbcf16 --- /dev/null +++ b/MySQL.Data/src/MySqlBaseConnectionStringBuilder.cs @@ -0,0 +1,527 @@ +// Copyright © 2018, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data.Common; +using System.Globalization; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Security.Authentication; +using System.Text; +using static MySql.Data.Common.MySqlConnectionStringOption; + +namespace MySql.Data.MySqlClient +{ + /// + /// Abstract class that provides common functionality for connection options that apply for all protocols. + /// + public abstract class MySqlBaseConnectionStringBuilder : DbConnectionStringBuilder + { + /// + /// Readonly field containing a collection of protocol shared connection options. + /// + internal static readonly MySqlConnectionStringOptionCollection Options = new MySqlConnectionStringOptionCollection(); + + static MySqlBaseConnectionStringBuilder() + { + // Server options. + Options.Add(new MySqlConnectionStringOption("server", "host,data source,datasource", typeof(string), "" /*"localhost"*/, false)); + Options.Add(new MySqlConnectionStringOption("database", "initial catalog", typeof(string), string.Empty, false)); + Options.Add(new MySqlConnectionStringOption("protocol", "connection protocol,connectionprotocol", typeof(MySqlConnectionProtocol), MySqlConnectionProtocol.Sockets, false, + (SetterDelegate)((msb, sender, value) => + { +#if !NETFRAMEWORK + MySqlConnectionProtocol enumValue; + if (Enum.TryParse(value.ToString(), true, out enumValue)) + { + if (!Platform.IsWindows() && (enumValue == MySqlConnectionProtocol.Memory || enumValue == MySqlConnectionProtocol.Pipe)) + throw new PlatformNotSupportedException(string.Format(Resources.OptionNotCurrentlySupported, $"Protocol={value}")); + } +#endif + msb.SetValue("protocol", value); + }), + (GetterDelegate)((msb, sender) => msb.ConnectionProtocol))); + Options.Add(new MySqlConnectionStringOption("port", null, typeof(uint), (uint)3306, false)); + Options.Add(new MySqlConnectionStringOption("dns-srv", "dnssrv", typeof(bool), false, false)); + + // Authentication options. + Options.Add(new MySqlConnectionStringOption("user id", "uid,username,user name,user,userid", typeof(string), "", false)); + Options.Add(new MySqlConnectionStringOption("password", "pwd,password1,pwd1", typeof(string), "", false)); + Options.Add(new MySqlConnectionStringOption("password2", "pwd2", typeof(string), "", false)); + Options.Add(new MySqlConnectionStringOption("password3", "pwd3", typeof(string), "", false)); + Options.Add(new MySqlConnectionStringOption("certificatefile", "certificate file", typeof(string), null, false)); + Options.Add(new MySqlConnectionStringOption("certificatepassword", "certificate password,ssl-ca-pwd", typeof(string), null, false)); + Options.Add(new MySqlConnectionStringOption("certificatestorelocation", "certificate store location", typeof(MySqlCertificateStoreLocation), MySqlCertificateStoreLocation.None, false)); + Options.Add(new MySqlConnectionStringOption("certificatethumbprint", "certificate thumb print", typeof(string), null, false)); + Options.Add(new MySqlConnectionStringOption("sslmode", "ssl mode,ssl-mode", typeof(MySqlSslMode), MySqlSslMode.Preferred, false, + (SetterDelegate)((msb, sender, value) => + { + MySqlSslMode newValue = (MySqlSslMode)Enum.Parse(typeof(MySqlSslMode), value.ToString(), true); + msb.SetValue("sslmode", newValue); + }), + (GetterDelegate)((msb, sender) => { return msb.SslMode; }))); + Options.Add(new MySqlConnectionStringOption("sslca", "ssl-ca", typeof(string), null, false, + (SetterDelegate)((msb, sender, value) => { msb.SslCa = value as string; }), + (GetterDelegate)((msb, sender) => { return msb.SslCa; }))); + Options.Add(new MySqlConnectionStringOption("sslkey", "ssl-key", typeof(string), null, false)); + Options.Add(new MySqlConnectionStringOption("sslcert", "ssl-cert", typeof(string), null, false)); + Options.Add(new MySqlConnectionStringOption("tlsversion", "tls-version,tls version", typeof(string), null, false, + (SetterDelegate)((msb, sender, value) => + { + if (value == null || string.IsNullOrWhiteSpace((string)value)) + { + msb.SetValue("tlsversion", null); + return; + } + + string strProtocols = TlsValidation(value); + msb.SetValue("tlsversion", strProtocols); + }), + (GetterDelegate)((msb, sender) => { return msb.TlsVersion; }))); + + // Other properties. + Options.Add(new MySqlConnectionStringOption("keepalive", "keep alive", typeof(uint), (uint)0, false)); + + // Language and charset options. + Options.Add(new MySqlConnectionStringOption("characterset", "character set,charset", typeof(string), "", false)); + } + + private static string TlsValidation(object value) + { + string strValue = ((string)value).TrimStart('[', '(').TrimEnd(']', ')').Replace(" ", string.Empty); + string strProtocols; + SslProtocols protocols = SslProtocols.None; + bool unsupported = false; + bool nonValid = false; + + if (string.IsNullOrWhiteSpace(strValue) || strValue == ",") + throw new ArgumentException(Resources.TlsVersionsEmpty); + + foreach (string opt in strValue.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) + { + string tls = opt.ToLowerInvariant().Replace("v", "").Replace(".", ""); + tls = tls.Equals("tls1") || tls.Equals("tls10") ? "tls" : tls; + + if (Enum.TryParse(tls, true, out SslProtocols protocol) && ((int)protocol) >= 3072) + protocols |= protocol; + else if (protocol.HasFlag(SslProtocols.Tls) || protocol.HasFlag(SslProtocols.Tls11)) + unsupported = true; + else + nonValid = true; + } + + if (protocols == SslProtocols.None) + { + if (unsupported) + throw new ArgumentException(Resources.TlsUnsupportedVersions); + if (nonValid) + throw new ArgumentException(Resources.TlsNonValidProtocols); + } + + strProtocols = protocols == SslProtocols.None ? string.Empty : Enum.Format(typeof(SslProtocols), protocols, "G"); + strProtocols = (value.ToString().Equals("Tls13", StringComparison.OrdinalIgnoreCase) + || value.ToString().Equals("Tlsv1.3", StringComparison.OrdinalIgnoreCase)) ? "Tls13" : strProtocols; + + return strProtocols; + } + + /// + /// Gets or sets a dictionary representing key-value pairs for each connection option. + /// + internal Dictionary values { get; set; } + #region Server Properties + + /// + /// Gets or sets the name of the server. + /// + /// The server. + /// + /// If this property is not set, then the provider will attempt to connect tolocalhost + /// even though this property will return String.Empty. + [Category("Connection")] + [Description("Server to connect to")] + [RefreshProperties(RefreshProperties.All)] + public string Server + { + get { return this["server"] as string; } + set { SetValue("server", value); } + } + + /// + /// Gets or sets the name of the database for the initial connection. + /// + /// There is no default for this property and, if not set, the connection will not have a current database. + /// + [Category("Connection")] + [Description("Database to use initially")] + [RefreshProperties(RefreshProperties.All)] + public string Database + { + get { return values["database"] as string; } + set { SetValue("database", value); } + } + + /// + /// Gets or sets the protocol that should be used for communicating + /// with MySQL. + /// + [Category("Connection")] + [DisplayName("Connection Protocol")] + [Description("Protocol to use for connection to MySQL")] + [RefreshProperties(RefreshProperties.All)] + public MySqlConnectionProtocol ConnectionProtocol + { + get { return (MySqlConnectionProtocol)values["protocol"]; } + set { SetValue("protocol", value); } + } + + /// + /// Gets or sets the port number that is used when the socket + /// protocol is being used. + /// + [Category("Connection")] + [Description("Port to use for TCP/IP connections")] + [RefreshProperties(RefreshProperties.All)] + public uint Port + { + get { return (uint)values["port"]; } + set { SetValue("port", value); } + } + + /// + /// Gets or sets a boolean value that indicates whether this connection + /// should resolve DNS SRV records. + /// + [Category("Connection")] + [DisplayName("DNS SRV")] + [Description("The connection should resolve DNS SRV records.")] + [RefreshProperties(RefreshProperties.All)] + public bool DnsSrv + { + get { return (bool)values["dns-srv"]; } + set { SetValue("dns-srv", value); } + } + + #endregion + + #region Authentication Properties + + /// + /// Gets or sets the user ID that should be used to connect with. + /// + [Category("Security")] + [DisplayName("User ID")] + [Description("Indicates the user ID to be used when connecting to the data source.")] + [RefreshProperties(RefreshProperties.All)] + public string UserID + { + get { return (string)values["user id"]; } + set { SetValue("user id", value); } + } + + /// + /// Gets or sets the password that should be used to make a connection. + /// + [Category("Security")] + [Description("Indicates the password to be used when connecting to the data source.")] + [RefreshProperties(RefreshProperties.All)] + [PasswordPropertyText(true)] + public string Password + { + get { return (string)values["password"]; } + set { SetValue("password", value); } + } + + /// + /// Gets or sets the password for a second authentication that should be used to make a connection. + /// + [Category("Security")] + [Description("Indicates the password for a second authentication to be used when connecting to the data source.")] + [RefreshProperties(RefreshProperties.All)] + [PasswordPropertyText(true)] + public string Password2 + { + get { return (string)values["password2"]; } + set { SetValue("password2", value); } + } + + /// + /// Gets or sets the password for a third authentication that should be used to make a connection. + /// + [Category("Security")] + [Description("Indicates the password for a third authentication to be used when connecting to the data source.")] + [RefreshProperties(RefreshProperties.All)] + [PasswordPropertyText(true)] + public string Password3 + { + get { return (string)values["password3"]; } + set { SetValue("password3", value); } + } + + /// + /// Gets or sets the path to the certificate file to be used. + /// + [Category("Authentication")] + [DisplayName("Certificate File")] + [Description("Certificate file in PKCS#12 format (.pfx) or path to a local file that " + + "contains a list of trusted TLS/SSL CAs (.pem).")] + public string CertificateFile + { + get { return (string)values["certificatefile"]; } + set { SetValue("certificatefile", value); } + } + + /// + /// Gets or sets the password to be used in conjunction with the certificate file. + /// + [Category("Authentication")] + [DisplayName("Certificate Password")] + [Description("Password for certificate file")] + public string CertificatePassword + { + get { return (string)values["certificatepassword"]; } + set { SetValue("certificatepassword", value); } + } + + /// + /// Gets or sets the location to a personal store where a certificate is held. + /// + [Category("Authentication")] + [DisplayName("Certificate Store Location")] + [Description("Certificate Store Location for client certificates")] + [DefaultValue(MySqlCertificateStoreLocation.None)] + public MySqlCertificateStoreLocation CertificateStoreLocation + { + get { return (MySqlCertificateStoreLocation)values["certificatestorelocation"]; } + set { SetValue("certificatestorelocation", value); } + } + + /// + /// Gets or sets a certificate thumbprint to ensure correct identification of a certificate contained within a personal store. + /// + [Category("Authentication")] + [DisplayName("Certificate Thumbprint")] + [Description("Certificate thumbprint. Can be used together with Certificate " + + "Store Location parameter to uniquely identify the certificate to be used " + + "for SSL authentication.")] + public string CertificateThumbprint + { + get { return (string)values["certificatethumbprint"]; } + set { SetValue("certificatethumbprint", value); } + } + + /// + /// Indicates whether to use SSL connections and how to handle server certificate errors. + /// + [DisplayName("Ssl Mode")] + [Category("Authentication")] + [Description("SSL properties for connection.")] + [DefaultValue(MySqlSslMode.Disabled)] + public MySqlSslMode SslMode + { + get { return (MySqlSslMode)values["sslmode"]; } + set { SetValue("sslmode", value); } + } + + [DisplayName("Ssl Ca")] + [Category("Authentication")] + [Description("Path to a local file that contains a list of trusted TLS/SSL CAs.")] + public string SslCa + { + get { return CertificateFile; } + set + { + CertificateFile = value; + } + } + + /// + /// Sets the TLS versions to use in a SSL connection to the server. + /// + /// + /// Tls version=TLSv1.2,TLSv1.3; + /// + [DisplayName("TLS version")] + [Category("Security")] + [Description("TLS versions to use in a SSL connection to the server.")] + public string TlsVersion + { + get { return (string)values["tlsversion"]; } + set { SetValue("tlsversion", value); } + } + + /// + /// Gets or sets the path to a local key file in PEM format to use for establishing an encrypted connection. + /// + [DisplayName("Ssl Key")] + [Category("Authentication")] + [Description("Name of the SSL key file in PEM format to use for establishing an encrypted connection.")] + public string SslKey + { + get { return (string)values["sslkey"]; } + set { SetValue("sslkey", value); } + } + + /// + /// Gets or sets the path to a local certificate file in PEM format to use for establishing an encrypted connection. + /// + [DisplayName("Ssl Cert")] + [Category("Authentication")] + [Description("Name of the SSL certificate file in PEM format to use for establishing an encrypted connection.")] + public string SslCert + { + get { return (string)values["sslcert"]; } + set { SetValue("sslcert", value); } + } + + #endregion + + #region Other Properties + + /// + /// Gets or sets the idle connection time(seconds) for TCP connections. + /// + [DisplayName("Keep Alive")] + [Description("For TCP connections, the idle connection time (in seconds) before the first keepalive packet is sent." + + "A value of 0 indicates that keepalive is not used.")] + [DefaultValue(0)] + public uint Keepalive + { + get { return (uint)values["keepalive"]; } + set { SetValue("keepalive", value); } + } + + #endregion + + #region Language and Character Set Properties + + /// + /// Gets or sets the character set that should be used for sending queries to the server. + /// + [DisplayName("Character Set")] + [Category("Advanced")] + [Description("Character set this connection should use.")] + [RefreshProperties(RefreshProperties.All)] + [DefaultValue("")] + public string CharacterSet + { + get { return (string)values["characterset"]; } + set { SetValue("characterset", value); } + } + + #endregion + + /// + /// Analyzes the connection string for potential duplicated or invalid connection options. + /// + /// Connection string. + /// Flag that indicates if the connection is using X Protocol. + /// Flag that indicates if the default port is used. + /// Flag that indicates if the connection string has been analyzed. + internal void AnalyzeConnectionString(string connectionString, bool isXProtocol, bool isDefaultPort = true, bool isAnalyzed = false) + { + if (!isAnalyzed && !string.IsNullOrWhiteSpace(connectionString)) + { + string[] queries = connectionString.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries); + bool isDnsSrv = false; + + if (queries.FirstOrDefault(q => q.ToLowerInvariant().Contains("dns-srv=true")) != null + || queries.FirstOrDefault(q => q.ToLowerInvariant().Contains("dnssrv=true")) != null) + isDnsSrv = true; + + foreach (string query in queries) + { + string[] keyValue = query.Split('='); + if (keyValue.Length % 2 != 0) + continue; + + var keyword = keyValue[0].ToLowerInvariant().Trim(); + var value = query.Contains(",") ? query.Replace(keyword, "") : keyValue[1].ToLowerInvariant(); + MySqlConnectionStringOption option = Options.Options.Where(o => o.Keyword == keyword || (o.Synonyms != null && o.Synonyms.Contains(keyword))).FirstOrDefault(); + + // DNS SRV option can't be used if Port, Unix Socket or Multihost are specified + if (isDnsSrv) + { + if (option.Keyword == "port" && !isDefaultPort) + throw new ArgumentException(Resources.DnsSrvInvalidConnOptionPort); + if (option.Keyword == "server" && ((value.Contains("address") && value.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries).Length > 2) || value.Contains(","))) + throw new ArgumentException(Resources.DnsSrvInvalidConnOptionMultihost); + if (option.Keyword == "protocol" && (value.ToLowerInvariant().Contains("unix") || value.ToLowerInvariant().Contains("unixsocket"))) + throw new ArgumentException(Resources.DnsSrvInvalidConnOptionUnixSocket); + } + + if (option == null) continue; + + // Preferred is not allowed for the X Protocol. + if (isXProtocol && option.Keyword == "sslmode" && (value == "preferred" || value == "prefered")) + throw new ArgumentException(string.Format(Resources.InvalidSslMode, keyValue[1])); + } + } + } + + public string GetConnectionString(bool includePass) + { + if (includePass) return ConnectionString; + + var conn = new StringBuilder(); + string delimiter = ""; + foreach (string key in this.Keys) + { + if (string.Compare(key, "password", StringComparison.OrdinalIgnoreCase) == 0 || + string.Compare(key, "pwd", StringComparison.OrdinalIgnoreCase) == 0) continue; + conn.AppendFormat(CultureInfo.CurrentCulture, "{0}{1}={2}", + delimiter, key, this[key]); + delimiter = ";"; + } + + return conn.ToString(); + } + + internal abstract MySqlConnectionStringOption GetOption(string key); + public override int GetHashCode() + { + return base.GetHashCode(); + } + + internal void SetValue(string keyword, object value, [CallerMemberName] string callerName = "") + { + MySqlConnectionStringOption option = GetOption(keyword); + if (callerName != ".cctor" && option.IsCustomized) + this[keyword] = value; + else + SetInternalValue(keyword, value); + } + + internal abstract void SetInternalValue(string keyword, object value); + + public abstract override bool TryGetValue(string keyword, out object value); + } +} diff --git a/MySQL.Data/src/MySqlClientFactory.cs b/MySQL.Data/src/MySqlClientFactory.cs new file mode 100644 index 000000000..29006a5b9 --- /dev/null +++ b/MySQL.Data/src/MySqlClientFactory.cs @@ -0,0 +1,148 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Data.Common; +using System.Reflection; +using System.Security.Permissions; + +namespace MySql.Data.MySqlClient +{ + /// + /// Represents a set of methods for creating instances of the MySQL client implementation of the data source classes. + /// + [ReflectionPermission(SecurityAction.Assert, MemberAccess = true)] + public sealed partial class MySqlClientFactory : DbProviderFactory, IServiceProvider + { + /// + /// Gets an instance of the . + /// This can be used to retrieve strongly typed data objects. + /// + public static MySqlClientFactory Instance = new MySqlClientFactory(); + private Type _dbServicesType; + private FieldInfo _mySqlDbProviderServicesInstance; + + /// + /// Returns a strongly typed instance. + /// + /// A new strongly typed instance of DbCommand. + public override DbCommand CreateCommand() + { + return new MySqlCommand(); + } + + /// + /// Returns a strongly typed instance. + /// + /// A new strongly typed instance of DbConnection. + public override DbConnection CreateConnection() + { + return new MySqlConnection(); + } + + /// + /// Returns a strongly typed instance. + /// + /// A new strongly typed instance of DbParameter. + public override DbParameter CreateParameter() + { + return new MySqlParameter(); + } + + /// + /// Returns a strongly typed instance. + /// + /// A new strongly typed instance of DbConnectionStringBuilder. + public override DbConnectionStringBuilder CreateConnectionStringBuilder() + { + return new MySqlConnectionStringBuilder(); + } + + /// + /// Returns a strongly typed instance. + /// + /// A new strongly typed instance of DbCommandBuilder. + public override DbCommandBuilder CreateCommandBuilder() + { + return new MySqlCommandBuilder(); + } + + /// + /// Returns a strongly typed instance. + /// + /// A new strongly typed instance of DbDataAdapter. + public override DbDataAdapter CreateDataAdapter() + { + return new MySqlDataAdapter(); + } + + #region IServiceProvider Members + + /// + /// Provide a simple caching layer + /// + private Type DbServicesType => _dbServicesType ?? (_dbServicesType = Type.GetType( + @"System.Data.Common.DbProviderServices, System.Data.Entity, + Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", + false)); + + private FieldInfo MySqlDbProviderServicesInstance + { + get + { + if (_mySqlDbProviderServicesInstance == null) + { + string fullName = Assembly.GetExecutingAssembly().FullName; + string assemblyName = fullName.Replace("MySql.Data", "MySql.Data.EntityFramework"); + string assemblyEf5Name = fullName.Replace("MySql.Data", "MySql.Data.Entity.EF5"); + fullName = $"MySql.Data.MySqlClient.MySqlProviderServices, {assemblyEf5Name}"; + + Type providerServicesType = Type.GetType(fullName, false); + if (providerServicesType == null) + { + fullName = $"MySql.Data.MySqlClient.MySqlProviderServices, {assemblyName}"; + providerServicesType = Type.GetType(fullName, false); + if (providerServicesType == null) + throw new DllNotFoundException(fullName); + } + _mySqlDbProviderServicesInstance = providerServicesType.GetField("Instance", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); + } + return _mySqlDbProviderServicesInstance; + } + } + + object IServiceProvider.GetService(Type serviceType) + { + // DbProviderServices is the only service we offer up right now + return serviceType != DbServicesType ? null : MySqlDbProviderServicesInstance?.GetValue(null); + } + + #endregion + } +} + diff --git a/MySQL.Data/src/MySqlCommand.cs b/MySQL.Data/src/MySqlCommand.cs new file mode 100644 index 000000000..f6f93f415 --- /dev/null +++ b/MySQL.Data/src/MySqlCommand.cs @@ -0,0 +1,1251 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using MySql.Data.MySqlClient.Replication; +using MySql.Data.Types; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Data.Common; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + /// + /// Represents a SQL statement to execute against a MySQL database. This class cannot be inherited. + /// + /// + /// + /// You can reset the property and reuse the + /// object. However, you must close the object before you can execute a new or previous command. + /// + /// + /// If an exception of type is generated by the method executing , + /// the instance remains open. It is the responsibility of the programmer to close the connection. + /// + /// + /// You can read more about it here. + /// + /// + /// Using the '@' symbol for paramters is now the preferred approach although the old pattern of using + /// '?' is still supported. Please be aware that using '@' can cause conflicts when user variables + /// are also used. For more information, see the documentation on the AllowUserVariables connection string option. + /// + /// + [DesignerCategory("Code")] + public sealed class MySqlCommand : DbCommand, IDisposable, ICloneable + { + MySqlConnection connection; + string cmdText; + string originalcmdText; + private PreparableStatement statement; + private int commandTimeout; + private bool resetSqlSelect; + CommandTimer commandTimer; + private bool useDefaultTimeout; + private static List keywords = null; + private bool disposed = false; + internal const string ParameterPrefix = "_cnet_param_"; +#if NET5_0_OR_GREATER + Activity? CurrentActivity; +#endif + + /// + /// Initializes a new instance of the MySqlCommand class. + /// + /// + /// The base constructor initializes all fields to their default values. + /// + public MySqlCommand() + { + CommandType = CommandType.Text; + Parameters = new MySqlParameterCollection(this); + Attributes = new MySqlAttributeCollection(this); + cmdText = String.Empty; + useDefaultTimeout = true; + UpdatedRowSource = UpdateRowSource.Both; + } + + /// + /// Initializes a new instance of the class with the text of the query. + /// + /// The text of the query. + public MySqlCommand(string cmdText) + : this() + { + CommandText = cmdText; + OriginalCommandText = cmdText; + } + + /// + /// Initializes a new instance of the class with the text of the query and a . + /// + /// The text of the query. + /// A that represents the connection to an instance of MySQL Server. + public MySqlCommand(string cmdText, MySqlConnection connection) + : this(cmdText) + { + Connection = connection; + } + + /// + /// Initializes a new instance of the class with the text of the query, + /// a , and the . + /// + /// The text of the query. + /// A that represents the connection to an instance of MySQL Server. + /// The in which the executes. + public MySqlCommand(string cmdText, MySqlConnection connection, MySqlTransaction transaction) + : this(cmdText, connection) + { + Transaction = transaction; + } + + #region Destructor + ~MySqlCommand() + { + Dispose(false); + } + #endregion + + #region Properties + + /// + /// Provides the ID of the last inserted row. + /// ID of the last inserted row. -1 if none exists. + /// + /// An important point to remember is that this property can be used in batch SQL scenarios but it's important to remember that it will + /// only reflect the insert ID from the last insert statement in the batch. This property can also be used when the batch includes select statements + /// and ExecuteReader is used. This property can be consulted during result set processing. + /// + [Browsable(false)] + public Int64 LastInsertedId { get; internal set; } + + /// + /// Gets or sets the SQL statement to execute at the data source. + /// + /// The SQL statement or stored procedure to execute. The default is an empty string. + /// + /// You can read more about it here. + /// + [Category("Data")] + [Description("Command text to execute")] +#if NET452 + [Editor("MySql.Data.Common.Design.SqlCommandTextEditor,MySqlClient.Design", typeof(System.Drawing.Design.UITypeEditor))] +#endif + public override string CommandText + { + get { return cmdText; } + set + { + cmdText = value ?? string.Empty; + statement = null; + BatchableCommandText = null; + if (cmdText != null && cmdText.EndsWith("DEFAULT VALUES", StringComparison.OrdinalIgnoreCase)) + { + cmdText = cmdText.Substring(0, cmdText.Length - 14); + cmdText = cmdText + "() VALUES ()"; + } + } + } + + internal string OriginalCommandText + { + get { return originalcmdText; } + set + { + originalcmdText = value; + } + } + + /// + /// Gets or sets the wait time before terminating the attempt to execute a command + /// and generating an error. + /// + /// The time (in seconds) to wait for the command to execute. The default is 30 seconds. + /// + /// CommandTimeout is dependent on the ability of MySQL to cancel an executing query. + /// + [Category("Misc")] + [Description("Time to wait for command to execute")] + [DefaultValue(30)] + public override int CommandTimeout + { + get { return useDefaultTimeout ? 30 : commandTimeout; } + set + { + if (value < 0) + Throw(new ArgumentException("Command timeout must not be negative")); + + // Timeout in milliseconds should not exceed maximum for 32 bit + // signed integer (~24 days), because underlying driver (and streams) + // use milliseconds expressed ints for timeout values. + // Hence, truncate the value. + int timeout = Math.Min(value, Int32.MaxValue / 1000); + if (timeout != value) + { + MySqlTrace.LogWarning(connection.ServerThread, + "Command timeout value too large (" + + value + " seconds). Changed to max. possible value (" + + timeout + " seconds)"); + } + commandTimeout = timeout; + useDefaultTimeout = false; + } + } + + /// + /// Gets or sets a value indicating how the property is to be interpreted. + /// + /// + /// One of the values. + /// The default is . + /// + /// + /// You can read more about it here. + /// + [Category("Data")] + public override CommandType CommandType { get; set; } + + /// + /// Gets a boolean value that indicates whether the method has been called. + /// + /// True if it is Prepared; otherwise, false. + [Browsable(false)] + public bool IsPrepared => statement != null && statement.IsPrepared; + + /// + /// Gets or sets the object used by this instance of the . + /// + /// + /// The connection to a data source. The default value is a null reference. + /// + [Category("Behavior")] + [Description("Connection used by the command")] + public new MySqlConnection Connection + { + get { return connection; } + set + { + /* + * The connection is associated with the transaction + * so set the transaction object to return a null reference if the connection + * is reset. + */ + if (connection != value) + Transaction = null; + + connection = value; + + // if the user has not already set the command timeout, then + // take the default from the connection + if (connection == null) return; + + if (useDefaultTimeout) + { + commandTimeout = (int)connection.Settings.DefaultCommandTimeout; + useDefaultTimeout = false; + } + + EnableCaching = connection.Settings.TableCaching; + CacheAge = connection.Settings.DefaultTableCacheAge; + } + } + + /// + /// Gets the object. + /// + /// + /// The parameters of the SQL statement or stored procedure. The default is an empty collection. + /// + /// + /// Connector/NET does not support unnamed parameters. Every parameter added to the collection must + /// have an associated name. + /// You can read more about it here. + /// Parameters can be used along with . There are no restrictions in this regard. + /// + [Category("Data")] + [Description("The parameters collection")] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] + public new MySqlParameterCollection Parameters { get; } + + /// + /// Gets the object. + /// + /// + /// The query attributes defined for the statement. The default is an empty collection. + /// + /// + /// Connector/NET does not support unnamed query attributes. Every query attribute added to the collection must + /// have an associated name. + /// You can read more about it here. + /// Query Attributes can be used along with . There are no restrictions in this regard. + /// + [Category("Data")] + [Description("The attributes collection")] + [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] + public MySqlAttributeCollection Attributes { get; } + + /// + /// Gets or sets the instance of within which executes. + /// + /// + /// The . The default value is a null reference (Nothing in Visual Basic). + /// + /// + /// You cannot set the property if it is already set to a + /// specific value, and the command is in the process of executing. If you set the + /// transaction to use a object that is not connected + /// to the same as the object, + /// an exception will be thrown the next time you attempt to execute a statement. + /// + [Browsable(false)] + public new MySqlTransaction Transaction { get; set; } + + /// + /// Gets or sets a value that indicates whether caching is enabled. + /// + /// True if it is enabled; otherwise, false. + public bool EnableCaching { get; set; } + + /// + /// Gets or sets the seconds for how long a TableDirect result should be cached. + /// + /// Number of seconds. + public int CacheAge { get; set; } + + internal List Batch { get; private set; } + + internal bool Canceled { get; private set; } + + internal string BatchableCommandText { get; private set; } + + internal bool InternallyCreated { get; set; } + + /// + /// Gets or sets how command results are applied to the + /// when used by the method of the . + /// + /// + /// One of the values. + /// + /// + /// + /// The default value is + /// Both unless the command is automatically generated (as in the case of the + /// ), in which case the default is None. + /// + /// + public override UpdateRowSource UpdatedRowSource { get; set; } + + /// + /// Gets or sets a value indicating whether the command object should be visible in a Windows Form Designer control. + /// + /// True if it should be visible; otherwise, false. + [Browsable(false)] + public override bool DesignTimeVisible { get; set; } + + protected override DbParameter CreateDbParameter() + { + return new MySqlParameter(); + } + + /// + /// Gets or sets the used by this . + /// + /// The connection. + protected override DbConnection DbConnection + { + get { return Connection; } + set { Connection = (MySqlConnection)value; } + } + + /// + /// Gets the collection of objects. + /// + /// The collection. + protected override DbParameterCollection DbParameterCollection + { + get { return Parameters; } + } + + /// + /// Gets or sets the within which this object executes. + /// + /// The transaction. + protected override DbTransaction DbTransaction + { + get { return Transaction; } + set { Transaction = (MySqlTransaction)value; } + } + + internal string OutSql { get; set; } + + #endregion + + #region Methods + + /// + /// Attempts to cancel the execution of a currently active command + /// + public override void Cancel() + { + if ((connection?.State ?? ConnectionState.Closed) != ConnectionState.Closed) + { + connection.CancelQuery(connection.ConnectionTimeout); + Canceled = true; + } + } + + /// + /// Creates a new instance of a object. + /// + /// + /// This method is a strongly-typed version of . + /// + /// A object. + public new MySqlParameter CreateParameter() + { + return (MySqlParameter)CreateDbParameter(); + } + + /// + /// Check the connection to make sure + /// - it is open + /// - it is not currently being used by a reader + /// - and we have the right version of MySQL for the requested command type + /// + private void CheckState() + { + // There must be a valid and open connection. + if (connection == null) + Throw(new InvalidOperationException("Connection must be valid and open.")); + + if (connection.State != ConnectionState.Open && !connection.SoftClosed) + Throw(new InvalidOperationException("Connection must be valid and open.")); + + // Data readers have to be closed first + if (connection.IsInUse && !this.InternallyCreated) + Throw(new MySqlException("There is already an open DataReader associated with this Connection which must be closed first.")); + } + + internal void ProcessOutputParameters(MySqlDataReader reader) + { + AdjustOutputTypes(reader); + if ((reader.CommandBehavior & CommandBehavior.SchemaOnly) != 0) + return; + + reader.Read(); + string prefix = "@" + ParameterPrefix; + for (int i = 0; i < reader.FieldCount; i++) + { + string fieldName = reader.GetName(i); + if (fieldName.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) + fieldName = fieldName.Remove(0, prefix.Length); + MySqlParameter parameter = Parameters.GetParameterFlexible(fieldName, true); + parameter.Value = reader.GetValue(i); + } + } + + private void AdjustOutputTypes(MySqlDataReader reader) + { + for (int i = 0; i < reader.FieldCount; i++) + { + string fieldName = reader.GetName(i); + + if (fieldName.IndexOf(ParameterPrefix) != -1) + fieldName = fieldName.Remove(0, ParameterPrefix.Length + 1); + + MySqlParameter parameter = Parameters.GetParameterFlexible(fieldName, true); + IMySqlValue v = MySqlField.GetIMySqlValue(parameter.MySqlDbType); + + if (v is MySqlBit) + { + MySqlBit bit = (MySqlBit)v; + bit.ReadAsString = true; + reader.ResultSet.SetValueObject(i, bit); + } + else + reader.ResultSet.SetValueObject(i, v); + } + } + + /// + /// Executes a SQL statement against the connection and returns the number of rows affected. + /// + /// Number of rows affected + /// + /// You can use to perform any type of database operation, + /// however any resultsets returned will not be available. Any output parameters + /// used in calling a stored procedure will be populated with data and can be + /// retrieved after execution is complete. + /// For UPDATE, INSERT, and DELETE statements, the return value is the number + /// of rows affected by the command. For all other types of statements, the return + /// value is -1. + /// + public override int ExecuteNonQuery() => ExecuteNonQueryAsync(false, CancellationToken.None).GetAwaiter().GetResult(); + + /// + /// Asynchronous version of . + /// + /// The cancellation token. + /// A task representing the asynchronous operation. + public override Task ExecuteNonQueryAsync(CancellationToken cancellationToken) => ExecuteNonQueryAsync(true, cancellationToken); + + internal async Task ExecuteNonQueryAsync(bool execAsync, CancellationToken cancellationToken = default) + { + int records = -1; + + // give our interceptors a shot at it first + if (connection?.commandInterceptor != null && connection.commandInterceptor.ExecuteNonQuery(CommandText, ref records)) + return records; + + // ok, none of our interceptors handled this so we default + using (MySqlDataReader reader = await ExecuteReaderAsync(default, execAsync, cancellationToken).ConfigureAwait(false)) + { + reader.Close(); + if (!string.IsNullOrEmpty(OutSql) && ((reader.CommandBehavior & CommandBehavior.SchemaOnly) == 0)) + { + if (!IsPrepared) + { + MySqlCommand cmd = new MySqlCommand(OutSql, Connection); + + using (MySqlDataReader rdr = await cmd.ExecuteReaderAsync(reader.CommandBehavior, execAsync, cancellationToken).ConfigureAwait(false)) + ProcessOutputParameters(rdr); + } + else + { + CommandText = OutSql; + OutSql = null; + + using (MySqlDataReader readerPrepared = await ExecuteReaderAsync(default, execAsync, cancellationToken).ConfigureAwait(false)) + ProcessOutputParameters(readerPrepared); + } + } + return reader.RecordsAffected; + } + } + + internal void ClearCommandTimer() + { + if (commandTimer == null) return; + + commandTimer.Dispose(); + commandTimer = null; + } + + internal async Task CloseAsync(MySqlDataReader reader, bool execAsync) + { +#if NET5_0_OR_GREATER + MySQLActivitySource.CommandStop(CurrentActivity); + CurrentActivity = null; +#endif + statement?.Close(reader); + await ResetSqlSelectLimitAsync(execAsync).ConfigureAwait(false); + + if (statement != null && connection?.driver != null) + await connection.driver.CloseQueryAsync(connection, statement.StatementId, execAsync).ConfigureAwait(false); + + ClearCommandTimer(); + } + + /// + /// Reset reader to null, to avoid "There is already an open data reader" + /// on the next ExecuteReader(). Used in error handling scenarios. + /// + private async Task ResetReaderAsync(bool execAsync) + { + if (connection?.Reader == null) return; + + await connection.Reader.CloseAsync(execAsync).ConfigureAwait(false); + connection.Reader = null; + } + + /// + /// Reset SQL_SELECT_LIMIT that could have been modified by CommandBehavior. + /// + internal async Task ResetSqlSelectLimitAsync(bool execAsync) + { + // if we are supposed to reset the sql select limit, do that here + if (!resetSqlSelect) return; + + resetSqlSelect = false; + MySqlCommand command = new MySqlCommand("SET SQL_SELECT_LIMIT = DEFAULT", connection); + command.InternallyCreated = true; + await command.ExecuteNonQueryAsync(execAsync).ConfigureAwait(false); + } + + protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior) => ExecuteReader(behavior); + + /// + /// Sends the value to + /// and builds a object. + /// + /// A object. + /// + /// + /// When the property is set to StoredProcedure, + /// the property should be set to the name of the stored + /// procedure. The command executes this stored procedure when you call + /// ExecuteReader. + /// + /// + /// While is in use, the associated + /// instance of is busy serving it + /// and no other operations can be performed on , other than closing it. + /// This is the case until the method of is called. + /// + /// + public new MySqlDataReader ExecuteReader() => ExecuteReaderAsync(CommandBehavior.Default, false, CancellationToken.None).GetAwaiter().GetResult(); + + /// + /// Sends the to the Connection, + /// and builds a using one of the values. + /// + /// One of the values. + /// + /// + /// When the property is set to StoredProcedure, + /// the property should be set to the name of the stored + /// procedure. The command executes this stored procedure when you call + /// ExecuteReader. + /// + /// + /// If the object is created with CommandBehavior set to + /// CloseConnection, closing the instance closes the connection + /// automatically. + /// + /// + /// When calling ExecuteReader with the SingleRow behavior, you should be aware that using a limit + /// clause in your SQL will cause all rows (up to the limit given) to be retrieved by the client. The + /// method will still return false after the first row but pulling all rows of data + /// into the client will have a performance impact. If the limit clause is not necessary, it should + /// be avoided. + /// + /// + /// + /// A object. + /// + public new MySqlDataReader ExecuteReader(CommandBehavior behavior) => ExecuteReaderAsync(behavior, false, CancellationToken.None).GetAwaiter().GetResult(); + + /// + /// Asynchronous version of . + /// + /// One of the values. + /// A task representing the asynchronous operation. + public new Task ExecuteReaderAsync(CommandBehavior behavior) => ExecuteReaderAsync(behavior, true, CancellationToken.None); + + /// + /// Asynchronous version of with a cancellation token. + /// + /// One of the values. + /// The cancellation token. + /// A task representing the asynchronous operation. + public new Task ExecuteReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken) => ExecuteReaderAsync(behavior, true, cancellationToken); + + protected override async Task ExecuteDbDataReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken) => await ExecuteReaderAsync(behavior, true, cancellationToken).ConfigureAwait(false); + + internal async Task ExecuteReaderAsync(CommandBehavior behavior, bool execAsync, CancellationToken cancellationToken = default) + { + // give our interceptors a shot at it first + MySqlDataReader interceptedReader = null; + + if (connection?.commandInterceptor != null && connection.commandInterceptor.ExecuteReader(CommandText, behavior, ref interceptedReader)) + return interceptedReader; + + // interceptors didn't handle this so we fall through + bool success = false; + CheckState(); + Driver driver = connection.driver; + + cmdText = cmdText.Trim(); + if (String.IsNullOrEmpty(cmdText)) + Throw(new InvalidOperationException(Resources.CommandTextNotInitialized)); + + string sql = cmdText.Trim(';'); + + // Load balancing getting a new connection + if (connection.hasBeenOpen && !driver.HasStatus(ServerStatusFlags.InTransaction)) + await ReplicationManager.GetNewConnectionAsync(connection.Settings.Server, !IsReadOnlyCommand(sql), connection, execAsync, cancellationToken).ConfigureAwait(false); + + SemaphoreSlim semaphoreSlim = new(1); + semaphoreSlim.Wait(); + + // We have to recheck that there is no reader, after we got the lock + if (connection.Reader != null) + Throw(new MySqlException(Resources.DataReaderOpen)); + + System.Transactions.Transaction curTrans = System.Transactions.Transaction.Current; + + if (curTrans != null) + { + bool inRollback = false; + //TODO: ADD support for 452 and 46X + if (driver.currentTransaction != null) + inRollback = driver.currentTransaction.InRollback; + + if (!inRollback) + { + System.Transactions.TransactionStatus status = System.Transactions.TransactionStatus.InDoubt; + try + { + // in some cases (during state transitions) this throws + // an exception. Ignore exceptions, we're only interested + // whether transaction was aborted or not. + status = curTrans.TransactionInformation.Status; + } + catch (System.Transactions.TransactionException) { } + + if (status == System.Transactions.TransactionStatus.Aborted) + Throw(new System.Transactions.TransactionAbortedException()); + } + } + + commandTimer = new CommandTimer(connection, CommandTimeout); + LastInsertedId = -1; + + if (CommandType == CommandType.TableDirect) + sql = "SELECT * FROM " + sql; + + // if we are on a replicated connection, we are only allow readonly statements + if (connection.Settings.Replication && !InternallyCreated) + EnsureCommandIsReadOnly(sql); + + if (statement == null || !statement.IsPrepared) + { + if (CommandType == CommandType.StoredProcedure) + statement = new StoredProcedure(this, sql); + else + statement = new PreparableStatement(this, sql); + } + + // stored procs are the only statement type that need do anything during resolve + statement.Resolve(false); + + // Now that we have completed our resolve step, we can handle our + // command behaviors + await HandleCommandBehaviorsAsync(execAsync, behavior).ConfigureAwait(false); + + + // Tell whoever is listening that we have started out command +#if NET5_0_OR_GREATER + CurrentActivity = MySQLActivitySource.CommandStart(this); +#endif + try + { + MySqlDataReader reader = new MySqlDataReader(this, statement, behavior); + connection.Reader = reader; + Canceled = false; + // execute the statement + await statement.ExecuteAsync(execAsync).ConfigureAwait(false); + // wait for data to return + await reader.NextResultAsync(execAsync, cancellationToken).ConfigureAwait(false); + success = true; + return reader; + } + catch (Exception ex) + { +#if NET5_0_OR_GREATER + MySQLActivitySource.SetException(CurrentActivity, ex); +#endif + if (ex is TimeoutException) + { + await connection.HandleTimeoutOrThreadAbortAsync(ex, execAsync).ConfigureAwait(false); + throw; //unreached + } + else if (ex is ThreadAbortException) + { + await connection.HandleTimeoutOrThreadAbortAsync(ex, execAsync).ConfigureAwait(false); + throw; + } + else if (ex is IOException) + { + await connection.AbortAsync(execAsync).ConfigureAwait(false); // Closes connection without returning it to the pool + throw new MySqlException(Resources.FatalErrorDuringExecute, ex); + } + else if (ex is MySqlException) + { + MySqlException mySqlException = ex as MySqlException; + if (mySqlException.InnerException is TimeoutException) + throw; // already handled + + try + { + await ResetReaderAsync(execAsync).ConfigureAwait(false); + await ResetSqlSelectLimitAsync(execAsync).ConfigureAwait(false); + } + catch (Exception) + { + // Reset SqlLimit did not work, connection is hosed. + await Connection.AbortAsync(execAsync).ConfigureAwait(false); + throw new MySqlException(ex.Message, true, ex); + } + + // if we caught an exception because of a cancel, then just return null + if (mySqlException.IsQueryAborted) + return null; + if (mySqlException.IsFatal) + await Connection.CloseAsync(execAsync).ConfigureAwait(false); + if (mySqlException.Number == 0) + throw new MySqlException(Resources.FatalErrorDuringExecute, mySqlException); + throw; + } + else + { + throw; + } + } + finally + { + if (connection != null) + { + if (connection.Reader == null) + { + // Something went seriously wrong, and reader would not + // be able to clear timeout on closing. + // So we clear timeout here. + ClearCommandTimer(); + } + if (!success) + { + // ExecuteReader failed.Close Reader and set to null to + // prevent subsequent errors with DataReaderOpen + await ResetReaderAsync(execAsync).ConfigureAwait(false); + } + } + + semaphoreSlim.Release(); + } + } + + private void EnsureCommandIsReadOnly(string sql) + { + sql = StringUtility.ToLowerInvariant(sql); + if (!sql.StartsWith("select") && !sql.StartsWith("show")) + Throw(new MySqlException(Resources.ReplicatedConnectionsAllowOnlyReadonlyStatements)); + if (sql.EndsWith("for update") || sql.EndsWith("lock in share mode")) + Throw(new MySqlException(Resources.ReplicatedConnectionsAllowOnlyReadonlyStatements)); + } + + private bool IsReadOnlyCommand(string sql) + { + sql = sql.ToLower(); + return (sql.StartsWith("select") || sql.StartsWith("show")) + && !(sql.EndsWith("for update") || sql.EndsWith("lock in share mode")); + } + + /// + /// Executes the query, and returns the first column of the first row in the + /// result set returned by the query. Extra columns or rows are ignored. + /// + /// + /// The first column of the first row in the result set, or a null reference if the + /// result set is empty + /// + /// + /// + /// Use the ExecuteScalar method to retrieve a single value (for example, + /// an aggregate value) from a database. This requires less code than using the + /// method, and then performing the operations necessary + /// to generate the single value using the data returned by a + /// + /// + public override object ExecuteScalar() => ExecuteScalarAsync(false, CancellationToken.None).GetAwaiter().GetResult(); + + /// + /// Asynchronous version of . + /// + /// The cancellation token. + /// A task representing the asynchronous operation. + public override Task ExecuteScalarAsync(CancellationToken cancellationToken) => ExecuteScalarAsync(true, cancellationToken); + + internal async Task ExecuteScalarAsync(bool execAsync, CancellationToken cancellationToken) + { + LastInsertedId = -1; + object val = null; + + // give our interceptors a shot at it first + if (connection != null && connection.commandInterceptor.ExecuteScalar(CommandText, ref val)) + return val; + + using (MySqlDataReader reader = await ExecuteReaderAsync(default, execAsync, cancellationToken).ConfigureAwait(false)) + { + if (await reader.ReadAsync(execAsync, cancellationToken).ConfigureAwait(false)) + val = reader.GetValue(0); + } + + return val; + } + + private async Task HandleCommandBehaviorsAsync(bool execAsync, CommandBehavior behavior) + { + if ((behavior & CommandBehavior.SchemaOnly) != 0) + { + var cmd = new MySqlCommand("SET SQL_SELECT_LIMIT = 0", connection); + await cmd.ExecuteNonQueryAsync(execAsync, CancellationToken.None).ConfigureAwait(false); + resetSqlSelect = true; + } + else if ((behavior & CommandBehavior.SingleRow) != 0) + { + var cmd = new MySqlCommand("SET SQL_SELECT_LIMIT = 1", connection); + await cmd.ExecuteNonQueryAsync(execAsync, CancellationToken.None).ConfigureAwait(false); + resetSqlSelect = true; + } + } + + /// + /// Creates a prepared version of the command on an instance of MySQL Server. + /// + public override void Prepare() => PrepareAsync(false, CancellationToken.None).GetAwaiter().GetResult(); + +#if NETFRAMEWORK || NETSTANDARD2_0 + /// + /// Asynchronously creates a prepared version of the command on an instance of MySQL Server. + /// + public Task PrepareAsync(CancellationToken cancellationToken = default) => PrepareAsync(true, cancellationToken); +#else + /// + /// Asynchronously creates a prepared version of the command on an instance of MySQL Server. + /// + public override Task PrepareAsync(CancellationToken cancellationToken = default) => PrepareAsync(true, cancellationToken); +#endif + + private async Task PrepareAsync(bool execAsync, CancellationToken cancellationToken) + { + if (connection == null) + Throw(new InvalidOperationException("The connection property has not been set.")); + if (connection.State != ConnectionState.Open) + Throw(new InvalidOperationException("The connection is not open.")); + + using (new CommandTimer(Connection, CommandTimeout)) + { + // if the length of the command text is zero, then just return + string psSQL = CommandText; + if (psSQL == null || + psSQL.Trim().Length == 0) + return; + + statement = CommandType == CommandType.StoredProcedure ? new StoredProcedure(this, CommandText) : new PreparableStatement(this, CommandText); + + statement.Resolve(true); + await statement.PrepareAsync(execAsync).ConfigureAwait(false); + } + } + + /// + /// Creates a clone of this object. CommandText, Connection, and Transaction properties + /// are included as well as the entire parameter and the arribute list. + /// + /// The cloned object. + public object Clone() + { + MySqlCommand clone = new MySqlCommand(cmdText, connection, Transaction) + { + CommandType = CommandType, + commandTimeout = commandTimeout, + useDefaultTimeout = useDefaultTimeout, + BatchableCommandText = BatchableCommandText, + EnableCaching = EnableCaching, + CacheAge = CacheAge + }; + + foreach (MySqlParameter p in Parameters) + clone.Parameters.Add(p.Clone()); + + foreach (MySqlAttribute a in Attributes) + clone.Attributes.SetAttribute(a.Clone()); + + return clone; + } + +#endregion + +#region Async Methods + private IAsyncResult asyncResult; + + internal delegate object AsyncDelegate(int type, CommandBehavior behavior); + internal AsyncDelegate Caller; + internal Exception thrownException; + + [Obsolete] + internal object AsyncExecuteWrapper(int type, CommandBehavior behavior) + { + thrownException = null; + try + { + if (type == 1) + return ExecuteReader(behavior); + return ExecuteNonQuery(); + } + catch (Exception ex) + { + thrownException = ex; + } + return null; + } + + /// + /// Initiates the asynchronous execution of the SQL statement or stored procedure + /// that is described by this , and retrieves one or more + /// result sets from the server. + /// + /// An that can be used to poll, wait for results, + /// or both; this value is also needed when invoking EndExecuteReader, + /// which returns a instance that can be used to retrieve + /// the returned rows. + [Obsolete] + public IAsyncResult BeginExecuteReader() + { + return BeginExecuteReader(CommandBehavior.Default); + } + + /// + /// Initiates the asynchronous execution of the SQL statement or stored procedure + /// that is described by this using one of the + /// CommandBehavior values. + /// + /// One of the values, indicating + /// options for statement execution and data retrieval. + /// An that can be used to poll, wait for results, + /// or both; this value is also needed when invoking EndExecuteReader, + /// which returns a instance that can be used to retrieve + /// the returned rows. + [Obsolete] + public IAsyncResult BeginExecuteReader(CommandBehavior behavior) + { + if (Caller != null) + Throw(new MySqlException(Resources.UnableToStartSecondAsyncOp)); + + Caller = AsyncExecuteWrapper; + asyncResult = Caller.BeginInvoke(1, behavior, null, null); + return asyncResult; + } + + /// + /// Finishes asynchronous execution of a SQL statement, returning the requested + /// . + /// + /// The returned by the call to + /// . + /// A MySqlDataReader object that can be used to retrieve the requested rows. + [Obsolete] + public MySqlDataReader EndExecuteReader(IAsyncResult result) + { + result.AsyncWaitHandle.WaitOne(); + AsyncDelegate c = Caller; + Caller = null; + if (thrownException != null) + throw thrownException; + return (MySqlDataReader)c.EndInvoke(result); + } + + /// + /// Initiates the asynchronous execution of the SQL statement or stored procedure + /// that is described by this . + /// + /// + /// An delegate that is invoked when the command's + /// execution has completed. Pass a null reference to indicate that no callback is required. + /// A user-defined state object that is passed to the + /// callback procedure. Retrieve this object from within the callback procedure + /// using the property. + /// An that can be used to poll or wait for results, + /// or both; this value is also needed when invoking , + /// which returns the number of affected rows. + [Obsolete] + public IAsyncResult BeginExecuteNonQuery(AsyncCallback callback, object stateObject) + { + if (Caller != null) + Throw(new MySqlException(Resources.UnableToStartSecondAsyncOp)); + + Caller = AsyncExecuteWrapper; + asyncResult = Caller.BeginInvoke(2, CommandBehavior.Default, + callback, stateObject); + return asyncResult; + } + + /// + /// Initiates the asynchronous execution of the SQL statement or stored procedure + /// that is described by this . + /// + /// An that can be used to poll or wait for results, + /// or both; this value is also needed when invoking , + /// which returns the number of affected rows. + [Obsolete] + public IAsyncResult BeginExecuteNonQuery() + { + if (Caller != null) + Throw(new MySqlException(Resources.UnableToStartSecondAsyncOp)); + + Caller = AsyncExecuteWrapper; + asyncResult = Caller.BeginInvoke(2, CommandBehavior.Default, null, null); + return asyncResult; + } + + /// + /// Finishes asynchronous execution of a SQL statement. + /// + /// The returned by the call + /// to . + /// + [Obsolete] + public int EndExecuteNonQuery(IAsyncResult asyncResult) + { + asyncResult.AsyncWaitHandle.WaitOne(); + AsyncDelegate c = Caller; + Caller = null; + if (thrownException != null) + throw thrownException; + return (int)c.EndInvoke(asyncResult); + } +#endregion + +#region Private Methods + + internal long EstimatedSize() => CommandText.Length + Parameters.Cast().Sum(parameter => parameter.EstimatedSize()); + +#endregion + +#region Batching support + + internal void AddToBatch(MySqlCommand command) + { + if (Batch == null) + Batch = new List(); + Batch.Add(command); + } + + internal string GetCommandTextForBatching() + { + if (BatchableCommandText == null) + { + // if the command starts with insert and is "simple" enough, then + // we can use the multi-value form of insert + if (String.Compare(CommandText.Substring(0, 6), "INSERT", StringComparison.OrdinalIgnoreCase) == 0) + { + string sql_mode = Connection.driver.Property("sql_mode").ToUpperInvariant(); + MySqlTokenizer tokenizer = new MySqlTokenizer(CommandText); + tokenizer.AnsiQuotes = sql_mode.IndexOf("ANSI_QUOTES") != -1; + tokenizer.BackslashEscapes = sql_mode.IndexOf("NO_BACKSLASH_ESCAPES") == -1; + string token = StringUtility.ToLowerInvariant(tokenizer.NextToken()); + while (token != null) + { + if (StringUtility.ToUpperInvariant(token) == "VALUES" && + !tokenizer.Quoted) + { + token = tokenizer.NextToken(); + Debug.Assert(token == "("); + + // find matching right paren, and ensure that parens + // are balanced. + int openParenCount = 1; + while (token != null) + { + BatchableCommandText += token; + token = tokenizer.NextToken(); + + if (token == "(") + openParenCount++; + else if (token == ")") + openParenCount--; + + if (openParenCount == 0) + break; + } + + if (token != null) + BatchableCommandText += token; + token = tokenizer.NextToken(); + if (token != null && (token == "," || + StringUtility.ToUpperInvariant(token) == "ON")) + { + BatchableCommandText = null; + break; + } + } + token = tokenizer.NextToken(); + } + } + // Otherwise use the command verbatim + else BatchableCommandText = CommandText; + } + + return BatchableCommandText; + } + +#endregion + + // This method is used to throw all exceptions from this class. + private void Throw(Exception ex) + { + connection?.Throw(ex); + throw ex; + } + + /// + /// Releases the resources used by the + /// + public new void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// Releases the resources used by the + /// + protected override void Dispose(bool disposing) + { + if (disposed || !disposing) + return; + + if (statement != null && statement.IsPrepared) + statement.CloseStatementAsync(false).GetAwaiter().GetResult(); + + base.Dispose(disposing); + + disposed = true; + } + +#if NETFRAMEWORK || NETSTANDARD2_0 + public Task DisposeAsync() +#else + public override ValueTask DisposeAsync() +#endif + { + Dispose(true); + return default; + } + } +} diff --git a/MySQL.Data/src/MySqlConnection.cs b/MySQL.Data/src/MySqlConnection.cs new file mode 100644 index 000000000..e68debbf1 --- /dev/null +++ b/MySQL.Data/src/MySqlConnection.cs @@ -0,0 +1,1318 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using MySql.Data.Failover; +using MySql.Data.MySqlClient.Interceptors; +using MySql.Data.MySqlClient.Replication; +using System; +using System.ComponentModel; +using System.Data; +using System.Data.Common; +using System.Diagnostics; +using System.Security; +using System.Security.Permissions; +using System.Threading; +using System.Threading.Tasks; +using System.Transactions; +using IsolationLevel = System.Data.IsolationLevel; +#if NET452 +using System.Drawing; +using System.Drawing.Design; +#endif + +namespace MySql.Data.MySqlClient +{ + /// + /// Represents a connection to a MySQL database. This class cannot be inherited. + /// + /// + /// + /// A object represents a session to a MySQL + /// data source. When you create an instance of , all + /// properties are set to their initial values. + /// + /// + /// If the goes out of scope, it is not closed. Therefore, + /// you must explicitly close the connection by calling + /// or . + /// + /// +#if NET452 + [ToolboxBitmap(typeof(MySqlConnection), "MySqlClient.resources.connection.bmp")] +#endif + [DesignerCategory("Code")] + [ToolboxItem(true)] + public sealed class MySqlConnection : DbConnection, ICloneable + { + internal ConnectionState connectionState; + internal Driver driver; + internal bool hasBeenOpen; + internal bool hasBeenDisposed; + private SchemaProvider _schemaProvider; + private ExceptionInterceptor _exceptionInterceptor; + internal CommandInterceptor commandInterceptor; + private bool _isKillQueryConnection; + private string _database; + private int _commandTimeout; +#if NET5_0_OR_GREATER +#nullable enable + Activity? currentActivity; +#nullable disable +#endif + + /// + /// Occurs when WebAuthn authentication makes a request to perform the gesture action on a device. + /// + public event WebAuthnActionCallback WebAuthnActionRequested; + + /// + /// Occurs when MySQL returns warnings as a result of executing a command or query. + /// + public event MySqlInfoMessageEventHandler InfoMessage; + + private static readonly Cache ConnectionStringCache = + new Cache(0, 25); + + /// + /// Initializes a new instance of the class. + /// + /// + /// You can read more about it here. + /// + public MySqlConnection() + { + //TODO: add event data to StateChange docs + Settings = new MySqlConnectionStringBuilder(); + _database = String.Empty; + hasBeenDisposed = false; + } + + /// + /// Initializes a new instance of the class when given a string containing the connection string. + /// + /// + /// You can read more about it here. + /// + ///The connection properties used to open the MySQL database. + /// + public MySqlConnection(string connectionString) + : this() + { + Settings.AnalyzeConnectionString(connectionString ?? string.Empty, false, false, false); + IsConnectionStringAnalyzed = true; + ConnectionString = connectionString; + } + + #region Destructor + ~MySqlConnection() + { + Dispose(false); + } + #endregion + + #region Interal Methods & Properties + + internal PerformanceMonitor PerfMonitor { get; private set; } + + internal ProcedureCache ProcedureCache { get; private set; } + + internal MySqlConnectionStringBuilder Settings { get; private set; } + + internal MySqlDataReader Reader + { + get + { + return driver?.reader; + } + set + { + driver.reader = value; + IsInUse = driver.reader != null; + } + } + + internal void OnInfoMessage(MySqlInfoMessageEventArgs args) + { + InfoMessage?.Invoke(this, args); + } + + internal bool SoftClosed + { + get + { + return (State == ConnectionState.Closed) && + driver != null && driver.currentTransaction != null; + } + } + + internal bool IsInUse { get; set; } + + /// + /// Determines whether the connection is a clone of other connection. + /// + internal bool IsClone { get; set; } + internal bool ParentHasbeenOpen { get; set; } + #endregion + + #region Properties + + /// + /// Returns the ID of the server thread this connection is executing on. + /// + [Browsable(false)] + public int ServerThread => driver.ThreadID; + + /// + /// Gets the name of the MySQL server to which to connect. + /// + [Browsable(true)] + public override string DataSource => Settings.Server; + + /// + /// Gets the time to wait while trying to establish a connection before terminating the attempt and generating an error. + /// + /// + /// A value of 0 indicates no limit, and should be avoided in a call to + /// because an attempt to connect + /// will wait indefinitely. + /// + /// The value set is less than 0. + [Browsable(true)] + public override int ConnectionTimeout => (int)Settings.ConnectionTimeout; + + /// Gets the name of the current database or the database to be used after a connection is opened. + /// The name of the current database or the name of the database to be used after a connection is opened. + /// The default value is an empty string. + /// + /// + /// The property does not update dynamically. + /// If you change the current database using a SQL statement, then this property + /// may reflect the wrong value. If you change the current database using the + /// method, this property is updated to reflect the new database. + /// + /// + [Browsable(true)] + public override string Database => _database; + + /// + /// Indicates if this connection should use compression when communicating with the server. + /// + [Browsable(false)] + public bool UseCompression => Settings.UseCompression; + + /// Gets the current state of the connection. + /// + /// A bitwise combination of the values. The default is . + /// + /// + /// The allowed state changes are: + /// + /// + /// From to , + /// using the method of the connection object. + /// + /// + /// From Open to Closed, using either the Close method or the Dispose method of the connection object. + /// + /// + /// + [Browsable(false)] + public override ConnectionState State => connectionState; + + [Browsable(true)] + /// + /// Gets a boolean indicating if the current connection had been disposed. + /// + public bool IsDisposed { get { return hasBeenDisposed; } } + + /// Gets a string containing the version of the MySQL server to which the client is connected. + /// The version of the instance of MySQL. + /// The connection is closed. + [Browsable(false)] + public override string ServerVersion => driver.Version.ToString(); + + /// + /// Gets or sets the string used to connect to a MySQL database. + /// + /// + /// You can read more about it here. + /// +#if NET452 + [Editor("MySql.Data.MySqlClient.Design.ConnectionStringTypeEditor,MySqlClient.Design", typeof(UITypeEditor))] +#endif + [Browsable(true)] + [Category("Data")] + [Description("Information used to connect to a DataSource, such as 'Server=xxx;UserId=yyy;Password=zzz;Database=dbdb'.")] + public override string ConnectionString + { + get + { + // Always return exactly what the user set. + // Security-sensitive information may be removed. + return Settings.GetConnectionString(!IsClone ? (!hasBeenOpen || Settings.PersistSecurityInfo) : + !Settings.PersistSecurityInfo ? (ParentHasbeenOpen ? false : !hasBeenOpen) : (Settings.PersistSecurityInfo)); + } + set + { + if (State != ConnectionState.Closed) + Throw(new MySqlException( + "Not allowed to change the 'ConnectionString' property while the connection (state=" + State + ").")); + + MySqlConnectionStringBuilder newSettings; + lock (ConnectionStringCache) + { + if (value == null) + newSettings = new MySqlConnectionStringBuilder(); + else + { + newSettings = ConnectionStringCache[value]; + if (null == newSettings || FailoverManager.FailoverGroup == null) + { + newSettings = new MySqlConnectionStringBuilder(value, IsConnectionStringAnalyzed); + ConnectionStringCache.Add(value, newSettings); + } + } + } + + Settings = newSettings; + + if (!string.IsNullOrEmpty(Settings.Database)) + _database = Settings.Database; + + if (driver != null) + driver.Settings = newSettings; + } + } + + /// + /// Gets the instance of the + /// + protected override DbProviderFactory DbProviderFactory => MySqlClientFactory.Instance; + + /// + /// Gets a boolean value that indicates whether the password associated to the connection is expired. + /// + public bool IsPasswordExpired => driver.IsPasswordExpired; + + /// + /// Gets a boolean value that indicates whether the connection string has been analyzed or not. + /// + internal bool IsConnectionStringAnalyzed = false; + + #endregion + + /// + /// Creates and returns a System.Data.Common.DbCommand object associated with the current connection. + /// + /// A object. + protected override DbCommand CreateDbCommand() + { + return CreateCommand(); + } + + internal void SetState(ConnectionState newConnectionState, bool broadcast) + { + if (newConnectionState == connectionState && !broadcast) + return; + ConnectionState oldConnectionState = connectionState; + connectionState = newConnectionState; + if (broadcast) + OnStateChange(new StateChangeEventArgs(oldConnectionState, connectionState)); + } + + #region IDisposeable + + /// + /// Releases the resources used by the + /// + public new void Dispose() => Dispose(true); + + protected override void Dispose(bool disposing) + { + if (State == ConnectionState.Open) + Close(); + hasBeenDisposed = true; + base.Dispose(disposing); + } + +#if NETFRAMEWORK || NETSTANDARD2_0 + public async Task DisposeAsync() +#else + public override async ValueTask DisposeAsync() +#endif + { + if (State != ConnectionState.Closed) + await CloseAsync().ConfigureAwait(false); + + GC.SuppressFinalize(this); + } + + #endregion + + #region Transactions + + /// + /// Starts a database transaction. + /// + /// Specifies the for the transaction. + /// A representing the new transaction. + /// Parallel transactions are not supported. + protected override DbTransaction BeginDbTransaction(IsolationLevel isolationLevel) => BeginTransactionAsync(false, isolationLevel, CancellationToken.None).GetAwaiter().GetResult(); + + /// + /// Begins a database transaction. + /// + /// A representing the new transaction. + /// Parallel transactions are not supported. + public new MySqlTransaction BeginTransaction() => BeginTransactionAsync(false, IsolationLevel.RepeatableRead, CancellationToken.None).GetAwaiter().GetResult(); + + /// + /// Starts a database transaction. + /// + /// Specifies the for the transaction. + /// The scope of the transaction. + /// A representing the new transaction. + /// Parallel transactions are not supported. + public MySqlTransaction BeginTransaction(IsolationLevel isolationLevel, string scope = "") => BeginTransactionAsync(false, isolationLevel, CancellationToken.None, scope).GetAwaiter().GetResult(); + + /// + /// Asynchronous version of . + /// + /// A representing the new transaction. + /// Parallel transactions are not supported. + public ValueTask BeginTransactionAsync() => BeginTransactionAsync(true, IsolationLevel.RepeatableRead, CancellationToken.None); + +#if NETSTANDARD2_0 || NETFRAMEWORK + /// + /// Asynchronous version of . + /// + /// A token to cancel the asynchronous operation. + /// A representing the new transaction. + /// Parallel transactions are not supported. + public ValueTask BeginTransactionAsync(CancellationToken cancellationToken = default) => BeginTransactionAsync(true, IsolationLevel.RepeatableRead, cancellationToken); + + /// + /// Asynchronous version of . + /// + /// Specifies the for the transaction. + /// The cancellation token. + /// A representing the new transaction. + /// Parallel transactions are not supported. + public ValueTask BeginTransactionAsync(IsolationLevel isolationLevel, CancellationToken cancellationToken = default) => BeginTransactionAsync(true, isolationLevel, cancellationToken); +#else + /// + /// Asynchronous version of . + /// + /// A token to cancel the asynchronous operation. + /// A representing the new transaction. + /// Parallel transactions are not supported. + public new ValueTask BeginTransactionAsync(CancellationToken cancellationToken = default) => BeginTransactionAsync(true, IsolationLevel.RepeatableRead, cancellationToken); + + /// + /// Asynchronous version of . + /// + /// Specifies the for the transaction. + /// A representing the new transaction. + /// Parallel transactions are not supported. + public ValueTask BeginTransactionAsync(IsolationLevel isolationLevel) => BeginTransactionAsync(true, isolationLevel, CancellationToken.None); + + /// + /// Asynchronous version of . + /// + /// Specifies the for the transaction. + /// The cancellation token. + /// A representing the new transaction. + /// Parallel transactions are not supported. + public new ValueTask BeginTransactionAsync(IsolationLevel isolationLevel, CancellationToken cancellationToken = default) => BeginTransactionAsync(true, isolationLevel, cancellationToken); + + /// + /// Asynchronous version of . + /// + /// Specifies the for the transaction. + /// A token to cancel the asynchronous operation. + /// A representing the new transaction. + /// Parallel transactions are not supported. + protected override async ValueTask BeginDbTransactionAsync(IsolationLevel isolationLevel, CancellationToken cancellationToken = default) => await BeginTransactionAsync(true, isolationLevel, cancellationToken).ConfigureAwait(false); +#endif + + private async ValueTask BeginTransactionAsync(bool execAsync, IsolationLevel isolationLevel, CancellationToken cancellationToken, string scope = "") + { + if (State != ConnectionState.Open) + Throw(new InvalidOperationException(Resources.ConnectionNotOpen)); + // First check to see if we are in a current transaction + if (driver.HasStatus(ServerStatusFlags.InTransaction)) + Throw(new InvalidOperationException(Resources.NoNestedTransactions)); + + MySqlCommand cmd = new MySqlCommand("", this); + + cmd.CommandText = $"SET {scope} TRANSACTION ISOLATION LEVEL "; + + switch (isolationLevel) + { + case IsolationLevel.ReadCommitted: + cmd.CommandText += "READ COMMITTED"; + break; + case IsolationLevel.ReadUncommitted: + cmd.CommandText += "READ UNCOMMITTED"; + break; + case IsolationLevel.Unspecified: + case IsolationLevel.RepeatableRead: + cmd.CommandText += "REPEATABLE READ"; + break; + case IsolationLevel.Serializable: + cmd.CommandText += "SERIALIZABLE"; + break; + case IsolationLevel.Chaos: + Throw(new NotSupportedException(Resources.ChaosNotSupported)); + break; + case IsolationLevel.Snapshot: + Throw(new NotSupportedException(Resources.SnapshotNotSupported)); + break; + } + + await cmd.ExecuteNonQueryAsync(execAsync, cancellationToken).ConfigureAwait(false); + cmd.CommandText = "BEGIN"; + cmd.CommandType = CommandType.Text; + await cmd.ExecuteNonQueryAsync(execAsync, cancellationToken).ConfigureAwait(false); + + MySqlTransaction t = new MySqlTransaction(this, isolationLevel); + return t; + } + + #endregion + + /// Changes the current database for an open . + /// The name of the database to use. + /// + /// + /// The value supplied in the databaseName parameter must be a valid database + /// name. The databaseName parameter cannot contain a null value, an empty + /// string, or a string with only blank characters. + /// + /// + /// When you are using connection pooling against MySQL, and you close + /// the connection, it is returned to the connection pool. The next time the + /// connection is retrieved from the pool, the reset connection request + /// executes before the user performs any operations. + /// + /// + /// The database name is not valid. + /// The connection is not open. + /// Cannot change the database. + public override void ChangeDatabase(string databaseName) => ChangeDatabaseAsync(databaseName, false, CancellationToken.None).GetAwaiter().GetResult(); + + /// + /// Asynchronous version of the method. + /// + /// The name of the database to use. + /// The cancellation token. + /// A task representing the asynchronous operation. +#if NETFRAMEWORK || NETSTANDARD2_0 + public Task ChangeDatabaseAsync(string databaseName, CancellationToken cancellationToken = default) => ChangeDatabaseAsync(databaseName, true, cancellationToken); +#else + public override Task ChangeDatabaseAsync(string databaseName, CancellationToken cancellationToken = default) => ChangeDatabaseAsync(databaseName, true, cancellationToken); +#endif + + internal async Task ChangeDatabaseAsync(string databaseName, bool execAsync, CancellationToken cancellationToken) + { + if (databaseName == null || databaseName.Trim().Length == 0) + Throw(new ArgumentException(Resources.ParameterIsInvalid, "databaseName")); + + if (State != ConnectionState.Open) + Throw(new InvalidOperationException(Resources.ConnectionNotOpen)); + + // This semaphore prevents promotable transaction rollback to run + // in parallel + SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1); + + semaphoreSlim.Wait(); + // We use default command timeout for SetDatabase + using (new CommandTimer(this, (int)Settings.DefaultCommandTimeout)) + await driver.SetDatabaseAsync(databaseName, execAsync).ConfigureAwait(false); + + semaphoreSlim.Release(); + + _database = databaseName; + } + + /// + /// Pings the server. + /// + /// true if the ping was successful; otherwise, false. + public bool Ping() => PingAsync(false).GetAwaiter().GetResult(); + + /// + /// Pings the server. + /// + /// true if the ping was successful; otherwise, false. + public Task PingAsync() => PingAsync(true); + + private async Task PingAsync(bool execAsync) + { + if (Reader != null) + Throw(new MySqlException(Resources.DataReaderOpen)); + if (driver != null && await driver.PingAsync(execAsync).ConfigureAwait(false)) + return true; + driver = null; + SetState(ConnectionState.Closed, true); + return false; + } + + /// Opens a database connection with the property settings specified by the . + /// Cannot open a connection without specifying a data source or server. + /// A connection-level error occurred while opening the connection. + /// + /// + /// The draws an open connection from the connection pool if one is available. + /// Otherwise, it establishes a new connection to an instance of MySQL. + /// + /// + public override void Open() => OpenAsync(false, CancellationToken.None).GetAwaiter().GetResult(); + + public override Task OpenAsync(CancellationToken cancellationToken) => OpenAsync(true, cancellationToken); + + internal async Task OpenAsync(bool execAsync, CancellationToken cancellationToken) + { + if (State != ConnectionState.Closed) + Throw(new InvalidOperationException(Resources.ConnectionAlreadyOpen)); + + if (hasBeenDisposed) + Throw(new InvalidOperationException("The connection had been disposed.")); + + // start up our interceptors + _exceptionInterceptor = new ExceptionInterceptor(this); + commandInterceptor = new CommandInterceptor(this); + + SetState(ConnectionState.Connecting, true); + AssertPermissions(); + + Settings.WebAuthnActionRequested = WebAuthnActionRequested; + + //TODO: SUPPORT FOR 452 AND 46X + // if we are auto enlisting in a current transaction, then we will be + // treating the connection as pooled + if (Settings.AutoEnlist && Transaction.Current != null) + { + driver = DriverTransactionManager.GetDriverInTransaction(Transaction.Current); + if (driver != null && (driver.IsInActiveUse || !driver.Settings.EquivalentTo(this.Settings))) + Throw(new NotSupportedException(Resources.MultipleConnectionsInTransactionNotSupported)); + } + + MySqlConnectionStringBuilder currentSettings = Settings; + try + { + if (!Settings.Pooling || MySqlPoolManager.Hosts == null) + { + FailoverManager.Reset(); + + if (Settings.DnsSrv) + { + var dnsSrvRecords = DnsSrv.GetDnsSrvRecords(Settings.Server); + FailoverManager.SetHostList(dnsSrvRecords.ConvertAll(r => new FailoverServer(r.Target, r.Port, null)), + FailoverMethod.Sequential); + } + else + FailoverManager.ParseHostList(Settings.Server, false); + } + + // Load balancing && Failover + if (ReplicationManager.IsReplicationGroup(Settings.Server)) + { + if (driver == null) + { + await ReplicationManager.GetNewConnectionAsync(Settings.Server, false, this, execAsync, cancellationToken).ConfigureAwait(false); + } + else + currentSettings = driver.Settings; + } + else if (FailoverManager.FailoverGroup != null && !Settings.Pooling) + { + string connectionString = await FailoverManager.AttemptConnectionAsync(this, Settings.ConnectionString, execAsync, cancellationToken); + currentSettings.ConnectionString = connectionString; + } + + if (Settings.Pooling) + { + if (FailoverManager.FailoverGroup != null) + { + string connectionString = await FailoverManager.AttemptConnectionAsync(this, Settings.ConnectionString, execAsync, cancellationToken, true); + currentSettings.ConnectionString = connectionString; + } +#if NET5_0_OR_GREATER + currentActivity = MySQLActivitySource.OpenPooledConnection(currentSettings); +#endif + MySqlPool pool = await MySqlPoolManager.GetPoolAsync(currentSettings, execAsync, cancellationToken).ConfigureAwait(false); + if (driver == null || !driver.IsOpen) + driver = await pool.GetConnectionAsync(execAsync, cancellationToken).ConfigureAwait(false); + ProcedureCache = pool.ProcedureCache; + } + else + { + if (driver == null || !driver.IsOpen) + { +#if NET5_0_OR_GREATER + currentActivity = MySQLActivitySource.OpenConnection(currentSettings); +#endif + driver = await Driver.CreateAsync(currentSettings, execAsync, cancellationToken).ConfigureAwait(false); + } + + ProcedureCache = new ProcedureCache((int)Settings.ProcedureCacheSize); + } + } + catch (Exception ex) + { +#if NET5_0_OR_GREATER + MySQLActivitySource.SetException(currentActivity, ex); +#endif + SetState(ConnectionState.Closed, true); + throw; + } + + SetState(ConnectionState.Open, false); + await driver.ConfigureAsync(this, execAsync, cancellationToken).ConfigureAwait(false); + + if (driver.IsPasswordExpired && Settings.Pooling) + await MySqlPoolManager.ClearPoolAsync(currentSettings, execAsync).ConfigureAwait(false); + + if (!(driver.SupportsPasswordExpiration && driver.IsPasswordExpired)) + { + if (!string.IsNullOrEmpty(Settings.Database)) + await ChangeDatabaseAsync(Settings.Database, execAsync, cancellationToken).ConfigureAwait(false); + } + + // setup our schema provider + _schemaProvider = new ISSchemaProvider(this); + PerfMonitor = new PerformanceMonitor(this); + + // if we are opening up inside a current transaction, then autoenlist + // TODO: control this with a connection string option + if (Transaction.Current != null && Settings.AutoEnlist) + EnlistTransaction(Transaction.Current); + + hasBeenOpen = true; + SetState(ConnectionState.Open, true); + } + + /// + /// Creates and returns a object associated with the . + /// + /// A object. + public new MySqlCommand CreateCommand() + { + // Return a new instance of a command object. + MySqlCommand c = new MySqlCommand(); + c.Connection = this; + return c; + } + + internal async Task AbortAsync(bool execAsync, CancellationToken cancellationToken = default) + { + try + { + if (driver.HasStatus(ServerStatusFlags.InTransaction)) + { + MySqlConnection newConn = (MySqlConnection)this.Clone(); + Driver newDriver = + await Driver.CreateAsync(new MySqlConnectionStringBuilder(newConn.ConnectionString), execAsync, cancellationToken).ConfigureAwait(false); + + lock (newDriver) + { + newConn.driver = newDriver; + newDriver.currentTransaction = driver.currentTransaction; + driver.currentTransaction.Connection = newConn; + } + } + } + catch (Exception ex) + { + MySqlTrace.LogWarning(ServerThread, String.Concat("Error occurred aborting the connection. Exception was: ", ex.Message)); + } + finally + { + await driver.CloseAsync(execAsync).ConfigureAwait(false); + this.IsInUse = false; + } + SetState(ConnectionState.Closed, true); + } + + internal async Task CloseFullyAsync(bool execAsync) + { + if (Settings.Pooling && driver.IsOpen) + { + //TODO: SUPPORT FOR 452 AND 46X + //// if we are in a transaction, roll it back + if (driver.HasStatus(ServerStatusFlags.InTransaction)) + { + MySqlTransaction t = new MySqlTransaction(this, IsolationLevel.Unspecified); + t.Rollback(); + } + + await MySqlPoolManager.ReleaseConnectionAsync(driver, execAsync).ConfigureAwait(false); + } + else + await driver.CloseAsync(execAsync).ConfigureAwait(false); + + driver = null; + } + + /// Closes the connection to the database. This is the preferred method of closing any open connection. + /// + /// + /// The method rolls back any pending transactions. It then releases + /// the connection to the connection pool, or closes the connection if connection + /// pooling is disabled. + /// + /// + /// An application can call more than one time. No exception is + /// generated. + /// + /// + public override void Close() => CloseAsync(false).GetAwaiter().GetResult(); + + /// + /// Asynchronous version of the method. + /// +#if NETSTANDARD2_0 || NETFRAMEWORK + public Task CloseAsync() => CloseAsync(true); +#else + public override Task CloseAsync() => CloseAsync(true); +#endif + + /// + /// Asynchronous version of the method. + /// + internal async Task CloseAsync(bool execAsync) + { +#if NET5_0_OR_GREATER + MySQLActivitySource.CloseConnection(currentActivity); +#endif + + if (driver != null) + driver.IsPasswordExpired = false; + + if (State == ConnectionState.Closed) return; + + if (Reader != null) + Reader.Close(); + + // if the reader was opened with CloseConnection then driver + // will be null on the second time through + if (driver != null) + { + //TODO: Add support for 452 and 46X + if (driver.currentTransaction == null) + await CloseFullyAsync(execAsync).ConfigureAwait(false); + //TODO: Add support for 452 and 46X + else + driver.IsInActiveUse = false; + } + + FailoverManager.Reset(); + MySqlPoolManager.Hosts = null; + + SetState(ConnectionState.Closed, true); + } + + internal string CurrentDatabase() + { + if (!string.IsNullOrEmpty(Database)) + return Database; + MySqlCommand cmd = new MySqlCommand("SELECT database()", this); + return cmd.ExecuteScalar().ToString(); + } + + internal async Task HandleTimeoutOrThreadAbortAsync(Exception ex, bool execAsync, CancellationToken cancellationToken = default) + { + bool isFatal = false; + + if (_isKillQueryConnection) + { + // Special connection started to cancel a query. + // Abort will prevent recursive connection spawning + await AbortAsync(execAsync, cancellationToken).ConfigureAwait(false); + if (ex is TimeoutException) + { + Throw(new MySqlException(Resources.Timeout, true, ex)); + } + else + { + return; + } + } + + try + { + // Do a fast cancel.The reason behind small values for connection + // and command timeout is that we do not want user to wait longer + // after command has already expired. + // Microsoft's SqlClient seems to be using 5 seconds timeouts + // here as well. + // Read the error packet with "interrupted" message. + if (execAsync) + await CancelQueryAsync(5, cancellationToken).ConfigureAwait(false); + else + CancelQuery(5); + + driver.ResetTimeout(5000); + if (Reader != null) + { + if (execAsync) + await Reader.CloseAsync(execAsync).ConfigureAwait(false); + else + Reader.Close(); + + Reader = null; + } + } + catch (Exception ex2) + { + MySqlTrace.LogWarning(ServerThread, "Could not kill query, " + + " aborting connection. Exception was " + ex2.Message); + await AbortAsync(execAsync, cancellationToken).ConfigureAwait(false); + isFatal = true; + } + if (ex is TimeoutException) + { + Throw(new MySqlException(Resources.Timeout, isFatal, ex)); + } + } + + /// + /// Cancels the query after the specified time interval. + /// + /// The length of time (in seconds) to wait for the cancellation of the command execution. + public void CancelQuery(int timeout) => CancelQueryAsync(timeout, false, CancellationToken.None).GetAwaiter().GetResult(); + + /// + /// Asynchronous version of the method. + /// + /// The length of time (in seconds) to wait for the cancellation of the command execution. + /// The cancellation token. + public Task CancelQueryAsync(int timeout, CancellationToken cancellationToken) => CancelQueryAsync(timeout, true, cancellationToken); + + private async Task CancelQueryAsync(int timeout, bool execAsync, CancellationToken cancellationToken) + { + var cb = new MySqlConnectionStringBuilder(Settings.ConnectionString, IsConnectionStringAnalyzed); + cb.Pooling = false; + cb.AutoEnlist = false; + cb.ConnectionTimeout = (uint)timeout; + + using (MySqlConnection c = new MySqlConnection(cb.ConnectionString)) + { + c._isKillQueryConnection = true; + await c.OpenAsync(execAsync, cancellationToken).ConfigureAwait(false); + string commandText = "KILL QUERY " + ServerThread; + MySqlCommand cmd = new MySqlCommand(commandText, c) { CommandTimeout = timeout }; + cmd.ExecuteNonQuery(); + } + } + + internal void Throw(Exception ex) + { + if (_exceptionInterceptor == null) + throw ex; + _exceptionInterceptor.Throw(ex); + } + + /// + /// Returns schema information for the data source of this . + /// + /// A that contains schema information. + public override DataTable GetSchema() => GetSchemaAsync(false).GetAwaiter().GetResult(); + + /// + /// Returns schema information for the data source of this + /// using the specified string for the schema name. + /// + /// Specifies the name of the schema to return. + /// A that contains schema information. + public override DataTable GetSchema(string collectionName) => GetSchemaAsync(false, collectionName).GetAwaiter().GetResult(); + + /// + /// Returns schema information for the data source of this + /// using the specified string for the schema name and the specified string array + /// for the restriction values. + /// + /// Specifies the name of the schema to return. + /// Specifies a set of restriction values for the requested schema. + /// A that contains schema information. + public override DataTable GetSchema(string collectionName, string[] restrictionValues) => GetSchemaAsync(false, collectionName, restrictionValues).GetAwaiter().GetResult(); + + /// + /// Asynchronous version of . + /// + /// A token to cancel the asynchronous operation. + /// A task representing the asynchronous operation. +#if NETFRAMEWORK || NETSTANDARD2_0_OR_GREATER + public Task GetSchemaAsync(CancellationToken cancellationToken = default) +#else + public override Task GetSchemaAsync(CancellationToken cancellationToken = default) +#endif + => GetSchemaAsync(true, cancellationToken: cancellationToken); + + + /// + /// Asynchronous version of . + /// + /// Specifies the name of the schema to return. + /// A token to cancel the asynchronous operation. + /// A task representing the asynchronous operation. +#if NETFRAMEWORK || NETSTANDARD2_0_OR_GREATER + public Task GetSchemaAsync(string collectionName, CancellationToken cancellationToken = default) +#else + public override Task GetSchemaAsync(string collectionName, CancellationToken cancellationToken = default) +#endif + => GetSchemaAsync(true, collectionName, cancellationToken: cancellationToken); + + /// + /// Asynchronous version of . + /// + /// Specifies the name of the schema to return. + /// Specifies a set of restriction values for the requested schema. + /// A token to cancel the asynchronous operation. + /// A task representing the asynchronous operation. +#if NETFRAMEWORK || NETSTANDARD2_0_OR_GREATER + public Task GetSchemaAsync(string collectionName, string[] restrictionValues, CancellationToken cancellationToken = default) +#else + public override Task GetSchemaAsync(string collectionName, string[] restrictionValues, CancellationToken cancellationToken = default) +#endif + => GetSchemaAsync(true, collectionName, restrictionValues, cancellationToken); + + internal async Task GetSchemaAsync(bool execAsync, string collectionName = null, string[] restrictionValues = null, CancellationToken cancellationToken = default) + { + collectionName ??= SchemaProvider.MetaCollection; + string[] restrictions = _schemaProvider.CleanRestrictions(restrictionValues); + MySqlSchemaCollection c = await _schemaProvider.GetSchemaAsync(collectionName, restrictions, execAsync, cancellationToken).ConfigureAwait(false); + return c.AsDataTable(); + } + + /// + /// Gets a schema collection based on the provided restriction values. + /// + /// The name of the collection. + /// The values to restrict. + /// A schema collection object. + public MySqlSchemaCollection GetSchemaCollection(string collectionName, string[] restrictionValues) => GetSchemaCollectionAsync(collectionName, restrictionValues, false, CancellationToken.None).GetAwaiter().GetResult(); + + /// + /// Asynchronous version of the method. + /// + /// The name of the collection. + /// The values to restrict. + /// The cancellation token. + /// A collection of schema objects. + public Task GetSchemaCollectionAsync(string collectionName, string[] restrictionValues, CancellationToken cancellationToken = default) => GetSchemaCollectionAsync(collectionName, restrictionValues, true, cancellationToken); + + /// + /// Asynchronous version of the method. + /// + /// The name of the collection. + /// The values to restrict. + /// The cancellation token. + /// Boolean that indicates if the function will be executed asynchronously. + /// A collection of schema objects. + private async Task GetSchemaCollectionAsync(string collectionName, string[] restrictionValues, bool execAsync, CancellationToken cancellationToken) + { + collectionName ??= SchemaProvider.MetaCollection; + + string[] restrictions = _schemaProvider.CleanRestrictions(restrictionValues); + MySqlSchemaCollection c = await _schemaProvider.GetSchemaAsync(collectionName, restrictions, execAsync, cancellationToken).ConfigureAwait(false); + return c; + } + + /// + /// Enlists in the specified transaction. + /// + /// A reference to an existing in which to enlist. + public override void EnlistTransaction(Transaction transaction) + { + // enlisting in the null transaction is a noop + if (transaction == null) + return; + + // guard against trying to enlist in more than one transaction + if (driver.currentTransaction != null) + { + if (driver.currentTransaction.BaseTransaction == transaction) + return; + + Throw(new MySqlException("Already enlisted")); + } + + // now see if we need to swap out drivers. We would need to do this since + // we have to make sure all ops for a given transaction are done on the + // same physical connection. + Driver existingDriver = DriverTransactionManager.GetDriverInTransaction(transaction); + if (existingDriver != null) + { + // we can't allow more than one driver to contribute to the same connection + if (existingDriver.IsInActiveUse) + Throw(new NotSupportedException(Resources.MultipleConnectionsInTransactionNotSupported)); + + // there is an existing driver and it's not being currently used. + // now we need to see if it is using the same connection string + string text1 = existingDriver.Settings.ConnectionString; + string text2 = Settings.ConnectionString; + if (String.Compare(text1, text2, true) != 0) + Throw(new NotSupportedException(Resources.MultipleConnectionsInTransactionNotSupported)); + + // close existing driver + // set this new driver as our existing driver + CloseFullyAsync(false).GetAwaiter().GetResult(); + driver = existingDriver; + } + + if (driver.currentTransaction == null) + { + MySqlPromotableTransaction t = new MySqlPromotableTransaction(this, transaction); + if (!transaction.EnlistPromotableSinglePhase(t)) + Throw(new NotSupportedException(Resources.DistributedTxnNotSupported)); + + driver.currentTransaction = t; + DriverTransactionManager.SetDriverInTransaction(driver); + driver.IsInActiveUse = true; + } + } + + void AssertPermissions() + { + // Security Asserts can only be done when the assemblies + // are put in the GAC as documented in + // http://msdn.microsoft.com/en-us/library/ff648665.aspx + if (this.Settings.IncludeSecurityAsserts) + { + PermissionSet set = new PermissionSet(PermissionState.None); + set.AddPermission(new MySqlClientPermission(ConnectionString)); + set.Demand(); + MySqlSecurityPermission.CreatePermissionSet(true).Assert(); + } + } + + /// + /// Creates a new object with the exact same ConnectionString value. + /// + /// A cloned object. + public object Clone() + { + MySqlConnection clone = new MySqlConnection(); + clone.IsClone = true; + clone.ParentHasbeenOpen = hasBeenOpen; + clone.IsConnectionStringAnalyzed = IsConnectionStringAnalyzed; + string connectionString = Settings.ConnectionString; + if (connectionString != null) + clone.ConnectionString = connectionString; + return clone; + } + + /// + /// Returns an unopened copy of this connection with a new connection string. If the Password + /// in is not set, the password from this connection will be used. + /// This allows creating a new connection with the same security information while changing other options, + /// such as database or pooling. + /// + /// The new connection string to be used. + /// A new with different connection string options but + /// the same password as this connection (unless overridden by ). + public MySqlConnection CloneWith(string connectionString) + { + var newBuilder = new MySqlConnectionStringBuilder(connectionString ?? throw new ArgumentNullException(nameof(connectionString)), IsConnectionStringAnalyzed); + var currentBuilder = new MySqlConnectionStringBuilder(ConnectionString, IsConnectionStringAnalyzed); + var shouldCopyPassword = newBuilder.Password.Length == 0 && (!newBuilder.PersistSecurityInfo || currentBuilder.PersistSecurityInfo); + + if (shouldCopyPassword) + newBuilder.Password = currentBuilder.Password; + + var cloneConnection = new MySqlConnection(newBuilder.ConnectionString); + cloneConnection.ParentHasbeenOpen = hasBeenOpen; + cloneConnection.IsClone = true; + + return cloneConnection; + } + + #region Routines for timeout support. + + // Problem description: + // Sometimes, ExecuteReader is called recursively. This is the case if + // command behaviors are used and we issue "set sql_select_limit" + // before and after command. This is also the case with prepared + // statements , where we set session variables. In these situations, we + // have to prevent recursive ExecuteReader calls from overwriting + // timeouts set by the top level command. + + // To solve the problem, SetCommandTimeout() and ClearCommandTimeout() are + // introduced . Query timeout here is "sticky", that is once set with + // SetCommandTimeout, it only be overwritten after ClearCommandTimeout + // (SetCommandTimeout would return false if it timeout has not been + // cleared). + + // The proposed usage pattern of there routines is following: + // When timed operations starts, issue SetCommandTimeout(). When it + // finishes, issue ClearCommandTimeout(), but _only_ if call to + // SetCommandTimeout() was successful. + + /// + /// Sets query timeout. If timeout has been set prior and not + /// yet cleared with ClearCommandTimeout(), it has no effect. + /// + /// Timeout in seconds. + /// if a timeout is set. + internal bool SetCommandTimeout(int value) + { + if (!hasBeenOpen) + // Connection timeout is handled by driver + return false; + + if (_commandTimeout != 0) + // someone is trying to set a timeout while command is already + // running. It could be for example recursive call to ExecuteReader + // Ignore the request, as only top-level (non-recursive commands) + // can set timeouts. + return false; + + if (driver == null) + return false; + + _commandTimeout = value; + driver.ResetTimeout(_commandTimeout * 1000); + return true; + } + + /// + /// Clears query timeout, allowing next SetCommandTimeout() to succeed. + /// + internal void ClearCommandTimeout() + { + if (!hasBeenOpen) + return; + _commandTimeout = 0; + driver?.ResetTimeout(0); + } + + #endregion + + #region Pool Routines + + /// Empties the connection pool associated with the specified connection. + /// + /// The associated with the pool to be cleared. + /// + /// + /// + /// clears the connection pool that is associated with the connection. + /// If additional connections associated with connection are in use at the time of the call, + /// they are marked appropriately and are discarded (instead of being returned to the pool) + /// when is called on them. + /// + /// + public static void ClearPool(MySqlConnection connection) => ClearPoolAsync(connection, false, CancellationToken.None).GetAwaiter().GetResult(); + + /// + /// Asynchronous version of the method. + /// + /// The connection associated with the pool to be cleared. + /// The cancellation token. + public Task ClearPoolAsync(MySqlConnection connection, CancellationToken cancellationToken = default) => ClearPoolAsync(connection, true, cancellationToken); + + private static async Task ClearPoolAsync(MySqlConnection connection, bool execAsync, CancellationToken cancellationToken) + { + await MySqlPoolManager.ClearPoolAsync(connection.Settings, execAsync).ConfigureAwait(false); + } + + /// + /// Clears all connection pools. + /// + /// ClearAllPools essentially performs a on all current connection pools. + public static void ClearAllPools() => ClearAllPoolsAsync(false).GetAwaiter().GetResult(); + + /// + /// Asynchronous version of the method. + /// + /// The cancellation token. + public Task ClearAllPoolsAsync(CancellationToken cancellationToken = default) => ClearAllPoolsAsync(true); + + private static async Task ClearAllPoolsAsync(bool execAsync) + { + await MySqlPoolManager.ClearAllPoolsAsync(execAsync).ConfigureAwait(false); + } + + #endregion + } + + /// + /// Represents the method to handle the event of a + /// . + /// + public delegate void WebAuthnActionCallback(); + + /// + /// Represents the method to handle the event of a + /// . + /// + public delegate void MySqlInfoMessageEventHandler(object sender, MySqlInfoMessageEventArgs args); + + /// + /// Provides data for the InfoMessage event. This class cannot be inherited. + /// + public class MySqlInfoMessageEventArgs : EventArgs + { + /// + /// Gets or sets an array of objects together with the errors found. + /// + public MySqlError[] errors { get; set; } + } + + /// + /// IDisposable wrapper around SetCommandTimeout and ClearCommandTimeout functionality. + /// + internal class CommandTimer : IDisposable + { + private bool _timeoutSet; + private MySqlConnection _connection; + + public CommandTimer(MySqlConnection connection, int timeout) + { + _connection = connection; + if (connection != null) + { + _timeoutSet = connection.SetCommandTimeout(timeout); + } + } + + #region IDisposable Members + public void Dispose() + { + if (!_timeoutSet) return; + + _timeoutSet = false; + _connection.ClearCommandTimeout(); + _connection = null; + } + #endregion + } +} diff --git a/MySQL.Data/src/MySqlConnectionStringBuilder.cs b/MySQL.Data/src/MySqlConnectionStringBuilder.cs new file mode 100644 index 000000000..c61949777 --- /dev/null +++ b/MySQL.Data/src/MySqlConnectionStringBuilder.cs @@ -0,0 +1,1185 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using MySql.Data.MySqlClient.Authentication; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Text.RegularExpressions; + +namespace MySql.Data.MySqlClient +{ + /// + /// Aids in the creation of connection strings by exposing the connection options as properties. + /// Contains connection options specific to the Classic MySQL protocol. + /// + public sealed class MySqlConnectionStringBuilder : MySqlBaseConnectionStringBuilder + { + static MySqlConnectionStringBuilder() + { + // Add options shared between classic and X protocols from base class. + Options = MySqlBaseConnectionStringBuilder.Options.Clone(); + + #region ServerOptions + + Options.Add(new MySqlConnectionStringOption("pipe", "pipe name,pipename", typeof(string), "MYSQL", false, + (msb, sender, value) => + { + if (!Platform.IsWindows()) + throw new PlatformNotSupportedException(string.Format(Resources.OptionNotCurrentlySupported, nameof(PipeName))); + else + msb.SetValue("pipe", value); + }, + (msb, sender) => msb.PipeName)); + Options.Add(new MySqlConnectionStringOption("compress", "use compression,usecompression", typeof(bool), false, false, + (msb, sender, value) => { msb.SetValue("compress", value); }, (msb, sender) => msb.UseCompression)); + Options.Add(new MySqlConnectionStringOption("allowbatch", "allow batch", typeof(bool), true, false, + (msb, sender, value) => { msb.SetValue("allowbatch", value); }, (msb, sender) => msb.AllowBatch)); + Options.Add(new MySqlConnectionStringOption("logging", null, typeof(bool), false, false, + (msb, sender, value) => + { + msb.SetValue("logging", value); + }, + (msb, sender) => msb.Logging)); + Options.Add(new MySqlConnectionStringOption("sharedmemoryname", "shared memory name", typeof(string), "MYSQL", false, + (msb, sender, value) => + { + if (!Platform.IsWindows()) + throw new PlatformNotSupportedException(string.Format(Resources.OptionNotCurrentlySupported, nameof(SharedMemoryName))); + else + msb.SetValue("sharedmemoryname", value); + }, + (msb, sender) => msb.SharedMemoryName)); + Options.Add(new MySqlConnectionStringOption("defaultcommandtimeout", "command timeout,default command timeout", typeof(uint), (uint)30, false, + (msb, sender, value) => { msb.SetValue("defaultcommandtimeout", value); }, (msb, sender) => msb.DefaultCommandTimeout)); + Options.Add(new MySqlConnectionStringOption("usedefaultcommandtimeoutforef", "use default command timeout for ef", typeof(bool), false, false, + (msb, sender, value) => { msb.SetValue("usedefaultcommandtimeoutforef", value); }, (msb, sender) => msb.UseDefaultCommandTimeoutForEF)); + Options.Add(new MySqlConnectionStringOption("connectiontimeout", "connection timeout,connect timeout", typeof(uint), (uint)15, false, + delegate (MySqlConnectionStringBuilder msb, MySqlConnectionStringOption sender, object Value) + { + uint value = (uint)Convert.ChangeType(Value, sender.BaseType); + // Timeout in milliseconds should not exceed maximum for 32 bit + // signed integer (~24 days). We truncate the value if it exceeds + // maximum (MySqlCommand.CommandTimeout uses the same technique + uint timeout = Math.Min(value, Int32.MaxValue / 1000); + if (timeout != value) + { + MySqlTrace.LogWarning(-1, "Connection timeout value too large (" + + value + " seconds). Changed to max. possible value" + + +timeout + " seconds)"); + } + msb.SetValue("connectiontimeout", timeout); + }, + (msb, sender) => (uint)msb.values["connectiontimeout"] + )); + Options.Add(new MySqlConnectionStringOption("allowloadlocalinfile", "allow load local infile", typeof(bool), false, false)); + Options.Add(new MySqlConnectionStringOption("allowloadlocalinfileinpath", "allow load local infile in path", typeof(string), string.Empty, false)); + + #endregion + + #region AuthenticationOptions + + Options.Add(new MySqlConnectionStringOption("persistsecurityinfo", "persist security info", typeof(bool), false, false, + (msb, sender, value) => { msb.SetValue("persistsecurityinfo", value); }, (msb, sender) => msb.PersistSecurityInfo)); + Options.Add(new MySqlConnectionStringOption("integratedsecurity", "integrated security", typeof(bool), false, false, + delegate (MySqlConnectionStringBuilder msb, MySqlConnectionStringOption sender, object value) + { + if (!Platform.IsWindows()) + throw new MySqlException("IntegratedSecurity is supported on Windows only"); +#if !NETFRAMEWORK + throw new PlatformNotSupportedException(string.Format(Resources.OptionNotCurrentlySupported, nameof(IntegratedSecurity))); +#else + msb.SetValue("Integrated Security", value.ToString().Equals("SSPI", StringComparison.OrdinalIgnoreCase) ? true : value); +#endif + }, + delegate (MySqlConnectionStringBuilder msb, MySqlConnectionStringOption sender) + { + object val = msb.values["integratedsecurity"]; + return (bool)val; + } + )); + Options.Add(new MySqlConnectionStringOption("allowpublickeyretrieval", null, typeof(bool), false, false, + (msb, sender, value) => { msb.SetValue("allowpublickeyretrieval", value); }, (msb, sender) => msb.AllowPublicKeyRetrieval)); + Options.Add(new MySqlConnectionStringOption("defaultauthenticationplugin", null, typeof(string), string.Empty, false, + (msb, sender, value) => + { + if (!string.IsNullOrWhiteSpace((string)value)) AuthenticationPluginManager.ValidateAuthenticationPlugin((string)value); + msb.SetValue("defaultauthenticationplugin", value); + }, + (msb, sender) => msb.DefaultAuthenticationPlugin)); + Options.Add(new MySqlConnectionStringOption("ociconfigfile", "oci config file", typeof(string), string.Empty, false)); + Options.Add(new MySqlConnectionStringOption("ociconfigprofile", "oci config profile", typeof(string), "DEFAULT", false)); + Options.Add(new MySqlConnectionStringOption("kerberosauthmode", "kerberos auth mode", typeof(KerberosAuthMode), Platform.IsWindows() ? KerberosAuthMode.AUTO : KerberosAuthMode.GSSAPI, false, + (msb, sender, value) => + { + if (!Platform.IsWindows()) + throw new PlatformNotSupportedException(string.Format(Resources.OptionNotCurrentlySupported, nameof(KerberosAuthMode))); + else + msb.SetValue("kerberosauthmode", value); + }, + (msb, sender) => msb.KerberosAuthMode)); + Options.Add(new MySqlConnectionStringOption("openididentitytoken", null, typeof(string), string.Empty, false)); + #endregion + + #region OtherProperties + + Options.Add(new MySqlConnectionStringOption("autoenlist", "auto enlist", typeof(bool), true, false, + (msb, sender, value) => { msb.SetValue("autoenlist", value); }, (msb, sender) => msb.AutoEnlist)); + Options.Add(new MySqlConnectionStringOption("includesecurityasserts", "include security asserts", typeof(bool), false, false, + (msb, sender, value) => { msb.SetValue("includesecurityasserts", value); }, (msb, sender) => msb.IncludeSecurityAsserts)); + Options.Add(new MySqlConnectionStringOption("allowzerodatetime", "allow zero datetime", typeof(bool), false, false, + (msb, sender, value) => { msb.SetValue("allowzerodatetime", value); }, (msb, sender) => msb.AllowZeroDateTime)); + Options.Add(new MySqlConnectionStringOption("convertzerodatetime", "convert zero datetime", typeof(bool), false, false, + (msb, sender, value) => { msb.SetValue("convertzerodatetime", value); }, (msb, sender) => msb.ConvertZeroDateTime)); + Options.Add(new MySqlConnectionStringOption("useusageadvisor", "use usage advisor,usage advisor", typeof(bool), false, false, + (msb, sender, value) => + { + msb.SetValue("useusageadvisor", value); + }, + (msb, sender) => msb.UseUsageAdvisor)); + Options.Add(new MySqlConnectionStringOption("procedurecachesize", "procedure cache size,procedure cache,procedurecache", typeof(uint), (uint)25, false, + (msb, sender, value) => { msb.SetValue("procedurecachesize", value); }, (msb, sender) => msb.ProcedureCacheSize)); + Options.Add(new MySqlConnectionStringOption("useperformancemonitor", "use performance monitor,useperfmon,perfmon", typeof(bool), false, false, + (msb, sender, value) => + { +#if !NETFRAMEWORK + throw new PlatformNotSupportedException(string.Format(Resources.OptionNotCurrentlySupported, nameof(UsePerformanceMonitor))); +#else + msb.SetValue("useperformancemonitor", value); +#endif + }, + (msb, sender) => msb.UsePerformanceMonitor)); + Options.Add(new MySqlConnectionStringOption("respectbinaryflags", "respect binary flags", typeof(bool), true, false, + (msb, sender, value) => { msb.SetValue("respectbinaryflags", value); }, (msb, sender) => msb.RespectBinaryFlags)); + Options.Add(new MySqlConnectionStringOption("treattinyasboolean", "treat tiny as boolean", typeof(bool), true, false, + (msb, sender, value) => { msb.SetValue("treattinyasboolean", value); }, (msb, sender) => msb.TreatTinyAsBoolean)); + Options.Add(new MySqlConnectionStringOption("allowuservariables", "allow user variables", typeof(bool), false, false, + (msb, sender, value) => { msb.SetValue("allowuservariables", value); }, (msb, sender) => msb.AllowUserVariables)); + Options.Add(new MySqlConnectionStringOption("interactivesession", "interactive session,interactive", typeof(bool), false, false, + (msb, sender, value) => + { + msb.SetValue("interactivesession", value); + }, + (msb, sender) => msb.InteractiveSession)); + Options.Add(new MySqlConnectionStringOption("functionsreturnstring", "functions return string", typeof(bool), false, false, + (msb, sender, value) => { msb.SetValue("functionsreturnstring", value); }, (msb, sender) => msb.FunctionsReturnString)); + Options.Add(new MySqlConnectionStringOption("useaffectedrows", "use affected rows", typeof(bool), false, false, + (msb, sender, value) => { msb.SetValue("useaffectedrows", value); }, (msb, sender) => msb.UseAffectedRows)); + Options.Add(new MySqlConnectionStringOption("oldguids", "old guids", typeof(bool), false, false, + (msb, sender, value) => { msb.SetValue("oldguids", value); }, (msb, sender) => msb.OldGuids)); + Options.Add(new MySqlConnectionStringOption("sqlservermode", "sql server mode", typeof(bool), false, false, + (msb, sender, value) => { msb.SetValue("sqlservermode", value); }, (msb, sender) => msb.SqlServerMode)); + Options.Add(new MySqlConnectionStringOption("tablecaching", "table cache,tablecache", typeof(bool), false, false, + (msb, sender, value) => { msb.SetValue("tablecaching", value); }, (msb, sender) => msb.TableCaching)); + Options.Add(new MySqlConnectionStringOption("defaulttablecacheage", "default table cache age", typeof(int), (int)60, false, + (msb, sender, value) => { msb.SetValue("defaulttablecacheage", value); }, (msb, sender) => msb.DefaultTableCacheAge)); + Options.Add(new MySqlConnectionStringOption("checkparameters", "check parameters", typeof(bool), true, false, + (msb, sender, value) => { msb.SetValue("checkparameters", value); }, (msb, sender) => msb.CheckParameters)); + Options.Add(new MySqlConnectionStringOption("replication", null, typeof(bool), false, false, + (msb, sender, value) => + { + msb.SetValue("replication", value); + }, + (msb, sender) => msb.Replication)); + Options.Add(new MySqlConnectionStringOption("exceptioninterceptors", "exception interceptors", typeof(string), null, false, + (msb, sender, value) => { msb.SetValue("exceptioninterceptors", value); }, (msb, sender) => msb.ExceptionInterceptors)); + Options.Add(new MySqlConnectionStringOption("commandinterceptors", "command interceptors", typeof(string), null, false, + (msb, sender, value) => { msb.SetValue("commandinterceptors", value); }, (msb, sender) => msb.CommandInterceptors)); + Options.Add(new MySqlConnectionStringOption("rewritebatchedstatements", null, typeof(bool), false, false)); + + #endregion + + #region PoolingOptions + + Options.Add(new MySqlConnectionStringOption("connectionlifetime", "connection lifetime", typeof(uint), (uint)0, false, + (msb, sender, value) => { msb.SetValue("connectionlifetime", value); }, (msb, sender) => msb.ConnectionLifeTime)); + Options.Add(new MySqlConnectionStringOption("pooling", null, typeof(bool), true, false, + (msb, sender, value) => { msb.SetValue("pooling", value); }, (msb, sender) => msb.Pooling)); + Options.Add(new MySqlConnectionStringOption("minpoolsize", "minimumpoolsize,min pool size,minimum pool size", typeof(uint), (uint)0, false, + (msb, sender, value) => { msb.SetValue("minpoolsize", value); }, (msb, sender) => msb.MinimumPoolSize)); + Options.Add(new MySqlConnectionStringOption("maxpoolsize", "maximumpoolsize,max pool size,maximum pool size", typeof(uint), (uint)100, false, + (msb, sender, value) => { msb.SetValue("maxpoolsize", value); }, (msb, sender) => msb.MaximumPoolSize)); + Options.Add(new MySqlConnectionStringOption("connectionreset", "connection reset", typeof(bool), false, false, + (msb, sender, value) => { msb.SetValue("connectionreset", value); }, (msb, sender) => msb.ConnectionReset)); + Options.Add(new MySqlConnectionStringOption("cacheserverproperties", "cache server properties", typeof(bool), false, false, + (msb, sender, value) => { msb.SetValue("cacheserverproperties", value); }, (msb, sender) => msb.CacheServerProperties)); + + #endregion + + #region LanguageCharsetOptions + + Options.Add(new MySqlConnectionStringOption("treatblobsasutf8", "treat blobs as utf8", typeof(bool), false, false, + (msb, sender, value) => { msb.SetValue("treatblobsasutf8", value); }, (msb, sender) => msb.TreatBlobsAsUTF8)); + Options.Add(new MySqlConnectionStringOption("blobasutf8includepattern", null, typeof(string), "", false, + (msb, sender, value) => { msb.SetValue("blobasutf8includepattern", value); }, (msb, sender) => msb.BlobAsUTF8IncludePattern)); + Options.Add(new MySqlConnectionStringOption("blobasutf8excludepattern", null, typeof(string), "", false, + (msb, sender, value) => { msb.SetValue("blobasutf8excludepattern", value); }, (msb, sender) => msb.BlobAsUTF8ExcludePattern)); + + #endregion + } + + /// + /// Main constructor. + /// + public MySqlConnectionStringBuilder() + { + values = new Dictionary(); + + // Populate initial values. + lock (this) + { + foreach (MySqlConnectionStringOption option in Options.Options) + { + values[option.Keyword] = option.DefaultValue; + } + } + } + + /// + /// Constructor accepting a connection string. + /// + /// The connection string. + /// Flag that indicates if the connection string has been analyzed. + public MySqlConnectionStringBuilder(string connectionString, bool isAnalyzed = false) : this() + { + AnalyzeConnectionString(connectionString, false, isAnalyzed: isAnalyzed); + lock (this) + { + ConnectionString = connectionString; + } + } + + /// + /// Readonly field containing a collection of classic protocol and protocol shared connection options. + /// + internal new static readonly MySqlConnectionStringOptionCollection Options; + + #region Server Properties + + /// + /// Gets or sets the name of the named pipe that should be used + /// for communicating with MySQL. + /// + /// This property has no effect unless the + /// property has been set to . + [Category("Connection")] + [DisplayName("Pipe Name")] + [Description("Name of pipe to use when connecting with named pipes (Win32 only)")] + [RefreshProperties(RefreshProperties.All)] + public string PipeName + { + get { return (string)values["pipe"]; } + set { SetValue("pipe", value); } + } + + /// + /// Gets or sets a boolean value that indicates whether this connection + /// should use compression. + /// + [Category("Connection")] + [DisplayName("Use Compression")] + [Description("Should the connection use compression")] + [RefreshProperties(RefreshProperties.All)] + public bool UseCompression + { + get { return (bool)values["compress"]; } + set { SetValue("compress", value); } + } + + /// + /// Gets or sets a boolean value that indicates whether this connection will allow + /// commands to send multiple SQL statements in one execution. + /// + [Category("Connection")] + [DisplayName("Allow Batch")] + [Description("Allows execution of multiple SQL commands in a single statement")] + [RefreshProperties(RefreshProperties.All)] + public bool AllowBatch + { + get { return (bool)values["allowbatch"]; } + set { SetValue("allowbatch", value); } + } + + /// + /// Gets or sets a boolean value that indicates whether logging is enabled. + /// + [Category("Connection")] + [Description("Enables output of diagnostic messages")] + [RefreshProperties(RefreshProperties.All)] + public bool Logging + { + get { return (bool)values["logging"]; } + set { SetValue("logging", value); } + } + + /// + /// Gets or sets the base name of the shared memory objects used to + /// communicate with MySQL when the shared memory protocol is being used. + /// + [Category("Connection")] + [DisplayName("Shared Memory Name")] + [Description("Name of the shared memory object to use")] + [RefreshProperties(RefreshProperties.All)] + public string SharedMemoryName + { + get { return (string)values["sharedmemoryname"]; } + set { SetValue("sharedmemoryname", value); } + } + + /// + /// Gets or sets the default command timeout. + /// + [Category("Connection")] + [DisplayName("Default Command Timeout")] + [Description(@"The default timeout that MySqlCommand objects will use + unless changed.")] + [RefreshProperties(RefreshProperties.All)] + public uint DefaultCommandTimeout + { + get { return (uint)values["defaultcommandtimeout"]; } + set { SetValue("defaultcommandtimeout", value); } + } + + /// + /// Gets or sets the connection timeout. + /// + [Category("Connection")] + [DisplayName("Connect Timeout")] + [Description("The length of time (in seconds) to wait for a connection " + + "to the server before terminating the attempt and generating an error.")] + [RefreshProperties(RefreshProperties.All)] + public uint ConnectionTimeout + { + get { return (uint)values["connectiontimeout"]; } + + set + { + // Timeout in milliseconds should not exceed maximum for 32 bit + // signed integer (~24 days). We truncate the value if it exceeds + // maximum (MySqlCommand.CommandTimeout uses the same technique + uint timeout = Math.Min(value, Int32.MaxValue / 1000); + if (timeout != value) + { + MySqlTrace.LogWarning(-1, "Connection timeout value too large (" + + value + " seconds). Changed to max. possible value" + + +timeout + " seconds)"); + } + SetValue("connectiontimeout", timeout); + } + } + + /// + /// Gets or sets a boolean value that indicates whether this connection will allow + /// to load data local infile. + /// + [Category("Connection")] + [DisplayName("Allow Load Data Local Infile")] + [Description("Allows reading data from a text file.")] + [RefreshProperties(RefreshProperties.All)] + public bool AllowLoadLocalInfile + { + get { return (bool)values["allowloadlocalinfile"]; } + set { SetValue("allowloadlocalinfile", value); } + } + + /// + /// Gets or sets the safe path where files can be read and uploaded to the server. + /// + [Category("Connection")] + [DisplayName("Allow Load Local Infile In Path")] + [Description("Allows specifying a safe path to read and upload files to server.")] + [RefreshProperties(RefreshProperties.All)] + public string AllowLoadLocalInfileInPath + { + get { return (string)values["allowloadlocalinfileinpath"]; } + set { SetValue("allowloadlocalinfileinpath", value); } + } + + #endregion + + #region Authentication Properties + + /// + /// Gets or sets a boolean value that indicates if the password should be persisted + /// in the connection string. + /// + [Category("Security")] + [DisplayName("Persist Security Info")] + [Description("When false, security-sensitive information, such as the password, " + + "is not returned as part of the connection if the connection is open or " + + "has ever been in an open state.")] + [RefreshProperties(RefreshProperties.All)] + public bool PersistSecurityInfo + { + get { return (bool)values["persistsecurityinfo"]; } + set { SetValue("persistsecurityinfo", value); } + } + + /// + /// Gets or sets a boolean value that indicates if the connection should be encrypted. + /// + /// Obsolte. Use instead. + [Category("Authentication")] + [DisplayName("Integrated Security")] + [Description("Use windows authentication when connecting to server")] + [DefaultValue(false)] + public bool IntegratedSecurity + { + get { return (bool)values["integratedsecurity"]; } + set { SetValue("integratedsecurity", value); } + } + + /// + /// Gets or sets a boolean value that indicates if RSA public keys should be retrieved from the server. + /// + /// This option is only relevant when SSL is disabled. Setting this option to true in + /// 8.0 servers that have the caching_sha2_password authentication plugin as the default plugin will + /// cause the connection attempt to fail if the user hasn't successfully connected to the server on a + /// previous occasion. + [Category("Authentication")] + [DisplayName("AllowPublicKeyRetrieval")] + [Description("Allow retrieval of RSA public keys from server when SSL is disabled.")] + [DefaultValue(false)] + public bool AllowPublicKeyRetrieval + { + get { return (bool)values["allowpublickeyretrieval"]; } + set { SetValue("allowpublickeyretrieval", value); } + } + + /// + /// Gets or sets the default authentication plugin to be used. This plugin takes precedence over + /// the server-side default authentication plugin when a valid authentication plugin is specified. + /// + /// + /// The default authentication plugin is mandatory for supporting user-less and password-less Kerberos authentications. + /// If no value is set, it uses the server-side default authentication plugin. + /// + [Category("Authentication")] + [DisplayName("DefaultAuthenticationPlugin")] + [Description("Enables the setting of an authentication plugin that takes precedence over the server-side" + + "default authentication plugin.")] + public string DefaultAuthenticationPlugin + { + get { return (string)values["defaultauthenticationplugin"]; } + set { SetValue("defaultauthenticationplugin", value); } + } + + /// + /// Gets or sets the OCI configuration file location. + /// + /// + /// The default values vary depending on the operating system. On Windows systems the value is '%HOMEDRIVE%%HOMEPATH%\.oci\config'. + /// For Linux and macOS systems it is '~/.oci/config'. + /// + [Category("Authentication")] + [DisplayName("OciConfigFile")] + [Description("Specifies the OCI configuration file location.")] + public string OciConfigFile + { + get { return (string)values["ociconfigfile"]; } + set { SetValue("ociconfigfile", value); } + } + + /// + /// Gets or sets the profile to use from the OCI configuration file. + /// + /// + /// The default value is "DEFAULT". + /// + [Category("Authentication")] + [DisplayName("OciConfigProfile")] + [Description("Specifies the profile to use from the OCI configuration file location.")] + public string OciConfigProfile + { + get { return (string)values["ociconfigprofile"]; } + set { SetValue("ociconfigprofile", value); } + } + + /// + /// Gets or sets the mode value to be used in Kerberos authentication. + /// + /// + /// If (default value) is used, then it will try to log in using + /// and then fallback to mode value in case of error. + /// + [Category("Authentication")] + [DisplayName("KerberosAuthMode")] + [Description("Specifies the API to use during Kerberos authentication.")] + public KerberosAuthMode KerberosAuthMode + { + get { return (KerberosAuthMode)values["kerberosauthmode"]; } + set { SetValue("kerberosauthmode", value); } + } + + /// + /// Gets or sets the Identity Token to be used in OpenID Connect authentication. + /// + /// + /// If is set the value will be used to try to log in using OpenID Connect authentication. + /// + [Category("Authentication")] + [DisplayName("OpenIdIdentityToken")] + [Description("Specifies the Identity Token to use during OpenID Connect authentication.")] + public string OpenIdIdentityToken + { + get { return (string)values["openididentitytoken"]; } + set { SetValue("openididentitytoken", value); } + } + + #endregion + + #region Other Properties + + /// + /// Gets or sets a boolean value that indicates if zero date time values are supported. + /// + /// Default value is false. + [Category("Advanced")] + [DisplayName("Allow Zero Datetime")] + [Description("Should zero datetimes be supported")] + [RefreshProperties(RefreshProperties.All)] + [DefaultValue(false)] + public bool AllowZeroDateTime + { + get { return (bool)values["allowzerodatetime"]; } + set { SetValue("allowzerodatetime", value); } + } + + /// + /// Gets or sets a boolean value that indicates if zero datetime values should be + /// converted to DateTime.MinValue. + /// + /// Default value is false. + [Category("Advanced")] + [DisplayName("Convert Zero Datetime")] + [Description("Should illegal datetime values be converted to DateTime.MinValue")] + [RefreshProperties(RefreshProperties.All)] + [DefaultValue(false)] + public bool ConvertZeroDateTime + { + get { return (bool)values["convertzerodatetime"]; } + set { SetValue("convertzerodatetime", value); } + } + + /// + /// Gets or sets a boolean value that indicates if the Usage Advisor should be enabled. + /// + /// Default value is false. + [Category("Advanced")] + [DisplayName("Use Usage Advisor")] + [Description("Logs inefficient database operations")] + [RefreshProperties(RefreshProperties.All)] + [DefaultValue(false)] + public bool UseUsageAdvisor + { + get { return (bool)values["useusageadvisor"]; } + set { SetValue("useusageadvisor", value); } + } + + /// + /// Gets or sets the size of the stored procedure cache. + /// + /// Default value is 25. + [Category("Advanced")] + [DisplayName("Procedure Cache Size")] + [Description("Indicates how many stored procedures can be cached at one time. " + + "A value of 0 effectively disables the procedure cache.")] + [RefreshProperties(RefreshProperties.All)] + [DefaultValue(25)] + public uint ProcedureCacheSize + { + get { return (uint)values["procedurecachesize"]; } + set { SetValue("procedurecachesize", value); } + } + + /// + /// Gets or sets a boolean value that indicates if the performance monitor hooks should be enabled. + /// + /// Default value is false. + [Category("Advanced")] + [DisplayName("Use Performance Monitor")] + [Description("Indicates that performance counters should be updated during execution.")] + [RefreshProperties(RefreshProperties.All)] + [DefaultValue(false)] + public bool UsePerformanceMonitor + { + get { return (bool)values["useperformancemonitor"]; } + set { SetValue("useperformancemonitor", value); } + } + + /// + /// Gets or sets a boolean value that indicates if an opened connection should particiapte in the current scope. + /// + /// Default value is true. + [Category("Advanced")] + [DisplayName("Auto Enlist")] + [Description("Should the connetion automatically enlist in the active connection, if there are any.")] + [RefreshProperties(RefreshProperties.All)] + [DefaultValue(true)] + public bool AutoEnlist + { + get { return (bool)values["autoenlist"]; } + set { SetValue("autoenlist", value); } + } + + /// + /// Gets or sets a boolean value that indicates if security asserts must be included. + /// + /// Must be set to true when using the class in a partial trust environment, + /// with the library installed in the GAC of the hosting environment. Not supported in .NET Core. + /// Default value is false. + [Category("Advanced")] + [DisplayName("Include Security Asserts")] + [Description("Include security asserts to support Medium Trust")] + [DefaultValue(false)] + public bool IncludeSecurityAsserts + { + get { return (bool)values["includesecurityasserts"]; } + set { SetValue("includesecurityasserts", value); } + } + + /// + /// Gets or sets a boolean value that indicates if column binary flags set by the server are ignored. + /// + /// Default value is true. + [Category("Advanced")] + [DisplayName("Respect Binary Flags")] + [Description("Should binary flags on column metadata be respected.")] + [RefreshProperties(RefreshProperties.All)] + [DefaultValue(true)] + public bool RespectBinaryFlags + { + get { return (bool)values["respectbinaryflags"]; } + set { SetValue("respectbinaryflags", value); } + } + + /// + /// Gets or sets a boolean value that indicates if TINYINT(1) shound be treated as a BOOLEAN. + /// + /// Default value is true. + [Category("Advanced")] + [DisplayName("Treat Tiny As Boolean")] + [Description("Should the provider treat TINYINT(1) columns as boolean.")] + [RefreshProperties(RefreshProperties.All)] + [DefaultValue(true)] + public bool TreatTinyAsBoolean + { + get { return (bool)values["treattinyasboolean"]; } + set { SetValue("treattinyasboolean", value); } + } + + /// + /// Gets or sets a boolean value that indicates if the provider expects user variables in the SQL. + /// + /// Default value is false. + [Category("Advanced")] + [DisplayName("Allow User Variables")] + [Description("Should the provider expect user variables to appear in the SQL.")] + [RefreshProperties(RefreshProperties.All)] + [DefaultValue(false)] + public bool AllowUserVariables + { + get { return (bool)values["allowuservariables"]; } + set { SetValue("allowuservariables", value); } + } + + /// + /// Gets or sets a boolean value that indicates if the session should be interactive. + /// + /// Default value is false. + [Category("Advanced")] + [DisplayName("Interactive Session")] + [Description("Should this session be considered interactive?")] + [RefreshProperties(RefreshProperties.All)] + [DefaultValue(false)] + public bool InteractiveSession + { + get { return (bool)values["interactivesession"]; } + set { SetValue("interactivesession", value); } + } + + /// + /// Gets or sets a boolean value that indicates if server functions should be treated as returning a string. + /// + /// Default value is false. + [Category("Advanced")] + [DisplayName("Functions Return String")] + [Description("Should all server functions be treated as returning string?")] + [DefaultValue(false)] + public bool FunctionsReturnString + { + get { return (bool)values["functionsreturnstring"]; } + set { SetValue("functionsreturnstring", value); } + } + + /// + /// Gets or sets a boolean value that indicates if the server should report affected rows instead of found rows. + /// + /// Default value is false. + [Category("Advanced")] + [DisplayName("Use Affected Rows")] + [Description("Should the returned affected row count reflect affected rows instead of found rows?")] + [DefaultValue(false)] + public bool UseAffectedRows + { + get { return (bool)values["useaffectedrows"]; } + set { SetValue("useaffectedrows", value); } + } + + /// + /// Gets or sets a boolean value that indicates if items of data type BINARY(16) should be treated as guids. + /// + /// Default value is false. + [Category("Advanced")] + [DisplayName("Old Guids")] + [Description("Treat binary(16) columns as guids")] + [DefaultValue(false)] + public bool OldGuids + { + get { return (bool)values["oldguids"]; } + set { SetValue("oldguids", value); } + } + + + /// + /// Gets or sets a boolean value that indicates if SQL Server syntax should be allowed by supporting square brackets + /// around symbols instead of backticks. + /// + /// Default value is false. + [Category("Advanced")] + [DisplayName("Sql Server Mode")] + [Description("Allow Sql Server syntax. " + + "A value of yes allows symbols to be enclosed with [] instead of ``. This does incur " + + "a performance hit so only use when necessary.")] + [DefaultValue(false)] + public bool SqlServerMode + { + get { return (bool)values["sqlservermode"]; } + set { SetValue("sqlservermode", value); } + } + + /// + /// Gets or sets a boolean value that indicates if caching of TableDirect commands is enabled. + /// + /// Default value is false. + [Category("Advanced")] + [DisplayName("Table Cache")] + [Description(@"Enables or disables caching of TableDirect command. + A value of yes enables the cache while no disables it.")] + [DefaultValue(false)] + public bool TableCaching + { + get { return (bool)values["tablecaching"]; } + set { SetValue("tablecaching", value); } + } + + /// + /// Gets or sets the seconds for how long a TableDirect result should be cached. + /// + /// Default value is 0. + [Category("Advanced")] + [DisplayName("Default Table Cache Age")] + [Description(@"Specifies how long a TableDirect result should be cached in seconds.")] + [DefaultValue(60)] + public int DefaultTableCacheAge + { + get { return (int)values["defaulttablecacheage"]; } + set { SetValue("defaulttablecacheage", value); } + } + + /// + /// Gets or sets a boolean value that indicates if stored routine parameters should be checked against the server. + /// + /// Default value is true. + [Category("Advanced")] + [DisplayName("Check Parameters")] + [Description("Indicates if stored routine parameters should be checked against the server.")] + [DefaultValue(true)] + public bool CheckParameters + { + get { return (bool)values["checkparameters"]; } + set { SetValue("checkparameters", value); } + } + + /// + /// Gets or sets a boolean value that indicates if this connection will use replication. + /// + /// Default value is false. + [Category("Advanced")] + [DisplayName("Replication")] + [Description("Indicates if this connection is to use replicated servers.")] + [DefaultValue(false)] + public bool Replication + { + get { return (bool)values["replication"]; } + set { SetValue("replication", value); } + } + + /// + /// Gets or sets the list of interceptors that can triage thrown MySqlExceptions. + /// + [Category("Advanced")] + [DisplayName("Exception Interceptors")] + [Description("The list of interceptors that can triage thrown MySqlExceptions.")] + public string ExceptionInterceptors + { + get { return (string)values["exceptioninterceptors"]; } + set { SetValue("exceptioninterceptors", value); } + } + + /// + /// Gets or sets the list of interceptors that can intercept command operations. + /// + [Category("Advanced")] + [DisplayName("Command Interceptors")] + [Description("The list of interceptors that can intercept command operations.")] + public string CommandInterceptors + { + get { return (string)values["commandinterceptors"]; } + set { SetValue("commandinterceptors", value); } + } + + /// + /// Gets or sets a boolean indicating if this connection should rewrite batched statements as one block. + /// + [Category("Advanced")] + [DisplayName("Rewrite Batched Statements")] + [Description("Indicates if this connection should rewrite batched statements as one block.")] + public bool RewriteBatchedStatements + { + get { return (bool)values["rewritebatchedstatements"]; } + set { SetValue("rewritebatchedstatements", value); } + } + + /// + /// Gets or sets the event for the WebauthN callback. + /// + internal WebAuthnActionCallback WebAuthnActionRequested { get; set; } + + #endregion + + #region Pooling Properties + + /// + /// Gets or sets the lifetime of a pooled connection. + /// + /// Default value is 0. + [Category("Pooling")] + [DisplayName("Connection Lifetime")] + [Description("The minimum amount of time (in seconds) for this connection to " + + "live in the pool before being destroyed.")] + [RefreshProperties(RefreshProperties.All)] + [DefaultValue(0)] + public uint ConnectionLifeTime + { + get { return (uint)values["connectionlifetime"]; } + set { SetValue("connectionlifetime", value); } + } + + /// + /// Gets or sets a boolean value indicating if connection pooling is enabled. + /// + /// Default value is true. + [Category("Pooling")] + [Description("When true, the connection object is drawn from the appropriate " + + "pool, or if necessary, is created and added to the appropriate pool.")] + [RefreshProperties(RefreshProperties.All)] + [DefaultValue(true)] + public bool Pooling + { + get { return (bool)values["pooling"]; } + set { SetValue("pooling", value); } + } + + /// + /// Gets the minimum connection pool size. + /// + /// Default value is 0. + [Category("Pooling")] + [DisplayName("Minimum Pool Size")] + [Description("The minimum number of connections allowed in the pool.")] + [RefreshProperties(RefreshProperties.All)] + [DefaultValue(0)] + public uint MinimumPoolSize + { + get { return (uint)values["minpoolsize"]; } + set { SetValue("minpoolsize", value); } + } + + /// + /// Gets or sets the maximum connection pool setting. + /// + /// Default value is 100. + [Category("Pooling")] + [DisplayName("Maximum Pool Size")] + [Description("The maximum number of connections allowed in the pool.")] + [RefreshProperties(RefreshProperties.All)] + [DefaultValue(100)] + public uint MaximumPoolSize + { + get { return (uint)values["maxpoolsize"]; } + set { SetValue("maxpoolsize", value); } + } + + /// + /// Gets or sets a boolean value that indicates if the connection should be reset when retrieved + /// from the pool. + /// + /// Default value is false. + [Category("Pooling")] + [DisplayName("Connection Reset")] + [Description("When true, indicates the connection state is reset when removed from the pool.")] + [RefreshProperties(RefreshProperties.All)] + [DefaultValue(false)] + public bool ConnectionReset + { + get { return (bool)values["connectionreset"]; } + set { SetValue("connectionreset", value); } + } + + /// + /// Gets or sets a boolean value that indicates whether the server variable settings are updated by a + /// SHOW VARIABLES command each time a pooled connection is returned. + /// + /// Default value is false. + [Category("Pooling")] + [DisplayName("Cache Server Properties")] + [Description("When true, server properties will be cached after the first server in the pool is created")] + [RefreshProperties(RefreshProperties.All)] + [DefaultValue(false)] + public bool CacheServerProperties + { + get { return (bool)values["cacheserverproperties"]; } + set { SetValue("cacheserverproperties", value); } + } + + #endregion + + #region Language and Character Set Properties + + /// + /// Indicates whether the driver should treat binary BLOBs as UTF8. + /// + /// Default value is false. + [DisplayName("Treat Blobs As UTF8")] + [Category("Advanced")] + [Description("Should binary blobs be treated as UTF8")] + [RefreshProperties(RefreshProperties.All)] + [DefaultValue(false)] + public bool TreatBlobsAsUTF8 + { + get { return (bool)values["treatblobsasutf8"]; } + set { SetValue("treatblobsasutf8", value); } + } + + /// + /// Gets or sets the pattern to match for the columns that should be treated as UTF8. + /// + [Category("Advanced")] + [Description("Pattern that matches columns that should be treated as UTF8")] + [RefreshProperties(RefreshProperties.All)] + public string BlobAsUTF8IncludePattern + { + get { return (string)values["blobasutf8includepattern"]; } + set { SetValue("blobasutf8includepattern", value); } + } + + /// + /// Gets or sets the pattern to match for the columns that should not be treated as UTF8. + /// + [Category("Advanced")] + [Description("Pattern that matches columns that should not be treated as UTF8")] + [RefreshProperties(RefreshProperties.All)] + public string BlobAsUTF8ExcludePattern + { + get { return (string)values["blobasutf8excludepattern"]; } + set { SetValue("blobasutf8excludepattern", value); } + } + + #endregion + + #region Backwards compatibility properties + + [DisplayName("Use Default Command Timeout For EF")] + [Category("Backwards Compatibility")] + [Description("Enforces the command timeout of EFMySqlCommand to the value provided in 'DefaultCommandTimeout' property")] + [DefaultValue(false)] + public bool UseDefaultCommandTimeoutForEF + { + get { return (bool)values["usedefaultcommandtimeoutforef"]; } + set { SetValue("usedefaultcommandtimeoutforef", value); } + } + #endregion + + /// + /// Gets or sets a connection option. + /// + /// The keyword that identifies the connection option to modify. + public override object this[string keyword] + { + get + { + MySqlConnectionStringOption opt = GetOption(keyword); + if (opt.ClassicGetter != null) + return opt.ClassicGetter(this, opt); + else if (opt.Getter != null) + return opt.Getter(this, opt); + else + throw new ArgumentException(Resources.KeywordNotSupported, keyword); + } + set + { + MySqlConnectionStringOption opt = GetOption(keyword); + if (opt.ClassicSetter != null) + opt.ClassicSetter(this, opt, value); + else if (opt.Setter != null) + opt.Setter(this, opt, value); + else + throw new ArgumentException(Resources.KeywordNotSupported, keyword); + } + } + + public override void Clear() + { + base.Clear(); + lock (this) + { + foreach (var option in Options.Options) + if (option.DefaultValue != null) + values[option.Keyword] = option.DefaultValue; + else + values[option.Keyword] = null; + } + } + + public override bool ContainsKey(string keyword) + { + MySqlConnectionStringOption option = Options.Get(keyword); + return option != null; + } + + public override bool Equals(object obj) + { + var other = obj as MySqlConnectionStringBuilder; + if (obj == null) + return false; + + if (this.values.Count != other.values.Count) return false; + + foreach (KeyValuePair kvp in this.values) + { + if (other.values.ContainsKey(kvp.Key)) + { + object v = other.values[kvp.Key]; + if (v == null && kvp.Value != null) return false; + if (kvp.Value == null && v != null) return false; + if (kvp.Value == null && v == null) return true; + if (!v.Equals(kvp.Value)) return false; + } + else + { + return false; + } + } + + return true; + } + + internal Regex GetBlobAsUTF8IncludeRegex() + { + if (String.IsNullOrEmpty(BlobAsUTF8IncludePattern)) return null; + return new Regex(BlobAsUTF8IncludePattern); + } + + internal Regex GetBlobAsUTF8ExcludeRegex() + { + if (String.IsNullOrEmpty(BlobAsUTF8ExcludePattern)) return null; + return new Regex(BlobAsUTF8ExcludePattern); + } + + internal override MySqlConnectionStringOption GetOption(string key) + { + MySqlConnectionStringOption option = Options.Get(key); + if (option == null) + throw new ArgumentException(Resources.KeywordNotSupported, key); + else + return option; + } + + public override bool Remove(string keyword) + { + bool removed = false; + lock (this) { removed = base.Remove(keyword); } + if (!removed) return false; + MySqlConnectionStringOption option = GetOption(keyword); + lock (this) + { + values[option.Keyword] = option.DefaultValue; + } + return true; + } + + internal override void SetInternalValue(string keyword, object value) + { + MySqlConnectionStringOption option = GetOption(keyword); + option.ValidateValue(ref value); + + // remove all related keywords + option.Clean(this); + + if (value != null) + { + lock (this) + { + // set value for the given keyword + values[option.Keyword] = value; + base[keyword] = value; + } + } + } + + /// + /// Retrieves the value corresponding to the supplied key from this . + /// + /// The key of the item to retrieve. + /// The value corresponding to the . + /// if was found within the connection string; + /// otherwise, . + /// contains a null value. + public override bool TryGetValue(string keyword, out object value) + { + if (keyword == null) throw new ArgumentNullException(keyword); + + MySqlConnectionStringOption option = Options.Get(keyword); + + value = option == null ? null : this[keyword]; + return option != null; + } + } +} diff --git a/MySQL.Data/src/MySqlDataReader.cs b/MySQL.Data/src/MySqlDataReader.cs new file mode 100644 index 000000000..380dd648a --- /dev/null +++ b/MySQL.Data/src/MySqlDataReader.cs @@ -0,0 +1,1519 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Types; +using System; +using System.Collections; +using System.Data; +using System.Data.Common; +using System.Globalization; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + /// + /// Provides a means of reading a forward-only stream of rows from a MySQL database. This class cannot be inherited. + /// + /// + /// + /// To create a , you must call the + /// method of the object, rather than directly using a constructor. + /// + /// + /// While the is in use, the associated + /// is busy serving the , and no other operations can be performed + /// on the other than closing it. This is the case until the + /// method of the is called. + /// + /// + /// and + /// are the only properties that you can call after the is + /// closed. Though the property may be accessed at any time + /// while the exists, always call before returning + /// the value of to ensure an accurate return value. + /// + /// + /// For optimal performance, avoids creating + /// unnecessary objects or making unnecessary copies of data. As a result, multiple calls + /// to methods such as return a reference to the + /// same object. Use caution if you are modifying the underlying value of the objects + /// returned by methods such as . + /// + /// + public sealed class MySqlDataReader : DbDataReader, IDataReader, IDataRecord, IDisposable + { + // The DataReader should always be open when returned to the user. + private bool _isOpen = true; + + internal long affectedRows; + internal Driver driver; + + // Used in special circumstances with stored procs to avoid exceptions from DbDataAdapter + // If set, AffectedRows returns -1 instead of 0. + private readonly bool _disableZeroAffectedRows; + + /* + * Keep track of the connection in order to implement the + * CommandBehavior.CloseConnection flag. A null reference means + * normal behavior (do not automatically close). + */ + private MySqlConnection _connection; + + /* + * Because the user should not be able to directly create a + * DataReader object, the constructors are + * marked as internal. + */ + internal MySqlDataReader(MySqlCommand cmd, PreparableStatement statement, CommandBehavior behavior) + { + this.Command = cmd; + _connection = Command.Connection; + CommandBehavior = behavior; + driver = _connection.driver; + affectedRows = -1; + this.Statement = statement; + + if (cmd.CommandType == CommandType.StoredProcedure && cmd.UpdatedRowSource == UpdateRowSource.FirstReturnedRecord) + _disableZeroAffectedRows = true; + } + + #region Properties + + internal PreparableStatement Statement { get; } + + internal MySqlCommand Command { get; private set; } + + internal ResultSet ResultSet { get; private set; } + + internal CommandBehavior CommandBehavior { get; private set; } + + /// + /// Gets the number of columns in the current row. + /// + /// The number of columns in the current row. + public override int FieldCount => ResultSet?.Size ?? 0; + + /// + /// Gets a value indicating whether the contains one or more rows. + /// + /// true if the contains one or more rows; otherwise false. + public override bool HasRows => ResultSet?.HasRows ?? false; + + /// + /// Gets a value indicating whether the data reader is closed. + /// + /// true if the is closed; otherwise false. + public override bool IsClosed => !_isOpen; + + /// + /// Gets the number of rows changed, inserted, or deleted by execution of the SQL statement. + /// + /// The number of rows changed, inserted, or deleted. + /// -1 for SELECT statements; 0 if no rows were affected or the statement failed. + public override int RecordsAffected + { + // RecordsAffected returns the number of rows affected in batch + // statments from insert/delete/update statments. This property + // is not completely accurate until .Close() has been called. + get + { + if (!_disableZeroAffectedRows) return (int)affectedRows; + // In special case of updating stored procedure called from + // within data adapter, we return -1 to avoid exceptions + // (s. Bug#54895) + if (affectedRows == 0) + return -1; + + return (int)affectedRows; + } + } + + /// + /// Overloaded. Gets the value of a column in its native format. + /// In C#, this property is the indexer for the class. + /// + /// The value of the specified column. + public override object this[int i] => GetValue(i); + + /// + /// Gets the value of a column in its native format. + /// [C#] In C#, this property is the indexer for the class. + /// + /// The value of the specified column. + public override object this[String name] => this[GetOrdinal(name)]; + + /// + /// Gets a value indicating the depth of nesting for the current row. This method is not + /// supported currently and always returns 0. + /// + /// The depth of nesting for the current row. + public override int Depth => 0; + + #endregion + + /// + /// Closes the object. + /// + public override void Close() => CloseAsync(false).GetAwaiter().GetResult(); + +#if NETSTANDARD2_1 || NET6_0_OR_GREATER + /// + /// Asynchronously closes the object. + /// + /// A task representing the asynchronous operation. + public override Task CloseAsync() => CloseAsync(true); +#endif + + internal async Task CloseAsync(bool execAsync) + { + if (!_isOpen) return; + + bool shouldCloseConnection = (CommandBehavior & CommandBehavior.CloseConnection) != 0; + CommandBehavior originalBehavior = CommandBehavior; + + // clear all remaining resultsets + try + { + // Temporarily change to Default behavior to allow NextResult to finish properly. + if (!originalBehavior.Equals(CommandBehavior.SchemaOnly)) + CommandBehavior = CommandBehavior.Default; + while (await NextResultAsync(execAsync, CancellationToken.None).ConfigureAwait(false)) { } + } + catch (MySqlException ex) + { + // Ignore aborted queries + if (!ex.IsQueryAborted) + { + // ignore IO exceptions. + // We are closing or disposing reader, and do not + // want exception to be propagated to used. If socket is + // is closed on the server side, next query will run into + // IO exception. If reader is closed by GC, we also would + // like to avoid any exception here. + bool isIOException = false; + for (Exception exception = ex; exception != null; + exception = exception.InnerException) + { + if (exception is IOException) + { + isIOException = true; + break; + } + } + if (!isIOException) + { + // Ordinary exception (neither IO nor query aborted) + throw; + } + } + } + catch (IOException) + { + // eat, on the same reason we eat IO exceptions wrapped into + // MySqlExceptions reasons, described above. + } + finally + { + // always ensure internal reader is null (Bug #55558) + _connection.Reader = null; + CommandBehavior = originalBehavior; + } + // we now give the command a chance to terminate. In the case of + // stored procedures it needs to update out and inout parameters + await Command.CloseAsync(this, execAsync).ConfigureAwait(false); + CommandBehavior = CommandBehavior.Default; + + if (this.Command.Canceled && _connection.driver.Version.isAtLeast(5, 1, 0)) + { + // Issue dummy command to clear kill flag + await ClearKillFlagAsync(execAsync).ConfigureAwait(false); + } + + if (shouldCloseConnection) + await _connection.CloseAsync().ConfigureAwait(false); + + Command = null; + _connection.IsInUse = false; + _connection = null; + _isOpen = false; + } + + #region TypeSafe Accessors + + /// + /// Gets the value of the specified column as a Boolean. + /// + /// The column name. + /// The value of the specified column. + public bool GetBoolean(string name) + { + return GetBoolean(GetOrdinal(name)); + } + + /// + /// Gets the value of the specified column as a Boolean. + /// + /// The zero-based column ordinal. + /// The value of the specified column. + public override bool GetBoolean(int i) + { + var asValue = GetValue(i); + int numericValue; + if (int.TryParse(asValue as string, out numericValue)) + return Convert.ToBoolean(numericValue); + return Convert.ToBoolean(asValue); + } + + /// + /// Gets the value of the specified column as a byte. + /// + /// The column name. + /// The value of the specified column. + public byte GetByte(string name) + { + return GetByte(GetOrdinal(name)); + } + + /// + /// Gets the value of the specified column as a byte. + /// + /// The zero-based column ordinal. + /// The value of the specified column. + public override byte GetByte(int i) + { + IMySqlValue v = GetFieldValue(i, false); + if (v is MySqlUByte) + return ((MySqlUByte)v).Value; + else + return checked((byte)((MySqlByte)v).Value); + } + + /// + /// Gets the value of the specified column as a sbyte. + /// + /// The column name. + /// The value of the specified column. + public sbyte GetSByte(string name) + { + return GetSByte(GetOrdinal(name)); + } + + /// + /// Gets the value of the specified column as a sbyte. + /// + /// The zero-based column ordinal. + /// The value of the specified column. + public sbyte GetSByte(int i) + { + IMySqlValue v = GetFieldValue(i, false); + if (v is MySqlByte) + return (sbyte)ChangeType(v, i, typeof(sbyte)); + else +#if !NET8_0_OR_GREATER + return checked(((MySqlByte)v).Value); +#else + return checked((sbyte)((MySqlUByte)v).Value); +#endif + } + + /// + /// Reads a stream of bytes from the specified column offset into the buffer an array starting at the given buffer offset. + /// + /// The zero-based column ordinal. + /// The index within the field from which to begin the read operation. + /// The buffer into which to read the stream of bytes. + /// The index for buffer to begin the read operation. + /// The maximum length to copy into the buffer. + /// The actual number of bytes read. + public override long GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length) + { + if (i >= FieldCount) + Throw(new IndexOutOfRangeException()); + + IMySqlValue val = GetFieldValue(i, false); + + if (!(val is MySqlBinary) && !(val is MySqlGuid)) + Throw(new MySqlException("GetBytes can only be called on binary or guid columns")); + + byte[] bytes = null; + if (val is MySqlBinary) + bytes = ((MySqlBinary)val).Value; + else + bytes = ((MySqlGuid)val).Bytes; + + if (buffer == null) + return bytes.Length; + + if (bufferoffset >= buffer.Length || bufferoffset < 0) + Throw(new IndexOutOfRangeException("Buffer index must be a valid index in buffer")); + if (buffer.Length < (bufferoffset + length)) + Throw(new ArgumentException("Buffer is not large enough to hold the requested data")); + if (fieldOffset < 0 || + ((ulong)fieldOffset >= (ulong)bytes.Length && (ulong)bytes.Length > 0)) + Throw(new IndexOutOfRangeException("Data index must be a valid index in the field")); + + // adjust the length so we don't run off the end + if ((ulong)bytes.Length < (ulong)(fieldOffset + length)) + { + length = (int)((ulong)bytes.Length - (ulong)fieldOffset); + } + + Buffer.BlockCopy(bytes, (int)fieldOffset, buffer, (int)bufferoffset, (int)length); + + return length; + } + + private object ChangeType(IMySqlValue value, int fieldIndex, Type newType) + { + ResultSet.Fields[fieldIndex].AddTypeConversion(newType); + return Convert.ChangeType(value.Value, newType, CultureInfo.InvariantCulture); + } + + /// + /// Gets the value of the specified column as a single character. + /// + /// The column name. + /// The value of the specified column. + public char GetChar(string name) + { + return GetChar(GetOrdinal(name)); + } + + /// + /// Gets the value of the specified column as a single character. + /// + /// The zero-based column ordinal. + /// The value of the specified column. + public override char GetChar(int i) + { + string s = GetString(i); + return s[0]; + } + + /// + /// Reads a stream of characters from the specified column offset into the buffer as an array starting at the given buffer offset. + /// + /// The zero-based column ordinal. + /// The index within the row from which to begin the read operation. + /// The buffer into which to copy the data. + /// The index with the buffer to which the data will be copied. + /// The maximum number of characters to read. + /// The actual number of characters read. + public override long GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length) + { + if (i >= FieldCount) + Throw(new IndexOutOfRangeException()); + + string valAsString = GetString(i); + + if (buffer == null) return valAsString.Length; + + if (bufferoffset >= buffer.Length || bufferoffset < 0) + Throw(new IndexOutOfRangeException("Buffer index must be a valid index in buffer")); + if (buffer.Length < (bufferoffset + length)) + Throw(new ArgumentException("Buffer is not large enough to hold the requested data")); + if (fieldoffset < 0 || fieldoffset >= valAsString.Length) + Throw(new IndexOutOfRangeException("Field offset must be a valid index in the field")); + + if (valAsString.Length < length) + length = valAsString.Length; + valAsString.CopyTo((int)fieldoffset, buffer, bufferoffset, length); + return length; + } + + /// + /// Gets the name of the source data type. + /// + /// The zero-based column ordinal. + /// A string representing the name of the data type. + public override String GetDataTypeName(int i) + { + if (!_isOpen) + Throw(new Exception("No current query in data reader")); + if (i >= FieldCount) + Throw(new IndexOutOfRangeException()); + + // return the name of the type used on the backend + IMySqlValue v = ResultSet.Values[i]; + return v.MySqlTypeName; + } + + /// + /// Gets the value of the specified column as a object. + /// + /// + /// No conversions are performed; therefore, the data retrieved must already be a object. + /// Call IsDBNull to check for null values before calling this method. + /// + /// The column name. + /// The value of the specified column. + public MySqlDateTime GetMySqlDateTime(string column) + { + return GetMySqlDateTime(GetOrdinal(column)); + } + + /// + /// Gets the value of the specified column as a object. + /// + /// + /// No conversions are performed; therefore, the data retrieved must already be a object. + /// Call IsDBNull to check for null values before calling this method. + /// + /// The zero-based column ordinal. + /// The value of the specified column. + public MySqlDateTime GetMySqlDateTime(int column) + { + return (MySqlDateTime)GetFieldValue(column, true); + } + + /// + /// Gets the value of the specified column as a object. + /// + /// + /// No conversions are performed; therefore, the data retrieved must already be a object. + /// Call to check for null values before calling this method. + /// + /// + /// MySql allows date columns to contain the value '0000-00-00' and datetime + /// columns to contain the value '0000-00-00 00:00:00'. The DateTime structure cannot contain + /// or represent these values. To read a datetime value from a column that might + /// contain zero values, use . + /// + /// + /// The behavior of reading a zero datetime column using this method is defined by the + /// ZeroDateTimeBehavior connection string option. For more information on this option, + /// please refer to . + /// + /// + /// + /// The column name. + /// The value of the specified column. + public DateTime GetDateTime(string column) + { + return GetDateTime(GetOrdinal(column)); + } + + /// + /// Gets the value of the specified column as a object. + /// + /// + /// No conversions are performed; therefore, the data retrieved must already be a object. + /// Call to check for null values before calling this method. + /// + /// + /// MySql allows date columns to contain the value '0000-00-00' and datetime + /// columns to contain the value '0000-00-00 00:00:00'. The DateTime structure cannot contain + /// or represent these values. To read a datetime value from a column that might + /// contain zero values, use . + /// + /// + /// The behavior of reading a zero datetime column using this method is defined by the + /// ZeroDateTimeBehavior connection string option. For more information on this option, + /// please refer to . + /// + /// + /// + /// The zero-based column ordinal. + /// The value of the specified column. + public override DateTime GetDateTime(int i) + { + IMySqlValue val = GetFieldValue(i, true); + MySqlDateTime dt; + + if (val is MySqlDateTime) + dt = (MySqlDateTime)val; + else + { + // we need to do this because functions like date_add return string + string s = GetString(i); + dt = MySqlDateTime.Parse(s); + } + + dt.TimezoneOffset = driver.timeZoneOffset; + if (_connection.Settings.ConvertZeroDateTime && !dt.IsValidDateTime) + return DateTime.MinValue; + else + return dt.GetDateTime(); + } + + /// + /// Gets the value of the specified column as a . + /// + /// The name of the colum. + /// The value of the specified column as a . + public MySqlDecimal GetMySqlDecimal(string column) + { + return GetMySqlDecimal(GetOrdinal(column)); + } + + /// + /// Gets the value of the specified column as a . + /// + /// The index of the colum. + /// The value of the specified column as a . + public MySqlDecimal GetMySqlDecimal(int i) + { + return (MySqlDecimal)GetFieldValue(i, false); + } + + /// + /// Gets the value of the specified column as a object. + /// + /// + /// No conversions are performed; therefore, the data retrieved must already be a object. + /// Call to check for null values before calling this method. + /// + /// The column name. + /// The value of the specified column. + public Decimal GetDecimal(string column) + { + return GetDecimal(GetOrdinal(column)); + } + + /// + /// Gets the value of the specified column as a object. + /// + /// + /// No conversions are performed; therefore, the data retrieved must already be a object. + /// Call to check for null values before calling this method. + /// + /// The zero-based column ordinal + /// The value of the specified column. + public override Decimal GetDecimal(int i) + { + IMySqlValue v = GetFieldValue(i, true); + if (v is MySqlDecimal) + return ((MySqlDecimal)v).Value; + return Convert.ToDecimal(v.Value); + } + + /// Gets the value of the specified column as a double-precision floating point number. + /// + /// No conversions are performed; therefore, the data retrieved must already be a object. + /// Call to check for null values before calling this method. + /// + /// The column name. + /// The value of the specified column. + public double GetDouble(string column) + { + return GetDouble(GetOrdinal(column)); + } + + /// Gets the value of the specified column as a double-precision floating point number. + /// + /// No conversions are performed; therefore, the data retrieved must already be a object. + /// Call to check for null values before calling this method. + /// + /// The zero-based column ordinal. + /// The value of the specified column. + public override double GetDouble(int i) + { + IMySqlValue v = GetFieldValue(i, true); + if (v is MySqlDouble) + return ((MySqlDouble)v).Value; + return Convert.ToDouble(v.Value); + } + + /// + /// Gets the Type that is the data type of the object. + /// + /// The column name. + /// The data type of the specified column. + public Type GetFieldType(string column) + { + return GetFieldType(GetOrdinal(column)); + } + + /// + /// Gets the Type that is the data type of the object. + /// + /// The zero-based column ordinal. + /// The data type of the specified column. + public override Type GetFieldType(int i) + { + if (!_isOpen) + Throw(new Exception("No current query in data reader")); + if (i >= FieldCount) + Throw(new IndexOutOfRangeException()); + + // we have to use the values array directly because we can't go through + // GetValue + IMySqlValue v = ResultSet.Values[i]; + if (v is MySqlDateTime) + { + if (!_connection.Settings.AllowZeroDateTime) + return typeof(DateTime); + return typeof(MySqlDateTime); + } + return v.SystemType; + } + + /// + /// Gets the value of the specified column as a single-precision floating point number. + /// + /// + /// No conversions are performed; therefore, the data retrieved must already be a object. + /// Call to check for null values before calling this method. + /// + /// The column name. + /// The value of the specified column. + public float GetFloat(string column) + { + return GetFloat(GetOrdinal(column)); + } + + /// + /// Gets the value of the specified column as a single-precision floating point number. + /// + /// + /// No conversions are performed; therefore, the data retrieved must already be a object. + /// Call to check for null values before calling this method. + /// + /// The zero-based column ordinal. + /// The value of the specified column. + public override float GetFloat(int i) + { + IMySqlValue v = GetFieldValue(i, true); + if (v is MySqlSingle) + return ((MySqlSingle)v).Value; + return Convert.ToSingle(v.Value); + } + + /// + /// Gets the body definition of a routine. + /// + /// The column name. + /// The definition of the routine. + public string GetBodyDefinition(string column) + { + var value = GetValue(GetOrdinal(column)); + if (value.GetType().FullName.Equals("System.Byte[]")) + { + return GetString(column); + } + else + { + return GetValue(GetOrdinal(column)).ToString(); + } + } + + /// + /// Gets the value of the specified column as a globally-unique identifier(GUID). + /// + /// The name of the column. + /// The value of the specified column. + public Guid GetGuid(string column) + { + return GetGuid(GetOrdinal(column)); + } + + /// + /// Gets the value of the specified column as a globally-unique identifier(GUID). + /// + /// The zero-based column ordinal. + /// The value of the specified column. + public override Guid GetGuid(int i) + { + object v = GetValue(i); + if (v is Guid) + return (Guid)v; + if (v is string) + return new Guid(v as string); + if (v is byte[]) + { + byte[] bytes = (byte[])v; + if (bytes.Length == 16) + return new Guid(bytes); + } + Throw(new MySqlException(Resources.ValueNotSupportedForGuid)); + return Guid.Empty; // just to silence compiler + } + + /// Gets the value of the specified column as a 16-bit signed integer. + /// + /// No conversions are performed; therefore, the data retrieved must already be a value. + /// Call to check for null values before calling this method. + /// + /// The column name. + /// The value of the specified column. + public Int16 GetInt16(string column) + { + return GetInt16(GetOrdinal(column)); + } + + /// Gets the value of the specified column as a 16-bit signed integer. + /// + /// No conversions are performed; therefore, the data retrieved must already be a value. + /// Call to check for null values before calling this method. + /// + /// The zero-based column ordinal. + /// The value of the specified column. + public override Int16 GetInt16(int i) + { + IMySqlValue v = GetFieldValue(i, true); + if (v is MySqlInt16) + return ((MySqlInt16)v).Value; + + return (short)ChangeType(v, i, typeof(short)); + } + + /// Gets the value of the specified column as a 32-bit signed integer. + /// + /// No conversions are performed; therefore, the data retrieved must already be a value. + /// Call to check for null values before calling this method. + /// + /// The column name. + /// The value of the specified column. + public Int32 GetInt32(string column) + { + return GetInt32(GetOrdinal(column)); + } + + /// Gets the value of the specified column as a 32-bit signed integer. + /// + /// No conversions are performed; therefore, the data retrieved must already be a value. + /// Call to check for null values before calling this method. + /// + /// The zero-based column ordinal. + /// The value of the specified column. + public override Int32 GetInt32(int i) + { + IMySqlValue v = GetFieldValue(i, true); + if (v is MySqlInt32) + return ((MySqlInt32)v).Value; + + return (Int32)ChangeType(v, i, typeof(Int32)); + } + + /// Gets the value of the specified column as a 64-bit signed integer. + /// + /// No conversions are performed; therefore, the data retrieved must already be a value. + /// Call to check for null values before calling this method. + /// + /// The column name. + /// The value of the specified column. + public Int64 GetInt64(string column) + { + return GetInt64(GetOrdinal(column)); + } + + /// Gets the value of the specified column as a 64-bit signed integer. + /// + /// No conversions are performed; therefore, the data retrieved must already be a value. + /// Call to check for null values before calling this method. + /// + /// The zero-based column ordinal. + /// The value of the specified column. + public override Int64 GetInt64(int i) + { + IMySqlValue v = GetFieldValue(i, true); + if (v is MySqlInt64) + return ((MySqlInt64)v).Value; + + return (Int64)ChangeType(v, i, typeof(Int64)); + } + + /// + /// Gets the name of the specified column. + /// + /// The zero-based column ordinal. + /// The name of the specified column. + public override String GetName(int i) + { + if (!_isOpen) + Throw(new Exception("No current query in data reader")); + if (i >= FieldCount) + Throw(new IndexOutOfRangeException()); + + return ResultSet.Fields[i].ColumnName; + } + + /// + /// Gets the column ordinal, given the name of the column. + /// + /// The name of the column. + /// The zero-based column ordinal. + public override int GetOrdinal(string name) + { + if (!_isOpen || ResultSet == null) + Throw(new Exception("No current query in data reader")); + + return ResultSet.GetOrdinal(name); + } + + /// + /// Gets a stream to retrieve data from the specified column. + /// + /// The zero-based column ordinal. + /// A stream + public override Stream GetStream(int i) + { + if (i >= FieldCount) + Throw(new IndexOutOfRangeException()); + + IMySqlValue val = GetFieldValue(i, false); + + if (!(val is MySqlBinary) && !(val is MySqlGuid)) + Throw(new MySqlException("GetStream can only be called on binary or guid columns")); + + byte[] bytes = new byte[0]; + if (val is MySqlBinary) + bytes = ((MySqlBinary)val).Value; + else + bytes = ((MySqlGuid)val).Bytes; + + return new MemoryStream(bytes, false); + } + + /// + /// Gets the value of the specified column as a object. + /// + /// + /// No conversions are performed; therefore, the data retrieved must already be a object. + /// Call to check for null values before calling this method. + /// + /// The column name. + /// The value of the specified column. + public string GetString(string column) + { + return GetString(GetOrdinal(column)); + } + + /// + /// Gets the value of the specified column as a object. + /// + /// + /// No conversions are performed; therefore, the data retrieved must already be a object. + /// Call to check for null values before calling this method. + /// + /// The zero-based column ordinal. + /// The value of the specified column. + public override String GetString(int i) + { + IMySqlValue val = GetFieldValue(i, true); + + return (string)val.Value; + } + + /// + /// Gets the value of the specified column as a object. + /// + /// + /// No conversions are performed; therefore, the data retrieved must already be a value. + /// Call to check for null values before calling this method. + /// + /// The column name. + /// The value of the specified column. + public TimeSpan GetTimeSpan(string column) + { + return GetTimeSpan(GetOrdinal(column)); + } + + /// + /// Gets the value of the specified column as a object. + /// + /// + /// No conversions are performed; therefore, the data retrieved must already be a value. + /// Call to check for null values before calling this method. + /// + /// The zero-based column ordinal. + /// The value of the specified column. + public TimeSpan GetTimeSpan(int column) + { + IMySqlValue val = GetFieldValue(column, true); + + MySqlTimeSpan ts = (MySqlTimeSpan)val; + return ts.Value; + } + + /// + /// Gets the value of the specified column in its native format. + /// + /// The zero-based column ordinal. + /// The value of the specified column. + public override object GetValue(int i) + { + if (!_isOpen) + Throw(new Exception("No current query in data reader")); + if (i >= FieldCount) + Throw(new IndexOutOfRangeException()); + + IMySqlValue val = GetFieldValue(i, false); + if (val.IsNull) + { + if (!(val.MySqlDbType == MySqlDbType.Time && val.Value.ToString() == "00:00:00")) + return DBNull.Value; + } + + // if the column is a date/time, then we return a MySqlDateTime + // so .ToString() will print '0000-00-00' correctly + if (val is MySqlDateTime) + { + MySqlDateTime dt = (MySqlDateTime)val; + if (!dt.IsValidDateTime && _connection.Settings.ConvertZeroDateTime) + return DateTime.MinValue; + else if (_connection.Settings.AllowZeroDateTime) + return val; + else + return dt.GetDateTime(); + } + + return val.Value; + } + + /// + /// Gets all attribute columns in the collection for the current row. + /// + /// An array of into which to copy the attribute columns. + /// The number of instances of in the array. + public override int GetValues(object[] values) + { + int numCols = Math.Min(values.Length, FieldCount); + for (int i = 0; i < numCols; i++) + values[i] = GetValue(i); + + return numCols; + } + + /// Gets the value of the specified column as a 16-bit unsigned integer. + /// + /// No conversions are performed; therefore, the data retrieved must already be a value. + /// Call to check for null values before calling this method. + /// + /// The column name. + /// The value of the specified column. + public UInt16 GetUInt16(string column) + { + return GetUInt16(GetOrdinal(column)); + } + + /// Gets the value of the specified column as a 16-bit unsigned integer. + /// + /// No conversions are performed; therefore, the data retrieved must already be a value. + /// Call to check for null values before calling this method. + /// + /// The zero-based column ordinal. + /// The value of the specified column. + public UInt16 GetUInt16(int column) + { + IMySqlValue v = GetFieldValue(column, true); + if (v is MySqlUInt16) + return ((MySqlUInt16)v).Value; + + return (UInt16)ChangeType(v, column, typeof(UInt16)); + } + + /// Gets the value of the specified column as a 32-bit unsigned integer. + /// + /// No conversions are performed; therefore, the data retrieved must already be a value. + /// Call to check for null values before calling this method. + /// + /// The column name. + /// The value of the specified column. + public UInt32 GetUInt32(string column) + { + return GetUInt32(GetOrdinal(column)); + } + + /// Gets the value of the specified column as a 32-bit unsigned integer. + /// + /// No conversions are performed; therefore, the data retrieved must already be a value. + /// Call to check for null values before calling this method. + /// + /// The zero-based column ordinal. + /// The value of the specified column. + public UInt32 GetUInt32(int column) + { + IMySqlValue v = GetFieldValue(column, true); + if (v is MySqlUInt32) + return ((MySqlUInt32)v).Value; + return (uint)ChangeType(v, column, typeof(UInt32)); + } + + /// Gets the value of the specified column as a 64-bit unsigned integer. + /// + /// No conversions are performed; therefore, the data retrieved must already be a value. + /// Call to check for null values before calling this method. + /// + /// The column name. + /// The value of the specified column. + public UInt64 GetUInt64(string column) + { + return GetUInt64(GetOrdinal(column)); + } + + /// Gets the value of the specified column as a 64-bit unsigned integer. + /// + /// No conversions are performed; therefore, the data retrieved must already be a value. + /// Call to check for null values before calling this method. + /// + /// The zero-based column ordinal. + /// The value of the specified column. + public UInt64 GetUInt64(int column) + { + IMySqlValue v = GetFieldValue(column, true); + if (v is MySqlUInt64) + return ((MySqlUInt64)v).Value; + + return (UInt64)ChangeType(v, column, typeof(UInt64)); + } + + #endregion + + /// + /// Returns a object for the requested column ordinal. + /// + /// The zero-based column ordinal. + /// A object. + IDataReader IDataRecord.GetData(int i) + { + return base.GetData(i); + } + + /// + /// Gets a value indicating whether the column contains non-existent or missing values. + /// + /// The zero-based column ordinal. + /// true if the specified column is equivalent to ; otherwise false. + public override bool IsDBNull(int i) + { + return DBNull.Value == GetValue(i); + } + + /// + /// Gets the value of the specified column as a . + /// + /// The index of the colum. + /// The value of the specified column as a . + public MySqlGeometry GetMySqlGeometry(int i) + { + try + { + IMySqlValue v = GetFieldValue(i, false); + if (v is MySqlGeometry || v is MySqlBinary) + return new MySqlGeometry(MySqlDbType.Geometry, (Byte[])v.Value); + } + catch + { + Throw(new Exception("Can't get MySqlGeometry from value")); + } + return new MySqlGeometry(true); + } + + /// + /// Gets the value of the specified column as a . + /// + /// The name of the colum. + /// The value of the specified column as a . + public MySqlGeometry GetMySqlGeometry(string column) + { + return GetMySqlGeometry(GetOrdinal(column)); + } + + /// + /// Returns an that iterates through the . + /// + /// An that can be used to iterate through the rows in the data reader. + public override IEnumerator GetEnumerator() + { + return new DbEnumerator(this, (CommandBehavior & CommandBehavior.CloseConnection) != 0); + } + + private IMySqlValue GetFieldValue(int index, bool checkNull) + { + if (index < 0 || index >= FieldCount) + Throw(new ArgumentException(Resources.InvalidColumnOrdinal)); + + IMySqlValue v = ResultSet[index]; + + if (!(v.MySqlDbType is MySqlDbType.Time && v.Value.ToString() == "00:00:00")) + { + if (checkNull && v.IsNull) + throw new System.Data.SqlTypes.SqlNullValueException(); + } + + return v; + } + + /// + /// Gets the value of the specified column as a type. + /// + /// Type. + /// The index of the column. + /// The value of the column. + public override T GetFieldValue(int ordinal) + { + if (typeof(T).Equals(typeof(Stream))) + return (T)(object)GetStream(ordinal); + if (typeof(T).Equals(typeof(sbyte))) + return (T)(object)GetSByte(ordinal); + if (typeof(T).Equals(typeof(byte))) + return (T)(object)GetByte(ordinal); + if (typeof(T).Equals(typeof(short))) + return (T)(object)GetInt16(ordinal); + if (typeof(T).Equals(typeof(ushort))) + return (T)(object)GetUInt16(ordinal); + if (typeof(T).Equals(typeof(int))) + return (T)(object)GetInt32(ordinal); + if (typeof(T).Equals(typeof(uint))) + return (T)(object)GetUInt32(ordinal); + if (typeof(T).Equals(typeof(long))) + return (T)(object)GetInt64(ordinal); + if (typeof(T).Equals(typeof(ulong))) + return (T)(object)GetUInt64(ordinal); + if (typeof(T).Equals(typeof(char))) + return (T)(object)GetChar(ordinal); + if (typeof(T).Equals(typeof(decimal))) + return (T)(object)GetDecimal(ordinal); + if (typeof(T).Equals(typeof(float))) + return (T)(object)GetFloat(ordinal); + if (typeof(T).Equals(typeof(double))) + return (T)(object)GetDouble(ordinal); + if (typeof(T).Equals(typeof(string))) + return (T)(object)GetString(ordinal); + if (typeof(T).Equals(typeof(Guid))) + return (T)(object)GetGuid(ordinal); + if (typeof(T).Equals(typeof(bool))) + return (T)(object)GetBoolean(ordinal); + if (typeof(T).Equals(typeof(DateTime))) + return (T)(object)GetDateTime(ordinal); + if (typeof(T).Equals(typeof(TimeSpan))) + return (T)(object)GetTimeSpan(ordinal); + if (typeof(T).Equals(typeof(MySqlGeometry))) + return (T)(object)GetMySqlGeometry(ordinal); + if (typeof(T).Equals(typeof(DateTimeOffset))) + { + var dtValue = new DateTime(); + var result = DateTime.TryParse(this.GetValue(ordinal).ToString(), out dtValue); + DateTime datetime = result ? dtValue : DateTime.MinValue; + return (T)Convert.ChangeType(new DateTimeOffset(datetime, TimeSpan.FromHours(0)), typeof(T)); + } + + return base.GetFieldValue(ordinal); + } + + /// + /// Describes the column metadata of the . + /// + /// A object. + public override DataTable GetSchemaTable() + { + // Only Results from SQL SELECT Queries + // get a DataTable for schema of the result + // otherwise, DataTable is null reference + if (FieldCount == 0) return null; + + DataTable dataTableSchema = new DataTable("SchemaTable"); + + dataTableSchema.Columns.Add("ColumnName", typeof(string)); + dataTableSchema.Columns.Add("ColumnOrdinal", typeof(int)); + dataTableSchema.Columns.Add("ColumnSize", typeof(int)); + dataTableSchema.Columns.Add("NumericPrecision", typeof(int)); + dataTableSchema.Columns.Add("NumericScale", typeof(int)); + dataTableSchema.Columns.Add("IsUnique", typeof(bool)); + dataTableSchema.Columns.Add("IsKey", typeof(bool)); + DataColumn dc = dataTableSchema.Columns["IsKey"]; + dc.AllowDBNull = true; // IsKey can have a DBNull + dataTableSchema.Columns.Add("BaseCatalogName", typeof(string)); + dataTableSchema.Columns.Add("BaseColumnName", typeof(string)); + dataTableSchema.Columns.Add("BaseSchemaName", typeof(string)); + dataTableSchema.Columns.Add("BaseTableName", typeof(string)); + dataTableSchema.Columns.Add("DataType", typeof(Type)); + dataTableSchema.Columns.Add("AllowDBNull", typeof(bool)); + dataTableSchema.Columns.Add("ProviderType", typeof(int)); + dataTableSchema.Columns.Add("IsAliased", typeof(bool)); + dataTableSchema.Columns.Add("IsExpression", typeof(bool)); + dataTableSchema.Columns.Add("IsIdentity", typeof(bool)); + dataTableSchema.Columns.Add("IsAutoIncrement", typeof(bool)); + dataTableSchema.Columns.Add("IsRowVersion", typeof(bool)); + dataTableSchema.Columns.Add("IsHidden", typeof(bool)); + dataTableSchema.Columns.Add("IsLong", typeof(bool)); + dataTableSchema.Columns.Add("IsReadOnly", typeof(bool)); + + int ord = 1; + for (int i = 0; i < FieldCount; i++) + { + MySqlField f = ResultSet.Fields[i]; + DataRow r = dataTableSchema.NewRow(); + r["ColumnName"] = f.ColumnName; + r["ColumnOrdinal"] = ord++; + r["ColumnSize"] = f.IsTextField ? f.ColumnLength / f.MaxLength : f.ColumnLength; + int prec = f.Precision; + int pscale = f.Scale; + if (prec != -1) + r["NumericPrecision"] = (short)prec; + if (pscale != -1) + r["NumericScale"] = (short)pscale; + r["DataType"] = GetFieldType(i); + r["ProviderType"] = (int)f.Type; + r["IsLong"] = f.IsBlob && (f.ColumnLength > 255 || f.ColumnLength == -1); + r["AllowDBNull"] = f.AllowsNull; + r["IsReadOnly"] = false; + r["IsRowVersion"] = false; + r["IsUnique"] = false; + r["IsKey"] = f.IsPrimaryKey; + r["IsAutoIncrement"] = f.IsAutoIncrement; + r["BaseSchemaName"] = f.DatabaseName; + r["BaseCatalogName"] = null; + r["BaseTableName"] = f.RealTableName; + r["BaseColumnName"] = f.OriginalColumnName; + + dataTableSchema.Rows.Add(r); + } + + return dataTableSchema; + } + + /// + /// Advances the data reader to the next result when reading the results of batch SQL statements. + /// + /// if there are more result sets; otherwise . + public override bool NextResult() => NextResultAsync(false, CancellationToken.None).GetAwaiter().GetResult(); + + public override Task NextResultAsync(CancellationToken cancellationToken) => NextResultAsync(true, cancellationToken); + + internal async Task NextResultAsync(bool execAsync, CancellationToken cancellationToken) + { + if (!_isOpen) + Throw(new MySqlException(Resources.NextResultIsClosed)); + + bool isCaching = Command.CommandType == CommandType.TableDirect && Command.EnableCaching && + (CommandBehavior & CommandBehavior.SequentialAccess) == 0; + + // this will clear out any unread data + if (ResultSet != null) + { + await ResultSet.CloseAsync(execAsync).ConfigureAwait(false); + if (isCaching) + TableCache.AddToCache(Command.CommandText, ResultSet); + } + + // single result means we only return a single resultset. If we have already + // returned one, then we return false + // TableDirect is basically a select * from a single table so it will generate + // a single result also + if (ResultSet != null && + ((CommandBehavior & CommandBehavior.SingleResult) != 0 || isCaching)) + return false; + + // next load up the next resultset if any + try + { + do + { + ResultSet = null; + // if we are table caching, then try to retrieve the resultSet from the cache + if (isCaching) + ResultSet = TableCache.RetrieveFromCache(Command.CommandText, Command.CacheAge); + + if (ResultSet == null) + { + ResultSet = await driver.NextResultAsync(Statement.StatementId, false, execAsync).ConfigureAwait(false); + + if (ResultSet == null) return false; + + if (ResultSet.IsOutputParameters && Command.CommandType == CommandType.StoredProcedure) + { + StoredProcedure sp = Statement as StoredProcedure; + sp.ProcessOutputParameters(this); + await ResultSet.CloseAsync(execAsync).ConfigureAwait(false); + + for (int i = 0; i < ResultSet.Fields.Length; i++) + { + if (ResultSet.Fields[i].ColumnName.StartsWith("@" + StoredProcedure.ParameterPrefix, StringComparison.OrdinalIgnoreCase)) + { + ResultSet = null; + break; + } + } + + if (!sp.ServerProvidingOutputParameters) return false; + // if we are using server side output parameters then we will get our ok packet + // *after* the output parameters resultset + ResultSet = await driver.NextResultAsync(Statement.StatementId, true, execAsync).ConfigureAwait(false); + } + else if (ResultSet.IsOutputParameters && Command.CommandType == CommandType.Text && !Command.IsPrepared && !Command.InternallyCreated) + { + Command.ProcessOutputParameters(this); + await ResultSet.CloseAsync(execAsync).ConfigureAwait(false); + + for (int i = 0; i < ResultSet.Fields.Length; i++) + { + if (ResultSet.Fields[i].ColumnName.StartsWith("@" + MySqlCommand.ParameterPrefix, StringComparison.OrdinalIgnoreCase)) + { + ResultSet = null; + break; + } + } + + if (!Statement.ServerProvidingOutputParameters) return false; + + ResultSet = await driver.NextResultAsync(Statement.StatementId, true, execAsync).ConfigureAwait(false); + } + ResultSet.Cached = isCaching; + } + + if (ResultSet.Size == 0) + { + if (Command.LastInsertedId == -1) Command.LastInsertedId = ResultSet.InsertedId; + else { + if (ResultSet.InsertedId > 0) Command.LastInsertedId = ResultSet.InsertedId; + } + + if (affectedRows == -1) + affectedRows = ResultSet.AffectedRows; + else + affectedRows += ResultSet.AffectedRows; + } + } while (ResultSet.Size == 0); + + return true; + } + catch (MySqlException ex) + { + if (ex.IsFatal) + await _connection.AbortAsync(execAsync, CancellationToken.None).ConfigureAwait(false); + if (ex.Number == 0) + throw new MySqlException(Resources.FatalErrorReadingResult, ex); + if ((CommandBehavior & CommandBehavior.CloseConnection) != 0) + await CloseAsync(execAsync).ConfigureAwait(false); + throw; + } + } + + /// + /// Advances the to the next record. + /// + /// true if there are more rows; otherwise false. + public override bool Read() => ReadAsync(false, CancellationToken.None).GetAwaiter().GetResult(); + + public override Task ReadAsync(CancellationToken cancellationToken) => ReadAsync(true, cancellationToken); + + internal async Task ReadAsync(bool execAsync, CancellationToken cancellationToken = default) + { + if (!_isOpen) + Throw(new MySqlException("Invalid attempt to Read when reader is closed.")); + if (ResultSet == null) + return false; + + try + { + return await ResultSet.NextRowAsync(CommandBehavior, execAsync).ConfigureAwait(false); + } + catch (TimeoutException tex) + { + await _connection.HandleTimeoutOrThreadAbortAsync(tex, execAsync, cancellationToken).ConfigureAwait(false); + throw; // unreached + } + catch (ThreadAbortException taex) + { + await _connection.HandleTimeoutOrThreadAbortAsync(taex, execAsync, cancellationToken).ConfigureAwait(false); + throw; + } + catch (MySqlException ex) + { + if (ex.IsFatal) + await _connection.AbortAsync(execAsync, cancellationToken).ConfigureAwait(false); + + if (ex.IsQueryAborted) + throw; + + throw new MySqlException(Resources.FatalErrorDuringRead, ex); + } + } + + private async Task ClearKillFlagAsync(bool execAsync) + { + // This query will silently crash because of the Kill call that happened before. + string dummyStatement = "SELECT * FROM bogus_table LIMIT 0"; /* dummy query used to clear kill flag */ + MySqlCommand dummyCommand = new MySqlCommand(dummyStatement, _connection) { InternallyCreated = true }; + + try + { + await dummyCommand.ExecuteReaderAsync(default, execAsync).ConfigureAwait(false); // ExecuteReader catches the exception and returns null, which is expected. + } + catch (MySqlException ex) + { + int[] errors = { (int)MySqlErrorCode.NoSuchTable, (int)MySqlErrorCode.TableAccessDenied, (int)MySqlErrorCode.UnknownTable }; + + if (Array.IndexOf(errors, (int)ex.Number) < 0) + throw; + } + } + + private void Throw(Exception ex) + { + _connection?.Throw(ex); + throw ex; + } + + /// + /// Releases all resources used by the current instance of the class. + /// +#if NETFRAMEWORK || NETSTANDARD2_0 + public Task DisposeAsync() => DisposeAsync(true); +#else + /// + /// Releases all resources used by the current instance of the class. + /// + public override ValueTask DisposeAsync() => DisposeAsync(true); +#endif + + protected override void Dispose(bool disposing) + { + try + { + if (disposing) + DisposeAsync(false).GetAwaiter().GetResult(); + } + finally + { + base.Dispose(disposing); + } + } + +#if NETFRAMEWORK || NETSTANDARD2_0 + internal async Task DisposeAsync(bool execAsync) +#else + internal async ValueTask DisposeAsync(bool execAsync) +#endif + { + await CloseAsync(execAsync).ConfigureAwait(false); + GC.SuppressFinalize(this); + } + + #region Destructor + ~MySqlDataReader() + { + Dispose(false); + } + #endregion + } +} diff --git a/Source/MySql.Data/MySqlError.cs b/MySQL.Data/src/MySqlError.cs similarity index 93% rename from Source/MySql.Data/MySqlError.cs rename to MySQL.Data/src/MySqlError.cs index 7b2ce91eb..518aa70b0 100644 --- a/Source/MySql.Data/MySqlError.cs +++ b/MySQL.Data/src/MySqlError.cs @@ -1,2001 +1,2010 @@ -// Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -namespace MySql.Data.MySqlClient -{ - /// - /// Collection of error codes that can be returned by the server - /// - public class MySqlError - { - /// - /// - /// - /// - public MySqlError(string level, int code, string message) - { - this.Level = level; - this.Code = code; - this.Message = message; - } - - /// - /// Error level - /// - public string Level { get; } - - /// - /// Error code - /// - public int Code { get; } - - /// - /// Error message - /// - public string Message { get; } - }; - - /// - /// Provides a reference to error codes returned by MySQL. - /// - public enum MySqlErrorCode - { - None = 0, - /// - ///ER_HASHCHK - HashCheck = 1000, - /// - ///ER_NISAMCHK - ISAMCheck = 1001, - /// - ///ER_NO - No = 1002, - /// - ///ER_YES - Yes = 1003, - ///The file couldn't be created. - ///ER_CANT_CREATE_FILE - CannotCreateFile = 1004, - ///The table couldn't be created. - ///ER_CANT_CREATE_TABLE - CannotCreateTable = 1005, - ///The database couldn't be created. - ///ER_CANT_CREATE_DB - CannotCreateDatabase = 1006, - ///The database couldn't be created, it already exists. - ///ER_DB_CREATE_EXISTS - DatabaseCreateExists = 1007, - ///The database couldn't be dropped, it doesn't exist. - ///ER_DB_DROP_EXISTS - DatabaseDropExists = 1008, - ///The database couldn't be dropped, the file can't be deleted. - ///ER_DB_DROP_DELETE - DatabaseDropDelete = 1009, - ///The database couldn't be dropped, the directory can't be deleted. - ///ER_DB_DROP_RMDIR - DatabaseDropRemoveDir = 1010, - ///The file couldn't be deleted. - ///ER_CANT_DELETE_FILE - CannotDeleteFile = 1011, - ///The record couldn't be read from the system table. - ///ER_CANT_FIND_SYSTEM_REC - CannotFindSystemRecord = 1012, - ///The status couldn't be retrieved. - ///ER_CANT_GET_STAT - CannotGetStatus = 1013, - ///The working directory couldn't be retrieved. - ///ER_CANT_GET_WD - CannotGetWorkingDirectory = 1014, - ///The file couldn't be locked. - ///ER_CANT_LOCK - CannotLock = 1015, - ///The file couldn't be opened. - ///ER_CANT_OPEN_FILE - CannotOpenFile = 1016, - ///The file couldn't be found. - ///ER_FILE_NOT_FOUND - FileNotFound = 1017, - ///The directory couldn't be read. - ///ER_CANT_READ_DIR - CannotReadDirectory = 1018, - ///The working directory couldn't be entered. - ///ER_CANT_SET_WD - CannotSetWorkingDirectory = 1019, - ///The record changed since it was last read. - ///ER_CHECKREAD - CheckRead = 1020, - ///The disk is full. - ///ER_DISK_FULL - DiskFull = 1021, - /// - /// There is already a key with the given values. - /// - DuplicateKey = 1022, - ///An error occurred when closing the file. - ///ER_ERROR_ON_CLOSE - ErrorOnClose = 1023, - ///An error occurred when reading from the file. - ///ER_ERROR_ON_READ - ErrorOnRead = 1024, - ///An error occurred when renaming then file. - ///ER_ERROR_ON_RENAME - ErrorOnRename = 1025, - ///An error occurred when writing to the file. - ///ER_ERROR_ON_WRITE - ErrorOnWrite = 1026, - ///The file is in use. - ///ER_FILE_USED - FileUsed = 1027, - ///Sorting has been aborted. - ///ER_FILSORT_ABORT - FileSortAborted = 1028, - ///The view doesn't exist. - ///ER_FORM_NOT_FOUND - FormNotFound = 1029, - ///Got the specified error from the table storage engine. - ///ER_GET_ERRNO - GetErrorNumber = 1030, - ///The table storage engine doesn't support the specified option. - ///ER_ILLEGAL_HA - IllegalHA = 1031, - /// - /// The specified key was not found. - /// - KeyNotFound = 1032, - ///The file contains incorrect information. - ///ER_NOT_FORM_FILE - NotFormFile = 1033, - ///The key file is incorrect for the table, it should be repaired. - ///ER_NOT_KEYFILE - NotKeyFile = 1034, - ///The key file is old for the table, it should be repaired. - ///ER_OLD_KEYFILE - OldKeyFile = 1035, - ///The table is read-only - ///ER_OPEN_AS_READONLY - OpenAsReadOnly = 1036, - ///The server is out of memory, it should be restarted. - ///ER_OUTOFMEMORY - OutOfMemory = 1037, - ///The server is out of sort-memory, the sort buffer size should be increased. - ///ER_OUT_OF_SORTMEMORY - OutOfSortMemory = 1038, - ///An unexpected EOF was found when reading from the file. - ///ER_UNEXPECTED_EOF - UnexepectedEOF = 1039, - ///Too many connections are open. - ///ER_CON_COUNT_ERROR - ConnectionCountError = 1040, - ///The server is out of resources, check if MySql or some other process is using all available memory. - ///ER_OUT_OF_RESOURCES - OutOfResources = 1041, - /// - /// Given when the connection is unable to successfully connect to host. - /// - UnableToConnectToHost = 1042, - ///The handshake was invalid. - ///ER_HANDSHAKE_ERROR - HandshakeError = 1043, - ///Access was denied for the specified user using the specified database. - ///ER_DBACCESS_DENIED_ERROR - DatabaseAccessDenied = 1044, - /// - /// Normally returned when an incorrect password is given - /// - AccessDenied = 1045, - ///No database has been selected. - ///ER_NO_DB_ERROR - NoDatabaseSelected = 1046, - ///The command is unknown. - ///ER_UNKNOWN_COM_ERROR - UnknownCommand = 1047, - ///The specified column cannot be NULL. - ///ER_BAD_NULL_ERROR - ColumnCannotBeNull = 1048, - /// The specified database is not known. - UnknownDatabase = 1049, - ///The specified table already exists. - ///ER_TABLE_EXISTS_ERROR - TableExists = 1050, - ///The specified table is unknown. - ///ER_BAD_TABLE_ERROR - BadTable = 1051, - ///The specified column is ambiguous. - ///ER_NON_UNIQ_ERROR - NonUnique = 1052, - ///The server is currently being shutdown. - ///ER_SERVER_SHUTDOWN - ServerShutdown = 1053, - ///The specified columns is unknown. - ///ER_BAD_FIELD_ERROR - BadFieldError = 1054, - ///The specified column isn't in GROUP BY. - ///ER_WRONG_FIELD_WITH_GROUP - WrongFieldWithGroup = 1055, - ///The specified columns cannot be grouped on. - ///ER_WRONG_GROUP_FIELD - WrongGroupField = 1056, - ///There are sum functions and columns in the same statement. - ///ER_WRONG_SUM_SELECT - WrongSumSelected = 1057, - ///The column count doesn't match the value count. - ///ER_WRONG_VALUE_COUNT - WrongValueCount = 1058, - ///The identifier name is too long. - ///ER_TOO_LONG_IDENT - TooLongIdentifier = 1059, - ///The column name is duplicated. - ///ER_DUP_FIELDNAME - DuplicateFieldName = 1060, - /// - /// Duplicate Key Name - /// - DuplicateKeyName = 1061, - /// - /// Duplicate Key Entry - /// - DuplicateKeyEntry = 1062, - ///The column specifier is incorrect. - ///ER_WRONG_FIELD_SPEC - WrongFieldSpecifier = 1063, - ///An error occurred when parsing the statement. - ///ER_PARSE_ERROR - ParseError = 1064, - ///The statement is empty. - ///ER_EMPTY_QUERY - EmptyQuery = 1065, - ///The table alias isn't unique. - ///ER_NONUNIQ_TABLE - NonUniqueTable = 1066, - ///The default value is invalid for the specified field. - ///ER_INVALID_DEFAULT - InvalidDefault = 1067, - ///The table has multiple primary keys defined. - ///ER_MULTIPLE_PRI_KEY - MultiplePrimaryKey = 1068, - ///Too many keys were defined for the table. - ///ER_TOO_MANY_KEYS - TooManyKeys = 1069, - ///Too many parts to the keys were defined for the table. - ///ER_TOO_MANY_KEY_PARTS - TooManyKeysParts = 1070, - ///The specified key is too long - ///ER_TOO_LONG_KEY - TooLongKey = 1071, - ///The specified key column doesn't exist in the table. - ///ER_KEY_COLUMN_DOES_NOT_EXITS - KeyColumnDoesNotExist = 1072, - ///The BLOB column was used as a key, this can't be done. - ///ER_BLOB_USED_AS_KEY - BlobUsedAsKey = 1073, - ///The column length is too big for the specified column type. - ///ER_TOO_BIG_FIELDLENGTH - TooBigFieldLength = 1074, - ///There can only be one auto-column, and it must be defined as a PK. - ///ER_WRONG_AUTO_KEY - WrongAutoKey = 1075, - ///The server is ready to accept connections. - ///ER_READY - Ready = 1076, - /// - ///ER_NORMAL_SHUTDOWN - NormalShutdown = 1077, - ///The server received the specified signal and is aborting. - ///ER_GOT_SIGNAL - GotSignal = 1078, - ///The server shutdown is complete. - ///ER_SHUTDOWN_COMPLETE - ShutdownComplete = 1079, - ///The server is forcing close of the specified thread. - ///ER_FORCING_CLOSE - ForcingClose = 1080, - ///An error occurred when creating the IP socket. - ///ER_IPSOCK_ERROR - IPSocketError = 1081, - ///The table has no index like the one used in CREATE INDEX. - ///ER_NO_SUCH_INDEX - NoSuchIndex = 1082, - ///The field separator argument is not what is expected, check the manual. - ///ER_WRONG_FIELD_TERMINATORS - WrongFieldTerminators = 1083, - ///The BLOB columns must terminated, fixed row lengths cannot be used. - ///ER_BLOBS_AND_NO_TERMINATED - BlobsAndNoTerminated = 1084, - ///The text file cannot be read. - ///ER_TEXTFILE_NOT_READABLE - TextFileNotReadable = 1085, - ///The specified file already exists. - ///ER_FILE_EXISTS_ERROR - FileExists = 1086, - ///Information returned by the LOAD statement. - ///ER_LOAD_INFO - LoadInfo = 1087, - ///Information returned by an UPDATE statement. - ///ER_ALTER_INFO - AlterInfo = 1088, - ///The prefix key is incorrect. - ///ER_WRONG_SUB_KEY - WrongSubKey = 1089, - ///All columns cannot be removed from a table, use DROP TABLE instead. - ///ER_CANT_REMOVE_ALL_FIELDS - CannotRemoveAllFields = 1090, - ///Cannot DROP, check that the column or key exists. - ///ER_CANT_DROP_FIELD_OR_KEY - CannotDropFieldOrKey = 1091, - ///Information returned by an INSERT statement. - ///ER_INSERT_INFO - InsertInfo = 1092, - ///The target table cannot be specified for update in FROM clause. - ///ER_UPDATE_TABLE_USED - UpdateTableUsed = 1093, - ///The specified thread ID is unknown. - ///ER_NO_SUCH_THREAD - NoSuchThread = 1094, - ///The thread cannot be killed, the current user is not the owner. - ///ER_KILL_DENIED_ERROR - KillDenied = 1095, - ///No tables used in the statement. - ///ER_NO_TABLES_USED - NoTablesUsed = 1096, - ///Too many string have been used for the specified column and SET. - ///ER_TOO_BIG_SET - TooBigSet = 1097, - ///A unique filename couldn't be generated. - ///ER_NO_UNIQUE_LOGFILE - NoUniqueLogFile = 1098, - ///The specified table was locked with a READ lock, and can't be updated. - ///ER_TABLE_NOT_LOCKED_FOR_WRITE - TableNotLockedForWrite = 1099, - ///The specified table was not locked with LOCK TABLES. - ///ER_TABLE_NOT_LOCKED - TableNotLocked = 1100, - ///BLOB and Text columns cannot have a default value. - ///ER_BLOB_CANT_HAVE_DEFAULT - BlobCannotHaveDefault = 1101, - ///The specified database name is incorrect. - ///ER_WRONG_DB_NAME - WrongDatabaseName = 1102, - ///The specified table name is incorrect. - ///ER_WRONG_TABLE_NAME - WrongTableName = 1103, - ///The SELECT command would examine more than MAX_JOIN_SIZE rows, check the WHERE clause and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is ok. - ///ER_TOO_BIG_SELECT - TooBigSelect = 1104, - ///An unknown error occurred. - ///ER_UNKNOWN_ERROR - UnknownError = 1105, - ///The specified procedure is unknown. - ///ER_UNKNOWN_PROCEDURE - UnknownProcedure = 1106, - ///The number of parameters provided for the specified procedure is incorrect. - ///ER_WRONG_PARAMCOUNT_TO_PROCEDURE - WrongParameterCountToProcedure = 1107, - ///The parameters provided for the specified procedure are incorrect. - ///ER_WRONG_PARAMETERS_TO_PROCEDURE - WrongParametersToProcedure = 1108, - ///The specified table is unknown. - ///ER_UNKNOWN_TABLE - UnknownTable = 1109, - ///The specified column has been specified twice. - ///ER_FIELD_SPECIFIED_TWICE - FieldSpecifiedTwice = 1110, - ///The group function has been incorrectly used. - ///ER_INVALID_GROUP_FUNC_USE - InvalidGroupFunctionUse = 1111, - ///The specified table uses an extension that doesn't exist in this MySQL version. - ///ER_UNSUPPORTED_EXTENSION - UnsupportedExtenstion = 1112, - ///The table must have at least one column. - ///ER_TABLE_MUST_HAVE_COLUMNS - TableMustHaveColumns = 1113, - ///The specified table is full. - ///ER_RECORD_FILE_FULL - RecordFileFull = 1114, - ///The specified character set is unknown. - ///ER_UNKNOWN_CHARACTER_SET - UnknownCharacterSet = 1115, - ///Too many tables, MySQL can only use the specified number of tables in a JOIN. - ///ER_TOO_MANY_TABLES - TooManyTables = 1116, - ///Too many columns - ///ER_TOO_MANY_FIELDS - TooManyFields = 1117, - ///The row size is too large, the maximum row size for the used tables (not counting BLOBS) is specified, change some columns or BLOBS. - ///ER_TOO_BIG_ROWSIZE - TooBigRowSize = 1118, - ///A thread stack overrun occurred. Stack statistics are specified. - ///ER_STACK_OVERRUN - StackOverrun = 1119, - ///A cross dependency was found in the OUTER JOIN, examine the ON conditions. - ///ER_WRONG_OUTER_JOIN - WrongOuterJoin = 1120, - ///The table handler doesn't support NULL in the given index, change specified column to be NOT NULL or use another handler. - ///ER_NULL_COLUMN_IN_INDEX - NullColumnInIndex = 1121, - ///The specified user defined function cannot be loaded. - ///ER_CANT_FIND_UDF - CannotFindUDF = 1122, - ///The specified user defined function cannot be initialised. - ///ER_CANT_INITIALIZE_UDF - CannotInitializeUDF = 1123, - ///No paths are allowed for the shared library. - ///ER_UDF_NO_PATHS - UDFNoPaths = 1124, - ///The specified user defined function already exists. - ///ER_UDF_EXISTS - UDFExists = 1125, - ///The specified shared library cannot be opened. - ///ER_CANT_OPEN_LIBRARY - CannotOpenLibrary = 1126, - ///The specified symbol cannot be found in the library. - ///ER_CANT_FIND_DL_ENTRY - CannotFindDLEntry = 1127, - ///The specified function is not defined. - ///ER_FUNCTION_NOT_DEFINED - FunctionNotDefined = 1128, - ///The specified host is blocked because of too many connection errors, unblock with 'mysqladmin flush-hosts'. - ///ER_HOST_IS_BLOCKED - HostIsBlocked = 1129, - /// - /// The given host is not allowed to connect - /// - HostNotPrivileged = 1130, - /// - /// The anonymous user is not allowed to connect - /// - AnonymousUser = 1131, - /// - /// The given password is not allowed - /// - PasswordNotAllowed = 1132, - /// - /// The given password does not match - /// - PasswordNoMatch = 1133, - ///Information returned by an UPDATE statement. - ///ER_UPDATE_INFO - UpdateInfo = 1134, - ///A new thread couldn't be created. - ///ER_CANT_CREATE_THREAD - CannotCreateThread = 1135, - ///The column count doesn't match the value count. - ///ER_WRONG_VALUE_COUNT_ON_ROW - WrongValueCountOnRow = 1136, - ///The specified table can't be re-opened. - ///ER_CANT_REOPEN_TABLE - CannotReopenTable = 1137, - ///The NULL value has been used incorrectly. - ///ER_INVALID_USE_OF_NULL - InvalidUseOfNull = 1138, - ///The regular expression contains an error. - ///ER_REGEXP_ERROR - RegExpError = 1139, - ///GROUP columns (MIN(), MAX(), COUNT(), ...) cannot be mixes with no GROUP columns if there is not GROUP BY clause. - ///ER_MIX_OF_GROUP_FUNC_AND_FIELDS - MixOfGroupFunctionAndFields = 1140, - /// - ///ER_NONEXISTING_GRANT - NonExistingGrant = 1141, - /// - ///ER_TABLEACCESS_DENIED_ERROR - TableAccessDenied = 1142, - /// - ///ER_COLUMNACCESS_DENIED_ERROR - ColumnAccessDenied = 1143, - /// - ///ER_ILLEGAL_GRANT_FOR_TABLE - IllegalGrantForTable = 1144, - /// - ///ER_GRANT_WRONG_HOST_OR_USER - GrantWrongHostOrUser = 1145, - /// - ///ER_NO_SUCH_TABLE - NoSuchTable = 1146, - /// - ///ER_NONEXISTING_TABLE_GRANT - NonExistingTableGrant = 1147, - /// - ///ER_NOT_ALLOWED_COMMAND - NotAllowedCommand = 1148, - /// - ///ER_SYNTAX_ERROR - SyntaxError = 1149, - /// - ///ER_DELAYED_CANT_CHANGE_LOCK - DelayedCannotChangeLock = 1150, - /// - ///ER_TOO_MANY_DELAYED_THREADS - TooManyDelayedThreads = 1151, - /// - ///ER_ABORTING_CONNECTION - AbortingConnection = 1152, - /// - /// An attempt was made to send or receive a packet larger than - /// max_allowed_packet_size - /// - PacketTooLarge = 1153, - /// - ///ER_NET_READ_ERROR_FROM_PIPE - NetReadErrorFromPipe = 1154, - /// - ///ER_NET_FCNTL_ERROR - NetFCntlError = 1155, - /// - ///ER_NET_PACKETS_OUT_OF_ORDER - NetPacketsOutOfOrder = 1156, - /// - ///ER_NET_UNCOMPRESS_ERROR - NetUncompressError = 1157, - /// - ///ER_NET_READ_ERROR - NetReadError = 1158, - /// - ///ER_NET_READ_INTERRUPTED - NetReadInterrupted = 1159, - /// - ///ER_NET_ERROR_ON_WRITE - NetErrorOnWrite = 1160, - /// - ///ER_NET_WRITE_INTERRUPTED - NetWriteInterrupted = 1161, - /// - ///ER_TOO_LONG_STRING - TooLongString = 1162, - /// - ///ER_TABLE_CANT_HANDLE_BLOB - TableCannotHandleBlob = 1163, - /// - ///ER_TABLE_CANT_HANDLE_AUTO_INCREMENT - TableCannotHandleAutoIncrement = 1164, - /// - ///ER_DELAYED_INSERT_TABLE_LOCKED - DelayedInsertTableLocked = 1165, - /// - ///ER_WRONG_COLUMN_NAME - WrongColumnName = 1166, - /// - ///ER_WRONG_KEY_COLUMN - WrongKeyColumn = 1167, - /// - ///ER_WRONG_MRG_TABLE - WrongMergeTable = 1168, - /// - ///ER_DUP_UNIQUE - DuplicateUnique = 1169, - /// - ///ER_BLOB_KEY_WITHOUT_LENGTH - BlobKeyWithoutLength = 1170, - /// - ///ER_PRIMARY_CANT_HAVE_NULL - PrimaryCannotHaveNull = 1171, - /// - ///ER_TOO_MANY_ROWS - TooManyRows = 1172, - /// - ///ER_REQUIRES_PRIMARY_KEY - RequiresPrimaryKey = 1173, - /// - ///ER_NO_RAID_COMPILED - NoRAIDCompiled = 1174, - /// - ///ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE - UpdateWithoutKeysInSafeMode = 1175, - /// - ///ER_KEY_DOES_NOT_EXITS - KeyDoesNotExist = 1176, - /// - ///ER_CHECK_NO_SUCH_TABLE - CheckNoSuchTable = 1177, - /// - ///ER_CHECK_NOT_IMPLEMENTED - CheckNotImplemented = 1178, - /// - ///ER_CANT_DO_THIS_DURING_AN_TRANSACTION - CannotDoThisDuringATransaction = 1179, - /// - ///ER_ERROR_DURING_COMMIT - ErrorDuringCommit = 1180, - /// - ///ER_ERROR_DURING_ROLLBACK - ErrorDuringRollback = 1181, - /// - ///ER_ERROR_DURING_FLUSH_LOGS - ErrorDuringFlushLogs = 1182, - /// - ///ER_ERROR_DURING_CHECKPOINT - ErrorDuringCheckpoint = 1183, - /// - ///ER_NEW_ABORTING_CONNECTION - NewAbortingConnection = 1184, - /// - ///ER_DUMP_NOT_IMPLEMENTED - DumpNotImplemented = 1185, - /// - ///ER_FLUSH_MASTER_BINLOG_CLOSED - FlushMasterBinLogClosed = 1186, - /// - ///ER_INDEX_REBUILD - IndexRebuild = 1187, - /// - ///ER_MASTER - MasterError = 1188, - /// - ///ER_MASTER_NET_READ - MasterNetRead = 1189, - /// - ///ER_MASTER_NET_WRITE - MasterNetWrite = 1190, - /// - ///ER_FT_MATCHING_KEY_NOT_FOUND - FullTextMatchingKeyNotFound = 1191, - /// - ///ER_LOCK_OR_ACTIVE_TRANSACTION - LockOrActiveTransaction = 1192, - /// - ///ER_UNKNOWN_SYSTEM_VARIABLE - UnknownSystemVariable = 1193, - /// - ///ER_CRASHED_ON_USAGE - CrashedOnUsage = 1194, - /// - ///ER_CRASHED_ON_REPAIR - CrashedOnRepair = 1195, - /// - ///ER_WARNING_NOT_COMPLETE_ROLLBACK - WarningNotCompleteRollback = 1196, - /// - ///ER_TRANS_CACHE_FULL - TransactionCacheFull = 1197, - /// - ///ER_SLAVE_MUST_STOP - SlaveMustStop = 1198, - /// - ///ER_SLAVE_NOT_RUNNING - SlaveNotRunning = 1199, - /// - ///ER_BAD_SLAVE - BadSlave = 1200, - /// - ///ER_MASTER_INFO - MasterInfo = 1201, - /// - ///ER_SLAVE_THREAD - SlaveThread = 1202, - /// - ///ER_TOO_MANY_USER_CONNECTIONS - TooManyUserConnections = 1203, - /// - ///ER_SET_CONSTANTS_ONLY - SetConstantsOnly = 1204, - /// - ///ER_LOCK_WAIT_TIMEOUT - LockWaitTimeout = 1205, - /// - ///ER_LOCK_TABLE_FULL - LockTableFull = 1206, - /// - ///ER_READ_ONLY_TRANSACTION - ReadOnlyTransaction = 1207, - /// - ///ER_DROP_DB_WITH_READ_LOCK - DropDatabaseWithReadLock = 1208, - /// - ///ER_CREATE_DB_WITH_READ_LOCK - CreateDatabaseWithReadLock = 1209, - /// - ///ER_WRONG_ARGUMENTS - WrongArguments = 1210, - /// - ///ER_NO_PERMISSION_TO_CREATE_USER - NoPermissionToCreateUser = 1211, - /// - ///ER_UNION_TABLES_IN_DIFFERENT_DIR - UnionTablesInDifferentDirectory = 1212, - /// - ///ER_LOCK_DEADLOCK - LockDeadlock = 1213, - /// - ///ER_TABLE_CANT_HANDLE_FT - TableCannotHandleFullText = 1214, - /// - ///ER_CANNOT_ADD_FOREIGN - CannotAddForeignConstraint = 1215, - /// - ///ER_NO_REFERENCED_ROW - NoReferencedRow = 1216, - /// - ///ER_ROW_IS_REFERENCED - RowIsReferenced = 1217, - /// - ///ER_CONNECT_TO_MASTER - ConnectToMaster = 1218, - /// - ///ER_QUERY_ON_MASTER - QueryOnMaster = 1219, - /// - ///ER_ERROR_WHEN_EXECUTING_COMMAND - ErrorWhenExecutingCommand = 1220, - /// - ///ER_WRONG_USAGE - WrongUsage = 1221, - /// - ///ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT - WrongNumberOfColumnsInSelect = 1222, - /// - ///ER_CANT_UPDATE_WITH_READLOCK - CannotUpdateWithReadLock = 1223, - /// - ///ER_MIXING_NOT_ALLOWED - MixingNotAllowed = 1224, - /// - ///ER_DUP_ARGUMENT - DuplicateArgument = 1225, - /// - ///ER_USER_LIMIT_REACHED - UserLimitReached = 1226, - /// - ///ER_SPECIFIC_ACCESS_DENIED_ERROR - SpecifiedAccessDeniedError = 1227, - /// - ///ER_LOCAL_VARIABLE - LocalVariableError = 1228, - /// - ///ER_GLOBAL_VARIABLE - GlobalVariableError = 1229, - /// - ///ER_NO_DEFAULT - NotDefaultError = 1230, - /// - ///ER_WRONG_VALUE_FOR_VAR - WrongValueForVariable = 1231, - /// - ///ER_WRONG_TYPE_FOR_VAR - WrongTypeForVariable = 1232, - /// - ///ER_VAR_CANT_BE_READ - VariableCannotBeRead = 1233, - /// - ///ER_CANT_USE_OPTION_HERE - CannotUseOptionHere = 1234, - /// - ///ER_NOT_SUPPORTED_YET - NotSupportedYet = 1235, - /// - ///ER_MASTER_FATAL_ERROR_READING_BINLOG - MasterFatalErrorReadingBinLog = 1236, - /// - ///ER_SLAVE_IGNORED_TABLE - SlaveIgnoredTable = 1237, - /// - ///ER_INCORRECT_GLOBAL_LOCAL_VAR - IncorrectGlobalLocalVariable = 1238, - /// - ///ER_WRONG_FK_DEF - WrongForeignKeyDefinition = 1239, - /// - ///ER_KEY_REF_DO_NOT_MATCH_TABLE_REF - KeyReferenceDoesNotMatchTableReference = 1240, - /// - ///ER_OPERAND_COLUMNS - OpearnColumnsError = 1241, - /// - ///ER_SUBQUERY_NO_1_ROW - SubQueryNoOneRow = 1242, - /// - ///ER_UNKNOWN_STMT_HANDLER - UnknownStatementHandler = 1243, - /// - ///ER_CORRUPT_HELP_DB - CorruptHelpDatabase = 1244, - /// - ///ER_CYCLIC_REFERENCE - CyclicReference = 1245, - /// - ///ER_AUTO_CONVERT - AutoConvert = 1246, - /// - ///ER_ILLEGAL_REFERENCE - IllegalReference = 1247, - /// - ///ER_DERIVED_MUST_HAVE_ALIAS - DerivedMustHaveAlias = 1248, - /// - ///ER_SELECT_REDUCED - SelectReduced = 1249, - /// - ///ER_TABLENAME_NOT_ALLOWED_HERE - TableNameNotAllowedHere = 1250, - /// - ///ER_NOT_SUPPORTED_AUTH_MODE - NotSupportedAuthMode = 1251, - /// - ///ER_SPATIAL_CANT_HAVE_NULL - SpatialCannotHaveNull = 1252, - /// - ///ER_COLLATION_CHARSET_MISMATCH - CollationCharsetMismatch = 1253, - /// - ///ER_SLAVE_WAS_RUNNING - SlaveWasRunning = 1254, - /// - ///ER_SLAVE_WAS_NOT_RUNNING - SlaveWasNotRunning = 1255, - /// - ///ER_TOO_BIG_FOR_UNCOMPRESS - TooBigForUncompress = 1256, - /// - ///ER_ZLIB_Z_MEM_ERROR - ZipLibMemoryError = 1257, - /// - ///ER_ZLIB_Z_BUF_ERROR - ZipLibBufferError = 1258, - /// - ///ER_ZLIB_Z_DATA_ERROR - ZipLibDataError = 1259, - /// - ///ER_CUT_VALUE_GROUP_CONCAT - CutValueGroupConcat = 1260, - /// - ///ER_WARN_TOO_FEW_RECORDS - WarningTooFewRecords = 1261, - /// - ///ER_WARN_TOO_MANY_RECORDS - WarningTooManyRecords = 1262, - /// - ///ER_WARN_NULL_TO_NOTNULL - WarningNullToNotNull = 1263, - /// - ///ER_WARN_DATA_OUT_OF_RANGE - WarningDataOutOfRange = 1264, - /// - ///WARN_DATA_TRUNCATED - WaningDataTruncated = 1265, - /// - ///ER_WARN_USING_OTHER_HANDLER - WaningUsingOtherHandler = 1266, - /// - ///ER_CANT_AGGREGATE_2COLLATIONS - CannotAggregateTwoCollations = 1267, - /// - ///ER_DROP_USER - DropUserError = 1268, - /// - ///ER_REVOKE_GRANTS - RevokeGrantsError = 1269, - /// - ///ER_CANT_AGGREGATE_3COLLATIONS - CannotAggregateThreeCollations = 1270, - /// - ///ER_CANT_AGGREGATE_NCOLLATIONS - CannotAggregateNCollations = 1271, - /// - ///ER_VARIABLE_IS_NOT_STRUCT - VariableIsNotStructure = 1272, - /// - ///ER_UNKNOWN_COLLATION - UnknownCollation = 1273, - /// - ///ER_SLAVE_IGNORED_SSL_PARAMS - SlaveIgnoreSSLParameters = 1274, - /// - ///ER_SERVER_IS_IN_SECURE_AUTH_MODE - ServerIsInSecureAuthMode = 1275, - /// - ///ER_WARN_FIELD_RESOLVED - WaningFieldResolved = 1276, - /// - ///ER_BAD_SLAVE_UNTIL_COND - BadSlaveUntilCondition = 1277, - /// - ///ER_MISSING_SKIP_SLAVE - MissingSkipSlave = 1278, - /// - ///ER_UNTIL_COND_IGNORED - ErrorUntilConditionIgnored = 1279, - /// - ///ER_WRONG_NAME_FOR_INDEX - WrongNameForIndex = 1280, - /// - ///ER_WRONG_NAME_FOR_CATALOG - WrongNameForCatalog = 1281, - /// - ///ER_WARN_QC_RESIZE - WarningQueryCacheResize = 1282, - /// - ///ER_BAD_FT_COLUMN - BadFullTextColumn = 1283, - /// - ///ER_UNKNOWN_KEY_CACHE - UnknownKeyCache = 1284, - /// - ///ER_WARN_HOSTNAME_WONT_WORK - WarningHostnameWillNotWork = 1285, - /// - ///ER_UNKNOWN_STORAGE_ENGINE - UnknownStorageEngine = 1286, - /// - ///ER_WARN_DEPRECATED_SYNTAX - WaningDeprecatedSyntax = 1287, - /// - ///ER_NON_UPDATABLE_TABLE - NonUpdateableTable = 1288, - /// - ///ER_FEATURE_DISABLED - FeatureDisabled = 1289, - /// - ///ER_OPTION_PREVENTS_STATEMENT - OptionPreventsStatement = 1290, - /// - ///ER_DUPLICATED_VALUE_IN_TYPE - DuplicatedValueInType = 1291, - /// - ///ER_TRUNCATED_WRONG_VALUE - TruncatedWrongValue = 1292, - /// - ///ER_TOO_MUCH_AUTO_TIMESTAMP_COLS - TooMuchAutoTimestampColumns = 1293, - /// - ///ER_INVALID_ON_UPDATE - InvalidOnUpdate = 1294, - /// - ///ER_UNSUPPORTED_PS - UnsupportedPreparedStatement = 1295, - /// - ///ER_GET_ERRMSG - GetErroMessage = 1296, - /// - ///ER_GET_TEMPORARY_ERRMSG - GetTemporaryErrorMessage = 1297, - /// - ///ER_UNKNOWN_TIME_ZONE - UnknownTimeZone = 1298, - /// - ///ER_WARN_INVALID_TIMESTAMP - WarningInvalidTimestamp = 1299, - /// - ///ER_INVALID_CHARACTER_STRING - InvalidCharacterString = 1300, - /// - ///ER_WARN_ALLOWED_PACKET_OVERFLOWED - WarningAllowedPacketOverflowed = 1301, - /// - ///ER_CONFLICTING_DECLARATIONS - ConflictingDeclarations = 1302, - /// - ///ER_SP_NO_RECURSIVE_CREATE - StoredProcedureNoRecursiveCreate = 1303, - /// - ///ER_SP_ALREADY_EXISTS - StoredProcedureAlreadyExists = 1304, - /// - ///ER_SP_DOES_NOT_EXIST - StoredProcedureDoesNotExist = 1305, - /// - ///ER_SP_DROP_FAILED - StoredProcedureDropFailed = 1306, - /// - ///ER_SP_STORE_FAILED - StoredProcedureStoreFailed = 1307, - /// - ///ER_SP_LILABEL_MISMATCH - StoredProcedureLiLabelMismatch = 1308, - /// - ///ER_SP_LABEL_REDEFINE - StoredProcedureLabelRedefine = 1309, - /// - ///ER_SP_LABEL_MISMATCH - StoredProcedureLabelMismatch = 1310, - /// - ///ER_SP_UNINIT_VAR - StoredProcedureUninitializedVariable = 1311, - /// - ///ER_SP_BADSELECT - StoredProcedureBadSelect = 1312, - /// - ///ER_SP_BADRETURN - StoredProcedureBadReturn = 1313, - /// - ///ER_SP_BADSTATEMENT - StoredProcedureBadStatement = 1314, - /// - ///ER_UPDATE_LOG_DEPRECATED_IGNORED - UpdateLogDeprecatedIgnored = 1315, - /// - ///ER_UPDATE_LOG_DEPRECATED_TRANSLATED - UpdateLogDeprecatedTranslated = 1316, - /// - ///ER_QUERY_INTERRUPTED - QueryInterrupted = 1317, - /// - ///ER_SP_WRONG_NO_OF_ARGS - StoredProcedureNumberOfArguments = 1318, - /// - ///ER_SP_COND_MISMATCH - StoredProcedureConditionMismatch = 1319, - /// - ///ER_SP_NORETURN - StoredProcedureNoReturn = 1320, - /// - ///ER_SP_NORETURNEND - StoredProcedureNoReturnEnd = 1321, - /// - ///ER_SP_BAD_CURSOR_QUERY - StoredProcedureBadCursorQuery = 1322, - /// - ///ER_SP_BAD_CURSOR_SELECT - StoredProcedureBadCursorSelect = 1323, - /// - ///ER_SP_CURSOR_MISMATCH - StoredProcedureCursorMismatch = 1324, - /// - ///ER_SP_CURSOR_ALREADY_OPEN - StoredProcedureAlreadyOpen = 1325, - /// - ///ER_SP_CURSOR_NOT_OPEN - StoredProcedureCursorNotOpen = 1326, - /// - ///ER_SP_UNDECLARED_VAR - StoredProcedureUndeclaredVariabel = 1327, - /// - ///ER_SP_WRONG_NO_OF_FETCH_ARGS - StoredProcedureWrongNumberOfFetchArguments = 1328, - /// - ///ER_SP_FETCH_NO_DATA - StoredProcedureFetchNoData = 1329, - /// - ///ER_SP_DUP_PARAM - StoredProcedureDuplicateParameter = 1330, - /// - ///ER_SP_DUP_VAR - StoredProcedureDuplicateVariable = 1331, - /// - ///ER_SP_DUP_COND - StoredProcedureDuplicateCondition = 1332, - /// - ///ER_SP_DUP_CURS - StoredProcedureDuplicateCursor = 1333, - /// - ///ER_SP_CANT_ALTER - StoredProcedureCannotAlter = 1334, - /// - ///ER_SP_SUBSELECT_NYI - StoredProcedureSubSelectNYI = 1335, - /// - ///ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG - StatementNotAllowedInStoredFunctionOrTrigger = 1336, - /// - ///ER_SP_VARCOND_AFTER_CURSHNDLR - StoredProcedureVariableConditionAfterCursorHandler = 1337, - /// - ///ER_SP_CURSOR_AFTER_HANDLER - StoredProcedureCursorAfterHandler = 1338, - /// - ///ER_SP_CASE_NOT_FOUND - StoredProcedureCaseNotFound = 1339, - /// - ///ER_FPARSER_TOO_BIG_FILE - FileParserTooBigFile = 1340, - /// - ///ER_FPARSER_BAD_HEADER - FileParserBadHeader = 1341, - /// - ///ER_FPARSER_EOF_IN_COMMENT - FileParserEOFInComment = 1342, - /// - ///ER_FPARSER_ERROR_IN_PARAMETER - FileParserErrorInParameter = 1343, - /// - ///ER_FPARSER_EOF_IN_UNKNOWN_PARAMETER - FileParserEOFInUnknownParameter = 1344, - /// - ///ER_VIEW_NO_EXPLAIN - ViewNoExplain = 1345, - /// - ///ER_FRM_UNKNOWN_TYPE - FrmUnknownType = 1346, - /// - ///ER_WRONG_OBJECT - WrongObject = 1347, - /// - ///ER_NONUPDATEABLE_COLUMN - NonUpdateableColumn = 1348, - /// - ///ER_VIEW_SELECT_DERIVED - ViewSelectDerived = 1349, - /// - ///ER_VIEW_SELECT_CLAUSE - ViewSelectClause = 1350, - /// - ///ER_VIEW_SELECT_VARIABLE - ViewSelectVariable = 1351, - /// - ///ER_VIEW_SELECT_TMPTABLE - ViewSelectTempTable = 1352, - /// - ///ER_VIEW_WRONG_LIST - ViewWrongList = 1353, - /// - ///ER_WARN_VIEW_MERGE - WarningViewMerge = 1354, - /// - ///ER_WARN_VIEW_WITHOUT_KEY - WarningViewWithoutKey = 1355, - /// - ///ER_VIEW_INVALID - ViewInvalid = 1356, - /// - ///ER_SP_NO_DROP_SP - StoredProcedureNoDropStoredProcedure = 1357, - /// - ///ER_SP_GOTO_IN_HNDLR - StoredProcedureGotoInHandler = 1358, - /// - ///ER_TRG_ALREADY_EXISTS - TriggerAlreadyExists = 1359, - /// - ///ER_TRG_DOES_NOT_EXIST - TriggerDoesNotExist = 1360, - /// - ///ER_TRG_ON_VIEW_OR_TEMP_TABLE - TriggerOnViewOrTempTable = 1361, - /// - ///ER_TRG_CANT_CHANGE_ROW - TriggerCannotChangeRow = 1362, - /// - ///ER_TRG_NO_SUCH_ROW_IN_TRG - TriggerNoSuchRowInTrigger = 1363, - /// - ///ER_NO_DEFAULT_FOR_FIELD - NoDefaultForField = 1364, - /// - ///ER_DIVISION_BY_ZERO - DivisionByZero = 1365, - /// - ///ER_TRUNCATED_WRONG_VALUE_FOR_FIELD - TruncatedWrongValueForField = 1366, - /// - ///ER_ILLEGAL_VALUE_FOR_TYPE - IllegalValueForType = 1367, - /// - ///ER_VIEW_NONUPD_CHECK - ViewNonUpdatableCheck = 1368, - /// - ///ER_VIEW_CHECK_FAILED - ViewCheckFailed = 1369, - /// - ///ER_PROCACCESS_DENIED_ERROR - PrecedureAccessDenied = 1370, - /// - ///ER_RELAY_LOG_FAIL - RelayLogFail = 1371, - /// - ///ER_PASSWD_LENGTH - PasswordLength = 1372, - /// - ///ER_UNKNOWN_TARGET_BINLOG - UnknownTargetBinLog = 1373, - /// - ///ER_IO_ERR_LOG_INDEX_READ - IOErrorLogIndexRead = 1374, - /// - ///ER_BINLOG_PURGE_PROHIBITED - BinLogPurgeProhibited = 1375, - /// - ///ER_FSEEK_FAIL - FSeekFail = 1376, - /// - ///ER_BINLOG_PURGE_FATAL_ERR - BinLogPurgeFatalError = 1377, - /// - ///ER_LOG_IN_USE - LogInUse = 1378, - /// - ///ER_LOG_PURGE_UNKNOWN_ERR - LogPurgeUnknownError = 1379, - /// - ///ER_RELAY_LOG_INIT - RelayLogInit = 1380, - /// - ///ER_NO_BINARY_LOGGING - NoBinaryLogging = 1381, - /// - ///ER_RESERVED_SYNTAX - ReservedSyntax = 1382, - /// - ///ER_WSAS_FAILED - WSAStartupFailed = 1383, - /// - ///ER_DIFF_GROUPS_PROC - DifferentGroupsProcedure = 1384, - /// - ///ER_NO_GROUP_FOR_PROC - NoGroupForProcedure = 1385, - /// - ///ER_ORDER_WITH_PROC - OrderWithProcedure = 1386, - /// - ///ER_LOGGING_PROHIBIT_CHANGING_OF - LoggingProhibitsChangingOf = 1387, - /// - ///ER_NO_FILE_MAPPING - NoFileMapping = 1388, - /// - ///ER_WRONG_MAGIC - WrongMagic = 1389, - /// - ///ER_PS_MANY_PARAM - PreparedStatementManyParameters = 1390, - /// - ///ER_KEY_PART_0 - KeyPartZero = 1391, - /// - ///ER_VIEW_CHECKSUM - ViewChecksum = 1392, - /// - ///ER_VIEW_MULTIUPDATE - ViewMultiUpdate = 1393, - /// - ///ER_VIEW_NO_INSERT_FIELD_LIST - ViewNoInsertFieldList = 1394, - /// - ///ER_VIEW_DELETE_MERGE_VIEW - ViewDeleteMergeView = 1395, - /// - ///ER_CANNOT_USER - CannotUser = 1396, - /// - ///ER_XAER_NOTA - XAERNotA = 1397, - /// - ///ER_XAER_INVAL - XAERInvalid = 1398, - /// - ///ER_XAER_RMFAIL - XAERRemoveFail = 1399, - /// - ///ER_XAER_OUTSIDE - XAEROutside = 1400, - /// - ///ER_XAER_RMERR - XAERRemoveError = 1401, - /// - ///ER_XA_RBROLLBACK - XARBRollback = 1402, - /// - ///ER_NONEXISTING_PROC_GRANT - NonExistingProcedureGrant = 1403, - /// - ///ER_PROC_AUTO_GRANT_FAIL - ProcedureAutoGrantFail = 1404, - /// - ///ER_PROC_AUTO_REVOKE_FAIL - ProcedureAutoRevokeFail = 1405, - /// - ///ER_DATA_TOO_LONG - DataTooLong = 1406, - /// - ///ER_SP_BAD_SQLSTATE - StoredProcedureSQLState = 1407, - /// - ///ER_STARTUP - StartupError = 1408, - /// - ///ER_LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR - LoadFromFixedSizeRowsToVariable = 1409, - /// - ///ER_CANT_CREATE_USER_WITH_GRANT - CannotCreateUserWithGrant = 1410, - /// - ///ER_WRONG_VALUE_FOR_TYPE - WrongValueForType = 1411, - /// - ///ER_TABLE_DEF_CHANGED - TableDefinitionChanged = 1412, - /// - ///ER_SP_DUP_HANDLER - StoredProcedureDuplicateHandler = 1413, - /// - ///ER_SP_NOT_VAR_ARG - StoredProcedureNotVariableArgument = 1414, - /// - ///ER_SP_NO_RETSET - StoredProcedureNoReturnSet = 1415, - /// - ///ER_CANT_CREATE_GEOMETRY_OBJECT - CannotCreateGeometryObject = 1416, - /// - ///ER_FAILED_ROUTINE_BREAK_BINLOG - FailedRoutineBreaksBinLog = 1417, - /// - ///ER_BINLOG_UNSAFE_ROUTINE - BinLogUnsafeRoutine = 1418, - /// - ///ER_BINLOG_CREATE_ROUTINE_NEED_SUPER - BinLogCreateRoutineNeedSuper = 1419, - /// - ///ER_EXEC_STMT_WITH_OPEN_CURSOR - ExecuteStatementWithOpenCursor = 1420, - /// - ///ER_STMT_HAS_NO_OPEN_CURSOR - StatementHasNoOpenCursor = 1421, - /// - ///ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG - CommitNotAllowedIfStoredFunctionOrTrigger = 1422, - /// - ///ER_NO_DEFAULT_FOR_VIEW_FIELD - NoDefaultForViewField = 1423, - /// - ///ER_SP_NO_RECURSION - StoredProcedureNoRecursion = 1424, - /// - ///ER_TOO_BIG_SCALE - TooBigScale = 1425, - /// - ///ER_TOO_BIG_PRECISION - TooBigPrecision = 1426, - /// - ///ER_M_BIGGER_THAN_D - MBiggerThanD = 1427, - /// - ///ER_WRONG_LOCK_OF_SYSTEM_TABLE - WrongLockOfSystemTable = 1428, - /// - ///ER_CONNECT_TO_FOREIGN_DATA_SOURCE - ConnectToForeignDataSource = 1429, - /// - ///ER_QUERY_ON_FOREIGN_DATA_SOURCE - QueryOnForeignDataSource = 1430, - /// - ///ER_FOREIGN_DATA_SOURCE_DOESNT_EXIST - ForeignDataSourceDoesNotExist = 1431, - /// - ///ER_FOREIGN_DATA_STRING_INVALID_CANT_CREATE - ForeignDataStringInvalidCannotCreate = 1432, - /// - ///ER_FOREIGN_DATA_STRING_INVALID - ForeignDataStringInvalid = 1433, - /// - ///ER_CANT_CREATE_FEDERATED_TABLE - CannotCreateFederatedTable = 1434, - /// - ///ER_TRG_IN_WRONG_SCHEMA - TriggerInWrongSchema = 1435, - /// - ///ER_STACK_OVERRUN_NEED_MORE - StackOverrunNeedMore = 1436, - /// - ///ER_TOO_LONG_BODY - TooLongBody = 1437, - /// - ///ER_WARN_CANT_DROP_DEFAULT_KEYCACHE - WarningCannotDropDefaultKeyCache = 1438, - /// - ///ER_TOO_BIG_DISPLAYWIDTH - TooBigDisplayWidth = 1439, - /// - ///ER_XAER_DUPID - XAERDuplicateID = 1440, - /// - ///ER_DATETIME_FUNCTION_OVERFLOW - DateTimeFunctionOverflow = 1441, - /// - ///ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG - CannotUpdateUsedTableInStoredFunctionOrTrigger = 1442, - /// - ///ER_VIEW_PREVENT_UPDATE - ViewPreventUpdate = 1443, - /// - ///ER_PS_NO_RECURSION - PreparedStatementNoRecursion = 1444, - /// - ///ER_SP_CANT_SET_AUTOCOMMIT - StoredProcedureCannotSetAutoCommit = 1445, - /// - ///ER_MALFORMED_DEFINER - MalformedDefiner = 1446, - /// - ///ER_VIEW_FRM_NO_USER - ViewFrmNoUser = 1447, - /// - ///ER_VIEW_OTHER_USER - ViewOtherUser = 1448, - /// - ///ER_NO_SUCH_USER - NoSuchUser = 1449, - /// - ///ER_FORBID_SCHEMA_CHANGE - ForbidSchemaChange = 1450, - /// - ///ER_ROW_IS_REFERENCED_2 - RowIsReferenced2 = 1451, - /// - ///ER_NO_REFERENCED_ROW_2 - NoReferencedRow2 = 1452, - /// - ///ER_SP_BAD_VAR_SHADOW - StoredProcedureBadVariableShadow = 1453, - /// - ///ER_TRG_NO_DEFINER - TriggerNoDefiner = 1454, - /// - ///ER_OLD_FILE_FORMAT - OldFileFormat = 1455, - /// - ///ER_SP_RECURSION_LIMIT - StoredProcedureRecursionLimit = 1456, - /// - ///ER_SP_PROC_TABLE_CORRUPT - StoredProcedureTableCorrupt = 1457, - /// - ///ER_SP_WRONG_NAME - StoredProcedureWrongName = 1458, - /// - ///ER_TABLE_NEEDS_UPGRADE - TableNeedsUpgrade = 1459, - /// - ///ER_SP_NO_AGGREGATE - StoredProcedureNoAggregate = 1460, - /// - ///ER_MAX_PREPARED_STMT_COUNT_REACHED - MaxPreparedStatementCountReached = 1461, - /// - ///ER_VIEW_RECURSIVE - ViewRecursive = 1462, - /// - ///ER_NON_GROUPING_FIELD_USED - NonGroupingFieldUsed = 1463, - /// - ///ER_TABLE_CANT_HANDLE_SPKEYS - TableCannotHandleSpatialKeys = 1464, - /// - ///ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA - NoTriggersOnSystemSchema = 1465, - /// - ///ER_REMOVED_SPACES - RemovedSpaces = 1466, - /// - ///ER_AUTOINC_READ_FAILED - AutoIncrementReadFailed = 1467, - /// - ///ER_USERNAME - UserNameError = 1468, - /// - ///ER_HOSTNAME - HostNameError = 1469, - /// - ///ER_WRONG_STRING_LENGTH - WrongStringLength = 1470, - /// - ///ER_NON_INSERTABLE_TABLE - NonInsertableTable = 1471, - /// - ///ER_ADMIN_WRONG_MRG_TABLE - AdminWrongMergeTable = 1472, - /// - ///ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT - TooHighLevelOfNestingForSelect = 1473, - /// - ///ER_NAME_BECOMES_EMPTY - NameBecomesEmpty = 1474, - /// - ///ER_AMBIGUOUS_FIELD_TERM - AmbiguousFieldTerm = 1475, - /// - ///ER_FOREIGN_SERVER_EXISTS - ForeignServerExists = 1476, - /// - ///ER_FOREIGN_SERVER_DOESNT_EXIST - ForeignServerDoesNotExist = 1477, - /// - ///ER_ILLEGAL_HA_CREATE_OPTION - IllegalHACreateOption = 1478, - /// - ///ER_PARTITION_REQUIRES_VALUES_ERROR - PartitionRequiresValues = 1479, - /// - ///ER_PARTITION_WRONG_VALUES_ERROR - PartitionWrongValues = 1480, - /// - ///ER_PARTITION_MAXVALUE_ERROR - PartitionMaxValue = 1481, - /// - ///ER_PARTITION_SUBPARTITION_ERROR - PartitionSubPartition = 1482, - /// - ///ER_PARTITION_SUBPART_MIX_ERROR - PartitionSubPartMix = 1483, - /// - ///ER_PARTITION_WRONG_NO_PART_ERROR - PartitionWrongNoPart = 1484, - /// - ///ER_PARTITION_WRONG_NO_SUBPART_ERROR - PartitionWrongNoSubPart = 1485, - /// - ///ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR - WrongExpressionInParitionFunction = 1486, - /// - ///ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR - NoConstantExpressionInRangeOrListError = 1487, - /// - ///ER_FIELD_NOT_FOUND_PART_ERROR - FieldNotFoundPartitionErrror = 1488, - /// - ///ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR - ListOfFieldsOnlyInHash = 1489, - /// - ///ER_INCONSISTENT_PARTITION_INFO_ERROR - InconsistentPartitionInfo = 1490, - /// - ///ER_PARTITION_FUNC_NOT_ALLOWED_ERROR - PartitionFunctionNotAllowed = 1491, - /// - ///ER_PARTITIONS_MUST_BE_DEFINED_ERROR - PartitionsMustBeDefined = 1492, - /// - ///ER_RANGE_NOT_INCREASING_ERROR - RangeNotIncreasing = 1493, - /// - ///ER_INCONSISTENT_TYPE_OF_FUNCTIONS_ERROR - InconsistentTypeOfFunctions = 1494, - /// - ///ER_MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR - MultipleDefinitionsConstantInListPartition = 1495, - /// - ///ER_PARTITION_ENTRY_ERROR - PartitionEntryError = 1496, - /// - ///ER_MIX_HANDLER_ERROR - MixHandlerError = 1497, - /// - ///ER_PARTITION_NOT_DEFINED_ERROR - PartitionNotDefined = 1498, - /// - ///ER_TOO_MANY_PARTITIONS_ERROR - TooManyPartitions = 1499, - /// - ///ER_SUBPARTITION_ERROR - SubPartitionError = 1500, - /// - ///ER_CANT_CREATE_HANDLER_FILE - CannotCreateHandlerFile = 1501, - /// - ///ER_BLOB_FIELD_IN_PART_FUNC_ERROR - BlobFieldInPartitionFunction = 1502, - /// - ///ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF - UniqueKeyNeedAllFieldsInPartitioningFunction = 1503, - /// - ///ER_NO_PARTS_ERROR - NoPartitions = 1504, - /// - ///ER_PARTITION_MGMT_ON_NONPARTITIONED - PartitionManagementOnNoPartitioned = 1505, - /// - ///ER_FOREIGN_KEY_ON_PARTITIONED - ForeignKeyOnPartitioned = 1506, - /// - ///ER_DROP_PARTITION_NON_EXISTENT - DropPartitionNonExistent = 1507, - /// - ///ER_DROP_LAST_PARTITION - DropLastPartition = 1508, - /// - ///ER_COALESCE_ONLY_ON_HASH_PARTITION - CoalesceOnlyOnHashPartition = 1509, - /// - ///ER_REORG_HASH_ONLY_ON_SAME_NO - ReorganizeHashOnlyOnSameNumber = 1510, - /// - ///ER_REORG_NO_PARAM_ERROR - ReorganizeNoParameter = 1511, - /// - ///ER_ONLY_ON_RANGE_LIST_PARTITION - OnlyOnRangeListPartition = 1512, - /// - ///ER_ADD_PARTITION_SUBPART_ERROR - AddPartitionSubPartition = 1513, - /// - ///ER_ADD_PARTITION_NO_NEW_PARTITION - AddPartitionNoNewPartition = 1514, - /// - ///ER_COALESCE_PARTITION_NO_PARTITION - CoalescePartitionNoPartition = 1515, - /// - ///ER_REORG_PARTITION_NOT_EXIST - ReorganizePartitionNotExist = 1516, - /// - ///ER_SAME_NAME_PARTITION - SameNamePartition = 1517, - /// - ///ER_NO_BINLOG_ERROR - NoBinLog = 1518, - /// - ///ER_CONSECUTIVE_REORG_PARTITIONS - ConsecutiveReorganizePartitions = 1519, - /// - ///ER_REORG_OUTSIDE_RANGE - ReorganizeOutsideRange = 1520, - /// - ///ER_PARTITION_FUNCTION_FAILURE - PartitionFunctionFailure = 1521, - /// - ///ER_PART_STATE_ERROR - PartitionStateError = 1522, - /// - ///ER_LIMITED_PART_RANGE - LimitedPartitionRange = 1523, - /// - ///ER_PLUGIN_IS_NOT_LOADED - PluginIsNotLoaded = 1524, - /// - ///ER_WRONG_VALUE - WrongValue = 1525, - /// - ///ER_NO_PARTITION_FOR_GIVEN_VALUE - NoPartitionForGivenValue = 1526, - /// - ///ER_FILEGROUP_OPTION_ONLY_ONCE - FileGroupOptionOnlyOnce = 1527, - /// - ///ER_CREATE_FILEGROUP_FAILED - CreateFileGroupFailed = 1528, - /// - ///ER_DROP_FILEGROUP_FAILED - DropFileGroupFailed = 1529, - /// - ///ER_TABLESPACE_AUTO_EXTEND_ERROR - TableSpaceAutoExtend = 1530, - /// - ///ER_WRONG_SIZE_NUMBER - WrongSizeNumber = 1531, - /// - ///ER_SIZE_OVERFLOW_ERROR - SizeOverflow = 1532, - /// - ///ER_ALTER_FILEGROUP_FAILED - AlterFileGroupFailed = 1533, - /// - ///ER_BINLOG_ROW_LOGGING_FAILED - BinLogRowLogginFailed = 1534, - /// - ///ER_BINLOG_ROW_WRONG_TABLE_DEF - BinLogRowWrongTableDefinition = 1535, - /// - ///ER_BINLOG_ROW_RBR_TO_SBR - BinLogRowRBRToSBR = 1536, - /// - ///ER_EVENT_ALREADY_EXISTS - EventAlreadyExists = 1537, - /// - ///ER_EVENT_STORE_FAILED - EventStoreFailed = 1538, - /// - ///ER_EVENT_DOES_NOT_EXIST - EventDoesNotExist = 1539, - /// - ///ER_EVENT_CANT_ALTER - EventCannotAlter = 1540, - /// - ///ER_EVENT_DROP_FAILED - EventDropFailed = 1541, - /// - ///ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG - EventIntervalNotPositiveOrTooBig = 1542, - /// - ///ER_EVENT_ENDS_BEFORE_STARTS - EventEndsBeforeStarts = 1543, - /// - ///ER_EVENT_EXEC_TIME_IN_THE_PAST - EventExecTimeInThePast = 1544, - /// - ///ER_EVENT_OPEN_TABLE_FAILED - EventOpenTableFailed = 1545, - /// - ///ER_EVENT_NEITHER_M_EXPR_NOR_M_AT - EventNeitherMExpresssionNorMAt = 1546, - /// - ///ER_COL_COUNT_DOESNT_MATCH_CORRUPTED - ColumnCountDoesNotMatchCorrupted = 1547, - /// - ///ER_CANNOT_LOAD_FROM_TABLE - CannotLoadFromTable = 1548, - /// - ///ER_EVENT_CANNOT_DELETE - EventCannotDelete = 1549, - /// - ///ER_EVENT_COMPILE_ERROR - EventCompileError = 1550, - /// - ///ER_EVENT_SAME_NAME - EventSameName = 1551, - /// - ///ER_EVENT_DATA_TOO_LONG - EventDataTooLong = 1552, - /// - ///ER_DROP_INDEX_FK - DropIndexForeignKey = 1553, - /// - ///ER_WARN_DEPRECATED_SYNTAX_WITH_VER - WarningDeprecatedSyntaxWithVersion = 1554, - /// - ///ER_CANT_WRITE_LOCK_LOG_TABLE - CannotWriteLockLogTable = 1555, - /// - ///ER_CANT_LOCK_LOG_TABLE - CannotLockLogTable = 1556, - /// - ///ER_FOREIGN_DUPLICATE_KEY - ForeignDuplicateKey = 1557, - /// - ///ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE - ColumnCountDoesNotMatchPleaseUpdate = 1558, - /// - ///ER_TEMP_TABLE_PREVENTS_SWITCH_OUT_OF_RBR - TemoraryTablePreventSwitchOutOfRBR = 1559, - /// - ///ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT - StoredFunctionPreventsSwitchBinLogFormat = 1560, - /// - ///ER_NDB_CANT_SWITCH_BINLOG_FORMAT - NDBCannotSwitchBinLogFormat = 1561, - /// - ///ER_PARTITION_NO_TEMPORARY - PartitionNoTemporary = 1562, - /// - ///ER_PARTITION_CONST_DOMAIN_ERROR - PartitionConstantDomain = 1563, - /// - ///ER_PARTITION_FUNCTION_IS_NOT_ALLOWED - PartitionFunctionIsNotAllowed = 1564, - /// - ///ER_DDL_LOG_ERROR - DDLLogError = 1565, - /// - ///ER_NULL_IN_VALUES_LESS_THAN - NullInValuesLessThan = 1566, - /// - ///ER_WRONG_PARTITION_NAME - WrongPartitionName = 1567, - /// - ///ER_CANT_CHANGE_TX_ISOLATION - CannotChangeTransactionIsolation = 1568, - /// - ///ER_DUP_ENTRY_AUTOINCREMENT_CASE - DuplicateEntryAutoIncrementCase = 1569, - /// - ///ER_EVENT_MODIFY_QUEUE_ERROR - EventModifyQueueError = 1570, - /// - ///ER_EVENT_SET_VAR_ERROR - EventSetVariableError = 1571, - /// - ///ER_PARTITION_MERGE_ERROR - PartitionMergeError = 1572, - /// - ///ER_CANT_ACTIVATE_LOG - CannotActivateLog = 1573, - /// - ///ER_RBR_NOT_AVAILABLE - RBRNotAvailable = 1574, - /// - ///ER_BASE64_DECODE_ERROR - Base64DecodeError = 1575, - /// - ///ER_EVENT_RECURSION_FORBIDDEN - EventRecursionForbidden = 1576, - /// - ///ER_EVENTS_DB_ERROR - EventsDatabaseError = 1577, - /// - ///ER_ONLY_INTEGERS_ALLOWED - OnlyIntegersAllowed = 1578, - /// - ///ER_UNSUPORTED_LOG_ENGINE - UnsupportedLogEngine = 1579, - /// - ///ER_BAD_LOG_STATEMENT - BadLogStatement = 1580, - /// - ///ER_CANT_RENAME_LOG_TABLE - CannotRenameLogTable = 1581, - /// - ///ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT - WrongParameterCountToNativeFCT = 1582, - /// - ///ER_WRONG_PARAMETERS_TO_NATIVE_FCT - WrongParametersToNativeFCT = 1583, - /// - ///ER_WRONG_PARAMETERS_TO_STORED_FCT - WrongParametersToStoredFCT = 1584, - /// - ///ER_NATIVE_FCT_NAME_COLLISION - NativeFCTNameCollision = 1585, - /// - ///ER_DUP_ENTRY_WITH_KEY_NAME - DuplicateEntryWithKeyName = 1586, - /// - ///ER_BINLOG_PURGE_EMFILE - BinLogPurgeEMFile = 1587, - /// - ///ER_EVENT_CANNOT_CREATE_IN_THE_PAST - EventCannotCreateInThePast = 1588, - /// - ///ER_EVENT_CANNOT_ALTER_IN_THE_PAST - EventCannotAlterInThePast = 1589, - /// - ///ER_SLAVE_INCIDENT - SlaveIncident = 1590, - /// - ///ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT - NoPartitionForGivenValueSilent = 1591, - /// - ///ER_BINLOG_UNSAFE_STATEMENT - BinLogUnsafeStatement = 1592, - /// - ///ER_SLAVE_FATAL_ERROR - SlaveFatalError = 1593, - /// - ///ER_SLAVE_RELAY_LOG_READ_FAILURE - SlaveRelayLogReadFailure = 1594, - /// - ///ER_SLAVE_RELAY_LOG_WRITE_FAILURE - SlaveRelayLogWriteFailure = 1595, - /// - ///ER_SLAVE_CREATE_EVENT_FAILURE - SlaveCreateEventFailure = 1596, - /// - ///ER_SLAVE_MASTER_COM_FAILURE - SlaveMasterComFailure = 1597, - /// - ///ER_BINLOG_LOGGING_IMPOSSIBLE - BinLogLoggingImpossible = 1598, - /// - ///ER_VIEW_NO_CREATION_CTX - ViewNoCreationContext = 1599, - /// - ///ER_VIEW_INVALID_CREATION_CTX - ViewInvalidCreationContext = 1600, - /// - ///ER_SR_INVALID_CREATION_CTX - StoredRoutineInvalidCreateionContext = 1601, - /// - ///ER_TRG_CORRUPTED_FILE - TiggerCorruptedFile = 1602, - /// - ///ER_TRG_NO_CREATION_CTX - TriggerNoCreationContext = 1603, - /// - ///ER_TRG_INVALID_CREATION_CTX - TriggerInvalidCreationContext = 1604, - /// - ///ER_EVENT_INVALID_CREATION_CTX - EventInvalidCreationContext = 1605, - /// - ///ER_TRG_CANT_OPEN_TABLE - TriggerCannotOpenTable = 1606, - /// - ///ER_CANT_CREATE_SROUTINE - CannoCreateSubRoutine = 1607, - /// - ///ER_SLAVE_AMBIGOUS_EXEC_MODE - SlaveAmbiguousExecMode = 1608, - /// - ///ER_NO_FORMAT_DESCRIPTION_EVENT_BEFORE_BINLOG_STATEMENT - NoFormatDescriptionEventBeforeBinLogStatement = 1609, - /// - ///ER_SLAVE_CORRUPT_EVENT - SlaveCorruptEvent = 1610, - /// - ///ER_LOAD_DATA_INVALID_COLUMN - LoadDataInvalidColumn = 1611, - /// - ///ER_LOG_PURGE_NO_FILE - LogPurgeNoFile = 1612, - /// - ///ER_XA_RBTIMEOUT - XARBTimeout = 1613, - /// - ///ER_XA_RBDEADLOCK - XARBDeadlock = 1614, - /// - ///ER_NEED_REPREPARE - NeedRePrepare = 1615, - /// - ///ER_DELAYED_NOT_SUPPORTED - DelayedNotSupported = 1616, - /// - ///WARN_NO_MASTER_INFO - WarningNoMasterInfo = 1617, - /// - ///WARN_OPTION_IGNORED - WarningOptionIgnored = 1618, - /// - ///WARN_PLUGIN_DELETE_BUILTIN - WarningPluginDeleteBuiltIn = 1619, - /// - ///WARN_PLUGIN_BUSY - WarningPluginBusy = 1620, - /// - ///ER_VARIABLE_IS_READONLY - VariableIsReadonly = 1621, - /// - ///ER_WARN_ENGINE_TRANSACTION_ROLLBACK - WarningEngineTransactionRollback = 1622, - /// - ///ER_SLAVE_HEARTBEAT_FAILURE - SlaveHeartbeatFailure = 1623, - /// - ///ER_SLAVE_HEARTBEAT_VALUE_OUT_OF_RANGE - SlaveHeartbeatValueOutOfRange = 1624, - /// - ///ER_NDB_REPLICATION_SCHEMA_ERROR - NDBReplicationSchemaError = 1625, - /// - ///ER_CONFLICT_FN_PARSE_ERROR - ConflictFunctionParseError = 1626, - /// - ///ER_EXCEPTIONS_WRITE_ERROR - ExcepionsWriteError = 1627, - /// - ///ER_TOO_LONG_TABLE_COMMENT - TooLongTableComment = 1628, - /// - ///ER_TOO_LONG_FIELD_COMMENT - TooLongFieldComment = 1629, - /// - ///ER_FUNC_INEXISTENT_NAME_COLLISION - FunctionInExistentNameCollision = 1630, - /// - ///ER_DATABASE_NAME - DatabaseNameError = 1631, - /// - ///ER_TABLE_NAME - TableNameErrror = 1632, - /// - ///ER_PARTITION_NAME - PartitionNameError = 1633, - /// - ///ER_SUBPARTITION_NAME - SubPartitionNameError = 1634, - /// - ///ER_TEMPORARY_NAME - TemporaryNameError = 1635, - /// - ///ER_RENAMED_NAME - RenamedNameError = 1636, - /// - ///ER_TOO_MANY_CONCURRENT_TRXS - TooManyConcurrentTransactions = 1637, - /// - ///WARN_NON_ASCII_SEPARATOR_NOT_IMPLEMENTED - WarningNonASCIISeparatorNotImplemented = 1638, - /// - ///ER_DEBUG_SYNC_TIMEOUT - DebugSyncTimeout = 1639, - /// - ///ER_DEBUG_SYNC_HIT_LIMIT - DebugSyncHitLimit = 1640, - /// - ///ER_ERROR_LAST - ErrorLast = 1640 - } -} +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySql.Data.MySqlClient +{ + /// + /// Collection of error codes that can be returned by the server + /// + public class MySqlError + { + /// + /// + /// + /// + public MySqlError(string level, int code, string message) + { + this.Level = level; + this.Code = code; + this.Message = message; + } + + /// + /// Error level + /// + public string Level { get; } + + /// + /// Error code + /// + public int Code { get; } + + /// + /// Error message + /// + public string Message { get; } + }; + + /// + /// Provides a reference to error codes returned by MySQL. + /// + public enum MySqlErrorCode + { + None = 0, + /// + ///ER_HASHCHK + HashCheck = 1000, + /// + ///ER_NISAMCHK + ISAMCheck = 1001, + /// + ///ER_NO + No = 1002, + /// + ///ER_YES + Yes = 1003, + ///The file couldn't be created. + ///ER_CANT_CREATE_FILE + CannotCreateFile = 1004, + ///The table couldn't be created. + ///ER_CANT_CREATE_TABLE + CannotCreateTable = 1005, + ///The database couldn't be created. + ///ER_CANT_CREATE_DB + CannotCreateDatabase = 1006, + ///The database couldn't be created, it already exists. + ///ER_DB_CREATE_EXISTS + DatabaseCreateExists = 1007, + ///The database couldn't be dropped, it doesn't exist. + ///ER_DB_DROP_EXISTS + DatabaseDropExists = 1008, + ///The database couldn't be dropped, the file can't be deleted. + ///ER_DB_DROP_DELETE + DatabaseDropDelete = 1009, + ///The database couldn't be dropped, the directory can't be deleted. + ///ER_DB_DROP_RMDIR + DatabaseDropRemoveDir = 1010, + ///The file couldn't be deleted. + ///ER_CANT_DELETE_FILE + CannotDeleteFile = 1011, + ///The record couldn't be read from the system table. + ///ER_CANT_FIND_SYSTEM_REC + CannotFindSystemRecord = 1012, + ///The status couldn't be retrieved. + ///ER_CANT_GET_STAT + CannotGetStatus = 1013, + ///The working directory couldn't be retrieved. + ///ER_CANT_GET_WD + CannotGetWorkingDirectory = 1014, + ///The file couldn't be locked. + ///ER_CANT_LOCK + CannotLock = 1015, + ///The file couldn't be opened. + ///ER_CANT_OPEN_FILE + CannotOpenFile = 1016, + ///The file couldn't be found. + ///ER_FILE_NOT_FOUND + FileNotFound = 1017, + ///The directory couldn't be read. + ///ER_CANT_READ_DIR + CannotReadDirectory = 1018, + ///The working directory couldn't be entered. + ///ER_CANT_SET_WD + CannotSetWorkingDirectory = 1019, + ///The record changed since it was last read. + ///ER_CHECKREAD + CheckRead = 1020, + ///The disk is full. + ///ER_DISK_FULL + DiskFull = 1021, + /// + /// There is already a key with the given values. + /// + DuplicateKey = 1022, + ///An error occurred when closing the file. + ///ER_ERROR_ON_CLOSE + ErrorOnClose = 1023, + ///An error occurred when reading from the file. + ///ER_ERROR_ON_READ + ErrorOnRead = 1024, + ///An error occurred when renaming then file. + ///ER_ERROR_ON_RENAME + ErrorOnRename = 1025, + ///An error occurred when writing to the file. + ///ER_ERROR_ON_WRITE + ErrorOnWrite = 1026, + ///The file is in use. + ///ER_FILE_USED + FileUsed = 1027, + ///Sorting has been aborted. + ///ER_FILSORT_ABORT + FileSortAborted = 1028, + ///The view doesn't exist. + ///ER_FORM_NOT_FOUND + FormNotFound = 1029, + ///Got the specified error from the table storage engine. + ///ER_GET_ERRNO + GetErrorNumber = 1030, + ///The table storage engine doesn't support the specified option. + ///ER_ILLEGAL_HA + IllegalHA = 1031, + /// + /// The specified key was not found. + /// + KeyNotFound = 1032, + ///The file contains incorrect information. + ///ER_NOT_FORM_FILE + NotFormFile = 1033, + ///The key file is incorrect for the table, it should be repaired. + ///ER_NOT_KEYFILE + NotKeyFile = 1034, + ///The key file is old for the table, it should be repaired. + ///ER_OLD_KEYFILE + OldKeyFile = 1035, + ///The table is read-only + ///ER_OPEN_AS_READONLY + OpenAsReadOnly = 1036, + ///The server is out of memory, it should be restarted. + ///ER_OUTOFMEMORY + OutOfMemory = 1037, + ///The server is out of sort-memory, the sort buffer size should be increased. + ///ER_OUT_OF_SORTMEMORY + OutOfSortMemory = 1038, + ///An unexpected EOF was found when reading from the file. + ///ER_UNEXPECTED_EOF + UnexepectedEOF = 1039, + ///Too many connections are open. + ///ER_CON_COUNT_ERROR + ConnectionCountError = 1040, + ///The server is out of resources, check if MySql or some other process is using all available memory. + ///ER_OUT_OF_RESOURCES + OutOfResources = 1041, + /// + /// Given when the connection is unable to successfully connect to host. + /// + UnableToConnectToHost = 1042, + ///The handshake was invalid. + ///ER_HANDSHAKE_ERROR + HandshakeError = 1043, + ///Access was denied for the specified user using the specified database. + ///ER_DBACCESS_DENIED_ERROR + DatabaseAccessDenied = 1044, + /// + /// Normally returned when an incorrect password is given + /// + AccessDenied = 1045, + ///No database has been selected. + ///ER_NO_DB_ERROR + NoDatabaseSelected = 1046, + ///The command is unknown. + ///ER_UNKNOWN_COM_ERROR + UnknownCommand = 1047, + ///The specified column cannot be NULL. + ///ER_BAD_NULL_ERROR + ColumnCannotBeNull = 1048, + /// The specified database is not known. + UnknownDatabase = 1049, + ///The specified table already exists. + ///ER_TABLE_EXISTS_ERROR + TableExists = 1050, + ///The specified table is unknown. + ///ER_BAD_TABLE_ERROR + BadTable = 1051, + ///The specified column is ambiguous. + ///ER_NON_UNIQ_ERROR + NonUnique = 1052, + ///The server is currently being shutdown. + ///ER_SERVER_SHUTDOWN + ServerShutdown = 1053, + ///The specified columns is unknown. + ///ER_BAD_FIELD_ERROR + BadFieldError = 1054, + ///The specified column isn't in GROUP BY. + ///ER_WRONG_FIELD_WITH_GROUP + WrongFieldWithGroup = 1055, + ///The specified columns cannot be grouped on. + ///ER_WRONG_GROUP_FIELD + WrongGroupField = 1056, + ///There are sum functions and columns in the same statement. + ///ER_WRONG_SUM_SELECT + WrongSumSelected = 1057, + ///The column count doesn't match the value count. + ///ER_WRONG_VALUE_COUNT + WrongValueCount = 1058, + ///The identifier name is too long. + ///ER_TOO_LONG_IDENT + TooLongIdentifier = 1059, + ///The column name is duplicated. + ///ER_DUP_FIELDNAME + DuplicateFieldName = 1060, + /// + /// Duplicate Key Name + /// + DuplicateKeyName = 1061, + /// + /// Duplicate Key Entry + /// + DuplicateKeyEntry = 1062, + ///The column specifier is incorrect. + ///ER_WRONG_FIELD_SPEC + WrongFieldSpecifier = 1063, + ///An error occurred when parsing the statement. + ///ER_PARSE_ERROR + ParseError = 1064, + ///The statement is empty. + ///ER_EMPTY_QUERY + EmptyQuery = 1065, + ///The table alias isn't unique. + ///ER_NONUNIQ_TABLE + NonUniqueTable = 1066, + ///The default value is invalid for the specified field. + ///ER_INVALID_DEFAULT + InvalidDefault = 1067, + ///The table has multiple primary keys defined. + ///ER_MULTIPLE_PRI_KEY + MultiplePrimaryKey = 1068, + ///Too many keys were defined for the table. + ///ER_TOO_MANY_KEYS + TooManyKeys = 1069, + ///Too many parts to the keys were defined for the table. + ///ER_TOO_MANY_KEY_PARTS + TooManyKeysParts = 1070, + ///The specified key is too long + ///ER_TOO_LONG_KEY + TooLongKey = 1071, + ///The specified key column doesn't exist in the table. + ///ER_KEY_COLUMN_DOES_NOT_EXITS + KeyColumnDoesNotExist = 1072, + ///The BLOB column was used as a key, this can't be done. + ///ER_BLOB_USED_AS_KEY + BlobUsedAsKey = 1073, + ///The column length is too big for the specified column type. + ///ER_TOO_BIG_FIELDLENGTH + TooBigFieldLength = 1074, + ///There can only be one auto-column, and it must be defined as a PK. + ///ER_WRONG_AUTO_KEY + WrongAutoKey = 1075, + ///The server is ready to accept connections. + ///ER_READY + Ready = 1076, + /// + ///ER_NORMAL_SHUTDOWN + NormalShutdown = 1077, + ///The server received the specified signal and is aborting. + ///ER_GOT_SIGNAL + GotSignal = 1078, + ///The server shutdown is complete. + ///ER_SHUTDOWN_COMPLETE + ShutdownComplete = 1079, + ///The server is forcing close of the specified thread. + ///ER_FORCING_CLOSE + ForcingClose = 1080, + ///An error occurred when creating the IP socket. + ///ER_IPSOCK_ERROR + IPSocketError = 1081, + ///The table has no index like the one used in CREATE INDEX. + ///ER_NO_SUCH_INDEX + NoSuchIndex = 1082, + ///The field separator argument is not what is expected, check the manual. + ///ER_WRONG_FIELD_TERMINATORS + WrongFieldTerminators = 1083, + ///The BLOB columns must terminated, fixed row lengths cannot be used. + ///ER_BLOBS_AND_NO_TERMINATED + BlobsAndNoTerminated = 1084, + ///The text file cannot be read. + ///ER_TEXTFILE_NOT_READABLE + TextFileNotReadable = 1085, + ///The specified file already exists. + ///ER_FILE_EXISTS_ERROR + FileExists = 1086, + ///Information returned by the LOAD statement. + ///ER_LOAD_INFO + LoadInfo = 1087, + ///Information returned by an UPDATE statement. + ///ER_ALTER_INFO + AlterInfo = 1088, + ///The prefix key is incorrect. + ///ER_WRONG_SUB_KEY + WrongSubKey = 1089, + ///All columns cannot be removed from a table, use DROP TABLE instead. + ///ER_CANT_REMOVE_ALL_FIELDS + CannotRemoveAllFields = 1090, + ///Cannot DROP, check that the column or key exists. + ///ER_CANT_DROP_FIELD_OR_KEY + CannotDropFieldOrKey = 1091, + ///Information returned by an INSERT statement. + ///ER_INSERT_INFO + InsertInfo = 1092, + ///The target table cannot be specified for update in FROM clause. + ///ER_UPDATE_TABLE_USED + UpdateTableUsed = 1093, + ///The specified thread ID is unknown. + ///ER_NO_SUCH_THREAD + NoSuchThread = 1094, + ///The thread cannot be killed, the current user is not the owner. + ///ER_KILL_DENIED_ERROR + KillDenied = 1095, + ///No tables used in the statement. + ///ER_NO_TABLES_USED + NoTablesUsed = 1096, + ///Too many string have been used for the specified column and SET. + ///ER_TOO_BIG_SET + TooBigSet = 1097, + ///A unique filename couldn't be generated. + ///ER_NO_UNIQUE_LOGFILE + NoUniqueLogFile = 1098, + ///The specified table was locked with a READ lock, and can't be updated. + ///ER_TABLE_NOT_LOCKED_FOR_WRITE + TableNotLockedForWrite = 1099, + ///The specified table was not locked with LOCK TABLES. + ///ER_TABLE_NOT_LOCKED + TableNotLocked = 1100, + ///BLOB and Text columns cannot have a default value. + ///ER_BLOB_CANT_HAVE_DEFAULT + BlobCannotHaveDefault = 1101, + ///The specified database name is incorrect. + ///ER_WRONG_DB_NAME + WrongDatabaseName = 1102, + ///The specified table name is incorrect. + ///ER_WRONG_TABLE_NAME + WrongTableName = 1103, + ///The SELECT command would examine more than MAX_JOIN_SIZE rows, check the WHERE clause and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is ok. + ///ER_TOO_BIG_SELECT + TooBigSelect = 1104, + ///An unknown error occurred. + ///ER_UNKNOWN_ERROR + UnknownError = 1105, + ///The specified procedure is unknown. + ///ER_UNKNOWN_PROCEDURE + UnknownProcedure = 1106, + ///The number of parameters provided for the specified procedure is incorrect. + ///ER_WRONG_PARAMCOUNT_TO_PROCEDURE + WrongParameterCountToProcedure = 1107, + ///The parameters provided for the specified procedure are incorrect. + ///ER_WRONG_PARAMETERS_TO_PROCEDURE + WrongParametersToProcedure = 1108, + ///The specified table is unknown. + ///ER_UNKNOWN_TABLE + UnknownTable = 1109, + ///The specified column has been specified twice. + ///ER_FIELD_SPECIFIED_TWICE + FieldSpecifiedTwice = 1110, + ///The group function has been incorrectly used. + ///ER_INVALID_GROUP_FUNC_USE + InvalidGroupFunctionUse = 1111, + ///The specified table uses an extension that doesn't exist in this MySQL version. + ///ER_UNSUPPORTED_EXTENSION + UnsupportedExtenstion = 1112, + ///The table must have at least one column. + ///ER_TABLE_MUST_HAVE_COLUMNS + TableMustHaveColumns = 1113, + ///The specified table is full. + ///ER_RECORD_FILE_FULL + RecordFileFull = 1114, + ///The specified character set is unknown. + ///ER_UNKNOWN_CHARACTER_SET + UnknownCharacterSet = 1115, + ///Too many tables, MySQL can only use the specified number of tables in a JOIN. + ///ER_TOO_MANY_TABLES + TooManyTables = 1116, + ///Too many columns + ///ER_TOO_MANY_FIELDS + TooManyFields = 1117, + ///The row size is too large, the maximum row size for the used tables (not counting BLOBS) is specified, change some columns or BLOBS. + ///ER_TOO_BIG_ROWSIZE + TooBigRowSize = 1118, + ///A thread stack overrun occurred. Stack statistics are specified. + ///ER_STACK_OVERRUN + StackOverrun = 1119, + ///A cross dependency was found in the OUTER JOIN, examine the ON conditions. + ///ER_WRONG_OUTER_JOIN + WrongOuterJoin = 1120, + ///The table handler doesn't support NULL in the given index, change specified column to be NOT NULL or use another handler. + ///ER_NULL_COLUMN_IN_INDEX + NullColumnInIndex = 1121, + ///The specified user defined function cannot be loaded. + ///ER_CANT_FIND_UDF + CannotFindUDF = 1122, + ///The specified user defined function cannot be initialised. + ///ER_CANT_INITIALIZE_UDF + CannotInitializeUDF = 1123, + ///No paths are allowed for the shared library. + ///ER_UDF_NO_PATHS + UDFNoPaths = 1124, + ///The specified user defined function already exists. + ///ER_UDF_EXISTS + UDFExists = 1125, + ///The specified shared library cannot be opened. + ///ER_CANT_OPEN_LIBRARY + CannotOpenLibrary = 1126, + ///The specified symbol cannot be found in the library. + ///ER_CANT_FIND_DL_ENTRY + CannotFindDLEntry = 1127, + ///The specified function is not defined. + ///ER_FUNCTION_NOT_DEFINED + FunctionNotDefined = 1128, + ///The specified host is blocked because of too many connection errors, unblock with 'mysqladmin flush-hosts'. + ///ER_HOST_IS_BLOCKED + HostIsBlocked = 1129, + /// + /// The given host is not allowed to connect + /// + HostNotPrivileged = 1130, + /// + /// The anonymous user is not allowed to connect + /// + AnonymousUser = 1131, + /// + /// The given password is not allowed + /// + PasswordNotAllowed = 1132, + /// + /// The given password does not match + /// + PasswordNoMatch = 1133, + ///Information returned by an UPDATE statement. + ///ER_UPDATE_INFO + UpdateInfo = 1134, + ///A new thread couldn't be created. + ///ER_CANT_CREATE_THREAD + CannotCreateThread = 1135, + ///The column count doesn't match the value count. + ///ER_WRONG_VALUE_COUNT_ON_ROW + WrongValueCountOnRow = 1136, + ///The specified table can't be re-opened. + ///ER_CANT_REOPEN_TABLE + CannotReopenTable = 1137, + ///The NULL value has been used incorrectly. + ///ER_INVALID_USE_OF_NULL + InvalidUseOfNull = 1138, + ///The regular expression contains an error. + ///ER_REGEXP_ERROR + RegExpError = 1139, + ///GROUP columns (MIN(), MAX(), COUNT(), ...) cannot be mixes with no GROUP columns if there is not GROUP BY clause. + ///ER_MIX_OF_GROUP_FUNC_AND_FIELDS + MixOfGroupFunctionAndFields = 1140, + /// + ///ER_NONEXISTING_GRANT + NonExistingGrant = 1141, + /// + ///ER_TABLEACCESS_DENIED_ERROR + TableAccessDenied = 1142, + /// + ///ER_COLUMNACCESS_DENIED_ERROR + ColumnAccessDenied = 1143, + /// + ///ER_ILLEGAL_GRANT_FOR_TABLE + IllegalGrantForTable = 1144, + /// + ///ER_GRANT_WRONG_HOST_OR_USER + GrantWrongHostOrUser = 1145, + /// + ///ER_NO_SUCH_TABLE + NoSuchTable = 1146, + /// + ///ER_NONEXISTING_TABLE_GRANT + NonExistingTableGrant = 1147, + /// + ///ER_NOT_ALLOWED_COMMAND + NotAllowedCommand = 1148, + /// + ///ER_SYNTAX_ERROR + SyntaxError = 1149, + /// + ///ER_DELAYED_CANT_CHANGE_LOCK + DelayedCannotChangeLock = 1150, + /// + ///ER_TOO_MANY_DELAYED_THREADS + TooManyDelayedThreads = 1151, + /// + ///ER_ABORTING_CONNECTION + AbortingConnection = 1152, + /// + /// An attempt was made to send or receive a packet larger than + /// max_allowed_packet_size + /// + PacketTooLarge = 1153, + /// + ///ER_NET_READ_ERROR_FROM_PIPE + NetReadErrorFromPipe = 1154, + /// + ///ER_NET_FCNTL_ERROR + NetFCntlError = 1155, + /// + ///ER_NET_PACKETS_OUT_OF_ORDER + NetPacketsOutOfOrder = 1156, + /// + ///ER_NET_UNCOMPRESS_ERROR + NetUncompressError = 1157, + /// + ///ER_NET_READ_ERROR + NetReadError = 1158, + /// + ///ER_NET_READ_INTERRUPTED + NetReadInterrupted = 1159, + /// + ///ER_NET_ERROR_ON_WRITE + NetErrorOnWrite = 1160, + /// + ///ER_NET_WRITE_INTERRUPTED + NetWriteInterrupted = 1161, + /// + ///ER_TOO_LONG_STRING + TooLongString = 1162, + /// + ///ER_TABLE_CANT_HANDLE_BLOB + TableCannotHandleBlob = 1163, + /// + ///ER_TABLE_CANT_HANDLE_AUTO_INCREMENT + TableCannotHandleAutoIncrement = 1164, + /// + ///ER_DELAYED_INSERT_TABLE_LOCKED + DelayedInsertTableLocked = 1165, + /// + ///ER_WRONG_COLUMN_NAME + WrongColumnName = 1166, + /// + ///ER_WRONG_KEY_COLUMN + WrongKeyColumn = 1167, + /// + ///ER_WRONG_MRG_TABLE + WrongMergeTable = 1168, + /// + ///ER_DUP_UNIQUE + DuplicateUnique = 1169, + /// + ///ER_BLOB_KEY_WITHOUT_LENGTH + BlobKeyWithoutLength = 1170, + /// + ///ER_PRIMARY_CANT_HAVE_NULL + PrimaryCannotHaveNull = 1171, + /// + ///ER_TOO_MANY_ROWS + TooManyRows = 1172, + /// + ///ER_REQUIRES_PRIMARY_KEY + RequiresPrimaryKey = 1173, + /// + ///ER_NO_RAID_COMPILED + NoRAIDCompiled = 1174, + /// + ///ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE + UpdateWithoutKeysInSafeMode = 1175, + /// + ///ER_KEY_DOES_NOT_EXITS + KeyDoesNotExist = 1176, + /// + ///ER_CHECK_NO_SUCH_TABLE + CheckNoSuchTable = 1177, + /// + ///ER_CHECK_NOT_IMPLEMENTED + CheckNotImplemented = 1178, + /// + ///ER_CANT_DO_THIS_DURING_AN_TRANSACTION + CannotDoThisDuringATransaction = 1179, + /// + ///ER_ERROR_DURING_COMMIT + ErrorDuringCommit = 1180, + /// + ///ER_ERROR_DURING_ROLLBACK + ErrorDuringRollback = 1181, + /// + ///ER_ERROR_DURING_FLUSH_LOGS + ErrorDuringFlushLogs = 1182, + /// + ///ER_ERROR_DURING_CHECKPOINT + ErrorDuringCheckpoint = 1183, + /// + ///ER_NEW_ABORTING_CONNECTION + NewAbortingConnection = 1184, + /// + ///ER_DUMP_NOT_IMPLEMENTED + DumpNotImplemented = 1185, + /// + ///ER_FLUSH_SOURCE_BINLOG_CLOSED + FlushSourceBinLogClosed = 1186, + /// + ///ER_INDEX_REBUILD + IndexRebuild = 1187, + /// + ///ER_SOURCE + SourceError = 1188, + /// + ///ER_SOURCE_NET_READ + SourceNetRead = 1189, + /// + ///ER_SOURCE_NET_WRITE + SourceNetWrite = 1190, + /// + ///ER_FT_MATCHING_KEY_NOT_FOUND + FullTextMatchingKeyNotFound = 1191, + /// + ///ER_LOCK_OR_ACTIVE_TRANSACTION + LockOrActiveTransaction = 1192, + /// + ///ER_UNKNOWN_SYSTEM_VARIABLE + UnknownSystemVariable = 1193, + /// + ///ER_CRASHED_ON_USAGE + CrashedOnUsage = 1194, + /// + ///ER_CRASHED_ON_REPAIR + CrashedOnRepair = 1195, + /// + ///ER_WARNING_NOT_COMPLETE_ROLLBACK + WarningNotCompleteRollback = 1196, + /// + ///ER_TRANS_CACHE_FULL + TransactionCacheFull = 1197, + /// + ///ER_REPLICA_MUST_STOP + ReplicaMustStop = 1198, + /// + ///ER_REPLICA_NOT_RUNNING + ReplicaNotRunning = 1199, + /// + ///ER_BAD_REPLICA + BadReplica = 1200, + /// + ///ER_SOURCE_INFO + SourceInfo = 1201, + /// + ///ER_REPLICA_THREAD + ReplicaThread = 1202, + /// + ///ER_TOO_MANY_USER_CONNECTIONS + TooManyUserConnections = 1203, + /// + ///ER_SET_CONSTANTS_ONLY + SetConstantsOnly = 1204, + /// + ///ER_LOCK_WAIT_TIMEOUT + LockWaitTimeout = 1205, + /// + ///ER_LOCK_TABLE_FULL + LockTableFull = 1206, + /// + ///ER_READ_ONLY_TRANSACTION + ReadOnlyTransaction = 1207, + /// + ///ER_DROP_DB_WITH_READ_LOCK + DropDatabaseWithReadLock = 1208, + /// + ///ER_CREATE_DB_WITH_READ_LOCK + CreateDatabaseWithReadLock = 1209, + /// + ///ER_WRONG_ARGUMENTS + WrongArguments = 1210, + /// + ///ER_NO_PERMISSION_TO_CREATE_USER + NoPermissionToCreateUser = 1211, + /// + ///ER_UNION_TABLES_IN_DIFFERENT_DIR + UnionTablesInDifferentDirectory = 1212, + /// + ///ER_LOCK_DEADLOCK + LockDeadlock = 1213, + /// + ///ER_TABLE_CANT_HANDLE_FT + TableCannotHandleFullText = 1214, + /// + ///ER_CANNOT_ADD_FOREIGN + CannotAddForeignConstraint = 1215, + /// + ///ER_NO_REFERENCED_ROW + NoReferencedRow = 1216, + /// + ///ER_ROW_IS_REFERENCED + RowIsReferenced = 1217, + /// + ///ER_CONNECT_TO_SOURCE + ConnectToSource = 1218, + /// + ///ER_QUERY_ON_SOURCE + QueryOnSource = 1219, + /// + ///ER_ERROR_WHEN_EXECUTING_COMMAND + ErrorWhenExecutingCommand = 1220, + /// + ///ER_WRONG_USAGE + WrongUsage = 1221, + /// + ///ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT + WrongNumberOfColumnsInSelect = 1222, + /// + ///ER_CANT_UPDATE_WITH_READLOCK + CannotUpdateWithReadLock = 1223, + /// + ///ER_MIXING_NOT_ALLOWED + MixingNotAllowed = 1224, + /// + ///ER_DUP_ARGUMENT + DuplicateArgument = 1225, + /// + ///ER_USER_LIMIT_REACHED + UserLimitReached = 1226, + /// + ///ER_SPECIFIC_ACCESS_DENIED_ERROR + SpecifiedAccessDeniedError = 1227, + /// + ///ER_LOCAL_VARIABLE + LocalVariableError = 1228, + /// + ///ER_GLOBAL_VARIABLE + GlobalVariableError = 1229, + /// + ///ER_NO_DEFAULT + NotDefaultError = 1230, + /// + ///ER_WRONG_VALUE_FOR_VAR + WrongValueForVariable = 1231, + /// + ///ER_WRONG_TYPE_FOR_VAR + WrongTypeForVariable = 1232, + /// + ///ER_VAR_CANT_BE_READ + VariableCannotBeRead = 1233, + /// + ///ER_CANT_USE_OPTION_HERE + CannotUseOptionHere = 1234, + /// + ///ER_NOT_SUPPORTED_YET + NotSupportedYet = 1235, + /// + ///ER_SOURCE_FATAL_ERROR_READING_BINLOG + SourceFatalErrorReadingBinLog = 1236, + /// + ///ER_REPLICA_IGNORED_TABLE + ReplicaIgnoredTable = 1237, + /// + ///ER_INCORRECT_GLOBAL_LOCAL_VAR + IncorrectGlobalLocalVariable = 1238, + /// + ///ER_WRONG_FK_DEF + WrongForeignKeyDefinition = 1239, + /// + ///ER_KEY_REF_DO_NOT_MATCH_TABLE_REF + KeyReferenceDoesNotMatchTableReference = 1240, + /// + ///ER_OPERAND_COLUMNS + OpearnColumnsError = 1241, + /// + ///ER_SUBQUERY_NO_1_ROW + SubQueryNoOneRow = 1242, + /// + ///ER_UNKNOWN_STMT_HANDLER + UnknownStatementHandler = 1243, + /// + ///ER_CORRUPT_HELP_DB + CorruptHelpDatabase = 1244, + /// + ///ER_CYCLIC_REFERENCE + CyclicReference = 1245, + /// + ///ER_AUTO_CONVERT + AutoConvert = 1246, + /// + ///ER_ILLEGAL_REFERENCE + IllegalReference = 1247, + /// + ///ER_DERIVED_MUST_HAVE_ALIAS + DerivedMustHaveAlias = 1248, + /// + ///ER_SELECT_REDUCED + SelectReduced = 1249, + /// + ///ER_TABLENAME_NOT_ALLOWED_HERE + TableNameNotAllowedHere = 1250, + /// + ///ER_NOT_SUPPORTED_AUTH_MODE + NotSupportedAuthMode = 1251, + /// + ///ER_SPATIAL_CANT_HAVE_NULL + SpatialCannotHaveNull = 1252, + /// + ///ER_COLLATION_CHARSET_MISMATCH + CollationCharsetMismatch = 1253, + /// + ///ER_REPLICA_WAS_RUNNING + ReplicaWasRunning = 1254, + /// + ///ER_REPLICA_WAS_NOT_RUNNING + ReplicaWasNotRunning = 1255, + /// + ///ER_TOO_BIG_FOR_UNCOMPRESS + TooBigForUncompress = 1256, + /// + ///ER_ZLIB_Z_MEM_ERROR + ZipLibMemoryError = 1257, + /// + ///ER_ZLIB_Z_BUF_ERROR + ZipLibBufferError = 1258, + /// + ///ER_ZLIB_Z_DATA_ERROR + ZipLibDataError = 1259, + /// + ///ER_CUT_VALUE_GROUP_CONCAT + CutValueGroupConcat = 1260, + /// + ///ER_WARN_TOO_FEW_RECORDS + WarningTooFewRecords = 1261, + /// + ///ER_WARN_TOO_MANY_RECORDS + WarningTooManyRecords = 1262, + /// + ///ER_WARN_NULL_TO_NOTNULL + WarningNullToNotNull = 1263, + /// + ///ER_WARN_DATA_OUT_OF_RANGE + WarningDataOutOfRange = 1264, + /// + ///WARN_DATA_TRUNCATED + WaningDataTruncated = 1265, + /// + ///ER_WARN_USING_OTHER_HANDLER + WaningUsingOtherHandler = 1266, + /// + ///ER_CANT_AGGREGATE_2COLLATIONS + CannotAggregateTwoCollations = 1267, + /// + ///ER_DROP_USER + DropUserError = 1268, + /// + ///ER_REVOKE_GRANTS + RevokeGrantsError = 1269, + /// + ///ER_CANT_AGGREGATE_3COLLATIONS + CannotAggregateThreeCollations = 1270, + /// + ///ER_CANT_AGGREGATE_NCOLLATIONS + CannotAggregateNCollations = 1271, + /// + ///ER_VARIABLE_IS_NOT_STRUCT + VariableIsNotStructure = 1272, + /// + ///ER_UNKNOWN_COLLATION + UnknownCollation = 1273, + /// + ///ER_REPLICA_IGNORED_SSL_PARAMS + ReplicaIgnoreSSLParameters = 1274, + /// + ///ER_SERVER_IS_IN_SECURE_AUTH_MODE + ServerIsInSecureAuthMode = 1275, + /// + ///ER_WARN_FIELD_RESOLVED + WaningFieldResolved = 1276, + /// + ///ER_BAD_REPLICA_UNTIL_COND + BadReplicaUntilCondition = 1277, + /// + ///ER_MISSING_SKIP_REPLICA + MissingSkipReplica = 1278, + /// + ///ER_UNTIL_COND_IGNORED + ErrorUntilConditionIgnored = 1279, + /// + ///ER_WRONG_NAME_FOR_INDEX + WrongNameForIndex = 1280, + /// + ///ER_WRONG_NAME_FOR_CATALOG + WrongNameForCatalog = 1281, + /// + ///ER_WARN_QC_RESIZE + WarningQueryCacheResize = 1282, + /// + ///ER_BAD_FT_COLUMN + BadFullTextColumn = 1283, + /// + ///ER_UNKNOWN_KEY_CACHE + UnknownKeyCache = 1284, + /// + ///ER_WARN_HOSTNAME_WONT_WORK + WarningHostnameWillNotWork = 1285, + /// + ///ER_UNKNOWN_STORAGE_ENGINE + UnknownStorageEngine = 1286, + /// + ///ER_WARN_DEPRECATED_SYNTAX + WaningDeprecatedSyntax = 1287, + /// + ///ER_NON_UPDATABLE_TABLE + NonUpdateableTable = 1288, + /// + ///ER_FEATURE_DISABLED + FeatureDisabled = 1289, + /// + ///ER_OPTION_PREVENTS_STATEMENT + OptionPreventsStatement = 1290, + /// + ///ER_DUPLICATED_VALUE_IN_TYPE + DuplicatedValueInType = 1291, + /// + ///ER_TRUNCATED_WRONG_VALUE + TruncatedWrongValue = 1292, + /// + ///ER_TOO_MUCH_AUTO_TIMESTAMP_COLS + TooMuchAutoTimestampColumns = 1293, + /// + ///ER_INVALID_ON_UPDATE + InvalidOnUpdate = 1294, + /// + ///ER_UNSUPPORTED_PS + UnsupportedPreparedStatement = 1295, + /// + ///ER_GET_ERRMSG + GetErroMessage = 1296, + /// + ///ER_GET_TEMPORARY_ERRMSG + GetTemporaryErrorMessage = 1297, + /// + ///ER_UNKNOWN_TIME_ZONE + UnknownTimeZone = 1298, + /// + ///ER_WARN_INVALID_TIMESTAMP + WarningInvalidTimestamp = 1299, + /// + ///ER_INVALID_CHARACTER_STRING + InvalidCharacterString = 1300, + /// + ///ER_WARN_ALLOWED_PACKET_OVERFLOWED + WarningAllowedPacketOverflowed = 1301, + /// + ///ER_CONFLICTING_DECLARATIONS + ConflictingDeclarations = 1302, + /// + ///ER_SP_NO_RECURSIVE_CREATE + StoredProcedureNoRecursiveCreate = 1303, + /// + ///ER_SP_ALREADY_EXISTS + StoredProcedureAlreadyExists = 1304, + /// + ///ER_SP_DOES_NOT_EXIST + StoredProcedureDoesNotExist = 1305, + /// + ///ER_SP_DROP_FAILED + StoredProcedureDropFailed = 1306, + /// + ///ER_SP_STORE_FAILED + StoredProcedureStoreFailed = 1307, + /// + ///ER_SP_LILABEL_MISMATCH + StoredProcedureLiLabelMismatch = 1308, + /// + ///ER_SP_LABEL_REDEFINE + StoredProcedureLabelRedefine = 1309, + /// + ///ER_SP_LABEL_MISMATCH + StoredProcedureLabelMismatch = 1310, + /// + ///ER_SP_UNINIT_VAR + StoredProcedureUninitializedVariable = 1311, + /// + ///ER_SP_BADSELECT + StoredProcedureBadSelect = 1312, + /// + ///ER_SP_BADRETURN + StoredProcedureBadReturn = 1313, + /// + ///ER_SP_BADSTATEMENT + StoredProcedureBadStatement = 1314, + /// + ///ER_UPDATE_LOG_DEPRECATED_IGNORED + UpdateLogDeprecatedIgnored = 1315, + /// + ///ER_UPDATE_LOG_DEPRECATED_TRANSLATED + UpdateLogDeprecatedTranslated = 1316, + /// + ///ER_QUERY_INTERRUPTED + QueryInterrupted = 1317, + /// + ///ER_SP_WRONG_NO_OF_ARGS + StoredProcedureNumberOfArguments = 1318, + /// + ///ER_SP_COND_MISMATCH + StoredProcedureConditionMismatch = 1319, + /// + ///ER_SP_NORETURN + StoredProcedureNoReturn = 1320, + /// + ///ER_SP_NORETURNEND + StoredProcedureNoReturnEnd = 1321, + /// + ///ER_SP_BAD_CURSOR_QUERY + StoredProcedureBadCursorQuery = 1322, + /// + ///ER_SP_BAD_CURSOR_SELECT + StoredProcedureBadCursorSelect = 1323, + /// + ///ER_SP_CURSOR_MISMATCH + StoredProcedureCursorMismatch = 1324, + /// + ///ER_SP_CURSOR_ALREADY_OPEN + StoredProcedureAlreadyOpen = 1325, + /// + ///ER_SP_CURSOR_NOT_OPEN + StoredProcedureCursorNotOpen = 1326, + /// + ///ER_SP_UNDECLARED_VAR + StoredProcedureUndeclaredVariabel = 1327, + /// + ///ER_SP_WRONG_NO_OF_FETCH_ARGS + StoredProcedureWrongNumberOfFetchArguments = 1328, + /// + ///ER_SP_FETCH_NO_DATA + StoredProcedureFetchNoData = 1329, + /// + ///ER_SP_DUP_PARAM + StoredProcedureDuplicateParameter = 1330, + /// + ///ER_SP_DUP_VAR + StoredProcedureDuplicateVariable = 1331, + /// + ///ER_SP_DUP_COND + StoredProcedureDuplicateCondition = 1332, + /// + ///ER_SP_DUP_CURS + StoredProcedureDuplicateCursor = 1333, + /// + ///ER_SP_CANT_ALTER + StoredProcedureCannotAlter = 1334, + /// + ///ER_SP_SUBSELECT_NYI + StoredProcedureSubSelectNYI = 1335, + /// + ///ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG + StatementNotAllowedInStoredFunctionOrTrigger = 1336, + /// + ///ER_SP_VARCOND_AFTER_CURSHNDLR + StoredProcedureVariableConditionAfterCursorHandler = 1337, + /// + ///ER_SP_CURSOR_AFTER_HANDLER + StoredProcedureCursorAfterHandler = 1338, + /// + ///ER_SP_CASE_NOT_FOUND + StoredProcedureCaseNotFound = 1339, + /// + ///ER_FPARSER_TOO_BIG_FILE + FileParserTooBigFile = 1340, + /// + ///ER_FPARSER_BAD_HEADER + FileParserBadHeader = 1341, + /// + ///ER_FPARSER_EOF_IN_COMMENT + FileParserEOFInComment = 1342, + /// + ///ER_FPARSER_ERROR_IN_PARAMETER + FileParserErrorInParameter = 1343, + /// + ///ER_FPARSER_EOF_IN_UNKNOWN_PARAMETER + FileParserEOFInUnknownParameter = 1344, + /// + ///ER_VIEW_NO_EXPLAIN + ViewNoExplain = 1345, + /// + ///ER_FRM_UNKNOWN_TYPE + FrmUnknownType = 1346, + /// + ///ER_WRONG_OBJECT + WrongObject = 1347, + /// + ///ER_NONUPDATEABLE_COLUMN + NonUpdateableColumn = 1348, + /// + ///ER_VIEW_SELECT_DERIVED + ViewSelectDerived = 1349, + /// + ///ER_VIEW_SELECT_CLAUSE + ViewSelectClause = 1350, + /// + ///ER_VIEW_SELECT_VARIABLE + ViewSelectVariable = 1351, + /// + ///ER_VIEW_SELECT_TMPTABLE + ViewSelectTempTable = 1352, + /// + ///ER_VIEW_WRONG_LIST + ViewWrongList = 1353, + /// + ///ER_WARN_VIEW_MERGE + WarningViewMerge = 1354, + /// + ///ER_WARN_VIEW_WITHOUT_KEY + WarningViewWithoutKey = 1355, + /// + ///ER_VIEW_INVALID + ViewInvalid = 1356, + /// + ///ER_SP_NO_DROP_SP + StoredProcedureNoDropStoredProcedure = 1357, + /// + ///ER_SP_GOTO_IN_HNDLR + StoredProcedureGotoInHandler = 1358, + /// + ///ER_TRG_ALREADY_EXISTS + TriggerAlreadyExists = 1359, + /// + ///ER_TRG_DOES_NOT_EXIST + TriggerDoesNotExist = 1360, + /// + ///ER_TRG_ON_VIEW_OR_TEMP_TABLE + TriggerOnViewOrTempTable = 1361, + /// + ///ER_TRG_CANT_CHANGE_ROW + TriggerCannotChangeRow = 1362, + /// + ///ER_TRG_NO_SUCH_ROW_IN_TRG + TriggerNoSuchRowInTrigger = 1363, + /// + ///ER_NO_DEFAULT_FOR_FIELD + NoDefaultForField = 1364, + /// + ///ER_DIVISION_BY_ZERO + DivisionByZero = 1365, + /// + ///ER_TRUNCATED_WRONG_VALUE_FOR_FIELD + TruncatedWrongValueForField = 1366, + /// + ///ER_ILLEGAL_VALUE_FOR_TYPE + IllegalValueForType = 1367, + /// + ///ER_VIEW_NONUPD_CHECK + ViewNonUpdatableCheck = 1368, + /// + ///ER_VIEW_CHECK_FAILED + ViewCheckFailed = 1369, + /// + ///ER_PROCACCESS_DENIED_ERROR + PrecedureAccessDenied = 1370, + /// + ///ER_RELAY_LOG_FAIL + RelayLogFail = 1371, + /// + ///ER_PASSWD_LENGTH + PasswordLength = 1372, + /// + ///ER_UNKNOWN_TARGET_BINLOG + UnknownTargetBinLog = 1373, + /// + ///ER_IO_ERR_LOG_INDEX_READ + IOErrorLogIndexRead = 1374, + /// + ///ER_BINLOG_PURGE_PROHIBITED + BinLogPurgeProhibited = 1375, + /// + ///ER_FSEEK_FAIL + FSeekFail = 1376, + /// + ///ER_BINLOG_PURGE_FATAL_ERR + BinLogPurgeFatalError = 1377, + /// + ///ER_LOG_IN_USE + LogInUse = 1378, + /// + ///ER_LOG_PURGE_UNKNOWN_ERR + LogPurgeUnknownError = 1379, + /// + ///ER_RELAY_LOG_INIT + RelayLogInit = 1380, + /// + ///ER_NO_BINARY_LOGGING + NoBinaryLogging = 1381, + /// + ///ER_RESERVED_SYNTAX + ReservedSyntax = 1382, + /// + ///ER_WSAS_FAILED + WSAStartupFailed = 1383, + /// + ///ER_DIFF_GROUPS_PROC + DifferentGroupsProcedure = 1384, + /// + ///ER_NO_GROUP_FOR_PROC + NoGroupForProcedure = 1385, + /// + ///ER_ORDER_WITH_PROC + OrderWithProcedure = 1386, + /// + ///ER_LOGGING_PROHIBIT_CHANGING_OF + LoggingProhibitsChangingOf = 1387, + /// + ///ER_NO_FILE_MAPPING + NoFileMapping = 1388, + /// + ///ER_WRONG_MAGIC + WrongMagic = 1389, + /// + ///ER_PS_MANY_PARAM + PreparedStatementManyParameters = 1390, + /// + ///ER_KEY_PART_0 + KeyPartZero = 1391, + /// + ///ER_VIEW_CHECKSUM + ViewChecksum = 1392, + /// + ///ER_VIEW_MULTIUPDATE + ViewMultiUpdate = 1393, + /// + ///ER_VIEW_NO_INSERT_FIELD_LIST + ViewNoInsertFieldList = 1394, + /// + ///ER_VIEW_DELETE_MERGE_VIEW + ViewDeleteMergeView = 1395, + /// + ///ER_CANNOT_USER + CannotUser = 1396, + /// + ///ER_XAER_NOTA + XAERNotA = 1397, + /// + ///ER_XAER_INVAL + XAERInvalid = 1398, + /// + ///ER_XAER_RMFAIL + XAERRemoveFail = 1399, + /// + ///ER_XAER_OUTSIDE + XAEROutside = 1400, + /// + ///ER_XAER_RMERR + XAERRemoveError = 1401, + /// + ///ER_XA_RBROLLBACK + XARBRollback = 1402, + /// + ///ER_NONEXISTING_PROC_GRANT + NonExistingProcedureGrant = 1403, + /// + ///ER_PROC_AUTO_GRANT_FAIL + ProcedureAutoGrantFail = 1404, + /// + ///ER_PROC_AUTO_REVOKE_FAIL + ProcedureAutoRevokeFail = 1405, + /// + ///ER_DATA_TOO_LONG + DataTooLong = 1406, + /// + ///ER_SP_BAD_SQLSTATE + StoredProcedureSQLState = 1407, + /// + ///ER_STARTUP + StartupError = 1408, + /// + ///ER_LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR + LoadFromFixedSizeRowsToVariable = 1409, + /// + ///ER_CANT_CREATE_USER_WITH_GRANT + CannotCreateUserWithGrant = 1410, + /// + ///ER_WRONG_VALUE_FOR_TYPE + WrongValueForType = 1411, + /// + ///ER_TABLE_DEF_CHANGED + TableDefinitionChanged = 1412, + /// + ///ER_SP_DUP_HANDLER + StoredProcedureDuplicateHandler = 1413, + /// + ///ER_SP_NOT_VAR_ARG + StoredProcedureNotVariableArgument = 1414, + /// + ///ER_SP_NO_RETSET + StoredProcedureNoReturnSet = 1415, + /// + ///ER_CANT_CREATE_GEOMETRY_OBJECT + CannotCreateGeometryObject = 1416, + /// + ///ER_FAILED_ROUTINE_BREAK_BINLOG + FailedRoutineBreaksBinLog = 1417, + /// + ///ER_BINLOG_UNSAFE_ROUTINE + BinLogUnsafeRoutine = 1418, + /// + ///ER_BINLOG_CREATE_ROUTINE_NEED_SUPER + BinLogCreateRoutineNeedSuper = 1419, + /// + ///ER_EXEC_STMT_WITH_OPEN_CURSOR + ExecuteStatementWithOpenCursor = 1420, + /// + ///ER_STMT_HAS_NO_OPEN_CURSOR + StatementHasNoOpenCursor = 1421, + /// + ///ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG + CommitNotAllowedIfStoredFunctionOrTrigger = 1422, + /// + ///ER_NO_DEFAULT_FOR_VIEW_FIELD + NoDefaultForViewField = 1423, + /// + ///ER_SP_NO_RECURSION + StoredProcedureNoRecursion = 1424, + /// + ///ER_TOO_BIG_SCALE + TooBigScale = 1425, + /// + ///ER_TOO_BIG_PRECISION + TooBigPrecision = 1426, + /// + ///ER_M_BIGGER_THAN_D + MBiggerThanD = 1427, + /// + ///ER_WRONG_LOCK_OF_SYSTEM_TABLE + WrongLockOfSystemTable = 1428, + /// + ///ER_CONNECT_TO_FOREIGN_DATA_SOURCE + ConnectToForeignDataSource = 1429, + /// + ///ER_QUERY_ON_FOREIGN_DATA_SOURCE + QueryOnForeignDataSource = 1430, + /// + ///ER_FOREIGN_DATA_SOURCE_DOESNT_EXIST + ForeignDataSourceDoesNotExist = 1431, + /// + ///ER_FOREIGN_DATA_STRING_INVALID_CANT_CREATE + ForeignDataStringInvalidCannotCreate = 1432, + /// + ///ER_FOREIGN_DATA_STRING_INVALID + ForeignDataStringInvalid = 1433, + /// + ///ER_CANT_CREATE_FEDERATED_TABLE + CannotCreateFederatedTable = 1434, + /// + ///ER_TRG_IN_WRONG_SCHEMA + TriggerInWrongSchema = 1435, + /// + ///ER_STACK_OVERRUN_NEED_MORE + StackOverrunNeedMore = 1436, + /// + ///ER_TOO_LONG_BODY + TooLongBody = 1437, + /// + ///ER_WARN_CANT_DROP_DEFAULT_KEYCACHE + WarningCannotDropDefaultKeyCache = 1438, + /// + ///ER_TOO_BIG_DISPLAYWIDTH + TooBigDisplayWidth = 1439, + /// + ///ER_XAER_DUPID + XAERDuplicateID = 1440, + /// + ///ER_DATETIME_FUNCTION_OVERFLOW + DateTimeFunctionOverflow = 1441, + /// + ///ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG + CannotUpdateUsedTableInStoredFunctionOrTrigger = 1442, + /// + ///ER_VIEW_PREVENT_UPDATE + ViewPreventUpdate = 1443, + /// + ///ER_PS_NO_RECURSION + PreparedStatementNoRecursion = 1444, + /// + ///ER_SP_CANT_SET_AUTOCOMMIT + StoredProcedureCannotSetAutoCommit = 1445, + /// + ///ER_MALFORMED_DEFINER + MalformedDefiner = 1446, + /// + ///ER_VIEW_FRM_NO_USER + ViewFrmNoUser = 1447, + /// + ///ER_VIEW_OTHER_USER + ViewOtherUser = 1448, + /// + ///ER_NO_SUCH_USER + NoSuchUser = 1449, + /// + ///ER_FORBID_SCHEMA_CHANGE + ForbidSchemaChange = 1450, + /// + ///ER_ROW_IS_REFERENCED_2 + RowIsReferenced2 = 1451, + /// + ///ER_NO_REFERENCED_ROW_2 + NoReferencedRow2 = 1452, + /// + ///ER_SP_BAD_VAR_SHADOW + StoredProcedureBadVariableShadow = 1453, + /// + ///ER_TRG_NO_DEFINER + TriggerNoDefiner = 1454, + /// + ///ER_OLD_FILE_FORMAT + OldFileFormat = 1455, + /// + ///ER_SP_RECURSION_LIMIT + StoredProcedureRecursionLimit = 1456, + /// + ///ER_SP_PROC_TABLE_CORRUPT + StoredProcedureTableCorrupt = 1457, + /// + ///ER_SP_WRONG_NAME + StoredProcedureWrongName = 1458, + /// + ///ER_TABLE_NEEDS_UPGRADE + TableNeedsUpgrade = 1459, + /// + ///ER_SP_NO_AGGREGATE + StoredProcedureNoAggregate = 1460, + /// + ///ER_MAX_PREPARED_STMT_COUNT_REACHED + MaxPreparedStatementCountReached = 1461, + /// + ///ER_VIEW_RECURSIVE + ViewRecursive = 1462, + /// + ///ER_NON_GROUPING_FIELD_USED + NonGroupingFieldUsed = 1463, + /// + ///ER_TABLE_CANT_HANDLE_SPKEYS + TableCannotHandleSpatialKeys = 1464, + /// + ///ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA + NoTriggersOnSystemSchema = 1465, + /// + ///ER_REMOVED_SPACES + RemovedSpaces = 1466, + /// + ///ER_AUTOINC_READ_FAILED + AutoIncrementReadFailed = 1467, + /// + ///ER_USERNAME + UserNameError = 1468, + /// + ///ER_HOSTNAME + HostNameError = 1469, + /// + ///ER_WRONG_STRING_LENGTH + WrongStringLength = 1470, + /// + ///ER_NON_INSERTABLE_TABLE + NonInsertableTable = 1471, + /// + ///ER_ADMIN_WRONG_MRG_TABLE + AdminWrongMergeTable = 1472, + /// + ///ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT + TooHighLevelOfNestingForSelect = 1473, + /// + ///ER_NAME_BECOMES_EMPTY + NameBecomesEmpty = 1474, + /// + ///ER_AMBIGUOUS_FIELD_TERM + AmbiguousFieldTerm = 1475, + /// + ///ER_FOREIGN_SERVER_EXISTS + ForeignServerExists = 1476, + /// + ///ER_FOREIGN_SERVER_DOESNT_EXIST + ForeignServerDoesNotExist = 1477, + /// + ///ER_ILLEGAL_HA_CREATE_OPTION + IllegalHACreateOption = 1478, + /// + ///ER_PARTITION_REQUIRES_VALUES_ERROR + PartitionRequiresValues = 1479, + /// + ///ER_PARTITION_WRONG_VALUES_ERROR + PartitionWrongValues = 1480, + /// + ///ER_PARTITION_MAXVALUE_ERROR + PartitionMaxValue = 1481, + /// + ///ER_PARTITION_SUBPARTITION_ERROR + PartitionSubPartition = 1482, + /// + ///ER_PARTITION_SUBPART_MIX_ERROR + PartitionSubPartMix = 1483, + /// + ///ER_PARTITION_WRONG_NO_PART_ERROR + PartitionWrongNoPart = 1484, + /// + ///ER_PARTITION_WRONG_NO_SUBPART_ERROR + PartitionWrongNoSubPart = 1485, + /// + ///ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR + WrongExpressionInParitionFunction = 1486, + /// + ///ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR + NoConstantExpressionInRangeOrListError = 1487, + /// + ///ER_FIELD_NOT_FOUND_PART_ERROR + FieldNotFoundPartitionErrror = 1488, + /// + ///ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR + ListOfFieldsOnlyInHash = 1489, + /// + ///ER_INCONSISTENT_PARTITION_INFO_ERROR + InconsistentPartitionInfo = 1490, + /// + ///ER_PARTITION_FUNC_NOT_ALLOWED_ERROR + PartitionFunctionNotAllowed = 1491, + /// + ///ER_PARTITIONS_MUST_BE_DEFINED_ERROR + PartitionsMustBeDefined = 1492, + /// + ///ER_RANGE_NOT_INCREASING_ERROR + RangeNotIncreasing = 1493, + /// + ///ER_INCONSISTENT_TYPE_OF_FUNCTIONS_ERROR + InconsistentTypeOfFunctions = 1494, + /// + ///ER_MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR + MultipleDefinitionsConstantInListPartition = 1495, + /// + ///ER_PARTITION_ENTRY_ERROR + PartitionEntryError = 1496, + /// + ///ER_MIX_HANDLER_ERROR + MixHandlerError = 1497, + /// + ///ER_PARTITION_NOT_DEFINED_ERROR + PartitionNotDefined = 1498, + /// + ///ER_TOO_MANY_PARTITIONS_ERROR + TooManyPartitions = 1499, + /// + ///ER_SUBPARTITION_ERROR + SubPartitionError = 1500, + /// + ///ER_CANT_CREATE_HANDLER_FILE + CannotCreateHandlerFile = 1501, + /// + ///ER_BLOB_FIELD_IN_PART_FUNC_ERROR + BlobFieldInPartitionFunction = 1502, + /// + ///ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF + UniqueKeyNeedAllFieldsInPartitioningFunction = 1503, + /// + ///ER_NO_PARTS_ERROR + NoPartitions = 1504, + /// + ///ER_PARTITION_MGMT_ON_NONPARTITIONED + PartitionManagementOnNoPartitioned = 1505, + /// + ///ER_FOREIGN_KEY_ON_PARTITIONED + ForeignKeyOnPartitioned = 1506, + /// + ///ER_DROP_PARTITION_NON_EXISTENT + DropPartitionNonExistent = 1507, + /// + ///ER_DROP_LAST_PARTITION + DropLastPartition = 1508, + /// + ///ER_COALESCE_ONLY_ON_HASH_PARTITION + CoalesceOnlyOnHashPartition = 1509, + /// + ///ER_REORG_HASH_ONLY_ON_SAME_NO + ReorganizeHashOnlyOnSameNumber = 1510, + /// + ///ER_REORG_NO_PARAM_ERROR + ReorganizeNoParameter = 1511, + /// + ///ER_ONLY_ON_RANGE_LIST_PARTITION + OnlyOnRangeListPartition = 1512, + /// + ///ER_ADD_PARTITION_SUBPART_ERROR + AddPartitionSubPartition = 1513, + /// + ///ER_ADD_PARTITION_NO_NEW_PARTITION + AddPartitionNoNewPartition = 1514, + /// + ///ER_COALESCE_PARTITION_NO_PARTITION + CoalescePartitionNoPartition = 1515, + /// + ///ER_REORG_PARTITION_NOT_EXIST + ReorganizePartitionNotExist = 1516, + /// + ///ER_SAME_NAME_PARTITION + SameNamePartition = 1517, + /// + ///ER_NO_BINLOG_ERROR + NoBinLog = 1518, + /// + ///ER_CONSECUTIVE_REORG_PARTITIONS + ConsecutiveReorganizePartitions = 1519, + /// + ///ER_REORG_OUTSIDE_RANGE + ReorganizeOutsideRange = 1520, + /// + ///ER_PARTITION_FUNCTION_FAILURE + PartitionFunctionFailure = 1521, + /// + ///ER_PART_STATE_ERROR + PartitionStateError = 1522, + /// + ///ER_LIMITED_PART_RANGE + LimitedPartitionRange = 1523, + /// + ///ER_PLUGIN_IS_NOT_LOADED + PluginIsNotLoaded = 1524, + /// + ///ER_WRONG_VALUE + WrongValue = 1525, + /// + ///ER_NO_PARTITION_FOR_GIVEN_VALUE + NoPartitionForGivenValue = 1526, + /// + ///ER_FILEGROUP_OPTION_ONLY_ONCE + FileGroupOptionOnlyOnce = 1527, + /// + ///ER_CREATE_FILEGROUP_FAILED + CreateFileGroupFailed = 1528, + /// + ///ER_DROP_FILEGROUP_FAILED + DropFileGroupFailed = 1529, + /// + ///ER_TABLESPACE_AUTO_EXTEND_ERROR + TableSpaceAutoExtend = 1530, + /// + ///ER_WRONG_SIZE_NUMBER + WrongSizeNumber = 1531, + /// + ///ER_SIZE_OVERFLOW_ERROR + SizeOverflow = 1532, + /// + ///ER_ALTER_FILEGROUP_FAILED + AlterFileGroupFailed = 1533, + /// + ///ER_BINLOG_ROW_LOGGING_FAILED + BinLogRowLogginFailed = 1534, + /// + ///ER_BINLOG_ROW_WRONG_TABLE_DEF + BinLogRowWrongTableDefinition = 1535, + /// + ///ER_BINLOG_ROW_RBR_TO_SBR + BinLogRowRBRToSBR = 1536, + /// + ///ER_EVENT_ALREADY_EXISTS + EventAlreadyExists = 1537, + /// + ///ER_EVENT_STORE_FAILED + EventStoreFailed = 1538, + /// + ///ER_EVENT_DOES_NOT_EXIST + EventDoesNotExist = 1539, + /// + ///ER_EVENT_CANT_ALTER + EventCannotAlter = 1540, + /// + ///ER_EVENT_DROP_FAILED + EventDropFailed = 1541, + /// + ///ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG + EventIntervalNotPositiveOrTooBig = 1542, + /// + ///ER_EVENT_ENDS_BEFORE_STARTS + EventEndsBeforeStarts = 1543, + /// + ///ER_EVENT_EXEC_TIME_IN_THE_PAST + EventExecTimeInThePast = 1544, + /// + ///ER_EVENT_OPEN_TABLE_FAILED + EventOpenTableFailed = 1545, + /// + ///ER_EVENT_NEITHER_M_EXPR_NOR_M_AT + EventNeitherMExpresssionNorMAt = 1546, + /// + ///ER_COL_COUNT_DOESNT_MATCH_CORRUPTED + ColumnCountDoesNotMatchCorrupted = 1547, + /// + ///ER_CANNOT_LOAD_FROM_TABLE + CannotLoadFromTable = 1548, + /// + ///ER_EVENT_CANNOT_DELETE + EventCannotDelete = 1549, + /// + ///ER_EVENT_COMPILE_ERROR + EventCompileError = 1550, + /// + ///ER_EVENT_SAME_NAME + EventSameName = 1551, + /// + ///ER_EVENT_DATA_TOO_LONG + EventDataTooLong = 1552, + /// + ///ER_DROP_INDEX_FK + DropIndexForeignKey = 1553, + /// + ///ER_WARN_DEPRECATED_SYNTAX_WITH_VER + WarningDeprecatedSyntaxWithVersion = 1554, + /// + ///ER_CANT_WRITE_LOCK_LOG_TABLE + CannotWriteLockLogTable = 1555, + /// + ///ER_CANT_LOCK_LOG_TABLE + CannotLockLogTable = 1556, + /// + ///ER_FOREIGN_DUPLICATE_KEY + ForeignDuplicateKey = 1557, + /// + ///ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE + ColumnCountDoesNotMatchPleaseUpdate = 1558, + /// + ///ER_TEMP_TABLE_PREVENTS_SWITCH_OUT_OF_RBR + TemoraryTablePreventSwitchOutOfRBR = 1559, + /// + ///ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT + StoredFunctionPreventsSwitchBinLogFormat = 1560, + /// + ///ER_NDB_CANT_SWITCH_BINLOG_FORMAT + NDBCannotSwitchBinLogFormat = 1561, + /// + ///ER_PARTITION_NO_TEMPORARY + PartitionNoTemporary = 1562, + /// + ///ER_PARTITION_CONST_DOMAIN_ERROR + PartitionConstantDomain = 1563, + /// + ///ER_PARTITION_FUNCTION_IS_NOT_ALLOWED + PartitionFunctionIsNotAllowed = 1564, + /// + ///ER_DDL_LOG_ERROR + DDLLogError = 1565, + /// + ///ER_NULL_IN_VALUES_LESS_THAN + NullInValuesLessThan = 1566, + /// + ///ER_WRONG_PARTITION_NAME + WrongPartitionName = 1567, + /// + ///ER_CANT_CHANGE_TRANSACTION_ISOLATION + CannotChangeTransactionIsolation = 1568, + /// + ///ER_DUP_ENTRY_AUTOINCREMENT_CASE + DuplicateEntryAutoIncrementCase = 1569, + /// + ///ER_EVENT_MODIFY_QUEUE_ERROR + EventModifyQueueError = 1570, + /// + ///ER_EVENT_SET_VAR_ERROR + EventSetVariableError = 1571, + /// + ///ER_PARTITION_MERGE_ERROR + PartitionMergeError = 1572, + /// + ///ER_CANT_ACTIVATE_LOG + CannotActivateLog = 1573, + /// + ///ER_RBR_NOT_AVAILABLE + RBRNotAvailable = 1574, + /// + ///ER_BASE64_DECODE_ERROR + Base64DecodeError = 1575, + /// + ///ER_EVENT_RECURSION_FORBIDDEN + EventRecursionForbidden = 1576, + /// + ///ER_EVENTS_DB_ERROR + EventsDatabaseError = 1577, + /// + ///ER_ONLY_INTEGERS_ALLOWED + OnlyIntegersAllowed = 1578, + /// + ///ER_UNSUPORTED_LOG_ENGINE + UnsupportedLogEngine = 1579, + /// + ///ER_BAD_LOG_STATEMENT + BadLogStatement = 1580, + /// + ///ER_CANT_RENAME_LOG_TABLE + CannotRenameLogTable = 1581, + /// + ///ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT + WrongParameterCountToNativeFCT = 1582, + /// + ///ER_WRONG_PARAMETERS_TO_NATIVE_FCT + WrongParametersToNativeFCT = 1583, + /// + ///ER_WRONG_PARAMETERS_TO_STORED_FCT + WrongParametersToStoredFCT = 1584, + /// + ///ER_NATIVE_FCT_NAME_COLLISION + NativeFCTNameCollision = 1585, + /// + ///ER_DUP_ENTRY_WITH_KEY_NAME + DuplicateEntryWithKeyName = 1586, + /// + ///ER_BINLOG_PURGE_EMFILE + BinLogPurgeEMFile = 1587, + /// + ///ER_EVENT_CANNOT_CREATE_IN_THE_PAST + EventCannotCreateInThePast = 1588, + /// + ///ER_EVENT_CANNOT_ALTER_IN_THE_PAST + EventCannotAlterInThePast = 1589, + /// + ///ER_REPLICA_INCIDENT + ReplicaIncident = 1590, + /// + ///ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT + NoPartitionForGivenValueSilent = 1591, + /// + ///ER_BINLOG_UNSAFE_STATEMENT + BinLogUnsafeStatement = 1592, + /// + ///ER_REPLICA_FATAL_ERROR + ReplicaFatalError = 1593, + /// + ///ER_REPLICA_RELAY_LOG_READ_FAILURE + ReplicaRelayLogReadFailure = 1594, + /// + ///ER_REPLICA_RELAY_LOG_WRITE_FAILURE + ReplicaRelayLogWriteFailure = 1595, + /// + ///ER_REPLICA_CREATE_EVENT_FAILURE + ReplicaCreateEventFailure = 1596, + /// + ///ER_REPLICA_SOURCE_COM_FAILURE + ReplicaSourceComFailure = 1597, + /// + ///ER_BINLOG_LOGGING_IMPOSSIBLE + BinLogLoggingImpossible = 1598, + /// + ///ER_VIEW_NO_CREATION_CTX + ViewNoCreationContext = 1599, + /// + ///ER_VIEW_INVALID_CREATION_CTX + ViewInvalidCreationContext = 1600, + /// + ///ER_SR_INVALID_CREATION_CTX + StoredRoutineInvalidCreateionContext = 1601, + /// + ///ER_TRG_CORRUPTED_FILE + TiggerCorruptedFile = 1602, + /// + ///ER_TRG_NO_CREATION_CTX + TriggerNoCreationContext = 1603, + /// + ///ER_TRG_INVALID_CREATION_CTX + TriggerInvalidCreationContext = 1604, + /// + ///ER_EVENT_INVALID_CREATION_CTX + EventInvalidCreationContext = 1605, + /// + ///ER_TRG_CANT_OPEN_TABLE + TriggerCannotOpenTable = 1606, + /// + ///ER_CANT_CREATE_SROUTINE + CannoCreateSubRoutine = 1607, + /// + ///ER_REPLICA_AMBIGOUS_EXEC_MODE + ReplicaAmbiguousExecMode = 1608, + /// + ///ER_NO_FORMAT_DESCRIPTION_EVENT_BEFORE_BINLOG_STATEMENT + NoFormatDescriptionEventBeforeBinLogStatement = 1609, + /// + ///ER_REPLICA_CORRUPT_EVENT + ReplicaCorruptEvent = 1610, + /// + ///ER_LOAD_DATA_INVALID_COLUMN + LoadDataInvalidColumn = 1611, + /// + ///ER_LOG_PURGE_NO_FILE + LogPurgeNoFile = 1612, + /// + ///ER_XA_RBTIMEOUT + XARBTimeout = 1613, + /// + ///ER_XA_RBDEADLOCK + XARBDeadlock = 1614, + /// + ///ER_NEED_REPREPARE + NeedRePrepare = 1615, + /// + ///ER_DELAYED_NOT_SUPPORTED + DelayedNotSupported = 1616, + /// + ///WARN_NO_SOURCE_INFO + WarningNoSourceInfo = 1617, + /// + ///WARN_OPTION_IGNORED + WarningOptionIgnored = 1618, + /// + ///WARN_PLUGIN_DELETE_BUILTIN + WarningPluginDeleteBuiltIn = 1619, + /// + ///WARN_PLUGIN_BUSY + WarningPluginBusy = 1620, + /// + ///ER_VARIABLE_IS_READONLY + VariableIsReadonly = 1621, + /// + ///ER_WARN_ENGINE_TRANSACTION_ROLLBACK + WarningEngineTransactionRollback = 1622, + /// + ///ER_REPLICA_HEARTBEAT_FAILURE + ReplicaHeartbeatFailure = 1623, + /// + ///ER_REPLICA_HEARTBEAT_VALUE_OUT_OF_RANGE + ReplicaHeartbeatValueOutOfRange = 1624, + /// + ///ER_NDB_REPLICATION_SCHEMA_ERROR + NDBReplicationSchemaError = 1625, + /// + ///ER_CONFLICT_FN_PARSE_ERROR + ConflictFunctionParseError = 1626, + /// + ///ER_EXCEPTIONS_WRITE_ERROR + ExcepionsWriteError = 1627, + /// + ///ER_TOO_LONG_TABLE_COMMENT + TooLongTableComment = 1628, + /// + ///ER_TOO_LONG_FIELD_COMMENT + TooLongFieldComment = 1629, + /// + ///ER_FUNC_INEXISTENT_NAME_COLLISION + FunctionInExistentNameCollision = 1630, + /// + ///ER_DATABASE_NAME + DatabaseNameError = 1631, + /// + ///ER_TABLE_NAME + TableNameErrror = 1632, + /// + ///ER_PARTITION_NAME + PartitionNameError = 1633, + /// + ///ER_SUBPARTITION_NAME + SubPartitionNameError = 1634, + /// + ///ER_TEMPORARY_NAME + TemporaryNameError = 1635, + /// + ///ER_RENAMED_NAME + RenamedNameError = 1636, + /// + ///ER_TOO_MANY_CONCURRENT_TRXS + TooManyConcurrentTransactions = 1637, + /// + ///WARN_NON_ASCII_SEPARATOR_NOT_IMPLEMENTED + WarningNonASCIISeparatorNotImplemented = 1638, + /// + ///ER_DEBUG_SYNC_TIMEOUT + DebugSyncTimeout = 1639, + /// + ///ER_DEBUG_SYNC_HIT_LIMIT + DebugSyncHitLimit = 1640, + /// + ///ER_ERROR_LAST + ErrorLast = 1640, + /// + ///ER_CLIENT_INTERACTION_TIMEOUT + ErrorClientInteractionTimeout = 4031 + } +} diff --git a/MySQL.Data/src/MySqlHelper.cs b/MySQL.Data/src/MySqlHelper.cs new file mode 100644 index 000000000..9d33fa16d --- /dev/null +++ b/MySQL.Data/src/MySqlHelper.cs @@ -0,0 +1,464 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Data; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + /// + /// Helper class that makes it easier to work with the provider. + /// + public sealed partial class MySqlHelper + { + enum CharClass : byte + { + None, + Quote, + Backslash + } + + private static string stringOfBackslashChars = "\u005c\u00a5\u0160\u20a9\u2216\ufe68\uff3c"; + private static string stringOfQuoteChars = + "\u0022\u0027\u0060\u00b4\u02b9\u02ba\u02bb\u02bc\u02c8\u02ca\u02cb\u02d9\u0300\u0301\u2018\u2019\u201a\u2032\u2035\u275b\u275c\uff07"; + + private static CharClass[] charClassArray = MakeCharClassArray(); + + // this class provides only static methods + private MySqlHelper() + { + } + + #region ExecuteNonQuery + private static async Task ExecuteNonQueryAsync(bool execAsync, MySqlConnection connection, string commandText, CancellationToken cancellationToken = default, params MySqlParameter[] commandParameters) + { + //create a command and prepare it for execution + MySqlCommand cmd = new MySqlCommand(); + cmd.Connection = connection; + cmd.CommandText = commandText; + cmd.CommandType = CommandType.Text; + + if (commandParameters != null) + foreach (MySqlParameter p in commandParameters) + cmd.Parameters.Add(p); + + int result = await cmd.ExecuteNonQueryAsync(execAsync, cancellationToken).ConfigureAwait(false); + cmd.Parameters.Clear(); + + return result; + } + + private static async Task ExecuteNonQueryAsync(bool execAsync, string connectionString, string commandText, CancellationToken cancellationToken = default, params MySqlParameter[] commandParameters) + { + //create & open a SqlConnection, and dispose of it after we are done. + using (MySqlConnection cn = new MySqlConnection(connectionString)) + { + await cn.OpenAsync(execAsync, cancellationToken).ConfigureAwait(false); + + //call the overload that takes a connection in place of the connection string + return await ExecuteNonQueryAsync(execAsync, cn, commandText, cancellationToken, commandParameters).ConfigureAwait(false); + } + } + + /// + /// Executes a single command against a MySQL database. The is assumed to be + /// open when the method is called and remains open after the method completes. + /// + /// The object to use + /// The SQL command to be executed. + /// An array of objects to use with the command. + /// The number of affected records. + public static int ExecuteNonQuery(MySqlConnection connection, string commandText, params MySqlParameter[] commandParameters) => ExecuteNonQueryAsync(false, connection, commandText, commandParameters: commandParameters).GetAwaiter().GetResult(); + + /// + /// Executes a single command against a MySQL database. + /// + /// to use. + /// The SQL command to be executed. + /// An array of objects to use with the command. + /// The number of affected records. + /// A new is created using the given. + public static int ExecuteNonQuery(string connectionString, string commandText, params MySqlParameter[] commandParameters) => ExecuteNonQueryAsync(false, connectionString, commandText, commandParameters: commandParameters).GetAwaiter().GetResult(); + + /// + /// Async version of ExecuteNonQuery + /// + /// object to use. + /// The SQL command to be executed. + /// An array of objects to use with the command. + /// Rows affected. + public static Task ExecuteNonQueryAsync(MySqlConnection connection, string commandText, params MySqlParameter[] commandParameters) => ExecuteNonQueryAsync(true, connection, commandText, commandParameters: commandParameters); + + public static Task ExecuteNonQueryAsync(MySqlConnection connection, string commandText, CancellationToken cancellationToken, params MySqlParameter[] commandParameters) => ExecuteNonQueryAsync(true, connection, commandText, cancellationToken, commandParameters); + + /// + /// Asynchronous version of the ExecuteNonQuery method. + /// + /// to use. + /// The SQL command to be executed. + /// An array of objects to use with the command. + /// The number of rows affected. + public static Task ExecuteNonQueryAsync(string connectionString, string commandText, params MySqlParameter[] commandParameters) => ExecuteNonQueryAsync(true, connectionString, commandText, commandParameters: commandParameters); + + /// + /// Asynchronous version of the ExecuteNonQuery method. + /// + /// to use. + /// The SQL command to be executed. + /// The cancellation token. + /// An array of objects to use with the command. + /// The number of rows affected. + public static Task ExecuteNonQueryAsync(string connectionString, string commandText, CancellationToken cancellationToken, params MySqlParameter[] commandParameters) => ExecuteNonQueryAsync(true, connectionString, commandText, cancellationToken, commandParameters); + #endregion + + #region ExecuteDataReader + private static async Task ExecuteReaderAsync(bool execAsync, MySqlConnection connection, MySqlTransaction transaction, string commandText, MySqlParameter[] commandParameters, bool externalConn, CancellationToken cancellationToken = default) + { + //create a command and prepare it for execution + MySqlCommand cmd = new MySqlCommand(); + cmd.Connection = connection; + cmd.Transaction = transaction; + cmd.CommandText = commandText; + cmd.CommandType = CommandType.Text; + + if (commandParameters != null) + foreach (MySqlParameter p in commandParameters) + cmd.Parameters.Add(p); + + //create a reader + MySqlDataReader dr; + + // call ExecuteReader with the appropriate CommandBehavior + if (externalConn) + dr = await cmd.ExecuteReaderAsync(default, execAsync, cancellationToken).ConfigureAwait(false); + else + dr = await cmd.ExecuteReaderAsync(CommandBehavior.CloseConnection, execAsync, cancellationToken).ConfigureAwait(false); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + + return dr; + } + + private static async Task ExecuteReaderAsync(bool execAsync, string connectionString, string commandText, CancellationToken cancellationToken = default, params MySqlParameter[] commandParameters) + { + //create & open a SqlConnection + MySqlConnection cn = new MySqlConnection(connectionString); + await cn.OpenAsync(execAsync, cancellationToken).ConfigureAwait(false); + + //call the private overload that takes an internally owned connection in place of the connection string + return await ExecuteReaderAsync(execAsync, cn, null, commandText, commandParameters, false, cancellationToken).ConfigureAwait(false); + } + + /// + /// Executes a single command against a MySQL database, possibly inside an existing transaction. + /// + /// object to use for the command + /// object to use for the command + /// Command text to use + /// Array of objects to use with the command + /// True if the connection should be preserved, false if not + /// object ready to read the results of the command + private static MySqlDataReader ExecuteReader(MySqlConnection connection, MySqlTransaction transaction, string commandText, MySqlParameter[] commandParameters, bool externalConn) => ExecuteReaderAsync(false, connection, transaction, commandText, commandParameters, externalConn).GetAwaiter().GetResult(); + + /// + /// Executes a single command against a MySQL database. + /// + /// Settings to use for this command + /// Command text to use + /// object ready to read the results of the command + public static MySqlDataReader ExecuteReader(string connectionString, string commandText) => ExecuteReaderAsync(false, connectionString, commandText, commandParameters: null).GetAwaiter().GetResult(); + + /// + /// Executes a single command against a MySQL database. + /// + /// object to use for the command + /// Command text to use + /// object ready to read the results of the command + public static MySqlDataReader ExecuteReader(MySqlConnection connection, string commandText) => ExecuteReaderAsync(false, connection, null, commandText, null, true).GetAwaiter().GetResult(); + + /// + /// Executes a single command against a MySQL database. + /// + /// Settings to use for this command + /// Command text to use + /// Array of objects to use with the command + /// object ready to read the results of the command + public static MySqlDataReader ExecuteReader(string connectionString, string commandText, params MySqlParameter[] commandParameters) => ExecuteReaderAsync(false, connectionString, commandText, commandParameters: commandParameters).GetAwaiter().GetResult(); + + /// + /// Executes a single command against a MySQL database. + /// + /// Connection to use for the command + /// Command text to use + /// Array of objects to use with the command + /// object ready to read the results of the command + public static MySqlDataReader ExecuteReader(MySqlConnection connection, string commandText, params MySqlParameter[] commandParameters) => ExecuteReaderAsync(false, connection, null, commandText, commandParameters, true).GetAwaiter().GetResult(); + + /// + /// Async version of ExecuteReader + /// + /// object to use for the command + /// object to use for the command + /// Command text to use + /// Array of objects to use with the command + /// True if the connection should be preserved, false if not + /// object ready to read the results of the command + private static Task ExecuteReaderAsync(MySqlConnection connection, MySqlTransaction transaction, string commandText, MySqlParameter[] commandParameters, bool ExternalConn) => ExecuteReaderAsync(true, connection, transaction, commandText, commandParameters, ExternalConn, CancellationToken.None); + + private static Task ExecuteReaderAsync(MySqlConnection connection, MySqlTransaction transaction, string commandText, MySqlParameter[] commandParameters, bool ExternalConn, CancellationToken cancellationToken) => ExecuteReaderAsync(true, connection, transaction, commandText, commandParameters, ExternalConn, cancellationToken); + + /// + /// Async version of ExecuteReader + /// + /// Settings to use for this command + /// Command text to use + /// object ready to read the results of the command + public static Task ExecuteReaderAsync(string connectionString, string commandText) => ExecuteReaderAsync(true, connectionString, commandText, commandParameters: null); + + public static Task ExecuteReaderAsync(string connectionString, string commandText, CancellationToken cancellationToken) => ExecuteReaderAsync(true, connectionString, commandText, cancellationToken, null); + + /// + /// Async version of ExecuteReader + /// + /// object to use for the command + /// Command text to use + /// object ready to read the results of the command + public static Task ExecuteReaderAsync(MySqlConnection connection, string commandText) => ExecuteReaderAsync(true, connection, null, commandText, null, true); + + public static Task ExecuteReaderAsync(MySqlConnection connection, string commandText, CancellationToken cancellationToken) => ExecuteReaderAsync(true, connection, null, commandText, null, true, cancellationToken); + + /// + /// Async version of ExecuteReader + /// + /// Settings to use for this command. + /// Command text to use. + /// An array of objects to use with the command. + /// object ready to read the results of the command. + public static Task ExecuteReaderAsync(string connectionString, string commandText, params MySqlParameter[] commandParameters) => ExecuteReaderAsync(true, connectionString, commandText, commandParameters: commandParameters); + + public static Task ExecuteReaderAsync(string connectionString, string commandText, CancellationToken cancellationToken, params MySqlParameter[] commandParameters) => ExecuteReaderAsync(true, connectionString, commandText, cancellationToken, commandParameters); + + /// + /// Async version of ExecuteReader + /// + /// Connection to use for the command. + /// Command text to use. + /// An array of objects to use with the command. + /// object ready to read the results of the command. + public static Task ExecuteReaderAsync(MySqlConnection connection, string commandText, params MySqlParameter[] commandParameters) => ExecuteReaderAsync(connection, null, commandText, commandParameters, true); + + public static Task ExecuteReaderAsync(MySqlConnection connection, string commandText, CancellationToken cancellationToken, params MySqlParameter[] commandParameters) => ExecuteReaderAsync(connection, null, commandText, commandParameters, true, cancellationToken); + + #endregion + + #region ExecuteScalar + private static async Task ExecuteScalarAsync(bool execAsync, MySqlConnection connection, string commandText, CancellationToken cancellationToken = default, params MySqlParameter[] commandParameters) + { + //create a command and prepare it for execution + MySqlCommand cmd = new MySqlCommand(); + cmd.Connection = connection; + cmd.CommandText = commandText; + cmd.CommandType = CommandType.Text; + + if (commandParameters != null) + foreach (MySqlParameter p in commandParameters) + cmd.Parameters.Add(p); + + //execute the command & return the results + object retval = await cmd.ExecuteScalarAsync(execAsync, cancellationToken).ConfigureAwait(false); + + // detach the SqlParameters from the command object, so they can be used again. + cmd.Parameters.Clear(); + return retval; + } + + private static async Task ExecuteScalarAsync(bool execAsync, string connectionString, string commandText, CancellationToken cancellationToken = default, params MySqlParameter[] commandParameters) + { + //create & open a SqlConnection, and dispose of it after we are done. + using (MySqlConnection cn = new MySqlConnection(connectionString)) + { + await cn.OpenAsync(execAsync, cancellationToken).ConfigureAwait(false); + + //call the overload that takes a connection in place of the connection string + return await ExecuteScalarAsync(execAsync, cn, commandText, commandParameters: commandParameters).ConfigureAwait(false); + } + } + + /// + /// Execute a single command against a MySQL database. + /// + /// Settings to use for the update + /// Command text to use for the update + /// The first column of the first row in the result set, or a null reference if the result set is empty. + public static object ExecuteScalar(string connectionString, string commandText) => ExecuteScalarAsync(false, connectionString, commandText, commandParameters: null).GetAwaiter().GetResult(); + + /// + /// Execute a single command against a MySQL database. + /// + /// Settings to use for the command + /// Command text to use for the command + /// Parameters to use for the command + /// The first column of the first row in the result set, or a null reference if the result set is empty. + public static object ExecuteScalar(string connectionString, string commandText, params MySqlParameter[] commandParameters) => ExecuteScalarAsync(false, connectionString, commandText, commandParameters: commandParameters).GetAwaiter().GetResult(); + + /// + /// Execute a single command against a MySQL database. + /// + /// object to use + /// Command text to use for the command + /// The first column of the first row in the result set, or a null reference if the result set is empty. + public static object ExecuteScalar(MySqlConnection connection, string commandText) => ExecuteScalarAsync(false, connection, commandText, commandParameters: null).GetAwaiter().GetResult(); + + /// + /// Execute a single command against a MySQL database. + /// + /// object to use + /// Command text to use for the command + /// Parameters to use for the command + /// The first column of the first row in the result set, or a null reference if the result set is empty. + public static object ExecuteScalar(MySqlConnection connection, string commandText, params MySqlParameter[] commandParameters) => ExecuteScalarAsync(false, connection, commandText, commandParameters: commandParameters).GetAwaiter().GetResult(); + + /// + /// Async version of ExecuteScalar + /// + /// Settings to use for the update + /// Command text to use for the update + /// The first column of the first row in the result set, or a null reference if the result set is empty. + public static Task ExecuteScalarAsync(string connectionString, string commandText) => ExecuteScalarAsync(true, connectionString, commandText, commandParameters: null); + + public static Task ExecuteScalarAsync(string connectionString, string commandText, CancellationToken cancellationToken) => ExecuteScalarAsync(true, connectionString, commandText, cancellationToken, null); + + /// + /// Async version of ExecuteScalar + /// + /// Settings to use for the command + /// Command text to use for the command + /// Parameters to use for the command + /// The first column of the first row in the result set, or a null reference if the result set is empty. + public static Task ExecuteScalarAsync(string connectionString, string commandText, params MySqlParameter[] commandParameters) => ExecuteScalarAsync(true, connectionString, commandText, commandParameters: commandParameters); + + public static Task ExecuteScalarAsync(string connectionString, string commandText, CancellationToken cancellationToken, params MySqlParameter[] commandParameters) => ExecuteScalarAsync(true, connectionString, commandText, cancellationToken, commandParameters); + + /// + /// Async version of ExecuteScalar + /// + /// object to use + /// Command text to use for the command + /// The first column of the first row in the result set, or a null reference if the result set is empty. + public static Task ExecuteScalarAsync(MySqlConnection connection, string commandText) => ExecuteScalarAsync(true, connection, commandText, commandParameters: null); + + public static Task ExecuteScalarAsync(MySqlConnection connection, string commandText, CancellationToken cancellationToken) => ExecuteScalarAsync(true, connection, commandText, cancellationToken, null); + + /// + /// Async version of ExecuteScalar + /// + /// object to use + /// Command text to use for the command + /// Parameters to use for the command + /// The first column of the first row in the result set, or a null reference if the result set is empty. + public static Task ExecuteScalarAsync(MySqlConnection connection, string commandText, params MySqlParameter[] commandParameters) => ExecuteScalarAsync(true, connection, commandText, commandParameters: commandParameters); + + public static Task ExecuteScalarAsync(MySqlConnection connection, string commandText, CancellationToken cancellationToken, params MySqlParameter[] commandParameters) => ExecuteScalarAsync(true, connection, commandText, cancellationToken, commandParameters); + + #endregion + + #region Utility methods + private static CharClass[] MakeCharClassArray() + { + + CharClass[] a = new CharClass[65536]; + foreach (char c in stringOfBackslashChars) + { + a[c] = CharClass.Backslash; + } + foreach (char c in stringOfQuoteChars) + { + a[c] = CharClass.Quote; + } + return a; + } + + private static bool NeedsQuoting(string s) + { + return s.Any(c => charClassArray[c] != CharClass.None); + } + + /// + /// Escapes the string. + /// + /// The string to escape. + /// The string with all quotes escaped. + public static string EscapeString(string value) + { + if (!NeedsQuoting(value)) + return value; + + StringBuilder sb = new StringBuilder(); + + foreach (char c in value) + { + CharClass charClass = charClassArray[c]; + if (charClass != CharClass.None) + { + sb.Append("\\"); + } + sb.Append(c); + } + return sb.ToString(); + } + + /// + /// Replaces quotes with double quotes. + /// + /// The string to modidify. + /// A string containing double quotes instead of single quotes. + public static string DoubleQuoteString(string value) + { + if (!NeedsQuoting(value)) + return value; + + StringBuilder sb = new StringBuilder(); + foreach (char c in value) + { + CharClass charClass = charClassArray[c]; + if (charClass == CharClass.Quote) + sb.Append(c); + else if (charClass == CharClass.Backslash) + sb.Append("\\"); + sb.Append(c); + } + return sb.ToString(); + } + + #endregion + } +} diff --git a/MySQL.Data/src/MySqlPacket.cs b/MySQL.Data/src/MySqlPacket.cs new file mode 100644 index 000000000..db939cca3 --- /dev/null +++ b/MySQL.Data/src/MySqlPacket.cs @@ -0,0 +1,454 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using System; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Threading.Tasks; + + +namespace MySql.Data.MySqlClient +{ + class MySqlPacket + { + private byte[] _tempBuffer = new byte[256]; + private Encoding _encoding; + private readonly MemoryStream _buffer = new MemoryStream(5); + + private MySqlPacket() + { + Clear(); + } + + public MySqlPacket(Encoding enc) + : this() + { + Encoding = enc; + } + + public MySqlPacket(MemoryStream stream) + : this() + { + _buffer = stream; + } + + #region Properties + + public Encoding Encoding + { + get { return _encoding; } + set + { + Debug.Assert(value != null); + _encoding = value; + } + } + + public bool HasMoreData + { + get { return _buffer.Position < _buffer.Length; } + } + + public int Position + { + get { return (int)_buffer.Position; } + set { _buffer.Position = (long)value; } + } + + public int Length + { + get { return (int)_buffer.Length; } + set { _buffer.SetLength(value); } + } + + public bool IsLastPacket + { + get + { + byte[] bits = _buffer.GetBuffer(); + + return bits[0] == 0xfe && Length <= 5; + } + } + + public byte[] Buffer + { + get + { + byte[] bits = _buffer.GetBuffer(); + + return bits; + } + } + + public DBVersion Version { get; set; } + + #endregion + + public void Clear() + { + Position = 4; + } + + + #region Byte methods + + public byte ReadByte() + { + return (byte)_buffer.ReadByte(); + } + + public async Task ReadAsync(byte[] byteBuffer, int offset, int count, bool execAsync) + { + return execAsync + ? await _buffer.ReadAsync(byteBuffer, offset, count).ConfigureAwait(false) + : _buffer.Read(byteBuffer, offset, count); + } + + public void WriteByte(byte b) + { + _buffer.WriteByte(b); + } + + public void Write(byte[] bytes) + { + _buffer.Write(bytes, 0, bytes.Length); + } + + public void Write(byte[] bytes, int offset, int countToWrite) + { + _buffer.Write(bytes, offset, countToWrite); + } + + public async Task WriteAsync(byte[] bytesToWrite, bool execAsync) + { + await WriteAsync(bytesToWrite, 0, bytesToWrite.Length, execAsync).ConfigureAwait(false); + } + + public async Task WriteAsync(byte[] bytesToWrite, int offset, int countToWrite, bool execAsync) + { + if (execAsync) + await _buffer.WriteAsync(bytesToWrite, offset, countToWrite).ConfigureAwait(false); + else + _buffer.Write(bytesToWrite, offset, countToWrite); + } + + public int ReadNBytes() + { + byte c = ReadByte(); + if (c < 1 || c > 4) + throw new MySqlException(Resources.IncorrectTransmission); + return ReadInteger(c); + } + + public void SetByte(long position, byte value) + { + long currentPosition = _buffer.Position; + _buffer.Position = position; + _buffer.WriteByte(value); + _buffer.Position = currentPosition; + } + + #endregion + + #region Integer methods + + public long ReadFieldLength() + { + byte c = ReadByte(); + + switch (c) + { + case 251: return -1; + case 252: return ReadInteger(2); + case 253: return ReadInteger(3); + case 254: return ReadLong(8); + default: return c; + } + } + + public ulong ReadBitValue(int numbytes) + { + ulong value = 0; + + int pos = (int)_buffer.Position; + byte[] bits = _buffer.GetBuffer(); + int shift = 0; + + for (int i = 0; i < numbytes; i++) + { + value <<= shift; + value |= bits[pos++]; + shift = 8; + } + _buffer.Position += numbytes; + return value; + } + + public long ReadLong(int numbytes) + { + Debug.Assert((_buffer.Position + numbytes) <= _buffer.Length); + + byte[] bits = _buffer.GetBuffer(); + int pos = (int)_buffer.Position; + _buffer.Position += numbytes; + + switch (numbytes) + { + case 2: return PacketBitConverter.ToUInt16(bits, pos); + case 4: return PacketBitConverter.ToUInt32(bits, pos); + case 8: return PacketBitConverter.ToInt64(bits, pos); + } + throw new NotSupportedException("Only byte lengths of 2, 4, or 8 are supported"); + } + + public ulong ReadULong(int numbytes) + { + Debug.Assert((_buffer.Position + numbytes) <= _buffer.Length); + + byte[] bits = _buffer.GetBuffer(); + + int pos = (int)_buffer.Position; + _buffer.Position += numbytes; + + switch (numbytes) + { + case 2: return PacketBitConverter.ToUInt16(bits, pos); + case 4: return PacketBitConverter.ToUInt32(bits, pos); + case 8: return PacketBitConverter.ToUInt64(bits, pos); + } + throw new NotSupportedException("Only byte lengths of 2, 4, or 8 are supported"); + } + + public int Read3ByteInt() + { + int value = 0; + + int pos = (int)_buffer.Position; + byte[] bits = _buffer.GetBuffer(); + int shift = 0; + + for (int i = 0; i < 3; i++) + { + value |= (int)(bits[pos++] << shift); + shift += 8; + } + _buffer.Position += 3; + return value; + } + + public int ReadInteger(int numbytes) + { + if (numbytes == 3) + return Read3ByteInt(); + Debug.Assert(numbytes <= 4); + return (int)ReadLong(numbytes); + } + + /// + /// WriteInteger + /// + /// + /// + /// Boolean that indicates if the function will be executed asynchronously. + public async Task WriteIntegerAsync(long v, int numbytes, bool execAsync) + { + long val = v; + + Debug.Assert(numbytes > 0 && numbytes < 9); + + for (int x = 0; x < numbytes; x++) + { + _tempBuffer[x] = (byte)(val & 0xff); + val >>= 8; + } + + await WriteAsync(_tempBuffer, 0, numbytes, execAsync).ConfigureAwait(false); + } + + public void WriteInteger(long v, int numbytes) + { + long val = v; + + Debug.Assert(numbytes > 0 && numbytes < 9); + + for (int x = 0; x < numbytes; x++) + { + _tempBuffer[x] = (byte)(val & 0xff); + val >>= 8; + } + + Write(_tempBuffer, 0, numbytes); + } + + public int ReadPackedInteger() + { + byte c = ReadByte(); + + switch (c) + { + case 251: return -1; + case 252: return ReadInteger(2); + case 253: return ReadInteger(3); + case 254: return ReadInteger(4); + default: return c; + } + } + + public void WriteLength(long length) + { + if (length < 251) + WriteByte((byte)length); + else if (length < 65536L) + { + WriteByte(252); + WriteInteger(length, 2); + } + else if (length < 16777216L) + { + WriteByte(253); + WriteInteger(length, 3); + } + else + { + WriteByte(254); + WriteInteger(length, 8); + } + } + + public async Task WriteLengthAsync(long length, bool execAsync) + { + if (length < 251) + WriteByte((byte)length); + else if (length < 65536L) + { + WriteByte(252); + await WriteIntegerAsync(length, 2, execAsync).ConfigureAwait(false); + } + else if (length < 16777216L) + { + WriteByte(253); + await WriteIntegerAsync(length, 3, execAsync).ConfigureAwait(false); + } + else + { + WriteByte(254); + await WriteIntegerAsync(length, 8, execAsync).ConfigureAwait(false); + } + } + + #endregion + + #region String methods + + public async Task WriteLenStringAsync(string s, bool execAsync) + { + byte[] bytes = _encoding.GetBytes(s); + + await WriteLengthAsync(bytes.Length, execAsync).ConfigureAwait(false); + await WriteAsync(bytes, 0, bytes.Length, execAsync).ConfigureAwait(false); + } + + public async Task WriteStringNoNullAsync(string v, bool execAsync) + { + byte[] bytes = _encoding.GetBytes(v); + + await WriteAsync(bytes, 0, bytes.Length, execAsync).ConfigureAwait(false); + } + + public async Task WriteStringAsync(string v, bool execAsync) + { + await WriteStringNoNullAsync(v, execAsync).ConfigureAwait(false); + + WriteByte(0); + } + + public async Task ReadLenStringAsync(bool execAsync) + { + long len = ReadPackedInteger(); + return await ReadStringAsync(len, execAsync).ConfigureAwait(false); + } + + public async Task ReadAsciiStringAsync(long length, bool execAsync) + { + if (length == 0) + return String.Empty; + + await ReadAsync(_tempBuffer, 0, (int)length, execAsync).ConfigureAwait(false); + + return Encoding.GetEncoding("us-ascii").GetString(_tempBuffer, 0, (int)length); + } + + public async Task ReadStringAsync(long length, bool execAsync) + { + if (length == 0) + return String.Empty; + + if (_tempBuffer == null || length > _tempBuffer.Length) + _tempBuffer = new byte[length]; + + await ReadAsync(_tempBuffer, 0, (int)length, execAsync).ConfigureAwait(false); + + return _encoding.GetString(_tempBuffer, 0, (int)length); + } + + public string ReadString() + { + return ReadString(_encoding); + } + + public string ReadString(Encoding theEncoding) + { + byte[] bytes = ReadStringAsBytes(); + string s = theEncoding.GetString(bytes, 0, bytes.Length); + return s; + } + + public byte[] ReadStringAsBytes() + { + byte[] readBytes; + byte[] bits = _buffer.GetBuffer(); + int end = (int)_buffer.Position; + byte[] tempBuffer = bits; + + while (end < (int)_buffer.Length && + tempBuffer[end] != 0 && (int)tempBuffer[end] != -1) + end++; + + readBytes = new byte[end - _buffer.Position]; + Array.Copy(tempBuffer, (int)_buffer.Position, readBytes, 0, (int)(end - _buffer.Position)); + _buffer.Position = end + 1; + + return readBytes; + } + + #endregion + } +} diff --git a/MySQL.Data/src/MySqlParameter.cs b/MySQL.Data/src/MySqlParameter.cs new file mode 100644 index 000000000..4377aeb69 --- /dev/null +++ b/MySQL.Data/src/MySqlParameter.cs @@ -0,0 +1,669 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Types; +using System; +using System.Collections; +using System.ComponentModel; +using System.Data; +using System.Data.Common; +using System.Globalization; +using System.IO; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + /// + /// Represents a parameter to a , This class cannot be inherited. + /// + /// + /// Parameter names are not case sensitive. + /// You can read more about it here. + /// + [TypeConverter(typeof(MySqlParameterConverter))] + public sealed class MySqlParameter : DbParameter, IDbDataParameter, ICloneable + { + private const int UNSIGNED_MASK = 0x8000; + private object _paramValue; + private string _paramName; + private MySqlDbType _mySqlDbType; + private bool _inferType = true; + private const int GEOMETRY_LENGTH = 25; + private DbType _dbType; + + #region Constructors + + /// + /// Initializes a new instance of the class with the parameter name, the , the size, and the source column name. + /// + /// The name of the parameter to map. + /// One of the values. + /// The length of the parameter. + /// The name of the source column. + public MySqlParameter(string parameterName, MySqlDbType dbType, int size, string sourceColumn) : this(parameterName, dbType) + { + Size = size; + Direction = ParameterDirection.Input; + SourceColumn = sourceColumn; + SourceVersion = DataRowVersion.Default; + } + + public MySqlParameter() + { + DbType = DbType.String; + MySqlDbType = MySqlDbType.VarChar; + SourceVersion = DataRowVersion.Default; + Direction = ParameterDirection.Input; + _inferType = true; + } + + /// + /// Initializes a new instance of the class with the parameter name and a value of the new MySqlParameter. + /// + /// The name of the parameter to map. + /// An that is the value of the . + public MySqlParameter(string parameterName, object value) : this() + { + ParameterName = parameterName; + Value = value; + } + + /// + /// Initializes a new instance of the class with the parameter name and the data type. + /// + /// The name of the parameter to map. + /// One of the values. + public MySqlParameter(string parameterName, MySqlDbType dbType) : this(parameterName, null) + { + MySqlDbType = dbType; + } + + /// + /// Initializes a new instance of the class with the parameter name, the , and the size. + /// + /// The name of the parameter to map. + /// One of the values. + /// The length of the parameter. + public MySqlParameter(string parameterName, MySqlDbType dbType, int size) : this(parameterName, dbType) + { + Size = size; + } + + /// + /// Initializes a new instance of the class with the parameter name, the type of the parameter, the size of the parameter, a , the precision of the parameter, the scale of the parameter, the source column, a to use, and the value of the parameter. + /// + /// The name of the parameter to map. + /// One of the values. + /// The length of the parameter. + /// One of the values. + /// true if the value of the field can be null, otherwise false. + /// The total number of digits to the left and right of the decimal point to which is resolved. + /// The total number of decimal places to which is resolved. + /// The name of the source column. + /// One of the values. + /// An that is the value of the . + /// + public MySqlParameter(string parameterName, MySqlDbType dbType, int size, ParameterDirection direction, + bool isNullable, byte precision, byte scale, string sourceColumn, + DataRowVersion sourceVersion, object value) + : this(parameterName, dbType, size, sourceColumn) + { + Direction = direction; + IsNullable = isNullable; + Precision = precision; + Scale = scale; + Value = value; + SourceVersion = sourceVersion; + } + + internal MySqlParameter(string name, MySqlDbType type, ParameterDirection dir, string col, DataRowVersion sourceVersion, object val, bool sourceColumnNullMapping) + : this(name, type) + { + Direction = dir; + SourceColumn = col; + Value = val; + SourceVersion = sourceVersion; + SourceColumnNullMapping = sourceColumnNullMapping; + } + + #endregion + + #region Properties + + [Category("Misc")] + public override String ParameterName + { + get { return _paramName; } + set { SetParameterName(value); } + } + + internal MySqlParameterCollection Collection { get; set; } + internal Encoding Encoding { get; set; } + + internal bool TypeHasBeenSet => _inferType == false; + + + internal string BaseName + { + get + { + if (ParameterName.StartsWith("@", StringComparison.Ordinal) || ParameterName.StartsWith("?", StringComparison.Ordinal)) + return ParameterName.Substring(1); + return ParameterName; + } + } + + /// + /// Gets or sets a value indicating whether the parameter is input-only, output-only, bidirectional, or a stored procedure return value parameter. + /// As of MySql version 4.1 and earlier, input-only is the only valid choice. + /// + [Category("Data")] + public override ParameterDirection Direction { get; set; } + + /// + /// Gets or sets a value indicating whether the parameter accepts null values. + /// + [Browsable(false)] + public override Boolean IsNullable { get; set; } + + /// + /// Gets or sets the of the parameter. + /// + [Category("Data")] + [DbProviderSpecificTypeProperty(true)] + public MySqlDbType MySqlDbType + { + get { return _mySqlDbType; } + set + { + SetMySqlDbType(value); + _inferType = false; + } + } + + /// + /// Gets or sets the maximum number of digits used to represent the property. + /// + [Category("Data")] + public override byte Precision { get; set; } + + /// + /// Gets or sets the number of decimal places to which is resolved. + /// + [Category("Data")] + public override byte Scale { get; set; } + + /// + /// Gets or sets the maximum size, in bytes, of the data within the column. + /// + [Category("Data")] + public override int Size { get; set; } + + /// + /// Gets or sets the value of the parameter. + /// + [TypeConverter(typeof(StringConverter))] + [Category("Data")] + public override object Value + { + get { return _paramValue; } + set + { + _paramValue = value; + byte[] valueAsByte = value as byte[]; + string valueAsString = value as string; + MemoryStream valueAsMemoryStream = value as MemoryStream; + if (valueAsMemoryStream != null) + { + Size = (int)valueAsMemoryStream.Length; + valueAsMemoryStream.Position = 0; + StreamReader streamReaderForMemoryStream = new StreamReader(valueAsMemoryStream); + _paramValue = streamReaderForMemoryStream.ReadToEnd(); + } + if (valueAsByte != null) + Size = valueAsByte.Length; + else if (valueAsString != null) + Size = valueAsString.Length; + if (_inferType) + SetTypeFromValue(); + } + } + + internal IMySqlValue ValueObject { get; private set; } + + /// + /// Returns the possible values for this parameter if this parameter is of type + /// SET or ENUM. Returns null otherwise. + /// + public IList PossibleValues { get; internal set; } + + /// + /// Gets or sets the name of the source column that is mapped to the and used for loading or returning the . + /// + [Category("Data")] + public override String SourceColumn { get; set; } + + /// + /// Sets or gets a value which indicates whether the source column is nullable. + /// This allows to correctly generate Update statements + /// for nullable columns. + /// + public override bool SourceColumnNullMapping { get; set; } + + /// + /// Gets or sets the of the parameter. + /// + public override DbType DbType + { + get { return _dbType; } + set + { + SetDbType(value); + _inferType = false; + } + } + + /// + /// Gets or sets the value to use when loading . + /// + [Category("Data")] + public override DataRowVersion SourceVersion { get; set; } + + #endregion + + /// + /// Clones this object. + /// + /// An object that is a clone of this object. + public MySqlParameter Clone() + { + MySqlParameter clone = new MySqlParameter(_paramName, _mySqlDbType, Direction, SourceColumn, SourceVersion, _paramValue, SourceColumnNullMapping) + { + Precision = this.Precision, + Scale = this.Scale, + Size = this.Size, + IsNullable = this.IsNullable, + Encoding = this.Encoding, + }; + + // if we have not had our type set yet then our clone should not either + return clone; + } + + object ICloneable.Clone() + { + return this.Clone(); + } + + private void SetParameterName(string name) + { + Collection?.ParameterNameChanged(this, _paramName, name); + _paramName = name; + } + + /// + /// Overridden. Gets a string containing the . + /// + /// + public override string ToString() => _paramName; + + internal int GetPSType() + { + switch (_mySqlDbType) + { + case MySqlDbType.Bit: + return (int)MySqlDbType.Int64 | UNSIGNED_MASK; + case MySqlDbType.UByte: + return (int)MySqlDbType.Byte | UNSIGNED_MASK; + case MySqlDbType.UInt64: + return (int)MySqlDbType.Int64 | UNSIGNED_MASK; + case MySqlDbType.UInt32: + case MySqlDbType.UInt24: + return (int)MySqlDbType.Int32 | UNSIGNED_MASK; + case MySqlDbType.Int24: + return (int)MySqlDbType.Int32; + case MySqlDbType.UInt16: + return (int)MySqlDbType.Int16 | UNSIGNED_MASK; + case MySqlDbType.Guid: + return (int)MySqlDbType.Guid - 600; + case MySqlDbType.Enum: + return (int)MySqlDbType.VarChar; + default: + int value = (int)_mySqlDbType; + value = value > 255 ? value - 500 : value; + return value; + } + } + + internal async Task SerializeAsync(MySqlPacket packet, bool binary, MySqlConnectionStringBuilder settings, bool execAsync) + { + if (!binary && (_paramValue == null || _paramValue == DBNull.Value)) + await packet.WriteStringNoNullAsync("@NULL", execAsync).ConfigureAwait(false); + else + { + if (ValueObject.MySqlDbType == MySqlDbType.Guid) + { + MySqlGuid g = (MySqlGuid)ValueObject; + g.OldGuids = settings.OldGuids; + ValueObject = g; + } + if (ValueObject.MySqlDbType == MySqlDbType.Geometry) + { + MySqlGeometry v = (MySqlGeometry)ValueObject; + if (v.IsNull && Value != null) + { + MySqlGeometry.TryParse(Value.ToString(), out v); + } + ValueObject = v; + } + + await ValueObject.WriteValueAsync(packet, binary, _paramValue, Size, execAsync).ConfigureAwait(false); + } + } + + private void SetMySqlDbType(MySqlDbType mysqlDbtype) + { + // JSON type is treated as VarChar because in MySQL Server since 8.0.13 + /// MYSQL_TYPE_JSON is not allowed as Item_param lacks a proper + /// implementation for val_json. + _mySqlDbType = mysqlDbtype == MySqlDbType.JSON ? MySqlDbType.VarChar : mysqlDbtype; + ValueObject = MySqlField.GetIMySqlValue(_mySqlDbType); + SetDbTypeFromMySqlDbType(); + } + + private void SetTypeFromValue() + { + if (_paramValue == null || _paramValue == DBNull.Value) return; + + if (_paramValue is Guid) + MySqlDbType = MySqlDbType.Guid; + else if (_paramValue is TimeSpan) + MySqlDbType = MySqlDbType.Time; + else if (_paramValue is DateTimeOffset) + MySqlDbType = MySqlDbType.DateTime; + else if (_paramValue is bool) + MySqlDbType = MySqlDbType.Byte; + else + { + Type t = _paramValue.GetType(); + if (t.GetTypeInfo().BaseType == typeof(Enum)) + t = t.GetTypeInfo().GetEnumUnderlyingType(); + switch (t.Name) + { + case "SByte": MySqlDbType = MySqlDbType.Byte; break; + case "Byte": MySqlDbType = MySqlDbType.UByte; break; + case "Int16": MySqlDbType = MySqlDbType.Int16; break; + case "UInt16": MySqlDbType = MySqlDbType.UInt16; break; + case "Int32": MySqlDbType = MySqlDbType.Int32; break; + case "UInt32": MySqlDbType = MySqlDbType.UInt32; break; + case "Int64": MySqlDbType = MySqlDbType.Int64; break; + case "UInt64": MySqlDbType = MySqlDbType.UInt64; break; + case "DateTime": MySqlDbType = MySqlDbType.DateTime; break; + case "String": MySqlDbType = MySqlDbType.VarChar; break; + case "Single": MySqlDbType = MySqlDbType.Float; break; + case "Double": MySqlDbType = MySqlDbType.Double; break; + case "MySqlGeometry": MySqlDbType = MySqlDbType.Geometry; break; + case "Decimal": MySqlDbType = MySqlDbType.Decimal; break; + case "Object": + default: + MySqlDbType = MySqlDbType.Blob; + break; + } + } + } + + // this method is pretty dumb but we want it to be fast. it doesn't return size based + // on value and type but just on the value. + internal long EstimatedSize() + { + if (Value == null || Value == DBNull.Value) + return 4; // size of NULL + if (Value is byte[]) + return ((byte[])Value).Length; + if (Value is string) + return ((string)Value).Length * 4; // account for UTF-8 (yeah I know) + if (Value is decimal || Value is float) + return 64; + return 32; + } + + /// + /// Resets the DbType property to its original settings. + /// + public override void ResetDbType() + { + _inferType = true; + } + + void SetDbTypeFromMySqlDbType() + { + switch (_mySqlDbType) + { + case MySqlDbType.NewDecimal: + case MySqlDbType.Decimal: + _dbType = DbType.Decimal; + break; + case MySqlDbType.Byte: + _dbType = DbType.SByte; + break; + case MySqlDbType.UByte: + _dbType = DbType.Byte; + break; + case MySqlDbType.Int16: + _dbType = DbType.Int16; + break; + case MySqlDbType.UInt16: + _dbType = DbType.UInt16; + break; + case MySqlDbType.Int24: + case MySqlDbType.Int32: + _dbType = DbType.Int32; + break; + case MySqlDbType.UInt24: + case MySqlDbType.UInt32: + _dbType = DbType.UInt32; + break; + case MySqlDbType.Int64: + _dbType = DbType.Int64; + break; + case MySqlDbType.UInt64: + _dbType = DbType.UInt64; + break; + case MySqlDbType.Bit: + _dbType = DbType.UInt64; + break; + case MySqlDbType.Float: + _dbType = DbType.Single; + break; + case MySqlDbType.Double: + _dbType = DbType.Double; + break; + case MySqlDbType.Timestamp: + case MySqlDbType.DateTime: + _dbType = DbType.DateTime; + break; + case MySqlDbType.Date: + case MySqlDbType.Newdate: + case MySqlDbType.Year: + _dbType = DbType.Date; + break; + case MySqlDbType.Time: + _dbType = DbType.Time; + break; + case MySqlDbType.Enum: + case MySqlDbType.Set: + case MySqlDbType.VarChar: + _dbType = DbType.String; + break; + case MySqlDbType.TinyBlob: + case MySqlDbType.MediumBlob: + case MySqlDbType.LongBlob: + case MySqlDbType.Blob: + _dbType = DbType.Object; + break; + case MySqlDbType.String: + _dbType = DbType.StringFixedLength; + break; + case MySqlDbType.Guid: + _dbType = DbType.Guid; + break; + } + } + + private void SetDbType(DbType dbType) + { + _dbType = dbType; + switch (_dbType) + { + case DbType.Guid: + _mySqlDbType = MySqlDbType.Guid; + break; + + case DbType.AnsiString: + case DbType.String: + _mySqlDbType = MySqlDbType.VarChar; + break; + + case DbType.AnsiStringFixedLength: + case DbType.StringFixedLength: + _mySqlDbType = MySqlDbType.String; + break; + + case DbType.Boolean: + case DbType.Byte: + _mySqlDbType = MySqlDbType.UByte; + break; + + case DbType.SByte: + _mySqlDbType = MySqlDbType.Byte; + break; + + case DbType.Date: + _mySqlDbType = MySqlDbType.Date; + break; + case DbType.DateTime: + case DbType.DateTimeOffset: + _mySqlDbType = MySqlDbType.DateTime; + break; + + case DbType.Time: + _mySqlDbType = MySqlDbType.Time; + break; + case DbType.Single: + _mySqlDbType = MySqlDbType.Float; + break; + case DbType.Double: + _mySqlDbType = MySqlDbType.Double; + break; + + case DbType.Int16: + _mySqlDbType = MySqlDbType.Int16; + break; + case DbType.UInt16: + _mySqlDbType = MySqlDbType.UInt16; + break; + + case DbType.Int32: + _mySqlDbType = MySqlDbType.Int32; + break; + case DbType.UInt32: + _mySqlDbType = MySqlDbType.UInt32; + break; + + case DbType.Int64: + _mySqlDbType = MySqlDbType.Int64; + break; + case DbType.UInt64: + _mySqlDbType = MySqlDbType.UInt64; + break; + + case DbType.Decimal: + case DbType.Currency: + _mySqlDbType = MySqlDbType.Decimal; + break; + + case DbType.Object: + case DbType.VarNumeric: + case DbType.Binary: + default: + _mySqlDbType = MySqlDbType.Blob; + break; + } + + if (_dbType == DbType.Object) + { + var value = this._paramValue as byte[]; + if (value != null && value.Length == GEOMETRY_LENGTH) + _mySqlDbType = MySqlDbType.Geometry; + } + + ValueObject = MySqlField.GetIMySqlValue(_mySqlDbType); + } + } + + internal class MySqlParameterConverter : TypeConverter + { + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + { + if (destinationType == typeof(System.ComponentModel.Design.Serialization.InstanceDescriptor)) + return true; + + // Always call the base to see if it can perform the conversion. + return base.CanConvertTo(context, destinationType); + } + + public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) + { + if (destinationType == typeof(System.ComponentModel.Design.Serialization.InstanceDescriptor)) + { + ConstructorInfo ci = typeof(MySqlParameter).GetConstructor( + new[] + { + typeof (string), typeof (MySqlDbType), typeof (int), typeof (ParameterDirection), + typeof (bool), typeof (byte), typeof (byte), typeof (string), + typeof (object) + }); + + MySqlParameter p = (MySqlParameter)value; + + return new System.ComponentModel.Design.Serialization.InstanceDescriptor(ci, + new object[] + { + p.ParameterName, p.DbType, p.Size, p.Direction, + p.IsNullable, p.Precision, + p.Scale, p.SourceColumn, p.Value + }); + } + + // Always call base, even if you can't convert. + return base.ConvertTo(context, culture, value, destinationType); + } + } +} diff --git a/MySQL.Data/src/MySqlParameterCollection.cs b/MySQL.Data/src/MySqlParameterCollection.cs new file mode 100644 index 000000000..530ea93d6 --- /dev/null +++ b/MySQL.Data/src/MySqlParameterCollection.cs @@ -0,0 +1,539 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data.Common; + +namespace MySql.Data.MySqlClient +{ + /// + /// Represents a collection of parameters relevant to a + /// as well as their respective mappings to columns in a . This class cannot be inherited. + /// + /// + /// The number of the parameters in the collection must be equal to the number of + /// parameter placeholders within the command text, or an exception will be generated. + /// +#if NET452 + [Editor("MySql.Data.MySqlClient.Design.DBParametersEditor,MySql.Design", typeof(System.Drawing.Design.UITypeEditor))] +#endif + [ListBindable(true)] + public sealed partial class MySqlParameterCollection : DbParameterCollection + { + readonly List _items = new List(); + private readonly Dictionary _indexHashCs; + private readonly Dictionary _indexHashCi; + //turns to true if any parameter is unnamed + internal bool containsUnnamedParameters; + + internal MySqlParameterCollection(MySqlCommand cmd) + { + _indexHashCs = new Dictionary(); + _indexHashCi = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + containsUnnamedParameters = false; + Clear(); + } + + /// + /// Gets the number of MySqlParameter objects in the collection. + /// + public override int Count => _items.Count; + + /// + /// Gets a value that indicates whether the object has a fixed size. + /// + public override bool IsFixedSize + { + get { return (_items as IList).IsFixedSize; } + } + + /// + /// Gets a value that indicates whether the object is read-only. + /// + public override bool IsReadOnly + { + get { return (_items as IList).IsReadOnly; } + } + + /// + /// Gets a value that indicates whether the object is synchronized. + /// + public override bool IsSynchronized + { + get { return (_items as IList).IsSynchronized; } + } + + #region Public Methods + + /// + /// Gets the at the specified index. + /// + /// Gets the with a specified attribute. + /// [C#] In C#, this property is the indexer for the class. + /// + public new MySqlParameter this[int index] + { + get { return InternalGetParameter(index); } + set { InternalSetParameter(index, value); } + } + + /// + /// Gets the with the specified name. + /// + public new MySqlParameter this[string name] + { + get { return InternalGetParameter(name); } + set { InternalSetParameter(name, value); } + } + + /// + /// Adds a to the with the parameter name, the data type, the column length, and the source column name. + /// + /// The name of the parameter. + /// One of the values. + /// The length of the column. + /// The name of the source column. + /// The newly added object. + public MySqlParameter Add(string parameterName, MySqlDbType dbType, int size, string sourceColumn) + { + return Add(new MySqlParameter(parameterName, dbType, size, sourceColumn)); + } + + /// + /// Adds the specified object to the . + /// + /// The to add to the collection. + /// The newly added object. + public MySqlParameter Add(MySqlParameter value) + { + return InternalAdd(value, null); + } + + /// + /// Adds a parameter and its value. + /// + /// The name of the parameter. + /// The value of the parameter. + /// A object representing the provided values. + public MySqlParameter AddWithValue(string parameterName, object value) + { + return Add(new MySqlParameter(parameterName, value)); + } + + /// + /// Adds a to the given the parameter name and the data type. + /// + /// The name of the parameter. + /// One of the values. + /// The newly added object. + public MySqlParameter Add(string parameterName, MySqlDbType dbType) + { + return Add(new MySqlParameter(parameterName, dbType)); + } + + /// + /// Adds a to the with the parameter name, the data type, and the column length. + /// + /// The name of the parameter. + /// One of the values. + /// The length of the column. + /// The newly added object. + public MySqlParameter Add(string parameterName, MySqlDbType dbType, int size) + { + return Add(new MySqlParameter(parameterName, dbType, size)); + } + + #endregion + + /// + /// Removes all items from the collection. + /// + public override void Clear() + { + foreach (MySqlParameter p in _items) + p.Collection = null; + _items.Clear(); + _indexHashCs.Clear(); + _indexHashCi.Clear(); + } + + void CheckIndex(int index) + { + if (index < 0 || index >= Count) + throw new IndexOutOfRangeException("Parameter index is out of range."); + } + + private MySqlParameter InternalGetParameter(int index) + { + CheckIndex(index); + return _items[index]; + } + + private MySqlParameter InternalGetParameter(string parameterName) + { + int index = IndexOf(parameterName); + if (index < 0) + { + // check to see if the user has added the parameter without a + // parameter marker. If so, kindly tell them what they did. + if (parameterName.StartsWith("@", StringComparison.Ordinal) || + parameterName.StartsWith("?", StringComparison.Ordinal)) + { + string newParameterName = parameterName.Substring(1); + index = IndexOf(newParameterName); + if (index != -1) + return _items[index]; + } + throw new ArgumentException("Parameter '" + parameterName + "' not found in the collection."); + } + return _items[index]; + } + + private void InternalSetParameter(string parameterName, MySqlParameter value) + { + int index = IndexOf(parameterName); + if (index < 0) + throw new ArgumentException("Parameter '" + parameterName + "' not found in the collection."); + InternalSetParameter(index, value); + } + + private void InternalSetParameter(int index, MySqlParameter value) + { + MySqlParameter newParameter = value; + if (newParameter == null) + throw new ArgumentException(Resources.NewValueShouldBeMySqlParameter); + + CheckIndex(index); + MySqlParameter p = _items[index]; + + // first we remove the old parameter from our hashes + _indexHashCs.Remove(p.ParameterName); + _indexHashCi.Remove(p.ParameterName); + + // then we add in the new parameter + _items[index] = newParameter; + _indexHashCs.Add(value.ParameterName, index); + _indexHashCi.Add(value.ParameterName, index); + } + + /// + /// Gets the location of the in the collection with a specific parameter name. + /// + /// The name of the object to retrieve. + /// The zero-based location of the in the collection. + public override int IndexOf(string parameterName) + { + int i = -1; + if (!_indexHashCs.TryGetValue(parameterName, out i) && + !_indexHashCi.TryGetValue(parameterName, out i)) + return -1; + return i; + } + + /// + /// Gets the location of a in the collection. + /// + /// The object to locate. + /// The zero-based location of the in the collection. + /// Gets the location of a in the collection. + public override int IndexOf(object value) + { + MySqlParameter parameter = value as MySqlParameter; + if (null == parameter) + throw new ArgumentException("Argument must be of type DbParameter", "value"); + return _items.IndexOf(parameter); + } + + internal void ParameterNameChanged(MySqlParameter p, string oldName, string newName) + { + int index = IndexOf(oldName); + _indexHashCs.Remove(oldName); + _indexHashCi.Remove(oldName); + + _indexHashCs.Add(newName, index); + _indexHashCi.Add(newName, index); + } + + private MySqlParameter InternalAdd(MySqlParameter value, int? index) + { + if (value == null) + throw new ArgumentException("The MySqlParameterCollection only accepts non-null MySqlParameter type objects.", "value"); + + // if the parameter is unnamed, then assign a default name + if (String.IsNullOrEmpty(value.ParameterName)) + value.ParameterName = String.Format("Parameter{0}", GetNextIndex()); + + // make sure we don't already have a parameter with this name + string paramName = value.ParameterName; + string normalizedName = paramName[0] == '@' || paramName[0] == '?' ? paramName.Remove(0, 1) : paramName.Insert(0, "@"); + if ((IndexOf(paramName) >= 0) || (IndexOf(normalizedName) >= 0) || (IndexOf(normalizedName.Replace("@", "?")) >= 0) || + (paramName.StartsWith("?") ? IndexOf(paramName.Replace("?", "@")) >= 0 : (paramName.StartsWith("@") ? IndexOf(paramName.Replace("@", "?")) >= 0 : IndexOf(paramName) >= 0))) + { + throw new MySqlException(String.Format(Resources.ParameterAlreadyDefined, value.ParameterName)); + } + + if (index == null) + { + _items.Add(value); + index = _items.Count - 1; + } + else + { + _items.Insert((int)index, value); + AdjustHashes((int)index, true); + } + + _indexHashCs.Add(value.ParameterName, (int)index); + _indexHashCi.Add(value.ParameterName, (int)index); + + value.Collection = this; + return value; + } + + private int GetNextIndex() + { + int index = Count + 1; + + while (true) + { + string name = "Parameter" + index.ToString(); + if (!_indexHashCi.ContainsKey(name)) break; + index++; + } + return index; + } + + private static void AdjustHash(Dictionary hash, string parameterName, int keyIndex, bool addEntry) + { + if (!hash.ContainsKey(parameterName)) return; + int index = hash[parameterName]; + if (index < keyIndex) return; + hash[parameterName] = addEntry ? ++index : --index; + } + + /// + /// This method will update all the items in the index hashes when + /// we insert a parameter somewhere in the middle + /// + /// + /// + private void AdjustHashes(int keyIndex, bool addEntry) + { + for (int i = 0; i < Count; i++) + { + string name = _items[i].ParameterName; + AdjustHash(_indexHashCi, name, keyIndex, addEntry); + AdjustHash(_indexHashCs, name, keyIndex, addEntry); + } + } + + private MySqlParameter GetParameterFlexibleInternal(string baseName) + { + int index = IndexOf(baseName); + if (-1 == index) + index = IndexOf("?" + baseName); + if (-1 == index) + index = IndexOf("@" + baseName); + if (-1 != index) + return this[index]; + return null; + } + + internal MySqlParameter GetParameterFlexible(string parameterName, bool throwOnNotFound) + { + string baseName = parameterName; + MySqlParameter p = GetParameterFlexibleInternal(baseName); + if (p != null) return p; + + if (parameterName.StartsWith("@", StringComparison.Ordinal) || parameterName.StartsWith("?", StringComparison.Ordinal)) + baseName = parameterName.Substring(1); + p = GetParameterFlexibleInternal(baseName); + if (p != null) return p; + + if (throwOnNotFound) + throw new ArgumentException("Parameter '" + parameterName + "' not found in the collection."); + return null; + } + + #region DbParameterCollection Implementation + + /// + /// Adds an array of values to the end of the . + /// + /// + public override void AddRange(Array values) + { + foreach (DbParameter p in values) + Add(p); + } + + /// + /// Retrieve the parameter with the given name. + /// + /// + /// + protected override DbParameter GetParameter(string parameterName) + { + return InternalGetParameter(parameterName); + } + + protected override DbParameter GetParameter(int index) + { + return InternalGetParameter(index); + } + + protected override void SetParameter(string parameterName, DbParameter value) + { + InternalSetParameter(parameterName, value as MySqlParameter); + } + + protected override void SetParameter(int index, DbParameter value) + { + InternalSetParameter(index, value as MySqlParameter); + } + + /// + /// Adds the specified object to the . + /// + /// The to add to the collection. + /// The index of the new object. + public override int Add(object value) + { + MySqlParameter parameter = value as MySqlParameter; + if (parameter == null) + throw new MySqlException("Only MySqlParameter objects may be stored"); + + Add(parameter); + return _items.Count - 1; + } + + /// + /// Gets a value indicating whether a with the specified parameter name exists in the collection. + /// + /// The name of the object to find. + /// true if the collection contains the parameter; otherwise, false. + public override bool Contains(string parameterName) + { + return IndexOf(parameterName) != -1; + } + + /// + /// Gets a value indicating whether a MySqlParameter exists in the collection. + /// + /// The value of the object to find. + /// true if the collection contains the object; otherwise, false. + /// Gets a value indicating whether a exists in the collection. + public override bool Contains(object value) + { + MySqlParameter parameter = value as MySqlParameter; + if (null == parameter) + throw new ArgumentException("Argument must be of type DbParameter", nameof(value)); + return _items.Contains(parameter); + } + + /// + /// Copies MySqlParameter objects from the MySqlParameterCollection to the specified array. + /// + /// + /// + public override void CopyTo(Array array, int index) + { + _items.ToArray().CopyTo(array, index); + } + + /// + /// Returns an enumerator that iterates through the . + /// + /// + public override IEnumerator GetEnumerator() + { + return _items.GetEnumerator(); + } + + /// + /// Inserts a MySqlParameter into the collection at the specified index. + /// + /// + /// + public override void Insert(int index, object value) + { + MySqlParameter parameter = value as MySqlParameter; + if (parameter == null) + throw new MySqlException("Only MySqlParameter objects may be stored"); + InternalAdd(parameter, index); + } + + /// + /// Removes the specified MySqlParameter from the collection. + /// + /// + public override void Remove(object value) + { + MySqlParameter p = (value as MySqlParameter); + p.Collection = null; + int index = IndexOf(p); + _items.Remove(p); + + _indexHashCs.Remove(p.ParameterName); + _indexHashCi.Remove(p.ParameterName); + AdjustHashes(index, false); + } + + /// + /// Removes the specified from the collection using the parameter name. + /// + /// The name of the object to retrieve. + public override void RemoveAt(string parameterName) + { + DbParameter p = GetParameter(parameterName); + Remove(p); + } + + /// + /// Removes the specified from the collection using a specific index. + /// + /// The zero-based index of the parameter. + /// Removes the specified from the collection. + public override void RemoveAt(int index) + { + object o = _items[index]; + Remove(o); + } + + /// + /// Gets an object that can be used to synchronize access to the + /// . + /// + public override object SyncRoot => (_items as IList).SyncRoot; + + #endregion + } +} diff --git a/MySQL.Data/src/MySqlPool.cs b/MySQL.Data/src/MySqlPool.cs new file mode 100644 index 000000000..01826550d --- /dev/null +++ b/MySQL.Data/src/MySqlPool.cs @@ -0,0 +1,425 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using MySql.Data.Failover; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + /// + /// Summary description for MySqlPool. + /// + internal sealed class MySqlPool + { + private readonly List _inUsePool; + private readonly LinkedList _idlePool; + private readonly uint _minSize; + private readonly uint _maxSize; + private readonly AutoResetEvent _autoEvent; + private int _available; + // Object used to lock the list of host obtained from DNS SRV lookup. + private readonly SemaphoreSlim inUsePoolSemaphore = new SemaphoreSlim(1, 1); + private readonly SemaphoreSlim idlePoolSemaphore = new SemaphoreSlim(1, 1); + private readonly SemaphoreSlim dnsSrvSemaphore = new SemaphoreSlim(1, 1); + + private void EnqueueIdle(Driver driver) + { + driver.IdleSince = DateTime.Now; + _idlePool.AddLast(driver); + } + + public MySqlPool(MySqlConnectionStringBuilder settings) + { + _minSize = settings.MinimumPoolSize; + _maxSize = settings.MaximumPoolSize; + + _available = (int)_maxSize; + _autoEvent = new AutoResetEvent(false); + + if (_minSize > _maxSize) + _minSize = _maxSize; + this.Settings = settings; + _inUsePool = new List((int)_maxSize); + _idlePool = new LinkedList(); + + ProcedureCache = new ProcedureCache((int)settings.ProcedureCacheSize); + } + + private async Task InitializeAsync(bool execAsync, CancellationToken cancellationToken) + { + // prepopulate the idle pool to minSize + for (int i = 0; i < _minSize; i++) + EnqueueIdle(await CreateNewPooledConnectionAsync(execAsync, cancellationToken).ConfigureAwait(false)); + + return this; + } + + public static Task CreateMySqlPoolAsync(MySqlConnectionStringBuilder settings, bool execAsync, CancellationToken cancellationToken) + { + var pool = new MySqlPool(settings); + return pool.InitializeAsync(execAsync, cancellationToken); + } + + #region Properties + + public MySqlConnectionStringBuilder Settings { get; set; } + + public ProcedureCache ProcedureCache { get; } + + /// + /// It is assumed that this property will only be used from inside an active + /// lock. + /// + private bool HasIdleConnections => _idlePool.Count > 0; + + private int NumConnections => _idlePool.Count + _inUsePool.Count; + + /// + /// Indicates whether this pool is being cleared. + /// + public bool BeingCleared { get; private set; } + + internal Dictionary ServerProperties { get; set; } + + #endregion + + /// + /// It is assumed that this method is only called from inside an active lock. + /// + private async Task GetPooledConnectionAsync(bool execAsync, CancellationToken cancellationToken) + { + Driver driver = null; + + // if we don't have an idle connection but we have room for a new + // one, then create it here. + if (execAsync) + await idlePoolSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false); + else + idlePoolSemaphore.Wait(cancellationToken); + + try + { + if (HasIdleConnections) + { + driver = _idlePool.First.Value; + _idlePool.RemoveFirst(); + } + } + finally + { + idlePoolSemaphore.Release(); + } + + // Obey the connection timeout + if (driver != null) + { + try + { + driver.ResetTimeout((int)Settings.ConnectionTimeout * 1000); + } + catch (Exception) + { + await driver.CloseAsync(execAsync).ConfigureAwait(false); + driver = null; + } + } + + if (driver != null) + { + // first check to see that the server is still alive + if (!await driver.PingAsync(execAsync).ConfigureAwait(false)) + { + await driver.CloseAsync(execAsync).ConfigureAwait(false); + driver = null; + } + else if (Settings.ConnectionReset) + { + // if the user asks us to ping/reset pooled connections + // do so now + try { await driver.ResetAsync(execAsync).ConfigureAwait(false); } + catch (Exception) { await ClearAsync(execAsync).ConfigureAwait(false); } + } + } + if (driver == null) + driver = await CreateNewPooledConnectionAsync(execAsync, cancellationToken).ConfigureAwait(false); + + Debug.Assert(driver != null); + if (execAsync) + await inUsePoolSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false); + else + inUsePoolSemaphore.Wait(cancellationToken); + + try + { + _inUsePool.Add(driver); + } + finally + { + inUsePoolSemaphore.Release(); + } + + return driver; + } + + /// + /// It is assumed that this method is only called from inside an active lock. + /// + private async Task CreateNewPooledConnectionAsync(bool execAsync, CancellationToken cancellationToken) + { + Debug.Assert((_maxSize - NumConnections) > 0, "Pool out of sync."); + + Driver driver = await Driver.CreateAsync(Settings, execAsync, cancellationToken).ConfigureAwait(false); + driver.Pool = this; + return driver; + } + + public async Task ReleaseConnectionAsync(Driver driver, bool execAsync) + { + if (execAsync) + await inUsePoolSemaphore.WaitAsync().ConfigureAwait(false); + else + inUsePoolSemaphore.Wait(); + + try + { + if (_inUsePool.Contains(driver)) + _inUsePool.Remove(driver); + } + finally + { + inUsePoolSemaphore.Release(); + } + + if (driver.ConnectionLifetimeExpired() || BeingCleared) + { + await driver.CloseAsync(execAsync).ConfigureAwait(false); + Debug.Assert(!_idlePool.Contains(driver)); + } + else + { + if (execAsync) + await idlePoolSemaphore.WaitAsync().ConfigureAwait(false); + else + idlePoolSemaphore.Wait(); + + try + { + EnqueueIdle(driver); + } + finally + { + idlePoolSemaphore.Release(); + } + } + + if (execAsync) + await dnsSrvSemaphore.WaitAsync().ConfigureAwait(false); + else + dnsSrvSemaphore.Wait(); + + try + { + if (driver.Settings.DnsSrv) + { + var dnsSrvRecords = DnsSrv.GetDnsSrvRecords(DnsSrv.ServiceName); + FailoverManager.SetHostList(dnsSrvRecords.ConvertAll(r => new FailoverServer(r.Target, r.Port, null)), + FailoverMethod.Sequential); + + foreach (var idleConnection in _idlePool) + { + string idleServer = idleConnection.Settings.Server; + if (!FailoverManager.FailoverGroup.Hosts.Exists(h => h.Host == idleServer) && !idleConnection.IsInActiveUse) + { + await idleConnection.CloseAsync(execAsync).ConfigureAwait(false); + } + } + } + } + finally + { + dnsSrvSemaphore.Release(); + } + + Interlocked.Increment(ref _available); + _autoEvent.Set(); + } + + /// + /// Removes a connection from the in use pool. The only situations where this method + /// would be called are when a connection that is in use gets some type of fatal exception + /// or when the connection is being returned to the pool and it's too old to be + /// returned. + /// + /// + public void RemoveConnection(Driver driver) + { + inUsePoolSemaphore.Wait(); + try + { + if (_inUsePool.Contains(driver)) + { + _inUsePool.Remove(driver); + Interlocked.Increment(ref _available); + _autoEvent.Set(); + } + } + finally + { + inUsePoolSemaphore.Release(); + } + + // if we are being cleared and we are out of connections then have + // the manager destroy us. + if (BeingCleared && NumConnections == 0) + MySqlPoolManager.RemoveClearedPool(this); + } + + private async Task TryToGetDriverAsync(bool execAsync, CancellationToken cancellationToken) + { + int count = Interlocked.Decrement(ref _available); + if (count < 0) + { + Interlocked.Increment(ref _available); + return null; + } + try + { + Driver driver = await GetPooledConnectionAsync(execAsync, cancellationToken).ConfigureAwait(false); + return driver; + } + catch (Exception ex) + { + MySqlTrace.LogError(-1, ex.Message); + Interlocked.Increment(ref _available); + throw; + } + } + + public async Task GetConnectionAsync(bool execAsync, CancellationToken cancellationToken) + { + int fullTimeOut = (int)Settings.ConnectionTimeout * 1000; + int timeOut = fullTimeOut; + + DateTime start = DateTime.Now; + + while (timeOut > 0) + { + Driver driver = await TryToGetDriverAsync(execAsync, cancellationToken).ConfigureAwait(false); + if (driver != null) return driver; + + // We have no tickets right now, lets wait for one. + if (!_autoEvent.WaitOne(timeOut, false)) break; + + timeOut = fullTimeOut - (int)DateTime.Now.Subtract(start).TotalMilliseconds; + } + throw new MySqlException(Resources.TimeoutGettingConnection); + } + + /// + /// Clears this pool of all idle connections and marks this pool and being cleared + /// so all other connections are closed when they are returned. + /// + internal async Task ClearAsync(bool execAsync) + { + if (execAsync) + await idlePoolSemaphore.WaitAsync().ConfigureAwait(false); + else + idlePoolSemaphore.Wait(); + + try + { + // first, mark ourselves as being cleared + BeingCleared = true; + + // then we remove all connections sitting in the idle pool + while (_idlePool.Count > 0) + { + Driver d = _idlePool.Last.Value; + await d.CloseAsync(execAsync).ConfigureAwait(false); + _idlePool.RemoveLast(); + } + } + finally + { + idlePoolSemaphore.Release(); + } + // there is nothing left to do here. Now we just wait for all + // in use connections to be returned to the pool. When they are + // they will be closed. When the last one is closed, the pool will + // be destroyed. + } + + /// + /// Remove expired drivers from the idle pool + /// + /// + /// + /// Closing driver is a potentially lengthy operation involving network + /// IO. Therefore we do not close expired drivers while holding + /// idlePool.SyncRoot lock. We just remove the old drivers from the idle + /// queue and return them to the caller. The caller will need to close + /// them (or let GC close them) + /// + internal List RemoveOldIdleConnections() + { + var connectionsToClose = new List(); + DateTime now = DateTime.Now; + + idlePoolSemaphore.Wait(); + + try + { + while (_idlePool.Count > _minSize) + { + var idleConnection = _idlePool.First.Value; + DateTime expirationTime = idleConnection.IdleSince.Add( + new TimeSpan(0, 0, MySqlPoolManager.maxConnectionIdleTime)); + + if (expirationTime.CompareTo(now) < 0) + { + connectionsToClose.Add(idleConnection); + _idlePool.RemoveFirst(); + } + else + break; + } + } + finally + { + idlePoolSemaphore.Release(); + } + return connectionsToClose; + } + } +} diff --git a/MySQL.Data/src/MySqlPoolManager.cs b/MySQL.Data/src/MySqlPoolManager.cs new file mode 100644 index 000000000..e3dea7676 --- /dev/null +++ b/MySQL.Data/src/MySqlPoolManager.cs @@ -0,0 +1,311 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Failover; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Reflection; +#if !NETFRAMEWORK +using System.Runtime.Loader; +#endif +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + /// + /// Summary description for MySqlPoolManager. + /// + internal class MySqlPoolManager + { + private static readonly Dictionary Pools = new Dictionary(); + private static readonly List ClearingPools = new List(); + internal const int DEMOTED_TIMEOUT = 120000; + private static SemaphoreSlim waitHandle = new(1, 1); + + #region Properties + /// + /// Queue of demoted hosts. + /// + internal static ConcurrentQueue DemotedHosts { get; set; } + /// + /// List of hosts that will be attempted to connect to. + /// + + internal static List Hosts { get; set; } + /// + /// Timer to be used when a host have been demoted. + /// + + internal static Timer DemotedServersTimer { get; set; } + #endregion + + // Timeout in seconds, after which an unused (idle) connection + // should be closed. + internal static int maxConnectionIdleTime = 180; + + static MySqlPoolManager() + { + AppDomain.CurrentDomain.ProcessExit += UnloadAppDomain; + AppDomain.CurrentDomain.DomainUnload += UnloadAppDomain; + +#if !NETFRAMEWORK + AssemblyLoadContext.GetLoadContext(Assembly.GetExecutingAssembly()).Unloading += UnloadAssemblyLoadContext; +#endif + } + +#if !NETFRAMEWORK + private static void UnloadAssemblyLoadContext(AssemblyLoadContext obj) => UnloadPoolManager(); +#endif + + private static void UnloadAppDomain(object sender, EventArgs e) => UnloadPoolManager(); + + private static void UnloadPoolManager() + { + ClearAllPoolsAsync(false).GetAwaiter().GetResult(); + timer?.Dispose(); + AppDomain.CurrentDomain.ProcessExit -= UnloadAppDomain; + AppDomain.CurrentDomain.DomainUnload -= UnloadAppDomain; +#if !NETFRAMEWORK + AssemblyLoadContext.GetLoadContext(Assembly.GetExecutingAssembly()).Unloading -= UnloadAssemblyLoadContext; +#endif + } + + // we add a small amount to the due time to let the cleanup detect + //expired connections in the first cleanup. + private static Timer timer = new Timer(CleanIdleConnections, + null, (maxConnectionIdleTime * 1000) + 8000, maxConnectionIdleTime * 1000); + + private static string GetKey(MySqlConnectionStringBuilder settings) + { + string key = ""; + lock (settings) + { + key = settings.ConnectionString; + } + + if (!settings.IntegratedSecurity || settings.ConnectionReset) return key; + + try + { + // Append SID to the connection string to generate a key + // With Integrated security different Windows users with the same + // connection string may be mapped to different MySQL accounts. + System.Security.Principal.WindowsIdentity id = + System.Security.Principal.WindowsIdentity.GetCurrent(); + + key += ";" + id.User; + } + catch (System.Security.SecurityException ex) + { + // Documentation for WindowsIdentity.GetCurrent() states + // SecurityException can be thrown. In this case the + // connection can only be pooled if reset is done. + throw new MySqlException(Resources.NoWindowsIdentity, ex); + } + + return key; + } + + public static async Task GetPoolAsync(MySqlConnectionStringBuilder settings, bool execAsync, CancellationToken cancellationToken) + { + string text = GetKey(settings); + + if (execAsync) + await waitHandle.WaitAsync(CancellationToken.None).ConfigureAwait(false); + else + waitHandle.Wait(cancellationToken); + + try + { + MySqlPool pool; + Pools.TryGetValue(text, out pool); + if (pool == null) + { + pool = await MySqlPool.CreateMySqlPoolAsync(settings, execAsync, cancellationToken).ConfigureAwait(false); + Pools.Add(text, pool); + } + else + pool.Settings = settings; + + return pool; + } + finally + { + waitHandle.Release(); + } + } + + public static void RemoveConnection(Driver driver) + { + Debug.Assert(driver != null); + + MySqlPool pool = driver.Pool; + + pool?.RemoveConnection(driver); + } + + public static async Task ReleaseConnectionAsync(Driver driver, bool execAsync) + { + Debug.Assert(driver != null); + + MySqlPool pool = driver.Pool; + + if (pool != null) + await pool.ReleaseConnectionAsync(driver, execAsync).ConfigureAwait(false); + } + + public static async Task ClearPoolAsync(MySqlConnectionStringBuilder settings, bool execAsync) + { + Debug.Assert(settings != null); + string text; + try + { + text = GetKey(settings); + } + catch (MySqlException) + { + // Cannot retrieve windows identity for IntegratedSecurity=true + // This can be ignored. + return; + } + + await ClearPoolByTextAsync(text, execAsync).ConfigureAwait(false); + } + + private static async Task ClearPoolByTextAsync(string key, bool execAsync) + { + if (execAsync) + await waitHandle.WaitAsync().ConfigureAwait(false); + else + waitHandle.Wait(); + + try + { + // if pools doesn't have it, then this pool must already have been cleared + if (!Pools.ContainsKey(key)) return; + + // add the pool to our list of pools being cleared + MySqlPool pool = (Pools[key] as MySqlPool); + ClearingPools.Add(pool); + + // now tell the pool to clear itself + await pool.ClearAsync(execAsync).ConfigureAwait(false); + + // and then remove the pool from the active pools list + Pools.Remove(key); + } + finally + { + waitHandle.Release(); + } + } + + public static async Task ClearAllPoolsAsync(bool execAsync) + { + + + try + { + // Create separate keys list. + List keys = new List(Pools.Count); + keys.AddRange(Pools.Keys); + + // Remove all pools by key. + foreach (string key in keys) + await ClearPoolByTextAsync(key, execAsync).ConfigureAwait(false); + } + catch + { + throw; + } + + if (DemotedServersTimer != null) + { + DemotedServersTimer.Dispose(); + Hosts?.Clear(); + while (!DemotedHosts.IsEmpty) + DemotedHosts.TryDequeue(out _); + } + } + + public static void RemoveClearedPool(MySqlPool pool) + { + Debug.Assert(ClearingPools.Contains(pool)); + ClearingPools.Remove(pool); + } + + /// + /// Remove drivers that have been idle for too long. + /// + public static async void CleanIdleConnections(object obj) + { + List oldDrivers = new List(); + + lock (Pools) + { + foreach (MySqlPool pool in Pools.Keys.Select(key => Pools[key])) + { + oldDrivers.AddRange(pool.RemoveOldIdleConnections()); + } + } + + foreach (Driver driver in oldDrivers) + { + await driver.CloseAsync(false).ConfigureAwait(false); + } + } + + /// + /// Remove hosts that have been on the demoted list for more + /// than 120,000 milliseconds and add them to the available hosts list. + /// + internal static void ReleaseDemotedHosts(object state) + { + while (!DemotedHosts.IsEmpty) + { + if (DemotedHosts.TryPeek(out FailoverServer demotedServer) && + demotedServer.DemotedTime.AddMilliseconds(DEMOTED_TIMEOUT) < DateTime.Now) + { + demotedServer.Attempted = false; + Hosts?.Add(demotedServer); + DemotedHosts.TryDequeue(out demotedServer); + } + else + { + break; + } + } + + DemotedServersTimer.Change(DEMOTED_TIMEOUT, Timeout.Infinite); + } + } +} diff --git a/Source/MySql.Data/MySqlScript.cs b/MySQL.Data/src/MySqlScript.cs similarity index 83% rename from Source/MySql.Data/MySqlScript.cs rename to MySQL.Data/src/MySqlScript.cs index a5b044273..d36b8ff02 100644 --- a/Source/MySql.Data/MySqlScript.cs +++ b/MySQL.Data/src/MySqlScript.cs @@ -1,467 +1,451 @@ -// Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Data; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using System.Threading; -using static System.String; -using MySql.Data.Common; - -namespace MySql.Data.MySqlClient -{ - /// - /// Provides a class capable of executing a SQL script containing - /// multiple SQL statements including CREATE PROCEDURE statements - /// that require changing the delimiter - /// - public class MySqlScript - { - public event MySqlStatementExecutedEventHandler StatementExecuted; - public event MySqlScriptErrorEventHandler Error; - public event EventHandler ScriptCompleted; - - #region Constructors - - /// - /// Initializes a new instance of the - /// class. - /// - public MySqlScript() - { - Delimiter = ";"; - } - - /// - /// Initializes a new instance of the - /// class. - /// - /// The connection. - public MySqlScript(MySqlConnection connection) - : this() - { - Connection = connection; - } - - /// - /// Initializes a new instance of the - /// class. - /// - /// The query. - public MySqlScript(string query) - : this() - { - Query = query; - } - - /// - /// Initializes a new instance of the - /// class. - /// - /// The connection. - /// The query. - public MySqlScript(MySqlConnection connection, string query) - : this() - { - Connection = connection; - Query = query; - } - - #endregion - - #region Properties - - /// - /// Gets or sets the connection. - /// - /// The connection. - public MySqlConnection Connection { get; set; } - - /// - /// Gets or sets the query. - /// - /// The query. - public string Query { get; set; } - - /// - /// Gets or sets the delimiter. - /// - /// The delimiter. - public string Delimiter { get; set; } - - #endregion - - #region Public Methods - - /// - /// Executes this instance. - /// - /// The number of statements executed as part of the script. - public int Execute() - { - bool openedConnection = false; - - if (Connection == null) - throw new InvalidOperationException(Resources.ConnectionNotSet); - if (IsNullOrEmpty(Query)) - return 0; - - // next we open up the connetion if it is not already open - if (Connection.State != ConnectionState.Open) - { - openedConnection = true; - Connection.Open(); - } - - // since we don't allow setting of parameters on a script we can - // therefore safely allow the use of user variables. no one should be using - // this connection while we are using it so we can temporarily tell it - // to allow the use of user variables - bool allowUserVars = Connection.Settings.AllowUserVariables; - Connection.Settings.AllowUserVariables = true; - - try - { - string mode = Connection.driver.Property("sql_mode"); - mode = StringUtility.ToUpperInvariant(mode); - bool ansiQuotes = mode.IndexOf("ANSI_QUOTES") != -1; - bool noBackslashEscapes = mode.IndexOf("NO_BACKSLASH_ESCAPES") != -1; - - // first we break the query up into smaller queries - List statements = BreakIntoStatements(ansiQuotes, noBackslashEscapes); - - int count = 0; - MySqlCommand cmd = new MySqlCommand(null, Connection); - foreach (ScriptStatement statement in statements.Where(statement => !IsNullOrEmpty(statement.text))) - { - cmd.CommandText = statement.text; - try - { - cmd.ExecuteNonQuery(); - count++; - OnQueryExecuted(statement); - } - catch (Exception ex) - { - if (Error == null) - throw; - if (!OnScriptError(ex)) - break; - } - } - OnScriptCompleted(); - return count; - } - finally - { - Connection.Settings.AllowUserVariables = allowUserVars; - if (openedConnection) - { - Connection.Close(); - } - } - } - - #endregion - - private void OnQueryExecuted(ScriptStatement statement) - { - if (StatementExecuted == null) return; - - MySqlScriptEventArgs args = new MySqlScriptEventArgs {Statement = statement}; - StatementExecuted(this, args); - } - - private void OnScriptCompleted() - { - ScriptCompleted?.Invoke(this, EventArgs.Empty); - } - - private bool OnScriptError(Exception ex) - { - if (Error == null) return false; - - MySqlScriptErrorEventArgs args = new MySqlScriptErrorEventArgs(ex); - Error(this, args); - return args.Ignore; - } - - private List BreakScriptIntoLines() - { - List lineNumbers = new List(); - - StringReader sr = new StringReader(Query); - string line = sr.ReadLine(); - int pos = 0; - while (line != null) - { - lineNumbers.Add(pos); - pos += line.Length; - line = sr.ReadLine(); - } - return lineNumbers; - } - - private static int FindLineNumber(int position, List lineNumbers) - { - int i = 0; - while (i < lineNumbers.Count && position < lineNumbers[i]) - i++; - return i; - } - - private List BreakIntoStatements(bool ansiQuotes, bool noBackslashEscapes) - { - string currentDelimiter = Delimiter; - int startPos = 0; - List statements = new List(); - List lineNumbers = BreakScriptIntoLines(); - MySqlTokenizer tokenizer = new MySqlTokenizer(Query); - - tokenizer.AnsiQuotes = ansiQuotes; - tokenizer.BackslashEscapes = !noBackslashEscapes; - - string token = tokenizer.NextToken(); - while (token != null) - { - if (!tokenizer.Quoted) - { -#if !NETCORE10 - if (token.ToLower(CultureInfo.InvariantCulture) == "delimiter") -#else - if (token.ToLowerInvariant() == "delimiter") -#endif - { - tokenizer.NextToken(); - AdjustDelimiterEnd(tokenizer); - currentDelimiter = Query.Substring(tokenizer.StartIndex, - tokenizer.StopIndex - tokenizer.StartIndex).Trim(); - startPos = tokenizer.StopIndex; - } - else - { - // this handles the case where our tokenizer reads part of the - // delimiter - if (currentDelimiter.StartsWith(token, StringComparison.OrdinalIgnoreCase)) - { - if ((tokenizer.StartIndex + currentDelimiter.Length) <= Query.Length) - { - if (Query.Substring(tokenizer.StartIndex, currentDelimiter.Length) == currentDelimiter) - { - token = currentDelimiter; - tokenizer.Position = tokenizer.StartIndex + currentDelimiter.Length; - tokenizer.StopIndex = tokenizer.Position; - } - } - } - - int delimiterPos = token.IndexOf(currentDelimiter, StringComparison.OrdinalIgnoreCase); - if (delimiterPos != -1) - { - int endPos = tokenizer.StopIndex - token.Length + delimiterPos; - if (tokenizer.StopIndex == Query.Length - 1) - endPos++; - string currentQuery = Query.Substring(startPos, endPos - startPos); - ScriptStatement statement = new ScriptStatement(); - statement.text = currentQuery.Trim(); - statement.line = FindLineNumber(startPos, lineNumbers); - statement.position = startPos - lineNumbers[statement.line]; - statements.Add(statement); - startPos = endPos + currentDelimiter.Length; - } - } - } - token = tokenizer.NextToken(); - } - - // now clean up the last statement - if (startPos < Query.Length - 1) - { - string sqlLeftOver = Query.Substring(startPos).Trim(); - if (IsNullOrEmpty(sqlLeftOver)) return statements; - ScriptStatement statement = new ScriptStatement - { - text = sqlLeftOver, - line = FindLineNumber(startPos, lineNumbers) - }; - statement.position = startPos - lineNumbers[statement.line]; - statements.Add(statement); - } - return statements; - } - - private void AdjustDelimiterEnd(MySqlTokenizer tokenizer) - { - if (tokenizer.StopIndex >= Query.Length) return; - - int pos = tokenizer.StopIndex; - char c = Query[pos]; - - while (!Char.IsWhiteSpace(c) && pos < (Query.Length - 1)) - { - c = Query[++pos]; - } - tokenizer.StopIndex = pos; - tokenizer.Position = pos; - } - - #region Async -#if NETCORE10 - /// - /// Async version of Execute - /// - /// The number of statements executed as part of the script inside. - public async Task ExecuteAsync() - { - return await ExecuteAsync(CancellationToken.None); - } - - public async Task ExecuteAsync(CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var executeResult = Execute(); - result.SetResult(executeResult); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return await result.Task; - } -#else - /// - /// Async version of Execute - /// - /// The number of statements executed as part of the script inside. - public Task ExecuteAsync() - { - return ExecuteAsync(CancellationToken.None); - } - - public Task ExecuteAsync(CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var executeResult = Execute(); - result.SetResult(executeResult); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } -#endif - -#endregion - } - - /// - /// - /// - public delegate void MySqlStatementExecutedEventHandler(object sender, MySqlScriptEventArgs args); - /// - /// - /// - public delegate void MySqlScriptErrorEventHandler(object sender, MySqlScriptErrorEventArgs args); - - /// - /// - /// - public class MySqlScriptEventArgs : EventArgs - { - internal ScriptStatement Statement { get; set; } - - /// - /// Gets the statement text. - /// - /// The statement text. - public string StatementText => Statement.text; - - /// - /// Gets the line. - /// - /// The line. - public int Line => Statement.line; - - /// - /// Gets the position. - /// - /// The position. - public int Position => Statement.position; - } - - /// - /// - /// - public class MySqlScriptErrorEventArgs : MySqlScriptEventArgs - { - /// - /// Initializes a new instance of the class. - /// - /// The exception. - public MySqlScriptErrorEventArgs(Exception exception) - { - Exception = exception; - } - - /// - /// Gets the exception. - /// - /// The exception. - public Exception Exception { get; } - - /// - /// Gets or sets a value indicating whether this is ignore. - /// - /// true if ignore; otherwise, false. - public bool Ignore { get; set; } - } - - struct ScriptStatement - { - public string text; - public int line; - public int position; - } -} +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Data; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using System.Threading; +using static System.String; +using MySql.Data.Common; + +namespace MySql.Data.MySqlClient +{ + /// + /// Provides a class capable of executing a SQL script containing + /// multiple SQL statements including CREATE PROCEDURE statements + /// that require changing the delimiter + /// + public class MySqlScript + { + /// + /// Handles the event raised whenever a statement is executed. + /// + public event MySqlStatementExecutedEventHandler StatementExecuted; + + /// + /// Handles the event raised whenever an error is raised by the execution of a script. + /// + public event MySqlScriptErrorEventHandler Error; + + /// + /// Handles the event raised whenever a script execution is finished. + /// + public event EventHandler ScriptCompleted; + + #region Constructors + + /// + /// Initializes a new instance of the + /// class. + /// + public MySqlScript() + { + Delimiter = ";"; + } + + /// + /// Initializes a new instance of the + /// class. + /// + /// The connection. + public MySqlScript(MySqlConnection connection) + : this() + { + Connection = connection; + } + + /// + /// Initializes a new instance of the + /// class. + /// + /// The query. + public MySqlScript(string query) + : this() + { + Query = query; + } + + /// + /// Initializes a new instance of the + /// class. + /// + /// The connection. + /// The query. + public MySqlScript(MySqlConnection connection, string query) + : this() + { + Connection = connection; + Query = query; + } + + #endregion + + #region Properties + + /// + /// Gets or sets the connection. + /// + /// The connection. + public MySqlConnection Connection { get; set; } + + /// + /// Gets or sets the query. + /// + /// The query. + public string Query { get; set; } + + /// + /// Gets or sets the delimiter. + /// + /// The delimiter. + public string Delimiter { get; set; } + + #endregion + + #region Public Methods + + /// + /// Executes this instance. + /// + /// The number of statements executed as part of the script. + public int Execute() + { + bool openedConnection = false; + + if (Connection == null) + throw new InvalidOperationException(Resources.ConnectionNotSet); + if (IsNullOrEmpty(Query)) + return 0; + + // next we open up the connetion if it is not already open + if (Connection.State != ConnectionState.Open) + { + openedConnection = true; + Connection.Open(); + } + + // since we don't allow setting of parameters on a script we can + // therefore safely allow the use of user variables. no one should be using + // this connection while we are using it so we can temporarily tell it + // to allow the use of user variables + bool allowUserVars = Connection.Settings.AllowUserVariables; + Connection.Settings.AllowUserVariables = true; + + try + { + string mode = Connection.driver.Property("sql_mode"); + mode = StringUtility.ToUpperInvariant(mode); + bool ansiQuotes = mode.IndexOf("ANSI_QUOTES") != -1; + bool noBackslashEscapes = mode.IndexOf("NO_BACKSLASH_ESCAPES") != -1; + + // first we break the query up into smaller queries + List statements = BreakIntoStatements(ansiQuotes, noBackslashEscapes); + + int count = 0; + MySqlCommand cmd = new MySqlCommand(null, Connection); + foreach (ScriptStatement statement in statements.Where(statement => !IsNullOrEmpty(statement.text))) + { + cmd.CommandText = statement.text; + try + { + cmd.ExecuteNonQuery(); + count++; + OnQueryExecuted(statement); + } + catch (Exception ex) + { + if (Error == null) + throw; + if (!OnScriptError(ex)) + break; + } + } + OnScriptCompleted(); + return count; + } + finally + { + Connection.Settings.AllowUserVariables = allowUserVars; + if (openedConnection) + { + Connection.Close(); + } + } + } + + #endregion + + private void OnQueryExecuted(ScriptStatement statement) + { + if (StatementExecuted == null) return; + + MySqlScriptEventArgs args = new MySqlScriptEventArgs { Statement = statement }; + StatementExecuted(this, args); + } + + private void OnScriptCompleted() + { + ScriptCompleted?.Invoke(this, EventArgs.Empty); + } + + private bool OnScriptError(Exception ex) + { + if (Error == null) return false; + + MySqlScriptErrorEventArgs args = new MySqlScriptErrorEventArgs(ex); + Error(this, args); + return args.Ignore; + } + + private List BreakScriptIntoLines() + { + List lineNumbers = new List(); + + StringReader sr = new StringReader(Query); + string line = sr.ReadLine(); + int pos = 0; + while (line != null) + { + lineNumbers.Add(pos); + pos += line.Length; + line = sr.ReadLine(); + } + return lineNumbers; + } + + private static int FindLineNumber(int position, List lineNumbers) + { + int i = 0; + while (i < lineNumbers.Count && position < lineNumbers[i]) + i++; + return i; + } + + private List BreakIntoStatements(bool ansiQuotes, bool noBackslashEscapes) + { + string currentDelimiter = Delimiter; + int startPos = 0; + List statements = new List(); + List lineNumbers = BreakScriptIntoLines(); + MySqlTokenizer tokenizer = new MySqlTokenizer(Query); + + tokenizer.AnsiQuotes = ansiQuotes; + tokenizer.BackslashEscapes = !noBackslashEscapes; + + string token = tokenizer.NextToken(); + while (token != null) + { + if (!tokenizer.Quoted) + { + if (token.ToLower(CultureInfo.InvariantCulture) == "delimiter") + { + tokenizer.NextToken(); + AdjustDelimiterEnd(tokenizer); + currentDelimiter = Query.Substring(tokenizer.StartIndex, + tokenizer.StopIndex - tokenizer.StartIndex).Trim(); + startPos = tokenizer.StopIndex; + } + else + { + // this handles the case where our tokenizer reads part of the + // delimiter + if (currentDelimiter.StartsWith(token, StringComparison.OrdinalIgnoreCase)) + { + if ((tokenizer.StartIndex + currentDelimiter.Length) <= Query.Length) + { + if (Query.Substring(tokenizer.StartIndex, currentDelimiter.Length) == currentDelimiter) + { + token = currentDelimiter; + tokenizer.Position = tokenizer.StartIndex + currentDelimiter.Length; + tokenizer.StopIndex = tokenizer.Position; + } + } + } + + int delimiterPos = token.IndexOf(currentDelimiter, StringComparison.OrdinalIgnoreCase); + if (delimiterPos != -1) + { + int endPos = tokenizer.StopIndex - token.Length + delimiterPos; + if (tokenizer.StopIndex == Query.Length - 1) + endPos++; + string currentQuery = Query.Substring(startPos, endPos - startPos); + ScriptStatement statement = new ScriptStatement(); + statement.text = currentQuery.Trim(); + statement.line = FindLineNumber(startPos, lineNumbers); + statement.position = startPos - lineNumbers[statement.line]; + statements.Add(statement); + startPos = endPos + currentDelimiter.Length; + } + } + } + token = tokenizer.NextToken(); + } + + // now clean up the last statement + if (startPos < Query.Length - 1) + { + string sqlLeftOver = Query.Substring(startPos).Trim(); + if (IsNullOrEmpty(sqlLeftOver)) return statements; + ScriptStatement statement = new ScriptStatement + { + text = sqlLeftOver, + line = FindLineNumber(startPos, lineNumbers) + }; + statement.position = startPos - lineNumbers[statement.line]; + statements.Add(statement); + } + return statements; + } + + private void AdjustDelimiterEnd(MySqlTokenizer tokenizer) + { + if (tokenizer.StopIndex >= Query.Length) return; + + int pos = tokenizer.StopIndex; + char c = Query[pos]; + + while (!Char.IsWhiteSpace(c) && pos < (Query.Length - 1)) + { + c = Query[++pos]; + } + tokenizer.StopIndex = pos; + tokenizer.Position = pos; + } + + #region Async + /// + /// Initiates the asynchronous execution of SQL statements. + /// + /// The number of statements executed as part of the script inside. + public Task ExecuteAsync() + { + return ExecuteAsync(CancellationToken.None); + } + + /// + /// Initiates the asynchronous execution of SQL statements. + /// + /// The cancellation token. + /// The number of statements executed as part of the script inside. + public Task ExecuteAsync(CancellationToken cancellationToken) + { + var result = new TaskCompletionSource(); + if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) + { + try + { + var executeResult = Execute(); + result.SetResult(executeResult); + } + catch (Exception ex) + { + result.SetException(ex); + } + } + else + { + result.SetCanceled(); + } + return result.Task; + } + #endregion + } + + /// + /// Represents the method that will handle errors when executing MySQL statements. + /// + public delegate void MySqlStatementExecutedEventHandler(object sender, MySqlScriptEventArgs args); + /// + /// Represents the method that will handle errors when executing MySQL scripts. + /// + public delegate void MySqlScriptErrorEventHandler(object sender, MySqlScriptErrorEventArgs args); + + /// + /// Sets the arguments associated to MySQL scripts. + /// + public class MySqlScriptEventArgs : EventArgs + { + internal ScriptStatement Statement { get; set; } + + /// + /// Gets the statement text. + /// + /// The statement text. + public string StatementText => Statement.text; + + /// + /// Gets the line. + /// + /// The line. + public int Line => Statement.line; + + /// + /// Gets the position. + /// + /// The position. + public int Position => Statement.position; + } + + /// + /// Sets the arguments associated to MySQL script errors. + /// + public class MySqlScriptErrorEventArgs : MySqlScriptEventArgs + { + /// + /// Initializes a new instance of the class. + /// + /// The exception. + public MySqlScriptErrorEventArgs(Exception exception) + { + Exception = exception; + } + + /// + /// Gets the exception. + /// + /// The exception. + public Exception Exception { get; } + + /// + /// Gets or sets a value indicating whether this is ignored. + /// + /// true if ignore; otherwise, false. + public bool Ignore { get; set; } + } + + struct ScriptStatement + { + public string text; + public int line; + public int position; + } +} diff --git a/MySQL.Data/src/MySqlStream.cs b/MySQL.Data/src/MySqlStream.cs new file mode 100644 index 000000000..60f79c199 --- /dev/null +++ b/MySQL.Data/src/MySqlStream.cs @@ -0,0 +1,310 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.IO; +using System.Net.Sockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + /// + /// Summary description for MySqlStream. + /// + internal class MySqlStream + { + private byte sequenceByte; + private int maxBlockSize; + private ulong maxPacketSize; + private byte[] packetHeader = new byte[4]; + MySqlPacket packet; + TimedStream timedStream; + Stream inStream; + Stream outStream; + Socket socket; + public Socket Socket { get => socket; set => socket = value; } + + internal Stream BaseStream + { + get + { + return timedStream; + } + } + public MySqlStream(Encoding encoding) + { + // we have no idea what the real value is so we start off with the max value + // The real value will be set in NativeDriver.Configure() + maxPacketSize = ulong.MaxValue; + + // we default maxBlockSize to MaxValue since we will get the 'real' value in + // the authentication handshake and we know that value will not exceed + // true maxBlockSize prior to that. + maxBlockSize = Int32.MaxValue; + + packet = new MySqlPacket(encoding); + } + + public MySqlStream(Stream baseStream, Encoding encoding, bool compress, Socket pSocket = null) + : this(encoding) + { + timedStream = new TimedStream(baseStream); + Stream stream; + if (compress) + stream = new CompressedStream(timedStream); + else + stream = timedStream; + + inStream = stream; + outStream = stream; + socket = pSocket; + } + + +#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously + public async Task CloseAsync(bool execAsync) +#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously + { +#if !(NETSTANDARD2_0 || NETFRAMEWORK) + if (execAsync) + { + await outStream.DisposeAsync().ConfigureAwait(false); + await inStream.DisposeAsync().ConfigureAwait(false); + timedStream.Close(); + } + else + { + outStream.Dispose(); + inStream.Dispose(); + timedStream.Close(); + } +#else + outStream.Dispose(); + inStream.Dispose(); + timedStream.Close(); +#endif + } + + #region Properties + + public Encoding Encoding + { + get { return packet.Encoding; } + set { packet.Encoding = value; } + } + + public void ResetTimeout(int timeout) + { + timedStream.ResetTimeout(timeout); + } + + public byte SequenceByte + { + get { return sequenceByte; } + set { sequenceByte = value; } + } + + public int MaxBlockSize + { + get { return maxBlockSize; } + set { maxBlockSize = value; } + } + + public ulong MaxPacketSize + { + get { return maxPacketSize; } + set { maxPacketSize = value; } + } + + #endregion + + #region Packet methods + + /// + /// ReadPacket is called by NativeDriver to start reading the next + /// packet on the stream. + /// + public async Task ReadPacketAsync(bool execAsync) + { + //Debug.Assert(packet.Position == packet.Length); + + // make sure we have read all the data from the previous packet + //Debug.Assert(HasMoreData == false, "HasMoreData is true in OpenPacket"); + + await LoadPacketAsync(execAsync).ConfigureAwait(false); + + // now we check if this packet is a server error + if (packet.Buffer[0] == 0xff) + { + packet.ReadByte(); // read off the 0xff + + int code = packet.ReadInteger(2); + string msg; + + if (packet.Version.isAtLeast(5, 5, 0)) + msg = packet.ReadString(Encoding.UTF8); + else + msg = packet.ReadString(); + + if (msg.StartsWith("#", StringComparison.Ordinal)) + { + msg.Substring(1, 5); /* state code */ + msg = msg.Substring(6); + } + + switch (code) + { + case 4031: + throw new MySqlException(msg, code, true); + default: + throw new MySqlException(msg, code); + } + } + return packet; + } + + /// + /// Reads the specified number of bytes from the stream and stores them at given + /// offset in the buffer. + /// Throws EndOfStreamException if not all bytes can be read. + /// + /// Stream to read from + /// Array to store bytes read from the stream + /// The offset in buffer at which to begin storing the data read from the current stream. + /// Number of bytes to read + /// Boolean that indicates if the function will be executed asynchronously. + internal static async Task ReadFullyAsync(Stream stream, byte[] buffer, int offset, int count, bool execAsync) + { + int numRead = 0; + int numToRead = count; + while (numToRead > 0) + { + int read = execAsync + ? await stream.ReadAsync(buffer, offset + numRead, numToRead, CancellationToken.None).ConfigureAwait(false) + : stream.Read(buffer, offset + numRead, numToRead); + + if (read == 0) + throw new EndOfStreamException(); + + numRead += read; + numToRead -= read; + } + } + + /// + /// LoadPacket loads up and decodes the header of the incoming packet. + /// + public async Task LoadPacketAsync(bool execAsync) + { + try + { + packet.Length = 0; + int offset = 0; + while (true) + { + await ReadFullyAsync(inStream, packetHeader, 0, 4, execAsync).ConfigureAwait(false); + sequenceByte = (byte)(packetHeader[3] + 1); + int length = (int)(packetHeader[0] + (packetHeader[1] << 8) + + (packetHeader[2] << 16)); + + // make roo for the next block + packet.Length += length; + await ReadFullyAsync(inStream, packet.Buffer, offset, length, execAsync).ConfigureAwait(false); + offset += length; + + // if this block was < maxBlock then it's last one in a multipacket series + if (length < maxBlockSize) break; + } + packet.Position = 0; + } + catch (IOException ioex) + { + throw new MySqlException(Resources.ReadFromStreamFailed, true, ioex); + } + } + + public async Task SendPacketAsync(MySqlPacket packet, bool execAsync) + { + byte[] buffer = packet.Buffer; + int length = packet.Position - 4; + + if ((ulong)length > maxPacketSize) + throw new MySqlException(Resources.QueryTooLarge, (int)MySqlErrorCode.PacketTooLarge); + + int offset = 0; + do + { + int lenToSend = length > maxBlockSize ? maxBlockSize : length; + buffer[offset] = (byte)(lenToSend & 0xff); + buffer[offset + 1] = (byte)((lenToSend >> 8) & 0xff); + buffer[offset + 2] = (byte)((lenToSend >> 16) & 0xff); + buffer[offset + 3] = sequenceByte++; + + if (Socket != null && Socket.Available > 0) + await ReadPacketAsync(execAsync).ConfigureAwait(false); + + if (execAsync) + { + await outStream.WriteAsync(buffer, offset, lenToSend + 4).ConfigureAwait(false); + await outStream.FlushAsync().ConfigureAwait(false); + } + else + { + outStream.Write(buffer, offset, lenToSend + 4); + outStream.Flush(); + } + + length -= lenToSend; + offset += lenToSend; + } while (length > 0); + } + + public async Task SendEntirePacketDirectlyAsync(byte[] buffer, int count, bool execAsync) + { + buffer[0] = (byte)(count & 0xff); + buffer[1] = (byte)((count >> 8) & 0xff); + buffer[2] = (byte)((count >> 16) & 0xff); + buffer[3] = sequenceByte++; + + if (execAsync) + { + await outStream.WriteAsync(buffer, 0, count + 4).ConfigureAwait(false); + await outStream.FlushAsync().ConfigureAwait(false); + } + else + { + outStream.Write(buffer, 0, count + 4); + outStream.Flush(); + } + } + + #endregion + } +} diff --git a/MySQL.Data/src/MySqlTrace.cs b/MySQL.Data/src/MySqlTrace.cs new file mode 100644 index 000000000..f3282e5d4 --- /dev/null +++ b/MySQL.Data/src/MySqlTrace.cs @@ -0,0 +1,176 @@ +// Copyright © 2009, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Diagnostics; + +namespace MySql.Data.MySqlClient +{ + /// + /// Traces information about the client execution. + /// + public class MySqlTrace + { + private static TraceSource source = new TraceSource("mysql"); + + /// + /// Gets the list of trace listeners. + /// + public static TraceListenerCollection Listeners { get; } = source.Listeners; + + /// + /// Gets or sets the switch to control tracing and debugging. + /// + public static SourceSwitch Switch + { + get { return source.Switch; } + set { source.Switch = value; } + } + + internal static TraceSource Source + { + get + { + return source; + } + } + + internal static void LogInformation(int id, string msg) + { + Source.TraceEvent(TraceEventType.Information, id, msg, MySqlTraceEventType.NonQuery, -1); + Trace.TraceInformation(msg); + } + + internal static void LogWarning(int id, string msg) + { + Source.TraceEvent(TraceEventType.Warning, id, msg, MySqlTraceEventType.NonQuery, -1); + Trace.TraceWarning(msg); + } + + internal static void LogError(int id, string msg) + { + Source.TraceEvent(TraceEventType.Error, id, msg, MySqlTraceEventType.NonQuery, -1); + Trace.TraceError(msg); + } + + internal static void TraceEvent(TraceEventType eventType, + MySqlTraceEventType mysqlEventType, string msgFormat, params object[] args) + { + Source.TraceEvent(eventType, (int)mysqlEventType, msgFormat, args); + } + } + + /// + /// Specifies the types of warning flags. + /// + public enum UsageAdvisorWarningFlags + { + /// + /// No index exists. + /// + NoIndex = 1, + /// + /// Bad index exists. + /// + BadIndex, + /// + /// Rows have been excluded from the result. + /// + SkippedRows, + /// + /// Columns have been excluded from the result. + /// + SkippedColumns, + /// + /// Type conversions took place. + /// + FieldConversion + } + + /// + /// Specifies the event that triggered the trace. + /// + public enum MySqlTraceEventType : int + { + /// + /// A connection has been opened. + /// + ConnectionOpened = 1, + /// + /// A connection has been closed. + /// + ConnectionClosed, + /// + /// A query has been executed. + /// + QueryOpened, + /// + /// Data has been retrieved from the resultset. + /// + ResultOpened, + /// + /// Data retrieval has ended. + /// + ResultClosed, + /// + /// Query execution has ended. + /// + QueryClosed, + /// + /// The statement to be executed has been created. + /// + StatementPrepared, + /// + /// The statement has been executed. + /// + StatementExecuted, + /// + /// The statement is no longer required. + /// + StatementClosed, + /// + /// The query provided is of a nonquery type. + /// + NonQuery, + /// + /// Usage advisor warnings have been requested. + /// + UsageAdvisorWarning, + /// + /// Noncritical problem. + /// + Warning, + /// + /// An error has been raised during data retrieval. + /// + Error, + /// + /// The query has been normalized. + /// + QueryNormalized + } +} diff --git a/MySQL.Data/src/MySqlTransaction.cs b/MySQL.Data/src/MySqlTransaction.cs new file mode 100644 index 000000000..a8b0c0c29 --- /dev/null +++ b/MySQL.Data/src/MySqlTransaction.cs @@ -0,0 +1,242 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Data; +using System.Data.Common; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + /// + /// Represents a SQL transaction to be made in a MySQL database. This class cannot be inherited. + /// + /// + /// The application creates a object by calling + /// on the object. All subsequent operations associated with the + /// transaction (for example, committing or aborting the transaction), are performed on the + /// object. + /// + /// + /// The following example creates a and a . + /// It also demonstrates how to use the , + /// , and methods. + /// + /// public void RunTransaction(string myConnString) + /// { + /// MySqlConnection myConnection = new MySqlConnection(myConnString); + /// myConnection.Open(); + /// MySqlCommand myCommand = myConnection.CreateCommand(); + /// MySqlTransaction myTrans; + /// // Start a local transaction + /// myTrans = myConnection.BeginTransaction(); + /// // Must assign both transaction object and connection + /// // to Command object for a pending local transaction + /// myCommand.Connection = myConnection; + /// myCommand.Transaction = myTrans; + /// + /// try + /// { + /// myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')"; + /// myCommand.ExecuteNonQuery(); + /// myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')"; + /// myCommand.ExecuteNonQuery(); + /// myTrans.Commit(); + /// Console.WriteLine("Both records are written to database."); + /// } + /// catch(Exception e) + /// { + /// try + /// { + /// myTrans.Rollback(); + /// } + /// catch (MySqlException ex) + /// { + /// if (myTrans.Connection != null) + /// { + /// Console.WriteLine("An exception of type " + ex.GetType() + + /// " was encountered while attempting to roll back the transaction."); + /// } + /// } + /// + /// Console.WriteLine("An exception of type " + e.GetType() + + /// " was encountered while inserting the data."); + /// Console.WriteLine("Neither record was written to database."); + /// } + /// finally + /// { + /// myConnection.Close(); + /// } + /// } + /// + /// + public sealed class MySqlTransaction : DbTransaction + { + private bool open; + private bool disposed = false; + + internal MySqlTransaction(MySqlConnection c, IsolationLevel il) + { + Connection = c; + IsolationLevel = il; + open = true; + } + + #region Destructor + ~MySqlTransaction() + { + Dispose(false); + } + #endregion + + #region Properties + + /// + /// Gets the object associated with the transaction, or a null reference (Nothing in Visual Basic) if the transaction is no longer valid. + /// + /// The object associated with this transaction. + /// + /// A single application may have multiple database connections, each + /// with zero or more transactions. This property enables you to + /// determine the connection object associated with a particular + /// transaction created by . + /// + public new MySqlConnection Connection { get; set; } + + /// + /// Specifies the for this transaction. + /// + /// + /// The for this transaction. The default is ReadCommitted. + /// + /// + /// Parallel transactions are not supported. Therefore, the IsolationLevel + /// applies to the entire transaction. + /// + public override IsolationLevel IsolationLevel { get; } + + /// + /// Gets the object associated with the transaction, + /// or a null reference if the transaction is no longer valid. + /// + protected override DbConnection DbConnection + { + get { return Connection; } + } + + #endregion + + /// + /// Releases the unmanaged resources used by the + /// and optionally releases the managed resources + /// + /// If true, this method releases all resources held by any managed objects that + /// this references. + protected override void Dispose(bool disposing) + { + if (disposed) return; + base.Dispose(disposing); + if (disposing) + { + if ((Connection != null && Connection.State == ConnectionState.Open || Connection.SoftClosed) && open) + Rollback(); + } + disposed = true; + } + + /// + /// Commits the database transaction. + /// + /// + /// The method is equivalent to the MySQL SQL statement COMMIT. + /// + public override void Commit() => CommitAsync(false).GetAwaiter().GetResult(); + + /// + /// Asynchronously commits the database transaction. + /// + /// + /// A task representing the asynchronous operation. +#if NETFRAMEWORK || NETSTANDARD2_0 + public Task CommitAsync(CancellationToken cancellationToken = default) +#else + public override Task CommitAsync(CancellationToken cancellationToken = default) +#endif + => CommitAsync(true, cancellationToken); + + private async Task CommitAsync(bool execAsync, CancellationToken cancellationToken = default) + { + if (Connection == null || (Connection.State != ConnectionState.Open && !Connection.SoftClosed)) + throw new InvalidOperationException("Connection must be valid and open to commit transaction"); + if (!open) + throw new InvalidOperationException("Transaction has already been committed or is not pending"); + using (MySqlCommand cmd = new MySqlCommand("COMMIT", Connection)) + { + await cmd.ExecuteNonQueryAsync(execAsync, cancellationToken).ConfigureAwait(false); + open = false; + } + } + + /// + /// Rolls back a transaction from a pending state. + /// + /// + /// The method is equivalent to the MySQL statement ROLLBACK. + /// The transaction can only be rolled back from a pending state + /// (after BeginTransaction has been called, but before Commit is + /// called). + /// + public override void Rollback() => RollbackAsync(false).GetAwaiter().GetResult(); + + /// + /// Asynchronously rolls back a transaction from a pending state. + /// + /// The cancellation token. + /// A task representing the asynchronous operation. +#if NETFRAMEWORK || NETSTANDARD2_0 + public Task RollbackAsync(CancellationToken cancellationToken = default) +#else + public override Task RollbackAsync(CancellationToken cancellationToken = default) +#endif + => RollbackAsync(true, cancellationToken); + + private async Task RollbackAsync(bool execAsync, CancellationToken cancellationToken = default) + { + if (Connection == null || (Connection.State != ConnectionState.Open && !Connection.SoftClosed)) + throw new InvalidOperationException("Connection must be valid and open to rollback transaction"); + if (!open) + throw new InvalidOperationException("Transaction has already been rolled back or is not pending"); + using (MySqlCommand cmd = new MySqlCommand("ROLLBACK", Connection)) + { + await cmd.ExecuteNonQueryAsync(execAsync, cancellationToken).ConfigureAwait(false); + open = false; + } + } + } +} diff --git a/MySQL.Data/src/MysqlDefs.cs b/MySQL.Data/src/MysqlDefs.cs new file mode 100644 index 000000000..e2d54081d --- /dev/null +++ b/MySQL.Data/src/MysqlDefs.cs @@ -0,0 +1,863 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.ComponentModel; +using System.Globalization; +using System.Reflection; +using System.Runtime.Versioning; + +namespace MySql.Data.MySqlClient +{ + /// + /// Summary description for ClientParam. + /// + [Flags] + internal enum ClientFlags : ulong + { + LONG_PASSWORD = 1, // New more secure passwords + FOUND_ROWS = 2, // Found instead of affected rows + LONG_FLAG = 4, // Get all column flags + CONNECT_WITH_DB = 8, // One can specify db on connect + NO_SCHEMA = 16, // Don't allow db.table.column + COMPRESS = 32, // Client can use compression protocol + ODBC = 64, // ODBC client + LOCAL_FILES = 128, // Can use LOAD DATA LOCAL + IGNORE_SPACE = 256, // Ignore spaces before '(' + PROTOCOL_41 = 512, // Support new 4.1 protocol + INTERACTIVE = 1024, // This is an interactive client + SSL = 2048, // Switch to SSL after handshake + IGNORE_SIGPIPE = 4096, // IGNORE sigpipes + TRANSACTIONS = 8192, // Client knows about transactions + RESERVED = 16384, // Old 4.1 protocol flag + SECURE_CONNECTION = 32768, // New 4.1 authentication + MULTI_STATEMENTS = 65536, // Allow multi-stmt support + MULTI_RESULTS = 131072, // Allow multiple resultsets + PS_MULTI_RESULTS = 1UL << 18, // Allow multi results using PS protocol + PLUGIN_AUTH = (1UL << 19), // Client supports plugin authentication + CONNECT_ATTRS = (1UL << 20), // Allows client connection attributes + CAN_HANDLE_EXPIRED_PASSWORD = (1UL << 22), // Support for password expiration > 5.6.6 + CLIENT_SESSION_TRACK = (1UL << 23), // Support fo sending session tracker vars + CLIENT_QUERY_ATTRIBUTES = (1UL << 27), // Support for query attributes + CLIENT_SSL_VERIFY_SERVER_CERT = (1UL << 30), // Verify server certificate + CLIENT_REMEMBER_OPTIONS = (1UL << 31), // Don't reset the options after an unsuccessful connect + MULTI_FACTOR_AUTHENTICATION = (1UL << 28) // Support for Multi Factor Authentication (MFA) + } + + [Flags] + internal enum ServerStatusFlags + { + InTransaction = 1, // Transaction has started + AutoCommitMode = 2, // Server in auto_commit mode + MoreResults = 4, // More results on server + AnotherQuery = 8, // Multi query - next query exists + BadIndex = 16, + NoIndex = 32, + CursorExists = 64, + LastRowSent = 128, + DbDropped = 256, + NoBackslashEscapes = 512, + MetadataChanged = 1024, + WasSlow = 2048, + OutputParameters = 4096, + InTransactionReadOnly = 8192, // In a read-only transaction + SessionStateChanged = 16384 // Connection state information has changed + } + + internal enum SessionTrackType + { + SystemVariables = 0, + Schema = 1, + StateChange = 2, + GTIDS = 3, + TransactionCharacteristics = 4, + TransactionState = 5 + } + + /// + /// DB Operations Code + /// + internal enum DBCmd : byte + { + SLEEP = 0, + QUIT = 1, + INIT_DB = 2, + QUERY = 3, + FIELD_LIST = 4, + CREATE_DB = 5, + DROP_DB = 6, + RELOAD = 7, + SHUTDOWN = 8, + STATISTICS = 9, + PROCESS_INFO = 10, + CONNECT = 11, + PROCESS_KILL = 12, + DEBUG = 13, + PING = 14, + TIME = 15, + DELAYED_INSERT = 16, + CHANGE_USER = 17, + BINLOG_DUMP = 18, + TABLE_DUMP = 19, + CONNECT_OUT = 20, + REGISTER_REPLICA = 21, + PREPARE = 22, + EXECUTE = 23, + LONG_DATA = 24, + CLOSE_STMT = 25, + RESET_STMT = 26, + SET_OPTION = 27, + FETCH = 28 + } + + /// + /// Specifies MySQL specific data type of a field, property, for use in a . + /// + public enum MySqlDbType + { + /// + /// + /// A fixed precision and scale numeric value between -1038 + /// -1 and 10 38 -1. + /// + Decimal = 0, + /// + /// The signed range is -128 to 127. The unsigned + /// range is 0 to 255. + /// + Byte = 1, + /// + /// A 16-bit signed integer. The signed range is + /// -32768 to 32767. The unsigned range is 0 to 65535 + /// + Int16 = 2, + /// + /// Specifies a 24 (3 byte) signed or unsigned value. + /// + Int24 = 9, + /// + /// A 32-bit signed integer + /// + Int32 = 3, + /// + /// A 64-bit signed integer. + /// + Int64 = 8, + /// + /// A small (single-precision) floating-point + /// number. Allowable values are -3.402823466E+38 to -1.175494351E-38, + /// 0, and 1.175494351E-38 to 3.402823466E+38. + /// + Float = 4, + /// + /// A normal-size (double-precision) + /// floating-point number. Allowable values are -1.7976931348623157E+308 + /// to -2.2250738585072014E-308, 0, and 2.2250738585072014E-308 to + /// 1.7976931348623157E+308. + /// + Double = 5, + /// + /// A timestamp. The range is '1970-01-01 00:00:00' to sometime in the + /// year 2037 + /// + Timestamp = 7, + /// + ///Date The supported range is '1000-01-01' to '9999-12-31'. + /// + Date = 10, + /// + /// Time The range is '-838:59:59' to '838:59:59'. + /// + Time = 11, + /// + ///DateTime The supported range is '1000-01-01 00:00:00' to + ///'9999-12-31 23:59:59'. + /// + DateTime = 12, + /// + ///Datetime The supported range is '1000-01-01 00:00:00' to + ///'9999-12-31 23:59:59'. + /// + [Obsolete("The Datetime enum value is obsolete. Please use DateTime.")] + Datetime = 12, + /// + /// A year in 2- or 4-digit format (default is 4-digit). The + /// allowable values are 1901 to 2155, 0000 in the 4-digit year + /// format, and 1970-2069 if you use the 2-digit format (70-69). + /// + Year = 13, + /// + /// Obsolete Use Datetime or Date type + /// + Newdate = 14, + /// + /// A variable-length string containing 0 to 65535 characters + /// + VarString = 15, + /// + /// Bit-field data type + /// + Bit = 16, + + /// + /// Vector type + /// + Vector=242, + + /// + /// JSON + /// + JSON = 245, + /// + /// New Decimal + /// + NewDecimal = 246, + /// + /// An enumeration. A string object that can have only one value, + /// chosen from the list of values 'value1', 'value2', ..., NULL + /// or the special "" error value. An ENUM can have a maximum of + /// 65535 distinct values + /// + Enum = 247, + /// + /// A set. A string object that can have zero or more values, each + /// of which must be chosen from the list of values 'value1', 'value2', + /// ... A SET can have a maximum of 64 members. + /// + Set = 248, + /// + /// A binary column with a maximum length of 255 (2^8 - 1) + /// characters + /// + TinyBlob = 249, + /// + /// A binary column with a maximum length of 16777215 (2^24 - 1) bytes. + /// + MediumBlob = 250, + /// + /// A binary column with a maximum length of 4294967295 or + /// 4G (2^32 - 1) bytes. + /// + LongBlob = 251, + /// + /// A binary column with a maximum length of 65535 (2^16 - 1) bytes. + /// + Blob = 252, + /// + /// A variable-length string containing 0 to 255 bytes. + /// + VarChar = 253, + /// + /// A fixed-length string. + /// + String = 254, + /// + /// Geometric (GIS) data type. + /// + Geometry = 255, + /// + /// Unsigned 8-bit value. + /// + UByte = 501, + /// + /// Unsigned 16-bit value. + /// + UInt16 = 502, + /// + /// Unsigned 24-bit value. + /// + UInt24 = 509, + /// + /// Unsigned 32-bit value. + /// + UInt32 = 503, + /// + /// Unsigned 64-bit value. + /// + UInt64 = 508, + /// + /// Fixed length binary string. + /// + Binary = 754, + /// + /// Variable length binary string. + /// + VarBinary = 753, + /// + /// A text column with a maximum length of 255 (2^8 - 1) characters. + /// + TinyText = 749, + /// + /// A text column with a maximum length of 16777215 (2^24 - 1) characters. + /// + MediumText = 750, + /// + /// A text column with a maximum length of 4294967295 or + /// 4G (2^32 - 1) characters. + /// + LongText = 751, + /// + /// A text column with a maximum length of 65535 (2^16 - 1) characters. + /// + Text = 752, + /// + /// A guid column. + /// + Guid = 854 + }; + + internal enum Field_Type : byte + { + DECIMAL = 0, + BYTE = 1, + SHORT = 2, + LONG = 3, + FLOAT = 4, + DOUBLE = 5, + NULL = 6, + TIMESTAMP = 7, + LONGLONG = 8, + INT24 = 9, + DATE = 10, + TIME = 11, + DATETIME = 12, + YEAR = 13, + NEWDATE = 14, + ENUM = 247, + SET = 248, + TINY_BLOB = 249, + MEDIUM_BLOB = 250, + LONG_BLOB = 251, + BLOB = 252, + VAR_STRING = 253, + STRING = 254, + } + + /// + /// Allows the user to specify the type of connection that should + /// be used. + /// + public enum MySqlConnectionProtocol + { + /// + /// TCP/IP style connection. Works everywhere. + /// + Sockets = 1, + /// + /// TCP/IP style connection. Works everywhere. + /// + Socket = Sockets, + /// + /// TCP/IP style connection. Works everywhere. + /// + Tcp = Sockets, + /// + /// Named pipe connection. Works only on Windows systems. + /// + Pipe = 2, + /// + /// Named pipe connection. Works only on Windows systems. + /// + NamedPipe = Pipe, + /// + /// Unix domain socket connection. Works only with Unix systems. + /// + UnixSocket = 3, + /// + /// Unix domain socket connection. Works only with Unix systems. + /// + Unix = UnixSocket, + /// + /// Shared memory connection. Currently works only with Windows systems. + /// + SharedMemory = 4, + /// + /// Shared memory connection. Currently works only with Windows systems. + /// + Memory = SharedMemory + } + + /// + /// SSL options for connection. + /// + public enum MySqlSslMode + { + /// + /// Do not use SSL. + /// + [Obsolete("Use 'MySqlSslMode.Disabled' instead.")] + None, + /// + /// Do not use SSL. + /// + Disabled = None, + /// + /// Use SSL, if server supports it. This option is only available for the classic protocol. + /// + Preferred, + /// + /// Use SSL, if server supports it. This option is only available for the classic protocol. + /// + Prefered = Preferred, + /// + /// Always use SSL. Deny connection if server does not support SSL. + /// Do not perform server certificate validation. + /// This is the default SSL mode when the same isn't specified as part of the connection string. + /// + Required, + /// + /// Always use SSL. Validate server SSL certificate, but different host name mismatch. + /// + VerifyCA, + /// + /// Always use SSL and perform full certificate validation. + /// + VerifyFull + } + + /// + /// Specifies the connection types supported + /// + public enum MySqlDriverType + { + /// + /// Use TCP/IP sockets. + /// + Native, + /// + /// Use client library. + /// + Client, + /// + /// Use MySQL embedded server. + /// + Embedded + } + + /// + /// Defines the location of the certificate store. + /// + public enum MySqlCertificateStoreLocation + { + /// + /// Do not use certificate store. + /// + None, + /// + /// Use certificate store for the current user. + /// + CurrentUser, + /// + /// User certificate store for the machine. + /// + LocalMachine + } + + /// + /// Specifies the authentication mechanism that should be used. + /// + public enum MySqlAuthenticationMode + { + /// + /// If SSL is enabled or Unix sockets are being used, sets PLAIN as the authentication mechanism; + /// otherwise, it tries to use MYSQL41 and then SHA256_MEMORY. + /// + Default = 0, + AUTO = 0, + /// + /// Authenticate using PLAIN. + /// + PLAIN = 1, + /// + /// Authenticate using MYSQL41. + /// + MYSQL41 = 2, + /// + /// Authenticate using EXTERNAL. + /// + EXTERNAL = 3, + /// + /// Authenticate using SHA256_MEMORY. + /// + SHA256_MEMORY = 4 + } + + /// + /// Defines waiting options that may be used with row locking options. + /// + public enum LockContention + { + /// + /// Waits until the blocking transaction releases the row lock. + /// + Default = 0, + /// + /// Never waits to acquire a row lock. The query executes immediately, + /// failing with an error if a requested row is locked. + /// + NoWait = 1, + /// + /// Never waits to acquire a row lock. The query executes immediately, + /// removing locked rows from the result set. + /// + SkipLocked = 2 + } + + /// + /// Defines the type of compression used when data is exchanged between client and server. + /// + public enum CompressionType + { + /// + /// Uses compression if client and server are able to reach a concensus. Otherwise, compression + /// is not used. + /// + Preferred, + /// + /// Enforces the use of compression. If no concensus is reached, an error is raised. + /// + Required, + /// + /// Disables compression. + /// + Disabled + } + + /// + /// Defines the compression algorithms that can be used. + /// + public enum CompressionAlgorithms + { + zstd_stream, + lz4_message, + // deflate_stream is not supported in .NET Framework. +#if !NETFRAMEWORK + deflate_stream +#endif + } + + /// + /// The warnings that cause a connection to close. + /// + public enum CloseNotification + { + IDLE = 1810, + SHUTDOWN = 1053, + KILLED = 3169 + } + + /// + /// Controls which column type should be read as type System.Guid. + /// + public enum MySqlGuidFormat + { + /// + /// Same as Char36 when OldGuids equals False, otherwise, the same as LittleEndianBinary16. + /// + Default = 0, + /// + /// No column types are read or written as type Guid. + /// + None = 1, + /// + /// Char(36) columns are read or written as type Guid using lowercase hex with hyphens, which match UUID(). + /// + Char36 = 2, + /// + /// Char(32) columns are read or written as type Guid using lowercase hex without hyphens. + /// + Char32 = 3, + /// + /// Binary(16) columns are read or written as type Guid using big-endian byte order, which matches UUID_TO_BIN(x). + /// + Binary16 = 4, + /// + /// Binary(16) columns are read or written as type Guid using big-endian byte order + /// with time parts swapped, which matches UUID_TO_BIN(x,1). + /// + TimeSwapBinary16 = 5, + /// + /// Binary(16) columns are read or written as type Guid using little-endian byte order, + /// that is, the byte order used by System.Guid.ToByteArray and System.Guid.#ctor(System.Byte[]). + /// + LittleEndianBinary16 = 6 + } + + /// + /// Defines the different APIs that can be used for Kerberos authentication. + /// + public enum KerberosAuthMode + { + /// + /// Use and then fall back to in case of error. + /// + AUTO = 0, + /// + /// Use MS Security Support Provider Interface (SSPI). + /// + SSPI = 1, + /// + /// Use Generic Security Services API (GSSAPI) through MIT Kerberos library. + /// + GSSAPI = 2 + } + + internal class MySqlConnectAttrs + { + static string _version; + static string _os; + static string _platform; + static string _osName; + static string _framework; +#if NET452 + static string _osDetails; +#endif + + static MySqlConnectAttrs() + { + InitVersion(); + InitOS(); + InitPlatform(); + InitOSName(); + InitFramework(); +#if NET452 + InitOSDetails(); +#endif + } + + [DisplayName("_client_name")] + public string ClientName => "mysql-connector-net"; + + [DisplayName("_client_licence")] + public string ClientLicence + { + get + { +#if COMMERCIAL + return "Commercial"; +#endif + return "GPL-2.0"; + } + } + + [DisplayName("_pid")] + public string PID + { + get + { + string pid = string.Empty; + try + { + pid = System.Diagnostics.Process.GetCurrentProcess().Id.ToString(CultureInfo.InvariantCulture); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex.ToString()); + } + + return pid; + } + } + + [DisplayName("_client_version")] + public string ClientVersion + { + get { return _version; } + } + + [DisplayName("_os")] + public string OS + { + get { return _os; } + } + + [DisplayName("_thread")] + public string Thread + { + get + { + string thread = string.Empty; + try + { + thread = System.Diagnostics.Process.GetCurrentProcess().Threads[0].Id.ToString(CultureInfo.InvariantCulture); + } + catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.ToString()); } + + return thread; + } + } + + [DisplayName("_platform")] + public string Platform + { + get { return _platform; } + } + +#if NET452 + [DisplayName("_os_details")] + public string OSDetails + { + get { return _osDetails; } + } +#endif + + [DisplayName("_os")] + public string OSName + { + get { return _osName; } + } + + [DisplayName("_framework")] + public string Framework + { + get { return _framework; } + } + + private static void InitVersion() + { + _version = string.Empty; + try + { + _version = typeof(MySqlConnectAttrs).GetTypeInfo().Assembly.GetName().Version.ToString(); + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex.ToString()); + } + } + + private static void InitOS() + { + _os = string.Empty; + try + { + _os = Environment.OSVersion.Platform.ToString(); + if (_os == "Win32NT") + { + _os = "Win"; + _os += Is64BitOS() ? "64" : "32"; + } + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex.ToString()); + } + } + + private static void InitPlatform() + { + _platform = Is64BitOS() ? "x86_64" : "x86_32"; + } + +#if NET452 + private static void InitOSDetails() + { + _osDetails = string.Empty; + + try + { + var searcher = new System.Management.ManagementObjectSearcher("SELECT Caption FROM Win32_OperatingSystem"); + var collection = searcher.Get(); + foreach (var mgtObj in collection) + { + _osDetails = mgtObj.GetPropertyValue("Caption").ToString(); + break; + } + } + catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.ToString()); } + } +#endif + + + private static bool Is64BitOS() + { +#if CLR4 + return Environment.Is64BitOperatingSystem; +#else + return Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE") == "AMD64"; +#endif + } + + private static void InitOSName() + { + _osName = _os; + + var osInfo = Environment.OSVersion; + var major = osInfo.Version.Major; + var minor = osInfo.Version.Minor; + + if (osInfo.Platform.ToString().StartsWith("Win")) + { + switch (major) + { + case 5: + _osName = "Windows-XP-" + major + "." + minor; + break; + case 6: + switch (minor) + { + case 0: + _osName = "Windows-2008-" + major + "." + minor; + break; + case 1: + _osName = "Windows-7-" + major + "." + minor; + break; + case 2: + _osName = "Windows-8-" + major + "." + minor; + break; + case 3: + _osName = "Windows-8.1-" + major + "." + minor; + break; + } + break; + case 10: + _osName = "Windows-10-" + major + "." + minor; + break; + default: + _osName = "Windows"; + break; + } + } + else + _osName = _os + "-" + major + "." + minor; + } + + private static void InitFramework() + { + _framework = string.Empty; + try + { + _framework = Assembly.GetEntryAssembly().GetCustomAttribute().FrameworkName; + } + catch (Exception ex) + { + System.Diagnostics.Debug.WriteLine(ex.ToString()); + } + } + } +} diff --git a/MySQL.Data/src/NativeDriver.cs b/MySQL.Data/src/NativeDriver.cs new file mode 100644 index 000000000..a726c2376 --- /dev/null +++ b/MySQL.Data/src/NativeDriver.cs @@ -0,0 +1,922 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using MySql.Data.MySqlClient.Authentication; +using MySql.Data.Types; +using System; +using System.Collections; +using System.ComponentModel; +using System.IO; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + /// + /// Summary description for Driver. + /// + internal class NativeDriver : IDriver + { + private DBVersion version; + private int threadId; + protected byte[] encryptionSeed; + protected ServerStatusFlags serverStatus; + protected MySqlStream stream; + protected Stream baseStream; + protected MyNetworkStream networkStream; + private BitArray nullMap; + private MySqlPacket packet; + private ClientFlags connectionFlags; + private Driver owner; + private int warnings; + private MySqlAuthenticationPlugin authPlugin; + + // Regular expression that checks for GUID format + private static Regex guidRegex = new Regex(@"(?i)^[0-9A-F]{8}[-](?:[0-9A-F]{4}[-]){3}[0-9A-F]{12}$"); + + public NativeDriver(Driver owner) + { + this.owner = owner; + threadId = -1; + } + + public ClientFlags Flags + { + get { return connectionFlags; } + } + + public int ThreadId + { + get { return threadId; } + } + + public DBVersion Version + { + get { return version; } + } + + public ServerStatusFlags ServerStatus + { + get { return serverStatus; } + } + + public int WarningCount + { + get { return warnings; } + } + + public MySqlPacket Packet + { + get { return packet; } + } + + internal MySqlConnectionStringBuilder Settings + { + get { return owner.Settings; } + } + + internal Encoding Encoding + { + get { return owner.Encoding; } + } + + private async Task HandleExceptionAsync(MySqlException ex, bool execAsync) + { + if (ex.IsFatal) + await owner.CloseAsync(execAsync).ConfigureAwait(false); + } + + internal async Task SendPacketAsync(MySqlPacket p, bool execAsync) + { + await stream.SendPacketAsync(p, execAsync).ConfigureAwait(false); + } + + internal async Task SendEmptyPacketAsync(bool execAsync) + { + byte[] buffer = new byte[4]; + await stream.SendEntirePacketDirectlyAsync(buffer, 0, execAsync).ConfigureAwait(false); + } + + internal async Task ReadPacketAsync(bool execAsync) + { + return packet = await stream.ReadPacketAsync(execAsync).ConfigureAwait(false); + } + + internal async Task ReadOkAsync(bool read, bool execAsync) + { + try + { + if (read) + packet = await stream.ReadPacketAsync(execAsync).ConfigureAwait(false); + + byte header = packet.ReadByte(); + if (header != 0) + { + throw new MySqlException("Out of sync with server", true, null); + } + + OkPacket okPacket = await OkPacket.CreateAsync(packet, execAsync).ConfigureAwait(false); + serverStatus = okPacket.ServerStatusFlags; + + return okPacket; + } + catch (MySqlException ex) + { + await HandleExceptionAsync(ex, execAsync).ConfigureAwait(false); + throw; + } + } + + /// + /// Sets the current database for the this connection + /// + /// + /// Boolean that indicates if the function will be executed asynchronously. + public async Task SetDatabaseAsync(string dbName, bool execAsync) + { + byte[] dbNameBytes = Encoding.GetBytes(dbName); + + packet.Clear(); + packet.WriteByte((byte)DBCmd.INIT_DB); + await packet.WriteAsync(dbNameBytes, execAsync).ConfigureAwait(false); + await ExecutePacketAsync(packet, execAsync).ConfigureAwait(false); + + await ReadOkAsync(true, execAsync).ConfigureAwait(false); + } + + public void Configure() + { + stream.MaxPacketSize = (ulong)owner.MaxPacketSize; + stream.Encoding = Encoding; + } + + public async Task OpenAsync(bool execAsync, CancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + + // connect to one of our specified hosts + try + { + var result = await StreamCreator.GetStreamAsync(Settings, cancellationToken, execAsync).ConfigureAwait(false); + + baseStream = result.Item1; + networkStream = result.Item2; + + if (Settings.IncludeSecurityAsserts) + MySqlSecurityPermission.CreatePermissionSet(false).Assert(); + } + catch (System.Security.SecurityException) { throw; } + catch (TimeoutException) { throw; } + catch (AggregateException ae) + { + ae.Handle(ex => + { + if (ex is System.Net.Sockets.SocketException) + throw new MySqlException(Resources.UnableToConnectToHost, (int)MySqlErrorCode.UnableToConnectToHost, ex); + return ex is MySqlException; + }); + } + catch (Exception ex) + { + throw new MySqlException(Resources.UnableToConnectToHost, (int)MySqlErrorCode.UnableToConnectToHost, ex); + } + + if (baseStream == null) + throw new MySqlException(Resources.UnableToConnectToHost, (int)MySqlErrorCode.UnableToConnectToHost); + + int maxSinglePacket = 255 * 255 * 255; + stream = new MySqlStream(baseStream, Encoding, false, networkStream?.Socket); + + stream.ResetTimeout((int)Settings.ConnectionTimeout * 1000); + + // read off the welcome packet and parse out it's values + packet = await stream.ReadPacketAsync(execAsync).ConfigureAwait(false); + + int protocol = packet.ReadByte(); + if (protocol != 10) + throw new MySqlException("Unsupported protocol version."); + string versionString = packet.ReadString(); + version = DBVersion.Parse(versionString); + threadId = packet.ReadInteger(4); + + byte[] seedPart1 = packet.ReadStringAsBytes(); + + maxSinglePacket = (256 * 256 * 256) - 1; + + // read in Server capabilities if they are provided + ClientFlags serverCaps = 0; + if (packet.HasMoreData) + serverCaps = (ClientFlags)packet.ReadInteger(2); + + /* New protocol with 16 bytes to describe server characteristics */ + owner.ConnectionCharSetIndex = (int)packet.ReadByte(); + + serverStatus = (ServerStatusFlags)packet.ReadInteger(2); + + // Since 5.5, high bits of server caps are stored after status. + // Previously, it was part of reserved always 0x00 13-byte filler. + uint serverCapsHigh = (uint)packet.ReadInteger(2); + serverCaps |= (ClientFlags)(serverCapsHigh << 16); + + packet.Position += 11; + byte[] seedPart2 = packet.ReadStringAsBytes(); + encryptionSeed = new byte[seedPart1.Length + seedPart2.Length]; + seedPart1.CopyTo(encryptionSeed, 0); + seedPart2.CopyTo(encryptionSeed, seedPart1.Length); + + string authenticationMethod = Settings.DefaultAuthenticationPlugin; + if (string.IsNullOrWhiteSpace(authenticationMethod)) + { + if ((serverCaps & ClientFlags.PLUGIN_AUTH) != 0) + authenticationMethod = packet.ReadString(); + else + // Some MySql versions like 5.1, don't give name of plugin, default to native password. + authenticationMethod = "mysql_native_password"; + } + + // based on our settings, set our connection flags + SetConnectionFlags(serverCaps); + + packet.Clear(); + await packet.WriteIntegerAsync((int)connectionFlags, 4, execAsync).ConfigureAwait(false); + await packet.WriteIntegerAsync(maxSinglePacket, 4, execAsync).ConfigureAwait(false); + packet.WriteByte(33); //character set utf-8 + await packet.WriteAsync(new byte[23], execAsync).ConfigureAwait(false); + + // Server doesn't support SSL connections + if ((serverCaps & ClientFlags.SSL) == 0) + { + if (Settings.SslMode != MySqlSslMode.Disabled && Settings.SslMode != MySqlSslMode.Prefered) + throw new MySqlException(string.Format(Resources.NoServerSSLSupport, Settings.Server)); + } + // Current connection doesn't support SSL connections + else if ((connectionFlags & ClientFlags.SSL) == 0) + { + if (Settings.SslMode != MySqlSslMode.Disabled && Settings.SslMode != MySqlSslMode.Prefered) + throw new MySqlException(string.Format(Resources.SslNotAllowedForConnectionProtocol, Settings.ConnectionProtocol)); + } + // Server and connection supports SSL connections and Client are requisting a secure connection + else + { + await stream.SendPacketAsync(packet, execAsync).ConfigureAwait(false); + var result = await new Ssl(Settings).StartSSLAsync(baseStream, Encoding, Settings.ToString(), cancellationToken, execAsync).ConfigureAwait(false); + stream = result.Item1; + baseStream = result.Item2; + packet.Clear(); + await packet.WriteIntegerAsync((int)connectionFlags, 4, execAsync).ConfigureAwait(false); + await packet.WriteIntegerAsync(maxSinglePacket, 4, execAsync).ConfigureAwait(false); + packet.WriteByte(33); //character set utf-8 + await packet.WriteAsync(new byte[23], execAsync).ConfigureAwait(false); + } + + try + { + await AuthenticateAsync(authenticationMethod, false, execAsync).ConfigureAwait(false); + } + catch (Exception) + { + // If the authenticationMethod is kerberos and KerberosAuthMode is on AUTO, it will retry the connection using GSSAPI mode + if ((authenticationMethod == "authentication_kerberos_client" || authPlugin.SwitchedPlugin == "authentication_kerberos_client") + && Settings.KerberosAuthMode == KerberosAuthMode.AUTO) + { + Settings.KerberosAuthMode = KerberosAuthMode.GSSAPI; + await OpenAsync(execAsync, cancellationToken).ConfigureAwait(false); + } + else + throw; + } + + // if we are using compression, then we use our CompressedStream class + // to hide the ugliness of managing the compression + if ((connectionFlags & ClientFlags.COMPRESS) != 0) + stream = new MySqlStream(baseStream, Encoding, true, networkStream?.Socket); + + // give our stream the server version we are connected to. + // We may have some fields that are read differently based + // on the version of the server we are connected to. + packet.Version = version; + stream.MaxBlockSize = maxSinglePacket; + } + + #region Authentication + + /// + /// Return the appropriate set of connection flags for our + /// server capabilities and our user requested options. + /// + private void SetConnectionFlags(ClientFlags serverCaps) + { + // We always allow multiple result sets + ClientFlags flags = ClientFlags.MULTI_RESULTS; + + // allow load data local infile + if (Settings.AllowLoadLocalInfile || !String.IsNullOrWhiteSpace(Settings.AllowLoadLocalInfileInPath)) + flags |= ClientFlags.LOCAL_FILES; + + if (!Settings.UseAffectedRows) + flags |= ClientFlags.FOUND_ROWS; + + flags |= ClientFlags.PROTOCOL_41; + // Need this to get server status values + flags |= ClientFlags.TRANSACTIONS; + + // user allows/disallows batch statements + if (Settings.AllowBatch) + flags |= ClientFlags.MULTI_STATEMENTS; + + // if the server allows it, tell it that we want long column info + if ((serverCaps & ClientFlags.LONG_FLAG) != 0) + flags |= ClientFlags.LONG_FLAG; + + // if the server supports it and it was requested, then turn on compression + if ((serverCaps & ClientFlags.COMPRESS) != 0 && Settings.UseCompression) + flags |= ClientFlags.COMPRESS; + + flags |= ClientFlags.LONG_PASSWORD; // for long passwords + + // did the user request an interactive session? + if (Settings.InteractiveSession) + flags |= ClientFlags.INTERACTIVE; + + // if the server allows it and a database was specified, then indicate + // that we will connect with a database name + if ((serverCaps & ClientFlags.CONNECT_WITH_DB) != 0 && + Settings.Database != null && Settings.Database.Length > 0) + flags |= ClientFlags.CONNECT_WITH_DB; + + // if the server is requesting a secure connection, then we oblige + if ((serverCaps & ClientFlags.SECURE_CONNECTION) != 0) + flags |= ClientFlags.SECURE_CONNECTION; + + // if the server is capable of SSL and the user is requesting SSL + if ((serverCaps & ClientFlags.SSL) != 0 && Settings.SslMode != MySqlSslMode.Disabled + && Settings.ConnectionProtocol != MySqlConnectionProtocol.NamedPipe + && Settings.ConnectionProtocol != MySqlConnectionProtocol.SharedMemory) + flags |= ClientFlags.SSL; + + // if the server supports output parameters, then we do too + if ((serverCaps & ClientFlags.PS_MULTI_RESULTS) != 0) + flags |= ClientFlags.PS_MULTI_RESULTS; + + if ((serverCaps & ClientFlags.PLUGIN_AUTH) != 0) + flags |= ClientFlags.PLUGIN_AUTH; + + // if the server supports connection attributes + if ((serverCaps & ClientFlags.CONNECT_ATTRS) != 0) + flags |= ClientFlags.CONNECT_ATTRS; + + if ((serverCaps & ClientFlags.CAN_HANDLE_EXPIRED_PASSWORD) != 0) + flags |= ClientFlags.CAN_HANDLE_EXPIRED_PASSWORD; + + // if the server supports query attributes + if ((serverCaps & ClientFlags.CLIENT_QUERY_ATTRIBUTES) != 0) + flags |= ClientFlags.CLIENT_QUERY_ATTRIBUTES; + + // if the server supports MFA + if ((serverCaps & ClientFlags.MULTI_FACTOR_AUTHENTICATION) != 0) + flags |= ClientFlags.MULTI_FACTOR_AUTHENTICATION; + + // need this to get server session trackers + flags |= ClientFlags.CLIENT_SESSION_TRACK; + + connectionFlags = flags; + } + + public async Task AuthenticateAsync(string authMethod, bool reset, bool execAsync) + { + if (authMethod != null) + { + // Integrated security is a shortcut for windows auth + if (Settings.IntegratedSecurity) + authMethod = "authentication_windows_client"; + + authPlugin = await MySqlAuthenticationPlugin.GetPluginAsync(authMethod, this, encryptionSeed, execAsync).ConfigureAwait(false); + } + await authPlugin.AuthenticateAsync(reset, execAsync).ConfigureAwait(false); + } + + #endregion + + public async Task ResetAsync(bool execAsync) + { + warnings = 0; + stream.Encoding = this.Encoding; + stream.SequenceByte = 0; + packet.Clear(); + packet.WriteByte((byte)DBCmd.CHANGE_USER); + await AuthenticateAsync(null, true, execAsync).ConfigureAwait(false); + } + + /// + /// Query is the method that is called to send all queries to the server + /// + public async Task SendQueryAsync(MySqlPacket queryPacket, bool execAsync, int paramsPosition) + { + warnings = 0; + queryPacket.SetByte(4, (byte)DBCmd.QUERY); + await ExecutePacketAsync(queryPacket, execAsync).ConfigureAwait(false); + // the server will respond in one of several ways with the first byte indicating + // the type of response. + // 0 == ok packet. This indicates non-select queries + // 0xff == error packet. This is handled in stream.OpenPacket + // > 0 = number of columns in select query + // We don't actually read the result here since a single query can generate + // multiple resultsets and we don't want to duplicate code. See ReadResult + // Instead we set our internal server status flag to indicate that we have a query waiting. + // This flag will be maintained by ReadResult + serverStatus |= ServerStatusFlags.AnotherQuery; + } + + public async Task CloseAsync(bool isOpen, bool execAsync) + { + try + { + if (isOpen) + { + try + { + packet.Clear(); + packet.WriteByte((byte)DBCmd.QUIT); + await ExecutePacketAsync(packet, execAsync).ConfigureAwait(false); + } + catch (Exception ex) + { + MySqlTrace.LogError(ThreadId, ex.ToString()); + // Eat exception here. We should try to closing + // the stream anyway. + } + } + + if (stream != null) + await stream.CloseAsync(execAsync).ConfigureAwait(false); + stream = null; + } + catch (Exception) + { + // we are just going to eat any exceptions + // generated here + } + } + + public async Task PingAsync(bool execAsync) + { + try + { + packet.Clear(); + packet.WriteByte((byte)DBCmd.PING); + await ExecutePacketAsync(packet, execAsync).ConfigureAwait(false); + await ReadOkAsync(true, execAsync).ConfigureAwait(false); + return true; + } + catch (Exception) + { + await owner.CloseAsync(execAsync).ConfigureAwait(false); + return false; + } + } + + public async Task> GetResultAsync(int affectedRow, long insertedId, bool execAsync) + { + try + { + if (stream.Socket == null && networkStream?.Socket != null) + { + stream.Socket = networkStream.Socket; + } + packet = await stream.ReadPacketAsync(execAsync).ConfigureAwait(false); + } + catch (TimeoutException) + { + // Do not reset serverStatus, allow to reenter, e.g when + // ResultSet is closed. + throw; + } + catch (Exception) + { + serverStatus &= ~(ServerStatusFlags.AnotherQuery | + ServerStatusFlags.MoreResults); + throw; + } + + int fieldCount = (int)packet.ReadFieldLength(); + if (-1 == fieldCount) + { + if (Settings.AllowLoadLocalInfile || !string.IsNullOrWhiteSpace(Settings.AllowLoadLocalInfileInPath)) + { + string filename = packet.ReadString(); + + if (!Settings.AllowLoadLocalInfile) + await ValidateLocalInfileSafePathAsync(filename, execAsync).ConfigureAwait(false); + + await SendFileToServerAsync(filename, execAsync).ConfigureAwait(false); + + return await GetResultAsync(affectedRow, insertedId, execAsync).ConfigureAwait(false); + } + else + { + await stream.CloseAsync(execAsync).ConfigureAwait(false); + + if (Settings.AllowLoadLocalInfile) + throw new MySqlException(Resources.LocalInfileDisabled, (int)MySqlErrorCode.LoadInfo); + throw new MySqlException(Resources.InvalidPathForLoadLocalInfile, (int)MySqlErrorCode.LoadInfo); + } + } + else if (fieldCount == 0) + { + // the code to read last packet will set these server status vars + // again if necessary. + serverStatus &= ~(ServerStatusFlags.AnotherQuery | + ServerStatusFlags.MoreResults); + + OkPacket okPacket = await OkPacket.CreateAsync(packet, execAsync).ConfigureAwait(false); + affectedRow = (int)okPacket.AffectedRows; + insertedId = okPacket.LastInsertId; + serverStatus = okPacket.ServerStatusFlags; + warnings += okPacket.WarningCount; + } + + return new Tuple(fieldCount, affectedRow, insertedId); + } + + /// + /// Verify that the file to upload is in a valid directory + /// according to the safe path entered by a user under + /// "AllowLoadLocalInfileInPath" connection option. + /// + /// File to validate against the safe path. + /// Boolean that indicates if the function will be executed asynchronously. + private async Task ValidateLocalInfileSafePathAsync(string filePath, bool execAsync) + { + if (!Path.GetFullPath(filePath).StartsWith(Path.GetFullPath(Settings.AllowLoadLocalInfileInPath))) + { + await stream.CloseAsync(execAsync).ConfigureAwait(false); + throw new MySqlException(Resources.UnsafePathForLoadLocalInfile, (int)MySqlErrorCode.LoadInfo); + } + } + + /// + /// Sends the specified file to the server. + /// This supports the LOAD DATA LOCAL INFILE + /// + /// + /// Boolean that indicates if the function will be executed asynchronously. + private async Task SendFileToServerAsync(string filename, bool execAsync) + { + byte[] buffer = new byte[8196]; + + long len = 0; + try + { + using (Stream fs = owner.BulkLoaderStream ?? new FileStream(filename, FileMode.Open, FileAccess.Read)) + { + len = fs.Length; + fs.Position = 0; + + while (len > 0) + { + int count = execAsync + ? await fs.ReadAsync(buffer, 4, (int)(len > 8192 ? 8192 : len)).ConfigureAwait(false) + : fs.Read(buffer, 4, (int)(len > 8192 ? 8192 : len)); + + await stream.SendEntirePacketDirectlyAsync(buffer, count, execAsync).ConfigureAwait(false); + len -= count; + } + + await stream.SendEntirePacketDirectlyAsync(buffer, 0, execAsync).ConfigureAwait(false); + } + } + catch (Exception ex) + { + await stream.CloseAsync(execAsync).ConfigureAwait(false); + throw new MySqlException("Error during LOAD DATA LOCAL INFILE", ex); + } + } + + private async Task ReadNullMapAsync(int fieldCount, bool execAsync) + { + // if we are binary, then we need to load in our null bitmap + nullMap = null; + byte[] nullMapBytes = new byte[(fieldCount + 9) / 8]; + packet.ReadByte(); + await packet.ReadAsync(nullMapBytes, 0, nullMapBytes.Length, execAsync).ConfigureAwait(false); + nullMap = new BitArray(nullMapBytes); + } + + public async Task ReadColumnValueAsync(int index, MySqlField field, IMySqlValue valObject, bool execAsync) + { + long length = -1; + bool isNull; + + if (nullMap != null) + { + isNull = nullMap[index + 2]; + if (!MySqlField.GetIMySqlValue(field.Type).GetType().Equals(valObject.GetType()) && !field.IsUnsigned) + length = packet.ReadFieldLength(); + } + else + { + length = packet.ReadFieldLength(); + isNull = length == -1; + } + + if (!isNull && (valObject.MySqlDbType is MySqlDbType.Guid && !Settings.OldGuids) && + (length > 0 && !guidRegex.IsMatch(Encoding.GetString(packet.Buffer, packet.Position, (int)length)))) + { + field.Type = MySqlDbType.String; + valObject = field.GetValueObject(); + } + + packet.Encoding = field.Encoding; + packet.Version = version; + var val = await valObject.ReadValueAsync(packet, length, isNull, execAsync).ConfigureAwait(false); + + if (val is MySqlDateTime d) + { + d.TimezoneOffset = field.driver.timeZoneOffset; + return d; + } + + return val; + } + + public void SkipColumnValue(IMySqlValue valObject) + { + int length = -1; + if (nullMap == null) + { + length = (int)packet.ReadFieldLength(); + if (length == -1) return; + } + if (length > -1) + packet.Position += length; + else + valObject.SkipValue(packet); + } + + public async Task GetColumnsDataAsync(MySqlField[] columns, bool execAsync) + { + for (int i = 0; i < columns.Length; i++) + await GetColumnDataAsync(columns[i], execAsync).ConfigureAwait(false); + await ReadEOFAsync(execAsync).ConfigureAwait(false); + } + + private async Task GetColumnDataAsync(MySqlField field, bool execAsync) + { + stream.Encoding = Encoding; + packet = await stream.ReadPacketAsync(execAsync).ConfigureAwait(false); + field.Encoding = Encoding; + field.CatalogName = await packet.ReadLenStringAsync(execAsync).ConfigureAwait(false); + field.DatabaseName = await packet.ReadLenStringAsync(execAsync).ConfigureAwait(false); + field.TableName = await packet.ReadLenStringAsync(execAsync).ConfigureAwait(false); + field.RealTableName = await packet.ReadLenStringAsync(execAsync).ConfigureAwait(false); + field.ColumnName = await packet.ReadLenStringAsync(execAsync).ConfigureAwait(false); + field.OriginalColumnName = await packet.ReadLenStringAsync(execAsync).ConfigureAwait(false); + packet.ReadByte(); + field.CharacterSetIndex = packet.ReadInteger(2); + field.ColumnLength = packet.ReadInteger(4); + MySqlDbType type = (MySqlDbType)packet.ReadByte(); + ColumnFlags colFlags; + if ((connectionFlags & ClientFlags.LONG_FLAG) != 0) + colFlags = (ColumnFlags)packet.ReadInteger(2); + else + colFlags = (ColumnFlags)packet.ReadByte(); + field.Scale = (byte)packet.ReadByte(); + + if (packet.HasMoreData) + { + packet.ReadInteger(2); // reserved + } + + if (type == MySqlDbType.Decimal || type == MySqlDbType.NewDecimal) + { + field.Precision = ((colFlags & ColumnFlags.UNSIGNED) != 0) ? (byte)(field.ColumnLength) : (byte)(field.ColumnLength - 1); + if (field.Scale != 0) + field.Precision--; + } + + field.SetTypeAndFlags(type, colFlags); + } + + private async Task ExecutePacketAsync(MySqlPacket packetToExecute, bool execAsync) + { + try + { + warnings = 0; + stream.SequenceByte = 0; + await stream.SendPacketAsync(packetToExecute, execAsync).ConfigureAwait(false); + } + catch (MySqlException ex) + { + await HandleExceptionAsync(ex, execAsync).ConfigureAwait(false); + throw; + } + } + + public async Task ExecuteStatementAsync(MySqlPacket packetToExecute, bool execAsync) + { + warnings = 0; + packetToExecute.SetByte(4, (byte)DBCmd.EXECUTE); + await ExecutePacketAsync(packetToExecute, execAsync).ConfigureAwait(false); + serverStatus |= ServerStatusFlags.AnotherQuery; + } + + private void CheckEOF() + { + if (!packet.IsLastPacket) + throw new MySqlException("Expected end of data packet"); + + packet.ReadByte(); // read off the 254 + + if (packet.HasMoreData) + { + warnings += packet.ReadInteger(2); + serverStatus = (ServerStatusFlags)packet.ReadInteger(2); + + // if we are at the end of this cursor based resultset, then we remove + // the last row sent status flag so our next fetch doesn't abort early + // and we remove this command result from our list of active CommandResult objects. + // if ((serverStatus & ServerStatusFlags.LastRowSent) != 0) + // { + // serverStatus &= ~ServerStatusFlags.LastRowSent; + // commandResults.Remove(lastCommandResult); + // } + } + } + + private async Task ReadEOFAsync(bool execAsync) + { + packet = await stream.ReadPacketAsync(execAsync).ConfigureAwait(false); + CheckEOF(); + } + + public async Task> PrepareStatementAsync(string sql, bool execAsync) + { + //TODO: check this + //ClearFetchedRow(); + MySqlField[] parameters = null; + packet.Length = sql.Length * 4 + 5; + byte[] buffer = packet.Buffer; + int len = Encoding.GetBytes(sql, 0, sql.Length, packet.Buffer, 5); + packet.Position = len + 5; + buffer[4] = (byte)DBCmd.PREPARE; + await ExecutePacketAsync(packet, execAsync).ConfigureAwait(false); + + packet = await stream.ReadPacketAsync(execAsync).ConfigureAwait(false); + + int marker = packet.ReadByte(); + if (marker != 0) + throw new MySqlException("Expected prepared statement marker"); + + int statementId = packet.ReadInteger(4); + int numCols = packet.ReadInteger(2); + int numParams = packet.ReadInteger(2); + //TODO: find out what this is needed for + packet.ReadInteger(3); + if (numParams > 0) + { + parameters = await owner.GetColumnsAsync(numParams, execAsync).ConfigureAwait(false); + // we set the encoding for each parameter back to our connection encoding + // since we can't trust what is coming back from the server + for (int i = 0; i < parameters.Length; i++) + parameters[i].Encoding = Encoding; + } + + if (numCols > 0) + { + while (numCols-- > 0) + { + packet = await stream.ReadPacketAsync(execAsync).ConfigureAwait(false); + //TODO: handle streaming packets + } + + await ReadEOFAsync(execAsync).ConfigureAwait(false); + } + + return new Tuple(statementId, parameters); + } + + // private void ClearFetchedRow() + // { + // if (lastCommandResult == 0) return; + + //TODO + /* CommandResult result = (CommandResult)commandResults[lastCommandResult]; + result.ReadRemainingColumns(); + + stream.OpenPacket(); + if (! stream.IsLastPacket) + throw new MySqlException("Cursor reading out of sync"); + + ReadEOF(false); + lastCommandResult = 0;*/ + // } + + /// + /// FetchDataRow is the method that the data reader calls to see if there is another + /// row to fetch. In the non-prepared mode, it will simply read the next data packet. + /// In the prepared mode (statementId > 0), it will + /// + public async Task FetchDataRowAsync(int statementId, int columns, bool execAsync) + { + /* ClearFetchedRow(); + + if (!commandResults.ContainsKey(statementId)) return false; + + if ( (serverStatus & ServerStatusFlags.LastRowSent) != 0) + return false; + + stream.StartPacket(9, true); + stream.WriteByte((byte)DBCmd.FETCH); + stream.WriteInteger(statementId, 4); + stream.WriteInteger(1, 4); + stream.Flush(); + + lastCommandResult = statementId; + */ + packet = await stream.ReadPacketAsync(execAsync).ConfigureAwait(false); + if (packet.IsLastPacket) + { + CheckEOF(); + return false; + } + nullMap = null; + if (statementId > 0) + await ReadNullMapAsync(columns, execAsync).ConfigureAwait(false); + + return true; + } + + public async Task CloseStatementAsync(int statementId, bool execAsync) + { + packet.Clear(); + packet.WriteByte((byte)DBCmd.CLOSE_STMT); + await packet.WriteIntegerAsync((long)statementId, 4, execAsync).ConfigureAwait(false); + stream.SequenceByte = 0; + await stream.SendPacketAsync(packet, execAsync).ConfigureAwait(false); + } + + /// + /// Execution timeout, in milliseconds. When the accumulated time for network IO exceeds this value + /// TimeoutException is thrown. This timeout needs to be reset for every new command + /// + /// + public void ResetTimeout(int timeout) + { + if (stream != null) + stream.ResetTimeout(timeout); + } + + internal async Task SetConnectAttrsAsync(bool execAsync) + { + // Sets connect attributes + if ((connectionFlags & ClientFlags.CONNECT_ATTRS) != 0) + { + string connectAttrs = string.Empty; + MySqlConnectAttrs attrs = new MySqlConnectAttrs(); + foreach (PropertyInfo property in attrs.GetType().GetProperties()) + { + string name = property.Name; + object[] customAttrs = property.GetCustomAttributes(typeof(DisplayNameAttribute), false); + + if (customAttrs.Length > 0) + name = (customAttrs[0] as DisplayNameAttribute).DisplayName; + + string value = (string)property.GetValue(attrs, null); + connectAttrs += string.Format("{0}{1}", (char)name.Length, name); + connectAttrs += string.Format("{0}{1}", (char)Encoding.UTF8.GetBytes(value).Length, value); + } + + await packet.WriteLenStringAsync(connectAttrs, execAsync).ConfigureAwait(false); + } + } + } +} diff --git a/MySQL.Data/src/OkPacket.cs b/MySQL.Data/src/OkPacket.cs new file mode 100644 index 000000000..45a05f8ff --- /dev/null +++ b/MySQL.Data/src/OkPacket.cs @@ -0,0 +1,134 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + /// + /// Class that represents the response OK Packet + /// https://dev.mysql.com/doc/internals/en/packet-OK_Packet.html + /// + internal class OkPacket + { + internal long AffectedRows { get; private set; } + internal long LastInsertId { get; private set; } + internal ServerStatusFlags ServerStatusFlags { get; private set; } + internal int WarningCount { get; private set; } + internal string Info { get; private set; } + internal List SessionTrackers { get; private set; } + + /// + /// Creates an instance of the OKPacket object with all of its metadata + /// + /// The packet to parse + /// Boolean that indicates if the function will be executed asynchronously. + public static async Task CreateAsync(MySqlPacket packet, bool execAsync) + { + OkPacket okPacket = new OkPacket(); + await okPacket.InitializeAsync(packet, execAsync).ConfigureAwait(false); + return okPacket; + } + + private OkPacket() { } + + private async Task InitializeAsync(MySqlPacket packet, bool execAsync) + { + AffectedRows = packet.ReadFieldLength(); // affected rows + LastInsertId = packet.ReadFieldLength(); // last insert-id + ServerStatusFlags = (ServerStatusFlags)packet.ReadInteger(2); // status flags + WarningCount = packet.ReadInteger(2); // warning count + Info = await packet.ReadLenStringAsync(execAsync).ConfigureAwait(false); // info + SessionTrackers = new List(); + + if ((ServerStatusFlags & ServerStatusFlags.SessionStateChanged) != 0) + { + int totalLen = packet.ReadPackedInteger(); + int start = packet.Position; + int end = start + totalLen; + + while (totalLen > 0 && end > start) + { + SessionTrackType type = (SessionTrackType)packet.ReadByte(); + int dataLength = (int)packet.ReadByte(); + string name, value; + + // for specification of the packet structure, see WL#4797 + switch (type) + { + case SessionTrackType.SystemVariables: + name = await packet.ReadStringAsync(packet.ReadByte(), execAsync).ConfigureAwait(false); + value = await packet.ReadStringAsync(packet.ReadByte(), execAsync).ConfigureAwait(false); + AddTracker(type, name, value); + break; + case SessionTrackType.GTIDS: + packet.ReadByte(); // skip the byte reserved for the encoding specification, see WL#6128 + name = await packet.ReadStringAsync(packet.ReadByte(), execAsync).ConfigureAwait(false); + AddTracker(type, name, null); + break; + case SessionTrackType.Schema: + case SessionTrackType.TransactionCharacteristics: + case SessionTrackType.TransactionState: + name = await packet.ReadStringAsync(packet.ReadByte(), execAsync).ConfigureAwait(false); + AddTracker(type, name, null); + break; + case SessionTrackType.StateChange: + default: + AddTracker(type, packet.ReadString(), null); + break; + } + + start = packet.Position; + } + } + } + + /// + /// Add a session tracker to the list + /// + /// Type of the session tracker + /// Name of the element changed + /// Value of the changed system variable (only for SessionTrackType.SystemVariables; otherwise, null) + private void AddTracker(SessionTrackType type, string name, string value) + { + SessionTracker tracker; + tracker.TrackType = type; + tracker.Name = name; + tracker.Value = value; + SessionTrackers.Add(tracker); + } + } + + internal struct SessionTracker + { + internal SessionTrackType TrackType; + internal string Name; + internal string Value; + } +} diff --git a/MySQL.Data/src/PacketBitConverter.cs b/MySQL.Data/src/PacketBitConverter.cs new file mode 100644 index 000000000..9c20ae703 --- /dev/null +++ b/MySQL.Data/src/PacketBitConverter.cs @@ -0,0 +1,115 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySql.Data +{ + public static class PacketBitConverter + { + // Due to the lack of support of the C# BinaryPrimitives class + // on net452 and net48 this class is necessary for back compatibility. + // All instances of PacketBitConverter can be replaced with corresponding + // BinaryPrimitives methods for future versions. + + // The server sends MySql Packets in LittleEndian encoding + // The methods provided by the BitConverter class check for the + // endian-ness of the client system and do conversions accordingly + // which lead to incorrect conversions on BigEndian systems + + // Following function are analogues with BinaryPrimitives.Write*LittleEndian + public static byte[] GetBytes(int value) + { + return new byte[] { + (byte)value, (byte)(value >> 8), (byte)(value >> 16), (byte)(value >> 24) + }; + } + + public static byte[] GetBytes(long value) + { + return new byte[] { + (byte)value, (byte)(value >> 8), (byte)(value >> 16), (byte)(value >> 24), + (byte)(value >> 32), (byte)(value >> 40), (byte)(value >> 48), (byte)(value >> 56) + }; + } + + unsafe public static byte[] GetBytes(float value) + { + int val = *(int*)&value; + return GetBytes(val); + } + + unsafe public static byte[] GetBytes(double value) + { + long val = *(long*)&value; + return GetBytes(val); + } + + // Following functions are analogous to BinaryPrimitives.Read*LittleEndian + unsafe public static float ToSingle(byte[] byteArray, int startIndex) + { + int val = ToInt32(byteArray, startIndex); + return *(float*)&val; + } + + unsafe public static double ToDouble(byte[] byteArray, int startIndex) + { + long val = ToInt64(byteArray, startIndex); + return *(double*)&val; + } + + public static ushort ToUInt16(byte[] byteArray, int startIndex) + { + return (ushort)(byteArray[startIndex++] | byteArray[startIndex] << 8); + } + + public static uint ToUInt32(byte[] byteArray, int startIndex) + { + return (uint)(byteArray[startIndex++] | byteArray[startIndex++] << 8 + | byteArray[startIndex++] << 16 | byteArray[startIndex] << 24); + } + + public static ulong ToUInt64(byte[] byteArray, int startIndex) + { + return (ulong)ToUInt32(byteArray, startIndex) + ((ulong)ToUInt32(byteArray, startIndex + 4) << 32); + } + + public static short ToInt16(byte[] byteArray, int startIndex) + { + return (short)ToUInt16(byteArray, startIndex); + } + + public static int ToInt32(byte[] byteArray, int startIndex) + { + return (int)ToUInt32(byteArray, startIndex); + } + + public static long ToInt64(byte[] byteArray, int startIndex) + { + return (long)ToUInt64(byteArray, startIndex); + } + } +} diff --git a/MySQL.Data/src/PerformanceMonitor.cs b/MySQL.Data/src/PerformanceMonitor.cs new file mode 100644 index 000000000..3f786dfc7 --- /dev/null +++ b/MySQL.Data/src/PerformanceMonitor.cs @@ -0,0 +1,52 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Diagnostics; + + +namespace MySql.Data.MySqlClient +{ + internal class PerformanceMonitor + { + public PerformanceMonitor(MySqlConnection connection) + { + Connection = connection; + } + + public MySqlConnection Connection { get; private set; } + + public virtual void AddHardProcedureQuery() + { + } + + public virtual void AddSoftProcedureQuery() + { + } + } +} diff --git a/MySQL.Data/src/PreparableStatement.cs b/MySQL.Data/src/PreparableStatement.cs new file mode 100644 index 000000000..0f67d6413 --- /dev/null +++ b/MySQL.Data/src/PreparableStatement.cs @@ -0,0 +1,258 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Text; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + /// + /// Summary description for PreparedStatement. + /// + internal class PreparableStatement : Statement + { + BitArray _nullMap; + readonly List _parametersToSend = new List(); + MySqlPacket _packet; + int _dataPosition; + int _nullMapPosition; + + const int PARAMETER_COUNT_AVAILABLE = 0x08; // QueryAttributes should be sent to the server + + public PreparableStatement(MySqlCommand command, string text) + : base(command, text) + { + } + + #region Properties + + public int ExecutionCount { get; set; } + + public bool IsPrepared => StatementId > 0; + + public int StatementId { get; private set; } + + #endregion + + public async Task PrepareAsync(bool execAsync) + { + // strip out names from parameter markers + string text; + List parameterNames = PrepareCommandText(out text); + + // ask our connection to send the prepare command + var result = await Driver.PrepareStatementAsync(text, execAsync).ConfigureAwait(false); + StatementId = result.Item1; + MySqlField[] paramList = result.Item2; + + // now we need to assign our field names since we stripped them out + // for the prepare + for (int i = 0; i < parameterNames.Count; i++) + { + string parameterName = (string)parameterNames[i]; + MySqlParameter p = Parameters.GetParameterFlexible(parameterName, false); + if (p == null) + throw new InvalidOperationException( + String.Format(Resources.ParameterNotFoundDuringPrepare, parameterName)); + p.Encoding = paramList[i].Encoding; + _parametersToSend.Add(p); + } + + if (Attributes.Count > 0 && !Driver.SupportsQueryAttributes) + MySqlTrace.LogWarning(Connection.ServerThread, string.Format(Resources.QueryAttributesNotSupported, Driver.Version)); + + _packet = new MySqlPacket(Driver.Encoding); + + // write out some values that do not change run to run + _packet.WriteByte(0); + await _packet.WriteIntegerAsync(StatementId, 4, execAsync).ConfigureAwait(false); + // flags; if server supports query attributes, then set PARAMETER_COUNT_AVAILABLE (0x08) in the flags block + int flags = Driver.SupportsQueryAttributes && Driver.Version.isAtLeast(8, 0, 26) ? PARAMETER_COUNT_AVAILABLE : 0; + await _packet.WriteIntegerAsync(flags, 1, execAsync).ConfigureAwait(false); + await _packet.WriteIntegerAsync(1, 4, execAsync).ConfigureAwait(false); // iteration count; 1 for 4.1 + int num_params = paramList != null ? paramList.Length : 0; + // we don't send QA with PS when MySQL Server is not at least 8.0.26 + if (!Driver.Version.isAtLeast(8, 0, 26) && Attributes.Count > 0) + { + MySqlTrace.LogWarning(Connection.ServerThread, Resources.QueryAttributesNotSupportedByCnet); + Attributes.Clear(); + } + + if (num_params > 0 || + (Driver.SupportsQueryAttributes && flags == PARAMETER_COUNT_AVAILABLE)) // if num_params > 0 + { + int paramCount = num_params; + + if (Driver.SupportsQueryAttributes) // if CLIENT_QUERY_ATTRIBUTES is on + { + paramCount += Attributes.Count; + await _packet.WriteLengthAsync(paramCount, execAsync).ConfigureAwait(false); + } + + if (paramCount > 0) + { + // now prepare our null map + _nullMap = new BitArray(paramCount); + int numNullBytes = (_nullMap.Length + 7) / 8; + _nullMapPosition = _packet.Position; + _packet.Position += numNullBytes; // leave room for our null map + _packet.WriteByte(1); // new_params_bind_flag + + // write out the parameter types and names + foreach (MySqlParameter p in _parametersToSend) + { + // parameter type + await _packet.WriteIntegerAsync(p.GetPSType(), 2, execAsync).ConfigureAwait(false); + + // parameter name + if (Driver.SupportsQueryAttributes) // if CLIENT_QUERY_ATTRIBUTES is on + await _packet.WriteLenStringAsync(String.Empty, execAsync).ConfigureAwait(false); + } + + // write out the attributes types and names + foreach (MySqlAttribute a in Attributes) + { + // attribute type + await _packet.WriteIntegerAsync(a.GetPSType(), 2, execAsync).ConfigureAwait(false); + + // attribute name + if (Driver.SupportsQueryAttributes) // if CLIENT_QUERY_ATTRIBUTES is on + await _packet.WriteLenStringAsync(a.AttributeName, execAsync).ConfigureAwait(false); + } + } + } + + _dataPosition = _packet.Position; + } + + public override async Task ExecuteAsync(bool execAsync) + { + // if we are not prepared, then call down to our base + if (!IsPrepared) + { + await base.ExecuteAsync(execAsync).ConfigureAwait(false); + return; + } + + // now write out all non-null values + _packet.Position = _dataPosition; + + // set value for each parameter + for (int i = 0; i < _parametersToSend.Count; i++) + { + MySqlParameter p = _parametersToSend[i]; + _nullMap[i] = (p.Value == DBNull.Value || p.Value == null) || + p.Direction == ParameterDirection.Output; + if (_nullMap[i]) continue; + _packet.Encoding = p.Encoding; + await p.SerializeAsync(_packet, true, Connection.Settings, execAsync).ConfigureAwait(false); + } + + // // set value for each attribute + for (int i = 0; i < Attributes.Count; i++) + { + MySqlAttribute attr = Attributes[i]; + _nullMap[i] = (attr.Value == DBNull.Value || attr.Value == null); + if (_nullMap[i]) continue; + await attr.SerializeAsync(_packet, true, Connection.Settings, execAsync).ConfigureAwait(false); + } + + if (_nullMap != null) + { + byte[] tempByteArray = new byte[(_nullMap.Length + 7) >> 3]; + _nullMap.CopyTo(tempByteArray, 0); + + Array.Copy(tempByteArray, 0, _packet.Buffer, _nullMapPosition, tempByteArray.Length); + } + + ExecutionCount++; + + await Driver.ExecuteStatementAsync(_packet, execAsync).ConfigureAwait(false); + } + + public override async Task ExecuteNextAsync(bool execAsync) + { + if (!IsPrepared) + return await base.ExecuteNextAsync(execAsync).ConfigureAwait(false); + return false; + } + + /// + /// Prepares CommandText for use with the Prepare method + /// + /// Command text stripped of all paramter names + /// + /// Takes the output of TokenizeSql and creates a single string of SQL + /// that only contains '?' markers for each parameter. It also creates + /// the parameterMap array list that includes all the paramter names in the + /// order they appeared in the SQL + /// + private List PrepareCommandText(out string stripped_sql) + { + StringBuilder newSQL = new StringBuilder(); + List parameterMap = new List(); + + int startPos = 0; + string sql = ResolvedCommandText; + MySqlTokenizer tokenizer = new MySqlTokenizer(sql); + string parameter = tokenizer.NextParameter(); + int paramIndex = 0; + while (parameter != null) + { + if (parameter.IndexOf(StoredProcedure.ParameterPrefix) == -1) + { + newSQL.Append(sql.Substring(startPos, tokenizer.StartIndex - startPos)); + newSQL.Append("?"); + if (parameter.Length == 1 && tokenizer.IsParameterMarker(parameter.ToCharArray()[0])) + parameterMap.Add(Parameters[paramIndex].ParameterName); + else + parameterMap.Add(parameter); + startPos = tokenizer.StopIndex; + } + parameter = tokenizer.NextParameter(); + paramIndex++; + } + newSQL.Append(sql.Substring(startPos)); + stripped_sql = newSQL.ToString(); + return parameterMap; + } + + public virtual async Task CloseStatementAsync(bool execAsync) + { + if (!IsPrepared) return; + + await Driver.CloseStatementAsync(StatementId, execAsync).ConfigureAwait(false); + StatementId = 0; + } + } +} diff --git a/MySQL.Data/src/ProcedureCache.cs b/MySQL.Data/src/ProcedureCache.cs new file mode 100644 index 000000000..0e9aada5c --- /dev/null +++ b/MySQL.Data/src/ProcedureCache.cs @@ -0,0 +1,230 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + internal class ProcedureCacheEntry + { + public MySqlSchemaCollection procedure; + public MySqlSchemaCollection parameters; + } + + internal class ProcedureCache + { + private readonly Dictionary _procHash; + private readonly Queue _hashQueue; + private readonly int _maxSize; + + public ProcedureCache(int size) + { + _maxSize = size; + _hashQueue = new Queue(_maxSize); + _procHash = new Dictionary(_maxSize); + } + + public async Task GetProcedureAsync(MySqlConnection conn, string spName, string cacheKey, bool execAsync) + { + ProcedureCacheEntry proc = null; + + if (cacheKey != null) + { + int hash = cacheKey.GetHashCode(); + + lock (_procHash) + { + _procHash.TryGetValue(hash, out proc); + } + } + if (proc == null) + { + proc = await AddNewAsync(conn, spName, execAsync).ConfigureAwait(false); + conn.PerfMonitor.AddHardProcedureQuery(); + if (conn.Settings.Logging) + MySqlTrace.LogInformation(conn.ServerThread, + String.Format(Resources.HardProcQuery, spName)); + } + else + { + conn.PerfMonitor.AddSoftProcedureQuery(); + if (conn.Settings.Logging) + MySqlTrace.LogInformation(conn.ServerThread, + String.Format(Resources.SoftProcQuery, spName)); + } + return proc; + } + + internal string GetCacheKey(string spName, ProcedureCacheEntry proc) + { + string retValue = String.Empty; + StringBuilder key = new StringBuilder(spName); + key.Append("("); + string delimiter = ""; + if (proc.parameters != null) + { + foreach (MySqlSchemaRow row in proc.parameters.Rows) + { + if (row["ORDINAL_POSITION"].Equals(0)) + retValue = "?="; + else + { + key.AppendFormat(CultureInfo.InvariantCulture, "{0}?", delimiter); + delimiter = ","; + } + } + } + key.Append(")"); + return retValue + key.ToString(); + } + + private async Task AddNewAsync(MySqlConnection connection, string spName, bool execAsync) + { + ProcedureCacheEntry procData = await GetProcDataAsync(connection, spName, execAsync).ConfigureAwait(false); + + if (_maxSize <= 0) return procData; + + string cacheKey = GetCacheKey(spName, procData); + int hash = cacheKey.GetHashCode(); + lock (_procHash) + { + if (_procHash.Keys.Count >= _maxSize) + TrimHash(); + if (!_procHash.ContainsKey(hash)) + { + _procHash[hash] = procData; + _hashQueue.Enqueue(hash); + } + } + return procData; + } + + private void TrimHash() + { + int oldestHash = _hashQueue.Dequeue(); + _procHash.Remove(oldestHash); + } + + private static async Task GetProcDataAsync(MySqlConnection connection, string spName, bool execAsync) + { + SplitSchemaAndEntity(spName, out string schema, out string entity); + + string[] restrictions = new string[4]; + restrictions[1] = string.IsNullOrEmpty(schema) ? connection.CurrentDatabase() : Utils.UnquoteString(schema); + restrictions[2] = Utils.UnquoteString(entity); + MySqlSchemaCollection proc = connection.GetSchemaCollection("procedures", restrictions); + if (proc.Rows.Count > 1) + throw new MySqlException(Resources.ProcAndFuncSameName); + if (proc.Rows.Count == 0) + { + string msg = string.Format(Resources.InvalidProcName, entity, schema) + " " + + string.Format(Resources.ExecuteProcedureUnauthorized, connection.Settings.UserID, connection.Settings.Server); + throw new MySqlException(msg); + } + + ProcedureCacheEntry entry = new ProcedureCacheEntry(); + entry.procedure = proc; + + // we don't use GetSchema here because that would cause another + // query of procedures and we don't need that since we already + // know the procedure we care about. + ISSchemaProvider isp = new ISSchemaProvider(connection); + string[] rest = isp.CleanRestrictions(restrictions); + MySqlSchemaCollection parameters = await isp.GetProcedureParametersAsync(rest, proc, execAsync).ConfigureAwait(false); + entry.parameters = parameters; + + return entry; + } + + /// + /// Splits the schema and the entity from a syntactically correct "spName"; + /// if there's no schema, then schema will be an empty string. + /// + /// string to inspect. + /// The schema. + /// The entity. + private static void SplitSchemaAndEntity(string spName, out string schema, out string entity) + { + int dotIndex = ExtractDotIndex(spName); + + if (dotIndex != -1) + { + schema = spName.Substring(0, dotIndex); + entity = spName.Substring(dotIndex + 1); + } + else + { + schema = string.Empty; + entity = spName; + } + } + + /// + /// Obtains the dot index that separates the schema from the entity if there's one; + /// otherwise, returns -1. It expects a syntactically correct "spName". + /// + /// string to inspect. + /// Value of the dot index. + /// The dot index. + private static int ExtractDotIndex(string spName, int dotIndex = -1) + { + int backticks, _dotIndexTemp; + _dotIndexTemp = spName.IndexOf('.'); // looks for a '.' in the string passed as argument + string subString; + + if (_dotIndexTemp != -1) + { + subString = spName.Substring(_dotIndexTemp + 1); // gets a substring from the found '.' to the end of the string + backticks = subString.Count(c => c == '`'); // counts backticks in the substring + + // if the count of backticks in the substring is an odd number, + // that means that this '.' is part of the schema or entity and will continue looking; + // otherwise, returns the index. + if (backticks % 2 == 0) + dotIndex = dotIndex == -1 ? _dotIndexTemp : dotIndex + _dotIndexTemp; + else + dotIndex = ExtractDotIndex(subString, _dotIndexTemp + 1); + } + else if (_dotIndexTemp == -1 && dotIndex != -1) + dotIndex = -1; + + return dotIndex; + } + + internal void Clear() + { + _procHash.Clear(); + _hashQueue.Clear(); + } + } +} diff --git a/MySQL.Data/src/Properties/AssemblyInfo.cs b/MySQL.Data/src/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..402af246b --- /dev/null +++ b/MySQL.Data/src/Properties/AssemblyInfo.cs @@ -0,0 +1,91 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +// 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. +[assembly: AssemblyTitle("MySql.Data")] +[assembly: AssemblyDescription("MySql.Data.MySqlClient .Net Core Class Library.")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Oracle Corporation")] +[assembly: AssemblyProduct("MySQL Connector/NET")] +[assembly: AssemblyCopyright("Copyright © 2004, 2025, Oracle and/or its affiliates.")] +[assembly: AssemblyTrademark("Oracle®, Java, MySQL, and NetSuite are registered trademarks of Oracle and/or its affiliates.")] +[assembly: AssemblyCulture("")] +[assembly: SecurityRules(SecurityRuleSet.Level1)] +[assembly: CLSCompliant(false)] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("8f0f6915-49b2-42f8-a592-bef9a09f3811")] + + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// + +[assembly: InternalsVisibleTo("MySql.Data.Tests, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] +[assembly: InternalsVisibleTo("MySqlX.Data.Tests, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] +[assembly: InternalsVisibleTo("MySql.Data.Security.Tests, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] +[assembly: InternalsVisibleTo("MySql.Data.Entity, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] +[assembly: InternalsVisibleTo("MySql.Data.EntityFrameworkCore, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] +[assembly: InternalsVisibleTo("MySql.EntityFrameworkCore.Basic.Tests, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] +[assembly: InternalsVisibleTo("MySql.Data.EntityFramework, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] +[assembly: InternalsVisibleTo("MySql.Web.Tests, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] diff --git a/MySQL.Data/src/Properties/ReservedWords.txt b/MySQL.Data/src/Properties/ReservedWords.txt new file mode 100644 index 000000000..809cb7024 --- /dev/null +++ b/MySQL.Data/src/Properties/ReservedWords.txt @@ -0,0 +1,79 @@ +ACCESSIBLE ADD ALL +ALTER ANALYZE AND +AS ASC ASENSITIVE +BEFORE BEGIN BETWEEN +BIGINT BINARY BLOB +BOTH BY CALL +CASCADE CASE CHANGE +CHAR CHARACTER CHECK +COLLATE COLUMN COMMIT +CONDITION CONNECTION CONSTRAINT +CONTINUE CONVERT CREATE +CROSS CURRENT_DATE CURRENT_TIME +CURRENT_TIMESTAMP CURRENT_USER CURSOR +DATABASE DATABASES DAY_HOUR +DAY_MICROSECOND DAY_MINUTE DAY_SECOND +DEC DECIMAL DECLARE +DEFAULT DELAYED DELETE +DESC DESCRIBE DETERMINISTIC +DISTINCT DISTINCTROW DIV +DO DOUBLE DROP +DUAL EACH ELSE +ELSEIF ENCLOSED END +ESCAPED EXISTS EXIT +EXPLAIN FALSE FETCH +FLOAT FLOAT4 FLOAT8 +FOR FORCE FOREIGN +FROM FULLTEXT GOTO +GRANT GROUP HAVING +HIGH_PRIORITY HOUR_MICROSECOND HOUR_MINUTE +HOUR_SECOND IF IGNORE +IN INDEX INFILE +INNER INOUT INSENSITIVE +INSERT INT INT1 +INT2 INT3 INT4 +INT8 INTEGER INTERVAL +INTO IS ITERATE +JOIN KEY KEYS +KILL LABEL LEADING +LEAVE LEFT LIKE +LIMIT LINEAR LINES +LOAD LOCALTIME LOCALTIMESTAMP +LOCK LONG LONGBLOB +LONGTEXT LOOP LOW_PRIORITY +SOURCE_SSL_VERIFY_SERVER_CERT MATCH MEDIUMBLOB +MEDIUMINT MEDIUMTEXT MIDDLEINT +MINUTE_MICROSECOND MINUTE_SECOND MOD +MODIFIES NATURAL NOT +NO_WRITE_TO_BINLOG NULL NUMERIC +ON OPTIMIZE OPTION +OPTIONALLY OR ORDER +OUT OUTER OUTFILE +PRECISION PRIMARY PROCEDURE +PURGE RANGE READ +READS READ_ONLY READ_WRITE +REAL REFERENCES REGEXP +RELEASE RENAME REPEAT +REPLACE REQUIRE RESTRICT +RETURN REVOKE RIGHT +RLIKE ROLLBACK SCHEMA +SCHEMAS SECOND_MICROSECOND SELECT +SENSITIVE SEPARATOR SET +SHOW SHUTDOWN SMALLINT +SPATIAL SPECIFIC SQL +SQLEXCEPTION SQLSTATE SQLWARNING +SQL_BIG_RESULT SQL_CALC_FOUND_ROWS SQL_SMALL_RESULT +SSL STARTING STRAIGHT_JOIN +TABLE TERMINATED THEN +TINYBLOB TINYINT TINYTEXT +TO TRAILING TRIGGER +TRUE UNDO UNION +UNIQUE UNLOCK UNSIGNED +UPDATE UPGRADE USAGE +USE USING UTC_DATE +UTC_TIME UTC_TIMESTAMP VALUE +VALUES VARBINARY VARCHAR +VARCHARACTER VARYING WHEN +WHERE WHILE WITH +WRITE XOR YEAR_MONTH +ZEROFILL \ No newline at end of file diff --git a/MySQL.Data/src/Properties/VersionInfo.cs b/MySQL.Data/src/Properties/VersionInfo.cs new file mode 100644 index 000000000..e26c5117d --- /dev/null +++ b/MySQL.Data/src/Properties/VersionInfo.cs @@ -0,0 +1,46 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Reflection; +using System.Resources; + +// +// 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 Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("9.4.0")] +[assembly: AssemblyInformationalVersion("9.4.0.0")] +[assembly: AssemblyFileVersion("9.4.0.0")] +[assembly: NeutralResourcesLanguage("en-US")] diff --git a/Source/MySql.Data/Properties/launchSettings.json b/MySQL.Data/src/Properties/launchSettings.json similarity index 100% rename from Source/MySql.Data/Properties/launchSettings.json rename to MySQL.Data/src/Properties/launchSettings.json diff --git a/MySQL.Data/src/Replication/ReplicationConfiguration.cs b/MySQL.Data/src/Replication/ReplicationConfiguration.cs new file mode 100644 index 000000000..8cbd52523 --- /dev/null +++ b/MySQL.Data/src/Replication/ReplicationConfiguration.cs @@ -0,0 +1,146 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Text; + +namespace MySql.Data.MySqlClient +{ + /// + /// Defines a replication configurarion element in the configuration file. + /// + public sealed class ReplicationConfigurationElement : ConfigurationElement + { + /// + /// Gets a collection of objects representing the server groups. + /// + [ConfigurationProperty("ServerGroups", IsRequired = true)] + [ConfigurationCollection(typeof(ReplicationServerGroupConfigurationElement), AddItemName = "Group")] + public GenericConfigurationElementCollection ServerGroups + { + get { return (GenericConfigurationElementCollection)this["ServerGroups"]; } + } + } + + /// + /// Defines a replication server group in the configuration file. + /// + public sealed class ReplicationServerGroupConfigurationElement : ConfigurationElement + { + /// + /// Gets or sets the name of the replication server group configuration. + /// + [ConfigurationProperty("name", IsRequired = true)] + public string Name + { + get { return (string)this["name"]; } + set { this["name"] = value; } + } + + /// + /// Gets or sets the group type of the replication server group configuration. + /// + [ConfigurationProperty("groupType", IsRequired = false)] + public string GroupType + { + get { return (string)this["groupType"]; } + set { this["groupType"] = value; } + } + + /// + /// Gets or sets the number of seconds to wait for retry. + /// + [ConfigurationProperty("retryTime", IsRequired = false, DefaultValue = 60)] + public int RetryTime + { + get { return (int)this["retryTime"]; } + set { this["retryTime"] = value; } + } + + /// + /// Gets a collection of objects representing the + /// server configurations associated to this group configuration. + /// + [ConfigurationProperty("Servers")] + [ConfigurationCollection(typeof(ReplicationServerConfigurationElement), AddItemName = "Server")] + public GenericConfigurationElementCollection Servers + { + get { return (GenericConfigurationElementCollection)this["Servers"]; } + } + } + + /// + /// Defines a replication server in configuration file. + /// + public sealed class ReplicationServerConfigurationElement : ConfigurationElement + { + /// + /// Gets or sets the name of the replication server configuration. + /// + [ConfigurationProperty("name", IsRequired = true)] + public string Name + { + get { return (string)this["name"]; } + set { this["name"] = value; } + } + + /// + /// Gets or sets whether the replication server is configured as source. + /// + [ConfigurationProperty("IsMaster", IsRequired = false, DefaultValue = false)] + [Obsolete("This property is deprecated, please use IsSource instead.")] + public bool IsMaster + { + get { return (bool)this["IsMaster"]; } + set { this["IsMaster"] = value; } + } + + /// + /// Gets or sets whether the replication server is configured as source. + /// + [ConfigurationProperty("IsSource", IsRequired = false, DefaultValue = false)] + public bool IsSource + { + get { return (bool)this["IsSource"]; } + set { this["IsSource"] = value; } + } + + + /// + /// Gets or sets the connection string associated to this replication server. + /// + [ConfigurationProperty("connectionstring", IsRequired = true)] + public string ConnectionString + { + get { return (string)this["connectionstring"]; } + set { this["connectionstring"] = value; } + } + } +} diff --git a/MySQL.Data/src/Replication/ReplicationManager.cs b/MySQL.Data/src/Replication/ReplicationManager.cs new file mode 100644 index 000000000..bd6f696ed --- /dev/null +++ b/MySQL.Data/src/Replication/ReplicationManager.cs @@ -0,0 +1,207 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + + +namespace MySql.Data.MySqlClient.Replication +{ + /// + /// Manager for Replication and Load Balancing features + /// + internal static class ReplicationManager + { + private static List groups = new List(); + private static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1, 1); + + static ReplicationManager() + { + Groups = groups; + + // load up our selectors + if (MySqlConfiguration.Settings == null) return; + + foreach (var group in MySqlConfiguration.Settings.Replication.ServerGroups) + { + ReplicationServerGroup g = AddGroup(group.Name, group.GroupType, group.RetryTime); + foreach (var server in group.Servers) + g.AddServer(server.Name, server.IsSource, server.ConnectionString); + } + } + + /// + /// Returns Replication Server Group List + /// + internal static IList Groups { get; private set; } + + /// + /// Adds a Default Server Group to the list + /// + /// Group name + /// Time between reconnections for failed servers + /// Replication Server Group added + internal static ReplicationServerGroup AddGroup(string name, int retryTime) + { + return AddGroup(name, null, retryTime); + } + + /// + /// Adds a Server Group to the list + /// + /// Group name + /// ServerGroup type reference + /// Time between reconnections for failed servers + /// Server Group added + internal static ReplicationServerGroup AddGroup(string name, string groupType, int retryTime) + { + if (string.IsNullOrEmpty(groupType)) + groupType = "MySql.Data.MySqlClient.Replication.ReplicationRoundRobinServerGroup"; + Type t = Type.GetType(groupType); + ReplicationServerGroup g = (ReplicationServerGroup)Activator.CreateInstance(t, name, retryTime) as ReplicationServerGroup; + groups.Add(g); + return g; + } + + /// + /// Gets the next server from a replication group + /// + /// Group name + /// True if the server to return must be a source + /// Replication Server defined by the Load Balancing plugin + internal static ReplicationServer GetServer(string groupName, bool isSource) + { + ReplicationServerGroup group = GetGroup(groupName); + return group.GetServer(isSource); + } + + /// + /// Gets a Server Group by name + /// + /// Group name + /// Server Group if found, otherwise throws an MySqlException + internal static ReplicationServerGroup GetGroup(string groupName) + { + ReplicationServerGroup group = null; + foreach (ReplicationServerGroup g in groups) + { + if (String.Compare(g.Name, groupName, StringComparison.OrdinalIgnoreCase) != 0) continue; + group = g; + break; + } + if (group == null) + throw new MySqlException(String.Format(Resources.ReplicationGroupNotFound, groupName)); + return group; + } + + /// + /// Validates if the replication group name exists + /// + /// Group name to validate + /// true if the replication group name is found; otherwise, false + internal static bool IsReplicationGroup(string groupName) + { + foreach (ReplicationServerGroup g in groups) + if (String.Compare(g.Name, groupName, StringComparison.OrdinalIgnoreCase) == 0) return true; + return false; + } + + /// + /// Assigns a new server driver to the connection object + /// + /// Group name + /// True if the server connection to assign must be a source + /// MySqlConnection object where the new driver will be assigned + /// Boolean that indicates if the function will be executed asynchronously. + /// the cancellation token. + internal static async Task GetNewConnectionAsync(string groupName, bool source, MySqlConnection connection, bool execAsync, CancellationToken cancellationToken) + { + do + { + if (execAsync) + await semaphoreSlim.WaitAsync(cancellationToken).ConfigureAwait(false); + else + semaphoreSlim.Wait(cancellationToken); + + try + { + if (!IsReplicationGroup(groupName)) return; + + ReplicationServerGroup group = GetGroup(groupName); + ReplicationServer server = group.GetServer(source, connection.Settings); + + if (server == null) + throw new MySqlException(Resources.Replication_NoAvailableServer); + + try + { + bool isNewServer = false; + if (connection.driver == null || !connection.driver.IsOpen) + { + isNewServer = true; + } + else + { + MySqlConnectionStringBuilder msb = new MySqlConnectionStringBuilder(server.ConnectionString); + if (!msb.Equals(connection.driver.Settings)) + { + isNewServer = true; + } + } + if (isNewServer) + { + Driver driver = await Driver.CreateAsync(new MySqlConnectionStringBuilder(server.ConnectionString), execAsync, cancellationToken).ConfigureAwait(false); + connection.driver = driver; + } + return; + } + catch (MySqlException ex) + { + connection.driver = null; + server.IsAvailable = false; + MySqlTrace.LogError(ex.Number, ex.ToString()); + if (ex.Number == 1042) + { + // retry to open a failed connection and update its status + group.HandleFailover(server, ex); + } + else + throw; + } + } + finally + { + semaphoreSlim.Release(); + } + } while (true); + } + } +} diff --git a/MySQL.Data/src/Replication/ReplicationRoundRobinServerGroup.cs b/MySQL.Data/src/Replication/ReplicationRoundRobinServerGroup.cs new file mode 100644 index 000000000..6fae451fc --- /dev/null +++ b/MySQL.Data/src/Replication/ReplicationRoundRobinServerGroup.cs @@ -0,0 +1,67 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Text; + +namespace MySql.Data.MySqlClient.Replication +{ + /// + /// Class that implements Round Robing Load Balancing technique. + /// + public class ReplicationRoundRobinServerGroup : ReplicationServerGroup + { + private int nextServer; + + public ReplicationRoundRobinServerGroup(string name, int retryTime) : base(name, retryTime) + { + nextServer = -1; + } + + /// + /// Gets an available server based on Round Robin load balancing. + /// + /// Flag indicating if the server to return must be a source. + /// A object representing the next available server. + internal protected override ReplicationServer GetServer(bool isSource) + { + for (int i = 0; i < Servers.Count; i++) + { + nextServer++; + if (nextServer == Servers.Count) + nextServer = 0; + ReplicationServer s = Servers[nextServer]; + if (!s.IsAvailable) continue; + if (isSource && !s.IsSource) continue; + return s; + } + return null; + } + } +} diff --git a/MySQL.Data/src/Replication/ReplicationServer.cs b/MySQL.Data/src/Replication/ReplicationServer.cs new file mode 100644 index 000000000..c1b14506c --- /dev/null +++ b/MySQL.Data/src/Replication/ReplicationServer.cs @@ -0,0 +1,70 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Text; + +namespace MySql.Data.MySqlClient.Replication +{ + /// + /// Represents a server in a Replication environment. + /// + public class ReplicationServer + { + public ReplicationServer(string name, bool isSource, string connectionString) + { + Name = name; + IsSource = isSource; + ConnectionString = connectionString; + IsAvailable = true; + } + + /// + /// Gets the server name. + /// + public string Name { get; private set; } + /// + /// Gets a value indicating whether the server is source or replica. + /// + [Obsolete("This property is deprecated please use IsSource instead.")] + public bool IsMaster { get; private set; } + /// + /// Gets a value indicating whether the server is source or replica. + /// + public bool IsSource { get; private set; } + /// + /// Gets the connection string used to connect to the server. + /// + public string ConnectionString { get; internal set; } + /// + /// Gets a flag indicating if the server is available to be considered in load balancing. + /// + public bool IsAvailable { get; set; } + } +} diff --git a/MySQL.Data/src/Replication/ReplicationServerGroup.cs b/MySQL.Data/src/Replication/ReplicationServerGroup.cs new file mode 100644 index 000000000..237348ba6 --- /dev/null +++ b/MySQL.Data/src/Replication/ReplicationServerGroup.cs @@ -0,0 +1,185 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + + +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Text; + +namespace MySql.Data.MySqlClient.Replication +{ + /// + /// Base class used to implement load balancing features. + /// + public abstract class ReplicationServerGroup + { + /// + /// List of servers available for replication. + /// + protected List servers = new List(); + + /// The group name. + /// The number of seconds to perform a retry. + public ReplicationServerGroup(string name, int retryTime) + { + Servers = servers; + Name = name; + RetryTime = retryTime; + } + + /// + /// Gets the group name. + /// + public string Name { get; protected set; } + /// + /// Gets the retry time between connections to failed servers. + /// + public int RetryTime { get; protected set; } + /// + /// Gets the server list in the group. + /// + protected IList Servers { get; private set; } + + /// + /// Adds a server into the group. + /// + /// The server name. + /// A flag indicating if the server to add is source or replica. + /// The connection string used by this server. + /// A object representing the recently added object. + internal protected ReplicationServer AddServer(string name, bool isSource, string connectionString) + { + ReplicationServer server = new ReplicationServer(name, isSource, connectionString); + servers.Add(server); + return server; + } + + /// + /// Removes a server from the group. + /// + /// The server name. + internal protected void RemoveServer(string name) + { + ReplicationServer serverToRemove = GetServer(name); + if (serverToRemove == null) + throw new MySqlException(String.Format(Resources.ReplicationServerNotFound, name)); + servers.Remove(serverToRemove); + } + + /// + /// Gets a server by name. + /// + /// The server name. + /// The replication server. + internal protected ReplicationServer GetServer(string name) + { + foreach (var server in servers) + if (String.Compare(name, server.Name, StringComparison.OrdinalIgnoreCase) == 0) return server; + return null; + } + + /// + /// Must be implemented. Defines the next server for a custom load balancing implementation. + /// + /// Defines if the server to return is a source or any. + /// The next server based on the load balancing implementation. + /// Null if no available server is found. + /// + internal protected abstract ReplicationServer GetServer(bool isSource); + + /// + /// Defines the next server for a custom load balancing implementation. + /// + /// Defines if the server to return is a source or any. + /// Currently not being used. + /// The next server based on the load balancing implementation. + /// Null if no available server is found. + /// + internal protected virtual ReplicationServer GetServer(bool isSource, MySqlConnectionStringBuilder settings) + { + return GetServer(isSource); + } + + /// + /// Handles a failed connection to a server. + /// + /// The failed server. + /// This method can be overrided to implement a custom failover handling. + internal protected virtual void HandleFailover(ReplicationServer server) + { + BackgroundWorker worker = new BackgroundWorker(); + worker.DoWork += delegate(object sender, DoWorkEventArgs e) + { + bool isRunning = false; + ReplicationServer server1 = e.Argument as ReplicationServer; + System.Timers.Timer timer = new System.Timers.Timer(RetryTime * 1000.0); + + System.Timers.ElapsedEventHandler elapsedEvent = delegate(object sender1, System.Timers.ElapsedEventArgs e1) + { + if (isRunning) return; + try + { + isRunning = true; + using (MySqlConnection connectionFailed = new MySqlConnection(server.ConnectionString)) + { + connectionFailed.Open(); + server1.IsAvailable = true; + timer.Stop(); + } + } + catch + { + MySqlTrace.LogWarning(0, + string.Format(Resources.Replication_ConnectionAttemptFailed, server1.Name)); + } + finally + { + isRunning = false; + } + }; + timer.Elapsed += elapsedEvent; + timer.Start(); + elapsedEvent(sender, null); + }; + + worker.RunWorkerAsync(server); + } + + /// + /// Handles a failed connection to a server. + /// + /// The failed server. + /// The exception that caused the failover. + internal protected virtual void HandleFailover(ReplicationServer server, Exception exception) + { + HandleFailover(server); + } + } +} diff --git a/MySQL.Data/src/Resources.Designer.cs b/MySQL.Data/src/Resources.Designer.cs new file mode 100644 index 000000000..8a38ca951 --- /dev/null +++ b/MySQL.Data/src/Resources.Designer.cs @@ -0,0 +1,1800 @@ +//------------------------------------------------------------------------------ +// +// 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 MySql.Data { + 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", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 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("MySql.Data.Resources", typeof(Resources).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 Improper MySqlCommandBuilder state: adapter is null. + /// + internal static string AdapterIsNull { + get { + return ResourceManager.GetString("AdapterIsNull", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Improper MySqlCommandBuilder state: adapter's SelectCommand is null. + /// + internal static string AdapterSelectIsNull { + get { + return ResourceManager.GetString("AdapterSelectIsNull", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid attempt to access a field before calling Read(). + /// + internal static string AttemptToAccessBeforeRead { + get { + return ResourceManager.GetString("AttemptToAccessBeforeRead", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Authentication to host '{0}' for user '{1}' using method '{2}' failed with message: {3}. + /// + internal static string AuthenticationFailed { + get { + return ResourceManager.GetString("AuthenticationFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Authentication method '{0}' not supported by any of the available plugins. + /// + internal static string AuthenticationMethodNotSupported { + get { + return ResourceManager.GetString("AuthenticationMethodNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Authentication plugin '{0}' is currently not supported. + /// + internal static string AuthenticationPluginNotSupported { + get { + return ResourceManager.GetString("AuthenticationPluginNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Version string not in acceptable format. + /// + internal static string BadVersionFormat { + get { + return ResourceManager.GetString("BadVersionFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The buffer cannot be null. + /// + internal static string BufferCannotBeNull { + get { + return ResourceManager.GetString("BufferCannotBeNull", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The buffer is not large enough. + /// + internal static string BufferNotLargeEnough { + get { + return ResourceManager.GetString("BufferNotLargeEnough", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Canceling an executing query requires MySQL 5.0 or higher. + /// + internal static string CancelNeeds50 { + get { + return ResourceManager.GetString("CancelNeeds50", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Canceling an active query is only supported on MySQL 5.0.0 and above. + /// + internal static string CancelNotSupported { + get { + return ResourceManager.GetString("CancelNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Parameters can only be derived for commands using the StoredProcedure command type. + /// + internal static string CanNotDeriveParametersForTextCommands { + get { + return ResourceManager.GetString("CanNotDeriveParametersForTextCommands", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MySqlCommandBuilder does not support multi-table statements. + /// + internal static string CBMultiTableNotSupported { + get { + return ResourceManager.GetString("CBMultiTableNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MySqlCommandBuilder cannot operate on tables with no unique or key columns. + /// + internal static string CBNoKeyColumn { + get { + return ResourceManager.GetString("CBNoKeyColumn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Chaos isolation level is not supported . + /// + internal static string ChaosNotSupported { + get { + return ResourceManager.GetString("ChaosNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Clear-password authentication is not supported over insecure channels. + /// + internal static string ClearPasswordNotSupported { + get { + return ResourceManager.GetString("ClearPasswordNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The CommandText property has not been properly initialized. + /// + internal static string CommandTextNotInitialized { + get { + return ResourceManager.GetString("CommandTextNotInitialized", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Compression is not supported. + /// + internal static string CompressionNotSupported { + get { + return ResourceManager.GetString("CompressionNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The connection is already open. + /// + internal static string ConnectionAlreadyOpen { + get { + return ResourceManager.GetString("ConnectionAlreadyOpen", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Connection unexpectedly terminated. + /// + internal static string ConnectionBroken { + get { + return ResourceManager.GetString("ConnectionBroken", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Connection must be valid and open. + /// + internal static string ConnectionMustBeOpen { + get { + return ResourceManager.GetString("ConnectionMustBeOpen", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The connection is not open. + /// + internal static string ConnectionNotOpen { + get { + return ResourceManager.GetString("ConnectionNotOpen", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The connection property has not been set or is null. + /// + internal static string ConnectionNotSet { + get { + return ResourceManager.GetString("ConnectionNotSet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Could not find specified column in results: {0}. + /// + internal static string CouldNotFindColumnName { + get { + return ResourceManager.GetString("CouldNotFindColumnName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Count cannot be negative. + /// + internal static string CountCannotBeNegative { + get { + return ResourceManager.GetString("CountCannotBeNegative", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SetLength is not a valid operation on CompressedStream. + /// + internal static string CSNoSetLength { + get { + return ResourceManager.GetString("CSNoSetLength", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The given value was not in a supported format. + /// + internal static string DataNotInSupportedFormat { + get { + return ResourceManager.GetString("DataNotInSupportedFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There is already an open DataReader associated with this Connection which must be closed first. + /// + internal static string DataReaderOpen { + get { + return ResourceManager.GetString("DataReaderOpen", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The default connection encoding was not found. Please report this as a bug along with your connection string and system details. + /// + internal static string DefaultEncodingNotFound { + get { + return ResourceManager.GetString("DefaultEncodingNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MySQL Connector/NET does not currently support distributed transactions. + /// + internal static string DistributedTxnNotSupported { + get { + return ResourceManager.GetString("DistributedTxnNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Specifying multiple host names with DNS SRV lookup is not permitted. + /// + internal static string DnsSrvInvalidConnOptionMultihost { + get { + return ResourceManager.GetString("DnsSrvInvalidConnOptionMultihost", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Specifying a port number with DNS SRV lookup is not permitted. + /// + internal static string DnsSrvInvalidConnOptionPort { + get { + return ResourceManager.GetString("DnsSrvInvalidConnOptionPort", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Using Unix domain sockets with DNS SRV lookup is not permitted. + /// + internal static string DnsSrvInvalidConnOptionUnixSocket { + get { + return ResourceManager.GetString("DnsSrvInvalidConnOptionUnixSocket", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to locate any hosts for {0}. + /// + internal static string DnsSrvNoHostsAvailable { + get { + return ResourceManager.GetString("DnsSrvNoHostsAvailable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Encoding error during validation. + /// + internal static string EncodingError { + get { + return ResourceManager.GetString("EncodingError", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error creating socket connection. + /// + internal static string ErrorCreatingSocket { + get { + return ResourceManager.GetString("ErrorCreatingSocket", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Verify that user '{0}'@'{1}' has enough privileges to execute. + /// + internal static string ExecuteProcedureUnauthorized { + get { + return ResourceManager.GetString("ExecuteProcedureUnauthorized", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fatal error encountered during command execution. + /// + internal static string FatalErrorDuringExecute { + get { + return ResourceManager.GetString("FatalErrorDuringExecute", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fatal error encountered during data read. + /// + internal static string FatalErrorDuringRead { + get { + return ResourceManager.GetString("FatalErrorDuringRead", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fatal error encountered attempting to read the resultset. + /// + internal static string FatalErrorReadingResult { + get { + return ResourceManager.GetString("FatalErrorReadingResult", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Challenge received is corrupt. + /// + internal static string FidoChallengeCorrupt { + get { + return ResourceManager.GetString("FidoChallengeCorrupt", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to FIDO registration is missing. + /// + internal static string FidoRegistrationMissing { + get { + return ResourceManager.GetString("FidoRegistrationMissing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to File based certificates are only supported when connecting to MySQL Server 5.1 or greater. + /// + internal static string FileBasedCertificateNotSupported { + get { + return ResourceManager.GetString("FileBasedCertificateNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The specified file cannot be converted to a certificate. + /// + internal static string FileIsNotACertificate { + get { + return ResourceManager.GetString("FileIsNotACertificate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The specified file cannot be converted to a key. + /// + internal static string FileIsNotAKey { + get { + return ResourceManager.GetString("FileIsNotAKey", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed to read file at the specified location. + /// + internal static string FileNotFound { + get { + return ResourceManager.GetString("FileNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No file path has been provided for the connection option {0}. + /// + internal static string FilePathNotSet { + get { + return ResourceManager.GetString("FilePathNotSet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to From index and length use more bytes than from contains. + /// + internal static string FromAndLengthTooBig { + get { + return ResourceManager.GetString("FromAndLengthTooBig", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to From index must be a valid index inside the from buffer. + /// + internal static string FromIndexMustBeValid { + get { + return ResourceManager.GetString("FromIndexMustBeValid", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Call to GetHostEntry failed after {0} while querying for hostname '{1}': SocketErrorCode={2}, ErrorCode={3}, NativeErrorCode={4}. + /// + internal static string GetHostEntryFailed { + get { + return ResourceManager.GetString("GetHostEntryFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Retrieving procedure metadata for {0} from server. + /// + internal static string HardProcQuery { + get { + return ResourceManager.GetString("HardProcQuery", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value has an unsupported format. + /// + internal static string ImproperValueFormat { + get { + return ResourceManager.GetString("ImproperValueFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to An incorrect response was received from the server. + /// + internal static string IncorrectTransmission { + get { + return ResourceManager.GetString("IncorrectTransmission", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Index and length use more bytes than to has room for. + /// + internal static string IndexAndLengthTooBig { + get { + return ResourceManager.GetString("IndexAndLengthTooBig", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Index must be a valid position in the buffer. + /// + internal static string IndexMustBeValid { + get { + return ResourceManager.GetString("IndexMustBeValid", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The provided key is invalid. + /// + internal static string InvalidCertificateKey { + get { + return ResourceManager.GetString("InvalidCertificateKey", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Certificate with Thumbprint '{0}' not found. + /// + internal static string InvalidCertificateThumbprint { + get { + return ResourceManager.GetString("InvalidCertificateThumbprint", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to You have specified an invalid column ordinal. + /// + internal static string InvalidColumnOrdinal { + get { + return ResourceManager.GetString("InvalidColumnOrdinal", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The requested value '{0}' is invalid for the given keyword '{1}'. + /// + internal static string InvalidConnectionStringValue { + get { + return ResourceManager.GetString("InvalidConnectionStringValue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The host name or IP address is invalid. + /// + internal static string InvalidHostNameOrAddress { + get { + return ResourceManager.GetString("InvalidHostNameOrAddress", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Microsecond must be a value between 0 and 999999. + /// + internal static string InvalidMicrosecondValue { + get { + return ResourceManager.GetString("InvalidMicrosecondValue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Millisecond must be a value between 0 and 999. For more precision use Microsecond. + /// + internal static string InvalidMillisecondValue { + get { + return ResourceManager.GetString("InvalidMillisecondValue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Either provide a valid path for 'allowloadlocalinfileinpath' or enable 'allowloadlocalinfile'. + /// + internal static string InvalidPathForLoadLocalInfile { + get { + return ResourceManager.GetString("InvalidPathForLoadLocalInfile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Procedure or function '{0}' cannot be found in database '{1}'. + /// + internal static string InvalidProcName { + get { + return ResourceManager.GetString("InvalidProcName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The certificate is invalid. + /// + internal static string InvalidSslCertificate { + get { + return ResourceManager.GetString("InvalidSslCertificate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to validate the signature. + /// + internal static string InvalidSslCertificateSignature { + get { + return ResourceManager.GetString("InvalidSslCertificateSignature", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to verify the signature. + /// + internal static string InvalidSslCertificateSignatureGeneral { + get { + return ResourceManager.GetString("InvalidSslCertificateSignatureGeneral", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value '{0}' is not of the correct type. + /// + internal static string InvalidSslMode { + get { + return ResourceManager.GetString("InvalidSslMode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}' is an illegal value for a boolean option. + /// + internal static string InvalidValueForBoolean { + get { + return ResourceManager.GetString("InvalidValueForBoolean", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Keyword does not allow null values. + /// + internal static string KeywordNoNull { + get { + return ResourceManager.GetString("KeywordNoNull", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Option not supported. + /// + internal static string KeywordNotSupported { + get { + return ResourceManager.GetString("KeywordNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Server asked for stream in response to LOAD DATA LOCAL INFILE, but the functionality is disabled by the client setting 'allowlocalinfile' to 'false'. + /// + internal static string LocalInfileDisabled { + get { + return ResourceManager.GetString("LocalInfileDisabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mixing named and unnamed parameters is not allowed. + /// + internal static string MixedParameterNamingNotAllowed { + get { + return ResourceManager.GetString("MixedParameterNamingNotAllowed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to INTERNAL ERROR: More than one output parameter row detected. + /// + internal static string MoreThanOneOPRow { + get { + return ResourceManager.GetString("MoreThanOneOPRow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Multiple simultaneous connections or connections with different connection strings inside the same transaction are not currently supported. + /// + internal static string MultipleConnectionsInTransactionNotSupported { + get { + return ResourceManager.GetString("MultipleConnectionsInTransactionNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to NamedPipeStream does not support seeking. + /// + internal static string NamedPipeNoSeek { + get { + return ResourceManager.GetString("NamedPipeNoSeek", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to NamedPipeStream doesn't support SetLength. + /// + internal static string NamedPipeNoSetLength { + get { + return ResourceManager.GetString("NamedPipeNoSetLength", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The new value must be a MySqlParameter object. + /// + internal static string NewValueShouldBeMySqlParameter { + get { + return ResourceManager.GetString("NewValueShouldBeMySqlParameter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid attempt to call NextResult when the reader is closed. + /// + internal static string NextResultIsClosed { + get { + return ResourceManager.GetString("NextResultIsClosed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to When calling stored procedures and 'Use Procedure Bodies' is false, all parameters must have their type explicitly set. + /// + internal static string NoBodiesAndTypeNotSet { + get { + return ResourceManager.GetString("NoBodiesAndTypeNotSet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Nested transactions are not supported. + /// + internal static string NoNestedTransactions { + get { + return ResourceManager.GetString("NoNestedTransactions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The host {0} does not support SSL connections. + /// + internal static string NoServerSSLSupport { + get { + return ResourceManager.GetString("NoServerSSLSupport", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unix sockets are not supported on Windows. + /// + internal static string NoUnixSocketsOnWindows { + get { + return ResourceManager.GetString("NoUnixSocketsOnWindows", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot retrieve Windows identity for current user. Connections that use IntegratedSecurity cannot be pooled. Use either 'ConnectionReset=true' or 'Pooling=false' in the connection string to fix. + /// + internal static string NoWindowsIdentity { + get { + return ResourceManager.GetString("NoWindowsIdentity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The object is not open or has been disposed. + /// + internal static string ObjectDisposed { + get { + return ResourceManager.GetString("ObjectDisposed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OCI configuration file could not be read. + /// + internal static string OciConfigFileNotFound { + get { + return ResourceManager.GetString("OciConfigFileNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OCI configuration profile not found. + /// + internal static string OciConfigProfileNotFound { + get { + return ResourceManager.GetString("OciConfigProfileNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OCI configuration file does not contain a 'fingerprint' or 'key_file' entry. + /// + internal static string OciEntryNotFound { + get { + return ResourceManager.GetString("OciEntryNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OCI configuration entry 'key_file' does not reference a valid key file. + /// + internal static string OciInvalidKeyFile { + get { + return ResourceManager.GetString("OciInvalidKeyFile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Private key could not be found at location given by OCI configuration entry 'key_file'. + /// + internal static string OciKeyFileDoesNotExists { + get { + return ResourceManager.GetString("OciKeyFileDoesNotExists", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The OCI SDK cannot be found or is not installed. + /// + internal static string OciSDKNotFound { + get { + return ResourceManager.GetString("OciSDKNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Secutiry token file could not be found at location given by OCI configuration entry 'security_token_file'. + /// + internal static string OciSecurityTokenDoesNotExists { + get { + return ResourceManager.GetString("OciSecurityTokenDoesNotExists", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The size of the OCI security token file exceeds the maximum value of 10KB allowed. + /// + internal static string OciSecurityTokenFileExceeds10KB { + get { + return ResourceManager.GetString("OciSecurityTokenFileExceeds10KB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The offset cannot be negative. + /// + internal static string OffsetCannotBeNegative { + get { + return ResourceManager.GetString("OffsetCannotBeNegative", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Offset must be a valid position in buffer. + /// + internal static string OffsetMustBeValid { + get { + return ResourceManager.GetString("OffsetMustBeValid", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Authentication with old password no longer supported, use 4.1 style passwords. + /// + internal static string OldPasswordsNotSupported { + get { + return ResourceManager.GetString("OldPasswordsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The OpenID Connect Identity Token is empty. + /// + internal static string OpenIdIdentityTokenIsEmpty { + get { + return ResourceManager.GetString("OpenIdIdentityTokenIsEmpty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The OpenID Connect Identity Token is invalid. + /// + internal static string OpenIdIdentityTokenTooBig { + get { + return ResourceManager.GetString("OpenIdIdentityTokenTooBig", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The option '{0}' is not currently supported.. + /// + internal static string OptionNotCurrentlySupported { + get { + return ResourceManager.GetString("OptionNotCurrentlySupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Parameter '{0}' has already been defined. + /// + internal static string ParameterAlreadyDefined { + get { + return ResourceManager.GetString("ParameterAlreadyDefined", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Parameter cannot have a negative value. + /// + internal static string ParameterCannotBeNegative { + get { + return ResourceManager.GetString("ParameterCannotBeNegative", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Parameter cannot be null. + /// + internal static string ParameterCannotBeNull { + get { + return ResourceManager.GetString("ParameterCannotBeNull", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Parameter '{0}' can't be null or empty. + /// + internal static string ParameterCannotBeNullOrEmpty { + get { + return ResourceManager.GetString("ParameterCannotBeNullOrEmpty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Parameter index was not found in Parameter Collection. + /// + internal static string ParameterIndexNotFound { + get { + return ResourceManager.GetString("ParameterIndexNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Parameter is invalid. + /// + internal static string ParameterIsInvalid { + get { + return ResourceManager.GetString("ParameterIsInvalid", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Parameter '{0}' must be defined. + /// + internal static string ParameterMustBeDefined { + get { + return ResourceManager.GetString("ParameterMustBeDefined", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Parameter '{0}' was not found during prepare. + /// + internal static string ParameterNotFoundDuringPrepare { + get { + return ResourceManager.GetString("ParameterNotFoundDuringPrepare", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Parameter can't be null or empty. + /// + internal static string ParameterNullOrEmpty { + get { + return ResourceManager.GetString("ParameterNullOrEmpty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Password must be valid and contain length characters. + /// + internal static string PasswordMustHaveLegalChars { + get { + return ResourceManager.GetString("PasswordMustHaveLegalChars", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This category includes a series of counters for MySQL. + /// + internal static string PerfMonCategoryHelp { + get { + return ResourceManager.GetString("PerfMonCategoryHelp", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to .NET Data Provider for MySQL. + /// + internal static string PerfMonCategoryName { + get { + return ResourceManager.GetString("PerfMonCategoryName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The number of times a procedures metadata had to be queried from the server. + /// + internal static string PerfMonHardProcHelp { + get { + return ResourceManager.GetString("PerfMonHardProcHelp", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hard Procedure Queries. + /// + internal static string PerfMonHardProcName { + get { + return ResourceManager.GetString("PerfMonHardProcName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The number of times a procedures metadata was retrieved from the client-side cache. + /// + internal static string PerfMonSoftProcHelp { + get { + return ResourceManager.GetString("PerfMonSoftProcHelp", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Soft Procedure Queries. + /// + internal static string PerfMonSoftProcName { + get { + return ResourceManager.GetString("PerfMonSoftProcName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to same name are not supported. + /// + internal static string ProcAndFuncSameName { + get { + return ResourceManager.GetString("ProcAndFuncSameName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MySQL Server {0} dos not support query attributes. + /// + internal static string QueryAttributesNotSupported { + get { + return ResourceManager.GetString("QueryAttributesNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MySQL Connector/NET does not support query attributes with prepared statements for this version of MySQL Server. + /// + internal static string QueryAttributesNotSupportedByCnet { + get { + return ResourceManager.GetString("QueryAttributesNotSupportedByCnet", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Packets larger than max_allowed_packet are not allowed. + /// + internal static string QueryTooLarge { + get { + return ResourceManager.GetString("QueryTooLarge", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reading from the stream has failed. + /// + internal static string ReadFromStreamFailed { + get { + return ResourceManager.GetString("ReadFromStreamFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid attempt to read a prior column using SequentialAccess. + /// + internal static string ReadingPriorColumnUsingSeqAccess { + get { + return ResourceManager.GetString("ReadingPriorColumnUsingSeqAccess", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Replicated connections allow only readonly statements. + /// + internal static string ReplicatedConnectionsAllowOnlyReadonlyStatements { + get { + return ResourceManager.GetString("ReplicatedConnectionsAllowOnlyReadonlyStatements", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Attempt to connect to '{0}' server failed. + /// + internal static string Replication_ConnectionAttemptFailed { + get { + return ResourceManager.GetString("Replication_ConnectionAttemptFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No available server found. + /// + internal static string Replication_NoAvailableServer { + get { + return ResourceManager.GetString("Replication_NoAvailableServer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Replication group '{0}' not found. + /// + internal static string ReplicationGroupNotFound { + get { + return ResourceManager.GetString("ReplicationGroupNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Replicated server not found: '{0}'. + /// + internal static string ReplicationServerNotFound { + get { + return ResourceManager.GetString("ReplicationServerNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Routine '{0}' cannot be found. Either check the spelling or make sure you have sufficient rights to execute the routine. + /// + internal static string RoutineNotFound { + get { + return ResourceManager.GetString("RoutineNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Attempt to call stored function '{0}' without specifying a return parameter. + /// + internal static string RoutineRequiresReturnParameter { + get { + return ResourceManager.GetString("RoutineRequiresReturnParameter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Retrieval of the RSA public key is not enabled for insecure connections. + /// + internal static string RSAPublicKeyRetrievalNotEnabled { + get { + return ResourceManager.GetString("RSAPublicKeyRetrievalNotEnabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Connector/NET no longer supports server versions prior to 5.0. + /// + internal static string ServerTooOld { + get { + return ResourceManager.GetString("ServerTooOld", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Snapshot isolation level is not supported. + /// + internal static string SnapshotNotSupported { + get { + return ResourceManager.GetString("SnapshotNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Socket streams do not support seeking. + /// + internal static string SocketNoSeek { + get { + return ResourceManager.GetString("SocketNoSeek", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Retrieving procedure metadata for {0} from procedure cache. + /// + internal static string SoftProcQuery { + get { + return ResourceManager.GetString("SoftProcQuery", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Stored procedures are not supported on this version of MySQL. + /// + internal static string SPNotSupported { + get { + return ResourceManager.GetString("SPNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The certificate authority (CA) does not match. + /// + internal static string SslCertificateCAMismatch { + get { + return ResourceManager.GetString("SslCertificateCAMismatch", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The host name does not match the name on the certificate. + /// + internal static string SslCertificateHostNameMismatch { + get { + return ResourceManager.GetString("SslCertificateHostNameMismatch", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The certificate is not a certificate authority (CA). + /// + internal static string SslCertificateIsNotCA { + get { + return ResourceManager.GetString("SslCertificateIsNotCA", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SSL Connection error. + /// + internal static string SslConnectionError { + get { + return ResourceManager.GetString("SslConnectionError", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Connection protocol '{0}' does not support SSL connections. + /// + internal static string SslNotAllowedForConnectionProtocol { + get { + return ResourceManager.GetString("SslNotAllowedForConnectionProtocol", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The stream has already been closed. + /// + internal static string StreamAlreadyClosed { + get { + return ResourceManager.GetString("StreamAlreadyClosed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The stream does not support reading. + /// + internal static string StreamNoRead { + get { + return ResourceManager.GetString("StreamNoRead", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The stream does not support writing. + /// + internal static string StreamNoWrite { + get { + return ResourceManager.GetString("StreamNoWrite", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to String can't be empty. + /// + internal static string StringEmpty { + get { + return ResourceManager.GetString("StringEmpty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. + /// + internal static string Timeout { + get { + return ResourceManager.GetString("Timeout", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to error connecting: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached. + /// + internal static string TimeoutGettingConnection { + get { + return ResourceManager.GetString("TimeoutGettingConnection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All server connection attempts were aborted. Timeout of {0} seconds was exceeded for each selected server. + /// + internal static string TimeOutMultipleHost { + get { + return ResourceManager.GetString("TimeOutMultipleHost", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Specified list of TLS versions only contains non valid TLS protocols. Accepted values are TLSv1.2 and TLSv1.3. + /// + internal static string TlsNonValidProtocols { + get { + return ResourceManager.GetString("TlsNonValidProtocols", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to TLS protocols TLSv1 and TLSv1.1 are no longer supported. Accepted values are TLSv1.2 and TLSv1.3. + /// + internal static string TlsUnsupportedVersions { + get { + return ResourceManager.GetString("TlsUnsupportedVersions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Specified list of TLS versions is empty. Accepted values are TLSv1.2 and TLSv1.3. + /// + internal static string TlsVersionsEmpty { + get { + return ResourceManager.GetString("TlsVersionsEmpty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: Connection Closed. + /// + internal static string TraceCloseConnection { + get { + return ResourceManager.GetString("TraceCloseConnection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to trace. There are more than Int32.MaxValue connections in use. + /// + internal static string TraceErrorMoreThanMaxValueConnections { + get { + return ResourceManager.GetString("TraceErrorMoreThanMaxValueConnections", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: Error encountered during row fetch. Number = {1}, Message={2}. + /// + internal static string TraceFetchError { + get { + return ResourceManager.GetString("TraceFetchError", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: Connection Opened: connection string = '{1}'. + /// + internal static string TraceOpenConnection { + get { + return ResourceManager.GetString("TraceOpenConnection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: Error encountered attempting to open result: Number={1}, Message={2}. + /// + internal static string TraceOpenResultError { + get { + return ResourceManager.GetString("TraceOpenResultError", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: Query Closed. + /// + internal static string TraceQueryDone { + get { + return ResourceManager.GetString("TraceQueryDone", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: Query Normalized: {2}. + /// + internal static string TraceQueryNormalized { + get { + return ResourceManager.GetString("TraceQueryNormalized", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: Query Opened: {2}. + /// + internal static string TraceQueryOpened { + get { + return ResourceManager.GetString("TraceQueryOpened", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: Resultset Opened: field(s) = {1}, affected rows = {2}, inserted id = {3}. + /// + internal static string TraceResult { + get { + return ResourceManager.GetString("TraceResult", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: Resultset Closed. Total rows={1}, skipped rows={2}, size (bytes)={3}. + /// + internal static string TraceResultClosed { + get { + return ResourceManager.GetString("TraceResultClosed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: Set Database: {1}. + /// + internal static string TraceSetDatabase { + get { + return ResourceManager.GetString("TraceSetDatabase", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: Statement closed: statement id = {1}. + /// + internal static string TraceStatementClosed { + get { + return ResourceManager.GetString("TraceStatementClosed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: Statement executed: statement id = {1}. + /// + internal static string TraceStatementExecuted { + get { + return ResourceManager.GetString("TraceStatementExecuted", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: Statement prepared: sql='{1}', statement id={2}. + /// + internal static string TraceStatementPrepared { + get { + return ResourceManager.GetString("TraceStatementPrepared", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: Usage Advisor Warning: Query is using a bad index. + /// + internal static string TraceUAWarningBadIndex { + get { + return ResourceManager.GetString("TraceUAWarningBadIndex", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: Usage Advisor Warning: The field '{2}' was converted to the following types: {3}. + /// + internal static string TraceUAWarningFieldConversion { + get { + return ResourceManager.GetString("TraceUAWarningFieldConversion", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: Usage Advisor Warning: Query does not use an index. + /// + internal static string TraceUAWarningNoIndex { + get { + return ResourceManager.GetString("TraceUAWarningNoIndex", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: Usage Advisor Warning: The following columns were not accessed: {2}. + /// + internal static string TraceUAWarningSkippedColumns { + get { + return ResourceManager.GetString("TraceUAWarningSkippedColumns", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: Usage Advisor Warning: Skipped {2} rows. Consider a more focused query. + /// + internal static string TraceUAWarningSkippedRows { + get { + return ResourceManager.GetString("TraceUAWarningSkippedRows", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0}: MySql Warning: Level={1}, Code={2}, Message={3}. + /// + internal static string TraceWarning { + get { + return ResourceManager.GetString("TraceWarning", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' is not derived from BaseCommandInterceptor. + /// + internal static string TypeIsNotCommandInterceptor { + get { + return ResourceManager.GetString("TypeIsNotCommandInterceptor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Type '{0}' is not derived from BaseExceptionInterceptor. + /// + internal static string TypeIsNotExceptionInterceptor { + get { + return ResourceManager.GetString("TypeIsNotExceptionInterceptor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to connect to any of the specified MySQL hosts. + /// + internal static string UnableToConnectToHost { + get { + return ResourceManager.GetString("UnableToConnectToHost", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to create plugin for authentication method '{0}'. Please see inner exception for details. + /// + internal static string UnableToCreateAuthPlugin { + get { + return ResourceManager.GetString("UnableToCreateAuthPlugin", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to derive stored routine parameters. The 'Parameters' information schema table is not available and access to the stored procedure body has been disabled. + /// + internal static string UnableToDeriveParameters { + get { + return ResourceManager.GetString("UnableToDeriveParameters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to enable query analysis. Be sure the MySql.Data.EMTrace assembly is properly located and registered. + /// + internal static string UnableToEnableQueryAnalysis { + get { + return ResourceManager.GetString("UnableToEnableQueryAnalysis", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to An error occured attempting to enumerate the user-defined functions. Do you have SELECT privileges on the mysql.func table?. + /// + internal static string UnableToEnumerateUDF { + get { + return ResourceManager.GetString("UnableToEnumerateUDF", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to execute stored procedure '{0}'. + /// + internal static string UnableToExecuteSP { + get { + return ResourceManager.GetString("UnableToExecuteSP", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There was an error parsing the foreign key definition. + /// + internal static string UnableToParseFK { + get { + return ResourceManager.GetString("UnableToParseFK", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Error encountered reading the RSA public key. + /// + internal static string UnableToReadRSAKey { + get { + return ResourceManager.GetString("UnableToReadRSAKey", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to retrieve stored procedure metadata for routine '{0}'. Either grant SELECT privilege to mysql.proc for this user or use "check parameters=false" with your connection string. + /// + internal static string UnableToRetrieveParameters { + get { + return ResourceManager.GetString("UnableToRetrieveParameters", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to start a second async operation while one is running. + /// + internal static string UnableToStartSecondAsyncOp { + get { + return ResourceManager.GetString("UnableToStartSecondAsyncOp", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unix sockets are not supported on Windows. + /// + internal static string UnixSocketsNotSupported { + get { + return ResourceManager.GetString("UnixSocketsNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown authentication method '{0}' was requested. + /// + internal static string UnknownAuthenticationMethod { + get { + return ResourceManager.GetString("UnknownAuthenticationMethod", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown connection protocol. + /// + internal static string UnknownConnectionProtocol { + get { + return ResourceManager.GetString("UnknownConnectionProtocol", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MySQL user '{0}' does not equal the logged-in Windows user '{1}'. + /// + internal static string UnmatchedWinUserAndMySqlUser { + get { + return ResourceManager.GetString("UnmatchedWinUserAndMySqlUser", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Trying to upload a file from outside the path set on 'allowloadlocalinfileinpath' is invalid. + /// + internal static string UnsafePathForLoadLocalInfile { + get { + return ResourceManager.GetString("UnsafePathForLoadLocalInfile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value '{0}' is not of the correct type. + /// + internal static string ValueNotCorrectType { + get { + return ResourceManager.GetString("ValueNotCorrectType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The requested column value could not be treated as or conveted to a Guid. + /// + internal static string ValueNotSupportedForGuid { + get { + return ResourceManager.GetString("ValueNotSupportedForGuid", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to An event handler for WebAuthnActionRequested was not specified. + /// + internal static string WebAuthnMissingHandler { + get { + return ResourceManager.GetString("WebAuthnMissingHandler", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The timeout of 15 seconds for user interaction with FIDO device has been exceeded. + /// + internal static string WebAuthnTimeout { + get { + return ResourceManager.GetString("WebAuthnTimeout", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Windows authentication connections are not supported on {0}. + /// + internal static string WinAuthNotSupportOnPlatform { + get { + return ResourceManager.GetString("WinAuthNotSupportOnPlatform", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Writing to the stream failed. + /// + internal static string WriteToStreamFailed { + get { + return ResourceManager.GetString("WriteToStreamFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Parameter '{0}' is not found but a parameter with the name '{1}' is found. Parameter names must include the leading parameter marker. + /// + internal static string WrongParameterName { + get { + return ResourceManager.GetString("WrongParameterName", resourceCulture); + } + } + } +} diff --git a/MySQL.Data/src/Resources.resx b/MySQL.Data/src/Resources.resx new file mode 100644 index 000000000..9b6998c6e --- /dev/null +++ b/MySQL.Data/src/Resources.resx @@ -0,0 +1,699 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Version string not in acceptable format + + + NamedPipeStream does not support seeking + + + The stream has already been closed + + + The buffer cannot be null + + + The buffer is not large enough + + + The offset cannot be negative + + + Count cannot be negative + + + The stream does not support reading + + + NamedPipeStream doesn't support SetLength + + + The stream does not support writing + + + Error creating socket connection + + + Socket streams do not support seeking + + + Unix sockets are not supported on Windows + + + Offset must be a valid position in buffer + + + SetLength is not a valid operation on CompressedStream + + + From index must be a valid index inside the from buffer + + + From index and length use more bytes than from contains + + + Index must be a valid position in the buffer + + + Index and length use more bytes than to has room for + + + Password must be valid and contain length characters + + + Parameter cannot have a negative value + + + Connection must be valid and open + + + There is already an open DataReader associated with this Connection which must be closed first + + + Stored procedures are not supported on this version of MySQL + + + The connection property has not been set or is null + + + The connection is not open + + + Improper MySqlCommandBuilder state: adapter is null + + + Improper MySqlCommandBuilder state: adapter's SelectCommand is null + + + MySqlCommandBuilder does not support multi-table statements + + + MySqlCommandBuilder cannot operate on tables with no unique or key columns + + + Parameter cannot be null + + + Chaos isolation level is not supported + + + Parameter is invalid + + + The connection is already open + + + Option not supported + + + Writing to the stream failed + + + Reading from the stream has failed + + + Packets larger than max_allowed_packet are not allowed + + + Unable to execute stored procedure '{0}' + + + same name are not supported + + + Keyword does not allow null values + + + Value has an unsupported format + + + Procedure or function '{0}' cannot be found in database '{1}' + + + Retrieving procedure metadata for {0} from server + + + Retrieving procedure metadata for {0} from procedure cache + + + Connection unexpectedly terminated + + + An incorrect response was received from the server + + + Canceling an active query is only supported on MySQL 5.0.0 and above + + + Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding + + + Canceling an executing query requires MySQL 5.0 or higher + + + Nested transactions are not supported + + + The CommandText property has not been properly initialized + + + There was an error parsing the foreign key definition + + + This category includes a series of counters for MySQL + + + .NET Data Provider for MySQL + + + The number of times a procedures metadata had to be queried from the server + + + Hard Procedure Queries + + + The number of times a procedures metadata was retrieved from the client-side cache + + + Soft Procedure Queries + + + Parameter '{0}' is not found but a parameter with the name '{1}' is found. Parameter names must include the leading parameter marker + + + Unable to connect to any of the specified MySQL hosts + + + Unable to retrieve stored procedure metadata for routine '{0}'. Either grant SELECT privilege to mysql.proc for this user or use "check parameters=false" with your connection string + + + Invalid attempt to call NextResult when the reader is closed + + + When calling stored procedures and 'Use Procedure Bodies' is false, all parameters must have their type explicitly set + + + error connecting: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached + + + Parameter '{0}' has already been defined + + + Parameter '{0}' must be defined + + + The object is not open or has been disposed + + + Multiple simultaneous connections or connections with different connection strings inside the same transaction are not currently supported + + + MySQL Connector/NET does not currently support distributed transactions + + + Fatal error encountered during command execution + + + Fatal error encountered during data read + + + Fatal error encountered attempting to read the resultset + + + Routine '{0}' cannot be found. Either check the spelling or make sure you have sufficient rights to execute the routine + + + Parameter '{0}' was not found during prepare + + + The requested column value could not be treated as or conveted to a Guid + + + Unable to derive stored routine parameters. The 'Parameters' information schema table is not available and access to the stored procedure body has been disabled + + + The default connection encoding was not found. Please report this as a bug along with your connection string and system details + + + Call to GetHostEntry failed after {0} while querying for hostname '{1}': SocketErrorCode={2}, ErrorCode={3}, NativeErrorCode={4} + + + An error occured attempting to enumerate the user-defined functions. Do you have SELECT privileges on the mysql.func table? + + + The given value was not in a supported format + + + The host {0} does not support SSL connections + + + Could not find specified column in results: {0} + + + You have specified an invalid column ordinal + + + Invalid attempt to read a prior column using SequentialAccess + + + Invalid attempt to access a field before calling Read() + + + Unable to start a second async operation while one is running + + + INTERNAL ERROR: More than one output parameter row detected + + + '{0}' is an illegal value for a boolean option + + + Connector/NET no longer supports server versions prior to 5.0 + + + The requested value '{0}' is invalid for the given keyword '{1}' + + + {0}: Connection Closed + + + {0}: Connection Opened: connection string = '{1}' + + + {0}: Query Opened: {2} + + + {0}: Resultset Opened: field(s) = {1}, affected rows = {2}, inserted id = {3} + + + {0}: Query Closed + + + {0}: Set Database: {1} + + + {0}: Usage Advisor Warning: Query is using a bad index + + + {0}: Usage Advisor Warning: Query does not use an index + + + {0}: Resultset Closed. Total rows={1}, skipped rows={2}, size (bytes)={3} + + + {0}: Usage Advisor Warning: Skipped {2} rows. Consider a more focused query + + + {0}: Usage Advisor Warning: The following columns were not accessed: {2} + + + {0}: Usage Advisor Warning: The field '{2}' was converted to the following types: {3} + + + {0}: Error encountered attempting to open result: Number={1}, Message={2} + + + {0}: Error encountered during row fetch. Number = {1}, Message={2} + + + {0}: MySql Warning: Level={1}, Code={2}, Message={3} + + + Unable to trace. There are more than Int32.MaxValue connections in use + + + {0}: Statement prepared: sql='{1}', statement id={2} + + + {0}: Statement closed: statement id = {1} + + + {0}: Statement executed: statement id = {1} + + + Unable to enable query analysis. Be sure the MySql.Data.EMTrace assembly is properly located and registered + + + {0}: Query Normalized: {2} + + + Cannot retrieve Windows identity for current user. Connections that use IntegratedSecurity cannot be pooled. Use either 'ConnectionReset=true' or 'Pooling=false' in the connection string to fix + + + Attempt to call stored function '{0}' without specifying a return parameter + + + Parameters can only be derived for commands using the StoredProcedure command type + + + Replicated connections allow only readonly statements + + + File based certificates are only supported when connecting to MySQL Server 5.1 or greater + + + Snapshot isolation level is not supported + + + Type '{0}' is not derived from BaseExceptionInterceptor + + + Type '{0}' is not derived from BaseCommandInterceptor + + + Unknown authentication method '{0}' was requested + + + Authentication to host '{0}' for user '{1}' using method '{2}' failed with message: {3} + + + Windows authentication connections are not supported on {0} + + + Authentication method '{0}' not supported by any of the available plugins + + + Unable to create plugin for authentication method '{0}'. Please see inner exception for details + + + Mixing named and unnamed parameters is not allowed + + + Parameter index was not found in Parameter Collection + + + Authentication with old password no longer supported, use 4.1 style passwords + + + Microsecond must be a value between 0 and 999999 + + + Millisecond must be a value between 0 and 999. For more precision use Microsecond + + + No available server found + + + Attempt to connect to '{0}' server failed + + + Unknown connection protocol + + + Unix sockets are not supported on Windows + + + Replicated server not found: '{0}' + + + Replication group '{0}' not found + + + The new value must be a MySqlParameter object + + + Value '{0}' is not of the correct type + + + Compression is not supported + + + SSL Connection error + + + The option '{0}' is not currently supported + + + Parameter can't be null or empty + + + Error encountered reading the RSA public key + + + Retrieval of the RSA public key is not enabled for insecure connections + + + String can't be empty + + + Value '{0}' is not of the correct type + + + Parameter '{0}' can't be null or empty + + + Encoding error during validation + + + The specified file cannot be converted to a certificate + + + The specified file cannot be converted to a key + + + Failed to read file at the specified location + + + No file path has been provided for the connection option {0} + + + The provided key is invalid + + + The certificate is invalid + + + Unable to validate the signature + + + Unable to verify the signature + + + The certificate authority (CA) does not match + + + The host name does not match the name on the certificate + + + The certificate is not a certificate authority (CA) + + + Server asked for stream in response to LOAD DATA LOCAL INFILE, but the functionality is disabled by the client setting 'allowlocalinfile' to 'false' + + + The host name or IP address is invalid + + + All server connection attempts were aborted. Timeout of {0} seconds was exceeded for each selected server + + + Specifying multiple host names with DNS SRV lookup is not permitted + + + Specifying a port number with DNS SRV lookup is not permitted + + + Using Unix domain sockets with DNS SRV lookup is not permitted + + + Unable to locate any hosts for {0} + + + Specified list of TLS versions only contains non valid TLS protocols. Accepted values are TLSv1.2 and TLSv1.3 + + + Specified list of TLS versions is empty. Accepted values are TLSv1.2 and TLSv1.3 + + + Verify that user '{0}'@'{1}' has enough privileges to execute + + + Clear-password authentication is not supported over insecure channels + + + Trying to upload a file from outside the path set on 'allowloadlocalinfileinpath' is invalid + + + Either provide a valid path for 'allowloadlocalinfileinpath' or enable 'allowloadlocalinfile' + + + Certificate with Thumbprint '{0}' not found + + + MySQL Server {0} dos not support query attributes + + + MySQL Connector/NET does not support query attributes with prepared statements for this version of MySQL Server + + + Connection protocol '{0}' does not support SSL connections + + + Authentication plugin '{0}' is currently not supported + + + MySQL user '{0}' does not equal the logged-in Windows user '{1}' + + + The OCI SDK cannot be found or is not installed + + + OCI configuration file could not be read + + + OCI configuration file does not contain a 'fingerprint' or 'key_file' entry + + + OCI configuration entry 'key_file' does not reference a valid key file + + + Private key could not be found at location given by OCI configuration entry 'key_file' + + + The size of the OCI security token file exceeds the maximum value of 10KB allowed + + + OCI configuration profile not found + + + Secutiry token file could not be found at location given by OCI configuration entry 'security_token_file' + + + TLS protocols TLSv1 and TLSv1.1 are no longer supported. Accepted values are TLSv1.2 and TLSv1.3 + + + Challenge received is corrupt + + + FIDO registration is missing + + + An event handler for WebAuthnActionRequested was not specified + + + The timeout of 15 seconds for user interaction with FIDO device has been exceeded + + + The OpenID Connect Identity Token is empty + + + The OpenID Connect Identity Token is invalid + + \ No newline at end of file diff --git a/MySQL.Data/src/ResourcesX.Designer.cs b/MySQL.Data/src/ResourcesX.Designer.cs new file mode 100644 index 000000000..e1b04614d --- /dev/null +++ b/MySQL.Data/src/ResourcesX.Designer.cs @@ -0,0 +1,721 @@ +//------------------------------------------------------------------------------ +// +// 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 MySql.Data { + 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", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class ResourcesX { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal ResourcesX() { + } + + /// + /// 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("MySql.Data.ResourcesX", typeof(ResourcesX).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 Appdata path is not defined. + /// + internal static string AppdataNotDefined { + get { + return ResourceManager.GetString("AppdataNotDefined", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Authentication failed using MYSQL41 and SHA256_MEMORY. Check the user name and password or try using a secure connection. + /// + internal static string AuthenticationFailed { + get { + return ResourceManager.GetString("AuthenticationFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to You can't get more sessions because Client is closed. + /// + internal static string ClientIsClosed { + get { + return ResourceManager.GetString("ClientIsClosed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Client option '{0}' does not support value '{1}'. + /// + internal static string ClientOptionInvalidValue { + get { + return ResourceManager.GetString("ClientOptionInvalidValue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Client option '{0}' is not recognized as valid. + /// + internal static string ClientOptionNotValid { + get { + return ResourceManager.GetString("ClientOptionNotValid", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} '{1}' does not exist in schema '{2}'. + /// + internal static string CollectionTableDoesNotExist { + get { + return ResourceManager.GetString("CollectionTableDoesNotExist", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Compression requested but the compression algorithm negotiation failed. + /// + internal static string CompressionAlgorithmNegotiationFailed { + get { + return ResourceManager.GetString("CompressionAlgorithmNegotiationFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Compression using {0} is not supported. + /// + internal static string CompressionAlgorithmNotSupported { + get { + return ResourceManager.GetString("CompressionAlgorithmNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Compression using {0} is not supported in .NET Framework. + /// + internal static string CompressionForSpecificAlgorithmNotSupportedInNetFramework { + get { + return ResourceManager.GetString("CompressionForSpecificAlgorithmNotSupportedInNetFramework", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The connection property 'compression' acceptable values are: 'preferred', 'required' or 'disabled'. The value '{0}' is not acceptable. + /// + internal static string CompressionInvalidValue { + get { + return ResourceManager.GetString("CompressionInvalidValue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Compression is not enabled. + /// + internal static string CompressionNotEnabled { + get { + return ResourceManager.GetString("CompressionNotEnabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Compression requested but the server does not support it. + /// + internal static string CompressionNotSupportedByServer { + get { + return ResourceManager.GetString("CompressionNotSupportedByServer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There are still decompressed messages pending to be processed. + /// + internal static string CompressionPendingMessagesToProcess { + get { + return ResourceManager.GetString("CompressionPendingMessagesToProcess", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Custom type mapping is only supported from .NET Core 3.1 and later. + /// + internal static string CustomTypeNotSupported { + get { + return ResourceManager.GetString("CustomTypeNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}' cannot be set to false with DNS SRV lookup enabled. + /// + internal static string DnsSrvConflictingOptions { + get { + return ResourceManager.GetString("DnsSrvConflictingOptions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Scheme '{0}' is not valid. + /// + internal static string DnsSrvInvalidScheme { + get { + return ResourceManager.GetString("DnsSrvInvalidScheme", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The document path cannot be null or an empty string. + /// + internal static string DocPathNullOrEmpty { + get { + return ResourceManager.GetString("DocPathNullOrEmpty", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Duplicate key '{0}' used in "connection-attributes". + /// + internal static string DuplicateUserDefinedAttribute { + get { + return ResourceManager.GetString("DuplicateUserDefinedAttribute", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key name in connection attribute cannot be an empty string. + /// + internal static string EmptyKeyConnectionAttribute { + get { + return ResourceManager.GetString("EmptyKeyConnectionAttribute", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to At least one option must be specified. + /// + internal static string EmptyOptions { + get { + return ResourceManager.GetString("EmptyOptions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This feature is currently not supported. + /// + internal static string FeatureNotSupported { + get { + return ResourceManager.GetString("FeatureNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to This functionality is only supported in MySQL {0} and higher. + /// + internal static string FunctionalityNotSupported { + get { + return ResourceManager.GetString("FunctionalityNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Collation with id '{0}' not found. + /// + internal static string InvalidCollationId { + get { + return ResourceManager.GetString("InvalidCollationId", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The value of "connection-attributes" must be either a boolean or a list of key-value pairs. + /// + internal static string InvalidConnectionAttributes { + get { + return ResourceManager.GetString("InvalidConnectionAttributes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Connection Data is incorrect. + /// + internal static string InvalidConnectionData { + get { + return ResourceManager.GetString("InvalidConnectionData", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The connection string is invalid. + /// + internal static string InvalidConnectionString { + get { + return ResourceManager.GetString("InvalidConnectionString", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to '{0}' is not a valid connection string attribute. + /// + internal static string InvalidConnectionStringAttribute { + get { + return ResourceManager.GetString("InvalidConnectionStringAttribute", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The connection timeout value must be a positive integer (including 0). + /// + internal static string InvalidConnectionTimeoutValue { + get { + return ResourceManager.GetString("InvalidConnectionTimeoutValue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Decimal (BCD) format is invalid. + /// + internal static string InvalidDecimalFormat { + get { + return ResourceManager.GetString("InvalidDecimalFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field type with name '{0}' not found. + /// + internal static string InvalidFieldType { + get { + return ResourceManager.GetString("InvalidFieldType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Index type with name '{0}' not found. + /// + internal static string InvalidIndexType { + get { + return ResourceManager.GetString("InvalidIndexType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The value provided is not a valid JSON document. {0}. + /// + internal static string InvalidJsonDocument { + get { + return ResourceManager.GetString("InvalidJsonDocument", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} is not a valid column name in the row. + /// + internal static string InvalidNameIndex { + get { + return ResourceManager.GetString("InvalidNameIndex", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} is not a valid index for the row. + /// + internal static string InvalidRowIndex { + get { + return ResourceManager.GetString("InvalidRowIndex", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Session state is not valid. + /// + internal static string InvalidSession { + get { + return ResourceManager.GetString("InvalidSession", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid Uri . + /// + internal static string InvalidUriData { + get { + return ResourceManager.GetString("InvalidUriData", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid uri query value. + /// + internal static string InvalidUriQuery { + get { + return ResourceManager.GetString("InvalidUriQuery", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Key names in "connection-attributes" cannot start with "_". + /// + internal static string InvalidUserDefinedAttribute { + get { + return ResourceManager.GetString("InvalidUserDefinedAttribute", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Json configuration must contain 'uri' or 'host' but not both. + /// + internal static string JsonUriOrHost { + get { + return ResourceManager.GetString("JsonUriOrHost", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Keyword '{0}' not found. + /// + internal static string KeywordNotFound { + get { + return ResourceManager.GetString("KeywordNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Keyword not supported. + /// + internal static string KeywordNotSupported { + get { + return ResourceManager.GetString("KeywordNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field '{0}' is mandatory. + /// + internal static string MandatoryFieldNotFound { + get { + return ResourceManager.GetString("MandatoryFieldNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Missed required schema option. + /// + internal static string MissingSchemaOption { + get { + return ResourceManager.GetString("MissingSchemaOption", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to More than one document id was generated. Please use the DocumentIds property instead. + /// + internal static string MoreThanOneDocumentId { + get { + return ResourceManager.GetString("MoreThanOneDocumentId", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There is no data at index {0}. + /// + internal static string NoDataAtIndex { + get { + return ResourceManager.GetString("NoDataAtIndex", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No 'host' has been specified. + /// + internal static string NoHost { + get { + return ResourceManager.GetString("NoHost", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No more data in resultset. + /// + internal static string NoMoreData { + get { + return ResourceManager.GetString("NoMoreData", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Object '{0}' not found. + /// + internal static string NoObjectFound { + get { + return ResourceManager.GetString("NoObjectFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No placeholders. + /// + internal static string NoPlaceholders { + get { + return ResourceManager.GetString("NoPlaceholders", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Connection closed. Reason: connection idle was too long. + /// + internal static string NoticeIdleConnection { + get { + return ResourceManager.GetString("NoticeIdleConnection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Connection closed. Reason: connection was killed by a different session. + /// + internal static string NoticeKilledConnection { + get { + return ResourceManager.GetString("NoticeKilledConnection", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Connection closed. Reason: server was shutdown. + /// + internal static string NoticeServerShutdown { + get { + return ResourceManager.GetString("NoticeServerShutdown", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to {0} must be a value greater than 0. + /// + internal static string NumberNotGreaterThanZero { + get { + return ResourceManager.GetString("NumberNotGreaterThanZero", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Path not found '{0}'. + /// + internal static string PathNotFound { + get { + return ResourceManager.GetString("PathNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Queue timeout expired. The timeout period elapsed prior to getting a session from the pool. + /// + internal static string PoolingQueueTimeout { + get { + return ResourceManager.GetString("PoolingQueueTimeout", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Providing a port number as part of the host address isn't supported when using connection strings in basic format or anonymous objects. Use URI format instead. + /// + internal static string PortNotSupported { + get { + return ResourceManager.GetString("PortNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to You must either assign no priority to any of the hosts or give a priority for every host. + /// + internal static string PriorityForAllOrNoHosts { + get { + return ResourceManager.GetString("PriorityForAllOrNoHosts", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The priority must be between 0 and 100. + /// + internal static string PriorityOutOfLimits { + get { + return ResourceManager.GetString("PriorityOutOfLimits", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ProgramData path is not defined. + /// + internal static string ProgramDataNotDefined { + get { + return ResourceManager.GetString("ProgramDataNotDefined", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Replacement document has an '_id' that is + ///different from the matched document. + /// + internal static string ReplaceWithNoMatchingId { + get { + return ResourceManager.GetString("ReplaceWithNoMatchingId", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The server doesn't support the requested operation. Please update the MySQL Server, client library, or both. + /// + internal static string SchemaCreateCollectionMsg { + get { + return ResourceManager.GetString("SchemaCreateCollectionMsg", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The process of closing the resultset and resulted in results being lost. + /// + internal static string ThrowingAwayResults { + get { + return ResourceManager.GetString("ThrowingAwayResults", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All server connection attempts were aborted. Timeout of {0} milliseconds was exceeded for each selected server. + /// + internal static string TimeOutMultipleHost { + get { + return ResourceManager.GetString("TimeOutMultipleHost", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All server connection attempts were aborted. Timeout was exceeded for each selected server. + /// + internal static string TimeOutMultipleHost0ms { + get { + return ResourceManager.GetString("TimeOutMultipleHost0ms", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Connection attempt to the server was aborted. Timeout of {0} milliseconds was exceeded. + /// + internal static string TimeOutSingleHost { + get { + return ResourceManager.GetString("TimeOutSingleHost", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Connection attempt to the server was aborted. Timeout was exceeded. + /// + internal static string TimeOutSingleHost0ms { + get { + return ResourceManager.GetString("TimeOutSingleHost0ms", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to connect to any specified host. + /// + internal static string UnableToConnect { + get { + return ResourceManager.GetString("UnableToConnect", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to read or decode data value. + /// + internal static string UnableToDecodeDataValue { + get { + return ResourceManager.GetString("UnableToDecodeDataValue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to open a session. + /// + internal static string UnableToOpenSession { + get { + return ResourceManager.GetString("UnableToOpenSession", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unexpected end of packet found while reading data values. + /// + internal static string UnexpectedEndOfPacketFound { + get { + return ResourceManager.GetString("UnexpectedEndOfPacketFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Field name '{0}' is not allowed. + /// + internal static string UnexpectedField { + get { + return ResourceManager.GetString("UnexpectedField", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unknown placeholder :{0}. + /// + internal static string UnknownPlaceholder { + get { + return ResourceManager.GetString("UnknownPlaceholder", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Value '{0}' is not of the correct type. + /// + internal static string ValueNotCorrectType { + get { + return ResourceManager.GetString("ValueNotCorrectType", resourceCulture); + } + } + } +} diff --git a/MySQL.Data/src/ResourcesX.resx b/MySQL.Data/src/ResourcesX.resx new file mode 100644 index 000000000..c32081e6c --- /dev/null +++ b/MySQL.Data/src/ResourcesX.resx @@ -0,0 +1,340 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Collation with id '{0}' not found + + + Connection Data is incorrect + + + '{0}' is not a valid connection string attribute + + + The connection string is invalid + + + Decimal (BCD) format is invalid + + + {0} is not a valid column name in the row + + + {0} is not a valid index for the row + + + Keyword not supported + + + More than one document id was generated. Please use the DocumentIds property instead + + + There is no data at index {0} + + + No more data in resultset + + + No placeholders + + + Path not found '{0}' + + + The process of closing the resultset and resulted in results being lost + + + Unable to connect to any specified host + + + Unable to read or decode data value + + + Unexpected end of packet found while reading data values + + + Unknown placeholder :{0} + + + Value '{0}' is not of the correct type + + + Object '{0}' not found + + + Invalid Uri + + + Invalid uri query value + + + Json configuration must contain 'uri' or 'host' but not both + + + No 'host' has been specified + + + Appdata path is not defined + + + ProgramData path is not defined + + + Keyword '{0}' not found + + + You must either assign no priority to any of the hosts or give a priority for every host + + + The priority must be between 0 and 100 + + + Providing a port number as part of the host address isn't supported when using connection strings in basic format or anonymous objects. Use URI format instead + + + {0} must be a value greater than 0 + + + This functionality is only supported in MySQL {0} and higher + + + Field '{0}' is mandatory + + + Field name '{0}' is not allowed + + + Field type with name '{0}' not found + + + Index type with name '{0}' not found + + + Authentication failed using MYSQL41 and SHA256_MEMORY. Check the user name and password or try using a secure connection + + + This feature is currently not supported + + + The value provided is not a valid JSON document. {0} + + + The connection timeout value must be a positive integer (including 0) + + + All server connection attempts were aborted. Timeout of {0} milliseconds was exceeded for each selected server + + + Connection attempt to the server was aborted. Timeout of {0} milliseconds was exceeded + + + All server connection attempts were aborted. Timeout was exceeded for each selected server + + + Connection attempt to the server was aborted. Timeout was exceeded + + + Client option '{0}' does not support value '{1}' + + + Client option '{0}' is not recognized as valid + + + Queue timeout expired. The timeout period elapsed prior to getting a session from the pool + + + Session state is not valid + + + Unable to open a session + + + You can't get more sessions because Client is closed + + + {0} '{1}' does not exist in schema '{2}' + + + Duplicate key '{0}' used in "connection-attributes" + + + Key names in "connection-attributes" cannot start with "_" + + + The value of "connection-attributes" must be either a boolean or a list of key-value pairs + + + Key name in connection attribute cannot be an empty string + + + The server doesn't support the requested operation. Please update the MySQL Server, client library, or both + + + At least one option must be specified + + + Missed required schema option + + + Scheme '{0}' is not valid + + + '{0}' cannot be set to false with DNS SRV lookup enabled + + + Compression requested but the compression algorithm negotiation failed + + + The connection property 'compression' acceptable values are: 'preferred', 'required' or 'disabled'. The value '{0}' is not acceptable + + + Compression requested but the server does not support it + + + Compression using {0} is not supported + + + Compression using {0} is not supported in .NET Framework + + + Compression is not enabled + + + There are still decompressed messages pending to be processed + + + Connection closed. Reason: connection idle was too long + + + Connection closed. Reason: connection was killed by a different session + + + Connection closed. Reason: server was shutdown + + + Replacement document has an '_id' that is +different from the matched document + + + The document path cannot be null or an empty string + + + Custom type mapping is only supported from .NET Core 3.1 and later + + \ No newline at end of file diff --git a/MySQL.Data/src/ResultSet.cs b/MySQL.Data/src/ResultSet.cs new file mode 100644 index 000000000..3b7fa890f --- /dev/null +++ b/MySQL.Data/src/ResultSet.cs @@ -0,0 +1,339 @@ +// Copyright © 2009, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Types; +using System; +using System.Collections.Generic; +using System.Data; +using System.Diagnostics; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + internal class ResultSet + { + private Driver _driver; + private bool[] _uaFieldsUsed; + private Dictionary _fieldHashCi; + private int _rowIndex; + private bool _readDone; + private bool _isSequential; + private int _seqIndex; + private readonly int _statementId; + private bool _cached; + private List _cachedValues; + + public ResultSet(int affectedRows, long insertedId) + { + AffectedRows = affectedRows; + InsertedId = insertedId; + _readDone = true; + } + + public static async Task CreateResultSetAsync(Driver d, int statementId, int numCols, bool execAsync) + { + ResultSet resultSet = new ResultSet(d, statementId); + await resultSet.InitializeAsync(numCols, execAsync).ConfigureAwait(false); + return resultSet; + } + + private ResultSet(Driver d, int statementId) + { + AffectedRows = -1; + InsertedId = -1; + _driver = d; + _statementId = statementId; + _rowIndex = -1; + } + + private async Task InitializeAsync(int numCols, bool execAsync) + { + await LoadColumnsAsync(numCols, execAsync).ConfigureAwait(false); + IsOutputParameters = IsOutputParameterResultSet(); + HasRows = await GetNextRowAsync(execAsync).ConfigureAwait(false); + _readDone = !HasRows; + } + + #region Properties + + public bool HasRows { get; private set; } + + public int Size => Fields?.Length ?? 0; + + public MySqlField[] Fields { get; private set; } + + public IMySqlValue[] Values { get; private set; } + + public bool IsOutputParameters { get; set; } + + public int AffectedRows { get; private set; } + + public long InsertedId { get; private set; } + + public int TotalRows { get; private set; } + + public int SkippedRows { get; private set; } + + public bool Cached + { + get { return _cached; } + set + { + _cached = value; + if (_cached && _cachedValues == null) + _cachedValues = new List(); + } + } + + #endregion + + /// + /// return the ordinal for the given column name + /// + /// + /// + public int GetOrdinal(string name) + { + int ordinal; + + // quick hash lookup using CI hash + if (_fieldHashCi.TryGetValue(name, out ordinal)) + return ordinal; + + // Throw an exception if the ordinal cannot be found. + throw new IndexOutOfRangeException( + String.Format(Resources.CouldNotFindColumnName, name)); + } + + /// + /// Retrieve the value as the given column index + /// + /// The column value to retrieve + /// The value as the given column + public IMySqlValue this[int index] + { + get + { + if (_rowIndex < 0) + throw new MySqlException(Resources.AttemptToAccessBeforeRead); + + // keep count of how many columns we have left to access + _uaFieldsUsed[index] = true; + + if (_isSequential && index != _seqIndex) + { + if (index < _seqIndex) + throw new MySqlException(Resources.ReadingPriorColumnUsingSeqAccess); + while (_seqIndex < (index - 1)) + _driver.SkipColumnValue(Values[++_seqIndex]); + Values[index] = _driver.ReadColumnValueAsync(index, Fields[index], Values[index], false).GetAwaiter().GetResult(); + _seqIndex = index; + } + + return Values[index]; + } + } + + private async Task GetNextRowAsync(bool execAsync) + { + bool fetched = await _driver.FetchDataRowAsync(_statementId, Size, execAsync).ConfigureAwait(false); + + if (fetched) + TotalRows++; + + return fetched; + } + + public async Task NextRowAsync(CommandBehavior behavior, bool execAsync) + { + if (_readDone) + { + if (Cached) return CachedNextRow(behavior); + return false; + } + + if ((behavior & CommandBehavior.SingleRow) != 0 && _rowIndex == 0) + return false; + + _isSequential = (behavior & CommandBehavior.SequentialAccess) != 0; + _seqIndex = -1; + + // if we are at row index >= 0 then we need to fetch the data row and load it + if (_rowIndex >= 0) + { + bool fetched; + try + { + fetched = await GetNextRowAsync(execAsync).ConfigureAwait(false); + } + catch (MySqlException ex) + { + if (ex.IsQueryAborted) + { + // avoid hanging on Close() + _readDone = true; + } + throw; + } + + if (!fetched) + { + _readDone = true; + return false; + } + } + + if (!_isSequential) + await ReadColumnDataAsync(false, execAsync).ConfigureAwait(false); + + _rowIndex++; + return true; + } + + private bool CachedNextRow(CommandBehavior behavior) + { + if ((behavior & CommandBehavior.SingleRow) != 0 && _rowIndex == 0) + return false; + if (_rowIndex == (TotalRows - 1)) return false; + _rowIndex++; + Values = _cachedValues[_rowIndex]; + return true; + } + + /// + /// Closes the current resultset, dumping any data still on the wire + /// + public async Task CloseAsync(bool execAsync) + { + if (!_readDone) + { + + // if we have rows but the user didn't read the first one then mark it as skipped + if (HasRows && _rowIndex == -1) + SkippedRows++; + try + { + while (_driver.IsOpen && await _driver.SkipDataRowAsync(execAsync).ConfigureAwait(false)) + { + TotalRows++; + SkippedRows++; + } + } + catch (System.IO.IOException) + { + // it is ok to eat IO exceptions here, we just want to + // close the result set + } + _readDone = true; + } + else if (_driver == null) + CacheClose(); + + _driver = null; + if (Cached) CacheReset(); + } + + private void CacheClose() + { + SkippedRows = TotalRows - _rowIndex - 1; + } + + private void CacheReset() + { + if (!Cached) return; + _rowIndex = -1; + AffectedRows = -1; + InsertedId = -1; + SkippedRows = 0; + } + + public bool FieldRead(int index) + { + Debug.Assert(Size > index); + return _uaFieldsUsed[index]; + } + + public void SetValueObject(int i, IMySqlValue valueObject) + { + Debug.Assert(Values != null); + Debug.Assert(i < Values.Length); + Values[i] = valueObject; + } + + private bool IsOutputParameterResultSet() + { + if (_driver.HasStatus(ServerStatusFlags.OutputParameters)) return true; + + if (Fields.Length == 0) return false; + + for (int x = 0; x < Fields.Length; x++) + if (!Fields[x].ColumnName.StartsWith("@" + StoredProcedure.ParameterPrefix, StringComparison.OrdinalIgnoreCase)) return false; + return true; + } + + /// + /// Loads the column metadata for the current resultset + /// + private async Task LoadColumnsAsync(int numCols, bool execAsync) + { + Fields = await _driver.GetColumnsAsync(numCols, execAsync).ConfigureAwait(false); + + Values = new IMySqlValue[numCols]; + _uaFieldsUsed = new bool[numCols]; + _fieldHashCi = new Dictionary(StringComparer.OrdinalIgnoreCase); + + for (int i = 0; i < Fields.Length; i++) + { + string columnName = Fields[i].ColumnName; + if (!_fieldHashCi.ContainsKey(columnName)) + _fieldHashCi.Add(columnName, i); + Values[i] = Fields[i].GetValueObject(); + } + } + + private async Task ReadColumnDataAsync(bool outputParms, bool execAsync) + { + for (int i = 0; i < Size; i++) + Values[i] = await _driver.ReadColumnValueAsync(i, Fields[i], Values[i], execAsync).ConfigureAwait(false); + + // if we are caching then we need to save a copy of this row of data values + if (Cached) + _cachedValues.Add((IMySqlValue[])Values.Clone()); + + // we don't need to worry about caching the following since you won't have output + // params with TableDirect commands + if (!outputParms) return; + + bool rowExists = await _driver.FetchDataRowAsync(_statementId, Fields.Length, execAsync).ConfigureAwait(false); + _rowIndex = 0; + + if (rowExists) + throw new MySqlException(Resources.MoreThanOneOPRow); + } + } +} diff --git a/MySQL.Data/src/Runtime.cs b/MySQL.Data/src/Runtime.cs new file mode 100644 index 000000000..beb65869b --- /dev/null +++ b/MySQL.Data/src/Runtime.cs @@ -0,0 +1,56 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +using System; + +namespace MySql.Web.Security +{ + internal static class Runtime + { + private static bool inited; + private static bool isMono; + + public static bool IsMono + { + get + { + if (!inited) + Init(); + return isMono; + } + } + + private static void Init() + { + Type t = Type.GetType("Mono.Runtime"); + isMono = t != null; + inited = true; + } + } +} diff --git a/MySQL.Data/src/Schema.cs b/MySQL.Data/src/Schema.cs new file mode 100644 index 000000000..d63a28d86 --- /dev/null +++ b/MySQL.Data/src/Schema.cs @@ -0,0 +1,243 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Data; + +namespace MySql.Data.MySqlClient +{ + /// + /// Represents a schema and its contents. + /// + public partial class MySqlSchemaCollection + { + private readonly List _columns = new List(); + private readonly List _rows = new List(); + private readonly DataTable _table = null; + + public MySqlSchemaCollection() + { + Mapping = new Dictionary( StringComparer.OrdinalIgnoreCase ); + LogicalMappings = new Dictionary(); + } + + public MySqlSchemaCollection(string name) : this() + { + Name = name; + } + + public MySqlSchemaCollection(DataTable dt) : this() + { + // cache the original datatable to avoid the overhead of creating again whenever possible. + _table = dt; + int i = 0; + foreach (DataColumn dc in dt.Columns) + { + Columns.Add(new SchemaColumn() { Name = dc.ColumnName, Type = dc.DataType }); + Mapping.Add(dc.ColumnName, i++); + LogicalMappings[Columns.Count - 1] = Columns.Count - 1; + } + + foreach (DataRow dr in dt.Rows) + { + MySqlSchemaRow row = new MySqlSchemaRow(this); + for (i = 0; i < Columns.Count; i++) + { + row[i] = dr[i]; + } + Rows.Add(row); + } + } + + internal Dictionary Mapping; + internal Dictionary LogicalMappings; + + /// + /// Gets or sets the name of the schema. + /// + public string Name { get; set; } + + /// + /// Gets the list of columns in the schema. + /// + public IList Columns => _columns; + + /// + /// Gets the list of rows in the schema. + /// + public IList Rows => _rows; + + internal SchemaColumn AddColumn(string name, Type t) + { + SchemaColumn c = new SchemaColumn + { + Name = name, + Type = t + }; + + _columns.Add(c); + Mapping.Add(name, _columns.Count-1); + LogicalMappings[_columns.Count - 1] = _columns.Count - 1; + return c; + } + + internal int ColumnIndex(string name) + { + int index = -1; + for (int i = 0; i < _columns.Count; i++) + { + SchemaColumn c = _columns[i]; + if (String.Compare(c.Name, name, StringComparison.OrdinalIgnoreCase) != 0) continue; + index = i; + break; + } + return index; + } + + internal void RemoveColumn(string name) + { + int index = ColumnIndex(name); + if (index == -1) + throw new InvalidOperationException(); + _columns.RemoveAt(index); + for (int i = index; i < Columns.Count; i++) + LogicalMappings[i] = LogicalMappings[i] + 1; + } + + internal bool ContainsColumn(string name) + { + return ColumnIndex(name) >= 0; + } + + internal MySqlSchemaRow AddRow() + { + MySqlSchemaRow r = new MySqlSchemaRow(this); + _rows.Add(r); + return r; + } + + internal MySqlSchemaRow NewRow() + { + MySqlSchemaRow r = new MySqlSchemaRow(this); + return r; + } + + internal DataTable AsDataTable() + { + if (_table != null) return _table; + DataTable dt = new DataTable(Name); + foreach (SchemaColumn col in Columns) + dt.Columns.Add(col.Name, col.Type); + foreach (MySqlSchemaRow row in Rows) + { + DataRow newRow = dt.NewRow(); + for (int i = 0; i < dt.Columns.Count; i++) + newRow[i] = row[i] == null ? DBNull.Value : row[i]; + dt.Rows.Add(newRow); + } + return dt; + } + } + + /// + /// Represents a row within a schema. + /// + public class MySqlSchemaRow + { + private Dictionary _data; + + public MySqlSchemaRow(MySqlSchemaCollection c) + { + Collection = c; + InitMetadata(); + } + + internal void InitMetadata() + { + _data = new Dictionary(); + } + + internal MySqlSchemaCollection Collection { get; } + + internal object this[string s] + { + get { return GetValueForName(s); } + set { SetValueForName(s, value); } + } + + internal object this[int i] + { + get { + int idx = Collection.LogicalMappings[i]; + if (!_data.ContainsKey(idx)) + _data[idx] = null; + return _data[ idx ]; + } + set { _data[ Collection.LogicalMappings[ i ] ] = value; } + } + + private void SetValueForName(string colName, object value) + { + int index = Collection.Mapping[colName]; + this[index] = value; + } + + private object GetValueForName(string colName) + { + int index = Collection.Mapping[colName]; + if (!_data.ContainsKey(index)) + _data[index] = null; + return this[index]; + } + + internal void CopyRow(MySqlSchemaRow row) + { + if (Collection.Columns.Count != row.Collection.Columns.Count) + throw new InvalidOperationException("column count doesn't match"); + for (int i = 0; i < Collection.Columns.Count; i++) + row[i] = this[i]; + } + } + + /// + /// Represents a column within a schema. + /// + public class SchemaColumn + { + /// + /// The name of the column. + /// + public string Name { get; set; } + + /// + /// The type of the column. + /// + public Type Type { get; set; } + } +} diff --git a/MySQL.Data/src/SchemaProvider.cs b/MySQL.Data/src/SchemaProvider.cs new file mode 100644 index 000000000..468521d66 --- /dev/null +++ b/MySQL.Data/src/SchemaProvider.cs @@ -0,0 +1,979 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using MySql.Data.Types; +using System; +using System.Collections.Generic; +using System.Data; +using System.Data.Common; +using System.Globalization; +using System.IO; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + internal class SchemaProvider + { + protected MySqlConnection connection; + public static string MetaCollection = "MetaDataCollections"; + + public SchemaProvider(MySqlConnection connectionToUse) + { + connection = connectionToUse; + } + + public MySqlSchemaCollection GetSchema(string collection, String[] restrictions) => GetSchemaAsync(collection, restrictions, false).GetAwaiter().GetResult(); + + public async Task GetSchemaAsync(string collection, String[] restrictions, bool execAsync, CancellationToken cancellationToken = default) + { + if (connection.State != ConnectionState.Open) + throw new MySqlException("GetSchema can only be called on an open connection."); + + collection = StringUtility.ToUpperInvariant(collection); + MySqlSchemaCollection c = await GetSchemaInternalAsync(collection, restrictions, execAsync, cancellationToken).ConfigureAwait(false); + + if (c == null) + throw new ArgumentException("Invalid collection name"); + return c; + } + + public virtual async Task GetDatabasesAsync(string[] restrictions, bool execAsync, CancellationToken cancellationToken = default) + { + Regex regex = null; + int caseSetting = Int32.Parse(connection.driver.Property("lower_case_table_names"), CultureInfo.InvariantCulture); + + string sql = "SHOW DATABASES"; + + // if lower_case_table_names is zero, then case lookup should be sensitive + // so we can use LIKE to do the matching. + if (caseSetting == 0) + { + if (restrictions != null && restrictions.Length >= 1) + sql = sql + " LIKE '" + restrictions[0] + "'"; + } + + MySqlSchemaCollection c = await QueryCollectionAsync("Databases", sql, execAsync, cancellationToken).ConfigureAwait(false); + + if (caseSetting != 0 && restrictions != null && restrictions.Length >= 1 && restrictions[0] != null) + regex = new Regex(restrictions[0], RegexOptions.IgnoreCase); + + MySqlSchemaCollection c2 = new MySqlSchemaCollection("Databases"); + c2.AddColumn("CATALOG_NAME", typeof(string)); + c2.AddColumn("SCHEMA_NAME", typeof(string)); + + foreach (MySqlSchemaRow row in c.Rows) + { + if (regex != null && !regex.Match(row[0].ToString()).Success) continue; + MySqlSchemaRow newRow = c2.AddRow(); + newRow[1] = row[0]; + } + return c2; + } + + public virtual async Task GetTablesAsync(string[] restrictions, bool execAsync, CancellationToken cancellationToken = default) + { + MySqlSchemaCollection c = new MySqlSchemaCollection("Tables"); + c.AddColumn("TABLE_CATALOG", typeof(string)); + c.AddColumn("TABLE_SCHEMA", typeof(string)); + c.AddColumn("TABLE_NAME", typeof(string)); + c.AddColumn("TABLE_TYPE", typeof(string)); + c.AddColumn("ENGINE", typeof(string)); + c.AddColumn("VERSION", typeof(ulong)); + c.AddColumn("ROW_FORMAT", typeof(string)); + c.AddColumn("TABLE_ROWS", typeof(ulong)); + c.AddColumn("AVG_ROW_LENGTH", typeof(ulong)); + c.AddColumn("DATA_LENGTH", typeof(ulong)); + c.AddColumn("MAX_DATA_LENGTH", typeof(ulong)); + c.AddColumn("INDEX_LENGTH", typeof(ulong)); + c.AddColumn("DATA_FREE", typeof(ulong)); + c.AddColumn("AUTO_INCREMENT", typeof(ulong)); + c.AddColumn("CREATE_TIME", typeof(DateTime)); + c.AddColumn("UPDATE_TIME", typeof(DateTime)); + c.AddColumn("CHECK_TIME", typeof(DateTime)); + c.AddColumn("TABLE_COLLATION", typeof(string)); + c.AddColumn("CHECKSUM", typeof(ulong)); + c.AddColumn("CREATE_OPTIONS", typeof(string)); + c.AddColumn("TABLE_COMMENT", typeof(string)); + + // we have to new up a new restriction array here since + // GetDatabases takes the database in the first slot + string[] dbRestriction = new string[4]; + if (restrictions != null && restrictions.Length >= 2) + dbRestriction[0] = restrictions[1]; + + MySqlSchemaCollection databases = await GetDatabasesAsync(dbRestriction, execAsync, cancellationToken).ConfigureAwait(false); + + if (restrictions != null) + Array.Copy(restrictions, dbRestriction, Math.Min(dbRestriction.Length, restrictions.Length)); + + foreach (MySqlSchemaRow row in databases.Rows) + { + dbRestriction[1] = row["SCHEMA_NAME"].ToString(); + await FindTablesAsync(c, dbRestriction, execAsync, cancellationToken).ConfigureAwait(false); + } + + return c; + } + + protected void QuoteDefaultValues(MySqlSchemaCollection schemaCollection) + { + if (schemaCollection == null) return; + if (!schemaCollection.ContainsColumn("COLUMN_DEFAULT")) return; + + foreach (MySqlSchemaRow row in schemaCollection.Rows) + { + object defaultValue = row["COLUMN_DEFAULT"]; + if (MetaData.IsTextType(row["DATA_TYPE"].ToString())) + row["COLUMN_DEFAULT"] = String.Format("{0}", defaultValue); + } + } + + public virtual async Task GetColumnsAsync(string[] restrictions, bool execAsync, CancellationToken cancellationToken = default) + { + MySqlSchemaCollection c = new MySqlSchemaCollection("Columns"); + c.AddColumn("TABLE_CATALOG", typeof(string)); + c.AddColumn("TABLE_SCHEMA", typeof(string)); + c.AddColumn("TABLE_NAME", typeof(string)); + c.AddColumn("COLUMN_NAME", typeof(string)); + c.AddColumn("ORDINAL_POSITION", typeof(ulong)); + c.AddColumn("COLUMN_DEFAULT", typeof(string)); + c.AddColumn("IS_NULLABLE", typeof(string)); + c.AddColumn("DATA_TYPE", typeof(string)); + c.AddColumn("CHARACTER_MAXIMUM_LENGTH", typeof(ulong)); + c.AddColumn("CHARACTER_OCTET_LENGTH", typeof(ulong)); + c.AddColumn("NUMERIC_PRECISION", typeof(ulong)); + c.AddColumn("NUMERIC_SCALE", typeof(ulong)); + c.AddColumn("CHARACTER_SET_NAME", typeof(string)); + c.AddColumn("COLLATION_NAME", typeof(string)); + c.AddColumn("COLUMN_TYPE", typeof(string)); + c.AddColumn("COLUMN_KEY", typeof(string)); + c.AddColumn("EXTRA", typeof(string)); + c.AddColumn("PRIVILEGES", typeof(string)); + c.AddColumn("COLUMN_COMMENT", typeof(string)); + c.AddColumn("GENERATION_EXPRESSION", typeof(string)); + + // we don't allow restricting on table type here + string columnName = null; + if (restrictions != null && restrictions.Length == 4) + { + columnName = restrictions[3]; + restrictions[3] = null; + } + + MySqlSchemaCollection tables = await GetTablesAsync(restrictions, execAsync, cancellationToken).ConfigureAwait(false); + + foreach (MySqlSchemaRow row in tables.Rows) + await LoadTableColumnsAsync(c, row["TABLE_SCHEMA"].ToString(), row["TABLE_NAME"].ToString(), columnName, execAsync, cancellationToken).ConfigureAwait(false); + + QuoteDefaultValues(c); + return c; + } + + private async Task LoadTableColumnsAsync(MySqlSchemaCollection schemaCollection, string schema, string tableName, string columnRestriction, + bool execAsync, CancellationToken cancellationToken = default) + { + string sql = String.Format("SHOW FULL COLUMNS FROM `{0}`.`{1}`", schema, tableName); + using MySqlCommand cmd = new MySqlCommand(sql, connection); + + int pos = 1; + using (MySqlDataReader reader = await cmd.ExecuteReaderAsync(default, execAsync, cancellationToken).ConfigureAwait(false)) + { + while (await reader.ReadAsync(execAsync, cancellationToken).ConfigureAwait(false)) + { + string colName = reader.GetString(0); + if (columnRestriction != null && colName != columnRestriction) + continue; + MySqlSchemaRow row = schemaCollection.AddRow(); + row["TABLE_CATALOG"] = DBNull.Value; + row["TABLE_SCHEMA"] = schema; + row["TABLE_NAME"] = tableName; + row["COLUMN_NAME"] = colName; + row["ORDINAL_POSITION"] = pos++; + row["COLUMN_DEFAULT"] = reader.GetValue(5); + row["IS_NULLABLE"] = reader.GetString(3); + row["DATA_TYPE"] = reader.GetString(1); + row["CHARACTER_MAXIMUM_LENGTH"] = DBNull.Value; + row["CHARACTER_OCTET_LENGTH"] = DBNull.Value; + row["NUMERIC_PRECISION"] = DBNull.Value; + row["NUMERIC_SCALE"] = DBNull.Value; + row["CHARACTER_SET_NAME"] = reader.GetValue(2); + row["COLLATION_NAME"] = row["CHARACTER_SET_NAME"]; + row["COLUMN_TYPE"] = reader.GetString(1); + row["COLUMN_KEY"] = reader.GetString(4); + row["EXTRA"] = reader.GetString(6); + row["PRIVILEGES"] = reader.GetString(7); + row["COLUMN_COMMENT"] = reader.GetString(8); + row["GENERATION_EXPRESSION"] = reader.GetString(6).Contains("VIRTUAL") ? reader.GetString(9) : string.Empty; + ParseColumnRow(row); + } + } + } + + private static void ParseColumnRow(MySqlSchemaRow row) + { + // first parse the character set name + string charset = row["CHARACTER_SET_NAME"].ToString(); + int index = charset.IndexOf('_'); + if (index != -1) + row["CHARACTER_SET_NAME"] = charset.Substring(0, index); + + // now parse the data type + string dataType = row["DATA_TYPE"].ToString(); + index = dataType.IndexOf('('); + if (index == -1) + return; + row["DATA_TYPE"] = dataType.Substring(0, index); + int stop = dataType.IndexOf(')', index); + string dataLen = dataType.Substring(index + 1, stop - (index + 1)); + string lowerType = row["DATA_TYPE"].ToString().ToLower(); + if (lowerType == "char" || lowerType == "varchar") + row["CHARACTER_MAXIMUM_LENGTH"] = dataLen; + else if (lowerType == "real" || lowerType == "decimal") + { + string[] lenparts = dataLen.Split(new char[] { ',' }); + row["NUMERIC_PRECISION"] = lenparts[0]; + if (lenparts.Length == 2) + row["NUMERIC_SCALE"] = lenparts[1]; + } + } + + public virtual async Task GetIndexesAsync(string[] restrictions, bool execAsync, CancellationToken cancellationToken = default) + { + MySqlSchemaCollection dt = new MySqlSchemaCollection("Indexes"); + dt.AddColumn("INDEX_CATALOG", typeof(string)); + dt.AddColumn("INDEX_SCHEMA", typeof(string)); + dt.AddColumn("INDEX_NAME", typeof(string)); + dt.AddColumn("TABLE_NAME", typeof(string)); + dt.AddColumn("UNIQUE", typeof(bool)); + dt.AddColumn("PRIMARY", typeof(bool)); + dt.AddColumn("TYPE", typeof(string)); + dt.AddColumn("COMMENT", typeof(string)); + + // Get the list of tables first + int max = restrictions?.Length ?? 4; + string[] tableRestrictions = new string[Math.Max(max, 4)]; + restrictions?.CopyTo(tableRestrictions, 0); + tableRestrictions[3] = "BASE TABLE"; + MySqlSchemaCollection tables = await GetTablesAsync(tableRestrictions, execAsync, cancellationToken).ConfigureAwait(false); + + foreach (MySqlSchemaRow table in tables.Rows) + { + string sql = String.Format("SHOW INDEX FROM `{0}`.`{1}`", + MySqlHelper.DoubleQuoteString((string)table["TABLE_SCHEMA"]), + MySqlHelper.DoubleQuoteString((string)table["TABLE_NAME"])); + MySqlSchemaCollection indexes = await QueryCollectionAsync("indexes", sql, execAsync, cancellationToken).ConfigureAwait(false); + + foreach (MySqlSchemaRow index in indexes.Rows) + { + if (!index["SEQ_IN_INDEX"].Equals(Convert.ChangeType(1, index["SEQ_IN_INDEX"].GetType()))) + continue; + if (restrictions != null && restrictions.Length == 4 && + restrictions[3] != null && + !index["KEY_NAME"].Equals(restrictions[3])) continue; + MySqlSchemaRow row = dt.AddRow(); + row["INDEX_CATALOG"] = null; + row["INDEX_SCHEMA"] = table["TABLE_SCHEMA"]; + row["INDEX_NAME"] = index["KEY_NAME"]; + row["TABLE_NAME"] = index["TABLE"]; + row["UNIQUE"] = connection.driver.Version.isAtLeast(8, 0, 1) ? + Convert.ToInt64(index["NON_UNIQUE"]) == 0 : + (long)index["NON_UNIQUE"] == 0; + row["PRIMARY"] = index["KEY_NAME"].Equals("PRIMARY"); + row["TYPE"] = index["INDEX_TYPE"]; + row["COMMENT"] = index["COMMENT"]; + } + } + + return dt; + } + + public virtual async Task GetIndexColumnsAsync(string[] restrictions, bool execAsync, CancellationToken cancellationToken = default) + { + MySqlSchemaCollection dt = new MySqlSchemaCollection("IndexColumns"); + dt.AddColumn("INDEX_CATALOG", typeof(string)); + dt.AddColumn("INDEX_SCHEMA", typeof(string)); + dt.AddColumn("INDEX_NAME", typeof(string)); + dt.AddColumn("TABLE_NAME", typeof(string)); + dt.AddColumn("COLUMN_NAME", typeof(string)); + dt.AddColumn("ORDINAL_POSITION", typeof(int)); + dt.AddColumn("SORT_ORDER", typeof(string)); + + int max = restrictions == null ? 4 : restrictions.Length; + string[] tableRestrictions = new string[Math.Max(max, 4)]; + if (restrictions != null) + restrictions.CopyTo(tableRestrictions, 0); + tableRestrictions[3] = "BASE TABLE"; + MySqlSchemaCollection tables = await GetTablesAsync(tableRestrictions, execAsync, cancellationToken).ConfigureAwait(false); + + foreach (MySqlSchemaRow table in tables.Rows) + { + string sql = String.Format("SHOW INDEX FROM `{0}`.`{1}`", table["TABLE_SCHEMA"], table["TABLE_NAME"]); + using MySqlCommand cmd = new MySqlCommand(sql, connection); + using (MySqlDataReader reader = await cmd.ExecuteReaderAsync(default, execAsync, cancellationToken).ConfigureAwait(false)) + { + while (await reader.ReadAsync(execAsync, cancellationToken).ConfigureAwait(false)) + { + string key_name = GetString(reader, reader.GetOrdinal("KEY_NAME")); + string col_name = GetString(reader, reader.GetOrdinal("COLUMN_NAME")); + + if (restrictions != null) + { + if (restrictions.Length >= 4 && restrictions[3] != null && + key_name != restrictions[3]) continue; + if (restrictions.Length >= 5 && restrictions[4] != null && + col_name != restrictions[4]) continue; + } + MySqlSchemaRow row = dt.AddRow(); + row["INDEX_CATALOG"] = null; + row["INDEX_SCHEMA"] = table["TABLE_SCHEMA"]; + row["INDEX_NAME"] = key_name; + row["TABLE_NAME"] = table["TABLE_NAME"]; + row["COLUMN_NAME"] = col_name; + row["ORDINAL_POSITION"] = reader.GetValue(reader.GetOrdinal("SEQ_IN_INDEX")); + row["SORT_ORDER"] = reader.GetValue(reader.GetOrdinal("COLLATION")); + } + } + } + + return dt; + } + + public virtual async Task GetForeignKeysAsync(string[] restrictions, bool execAsync, CancellationToken cancellationToken = default) + { + MySqlSchemaCollection dt = new MySqlSchemaCollection("Foreign Keys"); + dt.AddColumn("CONSTRAINT_CATALOG", typeof(string)); + dt.AddColumn("CONSTRAINT_SCHEMA", typeof(string)); + dt.AddColumn("CONSTRAINT_NAME", typeof(string)); + dt.AddColumn("TABLE_CATALOG", typeof(string)); + dt.AddColumn("TABLE_SCHEMA", typeof(string)); + dt.AddColumn("TABLE_NAME", typeof(string)); + dt.AddColumn("MATCH_OPTION", typeof(string)); + dt.AddColumn("UPDATE_RULE", typeof(string)); + dt.AddColumn("DELETE_RULE", typeof(string)); + dt.AddColumn("REFERENCED_TABLE_CATALOG", typeof(string)); + dt.AddColumn("REFERENCED_TABLE_SCHEMA", typeof(string)); + dt.AddColumn("REFERENCED_TABLE_NAME", typeof(string)); + + // first we use our restrictions to get a list of tables that should be + // consulted. We save the keyname restriction since GetTables doesn't + // understand that. + string keyName = null; + if (restrictions != null && restrictions.Length >= 4) + { + keyName = restrictions[3]; + restrictions[3] = null; + } + + MySqlSchemaCollection tables = await GetTablesAsync(restrictions, execAsync, cancellationToken).ConfigureAwait(false); + + // now for each table retrieved, we call our helper function to + // parse it's foreign keys + foreach (MySqlSchemaRow table in tables.Rows) + await GetForeignKeysOnTableAsync(dt, table, keyName, false, execAsync, cancellationToken).ConfigureAwait(false); + + return dt; + } + + public virtual async Task GetForeignKeyColumnsAsync(string[] restrictions, bool execAsync, CancellationToken cancellationToken = default) + { + MySqlSchemaCollection dt = new MySqlSchemaCollection("Foreign Keys"); + dt.AddColumn("CONSTRAINT_CATALOG", typeof(string)); + dt.AddColumn("CONSTRAINT_SCHEMA", typeof(string)); + dt.AddColumn("CONSTRAINT_NAME", typeof(string)); + dt.AddColumn("TABLE_CATALOG", typeof(string)); + dt.AddColumn("TABLE_SCHEMA", typeof(string)); + dt.AddColumn("TABLE_NAME", typeof(string)); + dt.AddColumn("COLUMN_NAME", typeof(string)); + dt.AddColumn("ORDINAL_POSITION", typeof(int)); + dt.AddColumn("REFERENCED_TABLE_CATALOG", typeof(string)); + dt.AddColumn("REFERENCED_TABLE_SCHEMA", typeof(string)); + dt.AddColumn("REFERENCED_TABLE_NAME", typeof(string)); + dt.AddColumn("REFERENCED_COLUMN_NAME", typeof(string)); + + // first we use our restrictions to get a list of tables that should be + // consulted. We save the keyname restriction since GetTables doesn't + // understand that. + string keyName = null; + if (restrictions != null && restrictions.Length >= 4) + { + keyName = restrictions[3]; + restrictions[3] = null; + } + + MySqlSchemaCollection tables = await GetTablesAsync(restrictions, execAsync, cancellationToken).ConfigureAwait(false); + + // now for each table retrieved, we call our helper function to + // parse it's foreign keys + foreach (MySqlSchemaRow table in tables.Rows) + await GetForeignKeysOnTableAsync(dt, table, keyName, true, execAsync, cancellationToken).ConfigureAwait(false); + return dt; + } + + + private async Task GetSqlModeAsync(bool execAsync, CancellationToken cancellationToken = default) + { + using MySqlCommand cmd = new MySqlCommand("SELECT @@SQL_MODE", connection); + var result = await cmd.ExecuteScalarAsync(execAsync, cancellationToken).ConfigureAwait(false); + return result.ToString(); + } + + #region Foreign Key routines + + /// + /// GetForeignKeysOnTable retrieves the foreign keys on the given table. + /// Since MySQL supports foreign keys on versions prior to 5.0, we can't use + /// information schema. MySQL also does not include any type of SHOW command + /// for foreign keys so we have to resort to use SHOW CREATE TABLE and parsing + /// the output. + /// + /// The table to store the key info in. + /// The table to get the foeign key info for. + /// Only get foreign keys that match this name. + /// Should column information be included in the table. + /// Boolean that indicates if the function will be executed asynchronously. + /// The cancellation token. + private async Task GetForeignKeysOnTableAsync(MySqlSchemaCollection fkTable, MySqlSchemaRow tableToParse, + string filterName, bool includeColumns, bool execAsync, CancellationToken cancellationToken = default) + { + string sqlMode = await GetSqlModeAsync(execAsync, cancellationToken).ConfigureAwait(false); + + if (filterName != null) + filterName = StringUtility.ToLowerInvariant(filterName); + + string sql = string.Format("SHOW CREATE TABLE `{0}`.`{1}`", tableToParse["TABLE_SCHEMA"], tableToParse["TABLE_NAME"]); + string lowerBody = null, body = null; + using MySqlCommand cmd = new MySqlCommand(sql, connection); + using (MySqlDataReader reader = await cmd.ExecuteReaderAsync(default, execAsync, cancellationToken).ConfigureAwait(false)) + { + await reader.ReadAsync(execAsync, cancellationToken).ConfigureAwait(false); + body = reader.GetString(1); + lowerBody = StringUtility.ToLowerInvariant(body); + } + + MySqlTokenizer tokenizer = new MySqlTokenizer(lowerBody); + tokenizer.AnsiQuotes = sqlMode.IndexOf("ANSI_QUOTES") != -1; + tokenizer.BackslashEscapes = sqlMode.IndexOf("NO_BACKSLASH_ESCAPES") != -1; + + while (true) + { + string token = tokenizer.NextToken(); + // look for a starting contraint + while (token != null && (token != "constraint" || tokenizer.Quoted)) + token = tokenizer.NextToken(); + if (token == null) break; + + ParseConstraint(fkTable, tableToParse, tokenizer, includeColumns); + } + } + + private static void ParseConstraint(MySqlSchemaCollection fkTable, MySqlSchemaRow table, + MySqlTokenizer tokenizer, bool includeColumns) + { + string name = tokenizer.NextToken(); + MySqlSchemaRow row = fkTable.AddRow(); + + // make sure this constraint is a FK + string token = tokenizer.NextToken(); + if (token != "foreign" || tokenizer.Quoted) + return; + tokenizer.NextToken(); // read off the 'KEY' symbol + tokenizer.NextToken(); // read off the '(' symbol + + row["CONSTRAINT_CATALOG"] = table["TABLE_CATALOG"]; + row["CONSTRAINT_SCHEMA"] = table["TABLE_SCHEMA"]; + row["TABLE_CATALOG"] = table["TABLE_CATALOG"]; + row["TABLE_SCHEMA"] = table["TABLE_SCHEMA"]; + row["TABLE_NAME"] = table["TABLE_NAME"]; + row["REFERENCED_TABLE_CATALOG"] = null; + row["CONSTRAINT_NAME"] = name.Trim(new char[] { '\'', '`' }); + + List srcColumns = includeColumns ? ParseColumns(tokenizer) : null; + + // now look for the references section + while (token != "references" || tokenizer.Quoted) + token = tokenizer.NextToken(); + string target1 = tokenizer.NextToken(); + string target2 = tokenizer.NextToken(); + if (target2.StartsWith(".", StringComparison.Ordinal)) + { + row["REFERENCED_TABLE_SCHEMA"] = target1; + row["REFERENCED_TABLE_NAME"] = target2.Substring(1).Trim(new char[] { '\'', '`' }); + tokenizer.NextToken(); // read off the '(' + } + else + { + row["REFERENCED_TABLE_SCHEMA"] = table["TABLE_SCHEMA"]; + row["REFERENCED_TABLE_NAME"] = target1.Substring(1).Trim(new char[] { '\'', '`' }); ; + } + + // if we are supposed to include columns, read the target columns + List targetColumns = includeColumns ? ParseColumns(tokenizer) : null; + + if (includeColumns) + ProcessColumns(fkTable, row, srcColumns, targetColumns); + else + fkTable.Rows.Add(row); + } + + private static List ParseColumns(MySqlTokenizer tokenizer) + { + List sc = new List(); + string token = tokenizer.NextToken(); + while (token != ")") + { + if (token != ",") + sc.Add(token); + token = tokenizer.NextToken(); + } + return sc; + } + + private static void ProcessColumns(MySqlSchemaCollection fkTable, MySqlSchemaRow row, List srcColumns, List targetColumns) + { + for (int i = 0; i < srcColumns.Count; i++) + { + MySqlSchemaRow newRow = fkTable.AddRow(); + row.CopyRow(newRow); + newRow["COLUMN_NAME"] = srcColumns[i]; + newRow["ORDINAL_POSITION"] = i; + newRow["REFERENCED_COLUMN_NAME"] = targetColumns[i]; + fkTable.Rows.Add(newRow); + } + } + + #endregion + + public async Task GetUsersAsync(string[] restrictions, bool execAsync, CancellationToken cancellationToken = default) + { + StringBuilder sb = new StringBuilder("SELECT Host, User FROM mysql.user"); + if (restrictions != null && restrictions.Length > 0) + sb.AppendFormat(CultureInfo.InvariantCulture, " WHERE User LIKE '{0}'", restrictions[0]); + + MySqlSchemaCollection c = await QueryCollectionAsync("Users", sb.ToString(), execAsync, cancellationToken).ConfigureAwait(false); + c.Columns[0].Name = "HOST"; + c.Columns[1].Name = "USERNAME"; + + return c; + } + + protected virtual MySqlSchemaCollection GetCollections() + { + object[][] collections = { + new object[] {"MetaDataCollections", 0, 0}, + new object[] {"DataSourceInformation", 0, 0}, + new object[] {"DataTypes", 0, 0}, + new object[] {"Restrictions", 0, 0}, + new object[] {"ReservedWords", 0, 0}, + new object[] {"Databases", 1, 1}, + new object[] {"Tables", 4, 2}, + new object[] {"Columns", 4, 4}, + new object[] {"Users", 1, 1}, + new object[] {"Foreign Keys", 4, 3}, + new object[] {"IndexColumns", 5, 4}, + new object[] {"Indexes", 4, 3}, + new object[] {"Foreign Key Columns", 4, 3}, + new object[] {"UDF", 1, 1} + }; + + MySqlSchemaCollection dt = new MySqlSchemaCollection("MetaDataCollections"); + dt.AddColumn("CollectionName", typeof(string)); + dt.AddColumn("NumberOfRestrictions", typeof(int)); + dt.AddColumn("NumberOfIdentifierParts", typeof(int)); + + FillTable(dt, collections); + + return dt; + } + + private MySqlSchemaCollection GetDataSourceInformation() + { + MySqlSchemaCollection dt = new MySqlSchemaCollection("DataSourceInformation"); + dt.AddColumn("CompositeIdentifierSeparatorPattern", typeof(string)); + dt.AddColumn("DataSourceProductName", typeof(string)); + dt.AddColumn("DataSourceProductVersion", typeof(string)); + dt.AddColumn("DataSourceProductVersionNormalized", typeof(string)); + dt.AddColumn("GroupByBehavior", typeof(GroupByBehavior)); + dt.AddColumn("IdentifierPattern", typeof(string)); + dt.AddColumn("IdentifierCase", typeof(IdentifierCase)); + dt.AddColumn("OrderByColumnsInSelect", typeof(bool)); + dt.AddColumn("ParameterMarkerFormat", typeof(string)); + dt.AddColumn("ParameterMarkerPattern", typeof(string)); + dt.AddColumn("ParameterNameMaxLength", typeof(int)); + dt.AddColumn("ParameterNamePattern", typeof(string)); + dt.AddColumn("QuotedIdentifierPattern", typeof(string)); + dt.AddColumn("QuotedIdentifierCase", typeof(IdentifierCase)); + dt.AddColumn("StatementSeparatorPattern", typeof(string)); + dt.AddColumn("StringLiteralPattern", typeof(string)); + dt.AddColumn("SupportedJoinOperators", typeof(SupportedJoinOperators)); + + DBVersion v = connection.driver.Version; + string ver = $"{v.Major:0}.{v.Minor:0}.{v.Build:0}"; + + MySqlSchemaRow row = dt.AddRow(); + row["CompositeIdentifierSeparatorPattern"] = "\\."; + row["DataSourceProductName"] = "MySQL"; + row["DataSourceProductVersion"] = connection.ServerVersion; + row["DataSourceProductVersionNormalized"] = ver; + row["GroupByBehavior"] = GroupByBehavior.Unrelated; + row["IdentifierPattern"] = + @"(^\`\p{Lo}\p{Lu}\p{Ll}_@#][\p{Lo}\p{Lu}\p{Ll}\p{Nd}@$#_]*$)|(^\`[^\`\0]|\`\`+\`$)|(^\"" + [^\""\0]|\""\""+\""$)"; + row["IdentifierCase"] = IdentifierCase.Insensitive; + row["OrderByColumnsInSelect"] = false; + row["ParameterMarkerFormat"] = "{0}"; + row["ParameterMarkerPattern"] = "(@[A-Za-z0-9_$#]*)"; + row["ParameterNameMaxLength"] = 128; + row["ParameterNamePattern"] = + @"^[\p{Lo}\p{Lu}\p{Ll}\p{Lm}_@#][\p{Lo}\p{Lu}\p{Ll}\p{Lm}\p{Nd}\uff3f_@#\$]*(?=\s+|$)"; + row["QuotedIdentifierPattern"] = @"(([^\`]|\`\`)*)"; + row["QuotedIdentifierCase"] = IdentifierCase.Sensitive; + row["StatementSeparatorPattern"] = ";"; + row["StringLiteralPattern"] = "'(([^']|'')*)'"; + row["SupportedJoinOperators"] = 15; + dt.Rows.Add(row); + + return dt; + } + + private static MySqlSchemaCollection GetDataTypes() + { + MySqlSchemaCollection dt = new MySqlSchemaCollection("DataTypes"); + dt.AddColumn("TypeName", typeof(string)); + dt.AddColumn("ProviderDbType", typeof(int)); + dt.AddColumn("ColumnSize", typeof(long)); + dt.AddColumn("CreateFormat", typeof(string)); + dt.AddColumn("CreateParameters", typeof(string)); + dt.AddColumn("DataType", typeof(string)); + dt.AddColumn("IsAutoincrementable", typeof(bool)); + dt.AddColumn("IsBestMatch", typeof(bool)); + dt.AddColumn("IsCaseSensitive", typeof(bool)); + dt.AddColumn("IsFixedLength", typeof(bool)); + dt.AddColumn("IsFixedPrecisionScale", typeof(bool)); + dt.AddColumn("IsLong", typeof(bool)); + dt.AddColumn("IsNullable", typeof(bool)); + dt.AddColumn("IsSearchable", typeof(bool)); + dt.AddColumn("IsSearchableWithLike", typeof(bool)); + dt.AddColumn("IsUnsigned", typeof(bool)); + dt.AddColumn("MaximumScale", typeof(short)); + dt.AddColumn("MinimumScale", typeof(short)); + dt.AddColumn("IsConcurrencyType", typeof(bool)); + dt.AddColumn("IsLiteralSupported", typeof(bool)); + dt.AddColumn("LiteralPrefix", typeof(string)); + dt.AddColumn("LiteralSuffix", typeof(string)); + dt.AddColumn("NativeDataType", typeof(string)); + + // have each one of the types contribute to the datatypes collection + MySqlBit.SetDSInfo(dt); + MySqlBinary.SetDSInfo(dt); + MySqlDateTime.SetDSInfo(dt); + MySqlTimeSpan.SetDSInfo(dt); + MySqlString.SetDSInfo(dt); + MySqlDouble.SetDSInfo(dt); + MySqlSingle.SetDSInfo(dt); + MySqlByte.SetDSInfo(dt); + MySqlInt16.SetDSInfo(dt); + MySqlInt32.SetDSInfo(dt); + MySqlInt64.SetDSInfo(dt); + MySqlDecimal.SetDSInfo(dt); + MySqlUByte.SetDSInfo(dt); + MySqlUInt16.SetDSInfo(dt); + MySqlUInt32.SetDSInfo(dt); + MySqlUInt64.SetDSInfo(dt); + + return dt; + } + + protected virtual MySqlSchemaCollection GetRestrictions() + { + object[][] restrictions = { + new object[] {"Users", "Name", "", 0}, + new object[] {"Databases", "Name", "", 0}, + new object[] {"Tables", "Database", "", 0}, + new object[] {"Tables", "Schema", "", 1}, + new object[] {"Tables", "Table", "", 2}, + new object[] {"Tables", "TableType", "", 3}, + new object[] {"Columns", "Database", "", 0}, + new object[] {"Columns", "Schema", "", 1}, + new object[] {"Columns", "Table", "", 2}, + new object[] {"Columns", "Column", "", 3}, + new object[] {"Indexes", "Database", "", 0}, + new object[] {"Indexes", "Schema", "", 1}, + new object[] {"Indexes", "Table", "", 2}, + new object[] {"Indexes", "Name", "", 3}, + new object[] {"IndexColumns", "Database", "", 0}, + new object[] {"IndexColumns", "Schema", "", 1}, + new object[] {"IndexColumns", "Table", "", 2}, + new object[] {"IndexColumns", "ConstraintName", "", 3}, + new object[] {"IndexColumns", "Column", "", 4}, + new object[] {"Foreign Keys", "Database", "", 0}, + new object[] {"Foreign Keys", "Schema", "", 1}, + new object[] {"Foreign Keys", "Table", "", 2}, + new object[] {"Foreign Keys", "Constraint Name", "", 3}, + new object[] {"Foreign Key Columns", "Catalog", "", 0}, + new object[] {"Foreign Key Columns", "Schema", "", 1}, + new object[] {"Foreign Key Columns", "Table", "", 2}, + new object[] {"Foreign Key Columns", "Constraint Name", "", 3}, + new object[] {"UDF", "Name", "", 0} + }; + + MySqlSchemaCollection dt = new MySqlSchemaCollection("Restrictions"); + dt.AddColumn("CollectionName", typeof(string)); + dt.AddColumn("RestrictionName", typeof(string)); + dt.AddColumn("RestrictionDefault", typeof(string)); + dt.AddColumn("RestrictionNumber", typeof(int)); + + FillTable(dt, restrictions); + + return dt; + } + + internal static MySqlSchemaCollection GetReservedWords() + { + MySqlSchemaCollection dt = new MySqlSchemaCollection("ReservedWords"); + string resourceName = "MySql.Data.Properties.ReservedWords.txt"; + dt.AddColumn(DbMetaDataColumnNames.ReservedWord, typeof(string)); + using (Stream str = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) + { + if (str == null) + throw new Exception($"Resource {resourceName} not found in {Assembly.GetExecutingAssembly()}."); + + using (StreamReader sr = new StreamReader(str)) + { + string line = sr.ReadLine(); + while (line != null) + { + string[] keywords = line.Split(new char[] { ' ' }); + foreach (string s in keywords) + { + if (String.IsNullOrEmpty(s)) continue; + MySqlSchemaRow row = dt.AddRow(); + row[0] = s; + } + + line = sr.ReadLine(); + } + } + } + + return dt; + } + + protected static void FillTable(MySqlSchemaCollection dt, object[][] data) + { + foreach (object[] dataItem in data) + { + MySqlSchemaRow row = dt.AddRow(); + for (int i = 0; i < dataItem.Length; i++) + row[i] = dataItem[i]; + } + } + + private async Task FindTablesAsync(MySqlSchemaCollection schema, string[] restrictions, bool execAsync, CancellationToken cancellationToken = default) + { + StringBuilder sql = new StringBuilder(); + StringBuilder where = new StringBuilder(); + sql.AppendFormat(CultureInfo.InvariantCulture, "SHOW TABLE STATUS FROM `{0}`", restrictions[1]); + + if (restrictions != null && restrictions.Length >= 3 && restrictions[2] != null) + where.AppendFormat(CultureInfo.InvariantCulture, " LIKE '{0}'", restrictions[2]); + + sql.Append(where.ToString()); + string table_type = restrictions[1].ToLower() == "information_schema" ? "SYSTEM VIEW" : "BASE TABLE"; + using MySqlCommand cmd = new MySqlCommand(sql.ToString(), connection); + + using (MySqlDataReader reader = await cmd.ExecuteReaderAsync(default, execAsync, cancellationToken).ConfigureAwait(false)) + { + while (await reader.ReadAsync(execAsync, cancellationToken).ConfigureAwait(false)) + { + MySqlSchemaRow row = schema.AddRow(); + row["TABLE_CATALOG"] = null; + row["TABLE_SCHEMA"] = restrictions[1]; + row["TABLE_NAME"] = reader.GetString(0); + row["TABLE_TYPE"] = table_type; + row["ENGINE"] = GetString(reader, 1); + row["VERSION"] = reader.GetValue(2); + row["ROW_FORMAT"] = GetString(reader, 3); + row["TABLE_ROWS"] = reader.GetValue(4); + row["AVG_ROW_LENGTH"] = reader.GetValue(5); + row["DATA_LENGTH"] = reader.GetValue(6); + row["MAX_DATA_LENGTH"] = reader.GetValue(7); + row["INDEX_LENGTH"] = reader.GetValue(8); + row["DATA_FREE"] = reader.GetValue(9); + row["AUTO_INCREMENT"] = reader.GetValue(10); + row["CREATE_TIME"] = reader.GetValue(11); + row["UPDATE_TIME"] = reader.GetValue(12); + row["CHECK_TIME"] = reader.GetValue(13); + row["TABLE_COLLATION"] = GetString(reader, 14); + row["CHECKSUM"] = reader.GetValue(15); + row["CREATE_OPTIONS"] = GetString(reader, 16); + row["TABLE_COMMENT"] = GetString(reader, 17); + } + } + } + + private static string GetString(MySqlDataReader reader, int index) + { + if (reader.IsDBNull(index)) + return null; + return reader.GetString(index); + } + + public async Task GetUDFAsync(string[] restrictions, bool execAsync, CancellationToken cancellationToken = default) + { + string sql = "SELECT name,ret,dl FROM mysql.func"; + if (restrictions?.Length >= 1 && !String.IsNullOrEmpty(restrictions[0])) + sql += $" WHERE name LIKE '{restrictions[0]}'"; + + MySqlSchemaCollection dt = new MySqlSchemaCollection("User-defined Functions"); + dt.AddColumn("NAME", typeof(string)); + dt.AddColumn("RETURN_TYPE", typeof(int)); + dt.AddColumn("LIBRARY_NAME", typeof(string)); + + using MySqlCommand cmd = new MySqlCommand(sql, connection); + + try + { + using (MySqlDataReader reader = await cmd.ExecuteReaderAsync(default, execAsync, cancellationToken).ConfigureAwait(false)) + { + while (await reader.ReadAsync(execAsync, cancellationToken).ConfigureAwait(false)) + { + MySqlSchemaRow row = dt.AddRow(); + row[0] = reader.GetString(0); + row[1] = reader.GetInt32(1); + row[2] = reader.GetString(2); + } + } + } + catch (MySqlException ex) + { + if (ex.Number != (int)MySqlErrorCode.TableAccessDenied) + throw; + throw new MySqlException(Resources.UnableToEnumerateUDF, ex); + } + + return dt; + } + + protected virtual async Task GetSchemaInternalAsync(string collection, string[] restrictions, bool execAsync, CancellationToken cancellationToken = default) + { + switch (collection) + { + // common collections + case "METADATACOLLECTIONS": + return GetCollections(); + case "DATASOURCEINFORMATION": + return GetDataSourceInformation(); + case "DATATYPES": + return GetDataTypes(); + case "RESTRICTIONS": + return GetRestrictions(); + case "RESERVEDWORDS": + return GetReservedWords(); + + // collections specific to our provider + case "USERS": + return await GetUsersAsync(restrictions, execAsync, cancellationToken).ConfigureAwait(false); + case "DATABASES": + return await GetDatabasesAsync(restrictions, execAsync, cancellationToken).ConfigureAwait(false); + case "UDF": + return await GetUDFAsync(restrictions, execAsync, cancellationToken).ConfigureAwait(false); + } + + // if we have a current database and our users have + // not specified a database, then default to the currently + // selected one. + if (restrictions == null) + restrictions = new string[2]; + if (connection != null && + connection.Database != null && + connection.Database.Length > 0 && + restrictions.Length > 1 && + restrictions[1] == null) + restrictions[1] = connection.Database; + + switch (collection) + { + case "TABLES": + return await GetTablesAsync(restrictions, execAsync, cancellationToken).ConfigureAwait(false); + case "COLUMNS": + return await GetColumnsAsync(restrictions, execAsync, cancellationToken).ConfigureAwait(false); + case "INDEXES": + return await GetIndexesAsync(restrictions, execAsync, cancellationToken).ConfigureAwait(false); + case "INDEXCOLUMNS": + return await GetIndexColumnsAsync(restrictions, execAsync, cancellationToken).ConfigureAwait(false); + case "FOREIGN KEYS": + return await GetForeignKeysAsync(restrictions, execAsync, cancellationToken).ConfigureAwait(false); + case "FOREIGN KEY COLUMNS": + return await GetForeignKeyColumnsAsync(restrictions, execAsync, cancellationToken).ConfigureAwait(false); + } + return null; + } + + internal string[] CleanRestrictions(string[] restrictionValues) + { + string[] restrictions = null; + if (restrictionValues != null) + { + restrictions = (string[])restrictionValues.Clone(); + + for (int x = 0; x < restrictions.Length; x++) + { + string s = restrictions[x]; + if (s == null) continue; + restrictions[x] = s.Trim('`'); + } + } + return restrictions; + } + + protected async Task QueryCollectionAsync(string name, string sql, bool execAsync, CancellationToken cancellationToken = default) + { + MySqlSchemaCollection c = new MySqlSchemaCollection(name); + using MySqlCommand cmd = new MySqlCommand(sql, connection); + using MySqlDataReader reader = await cmd.ExecuteReaderAsync(default, execAsync, cancellationToken).ConfigureAwait(false); + + for (int i = 0; i < reader.FieldCount; i++) + c.AddColumn(reader.GetName(i), reader.GetFieldType(i)); + + using (reader) + { + while (await reader.ReadAsync(execAsync, cancellationToken).ConfigureAwait(false)) + { + MySqlSchemaRow row = c.AddRow(); + for (int i = 0; i < reader.FieldCount; i++) + row[i] = reader.GetValue(i); + } + } + return c; + } + } +} diff --git a/MySQL.Data/src/Statement.cs b/MySQL.Data/src/Statement.cs new file mode 100644 index 000000000..2b3c81d54 --- /dev/null +++ b/MySQL.Data/src/Statement.cs @@ -0,0 +1,356 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + internal abstract class Statement + { + protected MySqlCommand command; + private readonly List _buffers; + protected string commandText; + protected int paramsPosition; + + internal const string ParameterPrefix = "_cnet_param_"; + public virtual bool ServerProvidingOutputParameters { get; internal set; } + + private Statement(MySqlCommand cmd) + { + command = cmd; + _buffers = new List(); + } + + protected Statement(MySqlCommand cmd, string text) + : this(cmd) + { + commandText = text; + } + + #region Properties + + public virtual string ResolvedCommandText + { + get { return commandText; } + } + + protected Driver Driver => command.Connection.driver; + + protected MySqlConnection Connection => command.Connection; + + protected MySqlParameterCollection Parameters => command.Parameters; + + protected MySqlAttributeCollection Attributes => command.Attributes; + + #endregion + + public virtual void Close(MySqlDataReader reader) { } + + public virtual void Resolve(bool preparing) + { + if (!command.InternallyCreated || !(ResolvedCommandText != null && Parameters.Count == 0)) + { + ServerProvidingOutputParameters = Driver.SupportsOutputParameters && preparing; + if (Parameters.Cast().Where(x => x.Direction == ParameterDirection.Output).Any()) + { + string setSql = SetSql(Parameters, preparing); + string outSql = CreateOutputSelect(Parameters, preparing); + commandText = String.Format("{0}{1}", setSql, outSql); + } + } + } + + private string SetSql(MySqlParameterCollection parms, bool preparing) + { + StringBuilder setSql = new StringBuilder(); + setSql.Append(commandText); + foreach (MySqlParameter p in parms) + { + if (p.Direction != ParameterDirection.Output) continue; + + string uName = "@" + ParameterPrefix + p.BaseName; + setSql.Replace(p.ParameterName, uName); + } + return setSql.ToString(); + } + + private string CreateOutputSelect(MySqlParameterCollection parms, bool preparing) + { + StringBuilder outputSql = new StringBuilder(); + string delimiter = string.Empty; + + foreach (MySqlParameter p in parms) + { + if (p.Direction == ParameterDirection.Output) + { + string uName = "@" + ParameterPrefix + p.BaseName; + outputSql.AppendFormat(CultureInfo.InvariantCulture, "{0}{1}", delimiter, uName); + delimiter = ", "; + } + } + + if (outputSql.Length == 0) return String.Empty; + + else if (command.Connection.Settings.AllowBatch && !preparing) + return String.Format("; SELECT {0}", outputSql.ToString()); + else + { + command.OutSql = String.Format("SELECT {0}", outputSql.ToString()); + return String.Empty; + } + } + + public virtual async Task ExecuteAsync(bool execAsync) + { + // we keep a reference to this until we are done + await BindParametersAsync(execAsync).ConfigureAwait(false); + await ExecuteNextAsync(execAsync).ConfigureAwait(false); + } + + public virtual async Task ExecuteNextAsync(bool execAsync) + { + if (_buffers.Count == 0) + return false; + + MySqlPacket packet = _buffers[0]; + await Driver.SendQueryAsync(packet, paramsPosition, execAsync).ConfigureAwait(false); + _buffers.RemoveAt(0); + return true; + } + + protected async Task BindParametersAsync(bool execAsync) + { + MySqlParameterCollection parameters = command.Parameters; + MySqlAttributeCollection attributes = command.Attributes; + int index = 0; + + while (true) + { + MySqlPacket packet = await BuildQueryAttributesPacketAsync(attributes, execAsync).ConfigureAwait(false); + await InternalBindParametersAsync(ResolvedCommandText, parameters, packet, execAsync).ConfigureAwait(false); + + // if we are not batching, then we are done. This is only really relevant the + // first time through + if (command.Batch == null) return; + while (index < command.Batch.Count) + { + MySqlCommand batchedCmd = command.Batch[index++]; + packet = (MySqlPacket)_buffers[_buffers.Count - 1]; + + // now we make a guess if this statement will fit in our current stream + long estimatedCmdSize = batchedCmd.EstimatedSize(); + if (((packet.Length - 4) + estimatedCmdSize) > Connection.driver.MaxPacketSize) + // it won't, so we raise an exception to avoid a partial batch + throw new MySqlException(Resources.QueryTooLarge, (int)MySqlErrorCode.PacketTooLarge); + + // looks like we might have room for it so we remember the current end of the stream + _buffers.RemoveAt(_buffers.Count - 1); + //long originalLength = packet.Length - 4; + + // and attempt to stream the next command + string text = ""; + if (Connection.driver.Settings.RewriteBatchedStatements) + text = batchedCmd.BatchableCommandText; + else + text = ResolvedCommandText; + + if (text.StartsWith("(", StringComparison.Ordinal)) + await packet.WriteStringNoNullAsync(", ", execAsync).ConfigureAwait(false); + else + await packet.WriteStringNoNullAsync("; ", execAsync).ConfigureAwait(false); + + await InternalBindParametersAsync(text, batchedCmd.Parameters, packet, execAsync).ConfigureAwait(false); + if ((packet.Length - 4) > Connection.driver.MaxPacketSize) + { + //TODO + //stream.InternalBuffer.SetLength(originalLength); + parameters = batchedCmd.Parameters; + break; + } + } + if (index == command.Batch.Count) + return; + } + } + + /// + /// Builds the initial part of the COM_QUERY packet + /// + /// Collection of attributes + /// A + /// Boolean that indicates if the function will be executed asynchronously. + private async Task BuildQueryAttributesPacketAsync(MySqlAttributeCollection attributes, bool execAsync) + { + MySqlPacket packet; + packet = new MySqlPacket(Driver.Encoding) { Version = Driver.Version }; + packet.WriteByte(0); + + if (attributes.Count > 0 && !Driver.SupportsQueryAttributes) + MySqlTrace.LogWarning(Connection.ServerThread, string.Format(Resources.QueryAttributesNotSupported, Driver.Version)); + else if (Driver.SupportsQueryAttributes) + { + int paramCount = attributes.Count; + await packet.WriteLengthAsync(paramCount, execAsync).ConfigureAwait(false); // int parameter_count - Number of parameters + packet.WriteByte(1); // int parameter_set_count - Number of parameter sets. Currently always 1 + + if (paramCount > 0) + { + // now prepare our null map + BitArray _nullMap = new BitArray(paramCount); + int numNullBytes = (_nullMap.Length + 7) / 8; + int _nullMapPosition = packet.Position; + packet.Position += numNullBytes; // leave room for our null map + packet.WriteByte((byte)1); // new_params_bind_flag - Always 1. Malformed packet error if not 1 + + // set type and name for each attribute + foreach (MySqlAttribute attribute in attributes) + { + await packet.WriteIntegerAsync(attribute.GetPSType(), 2, execAsync).ConfigureAwait(false); + await packet.WriteLenStringAsync(attribute.AttributeName, execAsync).ConfigureAwait(false); + } + + // set value for each attribute + for (int i = 0; i < attributes.Count; i++) + { + MySqlAttribute attr = attributes[i]; + _nullMap[i] = (attr.Value == DBNull.Value || attr.Value == null); + if (_nullMap[i]) continue; + await attr.SerializeAsync(packet, true, Connection.Settings, execAsync).ConfigureAwait(false); + } + + byte[] tempByteArray = new byte[(_nullMap.Length + 7) >> 3]; + _nullMap.CopyTo(tempByteArray, 0); + + Array.Copy(tempByteArray, 0, packet.Buffer, _nullMapPosition, tempByteArray.Length); + } + } + + paramsPosition = packet.Position; + return packet; + } + + private async Task InternalBindParametersAsync(string sql, MySqlParameterCollection parameters, MySqlPacket packet, bool execAsync) + { + bool sqlServerMode = command.Connection.Settings.SqlServerMode; + + MySqlTokenizer tokenizer = new MySqlTokenizer(sql) + { + ReturnComments = true, + SqlServerMode = sqlServerMode + }; + + int pos = 0; + string token = tokenizer.NextToken(); + int parameterCount = 0; + while (token != null) + { + // serialize everything that came before the token (i.e. whitespace) + await packet.WriteStringNoNullAsync(sql.Substring(pos, tokenizer.StartIndex - pos), execAsync).ConfigureAwait(false); + pos = tokenizer.StopIndex; + + if (MySqlTokenizer.IsParameter(token)) + { + if ((!parameters.containsUnnamedParameters && token.Length == 1 && parameterCount > 0) || parameters.containsUnnamedParameters && token.Length > 1) + throw new MySqlException(Resources.MixedParameterNamingNotAllowed); + + parameters.containsUnnamedParameters = token.Length == 1; + if (await SerializeParameterAsync(parameters, packet, token, parameterCount, execAsync).ConfigureAwait(false)) + token = null; + parameterCount++; + } + + if (token != null) + { + if (sqlServerMode && tokenizer.Quoted && token.StartsWith("[", StringComparison.Ordinal)) + token = String.Format("`{0}`", token.Substring(1, token.Length - 2)); + + await packet.WriteStringNoNullAsync(token, execAsync).ConfigureAwait(false); + } + token = tokenizer.NextToken(); + } + _buffers.Add(packet); + } + + protected virtual bool ShouldIgnoreMissingParameter(string parameterName) + { + if (Connection.Settings.AllowUserVariables) + return true; + if (parameterName.StartsWith("@" + StoredProcedure.ParameterPrefix, StringComparison.OrdinalIgnoreCase)) + return true; + if (parameterName.Length > 1 && + (parameterName[1] == '`' || parameterName[1] == '\'')) + return true; + return false; + } + + /// + /// Serializes the given parameter to the given memory stream + /// + /// + /// This method is called by PrepareSqlBuffers to convert the given + /// parameter to bytes and write those bytes to the given memory stream. + /// + /// + /// True if the parameter was successfully serialized, false otherwise. + private async Task SerializeParameterAsync(MySqlParameterCollection parameters, MySqlPacket packet, string parmName, int parameterIndex, bool execAsync) + { + MySqlParameter parameter = null; + + if (!parameters.containsUnnamedParameters) + parameter = parameters.GetParameterFlexible(parmName, false); + else + { + if (parameterIndex <= parameters.Count) + parameter = parameters[parameterIndex]; + else + throw new MySqlException(Resources.ParameterIndexNotFound); + } + + if (parameter == null) + { + // if we are allowing user variables and the parameter name starts with @ + // then we can't throw an exception + if (parmName.StartsWith("@", StringComparison.Ordinal) && ShouldIgnoreMissingParameter(parmName)) + return false; + throw new MySqlException( + String.Format(Resources.ParameterMustBeDefined, parmName)); + } + + await parameter.SerializeAsync(packet, false, Connection.Settings, execAsync).ConfigureAwait(false); + return true; + } + } +} diff --git a/MySQL.Data/src/StoredProcedure.cs b/MySQL.Data/src/StoredProcedure.cs new file mode 100644 index 000000000..4a7cc52bc --- /dev/null +++ b/MySQL.Data/src/StoredProcedure.cs @@ -0,0 +1,377 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using MySql.Data.Types; +using System; +using System.Data; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + /// + /// Summary description for StoredProcedure. + /// + internal class StoredProcedure : PreparableStatement + { + private string _outSelect; + private string resolvedCommandText; + + public StoredProcedure(MySqlCommand cmd, string text) + : base(cmd, text) + { + } + + private MySqlParameter GetReturnParameter() + { + return Parameters?.Cast().FirstOrDefault(p => p.Direction == ParameterDirection.ReturnValue); + } + + public override string ResolvedCommandText + { + get { return resolvedCommandText; } + } + + internal string GetCacheKey(string spName) + { + string retValue = String.Empty; + StringBuilder key = new StringBuilder(spName); + key.Append("("); + string delimiter = ""; + foreach (MySqlParameter p in command.Parameters) + { + if (p.Direction == ParameterDirection.ReturnValue) + retValue = "?="; + else + { + key.AppendFormat(CultureInfo.InvariantCulture, "{0}?", delimiter); + delimiter = ","; + } + } + key.Append(")"); + return retValue + key.ToString(); + } + + private async Task GetParametersAsync(string procName, bool execAsync) + { + string procCacheKey = GetCacheKey(procName); + ProcedureCacheEntry entry = await Connection.ProcedureCache.GetProcedureAsync(Connection, procName, procCacheKey, execAsync).ConfigureAwait(false); + return entry; + } + + public static string GetFlags(string dtd) + { + int x = dtd.Length - 1; + while (x > 0 && (Char.IsLetterOrDigit(dtd[x]) || dtd[x] == ' ')) + x--; + string dtdSubstring = dtd.Substring(x); + return StringUtility.ToUpperInvariant(dtdSubstring); + } + + internal static string FixProcedureName(string spName) + { + if (IsSyntacticallyCorrect(spName)) return spName; + + return $"`{spName.Replace("`", "``")}`"; + } + + /// + /// Verify if the string passed as argument is syntactically correct. + /// + /// String to be analyzed + /// true if is correct; otherwise, false. + internal static bool IsSyntacticallyCorrect(string spName) + { + const char backtick = '`', dot = '.'; + + char[] spNameArray = spName.ToArray(); + bool quoted = spName.StartsWith("`"); + bool splittingDot = false; + + for (int i = 1; i < spNameArray.Length; i++) + { + if (spNameArray[i] == backtick) + { + // We are in quoted mode. + if (quoted) + { + // we are not in the last char of the string. + if (i < spNameArray.Length - 1) + { + // Get the next char. + char nextChar = spNameArray[i + 1]; + + // If the next char are neither a dot nor a backtick, + // it means the input string is not well quoted and exits the loop. + if (nextChar != dot && nextChar != backtick) + return false; + + // If the next char is a backtick, move forward 2 positions. + if (nextChar == backtick) + i++; + + // If the next char is a dot, that means we are not in quoted mode anymore. + if (nextChar == dot) + { + quoted = false; + splittingDot = true; + i++; + } + } + } + // Not quoted mode + else + { + // If the previous char is not a dot or the string does not end with a backtick, + // it means the input string is not well quoted and exits the loop; + // otherwise, enter quoted mode. + if (spNameArray[i - 1] != dot || !spName.EndsWith("`")) + return false; + + quoted = true; + } + } + else if (spNameArray[i] == dot && !quoted) + if (splittingDot) + return false; + else + splittingDot = true; + } + + // If we reach to the very last char of the string, it means the string is well written. + return true; + } + + private MySqlParameter GetAndFixParameter(string spName, MySqlSchemaRow param, bool realAsFloat, MySqlParameter returnParameter) + { + string mode = (string)param["PARAMETER_MODE"]; + string pName = (string)param["PARAMETER_NAME"]; + string datatype = (string)param["DATA_TYPE"]; + bool unsigned = GetFlags(param["DTD_IDENTIFIER"].ToString()).IndexOf("UNSIGNED") != -1; + + if (Convert.ToUInt64(param["ORDINAL_POSITION"]) == 0) + { + if (returnParameter == null) + throw new InvalidOperationException(String.Format(Resources.RoutineRequiresReturnParameter, spName)); + pName = returnParameter.ParameterName; + } + + // make sure the parameters given to us have an appropriate type set if it's not already + MySqlParameter p = command.Parameters.GetParameterFlexible(pName, true); + if (!p.TypeHasBeenSet) + p.MySqlDbType = MetaData.NameToType(datatype, unsigned, realAsFloat, Connection); + + return p; + } + + private async Task CheckParametersAsync(string spName, bool execAsync) + { + MySqlParameterCollection newParms = new MySqlParameterCollection(command); + MySqlParameter returnParameter = GetReturnParameter(); + + ProcedureCacheEntry entry = await GetParametersAsync(spName, execAsync).ConfigureAwait(false); + if (entry.procedure == null || entry.procedure.Rows.Count == 0) + throw new InvalidOperationException(String.Format(Resources.RoutineNotFound, spName)); + + bool realAsFloat = entry.procedure.Rows[0]["SQL_MODE"].ToString().IndexOf("REAL_AS_FLOAT") != -1; + + foreach (MySqlSchemaRow param in entry.parameters.Rows) + newParms.Add(GetAndFixParameter(spName, param, realAsFloat, returnParameter)); + return newParms; + } + + public override void Resolve(bool preparing) + { + // check to see if we are already resolved + if (ResolvedCommandText != null) return; + + ServerProvidingOutputParameters = Driver.SupportsOutputParameters && preparing; + + // first retrieve the procedure definition from our + // procedure cache + string spName = commandText; + spName = FixProcedureName(spName); + + MySqlParameter returnParameter = GetReturnParameter(); + + MySqlParameterCollection parms = command.Connection.Settings.CheckParameters ? + CheckParametersAsync(spName, false).GetAwaiter().GetResult() : Parameters; + + string setSql = SetUserVariables(parms, preparing); + string callSql = CreateCallStatement(spName, returnParameter, parms); + string outSql = CreateOutputSelect(parms, preparing); + resolvedCommandText = String.Format("{0}{1}{2}", setSql, callSql, outSql); + } + + private string SetUserVariables(MySqlParameterCollection parms, bool preparing) + { + StringBuilder setSql = new StringBuilder(); + + if (ServerProvidingOutputParameters) return setSql.ToString(); + + string delimiter = String.Empty; + foreach (MySqlParameter p in parms) + { + if (p.Direction != ParameterDirection.InputOutput) continue; + + string pName = "@" + p.BaseName; + string uName = "@" + ParameterPrefix + p.BaseName; + string sql = String.Format("SET {0}={1}", uName, pName); + + if (command.Connection.Settings.AllowBatch && !preparing) + { + setSql.AppendFormat(CultureInfo.InvariantCulture, "{0}{1}", delimiter, sql); + delimiter = "; "; + } + else + { + MySqlCommand cmd = new MySqlCommand(sql, command.Connection); + cmd.Parameters.Add(p); + cmd.ExecuteNonQuery(); + } + } + if (setSql.Length > 0) + setSql.Append("; "); + return setSql.ToString(); + } + + private string CreateCallStatement(string spName, MySqlParameter returnParameter, MySqlParameterCollection parms) + { + StringBuilder callSql = new StringBuilder(); + + string delimiter = String.Empty; + foreach (MySqlParameter p in parms) + { + if (p.Direction == ParameterDirection.ReturnValue) continue; + + string pName = "@" + p.BaseName; + string uName = "@" + ParameterPrefix + p.BaseName; + + bool useRealVar = p.Direction == ParameterDirection.Input || ServerProvidingOutputParameters; + callSql.AppendFormat(CultureInfo.InvariantCulture, "{0}{1}", delimiter, useRealVar ? pName : uName); + delimiter = ", "; + } + + if (returnParameter == null) + return String.Format("CALL {0}({1})", spName, callSql.ToString()); + else + return String.Format("SET @{0}{1}={2}({3})", ParameterPrefix, returnParameter.BaseName, spName, callSql.ToString()); + } + + private string CreateOutputSelect(MySqlParameterCollection parms, bool preparing) + { + StringBuilder outSql = new StringBuilder(); + + string delimiter = String.Empty; + foreach (MySqlParameter p in parms) + { + if (p.Direction == ParameterDirection.Input) continue; + if ((p.Direction == ParameterDirection.InputOutput || + p.Direction == ParameterDirection.Output) && + ServerProvidingOutputParameters) continue; + string pName = "@" + p.BaseName; + string uName = "@" + ParameterPrefix + p.BaseName; + + outSql.AppendFormat(CultureInfo.InvariantCulture, "{0}{1}", delimiter, uName); + delimiter = ", "; + } + + if (outSql.Length == 0) return String.Empty; + + if (command.Connection.Settings.AllowBatch && !preparing) + return String.Format(";SELECT {0}", outSql.ToString()); + + _outSelect = String.Format("SELECT {0}", outSql.ToString()); + return String.Empty; + } + + internal void ProcessOutputParameters(MySqlDataReader reader) + { + // We apparently need to always adjust our output types since the server + // provided data types are not always right + AdjustOutputTypes(reader); + + if ((reader.CommandBehavior & CommandBehavior.SchemaOnly) != 0) + return; + + // now read the output parameters data row + reader.Read(); + + string prefix = "@" + StoredProcedure.ParameterPrefix; + + for (int i = 0; i < reader.FieldCount; i++) + { + string fieldName = reader.GetName(i); + if (fieldName.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) + fieldName = fieldName.Remove(0, prefix.Length); + MySqlParameter parameter = command.Parameters.GetParameterFlexible(fieldName, true); + parameter.Value = reader.GetValue(i); + } + } + + private void AdjustOutputTypes(MySqlDataReader reader) + { + // since MySQL likes to return user variables as strings + // we reset the types of the readers internal value objects + // this will allow those value objects to parse the string based + // return values + for (int i = 0; i < reader.FieldCount; i++) + { + string fieldName = reader.GetName(i); + if (fieldName.IndexOf(StoredProcedure.ParameterPrefix) != -1) + fieldName = fieldName.Remove(0, StoredProcedure.ParameterPrefix.Length + 1); + MySqlParameter parameter = command.Parameters.GetParameterFlexible(fieldName, true); + + IMySqlValue v = MySqlField.GetIMySqlValue(parameter.MySqlDbType); + if (v is MySqlBit) + { + MySqlBit bit = (MySqlBit)v; + bit.ReadAsString = true; + reader.ResultSet.SetValueObject(i, bit); + } + else + reader.ResultSet.SetValueObject(i, v); + } + } + + public override void Close(MySqlDataReader reader) + { + if (String.IsNullOrEmpty(_outSelect)) return; + if ((reader.CommandBehavior & CommandBehavior.SchemaOnly) != 0) return; + + MySqlCommand cmd = new MySqlCommand(_outSelect, command.Connection); + cmd.InternallyCreated = true; + + using (MySqlDataReader rdr = cmd.ExecuteReader(reader.CommandBehavior)) + ProcessOutputParameters(rdr); + } + } +} diff --git a/MySQL.Data/src/TableCache.cs b/MySQL.Data/src/TableCache.cs new file mode 100644 index 000000000..2944cb380 --- /dev/null +++ b/MySQL.Data/src/TableCache.cs @@ -0,0 +1,164 @@ +// Copyright © 2016, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Linq; + +namespace MySql.Data.MySqlClient +{ + internal class TableCache + { + private static readonly BaseTableCache cache; + + static TableCache() + { + cache = new BaseTableCache(480 /* 8 hour max by default */); + } + + public static void AddToCache(string commandText, ResultSet resultSet) + { + cache.AddToCache(commandText, resultSet); + } + + public static ResultSet RetrieveFromCache(string commandText, int cacheAge) + { + return (ResultSet)cache.RetrieveFromCache(commandText, cacheAge); + } + + public static void RemoveFromCache(string commandText) + { + cache.RemoveFromCache(commandText); + } + + public static void DumpCache() + { + cache.Dump(); + } + } + + /// + /// Defines the basic operations to be performed on the table cache. + /// + public class BaseTableCache + { + /// + /// The maximum age allowed for cache entries. + /// + protected int MaxCacheAge; + + private Dictionary cache = new Dictionary(); + + public BaseTableCache(int maxCacheAge) + { + MaxCacheAge = maxCacheAge; + } + + /// + /// Adds the given command and result set to the cache. + /// + /// The command to store in the cache. + /// The resultset associated to the stored command. + public virtual void AddToCache(string commandText, object resultSet) + { + CleanCache(); + CacheEntry entry = new CacheEntry(); + entry.CacheTime = DateTime.Now; + entry.CacheElement = resultSet; + lock (cache) + { + if (cache.ContainsKey(commandText)) return; + cache.Add(commandText, entry); + } + } + + /// + /// Retrieves the specified command from the cache. + /// + /// The command to retrieve. + /// The allowed age for the cache entry. + /// + public virtual object RetrieveFromCache(string commandText, int cacheAge) + { + CleanCache(); + lock (cache) + { + if (!cache.ContainsKey(commandText)) return null; + CacheEntry entry = cache[commandText]; + if (DateTime.Now.Subtract(entry.CacheTime).TotalSeconds > cacheAge) return null; + return entry.CacheElement; + } + } + + /// + /// Removes the specified command from the cache. + /// + /// The command to remove from the cache. + public void RemoveFromCache(string commandText) + { + lock (cache) + { + if (!cache.ContainsKey(commandText)) return; + cache.Remove(commandText); + } + } + + /// + /// Clears the cache. + /// + public virtual void Dump() + { + lock (cache) + cache.Clear(); + } + + /// + /// Removes cache entries older than the value defined by . + /// + protected virtual void CleanCache() + { + DateTime now = DateTime.Now; + List keysToRemove = new List(); + + lock (cache) + { + keysToRemove.AddRange(from key in cache.Keys let diff = now.Subtract(cache[key].CacheTime) where diff.TotalSeconds > MaxCacheAge select key); + + foreach (string key in keysToRemove) + cache.Remove(key); + } + } + + private struct CacheEntry + { + public DateTime CacheTime; + public object CacheElement; + } + } + +} diff --git a/MySQL.Data/src/TimedStream.cs b/MySQL.Data/src/TimedStream.cs new file mode 100644 index 000000000..4d788cdb3 --- /dev/null +++ b/MySQL.Data/src/TimedStream.cs @@ -0,0 +1,300 @@ +// Copyright © 2009, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + /// + /// Stream that supports timeout of IO operations. + /// This class is used is used to support timeouts for SQL command, where a + /// typical operation involves several network reads/writes. + /// Timeout here is defined as the accumulated duration of all IO operations. + /// + internal class TimedStream : Stream + { + readonly Stream _baseStream; + + int _timeout; + int _lastReadTimeout; + int _lastWriteTimeout; + readonly LowResolutionStopwatch _stopwatch; + + internal bool IsClosed { get; private set; } + + enum IOKind + { + Read, + Write + }; + + /// + /// Construct a TimedStream + /// + /// Undelying stream + public TimedStream(Stream baseStream) + { + this._baseStream = baseStream; + _timeout = baseStream.CanTimeout ? baseStream.ReadTimeout : System.Threading.Timeout.Infinite; + IsClosed = false; + _stopwatch = new LowResolutionStopwatch(); + } + + /// + /// Figure out whether it is necessary to reset timeout on stream. + /// We track the current value of timeout and try to avoid + /// changing it too often, because setting Read/WriteTimeout property + /// on network stream maybe a slow operation that involves a system call + /// (setsockopt). Therefore, we allow a small difference, and do not + /// reset timeout if current value is slightly greater than the requested + /// one (within 0.1 second). + /// + private bool ShouldResetStreamTimeout(int currentValue, int newValue) + { + if (!_baseStream.CanTimeout) return false; + if (newValue == Timeout.Infinite + && currentValue != newValue) + return true; + if (newValue > currentValue) + return true; + return currentValue >= newValue + 100; + } + + private void StartTimer(IOKind op) + { + + int streamTimeout; + + if (_timeout == Timeout.Infinite) + streamTimeout = Timeout.Infinite; + else + streamTimeout = _timeout - (int)_stopwatch.ElapsedMilliseconds; + + if (op == IOKind.Read) + { + if (ShouldResetStreamTimeout(_lastReadTimeout, streamTimeout)) + { + _baseStream.ReadTimeout = streamTimeout; + _lastReadTimeout = streamTimeout; + } + } + else + { + if (ShouldResetStreamTimeout(_lastWriteTimeout, streamTimeout)) + { + _baseStream.WriteTimeout = streamTimeout; + _lastWriteTimeout = streamTimeout; + } + } + + if (_timeout == Timeout.Infinite) + return; + + _stopwatch.Start(); + } + + private void StopTimer() + { + if (_timeout == Timeout.Infinite) + return; + + _stopwatch.Stop(); + + // Normally, a timeout exception would be thrown by stream itself, + // since we set the read/write timeout for the stream. However + // there is a gap between end of IO operation and stopping the + // stop watch, and it makes it possible for timeout to exceed + // even after IO completed successfully. + if (_stopwatch.ElapsedMilliseconds > _timeout) + { + ResetTimeout(Timeout.Infinite); + throw new TimeoutException("Timeout in IO operation"); + } + } + + public override bool CanRead => _baseStream.CanRead; + + public override bool CanSeek => _baseStream.CanSeek; + + public override bool CanWrite => _baseStream.CanWrite; + + public override void Flush() => FlushAsync(false).GetAwaiter().GetResult(); + + public override Task FlushAsync(CancellationToken cancellationToken = default) => FlushAsync(true); + + private async Task FlushAsync(bool execAsync) + { + try + { + StartTimer(IOKind.Write); + if (execAsync) + await _baseStream.FlushAsync(CancellationToken.None).ConfigureAwait(false); + else + _baseStream.Flush(); + StopTimer(); + } + catch (Exception e) + { + HandleException(e); + throw; + } + } + + public override long Length => _baseStream.Length; + + public override long Position + { + get + { + return _baseStream.Position; + } + set + { + _baseStream.Position = value; + } + } + + public override int Read(byte[] buffer, int offset, int count) => ReadAsync(buffer, offset, count, false).GetAwaiter().GetResult(); + + public override Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken = default) => ReadAsync(buffer, offset, count, true); + + private async Task ReadAsync(byte[] buffer, int offset, int count, bool execAsync) + { + try + { + StartTimer(IOKind.Read); + int retval = execAsync + ? await _baseStream.ReadAsync(buffer, offset, count).ConfigureAwait(false) + : _baseStream.Read(buffer, offset, count); + StopTimer(); + return retval; + } + catch (Exception e) + { + HandleException(e); + throw; + } + } + + public override int ReadByte() + { + try + { + StartTimer(IOKind.Read); + int retval = _baseStream.ReadByte(); + StopTimer(); + return retval; + } + catch (Exception e) + { + HandleException(e); + throw; + } + } + + public override long Seek(long offset, SeekOrigin origin) + { + return _baseStream.Seek(offset, origin); + } + + public override void SetLength(long value) + { + _baseStream.SetLength(value); + } + + public override void Write(byte[] buffer, int offset, int count) => WriteAsync(buffer, offset, count, false).GetAwaiter().GetResult(); + + public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken = default) => WriteAsync(buffer, offset, count, true); + + private async Task WriteAsync(byte[] buffer, int offset, int count, bool execAsync) + { + try + { + StartTimer(IOKind.Write); + if (execAsync) + await _baseStream.WriteAsync(buffer, offset, count).ConfigureAwait(false); + else + _baseStream.Write(buffer, offset, count); + StopTimer(); + } + catch (Exception e) + { + HandleException(e); + throw; + } + } + + public override bool CanTimeout => _baseStream.CanTimeout; + + public override int ReadTimeout + { + get { return _baseStream.ReadTimeout; } + set { _baseStream.ReadTimeout = value; } + } + + public override int WriteTimeout + { + get { return _baseStream.WriteTimeout; } + set { _baseStream.WriteTimeout = value; } + } + + public override void Close() + { + if (IsClosed) + return; + IsClosed = true; + _baseStream.Close(); + _baseStream.Dispose(); + } + + public void ResetTimeout(int newTimeout) + { + if (newTimeout == Timeout.Infinite || newTimeout == 0) + _timeout = Timeout.Infinite; + else + _timeout = newTimeout; + _stopwatch.Reset(); + } + + /// + /// Common handler for IO exceptions. + /// Resets timeout to infinity if timeout exception is + /// detected and stops the times. + /// + /// original exception + void HandleException(Exception e) + { + _stopwatch.Stop(); + ResetTimeout(-1); + } + } +} diff --git a/MySQL.Data/src/TracingDriver.cs b/MySQL.Data/src/TracingDriver.cs new file mode 100644 index 000000000..308b767cd --- /dev/null +++ b/MySQL.Data/src/TracingDriver.cs @@ -0,0 +1,259 @@ +// Copyright © 2009, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient +{ + internal class TracingDriver : Driver + { + private static long driverCounter; + private long driverId; + private ResultSet activeResult; + private int rowSizeInBytes; + + public TracingDriver(MySqlConnectionStringBuilder settings) + : base(settings) + { + driverId = Interlocked.Increment(ref driverCounter); + } + + public override async Task OpenAsync(bool execAsync, CancellationToken cancellationToken) + { + await base.OpenAsync(execAsync, cancellationToken).ConfigureAwait(false); + MySqlTrace.TraceEvent(TraceEventType.Information, MySqlTraceEventType.ConnectionOpened, + Resources.TraceOpenConnection, driverId, Settings.ConnectionString, ThreadID); + } + + public override async Task CloseAsync(bool execAsync) + { + await base.CloseAsync(execAsync); + MySqlTrace.TraceEvent(TraceEventType.Information, MySqlTraceEventType.ConnectionClosed, + Resources.TraceCloseConnection, driverId); + } + + public override async Task SendQueryAsync(MySqlPacket p, int paramsPosition, bool execAsync) + { + rowSizeInBytes = 0; + string cmdText = Encoding.GetString(p.Buffer, paramsPosition, p.Length - paramsPosition); + string normalizedQuery = null; + + if (cmdText.Length > 300) + { + QueryNormalizer normalizer = new QueryNormalizer(); + normalizedQuery = normalizer.Normalize(cmdText); + cmdText = cmdText.Substring(0, 300); + } + + await base.SendQueryAsync(p, paramsPosition, execAsync).ConfigureAwait(false); + + MySqlTrace.TraceEvent(TraceEventType.Information, MySqlTraceEventType.QueryOpened, + Resources.TraceQueryOpened, driverId, ThreadID, cmdText); + if (normalizedQuery != null) + MySqlTrace.TraceEvent(TraceEventType.Information, MySqlTraceEventType.QueryNormalized, + Resources.TraceQueryNormalized, driverId, ThreadID, normalizedQuery); + } + + protected override async Task> GetResultAsync(int statementId, int affectedRows, long insertedId, bool execAsync) + { + try + { + var result = await base.GetResultAsync(statementId, affectedRows, insertedId, execAsync).ConfigureAwait(false); + int fieldCount = result.Item1; + affectedRows = result.Item2; + insertedId = result.Item3; + + MySqlTrace.TraceEvent(TraceEventType.Information, MySqlTraceEventType.ResultOpened, + Resources.TraceResult, driverId, fieldCount, affectedRows, insertedId); + + return new Tuple(fieldCount, affectedRows, insertedId); + } + catch (MySqlException ex) + { + // we got an error so we report it + MySqlTrace.TraceEvent(TraceEventType.Information, MySqlTraceEventType.Error, + Resources.TraceOpenResultError, driverId, ex.Number, ex.Message); + throw; + } + } + + public override async Task NextResultAsync(int statementId, bool force, bool execAsync) + { + // first let's see if we already have a resultset on this statementId + if (activeResult != null) + { + //oldRS = activeResults[statementId]; + if (Settings.UseUsageAdvisor) + ReportUsageAdvisorWarnings(statementId, activeResult); + MySqlTrace.TraceEvent(TraceEventType.Information, MySqlTraceEventType.ResultClosed, + Resources.TraceResultClosed, driverId, activeResult.TotalRows, activeResult.SkippedRows, + rowSizeInBytes); + rowSizeInBytes = 0; + activeResult = null; + } + + activeResult = await base.NextResultAsync(statementId, force, execAsync).ConfigureAwait(false); + return activeResult; + } + + public override async Task> PrepareStatementAsync(string sql, bool execAsync) + { + var result = await base.PrepareStatementAsync(sql, execAsync).ConfigureAwait(false); + int statementId = result.Item1; + MySqlTrace.TraceEvent(TraceEventType.Information, MySqlTraceEventType.StatementPrepared, + Resources.TraceStatementPrepared, driverId, sql, statementId); + return new Tuple(result.Item1, result.Item2); + } + + public override async Task CloseStatementAsync(int id, bool execAsync) + { + await base.CloseStatementAsync(id, execAsync).ConfigureAwait(false); + MySqlTrace.TraceEvent(TraceEventType.Information, MySqlTraceEventType.StatementClosed, + Resources.TraceStatementClosed, driverId, id); + } + + public override async Task SetDatabaseAsync(string dbName, bool execAsync) + { + await base.SetDatabaseAsync(dbName, execAsync); + MySqlTrace.TraceEvent(TraceEventType.Information, MySqlTraceEventType.NonQuery, + Resources.TraceSetDatabase, driverId, dbName); + } + + public override async Task ExecuteStatementAsync(MySqlPacket packetToExecute, bool execAsync) + { + await base.ExecuteStatementAsync(packetToExecute, execAsync).ConfigureAwait(false); + int pos = packetToExecute.Position; + packetToExecute.Position = 1; + int statementId = packetToExecute.ReadInteger(4); + packetToExecute.Position = pos; + + MySqlTrace.TraceEvent(TraceEventType.Information, MySqlTraceEventType.StatementExecuted, + Resources.TraceStatementExecuted, driverId, statementId, ThreadID); + } + + public override async Task FetchDataRowAsync(int statementId, int columns, bool execAsync) + { + try + { + bool b = await base.FetchDataRowAsync(statementId, columns, execAsync).ConfigureAwait(false); + if (b) + rowSizeInBytes += (handler as NativeDriver).Packet.Length; + return b; + } + catch (MySqlException ex) + { + MySqlTrace.TraceEvent(TraceEventType.Error, MySqlTraceEventType.Error, + Resources.TraceFetchError, driverId, ex.Number, ex.Message); + throw; + } + } + + public override async Task CloseQueryAsync(MySqlConnection connection, int statementId, bool execAsync) + { + await base.CloseQueryAsync(connection, statementId, execAsync).ConfigureAwait(false); + MySqlTrace.TraceEvent(TraceEventType.Information, MySqlTraceEventType.QueryClosed, Resources.TraceQueryDone, driverId); + } + + public override async Task> ReportWarningsAsync(MySqlConnection connection, bool execAsync) + { + List warnings = await base.ReportWarningsAsync(connection, execAsync).ConfigureAwait(false); + + foreach (MySqlError warning in warnings) + MySqlTrace.TraceEvent(TraceEventType.Warning, MySqlTraceEventType.Warning, Resources.TraceWarning, driverId, warning.Level, warning.Code, warning.Message); + + return warnings; + } + + private bool AllFieldsAccessed(ResultSet rs) + { + if (rs.Fields == null || rs.Fields.Length == 0) return true; + + for (int i = 0; i < rs.Fields.Length; i++) + if (!rs.FieldRead(i)) return false; + return true; + } + + private void ReportUsageAdvisorWarnings(int statementId, ResultSet rs) + { + if (!Settings.UseUsageAdvisor) return; + + if (HasStatus(ServerStatusFlags.NoIndex)) + MySqlTrace.TraceEvent(TraceEventType.Warning, MySqlTraceEventType.UsageAdvisorWarning, + Resources.TraceUAWarningNoIndex, driverId, UsageAdvisorWarningFlags.NoIndex); + else if (HasStatus(ServerStatusFlags.BadIndex)) + MySqlTrace.TraceEvent(TraceEventType.Warning, MySqlTraceEventType.UsageAdvisorWarning, + Resources.TraceUAWarningBadIndex, driverId, UsageAdvisorWarningFlags.BadIndex); + + // report abandoned rows + if (rs.SkippedRows > 0) + MySqlTrace.TraceEvent(TraceEventType.Warning, MySqlTraceEventType.UsageAdvisorWarning, + Resources.TraceUAWarningSkippedRows, driverId, UsageAdvisorWarningFlags.SkippedRows, rs.SkippedRows); + + // report not all fields accessed + if (!AllFieldsAccessed(rs)) + { + StringBuilder notAccessed = new StringBuilder(""); + string delimiter = ""; + for (int i = 0; i < rs.Size; i++) + if (!rs.FieldRead(i)) + { + notAccessed.AppendFormat("{0}{1}", delimiter, rs.Fields[i].ColumnName); + delimiter = ","; + } + MySqlTrace.TraceEvent(TraceEventType.Warning, MySqlTraceEventType.UsageAdvisorWarning, + Resources.TraceUAWarningSkippedColumns, driverId, UsageAdvisorWarningFlags.SkippedColumns, + notAccessed.ToString()); + } + + // report type conversions if any + if (rs.Fields != null) + { + foreach (MySqlField f in rs.Fields) + { + StringBuilder s = new StringBuilder(); + string delimiter = ""; + foreach (Type t in f.TypeConversions) + { + s.AppendFormat("{0}{1}", delimiter, t.Name); + delimiter = ","; + } + if (s.Length > 0) + MySqlTrace.TraceEvent(TraceEventType.Warning, MySqlTraceEventType.UsageAdvisorWarning, + Resources.TraceUAWarningFieldConversion, driverId, UsageAdvisorWarningFlags.FieldConversion, + f.ColumnName, s.ToString()); + } + } + } + } +} diff --git a/MySQL.Data/src/Types/IMySqlValue.cs b/MySQL.Data/src/Types/IMySqlValue.cs new file mode 100644 index 000000000..2b3df6aca --- /dev/null +++ b/MySQL.Data/src/Types/IMySqlValue.cs @@ -0,0 +1,47 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Threading.Tasks; + +namespace MySql.Data.Types +{ + internal interface IMySqlValue + { + bool IsNull { get; } + MySqlDbType MySqlDbType { get; } + object Value { get; /*set;*/ } + Type SystemType { get; } + string MySqlTypeName { get; } + + Task WriteValueAsync(MySqlPacket packet, bool binary, object value, int length, bool execAsync); + Task ReadValueAsync(MySqlPacket packet, long length, bool isNull, bool execAsync); + void SkipValue(MySqlPacket packet); + } +} diff --git a/Source/MySql.Data/Types/MetaData.cs b/MySQL.Data/src/Types/MetaData.cs similarity index 77% rename from Source/MySql.Data/Types/MetaData.cs rename to MySQL.Data/src/Types/MetaData.cs index 5336e713f..61fbb28de 100644 --- a/Source/MySql.Data/Types/MetaData.cs +++ b/MySQL.Data/src/Types/MetaData.cs @@ -1,167 +1,165 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Globalization; -using MySql.Data.MySqlClient; -using MySql.Data.Common; - -namespace MySql.Data.Types -{ - internal class MetaData - { - public static bool IsNumericType(string typename) - { -#if NETCORE10 - string lowerType = typename.ToLowerInvariant(); -#else - string lowerType = typename.ToLower(CultureInfo.InvariantCulture); -#endif - switch (lowerType) - { - case "int": - case "integer": - case "numeric": - case "decimal": - case "dec": - case "fixed": - case "tinyint": - case "mediumint": - case "bigint": - case "real": - case "double": - case "float": - case "serial": - case "smallint": return true; - } - return false; - } - - public static bool IsTextType(string typename) - { -#if NETCORE10 - string lowerType = typename.ToLowerInvariant(); -#else - string lowerType = typename.ToLower(CultureInfo.InvariantCulture); -#endif - switch (lowerType) - { - case "varchar": - case "char": - case "text": - case "longtext": - case "tinytext": - case "mediumtext": - case "nchar": - case "nvarchar": - case "enum": - case "set": - return true; - } - return false; - } - - public static bool SupportScale(string typename) - { - string lowerType = StringUtility.ToLowerInvariant(typename); - switch (lowerType) - { - case "numeric": - case "decimal": - case "dec": - case "real": return true; - } - return false; - } - - public static MySqlDbType NameToType(string typeName, bool unsigned, - bool realAsFloat, MySqlConnection connection) - { - switch (StringUtility.ToUpperInvariant(typeName)) - { - case "CHAR": return MySqlDbType.String; - case "VARCHAR": return MySqlDbType.VarChar; - case "DATE": return MySqlDbType.Date; - case "DATETIME": return MySqlDbType.DateTime; - case "NUMERIC": - case "DECIMAL": - case "DEC": - case "FIXED": - if (connection.driver.Version.isAtLeast(5, 0, 3)) - return MySqlDbType.NewDecimal; - else - return MySqlDbType.Decimal; - case "YEAR": - return MySqlDbType.Year; - case "TIME": - return MySqlDbType.Time; - case "TIMESTAMP": - return MySqlDbType.Timestamp; - case "SET": return MySqlDbType.Set; - case "ENUM": return MySqlDbType.Enum; - case "BIT": return MySqlDbType.Bit; - - case "TINYINT": - return unsigned ? MySqlDbType.UByte : MySqlDbType.Byte; - case "BOOL": - case "BOOLEAN": - return MySqlDbType.Byte; - case "SMALLINT": - return unsigned ? MySqlDbType.UInt16 : MySqlDbType.Int16; - case "MEDIUMINT": - return unsigned ? MySqlDbType.UInt24 : MySqlDbType.Int24; - case "INT": - case "INTEGER": - return unsigned ? MySqlDbType.UInt32 : MySqlDbType.Int32; - case "SERIAL": - return MySqlDbType.UInt64; - case "BIGINT": - return unsigned ? MySqlDbType.UInt64 : MySqlDbType.Int64; - case "FLOAT": return MySqlDbType.Float; - case "DOUBLE": return MySqlDbType.Double; - case "REAL": return - realAsFloat ? MySqlDbType.Float : MySqlDbType.Double; - case "TEXT": - return MySqlDbType.Text; - case "BLOB": - return MySqlDbType.Blob; - case "LONGBLOB": - return MySqlDbType.LongBlob; - case "LONGTEXT": - return MySqlDbType.LongText; - case "MEDIUMBLOB": - return MySqlDbType.MediumBlob; - case "MEDIUMTEXT": - return MySqlDbType.MediumText; - case "TINYBLOB": - return MySqlDbType.TinyBlob; - case "TINYTEXT": - return MySqlDbType.TinyText; - case "BINARY": - return MySqlDbType.Binary; - case "VARBINARY": - return MySqlDbType.VarBinary; - } - throw new MySqlException("Unhandled type encountered"); - } - - } -} +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Globalization; +using MySql.Data.MySqlClient; +using MySql.Data.Common; + +namespace MySql.Data.Types +{ + internal class MetaData + { + public static bool IsNumericType(string typename) + { + string lowerType = typename.ToLower(CultureInfo.InvariantCulture); + + switch (lowerType) + { + case "int": + case "integer": + case "numeric": + case "decimal": + case "dec": + case "fixed": + case "tinyint": + case "mediumint": + case "bigint": + case "real": + case "double": + case "float": + case "serial": + case "smallint": return true; + } + return false; + } + + public static bool IsTextType(string typename) + { + string lowerType = typename.ToLower(CultureInfo.InvariantCulture); + + switch (lowerType) + { + case "varchar": + case "char": + case "text": + case "longtext": + case "tinytext": + case "mediumtext": + case "nchar": + case "nvarchar": + case "enum": + case "set": + return true; + } + return false; + } + + public static bool SupportScale(string typename) + { + string lowerType = StringUtility.ToLowerInvariant(typename); + switch (lowerType) + { + case "numeric": + case "decimal": + case "dec": + case "real": return true; + } + return false; + } + + public static MySqlDbType NameToType(string typeName, bool unsigned, + bool realAsFloat, MySqlConnection connection) + { + switch (StringUtility.ToUpperInvariant(typeName)) + { + case "CHAR": return MySqlDbType.String; + case "VARCHAR": return MySqlDbType.VarChar; + case "DATE": return MySqlDbType.Date; + case "DATETIME": return MySqlDbType.DateTime; + case "NUMERIC": + case "DECIMAL": + case "DEC": + case "FIXED": + if (connection.driver.Version.isAtLeast(5, 0, 3)) + return MySqlDbType.NewDecimal; + else + return MySqlDbType.Decimal; + case "YEAR": + return MySqlDbType.Year; + case "TIME": + return MySqlDbType.Time; + case "TIMESTAMP": + return MySqlDbType.Timestamp; + case "SET": return MySqlDbType.Set; + case "ENUM": return MySqlDbType.Enum; + case "BIT": return MySqlDbType.Bit; + case "TINYINT": + return unsigned ? MySqlDbType.UByte : MySqlDbType.Byte; + case "BOOL": + case "BOOLEAN": + return MySqlDbType.Byte; + case "SMALLINT": + return unsigned ? MySqlDbType.UInt16 : MySqlDbType.Int16; + case "MEDIUMINT": + return unsigned ? MySqlDbType.UInt24 : MySqlDbType.Int24; + case "INT": + case "INTEGER": + return unsigned ? MySqlDbType.UInt32 : MySqlDbType.Int32; + case "SERIAL": + return MySqlDbType.UInt64; + case "BIGINT": + return unsigned ? MySqlDbType.UInt64 : MySqlDbType.Int64; + case "FLOAT": return MySqlDbType.Float; + case "DOUBLE": return MySqlDbType.Double; + case "REAL": return + realAsFloat ? MySqlDbType.Float : MySqlDbType.Double; + case "TEXT": + return MySqlDbType.Text; + case "BLOB": + return MySqlDbType.Blob; + case "LONGBLOB": + return MySqlDbType.LongBlob; + case "LONGTEXT": + return MySqlDbType.LongText; + case "MEDIUMBLOB": + return MySqlDbType.MediumBlob; + case "MEDIUMTEXT": + return MySqlDbType.MediumText; + case "TINYBLOB": + return MySqlDbType.TinyBlob; + case "TINYTEXT": + return MySqlDbType.TinyText; + case "BINARY": + return MySqlDbType.Binary; + case "VARBINARY": + return MySqlDbType.VarBinary; + } + throw new MySqlException("Unhandled type encountered"); + } + } +} diff --git a/MySQL.Data/src/Types/MySqlBinary.cs b/MySQL.Data/src/Types/MySqlBinary.cs new file mode 100644 index 000000000..29faae119 --- /dev/null +++ b/MySQL.Data/src/Types/MySqlBinary.cs @@ -0,0 +1,211 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Threading.Tasks; + +namespace MySql.Data.Types +{ + + internal struct MySqlBinary : IMySqlValue + { + private readonly MySqlDbType _type; + private readonly byte[] _mValue; + + public MySqlBinary(MySqlDbType type, bool isNull) + { + _type = type; + IsNull = isNull; + _mValue = null; + } + + public MySqlBinary(MySqlDbType type, byte[] val) + { + _type = type; + IsNull = false; + _mValue = val; + } + + #region IMySqlValue Members + + public bool IsNull { get; } + + MySqlDbType IMySqlValue.MySqlDbType => _type; + + object IMySqlValue.Value => _mValue; + + public byte[] Value => _mValue; + + Type IMySqlValue.SystemType => typeof(byte[]); + + string IMySqlValue.MySqlTypeName + { + get + { + switch (_type) + { + case MySqlDbType.TinyBlob: return "TINY_BLOB"; + case MySqlDbType.MediumBlob: return "MEDIUM_BLOB"; + case MySqlDbType.LongBlob: return "LONG_BLOB"; + case MySqlDbType.Vector: return "VECTOR"; + default: + return "BLOB"; + } + } + } + + async Task IMySqlValue.WriteValueAsync(MySqlPacket packet, bool binary, object val, int length, bool execAsync) + { + byte[] buffToWrite = (val as byte[]); + if (buffToWrite == null) + { + char[] valAsChar = (val as Char[]); + if (valAsChar != null) + buffToWrite = packet.Encoding.GetBytes(valAsChar); + else + { + string s = val.ToString(); + if (length == 0) + length = s.Length; + else + s = s.Substring(0, length); + buffToWrite = packet.Encoding.GetBytes(s); + } + } + + // we assume zero or maxsize length means write all of the value + if (length == 0 || buffToWrite.Length < length) + length = buffToWrite.Length; + + if (buffToWrite == null) + throw new MySqlException("Only byte arrays and strings can be serialized by MySqlBinary"); + + if (binary) + { + await packet.WriteLengthAsync(length, execAsync).ConfigureAwait(false); + await packet.WriteAsync(buffToWrite, 0, length, execAsync).ConfigureAwait(false); + } + else + { + await packet.WriteStringNoNullAsync("_binary ", execAsync).ConfigureAwait(false); + packet.WriteByte((byte)'\''); + EscapeByteArray(buffToWrite, length, packet); + packet.WriteByte((byte)'\''); + } + } + + private static void EscapeByteArray(byte[] bytes, int length, MySqlPacket packet) + { + for (int x = 0; x < length; x++) + { + byte b = bytes[x]; + if (b == '\0') + { + packet.WriteByte((byte)'\\'); + packet.WriteByte((byte)'0'); + } + + else if (b == '\\' || b == '\'' || b == '\"') + { + packet.WriteByte((byte)'\\'); + packet.WriteByte(b); + } + else + packet.WriteByte(b); + } + } + + async Task IMySqlValue.ReadValueAsync(MySqlPacket packet, long length, bool nullVal, bool execAsync) + { + MySqlBinary b; + if (nullVal) + b = new MySqlBinary(_type, true); + else + { + if (length == -1) + length = (long)packet.ReadFieldLength(); + + byte[] newBuff = new byte[length]; + await packet.ReadAsync(newBuff, 0, (int)length, execAsync).ConfigureAwait(false); + b = new MySqlBinary(_type, newBuff); + } + return b; + } + + void IMySqlValue.SkipValue(MySqlPacket packet) + { + int len = (int)packet.ReadFieldLength(); + packet.Position += len; + } + + #endregion + + public static void SetDSInfo(MySqlSchemaCollection sc) + { + string[] types = new string[] { "BLOB", "TINYBLOB", "MEDIUMBLOB", "LONGBLOB", "BINARY", "VARBINARY", "VECTOR" }; + MySqlDbType[] dbtype = new MySqlDbType[] { MySqlDbType.Blob, + MySqlDbType.TinyBlob, MySqlDbType.MediumBlob, MySqlDbType.LongBlob, MySqlDbType.Binary, MySqlDbType.VarBinary, + MySqlDbType.Vector}; + long[] sizes = new long[] { 65535L, 255L, 16777215L, 4294967295L, 255L, 65535L, 16777215L }; + string[] format = new string[] { null, null, null, null, "binary({0})", "varbinary({0})", null }; + string[] parms = new string[] { null, null, null, null, "length", "length", null }; + + // we use name indexing because this method will only be called + // when GetSchema is called for the DataSourceInformation + // collection and then it wil be cached. + for (int x = 0; x < types.Length; x++) + { + MySqlSchemaRow row = sc.AddRow(); + row["TypeName"] = types[x]; + row["ProviderDbType"] = dbtype[x]; + row["ColumnSize"] = sizes[x]; + row["CreateFormat"] = format[x]; + row["CreateParameters"] = parms[x]; + row["DataType"] = "System.Byte[]"; + row["IsAutoincrementable"] = false; + row["IsBestMatch"] = true; + row["IsCaseSensitive"] = false; + row["IsFixedLength"] = x < 4 ? false : true; + row["IsFixedPrecisionScale"] = false; + row["IsLong"] = sizes[x] > 255; + row["IsNullable"] = true; + row["IsSearchable"] = false; + row["IsSearchableWithLike"] = false; + row["IsUnsigned"] = DBNull.Value; + row["MaximumScale"] = DBNull.Value; + row["MinimumScale"] = DBNull.Value; + row["IsConcurrencyType"] = DBNull.Value; + row["IsLiteralSupported"] = false; + row["LiteralPrefix"] = "0x"; + row["LiteralSuffix"] = DBNull.Value; + row["NativeDataType"] = DBNull.Value; + } + } + } +} diff --git a/MySQL.Data/src/Types/MySqlBit.cs b/MySQL.Data/src/Types/MySqlBit.cs new file mode 100644 index 000000000..31fd94db8 --- /dev/null +++ b/MySQL.Data/src/Types/MySqlBit.cs @@ -0,0 +1,124 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Globalization; +using System.Threading.Tasks; + +namespace MySql.Data.Types +{ + /// + /// Summary description for MySqlUInt64. + /// + internal struct MySqlBit : IMySqlValue + { + private ulong _value; + + public MySqlBit(bool isnull) + { + _value = 0; + IsNull = isnull; + ReadAsString = false; + } + + public bool ReadAsString { get; set; } + + public bool IsNull { get; private set; } + + MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.Bit; + + object IMySqlValue.Value => _value; + + Type IMySqlValue.SystemType => typeof(ulong); + + string IMySqlValue.MySqlTypeName => "BIT"; + + async Task IMySqlValue.WriteValueAsync(MySqlPacket packet, bool binary, object value, int length, bool execAsync) + { + ulong v = value as ulong? ?? Convert.ToUInt64(value); + if (binary) + await packet.WriteIntegerAsync((long)v, 8, execAsync).ConfigureAwait(false); + else + await packet.WriteStringNoNullAsync(v.ToString(CultureInfo.InvariantCulture), execAsync).ConfigureAwait(false); + } + + async Task IMySqlValue.ReadValueAsync(MySqlPacket packet, long length, bool isNull, bool execAsync) + { + this.IsNull = isNull; + if (isNull) + return this; + + if (length == -1) + length = packet.ReadFieldLength(); + + if (ReadAsString) + _value = UInt64.Parse(await packet.ReadStringAsync(length, execAsync).ConfigureAwait(false), CultureInfo.InvariantCulture); + else + _value = (UInt64)packet.ReadBitValue((int)length); + return this; + } + + public void SkipValue(MySqlPacket packet) + { + int len = (int)packet.ReadFieldLength(); + packet.Position += len; + } + + internal static void SetDSInfo(MySqlSchemaCollection sc) + { + // we use name indexing because this method will only be called + // when GetSchema is called for the DataSourceInformation + // collection and then it wil be cached. + MySqlSchemaRow row = sc.AddRow(); + row["TypeName"] = "BIT"; + row["ProviderDbType"] = MySqlDbType.Bit; + row["ColumnSize"] = 64; + row["CreateFormat"] = "BIT"; + row["CreateParameters"] = DBNull.Value; + row["DataType"] = typeof(ulong).ToString(); + row["IsAutoincrementable"] = false; + row["IsBestMatch"] = true; + row["IsCaseSensitive"] = false; + row["IsFixedLength"] = false; + row["IsFixedPrecisionScale"] = true; + row["IsLong"] = false; + row["IsNullable"] = true; + row["IsSearchable"] = true; + row["IsSearchableWithLike"] = false; + row["IsUnsigned"] = false; + row["MaximumScale"] = 0; + row["MinimumScale"] = 0; + row["IsConcurrencyType"] = DBNull.Value; + row["IsLiteralSupported"] = false; + row["LiteralPrefix"] = DBNull.Value; + row["LiteralSuffix"] = DBNull.Value; + row["NativeDataType"] = DBNull.Value; + } + } +} diff --git a/MySQL.Data/src/Types/MySqlByte.cs b/MySQL.Data/src/Types/MySqlByte.cs new file mode 100644 index 000000000..38b62bf8a --- /dev/null +++ b/MySQL.Data/src/Types/MySqlByte.cs @@ -0,0 +1,141 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Globalization; +using System.Threading.Tasks; + +namespace MySql.Data.Types +{ + internal struct MySqlByte : IMySqlValue + { + public MySqlByte(bool isNull) + { + IsNull = isNull; + Value = 0; + TreatAsBoolean = false; + } + + public MySqlByte(sbyte val) + { + IsNull = false; + Value = val; + TreatAsBoolean = false; + } + + #region IMySqlValue Members + + public bool IsNull { get; } + + MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.Byte; + + object IMySqlValue.Value + { + get + { + if (TreatAsBoolean) + return Convert.ToBoolean(Value); + return Value; + } + } + + public sbyte Value { get; set; } + + Type IMySqlValue.SystemType => TreatAsBoolean ? typeof(bool) : typeof(sbyte); + + string IMySqlValue.MySqlTypeName => "TINYINT"; + + async Task IMySqlValue.WriteValueAsync(MySqlPacket packet, bool binary, object val, int length, bool execAsync) + { + sbyte v = val as sbyte? ?? Convert.ToSByte(val); + if (binary) + packet.WriteByte((byte)v); + else + await packet.WriteStringNoNullAsync(v.ToString(CultureInfo.InvariantCulture), execAsync).ConfigureAwait(false); + } + + async Task IMySqlValue.ReadValueAsync(MySqlPacket packet, long length, bool nullVal, bool execAsync) + { + if (nullVal) + return new MySqlByte(true) { TreatAsBoolean = TreatAsBoolean }; + + MySqlByte b; + if (length == -1) + b = new MySqlByte((sbyte)packet.ReadByte()); + else + { + string s = await packet.ReadStringAsync(length, execAsync).ConfigureAwait(false); + b = new MySqlByte(SByte.Parse(s, NumberStyles.Any, CultureInfo.InvariantCulture)); + } + + b.TreatAsBoolean = TreatAsBoolean; + return b; + } + + void IMySqlValue.SkipValue(MySqlPacket packet) + { + packet.ReadByte(); + } + + #endregion + + internal bool TreatAsBoolean { get; set; } + + internal static void SetDSInfo(MySqlSchemaCollection sc) + { + // we use name indexing because this method will only be called + // when GetSchema is called for the DataSourceInformation + // collection and then it wil be cached. + MySqlSchemaRow row = sc.AddRow(); + row["TypeName"] = "TINYINT"; + row["ProviderDbType"] = MySqlDbType.Byte; + row["ColumnSize"] = 0; + row["CreateFormat"] = "TINYINT"; + row["CreateParameters"] = null; + row["DataType"] = "System.SByte"; + row["IsAutoincrementable"] = true; + row["IsBestMatch"] = true; + row["IsCaseSensitive"] = false; + row["IsFixedLength"] = true; + row["IsFixedPrecisionScale"] = true; + row["IsLong"] = false; + row["IsNullable"] = true; + row["IsSearchable"] = true; + row["IsSearchableWithLike"] = false; + row["IsUnsigned"] = false; + row["MaximumScale"] = 0; + row["MinimumScale"] = 0; + row["IsConcurrencyType"] = DBNull.Value; + row["IsLiteralSupported"] = false; + row["LiteralPrefix"] = null; + row["LiteralSuffix"] = null; + row["NativeDataType"] = null; + } + } +} diff --git a/MySQL.Data/src/Types/MySqlConversionException.cs b/MySQL.Data/src/Types/MySqlConversionException.cs new file mode 100644 index 000000000..727fcd07a --- /dev/null +++ b/MySQL.Data/src/Types/MySqlConversionException.cs @@ -0,0 +1,46 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; + +namespace MySql.Data.Types +{ + /// + /// An exception thrown by MySQL when a type conversion does not succeed. + /// + [Serializable] + public class MySqlConversionException : Exception + { + /// Initializes a new instance of the class with a specified error message. + /// Message describing the error. + public MySqlConversionException(string msg) + : base(msg) + { + } + } +} diff --git a/MySQL.Data/src/Types/MySqlDateTime.cs b/MySQL.Data/src/Types/MySqlDateTime.cs new file mode 100644 index 000000000..e7d1ff9a1 --- /dev/null +++ b/MySQL.Data/src/Types/MySqlDateTime.cs @@ -0,0 +1,555 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using MySql.Data.MySqlClient; +using System; +using System.Globalization; +using System.Threading.Tasks; + +namespace MySql.Data.Types +{ + /// + /// Represents a datetime data type object in a MySql database. + /// + [Serializable] + public struct MySqlDateTime : IMySqlValue, IComparable, IConvertible + { + private readonly MySqlDbType _type; + private int _millisecond, _microsecond; + + /// + /// Defines whether the UTF or local timezone will be used. + /// + public int TimezoneOffset; + + /// + /// Constructs a new MySqlDateTime object by setting the individual time properties to + /// the given values. + /// + /// The year to use. + /// The month to use. + /// The day to use. + /// The hour to use. + /// The minute to use. + /// The second to use. + /// The microsecond to use. + public MySqlDateTime(int year, int month, int day, int hour, int minute, int second, int microsecond) + : this(MySqlDbType.DateTime, year, month, day, hour, minute, second, microsecond) + { + } + + /// + /// Constructs a new MySqlDateTime object by using values from the given object. + /// + /// The object to copy. + public MySqlDateTime(DateTime dt) + : this(MySqlDbType.DateTime, dt) + { + } + + /// + /// Constructs a new MySqlDateTime object by copying the current value of the given object. + /// + /// The MySqlDateTime object to copy. + public MySqlDateTime(MySqlDateTime mdt) + { + Year = mdt.Year; + Month = mdt.Month; + Day = mdt.Day; + Hour = mdt.Hour; + Minute = mdt.Minute; + Second = mdt.Second; + _microsecond = 0; + _millisecond = 0; + _type = MySqlDbType.DateTime; + IsNull = false; + TimezoneOffset = mdt.TimezoneOffset; + } + + /// + /// Enables the contruction of a MySqlDateTime object by parsing a string. + /// + public MySqlDateTime(string dateTime) + : this(Parse(dateTime)) + { + } + + internal MySqlDateTime(MySqlDbType type, int year, int month, int day, int hour, int minute, + int second, int microsecond) + { + this.IsNull = false; + this._type = type; + this.Year = year; + this.Month = month; + this.Day = day; + this.Hour = hour; + this.Minute = minute; + this.Second = second; + this._microsecond = microsecond; + this._millisecond = this._microsecond / 1000; + this.TimezoneOffset = 0; + } + + internal MySqlDateTime(MySqlDbType type, bool isNull) + : this(type, 0, 0, 0, 0, 0, 0, 0) + { + this.IsNull = isNull; + } + + internal MySqlDateTime(MySqlDbType type, DateTime val) + : this(type, 0, 0, 0, 0, 0, 0, 0) + { + this.IsNull = false; + Year = val.Year; + Month = val.Month; + Day = val.Day; + Hour = val.Hour; + Minute = val.Minute; + Second = val.Second; + Microsecond = (int)(val.Ticks % 10000000) / 10; + } + + #region Properties + + /// + /// Indicates if this object contains a value that can be represented as a DateTime + /// + public bool IsValidDateTime => Year != 0 && Month != 0 && Day != 0; + + /// Returns the year portion of this datetime + public int Year { get; set; } + + /// Returns the month portion of this datetime + public int Month { get; set; } + + /// Returns the day portion of this datetime + public int Day { get; set; } + + /// Returns the hour portion of this datetime + public int Hour { get; set; } + + /// Returns the minute portion of this datetime + public int Minute { get; set; } + + /// Returns the second portion of this datetime + public int Second { get; set; } + + /// + /// Returns the milliseconds portion of this datetime + /// expressed as a value between 0 and 999 + /// + public int Millisecond + { + get { return _millisecond; } + set + { + if (value < 0 || value > 999) + throw new ArgumentOutOfRangeException("Millisecond", Resources.InvalidMillisecondValue); + _millisecond = value; + _microsecond = value * 1000; + } + } + + /// + /// Returns the microseconds portion of this datetime (6 digit precision) + /// + public int Microsecond + { + get { return _microsecond; } + set + { + if (value < 0 || value > 999999) + throw new ArgumentOutOfRangeException("Microsecond", Resources.InvalidMicrosecondValue); + _microsecond = value; + _millisecond = value / 1000; + } + } + + #endregion + + #region IMySqlValue Members + + /// + /// Returns true if this datetime object has a null value + /// + public bool IsNull { get; } + + MySqlDbType IMySqlValue.MySqlDbType => _type; + + object IMySqlValue.Value => GetDateTime(); + + /// + /// Retrieves the value of this as a DateTime object. + /// + public DateTime Value => GetDateTime(); + + Type IMySqlValue.SystemType => typeof(DateTime); + + string IMySqlValue.MySqlTypeName + { + get + { + switch (_type) + { + case MySqlDbType.Date: return "DATE"; + case MySqlDbType.Newdate: return "NEWDATE"; + case MySqlDbType.Timestamp: return "TIMESTAMP"; + } + return "DATETIME"; + } + } + + private async Task SerializeTextAsync(MySqlPacket packet, MySqlDateTime value, bool execAsync) + { + var val = String.Format("{0:0000}-{1:00}-{2:00}", + value.Year, value.Month, value.Day); + if (_type != MySqlDbType.Date) + { + val = value.Microsecond > 0 ? + $"{val} {value.Hour:00}:{value.Minute:00}:{value.Second:00}.{value.Microsecond:000000}" + : $"{val} {value.Hour:00}:{value.Minute:00}:{value.Second:00}"; + } + + await packet.WriteStringNoNullAsync("timestamp('" + val + "')", execAsync).ConfigureAwait(false); + } + + async Task IMySqlValue.WriteValueAsync(MySqlPacket packet, bool binary, object value, int length, bool execAsync) + { + MySqlDateTime dtValue; + + string valueAsString = value as string; + + if (value is DateTime) + dtValue = new MySqlDateTime(_type, (DateTime)value); + else if (valueAsString != null) + dtValue = Parse(valueAsString); + else if (value is MySqlDateTime) + dtValue = (MySqlDateTime)value; + else if (value is DateTimeOffset) + dtValue = new MySqlDateTime(((DateTimeOffset)value).UtcDateTime); +#if NET6_0_OR_GREATER + else if (value is DateOnly) + dtValue = Parse(String.Format("{0:yyyy-MM-dd}", value)); +#endif + else + throw new MySqlException("Unable to serialize date/time value."); + + if (!binary) + { + await SerializeTextAsync(packet, dtValue, execAsync).ConfigureAwait(false); + return; + } + + if (dtValue.Microsecond > 0) + packet.WriteByte(11); + else + packet.WriteByte(7); + + await packet.WriteIntegerAsync(dtValue.Year, 2, execAsync).ConfigureAwait(false); + packet.WriteByte((byte)dtValue.Month); + packet.WriteByte((byte)dtValue.Day); + + if (_type == MySqlDbType.Date) + { + packet.WriteByte(0); + packet.WriteByte(0); + packet.WriteByte(0); + } + else + { + packet.WriteByte((byte)dtValue.Hour); + packet.WriteByte((byte)dtValue.Minute); + packet.WriteByte((byte)dtValue.Second); + } + + if (dtValue.Microsecond > 0) + { + long val = dtValue.Microsecond; + for (int x = 0; x < 4; x++) + { + packet.WriteByte((byte)(val & 0xff)); + val >>= 8; + } + } + } + + internal static MySqlDateTime Parse(string s) + { + MySqlDateTime dt = new MySqlDateTime(); + return dt.ParseMySql(s); + } + + internal static MySqlDateTime Parse(string s, DBVersion version) + { + MySqlDateTime dt = new MySqlDateTime(); + return dt.ParseMySql(s); + } + + private MySqlDateTime ParseMySql(string s) + { + string[] parts = s.Split('-', ' ', ':', '/', '.'); + + int year = int.Parse(parts[0], CultureInfo.InvariantCulture); + int month = int.Parse(parts[1], CultureInfo.InvariantCulture); + int day = int.Parse(parts[2], CultureInfo.InvariantCulture); + + int hour = 0, minute = 0, second = 0, microsecond = 0; + if (parts.Length > 3) + { + hour = int.Parse(parts[3], CultureInfo.InvariantCulture); + minute = int.Parse(parts[4], CultureInfo.InvariantCulture); + second = int.Parse(parts[5], CultureInfo.InvariantCulture); + } + + if (parts.Length > 6) + { + microsecond = int.Parse(parts[6].PadRight(6, '0'), CultureInfo.InvariantCulture); + } + + return new MySqlDateTime(_type, year, month, day, hour, minute, second, microsecond); + } + + async Task IMySqlValue.ReadValueAsync(MySqlPacket packet, long length, bool nullVal, bool execAsync) + { + if (nullVal) return new MySqlDateTime(_type, true); + + if (length >= 0) + { + string value = await packet.ReadStringAsync(length, execAsync).ConfigureAwait(false); + return ParseMySql(value); + } + + long bufLength = packet.ReadByte(); + int year = 0, month = 0, day = 0; + int hour = 0, minute = 0, second = 0, microsecond = 0; + if (bufLength >= 4) + { + year = packet.ReadInteger(2); + month = packet.ReadByte(); + day = packet.ReadByte(); + } + + if (bufLength > 4) + { + hour = packet.ReadByte(); + minute = packet.ReadByte(); + second = packet.ReadByte(); + } + + if (bufLength > 7) + { + microsecond = packet.Read3ByteInt(); + packet.ReadByte(); + } + + return new MySqlDateTime(_type, year, month, day, hour, minute, second, microsecond); + } + + void IMySqlValue.SkipValue(MySqlPacket packet) + { + int len = packet.ReadByte(); + packet.Position += len; + } + + #endregion + + /// Returns this value as a DateTime + public DateTime GetDateTime() + { + if (!IsValidDateTime) + throw new MySqlConversionException("Unable to convert MySQL date/time value to System.DateTime"); + + DateTimeKind kind = DateTimeKind.Unspecified; + if (_type == MySqlDbType.Timestamp) + { + if (TimezoneOffset == 0) + kind = DateTimeKind.Utc; + else + kind = DateTimeKind.Local; + } + + return new DateTime(Year, Month, Day, Hour, Minute, Second, kind).AddTicks(_microsecond * 10); + } + + private static string FormatDateCustom(string format, int monthVal, int dayVal, int yearVal) + { + format = format.Replace("MM", "{0:00}"); + format = format.Replace("M", "{0}"); + format = format.Replace("dd", "{1:00}"); + format = format.Replace("d", "{1}"); + format = format.Replace("yyyy", "{2:0000}"); + format = format.Replace("yy", "{3:00}"); + format = format.Replace("y", "{4:0}"); + + int year2digit = yearVal - ((yearVal / 1000) * 1000); + year2digit -= ((year2digit / 100) * 100); + int year1digit = year2digit - ((year2digit / 10) * 10); + + return String.Format(format, monthVal, dayVal, yearVal, year2digit, year1digit); + } + + /// Returns a MySQL specific string representation of this value + public override string ToString() + { + if (this.IsValidDateTime) + { + DateTime d = new DateTime(Year, Month, Day, Hour, Minute, Second).AddTicks(_microsecond * 10); + return (_type == MySqlDbType.Date) ? d.ToString("d", CultureInfo.InvariantCulture) : d.ToString(CultureInfo.InvariantCulture); + } + + string dateString = FormatDateCustom( + CultureInfo.CurrentUICulture.DateTimeFormat.ShortDatePattern, Month, Day, Year); + if (_type == MySqlDbType.Date) + return dateString; + + DateTime dt = new DateTime(1, 2, 3, Hour, Minute, Second).AddTicks(_microsecond * 10); + dateString = String.Format("{0} {1}", dateString, dt.ToLongTimeString()); + + return dateString; + } + + /// + /// + /// + public static explicit operator DateTime(MySqlDateTime val) + { + if (!val.IsValidDateTime) return DateTime.MinValue; + return val.GetDateTime(); + } + + internal static void SetDSInfo(MySqlSchemaCollection sc) + { + string[] types = new string[] { "DATE", "DATETIME", "TIMESTAMP" }; + MySqlDbType[] dbtype = new MySqlDbType[] { MySqlDbType.Date, + MySqlDbType.DateTime, MySqlDbType.Timestamp }; + + // we use name indexing because this method will only be called + // when GetSchema is called for the DataSourceInformation + // collection and then it wil be cached. + for (int x = 0; x < types.Length; x++) + { + MySqlSchemaRow row = sc.AddRow(); + row["TypeName"] = types[x]; + row["ProviderDbType"] = dbtype[x]; + row["ColumnSize"] = 0; + row["CreateFormat"] = types[x]; + row["CreateParameters"] = null; + row["DataType"] = "System.DateTime"; + row["IsAutoincrementable"] = false; + row["IsBestMatch"] = true; + row["IsCaseSensitive"] = false; + row["IsFixedLength"] = true; + row["IsFixedPrecisionScale"] = true; + row["IsLong"] = false; + row["IsNullable"] = true; + row["IsSearchable"] = true; + row["IsSearchableWithLike"] = false; + row["IsUnsigned"] = false; + row["MaximumScale"] = 0; + row["MinimumScale"] = 0; + row["IsConcurrencyType"] = DBNull.Value; + row["IsLiteralSupported"] = false; + row["LiteralPrefix"] = null; + row["LiteralSuffix"] = null; + row["NativeDataType"] = null; + } + } + + #region IComparable Members + + int IComparable.CompareTo(object obj) + { + MySqlDateTime otherDate = (MySqlDateTime)obj; + + if (Year < otherDate.Year) return -1; + else if (Year > otherDate.Year) return 1; + + if (Month < otherDate.Month) return -1; + else if (Month > otherDate.Month) return 1; + + if (Day < otherDate.Day) return -1; + else if (Day > otherDate.Day) return 1; + + if (Hour < otherDate.Hour) return -1; + else if (Hour > otherDate.Hour) return 1; + + if (Minute < otherDate.Minute) return -1; + else if (Minute > otherDate.Minute) return 1; + + if (Second < otherDate.Second) return -1; + else if (Second > otherDate.Second) return 1; + + if (Microsecond < otherDate.Microsecond) return -1; + else if (Microsecond > otherDate.Microsecond) return 1; + + return 0; + } + + #endregion + + #region IConvertible Members + DateTime IConvertible.ToDateTime(IFormatProvider provider) + { + return GetDateTime(); + } + + string IConvertible.ToString(IFormatProvider provider) + { + return GetDateTime().ToString(provider); + } + + TypeCode IConvertible.GetTypeCode() + { + return TypeCode.DateTime; + } + + object IConvertible.ToType(Type conversionType, IFormatProvider provider) + { + return conversionType == typeof(DateTime) ? (object)GetDateTime() : + conversionType == typeof(string) ? ((IConvertible)this).ToString(provider) + : throw new InvalidCastException(); + } + + ulong IConvertible.ToUInt64(IFormatProvider provider) => throw new InvalidCastException(); + sbyte IConvertible.ToSByte(IFormatProvider provider) => throw new InvalidCastException(); + double IConvertible.ToDouble(IFormatProvider provider) => throw new InvalidCastException(); + float IConvertible.ToSingle(IFormatProvider provider) => throw new InvalidCastException(); + bool IConvertible.ToBoolean(IFormatProvider provider) => throw new InvalidCastException(); + int IConvertible.ToInt32(IFormatProvider provider) => throw new InvalidCastException(); + ushort IConvertible.ToUInt16(IFormatProvider provider) => throw new InvalidCastException(); + short IConvertible.ToInt16(IFormatProvider provider) => throw new InvalidCastException(); + byte IConvertible.ToByte(IFormatProvider provider) => throw new InvalidCastException(); + char IConvertible.ToChar(IFormatProvider provider) => throw new InvalidCastException(); + long IConvertible.ToInt64(IFormatProvider provider) => throw new InvalidCastException(); + decimal IConvertible.ToDecimal(IFormatProvider provider) => throw new InvalidCastException(); + uint IConvertible.ToUInt32(IFormatProvider provider) => throw new InvalidCastException(); + #endregion + + } +} diff --git a/MySQL.Data/src/Types/MySqlDecimal.cs b/MySQL.Data/src/Types/MySqlDecimal.cs new file mode 100644 index 000000000..13780c88c --- /dev/null +++ b/MySQL.Data/src/Types/MySqlDecimal.cs @@ -0,0 +1,162 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Globalization; +using System.Threading.Tasks; + +namespace MySql.Data.Types +{ + /// + /// Represents a decimal data type object in a MySql database. + /// + public struct MySqlDecimal : IMySqlValue + { + private readonly string _value; + + internal MySqlDecimal(bool isNull) + { + IsNull = isNull; + _value = null; + Precision = Scale = 0; + } + + internal MySqlDecimal(string val) + { + this.IsNull = false; + Precision = Scale = 0; + _value = val; + } + + #region IMySqlValue Members + + /// + /// Gets a boolean value signaling if the type is null. + /// + public bool IsNull { get; } + + MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.Decimal; + + /// + /// Gets or sets the decimal precision of the type. + /// + public byte Precision { get; set; } + + /// + /// Gets or sets the scale of the type. + /// + public byte Scale { get; set; } + + + object IMySqlValue.Value => Value; + + /// + /// Gets the decimal value associated to this type. + /// + public decimal Value => Convert.ToDecimal(_value, CultureInfo.InvariantCulture); + + /// + /// Converts this decimal value to a double value. + /// + /// The value of this type converted to a dobule value. + public double ToDouble() + { + return Double.Parse(_value, CultureInfo.InvariantCulture); + } + + public override string ToString() + { + return _value; + } + + Type IMySqlValue.SystemType => typeof(decimal); + + string IMySqlValue.MySqlTypeName => "DECIMAL"; + + async Task IMySqlValue.WriteValueAsync(MySqlPacket packet, bool binary, object val, int length, bool execAsync) + { + decimal v = val as decimal? ?? Convert.ToDecimal(val); + string valStr = v.ToString(CultureInfo.InvariantCulture); + + if (binary) + await packet.WriteLenStringAsync(valStr, execAsync).ConfigureAwait(false); + else + await packet.WriteStringNoNullAsync(valStr, execAsync).ConfigureAwait(false); + } + + async Task IMySqlValue.ReadValueAsync(MySqlPacket packet, long length, bool nullVal, bool execAsync) + { + if (nullVal) + return new MySqlDecimal(true); + + string s = String.Empty; + s = length == -1 ? await packet.ReadLenStringAsync(execAsync).ConfigureAwait(false) : await packet.ReadStringAsync(length, execAsync).ConfigureAwait(false); + return new MySqlDecimal(s); + } + + void IMySqlValue.SkipValue(MySqlPacket packet) + { + int len = (int)packet.ReadFieldLength(); + packet.Position += len; + } + + #endregion + + internal static void SetDSInfo(MySqlSchemaCollection sc) + { + // we use name indexing because this method will only be called + // when GetSchema is called for the DataSourceInformation + // collection and then it wil be cached. + MySqlSchemaRow row = sc.AddRow(); + row["TypeName"] = "DECIMAL"; + row["ProviderDbType"] = MySqlDbType.NewDecimal; + row["ColumnSize"] = 0; + row["CreateFormat"] = "DECIMAL({0},{1})"; + row["CreateParameters"] = "precision,scale"; + row["DataType"] = "System.Decimal"; + row["IsAutoincrementable"] = false; + row["IsBestMatch"] = true; + row["IsCaseSensitive"] = false; + row["IsFixedLength"] = true; + row["IsFixedPrecisionScale"] = true; + row["IsLong"] = false; + row["IsNullable"] = true; + row["IsSearchable"] = true; + row["IsSearchableWithLike"] = false; + row["IsUnsigned"] = false; + row["MaximumScale"] = 0; + row["MinimumScale"] = 0; + row["IsConcurrencyType"] = DBNull.Value; + row["IsLiteralSupported"] = false; + row["LiteralPrefix"] = null; + row["LiteralSuffix"] = null; + row["NativeDataType"] = null; + } + } +} diff --git a/MySQL.Data/src/Types/MySqlDouble.cs b/MySQL.Data/src/Types/MySqlDouble.cs new file mode 100644 index 000000000..de72338fe --- /dev/null +++ b/MySQL.Data/src/Types/MySqlDouble.cs @@ -0,0 +1,145 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Globalization; +using System.Threading.Tasks; + +namespace MySql.Data.Types +{ + + internal struct MySqlDouble : IMySqlValue + { + public MySqlDouble(bool isNull) + { + IsNull = isNull; + Value = 0.0; + } + + public MySqlDouble(double val) + { + IsNull = false; + Value = val; + } + + #region IMySqlValue Members + + public bool IsNull { get; } + + MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.Double; + + object IMySqlValue.Value => Value; + + public double Value { get; } + + Type IMySqlValue.SystemType => typeof(double); + + string IMySqlValue.MySqlTypeName => "DOUBLE"; + + async Task IMySqlValue.WriteValueAsync(MySqlPacket packet, bool binary, object val, int length, bool execAsync) + { + double v = val as double? ?? Convert.ToDouble(val); + if (binary) + await packet.WriteAsync(PacketBitConverter.GetBytes(v), execAsync).ConfigureAwait(false); + else + await packet.WriteStringNoNullAsync(v.ToString("R", CultureInfo.InvariantCulture), execAsync).ConfigureAwait(false); + } + + async Task IMySqlValue.ReadValueAsync(MySqlPacket packet, long length, bool nullVal, bool execAsync) + { + if (nullVal) + return new MySqlDouble(true); + + if (length == -1) + { + byte[] b = new byte[8]; + await packet.ReadAsync(b, 0, 8, execAsync).ConfigureAwait(false); + return new MySqlDouble(PacketBitConverter.ToDouble(b, 0)); + } + + string s = await packet.ReadStringAsync(length, execAsync).ConfigureAwait(false); + double d; + + try + { + d = Double.Parse(s, CultureInfo.InvariantCulture); + } + catch (OverflowException) + { + // MySQL server < 5.5 can return values not compatible with + // Double.Parse(), i.e out of range for double. + + if (s.StartsWith("-", StringComparison.Ordinal)) + d = double.MinValue; + else + d = double.MaxValue; + } + + return new MySqlDouble(d); + } + + void IMySqlValue.SkipValue(MySqlPacket packet) + { + packet.Position += 8; + } + + #endregion + + internal static void SetDSInfo(MySqlSchemaCollection sc) + { + // we use name indexing because this method will only be called + // when GetSchema is called for the DataSourceInformation + // collection and then it wil be cached. + MySqlSchemaRow row = sc.AddRow(); + row["TypeName"] = "DOUBLE"; + row["ProviderDbType"] = MySqlDbType.Double; + row["ColumnSize"] = 0; + row["CreateFormat"] = "DOUBLE"; + row["CreateParameters"] = null; + row["DataType"] = "System.Double"; + row["IsAutoincrementable"] = false; + row["IsBestMatch"] = true; + row["IsCaseSensitive"] = false; + row["IsFixedLength"] = true; + row["IsFixedPrecisionScale"] = true; + row["IsLong"] = false; + row["IsNullable"] = true; + row["IsSearchable"] = true; + row["IsSearchableWithLike"] = false; + row["IsUnsigned"] = false; + row["MaximumScale"] = 0; + row["MinimumScale"] = 0; + row["IsConcurrencyType"] = DBNull.Value; + row["IsLiteralSupported"] = false; + row["LiteralPrefix"] = null; + row["LiteralSuffix"] = null; + row["NativeDataType"] = null; + } + } +} diff --git a/MySQL.Data/src/Types/MySqlGeometry.cs b/MySQL.Data/src/Types/MySqlGeometry.cs new file mode 100644 index 000000000..9472e4b51 --- /dev/null +++ b/MySQL.Data/src/Types/MySqlGeometry.cs @@ -0,0 +1,395 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Globalization; +using System.Threading.Tasks; + +namespace MySql.Data.Types +{ + //Bytes structure is: + //SRID [0 - 3] + //Byte order [4] + //WKB type [5 - 8] + //X [9 - 16] + //Y [17 - 24] + //The byte order may be either 1 or 0 to indicate little-endian or + //big-endian storage. The little-endian and big-endian byte orders + //are also known as Network Data Representation (NDR) and External + //Data Representation (XDR), respectively. + + //The WKB type is a code that indicates the geometry type. Values + //from 1 through 7 indicate Point, LineString, Polygon, MultiPoint, + //MultiLineString, MultiPolygon, and GeometryCollection. + + /// + /// Represents a geometry data type object in a MySql database. + /// + public struct MySqlGeometry : IMySqlValue + { + private readonly MySqlDbType _type; + private readonly Double _xValue; + private readonly Double _yValue; + private readonly int _srid; + + private const int GEOMETRY_LENGTH = 25; + + /// + /// Gets the x coordinate. + /// + public Double? XCoordinate => _xValue; + + /// + /// Gets the y coordinate. + /// + public Double? YCoordinate => _yValue; + + /// + /// Gets the SRID value. + /// + public int? SRID => _srid; + + public MySqlGeometry(bool isNull) : this(MySqlDbType.Geometry, isNull) + { + } + + public MySqlGeometry(Double xValue, Double yValue) + : this(MySqlDbType.Geometry, xValue, yValue, 0) + { } + + public MySqlGeometry(Double xValue, Double yValue, int srid) + : this(MySqlDbType.Geometry, xValue, yValue, srid) + { } + + + internal MySqlGeometry(MySqlDbType type, bool isNull) + { + this._type = type; + isNull = true; + _xValue = 0; + _yValue = 0; + _srid = 0; + Value = null; + this.IsNull = isNull; + } + + + internal MySqlGeometry(MySqlDbType type, Double xValue, Double yValue, int srid) + { + this._type = type; + this._xValue = xValue; + this._yValue = yValue; + this.IsNull = false; + this._srid = srid; + this.Value = new byte[GEOMETRY_LENGTH]; + + byte[] sridBinary = PacketBitConverter.GetBytes(srid); + + for (int i = 0; i < sridBinary.Length; i++) + Value[i] = sridBinary[i]; + + long xVal = BitConverter.DoubleToInt64Bits(xValue); + long yVal = BitConverter.DoubleToInt64Bits(yValue); + + Value[4] = 1; + Value[5] = 1; + + for (int i = 0; i < 8; i++) + { + Value[i + 9] = (byte)(xVal & 0xff); + xVal >>= 8; + } + + for (int i = 0; i < 8; i++) + { + Value[i + 17] = (byte)(yVal & 0xff); + yVal >>= 8; + } + } + + public MySqlGeometry(MySqlDbType type, byte[] val) + { + + if (val == null) + throw new ArgumentNullException(nameof(val)); + + byte[] buffValue = new byte[val.Length]; + + for (int i = 0; i < val.Length; i++) + buffValue[i] = val[i]; + + var xIndex = val.Length == GEOMETRY_LENGTH ? 9 : 5; + var yIndex = val.Length == GEOMETRY_LENGTH ? 17 : 13; + + Value = buffValue; + _xValue = val.Length >= xIndex + 8 ? PacketBitConverter.ToDouble(val, xIndex) : 0; + _yValue = val.Length >= yIndex + 8 ? PacketBitConverter.ToDouble(val, yIndex) : 0; + this._srid = val.Length == GEOMETRY_LENGTH ? PacketBitConverter.ToInt32(val, 0) : 0; + this.IsNull = false; + this._type = type; + } + + #region IMySqlValue Members + + + MySqlDbType IMySqlValue.MySqlDbType => _type; + + /// + /// Gets a boolean value that signals if the type is null. + /// + public bool IsNull { get; } + + /// + /// Gets the value associated to this type. + /// + object IMySqlValue.Value => Value; + + /// + /// Gets the value associated to this type. + /// + public byte[] Value { get; } + + Type IMySqlValue.SystemType => typeof(byte[]); + + string IMySqlValue.MySqlTypeName => "GEOMETRY"; + + async Task IMySqlValue.WriteValueAsync(MySqlPacket packet, bool binary, object val, int length, bool execAsync) + { + byte[] buffToWrite = null; + + try + { + buffToWrite = ((MySqlGeometry)val).Value; + } + catch + { + buffToWrite = val as Byte[]; + } + + if (buffToWrite == null) + { + MySqlGeometry v = new MySqlGeometry(0, 0); + MySqlGeometry.TryParse(val.ToString(), out v); + buffToWrite = v.Value; + } + + byte[] result = new byte[GEOMETRY_LENGTH]; + + for (int i = 0; i < buffToWrite.Length; i++) + { + if (buffToWrite.Length < GEOMETRY_LENGTH) + result[i + 4] = buffToWrite[i]; + else + result[i] = buffToWrite[i]; + } + + if (!binary) + { + await packet.WriteStringNoNullAsync("_binary ", execAsync).ConfigureAwait(false); + packet.WriteByte((byte)'\''); + EscapeByteArray(result, GEOMETRY_LENGTH, packet); + packet.WriteByte((byte)'\''); + } + else + await packet.WriteLenStringAsync(val.ToString(), execAsync).ConfigureAwait(false); + } + + private static void EscapeByteArray(byte[] bytes, int length, MySqlPacket packet) + { + for (int x = 0; x < length; x++) + { + byte b = bytes[x]; + if (b == '\0') + { + packet.WriteByte((byte)'\\'); + packet.WriteByte((byte)'0'); + } + + else if (b == '\\' || b == '\'' || b == '\"') + { + packet.WriteByte((byte)'\\'); + packet.WriteByte(b); + } + else + packet.WriteByte(b); + } + } + + async Task IMySqlValue.ReadValueAsync(MySqlPacket packet, long length, bool nullVal, bool execAsync) + { + MySqlGeometry g; + if (nullVal) + g = new MySqlGeometry(_type, true); + else + { + if (length == -1) + length = (long)packet.ReadFieldLength(); + + byte[] newBuff = new byte[length]; + await packet.ReadAsync(newBuff, 0, (int)length, execAsync).ConfigureAwait(false); + g = new MySqlGeometry(_type, newBuff); + } + return g; + } + + void IMySqlValue.SkipValue(MySqlPacket packet) + { + int len = (int)packet.ReadFieldLength(); + packet.Position += len; + } + + #endregion + + + /// Returns the Well-Known Text representation of this value + /// POINT({0} {1})", longitude, latitude + /// http://dev.mysql.com/doc/refman/4.1/en/gis-wkt-format.html + public override string ToString() + { + if (!this.IsNull) + return _srid != 0 ? string.Format(CultureInfo.InvariantCulture.NumberFormat, "SRID={2};POINT({0} {1})", _xValue, _yValue, _srid) : string.Format(CultureInfo.InvariantCulture.NumberFormat, "POINT({0} {1})", _xValue, _yValue); + + return String.Empty; + } + + /// + /// Get value from WKT format + /// SRID=0;POINT (x y) or POINT (x y) + /// + /// WKT string format + public static MySqlGeometry Parse(string value) + { + if (String.IsNullOrEmpty(value)) + throw new ArgumentNullException(nameof(value)); + + if (!(value.Contains("SRID") || value.Contains("POINT(") || value.Contains("POINT ("))) + throw new FormatException("String does not contain a valid geometry value"); + + MySqlGeometry result = new MySqlGeometry(0, 0); + MySqlGeometry.TryParse(value, out result); + + return result; + } + + /// + /// Try to get value from WKT format + /// SRID=0;POINT (x y) or POINT (x y) + /// + /// WKT string format + /// Out mysqlGeometryValue + public static bool TryParse(string value, out MySqlGeometry mySqlGeometryValue) + { + string[] arrayResult = new string[0]; + string strResult = string.Empty; + bool hasX = false; + bool hasY = false; + Double xVal = 0; + Double yVal = 0; + int sridValue = 0; + + try + { + if (value.Contains(";")) + arrayResult = value.Split(';'); + else + strResult = value; + + if (arrayResult.Length > 1 || strResult != String.Empty) + { + string point = strResult != String.Empty ? strResult : arrayResult[1]; + point = point.Replace("POINT (", "").Replace("POINT(", "").Replace(")", ""); + var coord = point.Split(' '); + if (coord.Length > 1) + { + hasX = Double.TryParse(coord[0], out xVal); + hasY = Double.TryParse(coord[1], out yVal); + } + if (arrayResult.Length >= 1) + Int32.TryParse(arrayResult[0].Replace("SRID=", ""), out sridValue); + } + if (hasX && hasY) + { + mySqlGeometryValue = new MySqlGeometry(xVal, yVal, sridValue); + return true; + } + } + catch + { } + + mySqlGeometryValue = new MySqlGeometry(true); + return false; + } + + /// + /// Sets the DSInfo when GetSchema is called for the DataSourceInformation collection. + /// + public static void SetDSInfo(MySqlSchemaCollection dsTable) + { + // we use name indexing because this method will only be called + // when GetSchema is called for the DataSourceInformation + // collection and then it wil be cached. + MySqlSchemaRow row = dsTable.AddRow(); + row["TypeName"] = "GEOMETRY"; + row["ProviderDbType"] = MySqlDbType.Geometry; + row["ColumnSize"] = GEOMETRY_LENGTH; + row["CreateFormat"] = "GEOMETRY"; + row["CreateParameters"] = DBNull.Value; ; + row["DataType"] = "System.Byte[]"; + row["IsAutoincrementable"] = false; + row["IsBestMatch"] = true; + row["IsCaseSensitive"] = false; + row["IsFixedLength"] = false; + row["IsFixedPrecisionScale"] = true; + row["IsLong"] = false; + row["IsNullable"] = true; + row["IsSearchable"] = true; + row["IsSearchableWithLike"] = false; + row["IsUnsigned"] = false; + row["MaximumScale"] = 0; + row["MinimumScale"] = 0; + row["IsConcurrencyType"] = DBNull.Value; + row["IsLiteralSupported"] = false; + row["LiteralPrefix"] = DBNull.Value; + row["LiteralSuffix"] = DBNull.Value; + row["NativeDataType"] = DBNull.Value; + } + + /// + /// Gets the well-known text representation of the geomtry object. + /// + /// A string representation of the WKT. + public string GetWKT() + { + if (!this.IsNull) + return string.Format(CultureInfo.InvariantCulture.NumberFormat, "POINT({0} {1})", _xValue, _yValue); + + return String.Empty; + } + } +} diff --git a/MySQL.Data/src/Types/MySqlGuid.cs b/MySQL.Data/src/Types/MySqlGuid.cs new file mode 100644 index 000000000..5651a7501 --- /dev/null +++ b/MySQL.Data/src/Types/MySqlGuid.cs @@ -0,0 +1,209 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Threading.Tasks; + +namespace MySql.Data.Types +{ + internal struct MySqlGuid : IMySqlValue + { + public MySqlGuid(byte[] buff) + { + OldGuids = false; + Value = new Guid(buff); + IsNull = false; + Bytes = buff; + } + + public byte[] Bytes { get; } + + public bool OldGuids { get; set; } + + #region IMySqlValue Members + + public bool IsNull { get; private set; } + + MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.Guid; + + object IMySqlValue.Value => Value; + + public Guid Value { get; private set; } + + Type IMySqlValue.SystemType => typeof(Guid); + + string IMySqlValue.MySqlTypeName => OldGuids ? "BINARY(16)" : "CHAR(36)"; + + async Task IMySqlValue.WriteValueAsync(MySqlPacket packet, bool binary, object val, int length, bool execAsync) + { + Guid guid = Guid.Empty; + string valAsString = val as string; + byte[] valAsByte = val as byte[]; + + if (val is Guid) + guid = (Guid)val; + else + { + try + { + if (valAsString != null) + guid = new Guid(valAsString); + else if (valAsByte != null) + guid = new Guid(valAsByte); + } + catch (Exception ex) + { + throw new MySqlException(Resources.DataNotInSupportedFormat, ex); + } + } + + if (OldGuids) + await WriteOldGuidAsync(packet, guid, binary, execAsync).ConfigureAwait(false); + else + { + guid.ToString("D"); + + if (binary) + await packet.WriteLenStringAsync(guid.ToString("D"), execAsync).ConfigureAwait(false); + else + await packet.WriteStringNoNullAsync("'" + MySqlHelper.EscapeString(guid.ToString("D")) + "'", execAsync).ConfigureAwait(false); + } + } + + private async Task WriteOldGuidAsync(MySqlPacket packet, Guid guid, bool binary, bool execAsync) + { + byte[] bytes = guid.ToByteArray(); + + if (binary) + { + await packet.WriteLengthAsync(bytes.Length, execAsync).ConfigureAwait(false); + await packet.WriteAsync(bytes, execAsync).ConfigureAwait(false); + } + else + { + await packet.WriteStringNoNullAsync("_binary ", execAsync).ConfigureAwait(false); + packet.WriteByte((byte)'\''); + EscapeByteArray(bytes, bytes.Length, packet); + packet.WriteByte((byte)'\''); + } + } + + private static void EscapeByteArray(byte[] bytes, int length, MySqlPacket packet) + { + for (int x = 0; x < length; x++) + { + byte b = bytes[x]; + if (b == '\0') + { + packet.WriteByte((byte)'\\'); + packet.WriteByte((byte)'0'); + } + + else if (b == '\\' || b == '\'' || b == '\"') + { + packet.WriteByte((byte)'\\'); + packet.WriteByte(b); + } + else + packet.WriteByte(b); + } + } + + private async Task ReadOldGuidAsync(MySqlPacket packet, long length, bool execAsync) + { + if (length == -1) + length = (long)packet.ReadFieldLength(); + + byte[] buff = new byte[length]; + await packet.ReadAsync(buff, 0, (int)length, execAsync).ConfigureAwait(false); + MySqlGuid g = new MySqlGuid(buff); + g.OldGuids = OldGuids; + return g; + } + + async Task IMySqlValue.ReadValueAsync(MySqlPacket packet, long length, bool nullVal, bool execAsync) + { + MySqlGuid g = new MySqlGuid(); + g.IsNull = true; + g.OldGuids = OldGuids; + if (!nullVal) + { + if (OldGuids) + return await ReadOldGuidAsync(packet, length, execAsync).ConfigureAwait(false); + string s = String.Empty; + if (length == -1) + s = await packet.ReadLenStringAsync(execAsync).ConfigureAwait(false); + else + s = await packet.ReadStringAsync(length, execAsync).ConfigureAwait(false); + g.Value = new Guid(s); + g.IsNull = false; + } + return g; + } + + void IMySqlValue.SkipValue(MySqlPacket packet) + { + int len = (int)packet.ReadFieldLength(); + packet.Position += len; + } + + #endregion + + public static void SetDSInfo(MySqlSchemaCollection sc) + { + // we use name indexing because this method will only be called + // when GetSchema is called for the DataSourceInformation + // collection and then it wil be cached. + MySqlSchemaRow row = sc.AddRow(); + row["TypeName"] = "GUID"; + row["ProviderDbType"] = MySqlDbType.Guid; + row["ColumnSize"] = 0; + row["CreateFormat"] = "BINARY(16)"; + row["CreateParameters"] = null; + row["DataType"] = "System.Guid"; + row["IsAutoincrementable"] = false; + row["IsBestMatch"] = true; + row["IsCaseSensitive"] = false; + row["IsFixedLength"] = true; + row["IsFixedPrecisionScale"] = true; + row["IsLong"] = false; + row["IsNullable"] = true; + row["IsSearchable"] = false; + row["IsSearchableWithLike"] = false; + row["IsUnsigned"] = false; + row["MaximumScale"] = 0; + row["MinimumScale"] = 0; + row["IsConcurrencyType"] = DBNull.Value; + row["IsLiteralSupported"] = false; + row["LiteralPrefix"] = null; + row["LiteralSuffix"] = null; + row["NativeDataType"] = null; + } + } +} diff --git a/MySQL.Data/src/Types/MySqlInt16.cs b/MySQL.Data/src/Types/MySqlInt16.cs new file mode 100644 index 000000000..96a9577e0 --- /dev/null +++ b/MySQL.Data/src/Types/MySqlInt16.cs @@ -0,0 +1,123 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Globalization; +using System.Threading.Tasks; + +namespace MySql.Data.Types +{ + internal struct MySqlInt16 : IMySqlValue + { + public MySqlInt16(bool isNull) + { + IsNull = isNull; + Value = 0; + } + + public MySqlInt16(short val) + { + IsNull = false; + Value = val; + } + + #region IMySqlValue Members + + public bool IsNull { get; } + + MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.Int16; + + object IMySqlValue.Value => Value; + + public short Value { get; } + + Type IMySqlValue.SystemType => typeof(short); + + string IMySqlValue.MySqlTypeName => "SMALLINT"; + + async Task IMySqlValue.WriteValueAsync(MySqlPacket packet, bool binary, object val, int length, bool execAsync) + { + int v = val as int? ?? Convert.ToInt32(val); + + if (binary) + await packet.WriteIntegerAsync((long)v, 2, execAsync).ConfigureAwait(false); + else + await packet.WriteStringNoNullAsync(v.ToString(CultureInfo.InvariantCulture), execAsync).ConfigureAwait(false); + } + + async Task IMySqlValue.ReadValueAsync(MySqlPacket packet, long length, bool nullVal, bool execAsync) + { + if (nullVal) + return new MySqlInt16(true); + + if (length == -1) + return new MySqlInt16((short)packet.ReadInteger(2)); + else + return new MySqlInt16(Int16.Parse(await packet.ReadStringAsync(length, execAsync).ConfigureAwait(false), CultureInfo.InvariantCulture)); + } + + void IMySqlValue.SkipValue(MySqlPacket packet) + { + packet.Position += 2; + } + + #endregion + + internal static void SetDSInfo(MySqlSchemaCollection sc) + { + // we use name indexing because this method will only be called + // when GetSchema is called for the DataSourceInformation + // collection and then it wil be cached. + MySqlSchemaRow row = sc.AddRow(); + row["TypeName"] = "SMALLINT"; + row["ProviderDbType"] = MySqlDbType.Int16; + row["ColumnSize"] = 0; + row["CreateFormat"] = "SMALLINT"; + row["CreateParameters"] = null; + row["DataType"] = "System.Int16"; + row["IsAutoincrementable"] = true; + row["IsBestMatch"] = true; + row["IsCaseSensitive"] = false; + row["IsFixedLength"] = true; + row["IsFixedPrecisionScale"] = true; + row["IsLong"] = false; + row["IsNullable"] = true; + row["IsSearchable"] = true; + row["IsSearchableWithLike"] = false; + row["IsUnsigned"] = false; + row["MaximumScale"] = 0; + row["MinimumScale"] = 0; + row["IsConcurrencyType"] = DBNull.Value; + row["IsLiteralSupported"] = false; + row["LiteralPrefix"] = null; + row["LiteralSuffix"] = null; + row["NativeDataType"] = null; + } + } +} diff --git a/MySQL.Data/src/Types/MySqlInt32.cs b/MySQL.Data/src/Types/MySqlInt32.cs new file mode 100644 index 000000000..81aaba5af --- /dev/null +++ b/MySQL.Data/src/Types/MySqlInt32.cs @@ -0,0 +1,143 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Globalization; +using System.Threading.Tasks; + +namespace MySql.Data.Types +{ + internal struct MySqlInt32 : IMySqlValue + { + private readonly int _value; + private readonly bool _is24Bit; + + private MySqlInt32(MySqlDbType type) + { + _is24Bit = type == MySqlDbType.Int24; + IsNull = true; + _value = 0; + } + + public MySqlInt32(MySqlDbType type, bool isNull) + : this(type) + { + IsNull = isNull; + } + + public MySqlInt32(MySqlDbType type, int val) + : this(type) + { + IsNull = false; + _value = val; + } + + #region IMySqlValue Members + + public bool IsNull { get; } + + MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.Int32; + + object IMySqlValue.Value => _value; + + public int Value => _value; + + Type IMySqlValue.SystemType => typeof(Int32); + + string IMySqlValue.MySqlTypeName => _is24Bit ? "MEDIUMINT" : "INT"; + + async Task IMySqlValue.WriteValueAsync(MySqlPacket packet, bool binary, object val, int length, bool execAsync) + { + int v = val as int? ?? Convert.ToInt32(val); + + if (binary) + await packet.WriteIntegerAsync(v, 4, execAsync).ConfigureAwait(false); + else + await packet.WriteStringNoNullAsync(v.ToString(CultureInfo.InvariantCulture), execAsync).ConfigureAwait(false); + } + + async Task IMySqlValue.ReadValueAsync(MySqlPacket packet, long length, bool nullVal, bool execAsync) + { + if (nullVal) + return new MySqlInt32((this as IMySqlValue).MySqlDbType, true); + + if (length == -1) + return new MySqlInt32((this as IMySqlValue).MySqlDbType, + packet.ReadInteger(4)); + else + return new MySqlInt32((this as IMySqlValue).MySqlDbType, Int32.Parse(await packet.ReadStringAsync(length, execAsync).ConfigureAwait(false), + CultureInfo.InvariantCulture)); + } + + void IMySqlValue.SkipValue(MySqlPacket packet) + { + packet.Position += 4; + } + + #endregion + + internal static void SetDSInfo(MySqlSchemaCollection sc) + { + string[] types = new string[] { "INT", "YEAR", "MEDIUMINT" }; + MySqlDbType[] dbtype = new MySqlDbType[] { MySqlDbType.Int32, + MySqlDbType.Year, MySqlDbType.Int24 }; + + // we use name indexing because this method will only be called + // when GetSchema is called for the DataSourceInformation + // collection and then it wil be cached. + for (int x = 0; x < types.Length; x++) + { + MySqlSchemaRow row = sc.AddRow(); + row["TypeName"] = types[x]; + row["ProviderDbType"] = dbtype[x]; + row["ColumnSize"] = 0; + row["CreateFormat"] = types[x]; + row["CreateParameters"] = null; + row["DataType"] = "System.Int32"; + row["IsAutoincrementable"] = dbtype[x] != MySqlDbType.Year; + row["IsBestMatch"] = true; + row["IsCaseSensitive"] = false; + row["IsFixedLength"] = true; + row["IsFixedPrecisionScale"] = true; + row["IsLong"] = false; + row["IsNullable"] = true; + row["IsSearchable"] = true; + row["IsSearchableWithLike"] = false; + row["IsUnsigned"] = false; + row["MaximumScale"] = 0; + row["MinimumScale"] = 0; + row["IsConcurrencyType"] = DBNull.Value; + row["IsLiteralSupported"] = false; + row["LiteralPrefix"] = null; + row["LiteralSuffix"] = null; + row["NativeDataType"] = null; + } + } + } +} diff --git a/MySQL.Data/src/Types/MySqlInt64.cs b/MySQL.Data/src/Types/MySqlInt64.cs new file mode 100644 index 000000000..b0bae03ed --- /dev/null +++ b/MySQL.Data/src/Types/MySqlInt64.cs @@ -0,0 +1,125 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Globalization; +using System.Threading.Tasks; + +namespace MySql.Data.Types +{ + internal struct MySqlInt64 : IMySqlValue + { + public MySqlInt64(bool isNull) + { + IsNull = isNull; + Value = 0; + } + + public MySqlInt64(long val) + { + IsNull = false; + Value = val; + } + + #region IMySqlValue Members + + public bool IsNull { get; } + + MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.Int64; + + object IMySqlValue.Value => Value; + + public long Value { get; } + + Type IMySqlValue.SystemType => typeof(long); + + string IMySqlValue.MySqlTypeName + { + get { return "BIGINT"; } + } + + async Task IMySqlValue.WriteValueAsync(MySqlPacket packet, bool binary, object val, int length, bool execAsync) + { + long v = val as Int64? ?? Convert.ToInt64(val); + if (binary) + await packet.WriteIntegerAsync(v, 8, execAsync).ConfigureAwait(false); + else + await packet.WriteStringNoNullAsync(v.ToString(CultureInfo.InvariantCulture), execAsync).ConfigureAwait(false); + } + + async Task IMySqlValue.ReadValueAsync(MySqlPacket packet, long length, bool nullVal, bool execAsync) + { + if (nullVal) + return new MySqlInt64(true); + + if (length == -1) + return new MySqlInt64((long)packet.ReadULong(8)); + else + return new MySqlInt64(Int64.Parse(await packet.ReadStringAsync(length, execAsync).ConfigureAwait(false), CultureInfo.InvariantCulture)); + } + + void IMySqlValue.SkipValue(MySqlPacket packet) + { + packet.Position += 8; + } + + #endregion + + internal static void SetDSInfo(MySqlSchemaCollection sc) + { + // we use name indexing because this method will only be called + // when GetSchema is called for the DataSourceInformation + // collection and then it wil be cached. + MySqlSchemaRow row = sc.AddRow(); + row["TypeName"] = "BIGINT"; + row["ProviderDbType"] = MySqlDbType.Int64; + row["ColumnSize"] = 0; + row["CreateFormat"] = "BIGINT"; + row["CreateParameters"] = null; + row["DataType"] = "System.Int64"; + row["IsAutoincrementable"] = true; + row["IsBestMatch"] = true; + row["IsCaseSensitive"] = false; + row["IsFixedLength"] = true; + row["IsFixedPrecisionScale"] = true; + row["IsLong"] = false; + row["IsNullable"] = true; + row["IsSearchable"] = true; + row["IsSearchableWithLike"] = false; + row["IsUnsigned"] = false; + row["MaximumScale"] = 0; + row["MinimumScale"] = 0; + row["IsConcurrencyType"] = DBNull.Value; + row["IsLiteralSupported"] = false; + row["LiteralPrefix"] = null; + row["LiteralSuffix"] = null; + row["NativeDataType"] = null; + } + } +} diff --git a/MySQL.Data/src/Types/MySqlSingle.cs b/MySQL.Data/src/Types/MySqlSingle.cs new file mode 100644 index 000000000..5973d4542 --- /dev/null +++ b/MySQL.Data/src/Types/MySqlSingle.cs @@ -0,0 +1,130 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Globalization; +using System.Threading.Tasks; + +namespace MySql.Data.Types +{ + internal struct MySqlSingle : IMySqlValue + { + public MySqlSingle(bool isNull) + { + IsNull = isNull; + Value = 0.0f; + } + + public MySqlSingle(float val) + { + IsNull = false; + Value = val; + } + + #region IMySqlValue Members + + public bool IsNull { get; } + + MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.Float; + + object IMySqlValue.Value => Value; + + public float Value { get; } + + Type IMySqlValue.SystemType => typeof(float); + + string IMySqlValue.MySqlTypeName + { + get { return "FLOAT"; } + } + + async Task IMySqlValue.WriteValueAsync(MySqlPacket packet, bool binary, object val, int length, bool execAsync) + { + Single v = val as Single? ?? Convert.ToSingle(val); + if (binary) + await packet.WriteAsync(PacketBitConverter.GetBytes(v), execAsync).ConfigureAwait(false); + else + await packet.WriteStringNoNullAsync(v.ToString("R", CultureInfo.InvariantCulture), execAsync).ConfigureAwait(false); + } + + async Task IMySqlValue.ReadValueAsync(MySqlPacket packet, long length, bool nullVal, bool execAsync) + { + if (nullVal) + return new MySqlSingle(true); + + if (length == -1) + { + byte[] b = new byte[4]; + await packet.ReadAsync(b, 0, 4, execAsync).ConfigureAwait(false); + return new MySqlSingle(PacketBitConverter.ToSingle(b, 0)); + } + + return new MySqlSingle(Single.Parse(await packet.ReadStringAsync(length, execAsync).ConfigureAwait(false), + CultureInfo.InvariantCulture)); + } + + void IMySqlValue.SkipValue(MySqlPacket packet) + { + packet.Position += 4; + } + + #endregion + + internal static void SetDSInfo(MySqlSchemaCollection sc) + { + // we use name indexing because this method will only be called + // when GetSchema is called for the DataSourceInformation + // collection and then it wil be cached. + MySqlSchemaRow row = sc.AddRow(); + row["TypeName"] = "FLOAT"; + row["ProviderDbType"] = MySqlDbType.Float; + row["ColumnSize"] = 0; + row["CreateFormat"] = "FLOAT"; + row["CreateParameters"] = null; + row["DataType"] = "System.Single"; + row["IsAutoincrementable"] = false; + row["IsBestMatch"] = true; + row["IsCaseSensitive"] = false; + row["IsFixedLength"] = true; + row["IsFixedPrecisionScale"] = true; + row["IsLong"] = false; + row["IsNullable"] = true; + row["IsSearchable"] = true; + row["IsSearchableWithLike"] = false; + row["IsUnsigned"] = false; + row["MaximumScale"] = 0; + row["MinimumScale"] = 0; + row["IsConcurrencyType"] = DBNull.Value; + row["IsLiteralSupported"] = false; + row["LiteralPrefix"] = null; + row["LiteralSuffix"] = null; + row["NativeDataType"] = null; + } + } +} diff --git a/MySQL.Data/src/Types/MySqlString.cs b/MySQL.Data/src/Types/MySqlString.cs new file mode 100644 index 000000000..d7b2a8b2b --- /dev/null +++ b/MySQL.Data/src/Types/MySqlString.cs @@ -0,0 +1,145 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Threading.Tasks; + +namespace MySql.Data.Types +{ + internal struct MySqlString : IMySqlValue + { + private readonly MySqlDbType _type; + + public MySqlString(MySqlDbType type, bool isNull) + { + _type = type; + IsNull = isNull; + Value = String.Empty; + } + + public MySqlString(MySqlDbType type, string val) + { + _type = type; + IsNull = false; + Value = val; + } + + #region IMySqlValue Members + + public bool IsNull { get; } + + MySqlDbType IMySqlValue.MySqlDbType => _type; + + object IMySqlValue.Value => Value; + + public string Value { get; } + + Type IMySqlValue.SystemType => typeof(string); + + string IMySqlValue.MySqlTypeName => _type == MySqlDbType.Set ? "SET" : _type == MySqlDbType.Enum ? "ENUM" : "VARCHAR"; + + async Task IMySqlValue.WriteValueAsync(MySqlPacket packet, bool binary, object val, int length, bool execAsync) + { + string v = val.ToString(); + if (length > 0) + { + length = Math.Min(length, v.Length); + v = v.Substring(0, length); + } + + if (binary) + await packet.WriteLenStringAsync(v, execAsync).ConfigureAwait(false); + else + await packet.WriteStringNoNullAsync("'" + MySqlHelper.EscapeString(v) + "'", execAsync).ConfigureAwait(false); + } + + async Task IMySqlValue.ReadValueAsync(MySqlPacket packet, long length, bool nullVal, bool execAsync) + { + if (nullVal) + return new MySqlString(_type, true); + + string s = String.Empty; + if (length == -1) + s = await packet.ReadLenStringAsync(execAsync).ConfigureAwait(false); + else + s = await packet.ReadStringAsync(length, execAsync).ConfigureAwait(false); + MySqlString str = new MySqlString(_type, s); + return str; + } + + void IMySqlValue.SkipValue(MySqlPacket packet) + { + int len = (int)packet.ReadFieldLength(); + packet.Position += len; + } + + #endregion + + internal static void SetDSInfo(MySqlSchemaCollection sc) + { + string[] types = new string[] { "CHAR", "NCHAR", "VARCHAR", "NVARCHAR", "SET", + "ENUM", "TINYTEXT", "TEXT", "MEDIUMTEXT", "LONGTEXT" }; + MySqlDbType[] dbtype = new MySqlDbType[] { MySqlDbType.String, MySqlDbType.String, + MySqlDbType.VarChar, MySqlDbType.VarChar, MySqlDbType.Set, MySqlDbType.Enum, + MySqlDbType.TinyText, MySqlDbType.Text, MySqlDbType.MediumText, + MySqlDbType.LongText }; + + // we use name indexing because this method will only be called + // when GetSchema is called for the DataSourceInformation + // collection and then it wil be cached. + for (int x = 0; x < types.Length; x++) + { + MySqlSchemaRow row = sc.AddRow(); + row["TypeName"] = types[x]; + row["ProviderDbType"] = dbtype[x]; + row["ColumnSize"] = 0; + row["CreateFormat"] = x < 4 ? types[x] + "({0})" : types[x]; + row["CreateParameters"] = x < 4 ? "size" : null; + row["DataType"] = "System.String"; + row["IsAutoincrementable"] = false; + row["IsBestMatch"] = true; + row["IsCaseSensitive"] = false; + row["IsFixedLength"] = false; + row["IsFixedPrecisionScale"] = true; + row["IsLong"] = false; + row["IsNullable"] = true; + row["IsSearchable"] = true; + row["IsSearchableWithLike"] = true; + row["IsUnsigned"] = false; + row["MaximumScale"] = 0; + row["MinimumScale"] = 0; + row["IsConcurrencyType"] = DBNull.Value; + row["IsLiteralSupported"] = false; + row["LiteralPrefix"] = null; + row["LiteralSuffix"] = null; + row["NativeDataType"] = null; + } + } + } +} diff --git a/MySQL.Data/src/Types/MySqlTime.cs b/MySQL.Data/src/Types/MySqlTime.cs new file mode 100644 index 000000000..bd0969023 --- /dev/null +++ b/MySQL.Data/src/Types/MySqlTime.cs @@ -0,0 +1,218 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Globalization; +using System.Threading.Tasks; + +namespace MySql.Data.Types +{ + internal struct MySqlTimeSpan : IMySqlValue + { + public MySqlTimeSpan(bool isNull) + { + IsNull = isNull; + Value = TimeSpan.MinValue; + } + + public MySqlTimeSpan(TimeSpan val) + { + IsNull = false; + Value = val; + } + + #region IMySqlValue Members + + public bool IsNull { get; private set; } + + MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.Time; + + object IMySqlValue.Value => Value; + + public TimeSpan Value { get; private set; } + + Type IMySqlValue.SystemType => typeof(TimeSpan); + + string IMySqlValue.MySqlTypeName => "TIME"; + + async Task IMySqlValue.WriteValueAsync(MySqlPacket packet, bool binary, object val, int length, bool execAsync) + { +#if NET6_0_OR_GREATER + if (val is TimeOnly) + val = ((TimeOnly)val).ToTimeSpan(); +#endif + if (!(val is TimeSpan)) + throw new MySqlException("Only TimeSpan objects can be serialized by MySqlTimeSpan"); + + TimeSpan ts = (TimeSpan)val; + bool negative = ts.TotalMilliseconds < 0; + ts = ts.Duration(); + + if (binary) + { + if (ts.Milliseconds > 0) + packet.WriteByte(12); + else + packet.WriteByte(8); + + packet.WriteByte((byte)(negative ? 1 : 0)); + await packet.WriteIntegerAsync(ts.Days, 4, execAsync).ConfigureAwait(false); + packet.WriteByte((byte)ts.Hours); + packet.WriteByte((byte)ts.Minutes); + packet.WriteByte((byte)ts.Seconds); + var microseconds = (int)(ts.Ticks % 10_000_000) / 10; + + if (microseconds != 0) + await packet.WriteIntegerAsync(microseconds, 4, execAsync).ConfigureAwait(false); + } + else + { + String s = $"'{(negative ? "-" : "")}{ts.Days} {ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00}.{ts.Ticks % 10000000 / 10:000000}'"; + + await packet.WriteStringNoNullAsync(s, execAsync).ConfigureAwait(false); + } + } + + + async Task IMySqlValue.ReadValueAsync(MySqlPacket packet, long length, bool nullVal, bool execAsync) + { + if (nullVal) return new MySqlTimeSpan(true); + + if (length >= 0) + { + string value = await packet.ReadStringAsync(length, execAsync).ConfigureAwait(false); + ParseMySql(value); + return this; + } + + long bufLength = packet.ReadByte(); + int negate = 0; + if (bufLength > 0) + negate = packet.ReadByte(); + + IsNull = false; + if (bufLength == 0) + { + IsNull = true; + Value = new MySqlTimeSpan().Value; + } + else if (bufLength == 5) + Value = new TimeSpan(packet.ReadInteger(4), 0, 0, 0); + else if (bufLength == 8) + Value = new TimeSpan(packet.ReadInteger(4), + packet.ReadByte(), packet.ReadByte(), packet.ReadByte()); + else + { + var days = (int)packet.ReadInteger(4); + var hours = (int)packet.ReadByte(); + var minutes = (int)packet.ReadByte(); + var seconds = (int)packet.ReadByte(); + var microseconds = (int)packet.ReadInteger(4); + Value = new TimeSpan(days, hours, minutes, seconds) + TimeSpan.FromTicks(microseconds * 10); + } + + if (negate == 1) + Value = Value.Negate(); + return this; + } + + void IMySqlValue.SkipValue(MySqlPacket packet) + { + int len = packet.ReadByte(); + packet.Position += len; + } + + #endregion + + internal static void SetDSInfo(MySqlSchemaCollection sc) + { + // we use name indexing because this method will only be called + // when GetSchema is called for the DataSourceInformation + // collection and then it wil be cached. + MySqlSchemaRow row = sc.AddRow(); + row["TypeName"] = "TIME"; + row["ProviderDbType"] = MySqlDbType.Time; + row["ColumnSize"] = 0; + row["CreateFormat"] = "TIME"; + row["CreateParameters"] = null; + row["DataType"] = "System.TimeSpan"; + row["IsAutoincrementable"] = false; + row["IsBestMatch"] = true; + row["IsCaseSensitive"] = false; + row["IsFixedLength"] = true; + row["IsFixedPrecisionScale"] = true; + row["IsLong"] = false; + row["IsNullable"] = true; + row["IsSearchable"] = true; + row["IsSearchableWithLike"] = false; + row["IsUnsigned"] = false; + row["MaximumScale"] = 0; + row["MinimumScale"] = 0; + row["IsConcurrencyType"] = DBNull.Value; + row["IsLiteralSupported"] = false; + row["LiteralPrefix"] = null; + row["LiteralSuffix"] = null; + row["NativeDataType"] = null; + } + + public override string ToString() + { + return $"{Value.Days} {Value.Hours:00}:{Value.Minutes:00}:{Value.Seconds:00}"; + } + + private void ParseMySql(string s) + { + + string[] parts = s.Split(':', '.'); + int hours = Int32.Parse(parts[0], CultureInfo.InvariantCulture); + int mins = Int32.Parse(parts[1], CultureInfo.InvariantCulture); + int secs = Int32.Parse(parts[2], CultureInfo.InvariantCulture); + int nanoseconds = 0; + + if (parts.Length > 3) + { + //if the data is saved in MySql as Time(3) the division by 1000 always returns 0, but handling the data as Time(6) the result is the expected + parts[3] = parts[3].PadRight(7, '0'); + nanoseconds = int.Parse(parts[3], CultureInfo.InvariantCulture); + } + + + if (hours < 0 || parts[0].StartsWith("-", StringComparison.Ordinal)) + { + mins *= -1; + secs *= -1; + nanoseconds *= -1; + } + int days = hours / 24; + hours = hours - (days * 24); + Value = new TimeSpan(days, hours, mins, secs).Add(new TimeSpan(nanoseconds)); + IsNull = false; + } + } +} diff --git a/MySQL.Data/src/Types/MySqlUByte.cs b/MySQL.Data/src/Types/MySqlUByte.cs new file mode 100644 index 000000000..5db414eed --- /dev/null +++ b/MySQL.Data/src/Types/MySqlUByte.cs @@ -0,0 +1,122 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Globalization; +using System.Threading.Tasks; + +namespace MySql.Data.Types +{ + internal struct MySqlUByte : IMySqlValue + { + public MySqlUByte(bool isNull) + { + IsNull = isNull; + Value = 0; + } + + public MySqlUByte(byte val) + { + IsNull = false; + Value = val; + } + + #region IMySqlValue Members + + public bool IsNull { get; } + + MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.UByte; + + object IMySqlValue.Value => Value; + + public byte Value { get; } + + Type IMySqlValue.SystemType => typeof(byte); + + string IMySqlValue.MySqlTypeName => "TINYINT"; + + async Task IMySqlValue.WriteValueAsync(MySqlPacket packet, bool binary, object val, int length, bool execAsync) + { + byte v = val as byte? ?? Convert.ToByte(val); + if (binary) + packet.WriteByte(v); + else + await packet.WriteStringNoNullAsync(v.ToString(CultureInfo.InvariantCulture), execAsync).ConfigureAwait(false); + } + + async Task IMySqlValue.ReadValueAsync(MySqlPacket packet, long length, bool nullVal, bool execAsync) + { + if (nullVal) + return new MySqlUByte(true); + + if (length == -1) + return new MySqlUByte((byte)packet.ReadByte()); + else + return new MySqlUByte(Byte.Parse(await packet.ReadStringAsync(length, execAsync).ConfigureAwait(false), CultureInfo.InvariantCulture)); + } + + void IMySqlValue.SkipValue(MySqlPacket packet) + { + packet.ReadByte(); + } + + #endregion + + internal static void SetDSInfo(MySqlSchemaCollection sc) + { + // we use name indexing because this method will only be called + // when GetSchema is called for the DataSourceInformation + // collection and then it wil be cached. + MySqlSchemaRow row = sc.AddRow(); + row["TypeName"] = "TINYINT"; + row["ProviderDbType"] = MySqlDbType.UByte; + row["ColumnSize"] = 0; + row["CreateFormat"] = "TINYINT UNSIGNED"; + row["CreateParameters"] = null; + row["DataType"] = "System.Byte"; + row["IsAutoincrementable"] = true; + row["IsBestMatch"] = true; + row["IsCaseSensitive"] = false; + row["IsFixedLength"] = true; + row["IsFixedPrecisionScale"] = true; + row["IsLong"] = false; + row["IsNullable"] = true; + row["IsSearchable"] = true; + row["IsSearchableWithLike"] = false; + row["IsUnsigned"] = true; + row["MaximumScale"] = 0; + row["MinimumScale"] = 0; + row["IsConcurrencyType"] = DBNull.Value; + row["IsLiteralSupported"] = false; + row["LiteralPrefix"] = null; + row["LiteralSuffix"] = null; + row["NativeDataType"] = null; + } + } +} diff --git a/MySQL.Data/src/Types/MySqlUInt16.cs b/MySQL.Data/src/Types/MySqlUInt16.cs new file mode 100644 index 000000000..183b66f77 --- /dev/null +++ b/MySQL.Data/src/Types/MySqlUInt16.cs @@ -0,0 +1,122 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Globalization; +using System.Threading.Tasks; + +namespace MySql.Data.Types +{ + internal struct MySqlUInt16 : IMySqlValue + { + public MySqlUInt16(bool isNull) + { + IsNull = isNull; + Value = 0; + } + + public MySqlUInt16(ushort val) + { + IsNull = false; + Value = val; + } + + #region IMySqlValue Members + + public bool IsNull { get; } + + MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.UInt16; + + object IMySqlValue.Value => Value; + + public ushort Value { get; } + + Type IMySqlValue.SystemType => typeof(ushort); + + string IMySqlValue.MySqlTypeName => "SMALLINT"; + + async Task IMySqlValue.WriteValueAsync(MySqlPacket packet, bool binary, object val, int length, bool execAsync) + { + int v = (val is UInt16) ? (UInt16)val : Convert.ToUInt16(val); + if (binary) + await packet.WriteIntegerAsync(v, 2, execAsync).ConfigureAwait(false); + else + await packet.WriteStringNoNullAsync(v.ToString(CultureInfo.InvariantCulture), execAsync).ConfigureAwait(false); + } + + async Task IMySqlValue.ReadValueAsync(MySqlPacket packet, long length, bool nullVal, bool execAsync) + { + if (nullVal) + return new MySqlUInt16(true); + + if (length == -1) + return new MySqlUInt16((ushort)packet.ReadInteger(2)); + else + return new MySqlUInt16(UInt16.Parse(await packet.ReadStringAsync(length, execAsync).ConfigureAwait(false), CultureInfo.InvariantCulture)); + } + + void IMySqlValue.SkipValue(MySqlPacket packet) + { + packet.Position += 2; + } + + #endregion + + internal static void SetDSInfo(MySqlSchemaCollection sc) + { + // we use name indexing because this method will only be called + // when GetSchema is called for the DataSourceInformation + // collection and then it wil be cached. + MySqlSchemaRow row = sc.AddRow(); + row["TypeName"] = "SMALLINT"; + row["ProviderDbType"] = MySqlDbType.UInt16; + row["ColumnSize"] = 0; + row["CreateFormat"] = "SMALLINT UNSIGNED"; + row["CreateParameters"] = null; + row["DataType"] = "System.UInt16"; + row["IsAutoincrementable"] = true; + row["IsBestMatch"] = true; + row["IsCaseSensitive"] = false; + row["IsFixedLength"] = true; + row["IsFixedPrecisionScale"] = true; + row["IsLong"] = false; + row["IsNullable"] = true; + row["IsSearchable"] = true; + row["IsSearchableWithLike"] = false; + row["IsUnsigned"] = true; + row["MaximumScale"] = 0; + row["MinimumScale"] = 0; + row["IsConcurrencyType"] = DBNull.Value; + row["IsLiteralSupported"] = false; + row["LiteralPrefix"] = null; + row["LiteralSuffix"] = null; + row["NativeDataType"] = null; + } + } +} diff --git a/MySQL.Data/src/Types/MySqlUInt32.cs b/MySQL.Data/src/Types/MySqlUInt32.cs new file mode 100644 index 000000000..a5d9af68d --- /dev/null +++ b/MySQL.Data/src/Types/MySqlUInt32.cs @@ -0,0 +1,144 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Globalization; +using System.Threading.Tasks; + +namespace MySql.Data.Types +{ + internal struct MySqlUInt32 : IMySqlValue + { + private readonly bool _is24Bit; + + private MySqlUInt32(MySqlDbType type) + { + _is24Bit = type == MySqlDbType.UInt24; + IsNull = true; + Value = 0; + } + + public MySqlUInt32(MySqlDbType type, bool isNull) + : this(type) + { + IsNull = isNull; + } + + public MySqlUInt32(MySqlDbType type, uint val) + : this(type) + { + IsNull = false; + Value = val; + } + + #region IMySqlValue Members + + public bool IsNull { get; } + + MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.UInt32; + + object IMySqlValue.Value => Value; + + public uint Value { get; } + + Type IMySqlValue.SystemType => typeof(UInt32); + + string IMySqlValue.MySqlTypeName + { + get { return _is24Bit ? "MEDIUMINT" : "INT"; } + } + + async Task IMySqlValue.WriteValueAsync(MySqlPacket packet, bool binary, object v, int length, bool execAsync) + { + uint val = v as uint? ?? Convert.ToUInt32(v); + if (binary) + await packet.WriteIntegerAsync((long)val, 4, execAsync).ConfigureAwait(false); + else + await packet.WriteStringNoNullAsync(val.ToString(CultureInfo.InvariantCulture), execAsync).ConfigureAwait(false); + } + + async Task IMySqlValue.ReadValueAsync(MySqlPacket packet, long length, bool nullVal, bool execAsync) + { + if (nullVal) + return new MySqlUInt32((this as IMySqlValue).MySqlDbType, true); + + if (length == -1) + return new MySqlUInt32((this as IMySqlValue).MySqlDbType, + (uint)packet.ReadInteger(4)); + else + return new MySqlUInt32((this as IMySqlValue).MySqlDbType, + UInt32.Parse(await packet.ReadStringAsync(length, execAsync).ConfigureAwait(false), NumberStyles.Any, CultureInfo.InvariantCulture)); + } + + void IMySqlValue.SkipValue(MySqlPacket packet) + { + packet.Position += 4; + } + + #endregion + + internal static void SetDSInfo(MySqlSchemaCollection sc) + { + string[] types = new string[] { "MEDIUMINT", "INT" }; + MySqlDbType[] dbtype = new MySqlDbType[] { MySqlDbType.UInt24, + MySqlDbType.UInt32 }; + + // we use name indexing because this method will only be called + // when GetSchema is called for the DataSourceInformation + // collection and then it will be cached. + for (int x = 0; x < types.Length; x++) + { + MySqlSchemaRow row = sc.AddRow(); + row["TypeName"] = types[x]; + row["ProviderDbType"] = dbtype[x]; + row["ColumnSize"] = 0; + row["CreateFormat"] = types[x] + " UNSIGNED"; + row["CreateParameters"] = null; + row["DataType"] = "System.UInt32"; + row["IsAutoincrementable"] = true; + row["IsBestMatch"] = true; + row["IsCaseSensitive"] = false; + row["IsFixedLength"] = true; + row["IsFixedPrecisionScale"] = true; + row["IsLong"] = false; + row["IsNullable"] = true; + row["IsSearchable"] = true; + row["IsSearchableWithLike"] = false; + row["IsUnsigned"] = true; + row["MaximumScale"] = 0; + row["MinimumScale"] = 0; + row["IsConcurrencyType"] = DBNull.Value; + row["IsLiteralSupported"] = false; + row["LiteralPrefix"] = null; + row["LiteralSuffix"] = null; + row["NativeDataType"] = null; + } + } + } +} diff --git a/MySQL.Data/src/Types/MySqlUInt64.cs b/MySQL.Data/src/Types/MySqlUInt64.cs new file mode 100644 index 000000000..d19033180 --- /dev/null +++ b/MySQL.Data/src/Types/MySqlUInt64.cs @@ -0,0 +1,125 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Globalization; +using System.Threading.Tasks; + +namespace MySql.Data.Types +{ + internal struct MySqlUInt64 : IMySqlValue + { + public MySqlUInt64(bool isNull) + { + IsNull = isNull; + Value = 0; + } + + public MySqlUInt64(ulong val) + { + IsNull = false; + Value = val; + } + + #region IMySqlValue Members + + public bool IsNull { get; } + + MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.UInt64; + + object IMySqlValue.Value => Value; + + public ulong Value { get; } + + Type IMySqlValue.SystemType => typeof(ulong); + + string IMySqlValue.MySqlTypeName + { + get { return "BIGINT"; } + } + + async Task IMySqlValue.WriteValueAsync(MySqlPacket packet, bool binary, object val, int length, bool execAsync) + { + ulong v = val as ulong? ?? Convert.ToUInt64(val); + if (binary) + await packet.WriteIntegerAsync((long)v, 8, execAsync).ConfigureAwait(false); + else + await packet.WriteStringNoNullAsync(v.ToString(CultureInfo.InvariantCulture), execAsync).ConfigureAwait(false); + } + + async Task IMySqlValue.ReadValueAsync(MySqlPacket packet, long length, bool nullVal, bool execAsync) + { + if (nullVal) + return new MySqlUInt64(true); + + if (length == -1) + return new MySqlUInt64(packet.ReadULong(8)); + else + return new MySqlUInt64(UInt64.Parse(await packet.ReadStringAsync(length, execAsync).ConfigureAwait(false), CultureInfo.InvariantCulture)); + } + + void IMySqlValue.SkipValue(MySqlPacket packet) + { + packet.Position += 8; + } + + #endregion + + internal static void SetDSInfo(MySqlSchemaCollection sc) + { + // we use name indexing because this method will only be called + // when GetSchema is called for the DataSourceInformation + // collection and then it wil be cached. + MySqlSchemaRow row = sc.AddRow(); + row["TypeName"] = "BIGINT"; + row["ProviderDbType"] = MySqlDbType.UInt64; + row["ColumnSize"] = 0; + row["CreateFormat"] = "BIGINT UNSIGNED"; + row["CreateParameters"] = null; + row["DataType"] = "System.UInt64"; + row["IsAutoincrementable"] = true; + row["IsBestMatch"] = true; + row["IsCaseSensitive"] = false; + row["IsFixedLength"] = true; + row["IsFixedPrecisionScale"] = true; + row["IsLong"] = false; + row["IsNullable"] = true; + row["IsSearchable"] = true; + row["IsSearchableWithLike"] = false; + row["IsUnsigned"] = true; + row["MaximumScale"] = 0; + row["MinimumScale"] = 0; + row["IsConcurrencyType"] = DBNull.Value; + row["IsLiteralSupported"] = false; + row["LiteralPrefix"] = null; + row["LiteralSuffix"] = null; + row["NativeDataType"] = null; + } + } +} diff --git a/MySQL.Data/src/Utils.cs b/MySQL.Data/src/Utils.cs new file mode 100644 index 000000000..329c3a3f7 --- /dev/null +++ b/MySQL.Data/src/Utils.cs @@ -0,0 +1,86 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.IO; +using System.Reflection; +using System.Text; + +namespace MySql.Data.MySqlClient +{ + internal class Utils + { + public static string ReadResource(string name) + { + string rez = ReadResourceInternal(name); + if (rez != null) return rez; + return ReadResourceInternal("MySqlClient/" + name); + } + + public static string ReadResourceInternal(string name) + { + var assembly = Assembly.GetExecutingAssembly(); + var resName = assembly.GetName().Name + "." + name.Replace(" ", "_") + .Replace("\\", ".") + .Replace("/", "."); + var resourceStream = assembly.GetManifestResourceStream(resName); + if (resourceStream == null) return null; + + using (var reader = new StreamReader(resourceStream, Encoding.UTF8)) + { + return reader.ReadToEnd(); + } + } + + /// + /// Removes the outer backticks and replace the double-backticks to single-backtick + /// of inside the quotedString. + /// + /// The string to unquote. + /// + public static string UnquoteString(string quotedString) + { + if (quotedString.StartsWith("`")) + return quotedString.Substring(1, quotedString.Length - 2).Replace("``", "`"); + else + return quotedString; + } + + /// + /// Gets the length size (in bytes) of a string. + /// + /// length of string. + /// Number of bytes needed. + public static int GetLengthSize(ulong length) + { + if (length < 251UL) return 1; + if (length < 65536UL) return 3; + if (length < 16777216UL) return 4; + return 9; + } + } +} diff --git a/MySQL.Data/src/X/Authentication/ExternalAuthenticationPlugin.cs b/MySQL.Data/src/X/Authentication/ExternalAuthenticationPlugin.cs new file mode 100644 index 000000000..6417a9ad2 --- /dev/null +++ b/MySQL.Data/src/X/Authentication/ExternalAuthenticationPlugin.cs @@ -0,0 +1,64 @@ +// Copyright © 2017, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySql.Data.MySqlClient; +using MySql.Data.MySqlClient.Authentication; +using MySqlX.XDevAPI; +using System; +using System.Security.Cryptography; +using System.Text; + +namespace MySqlX.Security +{ + /// + /// Implementation of EXTERNAL authentication type. + /// + internal class ExternalAuthenticationPlugin + { + private MySqlXConnectionStringBuilder _settings; + + public ExternalAuthenticationPlugin(MySqlXConnectionStringBuilder settings) + { + _settings = settings; + } + + public string PluginName + { + get { return "External Authentication Plugin"; } + } + + public string AuthName + { + get + { + return "EXTERNAL"; + } + } + } +} diff --git a/MySQL.Data/src/X/Authentication/MySQL41AuthenticationPlugin.cs b/MySQL.Data/src/X/Authentication/MySQL41AuthenticationPlugin.cs new file mode 100644 index 000000000..c4ef053d3 --- /dev/null +++ b/MySQL.Data/src/X/Authentication/MySQL41AuthenticationPlugin.cs @@ -0,0 +1,93 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySql.Data.MySqlClient; +using MySql.Data.MySqlClient.Authentication; +using MySqlX.XDevAPI; +using System; +using System.Security.Cryptography; +using System.Text; + +namespace MySqlX.Security +{ + /// + /// Implementation of MySQL41 authentication type. + /// + internal class MySQL41AuthenticationPlugin : MySqlNativePasswordPlugin + { + private MySqlXConnectionStringBuilder _settings; + + public MySQL41AuthenticationPlugin(MySqlXConnectionStringBuilder settings) + { + _settings = settings; + } + + public override string PluginName + { + get { return "MySQL 4.1 Authentication Plugin"; } + } + + public string AuthName + { + get + { + return "MYSQL41"; + } + } + + public byte[] Continue(byte[] salt) + { + var encoding = Encoding.GetEncoding("utf-8"); + + byte[] userBytes = encoding.GetBytes(_settings.UserID); + byte[] databaseBytes = encoding.GetBytes(_settings.Database); + byte[] hashedPassword = new byte[0]; + byte[] hex = new byte[0]; + if (!string.IsNullOrWhiteSpace(_settings.Password)) + { + hashedPassword = Get411Password(_settings.Password, salt); + Array.Copy(hashedPassword, 1, hashedPassword, 0, hashedPassword.Length - 1); + Array.Resize(ref hashedPassword, hashedPassword.Length - 1); + //convert to hex value + hex = encoding.GetBytes(string.Format("*{0}", BitConverter.ToString(hashedPassword).Replace("-", string.Empty))); + } + + // create response + byte[] response = new byte[databaseBytes.Length + userBytes.Length + hex.Length + 2]; + databaseBytes.CopyTo(response, 0); + var index = databaseBytes.Length; + response[index++] = 0; + userBytes.CopyTo(response, index); + index += userBytes.Length; + response[index++] = 0; + hex.CopyTo(response, index); + return response; + } + } +} diff --git a/MySQL.Data/src/X/Authentication/PlainAuthenticationPlugin.cs b/MySQL.Data/src/X/Authentication/PlainAuthenticationPlugin.cs new file mode 100644 index 000000000..824768ec1 --- /dev/null +++ b/MySQL.Data/src/X/Authentication/PlainAuthenticationPlugin.cs @@ -0,0 +1,73 @@ +// Copyright © 2017, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySql.Data.MySqlClient; +using MySql.Data.MySqlClient.Authentication; +using MySqlX.XDevAPI; +using System; +using System.Security.Cryptography; +using System.Text; + +namespace MySqlX.Security +{ + /// + /// Implementation of PLAIN authentication type. + /// + internal class PlainAuthenticationPlugin : Sha256AuthenticationPlugin + { + private MySqlXConnectionStringBuilder _settings; + + public PlainAuthenticationPlugin(MySqlXConnectionStringBuilder settings) + { + _settings = settings; + } + + public override string PluginName + { + get { return "Plain Authentication Plugin"; } + } + + public string AuthName + { + get + { + return "PLAIN"; + } + } + + public byte[] GetAuthData() + { + return Encoding.UTF8.GetBytes(string.Format("{0}\0{1}\0{2}", + _settings.Database, + _settings.UserID, + _settings.Password + )); + } + } +} diff --git a/MySQL.Data/src/X/Common/Tools.cs b/MySQL.Data/src/X/Common/Tools.cs new file mode 100644 index 000000000..814b5ab18 --- /dev/null +++ b/MySQL.Data/src/X/Common/Tools.cs @@ -0,0 +1,86 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Reflection; +using MySql.Data; + +namespace MySqlX.Common +{ + internal static class Tools + { + public static Dictionary GetDictionaryFromAnonymous(object anonymousObject) + { + Dictionary result = new Dictionary(); + + if (!anonymousObject.GetType().IsConstructedGenericType) + throw new FormatException(ResourcesX.InvalidConnectionData); + + foreach (PropertyInfo property in anonymousObject.GetType().GetProperties()) + { + object value = property.GetValue(anonymousObject, null); + result.Add(property.Name, value); + } + + return result; + } + + //internal static OS GetOS() + //{ + // if (Path.DirectorySeparatorChar == '/') + // return OS.Linux; + // if (Path.DirectorySeparatorChar == '\\') + // return OS.Windows; + // else + // return OS.MacOS; + //} + + /// + /// Compares two Guids in string format. + /// + /// The first string to compare. + /// The first string to compare. + /// An integer that indicates the lexical relationship between the two comparands, similar to + internal static int CompareGuids(string guid1, string guid2) + { + return string.Compare(guid1.Replace("-",""),guid2.Replace("-","")); + } + + /// + /// Compares two objects. + /// + /// The first to compare. + /// The second to compare. + /// An integer that indicates the lexical relationship between the two comparands, similar to + internal static int CompareGuids(Guid guid1, Guid guid2) + { + return CompareGuids(guid1.ToString(), guid2.ToString()); + } + } +} diff --git a/MySQL.Data/src/X/Common/UnmanagedLibraryLoader.cs b/MySQL.Data/src/X/Common/UnmanagedLibraryLoader.cs new file mode 100644 index 000000000..a15352bee --- /dev/null +++ b/MySQL.Data/src/X/Common/UnmanagedLibraryLoader.cs @@ -0,0 +1,94 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.IO; +using System.Reflection; +using System.Runtime.InteropServices; + +namespace MySqlX.Common +{ + /// + /// Provides functionality for loading unmanaged libraries. + /// + internal static class UnmanagedLibraryLoader + { + /// + /// Loads the specified unmanaged library from the embedded resources. + /// + /// The application name. + /// The library name. + internal static bool LoadUnmanagedLibraryFromEmbeddedResources(string applicationName, string libraryName) + { + try + { + byte[] byteArray = null; + var resource = $"{applicationName}.{libraryName}"; + var executingAssembly = Assembly.GetExecutingAssembly(); + using (var stream = executingAssembly.GetManifestResourceStream(resource)) + { + byteArray = new byte[(int)stream.Length]; + stream.Read(byteArray, 0, (int)stream.Length); + } + + var tempFile = $"{Path.GetTempPath()}{libraryName}"; + if (File.Exists(tempFile)) + { + File.Delete(tempFile); + } + + File.WriteAllBytes(tempFile, byteArray); + LoadLibraryEx(tempFile, IntPtr.Zero, LoadLibraryFlags.LOAD_WITH_ALTERED_SEARCH_PATH); + return true; + } + catch + { + return false; + } + } + + [DllImport("kernel32", SetLastError = true)] + private static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hReservedNull, LoadLibraryFlags dwFlags); + + [Flags] + private enum LoadLibraryFlags : uint + { + DONT_RESOLVE_DLL_REFERENCES = 0x00000001, + LOAD_IGNORE_CODE_AUTHZ_LEVEL = 0x00000010, + LOAD_LIBRARY_AS_DATAFILE = 0x00000002, + LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE = 0x00000040, + LOAD_LIBRARY_AS_IMAGE_RESOURCE = 0x00000020, + LOAD_LIBRARY_SEARCH_APPLICATION_DIR = 0x00000200, + LOAD_LIBRARY_SEARCH_DEFAULT_DIRS = 0x00001000, + LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR = 0x00000100, + LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x00000800, + LOAD_LIBRARY_SEARCH_USER_DIRS = 0x00000400, + LOAD_WITH_ALTERED_SEARCH_PATH = 0x00000008 + } + } +} diff --git a/MySQL.Data/src/X/Communication/CommunicationPacket.cs b/MySQL.Data/src/X/Communication/CommunicationPacket.cs new file mode 100644 index 000000000..76ab9ef25 --- /dev/null +++ b/MySQL.Data/src/X/Communication/CommunicationPacket.cs @@ -0,0 +1,96 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySqlX.Communication +{ + internal class CommunicationPacket + { + + public CommunicationPacket(int messageType, int length, byte[] data) + { + MessageType = messageType; + Length = length; + Buffer = data; + } + + public byte[] Buffer; + public int MessageType; + public int Length; + } + + internal enum ClientMessageId + { + CON_CAPABILITIES_GET = 1, + CON_CAPABILITIES_SET = 2, + CON_CLOSE = 3, + + SESS_AUTHENTICATE_START = 4, + SESS_AUTHENTICATE_CONTINUE = 5, + SESS_RESET = 6, + SESS_CLOSE = 7, + + SQL_STMT_EXECUTE = 12, + + CRUD_FIND = 17, + CRUD_INSERT = 18, + CRUD_UPDATE = 19, + CRUD_DELETE = 20, + + EXPECT_OPEN = 24, + EXPECT_CLOSE = 25, + + COMPRESSION = 46 + } + + + internal enum ServerMessageId + { + OK = 0, + ERROR = 1, + + CONN_CAPABILITIES = 2, + + SESS_AUTHENTICATE_CONTINUE = 3, + SESS_AUTHENTICATE_OK = 4, + + // NOTICE has to stay at 11 forever + NOTICE = 11, + + RESULTSET_COLUMN_META_DATA = 12, + RESULTSET_ROW = 13, + RESULTSET_FETCH_DONE = 14, + RESULTSET_FETCH_SUSPENDED = 15, + RESULTSET_FETCH_DONE_MORE_RESULTSETS = 16, + + SQL_STMT_EXECUTE_OK = 17, + RESULTSET_FETCH_DONE_MORE_OUT_PARAMS = 18, + + COMPRESSION = 19 + } + +} diff --git a/MySQL.Data/src/X/Communication/XCompressionController.cs b/MySQL.Data/src/X/Communication/XCompressionController.cs new file mode 100644 index 000000000..7dc6485f0 --- /dev/null +++ b/MySQL.Data/src/X/Communication/XCompressionController.cs @@ -0,0 +1,473 @@ +// Copyright © 2019, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using K4os.Compression.LZ4.Streams; +using MySql.Data; +using MySql.Data.MySqlClient; +using MySqlX.Common; +using System; +using System.Collections.Generic; +using System.IO; +using System.IO.Compression; +using ZstdSharp; + +namespace MySqlX.Communication +{ + /// + /// Provides support for configuring X Protocol compressed messages. + /// + internal class XCompressionController + { + #region Constants + + /// + /// The capabilities sub-key used to specify the compression algorithm. + /// + internal const string ALGORITHMS_SUBKEY = "algorithm"; + + /// + /// The capabilities key used to specify the compression capability. + /// + internal const string COMPRESSION_KEY = "compression"; + + /// + /// Messages with a value lower than this threshold will not be compressed. + /// + internal const int COMPRESSION_THRESHOLD = 1000; + + /// + /// Default value for enabling or disabling combined compressed messages. + /// + internal const bool DEFAULT_SERVER_COMBINE_MIXED_MESSAGES_VALUE = true; + + /// + /// Default value for the maximum number of combined compressed messages contained in a compression message. + /// + internal const int DEFAULT_SERVER_MAX_COMBINE_MESSAGES_VALUE = 100; + + /// + /// The capabilities sub-key used to specify if combining compressed messages is permitted. + /// + internal const string SERVER_COMBINE_MIXED_MESSAGES_SUBKEY = "server_combine_mixed_messages"; + + /// + /// The capabilities sub-key used to specify the maximum number of compressed messages contained in a compression message. + /// + internal const string SERVER_MAX_COMBINE_MESSAGES_SUBKEY = "server_max_combine_messages"; + + #endregion + + #region Fields + + /// + /// Buffer used to store the data received from the server. + /// + private MemoryStream _buffer; + + /// + /// Deflate stream used for compressing data. + /// + private DeflateStream _deflateCompressStream; + + /// + /// Deflate stream used for decompressing data. + /// + private DeflateStream _deflateDecompressStream; + + /// + /// Flag indicating if the initialization is for compression or decompression. + /// + private bool _initializeForCompression; + + /// + /// Stores the communication packet generated the last time ReadNextBufferedMessage method was called. + /// + CommunicationPacket _lastCommunicationPacket; + + /// + /// Stream used to store multiple X Protocol messages. + /// + MemoryStream _multipleMessagesStream; + + /// + /// ZStandard stream used for decompressing data. + /// + private DecompressionStream _zstdDecompressStream; + + #endregion + + /// + /// Main constructor used to set the compression algorithm and initialize the list of messages to + /// be compressed by the client. + /// + /// The compression algorithm to use. + /// Flag indicating if the initialization is for compression or decompression. + public XCompressionController(CompressionAlgorithms compressionAlgorithm, bool initializeForCompression) + { + if (!Enum.IsDefined(typeof(CompressionAlgorithms), compressionAlgorithm)) + { + throw new NotSupportedException(string.Format(ResourcesX.CompressionAlgorithmNotSupported, compressionAlgorithm)); + } + + CompressionAlgorithm = compressionAlgorithm; + _initializeForCompression = initializeForCompression; + + // Set the list of messages that should be compressed. + ClientSupportedCompressedMessages = new List + { + ClientMessageId.CRUD_DELETE, + ClientMessageId.CRUD_FIND, + ClientMessageId.CRUD_INSERT, + ClientMessageId.CRUD_UPDATE, + ClientMessageId.SQL_STMT_EXECUTE + }; + + // Initialize stream objects. + _buffer = new MemoryStream(); + switch (CompressionAlgorithm) + { + case CompressionAlgorithms.zstd_stream: + if (!_initializeForCompression) + { + _zstdDecompressStream = new DecompressionStream(_buffer); + } + break; +#if !NETFRAMEWORK + case CompressionAlgorithms.deflate_stream: + if (_initializeForCompression) + { + _deflateCompressStream = new DeflateStream(_buffer, CompressionMode.Compress, true); + } + else + { + _deflateDecompressStream = new DeflateStream(_buffer, CompressionMode.Decompress, true); + } + + break; +#endif + } + } + + /// + /// Gets or sets the list of messages that should be compressed by the client when compression is enabled. + /// + internal List ClientSupportedCompressedMessages { get; private set; } + + /// + /// Gets or sets the compression algorithm. + /// + internal CompressionAlgorithms? CompressionAlgorithm { get; private set; } + + /// + /// Flag indicating if compression is enabled. + /// + internal bool IsCompressionEnabled => CompressionAlgorithm != null; + + /// + /// Flag indicating if the last decompressed message contains multiple messages. + /// + internal bool LastMessageContainsMultipleMessages { get; private set; } + + /// + /// General method used to compress data using the compression algorithm defined in the constructor. + /// + /// The data to compress. + /// A compressed byte array. + internal byte[] Compress(byte[] input) + { + if (!IsCompressionEnabled) + { + throw new Exception(ResourcesX.CompressionNotEnabled); + } + + switch (CompressionAlgorithm) + { + case (CompressionAlgorithms.zstd_stream): + return CompressUsingZstdStream(input); + case (CompressionAlgorithms.lz4_message): + return CompressUsingLz4Message(input); +#if !NETFRAMEWORK + case (CompressionAlgorithms.deflate_stream): + return CompressUsingDeflateStream(input); +#endif + default: + throw new NotSupportedException(string.Format(ResourcesX.CompressionAlgorithmNotSupported, CompressionAlgorithm)); + } + } + + /// + /// Compresses data using the deflate_stream algorithm. + /// + /// The data to compress. + /// A compressed byte array. + public byte[] CompressUsingDeflateStream(byte[] input) + { + bool cacheCapacityIsZero = _buffer.Capacity == 0; + if (cacheCapacityIsZero) + { + _buffer.WriteByte(0x78); + _buffer.WriteByte(0x9c); + } + +#if !NETFRAMEWORK + _deflateCompressStream.Write(input, 0, input.Length); + _deflateCompressStream.Flush(); + var compressedData = _buffer.ToArray(); + _buffer.SetLength(0); + + return compressedData; +#else + throw new NotSupportedException(string.Format(ResourcesX.CompressionForSpecificAlgorithmNotSupportedInNetFramework, "deflate_stream")); +#endif + } + + /// + /// Compresses data using the lz4_message algorithm. + /// + /// The data to compress. + /// A compressed byte array. + private byte[] CompressUsingLz4Message(byte[] input) + { + byte[] compressedData; + using (var source = new MemoryStream(input)) + using (var memory = new MemoryStream()) + using (var target = LZ4Stream.Encode(memory)) + { + source.CopyTo(target); + target.Close(); + compressedData = memory.ToArray(); + } + + return compressedData; + } + + /// + /// Compresses data using the zstd_stream algorithm. + /// + /// The data to compress. + /// A compressed byte array. + private byte[] CompressUsingZstdStream(byte[] input) + { + byte[] compressedData; + using (var memoryStream = new MemoryStream()) + using (var compressionStream = new CompressionStream(memoryStream)) + { + compressionStream.Write(input, 0, input.Length); + compressionStream.Flush(); + compressionStream.Close(); + compressedData = memoryStream.ToArray(); + } + + return compressedData; + } + + /// + /// General method used to decompress data using the compression algorithm defined in the constructor. + /// + /// The data to decompress. + /// The expected length of the decompressed data. + /// A decompressed byte array. + internal byte[] Decompress(byte[] input, int length) + { + if (!IsCompressionEnabled) + { + throw new Exception(ResourcesX.CompressionNotEnabled); + } + + if (LastMessageContainsMultipleMessages) + { + throw new Exception(ResourcesX.CompressionPendingMessagesToProcess); + } + + byte[] decompressedData; + switch (CompressionAlgorithm) + { + case (CompressionAlgorithms.zstd_stream): + decompressedData = DecompressUsingZstdStream(input, length); + break; + case (CompressionAlgorithms.lz4_message): + decompressedData = DecompressUsingLz4Message(input, length); + break; +#if !NETFRAMEWORK + case (CompressionAlgorithms.deflate_stream): + decompressedData = DecompressUsingDeflateStream(input, length); + break; +#endif + default: + throw new NotSupportedException(string.Format(ResourcesX.CompressionAlgorithmNotSupported, CompressionAlgorithm)); + } + + if (decompressedData == null) + { + return null; + } + + var messageSizeBytes = new byte[4]; + Buffer.BlockCopy(decompressedData, 0, messageSizeBytes, 0, messageSizeBytes.Length); + var firstMessageSize = BitConverter.ToInt32(messageSizeBytes, 0) + 4; + LastMessageContainsMultipleMessages = firstMessageSize < decompressedData.Length; + if (!LastMessageContainsMultipleMessages + || (_multipleMessagesStream != null + && _multipleMessagesStream.Position == _multipleMessagesStream.Length)) + { + return decompressedData; + } + else + { + _multipleMessagesStream = new MemoryStream(decompressedData); + return ReadNextBufferedMessage(); + } + } + + /// + /// Decompresses data using the deflate_stream compression algorithm. + /// + /// The data to decompress. + /// The expected length of the decompressed data. + /// A decompressed byte array. + private byte[] DecompressUsingDeflateStream(byte[] input, int length) + { + if (input[0] == 0x78 && (input[1] == 0x9c || input[1] == 0x5E)) + { + _buffer.Write(input, 2, input.Length - 2); + } + else + { + _buffer.Write(input, 0, input.Length); + } + + _buffer.Position = 0; + var target = new MemoryStream(); + _deflateDecompressStream.CopyTo(target, length); + _deflateDecompressStream.Flush(); + var decompressedData = target.ToArray(); + _buffer.SetLength(0); + target.Dispose(); + + return decompressedData; + } + + /// + /// Decompresses data using the lz4_message compression algorithm. + /// + /// The data to decompress. + /// The expected length of the decompressed data. + /// A decompressed byte array. + private byte[] DecompressUsingLz4Message(byte[] input, int length) + { + byte[] decompressedData; + using (var memory = new MemoryStream(input)) + using (var source = LZ4Stream.Decode(memory)) + using (var target = new MemoryStream()) + { + source.CopyTo(target); + decompressedData = target.ToArray(); + } + + return decompressedData; + } + + /// + /// Decompresses data using the zstd_stream compression algorithm. + /// + /// The data to decompress. + /// The expected length of the decompressed data. + /// A decompressed byte array. + private byte[] DecompressUsingZstdStream(byte[] input, int length) + { + _buffer.Write(input, 0, input.Length); + _buffer.Position -= input.Length; + + byte[] decompressedData; + using (var target = new MemoryStream()) + { + _zstdDecompressStream.CopyTo(target, length); + decompressedData = target.ToArray(); + target.Dispose(); + _buffer.SetLength(0); + } + + return decompressedData; + } + + /// + /// Closes and disposes of any open streams. + /// + internal void Close() + { + _deflateCompressStream?.Dispose(); + _deflateDecompressStream?.Dispose(); + _multipleMessagesStream?.Dispose(); + _zstdDecompressStream?.Dispose(); + } + + /// + /// Gets the byte array representing the next X Protocol frame that is stored in cache. + /// + /// A byte array representing an X Protocol frame. + internal byte[] ReadNextBufferedMessage() + { + if (_multipleMessagesStream == null) + { + return null; + } + + var messageSizeBytes = new byte[4]; + _multipleMessagesStream.Read(messageSizeBytes, 0, messageSizeBytes.Length); + byte messageType = (byte)_multipleMessagesStream.ReadByte(); + var messageSize = BitConverter.ToInt32(messageSizeBytes, 0); + var data = new byte[messageSize - 1]; + _multipleMessagesStream.Read(data, 0, data.Length); + _lastCommunicationPacket = new CommunicationPacket(messageType, messageSize - 1, data); + var message = new byte[messageSizeBytes.Length + 1 + data.Length]; + Buffer.BlockCopy(messageSizeBytes, 0, message, 0, messageSizeBytes.Length); + Buffer.BlockCopy(new byte[] { messageType }, 0, message, messageSizeBytes.Length, 1); + Buffer.BlockCopy(data, 0, message, messageSizeBytes.Length + 1, data.Length); + + if (_multipleMessagesStream.Position == _multipleMessagesStream.Length) + { + LastMessageContainsMultipleMessages = false; + _multipleMessagesStream.Close(); + _multipleMessagesStream = null; + } + + return message; + } + + /// + /// Gets a representing the next X Protocol frame that is stored in cache. + /// + /// A with the next X Protocol frame. + internal CommunicationPacket ReadNextBufferedMessageAsCommunicationPacket() + { + ReadNextBufferedMessage(); + return _lastCommunicationPacket; + } + + } +} diff --git a/MySQL.Data/src/X/Communication/XPacketProcessor.cs b/MySQL.Data/src/X/Communication/XPacketProcessor.cs new file mode 100644 index 000000000..4da0c79e3 --- /dev/null +++ b/MySQL.Data/src/X/Communication/XPacketProcessor.cs @@ -0,0 +1,214 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySqlX.Communication; +using System; +using System.IO; +using Mysqlx.Connection; +using Mysqlx.Notice; +using MySqlX.Protocol.X; +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI.Common; +using System.Linq; +using System.Net.Sockets; +using System.Collections.Generic; + +namespace MySql.Data.X.Communication +{ + /// + /// Enables X Protocol packets from the network stream to be retrieved and processed + /// + internal class XPacketProcessor + { + #region Constants + private const int HEADER_SIZE = 5; + private const int MESSAGE_TYPE = HEADER_SIZE - 1; + #endregion + + #region Fields + /// + /// The instance of the stream that holds the network connection with MySQL Server. + /// + private Stream _stream; + + /// + /// This field is used to enable compression and decompression actions in the communication channel. + /// + private XCompressionController _compressionController; + + /// + /// A Queue to store the pending packets removed from the + /// + private Queue _packetQueue; + + #endregion Fields + + #region Constructors + /// + /// Creates a new instance of XPacketProcessor. + /// + /// The stream to be used as communication channel. + public XPacketProcessor(Stream stream) + { + _stream = stream; + _packetQueue = new Queue(); + } + + /// + /// Creates a new instance of XPacketProcessor. + /// + /// The stream to be used as communication channel. + /// The XCompressionController to be used for compression actions. + public XPacketProcessor(Stream stream, XCompressionController compressionController) : this(stream) + { + _compressionController = compressionController; + } + + #endregion Constructors + + #region Methods + + /// + /// Identifies the kind of packet received over the network and execute + /// the corresponding processing. + /// + private void IdentifyPacket(CommunicationPacket packet) + { + if (packet == null) return; + switch (packet.MessageType) + { + case (int)ServerMessageId.NOTICE: + Frame frame = Frame.Parser.ParseFrom(packet.Buffer); + + if ((NoticeType)frame.Type != NoticeType.Warning) return; + + Warning w = Warning.Parser.ParseFrom(frame.Payload.ToByteArray()); + WarningInfo warning = new WarningInfo(w.Code, w.Msg); + var closeCodes = ((CloseNotification[])Enum.GetValues(typeof(CloseNotification))).Select(c => (uint)c).ToList(); + + if (!closeCodes.Contains(warning.Code)) return; + + MySqlTrace.LogError((int)warning.Code, warning.Message); + switch (warning.Code) + { + case (uint)CloseNotification.IDLE: + throw new MySqlException(ResourcesX.NoticeIdleConnection, (int)warning.Code, new MySqlException(warning.Message, (int)warning.Code)); + case (uint)CloseNotification.KILLED: + throw new MySqlException(ResourcesX.NoticeKilledConnection, (int)warning.Code, new MySqlException(warning.Message, (int)warning.Code)); + case (uint)CloseNotification.SHUTDOWN: + throw new MySqlException(ResourcesX.NoticeServerShutdown, (int)warning.Code, new MySqlException(warning.Message, (int)warning.Code)); + default: + break; + } + + break; + } + } + + /// + /// Reads data from the network stream and create a packet of type . + /// + /// A . + public CommunicationPacket GetPacketFromNetworkStream(bool readFromQueue=false) + { + CommunicationPacket returnPacket = null; + var compressionEnabled = _compressionController != null + && _compressionController.IsCompressionEnabled; + if (compressionEnabled && _compressionController.LastMessageContainsMultipleMessages) + { + returnPacket = _compressionController.ReadNextBufferedMessageAsCommunicationPacket(); + IdentifyPacket(returnPacket); + return returnPacket; + } + + if (_packetQueue.Count > 0 && readFromQueue) + { + return _packetQueue.Dequeue(); + } + + byte[] header = new byte[HEADER_SIZE]; + ReadFully(header, 0, HEADER_SIZE); + int length = BitConverter.ToInt32(header, 0); + byte[] data = new byte[length - 1]; + ReadFully(data, 0, length - 1); + // If compression is enabled and message is of type compression. + if (compressionEnabled && header[MESSAGE_TYPE] == (int)ServerMessageId.COMPRESSION) + { + var packet = new CommunicationPacket(header[MESSAGE_TYPE], length - 1, data); + var message = Compression.Parser.ParseFrom(packet.Buffer); + var payload = message.Payload.ToByteArray(); + var decompressedPayload = _compressionController.Decompress(payload, (int)(message.UncompressedSize)); + data = new byte[decompressedPayload.Length - HEADER_SIZE]; + for (int i = 0; i < data.Length; i++) + { + data[i] = decompressedPayload[i + HEADER_SIZE]; + } + returnPacket = new CommunicationPacket(decompressedPayload[MESSAGE_TYPE], BitConverter.ToInt32(decompressedPayload, 0) - 1, data); + IdentifyPacket(returnPacket); + return returnPacket; + } + + returnPacket = new CommunicationPacket(header[MESSAGE_TYPE], length - 1, data); + IdentifyPacket(returnPacket); + return returnPacket; + } + + /// + /// Sends the read/write actions to the MyNetworkStream class. + /// + private void ReadFully(byte[] buffer, int offset, int count) + { + int numRead = 0; + int numToRead = count; + while (numToRead > 0) + { + int read = _stream.Read(buffer, offset + numRead, numToRead); + if (read == 0) + { + throw new EndOfStreamException(); + } + numRead += read; + numToRead -= read; + } + } + + + /// + /// Reads the pending packets present in the network channel and processes them accordingly. + /// + public void ProcessPendingPackets(Socket socket) + { + while (socket.Available > 0) + { + var packet = GetPacketFromNetworkStream(false); + _packetQueue?.Enqueue(packet); + } + } + #endregion Methods + } +} diff --git a/MySQL.Data/src/X/Communication/XPacketReaderWriter.cs b/MySQL.Data/src/X/Communication/XPacketReaderWriter.cs new file mode 100644 index 000000000..a9ead2a58 --- /dev/null +++ b/MySQL.Data/src/X/Communication/XPacketReaderWriter.cs @@ -0,0 +1,151 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Google.Protobuf; +using MySql.Data.Common; +using MySql.Data.X.Communication; +using Mysqlx; +using Mysqlx.Connection; +using System; +using System.IO; +using System.Net.Sockets; + +namespace MySqlX.Communication +{ + internal class XPacketReaderWriter + { + private Stream _stream; + private Socket _socket; + private XPacketProcessor _packetProcessor; + + /// + /// Constructor that sets the stream used to read or write data. + /// + /// The stream used to read or write data. + /// The socket to use. + public XPacketReaderWriter(Stream stream, Socket socket) + { + _stream = stream; + _socket = socket; + _packetProcessor = new XPacketProcessor(stream); + } + + /// + /// Constructor that sets the stream used to read or write data and the compression controller. + /// + /// The stream used to read or write data. + /// The compression controller for reading. + /// The compression controller for writing. + /// The socket to use. + public XPacketReaderWriter(Stream stream, XCompressionController compressionReadController, XCompressionController compressionWriteController, Socket socket) + { + _stream = stream; + _socket = socket; + CompressionReadController = compressionReadController; + CompressionWriteController = compressionWriteController; + _packetProcessor = new XPacketProcessor(stream, CompressionReadController); + } + + /// + /// Gets or sets the compression controller uses to manage compression operations. + /// + public XCompressionController CompressionReadController { get; private set; } + public XCompressionController CompressionWriteController { get; private set; } + + /// + /// Writes X Protocol frames to the X Plugin. + /// + /// The integer representation of the client message identifier used for the message. + /// The message to include in the X Protocol frame. + public void Write(int id, IMessage message) + { + var messageSize = message.CalculateSize(); + _packetProcessor.ProcessPendingPackets(_socket); + if (CompressionWriteController != null + && CompressionWriteController.IsCompressionEnabled + && messageSize > XCompressionController.COMPRESSION_THRESHOLD + && CompressionWriteController.ClientSupportedCompressedMessages.Contains((ClientMessageId)id) + ) + { + // Build the compression protobuf message. + var messageHeader = new byte[5]; + var messageBytes = message.ToByteArray(); + byte[] payload = new byte[messageHeader.Length + messageBytes.Length]; + var sizeArray = BitConverter.GetBytes(messageSize + 1); + Buffer.BlockCopy(sizeArray, 0, messageHeader, 0, sizeArray.Length); + messageHeader[4] = (byte)id; + Buffer.BlockCopy(messageHeader, 0, payload, 0, messageHeader.Length); + Buffer.BlockCopy(messageBytes, 0, payload, messageHeader.Length, messageBytes.Length); + + var compression = new Compression(); + compression.UncompressedSize = (ulong)(messageSize + messageHeader.Length); + compression.ClientMessages = (ClientMessages.Types.Type)id; + compression.Payload = ByteString.CopyFrom(CompressionWriteController.Compress(payload)); + + // Build the X Protocol frame. + _stream.Write(BitConverter.GetBytes(compression.CalculateSize() + 1), 0, 4); + _stream.WriteByte((byte)(ClientMessageId.COMPRESSION)); + if (messageSize > 0) + { + compression.WriteTo(_stream); + } + } + else + { + _stream.Write(BitConverter.GetBytes(messageSize + 1), 0, 4); + _stream.WriteByte((byte)id); + if (messageSize > 0) + { + message.WriteTo(_stream); + } + } + + _stream.Flush(); + } + + /// + /// Writes X Protocol frames to the X Plugin. + /// + /// The client message identifier used for the message. + /// The message to include in the X Protocol frame. + public void Write(ClientMessageId id, IMessage message) + { + Write((int)id, message); + } + + /// + /// Reads X Protocol frames incoming from the X Plugin. + /// + /// A instance representing the X Protocol frame that was read. + public CommunicationPacket Read() + { + return _packetProcessor.GetPacketFromNetworkStream(true); + } + + } +} diff --git a/MySQL.Data/src/X/Data/CollationMap.cs b/MySQL.Data/src/X/Data/CollationMap.cs new file mode 100644 index 000000000..11b694d94 --- /dev/null +++ b/MySQL.Data/src/X/Data/CollationMap.cs @@ -0,0 +1,342 @@ +// Copyright © 2016, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using System; +using System.Collections.Generic; + +namespace MySqlX.Data +{ + internal class CollationMap + { + private static Dictionary collations = new Dictionary(); + + static CollationMap() + { + Load(); + } + + public static string GetCollationName(int collation) + { + if (!collations.ContainsKey(collation)) + throw new KeyNotFoundException(String.Format(ResourcesX.InvalidCollationId, collation)); + return collations[collation]; + } + + private static void Load() + { + collations.Add(0, "utf8mb3_general_ci"); + collations.Add(1, "big5_chinese_ci"); + collations.Add(2, "latin2_czech_cs"); + collations.Add(3, "dec8_swedish_ci"); + collations.Add(4, "cp850_general_ci"); + collations.Add(5, "latin1_german1_ci"); + collations.Add(6, "hp8_english_ci"); + collations.Add(7, "koi8r_general_ci"); + collations.Add(8, "latin1_swedish_ci"); + collations.Add(9, "latin2_general_ci"); + collations.Add(10, "swe7_swedish_ci"); + collations.Add(11, "ascii_general_ci"); + collations.Add(12, "ujis_japanese_ci"); + collations.Add(13, "sjis_japanese_ci"); + collations.Add(14, "cp1251_bulgarian_ci"); + collations.Add(15, "latin1_danish_ci"); + collations.Add(16, "hebrew_general_ci"); + collations.Add(18, "tis620_thai_ci"); + collations.Add(19, "euckr_korean_ci"); + collations.Add(20, "latin7_estonian_cs"); + collations.Add(21, "latin2_hungarian_ci"); + collations.Add(22, "koi8u_general_ci"); + collations.Add(23, "cp1251_ukrainian_ci"); + collations.Add(24, "gb2312_chinese_ci"); + collations.Add(25, "greek_general_ci"); + collations.Add(26, "cp1250_general_ci"); + collations.Add(27, "latin2_croatian_ci"); + collations.Add(28, "gbk_chinese_ci"); + collations.Add(29, "cp1257_lithuanian_ci"); + collations.Add(30, "latin5_turkish_ci"); + collations.Add(31, "latin1_german2_ci"); + collations.Add(32, "armscii8_general_ci"); + collations.Add(33, "utf8mb3_general_ci"); + collations.Add(34, "cp1250_czech_cs"); + collations.Add(35, "ucs2_general_ci"); + collations.Add(36, "cp866_general_ci"); + collations.Add(37, "keybcs2_general_ci"); + collations.Add(38, "macce_general_ci"); + collations.Add(39, "macroman_general_ci"); + collations.Add(40, "cp852_general_ci"); + collations.Add(41, "latin7_general_ci"); + collations.Add(42, "latin7_general_cs"); + collations.Add(43, "macce_bin"); + collations.Add(44, "cp1250_croatian_ci"); + collations.Add(45, "utf8mb4_general_ci"); + collations.Add(46, "utf8mb4_bin"); + collations.Add(47, "latin1_bin"); + collations.Add(48, "latin1_general_ci"); + collations.Add(49, "latin1_general_cs"); + collations.Add(50, "cp1251_bin"); + collations.Add(51, "cp1251_general_ci"); + collations.Add(52, "cp1251_general_cs"); + collations.Add(53, "macroman_bin"); + collations.Add(54, "utf16_general_ci"); + collations.Add(55, "utf16_bin"); + collations.Add(56, "utf16le_general_ci"); + collations.Add(57, "cp1256_general_ci"); + collations.Add(58, "cp1257_bin"); + collations.Add(59, "cp1257_general_ci"); + collations.Add(60, "utf32_general_ci"); + collations.Add(61, "utf32_bin"); + collations.Add(62, "utf16le_bin"); + collations.Add(63, "binary"); + collations.Add(64, "armscii8_bin"); + collations.Add(65, "ascii_bin"); + collations.Add(66, "cp1250_bin"); + collations.Add(67, "cp1256_bin"); + collations.Add(68, "cp866_bin"); + collations.Add(69, "dec8_bin"); + collations.Add(70, "greek_bin"); + collations.Add(71, "hebrew_bin"); + collations.Add(72, "hp8_bin"); + collations.Add(73, "keybcs2_bin"); + collations.Add(74, "koi8r_bin"); + collations.Add(75, "koi8u_bin"); + collations.Add(76, "utf8mb3_tolower_ci"); + collations.Add(77, "latin2_bin"); + collations.Add(78, "latin5_bin"); + collations.Add(79, "latin7_bin"); + collations.Add(80, "cp850_bin"); + collations.Add(81, "cp852_bin"); + collations.Add(82, "swe7_bin"); + collations.Add(83, "utf8mb3_bin"); + collations.Add(84, "big5_bin"); + collations.Add(85, "euckr_bin"); + collations.Add(86, "gb2312_bin"); + collations.Add(87, "gbk_bin"); + collations.Add(88, "sjis_bin"); + collations.Add(89, "tis620_bin"); + collations.Add(90, "ucs2_bin"); + collations.Add(91, "ujis_bin"); + collations.Add(92, "geostd8_general_ci"); + collations.Add(93, "geostd8_bin"); + collations.Add(94, "latin1_spanish_ci"); + collations.Add(95, "cp932_japanese_ci"); + collations.Add(96, "cp932_bin"); + collations.Add(97, "eucjpms_japanese_ci"); + collations.Add(98, "eucjpms_bin"); + collations.Add(99, "cp1250_polish_ci"); + collations.Add(101, "utf16_unicode_ci"); + collations.Add(102, "utf16_icelandic_ci"); + collations.Add(103, "utf16_latvian_ci"); + collations.Add(104, "utf16_romanian_ci"); + collations.Add(105, "utf16_slovenian_ci"); + collations.Add(106, "utf16_polish_ci"); + collations.Add(107, "utf16_estonian_ci"); + collations.Add(108, "utf16_spanish_ci"); + collations.Add(109, "utf16_swedish_ci"); + collations.Add(110, "utf16_turkish_ci"); + collations.Add(111, "utf16_czech_ci"); + collations.Add(112, "utf16_danish_ci"); + collations.Add(113, "utf16_lithuanian_ci"); + collations.Add(114, "utf16_slovak_ci"); + collations.Add(115, "utf16_spanish2_ci"); + collations.Add(116, "utf16_roman_ci"); + collations.Add(117, "utf16_persian_ci"); + collations.Add(118, "utf16_esperanto_ci"); + collations.Add(119, "utf16_hungarian_ci"); + collations.Add(120, "utf16_sinhala_ci"); + collations.Add(121, "utf16_german2_ci"); + collations.Add(122, "utf16_croatian_ci"); + collations.Add(123, "utf16_unicode_520_ci"); + collations.Add(124, "utf16_vietnamese_ci"); + collations.Add(128, "ucs2_unicode_ci"); + collations.Add(129, "ucs2_icelandic_ci"); + collations.Add(130, "ucs2_latvian_ci"); + collations.Add(131, "ucs2_romanian_ci"); + collations.Add(132, "ucs2_slovenian_ci"); + collations.Add(133, "ucs2_polish_ci"); + collations.Add(134, "ucs2_estonian_ci"); + collations.Add(135, "ucs2_spanish_ci"); + collations.Add(136, "ucs2_swedish_ci"); + collations.Add(137, "ucs2_turkish_ci"); + collations.Add(138, "ucs2_czech_ci"); + collations.Add(139, "ucs2_danish_ci"); + collations.Add(140, "ucs2_lithuanian_ci"); + collations.Add(141, "ucs2_slovak_ci"); + collations.Add(142, "ucs2_spanish2_ci"); + collations.Add(143, "ucs2_roman_ci"); + collations.Add(144, "ucs2_persian_ci"); + collations.Add(145, "ucs2_esperanto_ci"); + collations.Add(146, "ucs2_hungarian_ci"); + collations.Add(147, "ucs2_sinhala_ci"); + collations.Add(148, "ucs2_german2_ci"); + collations.Add(149, "ucs2_croatian_ci"); + collations.Add(150, "ucs2_unicode_520_ci"); + collations.Add(151, "ucs2_vietnamese_ci"); + collations.Add(159, "ucs2_general_mysql500_ci"); + collations.Add(160, "utf32_unicode_ci"); + collations.Add(161, "utf32_icelandic_ci"); + collations.Add(162, "utf32_latvian_ci"); + collations.Add(163, "utf32_romanian_ci"); + collations.Add(164, "utf32_slovenian_ci"); + collations.Add(165, "utf32_polish_ci"); + collations.Add(166, "utf32_estonian_ci"); + collations.Add(167, "utf32_spanish_ci"); + collations.Add(168, "utf32_swedish_ci"); + collations.Add(169, "utf32_turkish_ci"); + collations.Add(170, "utf32_czech_ci"); + collations.Add(171, "utf32_danish_ci"); + collations.Add(172, "utf32_lithuanian_ci"); + collations.Add(173, "utf32_slovak_ci"); + collations.Add(174, "utf32_spanish2_ci"); + collations.Add(175, "utf32_roman_ci"); + collations.Add(176, "utf32_persian_ci"); + collations.Add(177, "utf32_esperanto_ci"); + collations.Add(178, "utf32_hungarian_ci"); + collations.Add(179, "utf32_sinhala_ci"); + collations.Add(180, "utf32_german2_ci"); + collations.Add(181, "utf32_croatian_ci"); + collations.Add(182, "utf32_unicode_520_ci"); + collations.Add(183, "utf32_vietnamese_ci"); + collations.Add(192, "utf8mb3_unicode_ci"); + collations.Add(193, "utf8mb3_icelandic_ci"); + collations.Add(194, "utf8mb3_latvian_ci"); + collations.Add(195, "utf8mb3_romanian_ci"); + collations.Add(196, "utf8mb3_slovenian_ci"); + collations.Add(197, "utf8mb3_polish_ci"); + collations.Add(198, "utf8mb3_estonian_ci"); + collations.Add(199, "utf8mb3_spanish_ci"); + collations.Add(200, "utf8mb3_swedish_ci"); + collations.Add(201, "utf8mb3_turkish_ci"); + collations.Add(202, "utf8mb3_czech_ci"); + collations.Add(203, "utf8mb3_danish_ci"); + collations.Add(204, "utf8mb3_lithuanian_ci"); + collations.Add(205, "utf8mb3_slovak_ci"); + collations.Add(206, "utf8mb3_spanish2_ci"); + collations.Add(207, "utf8mb3_roman_ci"); + collations.Add(208, "utf8mb3_persian_ci"); + collations.Add(209, "utf8mb3_esperanto_ci"); + collations.Add(210, "utf8mb3_hungarian_ci"); + collations.Add(211, "utf8mb3_sinhala_ci"); + collations.Add(212, "utf8mb3_german2_ci"); + collations.Add(213, "utf8mb3_croatian_ci"); + collations.Add(214, "utf8mb3_unicode_520_ci"); + collations.Add(215, "utf8mb3_vietnamese_ci"); + collations.Add(223, "utf8mb3_general_mysql500_ci"); + collations.Add(224, "utf8mb4_unicode_ci"); + collations.Add(225, "utf8mb4_icelandic_ci"); + collations.Add(226, "utf8mb4_latvian_ci"); + collations.Add(227, "utf8mb4_romanian_ci"); + collations.Add(228, "utf8mb4_slovenian_ci"); + collations.Add(229, "utf8mb4_polish_ci"); + collations.Add(230, "utf8mb4_estonian_ci"); + collations.Add(231, "utf8mb4_spanish_ci"); + collations.Add(232, "utf8mb4_swedish_ci"); + collations.Add(233, "utf8mb4_turkish_ci"); + collations.Add(234, "utf8mb4_czech_ci"); + collations.Add(235, "utf8mb4_danish_ci"); + collations.Add(236, "utf8mb4_lithuanian_ci"); + collations.Add(237, "utf8mb4_slovak_ci"); + collations.Add(238, "utf8mb4_spanish2_ci"); + collations.Add(239, "utf8mb4_roman_ci"); + collations.Add(240, "utf8mb4_persian_ci"); + collations.Add(241, "utf8mb4_esperanto_ci"); + collations.Add(242, "utf8mb4_hungarian_ci"); + collations.Add(243, "utf8mb4_sinhala_ci"); + collations.Add(244, "utf8mb4_german2_ci"); + collations.Add(245, "utf8mb4_croatian_ci"); + collations.Add(246, "utf8mb4_unicode_520_ci"); + collations.Add(247, "utf8mb4_vietnamese_ci"); + collations.Add(248, "gb18030_chinese_ci"); + collations.Add(249, "gb18030_bin"); + collations.Add(250, "gb18030_unicode_520_ci"); + collations.Add(255, "utf8mb4_0900_ai_ci"); + collations.Add(256, "utf8mb4_de_pb_0900_ai_ci"); + collations.Add(257, "utf8mb4_is_0900_ai_ci"); + collations.Add(258, "utf8mb4_lv_0900_ai_ci"); + collations.Add(259, "utf8mb4_ro_0900_ai_ci"); + collations.Add(260, "utf8mb4_sl_0900_ai_ci"); + collations.Add(261, "utf8mb4_pl_0900_ai_ci"); + collations.Add(262, "utf8mb4_et_0900_ai_ci"); + collations.Add(263, "utf8mb4_es_0900_ai_ci"); + collations.Add(264, "utf8mb4_sv_0900_ai_ci"); + collations.Add(265, "utf8mb4_tr_0900_ai_ci"); + collations.Add(266, "utf8mb4_cs_0900_ai_ci"); + collations.Add(267, "utf8mb4_da_0900_ai_ci"); + collations.Add(268, "utf8mb4_lt_0900_ai_ci"); + collations.Add(269, "utf8mb4_sk_0900_ai_ci"); + collations.Add(270, "utf8mb4_es_trad_0900_ai_ci"); + collations.Add(271, "utf8mb4_la_0900_ai_ci"); + collations.Add(273, "utf8mb4_eo_0900_ai_ci"); + collations.Add(274, "utf8mb4_hu_0900_ai_ci"); + collations.Add(275, "utf8mb4_hr_0900_ai_ci"); + collations.Add(277, "utf8mb4_vi_0900_ai_ci"); + collations.Add(278, "utf8mb4_0900_as_cs"); + collations.Add(279, "utf8mb4_de_pb_0900_as_cs"); + collations.Add(280, "utf8mb4_is_0900_as_cs"); + collations.Add(281, "utf8mb4_lv_0900_as_cs"); + collations.Add(282, "utf8mb4_ro_0900_as_cs"); + collations.Add(283, "utf8mb4_sl_0900_as_cs"); + collations.Add(284, "utf8mb4_pl_0900_as_cs"); + collations.Add(285, "utf8mb4_et_0900_as_cs"); + collations.Add(286, "utf8mb4_es_0900_as_cs"); + collations.Add(287, "utf8mb4_sv_0900_as_cs"); + collations.Add(288, "utf8mb4_tr_0900_as_cs"); + collations.Add(289, "utf8mb4_cs_0900_as_cs"); + collations.Add(290, "utf8mb4_da_0900_as_cs"); + collations.Add(291, "utf8mb4_lt_0900_as_cs"); + collations.Add(292, "utf8mb4_sk_0900_as_cs"); + collations.Add(293, "utf8mb4_es_trad_0900_as_cs"); + collations.Add(294, "utf8mb4_la_0900_as_cs"); + collations.Add(296, "utf8mb4_eo_0900_as_cs"); + collations.Add(297, "utf8mb4_hu_0900_as_cs"); + collations.Add(298, "utf8mb4_hr_0900_as_cs"); + collations.Add(300, "utf8mb4_vi_0900_as_cs"); + collations.Add(303, "utf8mb4_ja_0900_as_cs"); + collations.Add(304, "utf8mb4_ja_0900_as_cs_ks"); + collations.Add(305, "utf8mb4_0900_as_ci"); + collations.Add(306, "utf8mb4_ru_0900_ai_ci"); + collations.Add(307, "utf8mb4_ru_0900_as_cs"); + collations.Add(308, "utf8mb4_zh_0900_as_cs"); + collations.Add(309, "utf8mb4_0900_bin"); + collations.Add(310, "utf8mb4_nb_0900_ai_ci"); + collations.Add(311, "utf8mb4_nb_0900_as_cs"); + collations.Add(312, "utf8mb4_nn_0900_ai_ci"); + collations.Add(313, "utf8mb4_nn_0900_as_cs"); + collations.Add(314, "utf8mb4_sr_latn_0900_ai_ci"); + collations.Add(315, "utf8mb4_sr_latn_0900_as_cs"); + collations.Add(316, "utf8mb4_bs_0900_ai_ci"); + collations.Add(317, "utf8mb4_bs_0900_as_cs"); + collations.Add(318, "utf8mb4_bg_0900_ai_ci"); + collations.Add(319, "utf8mb4_bg_0900_as_cs"); + collations.Add(320, "utf8mb4_gl_0900_ai_ci"); + collations.Add(321, "utf8mb4_gl_0900_as_cs"); + collations.Add(322, "utf8mb4_mn_cyrl_0900_ai_ci"); + collations.Add(323, "utf8mb4_mn_cyrl_0900_as_cs"); + } + } +} diff --git a/MySQL.Data/src/X/Data/Enums.cs b/MySQL.Data/src/X/Data/Enums.cs new file mode 100644 index 000000000..7eea5cfee --- /dev/null +++ b/MySQL.Data/src/X/Data/Enums.cs @@ -0,0 +1,61 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySqlX.DataAccess +{ + internal enum ConnectionMode + { + Offline = 0, + ReadOnly = 1, + WriteOnly = 2, + ReadWrite = 3 + } + + internal enum AuthenticationMode + { + PlainAccess = 0, + MySQL41 = 1 + } + + internal enum OS + { + Unknown = 0, + Windows, + Linux, + MacOS + } + + internal enum PreparedStatementType + { + Find = 0, + Insert, + Update, + Delete, + SqlStatement + } +} diff --git a/MySQL.Data/src/X/Protocol/ProtocolBase.cs b/MySQL.Data/src/X/Protocol/ProtocolBase.cs new file mode 100644 index 000000000..e8e469313 --- /dev/null +++ b/MySQL.Data/src/X/Protocol/ProtocolBase.cs @@ -0,0 +1,53 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +using System.Collections.Generic; +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Common; +using MySqlX.XDevAPI.Relational; + +namespace MySqlX.Protocol +{ + + /// + /// Abstract class for the protocol base operations in client/server communication. + /// + /// + public abstract class ProtocolBase + { + public abstract List ReadRow(BaseResult rs); + public abstract void SendSQL(string sql, params object[] args); + + public abstract bool HasData(BaseResult rs); + + public abstract List LoadColumnMetadata(); + + public abstract void CloseResult(BaseResult rs); + } +} diff --git a/MySQL.Data/src/X/Protocol/ValueDecoder.cs b/MySQL.Data/src/X/Protocol/ValueDecoder.cs new file mode 100644 index 000000000..5ec439f9f --- /dev/null +++ b/MySQL.Data/src/X/Protocol/ValueDecoder.cs @@ -0,0 +1,48 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Relational; + +namespace MySqlX.Protocol +{ + internal abstract class ValueDecoder + { + + public delegate object ClrDecoderDelegate(byte[] bytes); + + + public Column Column { get; set; } + + public uint Flags { get; set; } + public uint ContentType { get; set; } + + public abstract void SetMetadata(); + public ClrDecoderDelegate ClrValueDecoder; + } +} diff --git a/MySQL.Data/src/X/Protocol/X/BitDecoder.cs b/MySQL.Data/src/X/Protocol/X/BitDecoder.cs new file mode 100644 index 000000000..cc8971581 --- /dev/null +++ b/MySQL.Data/src/X/Protocol/X/BitDecoder.cs @@ -0,0 +1,55 @@ +// Copyright © 2016, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +using Google.Protobuf; +using MySql.Data.MySqlClient.X.XDevAPI.Common; +using System; + +namespace MySqlX.Protocol.X +{ + internal class BitDecoder : ValueDecoder + { + public override void SetMetadata() + { + Column.Type = ColumnType.Bit; + Column.ClrType = typeof(UInt64); + ClrValueDecoder = BitValueDecoder; + } + + private UInt64 ReadUInt(byte[] bytes) + { + return new CodedInputStream(bytes).ReadUInt64(); + } + + private object BitValueDecoder(byte[] bytes) + { + return ReadUInt(bytes); + } + } +} diff --git a/MySQL.Data/src/X/Protocol/X/ByteDecoder.cs b/MySQL.Data/src/X/Protocol/X/ByteDecoder.cs new file mode 100644 index 000000000..af7e0f8ba --- /dev/null +++ b/MySQL.Data/src/X/Protocol/X/ByteDecoder.cs @@ -0,0 +1,100 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySql.Data.MySqlClient.X.XDevAPI.Common; +using System; +using System.Text; + +namespace MySqlX.Protocol.X +{ + internal class ByteDecoder : ValueDecoder + { + private Encoding _encoding; + private bool _isEnum; + + public ByteDecoder(bool isEnum) + { + _isEnum = isEnum; + } + + public override void SetMetadata() + { + Column.Type = GetDbType(); + Column.ClrType = GetClrType(Column.Type); + Column.IsPadded = (Flags & 1) != 0; + ClrValueDecoder = GetClrValueDecoder(); + } + + private ColumnType GetDbType() + { + if (_isEnum) + return ColumnType.Enum; + if (ContentType == (uint)ColumnContentType.Geometry) + return ColumnType.Geometry; + if (ContentType == (uint)ColumnContentType.Json) + return ColumnType.Json; + if ((Column.CollationName ?? "").Equals("binary", StringComparison.OrdinalIgnoreCase)) + return ColumnType.Bytes; + return ColumnType.String; + } + + private Type GetClrType(ColumnType dbType) + { + if (dbType == ColumnType.String || dbType == ColumnType.Json + || dbType == ColumnType.Enum) + return typeof(string); + return typeof(byte[]); + } + + private ClrDecoderDelegate GetClrValueDecoder() + { + if (Column.ClrType == typeof(String)) return StringValueDecoder; + return ByteValueDecoder; + } + + private object StringValueDecoder(byte[] bytes) + { + if (bytes.Length == 0) return null; + + if (_encoding == null) + { + string charset = Column.CharacterSetName ?? string.Empty; + _encoding = CharSetMap.GetEncoding(charset); + } + return _encoding.GetString(bytes, 0, bytes.Length - 1); + } + + private object ByteValueDecoder(byte[] bytes) + { + byte[] newValue = new byte[bytes.Length - 1]; + Array.Copy(bytes, newValue, newValue.Length); + return newValue; + } + } +} diff --git a/MySQL.Data/src/X/Protocol/X/DecimalDecoder.cs b/MySQL.Data/src/X/Protocol/X/DecimalDecoder.cs new file mode 100644 index 000000000..1b4360db5 --- /dev/null +++ b/MySQL.Data/src/X/Protocol/X/DecimalDecoder.cs @@ -0,0 +1,81 @@ +// Copyright © 2016, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +using MySql.Data; +using MySql.Data.MySqlClient.X.XDevAPI.Common; +using MySqlX.Data; +using System; + +namespace MySqlX.Protocol.X +{ + internal class DecimalDecoder : ValueDecoder + { + public override void SetMetadata() + { + Column.Type = ColumnType.Decimal; + Column.ClrType = typeof(decimal); + ClrValueDecoder = DecimalValueDecoder; + } + + private object DecimalValueDecoder(byte[] bytes) + { + // this decoder is based on the BCD standard + int scale = bytes[0]; + byte sign = bytes[bytes.Length - 1]; + string stringValue = string.Empty; + string lastDigit = string.Empty; + + if (sign == 0xc0) + stringValue = "+"; + else if (sign == 0xd0) + stringValue = "-"; + else if((sign & 0x0F) == 0x0c) + { + stringValue = "+"; + lastDigit = (sign >> 4).ToString(); + } + else if((sign & 0x0F) == 0x0d) + { + stringValue = "-"; + lastDigit = (sign >> 4).ToString(); + } + else + throw new FormatException(ResourcesX.InvalidDecimalFormat); + + for(int i = 1; i < bytes.Length - 1; i++) + { + stringValue += bytes[i].ToString("x2"); + } + stringValue += lastDigit; + stringValue = stringValue.Insert(stringValue.Length - scale, "."); + + return Decimal.Parse(stringValue); + } + } +} diff --git a/MySQL.Data/src/X/Protocol/X/Enum.cs b/MySQL.Data/src/X/Protocol/X/Enum.cs new file mode 100644 index 000000000..371c10f38 --- /dev/null +++ b/MySQL.Data/src/X/Protocol/X/Enum.cs @@ -0,0 +1,68 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MySqlX.Protocol.X +{ + internal enum NoticeType : int + { + Warning = 1, + SessionVariableChanged = 2, + SessionStateChanged = 3, + } + + internal enum RowLock : int + { + SharedLock = 1, + ExclusiveLock = 2 + } + + internal static class XpluginStatementCommand + { + public static readonly string XPLUGIN_STMT_CREATE_COLLECTION = "create_collection"; + public static readonly string XPLUGIN_STMT_CREATE_COLLECTION_INDEX = "create_collection_index"; + public static readonly string XPLUGIN_STMT_DROP_COLLECTION = + "drop_collection"; + //Added to support schema validation, store the name of the command used by MySQL Server to modify collections + public static readonly string XPLUGIN_STMT_MODIFY_COLLECTION = "modify_collection_options"; + + public static readonly string XPLUGIN_STMT_DROP_COLLECTION_INDEX = "drop_collection_index"; + public static readonly string XPLUGIN_STMT_PING = "ping"; + public static readonly string XPLUGIN_STMT_LIST_OBJECTS = + "list_objects"; + public static readonly string XPLUGIN_STMT_ENABLE_NOTICES = "enable_notices"; + public static readonly string XPLUGIN_STMT_DISABLE_NOTICES = "disable_notices"; + public static readonly string XPLUGIN_STMT_LIST_NOTICES = + "list_notices"; + } +} diff --git a/Source/MySql.Data/X/Protocol/X/ExpUnparser.cs b/MySQL.Data/src/X/Protocol/X/ExpUnparser.cs similarity index 87% rename from Source/MySql.Data/X/Protocol/X/ExpUnparser.cs rename to MySQL.Data/src/X/Protocol/X/ExpUnparser.cs index 724937307..35d8ddac4 100644 --- a/Source/MySql.Data/X/Protocol/X/ExpUnparser.cs +++ b/MySQL.Data/src/X/Protocol/X/ExpUnparser.cs @@ -1,23 +1,29 @@ -// Copyright © 2015, 2016, Oracle and/or its affiliates. All rights reserved. +// Copyright © 2015, 2025, Oracle and/or its affiliates. // -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. // -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. // -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. // -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., // 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA using Mysqlx.Datatypes; diff --git a/Source/MySql.Data/X/Protocol/X/ExprParser.cs b/MySQL.Data/src/X/Protocol/X/ExprParser.cs similarity index 87% rename from Source/MySql.Data/X/Protocol/X/ExprParser.cs rename to MySQL.Data/src/X/Protocol/X/ExprParser.cs index f4622ef45..72df42454 100644 --- a/Source/MySql.Data/X/Protocol/X/ExprParser.cs +++ b/MySQL.Data/src/X/Protocol/X/ExprParser.cs @@ -1,23 +1,29 @@ -// Copyright © 2015, 2017, Oracle and/or its affiliates. All rights reserved. +// Copyright © 2015, 2025, Oracle and/or its affiliates. // -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. // -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. // -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. // -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., // 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA using Mysqlx.Crud; @@ -45,7 +51,7 @@ namespace MySqlX.Protocol.X // // CompExpr: ^ (GE/GT/LE/LT/EQ/NE ^)* // - // IlriExpr(ilri=IS/LIKE/REGEXP/IN/BETWEEN): ^ (ilri ^) + // IlriExpr(ilri=IS/LIKE/REGEXP/IN/BETWEEN/OVERLAPS): ^ (ilri ^) // // AndExpr: ^ (AND ^)* // @@ -63,7 +69,7 @@ internal class ExprParser /** Token stream produced by lexer. */ internal List tokens = new List(); /** Parser's position in token stream. */ - int tokenPos = 0; + internal int tokenPos = 0; /** * Mapping of names to positions for named placeholders. Used for both string values ":arg" and numeric values ":2". */ @@ -84,7 +90,6 @@ public ExprParser(string s, bool allowRelationalColumns) { this.stringValue = s; Lex(); - // java.util.stream.IntStream.range(0, this.tokens.size()).forEach(i -> System.err.println("[" + i + "] = " + this.tokens.get(i))); this.allowRelationalColumns = allowRelationalColumns; } @@ -97,7 +102,8 @@ public enum TokenType LSTRING, LNUM_INT, LNUM_DOUBLE, DOT, AT, COMMA, EQ, NE, GT, GE, LT, LE, BITAND, BITOR, BITXOR, LSHIFT, RSHIFT, PLUS, MINUS, STAR, SLASH, HEX, BIN, NEG, BANG, EROTEME, MICROSECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR, SECOND_MICROSECOND, MINUTE_MICROSECOND, MINUTE_SECOND, HOUR_MICROSECOND, HOUR_SECOND, HOUR_MINUTE, DAY_MICROSECOND, DAY_SECOND, DAY_MINUTE, DAY_HOUR, YEAR_MONTH, DOUBLESTAR, MOD, - COLON, ORDERBY_ASC, ORDERBY_DESC, AS, LCURLY, RCURLY, DOTSTAR, CAST, DECIMAL, UNSIGNED, SIGNED, INTEGER, DATE, TIME, DATETIME, CHAR, BINARY, JSON + COLON, ORDERBY_ASC, ORDERBY_DESC, AS, LCURLY, RCURLY, DOTSTAR, CAST, DECIMAL, UNSIGNED, SIGNED, INTEGER, DATE, TIME, DATETIME, CHAR, BINARY, JSON, + ARROW, DOUBLE_ARROW, OVERLAPS } /** @@ -135,7 +141,7 @@ public override string ToString() /** Mapping of reserved words to token types. */ static private Dictionary reservedWords = new Dictionary(); - static ExprParser () + static ExprParser() { reservedWords.Add("and", TokenType.AND); reservedWords.Add("or", TokenType.OR); @@ -188,6 +194,7 @@ static ExprParser () reservedWords.Add("char", TokenType.CHAR); reservedWords.Add("binary", TokenType.BINARY); reservedWords.Add("json", TokenType.BINARY); + reservedWords.Add("overlaps", TokenType.OVERLAPS); } /** @@ -224,11 +231,14 @@ private int LexNumber(int i) { i++; } + else if (Char.IsLetter(stringValue[i + 1])) + { + Identifier(ref i, start); + return i; + } } else if (!Char.IsDigit(c)) - { break; - } } if (isInt) { @@ -257,7 +267,12 @@ void Lex() } else if (Char.IsDigit(c)) { - i = LexNumber(i); + if (i != stringValue.Length - 1) + { + if (!Char.IsLetter(stringValue[i + 1]) || NextCharEquals(i, 'e')) i = LexNumber(i); + else Identifier(ref i, start); + } + else i = LexNumber(i); } else if (!(c == '_' || Char.IsLetter(c))) { @@ -271,7 +286,23 @@ void Lex() this.tokens.Add(new Token(TokenType.PLUS, c)); break; case '-': - this.tokens.Add(new Token(TokenType.MINUS, c)); + if (NextCharEquals(i, '>')) + { + i++; + if (NextCharEquals(i, '>')) + { + i++; + this.tokens.Add(new Token(TokenType.DOUBLE_ARROW, "->>")); + } + else + { + this.tokens.Add(new Token(TokenType.ARROW, "->")); + } + } + else + { + this.tokens.Add(new Token(TokenType.MINUS, c)); + } break; case '*': if (NextCharEquals(i, '*')) @@ -431,7 +462,8 @@ void Lex() { throw new ArgumentException("Unterminated string starting at " + start); } - this.tokens.Add(new Token(quoteChar == '`' ? TokenType.IDENT : TokenType.LSTRING, val.ToString())); + var value = val.ToString(); + this.tokens.Add(new Token(quoteChar == '`' ? TokenType.IDENT : TokenType.LSTRING, value == string.Empty ? "" : value)); break; default: throw new ArgumentException("Can't parse at pos: " + i); @@ -440,39 +472,63 @@ void Lex() else { // otherwise, it's an identifier - for (; i < this.stringValue.Length && (Char.IsLetterOrDigit(this.stringValue[i]) || this.stringValue[i] == '_'); ++i) - { - } - string val = this.stringValue.Substring(start, i - start); - string valLower = val.ToLowerInvariant(); - if (i < this.stringValue.Length) - { - // last char, this logic is artifact of the preceding loop - --i; - } - if (reservedWords.ContainsKey(valLower)) - { - // Map operator names to values the server understands - if ("and".Equals(valLower)) - { - this.tokens.Add(new Token(reservedWords[valLower], "&&")); - } - else if ("or".Equals(valLower)) - { - this.tokens.Add(new Token(reservedWords[valLower], "||")); - } - else - { - // we case-normalize reserved words - this.tokens.Add(new Token(reservedWords[valLower], valLower)); - } - } - else - { + Identifier(ref i, start); + } + } + } + + /* + * Adds a token of type identifier. + */ + void Identifier(ref int i, int start) + { + for (; i < this.stringValue.Length && (Char.IsLetterOrDigit(this.stringValue[i]) || this.stringValue[i] == '_'); ++i) + { + } + string val = this.stringValue.Substring(start, i - start); + string valLower = val.ToLowerInvariant(); + if (i < this.stringValue.Length) + { + // last char, this logic is artifact of the preceding loop + --i; + } + if (reservedWords.ContainsKey(valLower)) + { + // Map operator names to values the server understands + if ("and".Equals(valLower)) + { + this.tokens.Add(new Token(reservedWords[valLower], "&&")); + } + else if ("or".Equals(valLower)) + { + this.tokens.Add(new Token(reservedWords[valLower], "||")); + } + else + { + // we case-normalize reserved words + if (IsReservedWordFunctionCall(valLower, i)) this.tokens.Add(new Token(TokenType.IDENT, val)); - } + else + this.tokens.Add(new Token(reservedWords[valLower], valLower)); } } + else + { + this.tokens.Add(new Token(TokenType.IDENT, val)); + } + } + + bool IsReservedWordFunctionCall(string reservedWord, int position) + { + Token token = new Token(reservedWords[reservedWord], reservedWord); + if (token.type == TokenType.YEAR || token.type == TokenType.MONTH || token.type == TokenType.WEEK || + token.type == TokenType.DAY || token.type == TokenType.HOUR || token.type == TokenType.MINUTE || + token.type == TokenType.SECOND || token.type == TokenType.MICROSECOND || token.type == TokenType.QUARTER || + token.type == TokenType.TIME || token.type == TokenType.DATE || token.type == TokenType.CHAR || + token.type == TokenType.HEX || token.type == TokenType.BIN) + return this.stringValue.Length >= position + 2 && stringValue[position + 1] == '('; + else + return false; } /** @@ -744,6 +800,14 @@ Expr ParseColumnIdentifier() break; } } + if(CurrentTokenTypeEquals(TokenType.ARROW)) + { + ConsumeToken(TokenType.ARROW); + } + else if (CurrentTokenTypeEquals(TokenType.DOUBLE_ARROW)) + { + throw new NotSupportedException("Operator ->> not supported."); + } if (CurrentTokenTypeEquals(TokenType.AT)) { ConsumeToken(TokenType.AT); @@ -821,6 +885,16 @@ Expr AtomicExpr() Expr e = GetExpr(); ConsumeToken(TokenType.RPAREN); return e; + case TokenType.LSQBRACKET: + { + Mysqlx.Expr.Array builder = new Mysqlx.Expr.Array(); + ParseCommaSeparatedList(() => + { + return GetExpr(); + }).ForEach(f => builder.Value.Add(f)); + ConsumeToken(TokenType.RSQBRACKET); + return new Expr() { Type = Expr.Types.Type.Array, Array = builder }; + } case TokenType.LCURLY: // JSON object { Mysqlx.Expr.Object builder = new Mysqlx.Expr.Object(); @@ -1054,7 +1128,7 @@ Expr CompExpr() Expr IlriExpr() { Expr lhs = CompExpr(); - List expected = new List(new TokenType[] { TokenType.IS, TokenType.IN, TokenType.LIKE, TokenType.BETWEEN, TokenType.REGEXP, TokenType.NOT }); + List expected = new List(new TokenType[] { TokenType.IS, TokenType.IN, TokenType.LIKE, TokenType.BETWEEN, TokenType.REGEXP, TokenType.NOT, TokenType.OVERLAPS }); while (this.tokenPos < this.tokens.Count && expected.Contains(this.tokens[this.tokenPos].type)) { bool isNot = false; @@ -1081,7 +1155,12 @@ Expr IlriExpr() break; case TokenType.IN: ConsumeToken(TokenType.IN); - parameters.AddRange(ParenExprList()); + if (CurrentTokenTypeEquals(TokenType.LPAREN)) parameters.AddRange(ParenExprList()); + else + { + opName = "cont_in"; + parameters.Add(CompExpr()); + } break; case TokenType.LIKE: ConsumeToken(TokenType.LIKE); @@ -1104,6 +1183,10 @@ Expr IlriExpr() ConsumeToken(TokenType.REGEXP); parameters.Add(CompExpr()); break; + case TokenType.OVERLAPS: + ConsumeToken(TokenType.OVERLAPS); + parameters.Add(CompExpr()); + break; default: throw new ArgumentException("Unknown token after NOT at pos: " + this.tokenPos); } @@ -1252,9 +1335,14 @@ internal List ParseDocumentProjection() { Projection builder = new Projection(); builder.Source = GetExpr(); - // alias is not optional for document projection - ConsumeToken(TokenType.AS); - builder.Alias = ConsumeToken(TokenType.IDENT); + if (CurrentTokenTypeEquals(TokenType.AS)) + { + ConsumeToken(TokenType.AS); + builder.Alias = ConsumeToken(TokenType.IDENT); + } + else if (builder.Source.Identifier != null) + builder.Alias = builder.Source.Identifier.DocumentPath[0].Value; + return builder; }); } diff --git a/MySQL.Data/src/X/Protocol/X/ExprUtil.cs b/MySQL.Data/src/X/Protocol/X/ExprUtil.cs new file mode 100644 index 000000000..1753cfb36 --- /dev/null +++ b/MySQL.Data/src/X/Protocol/X/ExprUtil.cs @@ -0,0 +1,270 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using Mysqlx.Expr; +using Mysqlx.Datatypes; +using Mysqlx.Crud; +using Google.Protobuf; +using System.Collections.Generic; +using System.Reflection; + +namespace MySqlX.Protocol.X +{ + internal class ExprUtil + { + /** + * Proto-buf helper to build a LITERAL Expr with a Scalar NULL type. + */ + public static Expr BuildLiteralNullScalar() + { + return BuildLiteralExpr(NullScalar()); + } + + /** + * Proto-buf helper to build a LITERAL Expr with a Scalar DOUBLE type (wrapped in Any). + */ + public static Expr BuildLiteralScalar(double d) + { + return BuildLiteralExpr(ScalarOf(d)); + } + + /** + * Proto-buf helper to build a LITERAL Expr with a Scalar SINT (signed int) type (wrapped in Any). + */ + public static Expr BuildLiteralScalar(long l) + { + return BuildLiteralExpr(ScalarOf(l)); + } + + /** + * Proto-buf helper to build a LITERAL Expr with a Scalar UINT (unsigned int) type (wrapped in Any). + */ + public static Expr BuildLiteralScalar(ulong l) + { + return BuildLiteralExpr(ScalarOf(l)); + } + + /** + * Proto-buf helper to build a LITERAL Expr with a Scalar STRING type (wrapped in Any). + */ + public static Expr BuildLiteralScalar(String str) + { + return BuildLiteralExpr(ScalarOf(str)); + } + + /** + * Proto-buf helper to build a LITERAL Expr with a Scalar OCTETS type (wrapped in Any). + */ + public static Expr BuildLiteralScalar(byte[] bytes) + { + return BuildLiteralExpr(ScalarOf(bytes)); + } + + /** + * Proto-buf helper to build a LITERAL Expr with a Scalar BOOL type (wrapped in Any). + */ + public static Expr BuildLiteralScalar(Boolean b) + { + return BuildLiteralExpr(ScalarOf(b)); + } + + /** + * Wrap an Any value in a LITERAL expression. + */ + public static Expr BuildLiteralExpr(Scalar scalar) + { + return new Expr() { Type = Expr.Types.Type.Literal, Literal = scalar }; + } + + public static Scalar NullScalar() + { + return new Scalar() { Type = Scalar.Types.Type.VNull }; + } + + public static Scalar ScalarOf(double d) + { + return new Scalar() { Type = Scalar.Types.Type.VDouble, VDouble = d }; + } + + public static Scalar ScalarOf(long l) + { + return new Scalar() { Type = Scalar.Types.Type.VSint, VSignedInt = l}; + } + + public static Scalar ScalarOf(ulong ul) + { + return new Scalar() { Type = Scalar.Types.Type.VUint, VUnsignedInt = ul}; + } + + public static Scalar ScalarOf(String str) + { + Scalar.Types.String strValue = new Scalar.Types.String() { Value = ByteString.CopyFromUtf8(str) }; + return new Scalar() { Type = Scalar.Types.Type.VString, VString = strValue }; + } + + public static Scalar ScalarOf(byte[] bytes) + { + return new Scalar() { Type = Scalar.Types.Type.VOctets, VOctets = new Scalar.Types.Octets() { Value = ByteString.CopyFrom(bytes) } }; + } + + public static Scalar ScalarOf(Boolean b) + { + return new Scalar() { Type = Scalar.Types.Type.VBool, VBool = b }; + } + + /** + * Build an Any with a string value. + */ + public static Any BuildAny(String str) + { + // same as Expr + Scalar.Types.String sstr = new Scalar.Types.String(); + sstr.Value = ByteString.CopyFromUtf8(str); + Scalar s = new Scalar(); + s.Type = Scalar.Types.Type.VString; + s.VString = sstr; + Any a = new Any(); + a.Type = Any.Types.Type.Scalar; + a.Scalar = s; + return a; + } + + public static Mysqlx.Datatypes.Object.Types.ObjectField BuildObject(string key, object value, bool evaluateStringExpression) + { + Mysqlx.Datatypes.Object.Types.ObjectField item = new Mysqlx.Datatypes.Object.Types.ObjectField(); + item.Key = key; + item.Value = evaluateStringExpression ? BuildAny(value) : BuildAnyWithoutEvaluationExpression(value); + return item; + } + + public static Any BuildEmptyAny(Any.Types.Type type) + { + return new Any() { Type = type, Obj = new Mysqlx.Datatypes.Object() }; + } + + public static Any BuildAny(Boolean b) + { + return new Any() { Type = Any.Types.Type.Scalar, Scalar = ScalarOf(b) }; + } + + public static Any BuildAny(object value) + { + return new Any() { Type = Any.Types.Type.Scalar, Scalar = ExprUtil.ArgObjectToScalar(value) }; + } + + public static Any BuildAnyWithoutEvaluationExpression(object value) + { + return new Any() { Type = Any.Types.Type.Scalar, Scalar = ExprUtil.ArgObjectToScalar(value, false) }; + } + + public static Collection BuildCollection(String schemaName, String collectionName) + { + return new Collection() { Schema = schemaName, Name = collectionName }; + } + + public static Scalar ArgObjectToScalar(System.Object value, Boolean evaluateStringExpression = true) + { + return ArgObjectToExpr(value, false, evaluateStringExpression).Literal; + } + + public static Expr ArgObjectToExpr(System.Object value, Boolean allowRelationalColumns, Boolean evaluateStringExpresssion = true) + { + if (value == null) + return BuildLiteralNullScalar(); + + if (value is Dictionary) + value = new XDevAPI.DbDoc(value).ToString(); + + if (value is XDevAPI.MySqlExpression) + value = (value as XDevAPI.MySqlExpression).value; + + if (value is bool) + return BuildLiteralScalar(Convert.ToBoolean(value)); + else if (value is byte || value is short || value is int || value is long) + return BuildLiteralScalar(Convert.ToInt64(value)); + else if (value is ushort || value is uint || value is ulong) + return BuildLiteralScalar(Convert.ToUInt64(value)); + else if (value is float || value is double) + return BuildLiteralScalar(Convert.ToDouble(value)); + else if (value is string) + { + try + { + // try to parse expressions + var stringValue = (string) value; + if (!evaluateStringExpresssion) return BuildLiteralScalar((string)value); + + Expr expr = new ExprParser(stringValue).Parse(); + if (expr.Identifier != null) + return BuildLiteralScalar(stringValue); + return expr; + } + catch + { + // if can't parse, returns as literal + return BuildLiteralScalar((string)value); + } + } + else if (value is XDevAPI.DbDoc) + return (BuildLiteralScalar(value.ToString())); + + throw new NotSupportedException("Value of type " + value.GetType() + " is not currently supported."); + } + + public static string JoinString(string[] values) + { + if (values == null) return string.Empty; + return string.Join(", ", values); + } + + /// + /// Parses an anonymous object into a dictionary. + /// + /// The object to parse. + /// A dictionary if the provided object is an anonymous object; otherwise, null. + public static Dictionary ParseAnonymousObject(object value) + { + if (value == null) + return null; + + Type type = value.GetType(); + if (type.Name.Contains("Anonymous")) + { + Dictionary dictionary = new Dictionary(); + PropertyInfo[] props = type.GetProperties(); + foreach (PropertyInfo prop in props) + dictionary.Add(prop.Name, prop.GetValue(value, null)); + + return dictionary; + } + + return null; + } + } +} diff --git a/MySQL.Data/src/X/Protocol/X/FloatDecoder.cs b/MySQL.Data/src/X/Protocol/X/FloatDecoder.cs new file mode 100644 index 000000000..8c792f475 --- /dev/null +++ b/MySQL.Data/src/X/Protocol/X/FloatDecoder.cs @@ -0,0 +1,69 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + + +using MySqlX.Data; +using MySqlX.XDevAPI; +using System; +using MySql.Data.MySqlClient; +using MySqlX; +using MySql.Data.MySqlClient.X.XDevAPI.Common; +using Google.Protobuf; + +namespace MySqlX.Protocol.X +{ + internal class FloatDecoder : ValueDecoder + { + bool _float; + + public FloatDecoder(bool isFloat) + { + _float = isFloat; + } + + public override void SetMetadata() + { + Column.Type = _float ? ColumnType.Float : ColumnType.Double; + Column.ClrType = _float ? typeof(float) : typeof(double); + ClrValueDecoder = FloatValueDecoder; + if (!_float) + ClrValueDecoder = DoubleValueDecoder; + } + + private object FloatValueDecoder(byte[] bytes) + { + return new CodedInputStream(bytes).ReadFloat(); + } + + private object DoubleValueDecoder(byte[] bytes) + { + return new CodedInputStream(bytes).ReadDouble(); + } + } +} diff --git a/MySQL.Data/src/X/Protocol/X/IntegerDecoder.cs b/MySQL.Data/src/X/Protocol/X/IntegerDecoder.cs new file mode 100644 index 000000000..6ac733faf --- /dev/null +++ b/MySQL.Data/src/X/Protocol/X/IntegerDecoder.cs @@ -0,0 +1,158 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + + +using Google.Protobuf; +using MySql.Data.MySqlClient; +using MySql.Data.MySqlClient.X.XDevAPI.Common; +using MySqlX.Data; +using MySqlX.XDevAPI; +using System; + +namespace MySqlX.Protocol.X +{ + internal class IntegerDecoder : ValueDecoder + { + bool _signed; + + public IntegerDecoder(bool signed) + { + _signed = signed; + } + + public override void SetMetadata() + { + Column.Type = GetDbType(); + Column.IsNumberSigned = _signed; + Column.ClrType = _signed ? GetSignedClrType() : GetUnsignedClrType(); + ClrValueDecoder = _signed ? GetSignedValueDecoder() : GetUnsignedValueDecoder(); + Column.IsPadded = _signed ? false : (Flags & 1) != 0; + } + + private ColumnType GetDbType() + { + uint len = Column.Length + (_signed ? 0u : 1u); + if (len <= 4) return ColumnType.Tinyint; + else if (len <= 6) return ColumnType.Smallint; + else if (len <= 9) return ColumnType.Mediumint; + else if (len <= 11) return ColumnType.Int; + else return ColumnType.Bigint; + } + + private Type GetSignedClrType() + { + uint len = Column.Length; + if (len <= 4) return typeof(sbyte); + else if (len <= 6) return typeof(Int16); + else if (len <= 9) return typeof(Int32); + else if (len <= 11) return typeof(Int32); + else return typeof(Int64); + } + + private Type GetUnsignedClrType() + { + uint len = Column.Length; + if (len < 4) return typeof(byte); + else if (len < 6) return typeof(UInt16); + else if (len < 9) return typeof(UInt32); + else if (len < 11) return typeof(UInt32); + else return typeof(UInt64); + } + + private ClrDecoderDelegate GetSignedValueDecoder() + { + uint len = Column.Length; + if (len <= 4) return SByteValueDecoder; + else if (len <= 6) return Int16ValueDecoder; + else if (len <= 9) return Int32ValueDecoder; + else if (len <= 11) return Int32ValueDecoder; + else return Int64ValueDecoder; + } + + private ClrDecoderDelegate GetUnsignedValueDecoder() + { + uint len = Column.Length; + if (len < 4) return ByteValueDecoder; + else if (len < 6) return UInt16ValueDecoder; + else if (len < 9) return UInt32ValueDecoder; + else if (len < 11) return UInt32ValueDecoder; + else return UInt64ValueDecoder; + } + + private Int64 ReadInt(byte[] bytes) + { + return new CodedInputStream(bytes).ReadSInt64(); + } + + private UInt64 ReadUInt(byte[] bytes) + { + return new CodedInputStream(bytes).ReadUInt64(); + } + + public object SByteValueDecoder(byte[] bytes) + { + return (sbyte)ReadInt(bytes); + } + + public object Int16ValueDecoder(byte[] bytes) + { + return (Int16)ReadInt(bytes); + } + + public object Int32ValueDecoder(byte[] bytes) + { + return (Int32)ReadInt(bytes); + } + + public object Int64ValueDecoder(byte[] bytes) + { + return ReadInt(bytes); + } + + public object ByteValueDecoder(byte[] bytes) + { + return (byte)ReadUInt(bytes); + } + + public object UInt16ValueDecoder(byte[] bytes) + { + return (UInt16)ReadUInt(bytes); + } + + public object UInt32ValueDecoder(byte[] bytes) + { + return (UInt32)ReadUInt(bytes); + } + + public object UInt64ValueDecoder(byte[] bytes) + { + return (UInt64)ReadUInt(bytes); + } + } +} diff --git a/MySQL.Data/src/X/Protocol/X/Protobuf/Mysqlx.cs b/MySQL.Data/src/X/Protocol/X/Protobuf/Mysqlx.cs new file mode 100644 index 000000000..be76ea51a --- /dev/null +++ b/MySQL.Data/src/X/Protocol/X/Protobuf/Mysqlx.cs @@ -0,0 +1,1266 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +// +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: mysqlx.proto +// +#pragma warning disable 1591, 0612, 3021, 8981 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace Mysqlx +{ + + /// Holder for reflection information generated from mysqlx.proto + public static partial class MysqlxReflection + { + + #region Descriptor + /// File descriptor for mysqlx.proto + public static pbr::FileDescriptor Descriptor + { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static MysqlxReflection() + { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "CgxteXNxbHgucHJvdG8SBk15c3FseBogZ29vZ2xlL3Byb3RvYnVmL2Rlc2Ny", + "aXB0b3IucHJvdG8i/AMKDkNsaWVudE1lc3NhZ2VzIukDCgRUeXBlEhgKFENP", + "Tl9DQVBBQklMSVRJRVNfR0VUEAESGAoUQ09OX0NBUEFCSUxJVElFU19TRVQQ", + "AhINCglDT05fQ0xPU0UQAxIbChdTRVNTX0FVVEhFTlRJQ0FURV9TVEFSVBAE", + "Eh4KGlNFU1NfQVVUSEVOVElDQVRFX0NPTlRJTlVFEAUSDgoKU0VTU19SRVNF", + "VBAGEg4KClNFU1NfQ0xPU0UQBxIUChBTUUxfU1RNVF9FWEVDVVRFEAwSDQoJ", + "Q1JVRF9GSU5EEBESDwoLQ1JVRF9JTlNFUlQQEhIPCgtDUlVEX1VQREFURRAT", + "Eg8KC0NSVURfREVMRVRFEBQSDwoLRVhQRUNUX09QRU4QGBIQCgxFWFBFQ1Rf", + "Q0xPU0UQGRIUChBDUlVEX0NSRUFURV9WSUVXEB4SFAoQQ1JVRF9NT0RJRllf", + "VklFVxAfEhIKDkNSVURfRFJPUF9WSUVXECASEwoPUFJFUEFSRV9QUkVQQVJF", + "ECgSEwoPUFJFUEFSRV9FWEVDVVRFECkSFgoSUFJFUEFSRV9ERUFMTE9DQVRF", + "ECoSDwoLQ1VSU09SX09QRU4QKxIQCgxDVVJTT1JfQ0xPU0UQLBIQCgxDVVJT", + "T1JfRkVUQ0gQLRIPCgtDT01QUkVTU0lPThAuIvMCCg5TZXJ2ZXJNZXNzYWdl", + "cyLgAgoEVHlwZRIGCgJPSxAAEgkKBUVSUk9SEAESFQoRQ09OTl9DQVBBQklM", + "SVRJRVMQAhIeChpTRVNTX0FVVEhFTlRJQ0FURV9DT05USU5VRRADEhgKFFNF", + "U1NfQVVUSEVOVElDQVRFX09LEAQSCgoGTk9USUNFEAsSHgoaUkVTVUxUU0VU", + "X0NPTFVNTl9NRVRBX0RBVEEQDBIRCg1SRVNVTFRTRVRfUk9XEA0SGAoUUkVT", + "VUxUU0VUX0ZFVENIX0RPTkUQDhIdChlSRVNVTFRTRVRfRkVUQ0hfU1VTUEVO", + "REVEEA8SKAokUkVTVUxUU0VUX0ZFVENIX0RPTkVfTU9SRV9SRVNVTFRTRVRT", + "EBASFwoTU1FMX1NUTVRfRVhFQ1VURV9PSxAREigKJFJFU1VMVFNFVF9GRVRD", + "SF9ET05FX01PUkVfT1VUX1BBUkFNUxASEg8KC0NPTVBSRVNTSU9OEBMiFwoC", + "T2sSCwoDbXNnGAEgASgJOgSQ6jAAIo4BCgVFcnJvchIvCghzZXZlcml0eRgB", + "IAEoDjIWLk15c3FseC5FcnJvci5TZXZlcml0eToFRVJST1ISDAoEY29kZRgC", + "IAIoDRIRCglzcWxfc3RhdGUYBCACKAkSCwoDbXNnGAMgAigJIiAKCFNldmVy", + "aXR5EgkKBUVSUk9SEAASCQoFRkFUQUwQAToEkOowATpZChFjbGllbnRfbWVz", + "c2FnZV9pZBIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxihjQYg", + "ASgOMhsuTXlzcWx4LkNsaWVudE1lc3NhZ2VzLlR5cGU6WQoRc2VydmVyX21l", + "c3NhZ2VfaWQSHy5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMYoo0G", + "IAEoDjIbLk15c3FseC5TZXJ2ZXJNZXNzYWdlcy5UeXBlQhkKF2NvbS5teXNx", + "bC5jai54LnByb3RvYnVm")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { global::Google.Protobuf.Reflection.DescriptorReflection.Descriptor, }, + new pbr::GeneratedClrTypeInfo(null, new pb::Extension[] { MysqlxExtensions.ClientMessageId, MysqlxExtensions.ServerMessageId }, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.ClientMessages), global::Mysqlx.ClientMessages.Parser, null, null, new[]{ typeof(global::Mysqlx.ClientMessages.Types.Type) }, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.ServerMessages), global::Mysqlx.ServerMessages.Parser, null, null, new[]{ typeof(global::Mysqlx.ServerMessages.Types.Type) }, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Ok), global::Mysqlx.Ok.Parser, new[]{ "Msg" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Error), global::Mysqlx.Error.Parser, new[]{ "Severity", "Code", "SqlState", "Msg" }, null, new[]{ typeof(global::Mysqlx.Error.Types.Severity) }, null, null) + })); + } + #endregion + + } + /// Holder for extension identifiers generated from the top level of mysqlx.proto + public static partial class MysqlxExtensions + { + public static readonly pb::Extension ClientMessageId = + new pb::Extension(100001, pb::FieldCodec.ForEnum(800008, x => (int)x, x => (global::Mysqlx.ClientMessages.Types.Type)x, global::Mysqlx.ClientMessages.Types.Type.ConCapabilitiesGet)); + public static readonly pb::Extension ServerMessageId = + new pb::Extension(100002, pb::FieldCodec.ForEnum(800016, x => (int)x, x => (global::Mysqlx.ServerMessages.Types.Type)x, global::Mysqlx.ServerMessages.Types.Type.Ok)); + } + + #region Messages + /// + ///* + ///IDs of messages that can be sent from client to the server. + /// + ///@note + ///This message is never sent on the wire. It is only used to let ``protoc``: + ///- generate constants + ///- check for uniqueness + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class ClientMessages : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new ClientMessages()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.MysqlxReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ClientMessages() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ClientMessages(ClientMessages other) : this() + { + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ClientMessages Clone() + { + return new ClientMessages(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as ClientMessages); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(ClientMessages other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(ClientMessages other) + { + if (other == null) + { + return; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + } + } + } +#endif + + #region Nested types + /// Container for nested types declared in the ClientMessages message type. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static partial class Types + { + public enum Type + { + [pbr::OriginalName("CON_CAPABILITIES_GET")] ConCapabilitiesGet = 1, + [pbr::OriginalName("CON_CAPABILITIES_SET")] ConCapabilitiesSet = 2, + [pbr::OriginalName("CON_CLOSE")] ConClose = 3, + [pbr::OriginalName("SESS_AUTHENTICATE_START")] SessAuthenticateStart = 4, + [pbr::OriginalName("SESS_AUTHENTICATE_CONTINUE")] SessAuthenticateContinue = 5, + [pbr::OriginalName("SESS_RESET")] SessReset = 6, + [pbr::OriginalName("SESS_CLOSE")] SessClose = 7, + [pbr::OriginalName("SQL_STMT_EXECUTE")] SqlStmtExecute = 12, + [pbr::OriginalName("CRUD_FIND")] CrudFind = 17, + [pbr::OriginalName("CRUD_INSERT")] CrudInsert = 18, + [pbr::OriginalName("CRUD_UPDATE")] CrudUpdate = 19, + [pbr::OriginalName("CRUD_DELETE")] CrudDelete = 20, + [pbr::OriginalName("EXPECT_OPEN")] ExpectOpen = 24, + [pbr::OriginalName("EXPECT_CLOSE")] ExpectClose = 25, + [pbr::OriginalName("CRUD_CREATE_VIEW")] CrudCreateView = 30, + [pbr::OriginalName("CRUD_MODIFY_VIEW")] CrudModifyView = 31, + [pbr::OriginalName("CRUD_DROP_VIEW")] CrudDropView = 32, + [pbr::OriginalName("PREPARE_PREPARE")] PreparePrepare = 40, + [pbr::OriginalName("PREPARE_EXECUTE")] PrepareExecute = 41, + [pbr::OriginalName("PREPARE_DEALLOCATE")] PrepareDeallocate = 42, + [pbr::OriginalName("CURSOR_OPEN")] CursorOpen = 43, + [pbr::OriginalName("CURSOR_CLOSE")] CursorClose = 44, + [pbr::OriginalName("CURSOR_FETCH")] CursorFetch = 45, + [pbr::OriginalName("COMPRESSION")] Compression = 46, + } + + } + #endregion + + } + + /// + ///* + ///IDs of messages that can be sent from server to client. + /// + ///@note + ///This message is never sent on the wire. It is only used to let ``protoc``: + ///- generate constants + ///- check for uniqueness + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class ServerMessages : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new ServerMessages()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.MysqlxReflection.Descriptor.MessageTypes[1]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ServerMessages() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ServerMessages(ServerMessages other) : this() + { + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ServerMessages Clone() + { + return new ServerMessages(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as ServerMessages); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(ServerMessages other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(ServerMessages other) + { + if (other == null) + { + return; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + } + } + } +#endif + + #region Nested types + /// Container for nested types declared in the ServerMessages message type. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static partial class Types + { + public enum Type + { + [pbr::OriginalName("OK")] Ok = 0, + [pbr::OriginalName("ERROR")] Error = 1, + [pbr::OriginalName("CONN_CAPABILITIES")] ConnCapabilities = 2, + [pbr::OriginalName("SESS_AUTHENTICATE_CONTINUE")] SessAuthenticateContinue = 3, + [pbr::OriginalName("SESS_AUTHENTICATE_OK")] SessAuthenticateOk = 4, + /// + /// NOTICE has to stay at 11 forever + /// + [pbr::OriginalName("NOTICE")] Notice = 11, + [pbr::OriginalName("RESULTSET_COLUMN_META_DATA")] ResultsetColumnMetaData = 12, + [pbr::OriginalName("RESULTSET_ROW")] ResultsetRow = 13, + [pbr::OriginalName("RESULTSET_FETCH_DONE")] ResultsetFetchDone = 14, + [pbr::OriginalName("RESULTSET_FETCH_SUSPENDED")] ResultsetFetchSuspended = 15, + [pbr::OriginalName("RESULTSET_FETCH_DONE_MORE_RESULTSETS")] ResultsetFetchDoneMoreResultsets = 16, + [pbr::OriginalName("SQL_STMT_EXECUTE_OK")] SqlStmtExecuteOk = 17, + [pbr::OriginalName("RESULTSET_FETCH_DONE_MORE_OUT_PARAMS")] ResultsetFetchDoneMoreOutParams = 18, + [pbr::OriginalName("COMPRESSION")] Compression = 19, + } + + } + #endregion + + } + + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Ok : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Ok()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.MysqlxReflection.Descriptor.MessageTypes[2]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Ok() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Ok(Ok other) : this() + { + msg_ = other.msg_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Ok Clone() + { + return new Ok(this); + } + + /// Field number for the "msg" field. + public const int MsgFieldNumber = 1; + private readonly static string MsgDefaultValue = ""; + + private string msg_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Msg + { + get { return msg_ ?? MsgDefaultValue; } + set + { + msg_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "msg" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasMsg + { + get { return msg_ != null; } + } + /// Clears the value of the "msg" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearMsg() + { + msg_ = null; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Ok); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Ok other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (Msg != other.Msg) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasMsg) hash ^= Msg.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasMsg) { + output.WriteRawTag(10); + output.WriteString(Msg); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasMsg) + { + output.WriteRawTag(10); + output.WriteString(Msg); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasMsg) + { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Msg); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Ok other) + { + if (other == null) + { + return; + } + if (other.HasMsg) + { + Msg = other.Msg; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + Msg = input.ReadString(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + Msg = input.ReadString(); + break; + } + } + } + } +#endif + + } + + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Error : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Error()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.MysqlxReflection.Descriptor.MessageTypes[3]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Error() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Error(Error other) : this() + { + _hasBits0 = other._hasBits0; + severity_ = other.severity_; + code_ = other.code_; + sqlState_ = other.sqlState_; + msg_ = other.msg_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Error Clone() + { + return new Error(this); + } + + /// Field number for the "severity" field. + public const int SeverityFieldNumber = 1; + private readonly static global::Mysqlx.Error.Types.Severity SeverityDefaultValue = global::Mysqlx.Error.Types.Severity.Error; + + private global::Mysqlx.Error.Types.Severity severity_; + /// + ///* severity of the error message + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Error.Types.Severity Severity + { + get { if ((_hasBits0 & 1) != 0) { return severity_; } else { return SeverityDefaultValue; } } + set + { + _hasBits0 |= 1; + severity_ = value; + } + } + /// Gets whether the "severity" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasSeverity + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "severity" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearSeverity() + { + _hasBits0 &= ~1; + } + + /// Field number for the "code" field. + public const int CodeFieldNumber = 2; + private readonly static uint CodeDefaultValue = 0; + + private uint code_; + /// + ///* error code + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint Code + { + get { if ((_hasBits0 & 2) != 0) { return code_; } else { return CodeDefaultValue; } } + set + { + _hasBits0 |= 2; + code_ = value; + } + } + /// Gets whether the "code" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasCode + { + get { return (_hasBits0 & 2) != 0; } + } + /// Clears the value of the "code" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearCode() + { + _hasBits0 &= ~2; + } + + /// Field number for the "sql_state" field. + public const int SqlStateFieldNumber = 4; + private readonly static string SqlStateDefaultValue = ""; + + private string sqlState_; + /// + ///* SQL state + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string SqlState + { + get { return sqlState_ ?? SqlStateDefaultValue; } + set + { + sqlState_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "sql_state" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasSqlState + { + get { return sqlState_ != null; } + } + /// Clears the value of the "sql_state" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearSqlState() + { + sqlState_ = null; + } + + /// Field number for the "msg" field. + public const int MsgFieldNumber = 3; + private readonly static string MsgDefaultValue = ""; + + private string msg_; + /// + ///* human-readable error message + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Msg + { + get { return msg_ ?? MsgDefaultValue; } + set + { + msg_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "msg" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasMsg + { + get { return msg_ != null; } + } + /// Clears the value of the "msg" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearMsg() + { + msg_ = null; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Error); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Error other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (Severity != other.Severity) return false; + if (Code != other.Code) return false; + if (SqlState != other.SqlState) return false; + if (Msg != other.Msg) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasSeverity) hash ^= Severity.GetHashCode(); + if (HasCode) hash ^= Code.GetHashCode(); + if (HasSqlState) hash ^= SqlState.GetHashCode(); + if (HasMsg) hash ^= Msg.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasSeverity) { + output.WriteRawTag(8); + output.WriteEnum((int) Severity); + } + if (HasCode) { + output.WriteRawTag(16); + output.WriteUInt32(Code); + } + if (HasMsg) { + output.WriteRawTag(26); + output.WriteString(Msg); + } + if (HasSqlState) { + output.WriteRawTag(34); + output.WriteString(SqlState); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasSeverity) + { + output.WriteRawTag(8); + output.WriteEnum((int)Severity); + } + if (HasCode) + { + output.WriteRawTag(16); + output.WriteUInt32(Code); + } + if (HasMsg) + { + output.WriteRawTag(26); + output.WriteString(Msg); + } + if (HasSqlState) + { + output.WriteRawTag(34); + output.WriteString(SqlState); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasSeverity) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Severity); + } + if (HasCode) + { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Code); + } + if (HasSqlState) + { + size += 1 + pb::CodedOutputStream.ComputeStringSize(SqlState); + } + if (HasMsg) + { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Msg); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Error other) + { + if (other == null) + { + return; + } + if (other.HasSeverity) + { + Severity = other.Severity; + } + if (other.HasCode) + { + Code = other.Code; + } + if (other.HasSqlState) + { + SqlState = other.SqlState; + } + if (other.HasMsg) + { + Msg = other.Msg; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + Severity = (global::Mysqlx.Error.Types.Severity) input.ReadEnum(); + break; + } + case 16: { + Code = input.ReadUInt32(); + break; + } + case 26: { + Msg = input.ReadString(); + break; + } + case 34: { + SqlState = input.ReadString(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: + { + Severity = (global::Mysqlx.Error.Types.Severity)input.ReadEnum(); + break; + } + case 16: + { + Code = input.ReadUInt32(); + break; + } + case 26: + { + Msg = input.ReadString(); + break; + } + case 34: + { + SqlState = input.ReadString(); + break; + } + } + } + } +#endif + + #region Nested types + /// Container for nested types declared in the Error message type. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static partial class Types + { + public enum Severity + { + [pbr::OriginalName("ERROR")] Error = 0, + [pbr::OriginalName("FATAL")] Fatal = 1, + } + + } + #endregion + + } + + #endregion + +} + +#endregion Designer generated code diff --git a/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxConnection.cs b/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxConnection.cs new file mode 100644 index 000000000..b5f4aec39 --- /dev/null +++ b/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxConnection.cs @@ -0,0 +1,1675 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +// +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: mysqlx_connection.proto +// +#pragma warning disable 1591, 0612, 3021, 8981 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace Mysqlx.Connection +{ + + /// Holder for reflection information generated from mysqlx_connection.proto + public static partial class MysqlxConnectionReflection + { + + #region Descriptor + /// File descriptor for mysqlx_connection.proto + public static pbr::FileDescriptor Descriptor + { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static MysqlxConnectionReflection() + { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "ChdteXNxbHhfY29ubmVjdGlvbi5wcm90bxIRTXlzcWx4LkNvbm5lY3Rpb24a", + "Fm15c3FseF9kYXRhdHlwZXMucHJvdG8aDG15c3FseC5wcm90byJACgpDYXBh", + "YmlsaXR5EgwKBG5hbWUYASACKAkSJAoFdmFsdWUYAiACKAsyFS5NeXNxbHgu", + "RGF0YXR5cGVzLkFueSJJCgxDYXBhYmlsaXRpZXMSMwoMY2FwYWJpbGl0aWVz", + "GAEgAygLMh0uTXlzcWx4LkNvbm5lY3Rpb24uQ2FwYWJpbGl0eToEkOowAiIX", + "Cg9DYXBhYmlsaXRpZXNHZXQ6BIjqMAEiTgoPQ2FwYWJpbGl0aWVzU2V0EjUK", + "DGNhcGFiaWxpdGllcxgBIAIoCzIfLk15c3FseC5Db25uZWN0aW9uLkNhcGFi", + "aWxpdGllczoEiOowAiINCgVDbG9zZToEiOowAyKvAQoLQ29tcHJlc3Npb24S", + "GQoRdW5jb21wcmVzc2VkX3NpemUYASABKAQSNAoPc2VydmVyX21lc3NhZ2Vz", + "GAIgASgOMhsuTXlzcWx4LlNlcnZlck1lc3NhZ2VzLlR5cGUSNAoPY2xpZW50", + "X21lc3NhZ2VzGAMgASgOMhsuTXlzcWx4LkNsaWVudE1lc3NhZ2VzLlR5cGUS", + "DwoHcGF5bG9hZBgEIAIoDDoIiOowLpDqMBNCGQoXY29tLm15c3FsLmNqLngu", + "cHJvdG9idWY=")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { global::Mysqlx.Datatypes.MysqlxDatatypesReflection.Descriptor, global::Mysqlx.MysqlxReflection.Descriptor, }, + new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Connection.Capability), global::Mysqlx.Connection.Capability.Parser, new[]{ "Name", "Value" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Connection.Capabilities), global::Mysqlx.Connection.Capabilities.Parser, new[]{ "Capabilities_" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Connection.CapabilitiesGet), global::Mysqlx.Connection.CapabilitiesGet.Parser, null, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Connection.CapabilitiesSet), global::Mysqlx.Connection.CapabilitiesSet.Parser, new[]{ "Capabilities" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Connection.Close), global::Mysqlx.Connection.Close.Parser, null, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Connection.Compression), global::Mysqlx.Connection.Compression.Parser, new[]{ "UncompressedSize", "ServerMessages", "ClientMessages", "Payload" }, null, null, null, null) + })); + } + #endregion + + } + #region Messages + /// + ///* + ///Capability + /// + ///A tuple of a ``name`` and a @ref Mysqlx::Datatypes::Any + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Capability : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Capability()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Connection.MysqlxConnectionReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Capability() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Capability(Capability other) : this() + { + name_ = other.name_; + value_ = other.value_ != null ? other.value_.Clone() : null; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Capability Clone() + { + return new Capability(this); + } + + /// Field number for the "name" field. + public const int NameFieldNumber = 1; + private readonly static string NameDefaultValue = ""; + + private string name_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Name + { + get { return name_ ?? NameDefaultValue; } + set + { + name_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "name" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasName + { + get { return name_ != null; } + } + /// Clears the value of the "name" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearName() + { + name_ = null; + } + + /// Field number for the "value" field. + public const int ValueFieldNumber = 2; + private global::Mysqlx.Datatypes.Any value_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Datatypes.Any Value + { + get { return value_; } + set + { + value_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Capability); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Capability other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (Name != other.Name) return false; + if (!object.Equals(Value, other.Value)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasName) hash ^= Name.GetHashCode(); + if (value_ != null) hash ^= Value.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasName) { + output.WriteRawTag(10); + output.WriteString(Name); + } + if (value_ != null) { + output.WriteRawTag(18); + output.WriteMessage(Value); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasName) + { + output.WriteRawTag(10); + output.WriteString(Name); + } + if (value_ != null) + { + output.WriteRawTag(18); + output.WriteMessage(Value); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasName) + { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Name); + } + if (value_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Value); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Capability other) + { + if (other == null) + { + return; + } + if (other.HasName) + { + Name = other.Name; + } + if (other.value_ != null) + { + if (value_ == null) + { + Value = new global::Mysqlx.Datatypes.Any(); + } + Value.MergeFrom(other.Value); + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + Name = input.ReadString(); + break; + } + case 18: { + if (value_ == null) { + Value = new global::Mysqlx.Datatypes.Any(); + } + input.ReadMessage(Value); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + Name = input.ReadString(); + break; + } + case 18: + { + if (value_ == null) + { + Value = new global::Mysqlx.Datatypes.Any(); + } + input.ReadMessage(Value); + break; + } + } + } + } +#endif + + } + + /// + ///* + ///Capabilities + /// + ///list of Capability + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Capabilities : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Capabilities()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Connection.MysqlxConnectionReflection.Descriptor.MessageTypes[1]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Capabilities() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Capabilities(Capabilities other) : this() + { + capabilities_ = other.capabilities_.Clone(); + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Capabilities Clone() + { + return new Capabilities(this); + } + + /// Field number for the "capabilities" field. + public const int Capabilities_FieldNumber = 1; + private static readonly pb::FieldCodec _repeated_capabilities_codec + = pb::FieldCodec.ForMessage(10, global::Mysqlx.Connection.Capability.Parser); + private readonly pbc::RepeatedField capabilities_ = new pbc::RepeatedField(); + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Capabilities_ + { + get { return capabilities_; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Capabilities); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Capabilities other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (!capabilities_.Equals(other.capabilities_)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + hash ^= capabilities_.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + capabilities_.WriteTo(output, _repeated_capabilities_codec); + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + capabilities_.WriteTo(ref output, _repeated_capabilities_codec); + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + size += capabilities_.CalculateSize(_repeated_capabilities_codec); + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Capabilities other) + { + if (other == null) + { + return; + } + capabilities_.Add(other.capabilities_); + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + capabilities_.AddEntriesFrom(input, _repeated_capabilities_codec); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + capabilities_.AddEntriesFrom(ref input, _repeated_capabilities_codec); + break; + } + } + } + } +#endif + + } + + /// + ///* + ///Get supported connection capabilities and their current state. + /// + ///@returns @ref Mysqlx::Connection::Capabilities or @ref Mysqlx::Error + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class CapabilitiesGet : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new CapabilitiesGet()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Connection.MysqlxConnectionReflection.Descriptor.MessageTypes[2]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public CapabilitiesGet() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public CapabilitiesGet(CapabilitiesGet other) : this() + { + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public CapabilitiesGet Clone() + { + return new CapabilitiesGet(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as CapabilitiesGet); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(CapabilitiesGet other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(CapabilitiesGet other) + { + if (other == null) + { + return; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + } + } + } +#endif + + } + + /// + ///* + ///Set connection capabilities atomically. + ///Only provided values are changed; other values are left + ///unchanged. If any of the changes fails, all changes are + ///discarded. + /// + ///@pre active sessions == 0 + /// + ///@returns @ref Mysqlx::Ok or @ref Mysqlx::Error + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class CapabilitiesSet : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new CapabilitiesSet()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Connection.MysqlxConnectionReflection.Descriptor.MessageTypes[3]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public CapabilitiesSet() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public CapabilitiesSet(CapabilitiesSet other) : this() + { + capabilities_ = other.capabilities_ != null ? other.capabilities_.Clone() : null; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public CapabilitiesSet Clone() + { + return new CapabilitiesSet(this); + } + + /// Field number for the "capabilities" field. + public const int CapabilitiesFieldNumber = 1; + private global::Mysqlx.Connection.Capabilities capabilities_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Connection.Capabilities Capabilities + { + get { return capabilities_; } + set + { + capabilities_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as CapabilitiesSet); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(CapabilitiesSet other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (!object.Equals(Capabilities, other.Capabilities)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (capabilities_ != null) hash ^= Capabilities.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (capabilities_ != null) { + output.WriteRawTag(10); + output.WriteMessage(Capabilities); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (capabilities_ != null) + { + output.WriteRawTag(10); + output.WriteMessage(Capabilities); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (capabilities_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Capabilities); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(CapabilitiesSet other) + { + if (other == null) + { + return; + } + if (other.capabilities_ != null) + { + if (capabilities_ == null) + { + Capabilities = new global::Mysqlx.Connection.Capabilities(); + } + Capabilities.MergeFrom(other.Capabilities); + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + if (capabilities_ == null) { + Capabilities = new global::Mysqlx.Connection.Capabilities(); + } + input.ReadMessage(Capabilities); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + if (capabilities_ == null) + { + Capabilities = new global::Mysqlx.Connection.Capabilities(); + } + input.ReadMessage(Capabilities); + break; + } + } + } + } +#endif + + } + + /// + ///* + ///Announce to the server that the client wants to close the connection. + /// + ///It discards any session state of the server. + /// + ///@returns @ref Mysqlx::Ok + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Close : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Close()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Connection.MysqlxConnectionReflection.Descriptor.MessageTypes[4]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Close() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Close(Close other) : this() + { + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Close Clone() + { + return new Close(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Close); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Close other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Close other) + { + if (other == null) + { + return; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + } + } + } +#endif + + } + + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Compression : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Compression()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Connection.MysqlxConnectionReflection.Descriptor.MessageTypes[5]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Compression() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Compression(Compression other) : this() + { + _hasBits0 = other._hasBits0; + uncompressedSize_ = other.uncompressedSize_; + serverMessages_ = other.serverMessages_; + clientMessages_ = other.clientMessages_; + payload_ = other.payload_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Compression Clone() + { + return new Compression(this); + } + + /// Field number for the "uncompressed_size" field. + public const int UncompressedSizeFieldNumber = 1; + private readonly static ulong UncompressedSizeDefaultValue = 0UL; + + private ulong uncompressedSize_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ulong UncompressedSize + { + get { if ((_hasBits0 & 1) != 0) { return uncompressedSize_; } else { return UncompressedSizeDefaultValue; } } + set + { + _hasBits0 |= 1; + uncompressedSize_ = value; + } + } + /// Gets whether the "uncompressed_size" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasUncompressedSize + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "uncompressed_size" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearUncompressedSize() + { + _hasBits0 &= ~1; + } + + /// Field number for the "server_messages" field. + public const int ServerMessagesFieldNumber = 2; + private readonly static global::Mysqlx.ServerMessages.Types.Type ServerMessagesDefaultValue = global::Mysqlx.ServerMessages.Types.Type.Ok; + + private global::Mysqlx.ServerMessages.Types.Type serverMessages_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.ServerMessages.Types.Type ServerMessages + { + get { if ((_hasBits0 & 2) != 0) { return serverMessages_; } else { return ServerMessagesDefaultValue; } } + set + { + _hasBits0 |= 2; + serverMessages_ = value; + } + } + /// Gets whether the "server_messages" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasServerMessages + { + get { return (_hasBits0 & 2) != 0; } + } + /// Clears the value of the "server_messages" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearServerMessages() + { + _hasBits0 &= ~2; + } + + /// Field number for the "client_messages" field. + public const int ClientMessagesFieldNumber = 3; + private readonly static global::Mysqlx.ClientMessages.Types.Type ClientMessagesDefaultValue = global::Mysqlx.ClientMessages.Types.Type.ConCapabilitiesGet; + + private global::Mysqlx.ClientMessages.Types.Type clientMessages_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.ClientMessages.Types.Type ClientMessages + { + get { if ((_hasBits0 & 4) != 0) { return clientMessages_; } else { return ClientMessagesDefaultValue; } } + set + { + _hasBits0 |= 4; + clientMessages_ = value; + } + } + /// Gets whether the "client_messages" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasClientMessages + { + get { return (_hasBits0 & 4) != 0; } + } + /// Clears the value of the "client_messages" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearClientMessages() + { + _hasBits0 &= ~4; + } + + /// Field number for the "payload" field. + public const int PayloadFieldNumber = 4; + private readonly static pb::ByteString PayloadDefaultValue = pb::ByteString.Empty; + + private pb::ByteString payload_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pb::ByteString Payload + { + get { return payload_ ?? PayloadDefaultValue; } + set + { + payload_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "payload" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasPayload + { + get { return payload_ != null; } + } + /// Clears the value of the "payload" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearPayload() + { + payload_ = null; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Compression); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Compression other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (UncompressedSize != other.UncompressedSize) return false; + if (ServerMessages != other.ServerMessages) return false; + if (ClientMessages != other.ClientMessages) return false; + if (Payload != other.Payload) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasUncompressedSize) hash ^= UncompressedSize.GetHashCode(); + if (HasServerMessages) hash ^= ServerMessages.GetHashCode(); + if (HasClientMessages) hash ^= ClientMessages.GetHashCode(); + if (HasPayload) hash ^= Payload.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasUncompressedSize) { + output.WriteRawTag(8); + output.WriteUInt64(UncompressedSize); + } + if (HasServerMessages) { + output.WriteRawTag(16); + output.WriteEnum((int) ServerMessages); + } + if (HasClientMessages) { + output.WriteRawTag(24); + output.WriteEnum((int) ClientMessages); + } + if (HasPayload) { + output.WriteRawTag(34); + output.WriteBytes(Payload); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasUncompressedSize) + { + output.WriteRawTag(8); + output.WriteUInt64(UncompressedSize); + } + if (HasServerMessages) + { + output.WriteRawTag(16); + output.WriteEnum((int)ServerMessages); + } + if (HasClientMessages) + { + output.WriteRawTag(24); + output.WriteEnum((int)ClientMessages); + } + if (HasPayload) + { + output.WriteRawTag(34); + output.WriteBytes(Payload); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasUncompressedSize) + { + size += 1 + pb::CodedOutputStream.ComputeUInt64Size(UncompressedSize); + } + if (HasServerMessages) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)ServerMessages); + } + if (HasClientMessages) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)ClientMessages); + } + if (HasPayload) + { + size += 1 + pb::CodedOutputStream.ComputeBytesSize(Payload); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Compression other) + { + if (other == null) + { + return; + } + if (other.HasUncompressedSize) + { + UncompressedSize = other.UncompressedSize; + } + if (other.HasServerMessages) + { + ServerMessages = other.ServerMessages; + } + if (other.HasClientMessages) + { + ClientMessages = other.ClientMessages; + } + if (other.HasPayload) + { + Payload = other.Payload; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + UncompressedSize = input.ReadUInt64(); + break; + } + case 16: { + ServerMessages = (global::Mysqlx.ServerMessages.Types.Type) input.ReadEnum(); + break; + } + case 24: { + ClientMessages = (global::Mysqlx.ClientMessages.Types.Type) input.ReadEnum(); + break; + } + case 34: { + Payload = input.ReadBytes(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: + { + UncompressedSize = input.ReadUInt64(); + break; + } + case 16: + { + ServerMessages = (global::Mysqlx.ServerMessages.Types.Type)input.ReadEnum(); + break; + } + case 24: + { + ClientMessages = (global::Mysqlx.ClientMessages.Types.Type)input.ReadEnum(); + break; + } + case 34: + { + Payload = input.ReadBytes(); + break; + } + } + } + } +#endif + + } + + #endregion + +} + +#endregion Designer generated code + diff --git a/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxCrud.cs b/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxCrud.cs new file mode 100644 index 000000000..75e212cd8 --- /dev/null +++ b/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxCrud.cs @@ -0,0 +1,6736 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +// +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: mysqlx_crud.proto +// +#pragma warning disable 1591, 0612, 3021, 8981 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace Mysqlx.Crud +{ + + /// Holder for reflection information generated from mysqlx_crud.proto + public static partial class MysqlxCrudReflection + { + + #region Descriptor + /// File descriptor for mysqlx_crud.proto + public static pbr::FileDescriptor Descriptor + { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static MysqlxCrudReflection() + { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "ChFteXNxbHhfY3J1ZC5wcm90bxILTXlzcWx4LkNydWQaDG15c3FseC5wcm90", + "bxoRbXlzcWx4X2V4cHIucHJvdG8aFm15c3FseF9kYXRhdHlwZXMucHJvdG8i", + "WwoGQ29sdW1uEgwKBG5hbWUYASABKAkSDQoFYWxpYXMYAiABKAkSNAoNZG9j", + "dW1lbnRfcGF0aBgDIAMoCzIdLk15c3FseC5FeHByLkRvY3VtZW50UGF0aEl0", + "ZW0iPgoKUHJvamVjdGlvbhIhCgZzb3VyY2UYASACKAsyES5NeXNxbHguRXhw", + "ci5FeHByEg0KBWFsaWFzGAIgASgJIioKCkNvbGxlY3Rpb24SDAoEbmFtZRgB", + "IAIoCRIOCgZzY2hlbWEYAiABKAkiKgoFTGltaXQSEQoJcm93X2NvdW50GAEg", + "AigEEg4KBm9mZnNldBgCIAEoBCJUCglMaW1pdEV4cHISJAoJcm93X2NvdW50", + "GAEgAigLMhEuTXlzcWx4LkV4cHIuRXhwchIhCgZvZmZzZXQYAiABKAsyES5N", + "eXNxbHguRXhwci5FeHByIn4KBU9yZGVyEh8KBGV4cHIYASACKAsyES5NeXNx", + "bHguRXhwci5FeHByEjQKCWRpcmVjdGlvbhgCIAEoDjIcLk15c3FseC5DcnVk", + "Lk9yZGVyLkRpcmVjdGlvbjoDQVNDIh4KCURpcmVjdGlvbhIHCgNBU0MQARII", + "CgRERVNDEAIirAIKD1VwZGF0ZU9wZXJhdGlvbhItCgZzb3VyY2UYASACKAsy", + "HS5NeXNxbHguRXhwci5Db2x1bW5JZGVudGlmaWVyEjoKCW9wZXJhdGlvbhgC", + "IAIoDjInLk15c3FseC5DcnVkLlVwZGF0ZU9wZXJhdGlvbi5VcGRhdGVUeXBl", + "EiAKBXZhbHVlGAMgASgLMhEuTXlzcWx4LkV4cHIuRXhwciKLAQoKVXBkYXRl", + "VHlwZRIHCgNTRVQQARIPCgtJVEVNX1JFTU9WRRACEgwKCElURU1fU0VUEAMS", + "EAoMSVRFTV9SRVBMQUNFEAQSDgoKSVRFTV9NRVJHRRAFEhAKDEFSUkFZX0lO", + "U0VSVBAGEhAKDEFSUkFZX0FQUEVORBAHEg8KC01FUkdFX1BBVENIEAgi6gQK", + "BEZpbmQSKwoKY29sbGVjdGlvbhgCIAIoCzIXLk15c3FseC5DcnVkLkNvbGxl", + "Y3Rpb24SKgoKZGF0YV9tb2RlbBgDIAEoDjIWLk15c3FseC5DcnVkLkRhdGFN", + "b2RlbBIrCgpwcm9qZWN0aW9uGAQgAygLMhcuTXlzcWx4LkNydWQuUHJvamVj", + "dGlvbhImCgRhcmdzGAsgAygLMhguTXlzcWx4LkRhdGF0eXBlcy5TY2FsYXIS", + "IwoIY3JpdGVyaWEYBSABKAsyES5NeXNxbHguRXhwci5FeHByEiEKBWxpbWl0", + "GAYgASgLMhIuTXlzcWx4LkNydWQuTGltaXQSIQoFb3JkZXIYByADKAsyEi5N", + "eXNxbHguQ3J1ZC5PcmRlchIjCghncm91cGluZxgIIAMoCzIRLk15c3FseC5F", + "eHByLkV4cHISLAoRZ3JvdXBpbmdfY3JpdGVyaWEYCSABKAsyES5NeXNxbHgu", + "RXhwci5FeHByEioKB2xvY2tpbmcYDCABKA4yGS5NeXNxbHguQ3J1ZC5GaW5k", + "LlJvd0xvY2sSOQoPbG9ja2luZ19vcHRpb25zGA0gASgOMiAuTXlzcWx4LkNy", + "dWQuRmluZC5Sb3dMb2NrT3B0aW9ucxIqCgpsaW1pdF9leHByGA4gASgLMhYu", + "TXlzcWx4LkNydWQuTGltaXRFeHByIi4KB1Jvd0xvY2sSDwoLU0hBUkVEX0xP", + "Q0sQARISCg5FWENMVVNJVkVfTE9DSxACIi0KDlJvd0xvY2tPcHRpb25zEgoK", + "Bk5PV0FJVBABEg8KC1NLSVBfTE9DS0VEEAI6BIjqMBEiqAIKBkluc2VydBIr", + "Cgpjb2xsZWN0aW9uGAEgAigLMhcuTXlzcWx4LkNydWQuQ29sbGVjdGlvbhIq", + "CgpkYXRhX21vZGVsGAIgASgOMhYuTXlzcWx4LkNydWQuRGF0YU1vZGVsEicK", + "CnByb2plY3Rpb24YAyADKAsyEy5NeXNxbHguQ3J1ZC5Db2x1bW4SKQoDcm93", + "GAQgAygLMhwuTXlzcWx4LkNydWQuSW5zZXJ0LlR5cGVkUm93EiYKBGFyZ3MY", + "BSADKAsyGC5NeXNxbHguRGF0YXR5cGVzLlNjYWxhchIVCgZ1cHNlcnQYBiAB", + "KAg6BWZhbHNlGiwKCFR5cGVkUm93EiAKBWZpZWxkGAEgAygLMhEuTXlzcWx4", + "LkV4cHIuRXhwcjoEiOowEiLXAgoGVXBkYXRlEisKCmNvbGxlY3Rpb24YAiAC", + "KAsyFy5NeXNxbHguQ3J1ZC5Db2xsZWN0aW9uEioKCmRhdGFfbW9kZWwYAyAB", + "KA4yFi5NeXNxbHguQ3J1ZC5EYXRhTW9kZWwSIwoIY3JpdGVyaWEYBCABKAsy", + "ES5NeXNxbHguRXhwci5FeHByEiEKBWxpbWl0GAUgASgLMhIuTXlzcWx4LkNy", + "dWQuTGltaXQSIQoFb3JkZXIYBiADKAsyEi5NeXNxbHguQ3J1ZC5PcmRlchIv", + "CglvcGVyYXRpb24YByADKAsyHC5NeXNxbHguQ3J1ZC5VcGRhdGVPcGVyYXRp", + "b24SJgoEYXJncxgIIAMoCzIYLk15c3FseC5EYXRhdHlwZXMuU2NhbGFyEioK", + "CmxpbWl0X2V4cHIYCSABKAsyFi5NeXNxbHguQ3J1ZC5MaW1pdEV4cHI6BIjq", + "MBMipgIKBkRlbGV0ZRIrCgpjb2xsZWN0aW9uGAEgAigLMhcuTXlzcWx4LkNy", + "dWQuQ29sbGVjdGlvbhIqCgpkYXRhX21vZGVsGAIgASgOMhYuTXlzcWx4LkNy", + "dWQuRGF0YU1vZGVsEiMKCGNyaXRlcmlhGAMgASgLMhEuTXlzcWx4LkV4cHIu", + "RXhwchIhCgVsaW1pdBgEIAEoCzISLk15c3FseC5DcnVkLkxpbWl0EiEKBW9y", + "ZGVyGAUgAygLMhIuTXlzcWx4LkNydWQuT3JkZXISJgoEYXJncxgGIAMoCzIY", + "Lk15c3FseC5EYXRhdHlwZXMuU2NhbGFyEioKCmxpbWl0X2V4cHIYByABKAsy", + "Fi5NeXNxbHguQ3J1ZC5MaW1pdEV4cHI6BIjqMBQiwgIKCkNyZWF0ZVZpZXcS", + "KwoKY29sbGVjdGlvbhgBIAIoCzIXLk15c3FseC5DcnVkLkNvbGxlY3Rpb24S", + "DwoHZGVmaW5lchgCIAEoCRI4CglhbGdvcml0aG0YAyABKA4yGi5NeXNxbHgu", + "Q3J1ZC5WaWV3QWxnb3JpdGhtOglVTkRFRklORUQSNwoIc2VjdXJpdHkYBCAB", + "KA4yHC5NeXNxbHguQ3J1ZC5WaWV3U3FsU2VjdXJpdHk6B0RFRklORVISKwoF", + "Y2hlY2sYBSABKA4yHC5NeXNxbHguQ3J1ZC5WaWV3Q2hlY2tPcHRpb24SDgoG", + "Y29sdW1uGAYgAygJEh8KBHN0bXQYByACKAsyES5NeXNxbHguQ3J1ZC5GaW5k", + "Eh8KEHJlcGxhY2VfZXhpc3RpbmcYCCABKAg6BWZhbHNlOgSI6jAeIo0CCgpN", + "b2RpZnlWaWV3EisKCmNvbGxlY3Rpb24YASACKAsyFy5NeXNxbHguQ3J1ZC5D", + "b2xsZWN0aW9uEg8KB2RlZmluZXIYAiABKAkSLQoJYWxnb3JpdGhtGAMgASgO", + "MhouTXlzcWx4LkNydWQuVmlld0FsZ29yaXRobRIuCghzZWN1cml0eRgEIAEo", + "DjIcLk15c3FseC5DcnVkLlZpZXdTcWxTZWN1cml0eRIrCgVjaGVjaxgFIAEo", + "DjIcLk15c3FseC5DcnVkLlZpZXdDaGVja09wdGlvbhIOCgZjb2x1bW4YBiAD", + "KAkSHwoEc3RtdBgHIAEoCzIRLk15c3FseC5DcnVkLkZpbmQ6BIjqMB8iVwoI", + "RHJvcFZpZXcSKwoKY29sbGVjdGlvbhgBIAIoCzIXLk15c3FseC5DcnVkLkNv", + "bGxlY3Rpb24SGAoJaWZfZXhpc3RzGAIgASgIOgVmYWxzZToEiOowICokCglE", + "YXRhTW9kZWwSDAoIRE9DVU1FTlQQARIJCgVUQUJMRRACKjgKDVZpZXdBbGdv", + "cml0aG0SDQoJVU5ERUZJTkVEEAESCQoFTUVSR0UQAhINCglURU1QVEFCTEUQ", + "AyorCg9WaWV3U3FsU2VjdXJpdHkSCwoHSU5WT0tFUhABEgsKB0RFRklORVIQ", + "AioqCg9WaWV3Q2hlY2tPcHRpb24SCQoFTE9DQUwQARIMCghDQVNDQURFRBAC", + "QhkKF2NvbS5teXNxbC5jai54LnByb3RvYnVm")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { global::Mysqlx.MysqlxReflection.Descriptor, global::Mysqlx.Expr.MysqlxExprReflection.Descriptor, global::Mysqlx.Datatypes.MysqlxDatatypesReflection.Descriptor, }, + new pbr::GeneratedClrTypeInfo(new[] { typeof(global::Mysqlx.Crud.DataModel), typeof(global::Mysqlx.Crud.ViewAlgorithm), typeof(global::Mysqlx.Crud.ViewSqlSecurity), typeof(global::Mysqlx.Crud.ViewCheckOption), }, null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.Column), global::Mysqlx.Crud.Column.Parser, new[]{ "Name", "Alias", "DocumentPath" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.Projection), global::Mysqlx.Crud.Projection.Parser, new[]{ "Source", "Alias" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.Collection), global::Mysqlx.Crud.Collection.Parser, new[]{ "Name", "Schema" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.Limit), global::Mysqlx.Crud.Limit.Parser, new[]{ "RowCount", "Offset" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.LimitExpr), global::Mysqlx.Crud.LimitExpr.Parser, new[]{ "RowCount", "Offset" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.Order), global::Mysqlx.Crud.Order.Parser, new[]{ "Expr", "Direction" }, null, new[]{ typeof(global::Mysqlx.Crud.Order.Types.Direction) }, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.UpdateOperation), global::Mysqlx.Crud.UpdateOperation.Parser, new[]{ "Source", "Operation", "Value" }, null, new[]{ typeof(global::Mysqlx.Crud.UpdateOperation.Types.UpdateType) }, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.Find), global::Mysqlx.Crud.Find.Parser, new[]{ "Collection", "DataModel", "Projection", "Args", "Criteria", "Limit", "Order", "Grouping", "GroupingCriteria", "Locking", "LockingOptions", "LimitExpr" }, null, new[]{ typeof(global::Mysqlx.Crud.Find.Types.RowLock), typeof(global::Mysqlx.Crud.Find.Types.RowLockOptions) }, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.Insert), global::Mysqlx.Crud.Insert.Parser, new[]{ "Collection", "DataModel", "Projection", "Row", "Args", "Upsert" }, null, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.Insert.Types.TypedRow), global::Mysqlx.Crud.Insert.Types.TypedRow.Parser, new[]{ "Field" }, null, null, null, null)}), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.Update), global::Mysqlx.Crud.Update.Parser, new[]{ "Collection", "DataModel", "Criteria", "Limit", "Order", "Operation", "Args", "LimitExpr" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.Delete), global::Mysqlx.Crud.Delete.Parser, new[]{ "Collection", "DataModel", "Criteria", "Limit", "Order", "Args", "LimitExpr" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.CreateView), global::Mysqlx.Crud.CreateView.Parser, new[]{ "Collection", "Definer", "Algorithm", "Security", "Check", "Column", "Stmt", "ReplaceExisting" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.ModifyView), global::Mysqlx.Crud.ModifyView.Parser, new[]{ "Collection", "Definer", "Algorithm", "Security", "Check", "Column", "Stmt" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.DropView), global::Mysqlx.Crud.DropView.Parser, new[]{ "Collection", "IfExists" }, null, null, null, null) + })); + } + #endregion + + } + #region Enums + /// + ///* + ///DataModel to use for filters, names, ... + /// + public enum DataModel + { + [pbr::OriginalName("DOCUMENT")] Document = 1, + [pbr::OriginalName("TABLE")] Table = 2, + } + + /// + ///* + ///ViewAlgorithm defines how MySQL Server processes the view + /// + public enum ViewAlgorithm + { + /// + ///* MySQL chooses which algorithm to use + /// + [pbr::OriginalName("UNDEFINED")] Undefined = 1, + /// + ///* the text of a statement that refers to the view and the view + ///definition are merged + /// + [pbr::OriginalName("MERGE")] Merge = 2, + /// + ///* the view are retrieved into a temporary table + /// + [pbr::OriginalName("TEMPTABLE")] Temptable = 3, + } + + /// + ///* + ///ViewSqlSecurity defines the security context in which the view is going to be + ///executed; this means that VIEW can be executed with current user permissions or + ///with permissions of the user who defined the VIEW + /// + public enum ViewSqlSecurity + { + /// + ///* use current user permissions + /// + [pbr::OriginalName("INVOKER")] Invoker = 1, + /// + ///* use permissions of the user who defined the VIEW + /// + [pbr::OriginalName("DEFINER")] Definer = 2, + } + + /// + ///* + ///ViewCheckOption limits the write operations done on a `VIEW` + ///(`INSERT`, `UPDATE`, `DELETE`) to rows in which the `WHERE` clause is `TRUE` + /// + public enum ViewCheckOption + { + /// + ///* the view WHERE clause is checked, but no underlying views are checked + /// + [pbr::OriginalName("LOCAL")] Local = 1, + /// + ///* the view WHERE clause is checked, then checking recurses + ///to underlying views + /// + [pbr::OriginalName("CASCADED")] Cascaded = 2, + } + + #endregion + + #region Messages + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Column : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Column()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Column() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Column(Column other) : this() + { + name_ = other.name_; + alias_ = other.alias_; + documentPath_ = other.documentPath_.Clone(); + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Column Clone() + { + return new Column(this); + } + + /// Field number for the "name" field. + public const int NameFieldNumber = 1; + private readonly static string NameDefaultValue = ""; + + private string name_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Name + { + get { return name_ ?? NameDefaultValue; } + set + { + name_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "name" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasName + { + get { return name_ != null; } + } + /// Clears the value of the "name" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearName() + { + name_ = null; + } + + /// Field number for the "alias" field. + public const int AliasFieldNumber = 2; + private readonly static string AliasDefaultValue = ""; + + private string alias_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Alias + { + get { return alias_ ?? AliasDefaultValue; } + set + { + alias_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "alias" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasAlias + { + get { return alias_ != null; } + } + /// Clears the value of the "alias" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearAlias() + { + alias_ = null; + } + + /// Field number for the "document_path" field. + public const int DocumentPathFieldNumber = 3; + private static readonly pb::FieldCodec _repeated_documentPath_codec + = pb::FieldCodec.ForMessage(26, global::Mysqlx.Expr.DocumentPathItem.Parser); + private readonly pbc::RepeatedField documentPath_ = new pbc::RepeatedField(); + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField DocumentPath + { + get { return documentPath_; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Column); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Column other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (Name != other.Name) return false; + if (Alias != other.Alias) return false; + if (!documentPath_.Equals(other.documentPath_)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasName) hash ^= Name.GetHashCode(); + if (HasAlias) hash ^= Alias.GetHashCode(); + hash ^= documentPath_.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasName) { + output.WriteRawTag(10); + output.WriteString(Name); + } + if (HasAlias) { + output.WriteRawTag(18); + output.WriteString(Alias); + } + documentPath_.WriteTo(output, _repeated_documentPath_codec); + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasName) + { + output.WriteRawTag(10); + output.WriteString(Name); + } + if (HasAlias) + { + output.WriteRawTag(18); + output.WriteString(Alias); + } + documentPath_.WriteTo(ref output, _repeated_documentPath_codec); + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasName) + { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Name); + } + if (HasAlias) + { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Alias); + } + size += documentPath_.CalculateSize(_repeated_documentPath_codec); + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Column other) + { + if (other == null) + { + return; + } + if (other.HasName) + { + Name = other.Name; + } + if (other.HasAlias) + { + Alias = other.Alias; + } + documentPath_.Add(other.documentPath_); + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + Name = input.ReadString(); + break; + } + case 18: { + Alias = input.ReadString(); + break; + } + case 26: { + documentPath_.AddEntriesFrom(input, _repeated_documentPath_codec); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + Name = input.ReadString(); + break; + } + case 18: + { + Alias = input.ReadString(); + break; + } + case 26: + { + documentPath_.AddEntriesFrom(ref input, _repeated_documentPath_codec); + break; + } + } + } + } +#endif + + } + + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Projection : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Projection()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[1]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Projection() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Projection(Projection other) : this() + { + source_ = other.source_ != null ? other.source_.Clone() : null; + alias_ = other.alias_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Projection Clone() + { + return new Projection(this); + } + + /// Field number for the "source" field. + public const int SourceFieldNumber = 1; + private global::Mysqlx.Expr.Expr source_; + /// + ///* the expression identifying an element from the source data, + ///which can include a column identifier or any expression + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Expr.Expr Source + { + get { return source_; } + set + { + source_ = value; + } + } + + /// Field number for the "alias" field. + public const int AliasFieldNumber = 2; + private readonly static string AliasDefaultValue = ""; + + private string alias_; + /// + ///* optional alias. Required for DOCUMENTs (clients may use + ///the source string as default) + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Alias + { + get { return alias_ ?? AliasDefaultValue; } + set + { + alias_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "alias" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasAlias + { + get { return alias_ != null; } + } + /// Clears the value of the "alias" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearAlias() + { + alias_ = null; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Projection); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Projection other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (!object.Equals(Source, other.Source)) return false; + if (Alias != other.Alias) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (source_ != null) hash ^= Source.GetHashCode(); + if (HasAlias) hash ^= Alias.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (source_ != null) { + output.WriteRawTag(10); + output.WriteMessage(Source); + } + if (HasAlias) { + output.WriteRawTag(18); + output.WriteString(Alias); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (source_ != null) + { + output.WriteRawTag(10); + output.WriteMessage(Source); + } + if (HasAlias) + { + output.WriteRawTag(18); + output.WriteString(Alias); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (source_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Source); + } + if (HasAlias) + { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Alias); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Projection other) + { + if (other == null) + { + return; + } + if (other.source_ != null) + { + if (source_ == null) + { + Source = new global::Mysqlx.Expr.Expr(); + } + Source.MergeFrom(other.Source); + } + if (other.HasAlias) + { + Alias = other.Alias; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + if (source_ == null) { + Source = new global::Mysqlx.Expr.Expr(); + } + input.ReadMessage(Source); + break; + } + case 18: { + Alias = input.ReadString(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + if (source_ == null) + { + Source = new global::Mysqlx.Expr.Expr(); + } + input.ReadMessage(Source); + break; + } + case 18: + { + Alias = input.ReadString(); + break; + } + } + } + } +#endif + + } + + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Collection : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Collection()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[2]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Collection() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Collection(Collection other) : this() + { + name_ = other.name_; + schema_ = other.schema_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Collection Clone() + { + return new Collection(this); + } + + /// Field number for the "name" field. + public const int NameFieldNumber = 1; + private readonly static string NameDefaultValue = ""; + + private string name_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Name + { + get { return name_ ?? NameDefaultValue; } + set + { + name_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "name" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasName + { + get { return name_ != null; } + } + /// Clears the value of the "name" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearName() + { + name_ = null; + } + + /// Field number for the "schema" field. + public const int SchemaFieldNumber = 2; + private readonly static string SchemaDefaultValue = ""; + + private string schema_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Schema + { + get { return schema_ ?? SchemaDefaultValue; } + set + { + schema_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "schema" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasSchema + { + get { return schema_ != null; } + } + /// Clears the value of the "schema" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearSchema() + { + schema_ = null; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Collection); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Collection other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (Name != other.Name) return false; + if (Schema != other.Schema) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasName) hash ^= Name.GetHashCode(); + if (HasSchema) hash ^= Schema.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasName) { + output.WriteRawTag(10); + output.WriteString(Name); + } + if (HasSchema) { + output.WriteRawTag(18); + output.WriteString(Schema); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasName) + { + output.WriteRawTag(10); + output.WriteString(Name); + } + if (HasSchema) + { + output.WriteRawTag(18); + output.WriteString(Schema); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasName) + { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Name); + } + if (HasSchema) + { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Schema); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Collection other) + { + if (other == null) + { + return; + } + if (other.HasName) + { + Name = other.Name; + } + if (other.HasSchema) + { + Schema = other.Schema; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + Name = input.ReadString(); + break; + } + case 18: { + Schema = input.ReadString(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + Name = input.ReadString(); + break; + } + case 18: + { + Schema = input.ReadString(); + break; + } + } + } + } +#endif + + } + + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Limit : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Limit()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[3]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Limit() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Limit(Limit other) : this() + { + _hasBits0 = other._hasBits0; + rowCount_ = other.rowCount_; + offset_ = other.offset_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Limit Clone() + { + return new Limit(this); + } + + /// Field number for the "row_count" field. + public const int RowCountFieldNumber = 1; + private readonly static ulong RowCountDefaultValue = 0UL; + + private ulong rowCount_; + /// + ///* maximum rows to filter + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ulong RowCount + { + get { if ((_hasBits0 & 1) != 0) { return rowCount_; } else { return RowCountDefaultValue; } } + set + { + _hasBits0 |= 1; + rowCount_ = value; + } + } + /// Gets whether the "row_count" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasRowCount + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "row_count" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearRowCount() + { + _hasBits0 &= ~1; + } + + /// Field number for the "offset" field. + public const int OffsetFieldNumber = 2; + private readonly static ulong OffsetDefaultValue = 0UL; + + private ulong offset_; + /// + ///* maximum rows to skip before applying the row_count + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ulong Offset + { + get { if ((_hasBits0 & 2) != 0) { return offset_; } else { return OffsetDefaultValue; } } + set + { + _hasBits0 |= 2; + offset_ = value; + } + } + /// Gets whether the "offset" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasOffset + { + get { return (_hasBits0 & 2) != 0; } + } + /// Clears the value of the "offset" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearOffset() + { + _hasBits0 &= ~2; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Limit); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Limit other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (RowCount != other.RowCount) return false; + if (Offset != other.Offset) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasRowCount) hash ^= RowCount.GetHashCode(); + if (HasOffset) hash ^= Offset.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasRowCount) { + output.WriteRawTag(8); + output.WriteUInt64(RowCount); + } + if (HasOffset) { + output.WriteRawTag(16); + output.WriteUInt64(Offset); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasRowCount) + { + output.WriteRawTag(8); + output.WriteUInt64(RowCount); + } + if (HasOffset) + { + output.WriteRawTag(16); + output.WriteUInt64(Offset); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasRowCount) + { + size += 1 + pb::CodedOutputStream.ComputeUInt64Size(RowCount); + } + if (HasOffset) + { + size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Offset); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Limit other) + { + if (other == null) + { + return; + } + if (other.HasRowCount) + { + RowCount = other.RowCount; + } + if (other.HasOffset) + { + Offset = other.Offset; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + RowCount = input.ReadUInt64(); + break; + } + case 16: { + Offset = input.ReadUInt64(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: + { + RowCount = input.ReadUInt64(); + break; + } + case 16: + { + Offset = input.ReadUInt64(); + break; + } + } + } + } +#endif + + } + + /// + ///* + ///LimitExpr, in comparison to Limit, is able to specify that row_count and + ///offset are placeholders. + ///This message support expressions of following types Expr/literal/UINT, + ///Expr/PLACEHOLDER. + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class LimitExpr : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new LimitExpr()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[4]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public LimitExpr() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public LimitExpr(LimitExpr other) : this() + { + rowCount_ = other.rowCount_ != null ? other.rowCount_.Clone() : null; + offset_ = other.offset_ != null ? other.offset_.Clone() : null; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public LimitExpr Clone() + { + return new LimitExpr(this); + } + + /// Field number for the "row_count" field. + public const int RowCountFieldNumber = 1; + private global::Mysqlx.Expr.Expr rowCount_; + /// + ///* maximum rows to filter + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Expr.Expr RowCount + { + get { return rowCount_; } + set + { + rowCount_ = value; + } + } + + /// Field number for the "offset" field. + public const int OffsetFieldNumber = 2; + private global::Mysqlx.Expr.Expr offset_; + /// + ///* maximum rows to skip before applying the row_count + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Expr.Expr Offset + { + get { return offset_; } + set + { + offset_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as LimitExpr); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(LimitExpr other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (!object.Equals(RowCount, other.RowCount)) return false; + if (!object.Equals(Offset, other.Offset)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (rowCount_ != null) hash ^= RowCount.GetHashCode(); + if (offset_ != null) hash ^= Offset.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (rowCount_ != null) { + output.WriteRawTag(10); + output.WriteMessage(RowCount); + } + if (offset_ != null) { + output.WriteRawTag(18); + output.WriteMessage(Offset); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (rowCount_ != null) + { + output.WriteRawTag(10); + output.WriteMessage(RowCount); + } + if (offset_ != null) + { + output.WriteRawTag(18); + output.WriteMessage(Offset); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (rowCount_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(RowCount); + } + if (offset_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Offset); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(LimitExpr other) + { + if (other == null) + { + return; + } + if (other.rowCount_ != null) + { + if (rowCount_ == null) + { + RowCount = new global::Mysqlx.Expr.Expr(); + } + RowCount.MergeFrom(other.RowCount); + } + if (other.offset_ != null) + { + if (offset_ == null) + { + Offset = new global::Mysqlx.Expr.Expr(); + } + Offset.MergeFrom(other.Offset); + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + if (rowCount_ == null) { + RowCount = new global::Mysqlx.Expr.Expr(); + } + input.ReadMessage(RowCount); + break; + } + case 18: { + if (offset_ == null) { + Offset = new global::Mysqlx.Expr.Expr(); + } + input.ReadMessage(Offset); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + if (rowCount_ == null) + { + RowCount = new global::Mysqlx.Expr.Expr(); + } + input.ReadMessage(RowCount); + break; + } + case 18: + { + if (offset_ == null) + { + Offset = new global::Mysqlx.Expr.Expr(); + } + input.ReadMessage(Offset); + break; + } + } + } + } +#endif + + } + + /// + ///* + ///Sort order + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Order : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Order()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[5]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Order() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Order(Order other) : this() + { + _hasBits0 = other._hasBits0; + expr_ = other.expr_ != null ? other.expr_.Clone() : null; + direction_ = other.direction_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Order Clone() + { + return new Order(this); + } + + /// Field number for the "expr" field. + public const int ExprFieldNumber = 1; + private global::Mysqlx.Expr.Expr expr_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Expr.Expr Expr + { + get { return expr_; } + set + { + expr_ = value; + } + } + + /// Field number for the "direction" field. + public const int DirectionFieldNumber = 2; + private readonly static global::Mysqlx.Crud.Order.Types.Direction DirectionDefaultValue = global::Mysqlx.Crud.Order.Types.Direction.Asc; + + private global::Mysqlx.Crud.Order.Types.Direction direction_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.Order.Types.Direction Direction + { + get { if ((_hasBits0 & 1) != 0) { return direction_; } else { return DirectionDefaultValue; } } + set + { + _hasBits0 |= 1; + direction_ = value; + } + } + /// Gets whether the "direction" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasDirection + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "direction" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearDirection() + { + _hasBits0 &= ~1; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Order); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Order other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (!object.Equals(Expr, other.Expr)) return false; + if (Direction != other.Direction) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (expr_ != null) hash ^= Expr.GetHashCode(); + if (HasDirection) hash ^= Direction.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (expr_ != null) { + output.WriteRawTag(10); + output.WriteMessage(Expr); + } + if (HasDirection) { + output.WriteRawTag(16); + output.WriteEnum((int) Direction); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (expr_ != null) + { + output.WriteRawTag(10); + output.WriteMessage(Expr); + } + if (HasDirection) + { + output.WriteRawTag(16); + output.WriteEnum((int)Direction); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (expr_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Expr); + } + if (HasDirection) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Direction); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Order other) + { + if (other == null) + { + return; + } + if (other.expr_ != null) + { + if (expr_ == null) + { + Expr = new global::Mysqlx.Expr.Expr(); + } + Expr.MergeFrom(other.Expr); + } + if (other.HasDirection) + { + Direction = other.Direction; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + if (expr_ == null) { + Expr = new global::Mysqlx.Expr.Expr(); + } + input.ReadMessage(Expr); + break; + } + case 16: { + Direction = (global::Mysqlx.Crud.Order.Types.Direction) input.ReadEnum(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + if (expr_ == null) + { + Expr = new global::Mysqlx.Expr.Expr(); + } + input.ReadMessage(Expr); + break; + } + case 16: + { + Direction = (global::Mysqlx.Crud.Order.Types.Direction)input.ReadEnum(); + break; + } + } + } + } +#endif + + #region Nested types + /// Container for nested types declared in the Order message type. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static partial class Types + { + public enum Direction + { + [pbr::OriginalName("ASC")] Asc = 1, + [pbr::OriginalName("DESC")] Desc = 2, + } + + } + #endregion + + } + + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class UpdateOperation : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new UpdateOperation()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[6]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public UpdateOperation() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public UpdateOperation(UpdateOperation other) : this() + { + _hasBits0 = other._hasBits0; + source_ = other.source_ != null ? other.source_.Clone() : null; + operation_ = other.operation_; + value_ = other.value_ != null ? other.value_.Clone() : null; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public UpdateOperation Clone() + { + return new UpdateOperation(this); + } + + /// Field number for the "source" field. + public const int SourceFieldNumber = 1; + private global::Mysqlx.Expr.ColumnIdentifier source_; + /// + ///* specification of the value to be updated + ///- if data_model is TABLE, a column name may be specified and also + ///a document path, if the column has type JSON + ///- if data_model is DOCUMENT, only document paths are allowed + /// + ///@note in both cases, schema and table must be not set + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Expr.ColumnIdentifier Source + { + get { return source_; } + set + { + source_ = value; + } + } + + /// Field number for the "operation" field. + public const int OperationFieldNumber = 2; + private readonly static global::Mysqlx.Crud.UpdateOperation.Types.UpdateType OperationDefaultValue = global::Mysqlx.Crud.UpdateOperation.Types.UpdateType.Set; + + private global::Mysqlx.Crud.UpdateOperation.Types.UpdateType operation_; + /// + ///* the type of operation to be performed + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.UpdateOperation.Types.UpdateType Operation + { + get { if ((_hasBits0 & 1) != 0) { return operation_; } else { return OperationDefaultValue; } } + set + { + _hasBits0 |= 1; + operation_ = value; + } + } + /// Gets whether the "operation" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasOperation + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "operation" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearOperation() + { + _hasBits0 &= ~1; + } + + /// Field number for the "value" field. + public const int ValueFieldNumber = 3; + private global::Mysqlx.Expr.Expr value_; + /// + ///* an expression to be computed as the new value for the operation + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Expr.Expr Value + { + get { return value_; } + set + { + value_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as UpdateOperation); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(UpdateOperation other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (!object.Equals(Source, other.Source)) return false; + if (Operation != other.Operation) return false; + if (!object.Equals(Value, other.Value)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (source_ != null) hash ^= Source.GetHashCode(); + if (HasOperation) hash ^= Operation.GetHashCode(); + if (value_ != null) hash ^= Value.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (source_ != null) { + output.WriteRawTag(10); + output.WriteMessage(Source); + } + if (HasOperation) { + output.WriteRawTag(16); + output.WriteEnum((int) Operation); + } + if (value_ != null) { + output.WriteRawTag(26); + output.WriteMessage(Value); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (source_ != null) + { + output.WriteRawTag(10); + output.WriteMessage(Source); + } + if (HasOperation) + { + output.WriteRawTag(16); + output.WriteEnum((int)Operation); + } + if (value_ != null) + { + output.WriteRawTag(26); + output.WriteMessage(Value); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (source_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Source); + } + if (HasOperation) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Operation); + } + if (value_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Value); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(UpdateOperation other) + { + if (other == null) + { + return; + } + if (other.source_ != null) + { + if (source_ == null) + { + Source = new global::Mysqlx.Expr.ColumnIdentifier(); + } + Source.MergeFrom(other.Source); + } + if (other.HasOperation) + { + Operation = other.Operation; + } + if (other.value_ != null) + { + if (value_ == null) + { + Value = new global::Mysqlx.Expr.Expr(); + } + Value.MergeFrom(other.Value); + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + if (source_ == null) { + Source = new global::Mysqlx.Expr.ColumnIdentifier(); + } + input.ReadMessage(Source); + break; + } + case 16: { + Operation = (global::Mysqlx.Crud.UpdateOperation.Types.UpdateType) input.ReadEnum(); + break; + } + case 26: { + if (value_ == null) { + Value = new global::Mysqlx.Expr.Expr(); + } + input.ReadMessage(Value); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + if (source_ == null) + { + Source = new global::Mysqlx.Expr.ColumnIdentifier(); + } + input.ReadMessage(Source); + break; + } + case 16: + { + Operation = (global::Mysqlx.Crud.UpdateOperation.Types.UpdateType)input.ReadEnum(); + break; + } + case 26: + { + if (value_ == null) + { + Value = new global::Mysqlx.Expr.Expr(); + } + input.ReadMessage(Value); + break; + } + } + } + } +#endif + + #region Nested types + /// Container for nested types declared in the UpdateOperation message type. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static partial class Types + { + public enum UpdateType + { + /// + ///* only allowed for TABLE + /// + [pbr::OriginalName("SET")] Set = 1, + /// + ///* no value (removes the identified path from a object or array) + /// + [pbr::OriginalName("ITEM_REMOVE")] ItemRemove = 2, + /// + ///* sets the new value on the identified path + /// + [pbr::OriginalName("ITEM_SET")] ItemSet = 3, + /// + ///* replaces a value if the path exists + /// + [pbr::OriginalName("ITEM_REPLACE")] ItemReplace = 4, + /// + ///* source and value must be documents + /// + [pbr::OriginalName("ITEM_MERGE")] ItemMerge = 5, + /// + ///* insert the value in the array at the index identified in the source path + /// + [pbr::OriginalName("ARRAY_INSERT")] ArrayInsert = 6, + /// + ///* append the value on the array at the identified path + /// + [pbr::OriginalName("ARRAY_APPEND")] ArrayAppend = 7, + /// + ///* merge JSON object value with the provided patch expression + /// + [pbr::OriginalName("MERGE_PATCH")] MergePatch = 8, + } + + } + #endregion + + } + + /// + ///* + ///Find Documents/Rows in a Collection/Table + /// + ///@startuml + ///client -> server: Find + ///... one or more Resultset ... + ///@enduml + /// + ///@returns @ref Mysqlx::Resultset + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Find : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Find()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[7]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Find() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Find(Find other) : this() + { + _hasBits0 = other._hasBits0; + collection_ = other.collection_ != null ? other.collection_.Clone() : null; + dataModel_ = other.dataModel_; + projection_ = other.projection_.Clone(); + args_ = other.args_.Clone(); + criteria_ = other.criteria_ != null ? other.criteria_.Clone() : null; + limit_ = other.limit_ != null ? other.limit_.Clone() : null; + order_ = other.order_.Clone(); + grouping_ = other.grouping_.Clone(); + groupingCriteria_ = other.groupingCriteria_ != null ? other.groupingCriteria_.Clone() : null; + locking_ = other.locking_; + lockingOptions_ = other.lockingOptions_; + limitExpr_ = other.limitExpr_ != null ? other.limitExpr_.Clone() : null; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Find Clone() + { + return new Find(this); + } + + /// Field number for the "collection" field. + public const int CollectionFieldNumber = 2; + private global::Mysqlx.Crud.Collection collection_; + /// + ///* collection in which to find + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.Collection Collection + { + get { return collection_; } + set + { + collection_ = value; + } + } + + /// Field number for the "data_model" field. + public const int DataModelFieldNumber = 3; + private readonly static global::Mysqlx.Crud.DataModel DataModelDefaultValue = global::Mysqlx.Crud.DataModel.Document; + + private global::Mysqlx.Crud.DataModel dataModel_; + /// + ///* data model that the operations refer to + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.DataModel DataModel + { + get { if ((_hasBits0 & 1) != 0) { return dataModel_; } else { return DataModelDefaultValue; } } + set + { + _hasBits0 |= 1; + dataModel_ = value; + } + } + /// Gets whether the "data_model" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasDataModel + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "data_model" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearDataModel() + { + _hasBits0 &= ~1; + } + + /// Field number for the "projection" field. + public const int ProjectionFieldNumber = 4; + private static readonly pb::FieldCodec _repeated_projection_codec + = pb::FieldCodec.ForMessage(34, global::Mysqlx.Crud.Projection.Parser); + private readonly pbc::RepeatedField projection_ = new pbc::RepeatedField(); + /// + ///* list of column projections that shall be returned + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Projection + { + get { return projection_; } + } + + /// Field number for the "args" field. + public const int ArgsFieldNumber = 11; + private static readonly pb::FieldCodec _repeated_args_codec + = pb::FieldCodec.ForMessage(90, global::Mysqlx.Datatypes.Scalar.Parser); + private readonly pbc::RepeatedField args_ = new pbc::RepeatedField(); + /// + ///* values for parameters used in filter expression + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Args + { + get { return args_; } + } + + /// Field number for the "criteria" field. + public const int CriteriaFieldNumber = 5; + private global::Mysqlx.Expr.Expr criteria_; + /// + ///* filter criteria + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Expr.Expr Criteria + { + get { return criteria_; } + set + { + criteria_ = value; + } + } + + /// Field number for the "limit" field. + public const int LimitFieldNumber = 6; + private global::Mysqlx.Crud.Limit limit_; + /// + ///* numbers of rows that shall be skipped and returned + ///(user can set one of: limit, limit_expr) + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.Limit Limit + { + get { return limit_; } + set + { + limit_ = value; + } + } + + /// Field number for the "order" field. + public const int OrderFieldNumber = 7; + private static readonly pb::FieldCodec _repeated_order_codec + = pb::FieldCodec.ForMessage(58, global::Mysqlx.Crud.Order.Parser); + private readonly pbc::RepeatedField order_ = new pbc::RepeatedField(); + /// + ///* sort-order in which the rows/document shall be returned in + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Order + { + get { return order_; } + } + + /// Field number for the "grouping" field. + public const int GroupingFieldNumber = 8; + private static readonly pb::FieldCodec _repeated_grouping_codec + = pb::FieldCodec.ForMessage(66, global::Mysqlx.Expr.Expr.Parser); + private readonly pbc::RepeatedField grouping_ = new pbc::RepeatedField(); + /// + ///* column expression list for aggregation (GROUP BY) + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Grouping + { + get { return grouping_; } + } + + /// Field number for the "grouping_criteria" field. + public const int GroupingCriteriaFieldNumber = 9; + private global::Mysqlx.Expr.Expr groupingCriteria_; + /// + ///* filter criteria for aggregated groups + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Expr.Expr GroupingCriteria + { + get { return groupingCriteria_; } + set + { + groupingCriteria_ = value; + } + } + + /// Field number for the "locking" field. + public const int LockingFieldNumber = 12; + private readonly static global::Mysqlx.Crud.Find.Types.RowLock LockingDefaultValue = global::Mysqlx.Crud.Find.Types.RowLock.SharedLock; + + private global::Mysqlx.Crud.Find.Types.RowLock locking_; + /// + ///* perform row locking on matches + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.Find.Types.RowLock Locking + { + get { if ((_hasBits0 & 2) != 0) { return locking_; } else { return LockingDefaultValue; } } + set + { + _hasBits0 |= 2; + locking_ = value; + } + } + /// Gets whether the "locking" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasLocking + { + get { return (_hasBits0 & 2) != 0; } + } + /// Clears the value of the "locking" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearLocking() + { + _hasBits0 &= ~2; + } + + /// Field number for the "locking_options" field. + public const int LockingOptionsFieldNumber = 13; + private readonly static global::Mysqlx.Crud.Find.Types.RowLockOptions LockingOptionsDefaultValue = global::Mysqlx.Crud.Find.Types.RowLockOptions.Nowait; + + private global::Mysqlx.Crud.Find.Types.RowLockOptions lockingOptions_; + /// + ///* additional options how to handle locked rows + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.Find.Types.RowLockOptions LockingOptions + { + get { if ((_hasBits0 & 4) != 0) { return lockingOptions_; } else { return LockingOptionsDefaultValue; } } + set + { + _hasBits0 |= 4; + lockingOptions_ = value; + } + } + /// Gets whether the "locking_options" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasLockingOptions + { + get { return (_hasBits0 & 4) != 0; } + } + /// Clears the value of the "locking_options" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearLockingOptions() + { + _hasBits0 &= ~4; + } + + /// Field number for the "limit_expr" field. + public const int LimitExprFieldNumber = 14; + private global::Mysqlx.Crud.LimitExpr limitExpr_; + /// + ///* numbers of rows that shall be skipped and returned + ///(user can set one of: limit, limit_expr) + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.LimitExpr LimitExpr + { + get { return limitExpr_; } + set + { + limitExpr_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Find); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Find other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (!object.Equals(Collection, other.Collection)) return false; + if (DataModel != other.DataModel) return false; + if (!projection_.Equals(other.projection_)) return false; + if (!args_.Equals(other.args_)) return false; + if (!object.Equals(Criteria, other.Criteria)) return false; + if (!object.Equals(Limit, other.Limit)) return false; + if (!order_.Equals(other.order_)) return false; + if (!grouping_.Equals(other.grouping_)) return false; + if (!object.Equals(GroupingCriteria, other.GroupingCriteria)) return false; + if (Locking != other.Locking) return false; + if (LockingOptions != other.LockingOptions) return false; + if (!object.Equals(LimitExpr, other.LimitExpr)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (collection_ != null) hash ^= Collection.GetHashCode(); + if (HasDataModel) hash ^= DataModel.GetHashCode(); + hash ^= projection_.GetHashCode(); + hash ^= args_.GetHashCode(); + if (criteria_ != null) hash ^= Criteria.GetHashCode(); + if (limit_ != null) hash ^= Limit.GetHashCode(); + hash ^= order_.GetHashCode(); + hash ^= grouping_.GetHashCode(); + if (groupingCriteria_ != null) hash ^= GroupingCriteria.GetHashCode(); + if (HasLocking) hash ^= Locking.GetHashCode(); + if (HasLockingOptions) hash ^= LockingOptions.GetHashCode(); + if (limitExpr_ != null) hash ^= LimitExpr.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (collection_ != null) { + output.WriteRawTag(18); + output.WriteMessage(Collection); + } + if (HasDataModel) { + output.WriteRawTag(24); + output.WriteEnum((int) DataModel); + } + projection_.WriteTo(output, _repeated_projection_codec); + if (criteria_ != null) { + output.WriteRawTag(42); + output.WriteMessage(Criteria); + } + if (limit_ != null) { + output.WriteRawTag(50); + output.WriteMessage(Limit); + } + order_.WriteTo(output, _repeated_order_codec); + grouping_.WriteTo(output, _repeated_grouping_codec); + if (groupingCriteria_ != null) { + output.WriteRawTag(74); + output.WriteMessage(GroupingCriteria); + } + args_.WriteTo(output, _repeated_args_codec); + if (HasLocking) { + output.WriteRawTag(96); + output.WriteEnum((int) Locking); + } + if (HasLockingOptions) { + output.WriteRawTag(104); + output.WriteEnum((int) LockingOptions); + } + if (limitExpr_ != null) { + output.WriteRawTag(114); + output.WriteMessage(LimitExpr); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (collection_ != null) + { + output.WriteRawTag(18); + output.WriteMessage(Collection); + } + if (HasDataModel) + { + output.WriteRawTag(24); + output.WriteEnum((int)DataModel); + } + projection_.WriteTo(ref output, _repeated_projection_codec); + if (criteria_ != null) + { + output.WriteRawTag(42); + output.WriteMessage(Criteria); + } + if (limit_ != null) + { + output.WriteRawTag(50); + output.WriteMessage(Limit); + } + order_.WriteTo(ref output, _repeated_order_codec); + grouping_.WriteTo(ref output, _repeated_grouping_codec); + if (groupingCriteria_ != null) + { + output.WriteRawTag(74); + output.WriteMessage(GroupingCriteria); + } + args_.WriteTo(ref output, _repeated_args_codec); + if (HasLocking) + { + output.WriteRawTag(96); + output.WriteEnum((int)Locking); + } + if (HasLockingOptions) + { + output.WriteRawTag(104); + output.WriteEnum((int)LockingOptions); + } + if (limitExpr_ != null) + { + output.WriteRawTag(114); + output.WriteMessage(LimitExpr); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (collection_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Collection); + } + if (HasDataModel) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)DataModel); + } + size += projection_.CalculateSize(_repeated_projection_codec); + size += args_.CalculateSize(_repeated_args_codec); + if (criteria_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Criteria); + } + if (limit_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Limit); + } + size += order_.CalculateSize(_repeated_order_codec); + size += grouping_.CalculateSize(_repeated_grouping_codec); + if (groupingCriteria_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(GroupingCriteria); + } + if (HasLocking) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Locking); + } + if (HasLockingOptions) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)LockingOptions); + } + if (limitExpr_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(LimitExpr); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Find other) + { + if (other == null) + { + return; + } + if (other.collection_ != null) + { + if (collection_ == null) + { + Collection = new global::Mysqlx.Crud.Collection(); + } + Collection.MergeFrom(other.Collection); + } + if (other.HasDataModel) + { + DataModel = other.DataModel; + } + projection_.Add(other.projection_); + args_.Add(other.args_); + if (other.criteria_ != null) + { + if (criteria_ == null) + { + Criteria = new global::Mysqlx.Expr.Expr(); + } + Criteria.MergeFrom(other.Criteria); + } + if (other.limit_ != null) + { + if (limit_ == null) + { + Limit = new global::Mysqlx.Crud.Limit(); + } + Limit.MergeFrom(other.Limit); + } + order_.Add(other.order_); + grouping_.Add(other.grouping_); + if (other.groupingCriteria_ != null) + { + if (groupingCriteria_ == null) + { + GroupingCriteria = new global::Mysqlx.Expr.Expr(); + } + GroupingCriteria.MergeFrom(other.GroupingCriteria); + } + if (other.HasLocking) + { + Locking = other.Locking; + } + if (other.HasLockingOptions) + { + LockingOptions = other.LockingOptions; + } + if (other.limitExpr_ != null) + { + if (limitExpr_ == null) + { + LimitExpr = new global::Mysqlx.Crud.LimitExpr(); + } + LimitExpr.MergeFrom(other.LimitExpr); + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 18: { + if (collection_ == null) { + Collection = new global::Mysqlx.Crud.Collection(); + } + input.ReadMessage(Collection); + break; + } + case 24: { + DataModel = (global::Mysqlx.Crud.DataModel) input.ReadEnum(); + break; + } + case 34: { + projection_.AddEntriesFrom(input, _repeated_projection_codec); + break; + } + case 42: { + if (criteria_ == null) { + Criteria = new global::Mysqlx.Expr.Expr(); + } + input.ReadMessage(Criteria); + break; + } + case 50: { + if (limit_ == null) { + Limit = new global::Mysqlx.Crud.Limit(); + } + input.ReadMessage(Limit); + break; + } + case 58: { + order_.AddEntriesFrom(input, _repeated_order_codec); + break; + } + case 66: { + grouping_.AddEntriesFrom(input, _repeated_grouping_codec); + break; + } + case 74: { + if (groupingCriteria_ == null) { + GroupingCriteria = new global::Mysqlx.Expr.Expr(); + } + input.ReadMessage(GroupingCriteria); + break; + } + case 90: { + args_.AddEntriesFrom(input, _repeated_args_codec); + break; + } + case 96: { + Locking = (global::Mysqlx.Crud.Find.Types.RowLock) input.ReadEnum(); + break; + } + case 104: { + LockingOptions = (global::Mysqlx.Crud.Find.Types.RowLockOptions) input.ReadEnum(); + break; + } + case 114: { + if (limitExpr_ == null) { + LimitExpr = new global::Mysqlx.Crud.LimitExpr(); + } + input.ReadMessage(LimitExpr); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 18: + { + if (collection_ == null) + { + Collection = new global::Mysqlx.Crud.Collection(); + } + input.ReadMessage(Collection); + break; + } + case 24: + { + DataModel = (global::Mysqlx.Crud.DataModel)input.ReadEnum(); + break; + } + case 34: + { + projection_.AddEntriesFrom(ref input, _repeated_projection_codec); + break; + } + case 42: + { + if (criteria_ == null) + { + Criteria = new global::Mysqlx.Expr.Expr(); + } + input.ReadMessage(Criteria); + break; + } + case 50: + { + if (limit_ == null) + { + Limit = new global::Mysqlx.Crud.Limit(); + } + input.ReadMessage(Limit); + break; + } + case 58: + { + order_.AddEntriesFrom(ref input, _repeated_order_codec); + break; + } + case 66: + { + grouping_.AddEntriesFrom(ref input, _repeated_grouping_codec); + break; + } + case 74: + { + if (groupingCriteria_ == null) + { + GroupingCriteria = new global::Mysqlx.Expr.Expr(); + } + input.ReadMessage(GroupingCriteria); + break; + } + case 90: + { + args_.AddEntriesFrom(ref input, _repeated_args_codec); + break; + } + case 96: + { + Locking = (global::Mysqlx.Crud.Find.Types.RowLock)input.ReadEnum(); + break; + } + case 104: + { + LockingOptions = (global::Mysqlx.Crud.Find.Types.RowLockOptions)input.ReadEnum(); + break; + } + case 114: + { + if (limitExpr_ == null) + { + LimitExpr = new global::Mysqlx.Crud.LimitExpr(); + } + input.ReadMessage(LimitExpr); + break; + } + } + } + } +#endif + + #region Nested types + /// Container for nested types declared in the Find message type. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static partial class Types + { + public enum RowLock + { + /// + ///* Lock matching rows against updates + /// + [pbr::OriginalName("SHARED_LOCK")] SharedLock = 1, + /// + ///* Lock matching rows so no other transaction can read or write to it + /// + [pbr::OriginalName("EXCLUSIVE_LOCK")] ExclusiveLock = 2, + } + + public enum RowLockOptions + { + /// + ///* Do not wait to acquire row lock, fail with an error + ///if a requested row is locked + /// + [pbr::OriginalName("NOWAIT")] Nowait = 1, + /// + ///* Do not wait to acquire a row lock, + ///remove locked rows from the result set + /// + [pbr::OriginalName("SKIP_LOCKED")] SkipLocked = 2, + } + + } + #endregion + + } + + /// + ///* + ///Insert documents/rows into a collection/table + /// + ///@returns @ref Mysqlx::Resultset + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Insert : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Insert()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[8]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Insert() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Insert(Insert other) : this() + { + _hasBits0 = other._hasBits0; + collection_ = other.collection_ != null ? other.collection_.Clone() : null; + dataModel_ = other.dataModel_; + projection_ = other.projection_.Clone(); + row_ = other.row_.Clone(); + args_ = other.args_.Clone(); + upsert_ = other.upsert_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Insert Clone() + { + return new Insert(this); + } + + /// Field number for the "collection" field. + public const int CollectionFieldNumber = 1; + private global::Mysqlx.Crud.Collection collection_; + /// + ///* collection to insert into + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.Collection Collection + { + get { return collection_; } + set + { + collection_ = value; + } + } + + /// Field number for the "data_model" field. + public const int DataModelFieldNumber = 2; + private readonly static global::Mysqlx.Crud.DataModel DataModelDefaultValue = global::Mysqlx.Crud.DataModel.Document; + + private global::Mysqlx.Crud.DataModel dataModel_; + /// + ///* data model that the operations refer to + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.DataModel DataModel + { + get { if ((_hasBits0 & 1) != 0) { return dataModel_; } else { return DataModelDefaultValue; } } + set + { + _hasBits0 |= 1; + dataModel_ = value; + } + } + /// Gets whether the "data_model" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasDataModel + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "data_model" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearDataModel() + { + _hasBits0 &= ~1; + } + + /// Field number for the "projection" field. + public const int ProjectionFieldNumber = 3; + private static readonly pb::FieldCodec _repeated_projection_codec + = pb::FieldCodec.ForMessage(26, global::Mysqlx.Crud.Column.Parser); + private readonly pbc::RepeatedField projection_ = new pbc::RepeatedField(); + /// + ///* name of the columns to insert data into + ///(empty if data_model is DOCUMENT) + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Projection + { + get { return projection_; } + } + + /// Field number for the "row" field. + public const int RowFieldNumber = 4; + private static readonly pb::FieldCodec _repeated_row_codec + = pb::FieldCodec.ForMessage(34, global::Mysqlx.Crud.Insert.Types.TypedRow.Parser); + private readonly pbc::RepeatedField row_ = new pbc::RepeatedField(); + /// + ///* set of rows to insert into the collection/table (a single expression + ///with a JSON document literal or an OBJECT expression) + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Row + { + get { return row_; } + } + + /// Field number for the "args" field. + public const int ArgsFieldNumber = 5; + private static readonly pb::FieldCodec _repeated_args_codec + = pb::FieldCodec.ForMessage(42, global::Mysqlx.Datatypes.Scalar.Parser); + private readonly pbc::RepeatedField args_ = new pbc::RepeatedField(); + /// + ///* values for parameters used in row expressions + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Args + { + get { return args_; } + } + + /// Field number for the "upsert" field. + public const int UpsertFieldNumber = 6; + private readonly static bool UpsertDefaultValue = false; + + private bool upsert_; + /// + ///* true if this should be treated as an Upsert + ///(that is, update on duplicate key) + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Upsert + { + get { if ((_hasBits0 & 2) != 0) { return upsert_; } else { return UpsertDefaultValue; } } + set + { + _hasBits0 |= 2; + upsert_ = value; + } + } + /// Gets whether the "upsert" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasUpsert + { + get { return (_hasBits0 & 2) != 0; } + } + /// Clears the value of the "upsert" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearUpsert() + { + _hasBits0 &= ~2; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Insert); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Insert other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (!object.Equals(Collection, other.Collection)) return false; + if (DataModel != other.DataModel) return false; + if (!projection_.Equals(other.projection_)) return false; + if (!row_.Equals(other.row_)) return false; + if (!args_.Equals(other.args_)) return false; + if (Upsert != other.Upsert) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (collection_ != null) hash ^= Collection.GetHashCode(); + if (HasDataModel) hash ^= DataModel.GetHashCode(); + hash ^= projection_.GetHashCode(); + hash ^= row_.GetHashCode(); + hash ^= args_.GetHashCode(); + if (HasUpsert) hash ^= Upsert.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (collection_ != null) { + output.WriteRawTag(10); + output.WriteMessage(Collection); + } + if (HasDataModel) { + output.WriteRawTag(16); + output.WriteEnum((int) DataModel); + } + projection_.WriteTo(output, _repeated_projection_codec); + row_.WriteTo(output, _repeated_row_codec); + args_.WriteTo(output, _repeated_args_codec); + if (HasUpsert) { + output.WriteRawTag(48); + output.WriteBool(Upsert); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (collection_ != null) + { + output.WriteRawTag(10); + output.WriteMessage(Collection); + } + if (HasDataModel) + { + output.WriteRawTag(16); + output.WriteEnum((int)DataModel); + } + projection_.WriteTo(ref output, _repeated_projection_codec); + row_.WriteTo(ref output, _repeated_row_codec); + args_.WriteTo(ref output, _repeated_args_codec); + if (HasUpsert) + { + output.WriteRawTag(48); + output.WriteBool(Upsert); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (collection_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Collection); + } + if (HasDataModel) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)DataModel); + } + size += projection_.CalculateSize(_repeated_projection_codec); + size += row_.CalculateSize(_repeated_row_codec); + size += args_.CalculateSize(_repeated_args_codec); + if (HasUpsert) + { + size += 1 + 1; + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Insert other) + { + if (other == null) + { + return; + } + if (other.collection_ != null) + { + if (collection_ == null) + { + Collection = new global::Mysqlx.Crud.Collection(); + } + Collection.MergeFrom(other.Collection); + } + if (other.HasDataModel) + { + DataModel = other.DataModel; + } + projection_.Add(other.projection_); + row_.Add(other.row_); + args_.Add(other.args_); + if (other.HasUpsert) + { + Upsert = other.Upsert; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + if (collection_ == null) { + Collection = new global::Mysqlx.Crud.Collection(); + } + input.ReadMessage(Collection); + break; + } + case 16: { + DataModel = (global::Mysqlx.Crud.DataModel) input.ReadEnum(); + break; + } + case 26: { + projection_.AddEntriesFrom(input, _repeated_projection_codec); + break; + } + case 34: { + row_.AddEntriesFrom(input, _repeated_row_codec); + break; + } + case 42: { + args_.AddEntriesFrom(input, _repeated_args_codec); + break; + } + case 48: { + Upsert = input.ReadBool(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + if (collection_ == null) + { + Collection = new global::Mysqlx.Crud.Collection(); + } + input.ReadMessage(Collection); + break; + } + case 16: + { + DataModel = (global::Mysqlx.Crud.DataModel)input.ReadEnum(); + break; + } + case 26: + { + projection_.AddEntriesFrom(ref input, _repeated_projection_codec); + break; + } + case 34: + { + row_.AddEntriesFrom(ref input, _repeated_row_codec); + break; + } + case 42: + { + args_.AddEntriesFrom(ref input, _repeated_args_codec); + break; + } + case 48: + { + Upsert = input.ReadBool(); + break; + } + } + } + } +#endif + + #region Nested types + /// Container for nested types declared in the Insert message type. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static partial class Types + { + /// + ///* set of fields to insert as a one row + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class TypedRow : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new TypedRow()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Crud.Insert.Descriptor.NestedTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public TypedRow() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public TypedRow(TypedRow other) : this() + { + field_ = other.field_.Clone(); + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public TypedRow Clone() + { + return new TypedRow(this); + } + + /// Field number for the "field" field. + public const int FieldFieldNumber = 1; + private static readonly pb::FieldCodec _repeated_field_codec + = pb::FieldCodec.ForMessage(10, global::Mysqlx.Expr.Expr.Parser); + private readonly pbc::RepeatedField field_ = new pbc::RepeatedField(); + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Field + { + get { return field_; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as TypedRow); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(TypedRow other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (!field_.Equals(other.field_)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + hash ^= field_.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + field_.WriteTo(output, _repeated_field_codec); + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + field_.WriteTo(ref output, _repeated_field_codec); + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + size += field_.CalculateSize(_repeated_field_codec); + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(TypedRow other) + { + if (other == null) + { + return; + } + field_.Add(other.field_); + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + field_.AddEntriesFrom(input, _repeated_field_codec); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + field_.AddEntriesFrom(ref input, _repeated_field_codec); + break; + } + } + } + } +#endif + + } + + } + #endregion + + } + + /// + ///* + ///Update documents/rows in a collection/table + /// + ///@returns @ref Mysqlx::Resultset + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Update : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Update()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[9]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Update() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Update(Update other) : this() + { + _hasBits0 = other._hasBits0; + collection_ = other.collection_ != null ? other.collection_.Clone() : null; + dataModel_ = other.dataModel_; + criteria_ = other.criteria_ != null ? other.criteria_.Clone() : null; + limit_ = other.limit_ != null ? other.limit_.Clone() : null; + order_ = other.order_.Clone(); + operation_ = other.operation_.Clone(); + args_ = other.args_.Clone(); + limitExpr_ = other.limitExpr_ != null ? other.limitExpr_.Clone() : null; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Update Clone() + { + return new Update(this); + } + + /// Field number for the "collection" field. + public const int CollectionFieldNumber = 2; + private global::Mysqlx.Crud.Collection collection_; + /// + ///* collection to change + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.Collection Collection + { + get { return collection_; } + set + { + collection_ = value; + } + } + + /// Field number for the "data_model" field. + public const int DataModelFieldNumber = 3; + private readonly static global::Mysqlx.Crud.DataModel DataModelDefaultValue = global::Mysqlx.Crud.DataModel.Document; + + private global::Mysqlx.Crud.DataModel dataModel_; + /// + ///* datamodel that the operations refer to + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.DataModel DataModel + { + get { if ((_hasBits0 & 1) != 0) { return dataModel_; } else { return DataModelDefaultValue; } } + set + { + _hasBits0 |= 1; + dataModel_ = value; + } + } + /// Gets whether the "data_model" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasDataModel + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "data_model" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearDataModel() + { + _hasBits0 &= ~1; + } + + /// Field number for the "criteria" field. + public const int CriteriaFieldNumber = 4; + private global::Mysqlx.Expr.Expr criteria_; + /// + ///* filter expression to match rows that the operations will apply on + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Expr.Expr Criteria + { + get { return criteria_; } + set + { + criteria_ = value; + } + } + + /// Field number for the "limit" field. + public const int LimitFieldNumber = 5; + private global::Mysqlx.Crud.Limit limit_; + /// + ///* limits the number of rows to match + ///(user can set one of: limit, limit_expr) + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.Limit Limit + { + get { return limit_; } + set + { + limit_ = value; + } + } + + /// Field number for the "order" field. + public const int OrderFieldNumber = 6; + private static readonly pb::FieldCodec _repeated_order_codec + = pb::FieldCodec.ForMessage(50, global::Mysqlx.Crud.Order.Parser); + private readonly pbc::RepeatedField order_ = new pbc::RepeatedField(); + /// + ///* specifies order of matched rows + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Order + { + get { return order_; } + } + + /// Field number for the "operation" field. + public const int OperationFieldNumber = 7; + private static readonly pb::FieldCodec _repeated_operation_codec + = pb::FieldCodec.ForMessage(58, global::Mysqlx.Crud.UpdateOperation.Parser); + private readonly pbc::RepeatedField operation_ = new pbc::RepeatedField(); + /// + ///* list of operations to be applied. + ///Valid operations will depend on the data_model + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Operation + { + get { return operation_; } + } + + /// Field number for the "args" field. + public const int ArgsFieldNumber = 8; + private static readonly pb::FieldCodec _repeated_args_codec + = pb::FieldCodec.ForMessage(66, global::Mysqlx.Datatypes.Scalar.Parser); + private readonly pbc::RepeatedField args_ = new pbc::RepeatedField(); + /// + ///* values for parameters used in filter expression + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Args + { + get { return args_; } + } + + /// Field number for the "limit_expr" field. + public const int LimitExprFieldNumber = 9; + private global::Mysqlx.Crud.LimitExpr limitExpr_; + /// + ///* limits the number of rows to match + ///(user can set one of: limit, limit_expr) + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.LimitExpr LimitExpr + { + get { return limitExpr_; } + set + { + limitExpr_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Update); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Update other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (!object.Equals(Collection, other.Collection)) return false; + if (DataModel != other.DataModel) return false; + if (!object.Equals(Criteria, other.Criteria)) return false; + if (!object.Equals(Limit, other.Limit)) return false; + if (!order_.Equals(other.order_)) return false; + if (!operation_.Equals(other.operation_)) return false; + if (!args_.Equals(other.args_)) return false; + if (!object.Equals(LimitExpr, other.LimitExpr)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (collection_ != null) hash ^= Collection.GetHashCode(); + if (HasDataModel) hash ^= DataModel.GetHashCode(); + if (criteria_ != null) hash ^= Criteria.GetHashCode(); + if (limit_ != null) hash ^= Limit.GetHashCode(); + hash ^= order_.GetHashCode(); + hash ^= operation_.GetHashCode(); + hash ^= args_.GetHashCode(); + if (limitExpr_ != null) hash ^= LimitExpr.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (collection_ != null) { + output.WriteRawTag(18); + output.WriteMessage(Collection); + } + if (HasDataModel) { + output.WriteRawTag(24); + output.WriteEnum((int) DataModel); + } + if (criteria_ != null) { + output.WriteRawTag(34); + output.WriteMessage(Criteria); + } + if (limit_ != null) { + output.WriteRawTag(42); + output.WriteMessage(Limit); + } + order_.WriteTo(output, _repeated_order_codec); + operation_.WriteTo(output, _repeated_operation_codec); + args_.WriteTo(output, _repeated_args_codec); + if (limitExpr_ != null) { + output.WriteRawTag(74); + output.WriteMessage(LimitExpr); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (collection_ != null) + { + output.WriteRawTag(18); + output.WriteMessage(Collection); + } + if (HasDataModel) + { + output.WriteRawTag(24); + output.WriteEnum((int)DataModel); + } + if (criteria_ != null) + { + output.WriteRawTag(34); + output.WriteMessage(Criteria); + } + if (limit_ != null) + { + output.WriteRawTag(42); + output.WriteMessage(Limit); + } + order_.WriteTo(ref output, _repeated_order_codec); + operation_.WriteTo(ref output, _repeated_operation_codec); + args_.WriteTo(ref output, _repeated_args_codec); + if (limitExpr_ != null) + { + output.WriteRawTag(74); + output.WriteMessage(LimitExpr); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (collection_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Collection); + } + if (HasDataModel) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)DataModel); + } + if (criteria_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Criteria); + } + if (limit_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Limit); + } + size += order_.CalculateSize(_repeated_order_codec); + size += operation_.CalculateSize(_repeated_operation_codec); + size += args_.CalculateSize(_repeated_args_codec); + if (limitExpr_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(LimitExpr); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Update other) + { + if (other == null) + { + return; + } + if (other.collection_ != null) + { + if (collection_ == null) + { + Collection = new global::Mysqlx.Crud.Collection(); + } + Collection.MergeFrom(other.Collection); + } + if (other.HasDataModel) + { + DataModel = other.DataModel; + } + if (other.criteria_ != null) + { + if (criteria_ == null) + { + Criteria = new global::Mysqlx.Expr.Expr(); + } + Criteria.MergeFrom(other.Criteria); + } + if (other.limit_ != null) + { + if (limit_ == null) + { + Limit = new global::Mysqlx.Crud.Limit(); + } + Limit.MergeFrom(other.Limit); + } + order_.Add(other.order_); + operation_.Add(other.operation_); + args_.Add(other.args_); + if (other.limitExpr_ != null) + { + if (limitExpr_ == null) + { + LimitExpr = new global::Mysqlx.Crud.LimitExpr(); + } + LimitExpr.MergeFrom(other.LimitExpr); + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 18: { + if (collection_ == null) { + Collection = new global::Mysqlx.Crud.Collection(); + } + input.ReadMessage(Collection); + break; + } + case 24: { + DataModel = (global::Mysqlx.Crud.DataModel) input.ReadEnum(); + break; + } + case 34: { + if (criteria_ == null) { + Criteria = new global::Mysqlx.Expr.Expr(); + } + input.ReadMessage(Criteria); + break; + } + case 42: { + if (limit_ == null) { + Limit = new global::Mysqlx.Crud.Limit(); + } + input.ReadMessage(Limit); + break; + } + case 50: { + order_.AddEntriesFrom(input, _repeated_order_codec); + break; + } + case 58: { + operation_.AddEntriesFrom(input, _repeated_operation_codec); + break; + } + case 66: { + args_.AddEntriesFrom(input, _repeated_args_codec); + break; + } + case 74: { + if (limitExpr_ == null) { + LimitExpr = new global::Mysqlx.Crud.LimitExpr(); + } + input.ReadMessage(LimitExpr); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 18: + { + if (collection_ == null) + { + Collection = new global::Mysqlx.Crud.Collection(); + } + input.ReadMessage(Collection); + break; + } + case 24: + { + DataModel = (global::Mysqlx.Crud.DataModel)input.ReadEnum(); + break; + } + case 34: + { + if (criteria_ == null) + { + Criteria = new global::Mysqlx.Expr.Expr(); + } + input.ReadMessage(Criteria); + break; + } + case 42: + { + if (limit_ == null) + { + Limit = new global::Mysqlx.Crud.Limit(); + } + input.ReadMessage(Limit); + break; + } + case 50: + { + order_.AddEntriesFrom(ref input, _repeated_order_codec); + break; + } + case 58: + { + operation_.AddEntriesFrom(ref input, _repeated_operation_codec); + break; + } + case 66: + { + args_.AddEntriesFrom(ref input, _repeated_args_codec); + break; + } + case 74: + { + if (limitExpr_ == null) + { + LimitExpr = new global::Mysqlx.Crud.LimitExpr(); + } + input.ReadMessage(LimitExpr); + break; + } + } + } + } +#endif + + } + + /// + ///* + ///Delete documents/rows from a Collection/Table + /// + ///@returns @ref Mysqlx::Resultset + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Delete : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Delete()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[10]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Delete() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Delete(Delete other) : this() + { + _hasBits0 = other._hasBits0; + collection_ = other.collection_ != null ? other.collection_.Clone() : null; + dataModel_ = other.dataModel_; + criteria_ = other.criteria_ != null ? other.criteria_.Clone() : null; + limit_ = other.limit_ != null ? other.limit_.Clone() : null; + order_ = other.order_.Clone(); + args_ = other.args_.Clone(); + limitExpr_ = other.limitExpr_ != null ? other.limitExpr_.Clone() : null; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Delete Clone() + { + return new Delete(this); + } + + /// Field number for the "collection" field. + public const int CollectionFieldNumber = 1; + private global::Mysqlx.Crud.Collection collection_; + /// + ///* collection to change + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.Collection Collection + { + get { return collection_; } + set + { + collection_ = value; + } + } + + /// Field number for the "data_model" field. + public const int DataModelFieldNumber = 2; + private readonly static global::Mysqlx.Crud.DataModel DataModelDefaultValue = global::Mysqlx.Crud.DataModel.Document; + + private global::Mysqlx.Crud.DataModel dataModel_; + /// + ///* data model that the operations refer to + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.DataModel DataModel + { + get { if ((_hasBits0 & 1) != 0) { return dataModel_; } else { return DataModelDefaultValue; } } + set + { + _hasBits0 |= 1; + dataModel_ = value; + } + } + /// Gets whether the "data_model" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasDataModel + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "data_model" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearDataModel() + { + _hasBits0 &= ~1; + } + + /// Field number for the "criteria" field. + public const int CriteriaFieldNumber = 3; + private global::Mysqlx.Expr.Expr criteria_; + /// + ///* filter expression to match rows that the operations will apply on + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Expr.Expr Criteria + { + get { return criteria_; } + set + { + criteria_ = value; + } + } + + /// Field number for the "limit" field. + public const int LimitFieldNumber = 4; + private global::Mysqlx.Crud.Limit limit_; + /// + ///* limits the number of rows to match + ///(user can set one of: limit, limit_expr) + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.Limit Limit + { + get { return limit_; } + set + { + limit_ = value; + } + } + + /// Field number for the "order" field. + public const int OrderFieldNumber = 5; + private static readonly pb::FieldCodec _repeated_order_codec + = pb::FieldCodec.ForMessage(42, global::Mysqlx.Crud.Order.Parser); + private readonly pbc::RepeatedField order_ = new pbc::RepeatedField(); + /// + ///* specifies order of matched rows + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Order + { + get { return order_; } + } + + /// Field number for the "args" field. + public const int ArgsFieldNumber = 6; + private static readonly pb::FieldCodec _repeated_args_codec + = pb::FieldCodec.ForMessage(50, global::Mysqlx.Datatypes.Scalar.Parser); + private readonly pbc::RepeatedField args_ = new pbc::RepeatedField(); + /// + ///* values for parameters used in filter expression + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Args + { + get { return args_; } + } + + /// Field number for the "limit_expr" field. + public const int LimitExprFieldNumber = 7; + private global::Mysqlx.Crud.LimitExpr limitExpr_; + /// + ///* limits the number of rows to match + ///(user can set one of: limit, limit_expr) + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.LimitExpr LimitExpr + { + get { return limitExpr_; } + set + { + limitExpr_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Delete); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Delete other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (!object.Equals(Collection, other.Collection)) return false; + if (DataModel != other.DataModel) return false; + if (!object.Equals(Criteria, other.Criteria)) return false; + if (!object.Equals(Limit, other.Limit)) return false; + if (!order_.Equals(other.order_)) return false; + if (!args_.Equals(other.args_)) return false; + if (!object.Equals(LimitExpr, other.LimitExpr)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (collection_ != null) hash ^= Collection.GetHashCode(); + if (HasDataModel) hash ^= DataModel.GetHashCode(); + if (criteria_ != null) hash ^= Criteria.GetHashCode(); + if (limit_ != null) hash ^= Limit.GetHashCode(); + hash ^= order_.GetHashCode(); + hash ^= args_.GetHashCode(); + if (limitExpr_ != null) hash ^= LimitExpr.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (collection_ != null) { + output.WriteRawTag(10); + output.WriteMessage(Collection); + } + if (HasDataModel) { + output.WriteRawTag(16); + output.WriteEnum((int) DataModel); + } + if (criteria_ != null) { + output.WriteRawTag(26); + output.WriteMessage(Criteria); + } + if (limit_ != null) { + output.WriteRawTag(34); + output.WriteMessage(Limit); + } + order_.WriteTo(output, _repeated_order_codec); + args_.WriteTo(output, _repeated_args_codec); + if (limitExpr_ != null) { + output.WriteRawTag(58); + output.WriteMessage(LimitExpr); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (collection_ != null) + { + output.WriteRawTag(10); + output.WriteMessage(Collection); + } + if (HasDataModel) + { + output.WriteRawTag(16); + output.WriteEnum((int)DataModel); + } + if (criteria_ != null) + { + output.WriteRawTag(26); + output.WriteMessage(Criteria); + } + if (limit_ != null) + { + output.WriteRawTag(34); + output.WriteMessage(Limit); + } + order_.WriteTo(ref output, _repeated_order_codec); + args_.WriteTo(ref output, _repeated_args_codec); + if (limitExpr_ != null) + { + output.WriteRawTag(58); + output.WriteMessage(LimitExpr); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (collection_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Collection); + } + if (HasDataModel) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)DataModel); + } + if (criteria_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Criteria); + } + if (limit_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Limit); + } + size += order_.CalculateSize(_repeated_order_codec); + size += args_.CalculateSize(_repeated_args_codec); + if (limitExpr_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(LimitExpr); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Delete other) + { + if (other == null) + { + return; + } + if (other.collection_ != null) + { + if (collection_ == null) + { + Collection = new global::Mysqlx.Crud.Collection(); + } + Collection.MergeFrom(other.Collection); + } + if (other.HasDataModel) + { + DataModel = other.DataModel; + } + if (other.criteria_ != null) + { + if (criteria_ == null) + { + Criteria = new global::Mysqlx.Expr.Expr(); + } + Criteria.MergeFrom(other.Criteria); + } + if (other.limit_ != null) + { + if (limit_ == null) + { + Limit = new global::Mysqlx.Crud.Limit(); + } + Limit.MergeFrom(other.Limit); + } + order_.Add(other.order_); + args_.Add(other.args_); + if (other.limitExpr_ != null) + { + if (limitExpr_ == null) + { + LimitExpr = new global::Mysqlx.Crud.LimitExpr(); + } + LimitExpr.MergeFrom(other.LimitExpr); + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + if (collection_ == null) { + Collection = new global::Mysqlx.Crud.Collection(); + } + input.ReadMessage(Collection); + break; + } + case 16: { + DataModel = (global::Mysqlx.Crud.DataModel) input.ReadEnum(); + break; + } + case 26: { + if (criteria_ == null) { + Criteria = new global::Mysqlx.Expr.Expr(); + } + input.ReadMessage(Criteria); + break; + } + case 34: { + if (limit_ == null) { + Limit = new global::Mysqlx.Crud.Limit(); + } + input.ReadMessage(Limit); + break; + } + case 42: { + order_.AddEntriesFrom(input, _repeated_order_codec); + break; + } + case 50: { + args_.AddEntriesFrom(input, _repeated_args_codec); + break; + } + case 58: { + if (limitExpr_ == null) { + LimitExpr = new global::Mysqlx.Crud.LimitExpr(); + } + input.ReadMessage(LimitExpr); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + if (collection_ == null) + { + Collection = new global::Mysqlx.Crud.Collection(); + } + input.ReadMessage(Collection); + break; + } + case 16: + { + DataModel = (global::Mysqlx.Crud.DataModel)input.ReadEnum(); + break; + } + case 26: + { + if (criteria_ == null) + { + Criteria = new global::Mysqlx.Expr.Expr(); + } + input.ReadMessage(Criteria); + break; + } + case 34: + { + if (limit_ == null) + { + Limit = new global::Mysqlx.Crud.Limit(); + } + input.ReadMessage(Limit); + break; + } + case 42: + { + order_.AddEntriesFrom(ref input, _repeated_order_codec); + break; + } + case 50: + { + args_.AddEntriesFrom(ref input, _repeated_args_codec); + break; + } + case 58: + { + if (limitExpr_ == null) + { + LimitExpr = new global::Mysqlx.Crud.LimitExpr(); + } + input.ReadMessage(LimitExpr); + break; + } + } + } + } +#endif + + } + + /// + ///* + ///CreateView create view based on indicated @ref Mysqlx::Crud::Find message + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class CreateView : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new CreateView()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[11]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public CreateView() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public CreateView(CreateView other) : this() + { + _hasBits0 = other._hasBits0; + collection_ = other.collection_ != null ? other.collection_.Clone() : null; + definer_ = other.definer_; + algorithm_ = other.algorithm_; + security_ = other.security_; + check_ = other.check_; + column_ = other.column_.Clone(); + stmt_ = other.stmt_ != null ? other.stmt_.Clone() : null; + replaceExisting_ = other.replaceExisting_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public CreateView Clone() + { + return new CreateView(this); + } + + /// Field number for the "collection" field. + public const int CollectionFieldNumber = 1; + private global::Mysqlx.Crud.Collection collection_; + /// + ///* name of the VIEW object, which should be created + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.Collection Collection + { + get { return collection_; } + set + { + collection_ = value; + } + } + + /// Field number for the "definer" field. + public const int DefinerFieldNumber = 2; + private readonly static string DefinerDefaultValue = ""; + + private string definer_; + /// + ///* user name of the definer, if the value isn't set then the definer + ///is current user + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Definer + { + get { return definer_ ?? DefinerDefaultValue; } + set + { + definer_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "definer" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasDefiner + { + get { return definer_ != null; } + } + /// Clears the value of the "definer" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearDefiner() + { + definer_ = null; + } + + /// Field number for the "algorithm" field. + public const int AlgorithmFieldNumber = 3; + private readonly static global::Mysqlx.Crud.ViewAlgorithm AlgorithmDefaultValue = global::Mysqlx.Crud.ViewAlgorithm.Undefined; + + private global::Mysqlx.Crud.ViewAlgorithm algorithm_; + /// + ///* defines how MySQL Server processes the view + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.ViewAlgorithm Algorithm + { + get { if ((_hasBits0 & 1) != 0) { return algorithm_; } else { return AlgorithmDefaultValue; } } + set + { + _hasBits0 |= 1; + algorithm_ = value; + } + } + /// Gets whether the "algorithm" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasAlgorithm + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "algorithm" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearAlgorithm() + { + _hasBits0 &= ~1; + } + + /// Field number for the "security" field. + public const int SecurityFieldNumber = 4; + private readonly static global::Mysqlx.Crud.ViewSqlSecurity SecurityDefaultValue = global::Mysqlx.Crud.ViewSqlSecurity.Definer; + + private global::Mysqlx.Crud.ViewSqlSecurity security_; + /// + ///* defines the security context in which the view is going be executed + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.ViewSqlSecurity Security + { + get { if ((_hasBits0 & 2) != 0) { return security_; } else { return SecurityDefaultValue; } } + set + { + _hasBits0 |= 2; + security_ = value; + } + } + /// Gets whether the "security" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasSecurity + { + get { return (_hasBits0 & 2) != 0; } + } + /// Clears the value of the "security" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearSecurity() + { + _hasBits0 &= ~2; + } + + /// Field number for the "check" field. + public const int CheckFieldNumber = 5; + private readonly static global::Mysqlx.Crud.ViewCheckOption CheckDefaultValue = global::Mysqlx.Crud.ViewCheckOption.Local; + + private global::Mysqlx.Crud.ViewCheckOption check_; + /// + ///* limits the write operations done on a VIEW + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.ViewCheckOption Check + { + get { if ((_hasBits0 & 4) != 0) { return check_; } else { return CheckDefaultValue; } } + set + { + _hasBits0 |= 4; + check_ = value; + } + } + /// Gets whether the "check" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasCheck + { + get { return (_hasBits0 & 4) != 0; } + } + /// Clears the value of the "check" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearCheck() + { + _hasBits0 &= ~4; + } + + /// Field number for the "column" field. + public const int ColumnFieldNumber = 6; + private static readonly pb::FieldCodec _repeated_column_codec + = pb::FieldCodec.ForString(50); + private readonly pbc::RepeatedField column_ = new pbc::RepeatedField(); + /// + ///* defines the list of aliases for column names specified in `stmt` + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Column + { + get { return column_; } + } + + /// Field number for the "stmt" field. + public const int StmtFieldNumber = 7; + private global::Mysqlx.Crud.Find stmt_; + /// + ///* Mysqlx.Crud.Find message from which the SELECT statement + ///is going to be build + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.Find Stmt + { + get { return stmt_; } + set + { + stmt_ = value; + } + } + + /// Field number for the "replace_existing" field. + public const int ReplaceExistingFieldNumber = 8; + private readonly static bool ReplaceExistingDefaultValue = false; + + private bool replaceExisting_; + /// + ///* if true then suppress error when created view already exists; + ///just replace it + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool ReplaceExisting + { + get { if ((_hasBits0 & 8) != 0) { return replaceExisting_; } else { return ReplaceExistingDefaultValue; } } + set + { + _hasBits0 |= 8; + replaceExisting_ = value; + } + } + /// Gets whether the "replace_existing" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasReplaceExisting + { + get { return (_hasBits0 & 8) != 0; } + } + /// Clears the value of the "replace_existing" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearReplaceExisting() + { + _hasBits0 &= ~8; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as CreateView); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(CreateView other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (!object.Equals(Collection, other.Collection)) return false; + if (Definer != other.Definer) return false; + if (Algorithm != other.Algorithm) return false; + if (Security != other.Security) return false; + if (Check != other.Check) return false; + if (!column_.Equals(other.column_)) return false; + if (!object.Equals(Stmt, other.Stmt)) return false; + if (ReplaceExisting != other.ReplaceExisting) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (collection_ != null) hash ^= Collection.GetHashCode(); + if (HasDefiner) hash ^= Definer.GetHashCode(); + if (HasAlgorithm) hash ^= Algorithm.GetHashCode(); + if (HasSecurity) hash ^= Security.GetHashCode(); + if (HasCheck) hash ^= Check.GetHashCode(); + hash ^= column_.GetHashCode(); + if (stmt_ != null) hash ^= Stmt.GetHashCode(); + if (HasReplaceExisting) hash ^= ReplaceExisting.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (collection_ != null) { + output.WriteRawTag(10); + output.WriteMessage(Collection); + } + if (HasDefiner) { + output.WriteRawTag(18); + output.WriteString(Definer); + } + if (HasAlgorithm) { + output.WriteRawTag(24); + output.WriteEnum((int) Algorithm); + } + if (HasSecurity) { + output.WriteRawTag(32); + output.WriteEnum((int) Security); + } + if (HasCheck) { + output.WriteRawTag(40); + output.WriteEnum((int) Check); + } + column_.WriteTo(output, _repeated_column_codec); + if (stmt_ != null) { + output.WriteRawTag(58); + output.WriteMessage(Stmt); + } + if (HasReplaceExisting) { + output.WriteRawTag(64); + output.WriteBool(ReplaceExisting); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (collection_ != null) + { + output.WriteRawTag(10); + output.WriteMessage(Collection); + } + if (HasDefiner) + { + output.WriteRawTag(18); + output.WriteString(Definer); + } + if (HasAlgorithm) + { + output.WriteRawTag(24); + output.WriteEnum((int)Algorithm); + } + if (HasSecurity) + { + output.WriteRawTag(32); + output.WriteEnum((int)Security); + } + if (HasCheck) + { + output.WriteRawTag(40); + output.WriteEnum((int)Check); + } + column_.WriteTo(ref output, _repeated_column_codec); + if (stmt_ != null) + { + output.WriteRawTag(58); + output.WriteMessage(Stmt); + } + if (HasReplaceExisting) + { + output.WriteRawTag(64); + output.WriteBool(ReplaceExisting); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (collection_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Collection); + } + if (HasDefiner) + { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Definer); + } + if (HasAlgorithm) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Algorithm); + } + if (HasSecurity) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Security); + } + if (HasCheck) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Check); + } + size += column_.CalculateSize(_repeated_column_codec); + if (stmt_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Stmt); + } + if (HasReplaceExisting) + { + size += 1 + 1; + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(CreateView other) + { + if (other == null) + { + return; + } + if (other.collection_ != null) + { + if (collection_ == null) + { + Collection = new global::Mysqlx.Crud.Collection(); + } + Collection.MergeFrom(other.Collection); + } + if (other.HasDefiner) + { + Definer = other.Definer; + } + if (other.HasAlgorithm) + { + Algorithm = other.Algorithm; + } + if (other.HasSecurity) + { + Security = other.Security; + } + if (other.HasCheck) + { + Check = other.Check; + } + column_.Add(other.column_); + if (other.stmt_ != null) + { + if (stmt_ == null) + { + Stmt = new global::Mysqlx.Crud.Find(); + } + Stmt.MergeFrom(other.Stmt); + } + if (other.HasReplaceExisting) + { + ReplaceExisting = other.ReplaceExisting; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + if (collection_ == null) { + Collection = new global::Mysqlx.Crud.Collection(); + } + input.ReadMessage(Collection); + break; + } + case 18: { + Definer = input.ReadString(); + break; + } + case 24: { + Algorithm = (global::Mysqlx.Crud.ViewAlgorithm) input.ReadEnum(); + break; + } + case 32: { + Security = (global::Mysqlx.Crud.ViewSqlSecurity) input.ReadEnum(); + break; + } + case 40: { + Check = (global::Mysqlx.Crud.ViewCheckOption) input.ReadEnum(); + break; + } + case 50: { + column_.AddEntriesFrom(input, _repeated_column_codec); + break; + } + case 58: { + if (stmt_ == null) { + Stmt = new global::Mysqlx.Crud.Find(); + } + input.ReadMessage(Stmt); + break; + } + case 64: { + ReplaceExisting = input.ReadBool(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + if (collection_ == null) + { + Collection = new global::Mysqlx.Crud.Collection(); + } + input.ReadMessage(Collection); + break; + } + case 18: + { + Definer = input.ReadString(); + break; + } + case 24: + { + Algorithm = (global::Mysqlx.Crud.ViewAlgorithm)input.ReadEnum(); + break; + } + case 32: + { + Security = (global::Mysqlx.Crud.ViewSqlSecurity)input.ReadEnum(); + break; + } + case 40: + { + Check = (global::Mysqlx.Crud.ViewCheckOption)input.ReadEnum(); + break; + } + case 50: + { + column_.AddEntriesFrom(ref input, _repeated_column_codec); + break; + } + case 58: + { + if (stmt_ == null) + { + Stmt = new global::Mysqlx.Crud.Find(); + } + input.ReadMessage(Stmt); + break; + } + case 64: + { + ReplaceExisting = input.ReadBool(); + break; + } + } + } + } +#endif + + } + + /// + ///* + ///ModifyView modify existing view based on indicated + ///@ref Mysqlx::Crud::Find message + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class ModifyView : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new ModifyView()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[12]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ModifyView() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ModifyView(ModifyView other) : this() + { + _hasBits0 = other._hasBits0; + collection_ = other.collection_ != null ? other.collection_.Clone() : null; + definer_ = other.definer_; + algorithm_ = other.algorithm_; + security_ = other.security_; + check_ = other.check_; + column_ = other.column_.Clone(); + stmt_ = other.stmt_ != null ? other.stmt_.Clone() : null; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ModifyView Clone() + { + return new ModifyView(this); + } + + /// Field number for the "collection" field. + public const int CollectionFieldNumber = 1; + private global::Mysqlx.Crud.Collection collection_; + /// + ///* name of the VIEW object, which should be modified + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.Collection Collection + { + get { return collection_; } + set + { + collection_ = value; + } + } + + /// Field number for the "definer" field. + public const int DefinerFieldNumber = 2; + private readonly static string DefinerDefaultValue = ""; + + private string definer_; + /// + ///* user name of the definer, + ///if the value isn't set then the definer is current user + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Definer + { + get { return definer_ ?? DefinerDefaultValue; } + set + { + definer_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "definer" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasDefiner + { + get { return definer_ != null; } + } + /// Clears the value of the "definer" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearDefiner() + { + definer_ = null; + } + + /// Field number for the "algorithm" field. + public const int AlgorithmFieldNumber = 3; + private readonly static global::Mysqlx.Crud.ViewAlgorithm AlgorithmDefaultValue = global::Mysqlx.Crud.ViewAlgorithm.Undefined; + + private global::Mysqlx.Crud.ViewAlgorithm algorithm_; + /// + ///* defined how MySQL Server processes the view + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.ViewAlgorithm Algorithm + { + get { if ((_hasBits0 & 1) != 0) { return algorithm_; } else { return AlgorithmDefaultValue; } } + set + { + _hasBits0 |= 1; + algorithm_ = value; + } + } + /// Gets whether the "algorithm" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasAlgorithm + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "algorithm" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearAlgorithm() + { + _hasBits0 &= ~1; + } + + /// Field number for the "security" field. + public const int SecurityFieldNumber = 4; + private readonly static global::Mysqlx.Crud.ViewSqlSecurity SecurityDefaultValue = global::Mysqlx.Crud.ViewSqlSecurity.Invoker; + + private global::Mysqlx.Crud.ViewSqlSecurity security_; + /// + ///* defines the security context in which the view is going be executed + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.ViewSqlSecurity Security + { + get { if ((_hasBits0 & 2) != 0) { return security_; } else { return SecurityDefaultValue; } } + set + { + _hasBits0 |= 2; + security_ = value; + } + } + /// Gets whether the "security" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasSecurity + { + get { return (_hasBits0 & 2) != 0; } + } + /// Clears the value of the "security" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearSecurity() + { + _hasBits0 &= ~2; + } + + /// Field number for the "check" field. + public const int CheckFieldNumber = 5; + private readonly static global::Mysqlx.Crud.ViewCheckOption CheckDefaultValue = global::Mysqlx.Crud.ViewCheckOption.Local; + + private global::Mysqlx.Crud.ViewCheckOption check_; + /// + ///* limits the write operations done on a VIEW + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.ViewCheckOption Check + { + get { if ((_hasBits0 & 4) != 0) { return check_; } else { return CheckDefaultValue; } } + set + { + _hasBits0 |= 4; + check_ = value; + } + } + /// Gets whether the "check" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasCheck + { + get { return (_hasBits0 & 4) != 0; } + } + /// Clears the value of the "check" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearCheck() + { + _hasBits0 &= ~4; + } + + /// Field number for the "column" field. + public const int ColumnFieldNumber = 6; + private static readonly pb::FieldCodec _repeated_column_codec + = pb::FieldCodec.ForString(50); + private readonly pbc::RepeatedField column_ = new pbc::RepeatedField(); + /// + ///* defines the list of aliases for column names specified in `stmt` + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Column + { + get { return column_; } + } + + /// Field number for the "stmt" field. + public const int StmtFieldNumber = 7; + private global::Mysqlx.Crud.Find stmt_; + /// + ///* Mysqlx.Crud.Find message from which the SELECT statement + ///is going to be build + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.Find Stmt + { + get { return stmt_; } + set + { + stmt_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as ModifyView); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(ModifyView other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (!object.Equals(Collection, other.Collection)) return false; + if (Definer != other.Definer) return false; + if (Algorithm != other.Algorithm) return false; + if (Security != other.Security) return false; + if (Check != other.Check) return false; + if (!column_.Equals(other.column_)) return false; + if (!object.Equals(Stmt, other.Stmt)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (collection_ != null) hash ^= Collection.GetHashCode(); + if (HasDefiner) hash ^= Definer.GetHashCode(); + if (HasAlgorithm) hash ^= Algorithm.GetHashCode(); + if (HasSecurity) hash ^= Security.GetHashCode(); + if (HasCheck) hash ^= Check.GetHashCode(); + hash ^= column_.GetHashCode(); + if (stmt_ != null) hash ^= Stmt.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (collection_ != null) { + output.WriteRawTag(10); + output.WriteMessage(Collection); + } + if (HasDefiner) { + output.WriteRawTag(18); + output.WriteString(Definer); + } + if (HasAlgorithm) { + output.WriteRawTag(24); + output.WriteEnum((int) Algorithm); + } + if (HasSecurity) { + output.WriteRawTag(32); + output.WriteEnum((int) Security); + } + if (HasCheck) { + output.WriteRawTag(40); + output.WriteEnum((int) Check); + } + column_.WriteTo(output, _repeated_column_codec); + if (stmt_ != null) { + output.WriteRawTag(58); + output.WriteMessage(Stmt); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (collection_ != null) + { + output.WriteRawTag(10); + output.WriteMessage(Collection); + } + if (HasDefiner) + { + output.WriteRawTag(18); + output.WriteString(Definer); + } + if (HasAlgorithm) + { + output.WriteRawTag(24); + output.WriteEnum((int)Algorithm); + } + if (HasSecurity) + { + output.WriteRawTag(32); + output.WriteEnum((int)Security); + } + if (HasCheck) + { + output.WriteRawTag(40); + output.WriteEnum((int)Check); + } + column_.WriteTo(ref output, _repeated_column_codec); + if (stmt_ != null) + { + output.WriteRawTag(58); + output.WriteMessage(Stmt); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (collection_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Collection); + } + if (HasDefiner) + { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Definer); + } + if (HasAlgorithm) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Algorithm); + } + if (HasSecurity) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Security); + } + if (HasCheck) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Check); + } + size += column_.CalculateSize(_repeated_column_codec); + if (stmt_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Stmt); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(ModifyView other) + { + if (other == null) + { + return; + } + if (other.collection_ != null) + { + if (collection_ == null) + { + Collection = new global::Mysqlx.Crud.Collection(); + } + Collection.MergeFrom(other.Collection); + } + if (other.HasDefiner) + { + Definer = other.Definer; + } + if (other.HasAlgorithm) + { + Algorithm = other.Algorithm; + } + if (other.HasSecurity) + { + Security = other.Security; + } + if (other.HasCheck) + { + Check = other.Check; + } + column_.Add(other.column_); + if (other.stmt_ != null) + { + if (stmt_ == null) + { + Stmt = new global::Mysqlx.Crud.Find(); + } + Stmt.MergeFrom(other.Stmt); + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + if (collection_ == null) { + Collection = new global::Mysqlx.Crud.Collection(); + } + input.ReadMessage(Collection); + break; + } + case 18: { + Definer = input.ReadString(); + break; + } + case 24: { + Algorithm = (global::Mysqlx.Crud.ViewAlgorithm) input.ReadEnum(); + break; + } + case 32: { + Security = (global::Mysqlx.Crud.ViewSqlSecurity) input.ReadEnum(); + break; + } + case 40: { + Check = (global::Mysqlx.Crud.ViewCheckOption) input.ReadEnum(); + break; + } + case 50: { + column_.AddEntriesFrom(input, _repeated_column_codec); + break; + } + case 58: { + if (stmt_ == null) { + Stmt = new global::Mysqlx.Crud.Find(); + } + input.ReadMessage(Stmt); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + if (collection_ == null) + { + Collection = new global::Mysqlx.Crud.Collection(); + } + input.ReadMessage(Collection); + break; + } + case 18: + { + Definer = input.ReadString(); + break; + } + case 24: + { + Algorithm = (global::Mysqlx.Crud.ViewAlgorithm)input.ReadEnum(); + break; + } + case 32: + { + Security = (global::Mysqlx.Crud.ViewSqlSecurity)input.ReadEnum(); + break; + } + case 40: + { + Check = (global::Mysqlx.Crud.ViewCheckOption)input.ReadEnum(); + break; + } + case 50: + { + column_.AddEntriesFrom(ref input, _repeated_column_codec); + break; + } + case 58: + { + if (stmt_ == null) + { + Stmt = new global::Mysqlx.Crud.Find(); + } + input.ReadMessage(Stmt); + break; + } + } + } + } +#endif + + } + + /// + ///* + ///DropView removing existing view + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class DropView : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new DropView()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[13]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public DropView() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public DropView(DropView other) : this() + { + _hasBits0 = other._hasBits0; + collection_ = other.collection_ != null ? other.collection_.Clone() : null; + ifExists_ = other.ifExists_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public DropView Clone() + { + return new DropView(this); + } + + /// Field number for the "collection" field. + public const int CollectionFieldNumber = 1; + private global::Mysqlx.Crud.Collection collection_; + /// + ///* name of the VIEW object, which should be deleted + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.Collection Collection + { + get { return collection_; } + set + { + collection_ = value; + } + } + + /// Field number for the "if_exists" field. + public const int IfExistsFieldNumber = 2; + private readonly static bool IfExistsDefaultValue = false; + + private bool ifExists_; + /// + ///* if true then suppress error when deleted view does not exists + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool IfExists + { + get { if ((_hasBits0 & 1) != 0) { return ifExists_; } else { return IfExistsDefaultValue; } } + set + { + _hasBits0 |= 1; + ifExists_ = value; + } + } + /// Gets whether the "if_exists" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasIfExists + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "if_exists" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearIfExists() + { + _hasBits0 &= ~1; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as DropView); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(DropView other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (!object.Equals(Collection, other.Collection)) return false; + if (IfExists != other.IfExists) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (collection_ != null) hash ^= Collection.GetHashCode(); + if (HasIfExists) hash ^= IfExists.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (collection_ != null) { + output.WriteRawTag(10); + output.WriteMessage(Collection); + } + if (HasIfExists) { + output.WriteRawTag(16); + output.WriteBool(IfExists); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (collection_ != null) + { + output.WriteRawTag(10); + output.WriteMessage(Collection); + } + if (HasIfExists) + { + output.WriteRawTag(16); + output.WriteBool(IfExists); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (collection_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Collection); + } + if (HasIfExists) + { + size += 1 + 1; + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(DropView other) + { + if (other == null) + { + return; + } + if (other.collection_ != null) + { + if (collection_ == null) + { + Collection = new global::Mysqlx.Crud.Collection(); + } + Collection.MergeFrom(other.Collection); + } + if (other.HasIfExists) + { + IfExists = other.IfExists; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + if (collection_ == null) { + Collection = new global::Mysqlx.Crud.Collection(); + } + input.ReadMessage(Collection); + break; + } + case 16: { + IfExists = input.ReadBool(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + if (collection_ == null) + { + Collection = new global::Mysqlx.Crud.Collection(); + } + input.ReadMessage(Collection); + break; + } + case 16: + { + IfExists = input.ReadBool(); + break; + } + } + } + } +#endif + + } + + #endregion + +} + +#endregion Designer generated code + diff --git a/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxCursor.cs b/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxCursor.cs new file mode 100644 index 000000000..235ec14bb --- /dev/null +++ b/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxCursor.cs @@ -0,0 +1,1389 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +// +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: mysqlx_cursor.proto +// +#pragma warning disable 1591, 0612, 3021, 8981 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace Mysqlx.Cursor +{ + + /// Holder for reflection information generated from mysqlx_cursor.proto + public static partial class MysqlxCursorReflection + { + + #region Descriptor + /// File descriptor for mysqlx_cursor.proto + public static pbr::FileDescriptor Descriptor + { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static MysqlxCursorReflection() + { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "ChNteXNxbHhfY3Vyc29yLnByb3RvEg1NeXNxbHguQ3Vyc29yGgxteXNxbHgu", + "cHJvdG8aFG15c3FseF9wcmVwYXJlLnByb3RvIvgBCgRPcGVuEhEKCWN1cnNv", + "cl9pZBgBIAIoDRIuCgRzdG10GAQgAigLMiAuTXlzcWx4LkN1cnNvci5PcGVu", + "Lk9uZU9mTWVzc2FnZRISCgpmZXRjaF9yb3dzGAUgASgEGpIBCgxPbmVPZk1l", + "c3NhZ2USMwoEdHlwZRgBIAIoDjIlLk15c3FseC5DdXJzb3IuT3Blbi5PbmVP", + "Zk1lc3NhZ2UuVHlwZRIwCg9wcmVwYXJlX2V4ZWN1dGUYAiABKAsyFy5NeXNx", + "bHguUHJlcGFyZS5FeGVjdXRlIhsKBFR5cGUSEwoPUFJFUEFSRV9FWEVDVVRF", + "EAA6BIjqMCsiNAoFRmV0Y2gSEQoJY3Vyc29yX2lkGAEgAigNEhIKCmZldGNo", + "X3Jvd3MYBSABKAQ6BIjqMC0iIAoFQ2xvc2USEQoJY3Vyc29yX2lkGAEgAigN", + "OgSI6jAsQhkKF2NvbS5teXNxbC5jai54LnByb3RvYnVm")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { global::Mysqlx.MysqlxReflection.Descriptor, global::Mysqlx.Prepare.MysqlxPrepareReflection.Descriptor, }, + new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Cursor.Open), global::Mysqlx.Cursor.Open.Parser, new[]{ "CursorId", "Stmt", "FetchRows" }, null, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Cursor.Open.Types.OneOfMessage), global::Mysqlx.Cursor.Open.Types.OneOfMessage.Parser, new[]{ "Type", "PrepareExecute" }, null, new[]{ typeof(global::Mysqlx.Cursor.Open.Types.OneOfMessage.Types.Type) }, null, null)}), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Cursor.Fetch), global::Mysqlx.Cursor.Fetch.Parser, new[]{ "CursorId", "FetchRows" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Cursor.Close), global::Mysqlx.Cursor.Close.Parser, new[]{ "CursorId" }, null, null, null, null) + })); + } + #endregion + + } + #region Messages + /// + ///* + ///Open a cursor + /// + ///@startuml + ///client -> server: Open + ///alt Success + ///... none or partial Resultsets or full Resultsets ... + ///client <- server: StmtExecuteOk + ///else Failure + ///client <- server: Error + ///end alt + ///@enduml + /// + ///@returns @ref Mysqlx::Ok + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Open : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Open()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Cursor.MysqlxCursorReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Open() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Open(Open other) : this() + { + _hasBits0 = other._hasBits0; + cursorId_ = other.cursorId_; + stmt_ = other.stmt_ != null ? other.stmt_.Clone() : null; + fetchRows_ = other.fetchRows_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Open Clone() + { + return new Open(this); + } + + /// Field number for the "cursor_id" field. + public const int CursorIdFieldNumber = 1; + private readonly static uint CursorIdDefaultValue = 0; + + private uint cursorId_; + /// + ///* client-side assigned cursor ID; the ID is going to represent + ///the new cursor and assigned to it the statement + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint CursorId + { + get { if ((_hasBits0 & 1) != 0) { return cursorId_; } else { return CursorIdDefaultValue; } } + set + { + _hasBits0 |= 1; + cursorId_ = value; + } + } + /// Gets whether the "cursor_id" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasCursorId + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "cursor_id" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearCursorId() + { + _hasBits0 &= ~1; + } + + /// Field number for the "stmt" field. + public const int StmtFieldNumber = 4; + private global::Mysqlx.Cursor.Open.Types.OneOfMessage stmt_; + /// + ///* statement for which the resultset is going to be iterated through by the cursor + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Cursor.Open.Types.OneOfMessage Stmt + { + get { return stmt_; } + set + { + stmt_ = value; + } + } + + /// Field number for the "fetch_rows" field. + public const int FetchRowsFieldNumber = 5; + private readonly static ulong FetchRowsDefaultValue = 0UL; + + private ulong fetchRows_; + /// + ///* number of rows that should be retrieved from sequential cursor + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ulong FetchRows + { + get { if ((_hasBits0 & 2) != 0) { return fetchRows_; } else { return FetchRowsDefaultValue; } } + set + { + _hasBits0 |= 2; + fetchRows_ = value; + } + } + /// Gets whether the "fetch_rows" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasFetchRows + { + get { return (_hasBits0 & 2) != 0; } + } + /// Clears the value of the "fetch_rows" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearFetchRows() + { + _hasBits0 &= ~2; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Open); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Open other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (CursorId != other.CursorId) return false; + if (!object.Equals(Stmt, other.Stmt)) return false; + if (FetchRows != other.FetchRows) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasCursorId) hash ^= CursorId.GetHashCode(); + if (stmt_ != null) hash ^= Stmt.GetHashCode(); + if (HasFetchRows) hash ^= FetchRows.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasCursorId) { + output.WriteRawTag(8); + output.WriteUInt32(CursorId); + } + if (stmt_ != null) { + output.WriteRawTag(34); + output.WriteMessage(Stmt); + } + if (HasFetchRows) { + output.WriteRawTag(40); + output.WriteUInt64(FetchRows); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasCursorId) + { + output.WriteRawTag(8); + output.WriteUInt32(CursorId); + } + if (stmt_ != null) + { + output.WriteRawTag(34); + output.WriteMessage(Stmt); + } + if (HasFetchRows) + { + output.WriteRawTag(40); + output.WriteUInt64(FetchRows); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasCursorId) + { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(CursorId); + } + if (stmt_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Stmt); + } + if (HasFetchRows) + { + size += 1 + pb::CodedOutputStream.ComputeUInt64Size(FetchRows); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Open other) + { + if (other == null) + { + return; + } + if (other.HasCursorId) + { + CursorId = other.CursorId; + } + if (other.stmt_ != null) + { + if (stmt_ == null) + { + Stmt = new global::Mysqlx.Cursor.Open.Types.OneOfMessage(); + } + Stmt.MergeFrom(other.Stmt); + } + if (other.HasFetchRows) + { + FetchRows = other.FetchRows; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + CursorId = input.ReadUInt32(); + break; + } + case 34: { + if (stmt_ == null) { + Stmt = new global::Mysqlx.Cursor.Open.Types.OneOfMessage(); + } + input.ReadMessage(Stmt); + break; + } + case 40: { + FetchRows = input.ReadUInt64(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: + { + CursorId = input.ReadUInt32(); + break; + } + case 34: + { + if (stmt_ == null) + { + Stmt = new global::Mysqlx.Cursor.Open.Types.OneOfMessage(); + } + input.ReadMessage(Stmt); + break; + } + case 40: + { + FetchRows = input.ReadUInt64(); + break; + } + } + } + } +#endif + + #region Nested types + /// Container for nested types declared in the Open message type. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static partial class Types + { + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class OneOfMessage : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new OneOfMessage()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Cursor.Open.Descriptor.NestedTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public OneOfMessage() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public OneOfMessage(OneOfMessage other) : this() + { + _hasBits0 = other._hasBits0; + type_ = other.type_; + prepareExecute_ = other.prepareExecute_ != null ? other.prepareExecute_.Clone() : null; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public OneOfMessage Clone() + { + return new OneOfMessage(this); + } + + /// Field number for the "type" field. + public const int TypeFieldNumber = 1; + private readonly static global::Mysqlx.Cursor.Open.Types.OneOfMessage.Types.Type TypeDefaultValue = global::Mysqlx.Cursor.Open.Types.OneOfMessage.Types.Type.PrepareExecute; + + private global::Mysqlx.Cursor.Open.Types.OneOfMessage.Types.Type type_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Cursor.Open.Types.OneOfMessage.Types.Type Type + { + get { if ((_hasBits0 & 1) != 0) { return type_; } else { return TypeDefaultValue; } } + set + { + _hasBits0 |= 1; + type_ = value; + } + } + /// Gets whether the "type" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasType + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "type" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearType() + { + _hasBits0 &= ~1; + } + + /// Field number for the "prepare_execute" field. + public const int PrepareExecuteFieldNumber = 2; + private global::Mysqlx.Prepare.Execute prepareExecute_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Prepare.Execute PrepareExecute + { + get { return prepareExecute_; } + set + { + prepareExecute_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as OneOfMessage); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(OneOfMessage other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (Type != other.Type) return false; + if (!object.Equals(PrepareExecute, other.PrepareExecute)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasType) hash ^= Type.GetHashCode(); + if (prepareExecute_ != null) hash ^= PrepareExecute.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasType) { + output.WriteRawTag(8); + output.WriteEnum((int) Type); + } + if (prepareExecute_ != null) { + output.WriteRawTag(18); + output.WriteMessage(PrepareExecute); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasType) + { + output.WriteRawTag(8); + output.WriteEnum((int)Type); + } + if (prepareExecute_ != null) + { + output.WriteRawTag(18); + output.WriteMessage(PrepareExecute); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasType) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Type); + } + if (prepareExecute_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(PrepareExecute); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(OneOfMessage other) + { + if (other == null) + { + return; + } + if (other.HasType) + { + Type = other.Type; + } + if (other.prepareExecute_ != null) + { + if (prepareExecute_ == null) + { + PrepareExecute = new global::Mysqlx.Prepare.Execute(); + } + PrepareExecute.MergeFrom(other.PrepareExecute); + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + Type = (global::Mysqlx.Cursor.Open.Types.OneOfMessage.Types.Type) input.ReadEnum(); + break; + } + case 18: { + if (prepareExecute_ == null) { + PrepareExecute = new global::Mysqlx.Prepare.Execute(); + } + input.ReadMessage(PrepareExecute); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: + { + Type = (global::Mysqlx.Cursor.Open.Types.OneOfMessage.Types.Type)input.ReadEnum(); + break; + } + case 18: + { + if (prepareExecute_ == null) + { + PrepareExecute = new global::Mysqlx.Prepare.Execute(); + } + input.ReadMessage(PrepareExecute); + break; + } + } + } + } +#endif + + #region Nested types + /// Container for nested types declared in the OneOfMessage message type. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static partial class Types + { + public enum Type + { + [pbr::OriginalName("PREPARE_EXECUTE")] PrepareExecute = 0, + } + + } + #endregion + + } + + } + #endregion + + } + + /// + ///* + ///Fetch next portion of data from a cursor + /// + ///@startuml + ///client -> server: Fetch + ///alt Success + ///... none or partial Resultsets or full Resultsets ... + ///client <- server: StmtExecuteOk + ///else + ///client <- server: Error + ///end + ///@enduml + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Fetch : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Fetch()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Cursor.MysqlxCursorReflection.Descriptor.MessageTypes[1]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Fetch() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Fetch(Fetch other) : this() + { + _hasBits0 = other._hasBits0; + cursorId_ = other.cursorId_; + fetchRows_ = other.fetchRows_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Fetch Clone() + { + return new Fetch(this); + } + + /// Field number for the "cursor_id" field. + public const int CursorIdFieldNumber = 1; + private readonly static uint CursorIdDefaultValue = 0; + + private uint cursorId_; + /// + ///* client-side assigned cursor ID; must be already open + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint CursorId + { + get { if ((_hasBits0 & 1) != 0) { return cursorId_; } else { return CursorIdDefaultValue; } } + set + { + _hasBits0 |= 1; + cursorId_ = value; + } + } + /// Gets whether the "cursor_id" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasCursorId + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "cursor_id" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearCursorId() + { + _hasBits0 &= ~1; + } + + /// Field number for the "fetch_rows" field. + public const int FetchRowsFieldNumber = 5; + private readonly static ulong FetchRowsDefaultValue = 0UL; + + private ulong fetchRows_; + /// + ///* number of rows that should be retrieved from sequential cursor + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ulong FetchRows + { + get { if ((_hasBits0 & 2) != 0) { return fetchRows_; } else { return FetchRowsDefaultValue; } } + set + { + _hasBits0 |= 2; + fetchRows_ = value; + } + } + /// Gets whether the "fetch_rows" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasFetchRows + { + get { return (_hasBits0 & 2) != 0; } + } + /// Clears the value of the "fetch_rows" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearFetchRows() + { + _hasBits0 &= ~2; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Fetch); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Fetch other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (CursorId != other.CursorId) return false; + if (FetchRows != other.FetchRows) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasCursorId) hash ^= CursorId.GetHashCode(); + if (HasFetchRows) hash ^= FetchRows.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasCursorId) { + output.WriteRawTag(8); + output.WriteUInt32(CursorId); + } + if (HasFetchRows) { + output.WriteRawTag(40); + output.WriteUInt64(FetchRows); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasCursorId) + { + output.WriteRawTag(8); + output.WriteUInt32(CursorId); + } + if (HasFetchRows) + { + output.WriteRawTag(40); + output.WriteUInt64(FetchRows); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasCursorId) + { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(CursorId); + } + if (HasFetchRows) + { + size += 1 + pb::CodedOutputStream.ComputeUInt64Size(FetchRows); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Fetch other) + { + if (other == null) + { + return; + } + if (other.HasCursorId) + { + CursorId = other.CursorId; + } + if (other.HasFetchRows) + { + FetchRows = other.FetchRows; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + CursorId = input.ReadUInt32(); + break; + } + case 40: { + FetchRows = input.ReadUInt64(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: + { + CursorId = input.ReadUInt32(); + break; + } + case 40: + { + FetchRows = input.ReadUInt64(); + break; + } + } + } + } +#endif + + } + + /// + ///* + ///Close cursor + /// + ///@startuml + ///client -> server: Close + ///alt Success + ///client <- server: Ok + ///else Failure + ///client <- server: Error + ///end + ///@enduml + /// + ///@returns @ref Mysqlx::Ok or @ref Mysqlx::Error + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Close : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Close()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Cursor.MysqlxCursorReflection.Descriptor.MessageTypes[2]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Close() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Close(Close other) : this() + { + _hasBits0 = other._hasBits0; + cursorId_ = other.cursorId_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Close Clone() + { + return new Close(this); + } + + /// Field number for the "cursor_id" field. + public const int CursorIdFieldNumber = 1; + private readonly static uint CursorIdDefaultValue = 0; + + private uint cursorId_; + /// + ///* client-side assigned cursor ID; must be allocated/open + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint CursorId + { + get { if ((_hasBits0 & 1) != 0) { return cursorId_; } else { return CursorIdDefaultValue; } } + set + { + _hasBits0 |= 1; + cursorId_ = value; + } + } + /// Gets whether the "cursor_id" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasCursorId + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "cursor_id" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearCursorId() + { + _hasBits0 &= ~1; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Close); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Close other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (CursorId != other.CursorId) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasCursorId) hash ^= CursorId.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasCursorId) { + output.WriteRawTag(8); + output.WriteUInt32(CursorId); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasCursorId) + { + output.WriteRawTag(8); + output.WriteUInt32(CursorId); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasCursorId) + { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(CursorId); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Close other) + { + if (other == null) + { + return; + } + if (other.HasCursorId) + { + CursorId = other.CursorId; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + CursorId = input.ReadUInt32(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: + { + CursorId = input.ReadUInt32(); + break; + } + } + } + } +#endif + + } + + #endregion + +} + +#endregion Designer generated code + diff --git a/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxDatatypes.cs b/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxDatatypes.cs new file mode 100644 index 000000000..bdf38ad39 --- /dev/null +++ b/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxDatatypes.cs @@ -0,0 +1,2570 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +// +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: mysqlx_datatypes.proto +// +#pragma warning disable 1591, 0612, 3021, 8981 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace Mysqlx.Datatypes +{ + + /// Holder for reflection information generated from mysqlx_datatypes.proto + public static partial class MysqlxDatatypesReflection + { + + #region Descriptor + /// File descriptor for mysqlx_datatypes.proto + public static pbr::FileDescriptor Descriptor + { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static MysqlxDatatypesReflection() + { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "ChZteXNxbHhfZGF0YXR5cGVzLnByb3RvEhBNeXNxbHguRGF0YXR5cGVzIsYD", + "CgZTY2FsYXISKwoEdHlwZRgBIAIoDjIdLk15c3FseC5EYXRhdHlwZXMuU2Nh", + "bGFyLlR5cGUSFAoMdl9zaWduZWRfaW50GAIgASgSEhYKDnZfdW5zaWduZWRf", + "aW50GAMgASgEEjEKCHZfb2N0ZXRzGAUgASgLMh8uTXlzcWx4LkRhdGF0eXBl", + "cy5TY2FsYXIuT2N0ZXRzEhAKCHZfZG91YmxlGAYgASgBEg8KB3ZfZmxvYXQY", + "ByABKAISDgoGdl9ib29sGAggASgIEjEKCHZfc3RyaW5nGAkgASgLMh8uTXlz", + "cWx4LkRhdGF0eXBlcy5TY2FsYXIuU3RyaW5nGioKBlN0cmluZxINCgV2YWx1", + "ZRgBIAIoDBIRCgljb2xsYXRpb24YAiABKAQaLQoGT2N0ZXRzEg0KBXZhbHVl", + "GAEgAigMEhQKDGNvbnRlbnRfdHlwZRgCIAEoDSJtCgRUeXBlEgoKBlZfU0lO", + "VBABEgoKBlZfVUlOVBACEgoKBlZfTlVMTBADEgwKCFZfT0NURVRTEAQSDAoI", + "Vl9ET1VCTEUQBRILCgdWX0ZMT0FUEAYSCgoGVl9CT09MEAcSDAoIVl9TVFJJ", + "TkcQCCJ9CgZPYmplY3QSMQoDZmxkGAEgAygLMiQuTXlzcWx4LkRhdGF0eXBl", + "cy5PYmplY3QuT2JqZWN0RmllbGQaQAoLT2JqZWN0RmllbGQSCwoDa2V5GAEg", + "AigJEiQKBXZhbHVlGAIgAigLMhUuTXlzcWx4LkRhdGF0eXBlcy5BbnkiLQoF", + "QXJyYXkSJAoFdmFsdWUYASADKAsyFS5NeXNxbHguRGF0YXR5cGVzLkFueSLT", + "AQoDQW55EigKBHR5cGUYASACKA4yGi5NeXNxbHguRGF0YXR5cGVzLkFueS5U", + "eXBlEigKBnNjYWxhchgCIAEoCzIYLk15c3FseC5EYXRhdHlwZXMuU2NhbGFy", + "EiUKA29iahgDIAEoCzIYLk15c3FseC5EYXRhdHlwZXMuT2JqZWN0EiYKBWFy", + "cmF5GAQgASgLMhcuTXlzcWx4LkRhdGF0eXBlcy5BcnJheSIpCgRUeXBlEgoK", + "BlNDQUxBUhABEgoKBk9CSkVDVBACEgkKBUFSUkFZEANCGQoXY29tLm15c3Fs", + "LmNqLngucHJvdG9idWY=")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { }, + new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Datatypes.Scalar), global::Mysqlx.Datatypes.Scalar.Parser, new[]{ "Type", "VSignedInt", "VUnsignedInt", "VOctets", "VDouble", "VFloat", "VBool", "VString" }, null, new[]{ typeof(global::Mysqlx.Datatypes.Scalar.Types.Type) }, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Datatypes.Scalar.Types.String), global::Mysqlx.Datatypes.Scalar.Types.String.Parser, new[]{ "Value", "Collation" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Datatypes.Scalar.Types.Octets), global::Mysqlx.Datatypes.Scalar.Types.Octets.Parser, new[]{ "Value", "ContentType" }, null, null, null, null)}), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Datatypes.Object), global::Mysqlx.Datatypes.Object.Parser, new[]{ "Fld" }, null, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Datatypes.Object.Types.ObjectField), global::Mysqlx.Datatypes.Object.Types.ObjectField.Parser, new[]{ "Key", "Value" }, null, null, null, null)}), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Datatypes.Array), global::Mysqlx.Datatypes.Array.Parser, new[]{ "Value" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Datatypes.Any), global::Mysqlx.Datatypes.Any.Parser, new[]{ "Type", "Scalar", "Obj", "Array" }, null, new[]{ typeof(global::Mysqlx.Datatypes.Any.Types.Type) }, null, null) + })); + } + #endregion + + } + #region Messages + /// + /// a scalar + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Scalar : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Scalar()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Datatypes.MysqlxDatatypesReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Scalar() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Scalar(Scalar other) : this() + { + _hasBits0 = other._hasBits0; + type_ = other.type_; + vSignedInt_ = other.vSignedInt_; + vUnsignedInt_ = other.vUnsignedInt_; + vOctets_ = other.vOctets_ != null ? other.vOctets_.Clone() : null; + vDouble_ = other.vDouble_; + vFloat_ = other.vFloat_; + vBool_ = other.vBool_; + vString_ = other.vString_ != null ? other.vString_.Clone() : null; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Scalar Clone() + { + return new Scalar(this); + } + + /// Field number for the "type" field. + public const int TypeFieldNumber = 1; + private readonly static global::Mysqlx.Datatypes.Scalar.Types.Type TypeDefaultValue = global::Mysqlx.Datatypes.Scalar.Types.Type.VSint; + + private global::Mysqlx.Datatypes.Scalar.Types.Type type_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Datatypes.Scalar.Types.Type Type + { + get { if ((_hasBits0 & 1) != 0) { return type_; } else { return TypeDefaultValue; } } + set + { + _hasBits0 |= 1; + type_ = value; + } + } + /// Gets whether the "type" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasType + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "type" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearType() + { + _hasBits0 &= ~1; + } + + /// Field number for the "v_signed_int" field. + public const int VSignedIntFieldNumber = 2; + private readonly static long VSignedIntDefaultValue = 0L; + + private long vSignedInt_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public long VSignedInt + { + get { if ((_hasBits0 & 2) != 0) { return vSignedInt_; } else { return VSignedIntDefaultValue; } } + set + { + _hasBits0 |= 2; + vSignedInt_ = value; + } + } + /// Gets whether the "v_signed_int" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasVSignedInt + { + get { return (_hasBits0 & 2) != 0; } + } + /// Clears the value of the "v_signed_int" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearVSignedInt() + { + _hasBits0 &= ~2; + } + + /// Field number for the "v_unsigned_int" field. + public const int VUnsignedIntFieldNumber = 3; + private readonly static ulong VUnsignedIntDefaultValue = 0UL; + + private ulong vUnsignedInt_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ulong VUnsignedInt + { + get { if ((_hasBits0 & 4) != 0) { return vUnsignedInt_; } else { return VUnsignedIntDefaultValue; } } + set + { + _hasBits0 |= 4; + vUnsignedInt_ = value; + } + } + /// Gets whether the "v_unsigned_int" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasVUnsignedInt + { + get { return (_hasBits0 & 4) != 0; } + } + /// Clears the value of the "v_unsigned_int" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearVUnsignedInt() + { + _hasBits0 &= ~4; + } + + /// Field number for the "v_octets" field. + public const int VOctetsFieldNumber = 5; + private global::Mysqlx.Datatypes.Scalar.Types.Octets vOctets_; + /// + /// 4 is unused, was Null which doesn't have a storage anymore + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Datatypes.Scalar.Types.Octets VOctets + { + get { return vOctets_; } + set + { + vOctets_ = value; + } + } + + /// Field number for the "v_double" field. + public const int VDoubleFieldNumber = 6; + private readonly static double VDoubleDefaultValue = 0D; + + private double vDouble_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public double VDouble + { + get { if ((_hasBits0 & 8) != 0) { return vDouble_; } else { return VDoubleDefaultValue; } } + set + { + _hasBits0 |= 8; + vDouble_ = value; + } + } + /// Gets whether the "v_double" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasVDouble + { + get { return (_hasBits0 & 8) != 0; } + } + /// Clears the value of the "v_double" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearVDouble() + { + _hasBits0 &= ~8; + } + + /// Field number for the "v_float" field. + public const int VFloatFieldNumber = 7; + private readonly static float VFloatDefaultValue = 0F; + + private float vFloat_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public float VFloat + { + get { if ((_hasBits0 & 16) != 0) { return vFloat_; } else { return VFloatDefaultValue; } } + set + { + _hasBits0 |= 16; + vFloat_ = value; + } + } + /// Gets whether the "v_float" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasVFloat + { + get { return (_hasBits0 & 16) != 0; } + } + /// Clears the value of the "v_float" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearVFloat() + { + _hasBits0 &= ~16; + } + + /// Field number for the "v_bool" field. + public const int VBoolFieldNumber = 8; + private readonly static bool VBoolDefaultValue = false; + + private bool vBool_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool VBool + { + get { if ((_hasBits0 & 32) != 0) { return vBool_; } else { return VBoolDefaultValue; } } + set + { + _hasBits0 |= 32; + vBool_ = value; + } + } + /// Gets whether the "v_bool" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasVBool + { + get { return (_hasBits0 & 32) != 0; } + } + /// Clears the value of the "v_bool" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearVBool() + { + _hasBits0 &= ~32; + } + + /// Field number for the "v_string" field. + public const int VStringFieldNumber = 9; + private global::Mysqlx.Datatypes.Scalar.Types.String vString_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Datatypes.Scalar.Types.String VString + { + get { return vString_; } + set + { + vString_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Scalar); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Scalar other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (Type != other.Type) return false; + if (VSignedInt != other.VSignedInt) return false; + if (VUnsignedInt != other.VUnsignedInt) return false; + if (!object.Equals(VOctets, other.VOctets)) return false; + if (!pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.Equals(VDouble, other.VDouble)) return false; + if (!pbc::ProtobufEqualityComparers.BitwiseSingleEqualityComparer.Equals(VFloat, other.VFloat)) return false; + if (VBool != other.VBool) return false; + if (!object.Equals(VString, other.VString)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasType) hash ^= Type.GetHashCode(); + if (HasVSignedInt) hash ^= VSignedInt.GetHashCode(); + if (HasVUnsignedInt) hash ^= VUnsignedInt.GetHashCode(); + if (vOctets_ != null) hash ^= VOctets.GetHashCode(); + if (HasVDouble) hash ^= pbc::ProtobufEqualityComparers.BitwiseDoubleEqualityComparer.GetHashCode(VDouble); + if (HasVFloat) hash ^= pbc::ProtobufEqualityComparers.BitwiseSingleEqualityComparer.GetHashCode(VFloat); + if (HasVBool) hash ^= VBool.GetHashCode(); + if (vString_ != null) hash ^= VString.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasType) { + output.WriteRawTag(8); + output.WriteEnum((int) Type); + } + if (HasVSignedInt) { + output.WriteRawTag(16); + output.WriteSInt64(VSignedInt); + } + if (HasVUnsignedInt) { + output.WriteRawTag(24); + output.WriteUInt64(VUnsignedInt); + } + if (vOctets_ != null) { + output.WriteRawTag(42); + output.WriteMessage(VOctets); + } + if (HasVDouble) { + output.WriteRawTag(49); + output.WriteDouble(VDouble); + } + if (HasVFloat) { + output.WriteRawTag(61); + output.WriteFloat(VFloat); + } + if (HasVBool) { + output.WriteRawTag(64); + output.WriteBool(VBool); + } + if (vString_ != null) { + output.WriteRawTag(74); + output.WriteMessage(VString); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasType) + { + output.WriteRawTag(8); + output.WriteEnum((int)Type); + } + if (HasVSignedInt) + { + output.WriteRawTag(16); + output.WriteSInt64(VSignedInt); + } + if (HasVUnsignedInt) + { + output.WriteRawTag(24); + output.WriteUInt64(VUnsignedInt); + } + if (vOctets_ != null) + { + output.WriteRawTag(42); + output.WriteMessage(VOctets); + } + if (HasVDouble) + { + output.WriteRawTag(49); + output.WriteDouble(VDouble); + } + if (HasVFloat) + { + output.WriteRawTag(61); + output.WriteFloat(VFloat); + } + if (HasVBool) + { + output.WriteRawTag(64); + output.WriteBool(VBool); + } + if (vString_ != null) + { + output.WriteRawTag(74); + output.WriteMessage(VString); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasType) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Type); + } + if (HasVSignedInt) + { + size += 1 + pb::CodedOutputStream.ComputeSInt64Size(VSignedInt); + } + if (HasVUnsignedInt) + { + size += 1 + pb::CodedOutputStream.ComputeUInt64Size(VUnsignedInt); + } + if (vOctets_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(VOctets); + } + if (HasVDouble) + { + size += 1 + 8; + } + if (HasVFloat) + { + size += 1 + 4; + } + if (HasVBool) + { + size += 1 + 1; + } + if (vString_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(VString); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Scalar other) + { + if (other == null) + { + return; + } + if (other.HasType) + { + Type = other.Type; + } + if (other.HasVSignedInt) + { + VSignedInt = other.VSignedInt; + } + if (other.HasVUnsignedInt) + { + VUnsignedInt = other.VUnsignedInt; + } + if (other.vOctets_ != null) + { + if (vOctets_ == null) + { + VOctets = new global::Mysqlx.Datatypes.Scalar.Types.Octets(); + } + VOctets.MergeFrom(other.VOctets); + } + if (other.HasVDouble) + { + VDouble = other.VDouble; + } + if (other.HasVFloat) + { + VFloat = other.VFloat; + } + if (other.HasVBool) + { + VBool = other.VBool; + } + if (other.vString_ != null) + { + if (vString_ == null) + { + VString = new global::Mysqlx.Datatypes.Scalar.Types.String(); + } + VString.MergeFrom(other.VString); + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + Type = (global::Mysqlx.Datatypes.Scalar.Types.Type) input.ReadEnum(); + break; + } + case 16: { + VSignedInt = input.ReadSInt64(); + break; + } + case 24: { + VUnsignedInt = input.ReadUInt64(); + break; + } + case 42: { + if (vOctets_ == null) { + VOctets = new global::Mysqlx.Datatypes.Scalar.Types.Octets(); + } + input.ReadMessage(VOctets); + break; + } + case 49: { + VDouble = input.ReadDouble(); + break; + } + case 61: { + VFloat = input.ReadFloat(); + break; + } + case 64: { + VBool = input.ReadBool(); + break; + } + case 74: { + if (vString_ == null) { + VString = new global::Mysqlx.Datatypes.Scalar.Types.String(); + } + input.ReadMessage(VString); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: + { + Type = (global::Mysqlx.Datatypes.Scalar.Types.Type)input.ReadEnum(); + break; + } + case 16: + { + VSignedInt = input.ReadSInt64(); + break; + } + case 24: + { + VUnsignedInt = input.ReadUInt64(); + break; + } + case 42: + { + if (vOctets_ == null) + { + VOctets = new global::Mysqlx.Datatypes.Scalar.Types.Octets(); + } + input.ReadMessage(VOctets); + break; + } + case 49: + { + VDouble = input.ReadDouble(); + break; + } + case 61: + { + VFloat = input.ReadFloat(); + break; + } + case 64: + { + VBool = input.ReadBool(); + break; + } + case 74: + { + if (vString_ == null) + { + VString = new global::Mysqlx.Datatypes.Scalar.Types.String(); + } + input.ReadMessage(VString); + break; + } + } + } + } +#endif + + #region Nested types + /// Container for nested types declared in the Scalar message type. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static partial class Types + { + public enum Type + { + [pbr::OriginalName("V_SINT")] VSint = 1, + [pbr::OriginalName("V_UINT")] VUint = 2, + [pbr::OriginalName("V_NULL")] VNull = 3, + [pbr::OriginalName("V_OCTETS")] VOctets = 4, + [pbr::OriginalName("V_DOUBLE")] VDouble = 5, + [pbr::OriginalName("V_FLOAT")] VFloat = 6, + [pbr::OriginalName("V_BOOL")] VBool = 7, + [pbr::OriginalName("V_STRING")] VString = 8, + } + + /// + ///* a string with a charset/collation + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class String : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new String()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Datatypes.Scalar.Descriptor.NestedTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public String() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public String(String other) : this() + { + _hasBits0 = other._hasBits0; + value_ = other.value_; + collation_ = other.collation_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public String Clone() + { + return new String(this); + } + + /// Field number for the "value" field. + public const int ValueFieldNumber = 1; + private readonly static pb::ByteString ValueDefaultValue = pb::ByteString.Empty; + + private pb::ByteString value_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pb::ByteString Value + { + get { return value_ ?? ValueDefaultValue; } + set + { + value_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "value" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasValue + { + get { return value_ != null; } + } + /// Clears the value of the "value" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearValue() + { + value_ = null; + } + + /// Field number for the "collation" field. + public const int CollationFieldNumber = 2; + private readonly static ulong CollationDefaultValue = 0UL; + + private ulong collation_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ulong Collation + { + get { if ((_hasBits0 & 1) != 0) { return collation_; } else { return CollationDefaultValue; } } + set + { + _hasBits0 |= 1; + collation_ = value; + } + } + /// Gets whether the "collation" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasCollation + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "collation" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearCollation() + { + _hasBits0 &= ~1; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as String); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(String other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (Value != other.Value) return false; + if (Collation != other.Collation) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasValue) hash ^= Value.GetHashCode(); + if (HasCollation) hash ^= Collation.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasValue) { + output.WriteRawTag(10); + output.WriteBytes(Value); + } + if (HasCollation) { + output.WriteRawTag(16); + output.WriteUInt64(Collation); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasValue) + { + output.WriteRawTag(10); + output.WriteBytes(Value); + } + if (HasCollation) + { + output.WriteRawTag(16); + output.WriteUInt64(Collation); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasValue) + { + size += 1 + pb::CodedOutputStream.ComputeBytesSize(Value); + } + if (HasCollation) + { + size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Collation); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(String other) + { + if (other == null) + { + return; + } + if (other.HasValue) + { + Value = other.Value; + } + if (other.HasCollation) + { + Collation = other.Collation; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + Value = input.ReadBytes(); + break; + } + case 16: { + Collation = input.ReadUInt64(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + Value = input.ReadBytes(); + break; + } + case 16: + { + Collation = input.ReadUInt64(); + break; + } + } + } + } +#endif + + } + + /// + ///* an opaque octet sequence, with an optional content_type + ///See @ref Mysqlx::Resultset::ContentType_BYTES for list of known values. + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Octets : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Octets()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Datatypes.Scalar.Descriptor.NestedTypes[1]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Octets() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Octets(Octets other) : this() + { + _hasBits0 = other._hasBits0; + value_ = other.value_; + contentType_ = other.contentType_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Octets Clone() + { + return new Octets(this); + } + + /// Field number for the "value" field. + public const int ValueFieldNumber = 1; + private readonly static pb::ByteString ValueDefaultValue = pb::ByteString.Empty; + + private pb::ByteString value_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pb::ByteString Value + { + get { return value_ ?? ValueDefaultValue; } + set + { + value_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "value" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasValue + { + get { return value_ != null; } + } + /// Clears the value of the "value" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearValue() + { + value_ = null; + } + + /// Field number for the "content_type" field. + public const int ContentTypeFieldNumber = 2; + private readonly static uint ContentTypeDefaultValue = 0; + + private uint contentType_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint ContentType + { + get { if ((_hasBits0 & 1) != 0) { return contentType_; } else { return ContentTypeDefaultValue; } } + set + { + _hasBits0 |= 1; + contentType_ = value; + } + } + /// Gets whether the "content_type" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasContentType + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "content_type" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearContentType() + { + _hasBits0 &= ~1; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Octets); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Octets other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (Value != other.Value) return false; + if (ContentType != other.ContentType) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasValue) hash ^= Value.GetHashCode(); + if (HasContentType) hash ^= ContentType.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasValue) { + output.WriteRawTag(10); + output.WriteBytes(Value); + } + if (HasContentType) { + output.WriteRawTag(16); + output.WriteUInt32(ContentType); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasValue) + { + output.WriteRawTag(10); + output.WriteBytes(Value); + } + if (HasContentType) + { + output.WriteRawTag(16); + output.WriteUInt32(ContentType); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasValue) + { + size += 1 + pb::CodedOutputStream.ComputeBytesSize(Value); + } + if (HasContentType) + { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(ContentType); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Octets other) + { + if (other == null) + { + return; + } + if (other.HasValue) + { + Value = other.Value; + } + if (other.HasContentType) + { + ContentType = other.ContentType; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + Value = input.ReadBytes(); + break; + } + case 16: { + ContentType = input.ReadUInt32(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + Value = input.ReadBytes(); + break; + } + case 16: + { + ContentType = input.ReadUInt32(); + break; + } + } + } + } +#endif + + } + + } + #endregion + + } + + /// + ///* + ///An object + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Object : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Object()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Datatypes.MysqlxDatatypesReflection.Descriptor.MessageTypes[1]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Object() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Object(Object other) : this() + { + fld_ = other.fld_.Clone(); + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Object Clone() + { + return new Object(this); + } + + /// Field number for the "fld" field. + public const int FldFieldNumber = 1; + private static readonly pb::FieldCodec _repeated_fld_codec + = pb::FieldCodec.ForMessage(10, global::Mysqlx.Datatypes.Object.Types.ObjectField.Parser); + private readonly pbc::RepeatedField fld_ = new pbc::RepeatedField(); + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Fld + { + get { return fld_; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Object); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Object other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (!fld_.Equals(other.fld_)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + hash ^= fld_.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + fld_.WriteTo(output, _repeated_fld_codec); + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + fld_.WriteTo(ref output, _repeated_fld_codec); + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + size += fld_.CalculateSize(_repeated_fld_codec); + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Object other) + { + if (other == null) + { + return; + } + fld_.Add(other.fld_); + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + fld_.AddEntriesFrom(input, _repeated_fld_codec); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + fld_.AddEntriesFrom(ref input, _repeated_fld_codec); + break; + } + } + } + } +#endif + + #region Nested types + /// Container for nested types declared in the Object message type. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static partial class Types + { + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class ObjectField : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new ObjectField()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Datatypes.Object.Descriptor.NestedTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ObjectField() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ObjectField(ObjectField other) : this() + { + key_ = other.key_; + value_ = other.value_ != null ? other.value_.Clone() : null; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ObjectField Clone() + { + return new ObjectField(this); + } + + /// Field number for the "key" field. + public const int KeyFieldNumber = 1; + private readonly static string KeyDefaultValue = ""; + + private string key_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Key + { + get { return key_ ?? KeyDefaultValue; } + set + { + key_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "key" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasKey + { + get { return key_ != null; } + } + /// Clears the value of the "key" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearKey() + { + key_ = null; + } + + /// Field number for the "value" field. + public const int ValueFieldNumber = 2; + private global::Mysqlx.Datatypes.Any value_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Datatypes.Any Value + { + get { return value_; } + set + { + value_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as ObjectField); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(ObjectField other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (Key != other.Key) return false; + if (!object.Equals(Value, other.Value)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasKey) hash ^= Key.GetHashCode(); + if (value_ != null) hash ^= Value.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasKey) { + output.WriteRawTag(10); + output.WriteString(Key); + } + if (value_ != null) { + output.WriteRawTag(18); + output.WriteMessage(Value); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasKey) + { + output.WriteRawTag(10); + output.WriteString(Key); + } + if (value_ != null) + { + output.WriteRawTag(18); + output.WriteMessage(Value); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasKey) + { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Key); + } + if (value_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Value); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(ObjectField other) + { + if (other == null) + { + return; + } + if (other.HasKey) + { + Key = other.Key; + } + if (other.value_ != null) + { + if (value_ == null) + { + Value = new global::Mysqlx.Datatypes.Any(); + } + Value.MergeFrom(other.Value); + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + Key = input.ReadString(); + break; + } + case 18: { + if (value_ == null) { + Value = new global::Mysqlx.Datatypes.Any(); + } + input.ReadMessage(Value); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + Key = input.ReadString(); + break; + } + case 18: + { + if (value_ == null) + { + Value = new global::Mysqlx.Datatypes.Any(); + } + input.ReadMessage(Value); + break; + } + } + } + } +#endif + + } + + } + #endregion + + } + + /// + ///* + ///An Array + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Array : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Array()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Datatypes.MysqlxDatatypesReflection.Descriptor.MessageTypes[2]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Array() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Array(Array other) : this() + { + value_ = other.value_.Clone(); + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Array Clone() + { + return new Array(this); + } + + /// Field number for the "value" field. + public const int ValueFieldNumber = 1; + private static readonly pb::FieldCodec _repeated_value_codec + = pb::FieldCodec.ForMessage(10, global::Mysqlx.Datatypes.Any.Parser); + private readonly pbc::RepeatedField value_ = new pbc::RepeatedField(); + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Value + { + get { return value_; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Array); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Array other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (!value_.Equals(other.value_)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + hash ^= value_.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + value_.WriteTo(output, _repeated_value_codec); + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + value_.WriteTo(ref output, _repeated_value_codec); + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + size += value_.CalculateSize(_repeated_value_codec); + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Array other) + { + if (other == null) + { + return; + } + value_.Add(other.value_); + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + value_.AddEntriesFrom(input, _repeated_value_codec); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + value_.AddEntriesFrom(ref input, _repeated_value_codec); + break; + } + } + } + } +#endif + + } + + /// + ///* + ///A helper to allow all field types + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Any : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Any()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Datatypes.MysqlxDatatypesReflection.Descriptor.MessageTypes[3]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Any() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Any(Any other) : this() + { + _hasBits0 = other._hasBits0; + type_ = other.type_; + scalar_ = other.scalar_ != null ? other.scalar_.Clone() : null; + obj_ = other.obj_ != null ? other.obj_.Clone() : null; + array_ = other.array_ != null ? other.array_.Clone() : null; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Any Clone() + { + return new Any(this); + } + + /// Field number for the "type" field. + public const int TypeFieldNumber = 1; + private readonly static global::Mysqlx.Datatypes.Any.Types.Type TypeDefaultValue = global::Mysqlx.Datatypes.Any.Types.Type.Scalar; + + private global::Mysqlx.Datatypes.Any.Types.Type type_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Datatypes.Any.Types.Type Type + { + get { if ((_hasBits0 & 1) != 0) { return type_; } else { return TypeDefaultValue; } } + set + { + _hasBits0 |= 1; + type_ = value; + } + } + /// Gets whether the "type" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasType + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "type" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearType() + { + _hasBits0 &= ~1; + } + + /// Field number for the "scalar" field. + public const int ScalarFieldNumber = 2; + private global::Mysqlx.Datatypes.Scalar scalar_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Datatypes.Scalar Scalar + { + get { return scalar_; } + set + { + scalar_ = value; + } + } + + /// Field number for the "obj" field. + public const int ObjFieldNumber = 3; + private global::Mysqlx.Datatypes.Object obj_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Datatypes.Object Obj + { + get { return obj_; } + set + { + obj_ = value; + } + } + + /// Field number for the "array" field. + public const int ArrayFieldNumber = 4; + private global::Mysqlx.Datatypes.Array array_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Datatypes.Array Array + { + get { return array_; } + set + { + array_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Any); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Any other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (Type != other.Type) return false; + if (!object.Equals(Scalar, other.Scalar)) return false; + if (!object.Equals(Obj, other.Obj)) return false; + if (!object.Equals(Array, other.Array)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasType) hash ^= Type.GetHashCode(); + if (scalar_ != null) hash ^= Scalar.GetHashCode(); + if (obj_ != null) hash ^= Obj.GetHashCode(); + if (array_ != null) hash ^= Array.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasType) { + output.WriteRawTag(8); + output.WriteEnum((int) Type); + } + if (scalar_ != null) { + output.WriteRawTag(18); + output.WriteMessage(Scalar); + } + if (obj_ != null) { + output.WriteRawTag(26); + output.WriteMessage(Obj); + } + if (array_ != null) { + output.WriteRawTag(34); + output.WriteMessage(Array); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasType) + { + output.WriteRawTag(8); + output.WriteEnum((int)Type); + } + if (scalar_ != null) + { + output.WriteRawTag(18); + output.WriteMessage(Scalar); + } + if (obj_ != null) + { + output.WriteRawTag(26); + output.WriteMessage(Obj); + } + if (array_ != null) + { + output.WriteRawTag(34); + output.WriteMessage(Array); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasType) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Type); + } + if (scalar_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Scalar); + } + if (obj_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Obj); + } + if (array_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Array); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Any other) + { + if (other == null) + { + return; + } + if (other.HasType) + { + Type = other.Type; + } + if (other.scalar_ != null) + { + if (scalar_ == null) + { + Scalar = new global::Mysqlx.Datatypes.Scalar(); + } + Scalar.MergeFrom(other.Scalar); + } + if (other.obj_ != null) + { + if (obj_ == null) + { + Obj = new global::Mysqlx.Datatypes.Object(); + } + Obj.MergeFrom(other.Obj); + } + if (other.array_ != null) + { + if (array_ == null) + { + Array = new global::Mysqlx.Datatypes.Array(); + } + Array.MergeFrom(other.Array); + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + Type = (global::Mysqlx.Datatypes.Any.Types.Type) input.ReadEnum(); + break; + } + case 18: { + if (scalar_ == null) { + Scalar = new global::Mysqlx.Datatypes.Scalar(); + } + input.ReadMessage(Scalar); + break; + } + case 26: { + if (obj_ == null) { + Obj = new global::Mysqlx.Datatypes.Object(); + } + input.ReadMessage(Obj); + break; + } + case 34: { + if (array_ == null) { + Array = new global::Mysqlx.Datatypes.Array(); + } + input.ReadMessage(Array); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: + { + Type = (global::Mysqlx.Datatypes.Any.Types.Type)input.ReadEnum(); + break; + } + case 18: + { + if (scalar_ == null) + { + Scalar = new global::Mysqlx.Datatypes.Scalar(); + } + input.ReadMessage(Scalar); + break; + } + case 26: + { + if (obj_ == null) + { + Obj = new global::Mysqlx.Datatypes.Object(); + } + input.ReadMessage(Obj); + break; + } + case 34: + { + if (array_ == null) + { + Array = new global::Mysqlx.Datatypes.Array(); + } + input.ReadMessage(Array); + break; + } + } + } + } +#endif + + #region Nested types + /// Container for nested types declared in the Any message type. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static partial class Types + { + public enum Type + { + [pbr::OriginalName("SCALAR")] Scalar = 1, + [pbr::OriginalName("OBJECT")] Object = 2, + [pbr::OriginalName("ARRAY")] Array = 3, + } + + } + #endregion + + } + + #endregion + +} + +#endregion Designer generated code + diff --git a/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxExpect.cs b/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxExpect.cs new file mode 100644 index 000000000..0c92b140e --- /dev/null +++ b/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxExpect.cs @@ -0,0 +1,991 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +// +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: mysqlx_expect.proto +// +#pragma warning disable 1591, 0612, 3021, 8981 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace Mysqlx.Expect +{ + + /// Holder for reflection information generated from mysqlx_expect.proto + public static partial class MysqlxExpectReflection + { + + #region Descriptor + /// File descriptor for mysqlx_expect.proto + public static pbr::FileDescriptor Descriptor + { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static MysqlxExpectReflection() + { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "ChNteXNxbHhfZXhwZWN0LnByb3RvEg1NeXNxbHguRXhwZWN0GgxteXNxbHgu", + "cHJvdG8i1gMKBE9wZW4SQgoCb3AYASABKA4yIC5NeXNxbHguRXhwZWN0Lk9w", + "ZW4uQ3R4T3BlcmF0aW9uOhRFWFBFQ1RfQ1RYX0NPUFlfUFJFVhIrCgRjb25k", + "GAIgAygLMh0uTXlzcWx4LkV4cGVjdC5PcGVuLkNvbmRpdGlvbhqWAgoJQ29u", + "ZGl0aW9uEhUKDWNvbmRpdGlvbl9rZXkYASACKA0SFwoPY29uZGl0aW9uX3Zh", + "bHVlGAIgASgMEksKAm9wGAMgASgOMjAuTXlzcWx4LkV4cGVjdC5PcGVuLkNv", + "bmRpdGlvbi5Db25kaXRpb25PcGVyYXRpb246DUVYUEVDVF9PUF9TRVQiTgoD", + "S2V5EhMKD0VYUEVDVF9OT19FUlJPUhABEhYKEkVYUEVDVF9GSUVMRF9FWElT", + "VBACEhoKFkVYUEVDVF9ET0NJRF9HRU5FUkFURUQQAyI8ChJDb25kaXRpb25P", + "cGVyYXRpb24SEQoNRVhQRUNUX09QX1NFVBAAEhMKD0VYUEVDVF9PUF9VTlNF", + "VBABIj4KDEN0eE9wZXJhdGlvbhIYChRFWFBFQ1RfQ1RYX0NPUFlfUFJFVhAA", + "EhQKEEVYUEVDVF9DVFhfRU1QVFkQAToEiOowGCINCgVDbG9zZToEiOowGUIZ", + "Chdjb20ubXlzcWwuY2oueC5wcm90b2J1Zg==")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { global::Mysqlx.MysqlxReflection.Descriptor, }, + new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Expect.Open), global::Mysqlx.Expect.Open.Parser, new[]{ "Op", "Cond" }, null, new[]{ typeof(global::Mysqlx.Expect.Open.Types.CtxOperation) }, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Expect.Open.Types.Condition), global::Mysqlx.Expect.Open.Types.Condition.Parser, new[]{ "ConditionKey", "ConditionValue", "Op" }, null, new[]{ typeof(global::Mysqlx.Expect.Open.Types.Condition.Types.Key), typeof(global::Mysqlx.Expect.Open.Types.Condition.Types.ConditionOperation) }, null, null)}), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Expect.Close), global::Mysqlx.Expect.Close.Parser, null, null, null, null, null) + })); + } + #endregion + + } + #region Messages + /// + ///* + ///Open an Expect block and set/unset the conditions that have to + ///be fulfilled. + /// + ///If any of the conditions fail, all enclosed messages will fail + ///with a ``Mysqlx::Error`` message. + /// + ///@returns @ref Mysqlx::Ok on success, @ref Mysqlx::Error on error + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Open : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Open()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Expect.MysqlxExpectReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Open() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Open(Open other) : this() + { + _hasBits0 = other._hasBits0; + op_ = other.op_; + cond_ = other.cond_.Clone(); + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Open Clone() + { + return new Open(this); + } + + /// Field number for the "op" field. + public const int OpFieldNumber = 1; + private readonly static global::Mysqlx.Expect.Open.Types.CtxOperation OpDefaultValue = global::Mysqlx.Expect.Open.Types.CtxOperation.ExpectCtxCopyPrev; + + private global::Mysqlx.Expect.Open.Types.CtxOperation op_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Expect.Open.Types.CtxOperation Op + { + get { if ((_hasBits0 & 1) != 0) { return op_; } else { return OpDefaultValue; } } + set + { + _hasBits0 |= 1; + op_ = value; + } + } + /// Gets whether the "op" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasOp + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "op" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearOp() + { + _hasBits0 &= ~1; + } + + /// Field number for the "cond" field. + public const int CondFieldNumber = 2; + private static readonly pb::FieldCodec _repeated_cond_codec + = pb::FieldCodec.ForMessage(18, global::Mysqlx.Expect.Open.Types.Condition.Parser); + private readonly pbc::RepeatedField cond_ = new pbc::RepeatedField(); + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Cond + { + get { return cond_; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Open); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Open other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (Op != other.Op) return false; + if (!cond_.Equals(other.cond_)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasOp) hash ^= Op.GetHashCode(); + hash ^= cond_.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasOp) { + output.WriteRawTag(8); + output.WriteEnum((int) Op); + } + cond_.WriteTo(output, _repeated_cond_codec); + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasOp) + { + output.WriteRawTag(8); + output.WriteEnum((int)Op); + } + cond_.WriteTo(ref output, _repeated_cond_codec); + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasOp) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Op); + } + size += cond_.CalculateSize(_repeated_cond_codec); + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Open other) + { + if (other == null) + { + return; + } + if (other.HasOp) + { + Op = other.Op; + } + cond_.Add(other.cond_); + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + Op = (global::Mysqlx.Expect.Open.Types.CtxOperation) input.ReadEnum(); + break; + } + case 18: { + cond_.AddEntriesFrom(input, _repeated_cond_codec); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: + { + Op = (global::Mysqlx.Expect.Open.Types.CtxOperation)input.ReadEnum(); + break; + } + case 18: + { + cond_.AddEntriesFrom(ref input, _repeated_cond_codec); + break; + } + } + } + } +#endif + + #region Nested types + /// Container for nested types declared in the Open message type. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static partial class Types + { + public enum CtxOperation + { + /// + ///* copy the operations from the parent Expect-block + /// + [pbr::OriginalName("EXPECT_CTX_COPY_PREV")] ExpectCtxCopyPrev = 0, + /// + ///* start with a empty set of operations + /// + [pbr::OriginalName("EXPECT_CTX_EMPTY")] ExpectCtxEmpty = 1, + } + + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Condition : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Condition()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Expect.Open.Descriptor.NestedTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Condition() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Condition(Condition other) : this() + { + _hasBits0 = other._hasBits0; + conditionKey_ = other.conditionKey_; + conditionValue_ = other.conditionValue_; + op_ = other.op_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Condition Clone() + { + return new Condition(this); + } + + /// Field number for the "condition_key" field. + public const int ConditionKeyFieldNumber = 1; + private readonly static uint ConditionKeyDefaultValue = 0; + + private uint conditionKey_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint ConditionKey + { + get { if ((_hasBits0 & 1) != 0) { return conditionKey_; } else { return ConditionKeyDefaultValue; } } + set + { + _hasBits0 |= 1; + conditionKey_ = value; + } + } + /// Gets whether the "condition_key" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasConditionKey + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "condition_key" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearConditionKey() + { + _hasBits0 &= ~1; + } + + /// Field number for the "condition_value" field. + public const int ConditionValueFieldNumber = 2; + private readonly static pb::ByteString ConditionValueDefaultValue = pb::ByteString.Empty; + + private pb::ByteString conditionValue_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pb::ByteString ConditionValue + { + get { return conditionValue_ ?? ConditionValueDefaultValue; } + set + { + conditionValue_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "condition_value" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasConditionValue + { + get { return conditionValue_ != null; } + } + /// Clears the value of the "condition_value" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearConditionValue() + { + conditionValue_ = null; + } + + /// Field number for the "op" field. + public const int OpFieldNumber = 3; + private readonly static global::Mysqlx.Expect.Open.Types.Condition.Types.ConditionOperation OpDefaultValue = global::Mysqlx.Expect.Open.Types.Condition.Types.ConditionOperation.ExpectOpSet; + + private global::Mysqlx.Expect.Open.Types.Condition.Types.ConditionOperation op_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Expect.Open.Types.Condition.Types.ConditionOperation Op + { + get { if ((_hasBits0 & 2) != 0) { return op_; } else { return OpDefaultValue; } } + set + { + _hasBits0 |= 2; + op_ = value; + } + } + /// Gets whether the "op" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasOp + { + get { return (_hasBits0 & 2) != 0; } + } + /// Clears the value of the "op" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearOp() + { + _hasBits0 &= ~2; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Condition); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Condition other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (ConditionKey != other.ConditionKey) return false; + if (ConditionValue != other.ConditionValue) return false; + if (Op != other.Op) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasConditionKey) hash ^= ConditionKey.GetHashCode(); + if (HasConditionValue) hash ^= ConditionValue.GetHashCode(); + if (HasOp) hash ^= Op.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasConditionKey) { + output.WriteRawTag(8); + output.WriteUInt32(ConditionKey); + } + if (HasConditionValue) { + output.WriteRawTag(18); + output.WriteBytes(ConditionValue); + } + if (HasOp) { + output.WriteRawTag(24); + output.WriteEnum((int) Op); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasConditionKey) + { + output.WriteRawTag(8); + output.WriteUInt32(ConditionKey); + } + if (HasConditionValue) + { + output.WriteRawTag(18); + output.WriteBytes(ConditionValue); + } + if (HasOp) + { + output.WriteRawTag(24); + output.WriteEnum((int)Op); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasConditionKey) + { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(ConditionKey); + } + if (HasConditionValue) + { + size += 1 + pb::CodedOutputStream.ComputeBytesSize(ConditionValue); + } + if (HasOp) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Op); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Condition other) + { + if (other == null) + { + return; + } + if (other.HasConditionKey) + { + ConditionKey = other.ConditionKey; + } + if (other.HasConditionValue) + { + ConditionValue = other.ConditionValue; + } + if (other.HasOp) + { + Op = other.Op; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + ConditionKey = input.ReadUInt32(); + break; + } + case 18: { + ConditionValue = input.ReadBytes(); + break; + } + case 24: { + Op = (global::Mysqlx.Expect.Open.Types.Condition.Types.ConditionOperation) input.ReadEnum(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: + { + ConditionKey = input.ReadUInt32(); + break; + } + case 18: + { + ConditionValue = input.ReadBytes(); + break; + } + case 24: + { + Op = (global::Mysqlx.Expect.Open.Types.Condition.Types.ConditionOperation)input.ReadEnum(); + break; + } + } + } + } +#endif + + #region Nested types + /// Container for nested types declared in the Condition message type. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static partial class Types + { + public enum Key + { + /// + ///* Change error propagation behaviour + /// + [pbr::OriginalName("EXPECT_NO_ERROR")] ExpectNoError = 1, + /// + ///* Check if X Protocol field exists + /// + [pbr::OriginalName("EXPECT_FIELD_EXIST")] ExpectFieldExist = 2, + /// + ///* Check if X Protocol supports document _id generation + /// + [pbr::OriginalName("EXPECT_DOCID_GENERATED")] ExpectDocidGenerated = 3, + } + + public enum ConditionOperation + { + /// + ///* set the condition; set, if not set; overwrite, if set + /// + [pbr::OriginalName("EXPECT_OP_SET")] ExpectOpSet = 0, + /// + ///* unset the condition + /// + [pbr::OriginalName("EXPECT_OP_UNSET")] ExpectOpUnset = 1, + } + + } + #endregion + + } + + } + #endregion + + } + + /// + ///* + ///Close a Expect block. + /// + ///Closing a Expect block restores the state of the previous Expect + ///block for the following messages. + /// + ///@returns @ref Mysqlx::Ok on success, @ref Mysqlx::Error on error + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Close : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Close()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Expect.MysqlxExpectReflection.Descriptor.MessageTypes[1]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Close() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Close(Close other) : this() + { + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Close Clone() + { + return new Close(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Close); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Close other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Close other) + { + if (other == null) + { + return; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + } + } + } +#endif + + } + + #endregion + +} + +#endregion Designer generated code + diff --git a/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxExpr.cs b/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxExpr.cs new file mode 100644 index 000000000..dcb51f823 --- /dev/null +++ b/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxExpr.cs @@ -0,0 +1,3306 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +// +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: mysqlx_expr.proto +// +#pragma warning disable 1591, 0612, 3021, 8981 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace Mysqlx.Expr +{ + + /// Holder for reflection information generated from mysqlx_expr.proto + public static partial class MysqlxExprReflection + { + + #region Descriptor + /// File descriptor for mysqlx_expr.proto + public static pbr::FileDescriptor Descriptor + { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static MysqlxExprReflection() + { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "ChFteXNxbHhfZXhwci5wcm90bxILTXlzcWx4LkV4cHIaFm15c3FseF9kYXRh", + "dHlwZXMucHJvdG8ixAMKBEV4cHISJAoEdHlwZRgBIAIoDjIWLk15c3FseC5F", + "eHByLkV4cHIuVHlwZRIxCgppZGVudGlmaWVyGAIgASgLMh0uTXlzcWx4LkV4", + "cHIuQ29sdW1uSWRlbnRpZmllchIQCgh2YXJpYWJsZRgDIAEoCRIpCgdsaXRl", + "cmFsGAQgASgLMhguTXlzcWx4LkRhdGF0eXBlcy5TY2FsYXISMAoNZnVuY3Rp", + "b25fY2FsbBgFIAEoCzIZLk15c3FseC5FeHByLkZ1bmN0aW9uQ2FsbBInCghv", + "cGVyYXRvchgGIAEoCzIVLk15c3FseC5FeHByLk9wZXJhdG9yEhAKCHBvc2l0", + "aW9uGAcgASgNEiMKBm9iamVjdBgIIAEoCzITLk15c3FseC5FeHByLk9iamVj", + "dBIhCgVhcnJheRgJIAEoCzISLk15c3FseC5FeHByLkFycmF5InEKBFR5cGUS", + "CQoFSURFTlQQARILCgdMSVRFUkFMEAISDAoIVkFSSUFCTEUQAxINCglGVU5D", + "X0NBTEwQBBIMCghPUEVSQVRPUhAFEg8KC1BMQUNFSE9MREVSEAYSCgoGT0JK", + "RUNUEAcSCQoFQVJSQVkQCCIvCgpJZGVudGlmaWVyEgwKBG5hbWUYASACKAkS", + "EwoLc2NoZW1hX25hbWUYAiABKAkiywEKEERvY3VtZW50UGF0aEl0ZW0SMAoE", + "dHlwZRgBIAIoDjIiLk15c3FseC5FeHByLkRvY3VtZW50UGF0aEl0ZW0uVHlw", + "ZRINCgV2YWx1ZRgCIAEoCRINCgVpbmRleBgDIAEoDSJnCgRUeXBlEgoKBk1F", + "TUJFUhABEhMKD01FTUJFUl9BU1RFUklTSxACEg8KC0FSUkFZX0lOREVYEAMS", + "GAoUQVJSQVlfSU5ERVhfQVNURVJJU0sQBBITCg9ET1VCTEVfQVNURVJJU0sQ", + "BSJ/ChBDb2x1bW5JZGVudGlmaWVyEjQKDWRvY3VtZW50X3BhdGgYASADKAsy", + "HS5NeXNxbHguRXhwci5Eb2N1bWVudFBhdGhJdGVtEgwKBG5hbWUYAiABKAkS", + "EgoKdGFibGVfbmFtZRgDIAEoCRITCgtzY2hlbWFfbmFtZRgEIAEoCSJXCgxG", + "dW5jdGlvbkNhbGwSJQoEbmFtZRgBIAIoCzIXLk15c3FseC5FeHByLklkZW50", + "aWZpZXISIAoFcGFyYW0YAiADKAsyES5NeXNxbHguRXhwci5FeHByIjoKCE9w", + "ZXJhdG9yEgwKBG5hbWUYASACKAkSIAoFcGFyYW0YAiADKAsyES5NeXNxbHgu", + "RXhwci5FeHByInQKBk9iamVjdBIsCgNmbGQYASADKAsyHy5NeXNxbHguRXhw", + "ci5PYmplY3QuT2JqZWN0RmllbGQaPAoLT2JqZWN0RmllbGQSCwoDa2V5GAEg", + "AigJEiAKBXZhbHVlGAIgAigLMhEuTXlzcWx4LkV4cHIuRXhwciIpCgVBcnJh", + "eRIgCgV2YWx1ZRgBIAMoCzIRLk15c3FseC5FeHByLkV4cHJCGQoXY29tLm15", + "c3FsLmNqLngucHJvdG9idWY=")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { global::Mysqlx.Datatypes.MysqlxDatatypesReflection.Descriptor, }, + new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Expr.Expr), global::Mysqlx.Expr.Expr.Parser, new[]{ "Type", "Identifier", "Variable", "Literal", "FunctionCall", "Operator", "Position", "Object", "Array" }, null, new[]{ typeof(global::Mysqlx.Expr.Expr.Types.Type) }, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Expr.Identifier), global::Mysqlx.Expr.Identifier.Parser, new[]{ "Name", "SchemaName" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Expr.DocumentPathItem), global::Mysqlx.Expr.DocumentPathItem.Parser, new[]{ "Type", "Value", "Index" }, null, new[]{ typeof(global::Mysqlx.Expr.DocumentPathItem.Types.Type) }, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Expr.ColumnIdentifier), global::Mysqlx.Expr.ColumnIdentifier.Parser, new[]{ "DocumentPath", "Name", "TableName", "SchemaName" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Expr.FunctionCall), global::Mysqlx.Expr.FunctionCall.Parser, new[]{ "Name", "Param" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Expr.Operator), global::Mysqlx.Expr.Operator.Parser, new[]{ "Name", "Param" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Expr.Object), global::Mysqlx.Expr.Object.Parser, new[]{ "Fld" }, null, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Expr.Object.Types.ObjectField), global::Mysqlx.Expr.Object.Types.ObjectField.Parser, new[]{ "Key", "Value" }, null, null, null, null)}), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Expr.Array), global::Mysqlx.Expr.Array.Parser, new[]{ "Value" }, null, null, null, null) + })); + } + #endregion + + } + #region Messages + /// + ///* + ///The "root" of the expression tree. + /// + ///If expression type is PLACEHOLDER, then it refers to the value + ///of a parameter specified when executing a statement (see args + ///field of StmtExecute command). Field position (which must be + ///present for such an expression) gives 0-based position of the + ///parameter in the parameter list. + /// + ///@par production list + ///@code{unparsed} + ///expr: operator | + ///: identifier | + ///: function_call | + ///: variable | + ///: literal | + ///: object | + ///: array | + ///: placeholder + ///@endcode + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Expr : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Expr()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Expr.MysqlxExprReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Expr() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Expr(Expr other) : this() + { + _hasBits0 = other._hasBits0; + type_ = other.type_; + identifier_ = other.identifier_ != null ? other.identifier_.Clone() : null; + variable_ = other.variable_; + literal_ = other.literal_ != null ? other.literal_.Clone() : null; + functionCall_ = other.functionCall_ != null ? other.functionCall_.Clone() : null; + operator_ = other.operator_ != null ? other.operator_.Clone() : null; + position_ = other.position_; + object_ = other.object_ != null ? other.object_.Clone() : null; + array_ = other.array_ != null ? other.array_.Clone() : null; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Expr Clone() + { + return new Expr(this); + } + + /// Field number for the "type" field. + public const int TypeFieldNumber = 1; + private readonly static global::Mysqlx.Expr.Expr.Types.Type TypeDefaultValue = global::Mysqlx.Expr.Expr.Types.Type.Ident; + + private global::Mysqlx.Expr.Expr.Types.Type type_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Expr.Expr.Types.Type Type + { + get { if ((_hasBits0 & 1) != 0) { return type_; } else { return TypeDefaultValue; } } + set + { + _hasBits0 |= 1; + type_ = value; + } + } + /// Gets whether the "type" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasType + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "type" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearType() + { + _hasBits0 &= ~1; + } + + /// Field number for the "identifier" field. + public const int IdentifierFieldNumber = 2; + private global::Mysqlx.Expr.ColumnIdentifier identifier_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Expr.ColumnIdentifier Identifier + { + get { return identifier_; } + set + { + identifier_ = value; + } + } + + /// Field number for the "variable" field. + public const int VariableFieldNumber = 3; + private readonly static string VariableDefaultValue = ""; + + private string variable_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Variable + { + get { return variable_ ?? VariableDefaultValue; } + set + { + variable_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "variable" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasVariable + { + get { return variable_ != null; } + } + /// Clears the value of the "variable" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearVariable() + { + variable_ = null; + } + + /// Field number for the "literal" field. + public const int LiteralFieldNumber = 4; + private global::Mysqlx.Datatypes.Scalar literal_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Datatypes.Scalar Literal + { + get { return literal_; } + set + { + literal_ = value; + } + } + + /// Field number for the "function_call" field. + public const int FunctionCallFieldNumber = 5; + private global::Mysqlx.Expr.FunctionCall functionCall_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Expr.FunctionCall FunctionCall + { + get { return functionCall_; } + set + { + functionCall_ = value; + } + } + + /// Field number for the "operator" field. + public const int OperatorFieldNumber = 6; + private global::Mysqlx.Expr.Operator operator_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Expr.Operator Operator + { + get { return operator_; } + set + { + operator_ = value; + } + } + + /// Field number for the "position" field. + public const int PositionFieldNumber = 7; + private readonly static uint PositionDefaultValue = 0; + + private uint position_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint Position + { + get { if ((_hasBits0 & 2) != 0) { return position_; } else { return PositionDefaultValue; } } + set + { + _hasBits0 |= 2; + position_ = value; + } + } + /// Gets whether the "position" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasPosition + { + get { return (_hasBits0 & 2) != 0; } + } + /// Clears the value of the "position" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearPosition() + { + _hasBits0 &= ~2; + } + + /// Field number for the "object" field. + public const int ObjectFieldNumber = 8; + private global::Mysqlx.Expr.Object object_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Expr.Object Object + { + get { return object_; } + set + { + object_ = value; + } + } + + /// Field number for the "array" field. + public const int ArrayFieldNumber = 9; + private global::Mysqlx.Expr.Array array_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Expr.Array Array + { + get { return array_; } + set + { + array_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Expr); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Expr other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (Type != other.Type) return false; + if (!object.Equals(Identifier, other.Identifier)) return false; + if (Variable != other.Variable) return false; + if (!object.Equals(Literal, other.Literal)) return false; + if (!object.Equals(FunctionCall, other.FunctionCall)) return false; + if (!object.Equals(Operator, other.Operator)) return false; + if (Position != other.Position) return false; + if (!object.Equals(Object, other.Object)) return false; + if (!object.Equals(Array, other.Array)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasType) hash ^= Type.GetHashCode(); + if (identifier_ != null) hash ^= Identifier.GetHashCode(); + if (HasVariable) hash ^= Variable.GetHashCode(); + if (literal_ != null) hash ^= Literal.GetHashCode(); + if (functionCall_ != null) hash ^= FunctionCall.GetHashCode(); + if (operator_ != null) hash ^= Operator.GetHashCode(); + if (HasPosition) hash ^= Position.GetHashCode(); + if (object_ != null) hash ^= Object.GetHashCode(); + if (array_ != null) hash ^= Array.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasType) { + output.WriteRawTag(8); + output.WriteEnum((int) Type); + } + if (identifier_ != null) { + output.WriteRawTag(18); + output.WriteMessage(Identifier); + } + if (HasVariable) { + output.WriteRawTag(26); + output.WriteString(Variable); + } + if (literal_ != null) { + output.WriteRawTag(34); + output.WriteMessage(Literal); + } + if (functionCall_ != null) { + output.WriteRawTag(42); + output.WriteMessage(FunctionCall); + } + if (operator_ != null) { + output.WriteRawTag(50); + output.WriteMessage(Operator); + } + if (HasPosition) { + output.WriteRawTag(56); + output.WriteUInt32(Position); + } + if (object_ != null) { + output.WriteRawTag(66); + output.WriteMessage(Object); + } + if (array_ != null) { + output.WriteRawTag(74); + output.WriteMessage(Array); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasType) + { + output.WriteRawTag(8); + output.WriteEnum((int)Type); + } + if (identifier_ != null) + { + output.WriteRawTag(18); + output.WriteMessage(Identifier); + } + if (HasVariable) + { + output.WriteRawTag(26); + output.WriteString(Variable); + } + if (literal_ != null) + { + output.WriteRawTag(34); + output.WriteMessage(Literal); + } + if (functionCall_ != null) + { + output.WriteRawTag(42); + output.WriteMessage(FunctionCall); + } + if (operator_ != null) + { + output.WriteRawTag(50); + output.WriteMessage(Operator); + } + if (HasPosition) + { + output.WriteRawTag(56); + output.WriteUInt32(Position); + } + if (object_ != null) + { + output.WriteRawTag(66); + output.WriteMessage(Object); + } + if (array_ != null) + { + output.WriteRawTag(74); + output.WriteMessage(Array); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasType) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Type); + } + if (identifier_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Identifier); + } + if (HasVariable) + { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Variable); + } + if (literal_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Literal); + } + if (functionCall_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(FunctionCall); + } + if (operator_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Operator); + } + if (HasPosition) + { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Position); + } + if (object_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Object); + } + if (array_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Array); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Expr other) + { + if (other == null) + { + return; + } + if (other.HasType) + { + Type = other.Type; + } + if (other.identifier_ != null) + { + if (identifier_ == null) + { + Identifier = new global::Mysqlx.Expr.ColumnIdentifier(); + } + Identifier.MergeFrom(other.Identifier); + } + if (other.HasVariable) + { + Variable = other.Variable; + } + if (other.literal_ != null) + { + if (literal_ == null) + { + Literal = new global::Mysqlx.Datatypes.Scalar(); + } + Literal.MergeFrom(other.Literal); + } + if (other.functionCall_ != null) + { + if (functionCall_ == null) + { + FunctionCall = new global::Mysqlx.Expr.FunctionCall(); + } + FunctionCall.MergeFrom(other.FunctionCall); + } + if (other.operator_ != null) + { + if (operator_ == null) + { + Operator = new global::Mysqlx.Expr.Operator(); + } + Operator.MergeFrom(other.Operator); + } + if (other.HasPosition) + { + Position = other.Position; + } + if (other.object_ != null) + { + if (object_ == null) + { + Object = new global::Mysqlx.Expr.Object(); + } + Object.MergeFrom(other.Object); + } + if (other.array_ != null) + { + if (array_ == null) + { + Array = new global::Mysqlx.Expr.Array(); + } + Array.MergeFrom(other.Array); + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + Type = (global::Mysqlx.Expr.Expr.Types.Type) input.ReadEnum(); + break; + } + case 18: { + if (identifier_ == null) { + Identifier = new global::Mysqlx.Expr.ColumnIdentifier(); + } + input.ReadMessage(Identifier); + break; + } + case 26: { + Variable = input.ReadString(); + break; + } + case 34: { + if (literal_ == null) { + Literal = new global::Mysqlx.Datatypes.Scalar(); + } + input.ReadMessage(Literal); + break; + } + case 42: { + if (functionCall_ == null) { + FunctionCall = new global::Mysqlx.Expr.FunctionCall(); + } + input.ReadMessage(FunctionCall); + break; + } + case 50: { + if (operator_ == null) { + Operator = new global::Mysqlx.Expr.Operator(); + } + input.ReadMessage(Operator); + break; + } + case 56: { + Position = input.ReadUInt32(); + break; + } + case 66: { + if (object_ == null) { + Object = new global::Mysqlx.Expr.Object(); + } + input.ReadMessage(Object); + break; + } + case 74: { + if (array_ == null) { + Array = new global::Mysqlx.Expr.Array(); + } + input.ReadMessage(Array); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: + { + Type = (global::Mysqlx.Expr.Expr.Types.Type)input.ReadEnum(); + break; + } + case 18: + { + if (identifier_ == null) + { + Identifier = new global::Mysqlx.Expr.ColumnIdentifier(); + } + input.ReadMessage(Identifier); + break; + } + case 26: + { + Variable = input.ReadString(); + break; + } + case 34: + { + if (literal_ == null) + { + Literal = new global::Mysqlx.Datatypes.Scalar(); + } + input.ReadMessage(Literal); + break; + } + case 42: + { + if (functionCall_ == null) + { + FunctionCall = new global::Mysqlx.Expr.FunctionCall(); + } + input.ReadMessage(FunctionCall); + break; + } + case 50: + { + if (operator_ == null) + { + Operator = new global::Mysqlx.Expr.Operator(); + } + input.ReadMessage(Operator); + break; + } + case 56: + { + Position = input.ReadUInt32(); + break; + } + case 66: + { + if (object_ == null) + { + Object = new global::Mysqlx.Expr.Object(); + } + input.ReadMessage(Object); + break; + } + case 74: + { + if (array_ == null) + { + Array = new global::Mysqlx.Expr.Array(); + } + input.ReadMessage(Array); + break; + } + } + } + } +#endif + + #region Nested types + /// Container for nested types declared in the Expr message type. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static partial class Types + { + public enum Type + { + [pbr::OriginalName("IDENT")] Ident = 1, + [pbr::OriginalName("LITERAL")] Literal = 2, + [pbr::OriginalName("VARIABLE")] Variable = 3, + [pbr::OriginalName("FUNC_CALL")] FuncCall = 4, + [pbr::OriginalName("OPERATOR")] Operator = 5, + [pbr::OriginalName("PLACEHOLDER")] Placeholder = 6, + [pbr::OriginalName("OBJECT")] Object = 7, + [pbr::OriginalName("ARRAY")] Array = 8, + } + + } + #endregion + + } + + /// + ///* + ///Identifier: name, schame.name + /// + ///@par production list + ///@code{unparsed} + ///identifier: string "." string | + ///: string + ///@endcode + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Identifier : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Identifier()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Expr.MysqlxExprReflection.Descriptor.MessageTypes[1]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Identifier() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Identifier(Identifier other) : this() + { + name_ = other.name_; + schemaName_ = other.schemaName_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Identifier Clone() + { + return new Identifier(this); + } + + /// Field number for the "name" field. + public const int NameFieldNumber = 1; + private readonly static string NameDefaultValue = ""; + + private string name_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Name + { + get { return name_ ?? NameDefaultValue; } + set + { + name_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "name" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasName + { + get { return name_ != null; } + } + /// Clears the value of the "name" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearName() + { + name_ = null; + } + + /// Field number for the "schema_name" field. + public const int SchemaNameFieldNumber = 2; + private readonly static string SchemaNameDefaultValue = ""; + + private string schemaName_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string SchemaName + { + get { return schemaName_ ?? SchemaNameDefaultValue; } + set + { + schemaName_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "schema_name" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasSchemaName + { + get { return schemaName_ != null; } + } + /// Clears the value of the "schema_name" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearSchemaName() + { + schemaName_ = null; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Identifier); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Identifier other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (Name != other.Name) return false; + if (SchemaName != other.SchemaName) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasName) hash ^= Name.GetHashCode(); + if (HasSchemaName) hash ^= SchemaName.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasName) { + output.WriteRawTag(10); + output.WriteString(Name); + } + if (HasSchemaName) { + output.WriteRawTag(18); + output.WriteString(SchemaName); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasName) + { + output.WriteRawTag(10); + output.WriteString(Name); + } + if (HasSchemaName) + { + output.WriteRawTag(18); + output.WriteString(SchemaName); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasName) + { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Name); + } + if (HasSchemaName) + { + size += 1 + pb::CodedOutputStream.ComputeStringSize(SchemaName); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Identifier other) + { + if (other == null) + { + return; + } + if (other.HasName) + { + Name = other.Name; + } + if (other.HasSchemaName) + { + SchemaName = other.SchemaName; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + Name = input.ReadString(); + break; + } + case 18: { + SchemaName = input.ReadString(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + Name = input.ReadString(); + break; + } + case 18: + { + SchemaName = input.ReadString(); + break; + } + } + } + } +#endif + + } + + /// + ///* + ///Document path item + /// + ///@par production list + ///@code{unparsed} + ///document_path: path_item | path_item document_path + ///path_item : member | array_index | "**" + ///member : "." string | "." "*" + ///array_index : "[" number "]" | "[" "*" "]" + ///@endcode + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class DocumentPathItem : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new DocumentPathItem()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Expr.MysqlxExprReflection.Descriptor.MessageTypes[2]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public DocumentPathItem() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public DocumentPathItem(DocumentPathItem other) : this() + { + _hasBits0 = other._hasBits0; + type_ = other.type_; + value_ = other.value_; + index_ = other.index_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public DocumentPathItem Clone() + { + return new DocumentPathItem(this); + } + + /// Field number for the "type" field. + public const int TypeFieldNumber = 1; + private readonly static global::Mysqlx.Expr.DocumentPathItem.Types.Type TypeDefaultValue = global::Mysqlx.Expr.DocumentPathItem.Types.Type.Member; + + private global::Mysqlx.Expr.DocumentPathItem.Types.Type type_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Expr.DocumentPathItem.Types.Type Type + { + get { if ((_hasBits0 & 1) != 0) { return type_; } else { return TypeDefaultValue; } } + set + { + _hasBits0 |= 1; + type_ = value; + } + } + /// Gets whether the "type" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasType + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "type" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearType() + { + _hasBits0 &= ~1; + } + + /// Field number for the "value" field. + public const int ValueFieldNumber = 2; + private readonly static string ValueDefaultValue = ""; + + private string value_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Value + { + get { return value_ ?? ValueDefaultValue; } + set + { + value_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "value" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasValue + { + get { return value_ != null; } + } + /// Clears the value of the "value" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearValue() + { + value_ = null; + } + + /// Field number for the "index" field. + public const int IndexFieldNumber = 3; + private readonly static uint IndexDefaultValue = 0; + + private uint index_; + /// + ///* used in case of ARRY_INDEX + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint Index + { + get { if ((_hasBits0 & 2) != 0) { return index_; } else { return IndexDefaultValue; } } + set + { + _hasBits0 |= 2; + index_ = value; + } + } + /// Gets whether the "index" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasIndex + { + get { return (_hasBits0 & 2) != 0; } + } + /// Clears the value of the "index" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearIndex() + { + _hasBits0 &= ~2; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as DocumentPathItem); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(DocumentPathItem other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (Type != other.Type) return false; + if (Value != other.Value) return false; + if (Index != other.Index) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasType) hash ^= Type.GetHashCode(); + if (HasValue) hash ^= Value.GetHashCode(); + if (HasIndex) hash ^= Index.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasType) { + output.WriteRawTag(8); + output.WriteEnum((int) Type); + } + if (HasValue) { + output.WriteRawTag(18); + output.WriteString(Value); + } + if (HasIndex) { + output.WriteRawTag(24); + output.WriteUInt32(Index); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasType) + { + output.WriteRawTag(8); + output.WriteEnum((int)Type); + } + if (HasValue) + { + output.WriteRawTag(18); + output.WriteString(Value); + } + if (HasIndex) + { + output.WriteRawTag(24); + output.WriteUInt32(Index); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasType) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Type); + } + if (HasValue) + { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Value); + } + if (HasIndex) + { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Index); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(DocumentPathItem other) + { + if (other == null) + { + return; + } + if (other.HasType) + { + Type = other.Type; + } + if (other.HasValue) + { + Value = other.Value; + } + if (other.HasIndex) + { + Index = other.Index; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + Type = (global::Mysqlx.Expr.DocumentPathItem.Types.Type) input.ReadEnum(); + break; + } + case 18: { + Value = input.ReadString(); + break; + } + case 24: { + Index = input.ReadUInt32(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: + { + Type = (global::Mysqlx.Expr.DocumentPathItem.Types.Type)input.ReadEnum(); + break; + } + case 18: + { + Value = input.ReadString(); + break; + } + case 24: + { + Index = input.ReadUInt32(); + break; + } + } + } + } +#endif + + #region Nested types + /// Container for nested types declared in the DocumentPathItem message type. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static partial class Types + { + public enum Type + { + /// + ///* .member + /// + [pbr::OriginalName("MEMBER")] Member = 1, + /// + ///* \.* + /// + [pbr::OriginalName("MEMBER_ASTERISK")] MemberAsterisk = 2, + /// + ///* [index] + /// + [pbr::OriginalName("ARRAY_INDEX")] ArrayIndex = 3, + /// + ///* [*] + /// + [pbr::OriginalName("ARRAY_INDEX_ASTERISK")] ArrayIndexAsterisk = 4, + /// + ///* ** + /// + [pbr::OriginalName("DOUBLE_ASTERISK")] DoubleAsterisk = 5, + } + + } + #endregion + + } + + /// + ///* + ///Column identifier + /// + ///for table: col\@doc_path, tbl.col\@doc_path col, tbl.col, schema.tbl.col + ///for document collection: doc_path + ///// + ///@par production list + ///@code{unparsed} + ///col_identifier: string "." string "." string | + ///: string "." string | + ///: string | + ///: string "." string "." string "@" document_path | + ///: string "." string "@" document_path | + ///: string "@" document_path | + ///: document_path + ///document_path: member | arrayLocation | doubleAsterisk + ///member = "." string | "." "*" + ///arrayLocation = "[" index "]" | "[" "*" "]" + ///doubleAsterisk = "**" + ///@endcode + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class ColumnIdentifier : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new ColumnIdentifier()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Expr.MysqlxExprReflection.Descriptor.MessageTypes[3]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ColumnIdentifier() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ColumnIdentifier(ColumnIdentifier other) : this() + { + documentPath_ = other.documentPath_.Clone(); + name_ = other.name_; + tableName_ = other.tableName_; + schemaName_ = other.schemaName_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ColumnIdentifier Clone() + { + return new ColumnIdentifier(this); + } + + /// Field number for the "document_path" field. + public const int DocumentPathFieldNumber = 1; + private static readonly pb::FieldCodec _repeated_documentPath_codec + = pb::FieldCodec.ForMessage(10, global::Mysqlx.Expr.DocumentPathItem.Parser); + private readonly pbc::RepeatedField documentPath_ = new pbc::RepeatedField(); + /// + ///* document path + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField DocumentPath + { + get { return documentPath_; } + } + + /// Field number for the "name" field. + public const int NameFieldNumber = 2; + private readonly static string NameDefaultValue = ""; + + private string name_; + /// + ///* name of column + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Name + { + get { return name_ ?? NameDefaultValue; } + set + { + name_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "name" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasName + { + get { return name_ != null; } + } + /// Clears the value of the "name" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearName() + { + name_ = null; + } + + /// Field number for the "table_name" field. + public const int TableNameFieldNumber = 3; + private readonly static string TableNameDefaultValue = ""; + + private string tableName_; + /// + ///* name of table + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string TableName + { + get { return tableName_ ?? TableNameDefaultValue; } + set + { + tableName_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "table_name" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasTableName + { + get { return tableName_ != null; } + } + /// Clears the value of the "table_name" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearTableName() + { + tableName_ = null; + } + + /// Field number for the "schema_name" field. + public const int SchemaNameFieldNumber = 4; + private readonly static string SchemaNameDefaultValue = ""; + + private string schemaName_; + /// + ///* name of schema + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string SchemaName + { + get { return schemaName_ ?? SchemaNameDefaultValue; } + set + { + schemaName_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "schema_name" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasSchemaName + { + get { return schemaName_ != null; } + } + /// Clears the value of the "schema_name" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearSchemaName() + { + schemaName_ = null; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as ColumnIdentifier); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(ColumnIdentifier other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (!documentPath_.Equals(other.documentPath_)) return false; + if (Name != other.Name) return false; + if (TableName != other.TableName) return false; + if (SchemaName != other.SchemaName) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + hash ^= documentPath_.GetHashCode(); + if (HasName) hash ^= Name.GetHashCode(); + if (HasTableName) hash ^= TableName.GetHashCode(); + if (HasSchemaName) hash ^= SchemaName.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + documentPath_.WriteTo(output, _repeated_documentPath_codec); + if (HasName) { + output.WriteRawTag(18); + output.WriteString(Name); + } + if (HasTableName) { + output.WriteRawTag(26); + output.WriteString(TableName); + } + if (HasSchemaName) { + output.WriteRawTag(34); + output.WriteString(SchemaName); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + documentPath_.WriteTo(ref output, _repeated_documentPath_codec); + if (HasName) + { + output.WriteRawTag(18); + output.WriteString(Name); + } + if (HasTableName) + { + output.WriteRawTag(26); + output.WriteString(TableName); + } + if (HasSchemaName) + { + output.WriteRawTag(34); + output.WriteString(SchemaName); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + size += documentPath_.CalculateSize(_repeated_documentPath_codec); + if (HasName) + { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Name); + } + if (HasTableName) + { + size += 1 + pb::CodedOutputStream.ComputeStringSize(TableName); + } + if (HasSchemaName) + { + size += 1 + pb::CodedOutputStream.ComputeStringSize(SchemaName); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(ColumnIdentifier other) + { + if (other == null) + { + return; + } + documentPath_.Add(other.documentPath_); + if (other.HasName) + { + Name = other.Name; + } + if (other.HasTableName) + { + TableName = other.TableName; + } + if (other.HasSchemaName) + { + SchemaName = other.SchemaName; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + documentPath_.AddEntriesFrom(input, _repeated_documentPath_codec); + break; + } + case 18: { + Name = input.ReadString(); + break; + } + case 26: { + TableName = input.ReadString(); + break; + } + case 34: { + SchemaName = input.ReadString(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + documentPath_.AddEntriesFrom(ref input, _repeated_documentPath_codec); + break; + } + case 18: + { + Name = input.ReadString(); + break; + } + case 26: + { + TableName = input.ReadString(); + break; + } + case 34: + { + SchemaName = input.ReadString(); + break; + } + } + } + } +#endif + + } + + /// + ///* + ///Function call: ``func(a, b, "1", 3)`` + /// + ///@par production list + ///@code{unparsed} + ///function_call: `identifier` "(" [ `expr` ["," `expr` ]* ] ")" + ///@endcode + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class FunctionCall : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new FunctionCall()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Expr.MysqlxExprReflection.Descriptor.MessageTypes[4]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public FunctionCall() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public FunctionCall(FunctionCall other) : this() + { + name_ = other.name_ != null ? other.name_.Clone() : null; + param_ = other.param_.Clone(); + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public FunctionCall Clone() + { + return new FunctionCall(this); + } + + /// Field number for the "name" field. + public const int NameFieldNumber = 1; + private global::Mysqlx.Expr.Identifier name_; + /// + ///* identifier of function; at least name of it + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Expr.Identifier Name + { + get { return name_; } + set + { + name_ = value; + } + } + + /// Field number for the "param" field. + public const int ParamFieldNumber = 2; + private static readonly pb::FieldCodec _repeated_param_codec + = pb::FieldCodec.ForMessage(18, global::Mysqlx.Expr.Expr.Parser); + private readonly pbc::RepeatedField param_ = new pbc::RepeatedField(); + /// + ///* list of parameters + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Param + { + get { return param_; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as FunctionCall); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(FunctionCall other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (!object.Equals(Name, other.Name)) return false; + if (!param_.Equals(other.param_)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (name_ != null) hash ^= Name.GetHashCode(); + hash ^= param_.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (name_ != null) { + output.WriteRawTag(10); + output.WriteMessage(Name); + } + param_.WriteTo(output, _repeated_param_codec); + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (name_ != null) + { + output.WriteRawTag(10); + output.WriteMessage(Name); + } + param_.WriteTo(ref output, _repeated_param_codec); + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (name_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Name); + } + size += param_.CalculateSize(_repeated_param_codec); + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(FunctionCall other) + { + if (other == null) + { + return; + } + if (other.name_ != null) + { + if (name_ == null) + { + Name = new global::Mysqlx.Expr.Identifier(); + } + Name.MergeFrom(other.Name); + } + param_.Add(other.param_); + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + if (name_ == null) { + Name = new global::Mysqlx.Expr.Identifier(); + } + input.ReadMessage(Name); + break; + } + case 18: { + param_.AddEntriesFrom(input, _repeated_param_codec); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + if (name_ == null) + { + Name = new global::Mysqlx.Expr.Identifier(); + } + input.ReadMessage(Name); + break; + } + case 18: + { + param_.AddEntriesFrom(ref input, _repeated_param_codec); + break; + } + } + } + } +#endif + + } + + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Operator : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Operator()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Expr.MysqlxExprReflection.Descriptor.MessageTypes[5]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Operator() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Operator(Operator other) : this() + { + name_ = other.name_; + param_ = other.param_.Clone(); + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Operator Clone() + { + return new Operator(this); + } + + /// Field number for the "name" field. + public const int NameFieldNumber = 1; + private readonly static string NameDefaultValue = ""; + + private string name_; + /// + ///* name of operator + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Name + { + get { return name_ ?? NameDefaultValue; } + set + { + name_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "name" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasName + { + get { return name_ != null; } + } + /// Clears the value of the "name" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearName() + { + name_ = null; + } + + /// Field number for the "param" field. + public const int ParamFieldNumber = 2; + private static readonly pb::FieldCodec _repeated_param_codec + = pb::FieldCodec.ForMessage(18, global::Mysqlx.Expr.Expr.Parser); + private readonly pbc::RepeatedField param_ = new pbc::RepeatedField(); + /// + ///* list of parameters + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Param + { + get { return param_; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Operator); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Operator other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (Name != other.Name) return false; + if (!param_.Equals(other.param_)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasName) hash ^= Name.GetHashCode(); + hash ^= param_.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasName) { + output.WriteRawTag(10); + output.WriteString(Name); + } + param_.WriteTo(output, _repeated_param_codec); + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasName) + { + output.WriteRawTag(10); + output.WriteString(Name); + } + param_.WriteTo(ref output, _repeated_param_codec); + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasName) + { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Name); + } + size += param_.CalculateSize(_repeated_param_codec); + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Operator other) + { + if (other == null) + { + return; + } + if (other.HasName) + { + Name = other.Name; + } + param_.Add(other.param_); + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + Name = input.ReadString(); + break; + } + case 18: { + param_.AddEntriesFrom(input, _repeated_param_codec); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + Name = input.ReadString(); + break; + } + case 18: + { + param_.AddEntriesFrom(ref input, _repeated_param_codec); + break; + } + } + } + } +#endif + + } + + /// + ///* + ///An object (with expression values) + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Object : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Object()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Expr.MysqlxExprReflection.Descriptor.MessageTypes[6]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Object() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Object(Object other) : this() + { + fld_ = other.fld_.Clone(); + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Object Clone() + { + return new Object(this); + } + + /// Field number for the "fld" field. + public const int FldFieldNumber = 1; + private static readonly pb::FieldCodec _repeated_fld_codec + = pb::FieldCodec.ForMessage(10, global::Mysqlx.Expr.Object.Types.ObjectField.Parser); + private readonly pbc::RepeatedField fld_ = new pbc::RepeatedField(); + /// + ///* list of fields + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Fld + { + get { return fld_; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Object); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Object other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (!fld_.Equals(other.fld_)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + hash ^= fld_.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + fld_.WriteTo(output, _repeated_fld_codec); + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + fld_.WriteTo(ref output, _repeated_fld_codec); + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + size += fld_.CalculateSize(_repeated_fld_codec); + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Object other) + { + if (other == null) + { + return; + } + fld_.Add(other.fld_); + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + fld_.AddEntriesFrom(input, _repeated_fld_codec); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + fld_.AddEntriesFrom(ref input, _repeated_fld_codec); + break; + } + } + } + } +#endif + + #region Nested types + /// Container for nested types declared in the Object message type. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static partial class Types + { + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class ObjectField : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new ObjectField()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Expr.Object.Descriptor.NestedTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ObjectField() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ObjectField(ObjectField other) : this() + { + key_ = other.key_; + value_ = other.value_ != null ? other.value_.Clone() : null; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ObjectField Clone() + { + return new ObjectField(this); + } + + /// Field number for the "key" field. + public const int KeyFieldNumber = 1; + private readonly static string KeyDefaultValue = ""; + + private string key_; + /// + ///* identifier of field + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Key + { + get { return key_ ?? KeyDefaultValue; } + set + { + key_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "key" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasKey + { + get { return key_ != null; } + } + /// Clears the value of the "key" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearKey() + { + key_ = null; + } + + /// Field number for the "value" field. + public const int ValueFieldNumber = 2; + private global::Mysqlx.Expr.Expr value_; + /// + ///* value of field + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Expr.Expr Value + { + get { return value_; } + set + { + value_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as ObjectField); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(ObjectField other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (Key != other.Key) return false; + if (!object.Equals(Value, other.Value)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasKey) hash ^= Key.GetHashCode(); + if (value_ != null) hash ^= Value.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasKey) { + output.WriteRawTag(10); + output.WriteString(Key); + } + if (value_ != null) { + output.WriteRawTag(18); + output.WriteMessage(Value); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasKey) + { + output.WriteRawTag(10); + output.WriteString(Key); + } + if (value_ != null) + { + output.WriteRawTag(18); + output.WriteMessage(Value); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasKey) + { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Key); + } + if (value_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Value); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(ObjectField other) + { + if (other == null) + { + return; + } + if (other.HasKey) + { + Key = other.Key; + } + if (other.value_ != null) + { + if (value_ == null) + { + Value = new global::Mysqlx.Expr.Expr(); + } + Value.MergeFrom(other.Value); + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + Key = input.ReadString(); + break; + } + case 18: { + if (value_ == null) { + Value = new global::Mysqlx.Expr.Expr(); + } + input.ReadMessage(Value); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + Key = input.ReadString(); + break; + } + case 18: + { + if (value_ == null) + { + Value = new global::Mysqlx.Expr.Expr(); + } + input.ReadMessage(Value); + break; + } + } + } + } +#endif + + } + + } + #endregion + + } + + /// + ///* + ///An array of expressions + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Array : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Array()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Expr.MysqlxExprReflection.Descriptor.MessageTypes[7]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Array() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Array(Array other) : this() + { + value_ = other.value_.Clone(); + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Array Clone() + { + return new Array(this); + } + + /// Field number for the "value" field. + public const int ValueFieldNumber = 1; + private static readonly pb::FieldCodec _repeated_value_codec + = pb::FieldCodec.ForMessage(10, global::Mysqlx.Expr.Expr.Parser); + private readonly pbc::RepeatedField value_ = new pbc::RepeatedField(); + /// + ///* list of values + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Value + { + get { return value_; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Array); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Array other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (!value_.Equals(other.value_)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + hash ^= value_.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + value_.WriteTo(output, _repeated_value_codec); + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + value_.WriteTo(ref output, _repeated_value_codec); + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + size += value_.CalculateSize(_repeated_value_codec); + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Array other) + { + if (other == null) + { + return; + } + value_.Add(other.value_); + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + value_.AddEntriesFrom(input, _repeated_value_codec); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + value_.AddEntriesFrom(ref input, _repeated_value_codec); + break; + } + } + } + } +#endif + + } + + #endregion + +} + +#endregion Designer generated code + diff --git a/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxNotice.cs b/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxNotice.cs new file mode 100644 index 000000000..39a8bdee1 --- /dev/null +++ b/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxNotice.cs @@ -0,0 +1,2092 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +// +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: mysqlx_notice.proto +// +#pragma warning disable 1591, 0612, 3021, 8981 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace Mysqlx.Notice +{ + + /// Holder for reflection information generated from mysqlx_notice.proto + public static partial class MysqlxNoticeReflection + { + + #region Descriptor + /// File descriptor for mysqlx_notice.proto + public static pbr::FileDescriptor Descriptor + { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static MysqlxNoticeReflection() + { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "ChNteXNxbHhfbm90aWNlLnByb3RvEg1NeXNxbHguTm90aWNlGgxteXNxbHgu", + "cHJvdG8aFm15c3FseF9kYXRhdHlwZXMucHJvdG8ihQIKBUZyYW1lEgwKBHR5", + "cGUYASACKA0SMQoFc2NvcGUYAiABKA4yGi5NeXNxbHguTm90aWNlLkZyYW1l", + "LlNjb3BlOgZHTE9CQUwSDwoHcGF5bG9hZBgDIAEoDCIeCgVTY29wZRIKCgZH", + "TE9CQUwQARIJCgVMT0NBTBACIoMBCgRUeXBlEgsKB1dBUk5JTkcQARIcChhT", + "RVNTSU9OX1ZBUklBQkxFX0NIQU5HRUQQAhIZChVTRVNTSU9OX1NUQVRFX0NI", + "QU5HRUQQAxIjCh9HUk9VUF9SRVBMSUNBVElPTl9TVEFURV9DSEFOR0VEEAQS", + "EAoMU0VSVkVSX0hFTExPEAU6BJDqMAsihQEKB1dhcm5pbmcSNAoFbGV2ZWwY", + "ASABKA4yHC5NeXNxbHguTm90aWNlLldhcm5pbmcuTGV2ZWw6B1dBUk5JTkcS", + "DAoEY29kZRgCIAIoDRILCgNtc2cYAyACKAkiKQoFTGV2ZWwSCAoETk9URRAB", + "EgsKB1dBUk5JTkcQAhIJCgVFUlJPUhADIlAKFlNlc3Npb25WYXJpYWJsZUNo", + "YW5nZWQSDQoFcGFyYW0YASACKAkSJwoFdmFsdWUYAiABKAsyGC5NeXNxbHgu", + "RGF0YXR5cGVzLlNjYWxhciLxAgoTU2Vzc2lvblN0YXRlQ2hhbmdlZBI7CgVw", + "YXJhbRgBIAIoDjIsLk15c3FseC5Ob3RpY2UuU2Vzc2lvblN0YXRlQ2hhbmdl", + "ZC5QYXJhbWV0ZXISJwoFdmFsdWUYAiADKAsyGC5NeXNxbHguRGF0YXR5cGVz", + "LlNjYWxhciLzAQoJUGFyYW1ldGVyEhIKDkNVUlJFTlRfU0NIRU1BEAESEwoP", + "QUNDT1VOVF9FWFBJUkVEEAISFwoTR0VORVJBVEVEX0lOU0VSVF9JRBADEhEK", + "DVJPV1NfQUZGRUNURUQQBBIOCgpST1dTX0ZPVU5EEAUSEAoMUk9XU19NQVRD", + "SEVEEAYSEQoNVFJYX0NPTU1JVFRFRBAHEhIKDlRSWF9ST0xMRURCQUNLEAkS", + "FAoQUFJPRFVDRURfTUVTU0FHRRAKEhYKEkNMSUVOVF9JRF9BU1NJR05FRBAL", + "EhoKFkdFTkVSQVRFRF9ET0NVTUVOVF9JRFMQDCKuAQocR3JvdXBSZXBsaWNh", + "dGlvblN0YXRlQ2hhbmdlZBIMCgR0eXBlGAEgAigNEg8KB3ZpZXdfaWQYAiAB", + "KAkibwoEVHlwZRIaChZNRU1CRVJTSElQX1FVT1JVTV9MT1NTEAESGgoWTUVN", + "QkVSU0hJUF9WSUVXX0NIQU5HRRACEhYKEk1FTUJFUl9ST0xFX0NIQU5HRRAD", + "EhcKE01FTUJFUl9TVEFURV9DSEFOR0UQBCINCgtTZXJ2ZXJIZWxsb0IZChdj", + "b20ubXlzcWwuY2oueC5wcm90b2J1Zg==")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { global::Mysqlx.MysqlxReflection.Descriptor, global::Mysqlx.Datatypes.MysqlxDatatypesReflection.Descriptor, }, + new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Notice.Frame), global::Mysqlx.Notice.Frame.Parser, new[]{ "Type", "Scope", "Payload" }, null, new[]{ typeof(global::Mysqlx.Notice.Frame.Types.Scope), typeof(global::Mysqlx.Notice.Frame.Types.Type) }, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Notice.Warning), global::Mysqlx.Notice.Warning.Parser, new[]{ "Level", "Code", "Msg" }, null, new[]{ typeof(global::Mysqlx.Notice.Warning.Types.Level) }, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Notice.SessionVariableChanged), global::Mysqlx.Notice.SessionVariableChanged.Parser, new[]{ "Param", "Value" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Notice.SessionStateChanged), global::Mysqlx.Notice.SessionStateChanged.Parser, new[]{ "Param", "Value" }, null, new[]{ typeof(global::Mysqlx.Notice.SessionStateChanged.Types.Parameter) }, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Notice.GroupReplicationStateChanged), global::Mysqlx.Notice.GroupReplicationStateChanged.Parser, new[]{ "Type", "ViewId" }, null, new[]{ typeof(global::Mysqlx.Notice.GroupReplicationStateChanged.Types.Type) }, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Notice.ServerHello), global::Mysqlx.Notice.ServerHello.Parser, null, null, null, null, null) + })); + } + #endregion + + } + #region Messages + /// + ///* + ///Common frame for all notices + /// + ///| ``.type`` | Value | + ///|---------------------------------------------------|------ | + ///| @ref Mysqlx::Notice::Warning | 1 | + ///| @ref Mysqlx::Notice::SessionVariableChanged | 2 | + ///| @ref Mysqlx::Notice::SessionStateChanged | 3 | + ///| @ref Mysqlx::Notice::GroupReplicationStateChanged | 4 | + ///| @ref Mysqlx::Notice::ServerHello | 5 | + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Frame : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Frame()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Notice.MysqlxNoticeReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Frame() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Frame(Frame other) : this() + { + _hasBits0 = other._hasBits0; + type_ = other.type_; + scope_ = other.scope_; + payload_ = other.payload_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Frame Clone() + { + return new Frame(this); + } + + /// Field number for the "type" field. + public const int TypeFieldNumber = 1; + private readonly static uint TypeDefaultValue = 0; + + private uint type_; + /// + ///* the type of the payload + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint Type + { + get { if ((_hasBits0 & 1) != 0) { return type_; } else { return TypeDefaultValue; } } + set + { + _hasBits0 |= 1; + type_ = value; + } + } + /// Gets whether the "type" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasType + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "type" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearType() + { + _hasBits0 &= ~1; + } + + /// Field number for the "scope" field. + public const int ScopeFieldNumber = 2; + private readonly static global::Mysqlx.Notice.Frame.Types.Scope ScopeDefaultValue = global::Mysqlx.Notice.Frame.Types.Scope.Global; + + private global::Mysqlx.Notice.Frame.Types.Scope scope_; + /// + ///* global or local notification + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Notice.Frame.Types.Scope Scope + { + get { if ((_hasBits0 & 2) != 0) { return scope_; } else { return ScopeDefaultValue; } } + set + { + _hasBits0 |= 2; + scope_ = value; + } + } + /// Gets whether the "scope" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasScope + { + get { return (_hasBits0 & 2) != 0; } + } + /// Clears the value of the "scope" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearScope() + { + _hasBits0 &= ~2; + } + + /// Field number for the "payload" field. + public const int PayloadFieldNumber = 3; + private readonly static pb::ByteString PayloadDefaultValue = pb::ByteString.Empty; + + private pb::ByteString payload_; + /// + ///* the payload of the notification + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pb::ByteString Payload + { + get { return payload_ ?? PayloadDefaultValue; } + set + { + payload_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "payload" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasPayload + { + get { return payload_ != null; } + } + /// Clears the value of the "payload" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearPayload() + { + payload_ = null; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Frame); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Frame other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (Type != other.Type) return false; + if (Scope != other.Scope) return false; + if (Payload != other.Payload) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasType) hash ^= Type.GetHashCode(); + if (HasScope) hash ^= Scope.GetHashCode(); + if (HasPayload) hash ^= Payload.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasType) { + output.WriteRawTag(8); + output.WriteUInt32(Type); + } + if (HasScope) { + output.WriteRawTag(16); + output.WriteEnum((int) Scope); + } + if (HasPayload) { + output.WriteRawTag(26); + output.WriteBytes(Payload); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasType) + { + output.WriteRawTag(8); + output.WriteUInt32(Type); + } + if (HasScope) + { + output.WriteRawTag(16); + output.WriteEnum((int)Scope); + } + if (HasPayload) + { + output.WriteRawTag(26); + output.WriteBytes(Payload); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasType) + { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Type); + } + if (HasScope) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Scope); + } + if (HasPayload) + { + size += 1 + pb::CodedOutputStream.ComputeBytesSize(Payload); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Frame other) + { + if (other == null) + { + return; + } + if (other.HasType) + { + Type = other.Type; + } + if (other.HasScope) + { + Scope = other.Scope; + } + if (other.HasPayload) + { + Payload = other.Payload; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + Type = input.ReadUInt32(); + break; + } + case 16: { + Scope = (global::Mysqlx.Notice.Frame.Types.Scope) input.ReadEnum(); + break; + } + case 26: { + Payload = input.ReadBytes(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: + { + Type = input.ReadUInt32(); + break; + } + case 16: + { + Scope = (global::Mysqlx.Notice.Frame.Types.Scope)input.ReadEnum(); + break; + } + case 26: + { + Payload = input.ReadBytes(); + break; + } + } + } + } +#endif + + #region Nested types + /// Container for nested types declared in the Frame message type. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static partial class Types + { + /// + ///* scope of notice + /// + public enum Scope + { + [pbr::OriginalName("GLOBAL")] Global = 1, + [pbr::OriginalName("LOCAL")] Local = 2, + } + + /// + ///* type of notice payload + /// + public enum Type + { + [pbr::OriginalName("WARNING")] Warning = 1, + [pbr::OriginalName("SESSION_VARIABLE_CHANGED")] SessionVariableChanged = 2, + [pbr::OriginalName("SESSION_STATE_CHANGED")] SessionStateChanged = 3, + [pbr::OriginalName("GROUP_REPLICATION_STATE_CHANGED")] GroupReplicationStateChanged = 4, + [pbr::OriginalName("SERVER_HELLO")] ServerHello = 5, + } + + } + #endregion + + } + + /// + ///* + ///Server-side warnings and notes + /// + ///@par ``.scope`` == ``local`` + ///``.level``, ``.code`` and ``.msg`` map the content of: + ///@code{sql} + ///SHOW WARNINGS + ///@endcode + /// + ///@par ``.scope`` == ``global`` + ///(undefined) Will be used for global, unstructured messages like: + ///- server is shutting down + ///- a node disconnected from group + ///- schema or table dropped + /// + ///| @ref Mysqlx::Notice::Frame Field | Value | + ///|-----------------------------------|-------------------------| + ///| ``.type`` | 1 | + ///| ``.scope`` | ``local`` or ``global`` | + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Warning : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Warning()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Notice.MysqlxNoticeReflection.Descriptor.MessageTypes[1]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Warning() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Warning(Warning other) : this() + { + _hasBits0 = other._hasBits0; + level_ = other.level_; + code_ = other.code_; + msg_ = other.msg_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Warning Clone() + { + return new Warning(this); + } + + /// Field number for the "level" field. + public const int LevelFieldNumber = 1; + private readonly static global::Mysqlx.Notice.Warning.Types.Level LevelDefaultValue = global::Mysqlx.Notice.Warning.Types.Level.Warning; + + private global::Mysqlx.Notice.Warning.Types.Level level_; + /// + ///* Note or Warning + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Notice.Warning.Types.Level Level + { + get { if ((_hasBits0 & 1) != 0) { return level_; } else { return LevelDefaultValue; } } + set + { + _hasBits0 |= 1; + level_ = value; + } + } + /// Gets whether the "level" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasLevel + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "level" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearLevel() + { + _hasBits0 &= ~1; + } + + /// Field number for the "code" field. + public const int CodeFieldNumber = 2; + private readonly static uint CodeDefaultValue = 0; + + private uint code_; + /// + ///* warning code + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint Code + { + get { if ((_hasBits0 & 2) != 0) { return code_; } else { return CodeDefaultValue; } } + set + { + _hasBits0 |= 2; + code_ = value; + } + } + /// Gets whether the "code" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasCode + { + get { return (_hasBits0 & 2) != 0; } + } + /// Clears the value of the "code" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearCode() + { + _hasBits0 &= ~2; + } + + /// Field number for the "msg" field. + public const int MsgFieldNumber = 3; + private readonly static string MsgDefaultValue = ""; + + private string msg_; + /// + ///* warning message + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Msg + { + get { return msg_ ?? MsgDefaultValue; } + set + { + msg_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "msg" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasMsg + { + get { return msg_ != null; } + } + /// Clears the value of the "msg" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearMsg() + { + msg_ = null; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Warning); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Warning other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (Level != other.Level) return false; + if (Code != other.Code) return false; + if (Msg != other.Msg) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasLevel) hash ^= Level.GetHashCode(); + if (HasCode) hash ^= Code.GetHashCode(); + if (HasMsg) hash ^= Msg.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasLevel) { + output.WriteRawTag(8); + output.WriteEnum((int) Level); + } + if (HasCode) { + output.WriteRawTag(16); + output.WriteUInt32(Code); + } + if (HasMsg) { + output.WriteRawTag(26); + output.WriteString(Msg); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasLevel) + { + output.WriteRawTag(8); + output.WriteEnum((int)Level); + } + if (HasCode) + { + output.WriteRawTag(16); + output.WriteUInt32(Code); + } + if (HasMsg) + { + output.WriteRawTag(26); + output.WriteString(Msg); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasLevel) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Level); + } + if (HasCode) + { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Code); + } + if (HasMsg) + { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Msg); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Warning other) + { + if (other == null) + { + return; + } + if (other.HasLevel) + { + Level = other.Level; + } + if (other.HasCode) + { + Code = other.Code; + } + if (other.HasMsg) + { + Msg = other.Msg; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + Level = (global::Mysqlx.Notice.Warning.Types.Level) input.ReadEnum(); + break; + } + case 16: { + Code = input.ReadUInt32(); + break; + } + case 26: { + Msg = input.ReadString(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: + { + Level = (global::Mysqlx.Notice.Warning.Types.Level)input.ReadEnum(); + break; + } + case 16: + { + Code = input.ReadUInt32(); + break; + } + case 26: + { + Msg = input.ReadString(); + break; + } + } + } + } +#endif + + #region Nested types + /// Container for nested types declared in the Warning message type. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static partial class Types + { + public enum Level + { + [pbr::OriginalName("NOTE")] Note = 1, + [pbr::OriginalName("WARNING")] Warning = 2, + [pbr::OriginalName("ERROR")] Error = 3, + } + + } + #endregion + + } + + /// + ///* + ///Notify clients about changes to the current session variables. + /// + ///Every change to a variable that is accessible through: + /// + ///@code{sql} + ///SHOW SESSION VARIABLES + ///@endcode + /// + ///| @ref Mysqlx::Notice::Frame Field | Value | + ///|-----------------------------------|----------| + ///| ``.type`` | 2 | + ///| ``.scope`` | ``local``| + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class SessionVariableChanged : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new SessionVariableChanged()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Notice.MysqlxNoticeReflection.Descriptor.MessageTypes[2]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public SessionVariableChanged() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public SessionVariableChanged(SessionVariableChanged other) : this() + { + param_ = other.param_; + value_ = other.value_ != null ? other.value_.Clone() : null; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public SessionVariableChanged Clone() + { + return new SessionVariableChanged(this); + } + + /// Field number for the "param" field. + public const int ParamFieldNumber = 1; + private readonly static string ParamDefaultValue = ""; + + private string param_; + /// + ///* name of the variable + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Param + { + get { return param_ ?? ParamDefaultValue; } + set + { + param_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "param" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasParam + { + get { return param_ != null; } + } + /// Clears the value of the "param" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearParam() + { + param_ = null; + } + + /// Field number for the "value" field. + public const int ValueFieldNumber = 2; + private global::Mysqlx.Datatypes.Scalar value_; + /// + ///* the changed value of param + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Datatypes.Scalar Value + { + get { return value_; } + set + { + value_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as SessionVariableChanged); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(SessionVariableChanged other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (Param != other.Param) return false; + if (!object.Equals(Value, other.Value)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasParam) hash ^= Param.GetHashCode(); + if (value_ != null) hash ^= Value.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasParam) { + output.WriteRawTag(10); + output.WriteString(Param); + } + if (value_ != null) { + output.WriteRawTag(18); + output.WriteMessage(Value); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasParam) + { + output.WriteRawTag(10); + output.WriteString(Param); + } + if (value_ != null) + { + output.WriteRawTag(18); + output.WriteMessage(Value); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasParam) + { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Param); + } + if (value_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Value); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(SessionVariableChanged other) + { + if (other == null) + { + return; + } + if (other.HasParam) + { + Param = other.Param; + } + if (other.value_ != null) + { + if (value_ == null) + { + Value = new global::Mysqlx.Datatypes.Scalar(); + } + Value.MergeFrom(other.Value); + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + Param = input.ReadString(); + break; + } + case 18: { + if (value_ == null) { + Value = new global::Mysqlx.Datatypes.Scalar(); + } + input.ReadMessage(Value); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + Param = input.ReadString(); + break; + } + case 18: + { + if (value_ == null) + { + Value = new global::Mysqlx.Datatypes.Scalar(); + } + input.ReadMessage(Value); + break; + } + } + } + } +#endif + + } + + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class SessionStateChanged : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new SessionStateChanged()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Notice.MysqlxNoticeReflection.Descriptor.MessageTypes[3]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public SessionStateChanged() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public SessionStateChanged(SessionStateChanged other) : this() + { + _hasBits0 = other._hasBits0; + param_ = other.param_; + value_ = other.value_.Clone(); + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public SessionStateChanged Clone() + { + return new SessionStateChanged(this); + } + + /// Field number for the "param" field. + public const int ParamFieldNumber = 1; + private readonly static global::Mysqlx.Notice.SessionStateChanged.Types.Parameter ParamDefaultValue = global::Mysqlx.Notice.SessionStateChanged.Types.Parameter.CurrentSchema; + + private global::Mysqlx.Notice.SessionStateChanged.Types.Parameter param_; + /// + ///* parameter key + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Notice.SessionStateChanged.Types.Parameter Param + { + get { if ((_hasBits0 & 1) != 0) { return param_; } else { return ParamDefaultValue; } } + set + { + _hasBits0 |= 1; + param_ = value; + } + } + /// Gets whether the "param" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasParam + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "param" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearParam() + { + _hasBits0 &= ~1; + } + + /// Field number for the "value" field. + public const int ValueFieldNumber = 2; + private static readonly pb::FieldCodec _repeated_value_codec + = pb::FieldCodec.ForMessage(18, global::Mysqlx.Datatypes.Scalar.Parser); + private readonly pbc::RepeatedField value_ = new pbc::RepeatedField(); + /// + ///* updated value + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Value + { + get { return value_; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as SessionStateChanged); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(SessionStateChanged other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (Param != other.Param) return false; + if (!value_.Equals(other.value_)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasParam) hash ^= Param.GetHashCode(); + hash ^= value_.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasParam) { + output.WriteRawTag(8); + output.WriteEnum((int) Param); + } + value_.WriteTo(output, _repeated_value_codec); + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasParam) + { + output.WriteRawTag(8); + output.WriteEnum((int)Param); + } + value_.WriteTo(ref output, _repeated_value_codec); + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasParam) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Param); + } + size += value_.CalculateSize(_repeated_value_codec); + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(SessionStateChanged other) + { + if (other == null) + { + return; + } + if (other.HasParam) + { + Param = other.Param; + } + value_.Add(other.value_); + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + Param = (global::Mysqlx.Notice.SessionStateChanged.Types.Parameter) input.ReadEnum(); + break; + } + case 18: { + value_.AddEntriesFrom(input, _repeated_value_codec); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: + { + Param = (global::Mysqlx.Notice.SessionStateChanged.Types.Parameter)input.ReadEnum(); + break; + } + case 18: + { + value_.AddEntriesFrom(ref input, _repeated_value_codec); + break; + } + } + } + } +#endif + + #region Nested types + /// Container for nested types declared in the SessionStateChanged message type. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static partial class Types + { + public enum Parameter + { + [pbr::OriginalName("CURRENT_SCHEMA")] CurrentSchema = 1, + [pbr::OriginalName("ACCOUNT_EXPIRED")] AccountExpired = 2, + [pbr::OriginalName("GENERATED_INSERT_ID")] GeneratedInsertId = 3, + [pbr::OriginalName("ROWS_AFFECTED")] RowsAffected = 4, + [pbr::OriginalName("ROWS_FOUND")] RowsFound = 5, + [pbr::OriginalName("ROWS_MATCHED")] RowsMatched = 6, + [pbr::OriginalName("TRX_COMMITTED")] TrxCommitted = 7, + [pbr::OriginalName("TRX_ROLLEDBACK")] TrxRolledback = 9, + [pbr::OriginalName("PRODUCED_MESSAGE")] ProducedMessage = 10, + [pbr::OriginalName("CLIENT_ID_ASSIGNED")] ClientIdAssigned = 11, + /// + /// .. more to be added + /// + [pbr::OriginalName("GENERATED_DOCUMENT_IDS")] GeneratedDocumentIds = 12, + } + + } + #endregion + + } + + /// + ///* + ///Notify clients about group replication state changes + /// + ///| @ref Mysqlx::Notice::Frame Field | Value | + ///|-----------------------------------|------------| + ///|``.type`` | 4 | + ///|``.scope`` | ``global`` | + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class GroupReplicationStateChanged : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new GroupReplicationStateChanged()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Notice.MysqlxNoticeReflection.Descriptor.MessageTypes[4]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public GroupReplicationStateChanged() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public GroupReplicationStateChanged(GroupReplicationStateChanged other) : this() + { + _hasBits0 = other._hasBits0; + type_ = other.type_; + viewId_ = other.viewId_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public GroupReplicationStateChanged Clone() + { + return new GroupReplicationStateChanged(this); + } + + /// Field number for the "type" field. + public const int TypeFieldNumber = 1; + private readonly static uint TypeDefaultValue = 0; + + private uint type_; + /// + ///* type of group replication event + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint Type + { + get { if ((_hasBits0 & 1) != 0) { return type_; } else { return TypeDefaultValue; } } + set + { + _hasBits0 |= 1; + type_ = value; + } + } + /// Gets whether the "type" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasType + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "type" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearType() + { + _hasBits0 &= ~1; + } + + /// Field number for the "view_id" field. + public const int ViewIdFieldNumber = 2; + private readonly static string ViewIdDefaultValue = ""; + + private string viewId_; + /// + ///* view identifier + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string ViewId + { + get { return viewId_ ?? ViewIdDefaultValue; } + set + { + viewId_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "view_id" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasViewId + { + get { return viewId_ != null; } + } + /// Clears the value of the "view_id" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearViewId() + { + viewId_ = null; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as GroupReplicationStateChanged); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(GroupReplicationStateChanged other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (Type != other.Type) return false; + if (ViewId != other.ViewId) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasType) hash ^= Type.GetHashCode(); + if (HasViewId) hash ^= ViewId.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasType) { + output.WriteRawTag(8); + output.WriteUInt32(Type); + } + if (HasViewId) { + output.WriteRawTag(18); + output.WriteString(ViewId); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasType) + { + output.WriteRawTag(8); + output.WriteUInt32(Type); + } + if (HasViewId) + { + output.WriteRawTag(18); + output.WriteString(ViewId); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasType) + { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Type); + } + if (HasViewId) + { + size += 1 + pb::CodedOutputStream.ComputeStringSize(ViewId); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(GroupReplicationStateChanged other) + { + if (other == null) + { + return; + } + if (other.HasType) + { + Type = other.Type; + } + if (other.HasViewId) + { + ViewId = other.ViewId; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + Type = input.ReadUInt32(); + break; + } + case 18: { + ViewId = input.ReadString(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: + { + Type = input.ReadUInt32(); + break; + } + case 18: + { + ViewId = input.ReadString(); + break; + } + } + } + } +#endif + + #region Nested types + /// Container for nested types declared in the GroupReplicationStateChanged message type. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static partial class Types + { + public enum Type + { + [pbr::OriginalName("MEMBERSHIP_QUORUM_LOSS")] MembershipQuorumLoss = 1, + [pbr::OriginalName("MEMBERSHIP_VIEW_CHANGE")] MembershipViewChange = 2, + [pbr::OriginalName("MEMBER_ROLE_CHANGE")] MemberRoleChange = 3, + [pbr::OriginalName("MEMBER_STATE_CHANGE")] MemberStateChange = 4, + } + + } + #endregion + + } + + /// + ///* + ///Notify clients about connection to X Protocol server + /// + ///| @ref Mysqlx::Notice::Frame Field | Value | + ///|-----------------------------------|------------| + ///|``.type`` | 5 | + ///|``.scope`` | ``global`` | + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class ServerHello : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new ServerHello()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Notice.MysqlxNoticeReflection.Descriptor.MessageTypes[5]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ServerHello() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ServerHello(ServerHello other) : this() + { + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ServerHello Clone() + { + return new ServerHello(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as ServerHello); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(ServerHello other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(ServerHello other) + { + if (other == null) + { + return; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + } + } + } +#endif + + } + + #endregion + +} + +#endregion Designer generated code diff --git a/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxPrepare.cs b/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxPrepare.cs new file mode 100644 index 000000000..aec5a7492 --- /dev/null +++ b/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxPrepare.cs @@ -0,0 +1,1590 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +// +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: mysqlx_prepare.proto +// +#pragma warning disable 1591, 0612, 3021, 8981 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace Mysqlx.Prepare +{ + + /// Holder for reflection information generated from mysqlx_prepare.proto + public static partial class MysqlxPrepareReflection + { + + #region Descriptor + /// File descriptor for mysqlx_prepare.proto + public static pbr::FileDescriptor Descriptor + { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static MysqlxPrepareReflection() + { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "ChRteXNxbHhfcHJlcGFyZS5wcm90bxIOTXlzcWx4LlByZXBhcmUaDG15c3Fs", + "eC5wcm90bxoQbXlzcWx4X3NxbC5wcm90bxoRbXlzcWx4X2NydWQucHJvdG8a", + "Fm15c3FseF9kYXRhdHlwZXMucHJvdG8inQMKB1ByZXBhcmUSDwoHc3RtdF9p", + "ZBgBIAIoDRIyCgRzdG10GAIgAigLMiQuTXlzcWx4LlByZXBhcmUuUHJlcGFy", + "ZS5PbmVPZk1lc3NhZ2UaxgIKDE9uZU9mTWVzc2FnZRI3CgR0eXBlGAEgAigO", + "MikuTXlzcWx4LlByZXBhcmUuUHJlcGFyZS5PbmVPZk1lc3NhZ2UuVHlwZRIf", + "CgRmaW5kGAIgASgLMhEuTXlzcWx4LkNydWQuRmluZBIjCgZpbnNlcnQYAyAB", + "KAsyEy5NeXNxbHguQ3J1ZC5JbnNlcnQSIwoGdXBkYXRlGAQgASgLMhMuTXlz", + "cWx4LkNydWQuVXBkYXRlEiMKBmRlbGV0ZRgFIAEoCzITLk15c3FseC5DcnVk", + "LkRlbGV0ZRItCgxzdG10X2V4ZWN1dGUYBiABKAsyFy5NeXNxbHguU3FsLlN0", + "bXRFeGVjdXRlIj4KBFR5cGUSCAoERklORBAAEgoKBklOU0VSVBABEgoKBlVQ", + "REFURRACEgoKBkRFTEVURRAEEggKBFNUTVQQBToEiOowKCJmCgdFeGVjdXRl", + "Eg8KB3N0bXRfaWQYASACKA0SIwoEYXJncxgCIAMoCzIVLk15c3FseC5EYXRh", + "dHlwZXMuQW55Eh8KEGNvbXBhY3RfbWV0YWRhdGEYAyABKAg6BWZhbHNlOgSI", + "6jApIiMKCkRlYWxsb2NhdGUSDwoHc3RtdF9pZBgBIAIoDToEiOowKkIZChdj", + "b20ubXlzcWwuY2oueC5wcm90b2J1Zg==")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { global::Mysqlx.MysqlxReflection.Descriptor, global::Mysqlx.Sql.MysqlxSqlReflection.Descriptor, global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor, global::Mysqlx.Datatypes.MysqlxDatatypesReflection.Descriptor, }, + new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Prepare.Prepare), global::Mysqlx.Prepare.Prepare.Parser, new[]{ "StmtId", "Stmt" }, null, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Prepare.Prepare.Types.OneOfMessage), global::Mysqlx.Prepare.Prepare.Types.OneOfMessage.Parser, new[]{ "Type", "Find", "Insert", "Update", "Delete", "StmtExecute" }, null, new[]{ typeof(global::Mysqlx.Prepare.Prepare.Types.OneOfMessage.Types.Type) }, null, null)}), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Prepare.Execute), global::Mysqlx.Prepare.Execute.Parser, new[]{ "StmtId", "Args", "CompactMetadata" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Prepare.Deallocate), global::Mysqlx.Prepare.Deallocate.Parser, new[]{ "StmtId" }, null, null, null, null) + })); + } + #endregion + + } + #region Messages + /// + ///* + ///Prepare a new statement + /// + ///@startuml + ///client -> server: Prepare + ///alt Success + ///client <- server: Ok + ///else Failure + ///client <- server: Error + ///end + ///@enduml + /// + ///@returns @ref Mysqlx::Ok or @ref Mysqlx::Error + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Prepare : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Prepare()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Prepare.MysqlxPrepareReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Prepare() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Prepare(Prepare other) : this() + { + _hasBits0 = other._hasBits0; + stmtId_ = other.stmtId_; + stmt_ = other.stmt_ != null ? other.stmt_.Clone() : null; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Prepare Clone() + { + return new Prepare(this); + } + + /// Field number for the "stmt_id" field. + public const int StmtIdFieldNumber = 1; + private readonly static uint StmtIdDefaultValue = 0; + + private uint stmtId_; + /// + ///* client-side assigned statement ID, which is going to identify + ///the result of preparation + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint StmtId + { + get { if ((_hasBits0 & 1) != 0) { return stmtId_; } else { return StmtIdDefaultValue; } } + set + { + _hasBits0 |= 1; + stmtId_ = value; + } + } + /// Gets whether the "stmt_id" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasStmtId + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "stmt_id" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearStmtId() + { + _hasBits0 &= ~1; + } + + /// Field number for the "stmt" field. + public const int StmtFieldNumber = 2; + private global::Mysqlx.Prepare.Prepare.Types.OneOfMessage stmt_; + /// + ///* defines one of following messages to be prepared: + ///Crud::Find, Crud::Insert, Crud::Delete, Crud::Upsert, Sql::StmtExecute + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Prepare.Prepare.Types.OneOfMessage Stmt + { + get { return stmt_; } + set + { + stmt_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Prepare); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Prepare other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (StmtId != other.StmtId) return false; + if (!object.Equals(Stmt, other.Stmt)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasStmtId) hash ^= StmtId.GetHashCode(); + if (stmt_ != null) hash ^= Stmt.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasStmtId) { + output.WriteRawTag(8); + output.WriteUInt32(StmtId); + } + if (stmt_ != null) { + output.WriteRawTag(18); + output.WriteMessage(Stmt); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasStmtId) + { + output.WriteRawTag(8); + output.WriteUInt32(StmtId); + } + if (stmt_ != null) + { + output.WriteRawTag(18); + output.WriteMessage(Stmt); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasStmtId) + { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(StmtId); + } + if (stmt_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Stmt); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Prepare other) + { + if (other == null) + { + return; + } + if (other.HasStmtId) + { + StmtId = other.StmtId; + } + if (other.stmt_ != null) + { + if (stmt_ == null) + { + Stmt = new global::Mysqlx.Prepare.Prepare.Types.OneOfMessage(); + } + Stmt.MergeFrom(other.Stmt); + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + StmtId = input.ReadUInt32(); + break; + } + case 18: { + if (stmt_ == null) { + Stmt = new global::Mysqlx.Prepare.Prepare.Types.OneOfMessage(); + } + input.ReadMessage(Stmt); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: + { + StmtId = input.ReadUInt32(); + break; + } + case 18: + { + if (stmt_ == null) + { + Stmt = new global::Mysqlx.Prepare.Prepare.Types.OneOfMessage(); + } + input.ReadMessage(Stmt); + break; + } + } + } + } +#endif + + #region Nested types + /// Container for nested types declared in the Prepare message type. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static partial class Types + { + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class OneOfMessage : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new OneOfMessage()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Prepare.Prepare.Descriptor.NestedTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public OneOfMessage() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public OneOfMessage(OneOfMessage other) : this() + { + _hasBits0 = other._hasBits0; + type_ = other.type_; + find_ = other.find_ != null ? other.find_.Clone() : null; + insert_ = other.insert_ != null ? other.insert_.Clone() : null; + update_ = other.update_ != null ? other.update_.Clone() : null; + delete_ = other.delete_ != null ? other.delete_.Clone() : null; + stmtExecute_ = other.stmtExecute_ != null ? other.stmtExecute_.Clone() : null; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public OneOfMessage Clone() + { + return new OneOfMessage(this); + } + + /// Field number for the "type" field. + public const int TypeFieldNumber = 1; + private readonly static global::Mysqlx.Prepare.Prepare.Types.OneOfMessage.Types.Type TypeDefaultValue = global::Mysqlx.Prepare.Prepare.Types.OneOfMessage.Types.Type.Find; + + private global::Mysqlx.Prepare.Prepare.Types.OneOfMessage.Types.Type type_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Prepare.Prepare.Types.OneOfMessage.Types.Type Type + { + get { if ((_hasBits0 & 1) != 0) { return type_; } else { return TypeDefaultValue; } } + set + { + _hasBits0 |= 1; + type_ = value; + } + } + /// Gets whether the "type" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasType + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "type" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearType() + { + _hasBits0 &= ~1; + } + + /// Field number for the "find" field. + public const int FindFieldNumber = 2; + private global::Mysqlx.Crud.Find find_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.Find Find + { + get { return find_; } + set + { + find_ = value; + } + } + + /// Field number for the "insert" field. + public const int InsertFieldNumber = 3; + private global::Mysqlx.Crud.Insert insert_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.Insert Insert + { + get { return insert_; } + set + { + insert_ = value; + } + } + + /// Field number for the "update" field. + public const int UpdateFieldNumber = 4; + private global::Mysqlx.Crud.Update update_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.Update Update + { + get { return update_; } + set + { + update_ = value; + } + } + + /// Field number for the "delete" field. + public const int DeleteFieldNumber = 5; + private global::Mysqlx.Crud.Delete delete_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Crud.Delete Delete + { + get { return delete_; } + set + { + delete_ = value; + } + } + + /// Field number for the "stmt_execute" field. + public const int StmtExecuteFieldNumber = 6; + private global::Mysqlx.Sql.StmtExecute stmtExecute_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Sql.StmtExecute StmtExecute + { + get { return stmtExecute_; } + set + { + stmtExecute_ = value; + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as OneOfMessage); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(OneOfMessage other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (Type != other.Type) return false; + if (!object.Equals(Find, other.Find)) return false; + if (!object.Equals(Insert, other.Insert)) return false; + if (!object.Equals(Update, other.Update)) return false; + if (!object.Equals(Delete, other.Delete)) return false; + if (!object.Equals(StmtExecute, other.StmtExecute)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasType) hash ^= Type.GetHashCode(); + if (find_ != null) hash ^= Find.GetHashCode(); + if (insert_ != null) hash ^= Insert.GetHashCode(); + if (update_ != null) hash ^= Update.GetHashCode(); + if (delete_ != null) hash ^= Delete.GetHashCode(); + if (stmtExecute_ != null) hash ^= StmtExecute.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasType) { + output.WriteRawTag(8); + output.WriteEnum((int) Type); + } + if (find_ != null) { + output.WriteRawTag(18); + output.WriteMessage(Find); + } + if (insert_ != null) { + output.WriteRawTag(26); + output.WriteMessage(Insert); + } + if (update_ != null) { + output.WriteRawTag(34); + output.WriteMessage(Update); + } + if (delete_ != null) { + output.WriteRawTag(42); + output.WriteMessage(Delete); + } + if (stmtExecute_ != null) { + output.WriteRawTag(50); + output.WriteMessage(StmtExecute); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasType) + { + output.WriteRawTag(8); + output.WriteEnum((int)Type); + } + if (find_ != null) + { + output.WriteRawTag(18); + output.WriteMessage(Find); + } + if (insert_ != null) + { + output.WriteRawTag(26); + output.WriteMessage(Insert); + } + if (update_ != null) + { + output.WriteRawTag(34); + output.WriteMessage(Update); + } + if (delete_ != null) + { + output.WriteRawTag(42); + output.WriteMessage(Delete); + } + if (stmtExecute_ != null) + { + output.WriteRawTag(50); + output.WriteMessage(StmtExecute); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasType) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Type); + } + if (find_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Find); + } + if (insert_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Insert); + } + if (update_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Update); + } + if (delete_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(Delete); + } + if (stmtExecute_ != null) + { + size += 1 + pb::CodedOutputStream.ComputeMessageSize(StmtExecute); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(OneOfMessage other) + { + if (other == null) + { + return; + } + if (other.HasType) + { + Type = other.Type; + } + if (other.find_ != null) + { + if (find_ == null) + { + Find = new global::Mysqlx.Crud.Find(); + } + Find.MergeFrom(other.Find); + } + if (other.insert_ != null) + { + if (insert_ == null) + { + Insert = new global::Mysqlx.Crud.Insert(); + } + Insert.MergeFrom(other.Insert); + } + if (other.update_ != null) + { + if (update_ == null) + { + Update = new global::Mysqlx.Crud.Update(); + } + Update.MergeFrom(other.Update); + } + if (other.delete_ != null) + { + if (delete_ == null) + { + Delete = new global::Mysqlx.Crud.Delete(); + } + Delete.MergeFrom(other.Delete); + } + if (other.stmtExecute_ != null) + { + if (stmtExecute_ == null) + { + StmtExecute = new global::Mysqlx.Sql.StmtExecute(); + } + StmtExecute.MergeFrom(other.StmtExecute); + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + Type = (global::Mysqlx.Prepare.Prepare.Types.OneOfMessage.Types.Type) input.ReadEnum(); + break; + } + case 18: { + if (find_ == null) { + Find = new global::Mysqlx.Crud.Find(); + } + input.ReadMessage(Find); + break; + } + case 26: { + if (insert_ == null) { + Insert = new global::Mysqlx.Crud.Insert(); + } + input.ReadMessage(Insert); + break; + } + case 34: { + if (update_ == null) { + Update = new global::Mysqlx.Crud.Update(); + } + input.ReadMessage(Update); + break; + } + case 42: { + if (delete_ == null) { + Delete = new global::Mysqlx.Crud.Delete(); + } + input.ReadMessage(Delete); + break; + } + case 50: { + if (stmtExecute_ == null) { + StmtExecute = new global::Mysqlx.Sql.StmtExecute(); + } + input.ReadMessage(StmtExecute); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: + { + Type = (global::Mysqlx.Prepare.Prepare.Types.OneOfMessage.Types.Type)input.ReadEnum(); + break; + } + case 18: + { + if (find_ == null) + { + Find = new global::Mysqlx.Crud.Find(); + } + input.ReadMessage(Find); + break; + } + case 26: + { + if (insert_ == null) + { + Insert = new global::Mysqlx.Crud.Insert(); + } + input.ReadMessage(Insert); + break; + } + case 34: + { + if (update_ == null) + { + Update = new global::Mysqlx.Crud.Update(); + } + input.ReadMessage(Update); + break; + } + case 42: + { + if (delete_ == null) + { + Delete = new global::Mysqlx.Crud.Delete(); + } + input.ReadMessage(Delete); + break; + } + case 50: + { + if (stmtExecute_ == null) + { + StmtExecute = new global::Mysqlx.Sql.StmtExecute(); + } + input.ReadMessage(StmtExecute); + break; + } + } + } + } +#endif + + #region Nested types + /// Container for nested types declared in the OneOfMessage message type. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static partial class Types + { + /// + /// Determine which of optional fields was set by the client + /// (Workaround for missing "oneof" keyword in pb2.5) + /// + public enum Type + { + [pbr::OriginalName("FIND")] Find = 0, + [pbr::OriginalName("INSERT")] Insert = 1, + [pbr::OriginalName("UPDATE")] Update = 2, + [pbr::OriginalName("DELETE")] Delete = 4, + [pbr::OriginalName("STMT")] Stmt = 5, + } + + } + #endregion + + } + + } + #endregion + + } + + /// + ///* + ///Execute already-prepared statement + /// + ///@startuml + /// + ///client -> server: Execute + ///alt Success + ///... Resultsets... + ///client <- server: StmtExecuteOk + ///else Failure + ///client <- server: Error + ///end + ///@enduml + ///@returns @ref Mysqlx::Ok + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Execute : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Execute()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Prepare.MysqlxPrepareReflection.Descriptor.MessageTypes[1]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Execute() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Execute(Execute other) : this() + { + _hasBits0 = other._hasBits0; + stmtId_ = other.stmtId_; + args_ = other.args_.Clone(); + compactMetadata_ = other.compactMetadata_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Execute Clone() + { + return new Execute(this); + } + + /// Field number for the "stmt_id" field. + public const int StmtIdFieldNumber = 1; + private readonly static uint StmtIdDefaultValue = 0; + + private uint stmtId_; + /// + ///* client-side assigned statement ID, must be already prepared + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint StmtId + { + get { if ((_hasBits0 & 1) != 0) { return stmtId_; } else { return StmtIdDefaultValue; } } + set + { + _hasBits0 |= 1; + stmtId_ = value; + } + } + /// Gets whether the "stmt_id" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasStmtId + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "stmt_id" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearStmtId() + { + _hasBits0 &= ~1; + } + + /// Field number for the "args" field. + public const int ArgsFieldNumber = 2; + private static readonly pb::FieldCodec _repeated_args_codec + = pb::FieldCodec.ForMessage(18, global::Mysqlx.Datatypes.Any.Parser); + private readonly pbc::RepeatedField args_ = new pbc::RepeatedField(); + /// + ///* Arguments to bind to the prepared statement + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Args + { + get { return args_; } + } + + /// Field number for the "compact_metadata" field. + public const int CompactMetadataFieldNumber = 3; + private readonly static bool CompactMetadataDefaultValue = false; + + private bool compactMetadata_; + /// + ///* send only type information for + ///@ref Mysqlx::Resultset::ColumnMetaData, skipping names and others + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool CompactMetadata + { + get { if ((_hasBits0 & 2) != 0) { return compactMetadata_; } else { return CompactMetadataDefaultValue; } } + set + { + _hasBits0 |= 2; + compactMetadata_ = value; + } + } + /// Gets whether the "compact_metadata" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasCompactMetadata + { + get { return (_hasBits0 & 2) != 0; } + } + /// Clears the value of the "compact_metadata" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearCompactMetadata() + { + _hasBits0 &= ~2; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Execute); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Execute other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (StmtId != other.StmtId) return false; + if (!args_.Equals(other.args_)) return false; + if (CompactMetadata != other.CompactMetadata) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasStmtId) hash ^= StmtId.GetHashCode(); + hash ^= args_.GetHashCode(); + if (HasCompactMetadata) hash ^= CompactMetadata.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasStmtId) { + output.WriteRawTag(8); + output.WriteUInt32(StmtId); + } + args_.WriteTo(output, _repeated_args_codec); + if (HasCompactMetadata) { + output.WriteRawTag(24); + output.WriteBool(CompactMetadata); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasStmtId) + { + output.WriteRawTag(8); + output.WriteUInt32(StmtId); + } + args_.WriteTo(ref output, _repeated_args_codec); + if (HasCompactMetadata) + { + output.WriteRawTag(24); + output.WriteBool(CompactMetadata); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasStmtId) + { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(StmtId); + } + size += args_.CalculateSize(_repeated_args_codec); + if (HasCompactMetadata) + { + size += 1 + 1; + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Execute other) + { + if (other == null) + { + return; + } + if (other.HasStmtId) + { + StmtId = other.StmtId; + } + args_.Add(other.args_); + if (other.HasCompactMetadata) + { + CompactMetadata = other.CompactMetadata; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + StmtId = input.ReadUInt32(); + break; + } + case 18: { + args_.AddEntriesFrom(input, _repeated_args_codec); + break; + } + case 24: { + CompactMetadata = input.ReadBool(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: + { + StmtId = input.ReadUInt32(); + break; + } + case 18: + { + args_.AddEntriesFrom(ref input, _repeated_args_codec); + break; + } + case 24: + { + CompactMetadata = input.ReadBool(); + break; + } + } + } + } +#endif + + } + + /// + ///* + ///Deallocate already-prepared statement + /// + ///@startuml + ///client -> server: Deallocate + ///alt Success + ///client <- server: Ok + ///else Failure + ///client <- server: Error + ///end + ///@enduml + /// + ///@returns @ref Mysqlx::Ok or @ref Mysqlx::Error + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Deallocate : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Deallocate()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Prepare.MysqlxPrepareReflection.Descriptor.MessageTypes[2]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Deallocate() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Deallocate(Deallocate other) : this() + { + _hasBits0 = other._hasBits0; + stmtId_ = other.stmtId_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Deallocate Clone() + { + return new Deallocate(this); + } + + /// Field number for the "stmt_id" field. + public const int StmtIdFieldNumber = 1; + private readonly static uint StmtIdDefaultValue = 0; + + private uint stmtId_; + /// + ///* client-side assigned statement ID, must be already prepared + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint StmtId + { + get { if ((_hasBits0 & 1) != 0) { return stmtId_; } else { return StmtIdDefaultValue; } } + set + { + _hasBits0 |= 1; + stmtId_ = value; + } + } + /// Gets whether the "stmt_id" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasStmtId + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "stmt_id" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearStmtId() + { + _hasBits0 &= ~1; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Deallocate); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Deallocate other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (StmtId != other.StmtId) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasStmtId) hash ^= StmtId.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasStmtId) { + output.WriteRawTag(8); + output.WriteUInt32(StmtId); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasStmtId) + { + output.WriteRawTag(8); + output.WriteUInt32(StmtId); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasStmtId) + { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(StmtId); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Deallocate other) + { + if (other == null) + { + return; + } + if (other.HasStmtId) + { + StmtId = other.StmtId; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + StmtId = input.ReadUInt32(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: + { + StmtId = input.ReadUInt32(); + break; + } + } + } + } +#endif + + } + + #endregion + +} + +#endregion Designer generated code + diff --git a/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxResultset.cs b/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxResultset.cs new file mode 100644 index 000000000..909bf01e1 --- /dev/null +++ b/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxResultset.cs @@ -0,0 +1,2436 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +// +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: mysqlx_resultset.proto +// +#pragma warning disable 1591, 0612, 3021, 8981 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace Mysqlx.Resultset +{ + + /// Holder for reflection information generated from mysqlx_resultset.proto + public static partial class MysqlxResultsetReflection + { + + #region Descriptor + /// File descriptor for mysqlx_resultset.proto + public static pbr::FileDescriptor Descriptor + { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static MysqlxResultsetReflection() + { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "ChZteXNxbHhfcmVzdWx0c2V0LnByb3RvEhBNeXNxbHguUmVzdWx0c2V0Ggxt", + "eXNxbHgucHJvdG8iHgoWRmV0Y2hEb25lTW9yZU91dFBhcmFtczoEkOowEiIf", + "ChdGZXRjaERvbmVNb3JlUmVzdWx0c2V0czoEkOowECIRCglGZXRjaERvbmU6", + "BJDqMA4iFgoORmV0Y2hTdXNwZW5kZWQ6BJDqMA8ipQMKDkNvbHVtbk1ldGFE", + "YXRhEjgKBHR5cGUYASACKA4yKi5NeXNxbHguUmVzdWx0c2V0LkNvbHVtbk1l", + "dGFEYXRhLkZpZWxkVHlwZRIMCgRuYW1lGAIgASgMEhUKDW9yaWdpbmFsX25h", + "bWUYAyABKAwSDQoFdGFibGUYBCABKAwSFgoOb3JpZ2luYWxfdGFibGUYBSAB", + "KAwSDgoGc2NoZW1hGAYgASgMEg8KB2NhdGFsb2cYByABKAwSEQoJY29sbGF0", + "aW9uGAggASgEEhkKEWZyYWN0aW9uYWxfZGlnaXRzGAkgASgNEg4KBmxlbmd0", + "aBgKIAEoDRINCgVmbGFncxgLIAEoDRIUCgxjb250ZW50X3R5cGUYDCABKA0i", + "ggEKCUZpZWxkVHlwZRIICgRTSU5UEAESCAoEVUlOVBACEgoKBkRPVUJMRRAF", + "EgkKBUZMT0FUEAYSCQoFQllURVMQBxIICgRUSU1FEAoSDAoIREFURVRJTUUQ", + "DBIHCgNTRVQQDxIICgRFTlVNEBASBwoDQklUEBESCwoHREVDSU1BTBASOgSQ", + "6jAMIhoKA1JvdxINCgVmaWVsZBgBIAMoDDoEkOowDSo0ChFDb250ZW50VHlw", + "ZV9CWVRFUxIMCghHRU9NRVRSWRABEggKBEpTT04QAhIHCgNYTUwQAyouChRD", + "b250ZW50VHlwZV9EQVRFVElNRRIICgREQVRFEAESDAoIREFURVRJTUUQAkIZ", + "Chdjb20ubXlzcWwuY2oueC5wcm90b2J1Zg==")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { global::Mysqlx.MysqlxReflection.Descriptor, }, + new pbr::GeneratedClrTypeInfo(new[] { typeof(global::Mysqlx.Resultset.ContentType_BYTES), typeof(global::Mysqlx.Resultset.ContentType_DATETIME), }, null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Resultset.FetchDoneMoreOutParams), global::Mysqlx.Resultset.FetchDoneMoreOutParams.Parser, null, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Resultset.FetchDoneMoreResultsets), global::Mysqlx.Resultset.FetchDoneMoreResultsets.Parser, null, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Resultset.FetchDone), global::Mysqlx.Resultset.FetchDone.Parser, null, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Resultset.FetchSuspended), global::Mysqlx.Resultset.FetchSuspended.Parser, null, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Resultset.ColumnMetaData), global::Mysqlx.Resultset.ColumnMetaData.Parser, new[]{ "Type", "Name", "OriginalName", "Table", "OriginalTable", "Schema", "Catalog", "Collation", "FractionalDigits", "Length", "Flags", "ContentType" }, null, new[]{ typeof(global::Mysqlx.Resultset.ColumnMetaData.Types.FieldType) }, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Resultset.Row), global::Mysqlx.Resultset.Row.Parser, new[]{ "Field" }, null, null, null, null) + })); + } + #endregion + + } + #region Enums + /// + ///* + ///A hint about the higher-level encoding of a BYTES field + /// + ///|type | value | description | + ///|------| -------|-------------------------| + ///|BYTES | 0x0001 | GEOMETRY (WKB encoding) | + ///|BYTES | 0x0002 | JSON (text encoding) | + ///|BYTES | 0x0003 | XML (text encoding) | + /// + ///@note + ///this list isn't comprehensive. As a guideline: the field's value is expected + ///to pass a validator check on client and server if this field is set. + ///If the server adds more internal datatypes that rely on BLOB storage + ///like image manipulation, seeking into complex types in BLOBs, ... more + ///types will be added. + /// + public enum ContentType_BYTES + { + [pbr::OriginalName("GEOMETRY")] Geometry = 1, + [pbr::OriginalName("JSON")] Json = 2, + [pbr::OriginalName("XML")] Xml = 3, + } + + /// + ///* + ///A hint about the higher-level encoding of a DATETIME field + /// + ///|type |value |description | + ///|---------|-------|-------------------------------------------| + ///|DATE |0x0001 |DATETIME contains only date part | + ///|DATETIME |0x0002 |DATETIME contains both date and time parts | + /// + public enum ContentType_DATETIME + { + [pbr::OriginalName("DATE")] Date = 1, + [pbr::OriginalName("DATETIME")] Datetime = 2, + } + + #endregion + + #region Messages + /// + ///* + ///Resultsets are finished, OUT paramset is next: + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class FetchDoneMoreOutParams : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new FetchDoneMoreOutParams()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Resultset.MysqlxResultsetReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public FetchDoneMoreOutParams() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public FetchDoneMoreOutParams(FetchDoneMoreOutParams other) : this() + { + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public FetchDoneMoreOutParams Clone() + { + return new FetchDoneMoreOutParams(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as FetchDoneMoreOutParams); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(FetchDoneMoreOutParams other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(FetchDoneMoreOutParams other) + { + if (other == null) + { + return; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + } + } + } +#endif + + } + + /// + ///* + ///Resultset and out-params are finished, but more resultsets available + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class FetchDoneMoreResultsets : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new FetchDoneMoreResultsets()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Resultset.MysqlxResultsetReflection.Descriptor.MessageTypes[1]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public FetchDoneMoreResultsets() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public FetchDoneMoreResultsets(FetchDoneMoreResultsets other) : this() + { + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public FetchDoneMoreResultsets Clone() + { + return new FetchDoneMoreResultsets(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as FetchDoneMoreResultsets); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(FetchDoneMoreResultsets other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(FetchDoneMoreResultsets other) + { + if (other == null) + { + return; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + } + } + } +#endif + + } + + /// + ///* + ///All resultsets are finished + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class FetchDone : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new FetchDone()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Resultset.MysqlxResultsetReflection.Descriptor.MessageTypes[2]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public FetchDone() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public FetchDone(FetchDone other) : this() + { + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public FetchDone Clone() + { + return new FetchDone(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as FetchDone); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(FetchDone other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(FetchDone other) + { + if (other == null) + { + return; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + } + } + } +#endif + + } + + /// + ///* + ///Cursor is opened; still, the execution of PrepFetch or PrepExecute ended + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class FetchSuspended : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new FetchSuspended()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Resultset.MysqlxResultsetReflection.Descriptor.MessageTypes[3]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public FetchSuspended() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public FetchSuspended(FetchSuspended other) : this() + { + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public FetchSuspended Clone() + { + return new FetchSuspended(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as FetchSuspended); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(FetchSuspended other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(FetchSuspended other) + { + if (other == null) + { + return; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + } + } + } +#endif + + } + + /// + ///* + ///Meta data of a column + /// + ///@note + ///The encoding used for the different ``bytes`` fields in the + ///meta data is externally controlled. See also: + ///https://dev.mysql.com/doc/refman/5.0/en/charset-connection.html + /// + ///@par + ///@note + ///The server may not set the ``original_{table|name}`` fields + ///if they are equal to the plain ``{table|name}`` field. + /// + ///@par + ///@note + ///A client has to reconstruct it like: + ///@code{py} + ///if .original_name is empty and .name is not empty: + ///.original_name = .name + /// + ///if .original_table is empty and .table is not empty: + ///.original_table = .table + ///@endcode + /// + ///@par + ///@note + ///``Compact metadata format`` can be requested by the client. + ///In that case, only ``.type`` is set and all other fields are empty. + /// + ///Expected data type of Mysqlx.Resultset.Row per SQL Type for + ///non-NULL values: + /// + ///| SQL Type | .type | .length | .frac\_dig | .flags | .charset | + ///|-------------------|-----------|---------|------------|--------|----------| + ///| TINY | SINT | x | | | | + ///| TINY UNSIGNED | UINT | x | | x | | + ///| SHORT | SINT | x | | | | + ///| SHORT UNSIGNED | UINT | x | | x | | + ///| INT24 | SINT | x | | | | + ///| INT24 UNSIGNED | UINT | x | | x | | + ///| INT | SINT | x | | | | + ///| INT UNSIGNED | UINT | x | | x | | + ///| LONGLONG | SINT | x | | | | + ///| LONGLONG UNSIGNED | UINT | x | | x | | + ///| DOUBLE | DOUBLE | x | x | x | | + ///| FLOAT | FLOAT | x | x | x | | + ///| DECIMAL | DECIMAL | x | x | x | | + ///| VARCHAR,CHAR,... | BYTES | x | | x | x | + ///| GEOMETRY | BYTES | | | | | + ///| TIME | TIME | x | | | | + ///| DATE | DATETIME | x | | | | + ///| DATETIME | DATETIME | x | | | | + ///| YEAR | UINT | x | | x | | + ///| TIMESTAMP | DATETIME | x | | | | + ///| SET | SET | | | | x | + ///| ENUM | ENUM | | | | x | + ///| NULL | BYTES | | | | | + ///| BIT | BIT | x | | | | + /// + ///@note + ///The SQL "NULL" value is sent as an empty field value in + ///@ref Mysqlx::Resultset::Row. + /// + ///@par Tip + ///The protobuf encoding of primitive data types is described in + ///https://developers.google.com/protocol-buffers/docs/encoding + /// + ///+ SINT + /// + ///- ``.length`` @n + ///Maximum number of displayable decimal digits (including + ///minus sign) of the type. + ///@note + ///The valid range is 0-255, but usually you'll see 1-20. + /// + ///| SQL Type | Maximum Digits per Type | + ///|------------------|-------------------------| + ///| TINY SIGNED | 4 | + ///| SHORT SIGNED | 6 | + ///| INT24 SIGNED | 8 | + ///| INT SIGNED | 11 | + ///| LONGLONG SIGNED | 20 | + /// + ///@par Tip + ///Definition of ``M`` are in + ///https://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html. + /// + ///- ``value``@n + ///Variable length encoded signed 64 integer. + /// + ///+ UINT + /// + ///- ``.flags & 1`` (zerofill) @n + ///The client has to left pad with 0's up to .length. + /// + ///- ``.length`` @n + ///Maximum number of displayable decimal digits of the + ///type. + ///@note + ///The valid range is 0-255, but usually you'll see + ///1-20. + /// + ///| SQL Type | max digits per type | + ///|----------------------|---------------------| + ///| TINY UNSIGNED | 3 | + ///| SHORT UNSIGNED | 5 | + ///| INT24 UNSIGNED | 8 | + ///| INT UNSIGNED | 10 | + ///| LONGLONG UNSIGNED | 20 | + /// + ///@par Tip + ///Definition of ``M`` are in + ///https://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html. + /// + ///- ``value`` @n + ///Variable length encoded unsigned 64 integer. + /// + ///+ BIT + /// + ///- ``.length`` @n + ///Maximum number of displayable binary digits. + ///@note + ///The valid range for M of the ``BIT`` type is 1 - 64. + /// + ///@par Tip + ///https://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html + /// + ///- ``value`` @n + ///Variable length encoded unsigned 64 integer. + /// + ///+ DOUBLE + /// + ///- ``.length`` @n + ///Maximum number of displayable decimal digits (including + ///the decimal point and ``.fractional_digits``). + /// + ///- ``.fractional_digits`` @n + ///Maximum number of displayable decimal digits following + ///the decimal point. + /// + ///- ``value``@n + ///Encoded as protobuf's 'double'. + /// + ///+ FLOAT + /// + ///- ``.length``@n + ///Maximum number of displayable decimal digits (including + ///the decimal point and ``.fractional_digits``). + /// + ///- ``.fractional_digits``@n + ///Maximum number of displayable decimal digits following + ///the decimal point. + /// + ///- ``value``@n + ///Encoded as protobuf's 'float'. + /// + ///+ BYTES, ENUM + ///@note + ///BYTES is used for all opaque byte strings that may have a charset: + ///- TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB + ///- TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT + ///- VARCHAR, VARBINARY + ///- CHAR, BINARY + ///- ENUM + /// + ///- ``.length``@n + ///Maximum length of characters of the underlying type. + /// + ///- ``.flags & 1`` (rightpad) @n + ///If the length of the field is less than ``.length``, the + ///receiver is supposed to add padding characters to the + ///right end of the string. If the ``.charset`` is + ///"binary", the padding character is ``0x00``, otherwise + ///it is a space character as defined by that character + ///set. + ///| SQL Type | .length | .charset | .flags | + ///|---------------|----------|-----------|----------| + ///| TINYBLOB | 256 | binary | | + ///| BLOB | 65535 | binary | | + ///| VARCHAR(32) | 32 | utf8 | | + ///| VARBINARY(32) | 32 | utf8\_bin | | + ///| BINARY(32) | 32 | binary | rightpad | + ///| CHAR(32) | 32 | utf8 | rightpad | + /// + ///- ``value`` + ///Sequence of bytes with added one extra ``0x00`` byte at + ///the end. To obtain the original string, the extra + ///``0x00`` should be removed. The length of the string can + ///be acquired with protobuf's field ``length()`` method: + /// + ///``length of sequence-of-bytes = length-of-field - 1`` + ///@note + ///The extra byte allows to distinguish between a NULL + ///and empty byte sequence. + /// + ///+ TIME + /// + ///A time value. + /// + ///- ``value``@n + ///The following bytes sequence: + /// + ///``negate [ hour [ minutes [ seconds [ useconds ]]]]`` + /// + ///- negate - one byte, should be one of: 0x00 for "+", + ///0x01 for "-" + /// + ///- hour - optional variable length encoded unsigned64 + ///value for the hour + /// + ///- minutes - optional variable length encoded unsigned64 + ///value for the minutes + /// + ///- seconds - optional variable length encoded unsigned64 + ///value for the seconds + /// + ///- useconds - optional variable length encoded + ///unsigned64 value for the microseconds + /// + ///@par Tip + ///The protobuf encoding in + ///https://developers.google.com/protocol-buffers/docs/encoding. + /// + ///@note + ///Hour, minutes, seconds, and useconds are optional if + ///all the values to the right are 0. + /// + ///Example: ``0x00 -> +00:00:00.000000`` + /// + ///+ DATETIME + /// + ///A date or date and time value. + /// + ///- ``value`` @n + ///A sequence of variants, arranged as follows: + /// + ///``| year | month | day | [ | hour | [ | minutes | [ | seconds | [ | useconds | ]]]]`` + /// + ///- year - variable length encoded unsigned64 value for + ///the year + /// + ///- month - variable length encoded unsigned64 value for + ///the month + /// + ///- day - variable length encoded unsigned64 value for + ///the day + /// + ///- hour - optional variable length encoded unsigned64 + ///value for the hour + /// + ///- minutes - optional variable length encoded unsigned64 + ///value for the minutes + /// + ///- seconds - optional variable length encoded unsigned64 + ///value for the seconds + /// + ///- useconds - optional variable length encoded + ///unsigned64 value for the microseconds + ///@note + ///Hour, minutes, seconds, useconds are optional if all + ///the values to the right are 0. + /// + ///- ``.flags``@n + ///| Name | Position | + ///|---------------|----------| + ///| is\_timestamp | 1 | + /// + ///+ DECIMAL + /// + ///An arbitrary length number. The number is encoded as a + ///single byte indicating the position of the decimal point + ///followed by the Packed BCD encoded number. Packed BCD is + ///used to simplify conversion to and from strings and other + ///native arbitrary precision math data types. See also: packed + ///BCD in https://en.wikipedia.org/wiki/Binary-coded_decimal + /// + ///- ``.length`` + ///Maximum number of displayable decimal digits + ///(*excluding* the decimal point and sign, but including + ///``.fractional_digits``). + ///@note + ///Should be in the range of 1 - 65. + /// + ///- ``.fractional_digits`` + ///The decimal digits to display out of length. + ///@note + ///Should be in the range of 0 - 30. + /// + ///``value`` + ///The following bytes sequence: + /// + ///``scale | BCD+ sign [0x00]?`` + /// + ///- scale - 8bit scale value (number of decimal digit after the '.') + /// + ///- BCD - BCD encoded digits (4 bits for each digit) + /// + ///- sign - sign encoded on 4 bits (0xc = "+", 0xd = "-") + /// + ///- 0x0 - last 4bits if length(digits) % 2 == 0 + /// + ///Example: ``x04 0x12 0x34 0x01 + ///0xd0 -> -12.3401`` + /// + ///+ SET + /// + ///A list of strings representing a SET of values. + /// + ///- ``value``@n + ///A sequence of 0 or more of protobuf's bytes (length + ///prepended octets) or one of the special sequences with a + ///predefined meaning listed below. + /// + ///Example (length of the bytes array shown in brackets): + ///- ``[0]`` - the NULL value + /// + ///- ``[1] 0x00`` - a set containing a blank string '' + /// + ///- ``[1] 0x01`` - this would be an invalid value, + ///but is to be treated as the empty set + /// + ///- ``[2] 0x01 0x00`` - a set with a single item, which is the '0' + ///character + /// + ///- ``[8] 0x03 F O O 0x03 B A R`` - a set with 2 items: FOO,BAR + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class ColumnMetaData : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new ColumnMetaData()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Resultset.MysqlxResultsetReflection.Descriptor.MessageTypes[4]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ColumnMetaData() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ColumnMetaData(ColumnMetaData other) : this() + { + _hasBits0 = other._hasBits0; + type_ = other.type_; + name_ = other.name_; + originalName_ = other.originalName_; + table_ = other.table_; + originalTable_ = other.originalTable_; + schema_ = other.schema_; + catalog_ = other.catalog_; + collation_ = other.collation_; + fractionalDigits_ = other.fractionalDigits_; + length_ = other.length_; + flags_ = other.flags_; + contentType_ = other.contentType_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ColumnMetaData Clone() + { + return new ColumnMetaData(this); + } + + /// Field number for the "type" field. + public const int TypeFieldNumber = 1; + private readonly static global::Mysqlx.Resultset.ColumnMetaData.Types.FieldType TypeDefaultValue = global::Mysqlx.Resultset.ColumnMetaData.Types.FieldType.Sint; + + private global::Mysqlx.Resultset.ColumnMetaData.Types.FieldType type_; + /// + ///* datatype of the field in a row + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::Mysqlx.Resultset.ColumnMetaData.Types.FieldType Type + { + get { if ((_hasBits0 & 1) != 0) { return type_; } else { return TypeDefaultValue; } } + set + { + _hasBits0 |= 1; + type_ = value; + } + } + /// Gets whether the "type" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasType + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "type" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearType() + { + _hasBits0 &= ~1; + } + + /// Field number for the "name" field. + public const int NameFieldNumber = 2; + private readonly static pb::ByteString NameDefaultValue = pb::ByteString.Empty; + + private pb::ByteString name_; + /// + ///* name of the column + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pb::ByteString Name + { + get { return name_ ?? NameDefaultValue; } + set + { + name_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "name" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasName + { + get { return name_ != null; } + } + /// Clears the value of the "name" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearName() + { + name_ = null; + } + + /// Field number for the "original_name" field. + public const int OriginalNameFieldNumber = 3; + private readonly static pb::ByteString OriginalNameDefaultValue = pb::ByteString.Empty; + + private pb::ByteString originalName_; + /// + ///* name of the column before an alias was applied + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pb::ByteString OriginalName + { + get { return originalName_ ?? OriginalNameDefaultValue; } + set + { + originalName_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "original_name" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasOriginalName + { + get { return originalName_ != null; } + } + /// Clears the value of the "original_name" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearOriginalName() + { + originalName_ = null; + } + + /// Field number for the "table" field. + public const int TableFieldNumber = 4; + private readonly static pb::ByteString TableDefaultValue = pb::ByteString.Empty; + + private pb::ByteString table_; + /// + ///* name of the table the column originates from + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pb::ByteString Table + { + get { return table_ ?? TableDefaultValue; } + set + { + table_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "table" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasTable + { + get { return table_ != null; } + } + /// Clears the value of the "table" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearTable() + { + table_ = null; + } + + /// Field number for the "original_table" field. + public const int OriginalTableFieldNumber = 5; + private readonly static pb::ByteString OriginalTableDefaultValue = pb::ByteString.Empty; + + private pb::ByteString originalTable_; + /// + ///* name of the table the column originates from before an alias was applied + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pb::ByteString OriginalTable + { + get { return originalTable_ ?? OriginalTableDefaultValue; } + set + { + originalTable_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "original_table" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasOriginalTable + { + get { return originalTable_ != null; } + } + /// Clears the value of the "original_table" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearOriginalTable() + { + originalTable_ = null; + } + + /// Field number for the "schema" field. + public const int SchemaFieldNumber = 6; + private readonly static pb::ByteString SchemaDefaultValue = pb::ByteString.Empty; + + private pb::ByteString schema_; + /// + ///* schema the column originates from + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pb::ByteString Schema + { + get { return schema_ ?? SchemaDefaultValue; } + set + { + schema_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "schema" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasSchema + { + get { return schema_ != null; } + } + /// Clears the value of the "schema" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearSchema() + { + schema_ = null; + } + + /// Field number for the "catalog" field. + public const int CatalogFieldNumber = 7; + private readonly static pb::ByteString CatalogDefaultValue = pb::ByteString.Empty; + + private pb::ByteString catalog_; + /// + ///* catalog the schema originates from + ///@note + ///As there is currently no support for catalogs in MySQL, + ///don't expect this field to be set. In the MySQL C/S + ///protocol the field had the value ``def`` all the time + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pb::ByteString Catalog + { + get { return catalog_ ?? CatalogDefaultValue; } + set + { + catalog_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "catalog" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasCatalog + { + get { return catalog_ != null; } + } + /// Clears the value of the "catalog" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearCatalog() + { + catalog_ = null; + } + + /// Field number for the "collation" field. + public const int CollationFieldNumber = 8; + private readonly static ulong CollationDefaultValue = 0UL; + + private ulong collation_; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public ulong Collation + { + get { if ((_hasBits0 & 2) != 0) { return collation_; } else { return CollationDefaultValue; } } + set + { + _hasBits0 |= 2; + collation_ = value; + } + } + /// Gets whether the "collation" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasCollation + { + get { return (_hasBits0 & 2) != 0; } + } + /// Clears the value of the "collation" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearCollation() + { + _hasBits0 &= ~2; + } + + /// Field number for the "fractional_digits" field. + public const int FractionalDigitsFieldNumber = 9; + private readonly static uint FractionalDigitsDefaultValue = 0; + + private uint fractionalDigits_; + /// + ///* displayed factional decimal digits for floating point and + ///fixed point numbers + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint FractionalDigits + { + get { if ((_hasBits0 & 4) != 0) { return fractionalDigits_; } else { return FractionalDigitsDefaultValue; } } + set + { + _hasBits0 |= 4; + fractionalDigits_ = value; + } + } + /// Gets whether the "fractional_digits" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasFractionalDigits + { + get { return (_hasBits0 & 4) != 0; } + } + /// Clears the value of the "fractional_digits" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearFractionalDigits() + { + _hasBits0 &= ~4; + } + + /// Field number for the "length" field. + public const int LengthFieldNumber = 10; + private readonly static uint LengthDefaultValue = 0; + + private uint length_; + /// + ///* maximum count of displayable characters of .type + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint Length + { + get { if ((_hasBits0 & 8) != 0) { return length_; } else { return LengthDefaultValue; } } + set + { + _hasBits0 |= 8; + length_ = value; + } + } + /// Gets whether the "length" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasLength + { + get { return (_hasBits0 & 8) != 0; } + } + /// Clears the value of the "length" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearLength() + { + _hasBits0 &= ~8; + } + + /// Field number for the "flags" field. + public const int FlagsFieldNumber = 11; + private readonly static uint FlagsDefaultValue = 0; + + private uint flags_; + /// + ///* ``.type`` specific flags + ///| Type | Value | Description | + ///|---------|--------|--------------| + ///| UINT | 0x0001 | zerofill | + ///| DOUBLE | 0x0001 | unsigned | + ///| FLOAT | 0x0001 | unsigned | + ///| DECIMAL | 0x0001 | unsigned | + ///| BYTES | 0x0001 | rightpad | + /// + ///| Value | Description | + ///|--------|-----------------| + ///| 0x0010 | NOT\_NULL | + ///| 0x0020 | PRIMARY\_KEY | + ///| 0x0040 | UNIQUE\_KEY | + ///| 0x0080 | MULTIPLE\_KEY | + ///| 0x0100 | AUTO\_INCREMENT | + /// + ///default: 0 + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint Flags + { + get { if ((_hasBits0 & 16) != 0) { return flags_; } else { return FlagsDefaultValue; } } + set + { + _hasBits0 |= 16; + flags_ = value; + } + } + /// Gets whether the "flags" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasFlags + { + get { return (_hasBits0 & 16) != 0; } + } + /// Clears the value of the "flags" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearFlags() + { + _hasBits0 &= ~16; + } + + /// Field number for the "content_type" field. + public const int ContentTypeFieldNumber = 12; + private readonly static uint ContentTypeDefaultValue = 0; + + private uint contentType_; + /// + ///* a hint about the higher-level encoding of a BYTES field + ///| Type | Value | Description | + ///|--------|--------|-------------------------| + ///| BYTES | 0x0001 | GEOMETRY (WKB encoding) | + ///| BYTES | 0x0002 | JSON (text encoding) | + ///| BYTES | 0x0003 | XML (text encoding) | + ///@note + ///This list isn't comprehensive. As a guideline: the field's + ///value is expected to pass a validator check on client + ///and server if this field is set. If the server adds more + ///internal data types that rely on BLOB storage like image + ///manipulation, seeking into complex types in BLOBs, and + ///more types will be added + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public uint ContentType + { + get { if ((_hasBits0 & 32) != 0) { return contentType_; } else { return ContentTypeDefaultValue; } } + set + { + _hasBits0 |= 32; + contentType_ = value; + } + } + /// Gets whether the "content_type" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasContentType + { + get { return (_hasBits0 & 32) != 0; } + } + /// Clears the value of the "content_type" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearContentType() + { + _hasBits0 &= ~32; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as ColumnMetaData); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(ColumnMetaData other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (Type != other.Type) return false; + if (Name != other.Name) return false; + if (OriginalName != other.OriginalName) return false; + if (Table != other.Table) return false; + if (OriginalTable != other.OriginalTable) return false; + if (Schema != other.Schema) return false; + if (Catalog != other.Catalog) return false; + if (Collation != other.Collation) return false; + if (FractionalDigits != other.FractionalDigits) return false; + if (Length != other.Length) return false; + if (Flags != other.Flags) return false; + if (ContentType != other.ContentType) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasType) hash ^= Type.GetHashCode(); + if (HasName) hash ^= Name.GetHashCode(); + if (HasOriginalName) hash ^= OriginalName.GetHashCode(); + if (HasTable) hash ^= Table.GetHashCode(); + if (HasOriginalTable) hash ^= OriginalTable.GetHashCode(); + if (HasSchema) hash ^= Schema.GetHashCode(); + if (HasCatalog) hash ^= Catalog.GetHashCode(); + if (HasCollation) hash ^= Collation.GetHashCode(); + if (HasFractionalDigits) hash ^= FractionalDigits.GetHashCode(); + if (HasLength) hash ^= Length.GetHashCode(); + if (HasFlags) hash ^= Flags.GetHashCode(); + if (HasContentType) hash ^= ContentType.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasType) { + output.WriteRawTag(8); + output.WriteEnum((int) Type); + } + if (HasName) { + output.WriteRawTag(18); + output.WriteBytes(Name); + } + if (HasOriginalName) { + output.WriteRawTag(26); + output.WriteBytes(OriginalName); + } + if (HasTable) { + output.WriteRawTag(34); + output.WriteBytes(Table); + } + if (HasOriginalTable) { + output.WriteRawTag(42); + output.WriteBytes(OriginalTable); + } + if (HasSchema) { + output.WriteRawTag(50); + output.WriteBytes(Schema); + } + if (HasCatalog) { + output.WriteRawTag(58); + output.WriteBytes(Catalog); + } + if (HasCollation) { + output.WriteRawTag(64); + output.WriteUInt64(Collation); + } + if (HasFractionalDigits) { + output.WriteRawTag(72); + output.WriteUInt32(FractionalDigits); + } + if (HasLength) { + output.WriteRawTag(80); + output.WriteUInt32(Length); + } + if (HasFlags) { + output.WriteRawTag(88); + output.WriteUInt32(Flags); + } + if (HasContentType) { + output.WriteRawTag(96); + output.WriteUInt32(ContentType); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasType) + { + output.WriteRawTag(8); + output.WriteEnum((int)Type); + } + if (HasName) + { + output.WriteRawTag(18); + output.WriteBytes(Name); + } + if (HasOriginalName) + { + output.WriteRawTag(26); + output.WriteBytes(OriginalName); + } + if (HasTable) + { + output.WriteRawTag(34); + output.WriteBytes(Table); + } + if (HasOriginalTable) + { + output.WriteRawTag(42); + output.WriteBytes(OriginalTable); + } + if (HasSchema) + { + output.WriteRawTag(50); + output.WriteBytes(Schema); + } + if (HasCatalog) + { + output.WriteRawTag(58); + output.WriteBytes(Catalog); + } + if (HasCollation) + { + output.WriteRawTag(64); + output.WriteUInt64(Collation); + } + if (HasFractionalDigits) + { + output.WriteRawTag(72); + output.WriteUInt32(FractionalDigits); + } + if (HasLength) + { + output.WriteRawTag(80); + output.WriteUInt32(Length); + } + if (HasFlags) + { + output.WriteRawTag(88); + output.WriteUInt32(Flags); + } + if (HasContentType) + { + output.WriteRawTag(96); + output.WriteUInt32(ContentType); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasType) + { + size += 1 + pb::CodedOutputStream.ComputeEnumSize((int)Type); + } + if (HasName) + { + size += 1 + pb::CodedOutputStream.ComputeBytesSize(Name); + } + if (HasOriginalName) + { + size += 1 + pb::CodedOutputStream.ComputeBytesSize(OriginalName); + } + if (HasTable) + { + size += 1 + pb::CodedOutputStream.ComputeBytesSize(Table); + } + if (HasOriginalTable) + { + size += 1 + pb::CodedOutputStream.ComputeBytesSize(OriginalTable); + } + if (HasSchema) + { + size += 1 + pb::CodedOutputStream.ComputeBytesSize(Schema); + } + if (HasCatalog) + { + size += 1 + pb::CodedOutputStream.ComputeBytesSize(Catalog); + } + if (HasCollation) + { + size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Collation); + } + if (HasFractionalDigits) + { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(FractionalDigits); + } + if (HasLength) + { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Length); + } + if (HasFlags) + { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Flags); + } + if (HasContentType) + { + size += 1 + pb::CodedOutputStream.ComputeUInt32Size(ContentType); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(ColumnMetaData other) + { + if (other == null) + { + return; + } + if (other.HasType) + { + Type = other.Type; + } + if (other.HasName) + { + Name = other.Name; + } + if (other.HasOriginalName) + { + OriginalName = other.OriginalName; + } + if (other.HasTable) + { + Table = other.Table; + } + if (other.HasOriginalTable) + { + OriginalTable = other.OriginalTable; + } + if (other.HasSchema) + { + Schema = other.Schema; + } + if (other.HasCatalog) + { + Catalog = other.Catalog; + } + if (other.HasCollation) + { + Collation = other.Collation; + } + if (other.HasFractionalDigits) + { + FractionalDigits = other.FractionalDigits; + } + if (other.HasLength) + { + Length = other.Length; + } + if (other.HasFlags) + { + Flags = other.Flags; + } + if (other.HasContentType) + { + ContentType = other.ContentType; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + Type = (global::Mysqlx.Resultset.ColumnMetaData.Types.FieldType) input.ReadEnum(); + break; + } + case 18: { + Name = input.ReadBytes(); + break; + } + case 26: { + OriginalName = input.ReadBytes(); + break; + } + case 34: { + Table = input.ReadBytes(); + break; + } + case 42: { + OriginalTable = input.ReadBytes(); + break; + } + case 50: { + Schema = input.ReadBytes(); + break; + } + case 58: { + Catalog = input.ReadBytes(); + break; + } + case 64: { + Collation = input.ReadUInt64(); + break; + } + case 72: { + FractionalDigits = input.ReadUInt32(); + break; + } + case 80: { + Length = input.ReadUInt32(); + break; + } + case 88: { + Flags = input.ReadUInt32(); + break; + } + case 96: { + ContentType = input.ReadUInt32(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: + { + Type = (global::Mysqlx.Resultset.ColumnMetaData.Types.FieldType)input.ReadEnum(); + break; + } + case 18: + { + Name = input.ReadBytes(); + break; + } + case 26: + { + OriginalName = input.ReadBytes(); + break; + } + case 34: + { + Table = input.ReadBytes(); + break; + } + case 42: + { + OriginalTable = input.ReadBytes(); + break; + } + case 50: + { + Schema = input.ReadBytes(); + break; + } + case 58: + { + Catalog = input.ReadBytes(); + break; + } + case 64: + { + Collation = input.ReadUInt64(); + break; + } + case 72: + { + FractionalDigits = input.ReadUInt32(); + break; + } + case 80: + { + Length = input.ReadUInt32(); + break; + } + case 88: + { + Flags = input.ReadUInt32(); + break; + } + case 96: + { + ContentType = input.ReadUInt32(); + break; + } + } + } + } +#endif + + #region Nested types + /// Container for nested types declared in the ColumnMetaData message type. + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static partial class Types + { + public enum FieldType + { + [pbr::OriginalName("SINT")] Sint = 1, + [pbr::OriginalName("UINT")] Uint = 2, + [pbr::OriginalName("DOUBLE")] Double = 5, + [pbr::OriginalName("FLOAT")] Float = 6, + [pbr::OriginalName("BYTES")] Bytes = 7, + [pbr::OriginalName("TIME")] Time = 10, + [pbr::OriginalName("DATETIME")] Datetime = 12, + [pbr::OriginalName("SET")] Set = 15, + [pbr::OriginalName("ENUM")] Enum = 16, + [pbr::OriginalName("BIT")] Bit = 17, + [pbr::OriginalName("DECIMAL")] Decimal = 18, + } + + } + #endregion + + } + + /// + ///* + ///Row in a Resultset. + /// + ///A row is represented as a list of fields encoded as byte blobs. + ///Value of each field is encoded as sequence of bytes using + ///encoding appropriate for the type of the value given by + ///``ColumnMetadata``, as specified in the @ref Mysqlx::Resultset::ColumnMetaData + ///description. + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Row : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Row()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Resultset.MysqlxResultsetReflection.Descriptor.MessageTypes[5]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Row() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Row(Row other) : this() + { + field_ = other.field_.Clone(); + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Row Clone() + { + return new Row(this); + } + + /// Field number for the "field" field. + public const int FieldFieldNumber = 1; + private static readonly pb::FieldCodec _repeated_field_codec + = pb::FieldCodec.ForBytes(10); + private readonly pbc::RepeatedField field_ = new pbc::RepeatedField(); + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Field + { + get { return field_; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Row); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Row other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (!field_.Equals(other.field_)) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + hash ^= field_.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + field_.WriteTo(output, _repeated_field_codec); + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + field_.WriteTo(ref output, _repeated_field_codec); + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + size += field_.CalculateSize(_repeated_field_codec); + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Row other) + { + if (other == null) + { + return; + } + field_.Add(other.field_); + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + field_.AddEntriesFrom(input, _repeated_field_codec); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + field_.AddEntriesFrom(ref input, _repeated_field_codec); + break; + } + } + } + } +#endif + + } + + #endregion + +} + +#endregion Designer generated code + diff --git a/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxSession.cs b/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxSession.cs new file mode 100644 index 000000000..6a3c0f640 --- /dev/null +++ b/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxSession.cs @@ -0,0 +1,1417 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +// +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: mysqlx_session.proto +// +#pragma warning disable 1591, 0612, 3021, 8981 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace Mysqlx.Session +{ + + /// Holder for reflection information generated from mysqlx_session.proto + public static partial class MysqlxSessionReflection + { + + #region Descriptor + /// File descriptor for mysqlx_session.proto + public static pbr::FileDescriptor Descriptor + { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static MysqlxSessionReflection() + { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "ChRteXNxbHhfc2Vzc2lvbi5wcm90bxIOTXlzcWx4LlNlc3Npb24aDG15c3Fs", + "eC5wcm90byJZChFBdXRoZW50aWNhdGVTdGFydBIRCgltZWNoX25hbWUYASAC", + "KAkSEQoJYXV0aF9kYXRhGAIgASgMEhgKEGluaXRpYWxfcmVzcG9uc2UYAyAB", + "KAw6BIjqMAQiMwoUQXV0aGVudGljYXRlQ29udGludWUSEQoJYXV0aF9kYXRh", + "GAEgAigMOgiI6jAFkOowAyIpCg5BdXRoZW50aWNhdGVPaxIRCglhdXRoX2Rh", + "dGEYASABKAw6BJDqMAQiJwoFUmVzZXQSGAoJa2VlcF9vcGVuGAEgASgIOgVm", + "YWxzZToEiOowBiINCgVDbG9zZToEiOowB0IZChdjb20ubXlzcWwuY2oueC5w", + "cm90b2J1Zg==")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { global::Mysqlx.MysqlxReflection.Descriptor, }, + new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Session.AuthenticateStart), global::Mysqlx.Session.AuthenticateStart.Parser, new[]{ "MechName", "AuthData", "InitialResponse" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Session.AuthenticateContinue), global::Mysqlx.Session.AuthenticateContinue.Parser, new[]{ "AuthData" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Session.AuthenticateOk), global::Mysqlx.Session.AuthenticateOk.Parser, new[]{ "AuthData" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Session.Reset), global::Mysqlx.Session.Reset.Parser, new[]{ "KeepOpen" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Session.Close), global::Mysqlx.Session.Close.Parser, null, null, null, null, null) + })); + } + #endregion + + } + #region Messages + /// + ///* + ///The initial message send from the client to the server to start + ///the authentication process. + /// + ///@returns @ref Mysqlx::Session::AuthenticateContinue + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class AuthenticateStart : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new AuthenticateStart()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Session.MysqlxSessionReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public AuthenticateStart() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public AuthenticateStart(AuthenticateStart other) : this() + { + mechName_ = other.mechName_; + authData_ = other.authData_; + initialResponse_ = other.initialResponse_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public AuthenticateStart Clone() + { + return new AuthenticateStart(this); + } + + /// Field number for the "mech_name" field. + public const int MechNameFieldNumber = 1; + private readonly static string MechNameDefaultValue = ""; + + private string mechName_; + /// + ///* authentication mechanism name + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string MechName + { + get { return mechName_ ?? MechNameDefaultValue; } + set + { + mechName_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "mech_name" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasMechName + { + get { return mechName_ != null; } + } + /// Clears the value of the "mech_name" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearMechName() + { + mechName_ = null; + } + + /// Field number for the "auth_data" field. + public const int AuthDataFieldNumber = 2; + private readonly static pb::ByteString AuthDataDefaultValue = pb::ByteString.Empty; + + private pb::ByteString authData_; + /// + ///* authentication data + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pb::ByteString AuthData + { + get { return authData_ ?? AuthDataDefaultValue; } + set + { + authData_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "auth_data" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasAuthData + { + get { return authData_ != null; } + } + /// Clears the value of the "auth_data" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearAuthData() + { + authData_ = null; + } + + /// Field number for the "initial_response" field. + public const int InitialResponseFieldNumber = 3; + private readonly static pb::ByteString InitialResponseDefaultValue = pb::ByteString.Empty; + + private pb::ByteString initialResponse_; + /// + ///* initial response + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pb::ByteString InitialResponse + { + get { return initialResponse_ ?? InitialResponseDefaultValue; } + set + { + initialResponse_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "initial_response" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasInitialResponse + { + get { return initialResponse_ != null; } + } + /// Clears the value of the "initial_response" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearInitialResponse() + { + initialResponse_ = null; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as AuthenticateStart); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(AuthenticateStart other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (MechName != other.MechName) return false; + if (AuthData != other.AuthData) return false; + if (InitialResponse != other.InitialResponse) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasMechName) hash ^= MechName.GetHashCode(); + if (HasAuthData) hash ^= AuthData.GetHashCode(); + if (HasInitialResponse) hash ^= InitialResponse.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasMechName) { + output.WriteRawTag(10); + output.WriteString(MechName); + } + if (HasAuthData) { + output.WriteRawTag(18); + output.WriteBytes(AuthData); + } + if (HasInitialResponse) { + output.WriteRawTag(26); + output.WriteBytes(InitialResponse); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasMechName) + { + output.WriteRawTag(10); + output.WriteString(MechName); + } + if (HasAuthData) + { + output.WriteRawTag(18); + output.WriteBytes(AuthData); + } + if (HasInitialResponse) + { + output.WriteRawTag(26); + output.WriteBytes(InitialResponse); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasMechName) + { + size += 1 + pb::CodedOutputStream.ComputeStringSize(MechName); + } + if (HasAuthData) + { + size += 1 + pb::CodedOutputStream.ComputeBytesSize(AuthData); + } + if (HasInitialResponse) + { + size += 1 + pb::CodedOutputStream.ComputeBytesSize(InitialResponse); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(AuthenticateStart other) + { + if (other == null) + { + return; + } + if (other.HasMechName) + { + MechName = other.MechName; + } + if (other.HasAuthData) + { + AuthData = other.AuthData; + } + if (other.HasInitialResponse) + { + InitialResponse = other.InitialResponse; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + MechName = input.ReadString(); + break; + } + case 18: { + AuthData = input.ReadBytes(); + break; + } + case 26: { + InitialResponse = input.ReadBytes(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + MechName = input.ReadString(); + break; + } + case 18: + { + AuthData = input.ReadBytes(); + break; + } + case 26: + { + InitialResponse = input.ReadBytes(); + break; + } + } + } + } +#endif + + } + + /// + ///* + ///Send by client or server after an @ref Mysqlx::Session::AuthenticateStart + ///to exchange more authentication data. + /// + ///@returns Mysqlx::Session::AuthenticateContinue + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class AuthenticateContinue : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new AuthenticateContinue()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Session.MysqlxSessionReflection.Descriptor.MessageTypes[1]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public AuthenticateContinue() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public AuthenticateContinue(AuthenticateContinue other) : this() + { + authData_ = other.authData_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public AuthenticateContinue Clone() + { + return new AuthenticateContinue(this); + } + + /// Field number for the "auth_data" field. + public const int AuthDataFieldNumber = 1; + private readonly static pb::ByteString AuthDataDefaultValue = pb::ByteString.Empty; + + private pb::ByteString authData_; + /// + ///* authentication data + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pb::ByteString AuthData + { + get { return authData_ ?? AuthDataDefaultValue; } + set + { + authData_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "auth_data" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasAuthData + { + get { return authData_ != null; } + } + /// Clears the value of the "auth_data" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearAuthData() + { + authData_ = null; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as AuthenticateContinue); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(AuthenticateContinue other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (AuthData != other.AuthData) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasAuthData) hash ^= AuthData.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasAuthData) { + output.WriteRawTag(10); + output.WriteBytes(AuthData); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasAuthData) + { + output.WriteRawTag(10); + output.WriteBytes(AuthData); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasAuthData) + { + size += 1 + pb::CodedOutputStream.ComputeBytesSize(AuthData); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(AuthenticateContinue other) + { + if (other == null) + { + return; + } + if (other.HasAuthData) + { + AuthData = other.AuthData; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + AuthData = input.ReadBytes(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + AuthData = input.ReadBytes(); + break; + } + } + } + } +#endif + + } + + /// + ///* + ///Sent by the server after successful authentication. + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class AuthenticateOk : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new AuthenticateOk()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Session.MysqlxSessionReflection.Descriptor.MessageTypes[2]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public AuthenticateOk() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public AuthenticateOk(AuthenticateOk other) : this() + { + authData_ = other.authData_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public AuthenticateOk Clone() + { + return new AuthenticateOk(this); + } + + /// Field number for the "auth_data" field. + public const int AuthDataFieldNumber = 1; + private readonly static pb::ByteString AuthDataDefaultValue = pb::ByteString.Empty; + + private pb::ByteString authData_; + /// + ///* authentication data + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pb::ByteString AuthData + { + get { return authData_ ?? AuthDataDefaultValue; } + set + { + authData_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "auth_data" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasAuthData + { + get { return authData_ != null; } + } + /// Clears the value of the "auth_data" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearAuthData() + { + authData_ = null; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as AuthenticateOk); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(AuthenticateOk other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (AuthData != other.AuthData) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasAuthData) hash ^= AuthData.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasAuthData) { + output.WriteRawTag(10); + output.WriteBytes(AuthData); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasAuthData) + { + output.WriteRawTag(10); + output.WriteBytes(AuthData); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasAuthData) + { + size += 1 + pb::CodedOutputStream.ComputeBytesSize(AuthData); + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(AuthenticateOk other) + { + if (other == null) + { + return; + } + if (other.HasAuthData) + { + AuthData = other.AuthData; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + AuthData = input.ReadBytes(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + AuthData = input.ReadBytes(); + break; + } + } + } + } +#endif + + } + + /// + ///* + ///Reset the current session. + /// + ///@returns @ref Mysqlx::Ok + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Reset : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Reset()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Session.MysqlxSessionReflection.Descriptor.MessageTypes[3]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Reset() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Reset(Reset other) : this() + { + _hasBits0 = other._hasBits0; + keepOpen_ = other.keepOpen_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Reset Clone() + { + return new Reset(this); + } + + /// Field number for the "keep_open" field. + public const int KeepOpenFieldNumber = 1; + private readonly static bool KeepOpenDefaultValue = false; + + private bool keepOpen_; + /// + ///* if is true the session will be reset, but stays authenticated; otherwise, + ///the session will be closed and needs to be authenticated again + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool KeepOpen + { + get { if ((_hasBits0 & 1) != 0) { return keepOpen_; } else { return KeepOpenDefaultValue; } } + set + { + _hasBits0 |= 1; + keepOpen_ = value; + } + } + /// Gets whether the "keep_open" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasKeepOpen + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "keep_open" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearKeepOpen() + { + _hasBits0 &= ~1; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Reset); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Reset other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (KeepOpen != other.KeepOpen) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasKeepOpen) hash ^= KeepOpen.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasKeepOpen) { + output.WriteRawTag(8); + output.WriteBool(KeepOpen); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasKeepOpen) + { + output.WriteRawTag(8); + output.WriteBool(KeepOpen); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasKeepOpen) + { + size += 1 + 1; + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Reset other) + { + if (other == null) + { + return; + } + if (other.HasKeepOpen) + { + KeepOpen = other.KeepOpen; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 8: { + KeepOpen = input.ReadBool(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 8: + { + KeepOpen = input.ReadBool(); + break; + } + } + } + } +#endif + + } + + /// + ///* + ///Close the current session. + /// + ///@returns @ref Mysqlx::Ok + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class Close : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Close()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Session.MysqlxSessionReflection.Descriptor.MessageTypes[4]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Close() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Close(Close other) : this() + { + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public Close Clone() + { + return new Close(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as Close); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(Close other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(Close other) + { + if (other == null) + { + return; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + } + } + } +#endif + + } + + #endregion + +} + +#endregion Designer generated code + diff --git a/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxSql.cs b/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxSql.cs new file mode 100644 index 000000000..825b21188 --- /dev/null +++ b/MySQL.Data/src/X/Protocol/X/Protobuf/MysqlxSql.cs @@ -0,0 +1,692 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +// +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: mysqlx_sql.proto +// +#pragma warning disable 1591, 0612, 3021, 8981 +#region Designer generated code + +using pb = global::Google.Protobuf; +using pbc = global::Google.Protobuf.Collections; +using pbr = global::Google.Protobuf.Reflection; +using scg = global::System.Collections.Generic; +namespace Mysqlx.Sql +{ + + /// Holder for reflection information generated from mysqlx_sql.proto + public static partial class MysqlxSqlReflection + { + + #region Descriptor + /// File descriptor for mysqlx_sql.proto + public static pbr::FileDescriptor Descriptor + { + get { return descriptor; } + } + private static pbr::FileDescriptor descriptor; + + static MysqlxSqlReflection() + { + byte[] descriptorData = global::System.Convert.FromBase64String( + string.Concat( + "ChBteXNxbHhfc3FsLnByb3RvEgpNeXNxbHguU3FsGgxteXNxbHgucHJvdG8a", + "Fm15c3FseF9kYXRhdHlwZXMucHJvdG8ifwoLU3RtdEV4ZWN1dGUSFgoJbmFt", + "ZXNwYWNlGAMgASgJOgNzcWwSDAoEc3RtdBgBIAIoDBIjCgRhcmdzGAIgAygL", + "MhUuTXlzcWx4LkRhdGF0eXBlcy5BbnkSHwoQY29tcGFjdF9tZXRhZGF0YRgE", + "IAEoCDoFZmFsc2U6BIjqMAwiFQoNU3RtdEV4ZWN1dGVPazoEkOowEUIZChdj", + "b20ubXlzcWwuY2oueC5wcm90b2J1Zg==")); + descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, + new pbr::FileDescriptor[] { global::Mysqlx.MysqlxReflection.Descriptor, global::Mysqlx.Datatypes.MysqlxDatatypesReflection.Descriptor, }, + new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] { + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Sql.StmtExecute), global::Mysqlx.Sql.StmtExecute.Parser, new[]{ "Namespace", "Stmt", "Args", "CompactMetadata" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Sql.StmtExecuteOk), global::Mysqlx.Sql.StmtExecuteOk.Parser, null, null, null, null, null) + })); + } + #endregion + + } + #region Messages + /// + /// + ///Execute a statement in the given namespace. + /// + ///@startuml "Execute Statements" + ///client -> server: StmtExecute + ///... zero or more Resultsets ... + ///server --> client: StmtExecuteOk + ///@enduml + /// + ///@notice This message may generate a notice containing WARNINGs generated by + ///its execution. This message may generate a notice containing INFO messages + ///generated by its execution. + /// + ///@returns zero or more @ref Mysqlx::Resultset followed by @ref Mysqlx::Sql::StmtExecuteOk + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class StmtExecute : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new StmtExecute()); + private pb::UnknownFieldSet _unknownFields; + private int _hasBits0; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Sql.MysqlxSqlReflection.Descriptor.MessageTypes[0]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public StmtExecute() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public StmtExecute(StmtExecute other) : this() + { + _hasBits0 = other._hasBits0; + namespace_ = other.namespace_; + stmt_ = other.stmt_; + args_ = other.args_.Clone(); + compactMetadata_ = other.compactMetadata_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public StmtExecute Clone() + { + return new StmtExecute(this); + } + + /// Field number for the "namespace" field. + public const int NamespaceFieldNumber = 3; + private readonly static string NamespaceDefaultValue = global::System.Text.Encoding.UTF8.GetString(global::System.Convert.FromBase64String("c3Fs"), 0, 3); + + private string namespace_; + /// + ///* namespace of the statement to be executed + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Namespace + { + get { return namespace_ ?? NamespaceDefaultValue; } + set + { + namespace_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "namespace" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasNamespace + { + get { return namespace_ != null; } + } + /// Clears the value of the "namespace" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearNamespace() + { + namespace_ = null; + } + + /// Field number for the "stmt" field. + public const int StmtFieldNumber = 1; + private readonly static pb::ByteString StmtDefaultValue = pb::ByteString.Empty; + + private pb::ByteString stmt_; + /// + ///* statement that shall be executed + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pb::ByteString Stmt + { + get { return stmt_ ?? StmtDefaultValue; } + set + { + stmt_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + /// Gets whether the "stmt" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasStmt + { + get { return stmt_ != null; } + } + /// Clears the value of the "stmt" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearStmt() + { + stmt_ = null; + } + + /// Field number for the "args" field. + public const int ArgsFieldNumber = 2; + private static readonly pb::FieldCodec _repeated_args_codec + = pb::FieldCodec.ForMessage(18, global::Mysqlx.Datatypes.Any.Parser); + private readonly pbc::RepeatedField args_ = new pbc::RepeatedField(); + /// + ///* values for wildcard replacements + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField Args + { + get { return args_; } + } + + /// Field number for the "compact_metadata" field. + public const int CompactMetadataFieldNumber = 4; + private readonly static bool CompactMetadataDefaultValue = false; + + private bool compactMetadata_; + /// + ///* send only type information for @ref Mysqlx::Resultset::ColumnMetaData, + ///skipping names and others + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool CompactMetadata + { + get { if ((_hasBits0 & 1) != 0) { return compactMetadata_; } else { return CompactMetadataDefaultValue; } } + set + { + _hasBits0 |= 1; + compactMetadata_ = value; + } + } + /// Gets whether the "compact_metadata" field is set + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool HasCompactMetadata + { + get { return (_hasBits0 & 1) != 0; } + } + /// Clears the value of the "compact_metadata" field + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void ClearCompactMetadata() + { + _hasBits0 &= ~1; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as StmtExecute); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(StmtExecute other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + if (Namespace != other.Namespace) return false; + if (Stmt != other.Stmt) return false; + if (!args_.Equals(other.args_)) return false; + if (CompactMetadata != other.CompactMetadata) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (HasNamespace) hash ^= Namespace.GetHashCode(); + if (HasStmt) hash ^= Stmt.GetHashCode(); + hash ^= args_.GetHashCode(); + if (HasCompactMetadata) hash ^= CompactMetadata.GetHashCode(); + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (HasStmt) { + output.WriteRawTag(10); + output.WriteBytes(Stmt); + } + args_.WriteTo(output, _repeated_args_codec); + if (HasNamespace) { + output.WriteRawTag(26); + output.WriteString(Namespace); + } + if (HasCompactMetadata) { + output.WriteRawTag(32); + output.WriteBool(CompactMetadata); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (HasStmt) + { + output.WriteRawTag(10); + output.WriteBytes(Stmt); + } + args_.WriteTo(ref output, _repeated_args_codec); + if (HasNamespace) + { + output.WriteRawTag(26); + output.WriteString(Namespace); + } + if (HasCompactMetadata) + { + output.WriteRawTag(32); + output.WriteBool(CompactMetadata); + } + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (HasNamespace) + { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Namespace); + } + if (HasStmt) + { + size += 1 + pb::CodedOutputStream.ComputeBytesSize(Stmt); + } + size += args_.CalculateSize(_repeated_args_codec); + if (HasCompactMetadata) + { + size += 1 + 1; + } + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(StmtExecute other) + { + if (other == null) + { + return; + } + if (other.HasNamespace) + { + Namespace = other.Namespace; + } + if (other.HasStmt) + { + Stmt = other.Stmt; + } + args_.Add(other.args_); + if (other.HasCompactMetadata) + { + CompactMetadata = other.CompactMetadata; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + Stmt = input.ReadBytes(); + break; + } + case 18: { + args_.AddEntriesFrom(input, _repeated_args_codec); + break; + } + case 26: { + Namespace = input.ReadString(); + break; + } + case 32: { + CompactMetadata = input.ReadBool(); + break; + } + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: + { + Stmt = input.ReadBytes(); + break; + } + case 18: + { + args_.AddEntriesFrom(ref input, _repeated_args_codec); + break; + } + case 26: + { + Namespace = input.ReadString(); + break; + } + case 32: + { + CompactMetadata = input.ReadBool(); + break; + } + } + } + } +#endif + + } + + /// + ///* + ///Statement executed successfully + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class StmtExecuteOk : pb::IMessage +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage +#endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new StmtExecuteOk()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor + { + get { return global::Mysqlx.Sql.MysqlxSqlReflection.Descriptor.MessageTypes[1]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor + { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public StmtExecuteOk() + { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public StmtExecuteOk(StmtExecuteOk other) : this() + { + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public StmtExecuteOk Clone() + { + return new StmtExecuteOk(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) + { + return Equals(other as StmtExecuteOk); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(StmtExecuteOk other) + { + if (ReferenceEquals(other, null)) + { + return false; + } + if (ReferenceEquals(other, this)) + { + return true; + } + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() + { + int hash = 1; + if (_unknownFields != null) + { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() + { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); +#else + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) + { + if (_unknownFields != null) + { + _unknownFields.WriteTo(ref output); + } + } +#endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() + { + int size = 0; + if (_unknownFields != null) + { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(StmtExecuteOk other) + { + if (other == null) + { + return; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) + { +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); +#else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + } + } +#endif + } + +#if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) + { + uint tag; + while ((tag = input.ReadTag()) != 0) + { + if ((tag & 7) == 4) + { + // Abort on any end group tag. + return; + } + switch (tag) + { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + } + } + } +#endif + + } + + #endregion + +} + +#endregion Designer generated code + diff --git a/MySQL.Data/src/X/Protocol/X/SetDecoder.cs b/MySQL.Data/src/X/Protocol/X/SetDecoder.cs new file mode 100644 index 000000000..e2262e6ca --- /dev/null +++ b/MySQL.Data/src/X/Protocol/X/SetDecoder.cs @@ -0,0 +1,74 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySql.Data.MySqlClient; +using MySql.Data.MySqlClient.X.XDevAPI.Common; +using System; +using System.Text; + +namespace MySqlX.Protocol.X +{ + internal class SetDecoder : ValueDecoder + { + private Encoding _encoding; + + public override void SetMetadata() + { + Column.Type = ColumnType.Set; + Column.ClrType = typeof(string); + ClrValueDecoder = DecodeValue; + + string charset = Column.CollationName.Split('_')[0]; + _encoding = CharSetMap.GetEncoding(charset); + } + + private object DecodeValue(byte[] bytes) + { + if (bytes == null || bytes.Length == 0) return null; + if (bytes.Length == 1 && bytes[0] == 0) return String.Empty; + if (bytes.Length == 1 && bytes[0] == 1) return String.Empty; + + StringBuilder sb = new StringBuilder(); + string delim = ""; + int len = bytes.Length; + int index = 0; + while (index < len - 1) + { + sb.Append(delim); + int strLen = bytes[index++]; + if ((index + strLen) > bytes.Length) + throw new MySqlException(ResourcesX.UnexpectedEndOfPacketFound); + sb.Append(_encoding.GetString(bytes, index, strLen)); + index += strLen; + delim = ","; + } + return sb.ToString(); + } + } +} diff --git a/MySQL.Data/src/X/Protocol/X/XDateTimeDecoder.cs b/MySQL.Data/src/X/Protocol/X/XDateTimeDecoder.cs new file mode 100644 index 000000000..2189fbe78 --- /dev/null +++ b/MySQL.Data/src/X/Protocol/X/XDateTimeDecoder.cs @@ -0,0 +1,77 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +using Google.Protobuf; +using MySql.Data.MySqlClient; +using MySql.Data.MySqlClient.X.XDevAPI.Common; +using MySqlX.Data; +using MySqlX.XDevAPI; +using System; + +namespace MySqlX.Protocol.X +{ + internal class XDateTimeDecoder : ValueDecoder + { + public override void SetMetadata() + { + Column.Type = GetDbType(); + Column.ClrType = typeof(DateTime); + ClrValueDecoder = ValueDecoder; + } + + private ColumnType GetDbType() + { + if ((Flags & 1) != 0) + return ColumnType.Timestamp; + if (Column.Length == 10) + return ColumnType.Date; + return ColumnType.DateTime; + } + + public object ValueDecoder(byte[] bytes) + { + CodedInputStream input = new CodedInputStream(bytes); + UInt64 year = 0, month = 0, day = 0; + Int64 hour = 0, min = 0, sec = 0, usec = 0; + + year = input.ReadUInt64(); + month = input.ReadUInt64(); + day = input.ReadUInt64(); + if (!input.IsAtEnd) + hour = input.ReadInt64(); + if (!input.IsAtEnd) + min = input.ReadInt64(); + if (!input.IsAtEnd) + sec = input.ReadInt64(); + if (!input.IsAtEnd) + usec = input.ReadInt64(); + return new DateTime((int)year, (int)month, (int)day, (int)hour, (int)min, (int)sec).AddTicks(usec * 10); + } + } +} diff --git a/MySQL.Data/src/X/Protocol/X/XProtocol.cs b/MySQL.Data/src/X/Protocol/X/XProtocol.cs new file mode 100644 index 000000000..4cd9cad42 --- /dev/null +++ b/MySQL.Data/src/X/Protocol/X/XProtocol.cs @@ -0,0 +1,928 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Google.Protobuf; +using MySql.Data; +using MySql.Data.MySqlClient; +using Mysqlx; +using Mysqlx.Connection; +using Mysqlx.Crud; +using Mysqlx.Datatypes; +using Mysqlx.Expr; +using Mysqlx.Notice; +using Mysqlx.Prepare; +using Mysqlx.Resultset; +using Mysqlx.Session; +using Mysqlx.Sql; +using MySqlX.Communication; +using MySqlX.Data; +using MySqlX.DataAccess; +using MySqlX.Protocol.X; +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Common; +using MySqlX.XDevAPI.CRUD; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +#if !NETFRAMEWORK +using System.Text.Json; +#endif +using static Mysqlx.Datatypes.Object.Types; + +namespace MySqlX.Protocol +{ + internal class XProtocol : ProtocolBase + { + private CommunicationPacket _pendingPacket; + private XPacketReaderWriter _packetReaderWriter; + + public Capabilities Capabilities { get; protected set; } + + public XProtocol(XPacketReaderWriter packetReaderWriter) + { + _packetReaderWriter = packetReaderWriter; + } + + #region Authentication + + public void SendAuthStart(string method, byte[] authData, byte[] initialResponse) + { + AuthenticateStart authStart = new AuthenticateStart(); + authStart.MechName = method; + if (authData != null) authStart.AuthData = (ByteString.CopyFrom(authData)); + if (initialResponse != null) authStart.InitialResponse = (ByteString.CopyFrom(initialResponse)); + _packetReaderWriter.Write(ClientMessageId.SESS_AUTHENTICATE_START, authStart); + } + + public byte[] ReadAuthContinue() + { + CommunicationPacket p = ReadPacket(); + if (p.MessageType != (int)ServerMessageId.SESS_AUTHENTICATE_CONTINUE) + throw new MySqlException("Unexpected message encountered during authentication handshake"); + AuthenticateContinue response = AuthenticateContinue.Parser.ParseFrom(p.Buffer); + if (!response.AuthData.IsEmpty) + return response.AuthData.ToByteArray(); + return null; + } + + public void SendAuthContinue(byte[] data) + { + Debug.Assert(data != null); + AuthenticateContinue authCont = new AuthenticateContinue(); + authCont.AuthData = (ByteString.CopyFrom(data)); + _packetReaderWriter.Write(ClientMessageId.SESS_AUTHENTICATE_CONTINUE, authCont); + } + + public void ReadAuthOk() + { + CommunicationPacket p = ReadPacket(); + switch ((ServerMessageId)p.MessageType) + { + case ServerMessageId.SESS_AUTHENTICATE_OK: + break; + + case ServerMessageId.ERROR: + var error = Error.Parser.ParseFrom(p.Buffer); + throw new MySqlException(error.Code, error.SqlState, error.Msg); + + case ServerMessageId.NOTICE: + ///TODO: fix this + //ProcessNotice(p, new Result(null)); + ReadAuthOk(); + break; + + default: + throw new MySqlException("Unexpected message encountered during authentication handshake"); + } + } + + #endregion + + public void GetServerCapabilities() + { + _packetReaderWriter.Write(ClientMessageId.CON_CAPABILITIES_GET, new CapabilitiesGet()); + CommunicationPacket packet = ReadPacket(); + + if (packet.MessageType == (int)ServerMessageId.NOTICE) + packet = ReadPacket(); + + if (packet.MessageType != (int)ServerMessageId.CONN_CAPABILITIES) + { + if (packet.MessageType == (int)ServerMessageId.ERROR) + DecodeAndThrowError(packet); + else + ThrowUnexpectedMessage(packet.MessageType, (int)ServerMessageId.CONN_CAPABILITIES); + } + Capabilities = Capabilities.Parser.ParseFrom(packet.Buffer); + } + + public void SetCapabilities(Dictionary clientCapabilities) + { + if (clientCapabilities == null || clientCapabilities.Count == 0) + return; + + var builder = new CapabilitiesSet(); + var capabilities = new Capabilities(); + foreach (var cap in clientCapabilities) + { + var value = new Any(); + + if (cap.Key == "tls") + value = ExprUtil.BuildAny(cap.Value); + else if (cap.Key == "session_connect_attrs" || cap.Key == "compression") + { + var obj = new Mysqlx.Datatypes.Object(); + + if (cap.Key == "session_connect_attrs") + { + foreach (var pair in (Dictionary)cap.Value) + obj.Fld.Add(new ObjectField { Key = pair.Key, Value = ExprUtil.BuildAny(pair.Value) }); + } + else if (cap.Key == "compression") + { + foreach (var pair in (Dictionary)cap.Value) + obj.Fld.Add(new ObjectField { Key = pair.Key, Value = ExprUtil.BuildAny(pair.Value) }); + } + + value = new Any { Type = Any.Types.Type.Object, Obj = obj }; + } + + var capabilityMsg = new Capability() { Name = cap.Key, Value = value }; + capabilities.Capabilities_.Add(capabilityMsg); + } + + builder.Capabilities = capabilities; + _packetReaderWriter.Write(ClientMessageId.CON_CAPABILITIES_SET, builder); + ReadOk(); + } + + private void ThrowUnexpectedMessage(int received, int expected) + { + if (received == 10) // Connection to XProtocol using ClassicProtocol port + throw new MySqlException("Unsupported protocol version."); + throw new MySqlException( + String.Format("Expected message id: {0}. Received message id: {1}", expected, received)); + } + + public override void SendSQL(string sql, params object[] args) + { + SendExecuteSQLStatement(sql, args); + } + + public override bool HasData(BaseResult rs) + { + while (true) + { + CommunicationPacket packet = PeekPacket(); + switch (packet.MessageType) + { + case (int)ServerMessageId.RESULTSET_COLUMN_META_DATA: + return true; + case (int)ServerMessageId.NOTICE: + ProcessNotice(packet, rs); + packet = ReadPacket(); + break; + case (int)ServerMessageId.ERROR: + packet = ReadPacket(); + DecodeAndThrowError(packet); + break; + default: + return false; + } + } + } + + private CommunicationPacket PeekPacket() + { + if (_pendingPacket != null) return _pendingPacket; + _pendingPacket = _packetReaderWriter.Read(); + return _pendingPacket; + } + + private CommunicationPacket ReadPacket() + { + while (true) + { + CommunicationPacket p = _pendingPacket != null ? _pendingPacket : _packetReaderWriter.Read(); + _pendingPacket = null; + return p; + } + } + + private void ProcessGlobalNotice(Mysqlx.Notice.Frame frame) + { + } + + private void ProcessNotice(CommunicationPacket packet, BaseResult rs) + { + Frame frame = Frame.Parser.ParseFrom(packet.Buffer); + if (frame.Scope == Frame.Types.Scope.Global) + { + ProcessGlobalNotice(frame); + return; + } + + // if we get here the notice is local + switch ((NoticeType)frame.Type) + { + case NoticeType.Warning: + ProcessWarning(rs, frame.Payload.ToByteArray()); + break; + case NoticeType.SessionStateChanged: + ProcessSessionStateChanged(rs, frame.Payload.ToByteArray()); + break; + case NoticeType.SessionVariableChanged: + break; + default: // will ignore unknown notices from the server + break; + } + } + + private void ProcessSessionStateChanged(BaseResult rs, byte[] payload) + { + SessionStateChanged state = SessionStateChanged.Parser.ParseFrom(payload); + switch (state.Param) + { + case SessionStateChanged.Types.Parameter.RowsAffected: + rs._recordsAffected = state.Value[0].VUnsignedInt; + rs._affectedItemsCount = rs._recordsAffected; + break; + case SessionStateChanged.Types.Parameter.GeneratedInsertId: + rs._autoIncrementValue = state.Value[0].VUnsignedInt; + break; + case SessionStateChanged.Types.Parameter.ProducedMessage: + rs.AddWarning(new WarningInfo(0, state.Value[0].VString.Value.ToStringUtf8())); + break; + case SessionStateChanged.Types.Parameter.GeneratedDocumentIds: + foreach (var value in state.Value) + rs._documentIds.Add(value.VOctets.Value.ToStringUtf8()); + break; + //handle the other ones + //default: SessionStateChanged(state); + } + } + + private void ProcessWarning(BaseResult rs, byte[] payload) + { + Warning w = Warning.Parser.ParseFrom(payload); + WarningInfo warning = new WarningInfo(w.Code, w.Msg); + if (w.HasLevel) + warning.Level = (uint)w.Level; + rs.AddWarning(warning); + } + + private Any CreateAny(object o) + { + if (o is string) return ExprUtil.BuildAny((string)o); + if (o is bool) return ExprUtil.BuildAny((bool)o); + return ExprUtil.BuildAny(o); + } + + private ObjectField CreateObject(string key, object value, bool evaluateStringExpression = true) + { + return ExprUtil.BuildObject(key, value, evaluateStringExpression); + } + + public void SendSessionClose() + { + _packetReaderWriter.Write(ClientMessageId.SESS_CLOSE, new Mysqlx.Session.Close()); + } + + public void SendConnectionClose() + { + Mysqlx.Connection.Close connClose = new Mysqlx.Connection.Close(); + _packetReaderWriter.Write(ClientMessageId.CON_CLOSE, connClose); + } + + internal StmtExecute CreateExecuteSQLStatement(string stmt, params object[] args) + { + StmtExecute stmtExecute = new StmtExecute(); + stmtExecute.Namespace = "sql"; + stmtExecute.Stmt = ByteString.CopyFromUtf8(stmt); + stmtExecute.CompactMetadata = false; + if (args != null) + { + foreach (object arg in args) + stmtExecute.Args.Add(CreateAny(arg)); + } + + return stmtExecute; + } + + public void SendExecuteSQLStatement(string stmt, params object[] args) + { + StmtExecute stmtExecute = CreateExecuteSQLStatement(stmt, args); + _packetReaderWriter.Write(ClientMessageId.SQL_STMT_EXECUTE, stmtExecute); + } + + public void SendExecuteStatement(string ns, string stmt, params KeyValuePair[] args) + { + StmtExecute stmtExecute = new StmtExecute(); + stmtExecute.Namespace = ns; + stmtExecute.Stmt = ByteString.CopyFromUtf8(stmt); + stmtExecute.CompactMetadata = false; + if (args != null) + { + var any = ExprUtil.BuildEmptyAny(Any.Types.Type.Object); + + foreach (var arg in args) + { + switch (stmt) + { + case "drop_collection_index": + any.Obj.Fld.Add(CreateObject(arg.Key, arg.Value, false)); + break; + default: + any.Obj.Fld.Add(CreateObject(arg.Key, arg.Value)); + break; + } + } + stmtExecute.Args.Add(any); + } + + _packetReaderWriter.Write(ClientMessageId.SQL_STMT_EXECUTE, stmtExecute); + } + + /// + /// Build the message to be sent to MySQL Server to execute statement "Create" or "Modify" collection with schema options + /// + /// The namespace + /// The name of the command to be executed on MySql Server + /// Array of KeyValuePairs with the parameters required to build the message + /// void. + public void SendExecuteStatementOptions(string ns, string stmt, params KeyValuePair[] args) + { + StmtExecute stmtExecute = new StmtExecute(); + stmtExecute.Namespace = ns; + stmtExecute.Stmt = ByteString.CopyFromUtf8(stmt); + stmtExecute.CompactMetadata = false; + if (args != null) + { + var options = new ObjectField(); + var validation = new ObjectField(); + var reuse_obj = new ObjectField(); + var optionsAny = ExprUtil.BuildEmptyAny(Any.Types.Type.Object); + var any = ExprUtil.BuildEmptyAny(Any.Types.Type.Object); + var innerAny = ExprUtil.BuildEmptyAny(Any.Types.Type.Object); + var reuse_any = ExprUtil.BuildEmptyAny(Any.Types.Type.Object); + foreach (var arg in args) + { + if (arg.Value is Dictionary && arg.Key == "options") + { + foreach (var field in arg.Value as Dictionary) + { + innerAny.Obj.Fld.Add(CreateObject(field.Key, field.Value)); + } + } + else if (arg.Key == "reuse_existing") + { + reuse_any = ExprUtil.BuildAny(arg.Value); + } + else + { + any.Obj.Fld.Add(CreateObject(arg.Key, arg.Value)); + } + } + options.Key = "options"; + validation.Key = "validation"; + validation.Value = innerAny; + reuse_obj.Key = "reuse_existing"; + reuse_obj.Value = reuse_any; + optionsAny.Obj.Fld.Add(validation); + if (stmt == "create_collection") + { + optionsAny.Obj.Fld.Add(reuse_obj); + } + options.Value = optionsAny; + any.Obj.Fld.Add(options); + stmtExecute.Args.Add(any); + } + + _packetReaderWriter.Write(ClientMessageId.SQL_STMT_EXECUTE, stmtExecute); + } + + public void SendCreateCollectionIndexStatement(string ns, string stmt, params KeyValuePair[] args) + { + StmtExecute stmtExecute = new StmtExecute(); + stmtExecute.Namespace = ns; + stmtExecute.Stmt = ByteString.CopyFromUtf8(stmt); + stmtExecute.CompactMetadata = false; + if (args != null) + { + var any = ExprUtil.BuildEmptyAny(Any.Types.Type.Object); + var array = new Mysqlx.Datatypes.Array(); + foreach (var arg in args) + { + if (arg.Value is Dictionary && arg.Key == "constraint") + { + var innerAny = ExprUtil.BuildEmptyAny(Any.Types.Type.Object); + foreach (var field in arg.Value as Dictionary) + innerAny.Obj.Fld.Add(CreateObject(field.Key, field.Value, field.Key == "member" ? true : false)); + + array.Value.Add(innerAny); + } + else + any.Obj.Fld.Add(CreateObject(arg.Key, arg.Value, false)); + } + + if (array.Value.Count > 0) + { + var constraint = new ObjectField(); + constraint.Key = "constraint"; + var constraintAny = ExprUtil.BuildEmptyAny(Any.Types.Type.Array); + constraintAny.Array = array; + constraint.Value = constraintAny; + any.Obj.Fld.Add(constraint); + } + + stmtExecute.Args.Add(any); + } + + _packetReaderWriter.Write(ClientMessageId.SQL_STMT_EXECUTE, stmtExecute); + } + + private void DecodeAndThrowError(CommunicationPacket p) + { + Error e = Error.Parser.ParseFrom(p.Buffer); + throw new MySqlException(e.Code, e.SqlState, e.Msg); + } + + public override List ReadRow(BaseResult rs) + { + CommunicationPacket packet = PeekPacket(); + if (packet.MessageType != (int)ServerMessageId.RESULTSET_ROW) + { + if (rs != null) + CloseResult(rs); + + return null; + } + + var protoRow = Row.Parser.ParseFrom(ReadPacket().Buffer); + var values = new List(protoRow.Field.Count); + for (int i = 0; i < protoRow.Field.Count; i++) + values.Add(protoRow.Field[i].ToByteArray()); + + return values; + } + + public override void CloseResult(BaseResult rs) + { + rs._hasData = false; + while (true) + { + CommunicationPacket p = PeekPacket(); + if (p.MessageType == (int)ServerMessageId.RESULTSET_FETCH_DONE_MORE_RESULTSETS) + { + rs._hasMoreResults = true; + ReadPacket(); + break; + } + if (p.MessageType == (int)ServerMessageId.OK) + { + ReadOk(); + break; + } + if (p.MessageType == (int)ServerMessageId.RESULTSET_FETCH_DONE) + ReadPacket(); + else if (p.MessageType == (int)ServerMessageId.NOTICE) + ProcessNotice(ReadPacket(), rs); + else if (p.MessageType == (int)ServerMessageId.ERROR) + { + rs._session.ActiveResult = null; + DecodeAndThrowError(ReadPacket()); + } + else if (p.MessageType == (int)ServerMessageId.SQL_STMT_EXECUTE_OK) + { + ReadPacket(); + break; + } + else + throw new MySqlException(ResourcesX.ThrowingAwayResults); + } + } + + public override List LoadColumnMetadata() + { + List columns = new List(); + // we assume our caller has already validated that metadata is there + while (true) + { + if (PeekPacket().MessageType != (int)ServerMessageId.RESULTSET_COLUMN_META_DATA) return columns; + CommunicationPacket p = ReadPacket(); + ColumnMetaData response = ColumnMetaData.Parser.ParseFrom(p.Buffer); + columns.Add(DecodeColumn(response)); + } + } + + private XDevAPI.Relational.Column DecodeColumn(ColumnMetaData colData) + { + XDevAPI.Relational.Column c = new XDevAPI.Relational.Column(); + c._decoder = XValueDecoderFactory.GetValueDecoder(c, colData.Type); + c._decoder.Column = c; + + if (!colData.Name.IsEmpty) + c.ColumnLabel = colData.Name.ToStringUtf8(); + if (!colData.OriginalName.IsEmpty) + c.ColumnName = colData.OriginalName.ToStringUtf8(); + if (!colData.Table.IsEmpty) + c.TableLabel = colData.Table.ToStringUtf8(); + if (!colData.OriginalTable.IsEmpty) + c.TableName = colData.OriginalTable.ToStringUtf8(); + if (!colData.Schema.IsEmpty) + c.SchemaName = colData.Schema.ToStringUtf8(); + if (!colData.Catalog.IsEmpty) + c.DatabaseName = colData.Catalog.ToStringUtf8(); + if (colData.Collation > 0) + { + c._collationNumber = colData.Collation; + c.CollationName = CollationMap.GetCollationName((int)colData.Collation); + c.CharacterSetName = c.CollationName.Split('_')[0]; + } + if (colData.Length > 0) + c.Length = colData.Length; + if (colData.FractionalDigits > 0) + c.FractionalDigits = colData.FractionalDigits; + if (colData.Flags > 0) + c._decoder.Flags = colData.Flags; + if (colData.ContentType > 0) + c._decoder.ContentType = colData.ContentType; + c._decoder.SetMetadata(); + return c; + } + + internal Insert CreateInsertMessage(string schema, bool isRelational, string collection, object[] rows, string[] columns, bool upsert) + { + Insert msg = new Mysqlx.Crud.Insert(); + msg.Collection = ExprUtil.BuildCollection(schema, collection); + msg.DataModel = (isRelational ? DataModel.Table : DataModel.Document); + msg.Upsert = upsert; + if (columns != null && columns.Length > 0) + { + foreach (string column in columns) + msg.Projection.Add(new ExprParser(column).ParseTableInsertField()); + } + + foreach (object row in rows) + { + Mysqlx.Crud.Insert.Types.TypedRow typedRow = new Mysqlx.Crud.Insert.Types.TypedRow(); + object[] fields = row.GetType().IsArray ? (object[])row : new object[] { row }; + foreach (object field in fields) + if (field is null) + typedRow.Field.Add(ExprUtil.BuildLiteralNullScalar()); + else + { + if (field is DbDoc || field.GetType().Namespace == "System") + typedRow.Field.Add(ExprUtil.BuildLiteralScalar(Convert.ToString(field))); + else + { +#if !NETFRAMEWORK + string jsonString = JsonSerializer.Serialize(field); + typedRow.Field.Add(ExprUtil.BuildLiteralScalar(jsonString)); +#else + throw new MySqlException(ResourcesX.CustomTypeNotSupported); +#endif + } + } + + msg.Row.Add(typedRow); + } + + return msg; + } + + public void SendInsert(string schema, bool isRelational, string collection, object[] rows, string[] columns, bool upsert) + { + Insert msg = CreateInsertMessage(schema, isRelational, collection, rows, columns, upsert); + _packetReaderWriter.Write(ClientMessageId.CRUD_INSERT, msg); + } + + private void ApplyFilter(Action setLimit, Action setCriteria, Action> setOrder, FilterParams filter, Action> addParams) + { + if (filter.HasLimit) + { + var limit = new Limit(); + limit.RowCount = (ulong)filter.Limit; + if (filter.Offset != -1) limit.Offset = (ulong)filter.Offset; + setLimit(limit); + } + if (!string.IsNullOrEmpty(filter.Condition)) + { + setCriteria(filter.GetConditionExpression(filter.IsRelational)); + if (filter.Parameters != null && filter.Parameters.Count > 0) + addParams(filter.GetArgsExpression(filter.Parameters)); + } + if (filter.OrderBy != null && filter.OrderBy.Length > 0) + setOrder(filter.GetOrderByExpressions(filter.IsRelational)); + + } + + internal Delete CreateDeleteMessage(string schema, string collection, bool isRelational, FilterParams filter) + { + var msg = new Delete(); + msg.DataModel = (isRelational ? DataModel.Table : DataModel.Document); + msg.Collection = ExprUtil.BuildCollection(schema, collection); + ApplyFilter(v => msg.Limit = v, v => msg.Criteria = v, msg.Order.Add, filter, msg.Args.Add); + + return msg; + } + + /// + /// Sends the delete documents message + /// + public void SendDelete(string schema, string collection, bool isRelational, FilterParams filter) + { + var msg = CreateDeleteMessage(schema, collection, isRelational, filter); + _packetReaderWriter.Write(ClientMessageId.CRUD_DELETE, msg); + } + + internal Update CreateUpdateMessage(string schema, string collection, bool isRelational, FilterParams filter, List updates) + { + var msg = new Update(); + msg.DataModel = (isRelational ? DataModel.Table : DataModel.Document); + msg.Collection = ExprUtil.BuildCollection(schema, collection); + ApplyFilter(v => msg.Limit = v, v => msg.Criteria = v, msg.Order.Add, filter, msg.Args.Add); + + foreach (var update in updates) + { + var updateBuilder = new UpdateOperation(); + updateBuilder.Operation = update.Type; + updateBuilder.Source = update.GetSource(isRelational); + if (update.Type != UpdateOperation.Types.UpdateType.ItemRemove + || (update.Type == UpdateOperation.Types.UpdateType.ItemRemove && update.HasValue)) + updateBuilder.Value = update.GetValue(update.Type); + msg.Operation.Add(updateBuilder); + } + + return msg; + } + + /// + /// Sends the CRUD modify message + /// + public void SendUpdate(string schema, string collection, bool isRelational, FilterParams filter, List updates) + { + var msg = CreateUpdateMessage(schema, collection, isRelational, filter, updates); + _packetReaderWriter.Write(ClientMessageId.CRUD_UPDATE, msg); + } + + internal Find CreateFindMessage(string schema, string collection, bool isRelational, FilterParams filter, FindParams findParams) + { + var builder = new Find(); + builder.Collection = ExprUtil.BuildCollection(schema, collection); + builder.DataModel = (isRelational ? DataModel.Table : DataModel.Document); + if (findParams.GroupBy != null && findParams.GroupBy.Length > 0) + builder.Grouping.AddRange(new ExprParser(ExprUtil.JoinString(findParams.GroupBy)).ParseExprList()); + if (findParams.GroupByCritieria != null) + builder.GroupingCriteria = new ExprParser(findParams.GroupByCritieria).Parse(); + if (findParams.Locking != 0) builder.Locking = (Find.Types.RowLock)findParams.Locking; + if (findParams.LockingOption != 0) builder.LockingOptions = (Find.Types.RowLockOptions)findParams.LockingOption; + if (findParams.Projection != null && findParams.Projection.Length > 0) + { + var parser = new ExprParser(ExprUtil.JoinString(findParams.Projection)); + builder.Projection.Add(builder.DataModel == DataModel.Document ? + parser.ParseDocumentProjection() : + parser.ParseTableSelectProjection()); + + if (parser.tokenPos < parser.tokens.Count) + throw new ArgumentException(string.Format("Expression has unexpected token '{0}' at position {1}.", parser.tokens[parser.tokenPos].value, parser.tokenPos)); + } + ApplyFilter(v => builder.Limit = v, v => builder.Criteria = v, builder.Order.Add, filter, builder.Args.Add); + return builder; + } + + public void SendFind(string schema, string collection, bool isRelational, FilterParams filter, FindParams findParams) + { + var builder = CreateFindMessage(schema, collection, isRelational, filter, findParams); + _packetReaderWriter.Write(ClientMessageId.CRUD_FIND, builder); + } + + public void SendExpectOpen(Mysqlx.Expect.Open.Types.Condition.Types.Key condition, object value = null) + { + var builder = new Mysqlx.Expect.Open(); + var cond = new Mysqlx.Expect.Open.Types.Condition(); + cond.ConditionKey = (uint)condition; + cond.ConditionValue = value != null ? ByteString.CopyFromUtf8((string)value) : null; + builder.Cond.Add(cond); + _packetReaderWriter.Write(ClientMessageId.EXPECT_OPEN, builder); + } + + public void SendResetSession(bool sessionResetNoReauthentication) + { + var builder = new Mysqlx.Session.Reset(); + + if (sessionResetNoReauthentication) { builder.KeepOpen = sessionResetNoReauthentication; } + _packetReaderWriter.Write(ClientMessageId.SESS_RESET, builder); + } + + internal void ReadOkClose() + { + try + { + string response = ReadOk(); + if (response.IndexOf("bye", 0, StringComparison.OrdinalIgnoreCase) < 0) + throw new ArgumentException(); + } + catch (IOException) + { + // TODO connection is closed + } + catch (Exception ex) + { + throw new MySqlException("Unexpected message encountered during closing session", ex); + } + } + + internal string ReadOk() + { + CommunicationPacket p = ReadPacket(); + if (p.MessageType == (int)ServerMessageId.ERROR) + { + var error = Error.Parser.ParseFrom(p.Buffer); + throw new MySqlException(error.Code, error.SqlState, error.Msg); + } + if (p.MessageType == (int)ServerMessageId.OK) + { + var response = Ok.Parser.ParseFrom(p.Buffer); + return response.Msg; + } + else + throw new InvalidOperationException(); + } + + internal void SetXPackets(XPacketReaderWriter readerwriter) + { + _packetReaderWriter = readerwriter; + } + + public void SendPrepareStatement(uint stmtId, + PreparedStatementType type, + string schema, + string collection, + bool isRelational, + FilterParams filter, + FindParams findParams, + List updateSpecs = null, + object[] rows = null, + string[] columns = null, + bool upsert = false, + string sql = null) + { + var builder = new Prepare(); + builder.StmtId = stmtId; + builder.Stmt = new Prepare.Types.OneOfMessage(); + switch (type) + { + case PreparedStatementType.Find: + builder.Stmt.Type = Prepare.Types.OneOfMessage.Types.Type.Find; + var message = CreateFindMessage(schema, collection, isRelational, filter, findParams); + message.Args.Clear(); + if (filter.HasLimit) + { + uint positionFind = (uint)filter.Parameters.Count; + message.Limit = null; + message.LimitExpr = new LimitExpr + { + RowCount = new Expr + { + Type = Expr.Types.Type.Placeholder, + Position = positionFind++ + }, + Offset = new Expr + { + Type = Expr.Types.Type.Placeholder, + Position = positionFind++ + } + }; + } + builder.Stmt.Find = message; + break; + + case PreparedStatementType.Update: + builder.Stmt.Type = Prepare.Types.OneOfMessage.Types.Type.Update; + var updateMessage = CreateUpdateMessage(schema, collection, isRelational, filter, updateSpecs); + updateMessage.Args.Clear(); + if (filter.HasLimit) + { + uint positionUpdate = (uint)filter.Parameters.Count; + updateMessage.Limit = null; + updateMessage.LimitExpr = new LimitExpr + { + RowCount = new Expr + { + Type = Expr.Types.Type.Placeholder, + Position = positionUpdate++ + } + }; + } + builder.Stmt.Update = updateMessage; + break; + + case PreparedStatementType.Delete: + builder.Stmt.Type = Prepare.Types.OneOfMessage.Types.Type.Delete; + var deleteMessage = CreateDeleteMessage(schema, collection, isRelational, filter); + deleteMessage.Args.Clear(); + if (filter.HasLimit) + { + uint positionDelete = (uint)filter.Parameters.Count; + deleteMessage.Limit = null; + deleteMessage.LimitExpr = new LimitExpr + { + RowCount = new Expr + { + Type = Expr.Types.Type.Placeholder, + Position = positionDelete++ + } + }; + } + builder.Stmt.Delete = deleteMessage; + break; + + case PreparedStatementType.Insert: + builder.Stmt.Type = Prepare.Types.OneOfMessage.Types.Type.Insert; + var insertMessage = CreateInsertMessage(schema, isRelational, collection, rows, columns, upsert); + insertMessage.Args.Clear(); + uint position = 0; + foreach (var row in insertMessage.Row) + { + foreach (var field in row.Field) + { + if (field.Type == Expr.Types.Type.Literal) + { + field.Type = Expr.Types.Type.Placeholder; + field.Literal = null; + field.Position = position++; + } + } + } + builder.Stmt.Insert = insertMessage; + break; + + case PreparedStatementType.SqlStatement: + builder.Stmt.Type = Prepare.Types.OneOfMessage.Types.Type.Stmt; + var sqlMessage = CreateExecuteSQLStatement(sql, rows); + sqlMessage.Args.Clear(); + builder.Stmt.StmtExecute = sqlMessage; + break; + } + + _packetReaderWriter.Write((int)ClientMessages.Types.Type.PreparePrepare, builder); + ReadOk(); + } + + public void SendExecutePreparedStatement(uint stmtId, IEnumerable args) + { + var builder = new Execute(); + builder.StmtId = stmtId; + AddArgs(builder.Args.Add, args); + + _packetReaderWriter.Write((int)ClientMessages.Types.Type.PrepareExecute, builder); + } + + public void AddArgs(Action addFunction, IEnumerable args) + { + foreach (var arg in args) + { + if (arg.GetType().IsArray) + AddArgs(addFunction, (System.Array)arg); + else + addFunction(ExprUtil.BuildAny(arg)); + } + } + + public void SendDeallocatePreparedStatement(uint stmtId) + { + var builder = new Deallocate(); + builder.StmtId = stmtId; + _packetReaderWriter.Write((int)ClientMessages.Types.Type.PrepareDeallocate, builder); + ReadOk(); + } + } +} diff --git a/MySQL.Data/src/X/Protocol/X/XTimeDecoder.cs b/MySQL.Data/src/X/Protocol/X/XTimeDecoder.cs new file mode 100644 index 000000000..390460438 --- /dev/null +++ b/MySQL.Data/src/X/Protocol/X/XTimeDecoder.cs @@ -0,0 +1,66 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +using Google.Protobuf; +using MySql.Data.MySqlClient; +using MySql.Data.MySqlClient.X.XDevAPI.Common; +using MySqlX.Data; +using MySqlX.XDevAPI; +using System; + +namespace MySqlX.Protocol.X +{ + internal class XTimeDecoder : ValueDecoder + { + public override void SetMetadata() + { + Column.Type = ColumnType.Time; + Column.ClrType = typeof(TimeSpan); + ClrValueDecoder = ValueDecoder; + } + + public object ValueDecoder(byte[] bytes) + { + CodedInputStream input = new CodedInputStream(bytes); + Int64 hour = 0, min = 0, sec = 0, usec = 0; + + bool negative = input.ReadInt32() > 0; + if (!input.IsAtEnd) + hour = input.ReadInt64(); + if (!input.IsAtEnd) + min = input.ReadInt64(); + if (!input.IsAtEnd) + sec = input.ReadInt64(); + if (!input.IsAtEnd) + usec = input.ReadInt64(); + if (negative) hour *= -1; + return new TimeSpan(0, (int)hour, (int)min, (int)sec, (int)usec * 1000); + } + } +} diff --git a/MySQL.Data/src/X/Protocol/X/XValueDecoderFactory.cs b/MySQL.Data/src/X/Protocol/X/XValueDecoderFactory.cs new file mode 100644 index 000000000..634ce78b1 --- /dev/null +++ b/MySQL.Data/src/X/Protocol/X/XValueDecoderFactory.cs @@ -0,0 +1,56 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI.Relational; + +namespace MySqlX.Protocol.X +{ + internal class XValueDecoderFactory + { + public static ValueDecoder GetValueDecoder(Column c, Mysqlx.Resultset.ColumnMetaData.Types.FieldType type) + { + switch (type) + { + case Mysqlx.Resultset.ColumnMetaData.Types.FieldType.Bit: return new BitDecoder(); + case Mysqlx.Resultset.ColumnMetaData.Types.FieldType.Bytes: return new ByteDecoder(false); + case Mysqlx.Resultset.ColumnMetaData.Types.FieldType.Enum: return new ByteDecoder(true); + case Mysqlx.Resultset.ColumnMetaData.Types.FieldType.Set: return new SetDecoder(); + case Mysqlx.Resultset.ColumnMetaData.Types.FieldType.Time: return new XTimeDecoder(); + case Mysqlx.Resultset.ColumnMetaData.Types.FieldType.Datetime: return new XDateTimeDecoder(); + case Mysqlx.Resultset.ColumnMetaData.Types.FieldType.Sint: return new IntegerDecoder(true); + case Mysqlx.Resultset.ColumnMetaData.Types.FieldType.Uint: return new IntegerDecoder(false); + case Mysqlx.Resultset.ColumnMetaData.Types.FieldType.Float: return new FloatDecoder(true); + case Mysqlx.Resultset.ColumnMetaData.Types.FieldType.Double: return new FloatDecoder(false); + case Mysqlx.Resultset.ColumnMetaData.Types.FieldType.Decimal: return new DecimalDecoder(); + } + throw new MySqlException("Unknown field type " + type.ToString()); + } + } +} diff --git a/MySQL.Data/src/X/RoutingServices/DefaultRoutingService.cs b/MySQL.Data/src/X/RoutingServices/DefaultRoutingService.cs new file mode 100644 index 000000000..cf1a6ac14 --- /dev/null +++ b/MySQL.Data/src/X/RoutingServices/DefaultRoutingService.cs @@ -0,0 +1,60 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySqlX.Data; +using MySqlX.XDevAPI; +using System; + +namespace MySqlX.RoutingServices +{ + /// + /// Class implementation for a default communication kind. + /// + internal class DefaultRoutingService : RoutingServiceBase + { + /// + /// Constructor method for the communication routing service + /// + /// A MySqlXConnectionStringBuilder setted with the information to use in the connection + public DefaultRoutingService(MySqlXConnectionStringBuilder settings) : base(settings) + { + + } + + /// + /// Gets the current connection base on the connection mode + /// + /// One of the values of ConnectionMode Offline, ReadOnly, WriteOnly, ReadWrite + /// + public override MySqlXConnectionStringBuilder GetCurrentConnection(DataAccess.ConnectionMode mode) + { + return this.settings; + } + } +} diff --git a/MySQL.Data/src/X/RoutingServices/RoutingServiceBase.cs b/MySQL.Data/src/X/RoutingServices/RoutingServiceBase.cs new file mode 100644 index 000000000..6d463413e --- /dev/null +++ b/MySQL.Data/src/X/RoutingServices/RoutingServiceBase.cs @@ -0,0 +1,55 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySqlX.Data; +using MySqlX.DataAccess; +using MySqlX.XDevAPI; + +namespace MySqlX.RoutingServices +{ + /// + /// Abstract class used to define the kind of server in environments with multiple types of distributed systems. + /// + internal abstract class RoutingServiceBase + { + protected MySqlXConnectionStringBuilder settings; + + public RoutingServiceBase(MySqlXConnectionStringBuilder settings) + { + this.settings = settings; + } + + public virtual MySqlXConnectionStringBuilder GetCurrentConnection() + { + return settings; + } + + public abstract MySqlXConnectionStringBuilder GetCurrentConnection(ConnectionMode mode); + } +} diff --git a/MySQL.Data/src/X/Serialization/JsonParser.cs b/MySQL.Data/src/X/Serialization/JsonParser.cs new file mode 100644 index 000000000..769d68afd --- /dev/null +++ b/MySQL.Data/src/X/Serialization/JsonParser.cs @@ -0,0 +1,213 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySqlX.XDevAPI; +using System; +using System.Collections.Generic; + +namespace MySqlX.Serialization +{ + /// + /// Main class for parsing json strings. + /// + public class JsonParser + { + private int _pos = 0; + private String _input; + + /// + /// Initializes a new instance of the JsonParser class. + /// + public JsonParser() + {} + + /// + /// Parses the received string into a dictionary. + /// + /// The string to parse. + /// A object that represents the parsed string. + public static Dictionary Parse(string s) + { + JsonParser p = new JsonParser(); + return p.ParseInternal(s); + } + + private Dictionary ParseInternal(string s) + { + _input = s; + Dictionary dic = ReadGroup(); + if (_pos != _input.Length) + throw new IndexOutOfRangeException("It's not the end of stream."); + return dic; + } + + private Dictionary ReadGroup() + { + Dictionary values = new Dictionary(); + + RequireToken('{'); + if (PeekToken() != '}') + while (true) + { + string key = ReadQuotedToken(); + if (key == null) break; + RequireToken(':'); + var obj = ReadValue(); + values[key] = obj; + if (PeekToken() == '}') break; + RequireToken(','); + } + RequireToken('}'); + return values; + } + + private object ReadValue() + { + char t = PeekToken(); + if (t == '"') return ReadQuotedToken(); + if (t == '{') return ReadGroup(); + if (t == '[') return ReadArray(); + string stringValue = ReadUntilToken(',', '}', ']'); + bool flag; + if (bool.TryParse(stringValue, out flag)) return flag; + if (stringValue.Trim() == "null") return null; + int intValue; + long longValue; + double doubleValue; + if (int.TryParse(stringValue, out intValue)) return intValue; + if (long.TryParse(stringValue, out longValue)) return longValue; + if (double.TryParse( + stringValue, + System.Globalization.NumberStyles.Any, + System.Globalization.CultureInfo.InvariantCulture, + out doubleValue)) + return doubleValue; + + // May be a function. + int openingParen = 0; + for (int i=0; i0) + { + stringValue += ReadUntilToken(')') + ")"; + RequireToken(')'); + openingParen--; + } + + return new MySqlExpression(stringValue); + } + + private object[] ReadArray() + { + List values = new List(); + + RequireToken('['); + while (true) + { + values.Add(ReadValue()); + if (PeekToken() == ']') break; + RequireToken(','); + } + RequireToken(']'); + return values.ToArray(); + } + + private char PeekToken() + { + SkipWhite(); + if (_pos == _input.Length) + throw new Exception("Unexpected end of stream found."); + return _input[_pos]; + } + + private string ReadQuotedToken() + { + RequireToken('"'); + string val = ReadUntilToken('"'); + RequireToken('"'); + return val; + } + + private bool TokenInGroup(char[] tokens, char c) + { + foreach (char token in tokens) + if (token == c) return true; + return false; + } + + private string ReadUntilToken(params char[] end) + { + string val = ""; + bool escapedQuoteExpected = false; + while (_pos < _input.Length) + { + char c = _input[_pos++]; + + if (!escapedQuoteExpected) + { + if (c == 92) + escapedQuoteExpected = true; + else if (TokenInGroup(end, c)) + { + _pos--; + return val; + } + } + else if (c == 34) + escapedQuoteExpected = false; + + val += c; + } + throw new Exception("Failed to find ending '\"' while reading stream."); + } + + private void RequireToken(char token) + { + if (!ReadToken(token)) + throw new Exception("Expected token '" + token + "'"); + } + + private bool ReadToken(char token) + { + SkipWhite(); + if (_pos == _input.Length) return false; + char c = _input[_pos++]; + return c == token; + } + + private void SkipWhite() + { + while (Char.IsWhiteSpace(_input[_pos])) + _pos++; + } + } +} diff --git a/MySQL.Data/src/X/Sessions/InternalSession.cs b/MySQL.Data/src/X/Sessions/InternalSession.cs new file mode 100644 index 000000000..bc58494da --- /dev/null +++ b/MySQL.Data/src/X/Sessions/InternalSession.cs @@ -0,0 +1,187 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySql.Data.Common; +using MySql.Data.MySqlClient; +using MySqlX.Protocol; +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Common; +using MySqlX.XDevAPI.Relational; +using System; +using System.IO; + +namespace MySqlX.Sessions +{ + + /// + /// Abstract class to manage and encapsulate one or more actual connections. + /// + internal abstract class InternalSession : IDisposable + { + protected Stream _stream; + internal BaseResult ActiveResult; + private bool disposed = false; + + /// + /// Creates a new session object with the values of the settings parameter. + /// + /// Settings to be used in the session object + public InternalSession(MySqlXConnectionStringBuilder settings) + { + Settings = settings; + } + + protected abstract void Open(); + + public abstract void Close(); + + internal abstract ProtocolBase GetProtocol(); + + protected internal MySqlXConnectionStringBuilder Settings; + + public SessionState SessionState { get; protected set; } + + public static InternalSession GetSession(MySqlXConnectionStringBuilder settings) + { + InternalSession session = new XInternalSession(settings); + int count = 0; + do + { + try + { + session.Open(); + SetDefaultCollation(session, settings.CharacterSet); + break; + } + catch (IOException ex) + { + // Retry SSL connection (manual fallback). + if (count++ >= 5) + throw new MySqlException(ResourcesX.UnableToOpenSession, ex); + } + } while (true); + return session; + } + + public Result ExecuteSqlNonQuery(string sql, params object[] args) + { + GetProtocol().SendSQL(sql, args); + return new Result(this); + } + + public RowResult GetSqlRowResult(string sql) + { + GetProtocol().SendSQL(sql); + return new RowResult(this); + } + + public SqlResult GetSQLResult(string sql, object[] args) + { + GetProtocol().SendSQL(sql, args); + return new SqlResult(this); + } + + public object ExecuteQueryAsScalar(string sql) + { + RowResult result = GetSqlRowResult(sql); + var rows = result.FetchAll(); + if (rows.Count == 0) + throw new MySqlException("No data found"); + return rows[0][0]; + } + + /// + /// Sets the connection's charset default collation. + /// + /// The opened session. + /// The character set. + private static void SetDefaultCollation(InternalSession session, string charset) + { + if (!session.GetServerVersion().isAtLeast(8, 0, 1)) return; + + RowResult result = session.GetSqlRowResult("SHOW CHARSET WHERE Charset='" + charset + "'"); + var row = result.FetchOne(); + if (row != null) + { + var defaultCollation = row.GetString("Default collation"); + session.ExecuteSqlNonQuery("SET collation_connection = '" + defaultCollation + "'"); + } + else + session.ExecuteSqlNonQuery("SET collation_connection = 'utf8mb4_0900_ai_ci'"); + } + + /// + /// Gets the version of the server. + /// + /// An instance of containing the server version. + internal DBVersion GetServerVersion() + { + return DBVersion.Parse(GetSqlRowResult("SHOW VARIABLES LIKE 'version'").FetchOne().GetString("Value")); + } + + /// + /// Gets the thread Id of the connection. + /// + /// Thread Id + internal int GetThreadId() + { + return int.Parse(GetSqlRowResult("SELECT CONNECTION_ID()").FetchOne().GetString("connection_id()")); + } + + #region IDisposable + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposed) return; + + if (disposing) + { + // Free any other managed objects here. + // + } + + // Free any unmanaged objects here. + // + disposed = true; + } + + //~BaseSession() + //{ + // Dispose(false); + //} + + #endregion + } +} diff --git a/MySQL.Data/src/X/Sessions/QueueTaskScheduler.cs b/MySQL.Data/src/X/Sessions/QueueTaskScheduler.cs new file mode 100644 index 000000000..adee17560 --- /dev/null +++ b/MySQL.Data/src/X/Sessions/QueueTaskScheduler.cs @@ -0,0 +1,65 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace MySqlX.Sessions +{ + /// + /// Implementation class for object that manages low-level work of queuing tasks onto threads. + /// + internal class QueueTaskScheduler : TaskScheduler + { + private readonly object lockObject = new object(); + + protected override IEnumerable GetScheduledTasks() + { + throw new NotImplementedException(); + } + + protected override void QueueTask(Task task) + { + System.Threading.ThreadPool.QueueUserWorkItem(_ => + { + lock (lockObject) + { + System.Threading.Thread.CurrentThread.Name = "mysqlx"; + base.TryExecuteTask(task); + } + }); + } + + protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued) + { + throw new NotImplementedException(); + } + + } +} diff --git a/MySQL.Data/src/X/Sessions/XInternalSession.cs b/MySQL.Data/src/X/Sessions/XInternalSession.cs new file mode 100644 index 000000000..2bf7e8f15 --- /dev/null +++ b/MySQL.Data/src/X/Sessions/XInternalSession.cs @@ -0,0 +1,1056 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySql.Data.Common; +using MySql.Data.MySqlClient; +using MySql.Data.MySqlClient.Authentication; +using MySqlX.Communication; +using MySqlX.Protocol; +using MySqlX.Protocol.X; +using MySqlX.Security; +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Common; +using MySqlX.XDevAPI.CRUD; +using MySqlX.XDevAPI.Relational; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading; + +namespace MySqlX.Sessions +{ + /// + /// Implementation class of InternalSession to manage connections using the Xprotocol type object. + /// + internal class XInternalSession : InternalSession + { + /// + /// Defines the compression controller that will be passed on the instance when + /// compression is enabled. + /// + private XCompressionController _readerCompressionController; + + /// + /// Defines the compression controller that will be passed on the instance when + /// compression is enabled. + /// + private XCompressionController _writerCompressionController; + + private XProtocol _protocol; + private XPacketReaderWriter _packetReaderWriter; + private bool _serverSupportsTls = false; + private const string mysqlxNamespace = "mysqlx"; + internal bool _supportsPreparedStatements = true; + private int _stmtId = 0; + private List _preparedStatements = new List(); + internal bool? _sessionResetNoReauthentication = null; + internal MyNetworkStream _myNetworkStream; + + public XInternalSession(MySqlXConnectionStringBuilder settings) : base(settings) + { + } + + protected override void Open() + { + bool isUnix = Settings.ConnectionProtocol == MySqlConnectionProtocol.Unix || + Settings.ConnectionProtocol == MySqlConnectionProtocol.UnixSocket; + + _stream = MyNetworkStream.CreateStreamAsync( + Settings.Server == "127.0.0.1" || Settings.Server == "::1" + ? "localhost" + : Settings.Server, + Settings.ConnectTimeout, + Settings.Keepalive, + Settings.Port, + isUnix, false).GetAwaiter().GetResult(); + _myNetworkStream = (MyNetworkStream)_stream; + if (_stream == null) + throw new MySqlException(ResourcesX.UnableToConnect); + + _packetReaderWriter = new XPacketReaderWriter(_stream, _myNetworkStream.Socket); + _protocol = new XProtocol(_packetReaderWriter); + + Settings.CharacterSet = string.IsNullOrWhiteSpace(Settings.CharacterSet) ? "utf8mb4" : Settings.CharacterSet; + var encoding = CharSetMap.GetEncoding(Settings.CharacterSet); + + SetState(SessionState.Connecting, false); + + try + { + GetAndSetCapabilities(); + } + catch (Exception) + { + throw; + } + + // Validates use of TLS. + if (Settings.SslMode != MySqlSslMode.Disabled) + { + if (_serverSupportsTls) + { + var result = new Ssl( + Settings.Server, + Settings.SslMode, + Settings.CertificateFile, + Settings.CertificateStoreLocation, + Settings.CertificatePassword, + Settings.CertificateThumbprint, + Settings.SslCa, + Settings.SslCert, + Settings.SslKey, + Settings.TlsVersion, + Settings.ConnectTimeout) + .StartSSLAsync(_stream, encoding, Settings.ToString(), CancellationToken.None, false).GetAwaiter().GetResult(); + + _stream = result.Item2; + + if (_readerCompressionController != null && _readerCompressionController.IsCompressionEnabled) + { + _packetReaderWriter = new XPacketReaderWriter(_stream, _readerCompressionController, _writerCompressionController, _myNetworkStream.Socket); + } + else + { + _packetReaderWriter = new XPacketReaderWriter(_stream, _myNetworkStream.Socket); + } + + _protocol.SetXPackets(_packetReaderWriter); + } + else + { + // Client requires SSL connections. + string message = String.Format(Resources.NoServerSSLSupport, + Settings.Server); + throw new MySqlException(message); + } + } + else if (_readerCompressionController != null && _readerCompressionController.IsCompressionEnabled) + { + _packetReaderWriter = new XPacketReaderWriter(_stream, _readerCompressionController, _writerCompressionController, _myNetworkStream.Socket); + _protocol.SetXPackets(_packetReaderWriter); + } + + Authenticate(); + + SetState(SessionState.Open, false); + } + + internal void Authenticate() + { + // Default authentication + if (Settings.Auth == MySqlAuthenticationMode.Default) + { + if ((Settings.SslMode != MySqlSslMode.Disabled && _serverSupportsTls) || Settings.ConnectionProtocol == MySqlConnectionProtocol.Unix) + { + Settings.Auth = MySqlAuthenticationMode.PLAIN; + AuthenticatePlain(); + } + else + { + bool authenticated = false; + // first try using MYSQL41 + Settings.Auth = MySqlAuthenticationMode.MYSQL41; + try + { + AuthenticateMySQL41(); + authenticated = true; + } + catch (MySqlException ex) + { + // code 1045 Invalid user or password + if (ex.Code != 1045) + throw; + } + + // second try using SHA256_MEMORY + if (!authenticated) + { + try + { + Settings.Auth = MySqlAuthenticationMode.SHA256_MEMORY; + AuthenticateSha256Memory(); + authenticated = true; + } + catch (MySqlException ex) + { + // code 1045 Invalid user or password + if (ex.Code == 1045) + throw new MySqlException(1045, "HY000", ResourcesX.AuthenticationFailed); + else + throw; + } + } + } + } + // User defined authentication + else + { + switch (Settings.Auth) + { + case MySqlAuthenticationMode.PLAIN: + AuthenticatePlain(); + break; + case MySqlAuthenticationMode.MYSQL41: + AuthenticateMySQL41(); + break; + case MySqlAuthenticationMode.EXTERNAL: + AuthenticateExternal(); + break; + case MySqlAuthenticationMode.SHA256_MEMORY: + AuthenticateSha256Memory(); + break; + default: + throw new NotImplementedException(Settings.Auth.ToString()); + } + } + } + + private void GetAndSetCapabilities() + { + _protocol.GetServerCapabilities(); + var clientCapabilities = new Dictionary(); + Mysqlx.Connection.Capability capability = null; + + // Validates TLS use. + if (Settings.SslMode != MySqlSslMode.Disabled) + { + capability = _protocol.Capabilities.Capabilities_.FirstOrDefault(i => i.Name.ToLowerInvariant() == "tls"); + if (capability != null) + { + _serverSupportsTls = true; + clientCapabilities.Add("tls", "1"); + } + } + + // Set connection-attributes. + if (Settings.ConnectionAttributes.ToLower() != "false") + clientCapabilities.Add("session_connect_attrs", GetConnectionAttributes(Settings.ConnectionAttributes)); + + // Set compression algorithm. + if (Settings.Compression != CompressionType.Disabled) + { + capability = _protocol.Capabilities.Capabilities_.FirstOrDefault(i => i.Name.ToLowerInvariant() == XCompressionController.COMPRESSION_KEY); + + // Raise error if client expects compression but server doesn't support it. + if (Settings.Compression == CompressionType.Required && capability == null) + { + throw new NotSupportedException(ResourcesX.CompressionNotSupportedByServer); + } + + // Update capabilities with the compression algorithm negotiation if server supports compression. + if (capability != null) + { + var algorithmsDictionary = capability.Value.Obj.Fld.ToDictionary( + field => field.Key, + field => field.Value.Array.Value.ToDictionary(value => value.Scalar.VString.Value.ToStringUtf8().ToLowerInvariant()).Keys.ToList()); + + if (algorithmsDictionary.ContainsKey(XCompressionController.ALGORITHMS_SUBKEY)) + { + var supportedCompressionAlgorithms = algorithmsDictionary[XCompressionController.ALGORITHMS_SUBKEY].ToList().ToArray(); + VerifyDefaultOrder(ref supportedCompressionAlgorithms); + var userCompressionAlgorithms = NegotiateUserAgainstClientAlgorithms(Settings.CompressionAlgorithm); + var compressionCapabilities = NegotiateCompression(supportedCompressionAlgorithms, userCompressionAlgorithms); + if (compressionCapabilities != null) + { + clientCapabilities.Add(XCompressionController.COMPRESSION_KEY, compressionCapabilities); + var compressionAlgorithm = compressionCapabilities.First().Value.ToString(); + _readerCompressionController = new XCompressionController((CompressionAlgorithms)Enum.Parse(typeof(CompressionAlgorithms), compressionAlgorithm), false); + _writerCompressionController = new XCompressionController((CompressionAlgorithms)Enum.Parse(typeof(CompressionAlgorithms), compressionAlgorithm), true); + _packetReaderWriter = new XPacketReaderWriter(_stream, _readerCompressionController, _writerCompressionController, _myNetworkStream.Socket); + + } + } + } + } + + try + { + _protocol.SetCapabilities(clientCapabilities); + } + catch (MySqlException ex) + { + if (ex.Message == "Capability 'session_connect_attrs' doesn't exist") + clientCapabilities.Remove("session_connect_attrs"); + _protocol.SetCapabilities(clientCapabilities); + } + } + + /// + /// Reorder the list of algorithms retrieved from server to the preferred order + /// + private void VerifyDefaultOrder(ref string[] algorithms) + { + var clientSupportedAlgorithms = Enum.GetNames(typeof(CompressionAlgorithms)); + List output = new List(); + foreach (var item in clientSupportedAlgorithms) + { + if (algorithms.Contains(item)) + { + output.Add(item); + } + } + algorithms = output.ToArray(); + } + + /// + /// Validate the algorithms given in the connection string are valid compared with enum CompressionAlgorithms + /// + public List NegotiateUserAgainstClientAlgorithms(string inputString) + { + inputString = inputString.Contains("[") ? inputString.Replace("[", string.Empty) : inputString; + inputString = inputString.Contains("]") ? inputString.Replace("]", string.Empty) : inputString; + inputString.Trim(); + if (string.IsNullOrEmpty(inputString)) + { + return Enum.GetNames(typeof(CompressionAlgorithms)).ToList(); + } + var elements = inputString.ToLowerInvariant().Split(','); + List ret = new List(); + for (var i = 0; i < elements.Length; i++) + { + switch (elements[i].ToLowerInvariant()) + { + case "lz4": + case "lz4_message": + elements[i] = CompressionAlgorithms.lz4_message.ToString(); + break; + case "zstd": + case "zstd_stream": + elements[i] = CompressionAlgorithms.zstd_stream.ToString(); + break; + + case "deflate": + case "deflate_stream": +#if NETFRAMEWORK + if (elements.Length == 1 && Settings.Compression == CompressionType.Required) + { + throw new NotSupportedException(string.Format(ResourcesX.CompressionForSpecificAlgorithmNotSupportedInNetFramework, elements[i])); + } +#else + elements[i] = CompressionAlgorithms.deflate_stream.ToString(); +#endif + break; + + } + if (Enum.IsDefined(typeof(CompressionAlgorithms), elements[i])) + { + ret.Add(elements[i]); + } + } + return ret; + } + + /// + /// Negotiates compression capabilities with the server. + /// + /// An array containing the compression algorithms supported by the server. + /// An array containing the compression algorithms given by user/client. + private Dictionary NegotiateCompression(string[] serverSupportedAlgorithms, List clientAgainstUserAlgorithms) + { + if (serverSupportedAlgorithms == null || serverSupportedAlgorithms.Length == 0) + { + if (Settings.Compression == CompressionType.Required && clientAgainstUserAlgorithms.Count > 0) + { + throw new NotSupportedException(ResourcesX.CompressionAlgorithmNegotiationFailed); + } + return null; + } + + // If server and client don't have matching compression algorithms either log a warning message + // or raise an exception based on the selected compression type. + if (!clientAgainstUserAlgorithms.Any(element => serverSupportedAlgorithms.Contains(element))) + { + if (Settings.Compression == CompressionType.Preferred) + { + MySqlTrace.LogWarning(-1, ResourcesX.CompressionAlgorithmNegotiationFailed); + return null; + } + else if (Settings.Compression == CompressionType.Required) + { + throw new NotSupportedException(ResourcesX.CompressionAlgorithmNegotiationFailed); + } + } + + string negotiatedAlgorithm = null; + for (int index = 0; index < clientAgainstUserAlgorithms.Count; index++) + { + if (!serverSupportedAlgorithms.Contains(clientAgainstUserAlgorithms[index])) + { + continue; + } + + negotiatedAlgorithm = clientAgainstUserAlgorithms[index]; + break; + } + + if (negotiatedAlgorithm == null) + { + return null; + } + + // Create the compression capability object. + var compressionCapabilities = new Dictionary(); + compressionCapabilities.Add(XCompressionController.ALGORITHMS_SUBKEY, negotiatedAlgorithm); + compressionCapabilities.Add(XCompressionController.SERVER_COMBINE_MIXED_MESSAGES_SUBKEY, XCompressionController.DEFAULT_SERVER_COMBINE_MIXED_MESSAGES_VALUE); + + // TODO: For future use. + //compressionCapabilities.Add(XCompressionController.SERVER_MAX_COMBINE_MESSAGES_SUBKEY, XCompressionController.DEFAULT_SERVER_MAX_COMBINE_MESSAGES_VALUE); + + return compressionCapabilities; + } + + private Dictionary GetConnectionAttributes(string connectionAttrs) + { + Dictionary attrs = new Dictionary(); + + if (connectionAttrs.StartsWith("[") && connectionAttrs.EndsWith("]")) + { + connectionAttrs = connectionAttrs.Substring(1, connectionAttrs.Length - 2); + + if (!string.IsNullOrWhiteSpace(connectionAttrs)) + { + foreach (var pair in connectionAttrs.Split(',')) + { + string[] keyValue = pair.Split('='); + string key = keyValue[0].Trim(); + string value = keyValue.Length > 1 ? keyValue[1].Trim() : string.Empty; + + if (key == string.Empty) + throw new MySqlException(ResourcesX.EmptyKeyConnectionAttribute); + + if (key.StartsWith("_")) + throw new MySqlException(ResourcesX.InvalidUserDefinedAttribute); + + try { attrs.Add(key, value); } + catch (ArgumentException) { throw new MySqlException(string.Format(ResourcesX.DuplicateUserDefinedAttribute, key)); } + } + } + } + else if (connectionAttrs != "true") + throw new MySqlException(ResourcesX.InvalidConnectionAttributes); + + MySqlConnectAttrs clientAttrs = new MySqlConnectAttrs(); + attrs.Add("_pid", clientAttrs.PID); + attrs.Add("_platform", clientAttrs.Platform); + attrs.Add("_os", clientAttrs.OSName); + attrs.Add("_source_host", Settings.Server); + attrs.Add("_client_name", clientAttrs.ClientName); + attrs.Add("_client_version", clientAttrs.ClientVersion); + attrs.Add("_client_license", clientAttrs.ClientLicence); + attrs.Add("_framework", clientAttrs.Framework); + + return attrs; + } + + private void AuthenticateMySQL41() + { + MySQL41AuthenticationPlugin plugin = new MySQL41AuthenticationPlugin(Settings); + _protocol.SendAuthStart(plugin.AuthName, null, null); + byte[] extraData = _protocol.ReadAuthContinue(); + _protocol.SendAuthContinue(plugin.Continue(extraData)); + _protocol.ReadAuthOk(); + } + + private void AuthenticatePlain() + { + PlainAuthenticationPlugin plugin = new PlainAuthenticationPlugin(Settings); + _protocol.SendAuthStart(plugin.AuthName, plugin.GetAuthData(), null); + _protocol.ReadAuthOk(); + } + + private void AuthenticateExternal() + { + ExternalAuthenticationPlugin plugin = new ExternalAuthenticationPlugin(Settings); + _protocol.SendAuthStart(plugin.AuthName, Encoding.UTF8.GetBytes(""), null); + _protocol.ReadAuthOk(); + } + + private void AuthenticateSha256Memory() + { + Sha256MemoryAuthenticationPlugin plugin = new Sha256MemoryAuthenticationPlugin(); + _protocol.SendAuthStart(plugin.PluginName, null, null); + byte[] nonce = _protocol.ReadAuthContinue(); + + string data = $"{Settings.Database}\0{Settings.UserID}\0"; + byte[] byteData = Encoding.UTF8.GetBytes(data); + byte[] clientHash = plugin.GetClientHash(Settings.Password, nonce); + byte[] authData = new byte[byteData.Length + clientHash.Length]; + byteData.CopyTo(authData, 0); + clientHash.CopyTo(authData, byteData.Length); + + _protocol.SendAuthContinue(authData); + _protocol.ReadAuthOk(); + } + + protected internal void SetState(SessionState newState, bool broadcast) + { + if (newState == SessionState && !broadcast) + return; + SessionState oldSessionState = SessionState; + SessionState = newState; + + //TODO check if we need to send this event + //if (broadcast) + //OnStateChange(new StateChangeEventArgs(oldConnectionState, connectionState)); + } + + internal override ProtocolBase GetProtocol() + { + return _protocol; + } + + public override void Close() + { + try + { + try + { + // Deallocate compression objects. + _readerCompressionController?.Close(); + _writerCompressionController?.Close(); + + // Deallocate all the remaining prepared statements for current session. + foreach (int stmtId in _preparedStatements) + { + if (!_myNetworkStream.IsSocketClosed) + { + DeallocatePreparedStatement(stmtId); + } + _preparedStatements.Remove(stmtId); + } + } + catch (Exception) + { + //TODO log exception + } + + if (!_myNetworkStream.IsSocketClosed) + { + _protocol.SendSessionClose(); + } + } + finally + { + SessionState = SessionState.Closed; + _stream.Dispose(); + } + } + + public void CreateCollection(string schemaName, string collectionName) + { + ExecuteCmdNonQuery(XpluginStatementCommand.XPLUGIN_STMT_CREATE_COLLECTION, + true, + new KeyValuePair("schema", schemaName), + new KeyValuePair("name", collectionName)); + } + + /// + /// Prepare the dictionary of arguments required to create a MySQL message. + /// + /// The name of the MySQL schema. + /// The name of the collection. + /// This object hold the parameters required to create the collection. + /// + /// Collection referente. + public void CreateCollection(string schemaName, string collectionName, CreateCollectionOptions options) + { + var dictionary = new Dictionary(); + if (!options.Equals(null)) + { + if (!string.IsNullOrEmpty(options.Validation.Level.ToString())) + { + dictionary.Add("level", (string)options.Validation.Level.ToString().ToLowerInvariant()); + } + + if (!string.IsNullOrEmpty(options.Validation.Schema)) + { + dictionary.Add("schema", new DbDoc(options.Validation.Schema)); + } + } + + ExecuteCmdNonQueryOptions(XpluginStatementCommand.XPLUGIN_STMT_CREATE_COLLECTION, + true, + new KeyValuePair("schema", schemaName), + new KeyValuePair("name", collectionName), + new KeyValuePair("reuse_existing", options.ReuseExisting), + new KeyValuePair("options", dictionary) + ); + } + + /// + /// Prepare the dictionary of arguments required to Modify a MySQL message. + /// + /// The name of the MySQL schema. + /// The name of the collection. + /// This object hold the parameters required to Modify the collection. + /// + public void ModifyCollection(string schemaName, string collectionName, ModifyCollectionOptions? options) + { + var dictionary = new Dictionary(); + if (!options.Equals(null)) + { + if (options.Value.Validation.Level != null) + { + dictionary.Add("level", options.Value.Validation.Level.ToString().ToLowerInvariant()); + } + if (options.Value.Validation.Schema != null) + { + dictionary.Add("schema", new DbDoc(options.Value.Validation.Schema)); + } + } + ExecuteCmdNonQueryOptions(XpluginStatementCommand.XPLUGIN_STMT_MODIFY_COLLECTION, + true, + new KeyValuePair("schema", schemaName), + new KeyValuePair("name", collectionName), + new KeyValuePair("options", dictionary)); + } + + public void DropCollection(string schemaName, string collectionName) + { + ExecuteCmdNonQuery(XpluginStatementCommand.XPLUGIN_STMT_DROP_COLLECTION, + true, + new KeyValuePair("schema", schemaName), + new KeyValuePair("name", collectionName)); + } + + public Result CreateCollectionIndex(CreateCollectionIndexStatement statement) + { + List> args = new List>(); + args.Add(new KeyValuePair("name", statement.createIndexParams.IndexName)); + args.Add(new KeyValuePair("collection", statement.Target.Name)); + args.Add(new KeyValuePair("schema", statement.Target.Schema.Name)); + args.Add(new KeyValuePair("unique", false)); + + if (statement.createIndexParams.Type != null) + args.Add(new KeyValuePair("type", statement.createIndexParams.Type)); + + for (int i = 0; i < statement.createIndexParams.Fields.Count; i++) + { + var field = statement.createIndexParams.Fields[i]; + var dictionary = new Dictionary(); + dictionary.Add("member", field.Field); + if (field.Type != null) + dictionary.Add("type", field.Type); + + if (field.Required == null) + dictionary.Add("required", false); + else + dictionary.Add("required", (bool)field.Required); + + if (field.Options != null) + dictionary.Add("options", (ulong)field.Options); + + if (field.Srid != null) + dictionary.Add("srid", (ulong)field.Srid); + + if (field.Array != null) + dictionary.Add("array", (bool)field.Array); + + args.Add(new KeyValuePair("constraint", dictionary)); + } + + return ExecuteCreateCollectionIndex(XpluginStatementCommand.XPLUGIN_STMT_CREATE_COLLECTION_INDEX, false, args.ToArray()); + } + + public void DropCollectionIndex(string schemaName, string collectionName, string indexName) + { + List> args = new List>(); + args.Add(new KeyValuePair("schema", schemaName)); + args.Add(new KeyValuePair("collection", collectionName)); + args.Add(new KeyValuePair("name", indexName)); + ExecuteCmdNonQuery(XpluginStatementCommand.XPLUGIN_STMT_DROP_COLLECTION_INDEX, false, args.ToArray()); + } + + public long TableCount(Schema schema, string name, string type) + { + try + { + string sql = String.Format("SELECT COUNT(*) FROM {0}.{1}", + ExprUnparser.QuoteIdentifier(schema.Name), ExprUnparser.QuoteIdentifier(name)); + return (long)ExecuteQueryAsScalar(sql); + } + catch (MySqlException ex) when (ex.Code == 1146) + { + throw new MySqlException(string.Format(ResourcesX.CollectionTableDoesNotExist, type.ToString(), name, schema.Name), (int)ex.Code); + } + } + + public bool TableExists(Schema schema, string name) + { + string sql = String.Format("SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '{0}' AND table_name = '{1}'", + schema.Name, name); + long count = (long)ExecuteQueryAsScalar(sql); + return count != 0; + } + + private Result ExecuteCmdNonQuery(string cmd, bool throwOnFail, params KeyValuePair[] args) + { + _protocol.SendExecuteStatement(mysqlxNamespace, cmd, args); + return new Result(this); + } + + private Result ExecuteCmdNonQueryOptions(string cmd, bool throwOnFail, params KeyValuePair[] args) + { + _protocol.SendExecuteStatementOptions(mysqlxNamespace, cmd, args); + return new Result(this); + } + + private Result ExecuteCreateCollectionIndex(string cmd, bool throwOnFail, params KeyValuePair[] args) + { + _protocol.SendCreateCollectionIndexStatement(mysqlxNamespace, cmd, args); + return new Result(this); + } + + public List GetObjectList(Schema s, params string[] types) where T : DatabaseObject + { + for (int i = 0; i < types.Length; i++) + types[i] = types[i].ToUpperInvariant(); + RowResult result = GetRowResult("list_objects", new KeyValuePair("schema", s.Name)); + var rows = result.FetchAll(); + + List docs = new List(); + foreach (var row in rows) + { + if (!types.Contains(row.GetString("type").ToUpperInvariant())) continue; + + List parameters = new List(new object[] { s, row.GetString("name") }); + if (row["name"] is Byte[]) + { + Byte[] byteArray = row["name"] as Byte[]; + parameters[1] = Encoding.UTF8.GetString(byteArray, 0, byteArray.Length); + } + + switch (row.GetString("type").ToUpperInvariant()) + { + case "TABLE": + parameters.Add(false); + break; + case "VIEW": + parameters.Add(true); + break; + } + T t = (T)Activator.CreateInstance(typeof(T), + BindingFlags.NonPublic | BindingFlags.Instance, + null, parameters.ToArray(), null); + docs.Add(t); + } + return docs; + } + + public string GetObjectType(Schema s, string name) + { + RowResult result = GetRowResult("list_objects", + new KeyValuePair("schema", s.Name), + new KeyValuePair("pattern", name)); + var row = result.FetchOne(); + if (row == null) + throw new MySqlException(string.Format(ResourcesX.NoObjectFound, name)); + System.Diagnostics.Debug.Assert(result.FetchOne() == null); + return row.GetString("type"); + } + + public RowResult GetRowResult(string cmd, params KeyValuePair[] args) + { + _protocol.SendExecuteStatement(mysqlxNamespace, cmd, args); + return new RowResult(this); + } + + public Result Insert(Collection collection, object[] json, List newIds, bool upsert) + { + _protocol.SendInsert(collection.Schema.Name, false, collection.Name, json, null, upsert); + return new Result(this); + } + + public Result DeleteDocs(RemoveStatement rs) + { + _protocol.SendDelete(rs.Target.Schema.Name, rs.Target.Name, false, rs.FilterData); + return new Result(this); + } + + public Result DeleteRows(TableDeleteStatement statement) + { + _protocol.SendDelete(statement.Target.Schema.Name, + statement.Target.Name, true, + statement.FilterData); + return new Result(this); + } + + public Result ModifyDocs(ModifyStatement ms) + { + _protocol.SendUpdate(ms.Target.Schema.Name, ms.Target.Name, false, ms.FilterData, ms.Updates); + return new Result(this); + } + + public Result UpdateRows(TableUpdateStatement statement) + { + _protocol.SendUpdate(statement.Target.Schema.Name, + statement.Target.Name, true, + statement.FilterData, + statement.updates); + return new Result(this); + } + + public DocResult FindDocs(FindStatement fs) + { + _protocol.SendFind(fs.Target.Schema.Name, fs.Target.Name, false, fs.FilterData, fs.findParams); + DocResult result = new DocResult(this); + return result; + } + + public RowResult FindRows(TableSelectStatement ss) + { + _protocol.SendFind(ss.Target.Schema.Name, ss.Target.Name, true, ss.FilterData, ss.findParams); + return new RowResult(this); + } + + public Result InsertRows(TableInsertStatement statement) + { + _protocol.SendInsert(statement.Target.Schema.Name, true, statement.Target.Name, statement.values.ToArray(), statement.fields, false); + return new Result(this); + } + + protected Result ExpectOpen(Mysqlx.Expect.Open.Types.Condition.Types.Key condition, object value = null) + { + _protocol.SendExpectOpen(condition, value); + return new Result(this); + } + + public Result ExpectDocidGenerated() + { + return ExpectOpen(Mysqlx.Expect.Open.Types.Condition.Types.Key.ExpectDocidGenerated); + } + + public void ResetSession() + { + if (_sessionResetNoReauthentication == null) + { + try + { + if (!_myNetworkStream.IsSocketClosed) + { + ExpectOpen(Mysqlx.Expect.Open.Types.Condition.Types.Key.ExpectFieldExist, "6.1"); + } + _sessionResetNoReauthentication = true; + } + catch + { + _sessionResetNoReauthentication = false; + } + } + + if (!_myNetworkStream.IsSocketClosed) + { + _protocol.SendResetSession((bool)_sessionResetNoReauthentication); + _protocol.ReadOk(); + } + } + + public int PrepareStatement(BaseStatement statement) + where TResult : BaseResult + { + int stmtId = Interlocked.Increment(ref _stmtId); + string stmtType = statement.GetType().Name; + + if (stmtType == typeof(FindStatement<>).Name) + { + FindStatement fs = statement as FindStatement; + string s = typeof(TDoc).Name; + Debug.Assert(fs != null); + _protocol.SendPrepareStatement( + (uint)stmtId, + DataAccess.PreparedStatementType.Find, + fs.Target.Schema.Name, + fs.Target.Name, + false, + fs.FilterData, + fs.findParams); + } + else if (stmtType == typeof(TableSelectStatement).Name) + { + TableSelectStatement ss = statement as TableSelectStatement; + Debug.Assert(ss != null); + _protocol.SendPrepareStatement( + (uint)stmtId, + DataAccess.PreparedStatementType.Find, + ss.Target.Schema.Name, + ss.Target.Name, + true, + ss.FilterData, + ss.findParams); + } + else if (stmtType == typeof(ModifyStatement<>).Name) + { + ModifyStatement ms = statement as ModifyStatement; + Debug.Assert(ms != null); + _protocol.SendPrepareStatement( + (uint)stmtId, + DataAccess.PreparedStatementType.Update, + ms.Target.Schema.Name, + ms.Target.Name, + false, + ms.FilterData, + null, + ms.Updates); + } + else if (stmtType == typeof(TableUpdateStatement).Name) + { + TableUpdateStatement us = statement as TableUpdateStatement; + Debug.Assert(us != null); + _protocol.SendPrepareStatement( + (uint)stmtId, + DataAccess.PreparedStatementType.Update, + us.Target.Schema.Name, + us.Target.Name, + true, + us.FilterData, + null, + us.updates); + } + else if (stmtType == typeof(RemoveStatement<>).Name) + { + string s = typeof(TDoc).Name; + RemoveStatement rs = statement as RemoveStatement; + Debug.Assert(rs != null); + _protocol.SendPrepareStatement( + (uint)stmtId, + DataAccess.PreparedStatementType.Delete, + rs.Target.Schema.Name, + rs.Target.Name, + false, + rs.FilterData, + null); + } + else if (stmtType == typeof(TableDeleteStatement).Name) + { + TableDeleteStatement ds = statement as TableDeleteStatement; + Debug.Assert(ds != null); + _protocol.SendPrepareStatement( + (uint)stmtId, + DataAccess.PreparedStatementType.Delete, + ds.Target.Schema.Name, + ds.Target.Name, + true, + ds.FilterData, + null); + } + else if (stmtType == typeof(TableInsertStatement).Name) + { + TableInsertStatement insert = statement as TableInsertStatement; + Debug.Assert(insert != null); + _protocol.SendPrepareStatement( + (uint)stmtId, + DataAccess.PreparedStatementType.Insert, + insert.Target.Schema.Name, + insert.Target.Name, + true, + null, + null, + null, + insert.values.ToArray(), + insert.fields, + false); + } + else if (stmtType == typeof(SqlStatement).Name) + { + SqlStatement sqlStatement = statement as SqlStatement; + Debug.Assert(sqlStatement != null); + _protocol.SendPrepareStatement( + (uint)stmtId, + DataAccess.PreparedStatementType.SqlStatement, + null, + null, + true, + null, + null, + null, + sqlStatement.parameters.ToArray(), + null, + false, + sqlStatement.SQL); + } + else + { + throw new NotSupportedException(statement.GetType().Name); + } + + _preparedStatements.Add(stmtId); + return stmtId; + } + + public TResult ExecutePreparedStatement(int stmtId, IEnumerable args) + where TResult : BaseResult + { + _protocol.SendExecutePreparedStatement((uint)stmtId, args); + BaseResult result = null; + if (typeof(TResult) == typeof(DocResult)) + result = new DocResult(this); + else if (typeof(TResult) == typeof(RowResult)) + result = new RowResult(this); + else if (typeof(TResult) == typeof(SqlResult)) + result = new SqlResult(this); + else if (typeof(TResult) == typeof(Result)) + result = new Result(this); + else + throw new ArgumentNullException(typeof(TResult).Name); + + return (TResult)result; + } + + public void DeallocatePreparedStatement(int stmtId) + { + _protocol.SendDeallocatePreparedStatement((uint)stmtId); + _preparedStatements.Remove(stmtId); + } + + /// + /// Gets the compression algorithm being used to compress or decompress data. + /// + /// Flag to indicate if the compression algorithm should be + /// retrieved from the reader or writer controller. + /// The name of the compression algorithm being used if any. + /// null if no compression algorithm is being used. + public string GetCompressionAlgorithm(bool fromReaderController) + { + if (fromReaderController && _readerCompressionController != null) + { + return _readerCompressionController.CompressionAlgorithm.ToString(); + } + else if (!fromReaderController && _writerCompressionController != null) + { + return _writerCompressionController.CompressionAlgorithm.ToString(); + } + + return null; + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/BaseSession.cs b/MySQL.Data/src/X/XDevAPI/BaseSession.cs new file mode 100644 index 000000000..8be04de67 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/BaseSession.cs @@ -0,0 +1,834 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySql.Data.Common; +using MySql.Data.Failover; +using MySql.Data.MySqlClient; +using MySqlX.Common; +using MySqlX.Sessions; +using MySqlX.XDevAPI.Relational; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; + +namespace MySqlX.XDevAPI +{ + /// + /// Represents a base class for a Session. + /// + public abstract class BaseSession : IDisposable + { + private InternalSession _internalSession; + private string _connectionString; + private bool _isDefaultPort = true; + private const uint X_PROTOCOL_DEFAULT_PORT = 33060; + private const char CONNECTION_DATA_KEY_SEPARATOR = ';'; + private const char CONNECTION_DATA_VALUE_SEPARATOR = '='; + private const string PORT_CONNECTION_OPTION_KEYWORD = "port"; + private const string SERVER_CONNECTION_OPTION_KEYWORD = "server"; + private const string CONNECT_TIMEOUT_CONNECTION_OPTION_KEYWORD = "connect-timeout"; + private const string CONNECTION_ATTRIBUTES_CONNECTION_OPTION_KEYWORD = "connection-attributes"; + private const string DNS_SRV_CONNECTION_OPTION_KEYWORD = "dns-srv"; + private const string DNS_SRV_URI_SCHEME = "mysqlx+srv"; + private const string MYSQLX_URI_SCHEME = "mysqlx"; + internal QueueTaskScheduler _scheduler = new QueueTaskScheduler(); + protected readonly Client _client; + + internal InternalSession InternalSession + { + get + { + if (_internalSession == null) + throw new MySqlException(ResourcesX.InvalidSession); + return _internalSession; + } + } + + internal XInternalSession XSession + { + get { return InternalSession as XInternalSession; } + } + + internal DateTime IdleSince { get; set; } + + #region Session status properties + + private DBVersion? _version = null; + + internal DBVersion Version => _version ?? (_version = XSession.GetServerVersion()).Value; + + private int? _threadId = null; + internal int ThreadId => _threadId ?? (_threadId = XSession.GetThreadId()).Value; + + /// + /// Flag to set if prepared statements are supported. + /// + internal bool SupportsPreparedStatements { get; set; } = true; + + #endregion + + /// + /// Gets the connection settings for this session. + /// + public MySqlXConnectionStringBuilder Settings { get; private set; } + + /// + /// Gets the currently active schema. + /// + public Schema Schema { get; protected set; } + + /// + /// Gets the default schema provided when creating the session. + /// + public Schema DefaultSchema { get; private set; } + + /// + /// Gets the connection uri representation of the connection options provided during the creation of the session. + /// + public String Uri + { + get + { + var builder = new StringBuilder(string.Format("mysqlx://{0}:{1}{2}?", + Settings.Server, + Settings.Port, + string.IsNullOrEmpty(Settings.Database) ? + string.Empty : + "/" + Settings.Database)); + var firstItemAdded = false; + var certificateFileAdded = false; + foreach (var item in Settings.values) + { + // Skip connection options already included in the connection URI. + if (item.Key == "server" || item.Key == "database" || item.Key == "port") + continue; + + // Skip CertificateFile if it has already been included. + if ((item.Key == "certificatefile" || item.Key == "sslca") && certificateFileAdded) + continue; + + try + { + var value = Settings[item.Key]; + // Get the default value of the connection option. + var option = MySqlXConnectionStringBuilder.Options.Values.First( + o => o.Keyword == item.Key || + (o.Synonyms != null && o.Synonyms.Contains(item.Key))); + var defaultValue = option.DefaultValue; + // If the default value has been changed then include it in the connection URI. + if (value != null && (defaultValue == null || (value.ToString() != defaultValue.ToString()))) + { + if (!firstItemAdded) + firstItemAdded = true; + else + builder.Append("&"); + + if (item.Key == "certificatefile" || item.Key == "sslca") + { + certificateFileAdded = true; + builder.Append("sslca"); + } + else + builder.Append(item.Key); + builder.Append("="); + builder.Append(value is bool ? value.ToString().ToLower() : value.ToString()); + } + } + // Dismiss any not supported exceptions since they are expected. + catch (NotSupportedException) { } + catch (ArgumentException) { } + } + + return builder.ToString(); + } + } + + /// + /// Initializes a new instance of the BaseSession class based on the specified connection string. + /// + /// The connection used to create the session. + /// A object. + /// is null. + /// Unable to parse the when + /// in URI format. + /// + /// When using Unix sockets the protocol=unix or protocol=unixsocket connection option is required. + /// This will enable elements passed in the server connection option to be treated as Unix sockets. The user is also required + /// to explicitly set sslmode to none since X Plugin does not support SSL when using Unix sockets. Note that + /// protocol=unix and protocol=unixsocket are synonyms. + ///   + /// Multiple hosts can be specified as part of the , + /// which enables client-side failover when trying to establish a connection. + ///   + /// Connection URI examples: + /// - mysqlx://test:test@[192.1.10.10,localhost] + /// - mysqlx://test:test@[192.1.10.10,127.0.0.1] + /// - mysqlx://root:@[../tmp/mysqlx.sock,/tmp/mysqld.sock]?protocol=unix&sslmode=none + /// - mysqlx://test:test@[192.1.10.10:33060,127.0.0.1:33060] + /// - mysqlx://test:test@[192.1.10.10,120.0.0.2:22000,[::1]:33060]/test?connectiontimeout=10 + /// - mysqlx://test:test@[(address=server.example,priority=20),(address=127.0.0.1,priority=100)] + /// - mysqlx://test:test@[(address=server.example,priority=100),(address=127.0.0.1,priority=75),(address=192.0.10.56,priority=25)] + /// + ///   + /// Connection string examples: + /// - server=10.10.10.10,localhost;port=33060;uid=test;password=test; + /// - host=10.10.10.10,192.101.10.2,localhost;port=5202;uid=test;password=test; + /// - host=./tmp/mysqld.sock,/var/run/mysqldx.sock;port=5202;uid=root;protocol=unix;sslmode=none; + /// - server=(address=server.example,priority=20),(address=127.0.0.1,priority=100);port=33060;uid=test;password=test; + /// - server=(address=server.example,priority=100),(address=127.0.0.1,priority=75),(address=192.0.10.56,priority=25);port=33060;uid=test;password=test; + /// + ///   + /// Failover methods + /// - Sequential: Connection attempts will be performed in a sequential order, that is, one after another until + /// a connection is successful or all the elements from the list have been tried. + /// + /// - Priority based: If a priority is provided, the connection attemps will be performed in descending order, starting + /// with the host with the highest priority. Priority must be a value between 0 and 100. Additionally, it is required to either + /// give a priority for every host or no priority to any host. + /// + /// + internal BaseSession(string connectionString, Client client = null) : this() + { + if (string.IsNullOrWhiteSpace(connectionString)) + throw new ArgumentNullException("connectionString"); + + _client = client; + this._connectionString = ParseConnectionData(connectionString, client); + + // Multiple hosts were specified. + if (FailoverManager.FailoverGroup != null && FailoverManager.FailoverGroup.Hosts?.Count > 1) + { + _internalSession = FailoverManager.AttemptConnectionXProtocol(this._connectionString, out this._connectionString, _isDefaultPort, client); + Settings.ConnectionString = this._connectionString; + Settings.AnalyzeConnectionString(this._connectionString, true, _isDefaultPort); + } + // A single host was specified. + else + { + Settings.ConnectionString = _connectionString; + if (!(_connectionString.Contains("sslmode") || _connectionString.Contains("ssl mode") || _connectionString.Contains("ssl-mode"))) + Settings.SslMode = MySqlSslMode.Required; + Settings.AnalyzeConnectionString(this._connectionString, true, _isDefaultPort); + + if (Settings.DnsSrv) + { + var dnsSrvRecords = DnsSrv.GetDnsSrvRecords(Settings.Server); + FailoverManager.SetHostList(dnsSrvRecords.ConvertAll(r => new FailoverServer(r.Target, r.Port, r.Priority)), + FailoverMethod.Sequential); + _internalSession = FailoverManager.AttemptConnectionXProtocol(this._connectionString, out this._connectionString, _isDefaultPort, client); + Settings.ConnectionString = this._connectionString; + } + else + _internalSession = InternalSession.GetSession(Settings); + } + + // Set the default schema if provided by the user. + if (!string.IsNullOrWhiteSpace(Settings.Database)) + DefaultSchema = GetSchema(Settings.Database); + } + + /// + /// Initializes a new instance of the BaseSession class based on the specified anonymous type object. + /// + /// The connection data as an anonymous type used to create the session. + /// A object. + /// is null. + /// + /// Multiple hosts can be specified as part of the , which enables client-side failover when trying to + /// establish a connection. + ///   + /// To assign multiple hosts, create a property similar to the connection string examples shown in + /// . Note that the value of the property must be a string. + /// + /// + internal BaseSession(object connectionData, Client client = null) : this() + { + if (connectionData == null) + throw new ArgumentNullException("connectionData"); + + _client = client; + if (client == null) + FailoverManager.Reset(); + + var values = Tools.GetDictionaryFromAnonymous(connectionData); + if (!values.Keys.Any(s => s.ToLowerInvariant() == PORT_CONNECTION_OPTION_KEYWORD)) + values.Add(PORT_CONNECTION_OPTION_KEYWORD, X_PROTOCOL_DEFAULT_PORT); + + bool hostsParsed = false; + foreach (var value in values) + { + if (!Settings.ContainsKey(value.Key)) + throw new KeyNotFoundException(string.Format(ResourcesX.InvalidConnectionStringAttribute, value.Key)); + + Settings.SetValue(value.Key, value.Value); + if (!hostsParsed && !string.IsNullOrEmpty(Settings[SERVER_CONNECTION_OPTION_KEYWORD].ToString())) + { + var server = value.Value.ToString(); + if (IsUnixSocket(server)) + Settings.SetValue(value.Key, server = NormalizeUnixSocket(server)); + + FailoverManager.ParseHostList(server, true, false); + if (FailoverManager.FailoverGroup != null && FailoverManager.FailoverGroup.Hosts?.Count > 1) + Settings[SERVER_CONNECTION_OPTION_KEYWORD] = null; + else if (FailoverManager.FailoverGroup != null) + Settings[SERVER_CONNECTION_OPTION_KEYWORD] = FailoverManager.FailoverGroup.Hosts[0].Host; + + hostsParsed = true; + } + } + this._connectionString = Settings.ToString(); + + Settings.AnalyzeConnectionString(this._connectionString, true, _isDefaultPort); + if (FailoverManager.FailoverGroup != null && FailoverManager.FailoverGroup.Hosts?.Count > 1) + { + // Multiple hosts were specified. + _internalSession = FailoverManager.AttemptConnectionXProtocol(this._connectionString, out this._connectionString, _isDefaultPort, client); + Settings.ConnectionString = _connectionString; + } + else + { + if (Settings.DnsSrv) + { + var dnsSrvRecords = DnsSrv.GetDnsSrvRecords(Settings.Server); + FailoverManager.SetHostList(dnsSrvRecords.ConvertAll(r => new FailoverServer(r.Target, r.Port, null)), + FailoverMethod.Sequential); + _internalSession = FailoverManager.AttemptConnectionXProtocol(this._connectionString, out this._connectionString, _isDefaultPort, client); + Settings.ConnectionString = this._connectionString; + } + else + _internalSession = InternalSession.GetSession(Settings); + } + + if (!string.IsNullOrWhiteSpace(Settings.Database)) + DefaultSchema = GetSchema(Settings.Database); + } + + internal BaseSession(InternalSession internalSession, Client client) + { + _internalSession = internalSession; + Settings = internalSession.Settings; + _client = client; + } + + // Constructor used exclusively to parse connection string or connection data + internal BaseSession() + { + Settings = new MySqlXConnectionStringBuilder(); + } + + /// + /// Drops the database/schema with the given name. + /// + /// The name of the schema. + /// is null. + public void DropSchema(string schema) + { + if (string.IsNullOrWhiteSpace(schema)) throw new ArgumentNullException(nameof(schema)); + Schema s = this.GetSchema(schema); + if (!s.ExistsInDatabase()) return; + InternalSession.ExecuteSqlNonQuery("DROP DATABASE `" + schema + "`"); + } + + /// + /// Creates a schema/database with the given name. + /// + /// The name of the schema/database. + /// A object that matches the recently created schema/database. + public Schema CreateSchema(string schema) + { + InternalSession.ExecuteSqlNonQuery("CREATE DATABASE `" + schema + "`"); + return new Schema(this, schema); + } + + /// + /// Gets the schema with the given name. + /// + /// The name of the schema. + /// A object set with the provided schema name. + public Schema GetSchema(string schema) + { + this.Schema = new Schema(this, schema); + return this.Schema; + } + + /// + /// Gets a list of schemas (or databases) in this session. + /// + /// A list containing all existing schemas (or databases). + public List GetSchemas() + { + RowResult result = XSession.GetSqlRowResult("select * from information_schema.schemata"); + result.FetchAll(); + var query = from row in result.Rows + select new Schema(this, row.GetString("schema_name")); + return query.ToList(); + } + + /// + /// Starts a new transaction. + /// + public void StartTransaction() + { + InternalSession.ExecuteSqlNonQuery("START TRANSACTION"); + } + + /// + /// Commits the current transaction. + /// + /// A object containing the results of the commit operation. + public void Commit() + { + InternalSession.ExecuteSqlNonQuery("COMMIT"); + } + + /// + /// Rolls back the current transaction. + /// + public void Rollback() + { + InternalSession.ExecuteSqlNonQuery("ROLLBACK"); + } + + /// + /// Closes this session or releases it to the pool. + /// + public void Close() + { + if (XSession.SessionState != SessionState.Closed) + { + if (_client == null) + CloseFully(); + else + { + _client.ReleaseSession(this); + XSession.SetState(SessionState.Closed, false); + _internalSession = null; + } + } + } + + /// + /// Closes this session + /// + internal void CloseFully() + { + XSession.Close(); + } + + internal void Reset() + { + XSession.ResetSession(); + } + + #region Savepoints + + /// + /// Sets a transaction savepoint with an autogenerated name. + /// + /// The autogenerated name of the transaction savepoint. + public string SetSavepoint() + { + // Autogenerate the name of the savepoint. + return SetSavepoint($"savepoint_{Guid.NewGuid().ToString().Replace("-", "_")}"); + } + + /// + /// Sets a named transaction savepoint. + /// + /// The name of the transaction savepoint. + /// The name of the transaction savepoint. + public string SetSavepoint(string name) + { + InternalSession.ExecuteSqlNonQuery($"SAVEPOINT {name}"); + return name; + } + + /// + /// Removes the named savepoint from the set of savepoints within the current transaction. + /// + /// The name of the transaction savepoint. + public void ReleaseSavepoint(string name) + { + InternalSession.ExecuteSqlNonQuery($"RELEASE SAVEPOINT {name}"); + } + + /// + /// Rolls back a transaction to the named savepoint without terminating the transaction. + /// + /// The name of the transaction savepoint. + public void RollbackTo(string name) + { + InternalSession.ExecuteSqlNonQuery($"ROLLBACK TO {name}"); + } + + #endregion + + /// + /// Parses the connection data. + /// + /// The connection string or connection URI. + /// A object. + /// An updated connection string representation of the provided connection string or connection URI. + protected internal string ParseConnectionData(string connectionData, Client client = null) + { + if (client == null) + FailoverManager.Reset(); + + if (Regex.IsMatch(connectionData, @"^mysqlx(\+\w+)?://.*", RegexOptions.IgnoreCase)) + { + return ParseConnectionUri(connectionData); + } + else + return ParseConnectionString(connectionData); + } + + /// + /// Parses a connection URI. + /// + /// The connection URI to parse. + /// The connection string representation of the provided . + private string ParseConnectionUri(string connectionUri) + { + Uri uri = null; + string updatedUri = null; + bool parseServerAsUnixSocket = false; + string hierPart = null; + try + { + uri = new Uri(connectionUri); + } + catch (UriFormatException ex) + { + if (ex.Message != "Invalid URI: The hostname could not be parsed.") + throw; + + // Identify if multiple hosts were specified. + string[] splitUri = connectionUri.Split('@', '?'); + if (splitUri.Length == 1) throw; + + hierPart = splitUri[1]; + var schema = string.Empty; + parseServerAsUnixSocket = IsUnixSocket(hierPart); + bool isArray = hierPart.StartsWith("[") && hierPart.Contains("]"); + + // Remove schema. + if ((!parseServerAsUnixSocket && hierPart.Contains("/")) && !isArray || + (parseServerAsUnixSocket && hierPart.Contains(")/")) || + (hierPart.StartsWith("[") && hierPart.Contains("]/") && isArray)) + { + schema = hierPart.Substring(hierPart.LastIndexOf('/') + 1); + hierPart = hierPart.Substring(0, hierPart.Length - schema.Length - 1); + } + + if (parseServerAsUnixSocket) + { + updatedUri = splitUri[0] + "@localhost" + + (schema != string.Empty ? "/" + schema : string.Empty) + + (splitUri.Length > 2 ? "?" + splitUri[2] : string.Empty); + } + else if (isArray) + { + hierPart = hierPart.Substring(1, hierPart.Length - 2); + int hostCount = FailoverManager.ParseHostList(hierPart, true, true); + if (FailoverManager.FailoverGroup != null) + { + hierPart = FailoverManager.FailoverGroup.ActiveHost.Host; + parseServerAsUnixSocket = IsUnixSocket(FailoverManager.FailoverGroup.ActiveHost.Host); + updatedUri = splitUri[0] + "@" + + (parseServerAsUnixSocket ? "localhost" : hierPart) + + (FailoverManager.FailoverGroup.ActiveHost.Port != -1 ? ":" + FailoverManager.FailoverGroup.ActiveHost.Port : string.Empty) + + (schema != string.Empty ? "/" + schema : string.Empty) + + (splitUri.Length == 3 ? "?" + splitUri[2] : string.Empty); + } + else if (hostCount == 1) + updatedUri = splitUri[0] + "@" + hierPart + + (schema != string.Empty ? "/" + schema : string.Empty) + + (splitUri.Length == 3 ? "?" + splitUri[2] : string.Empty); + else + throw; + } + } + + if (uri == null) + uri = updatedUri == null ? new Uri(connectionUri) : new Uri(updatedUri); + + if (uri.Scheme == DNS_SRV_URI_SCHEME) + { + if (FailoverManager.FailoverGroup != null && FailoverManager.FailoverGroup.Hosts?.Count > 1) + throw new ArgumentException(Resources.DnsSrvInvalidConnOptionMultihost); + if (!uri.IsDefaultPort) + throw new ArgumentException(Resources.DnsSrvInvalidConnOptionPort); + if (parseServerAsUnixSocket) + throw new ArgumentException(Resources.DnsSrvInvalidConnOptionUnixSocket); + } + else if (uri.Scheme != MYSQLX_URI_SCHEME) + throw new ArgumentException(string.Format(ResourcesX.DnsSrvInvalidScheme, uri.Scheme)); + + return ConvertToConnectionString(uri, hierPart, parseServerAsUnixSocket, uri.Scheme == DNS_SRV_URI_SCHEME); + } + + /// + /// Validates if the string provided is a Unix socket file. + /// + /// The Unix socket to evaluate. + /// true if is a valid Unix socket; otherwise, false. + internal static bool IsUnixSocket(string unixSocket) + { + if (unixSocket.StartsWith(".") || + unixSocket.StartsWith("/") || + unixSocket.StartsWith("(.") || + unixSocket.StartsWith("(/") || + unixSocket.StartsWith("%2") || + unixSocket.StartsWith("(%2")) + return true; + + return false; + } + + /// + /// Converts the URI object into a connection string. + /// + /// An instance with the values for the provided connection options. + /// The path of the Unix socket file. + /// If true the replaces the value for the server connection option; otherwise, false + /// Flag indicating if this is a connection using DNS SRV. + /// A connection string. + private string ConvertToConnectionString(Uri uri, string unixSocketPath, bool parseServerAsUnixSocket, bool isDnsSrvScheme) + { + List connectionParts = new List(); + + if (string.IsNullOrWhiteSpace(uri.Host)) + throw new UriFormatException(ResourcesX.InvalidUriData + "host"); + connectionParts.Add("server=" + (parseServerAsUnixSocket ? + NormalizeUnixSocket(unixSocketPath) : + uri.Host)); + connectionParts.Add("port=" + (uri.Port == -1 ? 33060 : uri.Port)); + _isDefaultPort = uri.IsDefaultPort; + if (uri.Scheme == DNS_SRV_URI_SCHEME) + connectionParts.Add("dns-srv=true"); + + if (!string.IsNullOrWhiteSpace(uri.UserInfo)) + { + string[] userData = uri.UserInfo.Split(':'); + if (userData.Length > 2) + throw new UriFormatException(ResourcesX.InvalidUriData + "user info"); + connectionParts.Add("uid=" + System.Uri.UnescapeDataString(userData[0])); + if (userData.Length > 1) + connectionParts.Add("password=" + System.Uri.UnescapeDataString(userData[1])); + } + if (uri.Segments.Length > 2) + throw new UriFormatException(ResourcesX.InvalidUriData + "segments"); + if (uri.Segments.Length > 1) + { + connectionParts.Add("database=" + System.Uri.UnescapeDataString(uri.Segments[1])); + } + if (!string.IsNullOrWhiteSpace(uri.Query)) + { + string[] queries = System.Uri.UnescapeDataString(uri.Query).Substring(1).Split(new char[] { '&' }, StringSplitOptions.RemoveEmptyEntries); + foreach (string query in queries) + { + string[] keyValue = query.Replace(";", string.Empty).Split('='); + string part; + var connectionAttributesOption = MySqlXConnectionStringBuilder.Options.Options.First(item => item.Keyword == CONNECTION_ATTRIBUTES_CONNECTION_OPTION_KEYWORD); + var dnsSrvOption = MySqlXConnectionStringBuilder.Options.Options.First(item => item.Keyword == DNS_SRV_CONNECTION_OPTION_KEYWORD); + + if (!((connectionAttributesOption.Keyword == keyValue[0]) || connectionAttributesOption.Synonyms.Contains(keyValue[0]) && keyValue.Count() > 2)) + { + if (keyValue.Length > 2) + throw new ArgumentException(ResourcesX.InvalidUriQuery + ":" + keyValue[0]); + var connecttimeoutOption = MySqlXConnectionStringBuilder.Options.Options.First(item => item.Keyword == CONNECT_TIMEOUT_CONNECTION_OPTION_KEYWORD); + if ((connecttimeoutOption.Keyword == keyValue[0] || connecttimeoutOption.Synonyms.Contains(keyValue[0])) && + String.IsNullOrWhiteSpace(keyValue[1])) + throw new FormatException(ResourcesX.InvalidConnectionTimeoutValue); + part = keyValue[0] + "=" + (keyValue.Length == 2 ? keyValue[1] : "true").Replace("(", string.Empty).Replace(")", string.Empty); + } + else if (keyValue[1] == string.Empty) + throw new MySqlException(ResourcesX.InvalidUriQuery + ": " + keyValue[0]); + else + part = keyValue[0] + "=" + query.Replace(keyValue[0] + "=", string.Empty); + + if (isDnsSrvScheme && (dnsSrvOption.Keyword == keyValue[0] || dnsSrvOption.Synonyms.Contains(keyValue[0])) && !Convert.ToBoolean(keyValue[1])) + throw new ArgumentException(string.Format(ResourcesX.DnsSrvConflictingOptions, dnsSrvOption.Keyword)); + else if (isDnsSrvScheme && (dnsSrvOption.Keyword == keyValue[0] || dnsSrvOption.Synonyms.Contains(keyValue[0]))) + continue; + + connectionParts.Add(part); + } + } + + return string.Join("; ", connectionParts); + } + + /// + /// Parses a connection string. + /// + /// The connection string to parse. + /// The parsed connection string. + private string ParseConnectionString(string connectionString) + { + var updatedConnectionString = string.Empty; + bool portProvided = false; + bool isDnsSrv = false; + var connectionOptionsDictionary = connectionString.Split(CONNECTION_DATA_KEY_SEPARATOR) + .Select(item => item.Split(new char[] { CONNECTION_DATA_VALUE_SEPARATOR }, 2)) + .Where(item => item.Length == 2) + .ToDictionary(item => item[0], item => item[1]); + var serverOption = MySqlXConnectionStringBuilder.Options.Options.First(item => item.Keyword == SERVER_CONNECTION_OPTION_KEYWORD); + var connecttimeoutOption = MySqlXConnectionStringBuilder.Options.Options.First(item => item.Keyword == CONNECT_TIMEOUT_CONNECTION_OPTION_KEYWORD); + foreach (KeyValuePair keyValuePair in connectionOptionsDictionary) + { + // Value is an equal or a semicolon + if (keyValuePair.Value == "=" || keyValuePair.Value == "\"") + throw new MySqlException(string.Format(Resources.InvalidConnectionStringValue, (keyValuePair.Value == "\"" ? ";" : "="), keyValuePair.Key)); + + // Key is not server or any of its synonyms. + if (keyValuePair.Key != serverOption.Keyword && !serverOption.Synonyms.Contains(keyValuePair.Key)) + { + if ((connecttimeoutOption.Keyword == keyValuePair.Key || connecttimeoutOption.Synonyms.Contains(keyValuePair.Key)) && + String.IsNullOrWhiteSpace(keyValuePair.Value)) + throw new FormatException(ResourcesX.InvalidConnectionTimeoutValue); + if (keyValuePair.Key == PORT_CONNECTION_OPTION_KEYWORD) + portProvided = true; + if (keyValuePair.Key == DNS_SRV_CONNECTION_OPTION_KEYWORD) + isDnsSrv = Convert.ToBoolean(keyValuePair.Value); + + updatedConnectionString += $"{keyValuePair.Key}{CONNECTION_DATA_VALUE_SEPARATOR}{keyValuePair.Value}{CONNECTION_DATA_KEY_SEPARATOR}"; + continue; + } + + // Key is server or one of its synonyms. + var updatedValue = keyValuePair.Value; + if (IsUnixSocket(keyValuePair.Value)) + updatedValue = NormalizeUnixSocket(keyValuePair.Value); + + // The value for the server connection option doesn't have a server list format. + if (FailoverManager.ParseHostList(updatedValue, true, false) == 1 && FailoverManager.FailoverGroup == null) + updatedConnectionString = $"{SERVER_CONNECTION_OPTION_KEYWORD}{CONNECTION_DATA_VALUE_SEPARATOR}{updatedValue}{CONNECTION_DATA_KEY_SEPARATOR}{updatedConnectionString}"; + } + + // DNS SRV Validation - Port cannot be provided by the user and multihost is not allowed if dns-srv is true + if (isDnsSrv) + { + if (portProvided) + throw new ArgumentException(Resources.DnsSrvInvalidConnOptionPort); + if (FailoverManager.FailoverGroup != null) + throw new ArgumentException(Resources.DnsSrvInvalidConnOptionMultihost); + } + + // Default port must be added if not provided by the user. + if (FailoverManager.FailoverGroup == null) + return portProvided ? updatedConnectionString : $"{updatedConnectionString}{CONNECTION_DATA_KEY_SEPARATOR}{PORT_CONNECTION_OPTION_KEYWORD}{CONNECTION_DATA_VALUE_SEPARATOR}{X_PROTOCOL_DEFAULT_PORT}"; + + return $"{SERVER_CONNECTION_OPTION_KEYWORD}{CONNECTION_DATA_VALUE_SEPARATOR}{FailoverManager.FailoverGroup.ActiveHost.Host}{CONNECTION_DATA_KEY_SEPARATOR}" + + (!portProvided ? $"{PORT_CONNECTION_OPTION_KEYWORD}{CONNECTION_DATA_VALUE_SEPARATOR}{X_PROTOCOL_DEFAULT_PORT}{CONNECTION_DATA_KEY_SEPARATOR}" : string.Empty) + + updatedConnectionString; + } + + /// + /// Normalizes the Unix socket by removing leading and ending parenthesis as well as removing special characters. + /// + /// The Unix socket to normalize. + /// A normalized Unix socket. + internal static string NormalizeUnixSocket(string unixSocket) + { + unixSocket = unixSocket.Replace("%2F", "/"); + if (unixSocket.StartsWith("(") && unixSocket.EndsWith(")")) + unixSocket = unixSocket.Substring(1, unixSocket.Length - 2); + + return unixSocket; + } + + #region IDisposable Support + private bool disposedValue = false; // To detect redundant calls + + /// + /// Disposes the current object. Disposes of the managed state if the flag is set to true. + /// + /// Flag to indicate if the managed state is to be disposed. + protected virtual void Dispose(bool disposing) + { + if (!disposedValue) + { + if (disposing) + { + // dispose managed state (managed objects). + Close(); + } + + // free unmanaged resources (unmanaged objects) and override a finalizer below. + // set large fields to null. + + disposedValue = true; + } + } + + // override a finalizer only if Dispose(bool disposing) above has code to free unmanaged resources. + // ~BaseSession() { + // // Do not change this code. Put cleanup code in Dispose(bool disposing) above. + // Dispose(false); + // } + + /// + /// Disposes the current object. Code added to correctly implement the disposable pattern. + /// + public void Dispose() + { + // Do not change this code. Put cleanup code in Dispose(bool disposing) above. + Dispose(true); + // uncomment the following line if the finalizer is overridden above. + // GC.SuppressFinalize(this); + } + #endregion + } + + /// + /// Describes the state of the session. + /// + public enum SessionState + { + /// + /// The session is closed. + /// + Closed = 0, + /// + /// The session is open. + /// + Open = 1, + /// + /// The session object is connecting to the data source. + /// + Connecting = 2, + /// + /// The session object is executing a command. + /// + Executing = 4, + } +} diff --git a/MySQL.Data/src/X/XDevAPI/CRUD/AddStatement.cs b/MySQL.Data/src/X/XDevAPI/CRUD/AddStatement.cs new file mode 100644 index 000000000..4b0a12ebe --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/CRUD/AddStatement.cs @@ -0,0 +1,76 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySqlX.XDevAPI.Common; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace MySqlX.XDevAPI.CRUD +{ + /// + /// Represents a chaining collection insert statement. + /// + /// + public class AddStatement : CrudStatement + { + private List _Docs = new List(); + internal bool upsert; + + internal AddStatement(Collection collection) : base(collection) { } + + /// + /// Adds documents to the collection. + /// + /// The documents to add. + /// This object. + /// The array is null. + public AddStatement Add(params object[] items) + { + if (items == null) + throw new ArgumentNullException(); + + _Docs.AddRange(GetDocs(items)); + return this; + } + + /// + /// Executes the Add statement. + /// + /// A object containing the results of the execution. + public override Result Execute() + { + ValidateOpenSession(); + if (_Docs.Count == 0) + return new Result(null); + + //List newIds = AssignIds(); + return Target.Session.XSession.Insert(Target, _Docs.Cast().ToArray(), null, upsert); + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/CRUD/CreateCollectionIndexStatement.cs b/MySQL.Data/src/X/XDevAPI/CRUD/CreateCollectionIndexStatement.cs new file mode 100644 index 000000000..b30f144c1 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/CRUD/CreateCollectionIndexStatement.cs @@ -0,0 +1,97 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySqlX.XDevAPI.Common; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace MySqlX.XDevAPI.CRUD +{ + /// + /// Implementation class for CRUD statements with collections using an index. + /// + /// + public class CreateCollectionIndexStatement : CrudStatement + { + internal CreateIndexParams createIndexParams; + + internal CreateCollectionIndexStatement(Collection collection, string indexName, DbDoc indexDefinition) : base(collection) + { + // Fields allowed at the root level. + var allowedFields = new string[] { "fields", "type" }; + + // Fields allowed for embedded documents. + var allowedInternalFields = new string[] { "field", "type", "required", "options", "srid", "array" }; + + // Validate the index follows the allowed format. + if (!indexDefinition.values.ContainsKey(allowedFields[0])) + throw new FormatException(string.Format(ResourcesX.MandatoryFieldNotFound, allowedFields[0])); + + // Validate that fields on the root level are allowed. + foreach (var field in indexDefinition.values) + { + if (!allowedFields.Contains(field.Key)) + throw new FormatException(string.Format(ResourcesX.UnexpectedField, field.Key)); + } + + // Validate embedded documents. + foreach (var item in indexDefinition.values[allowedFields[0]] as Object[]) + { + var field = item as Dictionary; + + // Validate embedded documents have the field field. + if (!field.ContainsKey(allowedInternalFields[0])) + throw new FormatException(string.Format(ResourcesX.MandatoryFieldNotFound, allowedInternalFields[0])); + + // Validate embedded documents have the type field. + if (!field.ContainsKey(allowedInternalFields[1])) + throw new FormatException(string.Format(ResourcesX.MandatoryFieldNotFound, allowedInternalFields[1])); + + foreach (var internalField in field) + { + if (!allowedInternalFields.Contains(internalField.Key)) + throw new FormatException(string.Format(ResourcesX.UnexpectedField, internalField.Key)); + } + } + + createIndexParams = new CreateIndexParams(indexName, indexDefinition); + } + + /// + /// Executes this statement. + /// + /// A object containing the results of the execution. + public override Result Execute() + { + ValidateOpenSession(); + return Session.XSession.CreateCollectionIndex(this); + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/CRUD/CreateIndexParams.cs b/MySQL.Data/src/X/XDevAPI/CRUD/CreateIndexParams.cs new file mode 100644 index 000000000..af518edb6 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/CRUD/CreateIndexParams.cs @@ -0,0 +1,114 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Collections.Generic; + +namespace MySqlX.XDevAPI.CRUD +{ + internal class CreateIndexParams + { + private const string FIELDS = "fields"; + private const string FIELD = "field"; + private const string TYPE = "type"; + private const string REQUIRED = "required"; + private const string OPTIONS = "options"; + private const string SRID = "srid"; + private const string ARRAY = "array"; + + private string _indexName; + private string _type; + private List _fields = new List(); + + public CreateIndexParams(string indexName, DbDoc indexDefinition) + { + this._indexName = indexName; + + if (indexDefinition.values.ContainsKey(TYPE)) + this._type = indexDefinition.values[TYPE].ToString(); + + // Read fields from the indexDefinition object. + foreach (var item in indexDefinition.values[FIELDS] as Object[]) + { + var field = item as Dictionary; + if (field == null) continue; + + var fieldValue = field[FIELD] is MySqlExpression ? ((MySqlExpression)field[FIELD]).value : field[FIELD].ToString(); + var indexField = new IndexField() + { + Field = fieldValue + }; + if (field.ContainsKey(TYPE)) + indexField.Type = field[TYPE].ToString(); + + if (field.ContainsKey(REQUIRED)) + indexField.Required = Convert.ToBoolean(field[REQUIRED]); + + if (field.ContainsKey(OPTIONS)) + indexField.Options = Convert.ToUInt32(field[OPTIONS]); + + if (field.ContainsKey(SRID)) + indexField.Srid = Convert.ToUInt32(field[SRID]); + + if (field.ContainsKey(ARRAY)) + if (field[ARRAY] is MySqlExpression || field[ARRAY] is null) + throw new MySqlException("Index field 'array' member must be boolean."); + else + indexField.Array = Convert.ToBoolean(field[ARRAY]); + + _fields.Add(indexField); + } + } + + internal class IndexField + { + internal string Field { get; set; } + internal string Type { get; set; } + internal bool? Required { get; set; } + internal uint? Options { get; set; } + internal uint? Srid { get; set; } + internal bool? Array { get; set; } + } + + public string IndexName + { + get { return this._indexName; } + } + + public string Type + { + get { return this._type; } + } + + public List Fields + { + get { return this._fields; } + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/CRUD/CrudStatement.cs b/MySQL.Data/src/X/XDevAPI/CRUD/CrudStatement.cs new file mode 100644 index 000000000..df71f408e --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/CRUD/CrudStatement.cs @@ -0,0 +1,69 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +#if !NETFRAMEWORK +using System.Text.Json; +#endif +using MySqlX.XDevAPI.Common; + +namespace MySqlX.XDevAPI.CRUD +{ + /// + /// Represents a collection statement. + /// + /// Type of + /// Type of object + public abstract class CrudStatement : TargetedBaseStatement, TResult, T> + where TResult : Result + { + internal CrudStatement(Collection collection) : base(collection) + { + } + + /// + /// Converts base s into objects. + /// + /// Array of objects to be converted to objects. + /// An enumerable collection of objects. + protected IEnumerable GetDocs(object[] items) + { + foreach (object item in items) + { + if (typeof(T).Name == "DbDoc") + { + DbDoc d = item is DbDoc ? item as DbDoc : new DbDoc(item); + yield return (T)Convert.ChangeType(d, typeof(T)); + } + else + yield return (T)item; + } + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/CRUD/DocResult.cs b/MySQL.Data/src/X/XDevAPI/CRUD/DocResult.cs new file mode 100644 index 000000000..1808659a6 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/CRUD/DocResult.cs @@ -0,0 +1,74 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Collections.Generic; +using System.Diagnostics; +using MySqlX.XDevAPI.Common; +using MySqlX.Sessions; +using System; +using MySql.Data.MySqlClient; +#if !NETFRAMEWORK +using System.Text.Json; +#endif + +namespace MySqlX.XDevAPI.CRUD +{ + /// + /// Represents the result of an operation that includes a collection of documents. + /// + /// + public class DocResult : BufferingResult + { + System.Text.Encoding _encoding = System.Text.Encoding.UTF8; + + internal DocResult(InternalSession session) : base(session) + { + // this is just a single column "doc" + Debug.Assert(_columns.Count == 1); + } + + protected override T ReadItem(bool dumping) + { + List values = Protocol.ReadRow(this); + if (values == null) return default; + + Debug.Assert(values.Count == 1); + + if (typeof(T).Name == "DbDoc") + return (T)Convert.ChangeType(new DbDoc(_encoding.GetString(values[0]).TrimEnd('\0')), typeof(T)); + else + { +#if !NETFRAMEWORK + return JsonSerializer.Deserialize(_encoding.GetString(values[0]).TrimEnd('\0')); +#else + throw new MySqlException("Custom type mapping is only supported from .NET Core 3.1."); +#endif + } + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/CRUD/FindParams.cs b/MySQL.Data/src/X/XDevAPI/CRUD/FindParams.cs new file mode 100644 index 000000000..3616ca7fb --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/CRUD/FindParams.cs @@ -0,0 +1,43 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySqlX.Protocol.X; +using MySqlX.XDevAPI.Common; + +namespace MySqlX.XDevAPI.CRUD +{ + internal class FindParams : FilterParams + { + public string[] GroupBy; + public string GroupByCritieria; + public string[] Projection; + public RowLock Locking; + public LockContention LockingOption; + } +} diff --git a/MySQL.Data/src/X/XDevAPI/CRUD/FindStatement.cs b/MySQL.Data/src/X/XDevAPI/CRUD/FindStatement.cs new file mode 100644 index 000000000..7df9b0714 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/CRUD/FindStatement.cs @@ -0,0 +1,172 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI.Common; +using System; +using System.Collections.Generic; + +namespace MySqlX.XDevAPI.CRUD +{ + /// + /// Represents a chaining collection find statement. + /// + /// + public class FindStatement : FilterableStatement, Collection, DocResult, T> + { + internal FindParams findParams = new FindParams(); + + internal FindStatement(Collection c, string condition) : base(c, condition) + { + } + + /// + /// List of column projections that shall be returned. + /// + /// List of columns. + /// This object set with the specified columns or fields. + public FindStatement Fields(params string[] columns) + { + if (columns == null) + return this; + + var projectionList = new List(); + foreach (var item in columns) + { + if (item != null) + projectionList.Add(item); + } + + findParams.Projection = projectionList.Count > 0 ? projectionList.ToArray() : null; + SetChanged(); + return this; + } + + /// + /// Executes the Find statement. + /// + /// A object containing the results of execution and data. + public override DocResult Execute() + { + return Execute(Target.Session.XSession.FindDocs, this); + } + + /// + /// Locks matching rows against updates. + /// + /// Optional row lock option to use. + /// This same object set with the lock shared option. + /// The server version is lower than 8.0.3. + public FindStatement LockShared(LockContention lockOption = LockContention.Default) + { + if (!this.Session.InternalSession.GetServerVersion().isAtLeast(8, 0, 3)) + throw new MySqlException(string.Format(ResourcesX.FunctionalityNotSupported, "8.0.3")); + + findParams.Locking = Protocol.X.RowLock.SharedLock; + findParams.LockingOption = lockOption; + SetChanged(); + return this; + } + + /// + /// Locks matching rows so no other transaction can read or write to it. + /// + /// Optional row lock option to use. + /// This same object set with the lock exclusive option. + /// The server version is lower than 8.0.3. + public FindStatement LockExclusive(LockContention lockOption = LockContention.Default) + { + if (!this.Session.InternalSession.GetServerVersion().isAtLeast(8, 0, 3)) + throw new MySqlException(string.Format(ResourcesX.FunctionalityNotSupported, "8.0.3")); + + findParams.Locking = Protocol.X.RowLock.ExclusiveLock; + findParams.LockingOption = lockOption; + SetChanged(); + return this; + } + + /// + /// Sets the collection aggregation. + /// + /// The field list for aggregation. + /// This same object set with the specified group-by criteria. + public FindStatement GroupBy(params string[] groupBy) + { + if (groupBy == null) + return this; + + var groupByList = new List(); + foreach (var item in groupBy) + { + if (item != null) + groupByList.Add(item); + } + + findParams.GroupBy = groupByList.Count > 0 ? groupByList.ToArray() : null; + SetChanged(); + return this; + } + + /// + /// Filters criteria for aggregated groups. + /// + /// The filter criteria for aggregated groups. + /// This same object set with the specified filter criteria. + public FindStatement Having(string having) + { + findParams.GroupByCritieria = having; + SetChanged(); + return this; + } + + /// + /// Sets user-defined sorting criteria for the operation. The strings use normal SQL syntax like + /// "order ASC" or "pages DESC, age ASC". + /// + /// The order criteria. + /// This same object set with the specified order criteria. + public FindStatement Sort(params string[] order) + { + FilterData.OrderBy = order; + SetChanged(); + return this; + } + + /// + /// Enables the setting of Where condition for this operation. + /// + /// The Where condition. + /// This same object set with the specified condition criteria. + [Obsolete("Where(string condition) has been deprecated since version 8.0.17.")] + public new FindStatement Where(string condition) + { + return base.Where(condition); + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/CRUD/ModifyStatement.cs b/MySQL.Data/src/X/XDevAPI/CRUD/ModifyStatement.cs new file mode 100644 index 000000000..4e6265476 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/CRUD/ModifyStatement.cs @@ -0,0 +1,199 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySql.Data.MySqlClient; +using Mysqlx.Crud; +using MySqlX.XDevAPI.Common; +using System; +using System.Collections.Generic; +#if !NETFRAMEWORK +using System.Text.Json; +#endif + +namespace MySqlX.XDevAPI.CRUD +{ + /// + /// Represents a chaining collection modify statement. + /// + /// + public class ModifyStatement : FilterableStatement, Collection, Result, T> + { + internal ModifyStatement(Collection collection, string condition) : base(collection, condition) + { + Updates = new List(); + } + + internal List Updates; + + /// + /// Sets key and value. + /// + /// The document path key. + /// The new value. + /// This object. + public ModifyStatement Set(string docPath, object value) + { + Updates.Add(new UpdateSpec(UpdateOperation.Types.UpdateType.ItemSet, docPath).SetValue(value)); + SetChanged(); + return this; + } + + /// + /// Changes value for a key. + /// + /// The document path key. + /// The new value. + /// This object. + public ModifyStatement Change(string docPath, object value) + { + Updates.Add(new UpdateSpec(UpdateOperation.Types.UpdateType.ItemReplace, docPath).SetValue(value)); + SetChanged(); + return this; + } + + /// + /// Removes keys or values from a document. + /// + /// An array of document paths representing the keys to be removed. + /// This object. + public ModifyStatement Unset(params string[] docPath) + { + if (docPath == null) + return this; + + foreach (var item in docPath) + { + if (item != null) + Updates.Add(new UpdateSpec(UpdateOperation.Types.UpdateType.ItemRemove, item)); + } + + SetChanged(); + return this; + } + + /// + /// Creates a object set with the changes to be applied to all matching documents. + /// + /// The JSON-formatted object describing the set of changes. + /// A object set with the changes described in . + /// can be a object, an anonymous object, a JSON string or a custom type object. + /// is null. + /// is null or white space. + public ModifyStatement Patch(object document) + { + if (document == null) + throw new ArgumentNullException(nameof(document)); + + if (document is string && string.IsNullOrWhiteSpace((string)document)) + throw new ArgumentNullException(nameof(document), Resources.ParameterNullOrEmpty); + + DbDoc dbDocument = document is DbDoc ? document as DbDoc : new DbDoc(document); + + if (dbDocument.values.Count == 0) + { +#if !NETFRAMEWORK + var customObject = JsonSerializer.Serialize(document); + Updates.Add(new UpdateSpec(UpdateOperation.Types.UpdateType.MergePatch, string.Empty).SetValue(customObject)); +#else + throw new MySqlException(ResourcesX.CustomTypeNotSupported); +#endif + } + else + Updates.Add(new UpdateSpec(UpdateOperation.Types.UpdateType.MergePatch, string.Empty).SetValue(dbDocument.values)); + + SetChanged(); + return this; + } + + /// + /// Inserts an item into the specified array. + /// + /// The document path key including the index on which the item will be inserted. + /// The value to insert into the array. + /// A object containing the updated array. + public ModifyStatement ArrayInsert(string field, object value) + { + if (value is string && value.ToString() == string.Empty) + throw new ArgumentException(nameof(value), Resources.StringEmpty); + + Updates.Add(new UpdateSpec(UpdateOperation.Types.UpdateType.ArrayInsert, field).SetValue(value)); + SetChanged(); + return this; + } + + /// + /// Appends an item to the specified array. + /// + /// The document path key. + /// The value to append to the array. + /// A object containing the updated array. + public ModifyStatement ArrayAppend(string docPath, object value) + { + if (value is string && value.ToString() == string.Empty) + throw new ArgumentException(nameof(value), Resources.StringEmpty); + + Updates.Add(new UpdateSpec(UpdateOperation.Types.UpdateType.ArrayAppend, docPath).SetValue(value)); + SetChanged(); + return this; + } + + /// + /// Allows the user to set the sorting criteria for the operation. The strings use normal SQL syntax like + /// "order ASC" or "pages DESC, age ASC". + /// + /// The order criteria. + /// A generic object representing the implementing statement type. + public ModifyStatement Sort(params string[] order) + { + FilterData.OrderBy = order; + SetChanged(); + return this; + } + + /// + /// Enables the setting of Where condition for this operation. + /// + /// The Where condition. + /// The implementing statement type. + [Obsolete("Where(string condition) has been deprecated since version 8.0.17.")] + public new ModifyStatement Where(string condition) + { + return base.Where(condition); + } + + /// + /// Executes the modify statement. + /// + /// A object containing the results of the execution. + public override Result Execute() + { + return Execute(Target.Session.XSession.ModifyDocs, this); + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/CRUD/RemoveStatement.cs b/MySQL.Data/src/X/XDevAPI/CRUD/RemoveStatement.cs new file mode 100644 index 000000000..4d9867384 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/CRUD/RemoveStatement.cs @@ -0,0 +1,77 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySqlX.XDevAPI.Common; +using System; + +namespace MySqlX.XDevAPI.CRUD +{ + /// + /// Represents a chaining collection remove statement. + /// + /// + public class RemoveStatement : FilterableStatement, Collection, Result, T> + { + internal RemoveStatement(Collection collection, string condition) : base(collection, condition) + { + } + + /// + /// Sets user-defined sorting criteria for the operation. The strings use normal SQL syntax like + /// "order ASC" or "pages DESC, age ASC". + /// + /// The order criteria. + /// A generic object representing the implementing statement type. + public RemoveStatement Sort(params string[] order) + { + FilterData.OrderBy = order; + SetChanged(); + return this; + } + + /// + /// Enables the setting of Where condition for this operation. + /// + /// The Where condition. + /// The implementing statement type. + [Obsolete("Where(string condition) has been deprecated since version 8.0.17.")] + public new RemoveStatement Where(string condition) + { + return base.Where(condition); + } + + /// + /// Executes the remove statement. + /// + /// A object containing the results of the execution. + public override Result Execute() + { + return Execute(Target.Session.XSession.DeleteDocs, this); + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/CRUD/UpdateSpec.cs b/MySQL.Data/src/X/XDevAPI/CRUD/UpdateSpec.cs new file mode 100644 index 000000000..86e127bd2 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/CRUD/UpdateSpec.cs @@ -0,0 +1,109 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using Mysqlx.Crud; +using Mysqlx.Expr; +using MySqlX.Protocol.X; +using MySqlX.Serialization; +using System; +using static Mysqlx.Crud.UpdateOperation.Types; + +namespace MySqlX.XDevAPI.CRUD +{ + internal class UpdateSpec + { + public UpdateSpec(UpdateOperation.Types.UpdateType updateType, string docPath) + { + if (updateType is not UpdateOperation.Types.UpdateType.MergePatch && string.IsNullOrWhiteSpace(docPath)) + throw new ArgumentException(ResourcesX.DocPathNullOrEmpty); + + Type = updateType; + Path = docPath; + } + + public string Path { get; private set; } + public UpdateOperation.Types.UpdateType Type { get; private set; } + public object Value { get; private set; } + + public bool HasValue + { + get { return Value != null; } + } + + public Expr GetValue(UpdateType operationType) + { + bool evaluateStringExpression = true; + if (operationType == UpdateType.ArrayAppend || operationType == UpdateType.ArrayInsert || operationType == UpdateType.ItemSet) + { + Value = ExprUtil.ParseAnonymousObject(Value) ?? Value; + if (Value is string) + { + try + { + JsonParser.Parse(Value as string); + } + catch (Exception) + { + evaluateStringExpression = false; + } + } + } + + return ExprUtil.ArgObjectToExpr(Value, false, evaluateStringExpression); + } + + public ColumnIdentifier GetSource(bool isRelational) + { + var source = Path; + + // accomodate parser's documentField() handling by removing "@" + if (source.Length > 0 && source[0] == '@') + source = source.Substring(1); + + ExprParser p = new ExprParser(source, false); + ColumnIdentifier identifier; + + if (isRelational) + identifier = p.ParseTableUpdateField(); + else + identifier = p.DocumentField().Identifier; + + if (p.tokenPos < p.tokens.Count) + throw new ArgumentException("Invalid document path."); + + return identifier; + } + + public UpdateSpec SetValue(object o) + { + Value = o; + return this; + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Client.cs b/MySQL.Data/src/X/XDevAPI/Client.cs new file mode 100644 index 000000000..fc4518dfb --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Client.cs @@ -0,0 +1,562 @@ +// Copyright © 2018, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySql.Data.MySqlClient; +using MySqlX.Common; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Diagnostics; +using System.Reflection; +using System.Threading; +using MySql.Data.Failover; +using MySql.Data.Common; +using System.Net.Sockets; + +namespace MySqlX.XDevAPI +{ + /// + /// Class encapsulating a session pooling functionality. + /// + public class Client : IDisposable + { + private string _connectionString; + private ConnectionOptions _connectionOptions; + + private List _inUse; + private ConcurrentQueue _inIdle; + private int _available; + private AutoResetEvent _autoResetEvent; + private Timer _idleTimer; + private bool _isClosed = false; + internal const int DEMOTED_TIMEOUT = 120000; + private readonly object _dnsSrvLock = new object(); + + #region Properties + /// + /// Queue of demoted hosts. + /// + internal ConcurrentQueue DemotedHosts { get; set; } + /// + /// List of hosts that will be attempted to connect to. + /// + internal List Hosts { get; set; } + /// + /// Timer to be used when a host have been demoted. + /// + internal Timer DemotedServersTimer { get; set; } + #endregion + + internal Client(object connectionString, object connectionOptions) + { + if (connectionString == null + || (connectionString is string + && string.IsNullOrWhiteSpace(connectionString as string))) + throw new ArgumentNullException(nameof(connectionString)); + + if (connectionOptions == null + || (connectionOptions is string + && string.IsNullOrWhiteSpace(connectionOptions as string))) + throw new ArgumentNullException(nameof(connectionOptions)); + + bool isDefaultPort = true; + + if (connectionString is string) + { + isDefaultPort = !connectionString.ToString().Contains("port"); + //Validates the connection string or Uri string + new MySqlXConnectionStringBuilder(new ClientSession().ParseConnectionData(connectionString as string), isDefaultPort); + _connectionString = connectionString as string; + } + else + { + MySqlXConnectionStringBuilder settings = new MySqlXConnectionStringBuilder(); + foreach (var item in Tools.GetDictionaryFromAnonymous(connectionString)) + { + if (!settings.ContainsKey(item.Key)) + throw new KeyNotFoundException(string.Format(ResourcesX.InvalidConnectionStringAttribute, item.Key)); + settings.SetValue(item.Key, item.Value); + if (item.Key == "port") + isDefaultPort = false; + } + _connectionString = settings.ToString().Replace("\"", ""); + settings.AnalyzeConnectionString(_connectionString, true, isDefaultPort); + } + + _connectionOptions = ParseConnectionOptions(connectionOptions); + + // Pooling setup + _inUse = new List(_connectionOptions.Pooling.MaxSize); + _inIdle = new ConcurrentQueue(); + _available = _connectionOptions.Pooling.MaxSize; + _autoResetEvent = new AutoResetEvent(false); + _idleTimer = new Timer(new TimerCallback(CleanIdleConnections), + null, + _connectionOptions.Pooling.MaxIdleTime, + _connectionOptions.Pooling.MaxIdleTime == 0 ? Timeout.Infinite : _connectionOptions.Pooling.MaxIdleTime); + } + + /// + /// Remove hosts from the demoted list that have already been there for more + /// than 120,000 milliseconds and add them to the available hosts list. + /// + internal void ReleaseDemotedHosts(object state) + { + while (!DemotedHosts.IsEmpty) + { + if (DemotedHosts.TryPeek(out FailoverServer demotedServer) + && demotedServer.DemotedTime.AddMilliseconds(DEMOTED_TIMEOUT) < DateTime.Now) + { + demotedServer.Attempted = false; + Hosts?.Add(demotedServer); + DemotedHosts.TryDequeue(out demotedServer); + } + else + { + break; + } + } + + if (!disposedValue) + DemotedServersTimer?.Change(DEMOTED_TIMEOUT, Timeout.Infinite); + } + + private void CleanIdleConnections(object state) + { + List oldSessions = new List(); + while (!_inIdle.IsEmpty) + { + if (_inIdle.TryPeek(out Session session)) + { + if (session.IdleSince.AddMilliseconds((double)_connectionOptions.Pooling.MaxIdleTime) < DateTime.Now) + { + if (_inIdle.TryDequeue(out Session session2)) + { + // TODO: check if there're more than one session open + //Debug.Assert(session.Equals(session2), "different sessions in CleanIdleConnections"); + oldSessions.Add(session2); + } + } + else + { + break; + } + } + } + + foreach (Session session in oldSessions) + { + try + { + // tries to close the session + session.CloseFully(); + } + catch { } + } + } + + /// + /// Get a session from pool or create a new one. + /// + /// + public Session GetSession() + { + if (_isClosed) + throw new MySqlException(ResourcesX.ClientIsClosed); + + if (!_connectionOptions.Pooling.Enabled) + { + return new Session(_connectionString); + } + + int fullQueueTimeout = _connectionOptions.Pooling.QueueTimeout; + int queueTimeout = fullQueueTimeout; + Stopwatch stopwatch = Stopwatch.StartNew(); + + while (queueTimeout >= 0) + { + Session session = TryToGetSession(); + if (session != null) + return session; + + if (!_autoResetEvent.WaitOne(fullQueueTimeout == 0 ? -1 : queueTimeout)) + break; + + queueTimeout = fullQueueTimeout - (int)stopwatch.ElapsedMilliseconds; + } + + stopwatch.Stop(); + throw new TimeoutException(ResourcesX.PoolingQueueTimeout); + } + + private Session TryToGetSession() + { + Debug.Assert(_inUse.Count + _inIdle.Count <= _connectionOptions.Pooling.MaxSize, "pool out of sync"); + int count = Interlocked.Decrement(ref _available); + if (count < 0) + { + Interlocked.Increment(ref _available); + return null; + } + try + { + Session session = GetPooledSession(); + return session; + } + catch (Exception) + { + Interlocked.Increment(ref _available); + throw; + } + } + + private Session GetPooledSession() + { + Session session = null; + + while (!_inIdle.IsEmpty && session == null) + { + if (_inIdle.TryDequeue(out session)) + { + try + { + if (!session.XSession._myNetworkStream.IsSocketClosed) + { + session.Reset(); + if (session.XSession._sessionResetNoReauthentication == false) + session.XSession.Authenticate(); + session.XSession.SetState(SessionState.Open, false); + } + else + { + session = CreateNewSession(); + } + } + catch + { + session = null; + CleanIdleConnections(null); + } + } + } + + if (session == null) + { + session = CreateNewSession(); + } + + Debug.Assert(session != null, "pooled session is null"); + _inUse.Add(session); + + return session; + } + + private Session CreateNewSession() + { + return new Session(_connectionString, this); + } + + internal void ReleaseSession(BaseSession session) + { + Session newSession = new Session(session.InternalSession, this); + if (_inUse.Contains((Session)session)) + { + _inUse.Remove((Session)session); + Interlocked.Increment(ref _available); + } + + try + { + newSession.Reset(); + newSession.IdleSince = DateTime.Now; + _inIdle.Enqueue(newSession); + } + catch + { + newSession = null; + } + + lock (_dnsSrvLock) + { + if (session.Settings.DnsSrv) + { + var dnsSrvRecords = DnsSrv.GetDnsSrvRecords(DnsSrv.ServiceName); + FailoverManager.SetHostList(dnsSrvRecords.ConvertAll(r => new FailoverServer(r.Target, r.Port, null)), + FailoverMethod.Sequential); + + foreach (var idleSession in _inIdle) + { + string idleServer = idleSession.Settings.Server; + if (!FailoverManager.FailoverGroup.Hosts.Exists(h => h.Host == idleServer) && !_inUse.Contains(idleSession)) + { + _inIdle.TryDequeue(out Session removedSession); + } + } + } + } + + _autoResetEvent.Set(); + } + + /// + /// Closes all sessions the Client object created and destroys the managed pool. + /// + public void Close() + { + if (_isClosed) return; + + _isClosed = true; + _idleTimer.Change(0, Timeout.Infinite); + foreach (Session session in _inUse) + { + try + { + session.CloseFully(); + } + catch { } + } + while (!_inIdle.IsEmpty) + { + if (_inIdle.TryDequeue(out Session session)) + { + try + { + session.CloseFully(); + } + catch { } + } + } + if (DemotedServersTimer != null) + { + DemotedServersTimer.Change(0, Timeout.Infinite); + while (!DemotedHosts.IsEmpty) + DemotedHosts.TryDequeue(out _); + Hosts?.Clear(); + } + + FailoverManager.Reset(); + Interlocked.Exchange(ref _available, -1); + } + + #region Internals + + private class ClientSession : BaseSession + { + } + + internal class ConnectionOptions + { + public PoolingStruct Pooling { get; set; } = + new PoolingStruct + { + Enabled = true, + MaxSize = 25 + }; + + internal class PoolingStruct + { + public bool Enabled { get; set; } + + private int _maxSize; + public int MaxSize + { + get { return _maxSize; } + set + { + if (value <= 0) throw new ArgumentException(nameof(MaxSize)); + _maxSize = value; + } + } + + private int _maxIdleTime; + public int MaxIdleTime + { + get { return _maxIdleTime; } + set + { + if (value < 0) throw new ArgumentException(nameof(MaxIdleTime)); + _maxIdleTime = value; + } + } + + private int _queueTimeout; + public int QueueTimeout + { + get { return _queueTimeout; } + set + { + if (value < 0) throw new ArgumentException(nameof(QueueTimeout)); + _queueTimeout = value; + } + } + } + + public override bool Equals(object obj) + { + ConnectionOptions connectionOptions = obj as ConnectionOptions; + if (connectionOptions == null) + return false; + return Equals(this, obj); + } + + private new bool Equals(object x, object y) + { + if (x.GetType() != y.GetType()) + return false; + foreach (var property in x.GetType().GetProperties()) + { + if (property.PropertyType.IsNested) + return Equals(property.GetValue(x), property.GetValue(y)); + if (!property.GetValue(x).Equals(property.GetValue(y))) + return false; + } + return true; + } + + public override int GetHashCode() + { + return base.GetHashCode(); + } + } + + internal static ConnectionOptions ParseConnectionOptions(object connectionOptions) + { + DbDoc options; + try + { + options = new DbDoc(connectionOptions); + } + catch (Exception ex) + { + throw new ArgumentException(string.Format(ResourcesX.ClientOptionNotValid, "JSON"), ex); + } + if (options == null + || options.values.Count == 0) + throw new ArgumentException(string.Format(ResourcesX.ClientOptionNotValid, connectionOptions)); + + ConnectionOptions instance = new ConnectionOptions(); + Type optionType = instance.GetType(); + foreach (var item in options.values) + { + PropertyInfo parent = optionType.GetProperty(item.Key, + BindingFlags.Instance + | BindingFlags.Public + | BindingFlags.IgnoreCase); + if (parent == null) + throw new ArgumentException(string.Format(ResourcesX.ClientOptionNotValid, item.Key)); + + object target = parent.GetValue(instance); + if (parent.DeclaringType.IsNested) + { + DbDoc children; + try + { + children = new DbDoc(item.Value); + } + catch (Exception ex) + { + throw new ArgumentException(string.Format(ResourcesX.ClientOptionInvalidValue, item.Key, "JSON"), ex); + } + if (children == null + || children.values.Count == 0) + throw new ArgumentException(string.Format(ResourcesX.ClientOptionInvalidValue, item.Key, item.Value)); + foreach (var option in children.values) + { + var key = parent.PropertyType.GetProperty(option.Key, + BindingFlags.Instance + | BindingFlags.Public + | BindingFlags.IgnoreCase); + if (key == null) + throw new ArgumentException(string.Format(ResourcesX.ClientOptionNotValid, + $"{item.Key}.{option.Key}")); + try + { + key.SetValue(target, option.Value); + } + catch (Exception ex) + { + object value = option.Value; + switch (value) + { + case MySqlExpression expr: + value = ((MySqlExpression)expr).value.Trim(); + break; + } + throw new ArgumentException(string.Format(ResourcesX.ClientOptionInvalidValue, + $"{item.Key}.{option.Key}", + value), + ex); + } + } + } + + parent.SetValue(instance, target); + } + return instance; + } + + #endregion + + #region IDisposable Support + private bool disposedValue = false; // To detect redundant calls + + protected virtual void Dispose(bool disposing) + { + if (!disposedValue) + { + if (disposing) + { + Close(); + _idleTimer.Dispose(); + _inUse.Clear(); + if (DemotedServersTimer != null) + DemotedServersTimer.Dispose(); + } + + disposedValue = true; + } + } + + // TODO: override a finalizer only if Dispose(bool disposing) above has code to free unmanaged resources. + // ~Client() { + // // Do not change this code. Put cleanup code in Dispose(bool disposing) above. + // Dispose(false); + // } + + // This code added to correctly implement the disposable pattern. + public void Dispose() + { + // Do not change this code. Put cleanup code in Dispose(bool disposing) above. + Dispose(true); + // TODO: uncomment the following line if the finalizer is overridden above. + // GC.SuppressFinalize(this); + } + #endregion + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Collection.cs b/MySQL.Data/src/X/XDevAPI/Collection.cs new file mode 100644 index 000000000..34afde110 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Collection.cs @@ -0,0 +1,191 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI.Common; +using MySqlX.XDevAPI.CRUD; +using System; + +namespace MySqlX.XDevAPI +{ + /// + /// Represents a collection of documents. + /// + public class Collection : Collection + { + internal Collection(Schema schema, string name) + : base(schema, name) + { + } + + #region Add Operations + + /// + /// Creates an containing the provided objects that can be used to add + /// one or more items to a collection. + /// + /// The objects to add. + /// An object containing the objects to add. + /// is null. + /// This method can take anonymous objects, domain objects, or just plain JSON strings. + /// The statement can be further modified before execution. + public new AddStatement Add(params object[] items) => base.Add(items); + + #endregion + + #region Remove Operations + + /// + /// Creates a with the given condition that can be used to remove + /// one or more documents from a collection.The statement can then be further modified before execution. + /// + /// The condition to match documents. + /// A object set with the given condition. + /// is null or white space. + /// The statement can then be further modified before execution. + public new RemoveStatement Remove(string condition) => base.Remove(condition); + + #endregion + + #region Modify Operations + + /// + /// Creates a with the given condition that can be used to modify one or more + /// documents from a collection. + /// + /// The condition to match documents. + /// A object set with the given condition. + /// is null or white space. + /// The statement can then be further modified before execution. + public new ModifyStatement Modify(string condition) => base.Modify(condition); + + /// + /// Replaces the document matching the given identifier. + /// + /// The unique identifier of the document to replace. + /// The document to replace the matching document. + /// A object containing the results of the execution. + /// is null or whitespace. + /// is null. + /// This is a direct execution method. Operation succeeds even if no matching document was found; + /// in which case, the Result.RecordsAffected property is zero. If the new document contains an identifier, the value + /// is ignored. + public Result ReplaceOne(object id, object doc) + { + if (id == null) + throw new ArgumentNullException(nameof(id)); + string stringId = id.ToString(); + if (string.IsNullOrWhiteSpace(stringId)) + throw new ArgumentNullException(nameof(id), Resources.ParameterNullOrEmpty); + if (doc == null) + throw new ArgumentNullException(nameof(doc)); + + DbDoc currentDocument = GetOne(id); + var modify = Modify("_id = :id").Bind("id", stringId); + DbDoc newDocument = doc is DbDoc ? doc as DbDoc : new DbDoc(doc); + + if (currentDocument != null) + { + // check for not matching id's + if (newDocument.HasId && !newDocument.Id.Equals(currentDocument.Id)) + throw new MySqlException(ResourcesX.ReplaceWithNoMatchingId); + + // Unset all properties + foreach (var dictionary in currentDocument.values) + if (dictionary.Key != "_id") modify.Unset(dictionary.Key); + } + + // Set new properties + foreach (var dictionary in newDocument.values) + if (dictionary.Key != "_id") modify.Set(dictionary.Key, dictionary.Value); + + return modify.Execute(); + } + #endregion + + #region Add-Modify Operations + + /// + /// Adds the given document to the collection unless the identifier or any other field that has a unique index + /// already exists, in which case it will update the matching document. + /// + /// The unique identifier of the document to replace. + /// The document to replace the matching document. + /// A object containing the results of the execution. + /// The server version is lower than 8.0.3. + /// is null or white space. + /// is null. + /// The is different from the one in . + /// This is a direct execution method. + public Result AddOrReplaceOne(object id, object doc) + { + if (!this.Session.InternalSession.GetServerVersion().isAtLeast(8, 0, 3)) + throw new MySqlException(string.Format(ResourcesX.FunctionalityNotSupported, "8.0.3")); + if (id == null) + throw new ArgumentNullException(nameof(id)); + string stringId = id.ToString(); + if (string.IsNullOrWhiteSpace(stringId)) + throw new ArgumentNullException(nameof(id), Resources.ParameterNullOrEmpty); + if (doc == null) + throw new ArgumentNullException(nameof(doc)); + + DbDoc currentDocument = GetOne(id); + DbDoc newDocument = doc is DbDoc ? doc as DbDoc : new DbDoc(doc); + + // check for not matching id's + if (currentDocument != null && newDocument.HasId + && !newDocument.Id.Equals(currentDocument.Id)) + throw new MySqlException(ResourcesX.ReplaceWithNoMatchingId); + + newDocument.Id = id; + AddStatement stmt = Add(newDocument); + stmt.upsert = true; + return stmt.Execute(); + } + #endregion + + /// + /// Creates a with the given condition, which can be used to find documents in a + /// collection. + /// + /// An optional condition to match documents. + /// A object set with the given condition. + /// The statement can then be further modified before execution. + public new FindStatement Find(string condition = null) => base.Find(condition); + + /// + /// Returns the document with the given identifier. + /// + /// The unique identifier of the document to replace. + /// A object if a document matching given identifier exists; otherwise, null. + /// is null or white space. + /// This is a direct execution method. + public new DbDoc GetOne(object id) => base.GetOne(id); + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Common/BaseResult.cs b/MySQL.Data/src/X/XDevAPI/Common/BaseResult.cs new file mode 100644 index 000000000..7d13a8193 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Common/BaseResult.cs @@ -0,0 +1,114 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Collections.Generic; +using MySqlX.Protocol; +using MySqlX.Sessions; +using System.Collections.ObjectModel; +using System; + +namespace MySqlX.XDevAPI.Common +{ + /// + /// Base abstract class that defines elements inherited by all result types. + /// + public abstract class BaseResult + { + private List _warnings = new List(); + internal ulong _recordsAffected; + internal ulong _affectedItemsCount; + internal ulong _autoIncrementValue; + internal InternalSession _session; + internal bool _hasData; + internal bool _hasMoreResults = false; + internal List _documentIds = new List(); + + /// + /// Gets the number of records affected by the statement that generated this result. + /// + public UInt64 AffectedItemsCount + { + get { return _affectedItemsCount; } + } + + internal BaseResult(InternalSession session) + { + if (session == null) return; + _session = session; + + // if we have an active resultset then we must buffer it entirely + if (session.ActiveResult != null) + { + session.ActiveResult.Buffer(); + session.ActiveResult = null; + } + + _hasData = Protocol.HasData(this); + if (_hasData) + session.ActiveResult = this; + } + + /// + /// Gets the object of the session. + /// + protected ProtocolBase Protocol + { + get { return _session?.GetProtocol(); } + } + + internal void AddWarning(WarningInfo w) + { + _warnings.Add(w); + } + + /// + /// Gets a read-only collection of objects derived from statement execution. + /// +#if NET_45_OR_GREATER + public IReadOnlyList Warnings +#else + public ReadOnlyCollection Warnings +#endif + { + get { return _warnings.AsReadOnly(); } + } + + /// + /// Gets the number of warnings in the collection derived from statement execution. + /// + public Int32 WarningsCount + { + get { return _warnings.Count; } + } + + /// + /// No action is performed by this method. It is intended to be overriden by child classes if required. + /// + protected virtual void Buffer() { } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Common/BaseStatement.cs b/MySQL.Data/src/X/XDevAPI/Common/BaseStatement.cs new file mode 100644 index 000000000..a56018d88 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Common/BaseStatement.cs @@ -0,0 +1,163 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI.Relational; +using System; +using System.Collections; +using System.Threading; +using System.Threading.Tasks; + +namespace MySqlX.XDevAPI.Common +{ + /// + /// Base abstract class for API statement. + /// + /// + /// + public abstract class BaseStatement where TResult : BaseResult + { + // Prepared statements flags + internal bool _hasChanged, _isPrepared; + protected int _stmtId; + + /// + /// Initializes a new instance of the BaseStatement class based on the specified session. + /// + /// The session where the statement will be executed. + public BaseStatement(BaseSession session) + { + Session = session; + _hasChanged = true; + } + + /// + /// Gets the that owns the statement. + /// + public BaseSession Session { get; private set; } + + /// + /// Executes the base statements. This method is intended to be defined by child classes. + /// + /// A result object containing the details of the execution. + public abstract TResult Execute(); + + /// + /// Executes a statement asynchronously. + /// + /// A result object containing the details of the execution. + public async Task ExecuteAsync() + { + return await Task.Factory.StartNew(() => + { + var result = Execute(); + if (result is BufferingResult) + { + (result as BufferingResult).FetchAll(); + } + else if (result is BufferingResult) + { + (result as BufferingResult).FetchAll(); + } + return result; + }, + CancellationToken.None, + TaskCreationOptions.None, + Session._scheduler).ConfigureAwait(false); + } + + /// + /// Validates if the session is open and valid. + /// + protected void ValidateOpenSession() + { + if (Session.XSession.SessionState != SessionState.Open) + throw new MySqlException(ResourcesX.InvalidSession); + } + + /// + /// Sets the status as Changed for prepared statement validation. + /// + protected void SetChanged() + { + _hasChanged = true; + } + + /// + /// Converts a statement to prepared statement for a second execution + /// without any change but Bind, Limit, or Offset. + /// + protected virtual TResult ConvertToPreparedStatement(Func executeFunc, T t, IEnumerable args) + //where T : FilterableStatement + { + if (!Session.SupportsPreparedStatements) + { + // Normal execution + return executeFunc(t); + } + + if (_hasChanged) + { + if (_isPrepared) + { + // Deallocate prepared statement + Session.XSession.DeallocatePreparedStatement(_stmtId); + _isPrepared = false; + } + // Normal execution + return executeFunc(t); + } + else + { + if (!_isPrepared) + { + // Create prepared statement + try + { + _stmtId = Session.XSession.PrepareStatement(this); + _isPrepared = true; + } + catch (MySqlException ex) + when (ex.Code == 1461 // Can't create more than max_prepared_stmt_count statements + || ex.Code == 1047) // Unexpected message received + { + // Set prepared statements not supported to avoid trying it + // on following executions. + Session.SupportsPreparedStatements = false; + _isPrepared = false; + // Normal execution + return executeFunc(t); + } + } + // Execute prepared statement + return Session.XSession.ExecutePreparedStatement(_stmtId, args); + } + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Common/BufferingResult.cs b/MySQL.Data/src/X/XDevAPI/Common/BufferingResult.cs new file mode 100644 index 000000000..58a206a8d --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Common/BufferingResult.cs @@ -0,0 +1,242 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections; +using System.Collections.Generic; +using MySqlX.XDevAPI.Relational; +using MySqlX.Sessions; +using System.Collections.ObjectModel; +using MySql.Data; +using MySqlX; +using MySql.Data.MySqlClient; + +namespace MySqlX.XDevAPI.Common +{ + /// + /// Abstract class for buffered results. + /// + /// Generic result type. + public abstract class BufferingResult : BaseResult, IEnumerable, IEnumerator + { + /// + /// Index of the current item. + /// + protected int _position; + /// + /// List of generic items in this buffered result. + /// + protected List _items = new List(); + /// + /// Flag that indicates if all items have been read. + /// + protected bool _isComplete; + Dictionary _nameMap = new Dictionary(StringComparer.OrdinalIgnoreCase); + internal List _columns = null; + + + internal BufferingResult(InternalSession session) : base(session) + { + LoadColumnData(); + PageSize = 20; + _position = -1; + } + + /// + /// Gets a dictionary containing the column names and their index. + /// + protected Dictionary NameMap + { + get { return _nameMap; } + } + + /// + /// Gets the page size set for this buffered result. + /// + public int PageSize { get; private set; } + + /// + /// Loads the column data into the field. + /// + protected void LoadColumnData() + { + _columns = new List(); + if (_hasData) + { + _columns = Protocol.LoadColumnMetadata(); + if (_columns.Count == 0) + _hasData = false; + for (int i = 0; i < _columns.Count; i++) + _nameMap.Add(_columns[i].ColumnLabel ?? _columns[i].ColumnName, i); + } + else + Protocol.CloseResult(this); + } + + /// + /// Retrieves a read-only list of the generic items associated to this buffered result. + /// + /// A generic list representing items in this buffered result. + public ReadOnlyCollection FetchAll() + { + while (PageInItems()) ; + return _items.AsReadOnly(); + } + + internal void Dump() + { + if (_isComplete) return; + while (true) + { + if (ReadItem(true) == null) break; + } + _isComplete = true; + } + + /// + /// Retrieves one element from the generic items associated to this buffered result. + /// + /// A generic object that corresponds to the current or default item. + public T FetchOne() + { + if (!Next()) + return default(T); + return Current; + } + + /// + /// Determines if all items have already been read. + /// + /// True if all items have been retrived, false otherwise. + public bool Next() + { + _position++; + if (_position >= _items.Count) + { + if (_isComplete) return false; + if (!PageInItems()) + { + _isComplete = true; + return false; + } + } + return true; + } + + protected abstract T ReadItem(bool dumping); + + private bool PageInItems() + { + if (_isComplete) return false; + int count = 0; + for (int i = 0; i < PageSize; i++) + { + T item = ReadItem(false); + if (item == null) + { + _isComplete = !_hasData; + _session.ActiveResult = null; + break; + } + _items.Add(item); + count++; + } + return count > 0; + } + + /// + /// Gets the current item. + /// + /// All items have already been read. + public T Current + { + get + { + if (_position == _items.Count) + throw new InvalidOperationException(String.Format(ResourcesX.NoDataAtIndex, _position)); + return _items[_position]; + } + } + + object IEnumerator.Current + { + get { return this.Current; } + } + + /// + /// Determines if all items have already been read. + /// + /// True if all items have been retrived, false otherwise. + public bool MoveNext() + { + return Next(); + } + + /// + /// Resets the value of the field to zero. + /// + public void Reset() + { + _position = 0; + } + + /// + /// Gets an representation of this object. + /// + /// An representation of this object. + public IEnumerator GetEnumerator() + { + return this; + } + + /// + /// Gets an representation of this object. + /// + /// An representation of this object. + IEnumerator IEnumerable.GetEnumerator() + { + return this; + } + + /// + /// Retrieves a read-only list of the generic items associated to this buffered result. + /// + /// A generic list representing items in this buffered result. + protected override void Buffer() + { + FetchAll(); + } + + /// + /// No body has been defined for this method. + /// + public void Dispose() + { + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Common/CollectionOptions.cs b/MySQL.Data/src/X/XDevAPI/Common/CollectionOptions.cs new file mode 100644 index 000000000..845ae395d --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Common/CollectionOptions.cs @@ -0,0 +1,82 @@ +// Copyright © 2019, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySqlX.XDevAPI.Common +{ + /// + /// This object store the required parameters to create a Collection with schema validation. + /// + public struct CreateCollectionOptions + { + /// + /// If false, throws an exception if the collection exists. + /// + public bool ReuseExisting { get; set; } + /// + /// Object which hold the Level and Schema parameters. + /// + public Validation Validation { get; set; } + } + + /// + /// This object store the required parameters to modify a Collection with schema validation. + /// + public struct ModifyCollectionOptions + { + /// + /// This object store the required parameters to Modify a Collection with schema validation. + /// + public Validation Validation { get; set; } + } + + /// + /// This object store the required parameters to create a Collection with schema validation. + /// + public struct Validation + { + /// + /// It can be STRICT to enable schema validation or OFF to disable . + /// + public ValidationLevel? Level { get; set; } + /// + /// The JSON which define the rules to be validated in the collection. + /// + public string Schema { get; set; } + } + + /// + /// The possible values for parameter Level in Validation object. + /// + public enum ValidationLevel + { + //Disable schema validation + OFF, + //Enable schema validation + STRICT + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Common/ColumnType.cs b/MySQL.Data/src/X/XDevAPI/Common/ColumnType.cs new file mode 100644 index 000000000..ddd964286 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Common/ColumnType.cs @@ -0,0 +1,64 @@ +// Copyright © 2016, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySql.Data.MySqlClient.X.XDevAPI.Common +{ + /// + /// Defines the type of the column. + /// + public enum ColumnType + { + Bit = 1, + Tinyint, + Smallint, + Mediumint, + Int, + Bigint, + Float, + Decimal, + Double, + + Json, + String, + Bytes, + Time, + Date, + DateTime, + Timestamp, + Set, + Enum, + Geometry, + } + + internal enum ColumnContentType + { + Geometry = 1, + Json, + Xml + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Common/ErrorInfo.cs b/MySQL.Data/src/X/XDevAPI/Common/ErrorInfo.cs new file mode 100644 index 000000000..ca31f42fb --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Common/ErrorInfo.cs @@ -0,0 +1,57 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; + +namespace MySqlX.XDevAPI.Common +{ + /// + /// Class to represent an error in this result. + /// + public class ErrorInfo + { + /// + /// Numeric code. + /// + public UInt32 Code; + /// + /// Return code indicating the outcome of the executed SQL statement. + /// + public string SqlState; + /// + /// Error message. + /// + public string Message; + + /// + /// Initializes a new instance of the ErrorInfo class. + /// + public ErrorInfo() + {} + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Common/FilterParams.cs b/MySQL.Data/src/X/XDevAPI/Common/FilterParams.cs new file mode 100644 index 000000000..35348362e --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Common/FilterParams.cs @@ -0,0 +1,94 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySqlX.Protocol.X; +using Mysqlx.Crud; +using Mysqlx.Expr; +using System.Collections.Generic; +using Mysqlx.Datatypes; +using System; +using MySqlX; +using MySql.Data; + +namespace MySqlX.XDevAPI.Common +{ + internal class FilterParams + { + public long Limit = -1; + public long Offset = -1; + public string Condition; + public Dictionary Parameters = new Dictionary(); + public Dictionary placeholderNameToPosition; + public bool IsRelational; + public string[] OrderBy; + public bool hadLimit = false; + public bool hadOffset = false; + + public bool HasLimit + { + get { return Limit != -1; } + } + + public List GetOrderByExpressions(bool allowRelational) + { + return new ExprParser(ExprUtil.JoinString(OrderBy), allowRelational).ParseOrderSpec(); + } + + public Expr GetConditionExpression(bool allowRelational) + { + ExprParser parser = new ExprParser(Condition, allowRelational); + Expr expr = parser.Parse(); + if (parser.GetPositionalPlaceholderCount() > 0) + { + this.placeholderNameToPosition = parser.GetPlaceholderNameToPositionMap(); + } + return expr; + } + + public IEnumerable GetArgsExpression(Dictionary parameters) + { + if (placeholderNameToPosition == null || placeholderNameToPosition.Count == 0) + throw new ArgumentException(ResourcesX.NoPlaceholders); + + Scalar[] paramsList = new Scalar[placeholderNameToPosition.Count]; + foreach (var param in parameters) + { + if (!placeholderNameToPosition.ContainsKey(param.Key.ToLowerInvariant())) + throw new ArgumentNullException(string.Format(ResourcesX.UnknownPlaceholder, param.Key)); + paramsList[placeholderNameToPosition[param.Key.ToLowerInvariant()]] = ExprUtil.ArgObjectToScalar(param.Value) + ?? throw new ArgumentException(param.Key); + } + return paramsList; + } + + public FilterParams Clone() + { + return (FilterParams)this.MemberwiseClone(); + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Common/FilterableStatement.cs b/MySQL.Data/src/X/XDevAPI/Common/FilterableStatement.cs new file mode 100644 index 000000000..fa80d991a --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Common/FilterableStatement.cs @@ -0,0 +1,202 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySqlX.Serialization; +using System; +using System.Collections.Generic; + +namespace MySqlX.XDevAPI.Common +{ + /// + /// Abstract class for filterable statements. + /// + /// The filterable statement. + /// The database object. + /// The type of result. + /// The type of the implemented object. + public abstract class FilterableStatement : TargetedBaseStatement + where T : FilterableStatement + where TTarget : DatabaseObject + where TResult : BaseResult + { + private FilterParams filter = new FilterParams(); + + /// + /// Initializes a new instance of the FiltarableStatement class based on the target and condition. + /// + /// The database object. + /// The optional filter condition. + public FilterableStatement(TTarget target, string condition = null) : base(target) + { + if (condition != null) + Where(condition); + } + + internal FilterParams FilterData + { + get { return filter; } + } + + /// + /// Enables the setting of Where condition for this operation. + /// + /// The Where condition. + /// The implementing statement type. + public T Where(string condition) + { + filter.Condition = condition; + SetChanged(); + return (T)this; + } + + /// + /// Sets the number of items to be returned by the operation. + /// + /// The number of items to be returned. + /// The implementing statement type. + /// is equal or lower than 0. + public T Limit(long rows) + { + if (rows <= 0) throw new ArgumentOutOfRangeException(nameof(rows), string.Format(ResourcesX.NumberNotGreaterThanZero, nameof(rows))); + filter.Limit = rows; + return (T)this; + } + + /// + /// Sets the number of items to be skipped before including them into the result. + /// + /// The number of items to be skipped. + /// The implementing statement type. + public T Offset(long rows) + { + filter.Offset = rows; + return (T)this; + } + + /// + /// Binds the parameter values in filter expression. + /// + /// The parameter name. + /// The value of the parameter. + /// A generic object representing the implementing statement type. + public T Bind(string parameterName, object value) + { + FilterData.Parameters[parameterName.ToLowerInvariant()] = value is string ? QuoteString((string)value) : value; + return (T)this; + } + + /// + /// Binds the parameter values in filter expression. + /// + /// The parameters as a DbDoc object. + /// A generic object representing the implementing statement type. + public T Bind(DbDoc dbDocParams) + { + return Bind(dbDocParams.ToString()); + } + + /// + /// Binds the parameter values in filter expression. + /// + /// The parameters as a JSON string. + /// The implementing statement type. + public T Bind(string jsonParams) + { + foreach (var item in JsonParser.Parse(jsonParams)) + { + Bind(item.Key, item.Value); + } + return (T)this; + } + + /// + /// Binds the parameter values in filter expression. + /// + /// The parameters as an anonymous object: new { param1 = value1, param2 = value2, ... }. + /// The implementing statement type. + public T Bind(object jsonParams) + { + return Bind(new DbDoc(jsonParams)); + } + + /// + /// Executes the statement. + /// + /// The function to execute. + /// The generic object to use. + /// A generic result object containing the results of the execution. + protected virtual TResult Execute(Func executeFunc, T t) + { + try + { + ValidateOpenSession(); + List parameters = new List(FilterData.Parameters.Values); + if (_isPrepared && FilterData.hadLimit != FilterData.HasLimit) + { + SetChanged(); + } + // Add the prepared statement placeholder values for limit and offset + if (!_hasChanged) + { + // Limit and offset placeholder values + if (FilterData.HasLimit) + { + parameters.Add(FilterData.Limit); + parameters.Add(FilterData.Offset == -1 ? 0 : FilterData.Offset); + } + } + var result = ConvertToPreparedStatement(executeFunc, t, parameters); + _hasChanged = false; + return result; + } + finally + { + FilterData.hadLimit = FilterData.HasLimit; + FilterData.hadOffset = FilterData.Offset != -1; + } + } + + /// + /// Clones the filterable data but Session and Target remain the + /// same. + /// + /// A clone of this filterable statement. + public virtual T Clone() + { + var t = (T)this.MemberwiseClone(); + t.filter = t.FilterData.Clone(); + return t; + } + + private static string QuoteString(string value) + { + return "'" + value.Trim().Replace("'", "\\'") + "'"; + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Common/QueryStatement.cs b/MySQL.Data/src/X/XDevAPI/Common/QueryStatement.cs new file mode 100644 index 000000000..9286523f7 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Common/QueryStatement.cs @@ -0,0 +1,66 @@ +// Copyright © 2017, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySqlX.XDevAPI.CRUD; +using MySqlX.XDevAPI.Relational; + +namespace MySqlX.XDevAPI.Common +{ + internal class QueryStatement + { + internal string schema; + internal string collection; + internal bool isRelational; + internal FilterParams filter; + internal FindParams findParams; + internal TableSelectStatement selectStatement; + internal FindStatement findStatement; + + + public QueryStatement(FindStatement statement) + { + this.findStatement = statement; + SetValues(statement.Target, statement.FilterData, null, false); + } + + public QueryStatement(TableSelectStatement statement) + { + this.selectStatement = statement; + SetValues(statement.Target, statement.FilterData, statement.findParams, true); + } + + private void SetValues(DatabaseObject target, FilterParams filter, FindParams findParams, bool isRelational) + { + this.schema = target.Schema.Name; + this.collection = target.Name; + this.isRelational = isRelational; + this.filter = filter; + this.findParams = findParams; + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Common/Result.cs b/MySQL.Data/src/X/XDevAPI/Common/Result.cs new file mode 100644 index 000000000..50ce51f96 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Common/Result.cs @@ -0,0 +1,60 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySqlX.Sessions; +using System; +using System.Collections.ObjectModel; + +namespace MySqlX.XDevAPI.Common +{ + /// + /// Represents a general statement result. + /// + public class Result : BaseResult + { + internal Result(InternalSession session) : base(session) + { + if (session == null) return; + GeneratedIds = new ReadOnlyCollection(_documentIds); + session.GetProtocol().CloseResult(this); + } + + /// + /// Gets the last inserted identifier (if there is one) by the statement that generated this result. + /// + public UInt64 AutoIncrementValue + { + get { return _autoIncrementValue; } + } + + /// + /// Gets the list of generated identifiers in the order of the Add() calls. + /// + public ReadOnlyCollection GeneratedIds { get; } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Common/TargetedBaseStatement.cs b/MySQL.Data/src/X/XDevAPI/Common/TargetedBaseStatement.cs new file mode 100644 index 000000000..ec83f3dd9 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Common/TargetedBaseStatement.cs @@ -0,0 +1,55 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySqlX.XDevAPI.Common +{ + /// + /// Abstract class to select a database object target. + /// + /// The database object. + /// The execution result. + /// The type of the implemented object. + public abstract class TargetedBaseStatement : BaseStatement + where TTarget : DatabaseObject + where TResult : BaseResult + { + /// + /// Initializes a new instance of the TargetedBaseStatement class based on the provided target. + /// + /// The database object. + public TargetedBaseStatement(TTarget target) : base(target.Schema.Session) + { + Target = target; + } + + /// + /// Gets the database target. + /// + public TTarget Target { get; private set; } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Common/WarningInfo.cs b/MySQL.Data/src/X/XDevAPI/Common/WarningInfo.cs new file mode 100644 index 000000000..2e6877358 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Common/WarningInfo.cs @@ -0,0 +1,62 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySqlX.XDevAPI.Common +{ + /// + /// Represents a warning in this result. + /// + public class WarningInfo + { + /// + /// Numeric value associated to the warning message. + /// + public uint Code; + + /// + /// Error message. + /// + public string Message; + + /// + /// Strict level for the warning. + /// + public uint Level; + + /// + /// Initializes a new instance of the WarningInfo class based on the code and msg. + /// + /// The code for the warning. + /// The error message for the warning. + public WarningInfo(uint code, string msg) + { + Code = code; + Message = msg; + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/DatabaseObject.cs b/MySQL.Data/src/X/XDevAPI/DatabaseObject.cs new file mode 100644 index 000000000..8d550665e --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/DatabaseObject.cs @@ -0,0 +1,76 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +using MySql.Data; +using MySql.Data.MySqlClient; + +namespace MySqlX.XDevAPI +{ + /// + /// Represents a database object. + /// + public abstract class DatabaseObject + { + internal DatabaseObject(Schema schema, string name) + { + Schema = schema; + Name = name; + } + + /// + /// Gets the session that owns the database object. + /// + public BaseSession Session + { + get { return Schema.Session; } + } + + /// + /// Gets the schema that owns the database object. + /// + public Schema Schema { get; internal set; } + + /// + /// Gets the database object name. + /// + public string Name { get; internal set; } + + /// + /// Verifies that the database object exists in the database. + /// + /// True if the object exists in database, false otherwise. + public abstract bool ExistsInDatabase(); + + protected void ValidateOpenSession() + { + if (Session.XSession.SessionState != SessionState.Open) + throw new MySqlException(ResourcesX.InvalidSession); + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/DbDoc.cs b/MySQL.Data/src/X/XDevAPI/DbDoc.cs new file mode 100644 index 000000000..fe5fbc16b --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/DbDoc.cs @@ -0,0 +1,303 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySqlX.Serialization; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using System.Text; + +namespace MySqlX.XDevAPI +{ + /// + /// Represents a generic document in JSON format. + /// + public class DbDoc + { + internal Dictionary values = new Dictionary(); + + /// + /// Initializes a new instance of the DbDoc class based on the object provided. The value can be a domain object, anonymous object, or JSON string. + /// + /// The value for this DbDoc. + public DbDoc(object val = null) + { + if (val == null) + { + return; + } + + try + { + if (val is string) + values = JsonParser.Parse(val as string); + else if (val is Dictionary) + values = JsonParser.Parse(DictToString(val as Dictionary, 2)); + else if (val is DbDoc) + values = JsonParser.Parse(DictToString((val as DbDoc).values, 2)); + else + values = ParseObject(val); + } + catch (Exception exception) + { + // Throw message indicating the format of the Json document is invalid and append the message + // returned by the Json parser. + throw (new Exception(string.Format(ResourcesX.InvalidJsonDocument, exception.Message))); + } + } + + /// + /// Gets the value of a document property. + /// + /// The key path for the property. + /// + public object this[string path] + { + get { return GetValue(path); } + } + + /// + /// Gets the identifier of the document. + /// + public object Id + { + get { return values["_id"]; } + internal set { SetValue("_id", value); } + } + + /// + /// Gets a value indicating if this document has an identifier (property named _id with a value). + /// + public bool HasId + { + get { return values.ContainsKey("_id"); } + } + + //internal void EnsureId() + //{ + // if (!HasId) + // { + // char separatorChar = '-'; + // string[] token = Guid.NewGuid().ToString().Split(separatorChar); + // string guid = string.Empty; + // for (int i = token.Length-1; i >= 0; i--) + // { + // guid += token[i]; + // if (i != 0) guid += separatorChar; + // } + + // SetValue("_id", guid.Replace(separatorChar.ToString(), string.Empty)); + // } + //} + + private object GetValue(string path) + { + string[] levels = path.Split('.'); + Dictionary dic = values; + object returnValue = null; + foreach (string level in levels) + { + if (!dic.ContainsKey(level)) + throw new InvalidOperationException( + String.Format(ResourcesX.PathNotFound, path)); + if (dic[level] is Dictionary) + returnValue = dic = dic[level] as Dictionary; + else if (dic[level] == null) return null; + else if (dic[level].GetType().GetTypeInfo().IsGenericType) + returnValue = dic = ParseObject(dic[level]); + else + returnValue = dic[level]; + } + + return returnValue; + } + + /// + /// Sets a property on this document. + /// + /// The key of the property. + /// The new property value. + public void SetValue(string key, object val) + { + IList e = val as IList; + + if (e != null) + values[key] = GetArrayValues(e); + else if (val is DbDoc) + values[key] = (val as DbDoc).values; + else if (val is Dictionary) + values[key] = val; + else if (val != null && val.GetType().Namespace != "System") + values[key] = ParseObject(val); + else + values[key] = val; + } + + private Dictionary[] GetArrayValues(IEnumerable value) + { + List> values = new List>(); + foreach (object o in value) + values.Add(ParseObject(o)); + return values.ToArray(); + } + + /// + /// Returns this document in Json format. + /// + /// A Json formatted string. + public override string ToString() + { + return DictToString(values, 2); + } + + private string DictToString(Dictionary vals, int ident) + { + StringBuilder json = new StringBuilder("{"); + string delimiter = ""; + foreach (string key in vals.Keys) + { + json.Append(delimiter); + json.AppendLine(); + json.Append(' ', ident); + json.AppendFormat("\"{0}\": {1}", key, GetValue(vals[key], ident) ?? "null"); + delimiter = ", "; + } + json.AppendLine(); + json.Append(' ', ident - 2); + json.Append("}"); + return json.ToString(); + } + + private string GetValue(object val, int ident) + { + if (val == null) return null; + + if (val.GetType().IsArray) + { + + StringBuilder values = new StringBuilder("["); + string separator = string.Empty; + foreach (var item in (Array)val) + { + values.Append(separator); + values.AppendLine(); + values.Append(' ', ident + 2); + values.Append(GetValue(item, ident + 2)); + separator = ", "; + } + values.AppendLine(); + values.Append(' ', ident); + values.Append("]"); + return values.ToString(); + } + if (val is Dictionary) + return DictToString(val as Dictionary, ident + 2); + else if (val is MySqlExpression) + { + var expression = (MySqlExpression)val; + return expression.value; + } + + string quoteChar = ""; + if (val is string || val is DateTime) + { + quoteChar = "\""; + } + + return quoteChar + ( + val is bool ? + val.ToString().ToLowerInvariant() : + val is double ? + ((double)val).ToString(System.Globalization.CultureInfo.InvariantCulture) : + val.ToString() + ) + quoteChar; + } + + private bool CompareDictionaries(Dictionary dict1, Dictionary dict2) + { + IEqualityComparer valueComparer = EqualityComparer.Default; + if (dict1.Count != dict2.Count) return false; + foreach (TKey key in dict1.Keys) + { + if (!dict2.ContainsKey(key)) return false; + object val = dict1[key]; + object val2 = dict2[key]; + if (val is Dictionary[] && val2 is Dictionary[]) + { + Dictionary[] valArray1 = (Dictionary[])val; + Dictionary[] valArray2 = (Dictionary[])val2; + if (valArray1.Length != valArray2.Length) return false; + for (int i = 0; i < valArray1.Length; i++) + { + if (!CompareDictionaries(valArray1[i], valArray2[i])) return false; + } + } + else if (val is Dictionary && val2 is Dictionary) + return CompareDictionaries((Dictionary)val, (Dictionary)val2); + else if (!val.Equals(val2)) return false; + } + return true; + } + + /// + /// Compares this DbDoc with another one. + /// + /// The DbDoc to compare to. + /// True if they are equal, false otherwise. + public override bool Equals(object obj) + { + if (!(obj is DbDoc)) + throw new InvalidOperationException("DbDoc can only be compared with another DbDoc"); + DbDoc toCompare = obj as DbDoc; + return CompareDictionaries(values, toCompare.values); + } + + /// + /// Gets a value that serves as a hash function for a particular type. + /// + /// A hash code for the current object. + public override int GetHashCode() + { + return base.GetHashCode(); + } + + private Dictionary ParseObject(object val) + { + Type t = val.GetType(); + bool allProps = t.Name.Contains("Anonymous"); + Dictionary vals = new Dictionary(); + + PropertyInfo[] props = allProps ? t.GetProperties() : t.GetProperties(BindingFlags.Public); + foreach (PropertyInfo prop in props) + vals.Add(prop.Name, prop.GetValue(val, null)); + return vals; + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/GenericCollection.cs b/MySQL.Data/src/X/XDevAPI/GenericCollection.cs new file mode 100644 index 000000000..16443acfc --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/GenericCollection.cs @@ -0,0 +1,301 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI.Common; +using MySqlX.XDevAPI.CRUD; +using System; + +namespace MySqlX.XDevAPI +{ + /// + /// Represents a collection of documents with a generic type. + /// + /// + public class Collection : DatabaseObject + { + /// + /// Initializes a new instance of the generic Collection class based on the specified schema + /// and name. + /// + /// The object associated to this collection. + /// The name of the collection. + public Collection(Schema s, string name) : base(s, name) { } + + /// + /// Creates an containing the provided generic object. The add + /// statement can be further modified before execution. + /// + /// The generic object to add. + /// An object containing the object to add. + public AddStatement Add(params object[] items) + { + if (items == null) + throw new ArgumentNullException(); + + AddStatement stmt = new AddStatement(this); + stmt.Add(items); + return stmt; + } + + #region Remove Operations + + /// + /// Creates a with the given condition that can be used to remove + /// one or more documents from a collection.The statement can then be further modified before execution. + /// + /// The condition to match documents. + /// A object set with the given condition. + /// is null or white space. + /// The statement can then be further modified before execution. + public RemoveStatement Remove(string condition) + { + if (string.IsNullOrWhiteSpace(condition)) + throw new ArgumentNullException(nameof(condition), Resources.ParameterNullOrEmpty); + + RemoveStatement stmt = new RemoveStatement(this, condition); + return stmt; + } + + /// + /// Removes the document with the given identifier. + /// + /// The unique identifier of the document to replace. + /// A object containing the results of the execution. + /// is null or white space. + /// This is a direct execution method. + public Result RemoveOne(object id) + { + if (id == null) + throw new ArgumentNullException(nameof(id)); + string stringId = id.ToString(); + if (string.IsNullOrWhiteSpace(stringId)) + throw new ArgumentNullException(nameof(id), Resources.ParameterNullOrEmpty); + + return Remove("_id = :id").Bind("id", id).Execute(); + } + + #endregion + + #region Modify Operations + + /// + /// Creates a with the given condition that can be used to modify one or more + /// documents from a collection. + /// + /// The condition to match documents. + /// A object set with the given condition. + /// is null or white space. + /// The statement can then be further modified before execution. + public ModifyStatement Modify(string condition) + { + if (string.IsNullOrWhiteSpace(condition)) + throw new ArgumentNullException(nameof(condition), Resources.ParameterNullOrEmpty); + + ModifyStatement stmt = new ModifyStatement(this, condition); + return stmt; + } + #endregion + + /// + /// Returns the number of documents in this collection on the server. + /// + /// The number of documents found. + public long Count() + { + long result = 0; + try + { + ValidateOpenSession(); + result = Session.XSession.TableCount(Schema, Name, "Collection"); + } + catch (MySqlException ex) + { + switch (ex.Number) + { + case (int)CloseNotification.IDLE: + case (int)CloseNotification.KILLED: + case (int)CloseNotification.SHUTDOWN: + XDevAPI.Session.ThrowSessionClosedByServerException(ex, Session); + break; + default: + throw; + } + } + return result; + } + + /// + /// Creates a with the given condition which can be used to find documents in a + /// collection. + /// + /// An optional condition to match documents. + /// A object set with the given condition. + /// The statement can then be further modified before execution. + public FindStatement Find(string condition = null) + { + FindStatement stmt = new FindStatement(this, condition); + return stmt; + } + + /// + /// Creates an index based on the properties provided in the JSON document. + /// + /// The index name. + /// JSON document describing the index to be created. + /// + /// is a JSON document with the following fields: + /// + /// - fields: array of IndexField objects, each describing a single document member to be + /// included in the index (see below). + /// - type: string, (optional) the type of index. One of INDEX or SPATIAL. Default is INDEX and may + /// be omitted. + /// + ///   + /// A single IndexField description consists of the following fields: + /// + /// - field: string, the full document path to the document member or field to be indexed. + /// - type: string, one of the supported SQL column types to map the field into (see the following list). + /// For numeric types, the optional UNSIGNED keyword may follow. For the TEXT type, the length to consider for + /// indexing may be added. + /// - required: bool, (optional) true if the field is required to exist in the document. defaults to + /// false, except for GEOJSON where it defaults to true. + /// - options: int, (optional) special option flags for use when decoding GEOJSON data. + /// - srid: int, (optional) srid value for use when decoding GEOJSON data. + /// + ///   + /// Supported SQL column types: + /// + /// - INT [UNSIGNED] + /// - TINYINT [UNSIGNED] + /// - SMALLINT[UNSIGNED] + /// - MEDIUMINT [UNSIGNED] + /// - INTEGER [UNSIGNED] + /// - BIGINT [UNSIGNED] + /// - REAL [UNSIGNED] + /// - FLOAT [UNSIGNED] + /// - DOUBLE [UNSIGNED] + /// - DECIMAL [UNSIGNED] + /// - NUMERIC [UNSIGNED] + /// - DATE + /// - TIME + /// - TIMESTAMP + /// - DATETIME + /// - TEXT[(length)] + /// - CHAR[(lenght)] + /// - GEOJSON (extra options: options, srid) + /// + /// + public void CreateIndex(string indexName, object indexDefinition) + { + new CreateCollectionIndexStatement(this, indexName, new DbDoc(indexDefinition)).Execute(); + } + + /// + /// Drops a collection index. + /// + /// The index name. + /// is null or white space. + public void DropIndex(string indexName) + { + if (string.IsNullOrWhiteSpace(indexName)) throw new ArgumentNullException(nameof(indexName)); + + ValidateOpenSession(); + + try + { + bool indexExists = Convert.ToInt32(Session.XSession.ExecuteQueryAsScalar( + string.Format("SELECT COUNT(*)>0 FROM information_schema.statistics WHERE table_schema = '{0}' AND table_name = '{1}' AND index_name = '{2}'", + this.Schema.Name, this.Name, indexName))) == 1; + if (!indexExists) return; + + Session.XSession.DropCollectionIndex(this.Schema.Name, this.Name, indexName); + } + catch (MySqlException ex) + { + switch (ex.Number) + { + case (int)CloseNotification.IDLE: + case (int)CloseNotification.KILLED: + case (int)CloseNotification.SHUTDOWN: + XDevAPI.Session.ThrowSessionClosedByServerException(ex, Session); + break; + default: + throw; + } + } + } + + /// + /// Verifies if the current collection exists in the server schema. + /// + /// true if the collection exists; otherwise, false. + public override bool ExistsInDatabase() + { + bool result = false; + try + { + ValidateOpenSession(); + result = Session.XSession.TableExists(Schema, Name); + } + catch (MySqlException ex) + { + switch (ex.Number) + { + case (int)CloseNotification.IDLE: + case (int)CloseNotification.KILLED: + case (int)CloseNotification.SHUTDOWN: + XDevAPI.Session.ThrowSessionClosedByServerException(ex, Session); + break; + default: + throw; + } + } + return result; + } + + /// + /// Returns the document with the given identifier. + /// + /// The unique identifier of the document to replace. + /// A object if a document matching given identifier exists; otherwise, null. + /// is null or white space. + /// This is a direct execution method. + public T GetOne(object id) + { + if (id == null) + throw new ArgumentNullException(nameof(id)); + string stringId = id.ToString(); + if (string.IsNullOrWhiteSpace(stringId)) + throw new ArgumentNullException(nameof(id), Resources.ParameterNullOrEmpty); + + return Find("_id = :id").Bind("id", id).Execute().FetchOne(); + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Iterator.cs b/MySQL.Data/src/X/XDevAPI/Iterator.cs new file mode 100644 index 000000000..e4b2d1fd8 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Iterator.cs @@ -0,0 +1,55 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; + +namespace MySqlX.XDevAPI +{ + /// + /// Defines elements that allow to iterate through the contents of various items. + /// + public class Iterator + { + /// + /// Initializes a new instance of the Iterator class. + /// + public Iterator() + {} + + /// + /// This method is not yet implemented. + /// + /// + /// + /// Exception is always thrown since the body of the method is not yet implemented. + public Iterator Open(string p) + { + throw new NotImplementedException(); + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/MySqlExpression.cs b/MySQL.Data/src/X/XDevAPI/MySqlExpression.cs new file mode 100644 index 000000000..0b7167c0f --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/MySqlExpression.cs @@ -0,0 +1,42 @@ +// Copyright © 2017, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySqlX.XDevAPI +{ + /// + /// Defines a MySql expression. + /// + public class MySqlExpression + { + public string value; + public MySqlExpression(string value) + { + this.value = value; + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/MySqlX.cs b/MySQL.Data/src/X/XDevAPI/MySqlX.cs new file mode 100644 index 000000000..a395cf4a0 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/MySqlX.cs @@ -0,0 +1,147 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySqlX.XDevAPI +{ + + /// + /// Main class for session operations related to Connector/NET implementation of the X DevAPI. + /// + + public class MySQLX + { + /// + /// Opens a session to the server given or to the first available server if multiple servers were specified. + /// + /// The connection string or URI string format. + /// + /// A object representing the established session. + /// Multiple hosts can be specified as part of the which + /// will enable client side failover when trying to establish a connection. For additional details and syntax + /// examples refer to the remarks section. + public static Session GetSession(string connectionString) + { + return new Session(connectionString); + } + + /// + /// Opens a session to the server given. + /// + /// The connection data for the server. + /// + /// A object representing the established session. + public static Session GetSession(object connectionData) + { + return new Session(connectionData); + } + + /// + /// Creates a new instance. + /// + /// The connection string or URI string format. + /// + /// The connection options in JSON string format. + /// A object representing a session pool. + public static Client GetClient(string connectionString, string connectionOptions) + { + return new Client(connectionString, connectionOptions); + } + + /// + /// Creates a new instance. + /// + /// The connection string or URI string format. + /// + /// The connection options in object format. + /// + /// + /// new { pooling = new + /// { + /// enabled = true, + /// maxSize = 15, + /// maxIdleTime = 60000, + /// queueTimeout = 60000 + /// } + /// } + /// + /// + /// + /// A object representing a session pool. + public static Client GetClient(string connectionString, object connectionOptions) + { + return new Client(connectionString, connectionOptions); + } + + /// + /// Creates a new instance. + /// + /// The connection data. + /// + /// The connection options in JSON string format. + /// A object representing a session pool. + public static Client GetClient(object connectionData, string connectionOptions) + { + return new Client(connectionData, connectionOptions); + } + + /// + /// Creates a new instance. + /// + /// The connection data. + /// + /// The connection options in object format. + /// + /// + /// new { pooling = new + /// { + /// enabled = true, + /// maxSize = 15, + /// maxIdleTime = 60000, + /// queueTimeout = 60000 + /// } + /// } + /// + /// + /// + /// A object representing a session pool. + public static Client GetClient(object connectionData, object connectionOptions) + { + return new Client(connectionData, connectionOptions); + } + + //public static Iterator CsvFileRowIterator() + //{ + // throw new NotImplementedException(); + //} + + //public static Iterator JsonFileDocIterator() + //{ + // throw new NotImplementedException(); + //} + } +} diff --git a/MySQL.Data/src/X/XDevAPI/MySqlXConnectionStringBuilder.cs b/MySQL.Data/src/X/XDevAPI/MySqlXConnectionStringBuilder.cs new file mode 100644 index 000000000..7e4177f2f --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/MySqlXConnectionStringBuilder.cs @@ -0,0 +1,351 @@ +// Copyright © 2019, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySql.Data.Common; +using MySql.Data.MySqlClient; +using System; +using System.Collections.Generic; +using System.ComponentModel; + +namespace MySqlX.XDevAPI +{ + /// + /// Enables the creation of connection strings by exposing the connection options as properties. + /// Contains connection options specific to the X protocol. + /// + public sealed class MySqlXConnectionStringBuilder : MySqlBaseConnectionStringBuilder + { + static MySqlXConnectionStringBuilder() + { + // Add options shared between classic and X protocols from base class. + Options = MySqlBaseConnectionStringBuilder.Options.Clone(); + + // Server options. + Options.Add(new MySqlConnectionStringOption("connect-timeout", "connecttimeout", typeof(uint), (uint)10000, false, + delegate (MySqlXConnectionStringBuilder msb, MySqlConnectionStringOption sender, object Value) + { + sender.ValidateValue(ref Value, sender.Keyword); + uint value = (uint)Convert.ChangeType(Value, sender.BaseType); + // Timeout in milliseconds should not exceed maximum for 32 bit + // signed integer (~24 days). We truncate the value if it exceeds + // maximum (MySqlCommand.CommandTimeout uses the same technique) + uint timeout = Math.Min(value, Int32.MaxValue); + if (timeout != value) + { + MySqlTrace.LogWarning(-1, "Connection timeout value too large (" + + value + " milliseconds). Changed to max. possible value " + + +timeout + " milliseconds)"); + } + msb.SetValue("connect-timeout", timeout); + + }, + (msb, sender) => (uint)msb.values["connect-timeout"] + )); + Options.Add(new MySqlConnectionStringOption("connection-attributes", "connectionattributes", typeof(string), "true", false, + (msb, sender, value) => { msb.SetValue("connection-attributes", value); }, (msb, sender) => msb.ConnectionAttributes)); + Options.Add(new MySqlConnectionStringOption("compression", "use-compression", typeof(CompressionType), CompressionType.Preferred, false, + (msb, sender, value) => { msb.SetValue("compression", value); }, (msb, sender) => msb.Compression)); + Options.Add(new MySqlConnectionStringOption("compression-algorithms", "compressionalgorithms", typeof(string), string.Empty, false, + (msb, sender, value) => { msb.SetValue("compression-algorithms", value); }, (msb, sender) => msb.CompressionAlgorithm)); + + // Authentication options. + Options.Add(new MySqlConnectionStringOption("auth", null, typeof(MySqlAuthenticationMode), MySqlAuthenticationMode.Default, false, + (msb, sender, value) => { msb.SetValue("auth", value); }, (msb, sender) => msb.Auth)); + Options.Add(new MySqlConnectionStringOption("sslcrl", "ssl-crl", typeof(string), null, false, + (msb, sender, value) => { msb.SslCrl = value as string; }, ((msb, sender) => { return msb.SslCrl; }))); + } + + /// + /// Main constructor. + /// + public MySqlXConnectionStringBuilder() + { + values = new Dictionary(); + + // Populate initial values. + lock (this) + { + foreach (MySqlConnectionStringOption option in Options.Options) + { + values[option.Keyword] = option.DefaultValue; + } + } + } + + /// + /// Constructor accepting a connection string. + /// + /// The connection string. + /// A flag indicating if the default port is used in the connection. + public MySqlXConnectionStringBuilder(string connectionString, bool isDefaultPort = true) : this() + { + AnalyzeConnectionString(connectionString, true, isDefaultPort); + lock (this) + { + ConnectionString = connectionString; + } + + if (SslMode == MySqlSslMode.Preferred) + SslMode = MySqlSslMode.Required; + } + + /// + /// Readonly field containing a collection of classic protocol and protocol shared connection options. + /// + internal new static readonly MySqlConnectionStringOptionCollection Options; + + #region Server Properties + + /// + /// Gets or sets the connection timeout. + /// + [Category("Connection")] + [DisplayName("Connect Timeout")] + [Description("The length of time (in milliseconds) to wait for a connection " + + "to the server before terminating the attempt and generating an error.")] + [RefreshProperties(RefreshProperties.All)] + public uint ConnectTimeout + { + get { return (uint)values["connect-timeout"]; } + + set + { + // Timeout in milliseconds should not exceed maximum for 32 bit + // signed integer (~24 days). We truncate the value if it exceeds + // maximum (MySqlCommand.CommandTimeout uses the same technique + uint timeout = Math.Min(value, Int32.MaxValue); + if (timeout != value) + { + MySqlTrace.LogWarning(-1, "Connection timeout value too large (" + + value + " milliseconds). Changed to max. possible value" + + +timeout + " milliseconds)"); + } + SetValue("connect-timeout", timeout); + } + } + + /// + /// Gets or sets the connection attributes. + /// + [Category("Connection")] + [DisplayName("Connection Attributes")] + [Description("Gets or sets a comma-delimited list of key-value pairs " + + "(in addition to standard XProtocol predefined keys) to be passed to MySQL Server" + + "for display as connection attributes.")] + public string ConnectionAttributes + { + get { return (string)values["connection-attributes"]; } + set { SetValue("connection-attributes", value); } + } + #endregion + + #region Authentication Properties + + [Category("Authentication")] + [DisplayName("Auth")] + [Description("Authentication mechanism")] + [DefaultValue(MySqlAuthenticationMode.Default)] + public MySqlAuthenticationMode Auth + { + get { return (MySqlAuthenticationMode)values["auth"]; } + set { SetValue("auth", value); } + } + + /// + /// Path to a local file containing certificate revocation lists. + /// + [Description("Path to a local file containing certificate revocation lists")] + public string SslCrl + { + get { throw new NotSupportedException(); } + set { throw new NotSupportedException(); } + } + + /// + /// Gets or sets the compression type between client and server. + /// + [Category("Server")] + [DisplayName("Compression Type")] + [Description("Compression type")] + [DefaultValue(CompressionType.Preferred)] + public CompressionType Compression + { + get { return (CompressionType)values["compression"]; } + set { SetValue("compression", value); } + } + + /// + /// Gets or sets the compression algorithm. + /// + [Category("Server")] + [DisplayName("Compression Algorithm")] + [Description("Compression algorithm")] + public string CompressionAlgorithm + { + get { return values["compression-algorithms"] is null ? string.Empty : values["compression-algorithms"].ToString(); } + set { SetValue("compression-algorithms", value); } + } + + + #endregion + + /// + /// Gets or sets a connection option. + /// + /// The keyword that identifies the connection option to modify. + public override object this[string keyword] + { + get + { + MySqlConnectionStringOption opt = GetOption(keyword); + if (opt.XGetter != null) + return opt.XGetter(this, opt); + else if (opt.Getter != null) + return opt.Getter(this, opt); + else + throw new ArgumentException(Resources.KeywordNotSupported, keyword); + } + set + { + MySqlConnectionStringOption opt = GetOption(keyword); + if (opt.XSetter != null) + opt.XSetter(this, opt, value); + else if (opt.Setter != null) + opt.Setter(this, opt, value); + else + throw new ArgumentException(Resources.KeywordNotSupported, keyword); + } + } + + public override void Clear() + { + base.Clear(); + lock (this) + { + foreach (var option in Options.Options) + if (option.DefaultValue != null) + values[option.Keyword] = option.DefaultValue; + else + values[option.Keyword] = null; + } + } + + public override bool ContainsKey(string keyword) + { + MySqlConnectionStringOption option = Options.Get(keyword); + return option != null; + } + + public override bool Equals(object obj) + { + var other = obj as MySqlXConnectionStringBuilder; + if (obj == null) + return false; + + if (this.values.Count != other.values.Count) return false; + + foreach (KeyValuePair kvp in this.values) + { + if (other.values.ContainsKey(kvp.Key)) + { + object v = other.values[kvp.Key]; + if (v == null && kvp.Value != null) return false; + if (kvp.Value == null && v != null) return false; + if (kvp.Value == null && v == null) return true; + if (!v.Equals(kvp.Value)) return false; + } + else + { + return false; + } + } + + return true; + } + + internal override MySqlConnectionStringOption GetOption(string key) + { + MySqlConnectionStringOption option = Options.Get(key); + if (option == null) + throw new ArgumentException(Resources.KeywordNotSupported, key); + else + return option; + } + + internal override void SetInternalValue(string keyword, object value) + { + MySqlConnectionStringOption option = GetOption(keyword); + option.ValidateValue(ref value, keyword, true); + + // remove all related keywords + option.Clean(this); + + if (value != null) + { + lock (this) + { + // set value for the given keyword + values[option.Keyword] = value; + base[keyword] = value; + } + } + } + + public override bool Remove(string keyword) + { + bool removed = false; + lock (this) { removed = base.Remove(keyword); } + if (!removed) return false; + MySqlConnectionStringOption option = GetOption(keyword); + lock (this) + { + values[option.Keyword] = option.DefaultValue; + } + return true; + } + + /// + /// Retrieves the value corresponding to the supplied key from this . + /// + /// The key of the item to retrieve. + /// The value corresponding to the . + /// if was found within the connection string; + /// otherwise, . + /// contains a null value. + public override bool TryGetValue(string keyword, out object value) + { + if (keyword == null) throw new ArgumentNullException(keyword); + + MySqlConnectionStringOption option = Options.Get(keyword); + + value = option == null ? null : this[keyword]; + return option != null; + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Relational/Column.cs b/MySQL.Data/src/X/XDevAPI/Relational/Column.cs new file mode 100644 index 000000000..d9a550478 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Relational/Column.cs @@ -0,0 +1,109 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using MySqlX.Protocol; +using MySqlX.Data; +using MySql.Data.MySqlClient; +using MySql.Data.MySqlClient.X.XDevAPI.Common; + +namespace MySqlX.XDevAPI.Relational +{ + /// + /// Represents a table column. + /// + public class Column + { + internal ValueDecoder _decoder; + internal UInt64 _collationNumber; + + /// + /// Gets the original column name. + /// + public string ColumnName { get; internal set; } + /// + /// Gets the alias of the column name. + /// + public string ColumnLabel { get; internal set; } + /// + /// Gets the table name the column orginates from. + /// + public string TableName { get; internal set; } + /// + /// Gets the alias of the table name . + /// + public string TableLabel { get; internal set; } + /// + /// Gets the schema name the column originates from. + /// + public string SchemaName { get; internal set; } + /// + /// Gets the catalog the schema originates from. + /// In MySQL protocol this is `def` by default. + /// + public string DatabaseName { get; internal set; } + /// + /// Gets the collation used for this column. + /// + public string CollationName { get; internal set; } + /// + /// Gets the character set used for this column. + /// + public string CharacterSetName { get; internal set; } + /// + /// Gets the column length. + /// + public UInt32 Length { get; internal set; } + /// + /// Gets the fractional decimal digits for floating point and fixed point numbers. + /// + public UInt32 FractionalDigits { get; internal set; } + /// + /// Gets the Mysql data type. + /// + public ColumnType Type { get; internal set; } + /// + /// Gets the .NET Clr data type. + /// + public Type ClrType { get; internal set; } + /// + /// True if it's a signed number. + /// + public bool IsNumberSigned { get; internal set; } + /// + /// True if column is UINT zerofill or BYTES rightpad. + /// + public bool IsPadded { get; internal set; } + + /// + /// Initializes a new instance of the Column class. + /// + public Column() + {} + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Relational/InternalRowResult.cs b/MySQL.Data/src/X/XDevAPI/Relational/InternalRowResult.cs new file mode 100644 index 000000000..fe66dcf40 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Relational/InternalRowResult.cs @@ -0,0 +1,140 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using MySqlX.XDevAPI.Common; +using MySqlX.Sessions; +using MySql.Data.MySqlClient; +using System.Collections.ObjectModel; +using System.Linq; + +namespace MySqlX.XDevAPI.Relational +{ + /// + /// Represents a resultset that contains rows of data. + /// + public class InternalRowResult : BufferingResult + { + internal InternalRowResult(InternalSession session) : base(session) + { + } + + /// + /// Gets the columns in this resultset. + /// +#if NET_45_OR_GREATER + public IReadOnlyList Columns +#else + public ReadOnlyCollection Columns +#endif + { + get { return _columns.AsReadOnly(); } + } + + /// + /// Gets the number of columns in this resultset. + /// + public Int32 ColumnCount + { + get { return _columns.Count; } + } + + /// + /// Gets a list containing the column names in this resultset. + /// + public List ColumnNames + { + get { return _columns.Select(o => o.ColumnLabel).ToList(); } + } + + /// + /// Gets the rows of this resultset. This collection will be incomplete unless all the rows have been read + /// either by using the Next method or the Buffer method. + /// +#if NET_45_OR_GREATER + public IReadOnlyList Rows +#else + public ReadOnlyCollection Rows +#endif + { + get { return _items.AsReadOnly(); } + } + + /// + /// Gets the value of the column value at the current index. + /// + /// The column index. + /// The CLR value at the column index. + public object this[int index] + { + get { return GetValue(index); } + } + + /// + /// Allows getting the value of the column value at the current index. + /// + /// The column index. + /// The CLR value at the column index. + private object GetValue(int index) + { + if (_position == _items.Count) + throw new InvalidOperationException("No data at position"); + return _items[_position][index]; + } + + /// + /// Returns the index of the given column name. + /// + /// The name of the column to find. + /// The numeric index of column. + public int IndexOf(string name) + { + if (!NameMap.ContainsKey(name)) + throw new MySqlException("Column not found '" + name + "'"); + return NameMap[name]; + } + + protected override Row ReadItem(bool dumping) + { + ///TODO: fix this + List values = Protocol.ReadRow(this); + if (values == null) return null; + if (dumping) return new Row(NameMap, null); + + Debug.Assert(values.Count == _columns.Count, "Value count does not equal column count"); + object[] clrValues = new object[values.Count]; + for (int i = 0; i < values.Count; i++) + clrValues[i] = Columns[i]._decoder.ClrValueDecoder(values[i]); + + Row row = new Row(NameMap, clrValues); + return row; + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Relational/Row.cs b/MySQL.Data/src/X/XDevAPI/Relational/Row.cs new file mode 100644 index 000000000..f54157d5b --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Relational/Row.cs @@ -0,0 +1,97 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySqlX; +using System; +using System.Collections.Generic; + +namespace MySqlX.XDevAPI.Relational +{ + /// + /// Represents a single row of data in a table. + /// + public class Row + { + private object[] _values; + private Dictionary _nameMap; + + internal Row(Dictionary nameMap, object[] values) + { + _values = values; + _nameMap = nameMap; + } + + /// + /// Gets the value of the row at the given index. + /// + /// The column index to retrieve the value. + /// The value at the index. + public object this[int index] + { + get { return GetValue(index); } + } + + /// + /// Gets the value of the column as a string. + /// + /// The name of the column. + /// The value of the column as a string. + public string GetString(string name) + { + return GetValue(name).ToString(); + } + + /// + /// Gets a string based indexer into the row. Returns the value as a CLR type. + /// + /// The column index to get. + /// The CLR value for the column. + public object this[string name] + { + get + { + return GetValue(name); + } + } + + private object GetValue(int index) + { + if (index < 0 || index >= _values.Length) + throw new IndexOutOfRangeException(String.Format(ResourcesX.InvalidRowIndex, index)); + return _values[index]; + } + + private object GetValue(string name) + { + if (!_nameMap.ContainsKey(name)) + throw new InvalidOperationException(String.Format(ResourcesX.InvalidNameIndex, name)); + return GetValue(_nameMap[name]); + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Relational/RowResult.cs b/MySQL.Data/src/X/XDevAPI/Relational/RowResult.cs new file mode 100644 index 000000000..968307fa1 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Relational/RowResult.cs @@ -0,0 +1,43 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySqlX.Sessions; + +namespace MySqlX.XDevAPI.Relational +{ + + /// + /// Inherits from . Creates a resultset that contains rows of data. + /// + public sealed class RowResult : InternalRowResult + { + internal RowResult(InternalSession session) : base(session) + { + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Relational/SqlResult.cs b/MySQL.Data/src/X/XDevAPI/Relational/SqlResult.cs new file mode 100644 index 000000000..2e29f1255 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Relational/SqlResult.cs @@ -0,0 +1,68 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using MySqlX.Sessions; + +namespace MySqlX.XDevAPI.Relational +{ + /// + /// Represents a resultset that contains rows of data for relational operations. + /// + public class SqlResult : InternalRowResult + { + internal SqlResult(InternalSession session) : base(session) + { + + } + + /// + /// Gets a boolean value indicating if this result has data. + /// + public bool HasData + { + get { return _hasData; } + } + + /// + /// Moves to next resultset. + /// + /// True if there is a new resultset, false otherwise. + public bool NextResult() + { + if (!_hasMoreResults) + return false; + _hasData = Protocol.HasData(this); + LoadColumnData(); + _isComplete = !_hasData; + _position = -1; + _items.Clear(); + return _hasData; + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Relational/SqlStatement.cs b/MySQL.Data/src/X/XDevAPI/Relational/SqlStatement.cs new file mode 100644 index 000000000..39b617ef9 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Relational/SqlStatement.cs @@ -0,0 +1,108 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI.Common; +using System; +using System.Collections.Generic; + +namespace MySqlX.XDevAPI.Relational +{ + /// + /// Represents a sql statement. + /// + public class SqlStatement : BaseStatement + { + /// + /// Initializes a new instance of the SqlStament class bassed on the session and sql statement. + /// + /// The session the Sql statement belongs to. + /// The Sql statement. + public SqlStatement(Session session, string sql) : base(session) + { + SQL = sql; + } + + /// + /// Gets the current Sql statement. + /// + public string SQL { get; private set; } + /// + /// Gets the list of parameters associated to this Sql statement. + /// + protected internal List parameters = new List(); + + /// + /// Executes the current Sql statement. + /// + /// A object with the resultset and execution status. + public override SqlResult Execute() + { + SqlResult result = null; + try + { + ValidateOpenSession(); + result = GetSQLResult(this); + } + catch (MySqlException ex) + { + switch (ex.Number) + { + case (int)CloseNotification.IDLE: + case (int)CloseNotification.KILLED: + case (int)CloseNotification.SHUTDOWN: + XDevAPI.Session.ThrowSessionClosedByServerException(ex, Session); + break; + default: + throw; + } + } + + return result; + } + + private SqlResult GetSQLResult(SqlStatement statement) + { + return Session.XSession.GetSQLResult(statement.SQL, parameters.ToArray()); + } + + /// + /// Binds the parameters values by position. + /// + /// The parameter values. + /// This set with the binded parameters. + public SqlStatement Bind(params object[] values) + { + if (values == null) + parameters.Add(null); + else + parameters.AddRange(values); + return this; + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Relational/Table.cs b/MySQL.Data/src/X/XDevAPI/Relational/Table.cs new file mode 100644 index 000000000..940ce10f0 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Relational/Table.cs @@ -0,0 +1,172 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI.Relational; + +namespace MySqlX.XDevAPI.Relational +{ + /// + /// Represents a server Table or View. + /// + public class Table : DatabaseObject + { + private bool? isView; + + /// + /// Gets a value indicating whether the object is + /// a View (True) or a Table (False). + /// + public bool IsView { + get + { + return CheckIsView(); + } + internal set + { + isView = value; + } + } + + private bool CheckIsView() + { + if (!isView.HasValue) + { + ValidateOpenSession(); + string type = Session.XSession.GetObjectType(Schema, Name).ToUpperInvariant(); + isView = (type == "VIEW"); + } + return isView.Value; + } + + internal Table(Schema schema, string name, bool isView) + : base(schema, name) + { + this.isView = isView; + } + + internal Table(Schema schema, string name) + : base(schema, name) + { + } + + internal Table() : base(null, null) { } + + /// + /// Creates a set with the columns to select. The table select + /// statement can be further modified before execution. This method is intended to select a set + /// of table rows. + /// + /// The optional column names to select. + /// A object for select chain operations. + public TableSelectStatement Select(params string[] columns) + { + return new TableSelectStatement(this, columns); + } + + /// + /// Creates a set with the fileds to insert to. The table + /// insert statement can be further modified before exeuction. This method is intended to + /// insert one or multiple rows into a table. + /// + /// The list of fields to insert. + /// A object for insert chain operations. + public TableInsertStatement Insert(params string[] fields) + { + return new TableInsertStatement(this, fields); + } + + /// + /// Creates a . This method is intended to update table rows + /// values. + /// + /// A object for update chain operations. + public TableUpdateStatement Update() + { + return new TableUpdateStatement(this); + } + + /// + /// Creates a . This method is intended to delete rows from a + /// table. + /// + /// A object for delete chain operations. + public TableDeleteStatement Delete() + { + return new TableDeleteStatement(this, null); + } + + /// + /// Returns the number of rows in the table on the server. + /// + /// The number of rows. + public long Count() + { + long result=0; + try + { + ValidateOpenSession(); + result = Session.XSession.TableCount(Schema, Name, "Table"); + } + catch (MySqlException ex) + { + switch (ex.Number) + { + case (int)CloseNotification.IDLE: + case (int)CloseNotification.KILLED: + case (int)CloseNotification.SHUTDOWN: + XDevAPI.Session.ThrowSessionClosedByServerException(ex, Session); + break; + default: + throw; + } + } + return result; + } + + /// + /// Verifies if the table exists in the database. + /// + /// true if the table exists; otherwise, false. + public override bool ExistsInDatabase() + { + bool result = false; + try + { + ValidateOpenSession(); + return Session.XSession.TableExists(Schema, Name); + } + catch (MySqlException e) + { + XDevAPI.Session.ThrowSessionClosedByServerException(e, Session); + } + return result; + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Relational/TableDeleteStatement.cs b/MySQL.Data/src/X/XDevAPI/Relational/TableDeleteStatement.cs new file mode 100644 index 000000000..bbfaef2cb --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Relational/TableDeleteStatement.cs @@ -0,0 +1,66 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySqlX.XDevAPI.Common; +using System; + +namespace MySqlX.XDevAPI.Relational +{ + /// + /// Represents a chaining table delete statement. + /// + public class TableDeleteStatement : FilterableStatement + { + internal TableDeleteStatement(Table table, string condition) : base(table, condition) + { + FilterData.IsRelational = true; + } + + /// + /// Sets user-defined sorting criteria for the operation. The strings use normal SQL syntax like + /// "order ASC" or "pages DESC, age ASC". + /// + /// The order criteria. + /// A generic object representing the implementing statement type. + public TableDeleteStatement OrderBy(params string[] order) + { + FilterData.OrderBy = order; + SetChanged(); + return this; + } + + /// + /// Executes the delete statement. + /// + /// A object containing the results of the delete execution. + public override Result Execute() + { + return Execute(Target.Session.XSession.DeleteRows, this); + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Relational/TableInsertStatement.cs b/MySQL.Data/src/X/XDevAPI/Relational/TableInsertStatement.cs new file mode 100644 index 000000000..bfd63743d --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Relational/TableInsertStatement.cs @@ -0,0 +1,71 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySqlX.XDevAPI.Common; +using System; +using System.Collections.Generic; + +namespace MySqlX.XDevAPI.Relational +{ + /// + /// Represents a chaining table insert statement. + /// + public class TableInsertStatement : TargetedBaseStatement + { + internal string[] fields; + internal List values = new List(); + internal object[] parameters; + + internal TableInsertStatement(Table table, string[] fields) : base(table) + { + this.fields = fields; + } + + /// + /// Executes the insert statement. + /// + /// A object containing the results of the insert statement. + public override Result Execute() + { + ValidateOpenSession(); + return Target.Session.XSession.InsertRows(this); + } + + /// + /// Values to be inserted. + /// Multiple rows supported. + /// + /// The values to be inserted. + /// This same object. + public TableInsertStatement Values(params object[] values) + { + this.values.Add(values); + return this; + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Relational/TableSelectStatement.cs b/MySQL.Data/src/X/XDevAPI/Relational/TableSelectStatement.cs new file mode 100644 index 000000000..eabf3e900 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Relational/TableSelectStatement.cs @@ -0,0 +1,141 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI.Common; +using MySqlX.XDevAPI.CRUD; +using System; +using System.Collections.Generic; + +namespace MySqlX.XDevAPI.Relational +{ + /// + /// Represents a chaining table select statement. + /// + public class TableSelectStatement : FilterableStatement + { + internal FindParams findParams = new FindParams(); + + internal TableSelectStatement(Table t, params string[] projection) : base(t) + { + findParams.Projection = projection; + FilterData.IsRelational = true; + } + + /// + /// Executes the select statement. + /// + /// A object containing the results of the execution and data. + public override RowResult Execute() + { + return Execute(Target.Session.XSession.FindRows, this); + } + + /// + /// Locks matching rows against updates. + /// + /// Optional row lock option to use. + /// This same object set with lock shared option. + /// The server version is lower than 8.0.3. + public TableSelectStatement LockShared(LockContention lockOption = LockContention.Default) + { + if (!this.Session.InternalSession.GetServerVersion().isAtLeast(8, 0, 3)) + throw new MySqlException(string.Format(ResourcesX.FunctionalityNotSupported, "8.0.3")); + + findParams.Locking = Protocol.X.RowLock.SharedLock; + findParams.LockingOption = lockOption; + SetChanged(); + return this; + } + + /// + /// Locks matching rows so no other transaction can read or write to it. + /// + /// Optional row lock option to use. + /// This same object set with the lock exclusive option. + /// The server version is lower than 8.0.3. + public TableSelectStatement LockExclusive(LockContention lockOption = LockContention.Default) + { + if (!this.Session.InternalSession.GetServerVersion().isAtLeast(8, 0, 3)) + throw new MySqlException(string.Format(ResourcesX.FunctionalityNotSupported, "8.0.3")); + + findParams.Locking = Protocol.X.RowLock.ExclusiveLock; + findParams.LockingOption = lockOption; + SetChanged(); + return this; + } + + /// + /// Sets the table aggregation. + /// + /// The column list for aggregation. + /// This same object set with the specified group-by criteria. + public TableSelectStatement GroupBy(params string[] groupBy) + { + if (groupBy == null) + return this; + + var groupByList = new List(); + foreach (var item in groupBy) + { + if (item != null) + groupByList.Add(item); + } + + findParams.GroupBy = groupByList.Count > 0 ? groupByList.ToArray() : null; + SetChanged(); + return this; + } + + /// + /// Filters criteria for aggregated groups. + /// + /// The filter criteria for aggregated groups. + /// This same object set with the specified filter criteria. + public TableSelectStatement Having(string having) + { + findParams.GroupByCritieria = having; + SetChanged(); + return this; + } + + /// + /// Sets user-defined sorting criteria for the operation. The strings use normal SQL syntax like + /// "order ASC" or "pages DESC, age ASC". + /// + /// The order criteria. + /// A generic object that represents the implementing statement type. + public TableSelectStatement OrderBy(params string[] order) + { + FilterData.OrderBy = order; + SetChanged(); + return this; + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Relational/TableUpdateStatement.cs b/MySQL.Data/src/X/XDevAPI/Relational/TableUpdateStatement.cs new file mode 100644 index 000000000..f4aa6ecd1 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Relational/TableUpdateStatement.cs @@ -0,0 +1,84 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySqlX.XDevAPI.Common; +using MySqlX.XDevAPI.CRUD; +using System; +using System.Collections.Generic; + +namespace MySqlX.XDevAPI.Relational +{ + /// + /// Represents a chaining table update statement. + /// + public class TableUpdateStatement : FilterableStatement + { + internal List updates = new List(); + + internal TableUpdateStatement(Table table) : base(table) + { + FilterData.IsRelational = true; + FilterData.Parameters = new Dictionary(); + } + + /// + /// Executes the update statement. + /// + /// A object ocntaining the results of the update statement execution. + public override Result Execute() + { + return Execute(Target.Session.XSession.UpdateRows, this); + } + + /// + /// Column and value to be updated. + /// + /// Column name. + /// Value to be updated. + /// This same object. + public TableUpdateStatement Set(string tableField, object value) + { + updates.Add(new UpdateSpec(Mysqlx.Crud.UpdateOperation.Types.UpdateType.Set, tableField).SetValue(value)); + SetChanged(); + return this; + } + + /// + /// Sets user-defined sorting criteria for the operation. The strings use normal SQL syntax like + /// "order ASC" or "pages DESC, age ASC". + /// + /// The order criteria. + /// A generic object that represents the implementing statement type. + public TableUpdateStatement OrderBy(params string[] order) + { + FilterData.OrderBy = order; + SetChanged(); + return this; + } + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Schema.cs b/MySQL.Data/src/X/XDevAPI/Schema.cs new file mode 100644 index 000000000..a09f782a3 --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Schema.cs @@ -0,0 +1,349 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI.Common; +using MySqlX.XDevAPI.Relational; +using System; +using System.Collections.Generic; + +namespace MySqlX.XDevAPI +{ + /// + /// Represents a schema or database. + /// + public class Schema : DatabaseObject + { + internal Schema(BaseSession session, string name) : base(null, name) + { + Schema = this; + Session = session; + } + + /// + /// Session related to current schema. + /// + public new BaseSession Session { get; private set; } + + + #region Browse Functions + + /// + /// Returns a list of all collections in this schema. + /// + /// A list representing all found collections. + public List GetCollections() + { + List result = null; + try + { + ValidateOpenSession(); + result = Session.XSession.GetObjectList(this, "COLLECTION"); + } + catch (MySqlException ex) + { + switch (ex.Number) + { + case (int)CloseNotification.IDLE: + case (int)CloseNotification.KILLED: + case (int)CloseNotification.SHUTDOWN: + XDevAPI.Session.ThrowSessionClosedByServerException(ex, Session); + break; + default: + throw; + } + } + return result; + } + + /// + /// Returns a list of all tables in this schema. + /// + /// A list representing all found tables. + public List
GetTables() + { + List
result = null; + try + { + ValidateOpenSession(); + result = Session.XSession.GetObjectList
(this, "TABLE", "VIEW"); + } + catch (MySqlException ex) + { + switch (ex.Number) + { + case (int)CloseNotification.IDLE: + case (int)CloseNotification.KILLED: + case (int)CloseNotification.SHUTDOWN: + XDevAPI.Session.ThrowSessionClosedByServerException(ex, Session); + break; + default: + throw; + } + } + return result; + } + + #endregion + + #region Instance Functions + + /// + /// Gets a collection by name. + /// + /// The name of the collection to get. + /// Ensures the collection exists in the schema. + /// A object matching the given name. + public Collection GetCollection(string name, bool ValidateExistence = false) + { + Collection c = new Collection(this, name); + if (ValidateExistence) + { + ValidateOpenSession(); + if (!c.ExistsInDatabase()) + throw new MySqlException(String.Format("Collection '{0}' does not exist.", name)); + } + return c; + } + + /// + /// Gets a typed collection object. This is useful for using domain objects. + /// + /// The name of collection to get. + /// Ensures the collection exists in the schema. + /// A generic object set with the given name. + public Collection GetCollection(string name, bool ValidateExistence = false) + { + Collection c = new Collection(this, name); + + if (ValidateExistence) + { + ValidateOpenSession(); + if (!c.ExistsInDatabase()) + throw new MySqlException(String.Format("Collection '{0}' does not exist.", name)); + } + return c; + } + + /// + /// Gets the given collection as a table. + /// + /// The name of the collection. + /// A object set with the given name. + public Table GetCollectionAsTable(string name) + { + return GetTable(name); + } + + /// + /// Gets a table object. Upon return the object may or may not be valid. + /// + /// The name of the table object. + /// A object set with the given name. + public Table GetTable(string name) + { + return new Table(this, name); + } + + #endregion + + #region Create Functions + + /// + /// Creates a . + /// + /// The name of the collection to create. + /// If false, throws an exception if the collection exists. + /// Collection referente. + public Collection CreateCollection(string collectionName, bool ReuseExisting = false) + { + ValidateOpenSession(); + Collection coll = new Collection(this, collectionName); + try + { + if (Session.Version.isAtLeast(8, 0, 19)) + { + CreateCollectionOptions options = new CreateCollectionOptions() { ReuseExisting = ReuseExisting }; + Session.XSession.CreateCollection(Name, collectionName, options); + } + else + { + Session.XSession.CreateCollection(Name, collectionName); + } + } + catch (MySqlException ex) when (ex.Number == (int)CloseNotification.IDLE || ex.Number == (int)CloseNotification.KILLED || ex.Number == (int)CloseNotification.SHUTDOWN) + { + XDevAPI.Session.ThrowSessionClosedByServerException(ex, Session); + } + catch (MySqlException ex) when (ex.Code == 1050) + { + if (ReuseExisting) + return coll; + throw; + } + return new Collection(this, collectionName); + } + + /// + /// Creates a including a schema validation. + /// + /// The name of the collection to create. + /// This object hold the parameters required to create the collection. + /// + /// Collection referente. + public Collection CreateCollection(string collectionName, CreateCollectionOptions options) + { + ValidateOpenSession(); + Collection coll = null; + + try + { + coll = new Collection(this, collectionName); + Session.XSession.CreateCollection(Name, collectionName, options); + } + catch (MySqlException ex) when (ex.Number == (int)CloseNotification.IDLE || ex.Number == (int)CloseNotification.KILLED || ex.Number == (int)CloseNotification.SHUTDOWN) + { + XDevAPI.Session.ThrowSessionClosedByServerException(ex, Session); + } + catch (MySqlException ex_1) when (ex_1.Code == 5015) + { + var msg = string.Format("{0}{1}{2}", ex_1.Message, ", ", ResourcesX.SchemaCreateCollectionMsg); + throw new MySqlException(msg); + } + catch (MySqlException ex) when (ex.Code == 1050) + { + if (options.ReuseExisting) + return coll; + throw; + } + catch (MySqlException) + { + throw; + } + return coll; + } + + /// + /// Modify a collection adding or removing schema validation parameters. + /// + /// The name of the collection to create. + /// This object encapsulate the Validation parameters level and schema. + /// Collection referente. + public Collection ModifyCollection(string collectionName, ModifyCollectionOptions? options) + { + ValidateOpenSession(); + Collection result = null; + try + { + Session.XSession.ModifyCollection(Name, collectionName, options); + result = new Collection(this, collectionName); + } + catch (MySqlException ex) when (ex.Number == (int)CloseNotification.IDLE || ex.Number == (int)CloseNotification.KILLED || ex.Number == (int)CloseNotification.SHUTDOWN) + { + XDevAPI.Session.ThrowSessionClosedByServerException(ex, Session); + } + catch (MySqlException ex_1) when (ex_1.Code == 5157) + { + var msg = string.Format("{0}{1}{2}", ex_1.Message, ", ", ResourcesX.SchemaCreateCollectionMsg); + throw new MySqlException(msg); + } + catch (MySqlException) + { + throw; + } + return result; + } + + #endregion + + /// + /// Drops the given collection. + /// + /// The name of the collection to drop. + /// is null. + public void DropCollection(string name) + { + if (string.IsNullOrWhiteSpace(name)) throw new ArgumentNullException(nameof(name)); + try + { + ValidateOpenSession(); + Collection c = GetCollection(name); + if (!c.ExistsInDatabase()) return; + Session.XSession.DropCollection(Name, name); + } + catch (MySqlException ex) + { + switch (ex.Number) + { + case (int)CloseNotification.IDLE: + case (int)CloseNotification.KILLED: + case (int)CloseNotification.SHUTDOWN: + XDevAPI.Session.ThrowSessionClosedByServerException(ex, Session); + break; + default: + throw; + } + } + } + + #region Base Class + + /// + /// Determines if this schema actually exists. + /// + /// True if exists, false otherwise. + public override bool ExistsInDatabase() + { + bool result = false; + try + { + ValidateOpenSession(); + string sql = String.Format("SELECT COUNT(*) FROM information_schema.schemata WHERE schema_name like '{0}'", Name); + long count = (long)Session.InternalSession.ExecuteQueryAsScalar(sql); + result = count > 0; + } + catch (MySqlException ex) + { + switch (ex.Number) + { + case (int)CloseNotification.IDLE: + case (int)CloseNotification.KILLED: + case (int)CloseNotification.SHUTDOWN: + XDevAPI.Session.ThrowSessionClosedByServerException(ex, Session); + break; + default: + throw; + } + } + return result; + } + + #endregion + } +} diff --git a/MySQL.Data/src/X/XDevAPI/Session.cs b/MySQL.Data/src/X/XDevAPI/Session.cs new file mode 100644 index 000000000..784f2c9ad --- /dev/null +++ b/MySQL.Data/src/X/XDevAPI/Session.cs @@ -0,0 +1,104 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +using System; +using System.Linq; +using MySql.Data; +using MySql.Data.MySqlClient; +using MySqlX.Sessions; +using MySqlX.XDevAPI.Relational; + +namespace MySqlX.XDevAPI +{ + /// + /// Represents a single server session. + /// + public class Session : BaseSession + { + internal Session(string connectionString, Client client = null) + : base(connectionString, client) + { + } + + internal Session(object connectionData, Client client = null) + : base(connectionData, client) + { + } + + internal Session(InternalSession internalSession, Client client) + : base(internalSession, client) + { + } + + /// + /// Returns a object that can be used to execute the given SQL. + /// + /// The SQL to execute. + /// A object set with the provided SQL. + public SqlStatement SQL(string sql) + { + if (InternalSession.SessionState != SessionState.Open) + throw new MySqlException(ResourcesX.InvalidSession); + return new SqlStatement(this, sql); + } + + /// + /// Sets the schema in the database. + /// + /// The schema name to be set. + public void SetCurrentSchema(string schema) + { + InternalSession.ExecuteSqlNonQuery($"USE `{schema}`"); + GetSchema(schema); + } + + /// + /// Executes a query in the database to get the current schema. + /// + /// Current database object or null if no schema is selected. + public Schema GetCurrentSchema() + { + string schemaName = (string)InternalSession.ExecuteQueryAsScalar("SELECT DATABASE()"); + return schemaName == null ? null : GetSchema(schemaName); + } + + /// + /// Closes the current session properly after it was closed by the server. + /// + internal static void ThrowSessionClosedByServerException(MySqlException ex, BaseSession session) + { + var closeCodes = ((CloseNotification[])Enum.GetValues(typeof(CloseNotification))).Select(c => (uint)c).ToList(); + if (closeCodes.Contains((uint)ex.Number)) + { + session.Close(); + throw ex; + } + } + } +} diff --git a/MySQL.Data/src/common/Cache.cs b/MySQL.Data/src/common/Cache.cs new file mode 100644 index 000000000..3535ece0c --- /dev/null +++ b/MySQL.Data/src/common/Cache.cs @@ -0,0 +1,83 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Collections.Generic; + +namespace MySql.Data.Common +{ + internal class Cache + { + private readonly int _capacity; + private readonly Queue _keyQ; + private readonly Dictionary _contents; + + public Cache(int initialCapacity, int capacity) + { + _capacity = capacity; + _contents = new Dictionary(initialCapacity); + + if (capacity > 0) + _keyQ = new Queue(initialCapacity); + } + + public TValueType this[TKeyType key] + { + get + { + TValueType val; + if (_contents.TryGetValue(key, out val)) + return val; + else + return default(TValueType); + } + set { InternalAdd(key, value); } + } + + public void Add(TKeyType key, TValueType value) + { + InternalAdd(key, value); + } + + private void InternalAdd(TKeyType key, TValueType value) + { + if (!_contents.ContainsKey(key)) + { + + if (_capacity > 0) + { + _keyQ.Enqueue(key); + + if (_keyQ.Count > _capacity) + _contents.Remove(_keyQ.Dequeue()); + } + } + + _contents[key] = value; + } + } +} diff --git a/Source/MySql.Data/common/ContextString.cs b/MySQL.Data/src/common/ContextString.cs similarity index 78% rename from Source/MySql.Data/common/ContextString.cs rename to MySQL.Data/src/common/ContextString.cs index 46c85d036..1108dc87b 100644 --- a/Source/MySql.Data/common/ContextString.cs +++ b/MySQL.Data/src/common/ContextString.cs @@ -1,165 +1,171 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections; -using System.Text; - -namespace MySql.Data.Common -{ - internal class ContextString - { - readonly bool _escapeBackslash; - - // Create a private ctor so the compiler doesn't give us a default one - public ContextString(string contextMarkers, bool escapeBackslash) - { - ContextMarkers = contextMarkers; - _escapeBackslash = escapeBackslash; - } - - public string ContextMarkers { get; set; } - - public int IndexOf(string src, string target) - { - return IndexOf(src, target, 0); - } - - public int IndexOf(string src, string target, int startIndex) - { - int index = src.IndexOf(target, startIndex); - while (index != -1) - { - if (!IndexInQuotes(src, index, startIndex)) break; - index = src.IndexOf(target, index + 1); - } - return index; - } - - private bool IndexInQuotes(string src, int index, int startIndex) - { - char contextMarker = Char.MinValue; - bool escaped = false; - - for (int i = startIndex; i < index; i++) - { - char c = src[i]; - - int contextIndex = ContextMarkers.IndexOf(c); - - // if we have found the closing marker for our open marker, then close the context - if (contextIndex > -1 && contextMarker == ContextMarkers[contextIndex] && !escaped) - contextMarker = Char.MinValue; - - // if we have found a context marker and we are not in a context yet, then start one - else if (contextMarker == Char.MinValue && contextIndex > -1 && !escaped) - contextMarker = c; - - else if (c == '\\' && _escapeBackslash) - escaped = !escaped; - } - return contextMarker != Char.MinValue || escaped; - } - - public int IndexOf(string src, char target) - { - char contextMarker = Char.MinValue; - bool escaped = false; - int pos = 0; - - foreach (char c in src) - { - int contextIndex = ContextMarkers.IndexOf(c); - - // if we have found the closing marker for our open marker, then close the context - if (contextIndex > -1 && contextMarker == ContextMarkers[contextIndex] && !escaped) - contextMarker = Char.MinValue; - - // if we have found a context marker and we are not in a context yet, then start one - else if (contextMarker == Char.MinValue && contextIndex > -1 && !escaped) - contextMarker = c; - - else if (contextMarker == Char.MinValue && c == target) - return pos; - else if (c == '\\' && _escapeBackslash) - escaped = !escaped; - pos++; - } - return -1; - } - - public string[] Split(string src, string delimiters) - { - ArrayList parts = new ArrayList(); - StringBuilder sb = new StringBuilder(); - bool escaped = false; - - char contextMarker = Char.MinValue; - - foreach (char c in src) - { - if (delimiters.IndexOf(c) != -1 && !escaped) - { - if (contextMarker != Char.MinValue) - sb.Append(c); - else - { - if (sb.Length <= 0) continue; - parts.Add(sb.ToString()); - sb.Remove(0, sb.Length); - } - } - else if (c == '\\' && _escapeBackslash) - escaped = !escaped; - else - { - int contextIndex = ContextMarkers.IndexOf(c); - if (!escaped && contextIndex != -1) - { - // if we have found the closing marker for our open - // marker, then close the context - if ((contextIndex % 2) == 1) - { - if (contextMarker == ContextMarkers[contextIndex - 1]) - contextMarker = Char.MinValue; - } - else - { - // if the opening and closing context markers are - // the same then we will always find the opening - // marker. - if (contextMarker == ContextMarkers[contextIndex + 1]) - contextMarker = Char.MinValue; - else if (contextMarker == Char.MinValue) - contextMarker = c; - } - } - - sb.Append(c); - } - } - if (sb.Length > 0) - parts.Add(sb.ToString()); - return (string[])parts.ToArray(typeof(string)); - } - } -} +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections; +using System.Text; + +namespace MySql.Data.Common +{ + internal class ContextString + { + readonly bool _escapeBackslash; + + // Create a private ctor so the compiler doesn't give us a default one + public ContextString(string contextMarkers, bool escapeBackslash) + { + ContextMarkers = contextMarkers; + _escapeBackslash = escapeBackslash; + } + + public string ContextMarkers { get; set; } + + public int IndexOf(string src, string target) + { + return IndexOf(src, target, 0); + } + + public int IndexOf(string src, string target, int startIndex) + { + int index = src.IndexOf(target, startIndex); + while (index != -1) + { + if (!IndexInQuotes(src, index, startIndex)) break; + index = src.IndexOf(target, index + 1); + } + return index; + } + + private bool IndexInQuotes(string src, int index, int startIndex) + { + char contextMarker = Char.MinValue; + bool escaped = false; + + for (int i = startIndex; i < index; i++) + { + char c = src[i]; + + int contextIndex = ContextMarkers.IndexOf(c); + + // if we have found the closing marker for our open marker, then close the context + if (contextIndex > -1 && contextMarker == ContextMarkers[contextIndex] && !escaped) + contextMarker = Char.MinValue; + + // if we have found a context marker and we are not in a context yet, then start one + else if (contextMarker == Char.MinValue && contextIndex > -1 && !escaped) + contextMarker = c; + + else if (c == '\\' && _escapeBackslash) + escaped = !escaped; + } + return contextMarker != Char.MinValue || escaped; + } + + public int IndexOf(string src, char target) + { + char contextMarker = Char.MinValue; + bool escaped = false; + int pos = 0; + + foreach (char c in src) + { + int contextIndex = ContextMarkers.IndexOf(c); + + // if we have found the closing marker for our open marker, then close the context + if (contextIndex > -1 && contextMarker == ContextMarkers[contextIndex] && !escaped) + contextMarker = Char.MinValue; + + // if we have found a context marker and we are not in a context yet, then start one + else if (contextMarker == Char.MinValue && contextIndex > -1 && !escaped) + contextMarker = c; + + else if (contextMarker == Char.MinValue && c == target) + return pos; + else if (c == '\\' && _escapeBackslash) + escaped = !escaped; + pos++; + } + return -1; + } + + public string[] Split(string src, string delimiters) + { + ArrayList parts = new ArrayList(); + StringBuilder sb = new StringBuilder(); + bool escaped = false; + + char contextMarker = Char.MinValue; + + foreach (char c in src) + { + if (delimiters.IndexOf(c) != -1 && !escaped) + { + if (contextMarker != Char.MinValue) + sb.Append(c); + else + { + if (sb.Length <= 0) continue; + parts.Add(sb.ToString()); + sb.Remove(0, sb.Length); + } + } + else if (c == '\\' && _escapeBackslash) + escaped = !escaped; + else + { + int contextIndex = ContextMarkers.IndexOf(c); + if (!escaped && contextIndex != -1) + { + // if we have found the closing marker for our open + // marker, then close the context + if ((contextIndex % 2) == 1) + { + if (contextMarker == ContextMarkers[contextIndex - 1]) + contextMarker = Char.MinValue; + } + else + { + // if the opening and closing context markers are + // the same then we will always find the opening + // marker. + if (contextMarker == ContextMarkers[contextIndex + 1]) + contextMarker = Char.MinValue; + else if (contextMarker == Char.MinValue) + contextMarker = c; + } + } + + sb.Append(c); + } + } + if (sb.Length > 0) + parts.Add(sb.ToString()); + return (string[])parts.ToArray(typeof(string)); + } + } +} diff --git a/MySQL.Data/src/common/Dns/DnsEnums.cs b/MySQL.Data/src/common/Dns/DnsEnums.cs new file mode 100644 index 000000000..0291bda64 --- /dev/null +++ b/MySQL.Data/src/common/Dns/DnsEnums.cs @@ -0,0 +1,97 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySql.Data.Common.DnsClient +{ + /// + /// DNS record type. + /// + internal enum RecordType + { + SRV = 33 + } + + // RFC 1035 (https://tools.ietf.org/html/rfc1035#section-3.2.4) + // 3.2.4. CLASS values + + /// + /// CLASS fields appear in resource records. + /// + internal enum QueryClass + { + /// + /// The Internet. + /// + IN = 1 + } + + // RFC 1035 (https://tools.ietf.org/html/rfc1035#section-3.2.3) + + /// + /// DNS question type. + /// QueryType are a superset of RecordType. + /// + internal enum QueryType + { + /// + /// A resource record which specifies the location of the server(s) for a specific protocol and domain. + /// + /// RFC 2782 + /// + SRV = RecordType.SRV + } + + /// + /// DNS Record OpCode. + /// A four bit field that specifies kind of query in this message. + /// This value is set by the originator of a query and copied into the response. + /// + internal enum OPCode + { + /// + /// A standard query (QUERY). + /// + Query = 0, + /// + /// Retired IQUERY code. + /// + IQUERY = 1, + /// + /// A server status request (STATUS). + /// + Status = 2, + /// + /// Notify OpCode. + /// + Notify = 4, + /// + /// Update OpCode. + /// + Update = 5 + } +} diff --git a/MySQL.Data/src/common/Dns/DnsQuestion.cs b/MySQL.Data/src/common/Dns/DnsQuestion.cs new file mode 100644 index 000000000..89861c146 --- /dev/null +++ b/MySQL.Data/src/common/Dns/DnsQuestion.cs @@ -0,0 +1,162 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Net; +using System.Text; + +namespace MySql.Data.Common.DnsClient +{ + #region Rfc 1034/1035 + /* + 4.1.2. Question section format + + The question section is used to carry the "question" in most queries, + i.e., the parameters that define what is being asked. The section + contains QDCOUNT (usually 1) entries, each of the following format: + + 1 1 1 1 1 1 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | | + / QNAME / + / / + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | QTYPE | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | QCLASS | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + + where: + + QNAME a domain name represented as a sequence of labels, where + each label consists of a length octet followed by that + number of octets. The domain name terminates with the + zero length octet for the null label of the root. Note + that this field may be an odd number of octets; no + padding is used. + + QTYPE a two octet code which specifies the type of the query. + The values for this field include all codes valid for a + TYPE field, together with some more general codes which + can match more than one type of RR. + + + QCLASS a two octet code that specifies the class of the query. + For example, the QCLASS field is IN for the Internet. + */ + #endregion + + /// + /// The class transports information of the lookup query performed. + /// + internal class DnsQuestion + { + /// + /// Gets the domain name + /// + internal string DomainName { get; } + + /// + /// Gets the type of the question. + /// + internal QueryType QuestionType { get; } + + /// + /// Gets the question class. + /// + internal QueryClass QuestionClass { get; } + + /// + /// Initializes a new instance of the class. + /// + /// Domain name. + /// Type of the question. + /// The question class. + internal DnsQuestion(string domainName, QueryType questionType = QueryType.SRV, QueryClass questionClass = QueryClass.IN) + { + if (string.IsNullOrWhiteSpace(domainName)) throw new ArgumentNullException(nameof(domainName)); + if (!domainName.EndsWith(".", StringComparison.InvariantCulture)) domainName += "."; + + DomainName = domainName; + QuestionType = questionType; + QuestionClass = questionClass; + } + + /// + /// Initializes a new instance of the class. + /// + /// of the record. + internal DnsQuestion(DnsRecordReader reader) + { + DomainName = reader.ReadDomainName(); + QuestionType = (QueryType)reader.ReadUInt16(); + QuestionClass = (QueryClass)reader.ReadUInt16(); + } + + /// + /// Gets the bytes in this collection. + /// + internal byte[] GetData() + { + List data = new List(); + data.AddRange(WriteName(DomainName)); + data.AddRange(WriteShort((ushort)QuestionType)); + data.AddRange(WriteShort((ushort)QuestionClass)); + return data.ToArray(); + } + + private static byte[] WriteName(string src) + { + if (src == ".") + return new byte[1]; + + StringBuilder sb = new StringBuilder(); + sb.Append('\0'); + + for (int i = 0, j = 0; i < src.Length; i++, j++) + { + sb.Append(src[i]); + if (src[i] == '.') + { + sb[i - j] = (char)(j & 0xff); + j = -1; + } + } + + sb[sb.Length - 1] = '\0'; + return Encoding.ASCII.GetBytes(sb.ToString()); + } + + private static byte[] WriteShort(ushort sValue) + { + return BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)sValue)); + } + } +} diff --git a/MySQL.Data/src/common/Dns/DnsRecordHeader.cs b/MySQL.Data/src/common/Dns/DnsRecordHeader.cs new file mode 100644 index 000000000..8db53aa42 --- /dev/null +++ b/MySQL.Data/src/common/Dns/DnsRecordHeader.cs @@ -0,0 +1,263 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Net; + +namespace MySql.Data.Common.DnsClient +{ + internal class DnsRecordHeader + { + #region RFC specification + /* + 4.1.1. Header section format + + The header contains the following fields: + + 1 1 1 1 1 1 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | ID | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + |QR| Opcode |AA|TC|RD|RA| Z | RCODE | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | QDCOUNT | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | ANCOUNT | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | NSCOUNT | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | ARCOUNT | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + + where: + + ID A 16 bit identifier assigned by the program that + generates any kind of query. This identifier is copied + the corresponding reply and can be used by the requester + to match up replies to outstanding queries. + + QR A one bit field that specifies whether this message is a + query (0), or a response (1). + + OPCODE A four bit field that specifies kind of query in this + message. This value is set by the originator of a query + and copied into the response. The values are: + + 0 a standard query (QUERY) + + 1 an inverse query (IQUERY) + + 2 a server status request (STATUS) + + 3-15 reserved for future use + + AA Authoritative Answer - this bit is valid in responses, + and specifies that the responding name server is an + authority for the domain name in question section. + + Note that the contents of the answer section may have + multiple owner names because of aliases. The AA bit + corresponds to the name which matches the query name, or + the first owner name in the answer section. + + TC TrunCation - specifies that this message was truncated + due to length greater than that permitted on the + transmission channel. + + RD Recursion Desired - this bit may be set in a query and + is copied into the response. If RD is set, it directs + the name server to pursue the query recursively. + Recursive query support is optional. + + RA Recursion Available - this be is set or cleared in a + response, and denotes whether recursive query support is + available in the name server. + + Z Reserved for future use. Must be zero in all queries + and responses. + + RCODE Response code - this 4 bit field is set as part of + responses. The values have the following + interpretation: + + 0 No error condition + + 1 Format error - The name server was + unable to interpret the query. + + 2 Server failure - The name server was + unable to process this query due to a + problem with the name server. + + 3 Name Error - Meaningful only for + responses from an authoritative name + server, this code signifies that the + domain name referenced in the query does + not exist. + + 4 Not Implemented - The name server does + not support the requested kind of query. + + 5 Refused - The name server refuses to + perform the specified operation for + policy reasons. For example, a name + server may not wish to provide the + information to the particular requester, + or a name server may not wish to perform + a particular operation (e.g., zone + transfer) for particular data. + + 6-15 Reserved for future use. + + QDCOUNT an unsigned 16 bit integer specifying the number of + entries in the question section. + + ANCOUNT an unsigned 16 bit integer specifying the number of + resource records in the answer section. + + NSCOUNT an unsigned 16 bit integer specifying the number of name + server resource records in the authority records + section. + + ARCOUNT an unsigned 16 bit integer specifying the number of + resource records in the additional records section. + + */ + #endregion + + // internal flag + private ushort _flags; + + /// + /// Gets or sets the unique identifier of the record. + /// + internal ushort Id { get; set; } + + /// + /// Gets or sets the number of questions in the record. + /// + internal ushort QuestionCount { get; set; } + + /// + /// Gets or sets the number of answers in the record. + /// + internal ushort AnswerCount { get; set; } + + /// + /// Gets or sets the number of name servers in the record. + /// + internal ushort NameserverCount { get; set; } + + /// + /// Gets or sets the number of additional records in the record. + /// + internal ushort AdditionalRecordsCount { get; set; } + + /// + /// Specifies kind of query. + /// + internal OPCode OperationCode + { + get { return (OPCode)GetBits(_flags, 11, 4); } + set { _flags = SetBits(_flags, 11, 4, (ushort)value); } + } + + /// + /// Recursion Desired + /// + internal bool RecursionDesired + { + get + { return GetBits(_flags, 8, 1) == 1; } + set { _flags = SetBits(_flags, 8, 1, value); } + } + + internal DnsRecordHeader() + { + } + + internal DnsRecordHeader(DnsRecordReader recordReader) + { + Id = recordReader.ReadUInt16(); + _flags = recordReader.ReadUInt16(); + QuestionCount = recordReader.ReadUInt16(); + AnswerCount = recordReader.ReadUInt16(); + NameserverCount = recordReader.ReadUInt16(); + AdditionalRecordsCount = recordReader.ReadUInt16(); + } + + private static ushort GetBits(ushort oldValue, int position, int length) + { + if (length <= 0 || position >= 16) + return 0; + + int mask = (2 << (length - 1)) - 1; + + return (ushort)((oldValue >> position) & mask); + } + + private static ushort SetBits(ushort oldValue, int position, int length, bool blnValue) + { + return SetBits(oldValue, position, length, blnValue ? (ushort)1 : (ushort)0); + } + + private static ushort SetBits(ushort oldValue, int position, int length, ushort newValue) + { + if (length <= 0 || position >= 16) + return oldValue; + + int mask = (2 << (length - 1)) - 1; + + oldValue &= (ushort)~(mask << position); + oldValue |= (ushort)((newValue & mask) << position); + return oldValue; + } + + /// + /// Represents the header as a byte array + /// + internal byte[] GetData() + { + List data = new List(); + data.AddRange(WriteShort(Id)); + data.AddRange(WriteShort(_flags)); + data.AddRange(WriteShort(QuestionCount)); + data.AddRange(WriteShort(AnswerCount)); + data.AddRange(WriteShort(NameserverCount)); + data.AddRange(WriteShort(AdditionalRecordsCount)); + return data.ToArray(); + } + + private static byte[] WriteShort(ushort sValue) + { + return BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)sValue)); + } + } +} diff --git a/MySQL.Data/src/common/Dns/DnsRecordReader.cs b/MySQL.Data/src/common/Dns/DnsRecordReader.cs new file mode 100644 index 000000000..2e35895bd --- /dev/null +++ b/MySQL.Data/src/common/Dns/DnsRecordReader.cs @@ -0,0 +1,185 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Collections.Generic; +using System.Text; + +namespace MySql.Data.Common.DnsClient +{ + internal abstract class DnsRecord + { + /// + /// The Resource Record this record data belongs to. + /// + internal DnsResourceRecord ResourceRecord; + } + + /// + /// A DNS record reader. + /// + internal class DnsRecordReader + { + private readonly byte[] _data; + + /// + /// Gets or sets the position of the cursor in the record. + /// + public int Position { get; set; } + + /// + /// Initializes a new instance of the class. + /// + /// Byte array of the record. + /// Position of the cursor in the record. + internal DnsRecordReader(byte[] data, int position) + { + _data = data; + Position = position; + } + + /// + /// Initializes a new instance of the class. + /// + /// Byte array of the record. + internal DnsRecordReader(byte[] data) + : this(data, 0) + { + } + + /// + /// Read a byte from the record. + /// + internal byte ReadByte() + { + return (byte)(Position >= _data.Length ? 0 : _data[Position++]); + } + + /// + /// Read a char from the record. + /// + internal char ReadChar() + { + return (char)ReadByte(); + } + + /// + /// Read an unsigned int 16 from the record. + /// + internal ushort ReadUInt16() + { + return (ushort)((ReadByte() << 8) | ReadByte()); + } + + /// + /// Read an unsigned int 16 from the offset of the record. + /// + /// Offset to start reading from. + internal ushort ReadUInt16(int offset) + { + Position += offset; + return ReadUInt16(); + } + + /// + /// Read an unsigned int 32 from the record. + /// + internal uint ReadUInt32() + { + return (uint)((ReadUInt16() << 16) | ReadUInt16()); + } + + /// + /// Read the domain name from the record. + /// + /// Domain name of the record. + internal string ReadDomainName() + { + var name = new StringBuilder(); + int length; + + while ((length = ReadByte()) != 0) + { + if ((length & 0xc0) == 0xc0) + { + var newRecordReader = new DnsRecordReader(_data, ((length & 0x3f) << 8) | ReadByte()); + + name.Append(newRecordReader.ReadDomainName()); + return name.ToString(); + } + + while (length > 0) + { + name.Append(ReadChar()); + length--; + } + + name.Append('.'); + } + + return name.Length == 0 ? "." : name.ToString().Trim('.'); + } + + /// + /// Read a string from the record. + /// + internal string ReadString() + { + short length = ReadByte(); + + return Encoding.UTF8.GetString(ReadBytes(length)); + } + + /// + /// Read a series of bytes from the record. + /// + /// Length to read from the record. + internal byte[] ReadBytes(int length) + { + var list = new List(); + for (var i = 0; i < length; i++) + { + list.Add(ReadByte()); + } + + return list.ToArray(); + } + + /// + /// Read record from the data. + /// + /// Type of the record to read. + /// Record read from the data. + internal DnsRecord ReadRecord(RecordType type) + { + if (type is RecordType.SRV) + return new DnsSrvRecord(this); + else + return new DnsRecordUnknown(this); + } + } +} diff --git a/MySQL.Data/src/common/Dns/DnsRecordUnknown.cs b/MySQL.Data/src/common/Dns/DnsRecordUnknown.cs new file mode 100644 index 000000000..8c2bfaf3f --- /dev/null +++ b/MySQL.Data/src/common/Dns/DnsRecordUnknown.cs @@ -0,0 +1,44 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySql.Data.Common.DnsClient +{ + /// + /// A default Dns Record. + /// + internal class DnsRecordUnknown : DnsRecord + { + internal byte[] Data { get; set; } + + internal DnsRecordUnknown(DnsRecordReader recordReader) + { + ushort recordDataLength = recordReader.ReadUInt16(-2); + Data = recordReader.ReadBytes(recordDataLength); + } + } +} diff --git a/MySQL.Data/src/common/Dns/DnsRequest.cs b/MySQL.Data/src/common/Dns/DnsRequest.cs new file mode 100644 index 000000000..2a9372a40 --- /dev/null +++ b/MySQL.Data/src/common/Dns/DnsRequest.cs @@ -0,0 +1,71 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Collections.Generic; + +namespace MySql.Data.Common.DnsClient +{ + /// + /// A DNS request. + /// + internal class DnsRequest + { + /// Gets the header. + public DnsRecordHeader Header { get; } + + private List Questions { get; } + + internal DnsRequest() + { + Header = new DnsRecordHeader + { + OperationCode = OPCode.Query, + QuestionCount = 0 + }; + + Questions = new List(); + } + + internal void AddQuestion(DnsQuestion question) + { + Questions.Add(question); + } + + internal byte[] GetData() + { + List data = new List(); + Header.QuestionCount = (ushort)Questions.Count; + data.AddRange(Header.GetData()); + + foreach (var q in Questions) + data.AddRange(q.GetData()); + + return data.ToArray(); + } + } +} diff --git a/MySQL.Data/src/common/Dns/DnsResolver.cs b/MySQL.Data/src/common/Dns/DnsResolver.cs new file mode 100644 index 000000000..a82d579a2 --- /dev/null +++ b/MySQL.Data/src/common/Dns/DnsResolver.cs @@ -0,0 +1,134 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.NetworkInformation; +using System.Net.Sockets; + +namespace MySql.Data.Common.DnsClient +{ + internal class DnsResolver + { + /// + /// The default DNS server port. + /// + private const int DefaultPort = 53; + private ushort _uniqueId; + + private readonly List _dnsServers = new List(); + + internal DnsResolver() + { + AddLocalServers(); + _uniqueId = (ushort)(new Random()).Next(); + } + + /// + /// Fills a list of the endpoints in the local network configuration. + /// + private void AddLocalServers() + { + var interfaces = NetworkInterface.GetAllNetworkInterfaces(); + + foreach (var networkInterface in interfaces + .Where(p => (p.OperationalStatus == OperationalStatus.Up || p.OperationalStatus == OperationalStatus.Unknown) + && p.NetworkInterfaceType != NetworkInterfaceType.Loopback)) + { + var interfaceProperties = networkInterface.GetIPProperties(); + + foreach (var address in interfaceProperties.DnsAddresses) + { + var entry = new IPEndPoint(address, DefaultPort); + + if (!_dnsServers.Contains(entry)) + _dnsServers.Add(entry); + } + } + } + + /// Execute a query on a DNS server. + /// Domain name to look up. + /// DNS response for request. + internal DnsResponse Query(string domainName) + { + var question = new DnsQuestion(domainName); + var request = new DnsRequest(); + request.AddQuestion(question); + return GetResponse(request); + } + + private DnsResponse GetResponse(DnsRequest request) + { + request.Header.Id = _uniqueId; + request.Header.RecursionDesired = true; + return UdpRequest(request); + } + + private DnsResponse UdpRequest(DnsRequest request) + { + // RFC1035 max. size of a UDP datagram is 512 bytes + byte[] responseMessage = new byte[512]; + + // number of retries: 3 + for (int intAttempts = 0; intAttempts < 3; intAttempts++) + { + foreach (var dnsServer in _dnsServers) + { + Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 5000); + + try + { + socket.SendTo(request.GetData(), dnsServer); + int intReceived = socket.Receive(responseMessage); + byte[] data = new byte[intReceived]; + Array.Copy(responseMessage, data, intReceived); + DnsResponse response = new DnsResponse(dnsServer, data); + return response; + } + catch (SocketException) + { + continue; + } + finally + { + socket.Close(); + _uniqueId++; + } + } + } + + DnsResponse responseTimeout = new DnsResponse(); + responseTimeout.Error = "Timeout Error"; + return responseTimeout; + } + } +} diff --git a/MySQL.Data/src/common/Dns/DnsResourceRecord.cs b/MySQL.Data/src/common/Dns/DnsResourceRecord.cs new file mode 100644 index 000000000..a0b8dcafd --- /dev/null +++ b/MySQL.Data/src/common/Dns/DnsResourceRecord.cs @@ -0,0 +1,163 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySql.Data.Common.DnsClient +{ + #region RFC info + /* + 3.2. RR definitions + + 3.2.1. Format + + All RRs have the same top level format shown below: + + 1 1 1 1 1 1 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | | + / / + / NAME / + | | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | TYPE | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | CLASS | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | TTL | + | | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + | RDLENGTH | + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--| + / RDATA / + / / + +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ + + + where: + + NAME an owner name, i.e., the name of the node to which this + resource record pertains. + + TYPE two octets containing one of the RR TYPE codes. + + CLASS two octets containing one of the RR CLASS codes. + + TTL a 32 bit signed integer that specifies the time interval + that the resource record may be cached before the source + of the information should again be consulted. Zero + values are interpreted to mean that the RR can only be + used for the transaction in progress, and should not be + cached. For example, SOA records are always distributed + with a zero TTL to prohibit caching. Zero values can + also be used for extremely volatile data. + + RDLENGTH an unsigned 16 bit integer that specifies the length in + octets of the RDATA field. + + RDATA a variable length string of octets that describes the + resource. The format of this information varies + according to the TYPE and CLASS of the resource record. + */ + #endregion + internal class DnsResourceRecord + { + /// + /// Gets the name of the node to which this resource record pertains. + /// + internal string Name { get; } + + /// + /// Gets the type of resource record. + /// + internal RecordType Type { get; } + + /// + /// Gets the type class of resource record, mostly IN but can be CS, CH or HS. + /// + internal QueryClass Class { get; } + + /// + /// Gets the time to live, in seconds, that the resource record may be cached. + /// + internal uint TimeToLive { get; } + + /// + /// Gets the record length. + /// + internal ushort RecordLength { get; } + + /// + /// Gets one of the Record* classes. + /// + internal DnsRecord Record { get; } + + internal DnsResourceRecord(DnsRecordReader recordReader) + { + Name = recordReader.ReadDomainName(); + Type = (RecordType)recordReader.ReadUInt16(); + Class = (QueryClass)recordReader.ReadUInt16(); + TimeToLive = recordReader.ReadUInt32(); + RecordLength = recordReader.ReadUInt16(); + Record = recordReader.ReadRecord(Type); + Record.ResourceRecord = this; + } + } + + /// + /// Answer resource record. + /// + internal class AnswerResourceRecord : DnsResourceRecord + { + internal AnswerResourceRecord(DnsRecordReader recordReader) + : base(recordReader) + { + } + } + + /// + /// Authority resource record. + /// + internal class AuthorityResourceRecord : DnsResourceRecord + { + internal AuthorityResourceRecord(DnsRecordReader recordReader) + : base(recordReader) + { + } + } + + /// + /// Additional resource record. + /// + internal class AdditionalResourceRecord : DnsResourceRecord + { + internal AdditionalResourceRecord(DnsRecordReader recordReader) + : base(recordReader) + { + } + } +} diff --git a/MySQL.Data/src/common/Dns/DnsResponse.cs b/MySQL.Data/src/common/Dns/DnsResponse.cs new file mode 100644 index 000000000..1667744e1 --- /dev/null +++ b/MySQL.Data/src/common/Dns/DnsResponse.cs @@ -0,0 +1,144 @@ +// Copyright © 2022, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Net; + +namespace MySql.Data.Common.DnsClient +{ + internal class DnsResponse + { + /// + /// List of Question records. + /// + internal List Questions { get; } + + /// + /// List of AnswerResourceRecord records. + /// + internal List Answers { get; } + + /// + /// List of AuthorityResourceRecord records. + /// + internal List Authorities { get; } + + /// + /// List of AdditionalResourceRecord records. + /// + internal List Additionals { get; } + + /// + /// The record header. + /// + internal DnsRecordHeader Header { get; } + + /// + /// Server which delivered this response. + /// + internal IPEndPoint Server { get; } + + /// + /// The Size of the message. + /// + internal int MessageSize { get; } + + /// + /// Error message, empty when no error. + /// + internal string Error { get; set; } + + /// + /// TimeStamp when cached. + /// + internal DateTime TimeStamp { get; } + + /// + /// Initializes a new instance of the class. + /// + internal DnsResponse() + { + Questions = new List(); + Answers = new List(); + Authorities = new List(); + Additionals = new List(); + + Server = new IPEndPoint(0, 0); + Error = String.Empty; + MessageSize = 0; + TimeStamp = DateTime.Now; + Header = new DnsRecordHeader(); + } + + /// + /// Initializes a new instance of the class. + /// + /// of the DNS server that responded to the query. + /// array of the response data. + internal DnsResponse(IPEndPoint iPEndPoint, byte[] data) + : this() + { + Server = iPEndPoint; + MessageSize = data.Length; + DnsRecordReader recordReader = new DnsRecordReader(data); + Header = new DnsRecordHeader(recordReader); + + for (int intI = 0; intI < Header.QuestionCount; intI++) + Questions.Add(new DnsQuestion(recordReader)); + + for (int intI = 0; intI < Header.AnswerCount; intI++) + Answers.Add(new AnswerResourceRecord(recordReader)); + + for (int intI = 0; intI < Header.NameserverCount; intI++) + Authorities.Add(new AuthorityResourceRecord(recordReader)); + + for (int intI = 0; intI < Header.AdditionalRecordsCount; intI++) + Additionals.Add(new AdditionalResourceRecord(recordReader)); + } + + /// + /// List of RecordSRV in Response.Answers + /// + internal DnsSrvRecord[] RecordsSRV + { + get + { + List list = new List(); + foreach (var answer in Answers) + { + var record = answer.Record as DnsSrvRecord; + + if (record != null) + list.Add(record); + } + return list.ToArray(); + } + } + } +} diff --git a/MySQL.Data/src/common/Dns/DnsSrvRecord.cs b/MySQL.Data/src/common/Dns/DnsSrvRecord.cs new file mode 100644 index 000000000..3d8b1d62a --- /dev/null +++ b/MySQL.Data/src/common/Dns/DnsSrvRecord.cs @@ -0,0 +1,101 @@ +// Copyright © 2019, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Collections.Generic; + +namespace MySql.Data.Common.DnsClient +{ + /// + /// Class that represents a DNS SRV record. + /// RFC 2782 (https://tools.ietf.org/html/rfc2782) + /// + internal class DnsSrvRecord : DnsRecord, IComparer + { + /// + /// Gets the port. + /// + internal int Port { get; } + + /// + /// Gets the priority. + /// + internal int Priority { get; } + + /// + /// Gets the target domain name. + /// + internal string Target { get; } + + /// + /// Gets the weight. + /// + internal int Weight { get; } + + internal DnsSrvRecord() { } + + /// + /// Initializes a new instance of class. + /// + /// The port. + /// The priority. + /// The target. + /// The weight. + internal DnsSrvRecord(int port, int priority, string target, int weight) + { + Port = port; + Priority = priority; + Target = target; + Weight = weight; + } + + /// + /// Initializes a new instance of class. + /// + /// of the record data. + internal DnsSrvRecord(DnsRecordReader recordReader) + { + Priority = recordReader.ReadUInt16(); + Weight = recordReader.ReadUInt16(); + Port = recordReader.ReadUInt16(); + Target = recordReader.ReadDomainName(); + } + + /// + /// Compare two objects. First, using their priority and + /// if both have the same, then using their weights. + /// + /// A to compare. + /// A to compare. + /// + public int Compare(DnsSrvRecord x, DnsSrvRecord y) + { + int priorityDiff = x.Priority.CompareTo(y.Priority); + return priorityDiff == 0 ? y.Weight.CompareTo(x.Weight) : priorityDiff; + } + } +} diff --git a/MySQL.Data/src/common/DnsSrv.cs b/MySQL.Data/src/common/DnsSrv.cs new file mode 100644 index 000000000..429199688 --- /dev/null +++ b/MySQL.Data/src/common/DnsSrv.cs @@ -0,0 +1,122 @@ +// Copyright © 2019, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common.DnsClient; +using MySql.Data.MySqlClient; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace MySql.Data.Common +{ + /// + /// DNS resolver that runs queries against a server. + /// + internal static class DnsSrv + { + // Resolver object that looks up for DNS SRV records. + private static DnsResolver _resolver; + // DNS domain. + internal static string ServiceName { get; private set; } + + /// + /// Initializes a new instance of the class. + /// + internal static void CreateResolver(string serviceName) + { + _resolver = new DnsResolver(); + ServiceName = serviceName; + } + + /// + /// Gets the DNS SVR records of the service name that is provided. + /// + /// A list of s sorted as described in RFC2782. + internal static List GetDnsSrvRecords(string serviceName) + { + if (_resolver == null) + CreateResolver(serviceName); + + List records = new List(); + DnsResponse response = _resolver.Query(ServiceName); + + foreach (var record in response.RecordsSRV) + records.Add(record); + + if (records.Count > 0) + { + Reset(); + return SortSrvRecords(records); + } + else + throw new MySqlException(string.Format(Resources.DnsSrvNoHostsAvailable, ServiceName)); + } + + /// + /// Sorts a list of DNS SRV records according to the sorting rules described in RFC2782. + /// + /// List of s to sort. + /// A new list of sorted s. + internal static List SortSrvRecords(List srvRecords) + { + srvRecords.Sort(new DnsSrvRecord()); + + Random random = new Random(); + List srvRecordsSortedRfc2782 = new List(); + + List priorities = srvRecords.Select(s => s.Priority).Distinct().ToList(); + foreach (int priority in priorities) + { + List srvRecordsSamePriority = srvRecords.Where(r => r.Priority == priority).ToList(); + while (srvRecordsSamePriority.Count > 1) + { + int recCount = srvRecordsSamePriority.Count; + int sumOfWeights = 0; + int[] weights = new int[recCount]; + for (int i = 0; i < recCount; i++) + { + sumOfWeights += srvRecordsSamePriority[i].Weight; + weights[i] = sumOfWeights; + } + int selection = random.Next(sumOfWeights + 1); + int pos = 0; + for (; pos < recCount && weights[pos] < selection; pos++) { } + srvRecordsSortedRfc2782.Add(srvRecordsSamePriority[pos]); + srvRecordsSamePriority.RemoveAt(pos); + } + srvRecordsSortedRfc2782.Add(srvRecordsSamePriority[0]); + } + return srvRecordsSortedRfc2782; + } + + /// + /// Resets the DnsSrvResolver + /// + private static void Reset() => _resolver = null; + } +} diff --git a/MySQL.Data/src/common/LowResolutionStopwatch.cs b/MySQL.Data/src/common/LowResolutionStopwatch.cs new file mode 100644 index 000000000..11cddb077 --- /dev/null +++ b/MySQL.Data/src/common/LowResolutionStopwatch.cs @@ -0,0 +1,101 @@ +// Copyright © 2009, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; + +namespace MySql.Data.Common +{ + /// + /// This class is modeled after .NET Stopwatch. It provides better + /// performance (no system calls).It is however less precise than + /// .NET Stopwatch, measuring in milliseconds. It is adequate to use + /// when high-precision is not required (e.g for measuring IO timeouts), + /// but not for other tasks. + /// + internal class LowResolutionStopwatch + { + long _startTime; + public static readonly long Frequency = 1000; // measure in milliseconds + public static readonly bool IsHighResolution = false; + + public LowResolutionStopwatch() + { + ElapsedMilliseconds = 0; + } + public long ElapsedMilliseconds { get; private set; } + + public void Start() + { + _startTime = Environment.TickCount; + } + + public void Stop() + { + long now = Environment.TickCount; + long elapsed; + + // Calculate time different, handle possible overflow + if (now < _startTime) + { + if (now < 0) + elapsed = 1 + ((long)Int32.MaxValue - _startTime) + (now - (long)Int32.MinValue); + else + elapsed = Int32.MaxValue - _startTime + now; + } + else + elapsed = now - _startTime; + + ElapsedMilliseconds += elapsed; + } + + public void Reset() + { + ElapsedMilliseconds = 0; + _startTime = 0; + } + + public TimeSpan Elapsed => new TimeSpan(0, 0, 0, 0, (int)ElapsedMilliseconds); + + public static LowResolutionStopwatch StartNew() + { + LowResolutionStopwatch sw = new LowResolutionStopwatch(); + sw.Start(); + return sw; + } + + public static long GetTimestamp() + { + return Environment.TickCount; + } + + bool IsRunning() + { + return (_startTime != 0); + } + } +} diff --git a/MySQL.Data/src/common/MyNetworkStream.cs b/MySQL.Data/src/common/MyNetworkStream.cs new file mode 100644 index 000000000..c8b5e2ed2 --- /dev/null +++ b/MySQL.Data/src/common/MyNetworkStream.cs @@ -0,0 +1,404 @@ +// Copyright © 2009, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Net; +using System.Net.Sockets; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.Data.Common +{ + internal class MyNetworkStream : NetworkStream + { + /// + /// Wrapper around NetworkStream. + /// + /// MyNetworkStream is equivalent to NetworkStream, except + /// 1. It throws TimeoutException if read or write timeout occurs, instead + /// of IOException, to match behavior of other streams (named pipe and + /// shared memory). This property comes handy in TimedStream. + /// + /// 2. It implements workarounds for WSAEWOULDBLOCK errors, that can start + /// occuring after stream has times out. For a discussion about the CLR bug, + /// refer to http://tinyurl.com/lhgpyf. This error should never occur, as + /// we're not using asynchronous operations, but apparerntly it does occur + /// directly after timeout has expired. + /// The workaround is hinted in the URL above and implemented like this: + /// For each IO operation, if it throws WSAEWOULDBLOCK, we explicitely set + /// the socket to Blocking and retry the operation once again. + /// + private const int MaxRetryCount = 2; + readonly Socket _socket; + public new Socket Socket => _socket; + + /// + /// Determines whether the connection state is closed or open. + /// + /// true if connection is closed; otherwise, false. + public bool IsSocketClosed + { + get + { + bool result = false; + try + { + result = Socket.Poll(1000, SelectMode.SelectRead) && Socket.Available == 0; + } + catch (Exception ex) + { + if (ex is SocketException || ex is ObjectDisposedException) + { + MySqlTrace.LogError(0, ex.Message); + result = true; + } + } + return result; + } + } + + public MyNetworkStream(Socket socket, bool ownsSocket) + : base(socket, ownsSocket) + { + this._socket = socket; + } + + private static bool IsTimeoutException(SocketException e) + { + return (e.SocketErrorCode == SocketError.TimedOut); + } + + private static bool IsWouldBlockException(SocketException e) + { + return (e.SocketErrorCode == SocketError.WouldBlock); + } + + private void HandleOrRethrowException(Exception e) + { + Exception currentException = e; + while (currentException != null) + { + if (currentException is SocketException) + { + SocketException socketException = (SocketException)currentException; + if (IsWouldBlockException(socketException)) + { + // Workaround for WSAEWOULDBLOCK + _socket.Blocking = true; + // return to give the caller possibility to retry the call + return; + } + if (IsTimeoutException(socketException)) + { + throw new TimeoutException(socketException.Message, e); + } + } + currentException = currentException.InnerException; + } + throw (e); + } + + public override int Read(byte[] buffer, int offset, int count) => ReadAsync(buffer, offset, count, CancellationToken.None, false).GetAwaiter().GetResult(); + + public override Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) => ReadAsync(buffer, offset, count, cancellationToken, true); + + private async Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken, bool execAsync) + { + int retry = 0; + Exception exception = null; + do + { + try + { + //if (execAsync) + // return await base.ReadAsync(buffer, offset, count, cancellationToken).ConfigureAwait(false); + //else + // return base.Read(buffer, offset, count); + + if (execAsync) + { + int readasync= await base.ReadAsync(buffer, offset, count, cancellationToken).ConfigureAwait(false); + _socket.ReceiveTimeout = 0; + return readasync; + } + else + { + int read = base.Read(buffer, offset, count); + _socket.ReceiveTimeout = 0; + return read; + } + } + catch (Exception e) + { + exception = e; + HandleOrRethrowException(e); + } + + } + while (++retry < MaxRetryCount); + if (exception.GetBaseException() is SocketException + && IsTimeoutException((SocketException)exception.GetBaseException())) + throw new TimeoutException(exception.Message, exception); + throw exception; + } + + public override int ReadByte() + { + int retry = 0; + Exception exception = null; + do + { + try + { + return base.ReadByte(); + } + catch (Exception e) + { + exception = e; + HandleOrRethrowException(e); + } + } + while (++retry < MaxRetryCount); + throw exception; + } + + public override void Write(byte[] buffer, int offset, int count) => WriteAsync(buffer, offset, count, CancellationToken.None, false).GetAwaiter().GetResult(); + + public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) => WriteAsync(buffer, offset, count, cancellationToken, true); + + public async Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken, bool execAsync) + { + int retry = 0; + Exception exception = null; + do + { + try + { + if (execAsync) + await base.WriteAsync(buffer, offset, count, cancellationToken).ConfigureAwait(false); + else + base.Write(buffer, offset, count); + return; + } + catch (Exception e) + { + exception = e; + HandleOrRethrowException(e); + } + } + while (++retry < MaxRetryCount); + throw exception; + } + + public override void Flush() => FlushAsync(CancellationToken.None, false).GetAwaiter().GetResult(); + + public override Task FlushAsync(CancellationToken cancellationToken) => FlushAsync(cancellationToken, true); + + private async Task FlushAsync(CancellationToken cancellationToken, bool execAsync) + { + int retry = 0; + Exception exception = null; + do + { + try + { + if (execAsync) + await base.FlushAsync(cancellationToken).ConfigureAwait(false); + else + base.Flush(); + return; + } + catch (Exception e) + { + exception = e; + HandleOrRethrowException(e); + } + } + while (++retry < MaxRetryCount); + throw exception; + } + + #region Create Code + + public static async Task CreateStreamAsync(string server, uint connectionTimeout, uint keepAlive, uint port, bool unix, bool execAsync) + { + if (unix) return new MyNetworkStream(await StreamCreator.GetUnixSocketAsync(server, connectionTimeout, keepAlive, CancellationToken.None, execAsync).ConfigureAwait(false), true); + + MyNetworkStream stream = null; + IPHostEntry ipHE = GetHostEntry(server); + + foreach (IPAddress address in ipHE.AddressList) + { + try + { + stream = CreateSocketStream(port, keepAlive, connectionTimeout, address, unix); + if (stream != null) break; + } + catch (Exception ex) + { + string exTimeOutMessage = connectionTimeout == 0 ? ResourcesX.TimeOutSingleHost0ms : String.Format(ResourcesX.TimeOutSingleHost, connectionTimeout); + + if (ex is TimeoutException) throw new TimeoutException(exTimeOutMessage); + + SocketException socketException = ex as SocketException; + + // if the exception is a ConnectionRefused then we eat it as we may have other address + // to attempt + if (socketException == null) throw; + if (socketException.SocketErrorCode == SocketError.TimedOut) throw new TimeoutException(exTimeOutMessage); + if (socketException.SocketErrorCode != SocketError.ConnectionRefused) throw; + } + } + return stream; + } + + private static IPHostEntry ParseIPAddress(string hostname) + { + IPHostEntry ipHE = null; + IPAddress addr; + if (IPAddress.TryParse(hostname, out addr)) + { + ipHE = new IPHostEntry(); + ipHE.AddressList = new IPAddress[1]; + ipHE.AddressList[0] = addr; + } + return ipHE; + } + + private static IPHostEntry GetHostEntry(string hostname) + { + IPHostEntry ipHE = ParseIPAddress(hostname); + if (ipHE != null) return ipHE; + + Task t = Dns.GetHostEntryAsync(hostname); + t.Wait(); + return t.Result; + } + + private static MyNetworkStream CreateSocketStream(uint port, uint keepAlive, uint connectionTimeout, IPAddress ip, bool unix) + { + EndPoint endPoint; + endPoint = new IPEndPoint(ip, (int)port); + Socket socket = unix ? + new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.IP) : + new Socket(ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp); + + if (connectionTimeout > 0) + socket.ReceiveTimeout = (int)connectionTimeout; + + socket.NoDelay = true; + + if (keepAlive > 0) + { + SetKeepAlive(socket, keepAlive); + } + + IAsyncResult ias = socket.BeginConnect(endPoint, null, null); + + if (connectionTimeout == 0) + { + if (!ias.AsyncWaitHandle.WaitOne()) + socket.Close(); + } + else + { + if (!ias.AsyncWaitHandle.WaitOne((int)connectionTimeout, false)) + { + socket.Close(); + throw new TimeoutException(); + } + } + + try + { + socket.EndConnect(ias); + } + catch (Exception) + { + socket.Close(); + throw; + } + + MyNetworkStream stream = new MyNetworkStream(socket, true); + GC.SuppressFinalize(socket); + GC.SuppressFinalize(stream); + return stream; + } + + /// + /// Set keepalive + timeout on socket. + /// + /// socket + /// keepalive timeout, in seconds + private static void SetKeepAlive(Socket s, uint time) + { + uint on = 1; + uint interval = 1000; // default interval = 1 sec + + uint timeMilliseconds; + if (time > UInt32.MaxValue / 1000) + timeMilliseconds = UInt32.MaxValue; + else + timeMilliseconds = time * 1000; + + // Use Socket.IOControl to implement equivalent of + // WSAIoctl with SOL_KEEPALIVE_VALS + + // the native structure passed to WSAIoctl is + //struct tcp_keepalive { + // ULONG onoff; + // ULONG keepalivetime; + // ULONG keepaliveinterval; + //}; + // marshal the equivalent of the native structure into a byte array + + byte[] inOptionValues = new byte[12]; + BitConverter.GetBytes(on).CopyTo(inOptionValues, 0); + BitConverter.GetBytes(timeMilliseconds).CopyTo(inOptionValues, 4); + BitConverter.GetBytes(interval).CopyTo(inOptionValues, 8); + try + { + // call WSAIoctl via IOControl + s.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null); + return; + } + catch (NotImplementedException) + { + // Mono throws not implemented currently + } + // Fallback if Socket.IOControl is not available ( Compact Framework ) + // or not implemented ( Mono ). Keepalive option will still be set, but + // with timeout is kept default. + s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, 1); + } + + #endregion + + } +} diff --git a/MySQL.Data/src/common/MySqlConnectionStringOption.cs b/MySQL.Data/src/common/MySqlConnectionStringOption.cs new file mode 100644 index 000000000..64ec4d6d5 --- /dev/null +++ b/MySQL.Data/src/common/MySqlConnectionStringOption.cs @@ -0,0 +1,231 @@ +// Copyright © 2019, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI; +using System; +using System.Data.Common; +using System.Globalization; +using System.Linq; +using System.Reflection; + +namespace MySql.Data.Common +{ + internal class MySqlConnectionStringOption + { + public MySqlConnectionStringOption(string keyword, string synonyms, Type baseType, object defaultValue, bool obsolete, + SetterDelegate setter, GetterDelegate getter) + { + Keyword = StringUtility.ToLowerInvariant(keyword); + if (synonyms != null) + Synonyms = StringUtility.ToLowerInvariant(synonyms).Split(','); + BaseType = baseType; + Obsolete = obsolete; + DefaultValue = defaultValue; + Setter = setter; + Getter = getter; + IsCustomized = true; + } + public MySqlConnectionStringOption(string keyword, string synonyms, Type baseType, object defaultValue, bool obsolete, + ClassicSetterDelegate setter, ClassicGetterDelegate getter) + { + Keyword = StringUtility.ToLowerInvariant(keyword); + if (synonyms != null) + Synonyms = StringUtility.ToLowerInvariant(synonyms).Split(','); + BaseType = baseType; + Obsolete = obsolete; + DefaultValue = defaultValue; + ClassicSetter = setter; + ClassicGetter = getter; + IsCustomized = true; + } + + public MySqlConnectionStringOption(string keyword, string synonyms, Type baseType, object defaultValue, bool obsolete, + XSetterDelegate setter, XGetterDelegate getter) + { + Keyword = StringUtility.ToLowerInvariant(keyword); + if (synonyms != null) + Synonyms = StringUtility.ToLowerInvariant(synonyms).Split(','); + BaseType = baseType; + Obsolete = obsolete; + DefaultValue = defaultValue; + XSetter = setter; + XGetter = getter; + IsCustomized = true; + } + + public MySqlConnectionStringOption(string keyword, string synonyms, Type baseType, object defaultValue, bool obsolete) : + this(keyword, synonyms, baseType, defaultValue, obsolete, + delegate (MySqlBaseConnectionStringBuilder msb, MySqlConnectionStringOption sender, object value) + { + sender.ValidateValue(ref value); + msb.SetInternalValue(sender.Keyword, Convert.ChangeType(value, sender.BaseType)); + }, + (msb, sender) => msb.values[sender.Keyword] + ) + { + IsCustomized = false; + } + + #region Properties + + public Type BaseType { get; private set; } + public bool IsCustomized { get; } + public string[] Synonyms { get; private set; } + public bool Obsolete { get; private set; } + public string Keyword { get; private set; } + public object DefaultValue { get; private set; } + public SetterDelegate Setter { get; private set; } + public GetterDelegate Getter { get; private set; } + public ClassicSetterDelegate ClassicSetter { get; private set; } + public ClassicGetterDelegate ClassicGetter { get; private set; } + public XSetterDelegate XSetter { get; private set; } + public XGetterDelegate XGetter { get; private set; } + + #endregion + + #region Delegates + + public delegate void SetterDelegate(MySqlBaseConnectionStringBuilder msb, MySqlConnectionStringOption sender, object value); + + public delegate object GetterDelegate(MySqlBaseConnectionStringBuilder msb, MySqlConnectionStringOption sender); + + public delegate void ClassicSetterDelegate(MySqlConnectionStringBuilder msb, MySqlConnectionStringOption sender, object value); + + public delegate object ClassicGetterDelegate(MySqlConnectionStringBuilder msb, MySqlConnectionStringOption sender); + + public delegate void XSetterDelegate(MySqlXConnectionStringBuilder msb, MySqlConnectionStringOption sender, object value); + + public delegate object XGetterDelegate(MySqlXConnectionStringBuilder msb, MySqlConnectionStringOption sender); + + #endregion + + public bool HasKeyword(string key) + { + if (Keyword == key) return true; + if (Synonyms == null) return false; + return Synonyms.Any(syn => syn == key); + } + + public void Clean(DbConnectionStringBuilder builder) + { + builder.Remove(Keyword); + if (Synonyms == null) return; + foreach (var syn in Synonyms) + builder.Remove(syn); + } + + public void ValidateValue(ref object value, string keyword = null, bool isXProtocol = false) + { + bool b; + if (value == null) return; + string typeName = BaseType.Name; + Type valueType = value.GetType(); + if (valueType.Name == "String") + { + if (BaseType == valueType) return; + else if (BaseType == typeof(bool)) + { + if (string.Compare("yes", (string)value, StringComparison.OrdinalIgnoreCase) == 0) value = true; + else if (string.Compare("no", (string)value, StringComparison.OrdinalIgnoreCase) == 0) value = false; + else if (Boolean.TryParse(value.ToString(), out b)) value = b; + else throw new ArgumentException(String.Format(Resources.ValueNotCorrectType, value)); + return; + } + } + + if (typeName == "Boolean" && Boolean.TryParse(value.ToString(), out b)) { value = b; return; } + + UInt64 uintVal; + if (typeName.StartsWith("UInt64") && UInt64.TryParse(value.ToString(), NumberStyles.Any, CultureInfo.InvariantCulture, out uintVal)) { value = uintVal; return; } + + UInt32 uintVal32; + if (typeName.StartsWith("UInt32") && UInt32.TryParse(value.ToString(), NumberStyles.Any, CultureInfo.InvariantCulture, out uintVal32)) { value = uintVal32; return; } + + Int64 intVal; + if (typeName.StartsWith("Int64") && Int64.TryParse(value.ToString(), NumberStyles.Any, CultureInfo.InvariantCulture, out intVal)) { value = intVal; return; } + + Int32 intVal32; + if (typeName.StartsWith("Int32") && Int32.TryParse(value.ToString(), NumberStyles.Any, CultureInfo.InvariantCulture, out intVal32)) { value = intVal32; return; } + + object objValue; + Type baseType = BaseType.GetTypeInfo().BaseType; + if (baseType != null && baseType.Name == "Enum" && ParseEnum(value.ToString(), out objValue)) + { + value = objValue; + return; + } + + if (!string.IsNullOrEmpty(keyword) && isXProtocol) + { + switch (keyword) + { + case "compression": + throw new ArgumentException(string.Format(ResourcesX.CompressionInvalidValue, value)); + } + } + + throw new ArgumentException(String.Format(Resources.ValueNotCorrectType, value)); + } + + public void ValidateValue(ref object value, string keyword) + { + string typeName = BaseType.Name; + Type valueType = value.GetType(); + + switch (keyword) + { + case "connect-timeout": + if (typeName != valueType.Name && !uint.TryParse(value.ToString(), NumberStyles.Any, CultureInfo.InvariantCulture, out uint uintVal)) throw new FormatException(ResourcesX.InvalidConnectionTimeoutValue); + break; + } + } + + private bool ParseEnum(string requestedValue, out object value) + { + value = null; + try + { + value = Enum.Parse(BaseType, requestedValue, true); + if (value != null && Enum.IsDefined(BaseType, value.ToString())) + { + return true; + } + else + { + value = null; + return false; + } + } + catch (ArgumentException) + { + return false; + } + } + } +} diff --git a/MySQL.Data/src/common/MySqlConnectionStringOptionCollection.cs b/MySQL.Data/src/common/MySqlConnectionStringOptionCollection.cs new file mode 100644 index 000000000..00609df8e --- /dev/null +++ b/MySQL.Data/src/common/MySqlConnectionStringOptionCollection.cs @@ -0,0 +1,77 @@ +// Copyright © 2019, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; + +namespace MySql.Data.Common +{ + internal class MySqlConnectionStringOptionCollection : Dictionary + { + internal List Options { get; } + + internal MySqlConnectionStringOptionCollection() : base(StringComparer.OrdinalIgnoreCase) + { + Options = new List(); + } + + internal void Add(MySqlConnectionStringOption option) + { + Options.Add(option); + // Register the option with all the keywords. + base.Add(option.Keyword, option); + if (option.Synonyms == null) return; + + foreach (string t in option.Synonyms) + base.Add(t, option); + } + + internal MySqlConnectionStringOption Get(string keyword) + { + MySqlConnectionStringOption option = null; + base.TryGetValue(keyword, out option); + return option; + } + + internal MySqlConnectionStringOptionCollection Clone() + { + var instance = new MySqlConnectionStringOptionCollection(); + if (Options == null) + { + return instance; + } + + foreach (var option in Options) + { + instance.Add(option); + } + + return instance; + } + } +} diff --git a/Source/MySql.Data/common/MySqlTokenizer.cs b/MySQL.Data/src/common/MySqlTokenizer.cs similarity index 80% rename from Source/MySql.Data/common/MySqlTokenizer.cs rename to MySQL.Data/src/common/MySqlTokenizer.cs index a0ec3ac76..6bf9c226c 100644 --- a/Source/MySql.Data/common/MySqlTokenizer.cs +++ b/MySQL.Data/src/common/MySqlTokenizer.cs @@ -1,278 +1,288 @@ -// Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Text; - -namespace MySql.Data.Common -{ - internal class MySqlTokenizer - { - private string _sql; - - public MySqlTokenizer() - { - BackslashEscapes = true; - MultiLine = true; - Position = 0; - } - - public MySqlTokenizer(string input) - : this() - { - _sql = input; - } - - #region Properties - - public string Text - { - get { return _sql; } - set { _sql = value; Position = 0; } - } - - public bool AnsiQuotes { get; set; } - - public bool BackslashEscapes { get; set; } - - public bool MultiLine { get; set; } - - public bool SqlServerMode { get; set; } - - public bool Quoted { get; private set; } - - public bool IsComment { get; private set; } - - public int StartIndex { get; set; } - - public int StopIndex { get; set; } - - public int Position { get; set; } - - public bool ReturnComments { get; set; } - - #endregion - - public List GetAllTokens() - { - List tokens = new List(); - string token = NextToken(); - while (token != null) - { - tokens.Add(token); - token = NextToken(); - } - return tokens; - } - - public string NextToken() - { - while (FindToken()) - { - string token = _sql.Substring(StartIndex, StopIndex - StartIndex); - return token; - } - return null; - } - - public static bool IsParameter(string s) - { - if (String.IsNullOrEmpty(s)) return false; - if (s[0] == '?') return true; - return s.Length > 1 && s[0] == '@' && s[1] != '@'; - } - - public string NextParameter() - { - while (FindToken()) - { - if ((StopIndex - StartIndex) < 2) continue; - char c1 = _sql[StartIndex]; - char c2 = _sql[StartIndex + 1]; - if (c1 == '?' || - (c1 == '@' && c2 != '@')) - return _sql.Substring(StartIndex, StopIndex - StartIndex); - } - return null; - } - - public bool FindToken() - { - IsComment = Quoted = false; // reset our flags - StartIndex = StopIndex = -1; - - while (Position < _sql.Length) - { - char c = _sql[Position++]; - if (Char.IsWhiteSpace(c)) continue; - - if (c == '`' || c == '\'' || c == '"' || (c == '[' && SqlServerMode)) - ReadQuotedToken(c); - else if (c == '#' || c == '-' || c == '/') - { - if (!ReadComment(c)) - ReadSpecialToken(); - } - else - ReadUnquotedToken(); - if (StartIndex != -1) return true; - } - return false; - } - - public string ReadParenthesis() - { - StringBuilder sb = new StringBuilder("("); - int start = StartIndex; - string token = NextToken(); - while (true) - { - if (token == null) - throw new InvalidOperationException("Unable to parse SQL"); - sb.Append(token); - if (token == ")" && !Quoted) break; - token = NextToken(); - } - return sb.ToString(); - } - - private bool ReadComment(char c) - { - // make sure the comment starts correctly - if (c == '/' && (Position >= _sql.Length || _sql[Position] != '*')) return false; - if (c == '-' && ((Position + 1) >= _sql.Length || _sql[Position] != '-' || _sql[Position + 1] != ' ')) return false; - - string endingPattern = "\n"; - if (_sql[Position] == '*') - endingPattern = "*/"; - - int startingIndex = Position - 1; - - int index = _sql.IndexOf(endingPattern, Position); - if (endingPattern == "\n") - index = _sql.IndexOf('\n', Position); - if (index == -1) - index = _sql.Length - 1; - else - index += endingPattern.Length; - - Position = index; - if (ReturnComments) - { - StartIndex = startingIndex; - StopIndex = index; - IsComment = true; - } - return true; - } - - private void CalculatePosition(int start, int stop) - { - StartIndex = start; - StopIndex = stop; - if (!MultiLine) return; - } - - private void ReadUnquotedToken() - { - StartIndex = Position - 1; - - if (!IsSpecialCharacter(_sql[StartIndex])) - { - while (Position < _sql.Length) - { - char c = _sql[Position]; - if (Char.IsWhiteSpace(c)) break; - if (IsSpecialCharacter(c)) break; - Position++; - } - } - - Quoted = false; - StopIndex = Position; - } - - private void ReadSpecialToken() - { - StartIndex = Position - 1; - - Debug.Assert(IsSpecialCharacter(_sql[StartIndex])); - - StopIndex = Position; - Quoted = false; - } - - /// - /// Read a single quoted identifier from the stream - /// - /// - /// - private void ReadQuotedToken(char quoteChar) - { - if (quoteChar == '[') - quoteChar = ']'; - StartIndex = Position - 1; - bool escaped = false; - - bool found = false; - while (Position < _sql.Length) - { - char c = _sql[Position]; - - if (c == quoteChar && !escaped) - { - found = true; - break; - } - - if (escaped) - escaped = false; - else if (c == '\\' && BackslashEscapes) - escaped = true; - Position++; - } - if (found) Position++; - Quoted = found; - StopIndex = Position; - } - - private bool IsQuoteChar(char c) - { - return c == '`' || c == '\'' || c == '\"'; - } - - private bool IsParameterMarker(char c) - { - return c == '@' || c == '?'; - } - - private bool IsSpecialCharacter(char c) - { - if (Char.IsLetterOrDigit(c) || - c == '$' || c == '_' || c == '.') return false; - if (IsParameterMarker(c)) return false; - return true; - } - } -} +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; + +namespace MySql.Data.Common +{ + internal class MySqlTokenizer + { + private string _sql; + + public MySqlTokenizer() + { + BackslashEscapes = true; + MultiLine = true; + Position = 0; + } + + public MySqlTokenizer(string input) + : this() + { + _sql = input; + } + + #region Properties + + public string Text + { + get { return _sql; } + set { _sql = value; Position = 0; } + } + + public bool AnsiQuotes { get; set; } + + public bool BackslashEscapes { get; set; } + + public bool MultiLine { get; set; } + + public bool SqlServerMode { get; set; } + + public bool Quoted { get; private set; } + + public bool IsComment { get; private set; } + + public int StartIndex { get; set; } + + public int StopIndex { get; set; } + + public int Position { get; set; } + + public bool ReturnComments { get; set; } + + #endregion + + public List GetAllTokens() + { + List tokens = new List(); + string token = NextToken(); + while (token != null) + { + tokens.Add(token); + token = NextToken(); + } + return tokens; + } + + public string NextToken() + { + while (FindToken()) + { + string token = _sql.Substring(StartIndex, StopIndex - StartIndex); + return token; + } + return null; + } + + public static bool IsParameter(string s) + { + if (String.IsNullOrEmpty(s)) return false; + if (s[0] == '?') return true; + return s.Length > 1 && s[0] == '@' && s[1] != '@'; + } + + public string NextParameter() + { + while (FindToken()) + { + if ((StopIndex - StartIndex) < 2) + { + if (IsParameter(_sql.Substring(StartIndex, 1))) return "?"; + else continue; + } + char c1 = _sql[StartIndex]; + char c2 = _sql[StartIndex + 1]; + if (c1 == '?' || + (c1 == '@' && c2 != '@')) + return _sql.Substring(StartIndex, StopIndex - StartIndex); + } + return null; + } + + public bool FindToken() + { + IsComment = Quoted = false; // reset our flags + StartIndex = StopIndex = -1; + + while (Position < _sql.Length) + { + char c = _sql[Position++]; + if (Char.IsWhiteSpace(c)) continue; + + if (c == '`' || c == '\'' || c == '"' || (c == '[' && SqlServerMode)) + ReadQuotedToken(c); + else if (c == '#' || c == '-' || c == '/') + { + if (!ReadComment(c)) + ReadSpecialToken(); + } + else + ReadUnquotedToken(); + if (StartIndex != -1) return true; + } + return false; + } + + public string ReadParenthesis() + { + StringBuilder sb = new StringBuilder("("); + int start = StartIndex; + string token = NextToken(); + while (true) + { + if (token == null) + throw new InvalidOperationException("Unable to parse SQL"); + sb.Append(token); + if (token == ")" && !Quoted) break; + token = NextToken(); + } + return sb.ToString(); + } + + private bool ReadComment(char c) + { + // make sure the comment starts correctly + if (c == '/' && (Position >= _sql.Length || _sql[Position] != '*')) return false; + if (c == '-' && ((Position + 1) >= _sql.Length || _sql[Position] != '-' || _sql[Position + 1] != ' ')) return false; + + string endingPattern = "\n"; + if (_sql[Position] == '*') + endingPattern = "*/"; + + int startingIndex = Position - 1; + + int index = _sql.IndexOf(endingPattern, Position); + if (endingPattern == "\n") + index = _sql.IndexOf('\n', Position); + if (index == -1) + index = _sql.Length - 1; + else + index += endingPattern.Length; + + Position = index; + if (ReturnComments) + { + StartIndex = startingIndex; + StopIndex = index; + IsComment = true; + } + return true; + } + + private void CalculatePosition(int start, int stop) + { + StartIndex = start; + StopIndex = stop; + if (!MultiLine) return; + } + + private void ReadUnquotedToken() + { + StartIndex = Position - 1; + + if (!IsSpecialCharacter(_sql[StartIndex])) + { + while (Position < _sql.Length) + { + char c = _sql[Position]; + if (Char.IsWhiteSpace(c)) break; + if (IsSpecialCharacter(c)) break; + Position++; + } + } + + Quoted = false; + StopIndex = Position; + } + + private void ReadSpecialToken() + { + StartIndex = Position - 1; + + Debug.Assert(IsSpecialCharacter(_sql[StartIndex])); + + StopIndex = Position; + Quoted = false; + } + + /// + /// Read a single quoted identifier from the stream + /// + /// + /// + private void ReadQuotedToken(char quoteChar) + { + if (quoteChar == '[') + quoteChar = ']'; + StartIndex = Position - 1; + bool escaped = false; + + bool found = false; + while (Position < _sql.Length) + { + char c = _sql[Position]; + + if (c == quoteChar && !escaped) + { + found = true; + break; + } + + if (escaped) + escaped = false; + else if (c == '\\' && BackslashEscapes) + escaped = true; + Position++; + } + if (found) Position++; + Quoted = found; + StopIndex = Position; + } + + private bool IsQuoteChar(char c) + { + return c == '`' || c == '\'' || c == '\"'; + } + + internal bool IsParameterMarker(char c) + { + return c == '@' || c == '?'; + } + + private bool IsSpecialCharacter(char c) + { + if (Char.IsLetterOrDigit(c) || + c == '$' || c == '_' || c == '.') return false; + if (IsParameterMarker(c)) return false; + return true; + } + } +} diff --git a/MySQL.Data/src/common/NativeMethods.cs b/MySQL.Data/src/common/NativeMethods.cs new file mode 100644 index 000000000..6501e7a41 --- /dev/null +++ b/MySQL.Data/src/common/NativeMethods.cs @@ -0,0 +1,165 @@ +// Copyright © 2009, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Runtime.InteropServices; + +namespace MySql.Data.Common +{ + internal class NativeMethods + { + // Keep the compiler from generating a default ctor + private NativeMethods() + { + } + + //Constants for dwDesiredAccess: + public const UInt32 GENERIC_READ = 0x80000000; + public const UInt32 GENERIC_WRITE = 0x40000000; + public const UInt32 FILE_READ_ATTRIBUTES = 0x0080; + public const UInt32 FILE_READ_DATA = 0x0001; + public const UInt32 FILE_WRITE_ATTRIBUTES = 0x0100; + public const UInt32 FILE_WRITE_DATA = 0x0002; + + //Constants for return value: + public const Int32 INVALIDpipeHandle_VALUE = -1; + + //Constants for dwFlagsAndAttributes: + public const UInt32 FILE_FLAG_OVERLAPPED = 0x40000000; + public const UInt32 FILE_FLAG_NO_BUFFERING = 0x20000000; + + //Constants for dwCreationDisposition: + public const UInt32 OPEN_EXISTING = 3; + + [StructLayout(LayoutKind.Sequential)] + public class SecurityAttributes + { + public SecurityAttributes() + { + Length = Marshal.SizeOf(); + } + public int Length; + public IntPtr securityDescriptor = IntPtr.Zero; + public bool inheritHandle; + } + + [DllImport("Kernel32", CharSet = CharSet.Unicode, SetLastError = true)] + static extern public IntPtr CreateFile( + String fileName, + uint desiredAccess, + uint shareMode, + SecurityAttributes securityAttributes, + uint creationDisposition, + uint flagsAndAttributes, + uint templateFile); + + [return: MarshalAs(UnmanagedType.Bool)] + [DllImport("kernel32.dll", EntryPoint = "PeekNamedPipe", SetLastError = true)] + static extern public bool PeekNamedPipe(IntPtr handle, + byte[] buffer, + uint nBufferSize, + ref uint bytesRead, + ref uint bytesAvail, + ref uint BytesLeftThisMessage); + + [return: MarshalAs(UnmanagedType.Bool)] + [DllImport("kernel32.dll", SetLastError = true)] + static extern public bool ReadFile(IntPtr hFile, [Out] byte[] lpBuffer, uint nNumberOfBytesToRead, + out uint lpNumberOfBytesRead, IntPtr lpOverlapped); + + [return: MarshalAs(UnmanagedType.Bool)] + [DllImport("Kernel32")] + public static extern bool WriteFile(IntPtr hFile, [In] byte[] buffer, + uint numberOfBytesToWrite, out uint numberOfBytesWritten, IntPtr lpOverlapped); + + [return: MarshalAs(UnmanagedType.Bool)] + [DllImport("kernel32.dll", SetLastError = true)] + public static extern bool CloseHandle(IntPtr handle); + + [return: MarshalAs(UnmanagedType.Bool)] + [DllImport("kernel32.dll", SetLastError = true)] + public static extern bool CancelIo(IntPtr handle); + + [return: MarshalAs(UnmanagedType.Bool)] + [DllImport("kernel32.dll", SetLastError = true)] + public static extern bool FlushFileBuffers(IntPtr handle); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] + public static extern IntPtr OpenEvent(uint dwDesiredAccess, + [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, + string lpName); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] + public static extern IntPtr OpenFileMapping(uint dwDesiredAccess, + [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, + string lpName); + + [DllImport("kernel32.dll")] + public static extern IntPtr MapViewOfFile(IntPtr hFileMappingObject, uint + dwDesiredAccess, uint dwFileOffsetHigh, uint dwFileOffsetLow, + IntPtr dwNumberOfBytesToMap); + + [DllImport("kernel32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool UnmapViewOfFile(IntPtr lpBaseAddress); + + [DllImport("kernel32.dll", SetLastError = true)] + public static extern int FlushViewOfFile(IntPtr address, uint numBytes); + + [DllImport("kernel32.dll", SetLastError = true)] + public static extern bool WaitNamedPipe(string namedPipeName, uint timeOut); + #region Winsock functions + + // SOcket routines + [DllImport("ws2_32.dll", SetLastError = true)] + static extern public IntPtr socket(int af, int type, int protocol); + + [DllImport("ws2_32.dll", SetLastError = true)] + static extern public int ioctlsocket(IntPtr socket, uint cmd, ref UInt32 arg); + + [DllImport("ws2_32.dll", SetLastError = true)] + public static extern int WSAIoctl(IntPtr s, uint dwIoControlCode, byte[] inBuffer, uint cbInBuffer, + byte[] outBuffer, uint cbOutBuffer, IntPtr lpcbBytesReturned, IntPtr lpOverlapped, + IntPtr lpCompletionRoutine); + + [DllImport("ws2_32.dll", SetLastError = true)] + static extern public int WSAGetLastError(); + + [DllImport("ws2_32.dll", SetLastError = true)] + static extern public int connect(IntPtr socket, byte[] addr, int addrlen); + + [DllImport("ws2_32.dll", SetLastError = true)] + static extern public int recv(IntPtr socket, byte[] buff, int len, int flags); + + [DllImport("ws2_32.Dll", SetLastError = true)] + static extern public int send(IntPtr socket, byte[] buff, int len, int flags); + + #endregion + + } +} diff --git a/MySQL.Data/src/common/Platform.cs b/MySQL.Data/src/common/Platform.cs new file mode 100644 index 000000000..c4bed02dc --- /dev/null +++ b/MySQL.Data/src/common/Platform.cs @@ -0,0 +1,85 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Runtime.InteropServices; + + +namespace MySql.Data.Common +{ + internal class Platform + { + private static bool _inited; + private static bool _isMono; + + /// + /// By creating a private ctor, we keep the compiler from creating a default ctor + /// + private Platform() + { + } + + public static bool IsWindows() + { + OperatingSystem os = Environment.OSVersion; + switch (os.Platform) + { + case PlatformID.Win32NT: + case PlatformID.Win32S: + case PlatformID.Win32Windows: + return true; + } + return false; + + } + + public static bool IsMacOSX() + { +#if NET462 + return Environment.OSVersion.Platform == PlatformID.MacOSX; +#else + return RuntimeInformation.IsOSPlatform(OSPlatform.OSX); +#endif + } + + + public static bool IsMono() + { + if (!_inited) + Init(); + return _isMono; + } + + private static void Init() + { + _inited = true; + Type t = Type.GetType("Mono.Runtime"); + _isMono = t != null; + } + } +} diff --git a/Source/MySql.Data/common/QueryNormalizer.cs b/MySQL.Data/src/common/QueryNormalizer.cs similarity index 86% rename from Source/MySql.Data/common/QueryNormalizer.cs rename to MySQL.Data/src/common/QueryNormalizer.cs index b81aba51c..d99b23224 100644 --- a/Source/MySql.Data/common/QueryNormalizer.cs +++ b/MySQL.Data/src/common/QueryNormalizer.cs @@ -1,376 +1,380 @@ -// Copyright © 2009, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySql.Data.MySqlClient; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; - - -namespace MySql.Data.Common -{ - internal class QueryNormalizer - { - private static readonly List Keywords = new List(); - private readonly List _tokens = new List(); - private int _pos; - private string _fullSql; - private string _queryType; - - static QueryNormalizer() - { - StringReader sr = new StringReader(Resources.keywords); - string keyword = sr.ReadLine(); - while (keyword != null) - { - Keywords.Add(keyword); - keyword = sr.ReadLine(); - } - } - - public string QueryType => _queryType; - - public string Normalize(string sql) - { - _tokens.Clear(); - StringBuilder newSql = new StringBuilder(); - _fullSql = sql; - - TokenizeSql(sql); - DetermineStatementType(_tokens); - ProcessMathSymbols(_tokens); - CollapseValueLists(_tokens); - CollapseInLists(_tokens); - CollapseWhitespace(_tokens); - - foreach (Token t in _tokens.Where(t => t.Output)) - newSql.Append(t.Text); - - return newSql.ToString(); - } - - private void DetermineStatementType(List tok) - { - foreach (Token t in tok.Where(t => t.Type == TokenType.Keyword)) - { - _queryType = t.Text.ToUpperInvariant(); - break; - } - } - - /// - /// Mark - or + signs that are unary ops as no output - /// - /// - private static void ProcessMathSymbols(List tok) - { - Token lastToken = null; - - foreach (Token t in tok) - { - if (t.Type == TokenType.Symbol && - (t.Text == "-" || t.Text == "+")) - { - if (lastToken != null && - lastToken.Type != TokenType.Number && - lastToken.Type != TokenType.Identifier && - (lastToken.Type != TokenType.Symbol || lastToken.Text != ")")) - t.Output = false; - } - if (t.IsRealToken) - lastToken = t; - } - } - - private static void CollapseWhitespace(List tok) - { - Token lastToken = null; - - foreach (Token t in tok) - { - if (t.Output && - t.Type == TokenType.Whitespace && - lastToken != null && - lastToken.Type == TokenType.Whitespace) - { - t.Output = false; - } - if (t.Output) - lastToken = t; - } - } - - private void CollapseValueLists(List tok) - { - int pos = -1; - while (++pos < tok.Count) - { - Token t = tok[pos]; - if (t.Type != TokenType.Keyword) continue; - if (!t.Text.StartsWith("VALUE", StringComparison.OrdinalIgnoreCase)) continue; - CollapseValueList(tok, ref pos); - } - } - - private void CollapseValueList(List tok, ref int pos) - { - List parenIndices = new List(); - - // this while loop will find all closing parens in this value list - while (true) - { - // find the close ')' - while (++pos < tok.Count) - { - if (tok[pos].Type == TokenType.Symbol && tok[pos].Text == ")") - break; - if (pos == tok.Count - 1) - break; - } - parenIndices.Add(pos); - - // now find the next "real" token - while (++pos < tok.Count) - if (tok[pos].IsRealToken) break; - if (pos == tok.Count) break; - - if (tok[pos].Text == ",") continue; - pos--; - break; - } - - // if we only have 1 value then we don't collapse - if (parenIndices.Count < 2) return; - int index = parenIndices[0]; - tok[++index] = new Token(TokenType.Whitespace, " "); - tok[++index] = new Token(TokenType.Comment, "/* , ... */"); - index++; - - // now mark all the other tokens as no output - while (index <= parenIndices[parenIndices.Count - 1]) - tok[index++].Output = false; - } - - private void CollapseInLists(List tok) - { - int pos = -1; - while (++pos < tok.Count) - { - Token t = tok[pos]; - if (t.Type != TokenType.Keyword) continue; - if (t.Text != "IN") continue; - CollapseInList(tok, ref pos); - } - } - - private static Token GetNextRealToken(List tok, ref int pos) - { - while (++pos < tok.Count) - { - if (tok[pos].IsRealToken) return tok[pos]; - } - return null; - } - - private static void CollapseInList(List tok, ref int pos) - { - Token t = GetNextRealToken(tok, ref pos); - // Debug.Assert(t.Text == "("); - if (t == null) - return; - - // if the first token is a keyword then we likely have a - // SELECT .. IN (SELECT ...) - t = GetNextRealToken(tok, ref pos); - if (t == null || t.Type == TokenType.Keyword) return; - - int start = pos; - // first find all the tokens that make up the in list - while (++pos < tok.Count) - { - t = tok[pos]; - if (t.Type == TokenType.CommandComment) return; - if (!t.IsRealToken) continue; - if (t.Text == "(") return; - if (t.Text == ")") break; - } - int stop = pos; - - for (int i = stop; i > start; i--) - tok.RemoveAt(i); - tok.Insert(++start, new Token(TokenType.Whitespace, " ")); - tok.Insert(++start, new Token(TokenType.Comment, "/* , ... */")); - tok.Insert(++start, new Token(TokenType.Whitespace, " ")); - tok.Insert(++start, new Token(TokenType.Symbol, ")")); - } - - private void TokenizeSql(string sql) - { - _pos = 0; - - while (_pos < sql.Length) - { - char c = sql[_pos]; - if (LetterStartsComment(c) && ConsumeComment()) - continue; - if (Char.IsWhiteSpace(c)) - ConsumeWhitespace(); - else if (c == '\'' || c == '\"' || c == '`') - ConsumeQuotedToken(c); - else if (!IsSpecialCharacter(c)) - ConsumeUnquotedToken(); - else - ConsumeSymbol(); - } - } - - private bool LetterStartsComment(char c) - { - return c == '#' || c == '/' || c == '-'; - } - - private bool IsSpecialCharacter(char c) - { - return !Char.IsLetterOrDigit(c) && c != '$' && c != '_' && c != '.'; - } - - private bool ConsumeComment() - { - char c = _fullSql[_pos]; - // make sure the comment starts correctly - if (c == '/' && ((_pos + 1) >= _fullSql.Length || _fullSql[_pos + 1] != '*')) return false; - if (c == '-' && ((_pos + 2) >= _fullSql.Length || _fullSql[_pos + 1] != '-' || _fullSql[_pos + 2] != ' ')) return false; - - string endingPattern = "\n"; - if (c == '/') - endingPattern = "*/"; - - int startingIndex = _pos; - - int index = _fullSql.IndexOf(endingPattern, _pos); - if (index == -1) - index = _fullSql.Length - 1; - else - index += endingPattern.Length; - string comment = _fullSql.Substring(_pos, index - _pos); - if (comment.StartsWith("/*!", StringComparison.Ordinal)) - _tokens.Add(new Token(TokenType.CommandComment, comment)); - _pos = index; - return true; - } - - private void ConsumeSymbol() - { - char c = _fullSql[_pos++]; - _tokens.Add(new Token(TokenType.Symbol, c.ToString())); - } - - private void ConsumeQuotedToken(char c) - { - bool escaped = false; - int start = _pos; - _pos++; - while (_pos < _fullSql.Length) - { - char x = _fullSql[_pos]; - - if (x == c && !escaped) break; - - if (escaped) - escaped = false; - else if (x == '\\') - escaped = true; - _pos++; - } - _pos++; - _tokens.Add(c == '\'' - ? new Token(TokenType.String, "?") - : new Token(TokenType.Identifier, _fullSql.Substring(start, _pos - start))); - } - - private void ConsumeUnquotedToken() - { - int startPos = _pos; - while (_pos < _fullSql.Length && !IsSpecialCharacter(_fullSql[_pos])) - _pos++; - string word = _fullSql.Substring(startPos, _pos - startPos); - double v; - if (Double.TryParse(word, out v)) - _tokens.Add(new Token(TokenType.Number, "?")); - else - { - Token t = new Token(TokenType.Identifier, word); - if (IsKeyword(word)) - { - t.Type = TokenType.Keyword; - t.Text = t.Text.ToUpperInvariant(); - } - _tokens.Add(t); - } - } - - private void ConsumeWhitespace() - { - _tokens.Add(new Token(TokenType.Whitespace, " ")); - while (_pos < _fullSql.Length && Char.IsWhiteSpace(_fullSql[_pos])) - _pos++; - } - - private static bool IsKeyword(string word) - { - return Keywords.Contains(word.ToUpperInvariant()); - } - } - - internal class Token - { - public TokenType Type; - public string Text; - public bool Output; - - public Token(TokenType type, string text) - { - Type = type; - Text = text; - Output = true; - } - - public bool IsRealToken => Type != TokenType.Comment && - Type != TokenType.CommandComment && - Type != TokenType.Whitespace && - Output; - } - - internal enum TokenType - { - Keyword, - String, - Number, - Symbol, - Identifier, - Comment, - CommandComment, - Whitespace - } -} \ No newline at end of file +// Copyright © 2009, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace MySql.Data.Common +{ + internal class QueryNormalizer + { + private static readonly List Keywords = new List(); + private readonly List _tokens = new List(); + private int _pos; + private string _fullSql; + private string _queryType; + + static QueryNormalizer() + { + Keywords = SchemaProvider.GetReservedWords().AsDataTable(). + Select(). + Select(x => x[0].ToString()).ToList(); + } + + public string QueryType => _queryType; + + public string Normalize(string sql) + { + _tokens.Clear(); + StringBuilder newSql = new StringBuilder(); + _fullSql = sql; + + TokenizeSql(sql); + DetermineStatementType(_tokens); + ProcessMathSymbols(_tokens); + CollapseValueLists(_tokens); + CollapseInLists(_tokens); + CollapseWhitespace(_tokens); + + foreach (Token t in _tokens.Where(t => t.Output)) + newSql.Append(t.Text); + + return newSql.ToString(); + } + + private void DetermineStatementType(List tok) + { + foreach (Token t in tok.Where(t => t.Type == TokenType.Keyword)) + { + _queryType = t.Text.ToUpperInvariant(); + break; + } + } + + /// + /// Mark - or + signs that are unary ops as no output + /// + /// + private static void ProcessMathSymbols(List tok) + { + Token lastToken = null; + + foreach (Token t in tok) + { + if (t.Type == TokenType.Symbol && + (t.Text == "-" || t.Text == "+")) + { + if (lastToken != null && + lastToken.Type != TokenType.Number && + lastToken.Type != TokenType.Identifier && + (lastToken.Type != TokenType.Symbol || lastToken.Text != ")")) + t.Output = false; + } + if (t.IsRealToken) + lastToken = t; + } + } + + private static void CollapseWhitespace(List tok) + { + Token lastToken = null; + + foreach (Token t in tok) + { + if (t.Output && + t.Type == TokenType.Whitespace && + lastToken != null && + lastToken.Type == TokenType.Whitespace) + { + t.Output = false; + } + if (t.Output) + lastToken = t; + } + } + + private void CollapseValueLists(List tok) + { + int pos = -1; + while (++pos < tok.Count) + { + Token t = tok[pos]; + if (t.Type != TokenType.Keyword) continue; + if (!t.Text.StartsWith("VALUE", StringComparison.OrdinalIgnoreCase)) continue; + CollapseValueList(tok, ref pos); + } + } + + private void CollapseValueList(List tok, ref int pos) + { + List parenIndices = new List(); + + // this while loop will find all closing parens in this value list + while (true) + { + // find the close ')' + while (++pos < tok.Count) + { + if (tok[pos].Type == TokenType.Symbol && tok[pos].Text == ")") + break; + if (pos == tok.Count - 1) + break; + } + parenIndices.Add(pos); + + // now find the next "real" token + while (++pos < tok.Count) + if (tok[pos].IsRealToken) break; + if (pos == tok.Count) break; + + if (tok[pos].Text == ",") continue; + pos--; + break; + } + + // if we only have 1 value then we don't collapse + if (parenIndices.Count < 2) return; + int index = parenIndices[0]; + tok[++index] = new Token(TokenType.Whitespace, " "); + tok[++index] = new Token(TokenType.Comment, "/* , ... */"); + index++; + + // now mark all the other tokens as no output + while (index <= parenIndices[parenIndices.Count - 1]) + tok[index++].Output = false; + } + + private void CollapseInLists(List tok) + { + int pos = -1; + while (++pos < tok.Count) + { + Token t = tok[pos]; + if (t.Type != TokenType.Keyword) continue; + if (t.Text != "IN") continue; + CollapseInList(tok, ref pos); + } + } + + private static Token GetNextRealToken(List tok, ref int pos) + { + while (++pos < tok.Count) + { + if (tok[pos].IsRealToken) return tok[pos]; + } + return null; + } + + private static void CollapseInList(List tok, ref int pos) + { + Token t = GetNextRealToken(tok, ref pos); + // Debug.Assert(t.Text == "("); + if (t == null) + return; + + // if the first token is a keyword then we likely have a + // SELECT .. IN (SELECT ...) + t = GetNextRealToken(tok, ref pos); + if (t == null || t.Type == TokenType.Keyword) return; + + int start = pos; + // first find all the tokens that make up the in list + while (++pos < tok.Count) + { + t = tok[pos]; + if (t.Type == TokenType.CommandComment) return; + if (!t.IsRealToken) continue; + if (t.Text == "(") return; + if (t.Text == ")") break; + } + int stop = pos; + + for (int i = stop; i > start; i--) + tok.RemoveAt(i); + tok.Insert(++start, new Token(TokenType.Whitespace, " ")); + tok.Insert(++start, new Token(TokenType.Comment, "/* , ... */")); + tok.Insert(++start, new Token(TokenType.Whitespace, " ")); + tok.Insert(++start, new Token(TokenType.Symbol, ")")); + } + + private void TokenizeSql(string sql) + { + _pos = 0; + + while (_pos < sql.Length) + { + char c = sql[_pos]; + if (LetterStartsComment(c) && ConsumeComment()) + continue; + if (Char.IsWhiteSpace(c)) + ConsumeWhitespace(); + else if (c == '\'' || c == '\"' || c == '`') + ConsumeQuotedToken(c); + else if (!IsSpecialCharacter(c)) + ConsumeUnquotedToken(); + else + ConsumeSymbol(); + } + } + + private bool LetterStartsComment(char c) + { + return c == '#' || c == '/' || c == '-'; + } + + private bool IsSpecialCharacter(char c) + { + return !Char.IsLetterOrDigit(c) && c != '$' && c != '_' && c != '.'; + } + + private bool ConsumeComment() + { + char c = _fullSql[_pos]; + // make sure the comment starts correctly + if (c == '/' && ((_pos + 1) >= _fullSql.Length || _fullSql[_pos + 1] != '*')) return false; + if (c == '-' && ((_pos + 2) >= _fullSql.Length || _fullSql[_pos + 1] != '-' || _fullSql[_pos + 2] != ' ')) return false; + + string endingPattern = "\n"; + if (c == '/') + endingPattern = "*/"; + + int startingIndex = _pos; + + int index = _fullSql.IndexOf(endingPattern, _pos); + if (index == -1) + index = _fullSql.Length - 1; + else + index += endingPattern.Length; + string comment = _fullSql.Substring(_pos, index - _pos); + if (comment.StartsWith("/*!", StringComparison.Ordinal)) + _tokens.Add(new Token(TokenType.CommandComment, comment)); + _pos = index; + return true; + } + + private void ConsumeSymbol() + { + char c = _fullSql[_pos++]; + _tokens.Add(new Token(TokenType.Symbol, c.ToString())); + } + + private void ConsumeQuotedToken(char c) + { + bool escaped = false; + int start = _pos; + _pos++; + while (_pos < _fullSql.Length) + { + char x = _fullSql[_pos]; + + if (x == c && !escaped) break; + + if (escaped) + escaped = false; + else if (x == '\\') + escaped = true; + _pos++; + } + _pos++; + _tokens.Add(c == '\'' + ? new Token(TokenType.String, "?") + : new Token(TokenType.Identifier, _fullSql.Substring(start, _pos - start))); + } + + private void ConsumeUnquotedToken() + { + int startPos = _pos; + while (_pos < _fullSql.Length && !IsSpecialCharacter(_fullSql[_pos])) + _pos++; + string word = _fullSql.Substring(startPos, _pos - startPos); + double v; + if (double.TryParse( + word, + System.Globalization.NumberStyles.Any, + System.Globalization.CultureInfo.InvariantCulture, + out v)) + _tokens.Add(new Token(TokenType.Number, "?")); + else + { + Token t = new Token(TokenType.Identifier, word); + if (IsKeyword(word)) + { + t.Type = TokenType.Keyword; + t.Text = t.Text.ToUpperInvariant(); + } + _tokens.Add(t); + } + } + + private void ConsumeWhitespace() + { + _tokens.Add(new Token(TokenType.Whitespace, " ")); + while (_pos < _fullSql.Length && Char.IsWhiteSpace(_fullSql[_pos])) + _pos++; + } + + private static bool IsKeyword(string word) + { + return Keywords.Contains(word.ToUpperInvariant()); + } + } + + internal class Token + { + public TokenType Type; + public string Text; + public bool Output; + + public Token(TokenType type, string text) + { + Type = type; + Text = text; + Output = true; + } + + public bool IsRealToken => Type != TokenType.Comment && + Type != TokenType.CommandComment && + Type != TokenType.Whitespace && + Output; + } + + internal enum TokenType + { + Keyword, + String, + Number, + Symbol, + Identifier, + Comment, + CommandComment, + Whitespace + } +} diff --git a/MySQL.Data/src/common/Ssl.cs b/MySQL.Data/src/common/Ssl.cs new file mode 100644 index 000000000..394a7ac7e --- /dev/null +++ b/MySQL.Data/src/common/Ssl.cs @@ -0,0 +1,370 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.common; +using MySql.Data.MySqlClient; +using Org.BouncyCastle.Crypto.Parameters; +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.Pkcs; +using System; +using System.Collections.Generic; +using System.IO; +using System.Net.Security; +using System.Security.Authentication; +using System.Security.Cryptography; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Org.BouncyCastle.OpenSsl; +using Org.BouncyCastle.Utilities.IO.Pem; + +namespace MySql.Data.Common +{ + /// + /// Handles SSL connections for the Classic and X protocols. + /// + internal class Ssl + { + #region Fields + + /// + /// Contains the connection options provided by the user. + /// + private MySqlConnectionStringBuilder _settings; + + /// + /// A flag to establish how certificates are to be treated and validated. + /// + private bool _treatCertificatesAsPemFormat; + + /// + /// Defines the supported TLS protocols. + /// + private static SslProtocols[] tlsProtocols = new SslProtocols[] { SslProtocols.Tls12}; + private static Dictionary tlsConnectionRef = new Dictionary(); + private static Dictionary tlsRetry = new Dictionary(); + private static SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1, 1); + + #endregion + + public Ssl(MySqlConnectionStringBuilder settings) + { + this._settings = settings; + // Set default value to true since PEM files is the standard for MySQL SSL certificates. + _treatCertificatesAsPemFormat = true; + } + + public Ssl(string server, MySqlSslMode sslMode, string certificateFile, MySqlCertificateStoreLocation certificateStoreLocation, + string certificatePassword, string certificateThumbprint, string sslCa, string sslCert, string sslKey, string tlsVersion, uint connectionTimeout) + { + this._settings = new MySqlConnectionStringBuilder() + { + Server = server, + SslMode = sslMode, + CertificateFile = certificateFile, + CertificateStoreLocation = certificateStoreLocation, + CertificatePassword = certificatePassword, + CertificateThumbprint = certificateThumbprint, + SslCa = sslCa, + SslCert = sslCert, + SslKey = sslKey, + TlsVersion = tlsVersion, + ConnectionTimeout = connectionTimeout + }; + // Set default value to true since PEM files is the standard for MySQL SSL certificates. + _treatCertificatesAsPemFormat = true; + } + + /// + /// Retrieves a certificate from PEM file. + /// + private X509Certificate2 GetCertificateFromPEM(string certificatePath, string certificatePassword) + { + var certParser = new Org.BouncyCastle.X509.X509CertificateParser(); + var cert = certParser.ReadCertificate(File.ReadAllBytes(certificatePath)); + return new X509Certificate2(cert.GetEncoded(), certificatePassword); + } + + + /// + /// Retrieves a collection containing the client SSL PFX certificates. + /// + /// Dependent on connection string settings. + /// Either file or store based certificates are used. + private X509CertificateCollection GetPFXClientCertificates() + { + X509CertificateCollection certs = new X509CertificateCollection(); + + // Check for file-based certificate + if (_settings.CertificateFile != null) + { + if (_treatCertificatesAsPemFormat) + { + certs.Add(GetCertificateFromPEM(_settings.CertificateFile, _settings.CertificatePassword)); + return certs; + } + else + { + X509Certificate2 clientCert = new X509Certificate2(_settings.CertificateFile, + _settings.CertificatePassword); + certs.Add(clientCert); + return certs; + } + } + + if (_settings.CertificateStoreLocation == MySqlCertificateStoreLocation.None) + return certs; + + StoreLocation location = + (_settings.CertificateStoreLocation == MySqlCertificateStoreLocation.CurrentUser) ? + StoreLocation.CurrentUser : StoreLocation.LocalMachine; + + try + { + // Check for store-based certificate + X509Store store = new X509Store(StoreName.My, location); + store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); + + + if (_settings.CertificateThumbprint == null) + { + // Return all certificates from the store. + certs.AddRange(store.Certificates); + + if (certs.Count == 0) + throw new MySqlException("No certificates were found in the certificate store"); + + return certs; + } + else + { + bool validateCert = _settings.SslMode == MySqlSslMode.VerifyCA || _settings.SslMode == MySqlSslMode.VerifyFull; + + // Find certificate with given thumbprint + certs.AddRange(store.Certificates.Find(X509FindType.FindByThumbprint, + _settings.CertificateThumbprint, validateCert)); + + if (certs.Count == 0) + throw new MySqlException(String.Format(Resources.InvalidCertificateThumbprint, _settings.CertificateThumbprint)); + + return certs; + } + } + catch (CryptographicException ex) + { + throw new MySqlException("Certificate couldn't be loaded from the CertificateStoreLocation", ex); + } + } + + /// + /// Initiates the SSL connection. + /// + /// The base stream. + /// The encoding used in the SSL connection. + /// The connection string used to establish the connection. + /// Boolean that indicates if the function will be executed asynchronously. + /// The cancellation token. + /// A instance ready to initiate an SSL connection. + public async Task> StartSSLAsync(Stream baseStream, Encoding encoding, string connectionString, CancellationToken cancellationToken, bool execAsync) + { + // If SslCa connection option was provided, check for the file extension as it can also be set as a PFX file. + if (_settings.SslCa != null) + { + var fileExtension = GetCertificateFileExtension(_settings.SslCa, true); + + if (fileExtension != null) + _treatCertificatesAsPemFormat = fileExtension != "pfx"; + } + + RemoteCertificateValidationCallback sslValidateCallback = new RemoteCertificateValidationCallback(ServerCheckValidation); + SslStream sslStream = new SslStream(baseStream, false, sslValidateCallback, null); + X509CertificateCollection certs = (_treatCertificatesAsPemFormat && + _settings.CertificateStoreLocation == MySqlCertificateStoreLocation.None) + ? new X509CertificateCollection() + : GetPFXClientCertificates(); + + string connectionId = connectionString.GetHashCode().ToString(); + SslProtocols tlsProtocol = SslProtocols.None; + + if (_settings.TlsVersion != null) + { + SslProtocols sslProtocolsToUse = (SslProtocols)Enum.Parse(typeof(SslProtocols), _settings.TlsVersion); + List listProtocols = new List(); + +#if NET5_0_OR_GREATER + if (sslProtocolsToUse.HasFlag(SslProtocols.Tls13)) + listProtocols.Add(SslProtocols.Tls13); +#else + // 12288 represents the numerical value of SslProtocols.Tls13 enum option. + if (sslProtocolsToUse.HasFlag((SslProtocols)12288)) + listProtocols.Add((SslProtocols)12288); +#endif + + if (sslProtocolsToUse.HasFlag(SslProtocols.Tls12)) + listProtocols.Add(SslProtocols.Tls12); + + tlsProtocols = listProtocols.ToArray(); + } + + if (execAsync) + await semaphoreSlim.WaitAsync(cancellationToken).ConfigureAwait(false); + else + semaphoreSlim.Wait(cancellationToken); + + + try + { + if (tlsConnectionRef.TryGetValue(connectionId, out var protocol)) + { + tlsProtocol = protocol; + } + else + { + if (!tlsRetry.ContainsKey(connectionId)) + { + lock (tlsRetry) + { + tlsRetry[connectionId] = 0; + } + } + for (int i = tlsRetry[connectionId]; i < tlsProtocols.Length; i++) + { + tlsProtocol |= tlsProtocols[i]; + } + } + } + finally + { + semaphoreSlim.Release(); + } + + + try + { + tlsProtocol = (tlsProtocol == SslProtocols.None) ? SslProtocols.Tls12 : tlsProtocol; + + if (execAsync) + { + using (cancellationToken.Register(() => throw new AggregateException($"Authentication to host '{_settings.Server}' failed.", new IOException()))) + await sslStream.AuthenticateAsClientAsync(_settings.Server, certs, tlsProtocol, false).ConfigureAwait(false); + } + else + { + using (cancellationToken.Register(() => throw new AggregateException($"Authentication to host '{_settings.Server}' failed.", new IOException()))) + sslStream.AuthenticateAsClientAsync(_settings.Server, certs, tlsProtocol, false).GetAwaiter().GetResult(); + } + + lock (tlsConnectionRef) + { + tlsConnectionRef[connectionId] = tlsProtocol; + } + tlsRetry.Remove(connectionId); + } + catch (AggregateException ex) + { + if (ex.GetBaseException() is IOException) + { + tlsConnectionRef.Remove(connectionId); + if (tlsRetry.ContainsKey(connectionId)) + { + if (tlsRetry[connectionId] > tlsProtocols.Length) + throw new MySqlException(Resources.SslConnectionError, ex); + tlsRetry[connectionId] += 1; + } + } + throw ex.GetBaseException(); + } + + baseStream = sslStream; + MySqlStream stream = new MySqlStream(sslStream, encoding, false); + stream.SequenceByte = 2; + + return new Tuple(stream, baseStream); + } + + /// + /// Verifies the SSL certificates used for authentication. + /// + /// An object that contains state information for this validation. + /// The MySQL server certificate used to authenticate the remote party. + /// The chain of certificate authorities associated with the remote certificate. + /// One or more errors associated with the remote certificate. + /// true if no errors were found based on the selected SSL mode; false, otherwise. + private bool ServerCheckValidation(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) + { + if (sslPolicyErrors == SslPolicyErrors.None) + return true; + + if (_settings.SslMode == MySqlSslMode.Required || + _settings.SslMode == MySqlSslMode.Preferred) + { + // Tolerate all certificate errors. + return true; + } + + // Validate PEM certificates using Bouncy Castle. + if (_treatCertificatesAsPemFormat) + { + SslPemCertificateValidator.ValidateCertificate(chain, _settings); + return true; + } + // Validate PFX certificate errors. + else if (_settings.SslMode == MySqlSslMode.VerifyCA && + sslPolicyErrors == SslPolicyErrors.RemoteCertificateNameMismatch) + { + // Tolerate name mismatch in certificate, if full validation is not requested. + return true; + } + + return false; + } + + /// + /// Gets the extension of the specified file. + /// + /// The path of the file. + /// Flag to indicate if the result should be converted to lower case. + /// The . character is ommited from the result. + /// + private string GetCertificateFileExtension(string filePath, bool toLowerCase) + { + if (filePath == null || !File.Exists(filePath)) + return null; + + var extension = Path.GetExtension(filePath); + extension = string.IsNullOrEmpty(extension) + ? null + : extension.Substring(extension.IndexOf(".") + 1); + + return toLowerCase + ? extension.ToLowerInvariant() + : extension; + } + } +} diff --git a/MySQL.Data/src/common/SslPemCertificateValidator.cs b/MySQL.Data/src/common/SslPemCertificateValidator.cs new file mode 100644 index 000000000..8186ea6b6 --- /dev/null +++ b/MySQL.Data/src/common/SslPemCertificateValidator.cs @@ -0,0 +1,307 @@ +// Copyright © 2019, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.OpenSsl; +using Org.BouncyCastle.Security; +using Org.BouncyCastle.Security.Certificates; +using System; +using System.IO; +using System.Net.Security; +using System.Security.Cryptography.X509Certificates; + +namespace MySql.Data.common +{ + /// + /// Provides functionality to read SSL PEM certificates and to perform multiple validations via Bouncy Castle. + /// + internal static class SslPemCertificateValidator + { + public static void ValidateCertificate(X509Chain chain, MySqlBaseConnectionStringBuilder settings) + { + if (settings.SslMode >= MySqlSslMode.VerifyCA) + { + VerifyEmptyOrWhitespaceSslConnectionOption(settings.SslCa, nameof(settings.SslCa)); + var sslCA = ReadSslCertificate(settings.SslCa); + + foreach (var x509ChainElement in chain.ChainElements) + { + var cert = DotNetUtilities.FromX509Certificate(x509ChainElement.Certificate); + VerifyDates(cert); + } + + var serverCertificate = chain.ChainElements[chain.ChainElements.Count - 1].Certificate; + VerifyIssuer(sslCA, serverCertificate); + VerifyDates(sslCA); + VerifyCAStatus(sslCA, true); + VerifySignature(sslCA, DotNetUtilities.FromX509Certificate(serverCertificate)); + } + + if (settings.SslMode == MySqlSslMode.VerifyFull) + { + VerifyEmptyOrWhitespaceSslConnectionOption(settings.SslCert, nameof(settings.SslCert)); + var sslCert = ReadSslCertificate(settings.SslCert); + VerifyDates(sslCert); + VerifyCAStatus(sslCert, false); + VerifyEmptyOrWhitespaceSslConnectionOption(settings.SslKey, nameof(settings.SslKey)); + var sslKey = ReadKey(settings.SslKey); + VerifyKeyCorrespondsToCertificateKey(sslCert, sslKey); + } + } + + /// + /// Raises an exception if the specified connection option is null, empty or whitespace. + /// + /// The connection option to verify. + /// The name of the connection option. + private static void VerifyEmptyOrWhitespaceSslConnectionOption(string connectionOption, string connectionOptionName) + { + if (string.IsNullOrWhiteSpace(connectionOption)) + throw new MySqlException( + Resources.SslConnectionError, + new FileNotFoundException(string.Format(Resources.FilePathNotSet, connectionOptionName))); + } + + #region Certificate Readers + + /// + /// Reads the specified file as a byte array. + /// + /// The path of the file to read. + /// A byte array representing the read file. + private static byte[] GetBuffer(string filePath) + { + byte[] buffer; + if (filePath == null) + { + throw new ArgumentNullException(nameof(filePath)); + } + + try + { + FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + buffer = new byte[stream.Length]; + int offset = stream.Read(buffer, 0, buffer.Length); + while (true) + { + if (offset >= stream.Length) + { + stream.Close(); + break; + } + offset += stream.Read(buffer, offset, buffer.Length - offset); + } + } + catch (Exception) + { + throw new MySqlException(Resources.SslConnectionError, new FileNotFoundException(Resources.FileNotFound, filePath)); + } + + return buffer; + } + + /// + /// Reads the SSL certificate file. + /// + /// The path to the certificate file. + /// A instance representing the SSL certificate file. + private static Org.BouncyCastle.X509.X509Certificate ReadSslCertificate(string filePath) + { + byte[] buffer = GetBuffer(filePath); + var PR = new PemReader(new StreamReader(new MemoryStream(buffer))); + + try + { + var certificate = (Org.BouncyCastle.X509.X509Certificate)PR.ReadObject(); + if (certificate == null) + throw new InvalidCastException(); + + return certificate; + } + catch (InvalidCastException) + { + throw new MySqlException(Resources.SslConnectionError, new Exception(Resources.FileIsNotACertificate)); + } + } + + /// + /// Reads the SSL certificate key file. + /// + /// The path to the certificate key file. + /// A instance representing the SSL certificate key file. + private static AsymmetricCipherKeyPair ReadKey(string filePath) + { + byte[] buffer = GetBuffer(filePath); + var PR = new PemReader(new StreamReader(new MemoryStream(buffer))); + + try + { + var key = (AsymmetricCipherKeyPair)PR.ReadObject(); + if (key == null) + throw new InvalidCastException(); + + return key; + } + catch (InvalidCastException) + { + throw new MySqlException(Resources.SslConnectionError, new Exception(Resources.FileIsNotAKey)); + } + } + + #endregion + + #region Certificate Veryfiers + + /// + /// Verifies that the certificate has not yet expired. + /// + /// The certificate to verify. + private static void VerifyDates(Org.BouncyCastle.X509.X509Certificate certificate) + { + try + { + certificate.CheckValidity(); + } + catch (CertificateExpiredException exception) + { + throw new MySqlException(Resources.SslConnectionError, exception); + } + catch (CertificateNotYetValidException exception) + { + throw new MySqlException(Resources.SslConnectionError, exception); + } + } + + /// + /// Verifies a certificate CA status. + /// + /// The certificate to validate. + /// A flag indicating the expected CA status. + private static void VerifyCAStatus(Org.BouncyCastle.X509.X509Certificate certificate, bool expectedCAStatus) + { + bool? isCA = IsCA(certificate, out var certificatePathLength); + if (isCA == true && !expectedCAStatus) + throw new MySqlException(Resources.SslConnectionError, new Exception(Resources.InvalidSslCertificate)); + else if (expectedCAStatus && certificate.Version == 3 && (isCA == false || isCA == null)) + throw new MySqlException(Resources.SslConnectionError, new Exception(Resources.SslCertificateIsNotCA)); + } + + /// + /// Verifies that the certificate was signed using the private key that corresponds to the specified public key + /// + /// The client side certificate containing the public key. + /// The server certificate. + private static void VerifySignature(Org.BouncyCastle.X509.X509Certificate certificate, Org.BouncyCastle.X509.X509Certificate serverCertificate) + { + VerifySignature(serverCertificate, certificate.GetPublicKey()); + } + + private static void VerifySignatureUsingKey(Org.BouncyCastle.X509.X509Certificate certificate, AsymmetricCipherKeyPair key) + { + VerifySignature(certificate, key.Public); + } + + private static void VerifySignature(Org.BouncyCastle.X509.X509Certificate certificate, AsymmetricKeyParameter key) + { + try + { + certificate.Verify(key); + } + catch (InvalidKeyException exception) + { + throw new Exception(Resources.InvalidCertificateKey, exception); + } + catch (SignatureException exception) + { + throw new Exception(Resources.InvalidSslCertificateSignature, exception); + } + catch (CertificateException exception) + { + throw new Exception(Resources.EncodingError, exception); + } + catch (Exception exception) + { + throw new Exception(Resources.InvalidSslCertificateSignatureGeneral, exception); + } + } + + /// + /// Verifies that no SSL policy errors regarding the identitfy of the host were raised. + /// + /// A instance set with the raised SSL errors. + private static void VerifyIdentity(SslPolicyErrors sslPolicyErrors) + { + if (sslPolicyErrors == SslPolicyErrors.RemoteCertificateNameMismatch) + throw new MySqlException(Resources.SslConnectionError, new Exception(Resources.SslCertificateHostNameMismatch)); + } + + /// + /// Verifies that the issuer matches the CA by comparing the CA certificate issuer and the server certificate issuer. + /// + /// The CA certificate. + /// The server certificate. + private static void VerifyIssuer(Org.BouncyCastle.X509.X509Certificate CACertificate, X509Certificate serverCertificate) + { + var certificate = new X509Certificate(CACertificate.GetEncoded()); + + if (certificate.Issuer != serverCertificate.Issuer) + throw new MySqlException(Resources.SslConnectionError, new Exception(Resources.SslCertificateCAMismatch)); + } + + private static void VerifyKeyCorrespondsToCertificateKey(Org.BouncyCastle.X509.X509Certificate certificate, AsymmetricCipherKeyPair key) + { + var certificateKey = certificate.GetPublicKey().ToString(); + if (!string.IsNullOrEmpty(certificateKey) && certificateKey != key.Public.ToString()) + throw new InvalidKeyException(); + } + + /// Validates that the certificate provided is a CA certificate. + /// + /// The certificate to validate. + /// The allowed certification path length. + /// null if the certificate info does not allow to determine the CA status; + /// otherwise, a boolean value indicating the CA status. + private static bool? IsCA(Org.BouncyCastle.X509.X509Certificate certificate, out int certificationPathLength) + { + // If certificate version equal to 3 then the isCA property can be retrieved. + if (certificate.Version == 3) + { + // A value of -1 indicates certificate is not a CA. + // A value of Integer.MAX_VALUE indicates there is no limit on the allowed length of the certification path. + certificationPathLength = certificate.GetBasicConstraints(); + return certificationPathLength != -1; + } + + certificationPathLength = -1; + return null; + } + + #endregion + } +} diff --git a/MySQL.Data/src/common/StreamCreator.cs b/MySQL.Data/src/common/StreamCreator.cs new file mode 100644 index 000000000..4b77c7c7b --- /dev/null +++ b/MySQL.Data/src/common/StreamCreator.cs @@ -0,0 +1,249 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySql.Data.MySqlClient.Common; +using System; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Runtime.CompilerServices; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.Data.Common +{ + /// + /// Summary description for StreamCreator. + /// + internal class StreamCreator + { + readonly string _hostList; + uint _port; + string pipeName; + uint keepalive; + DBVersion driverVersion; + + public StreamCreator(string hosts, uint port, string pipeName, uint keepalive, DBVersion driverVersion) + { + _hostList = hosts; + if (string.IsNullOrEmpty(_hostList)) + _hostList = "localhost"; + this._port = port; + this.pipeName = pipeName; + this.keepalive = keepalive; + this.driverVersion = driverVersion; + } + + public static Tuple GetStream(string server, uint port, string pipename, uint keepalive, DBVersion v, uint timeout) + { + MySqlConnectionStringBuilder settings = new MySqlConnectionStringBuilder + { + Server = server, + Port = port, + PipeName = pipename, + Keepalive = keepalive, + ConnectionTimeout = timeout + }; + + return GetStreamAsync(settings, CancellationToken.None, false).GetAwaiter().GetResult(); + } + + public static async Task> GetStreamAsync(MySqlConnectionStringBuilder settings, CancellationToken cancellationToken, bool execAsync) + { + switch (settings.ConnectionProtocol) + { + case MySqlConnectionProtocol.Tcp: + return await GetTcpStreamAsync(settings, cancellationToken, execAsync).ConfigureAwait(false); + case MySqlConnectionProtocol.UnixSocket: + return await GetUnixSocketStreamAsync(settings, cancellationToken, execAsync).ConfigureAwait(false); + case MySqlConnectionProtocol.SharedMemory: + return GetSharedMemoryStream(settings); + case MySqlConnectionProtocol.NamedPipe: + return GetNamedPipeStream(settings); + } + throw new InvalidOperationException(Resources.UnknownConnectionProtocol); + } + + private static async Task> GetTcpStreamAsync(MySqlConnectionStringBuilder settings, + CancellationToken cancellationToken, bool execAsync) + { + IPAddress[] ipAddresses; + + try + { + ipAddresses = execAsync ? await Dns.GetHostAddressesAsync(settings.Server).ConfigureAwait(false) : Dns.GetHostAddresses(settings.Server); + } + catch (SocketException) + { + throw new ArgumentException(Resources.InvalidHostNameOrAddress); + } + + IPAddress addr = ipAddresses.FirstOrDefault(c => c.AddressFamily == AddressFamily.InterNetwork) ?? ipAddresses[0]; + TcpClient tcpClient = new TcpClient(addr.AddressFamily); + + if (execAsync) + { + try + { + using (cancellationToken.Register(() => tcpClient.Dispose())) + { +#if NETFRAMEWORK || NETSTANDARD2_1 || NETSTANDARD2_0 + await tcpClient.ConnectAsync(settings.Server, (int)settings.Port).ConfigureAwait(false); +#else + await tcpClient.ConnectAsync(settings.Server, (int)settings.Port, cancellationToken).ConfigureAwait(false); +#endif + } + } + catch (Exception ex) when (ex is SocketException or ObjectDisposedException && cancellationToken.IsCancellationRequested) + { + throw new MySqlException(Resources.Timeout, new TimeoutException()); + } + } + else + if (!tcpClient.ConnectAsync(settings.Server, (int)settings.Port).Wait((int)settings.ConnectionTimeout * 1000)) + throw new MySqlException(Resources.Timeout, new TimeoutException()); + + if (settings.Keepalive > 0) + SetKeepAlive(tcpClient.Client, settings.Keepalive); + + MyNetworkStream myNetworkStream = new MyNetworkStream(tcpClient.Client, true); + var stream = tcpClient.GetStream(); + GC.SuppressFinalize(stream); + + return new Tuple(stream, myNetworkStream); + } + + internal static async Task> GetUnixSocketStreamAsync(MySqlConnectionStringBuilder settings, CancellationToken cancellationToken, bool execAsync) + { + try + { + var networkStream = new MyNetworkStream(await GetUnixSocketAsync(settings.Server, settings.ConnectionTimeout, settings.Keepalive, cancellationToken, execAsync).ConfigureAwait(false), true); + var stream = new NetworkStream(networkStream.Socket, true); + return new Tuple(stream, networkStream); + } + catch (Exception) + { + throw; + } + } + + internal static async Task GetUnixSocketAsync(string server, uint connectionTimeout, uint keepAlive, CancellationToken cancellationToken, bool execAsync) + { + if (Platform.IsWindows()) + throw new InvalidOperationException(Resources.NoUnixSocketsOnWindows); + + EndPoint endPoint = new UnixEndPoint(server); + Socket socket = new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.IP); + + if (keepAlive > 0) + SetKeepAlive(socket, keepAlive); + + try + { + socket.ReceiveTimeout = (int)connectionTimeout * 1000; + +#if NET6_0_OR_GREATER + if (execAsync) + await socket.ConnectAsync(endPoint, cancellationToken).ConfigureAwait(false); + else + socket.Connect(endPoint); +#else + socket.Connect(endPoint); +#endif + return socket; + } + catch (Exception) + { + socket.Dispose(); + throw; + } + } + + private static Tuple GetSharedMemoryStream(MySqlConnectionStringBuilder settings) + { + SharedMemoryStream stream = new SharedMemoryStream(settings.SharedMemoryName); + stream.Open(settings.ConnectionTimeout); + return new Tuple(stream, null); + } + + private static Tuple GetNamedPipeStream(MySqlConnectionStringBuilder settings) + { + Stream stream = NamedPipeStream.Create(settings.PipeName, settings.Server, settings.ConnectionTimeout); + return new Tuple(stream, null); + } + + /// + /// Set the keepalive timeout on the socket. + /// + /// The socket object. + /// The keepalive timeout, in seconds. + internal static void SetKeepAlive(Socket s, uint time) + { + uint on = 1; + uint interval = 1000; // default interval = 1 sec + + uint timeMilliseconds; + if (time > UInt32.MaxValue / 1000) + timeMilliseconds = UInt32.MaxValue; + else + timeMilliseconds = time * 1000; + + // Use Socket.IOControl to implement equivalent of + // WSAIoctl with SOL_KEEPALIVE_VALS + + // the native structure passed to WSAIoctl is + //struct tcp_keepalive { + // ULONG onoff; + // ULONG keepalivetime; + // ULONG keepaliveinterval; + //}; + // marshal the equivalent of the native structure into a byte array + + byte[] inOptionValues = new byte[12]; + BitConverter.GetBytes(on).CopyTo(inOptionValues, 0); + BitConverter.GetBytes(timeMilliseconds).CopyTo(inOptionValues, 4); + BitConverter.GetBytes(interval).CopyTo(inOptionValues, 8); + try + { + // call WSAIoctl via IOControl + s.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null); + return; + } + catch (NotImplementedException) + { + // Mono throws not implemented currently + } + // Fallback if Socket.IOControl is not available ( Compact Framework ) + // or not implemented ( Mono ). Keepalive option will still be set, but + // with timeout is kept default. + s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, 1); + } + } +} diff --git a/MySQL.Data/src/common/StringUtility.cs b/MySQL.Data/src/common/StringUtility.cs new file mode 100644 index 000000000..041397427 --- /dev/null +++ b/MySQL.Data/src/common/StringUtility.cs @@ -0,0 +1,45 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +namespace MySql.Data.Common +{ + internal class StringUtility + { + public static string ToUpperInvariant(string s) + { + return s.ToUpperInvariant(); + } + + public static string ToLowerInvariant(string s) + { + return s.ToLowerInvariant(); + } + + } +} diff --git a/MySQL.Data/src/common/UnixEndPoint.cs b/MySQL.Data/src/common/UnixEndPoint.cs new file mode 100644 index 000000000..71ea2cba7 --- /dev/null +++ b/MySQL.Data/src/common/UnixEndPoint.cs @@ -0,0 +1,68 @@ +// Copyright © 2017, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Net; +using System.Text; + +namespace MySql.Data.Common +{ + [Serializable] + internal class UnixEndPoint : EndPoint + { + public string SocketName { get; private set; } + + public UnixEndPoint(string socketName) + { + this.SocketName = socketName; + } + + public override EndPoint Create(SocketAddress socketAddress) + { + int size = socketAddress.Size - 2; + byte[] bytes = new byte[size]; + for (int i = 0; i < size; i++) + { + bytes[i] = socketAddress[i + 2]; + } + return new UnixEndPoint(Encoding.UTF8.GetString(bytes)); + } + + public override SocketAddress Serialize() + { + byte[] bytes = Encoding.UTF8.GetBytes(SocketName); + SocketAddress socketAddress = new SocketAddress(System.Net.Sockets.AddressFamily.Unix, bytes.Length + 3); + for (int i = 0; i < bytes.Length; i++) + { + socketAddress[i + 2] = bytes[i]; + } + return socketAddress; + } + } +} diff --git a/MySQL.Data/src/common/Version.cs b/MySQL.Data/src/common/Version.cs new file mode 100644 index 000000000..e80dd3398 --- /dev/null +++ b/MySQL.Data/src/common/Version.cs @@ -0,0 +1,101 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using MySql.Data.MySqlClient; + +namespace MySql.Data.Common +{ + /// + /// Summary description for Version. + /// + internal struct DBVersion + { + private readonly string _srcString; + + public DBVersion(string s, int major, int minor, int build) + { + Major = major; + Minor = minor; + Build = build; + _srcString = s; + IsEnterprise = s.ToLowerInvariant().Contains("-enterprise-"); + } + + public int Major { get; } + + public int Minor { get; } + + public int Build { get; } + + public bool IsEnterprise + { + get; private set; + } + + public static DBVersion Parse(string versionString) + { + int start = 0; + int index = versionString.IndexOf('.', start); + if (index == -1) + throw new MySqlException(Resources.BadVersionFormat); + string val = versionString.Substring(start, index - start).Trim(); + int major = Convert.ToInt32(val, System.Globalization.NumberFormatInfo.InvariantInfo); + + start = index + 1; + index = versionString.IndexOf('.', start); + if (index == -1) + throw new MySqlException(Resources.BadVersionFormat); + val = versionString.Substring(start, index - start).Trim(); + int minor = Convert.ToInt32(val, System.Globalization.NumberFormatInfo.InvariantInfo); + + start = index + 1; + int i = start; + while (i < versionString.Length && Char.IsDigit(versionString, i)) + i++; + val = versionString.Substring(start, i - start).Trim(); + int build = Convert.ToInt32(val, System.Globalization.NumberFormatInfo.InvariantInfo); + + return new DBVersion(versionString, major, minor, build); + } + + public bool isAtLeast(int majorNum, int minorNum, int buildNum) + { + if (Major > majorNum) return true; + if (Major == majorNum && Minor > minorNum) return true; + if (Major == majorNum && Minor == minorNum && Build >= buildNum) return true; + return false; + } + + public override string ToString() + { + return _srcString; + } + + } +} diff --git a/Source/MySql.Data/common/NamedPipeStream.cs b/MySQL.Data/src/common/netstandard2_0/NamedPipeStream.cs similarity index 78% rename from Source/MySql.Data/common/NamedPipeStream.cs rename to MySQL.Data/src/common/netstandard2_0/NamedPipeStream.cs index 3dcc471a8..a3698477f 100644 --- a/Source/MySql.Data/common/NamedPipeStream.cs +++ b/MySQL.Data/src/common/netstandard2_0/NamedPipeStream.cs @@ -1,247 +1,250 @@ -// Copyright � 2009, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.IO; -using MySql.Data.MySqlClient; - -using Microsoft.Win32.SafeHandles; -using System.Threading; -using System.Diagnostics; -using System.Runtime.InteropServices; -using System.ComponentModel; -using System.Security.Permissions; -using System.Security; -using MySql.Data.Common; - -namespace MySql.Data.MySqlClient.Common -{ - /// - /// Summary description for API. - /// - [SuppressUnmanagedCodeSecurity()] - internal class NamedPipeStream : Stream - { - SafeFileHandle handle; - Stream fileStream; - int readTimeout = Timeout.Infinite; - int writeTimeout = Timeout.Infinite; - const int ERROR_PIPE_BUSY = 231; - const int ERROR_SEM_TIMEOUT = 121; - - public NamedPipeStream(string path, FileAccess mode, uint timeout) - { - Open(path, mode, timeout); - } - - void CancelIo() - { - bool ok = NativeMethods.CancelIo(handle.DangerousGetHandle()); - if (!ok) - throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error()); - } - - public void Open(string path, FileAccess mode, uint timeout) - { - IntPtr nativeHandle; - - for (; ; ) - { - NativeMethods.SecurityAttributes security = new NativeMethods.SecurityAttributes(); - security.inheritHandle = true; - security.Length = Marshal.SizeOf(security); - - nativeHandle = NativeMethods.CreateFile(path, NativeMethods.GENERIC_READ | NativeMethods.GENERIC_WRITE, - 0, security, NativeMethods.OPEN_EXISTING, NativeMethods.FILE_FLAG_OVERLAPPED, 0); - - if (nativeHandle != IntPtr.Zero) - break; - - if (Marshal.GetLastWin32Error() != ERROR_PIPE_BUSY) - { - throw new Win32Exception(Marshal.GetLastWin32Error(), - "Error opening pipe"); - } - MySql.Data.Common.LowResolutionStopwatch sw = MySql.Data.Common.LowResolutionStopwatch.StartNew(); - bool success = NativeMethods.WaitNamedPipe(path, timeout); - sw.Stop(); - if (!success) - { - if (timeout < sw.ElapsedMilliseconds || - Marshal.GetLastWin32Error() == ERROR_SEM_TIMEOUT) - { - throw new TimeoutException("Timeout waiting for named pipe"); - } - else - { - throw new Win32Exception(Marshal.GetLastWin32Error(), - "Error waiting for pipe"); - } - } - timeout -= (uint)sw.ElapsedMilliseconds; - } - handle = new SafeFileHandle(nativeHandle, true); - fileStream = new FileStream(handle, mode, 4096, true); - } - - public override bool CanRead - { - get { return fileStream.CanRead; } - } - - public override bool CanWrite - { - get { return fileStream.CanWrite; } - } - - public override bool CanSeek - { - get { throw new NotSupportedException(Resources.NamedPipeNoSeek); } - } - - public override long Length - { - get { throw new NotSupportedException(Resources.NamedPipeNoSeek); } - } - - public override long Position - { - get { throw new NotSupportedException(Resources.NamedPipeNoSeek); } - set { } - } - - public override void Flush() - { - fileStream.Flush(); - } - - public override int Read(byte[] buffer, int offset, int count) - { - if (readTimeout == Timeout.Infinite) - { - return fileStream.Read(buffer, offset, count); - } - IAsyncResult result = fileStream.BeginRead(buffer, offset, count, null, null); - if (result.CompletedSynchronously) - return fileStream.EndRead(result); - - if (!result.AsyncWaitHandle.WaitOne(readTimeout)) - { - CancelIo(); - throw new TimeoutException("Timeout in named pipe read"); - } - return fileStream.EndRead(result); - } - - - public override void Write(byte[] buffer, int offset, int count) - { - if (writeTimeout == Timeout.Infinite) - { - fileStream.Write(buffer, offset, count); - return; - } - IAsyncResult result = fileStream.BeginWrite(buffer, offset, count, null, null); - if (result.CompletedSynchronously) - { - fileStream.EndWrite(result); - } - - if (!result.AsyncWaitHandle.WaitOne(readTimeout)) - { - CancelIo(); - throw new TimeoutException("Timeout in named pipe write"); - } - fileStream.EndWrite(result); - } - - public override void Close() - { - if (handle != null && !handle.IsInvalid && !handle.IsClosed) - { - fileStream.Close(); - try - { - handle.Close(); - } - catch (Exception) - { - } - } - } - - public override void SetLength(long length) - { - throw new NotSupportedException(Resources.NamedPipeNoSetLength); - } - - - public override bool CanTimeout - { - get - { - return true; - } - } - - public override int ReadTimeout - { - get - { - return readTimeout; - } - set - { - readTimeout = value; - } - } - - public override int WriteTimeout - { - get - { - return writeTimeout; - } - set - { - writeTimeout = value; - } - } - - public override long Seek(long offset, SeekOrigin origin) - { - throw new NotSupportedException(Resources.NamedPipeNoSeek); - } - - internal static Stream Create(string pipeName, string hostname, uint timeout) - { - string pipePath; - if (0 == String.Compare(hostname, "localhost", true)) - pipePath = @"\\.\pipe\" + pipeName; - else - pipePath = String.Format(@"\\{0}\pipe\{1}", hostname, pipeName); - return new NamedPipeStream(pipePath, FileAccess.ReadWrite, timeout); - } - } -} - - +// Copyright © 2009, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Microsoft.Win32.SafeHandles; +using MySql.Data.Common; +using System; +using System.ComponentModel; +using System.IO; +using System.Runtime.InteropServices; +using System.Security; +using System.Threading; + +namespace MySql.Data.MySqlClient.Common +{ + /// + /// Summary description for API. + /// + [SuppressUnmanagedCodeSecurity()] + internal class NamedPipeStream : Stream + { + SafeFileHandle handle; + Stream fileStream; + int readTimeout = Timeout.Infinite; + int writeTimeout = Timeout.Infinite; + const int ERROR_PIPE_BUSY = 231; + const int ERROR_SEM_TIMEOUT = 121; + + public NamedPipeStream(string path, FileAccess mode, uint timeout) + { + Open(path, mode, timeout); + } + + void CancelIo() + { + bool ok = NativeMethods.CancelIo(handle.DangerousGetHandle()); + if (!ok) + throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error()); + } + + public void Open(string path, FileAccess mode, uint timeout) + { + IntPtr nativeHandle; + + for (; ; ) + { + NativeMethods.SecurityAttributes security = new NativeMethods.SecurityAttributes(); + security.inheritHandle = true; + security.Length = Marshal.SizeOf(security); + + nativeHandle = NativeMethods.CreateFile(path, NativeMethods.FILE_READ_ATTRIBUTES | NativeMethods.FILE_READ_DATA | + NativeMethods.FILE_WRITE_ATTRIBUTES | NativeMethods.FILE_WRITE_DATA, + 0, security, NativeMethods.OPEN_EXISTING, NativeMethods.FILE_FLAG_OVERLAPPED, 0); + + handle = new SafeFileHandle(nativeHandle, true); + if (!handle.IsInvalid) + break; + + if (Marshal.GetLastWin32Error() != ERROR_PIPE_BUSY) + { + throw new Win32Exception(Marshal.GetLastWin32Error(), + "Error opening pipe"); + } + MySql.Data.Common.LowResolutionStopwatch sw = MySql.Data.Common.LowResolutionStopwatch.StartNew(); + bool success = NativeMethods.WaitNamedPipe(path, timeout); + sw.Stop(); + if (!success) + { + if (timeout < sw.ElapsedMilliseconds || + Marshal.GetLastWin32Error() == ERROR_SEM_TIMEOUT) + { + throw new TimeoutException("Timeout waiting for named pipe"); + } + else + { + throw new Win32Exception(Marshal.GetLastWin32Error(), + "Error waiting for pipe"); + } + } + timeout -= (uint)sw.ElapsedMilliseconds; + } + fileStream = new FileStream(handle, mode, 4096, true); + } + + public override bool CanRead + { + get { return fileStream.CanRead; } + } + + public override bool CanWrite + { + get { return fileStream.CanWrite; } + } + + public override bool CanSeek + { + get { throw new NotSupportedException(Resources.NamedPipeNoSeek); } + } + + public override long Length + { + get { throw new NotSupportedException(Resources.NamedPipeNoSeek); } + } + + public override long Position + { + get { throw new NotSupportedException(Resources.NamedPipeNoSeek); } + set { } + } + + public override void Flush() + { + fileStream.Flush(); + } + + public override int Read(byte[] buffer, int offset, int count) + { + if (readTimeout == Timeout.Infinite) + { + return fileStream.Read(buffer, offset, count); + } + IAsyncResult result = fileStream.BeginRead(buffer, offset, count, null, null); + if (result.CompletedSynchronously) + return fileStream.EndRead(result); + + if (!result.AsyncWaitHandle.WaitOne(readTimeout)) + { + CancelIo(); + throw new TimeoutException("Timeout in named pipe read"); + } + return fileStream.EndRead(result); + } + + + public override void Write(byte[] buffer, int offset, int count) + { + if (writeTimeout == Timeout.Infinite) + { + fileStream.Write(buffer, offset, count); + return; + } + IAsyncResult result = fileStream.BeginWrite(buffer, offset, count, null, null); + if (result.CompletedSynchronously) + { + fileStream.EndWrite(result); + } + + if (!result.AsyncWaitHandle.WaitOne(readTimeout)) + { + CancelIo(); + throw new TimeoutException("Timeout in named pipe write"); + } + fileStream.EndWrite(result); + } + + public override void Close() + { + if (handle != null && !handle.IsInvalid && !handle.IsClosed) + { + fileStream.Close(); + try + { + handle.Close(); + } + catch (Exception) + { + } + } + } + + public override void SetLength(long length) + { + throw new NotSupportedException(Resources.NamedPipeNoSetLength); + } + + + public override bool CanTimeout + { + get + { + return true; + } + } + + public override int ReadTimeout + { + get + { + return readTimeout; + } + set + { + readTimeout = value; + } + } + + public override int WriteTimeout + { + get + { + return writeTimeout; + } + set + { + writeTimeout = value; + } + } + + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotSupportedException(Resources.NamedPipeNoSeek); + } + + internal static Stream Create(string pipeName, string hostname, uint timeout) + { + string pipePath; + if (0 == String.Compare(hostname, "localhost", true)) + pipePath = @"\\.\pipe\" + pipeName; + else + pipePath = String.Format(@"\\{0}\pipe\{1}", hostname, pipeName); + return new NamedPipeStream(pipePath, FileAccess.ReadWrite, timeout); + } + } +} + + diff --git a/MySQL.Data/src/common/netstandard2_0/SharedMemoryStream.cs b/MySQL.Data/src/common/netstandard2_0/SharedMemoryStream.cs new file mode 100644 index 000000000..02431ca56 --- /dev/null +++ b/MySQL.Data/src/common/netstandard2_0/SharedMemoryStream.cs @@ -0,0 +1,382 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Diagnostics; +using System.IO; +using System.Runtime.InteropServices; +using System.Threading; + +namespace MySql.Data.Common +{ + /// + /// Helper class to encapsulate shared memory functionality + /// Also cares of proper cleanup of file mapping object and cew + /// + internal class SharedMemory : IDisposable + { + private const uint FILE_MAP_WRITE = 0x0002; + + IntPtr fileMapping; + IntPtr view; + + public SharedMemory(string name, IntPtr size) + { + fileMapping = NativeMethods.OpenFileMapping(FILE_MAP_WRITE, false, + name); + if (fileMapping == IntPtr.Zero) + { + throw new MySqlException("Cannot open file mapping " + name); + } + view = NativeMethods.MapViewOfFile(fileMapping, FILE_MAP_WRITE, 0, 0, size); + } + + #region Destructor + ~SharedMemory() + { + Dispose(false); + } + #endregion + + public IntPtr View + { + get { return view; } + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + if (view != IntPtr.Zero) + { + NativeMethods.UnmapViewOfFile(view); + view = IntPtr.Zero; + } + if (fileMapping != IntPtr.Zero) + { + // Free the handle + NativeMethods.CloseHandle(fileMapping); + fileMapping = IntPtr.Zero; + } + } + } + + } + /// + /// Summary description for SharedMemoryStream. + /// + internal class SharedMemoryStream : Stream + { + private string memoryName; + private EventWaitHandle serverRead; + private EventWaitHandle serverWrote; + private EventWaitHandle clientRead; + private EventWaitHandle clientWrote; + private EventWaitHandle connectionClosed; + private SharedMemory data; + private int bytesLeft; + private int position; + private int connectNumber; + + private const int BUFFERLENGTH = 16004; + + private int readTimeout = System.Threading.Timeout.Infinite; + private int writeTimeout = System.Threading.Timeout.Infinite; + + public SharedMemoryStream(string memName) + { + memoryName = memName; + } + + public void Open(uint timeOut) + { + if (connectionClosed != null) + { + Debug.Assert(false, "Connection is already open"); + } + + GetConnectNumber(timeOut); + SetupEvents(); + } + + public override void Close() + { + if (connectionClosed != null) + { + bool isClosed = connectionClosed.WaitOne(0); + if (!isClosed) + { + connectionClosed.Set(); + connectionClosed.Close(); + } + connectionClosed = null; + EventWaitHandle[] handles = { serverRead, serverWrote, clientRead, clientWrote }; + + for (int i = 0; i < handles.Length; i++) + { + if (handles[i] != null) + handles[i].Close(); + } + if (data != null) + { + data.Dispose(); + data = null; + } + } + } + + private void GetConnectNumber(uint timeOut) + { + Mutex connectNamedMutex = null; + try + { + connectNamedMutex = Mutex.OpenExisting(memoryName + "_CONNECT_NAMED_MUTEX"); + } + catch + { + throw new MySqlException("Failed to open shared memory connection mutex"); + } + if (!connectNamedMutex.WaitOne(checked((int)timeOut) * 1000, false)) + throw new MySqlException("Mutex timeout during connection"); + try + { + EventWaitHandle connectRequest; + try + { + connectRequest = + EventWaitHandle.OpenExisting(memoryName + "_CONNECT_REQUEST"); + } + catch (Exception) + { + // If server runs as service, its shared memory is global + // And if connector runs in user session, it needs to prefix + // shared memory name with "Global\" + string prefixedMemoryName = @"Global\" + memoryName; + connectRequest = + EventWaitHandle.OpenExisting(prefixedMemoryName + "_CONNECT_REQUEST"); + memoryName = prefixedMemoryName; + } + EventWaitHandle connectAnswer = + EventWaitHandle.OpenExisting(memoryName + "_CONNECT_ANSWER"); + using (SharedMemory connectData = + new SharedMemory(memoryName + "_CONNECT_DATA", (IntPtr)4)) + { + // now start the connection + if (!connectRequest.Set()) + throw new MySqlException("Failed to open shared memory connection"); + if (!connectAnswer.WaitOne((int)(timeOut * 1000), false)) + throw new MySqlException("Timeout during connection"); + connectNumber = Marshal.ReadInt32(connectData.View); + } + } + finally + { + connectNamedMutex.ReleaseMutex(); + connectNamedMutex.Dispose(); + } + } + + + private void SetupEvents() + { + string prefix = memoryName + "_" + connectNumber; + data = new SharedMemory(prefix + "_DATA", (IntPtr)BUFFERLENGTH); + serverWrote = EventWaitHandle.OpenExisting(prefix + "_SERVER_WROTE"); + serverRead = EventWaitHandle.OpenExisting(prefix + "_SERVER_READ"); + clientWrote = EventWaitHandle.OpenExisting(prefix + "_CLIENT_WROTE"); + clientRead = EventWaitHandle.OpenExisting(prefix + "_CLIENT_READ"); + connectionClosed = EventWaitHandle.OpenExisting(prefix + "_CONNECTION_CLOSED"); + + // tell the server we are ready + serverRead.Set(); + } + + #region Properties + public override bool CanRead + { + get { return true; } + } + + public override bool CanSeek + { + get { return false; } + } + + public override bool CanWrite + { + get { return true; } + } + + public override long Length + { + get { throw new NotSupportedException("SharedMemoryStream does not support seeking - length"); } + } + + public override long Position + { + get { throw new NotSupportedException("SharedMemoryStream does not support seeking - position"); } + set { } + } + + #endregion + + public override void Flush() + { + // No need to flush anything to disk ,as our shared memory is backed + // by the page file + } + + public override int Read(byte[] buffer, int offset, int count) + { + int timeLeft = readTimeout; + WaitHandle[] waitHandles = { serverWrote, connectionClosed }; + LowResolutionStopwatch stopwatch = new LowResolutionStopwatch(); + while (bytesLeft == 0) + { + stopwatch.Start(); + int index = WaitHandle.WaitAny(waitHandles, timeLeft); + stopwatch.Stop(); + if (index == WaitHandle.WaitTimeout) + throw new TimeoutException("Timeout when reading from shared memory"); + + if (waitHandles[index] == connectionClosed) + throw new MySqlException("Connection to server lost", true, null); + + if (readTimeout != System.Threading.Timeout.Infinite) + { + timeLeft = readTimeout - (int)stopwatch.ElapsedMilliseconds; + if (timeLeft < 0) + throw new TimeoutException("Timeout when reading from shared memory"); + } + + bytesLeft = Marshal.ReadInt32(data.View); + position = 4; + } + + int len = Math.Min(count, bytesLeft); + long baseMem = data.View.ToInt64() + position; + + for (int i = 0; i < len; i++, position++) + buffer[offset + i] = Marshal.ReadByte((IntPtr)(baseMem + i)); + + bytesLeft -= len; + if (bytesLeft == 0) + clientRead.Set(); + + return len; + } + + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotSupportedException("SharedMemoryStream does not support seeking"); + } + + public override void Write(byte[] buffer, int offset, int count) + { + int leftToDo = count; + int buffPos = offset; + WaitHandle[] waitHandles = { serverRead, connectionClosed }; + LowResolutionStopwatch stopwatch = new LowResolutionStopwatch(); + int timeLeft = writeTimeout; + + while (leftToDo > 0) + { + stopwatch.Start(); + int index = WaitHandle.WaitAny(waitHandles, timeLeft); + stopwatch.Stop(); + + if (waitHandles[index] == connectionClosed) + throw new MySqlException("Connection to server lost", true, null); + + if (index == WaitHandle.WaitTimeout) + throw new TimeoutException("Timeout when reading from shared memory"); + + if (writeTimeout != System.Threading.Timeout.Infinite) + { + timeLeft = writeTimeout - (int)stopwatch.ElapsedMilliseconds; + if (timeLeft < 0) + throw new TimeoutException("Timeout when writing to shared memory"); + } + int bytesToDo = Math.Min(leftToDo, BUFFERLENGTH); + long baseMem = data.View.ToInt64() + 4; + Marshal.WriteInt32(data.View, bytesToDo); + Marshal.Copy(buffer, buffPos, (IntPtr)baseMem, bytesToDo); + buffPos += bytesToDo; + leftToDo -= bytesToDo; + if (!clientWrote.Set()) + throw new MySqlException("Writing to shared memory failed"); + } + } + + public override void SetLength(long value) + { + throw new NotSupportedException("SharedMemoryStream does not support seeking"); + } + + public override bool CanTimeout + { + get + { + return true; + } + } + + public override int ReadTimeout + { + get + { + return readTimeout; + } + set + { + readTimeout = value; + } + } + + public override int WriteTimeout + { + get + { + return writeTimeout; + } + set + { + writeTimeout = value; + } + } + + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/AttributeTests.cs b/MySQL.Data/tests/MySql.Data.Tests/AttributeTests.cs new file mode 100644 index 000000000..c6f69757d --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/AttributeTests.cs @@ -0,0 +1,247 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; + +namespace MySql.Data.MySqlClient.Tests +{ + public class AttributeTests : TestBase + { + [OneTimeSetUp] + public void SetUp() + { + if (Version >= new Version(8, 0, 23)) + { + try { ExecuteSQL(@"INSTALL COMPONENT 'file://component_query_attributes'"); } + catch { } + } + } + + [TestCase(true)] + [TestCase(false)] + public void SetAttributesWithoutParams(bool prepare) + { + Assume.That(Connection.driver.SupportsQueryAttributes, "MySQL Server version does not support query attributes."); + + using MySqlCommand cmd = new MySqlCommand(); + cmd.Connection = Connection; + cmd.Attributes.SetAttribute("n1", "v1"); + cmd.CommandText = "SELECT mysql_query_attribute_string('n1')"; + if (prepare) cmd.Prepare(); + + var result = cmd.ExecuteScalar(); + if (Version >= new Version(8, 0, 26) || !prepare) Assert.That(result.ToString(), Is.EqualTo("v1").IgnoreCase); + else Assert.That(result.ToString(), Is.Empty); + + cmd.Attributes.SetAttribute("n2", 123); + cmd.CommandText = "SELECT mysql_query_attribute_string('n2')"; + if (prepare) cmd.Prepare(); + result = cmd.ExecuteScalar(); + if (Version >= new Version(8, 0, 26) || !prepare) Assert.That(result.ToString(), Is.EqualTo("123").IgnoreCase); + else Assert.That(result.ToString(), Is.Empty); + + MySqlAttribute attr = new MySqlAttribute(); + attr.AttributeName = "n3"; + attr.Value = "v3"; + cmd.Attributes.SetAttribute(attr); + cmd.CommandText = "SELECT mysql_query_attribute_string('n3')"; + if (prepare) cmd.Prepare(); + result = cmd.ExecuteScalar(); + if (Version >= new Version(8, 0, 26) || !prepare) Assert.That(result.ToString(), Is.EqualTo("v3").IgnoreCase); + else Assert.That(result.ToString(), Is.Empty); + } + + [TestCase("StringType", "value1")] + [TestCase("Int16Type", (Int16)1234)] + [TestCase("Int32Type", (Int32)2546)] + [TestCase("Int64Type", (Int64)98756)] + [TestCase("FloatType", (float)5678)] + [TestCase("DoubleType", 1234.567)] + public void ValueTypes(string name, object value) + { + Assume.That(Connection.driver.SupportsQueryAttributes, "MySQL Server version does not support query attributes."); + + using MySqlCommand cmd = new MySqlCommand(); + cmd.Connection = Connection; + cmd.Attributes.SetAttribute(name, value); + cmd.CommandText = $"SELECT mysql_query_attribute_string('{name}')"; + var result = cmd.ExecuteScalar(); + Assert.That(result.ToString(), Is.EqualTo(value.ToString()).IgnoreCase); + } + + [Test] + public void TimeSpanValueType() + { + Assume.That(Connection.driver.SupportsQueryAttributes, "MySQL Server version does not support query attributes."); + + TimeSpan time = new TimeSpan(01, 19, 25); + + using MySqlCommand cmd = new MySqlCommand(); + cmd.Connection = Connection; + cmd.Attributes.SetAttribute("TimeSpan", time); + cmd.CommandText = "SELECT mysql_query_attribute_string('TimeSpan')"; + var result = cmd.ExecuteScalar(); + Assert.That(result.ToString(), Does.StartWith(time.ToString())); + } + + [Test] + public void DateTimeValueType() + { + Assume.That(Connection.driver.SupportsQueryAttributes, "MySQL Server version does not support query attributes."); + + DateTime dateTime = DateTime.Now; + + using MySqlCommand cmd = new MySqlCommand(); + cmd.Connection = Connection; + cmd.Attributes.SetAttribute("DateTime", dateTime); + cmd.CommandText = "SELECT mysql_query_attribute_string('DateTime')"; + var result = cmd.ExecuteScalar(); + Assert.That(result.ToString(), Is.EqualTo(dateTime.ToString("yyyy-MM-dd HH:mm:ss.ffffff"))); + } + + [Test] + public void ClearAttributes() + { + using MySqlCommand cmd = new MySqlCommand(); + cmd.Attributes.SetAttribute("foo", "bar"); + Assert.That(cmd.Attributes.Count, Is.EqualTo(1)); + + cmd.Attributes.SetAttribute("bar", "foo"); + Assert.That(cmd.Attributes.Count, Is.EqualTo(2)); + + cmd.Attributes.Clear(); + Assert.That(cmd.Attributes.Count, Is.EqualTo(0)); + } + + [Test] + public void SameNameAttribute() + { + Assume.That(Connection.driver.SupportsQueryAttributes, "MySQL Server version does not support query attributes."); + + using MySqlCommand cmd = new MySqlCommand(); + cmd.Connection = Connection; + cmd.Attributes.SetAttribute("foo", "bar"); + cmd.Attributes.SetAttribute("quaz", "fet"); + cmd.Attributes.SetAttribute("foo", "bar2"); + cmd.CommandText = "SELECT mysql_query_attribute_string('foo')"; + + var result = cmd.ExecuteScalar(); + Assert.That(result.ToString(), Is.EqualTo("bar").IgnoreCase); + } + + [TestCase(true)] + [TestCase(false)] + public void QueryAttributesNotSupported(bool prepare) + { + Assume.That(!Connection.driver.SupportsQueryAttributes,"Query attributes supported."); + + MySqlTrace.Listeners.Clear(); + MySqlTrace.Switch.Level = System.Diagnostics.SourceLevels.Warning; + GenericListener listener = new GenericListener(); + MySqlTrace.Listeners.Add(listener); + + using var logConn = new MySqlConnection(Connection.ConnectionString); + using MySqlCommand cmd = new MySqlCommand(); + logConn.Open(); + cmd.Connection = logConn; + cmd.Attributes.SetAttribute("foo", "bar"); + cmd.Parameters.AddWithValue("", "test"); + cmd.CommandText = "SELECT ?"; + if (prepare) cmd.Prepare(); + + var result = cmd.ExecuteScalar(); + Assert.That(result.ToString(), Is.EqualTo("test").IgnoreCase); + Assert.That(listener.Strings[0], Does.Contain(string.Format(Resources.QueryAttributesNotSupported, Version))); + } + + [TestCase(true)] + [TestCase(false)] + public void AttributesAndParameters(bool prepare) + { + Assume.That(Connection.driver.SupportsQueryAttributes, "MySQL Server version does not support query attributes."); + + using MySqlCommand cmd = new MySqlCommand(); + cmd.Connection = Connection; + cmd.Parameters.AddWithValue("", "Hello World"); + cmd.Parameters.AddWithValue("", "Goodbye World"); + cmd.Attributes.SetAttribute("foo", "bar"); + cmd.CommandText = "SELECT ?, ?, mysql_query_attribute_string('foo')"; + if (prepare) cmd.Prepare(); + + using MySqlDataReader reader = cmd.ExecuteReader(); + { + while (reader.Read()) + { + Assert.That(reader.GetString(0), Is.EqualTo("Hello World").IgnoreCase); + Assert.That(reader.GetString(1), Is.EqualTo("Goodbye World").IgnoreCase); + if (Version >= new Version(8, 0, 26) || !prepare) Assert.That(reader.GetString(2), Is.EqualTo("bar").IgnoreCase); + } + } + } + + [Test] + public void InvalidValues() + { + string name; + using MySqlCommand cmd = new MySqlCommand(); + Assert.Throws(() => cmd.Attributes.SetAttribute(string.Empty, "bar")); + Assert.Throws(() => name = cmd.Attributes[2].AttributeName); + } + + /// + /// Bug#33620022 [Parameter name overrides query attributes] + /// + [TestCase(true)] + [TestCase(false)] + public void ParameterOverridesAttributeValue(bool prepare) + { + Assume.That(Connection.driver.SupportsQueryAttributes, "MySQL Server version does not support query attributes."); + + using var cmd = new MySqlCommand("select mysql_query_attribute_string('name') as attribute, mysql_query_attribute_string('name2') as attribute2, @name as parameter, @name2 as parameter2, mysql_query_attribute_string('attr') as attribute3", Connection); + cmd.Attributes.SetAttribute("name", "attribute"); + cmd.Attributes.SetAttribute("name2", "attribute2"); + cmd.Parameters.AddWithValue("name", "parameter"); + cmd.Parameters.AddWithValue("name2", "parameter2"); + cmd.Attributes.SetAttribute("attr", "attribute3"); + + if (prepare) cmd.Prepare(); + + using var reader = cmd.ExecuteReader(); + while (reader.Read()) + { + Assert.That(reader.GetValue(0).ToString(), Is.EqualTo("attribute").IgnoreCase); + Assert.That(reader.GetValue(1).ToString(), Is.EqualTo("attribute2").IgnoreCase); + Assert.That(reader.GetValue(2).ToString(), Is.EqualTo("parameter").IgnoreCase); + Assert.That(reader.GetValue(3).ToString(), Is.EqualTo("parameter2").IgnoreCase); + Assert.That(reader.GetValue(4).ToString(), Is.EqualTo("attribute3").IgnoreCase); + } + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/AuthTests.cs b/MySQL.Data/tests/MySql.Data.Tests/AuthTests.cs new file mode 100644 index 000000000..952e044db --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/AuthTests.cs @@ -0,0 +1,2040 @@ +// Copyright © 2016, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +using MySql.Data.Common; +using MySql.Data.MySqlClient.Authentication; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; +using System.Reflection; +using System.Text; + +namespace MySql.Data.MySqlClient.Tests +{ + public class AuthTests : TestBase + { + [OneTimeTearDown] + public void OneTimeTearDown() + { + var users = Utils.FillTable(("SELECT user, host FROM mysql.user WHERE user NOT LIKE 'mysql%' AND user NOT LIKE 'root'"), Root); + foreach (DataRow row in users.Rows) + ExecuteSQL(string.Format("DROP USER '{0}'@'{1}'", row[0].ToString(), row[1].ToString()), true); + ExecuteSQL("FLUSH PRIVILEGES", true); + } + + #region Windows Authentication Plugin + + [Test] + [Property("Category", "Security")] + public void TestIntegratedSecurityNoPoolingWithoutUser() + { + TestIntegratedSecurityWithUser(null, false); + } + + [Test] + [Property("Category", "Security")] + public void TestIntegratedSecurityPoolingWithoutUser() + { + TestIntegratedSecurityWithUser(null, true); + } + + [Test] + [Property("Category", "Security")] + public void TestIntegratedSecurityNoPoolingWithUser() + { + TestIntegratedSecurityWithUser("myuser1", false); + } + + [Test] + [Property("Category", "Security")] + public void TestIntegratedSecurityPoolingWithUser() + { + TestIntegratedSecurityWithUser("myuser1", true); + } + + [Test] + [Property("Category", "Security")] + public void TestWinAuthWithoutProxyNoUserNoPooling() + { + TestIntegratedSecurityWithoutProxy(null, false); + } + + [Test] + [Property("Category", "Security")] + public void TestWinAuthWithoutProxyNoUserPooling() + { + TestIntegratedSecurityWithoutProxy("myuser1", true); + } + + [Test] + [Property("Category", "Security")] + public void TestWinAuthWithoutProxyAndUser() + { + TestIntegratedSecurityWithoutProxy("myuser1", false); + } + + [Test] + [Property("Category", "Security")] + public void TestWinAuthWithoutProxyAndUserPooling() + { + TestIntegratedSecurityWithoutProxy("myuser1", true); + } + + private void TestIntegratedSecurityWithoutProxy(string user, bool pooling) + { + const string PluginName = "authentication_windows"; + string UserName = "auth_windows"; + if (user != null) + UserName = user; + + // Check if server has windows authentication plugin is installed + MySqlCommand cmd = new MySqlCommand("show plugins", Root); + + bool haveWindowsAuthentication = false; + using (MySqlDataReader r = cmd.ExecuteReader()) + { + while (r.Read()) + { + string name = (string)r["Name"]; + if (name == PluginName) + { + haveWindowsAuthentication = true; + break; + } + } + } + + if (!haveWindowsAuthentication) + return; + + bool haveAuthWindowsUser = false; + string pluginName = null; + string authenticationString = ""; + + // Check if predefined proxy user exists + cmd.CommandText = string.Format( + "select plugin, authentication_string from mysql.user where user='{0}'", + UserName); + using (MySqlDataReader r = cmd.ExecuteReader()) + { + if (r.Read()) + { + haveAuthWindowsUser = true; + pluginName = (string)r["plugin"]; + authenticationString = + (string)((r["authentication_string"] == DBNull.Value) ? + "" : r["authentication_string"]); + } + } + + // Create mapping for current Windows user=>foo_user + String windowsUser = System.Security.Principal.WindowsIdentity.GetCurrent().Name; + windowsUser = windowsUser.Replace("\\", "\\\\"); + string userMapping = "fergs, Administrators"; + + try + { + if (!haveAuthWindowsUser) + { + ExecuteSQL( + "CREATE USER " + UserName + " IDENTIFIED WITH " + PluginName + " as '" + + userMapping + "'", true); + } + else + { + // extend mapping string for current user + ExecuteSQL( + "UPDATE mysql.user SET authentication_string='" + userMapping + + "," + authenticationString + "' where user='" + UserName + "'", true); + } + ExecuteSQL(string.Format("grant all privileges on *.* to '{0}'@'%'", UserName), true); + + + // Finally, use IntegratedSecurity=true for the newly created user + string connStr = Root.ConnectionString + ";Integrated Security=SSPI"; + + MySqlConnectionStringBuilder sb = + new MySqlConnectionStringBuilder(connStr); + sb.UserID = user; + connStr = sb.ConnectionString; + + /* If pooling is requested, we'll run test twice, with connection reset in between */ + if (pooling) + { + connStr += ";Connection Reset=true;Pooling=true"; + } + int testIterations = pooling ? 2 : 1; + + int threadId = -1; + for (int i = 0; i < testIterations; i++) + { + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + threadId = c.ServerThread; + MySqlCommand command = new MySqlCommand("SELECT 1", c); + long ret = (long)command.ExecuteScalar(); + Assert.That(ret, Is.EqualTo(1)); + + command.CommandText = "select user()"; + string myUser = (string)command.ExecuteScalar(); + // Check if proxy user is correct + Assert.That(myUser, Does.StartWith(UserName + "@")); + + // check if mysql user is correct + // (foo_user is mapped to current OS user) + command.CommandText = "select current_user()"; + string currentUser = (string)command.ExecuteScalar(); + Assert.That(currentUser, Does.StartWith(UserName)); + } + } + + if (pooling) + { + ExecuteSQL("KILL " + threadId, true); + } + } + finally + { + // Cleanup + + // Drop test user + ExecuteSQL(string.Format("drop user {0}", UserName), true); + } + } + + private void TestIntegratedSecurityWithUser(string user, bool pooling) + { + const string PluginName = "authentication_windows"; + string UserName = "auth_windows"; + if (user != null) + UserName = user; + + // Check if server has windows authentication plugin is installed + MySqlDataReader reader = ExecuteReader("show plugins", true); + + bool haveWindowsAuthentication = false; + using (reader) + { + if (reader.HasRows) + { + while (reader.Read()) + { + string name = (string)reader["Name"]; + if (name == PluginName) + { + haveWindowsAuthentication = true; + break; + } + } + } + } + if (!haveWindowsAuthentication) + return; + + bool haveAuthWindowsUser = false; + string pluginName = null; + string authenticationString = ""; + + // Check if predefined proxy user exists + string sql = string.Format("select plugin, authentication_string from mysql.user where user='{0}'", UserName); + using (MySqlDataReader reader2 = ExecuteReader(sql, true)) + { + if (reader2.Read()) + { + haveAuthWindowsUser = true; + pluginName = (string)reader2["plugin"]; + authenticationString = + (string)((reader2["authentication_string"] == DBNull.Value) ? + "" : reader2["authentication_string"]); + } + } + + // Create mapping for current Windows user=>foo_user +#pragma warning disable CS1702 // Assuming assembly reference matches identity + String windowsUser = System.Security.Principal.WindowsIdentity.GetCurrent().Name; +#pragma warning restore CS1702 // Assuming assembly reference matches identity + windowsUser = windowsUser.Replace("\\", "\\\\"); + string userMapping = windowsUser + "=foo_user"; + + if (!haveAuthWindowsUser) + { + ExecuteSQL($"DROP USER IF EXISTS {UserName}"); + ExecuteSQL( + "CREATE USER " + UserName + " IDENTIFIED WITH " + PluginName + " as '" + + userMapping + "'", true); + } + else + { + // extend mapping string for current user + ExecuteSQL( + "UPDATE mysql.user SET authentication_string='" + userMapping + + "," + authenticationString + "' where user='" + UserName + "'", true); + } + ExecuteSQL($"DROP USER IF EXISTS foo_user"); + ExecuteSQL("create user foo_user identified by 'pass'", true); + ExecuteSQL("grant all privileges on *.* to 'foo_user'@'%'", true); + ExecuteSQL("grant proxy on foo_user to " + UserName, true); + + + // Finally, use IntegratedSecurity=true for the newly created user + string connStr = Root.ConnectionString + ";Integrated Security=SSPI"; + + MySqlConnectionStringBuilder sb = + new MySqlConnectionStringBuilder(connStr); + sb.UserID = user; + connStr = sb.ConnectionString; + + /* If pooling is requested, we'll run test twice, with connection reset in between */ + if (pooling) + { + connStr += ";Connection Reset=true;Pooling=true"; + } + int testIterations = pooling ? 2 : 1; + + int threadId = -1; + for (int i = 0; i < testIterations; i++) + { + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + threadId = c.ServerThread; + MySqlCommand command = new MySqlCommand("SELECT 1", c); + long ret = (long)command.ExecuteScalar(); + Assert.That(ret, Is.EqualTo(1)); + + command.CommandText = "select user()"; + string myUser = (string)command.ExecuteScalar(); + // Check if proxy user is correct + Assert.That(myUser, Does.StartWith(UserName + "@")); + + // check if mysql user is correct + // (foo_user is mapped to current OS user) + command.CommandText = "select current_user()"; + string currentUser = (string)command.ExecuteScalar(); + Assert.That(currentUser, Does.StartWith("foo_user@")); + } + } + + if (pooling) + { + ExecuteSQL("KILL " + threadId, true); + } + } + + #endregion + + #region MySql Native Password Authentication Plugin + + [Test] + [Property("Category", "Security")] + public void ConnectUsingMySqlNativePasswordPlugin() + { + Assume.That(Check_Plugin_Enabled("mysql_native_password"), "mysql_native_password plugin must be enabled on the server to run this test"); + + string userName = "testNtvPass"; + string password = "mysql"; + string pluginName = "mysql_native_password"; + MySqlConnectionStringBuilder settings = new MySqlConnectionStringBuilder(Settings.ConnectionString); + settings.UserID = userName; + settings.Password = password; + settings.Database = ""; + CreateUser(userName, password, pluginName); + + // User with password over TLS connection. + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + connection.Open(); + MySqlCommand command = new MySqlCommand("SHOW SESSION STATUS LIKE 'Ssl_version';", connection); + using (MySqlDataReader reader = command.ExecuteReader()) + { + Assert.That(reader.Read(), Is.True); + Assert.That(reader.GetString(1), Does.StartWith("TLSv1")); + } + + command.CommandText = String.Format("SELECT `User`, `plugin` FROM `mysql`.`user` WHERE `User` = '{0}';", userName); + using (MySqlDataReader reader = command.ExecuteReader()) + { + Assert.That(reader.Read(), Is.True); + Assert.That(reader.GetString(0), Is.EqualTo(userName)); + Assert.That(reader.GetString(1), Is.EqualTo(pluginName)); + } + + connection.Close(); + } + + // User with password over non-TLS connection. + settings.SslMode = MySqlSslMode.Disabled; + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + connection.Open(); + connection.Close(); + } + } + + #endregion + + #region Sha256 Password Authentication Plugin + + [Test] + [Property("Category", "Security")] + public void ConnectUsingSha256PasswordPlugin() + { + if (Version <= new Version("5.6")) return; + + string userName = "testSha256"; + string password = "mysql"; + string pluginName = "sha256_password"; + MySqlConnectionStringBuilder settings = new MySqlConnectionStringBuilder(Settings.ConnectionString); + settings.UserID = userName; + settings.Password = password; + settings.Database = ""; + CreateUser(userName, password, pluginName); + + // User with password over TLS connection. + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + connection.Open(); + MySqlCommand command = new MySqlCommand("SHOW SESSION STATUS LIKE 'Ssl_version';", connection); + using (MySqlDataReader reader = command.ExecuteReader()) + { + Assert.That(reader.Read(), Is.True); + Assert.That(reader.GetString(1), Does.StartWith("TLSv1")); + } + + command.CommandText = String.Format("SELECT `User`, `plugin` FROM `mysql`.`user` WHERE `User` = '{0}';", userName); + using (MySqlDataReader reader = command.ExecuteReader()) + { + Assert.That(reader.Read(), Is.True); + Assert.That(reader.GetString(0), Is.EqualTo(userName)); + Assert.That(reader.GetString(1), Is.EqualTo(pluginName)); + } + + connection.Close(); + } + + // Connect over non-TLS connection using RSA keys. Only available in servers compiled with OpenSSL (E.g. Commercial) + bool serverCompiledUsingOpenSsl = false; + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + MySqlCommand command = new MySqlCommand("SHOW SESSION STATUS LIKE 'Rsa_public_key';", Connection); + + using (MySqlDataReader reader = command.ExecuteReader()) + { + if (reader.HasRows) + { + reader.Read(); + if (!string.IsNullOrEmpty(reader.GetString(1))) serverCompiledUsingOpenSsl = true; + } + } + } + + settings.SslMode = MySqlSslMode.Disabled; + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + if (serverCompiledUsingOpenSsl) + { + Exception ex = Assert.Throws(() => connection.Open()); + Assert.That(ex.Message, Is.EqualTo(Resources.RSAPublicKeyRetrievalNotEnabled)); + } + else Assert.Throws(() => connection.Open()); + } + + if (serverCompiledUsingOpenSsl) + { + settings.AllowPublicKeyRetrieval = true; + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + connection.Open(); + connection.Close(); + } + settings.AllowPublicKeyRetrieval = false; + } + + // User without password over TLS connection. + password = ""; + settings.Password = password; + CreateUser(userName, password, pluginName); + settings.SslMode = MySqlSslMode.Required; + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + connection.Open(); + MySqlCommand command = new MySqlCommand("SHOW SESSION STATUS LIKE 'Ssl_version';", connection); + using (MySqlDataReader reader = command.ExecuteReader()) + { + Assert.That(reader.Read(), Is.True); + Assert.That(reader.GetString(1), Does.StartWith("TLSv1")); + } + + command.CommandText = String.Format("SELECT `User`, `plugin` FROM `mysql`.`user` WHERE `User` = '{0}';", userName); + using (MySqlDataReader reader = command.ExecuteReader()) + { + Assert.That(reader.Read(), Is.True); + Assert.That(reader.GetString(0), Is.EqualTo(userName)); + Assert.That(reader.GetString(1), Is.EqualTo(pluginName)); + } + + connection.Close(); + } + } + + [Test] + [Property("Category", "Security")] + public void AllowPublicKeyRetrievalForSha256PasswordPlugin() + { + if (Version <= new Version("5.6")) return; + + string userName = "testSha256"; + string password = "mysql"; + string pluginName = "sha256_password"; + MySqlConnectionStringBuilder settings = new MySqlConnectionStringBuilder(Settings.ConnectionString); + settings.UserID = userName; + settings.Password = password; + settings.Database = ""; + CreateUser(userName, password, pluginName); + + bool serverCompiledUsingOpenSsl = false; + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + MySqlCommand command = new MySqlCommand("SHOW SESSION STATUS LIKE 'Rsa_public_key';", Connection); + + using (MySqlDataReader reader = command.ExecuteReader()) + { + if (reader.HasRows) + { + reader.Read(); + if (!string.IsNullOrEmpty(reader.GetString(1))) serverCompiledUsingOpenSsl = true; + } + } + } + + settings.SslMode = MySqlSslMode.Disabled; + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + Exception ex = Assert.Throws(() => connection.Open()); ; + if (serverCompiledUsingOpenSsl) + Assert.That(ex.Message, Is.EqualTo(Resources.RSAPublicKeyRetrievalNotEnabled)); + else + Assert.That(ex.Message, Does.StartWith("Authentication to host")); + } + + if (serverCompiledUsingOpenSsl) + { + settings.AllowPublicKeyRetrieval = true; + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + connection.Open(); + connection.Close(); + } + } + } + + [Test] + [Property("Category", "Security")] + public void EmptyPasswordOnSslDisabledSha256Password() + { + if (Version <= new Version("5.6")) return; + + string userName = "testSha256"; + string password = ""; + string pluginName = "sha256_password"; + MySqlConnectionStringBuilder settings = new MySqlConnectionStringBuilder(Settings.ConnectionString); + settings.UserID = userName; + settings.Password = password; + CreateUser(userName, password, pluginName); + + settings.SslMode = MySqlSslMode.Disabled; + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + connection.Open(); + connection.Close(); + } + } + + #endregion + + #region Caching Sha2 Password Authentication Plugin + + [Test] + [Property("Category", "Security")] + public void ConnectUsingCachingSha2Plugin() + { + if (Version < new Version(8, 0, 3)) return; + + MySqlDataReader pluginReader = ExecuteReader("SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'caching_sha2_password'"); + if (!pluginReader.HasRows) + throw new Exception("The caching_sha2_password plugin isn't available."); + pluginReader.Close(); + + string pluginName = "caching_sha2_password"; + MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.UserID = "testCachingSha2"; + builder.Password = "test"; + builder.Database = ""; + CreateUser(builder.UserID, builder.Password, pluginName); + + // Authentication success with full authentication - TLS connection. + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + Assert.That(connection.connectionState, Is.EqualTo(ConnectionState.Open)); + Assert.That(CachingSha2AuthenticationPlugin._authStage, Is.EqualTo(AuthStage.FULL_AUTH)); + connection.Close(); + } + + // Authentication success with fast authentication - Any connection. + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + Assert.That(connection.connectionState, Is.EqualTo(ConnectionState.Open)); + Assert.That(CachingSha2AuthenticationPlugin._authStage, Is.EqualTo(AuthStage.FAST_AUTH)); + connection.Close(); + } + + // Flush privileges clears the cache. + ExecuteSQL("flush privileges"); + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + Assert.That(CachingSha2AuthenticationPlugin._authStage, Is.EqualTo(AuthStage.FULL_AUTH)); + connection.Close(); + } + + // Authentication failure - TLS connection. + builder.Password = "incorrectPassword"; + Exception ex = Assert.Throws(() => new MySqlConnection(builder.ConnectionString).Open()); + Assert.That(ex.InnerException.Message, Does.StartWith("Access denied for user")); + + // Authentication success with empty password – Any connection. + builder.UserID = "testCachingSha2NoPassword"; + builder.Password = ""; + CreateUser(builder.UserID, builder.Password, pluginName); + + // TLS enabled. + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + Assert.That(connection.connectionState, Is.EqualTo(ConnectionState.Open)); + Assert.That(CachingSha2AuthenticationPlugin._authStage, Is.EqualTo(AuthStage.GENERATE_SCRAMBLE)); + connection.Close(); + } + + // TLS not enabled. + builder.SslMode = MySqlSslMode.Disabled; + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + Assert.That(connection.connectionState, Is.EqualTo(ConnectionState.Open)); + Assert.That(CachingSha2AuthenticationPlugin._authStage, Is.EqualTo(AuthStage.GENERATE_SCRAMBLE)); + connection.Close(); + } + + // Authentication failure with empty password – Any connection. + // TLS enabled. + builder.UserID = "testCachingSha2"; + builder.SslMode = MySqlSslMode.Required; + ex = Assert.Throws(() => new MySqlConnection(builder.ConnectionString).Open()); + Assert.That(ex.InnerException.Message, Does.StartWith("Access denied for user")); + + // TLS not enabled. + builder.SslMode = MySqlSslMode.Disabled; + ex = Assert.Throws(() => new MySqlConnection(builder.ConnectionString).Open()); + Assert.That(ex.InnerException.Message, Does.StartWith("Access denied for user")); + + // Authentication using RSA keys. Only available in servers compiled with OpenSSL (E.g. Commercial). + bool serverCompiledUsingOpenSsl = false; + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + MySqlCommand command = new MySqlCommand("SHOW SESSION STATUS LIKE 'Rsa_public_key';", Connection); + + using (MySqlDataReader reader = command.ExecuteReader()) + { + if (reader.HasRows) + { + reader.Read(); + if (!string.IsNullOrEmpty(reader.GetString(1))) serverCompiledUsingOpenSsl = true; + } + } + } + + if (serverCompiledUsingOpenSsl) + { + builder.UserID = "testCachingSha2"; + builder.Password = "test"; + builder.SslMode = MySqlSslMode.Disabled; + + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + ex = Assert.Throws(() => connection.Open()); + Assert.That(ex.Message, Is.EqualTo(Resources.RSAPublicKeyRetrievalNotEnabled)); + } + + builder.AllowPublicKeyRetrieval = true; + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + Assert.That(CachingSha2AuthenticationPlugin._authStage, Is.EqualTo(AuthStage.FULL_AUTH)); + connection.Close(); + } + + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + Assert.That(CachingSha2AuthenticationPlugin._authStage, Is.EqualTo(AuthStage.FAST_AUTH)); + connection.Close(); + } + + // Flush privileges clears the cache. + ExecuteSQL("flush privileges"); + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + Assert.That(CachingSha2AuthenticationPlugin._authStage, Is.EqualTo(AuthStage.FULL_AUTH)); + connection.Close(); + } + + builder.Password = "incorrectPassword"; + ex = Assert.Throws(() => new MySqlConnection(builder.ConnectionString).Open()); + Assert.That(ex.InnerException.Message, Does.StartWith("Access denied for user")); + } + } + + [Test] + [Property("Category", "Security")] + public void AllowPublicKeyRetrievalForCachingSha2PasswordPlugin() + { + if (Version < new Version("8.0.3")) return; + + string userName = "testCachingSha2"; + string password = "mysql"; + string pluginName = "caching_sha2_password"; + MySqlConnectionStringBuilder settings = new MySqlConnectionStringBuilder(Settings.ConnectionString); + settings.UserID = userName; + settings.Password = password; + settings.Database = ""; + CreateUser(userName, password, pluginName); + + bool serverCompiledUsingOpenSsl = false; + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + MySqlCommand command = new MySqlCommand("SHOW SESSION STATUS LIKE 'Rsa_public_key';", Connection); + + using (MySqlDataReader reader = command.ExecuteReader()) + { + if (reader.HasRows) + { + reader.Read(); + if (!string.IsNullOrEmpty(reader.GetString(1))) serverCompiledUsingOpenSsl = true; + } + } + } + + settings.SslMode = MySqlSslMode.Disabled; + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + Exception ex = Assert.Throws(() => connection.Open()); + if (serverCompiledUsingOpenSsl) + Assert.That(ex.Message, Is.EqualTo(Resources.RSAPublicKeyRetrievalNotEnabled)); + else + Assert.That(ex.Message, Does.StartWith("Authentication to host")); + } + + if (serverCompiledUsingOpenSsl) + { + settings.AllowPublicKeyRetrieval = true; + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + connection.Open(); + connection.Close(); + } + } + } + + [Test] + [Property("Category", "Security")] + public void CachingSha2AuthFailsAfterFlushPrivileges() + { + if (Version < new Version("8.0.3")) return; + + string userName = "testCachingSha2"; + string password = "mysql"; + string pluginName = "caching_sha2_password"; + MySqlConnectionStringBuilder settings = new MySqlConnectionStringBuilder(Settings.ConnectionString); + settings.UserID = userName; + settings.Password = password; + settings.Database = ""; + CreateUser(userName, password, pluginName); + + bool serverCompiledUsingOpenSsl = false; + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + MySqlCommand command = new MySqlCommand("SHOW SESSION STATUS LIKE 'Rsa_public_key';", Connection); + + using (MySqlDataReader reader = command.ExecuteReader()) + { + if (reader.HasRows) + { + reader.Read(); + if (!string.IsNullOrEmpty(reader.GetString(1))) serverCompiledUsingOpenSsl = true; + } + } + } + + settings.SslMode = MySqlSslMode.Required; + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + connection.Open(); + Assert.That(connection.State == ConnectionState.Open, Is.True); + connection.Close(); + } + + // Success since the user exists in the cache. + settings.SslMode = MySqlSslMode.Disabled; + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + connection.Open(); + Assert.That(connection.State == ConnectionState.Open, Is.True); + connection.Close(); + } + + ExecuteSQL("flush privileges"); + + // Fail since the user no longer exists in the cache and public key retrieval is disabled by default. + Exception ex = null; + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + ex = Assert.Throws(() => connection.Open()); + if (serverCompiledUsingOpenSsl) + Assert.That(ex.Message, Is.EqualTo(Resources.RSAPublicKeyRetrievalNotEnabled)); + else + Assert.That(ex.Message, Does.StartWith("Authentication to host")); + } + + settings.AllowPublicKeyRetrieval = true; + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + // Success when activating public key retrieval for commercial servers. + if (serverCompiledUsingOpenSsl) + { + connection.Open(); + Assert.That(connection.State == ConnectionState.Open); + connection.Close(); + } + // Fail since AllowPublicKeyRetrieval is ignored in gpl servers. + else + { + ex = Assert.Throws(() => connection.Open()); + Assert.That(ex.Message, Does.StartWith("Authentication to host")); + } + } + } + + [Test] + [Property("Category", "Security")] + public void EmptyPasswordOnSslDisableCachingSha2Password() + { + if (Version < new Version("8.0.3")) return; + + string userName = "testCachingSha256"; + string password = ""; + string pluginName = "caching_sha2_password"; + MySqlConnectionStringBuilder settings = new MySqlConnectionStringBuilder(Settings.ConnectionString); + settings.UserID = userName; + settings.Password = password; + CreateUser(userName, password, pluginName); + + settings.SslMode = MySqlSslMode.Disabled; + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + connection.Open(); + connection.Close(); + } + } + + [Test] + [Property("Category", "Security")] + public void CheckAllowPublicKeyRetrievalOptionIsAvailable() + { + string connectionString = Settings.ConnectionString; + connectionString += ";allowpublickeyretrieval=true"; + using (MySqlConnection connection = new MySqlConnection(connectionString)) + { + connection.Open(); + Assert.That(connection.Settings.AllowPublicKeyRetrieval, Is.True); + connection.Close(); + } + } + + #endregion + + #region mysql_clear_password Authentication plugin + [Test] + [Ignore("This test require start the mysql server commercial with the configuration specified in file Resources/my.ini")] + [Property("Category", "Security")] + public void ConnectUsingClearPasswordPlugin() + { + //Verify plugin is loaded + MySqlDataReader pluginReader = ExecuteReader("SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'authentication_ldap_simple'"); + if (!pluginReader.HasRows) + throw new Exception("The authentication_ldap_simple plugin isn't available."); + pluginReader.Close(); + + // Test connection for VALID user in LDAP server with right password, expected result PASS + MySqlConnectionStringBuilder settings = new MySqlConnectionStringBuilder(Settings.ConnectionString); + string userName = "test1@MYSQL.LOCAL"; + string ldapstr = "CN=test1,CN=Users,DC=mysql,DC=local"; + string pluginName = "authentication_ldap_simple"; + CreateUser(userName, ldapstr, pluginName); + settings.UserID = userName; + settings.Password = "Testpw1"; + + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + connection.Open(); + Assert.That(connection.connectionState, Is.EqualTo(ConnectionState.Open)); + var sql = string.Format("select user,plugin from mysql.user where user like '{0}'", settings.UserID); + MySqlCommand command = new MySqlCommand(sql, connection); + using (MySqlDataReader reader = command.ExecuteReader()) + { + Assert.That(reader.Read(), Is.True); + Assert.That(reader.GetString(0), Is.EqualTo("test1@MYSQL.LOCAL").IgnoreCase); + Assert.That(reader.GetString(1), Is.EqualTo("authentication_ldap_simple").IgnoreCase); + } + //test the new user can execute sql statements FR1_1 + sql = "create table testinserts( id int, name varchar(50),age int)"; + command = new MySqlCommand(sql, connection); + command.ExecuteNonQuery(); + sql = @"insert into testinserts values(1,""John"",30); + insert into testinserts values(2,""Paul"",31); + insert into testinserts values(3,""George"",34); + insert into testinserts values(4,""Ringo"",32);"; + command = new MySqlCommand(sql, connection); + command.ExecuteNonQuery(); + sql = "select count(*) from testinserts"; + command = new MySqlCommand(sql, connection); + var counter = command.ExecuteScalar(); + Assert.That(counter, Is.EqualTo(4)); + //check ssl + command = new MySqlCommand("SHOW SESSION STATUS LIKE 'Ssl_version';", connection); + using (MySqlDataReader reader = command.ExecuteReader()) + { + Assert.That(reader.Read(), Is.True); + Assert.That(reader.GetString(1), Does.StartWith("TLSv1")); + } + + } + + //Testing unix protocol + if (!Platform.IsWindows()) + { + string unixConnectionString = $"server={UnixSocket};user={settings.UserID};password={settings.Password};protocol=unix;"; + using (MySqlConnection conn = new MySqlConnection(unixConnectionString)) + { + conn.Open(); + Assert.That(conn.State, Is.EqualTo(ConnectionState.Open)); + } + + using (MySqlConnection connection = new MySqlConnection(unixConnectionString + "sslmode=none")) + { + connection.Open(); + Assert.That(connection.State, Is.EqualTo(ConnectionState.Open)); + } + } + + // Test connection for VALID user in LDAP server with wrong password, expected result FAIL + settings = new MySqlConnectionStringBuilder(Settings.ConnectionString); + userName = "test1@MYSQL.LOCAL"; + ldapstr = "CN=test1,CN=Users,DC=mysql,DC=local"; + pluginName = "authentication_ldap_simple"; + CreateUser(userName, ldapstr, pluginName); + settings.UserID = userName; + settings.Password = "wrongpw"; + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + Exception ex = Assert.Throws(() => connection.Open()); + Assert.That(ex.InnerException.Message, Does.StartWith("Access denied for user")); + } + + // Test connection for INVALID user in LDAP server, expected result FAIL + settings = new MySqlConnectionStringBuilder(Settings.ConnectionString); + userName = "william.wallace@MYSQL.LOCAL"; + ldapstr = "CN=william.wallace,CN=Users,DC=mysql,DC=local"; + pluginName = "authentication_ldap_simple"; + CreateUser(userName, ldapstr, pluginName); + settings.UserID = userName; + settings.Password = "testpw1"; + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + Exception ex = Assert.Throws(() => connection.Open()); + Assert.That(ex.InnerException.Message, Does.StartWith("Access denied for user")); + } + + // Test connection for VALID user in LDAP server with SSLMode=none, expected result FAIL + settings = new MySqlConnectionStringBuilder(Settings.ConnectionString); + userName = "test1@MYSQL.LOCAL"; + ldapstr = "CN=test1,CN=Users,DC=mysql,DC=local"; + pluginName = "authentication_ldap_simple"; + CreateUser(userName, ldapstr, pluginName); + settings.UserID = userName; + settings.Password = "Testpw1"; + settings.SslMode = MySqlSslMode.Disabled; + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + Exception ex = Assert.Throws(() => connection.Open()); + Assert.That(ex.Message, Is.EqualTo(Resources.ClearPasswordNotSupported)); + } + + // Test connection for VALID user in LDAP server with different SSLMode values, expected result pass + string assemblyPath = TestContext.CurrentContext.TestDirectory; + string _sslCa = assemblyPath + "\\ca.pem"; + string _sslCert = assemblyPath + "\\client-cert.pem"; + string _sslKey = assemblyPath + "\\client-key.pem"; + + settings = new MySqlConnectionStringBuilder(Settings.ConnectionString); + userName = "test1@MYSQL.LOCAL"; + ldapstr = "CN=test1,CN=Users,DC=mysql,DC=local"; + pluginName = "authentication_ldap_simple"; + CreateUser(userName, ldapstr, pluginName); + settings.UserID = userName; + settings.Password = "Testpw1"; + settings.SslMode = MySqlSslMode.Required; + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + connection.Open(); + Assert.That(connection.State, Is.EqualTo(ConnectionState.Open)); + connection.Close(); + } + + settings.SslCa = _sslCa; + settings.SslMode = MySqlSslMode.VerifyCA; + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + connection.Open(); + Assert.That(connection.State, Is.EqualTo(ConnectionState.Open)); + connection.Close(); + } + + settings.SslCa = _sslCa; + settings.SslCert = _sslCert; + settings.SslKey = _sslKey; + settings.SslMode = MySqlSslMode.VerifyFull; + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + connection.Open(); + Assert.That(connection.State, Is.EqualTo(ConnectionState.Open)); + connection.Close(); + } + + } + #endregion + + #region LDAP SASL Plugin + #region SCRAM-SHA Mechanisms + /// + /// WL14116 - Add support for SCRAM-SHA-1 / authentication_ldap_sasl_auth_method_name='SCRAM-SHA-1' + /// WL14255 - Add support for SCRAM-SHA-256 / authentication_ldap_sasl_auth_method_name='SCRAM-SHA-256' + /// This test require to start MySQL Commercial Server with the configuration specified in file Resources/my.ini + /// It uses preconfigured LDAP servers present in the labs. + /// + /// Should be 'SCRAM-SHA-1' or 'SCRAM-SHA-256' according to server's configuration. + [TestCase("sadmin", "perola", "common", true, "SCRAM-SHA-256")] + [TestCase("wrongUser", "perola", "common", false)] + [TestCase("sadmin", "wrongPassword", "common", false)] + [Ignore("This test require to start MySQL Commercial Server with the configuration specified in file Resources/my.ini")] + [Property("Category", "Security")] + public void ConnectUsingMySqlSASLPluginSCRAMSHA(string userName, string password, string proxyUser, bool shouldPass, string mechanism = "") + { + string plugin = "authentication_ldap_sasl"; + + MySqlConnectionStringBuilder settings = new MySqlConnectionStringBuilder(Settings.ConnectionString) + { + UserID = userName, + Password = password, + Database = string.Empty + }; + + ExecuteSQL($"CREATE USER '{userName}'@'%' IDENTIFIED WITH '{plugin}' BY '{password}'", true); + ExecuteSQL($"CREATE USER '{proxyUser}'@'%' IDENTIFIED BY ''", true); + ExecuteSQL($@"GRANT ALL ON *.* TO '{proxyUser}'; + GRANT PROXY on '{proxyUser}' TO '{userName}';", true); + + using (MySqlConnection connection = new MySqlConnection(settings.ConnectionString)) + { + if (shouldPass) + { + connection.Open(); + MySqlCommand command = new MySqlCommand($"SELECT `User`, `plugin` FROM `mysql`.`user` WHERE `User` = '{userName}';", connection); + using (MySqlDataReader reader = command.ExecuteReader()) + { + Assert.That(MySqlSASLPlugin.scramMechanism.MechanismName, Is.EqualTo(mechanism).IgnoreCase); + Assert.That(MySqlSASLPlugin.scramMechanism._state, Is.EqualTo(ScramBase.AuthState.VALIDATE)); + Assert.That(reader.Read(), Is.True); + Assert.That(reader.GetString(0), Is.EqualTo(userName).IgnoreCase); + Assert.That(reader.GetString(1), Is.EqualTo(plugin).IgnoreCase); + } + } + else + Assert.Throws(() => connection.Open()); + } + } + + [Test] + public void AssertScramSha1() + { + string expected = "c=bixhPXVzZXIs,r=fyko+d2lbbFgONRv9qkxdawL3rfcNHYJY1ZVvWVs7j,p=NdEpo1qMJaCn9xyrYplfuEKubqQ="; + string challenge1 = "r=fyko+d2lbbFgONRv9qkxdawL3rfcNHYJY1ZVvWVs7j,s=QSXCR+Q6sek8bf92,i=4096"; + string challenge2 = "v=n1qgUn3vi9dh7nG1+Giie5qsaVQ="; + string fixedNonce = "fyko+d2lbbFgONRv9qkxdawL"; + byte[] response; + + ScramSha1Mechanism scramSha1 = new ScramSha1Mechanism("user", "pencil", Host); + scramSha1._cnonce = fixedNonce; + Assert.That(scramSha1._state, Is.EqualTo(ScramBase.AuthState.INITIAL)); + + var challenge = Encoding.UTF8.GetString(scramSha1.Challenge(null)); + Assert.That(challenge, Is.EqualTo("n,a=user,n=user,r=" + fixedNonce)); + Assert.That(scramSha1._state, Is.EqualTo(ScramBase.AuthState.FINAL)); + + response = Encoding.UTF8.GetBytes(challenge1); + challenge = Encoding.UTF8.GetString(scramSha1.Challenge(response)); + Assert.That(challenge, Is.EqualTo(expected)); + Assert.That(scramSha1._state, Is.EqualTo(ScramBase.AuthState.VALIDATE)); + + response = Encoding.UTF8.GetBytes(challenge2); + Assert.That(scramSha1.Challenge(response), Is.Null); + } + + [Test] + public void AssertScramSha256() + { + string expected = "c=bixhPXVzZXIs,r=rOprNGfwEbeRWgbNEkqO%hvYDpWUa2RaTCAfuxFIlj)hNlF$k0,p=t03aUuq4eobF+sIe9aMDq7lKPDwSPmgQxsHhaE9hQnc="; + string challenge1 = "r=rOprNGfwEbeRWgbNEkqO%hvYDpWUa2RaTCAfuxFIlj)hNlF$k0,s=W22ZaJ0SNY7soEsUEjb6gQ==,i=4096"; + string challenge2 = "v=s/GjApLe1lkg2qcPV+thFIArK07tHFCZvdc4Y+q94sg="; + string fixedNonce = "rOprNGfwEbeRWgbNEkqO"; + byte[] response; + + ScramSha256Mechanism scramSha256 = new ScramSha256Mechanism("user", "pencil", Host); + scramSha256._cnonce = fixedNonce; + Assert.That(scramSha256._state, Is.EqualTo(ScramBase.AuthState.INITIAL)); + + var challenge = Encoding.UTF8.GetString(scramSha256.Challenge(null)); + Assert.That(challenge, Is.EqualTo("n,a=user,n=user,r=" + fixedNonce)); + Assert.That(scramSha256._state, Is.EqualTo(ScramBase.AuthState.FINAL)); + + response = Encoding.UTF8.GetBytes(challenge1); + challenge = Encoding.UTF8.GetString(scramSha256.Challenge(response)); + Assert.That(challenge, Is.EqualTo(expected)); + Assert.That(scramSha256._state, Is.EqualTo(ScramBase.AuthState.VALIDATE)); + + response = Encoding.UTF8.GetBytes(challenge2); + Assert.That(scramSha256.Challenge(response), Is.Null); + } + #endregion + + [Test] + public void AssertSaslPrep() + { + // Valid String + Assert.That(MySqlSASLPlugin.SaslPrep("my,0TEXT"), Is.EqualTo("my,0TEXT")); + Assert.That(MySqlSASLPlugin.SaslPrep("my,0 TEXT"), Is.EqualTo("my,0 TEXT")); + + // Queries for matching strings MAY contain unassigned code points. + Assert.That(MySqlSASLPlugin.SaslPrep("\u0888my,0TEXT"), Is.EqualTo("\u0888my,0TEXT")); + Assert.That(MySqlSASLPlugin.SaslPrep("my,0\u0890TEXT"), Is.EqualTo("my,0\u0890TEXT")); + Assert.That(MySqlSASLPlugin.SaslPrep("my,0TEXT\u089F"), Is.EqualTo("my,0TEXT\u089F")); + + // Mapping: non-ASCII space characters. + Assert.That(MySqlSASLPlugin.SaslPrep("my,0\u1680TEXT"), Is.EqualTo("my,0 TEXT")); + Assert.That(MySqlSASLPlugin.SaslPrep("my,0\u200BTEXT"), Is.EqualTo("my,0 TEXT")); + Assert.That(MySqlSASLPlugin.SaslPrep("\u00A0my,0\u2000TEXT\u3000"), Is.EqualTo(" my,0 TEXT ")); + + // Mapping: the "commonly mapped to nothing" characters. + Assert.That(MySqlSASLPlugin.SaslPrep("my,0\u00ADTEXT"), Is.EqualTo("my,0TEXT")); + Assert.That(MySqlSASLPlugin.SaslPrep("my,0\uFE0ATEXT"), Is.EqualTo("my,0TEXT")); + Assert.That(MySqlSASLPlugin.SaslPrep("\u00ADmy,0\u1806TE\uFE0FXT\uFEFF"), Is.EqualTo("my,0TEXT")); + + // KC Normalization. + Assert.That(MySqlSASLPlugin.SaslPrep("my,0 \uFB01 TEXT"), Is.EqualTo("my,0 fi TEXT")); + Assert.That(MySqlSASLPlugin.SaslPrep("my,0 \uFB01 TEXT"), Is.EqualTo("my,0 fi TEXT")); + + // Prohibited Output: ASCII control characters. + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("\u007Fmy,0TEXT")); + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("my,0\u001FTEXT")); + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("my,0TEXT\u0000")); + + // Prohibited Output: non-ASCII control characters. + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("\uFFFCmy,0TEXT")); + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("my,0\u008DTEXT")); + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("my,0\uD834\uDD73TEXT")); + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("my,0TEXT\u2028")); + + // Prohibited Output: private use characters. + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("\uE000my,0TEXT")); + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("my,0\uF8FFTEXT")); + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("my,0\uDBC0\uDC00TEXT")); + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("my,0TEXT\uDB80\uDC46")); + + // Prohibited Output: non-character code points. + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("\uDB3F\uDFFFmy,0TEXT")); + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("my,0\uFDD0TEXT")); + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("my,0\uD9FF\uDFFETEXT")); + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("my,0TEXT\uDBBF\uDFFF")); + + // Prohibited Output: surrogate code points. + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("\uD83D\uDC2Cmy,0TEXT")); + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("my,0\uD83C\uDF63TEXT")); + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("my,0TEXT\uD83C\uDF7B")); + + // Prohibited Output: inappropriate for plain text characters. + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("\uFFFACmy,0TEXT")); + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("my,0\uFFFDTEXT")); + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("my,0TEXT\uFFFC")); + + // Prohibited Output: inappropriate for canonical representation characters. + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("\u2FF0my,0TEXT")); + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("my,0\u2FFBTEXT")); + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("my,0TEXT\u2FF8")); + + // Prohibited Output: change display properties or deprecated characters. + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("\u206Fmy,0TEXT")); + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("my,0\u200ETEXT")); + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("my,0TEXT\u202E")); + + // Prohibited Output: tagging characters. + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("\uDB40\uDC7Fmy,0TEXT")); + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("my,0\uDB40\uDC21TEXT")); + Assert.Throws(() => MySqlSASLPlugin.SaslPrep("my,0TEXT\uDB40\uDC01")); + } + #endregion + + #region OCI IAM Authentication + /// + /// WL14708 - Support OCI IAM authentication + /// WL15489 - Support OCI Ephemeral key-based authentication + /// This test require to have a server running in the OCI and have at least one user configured with + /// the authentication_oci authentication plugin (see server WL11102 for further details) + /// + [TestCase("cnetuser1", "", Description = "By not setting a custom path, it takes the default value from the OCI SDK for .NET")] + [TestCase("cnetuser1", "C:\\config", Description = "Uses a custom path for the config file")] + [TestCase("", "", Description = "Uses OS logged in user")] + [TestCase("", "C:\\config", Description = "Uses OS logged in user and custom path for the config file")] + [Ignore("This test require a server running in the OCI.")] + public void ConnectUsingOciIamAuthentication(string userName, string configFilePath) + { + string host = "100.101.74.201"; + uint port = 3307; + + var connStringBuilder = new MySqlConnectionStringBuilder() + { + UserID = userName, + Server = host, + Port = port, + OciConfigFile = configFilePath, + OciConfigProfile = "TEST" // when using ephemeral key-based auth + }; + + using (var conn = new MySqlConnection(connStringBuilder.ConnectionString)) + { + conn.Open(); + MySqlCommand command = new MySqlCommand($"SELECT user();", conn); + using (MySqlDataReader reader = command.ExecuteReader()) + { + Assert.That(reader.Read(), Is.True); + userName = string.IsNullOrEmpty(userName) ? Environment.UserName : userName; + Assert.That(reader.GetString(0), Does.Contain(userName)); + } + } + } + + [Test] + public void NonExistingKeyFile() + { + OciAuthenticationPlugin plugin = new OciAuthenticationPlugin(); + string keyFileInvalidPath = "C:\\invalid\\Path"; + string exMsg = Assert.Throws(() => OciAuthenticationPlugin.SignData(new byte[0], keyFileInvalidPath)).Message; + Assert.That(exMsg, Is.EqualTo(Resources.OciKeyFileDoesNotExists).IgnoreCase); + } + + public struct Profiles + { + public Dictionary> profiles { get; set; } + public bool missingEntry { get; set; } + public string ociProfile { get; set; } + } + + [DatapointSource] + public Profiles[] profiles = new Profiles[] + { + // does not contain key_file entry + new Profiles{ + profiles = new Dictionary>() { + { "DEFAULT", new Dictionary(){ { "fingerprint", "11:22:33:44:55:66:77" } } } + }, + missingEntry = true, + ociProfile = "DEFAULT" + }, + // does not contain fingerprint entry + new Profiles{ + profiles = new Dictionary>() { + { "TEST", new Dictionary(){ { "key_file", "keyFilePath" } } } + }, + missingEntry = true, + ociProfile = "TEST" + }, + // points to a invalid private key file + new Profiles{ + profiles = new Dictionary>() { + { "DEFAULT", new Dictionary(){ { "key_file", System.IO.Path.Combine(TestContext.CurrentContext.TestDirectory.Substring(0, TestContext.CurrentContext.TestDirectory.LastIndexOf("bin")), "Resources", "my.ini") }, { "fingerprint", "11:22:33:44:55:66:77" } } } + }, + ociProfile ="DEFAULT" + } + }; + + [Theory] + public void ValidatesEntries(Profiles profiles) + { + OciAuthenticationPlugin plugin = new OciAuthenticationPlugin(); + plugin._ociConfigProfile = profiles.ociProfile; + string exMsg; + + if (profiles.missingEntry) + { + exMsg = Assert.Throws(() => plugin.GetOciConfigValues(profiles.profiles, out string keyFile, out string fingerprint, out string securityTokenFilePath)).Message; + Assert.That(exMsg, Is.EqualTo(Resources.OciEntryNotFound).IgnoreCase); + } + else + { + plugin.GetOciConfigValues(profiles.profiles, out string keyFile, out string fingerprint, out string securityTokenFilePath); + exMsg = Assert.Throws(() => OciAuthenticationPlugin.SignData(new byte[0], keyFile)).Message; + Assert.That(exMsg, Is.EqualTo(Resources.OciInvalidKeyFile).IgnoreCase); + } + } + + [Test] + public void OtherThanDefaultProfile() + { + Dictionary> profiles = new(); + Dictionary valuesDefault = new() { { "fingerprint", "11:22:33:44:55:66" } }; + Dictionary valuesTest = new() { { "key_file", "keyFilePath" }, { "fingerprint", "66:55:44:33:22:11" }, { "security_token_file", "securityTokenFilePath" } }; + profiles.Add("DEFAULT", valuesDefault); + profiles.Add("TEST", valuesTest); + + OciAuthenticationPlugin plugin = new OciAuthenticationPlugin(); + plugin._ociConfigProfile = "TEST"; + plugin.GetOciConfigValues(profiles, out string keyFilePath, out string fingerprint, out string securityTokenFilePath); + + Assert.That(keyFilePath, Is.EqualTo("keyFilePath").IgnoreCase); + Assert.That(fingerprint, Is.EqualTo("66:55:44:33:22:11").IgnoreCase); + Assert.That(securityTokenFilePath, Is.EqualTo("securityTokenFilePath").IgnoreCase); + } + + [DatapointSource] + public string[] invalidPaths = new string[] + { + "\\invalid\\Path//Bad", + System.IO.Path.Combine(TestContext.CurrentContext.WorkDirectory, "config") + }; + + [Theory] + [Ignore("This test requires the OCI SDK for .NET")] + public void NonExistingConfigFile(string invalidPath) + { + string userName = "cnetuser1"; + string host = "100.101.74.201"; + uint port = 3307; + string configFilePath = invalidPath; + + var connStringBuilder = new MySqlConnectionStringBuilder() + { + UserID = userName, + Server = host, + Port = port, + OciConfigFile = configFilePath + }; + + using (var conn = new MySqlConnection(connStringBuilder.ConnectionString)) + { + string exMsg = Assert.Throws(() => conn.Open()).Message; + Assert.That(exMsg, Is.EqualTo(Resources.OciConfigFileNotFound).IgnoreCase); + } + } + + [Test] + public void OciSdkNotInstalled() + { + OciAuthenticationPlugin plugin = new OciAuthenticationPlugin(); + + string exMsg = Assert.Throws(() => plugin.AuthenticateAsync(false, false).GetAwaiter().GetResult()).Message; + Assert.That(exMsg, Is.EqualTo(Resources.OciSDKNotFound).IgnoreCase); + } + + [Test] + [Ignore("This test requires the OCI SDK for .NET")] + public void NonExistingConfigProfile() + { + string userName = "cnetuser1"; + string host = "100.101.74.201"; + uint port = 3307; + string configProfile = "NonExistentProfile"; + + var connStringBuilder = new MySqlConnectionStringBuilder() + { + UserID = userName, + Server = host, + Port = port, + OciConfigProfile = configProfile + }; + + using (var conn = new MySqlConnection(connStringBuilder.ConnectionString)) + { + string exMsg = Assert.Throws(() => conn.Open()).Message; + Assert.That(exMsg, Is.EqualTo(Resources.OciConfigProfileNotFound).IgnoreCase); + } + } + + [Test] + [Ignore("This test requires to have a 'security_token_file' larger than 10KB")] + public void SecurityTokenLargerThan10KB() + { + string securityTokenPath = "C:\\largePayload"; + Assert.Throws(() => OciAuthenticationPlugin.LoadSecurityToken(securityTokenPath)); + } + #endregion + + #region Multi Factor Authentication (MFA) + /// + /// WL14653 - Support for MFA (multi factor authentication) authentication + /// + [Test] + [Ignore("This test requires the plugin module 'auth_test_plugin' loaded. See WL14653 LLD.")] + [Property("Category", "Security")] + public void ConnectUsing1FAuth() + { + ExecuteSQL("CREATE USER IF NOT EXISTS user_1f IDENTIFIED WITH cleartext_plugin_server BY 'password1'", true); + + var connStringBuilder = new MySqlConnectionStringBuilder() + { + UserID = "user_1f", + Password = "password1", + Password2 = "otherPassword", + Password3 = "thirdPassword", + Server = Settings.Server, + Port = Settings.Port + }; + + using var conn = new MySqlConnection(connStringBuilder.ConnectionString); + conn.Open(); + Assert.That(conn.State, Is.EqualTo(ConnectionState.Open)); + } + + [TestCase("user_2f", "password1", "password2", true)] + [TestCase("sadmin", "perola1", "perola", true)] // using authentication_ldap_sasl as 2f auth (requires LDAP setup) + [TestCase("user_2f", "wrong", "password2", false)] + [TestCase("user_2f", "password1", "wrong", false)] + [TestCase("user_2f", "password1", "", false)] + [Ignore("This test requires the plugin module 'auth_test_plugin' loaded. See WL14653 LLD.")] + [Property("Category", "Security")] + public void ConnectUsing2FAuth(string user, string pwd, string pwd2, bool shouldPass) + { + // Requires LDAP setup + //ExecuteSQL("CREATE USER sadmin IDENTIFIED BY 'perola1' AND IDENTIFIED WITH authentication_ldap_sasl;"); + ExecuteSQL($"CREATE USER IF NOT EXISTS {user} IDENTIFIED WITH cleartext_plugin_server BY 'password1'" + + "AND IDENTIFIED WITH cleartext_plugin_server BY 'password2'", true); + + var connStringBuilder = new MySqlConnectionStringBuilder() + { + UserID = user, + Password = pwd, + Password2 = pwd2, + Server = Settings.Server, + Port = Settings.Port + }; + + using var conn = new MySqlConnection(connStringBuilder.ConnectionString); + + if (!shouldPass) + Assert.Throws(() => conn.Open()); + else + { + conn.Open(); + Assert.That(conn.State, Is.EqualTo(ConnectionState.Open)); + } + } + + [TestCase("user_3f", "password1", "password2", "password3", true)] + [TestCase("user_3f", "wrong", "password2", "password3", false)] + [TestCase("user_3f", "password1", "wrong", "password3", false)] + [TestCase("user_3f", "password1", "password2", "wrong", false)] + [TestCase("user_3f", "password1", "", "password3", false)] + [Ignore("This test requires the plugin module 'auth_test_plugin' loaded. See WL14653 LLD.")] + [Property("Category", "Security")] + public void ConnectUsing3FAuth(string user, string pwd, string pwd2, string pwd3, bool shouldPass) + { + ExecuteSQL("CREATE USER IF NOT EXISTS user_3f IDENTIFIED WITH cleartext_plugin_server BY 'password1'" + + "AND IDENTIFIED WITH cleartext_plugin_server BY 'password2'" + + "AND IDENTIFIED WITH cleartext_plugin_server BY 'password3'", true); + + var connStringBuilder = new MySqlConnectionStringBuilder() + { + UserID = user, + Password = pwd, + Password2 = pwd2, + Password3 = pwd3, + Server = Settings.Server, + Port = Settings.Port + }; + + using var conn = new MySqlConnection(connStringBuilder.ConnectionString); + + if (!shouldPass) + Assert.Throws(() => conn.Open()); + else + { + conn.Open(); + Assert.That(conn.State, Is.EqualTo(ConnectionState.Open)); + } + } + #endregion + + #region WebAuthn Authentication + /// + /// WL15193 - Support WebauthN in fido authentication plugin [Classic] + /// + [Test] + [Ignore("This should be executed manually since it depends on libfido2 library and user interaction.")] + [Property("Category", "Security")] + public void WebAuthnAuthenticationPasswordless() + { + // Install WebAuthn plugin + ExecuteSQL("INSTALL PLUGIN authentication_webauthn SONAME 'authentication_webauthn.so';", true); + // Create user + // The INITIAL AUTHENTICATION IDENTIFIED clause must be specified to set a random or a static password. + ExecuteSQL("CREATE USER 'user_f1'@'localhost' IDENTIFIED WITH authentication_webauthn INITIAL AUTHENTICATION IDENTIFIED BY 'bar';", true); + // Register the authenticator + // $ mysql --user=user_f1 --password=bar --register-factor=2 + + var connStringBuilder = new MySqlConnectionStringBuilder() + { + UserID = "user_f1", + Server = Settings.Server, + Port = Settings.Port + }; + + using var conn = new MySqlConnection(connStringBuilder.ConnectionString); + conn.WebAuthnActionRequested += Conn_WebAuthnActionRequested; + conn.Open(); + Assert.That(conn.State, Is.EqualTo(ConnectionState.Open)); + } + + [Test] + [Ignore("This should be executed manually since it depends on libfido2 library and user interaction.")] + [Property("Category", "Security")] + public void WebAuthnAuthentication2F() + { + //Install WebAuthn plugin + ExecuteSQL("INSTALL PLUGIN authentication_webauthn SONAME 'authentication_webauthn.so';", true); + //Create user + ExecuteSQL("CREATE USER 'user_f2' IDENTIFIED BY 'bar' AND IDENTIFIED WITH authentication_webauthn;", true); + //Register the authenticator + //$ mysql --user=user_f2 --password=bar --register-factor=2 + + var connStringBuilder = new MySqlConnectionStringBuilder() + { + UserID = "user_f2", + Server = Settings.Server, + Port = Settings.Port, + Password = "bar" + }; + + using var conn = new MySqlConnection(connStringBuilder.ConnectionString); + conn.WebAuthnActionRequested += Conn_WebAuthnActionRequested; + conn.Open(); + Assert.That(conn.State, Is.EqualTo(ConnectionState.Open)); + } + + [Test] + [Ignore("This should be executed manually since it depends on libfido2 library and user interaction.")] + [Property("Category", "Security")] + public void WebAuthnAuthentication3F() + { + // Install WebAuthn plugin + ExecuteSQL("INSTALL PLUGIN authentication_webauthn SONAME 'authentication_webauthn.so';", true); + // Create user + ExecuteSQL("CREATE USER 'user_f3' IDENTIFIED BY 'bar' AND IDENTIFIED WITH cleartext_plugin_server BY 'baz' AND IDENTIFIED WITH authentication_webauthn;", true); + // Register the authenticator + // $ mysql --user=user_f3 --password=bar --password2=baz --register-factor=3 + + var connStringBuilder = new MySqlConnectionStringBuilder() + { + UserID = "user_f3", + Server = Settings.Server, + Port = Settings.Port, + Password = "bar", + Password2 = "baz" + }; + + using var conn = new MySqlConnection(connStringBuilder.ConnectionString); + conn.WebAuthnActionRequested += Conn_WebAuthnActionRequested; + conn.Open(); + Assert.That(conn.State, Is.EqualTo(ConnectionState.Open)); + } + + [Test] + [Ignore("This should be executed manually since it depends on libfido2 library and user interaction.")] + [Property("Category", "Security")] + public void WebAuthnAuthenticationUnregisteredUserException() + { + // Install WebAuthn plugin + ExecuteSQL("INSTALL PLUGIN authentication_webauthn SONAME 'authentication_webauthn.so';", true); + // Create user + // The INITIAL AUTHENTICATION IDENTIFIED clause must be specified to set a random or a static password. + ExecuteSQL("CREATE USER 'foo'@'localhost' IDENTIFIED WITH authentication_webauthn INITIAL AUTHENTICATION IDENTIFIED BY 'bar';", true); + + var connStringBuilder = new MySqlConnectionStringBuilder() + { + UserID = "foo", + Server = Settings.Server, + Port = Settings.Port + }; + + using var conn = new MySqlConnection(connStringBuilder.ConnectionString); + conn.WebAuthnActionRequested += Conn_WebAuthnActionRequested; + Assert.Throws(() => conn.Open()); + } + + [Test] + [Ignore("This should be executed manually since it depends on libfido2 library and user interaction.")] + [Property("Category", "Security")] + public void WebAuthnAuthenticationNoUserGestureException() + { + // Install WebAuthn plugin + ExecuteSQL("INSTALL PLUGIN authentication_webauthn SONAME 'authentication_webauthn.so';", true); + // Create user + // The INITIAL AUTHENTICATION IDENTIFIED clause must be specified to set a random or a static password. + ExecuteSQL("CREATE USER 'foo'@'localhost' IDENTIFIED WITH authentication_webauthn INITIAL AUTHENTICATION IDENTIFIED BY 'bar';", true); + // Register the authenticator + // $ mysql --user=foo --password=bar --register-factor=2 + + var connStringBuilder = new MySqlConnectionStringBuilder() + { + UserID = "foo", + Server = Settings.Server, + Port = Settings.Port + }; + + using var conn = new MySqlConnection(connStringBuilder.ConnectionString); + conn.WebAuthnActionRequested += Conn_WebAuthnActionRequested; + Assert.Throws(() => conn.Open()); + } + + private static void Conn_WebAuthnActionRequested() + { + Console.WriteLine("Please insert FIDO device and perform gesture action for authentication to complete."); + } + #endregion + + #region OpenID Connect client + /// + /// WL16491 - OpenID Connect authentication support + /// + + private static string IdentityToken = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJteXN1YmoiLCJpc3MiOiJodHRw" + + "czovL215aXNzdWVyLmNvbSIsImV4cCI6MjEzNTE5ODEwNX0.kXjtDjcSYhpNP0IgSbQjPuOsd-nBDVulQKgZAq4HkgMPCNINh-EIMbuqvYKkE5a" + + "B6zicm6PHNvxDrS63NjQH7Nh7s29eN50DSK33zQsvdYr8O5eUTL2SrNRqpWgMQ0xlU9Hr4HCw10YmIcwjskANHJxXSgyUCKveeRCR-L-DoNFZDy" + + "UYyd3pu7M1zO-12LjebktMklCQBfiCAcqSNDZDE2s6OkxuoF7VOtK91Wsw17xOZVQDjCZkUDtUrRZs8uxJfbjBonQ7LVQQhg227z8lrUeXewVhx" + + "NKPrf-YUrdMmEfMBjwD9v1AU5onKlkHuW0DtvZmt707Kyd-ve-HgQj1xX-W6BfEPo-28FCcDvLGlXZ8cyB1wPODogKhtc7bq3TPuTkDkegO7AG1" + + "NaYXcbSNEpQQ5zdfbzS_spV2zzJawPK1awNUeT_UA7t4swY4JcrOFkPkXUTqWT9QWvXuxCE9gZUAWIa3FHdeWjzLTZEKB8-ZhPYmyPphkzds9sm" + + "TJi4gawmNtb8WvEpXZUUXIZzIRcunXEdIayr18E9XfFCOCQo8JQOSxY3HQGgzqYk4S0AMeR0BiBIKe9VySsykdAuhLvL51AZDXvKQ9fQDu4lAtk" + + "cXrKCZwA_2RXjLzOM7dkySQu66t-GIIZXxqCdcWf1"; + + private static string OpenId_server_config = "JSON://{\"myissuer\":\"{\\\\\"kty\\\\\": \\\\\"RSA\\\\\",\\\\\"n\\\\\":" + + " \\\\\"zpnGGekMZHmWtpcsBmJdUODRApNHU7_bijsn4E0MWhthfkyK1LilQp5-aemc6Id5yL978CMfn10LXsjGchZKIGAgk52nW7kI3Zt973npwzB2M" + + "YJ4FFqsHQSAM9kvd3iUz2aQG-nVVl9Ia8Yimcssav8sEjOlEqZ1n_JLXavWwI9z-_lkTcZBgsM9jke_tWa1yLjYce009yBmf-sJMDrXZ-3TALrNUDzGt" + + "9mQwDxjE0UGnQIQE7vXJ2O5-k1qXMKPTew32zvRD7Bxcsxe71LRaerEPmgnricajk5LJVsbonavecrvHDCGDvOgzueZrr15kUhXZxZbXmtx6dUYqJ-0A" + + "qbZ0Km3elrYnDFysJR5pJsjmDnH2wzHDQ_gZeC_Up_4d78pzLyXHhiOmyDTLyogmeN7xYunvgzu-B4tepSC9XCSu-WZDmJASFaxRzOJhQBKLX2Ly0XmS" + + "LMXEP-vOupwvEi-SpBOVw2WzxT9dJrK-vI6cBGewB-zHrwsLFBvt1OZVNV5YGpQ1kqFfFoWrtkINFwJc39UnboDqalhvim9K-ITRe6xYk_Dlf9f-BA5b" + + "sry8n3GBBXEjkirM_QFb_DcbBXj1OJX_B0BZAK0bupYgOpxDG_su1a8N3CqOOWJguVzuydl7uW_uicDkCua3cVWd-n8QtXDaM6qZLRTB7q0_ek\\\\\"" + + ",\\\\\"e\\\\\": \\\\\"AQAB\\\\\",\\\\\"alg\\\\\": \\\\\"RS256\\\\\",\\\\\"use\\\\\": \\\\\"sig\\\\\",\\\\\"name" + + "\\\\\": \\\\\"https://myissuer.com\\\\\"}\"}"; + + [Test] + [Ignore("This test requires a server version 9.1.0 or higher configured to use OpenID Connect authentication")] + public void OpenIdConnectClient() + { + Assume.That(Version >= new Version("9.1.0"), "This test is for MySQL 9.1.0 or higher"); + Assume.That(Check_Plugin_Enabled("authentication_openid_connect"), "authentication_openid_connect plugin must be enabled on the server to run this test"); + + ExecuteSQL("SET GLOBAL authentication_openid_connect_configuration = '" + OpenId_server_config + "'", true); + + ExecuteSQL("CREATE USER IF NOT EXISTS 'openid-testuser'@'%' IDENTIFIED WITH 'authentication_openid_connect' AS '{\"identity_provider\" : \"myissuer\", \"user\" : \"mysubj\"}'", true); + + var connStringBuilder1 = new MySqlConnectionStringBuilder() + { + UserID = "openid-testuser", + Server = Settings.Server, + Port = Settings.Port, + OpenIdIdentityToken = IdentityToken + }; + using (MySqlConnection conn = new MySqlConnection(connStringBuilder1.ConnectionString)) + { + conn.Open(); + Assert.That(conn.connectionState, Is.EqualTo(ConnectionState.Open)); + } + + var connStringBuilder2 = new MySqlConnectionStringBuilder() + { + UserID = "openid-testuser", + Server = Settings.Server, + Port = Settings.Port, + OpenIdIdentityToken = IdentityToken, + DefaultAuthenticationPlugin = "authentication_openid_connect_client" + }; + using (MySqlConnection conn = new MySqlConnection(connStringBuilder2.ConnectionString)) + { + conn.Open(); + Assert.That(conn.connectionState, Is.EqualTo(ConnectionState.Open)); + } + + var connStringBuilder3 = new MySqlConnectionStringBuilder() + { + UserID = "openid-testuser", + Server = Settings.Server, + Port = Settings.Port, + OpenIdIdentityToken = "", + DefaultAuthenticationPlugin = "authentication_openid_connect_client" + }; + using (MySqlConnection conn = new MySqlConnection(connStringBuilder3.ConnectionString)) + { + Assert.Throws(() => conn.Open()); + } + + char[] reversedIdentityToken = IdentityToken.ToCharArray(); + Array.Reverse(reversedIdentityToken); + + var connStringBuilder4 = new MySqlConnectionStringBuilder() + { + UserID = "openid-testuser", + Server = Settings.Server, + Port = Settings.Port, + OpenIdIdentityToken = new string(reversedIdentityToken), + DefaultAuthenticationPlugin = "authentication_openid_connect_client" + }; + using (MySqlConnection conn = new MySqlConnection(connStringBuilder4.ConnectionString)) + { + Assert.Throws(() => conn.Open()); + } + + ExecuteSQL("DROP USER IF EXISTS 'openid-testuser'@'%'", true); + } + #endregion + + [Test, Description("Test User Authentication Fails with classic protocol")] + public void AuthPlainAndMySql41() + { + if (Version <= new Version("5.7")) return; + MySqlConnection connection = null; + var connectionString = $"server={Settings.Server};user={Settings.UserID};port={Port};password={Settings.Password};auth=PLAIN"; + Assert.Throws(() => connection = new MySqlConnection(connectionString)); + + connectionString = $"server={Settings.Server};user={Settings.UserID};port={Port};password={Settings.Password};auth=MySQL41"; + Assert.Throws(() => connection = new MySqlConnection(connectionString)); + } + + [Test, Description("Test caching_sha2_password feature in the client(auth plugin=sha2_password and native password) in the server(>=8.0.4) " + + "with secure connections(classic connection).Server started with mysql native password plugin")] + public void Sha256AndNativeWithCertificates() + { + Assume.That(Version >= new Version("8.0.4"), "This test is for MySql 8.0.4 or higher"); + Assume.That(Check_Plugin_Enabled("mysql_native_password"), "mysql_native_password plugin must be enabled on the server to run this test"); + Assume.That(Check_Plugin_Enabled("caching_sha2_password"), "This test needs plugin caching_sha2_password"); + + // Test connection for VALID user in LDAP server with different SSLMode values, expected result pass + string assemblyPath = Assembly.GetExecutingAssembly().Location.Replace(String.Format("{0}.dll", + Assembly.GetExecutingAssembly().GetName().Name), string.Empty); + + string _sslCa = _sslCa = assemblyPath + "ca.pem"; + string _sslWrongCert = assemblyPath + "client-incorrect.pfx"; + + FileAssert.Exists(_sslCa); + FileAssert.Exists(_sslWrongCert); + + string pluginName = "sha256_password"; + MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder(); + builder.Server = Host; + builder.Port = Convert.ToUInt32(Port); + builder.UserID = "testCachingSha2"; + builder.Password = "test"; + CreateUser(builder.UserID, builder.Password, pluginName); + + // Authentication using RSA keys. Only available in servers compiled with OpenSSL (E.g. Commercial). + bool serverCompiledUsingOpenSsl = false; + builder.Password = "test"; + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + MySqlCommand command = new MySqlCommand("SHOW SESSION STATUS LIKE 'Rsa_public_key';", connection); + + using (MySqlDataReader reader = command.ExecuteReader()) + { + if (reader.HasRows) + { + reader.Read(); + if (!string.IsNullOrEmpty(reader.GetString(1))) serverCompiledUsingOpenSsl = true; + } + } + } + + // Authentication success with full authentication - TLS connection. + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + connection.Close(); + } + + // Authentication fails with full authentication - TLS connection.SSL Mode default disabled + builder.SslMode = MySqlSslMode.Disabled; + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + Assert.Throws(() => connection.Open()); + } + + string connStr = null; + connStr = $"server={Host};port={Port};user={builder.UserID};password={builder.Password};"; + connStr += $";SSL Mode=Required;CertificateFile={_sslCa};CertificatePassword=pass;"; + using (MySqlConnection connection = new MySqlConnection(connStr)) + { + connection.Open(); + connection.Close(); + } + + connStr = string.Empty; + connStr = $"server={Host};port={Port};user={builder.UserID};password={builder.Password};"; + connStr += $";SSL Mode=VerifyCA;CertificateFile={_sslCa};CertificatePassword=pass;"; + using (MySqlConnection connection = new MySqlConnection(connStr)) + { + connection.Open(); + connection.Close(); + } + + connStr = string.Empty; + connStr = $"server={Host};port={Port};user={builder.UserID};password={builder.Password};"; + connStr += $";SSL Mode=Required;CertificateFile={_sslCa};CertificatePassword=wrongpass;"; + using (MySqlConnection connection = new MySqlConnection(connStr)) + { + connection.Open(); + connection.Close(); + } + + connStr = string.Empty; + connStr = $"server={Host};port={Port};user={builder.UserID};password={builder.Password};"; + connStr += $";SSL Mode=VerifyCA;CertificateFile={_sslCa};CertificatePassword=wrongpass;"; + using (MySqlConnection connection = new MySqlConnection(connStr)) + { + connection.Open(); + connection.Close(); + } + + connStr = string.Empty; + connStr = $"server={Host};port={Port};user={builder.UserID};password={builder.Password};"; + connStr += $";SSL Mode=Required;CertificateFile={_sslWrongCert};CertificatePassword=pass;"; + using (MySqlConnection connection = new MySqlConnection(connStr)) + { + Assert.Catch(() => connection.Open()); + } + + // Flush privileges clears the cache. + ExecuteSQL("flush privileges"); + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString + ";pooling=false")) + { + Assert.Throws(() => connection.Open()); + } + + if (serverCompiledUsingOpenSsl) + { + builder.SslMode = MySqlSslMode.Disabled; + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString + ";AllowPublicKeyRetrieval=false;pooling=false")) + { + Assert.Throws(() => connection.Open()); + } + + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString + ";AllowPublicKeyRetrieval=true;pooling=false")) + { + connection.Open(); + } + } + + // Authentication - TLS connection. + builder.UserID = "testCachingSha2"; + builder.Password = "test"; + builder.SslMode = MySqlSslMode.Preferred; + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + connection.Close(); + } + + builder.UserID = "testCachingSha2"; + builder.Password = "test"; + builder.SslMode = MySqlSslMode.Required; + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + connection.Close(); + } + + // Flush privileges clears the cache. + ExecuteSQL("flush privileges"); + builder.Password = "incorrectPassword"; + Assert.Throws(() => new MySqlConnection(builder.ConnectionString).Open()); + + // Authentication success with empty password – Any connection. + builder = new MySqlConnectionStringBuilder(); + builder.Server = Host; + builder.Port = Convert.ToUInt32(Port); + builder.UserID = "testCachingSha2NoPassword"; + builder.Password = ""; + CreateUser(builder.UserID, builder.Password, pluginName); + + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + connection.Close(); + } + + builder.SslMode = MySqlSslMode.Disabled; + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + connection.Close(); + } + + builder.UserID = "testCachingSha2"; + builder.SslMode = MySqlSslMode.Required; + Assert.Throws(() => new MySqlConnection(builder.ConnectionString).Open()); + + builder.SslMode = MySqlSslMode.Disabled; + Assert.Throws(() => new MySqlConnection(builder.ConnectionString).Open()); + + pluginName = "mysql_native_password"; + builder = new MySqlConnectionStringBuilder(RootSettings.ConnectionString); + builder.UserID = "testNative"; + builder.Password = "test"; + CreateUser(builder.UserID, builder.Password, pluginName); + + // TLS enabled. + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + connection.Close(); + } + + + builder.SslMode = MySqlSslMode.Disabled; + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + connection.Close(); + } + + builder.SslMode = MySqlSslMode.Required; + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + connection.Close(); + } + + ExecuteSQL("flush privileges"); + builder.SslMode = MySqlSslMode.Disabled; + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + connection.Close(); + } + + connStr = string.Empty; + connStr = $"server={Host};port={Port};user={builder.UserID};password={builder.Password};"; + connStr += $";SSL Mode=Required;CertificateFile={_sslCa};CertificatePassword=pass;"; + using (MySqlConnection connection = new MySqlConnection(connStr)) + { + connection.Open(); + connection.Close(); + } + + pluginName = "mysql_native_password"; + builder = new MySqlConnectionStringBuilder(); + builder.Server = Host; + builder.Port = Convert.ToUInt32(Port); + builder.UserID = "testNativeBlankPassword"; + builder.Password = ""; + CreateUser(builder.UserID, builder.Password, pluginName); + + // TLS enabled. + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + connection.Close(); + } + + // TLS not enabled. + builder.SslMode = MySqlSslMode.Disabled; + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + connection.Close(); + } + + builder.SslMode = MySqlSslMode.Required; + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + connection.Close(); + } + + ExecuteSQL("flush privileges"); + builder.SslMode = MySqlSslMode.Disabled; + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + connection.Close(); + } + + connStr = string.Empty; + connStr = $"server={Host};port={Port};user={builder.UserID};password={builder.Password};"; + connStr += $";SSL Mode=Required;CertificateFile={_sslCa};CertificatePassword=pass;"; + using (MySqlConnection connection = new MySqlConnection(connStr)) + { + connection.Open(); + connection.Close(); + } + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/BlobTests.cs b/MySQL.Data/tests/MySql.Data.Tests/BlobTests.cs new file mode 100644 index 000000000..31458255e --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/BlobTests.cs @@ -0,0 +1,339 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Data; +using NUnit.Framework; +using NUnit.Framework.Legacy; + +namespace MySql.Data.MySqlClient.Tests +{ + public class BlobTests : TestBase + { + [Test] + public void InsertNullBinary() + { + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, blob1 LONGBLOB, PRIMARY KEY(id))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?id, ?b1)", Connection); + cmd.Parameters.Add(new MySqlParameter("?id", 1)); + cmd.Parameters.Add(new MySqlParameter("?b1", null)); + int rows = cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM Test"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.HasRows, Is.EqualTo(true), "Checking HasRows"); + + reader.Read(); + var value = reader.GetValue(1) as string; + Assert.That(value, Is.EqualTo(null)); + } + } + + [Test] + public void InsertBinary() + { + int lenIn = 400000; + byte[] dataIn = Utils.CreateBlob(lenIn); + + ExecuteSQL("DROP TABLE IF EXISTS InsertBinary"); + ExecuteSQL("CREATE TABLE InsertBinary (id INT NOT NULL, blob1 LONGBLOB, PRIMARY KEY(id))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO InsertBinary VALUES (?id, ?b1)", Connection); + cmd.Parameters.Add(new MySqlParameter("?id", 1)); + cmd.Parameters.Add(new MySqlParameter("?b1", dataIn)); + int rows = cmd.ExecuteNonQuery(); + + byte[] dataIn2 = Utils.CreateBlob(lenIn); + cmd.Parameters[0].Value = 2; + cmd.Parameters[1].Value = dataIn2; + rows += cmd.ExecuteNonQuery(); + + Assert.That(rows == 2, "Checking insert rowcount"); + + cmd.CommandText = "SELECT * FROM InsertBinary"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.HasRows, Is.EqualTo(true), "Checking HasRows"); + + reader.Read(); + + byte[] dataOut = new byte[lenIn]; + long lenOut = reader.GetBytes(1, 0, dataOut, 0, lenIn); + + Assert.That(lenIn, Is.EqualTo(lenOut), "Checking length of binary data (row 1)"); + + // now see if the buffer is intact + for (int x = 0; x < dataIn.Length; x++) + Assert.That(dataIn[x], Is.EqualTo(dataOut[x]), "Checking first binary array at " + x); + + // now we test chunking + int pos = 0; + int lenToRead = dataIn.Length; + while (lenToRead > 0) + { + int size = Math.Min(lenToRead, 1024); + int read = (int)reader.GetBytes(1, pos, dataOut, pos, size); + lenToRead -= read; + pos += read; + } + // now see if the buffer is intact + for (int x = 0; x < dataIn.Length; x++) + Assert.That(dataIn[x], Is.EqualTo(dataOut[x]), "Checking first binary array at " + x); + + reader.Read(); + lenOut = reader.GetBytes(1, 0, dataOut, 0, lenIn); + Assert.That(lenIn == lenOut, "Checking length of binary data (row 2)"); + + // now see if the buffer is intact + for (int x = 0; x < dataIn2.Length; x++) + Assert.That(dataIn2[x], Is.EqualTo(dataOut[x]), "Checking second binary array at " + x); + } + } + + [Test] + public void GetChars() + { + InternalGetChars(false); + } + + [Test] + public void GetCharsPrepared() + { + InternalGetChars(true); + } + + private void InternalGetChars(bool prepare) + { + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, text1 LONGTEXT, PRIMARY KEY(id))"); + + char[] data = new char[20000]; + for (int x = 0; x < data.Length; x++) + data[x] = (char)(65 + (x % 20)); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (1, ?text1)", Connection); + cmd.Parameters.AddWithValue("?text1", data); + if (prepare) + cmd.Prepare(); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM Test"; + cmd.Parameters.Clear(); + if (prepare) + cmd.Prepare(); + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + + // now we test chunking + char[] dataOut = new char[data.Length]; + int pos = 0; + int lenToRead = data.Length; + while (lenToRead > 0) + { + int size = Math.Min(lenToRead, 1024); + int read = (int)reader.GetChars(1, pos, dataOut, pos, size); + lenToRead -= read; + pos += read; + } + // now see if the buffer is intact + for (int x = 0; x < data.Length; x++) + Assert.That(data[x], Is.EqualTo(dataOut[x]), "Checking first text array at " + x); + } + } + + [Test] + public void InsertText() + { + InternalInsertText(false); + } + + [Test] + public void InsertTextPrepared() + { + InternalInsertText(true); + } + + private void InternalInsertText(bool prepare) + { + ExecuteSQL("DROP TABLE IF EXISTS InsertText"); + ExecuteSQL("CREATE TABLE InsertText (id INT NOT NULL, blob1 LONGBLOB, text1 LONGTEXT, PRIMARY KEY(id))"); + + byte[] data = new byte[1024]; + for (int x = 0; x < 1024; x++) + data[x] = (byte)(65 + (x % 20)); + + // Create sample table + MySqlCommand cmd = new MySqlCommand("INSERT INTO InsertText VALUES (1, ?b1, ?t1)", Connection); + cmd.Parameters.Add(new MySqlParameter("?t1", data)); + cmd.Parameters.Add(new MySqlParameter("?b1", "This is my blob data")); + if (prepare) cmd.Prepare(); + int rows = cmd.ExecuteNonQuery(); + Assert.That(rows, Is.EqualTo(1), "Checking insert rowcount"); + + cmd.CommandText = "INSERT INTO InsertText VALUES(2, ?b1, ?t1)"; + cmd.Parameters.Clear(); + cmd.Parameters.AddWithValue("?t1", DBNull.Value); + string str = "This is my text value"; + + cmd.Parameters.AddWithValue("?b1", str); + + rows = cmd.ExecuteNonQuery(); + Assert.That(rows, Is.EqualTo(1), "Checking insert rowcount"); + + cmd.CommandText = "SELECT * FROM InsertText"; + if (prepare) cmd.Prepare(); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.HasRows, "Checking HasRows"); + + Assert.That(reader.Read()); + + string s = reader.GetString(2); + Assert.That(s.Length, Is.EqualTo(1024), "Checking length returned "); + Assert.That(s.Substring(0, 9), Is.EqualTo("ABCDEFGHI"), "Checking first few chars of string"); + + Assert.That(reader.Read()); + Assert.That(reader.GetValue(2), Is.EqualTo(DBNull.Value)); + } + } + + [Test] + public void GetCharsOnLongTextColumn() + { + ExecuteSQL("CREATE TABLE Test1 (id INT NOT NULL, blob1 LONGBLOB, text1 LONGTEXT, PRIMARY KEY(id))"); + ExecuteSQL("INSERT INTO Test1 (id, text1) VALUES(1, 'Test')"); + + MySqlCommand cmd = new MySqlCommand("SELECT id, text1 FROM Test1", Connection); + char[] buf = new char[2]; + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + reader.GetChars(1, 0, buf, 0, 2); + Assert.That(buf[0], Is.EqualTo('T')); + Assert.That(buf[1], Is.EqualTo('e')); + } + } + + [Test] + public void MediumIntBlobSize() + { + ExecuteSQL("DROP TABLE IF EXISTS Test"); + + ExecuteSQL("CREATE TABLE Test (id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, " + + "image MEDIUMBLOB NOT NULL, imageSize MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT 0, " + + "PRIMARY KEY (id))"); + + byte[] image = new byte[2048]; + for (int x = 0; x < image.Length; x++) + image[x] = (byte)(x % 47); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(NULL, ?image, ?size)", Connection); + cmd.Parameters.AddWithValue("?image", image); + cmd.Parameters.AddWithValue("?size", image.Length); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT imageSize, length(image), image FROM Test WHERE id=?id"; + cmd.Parameters.AddWithValue("?id", 1); + cmd.Prepare(); + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + uint actualsize = reader.GetUInt32(1); + Assert.That(actualsize, Is.EqualTo((uint)image.Length)); + + uint size = reader.GetUInt32(0); + byte[] outImage = new byte[size]; + long len = reader.GetBytes(reader.GetOrdinal("image"), 0, outImage, 0, (int)size); + Assert.That(size, Is.EqualTo((uint)image.Length)); + Assert.That(len, Is.EqualTo((uint)image.Length)); + } + } + + [Test] + public void BlobBiggerThanMaxPacket() + { + ExecuteSQL("SET GLOBAL max_allowed_packet=" + 500 * 1024, true); + + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE Test (id INT(10), image BLOB)"); + + using (var c = GetConnection()) + { + byte[] image = Utils.CreateBlob(1000000); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(NULL, ?image)", c); + cmd.Parameters.AddWithValue("?image", image); + + Exception ex = Assert.Throws(() => cmd.ExecuteNonQuery()); + Assert.That(ex.Message, Is.EqualTo(Resources.QueryTooLarge)); + } + } + + [Test] + public void UpdateDataSet() + { + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, blob1 LONGBLOB, text1 LONGTEXT, PRIMARY KEY(id))"); + ExecuteSQL("INSERT INTO Test VALUES( 1, NULL, 'Text field' )"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + DataTable dt = new DataTable(); + da.Fill(dt); + + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + + string s = (string)dt.Rows[0][2]; + Assert.That(s, Is.EqualTo("Text field")); + + byte[] inBuf = Utils.CreateBlob(512); + dt.Rows[0].BeginEdit(); + dt.Rows[0]["blob1"] = inBuf; + dt.Rows[0].EndEdit(); + DataTable changes = dt.GetChanges(); + da.Update(changes); + dt.AcceptChanges(); + + dt.Clear(); + da.Fill(dt); + cb.Dispose(); + + byte[] outBuf = (byte[])dt.Rows[0]["blob1"]; + Assert.That(inBuf.Length, Is.EqualTo(outBuf.Length), "checking length of updated buffer"); + + for (int y = 0; y < inBuf.Length; y++) + Assert.That(inBuf[y] == outBuf[y], Is.True, "checking array data"); + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/BlobTestsCompressed.cs b/MySQL.Data/tests/MySql.Data.Tests/BlobTestsCompressed.cs new file mode 100644 index 000000000..b27875d3e --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/BlobTestsCompressed.cs @@ -0,0 +1,42 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework; +using NUnit.Framework.Legacy; + +namespace MySql.Data.MySqlClient.Tests +{ + [Property("Category", "Compressed")] + public class BlobTestsCompressed : BlobTests + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.UseCompression = true; + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/CharSetTests.cs b/MySQL.Data/tests/MySql.Data.Tests/CharSetTests.cs new file mode 100644 index 000000000..90c0db97c --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/CharSetTests.cs @@ -0,0 +1,631 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Data; + +namespace MySql.Data.MySqlClient.Tests +{ + public class CharSetTests : TestBase + { + protected override void Cleanup() + { + ExecuteSQL(String.Format("DROP TABLE IF EXISTS `{0}`.Test", Connection.Database)); + } + + [Test] + public void UseFunctions() + { + ExecuteSQL("CREATE TABLE Test (valid char, UserCode varchar(100), password varchar(100)) CHARSET latin1"); + + using (var conn = new MySqlConnection(Connection.ConnectionString + ";charset=latin1")) + { + conn.Open(); + MySqlCommand cmd = new MySqlCommand("SELECT valid FROM Test WHERE Valid = 'Y' AND " + + "UserCode = 'username' AND Password = AES_ENCRYPT('Password','abc')", conn); + cmd.ExecuteScalar(); + } + } + + [Test] + public void VarBinary() + { + ExecuteSQL("CREATE TABLE Test (id int, name varchar(200) collate utf8_bin) charset utf8"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'Test1')"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + object o = reader.GetValue(1); + Assert.That(o is string); + } + } + + [Test] + public void Latin1Connection() + { + ExecuteSQL("CREATE TABLE Test (id INT, name VARCHAR(200)) CHARSET latin1"); + ExecuteSQL("INSERT INTO Test VALUES( 1, _latin1 'Test')"); + + using (var conn = new MySqlConnection(Connection.ConnectionString + ";charset=latin1")) + { + conn.Open(); + + MySqlCommand cmd = new MySqlCommand("SELECT id FROM Test WHERE name LIKE 'Test'", conn); + object id = cmd.ExecuteScalar(); + Assert.That(id, Is.EqualTo(1)); + } + } + + /// + /// Bug #40076 "Functions Return String" option does not set the proper encoding for the string + /// + [Test] + public void FunctionReturnsStringWithCharSet() + { + string connStr = Connection.ConnectionString + ";functions return string=true"; + using (var conn = new MySqlConnection(connStr)) + { + conn.Open(); + + MySqlCommand cmd = new MySqlCommand( + "SELECT CONCAT('Trädgårdsvägen', 1)", conn); + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetString(0), Is.EqualTo("Trädgårdsvägen1")); + } + } + } + + /// + /// Fix Bug #27818822 CONTRIBUTION: FIXING ENCODING FOR ENTITY FRAMEWORK CORE + /// + [Test] + public void Encoding() + { + ExecuteSQL("CREATE TABLE Test (id int, name VARCHAR(200))"); + ExecuteSQL("INSERT INTO Test VALUES(1, 'äâáàç')"); + + using (var conn = new MySqlConnection(Connection.ConnectionString)) + { + conn.Open(); + + MySqlCommand cmd = new MySqlCommand("SELECT name FROM Test", conn); + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetString(0), Is.EqualTo("äâáàç")); + } + } + } + + [Test] + public void RespectBinaryFlags() + { + if (Connection.driver.Version.isAtLeast(5, 5, 0)) return; + + string connStr = Connection.ConnectionString + ";respect binary flags=true"; + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + + MySqlDataAdapter da = new MySqlDataAdapter( + "SELECT CONCAT('Trädgårdsvägen', 1)", c); + DataTable dt = new DataTable(); + da.Fill(dt); + Assert.That(dt.Rows[0][0] is byte[]); + } + connStr = Connection.ConnectionString + ";respect binary flags=false"; + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + + MySqlDataAdapter da = new MySqlDataAdapter( + "SELECT CONCAT('Trädgårdsvägen', 1)", c); + DataTable dt = new DataTable(); + da.Fill(dt); + Assert.That(dt.Rows[0][0] is string); + Assert.That(dt.Rows[0][0], Is.EqualTo("Trädgårdsvägen1")); + } + } + + [Test] + public void RussianErrorMessagesShowCorrectly() + { + MySqlCommand cmd = new MySqlCommand("SHOW VARIABLES LIKE '%lc_messages'", Root); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + if (!reader.GetString(1).Equals("ru_RU")) + { + Console.Error.WriteLine("This test requires starting the server with Russian language."); + return; + } + } + + string expected = "У вас ошибка в запросе. Изучите документацию по используемой версии MySQL на предмет корректного синтаксиса около 'query with error' на строке 1"; + try + { + string connectionString = Connection.ConnectionString + "; Character Set=cp1251"; + MySqlHelper.ExecuteNonQuery(connectionString, "query with error"); + } + catch (MySqlException e) + { + Assert.That(e.Message, Is.EqualTo(expected)); + } + } + + + + /// + /// Test for fix of Connector/NET cannot read data from a MySql table using UTF-16/UTF-32 + /// (MySql bug #69169, Oracle bug #16776818). + /// + [Test] + public void UsingUtf16() + { + ExecuteSQL(@"CREATE TABLE Test ( + `actor_id` smallint(5) unsigned NOT NULL DEFAULT '0', + `first_name` varchar(45) NOT NULL, + `last_name` varchar(45) NOT NULL, + `last_update` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' + ) ENGINE=InnoDB DEFAULT CHARSET=utf16"); + + string[] firstNames = new string[] { "PENELOPE", "NICK", "ED" }; + string[] lastNames = new string[] { "GUINESS", "WAHLBERG", "CHASE" }; + DateTime[] lastUpdates = new DateTime[] { + new DateTime(2006, 2, 15, 4, 34, 33), new DateTime(2007, 2, 15, 4, 34, 33), new DateTime(2008, 4, 15, 4, 34, 33) }; + for (int i = 0; i < firstNames.Length; i++) + { + string sql2 = String.Format( + "INSERT INTO Test( actor_id, first_name, last_name, last_update ) values ( {0}, '{1}', '{2}', '{3}' )", + i, firstNames[i], lastNames[i], lastUpdates[i].ToString("yyyy/MM/dd hh:mm:ss")); + ExecuteSQL(sql2); + } + + string sql = "select actor_id, first_name, last_name, last_update from Test"; + + using (var reader = ExecuteReader(sql)) + { + int j = 0; + while (reader.Read()) + { + for (int i = 0; i < reader.FieldCount; i++) + { + Assert.That(j, Is.EqualTo(reader.GetInt32(0))); + Assert.That(firstNames[j], Is.EqualTo(reader.GetString(1))); + Assert.That(lastNames[j], Is.EqualTo(reader.GetString(2))); + Assert.That(lastUpdates[j], Is.EqualTo(reader.GetDateTime(3))); + } + j++; + } + } + } + + /// + /// 2nd part of tests for fix of Connector/NET cannot read data from a MySql table using UTF-16/UTF-32 + /// (MySql bug #69169, Oracle bug #16776818). + /// + [Test] + public void UsingUtf32() + { + ExecuteSQL(@"CREATE TABLE `Test` ( + `actor_id` smallint(5) unsigned NOT NULL DEFAULT '0', + `first_name` varchar(45) NOT NULL, + `last_name` varchar(45) NOT NULL, + `last_update` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' + ) ENGINE=InnoDB DEFAULT CHARSET=utf32"); + + string[] firstNames = new string[] { "PENELOPE", "NICK", "ED" }; + string[] lastNames = new string[] { "GUINESS", "WAHLBERG", "CHASE" }; + DateTime[] lastUpdates = new DateTime[] { + new DateTime(2006, 2, 15, 4, 34, 33), new DateTime(2007, 2, 15, 4, 34, 33), new DateTime(2008, 4, 15, 4, 34, 33) }; + for (int i = 0; i < firstNames.Length; i++) + { + string sql2 = string.Format( + "insert into `Test`( actor_id, first_name, last_name, last_update ) values ( {0}, '{1}', '{2}', '{3}' )", + i, firstNames[i], lastNames[i], lastUpdates[i].ToString("yyyy/MM/dd hh:mm:ss")); + ExecuteSQL(sql2); + } + + string sql = "select actor_id, first_name, last_name, last_update from `Test`"; + + using (var reader = ExecuteReader(sql)) + { + int j = 0; + while (reader.Read()) + { + for (int i = 0; i < reader.FieldCount; i++) + { + Assert.That(j, Is.EqualTo(reader.GetInt32(0))); + Assert.That(firstNames[j], Is.EqualTo(reader.GetString(1))); + Assert.That(lastNames[j], Is.EqualTo(reader.GetString(2))); + Assert.That(lastUpdates[j], Is.EqualTo(reader.GetDateTime(3))); + } + j++; + } + } + } + + + + /// + /// Test for new functionality on 5.7.9 supporting chinese character sets gb18030 + /// WL #4024 + /// (Oracle bug #21098546). + /// Disabled due to intermittent failure. Documented under Oracle bug #27010958 + /// + [Test] + [Ignore("Fix this")] + public void CanInsertChineseCharacterSetGB18030() + { + if (Version < new Version(5, 7, 4)) return; + + ExecuteSQL("CREATE TABLE Test (id int, name VARCHAR(100) CHAR SET gb18030, KEY(name(20)))"); + using (MySqlConnection c = new MySqlConnection(Connection.ConnectionString + ";charset=gb18030")) + { + c.Open(); + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1, '㭋玤䂜蚌')", c); + cmd.ExecuteNonQuery(); + cmd = new MySqlCommand("INSERT INTO Test VALUES(2, 0xC4EEC5ABBDBFA1A4B3E0B1DABBB3B9C520A1A4CBD5B6ABC6C2)", c); + cmd.ExecuteNonQuery(); + cmd = new MySqlCommand("SELECT id, name from Test", c); + var reader = cmd.ExecuteReader(); + while (reader.Read()) + { + if (reader.GetUInt32(0) == 1) + Assert.That(reader.GetString(1), Is.EqualTo("㭋玤䂜蚌")); + if (reader.GetUInt32(0) == 2) + Assert.That(reader.GetString(1), Is.EqualTo("念奴娇·赤壁怀古 ·苏东坡")); + } + } + } + + /// + /// Test for new functionality on 5.7.9 supporting chinese character sets on gb18030 + /// WL #4024 + /// (Oracle bug #21098546). + /// Disabled due to intermittent failure. Documented under Oracle bug #27010958 + /// + [Test] + [Ignore("Fix this")] + public void CanCreateDbUsingChineseCharacterSetGB18030() + { + if (Version < new Version(5, 7, 4)) return; + + MySqlConnectionStringBuilder rootSb = new MySqlConnectionStringBuilder(Root.ConnectionString); + rootSb.CharacterSet = "gb18030"; + using (MySqlConnection rootConnection = new MySqlConnection(rootSb.ToString())) + { + string database = "㭋玤䂜蚌"; + + rootConnection.Open(); + MySqlCommand rootCommand = new MySqlCommand(); + rootCommand.Connection = rootConnection; + rootCommand.CommandText = string.Format("CREATE DATABASE `{0}` CHARSET=gb18030;", database); + rootCommand.ExecuteNonQuery(); + + try + { + rootSb.Database = database; + using (MySqlConnection conn = new MySqlConnection(rootSb.ConnectionString)) + { + conn.Open(); + Assert.That(conn.Database, Is.EqualTo(database)); + } + } + finally + { + if (rootConnection.State == ConnectionState.Open) + { + rootCommand.CommandText = string.Format("DROP DATABASE `{0}`;", database); + rootCommand.ExecuteNonQuery(); + } + } + } + } + + [Test] + public void UTF16LETest() + { + if (Version < new Version(5, 6)) return; + + using (MySqlDataReader reader = ExecuteReader("select _utf16le 'utf16le test';")) + { + while (reader.Read()) + { + Assert.That(reader[0].ToString(), Is.EqualTo("瑵ㅦ氶⁥整瑳")); + } + } + } + + /// + /// Bug #13806 Does not support Code Page 932 + /// + [Test] + public void CP932() + { + using (var connection = new MySqlConnection(Connection.ConnectionString + ";charset=cp932")) + { + connection.Open(); + MySqlCommand cmd = new MySqlCommand("SELECT '涯割晦叶角'", connection); + string s = (string)cmd.ExecuteScalar(); + Assert.That(s, Is.EqualTo("涯割晦叶角")); + } + } + + [Test] + public void VariousCollations() + { + ExecuteSQL(@"CREATE TABLE Test(`test` VARCHAR(255) NOT NULL) + CHARACTER SET utf8 COLLATE utf8_swedish_ci"); + ExecuteSQL("INSERT INTO Test VALUES ('myval')"); + MySqlCommand cmd = new MySqlCommand("SELECT test FROM Test", Connection); + cmd.ExecuteScalar(); + } + + [Test] + public void ExtendedCharsetOnConnection() + { + MySqlConnectionStringBuilder rootSb = new MySqlConnectionStringBuilder(Root.ConnectionString); + rootSb.CharacterSet = "utf8"; + using (MySqlConnection rootConnection = new MySqlConnection(rootSb.ToString())) + { + string database = "数据库"; + string user = "用户"; + string password = "tést€"; + string host = Host == "localhost" ? Host : "%"; + string fullUser = $"'{user}'@'{host}'"; + + rootConnection.Open(); + MySqlCommand rootCommand = new MySqlCommand(); + rootCommand.Connection = rootConnection; + rootCommand.CommandText = string.Format("CREATE DATABASE IF NOT EXISTS `{0}`;", database); + rootCommand.CommandText += string.Format("CREATE USER {0} identified by '{1}';", fullUser, password); + rootCommand.CommandText += string.Format("GRANT ALL ON `{0}`.* to {1};", database, fullUser); + rootCommand.ExecuteNonQuery(); + + string connString = Connection.ConnectionString; + MySqlConnectionStringBuilder sb = new MySqlConnectionStringBuilder(connString); + sb.Database = database; + sb.UserID = user; + sb.Password = password; + sb.CharacterSet = "utf8"; + try + { + using (MySqlConnection conn = new MySqlConnection(sb.ToString())) + { + conn.Open(); + Assert.That(conn.Database, Is.EqualTo(database)); + } + } + finally + { + if (rootConnection.State == ConnectionState.Open) + { + rootCommand.CommandText = string.Format("DROP DATABASE `{0}`;DROP USER {1}", database, fullUser); + rootCommand.ExecuteNonQuery(); + } + } + } + } + + [Test] + public void DefaultCharSet() + { + using (var connection = new MySqlConnection(Connection.ConnectionString)) + { + connection.Open(); + MySqlCommand cmd = new MySqlCommand("SHOW VARIABLES LIKE 'character_set_connection'", connection); + MySqlDataReader reader = cmd.ExecuteReader(); + reader.Read(); + + if (Connection.driver.Version.isAtLeast(8, 0, 1)) + Assert.That(reader.GetString("Value"), Is.EqualTo("utf8mb4")); + else + Assert.That(reader.GetString("Value"), Is.EqualTo("latin1")); + } + } + + [Test] + public void CharacterVariablesByDefault() + { + MySqlConnectionStringBuilder rootSb = new MySqlConnectionStringBuilder(Connection.ConnectionString); + rootSb.CharacterSet = string.Empty; + using (MySqlConnection rootConnection = new MySqlConnection(rootSb.ToString())) + { + rootConnection.Open(); + MySqlCommand cmd = rootConnection.CreateCommand(); + cmd.CommandText = "SELECT @@character_set_server"; + string characterSet = cmd.ExecuteScalar().ToString(); + Assert.That(string.IsNullOrWhiteSpace(characterSet), Is.False); + + cmd.CommandText = "SHOW VARIABLES LIKE 'character_set_c%'"; + using (MySqlDataReader dr = cmd.ExecuteReader()) + { + Assert.That(dr.HasRows); + while (dr.Read()) + { + switch (dr.GetString(0).ToLowerInvariant()) + { + case "character_set_client": + Assert.That(dr.GetString(1), Is.EqualTo(characterSet)); + break; + case "character_set_connection": + Assert.That(dr.GetString(1), Is.EqualTo(characterSet)); + break; + default: + throw new InvalidOperationException(string.Format("Variable '{0}' not expected.", dr.GetString(0))); + } + } + } + + cmd.CommandText = "SELECT @@character_set_results"; + Assert.That(cmd.ExecuteScalar(), Is.EqualTo(DBNull.Value)); + } + } + + /// + /// Bug #31173265 USING MYSQL.PROC TO SEARCH THE STORED PROCEDURE BUT THIS IS CASE SENSITIVE + /// + [Test] + public void DatabaseCaseSentitive() + { + Assume.That(Version >= new Version(8, 0, 0) && Platform.IsWindows(), "This test is only for Windows OS and MySql higher than 8.0."); + ExecuteSQL("DROP PROCEDURE IF EXISTS spTest"); + ExecuteSQL(@"CREATE PROCEDURE spTest () BEGIN SELECT ""test""; END"); + + using (var connection = new MySqlConnection(Connection.ConnectionString.Replace(Connection.Database, Connection.Database.ToUpper()))) + { + connection.Open(); + var strName = "spTest"; + using (MySqlCommand cmd = new MySqlCommand(strName, connection)) + { + cmd.CommandType = CommandType.StoredProcedure; + var result = cmd.ExecuteNonQuery(); + Assert.That(result, Is.EqualTo(0)); + } + } + } + + /// + /// Bug #32429236 - POUND SYMBOL (£) IN JSON COLUMN USING UTF8MB4_0900_AS_CI COLLATION BUG + /// this scenario bug was raised when the server starts with option "--collation-server=utf8mb4_0900_as_ci" + /// + [Test] + public void PoundSymbolInJsonColumn() + { + Assume.That(Version >= new Version(5, 7, 0), "JSON data type not available in MySQL Server v5.6"); + + ExecuteSQL("CREATE TABLE `PoundTable`(`TextColumn` VARCHAR(20) NULL, `JsonColumn` JSON);"); + ExecuteSQL("INSERT INTO `PoundTable`(`TextColumn`, `JsonColumn`) VALUES('£', JSON_OBJECT('Value', '£'));"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM `PoundTable`", Connection); + using (var reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + Assert.That(reader[0].ToString(), Is.EqualTo("£").IgnoreCase); + Assert.That(reader[1].ToString(), Is.EqualTo("{\"Value\": \"£\"}").IgnoreCase); + } + } + } + + #region WL14389 + /// + /// //Bug23257011 + /// + [Test, Description("CharacterVariablesByAssigned")] + public void CharacterVariablesByDefaultServerDefault() + { + + var connStr = $"server={Host};port={Port};user={Settings.UserID};password={Settings.Password};database={Settings.Database};SSL Mode={MySqlSslMode.Disabled};"; + var rootSb = new MySqlConnectionStringBuilder(connStr); + rootSb.CharacterSet = string.Empty; + using (var rootConnection = new MySqlConnection(rootSb.ToString())) + { + rootConnection.Open(); + var cmd = rootConnection.CreateCommand(); + cmd.CommandText = "SELECT @@character_set_server"; + var characterSet = cmd.ExecuteScalar().ToString(); + Assert.That(string.IsNullOrWhiteSpace(characterSet), Is.EqualTo(false)); + + cmd.CommandText = "SHOW VARIABLES LIKE 'character_set_c%'"; + using (var dr = cmd.ExecuteReader()) + { + Assert.That(dr.HasRows, Is.EqualTo(true)); + while (dr.Read()) + switch (dr.GetString(0).ToLowerInvariant()) + { + case "character_set_client": + Assert.That(dr.GetString(1), Is.EqualTo(characterSet)); + break; + case "character_set_connection": + Assert.That(dr.GetString(1), Is.EqualTo(characterSet)); + break; + } + } + + cmd.CommandText = "SELECT @@character_set_results"; + Assert.That(cmd.ExecuteScalar(), Is.EqualTo(DBNull.Value)); + } + } + + /// + /// Bug23257011 + /// + [Test, Description("CharacterVariablesByAssigned")] + public void CharacterVariablesByAssignedServerDefault() + { + + var connStr = $"server={Host};port={Port};user={Settings.UserID};password={Settings.Password};database={Settings.Database};SSL Mode={MySqlSslMode.Disabled};"; + var rootSb = new MySqlConnectionStringBuilder(connStr); + var expectedCharSet = "utf8"; + rootSb.CharacterSet = "utf8"; + using (var rootConnection = new MySqlConnection(rootSb.ToString())) + { + rootConnection.Open(); + var cmd = rootConnection.CreateCommand(); + cmd.CommandText = "SELECT @@character_set_server"; + var characterSet = cmd.ExecuteScalar().ToString(); + Assert.That(string.IsNullOrWhiteSpace(characterSet), Is.EqualTo(false)); + + cmd.CommandText = "SHOW VARIABLES LIKE 'character_set_c%'"; + using (var dr = cmd.ExecuteReader()) + { + Assert.That(dr.HasRows, Is.EqualTo(true)); + while (dr.Read()) + switch (dr.GetString(0).ToLowerInvariant()) + { + case "character_set_client": + Assert.That(dr.GetString(1), Does.StartWith(expectedCharSet)); + break; + case "character_set_connection": + Assert.That(dr.GetString(1), Does.StartWith(expectedCharSet)); + break; + default: + Assert.Fail($"Variable {dr.GetString(0)} not expected."); break; + } + } + + cmd.CommandText = "SELECT @@character_set_results"; + Assert.That(cmd.ExecuteScalar(), Is.EqualTo(DBNull.Value)); + } + } + + #endregion WL14389 + + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/CharSetUTF8Tests.cs b/MySQL.Data/tests/MySql.Data.Tests/CharSetUTF8Tests.cs new file mode 100644 index 000000000..2e34ef818 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/CharSetUTF8Tests.cs @@ -0,0 +1,422 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Data; +using System.Text; + +namespace MySql.Data.MySqlClient.Tests +{ + public class CharSetUTF8Tests : TestBase + { + protected override void Cleanup() + { + ExecuteSQL(String.Format("DROP TABLE IF EXISTS `{0}`.Test", Connection.Database)); + } + + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.CharacterSet = "utf8"; + } + + [Test] + public void UTF8BlogsTruncating() + { + + ExecuteSQL("DROP TABLE IF EXISTS test"); + ExecuteSQL("CREATE TABLE test (name LONGTEXT) CHARSET utf8"); + + string szParam = "test:éàçùêû"; + string szSQL = "INSERT INTO test Values (?monParametre)"; + + MySqlCommand cmd = new MySqlCommand(szSQL, Connection); + cmd.Parameters.Add(new MySqlParameter("?monParametre", MySqlDbType.VarChar)); + cmd.Parameters[0].Value = szParam; + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM test"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + string s = reader.GetString(0); + Assert.That(s, Is.EqualTo(szParam)); + } + } + + /// + /// Bug #14592 Wrong column length returned for VARCHAR UTF8 columns + /// + [Test] + public void GetSchemaOnUTF8() + { +#if !NETFRAMEWORK + Assume.That(Platform.IsWindows()); +#endif + ExecuteSQL("CREATE TABLE Test(name VARCHAR(40) NOT NULL, name2 VARCHAR(20)) " + + "CHARACTER SET utf8"); + ExecuteSQL("INSERT INTO Test VALUES('Test', 'Test')"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM test", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + DataTable dt = reader.GetSchemaTable(); + Assert.That(dt.Rows[0]["ColumnSize"], Is.EqualTo(40)); + Assert.That(dt.Rows[1]["ColumnSize"], Is.EqualTo(20)); + } + } + + /// + /// Bug #31117 Connector/NET exceptions do not support server charset + /// + [Test] + public void NonLatin1Exception() + { + ExecuteSQL("CREATE TABLE Test (id int)"); + + MySqlCommand cmd = new MySqlCommand("select `Numéro` from Test", Connection); + var exception = Assert.Throws(() => cmd.ExecuteScalar()); + Assert.That(exception.Message, Is.EqualTo("Unknown column 'Numéro' in 'field list'")); + } + + /// + /// Tests for bug http://bugs.mysql.com/bug.php?id=62094 + /// (char field mapped to System.String of MaxLength=3*len(char) in .NET/Connector). + /// + [Test] + public void GetCharLengthInUTF8() + { + ExecuteSQL( + @"CREATE TABLE `t62094` ( `id` int(11) NOT NULL, `name` char(1) DEFAULT NULL, + `longname` char(20) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); + MySqlCommand cmd = new MySqlCommand("select * from t62094", Connection); + MySqlDataAdapter ad = new MySqlDataAdapter(cmd); + DataSet ds = new DataSet(); + ad.Fill(ds); + ad.FillSchema(ds, SchemaType.Mapped); + Assert.That(ds.Tables[0].Columns["name"].MaxLength, Is.EqualTo(1)); + Assert.That(ds.Tables[0].Columns["longname"].MaxLength, Is.EqualTo(20)); + } + + [Test] + public void BlobAsUtf8() + { + ExecuteSQL(@"CREATE TABLE Test(include_blob BLOB, include_tinyblob TINYBLOB, + include_longblob LONGBLOB, exclude_tinyblob TINYBLOB, exclude_blob BLOB, + exclude_longblob LONGBLOB)"); + + byte[] utf8_bytes = new byte[4] { 0xf0, 0x90, 0x80, 0x80 }; + Encoding utf8 = Encoding.GetEncoding("UTF-8"); + string utf8_string = utf8.GetString(utf8_bytes, 0, utf8_bytes.Length); + + // insert our UTF-8 bytes into the table + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?p1, ?p2, ?p3, ?p4, ?p5, ?p5)", Connection); + cmd.Parameters.AddWithValue("?p1", utf8_bytes); + cmd.Parameters.AddWithValue("?p2", utf8_bytes); + cmd.Parameters.AddWithValue("?p3", utf8_bytes); + cmd.Parameters.AddWithValue("?p4", utf8_bytes); + cmd.Parameters.AddWithValue("?p5", utf8_bytes); + cmd.Parameters.AddWithValue("?p6", utf8_bytes); + cmd.ExecuteNonQuery(); + + // now check that the on/off is working + string connStr = Connection.ConnectionString + ";Treat Blobs As UTF8=yes;BlobAsUTF8IncludePattern=.*"; + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", c); + DataTable dt = new DataTable(); + da.Fill(dt); + foreach (DataColumn col in dt.Columns) + { + Assert.That(col.DataType, Is.EqualTo(typeof(string))); + string s = (string)dt.Rows[0][0]; + byte[] b = utf8.GetBytes(s); + Assert.That(dt.Rows[0][col.Ordinal].ToString(), Is.EqualTo(utf8_string)); + } + } + + // now check that exclusion works + connStr = Connection.ConnectionString + ";Treat Blobs As UTF8=yes;BlobAsUTF8ExcludePattern=exclude.*"; + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", c); + DataTable dt = new DataTable(); + da.Fill(dt); + foreach (DataColumn col in dt.Columns) + { + if (col.ColumnName.StartsWith("exclude", StringComparison.OrdinalIgnoreCase)) + Assert.That(col.DataType, Is.EqualTo(typeof(byte[]))); + else + { + Assert.That(col.DataType, Is.EqualTo(typeof(string))); + Assert.That(dt.Rows[0][col.Ordinal].ToString(), Is.EqualTo(utf8_string)); + } + } + } + + // now check that inclusion works + connStr = Connection.ConnectionString + ";Treat Blobs As UTF8=yes;BlobAsUTF8IncludePattern=include.*"; + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", c); + DataTable dt = new DataTable(); + da.Fill(dt); + foreach (DataColumn col in dt.Columns) + { + if (col.ColumnName.StartsWith("include", StringComparison.OrdinalIgnoreCase)) + { + Assert.That(col.DataType, Is.EqualTo(typeof(string))); + Assert.That(dt.Rows[0][col.Ordinal].ToString(), Is.EqualTo(utf8_string)); + } + else + Assert.That(col.DataType, Is.EqualTo(typeof(byte[]))); + } + } + } + + /// + /// Bug #31185 columns names are incorrect when using the 'AS' clause and name with accents + /// Bug #38721 GetOrdinal doesn't accept column names accepted by MySQL 5.0 + /// + [Test] + public void UTF8AsColumnNames() + { + string connStr = Root.ConnectionString + ";charset=utf8;pooling=false"; + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + + MySqlDataAdapter da = new MySqlDataAdapter("select now() as 'Numéro'", c); + DataTable dt = new DataTable(); + da.Fill(dt); + + Assert.That(dt.Columns[0].ColumnName, Is.EqualTo("Numéro")); + + MySqlCommand cmd = new MySqlCommand("SELECT NOW() AS 'Numéro'", c); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + int ord = reader.GetOrdinal("Numéro"); + Assert.That(ord, Is.EqualTo(0)); + } + } + } + + [Test] + public void Unicode() + { + ExecuteSQL("CREATE TABLE Test (u2 varchar(255) CHARACTER SET ucs2)"); + + ExecuteSQL("INSERT INTO Test VALUES ( CONVERT('困巫忘否役' using ucs2))"); + + using (MySqlDataReader reader = ExecuteReader("SELECT * FROM Test")) + { + reader.Read(); + string s1 = reader.GetString(0); + Assert.That(s1, Is.EqualTo("困巫忘否役")); + } + } + + [Test] + public void UTF8() + { + ExecuteSQL("CREATE TABLE Test (id int, name VARCHAR(200) CHAR SET utf8)"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1, 'ЁЄЉҖҚ')", Connection); //russian + cmd.ExecuteNonQuery(); + + cmd.CommandText = "INSERT INTO Test VALUES(2, '兣冘凥凷冋')"; // simplified Chinese + cmd.ExecuteNonQuery(); + + cmd.CommandText = "INSERT INTO Test VALUES(3, '困巫忘否役')"; // traditional Chinese + cmd.ExecuteNonQuery(); + + cmd.CommandText = "INSERT INTO Test VALUES(4, '涯割晦叶角')"; // Japanese + cmd.ExecuteNonQuery(); + + cmd.CommandText = "INSERT INTO Test VALUES(5, 'ברחפע')"; // Hebrew + cmd.ExecuteNonQuery(); + + cmd.CommandText = "INSERT INTO Test VALUES(6, 'ψόβΩΞ')"; // Greek + cmd.ExecuteNonQuery(); + + cmd.CommandText = "INSERT INTO Test VALUES(7, 'þðüçöÝÞÐÜÇÖ')"; // Turkish + cmd.ExecuteNonQuery(); + + cmd.CommandText = "INSERT INTO Test VALUES(8, 'ฅๆษ')"; // Thai + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM Test"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetString(1), Is.EqualTo("ЁЄЉҖҚ")); + reader.Read(); + Assert.That(reader.GetString(1), Is.EqualTo("兣冘凥凷冋")); + reader.Read(); + Assert.That(reader.GetString(1), Is.EqualTo("困巫忘否役")); + reader.Read(); + Assert.That(reader.GetString(1), Is.EqualTo("涯割晦叶角")); + reader.Read(); + Assert.That(reader.GetString(1), Is.EqualTo("ברחפע")); + reader.Read(); + Assert.That(reader.GetString(1), Is.EqualTo("ψόβΩΞ")); + reader.Read(); + Assert.That(reader.GetString(1), Is.EqualTo("þðüçöÝÞÐÜÇÖ")); + reader.Read(); + Assert.That(reader.GetString(1), Is.EqualTo("ฅๆษ")); + } + } + + [Test] + public void UTF8PreparedAndUsingParameters() + { + ExecuteSQL("CREATE TABLE Test (name VARCHAR(200) CHAR SET utf8)"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(?val)", Connection); + cmd.Parameters.Add("?val", MySqlDbType.VarChar); + cmd.Prepare(); + + cmd.Parameters[0].Value = "ЁЄЉҖҚ"; // Russian + cmd.ExecuteNonQuery(); + + cmd.Parameters[0].Value = "兣冘凥凷冋"; // simplified Chinese + cmd.ExecuteNonQuery(); + + cmd.Parameters[0].Value = "困巫忘否役"; // traditional Chinese + cmd.ExecuteNonQuery(); + + cmd.Parameters[0].Value = "涯割晦叶角"; // Japanese + cmd.ExecuteNonQuery(); + + cmd.Parameters[0].Value = "ברחפע"; // Hebrew + cmd.ExecuteNonQuery(); + + cmd.Parameters[0].Value = "ψόβΩΞ"; // Greek + cmd.ExecuteNonQuery(); + + cmd.Parameters[0].Value = "þðüçöÝÞÐÜÇÖ"; // Turkish + cmd.ExecuteNonQuery(); + + cmd.Parameters[0].Value = "ฅๆษ"; // Thai + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM Test"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetString(0), Is.EqualTo("ЁЄЉҖҚ")); + reader.Read(); + Assert.That(reader.GetString(0), Is.EqualTo("兣冘凥凷冋")); + reader.Read(); + Assert.That(reader.GetString(0), Is.EqualTo("困巫忘否役")); + reader.Read(); + Assert.That(reader.GetString(0), Is.EqualTo("涯割晦叶角")); + reader.Read(); + Assert.That(reader.GetString(0), Is.EqualTo("ברחפע")); + reader.Read(); + Assert.That(reader.GetString(0), Is.EqualTo("ψόβΩΞ")); + reader.Read(); + Assert.That(reader.GetString(0), Is.EqualTo("þðüçöÝÞÐÜÇÖ")); + reader.Read(); + Assert.That(reader.GetString(0), Is.EqualTo("ฅๆษ")); + } + } + + [Test] + public void Chinese() + { + ExecuteSQL("CREATE TABLE Test (id int, name VARCHAR(200) CHAR SET big5, name2 VARCHAR(200) CHAR SET gb2312)"); + + ExecuteSQL("INSERT INTO Test VALUES(1, '困巫忘否役', '涝搞谷侪魍' )"); + + using (MySqlDataReader reader = ExecuteReader("SELECT * FROM Test")) + { + reader.Read(); + Assert.That(reader.GetString(1), Is.EqualTo("困巫忘否役")); + Assert.That(reader.GetString(2), Is.EqualTo("涝搞谷侪魍")); + } + } + + [Test] + public void Russian() + { + ExecuteSQL("CREATE TABLE Test (id int, name VARCHAR(200) CHAR SET cp1251)"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1, 'щьеи')", Connection); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM Test"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetString(1), Is.EqualTo("щьеи")); + } + } + + /// + /// Bug #25651 SELECT does not work properly when WHERE contains UTF-8 characters + /// + [Test] + public void UTF8Parameters() + { + ExecuteSQL("CREATE TABLE Test (id int(11) NOT NULL, " + + "value varchar(100) NOT NULL, PRIMARY KEY (id)) " + + "ENGINE=MyISAM DEFAULT CHARSET=utf8"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (1, 'šđč枊ĐČĆŽ')", Connection); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT id FROM Test WHERE value = ?parameter"; + cmd.Parameters.Add("?parameter", MySqlDbType.VarString); + cmd.Parameters[0].Value = "šđč枊ĐČĆŽ"; + object o = cmd.ExecuteScalar(); + Assert.That(o, Is.EqualTo(1)); + } + + [Test] + public void Turkish() + { + ExecuteSQL("CREATE TABLE Test (id int, name VARCHAR(200) CHAR SET latin5 )"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1, 'ĞËÇÄŞ')", Connection); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM Test"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetString(1), Is.EqualTo("ĞËÇÄŞ")); + } + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/ClientSideFailoverTests.cs b/MySQL.Data/tests/MySql.Data.Tests/ClientSideFailoverTests.cs new file mode 100644 index 000000000..b5b95b247 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/ClientSideFailoverTests.cs @@ -0,0 +1,201 @@ +// Copyright © 2019, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Failover; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Data; + +namespace MySql.Data.MySqlClient.Tests +{ + public class ClientSideFailoverTests : TestBase + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder setttings) + { + setttings.ConnectionTimeout = 7; + } + + [TestCase("localhost")] // Single host + [TestCase("10.10.10.10, localhost, 20.20.20.20, 30.30.30.30")] // Multiple hosts + [TestCase("10.10.10.10:3306, localhost, 20.20.20.20:3305, 30.30.30.30:3305")] // Multiple hosts with port number + [TestCase("10.10.10.10, ::1, 20.20.20.20, 30.30.30.30")] // Multiple hosts, one with IPv6 + [TestCase("10.10.10.10, 10.11.12.13, 20.20.20.20, 30.30.30.30", false)] // Multiple hosts, should fail + public void RandomMethod(string server, bool shouldPass = true) + { + Settings.Pooling = false; + Settings.Server = server.Replace("localhost", Host); + + string ipv6; + if (Settings.Server.Contains("::1")) + { + ipv6 = GetMySqlServerIp(true); + Assume.That(!string.IsNullOrEmpty(ipv6), "No IPv6 available."); + Settings.Server = server.Replace("::1", ipv6); + } + + if (!shouldPass) + { + Exception ex = Assert.Throws(() => TryConnection(Settings.ConnectionString)); + Assert.That(ex.Message, Is.EqualTo(Resources.UnableToConnectToHost)); + } + else + Assert.That(TryConnection(Settings.ConnectionString), Is.EqualTo(ConnectionState.Open)); + } + + private static ConnectionState TryConnection(string connString) + { + ConnectionState state; + using (MySqlConnection conn = new MySqlConnection(connString)) + { + conn.Open(); + state = conn.State; + } + return state; + } + + [Test] + public void PriorityMethod() + { +#if !NETFRAMEWORK + Assume.That(System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Windows)); +#endif + // Multiple hosts and validate proper order assigned to hosts. + Settings.Pooling = false; + Settings.Server = $"(address=server.example,priority=100),(address={Host},priority=25),(address=192.0.10.56,priority=75)"; + using (MySqlConnection conn = new MySqlConnection(Settings.ConnectionString)) + { + conn.Open(); + Assert.That(conn.State, Is.EqualTo(ConnectionState.Open)); + Assert.That(conn.Settings.Server, Is.EqualTo(Host)); + Assert.That(FailoverManager.FailoverGroup.Hosts[0].Host, Is.EqualTo("server.example")); + Assert.That(FailoverManager.FailoverGroup.Hosts[1].Host, Is.EqualTo("192.0.10.56")); + Assert.That(FailoverManager.FailoverGroup.Hosts[2].Host, Is.EqualTo(Host)); + } + + // Multiple hosts with IPv6 + if (Version > new Version(5, 6, 0)) + { + Settings.Server = "(address=server.example,priority=50),(address=::1,priority=100)"; + + using (MySqlConnection conn = new MySqlConnection(Settings.ConnectionString)) + { + conn.Open(); + Assert.That(conn.State, Is.EqualTo(ConnectionState.Open)); + } + } + + // Automatically set priority if no priority is given. + string hostList = string.Empty; + int priority = 100; + for (int i = 1; i <= 105; i++) + { + hostList += "(address=server" + i + ".example,priority=" + (priority != 0 ? priority-- : 0) + "),"; + if (i == 105) hostList += $"(address={Host},priority=0)"; + } + + Settings.Server = hostList; + + using (MySqlConnection conn = new MySqlConnection(Settings.ConnectionString)) + { + conn.Open(); + Assert.That(conn.State, Is.EqualTo(ConnectionState.Open)); + priority = 100; + foreach (var host in FailoverManager.FailoverGroup.Hosts) + { + Assert.That(host.Priority, Is.EqualTo(priority != 0 ? priority-- : 0)); + } + } + } + + [TestCase("(address=server.example,priority=-20),(address=127.0.0.1,priority=100)", "The priority must be between 0 and 100", "argument")] // Priority outside the 0-100 allowed range + [TestCase("(address=server.example,priority=-50),(address=127.0.0.1,priority=101)", "The priority must be between 0 and 100", "argument")] // Priority outside the 0-100 allowed range + [TestCase("(address=server.example),(address=127.0.0.1,priority=100)", "You must either assign no priority to any of the hosts or give a priority for every host", "argument")] // Set priority for a subset of the hosts. + [TestCase("(address=server.example,priority=50),(address=127.0.0.1,priority=100),(address=server.example)", "You must either assign no priority to any of the hosts or give a priority for every host", "argument")] // Set priority for a subset of the hosts. + [TestCase("(address=server.example,priority=100),(address=10.10.10.10,priority=25),(address=192.0.10.56,priority=75)", "Unable to connect to any of the specified MySQL hosts", "mysql")] // Multiple hosts. All attempts fail. + public void PriorityMethodConnectionFail(string server, string exceptionMessage, string exceptionType) + { + Settings.Server = server.Replace("127.0.0.1", Host); + using (MySqlConnection conn = new MySqlConnection(Settings.ConnectionString)) + { + Exception ex; + if (exceptionType == "argument") + ex = Assert.Throws(() => conn.Open()); + else + ex = Assert.Throws(() => conn.Open()); + + Assert.That(ex.Message, Is.EqualTo(exceptionMessage)); + } + } + + [TestCase("10.10.10.10,20.20.20.20,localhost")] // Random + [TestCase("(address=server.example,priority=100),(address=localhost,priority=25),(address=192.0.10.56,priority=75)")] // Priority + public void Pooling(string server) + { + Settings.Pooling = true; + Settings.MinimumPoolSize = 10; + Settings.Server = server.Replace("localhost", Host); + + MySqlConnection[] connArray = new MySqlConnection[10]; + for (int i = 0; i < connArray.Length; i++) + { + connArray[i] = new MySqlConnection(Settings.ConnectionString); + connArray[i].Open(); + Assert.That(connArray[i].State, Is.EqualTo(ConnectionState.Open)); + } + + // now make sure all the server ids are different + for (int i = 0; i < connArray.Length; i++) + { + for (int j = 0; j < connArray.Length; j++) + { + if (i != j) + Assert.That(connArray[i].ServerThread != connArray[j].ServerThread); + } + } + + // close connections + for (int i = 0; i < connArray.Length; i++) + connArray[i].Close(); + } + + /// + /// Bug #30581109 - XPLUGIN/CLASSIC CONNECTION SUCCEEDS WHEN MULTIPLE HOSTS ARE USED IN WHICH FIRST HOST FAILS WITH MYSQL ERROR LIKE HOST EXHAUSTED ALL THE CONNECTIONS OR WRONG CREDENTIALS AND THE OTHER HOST IS VALID-WL#13304 + /// Due to the restrictions of the automated test, the approach to this test is to have one invalid host that will be attempted to connect to first given its priority throwing a timeout error, then C/NET will then try with the second host raising a MySQL exception. + /// + [Test] + public void FailWhenMySqlExceptionRaised() + { + ExecuteSQL("CREATE USER 'test1'@'%' IDENTIFIED BY 'testpass'", true); + var address_priority = $"(address={Host}, priority=90),(address=10.20.30.40, priority=100)"; + + using var conn = new MySqlConnection($"server={address_priority};port={Port};user=test1;pwd=wrongPass;"); + Assert.Throws(() => conn.Open()); + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/CmdTests.cs b/MySQL.Data/tests/MySql.Data.Tests/CmdTests.cs new file mode 100644 index 000000000..e932704e3 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/CmdTests.cs @@ -0,0 +1,993 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Data; +using System.Diagnostics; +using System.Text; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient.Tests +{ + public class CmdTests : TestBase + { + protected override void Cleanup() + { + ExecuteSQL($"DROP TABLE IF EXISTS `{Connection.Database}`.TestForeignKey"); + ExecuteSQL($"DROP TABLE IF EXISTS `{Connection.Database}`.Test"); + } + + /// + /// Tests for MySql bug #64633 - System.InvalidCastException when executing a stored function. + /// + [Test] + public void InvalidCast() + { + string host = Host == "localhost" ? Host : "%"; + ExecuteSQL($@"CREATE FUNCTION `{Connection.Database}`.`MyTwice`( val int ) RETURNS INT DETERMINISTIC + READS SQL DATA BEGIN return val * 2; END;", true); + ExecuteSQL($@"CREATE PROCEDURE `{Connection.Database}`.`spMyTwice`( out result int, val int ) + DETERMINISTIC READS SQL DATA BEGIN set result = val * 2; END;", true); + string user = CreateUser("1", "123"); + ExecuteSQL($"GRANT EXECUTE ON FUNCTION `{Connection.Database}`.`MyTwice` TO '{user}'@'{host}';", true); + ExecuteSQL($"GRANT EXECUTE ON PROCEDURE `{Connection.Database}`.`spMyTwice` TO '{user}'@'{host}'", true); + + if (Connection.driver.Version.isAtLeast(8, 0, 1)) + ExecuteSQL($"GRANT SELECT ON TABLE mysql.db TO '{user}'@'{host}'", true); + else + ExecuteSQL($"GRANT SELECT ON TABLE mysql.proc TO '{user}'@'{host}'", true); + + ExecuteSQL("FLUSH PRIVILEGES", true); + + MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(Connection.ConnectionString); + connStr.UserID = user; + connStr.Password = "123"; + MySqlConnection con = new MySqlConnection(connStr.GetConnectionString(true)); + + // Invoke the function + var cmd = con.CreateCommand(); + using (con) + { + con.Open(); + cmd.CommandText = "MyTwice"; + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.Add(new MySqlParameter("val", System.DBNull.Value)); + cmd.Parameters.Add("@p", MySqlDbType.Int32); + cmd.Parameters[1].Direction = ParameterDirection.ReturnValue; + cmd.Parameters[0].Value = 20; + cmd.ExecuteNonQuery(); + Assert.That(cmd.Parameters[1].Value, Is.EqualTo(40)); + + cmd.CommandText = "spMyTwice"; + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.Clear(); + cmd.Parameters.Add(new MySqlParameter("result", System.DBNull.Value)); + cmd.Parameters.Add("val", MySqlDbType.Int32); + cmd.Parameters[0].Direction = ParameterDirection.Output; + cmd.Parameters[1].Value = 20; + cmd.ExecuteNonQuery(); + Assert.That(cmd.Parameters[0].Value, Is.EqualTo(40)); + } + } + + [Test] + public void InsertTest() + { + ExecuteSQL("CREATE TABLE Test (id int NOT NULL, name VARCHAR(100))"); + // do the insert + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id,name) VALUES(10,'Test')", Connection); + int cnt = cmd.ExecuteNonQuery(); + Assert.That(cnt == 1, "Insert Count"); + + // make sure we get the right value back out + cmd.CommandText = "SELECT name FROM Test WHERE id=10"; + string name = (string)cmd.ExecuteScalar(); + Assert.That(name == "Test", "Insert result"); + + // now do the insert with parameters + cmd.CommandText = "INSERT INTO Test (id,name) VALUES(?id, ?name)"; + cmd.Parameters.Add(new MySqlParameter("?id", 11)); + cmd.Parameters.Add(new MySqlParameter("?name", "Test2")); + cnt = cmd.ExecuteNonQuery(); + Assert.That(cnt == 1, "Insert with Parameters Count"); + + // make sure we get the right value back out + cmd.Parameters.Clear(); + cmd.CommandText = "SELECT name FROM Test WHERE id=11"; + name = (string)cmd.ExecuteScalar(); + Assert.That(name == "Test2", "Insert with parameters result"); + } + + [Test] + public void UpdateTest() + { + ExecuteSQL("CREATE TABLE test (id int NOT NULL, name VARCHAR(100))"); + ExecuteSQL("INSERT INTO test (id,name) VALUES(10, 'Test')"); + ExecuteSQL("INSERT INTO test (id,name) VALUES(11, 'Test2')"); + + // do the update + MySqlCommand cmd = new MySqlCommand("UPDATE test SET name='Test3' WHERE id=10 OR id=11", Connection); + int cnt = cmd.ExecuteNonQuery(); + Assert.That(cnt, Is.EqualTo(2)); + + // make sure we get the right value back out + cmd.CommandText = "SELECT name FROM test WHERE id=10"; + string name = (string)cmd.ExecuteScalar(); + Assert.That(name, Is.EqualTo("Test3")); + + cmd.CommandText = "SELECT name FROM test WHERE id=11"; + name = (string)cmd.ExecuteScalar(); + Assert.That(name, Is.EqualTo("Test3")); + + // now do the update with parameters + cmd.CommandText = "UPDATE test SET name=?name WHERE id=?id"; + cmd.Parameters.Add(new MySqlParameter("?id", 11)); + cmd.Parameters.Add(new MySqlParameter("?name", "Test5")); + cnt = cmd.ExecuteNonQuery(); + Assert.That(cnt == 1, "Update with Parameters Count"); + + // make sure we get the right value back out + cmd.Parameters.Clear(); + cmd.CommandText = "SELECT name FROM test WHERE id=11"; + name = (string)cmd.ExecuteScalar(); + Assert.That(name, Is.EqualTo("Test5")); + + } + + [Test] + public void DeleteTest() + { + ExecuteSQL("CREATE TABLE Test (id int NOT NULL, name VARCHAR(100))"); + ExecuteSQL("INSERT INTO Test (id, name) VALUES(1, 'Test')"); + ExecuteSQL("INSERT INTO Test (id, name) VALUES(2, 'Test2')"); + + // make sure we get the right value back out + MySqlCommand cmd = new MySqlCommand("DELETE FROM Test WHERE id=1 or id=2", Connection); + int delcnt = cmd.ExecuteNonQuery(); + Assert.That(delcnt, Is.EqualTo(2)); + + // find out how many rows we have now + cmd.CommandText = "SELECT COUNT(*) FROM Test"; + object after_cnt = cmd.ExecuteScalar(); + Assert.That(Convert.ToInt32(after_cnt), Is.EqualTo(0)); + } + + #if !NETFRAMEWORK + [Test] + public void ActivityTest() + { + using var cmd = Connection.CreateCommand(); + cmd.CommandText = "SELECT 1;"; + using var _ = TestListener((activity) => Assert.That(BaseUserName+"0", Is.EqualTo(activity.GetTagItem("db.user")))); + cmd.ExecuteNonQuery(); + } + #endif + + [Test] + public void CtorTest() + { + ExecuteSQL("CREATE TABLE Test (id int NOT NULL, name VARCHAR(100))"); + MySqlTransaction txn = Connection.BeginTransaction(); + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", Connection); + + MySqlCommand clone = new MySqlCommand(cmd.CommandText, (MySqlConnection)cmd.Connection, + (MySqlTransaction)cmd.Transaction); + clone.Parameters.AddWithValue("?test", 1); + txn.Rollback(); + } + + [Test] + [Ignore("Fix it!")] + public void TableWithOVer100Columns() + { + string sql = "create table IF NOT EXISTS zvan (id int(8) primary key " + + "unique auto_increment, name varchar(250)) ENGINE=INNODB; "; + /* "create table IF NOT EXISTS ljudyna (id int(8) primary key " + + "unique auto_increment, name varchar(250), data_narod date, " + + "id_in_zvan int(8), kandidat varchar(250), tel_rob_vn varchar(250), " + + "tel_rob_mis varchar(250), n_kabin varchar(250), n_nak_zvan varchar(250), " + + "d_nak_zvan date, sex tinyint(1), n_nak_pos varchar(250), " + + "d_nak_pos date, posad_data varchar(250), visl1 varchar(250), visl2 " + + "varchar(250), visl3 varchar(250), cpidr_f int(8), cposad_f int(8), sumis " + + "tinyint(1), zs_s date, zs_po date, ovs_z date, ovs_po date, naiavn_zviln " + + "tinyint(1), ovs_z1 date, ovs_po1 date, ovs_z2 date, ovs_po2 date, ovs_z3 date, " + + "ovs_po3 date, ovs_prakt varchar(250), data_atest date, data_sp date, v_akad_z " + + "date, z_akad_zvln tinyint(1), v_akad_period varchar(250), nauk_stup " + + "varchar(250), vch_zvan varchar(250), n_sprav varchar(250), n_posv varchar(250), " + + "nacional varchar(250), osvita varchar(250), osvita_zakin_sho varchar(250), " + + "osvita_zakin_koli date, osvita_special varchar(250), osvita_kvalifikac " + + "varchar(250), de_navchaet varchar(250), data_vstupu date, termin_navch " + + "varchar(250), adresa varchar(250), tel_dom varchar(250), marka_avto " + + "varchar(250), n_avto varchar(250), color_avto varchar(250), vikor_avto " + + "varchar(250), posv_avto varchar(250), marka_zbr varchar(250), nomer_calibr_zbr " + + "varchar(250), vid_zbr varchar(250), nomer_data_razreshen varchar(250), pasport " + + "varchar(250), oklad1 varchar(250), prem07_2003 varchar(250), nadb07_2003 " + + "varchar(250), osob_nom varchar(250), nadbavka_stag_max varchar(250), " + + "nadbavka_stag_08_2003 varchar(250), nadbavka_stag_10_2003 varchar(250), " + + "nadbavka_stag_11_2003 varchar(250), nadbavka_stag_02_2004 varchar(250), " + + "vidp_vikoristav varchar(250), vidp_plan varchar(250), vidp_vidgil varchar(250), " + + "vidp_nevidgil_dniv varchar(250), nadb111 varchar(250), prem_3_1 varchar(250), " + + "nadb_4_1 varchar(250), prem_3_2 varchar(250), nadb_3_2 varchar(250), nedolos " + + "varchar(250), sposl int(8), cposl int(8), czaoh int(8), 07_2003_oklad " + + "varchar(250), 05_2003_oklad varchar(250), deti_jeni varchar(250), nadb_volny " + + "varchar(250), prem_volny varchar(250), dispanser tinyint(1), posl_spisok " + + "tinyint(1), anketa_avtobiogr tinyint(1), photokartka tinyint(1), sp1 tinyint(1), " + + "inshe varchar(250), oklad2 varchar(250), slugbova tinyint(1), atestuvan " + + "varchar(250), 09_2004_oklad_vstan varchar(250), golosuvannia varchar(250), " + + "stag_kalendar varchar(250), data_stag_kalendar varchar(250), medali " + + "varchar(250), medali_mae varchar(250), visluga_cal_ovs_and_zs varchar(250), " + + "FOREIGN KEY (id_in_zvan) REFERENCES zvan(id) ON DELETE CASCADE ON UPDATE " + + "CASCADE) TYPE=INNODB DEFAULT CHARACTER SET cp1251 COLLATE cp1251_ukrainian_ci"; + */ + + MySqlCommand cmd = new MySqlCommand(sql, Connection); + cmd.ExecuteNonQuery(); + } + + /// + /// Bug #12245 using Prepare() on an insert command causes null parameters to convert to "0" + /// + [Test] + [Ignore("Fix This")] + public virtual void InsertingPreparedNulls() + { + //executeSQL("CREATE TABLE Test (id int NOT NULL, name VARCHAR(100))"); + //MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1, ?str)", Connection); + //cmd.Parameters.Add("?str", MySqlDbType.VarChar); + //cmd.Prepare(); + + //cmd.Parameters[0].Value = null; + //cmd.ExecuteNonQuery(); + + //cmd.CommandText = "SELECT * FROM Test"; + //using (MySqlDataReader reader = cmd.ExecuteReader()) + //{ + // Assert.True(reader.Read()); + // Assert.AreEqual(DBNull.Value, reader[1]); + //} + } + + /// + /// MySQL Bugs: #32127591: MySqlCommand.Cancel throws NullReferenceException for a Closed Connection + /// + [TestCase(1)] + [TestCase(2)] + [TestCase(3)] + public void MySqlCommandCancelWithClosedConnection(int test) + { + using (MySqlConnection conn = new MySqlConnection(Settings.ConnectionString)) + { + switch (test) + { + case 1: + using (MySqlCommand cmd1 = conn.CreateCommand()) + { + conn.Open(); + conn.Close(); + Assert.DoesNotThrow(cmd1.Cancel); + } + break; + + case 2: + using (MySqlCommand cmd2 = conn.CreateCommand()) + { + Assert.DoesNotThrow(cmd2.Cancel); + } + break; + + case 3: + using (MySqlCommand cmd3 = new MySqlCommand()) + { + Assert.DoesNotThrow(cmd3.Cancel); + } + break; + } + } + } + + /// + /// MySQL Bugs: #12163: Insert using prepared statement causes double insert + /// + [Test] + public void PreparedInsertUsingReader() + { + ExecuteSQL("CREATE TABLE Test (id int NOT NULL, name VARCHAR(100))"); + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1, 'Test')", Connection); + Assert.That(cmd.IsPrepared, Is.False); + cmd.Prepare(); + Assert.That(cmd.IsPrepared); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + } + + cmd.CommandText = "SELECT * FROM Test"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.Read(), Is.False); + Assert.That(reader.NextResult(), Is.False); + } + } + + /// + /// Bug #7248 There is already an open DataReader associated with this Connection which must + /// + //[Test] + //public void GenWarnings() + //{ + // executeSQL("CREATE TABLE Test (id INT, dt DATETIME)"); + // executeSQL("INSERT INTO Test VALUES (1, NOW())"); + // executeSQL("INSERT INTO Test VALUES (2, NOW())"); + // executeSQL("INSERT INTO Test VALUES (3, NOW())"); + + // MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test WHERE dt = '" + + // DateTime.Now + "'", connection); + // DataSet ds = new DataSet(); + // da.Fill(ds); + //} + + /// + /// Bug #11991 ExecuteScalar + /// + [Test] + public void CloseReaderAfterFailedConvert() + { + ExecuteSQL("CREATE TABLE Test (dt DATETIME)"); + ExecuteSQL("INSERT INTO Test VALUES ('00-00-0000 00:00:00')"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", Connection); + try + { + cmd.ExecuteScalar(); + } + catch (Exception) + { + } + + Connection.BeginTransaction(); + } + + /// + /// Bug #25443 ExecuteScalar() hangs when more than one bad result + /// + [Test] + public void ExecuteWithOneBadQuery() + { + MySqlCommand command = new MySqlCommand("SELECT 1; SELECT * FROM foo", Connection); + try + { + command.ExecuteScalar(); + } + catch (MySqlException) + { + } + + // now try using ExecuteNonQuery + try + { + command.ExecuteNonQuery(); + } + catch (MySqlException) + { + } + } + + /// + /// Bug #27958 Cannot use Data Source Configuration Wizard on large databases + /// + [Test] + public void DefaultCommandTimeout() + { + MySqlConnection c = new MySqlConnection($"server={Host}"); + MySqlCommand cmd = new MySqlCommand("", c); + Assert.That(cmd.CommandTimeout, Is.EqualTo(30)); + + c = new MySqlConnection($"server={Host};default command timeout=47"); + cmd = new MySqlCommand("", c); + Assert.That(cmd.CommandTimeout, Is.EqualTo(47)); + + cmd = new MySqlCommand(""); + Assert.That(cmd.CommandTimeout, Is.EqualTo(30)); + + cmd.CommandTimeout = 66; + cmd.Connection = c; + Assert.That(cmd.CommandTimeout, Is.EqualTo(66)); + cmd.CommandTimeout = 0; + Assert.That(cmd.CommandTimeout, Is.EqualTo(0)); + + c = new MySqlConnection($"server={Host};default command timeout=0"); + cmd = new MySqlCommand("", c); + Assert.That(cmd.CommandTimeout, Is.EqualTo(0)); + + // Defaults to Int32.MaxValue/1000 when provided value is larger. + c = new MySqlConnection(Connection.ConnectionString); + cmd = new MySqlCommand("", c); + c.Open(); + cmd.CommandTimeout = Int32.MaxValue; + Assert.That(cmd.CommandTimeout, Is.EqualTo(Int32.MaxValue / 1000)); + c.Close(); + } + + /// + /// Bug #38276 Short circuit evaluation error in MySqlCommand.CheckState() + /// + [Test] + public void SetNullConnection() + { + MySqlCommand command = new MySqlCommand(); + command.CommandText = "SELECT 1"; + command.Connection = null; + try + { + object o = command.ExecuteScalar(); + } + catch (InvalidOperationException) + { + } + } + + /// + /// Bug #44194 ExecuteNonQuery for update commands does not match actual rows updated + /// + [Test] + public void UseAffectedRows() + { + ExecuteSQL("CREATE TABLE Test (id INT, name VARCHAR(20))"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'A')"); + ExecuteSQL("INSERT INTO Test VALUES (2, 'B')"); + ExecuteSQL("INSERT INTO Test VALUES (3, 'C')"); + + MySqlCommand cmd = new MySqlCommand("UPDATE Test SET name='C' WHERE id=3", Connection); + Assert.That(cmd.ExecuteNonQuery(), Is.EqualTo(1)); + + MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(Connection.ConnectionString); + connStr.UseAffectedRows = true; + using (MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true))) + { + c.Open(); + cmd.Connection = c; + Assert.That(cmd.ExecuteNonQuery(), Is.EqualTo(0)); + } + } + + /// + /// Bug #45502 error if "Allow Batch=False" + /// + [Test] + public void DontAllowBatching() + { + MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(Connection.ConnectionString); + connStr.AllowBatch = false; + connStr.CharacterSet = "utf8"; + using (MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true))) + { + c.Open(); + MySqlCommand cmd = new MySqlCommand("SELECT 1", c); + cmd.ExecuteScalar(); + } + } + + [Test] + public void TableCommandType() + { + ExecuteSQL("CREATE TABLE Test (id INT, name VARCHAR(20))"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'A')"); + ExecuteSQL("CREATE TABLE Test1 (id INT, name VARCHAR(20))"); + ExecuteSQL("INSERT INTO Test1 VALUES (2, 'B')"); + + MySqlCommand cmd = new MySqlCommand("Test,Test1", Connection); + cmd.CommandType = CommandType.TableDirect; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetInt32(0), Is.EqualTo(1)); + Assert.That(reader.GetString(1), Is.EqualTo("A")); + Assert.That(reader.GetInt32(2), Is.EqualTo(2)); + Assert.That(reader.GetString(3), Is.EqualTo("B")); + } + } + + /// + /// Bug #57501 MySql Connector/NET 6.3.5.0 fails to read from DataReader + /// + [Test] + public void HelperTest() + { + string connStr = Connection.ConnectionString; + using (MySqlDataReader reader = MySqlHelper.ExecuteReader(connStr, "SHOW TABLES")) + { + while (reader.Read()) + { + } + } + } + + /// + /// Bug #58652 ExecuteReader throws NullReferenceException when using CommandBehavior.Close + /// + [Test] + public void SyntaxErrorWithCloseConnection() + { + MySqlConnection c = new MySqlConnection(Connection.ConnectionString); + using (c) + { + c.Open(); + MySqlCommand cmd = new MySqlCommand("SELE 1", c); + var ex = Assert.Throws(() => cmd.ExecuteReader(CommandBehavior.CloseConnection)); + Assert.That(ex.Message, Is.EqualTo("You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELE 1' at line 1")); + Assert.That(c.State == ConnectionState.Closed); + } + } + + /// + /// Bug #59537 Different behavior from console and + /// + [Test] + public void EmptyOrJustSemiCommand() + { + MySqlCommand cmd = new MySqlCommand("", Connection); + cmd.CommandText = ";"; + MySqlException ex = Assert.Throws(() => cmd.ExecuteNonQuery()); + // Error: 1065 Message: Query was empty + Assert.That(ex.Number, Is.EqualTo(1065)); + } + + /// + /// MySql Bug #64092, Oracle bug #13624659 + /// If MySqlCommand.CommandText equal to null, then MySqlCommand.ExecuteReader() + /// throw NullReferenceException instead of InvalidOperationException. + /// + [Test] + public void CommandTextIsNull() + { + MySqlCommand cmd = new MySqlCommand(null, Connection); + Exception ex = Assert.Throws(() => cmd.ExecuteReader()); + Assert.That(ex.Message != String.Empty); + } + + /// + /// Tests fix for http://bugs.mysql.com/bug.php?id=65452 / http://clustra.no.oracle.com/orabugs/14171960 + /// (MySqlCommand.LastInsertedId can only have 32 bit values but has type long). + /// + [Test] + public void LongLastInsertId() + { + string sql = @"CREATE TABLE longids (id BIGINT NOT NULL AUTO_INCREMENT, PRIMARY KEY (id)); + alter table longids AUTO_INCREMENT = 2147483640;"; + MySqlCommand cmd = new MySqlCommand(sql, Connection); + cmd.ExecuteNonQuery(); + long seed = 2147483640; + for (int i = 1; i < 10; ++i) + { + cmd.CommandText = "INSERT INTO longids VALUES ();"; + cmd.ExecuteNonQuery(); + Assert.That(cmd.LastInsertedId, Is.EqualTo(seed++)); + } + } + + #region Async + + [Test] + public async Task ExecuteNonQueryAsync() + { + ExecuteSQL("CREATE TABLE CMDNonQueryAsyncTest (id int)"); + ExecuteSQL("CREATE PROCEDURE CMDNonQueryAsyncSpTest() BEGIN SET @x=0; REPEAT INSERT INTO CMDNonQueryAsyncTest VALUES(@x); SET @x=@x+1; UNTIL @x = 100 END REPEAT; END"); + + MySqlCommand proc = new MySqlCommand("CMDNonQueryAsyncSpTest", Connection); + proc.CommandType = CommandType.StoredProcedure; + int result = await proc.ExecuteNonQueryAsync(); + + Assert.That(result, Is.Not.EqualTo(-1)); + + MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM CMDNonQueryAsyncTest;", Connection); + cmd.CommandType = CommandType.Text; + object cnt = cmd.ExecuteScalar(); + Assert.That(Convert.ToInt32(cnt), Is.EqualTo(100)); + } + + [Test] + public async Task ExecuteReaderAsync() + { + ExecuteSQL("CREATE TABLE CMDReaderAsyncTest (id int)"); + ExecuteSQL("CREATE PROCEDURE CMDReaderAsyncSpTest() BEGIN INSERT INTO CMDReaderAsyncTest VALUES(1); SELECT SLEEP(2); SELECT 'done'; END"); + + MySqlCommand proc = new MySqlCommand("CMDReaderAsyncSpTest", Connection); + proc.CommandType = CommandType.StoredProcedure; + + using (MySqlDataReader reader = await proc.ExecuteReaderAsync() as MySqlDataReader) + { + Assert.That(reader, Is.Not.Null); + Assert.That(reader.Read(), "can read"); + Assert.That(reader.NextResult()); + Assert.That(reader.Read()); + Assert.That(reader.GetString(0), Is.EqualTo("done")); + reader.Close(); + + proc.CommandType = CommandType.Text; + proc.CommandText = "SELECT COUNT(*) FROM CMDReaderAsyncTest"; + object cnt = proc.ExecuteScalar(); + Assert.That(Convert.ToInt32(cnt), Is.EqualTo(1)); + } + } + + [Test] + public async Task ExecuteScalarAsync() + { + ExecuteSQL("CREATE PROCEDURE CMDScalarAsyncSpTest( IN valin VARCHAR(50), OUT valout VARCHAR(50) ) BEGIN SET valout=valin; SELECT 'Test'; END"); + + MySqlCommand cmd = new MySqlCommand("CMDScalarAsyncSpTest", Connection); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.AddWithValue("?valin", "valuein"); + cmd.Parameters.Add(new MySqlParameter("?valout", MySqlDbType.VarChar)); + cmd.Parameters[1].Direction = ParameterDirection.Output; + + object result = await cmd.ExecuteScalarAsync(); + Assert.That(result, Is.EqualTo("Test")); + Assert.That(cmd.Parameters[1].Value, Is.EqualTo("valuein")); + } + +#if NET452 + [Test] + public void ThrowingExceptions() + { + MySqlCommand cmd = new MySqlCommand("SELECT xxx", Connection); + IAsyncResult r = cmd.BeginExecuteReader(); + Exception ex = Assert.Throws(() => cmd.EndExecuteReader(r)); + Assert.AreEqual("Unknown column 'xxx' in 'field list'", ex.Message); + } +#endif + #endregion + + /// + /// Bug #59616 Only INSERTs are batched + /// + [Test] + public void BatchUpdatesAndDeletes() + { + ExecuteSQL("CREATE TABLE Test (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20))"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'boo'), (2, 'boo'), (3, 'boo')"); + + MySqlTrace.Listeners.Clear(); + MySqlTrace.Switch.Level = SourceLevels.All; + GenericListener listener = new GenericListener(); + MySqlTrace.Listeners.Add(listener); + + var connectionStringCustom = Connection.ConnectionString; + + MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(connectionStringCustom); + connStr.AllowBatch = true; + connStr.Logging = true; + using (MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true))) + { + c.Open(); + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", c); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + da.UpdateCommand = cb.GetUpdateCommand(); + da.UpdateCommand.UpdatedRowSource = UpdateRowSource.None; + da.UpdateBatchSize = 100; + + DataTable dt = new DataTable(); + da.Fill(dt); + + dt.Rows[0]["name"] = "boo2"; + dt.Rows[1]["name"] = "boo2"; + dt.Rows[2]["name"] = "boo2"; + da.Update(dt); + } + + Assert.That(listener.Find("Query Opened: UPDATE"), Is.EqualTo(1)); + } + + [Test] + public void ExecuteReaderReturnsReaderAfterCancel() + { + ExecuteSQL("CREATE TABLE TableWithDateAsPrimaryKey(PrimaryKey date NOT NULL, PRIMARY KEY (PrimaryKey)) ENGINE=InnoDB"); + ExecuteSQL("CREATE TABLE TableWithStringAsPrimaryKey(PrimaryKey nvarchar(50) NOT NULL, PRIMARY KEY (PrimaryKey)) ENGINE=InnoDB"); + + MySqlCommand command = new MySqlCommand("SELECT PrimaryKey FROM TableWithDateAsPrimaryKey", Connection); + IDataReader reader = command.ExecuteReader(CommandBehavior.KeyInfo); + DataTable dataTableSchema = reader.GetSchemaTable(); + command.Cancel(); + reader.Close(); + + command = new MySqlCommand("SELECT PrimaryKey FROM TableWithStringAsPrimaryKey", Connection); + reader = command.ExecuteReader(CommandBehavior.KeyInfo); + Assert.That(reader, Is.Not.Null); + + dataTableSchema = reader.GetSchemaTable(); + Assert.That("PrimaryKey" == (string)dataTableSchema.Rows[0][dataTableSchema.Columns[0]]); + reader.Close(); + } + + [Test] + public void CloneCommand() + { + using var cmd = new MySqlCommand(); + cmd.Attributes.SetAttribute("attr", "attr_value"); + cmd.Parameters.AddWithValue("@param", "param_value"); + + var cmd2 = (MySqlCommand)cmd.Clone(); + + Assert.That(cmd2.Parameters.Count, Is.EqualTo(1)); + Assert.That(cmd2.Attributes.Count, Is.EqualTo(1)); + Assert.That(cmd2.Attributes[0].Value.ToString(), Is.EqualTo("attr_value").IgnoreCase); + Assert.That(cmd2.Parameters[0].Value.ToString(), Is.EqualTo("param_value").IgnoreCase); + } + + /// + /// Bug 27441433 - RESETREADER: MYSQLDATAREADER CANNOT OUTLIVE PARENT MYSQLCOMMAND SINCE 6.10 + /// + [Test] + public void ExecuteReaderAfterClosingCommand() + { + MySqlDataReader reader; + + using (MySqlConnection conn = new MySqlConnection(Connection.ConnectionString)) + { + using (MySqlCommand cmd = new MySqlCommand("SELECT 'TEST'", conn)) + { + conn.Open(); + cmd.CommandType = CommandType.Text; + reader = cmd.ExecuteReader(); + } + + Assert.That(reader.Read()); + Assert.That(reader.GetString(0), Is.EqualTo("TEST")); + Assert.That(reader.Read(), Is.False); + } + } + + /// + /// Bug #26574860 - SETTING COMMANDTIMEOUT=-1 DOESN'T THROW ARGUMENTEXCEPTION + /// + [Test] + public void CommandNegativeTimeout() + { + MySqlConnection conn = new MySqlConnection($"server={Host};default command timeout=10"); + MySqlCommand cmd = new MySqlCommand("", conn); + Assert.That(cmd.CommandTimeout, Is.EqualTo(10)); + + Assert.Throws(() => conn = new MySqlConnection($"server={Host};default command timeout=-1")); + var ex = Assert.Throws(() => cmd.CommandTimeout = -1); + Assert.That(ex.Message, Is.EqualTo("Command timeout must not be negative").IgnoreCase); + + cmd.CommandTimeout = 15; + Assert.That(cmd.CommandTimeout, Is.EqualTo(15)); + } + + #region SQL Injection + + /// + /// Bug #45941 SQL-Injection attack + /// + [Test] + [Property("Category", "Security")] + public void SqlInjection1() + { + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE Test(name VARCHAR(100)) ENGINE=MyISAM DEFAULT CHARSET=utf8"); + ExecuteSQL("INSERT INTO Test VALUES ('name1'), ('name2'), ('name3')"); + + MySqlCommand cnt = new MySqlCommand("SELECT COUNT(*) FROM Test", Connection); + Int64 count = (Int64)cnt.ExecuteScalar(); + + MySqlCommand cmd = new MySqlCommand("DELETE FROM Test WHERE name=?name", Connection); + cmd.Parameters.Add("?name", MySqlDbType.VarChar); + cmd.Parameters[0].Value = "\u2032 OR 1=1;-- --"; + cmd.ExecuteNonQuery(); + + Assert.That((Int64)cnt.ExecuteScalar(), Is.EqualTo(count)); + } + + #endregion + + [Test, Description("Timeout using Big Table ")] + public void TimeoutBigTable() + { + var txt = @" + CREATE TABLE `inventory` ( + `inventory_id` mediumint unsigned NOT NULL AUTO_INCREMENT, + `film_id` int unsigned NOT NULL, + `store_id` tinyint unsigned NOT NULL, + `last_update` timestamp NOT NULL, + PRIMARY KEY (`inventory_id`) + )"; + + ExecuteSQL(txt); + Random rnd = new(); + StringBuilder cmdString = new(); + + for (int i = 0; i < 5000; i++) + { + var film = rnd.Next(1, 100); + var store = rnd.Next(2); + cmdString.Append($"insert into inventory(film_id,store_id,last_update) values({film},{store},'2006-02-15 05:09:17');"); + } + + var cmd = Connection.CreateCommand(); + cmd.CommandTimeout = 3500; + cmd.CommandText = cmdString.ToString(); + cmd.ExecuteNonQuery(); + + using (var conn = new MySqlConnection(Connection.ConnectionString)) + { + conn.Open(); + cmd = new MySqlCommand(); + cmd.Connection = conn; + cmd.CommandTimeout = 999999; + cmd.CommandText = "SELECT * FROM inventory;"; + cmd.ExecuteNonQuery(); + + using (var reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + Assert.That(cmd.CommandTimeout, Is.EqualTo(999999)); + Assert.That(reader.GetValue(0).ToString(), Is.Not.Empty); + Assert.That(reader.GetValue(1).ToString(), Is.Not.Empty); + Assert.That(reader.GetValue(2).ToString(), Is.Not.Empty); + Assert.That(reader.GetValue(3).ToString(), Is.Not.Empty); + } + } + } + + ExecuteSQL("drop table if exists inventory"); + } + + [Test, Description("MySQL Reserved Word used")] + public void ReservedWordUse() + { + var connStr = $"server={Host};user={Settings.UserID};database={Settings.Database};port={Port};password={Settings.Password};logging=true;sslmode=none"; + using (var conn = new MySqlConnection(connStr)) + { + var cmd = new MySqlCommand(); + conn.Open(); + cmd.Connection = conn; + cmd.CommandText = "DROP TABLE IF EXISTS mitabla"; + cmd.ExecuteNonQuery(); + cmd.CommandText = + "CREATE TABLE mitabla ( value VARCHAR(45) NOT NULL, unknown VARCHAR(45) NOT NULL, status VARCHAR(45) NOT NULL)"; + cmd.ExecuteNonQuery(); + cmd.CommandText = + "insert into mitabla values('1','test','status')"; + cmd.ExecuteNonQuery(); + cmd.CommandText = "select value, unknown, status from mitabla;"; + using (var rdr = cmd.ExecuteReader()) + { + while (rdr.Read()) + { + Assert.That(rdr[0], Is.EqualTo("1")); + Assert.That(rdr[1], Is.EqualTo("test")); + Assert.That(rdr[2], Is.EqualTo("status")); + } + } + } + } + + /// + /// Bug 19474480 + /// + [Test, Description("Memory Leak Orabug 19474480")] + [Ignore("This test needs to be executed individually as it makes too much iterations")] + public void MemoryLeak() + { + var sql = "SELECT 1"; + const int TestIterationCount = 100000; + + for (var i = 0; i < TestIterationCount; i++) + using (var conn = new MySqlConnection(Settings.ConnectionString)) + using (var comm = new MySqlCommand(sql, conn)) + { + conn.Open(); + comm.ExecuteNonQuery(); + } + + for (var i = 0; i < TestIterationCount; i++) + { + var conn = new MySqlConnection(Settings.ConnectionString); + var comm = new MySqlCommand(sql, conn); + { + conn.Open(); + comm.ExecuteNonQuery(); + conn.Close(); + conn.Dispose(); + } + } + } + + /// + /// Bug #21971751 - USING TABS FOR WHITESPACE RESULTS IN "YOU HAVE AN ERROR IN YOUR SQL SYNTAX..." + /// At the moment the query was analyzed, the tabs ('\t') and new lines ('\n') were not considered. + /// + [Test] + public void ExecuteCmdWithTabsAndNewLines() + { + ExecuteSQL(@"CREATE TABLE Test (id INT NOT NULL PRIMARY KEY); + INSERT INTO Test VALUES (1);"); + + using (var cmd = Connection.CreateCommand()) + { + cmd.CommandText = "SELECT\nCOUNT(*)\nFROM\nTest;"; + Assert.That(cmd.ExecuteScalar(), Is.EqualTo(1)); + + cmd.CommandText = "SELECT\tCOUNT(*)\n\t\tFROM\tTest;"; + Assert.That(cmd.ExecuteScalar(), Is.EqualTo(1)); + } + } + + /// + /// Bug#30365157 [MYSQLCOMMAND.LASTINSERTEDID RETURNS 0 AFTER EXECUTING MULTIPLE STATEMENTS] + /// + [Test] + public void LastInsertedIdInMultipleStatements() + { + ExecuteSQL(@"CREATE TABLE Test (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, Column1 CHAR(100))"); + ExecuteSQL(@"CREATE TABLE TestForeignKey (foreign_id INT NOT NULL, Column2 CHAR(100), FOREIGN KEY (foreign_id) REFERENCES Test (id))"); + + using var cmd = Connection.CreateCommand(); + cmd.CommandText = "INSERT INTO Test(column1) VALUES ('hello'); " + + "INSERT INTO TestForeignKey (foreign_id, column2) VALUES(LAST_INSERT_ID(), 'test');"; + + cmd.ExecuteNonQuery(); + Assert.That(cmd.LastInsertedId, Is.EqualTo(1)); + + cmd.ExecuteNonQuery(); + Assert.That(cmd.LastInsertedId, Is.EqualTo(2)); + + cmd.CommandText = "SELECT * FROM Test"; + int id = 1; + + using var reader = cmd.ExecuteReader(); + while (reader.Read()) + { + Assert.That(reader.GetInt32(0) == id); + id++; + } + + Assert.That(cmd.LastInsertedId, Is.EqualTo(-1)); + } + + /// + /// Bug# 34993798 - MySqlCommand.LastInsertedId is incorrect if multiple rows are inserted and all rows gnereate a value. + /// + [Test] + public void LastInserteIdRedux() + { + ExecuteSQL(@"CREATE TABLE Test (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, text CHAR(100))"); + + using var cmd = Connection.CreateCommand(); + cmd.CommandText = @"INSERT INTO Test (text) VALUES ('test1'); INSERT INTO Test (text) VALUES ('test2');"; + + Assert.That(cmd.ExecuteNonQuery(), Is.EqualTo(2)); + Assert.That(cmd.LastInsertedId, Is.EqualTo(2)); + } + + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/CmdTestsCompressed.cs b/MySQL.Data/tests/MySql.Data.Tests/CmdTestsCompressed.cs new file mode 100644 index 000000000..7ce26eb36 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/CmdTestsCompressed.cs @@ -0,0 +1,47 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework; +using NUnit.Framework.Legacy; + +namespace MySql.Data.MySqlClient.Tests +{ + public class CmdTestsSocketCompressed : CmdTests + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.UseCompression = true; + } + + [Test] + public override void InsertingPreparedNulls() + { + base.InsertingPreparedNulls(); + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/ConnectionStringBuilderTests.cs b/MySQL.Data/tests/MySql.Data.Tests/ConnectionStringBuilderTests.cs new file mode 100644 index 000000000..e399e076e --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/ConnectionStringBuilderTests.cs @@ -0,0 +1,468 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Generic; +using System.Data; + +namespace MySql.Data.MySqlClient.Tests +{ + public class ConnectionStringBuilderTests : TestBase + { + private string _sslCa; + + public ConnectionStringBuilderTests() + { + string cPath = TestContext.CurrentContext.TestDirectory + "\\"; + + _sslCa = cPath + "ca.pem"; + } + + [Test] + public void Simple() + { + MySqlConnectionStringBuilder sb = null; + sb = new MySqlConnectionStringBuilder(); + sb.ConnectionString = "server=localhost;uid=reggie;pwd=pass;port=1111;" + + "connection timeout=23; pooling=true; min pool size=33; " + + "max pool size=66;keepalive=1"; + Assert.That(sb.Server, Is.EqualTo("localhost")); + Assert.That(sb.UserID, Is.EqualTo("reggie")); + Assert.That(sb.Password, Is.EqualTo("pass")); + Assert.That(Convert.ToInt32(sb.Port), Is.EqualTo(1111)); + Assert.That(Convert.ToInt32(sb.ConnectionTimeout), Is.EqualTo(23)); + Assert.That(sb.Pooling); + Assert.That(Convert.ToInt32(sb.MinimumPoolSize), Is.EqualTo(33)); + Assert.That(Convert.ToInt32(sb.MaximumPoolSize), Is.EqualTo(66)); + Assert.That(Convert.ToInt32(sb.Keepalive), Is.EqualTo(1)); + Exception ex = Assert.Throws(() => sb.ConnectionString = "server=localhost;badkey=badvalue"); +#if NETFRAMEWORK + Assert.That(ex.Message, Is.EqualTo($"Option not supported{Environment.NewLine}Parameter name: badkey")); +#else + Assert.That(ex.Message, Is.EqualTo("Option not supported (Parameter 'badkey')")); +#endif + sb.Clear(); + Assert.That(Convert.ToInt32(sb.ConnectionTimeout), Is.EqualTo(15)); + Assert.That(sb.Pooling); + Assert.That(sb.Pooling); + Assert.That(Convert.ToInt32(sb.Port), Is.EqualTo(3306)); + Assert.That(sb.Server, Is.EqualTo(String.Empty)); + Assert.That(sb.PersistSecurityInfo, Is.False); + Assert.That(Convert.ToInt32(sb.ConnectionLifeTime), Is.EqualTo(0)); + Assert.That(sb.ConnectionReset, Is.False); + Assert.That(Convert.ToInt32(sb.MinimumPoolSize), Is.EqualTo(0)); + Assert.That(Convert.ToInt32(sb.MaximumPoolSize), Is.EqualTo(100)); + Assert.That(sb.UserID, Is.EqualTo(String.Empty)); + Assert.That(sb.Password, Is.EqualTo(String.Empty)); + Assert.That(sb.UseUsageAdvisor, Is.False); + Assert.That(sb.CharacterSet, Is.EqualTo(String.Empty)); + Assert.That(sb.UseCompression, Is.False); + Assert.That(sb.PipeName, Is.EqualTo("MYSQL")); + Assert.That(sb.Logging, Is.False); + Assert.That(sb.AllowBatch); + Assert.That(sb.ConvertZeroDateTime, Is.False); + Assert.That(sb.SharedMemoryName, Is.EqualTo("MYSQL")); + Assert.That(sb.Database, Is.EqualTo(String.Empty)); + Assert.That(sb.ConnectionProtocol, Is.EqualTo(MySqlConnectionProtocol.Sockets)); + Assert.That(sb.AllowZeroDateTime, Is.False); + Assert.That(sb.UsePerformanceMonitor, Is.False); + Assert.That(Convert.ToInt32(sb.ProcedureCacheSize), Is.EqualTo(25)); + Assert.That(Convert.ToInt32(sb.Keepalive), Is.EqualTo(0)); + } + + /// + /// Bug #37955 Connector/NET keeps adding the same option to the connection string + /// + [Test] + public void SettingValueMultipeTimes() + { + MySqlConnectionStringBuilder s = new MySqlConnectionStringBuilder(); + s["database"] = "test"; + s["database"] = "test2"; + Assert.That(s.ConnectionString, Is.EqualTo("database=test2")); + } + + /// + /// Bug #51209 error on parameter without value on connectionstring + /// + [Test] + public void NoValueGivenForConnectionStringOption() + { + MySqlConnectionStringBuilder s = new MySqlConnectionStringBuilder(); + s.ConnectionString = "compress=;pooling="; + Assert.That(s.UseCompression, Is.False); + Assert.That(s.Pooling); + } + + /// + /// Bug #59835 .Net Connector MySqlConnectionStringBuilder wrong result ContainsKey function + /// + [Test] + public void ContainsKey() + { + MySqlConnectionStringBuilder s = new MySqlConnectionStringBuilder(); + s["database"] = "test"; + Assert.That(s.ContainsKey("initial catalog")); + s["server"] = "myserver"; + Assert.That(s.ContainsKey("server")); + Assert.That(s.ContainsKey("host")); + Assert.That(s.ContainsKey("badkey"), Is.False); + } + + [Test] + public void SettingCheckParameters() + { + MySqlConnectionStringBuilder s = new MySqlConnectionStringBuilder("server=localhost;check parameters=false"); + Assert.That(s.CheckParameters, Is.False); + } + + [TestCase("foo keyword")] + [TestCase("password4")] + public void SettingInvalidKeyThrowsArgumentException(string invalidKey) + { + MySqlConnectionStringBuilder s = new MySqlConnectionStringBuilder(); + Exception ex = Assert.Throws(() => s[invalidKey] = "foo"); +#if NETFRAMEWORK + Assert.That(ex.Message, Is.EqualTo($"Option not supported{Environment.NewLine}Parameter name: {invalidKey}")); +#else + Assert.That(ex.Message, Is.EqualTo($"Option not supported (Parameter '{invalidKey}')")); +#endif + } + + /// + /// Bug #66880 Keyword not supported. Parameter name: AttachDbFilename. + /// + [Test] + public void SafeTryGetValue() + { + object obj; + MySqlConnectionStringBuilder s = new MySqlConnectionStringBuilder("server=localhost;"); + s.TryGetValue("unknownproperty", out obj); + Assert.That(obj, Is.Null); + } + +#if !NETFRAMEWORK + [Test] + public void DotnetCoreNotCurrentlySupported() + { + List options = new List(new string[] { "useperformancemonitor", }); + if (Platform.IsWindows()) + options.Add("integratedsecurity"); + + foreach (string option in options) + { + PlatformNotSupportedException ex = Assert.Throws(() => + { + MySqlConnectionStringBuilder connString = new MySqlConnectionStringBuilder($"server=localhost;user=root;password=;{option}=dummy"); + }); + } + + MySqlConnectionStringBuilder csb = new MySqlConnectionStringBuilder(); + if (Platform.IsWindows()) + Assert.Throws(() => csb.IntegratedSecurity = true); + Assert.Throws(() => csb.UsePerformanceMonitor = true); + } +#endif + +#if !NETFRAMEWORK + [Test] + public void NonWindowsOSNotCurrentlySupported() + { + Assume.That(!Platform.IsWindows(), "This test is for non Windows OS only."); + + List options = new List(new string[] + { + "sharedmemoryname", + "pipe", + "kerberosauthmode" + }); + + foreach (string option in options) + { + PlatformNotSupportedException ex = Assert.Throws(() => + { + MySqlConnectionStringBuilder connString = new MySqlConnectionStringBuilder($"server=localhost;user=root;password=;{option}=dummy"); + }); + } + + MySqlConnectionStringBuilder csb = new MySqlConnectionStringBuilder(); + Assert.Throws(() => csb.SharedMemoryName = "dummy"); + Assert.Throws(() => csb.PipeName = "dummy"); + csb.ConnectionProtocol = MySqlConnectionProtocol.Tcp; + Assert.Throws(() => csb.ConnectionProtocol = MySqlConnectionProtocol.SharedMemory); + Assert.Throws(() => csb.ConnectionProtocol = MySqlConnectionProtocol.NamedPipe); + Assert.Throws(() => csb.KerberosAuthMode = KerberosAuthMode.AUTO); + Assert.Throws(() => csb.KerberosAuthMode = KerberosAuthMode.GSSAPI); + Assert.Throws(() => csb.KerberosAuthMode = KerberosAuthMode.SSPI); + } +#endif + + // Bug #28157737 TABLE CACHING IS NOT SUPPORTED IN THE MYSQLCONNECTIONSTRINGBUILDER CLASS + [Test] + public void SettingTableCachingRaisesException() + { + var builder = new MySqlConnectionStringBuilder(); + builder.TableCaching = true; + Assert.That(builder.TableCaching); + } + + /// + /// WL14429 - [Classic] Support for authentication_kerberos_client authentication plugin + /// Added new connection string option: DefaultAuthenticationPlugin + /// + /// + [TestCase("3")] + [TestCase("invalidAuthenticationPlugin")] + public void SettingInvalidAuthenticationMethod(string method) + { + var builder = new MySqlConnectionStringBuilder(); + builder.DefaultAuthenticationPlugin = " "; + var ex = Assert.Throws(() => builder.DefaultAuthenticationPlugin = method); + Assert.That(ex.Message, Is.EqualTo(string.Format(Resources.AuthenticationMethodNotSupported, method)).IgnoreCase); + + var connStr = $"server=localhost;userid=root;defaultauthenticationplugin={method}"; + ex = Assert.Throws(() => new MySqlConnection(connStr)); + Assert.That(ex.Message, Is.EqualTo(string.Format(Resources.AuthenticationMethodNotSupported, method)).IgnoreCase); + + connStr = "server=localhost;userid=root;defaultauthenticationplugin="; + var conn = new MySqlConnection(connStr); + } + + /// + /// WL14653 - Support for MFA (multi factor authentication) authentication + /// 'Password1' and 'pwd1' should be interpreted as aliases for 'password' connection option + /// + [TestCase("password1")] + [TestCase("pwd1")] + public void UsingPwdAliases(string alias) + { + string value = "test"; + var conn = new MySqlConnection($"{alias}={value};pwd2={value};pwd3={value}"); + Assert.That(conn.Settings.Password, Is.EqualTo(value).IgnoreCase); + Assert.That(conn.Settings.Password2, Is.EqualTo(value).IgnoreCase); + Assert.That(conn.Settings.Password3, Is.EqualTo(value).IgnoreCase); + + var connBuilder = new MySqlConnectionStringBuilder(); + connBuilder[alias] = value; + connBuilder["pwd2"] = value; + connBuilder["pwd3"] = value; + Assert.That(connBuilder.Password, Is.EqualTo(value).IgnoreCase); + Assert.That(connBuilder.Password2, Is.EqualTo(value).IgnoreCase); + Assert.That(connBuilder.Password3, Is.EqualTo(value).IgnoreCase); + } + + [Test, Description("Session BaseString/MySQLConnectionString Builder")] + public void ConnectionStringBuilderClassicTests() + { + Assume.That(Platform.IsWindows(), "This test is for Windows OS only."); + + MySqlConnectionStringBuilder mysql = new MySqlConnectionStringBuilder(Settings.ConnectionString); + + mysql.ConnectionProtocol = MySqlConnectionProtocol.Tcp; + mysql.CharacterSet = "utf8mb4"; + mysql.SslMode = MySqlSslMode.Required; + mysql.ConnectionTimeout = 10; + mysql.Keepalive = 10; + mysql.CertificateFile = _sslCa; + mysql.CertificatePassword = "pass"; + mysql.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysql.CertificateThumbprint = ""; + + using (var conn = new MySqlConnection(mysql.ConnectionString)) + { + conn.Open(); + Assert.That(conn.connectionState, Is.EqualTo(ConnectionState.Open)); + } + + mysql = new MySqlConnectionStringBuilder(Settings.ConnectionString); + mysql.ConnectionProtocol = MySqlConnectionProtocol.Tcp; + mysql.CharacterSet = "utf8mb4"; + mysql.SslMode = MySqlSslMode.VerifyCA; + mysql.ConnectionTimeout = 10; + mysql.Keepalive = 10; + mysql.CertificateFile = _sslCa; + mysql.CertificatePassword = "pass"; + mysql.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysql.CertificateThumbprint = ""; + + using (var conn = new MySqlConnection(mysql.ConnectionString)) + { + conn.Open(); + Assert.That(conn.connectionState, Is.EqualTo(ConnectionState.Open)); + } + + mysql = new MySqlConnectionStringBuilder(Settings.ConnectionString); + mysql.ConnectionProtocol = MySqlConnectionProtocol.Tcp; + mysql.CharacterSet = "utf8mb4"; + mysql.SslMode = MySqlSslMode.Required; + mysql.ConnectionTimeout = 10; + mysql.Keepalive = 10; + + using (var conn = new MySqlConnection(mysql.ConnectionString)) + { + conn.Open(); + Assert.That(conn.connectionState, Is.EqualTo(ConnectionState.Open)); + } + + ////Scenario-2 + ////MySQL Connection + mysql = new MySqlConnectionStringBuilder(Settings.ConnectionString); + mysql.ConnectionProtocol = MySqlConnectionProtocol.Tcp; + mysql.CharacterSet = "utf8mb4"; + mysql.SslMode = MySqlSslMode.Required; + mysql.ConnectionTimeout = 10; + mysql.Keepalive = 10; + mysql.CertificateFile = _sslCa; + mysql.CertificatePassword = "pass"; + mysql.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysql.CertificateThumbprint = ""; + mysql.AllowPublicKeyRetrieval = true; + mysql.UseCompression = true; + mysql.AllowBatch = true; + mysql.Logging = true; + mysql.DefaultCommandTimeout = 10; + mysql.UseDefaultCommandTimeoutForEF = true; + mysql.PersistSecurityInfo = true; + mysql.AutoEnlist = true; + mysql.IncludeSecurityAsserts = true; + mysql.AllowZeroDateTime = true; + mysql.ConvertZeroDateTime = true; + mysql.UseUsageAdvisor = true; + mysql.ProcedureCacheSize = 20; + mysql.RespectBinaryFlags = true; + mysql.TreatTinyAsBoolean = true; + mysql.AllowUserVariables = true; + mysql.InteractiveSession = true; + mysql.FunctionsReturnString = true; + mysql.UseAffectedRows = true; + mysql.OldGuids = true; + mysql.SqlServerMode = true; + mysql.DefaultTableCacheAge = 20; + mysql.CheckParameters = true; + mysql.Replication = true; + mysql.ConnectionLifeTime = 10; + mysql.Pooling = true; + mysql.MinimumPoolSize = 5; + mysql.MaximumPoolSize = 100; + mysql.ConnectionReset = true; + mysql.CacheServerProperties = true; + mysql.TreatBlobsAsUTF8 = true; + mysql.BlobAsUTF8IncludePattern = "BLOBI"; + mysql.BlobAsUTF8ExcludePattern = "BLOBE"; + mysql.TableCaching = false; + + using (var conn = new MySqlConnection(mysql.ConnectionString)) + { + conn.Open(); + Assert.That(conn.connectionState, Is.EqualTo(ConnectionState.Open)); + } + + mysql.SslCa = _sslCa; + + using (var conn = new MySqlConnection(mysql.ConnectionString)) + { + conn.Open(); + Assert.That(conn.connectionState, Is.EqualTo(ConnectionState.Open)); + } + + ////Basic Scenarios + string connectionstr = "server = " + mysql.Server + "; database = " + mysql.Database + "; protocol = Socket; port = " + + mysql.Port + "; user id = " + mysql.UserID + "; password = " + mysql.Password + + "; characterset = utf8mb4; sslmode = Required; connectiontimeout = 10; keepalive = 10; certificatefile = " + + _sslCa + "; certificatepassword = pass; certificatestorelocation = LocalMachine; certificatethumbprint = "; + using (var conn = new MySqlConnection(mysql.ConnectionString)) + { + conn.Open(); + Assert.That(conn.connectionState, Is.EqualTo(ConnectionState.Open)); + } + } + + /// + /// Bug #33351775 [MySqlConnectionStringBuilder.TryGetValue always returns false] + /// TryGetValue() method of ConnectionStringBuilder object was not overrided. + /// + [Test] + public void TryGetValue() + { + MySqlConnectionStringBuilder connStringBuilder = new() + { + Server = "localhost", + MinimumPoolSize = 10, + }; + + Assert.That(connStringBuilder.ContainsKey("data source")); + Assert.That(connStringBuilder.TryGetValue("host", out var server)); + Assert.That((string)server, Is.EqualTo(connStringBuilder.Server).IgnoreCase); + + Assert.That(connStringBuilder.ContainsKey("MinimumPoolSize")); + Assert.That(connStringBuilder.TryGetValue("Minimum Pool Size", out var minpoolsize)); + Assert.That((uint)minpoolsize, Is.EqualTo(connStringBuilder.MinimumPoolSize)); + + // Default value + Assert.That(connStringBuilder.TryGetValue("allowpublickeyretrieval", out var allowpublickeyretrieval)); + Assert.That(allowpublickeyretrieval, Is.EqualTo(connStringBuilder.GetOption("allowpublickeyretrieval").DefaultValue)); + + // Non existing option + Assert.That(connStringBuilder.TryGetValue("bar", out var nonexistingoption), Is.False); + Assert.That(nonexistingoption, Is.Null); + } + + /// + /// WL15341 - [Classic] Support MIT Kerberos library on Windows + /// New "KerberosAuthMode" connection option added. + /// + [Test] + public void KerberosAuthModeTest() + { + Assume.That(Platform.IsWindows(), "This test is for Windows OS only."); + + string connString; + MySqlConnection conn; + + conn = new MySqlConnection(); + Assert.That(conn.Settings.KerberosAuthMode == KerberosAuthMode.AUTO); + + foreach (KerberosAuthMode mode in Enum.GetValues(typeof(KerberosAuthMode))) + { + connString = $"kerberosauthmode={mode}"; + conn = new MySqlConnection(connString); + Assert.That(conn.Settings.KerberosAuthMode == mode); + + connString = $"kerberos auth mode={mode}"; + conn = new MySqlConnection(connString); + Assert.That(conn.Settings.KerberosAuthMode == mode); + } + + connString = "kerberosauthmode=INVALID"; + Assert.Throws(() => conn = new MySqlConnection(connString)); + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/ConnectionTests.cs b/MySQL.Data/tests/MySql.Data.Tests/ConnectionTests.cs new file mode 100644 index 000000000..9b5858a5e --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/ConnectionTests.cs @@ -0,0 +1,1819 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using MySql.Data.Tests; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Generic; +using System.Data; +using System.Diagnostics; +using System.Net.Sockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient.Tests +{ + public class ConnectionTests : TestBase + { + const string _EXPIRED_USER = "expireduser"; + + [Test] + public void TestConnectionStrings() + { + MySqlConnection c = new MySqlConnection(); + + // public properties + Assert.That(15 == c.ConnectionTimeout, "ConnectionTimeout"); + Assert.That(String.Empty == c.Database, "Database"); + Assert.That(String.Empty == c.DataSource, "DataSource"); + Assert.That(false == c.UseCompression, "Use Compression"); + Assert.That(ConnectionState.Closed == c.State, "State"); + + c = new MySqlConnection("connection timeout=25; user id=myuser; " + + "password=mypass; database=Test;server=myserver; use compression=true; " + + "pooling=false;min pool size=5; max pool size=101"); + + // public properties + Assert.That(25 == c.ConnectionTimeout, "ConnectionTimeout"); + Assert.That("Test" == c.Database, "Database"); + Assert.That("myserver" == c.DataSource, "DataSource"); + Assert.That(true == c.UseCompression, "Use Compression"); + Assert.That(ConnectionState.Closed == c.State, "State"); + + c.ConnectionString = "connection timeout=15; user id=newuser; " + + "password=newpass; port=3308; database=mydb; data source=myserver2; " + + "use compression=true; pooling=true; min pool size=3; max pool size=76"; + + // public properties + Assert.That(15 == c.ConnectionTimeout, "ConnectionTimeout"); + Assert.That("mydb" == c.Database, "Database"); + Assert.That("myserver2" == c.DataSource, "DataSource"); + Assert.That(true == c.UseCompression, "Use Compression"); + Assert.That(ConnectionState.Closed == c.State, "State"); + + // Bug #30791289 - MYSQLCONNECTION(NULL) NOW THROWS NULLREFERENCEEXCEPTION + var conn = new MySqlConnection($"server={Host};"); + conn.ConnectionString = null; + Assert.That(conn.ConnectionString, Is.EqualTo(string.Empty)); + } + + [Test] + public void ChangeDatabase() + { + MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(Connection.ConnectionString); + MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true)); + using (c) + { + c.Open(); + Assert.That(c.State == ConnectionState.Open); + Assert.That(c.Database, Is.EqualTo(connStr.Database)); + + string dbName = CreateDatabase("db1"); + c.ChangeDatabase(dbName); + Assert.That(c.Database, Is.EqualTo(dbName)); + } + } + + /// + /// Bug#35731216 Pool exhaustion after timeouts in transactions. + /// + [Test] + public void ConnectionPoolExhaustion() + { + for (var i = 0; i <= 11; i++) + { + var ex = Assert.Catch(() => CreateCommandTimeoutException()); + //Prior to the fix the exception thrown was 'error connecting: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.' after the 10th execution. + Assert.That(ex.Message, Is.EqualTo("Fatal error encountered during command execution")); + } + } + + private void CreateCommandTimeoutException() + { + MySqlConnectionStringBuilder settings = new MySqlConnectionStringBuilder(Connection.ConnectionString); + settings.Pooling = true; + settings.MaximumPoolSize = 10; + using (var conn = new MySqlConnection(settings.GetConnectionString(true))) + { + conn.Open(); + using (var tran = conn.BeginTransaction()) + { + using (var cmd = conn.CreateCommand()) + { + cmd.CommandText = "DO SLEEP(5);"; + cmd.CommandTimeout = 1; + cmd.ExecuteNonQuery(); + } + } + } + } + + /// + /// Bug#36319784 Minpoolsize different than 0 causes connector to hang after first connection + /// + [Test] + public void PoolingMultipleConnections() + { + Connection.Settings.Pooling = true; + Connection.Settings.MaximumPoolSize = 100; + Connection.Settings.MinimumPoolSize = 1; + MySqlConnection conn =new MySqlConnection(Connection.ConnectionString); + Assert.DoesNotThrow(() => conn.Open()); + + Connection.Settings.PersistSecurityInfo = false; + conn = conn = new MySqlConnection(Connection.ConnectionString); + Assert.Throws(() => conn.Open()); + + Connection.Settings.PersistSecurityInfo = true; + conn = conn = new MySqlConnection(Connection.ConnectionString ); + Assert.DoesNotThrow(() => conn.Open()); + } + + /// + /// Bug#35827809 Connector/Net allows a connection that has been disposed to be reopened. + /// + [Test] + public void ReOpenDisposedConnection() + { + using (MySqlConnection c = new MySqlConnection(Connection.ConnectionString)) + { + c.Open(); + c.Close(); + c.Dispose(); + Assert.Throws(() => c.Open()); + } + } + + /// + /// Bug#35474099 OpenAsync throws unhandled exception from thread pool. + /// + [Test] + public async Task OpenAsyncCatchException() + { + MockServer mockServer = new MockServer(false); + mockServer.StartServer(); + using var connection = new MySqlConnection($"server={mockServer.Address};port={mockServer.Port};user={Settings.UserID};connectiontimeout = 1"); + Assert.ThrowsAsync(async () => await connection.OpenAsync()); + mockServer.StopServer(); + } + + [Test] + public void ConnectingAsUTF8() + { + MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(Connection.ConnectionString); + connStr.CharacterSet = "utf8"; + using (MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true))) + { + c.Open(); + + MySqlCommand cmd = new MySqlCommand( + "CREATE TABLE test (id varbinary(16), active bit) CHARACTER SET utf8", c); + cmd.ExecuteNonQuery(); + cmd.CommandText = "INSERT INTO test (id, active) VALUES (CAST(0x1234567890 AS Binary), true)"; + cmd.ExecuteNonQuery(); + cmd.CommandText = "INSERT INTO test (id, active) VALUES (CAST(0x123456789a AS Binary), true)"; + cmd.ExecuteNonQuery(); + cmd.CommandText = "INSERT INTO test (id, active) VALUES (CAST(0x123456789b AS Binary), true)"; + cmd.ExecuteNonQuery(); + } + + using (MySqlConnection d = new MySqlConnection(connStr.GetConnectionString(true))) + { + d.Open(); + + MySqlCommand cmd2 = new MySqlCommand("SELECT id, active FROM test", d); + using (MySqlDataReader reader = cmd2.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetBoolean(1)); + } + } + } + + /// + /// Bug #13658 connection.state does not update on Ping() + /// + [Test] + public void PingUpdatesState() + { + var conn2 = GetConnection(); + KillConnection(conn2); + Assert.That(conn2.Ping(), Is.False); + Assert.That(conn2.State == ConnectionState.Closed); + conn2.Open(); + conn2.Close(); + } + + /// + /// Bug #16659 Can't use double quotation marks(") as password access server by Connector/NET + /// + [Test] + [Ignore("Fix for 8.0.5")] + public void ConnectWithQuotePassword() + { + ExecuteSQL("GRANT ALL ON *.* to 'quotedUser'@'%' IDENTIFIED BY '\"'", true); + ExecuteSQL($"GRANT ALL ON *.* to 'quotedUser'@'{Host}' IDENTIFIED BY '\"'", true); + MySqlConnectionStringBuilder settings = new MySqlConnectionStringBuilder(Connection.ConnectionString); + settings.UserID = "quotedUser"; + settings.Password = "\""; + using (MySqlConnection c = new MySqlConnection(Connection.ConnectionString)) + { + c.Open(); + } + } + + /// + /// Bug #24802 Error Handling + /// + [Test] + public void TestConnectingSocketBadHostName() + { + MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(Connection.ConnectionString); + connStr.Server = "badHostName"; + MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true)); + var ex = Assert.Throws(() => c.Open()); + if (Platform.IsWindows()) Assert.That(ex.InnerException.GetType() == typeof(ArgumentException)); + } + + /// + /// Bug #29123 Connection String grows with each use resulting in OutOfMemoryException + /// + [Test] + public void ConnectionStringNotAffectedByChangeDatabase() + { + for (int i = 0; i < 10; i++) + { + string connStr = Connection.ConnectionString + ";pooling=false"; + connStr = connStr.Replace("database", "Initial Catalog"); + connStr = connStr.Replace("persist security info=true", + "persist security info=false"); + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + string str = c.ConnectionString; + int index = str.IndexOf("Database="); + Assert.That(index, Is.EqualTo(-1)); + } + } + } + + [Test] + [Ignore("dotnet core seems to keep objects alive")] // reference https://github.com/dotnet/coreclr/issues/13490 + public void ConnectionCloseByGC() + { + int threadId; + ConnectionClosedCheck check = new ConnectionClosedCheck(); + + MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(Connection.ConnectionString); + connStr.Pooling = false; + MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true)); + c.StateChange += new StateChangeEventHandler(check.stateChangeHandler); + c.Open(); + threadId = c.ServerThread; + WeakReference wr = new WeakReference(c); + Assert.That(wr.IsAlive); + c = null; + GC.Collect(); + GC.WaitForPendingFinalizers(); + Assert.That(wr.IsAlive, Is.False); + Assert.That(check.closed); + + MySqlCommand cmd = new MySqlCommand("KILL " + threadId, Connection); + cmd.ExecuteNonQuery(); + } + + /// + /// Bug #31262 NullReferenceException in MySql.Data.MySqlClient.NativeDriver.ExecuteCommand + /// + [Test] + public void ConnectionNotOpenThrowningBadException() + { + var c2 = new MySqlConnection(Connection.ConnectionString); + MySqlCommand command = new MySqlCommand(); + command.Connection = c2; + + MySqlCommand cmdCreateTable = new MySqlCommand("DROP TABLE IF EXISTS `test`.`contents_catalog`", c2); + cmdCreateTable.CommandType = CommandType.Text; + cmdCreateTable.CommandTimeout = 0; + Assert.Throws(() => cmdCreateTable.ExecuteNonQuery()); + } + + /// + /// Bug #35619 creating a MySql connection from toolbox generates an error + /// + [Test] + public void NullConnectionString() + { + MySqlConnection c = new MySqlConnection(); + c.ConnectionString = null; + } + + /// + /// Bug #53097 Connection.Ping() closes connection if executed on a connection with datareader + /// + [Test] + public void PingWhileReading() + { + using (MySqlConnection conn = new MySqlConnection(Connection.ConnectionString)) + { + conn.Open(); + MySqlCommand command = new MySqlCommand("SELECT 1", conn); + + using (MySqlDataReader reader = command.ExecuteReader()) + { + reader.Read(); + Assert.Throws(() => conn.Ping()); + } + } + } + +#if NET452 + /// + /// Test if keepalive parameters work. + /// + [Test] + public void Keepalive() + { + MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(Connection.ConnectionString); + connStr.Keepalive = 1; + using (MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true))) + { + c.Open(); + } + } +#endif + + #region Async + + [Test] + public async Task TransactionAsync() + { + ExecuteSQL("Create Table TranAsyncTest(key2 varchar(50), name varchar(50), name2 varchar(50))"); + ExecuteSQL("INSERT INTO TranAsyncTest VALUES('P', 'Test1', 'Test2')"); + + MySqlTransaction txn = await Connection.BeginTransactionAsync(); + MySqlConnection c = txn.Connection; + Assert.That(c, Is.EqualTo(Connection)); + MySqlCommand cmd = new MySqlCommand("SELECT name, name2 FROM TranAsyncTest WHERE key2='P'", Connection, txn); + MySqlTransaction t2 = cmd.Transaction; + Assert.That(t2, Is.EqualTo(txn)); + MySqlDataReader reader = null; + try + { + reader = cmd.ExecuteReader(); + reader.Close(); + txn.Commit(); + } + catch (Exception ex) + { + Assert.That(ex.Message != string.Empty, Is.False, ex.Message); + txn.Rollback(); + } + finally + { + if (reader != null) reader.Close(); + } + } + + [Test] + public async Task ChangeDataBaseAsync() + { + string dbName = CreateDatabase("db2"); + ExecuteSQL(String.Format( + "CREATE TABLE `{0}`.`footest` (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, `multi word` int, PRIMARY KEY(id))", dbName), true); + + await Connection.ChangeDatabaseAsync(dbName); + + var cmd = Connection.CreateCommand(); + cmd.CommandText = "SELECT COUNT(*) FROM footest"; + var count = cmd.ExecuteScalar(); + } + + [Test] + public async Task OpenAndCloseConnectionAsync() + { + var conn = new MySqlConnection(Connection.ConnectionString); + await conn.OpenAsync(); + Assert.That(conn.State == ConnectionState.Open); + await conn.CloseAsync(); + Assert.That(conn.State == ConnectionState.Closed); + } + + [Test] + public async Task ClearPoolAsync() + { + MySqlConnection c1 = new MySqlConnection(Connection.ConnectionString); + MySqlConnection c2 = new MySqlConnection(Connection.ConnectionString); + c1.Open(); + c2.Open(); + c1.Close(); + c2.Close(); + await c1.ClearPoolAsync(c1); + await c2.ClearPoolAsync(c1); + } + + [Test] + public async Task ClearAllPoolsAsync() + { + MySqlConnection c1 = new MySqlConnection(Connection.ConnectionString); + MySqlConnection c2 = new MySqlConnection(Connection.ConnectionString); + c1.Open(); + c2.Open(); + c1.Close(); + c2.Close(); + await c1.ClearAllPoolsAsync(); + await c2.ClearAllPoolsAsync(); + } + + [Test] + public async Task GetSchemaCollectionAsync() + { + var schemaColl = await Connection.GetSchemaCollectionAsync("MetaDataCollections", null); + Assert.That(schemaColl, Is.Not.Null); + } + + #endregion + + #region Connection Attributes/Options + + [Test] + [Property("Category", "Security")] + public void TestConnectingSocketBadUserName() + { + MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(Connection.ConnectionString); + connStr.UserID = "bad_one"; + MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true)); + Assert.Throws(() => c.Open()); + } + + [Test] + [Property("Category", "Security")] + public void TestConnectingSocketBadDbName() + { + MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(Connection.ConnectionString); + connStr.Password = "bad_pwd"; + MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true)); + Assert.Throws(() => c.Open()); + } + + [Test] + [Property("Category", "Security")] + public void TestPersistSecurityInfoCachingPasswords() + { + MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(Connection.ConnectionString); + + // Persist Security Info = true means that it should be returned + connStr.PersistSecurityInfo = true; + MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true)); + c.Open(); + c.Close(); + MySqlConnectionStringBuilder afterOpenSettings = new MySqlConnectionStringBuilder(c.ConnectionString); + Assert.That(afterOpenSettings.Password, Is.EqualTo(connStr.Password)); + + // Persist Security Info = false means that it should not be returned + connStr.PersistSecurityInfo = false; + c = new MySqlConnection(connStr.GetConnectionString(true)); + c.Open(); + c.Close(); + afterOpenSettings = new MySqlConnectionStringBuilder(c.ConnectionString); + Assert.That(String.IsNullOrEmpty(afterOpenSettings.Password)); + } + + /// + /// Bug #30502718 MYSQLCONNECTION.CLONE DISCLOSES CONNECTION PASSWORD + /// + [Test] + [Property("Bug", "30502718")] + public void CloneConnectionDisclosePassword() + { + // Verify original connection doesn't show password before and after open connection + MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(Connection.ConnectionString); + connStr.PersistSecurityInfo = false; + MySqlConnection c = new MySqlConnection(connStr.ConnectionString); + + // The password, is not returned as part of the connection if the connection is open or has ever been in an open state + Assert.That(c.ConnectionString, Does.Contain("password")); + + // After open password should not be displayed + c.Open(); + Assert.That(c.ConnectionString, Does.Not.Contain("password")); + + // Verify clone from open connection should not show password + var cloneConnection = (MySqlConnection)c.Clone(); + Assert.That(cloneConnection.ConnectionString, Does.Not.Contain("password")); + + // After close connection the password should not be displayed + c.Close(); + Assert.That(c.ConnectionString, Does.Not.Contain("password")); + + // Verify clone connection doesn't show password after open connection + cloneConnection.Open(); + Assert.That(cloneConnection.ConnectionString, Does.Not.Contain("password")); + + // Verify clone connection doesn't show password after close connection + cloneConnection.Close(); + Assert.That(cloneConnection.ConnectionString, Does.Not.Contain("password")); + + // Verify password for a clone of closed connection, password should appears + var closedConnection = new MySqlConnection(connStr.ConnectionString); + var cloneClosed = (MySqlConnection)closedConnection.Clone(); + Assert.That(cloneClosed.ConnectionString, Does.Contain("password")); + + // Open connection of a closed connection clone, password should be empty + Assert.That(cloneClosed.hasBeenOpen, Is.False); + cloneClosed.Open(); + Assert.That(cloneClosed.ConnectionString, Does.Not.Contain("password")); + Assert.That(cloneClosed.hasBeenOpen); + + // Close connection of a closed connection clone, password should be empty + cloneClosed.Close(); + Assert.That(cloneClosed.ConnectionString, Does.Not.Contain("password")); + + // Clone Password shloud be present if PersistSecurityInfo is true + connStr.PersistSecurityInfo = true; + c = new MySqlConnection(connStr.ConnectionString); + cloneConnection = (MySqlConnection)c.Clone(); + Assert.That(cloneConnection.ConnectionString, Does.Contain("password")); + } + + [Test] + [Property("Category", "Security")] + public void ConnectionTimeout() + { + MockServer mServer=new MockServer(false); + mServer.StartServer(); + + MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(Connection.ConnectionString); + connStr.Server = mServer.Address.ToString(); + connStr.Port = (uint)mServer.Port; + connStr.ConnectionTimeout = 5; + MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true)); + DateTime start = DateTime.Now; + var ex = Assert.Throws(() => c.Open()); + TimeSpan diff = DateTime.Now.Subtract(start); + Assert.That(diff.TotalSeconds < 8, $"Timeout exceeded: {diff.TotalSeconds}"); + + mServer.StopServer(); + mServer.DisposeListener(); + } + + [Test] + [Ignore("Fix for 8.0.5")] + [Property("Category", "Security")] + public void ConnectInVariousWays() + { + // connect with no db + MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(Connection.ConnectionString); + connStr.Database = null; + MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true)); + c.Open(); + c.Close(); + + ExecuteSQL("GRANT ALL ON *.* to 'nopass'@'%'", true); + ExecuteSQL($"GRANT ALL ON *.* to 'nopass'@'{Host}'", true); + ExecuteSQL("FLUSH PRIVILEGES", true); + + // connect with no password + connStr.UserID = "nopass"; + connStr.Password = null; + c = new MySqlConnection(connStr.GetConnectionString(true)); + c.Open(); + c.Close(); + + connStr.Password = ""; + c = new MySqlConnection(connStr.GetConnectionString(true)); + c.Open(); + c.Close(); + } + + /// + /// Bug #10281 Clone issue with MySqlConnection + /// Bug #27269 MySqlConnection.Clone does not mimic SqlConnection.Clone behaviour + /// + [Test] + [Property("Category", "Security")] + public void TestConnectionCloneRetainsPassword() + { + MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(Connection.ConnectionString); + connStr.PersistSecurityInfo = false; + + MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true)); + c.Open(); + c.Close(); + MySqlConnection clone = (MySqlConnection)c.Clone(); + clone.Open(); + clone.Close(); + } + + /// + /// Bug #13321 Persist security info does not woek + /// + [Test] + [Property("Category", "Security")] + public void PersistSecurityInfo() + { + MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(Connection.ConnectionString); + connStr.PersistSecurityInfo = false; + + Assert.That(String.IsNullOrEmpty(connStr.Password), Is.False); + MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true)); + c.Open(); + c.Close(); + connStr = new MySqlConnectionStringBuilder(c.ConnectionString); + Assert.That(String.IsNullOrEmpty(connStr.Password)); + } + + /// + /// Bug #31433 Username incorrectly cached for logon where case sensitive + /// + [Test] + [Property("Category", "Security")] + public void CaseSensitiveUserId() + { + MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(Connection.ConnectionString); + string original_uid = connStr.UserID; + connStr.UserID = connStr.UserID.ToUpper(); + MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true)); + Assert.Throws(() => c.Open()); + + connStr.UserID = original_uid; + c = new MySqlConnection(connStr.GetConnectionString(true)); + c.Open(); + c.Close(); + } + + [Test] + [Property("Category", "Security")] + public void CanOpenConnectionAfterAborting() + { + MySqlConnection connection = new MySqlConnection(Connection.ConnectionString); + connection.Open(); + Assert.That(connection.State, Is.EqualTo(ConnectionState.Open)); + + connection.AbortAsync(false).GetAwaiter().GetResult(); + Assert.That(connection.State, Is.EqualTo(ConnectionState.Closed)); + + connection.Open(); + Assert.That(connection.State, Is.EqualTo(ConnectionState.Open)); + + connection.Close(); + } + + /// + /// Test for Connect attributes feature used in MySql Server > 5.6.6 + /// (Stores client connection data on server) + /// + [Test] + [Property("Category", "Security")] + public void ConnectAttributes() + { + if (Version < new Version(5, 6, 6)) return; + if (!Connection.driver.SupportsConnectAttrs) return; + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM performance_schema.session_connect_attrs WHERE PROCESSLIST_ID = connection_id()", Connection); + MySqlDataReader dr = cmd.ExecuteReader(); + Assert.That(dr.HasRows, "No session_connect_attrs found"); + MySqlConnectAttrs connectAttrs = new MySqlConnectAttrs(); + bool isValidated = false; + using (dr) + { + while (dr.Read()) + { + if (dr.GetString(1).ToLowerInvariant().Contains("_client_name")) + { + Assert.That(dr.GetString(2), Is.EqualTo(connectAttrs.ClientName)); + isValidated = true; + break; + } + } + } + Assert.That(isValidated, "Missing _client_name attribute"); + } + + /// + /// Test for password expiration feature in MySql Server 5.6 or higher + /// + [Test] + [Property("Category", "Security")] + public void PasswordExpiration() + { + if ((Version < new Version(5, 6, 6)) || (Version >= new Version(8, 0, 17))) return; + + string expiredfull = string.Format("'{0}'@'{1}'", _EXPIRED_USER, Host); + + using (MySqlConnection conn = new MySqlConnection(Settings.ToString())) + { + MySqlCommand cmd = new MySqlCommand("", conn); + string expiredPwd = _EXPIRED_USER + "1"; + + // creates expired user + SetupExpiredPasswordUser(expiredPwd); + + // validates expired user + var cnstrBuilder = new MySqlConnectionStringBuilder(Root.ConnectionString); + cnstrBuilder.UserID = _EXPIRED_USER; + cnstrBuilder.Password = expiredPwd; + conn.ConnectionString = cnstrBuilder.ConnectionString; + conn.Open(); + + cmd.CommandText = "SELECT 1"; + MySqlException ex = Assert.Throws(() => cmd.ExecuteScalar()); + Assert.That(ex.Number, Is.EqualTo(1820)); + + if (Version >= new Version(5, 7, 6)) + cmd.CommandText = string.Format("SET PASSWORD = '{0}1'", _EXPIRED_USER); + else + cmd.CommandText = string.Format("SET PASSWORD = PASSWORD('{0}1')", _EXPIRED_USER); + + cmd.ExecuteNonQuery(); + cmd.CommandText = "SELECT 1"; + cmd.ExecuteScalar(); + conn.Close(); + conn.ConnectionString = Root.ConnectionString; + conn.Open(); + MySqlHelper.ExecuteNonQuery(conn, String.Format("DROP USER " + expiredfull)); + conn.Close(); + } + } + + [Test] + [Property("Category", "Security")] + public void TestNonSupportedOptions() + { + string connstr = Root.ConnectionString; + connstr += ";CertificateFile=client.pfx;CertificatePassword=pass;SSL Mode=Required;"; + using (MySqlConnection c = new MySqlConnection(connstr)) + { + c.Open(); + Assert.That(c.State, Is.EqualTo(ConnectionState.Open)); + } + } + + #endregion + + [Test] + public void IPv6Connection() + { + Assume.That(Version >= new Version(5, 6, 0)); + + MySqlConnectionStringBuilder sb = new MySqlConnectionStringBuilder(Connection.ConnectionString); + sb.Server = GetMySqlServerIp(true); + + Assume.That(sb.Server != string.Empty, "No IPv6 available."); + + using (MySqlConnection conn = new MySqlConnection(sb.ToString())) + { + conn.Open(); + Assert.That(conn.State, Is.EqualTo(ConnectionState.Open)); + } + } + + //[InlineData("SET NAMES 'latin1'")] + [TestCase("SELECT VERSION()")] + [TestCase("SHOW VARIABLES LIKE '%audit%'")] + [Property("Category", "Security")] + public void ExpiredPassword(string sql) + { + if (Version < new Version(8, 0, 18)) + return; + + MySqlConnectionStringBuilder sb = new MySqlConnectionStringBuilder(Settings.ConnectionString); + sb.UserID = _EXPIRED_USER; + sb.Password = _EXPIRED_USER + "1"; + SetupExpiredPasswordUser(sb.Password); + using (MySqlConnection conn = new MySqlConnection(sb.ConnectionString)) + { + conn.Open(); + Assert.That(conn.State, Is.EqualTo(ConnectionState.Open)); + MySqlCommand cmd = new MySqlCommand(sql, conn); + var ex = Assert.Throws(() => cmd.ExecuteNonQuery()); + Assert.That(ex.Number, Is.EqualTo(1820)); + } + } + + [Test] + [Property("Category", "Security")] + public void ExpiredPwdWithOldPassword() + { + if ((Version < new Version(5, 6, 6)) || (Version >= new Version(8, 0, 17))) return; + + string expiredUser = _EXPIRED_USER; + string expiredPwd = _EXPIRED_USER + 1; + string newPwd = "newPwd"; + string host = Settings.Server; + uint port = Settings.Port; + + SetupExpiredPasswordUser(expiredPwd); + + var sb = new MySqlConnectionStringBuilder(); + sb.Server = host; + sb.Port = port; + sb.UserID = expiredUser; + sb.Password = expiredPwd; + using (MySqlConnection conn = new MySqlConnection(sb.ConnectionString)) + { + conn.Open(); + string password = $"'{newPwd}'"; + if (Version < new Version(5, 7, 6)) + password = $"PASSWORD({password})"; + + MySqlCommand cmd = new MySqlCommand($"SET PASSWORD FOR '{expiredUser}'@'{host}' = {password}", conn); + cmd.ExecuteNonQuery(); + } + + sb.Password = newPwd; + using (MySqlConnection conn = new MySqlConnection(sb.ConnectionString)) + { + conn.Open(); + MySqlCommand cmd = new MySqlCommand("SELECT 8", conn); + Assert.That(cmd.ExecuteScalar().ToString(), Does.StartWith("8")); + } + + sb.Password = expiredPwd; + using (MySqlConnection conn = new MySqlConnection(sb.ConnectionString)) + { + Assert.Throws(() => { conn.Open(); }); + } + } + + /// + /// Bug#32853205 - UNABLE TO CONNECT USING NAMED PIPES AND SHARED MEMORY + /// To be able to connect using Named Pipes, it requires to start the server supporting the protocol + /// mysqld --standalone --console --enable-named-pipe + /// MySQL Server needs to be running as a Windows Service. + /// + [Test] + [Ignore("To be able to connect using Named Pipes, it requires to start the server supporting the protocol")] + public void ConnectUsingNamedPipes() + { + Assume.That(Platform.IsWindows(), "Named Pipes is only supported on Windows."); + + var sb = new MySqlConnectionStringBuilder() + { + Server = Host, + Pooling = false, + UserID = RootUser, + ConnectionProtocol = MySqlConnectionProtocol.NamedPipe, + SslMode = MySqlSslMode.Required + }; + + // Named Pipes connection protocol is not allowed to use SSL connections. + using var conn = new MySqlConnection(sb.ConnectionString); + var ex = Assert.Throws(() => conn.Open()); + Assert.That(ex.Message, Is.EqualTo(string.Format(Resources.SslNotAllowedForConnectionProtocol, sb.ConnectionProtocol)).IgnoreCase); + } + + /// + /// Bug#36208929 - Named pipe connection doesn't work in multithread environment + /// To be able to connect using Named Pipes, it requires to start the server supporting the protocol + /// mysqld --standalone --console --named-pipe=on + /// + [Test] + [Ignore("To be able to connect using Named Pipes, it requires to start the server supporting the protocol")] + public void NamedPipesMultithreadConnection() + { + Assume.That(Platform.IsWindows(), "Named Pipes is only supported on Windows."); + + var sb = new MySqlConnectionStringBuilder() + { + Server = Host, + UserID = RootUser, + ConnectionProtocol = MySqlConnectionProtocol.NamedPipe, + }; + + List threads = new List(); + for (int i = 0; i < 2; i++) + { + threads.Add(new Thread(() => + { + MySqlConnection connection = new MySqlConnection(sb.ConnectionString); + + Assert.DoesNotThrow(() => connection.Open()); + + for (int i = 0; i < 200; i++) + { + MySqlCommand cmd = connection.CreateCommand(); + cmd.CommandText = "Select CURRENT_USER();"; + cmd.CommandType = CommandType.Text; + Assert.DoesNotThrow(() => cmd.ExecuteNonQuery()); + } + })); + } + + foreach (Thread thread in threads) + { + thread.Start(); + } + + foreach (Thread thread in threads) + { + thread.Join(); + } + } + + /// + /// Bug#32853205 - UNABLE TO CONNECT USING NAMED PIPES AND SHARED MEMORY + /// + [Test] + [Property("Category", "Security")] + [Ignore("To be able to connect using Shared Memory, it requires to start the server supporting the protocol")] + public void ConnectUsingSharedMemory() + { + Assume.That(Platform.IsWindows(), "Shared Memory is only supported on Windows."); + + var sb = new MySqlConnectionStringBuilder() + { + Server = Host, + Pooling = false, + UserID = RootUser, + ConnectionProtocol = MySqlConnectionProtocol.SharedMemory, + SharedMemoryName = "MySQLSocket" + }; + + using (var conn = new MySqlConnection(sb.ConnectionString)) + { + conn.Open(); + Assert.That(conn.State, Is.EqualTo(ConnectionState.Open)); + } + + // Shared Memory connection protocol is not allowed to use SSL connections. + sb.SslMode = MySqlSslMode.Required; + using (var conn = new MySqlConnection(sb.ConnectionString)) + { + var ex = Assert.Throws(() => conn.Open()); + Assert.That(ex.Message, Is.EqualTo(string.Format(Resources.SslNotAllowedForConnectionProtocol, sb.ConnectionProtocol)).IgnoreCase); + } + } + + /// + /// Bug#36208932 - Shared memory connection doesn't work in multithread environment + /// To be able to connect using Shared Memory, it requires to start the server supporting the protocol + /// mysqld --standalone --console --shared-memory=on + /// + [Test] + [Ignore("To be able to connect using Shared Memory, it requires to start the server supporting the protocol")] + public void SharedMemoryMultithreadConnection() + { + Assume.That(Platform.IsWindows(), "Shared Memory is only supported on Windows."); + + var sb = new MySqlConnectionStringBuilder() + { + Server = Host, + UserID = RootUser, + ConnectionProtocol = MySqlConnectionProtocol.SharedMemory, + }; + + List threads = new List(); + for (int i = 0; i < 2; i++) + { + threads.Add(new Thread(() => + { + MySqlConnection connection = new MySqlConnection(sb.ConnectionString); + + Assert.DoesNotThrow(() => connection.Open()); + + for (int i = 0; i < 200; i++) + { + MySqlCommand cmd = connection.CreateCommand(); + cmd.CommandText = "Select CURRENT_USER();"; + cmd.CommandType = CommandType.Text; + Assert.DoesNotThrow(() => cmd.ExecuteNonQuery()); + } + })); + } + + foreach (Thread thread in threads) + { + thread.Start(); + } + + foreach (Thread thread in threads) + { + thread.Join(); + } + } + +#if NET452 + /// + /// Fix for aborted connections MySQL bug 80997 OraBug 23346197 + /// + [Test] + public void MarkConnectionAsClosedProperlyWhenDisposing() + { + MySqlConnection con = new MySqlConnection(Connection.ConnectionString); + con.Open(); + var cmd = new MySqlCommand("show global status like 'aborted_clients'", con); + MySqlDataReader r = cmd.ExecuteReader(); + r.Read(); + int numClientsAborted = r.GetInt32(1); + r.Close(); + + AppDomain appDomain = FullTrustSandbox.CreateFullTrustDomain(); + FullTrustSandbox sandbox = (FullTrustSandbox)appDomain.CreateInstanceAndUnwrap( + typeof(FullTrustSandbox).Assembly.FullName, + typeof(FullTrustSandbox).FullName); + try + { + MySqlConnection connection = sandbox.TryOpenConnection(Connection.ConnectionString); + Assert.NotNull(connection); + Assert.True(connection.State == ConnectionState.Open); + } + finally + { + AppDomain.Unload(appDomain); + } + + r = cmd.ExecuteReader(); + r.Read(); + int numClientsAborted2 = r.GetInt32(1); + r.Close(); + Assert.AreEqual(numClientsAborted, numClientsAborted); + con.Close(); + } +#endif + + /* + [Test] + public void AnonymousLogin() + { + suExecSQL(String.Format("GRANT ALL ON *.* to ''@'{0}' IDENTIFIED BY 'set_to_blank'", host)); + suExecSQL("UPDATE mysql.user SET password='' WHERE password='set_to_blank'"); + + MySqlConnection c = new MySqlConnection(String.Empty); + c.Open(); + c.Close(); + } + */ + + // /// + // /// Bug #30964 StateChange imperfection + // /// + // MySqlConnection rqConnection; + + + // [Test] + // public void RunningAQueryFromStateChangeHandler() + // { + // string connStr = st.GetConnectionString(true); + // using (rqConnection = new MySqlConnection(connStr)) + // { + // rqConnection.StateChange += new StateChangeEventHandler(RunningQueryStateChangeHandler); + // rqConnection.Open(); + // } + // } + + // void RunningQueryStateChangeHandler(object sender, StateChangeEventArgs e) + // { + // if (e.CurrentState == ConnectionState.Open) + // { + // MySqlCommand cmd = new MySqlCommand("SELECT 1", rqConnection); + // object o = cmd.ExecuteScalar(); + // Assert.AreEqual(1, Convert.ToInt32(o)); + // } + // } + + // [Test] + // public void CanOpenConnectionInMediumTrust() + // { + // AppDomain appDomain = PartialTrustSandbox.CreatePartialTrustDomain(); + + // PartialTrustSandbox sandbox = (PartialTrustSandbox)appDomain.CreateInstanceAndUnwrap( + // typeof(PartialTrustSandbox).Assembly.FullName, + // typeof(PartialTrustSandbox).FullName); + + // try + // { + // MySqlConnection connection = sandbox.TryOpenConnection(st.GetConnectionString(true)); + // Assert.True(null != connection); + + // Assert.True(connection.State == ConnectionState.Open); + // connection.Close(); + + // //Now try with logging enabled + // connection = sandbox.TryOpenConnection(st.GetConnectionString(true) + ";logging=true"); + // Assert.True(null != connection); + // Assert.True(connection.State == ConnectionState.Open); + // connection.Close(); + + // //Now try with Usage Advisor enabled + // connection = sandbox.TryOpenConnection(st.GetConnectionString(true) + ";Use Usage Advisor=true"); + // Assert.True(null != connection); + // Assert.True(connection.State == ConnectionState.Open); + // connection.Close(); + // } + // finally + // { + // AppDomain.Unload(appDomain); + // } + // } + + ///// + ///// Fix for bug http://bugs.mysql.com/bug.php?id=63942 (Connections not closed properly when using pooling) + ///// + //[Test] + //public void ReleasePooledConnectionsProperly() + //{ + // MySqlConnection con = new MySqlConnection(st.GetConnectionString(true)); + // MySqlCommand cmd = new MySqlCommand("show global status like 'aborted_clients'", con); + // con.Open(); + // MySqlDataReader r = cmd.ExecuteReader(); + // r.Read(); + // int numClientsAborted = r.GetInt32(1); + // r.Close(); + + // AppDomain appDomain = FullTrustSandbox.CreateFullTrustDomain(); + + + // FullTrustSandbox sandbox = (FullTrustSandbox)appDomain.CreateInstanceAndUnwrap( + // typeof(FullTrustSandbox).Assembly.FullName, + // typeof(FullTrustSandbox).FullName); + + // try + // { + // for (int i = 0; i < 200; i++) + // { + // MySqlConnection connection = sandbox.TryOpenConnection(st.GetPoolingConnectionString()); + // Assert.NotNull(connection); + // Assert.True(connection.State == ConnectionState.Open); + // connection.Close(); + // } + // } + // finally + // { + // AppDomain.Unload(appDomain); + // } + // r = cmd.ExecuteReader(); + // r.Read(); + // int numClientsAborted2 = r.GetInt32(1); + // r.Close(); + // Assert.AreEqual(numClientsAborted, numClientsAborted2); + // con.Close(); + //} + + class ConnectionClosedCheck + { + public bool closed = false; + public void stateChangeHandler(object sender, StateChangeEventArgs e) + { + if (e.CurrentState == ConnectionState.Closed) + closed = true; + } + } + + /// + /// Bug #33380176 Malformed communication packet while using MEDIUMTEXT + /// + [Test] + public void MediumTextMalformedPkg() + { + ExecuteSQL("SET GLOBAL max_allowed_packet=25165824"); + ExecuteSQL($"CREATE TABLE `{Settings.Database}`.`testmalformed` (caseref VARCHAR(12) NOT NULL, fieldId INT NOT NULL, " + + "fieldtext MEDIUMTEXT, PRIMARY KEY (caseref, fieldId))"); + + int rowMax = 40000; //Maximum allowed for prepared statement 21846 + var query = $"INSERT INTO `{Settings.Database}`.`testmalformed` (caseref, fieldId, fieldtext) VALUES {{0}} ON DUPLICATE KEY UPDATE caseref = caseref;"; + + List mySqlParameters = new(); + StringBuilder sb = new(); + string[] fieldValues = { + "0010EF7V002", + "1", + "Text, text, and more text." + }; + + for (int i = 0; i < rowMax; i++) + { + mySqlParameters.Add(new MySqlParameter(i + "caseref", fieldValues[0])); + mySqlParameters.Add(new MySqlParameter(i + "fieldid_1", int.Parse(fieldValues[1]) + i)); + mySqlParameters.Add(new MySqlParameter(i + "fieldtext_1", fieldValues[2])); + sb.AppendFormat("(@{0}caseref, @{0}fieldid_1, @{0}fieldtext_1), ", i); + } + + string fullQuery = string.Format(query, sb.ToString(0, sb.Length - 2)); + var res = MySqlHelper.ExecuteNonQuery(Connection.ConnectionString + ";ssl-mode=none", fullQuery, mySqlParameters.ToArray()); + Assert.That(40000, Is.EqualTo(res)); + + ExecuteSQL("SET GLOBAL max_allowed_packet=1024000"); + ExecuteSQL($"DROP TABLE `{Settings.Database}`.`testmalformed`;"); + } + + [Test, Description("Verify Compression in classic protocol where default connection string is used without any option")] + public void CompressionUnit() + { + Assume.That(Version >= new Version(8, 0, 0), "This test is for MySql 8.0 or higher."); + using (var dbConn = new MySqlConnection(Connection.ConnectionString + ";UseCompression=True")) + { + var cmd = new MySqlCommand(); + dbConn.Open(); + cmd.Connection = dbConn; + cmd.CommandText = "select * from performance_schema.session_status where variable_name like '%COMPRESSION%' order by 1"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + string[] compressionValues = new string[] { "Compression", "Compression_algorithm", "Compression_level" }; + int i = 0; + if (reader.HasRows) + { + while (reader.Read()) + { + if (i == 0) + { + Assert.That(reader.GetString(1), Is.EqualTo("ON")); + } + Assert.That(reader.GetString(1), Is.Not.Null); + i++; + } + } + } + + cmd.CommandText = "select @@protocol_compression_algorithms"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + string[] compressionValues = new string[] { "@@protocol_compression_algorithms" }; + int i = 0; + if (reader.HasRows) + { + while (reader.Read()) + { + Assert.That(reader.GetString(0), Is.Not.Null); + i++; + } + } + } + dbConn.Close(); + } + + using (var dbConn = new MySqlConnection(Connection.ConnectionString + ";UseCompression=False")) + { + dbConn.Open(); + var cmd = new MySqlCommand(); + cmd.Connection = dbConn; + cmd.CommandText = "select * from performance_schema.session_status where variable_name like '%COMPRESSION%' order by 1"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + string[] compressionValues = new string[] { "Compression", "Compression_algorithm", "Compression_level" }; + int i = 0; + if (reader.HasRows) + { + while (reader.Read()) + { + if (i == 0) + { + Assert.That(reader.GetString(1), Is.EqualTo("OFF")); + } + Assert.That(reader.GetString(1), Is.Not.Null); + i++; + } + } + } + + cmd.Connection = dbConn; + cmd.CommandText = "select @@protocol_compression_algorithms"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + string[] compressionValues = new string[] { "@@protocol_compression_algorithms" }; + int i = 0; + if (reader.HasRows) + { + while (reader.Read()) + { + Assert.That(reader.GetString(0), Is.Not.Null); + i++; + } + } + } + dbConn.Close(); + } + } + + [Test, Description("Verify Compression in classic protocol where default connection string is used without any option")] + public void CompressionValidationInClassicProtocol() + { + Assume.That(Version >= new Version(8, 0, 0), "This test is for MySql 8.0 or higher."); + string[] compressionAlgorithms = new string[] { "zlib", "zstd", "uncompressed", "uncompressed,zlib", "uncompressed,zstd", "zstd,zlib", "zstd,zlib,uncompressed" }; + for (int k = 0; k < compressionAlgorithms.Length; k++) + { + ExecuteSQL($"SET GLOBAL protocol_compression_algorithms = \"{compressionAlgorithms[k]}\""); + using (var dbConn = new MySqlConnection(Connection.ConnectionString + ";UseCompression=True")) + { + if (k == 1) + { + Assert.Throws(() => dbConn.Open()); + continue; + } + + dbConn.Open(); + Assert.That(dbConn.State, Is.EqualTo(ConnectionState.Open)); + MySqlCommand cmd = new MySqlCommand(); + cmd.Connection = dbConn; + cmd.CommandText = "select * from performance_schema.session_status where variable_name like 'COMPRESSION%' order by 1"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + int i = 0; + if (reader.HasRows) + { + while (reader.Read()) + { + if (i == 0) + { + if (k == 2 || k == 4) + { + // Compression should have been set to OFF as UseCompression is set to True in connection string but server is + // started with uncompressed and uncompressed/zstd + Assert.That(reader.GetString(1), Is.EqualTo("OFF")); + } + else + { + Assert.That(reader.GetString(1), Is.EqualTo("ON")); + } + } + Assert.That(reader.GetString(1), Is.Not.Null); + i++; + } + } + } + + cmd.CommandText = "select @@protocol_compression_algorithms"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + string[] compressionValues = new string[] { "@@protocol_compression_algorithms" }; + int i = 0; + if (reader.HasRows) + { + while (reader.Read()) + { + Assert.That(reader.GetString(0), Is.EqualTo(compressionAlgorithms[k])); + i++; + } + } + } + + dbConn.Close(); + using (MySqlConnection c = new MySqlConnection(dbConn.ConnectionString + ";max pool size = 1")) + { + c.Open(); + ParameterizedThreadStart pts = new ParameterizedThreadStart(PoolingWorker); + Thread t = new Thread(pts); + t.Start(c); + } + + using (MySqlConnection c2 = new MySqlConnection(dbConn.ConnectionString + ";max pool size = 1")) + { + c2.Open(); + KillConnection(c2, true); + } + } + + using (var dbConn = new MySqlConnection(Connection.ConnectionString + ";UseCompression=false")) + { + if (k == 0 || k == 1 || k == 5) + { + Assert.Throws(() => dbConn.Open()); + continue; + } + + dbConn.Open(); + Assert.That(dbConn.State, Is.EqualTo(ConnectionState.Open)); + MySqlCommand cmd = new MySqlCommand(); + cmd.Connection = dbConn; + cmd.CommandText = "select * from performance_schema.session_status where variable_name like 'COMPRESSION%' order by 1"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + int i = 0; + if (reader.HasRows) + { + while (reader.Read()) + { + if (i == 0) + { + Assert.That(reader.GetString(1), Is.EqualTo("OFF")); + } + Assert.That(reader.GetString(1), Is.Not.Null); + i++; + } + } + } + + cmd.CommandText = "select @@protocol_compression_algorithms"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + string[] compressionValues = new string[] { "@@protocol_compression_algorithms" }; + int i = 0; + if (reader.HasRows) + { + while (reader.Read()) + { + Assert.That(reader.GetString(0), Is.EqualTo(compressionAlgorithms[k])); + i++; + } + } + } + + dbConn.Close(); + using (MySqlConnection c = new MySqlConnection(dbConn.ConnectionString + ";max pool size = 1")) + { + c.Open(); + ParameterizedThreadStart pts = new ParameterizedThreadStart(PoolingWorker); + Thread t = new Thread(pts); + t.Start(c); + } + + using (MySqlConnection c2 = new MySqlConnection(dbConn.ConnectionString + ";max pool size = 1")) + { + c2.Open(); + KillConnection(c2); + } + } + } + ExecuteSQL($"SET GLOBAL protocol_compression_algorithms = \"zlib,zstd,uncompressed\""); + } + + [Test, Description("Test MySql Password Expiration with blank password")] + public void ExpiredBlankPassword() + { + Assume.That(Version >= new Version(8, 0, 0), "This test is for MySql 8.0 or higher."); + + string host = Host == "localhost" ? Host : "%"; + MySqlConnectionStringBuilder sb = new MySqlConnectionStringBuilder(Connection.ConnectionString); + sb.UserID = _EXPIRED_USER; + string[] pwds = new string[] { _EXPIRED_USER + "1", "" }; + + for (int i = 0; i < pwds.Length; i++) + { + //wrong password + sb.Password = "wrongpassword"; + using (MySqlConnection conn = new MySqlConnection(sb.ConnectionString)) + { + Assert.Throws(() => conn.Open()); + } + + sb.Password = pwds[i]; + SetupExpirePasswordExecuteQueriesFail("SELECT VERSION()", pwds[i]); + SetupExpirePasswordExecuteQueriesFail("SHOW VARIABLES LIKE '%audit%'", pwds[i]); + SetupExpirePasswordExecuteQueriesFail($"USE `{sb.Database}`", pwds[i]); + ExecuteQueriesFail("SELECT VERSION()", _EXPIRED_USER, pwds[i]); + ExecuteQueriesFail("SHOW VARIABLES LIKE '%audit%'", _EXPIRED_USER, pwds[i]); + ExecuteQueriesFail("select 1", _EXPIRED_USER, pwds[i]); + + //reactivate user + ExecuteSQL($"ALTER USER '{_EXPIRED_USER}'@'{host}' Identified BY '{sb.Password}'"); + ExecuteQueriesSuccess("SELECT VERSION()", sb.Password); + ExecuteQueriesSuccess("SHOW VARIABLES LIKE '%audit%'", sb.Password); + ExecuteQueriesSuccess("select 1", sb.Password); + } + } + + [Test, Description("Test MySql Password Expiration with query variables")] + public void ExpiredPasswordBug2() + { + Assume.That(Version >= new Version(8, 0, 0), "This test is for MySql 8.0 or higher."); + var _expiredPwd = "expiredPwd"; + SetupExpiredPasswordUser(_expiredPwd); + + var sb = new MySqlConnectionStringBuilder(Root.ConnectionString); + sb.UserID = _EXPIRED_USER; + sb.Password = _expiredPwd; + sb.AllowUserVariables = true; + using (MySqlConnection conn = new MySqlConnection(sb.ConnectionString)) + { + conn.Open(); + MySqlCommand cmd = new MySqlCommand("SHOW VARIABLES LIKE '%audit%'", conn); + Assert.Throws(() => cmd.ExecuteNonQuery()); + + cmd = new MySqlCommand("SELECT VERSION();", conn); + Assert.Throws(() => cmd.ExecuteNonQuery()); + + cmd = new MySqlCommand("select @data := 3, @data * 4;", conn); + Assert.Throws(() => cmd.ExecuteNonQuery()); + } + } + + [Test, Description("Test MySql Password Expiration with IsPasswordExpired validation")] + public void ExpiredPasswordBug3() + { + Assume.That(Version >= new Version(8, 0, 0), "This test is for MySql 8.0 or higher."); + string host = Host == "localhost" ? Host : "%"; + + var _expiredPwd = "expiredPwd"; + var _newPwd = "newPwd"; + var expiredFull = $"'{_EXPIRED_USER}'@'{host}'"; + var testStr = "show create user " + expiredFull; + + SetupExpiredPasswordUser(_expiredPwd); + + var sb = new MySqlConnectionStringBuilder(Settings.ConnectionString); + sb.UserID = _EXPIRED_USER; + sb.Password = _expiredPwd; + using (MySqlConnection conn = new MySqlConnection(sb.ConnectionString)) + { + conn.Open(); + Assert.That(conn.IsPasswordExpired); + } + + ExecuteSQL($"ALTER USER '{_EXPIRED_USER}'@'{host}' Identified BY '{_newPwd}'"); + + sb = new MySqlConnectionStringBuilder(Settings.ConnectionString); + sb.UserID = _EXPIRED_USER; + sb.Password = _newPwd; + using (MySqlConnection conn = new MySqlConnection(sb.ConnectionString)) + { + conn.Open(); + MySqlCommand cmd = new MySqlCommand("select version();", conn); + cmd.ExecuteNonQuery(); + + cmd = new MySqlCommand(testStr, conn); + using (var rdr = cmd.ExecuteReader()) + { + while (rdr.Read()) + Assert.That(rdr[0].ToString(), Is.Not.Null); + } + Assert.That(conn.IsPasswordExpired, Is.False); + } + } + + [Test, Description("Test MySql Password Expiration and set password")] + public void ExpiredPasswordBug4() + { + Assume.That(Version >= new Version(8, 0, 0), "This test is for MySql 8.0 or higher."); + string host = Host == "localhost" ? Host : "%"; + + var _expiredPwd = "expiredPwd"; + var _newPwd = "newPwd"; + var expiredFull = $"'{_EXPIRED_USER}'@'{host}'"; + var testStr = "show create user " + expiredFull; + SetupExpiredPasswordUser(_expiredPwd); + + var sb = new MySqlConnectionStringBuilder(Settings.ConnectionString); + sb.UserID = _EXPIRED_USER; + sb.Password = _expiredPwd; + using (MySqlConnection conn = new MySqlConnection(sb.ConnectionString)) + { + conn.Open(); + Assert.That(conn.IsPasswordExpired); + } + + ExecuteSQL($"set password for {expiredFull}='{_newPwd}'"); + + for (int i = 0; i < 50; i++) + { + sb = new MySqlConnectionStringBuilder(Settings.ConnectionString); + sb.UserID = _EXPIRED_USER; + sb.Password = _newPwd; + using (MySqlConnection conn = new MySqlConnection(sb.ConnectionString)) + { + conn.Open(); + MySqlCommand cmd = new MySqlCommand("select version();", conn); + cmd.ExecuteNonQuery(); + cmd = new MySqlCommand(testStr, conn); + using (var rdr = cmd.ExecuteReader()) + { + while (rdr.Read()) + Assert.That(rdr[0].ToString(), Is.Not.Null); + } + Assert.That(conn.IsPasswordExpired, Is.False); + } + + sb.UserID = _EXPIRED_USER; + sb.Password = _expiredPwd; + using (MySqlConnection conn = new MySqlConnection(sb.ConnectionString)) + { + Assert.Throws(() => conn.Open()); + } + } + } + + [Test, Description("Test connection paramter connection in classic")] + public void InvalidConnectTimeoutParameter() + { + var connStr = $"server={Settings.Server};user={Settings.UserID};port={Settings.Port};password={Settings.Password};connect-timeout=10000"; + Assert.Throws(() => new MySqlConnection(connStr)); + + connStr = $"server={Settings.Server};user={Settings.UserID};port={Settings.Port};password={Settings.Password};connectiontimeout=10000"; + using (var conn = new MySqlConnection(connStr)) + { + Assert.That(conn, Is.InstanceOf()); + } + } + + [Test, Description("MySQL Dispose verification without calling close")] + public void ConnectionDispose() + { + MySqlConnection conn = new MySqlConnection(Settings.ConnectionString); + conn.Open(); + Assert.That(conn.connectionState, Is.EqualTo(ConnectionState.Open)); + conn.Dispose(); + Assert.That(conn.connectionState, Is.EqualTo(ConnectionState.Closed)); + } + + [Test] + public void ConnectionPasswordException() + { + int code = 0; + var myConnectionString = $"server={Host};user={Settings.UserID};port={Port};password={Settings.Password}"; + using (var conn = new MySqlConnection(myConnectionString)) + { + conn.Open(); + Assert.That(conn.State, Is.EqualTo(ConnectionState.Open)); + } + + myConnectionString = $"server={Host};user={Settings.UserID};port={Port};password=wrong"; + using (var conn = new MySqlConnection(myConnectionString)) + { + var ex = Assert.Throws(() => conn.Open()); + code = ((MySqlException)ex.GetBaseException()).Number; + Assert.That(code, Is.EqualTo(1045)); + } + } + + /// + /// Bug #33781447 [CancellationToken doesn't cancel MySqlConnection.OpenAsync] + /// This is a regression from 8.0.27 introduced by the fix of Bug #28662512. + /// + [Test] + public void OpenAsyncNotCancellingOperation() + { + using var conn = new MySqlConnection(Connection.ConnectionString); + using var cts = new CancellationTokenSource(); + cts.Cancel(); + + Assert.ThrowsAsync(async () => await conn.OpenAsync(cts.Token)); + } + + + /// + /// Bug # 35307501 [Opening two MySqlConnections simultaneously can crash] + /// + [Test] + public void OpenMultipleConnectionsOnMultipleThreads() + { + var tasks = new List(); + for (int i = 0; i < 5; i++) + { + tasks.Add(Task.Run(() => + { + using (var connection = new MySqlConnection(Connection.ConnectionString)) + { + connection.Open(); + } + })); + } + Task.WaitAll(tasks.ToArray()); + } + + #if NET462 || NET48 + /// + /// Deadlock bug on application with Synchronization context (Net full framework Asp.NET app, Windows Forms App, WPF app. + /// Any App with - WindowsFormsSynchronizationContext, DispatcherSynchronizationContext and AspNetSynchronizationContext + /// will deadlock if missing ConfigureAwait(false) inside the MySql library. + /// + //[Test] + //public void OpenMultipleConnectionsOnMultipleThreadsInAppWithSynchronizationContext() + //{ + // var sb = new MySqlConnectionStringBuilder(Connection.ConnectionString); + // sb.Pooling = true; + + // var tasks = new List(); + // for (int i = 0; i < 5; i++) + // { + // tasks.Add(Task.Run(() => + // { + // SynchronizationContext.SetSynchronizationContext(new System.Windows.Forms.WindowsFormsSynchronizationContext()); + // using (var connection = new MySqlConnection(sb.ConnectionString)) + // { + // connection.Open(); + // } + // })); + // } + // Assert.IsTrue(Task.WaitAll(tasks.ToArray(),5000),"Deadlock when connecting - cancelled waiting after 5 seconds."); + //} + + //[Test] + //public void OpenAsyncMultipleConnectionsOnMultipleThreadsInAppWithSynchronizationContext() + //{ + // var sb = new MySqlConnectionStringBuilder(Connection.ConnectionString); + // sb.Pooling = true; + + // var tasks = new List(); + // for (int i = 0; i < 5; i++) + // { + // tasks.Add(Task.Run(() => + // { + // SynchronizationContext.SetSynchronizationContext(new System.Windows.Forms.WindowsFormsSynchronizationContext()); + // using (var connection = new MySqlConnection(sb.ConnectionString)) + // { + // connection.OpenAsync().ConfigureAwait(false).GetAwaiter().GetResult(); + // } + // })); + // } + // Assert.IsTrue(Task.WaitAll(tasks.ToArray(),5000),"Deadlock when connecting - cancelled waiting after 5 seconds."); + //} + #endif + + #region Methods + + private void ExecuteQueriesSuccess(string sql, string password) + { + if (Version < new Version(8, 0, 17)) return; + var sb = new MySqlConnectionStringBuilder(Connection.ConnectionString); + sb.UserID = _EXPIRED_USER; + sb.Password = password; + using (MySqlConnection conn = new MySqlConnection(sb.ConnectionString)) + { + conn.Open(); + Assert.That(conn.State, Is.EqualTo(ConnectionState.Open)); + MySqlCommand cmd = new MySqlCommand(sql, conn); + cmd.ExecuteNonQuery(); + } + } + + private void ExecuteQueriesFail(string sql, string user, string password) + { + if (Version < new Version(8, 0, 17)) return; + var sb = new MySqlConnectionStringBuilder(Connection.ConnectionString); + sb.UserID = user; + sb.Password = password; + using (MySqlConnection conn = new MySqlConnection(sb.ConnectionString)) + { + conn.Open(); + Assert.That(conn.State, Is.EqualTo(ConnectionState.Open)); + MySqlCommand cmd = new MySqlCommand(sql, conn); + Assert.Throws(() => cmd.ExecuteNonQuery()); + } + } + + private void SetupExpirePasswordExecuteQueriesFail(string sql, string password) + { + if (Version < new Version(8, 0, 17)) return; + var sb = new MySqlConnectionStringBuilder(Connection.ConnectionString); + sb.UserID = _EXPIRED_USER; + sb.Password = password; + SetupExpiredPasswordUser(password); + using (MySqlConnection conn = new MySqlConnection(sb.ConnectionString)) + { + conn.Open(); + Assert.That(conn.State, Is.EqualTo(ConnectionState.Open)); + MySqlCommand cmd = new MySqlCommand(sql, conn); + Assert.Throws(() => cmd.ExecuteNonQuery()); + } + } + + private void SetupExpiredPasswordUser(string password) + { + string host = Host == "localhost" ? Host : "%"; + string expiredFull = $"'{_EXPIRED_USER}'@'{host}'"; + + using (MySqlConnection conn = new MySqlConnection(Root.ConnectionString)) + { + conn.Open(); + MySqlCommand cmd = conn.CreateCommand(); + + // creates expired user + cmd.CommandText = $"SELECT COUNT(*) FROM mysql.user WHERE user='{_EXPIRED_USER}'"; + long count = (long)cmd.ExecuteScalar(); + + if (count > 0) + MySqlHelper.ExecuteNonQuery(conn, $"DROP USER {expiredFull}"); + + MySqlHelper.ExecuteNonQuery(conn, $"CREATE USER {expiredFull} IDENTIFIED BY '{password}'"); + MySqlHelper.ExecuteNonQuery(conn, $"GRANT ALL ON `{Settings.Database}`.* TO {expiredFull}"); + MySqlHelper.ExecuteNonQuery(conn, $"ALTER USER {expiredFull} PASSWORD EXPIRE"); + } + } + private void PoolingWorker(object cn) + { + MySqlConnection conn = (cn as MySqlConnection); + + Thread.Sleep(5000); + conn.Close(); + } + + #endregion + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/DataTypeTests.cs b/MySQL.Data/tests/MySql.Data.Tests/DataTypeTests.cs new file mode 100644 index 000000000..e3048f459 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/DataTypeTests.cs @@ -0,0 +1,1757 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Types; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Data; +using System.Text; + +namespace MySql.Data.MySqlClient.Tests +{ + public partial class DataTypeTests : TestBase + { + protected override void Cleanup() + { + ExecuteSQL(String.Format("DROP TABLE IF EXISTS `{0}`.Test", Connection.Database)); + ExecuteSQL(String.Format("DROP TABLE IF EXISTS `{0}`.datatypes", Connection.Database)); + } + + [Test] + public void BytesAndBooleans() + { + InternalBytesAndBooleans(false); + } + + [Test] + public void BytesAndBooleansPrepared() + { + InternalBytesAndBooleans(true); + } + + private void InternalBytesAndBooleans(bool prepare) + { + ExecuteSQL("CREATE TABLE Test (id TINYINT, idu TINYINT UNSIGNED, i INT UNSIGNED)"); + ExecuteSQL("INSERT INTO Test VALUES (-98, 140, 20)"); + ExecuteSQL("INSERT INTO Test VALUES (0, 0, 0)"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", Connection); + if (prepare) cmd.Prepare(); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.Throws(() => reader.GetByte(0)); + Assert.That(reader.GetByte(1), Is.EqualTo(140)); + Assert.That(reader.GetBoolean(1)); + Assert.That(Convert.ToInt32(reader.GetUInt32(2)), Is.EqualTo(20)); + Assert.That(reader.GetInt32(2), Is.EqualTo(20)); + + Assert.That(reader.Read()); + Assert.That(reader.GetByte(0), Is.EqualTo(0)); + Assert.That(reader.GetByte(1), Is.EqualTo(0)); + Assert.That(reader.GetBoolean(1), Is.False); + + Assert.That(reader.Read(), Is.False); + } + } + + /// + /// Bug#46205 - tinyint as boolean does not work for utf8 default database character set. + /// + /// + /// Original bug occured only with mysqld started with --default-character-set=utf8. + /// It does not seem possible to reproduce the original buggy behavior´otherwise + /// Neither "set global character_set_server = utf8" , nor "create table /database with character set " + /// were sufficient. + /// + [Test] + public void TreatTinyAsBool() + { + ExecuteSQL("CREATE TABLE Test2(i TINYINT(1))"); + ExecuteSQL("INSERT INTO Test2 VALUES(1)"); + ExecuteSQL("INSERT INTO Test2 VALUES(0)"); + ExecuteSQL("INSERT INTO Test2 VALUES(2)"); + MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder(Connection.ConnectionString); + Assert.That(builder.TreatTinyAsBoolean); + + MySqlCommand cmd = new MySqlCommand("SELECT * from Test2", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + bool b; + Assert.That(reader.Read()); + b = (bool)reader.GetValue(0); + Assert.That(b); + Assert.That(reader.Read()); + b = (bool)reader.GetValue(0); + Assert.That(b, Is.False); + Assert.That(reader.Read()); + b = (bool)reader.GetValue(0); + Assert.That(b); + } + } + + [Test] + public void TestFloat() + { + InternalTestFloats(false); + } + + [Test] + public void TestFloatPrepared() + { + InternalTestFloats(true); + } + + private void InternalTestFloats(bool prepared) + { + ExecuteSQL("CREATE TABLE Test (fl FLOAT, db DOUBLE, dec1 DECIMAL(5,2))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?fl, ?db, ?dec)", Connection); + cmd.Parameters.Add("?fl", MySqlDbType.Float); + cmd.Parameters.Add("?db", MySqlDbType.Double); + cmd.Parameters.Add("?dec", MySqlDbType.Decimal); + cmd.Parameters[0].Value = 2.3; + cmd.Parameters[1].Value = 4.6; + cmd.Parameters[2].Value = 23.82; + if (prepared) + cmd.Prepare(); + int count = cmd.ExecuteNonQuery(); + Assert.That(count, Is.EqualTo(1)); + + cmd.Parameters[0].Value = 1.5; + cmd.Parameters[1].Value = 47.85; + cmd.Parameters[2].Value = 123.85; + count = cmd.ExecuteNonQuery(); + Assert.That(count, Is.EqualTo(1)); + + cmd.CommandText = "SELECT * FROM Test"; + if (prepared) + cmd.Prepare(); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That((decimal)2.3 == (decimal)reader.GetFloat(0)); + Assert.That(reader.GetDouble(1), Is.EqualTo(4.6)); + Assert.That((decimal)23.82 == reader.GetDecimal(2)); + + Assert.That(reader.Read()); + Assert.That((decimal)1.5 == (decimal)reader.GetFloat(0)); + Assert.That(reader.GetDouble(1), Is.EqualTo(47.85)); + Assert.That((decimal)123.85 == reader.GetDecimal(2)); + } + } + + [Test] + public void TestTime() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), d DATE, dt DATETIME, tm TIME, PRIMARY KEY(id))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id, tm) VALUES (1, '00:00')", Connection); + cmd.ExecuteNonQuery(); + cmd.CommandText = "INSERT INTO Test (id, tm) VALUES (2, '512:45:17')"; + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM Test"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + + object value = reader["tm"]; + Assert.That(value.GetType(), Is.EqualTo(typeof(TimeSpan))); + TimeSpan ts = (TimeSpan)reader["tm"]; + Assert.That(ts.Hours, Is.EqualTo(0)); + Assert.That(ts.Minutes, Is.EqualTo(0)); + Assert.That(ts.Seconds, Is.EqualTo(0)); + + reader.Read(); + value = reader["tm"]; + Assert.That(value.GetType(), Is.EqualTo(typeof(TimeSpan))); + ts = (TimeSpan)reader["tm"]; + Assert.That(ts.Days, Is.EqualTo(21)); + Assert.That(ts.Hours, Is.EqualTo(8)); + Assert.That(ts.Minutes, Is.EqualTo(45)); + Assert.That(ts.Seconds, Is.EqualTo(17)); + } + } + + [Test] + public void YearType() + { + ExecuteSQL("CREATE TABLE Test (yr YEAR)"); + ExecuteSQL("INSERT INTO Test VALUES (98)"); + ExecuteSQL("INSERT INTO Test VALUES (1990)"); + ExecuteSQL("INSERT INTO Test VALUES (2004)"); + ExecuteSQL("SET SQL_MODE=''"); + ExecuteSQL("INSERT INTO Test VALUES (111111111111111111111)"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(1998 == reader.GetUInt32(0)); + reader.Read(); + Assert.That(1990 == reader.GetUInt32(0)); + reader.Read(); + Assert.That(2004 == reader.GetUInt32(0)); + reader.Read(); + Assert.That(0 == reader.GetUInt32(0)); + } + } + + [Test] + public void TypeCoercion() + { + MySqlParameter p = new MySqlParameter("?test", 1); + Assert.That(p.DbType, Is.EqualTo(DbType.Int32)); + Assert.That(p.MySqlDbType, Is.EqualTo(MySqlDbType.Int32)); + + p.DbType = DbType.Int64; + Assert.That(p.DbType, Is.EqualTo(DbType.Int64)); + Assert.That(p.MySqlDbType, Is.EqualTo(MySqlDbType.Int64)); + + p.MySqlDbType = MySqlDbType.Int16; + Assert.That(p.DbType, Is.EqualTo(DbType.Int16)); + Assert.That(p.MySqlDbType, Is.EqualTo(MySqlDbType.Int16)); + } + + [Test] + public void AggregateTypesTest() + { + ExecuteSQL("CREATE TABLE foo (abigint bigint, aint int)"); + ExecuteSQL("INSERT INTO foo VALUES (1, 2)"); + ExecuteSQL("INSERT INTO foo VALUES (2, 3)"); + ExecuteSQL("INSERT INTO foo VALUES (3, 4)"); + ExecuteSQL("INSERT INTO foo VALUES (3, 5)"); + + // Try a normal query + string NORMAL_QRY = "SELECT abigint, aint FROM foo WHERE abigint = {0}"; + string qry = String.Format(NORMAL_QRY, 3); + MySqlCommand cmd = new MySqlCommand(qry, Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + reader.GetInt64(0); + reader.GetInt32(1); // <--- aint... this succeeds + } + } + + cmd.CommandText = "SELECT abigint, max(aint) FROM foo GROUP BY abigint"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + reader.GetInt64(0); + reader.GetInt64(1); // <--- max(aint)... this fails + } + } + } + + [Test] + public void BitAndDecimal() + { + ExecuteSQL("CREATE TABLE Test (bt1 BIT(2), bt4 BIT(4), bt11 BIT(11), bt23 BIT(23), bt32 BIT(32)) engine=myisam"); + ExecuteSQL("INSERT INTO Test VALUES (2, 3, 120, 240, 1000)"); + ExecuteSQL("INSERT INTO Test VALUES (NULL, NULL, 100, NULL, NULL)"); + + string connStr = Connection.ConnectionString + ";treat tiny as boolean=false"; + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", c); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetInt32(0), Is.EqualTo(2)); + Assert.That(reader.GetInt32(1), Is.EqualTo(3)); + Assert.That(reader.GetInt32(2), Is.EqualTo(120)); + Assert.That(reader.GetInt32(3), Is.EqualTo(240)); + Assert.That(reader.GetInt32(4), Is.EqualTo(1000)); + Assert.That(reader.Read()); + Assert.That(reader.IsDBNull(0)); + Assert.That(reader.IsDBNull(1)); + Assert.That(reader.GetInt32(2), Is.EqualTo(100)); + Assert.That(reader.IsDBNull(3)); + Assert.That(reader.IsDBNull(4)); + } + } + } + + [Test] + public void DecimalTests() + { + ExecuteSQL("CREATE TABLE Test (val decimal(10,1))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(?dec)", Connection); + cmd.Parameters.AddWithValue("?dec", (decimal)2.4); + Assert.That(cmd.ExecuteNonQuery(), Is.EqualTo(1)); + + cmd.Prepare(); + Assert.That(cmd.ExecuteNonQuery(), Is.EqualTo(1)); + + cmd.CommandText = "SELECT * FROM Test"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader[0] is Decimal); + Assert.That(Convert.ToDecimal(reader[0]), Is.EqualTo((decimal)2.4)); + + Assert.That(reader.Read()); + Assert.That(reader[0] is Decimal); + Assert.That(Convert.ToDecimal(reader[0]), Is.EqualTo((decimal)2.4)); + + Assert.That(reader.Read(), Is.False); + Assert.That(reader.NextResult(), Is.False); + } + } + + [Test] + public void DecimalTests2() + { + ExecuteSQL("CREATE TABLE Test (val decimal(10,1))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(?dec)", Connection); + cmd.Parameters.AddWithValue("?dec", (decimal)2.4); + Assert.That(cmd.ExecuteNonQuery(), Is.EqualTo(1)); + + cmd.Prepare(); + Assert.That(cmd.ExecuteNonQuery(), Is.EqualTo(1)); + + cmd.CommandText = "SELECT * FROM Test"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader[0] is Decimal); + Assert.That(Convert.ToDecimal(reader[0]), Is.EqualTo((decimal)2.4)); + + Assert.That(reader.Read()); + Assert.That(reader[0] is Decimal); + Assert.That(Convert.ToDecimal(reader[0]), Is.EqualTo((decimal)2.4)); + + Assert.That(reader.Read(), Is.False); + Assert.That(reader.NextResult(), Is.False); + } + } + + [Test] + public void Bit() + { + ExecuteSQL("CREATE TABLE Test (bit1 BIT, bit2 BIT(5), bit3 BIT(10))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?b1, ?b2, ?b3)", Connection); + cmd.Parameters.Add(new MySqlParameter("?b1", MySqlDbType.Bit)); + cmd.Parameters.Add(new MySqlParameter("?b2", MySqlDbType.Bit)); + cmd.Parameters.Add(new MySqlParameter("?b3", MySqlDbType.Bit)); + cmd.Prepare(); + cmd.Parameters[0].Value = 1; + cmd.Parameters[1].Value = 2; + cmd.Parameters[2].Value = 3; + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM Test"; + cmd.Prepare(); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(Convert.ToInt32(reader[0]), Is.EqualTo(1)); + Assert.That(Convert.ToInt32(reader[1]), Is.EqualTo(2)); + Assert.That(Convert.ToInt32(reader[2]), Is.EqualTo(3)); + } + } + + /// + /// Bug #29959095 incorrect integer value using prepared statement with MySqlDbType.INT24 + /// + [TestCase(true, 1234567)] + [TestCase(false, 1234567)] + [TestCase(true, -1)] + public void UsingInt24InPreparedStatement(bool prepare, int value) + { + ExecuteSQL("CREATE TABLE Test(data MEDIUMINT)"); + using (var command = new MySqlCommand(@"INSERT INTO Test(data) VALUES(@data);", Connection)) + { + command.Parameters.AddWithValue("@data", value).MySqlDbType = MySqlDbType.Int24; + if (prepare) command.Prepare(); + var rowsAffected = command.ExecuteNonQuery(); + Assert.That(rowsAffected, Is.EqualTo(1)); + command.CommandText = "SELECT data FROM Test"; + var data = command.ExecuteScalar(); + Assert.That(data, Is.EqualTo(value)); + } + } + + [TestCase(true)] + [TestCase(false)] + public void OverflowInt24InPreparedStatement(bool prepare) + { + void insertInt24() + { + ExecuteSQL("CREATE TABLE Test(data MEDIUMINT)"); + using (var command = new MySqlCommand(@"INSERT INTO Test(data) VALUES(@data);", Connection)) + { + command.Parameters.AddWithValue("@data", 12345678910).MySqlDbType = MySqlDbType.Int24; + if (prepare) command.Prepare(); + command.ExecuteNonQuery(); + } + } + Assert.Catch(insertInt24); + } + + /// + /// Bug #25912 selecting negative time values gets wrong results + /// + [Test] + public void TestNegativeTime() + { + ExecuteSQL("CREATE TABLE Test (t time)"); + ExecuteSQL("INSERT INTO Test SET T='-07:24:00'"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", Connection); + using (var reader = cmd.ExecuteReader()) + { + reader.Read(); + TimeSpan ts = reader.GetTimeSpan("t"); + Assert.That(ts.Hours, Is.EqualTo(-7)); + Assert.That(ts.Minutes, Is.EqualTo(-24)); + Assert.That(ts.Seconds, Is.EqualTo(0)); + } + } + + /// + /// Bug #25605 BINARY and VARBINARY is returned as a string + /// + [Test] + public void BinaryAndVarBinary() + { + MySqlCommand cmd = new MySqlCommand("SELECT BINARY 'something' AS BinaryData", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + byte[] buffer = new byte[2]; + long read = reader.GetBytes(0, 0, buffer, 0, 2); + Assert.That((char)buffer[0], Is.EqualTo('s')); + Assert.That((char)buffer[1], Is.EqualTo('o')); + Assert.That(read, Is.EqualTo(2)); + + } + } + + [Test] + public void NumericAsBinary() + { + MySqlCommand cmd = new MySqlCommand("SELECT IFNULL(NULL,0) AS MyServerID", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetDataTypeName(0), Is.EqualTo("BIGINT")); + Assert.That(reader.GetFieldType(0), Is.EqualTo(typeof(Int64))); + Assert.That(reader.GetValue(0).GetType().FullName, Is.EqualTo("System.Int64")); + Assert.That(Convert.ToInt32(reader.GetValue(0)), Is.EqualTo(0)); + } + } + + [Test] + public void BinaryTypes() + { + ExecuteSQL(@"CREATE TABLE Test (c1 VARCHAR(20), c2 VARBINARY(20), + c3 TEXT, c4 BLOB, c5 VARCHAR(20) CHARACTER SET BINARY)"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", Connection); + using (var reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetFieldType("c1"), Is.EqualTo(typeof(String))); + Assert.That(reader.GetFieldType("c2"), Is.EqualTo(typeof(byte[]))); + Assert.That(reader.GetFieldType("c3"), Is.EqualTo(typeof(String))); + Assert.That(reader.GetFieldType("c4"), Is.EqualTo(typeof(byte[]))); + Assert.That(reader.GetFieldType("c5"), Is.EqualTo(typeof(byte[]))); + } + } + + [Test] + public void ShowColumns() + { + MySqlCommand cmd = new MySqlCommand( + @"SELECT TRIM(TRAILING ' unsigned' FROM + TRIM(TRAILING ' zerofill' FROM COLUMN_TYPE)) AS MYSQL_TYPE, + IF(COLUMN_DEFAULT IS NULL, NULL, + IF(ASCII(COLUMN_DEFAULT) = 1 OR COLUMN_DEFAULT = '1', 1, 0)) + AS TRUE_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS + WHERE TABLE_SCHEMA='Test' AND TABLE_NAME='Test'", Connection); + using (var reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetFieldType(0), Is.EqualTo(typeof(string))); + Assert.That(reader.GetFieldType(1), Is.EqualTo(typeof(Int64))); + } + } + + [Test] + public void RespectBinaryFlag() + { + ExecuteSQL("CREATE TABLE Test (col1 VARBINARY(20), col2 BLOB)"); + + string connStr = Connection.ConnectionString + ";respect binary flags=false"; + + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", c); + using (var reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetFieldType(0), Is.EqualTo(typeof(string))); + Assert.That(reader.GetFieldType(1), Is.EqualTo(typeof(System.Byte[]))); + } + } + } + + /// + /// Bug #27959 Bool datatype is not returned as System.Boolean by MySqlDataAdapter + /// + [Test] + public void Boolean() + { + ExecuteSQL("CREATE TABLE Test (id INT, `on` BOOLEAN, v TINYINT(2))"); + ExecuteSQL("INSERT INTO Test VALUES (1,1,1), (2,0,0)"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", Connection); + using (var reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetFieldType(1), Is.EqualTo(typeof(Boolean))); + Assert.That(reader.GetFieldType(2), Is.EqualTo(typeof(SByte))); + Assert.That(reader.GetBoolean(1)); + Assert.That(Convert.ToInt32(reader.GetValue(2)), Is.EqualTo(1)); + + reader.Read(); + Assert.That(reader.GetBoolean(1), Is.False); + Assert.That(Convert.ToInt32(reader.GetValue(2)), Is.EqualTo(0)); + } + } + + [Test] + public void Binary16AsGuid() + { + ExecuteSQL("CREATE TABLE Test (id INT, g BINARY(16), c VARBINARY(16), c1 BINARY(255))"); + + string connStr = Connection.ConnectionString + ";old guids=true"; + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + Guid g = Guid.NewGuid(); + byte[] bytes = g.ToByteArray(); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (1, @g, @c, @c1)", c); + cmd.Parameters.AddWithValue("@g", bytes); + cmd.Parameters.AddWithValue("@c", bytes); + cmd.Parameters.AddWithValue("@c1", g.ToString()); + cmd.ExecuteNonQuery(); + + MySqlCommand cmd2 = new MySqlCommand("SELECT * FROM Test", c); + using (var reader = cmd2.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetFieldType(1), Is.EqualTo(typeof(Guid))); + Assert.That(reader.GetFieldType(2), Is.EqualTo(typeof(byte[]))); + Assert.That(reader.GetFieldType(3), Is.EqualTo(typeof(byte[]))); + Assert.That(reader.GetGuid(1), Is.EqualTo(g)); + } + + string s = BitConverter.ToString(bytes); + + s = s.Replace("-", ""); + string sql = String.Format("TRUNCATE TABLE Test;INSERT INTO Test VALUES(1,0x{0},NULL,NULL)", s); + ExecuteSQL(sql); + + cmd.CommandText = "SELECT * FROM Test"; + cmd.Parameters.Clear(); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Guid g1 = reader.GetGuid(1); + Assert.That(g1, Is.EqualTo(g)); + } + } + } + + /// + /// Bug #35041 'Binary(16) as GUID' - columns lose IsGuid value after a NULL value found + /// + [Test] + public void Binary16AsGuidWithNull() + { + ExecuteSQL(@"CREATE TABLE Test (id int(10) NOT NULL AUTO_INCREMENT, + AGUID binary(16), PRIMARY KEY (id))"); + Guid g = new Guid(); + byte[] guid = g.ToByteArray(); + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (NULL, @g)", Connection); + cmd.Parameters.AddWithValue("@g", guid); + cmd.ExecuteNonQuery(); + ExecuteSQL("insert into Test (AGUID) values (NULL)"); + cmd.ExecuteNonQuery(); + } + + /// + /// Bug #36313 BIT result is lost in the left outer join + /// + [Test] + public void BitInLeftOuterJoin() + { + ExecuteSQL(@"CREATE TABLE Main (Id int(10) unsigned NOT NULL AUTO_INCREMENT, + Descr varchar(45) NOT NULL, PRIMARY KEY (`Id`)) + ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1"); + ExecuteSQL(@"INSERT INTO Main (Id,Descr) VALUES (1,'AAA'), (2,'BBB'), (3, 'CCC')"); + + ExecuteSQL(@"CREATE TABLE Child (Id int(10) unsigned NOT NULL AUTO_INCREMENT, + MainId int(10) unsigned NOT NULL, Value int(10) unsigned NOT NULL, + Enabled bit(1) NOT NULL, PRIMARY KEY (`Id`)) + ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1"); + ExecuteSQL(@"INSERT INTO Child (Id, MainId, Value, Enabled) VALUES (1,2,12345,0x01)"); + + MySqlCommand cmd = new MySqlCommand( + @"SELECT m.Descr, c.Value, c.Enabled FROM Main m + LEFT OUTER JOIN Child c ON m.Id=c.MainId ORDER BY m.Descr", Connection); + using (var reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetString(0), Is.EqualTo("AAA")); + Assert.That(reader.IsDBNull(1)); + Assert.That(reader.IsDBNull(2)); + + Assert.That(reader.Read()); + Assert.That(reader.GetString(0), Is.EqualTo("BBB")); + Assert.That(Convert.ToInt32(reader.GetValue(1)), Is.EqualTo(12345)); + Assert.That(Convert.ToInt32(reader.GetValue(2)), Is.EqualTo(1)); + + Assert.That(reader.Read()); + Assert.That(reader.GetString(0), Is.EqualTo("CCC")); + Assert.That(reader.IsDBNull(1)); + Assert.That(reader.IsDBNull(2)); + + Assert.That(reader.Read(), Is.False); + } + } + + /// + /// Bug #36081 Get Unknown Datatype in C# .Net + /// + [Test] + public void GeometryType() + { + ExecuteSQL(@"CREATE TABLE Test (ID int(11) NOT NULL, ogc_geom geometry NOT NULL, + PRIMARY KEY (`ID`))"); + + if (Connection.driver.Version.isAtLeast(8, 0, 1)) + ExecuteSQL(@"INSERT INTO Test VALUES (1, + ST_GeomFromText('GeometryCollection(Point(1 1), LineString(2 2, 3 3))'))"); + else + ExecuteSQL(@"INSERT INTO Test VALUES (1, + GeomFromText('GeometryCollection(Point(1 1), LineString(2 2, 3 3))'))"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + } + } + + #region MySqlGeometry Tests + + [Test] + public void CanParseGeometryValueString() + { + var v = MySqlGeometry.Parse("POINT (47.37 -122.21)"); + Assert.That(v.ToString(), Is.EqualTo("POINT(47.37 -122.21)")); + } + + [Test] + public void CanTryParseGeometryValueString() + { + MySqlGeometry v = new MySqlGeometry(0, 0); + MySqlGeometry.TryParse("POINT (47.37 -122.21)", out v); + Assert.That(v.ToString(), Is.EqualTo("POINT(47.37 -122.21)")); + } + + [Test] + public void CanTryParseGeometryValueStringWithSRIDValue() + { + var mysqlGeometryResult = new MySqlGeometry(0, 0); + MySqlGeometry.TryParse("SRID=101;POINT (47.37 -122.21)", out mysqlGeometryResult); + Assert.That(mysqlGeometryResult.ToString(), Is.EqualTo("SRID=101;POINT(47.37 -122.21)")); + } + + [Test] + public void StoringAndRetrievingGeometry() + { + ExecuteSQL("CREATE TABLE Test (v Geometry NOT NULL)"); + + MySqlCommand cmd = new MySqlCommand(Connection.driver.Version.isAtLeast(8, 0, 1) ? + "INSERT INTO Test VALUES (ST_GeomFromText(?v))" : + "INSERT INTO Test VALUES (GeomFromText(?v))" + , Connection); + cmd.Parameters.Add("?v", MySqlDbType.String); + cmd.Parameters[0].Value = "POINT(47.37 -122.21)"; + cmd.ExecuteNonQuery(); + + cmd.CommandText = Connection.driver.Version.isAtLeast(8, 0, 1) ? + "SELECT ST_AsText(v) FROM Test" : + "SELECT AsText(v) FROM Test"; + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + var val = reader.GetValue(0); + } + } + + [Test] + public void CanFetchGeometryAsBinary() + { + ExecuteSQL("CREATE TABLE Test (v Geometry NOT NULL)"); + + MySqlGeometry v = new MySqlGeometry(47.37, -122.21); + + var par = new MySqlParameter("?v", MySqlDbType.Geometry); + par.Value = v; + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?v)", Connection); + cmd.Parameters.Add(par); + cmd.ExecuteNonQuery(); + + cmd.CommandText = Connection.driver.Version.isAtLeast(8, 0, 1) ? + "SELECT ST_AsBinary(v) FROM Test" : + "SELECT AsBinary(v) FROM Test"; + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + var val = reader.GetValue(0) as Byte[]; + var MyGeometry = new MySqlGeometry(MySqlDbType.Geometry, val); + Assert.That(MyGeometry.ToString(), Is.EqualTo("POINT(47.37 -122.21)")); + } + } + + [Test] + public void CanSaveSridValueOnGeometry() + { + ExecuteSQL("CREATE TABLE Test (v Geometry NOT NULL)"); + + MySqlGeometry v = new MySqlGeometry(47.37, -122.21, 101); + var par = new MySqlParameter("?v", MySqlDbType.Geometry); + par.Value = v; + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?v)", Connection); + cmd.Parameters.Add(par); + cmd.ExecuteNonQuery(); + + cmd.CommandText = Connection.driver.Version.isAtLeast(8, 0, 1) ? + "SELECT ST_SRID(v) FROM Test" : + "SELECT SRID(v) FROM Test"; + + using var reader = cmd.ExecuteReader(); + reader.Read(); + var val = reader.GetInt32(0); + Assert.That(val, Is.EqualTo(101)); + } + + [Test] + public void CanFetchGeometryAsText() + { + ExecuteSQL("CREATE TABLE Test (v Geometry NOT NULL)"); + + MySqlGeometry v = new MySqlGeometry(47.37, -122.21); + var par = new MySqlParameter("?v", MySqlDbType.Geometry); + par.Value = v; + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?v)", Connection); + cmd.Parameters.Add(par); + cmd.ExecuteNonQuery(); + + cmd.CommandText = Connection.driver.Version.isAtLeast(8, 0, 1) ? + "SELECT ST_AsText(v) FROM Test" : + "SELECT AsText(v) FROM Test"; + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + var val = reader.GetString(0); + Assert.That(val, Is.EqualTo("POINT(47.37 -122.21)")); + } + } + + [Test] + public void CanUseReaderGetMySqlGeometry() + { + ExecuteSQL("CREATE TABLE Test (v Geometry NOT NULL)"); + + MySqlGeometry v = new MySqlGeometry(47.37, -122.21); + var par = new MySqlParameter("?v", MySqlDbType.Geometry); + par.Value = v; + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?v)", Connection); + cmd.Parameters.Add(par); + cmd.ExecuteNonQuery(); + + // reading as binary + cmd.CommandText = Connection.driver.Version.isAtLeast(8, 0, 1) ? + "SELECT ST_AsBinary(v) as v FROM Test" : + "SELECT AsBinary(v) as v FROM Test"; + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + var val = reader.GetMySqlGeometry(0); + var valWithName = reader.GetMySqlGeometry("v"); + Assert.That(val.ToString(), Is.EqualTo("POINT(47.37 -122.21)")); + Assert.That(valWithName.ToString(), Is.EqualTo("POINT(47.37 -122.21)")); + } + + // reading as geometry + cmd.CommandText = "SELECT v as v FROM Test"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + var val = reader.GetMySqlGeometry(0); + var valWithName = reader.GetMySqlGeometry("v"); + Assert.That(val.ToString(), Is.EqualTo("POINT(47.37 -122.21)")); + Assert.That(valWithName.ToString(), Is.EqualTo("POINT(47.37 -122.21)")); + } + + } + + [Test] + public void CanGetToStringFromMySqlGeometry() + { + MySqlGeometry v = new MySqlGeometry(47.37, -122.21); + var valToString = v.ToString(); + Assert.That(valToString, Is.EqualTo("POINT(47.37 -122.21)")); + } + + /// + /// Bug #86974 Cannot create instance of MySqlGeometry for empty geometry collection + /// + [Test] + public void CanCreateMySqlGeometryFromEmptyGeometryCollection() + { + var bytes = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + MySqlGeometry v = new MySqlGeometry(MySqlDbType.Geometry, bytes); +#if !NETFRAMEWORK + Assert.That(v.ToString(), Is.EqualTo("POINT(3.5E-323 0)")); +#else + Assert.That(v.ToString(), Is.EqualTo("POINT(3.45845952088873E-323 0)")); +#endif + } + + /// + /// Bug #86974 Cannot create instance of MySqlGeometry for empty geometry collection + /// + [Test] + public void CanGetMySqlGeometryFromEmptyGeometryCollection() + { + if (Version.CompareTo(new Version(5, 7)) == -1) return; + + ExecuteSQL("CREATE TABLE Test (v Geometry NOT NULL)"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (ST_GeometryCollectionFromText(\"GEOMETRYCOLLECTION()\"))", Connection); + cmd.ExecuteNonQuery(); + + // reading as binary + cmd.CommandText = "SELECT ST_AsBinary(v) as v FROM Test"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + var val = reader.GetMySqlGeometry(0); + var valWithName = reader.GetMySqlGeometry("v"); + Assert.That(val.ToString(), Is.EqualTo("POINT(0 0)")); + Assert.That(valWithName.ToString(), Is.EqualTo("POINT(0 0)")); + } + + // reading as geometry + cmd.CommandText = "SELECT v as v FROM Test"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + var val = reader.GetMySqlGeometry(0); + var valWithName = reader.GetMySqlGeometry("v"); +#if !NETFRAMEWORK + Assert.That(val.ToString(), Is.EqualTo("POINT(3.5E-323 0)")); + Assert.That(valWithName.ToString(), Is.EqualTo("POINT(3.5E-323 0)")); +#else + Assert.That(val.ToString(), Is.EqualTo("POINT(3.45845952088873E-323 0)")); + Assert.That(valWithName.ToString(), Is.EqualTo("POINT(3.45845952088873E-323 0)")); +#endif + } + } + + /// + /// Bug #30169716 MYSQLEXCEPTION WHEN INSERTING A MYSQLGEOMETRY VALUE + /// Bug #30169715 WHERE CLAUSE USING MYSQLGEOMETRY AS PARAMETER FINDS NO ROWS + /// + [Test] + public void Bug30169716() + { + ExecuteSQL("DROP TABLE IF EXISTS geometries"); + ExecuteSQL("CREATE TABLE geometries(id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, data GEOMETRY)"); + + var geometry = new MySqlGeometry(1, 1); + + using (var command = Connection.CreateCommand()) + { + command.CommandText = "INSERT INTO geometries(data) VALUES(@data); "; + command.Parameters.AddWithValue("@data", geometry); + int result = command.ExecuteNonQuery(); + Assert.That(result, Is.EqualTo(1)); + } + } + + #endregion + + /// + /// Bug #33322 Incorrect Double/Single value saved to MySQL database using MySQL Connector for + /// + [Test] + public void StoringAndRetrievingDouble() + { + ExecuteSQL("CREATE TABLE Test (v DOUBLE(25,20) NOT NULL)"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?v)", Connection); + cmd.Parameters.Add("?v", MySqlDbType.Double); + cmd.Parameters[0].Value = Math.PI; + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM Test"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + double d = reader.GetDouble(0); + Assert.That(d, Is.EqualTo(Math.PI)); + } + } + + /// + /// Bug #40571 Add GetSByte to the list of public methods supported by MySqlDataReader + /// + [Test] + public void SByteFromReader() + { + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE Test (c1 TINYINT, c2 TINYINT UNSIGNED)"); + ExecuteSQL("INSERT INTO Test VALUES (99, 217)"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetSByte(0), Is.EqualTo(99)); + Assert.That(reader.GetByte(1), Is.EqualTo(217)); + Assert.That(reader.GetByte(0), Is.EqualTo(99)); + } + } + + [Test] + public void NewGuidDataType() + { + ExecuteSQL("CREATE TABLE Test(id INT, g BINARY(16))"); + + string connStr = Connection.ConnectionString + ";old guids=true"; + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + Guid guid = Guid.NewGuid(); + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1, @g)", c); + cmd.Parameters.Add(new MySqlParameter("@g", MySqlDbType.Guid)); + cmd.Parameters[0].Value = guid; + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM Test"; + using (var reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetValue(0), Is.EqualTo(1)); + Assert.That(reader.GetGuid(1), Is.EqualTo(guid)); + } + } + } + + /// + /// Bug #44507 Binary(16) considered as Guid + /// + [Test] + public void ReadBinary16AsBinary() + { + ExecuteSQL("CREATE TABLE Test (id INT, guid BINARY(16))"); + + string connStr = Connection.ConnectionString + ";old guids=true"; + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + + Guid g = new Guid("32A48AC5-285A-46c6-A0D4-158E6E39729C"); + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (1, ?guid)", c); + //MySqlParameter p = new MySqlParameter(); + //p.ParameterName = "guid"; + //p.Value = Guid.NewGuid(); + cmd.Parameters.AddWithValue("guid", Guid.NewGuid()); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM Test"; + cmd.Parameters.Clear(); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + + object o = reader.GetValue(1); + Assert.That(o is Guid); + + byte[] bytes = new byte[16]; + long size = reader.GetBytes(1, 0, bytes, 0, 16); + Assert.That(size, Is.EqualTo(16)); + } + } + } + + [Test] + public void ReadingUUIDAsGuid() + { + ExecuteSQL("CREATE TABLE Test (id INT, guid CHAR(36))"); + ExecuteSQL("INSERT INTO Test VALUES (1, UUID())"); + + MySqlCommand cmd = new MySqlCommand("SELECT CONCAT('A', guid) FROM Test", Connection); + string serverGuidStr = cmd.ExecuteScalar().ToString().Substring(1); + Guid serverGuid = new Guid(serverGuidStr); + + cmd.CommandText = "SELECT guid FROM Test"; + Guid g = (Guid)cmd.ExecuteScalar(); + Assert.That(g, Is.EqualTo(serverGuid)); + } + + [Test] + public void NewGuidType() + { + ExecuteSQL("CREATE TABLE Test (id INT, guid CHAR(36))"); + + Guid g = Guid.NewGuid(); + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1, @g)", Connection); + cmd.Parameters.AddWithValue("@g", g); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT guid FROM Test"; + Guid readG = (Guid)cmd.ExecuteScalar(); + Assert.That(readG, Is.EqualTo(g)); + } + + /// + /// Bug #29963760 - FIRST QUERY AFTER APPLICATION RESTART ALWAYS FAILS WITH GUID ERROR + /// This bug was treating all the columns with length of 36 as GUID which was incorrect. + /// + [Test] + public void NotGuidType() + { + ExecuteSQL("CREATE TABLE Test (id INT, val CHAR(36), guid CHAR(36))"); + string s = "1234567890 1234567890 1234567890 123"; + Guid g = Guid.NewGuid(); + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1, @s, @g)", Connection); + cmd.Parameters.AddWithValue("@s", s); + cmd.Parameters.AddWithValue("@g", g); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM Test"; + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader["id"] is int); + Assert.That(reader["val"] is string); + Assert.That(reader["guid"] is Guid); + } + } + + /// + /// Bug #47928 Old Guids=true setting is lost after null value is + /// encountered in a Binary(16) + /// + [Test] + public void OldGuidsWithNull() + { + ExecuteSQL("CREATE TABLE Test (id INT, guid BINARY(16))"); + + string connStr = Connection.ConnectionString + ";old guids=true"; + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (1, ?guid)", c); + cmd.Parameters.AddWithValue("guid", Guid.NewGuid()); + cmd.ExecuteNonQuery(); + + cmd.Parameters["guid"].Value = null; + cmd.ExecuteNonQuery(); + cmd.Parameters["guid"].Value = Guid.NewGuid(); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT guid FROM Test"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + //In Bug #47928, following loop will crash after encountering + // null value. + while (reader.Read()) + { + object o = reader.GetValue(0); + } + } + } + } + + /// + /// Bug #47985 UTF-8 String Length Issue (guids etc) + /// + [Test] + public void UTF8Char12AsGuid() + { + ExecuteSQL("CREATE TABLE Test (id INT, name CHAR(12) CHARSET utf8)"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'Name')"); + + string connStr = Connection.ConnectionString + ";charset=utf8"; + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", c); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + string s = reader.GetString(1); + Assert.That(s, Is.EqualTo("Name")); + } + } + } + + /// + /// Bug #48100 Impossible to retrieve decimal value if it doesn't fit into .Net System.Decimal + /// + [Test] + public void MySqlDecimal() + { + ExecuteSQL("CREATE TABLE Test (id INT, dec1 DECIMAL(36,2))"); + ExecuteSQL("INSERT INTO Test VALUES (1, 9999999999999999999999999999999999.99)"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + MySqlDecimal dec = reader.GetMySqlDecimal(1); + string s = dec.ToString(); + Assert.That(dec.ToDouble(), Is.EqualTo(9999999999999999999999999999999999.99)); + Assert.That(dec.ToString(), Is.EqualTo("9999999999999999999999999999999999.99")); + + void Value() { _ = dec.Value; } + + Exception ex = Assert.Throws(() => Value()); + Assert.That(ex.Message, Is.EqualTo("Value was either too large or too small for a Decimal.")); + } + } + + /// + /// Bug #55644 Value was either too large or too small for a Double + /// + [Test] + public void DoubleMinValue() + { + ExecuteSQL("CREATE TABLE Test(dbl double)"); + MySqlCommand cmd = new MySqlCommand("insert into Test values(?param1)"); + cmd.Connection = Connection; + cmd.Parameters.Add(new MySqlParameter("?param1", MySqlDbType.Double)); + cmd.Parameters["?param1"].Value = Double.MinValue; + cmd.ExecuteNonQuery(); + cmd.Parameters["?param1"].Value = Double.MaxValue; + cmd.ExecuteNonQuery(); + + cmd = new MySqlCommand("SELECT * FROM Test", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + double d = reader.GetDouble(0); + Assert.That(double.MinValue, Is.EqualTo(d)); + reader.Read(); + d = reader.GetDouble(0); + Assert.That(double.MaxValue, Is.EqualTo(d)); + } + } + + /// + /// Bug #58373 ReadInteger problem + /// + [Test] + public void BigIntAutoInc() + { + ExecuteSQL("CREATE TABLE Test(ID bigint unsigned AUTO_INCREMENT NOT NULL PRIMARY KEY, name VARCHAR(20))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (@id, 'boo')", Connection); + ulong val = UInt64.MaxValue; + val -= 100; + cmd.Parameters.AddWithValue("@id", val); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "INSERT INTO Test (name) VALUES ('boo2')"; + cmd.ExecuteNonQuery(); + } + + /// + /// Bug # 13708884 timediff function + /// Executing a simple query that generates a time difference that has a + /// fractional second value throws an exception + /// + [Test] + public void Timediff() + { + MySqlCommand cmd = new MySqlCommand("select timediff('2 0:1:1.0', '4 1:2:3.123456')", Connection); + var result = cmd.ExecuteScalar(); + Assert.That(result, Is.EqualTo(new TimeSpan(new TimeSpan(-2, -1, -1, -2).Ticks - 1234560))); + } + + [Test] + public void CanReadJsonValue() + { + Assume.That(Version >= new Version(5, 7, 0), "This test is for MySql 5.7 or higher."); + ExecuteSQL("CREATE TABLE Test(Id int NOT NULL PRIMARY KEY, jsoncolumn JSON)"); + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (@id, '[1]')", Connection); + cmd.Parameters.AddWithValue("@id", 1); + cmd.ExecuteNonQuery(); + string command = @"INSERT INTO Test VALUES (@id, '[""a"", {""b"": [true, false]}, [10, 20]]')"; + cmd = new MySqlCommand(command, Connection); + cmd.Parameters.AddWithValue("@id", 2); + cmd.ExecuteNonQuery(); + cmd = new MySqlCommand("SELECT jsoncolumn from Test where id = 2 ", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetString(0), Is.EqualTo("[\"a\", {\"b\": [true, false]}, [10, 20]]")); + } + + ExecuteSQL("delete from Test"); + cmd = new MySqlCommand("INSERT INTO Test VALUES (@id, '[1]')", Connection); + cmd.Parameters.AddWithValue("@id", 1); + cmd.ExecuteNonQuery(); + + cmd = new MySqlCommand(@"INSERT INTO Test VALUES(@id,' { ""name"" : ""Bob"" , ""age"" : 25 } ')", Connection); + cmd.Parameters.AddWithValue("@id", 2); + cmd.ExecuteNonQuery(); + + cmd = new MySqlCommand(@"INSERT INTO Test VALUES(@id,' { ""name"" : ""Test"" , ""age"" : 100000 } ')", Connection); + cmd.Parameters.AddWithValue("@id", 3); + cmd.ExecuteNonQuery(); + + cmd = new MySqlCommand(@"INSERT INTO Test VALUES(@id,' { ""age"" : 200, ""name"" : ""check"" } ')", Connection); + cmd.Parameters.AddWithValue("@id", 4); + cmd.ExecuteNonQuery(); + + cmd = new MySqlCommand(@"INSERT INTO Test VALUES(@id,' { ""age"" : 200,""zage"" : 300,""bage"" : 400, ""name"" : ""check"" } ')", Connection); + cmd.Parameters.AddWithValue("@id", 5); + cmd.ExecuteNonQuery(); + + cmd = new MySqlCommand("SELECT jsoncolumn from Test where id = 2", Connection); + using (var reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read(), Is.EqualTo(true), "Matching the values"); + var checkValue = "{\"age\": 25, \"name\": \"Bob\"}"; + Assert.That(reader.GetString(0), Is.EqualTo(checkValue), "Matching the values"); + } + cmd = new MySqlCommand("SELECT count(*) from Test", Connection); + var count = cmd.ExecuteScalar(); + Assert.That(count, Is.EqualTo(5)); + + cmd = new MySqlCommand(@"INSERT INTO Test VALUES(@id,' { ""name"" : ""harald"",""Date"": ""2013-08-07"",""Time"": ""11:18:29.000000"",""DateTimeOfRegistration"": ""2013-08-07 12:18:29.000000""} ')", + Connection); + cmd.Parameters.AddWithValue("@id", 1000); + cmd.ExecuteNonQuery(); + + cmd = new MySqlCommand("SELECT jsoncolumn from Test where id=1000", Connection); + using (var reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read(), Is.EqualTo(true), "Matching the values"); + var checkValue = + "{\"Date\": \"2013-08-07\", \"Time\": \"11:18:29.000000\", \"name\": \"harald\", \"DateTimeOfRegistration\": \"2013-08-07 12:18:29.000000\"}"; + Assert.That(reader.GetString(0), Is.EqualTo(checkValue), "Matching the values"); + } + + //Multiple Columns + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE Test (Id int NOT NULL PRIMARY KEY, jsoncolumn1 JSON,jsoncolumn2 JSON,jsoncolumn3 JSON)"); + + cmd = new MySqlCommand(@"INSERT INTO Test VALUES(@id,'{ ""name"" : ""bob""}', '{ ""marks"" : 97}','{ ""distinction"" : true}')", + Connection); + cmd.Parameters.AddWithValue("@id", 100000); + cmd.ExecuteNonQuery(); + + cmd = new MySqlCommand("SELECT jsoncolumn1 from Test where id=100000", Connection); + using (var reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read(), Is.EqualTo(true), "Matching the values"); + var checkValue = "{\"name\": \"bob\"}"; + Assert.That(reader.GetString(0), Is.EqualTo(checkValue), "Matching the values"); + } + + cmd = new MySqlCommand("SELECT jsoncolumn2 from Test where id=100000", Connection); + using (var reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read(), Is.EqualTo(true), "Matching the values"); + var checkValue = "{\"marks\": 97}"; + Assert.That(reader.GetString(0), Is.EqualTo(checkValue), "Matching the values"); + } + + cmd = new MySqlCommand("SELECT jsoncolumn3 from Test where id=100000", Connection); + using (var reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read(), Is.EqualTo(true), "Matching the values"); + var checkValue = "{\"distinction\": true}"; + Assert.That(reader.GetString(0), Is.EqualTo(checkValue), "Matching the values"); + } + } + + [Test] + public void CanUpdateJsonValue() + { + if (Version < new Version(5, 7)) return; + + ExecuteSQL("CREATE TABLE Test(id int NOT NULL PRIMARY KEY, jsoncolumn JSON)"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (@id, '[1]')", Connection); + cmd.Parameters.AddWithValue("@id", 1); + cmd.ExecuteNonQuery(); + + string command = @"UPDATE Test set jsoncolumn = '[""a"", {""b"": [true, false]}, [10, 20]]' where id = 1"; + cmd = new MySqlCommand(command, Connection); + cmd.ExecuteNonQuery(); + + cmd = new MySqlCommand("SELECT jsoncolumn from Test where id = 1 ", Connection); + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetString(0), Is.EqualTo("[\"a\", {\"b\": [true, false]}, [10, 20]]")); + } + + cmd = new MySqlCommand(@"INSERT INTO Test VALUES(@id,' { ""name"" : ""bob"",""Date"": ""2015-10-09"",""Time"": ""12:18:29.000000"",""DateTimeOfRegistration"": ""2015-10-09 12:18:29.000000""} ')", + Connection); + cmd.Parameters.AddWithValue("@id", 100000); + cmd.ExecuteNonQuery(); + + command = @"UPDATE Test set jsoncolumn = ' { ""name"" : ""harald"",""Date"": ""2013-08-07"",""Time"": ""11:18:29.000000"",""DateTimeOfRegistration"": ""2013-08-07 12:18:29.000000""} ' where id = 100000"; + cmd = new MySqlCommand(command, Connection); + cmd.ExecuteNonQuery(); + + cmd = new MySqlCommand("SELECT jsoncolumn from Test where id=100000", Connection); + using (var reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read(), Is.EqualTo(true), "Matching the values"); + var checkValue = + "{\"Date\": \"2013-08-07\", \"Time\": \"11:18:29.000000\", \"name\": \"harald\", \"DateTimeOfRegistration\": \"2013-08-07 12:18:29.000000\"}"; + Assert.That(reader.GetString(0), Is.EqualTo(checkValue), "Matching the values"); + } + + } + + /// Testing out Generated Columns + /// Using a case sensitive collation on a column + /// and an insensitive serch with a generated column + /// WL #411 + /// + [Test] + public void CanUseGeneratedColumns() + { + if (Version < new Version(5, 7)) return; + + ExecuteSQL("CREATE TABLE `Test` (`ID` int NOT NULL AUTO_INCREMENT PRIMARY KEY, `Name` char(35) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL)"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (Name) VALUES ('Berlin')", Connection); + cmd.ExecuteNonQuery(); + cmd = new MySqlCommand("INSERT INTO Test (Name) VALUES ('London')", Connection); + cmd.ExecuteNonQuery(); + cmd = new MySqlCommand("INSERT INTO Test (Name) VALUES ('France')", Connection); + cmd.ExecuteNonQuery(); + cmd = new MySqlCommand("INSERT INTO Test (Name) VALUES ('United Kingdom')", Connection); + cmd.ExecuteNonQuery(); + cmd = new MySqlCommand("INSERT INTO Test (Name) VALUES ('Italy')", Connection); + cmd.ExecuteNonQuery(); + + cmd = new MySqlCommand("ALTER TABLE Test ADD COLUMN Name_ci char(35) CHARACTER SET utf8 AS (Name) STORED;", Connection); + cmd.ExecuteNonQuery(); + + cmd = new MySqlCommand("ALTER TABLE Test ADD INDEX (Name_ci);", Connection); + cmd.ExecuteNonQuery(); + + cmd = new MySqlCommand("SELECT Name FROM Test WHERE Name_ci='berlin'", Connection); + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetString(0).Equals("Berlin", StringComparison.CurrentCulture)); + } + } + + /// + /// Bug #31598178 - SQL WITH DATETIME PARAMETER RETURNS STRING VALUE + /// + [Test] + public void DateTimeTreatedAsVarChar() + { + string sql = "SELECT ?p0 as value"; + + using (MySqlCommand cmd = new MySqlCommand(sql, Connection)) + { + cmd.Parameters.AddWithValue("?p0", DateTime.Now); + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + using (DataTable schema = reader.GetSchemaTable()) + { + MySqlDbType providerType = (MySqlDbType)(int)schema.Rows[0]["ProviderType"]; + Assert.That(providerType, Is.EqualTo(MySqlDbType.DateTime)); + } + } + } + } + + /// + /// Bug #32049837 - CAN'T QUERY CHAR(36) COLUMN CONTAINING NULL + /// + [Test] + public void NullGuid() + { + ExecuteSQL("CREATE TABLE `Test` (value CHAR(36)); INSERT INTO Test(value) VALUES(NULL);"); + + MySqlCommand cmd = new MySqlCommand("SELECT value FROM Test", Connection); + using var reader = cmd.ExecuteReader(); + while (reader.Read()) + { + Assert.That(reader.IsDBNull(0)); + } + } + + /// + /// Bug #32938630 - CAN'T READ CHAR(36) COLUMN IF MYSQLCOMMAND IS PREPARED + /// + [Test] + public void ReadChar36ColumnPrepared() + { + string guid = "3e22b63e-8077-43ab-8cee-17aa1db80861"; + ExecuteSQL($"CREATE TABLE `Test` (value CHAR(36)); INSERT INTO Test(value) VALUES('{guid}');"); + + MySqlCommand cmd = new MySqlCommand("SELECT value FROM Test", Connection); + cmd.Prepare(); + using var reader = cmd.ExecuteReader(); + while (reader.Read()) + { + Assert.That(reader.GetGuid(0).ToString(), Is.EqualTo(guid).IgnoreCase); + } + } + + /// + /// Bug 26876582 UNEXPECTED COLUMNSIZE FOR CHAR(36) AND BLOB COLUMNS IN GETSCHEMATABLE + /// + [Test] + public void UnexpectedColumnSize() + { + var cmd = new MySqlCommand("create table datatypes(char36 char(36),char37 char(37),`tinyblob` tinyblob,`blob` blob); ", Connection); + cmd.ExecuteNonQuery(); + + cmd = new MySqlCommand("insert into datatypes values('test', 'test', _binary'test',_binary'test'); ", Connection); + cmd.ExecuteNonQuery(); + + using (cmd = Connection.CreateCommand()) + { + cmd.CommandText = "SELECT * FROM datatypes;"; + using (var reader = cmd.ExecuteReader()) + { + var schemaTable = reader.GetSchemaTable(); + Assert.That(schemaTable.Rows[0]["ColumnSize"].ToString(), Is.EqualTo("36"), "Matching the Column Size"); + Assert.That(schemaTable.Rows[1]["ColumnSize"].ToString(), Is.EqualTo("37"), "Matching the Column Size"); + Assert.That(schemaTable.Rows[2]["ColumnSize"].ToString(), Is.EqualTo("255"), "Matching the Column Size"); + Assert.That(schemaTable.Rows[3]["ColumnSize"].ToString(), Is.EqualTo("65535"), "Matching the Column Size"); + } + } + } + + [Test, Description("Test Can Read long JSON Values")] + public void ReadJSONLongValues() + { + Assume.That(Version >= new Version(5, 7, 0), "This test is for MySql 5.7 or higher."); + var sb = new StringBuilder("0"); + for (int x = 1; x <= 575; x++) + { + sb.Append($"TestingaLongString{x}"); + } + + ExecuteSQL("CREATE TABLE Test (Id int NOT NULL PRIMARY KEY, jsoncolumn JSON)"); + + string jsonTest = null; + var i = 1000000000; + jsonTest = @"{ ""age"" : " + i + "}"; + var cmd = new MySqlCommand("INSERT INTO Test VALUES (@id, @jsoncolumn)", Connection); + cmd.Parameters.AddWithValue("@id", i); + cmd.Parameters.AddWithValue("@jsoncolumn", jsonTest); + cmd.ExecuteNonQuery(); + cmd = new MySqlCommand("SELECT jsoncolumn from Test where id = " + i, Connection); + using (var reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read(), Is.EqualTo(true), "Matching the values"); + var checkValue = @"{""age"": " + i + "}"; + Assert.That(reader.GetString(0), Is.EqualTo(checkValue), "Matching the values"); + } + + // long string + cmd = new MySqlCommand( + @"INSERT INTO Test VALUES(@id,'{""name"":""" + sb.ToString() + @"""}')", + Connection); + cmd.Parameters.AddWithValue("@id", 2); + cmd.ExecuteNonQuery(); + + cmd = new MySqlCommand("SELECT jsoncolumn from Test where id = 2", Connection); + using (var reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read(), Is.EqualTo(true), "Matching the values"); + var checkValue = + @"{""name"": """ + sb.ToString() + @"""}"; + Assert.That(reader.GetString(0), Is.EqualTo(checkValue), "Matching the values"); + } + } + + [Test, Description("Test Can Read JSON Value Stress")] + public void ReadJSONValueStress() + { + Assume.That(Version >= new Version(5, 7, 0), "This test is for MySql 5.7 or higher."); + ExecuteSQL("CREATE TABLE Test (Id int NOT NULL PRIMARY KEY, jsoncolumn JSON)"); + string jsonTest = null; + for (var i = 0; i < 1000; i++) + { + jsonTest = @"{ ""age"" : " + i + "}"; + var cmd = new MySqlCommand("INSERT INTO Test VALUES (@id, @jsoncolumn)", Connection); + cmd.Parameters.AddWithValue("@id", i); + cmd.Parameters.AddWithValue("@jsoncolumn", jsonTest); + cmd.ExecuteNonQuery(); + + cmd = new MySqlCommand("SELECT jsoncolumn from Test where id = " + i, Connection); + + using (var reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read(), Is.EqualTo(true), "Matching the values"); + var checkValue = @"{""age"": " + i + "}"; + Assert.That(reader.GetString(0), Is.EqualTo(checkValue), "Matching the values"); + } + } + } + + /// + /// Bug #33470147 - Bug #91752 is marked as fixed in v8.0.16, but still present in v8.0.26 + /// When reading a zero time value, it didn't reset the value of the new row hence the exception + /// + [Test] + public void ZeroTimeValues() + { + ExecuteSQL(@"CREATE TABLE Test (tm TIME NOT NULL); + INSERT INTO Test VALUES('00:00:00'); + INSERT INTO Test VALUES('01:01:01'); + INSERT INTO Test VALUES('00:00:00');"); + + using (var command = new MySqlCommand(@"SELECT tm FROM Test", Connection)) + { + command.Prepare(); + using (var reader = command.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetValue(0).ToString(), Is.EqualTo("00:00:00")); + Assert.That(reader.GetTimeSpan(0).ToString(), Is.EqualTo("00:00:00")); + + Assert.That(reader.Read()); + Assert.That(reader.GetValue(0).ToString(), Is.EqualTo("01:01:01")); + Assert.That(reader.GetTimeSpan(0).ToString(), Is.EqualTo("01:01:01")); + + Assert.That(reader.Read()); + Assert.That(reader.GetValue(0).ToString(), Is.EqualTo("00:00:00")); + Assert.That(reader.GetTimeSpan(0).ToString(), Is.EqualTo("00:00:00")); + } + } + } + + /// + /// Bug #32933120 - CAN'T USE TIMESPAN VALUE WITH MICROSECONDS USING PREPARED STATEMENT + /// At the moment of writing the time value, the calculation of microseconds was wrong + /// + [Test] + public void TimespanWithMicrosecondsPrepared() + { + ExecuteSQL("CREATE TABLE Test (tm TIME(4))"); + var value = new TimeSpan(0, 0, 0, 1, 234) + TimeSpan.FromTicks(5000); + + using var cmd = new MySqlCommand(); + cmd.Connection = Connection; + cmd.Parameters.AddWithValue("@value", value); + + // Try the INSERT + cmd.CommandText = "INSERT INTO Test VALUES(@value)"; + cmd.Prepare(); + Assert.That(cmd.ExecuteNonQuery(), Is.EqualTo(1)); + + // Try the SELECT + cmd.CommandText = "SELECT tm FROM Test WHERE tm = @value;"; + cmd.Prepare(); + using var reader = cmd.ExecuteReader(); + Assert.That(reader.Read()); + Assert.That(reader.GetValue(0), Is.EqualTo(value)); + } + + /// + /// Bug #31087580 [UNEXPECTED RETURN VALUE GETTING INTEGER FOR TINYINT(1) COLUMN] + /// + [TestCase(true, true)] + [TestCase(false, true)] + [TestCase(true, false)] + [TestCase(false, false)] + public void GetIntForTinyInt(bool treatAsBool, bool isPrepared) + { + ExecuteSQL(@"CREATE TABLE Test (value tinyint(1)); INSERT INTO Test VALUES (-2);"); + string connString = Connection.ConnectionString + $";treattinyasboolean={treatAsBool};"; + + using var conn = new MySqlConnection(connString); + conn.Open(); + + using var cmd = new MySqlCommand("SELECT * FROM Test", conn); + if (isPrepared) cmd.Prepare(); + using var reader = cmd.ExecuteReader(); + reader.Read(); + + Assert.That(reader.GetSByte(0), Is.EqualTo(treatAsBool ? 1 : -2)); + Assert.Throws(() => reader.GetByte(0)); + Assert.That(reader.GetInt16(0), Is.EqualTo(treatAsBool ? 1 : -2)); + Assert.That(reader.GetInt32(0), Is.EqualTo(treatAsBool ? 1 : -2)); + Assert.That(reader.GetInt64(0), Is.EqualTo(treatAsBool ? 1 : -2)); + + Assert.That(reader.GetFieldValue(0), Is.EqualTo(treatAsBool ? 1 : -2)); + Assert.Throws(() => reader.GetFieldValue(0)); + Assert.That(reader.GetFieldValue(0), Is.EqualTo(treatAsBool ? 1 : -2)); + Assert.That(reader.GetFieldValue(0), Is.EqualTo(treatAsBool ? 1 : -2)); + Assert.That(reader.GetFieldValue(0), Is.EqualTo(treatAsBool ? 1 : -2)); + } + + [Test] + public void BadVectorDataThrowsException() + { + Assume.That(Version >= new Version(9, 0, 0), "This test is for MySql 9.0 or higher."); + + ExecuteSQL(@"CREATE TABLE Test (vector1 VECTOR)"); + using var cmd = new MySqlCommand(); + cmd.Connection = Connection; + + // insert a value + cmd.CommandText = "INSERT INTO Test VALUES(@v1)"; + cmd.Parameters.Add("v1", MySqlDbType.Vector); + cmd.Parameters[0].Value = "not a vector value"; + Assert.Throws(() => cmd.ExecuteNonQuery()); + } + + [TestCase(false)] + [TestCase(true)] + public void InsertAndSelectVector(bool prepared) + { + Assume.That(Version >= new Version(9, 0, 0), "This test is for MySql 9.0 or higher."); + + ExecuteSQL(@"CREATE TABLE Test (vector1 VECTOR)"); + using var cmd = new MySqlCommand(); + cmd.Connection = Connection; + + // insert a value + cmd.CommandText = "INSERT INTO Test VALUES(@v1)"; + cmd.Parameters.Add("v1", MySqlDbType.Vector); + float[] floatArray = [1.2f, 2.3f, 3.4f]; + + // copy floats into byteArray + byte[] byteArray = new byte[floatArray.Length * 4]; + Buffer.BlockCopy(floatArray, 0, byteArray, 0, byteArray.Length); + + cmd.Parameters[0].Value = byteArray; + if (prepared) cmd.Prepare(); + cmd.ExecuteNonQuery(); + + // now select that value back out and compare + cmd.CommandText = "SELECT vector1 from Test"; + if (prepared) cmd.Prepare(); + using var reader = cmd.ExecuteReader(); + reader.Read(); + var value = reader.GetValue(0); + Assert.That(value, Is.InstanceOf(typeof(byte[]))); + byteArray = (byte[])value; + + float[] floatArray2 = new float[byteArray.Length / 4]; + Buffer.BlockCopy(byteArray, 0, floatArray2, 0, byteArray.Length); + + Assert.That(floatArray2.Length, Is.EqualTo(3)); + Assert.That(floatArray2[0], Is.EqualTo(1.2f)); + Assert.That(floatArray2[1], Is.EqualTo(2.3f)); + Assert.That(floatArray2[2], Is.EqualTo(3.4f)); + } + + [TestCase(false)] + [TestCase(true)] + public void VectorReturnedFromSproc(bool prepared) + { + Assume.That(Version >= new Version(9, 0, 0), "This test is for MySql 9.0 or higher."); + + ExecuteSQL("DROP PROCEDURE IF EXISTS spTest"); + ExecuteSQL(@"CREATE PROCEDURE spTest (OUT v1 VECTOR) BEGIN + SELECT STRING_TO_VECTOR('[1.2, 2.3, 3.4]') INTO v1; END"); + using var cmd = new MySqlCommand(); + cmd.Connection = Connection; + + // prepare and execute the command + cmd.CommandText = "spTest"; + cmd.Parameters.Add("v1", MySqlDbType.Vector); + cmd.Parameters[0].Direction = ParameterDirection.Output; + cmd.CommandType = CommandType.StoredProcedure; + if (prepared) cmd.Prepare(); + cmd.ExecuteNonQuery(); + + // now the parameter should contain the output value + Assert.That(cmd.Parameters[0].Value, Is.InstanceOf(typeof(byte[]))); + byte[] byteArray = (byte[])cmd.Parameters[0].Value; + + // now check to see if it has the correct values + float[] floatArray = new float[byteArray.Length / 4]; + Buffer.BlockCopy(byteArray, 0, floatArray, 0, byteArray.Length); + + Assert.That(floatArray.Length, Is.EqualTo(3)); + Assert.That(floatArray[0], Is.EqualTo(1.2f)); + Assert.That(floatArray[1], Is.EqualTo(2.3f)); + Assert.That(floatArray[2], Is.EqualTo(3.4f)); + } + } + + +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/DateTimeTests.cs b/MySQL.Data/tests/MySql.Data.Tests/DateTimeTests.cs new file mode 100644 index 000000000..a2ded784e --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/DateTimeTests.cs @@ -0,0 +1,994 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Types; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Globalization; +using System.Text; + +namespace MySql.Data.MySqlClient.Tests +{ + public partial class DateTimeTests : TestBase + { + protected override void Cleanup() + { + ExecuteSQL(String.Format("DROP TABLE IF EXISTS `{0}`.Test", Connection.Database)); + } + + [Test] + public void ConvertZeroDateTime() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME, d DATE, " + + "t TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + + ExecuteSQL("INSERT INTO Test VALUES(1, '0000-00-00', '0000-00-00', " + + "'00:00:00', NULL)"); + + string connStr = Connection.ConnectionString; + connStr += ";convert zero datetime=yes"; + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", c); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetDateTime(1).Date, Is.EqualTo(DateTime.MinValue.Date)); + Assert.That(reader.GetDateTime(2).Date, Is.EqualTo(DateTime.MinValue.Date)); + } + } + } + + [Test] + public void TestNotAllowZeroDateAndTime() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME, d DATE, " + + "t TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + var sql_mode = MySqlHelper.ExecuteScalar(Connection, "SELECT @@session.sql_mode"); + ExecuteSQL("SET SQL_MODE=''"); + ExecuteSQL("INSERT INTO Test VALUES(1, 'Test', '0000-00-00', '0000-00-00', '00:00:00')"); + ExecuteSQL("INSERT INTO Test VALUES(2, 'Test', '2004-11-11', '2004-11-11', '06:06:06')"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + + MySqlDateTime testDate = reader.GetMySqlDateTime(2); + Assert.That(testDate.IsValidDateTime, Is.False, "IsZero is false"); + + Exception ex = Assert.Throws(() => reader.GetValue(2)); + Assert.That(ex.Message, Is.EqualTo("Unable to convert MySQL date/time value to System.DateTime")); + + Assert.That(reader.Read()); + + DateTime dt2 = (DateTime)reader.GetValue(2); + Assert.That(dt2.Date, Is.EqualTo(new DateTime(2004, 11, 11).Date)); + } + + ExecuteSQL($"SET SQL_MODE = '{sql_mode}'"); + } + + [Test] + public void DateAdd() + { + MySqlCommand cmd = new MySqlCommand("select date_add(?someday, interval 1 hour)", + Connection); + DateTime now = DateTime.Now; + DateTime later = now.AddHours(1); + later = later.AddMilliseconds(later.Millisecond * -1); + cmd.Parameters.AddWithValue("?someday", now); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + DateTime dt = reader.GetDateTime(0); + Assert.That(dt.Date, Is.EqualTo(later.Date)); + Assert.That(dt.Hour, Is.EqualTo(later.Hour)); + Assert.That(dt.Minute, Is.EqualTo(later.Minute)); + Assert.That(dt.Second, Is.EqualTo(later.Second)); + } + } + + [Test] + public void TestZeroDateTimeException() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME, d DATE, " + + "t TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + + ExecuteSQL("INSERT INTO Test (id, d, dt) VALUES (1, '0000-00-00', '0000-00-00 00:00:00')"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Exception ex = Assert.Throws(() => reader.GetDateTime(2)); + Assert.That(ex.Message, Is.EqualTo("Unable to convert MySQL date/time value to System.DateTime")); + } + } + + /// + /// Bug #8929 Timestamp values with a date > 10/29/9997 cause problems + /// + [Test] + public void LargeDateTime() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME, d DATE, " + + "t TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id, dt) VALUES(?id,?dt)", Connection); + cmd.Parameters.Add(new MySqlParameter("?id", 1)); + cmd.Parameters.Add(new MySqlParameter("?dt", DateTime.Parse("9997-10-29"))); + cmd.ExecuteNonQuery(); + cmd.Parameters[0].Value = 2; + cmd.Parameters[1].Value = DateTime.Parse("9997-10-30"); + cmd.ExecuteNonQuery(); + cmd.Parameters[0].Value = 3; + cmd.Parameters[1].Value = DateTime.Parse("9999-12-31"); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT id,dt FROM Test"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetDateTime(1).Date, Is.EqualTo(DateTime.Parse("9997-10-29").Date)); + Assert.That(reader.Read()); + Assert.That(reader.GetDateTime(1).Date, Is.EqualTo(DateTime.Parse("9997-10-30").Date)); + Assert.That(reader.Read()); + Assert.That(reader.GetDateTime(1).Date, Is.EqualTo(DateTime.Parse("9999-12-31").Date)); + } + } + + [Test] + public void UsingDatesAsStrings() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME, d DATE, " + + "t TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id, dt) VALUES (1, ?dt)", Connection); + cmd.Parameters.Add("?dt", MySqlDbType.Date); + cmd.Parameters[0].Value = "2005-03-04"; + cmd.ExecuteNonQuery(); + + MySqlCommand cmd2 = new MySqlCommand("SELECT * FROM Test", Connection); + using (var reader = cmd2.ExecuteReader()) + { + Assert.That(reader.Read()); + DateTime dt = reader.GetDateTime("dt"); + Assert.That(dt.Year, Is.EqualTo(2005)); + Assert.That(dt.Month, Is.EqualTo(3)); + Assert.That(dt.Day, Is.EqualTo(4)); + Assert.That(reader.Read(), Is.False); + } + } + + /// + /// Bug #19481 Where clause with datetime throws exception [any warning causes the exception] + /// + [Test] + public void Bug19481() + { + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE Test(ID INT NOT NULL AUTO_INCREMENT, " + + "SATELLITEID VARCHAR(3) NOT NULL, ANTENNAID INT, AOS_TIMESTAMP DATETIME NOT NULL, " + + "TEL_TIMESTAMP DATETIME, LOS_TIMESTAMP DATETIME, PRIMARY KEY (ID))"); + ExecuteSQL("INSERT INTO Test VALUES (NULL,'224','0','2005-07-24 00:00:00'," + + "'2005-07-24 00:02:00','2005-07-24 00:22:00')"); + ExecuteSQL("INSERT INTO Test VALUES (NULL,'155','24','2005-07-24 03:00:00'," + + "'2005-07-24 03:02:30','2005-07-24 03:20:00')"); + ExecuteSQL("INSERT INTO Test VALUES (NULL,'094','34','2005-07-24 09:00:00'," + + "'2005-07-24 09:00:30','2005-07-24 09:15:00')"); + ExecuteSQL("INSERT INTO Test VALUES (NULL,'224','54','2005-07-24 12:00:00'," + + "'2005-07-24 12:01:00','2005-07-24 12:33:00')"); + ExecuteSQL("INSERT INTO Test VALUES (NULL,'155','25','2005-07-24 15:00:00'," + + "'2005-07-24 15:02:00','2005-07-24 15:22:00')"); + ExecuteSQL("INSERT INTO Test VALUES (NULL,'094','0','2005-07-24 17:00:00'," + + "'2005-07-24 17:02:12','2005-07-24 17:20:00')"); + ExecuteSQL("INSERT INTO Test VALUES (NULL,'224','24','2005-07-24 19:00:00'," + + "'2005-07-24 19:02:00','2005-07-24 19:27:00')"); + ExecuteSQL("INSERT INTO Test VALUES (NULL,'155','34','2005-07-24 21:00:00'," + + "'2005-07-24 21:02:33','2005-07-24 21:22:55')"); + ExecuteSQL("INSERT INTO Test VALUES (NULL,'094','55','2005-07-24 23:00:00'," + + "'2005-07-24 23:00:45','2005-07-24 23:22:23')"); + + CultureInfo cultureInfo = new CultureInfo("en-us"); + DateTime date = DateTime.Parse("7/24/2005", cultureInfo); + StringBuilder sql = new StringBuilder(); + sql.AppendFormat(CultureInfo.InvariantCulture, + @"SELECT ID, ANTENNAID, TEL_TIMESTAMP, LOS_TIMESTAMP FROM Test + WHERE TEL_TIMESTAMP >= '{0}'", date.ToString("u")); + MySqlCommand cmd = new MySqlCommand(sql.ToString(), Connection); + using (var reader = cmd.ExecuteReader()) + { + while (reader.Read()) { } + } + } + + /// + /// Bug #17736 Selecting a row with with empty date '0000-00-00' results in Read() hanging. + /// + [Test] + public void PreparedZeroDateTime() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME, d DATE, " + + "t TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + + ExecuteSQL("INSERT INTO Test VALUES(1, Now(), '0000-00-00', NULL, NULL)"); + MySqlCommand cmd = new MySqlCommand("SELECT d FROM Test WHERE id=?id", Connection); + cmd.Parameters.AddWithValue("?id", 1); + cmd.Prepare(); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + } + } + + /// + /// Bug #32010 Connector return incorrect value when pulling 0 datetime + /// + [Test] + public void MySqlDateTimeFormatting() + { + DateTime dt = DateTime.Now; + MySqlDateTime mdt = new MySqlDateTime(dt); + Assert.That(mdt.ToString(), Is.EqualTo(dt.ToString(CultureInfo.InvariantCulture))); + } + + /// + /// Bug #41021 DateTime format incorrect + /// + [Test] + public void DateFormat() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME, d DATE, " + + "t TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + + DateTime dt = DateTime.Now; + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1, ?dt, NULL, NULL, NULL)", Connection); + cmd.Parameters.AddWithValue("?dt", dt); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT dt FROM Test WHERE DATE_FORMAT(DATE(dt), GET_FORMAT(DATETIME, 'ISO'))=?datefilter"; + cmd.Parameters.Clear(); + cmd.Parameters.AddWithValue("?datefilter", dt.Date); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + } + } + + /// + /// Bug #28393733 TIME(N) COLUMN LOSES MICROSECONDS WITH PREPARED COMMAND + /// Bug #31623730 TIME(N) COLUMN DESERIALIZES MILLISECONDS INCORRECTLY WITH PREPARED COMMAND + /// + [Test] + public void TimeColumnWithMicrosecondsOnPrepare() + { + ExecuteSQL(@"DROP TABLE IF EXISTS test_time; + CREATE TABLE test_time(data TIME(6) NOT NULL);"); + TimeSpan time = new TimeSpan(1, 2, 3, 4, 567); + using (MySqlConnection c = new MySqlConnection(Connection.ConnectionString)) + { + c.Open(); + using (var cmd = new MySqlCommand(@"INSERT INTO test_time VALUES(@data);", c)) + { + cmd.Parameters.AddWithValue("@data", time); + cmd.ExecuteNonQuery(); + } + + using (var command = new MySqlCommand(@"SELECT data FROM test_time", c)) + { + command.Prepare(); + var result = (TimeSpan)command.ExecuteScalar(); + Assert.That(result.ToString() == "1.02:03:04.5670000"); + } + + ExecuteSQL(@"Delete from test_time;"); + TimeSpan time2 = new TimeSpan(1, 2, 3, 4) + TimeSpan.FromTicks(5600); + using (var cmd = new MySqlCommand(@"INSERT INTO test_time VALUES(@data);", c)) + { + cmd.Parameters.AddWithValue("@data", time2); + cmd.ExecuteNonQuery(); + } + + using (var command = new MySqlCommand(@"SELECT data FROM test_time", c)) + { + command.Prepare(); + var result = (TimeSpan)command.ExecuteScalar(); + Assert.That(result.ToString() == "1.02:03:04.0005600"); + } + + } + } + + #region DateTimeTypeTests + + [Test] + public void CanUpdateMicroseconds() + { + if (Version < new Version(5, 6)) return; + DateTime dt = DateTime.Now; + MySqlCommand cmd = new MySqlCommand(); + + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME(6), d DATE, " + + "t TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + + cmd.Connection = Connection; + cmd.CommandText = "INSERT INTO Test VALUES(1, ?dt, NULL, NULL, NULL)"; + cmd.Parameters.AddWithValue("?dt", dt); + cmd.ExecuteNonQuery(); + + //Update value + cmd.Parameters.Clear(); + cmd.Connection = Connection; + cmd.CommandText = "UPDATE Test SET dt=?dt"; + cmd.Parameters.Add(new MySqlParameter("?dt", "2011-01-01 12:34:56.123456")); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT dt FROM Test"; + cmd.Parameters.Clear(); + cmd.Connection = Connection; + + MySqlDataReader rdr = cmd.ExecuteReader(); + + while (rdr.Read()) + { + Assert.That(rdr.GetDateTime(0).ToString("hh:mm:ss.ffffff"), Is.EqualTo("12:34:56.123456")); + } + rdr.Close(); + } + + #endregion + + [Test] + public void CanUpdateMicrosecondsWithPrepare() + { + if (Version < new Version(5, 6)) return; + + MySqlCommand cmd = new MySqlCommand(); + + using (MySqlConnection c = new MySqlConnection(Connection.ConnectionString)) + { + c.Open(); + + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME(6), d DATE, " + + "t TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + + cmd.Connection = c; + cmd.CommandText = "INSERT INTO Test VALUES(?id, ?dt, NULL, NULL, NULL)"; + cmd.Parameters.Add(new MySqlParameter("?id", 1)); + + MySqlParameter datetimeinsert = new MySqlParameter(); + datetimeinsert.ParameterName = "?dt"; + datetimeinsert.MySqlDbType = MySqlDbType.DateTime; + datetimeinsert.Value = "2011-01-01 12:34:59.123456"; + cmd.Parameters.Add(datetimeinsert); + + cmd.Prepare(); + + cmd.ExecuteNonQuery(); + + cmd.Parameters.Clear(); + + MySqlParameter datetimepar = new MySqlParameter(); + datetimepar.ParameterName = "?dt"; + datetimepar.MySqlDbType = MySqlDbType.DateTime; + datetimepar.Value = "1999-01-01 12:34:59.999999"; + + cmd.Connection = c; + cmd.CommandText = "UPDATE Test SET dt=?dt WHERE id =1"; + cmd.Parameters.Add(datetimepar); + cmd.Prepare(); + cmd.ExecuteNonQuery(); + + + + cmd.CommandText = "SELECT dt FROM Test WHERE id = 1"; + cmd.Parameters.Clear(); + cmd.Connection = c; + cmd.Prepare(); + MySqlDataReader rdr = cmd.ExecuteReader(); + + while (rdr.Read()) + { + Assert.That(rdr.GetDateTime(0).ToString("hh:mm:ss.ffffff"), Is.EqualTo("12:34:59.999999")); + } + rdr.Close(); + } + } + + #region TimeTypeTests + + [Test] + // reference http://msdn.microsoft.com/en-us/library/system.timespan.frommilliseconds.aspx + public void CanUpdateMillisecondsUsingTimeType() + { + if (Version < new Version(5, 6)) return; + DateTime dt = DateTime.Now; + MySqlCommand cmd = new MySqlCommand(); + + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME(6), d DATE, " + + "t TIME(6), ts TIMESTAMP(6), PRIMARY KEY(id))"); + + cmd.Connection = Connection; + cmd.CommandText = "INSERT INTO Test VALUES(1, NULL, NULL, ?t, NULL)"; + + MySqlParameter timeinsert = new MySqlParameter(); + timeinsert.ParameterName = "?t"; + timeinsert.MySqlDbType = MySqlDbType.Time; + timeinsert.Value = TimeSpan.FromMilliseconds(12345.6); + cmd.Parameters.Add(timeinsert); + cmd.ExecuteNonQuery(); + + + cmd.CommandText = "SELECT Time(t) FROM Test"; + cmd.Parameters.Clear(); + cmd.Connection = Connection; + + using (MySqlDataReader rdr = cmd.ExecuteReader()) + { + while (rdr.Read()) + { +#if !NETFRAMEWORK + Assert.That(rdr.GetTimeSpan(0).Milliseconds, Is.EqualTo(345)); +#else + Assert.That(rdr.GetTimeSpan(0).Milliseconds, Is.EqualTo(346)); +#endif + } + } + } + + [Test] + [Ignore("Fix this")] + // reference http://msdn.microsoft.com/en-us/library/system.timespan.frommilliseconds.aspx + public void CanUpdateMillisecondsUsingTimeTypeOnPrepareStatements() + { + if (Version < new Version(5, 6)) return; + DateTime dt = DateTime.Now; + MySqlCommand cmd = new MySqlCommand(); + + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME(6), d DATE, " + + "t TIME(6), ts TIMESTAMP(6), PRIMARY KEY(id))"); + + + using (MySqlConnection c = new MySqlConnection(Connection.ConnectionString)) + { + c.Open(); + cmd.Connection = c; + cmd.CommandText = "INSERT INTO Test VALUES(1, NULL, NULL, ?t, NULL)"; + + MySqlParameter timeinsert = new MySqlParameter(); + timeinsert.ParameterName = "?t"; + timeinsert.MySqlDbType = MySqlDbType.Time; + timeinsert.Value = TimeSpan.FromMilliseconds(1.5); + cmd.Parameters.Add(timeinsert); + + cmd.Prepare(); + + cmd.ExecuteNonQuery(); + + + cmd.CommandText = "SELECT Time(t) FROM Test"; + cmd.Parameters.Clear(); + cmd.Connection = Connection; + cmd.Prepare(); + + MySqlDataReader rdr = cmd.ExecuteReader(); + using (rdr) + { + while (rdr.Read()) + { + Assert.That(rdr.GetTimeSpan(0).Milliseconds, Is.EqualTo(2)); + } + } + } + } + + #endregion + + #region TimeStampTests + [Test] + public void CanUpdateMillisecondsUsingTimeStampType() + { + if (Version < new Version(5, 6)) return; + DateTime dt = DateTime.Now; + MySqlCommand cmd = new MySqlCommand(); + + using (MySqlConnection c = new MySqlConnection(Connection.ConnectionString)) + { + c.Open(); + + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME(6), d DATE, " + + "t TIME(6), ts TIMESTAMP(6), PRIMARY KEY(id))"); + + cmd.Connection = c; + cmd.CommandText = "INSERT INTO Test VALUES(1, NULL, NULL, NULL, ?ts)"; + + MySqlParameter timeinsert = new MySqlParameter(); + timeinsert.ParameterName = "?ts"; + timeinsert.MySqlDbType = MySqlDbType.Timestamp; + timeinsert.Value = "2011-01-01 12:34:56.123456"; + cmd.Parameters.Add(timeinsert); + + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT ts FROM Test"; + cmd.Parameters.Clear(); + cmd.Connection = Connection; + + MySqlDataReader rdr = cmd.ExecuteReader(); + + while (rdr.Read()) + { + Assert.That(rdr.GetMySqlDateTime(0).Microsecond, Is.EqualTo(123456)); + } + rdr.Close(); + } + + } + + + [Test] + public void CanUpdateMillisecondsUsingTimeStampTypeWithPrepare() + { + if (Version < new Version(5, 6)) return; + DateTime dt = DateTime.Now; + MySqlCommand cmd = new MySqlCommand(); + + using (MySqlConnection c = new MySqlConnection(Connection.ConnectionString)) + { + c.Open(); + + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME(6), d DATE, " + + "t TIME(6), ts TIMESTAMP(6), PRIMARY KEY(id))"); + + cmd.Connection = c; + cmd.CommandText = "INSERT INTO Test VALUES(1, NULL, NULL, NULL, ?ts)"; + + MySqlParameter timeinsert = new MySqlParameter(); + timeinsert.ParameterName = "?ts"; + timeinsert.MySqlDbType = MySqlDbType.Timestamp; + timeinsert.Value = "2011-01-01 12:34:56.123456"; + cmd.Parameters.Add(timeinsert); + + cmd.Prepare(); + + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT ts FROM Test"; + cmd.Parameters.Clear(); + cmd.Connection = Connection; + + using (MySqlDataReader rdr = cmd.ExecuteReader()) + { + while (rdr.Read()) + { + Assert.That(rdr.GetMySqlDateTime(0).Microsecond, Is.EqualTo(123456)); + } + } + } + } + #endregion + + /// + /// Bug #63812 MySqlDateTime.GetDateTime() does not specify Timezone for TIMESTAMP fields + /// + [Test] + public void TimestampValuesAreLocal() + { + ExecuteSQL("CREATE TABLE TimestampValuesAreLocal (id INT NOT NULL, dt DATETIME, d DATE, " + + "t TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + + DateTime dt = DateTime.Now; + MySqlCommand cmd = new MySqlCommand("INSERT INTO TimestampValuesAreLocal VALUES(1, ?dt, NULL, NULL, CURRENT_TIMESTAMP)", Connection); + cmd.Parameters.AddWithValue("@dt", dt); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT dt,ts FROM TimestampValuesAreLocal"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + DateTime dt1 = reader.GetDateTime(0); + DateTime ts = reader.GetDateTime(1); + Assert.That(dt1.Kind, Is.EqualTo(DateTimeKind.Unspecified)); + Assert.That(ts.Kind, Is.EqualTo(DateTimeKind.Local)); + } + } + + /// + /// Bug #66964 TIMESTAMP values are mistakenly represented as DateTime with Kind = Local + /// + [Test] + public void TimestampCorrectTimezone() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME, d DATE, " + + "t TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + + DateTime dt = DateTime.Now; + MySqlCommand cmd = new MySqlCommand("select timediff( curtime(), utc_time() )", Connection); + string s = cmd.ExecuteScalar().ToString(); + int curroffset = int.Parse(s.Substring(0, s.IndexOf(':'))); + string prevTimeZone = ""; + // Ensure timezone is UTC + if (curroffset != 0) + { + cmd.CommandText = "SELECT @@global.time_zone"; + prevTimeZone = cmd.ExecuteScalar().ToString(); + cmd.CommandText = "set @@global.time_zone = '+0:00'"; + cmd.ExecuteNonQuery(); + // Refresh time_zone value + Connection.Close(); + Connection.Open(); + } + try + { + cmd.CommandText = string.Format("INSERT INTO `{0}`.Test VALUES(1, curdate(), NULL, NULL, current_timestamp())", Connection.Database); ; + cmd.ExecuteNonQuery(); + cmd.CommandText = string.Format("SELECT dt,ts FROM `{0}`.Test", Connection.Database); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + DateTime ts = reader.GetDateTime(1); + Assert.That(ts.Kind, Is.EqualTo(DateTimeKind.Utc)); + } + // Now set it to non-UTC + cmd.CommandText = "set @@global.time_zone = '+5:00'"; + cmd.ExecuteNonQuery(); + // Refresh time_zone value + Connection.Close(); + Connection.Open(); + cmd.CommandText = string.Format("SELECT dt,ts FROM `{0}`.Test", Connection.Database); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + DateTime ts = reader.GetDateTime(1); + Assert.That(ts.Kind, Is.EqualTo(DateTimeKind.Local)); + } + } + finally + { + if (!string.IsNullOrEmpty(prevTimeZone)) + { + // restore modified time zone if any + cmd.CommandText = string.Format("set @@global.time_zone = '{0}'", prevTimeZone); + cmd.ExecuteNonQuery(); + Connection.Close(); + Connection.Open(); + } + } + } + + /// + /// Bug #13881444 DateTime(3) column definition on + /// 5.6.x server is not processing Milliseconds value + /// correctly + /// + [Test] + public void CanSaveMillisecondsPrecision3WithPrepare() + { + + if (Version < new Version(5, 6)) return; + DateTime dt = new DateTime(2012, 3, 18, 23, 9, 7, 6); + MySqlCommand cmd = new MySqlCommand(); + + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME(3), PRIMARY KEY(id))"); + + using (MySqlConnection c = new MySqlConnection(Connection.ConnectionString)) + { + c.Open(); + cmd.Connection = c; + cmd.CommandText = "INSERT INTO Test VALUES(1, ?dt)"; + cmd.Parameters.AddWithValue("?dt", dt); + cmd.Prepare(); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT dt FROM Test"; + cmd.Parameters.Clear(); + cmd.Connection = Connection; + MySqlDataReader rdr = cmd.ExecuteReader(); + + while (rdr.Read()) + { + Assert.That(rdr.GetDateTime(0).ToString("hh:mm:ss.ffff"), Is.EqualTo("11:09:07.0060")); + } + rdr.Close(); + } + } + + [Test] + public void CanSaveMillisecondsPrecision3() + { + + if (Version < new Version(5, 6)) return; + DateTime dt = new DateTime(2012, 3, 18, 23, 9, 7, 6); + MySqlCommand cmd = new MySqlCommand(); + + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME(3), PRIMARY KEY(id))"); + cmd.Connection = Connection; + cmd.CommandText = "INSERT INTO Test VALUES(1, ?dt)"; + cmd.Parameters.AddWithValue("?dt", dt); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT dt FROM Test"; + cmd.Parameters.Clear(); + cmd.Connection = Connection; + MySqlDataReader rdr = cmd.ExecuteReader(); + + while (rdr.Read()) + { + Assert.That(rdr.GetDateTime(0).ToString("hh:mm:ss.ffff"), Is.EqualTo("11:09:07.0060")); + } + rdr.Close(); + } + + [Test] + public void CanSaveMicrosecondsPrecision4() + { + + if (Version < new Version(5, 6)) return; + DateTime dt = new DateTime(2012, 3, 18, 23, 9, 7, 6); + MySqlCommand cmd = new MySqlCommand(); + + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME(4), PRIMARY KEY(id))"); + cmd.Connection = Connection; + cmd.CommandText = "INSERT INTO Test VALUES(1, ?dt)"; + cmd.Parameters.AddWithValue("?dt", dt); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT dt FROM Test"; + cmd.Parameters.Clear(); + cmd.Connection = Connection; + MySqlDataReader rdr = cmd.ExecuteReader(); + + while (rdr.Read()) + { + Assert.That(rdr.GetDateTime(0).ToString("hh:mm:ss.ffff"), Is.EqualTo(dt.ToString("hh:mm:ss.ffff"))); + } + rdr.Close(); + } + + [Test] + public void ShowMicrosecondError() + { + MySqlCommand cmd = new MySqlCommand(); + cmd.CommandText = "SELECT NOW() + INTERVAL 123456 MICROSECOND"; + cmd.Parameters.Clear(); + cmd.Connection = Connection; + string date = cmd.ExecuteScalar().ToString(); + DateTime temp; + Assert.That(DateTime.TryParse(date, out temp)); + } + + /// + /// Testing new functionality for Server 5.6 + /// On WL 5874 + /// + [Test] + public void CanDefineCurrentTimeStampAsDefaultOnDateTime() + { + if (Version < new Version(5, 6, 5)) return; + MySqlCommand cmd = new MySqlCommand(); + cmd.CommandText = " CREATE TABLE t1 (id int, a DATETIME DEFAULT CURRENT_TIMESTAMP );"; + cmd.Parameters.Clear(); + + cmd.Connection = Connection; + var result = cmd.ExecuteNonQuery(); + + cmd.CommandText = " INSERT INTO t1 (id) values(1);"; + cmd.ExecuteNonQuery(); + + cmd.CommandText = " SELECT a from t1"; + var reader = cmd.ExecuteReader(); + + DateTime tempDate = new DateTime(); + + while (reader.Read()) + { + Assert.That(DateTime.TryParse(reader.GetDateTime(0).ToString(), out tempDate)); + } + reader.Close(); + } + + [Test] + public void ReadAndWriteMicroseconds() + { + if (Version < new Version(5, 6, 5)) return; + MySqlCommand cmd = new MySqlCommand(); + cmd.CommandText = "CREATE TABLE ReadAndWriteMicroseconds (id int, t3 TIME(3), t6 TIME(6), d6 DATETIME(6));"; + cmd.Connection = Connection; + var result = cmd.ExecuteNonQuery(); + + DateTime milliseconds = new DateTime(1, 1, 1, 15, 45, 23, 123); + DateTime microseconds = milliseconds.AddTicks(4560); + + cmd.CommandText = "INSERT INTO ReadAndWriteMicroseconds (id, t3, t6, d6) values(1, @t3, @t6, @d6);"; + cmd.Parameters.AddWithValue("t3", new TimeSpan(milliseconds.Ticks)); + cmd.Parameters.AddWithValue("t6", new TimeSpan(microseconds.Ticks)); + cmd.Parameters.AddWithValue("d6", microseconds); + cmd.ExecuteNonQuery(); + + cmd.CommandText = " SELECT * from ReadAndWriteMicroseconds"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetTimeSpan(1).Ticks, Is.EqualTo(milliseconds.Ticks)); + Assert.That(reader.GetTimeSpan(2).Ticks, Is.EqualTo(microseconds.Ticks)); + Assert.That(reader.GetDateTime(3).Ticks, Is.EqualTo(microseconds.Ticks)); + Assert.That(reader.GetDateTime(3).Millisecond, Is.EqualTo(microseconds.Millisecond)); + Assert.That(reader.GetMySqlDateTime(3).Millisecond, Is.EqualTo(microseconds.Millisecond)); + Assert.That(reader.GetMySqlDateTime(3).Microsecond, Is.EqualTo((microseconds.Ticks % 10000000) / 10)); + } + } + + [Test] + public void TimeZoneOffset() + { + string timeZone = "-12:00"; + int timeZoneHours = -12; + if (DateTime.UtcNow.Hour >= 12) + { + timeZone = "+13:00"; + timeZoneHours = 13; + } + + ExecuteSQL(string.Format("SET @@global.time_zone='{0}'", timeZone)); + + try + { + using (MySqlConnection conn2 = GetConnection()) + { + Assert.That(conn2.driver.timeZoneOffset, Is.EqualTo(timeZoneHours)); + } + } + finally + { + ExecuteSQL("SET @@global.time_zone='SYSTEM'"); + } + } + + /// + /// Bug 28156187 NET/CONNECTOR MYSQLDATAREADER FETCHES WRONG TIMEZONE + /// + [Test] + public void TimeZoneOffsetUsingReader() + { + ExecuteSQL(@"CREATE TABLE `timeZoneOffsetTable` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT, + `name` varchar(40) DEFAULT NULL, `mytimestampcolumn` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY(`id`)) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8; "); + + ExecuteSQL("INSERT INTO `timeZoneOffsetTable` (`name`) VALUES ('Name1')"); + + using (var conn = GetConnection()) + using (var cmd = new MySqlCommand("SELECT mytimestampcolumn FROM timeZoneOffsetTable;", conn)) + { + var reader = cmd.ExecuteReader(); + reader.Read(); + + var myTimestampSb = (DateTime)reader["mytimestampcolumn"]; + var myTimestampGdt = reader.GetDateTime("mytimestampcolumn"); + + Assert.That(myTimestampSb.Kind == myTimestampGdt.Kind); + Assert.That(conn.driver.timeZoneOffset == ((DateTimeOffset)myTimestampSb).Offset.Hours, $"Driver: {conn.driver.timeZoneOffset}; Sb: {((DateTimeOffset)myTimestampSb).Offset.Hours}"); + Assert.That(conn.driver.timeZoneOffset == ((DateTimeOffset)myTimestampGdt).Offset.Hours); + + reader.Close(); + } + } + + #region WL14389 + /// + /// Bug 17924388 + /// + [Test, Description("MySQL Datetime Milliseconds ")] + public void MilisecondsWithTimeColumn() + { + + using (var conn = new MySqlConnection(Settings.ConnectionString)) + { + var cmd = new MySqlCommand(); + var timeValue = "00:01:32.123456789"; + conn.Open(); + cmd.Connection = conn; + cmd.CommandText = "DROP TABLE IF EXISTS T"; + cmd.ExecuteNonQuery(); + + cmd.CommandText = "CREATE TABLE T (dt TIME(6));"; + cmd.ExecuteNonQuery(); + + cmd.CommandText = $"INSERT INTO T (dt) VALUES('{timeValue}');"; + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT dt FROM T;"; + cmd.ExecuteNonQuery(); + + using (var reader = cmd.ExecuteReader()) + { + reader.Read(); + var val = reader.GetValue(0); + Assert.That(val.ToString(), Does.StartWith(timeValue.Substring(0, 14))); + } + + cmd.CommandText = "DROP TABLE IF EXISTS T"; + cmd.ExecuteNonQuery(); + + cmd.CommandText = "CREATE TABLE T (dt TIME(3));"; + cmd.ExecuteNonQuery(); + + cmd.CommandText = $"INSERT INTO T (dt) VALUES('{timeValue}');"; + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT dt FROM T;"; + cmd.ExecuteNonQuery(); + + using (var reader = cmd.ExecuteReader()) + { + reader.Read(); + var val = reader.GetTimeSpan(0); + Assert.That(val.ToString(), Does.StartWith(timeValue.Substring(0, 12))); + } + } + } + #endregion WL14389 + + /// + /// Bug #33539844 - Parser for TIME values differ between Plain and Prepared Statements (Server bug) + /// + [Test] + public void TimeParserForPlainAndPreparedStmts() + { + string timeValue = "10-11-12"; + ExecuteSQL("CREATE TABLE Test (t TIME)"); + + // Plain statement + Assert.Throws(() => ExecuteSQL($"INSERT INTO Test VALUES ('{timeValue}')")); + // Prepare statement + using (var cmd = new MySqlCommand("INSERT INTO Test VALUES (?)", Connection)) + { + cmd.Parameters.AddWithValue("t", timeValue); + cmd.Prepare(); + Assert.Throws(() => cmd.ExecuteNonQuery()); + } + } + + /// + /// Bug #24495619 - MySqlDateTime type bug in .NET provider + /// Added missing implementation of the IConvertible interface + /// + [Test] + public void IConvertibleImplementation() + { + var mySqlDateTime = new MySqlDateTime(DateTime.Now); + + Assert.That(((IConvertible)mySqlDateTime).GetTypeCode(), Is.EqualTo(TypeCode.DateTime)); + Assert.That(((IConvertible)mySqlDateTime).ToString(), Is.Not.Null); + Assert.That(Convert.ToString(mySqlDateTime), Is.Not.Null); + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/DnsSrvTests.cs b/MySQL.Data/tests/MySql.Data.Tests/DnsSrvTests.cs new file mode 100644 index 000000000..e17739ae7 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/DnsSrvTests.cs @@ -0,0 +1,132 @@ +// Copyright © 2019, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using MySql.Data.Common.DnsClient; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace MySql.Data.MySqlClient.Tests +{ + /// + /// WL13368 - DNS SRV Support + /// + public class DnsSrvTests : TestBase + { + [TestCase("server=localhost;dns=true;")] + [TestCase("server=localhost;dns_srv=false;")] + [TestCase("server=localhost;dns srv=true;")] + [TestCase("server=localhost;dns-srv=foo;")] + [TestCase("server=localhost;dnssrv=3;")] + public void DnsSrvConnectionStringInvalidOptions(string connString) + { + var exception = Assert.Throws(() => new MySqlConnection(connString)); + } + + [TestCase("server=localhost;port=33060;dns-srv=true;", "Specifying a port number with DNS SRV lookup is not permitted")] + [TestCase("server=localhost,10.10.10.10;dns-srv=true;", "Specifying multiple host names with DNS SRV lookup is not permitted")] + [TestCase("host=localhost,10.10.10.10;dns-srv=TRUE;", "Specifying multiple host names with DNS SRV lookup is not permitted")] + [TestCase("server=(address=localhost,priority=100), (address=10.10.10.10,priority=90);dns-srv=true;", "Specifying multiple host names with DNS SRV lookup is not permitted")] + [TestCase("server=localhost;protocol=unix;Dns-Srv=true;", "Using Unix domain sockets with DNS SRV lookup is not permitted")] + [TestCase("server=localhost;protocol=unixSocket;dns-srv=true;", "Using Unix domain sockets with DNS SRV lookup is not permitted")] + [TestCase("server=localhost;connectionprotocol=unix;DnsSrv=true;", "Using Unix domain sockets with DNS SRV lookup is not permitted")] + public void DnsSrvConnectionStringInvalidConfiguration(string connString, string exceptionMessage) + { + var exception = Assert.Throws(() => new MySqlConnection(connString)); + Assert.That(exception.Message, Is.EqualTo(exceptionMessage)); + } + + [TestCase("server=localhost;port=33060;dns-srv=false;")] + [TestCase("server=localhost,10.10.10.10;dns-srv=false;")] + [TestCase("server=localhost,10.10.10.10;dns-srv=False;")] + [TestCase("server=(address=localhost,priority=100);DnsSrv=FALSE;")] + [TestCase("server=(address=localhost,priority=100),;dns-srv=false;")] + [TestCase("server=localhost;protocol=unix;DNS-SRV=FALSE;")] + [TestCase("server=localhost;protocol=unixSocket;dns-srv=false;")] + [TestCase("server=localhost;protocol=unix;dns-srv=false;")] + public void DnsSrvConnectionStringValidConfiguration(string connString) + { + var conn = new MySqlConnection(connString); + Assert.That(conn, Is.Not.Null); + } + + [Test] + public void DnsSrvConnectionAnonymousTypeInvalidConfiguration() + { + var sb = new MySqlConnectionStringBuilder(); + sb.DnsSrv = true; + sb.Port = 3306; + sb.Server = "localhost"; + var exception = Assert.Throws(() => new MySqlConnection(sb.ConnectionString)); + Assert.That(exception.Message, Is.EqualTo(Resources.DnsSrvInvalidConnOptionPort)); + + sb = new MySqlConnectionStringBuilder(); + sb.DnsSrv = true; + sb.Server = "_mysqlx._tcp.foo.abc.com"; + sb.ConnectionProtocol = MySqlConnectionProtocol.Unix; + exception = Assert.Throws(() => new MySqlConnection(sb.ConnectionString)); + Assert.That(exception.Message, Is.EqualTo(Resources.DnsSrvInvalidConnOptionUnixSocket)); + + sb = new MySqlConnectionStringBuilder(); + sb.DnsSrv = true; + sb.Server = "localhost, 10.10.10.10"; + sb.ConnectionProtocol = MySqlConnectionProtocol.Unix; + exception = Assert.Throws(() => new MySqlConnection(sb.ConnectionString)); + Assert.That(exception.Message, Is.EqualTo(Resources.DnsSrvInvalidConnOptionMultihost)); + } + + [Test] + public void DnsSrvRecordsTest() + { + DnsSrvRecord[] dnsRecords = + { + new DnsSrvRecord(3306, 100, "target_1", 0), + new DnsSrvRecord(3306, 120, "target_2", 0), + new DnsSrvRecord(3306, 80, "target_3", 0), + new DnsSrvRecord(3306, 70, "target_4", 10), + new DnsSrvRecord(3306, 60, "target_5", 50) + }; + + IEnumerable expectedOrder = new[] + { + new DnsSrvRecord(3306, 60, "target_5", 50), + new DnsSrvRecord(3306, 70, "target_4", 10), + new DnsSrvRecord(3306, 80, "target_3", 0), + new DnsSrvRecord(3306, 100, "target_1", 0), + new DnsSrvRecord(3306, 120, "target_2", 0) + }; + + var sortedRecords = DnsSrv.SortSrvRecords(dnsRecords.ToList()); + + Assert.That(sortedRecords.Select(r => r.Target).SequenceEqual(expectedOrder.Select(r => r.Target))); + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/EventTests.cs b/MySQL.Data/tests/MySql.Data.Tests/EventTests.cs new file mode 100644 index 000000000..81e95eb60 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/EventTests.cs @@ -0,0 +1,77 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Data; +using NUnit.Framework; +using NUnit.Framework.Legacy; + +namespace MySql.Data.MySqlClient.Tests +{ + public class EventTests : TestBase + { + [Test] + [Property("Category", "Security")] + public void Warnings() + { + ExecuteSQL("CREATE TABLE Test (name VARCHAR(10))"); + + using (var connection = GetConnection(false)) + { + MySqlCommand cmd = new MySqlCommand("SET SQL_MODE=''", connection); + cmd.ExecuteNonQuery(); + + connection.InfoMessage += new MySqlInfoMessageEventHandler(WarningsInfoMessage); + + cmd.CommandText = "INSERT INTO Test VALUES ('12345678901')"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + } + } + } + + private void WarningsInfoMessage(object sender, MySqlInfoMessageEventArgs args) + { + Assert.That(args.errors, Has.One.Items); + } + + [Test] + [Property("Category", "Security")] + public void StateChange() + { + using (var connection = GetConnection(false)) + { + connection.StateChange += new StateChangeEventHandler(StateChangeHandler); + connection.Close(); + } + } + + private void StateChangeHandler(object sender, StateChangeEventArgs e) + { + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/ExceptionTests.cs b/MySQL.Data/tests/MySql.Data.Tests/ExceptionTests.cs new file mode 100644 index 000000000..cd3059b6d --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/ExceptionTests.cs @@ -0,0 +1,165 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Data; +using System.Reflection; +using System.Threading; + +namespace MySql.Data.MySqlClient.Tests +{ + public class ExceptionTests : TestBase + { + private string maxConnections; + + protected override void Cleanup() + { + if (!string.IsNullOrEmpty(maxConnections)) + ExecuteSQL($"SET GLOBAL max_connections = {maxConnections};"); + } + + [Test] + public void Timeout() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100))"); + for (int i = 1; i < 10; i++) + ExecuteSQL("INSERT INTO Test VALUES (" + i + ", 'This is a long text string that I am inserting')"); + + // we create a new connection so our base one is not closed + var connection = GetConnection(false); + KillConnection(connection); + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", connection); + + Exception ex = Assert.Throws(() => cmd.ExecuteReader()); + Assert.That(ex.Message, Is.EqualTo("Connection must be valid and open.")); + Assert.That(connection.State, Is.EqualTo(ConnectionState.Closed)); + connection.Close(); + + } + /// + /// Bug #27436 Add the MySqlException.Number property value to the Exception.Data Dictionary + /// + [Test] + public void ErrorData() + { + MySqlCommand cmd = new MySqlCommand("SELEDT 1", Connection); + try + { + cmd.ExecuteNonQuery(); + } + catch (Exception ex) + { + Assert.That(ex.Data["Server Error Code"], Is.EqualTo(1064)); + } + } + + /// + /// WL-14393 Improve timeout error messages + /// + [Test] + public void TimeoutErrorMessages() + { + if (Version < new Version("8.0.24")) return; + + var builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.SslMode = MySqlSslMode.Disabled; + builder.AllowPublicKeyRetrieval = true; + builder.Database = ""; + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + MySqlCommand command = new MySqlCommand("SET SESSION wait_timeout=4;", connection); + command.ExecuteNonQuery(); + Thread.Sleep(6000); + command = new MySqlCommand("SELECT CONNECTION_ID();", connection); + var ex = Assert.Throws(() => command.ExecuteScalar()); + Assert.That(ex.Number, Is.EqualTo((int)MySqlErrorCode.ErrorClientInteractionTimeout)); + } + } + + /// + /// Bug #32150115 RE-OPEN THE BUG #89850 THROWING EXCEPTION IF ACCESS TO GRANTED FOR TABLE + /// + [Test] + public void UngrantedAccessException() + { + string host = Host == "localhost" ? Host : "%"; + string password = "anypwd123"; + string user = CreateUser("bug", password); + ExecuteSQL($"GRANT INSERT ON `{BaseDBName}`.* TO '{user}'@'{host}';", true); + var query = "SELECT * FROM INFORMATION_SCHEMA.tables"; + + using var connection = new MySqlConnection($"server={Host};port={Port};userid={user};password={password};database={Connection.Database};"); + using var cmd = new MySqlCommand(query, connection); + connection.Open(); + int limit = 10; + int count = 0; + using (var reader = cmd.ExecuteReader()) + { + if (reader.HasRows) + { + while (reader.Read() && count < limit) + { + Assert.DoesNotThrow(() => reader.GetString(0)); + count += 1; + } + } + } + } + + /// + /// Bug #21830667 EXCEPTION.NUMBER ALWAYS 0 + /// + [TestCase("Port", 1455, 1042)] + [TestCase("Database", "nonExistingDB", 1049)] + [TestCase("UserID", "nonExistingUser", 1045)] // Check server bug Bug#36527984 in case of failure + [TestCase("Server", "nonExistingServer", 1042)] + [TestCase("MaxConnections", "", 1040)] + public void AuthenticationExceptionNumber(string propertyName, object propertyValue, int exNumber) + { + MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + if (propertyName != "MaxConnections") + { + PropertyInfo info = builder.GetType().GetProperty(propertyName); + info.SetValue(builder, Convert.ChangeType(propertyValue, info.PropertyType)); + } + using (MySqlConnection conn = new MySqlConnection(builder.ConnectionString)) + { + if (exNumber == 1040) + { + maxConnections = ExecuteScalar("SELECT @@GLOBAL.max_connections;").ToString(); + ExecuteSQL("SET GLOBAL max_connections = 1;"); + } + MySqlException exDefault = Assert.Throws(() => conn.Open()); + Assert.That(exDefault.Number, Is.EqualTo(exNumber)); + } + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/BlobTestsPipe.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/BlobTestsPipe.cs new file mode 100644 index 000000000..56fd2cee3 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/BlobTestsPipe.cs @@ -0,0 +1,41 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework.Internal; + +namespace MySql.Data.MySqlClient.Tests +{ + public class BlobTestsPipe : BlobTests + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.ConnectionProtocol = MySqlConnectionProtocol.NamedPipe; + settings.SslMode = MySqlSslMode.None; + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/BlobTestsPipeCompressed.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/BlobTestsPipeCompressed.cs new file mode 100644 index 000000000..0f9d7fd81 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/BlobTestsPipeCompressed.cs @@ -0,0 +1,45 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +using NUnit.Framework.Internal; +using System.ComponentModel; + +namespace MySql.Data.MySqlClient.Tests +{ + [Category("Compressed")] + public class BlobTestsPipeCompressed : BlobTests + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.ConnectionProtocol = MySqlConnectionProtocol.NamedPipe; + settings.UseCompression = true; + settings.SslMode = MySqlSslMode.None; + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/BlobTestsSharedMem.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/BlobTestsSharedMem.cs new file mode 100644 index 000000000..f2f3af134 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/BlobTestsSharedMem.cs @@ -0,0 +1,42 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +using NUnit.Framework.Internal; + +namespace MySql.Data.MySqlClient.Tests +{ + public class BlobTestsSharedMem : BlobTests + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.ConnectionProtocol = MySqlConnectionProtocol.SharedMemory; + settings.SslMode = MySqlSslMode.None; + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/BlobTestsSharedMemCompressed.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/BlobTestsSharedMemCompressed.cs new file mode 100644 index 000000000..af916620c --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/BlobTestsSharedMemCompressed.cs @@ -0,0 +1,46 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +using NUnit.Framework.Internal; +using System.ComponentModel; + +namespace MySql.Data.MySqlClient.Tests +{ + [Category("Compressed")] + public class BlobTestsSharedMemCompressed : BlobTests + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.ConnectionProtocol = MySqlConnectionProtocol.SharedMemory; + settings.UseCompression = true; + settings.SslMode = MySqlSslMode.None; + } + + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/CmdTestsPipe.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/CmdTestsPipe.cs new file mode 100644 index 000000000..d805b0efd --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/CmdTestsPipe.cs @@ -0,0 +1,40 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +namespace MySql.Data.MySqlClient.Tests +{ + public class CmdTestsPipe : CmdTests + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.ConnectionProtocol = MySqlConnectionProtocol.NamedPipe; + settings.SslMode = MySqlSslMode.None; + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/CmdTestsPipeCompressed.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/CmdTestsPipeCompressed.cs new file mode 100644 index 000000000..98e341eac --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/CmdTestsPipeCompressed.cs @@ -0,0 +1,43 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework.Internal; +using System; + +namespace MySql.Data.MySqlClient.Tests +{ + public class CmdTestsPipeCompressed : CmdTests + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.ConnectionProtocol = MySqlConnectionProtocol.NamedPipe; + settings.SslMode = MySqlSslMode.None; + settings.UseCompression = true; + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/CmdTestsSharedMem.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/CmdTestsSharedMem.cs new file mode 100644 index 000000000..99144722e --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/CmdTestsSharedMem.cs @@ -0,0 +1,41 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework.Internal; + +namespace MySql.Data.MySqlClient.Tests +{ + public class CmdTestsSharedMem : CmdTests + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.ConnectionProtocol = MySqlConnectionProtocol.SharedMemory; + settings.SslMode = MySqlSslMode.None; + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/CmdTestsSharedmemCompressed.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/CmdTestsSharedmemCompressed.cs new file mode 100644 index 000000000..94954727c --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/CmdTestsSharedmemCompressed.cs @@ -0,0 +1,41 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +namespace MySql.Data.MySqlClient.Tests +{ + public class CmdTestsSharedMemCompressed : CmdTests + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.ConnectionProtocol = MySqlConnectionProtocol.SharedMemory; + settings.SslMode = MySqlSslMode.None; + settings.UseCompression = true; + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/CultureTests.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/CultureTests.cs new file mode 100644 index 000000000..4fde4772e --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/CultureTests.cs @@ -0,0 +1,188 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System.Threading; +using System.Globalization; +using System.Data; + +namespace MySql.Data.MySqlClient.Tests +{ + public class CultureTests : TestBase + { + protected override void Cleanup() + { + ExecuteSQL(String.Format("DROP TABLE IF EXISTS `{0}`.Test", Connection.Database)); + } + + [Test] + public void TestFloats() + { + InternalTestFloats(false); + } + + [Test] + public void TestFloatsPrepared() + { + InternalTestFloats(true); + } + + + private void InternalTestFloats(bool prepared) + { + CultureInfo curCulture = Thread.CurrentThread.CurrentCulture; + CultureInfo curUICulture = Thread.CurrentThread.CurrentUICulture; + CultureInfo c = new CultureInfo("de-DE"); + Thread.CurrentThread.CurrentCulture = c; + Thread.CurrentThread.CurrentUICulture = c; + + ExecuteSQL("CREATE TABLE Test (fl FLOAT, db DOUBLE, dec1 DECIMAL(5,2))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?fl, ?db, ?dec)", Connection); + cmd.Parameters.Add("?fl", MySqlDbType.Float); + cmd.Parameters.Add("?db", MySqlDbType.Double); + cmd.Parameters.Add("?dec", MySqlDbType.Decimal); + cmd.Parameters[0].Value = 2.3; + cmd.Parameters[1].Value = 4.6; + cmd.Parameters[2].Value = 23.82; + if (prepared) + cmd.Prepare(); + int count = cmd.ExecuteNonQuery(); + Assert.That(count, Is.EqualTo(1)); + + try + { + cmd.CommandText = "SELECT * FROM Test"; + if (prepared) cmd.Prepare(); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That((decimal)reader.GetFloat(0), Is.EqualTo((decimal)2.3)); + Assert.That(reader.GetDouble(1), Is.EqualTo(4.6)); + Assert.That(reader.GetDecimal(2), Is.EqualTo((decimal)23.82)); + } + } + finally + { + Thread.CurrentThread.CurrentCulture = curCulture; + Thread.CurrentThread.CurrentUICulture = curUICulture; + } + } + + /// + /// Bug #8228 turkish character set causing the error + /// + [Test] + public void Turkish() + { + CultureInfo curCulture = Thread.CurrentThread.CurrentCulture; + CultureInfo curUICulture = Thread.CurrentThread.CurrentUICulture; + CultureInfo c = new CultureInfo("tr-TR"); + Thread.CurrentThread.CurrentCulture = c; + Thread.CurrentThread.CurrentUICulture = c; + + using (MySqlConnection newConn = new MySqlConnection(Root.ConnectionString)) + { + newConn.Open(); + } + + Thread.CurrentThread.CurrentCulture = curCulture; + Thread.CurrentThread.CurrentUICulture = curUICulture; + } + + /// + /// Bug #29931 Connector/NET does not handle Saudi Hijri calendar correctly + /// + [Test] + public void ArabicCalendars() + { + ExecuteSQL("CREATE TABLE test(dt DATETIME)"); + ExecuteSQL("INSERT INTO test VALUES ('2007-01-01 12:30:45')"); + + CultureInfo curCulture = Thread.CurrentThread.CurrentCulture; + CultureInfo curUICulture = Thread.CurrentThread.CurrentUICulture; + CultureInfo c = new CultureInfo("ar-SA"); + Thread.CurrentThread.CurrentCulture = c; + Thread.CurrentThread.CurrentUICulture = c; + + MySqlCommand cmd = new MySqlCommand("SELECT dt FROM test", Connection); + DateTime dt = (DateTime)cmd.ExecuteScalar(); + Assert.That(dt.Year, Is.EqualTo(2007)); + Assert.That(dt.Month, Is.EqualTo(1)); + Assert.That(dt.Day, Is.EqualTo(1)); + Assert.That(dt.Hour, Is.EqualTo(12)); + Assert.That(dt.Minute, Is.EqualTo(30)); + Assert.That(dt.Second, Is.EqualTo(45)); + + Thread.CurrentThread.CurrentCulture = curCulture; + Thread.CurrentThread.CurrentUICulture = curUICulture; + } + + /// + /// Bug #52187 FunctionsReturnString=true messes up decimal separator + /// + [Test] + public void FunctionsReturnStringAndDecimal() + { + ExecuteSQL("CREATE TABLE bug52187a (a decimal(5,2) not null)"); + ExecuteSQL("CREATE TABLE bug52187b (b decimal(5,2) not null)"); + ExecuteSQL("insert into bug52187a values (1.25)"); + ExecuteSQL("insert into bug52187b values (5.99)"); + + CultureInfo curCulture = Thread.CurrentThread.CurrentCulture; + CultureInfo curUICulture = Thread.CurrentThread.CurrentUICulture; + CultureInfo c = new CultureInfo("pt-PT"); + Thread.CurrentThread.CurrentCulture = c; + Thread.CurrentThread.CurrentUICulture = c; + + string connStr = Connection.ConnectionString + ";functions return string=true"; + try + { + using (MySqlConnection con = new MySqlConnection(connStr)) + { + con.Open(); + MySqlDataAdapter da = new MySqlDataAdapter( + "select *,(select b from bug52187b) as field_b from bug52187a", con); + DataTable dt = new DataTable(); + da.Fill(dt); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + Assert.That((decimal)dt.Rows[0][0], Is.EqualTo((decimal)1.25)); + Assert.That((decimal)dt.Rows[0][1], Is.EqualTo((decimal)5.99)); + } + } + finally + { + Thread.CurrentThread.CurrentCulture = curCulture; + Thread.CurrentThread.CurrentUICulture = curUICulture; + } + + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/DataTypeTests.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/DataTypeTests.cs new file mode 100644 index 000000000..cf9c4a195 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/DataTypeTests.cs @@ -0,0 +1,129 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System.Data; +using System.Data.Common; + +namespace MySql.Data.MySqlClient.Tests +{ + public partial class DataTypeTests + { + /// + /// Bug #10486 MySqlDataAdapter.Update error for decimal column + /// + [Test] + public void UpdateDecimalColumns() + { + ExecuteSQL("CREATE TABLE Test (id int not null auto_increment primary key, " + + "dec1 decimal(10,1))"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + DataTable dt = new DataTable(); + da.Fill(dt); + DataRow row = dt.NewRow(); + row["id"] = DBNull.Value; + row["dec1"] = 23.4; + dt.Rows.Add(row); + da.Update(dt); + + dt.Clear(); + da.Fill(dt); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + Assert.That(dt.Rows[0]["id"], Is.EqualTo(1)); + Assert.That(Convert.ToDecimal(dt.Rows[0]["dec1"]), Is.EqualTo((decimal)23.4)); + cb.Dispose(); + } + + /// + /// Bug #17375 CommandBuilder ignores Unsigned flag at Parameter creation + /// Bug #15274 Use MySqlDbType.UInt32, throwed exception 'Only byte arrays can be serialize' + /// + [Test] + public void UnsignedTypes() + { + ExecuteSQL("CREATE TABLE Test (b TINYINT UNSIGNED PRIMARY KEY)"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + + DataTable dt = new DataTable(); + da.Fill(dt); + + DataView dv = new DataView(dt); + DataRowView row; + + row = dv.AddNew(); + row["b"] = 120; + row.EndEdit(); + da.Update(dv.Table); + + row = dv.AddNew(); + row["b"] = 135; + row.EndEdit(); + da.Update(dv.Table); + cb.Dispose(); + + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE Test (b MEDIUMINT UNSIGNED PRIMARY KEY)"); + ExecuteSQL("INSERT INTO Test VALUES(20)"); + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test WHERE (b > ?id)", Connection); + cmd.Parameters.Add("?id", MySqlDbType.UInt16).Value = 10; + using (MySqlDataReader dr = cmd.ExecuteReader()) + { + dr.Read(); + Assert.That(dr.GetUInt16(0), Is.EqualTo(20)); + } + } + + /// + /// Bug #48171 MySqlDataReader.GetSchemaTable() returns 0 in "NumericPrecision" for newdecimal + /// + [Test] + public void DecimalPrecision() + { + ExecuteSQL("DROP TABLE IF EXISTS test"); + ExecuteSQL("CREATE TABLE test(a decimal(35,2), b decimal(36,2), c decimal(36,2) unsigned)"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM test", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + DataTable dt = reader.GetSchemaTable(); + DataRow columnDefinition = dt.Rows[0]; + Assert.That(columnDefinition[SchemaTableColumn.NumericPrecision], Is.EqualTo(35)); + columnDefinition = dt.Rows[1]; + Assert.That(columnDefinition[SchemaTableColumn.NumericPrecision], Is.EqualTo(36)); + columnDefinition = dt.Rows[2]; + Assert.That(columnDefinition[SchemaTableColumn.NumericPrecision], Is.EqualTo(36)); + } + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/DateTimeTests.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/DateTimeTests.cs new file mode 100644 index 000000000..de1d3a3a2 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/DateTimeTests.cs @@ -0,0 +1,200 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using MySql.Data.Types; +using System.Data; +using System.Globalization; +using System.Threading; + +namespace MySql.Data.MySqlClient.Tests +{ + public partial class DateTimeTests + { + /// + /// Bug #9619 Cannot update row using DbDataAdapter when row contains an invalid date + /// Bug #15112 MySqlDateTime Constructor + /// + [Test] + public void TestAllowZeroDateTime() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME, d DATE, " + + "t TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + ExecuteSQL("INSERT INTO Test (id, d, dt) VALUES (1, '0000-00-00', '0000-00-00 00:00:00')"); + + using (MySqlConnection c = new MySqlConnection( + Connection.ConnectionString + ";pooling=false;AllowZeroDatetime=true")) + { + c.Open(); + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", c); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + + Assert.That(reader.GetValue(1) is MySqlDateTime); + Assert.That(reader.GetValue(2) is MySqlDateTime); + + Assert.That(!reader.GetMySqlDateTime(1).IsValidDateTime); + Assert.That(!reader.GetMySqlDateTime(2).IsValidDateTime); + + Exception ex = Assert.Throws(() =>reader.GetDateTime(1)); + Assert.That(ex.Message, Is.EqualTo("Unable to convert MySQL date/time value to System.DateTime")); + } + + DataTable dt = new DataTable(); + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", c); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + da.Fill(dt); + dt.Rows[0]["id"] = 2; + DataRow row = dt.NewRow(); + row["id"] = 3; + row["d"] = new MySqlDateTime("2003-9-24"); + row["dt"] = new MySqlDateTime("0000/0/00 00:00:00"); + dt.Rows.Add(row); + + da.Update(dt); + + dt.Clear(); + da.Fill(dt); + Assert.That(dt.Rows.Count, Is.EqualTo(2)); + MySqlDateTime date = (MySqlDateTime)dt.Rows[1]["d"]; + Assert.That(date.Year, Is.EqualTo(2003)); + Assert.That(date.Month, Is.EqualTo(9)); + Assert.That(date.Day, Is.EqualTo(24)); + cb.Dispose(); + } + } + + [Test] + public void SortingMySqlDateTimes() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME, d DATE, " + + "t TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + + ExecuteSQL("INSERT INTO Test (id, dt) VALUES (1, '2004-10-01')"); + ExecuteSQL("INSERT INTO Test (id, dt) VALUES (2, '2004-10-02')"); + ExecuteSQL("INSERT INTO Test (id, dt) VALUES (3, '2004-11-01')"); + ExecuteSQL("INSERT INTO Test (id, dt) VALUES (4, '2004-11-02')"); + + CultureInfo curCulture = Thread.CurrentThread.CurrentCulture; + CultureInfo curUICulture = Thread.CurrentThread.CurrentUICulture; + CultureInfo cul = new CultureInfo("en-GB"); + Thread.CurrentThread.CurrentCulture = cul; + Thread.CurrentThread.CurrentUICulture = cul; + + using (MySqlConnection c = new MySqlConnection(Connection.ConnectionString + ";allow zero datetime=yes")) + { + MySqlDataAdapter da = new MySqlDataAdapter("SELECT dt FROM Test", c); + DataTable dt = new DataTable(); + da.Fill(dt); + + DataView dv = dt.DefaultView; + dv.Sort = "dt ASC"; + + Assert.That(Convert.ToDateTime(dv[0]["dt"]).Date, Is.EqualTo(new DateTime(2004, 10, 1).Date)); + Assert.That(Convert.ToDateTime(dv[1]["dt"]).Date, Is.EqualTo(new DateTime(2004, 10, 2).Date)); + Assert.That(Convert.ToDateTime(dv[2]["dt"]).Date, Is.EqualTo(new DateTime(2004, 11, 1).Date)); + Assert.That(Convert.ToDateTime(dv[3]["dt"]).Date, Is.EqualTo(new DateTime(2004, 11, 2).Date)); + + Thread.CurrentThread.CurrentCulture = curCulture; + Thread.CurrentThread.CurrentUICulture = curUICulture; + } + } + + [Test] + public void InsertDateTimeValue() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME, d DATE, " + + "t TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + + using (MySqlConnection c = new MySqlConnection(Connection.ConnectionString + + ";allow zero datetime=yes")) + { + c.Open(); + MySqlDataAdapter da = new MySqlDataAdapter("SELECT id, dt FROM Test", c); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + + DataTable dt = new DataTable(); + dt.Columns.Add(new DataColumn("id", typeof(int))); + dt.Columns.Add(new DataColumn("dt", typeof(DateTime))); + + da.Fill(dt); + + DateTime now = DateTime.Now; + DataRow row = dt.NewRow(); + row["id"] = 1; + row["dt"] = now; + dt.Rows.Add(row); + da.Update(dt); + + dt.Clear(); + da.Fill(dt); + cb.Dispose(); + + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + Assert.That(((DateTime)dt.Rows[0]["dt"]).Date, Is.EqualTo(now.Date)); + } + } + + [Test] + public void DateTimeInDataTable() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME, d DATE, " + + "t TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + + ExecuteSQL("INSERT INTO Test VALUES(1, Now(), '0000-00-00', NULL, NULL)"); + + using (MySqlConnection c = new MySqlConnection( + Connection.ConnectionString + ";pooling=false;AllowZeroDatetime=true")) + { + c.Open(); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", c); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + DataTable dt = new DataTable(); + + da.Fill(dt); + DataRow row = dt.NewRow(); + row["id"] = 2; + row["dt"] = new MySqlDateTime(DateTime.Now); + row["d"] = new MySqlDateTime(DateTime.Now); + row["t"] = new TimeSpan(1, 1, 1); + row["ts"] = DBNull.Value; + dt.Rows.Add(row); + da.Update(dt); + + dt.Rows.Clear(); + da.Fill(dt); + Assert.That(dt.Rows.Count, Is.EqualTo(2)); + cb.Dispose(); + } + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/GetSchemaTests.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/GetSchemaTests.cs new file mode 100644 index 000000000..d0928792e --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/GetSchemaTests.cs @@ -0,0 +1,809 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Data; +using System.Linq; + +namespace MySql.Data.MySqlClient.Tests +{ + public class GetSchemaTests : TestBase + { + protected override void Cleanup() + { + ExecuteSQL(String.Format("DROP TABLE IF EXISTS `{0}`.Test", Connection.Database)); + } + + [Test] + public void Collections() + { + DataTable dt = Connection.GetSchema(); + + int row = 0; + Assert.That(dt.Rows[row++][0], Is.EqualTo("MetaDataCollections")); + Assert.That(dt.Rows[row++][0], Is.EqualTo("DataSourceInformation")); + Assert.That(dt.Rows[row++][0], Is.EqualTo("DataTypes")); + Assert.That(dt.Rows[row++][0], Is.EqualTo("Restrictions")); + Assert.That(dt.Rows[row++][0], Is.EqualTo("ReservedWords")); + Assert.That(dt.Rows[row++][0], Is.EqualTo("Databases")); + Assert.That(dt.Rows[row++][0], Is.EqualTo("Tables")); + Assert.That(dt.Rows[row++][0], Is.EqualTo("Columns")); + Assert.That(dt.Rows[row++][0], Is.EqualTo("Users")); + Assert.That(dt.Rows[row++][0], Is.EqualTo("Foreign Keys")); + Assert.That(dt.Rows[row++][0], Is.EqualTo("IndexColumns")); + Assert.That(dt.Rows[row++][0], Is.EqualTo("Indexes")); + Assert.That(dt.Rows[row++][0], Is.EqualTo("Foreign Key Columns")); + Assert.That(dt.Rows[row++][0], Is.EqualTo("UDF")); + Assert.That(dt.Rows[row++][0], Is.EqualTo("Views")); + Assert.That(dt.Rows[row++][0], Is.EqualTo("ViewColumns")); + Assert.That(dt.Rows[row++][0], Is.EqualTo("Procedure Parameters")); + Assert.That(dt.Rows[row++][0], Is.EqualTo("Procedures")); + Assert.That(dt.Rows[row++][0], Is.EqualTo("Triggers")); + } + + /// + /// Bug #25907 DataType Column of DataTypes collection does'nt contain the correct CLR Datatype + /// Bug #25947 CreateFormat/CreateParameters Column of DataTypes collection incorrect for CHAR + /// + [Test] + public void DataTypes() + { + Assume.That(Version >= new Version(9, 0, 0), "This test is for MySql 9.0 or higher."); + + DataTable dt = Connection.GetSchema("DataTypes", new string[] { }); + + foreach (DataRow row in dt.Rows) + { + string type = row["TypeName"].ToString(); + Type systemType = Type.GetType(row["DataType"].ToString()); + if (type == "BIT") + Assert.That(systemType, Is.EqualTo(typeof(System.UInt64))); + else if (type == "DATE" || type == "DATETIME" || + type == "TIMESTAMP") + Assert.That(systemType, Is.EqualTo(typeof(System.DateTime))); + else if (type == "BLOB" || type == "TINYBLOB" || + type == "MEDIUMBLOB" || type == "LONGBLOB") + Assert.That(systemType, Is.EqualTo(typeof(System.Byte[]))); + else if (type == "TIME") + Assert.That(systemType, Is.EqualTo(typeof(System.TimeSpan))); + else if (type == "CHAR" || type == "VARCHAR") + { + Assert.That(systemType, Is.EqualTo(typeof(System.String))); + Assert.That(!Convert.ToBoolean(row["IsFixedLength"])); + string format = type + "({0})"; + Assert.That(row["CreateFormat"].ToString(), Is.EqualTo(format)); + } + else if (type == "SET" || type == "ENUM") + Assert.That(systemType, Is.EqualTo(typeof(System.String))); + else if (type == "DOUBLE") + Assert.That(systemType, Is.EqualTo(typeof(System.Double))); + else if (type == "SINGLE") + Assert.That(systemType, Is.EqualTo(typeof(System.Single))); + else if (type == "TINYINT") + { + if (row["CreateFormat"].ToString().EndsWith("UNSIGNED", StringComparison.OrdinalIgnoreCase)) + Assert.That(systemType, Is.EqualTo(typeof(System.Byte))); + else + Assert.That(systemType, Is.EqualTo(typeof(System.SByte))); + } + else if (type == "SMALLINT") + { + if (row["CreateFormat"].ToString().EndsWith("UNSIGNED", StringComparison.OrdinalIgnoreCase)) + Assert.That(systemType, Is.EqualTo(typeof(System.UInt16))); + else + Assert.That(systemType, Is.EqualTo(typeof(System.Int16))); + } + else if (type == "MEDIUMINT" || type == "INT") + { + if (row["CreateFormat"].ToString().EndsWith("UNSIGNED", StringComparison.OrdinalIgnoreCase)) + Assert.That(systemType, Is.EqualTo(typeof(System.UInt32))); + else + Assert.That(systemType, Is.EqualTo(typeof(System.Int32))); + } + else if (type == "BIGINT") + { + if (row["CreateFormat"].ToString().EndsWith("UNSIGNED", StringComparison.OrdinalIgnoreCase)) + Assert.That(systemType, Is.EqualTo(typeof(System.UInt64))); + else + Assert.That(systemType, Is.EqualTo(typeof(System.Int64))); + } + else if (type == "DECIMAL") + { + Assert.That(systemType, Is.EqualTo(typeof(System.Decimal))); + Assert.That(row["CreateFormat"].ToString(), Is.EqualTo("DECIMAL({0},{1})")); + } + else if (type == "TINYINT") + Assert.That(systemType, Is.EqualTo(typeof(System.Byte))); + } + } + + [Test] + public void Tables() + { + ExecuteSQL("DROP TABLE IF EXISTS test1"); + ExecuteSQL("CREATE TABLE test1 (id int)"); + + string[] restrictions = new string[4]; + restrictions[1] = Connection.Database; + restrictions[2] = "test1"; + DataTable dt = Connection.GetSchema("Tables", restrictions); + Assert.That(dt.Columns["VERSION"].DataType == typeof(UInt64) + || dt.Columns["VERSION"].DataType == typeof(Int64)); + Assert.That(dt.Columns["TABLE_ROWS"].DataType == typeof(UInt64)); + Assert.That(dt.Columns["AVG_ROW_LENGTH"].DataType == typeof(UInt64)); + Assert.That(dt.Columns["DATA_LENGTH"].DataType == typeof(UInt64)); + Assert.That(dt.Columns["MAX_DATA_LENGTH"].DataType == typeof(UInt64)); + Assert.That(dt.Columns["INDEX_LENGTH"].DataType == typeof(UInt64)); + Assert.That(dt.Columns["DATA_FREE"].DataType == typeof(UInt64)); + Assert.That(dt.Columns["AUTO_INCREMENT"].DataType == typeof(UInt64)); + Assert.That(dt.Columns["CHECKSUM"].DataType == typeof(UInt64) + || dt.Columns["CHECKSUM"].DataType == typeof(Int64)); + Assert.That(dt.Rows.Count == 1); + Assert.That(dt.TableName, Is.EqualTo("Tables")); + Assert.That(dt.Rows[0][2], Is.EqualTo("test1")); + } + + [Test] + public void Columns() + { + ExecuteSQL(@"CREATE TABLE Test (col1 int, col2 decimal(20,5), + col3 varchar(50) character set utf8, col4 tinyint unsigned, + col5 varchar(20) default 'boo')"); + + string[] restrictions = new string[4]; + restrictions[1] = Connection.Database; + restrictions[2] = "Test"; + DataTable dt = Connection.GetSchema("Columns", restrictions); + Assert.That(dt.Rows.Count, Is.EqualTo(5)); + Assert.That(dt.TableName, Is.EqualTo("Columns")); + if (Connection.driver.Version.isAtLeast(8, 0, 1)) + { + Assert.That(dt.Columns["ORDINAL_POSITION"].DataType == typeof(UInt32)); + Assert.That(dt.Columns["CHARACTER_MAXIMUM_LENGTH"].DataType == typeof(Int64)); + Assert.That(dt.Columns["NUMERIC_PRECISION"].DataType == typeof(UInt64)); + Assert.That(dt.Columns["NUMERIC_SCALE"].DataType == typeof(UInt64)); + } + else + { + Assert.That(dt.Columns["ORDINAL_POSITION"].DataType == typeof(UInt64)); + Assert.That(dt.Columns["CHARACTER_MAXIMUM_LENGTH"].DataType == typeof(UInt64)); + Assert.That(dt.Columns["NUMERIC_PRECISION"].DataType == typeof(UInt64)); + Assert.That(dt.Columns["NUMERIC_SCALE"].DataType == typeof(UInt64)); + } + + // first column + Assert.That(dt.Rows[0]["TABLE_SCHEMA"].ToString().ToUpper(), Is.EqualTo((Connection.Database).ToUpper())); + Assert.That(dt.Rows[0]["COLUMN_NAME"].ToString().ToUpper(), Is.EqualTo("COL1")); + Assert.That(Convert.ToInt32(dt.Rows[0]["ORDINAL_POSITION"]), Is.EqualTo(1)); + Assert.That(dt.Rows[0]["IS_NULLABLE"], Is.EqualTo("YES")); + Assert.That(dt.Rows[0]["DATA_TYPE"].ToString().ToUpper(), Is.EqualTo("INT")); + + // second column + Assert.That(dt.Rows[1]["TABLE_SCHEMA"].ToString().ToUpper(), Is.EqualTo((Connection.Database).ToUpper())); + Assert.That(dt.Rows[1]["COLUMN_NAME"].ToString().ToUpper(), Is.EqualTo("COL2")); + Assert.That(Convert.ToInt32(dt.Rows[1]["ORDINAL_POSITION"]), Is.EqualTo(2)); + Assert.That(dt.Rows[1]["IS_NULLABLE"], Is.EqualTo("YES")); + Assert.That(dt.Rows[1]["DATA_TYPE"].ToString().ToUpper(), Is.EqualTo("DECIMAL")); + Assert.That(dt.Rows[1]["COLUMN_TYPE"].ToString().ToUpper(), Is.EqualTo("DECIMAL(20,5)")); + Assert.That(Convert.ToInt32(dt.Rows[1]["NUMERIC_PRECISION"]), Is.EqualTo(20)); + Assert.That(Convert.ToInt32(dt.Rows[1]["NUMERIC_SCALE"]), Is.EqualTo(5)); + + // third column + Assert.That(dt.Rows[2]["TABLE_SCHEMA"].ToString().ToUpper(), Is.EqualTo((Connection.Database).ToUpper())); + Assert.That(dt.Rows[2]["COLUMN_NAME"].ToString().ToUpper(), Is.EqualTo("COL3")); + Assert.That(Convert.ToInt32(dt.Rows[2]["ORDINAL_POSITION"]), Is.EqualTo(3)); + Assert.That(dt.Rows[2]["IS_NULLABLE"], Is.EqualTo("YES")); + Assert.That(dt.Rows[2]["DATA_TYPE"].ToString().ToUpper(), Is.EqualTo("VARCHAR")); + Assert.That(dt.Rows[2]["COLUMN_TYPE"].ToString().ToUpper(), Is.EqualTo("VARCHAR(50)")); + + // fourth column + Assert.That(dt.Rows[3]["TABLE_SCHEMA"].ToString().ToUpper(), Is.EqualTo((Connection.Database).ToUpper())); + Assert.That(dt.Rows[3]["COLUMN_NAME"].ToString().ToUpper(), Is.EqualTo("COL4")); + Assert.That(Convert.ToInt32(dt.Rows[3]["ORDINAL_POSITION"]), Is.EqualTo(4)); + Assert.That(dt.Rows[3]["IS_NULLABLE"], Is.EqualTo("YES")); + Assert.That(dt.Rows[3]["DATA_TYPE"].ToString().ToUpper(), Is.EqualTo("TINYINT")); + + // fifth column + Assert.That(dt.Rows[4]["TABLE_SCHEMA"].ToString().ToUpper(), Is.EqualTo((Connection.Database).ToUpper())); + Assert.That(dt.Rows[4]["COLUMN_NAME"].ToString().ToUpper(), Is.EqualTo("COL5")); + Assert.That(Convert.ToInt32(dt.Rows[4]["ORDINAL_POSITION"]), Is.EqualTo(5)); + Assert.That(dt.Rows[4]["IS_NULLABLE"], Is.EqualTo("YES")); + Assert.That(dt.Rows[4]["DATA_TYPE"].ToString().ToUpper(), Is.EqualTo("VARCHAR")); + Assert.That(dt.Rows[4]["COLUMN_TYPE"].ToString().ToUpper(), Is.EqualTo("VARCHAR(20)")); + Assert.That(dt.Rows[4]["COLUMN_DEFAULT"].ToString().ToUpper(), Is.EqualTo("BOO")); + } + + + /// + ///Testing out schema information about generated columns + /// only in version 5.7.6 or later + /// + [Test] + public void CanGetSchemaInformationGeneratedColumns() + { + Assume.That(System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Windows)); + Assume.That(Version >= new Version(5, 7, 6)); + + ExecuteSQL("CREATE TABLE `Test` (`ID` int NOT NULL AUTO_INCREMENT PRIMARY KEY, `Name` char(35) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL)"); + + var cmd = new MySqlCommand("ALTER TABLE Test ADD COLUMN Name_ci char(35) CHARACTER SET utf8 AS (Name) STORED;", Connection); + cmd.ExecuteNonQuery(); + + DataTable dt = Connection.GetSchema("Columns", new string[] { null, null, "Test", null }); + Assert.That(dt.Rows.Count, Is.EqualTo(3)); + Assert.That(dt.TableName, Is.EqualTo("Columns")); + if (Version.Major >= 5 && Version.Minor >= 7 && Version.Build >= 6) + { + Assert.That(dt.Rows[2]["DATA_TYPE"], Is.EqualTo("char")); + Assert.That(dt.Rows[2]["GENERATION_EXPRESSION"].ToString().Trim('`'), Is.EqualTo("Name")); + Assert.That(dt.Rows[2]["EXTRA"], Is.EqualTo("STORED GENERATED")); + } + } + + + /// + /// Bug #46270 connection.GetSchema("Columns") fails on MySQL 4.1 + /// + [Test] + public void EnumAndSetColumns() + { + ExecuteSQL("CREATE TABLE Test (col1 set('A','B','C'), col2 enum('A','B','C'))"); + + DataTable dt = Connection.GetSchema("Columns", new string[] { null, null, "Test", null }); + Assert.That(dt.Rows.Count, Is.EqualTo(2)); + Assert.That(dt.Rows[0]["DATA_TYPE"], Is.EqualTo("set")); + Assert.That(dt.Rows[1]["DATA_TYPE"], Is.EqualTo("enum")); + Assert.That(dt.Rows[0]["COLUMN_TYPE"], Is.EqualTo("set('A','B','C')")); + Assert.That(dt.Rows[1]["COLUMN_TYPE"], Is.EqualTo("enum('A','B','C')")); + } + + [Test] + public void Procedures() + { + ExecuteSQL("DROP PROCEDURE IF EXISTS spTest"); + ExecuteSQL("CREATE PROCEDURE spTest (id int) BEGIN SELECT 1; END"); + + string[] restrictions = new string[4]; + restrictions[1] = Connection.Database; + restrictions[2] = "spTest"; + DataTable dt = Connection.GetSchema("Procedures", restrictions); + Assert.That(dt.Rows.Count == 1); + Assert.That(dt.TableName, Is.EqualTo("Procedures")); + Assert.That(dt.Rows[0][3], Is.EqualTo("spTest")); + } + + /// + /// Bug #33674814 - Empty result from MySqlConnection.GetSchema("Procedure Parameters") call. + /// Incorrect casting on [NUMERIC_PRECISION] column whn looking for "PROCEDURE PARAMETERS" collection without any restriction + /// + [Test] + public void ProcedureParameters() + { + var dt = Connection.GetSchema("PROCEDURE PARAMETERS"); + + Assert.That(dt.TableName, Is.EqualTo("Procedure Parameters")); + Assert.That(dt.Rows.Count > 0); + } + + [Test] + public void Functions() + { + ExecuteSQL("DROP FUNCTION IF EXISTS spFunc"); + ExecuteSQL("CREATE FUNCTION spFunc (id int) RETURNS INT DETERMINISTIC NO SQL BEGIN RETURN 1; END"); + + string[] restrictions = new string[4]; + restrictions[1] = Connection.Database; + restrictions[2] = "spFunc"; + DataTable dt = Connection.GetSchema("Procedures", restrictions); + Assert.That(dt.Rows.Count == 1); + Assert.That(dt.TableName, Is.EqualTo("Procedures")); + Assert.That(dt.Rows[0][3], Is.EqualTo("spFunc")); + } + + [Test] + public void Indexes() + { + ExecuteSQL("CREATE TABLE Test (id int, PRIMARY KEY(id))"); + string[] restrictions = new string[4]; + restrictions[2] = "Test"; + restrictions[1] = Connection.Database; + DataTable dt = Connection.GetSchema("Indexes", restrictions); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + Assert.That(dt.Rows[0]["TABLE_NAME"].ToString(), Is.EqualTo("test").IgnoreCase); + Assert.That((bool)dt.Rows[0]["PRIMARY"]); + Assert.That((bool)dt.Rows[0]["UNIQUE"]); + + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE Test (id int, name varchar(50), " + + "UNIQUE KEY key2 (name))"); + + dt = Connection.GetSchema("Indexes", restrictions); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + Assert.That(dt.Rows[0]["TABLE_NAME"].ToString(), Is.EqualTo("test").IgnoreCase); + Assert.That(dt.Rows[0]["INDEX_NAME"], Is.EqualTo("key2")); + Assert.That(!(bool)dt.Rows[0]["PRIMARY"]); + Assert.That((bool)dt.Rows[0]["UNIQUE"]); + + restrictions[3] = "key2"; + dt = Connection.GetSchema("Indexes", restrictions); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + Assert.That(dt.Rows[0]["TABLE_NAME"].ToString(), Is.EqualTo("test").IgnoreCase); + Assert.That(dt.Rows[0]["INDEX_NAME"], Is.EqualTo("key2")); + Assert.That(!(bool)dt.Rows[0]["PRIMARY"]); + Assert.That((bool)dt.Rows[0]["UNIQUE"]); + + /// + /// Bug #48101 MySqlConnection.GetSchema on "Indexes" throws when there's a table named "b`a`d" + /// + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL(@"CREATE TABLE `Te``s``t` (id int, name varchar(50), " + + "KEY key2 (name))"); + + restrictions[2] = "Te`s`t"; + dt = Connection.GetSchema("Indexes", restrictions); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + Assert.That(dt.Rows[0]["TABLE_NAME"].ToString(), Is.EqualTo("te`s`t").IgnoreCase); + Assert.That(dt.Rows[0]["INDEX_NAME"], Is.EqualTo("key2")); + Assert.That(!(bool)dt.Rows[0]["PRIMARY"]); + Assert.That(!(bool)dt.Rows[0]["UNIQUE"]); + } + + [Test] + public void IndexColumns() + { + ExecuteSQL("CREATE TABLE Test (id int, PRIMARY KEY(id))"); + string[] restrictions = new string[5]; + restrictions[2] = "Test"; + restrictions[1] = Connection.Database; + DataTable dt = Connection.GetSchema("IndexColumns", restrictions); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + Assert.That(dt.Rows[0]["TABLE_NAME"].ToString(), Is.EqualTo("test").IgnoreCase); + Assert.That(dt.Rows[0]["COLUMN_NAME"], Is.EqualTo("id")); + + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE Test (id int, id1 int, id2 int, " + + "INDEX key1 (id1, id2))"); + restrictions[2] = "Test"; + restrictions[1] = Connection.Database; + restrictions[4] = "id2"; + dt = Connection.GetSchema("IndexColumns", restrictions); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + Assert.That(dt.Rows[0]["TABLE_NAME"].ToString(), Is.EqualTo("test").IgnoreCase); + Assert.That(dt.Rows[0]["COLUMN_NAME"], Is.EqualTo("id2")); + Assert.That(dt.Rows[0]["ORDINAL_POSITION"], Is.EqualTo(2)); + + restrictions[3] = "key1"; + dt = Connection.GetSchema("IndexColumns", restrictions); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + Assert.That(dt.Rows[0]["TABLE_NAME"].ToString(), Is.EqualTo("test").IgnoreCase); + Assert.That(dt.Rows[0]["COLUMN_NAME"], Is.EqualTo("id2")); + Assert.That(dt.Rows[0]["ORDINAL_POSITION"], Is.EqualTo(2)); + + restrictions = new string[3]; + restrictions[1] = Connection.Database; + restrictions[2] = "Test"; + dt = Connection.GetSchema("IndexColumns", restrictions); + Assert.That(dt.Rows.Count, Is.EqualTo(2)); + Assert.That(dt.Rows[0]["TABLE_NAME"].ToString(), Is.EqualTo("test").IgnoreCase); + Assert.That(dt.Rows[0]["COLUMN_NAME"], Is.EqualTo("id1")); + Assert.That(dt.Rows[0]["ORDINAL_POSITION"], Is.EqualTo(1)); + Assert.That(dt.Rows[0]["TABLE_NAME"].ToString(), Is.EqualTo("test").IgnoreCase); + Assert.That(dt.Rows[1]["COLUMN_NAME"], Is.EqualTo("id2")); + Assert.That(dt.Rows[1]["ORDINAL_POSITION"], Is.EqualTo(2)); + + restrictions = new string[4]; + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE Test (id int primary key, id1 int, KEY key1 (id1))"); + restrictions[2] = "Test"; + restrictions[1] = Connection.Database; + restrictions[3] = "PRIMARY"; + dt = Connection.GetSchema("IndexColumns", restrictions); + } + + [Test] + public void Views() + { + ExecuteSQL("DROP VIEW IF EXISTS vw"); + ExecuteSQL("CREATE VIEW vw AS SELECT Now() as theTime"); + + string[] restrictions = new string[4]; + restrictions[1] = Connection.Database; + restrictions[2] = "vw"; + DataTable dt = Connection.GetSchema("Views", restrictions); + Assert.That(dt.Rows.Count == 1); + Assert.That(dt.TableName, Is.EqualTo("Views")); + Assert.That(dt.Rows[0]["TABLE_NAME"], Is.EqualTo("vw")); + } + + [Test] + public void ViewColumns() + { + ExecuteSQL("DROP VIEW IF EXISTS vw"); + ExecuteSQL("CREATE VIEW vw AS SELECT Now() as theTime"); + + string[] restrictions = new string[4]; + restrictions[1] = Connection.Database; + restrictions[2] = "vw"; + DataTable dt = Connection.GetSchema("ViewColumns", restrictions); + Assert.That(dt.Rows.Count == 1); + Assert.That(dt.TableName, Is.EqualTo("ViewColumns")); + Assert.That(dt.Rows[0]["VIEW_SCHEMA"].ToString().ToLower(), Is.EqualTo(Connection.Database.ToLower())); + Assert.That(dt.Rows[0]["VIEW_NAME"], Is.EqualTo("vw")); + Assert.That(dt.Rows[0]["COLUMN_NAME"], Is.EqualTo("theTime")); + } + + [Test] + public void SingleForeignKey() + { + ExecuteSQL("DROP TABLE IF EXISTS child"); + ExecuteSQL("DROP TABLE IF EXISTS parent"); + ExecuteSQL("CREATE TABLE parent (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB"); + ExecuteSQL("CREATE TABLE child (id INT, parent_id INT, INDEX par_ind (parent_id), " + + "CONSTRAINT c1 FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE) ENGINE=INNODB"); + string[] restrictions = new string[4]; + restrictions[0] = null; + restrictions[1] = Connection.Database; + restrictions[2] = "child"; + DataTable dt = Connection.GetSchema("Foreign Keys", restrictions); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + DataRow row = dt.Rows[0]; + Assert.That(row[1].ToString().ToLower(), Is.EqualTo(Connection.Database.ToLower())); + Assert.That(row[2], Is.EqualTo("c1")); + Assert.That(row[4].ToString().ToLower(), Is.EqualTo(Connection.Database.ToLower())); + Assert.That(row[5], Is.EqualTo("child")); + Assert.That(row[10].ToString().ToLower(), Is.EqualTo(Connection.Database.ToLower())); + Assert.That(row[11], Is.EqualTo("parent")); + } + + /// + /// Bug #26660 MySqlConnection.GetSchema fails with NullReferenceException for Foreign Keys + /// + [Test] + public void ForeignKeys() + { + Assume.That(System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Windows)); + + ExecuteSQL("DROP TABLE IF EXISTS product_order"); + ExecuteSQL("DROP TABLE IF EXISTS customer"); + ExecuteSQL("DROP TABLE IF EXISTS product"); + + ExecuteSQL("CREATE TABLE product (category INT NOT NULL, id INT NOT NULL, " + + "price DECIMAL, PRIMARY KEY(category, id)) ENGINE=INNODB"); + ExecuteSQL("CREATE TABLE customer (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB"); + ExecuteSQL("CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT, " + + "product_category INT NOT NULL, product_id INT NOT NULL, customer_id INT NOT NULL, " + + "PRIMARY KEY(no), INDEX (product_category, product_id), " + + "FOREIGN KEY (product_category, product_id) REFERENCES product(category, id) " + + "ON UPDATE CASCADE ON DELETE RESTRICT, INDEX (customer_id), " + + "FOREIGN KEY (customer_id) REFERENCES customer(id)) ENGINE=INNODB"); + + DataTable dt = Connection.GetSchema("Foreign Keys"); + Assert.That(dt.Columns.Contains("REFERENCED_TABLE_CATALOG")); + } + + [Test] + public void MultiSingleForeignKey() + { + ExecuteSQL("DROP TABLE IF EXISTS product_order"); + ExecuteSQL("DROP TABLE IF EXISTS customer"); + ExecuteSQL("DROP TABLE IF EXISTS product"); + + ExecuteSQL("CREATE TABLE product (category INT NOT NULL, id INT NOT NULL, " + + "price DECIMAL, PRIMARY KEY(category, id)) ENGINE=INNODB"); + ExecuteSQL("CREATE TABLE customer (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB"); + ExecuteSQL("CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT, " + + "product_category INT NOT NULL, product_id INT NOT NULL, customer_id INT NOT NULL, " + + "PRIMARY KEY(no), INDEX (product_category, product_id), " + + "FOREIGN KEY (product_category, product_id) REFERENCES product(category, id) " + + "ON UPDATE CASCADE ON DELETE RESTRICT, INDEX (customer_id), " + + "FOREIGN KEY (customer_id) REFERENCES customer(id)) ENGINE=INNODB"); + + string[] restrictions = new string[4]; + restrictions[0] = null; + restrictions[1] = Connection.Database; + restrictions[2] = "product_order"; + DataTable dt = Connection.GetSchema("Foreign Keys", restrictions); + Assert.That(dt.Rows.Count, Is.EqualTo(2)); + DataRow row = dt.Rows[0]; + Assert.That(row[1].ToString().ToLower(), Is.EqualTo(Connection.Database.ToLower())); + Assert.That(row[2], Is.EqualTo("product_order_ibfk_1")); + Assert.That(row[4].ToString().ToLower(), Is.EqualTo(Connection.Database.ToLower())); + Assert.That(row[5], Is.EqualTo("product_order")); + Assert.That(row[10].ToString().ToLower(), Is.EqualTo(Connection.Database.ToLower())); + Assert.That(row[11], Is.EqualTo("product")); + + row = dt.Rows[1]; + Assert.That(row[1].ToString().ToLower(), Is.EqualTo(Connection.Database.ToLower())); + Assert.That(row[2], Is.EqualTo("product_order_ibfk_2")); + Assert.That(row[4].ToString().ToLower(), Is.EqualTo(Connection.Database.ToLower())); + Assert.That(row[5], Is.EqualTo("product_order")); + Assert.That(row[10].ToString().ToLower(), Is.EqualTo(Connection.Database.ToLower())); + Assert.That(row[11], Is.EqualTo("customer")); + } + + [Test] + public void Triggers() + { + ExecuteSQL("DROP TABLE IF EXISTS test1"); + ExecuteSQL("CREATE TABLE test1 (id int)"); + ExecuteSQL("CREATE TABLE test2 (count int)"); + ExecuteSQL("INSERT INTO test2 VALUES (0)"); + string sql = String.Format("CREATE TRIGGER `{0}`.trigger1 AFTER INSERT ON test1 FOR EACH ROW BEGIN " + + "UPDATE test2 SET count = count+1; END", Connection.Database); + ExecuteSQL(sql); + + string[] restrictions = new string[4]; + restrictions[1] = Connection.Database; + restrictions[2] = "test1"; + DataTable dt = Connection.GetSchema("Triggers", restrictions); + Assert.That(dt.Rows.Count == 1); + Assert.That(dt.TableName, Is.EqualTo("Triggers")); + Assert.That(dt.Rows[0]["TRIGGER_NAME"], Is.EqualTo("trigger1")); + Assert.That(dt.Rows[0]["EVENT_MANIPULATION"], Is.EqualTo("INSERT")); + Assert.That(dt.Rows[0]["EVENT_OBJECT_TABLE"], Is.EqualTo("test1")); + Assert.That(dt.Rows[0]["ACTION_ORIENTATION"], Is.EqualTo("ROW")); + Assert.That(dt.Rows[0]["ACTION_TIMING"], Is.EqualTo("AFTER")); + } + + [Test] + public void UsingQuotedRestrictions() + { + ExecuteSQL("DROP TABLE IF EXISTS test1"); + ExecuteSQL("CREATE TABLE test1 (id int)"); + + string[] restrictions = new string[4]; + restrictions[1] = Connection.Database; + restrictions[2] = "`test1`"; + DataTable dt = Connection.GetSchema("Tables", restrictions); + Assert.That(dt.Rows.Count == 1); + Assert.That(dt.TableName, Is.EqualTo("Tables")); + Assert.That(dt.Rows[0][2], Is.EqualTo("test1")); + Assert.That(restrictions[2], Is.EqualTo("`test1`")); + } + + [Test] + public void ReservedWords() + { + DataTable dt = Connection.GetSchema("ReservedWords"); + foreach (DataRow row in dt.Rows) + Assert.That(!String.IsNullOrEmpty(row[0] as string)); + Assert.That(dt.Rows.Count, Is.EqualTo(235)); // number of keywords: 235 + } + + [Test] + public void GetSchemaCollections() + { + ExecuteSQL("CREATE TABLE parent (id int, name_parent VARCHAR(20), PRIMARY KEY(id))"); + ExecuteSQL(@"CREATE TABLE child (id int, name_child VARCHAR(20), parent_id INT, + PRIMARY KEY(id), INDEX par_id (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE)"); + ExecuteSQL("INSERT INTO parent VALUES(1, 'parent_1')"); + ExecuteSQL("INSERT INTO child VALUES(1, 'child_1', 1)"); + + SchemaProvider schema = new SchemaProvider(Connection); + string[] restrictions = new string[5]; + restrictions[2] = "parent"; + restrictions[1] = Connection.Database; + + MySqlSchemaCollection schemaCollection = schema.GetSchema("columns", restrictions); + + Assert.That(schemaCollection.Columns.Count == 20); + Assert.That(schemaCollection.Rows.Count == 2); + Assert.That(schemaCollection.Rows[0]["TABLE_NAME"], Is.EqualTo("parent")); + Assert.That(schemaCollection.Rows[0]["COLUMN_NAME"], Is.EqualTo("id")); + + schemaCollection = schema.GetForeignKeysAsync(restrictions, false).GetAwaiter().GetResult(); + Assert.That(schemaCollection.AsDataTable().Columns.Contains("REFERENCED_TABLE_NAME")); + + schemaCollection = schema.GetForeignKeyColumnsAsync(restrictions, false).GetAwaiter().GetResult(); + Assert.That(schemaCollection.AsDataTable().Columns.Contains("REFERENCED_COLUMN_NAME")); + + schemaCollection = schema.GetUDFAsync(restrictions, false).GetAwaiter().GetResult(); + Assert.That(schemaCollection.AsDataTable().Columns.Contains("RETURN_TYPE")); + + schemaCollection = schema.GetUsersAsync(restrictions, false).GetAwaiter().GetResult(); + Assert.That(schemaCollection.AsDataTable().Columns.Contains("USERNAME")); + + using (var conn = new MySqlConnection(Connection.ConnectionString)) + { + conn.Open(); + var table = conn.GetSchema(); + foreach (DataRow row in table.Rows) + foreach (DataColumn col in table.Columns) + { + Assert.That(col.ColumnName, Is.Not.Null); + Assert.That(row[col], Is.Not.Null); + } + } + + } + + /// + /// Bug #26876582 Unexpected ColumnSize for Char(36) and Blob in GetSchemaTable. + /// Setting OldGuids to True so CHAR(36) is treated as CHAR. + /// + [Test] + public void ColumnSizeWithOldGuids() + { + string connString = Connection.ConnectionString; + + using (MySqlConnection conn = new MySqlConnection(connString + ";oldguids=True;")) + { + conn.Open(); + MySqlCommand cmd = new MySqlCommand("CREATE TABLE Test(char36 char(36) CHARSET utf8mb4, binary16 binary(16), char37 char(37), `tinyblob` tinyblob, `blob` blob);", conn); + cmd.ExecuteNonQuery(); + + using (MySqlDataReader reader = ExecuteReader("SELECT * FROM Test;")) + { + DataTable schemaTable = reader.GetSchemaTable(); + + Assert.That(schemaTable.Rows[0]["ColumnSize"], Is.EqualTo(36)); + Assert.That(schemaTable.Rows[1]["ColumnSize"], Is.EqualTo(16)); + Assert.That(schemaTable.Rows[2]["ColumnSize"], Is.EqualTo(37)); + Assert.That(schemaTable.Rows[3]["ColumnSize"], Is.EqualTo(255)); + Assert.That(schemaTable.Rows[4]["ColumnSize"], Is.EqualTo(65535)); + } + } + } + + /// + /// Bug #26876592 Unexpected ColumnSize, IsLong in GetSChemaTable for LongText and LongBlob column. + /// Added validation when ColumnLenght equals -1 that is when lenght exceeds Int max size. + /// + [Test] + public void IsLongProperty() + { + Assume.That(Platform.IsWindows(), "This test is for Windows OS only."); + Assume.That(Version >= new Version(5, 7, 6), "This test is for MySql 5.7.6 or higher"); + ExecuteSQL("Drop table if exists datatypes1"); + ExecuteSQL("create table datatypes1(`longtext` longtext,`longblob` longblob)"); + ExecuteSQL("insert into datatypes1 values('test', _binary'test')"); + using (var cmd = Connection.CreateCommand()) + { + cmd.CommandText = "SELECT * FROM datatypes1;"; + using (var reader = cmd.ExecuteReader()) + { + var schemaTable = reader.GetSchemaTable(); + Assert.That(schemaTable.Rows[0]["ColumnSize"].ToString(), Is.EqualTo("-1"), "Matching the Column Size"); + Assert.That(schemaTable.Rows[0]["IsLong"].ToString(), Is.EqualTo("True"), "Matching the Column Size"); + Assert.That(schemaTable.Rows[1]["ColumnSize"].ToString(), Is.EqualTo("-1"), "Matching the Column Size"); + Assert.That(schemaTable.Rows[1]["IsLong"].ToString(), Is.EqualTo("True"), "Matching the Column Size"); + } + } + } + + /// + /// Bug #26954812 Decimal with numericScale of 0 has wrong numericPrecision in GetSchemaTable. + /// + [Test] + public void NumericPrecisionProperty() + { + Assume.That(Platform.IsWindows(), "This test is for Windows OS only."); + Assume.That(Version >= new Version(5, 7, 6), "This test is for MySql 5.7.6 or higher"); + ExecuteSQL("Drop table if exists datatypes2"); + ExecuteSQL("create table datatypes2(decimal0 decimal(8, 0))"); + using (var cmd = Connection.CreateCommand()) + { + cmd.CommandText = "SELECT * FROM datatypes2;"; + using (var reader = cmd.ExecuteReader()) + { + var schemaTable = reader.GetSchemaTable(); + Assert.That(schemaTable.Rows[0]["NumericPrecision"], Is.EqualTo(8)); + Assert.That(schemaTable.Rows[0]["NumericScale"], Is.EqualTo(0)); + } + } + } + + /// + /// Bug #29536344 MYSQLCONNECTION.GETSCHEMA RETURNS WRONG ORDER OF RECORDS FOR COLUMNS INFORMATION + /// + [Test] + public void GetSchemaReturnColumnsByOrdinalPosition() + { + ExecuteSQL("CREATE TABLE foo (x int, a VARCHAR(20), z int, c int)"); + ExecuteSQL("INSERT INTO foo VALUES(1, 'columnName', 2, 3)"); + + string[] restrictions = new string[5]; + restrictions[2] = "foo"; + restrictions[1] = Connection.Database; + var rows = Connection.GetSchema("COLUMNS", restrictions).Rows.OfType().ToList(); + string[] expected = new string[] { "x", "a", "z", "c" }; + + for (int i = 0; i < rows.Count; i++) + Assert.That(expected[i], Is.EqualTo(rows[i]["COLUMN_NAME"])); + } + + [Test, Description("Test to verify different variations in Generated Coloumns")] + public void GeneratedColumnsVariations() + { + Assume.That(Version >= new Version(5, 7, 0), "This test is for MySql 5.7 or higher"); + + using (var conn = new MySqlConnection(Settings.ConnectionString)) + { + conn.Open(); + var cmd = new MySqlCommand( + @"create table Test(c1 int, + c2 double GENERATED ALWAYS AS(c1 * 101 / 102) Stored COMMENT 'First Gen Col', + c3 bigint GENERATED ALWAYS as (c1*10000) VIRTUAL UNIQUE KEY Comment '3rd Col' NOT NULL)", conn); + cmd.ExecuteNonQuery(); + + cmd = new MySqlCommand("insert into Test(c1) values(1000)", conn); + cmd.ExecuteNonQuery(); + + cmd = new MySqlCommand("select * from Test", conn); + cmd.ExecuteNonQuery(); + + using (var reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read(), "Matching the values"); + Assert.That(reader.GetInt32(0).Equals(1000), "Matching the values"); + if (Version >= new Version(9, 3, 0)) + Assert.That(reader.GetDouble(1).Equals(990.1961), "Matching the values"); + else + Assert.That(reader.GetDouble(1).Equals(990.196078431), "Matching the values"); + Assert.That(reader.GetInt64(2).Equals(10000000), "Matching the values"); + } + + var dt = conn.GetSchema("Columns", new[] { null, null, "Test", null }); + Assert.That(dt.Rows.Count, Is.EqualTo(3), "Matching the values"); + Assert.That(dt.TableName, Is.EqualTo("Columns"), "Matching the values"); + Assert.That(dt.Rows[0]["DATA_TYPE"].ToString(), Is.EqualTo("int"), "Matching the values"); + Assert.That(dt.Rows[1]["DATA_TYPE"].ToString(), Is.EqualTo("double"), "Matching the values"); + Assert.That(dt.Rows[2]["DATA_TYPE"].ToString(), Is.EqualTo("bigint"), "Matching the values"); + Assert.That(dt.Rows[0]["GENERATION_EXPRESSION"].ToString(), Is.EqualTo(""), "Matching the values"); + Assert.That(dt.Rows[0]["EXTRA"].ToString(), Is.EqualTo(""), "Matching the values"); + Assert.That(dt.Rows[1]["EXTRA"].ToString(), Is.EqualTo("STORED GENERATED"), "Matching the values"); + Assert.That(dt.Rows[2]["EXTRA"].ToString(), Is.EqualTo("VIRTUAL GENERATED"), "Matching the values"); + } + } + + /// + /// Bug #20266825 - SQLNULLVALUEEXCEPTION THROWN WHEN CALLING MYSQLCONNECTION::GETSCHEMA + /// Changed how "COLLATION" column value was retrieved + /// + [Test] + public void GetIndexColumnsWithFullTextIndex() + { + string indexName = "idxTest"; + ExecuteSQL($"CREATE TABLE Test (id INT, name VARCHAR(20), FULLTEXT {indexName}(name))"); + + if (Version >= new Version(8, 0)) + { + string cmdText = $"SELECT name, index_id, table_id, space from INFORMATION_SCHEMA.INNODB_INDEXES WHERE name = '{indexName}'"; + MySqlCommand cmd = new MySqlCommand(cmdText, Connection); + Assert.That(cmd.ExecuteScalar().ToString(), Is.EqualTo(indexName).IgnoreCase); + } + + var indexColumns = Connection.GetSchema("IndexColumns"); + var row = indexColumns.Select("TABLE_NAME = 'Test'"); + Assert.That(row[0]["INDEX_NAME"].ToString(), Is.EqualTo(indexName).IgnoreCase); + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/InstallerTests.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/InstallerTests.cs new file mode 100644 index 000000000..06223a189 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/InstallerTests.cs @@ -0,0 +1,136 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Xunit; +using MySql.Data.MySqlClient; +using Microsoft.Win32; +using System.IO; +using System.Xml; + +namespace MySql.Data.MySqlClient.Tests +{ + public class InstallerTests + { + private void CreateFiles() + { + //make a local copy of the machine.config file + object installRoot = Registry.GetValue( + @"HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\", + "InstallRoot", null); + if (installRoot == null) + throw new Exception("Unable to retrieve install root for .NET framework"); + + string[] dirs = new string[2] { "v2.0.50727", "v4.0.30319" }; + + foreach (string frameworkDir in dirs) + { + string path = installRoot.ToString() + frameworkDir; + string configPath = String.Format(@"{0}\CONFIG", path); + + if (!Directory.Exists(configPath)) + { + throw new Exception("Unable to get config .NET framework path"); + } + + if (!Directory.Exists(Environment.CurrentDirectory + "\\" + frameworkDir + @"\CONFIG")) + { + Directory.CreateDirectory(Environment.CurrentDirectory + "\\" + frameworkDir + @"\CONFIG"); + } + + File.Copy(configPath + @"\machine.config", Environment.CurrentDirectory + "\\" + frameworkDir + @"\CONFIG" + @"\machine.config", true); + } + + } + + + [Fact] + public void CanAddAssemblyBinding() + { + CreateFiles(); + CustomInstaller.UpdateMachineConfigs(Environment.CurrentDirectory + "\\", true); + DeleteFiles(); + } + + [Fact] + public void CanRemoveAssemblyBinding() + { + CreateFiles(); + CustomInstaller.UpdateMachineConfigs(Environment.CurrentDirectory + "\\", true); + + CustomInstaller.UpdateMachineConfigs(Environment.CurrentDirectory + "\\", false); + + string[] dirs = new string[2] { "v2.0.50727", "v4.0.30319" }; + + foreach (string frameworkDir in dirs) + { + var configFile = Environment.CurrentDirectory + "\\" + frameworkDir + @"\CONFIG" + @"\machine.config"; + + StreamReader sr = new StreamReader(configFile); + string configXML = sr.ReadToEnd(); + sr.Close(); + + // load the XML into the XmlDocument + XmlDocument doc = new XmlDocument(); + doc.LoadXml(configXML); + + XmlNodeList nodesDependantAssembly = doc.GetElementsByTagName("assemblyBinding")[0].ChildNodes; + if (nodesDependantAssembly != null) + { + int nodesCount = nodesDependantAssembly.Count; + for (int i = 0; i < nodesCount; i++) + { + if (nodesDependantAssembly[0].ChildNodes[0].Attributes[0].Name == "name" + && + nodesDependantAssembly[0].ChildNodes[0].Attributes[0].Value.Contains("MySql")) + { + Assert.That(true, "Error when removing assembly binding redirection"); + } + } + } + } + + DeleteFiles(); + } + + public void DeleteFiles() + { + + string[] dirs = new string[2] { "v2.0.50727", "v4.0.30319" }; + + foreach (string frameworkDir in dirs) + { + Directory.Delete(Environment.CurrentDirectory + "\\" + frameworkDir, true); + } + + } + } +} diff --git a/Tests/MySql.Data.Tests/Framework/Net451/MediumTrust/MediumTrustDomain.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MediumTrust/MediumTrustDomain.cs similarity index 84% rename from Tests/MySql.Data.Tests/Framework/Net451/MediumTrust/MediumTrustDomain.cs rename to MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MediumTrust/MediumTrustDomain.cs index 67d02246a..7fe63735e 100644 --- a/Tests/MySql.Data.Tests/Framework/Net451/MediumTrust/MediumTrustDomain.cs +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MediumTrust/MediumTrustDomain.cs @@ -1,23 +1,29 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. +// Copyright © 2013, 2025, Oracle and/or its affiliates. // -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. // -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. // -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. // -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., // 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MediumTrust/MediumTrustFixtureAttribute.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MediumTrust/MediumTrustFixtureAttribute.cs new file mode 100644 index 000000000..d2c7c873f --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MediumTrust/MediumTrustFixtureAttribute.cs @@ -0,0 +1,42 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Text; +using Xunit; + +namespace MySql.Data.MySqlClient.Tests.Xunit +{ + class MediumTrustFixtureAttribute : RunWithAttribute + { + public MediumTrustFixtureAttribute() + : base(typeof(MediumTrustTestClassCommand)) + { } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MediumTrust/MediumTrustTestClassCommand.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MediumTrust/MediumTrustTestClassCommand.cs new file mode 100644 index 000000000..da37668da --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MediumTrust/MediumTrustTestClassCommand.cs @@ -0,0 +1,95 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Text; +using MySql.Data.MySqlClient.Tests.Xunit.MediumTrust; +using Xunit.Sdk; + +namespace MySql.Data.MySqlClient.Tests.Xunit +{ + class MediumTrustTestClassCommand : ITestClassCommand + { + + readonly TestClassCommand _cmd = new TestClassCommand(); + Random randomizer = new Random(); + + #region ITestClassCommand Members + public object ObjectUnderTest + { + get { return _cmd.ObjectUnderTest; } + } + + public ITypeInfo TypeUnderTest + { + get { return _cmd.TypeUnderTest; } + set { _cmd.TypeUnderTest = value; } + } + + public int ChooseNextTest(ICollection testsLeftToRun) + { + return randomizer.Next(testsLeftToRun.Count); + } + + public Exception ClassFinish() + { + return _cmd.ClassFinish(); + } + + public Exception ClassStart() + { + return _cmd.ClassStart(); + } + + public IEnumerable EnumerateTestCommands(IMethodInfo testMethod) + { + foreach (var testCommand in _cmd.EnumerateTestCommands(testMethod)) + { + if (testCommand is MediumTrustTestCommand) + { + yield return testCommand; + continue; + } + + yield return new MediumTrustTestCommand(testCommand, null); + } + } + + public bool IsTestMethod(IMethodInfo testMethod) + { + return _cmd.IsTestMethod(testMethod); + } + + public IEnumerable EnumerateTestMethods() + { + return _cmd.EnumerateTestMethods(); + } + #endregion + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MediumTrust/MediumTrustTestCommand.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MediumTrust/MediumTrustTestCommand.cs new file mode 100644 index 000000000..79ce8fc83 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MediumTrust/MediumTrustTestCommand.cs @@ -0,0 +1,116 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Text; +using Xunit; +using Xunit.Sdk; + +namespace MySql.Data.MySqlClient.Tests.Xunit.MediumTrust +{ + public class MediumTrustTestCommand: ITestCommand + { + private readonly ITestCommand _command; + private readonly IDictionary _fixtures; + + + public MediumTrustTestCommand(ITestCommand command,IDictionary fixtures) + { + this._command = command; + this._fixtures = fixtures; + } + + public string DisplayName + { + get { return _command.DisplayName; } + } + + public bool ShouldCreateInstance + { + get { return _command.ShouldCreateInstance; } + } + + public System.Xml.XmlNode ToStartXml() + { + return _command.ToStartXml(); + } + + public int Timeout + { + get { return _command.Timeout; } + } + + public MethodResult Execute(object testClass) + { + try + { + if (testClass == null) return null; + + var testClassType = testClass.GetType(); + + if (!typeof(MarshalByRefObject).IsAssignableFrom(testClassType)) + { + throw new InvalidOperationException( + string.Format("Test class attribute '{0}' must derive from MarshalByRefObject.", + testClassType.FullName)); + } + + object sandboxedClass = null; + + var mediumTrustSandbox = new MediumTrustDomain(); + var partialTrustDomain = mediumTrustSandbox.CreatePartialTrustAppDomain(); + + sandboxedClass = partialTrustDomain.CreateInstanceAndUnwrap(testClassType.Assembly.FullName, testClassType.FullName); + + if (_fixtures != null) + { + foreach (var fixture in _fixtures) + { + fixture.Key.Invoke(sandboxedClass, new object[] { fixture.Value }); + } + } + + var result = _command.Execute(sandboxedClass); + mediumTrustSandbox.Dispose(); + return result; + } + catch (Exception ex) + { + if (ex.Message.Equals("Assembly is still loading")) + { + //This case is when our assembly was not found. + } + } + + return null; + } + + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MediumTrust/MySql.MediumTrustsTests.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MediumTrust/MySql.MediumTrustsTests.cs new file mode 100644 index 000000000..a75c63762 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MediumTrust/MySql.MediumTrustsTests.cs @@ -0,0 +1,59 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +using System; +using System.Collections.Generic; +using System.Text; +using Xunit; +using Xunit.Sdk; +using System.IO; +using System.Security; +using System.Security.Permissions; +using System.Data; +using System.Diagnostics; +using MySql.Data.MySqlClient.Tests; + +namespace MySql.Data.MySqlClient.Tests.Xunit +{ + + [RunWith(typeof(MediumTrustTestClassCommand))] + [MediumTrustFixture] + public class MySqlMediumTrustTests : MarshalByRefObject + { + + //[Fact] + //public void TestConnectionStrings() + //{ + // MySqlConnection c = new MySqlConnection(); + // c.ConnectionString = "server=localhost;userid=root;database=mysql;port=3305;includesecurityasserts=true;"; + // c.Open(); + // c.Close(); + //} + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MediumTrust/MySqlClientPermissionTests.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MediumTrust/MySqlClientPermissionTests.cs new file mode 100644 index 000000000..e25a0f97d --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MediumTrust/MySqlClientPermissionTests.cs @@ -0,0 +1,107 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Text; +using MySql.Data.MySqlClient; +using System.Security; +using System.Security.Permissions; +using System.Data; + +namespace MySql.Data.MySqlClient.Tests +{ +// public class MySqlClientPermissionTests : SetUpClass + //{ + + //[Test] + //[ExpectedException(typeof(System.Security.SecurityException))] + //public void CanChangeConnectionSettingsOnClientPermission() + //{ + // MySqlConnection dummyconn = new MySqlConnection(); + // PermissionSet permissionsSet = new PermissionSet(PermissionState.None); + // MySqlClientPermission permission = new MySqlClientPermission(PermissionState.None); + + // // Allow only server localhost, any database, only with root user + // permission.Add("server=localhost;", "database=; user id=root;", KeyRestrictionBehavior.PreventUsage); + // permissionsSet.AddPermission(permission); + // permissionsSet.PermitOnly(); + // dummyconn.ConnectionString = "server=localhost; user id=test;includesecurityasserts=true;"; + // dummyconn.Open(); + // if (dummyconn.State == ConnectionState.Open) dummyconn.Close(); + //} + + //[Test] + //public void CanAllowConnectionAfterPermitOnlyPermission() + //{ + // PermissionSet permissionset = new PermissionSet(PermissionState.None); + + // MySqlClientPermission permission = new MySqlClientPermission(PermissionState.None); + + // MySqlConnectionStringBuilder strConn = new MySqlConnectionStringBuilder(conn.ConnectionString); + + // //// Allow connections only to specified database no additional optional parameters + // permission.Add("server=localhost;User Id=root;database=" + strConn.Database + ";port=" + strConn.Port + ";", "", KeyRestrictionBehavior.PreventUsage); + // permission.PermitOnly(); + // permissionset.AddPermission(permission); + // permissionset.Demand(); + + // // this conection should be allowed + // MySqlConnection dummyconn = new MySqlConnection(); + // dummyconn.ConnectionString = "server=localhost;User Id=root;database=" + strConn.Database + ";port=" + strConn.Port + ";includesecurityasserts=true;"; + // dummyconn.Open(); + // if (dummyconn.State == ConnectionState.Open) dummyconn.Close(); + + //} + + //[Test] + //[ExpectedException(typeof(System.Security.SecurityException))] + //public void CanDenyConnectionAfterPermitOnlyPermission() + //{ + // PermissionSet permissionset = new PermissionSet(PermissionState.None); + + // MySqlClientPermission permission = new MySqlClientPermission(PermissionState.None); + + // MySqlConnectionStringBuilder strConn = new MySqlConnectionStringBuilder(conn.ConnectionString); + + // //// Allow connections only to specified database no additional optional parameters + // permission.Add("server=localhost;User Id=root; database=" + strConn.Database + ";", "", KeyRestrictionBehavior.PreventUsage); + // permission.PermitOnly(); + // permissionset.AddPermission(permission); + // permissionset.Demand(); + + // // this connection should NOT be allowed + // MySqlConnection dummyconn = new MySqlConnection(); + // dummyconn.ConnectionString = "server=localhost;User Id=root;database=test;includesecurityasserts=true;"; + // dummyconn.Open(); + // if (dummyconn.State == ConnectionState.Open) dummyconn.Close(); + + //} + + //} +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MySQLHelperTests.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MySQLHelperTests.cs new file mode 100644 index 000000000..2dba3548a --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MySQLHelperTests.cs @@ -0,0 +1,292 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System.Data; +using System.Threading.Tasks; +using System.Threading; + +namespace MySql.Data.MySqlClient.Tests +{ + public class MySQLHelperTests : TestBase + { + protected override void Cleanup() + { + ExecuteSQL(String.Format("DROP TABLE IF EXISTS `{0}`.Test", Connection.Database)); + } + + /// + /// Bug #62585 MySql Connector/NET 6.4.3+ Doesn't escape quotation mark (U+0022) + /// + [Test] + public void EscapeStringMethodCanEscapeQuotationMark() + { + Assume.That(System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Windows)); + + ExecuteSQL("CREATE TABLE Test (id int NOT NULL, name VARCHAR(100))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO test VALUES (1,\"firstname\")", Connection); + cmd.ExecuteNonQuery(); + + cmd = new MySqlCommand("UPDATE test SET name = \"" + MySqlHelper.EscapeString("test\"name\"") + "\";", Connection); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT name FROM Test WHERE id=1"; + string name = (string)cmd.ExecuteScalar(); + + Assert.That("test\"name\"" == name, "Update result with quotation mark"); + } + + #region Async + [Test] + public async Task ExecuteNonQueryAsync() + { + ExecuteSQL("CREATE TABLE MSHNonQueryAsyncTest (id int)"); + ExecuteSQL("CREATE PROCEDURE MSHNonQueryAsyncSpTest() BEGIN SET @x=0; REPEAT INSERT INTO MSHNonQueryAsyncTest VALUES(@x); SET @x=@x+1; UNTIL @x = 100 END REPEAT; END"); + + try + { + int result = await MySqlHelper.ExecuteNonQueryAsync(Connection, "call MSHNonQueryAsyncSpTest", null); + Assert.That(result, Is.Not.EqualTo(-1)); + + MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM MSHNonQueryAsyncTest;", Connection); + cmd.CommandType = System.Data.CommandType.Text; + object cnt = cmd.ExecuteScalar(); + Assert.That(Convert.ToInt32(cnt), Is.EqualTo(100)); + } + finally + { + ExecuteSQL("DROP PROCEDURE MSHNonQueryAsyncSpTest"); + ExecuteSQL("DROP TABLE MSHNonQueryAsyncTest"); + } + } + + [Test] + public async Task ExecuteDataSetAsync() + { + ExecuteSQL("CREATE TABLE MSHDataSetAsyncTable1 (`key` INT, PRIMARY KEY(`key`))"); + ExecuteSQL("CREATE TABLE MSHDataSetAsyncTable2 (`key` INT, PRIMARY KEY(`key`))"); + ExecuteSQL("INSERT INTO MSHDataSetAsyncTable1 VALUES (1)"); + ExecuteSQL("INSERT INTO MSHDataSetAsyncTable2 VALUES (1)"); + + try + { + string sql = "SELECT MSHDataSetAsyncTable1.key FROM MSHDataSetAsyncTable1 WHERE MSHDataSetAsyncTable1.key=1; " + + "SELECT MSHDataSetAsyncTable2.key FROM MSHDataSetAsyncTable2 WHERE MSHDataSetAsyncTable2.key=1"; + DataSet ds = await MySqlHelper.ExecuteDatasetAsync(Connection, sql, null); + Assert.That(ds.Tables.Count, Is.EqualTo(2)); + Assert.That(ds.Tables[0].Rows.Count, Is.EqualTo(1)); + Assert.That(ds.Tables[1].Rows.Count, Is.EqualTo(1)); + Assert.That(ds.Tables[0].Rows[0]["key"], Is.EqualTo(1)); + Assert.That(ds.Tables[1].Rows[0]["key"], Is.EqualTo(1)); + + ds = await MySqlHelper.ExecuteDatasetAsync(Connection, sql); + Assert.That(ds.Tables.Count, Is.EqualTo(2)); + Assert.That(ds.Tables[0].Rows.Count, Is.EqualTo(1)); + Assert.That(ds.Tables[1].Rows[0]["key"], Is.EqualTo(1)); + + ds = await MySqlHelper.ExecuteDatasetAsync(Connection.ConnectionString, sql, null); + Assert.That(ds.Tables[0].Rows.Count, Is.EqualTo(1)); + Assert.That(ds.Tables[1].Rows.Count, Is.EqualTo(1)); + Assert.That(ds.Tables[0].Rows[0]["key"], Is.EqualTo(1)); + + ds = await MySqlHelper.ExecuteDatasetAsync(Connection.ConnectionString, sql); + Assert.That(ds.Tables.Count, Is.EqualTo(2)); + Assert.That(ds.Tables[0].Rows.Count, Is.EqualTo(1)); + Assert.That(ds.Tables[1].Rows[0]["key"], Is.EqualTo(1)); + + ds = await MySqlHelper.ExecuteDatasetAsync(Connection.ConnectionString, sql, CancellationToken.None, null); + Assert.That(ds.Tables.Count, Is.EqualTo(2)); + Assert.That(ds.Tables[0].Rows.Count, Is.EqualTo(1)); + + ds = await MySqlHelper.ExecuteDatasetAsync(Connection, sql, CancellationToken.None); + Assert.That(ds.Tables.Count, Is.EqualTo(2)); + Assert.That(ds.Tables[0].Rows[0]["key"], Is.EqualTo(1)); + } + finally + { + ExecuteSQL("DROP TABLE MSHDataSetAsyncTable1"); + ExecuteSQL("DROP TABLE MSHDataSetAsyncTable2"); + } + } + + [Test] + public async Task ExecuteReaderAsync() + { + ExecuteSQL("CREATE TABLE MSHReaderAsyncTest (id int)"); + ExecuteSQL("CREATE PROCEDURE MSHReaderAsyncSpTest() BEGIN INSERT INTO MSHReaderAsyncTest VALUES(1); SELECT SLEEP(2); SELECT 'done'; END"); + + try + { + using (MySqlDataReader reader = await MySqlHelper.ExecuteReaderAsync(Connection, "call MSHReaderAsyncSpTest")) + { + Assert.That(reader, Is.Not.Null); + Assert.That(reader.Read(), "can read"); + Assert.That(reader.NextResult()); + Assert.That(reader.Read()); + Assert.That(reader.GetString(0), Is.EqualTo("done")); + reader.Close(); + + MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM MSHReaderAsyncTest", Connection); + cmd.CommandType = CommandType.Text; + object cnt = cmd.ExecuteScalar(); + Assert.That(Convert.ToInt32(cnt), Is.EqualTo(1)); + } + } + finally + { + ExecuteSQL("DROP PROCEDURE MSHReaderAsyncSpTest"); + ExecuteSQL("DROP TABLE MSHReaderAsyncTest"); + } + } + + /// + /// Bug #36303124 MySqlHelper.ExecuteReaderAsync causes stack overflow + /// + [Test] + public async Task MySqlHelper_ExecuteReader() + { + try + { + ExecuteSQL("CREATE TABLE Test (`id` int NOT NULL); INSERT INTO Test (id) VALUES (1);"); + + var reader = await MySqlHelper.ExecuteReaderAsync(Connection.ConnectionString, "SELECT * FROM Test WHERE id = @id", new MySqlParameter("@id", 1)); + + Assert.DoesNotThrowAsync(async () => await MySqlHelper.ExecuteReaderAsync(Connection.ConnectionString, "SELECT * FROM Test WHERE id = @id", new MySqlParameter("@id", 1))); + } + finally + { + ExecuteSQL("DROP TABLE Test;"); + } + } + + [Test] + public async Task ExecuteScalarAsync() + { + ExecuteSQL("CREATE TABLE MSHScalarAsyncTable1 (`key` INT, PRIMARY KEY(`key`))"); + ExecuteSQL("INSERT INTO MSHScalarAsyncTable1 VALUES (1)"); + + try + { + object result = await MySqlHelper.ExecuteScalarAsync(Connection, "SELECT MSHScalarAsyncTable1.key FROM MSHScalarAsyncTable1 WHERE MSHScalarAsyncTable1.key=1;"); + Assert.That(int.Parse(result.ToString()), Is.EqualTo(1)); + } + finally + { + ExecuteSQL("DROP TABLE MSHScalarAsyncTable1"); + } + } + + [Test] + public async Task ExecuteDataRowAsync() + { + ExecuteSQL("CREATE TABLE Test (id int NOT NULL, name VARCHAR(100))"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'name')"); + + try + { + DataRow result = await MySqlHelper.ExecuteDataRowAsync(Connection.ConnectionString, "SELECT name FROM Test WHERE id=1", null); + Assert.That(result[0], Is.EqualTo("name")); + + } + finally + { + ExecuteSQL("DROP TABLE Test"); + } + } + + [Test] + public void UpdateDataSet() + { + ExecuteSQL("CREATE TABLE Test (id int NOT NULL, name VARCHAR(100), PRIMARY KEY(`id`))"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'name')"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + da.TableMappings.Add("Table", "Test"); + DataSet ds = new DataSet(); + da.Fill(ds); + ds.Tables["Test"].Rows[0][1] = "updatedName"; + + MySqlHelper.UpdateDataSet(Connection.ConnectionString, "SELECT * FROM Test", ds, "Test"); + DataRow result = ds.Tables["Test"].Rows[0]; + Assert.That(result["name"], Is.EqualTo("updatedName")); + } + + [Test] + public async Task UpdateDataSetAsync() + { + ExecuteSQL("CREATE TABLE Test (id int NOT NULL, name VARCHAR(100), PRIMARY KEY(`id`))"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'name')"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + da.TableMappings.Add("Table", "Test"); + DataSet ds = new DataSet(); + da.Fill(ds); + ds.Tables["Test"].Rows[0][1] = "updatedName"; + + try + { + await MySqlHelper.UpdateDataSetAsync(Connection.ConnectionString, "SELECT * FROM Test", ds, "Test"); + DataRow result = ds.Tables["Test"].Rows[0]; + Assert.That(result["name"], Is.EqualTo("updatedName")); + } + finally + { + ExecuteSQL("DROP TABLE Test"); + } + } + + [Test] + public void ExecuteDataset() + { + ExecuteSQL("CREATE TABLE Test (id int NOT NULL, name VARCHAR(100), PRIMARY KEY(`id`))"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'name')"); + ExecuteSQL("INSERT INTO Test VALUES (2, 'name2')"); + + DataSet ds = MySqlHelper.ExecuteDataset(Connection, "SELECT * FROM Test"); + Assert.That(ds.Tables, Has.One.Items); + Assert.That(ds.Tables[0].Rows.Count, Is.EqualTo(2)); + Assert.That(ds.Tables[0].Rows[0][1], Is.EqualTo("name")); + + MySqlParameter mySqlParameter = new MySqlParameter("@id", 2); + ds = MySqlHelper.ExecuteDataset(Connection, "SELECT * FROM Test WHERE id = @id", mySqlParameter); + Assert.That(ds.Tables, Has.One.Items); + Assert.That(ds.Tables[0].Rows.Count, Is.EqualTo(1)); + Assert.That(ds.Tables[0].Rows[0][1], Is.EqualTo("name2")); + + ds = MySqlHelper.ExecuteDataset(Connection.ConnectionString, "SELECT * FROM Test", null); + Assert.That(ds.Tables, Has.One.Items); + Assert.That(ds.Tables[0].Rows.Count, Is.EqualTo(2)); + Assert.That(ds.Tables[0].Rows[0][1], Is.EqualTo("name")); + Assert.That(ds.Tables[0].Rows[1][1], Is.EqualTo("name2")); + } + #endregion + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MySqlCommandBuilderTests.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MySqlCommandBuilderTests.cs new file mode 100644 index 000000000..0901d9b69 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MySqlCommandBuilderTests.cs @@ -0,0 +1,409 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Data; + +namespace MySql.Data.MySqlClient.Tests +{ + public class MySqlCommandBuilderTests : TestBase + { + protected override void Cleanup() + { + ExecuteSQL(String.Format("DROP TABLE IF EXISTS `{0}`.Test", Connection.Database)); + } + + [Test] + public void MultiWord() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, `multi word` int, PRIMARY KEY(id))"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + DataTable dt = new DataTable(); + da.Fill(dt); + + DataRow row = dt.NewRow(); + row["id"] = 1; + row["name"] = "Name"; + row["dt"] = DBNull.Value; + row["tm"] = DBNull.Value; + row["multi word"] = 2; + dt.Rows.Add(row); + da.Update(dt); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + Assert.That(dt.Rows[0]["multi word"], Is.EqualTo(2)); + + dt.Rows[0]["multi word"] = 3; + da.Update(dt); + cb.Dispose(); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + Assert.That(dt.Rows[0]["multi word"], Is.EqualTo(3)); + } + + [Test] + public void LastOneWins() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, `multi word` int, PRIMARY KEY(id))"); + ExecuteSQL("INSERT INTO Test (id, name) VALUES (1, 'Test')"); + + MySqlCommandBuilder cb = new MySqlCommandBuilder( + new MySqlDataAdapter("SELECT * FROM Test", Connection)); + MySqlDataAdapter da = cb.DataAdapter; + cb.ConflictOption = ConflictOption.OverwriteChanges; + DataTable dt = new DataTable(); + da.Fill(dt); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + + ExecuteSQL("UPDATE Test SET name='Test2' WHERE id=1"); + + dt.Rows[0]["name"] = "Test3"; + Assert.That(da.Update(dt), Is.EqualTo(1)); + + dt.Rows.Clear(); + da.Fill(dt); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + Assert.That(dt.Rows[0]["name"], Is.EqualTo("Test3")); + } + + [Test] + public void NotLastOneWins() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, `multi word` int, PRIMARY KEY(id))"); + ExecuteSQL("INSERT INTO Test (id, name) VALUES (1, 'Test')"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + cb.ConflictOption = ConflictOption.CompareAllSearchableValues; + DataTable dt = new DataTable(); + da.Fill(dt); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + + ExecuteSQL("UPDATE Test SET name='Test2' WHERE id=1"); + dt.Rows[0]["name"] = "Test3"; + void Update() { da.Update(dt); } + Exception ex = Assert.Throws(() => Update()); + Assert.That(ex.Message, Is.EqualTo("Concurrency violation: the UpdateCommand affected 0 of the expected 1 records.")); + + dt.Rows.Clear(); + da.Fill(dt); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + Assert.That(dt.Rows[0]["name"], Is.EqualTo("Test2")); + } + + /// + /// Bug #8574 - MySqlCommandBuilder unable to support sub-queries + /// Bug #11947 - MySQLCommandBuilder mishandling CONCAT() aliased column + /// + [Test] + public void UsingFunctions() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, `multi word` int, PRIMARY KEY(id))"); + ExecuteSQL("INSERT INTO Test (id, name) VALUES (1,'test1')"); + ExecuteSQL("INSERT INTO Test (id, name) VALUES (2,'test2')"); + ExecuteSQL("INSERT INTO Test (id, name) VALUES (3,'test3')"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT id, name, now() as ServerTime FROM Test", Connection); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + DataTable dt = new DataTable(); + da.Fill(dt); + + dt.Rows[0]["id"] = 4; + da.Update(dt); + + da.SelectCommand.CommandText = "SELECT id, name, CONCAT(name, ' boo') as newname from Test where id=4"; + dt.Clear(); + da.Fill(dt); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + Assert.That(dt.Rows[0]["name"], Is.EqualTo("test1")); + Assert.That(dt.Rows[0]["newname"], Is.EqualTo("test1 boo")); + + dt.Rows[0]["id"] = 5; + da.Update(dt); + + dt.Clear(); + da.SelectCommand.CommandText = "SELECT * FROM Test WHERE id=5"; + da.Fill(dt); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + Assert.That(dt.Rows[0]["name"], Is.EqualTo("test1")); + + da.SelectCommand.CommandText = "SELECT *, now() as stime FROM Test WHERE id<4"; + cb = new MySqlCommandBuilder(da); + cb.ConflictOption = ConflictOption.OverwriteChanges; + da.InsertCommand = cb.GetInsertCommand(); + } + + /// + /// Bug #8382 Commandbuilder does not handle queries to other databases than the default one- + /// + [Test] + public void DifferentDatabase() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, `multi word` int, PRIMARY KEY(id))"); + ExecuteSQL("INSERT INTO Test (id, name) VALUES (1,'test1')"); + ExecuteSQL("INSERT INTO Test (id, name) VALUES (2,'test2')"); + ExecuteSQL("INSERT INTO Test (id, name) VALUES (3,'test3')"); + + string oldDb = Connection.Database; + string newDb = CreateDatabase("1"); + Connection.ChangeDatabase(newDb); + + MySqlDataAdapter da = new MySqlDataAdapter( + String.Format("SELECT id, name FROM `{0}`.Test", oldDb), Connection); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + DataSet ds = new DataSet(); + da.Fill(ds); + + ds.Tables[0].Rows[0]["id"] = 4; + DataSet changes = ds.GetChanges(); + da.Update(changes); + ds.Merge(changes); + ds.AcceptChanges(); + cb.Dispose(); + + Connection.ChangeDatabase(oldDb); + } + + /// + /// Bug #13036 Returns error when field names contain any of the following chars %<>()/ etc + /// + [Test] + public void SpecialCharactersInFieldNames() + { + ExecuteSQL("CREATE TABLE Test (`col%1` int PRIMARY KEY, `col()2` int, `col<>3` int, `col/4` int)"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + cb.ToString(); // keep the compiler happy + DataTable dt = new DataTable(); + da.Fill(dt); + DataRow row = dt.NewRow(); + row[0] = 1; + row[1] = 2; + row[2] = 3; + row[3] = 4; + dt.Rows.Add(row); + da.Update(dt); + } + + /// + /// Bug #14631 "#42000Query was empty" + /// + [Test] + public void SemicolonAtEndOfSQL() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), PRIMARY KEY(id))"); + ExecuteSQL("INSERT INTO Test VALUES(1, 'Data')"); + + DataSet ds = new DataSet(); + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM `Test`;", Connection); + da.FillSchema(ds, SchemaType.Source, "Test"); + + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + DataTable dt = new DataTable(); + da.Fill(dt); + dt.Rows[0]["id"] = 2; + da.Update(dt); + + dt.Clear(); + da.Fill(dt); + cb.Dispose(); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + Assert.That(dt.Rows[0]["id"], Is.EqualTo(2)); + } + + /// + /// Bug #23862 Problem with CommandBuilder 'GetInsertCommand' method + /// + [Test] + public void AutoIncrementColumnsOnInsert() + { + ExecuteSQL("CREATE TABLE Test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, " + + "name VARCHAR(100), PRIMARY KEY(id))"); + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + + da.InsertCommand = cb.GetInsertCommand(); + da.InsertCommand.CommandText += "; SELECT last_insert_id()"; + da.InsertCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord; + + DataTable dt = new DataTable(); + da.Fill(dt); + dt.Columns[0].AutoIncrement = true; + Assert.That(dt.Columns[0].AutoIncrement); + dt.Columns[0].AutoIncrementSeed = -1; + dt.Columns[0].AutoIncrementStep = -1; + DataRow row = dt.NewRow(); + row["name"] = "Test"; + + dt.Rows.Add(row); + da.Update(dt); + + dt.Clear(); + da.Fill(dt); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + Assert.That(dt.Rows[0]["id"], Is.EqualTo(1)); + Assert.That(dt.Rows[0]["name"], Is.EqualTo("Test")); + cb.Dispose(); + } + + /// + /// Bug #25569 UpdateRowSource.FirstReturnedRecord does not work + /// + [Test] + public void AutoIncrementColumnsOnInsert2() + { + ExecuteSQL("CREATE TABLE Test (id INT UNSIGNED NOT NULL " + + "AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20))"); + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + + MySqlCommand cmd = (MySqlCommand)(cb.GetInsertCommand() as ICloneable).Clone(); + cmd.CommandText += "; SELECT last_insert_id() as id"; + cmd.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord; + da.InsertCommand = cmd; + + DataTable dt = new DataTable(); + da.Fill(dt); + dt.Rows.Clear(); + + DataRow row = dt.NewRow(); + row["name"] = "Test"; + dt.Rows.Add(row); + da.Update(dt); + Assert.That(Convert.ToInt32(dt.Rows[0]["id"]), Is.EqualTo(1)); + Assert.That(dt.Rows[0]["name"], Is.EqualTo("Test")); + + row = dt.NewRow(); + row["name"] = "Test2"; + dt.Rows.Add(row); + da.Update(dt); + Assert.That(Convert.ToInt32(dt.Rows[1]["id"]), Is.EqualTo(2)); + Assert.That(dt.Rows[1]["name"], Is.EqualTo("Test2")); + + Assert.That(Convert.ToInt32(dt.Rows[0]["id"]), Is.EqualTo(1)); + } + + [Test] + public void MultiUpdate() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, `multi word` int, PRIMARY KEY(id))"); + ExecuteSQL("INSERT INTO Test (id, name) VALUES (1, 'test1')"); + ExecuteSQL("INSERT INTO Test (id, name) VALUES (2, 'test2')"); + ExecuteSQL("INSERT INTO Test (id, name) VALUES (3, 'test3')"); + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + DataTable dt = new DataTable(); + da.Fill(dt); + + dt.Rows[0]["id"] = 4; + dt.Rows[0]["name"] = "test4"; + dt.Rows[1]["id"] = 5; + dt.Rows[1]["name"] = "test5"; + dt.Rows[2]["id"] = 6; + dt.Rows[2]["name"] = "test6"; + DataTable changes = dt.GetChanges(); + da.Update(changes); + dt.AcceptChanges(); + + dt.Rows[0]["id"] = 7; + dt.Rows[0]["name"] = "test7"; + dt.Rows[1]["id"] = 8; + dt.Rows[1]["name"] = "test8"; + dt.Rows[2]["id"] = 9; + dt.Rows[2]["name"] = "test9"; + changes = dt.GetChanges(); + da.Update(changes); + dt.AcceptChanges(); + cb.Dispose(); + } + + /// + /// Bug #30077 MySqlDataAdapter.Update() exception due to date field format + /// + [Test] + public void UpdatingWithDateInKey() + { + ExecuteSQL("CREATE TABLE Test (cod INT, dt DATE, PRIMARY KEY(cod, dt))"); + + ExecuteSQL("INSERT INTO Test (cod, dt) VALUES (1, '2006-1-1')"); + ExecuteSQL("INSERT INTO Test (cod, dt) VALUES (2, '2006-1-2')"); + ExecuteSQL("INSERT INTO Test (cod, dt) VALUES (3, '2006-1-3')"); + ExecuteSQL("INSERT INTO Test (cod, dt) VALUES (4, '2006-1-4')"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test ORDER BY cod", Connection); + MySqlCommandBuilder bld = new MySqlCommandBuilder(da); + bld.ConflictOption = ConflictOption.OverwriteChanges; + DataTable dt = new DataTable(); + da.Fill(dt); + dt.Rows[0]["cod"] = 6; + da.Update(dt); + + dt.Clear(); + da.SelectCommand.CommandText = "SELECT * FROM Test WHERE cod=6"; + da.Fill(dt); + Assert.That(dt.Rows[0]["cod"], Is.EqualTo(6)); + } + + /// + /// Bug #35492 Please implement DbCommandBuilder.QuoteIdentifier + /// + [Test] + public void QuoteAndUnquoteIdentifiers() + { + MySqlCommandBuilder cb = new MySqlCommandBuilder(); + Assert.That(cb.QuoteIdentifier("boo"), Is.EqualTo("`boo`")); + Assert.That(cb.QuoteIdentifier("bo`o"), Is.EqualTo("`bo``o`")); + Assert.That(cb.QuoteIdentifier("`boo`"), Is.EqualTo("`boo`")); + + // now do the unquoting + Assert.That(cb.UnquoteIdentifier("`boo`"), Is.EqualTo("boo")); + Assert.That(cb.UnquoteIdentifier("`boo"), Is.EqualTo("`boo")); + Assert.That(cb.UnquoteIdentifier("`bo``o`"), Is.EqualTo("bo`o")); + } + + /// + /// Bug #33650097 - MySqlCommandBuilder doesn't support tables with a bigint unsigned as primary key + /// This bug was introduced in the attempt to fix Bug#29802379, which is not a C/NET bug per se. + /// + [Test] + public void BigintUnsignedAsPK() + { + ExecuteSQL(@"CREATE TABLE `Test` (`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, + `field1` VARCHAR(45) NOT NULL DEFAULT '', PRIMARY KEY(`id`)); "); + + var adapter = new MySqlDataAdapter("SELECT * FROM Test", Connection); + var commandBuilder = new MySqlCommandBuilder(adapter); + var myCommand = commandBuilder.GetUpdateCommand(); + + Assert.That(myCommand.CommandText, Is.EqualTo($"UPDATE `test` SET `field1` = @p1 WHERE ((`id` = @p2) AND (`field1` = @p3))").IgnoreCase); + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MySqlDataAdapterTests.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MySqlDataAdapterTests.cs new file mode 100644 index 000000000..df80661ab --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MySqlDataAdapterTests.cs @@ -0,0 +1,1442 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Data; +using System.Data.Common; +using System.Net; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient.Tests +{ + public class MySqlDataAdapterTests : TestBase + { + protected override void Cleanup() + { + ExecuteSQL(String.Format("DROP TABLE IF EXISTS `{0}`.Test", Connection.Database)); + } + + private void CreateDefaultTable() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL AUTO_INCREMENT, " + + "id2 INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, " + + "ts TIMESTAMP, OriginalId INT, PRIMARY KEY(id, id2))"); + } + + [Test] + public void TestFill() + { + FillImpl(false); + } + + [Test] + public void TestFillPrepared() + { + FillImpl(true); + } + + private void FillImpl(bool prepare) + { + CreateDefaultTable(); + ExecuteSQL("INSERT INTO Test (id, id2, name, dt) VALUES (NULL, 1, 'Name 1', Now())"); + ExecuteSQL("INSERT INTO Test (id, id2, name, dt) VALUES (NULL, 2, NULL, Now())"); + ExecuteSQL("INSERT INTO Test (id, id2, name, dt) VALUES (NULL, 3, '', Now())"); + + MySqlDataAdapter da = new MySqlDataAdapter("select * from Test", Connection); + if (prepare) da.SelectCommand.Prepare(); + DataSet ds = new DataSet(); + da.Fill(ds, "Test"); + + Assert.That(ds.Tables, Has.One.Items); + Assert.That(ds.Tables[0].Rows.Count, Is.EqualTo(3)); + + Assert.That(ds.Tables[0].Rows[0]["id2"], Is.EqualTo(1)); + Assert.That(ds.Tables[0].Rows[1]["id2"], Is.EqualTo(2)); + Assert.That(ds.Tables[0].Rows[2]["id2"], Is.EqualTo(3)); + + Assert.That(ds.Tables[0].Rows[0]["name"], Is.EqualTo("Name 1")); + Assert.That(ds.Tables[0].Rows[1]["name"], Is.EqualTo(DBNull.Value)); + Assert.That(ds.Tables[0].Rows[2]["name"], Is.EqualTo(String.Empty)); + } + + [Test] + public void TestUpdate() + { + CreateDefaultTable(); + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + DataTable dt = new DataTable(); + da.Fill(dt); + + DataRow dr = dt.NewRow(); + dr["id2"] = 2; + dr["name"] = "TestName1"; + dt.Rows.Add(dr); + int count = da.Update(dt); + + // make sure our refresh of auto increment values worked + Assert.That(count == 1, "checking insert count"); + Assert.That(dt.Rows[dt.Rows.Count - 1]["id"] != null, "Checking auto increment column"); + + dt.Rows.Clear(); + da.Fill(dt); + dt.Rows[0]["id2"] = 3; + dt.Rows[0]["name"] = "TestName2"; + dt.Rows[0]["ts"] = DBNull.Value; + DateTime day1 = new DateTime(2003, 1, 16, 12, 24, 0); + dt.Rows[0]["dt"] = day1; + dt.Rows[0]["tm"] = day1.TimeOfDay; + count = da.Update(dt); + + Assert.That(dt.Rows[0]["ts"] != null, "checking refresh of record"); + Assert.That(dt.Rows[0]["id2"] != null, "checking refresh of primary column"); + + dt.Rows.Clear(); + da.Fill(dt); + + Assert.That(count == 1, "checking update count"); + DateTime dateTime = (DateTime)dt.Rows[0]["dt"]; + Assert.That(day1.Date == dateTime.Date, "checking date"); + Assert.That(day1.TimeOfDay == (TimeSpan)dt.Rows[0]["tm"], "checking time"); + + dt.Rows[0].Delete(); + count = da.Update(dt); + + Assert.That(count == 1, "checking insert count"); + + dt.Rows.Clear(); + da.Fill(dt); + Assert.That(dt.Rows.Count == 0, "checking row count"); + cb.Dispose(); + } + + [Test] + public void OriginalInName() + { + CreateDefaultTable(); + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + cb.ToString(); // keep the compiler happy + DataTable dt = new DataTable(); + da.Fill(dt); + + DataRow row = dt.NewRow(); + row["id"] = DBNull.Value; + row["id2"] = 1; + row["name"] = "Test"; + row["dt"] = DBNull.Value; + row["tm"] = DBNull.Value; + row["ts"] = DBNull.Value; + row["OriginalId"] = 2; + dt.Rows.Add(row); + da.Update(dt); + + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + Assert.That(dt.Rows[0]["OriginalId"], Is.EqualTo(2)); + } + + [Test] + public void UseAdapterPropertyOfCommandBuilder() + { + CreateDefaultTable(); + ExecuteSQL("INSERT INTO Test (id, id2, name) VALUES (NULL, 1, 'Test')"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + MySqlCommandBuilder cb = new MySqlCommandBuilder(); + cb.DataAdapter = da; + + DataTable dt = new DataTable(); + da.Fill(dt); + + dt.Rows[0]["name"] = "Test Update"; + int updateCnt = da.Update(dt); + + Assert.That(updateCnt, Is.EqualTo(1)); + + dt.Rows.Clear(); + da.Fill(dt); + + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + Assert.That(dt.Rows[0]["name"], Is.EqualTo("Test Update")); + } + + [Test] + public void UpdateNullTextFieldToEmptyString() + { + CreateDefaultTable(); + ExecuteSQL("INSERT INTO Test (id, id2, name) VALUES (1, 1, NULL)"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + cb.ToString(); // keep the compiler happy + + DataTable dt = new DataTable(); + da.Fill(dt); + + dt.Rows[0]["name"] = ""; + int updateCnt = da.Update(dt); + + Assert.That(updateCnt, Is.EqualTo(1)); + + dt.Rows.Clear(); + da.Fill(dt); + + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + Assert.That(dt.Rows[0]["name"], Is.EqualTo("")); + } + + [Test] + public void UpdateExtendedTextFields() + { + ExecuteSQL("CREATE TABLE Test (id int, notes MEDIUMTEXT, PRIMARY KEY(id))"); + ExecuteSQL("INSERT INTO Test VALUES(1, 'This is my note')"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + cb.ToString(); // keep the compiler happy + DataTable dt = new DataTable(); + da.Fill(dt); + + dt.Rows[0]["notes"] = "This is my new note"; + da.Update(dt); + + dt.Clear(); + da.Fill(dt); + Assert.That(dt.Rows[0]["notes"], Is.EqualTo("This is my new note")); + } + + [Test] + public void SelectMoreThan252Rows() + { + CreateDefaultTable(); + for (int i = 0; i < 500; i++) + ExecuteSQL("INSERT INTO Test(id, id2) VALUES(NULL, " + i + ")"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + DataTable dt = new DataTable(); + da.Fill(dt); + + Assert.That(dt.Rows.Count, Is.EqualTo(500)); + } + + [Test] + public void DiscreteValues() + { + ExecuteSQL("CREATE TABLE Test (id int, name varchar(200), dt DATETIME, b1 TEXT)"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'Test', '2004-08-01', 'Text 1')"); + ExecuteSQL("INSERT INTO Test VALUES (2, 'Test 1', '2004-07-02', 'Text 2')"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + DataTable dt = new DataTable(); + da.Fill(dt); + + Assert.That(dt.Rows[0]["name"], Is.EqualTo("Test")); + Assert.That(dt.Rows[1]["name"], Is.EqualTo("Test 1")); + + Assert.That(dt.Rows[0]["b1"], Is.EqualTo("Text 1")); + Assert.That(dt.Rows[1]["b1"], Is.EqualTo("Text 2")); + + Assert.That(dt.Rows[0]["dt"].ToString(), Is.EqualTo(new DateTime(2004, 8, 1, 0, 0, 0).ToString())); + Assert.That(dt.Rows[1]["dt"].ToString(), Is.EqualTo(new DateTime(2004, 7, 2, 0, 0, 0).ToString())); + } + + [Test] + public void Bug5798() + { + CreateDefaultTable(); + ExecuteSQL("INSERT INTO Test (id, id2, name) VALUES (1, 1, '')"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + cb.ToString(); // keep the compiler happy + DataTable dt = new DataTable(); + da.Fill(dt); + + Assert.That(dt.Rows[0]["name"], Is.EqualTo(String.Empty)); + + dt.Rows[0]["name"] = "Test"; + da.Update(dt); + + dt.Clear(); + da.Fill(dt); + Assert.That(dt.Rows[0]["name"], Is.EqualTo("Test")); + } + + [Test] + public void ColumnMapping() + { + ExecuteSQL("CREATE TABLE Test (id int, dcname varchar(100), primary key(id))"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'Test1')"); + ExecuteSQL("INSERT INTO Test VALUES (2, 'Test2')"); + ExecuteSQL("INSERT INTO Test VALUES (3, 'Test3')"); + ExecuteSQL("INSERT INTO Test VALUES (4, 'Test4')"); + + } + + [Test] + public void TestFillWithHelper() + { + ExecuteSQL("CREATE TABLE table1 (`key` INT, PRIMARY KEY(`key`))"); + ExecuteSQL("CREATE TABLE table2 (`key` INT, PRIMARY KEY(`key`))"); + ExecuteSQL("INSERT INTO table1 VALUES (1)"); + ExecuteSQL("INSERT INTO table2 VALUES (1)"); + + string sql = "SELECT table1.key FROM table1 WHERE table1.key=1; " + + "SELECT table2.key FROM table2 WHERE table2.key=1"; + DataSet ds = MySqlHelper.ExecuteDataset(Connection, sql, null); + Assert.That(ds.Tables.Count, Is.EqualTo(2)); + Assert.That(ds.Tables[0].Rows.Count, Is.EqualTo(1)); + Assert.That(ds.Tables[1].Rows.Count, Is.EqualTo(1)); + Assert.That(ds.Tables[0].Rows[0]["key"], Is.EqualTo(1)); + Assert.That(ds.Tables[1].Rows[0]["key"], Is.EqualTo(1)); + } + + /// + /// Bug #8509 - MySqlDataAdapter.FillSchema does not interpret unsigned integer + /// + [Test] + public void AutoIncrementColumns() + { + ExecuteSQL("CREATE TABLE Test (id int(10) unsigned NOT NULL auto_increment primary key)"); + ExecuteSQL("INSERT INTO Test VALUES(NULL)"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + DataSet ds = new DataSet(); + da.Fill(ds); + Assert.That(Convert.ToInt32(ds.Tables[0].Rows[0]["id"]), Is.EqualTo(1)); + DataRow row = ds.Tables[0].NewRow(); + ds.Tables[0].Rows.Add(row); + + da.Update(ds); + + ds.Clear(); + da.Fill(ds); + Assert.That(Convert.ToInt32(ds.Tables[0].Rows[0]["id"]), Is.EqualTo(1)); + Assert.That(Convert.ToInt32(ds.Tables[0].Rows[1]["id"]), Is.EqualTo(2)); + cb.Dispose(); + } + + /// + /// Bug #8292 GROUP BY / WITH ROLLUP with DataSet causes System.Data.ConstraintException + /// + [Test] + public void Rollup() + { + ExecuteSQL("CREATE TABLE Test ( id INT NOT NULL, amount INT )"); + ExecuteSQL("INSERT INTO Test VALUES (1, 44)"); + ExecuteSQL("INSERT INTO Test VALUES (2, 88)"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test GROUP BY id WITH ROLLUP", Connection); + DataSet ds = new DataSet(); + da.Fill(ds); + + Assert.That(ds.Tables, Has.One.Items); + Assert.That(ds.Tables[0].Rows.Count, Is.EqualTo(3)); + Assert.That(ds.Tables[0].Rows[2]["amount"], Is.EqualTo(88)); + Assert.That(ds.Tables[0].Rows[2]["id"], Is.EqualTo(DBNull.Value)); + } + + /// + /// Bug #16307 @@Identity returning incorrect value + /// + [Test] + public void Bug16307() + { + ExecuteSQL("CREATE TABLE Test (OrgNum int auto_increment, CallReportNum int, Stamp varchar(50), " + + "WasRealCall varchar(50), WasHangup varchar(50), primary key(orgnum))"); + + string strSQL = "INSERT INTO Test(OrgNum, CallReportNum, Stamp, WasRealCall, WasHangup) " + + "VALUES (?OrgNum, ?CallReportNum, ?Stamp, ?WasRealCall, ?WasHangup)"; + + MySqlCommand cmd = new MySqlCommand(strSQL, Connection); + MySqlParameterCollection pc = cmd.Parameters; + + pc.Add("?OrgNum", MySqlDbType.Int32, 0, "OrgNum"); + pc.Add("?CallReportNum", MySqlDbType.Int32, 0, "CallReportNum"); + pc.Add("?Stamp", MySqlDbType.VarChar, 0, "Stamp"); + pc.Add("?WasRealCall", MySqlDbType.VarChar, 0, "WasRealCall"); + pc.Add("?WasHangup", MySqlDbType.VarChar, 0, "WasHangup"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + da.InsertCommand = cmd; + + DataSet ds = new DataSet(); + da.Fill(ds); + + DataRow row = ds.Tables[0].NewRow(); + row["CallReportNum"] = 1; + row["Stamp"] = "stamp"; + row["WasRealCall"] = "yes"; + row["WasHangup"] = "no"; + ds.Tables[0].Rows.Add(row); + + da.Update(ds.Tables[0]); + + strSQL = "SELECT @@IDENTITY AS 'Identity';"; + MySqlCommand cmd2 = new MySqlCommand(strSQL, Connection); + using (MySqlDataReader reader = cmd2.ExecuteReader()) + { + reader.Read(); + int intCallNum = Int32.Parse(reader.GetValue(0).ToString()); + Assert.That(intCallNum, Is.EqualTo(1)); + } + } + + /// + /// Bug #8131 Data Adapter doesn't close connection + /// + [Test] + public void QuietOpenAndClose() + { + ExecuteSQL("CREATE TABLE Test (id INT, PRIMARY KEY(id))"); + ExecuteSQL("INSERT INTO Test VALUES(1)"); + + using (MySqlConnection c = new MySqlConnection(Settings.ConnectionString)) + { + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", c); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + Assert.That(c.State == ConnectionState.Closed); + DataTable dt = new DataTable(); + da.Fill(dt); + Assert.That(c.State == ConnectionState.Closed); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + + dt.Rows[0][0] = 2; + DataRow[] rows = new DataRow[1]; + rows[0] = dt.Rows[0]; + da.Update(dt); + Assert.That(c.State == ConnectionState.Closed); + + dt.Clear(); + c.Open(); + Assert.That(c.State == ConnectionState.Open); + da.Fill(dt); + Assert.That(c.State == ConnectionState.Open); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + cb.Dispose(); + } + } + + [Test] + public void RangeFill() + { + ExecuteSQL("CREATE TABLE Test (id INT)"); + ExecuteSQL("INSERT INTO Test VALUES (1)"); + ExecuteSQL("INSERT INTO Test VALUES (2)"); + ExecuteSQL("INSERT INTO Test VALUES (3)"); + ExecuteSQL("INSERT INTO Test VALUES (4)"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + DataSet ds = new DataSet(); + da.Fill(ds, 1, 2, "Test"); + } + + [Test] + public void FillWithNulls() + { + ExecuteSQL(@"CREATE TABLE Test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, + name VARCHAR(100), PRIMARY KEY(id))"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + DataTable dt = new DataTable(); + da.Fill(dt); + dt.Columns[0].AutoIncrement = true; + dt.Columns[0].AutoIncrementSeed = -1; + dt.Columns[0].AutoIncrementStep = -1; + DataRow row = dt.NewRow(); + row["name"] = "Test1"; + + dt.Rows.Add(row); + da.Update(dt); + + dt.Clear(); + da.Fill(dt); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + Assert.That(dt.Rows[0]["id"], Is.EqualTo(1)); + Assert.That(dt.Rows[0]["name"], Is.EqualTo("Test1")); + + row = dt.NewRow(); + row["name"] = System.DBNull.Value; + + dt.Rows.Add(row); + da.Update(dt); + + dt.Clear(); + da.Fill(dt); + Assert.That(dt.Rows.Count, Is.EqualTo(2)); + Assert.That(dt.Rows[1]["id"], Is.EqualTo(2)); + Assert.That(dt.Rows[1]["name"], Is.EqualTo(DBNull.Value)); + + row = dt.NewRow(); + row["name"] = "Test3"; + + dt.Rows.Add(row); + da.Update(dt); + + dt.Clear(); + da.Fill(dt); + Assert.That(dt.Rows.Count, Is.EqualTo(3)); + Assert.That(dt.Rows[2]["id"], Is.EqualTo(3)); + Assert.That(dt.Rows[2]["name"], Is.EqualTo("Test3")); + cb.Dispose(); + } + + [Test] + public void PagingFill() + { + CreateDefaultTable(); + ExecuteSQL("INSERT INTO Test (id, id2, name) VALUES (NULL, 1, 'Name 1')"); + ExecuteSQL("INSERT INTO Test (id, id2, name) VALUES (NULL, 2, 'Name 2')"); + ExecuteSQL("INSERT INTO Test (id, id2, name) VALUES (NULL, 3, 'Name 3')"); + ExecuteSQL("INSERT INTO Test (id, id2, name) VALUES (NULL, 4, 'Name 4')"); + ExecuteSQL("INSERT INTO Test (id, id2, name) VALUES (NULL, 5, 'Name 5')"); + ExecuteSQL("INSERT INTO Test (id, id2, name) VALUES (NULL, 6, 'Name 6')"); + ExecuteSQL("INSERT INTO Test (id, id2, name) VALUES (NULL, 7, 'Name 7')"); + ExecuteSQL("INSERT INTO Test (id, id2, name) VALUES (NULL, 8, 'Name 8')"); + ExecuteSQL("INSERT INTO Test (id, id2, name) VALUES (NULL, 9, 'Name 9')"); + ExecuteSQL("INSERT INTO Test (id, id2, name) VALUES (NULL, 10, 'Name 10')"); + ExecuteSQL("INSERT INTO Test (id, id2, name) VALUES (NULL, 11, 'Name 11')"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + DataTable dt = new DataTable(); + da.Fill(0, 10, new DataTable[] { dt }); + Assert.That(dt.Rows.Count, Is.EqualTo(10)); + } + + private string MakeLargeString(int len) + { + System.Text.StringBuilder sb = new System.Text.StringBuilder(len); + while (len-- > 0) + sb.Append('a'); + return sb.ToString(); + } + + [Test] + public void SkippingRowsLargerThan1024() + { + ExecuteSQL("CREATE TABLE Test (id INT, name TEXT)"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?id, ?name)", Connection); + cmd.Parameters.Add("?id", MySqlDbType.Int32); + cmd.Parameters.Add("?name", MySqlDbType.Text); + for (int i = 0; i < 5; i++) + { + cmd.Parameters[0].Value = i; + cmd.Parameters[1].Value = MakeLargeString(2000); + cmd.ExecuteNonQuery(); + } + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + DataTable dt = new DataTable(); + da.Fill(0, 2, new DataTable[] { dt }); + } + + [Test] + public void TestBatchingInserts() + { + Assume.That(System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Windows)); + + ExecuteSQL("CREATE TABLE Test (id INT, name VARCHAR(20), PRIMARY KEY(id))"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + MySqlCommand ins = new MySqlCommand("INSERT INTO test (id, name) VALUES (?p1, ?p2)", Connection); + da.InsertCommand = ins; + ins.UpdatedRowSource = UpdateRowSource.None; + ins.Parameters.Add("?p1", MySqlDbType.Int32).SourceColumn = "id"; + ins.Parameters.Add("?p2", MySqlDbType.VarChar, 20).SourceColumn = "name"; + + DataTable dt = new DataTable(); + da.Fill(dt); + + for (int i = 1; i <= 100; i++) + { + DataRow row = dt.NewRow(); + row["id"] = i; + row["name"] = "name " + i; + dt.Rows.Add(row); + } + + da.UpdateBatchSize = 10; + da.Update(dt); + + dt.Rows.Clear(); + da.Fill(dt); + Assert.That(dt.Rows.Count, Is.EqualTo(100)); + for (int i = 0; i < 100; i++) + { + Assert.That(dt.Rows[i]["id"], Is.EqualTo(i + 1)); + Assert.That(dt.Rows[i]["name"], Is.EqualTo("name " + (i + 1))); + } + } + + [Test] + public void TestBatchingUpdates() + { + ExecuteSQL("CREATE TABLE Test (id INT, name VARCHAR(20), PRIMARY KEY(id))"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'Test 1')"); + ExecuteSQL("INSERT INTO Test VALUES (2, 'Test 2')"); + ExecuteSQL("INSERT INTO Test VALUES (3, 'Test 3')"); + + MySqlDataAdapter dummyDA = new MySqlDataAdapter("SELECT * FROM Test", Connection); + MySqlCommandBuilder cb = new MySqlCommandBuilder(dummyDA); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test ORDER BY id ASC", Connection); + da.UpdateCommand = cb.GetUpdateCommand(); + da.UpdateCommand.UpdatedRowSource = UpdateRowSource.None; + + DataTable dt = new DataTable(); + da.Fill(dt); + + dt.Rows[0]["id"] = 4; + dt.Rows[1]["name"] = "new test value"; + dt.Rows[2]["id"] = 6; + dt.Rows[2]["name"] = "new test value #2"; + + da.UpdateBatchSize = 0; + da.Update(dt); + + dt.Rows.Clear(); + da.Fill(dt); + Assert.That(dt.Rows.Count, Is.EqualTo(3)); + Assert.That(dt.Rows[0]["id"], Is.EqualTo(2)); + Assert.That(dt.Rows[1]["id"], Is.EqualTo(4)); + Assert.That(dt.Rows[2]["id"], Is.EqualTo(6)); + Assert.That(dt.Rows[0]["name"], Is.EqualTo("new test value")); + Assert.That(dt.Rows[1]["name"], Is.EqualTo("Test 1")); + Assert.That(dt.Rows[2]["name"], Is.EqualTo("new test value #2")); + } + + [Test] + public void TestBatchingMixed() + { + ExecuteSQL("CREATE TABLE Test (id INT, name VARCHAR(20), PRIMARY KEY(id))"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'Test 1')"); + ExecuteSQL("INSERT INTO Test VALUES (2, 'Test 2')"); + ExecuteSQL("INSERT INTO Test VALUES (3, 'Test 3')"); + + MySqlDataAdapter dummyDA = new MySqlDataAdapter("SELECT * FROM Test", Connection); + MySqlCommandBuilder cb = new MySqlCommandBuilder(dummyDA); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test ORDER BY id", Connection); + da.UpdateCommand = cb.GetUpdateCommand(); + da.InsertCommand = cb.GetInsertCommand(); + da.DeleteCommand = cb.GetDeleteCommand(); + da.UpdateCommand.UpdatedRowSource = UpdateRowSource.None; + da.InsertCommand.UpdatedRowSource = UpdateRowSource.None; + da.DeleteCommand.UpdatedRowSource = UpdateRowSource.None; + + DataTable dt = new DataTable(); + da.Fill(dt); + + dt.Rows[0]["id"] = 4; + dt.Rows[1]["name"] = "new test value"; + dt.Rows[2]["id"] = 6; + dt.Rows[2]["name"] = "new test value #2"; + + DataRow row = dt.NewRow(); + row["id"] = 7; + row["name"] = "foobar"; + dt.Rows.Add(row); + + dt.Rows[1].Delete(); + + da.UpdateBatchSize = 0; + da.Update(dt); + + dt.Rows.Clear(); + da.Fill(dt); + Assert.That(dt.Rows.Count, Is.EqualTo(3)); + Assert.That(dt.Rows[0]["id"], Is.EqualTo(4)); + Assert.That(dt.Rows[1]["id"], Is.EqualTo(6)); + Assert.That(dt.Rows[2]["id"], Is.EqualTo(7)); + Assert.That(dt.Rows[0]["name"], Is.EqualTo("Test 1")); + Assert.That(dt.Rows[1]["name"], Is.EqualTo("new test value #2")); + Assert.That(dt.Rows[2]["name"], Is.EqualTo("foobar")); + } + + [Test] + [Ignore("Fix This")] + public void TestBatchingInsertsMoreThanMaxPacket() + { + int blobSize = 64000; + + ExecuteSQL("CREATE TABLE TestBatchingInsertsMoreThanMaxPacket (id INT, img BLOB, PRIMARY KEY(id))"); + + int numRows = (MaxPacketSize / blobSize) * 2; + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM TestBatchingInsertsMoreThanMaxPacket", Connection); + MySqlCommand ins = new MySqlCommand("INSERT INTO TestBatchingInsertsMoreThanMaxPacket (id, img) VALUES (@p1, @p2)", Connection); + da.InsertCommand = ins; + ins.UpdatedRowSource = UpdateRowSource.None; + ins.Parameters.Add("@p1", MySqlDbType.Int32).SourceColumn = "id"; + ins.Parameters.Add("@p2", MySqlDbType.Blob).SourceColumn = "img"; + + DataTable dt = new DataTable(); + da.Fill(dt); + + for (int i = 0; i < numRows; i++) + { + DataRow row = dt.NewRow(); + row["id"] = i; + row["img"] = Utils.CreateBlob(blobSize); + dt.Rows.Add(row); + } + + da.UpdateBatchSize = 0; + da.Update(dt); + + dt.Rows.Clear(); + da.Fill(dt); + Assert.That(dt.Rows.Count, Is.EqualTo(numRows)); + for (int i = 0; i < numRows; i++) + Assert.That(dt.Rows[i]["id"], Is.EqualTo(i)); + } + + /// + /// Bug#35240186 Contribution: Run inserts in batch command as one block + /// + [Test] + [TestCase(true)] + [TestCase(false)] + public void TestBatchingInsertsAllRowsInOneGo(bool rewriteStatements) + { + ExecuteSQL("CREATE TABLE Test (id INT AUTO_INCREMENT, name VARCHAR(20), PRIMARY KEY(id))"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'Test 1')"); + using MySqlConnection conn = new MySqlConnection(Connection.ConnectionString + ";rewritebatchedstatements=" + rewriteStatements.ToString() + ";"); + { + conn.Open(); + bool testing = true; + Console.WriteLine(testing.ToString()); + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", conn); + MySqlCommand ins = new MySqlCommand("INSERT INTO Test (id, name) VALUES (?p1, ?p2)", conn); + da.InsertCommand = ins; + ins.UpdatedRowSource = UpdateRowSource.None; + ins.Parameters.Add("?p1", MySqlDbType.Int32).SourceColumn = "id"; + ins.Parameters.Add("?p2", MySqlDbType.VarChar, 20).SourceColumn = "name"; + + DataTable dt = new DataTable(); + da.Fill(dt); + + for (int i = 1; i <= 3; i++) + { + DataRow row = dt.NewRow(); + row["id"] = DBNull.Value; + row["name"] = "name " + i; + dt.Rows.Add(row); + } + + da.UpdateBatchSize = 0; + da.Update(dt); + MySqlCommand lsid = new MySqlCommand("SELECT LAST_INSERT_ID();", conn); + var lastInsertedId = (ulong)lsid.ExecuteScalar(); + + if (rewriteStatements) + { + //The batched statements are rewritten to be processed all together, that is why the last inserted ID is 2 + Assert.That(lastInsertedId, Is.EqualTo(2)); + } + else + { + //The batched statements are not rewritten, and are processed one by one, in this case the last inserted ID is 4 + Assert.That(lastInsertedId, Is.EqualTo(4)); + } + } + } + + [Test] + public void FunctionsReturnString() + { + string connStr = Settings.ConnectionString + ";functions return string=yes"; + + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + MySqlDataAdapter da = new MySqlDataAdapter("SELECT CONCAT(1,2)", c); + DataTable dt = new DataTable(); + da.Fill(dt); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + Assert.That(dt.Rows[0][0], Is.EqualTo("12")); + Assert.That(dt.Rows[0][0] is string); + } + } + + /// + /// Bug #34657 MySqlDataAdapter.Update(DataRow[] rows) fails with MySqlCommandBuilder + /// + [Test] + public void ConnectionNotOpenForInsert() + { + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL(@"CREATE TABLE Test (id int(11) NOT NULL default '0', + txt varchar(100) default NULL, val decimal(11,2) default NULL, + PRIMARY KEY(id)) ENGINE=InnoDB DEFAULT CHARSET=latin1"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'name', 23.2)"); + + using (MySqlConnection c = new MySqlConnection(Settings.ConnectionString)) + { + string sql = "SELECT * FROM Test"; + MySqlDataAdapter da = new MySqlDataAdapter(sql, c); + MySqlCommandBuilder bld = new MySqlCommandBuilder(da); + DataSet ds = new DataSet(); + da.Fill(ds); + + ds.Tables[0].Rows[0]["val"] = 99.9M; + da.Update(new DataRow[] { ds.Tables[0].Rows[0] }); + + DataRow r = ds.Tables[0].NewRow(); + r["id"] = 4; + r["txt"] = "sds"; + r["val"] = 113.2M; + ds.Tables[0].Rows.Add(r); + da.Update(new DataRow[] { r }); + } + } + + /// + /// Bug#54863 : several datadapter.Update()s with DataTable changes in + /// between can result into ConcurrencyException + /// + [Test] + public void AdapterConcurrentException() + { + ExecuteSQL( + "CREATE TABLE T (" + + "id_auto int(11) NOT NULL AUTO_INCREMENT," + + "field varchar(50) DEFAULT NULL," + + "PRIMARY KEY (id_auto))"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM T", Connection); + da.InsertCommand = Connection.CreateCommand(); + da.InsertCommand.CommandText = @"INSERT INTO T(field) VALUES (@p_field); + SELECT * FROM T WHERE id_auto=@@IDENTITY"; + da.InsertCommand.Parameters.Add("@p_field", MySqlDbType.VarChar, 50, "field"); + da.InsertCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord; + + da.DeleteCommand = Connection.CreateCommand(); + da.DeleteCommand.CommandText = "DELETE FROM T WHERE id_auto=@id_auto"; + da.DeleteCommand.Parameters.Add("@id_auto", MySqlDbType.Int32, 4, "id_auto"); + + DataSet ds = new DataSet(); + da.Fill(ds, "T"); + + DataTable table = ds.Tables["T"]; + DataRow r = table.NewRow(); + r["field"] = "row"; + table.Rows.Add(r); + da.Update(table); + + Assert.That(r.RowState, Is.EqualTo(DataRowState.Unchanged)); + + table.Rows[0].Delete(); + + r = table.NewRow(); + r["field"] = "row2"; + table.Rows.Add(r); + + da.Update(table); // here was concurrencyviolation + da.Fill(ds); + Assert.That(ds.Tables["T"].Rows.Count, Is.EqualTo(1)); + Assert.That(ds.Tables["T"].Rows[0]["field"], Is.EqualTo("row2")); + } + + /// + /// Bug #38411, using closed connection with data adapter. + /// + [Test] + public void BatchingConnectionClosed() + { + ExecuteSQL("CREATE TABLE Test (id INT, name VARCHAR(20), PRIMARY KEY(id))"); + + string connStr = Settings.ConnectionString; + MySqlConnection c = new MySqlConnection(connStr); + MySqlConnection c2 = new MySqlConnection(connStr); + MySqlConnection c3 = new MySqlConnection(connStr); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", c); + MySqlCommand ins = new MySqlCommand("INSERT INTO Test (id, name) VALUES (?p1, ?p2)", c); + da.InsertCommand = ins; + ins.UpdatedRowSource = UpdateRowSource.None; + ins.Parameters.Add("?p1", MySqlDbType.Int32).SourceColumn = "id"; + ins.Parameters.Add("?p2", MySqlDbType.VarChar, 20).SourceColumn = "name"; + + MySqlCommand del = new MySqlCommand("delete from Test where id=?p1", c2); + da.DeleteCommand = del; + del.UpdatedRowSource = UpdateRowSource.None; + del.Parameters.Add("?p1", MySqlDbType.Int32).SourceColumn = "id"; + + + MySqlCommand upd = new MySqlCommand("update Test set id=?p1, name=?p2 where id=?p1", c3); + da.UpdateCommand = upd; + upd.UpdatedRowSource = UpdateRowSource.None; + upd.Parameters.Add("?p1", MySqlDbType.Int32).SourceColumn = "id"; + upd.Parameters.Add("?p2", MySqlDbType.VarChar, 20).SourceColumn = "name"; + + DataTable dt = new DataTable(); + da.Fill(dt); + + for (int i = 1; i <= 100; i++) + { + DataRow row = dt.NewRow(); + row["id"] = i; + row["name"] = "name " + i; + dt.Rows.Add(row); + } + + da.UpdateBatchSize = 10; + da.Update(dt); + + dt.Rows.Clear(); + da.Fill(dt); + Assert.That(dt.Rows.Count, Is.EqualTo(100)); + for (int i = 0; i < 100; i++) + { + Assert.That(dt.Rows[i]["id"], Is.EqualTo(i + 1)); + Assert.That(dt.Rows[i]["name"], Is.EqualTo("name " + (i + 1))); + } + + foreach (DataRow row in dt.Rows) + { + row["name"] = row["name"] + "_xxx"; + } + da.Update(dt); + for (int i = 0; i < 100; i++) + { + dt.Rows[i].Delete(); + } + da.Update(dt); + dt.Rows.Clear(); + da.Fill(dt); + Assert.That(dt.Rows.Count, Is.EqualTo(0)); + + } + + /// + /// Bug#54895 + /// ConcurrencyException when trying to use UpdateRowSource.FirstReturnedRecord + /// with UpdateCommand and stored procedure. + /// + [Test] + public void UpdateReturnFirstRecord() + { + string createTable = + "CREATE TABLE `bugtable` ( " + + "`id_auto` int(11) NOT NULL AUTO_INCREMENT," + + "`field` varchar(50) DEFAULT NULL," + + "counter int NOT NULL DEFAULT 0," + + "PRIMARY KEY (`id_auto`)" + + ")"; + + string procGetAll = + "CREATE PROCEDURE sp_getall_bugtable()" + + " BEGIN " + + "select * from bugtable;" + + " END "; + + string procUpdate = + "CREATE PROCEDURE sp_updatebugtable(" + + "in p_id_auto int, " + + "in p_field varchar(50)) " + + "BEGIN " + + "update bugtable set field = p_field, counter = counter+1 where id_auto=p_id_auto; " + + "select * from bugtable where id_auto=p_id_auto; " + /*retrieve updated row*/ + "END "; + + ExecuteSQL(createTable); + ExecuteSQL(procGetAll); + ExecuteSQL(procUpdate); + + + /* Add one row to the table */ + MySqlCommand cmd = new MySqlCommand( + "insert into bugtable(field) values('x')", Connection); + cmd.ExecuteNonQuery(); + + + DataSet ds = new DataSet(); + MySqlDataAdapter da = new MySqlDataAdapter(); + + da.SelectCommand = Connection.CreateCommand(); + da.SelectCommand.CommandType = CommandType.StoredProcedure; + da.SelectCommand.CommandText = "sp_getall_bugtable"; + + da.UpdateCommand = Connection.CreateCommand(); + da.UpdateCommand.CommandType = CommandType.StoredProcedure; + da.UpdateCommand.CommandText = "sp_updatebugtable"; + da.UpdateCommand.Parameters.Add("p_id_auto", MySqlDbType.Int32, 4, "id_auto"); + da.UpdateCommand.Parameters.Add("p_field", MySqlDbType.VarChar, 4, "field"); + da.UpdateCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord; + + + da.Fill(ds, "bugtable"); + DataTable table = ds.Tables["bugtable"]; + DataRow row = table.Rows[0]; + row["field"] = "newvalue"; + Assert.That(row.RowState, Is.EqualTo(DataRowState.Modified)); + Assert.That((int)row["counter"], Is.EqualTo(0)); + + da.Update(table); + + // Verify that "counter" field was changed by updating stored procedure. + Assert.That((int)row["counter"], Is.EqualTo(1)); + } + + [Test] + public void FillFromStoredProcedureMultipleTimesCreatesExpectedRows() + { + ExecuteSQL("CREATE PROCEDURE SimpleSelect() BEGIN SELECT 'ADummyVal' as DummyVal; END"); + + MySqlConnectionStringBuilder cb = new MySqlConnectionStringBuilder(Settings.ConnectionString); + cb.Pooling = true; + + using (MySqlConnection connection = new MySqlConnection(cb.ConnectionString)) + { + MySqlDataAdapter adapter = new MySqlDataAdapter("SimpleSelect", connection); + adapter.SelectCommand.CommandType = CommandType.StoredProcedure; + DataTable table = new DataTable(); + adapter.Fill(table); + Assert.That(table.Rows.Count, Is.EqualTo(1)); + + adapter = new MySqlDataAdapter("SimpleSelect", connection); + adapter.SelectCommand.CommandType = CommandType.StoredProcedure; + table = new DataTable(); + adapter.Fill(table); + Assert.That(table.Rows.Count, Is.EqualTo(1)); + + MySqlConnection.ClearPool(connection); + } + } + + [Test] + public void ChangeStoredProcedureBasedSelectCommandDoesNotThrow() + { + ExecuteSQL("CREATE PROCEDURE SimpleSelect1() BEGIN SELECT 'ADummyVal' as DummyVal; END"); + ExecuteSQL("CREATE PROCEDURE SimpleSelect2() BEGIN SELECT 'ADummyVal' as DummyVal; END"); + + MySqlConnectionStringBuilder cb = new MySqlConnectionStringBuilder(Settings.ConnectionString); + cb.Pooling = true; + + using (MySqlConnection connection = new MySqlConnection(cb.ConnectionString)) + { + MySqlDataAdapter adapter = new MySqlDataAdapter("SimpleSelect1", connection); + adapter.SelectCommand.CommandType = CommandType.StoredProcedure; + DataTable table = new DataTable(); + adapter.Fill(table); + Assert.That(table.Rows.Count, Is.EqualTo(1)); + + adapter.SelectCommand = new MySqlCommand("SimpleSelect2", connection); + adapter.SelectCommand.CommandType = CommandType.StoredProcedure; + table = new DataTable(); + + try + { + adapter.Fill(table); + Assert.That(table.Rows.Count, Is.EqualTo(1)); + } + finally + { + MySqlConnection.ClearPool(connection); + } + } + } + + [Test, Description("CommandBuilder Async ")] + public async Task CommandBuilderAsync() + { + ExecuteSQL("CREATE TABLE DAActor (id INT NOT NULL AUTO_INCREMENT, name VARCHAR(100),PRIMARY KEY(id))"); + ExecuteSQL("INSERT INTO DAActor (name) VALUES ('Name 1')"); + ExecuteSQL("INSERT INTO DAActor (name) VALUES ('Name 2')"); + using (var conn = new MySqlConnection(Settings.ConnectionString)) + { + await conn.OpenAsync(); + var da = new MySqlDataAdapter("SELECT * FROM DAActor", conn); + var cb = new MySqlCommandBuilder(da); + var dt = new DataTable(); + dt.Clear(); + await da.FillAsync(dt); // asynchronous + + dt.Rows[0][1] = "my changed value 1"; + var changes = dt.GetChanges(); + var count = da.Update(changes); + dt.AcceptChanges(); + Assert.That(count == 1, "checking update count"); + await conn.CloseAsync(); + } + + using (var conn = new MySqlConnection(Settings.ConnectionString)) + { + await conn.OpenAsync(); + var da = new MySqlDataAdapter("SELECT * FROM DAActor", conn); + var cb = new MySqlCommandBuilder(da); + var dt = new DataTable(); + await da.FillAsync(dt); + await da.UpdateAsync(dt); // asynchronous + + dt.Rows[0][1] = "my changed value 2"; + var changes = dt.GetChanges(); + var count = da.Update(changes); + dt.AcceptChanges(); + Assert.That(count == 1, "checking update count"); + await conn.CloseAsync(); + } + } + + /// + /// Bug #22913833 - COMMANDS IGNORED AND NO ERROR PRODUCED WHEN PACKET OVER MAX_ALLOWED_PACKET + /// When the size of the query exceeded the size of the 'max_allowed_packet', it just ignore the query and jump to the next one. This + /// behavior changed to raise an exception instead to avoid partial batch inserts + /// + [Test] + public void BatchOverMaxPacketAllowed() + { + // setting the 'max_allowed_packet' to its minimum so we can reproduce the issue easily + ExecuteSQL("SET GLOBAL max_allowed_packet = 1024", true); + ExecuteSQL("CREATE TABLE Test (Id INT NOT NULL AUTO_INCREMENT, Col1 VARCHAR(250), Blob1 LONGBLOB, PRIMARY KEY(Id))"); + + using (var conn = new MySqlConnection(Connection.ConnectionString)) + { + conn.Open(); + + MySqlDataAdapter dataAdapter = new MySqlDataAdapter("SELECT Col1, Blob1 FROM Test", conn); + MySqlCommandBuilder mySqlCommandBuilder = new MySqlCommandBuilder(dataAdapter); + dataAdapter.InsertCommand = mySqlCommandBuilder.GetInsertCommand(); + DataTable dataTable = new(); + dataAdapter.Fill(dataTable); + + StringBuilder stringBuilder = new(); + Random random = new(); + // generate random text + for (int i = 0; i < 200; i++) + { + var _char = (char)random.Next(65, 90); + stringBuilder.Append(_char); + } + + // generate random byte array + byte[] buf = new byte[500]; + random.NextBytes(buf); + + DataRow[] dataRows = new DataRow[2]; + for (int i = 0; i < 2; i++) + { + dataRows[i] = dataTable.NewRow(); + dataRows[i][0] = $"Col1Value_{i}_{stringBuilder.ToString()}"; + dataRows[i][1] = buf; + dataTable.Rows.Add(dataRows[i]); + } + + dataAdapter.UpdateBatchSize = 2; + var ex = Assert.Throws(() => dataAdapter.Update(dataRows)); + Assert.That(ex.Message, Is.EqualTo(Resources.QueryTooLarge).IgnoreCase); + } + + // setting back to the initial value + ExecuteSQL($"SET GLOBAL max_allowed_packet = {MaxPacketSize}", true); + } + + #region Async + [Test] + public async Task FillAsyncDataSet() + { + ExecuteSQL("CREATE TABLE DAFillAsyncTest (id INT NOT NULL AUTO_INCREMENT, id2 INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, ts TIMESTAMP, OriginalId INT, PRIMARY KEY(id, id2))"); + ExecuteSQL("INSERT INTO DAFillAsyncTest (id, id2, name, dt) VALUES (NULL, 1, 'Name 1', Now())"); + ExecuteSQL("INSERT INTO DAFillAsyncTest (id, id2, name, dt) VALUES (NULL, 2, NULL, Now())"); + ExecuteSQL("INSERT INTO DAFillAsyncTest (id, id2, name, dt) VALUES (NULL, 3, '', Now())"); + + MySqlDataAdapter da = new MySqlDataAdapter("select * from DAFillAsyncTest", Connection); + DataSet ds = new DataSet(); + await da.FillAsync(ds, "DAFillAsyncTest"); + + Assert.That(ds.Tables, Has.One.Items); + Assert.That(ds.Tables[0].Rows.Count, Is.EqualTo(3)); + + Assert.That(ds.Tables[0].Rows[0]["id2"], Is.EqualTo(1)); + Assert.That(ds.Tables[0].Rows[1]["id2"], Is.EqualTo(2)); + Assert.That(ds.Tables[0].Rows[2]["id2"], Is.EqualTo(3)); + + Assert.That(ds.Tables[0].Rows[0]["name"], Is.EqualTo("Name 1")); + Assert.That(ds.Tables[0].Rows[1]["name"], Is.EqualTo(DBNull.Value)); + Assert.That(ds.Tables[0].Rows[2]["name"], Is.EqualTo(String.Empty)); + + ds.Reset(); + await da.FillAsync(ds); + + Assert.That(ds.Tables, Has.One.Items); + Assert.That(ds.Tables[0].Rows.Count, Is.EqualTo(3)); + Assert.That(ds.Tables[0].Rows[0]["name"], Is.EqualTo("Name 1")); + + ds.Reset(); + await da.FillAsync(ds, 1, 2, "DAFillAsyncTest"); + + Assert.That(ds.Tables, Has.One.Items); + Assert.That(ds.Tables[0].Rows.Count, Is.EqualTo(2)); + Assert.That(ds.Tables[0].Rows[0]["id2"], Is.EqualTo(2)); + Assert.That(ds.Tables[0].Rows[0]["name"], Is.EqualTo(DBNull.Value)); + Assert.That(ds.Tables[0].Rows[1]["name"], Is.EqualTo(String.Empty)); + + ds.Reset(); + using (MySqlCommand cmd = new MySqlCommand("select * from DAFillAsyncTest", Connection)) + using (MySqlDataReader reader = cmd.ExecuteReader()) + await da.FillAsync(ds, "DAFillAsyncTest", reader, 0, 1); + + Assert.That(ds.Tables, Has.One.Items); + Assert.That(ds.Tables[0].Rows.Count, Is.EqualTo(1)); + Assert.That(ds.Tables[0].Rows[0]["id2"], Is.EqualTo(1)); + Assert.That(ds.Tables[0].Rows[0]["name"], Is.EqualTo("Name 1")); + + ds.Reset(); + using (MySqlCommand cmd = new MySqlCommand("select * from DAFillAsyncTest", Connection)) + await da.FillAsync(ds, 0, 2, "DAFillAsyncTest", cmd, CommandBehavior.Default); + + Assert.That(ds.Tables, Has.One.Items); + Assert.That(ds.Tables[0].Rows.Count, Is.EqualTo(2)); + Assert.That(ds.Tables[0].Rows[0]["id2"], Is.EqualTo(1)); + Assert.That(ds.Tables[0].Rows[1]["name"], Is.EqualTo(DBNull.Value)); + } + + [Test] + public async Task FillAsyncDataTable() + { + ExecuteSQL("CREATE TABLE DAFillAsyncDtTest (id INT NOT NULL AUTO_INCREMENT, id2 INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, ts TIMESTAMP, OriginalId INT, PRIMARY KEY(id, id2))"); + ExecuteSQL("INSERT INTO DAFillAsyncDtTest (id, id2, name, dt) VALUES (NULL, 1, 'Name 1', Now())"); + ExecuteSQL("INSERT INTO DAFillAsyncDtTest (id, id2, name, dt) VALUES (NULL, 2, NULL, Now())"); + ExecuteSQL("INSERT INTO DAFillAsyncDtTest (id, id2, name, dt) VALUES (NULL, 3, '', Now())"); + + MySqlDataAdapter da = new MySqlDataAdapter("select * from DAFillAsyncDtTest", Connection); + + DataTable dt = new DataTable(); + await da.FillAsync(dt); + + Assert.That(dt.Rows.Count, Is.EqualTo(3)); + Assert.That(dt.Columns.Count, Is.EqualTo(7)); + Assert.That(dt.Rows[0]["name"], Is.EqualTo("Name 1")); + Assert.That(dt.Rows[1]["name"], Is.EqualTo(DBNull.Value)); + Assert.That(dt.Rows[2]["name"], Is.EqualTo(String.Empty)); + + dt.Reset(); + using (MySqlCommand cmd = new MySqlCommand("select * from DAFillAsyncDtTest", Connection)) + using (MySqlDataReader reader = cmd.ExecuteReader()) + await da.FillAsync(dt, reader); + + Assert.That(dt.Rows.Count, Is.EqualTo(3)); + Assert.That(dt.Columns.Count, Is.EqualTo(7)); + Assert.That(dt.Rows[0]["id2"], Is.EqualTo(1)); + Assert.That(dt.Rows[1]["id2"], Is.EqualTo(2)); + Assert.That(dt.Rows[2]["id2"], Is.EqualTo(3)); + + dt.Reset(); + using (MySqlCommand cmd = new MySqlCommand("select * from DAFillAsyncDtTest", Connection)) + await da.FillAsync(dt, cmd, CommandBehavior.Default); + + Assert.That(dt.Rows.Count, Is.EqualTo(3)); + Assert.That(dt.Columns.Count, Is.EqualTo(7)); + Assert.That(dt.Rows[1]["name"], Is.EqualTo(DBNull.Value)); + Assert.That(dt.Rows[1]["id2"], Is.EqualTo(2)); + Assert.That(dt.Rows[2]["id2"], Is.EqualTo(3)); + + dt.Reset(); + DataTable[] dataTables = { dt }; + await da.FillAsync(0, 1, dataTables); + + Assert.That(dataTables, Has.One.Items); + Assert.That(dataTables[0].Rows.Count, Is.EqualTo(1)); + Assert.That(dataTables[0].Rows[0]["id2"], Is.EqualTo(1)); + Assert.That(dataTables[0].Rows[0]["name"], Is.EqualTo("Name 1")); + + dt.Reset(); + using (MySqlCommand cmd = new MySqlCommand("select * from DAFillAsyncDtTest", Connection)) + await da.FillAsync(dataTables, 1, 2, cmd, CommandBehavior.Default); + + Assert.That(dataTables, Has.One.Items); + Assert.That(dataTables[0].Rows.Count, Is.EqualTo(2)); + Assert.That(dataTables[0].Rows[0]["id2"], Is.EqualTo(2)); + Assert.That(dataTables[0].Rows[0]["name"], Is.EqualTo(DBNull.Value)); + Assert.That(dataTables[0].Rows[1]["name"], Is.EqualTo(String.Empty)); + } + + [Test] + public async Task FillSchemaAsync() + { + ExecuteSQL("CREATE PROCEDURE DAFillSchemaAsyncSpTest() BEGIN SELECT * FROM DAFillSchemaAsyncTest; END"); + ExecuteSQL(@"CREATE TABLE DAFillSchemaAsyncTest(id INT AUTO_INCREMENT, name VARCHAR(20), PRIMARY KEY (id)) "); + + MySqlCommand cmd = new MySqlCommand("DAFillSchemaAsyncSpTest", Connection); + cmd.CommandType = CommandType.StoredProcedure; + + MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly); + reader.Read(); + reader.Close(); + + MySqlDataAdapter da = new MySqlDataAdapter(cmd); + DataTable schema = new DataTable(); + await da.FillSchemaAsync(schema, SchemaType.Source); + Assert.That(schema.Columns.Count, Is.EqualTo(2)); + + DataSet ds = new DataSet(); + await da.FillSchemaAsync(ds, SchemaType.Source); + Assert.That(ds.Tables.Count == 1); + Assert.That(ds.Tables[0].Columns.Count, Is.EqualTo(2)); + + ds.Reset(); + using (cmd) + using (reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly)) + await da.FillSchemaAsync(ds, SchemaType.Source, "DAFillSchemaAsyncTest", reader); + + Assert.That(ds.Tables.Count == 1); + Assert.That(ds.Tables[0].Columns.Count, Is.EqualTo(2)); + + ds.Reset(); + using (cmd) + await da.FillSchemaAsync(ds, SchemaType.Source, cmd, "DAFillSchemaAsyncTest", CommandBehavior.SchemaOnly); + + Assert.That(ds.Tables.Count == 1); + Assert.That(ds.Tables[0].Columns.Count, Is.EqualTo(2)); + + ds.Reset(); + using (cmd) + await da.FillSchemaAsync(ds, SchemaType.Source, "DAFillSchemaAsyncTest", CancellationToken.None); + + Assert.That(ds.Tables.Count == 1); + Assert.That(ds.Tables[0].Columns.Count, Is.EqualTo(2)); + + DataTable dataTable = new DataTable(); + using (cmd) + using (reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly)) + await da.FillSchemaAsync(dataTable, SchemaType.Source, reader); + + Assert.That(dataTable.Columns.Count, Is.EqualTo(2)); + + dataTable.Reset(); + using (cmd) + await da.FillSchemaAsync(dataTable, SchemaType.Source, cmd, CommandBehavior.SchemaOnly); + + Assert.That(dataTable.Columns.Count, Is.EqualTo(2)); + Assert.That(dataTable.Columns[0].ColumnName, Is.EqualTo("id")); + } + + [Test] + public async Task UpdateAsync() + { + ExecuteSQL("CREATE TABLE DAUpdateAsyncTest (id INT NOT NULL AUTO_INCREMENT, id2 INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, ts TIMESTAMP, OriginalId INT, PRIMARY KEY(id, id2))"); + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM DAUpdateAsyncTest;", Connection); + MySqlCommandBuilder cb = new MySqlCommandBuilder(da); + DataTable dt = new DataTable(); + da.Fill(dt); + + DataRow dr = dt.NewRow(); + dr["id2"] = 2; + dr["name"] = "TestName1"; + dt.Rows.Add(dr); + int count = await da.UpdateAsync(dt); + + Assert.That(count == 1, "checking insert count"); + Assert.That(dt.Rows[dt.Rows.Count - 1]["id"] != null, "Checking auto increment column"); + + dt.Rows.Clear(); + da.Fill(dt); + dt.Rows[0]["id2"] = 3; + dt.Rows[0]["name"] = "TestName2"; + dt.Rows[0]["ts"] = DBNull.Value; + DateTime day1 = new DateTime(2003, 1, 16, 12, 24, 0); + dt.Rows[0]["dt"] = day1; + dt.Rows[0]["tm"] = day1.TimeOfDay; + count = await da.UpdateAsync(dt); + + Assert.That(dt.Rows[0]["ts"] != null, "checking refresh of record"); + Assert.That(dt.Rows[0]["id2"] != null, "checking refresh of primary column"); + + dt.Rows.Clear(); + da.Fill(dt); + + Assert.That(count == 1, "checking update count"); + DateTime dateTime = (DateTime)dt.Rows[0]["dt"]; + Assert.That(day1.Date == dateTime.Date, "checking date"); + Assert.That(day1.TimeOfDay == (TimeSpan)dt.Rows[0]["tm"], "checking time"); + + dt.Rows[0].Delete(); + count = await da.UpdateAsync(dt); + + Assert.That(count == 1, "checking insert count"); + + dt.Rows.Clear(); + da.Fill(dt); + Assert.That(dt.Rows.Count == 0, "checking row count"); + + dr = dt.NewRow(); + dr["id2"] = 3; + dr["name"] = "TestName2"; + dt.Rows.Add(dr); + + DataRow[] dataRows = dt.Select(null, null, DataViewRowState.Added); + count = await da.UpdateAsync(dataRows); + Assert.That(count == 1, "checking update count"); + + DataSet ds = new DataSet(); + da.Fill(ds); + dr = ds.Tables[0].NewRow(); + dr["id2"] = 6; + dr["name"] = "TestName6"; + ds.Tables[0].Rows.Add(dr); + + count = await da.UpdateAsync(ds); + Assert.That(count == 1, "checking update count"); + + dr = dt.NewRow(); + dr["id2"] = 4; + dr["name"] = "TestName4"; + dt.Rows.Add(dr); + + DataTableMapping mapping = new DataTableMapping(); + mapping.SourceTable = "DAUpdateAsyncTest"; + mapping.DataSetTable = "DAUpdateAsyncTest"; + + dataRows = dt.Select(null, null, DataViewRowState.Added); + count = await da.UpdateAsync(dataRows, mapping); + Assert.That(count == 1, "checking update count"); + + ds.Reset(); + da.FillSchema(ds, SchemaType.Mapped); + dr = ds.Tables[0].NewRow(); + dr["id2"] = 6; + dr["name"] = "TestName6"; + dr["ts"] = DateTime.Now; + ds.Tables[0].Rows.Add(dr); + + count = await da.UpdateAsync(ds, "Table"); + Assert.That(count == 1, "checking update count"); + + cb.Dispose(); + } + #endregion + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MySqlDataReaderTests.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MySqlDataReaderTests.cs new file mode 100644 index 000000000..4d738a60c --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/MySqlDataReaderTests.cs @@ -0,0 +1,127 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System.Data; + +namespace MySql.Data.MySqlClient.Tests +{ + public partial class MySqlDataReaderTests : TestBase + { + + /// + /// Bug #8630 Executing a query with the SchemaOnly option reads the entire resultset + /// + [Test] + public void SchemaOnly() + { + CreateDefaultTable(); + ExecuteSQL("INSERT INTO Test (id,name) VALUES(1,'test1')"); + ExecuteSQL("INSERT INTO Test (id,name) VALUES(2,'test2')"); + ExecuteSQL("INSERT INTO Test (id,name) VALUES(3,'test3')"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly)) + { + DataTable table = reader.GetSchemaTable(); + Assert.That(table.Rows.Count, Is.EqualTo(5)); + Assert.That(table.Columns.Count, Is.EqualTo(22)); + Assert.That(!reader.Read()); + } + } + + /// + /// Tests fix for bug "ConstraintException when filling a datatable" (MySql bug #65065). + /// + [Test] + public void ConstraintExceptionOnLoad() + { + using (var con = GetConnection()) + { + MySqlCommand cmd = new MySqlCommand(); + + cmd.Connection = con; + + cmd.CommandText = "DROP TABLE IF EXISTS trx"; + cmd.ExecuteNonQuery(); + + cmd.CommandText = "DROP TABLE IF EXISTS camn"; + cmd.ExecuteNonQuery(); + + cmd.CommandText = "CREATE TABLE `camn` (" + + "`id_camn` int(10) unsigned NOT NULL AUTO_INCREMENT," + + "`no` int(4) unsigned NOT NULL," + + "`marq` varchar(45) COLLATE utf8_bin DEFAULT NULL," + + "`modl` varchar(45) COLLATE utf8_bin DEFAULT NULL," + + "`no_serie` varchar(17) COLLATE utf8_bin DEFAULT NULL," + + "`no_plaq` varchar(7) COLLATE utf8_bin DEFAULT NULL," + + "PRIMARY KEY (`id_camn`)," + + "UNIQUE KEY `id_camn_UNIQUE` (`id_camn`)," + + "UNIQUE KEY `no_UNIQUE` (`no`)," + + "UNIQUE KEY `no_serie_UNIQUE` (`no_serie`)," + + "UNIQUE KEY `no_plaq_UNIQUE` (`no_plaq`)" + + ") ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COLLATE=utf8_bin"; + cmd.ExecuteNonQuery(); + + cmd.CommandText = "CREATE TABLE `trx` (" + + "`id_trx` int(10) unsigned NOT NULL AUTO_INCREMENT," + + "`mnt` decimal(9,2) NOT NULL," + + "`dat_trx` date NOT NULL," + + "`typ_trx` varchar(45) COLLATE utf8_bin DEFAULT NULL," + + "`descr` tinytext COLLATE utf8_bin," + + "`id_camn` int(10) unsigned DEFAULT NULL," + + "PRIMARY KEY (`id_trx`)," + + "UNIQUE KEY `id_trx_UNIQUE` (`id_trx`)," + + "KEY `fk_trx_camn` (`id_camn`)," + + "CONSTRAINT `fk_trx_camn` FOREIGN KEY (`id_camn`) REFERENCES `camn` (`id_camn`) ON DELETE NO ACTION ON UPDATE NO ACTION" + + ") ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_bin"; + + cmd.ExecuteNonQuery(); + + cmd.CommandText = "INSERT INTO camn(id_camn, no, marq, modl, no_serie, no_plaq) VALUES(9, 3327, null, null, null, null);"; + cmd.ExecuteNonQuery(); + + cmd.CommandText = "INSERT INTO trx(id_trx, mnt, dat_trx, typ_trx, descr, id_camn) VALUES(1, 10, '2012-04-30', null, null, 9);"; + cmd.ExecuteNonQuery(); + cmd.CommandText = "INSERT INTO trx(id_trx, mnt, dat_trx, typ_trx, descr, id_camn) VALUES(2, 10, '2012-04-15', null, null, 9);"; + cmd.ExecuteNonQuery(); + cmd.CommandText = "INSERT INTO trx(id_trx, mnt, dat_trx, typ_trx, descr, id_camn) VALUES(3, 10, '2012-04-15', null, null, null);"; + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT cam.no_serie, t.mnt FROM trx t LEFT JOIN camn cam USING(id_camn) "; + MySqlDataReader dr = cmd.ExecuteReader(); + DataTable dataTable = new DataTable(); + DataSet ds = new DataSet(); + dataTable.Load(dr); + dr.Close(); + } + } + + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/NETCore20Tests.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/NETCore20Tests.cs new file mode 100644 index 000000000..43ef07643 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/NETCore20Tests.cs @@ -0,0 +1,169 @@ +// Copyright © 2018, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Data; +using NUnit.Framework; +using NUnit.Framework.Legacy; + +namespace MySql.Data.MySqlClient.Tests +{ + public class NETCore20Tests : TestBase + { + private void CreateTables() + { + ExecuteSQL("CREATE TABLE parent (id INT, name VARCHAR(20), PRIMARY KEY (id))"); + ExecuteSQL("CREATE TABLE child (id INT, description VARCHAR(20), parent_id INT, PRIMARY KEY (id))"); + ExecuteSQL("INSERT INTO parent VALUES (1, 'parent1')"); + ExecuteSQL("INSERT INTO parent VALUES (2, 'parent2')"); + ExecuteSQL("INSERT INTO child VALUES (1, 'child1', 1)"); + ExecuteSQL("INSERT INTO child VALUES (2, 'child2', 2)"); + ExecuteSQL("INSERT INTO child VALUES (3, 'child3', 2)"); + } + + [Test] + public void ConstraintsTest() + { + ExecuteSQL("DROP TABLE IF EXISTS parent"); + ExecuteSQL("DROP TABLE IF EXISTS child"); + CreateTables(); + + DataSet ds = new DataSet(); + + MySqlDataAdapter parentDa = new MySqlDataAdapter("SELECT * FROM parent", Connection); + DataTable parentDt = new DataTable(); + parentDa.FillSchema(parentDt, SchemaType.Source); + parentDa.Fill(parentDt); + parentDt.Columns["id"].Unique = true; + + MySqlDataAdapter childDa = new MySqlDataAdapter("SELECT * FROM child", Connection); + DataTable childDt = new DataTable(); + childDa.FillSchema(childDt, SchemaType.Source); + childDa.Fill(childDt); + childDt.Columns["id"].Unique = true; + + ds.Tables.Add(parentDt); + ds.Tables.Add(childDt); + + DataRelation dataRelation = new DataRelation("parentChild", parentDt.Columns["id"], childDt.Columns["parent_id"]); + ds.Relations.Add(dataRelation); + + Assert.That(ds.Tables[0].Constraints, Has.One.Items); + Assert.That(ds.Tables[0].Constraints[0], Is.InstanceOf()); + + Assert.That(ds.Tables[1].Constraints.Count, Is.EqualTo(2)); + Assert.That(ds.Tables[0].Constraints[0], Is.InstanceOf()); + Assert.That(ds.Tables[1].Constraints[1], Is.InstanceOf()); + } + + [Test] + public void DataTableReaderTest() + { + ExecuteSQL("DROP TABLE IF EXISTS parent"); + ExecuteSQL("DROP TABLE IF EXISTS child"); + CreateTables(); + + MySqlDataAdapter childDa = new MySqlDataAdapter("SELECT * FROM child", Connection); + DataTable childDt = new DataTable(); + childDa.FillSchema(childDt, SchemaType.Source); + childDa.Fill(childDt); + childDt.Columns["id"].Unique = true; + + using (DataTableReader dataTableReader = new DataTableReader(childDt)) + { + Assert.That(dataTableReader.HasRows); + Assert.That(dataTableReader.FieldCount, Is.EqualTo(3)); + } + + PropertyCollection propertyCollection = childDt.ExtendedProperties; + propertyCollection.Add("TimeStamp", DateTime.Now); + propertyCollection.Add("Version", 1); + + Assert.That(childDt.ExtendedProperties, Is.Not.Empty); + Assert.That(childDt.ExtendedProperties.Count, Is.EqualTo(2)); + } + + [Test] + public void DataViewSettingsTest() + { + ExecuteSQL("DROP TABLE IF EXISTS parent"); + ExecuteSQL("DROP TABLE IF EXISTS child"); + CreateTables(); + + DataSet ds = new DataSet(); + + MySqlDataAdapter parentDa = new MySqlDataAdapter("SELECT * FROM parent", Connection); + DataTable parentDt = new DataTable(); + parentDa.FillSchema(parentDt, SchemaType.Source); + parentDa.Fill(parentDt); + parentDt.Columns["id"].Unique = true; + + MySqlDataAdapter childDa = new MySqlDataAdapter("SELECT * FROM child", Connection); + DataTable childDt = new DataTable(); + childDa.FillSchema(childDt, SchemaType.Source); + childDa.Fill(childDt); + childDt.Columns["id"].Unique = true; + + ds.Tables.Add(parentDt); + ds.Tables.Add(childDt); + + DataViewManager dataViewManager = new DataViewManager(ds); + + foreach (DataViewSetting viewSetting in dataViewManager.DataViewSettings) + viewSetting.ApplyDefaultSort = true; + + dataViewManager.DataViewSettings[parentDt].Sort = "name"; + + Assert.That(dataViewManager.DataViewSettings[childDt].Sort == ""); + Assert.That(dataViewManager.DataViewSettings[parentDt].Sort, Is.EqualTo("name")); + Assert.That(dataViewManager.DataViewSettings, Is.Not.Empty); + } + + [Test] + public void SchemaColumnTest() + { + ExecuteSQL("DROP TABLE IF EXISTS parent"); + ExecuteSQL("DROP TABLE IF EXISTS child"); + CreateTables(); + + MySqlDataAdapter parentDa = new MySqlDataAdapter("SELECT * FROM parent", Connection); + DataTable parentDt = new DataTable(); + parentDa.FillSchema(parentDt, SchemaType.Source); + parentDa.Fill(parentDt); + parentDt.Columns["id"].Unique = true; + + Assert.That(parentDt.Columns[0].Unique); + Assert.That(!parentDt.Columns[0].AllowDBNull); + Assert.That(parentDt.Columns[1].ColumnName, Is.EqualTo("name")); + + Assert.That(parentDt.Columns[0].AutoIncrementSeed, Is.EqualTo(0)); + Assert.That(!parentDt.Columns[0].ReadOnly); + Assert.That(!parentDt.Columns[1].AutoIncrement); + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/OutputParametersBatchPrepared.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/OutputParametersBatchPrepared.cs new file mode 100644 index 000000000..144987844 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/OutputParametersBatchPrepared.cs @@ -0,0 +1,38 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySql.Data.MySqlClient.Tests +{ + public class OutputParametersBatchPrepared : OutputParametersBatch + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.AllowBatch = true; + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/OutputParametersNoBatch.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/OutputParametersNoBatch.cs new file mode 100644 index 000000000..facd8f010 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/OutputParametersNoBatch.cs @@ -0,0 +1,38 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySql.Data.MySqlClient.Tests +{ + public class OutputParametersNoBatch : OutputParametersBatch + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.AllowBatch = false; + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/OutputParametersNoBatchPrepared.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/OutputParametersNoBatchPrepared.cs new file mode 100644 index 000000000..664faf15a --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/OutputParametersNoBatchPrepared.cs @@ -0,0 +1,44 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySql.Data.MySqlClient.Tests +{ + public class OutputParametersNoBatchPrepared : OutputParametersBatch + { + + public OutputParametersNoBatchPrepared() + { + prepare = true; + } + + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.AllowBatch = false; + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/PSPipe.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/PSPipe.cs new file mode 100644 index 000000000..fa8d58015 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/PSPipe.cs @@ -0,0 +1,39 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySql.Data.MySqlClient.Tests +{ + public class PSPipe : PreparedStatements + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.ConnectionProtocol = MySqlConnectionProtocol.NamedPipe; + settings.SslMode = MySqlSslMode.None; + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/PSPipeCompressed.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/PSPipeCompressed.cs new file mode 100644 index 000000000..a673f8a88 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/PSPipeCompressed.cs @@ -0,0 +1,42 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework.Internal; + +namespace MySql.Data.MySqlClient.Tests +{ + public class PSPipeCompressed : PreparedStatements + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.ConnectionProtocol = MySqlConnectionProtocol.NamedPipe; + settings.UseCompression = true; + settings.SslMode = MySqlSslMode.None; + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/PSSharedMemory.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/PSSharedMemory.cs new file mode 100644 index 000000000..a0c85b501 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/PSSharedMemory.cs @@ -0,0 +1,41 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework.Internal; + +namespace MySql.Data.MySqlClient.Tests +{ + public class PSSharedMemory : PreparedStatements + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.ConnectionProtocol = MySqlConnectionProtocol.SharedMemory; + settings.SslMode = MySqlSslMode.None; + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/PSSharedMemoryCompressed.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/PSSharedMemoryCompressed.cs new file mode 100644 index 000000000..adff43f9f --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/PSSharedMemoryCompressed.cs @@ -0,0 +1,42 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework.Internal; + +namespace MySql.Data.MySqlClient.Tests +{ + public class PSSharedMemoryCompressed : PreparedStatements + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.ConnectionProtocol = MySqlConnectionProtocol.SharedMemory; + settings.UseCompression = true; + settings.SslMode = MySqlSslMode.None; + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/PartialTrustSandbox.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/PartialTrustSandbox.cs new file mode 100644 index 000000000..b62cbd27d --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/PartialTrustSandbox.cs @@ -0,0 +1,80 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Text; +using System.Security; +using System.Security.Permissions; +using System.Net; +using MySql.Data.MySqlClient; + +namespace MySql.Data.MySqlClient.Tests +{ + public class PartialTrustSandbox : MarshalByRefObject + { + public static AppDomain CreatePartialTrustDomain() + { +#if NET452 + PermissionSet permissions = new PermissionSet(PermissionState.Unrestricted); + AppDomainSetup setup = new AppDomainSetup() { ApplicationBase = AppDomain.CurrentDomain.BaseDirectory, PrivateBinPath = AppDomain.CurrentDomain.RelativeSearchPath }; + return AppDomain.CreateDomain("Partial Trust Sandbox", AppDomain.CurrentDomain.Evidence, setup, permissions); +#else + return AppDomain.CreateDomain("Partial Trust Sandbox"); +#endif + } + + + public MySqlConnection TryOpenConnection(string connectionString) + { + MySqlConnection connection = new MySqlConnection(connectionString); + connection.Open(); + return connection; + } + } + + public class FullTrustSandbox : MarshalByRefObject + { + public static AppDomain CreateFullTrustDomain() + { +#if NET452 + AppDomainSetup setup = new AppDomainSetup() { ApplicationBase = AppDomain.CurrentDomain.BaseDirectory, PrivateBinPath = AppDomain.CurrentDomain.RelativeSearchPath }; + return AppDomain.CreateDomain("Partial Trust Sandbox", AppDomain.CurrentDomain.Evidence, setup); +#else + return AppDomain.CreateDomain("Partial Trust Sandbox"); +#endif + } + + public MySqlConnection TryOpenConnection(string connectionString) + { + MySqlConnection connection = new MySqlConnection(connectionString); + connection.Open(); + return connection; + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/PerfMonTests.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/PerfMonTests.cs new file mode 100644 index 000000000..248ca2ad3 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/PerfMonTests.cs @@ -0,0 +1,72 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework; +using NUnit.Framework.Legacy; + +namespace MySql.Data.MySqlClient.Tests +{ + public class PerfMonTests : TestBase + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.UsePerformanceMonitor = true; + } + + //[Fact(Skip = "Fix This")] + //public void ProcedureFromCache() + //{ + // executeSQL("DROP PROCEDURE IF EXISTS spTest"); + // executeSQL("CREATE PROCEDURE spTest(id int) BEGIN END"); + + // PerformanceCounter hardQuery = new PerformanceCounter( + // ".NET Data Provider for MySQL", "HardProcedureQueries", true); + // PerformanceCounter softQuery = new PerformanceCounter( + // ".NET Data Provider for MySQL", "SoftProcedureQueries", true); + // long hardCount = hardQuery.RawValue; + // long softCount = softQuery.RawValue; + + // MySqlCommand cmd = new MySqlCommand("spTest", Connection); + // cmd.CommandType = CommandType.StoredProcedure; + // cmd.Parameters.AddWithValue("?id", 1); + // cmd.ExecuteScalar(); + + // Assert.AreEqual(hardCount + 1, hardQuery.RawValue); + // Assert.AreEqual(softCount, softQuery.RawValue); + // hardCount = hardQuery.RawValue; + + // MySqlCommand cmd2 = new MySqlCommand("spTest", Connection); + // cmd2.CommandType = CommandType.StoredProcedure; + // cmd2.Parameters.AddWithValue("?id", 1); + // cmd2.ExecuteScalar(); + + // Assert.AreEqual(hardCount, hardQuery.RawValue); + // Assert.AreEqual(softCount + 1, softQuery.RawValue); + //} + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/ProcedureParameterTests.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/ProcedureParameterTests.cs new file mode 100644 index 000000000..d9d74515c --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/ProcedureParameterTests.cs @@ -0,0 +1,570 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Data; + +namespace MySql.Data.MySqlClient.Tests +{ + public class ProcedureParameterTests : TestBase + { + [Test] + public void ProcedureParameters() + { + ExecuteSQL("CREATE PROCEDURE ProcedureParameters (id int, name varchar(50)) BEGIN SELECT 1; END"); + + string[] restrictions = new string[5]; + restrictions[1] = Connection.Database; + restrictions[2] = "ProcedureParameters"; + DataTable dt = Connection.GetSchema("Procedure Parameters", restrictions); + Assert.That(dt.Rows.Count == 2, "Actual result " + dt.Rows.Count); + Assert.That(dt.TableName, Is.EqualTo("Procedure Parameters")); + Assert.That(dt.Rows[0]["SPECIFIC_SCHEMA"].ToString(), Is.EqualTo(Connection.Database)); + Assert.That(dt.Rows[0]["SPECIFIC_NAME"].ToString(), Is.EqualTo("ProcedureParameters")); + Assert.That(dt.Rows[0]["PARAMETER_NAME"].ToString().ToLower(), Is.EqualTo("id")); + Assert.That(dt.Rows[0]["ORDINAL_POSITION"], Is.EqualTo(1)); + Assert.That(dt.Rows[0]["PARAMETER_MODE"], Is.EqualTo("IN")); + + restrictions[4] = "name"; + dt.Clear(); + dt = Connection.GetSchema("Procedure Parameters", restrictions); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + Assert.That(dt.Rows[0]["SPECIFIC_SCHEMA"].ToString(), Is.EqualTo(Connection.Database)); + Assert.That(dt.Rows[0]["SPECIFIC_NAME"].ToString(), Is.EqualTo("ProcedureParameters")); + Assert.That(dt.Rows[0]["PARAMETER_NAME"].ToString().ToLower(), Is.EqualTo("name")); + Assert.That(dt.Rows[0]["ORDINAL_POSITION"], Is.EqualTo(2)); + Assert.That(dt.Rows[0]["PARAMETER_MODE"], Is.EqualTo("IN")); + + ExecuteSQL("DROP FUNCTION IF EXISTS spFunc"); + ExecuteSQL("CREATE FUNCTION spFunc (id int) RETURNS INT BEGIN RETURN 1; END"); + + restrictions[4] = null; + restrictions[1] = Connection.Database; + restrictions[2] = "spFunc"; + dt = Connection.GetSchema("Procedure Parameters", restrictions); + Assert.That(dt.Rows.Count == 2); + Assert.That(dt.TableName, Is.EqualTo("Procedure Parameters")); + Assert.That(dt.Rows[0]["SPECIFIC_SCHEMA"].ToString().ToLower(), Is.EqualTo(Connection.Database.ToLower())); + Assert.That(dt.Rows[0]["SPECIFIC_NAME"].ToString().ToLower(), Is.EqualTo("spfunc")); + Assert.That(dt.Rows[0]["ORDINAL_POSITION"], Is.EqualTo(0)); + + Assert.That(dt.Rows[1]["SPECIFIC_SCHEMA"].ToString().ToLower(), Is.EqualTo(Connection.Database.ToLower())); + Assert.That(dt.Rows[1]["SPECIFIC_NAME"].ToString().ToLower(), Is.EqualTo("spfunc")); + Assert.That(dt.Rows[1]["PARAMETER_NAME"].ToString().ToLower(), Is.EqualTo("id")); + Assert.That(dt.Rows[1]["ORDINAL_POSITION"], Is.EqualTo(1)); + Assert.That(dt.Rows[1]["PARAMETER_MODE"], Is.EqualTo("IN")); + } + + /// + /// Bug #6902 Errors in parsing stored procedure parameters + /// + [Test] + public void ProcedureParameters2() + { + ExecuteSQL("DROP PROCEDURE IF EXISTS spTest"); + ExecuteSQL(@"CREATE PROCEDURE spTest(`/*id*/` /* before type 1 */ varchar(20) character set latin1, + /* after type 1 */ OUT result2 DECIMAL(/*size1*/10,/*size2*/2) /* p2 */) + BEGIN SELECT action, result; END"); + + string[] restrictions = new string[5]; + restrictions[1] = Connection.Database; + restrictions[2] = "spTest"; + DataTable dt = Connection.GetSchema("Procedure Parameters", restrictions); + + Assert.That(dt.Rows.Count == 2, "Actual result " + dt.Rows.Count); + Assert.That(dt.Rows[0]["SPECIFIC_SCHEMA"].ToString().ToLower(), Is.EqualTo(Connection.Database.ToLower())); + Assert.That(dt.Rows[0]["SPECIFIC_NAME"].ToString().ToLower(), Is.EqualTo("sptest")); + Assert.That(dt.Rows[0]["PARAMETER_NAME"].ToString().ToLower(), Is.EqualTo("/*id*/")); + Assert.That(dt.Rows[0]["ORDINAL_POSITION"], Is.EqualTo(1)); + Assert.That(dt.Rows[0]["PARAMETER_MODE"], Is.EqualTo("IN")); + Assert.That(dt.Rows[0]["DATA_TYPE"].ToString().ToUpper(), Is.EqualTo("VARCHAR")); + Assert.That(dt.Rows[0]["CHARACTER_MAXIMUM_LENGTH"], Is.EqualTo(20)); + Assert.That(dt.Rows[0]["CHARACTER_OCTET_LENGTH"], Is.EqualTo(20)); + + Assert.That(dt.Rows[1]["SPECIFIC_SCHEMA"].ToString().ToLower(), Is.EqualTo(Connection.Database.ToLower())); + Assert.That(dt.Rows[1]["SPECIFIC_NAME"].ToString().ToLower(), Is.EqualTo("sptest")); + Assert.That(dt.Rows[1]["PARAMETER_NAME"].ToString().ToLower(), Is.EqualTo("result2")); + Assert.That(dt.Rows[1]["ORDINAL_POSITION"], Is.EqualTo(2)); + Assert.That(dt.Rows[1]["PARAMETER_MODE"], Is.EqualTo("OUT")); + Assert.That(dt.Rows[1]["DATA_TYPE"].ToString().ToUpper(), Is.EqualTo("DECIMAL")); + Assert.That(Convert.ToInt32(dt.Rows[1]["NUMERIC_PRECISION"]), Is.EqualTo(10)); + Assert.That(dt.Rows[1]["NUMERIC_SCALE"], Is.EqualTo(2)); + } + + [Test] + public void ProcedureParameters3() + { + ExecuteSQL("DROP PROCEDURE IF EXISTS spTest"); + ExecuteSQL(@"CREATE PROCEDURE spTest (_ACTION varchar(20) character set latin1, + `/*dumb-identifier-1*/` int, `#dumb-identifier-2` int, + `--dumb-identifier-3` int, + _CLIENT_ID int, -- ABC + _LOGIN_ID int, # DEF + _WHERE varchar(2000) character set latin1, + _SORT varchar(2000) character set utf8mb4, + out _SQL varchar(/* inline right here - oh my gosh! */ 8000) character set latin1, + _SONG_ID int, + _NOTES varchar(2000) character set latin1, + out _RESULT varchar(10) character set latin1 + /* + , -- Generic result parameter + out _PERIOD_ID int, -- Returns the period_id. Useful when using @PREDEFLINK to return which is the last period + _SONGS_LIST varchar(8000) character set latin1, + _COMPOSERID int, + _PUBLISHERID int, + _PREDEFLINK int -- If the user is accessing through a predefined link: 0=none 1=last period + */) BEGIN SELECT 1; END"); + + string[] restrictions = new string[5]; + restrictions[1] = Connection.Database; + restrictions[2] = "spTest"; + DataTable dt = Connection.GetSchema("Procedure Parameters", restrictions); + + Assert.That(dt.Rows.Count == 12, Is.True, "Rows count failed"); + Assert.That(dt.Rows[0]["SPECIFIC_SCHEMA"].ToString().ToLower(), Is.EqualTo(Connection.Database.ToLower())); + Assert.That(dt.Rows[0]["SPECIFIC_NAME"].ToString().ToLower(), Is.EqualTo("sptest")); + Assert.That(dt.Rows[0]["PARAMETER_NAME"].ToString().ToLower(), Is.EqualTo("_action")); + Assert.That(dt.Rows[0]["ORDINAL_POSITION"], Is.EqualTo(1)); + Assert.That(dt.Rows[0]["PARAMETER_MODE"], Is.EqualTo("IN")); + Assert.That(dt.Rows[0]["DATA_TYPE"].ToString().ToUpper(), Is.EqualTo("VARCHAR")); + Assert.That(dt.Rows[0]["CHARACTER_OCTET_LENGTH"], Is.EqualTo(20)); + + Assert.That(dt.Rows[1]["SPECIFIC_SCHEMA"].ToString().ToLower(), Is.EqualTo(Connection.Database.ToLower())); + Assert.That(dt.Rows[1]["SPECIFIC_NAME"].ToString().ToLower(), Is.EqualTo("sptest")); + Assert.That(dt.Rows[1]["PARAMETER_NAME"].ToString().ToLower(), Is.EqualTo("/*dumb-identifier-1*/")); + Assert.That(dt.Rows[1]["ORDINAL_POSITION"], Is.EqualTo(2)); + Assert.That(dt.Rows[1]["PARAMETER_MODE"], Is.EqualTo("IN")); + Assert.That(dt.Rows[1]["DATA_TYPE"].ToString().ToUpper(), Is.EqualTo("INT")); + + Assert.That(dt.Rows[2]["SPECIFIC_SCHEMA"].ToString().ToLower(), Is.EqualTo(Connection.Database.ToLower())); + Assert.That(dt.Rows[2]["SPECIFIC_NAME"].ToString().ToLower(), Is.EqualTo("sptest")); + Assert.That(dt.Rows[2]["PARAMETER_NAME"].ToString().ToLower(), Is.EqualTo("#dumb-identifier-2")); + Assert.That(dt.Rows[2]["ORDINAL_POSITION"], Is.EqualTo(3)); + Assert.That(dt.Rows[2]["PARAMETER_MODE"], Is.EqualTo("IN")); + Assert.That(dt.Rows[2]["DATA_TYPE"].ToString().ToUpper(), Is.EqualTo("INT")); + + Assert.That(dt.Rows[3]["SPECIFIC_SCHEMA"].ToString().ToLower(), Is.EqualTo(Connection.Database.ToLower())); + Assert.That(dt.Rows[3]["SPECIFIC_NAME"].ToString().ToLower(), Is.EqualTo("sptest")); + Assert.That(dt.Rows[3]["PARAMETER_NAME"].ToString().ToLower(), Is.EqualTo("--dumb-identifier-3")); + Assert.That(dt.Rows[3]["ORDINAL_POSITION"], Is.EqualTo(4)); + Assert.That(dt.Rows[3]["PARAMETER_MODE"], Is.EqualTo("IN")); + Assert.That(dt.Rows[3]["DATA_TYPE"].ToString().ToUpper(), Is.EqualTo("INT")); + + Assert.That(dt.Rows[4]["SPECIFIC_SCHEMA"].ToString().ToLower(), Is.EqualTo(Connection.Database.ToLower())); + Assert.That(dt.Rows[4]["SPECIFIC_NAME"].ToString().ToLower(), Is.EqualTo("sptest")); + Assert.That(dt.Rows[4]["PARAMETER_NAME"].ToString().ToLower(), Is.EqualTo("_client_id")); + Assert.That(dt.Rows[4]["ORDINAL_POSITION"], Is.EqualTo(5)); + Assert.That(dt.Rows[4]["PARAMETER_MODE"], Is.EqualTo("IN")); + Assert.That(dt.Rows[4]["DATA_TYPE"].ToString().ToUpper(), Is.EqualTo("INT")); + + Assert.That(dt.Rows[5]["SPECIFIC_SCHEMA"].ToString().ToLower(), Is.EqualTo(Connection.Database.ToLower())); + Assert.That(dt.Rows[5]["SPECIFIC_NAME"].ToString().ToLower(), Is.EqualTo("sptest")); + Assert.That(dt.Rows[5]["PARAMETER_NAME"].ToString().ToLower(), Is.EqualTo("_login_id")); + Assert.That(dt.Rows[5]["ORDINAL_POSITION"], Is.EqualTo(6)); + Assert.That(dt.Rows[5]["PARAMETER_MODE"], Is.EqualTo("IN")); + Assert.That(dt.Rows[5]["DATA_TYPE"].ToString().ToUpper(), Is.EqualTo("INT")); + + Assert.That(dt.Rows[6]["SPECIFIC_SCHEMA"].ToString().ToLower(), Is.EqualTo(Connection.Database.ToLower())); + Assert.That(dt.Rows[6]["SPECIFIC_NAME"].ToString().ToLower(), Is.EqualTo("sptest")); + Assert.That(dt.Rows[6]["PARAMETER_NAME"].ToString().ToLower(), Is.EqualTo("_where")); + Assert.That(dt.Rows[6]["ORDINAL_POSITION"], Is.EqualTo(7)); + Assert.That(dt.Rows[6]["PARAMETER_MODE"], Is.EqualTo("IN")); + Assert.That(dt.Rows[6]["DATA_TYPE"].ToString().ToUpper(), Is.EqualTo("VARCHAR")); + Assert.That(dt.Rows[6]["CHARACTER_OCTET_LENGTH"], Is.EqualTo(2000)); + + Assert.That(dt.Rows[7]["SPECIFIC_SCHEMA"].ToString().ToLower(), Is.EqualTo(Connection.Database.ToLower())); + Assert.That(dt.Rows[7]["SPECIFIC_NAME"].ToString().ToLower(), Is.EqualTo("sptest")); + Assert.That(dt.Rows[7]["PARAMETER_NAME"].ToString().ToLower(), Is.EqualTo("_sort")); + Assert.That(dt.Rows[7]["ORDINAL_POSITION"], Is.EqualTo(8)); + Assert.That(dt.Rows[7]["PARAMETER_MODE"], Is.EqualTo("IN")); + Assert.That(dt.Rows[7]["DATA_TYPE"].ToString().ToUpper(), Is.EqualTo("VARCHAR")); + Assert.That(dt.Rows[7]["CHARACTER_OCTET_LENGTH"], Is.EqualTo(8000)); + + Assert.That(dt.Rows[8]["SPECIFIC_SCHEMA"].ToString().ToLower(), Is.EqualTo(Connection.Database.ToLower())); + Assert.That(dt.Rows[8]["SPECIFIC_NAME"].ToString().ToLower(), Is.EqualTo("sptest")); + Assert.That(dt.Rows[8]["PARAMETER_NAME"].ToString().ToLower(), Is.EqualTo("_sql")); + Assert.That(dt.Rows[8]["ORDINAL_POSITION"], Is.EqualTo(9)); + Assert.That(dt.Rows[8]["PARAMETER_MODE"], Is.EqualTo("OUT")); + Assert.That(dt.Rows[8]["DATA_TYPE"].ToString().ToUpper(), Is.EqualTo("VARCHAR")); + Assert.That(dt.Rows[8]["CHARACTER_OCTET_LENGTH"], Is.EqualTo(8000)); + + Assert.That(dt.Rows[9]["SPECIFIC_SCHEMA"].ToString().ToLower(), Is.EqualTo(Connection.Database.ToLower())); + Assert.That(dt.Rows[9]["SPECIFIC_NAME"].ToString().ToLower(), Is.EqualTo("sptest")); + Assert.That(dt.Rows[9]["PARAMETER_NAME"].ToString().ToLower(), Is.EqualTo("_song_id")); + Assert.That(dt.Rows[9]["ORDINAL_POSITION"], Is.EqualTo(10)); + Assert.That(dt.Rows[9]["PARAMETER_MODE"], Is.EqualTo("IN")); + Assert.That(dt.Rows[9]["DATA_TYPE"].ToString().ToUpper(), Is.EqualTo("INT")); + + Assert.That(dt.Rows[10]["SPECIFIC_SCHEMA"].ToString().ToLower(), Is.EqualTo(Connection.Database.ToLower())); + Assert.That(dt.Rows[10]["SPECIFIC_NAME"].ToString().ToLower(), Is.EqualTo("sptest")); + Assert.That(dt.Rows[10]["PARAMETER_NAME"].ToString().ToLower(), Is.EqualTo("_notes")); + Assert.That(dt.Rows[10]["ORDINAL_POSITION"], Is.EqualTo(11)); + Assert.That(dt.Rows[10]["PARAMETER_MODE"], Is.EqualTo("IN")); + Assert.That(dt.Rows[10]["DATA_TYPE"].ToString().ToUpper(), Is.EqualTo("VARCHAR")); + Assert.That(dt.Rows[10]["CHARACTER_OCTET_LENGTH"], Is.EqualTo(2000)); + + Assert.That(dt.Rows[11]["SPECIFIC_SCHEMA"].ToString().ToLower(), Is.EqualTo(Connection.Database.ToLower())); + Assert.That(dt.Rows[11]["SPECIFIC_NAME"].ToString().ToLower(), Is.EqualTo("sptest")); + Assert.That(dt.Rows[11]["PARAMETER_NAME"].ToString().ToLower(), Is.EqualTo("_result")); + Assert.That(dt.Rows[11]["ORDINAL_POSITION"], Is.EqualTo(12)); + Assert.That(dt.Rows[11]["PARAMETER_MODE"], Is.EqualTo("OUT")); + Assert.That(dt.Rows[11]["DATA_TYPE"].ToString().ToUpper(), Is.EqualTo("VARCHAR")); + Assert.That(dt.Rows[11]["CHARACTER_OCTET_LENGTH"], Is.EqualTo(10)); + } + + [Test] + public void ProcedureParameters4() + { + string charset = Version < new Version(8, 0) ? "utf8" : "utf8mb3"; + + ExecuteSQL($@"CREATE PROCEDURE ProcedureParameters4 (name VARCHAR(1200) + CHARACTER /* hello*/ SET {charset}) BEGIN SELECT name; END"); + + string[] restrictions = new string[5]; + restrictions[1] = Connection.Database; + restrictions[2] = "ProcedureParameters4"; + DataTable dt = Connection.GetSchema("Procedure Parameters", restrictions); + + Assert.That(dt.Rows.Count == 1, Is.True, "Actual Result " + dt.Rows.Count); + Assert.That(dt.Rows[0]["SPECIFIC_SCHEMA"].ToString(), Is.EqualTo(Connection.Database)); + Assert.That(dt.Rows[0]["SPECIFIC_NAME"].ToString(), Is.EqualTo("ProcedureParameters4")); + Assert.That(dt.Rows[0]["PARAMETER_NAME"].ToString().ToLower(), Is.EqualTo("name")); + Assert.That(dt.Rows[0]["ORDINAL_POSITION"], Is.EqualTo(1)); + Assert.That(dt.Rows[0]["PARAMETER_MODE"], Is.EqualTo("IN")); + Assert.That(dt.Rows[0]["DATA_TYPE"].ToString().ToUpper(), Is.EqualTo("VARCHAR")); + Assert.That(dt.Rows[0]["CHARACTER_MAXIMUM_LENGTH"], Is.EqualTo(1200)); + Assert.That(dt.Rows[0]["CHARACTER_OCTET_LENGTH"], Is.EqualTo(3600)); + Assert.That(dt.Rows[0]["CHARACTER_SET_NAME"], Is.EqualTo(charset)); + Assert.That(dt.Rows[0]["COLLATION_NAME"], Is.EqualTo($"{charset}_general_ci")); + } + + [Test] + public void ProcedureParameters5() + { + ExecuteSQL(@"CREATE PROCEDURE ProcedureParameters5 (name VARCHAR(1200) ASCII BINARY, + name2 TEXT UNICODE) BEGIN SELECT name; END"); + + string[] restrictions = new string[5]; + restrictions[1] = Connection.Database; + restrictions[2] = "ProcedureParameters5"; + DataTable dt = Connection.GetSchema("Procedure Parameters", restrictions); + + Assert.That(dt.Rows.Count == 2, Is.True); + Assert.That(dt.Rows[0]["SPECIFIC_SCHEMA"].ToString(), Is.EqualTo(Connection.Database)); + Assert.That(dt.Rows[0]["SPECIFIC_NAME"].ToString(), Is.EqualTo("ProcedureParameters5")); + Assert.That(dt.Rows[0]["PARAMETER_NAME"].ToString().ToLower(), Is.EqualTo("name")); + Assert.That(dt.Rows[0]["ORDINAL_POSITION"], Is.EqualTo(1)); + Assert.That(dt.Rows[0]["PARAMETER_MODE"], Is.EqualTo("IN")); + Assert.That(dt.Rows[0]["DATA_TYPE"].ToString().ToUpper(), Is.EqualTo("VARCHAR")); + Assert.That(dt.Rows[0]["CHARACTER_SET_NAME"], Is.EqualTo("latin1")); + Assert.That(dt.Rows[0]["CHARACTER_OCTET_LENGTH"], Is.EqualTo(1200)); + + Assert.That(dt.Rows[1]["SPECIFIC_SCHEMA"].ToString(), Is.EqualTo(Connection.Database)); + Assert.That(dt.Rows[1]["SPECIFIC_NAME"].ToString(), Is.EqualTo("ProcedureParameters5")); + Assert.That(dt.Rows[1]["PARAMETER_NAME"].ToString().ToLower(), Is.EqualTo("name2")); + Assert.That(dt.Rows[1]["ORDINAL_POSITION"], Is.EqualTo(2)); + Assert.That(dt.Rows[1]["PARAMETER_MODE"], Is.EqualTo("IN")); + Assert.That(dt.Rows[1]["DATA_TYPE"].ToString().ToUpper(), Is.EqualTo("TEXT")); + Assert.That(dt.Rows[1]["CHARACTER_SET_NAME"], Is.EqualTo("ucs2")); + } + + [Test] + public void DTD_Identifier() + { + using (var conn = new MySqlConnection(Connection.ConnectionString)) + { + conn.Open(); + var cmd = new MySqlCommand(@"CREATE PROCEDURE DTD_Identifier (id INT UNSIGNED ZEROFILL, + dec1 DECIMAL(10,2), + name VARCHAR(20) /* this is a comment */ CHARACTER SET ascii, + t1 TINYTEXT BINARY, t2 ENUM('a','b','c'), + t3 /* comment */ SET(/* comment */'1','2','3')) + BEGIN SELECT name; END", conn); + cmd.ExecuteNonQuery(); + + string[] restrictions = new string[5]; + restrictions[1] = Connection.Database; + restrictions[2] = "DTD_Identifier"; + DataTable dt = Connection.GetSchema("Procedure Parameters", restrictions); + + Assert.That(dt.Rows.Count == 6, Is.True, "Actual Result " + dt.Rows.Count); + Assert.That(dt.Rows[0]["DTD_IDENTIFIER"].ToString().ToUpper(), Is.EqualTo("INT(10) UNSIGNED ZEROFILL")); + Assert.That(dt.Rows[1]["DTD_IDENTIFIER"].ToString().ToUpper(), Is.EqualTo("DECIMAL(10,2)")); + Assert.That(dt.Rows[2]["DTD_IDENTIFIER"].ToString().ToUpper(), Is.EqualTo("VARCHAR(20)")); + Assert.That(dt.Rows[3]["DTD_IDENTIFIER"].ToString().ToUpper(), Is.EqualTo("TINYTEXT")); + Assert.That(dt.Rows[4]["DTD_IDENTIFIER"].ToString().ToUpper(), Is.EqualTo("ENUM('A','B','C')")); + Assert.That(dt.Rows[5]["DTD_IDENTIFIER"].ToString().ToUpper(), Is.EqualTo("SET('1','2','3')")); + conn.Close(); + } + } + + /// + /// Bug #48586 Expose defined possible enum values + /// + [Test] + public void PossibleValues() + { + var builder = new MySqlConnectionStringBuilder(Connection.ConnectionString); + using (var conn = new MySqlConnection(builder.ConnectionString)) + { + conn.Open(); + var cmd = new MySqlCommand(@"CREATE PROCEDURE PossibleValues (id INT UNSIGNED ZEROFILL, + dec1 DECIMAL(10,2), + name VARCHAR(20) /* this is a comment */ CHARACTER SET ascii, + t1 TINYTEXT BINARY, t2 ENUM('a','b','c'), + t3 /* comment */ SET(/* comment */'1','2','3')) + BEGIN SELECT name; END", conn); + cmd.ExecuteNonQuery(); + cmd.CommandText = "PossibleValues"; + cmd.CommandType = CommandType.StoredProcedure; + MySqlCommandBuilder.DeriveParameters(cmd); + Assert.That(cmd.Parameters["@id"].PossibleValues, Is.Null); + Assert.That(cmd.Parameters["@dec1"].PossibleValues, Is.Null); + Assert.That(cmd.Parameters["@name"].PossibleValues, Is.Null); + Assert.That(cmd.Parameters["@t1"].PossibleValues, Is.Null); + MySqlParameter t2 = cmd.Parameters["@t2"]; + Assert.That(t2.PossibleValues, Is.Not.Null); + Assert.That(t2.PossibleValues[0], Is.EqualTo("a")); + Assert.That(t2.PossibleValues[1], Is.EqualTo("b")); + Assert.That(t2.PossibleValues[2], Is.EqualTo("c")); + MySqlParameter t3 = cmd.Parameters["@t3"]; + Assert.That(t3.PossibleValues, Is.Not.Null); + Assert.That(t3.PossibleValues[0], Is.EqualTo("1")); + Assert.That(t3.PossibleValues[1], Is.EqualTo("2")); + Assert.That(t3.PossibleValues[2], Is.EqualTo("3")); + conn.Close(); + } + + // Default to the current database when it isn't specified. + var dbName = builder.Database; + builder.Database = null; + using (var conn = new MySqlConnection(builder.ConnectionString)) + { + conn.Open(); + var cmd = new MySqlCommand($"USE `{dbName}`", conn); + cmd.ExecuteNonQuery(); + cmd.CommandText = "PossibleValues"; + cmd.CommandType = CommandType.StoredProcedure; + MySqlCommandBuilder.DeriveParameters(cmd); + Assert.That(cmd.Parameters["@id"].PossibleValues, Is.Null); + Assert.That(cmd.Parameters["@dec1"].PossibleValues, Is.Null); + Assert.That(cmd.Parameters["@name"].PossibleValues, Is.Null); + Assert.That(cmd.Parameters["@t1"].PossibleValues, Is.Null); + MySqlParameter t2 = cmd.Parameters["@t2"]; + Assert.That(t2.PossibleValues, Is.Not.Null); + Assert.That(t2.PossibleValues[0], Is.EqualTo("a")); + Assert.That(t2.PossibleValues[1], Is.EqualTo("b")); + Assert.That(t2.PossibleValues[2], Is.EqualTo("c")); + MySqlParameter t3 = cmd.Parameters["@t3"]; + Assert.That(t3.PossibleValues, Is.Not.Null); + Assert.That(t3.PossibleValues[0], Is.EqualTo("1")); + Assert.That(t3.PossibleValues[1], Is.EqualTo("2")); + Assert.That(t3.PossibleValues[2], Is.EqualTo("3")); + conn.Close(); + } + } + + /// + /// Bug #62416 IndexOutOfRangeException when using return parameter with no name + /// + [Test] + public void UnnamedReturnValue() + { + ExecuteSQL("DROP FUNCTION IF EXISTS spFunc"); + ExecuteSQL("CREATE FUNCTION spFunc() RETURNS DATETIME BEGIN RETURN NOW(); END"); + MySqlCommand cmd = new MySqlCommand("spFunc", Connection); + cmd.CommandType = CommandType.StoredProcedure; + MySqlParameter p1 = new MySqlParameter("", MySqlDbType.DateTime); + p1.Direction = ParameterDirection.ReturnValue; + cmd.Parameters.Add(p1); + cmd.ExecuteNonQuery(); + } + + /// + /// Bug #30029732 ERROR EXECUTING STORED ROUTINES + /// + [TestCase(true)] + [TestCase(false)] + public void StoredProcedureWithDifferentUser(bool hasPrivileges) + { + //Create Required Objects for all the tests + string host = Host == "localhost" ? Host : "%"; + string sql = $"use `{Connection.Settings.Database}`; " + $@"CREATE TABLE IF NOT EXISTS hello ( + id int(11) NOT NULL AUTO_INCREMENT, + string varchar(255) DEFAULT NULL, + PRIMARY KEY (id) + ) ENGINE = INNODB; + + CREATE PROCEDURE get_hello(IN p_id int) + SQL SECURITY INVOKER + BEGIN + SELECT * FROM hello + WHERE id = p_id; + END; + + INSERT INTO hello (string) VALUES ('Hello World!'); + CREATE USER 'atest'@'{host}' IDENTIFIED BY 'pwd'; + + GRANT SELECT ON table hello TO 'atest'@'{host}'; + + GRANT EXECUTE ON procedure get_hello TO 'atest'@'{host}'; + + CREATE PROCEDURE get_hello2(IN p_id int) + SQL SECURITY INVOKER + BEGIN + SELECT * FROM hello + WHERE id = p_id; + END; + "; + + ExecuteSQL(sql, true); + + Connection.Settings.UserID = hasPrivileges ? Connection.Settings.UserID : "atest"; + + using (MySqlConnection c1 = new MySqlConnection(Connection.ConnectionString)) + { + c1.Open(); + //Test with a user different than root and Granted to execute + //Test with root and Granted to execute + MySqlCommand cmd = new MySqlCommand(); + cmd.Connection = c1; + cmd.CommandText = "get_hello"; + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.AddWithValue("p_id", 1); + MySqlDataAdapter da = new MySqlDataAdapter(); + da.SelectCommand = cmd; + DataSet ds = new DataSet(); + da.Fill(ds); + Assert.That(ds.Tables.Count > 0, Is.True); + + //Test with not existing procedure + cmd.CommandText = "get_hello3"; + da.SelectCommand = cmd; + Assert.Throws(() => da.Fill(ds)); + + //Test with a user different than root and Not Granted to execute + cmd.CommandText = "get_hello2"; + da.SelectCommand = cmd; + if (hasPrivileges) + { + da.Fill(ds); + Assert.That(ds.Tables.Count > 0, Is.True); + } + else + { + Assert.Throws(() => da.Fill(ds)); + } + } + + sql = $"use `{Connection.Settings.Database}`; " + $@"drop procedure get_hello; + drop procedure get_hello2; + drop user 'atest'@'{host}';"; + ExecuteSQL(sql, true); + } + + /// + /// Bug #30444429 GETSCHEMATABLE RETURNS UNEXPECTED TABLE WHEN SPROC HAS OUTPUT PARAMETERS + /// + [Test] + public void OutputParameterAndResultset() + { + using (var connection = new MySqlConnection(Connection.ConnectionString)) + { + connection.Open(); + //Stored procedure with Output parameter + ResultSet + ExecuteSQL(@"CREATE PROCEDURE out_int( + OUT value INT + ) + BEGIN + SELECT 1 INTO value; + select value+1; + END;"); + using (var cmd = connection.CreateCommand()) + { + cmd.CommandText = "out_int"; + cmd.CommandType = CommandType.StoredProcedure; + MySqlParameter _outputParam = cmd.Parameters.Add(new MySqlParameter + { + ParameterName = "@value", + DbType = DbType.Int32, + Direction = ParameterDirection.Output, + }); + + using (var reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + var stdout1 = reader.GetInt32(0); + Assert.That(stdout1, Is.EqualTo(2)); + var schema = reader.GetSchemaTable(); + Assert.That(schema, Is.Not.Null); + Assert.That(reader.HasRows, Is.True); + Assert.That(reader.FieldCount, Is.EqualTo(1)); + } + } + var outparam1 = _outputParam.Value; + Assert.That(outparam1, Is.EqualTo(1)); + } + + + //Stored procedure with Output parameter Only + ExecuteSQL(@"CREATE PROCEDURE out_int2( + OUT value INT + ) + BEGIN + SELECT 1 INTO value; + END;"); + using (var cmd = connection.CreateCommand()) + { + cmd.CommandText = "out_int2"; + cmd.CommandType = CommandType.StoredProcedure; + MySqlParameter _outputParam2 = cmd.Parameters.Add(new MySqlParameter + { + ParameterName = "@value", + DbType = DbType.Int32, + Direction = ParameterDirection.Output, + }); + + using (var reader = cmd.ExecuteReader()) + { + reader.Read(); + var schema = reader.GetSchemaTable(); + Assert.That(schema, Is.Null); + Assert.That(reader.HasRows, Is.False); + Assert.That(reader.FieldCount, Is.EqualTo(0)); + } + var outparam1 = _outputParam2.Value; + Assert.That(outparam1, Is.EqualTo(1)); + } + } + } + + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/ReplicationTests.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/ReplicationTests.cs new file mode 100644 index 000000000..c599595f0 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/ReplicationTests.cs @@ -0,0 +1,54 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework; +using NUnit.Framework.Legacy; + +namespace MySql.Data.MySqlClient.Tests +{ + public class ReplicationTests: TestBase + { + [Test] + public void Simple() + { + using (MySqlConnection connection = new MySqlConnection(Connection.ConnectionString + ";replication=yes")) + { + MySqlCommand cmd = new MySqlCommand("SET @v=1", connection); + try + { + connection.Open(); + cmd.ExecuteNonQuery(); + } + catch (MySqlException ex) + { + Assert.That(ex.Message, Does.Contain("Replicated")); + } + } + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/StressTestsPipe.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/StressTestsPipe.cs new file mode 100644 index 000000000..b5f0e5fc0 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/StressTestsPipe.cs @@ -0,0 +1,41 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySql.Data.MySqlClient.Tests +{ + public class StressTestsPipe : StressTests + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.ConnectionProtocol = MySqlConnectionProtocol.NamedPipe; + settings.SslMode = MySqlSslMode.None; + } + } +} + + diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/StressTestsPipeCompressed.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/StressTestsPipeCompressed.cs new file mode 100644 index 000000000..2642e165b --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/StressTestsPipeCompressed.cs @@ -0,0 +1,42 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework.Internal; + +namespace MySql.Data.MySqlClient.Tests +{ + public class StressTestsPipeCompressed : StressTests + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.ConnectionProtocol = MySqlConnectionProtocol.NamedPipe; + settings.UseCompression = true; + settings.SslMode = MySqlSslMode.None; + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/StressTestsSharedMemory.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/StressTestsSharedMemory.cs new file mode 100644 index 000000000..533a47399 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/StressTestsSharedMemory.cs @@ -0,0 +1,41 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework.Internal; + +namespace MySql.Data.MySqlClient.Tests +{ + public class StressTestsSharedMemory : StressTests + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.ConnectionProtocol = MySqlConnectionProtocol.SharedMemory; + settings.SslMode = MySqlSslMode.None; + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/StressTestsSharedMemoryCompressed.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/StressTestsSharedMemoryCompressed.cs new file mode 100644 index 000000000..853ee4daa --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/StressTestsSharedMemoryCompressed.cs @@ -0,0 +1,46 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework.Internal; + +namespace MySql.Data.MySqlClient.Tests +{ + public class StressTestsSharedMemoryCompressed : StressTests + { + public StressTestsSharedMemoryCompressed() : base() + { + } + + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.ConnectionProtocol = MySqlConnectionProtocol.SharedMemory; + settings.UseCompression = true; + settings.SslMode = MySqlSslMode.None; + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/ThreadingTests.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/ThreadingTests.cs new file mode 100644 index 000000000..36fe37067 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/ThreadingTests.cs @@ -0,0 +1,140 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System.Threading; +using System.Collections; + +namespace MySql.Data.MySqlClient.Tests +{ + public class ThreadingTests : TestBase + { + public ThreadingTests() + { + TableCache.DumpCache(); + } + + private void MultipleThreadsWorker(object ev) + { + (ev as ManualResetEvent).WaitOne(); + + using (MySqlConnection c = new MySqlConnection(Connection.ConnectionString)) + { + c.Open(); + } + } + + /// + /// Bug #17106 MySql.Data.MySqlClient.CharSetMap.GetEncoding thread synchronization issue + /// + [Test] + public void MultipleThreads() + { + GenericListener myListener = new GenericListener(); + ManualResetEvent ev = new ManualResetEvent(false); + ArrayList threads = new ArrayList(); + System.Diagnostics.Trace.Listeners.Add(myListener); + + for (int i = 0; i < 20; i++) + { + ParameterizedThreadStart ts = new ParameterizedThreadStart(MultipleThreadsWorker); + Thread t = new Thread(ts); + threads.Add(t); + t.Start(ev); + } + // now let the threads go + ev.Set(); + + // wait for the threads to end + int x = 0; + while (x < threads.Count) + { + while ((threads[x] as Thread).IsAlive) + Thread.Sleep(50); + x++; + } + } + + private Exception lastException; + + /// + /// Bug #54012 MySql Connector/NET is not hardened to deal with + /// ThreadAbortException + /// + private void HardenedThreadAbortExceptionWorker() + { + try + { + using (MySqlConnection c = new MySqlConnection(Connection.ConnectionString)) + { + c.Open(); + MySqlCommand cmd = new MySqlCommand( + "SELECT BENCHMARK(10000000000,ENCODE('hello','goodbye'))", + c); + // ThreadAbortException is not delivered, when thread is + // stuck in system call. To shorten test time, set command + // timeout to a small value. Note .shortening command timeout + // means we could actually have timeout exception here too, + // but it seems like CLR delivers ThreadAbortException, if + // the thread was aborted. + cmd.CommandTimeout = 2; + cmd.ExecuteNonQuery(); + } + } + catch (Exception e) + { + lastException = e; + } + } + + [Test] + [Ignore("Fix This")] + public void HardenedThreadAbortException() + { + Thread t = new Thread(new ThreadStart(HardenedThreadAbortExceptionWorker)); + t.Name = "Execute Query"; + t.Start(); + Thread.Sleep(500); + t.Abort(); + t.Join(); + + Assert.That(lastException, Is.Not.Null); + + if (lastException is MySqlException) + { + // In some runs the ThreadAbortException comes as an inner exception + lastException = lastException.InnerException; + } + + //Assert.InstanceOf(typeof(ThreadAbortException), lastException); + Assert.That(lastException, Is.InstanceOf()); + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/TimeoutAndCancel.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/TimeoutAndCancel.cs new file mode 100644 index 000000000..96cc83ac2 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/TimeoutAndCancel.cs @@ -0,0 +1,345 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System.Threading; +using System.Data; +using System.Globalization; +using System.IO; +using NUnit.Framework.Internal; + +namespace MySql.Data.MySqlClient.Tests +{ + public class TimeoutAndCancel : TestBase + { + private delegate void CommandInvokerDelegate(MySqlCommand cmdToRun); + private ManualResetEvent resetEvent = new ManualResetEvent(false); + + protected override void Cleanup() + { + ExecuteSQL(String.Format("DROP TABLE IF EXISTS `{0}`.Test", Connection.Database)); + } + + private void CommandRunner(MySqlCommand cmdToRun) + { + object o = cmdToRun.ExecuteScalar(); + resetEvent.Set(); + Assert.That(o, Is.Null); + } + +#if NETFRAMEWORK + [Test] + public void CancelSingleQuery() + { + // first we need a routine that will run for a bit + ExecuteSQL(@"CREATE PROCEDURE CancelSingleQuery(duration INT) + BEGIN + SELECT SLEEP(duration); + END"); + + MySqlCommand cmd = new MySqlCommand("CancelSingleQuery", Connection); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.AddWithValue("duration", 10); + + // now we start execution of the command + CommandInvokerDelegate d = new CommandInvokerDelegate(CommandRunner); + d.BeginInvoke(cmd, null, null); + + // sleep 1 seconds + Thread.Sleep(1000); + + // now cancel the command + cmd.Cancel(); + + Assert.That(resetEvent.WaitOne(30 * 1000), "timeout"); + } +#endif + + int stateChangeCount; + [Test] + public void WaitTimeoutExpiring() + { + string connStr = Connection.ConnectionString; + MySqlConnectionStringBuilder sb = new MySqlConnectionStringBuilder(connStr); + + if (sb.ConnectionProtocol == MySqlConnectionProtocol.NamedPipe) + // wait timeout does not work for named pipe connections + return; + + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + c.StateChange += new StateChangeEventHandler(c_StateChange); + + // set the session wait timeout on this new connection + MySqlCommand cmd = new MySqlCommand("SET SESSION interactive_timeout=3", c); + cmd.ExecuteNonQuery(); + cmd.CommandText = "SET SESSION wait_timeout=2"; + cmd.ExecuteNonQuery(); + + stateChangeCount = 0; + // now wait 4 seconds + Thread.Sleep(4000); + + try + { + cmd.CommandText = "SELECT now()"; + cmd.ExecuteScalar(); + } + catch (MySqlException ex) + { + if (Version < new Version("8.0.24")) + Assert.That(ex.Message, Does.StartWith("Fatal")); + else + Assert.That(ex.Message, Does.StartWith("The client was disconnected")); + } + + Assert.That(stateChangeCount, Is.EqualTo(1)); + Assert.That(c.State, Is.EqualTo(ConnectionState.Closed)); + } + + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + MySqlCommand cmd = new MySqlCommand("SELECT now() as thetime, database() as db", c); + using (MySqlDataReader r = cmd.ExecuteReader()) + { + Assert.That(r.Read(), Is.True); + } + } + } + + void c_StateChange(object sender, StateChangeEventArgs e) + { + stateChangeCount++; + } + + [Test] + [Ignore("Fix This")] + public void TimeoutExpiring() + { + //DateTime start = DateTime.Now; + //MySqlCommand cmd = new MySqlCommand("SELECT SLEEP(5)", Connection); + //cmd.CommandTimeout = 1; + //Exception ex = Assert.Throws(() => cmd.ExecuteNonQuery()); + //Assert.True(ex.Message.StartsWith("Fatal error encountered during", StringComparison.OrdinalIgnoreCase), "Message is wrong " + ex.Message); + } + + [Test] + public void TimeoutNotExpiring() + { + MySqlCommand cmd = new MySqlCommand("SELECT SLEEP(1)", Connection); + cmd.CommandTimeout = 2; + cmd.ExecuteNonQuery(); + } + + [Test] + public void TimeoutNotExpiring2() + { + MySqlCommand cmd = new MySqlCommand("SELECT SLEEP(1)", Connection); + cmd.CommandTimeout = 0; // infinite timeout + cmd.ExecuteNonQuery(); + } + + [Test] + [Ignore("Fix This")] + public void TimeoutDuringBatch() + { + //executeSQL(@"CREATE PROCEDURE spTest(duration INT) + // BEGIN + // SELECT SLEEP(duration); + // END"); + + //executeSQL("CREATE TABLE test (id INT)"); + + //MySqlCommand cmd = new MySqlCommand( + // "call spTest(5);INSERT INTO test VALUES(4)", Connection); + //cmd.CommandTimeout = 2; + //Exception ex = Assert.Throws(() => cmd.ExecuteNonQuery()); + //Assert.True(ex.Message.StartsWith("Timeout expired", StringComparison.OrdinalIgnoreCase), "Message is wrong" + ex); + + //// Check that connection is still usable + //MySqlCommand cmd2 = new MySqlCommand("select 10", Connection); + //long res = (long)cmd2.ExecuteScalar(); + //Assert.AreEqual(10, res); + } + + [Test] + public void CancelSelect() + { + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE Test (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20))"); + for (int i = 0; i < 1000; i++) + ExecuteSQL("INSERT INTO Test VALUES (NULL, 'my string')"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", Connection); + cmd.CommandTimeout = 0; + int rows = 0; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + + cmd.Cancel(); + + while (true) + { + + try + { + if (!reader.Read()) + break; + rows++; + } + catch (MySqlException ex) + { + Assert.That(ex.Number, Is.EqualTo((int)MySqlErrorCode.QueryInterrupted)); + if (rows < 1000) + { + bool readOK = reader.Read(); + Assert.That(readOK, Is.False); + } + } + + } + } + Assert.That(rows < 1000); + } + + /// + /// Bug #40091 mysql driver 5.2.3.0 connection pooling issue + /// + [Test] + [Ignore("Issue")] + public void ConnectionStringModifiedAfterCancel() + { + string connStr = $"server={Host};userid={RootUser};pwd={RootPassword};port={Port};persist security info=true"; + MySqlConnectionStringBuilder sb = new MySqlConnectionStringBuilder(connStr); + + if (sb.ConnectionProtocol == MySqlConnectionProtocol.NamedPipe) + // idle named pipe connections cannot be KILLed (server bug#47571) + return; + + connStr = connStr.Replace("persist security info=true", "persist security info=false"); + + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + string connStr1 = c.ConnectionString; + + MySqlCommand cmd = new MySqlCommand("SELECT SLEEP(5)", c); + cmd.CommandTimeout = 1; + try + { + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + } + } + catch (MySqlException ex) + { + Assert.That(ex.InnerException is TimeoutException, Is.True); + Assert.That(c.State, Is.EqualTo(ConnectionState.Open)); + } + string connStr2 = c.ConnectionString.ToLower(CultureInfo.InvariantCulture); + Assert.That(connStr2, Is.EqualTo(connStr1.ToLower(CultureInfo.InvariantCulture))); + c.Close(); + } + + } + + + /// + /// Bug #45978 Silent problem when net_write_timeout is exceeded + /// + [Test] + public void NetWriteTimeoutExpiring() + { + ExecuteSQL("CREATE TABLE Test(id int, blob1 longblob)"); + int rows = 1000; + byte[] b1 = Utils.CreateBlob(5000); + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (@id, @b1)", Connection); + cmd.Parameters.Add("@id", MySqlDbType.Int32); + cmd.Parameters.AddWithValue("@name", b1); + for (int i = 0; i < rows; i++) + { + cmd.Parameters[0].Value = i; + cmd.ExecuteNonQuery(); + } + + string connStr = Connection.ConnectionString; + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + cmd.Connection = c; + cmd.Parameters.Clear(); + cmd.CommandText = "SET net_write_timeout = 1"; + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM Test LIMIT " + rows; + int i = 0; + + try + { + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + // after this several cycles of DataReader.Read() are executed + // normally and then the problem, described above, occurs + for (; i < rows; i++) + { + Assert.That(!reader.Read(), Is.False, "unexpected 'false' from reader.Read"); + if (i % 10 == 0) + Thread.Sleep(1); + object v = reader.GetValue(1); + } + } + } + catch (Exception e) + { + Exception currentException = e; + while (currentException != null) + { + if (currentException is EndOfStreamException) + return; + + if ((Connection.ConnectionString.IndexOf("protocol=namedpipe") >= 0 || Connection.ConnectionString.IndexOf("protocol=sharedmemory") >= 0) && currentException is MySqlException) + return; + + currentException = currentException.InnerException; + } + + throw e; + } + + // IT is relatively hard to predict where + Console.WriteLine("Warning: all reads completed!"); + Assert.That(i, Is.EqualTo(rows)); + } + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/TimeoutAndCancelCompressed.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/TimeoutAndCancelCompressed.cs new file mode 100644 index 000000000..3c02ba9af --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/TimeoutAndCancelCompressed.cs @@ -0,0 +1,38 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySql.Data.MySqlClient.Tests +{ + public class TimeoutAndCancelCompressed : TimeoutAndCancel + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.UseCompression = true; + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/TimeoutAndCancelPipe.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/TimeoutAndCancelPipe.cs new file mode 100644 index 000000000..00e010872 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/TimeoutAndCancelPipe.cs @@ -0,0 +1,39 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySql.Data.MySqlClient.Tests +{ + public class TimeoutAndCancelPipe : TimeoutAndCancel + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.ConnectionProtocol = MySqlConnectionProtocol.NamedPipe; + settings.SslMode = MySqlSslMode.None; + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/TimeoutAndCancelSharedMemory.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/TimeoutAndCancelSharedMemory.cs new file mode 100644 index 000000000..622a9bf1a --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/TimeoutAndCancelSharedMemory.cs @@ -0,0 +1,47 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + + +using NUnit.Framework.Internal; + +namespace MySql.Data.MySqlClient.Tests +{ + public class TimeoutAndCancelSharedMemory : TimeoutAndCancel + { + public TimeoutAndCancelSharedMemory() : base() + { + } + + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.ConnectionProtocol = MySqlConnectionProtocol.SharedMemory; + settings.SslMode = MySqlSslMode.None; + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/TypeTests.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/TypeTests.cs new file mode 100644 index 000000000..71c861b44 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/TypeTests.cs @@ -0,0 +1,69 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework; +using NUnit.Framework.Legacy; +using MySql.Data.Types; +using System.IO; + +namespace MySql.Data.MySqlClient.Tests +{ + public class TypeTests : TestBase + { +#if !NET8_0_OR_GREATER + /// + /// Test fix for http://bugs.mysql.com/bug.php?id=40555 + /// Make MySql.Data.Types.MySqlDateTime serializable. + /// + [Test] + public void TestSerializationMySqlDataTime() + { + MySqlDateTime dt = new MySqlDateTime(2011, 10, 6, 11, 38, 01, 0); + Assert.That(dt.Year, Is.EqualTo(2011)); + Assert.That(dt.Month, Is.EqualTo(10)); + Assert.That(dt.Day, Is.EqualTo(6)); + Assert.That(dt.Hour, Is.EqualTo(11)); + Assert.That(dt.Minute, Is.EqualTo(38)); + Assert.That(dt.Second, Is.EqualTo(1)); + System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = + new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); + MemoryStream ms = new MemoryStream(1024); + bf.Serialize(ms, dt); + ms.Position = 0; + object o = bf.Deserialize(ms); + dt = (MySqlDateTime)o; + Assert.That(dt.Year, Is.EqualTo(2011)); + Assert.That(dt.Month, Is.EqualTo(10)); + Assert.That(dt.Day, Is.EqualTo(6)); + Assert.That(dt.Hour, Is.EqualTo(11)); + Assert.That(dt.Minute, Is.EqualTo(38)); + Assert.That(dt.Second, Is.EqualTo(1)); + } +#endif + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/UsageAdvisorTests.cs b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/UsageAdvisorTests.cs new file mode 100644 index 000000000..b8d746a6e --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Framework/netstandard2_0/UsageAdvisorTests.cs @@ -0,0 +1,215 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System.Diagnostics; +using System; + +namespace MySql.Data.MySqlClient.Tests +{ + public class UsageAdvisorTests : TestBase + { + protected override void Cleanup() + { + ExecuteSQL(String.Format("DROP TABLE IF EXISTS `{0}`.Test", Connection.Database)); + } + + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.UseUsageAdvisor = true; + } + + [Test] + public void NotReadingEveryField() + { + ExecuteSQL("CREATE TABLE Test (id int, name VARCHAR(200))"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'Test1')"); + ExecuteSQL("INSERT INTO Test VALUES (2, 'Test2')"); + ExecuteSQL("INSERT INTO Test VALUES (3, 'Test3')"); + ExecuteSQL("INSERT INTO Test VALUES (4, 'Test4')"); + + MySqlTrace.Listeners.Clear(); + MySqlTrace.Switch.Level = SourceLevels.All; + GenericListener listener = new GenericListener(); + MySqlTrace.Listeners.Add(listener); + string sql = "SELECT * FROM Test; SELECT * FROM Test WHERE id > 2"; + MySqlCommand cmd = new MySqlCommand(sql, Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + reader.GetInt32(0); // access the first field + reader.Read(); + Assert.That(reader.NextResult(), Is.True); + reader.Read(); + Assert.That(reader.GetString(1), Is.EqualTo("Test3")); + Assert.That(reader.NextResult(), Is.False); + } + + Assert.That(listener.Strings.Count, Is.EqualTo(12)); + Assert.That(listener.Strings[0], Does.Contain("Query Opened: SELECT * FROM Test; SELECT * FROM Test WHERE id > 2")); + Assert.That(listener.Strings[1], Does.Contain("Resultset Opened: field(s) = 2, affected rows = -1, inserted id = -1")); + Assert.That(listener.Strings[2], Does.Contain("Usage Advisor Warning: Query does not use an index")); + Assert.That(listener.Strings[3], Does.Contain("Usage Advisor Warning: Skipped 2 rows. Consider a more focused query")); + Assert.That(listener.Strings[4], Does.Contain("Usage Advisor Warning: The following columns were not accessed: name")); + Assert.That(listener.Strings[5], Does.Contain("Resultset Closed. Total rows=4, skipped rows=2, size (bytes)=32")); + Assert.That(listener.Strings[6], Does.Contain("Resultset Opened: field(s) = 2, affected rows = -1, inserted id = -1")); + Assert.That(listener.Strings[7], Does.Contain("Usage Advisor Warning: Query does not use an index")); + Assert.That(listener.Strings[8], Does.Contain("Usage Advisor Warning: Skipped 1 rows. Consider a more focused query")); + Assert.That(listener.Strings[9], Does.Contain("Usage Advisor Warning: The following columns were not accessed: id")); + Assert.That(listener.Strings[10], Does.Contain("Resultset Closed. Total rows=2, skipped rows=1, size (bytes)=16")); + Assert.That(listener.Strings[11], Does.Contain("Query Closed")); + } + + [Test] + public void NotReadingEveryRow() + { + ExecuteSQL("CREATE TABLE Test (id int, name VARCHAR(200))"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'Test1')"); + ExecuteSQL("INSERT INTO Test VALUES (2, 'Test2')"); + ExecuteSQL("INSERT INTO Test VALUES (3, 'Test3')"); + ExecuteSQL("INSERT INTO Test VALUES (4, 'Test4')"); + + MySqlTrace.Listeners.Clear(); + MySqlTrace.Switch.Level = SourceLevels.All; + GenericListener listener = new GenericListener(); + MySqlTrace.Listeners.Add(listener); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test; SELECT * FROM Test WHERE id > 2", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + reader.Read(); + Assert.That(reader.NextResult(), Is.True); + reader.Read(); + reader.Read(); + Assert.That(reader.NextResult(), Is.False); + } + + Assert.That(listener.Strings, Has.Count.EqualTo(11)); + Assert.That(listener.Strings[0], Does.Contain("Query Opened: SELECT * FROM Test; SELECT * FROM Test WHERE id > 2")); + Assert.That(listener.Strings[1], Does.Contain("Resultset Opened: field(s) = 2, affected rows = -1, inserted id = -1")); + Assert.That(listener.Strings[2], Does.Contain("Usage Advisor Warning: Query does not use an index")); + Assert.That(listener.Strings[3], Does.Contain("Usage Advisor Warning: Skipped 2 rows. Consider a more focused query")); + Assert.That(listener.Strings[4], Does.Contain("Usage Advisor Warning: The following columns were not accessed: id,name")); + Assert.That(listener.Strings[5], Does.Contain("Resultset Closed. Total rows=4, skipped rows=2, size (bytes)=32")); + Assert.That(listener.Strings[6], Does.Contain("Resultset Opened: field(s) = 2, affected rows = -1, inserted id = -1")); + Assert.That(listener.Strings[7], Does.Contain("Usage Advisor Warning: Query does not use an index")); + Assert.That(listener.Strings[8], Does.Contain("Usage Advisor Warning: The following columns were not accessed: id,name")); + Assert.That(listener.Strings[9], Does.Contain("Resultset Closed. Total rows=2, skipped rows=0, size (bytes)=16")); + Assert.That(listener.Strings[10], Does.Contain("Query Closed")); + } + + [Test] + public void FieldConversion() + { + ExecuteSQL("CREATE TABLE Test (id int, name VARCHAR(200))"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'Test1')"); + + MySqlTrace.Listeners.Clear(); + MySqlTrace.Switch.Level = SourceLevels.All; + GenericListener listener = new GenericListener(); + MySqlTrace.Listeners.Add(listener); + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", Connection); + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + short s = reader.GetInt16(0); + long l = reader.GetInt64(0); + string str = reader.GetString(1); + } + + Assert.That(listener.Strings.Count, Is.EqualTo(6)); + Assert.That(listener.Strings[0], Does.Contain("Query Opened: SELECT * FROM Test")); + Assert.That(listener.Strings[1], Does.Contain("Resultset Opened: field(s) = 2, affected rows = -1, inserted id = -1")); + Assert.That(listener.Strings[2], Does.Contain("Usage Advisor Warning: Query does not use an index")); + Assert.That(listener.Strings[3], Does.Contain("Usage Advisor Warning: The field 'id' was converted to the following types: Int16,Int64")); + Assert.That(listener.Strings[4], Does.Contain("Resultset Closed. Total rows=1, skipped rows=0, size (bytes)=8")); + Assert.That(listener.Strings[5], Does.Contain("Query Closed")); + } + + [Test] + public void NoIndexUsed() + { + ExecuteSQL("CREATE TABLE Test (id int, name VARCHAR(200))"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'Test1')"); + ExecuteSQL("INSERT INTO Test VALUES (2, 'Test1')"); + ExecuteSQL("INSERT INTO Test VALUES (3, 'Test1')"); + ExecuteSQL("INSERT INTO Test VALUES (4, 'Test1')"); + + MySqlTrace.Listeners.Clear(); + MySqlTrace.Switch.Level = SourceLevels.All; + GenericListener listener = new GenericListener(); + MySqlTrace.Listeners.Add(listener); + MySqlCommand cmd = new MySqlCommand("SELECT name FROM Test WHERE id=3", Connection); + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + } + + Assert.That(listener.Strings.Count, Is.EqualTo(6)); + Assert.That(listener.Strings[0], Does.Contain("Query Opened: SELECT name FROM Test WHERE id=3")); + Assert.That(listener.Strings[1], Does.Contain("Resultset Opened: field(s) = 1, affected rows = -1, inserted id = -1")); + Assert.That(listener.Strings[2], Does.Contain("Usage Advisor Warning: Query does not use an index")); + Assert.That(listener.Strings[3], Does.Contain("Usage Advisor Warning: The following columns were not accessed: name")); + Assert.That(listener.Strings[4], Does.Contain("Resultset Closed. Total rows=1, skipped rows=0, size (bytes)=6")); + Assert.That(listener.Strings[5], Does.Contain("Query Closed")); + } + + [Test] + public void BadIndexUsed() + { + ExecuteSQL("CREATE TABLE Test(id INT, name VARCHAR(20) PRIMARY KEY)"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'Test1')"); + ExecuteSQL("INSERT INTO Test VALUES (2, 'Test2')"); + ExecuteSQL("INSERT INTO Test VALUES (3, 'Test3')"); + ExecuteSQL("INSERT INTO Test VALUES (4, 'Test4')"); + + MySqlTrace.Listeners.Clear(); + MySqlTrace.Switch.Level = SourceLevels.All; + GenericListener listener = new GenericListener(); + MySqlTrace.Listeners.Add(listener); + MySqlCommand cmd = new MySqlCommand("SELECT name FROM Test WHERE id=3", Connection); + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + } + + Assert.That(listener.Strings.Count, Is.EqualTo(6)); + Assert.That(listener.Strings[0], Does.Contain("Query Opened: SELECT name FROM Test WHERE id=3")); + Assert.That(listener.Strings[1], Does.Contain("Resultset Opened: field(s) = 1, affected rows = -1, inserted id = -1")); + Assert.That(listener.Strings[2], Does.Contain("Usage Advisor Warning: Query does not use an index")); + Assert.That(listener.Strings[3], Does.Contain("Usage Advisor Warning: The following columns were not accessed: name")); + Assert.That(listener.Strings[4], Does.Contain("Resultset Closed. Total rows=1, skipped rows=0, size (bytes)=6")); + Assert.That(listener.Strings[5], Does.Contain("Query Closed")); + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/GenericListener.cs b/MySQL.Data/tests/MySql.Data.Tests/GenericListener.cs new file mode 100644 index 000000000..46fb9a42d --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/GenericListener.cs @@ -0,0 +1,86 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Collections.Generic; +using System.Text; +using System.Diagnostics; + +namespace MySql.Data.MySqlClient.Tests +{ + public class GenericListener : TraceListener + { + List strings; + StringBuilder partial; + + public GenericListener() + { + strings = new List(); + partial = new StringBuilder(); + } + + public List Strings + { + get { return strings; } + } + + public int Find(string sToFind) + { + int count = 0; + foreach (string s in strings) + if (s.IndexOf(sToFind) != -1) + count++; + return count; + } + + public void Clear() + { + partial.Remove(0, partial.Length); + strings.Clear(); + } + + public override void Write(string message) + { + partial.Append(message); + } + + public override void WriteLine(string message) + { + Write(message); + strings.Add(partial.ToString()); + partial.Remove(0, partial.Length); + } + + public int CountLinesContaining(string text) + { + int count = 0; + foreach (string s in strings) + if (s.Contains(text)) count++; + return count; + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/LoggingTests.cs b/MySQL.Data/tests/MySql.Data.Tests/LoggingTests.cs new file mode 100644 index 000000000..691199865 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/LoggingTests.cs @@ -0,0 +1,155 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Text; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System.Diagnostics; + +namespace MySql.Data.MySqlClient.Tests +{ + public class LoggingTests : TestBase + { + protected override void Cleanup() + { + ExecuteSQL(String.Format("DROP TABLE IF EXISTS `{0}`.Test", Connection.Database)); + } + + [Test] + public void SimpleLogging() + { + ExecuteSQL("CREATE TABLE Test(id INT, name VARCHAR(200))"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'Test1')"); + ExecuteSQL("INSERT INTO Test VALUES (2, 'Test2')"); + ExecuteSQL("INSERT INTO Test VALUES (3, 'Test3')"); + ExecuteSQL("INSERT INTO Test VALUES (4, 'Test4')"); + + MySqlTrace.Listeners.Clear(); + MySqlTrace.Switch.Level = SourceLevels.All; + + + GenericListener listener = new GenericListener(); + + MySqlTrace.Listeners.Add(listener); + + using (var logConn = new MySqlConnection(Connection.ConnectionString + ";logging=true")) + { + logConn.Open(); + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", logConn); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + } + } + //Assert.AreEqual(4, listener.Strings.Count); + Assert.That(listener.Strings.Count, Is.EqualTo(27)); + Assert.That(listener.Strings[listener.Strings.Count - 5], Does.Contain("Query Opened: SELECT * FROM Test")); + Assert.That(listener.Strings[listener.Strings.Count - 4], Does.Contain("Resultset Opened: field(s) = 2, affected rows = -1, inserted id = -1")); + Assert.That(listener.Strings[listener.Strings.Count - 3], Does.Contain("Resultset Closed. Total rows=4, skipped rows=4, size (bytes)=32")); + Assert.That(listener.Strings[listener.Strings.Count - 2], Does.Contain("Query Closed")); + } + + [Test] + public void Warnings() + { + ExecuteSQL("CREATE TABLE Test(id INT, name VARCHAR(5))"); + MySqlTrace.Listeners.Clear(); + MySqlTrace.Switch.Level = SourceLevels.All; + GenericListener listener = new GenericListener(); + + MySqlTrace.Listeners.Add(listener); + + using (var logConn = new MySqlConnection(Connection.ConnectionString + ";logging=true")) + { + logConn.Open(); + MySqlCommand cmd = new MySqlCommand("INSERT IGNORE INTO Test VALUES (1, 'abcdef')", logConn); + cmd.ExecuteNonQuery(); + } + + Assert.That(listener.Strings.Count, Is.EqualTo(32)); + Assert.That(listener.Strings[listener.Strings.Count - 10], Does.Contain("Query Opened: INSERT IGNORE INTO Test VALUES (1, 'abcdef')")); + Assert.That(listener.Strings[listener.Strings.Count - 9], Does.Contain("Resultset Opened: field(s) = 0, affected rows = 1, inserted id = 0")); + Assert.That(listener.Strings[listener.Strings.Count - 8], Does.Contain("Resultset Closed. Total rows=0, skipped rows=0, size (bytes)=0")); + Assert.That(listener.Strings[listener.Strings.Count - 7], Does.Contain("Query Opened: SHOW WARNINGS")); + Assert.That(listener.Strings[listener.Strings.Count - 6], Does.Contain("Resultset Opened: field(s) = 3, affected rows = -1, inserted id = -1")); + Assert.That(listener.Strings[listener.Strings.Count - 5], Does.Contain("Resultset Closed. Total rows=1, skipped rows=0, size (bytes)=55")); + Assert.That(listener.Strings[listener.Strings.Count - 4], Does.Contain("Query Closed")); + Assert.That(listener.Strings[listener.Strings.Count - 3], Does.Contain("MySql Warning: Level=Warning, Code=1265, Message=Data truncated for column 'name' at row 1")); + Assert.That(listener.Strings[listener.Strings.Count - 2], Does.Contain("Query Closed")); + } + + [Test] + public void ProviderNormalizingQuery() + { + MySqlTrace.Listeners.Clear(); + MySqlTrace.Switch.Level = SourceLevels.All; + GenericListener listener = new GenericListener(); + MySqlTrace.Listeners.Add(listener); + + StringBuilder sql = new StringBuilder("SELECT '"); + for (int i = 0; i < 400; i++) + sql.Append("a"); + sql.Append("'"); + + using (var logConn = new MySqlConnection(Connection.ConnectionString + ";logging=true")) + { + logConn.Open(); + MySqlCommand cmd = new MySqlCommand(sql.ToString(), logConn); + cmd.ExecuteNonQuery(); + } + + Assert.That(listener.Strings.Count, Is.EqualTo(28)); + Assert.That(listener.Strings[listener.Strings.Count - 5], Does.EndWith("SELECT ?")); + } + + /// + /// Bug #57641 Substring out of range exception in ConsumeQuotedToken + /// + [Test] + public void QuotedTokenAt300() + { + MySqlTrace.Listeners.Clear(); + MySqlTrace.Switch.Level = SourceLevels.All; + GenericListener listener = new GenericListener(); + MySqlTrace.Listeners.Add(listener); + + string sql = @"SELECT 1 AS `AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1`, 2 AS `AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2`, + 3 AS `AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3`, 4 AS `AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4`, + 5 AS `AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5`, 6 AS `AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6`;"; + + using (var logConn = new MySqlConnection(Connection.ConnectionString + ";logging=true")) + { + logConn.Open(); + MySqlCommand cmd = new MySqlCommand(sql, logConn); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + } + } + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/MockServer.cs b/MySQL.Data/tests/MySql.Data.Tests/MockServer.cs new file mode 100644 index 000000000..991052127 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/MockServer.cs @@ -0,0 +1,138 @@ +// Copyright © 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Net; +using System.Net.Sockets; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.Data.Tests +{ + public class MockServer + { + private TcpListener listener; + + private int _port; + + private IPAddress _address; + + private ManualResetEvent _stopserver = new ManualResetEvent(false); + + private CancellationTokenSource cts; + + private bool _usetimeout; + + public int Port + { + get => _port; + set => _port = value; + } + + public IPAddress Address + { + get => _address; + set => _address = value; + } + + public MockServer(bool usetimeout) + { + GetMockServerInfo(); + _stopserver.Reset(); + _usetimeout = usetimeout; + cts = new CancellationTokenSource(TimeSpan.FromSeconds(12)); + } + + public void GetMockServerInfo() + { + TcpListener loopback = new TcpListener(IPAddress.Loopback, 0); + loopback.Start(); + _port = ((IPEndPoint)loopback.LocalEndpoint).Port; + loopback.Stop(); + _address = Dns.GetHostEntry("localhost").AddressList[0]; + } + + public void StopServer() + { + _stopserver.Set(); + } + public void DisposeListener() + { + if (listener != null) + { + listener.Stop(); + } + } + + public async Task ServerWorker(CancellationToken ct) + { + await Task.Run(() => + { + IPEndPoint endpoint = new IPEndPoint(IPAddress.Loopback, Port); + listener = new(endpoint); + + try + { + listener.Start(); + while (!_stopserver.WaitOne(1)) + { + listener.BeginAcceptSocket(new AsyncCallback(beginConnection), null); + } + } + catch (Exception) + { + } + finally + { + listener.Stop(); + } + }, ct).ConfigureAwait(false); + } + + public void StartServer() + { + ServerWorker(cts.Token).ConfigureAwait(false); + } + + private void beginConnection(IAsyncResult iar) + { + try + { + Socket client = listener.EndAcceptSocket(iar); + if (_usetimeout) + { + Task.Delay(500).Wait(); + client.Close(); + } + } + catch (Exception) + { + } + } + } +} \ No newline at end of file diff --git a/MySQL.Data/tests/MySql.Data.Tests/MySql.Data.Tests.csproj b/MySQL.Data/tests/MySql.Data.Tests/MySql.Data.Tests.csproj new file mode 100644 index 000000000..4ec3a5c15 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/MySql.Data.Tests.csproj @@ -0,0 +1,141 @@ + + + + MySql.Data.Tests + MySql.Data.Tests Class Library + Copyright © 2016, 2025, Oracle and/or its affiliates. + 9.4.0 + Oracle + Oracle + MySql.Data.Tests + net9.0;net8.0; + MySql.Data.Tests + MySql;.NET Connector;MySql Connector/NET;netcore;.Net Core;MySql Conector/Net Core;coreclr;C/NET;C/Net Core + http://www.mysql.com/common/logos/logo-mysql-170x115.png + http://dev.mysql.com/downloads/ + GPL-2.0-only WITH Universal-FOSS-exception-1.0 + true + false + false + false + false + false + false + True + True + ..\..\..\ConnectorNetPublicKey.snk + latest + CS1591,CS1587,CS1701,CS1702,CS1570,CA2100 + + + + $(TargetFrameworks);net10.0 + + + + net462;net48;$(TargetFrameworks) + + + + + + + + + + + + + + + + + + + + + + + + + $(DefineConstants);TRACE;DEBUG + true + + + + $(DefineConstants);TRACE;RELEASE + true + + + + + + + + + + + + + + + + + + + Always + ca-key.pem + + + Always + ca.pem + + + Always + ca_dummy.pem + + + Always + client-cert.pem + + + Always + client-cert_dummy.pem + + + Always + client-key.pem + + + Always + client-key_dummy.pem + + + Always + client-key_altered.pem + + + Always + server-cert.pem + + + Always + server-key.pem + + + Always + client-incorrect.pfx + + + Always + image1.jpg + + + Always + + + Always + + + + \ No newline at end of file diff --git a/MySQL.Data/tests/MySql.Data.Tests/MySqlBulkLoaderTests.cs b/MySQL.Data/tests/MySql.Data.Tests/MySqlBulkLoaderTests.cs new file mode 100644 index 000000000..4eace9b66 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/MySqlBulkLoaderTests.cs @@ -0,0 +1,859 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Data; +using System.IO; +using System.Reflection; + +namespace MySql.Data.MySqlClient.Tests +{ + public class MySqlBulkLoaderTests : TestBase + { + protected override void Cleanup() + { + ExecuteSQL(String.Format("DROP TABLE IF EXISTS `{0}`.Test", Connection.Database), true); + } + + [OneTimeSetUp] + public void OneTimeSetup() + { + if (Version >= new Version(8, 0, 2)) ExecuteSQL("SET GLOBAL local_infile = 1", true); + } + + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.AllowLoadLocalInfile = true; + } + + [Test] + public void BulkLoadSimple() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); + + // first create the external file + string path = Path.GetTempFileName(); + StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); + for (int i = 0; i < 200; i++) + sw.WriteLine(i + "\t'Test'"); + sw.Flush(); + sw.Dispose(); + + MySqlBulkLoader loader = new MySqlBulkLoader(Connection); + loader.TableName = "Test"; + loader.FileName = path; + loader.Timeout = 0; + loader.Local = true; + int count = loader.Load(); + Assert.That(count, Is.EqualTo(200)); + + DataTable dt = Utils.FillTable("SELECT * FROM Test", Connection); + Assert.That(dt.Rows.Count, Is.EqualTo(200)); + Assert.That(dt.Rows[0][1].ToString().Trim(), Is.EqualTo("'Test'")); + } + + [Test] + public void BulkLoadReadOnlyFile() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); + + // first create the external file + string path = Path.GetTempFileName(); + StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); + for (int i = 0; i < 200; i++) + sw.WriteLine(i + "\t'Test'"); + sw.Flush(); + sw.Dispose(); + + FileInfo fi = new FileInfo(path); + FileAttributes oldAttr = fi.Attributes; + fi.Attributes = fi.Attributes | FileAttributes.ReadOnly; + try + { + MySqlBulkLoader loader = new MySqlBulkLoader(Connection); + loader.TableName = "Test"; + loader.FileName = path; + loader.Timeout = 0; + loader.Local = true; + int count = loader.Load(); + Assert.That(count, Is.EqualTo(200)); + + DataTable dt = Utils.FillTable("SELECT * FROM Test", Connection); + Assert.That(dt.Rows.Count, Is.EqualTo(200)); + Assert.That(dt.Rows[0][1].ToString().Trim(), Is.EqualTo("'Test'")); + } + finally + { + fi.Attributes = oldAttr; + fi.Delete(); + } + } + + [Test] + public void BulkLoadSimple2() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); + + // first create the external file + string path = Path.GetTempFileName(); + StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); + for (int i = 0; i < 200; i++) + sw.Write(i + ",'Test' xxx"); + sw.Flush(); + sw.Dispose(); + + MySqlBulkLoader loader = new MySqlBulkLoader(Connection); + loader.TableName = "Test"; + loader.FileName = path; + loader.Timeout = 0; + loader.FieldTerminator = ","; + loader.LineTerminator = "xxx"; + loader.Local = true; + int count = loader.Load(); + Assert.That(count, Is.EqualTo(200)); + + MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM Test", Connection); + Assert.That(Convert.ToInt32(cmd.ExecuteScalar()), Is.EqualTo(200)); + } + + [Test] + public void BulkLoadSimple3() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); + + // first create the external file + string path = Path.GetTempFileName(); + StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); + for (int i = 0; i < 200; i++) + sw.Write(i + ",'Test' xxx"); + sw.Flush(); + sw.Dispose(); + + MySqlBulkLoader loader = new MySqlBulkLoader(Connection); + loader.TableName = "Test"; + loader.FileName = path; + loader.Timeout = 0; + loader.FieldTerminator = ","; + loader.LineTerminator = "xxx"; + loader.NumberOfLinesToSkip = 50; + loader.Local = true; + int count = loader.Load(); + Assert.That(count, Is.EqualTo(150)); + + MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM Test", Connection); + Assert.That(Convert.ToInt32(cmd.ExecuteScalar()), Is.EqualTo(150)); + } + + [Test] + public void BulkLoadSimple4() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); + + // first create the external file + string path = Path.GetTempFileName(); + StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); + for (int i = 0; i < 100; i++) + sw.Write("aaa" + i + ",'Test' xxx"); + for (int i = 100; i < 200; i++) + sw.Write("bbb" + i + ",'Test' xxx"); + for (int i = 200; i < 300; i++) + sw.Write("aaa" + i + ",'Test' xxx"); + for (int i = 300; i < 400; i++) + sw.Write("bbb" + i + ",'Test' xxx"); + sw.Flush(); + sw.Dispose(); + + MySqlBulkLoader loader = new MySqlBulkLoader(Connection); + loader.TableName = "Test"; + loader.FileName = path; + loader.Timeout = 0; + loader.FieldTerminator = ","; + loader.LineTerminator = "xxx"; + loader.LinePrefix = "bbb"; + loader.Local = true; + int count = loader.Load(); + Assert.That(count, Is.EqualTo(200)); + + MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM Test", Connection); + Assert.That(Convert.ToInt32(cmd.ExecuteScalar()), Is.EqualTo(200)); + } + + [Test] + public void BulkLoadFieldQuoting() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), name2 VARCHAR(250), PRIMARY KEY(id))"); + + // first create the external file + string path = Path.GetTempFileName(); + StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); + for (int i = 0; i < 200; i++) + sw.WriteLine(i + "\t`col1`\tcol2"); + sw.Flush(); + sw.Dispose(); + + MySqlBulkLoader loader = new MySqlBulkLoader(Connection); + loader.TableName = "Test"; + loader.FileName = path; + loader.Timeout = 0; + loader.FieldQuotationCharacter = '`'; + loader.FieldQuotationOptional = true; + loader.Local = true; + int count = loader.Load(); + Assert.That(count, Is.EqualTo(200)); + + DataTable dt = Utils.FillTable("SELECT * FROM Test", Connection); + Assert.That(dt.Rows.Count, Is.EqualTo(200)); + Assert.That(dt.Rows[0][1], Is.EqualTo("col1")); + Assert.That(dt.Rows[0][2].ToString().Trim(), Is.EqualTo("col2")); + } + + [Test] + public void BulkLoadEscaping() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), name2 VARCHAR(250), PRIMARY KEY(id))"); + + // first create the external file + string path = Path.GetTempFileName(); + StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); + for (int i = 0; i < 200; i++) + sw.WriteLine(i + ",col1\tstill col1,col2"); + sw.Flush(); + sw.Dispose(); + + MySqlBulkLoader loader = new MySqlBulkLoader(Connection); + loader.TableName = "Test"; + loader.FileName = path; + loader.Timeout = 0; + loader.EscapeCharacter = '\t'; + loader.FieldTerminator = ","; + loader.Local = true; + int count = loader.Load(); + Assert.That(count, Is.EqualTo(200)); + + DataTable dt = Utils.FillTable("SELECT * FROM Test", Connection); + Assert.That(dt.Rows.Count, Is.EqualTo(200)); + Assert.That(dt.Rows[0][1], Is.EqualTo("col1still col1")); + Assert.That(dt.Rows[0][2].ToString().Trim(), Is.EqualTo("col2")); + } + + [Test] + public void BulkLoadConflictOptionReplace() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); + + // first create the external file + string path = Path.GetTempFileName(); + StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); + for (int i = 0; i < 20; i++) + sw.WriteLine(i + ",col1"); + sw.Flush(); + sw.Dispose(); + + MySqlBulkLoader loader = new MySqlBulkLoader(Connection); + loader.TableName = "Test"; + loader.FileName = path; + loader.Timeout = 0; + loader.FieldTerminator = ","; + loader.Local = true; + int count = loader.Load(); + Assert.That(count, Is.EqualTo(20)); + + path = Path.GetTempFileName(); + sw = new StreamWriter(new FileStream(path, FileMode.Create)); + for (int i = 0; i < 20; i++) + sw.WriteLine(i + ",col2"); + sw.Flush(); + sw.Dispose(); + + loader = new MySqlBulkLoader(Connection); + loader.TableName = "Test"; + loader.FileName = path; + loader.Timeout = 0; + loader.FieldTerminator = ","; + loader.ConflictOption = MySqlBulkLoaderConflictOption.Replace; + loader.Local = true; + loader.Load(); + + DataTable dt = Utils.FillTable("SELECT * FROM Test", Connection); + Assert.That(dt.Rows.Count, Is.EqualTo(20)); + Assert.That(dt.Rows[0][1].ToString().Trim(), Is.EqualTo("col2")); + } + + [Test] + public void BulkLoadConflictOptionIgnore() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); + + // first create the external file + string path = Path.GetTempFileName(); + StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); + for (int i = 0; i < 20; i++) + sw.WriteLine(i + ",col1"); + sw.Flush(); + sw.Dispose(); + + MySqlBulkLoader loader = new MySqlBulkLoader(Connection); + loader.TableName = "Test"; + loader.FileName = path; + loader.Timeout = 0; + loader.FieldTerminator = ","; + loader.Local = true; + int count = loader.Load(); + Assert.That(count, Is.EqualTo(20)); + + path = Path.GetTempFileName(); + sw = new StreamWriter(new FileStream(path, FileMode.Create)); + for (int i = 0; i < 20; i++) + sw.WriteLine(i + ",col2"); + sw.Flush(); + sw.Dispose(); + + loader = new MySqlBulkLoader(Connection); + loader.TableName = "Test"; + loader.FileName = path; + loader.Timeout = 0; + loader.FieldTerminator = ","; + loader.ConflictOption = MySqlBulkLoaderConflictOption.Ignore; + loader.Local = true; + loader.Load(); + + DataTable dt = Utils.FillTable("SELECT * FROM Test", Connection); + Assert.That(dt.Rows.Count, Is.EqualTo(20)); + Assert.That(dt.Rows[0][1].ToString().Trim(), Is.EqualTo("col1")); + } + + #region AsyncTests + + [Test] + public void BulkLoadSimpleAsync() + { + ExecuteSQL("CREATE TABLE BulkLoadSimpleAsyncTest (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); + string path = Path.GetTempFileName(); + StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); + for (int i = 0; i < 500; i++) + sw.WriteLine(i + "\t'Test'"); + sw.Flush(); + sw.Dispose(); + + MySqlBulkLoader loader = new MySqlBulkLoader(Connection); + loader.TableName = "BulkLoadSimpleAsyncTest"; + loader.FileName = path; + loader.Timeout = 0; + loader.Local = true; + + loader.LoadAsync().ContinueWith(loadResult => + { + int dataLoaded = loadResult.Result; + DataTable dt = Utils.FillTable("SELECT * FROM BulkLoadSimpleAsyncTest", Connection); + + Assert.That(dt.Rows.Count, Is.EqualTo(dataLoaded)); + Assert.That(dt.Rows[0][1].ToString().Trim(), Is.EqualTo("'Test'")); + }).Wait(); + } + + [Test] + public void BulkLoadReadOnlyFileAsync() + { + ExecuteSQL("CREATE TABLE BulkLoadReadOnlyFileAsyncTest (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); + + string path = Path.GetTempFileName(); + StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); + for (int i = 0; i < 500; i++) + sw.WriteLine(i + "\t'Test'"); + sw.Flush(); + sw.Dispose(); + + FileInfo fi = new FileInfo(path); + FileAttributes oldAttr = fi.Attributes; + fi.Attributes = fi.Attributes | FileAttributes.ReadOnly; + try + { + MySqlBulkLoader loader = new MySqlBulkLoader(Connection); + loader.TableName = "BulkLoadReadOnlyFileAsyncTest"; + loader.FileName = path; + loader.Timeout = 0; + loader.Local = true; + + loader.LoadAsync().ContinueWith(loadResult => + { + int dataLoaded = loadResult.Result; + + DataTable dt = Utils.FillTable("SELECT * FROM BulkLoadReadOnlyFileAsyncTest", Connection); + Assert.That(dt.Rows.Count, Is.EqualTo(dataLoaded)); + Assert.That(dt.Rows[0][1].ToString().Trim(), Is.EqualTo("'Test'")); + }).Wait(); + } + finally + { + fi.Attributes = oldAttr; + fi.Delete(); + } + } + + [Test] + public void BulkLoadFieldQuotingAsync() + { + ExecuteSQL("CREATE TABLE BulkLoadFieldQuotingAsyncTest (id INT NOT NULL, name VARCHAR(250), name2 VARCHAR(250), PRIMARY KEY(id))"); + + string path = Path.GetTempFileName(); + StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); + for (int i = 0; i < 500; i++) + sw.WriteLine(i + "\t`col1`\tcol2"); + sw.Flush(); + sw.Dispose(); + + MySqlBulkLoader loader = new MySqlBulkLoader(Connection); + loader.TableName = "BulkLoadFieldQuotingAsyncTest"; + loader.FileName = path; + loader.Timeout = 0; + loader.FieldQuotationCharacter = '`'; + loader.FieldQuotationOptional = true; + loader.Local = true; + + loader.LoadAsync().ContinueWith(loadResult => + { + int dataLoaded = loadResult.Result; + DataTable dt = Utils.FillTable("SELECT * FROM BulkLoadFieldQuotingAsyncTest", Connection); + + Assert.That(dt.Rows.Count, Is.EqualTo(dataLoaded)); + Assert.That(dt.Rows[0][1], Is.EqualTo("col1")); + Assert.That(dt.Rows[0][2].ToString().Trim(), Is.EqualTo("col2")); + }).Wait(); + } + + [Test] + public void BulkLoadEscapingAsync() + { + ExecuteSQL("CREATE TABLE BulkLoadEscapingAsyncTest (id INT NOT NULL, name VARCHAR(250), name2 VARCHAR(250), PRIMARY KEY(id))"); + + string path = Path.GetTempFileName(); + StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); + for (int i = 0; i < 500; i++) + sw.WriteLine(i + ",col1\tstill col1,col2"); + sw.Flush(); + sw.Dispose(); + + MySqlBulkLoader loader = new MySqlBulkLoader(Connection); + loader.TableName = "BulkLoadEscapingAsyncTest"; + loader.FileName = path; + loader.Timeout = 0; + loader.EscapeCharacter = '\t'; + loader.FieldTerminator = ","; + loader.Local = true; + + loader.LoadAsync().ContinueWith(loadResult => + { + int dataLoaded = loadResult.Result; + DataTable dt = Utils.FillTable("SELECT * FROM BulkLoadEscapingAsyncTest", Connection); + + Assert.That(dt.Rows.Count, Is.EqualTo(dataLoaded)); + Assert.That(dt.Rows[0][1], Is.EqualTo("col1still col1")); + Assert.That(dt.Rows[0][2].ToString().Trim(), Is.EqualTo("col2")); + }).Wait(); + } + + [Test] + public void BulkLoadConflictOptionReplaceAsync() + { + ExecuteSQL("CREATE TABLE BulkLoadConflictOptionReplaceAsyncTest (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); + + string path = Path.GetTempFileName(); + StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); + for (int i = 0; i < 20; i++) + sw.WriteLine(i + ",col1"); + sw.Flush(); + sw.Dispose(); + + MySqlBulkLoader loader = new MySqlBulkLoader(Connection); + loader.TableName = "BulkLoadConflictOptionReplaceAsyncTest"; + loader.FileName = path; + loader.Timeout = 0; + loader.FieldTerminator = ","; + loader.Local = true; + + loader.LoadAsync().Wait(); + + path = Path.GetTempFileName(); + sw = new StreamWriter(new FileStream(path, FileMode.Create)); + for (int i = 0; i < 20; i++) + sw.WriteLine(i + ",col2"); + sw.Flush(); + sw.Dispose(); + + loader = new MySqlBulkLoader(Connection); + loader.TableName = "BulkLoadConflictOptionReplaceAsyncTest"; + loader.FileName = path; + loader.Timeout = 0; + loader.FieldTerminator = ","; + loader.ConflictOption = MySqlBulkLoaderConflictOption.Replace; + loader.Local = true; + + loader.LoadAsync().Wait(); + DataTable dt = Utils.FillTable("SELECT * FROM BulkLoadConflictOptionReplaceAsyncTest", Connection); + Assert.That(dt.Rows.Count, Is.EqualTo(20)); + Assert.That(dt.Rows[0][1].ToString().Trim(), Is.EqualTo("col2")); + } + + [Test] + public void BulkLoadConflictOptionIgnoreAsync() + { + ExecuteSQL("CREATE TABLE BulkLoadConflictOptionIgnoreAsyncTest (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); + + string path = Path.GetTempFileName(); + StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); + for (int i = 0; i < 20; i++) + sw.WriteLine(i + ",col1"); + sw.Flush(); + sw.Dispose(); + + MySqlBulkLoader loader = new MySqlBulkLoader(Connection); + loader.TableName = "BulkLoadConflictOptionIgnoreAsyncTest"; + loader.FileName = path; + loader.Timeout = 0; + loader.FieldTerminator = ","; + loader.Local = true; + + loader.LoadAsync().ContinueWith(loadResult => + { + int dataLoaded = loadResult.Result; + path = Path.GetTempFileName(); + sw = new StreamWriter(new FileStream(path, FileMode.Create)); + for (int i = 0; i < dataLoaded; i++) + sw.WriteLine(i + ",col2"); + sw.Flush(); + sw.Dispose(); + }).Wait(); + + loader = new MySqlBulkLoader(Connection); + loader.TableName = "BulkLoadConflictOptionIgnoreAsyncTest"; + loader.FileName = path; + loader.Timeout = 0; + loader.FieldTerminator = ","; + loader.ConflictOption = MySqlBulkLoaderConflictOption.Ignore; + loader.Local = true; + + loader.LoadAsync().ContinueWith(loadResult => + { + int dataLoaded = loadResult.Result; + DataTable dt = Utils.FillTable("SELECT * FROM BulkLoadConflictOptionIgnoreAsyncTest", Connection); + Assert.That(dt.Rows.Count, Is.EqualTo(20)); + Assert.That(dt.Rows[0][1].ToString().Trim(), Is.EqualTo("col1")); + }).Wait(); + } + + [Test] + public void BulkLoadColumnOrderAsync() + { + ExecuteSQL(@"CREATE TABLE BulkLoadColumnOrderAsyncTest (id INT NOT NULL, n1 VARCHAR(250), n2 VARCHAR(250), n3 VARCHAR(250), PRIMARY KEY(id))"); + + string path = Path.GetTempFileName(); + StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); + for (int i = 0; i < 20; i++) + sw.WriteLine(i + ",col3,col2,col1"); + sw.Flush(); + sw.Dispose(); + + MySqlBulkLoader loader = new MySqlBulkLoader(Connection); + loader.TableName = "BulkLoadColumnOrderAsyncTest"; + loader.FileName = path; + loader.Timeout = 0; + loader.FieldTerminator = ","; + loader.LineTerminator = Environment.NewLine; + loader.Columns.Add("id"); + loader.Columns.Add("n3"); + loader.Columns.Add("n2"); + loader.Columns.Add("n1"); + loader.Local = true; + + loader.LoadAsync().ContinueWith(loadResult => + { + int dataLoaded = loadResult.Result; + DataTable dt = Utils.FillTable("SELECT * FROM BulkLoadColumnOrderAsyncTest", Connection); + Assert.That(dt.Rows.Count, Is.EqualTo(20)); + Assert.That(dt.Rows[0][1], Is.EqualTo("col1")); + Assert.That(dt.Rows[0][2], Is.EqualTo("col2")); + Assert.That(dt.Rows[0][3].ToString().Trim(), Is.EqualTo("col3")); + }).Wait(); + } + #endregion + + private string GetElapsedTime(System.Diagnostics.Stopwatch Timer) + { + TimeSpan timeElapsed = Timer.Elapsed; + return string.Format("{0}:{1}:{2}.{3} (HH:MM:SS.MS)", timeElapsed.Hours, timeElapsed.Minutes, timeElapsed.Seconds, timeElapsed.Milliseconds); + } + + [Test] + public void BulkLoadColumnOrder() + { + ExecuteSQL(@"CREATE TABLE Test (id INT NOT NULL, n1 VARCHAR(250), n2 VARCHAR(250), + n3 VARCHAR(250), PRIMARY KEY(id))"); + + // first create the external file + string path = Path.GetTempFileName(); + StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); + for (int i = 0; i < 20; i++) + sw.WriteLine(i + ",col3,col2,col1"); + sw.Flush(); + sw.Dispose(); + + MySqlBulkLoader loader = new MySqlBulkLoader(Connection); + loader.TableName = "Test"; + loader.FileName = path; + loader.Timeout = 0; + loader.FieldTerminator = ","; + loader.LineTerminator = Environment.NewLine; + loader.Columns.Add("id"); + loader.Columns.Add("n3"); + loader.Columns.Add("n2"); + loader.Columns.Add("n1"); + loader.Local = true; + int count = loader.Load(); + Assert.That(count, Is.EqualTo(20)); + + DataTable dt = Utils.FillTable("SELECT * FROM Test", Connection); + Assert.That(dt.Rows.Count, Is.EqualTo(20)); + Assert.That(dt.Rows[0][1], Is.EqualTo("col1")); + Assert.That(dt.Rows[0][2], Is.EqualTo("col2")); + Assert.That(dt.Rows[0][3].ToString().Trim(), Is.EqualTo("col3")); + } + + /// + /// WL14093 - Add option to specify LOAD DATA LOCAL white list folder + /// + [TestCase(true, "", true)] + [TestCase(true, " ", true)] + [TestCase(true, null, true)] + [TestCase(true, "tmp/data/", true)] + [TestCase(false, "", false)] + [TestCase(false, " ", false)] + [TestCase(false, null, false)] + [TestCase(false, "otherPath/", false)] + [TestCase(false, "tmp/", true)] + [TestCase(false, "c:/SymLink/", false)] // symbolic link + public void BulkLoadUsingSafePath(bool allowLoadLocalInfile, string allowLoadLocalInfileInPath, bool shouldPass) + { + DirectoryInfo info; + bool isSymLink = false; + + if (!string.IsNullOrWhiteSpace(allowLoadLocalInfileInPath)) + { + info = new DirectoryInfo(allowLoadLocalInfileInPath); + isSymLink = info.Attributes.HasFlag(FileAttributes.ReparsePoint); + } + + Connection.Settings.AllowLoadLocalInfile = allowLoadLocalInfile; + Connection.Settings.AllowLoadLocalInfileInPath = allowLoadLocalInfileInPath; + + ExecuteSQL(string.Format("CREATE TABLE `{0}`.Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))", Connection.Database), true); + + // create the external file to be uploaded + string path = Path.GetTempFileName(); + StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); + for (int i = 0; i < 200; i++) + sw.WriteLine(i + "\t'Test'"); + sw.Flush(); + sw.Dispose(); + + // create another path to test against unsafe directory + Directory.CreateDirectory("otherPath"); + + // copy the external file to our safe path + Directory.CreateDirectory("tmp/data"); + if (!File.Exists("tmp/data/file.tmp")) + File.Copy(path, "tmp/data/file.tmp"); + + string filePath = allowLoadLocalInfile ? path : Path.GetFullPath("tmp/data/file.tmp"); + + MySqlBulkLoader loader = new MySqlBulkLoader(Connection) + { + TableName = "Test", + FileName = filePath, + Timeout = 0, + Local = true + }; + + if (shouldPass) + { + int count = loader.Load(); + Assert.That(count, Is.EqualTo(200)); + + DataTable dt = Utils.FillTable("SELECT * FROM Test", Connection); + Assert.That(dt.Rows.Count, Is.EqualTo(200)); + Assert.That(dt.Rows[0][1].ToString().Trim(), Is.EqualTo("'Test'")); + } + else if (isSymLink && !Directory.Exists(allowLoadLocalInfileInPath)) + Assert.Ignore("For the symbolic link test to run, it should be manually created before executing it."); + else + { + var ex = Assert.Throws(() => loader.Load()); + if (allowLoadLocalInfileInPath == " " || allowLoadLocalInfileInPath is null) + if (Version > new Version(8, 0)) + Assert.That(ex.Message, Is.EqualTo("Loading local data is disabled; this must be enabled on both the client and server sides")); + else + Assert.That(ex.Message, Is.EqualTo("The used command is not allowed with this MySQL version")); + else + Assert.That(ex.Message, Does.Contain("allowloadlocalinfileinpath")); + } + + File.Delete(path); + Directory.Delete("tmp", true); + Directory.Delete("otherPath"); + } + + [Test, Description("MySQL Bulk Loader ran with Automation")] + public void InsertFilesInDatabase() + { + var cPath = Assembly.GetExecutingAssembly().Location.Replace(String.Format("{0}.dll", + Assembly.GetExecutingAssembly().GetName().Name), string.Empty); + string imageFile = cPath + "image1.jpg"; + var fs = new FileStream(imageFile, FileMode.Open, FileAccess.Read); + long fileSize = fs.Length; + byte[] rawData = new byte[fs.Length]; + fs.Read(rawData, 0, (int)fs.Length); + fs.Close(); + + using (var conn = new MySqlConnection(Connection.ConnectionString)) + { + var cmd = new MySqlCommand(); + conn.Open(); + cmd.Connection = conn; + cmd.CommandText = "DROP TABLE IF EXISTS file"; + cmd.ExecuteNonQuery(); + cmd.CommandText = " CREATE TABLE file(file_id SMALLINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY," + + "file_name VARCHAR(64) NOT NULL, file_size MEDIUMINT UNSIGNED NOT NULL,file MEDIUMBLOB NOT NULL);"; + cmd.ExecuteNonQuery(); + cmd.CommandText = "INSERT INTO file VALUES(NULL, @FileName, @FileSize, @File)"; + cmd.Parameters.AddWithValue("@FileName", "image1.jpg"); + cmd.Parameters.AddWithValue("@FileSize", fileSize); + cmd.Parameters.AddWithValue("@File", rawData); + var result = cmd.ExecuteNonQuery(); + Assert.That(result, Is.Not.Null); + cmd.CommandText = "select count(*) from file;"; + var count = cmd.ExecuteScalar(); + Assert.That(count, Is.EqualTo(1)); + } + } + + /// + /// Bug21049228 [SUPPORT TO USE (MEMORY-)STREAM FOR BULK LOADING DATA] + /// + [Test] + public void BulkLoadStream() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); + + // create the sream to be loaded + using MemoryStream stream = new MemoryStream(); + using StreamWriter sw = new StreamWriter(stream); + + for (int i = 0; i < 200; i++) + sw.WriteLine(i + "\t'Test'"); + sw.Flush(); + + MySqlBulkLoader loader = new MySqlBulkLoader(Connection); + loader.TableName = "Test"; + loader.Timeout = 0; + loader.Local = true; + int count = loader.Load(stream); + Assert.That(count, Is.EqualTo(200)); + + DataTable dt = Utils.FillTable("SELECT * FROM Test", Connection); + Assert.That(dt.Rows.Count, Is.EqualTo(200)); + Assert.That(dt.Rows[0][1].ToString().Trim(), Is.EqualTo("'Test'")); + } + + [Test] + public void BulkLoadStream2() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); + + // create the sream to be loaded + using MemoryStream stream = new MemoryStream(); + using StreamWriter sw = new StreamWriter(stream); + + for (int i = 0; i < 100; i++) + sw.Write("aaa" + i + ",'Test' xxx"); + for (int i = 100; i < 200; i++) + sw.Write("bbb" + i + ",'Test' xxx"); + for (int i = 200; i < 300; i++) + sw.Write("aaa" + i + ",'Test' xxx"); + for (int i = 300; i < 400; i++) + sw.Write("bbb" + i + ",'Test' xxx"); + sw.Flush(); + + MySqlBulkLoader loader = new MySqlBulkLoader(Connection); + loader.TableName = "Test"; + loader.Timeout = 0; + loader.FieldTerminator = ","; + loader.LineTerminator = "xxx"; + loader.LinePrefix = "bbb"; + loader.Local = true; + int count = loader.Load(stream); + Assert.That(count, Is.EqualTo(200)); + + using MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM Test", Connection); + Assert.That(Convert.ToInt32(cmd.ExecuteScalar()), Is.EqualTo(200)); + } + + [Test] + public void BulkLoadStreamColumnOrder() + { + ExecuteSQL(@"CREATE TABLE Test (id INT NOT NULL, n1 VARCHAR(250), n2 VARCHAR(250), + n3 VARCHAR(250), PRIMARY KEY(id))"); + + // create the sream to be loaded + using MemoryStream stream = new MemoryStream(); + using StreamWriter sw = new StreamWriter(stream); + for (int i = 0; i < 20; i++) + sw.WriteLine(i + ",col3,col2,col1"); + sw.Flush(); + + MySqlBulkLoader loader = new MySqlBulkLoader(Connection); + loader.TableName = "Test"; + loader.Timeout = 0; + loader.FieldTerminator = ","; + loader.LineTerminator = Environment.NewLine; + loader.Columns.Add("id"); + loader.Columns.Add("n3"); + loader.Columns.Add("n2"); + loader.Columns.Add("n1"); + loader.Local = true; + int count = loader.Load(stream); + Assert.That(count, Is.EqualTo(20)); + + DataTable dt = Utils.FillTable("SELECT * FROM Test", Connection); + Assert.That(dt.Rows.Count, Is.EqualTo(20)); + Assert.That(dt.Rows[0][1], Is.EqualTo("col1")); + Assert.That(dt.Rows[0][2], Is.EqualTo("col2")); + Assert.That(dt.Rows[0][3].ToString().Trim(), Is.EqualTo("col3")); + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/MySqlDataReaderTests.cs b/MySQL.Data/tests/MySql.Data.Tests/MySqlDataReaderTests.cs new file mode 100644 index 000000000..ec1ca03ed --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/MySqlDataReaderTests.cs @@ -0,0 +1,847 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Data; +using System.Data.SqlTypes; +using System.IO; +using System.Text; + +namespace MySql.Data.MySqlClient.Tests +{ + public partial class MySqlDataReaderTests : TestBase + { + protected override void Cleanup() + { + ExecuteSQL(String.Format("DROP TABLE IF EXISTS `{0}`.Test", Connection.Database)); + } + + private void CreateDefaultTable() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), d DATE, dt DATETIME, b1 LONGBLOB, PRIMARY KEY(id))"); + } + + [Test] + public void TestMultipleResultsets() + { + CreateDefaultTable(); + + MySqlCommand cmd = new MySqlCommand("", Connection); + // insert 100 records + cmd.CommandText = "INSERT INTO Test (id,name) VALUES (?id, 'test')"; + cmd.Parameters.Add(new MySqlParameter("?id", 1)); + for (int i = 1; i <= 100; i++) + { + cmd.Parameters[0].Value = i; + cmd.ExecuteNonQuery(); + } + + // execute it one time + cmd = new MySqlCommand("SELECT id FROM Test WHERE id<50; SELECT * FROM Test WHERE id >= 50;", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader, Is.Not.Null); + Assert.That(reader.HasRows); + Assert.That(reader.Read()); + Assert.That(reader.FieldCount, Is.EqualTo(1)); + Assert.That(reader.NextResult()); + Assert.That(reader.HasRows); + Assert.That(reader.FieldCount, Is.EqualTo(5)); + } + + // now do it again + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader, Is.Not.Null); + Assert.That(reader.HasRows); + Assert.That(reader.Read()); + Assert.That(reader.FieldCount, Is.EqualTo(1)); + Assert.That(reader.NextResult()); + Assert.That(reader.HasRows); + Assert.That(reader.FieldCount, Is.EqualTo(5)); + } + } + + [Test] + public void GetBytes() + { + CreateDefaultTable(); + int len = 50000; + byte[] bytes = Utils.CreateBlob(len); + MySqlCommand cmd = new MySqlCommand( + "INSERT INTO Test (id, name, b1) VALUES(1, 'Test', ?b1)", Connection); + cmd.Parameters.AddWithValue("?b1", bytes); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM Test"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + + long sizeBytes = reader.GetBytes(4, 0, null, 0, 0); + Assert.That(sizeBytes, Is.EqualTo(len)); + + byte[] buff1 = new byte[len / 2]; + byte[] buff2 = new byte[len - (len / 2)]; + long buff1cnt = reader.GetBytes(4, 0, buff1, 0, len / 2); + long buff2cnt = reader.GetBytes(4, buff1cnt, buff2, 0, buff2.Length); + Assert.That(buff1cnt, Is.EqualTo(buff1.Length)); + Assert.That(buff2cnt, Is.EqualTo(buff2.Length)); + + for (int i = 0; i < buff1.Length; i++) + Assert.That(buff1[i], Is.EqualTo(bytes[i])); + + for (int i = 0; i < buff2.Length; i++) + Assert.That(buff2[i], Is.EqualTo(bytes[buff1.Length + i])); + } + + // now check with sequential access + using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)) + { + Assert.That(reader.Read()); + int mylen = len; + byte[] buff = new byte[8192]; + int startIndex = 0; + while (mylen > 0) + { + int readLen = Math.Min(mylen, buff.Length); + int retVal = (int)reader.GetBytes(4, startIndex, buff, 0, readLen); + Assert.That(retVal, Is.EqualTo(readLen)); + for (int i = 0; i < readLen; i++) + Assert.That(buff[i], Is.EqualTo(bytes[startIndex + i])); + startIndex += readLen; + mylen -= readLen; + } + } + } + + [Test] + public void TestSingleResultSetBehavior() + { + CreateDefaultTable(); + ExecuteSQL("INSERT INTO Test (id, name, b1) VALUES (1, 'Test1', NULL)"); + ExecuteSQL("INSERT INTO Test (id, name, b1) VALUES (2, 'Test1', NULL)"); + + MySqlCommand cmd = new MySqlCommand( + "SELECT * FROM Test WHERE id=1; SELECT * FROM Test WHERE id=2", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleResult)) + { + bool result = reader.Read(); + Assert.That(result); + + result = reader.NextResult(); + Assert.That(result, Is.False); + } + } + + /// + /// Bug #59989 MysqlDataReader.GetSchemaTable returns incorrect Values an types + /// + [Test] + public void GetSchema() + { + string sql = @"CREATE TABLE test2(id INT UNSIGNED AUTO_INCREMENT + NOT NULL, name VARCHAR(255) NOT NULL, name2 VARCHAR(40), fl FLOAT, + dt DATETIME, `udec` DECIMAL(20,6) unsigned, + `dec` DECIMAL(44,3), bt boolean, PRIMARY KEY(id))"; + + ExecuteSQL(sql); + ExecuteSQL("INSERT INTO test2 VALUES(1,'Test', 'Test', 1.0, now(), 20.0, 12.324, True)"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM test2", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + DataTable dt = reader.GetSchemaTable(); + Assert.That(true == (Boolean)dt.Rows[0]["IsAutoIncrement"], "Checking auto increment"); + Assert.That((bool)dt.Rows[0]["IsUnique"], Is.False, "Checking IsUnique"); + Assert.That((bool)dt.Rows[0]["IsKey"]); + Assert.That(false == (Boolean)dt.Rows[0]["AllowDBNull"], "Checking AllowDBNull"); + Assert.That(false == (Boolean)dt.Rows[1]["AllowDBNull"], "Checking AllowDBNull"); + Assert.That(dt.Rows[1]["ColumnSize"], Is.EqualTo(255)); + Assert.That(dt.Rows[2]["ColumnSize"], Is.EqualTo(40)); + + // udec column + Assert.That(dt.Rows[5]["ColumnSize"], Is.EqualTo(21)); + Assert.That(dt.Rows[5]["NumericPrecision"], Is.EqualTo(20)); + Assert.That(dt.Rows[5]["NumericScale"], Is.EqualTo(6)); + + // dec column + Assert.That(dt.Rows[6]["ColumnSize"], Is.EqualTo(46)); + Assert.That(dt.Rows[6]["NumericPrecision"], Is.EqualTo(44)); + Assert.That(dt.Rows[6]["NumericScale"], Is.EqualTo(3)); + } + } + + [Test] + public void CloseConnectionBehavior() + { + CreateDefaultTable(); + ExecuteSQL("INSERT INTO Test(id,name) VALUES(1,'test')"); + + using (MySqlConnection c2 = new MySqlConnection(Connection.ConnectionString)) + { + c2.Open(); + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", c2); + using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)) + { + Assert.That(reader.Read()); + reader.Close(); + Assert.That(c2.State == ConnectionState.Closed); + } + } + } + + [Test] + public void SingleRowBehavior() + { + CreateDefaultTable(); + ExecuteSQL("INSERT INTO Test(id,name) VALUES(1,'test1')"); + ExecuteSQL("INSERT INTO Test(id,name) VALUES(2,'test2')"); + ExecuteSQL("INSERT INTO Test(id,name) VALUES(3,'test3')"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) + { + Assert.That(reader.Read(), "First read"); + Assert.That(reader.Read(), Is.False, "Second read"); + Assert.That(reader.NextResult(), Is.False, "Trying NextResult"); + } + + cmd.CommandText = "SELECT * FROM Test where id=1"; + using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) + { + Assert.That(reader.Read()); + Assert.That(reader.GetString(1), Is.EqualTo("test1")); + Assert.That(reader.Read(), Is.False); + Assert.That(reader.NextResult(), Is.False); + } + } + + [Test] + public void SingleRowBehaviorWithLimit() + { + CreateDefaultTable(); + ExecuteSQL("INSERT INTO Test(id,name) VALUES(1,'test1')"); + ExecuteSQL("INSERT INTO Test(id,name) VALUES(2,'test2')"); + ExecuteSQL("INSERT INTO Test(id,name) VALUES(3,'test3')"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test LIMIT 2", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) + { + Assert.That(reader.Read(), "First read"); + Assert.That(reader.Read(), Is.False, "Second read"); + Assert.That(reader.NextResult(), Is.False, "Trying NextResult"); + } + + using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) + { + Assert.That(reader.Read(), "First read"); + Assert.That(reader.Read(), Is.False, "Second read"); + Assert.That(reader.NextResult(), Is.False, "Trying NextResult"); + } + + using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) + { + Assert.That(reader.Read(), "First read"); + Assert.That(reader.Read(), Is.False, "Second read"); + Assert.That(reader.NextResult(), Is.False, "Trying NextResult"); + } + } + + [Test] + public void SimpleSingleRow() + { + CreateDefaultTable(); + ExecuteSQL("INSERT INTO Test(id,name) VALUES(1,'test1')"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read(), "First read"); + Assert.That(reader.GetInt32(0), Is.EqualTo(1)); + Assert.That(reader.GetString(1), Is.EqualTo("test1")); + Assert.That(reader.Read(), Is.False, "Second read"); + Assert.That(reader.NextResult(), Is.False, "Trying NextResult"); + } + } + + [Test] + public void ConsecutiveNulls() + { + CreateDefaultTable(); + ExecuteSQL("INSERT INTO Test (id, name, dt) VALUES (1, 'Test', NULL)"); + ExecuteSQL("INSERT INTO Test (id, name, dt) VALUES (2, NULL, now())"); + ExecuteSQL("INSERT INTO Test (id, name, dt) VALUES (3, 'Test2', NULL)"); + + MySqlCommand cmd = new MySqlCommand("SELECT id, name, dt FROM Test", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetValue(0), Is.EqualTo(1)); + Assert.That(reader.GetValue(1), Is.EqualTo("Test")); + Assert.That(reader.GetString(1), Is.EqualTo("Test")); + Assert.That(reader.GetValue(2), Is.EqualTo(DBNull.Value)); + reader.Read(); + Assert.That(reader.GetValue(0), Is.EqualTo(2)); + Assert.That(reader.GetValue(1), Is.EqualTo(DBNull.Value)); + Exception ex = Assert.Throws(() => reader.GetString(1)); + Assert.That(ex.Message, Is.EqualTo("Data is Null. This method or property cannot be called on Null values.")); + Assert.That(reader.IsDBNull(2), Is.False); + reader.Read(); + Assert.That(reader.GetValue(0), Is.EqualTo(3)); + Assert.That(reader.GetValue(1), Is.EqualTo("Test2")); + Assert.That(reader.GetString(1), Is.EqualTo("Test2")); + Assert.That(reader.GetValue(2), Is.EqualTo(DBNull.Value)); + ex = Assert.Throws(() => reader.GetMySqlDateTime(2)); + Assert.That(ex.Message, Is.EqualTo("Data is Null. This method or property cannot be called on Null values.")); + Assert.That(reader.Read(), Is.False); + Assert.That(reader.NextResult(), Is.False); + } + } + + [Test] + public void HungDataReader() + { + MySqlCommand cmd = new MySqlCommand("USE `" + Connection.Database + "`; SHOW TABLES", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + reader.GetString(0); + } + } + } + + /// + /// Added test for IsDBNull from bug# 7399 + /// + [Test] + public void SequentialAccessBehavior() + { + CreateDefaultTable(); + ExecuteSQL("INSERT INTO Test(id,name) VALUES(1,'test1')"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)) + { + Assert.That(reader.Read()); + Assert.That(reader.IsDBNull(0), Is.False); + int i = reader.GetInt32(0); + string s = reader.GetString(1); + Assert.That(i, Is.EqualTo(1)); + Assert.That(s, Is.EqualTo("test1")); + + // this next line should throw an exception + Exception ex = Assert.Throws(() => i = reader.GetInt32(0)); + Assert.That(ex.Message, Is.EqualTo("Invalid attempt to read a prior column using SequentialAccess")); + } + } + + + [Test] + public void ReadingTextFields() + { + ExecuteSQL("CREATE TABLE Test (id int, t1 TEXT)"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'Text value')"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + string s = reader["t1"].ToString(); + Assert.That(s, Is.EqualTo("Text value")); + } + } + + [Test] + public void ReadingFieldsBeforeRead() + { + CreateDefaultTable(); + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + try + { + reader.GetInt32(0); + } + catch (MySqlException) + { + } + } + } + + [Test] + public void GetChar() + { + CreateDefaultTable(); + ExecuteSQL("INSERT INTO Test (id, name) VALUES (1, 'a')"); + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + char achar = reader.GetChar(1); + Assert.That(achar, Is.EqualTo('a')); + } + } + + [Test] + public void ReaderOnNonQuery() + { + CreateDefaultTable(); + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id,name) VALUES (1,'Test')", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read(), Is.False); + reader.Close(); + + cmd.CommandText = "SELECT name FROM Test"; + object v = cmd.ExecuteScalar(); + Assert.That(v, Is.EqualTo("Test")); + } + } + + [Test] + public void TestManyDifferentResultsets() + { + CreateDefaultTable(); + MySqlCommand cmd = new MySqlCommand("", Connection); + // insert 100 records + cmd.CommandText = "INSERT INTO Test (id,name,dt,b1) VALUES (?id, 'test','2004-12-05 12:57:00','long blob data')"; + cmd.Parameters.Add(new MySqlParameter("?id", 1)); + for (int i = 1; i <= 100; i++) + { + cmd.Parameters[0].Value = i; + cmd.ExecuteNonQuery(); + } + + cmd = new MySqlCommand("SELECT id FROM Test WHERE id= ?param1; " + + "SELECT id, dt, b1 FROM Test WHERE id = -50; " + + "SELECT b1 FROM Test WHERE id = -50; " + + "SELECT id, dt, b1 FROM Test WHERE id < ?param1; " + + "SELECT b1 FROM Test WHERE id >= ?param1;", Connection); + + cmd.Parameters.AddWithValue("?param1", 50); + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + //First ResultSet, should have 49 rows. + //SELECT id FROM Test WHERE id= ?param1; + Assert.That(reader.NextResult()); + Assert.That(reader.HasRows); + Assert.That(reader.FieldCount, Is.EqualTo(5)); + for (int i = 0; i < 51; i++) + { + Assert.That(reader.Read()); + } + Assert.That(reader.Read(), Is.False); + + + //Fourth ResultSet, should have no rows. + //SELECT id, dt, b1 FROM Test WHERE id = -50; + Assert.That(reader.NextResult()); + Assert.That(reader.HasRows, Is.False); + Assert.That(reader.FieldCount, Is.EqualTo(3)); //Will Fail if uncommented expected 3 returned 5 + Assert.That(reader.Read(), Is.False); + + //Fifth ResultSet, should have no rows. + //SELECT b1 FROM Test WHERE id = -50; + Assert.That(reader.NextResult()); + Assert.That(reader.HasRows, Is.False); + Assert.That(reader.FieldCount, Is.EqualTo(1)); //Will Fail if uncommented expected 1 returned 5 + Assert.That(reader.Read(), Is.False); + + //Sixth ResultSet, should have 49 rows. + //SELECT id, dt, b1 FROM Test WHERE id < ?param1; + Assert.That(reader.NextResult()); + Assert.That(reader.HasRows); + Assert.That(reader.FieldCount, Is.EqualTo(3)); //Will Fail if uncommented expected 3 returned 5 + for (int i = 0; i < 49; i++) + { + Assert.That(reader.Read()); + } + Assert.That(reader.Read(), Is.False); + + //Seventh ResultSet, should have 51 rows. + //SELECT b1 FROM Test WHERE id >= ?param1; + Assert.That(reader.NextResult()); + Assert.That(reader.HasRows); + Assert.That(reader.FieldCount, Is.EqualTo(1)); //Will Fail if uncommented expected 1 returned 5 + for (int i = 0; i < 51; i++) + { + Assert.That(reader.Read()); + } + Assert.That(reader.Read(), Is.False); + } + } + + + [Test] + public void TestMultipleResultsWithQueryCacheOn() + { + //query_cache_type was deprecated in server 5.7.20. + if (Connection.driver.Version.isAtLeast(5, 7, 20)) return; + + CreateDefaultTable(); + ExecuteSQL("SET SESSION query_cache_type = ON"); + ExecuteSQL("INSERT INTO Test (id,name) VALUES (1, 'Test')"); + ExecuteSQL("INSERT INTO Test (id,name) VALUES (51, 'Test')"); + + // execute it one time + MySqlCommand cmd = new MySqlCommand("SELECT id FROM Test WHERE id<50; SELECT * FROM Test WHERE id >= 50;", Connection); + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader, Is.Not.Null); + Assert.That(reader.HasRows); + Assert.That(reader.Read()); + Assert.That(reader.FieldCount, Is.EqualTo(1)); + Assert.That(reader.NextResult()); + Assert.That(reader.HasRows); + Assert.That(reader.FieldCount, Is.EqualTo(5)); + } + + // now do it again + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader, Is.Not.Null); + Assert.That(reader.HasRows); + Assert.That(reader.Read()); + Assert.That(reader.FieldCount, Is.EqualTo(1)); + Assert.That(reader.NextResult()); + Assert.That(reader.HasRows); + Assert.That(reader.FieldCount, Is.EqualTo(5)); + } + } + + /// + /// Bug #9237 MySqlDataReader.AffectedRecords not set to -1 + /// + [Test] + public void AffectedRows() + { + MySqlCommand cmd = new MySqlCommand("SHOW TABLES", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + reader.Close(); + Assert.That(reader.RecordsAffected, Is.EqualTo(-1)); + } + } + + /// + /// Bug #11873 Invalid timestamp in query produces incorrect reader exception + /// + [Test] + public void InvalidTimestamp() + { + ExecuteSQL("CREATE TABLE Test (tm TIMESTAMP)"); + ExecuteSQL("INSERT INTO Test VALUES (NULL)"); + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test WHERE tm = '7/1/2005 12:00:00 AM'", Connection); + MySqlDataReader reader; + + if (Connection.driver.Version.isAtLeast(8, 0, 16)) + Assert.Throws(() => reader = cmd.ExecuteReader()); + else + { + Assert.That(reader = cmd.ExecuteReader(), Is.Empty); + reader.Close(); + } + } + + /// + /// Bug #19294 IDataRecord.GetString method should return null for null values + /// + [Test] + public void GetStringOnNull() + { + // TODO enable this test when xunit Nuget package is fixed + // Reference: https://github.com/xunit/xunit/issues/1585 + if (Platform.IsMacOSX()) return; + + ExecuteSQL("CREATE TABLE Test (id int, PRIMARY KEY(id))"); + MySqlCommand cmd = new MySqlCommand( + String.Format("SHOW INDEX FROM Test FROM `{0}`", Connection.Database), Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.Throws(() => reader.GetString(reader.GetOrdinal("Sub_part"))); + } + } + + /// + /// Bug #23538 Exception thrown when GetSchemaTable is called and "fields" is null. + /// + [Test] + public void GetSchemaTableOnEmptyResultset() + { + ExecuteSQL("CREATE PROCEDURE spTest() BEGIN END"); + + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.CommandType = CommandType.StoredProcedure; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + DataTable dt = reader.GetSchemaTable(); + Assert.That(dt, Is.Null); + } + } + + /// + /// Bug #24765 Retrieving empty fields results in check for isDBNull + /// + [Test] + public void IsDbNullOnNonNullFields() + { + CreateDefaultTable(); + ExecuteSQL("INSERT INTO Test (id, name) VALUES (1, '')"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.IsDBNull(1), Is.False); + } + } + + /// + /// Bug #30204 Incorrect ConstraintException + /// + [Test] + public void ConstraintWithLoadingReader() + { + ExecuteSQL(@"CREATE TABLE Test (ID_A int(11) NOT NULL, + ID_B int(11) NOT NULL, PRIMARY KEY (ID_A,ID_B) + ) ENGINE=MyISAM DEFAULT CHARSET=latin1;"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", Connection); + DataTable dt = new DataTable(); + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + dt.Load(reader); + } + + DataRow row = dt.NewRow(); + row["ID_A"] = 2; + row["ID_B"] = 3; + dt.Rows.Add(row); + + row = dt.NewRow(); + row["ID_A"] = 2; + row["ID_B"] = 4; + dt.Rows.Add(row); + } + + [Test] + public void CloseConnectionBehavior2() + { + CreateDefaultTable(); + ExecuteSQL("INSERT INTO Test(id,name) VALUES(1,'test')"); + + using (MySqlConnection c2 = new MySqlConnection(Connection.ConnectionString)) + { + c2.Open(); + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", c2); + using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)) + { + Assert.That(reader.Read()); + } + } + } + + /// + /// Test that using command behavior SchemaOnly does not hose the st.connection + /// by leaving SQL_SELECT_LIMIT set to 0 after the error (and in normal + /// case too) + /// + /// Bug#30518 + /// + [Test] + public void CommandBehaviorSchemaOnly() + { + + MySqlCommand cmd = new MySqlCommand("select * from doesnotexist", Connection); + MySqlDataReader reader; + Exception ex = Assert.Throws(() => reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly)); + Assert.That(ex.Message, Does.Contain(".doesnotexist' doesn't exist")); + + // Check that failed ExecuteReader did not leave SQL_SELECT_LIMIT + // set to 0. + cmd.CommandText = "select now()"; + reader = cmd.ExecuteReader(); + Assert.That(reader.Read()); + reader.Close(); + + + // Check that CommandBehavior.SchemaOnly does not return rows + reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly); + Assert.That(reader.Read(), Is.False); + reader.Close(); + + + reader = cmd.ExecuteReader(); + // Check that prior setting of CommandBehavior did not + // leave SQL_SELECT_LIMIT set to 0 + Assert.That(reader.Read()); + reader.Close(); + } + + /// + /// Bug #37239 MySqlReader GetOrdinal performance changes break existing functionality + /// + [Test] + public void ColumnsWithSameName() + { + CreateDefaultTable(); + ExecuteSQL("INSERT INTO Test (id, name) VALUES (1, 'test')"); + + MySqlCommand cmd = new MySqlCommand("SELECT a.name, a.name FROM Test a", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + string name1 = reader.GetString(0); + string name2 = reader.GetString(1); + Assert.That(name2, Is.EqualTo(name1)); + Assert.That(name1, Is.EqualTo("test")); + } + + cmd.CommandText = "SELECT 'a' AS XYZ, 'b' as Xyz"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + string name1 = reader.GetString(0); + string name2 = reader.GetString(1); + } + } + + /// + /// Bug #47467 Two simple changes for DataReader + /// + [Test] + public void Bug47467() + { + MySqlCommand cmd = new MySqlCommand("SELECT 1 as c1", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Type t = reader.GetFieldType("c1"); + Exception ex = Assert.Throws(() => reader.GetOrdinal("nocol")); + Assert.That(ex.Message.IndexOf("nocol") != -1); + } + } + + /// + /// Bug #28980953 - MYSQLDATAREADER.GETSTREAM THROWS INDEXOUTOFRANGEEXCEPTION + /// The implementation of GetStream method was missing, hence the exception. + /// + [Test] + public void GetStream() + { + ExecuteSQL("CREATE TABLE Test (data BLOB)"); + + string str = "randomText_12345"; + byte[] val = UTF8Encoding.UTF8.GetBytes(str); + + using (var command = new MySqlCommand(@"INSERT INTO Test VALUES(@data);", Connection)) + { + command.Parameters.AddWithValue("@data", val); + command.ExecuteNonQuery(); + } + + using (var command = new MySqlCommand(@"SELECT data FROM Test", Connection)) + using (var reader = command.ExecuteReader()) + { + reader.Read(); + using (var stream = reader.GetStream(0)) + { + string result = UTF8Encoding.UTF8.GetString(((MemoryStream)stream).ToArray()); + Assert.That(result, Is.EqualTo(str).IgnoreCase); + } + } + } + + /// + /// Bug #33781449 - MySqlDataReader.GetFieldValue throws InvalidCastException + /// Added the handling for Stream type. + /// + [Test] + public void GetFieldValue() + { + ExecuteSQL(@"CREATE TABLE Test (intCol INT, decimalCol DECIMAL(5,2), textCol VARCHAR(10), dateCol DATETIME, boolCol TINYINT(1), blobCol BLOB)"); + + string str = "randomText_12345"; + byte[] blob = Encoding.UTF8.GetBytes(str); + DateTime dateTime = DateTime.Now; + + using (var command = new MySqlCommand(@"INSERT INTO Test VALUES(@int, @decimal, @text, @date, @bit, @blob);", Connection)) + { + command.Parameters.AddWithValue("@int", 1); + command.Parameters.AddWithValue("@decimal", 1.23); + command.Parameters.AddWithValue("@text", "test"); + command.Parameters.AddWithValue("@date", dateTime); + command.Parameters.AddWithValue("@bit", true); + command.Parameters.AddWithValue("@blob", blob); + command.ExecuteNonQuery(); + } + + using (var cmd = new MySqlCommand("SELECT * FROM Test", Connection)) + using (var reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetFieldValue(0), Is.EqualTo(1)); + Assert.That(reader.GetFieldValue(1), Is.EqualTo(1.23)); + Assert.That(reader.GetFieldValue(2), Is.EqualTo("test")); + Assert.That(reader.GetFieldValue(3).ToShortDateString(), Is.EqualTo(dateTime.ToShortDateString())); + Assert.That(reader.GetFieldValue(4), Is.EqualTo(true)); + Assert.That(Encoding.UTF8.GetString(((MemoryStream)reader.GetFieldValue(5)).ToArray()), Is.EqualTo(str).IgnoreCase); + } + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/OutputParametersBatch.cs b/MySQL.Data/tests/MySql.Data.Tests/OutputParametersBatch.cs new file mode 100644 index 000000000..9e264e4b6 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/OutputParametersBatch.cs @@ -0,0 +1,507 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Data; + +namespace MySql.Data.MySqlClient.Tests +{ + public class OutputParametersBatch : TestBase + { + protected bool prepare; + + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.AllowBatch = true; + } + + protected override void Cleanup() + { + ExecuteSQL(String.Format("DROP TABLE IF EXISTS `{0}`.Test", Connection.Database)); + ExecuteSQL("DROP PROCEDURE IF EXISTS spTest"); + ExecuteSQL("DROP FUNCTION IF EXISTS fnTest"); + Connection.ProcedureCache.Clear(); + } + + /// + /// Bug #17814 Stored procedure fails unless DbType set explicitly + /// Bug #23749 VarChar field size over 255 causes a System.OverflowException + /// + [Test] + public void OutputParameters() + { + // we don't want to run this test under no access + Assert.That(Settings.CheckParameters); + + // create our procedure + ExecuteSQL("CREATE PROCEDURE spTest(out value VARCHAR(350), OUT intVal INT, " + + "OUT dateVal TIMESTAMP, OUT floatVal FLOAT, OUT noTypeVarChar VARCHAR(20), " + + "OUT noTypeInt INT) " + + "BEGIN SET value='42'; SET intVal=33; SET dateVal='2004-06-05 07:58:09'; " + + "SET floatVal = 1.2; SET noTypeVarChar='test'; SET noTypeInt=66; END"); + + // we use rootConn here since we are using parameters + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.Add(new MySqlParameter("?value", MySqlDbType.VarChar)); + cmd.Parameters.Add(new MySqlParameter("?intVal", MySqlDbType.Int32)); + cmd.Parameters.Add(new MySqlParameter("?dateVal", MySqlDbType.DateTime)); + cmd.Parameters.Add(new MySqlParameter("?floatVal", MySqlDbType.Float)); + MySqlParameter vcP = new MySqlParameter(); + vcP.ParameterName = "?noTypeVarChar"; + vcP.Direction = ParameterDirection.Output; + cmd.Parameters.Add(vcP); + MySqlParameter vcI = new MySqlParameter(); + vcI.ParameterName = "?noTypeInt"; + vcI.Direction = ParameterDirection.Output; + cmd.Parameters.Add(vcI); + cmd.Parameters[0].Direction = ParameterDirection.Output; + cmd.Parameters[1].Direction = ParameterDirection.Output; + cmd.Parameters[2].Direction = ParameterDirection.Output; + cmd.Parameters[3].Direction = ParameterDirection.Output; + if (prepare) cmd.Prepare(); + int rowsAffected = cmd.ExecuteNonQuery(); + + Assert.That(rowsAffected, Is.EqualTo(0)); + Assert.That(cmd.Parameters[0].Value, Is.EqualTo("42")); + Assert.That(cmd.Parameters[1].Value, Is.EqualTo(33)); + Assert.That(Convert.ToDateTime(cmd.Parameters[2].Value), Is.EqualTo(new DateTime(2004, 6, 5, 7, 58, 9))); + Assert.That((decimal)(float)cmd.Parameters[3].Value, Is.EqualTo((decimal)1.2)); + Assert.That(cmd.Parameters[4].Value, Is.EqualTo("test")); + Assert.That(cmd.Parameters[5].Value, Is.EqualTo(66)); + } + + [Test] + public void InputOutputParameters() + { + // create our procedure + ExecuteSQL("CREATE PROCEDURE spTest( INOUT strVal VARCHAR(50), INOUT numVal INT, OUT outVal INT UNSIGNED ) " + + "BEGIN SET strVal = CONCAT(strVal,'ending'); SET numVal=numVal * 2; SET outVal=99; END"); + + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.AddWithValue("?strVal", "beginning"); + cmd.Parameters.AddWithValue("?numVal", 33); + cmd.Parameters.AddWithValue("?outVal", MySqlDbType.Int32); + cmd.Parameters[0].Direction = ParameterDirection.InputOutput; + cmd.Parameters[1].Direction = ParameterDirection.InputOutput; + cmd.Parameters[2].Direction = ParameterDirection.Output; + if (prepare) cmd.Prepare(); + int rowsAffected = cmd.ExecuteNonQuery(); + Assert.That(rowsAffected, Is.EqualTo(0)); + Assert.That(cmd.Parameters[0].Value, Is.EqualTo("beginningending")); + Assert.That(cmd.Parameters[1].Value, Is.EqualTo(66)); + Assert.That(cmd.Parameters[2].Value, Is.EqualTo(99)); + } + + [Test] + public void ExecuteScalar() + { + // create our procedure + ExecuteSQL("CREATE PROCEDURE spTest(IN valin VARCHAR(50), OUT valout VARCHAR(50) ) " + + "BEGIN SET valout=valin; SELECT 'Test'; END"); + + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.AddWithValue("?valin", "valuein"); + cmd.Parameters.Add(new MySqlParameter("?valout", MySqlDbType.VarChar)); + cmd.Parameters[1].Direction = ParameterDirection.Output; + if (prepare) cmd.Prepare(); + object result = cmd.ExecuteScalar(); + Assert.That(result, Is.EqualTo("Test")); + Assert.That(cmd.Parameters[1].Value, Is.EqualTo("valuein")); + } + + [Test] + public void ExecuteReaderTest() + { + // create our procedure + ExecuteSQL("CREATE PROCEDURE spTest(OUT p INT) " + + "BEGIN SELECT 1; SET p=2; END"); + + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.Parameters.Add("?p", MySqlDbType.Int32); + cmd.Parameters[0].Direction = ParameterDirection.Output; + cmd.CommandType = CommandType.StoredProcedure; + if (prepare) cmd.Prepare(); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.NextResult(), Is.False); + Assert.That(reader.Read(), Is.False); + } + Assert.That(cmd.Parameters[0].Value, Is.EqualTo(2)); + } + + [Test] + public void FunctionNoParams() + { + ExecuteSQL("CREATE FUNCTION fnTest() RETURNS CHAR(50)" + + " LANGUAGE SQL DETERMINISTIC BEGIN RETURN \"Test\"; END"); + + MySqlCommand cmd = new MySqlCommand("SELECT fnTest()", Connection); + cmd.CommandType = CommandType.Text; + if (prepare) cmd.Prepare(); + object result = cmd.ExecuteScalar(); + Assert.That(result, Is.EqualTo("Test")); + } + + [Test] + public void FunctionParams() + { + ExecuteSQL("CREATE FUNCTION fnTest( val1 INT, val2 CHAR(40) ) RETURNS INT " + + " LANGUAGE SQL DETERMINISTIC BEGIN RETURN val1 + LENGTH(val2); END"); + + MySqlCommand cmd = new MySqlCommand("SELECT fnTest(22, 'Test')", Connection); + cmd.CommandType = CommandType.Text; + if (prepare) cmd.Prepare(); + object result = cmd.ExecuteScalar(); + Assert.That(result, Is.EqualTo(26)); + } + + /// + /// Bug #10644 Cannot call a stored function directly from Connector/NET + /// Bug #25013 Return Value parameter not found + /// + [Test] + public void CallingStoredFunctionasProcedure() + { + ExecuteSQL("CREATE FUNCTION fnTest(valin int) RETURNS INT " + + " LANGUAGE SQL DETERMINISTIC BEGIN return valin * 2; END"); + MySqlCommand cmd = new MySqlCommand("fnTest", Connection); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.AddWithValue("?valin", 22); + MySqlParameter retVal = cmd.CreateParameter(); + retVal.ParameterName = "?retval"; + retVal.MySqlDbType = MySqlDbType.Int32; + retVal.Direction = ParameterDirection.ReturnValue; + cmd.Parameters.Add(retVal); + if (prepare) cmd.Prepare(); + cmd.ExecuteNonQuery(); + Assert.That(cmd.Parameters[1].Value, Is.EqualTo(44)); + } + + [Test] + public void ReturningEmptyResultSet() + { + ExecuteSQL("CREATE TABLE test1 (id int AUTO_INCREMENT NOT NULL, " + + "Name VARCHAR(100) NOT NULL, PRIMARY KEY(id))"); + ExecuteSQL("CREATE TABLE test2 (id int AUTO_INCREMENT NOT NULL, " + + "id1 INT NOT NULL, id2 INT NOT NULL, PRIMARY KEY(id))"); + + ExecuteSQL("INSERT INTO test1 (Id, Name) VALUES (1, 'Item1')"); + ExecuteSQL("INSERT INTO test1 (Id, Name) VALUES (2, 'Item2')"); + ExecuteSQL("INSERT INTO test2 (Id, Id1, Id2) VALUES (1, 1, 1)"); + ExecuteSQL("INSERT INTO test2 (Id, Id1, Id2) VALUES (2, 2, 1)"); + + ExecuteSQL("CREATE PROCEDURE spTest(Name VARCHAR(100), OUT Table1Id INT) " + + "BEGIN SELECT t1.Id INTO Table1Id FROM test1 t1 WHERE t1.Name LIKE Name; " + + "SELECT t3.Id2 FROM test2 t3 WHERE t3.Id1 = Table1Id; END"); + + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.AddWithValue("?Name", "Item3"); + cmd.Parameters.Add("?Table1Id", MySqlDbType.Int32); + cmd.Parameters["?Table1Id"].Direction = ParameterDirection.Output; + + DataSet ds = new DataSet(); + if (prepare) cmd.Prepare(); + MySqlDataAdapter da = new MySqlDataAdapter(cmd); + try + { + da.Fill(ds); + } + catch (MySqlException) + { + // on 5.1 this throws an exception that no rows were returned. + } + } + + [Test] + public void UnsignedOutputParameters() + { + ExecuteSQL("CREATE TABLE Test (id INT(10) UNSIGNED AUTO_INCREMENT, PRIMARY KEY (id)) "); + ExecuteSQL("CREATE PROCEDURE spTest (OUT id BIGINT UNSIGNED) " + + "BEGIN INSERT INTO Test VALUES (NULL); SET id=LAST_INSERT_ID(); END"); + + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.Add("?id", MySqlDbType.UInt64); + cmd.Parameters[0].Direction = ParameterDirection.Output; + if (prepare) cmd.Prepare(); + cmd.ExecuteNonQuery(); + + object o = cmd.Parameters[0].Value; + Assert.That(o is ulong); + Assert.That(Convert.ToInt32(o), Is.EqualTo(1)); + } + + [Test] + public void CallingFunctionWithoutReturnParameter() + { + ExecuteSQL("CREATE FUNCTION fnTest (p_kiosk bigint(20), " + + "p_user bigint(20)) returns double begin declare v_return double; " + + "set v_return = 3.6; return v_return; end"); + + MySqlCommand cmd = new MySqlCommand("fnTest", Connection); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.AddWithValue("?p_kiosk", 2); + cmd.Parameters.AddWithValue("?p_user", 4); + Exception ex = Assert.Throws(() => { if (prepare) cmd.Prepare(); cmd.ExecuteNonQuery(); }); + Assert.That("Attempt to call stored function 'fnTest' without specifying a return parameter", Is.EqualTo(ex.Message)); + } + + /// + /// Bug #27668 FillSchema and Stored Proc with an out parameter + /// + [Test] + public void GetSchema2() + { + ExecuteSQL(@"CREATE TABLE Test(id INT AUTO_INCREMENT, PRIMARY KEY (id)) "); + ExecuteSQL(@"CREATE PROCEDURE spTest (OUT id INT) + BEGIN INSERT INTO Test VALUES (NULL); SET id=520; END"); + + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.Add("?id", MySqlDbType.Int32); + cmd.Parameters[0].Direction = ParameterDirection.Output; + + MySqlDataAdapter da = new MySqlDataAdapter(cmd); + DataTable dt = new DataTable(); + if (prepare) cmd.Prepare(); + cmd.ExecuteNonQuery(); + da.Fill(dt); + da.FillSchema(dt, SchemaType.Mapped); + } + + [Test] + public void BinaryAndVarBinaryParameters() + { + ExecuteSQL("CREATE PROCEDURE spTest(OUT out1 BINARY(20), OUT out2 VARBINARY(20)) " + + "BEGIN SET out1 = 'out1'; SET out2='out2'; END"); + + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.Add("out1", MySqlDbType.Binary); + cmd.Parameters[0].Direction = ParameterDirection.Output; + cmd.Parameters.Add("out2", MySqlDbType.VarBinary); + cmd.Parameters[1].Direction = ParameterDirection.Output; + if (prepare) cmd.Prepare(); + cmd.ExecuteNonQuery(); + + byte[] out1 = (byte[])cmd.Parameters[0].Value; + Assert.That((char)out1[0], Is.EqualTo('o')); + Assert.That((char)out1[1], Is.EqualTo('u')); + Assert.That((char)out1[2], Is.EqualTo('t')); + Assert.That((char)out1[3], Is.EqualTo('1')); + + out1 = (byte[])cmd.Parameters[1].Value; + Assert.That((char)out1[0], Is.EqualTo('o')); + Assert.That((char)out1[1], Is.EqualTo('u')); + Assert.That((char)out1[2], Is.EqualTo('t')); + Assert.That((char)out1[3], Is.EqualTo('2')); + } + + /// + /// Bug #31930 Stored procedures with "ambiguous column name" error cause lock-ups + /// + [Test] + public void CallingFunction() + { + ExecuteSQL(@"CREATE FUNCTION `GetSupplierBalance`(SupplierID_ INTEGER(11)) + RETURNS double NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER + COMMENT '' + BEGIN + RETURN 1.0; + END"); + + MySqlCommand command = new MySqlCommand("GetSupplierBalance", Connection); + command.CommandType = CommandType.StoredProcedure; + command.Parameters.Add("?SupplierID_", MySqlDbType.Int32).Value = 1; + command.Parameters.Add("?Balance", MySqlDbType.Double).Direction = ParameterDirection.ReturnValue; + if (prepare) command.Prepare(); + command.ExecuteNonQuery(); + double balance = Convert.ToDouble(command.Parameters["?Balance"].Value); + Assert.That(balance, Is.EqualTo(1.0)); + } + + /// + /// + [Test] + public void OutputParametersWithNewParamHandling() + { + // create our procedure + ExecuteSQL("CREATE PROCEDURE spTest(out val1 VARCHAR(350)) " + + "BEGIN SET val1 = '42'; END"); + + var connStr = Connection.ConnectionString.Replace("allow user variables=true", "allow user variables=false"); + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + + MySqlCommand cmd = new MySqlCommand("spTest", c); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.Add(new MySqlParameter("@val1", MySqlDbType.VarChar)).Direction = ParameterDirection.Output; + if (prepare) cmd.Prepare(); + int rowsAffected = cmd.ExecuteNonQuery(); + + Assert.That(rowsAffected, Is.EqualTo(0)); + Assert.That(cmd.Parameters[0].Value, Is.EqualTo("42")); + } + } + + /// + /// + [Test] + public void FunctionWithNewParamHandling() + { + // create our procedure + ExecuteSQL("CREATE FUNCTION fnTest(`value` INT) RETURNS INT " + + "BEGIN RETURN value; END"); + + var connStr = Connection.ConnectionString.Replace("allow user variables=true", "allow user variables=false"); + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + + MySqlCommand cmd = new MySqlCommand("fnTest", c); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.Add(new MySqlParameter("@value", MySqlDbType.Int32)).Value = 22; + cmd.Parameters.Add(new MySqlParameter("@returnvalue", MySqlDbType.Int32)).Direction = ParameterDirection.ReturnValue; + if (prepare) cmd.Prepare(); + int rowsAffected = cmd.ExecuteNonQuery(); + + Assert.That(rowsAffected, Is.EqualTo(0)); + Assert.That(cmd.Parameters[1].Value, Is.EqualTo(22)); + } + } + + /// + /// Bug #56756 Output Parameter MySqlDbType.Bit get a wrong Value (48/49 for false or true) + /// + [Test] + public void BitTypeAsOutParameter() + { + ExecuteSQL(@"CREATE PROCEDURE spTest(out x bit(1)) + BEGIN + Set x = 1; -- Outparameter value is 49 + Set x = 0; -- Outparameter value is 48 + END"); + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.Parameters.Clear(); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.Add("x", MySqlDbType.Bit).Direction = ParameterDirection.Output; + if (prepare) cmd.Prepare(); + cmd.ExecuteNonQuery(); + Assert.That(Convert.ToInt32(cmd.Parameters[0].Value), Is.EqualTo(0)); + } + + /// + /// Bug #25625 Crashes when calling with CommandType set to StoredProcedure + /// + [Test] + [Property("Category", "Security")] + public void RunWithoutSelectPrivsThrowException() + { + // we don't want this test to run in our all access fixture + string connInfo = Connection.ConnectionString; + if (connInfo.IndexOf("use procedure bodies=false") == -1) + return; + + ExecuteSQL(String.Format( + "GRANT ALL ON `{0}`.* to 'testuser'@'%' identified by 'testuser'", + Connection.Database)); + ExecuteSQL(String.Format( + "GRANT ALL ON `{0}`.* to 'testuser'@'{1}' identified by 'testuser'", + Connection.Database, Host)); + ExecuteSQL("CREATE PROCEDURE spTest(id int, OUT outid int, INOUT inoutid int) " + + "BEGIN SET outid=id+inoutid; SET inoutid=inoutid+id; END"); + + var csb = new MySqlConnectionStringBuilder(Connection.ConnectionString); + csb.UserID = "testuser"; + csb.Password = "testuser"; + MySqlConnection c = new MySqlConnection(csb.ConnectionString); + c.Open(); + + try + { + MySqlCommand cmd = new MySqlCommand("spTest", c); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.AddWithValue("?id", 2); + cmd.Parameters.AddWithValue("?outid", MySqlDbType.Int32); + cmd.Parameters[1].Direction = ParameterDirection.Output; + cmd.Parameters.AddWithValue("?inoutid", 4); + cmd.Parameters[2].Direction = ParameterDirection.InputOutput; + if (prepare) cmd.Prepare(); + cmd.ExecuteNonQuery(); + + Assert.That(cmd.Parameters[1].Value, Is.EqualTo(6)); + Assert.That(cmd.Parameters[2].Value, Is.EqualTo(6)); + } + catch (InvalidOperationException iex) + { + Assert.That(iex.Message, Does.StartWith("Unable to retrieve")); + } + finally + { + if (c != null) + c.Close(); + ExecuteSQL("DELETE FROM mysql.user WHERE user = 'testuser'"); + } + } + + [Test] + [Property("Category", "Security")] + public void NoAccessToProcedureBodies() + { + string sql = String.Format("CREATE PROCEDURE `{0}`.`spTest`(in1 INT, INOUT inout1 INT, OUT out1 INT ) " + + "BEGIN SET inout1 = inout1+2; SET out1=inout1-3; SELECT in1; END", (Connection.Database)); + ExecuteSQL(sql); + + using (MySqlConnection c = new MySqlConnection(Connection.ConnectionString + ";check parameters=false")) + { + c.Open(); + + MySqlCommand cmd = new MySqlCommand("spTest", c); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.AddWithValue("?in1", 2); + cmd.Parameters.AddWithValue("?inout1", 4); + cmd.Parameters.Add("?out1", MySqlDbType.Int32); + cmd.Parameters[1].Direction = ParameterDirection.InputOutput; + cmd.Parameters[2].Direction = ParameterDirection.Output; + if (prepare) cmd.Prepare(); + cmd.ExecuteNonQuery(); + + Assert.That(cmd.Parameters[1].Value, Is.EqualTo(6)); + Assert.That(cmd.Parameters[2].Value, Is.EqualTo(3)); + } + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/ParameterTests.cs b/MySQL.Data/tests/MySql.Data.Tests/ParameterTests.cs new file mode 100644 index 000000000..c2a6b7d69 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/ParameterTests.cs @@ -0,0 +1,995 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Data; +using System.Diagnostics; +using System.IO; +using System.Text; + +namespace MySql.Data.MySqlClient.Tests +{ + public class ParameterTests : TestBase + { + protected override void Cleanup() + { + ExecuteSQL(String.Format("DROP TABLE IF EXISTS `{0}`.Test", Connection.Database)); + } + + [Test] + public void TestQuoting() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + + MySqlCommand cmd = new MySqlCommand("", Connection); + cmd.CommandText = "INSERT INTO Test VALUES (?id, ?name, NULL,NULL,NULL)"; + cmd.Parameters.Add(new MySqlParameter("?id", 1)); + cmd.Parameters.Add(new MySqlParameter("?name", "my ' value")); + cmd.ExecuteNonQuery(); + + cmd.Parameters[0].Value = 2; + cmd.Parameters[1].Value = @"my "" value"; + cmd.ExecuteNonQuery(); + + cmd.Parameters[0].Value = 3; + cmd.Parameters[1].Value = @"my ` value"; + cmd.ExecuteNonQuery(); + + cmd.Parameters[0].Value = 4; + cmd.Parameters[1].Value = @"my ´ value"; + cmd.ExecuteNonQuery(); + + cmd.Parameters[0].Value = 5; + cmd.Parameters[1].Value = @"my \ value"; + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM Test"; + MySqlDataReader reader = null; + try + { + reader = cmd.ExecuteReader(); + reader.Read(); + Assert.That(reader.GetString(1), Is.EqualTo("my ' value")); + reader.Read(); + Assert.That(reader.GetString(1), Is.EqualTo(@"my "" value")); + reader.Read(); + Assert.That(reader.GetString(1), Is.EqualTo("my ` value")); + reader.Read(); + Assert.That(reader.GetString(1), Is.EqualTo("my ´ value")); + reader.Read(); + Assert.That(reader.GetString(1), Is.EqualTo(@"my \ value")); + } + catch (Exception ex) + { + Assert.That(ex.Message == String.Empty, Is.False, ex.Message); + } + finally + { + if (reader != null) reader.Close(); + } + } + + [Test] + public void TestDateTimeParameter() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + + MySqlCommand cmd = new MySqlCommand("", Connection); + + TimeSpan time = new TimeSpan(0, 1, 2, 3); + DateTime dt = new DateTime(2003, 11, 11, 1, 2, 3); + cmd.CommandText = "INSERT INTO Test VALUES (1, 'test', ?dt, ?time, CURRENT_TIMESTAMP)"; + cmd.Parameters.Add(new MySqlParameter("?time", time)); + cmd.Parameters.Add(new MySqlParameter("?dt", dt)); + int cnt = cmd.ExecuteNonQuery(); + Assert.That(cnt == 1, "Insert count"); + + cmd = new MySqlCommand("SELECT tm, dt, ts FROM Test WHERE id=1", Connection); + MySqlDataReader reader = cmd.ExecuteReader(); + reader.Read(); + TimeSpan time2 = (TimeSpan)reader.GetValue(0); + Assert.That(time2, Is.EqualTo(time)); + + DateTime dt2 = reader.GetDateTime(1); + Assert.That(dt2, Is.EqualTo(dt)); + + DateTime ts2 = reader.GetDateTime(2); + reader.Close(); + + // now check the timestamp column. We won't check the minute or second for obvious reasons + DateTime now = DateTime.Now; + Assert.That(ts2.Year, Is.EqualTo(now.Year)); + Assert.That(ts2.Month, Is.EqualTo(now.Month)); + Assert.That(ts2.Day, Is.EqualTo(now.Day)); + Assert.That(ts2.Hour, Is.EqualTo(now.Hour)); + + // now we'll set some nulls and see how they are handled + cmd = new MySqlCommand("UPDATE Test SET tm=?ts, dt=?dt WHERE id=1", Connection); + cmd.Parameters.Add(new MySqlParameter("?ts", DBNull.Value)); + cmd.Parameters.Add(new MySqlParameter("?dt", DBNull.Value)); + cnt = cmd.ExecuteNonQuery(); + Assert.That(cnt == 1, "Update null count"); + + cmd = new MySqlCommand("SELECT tm, dt FROM Test WHERE id=1", Connection); + reader = cmd.ExecuteReader(); + reader.Read(); + object tso = reader.GetValue(0); + object dto = reader.GetValue(1); + Assert.That(tso == DBNull.Value, "Time column"); + Assert.That(dto == DBNull.Value, "DateTime column"); + + reader.Close(); + + cmd.CommandText = "DELETE FROM Test WHERE id=1"; + cmd.ExecuteNonQuery(); + } + + [Test] + public void NestedQuoting() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id, name) " + + "VALUES(1, 'this is ?\"my value\"')", Connection); + int count = cmd.ExecuteNonQuery(); + Assert.That(count, Is.EqualTo(1)); + } + + [Test] + public void SetDbType() + { + IDbCommand cmd = Connection.CreateCommand(); + IDbDataParameter prm = cmd.CreateParameter(); + prm.DbType = DbType.Int64; + Assert.That(prm.DbType, Is.EqualTo(DbType.Int64)); + prm.Value = 3; + Assert.That(prm.DbType, Is.EqualTo(DbType.Int64)); + + MySqlParameter p = new MySqlParameter("name", MySqlDbType.Int64); + Assert.That(p.DbType, Is.EqualTo(DbType.Int64)); + Assert.That(p.MySqlDbType, Is.EqualTo(MySqlDbType.Int64)); + p.Value = 3; + Assert.That(p.DbType, Is.EqualTo(DbType.Int64)); + Assert.That(p.MySqlDbType, Is.EqualTo(MySqlDbType.Int64)); + } + + [Test] + public void NullParameterObject() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id, name) VALUES (1, ?name)", Connection); + try + { + cmd.Parameters.Add(null); + } + catch (ArgumentException) + { + } + } + + /// + /// Bug #28980952 MySqlParameterCollection.Add precondition check isn't consistent + /// + [TestCase("testParam", "testParam")] + [TestCase("testParam", "@testParam")] + [TestCase("@testParam", "@testParam")] + [TestCase("@testParam", "testParam")] + [TestCase("@testParam", "?testParam")] + [TestCase("?testParam", "@testParam")] + public void AddParameterCheck(string param1, string param2) + { + using (MySqlCommand cmd = new MySqlCommand()) + { + cmd.Parameters.AddWithValue(param1, 1); + Assert.Throws(() => cmd.Parameters.AddWithValue(param2, 2)); + } + } + + /// + /// Bug #32506736 Can't use MemoryStream as MySqlParameter value + /// + [Test] + public void MemoryStreamAsParameterValue() + { + ExecuteSQL("CREATE TABLE Test(str TEXT, blb BLOB,num INT); "); + + using (MySqlCommand cmd = new MySqlCommand("INSERT INTO Test(str, blb, num) VALUES(@str, @blb, @num); ", Connection)) + { + using var streamString = new MemoryStream(new byte[] { 97, 98, 99, 100 });//abcd + cmd.Parameters.AddWithValue("@str", streamString); + using var streamBlob = new MemoryStream(new byte[] { 101, 102, 103, 104 });//efgh + cmd.Parameters.AddWithValue("@blb", streamBlob); + using var streamnumber = new MemoryStream(new byte[] { 53, 54, 55, 56 });//5678 + cmd.Parameters.AddWithValue("@num", streamnumber); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM Test"; + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(Convert.ToString(reader[0]), Is.EqualTo("abcd")); + Assert.That(Encoding.Default.GetString((byte[])reader[1]), Is.EqualTo("efgh")); + Assert.That(Convert.ToString(reader[2]), Is.EqualTo("5678")); + } + } + } + + /// + /// Bug #34993796 MySqlParameter.Clone loses specific MySqlDbType + /// + [Test] + public void ParameterClone2() + { + var param = new MySqlParameter("@param", MySqlDbType.MediumText); + var clone = param.Clone(); + Assert.That(param.MySqlDbType, Is.EqualTo(MySqlDbType.MediumText)); // Prints "MediumText" + Assert.That(clone.MySqlDbType, Is.EqualTo(MySqlDbType.MediumText)); // Prints "VarChar" + } + + + /// + /// Bug #28777779 MySqlParameter.Clone doesn't clone all properties + /// + [Test] + public void ParameterClone() + { + var param = new MySqlParameter() + { + DbType = DbType.Int32, + Direction = ParameterDirection.Output, + Encoding = System.Text.Encoding.UTF8, + IsNullable = true, + MySqlDbType = MySqlDbType.Int32, + ParameterName = "test", + Precision = 3, + Scale = 2, + Size = 1, + SourceColumnNullMapping = true, + Value = 1 + }; + + var clonedparam = param.Clone(); + + Assert.That(clonedparam.DbType, Is.EqualTo(DbType.Int32)); + Assert.That(clonedparam.Direction, Is.EqualTo(ParameterDirection.Output)); + Assert.That(clonedparam.Encoding, Is.EqualTo(System.Text.Encoding.UTF8)); + Assert.That(clonedparam.IsNullable); + Assert.That(clonedparam.MySqlDbType, Is.EqualTo(MySqlDbType.Int32)); + Assert.That(clonedparam.ParameterName, Is.EqualTo("test")); + Assert.That(clonedparam.Precision, Is.EqualTo((byte)3)); + Assert.That(clonedparam.Scale, Is.EqualTo((byte)2)); + Assert.That(clonedparam.Size, Is.EqualTo(1)); + Assert.That(clonedparam.SourceColumnNullMapping); + Assert.That(clonedparam.Value, Is.EqualTo(1)); + } + + /// + /// Bug #20259756 MysqlParameter direction output does not work for text commands + /// + [TestCase(true)] + [TestCase(false)] + public void ParameterDirectionOutputTextCommand(bool preparedCommand) + { + using (MySqlCommand cmd = Connection.CreateCommand()) + { + cmd.CommandText = "set @outputParam=1234;"; + cmd.CommandType = CommandType.Text; + MySqlParameter outParam = new MySqlParameter(); + outParam.ParameterName = "@outputParam"; + outParam.MySqlDbType = MySqlDbType.Int32; + outParam.Direction = ParameterDirection.Output; + cmd.Parameters.Add(outParam); + if (preparedCommand) cmd.Prepare(); + + cmd.ExecuteNonQuery(); + Assert.That(cmd.Parameters["@outputParam"].Value, Is.EqualTo(1234)); + } + } + + /// + /// Bug #7398 MySqlParameterCollection doesn't allow parameters without filled in names + /// + [Test] + public void AllowUnnamedParameters() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id,name) VALUES (?id, ?name)", Connection); + + MySqlParameter p = new MySqlParameter(); + p.Value = 1; + cmd.Parameters.Add(p); + cmd.Parameters[0].ParameterName = "?id"; + + p = new MySqlParameter(); + p.Value = "test"; + cmd.Parameters.Add(p); + p.ParameterName = "?name"; + + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT id FROM Test"; + Assert.That(cmd.ExecuteScalar(), Is.EqualTo(1)); + + cmd.CommandText = "SELECT name FROM Test"; + Assert.That(cmd.ExecuteScalar(), Is.EqualTo("test")); + } + + [Test] + public void NullParameterValue() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id, name) VALUES (1, ?name)", Connection); + cmd.Parameters.Add(new MySqlParameter("?name", null)); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT name FROM Test WHERE id=1"; + object name = cmd.ExecuteScalar(); + Assert.That(name, Is.EqualTo(DBNull.Value)); + } + + /// + /// Bug #12646 Parameters are defaulted to Decimal + /// + [Test] + public void DefaultType() + { + IDbCommand cmd = Connection.CreateCommand(); + IDbDataParameter p = cmd.CreateParameter(); + p.ParameterName = "?boo"; + p.Value = "test"; + MySqlParameter mp = (MySqlParameter)p; + Assert.That(mp.MySqlDbType, Is.EqualTo(MySqlDbType.VarChar)); + } + + [Test] + public void OddCharsInParameterNames() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id, name) VALUES (1, ?nam$es)", Connection); + cmd.Parameters.Add(new MySqlParameter("?nam$es", "Test")); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "INSERT INTO Test (id, name) VALUES (2, ?nam_es)"; + cmd.Parameters.Clear(); + cmd.Parameters.Add(new MySqlParameter("?nam_es", "Test2")); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "INSERT INTO Test (id, name) VALUES (3, ?nam.es)"; + cmd.Parameters.Clear(); + cmd.Parameters.Add(new MySqlParameter("?nam.es", "Test3")); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT name FROM Test WHERE id=1"; + object name = cmd.ExecuteScalar(); + Assert.That(name, Is.EqualTo("Test")); + + cmd.CommandText = "SELECT name FROM Test WHERE id=2"; + name = cmd.ExecuteScalar(); + Assert.That(name, Is.EqualTo("Test2")); + + cmd.CommandText = "SELECT name FROM Test WHERE id=3"; + name = cmd.ExecuteScalar(); + Assert.That(name, Is.EqualTo("Test3")); + } + + /// + /// Bug #24565 Inferring DbType fails when reusing commands and the first time the value is nul + /// + [Test] + public void UnTypedParameterBeingReused() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id, dt) VALUES (?id, ?dt)", Connection); + cmd.Parameters.AddWithValue("?id", 1); + MySqlParameter p = cmd.CreateParameter(); + p.ParameterName = "?dt"; + p.Value = DBNull.Value; + cmd.Parameters.Add(p); + cmd.ExecuteNonQuery(); + + cmd.Parameters[0].Value = 2; + p.Value = DateTime.Now; + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM Test"; + cmd.Parameters.Clear(); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.IsDBNull(2)); + reader.Read(); + Assert.That(reader.IsDBNull(2), Is.False); + Assert.That(reader.Read(), Is.False); + } + } + + [Test] + public void ParameterCacheNotClearing() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id, name) VALUES (?id, ?name)", Connection); + cmd.Parameters.AddWithValue("?id", 1); + cmd.Parameters.AddWithValue("?name", "test"); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "INSERT INTO Test (id, name, dt) VALUES (?id1, ?name1, ?id)"; + cmd.Parameters[0].ParameterName = "?id1"; + cmd.Parameters[0].Value = 2; + cmd.Parameters[1].ParameterName = "?name1"; + cmd.Parameters.AddWithValue("?id", DateTime.Now); + cmd.ExecuteNonQuery(); + } + + [Test] + public void WithAndWithoutMarker() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id, name) VALUES (?id, ?name)", Connection); + cmd.Parameters.AddWithValue("id", 1); + Assert.That(cmd.Parameters.IndexOf("?id"), Is.EqualTo(-1)); + cmd.Parameters.AddWithValue("name", "test"); + cmd.ExecuteNonQuery(); + + cmd.Parameters.Clear(); + cmd.Parameters.AddWithValue("?id", 2); + Assert.That(cmd.Parameters.IndexOf("id"), Is.EqualTo(-1)); + cmd.Parameters.AddWithValue("?name", "test2"); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT COUNT(*) FROM Test"; + object count = cmd.ExecuteScalar(); + Assert.That(Convert.ToInt32(count), Is.EqualTo(2)); + } + + [Test] + public void DoubleAddingParameters() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id, name) VALUES (?id, ?name)", Connection); + cmd.Parameters.AddWithValue("id", 1); + Assert.That(cmd.Parameters.IndexOf("?id"), Is.EqualTo(-1)); + Assert.That(cmd.Parameters.IndexOf("@id"), Is.EqualTo(-1)); + cmd.Parameters.AddWithValue("name", "test"); + Exception ex = Assert.Throws(() => cmd.Parameters.AddWithValue("?id", 2)); + Assert.That(ex.Message, Is.EqualTo("Parameter '?id' has already been defined")); + } + + /// + /// Bug #26904 MySqlParameterCollection fails to add MySqlParameter that previously removed + /// + [Test] + public void AddingParameterPreviouslyRemoved() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + + MySqlCommand cmd = new + MySqlCommand("Insert into sometable(s1, s2) values(?p1, ?p2)"); + + MySqlParameter param1 = cmd.CreateParameter(); + param1.ParameterName = "?p1"; + param1.DbType = DbType.String; + param1.Value = "Ali Gel"; + + cmd.Parameters.Add(param1); + cmd.Parameters.RemoveAt(0); + cmd.Parameters.Add(param1); + } + + /// + /// Bug #27135 MySqlParameterCollection and parameters added with Insert Method + /// + [Test] + public void AddingParametersUsingInsert() + { + MySqlCommand cmd = new MySqlCommand(); + cmd.Parameters.Insert(0, new MySqlParameter("?id", MySqlDbType.Int32)); + MySqlParameter p = cmd.Parameters["?id"]; + Assert.That(p.ParameterName, Is.EqualTo("?id")); + } + + /// + /// Bug #27187 cmd.Parameters.RemoveAt("Id") will cause an error if the last item is requested + /// + [Test] + public void FindParameterAfterRemoval() + { + MySqlCommand cmd = new MySqlCommand(); + + cmd.Parameters.Add("?id1", MySqlDbType.Int32); + cmd.Parameters.Add("?id2", MySqlDbType.Int32); + cmd.Parameters.Add("?id3", MySqlDbType.Int32); + cmd.Parameters.Add("?id4", MySqlDbType.Int32); + cmd.Parameters.Add("?id5", MySqlDbType.Int32); + cmd.Parameters.Add("?id6", MySqlDbType.Int32); + cmd.Parameters.RemoveAt("?id1"); + MySqlParameter p = cmd.Parameters["?id6"]; + Assert.That(p.ParameterName, Is.EqualTo("?id6")); + } + + /// + /// Bug #29312 System.FormatException if parameter not found + /// + [Test] + public void MissingParameter() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test(id) VALUES (?id)", Connection); + try + { + cmd.ExecuteNonQuery(); + } + catch (MySqlException) + { + } + } + + /// + /// Bug #32094 Size property on string parameter throws an exception + /// + [Test] + public void StringParameterSizeSetAfterValue() + { + ExecuteSQL("CREATE TABLE Test (v VARCHAR(10))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?p1)", Connection); + cmd.Parameters.Add("?p1", MySqlDbType.VarChar); + cmd.Parameters[0].Value = "123"; + cmd.Parameters[0].Size = 10; + cmd.ExecuteNonQuery(); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + DataTable dt = new DataTable(); + da.Fill(dt); + Assert.That(dt.Rows[0][0], Is.EqualTo("123")); + + cmd.Parameters.Clear(); + cmd.Parameters.Add("?p1", MySqlDbType.VarChar); + cmd.Parameters[0].Value = "123456789012345"; + cmd.Parameters[0].Size = 10; + cmd.ExecuteNonQuery(); + + dt.Clear(); + da.Fill(dt); + Assert.That(dt.Rows[1][0], Is.EqualTo("1234567890")); + } + + /// + /// Bug #32093 MySqlParameter Constructor does not allow Direction of anything other than Input + /// + [Test] + public void NonInputParametersToCtor() + { + MySqlParameter p = new MySqlParameter("?p1", MySqlDbType.VarChar, 20, + ParameterDirection.InputOutput, true, 0, 0, "id", DataRowVersion.Current, 0); + Assert.That(p.Direction, Is.EqualTo(ParameterDirection.InputOutput)); + + MySqlParameter p1 = new MySqlParameter("?p1", MySqlDbType.VarChar, 20, + ParameterDirection.Output, true, 0, 0, "id", DataRowVersion.Current, 0); + Assert.That(p1.Direction, Is.EqualTo(ParameterDirection.Output)); + } + + [Test] + public void UseAtSignForParameters() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id, name) VALUES (@id, @name)", Connection); + cmd.Parameters.AddWithValue("@id", 33); + cmd.Parameters.AddWithValue("@name", "Test"); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM Test"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetInt32(0), Is.EqualTo(33)); + Assert.That(reader.GetString(1), Is.EqualTo("Test")); + } + } + + /// + /// Bug #62194 MySQL Parameter constructor doesn't set + /// all properties: IsNullable, Precision and Scale + /// + [Test] + public void CanCreateMySQLParameterWithNullability() + { + + MySqlParameter p = new MySqlParameter("?id", MySqlDbType.Decimal, 2, + ParameterDirection.Input, true, 1, 1, "sourceColumn", DataRowVersion.Default, 1); + + Assert.That(p.IsNullable); + } + + /// + /// Bug #62194 MySQL Parameter constructor doesn't set + /// all properties: IsNullable, Precision and Scale + /// + [Test] + public void CanCreateMySQLParameterWithPrecision() + { + MySqlParameter p = new MySqlParameter("?id", MySqlDbType.Decimal, 2, + ParameterDirection.Input, true, Byte.MaxValue, 1, "sourceColumn", DataRowVersion.Default, 1); + + Assert.That(Byte.MaxValue, Is.EqualTo(p.Precision)); + } + + + /// + /// Bug #62194 MySQL Parameter constructor doesn't set + /// all properties: IsNullable, Precision and Scale + /// + [Test] + public void CanCreateMySQLParameterWithScale() + { + + MySqlParameter p = new MySqlParameter("?id", MySqlDbType.Decimal, 2, + ParameterDirection.Input, true, 1, Byte.MaxValue, "sourceColumn", DataRowVersion.Default, 1); + + Assert.That(Byte.MaxValue, Is.EqualTo(p.Scale)); + } + + /// + /// Bug #66060 #14499549 "Parameter '?' must be defined" error, when using unnamed parameters + /// + [Test] + public void CanIdentifyParameterWithOutName() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id,name) VALUES (?, ?)", Connection); + + cmd.Parameters.AddWithValue("", 1); + cmd.Parameters.AddWithValue("", "test"); + + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT id FROM Test"; + Assert.That(cmd.ExecuteScalar(), Is.EqualTo(1)); + + cmd.CommandText = "SELECT name FROM Test"; + Assert.That(cmd.ExecuteScalar(), Is.EqualTo("test")); + } + + /// + /// Bug #66060 #14499549 "Parameter '?' must be defined" error, when using unnamed parameters + /// + [Test] + public void CanThrowAnExceptionWhenMixingParameterNaming() + { + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id,name) VALUES (?Id, ?name, ?)", Connection); + cmd.Parameters.AddWithValue("?Id", 1); + cmd.Parameters.AddWithValue("?name", "test"); + Exception ex = Assert.Throws(() => cmd.ExecuteNonQuery()); + Assert.That(ex.Message, Is.EqualTo("Fatal error encountered during command execution")); + } + + /// + /// Bug #22101727 CONNECTOR MODIFIES RESULT TYPE AFTER PARENT TINYINT VALUE IS NULL + /// + [Test] + public void TreatTinyAsBooleanWhenNull() + { + ExecuteSQL("CREATE TABLE testbool (id INT (10) UNSIGNED NOT NULL AUTO_INCREMENT, testcol TINYINT(1) DEFAULT NULL, PRIMARY KEY(id))"); + ExecuteSQL("INSERT INTO testbool(testcol) VALUES(0),(1),(1),(NULL),(0),(0),(1)"); + + using (var conn = new MySqlConnection(Settings.ConnectionString)) + { + conn.Open(); + MySqlCommand cmd = conn.CreateCommand(); + cmd.CommandText = "SELECT * FROM testbool"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + if (!(reader["testcol"] is DBNull)) + Assert.That(reader["testcol"] is bool); + } + } + } + } + + /// + /// Bug #27113566 MYSQLCOMMAND.PREPARE STOPS TINYINT(1) FROM BEING TREATED AS A .NET BOOL + /// + [Test] + public void TreatTinyAsBooleanWhenCallingPrepare() + { + ExecuteSQL("CREATE TABLE `mysql_bug_test` (`test_key` varchar(10) NOT NULL, `test_val` tinyint(1) NOT NULL, PRIMARY KEY(`test_key`)) ENGINE = InnoDB DEFAULT CHARSET = utf8; "); + ExecuteSQL("LOCK TABLES `mysql_bug_test` WRITE;"); + ExecuteSQL("INSERT INTO `mysql_bug_test` VALUES ('mykey',0);"); + ExecuteSQL("UNLOCK TABLES;"); + + var builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.CharacterSet = "utf8"; + builder.UseCompression = true; + builder.TreatTinyAsBoolean = false; + + using (var connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + using (var cmd = new MySqlCommand("SELECT * FROM mysql_bug_test WHERE test_key = @TestKey", connection)) + { + cmd.Parameters.AddWithValue("@TestKey", "mykey").MySqlDbType = MySqlDbType.VarChar; + cmd.Prepare(); + using (var reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) + { + reader.Read(); + Assert.That(reader["test_val"] is bool, Is.False); + } + } + + connection.Close(); + } + + builder.TreatTinyAsBoolean = true; + + using (var connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + using (var cmd = new MySqlCommand("SELECT * FROM mysql_bug_test WHERE test_key = @TestKey", connection)) + { + cmd.Parameters.AddWithValue("@TestKey", "mykey").MySqlDbType = MySqlDbType.VarChar; + cmd.Prepare(); + using (var reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) + { + reader.Read(); + Assert.That(reader["test_val"] is bool); + } + } + + connection.Close(); + } + } + + /// + /// Bug #25573071 MYSQLPARAMETER INT ZERO EVALUATED TO NULL + /// This fix was reverted since it was wrong implemented. See https://mybug.mysql.oraclecorp.com/orabugs/site/bug.php?id=32050204 for more details + /// + [Test] + public void ZeroParameterAsNull() + { + ExecuteSQL(@"DROP TABLE IF EXISTS `audit`"); + ExecuteSQL(@"CREATE TABLE `audit` (`ProviderId` int(11) NOT NULL,`Permanent` tinyint(4) NOT NULL DEFAULT '1')"); + ExecuteSQL(@"insert into `audit` values (1,0);"); + var query = "SELECT * FROM audit t1 WHERE t1.Permanent = ?IsFalse"; + MySqlParameter[] parameters = { new MySqlParameter() { ParameterName = "IsFalse", Value = 0 } }; + var ds = MySqlHelper.ExecuteDataset(Connection.ConnectionString, query, parameters); + Assert.That(1, Is.EqualTo(ds.Tables[0].Rows.Count)); + } + + /// + /// Bug #32050204 - DEFAULT VALUE FOR MYSQLPARAMETER.VALUE CHANGED FROM NULL TO 0 + /// This fix reverted the work done in Bug#25573071 + /// + [Test] + public void DefaultNullValue() + { + ExecuteSQL("CREATE TABLE Test (data INT NULL)"); + string cmdString = "INSERT INTO Test(data) VALUES(@Data)"; + using (var cmd = new MySqlCommand(cmdString, Connection)) + { + cmd.Parameters.Add(new MySqlParameter("@Data", MySqlDbType.Int32)); + cmd.ExecuteNonQuery(); + } + + using (var command = new MySqlCommand("SELECT data FROM Test", Connection)) + using (var reader = command.ExecuteReader()) + { + while (reader.Read()) + { + Assert.That(reader.IsDBNull(0)); + } + } + } + + /// + /// Bug #25467610 OVERFLOW EXCEPTION - 64 BIT ENUM VALUE AS PARAMETER CAST TO INT32 + /// + public enum TestEnum : ulong + { + Value = ulong.MaxValue + } + + public enum TestEnumDefault + { + Value = int.MaxValue + } + + public enum TestEnumByte : byte + { + Value = byte.MaxValue + } + + + [TestCase(TestEnum.Value, "serial")] + [TestCase(TestEnumDefault.Value, "int")] + [TestCase(TestEnumByte.Value, "TINYINT UNSIGNED")] + public void CastingEnum(Enum name, string typeName) + { + ExecuteSQL(@"DROP TABLE IF EXISTS `test`"); + ExecuteSQL($"CREATE TABLE `test` (`id` {typeName})"); + using (var conn = new MySqlConnection(Settings.ConnectionString)) + { + conn.Open(); + string sql = "select * from test where id = @ID;"; + MySqlCommand command = new MySqlCommand(sql, conn); + command.Parameters.AddWithValue("@ID", name); + MySqlDataReader rdr = command.ExecuteReader(); + Assert.That(rdr, Is.Not.Null); + } + } + + /// + /// Bug #31754599 - MYSQLCOMMAND.PARAMETERS.INSERT(-1) SUCCEEDS BUT SHOULD FAIL + /// + [Test] + public void InvalidParameterIndex() + { + var cmd = new MySqlCommand(); + cmd.Connection = Connection; + cmd.Parameters.Insert(0, new MySqlParameter("test0", "test0")); + Assert.Throws(() => cmd.Parameters.Insert(-1, new MySqlParameter("test-1", "test-1"))); + Assert.Throws(() => cmd.Parameters.Insert(-2, new MySqlParameter("test-1", "test-1"))); + cmd.Parameters.Insert(1, new MySqlParameter("test1", "test1")); + cmd.Parameters.Insert(0, new MySqlParameter("testNew0", "test2")); + + Assert.That(cmd.Parameters.IndexOf("testNew0") == 0); + Assert.That(cmd.Parameters.IndexOf("test0") == 1); + Assert.That(cmd.Parameters.IndexOf("test1") == 2); + + cmd.Parameters.AddWithValue("", "test3"); + Assert.That(cmd.Parameters.Count == 4); + Assert.That(cmd.Parameters.IndexOf("Parameter4") == 3); + + cmd.Parameters.Insert(1, new MySqlParameter("lastTest", "test4")); + Assert.That(cmd.Parameters.IndexOf("lastTest") == 1); + } + + /// + /// Bug #13276 Exception on serialize after inserting null value + /// + [Test] + public void InsertValueAfterNull() + { + ExecuteSQL("CREATE TABLE Test (id int auto_increment primary key, foo int)"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + MySqlCommand c = new MySqlCommand("INSERT INTO Test (foo) values (?foo)", Connection); + c.Parameters.Add("?foo", MySqlDbType.Int32, 0, "foo"); + + da.InsertCommand = c; + DataTable dt = new DataTable(); + da.Fill(dt); + DataRow row = dt.NewRow(); + dt.Rows.Add(row); + row = dt.NewRow(); + row["foo"] = 2; + dt.Rows.Add(row); + da.Update(dt); + + dt.Clear(); + da.Fill(dt); + Assert.That(dt.Rows.Count, Is.EqualTo(2)); + Assert.That(dt.Rows[1]["foo"], Is.EqualTo(2)); + } + + /// + /// Bug #20056757 - MYSQLPARAMETER.CLONE MISSED ASSIGN VALUE TO PROPERTY SOURCECOLUMNNULLMAPPING + /// At the moment of cloning the parameters, the SourceColumnNullMapping property was missing to copy hence the exception + /// + [Test] + public void CloneParameterAssignSourceColumnNullMapping() + { + ExecuteSQL("CREATE TABLE Test (id INT AUTO_INCREMENT, name VARCHAR(10) NULL, PRIMARY KEY(id)); INSERT INTO Test VALUES (1, null)"); + string query = "SELECT * FROM Test"; + + MySqlDataAdapter dataAdapter = new MySqlDataAdapter(query, Connection); + MySqlCommandBuilder cb = new MySqlCommandBuilder(dataAdapter); + dataAdapter.DeleteCommand = (MySqlCommand)cb.GetDeleteCommand().Clone(); + DataTable dataTable = new DataTable(); + dataAdapter.Fill(dataTable); + + using (var cmd = new MySqlCommand(query, Connection)) + Assert.That(cmd.ExecuteScalar(), Is.EqualTo(1)); + Assert.That(dataTable.Rows.Count, Is.EqualTo(1)); + + dataTable.Rows[0].Delete(); + dataAdapter.Update(dataTable); + + using (var cmd = new MySqlCommand(query, Connection)) + Assert.That(cmd.ExecuteScalar(), Is.Null); + Assert.That(dataTable.Rows.Count, Is.EqualTo(0)); + } + + /// + /// Bug #23343947 - .NET BUG WRITE NULLABLE VALUES + /// Initializing of the parameter changed to match same type for DbType and MySqlDbType, String. + /// + [Test] + public void InitializeParameter() + { + var cmd = new MySqlCommand(); + var newParam = cmd.CreateParameter(); + var newIntParam = new MySqlParameter("newIntParam", 3); + + Assert.That(newParam.MySqlDbType, Is.EqualTo(MySqlDbType.VarChar)); + Assert.That(newParam.DbType, Is.EqualTo(DbType.String)); + Assert.That(newIntParam.MySqlDbType, Is.EqualTo(MySqlDbType.Int32)); + Assert.That(newIntParam.DbType, Is.EqualTo(DbType.Int32)); + } + + /// + /// Bug #33710643 [Poor performance when adding parameters with "Add(Object)"] + /// Before the fix, the method Add(object value) was above the 8-10 seconds. + /// + [Test] + public void AddObjectPerformance() + { + int paramCount = 50000; + var cmd = new MySqlCommand(); + var sw1 = new Stopwatch(); + var sw2 = new Stopwatch(); + + sw1.Start(); + for (int i = 0; i < paramCount; i++) + { + IDbDataParameter p = cmd.CreateParameter(); + p.ParameterName = $"?param_{i}"; + p.DbType = DbType.String; + cmd.Parameters.AddWithValue(p.ParameterName, p); + } + sw1.Stop(); + cmd.Parameters.Clear(); + + sw2.Start(); + for (int i = 0; i < paramCount; i++) + { + IDbDataParameter p = cmd.CreateParameter(); + p.ParameterName = $"?param_{i}"; + p.DbType = DbType.String; + cmd.Parameters.Add(p); + } + sw2.Stop(); + Console.Write(sw2.Elapsed); + + Assert.That(sw1.Elapsed.TotalSeconds < 1); + Assert.That(sw2.Elapsed.TotalSeconds < 1); + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/PoolingTests.cs b/MySQL.Data/tests/MySql.Data.Tests/PoolingTests.cs new file mode 100644 index 000000000..2db1373ce --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/PoolingTests.cs @@ -0,0 +1,773 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Generic; +using System.Data; +using System.Net.NetworkInformation; +using System.Reflection; +using System.Threading; +using System.Threading.Tasks; + +namespace MySql.Data.MySqlClient.Tests +{ + public class PoolingTests : TestBase + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.Pooling = true; + } + + [Test] + public void BasicConnection() + { + + MySqlConnection c = new MySqlConnection(Settings.ConnectionString); + c.Open(); + int serverThread = c.ServerThread; + c.Close(); + + // first test that only a single connection get's used + for (int i = 0; i < 10; i++) + { + c = new MySqlConnection(Settings.ConnectionString); + c.Open(); + Assert.That(c.ServerThread, Is.EqualTo(serverThread)); + c.Close(); + } + + c.Open(); + KillConnection(c); + c.Close(); + + string poolingCS = Settings.ConnectionString + ";Min Pool Size=10"; + MySqlConnection[] connArray = new MySqlConnection[10]; + for (int i = 0; i < connArray.Length; i++) + { + connArray[i] = new MySqlConnection(poolingCS); + connArray[i].Open(); + } + + // now make sure all the server ids are different + for (int i = 0; i < connArray.Length; i++) + { + for (int j = 0; j < connArray.Length; j++) + { + if (i != j) + Assert.That(connArray[i].ServerThread != connArray[j].ServerThread); + } + } + + for (int i = 0; i < connArray.Length; i++) + { + KillConnection(connArray[i]); + connArray[i].Close(); + } + } + + [Test] + public void OpenKilled() + { + string connStr = Settings.ConnectionString + ";min pool size=1; max pool size=1"; + MySqlConnection c = new MySqlConnection(connStr); + c.Open(); + int threadId = c.ServerThread; + // thread gets killed right here + KillConnection(c); + c.Close(); + + c.Dispose(); + + c = new MySqlConnection(connStr); + c.Open(); + int secondThreadId = c.ServerThread; + KillConnection(c); + c.Close(); + Assert.That(threadId == secondThreadId, Is.False); + } + + [Test] + public void ReclaimBrokenConnection() + { + // now create a new connection string only allowing 1 connection in the pool + string connStr = Settings.ConnectionString + ";connectiontimeout=5;max pool size=1"; + + // now use up that connection + MySqlConnection c = new MySqlConnection(connStr); + c.Open(); + + // now attempting to open a connection should fail + MySqlConnection c2 = new MySqlConnection(connStr); + Exception ex = Assert.Throws(() => c2.Open()); + Assert.That(ex.Message, Does.Contain("error connecting: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool")); + + // we now kill the first connection to simulate a server stoppage + KillConnection(c); + + // now we do something on the first connection + + ex = Assert.Throws(() => c.ChangeDatabase("mysql")); + Assert.That(ex.Message, Does.Contain("The connection is not open")); + + // Opening a connection now should work + MySqlConnection connection = new MySqlConnection(connStr); + connection.Open(); + KillConnection(connection); + connection.Close(); + } + + [Test] + public void TestUserReset() + { + string connStr = Settings.ConnectionString + ";connection reset=true;"; + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + MySqlCommand cmd = new MySqlCommand("SET @testvar='5'", c); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT @testvar"; + object var = cmd.ExecuteScalar(); + Assert.That(var, Is.EqualTo("5")); + c.Close(); + + c.Open(); + object var2 = cmd.ExecuteScalar(); + Assert.That(var2, Is.EqualTo(DBNull.Value)); + KillConnection(c); + } + } + + // Test that thread does not come to pool after abort + [Test] + public void TestAbort() + { + string connStr = Settings.ConnectionString; + int threadId; + + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + threadId = c.ServerThread; + c.AbortAsync(false).GetAwaiter().GetResult(); + } + + using (MySqlConnection c1 = new MySqlConnection(connStr)) + { + c1.Open(); + Assert.That(c1.ServerThread != threadId); + KillConnection(c1); + } + } + + /// + /// Bug #25614 After connection is closed, and opened again UTF-8 characters are not read well + /// + [Test] + public void UTF8AfterClosing() + { + string originalValue = "??????????"; + ExecuteSQL("DROP TABLE IF EXISTS test"); + + + ExecuteSQL("CREATE TABLE test (id int(11) NOT NULL, " + + "value varchar(100) NOT NULL, PRIMARY KEY (`id`) " + + ") ENGINE=MyISAM DEFAULT CHARSET=utf8"); + + string connStr = Settings.ConnectionString + ";charset=utf8"; + using (MySqlConnection con = new MySqlConnection(connStr)) + { + con.Open(); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO test VALUES (1, '??????????')", con); + cmd.ExecuteNonQuery(); + + cmd = new MySqlCommand("SELECT value FROM test WHERE id = 1", con); + string firstS = cmd.ExecuteScalar().ToString(); + Assert.That(firstS, Is.EqualTo(originalValue)); + + con.Close(); + con.Open(); + + //Does not work: + cmd = new MySqlCommand("SELECT value FROM test WHERE id = 1", con); + string secondS = cmd.ExecuteScalar().ToString(); + + KillConnection(con); + con.Close(); + Assert.That(secondS, Is.EqualTo(firstS)); + } + } + + private void PoolingWorker(object cn) + { + MySqlConnection conn = (cn as MySqlConnection); + + Thread.Sleep(5000); + conn.Close(); + } + + /// + /// Bug #24373 High CPU utilization when no idle connection + /// + [Test] + public void MultipleThreads() + { + string connStr = Settings.ConnectionString + ";max pool size=1"; + MySqlConnection c = new MySqlConnection(connStr); + c.Open(); + + ParameterizedThreadStart pts = new ParameterizedThreadStart(PoolingWorker); + Thread t = new Thread(pts); + t.Start(c); + + using (MySqlConnection c2 = new MySqlConnection(connStr)) + { + c2.Open(); + KillConnection(c2); + } + c.Close(); + } + + [Test] + public void NewTest() + { + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE Test (id INT, name VARCHAR(50))"); + ExecuteSQL("CREATE PROCEDURE spTest(theid INT) BEGIN SELECT * FROM Test WHERE id=theid; END"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'First')"); + ExecuteSQL("INSERT INTO Test VALUES (2, 'Second')"); + ExecuteSQL("INSERT INTO Test VALUES (3, 'Third')"); + ExecuteSQL("INSERT INTO Test VALUES (4, 'Fourth')"); + + string connStr = Settings.ConnectionString; + + for (int i = 1; i < 5; i++) + { + using (MySqlConnection con = new MySqlConnection(connStr)) + { + con.Open(); + MySqlCommand reccmd = new MySqlCommand("spTest", con); + reccmd.CommandTimeout = 0; + reccmd.CommandType = CommandType.StoredProcedure; + MySqlParameter par = new MySqlParameter("@theid", MySqlDbType.String); + par.Value = i; + reccmd.Parameters.Add(par); + using (MySqlDataReader recdr = reccmd.ExecuteReader()) + { + if (recdr.Read()) + { + int x = recdr.GetOrdinal("name"); + Assert.That(x, Is.EqualTo(1)); + } + } + } + } + MySqlConnection c = new MySqlConnection(connStr); + c.Open(); + KillConnection(c); + } + + bool IsConnectionAlive(int serverThread) + { + MySqlCommand cmd = new MySqlCommand("SHOW PROCESSLIST", Connection); + using (MySqlDataReader dr = cmd.ExecuteReader()) + { + while (dr.Read()) + { + if (dr.GetInt64("id") == serverThread) + return true; + } + } + return false; + } + +#if CLR4 + [Test] + public void CleanIdleConnections() + { + string assemblyName = typeof(MySqlConnection).Assembly.FullName; + string pmName = String.Format("MySql.Data.MySqlClient.MySqlPoolManager, {0}", assemblyName); + + Type poolManager = Type.GetType(pmName, false); + FieldInfo poolManagerTimerField = poolManager.GetField("timer", + BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); + FieldInfo poolManagerMaxConnectionIdleTime = + poolManager.GetField("maxConnectionIdleTime", + BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); + + System.Threading.Timer poolManagerTimer = (System.Threading.Timer)poolManagerTimerField.GetValue(null); + int origMaxConnectionIdleTime = (int)poolManagerMaxConnectionIdleTime.GetValue(null); + + + try + { + // Normally, idle connection would expire after 3 minutes and would + // be cleaned up by timer that also runs every 3 minutes. + // Since we do not want to wait that long during a unit tests, + // we use tricks. + // - temporarily reduce max.idle time for connections down to 1 + // second + // - temporarily change cleanup timer to run each second. + isConnectionAlive = true; + threadId = -1; + string connStr = st.GetPoolingConnectionString(); + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + callbacksCount = 0; + threadId = c.ServerThread; + } + + // Pooled connection should be still alive + Assert.True(IsConnectionAlive(threadId)); + + poolManagerMaxConnectionIdleTime.SetValue(null, 3); + + int testIdleTime = (int)poolManagerMaxConnectionIdleTime.GetValue(null); + + poolManagerTimer.Change((testIdleTime * 1000) + 1000, (testIdleTime * 1000)); + + + //create a second timer to check just right after the first interval is completed + timer = new System.Timers.Timer((testIdleTime * 1000) + 1500); + + timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed); + timer.Enabled = true; + + // Let the idle connection expire and let cleanup timer run. + Thread.Sleep((testIdleTime * 1000) + 2000); + + // The removed of the iddle connections should be done in the first callback + Assert.True(callbacksCount == 1, "Callbacks value was not 1"); + + //Check the connection was removed + Assert.False(isConnectionAlive, "IsConnectionAlive failed"); + + } + finally + { + // restore values for connection idle time and timer interval + poolManagerMaxConnectionIdleTime.SetValue(null, origMaxConnectionIdleTime); + poolManagerTimer.Change(origMaxConnectionIdleTime * 1000, + origMaxConnectionIdleTime * 1000); + + timer = null; + } + } +#endif + + //[Test] + //public void ClearPool() + //{ + // // Start by clearing clearingPools for a clean test + // List clearingPools = GetClearingPools(); + // clearingPools.Clear(); + + // string connStr = st.GetPoolingConnectionString() + ";min pool size=10"; + // MySqlConnectionStringBuilder settings = new MySqlConnectionStringBuilder(connStr); + + // MySqlConnection[] connections = new MySqlConnection[10]; + // connections[0] = new MySqlConnection(connStr); + // connections[0].Open(); + + // Type poolManagerType = typeof(MySqlPoolManager); + // FieldInfo poolManagerHashTable = poolManagerType.GetField("pools", + // BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); + // Hashtable poolHash = (Hashtable)poolManagerHashTable.GetValue(null); + + // // now we need to investigate + // Type poolType = typeof(MySqlPool); + + // FieldInfo idlePool = poolType.GetField("idlePool", BindingFlags.NonPublic | BindingFlags.Instance); + // ICollection idleList = (ICollection)idlePool.GetValue(poolHash[settings.ConnectionString]); + // Debug.Print("Clear Pool test connection string 2 " + settings.ConnectionString); + // Assert.AreEqual(9, idleList.Count); + + // FieldInfo inUsePool = poolType.GetField("inUsePool", BindingFlags.NonPublic | BindingFlags.Instance); + // ICollection inUseList = (ICollection)inUsePool.GetValue(poolHash[settings.ConnectionString]); + // Assert.AreEqual(1, inUseList.Count); + + // // now open 4 more of these. Now we shoudl have 5 open and five + // // still in the pool + // for (int i = 1; i < 5; i++) + // { + // connections[i] = new MySqlConnection(connStr); + // connections[i].Open(); + // } + + // Assert.AreEqual(5, inUseList.Count); + // Assert.AreEqual(5, idleList.Count); + + // clearingPools = GetClearingPools(); + // Assert.AreEqual(0, clearingPools.Count); + + // // now tell this connection to clear its pool + // MySqlConnection.ClearPool(connections[0]); + // Assert.AreEqual(1, clearingPools.Count); + // Assert.AreEqual(0, idleList.Count); + + // for (int i = 0; i < 5; i++) + // connections[i].Close(); + // Assert.AreEqual(0, clearingPools.Count); + //} + + private static List GetClearingPools() + { + Type poolManagerType = typeof(MySqlPoolManager); + FieldInfo clearingPoolsFI = poolManagerType.GetField("clearingPools", + BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); + return clearingPoolsFI.GetValue(null) as List; + } + + [Test] + public void TestBadConnections() + { + MySqlConnectionStringBuilder builder = new + MySqlConnectionStringBuilder(); + + builder.Pooling = true; + builder.Server = "xxxxxxxx"; // one that definitely does not exist. + builder.UserID = "whoever"; + builder.Password = "whatever"; + + int numberOfConnections = 1; + + for (int i = 0; i < numberOfConnections; ++i) + { + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + Exception ex = Assert.Throws(() => connection.Open()); + if (Platform.IsWindows()) Assert.That(ex.InnerException.GetType() == typeof(ArgumentException)); + } + Thread.Sleep(50); + } + MySqlConnection.ClearAllPools(); + } + + /// + /// Bug #42801 ClearPool .Net connector : NullReferenceException + /// + [Test] + public void DoubleClearingConnectionPool() + { + MySqlConnection c1 = GetConnection(); + MySqlConnection c2 = GetConnection(); + c1.Close(); + c2.Close(); + MySqlConnection.ClearPool(c1); + MySqlConnection.ClearPool(c2); + } + + /// + /// Bug #49563 Mysql Client wrongly communications with server when using pooled connections + /// + [Test] + public void OpenSecondPooledConnectionWithoutDatabase() + { + string connectionString = Settings.ConnectionString; + + using (MySqlConnection c1 = new MySqlConnection(connectionString)) + { + c1.Open(); + c1.Close(); + } + using (MySqlConnection c2 = new MySqlConnection(connectionString)) + { + c2.Open(); + c2.Close(); + } + } + + /// + /// Bug #47153 Connector/NET fails to reset connection when encoding has changed + /// + [Test] + public void ConnectionResetAfterUnicode() + { + ExecuteSQL("DROP TABLE IF EXISTS test"); + ExecuteSQL("CREATE TABLE test (id INT, name VARCHAR(20) CHARSET UCS2)"); + ExecuteSQL("INSERT INTO test VALUES (1, 'test')"); + + string connStr = Settings.ConnectionString + ";connection reset=true;min pool size=1; max pool size=1"; + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + MySqlCommand cmd = new MySqlCommand("SELECT * FROM test", c); + using (MySqlDataReader r = cmd.ExecuteReader()) + { + r.Read(); + } + c.Close(); + + try + { + c.Open(); + } + finally + { + KillConnection(c); + } + } + } + + private void CacheServerPropertiesInternal(bool cache) + { + string connStr = Settings.ConnectionString + + String.Format(";logging=true;cache server properties={0}", cache); + + GenericListener listener = new GenericListener(); + MySqlTrace.Listeners.Add(listener); + MySqlTrace.Switch.Level = System.Diagnostics.SourceLevels.All; + + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + using (MySqlConnection c2 = new MySqlConnection(connStr)) + { + c2.Open(); + KillConnection(c2); + } + KillConnection(c); + } + int count = listener.CountLinesContaining("SHOW VARIABLES"); + Assert.That(count, Is.EqualTo(cache ? 1 : 2)); + } + + [Test] + public void CacheServerProperties() + { + //CacheServerPropertiesInternal(true); + //CacheServerPropertiesInternal(false); + } + + /// + /// Bug #66578 + /// CacheServerProperties can cause 'Packet too large' error + /// when query exceeds 1024 bytes + /// + [Test] + public void CacheServerPropertiesCausePacketTooLarge() + { + ExecuteSQL("DROP TABLE IF EXISTS test"); + ExecuteSQL("CREATE TABLE test (id INT(10), image BLOB)"); + + InsertSmallBlobInTestTableUsingPoolingConnection(); + InsertSmallBlobInTestTableUsingPoolingConnection(); + InsertSmallBlobInTestTableUsingPoolingConnection(); + + using (MySqlConnection c1 = new MySqlConnection(Settings.ConnectionString + ";logging=true;cache server properties=true")) + { + c1.Open(); + MySqlCommand cmd = new MySqlCommand("SELECT Count(*) from test", c1); + var count = cmd.ExecuteScalar(); + Assert.That(Convert.ToInt32(count), Is.EqualTo(3)); + } + + ExecuteSQL("DROP TABLE test "); + } + + /// + /// Util method for CacheServerPropertiesCausePacketTooLarge Test Method + /// + void InsertSmallBlobInTestTableUsingPoolingConnection() + { + string connStr = Settings.ConnectionString + + String.Format(";logging=true;cache server properties=true;"); + + using (MySqlConnection c1 = new MySqlConnection(connStr)) + { + c1.Open(); + byte[] image = Utils.CreateBlob(7152); + MySqlCommand cmd = new MySqlCommand("INSERT INTO test VALUES(NULL, ?image)", c1); + cmd.Parameters.AddWithValue("?image", image); + cmd.ExecuteNonQuery(); + } + } + + /// + /// Bug #37462116 + /// Connector/Net Not honouring MinPoolSize Configuration + /// + [Test] + public async Task MinPoolSizeNotCorrect() + { + int minPoolSize = 5; + var connectionString = $"server={Host};user={Settings.UserID};password={Settings.Password};port={Port};Max Pool Size=10;Min Pool Size={minPoolSize};sslmode=none;"; + + try + { + //change wait_timeout to force idle connections to close faster + using (var connection = new MySqlConnection(connectionString)) + { + connection.Open(); + using (var command = new MySqlCommand("SET GLOBAL wait_timeout = 10;", connection)) + { + command.ExecuteNonQuery(); + } + } + + //create connection pool using Min Pool Size of 5 + for (int i = 0; i < minPoolSize; i++) // Match MinPoolSize + { + using (var connection = new MySqlConnection(connectionString)) + { + connection.Open(); + using (var command = new MySqlCommand("SELECT CONNECTION_ID();", connection)) + { + command.ExecuteNonQuery(); + } + } + } + + //check that connection pool maintains the Min Pool Size + int cycleCounter = 0; + while (cycleCounter < minPoolSize * 2) + { + using (var connection = new MySqlConnection(connectionString)) + { + await connection.OpenAsync(); + + // Query all active connections + using (var command = new MySqlCommand("SHOW PROCESSLIST;", connection)) + using (var reader = await command.ExecuteReaderAsync()) + { + int connectionCount = 0; + + while (await reader.ReadAsync()) + { + //count the connections tied to the test user + string user = reader["User"].ToString(); + if (user == Settings.UserID) + { + connectionCount++; + } + } + // check that the ConnectionCount is equal or greater than the Min Pool Size + Assert.That(connectionCount, Is.GreaterThanOrEqualTo(minPoolSize)); + } + } + cycleCounter++; + await Task.Delay(2000); + } + } + finally + { + //change wait_timeout to default value; + using (var connection = new MySqlConnection(connectionString)) + { + connection.Open(); + using (var command = new MySqlCommand("SET GLOBAL wait_timeout = 28800;", connection)) + { + command.ExecuteNonQuery(); + } + } + } + } + + #region WL14389 + + [Test, Description("Check Pooling Connection works correctly")] + public void MultipleConnectionWithPooling() + { + var connectionString = $"server={Host};user={Settings.UserID};password={Settings.Password};port={Port};Max Pool Size=4;Min Pool Size=0;sslmode=none;connectiontimeout=5;"; + var myConnection1 = new MySqlConnection(connectionString); + var myConnection2 = new MySqlConnection(connectionString); + var myConnection3 = new MySqlConnection(connectionString); + var myConnection4 = new MySqlConnection(connectionString); + var myConnection5 = new MySqlConnection(connectionString); + + // Get a connection out of the pool. + myConnection1.Open(); + Assert.That(myConnection1.State, Is.EqualTo(ConnectionState.Open)); + // Get a second connection out of the pool. + myConnection2.Open(); + Assert.That(myConnection2.State, Is.EqualTo(ConnectionState.Open)); + // Open a third connection. + myConnection3.Open(); + Assert.That(myConnection3.State, Is.EqualTo(ConnectionState.Open)); + // Return the all connections to the pool. + myConnection1.Close(); + myConnection2.Close(); + myConnection3.Close(); + + // Open five connections. + myConnection1.Open(); + myConnection2.Open(); + myConnection3.Open(); + myConnection4.Open(); + Exception ex = Assert.Throws(() => myConnection5.Open()); + Assert.That(ex.Message, Does.Contain("Timeout")); + + myConnection1.Close(); + myConnection2.Close(); + myConnection3.Close(); + myConnection4.Close(); + + } + + /// + /// Bug 18665388 + /// + [Test, Description("Verify the connection is not in CLOSE_WAIT state after failed connection due to Connection Limit")] + public void CloseWaitScenario1() + { + Assume.That(Platform.IsWindows(), "This test is only for Windows OS"); + var poolSize = 5; + var connectionString = $"server={Host};user={Settings.UserID};database={Settings.Database};port={Port};password={Settings.Password};Pooling=true;Max Pool Size={poolSize};SSL Mode=None;ConnectionTimeout=5"; + List connectionList = new(); + using (var con = new MySqlConnection(connectionString)) + { + while (connectionList.Count < poolSize) + { + var newConn = new MySqlConnection(connectionString); + newConn.Open(); + connectionList.Add(newConn); + } + Assert.Throws(() => con.Open()); + var ipProperties = IPGlobalProperties.GetIPGlobalProperties(); + var endPoints = ipProperties.GetActiveTcpListeners(); + var tcpConnections = ipProperties.GetActiveTcpConnections(); + foreach (var info in tcpConnections) + if (info.LocalEndPoint.Address.ToString() == "127.0.0.1" && info.LocalEndPoint.Port.ToString() == Port.ToString()) + Assert.That(info.State.ToString() != "CLOSE_WAIT"); + } + foreach (var item in connectionList) + { + item.Close(); + item.Dispose(); + } + } + + #endregion WL14389 + + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/PreparedStatementCompressed.cs b/MySQL.Data/tests/MySql.Data.Tests/PreparedStatementCompressed.cs new file mode 100644 index 000000000..049abdd9a --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/PreparedStatementCompressed.cs @@ -0,0 +1,38 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +namespace MySql.Data.MySqlClient.Tests +{ + public class PreparedStatementsCompressed : PreparedStatements + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.UseCompression = true; + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/PreparedStatements.cs b/MySQL.Data/tests/MySql.Data.Tests/PreparedStatements.cs new file mode 100644 index 000000000..a58dbeb53 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/PreparedStatements.cs @@ -0,0 +1,958 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Data; +using System.Linq; + +namespace MySql.Data.MySqlClient.Tests +{ + public class PreparedStatements : TestBase + { + protected override void Cleanup() + { + ExecuteSQL(String.Format("DROP TABLE IF EXISTS `{0}`.Test", Connection.Database)); + } + + [Test] + public void Simple() + { + ExecuteSQL("CREATE TABLE Test (id INT, dec1 DECIMAL(5,2), name VARCHAR(100), year YEAR)"); + ExecuteSQL("INSERT INTO Test VALUES (1, 345.12, 'abcd', 2019)"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1,345.12,'abcd',2019)", Connection); + cmd.Prepare(); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM Test"; + cmd.Prepare(); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetInt32(0), Is.EqualTo(1)); + Assert.That(reader.GetDecimal(1), Is.EqualTo((decimal)345.12)); + Assert.That(reader.GetString(2), Is.EqualTo("abcd")); + Assert.That(reader.GetInt16(3), Is.EqualTo(2019)); + } + } + + [Test] + public void SimplePrepareBeforeParms() + { + ExecuteSQL("CREATE TABLE Test (one INTEGER, two INTEGER)"); + ExecuteSQL("INSERT INTO Test VALUES (1, 2)"); + + // create the command and prepare the statement + IDbCommand cmd = Connection.CreateCommand(); + cmd.CommandText = "SELECT * FROM Test WHERE one = ?p1"; + + // create the parameter + IDbDataParameter p1 = cmd.CreateParameter(); + p1.ParameterName = "?p1"; + p1.DbType = DbType.Int32; + p1.Precision = (byte)10; + p1.Scale = (byte)0; + p1.Size = 4; + cmd.Parameters.Add(p1); + p1.Value = 1; + + cmd.Prepare(); + // Execute the reader + using (IDataReader reader = cmd.ExecuteReader()) + { + // Fetch the first record + reader.Read(); + Assert.That(reader.GetInt32(0), Is.EqualTo(1)); + Assert.That(reader.GetInt32(1), Is.EqualTo(2)); + } + } + + [Test] + public void DateAndTimes() + { + + if (Version < new Version(5, 6)) + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, d DATE, dt DATETIME, tm TIME, ts TIMESTAMP, PRIMARY KEY(id))"); + else + ExecuteSQL(@"CREATE TABLE Test (id INT NOT NULL, d DATE, dt DATETIME, tm TIME(6), + ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY(id))"); + + string timeStampValue = "NULL"; + if (Version >= new Version(8, 0, 2)) timeStampValue = "NOW()"; + + string sql = "INSERT INTO Test VALUES(?id, ?d, ?dt, ?tm, " + timeStampValue + ")"; + MySqlCommand cmd = new MySqlCommand(sql, Connection); + + DateTime dt = DateTime.Now; + dt = dt.AddMilliseconds(dt.Millisecond * -1); + TimeSpan timeSp = new TimeSpan(8, 11, 44, 56, 501); + + cmd.Parameters.AddWithValue("?id", 1); + cmd.Parameters.AddWithValue("?d", dt); + cmd.Parameters.AddWithValue("?dt", dt); + cmd.Parameters.AddWithValue("?tm", timeSp); + cmd.Prepare(); + int count = cmd.ExecuteNonQuery(); + Assert.That(count == 1, "Records affected by insert"); + + cmd.CommandText = "SELECT * FROM Test"; + cmd.Prepare(); + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetInt32(0) == 1, "Id column"); + Assert.That(dt.Date == reader.GetDateTime(1).Date, "Date column"); + + DateTime dt2 = reader.GetDateTime(2); + Assert.That(dt2.Date, Is.EqualTo(dt.Date)); + Assert.That(dt2.Hour, Is.EqualTo(dt.Hour)); + Assert.That(dt2.Minute, Is.EqualTo(dt.Minute)); + Assert.That(dt2.Second, Is.EqualTo(dt.Second)); + + TimeSpan ts2 = reader.GetTimeSpan(3); + Assert.That(ts2.Days, Is.EqualTo(timeSp.Days)); + Assert.That(ts2.Hours, Is.EqualTo(timeSp.Hours)); + Assert.That(ts2.Minutes, Is.EqualTo(timeSp.Minutes)); + Assert.That(ts2.Seconds, Is.EqualTo(timeSp.Seconds)); + Assert.That(dt.Date == reader.GetDateTime(4).Date, "Timestamp column"); + } + } + + [Test] + public void ResetCommandText() + { + ExecuteSQL("CREATE TABLE Test (id int, name varchar(100))"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'Test')"); + + MySqlCommand cmd = new MySqlCommand("SELECT id FROM Test", Connection); + cmd.Prepare(); + object o = cmd.ExecuteScalar(); + Assert.That(o, Is.EqualTo(1)); + + cmd.CommandText = "SELECT name FROM Test"; + cmd.Prepare(); + o = cmd.ExecuteScalar(); + Assert.That(o, Is.EqualTo("Test")); + + } + + [Test] + public void DifferentParameterOrder() + { + ExecuteSQL("CREATE TABLE Test (id int NOT NULL AUTO_INCREMENT, " + + "id2 int NOT NULL, name varchar(50) DEFAULT NULL, " + + "id3 int DEFAULT NULL, PRIMARY KEY (id))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id, id2, name, id3) " + + "VALUES(?id, ?id2, ?name,?id3)", Connection); + + MySqlParameter id = new MySqlParameter(); + id.ParameterName = "?id"; + id.DbType = DbType.Int32; + id.Value = DBNull.Value; + + MySqlParameter id2 = new MySqlParameter(); + id2.ParameterName = "?id2"; + id2.DbType = DbType.Int32; + id2.Value = 2; + + MySqlParameter name = new MySqlParameter(); + name.ParameterName = "?name"; + name.DbType = DbType.String; + name.Value = "Test"; + + MySqlParameter id3 = new MySqlParameter(); + id3.ParameterName = "?id3"; + id3.DbType = DbType.Int32; + id3.Value = 3; + + cmd.Parameters.Add(id); + cmd.Parameters.Add(id2); + cmd.Parameters.Add(name); + cmd.Parameters.Add(id3); + cmd.Prepare(); + Assert.That(cmd.ExecuteNonQuery(), Is.EqualTo(1)); + + cmd.Parameters.Clear(); + + id3.Value = DBNull.Value; + name.Value = DBNull.Value; + cmd.Parameters.Add(id); + cmd.Parameters.Add(id2); + cmd.Parameters.Add(id3); + cmd.Parameters.Add(name); + + cmd.Prepare(); + Assert.That(cmd.ExecuteNonQuery(), Is.EqualTo(1)); + + cmd.CommandText = "SELECT id3 FROM Test WHERE id=1"; + Assert.That(cmd.ExecuteScalar(), Is.EqualTo(3)); + + cmd.CommandText = "SELECT name FROM Test WHERE id=2"; + Assert.That(cmd.ExecuteScalar(), Is.EqualTo(DBNull.Value)); + } + + [Test] + public void Blobs() + { + ExecuteSQL("CREATE TABLE Test (id INT, blob1 LONGBLOB, text1 LONGTEXT)"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?id, ?blob1, ?text1)", Connection); + + byte[] bytes = Utils.CreateBlob(400000); + string inStr = "This is my text"; + + cmd.Parameters.AddWithValue("?id", 1); + cmd.Parameters.AddWithValue("?blob1", bytes); + cmd.Parameters.AddWithValue("?text1", inStr); + cmd.Prepare(); + int count = cmd.ExecuteNonQuery(); + Assert.That(count, Is.EqualTo(1)); + + cmd.CommandText = "SELECT * FROM Test"; + cmd.Prepare(); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetInt32(0), Is.EqualTo(1)); + Assert.That(reader.GetBytes(1, 0, null, 0, 0), Is.EqualTo(bytes.Length)); + byte[] outBytes = new byte[bytes.Length]; + reader.GetBytes(1, 0, outBytes, 0, bytes.Length); + for (int x = 0; x < bytes.Length; x++) + Assert.That(outBytes[x], Is.EqualTo(bytes[x])); + Assert.That(reader.GetString(2), Is.EqualTo(inStr)); + } + } + + [Test] + public void SimpleTest2() + { + ExecuteSQL("CREATE TABLE Test (one integer, two integer, three integer, four integer, five integer, six integer, seven integer)"); + ExecuteSQL("INSERT INTO Test VALUES (1, 2, 3, 4, 5, 6, 7)"); + + // create the command and prepare the statement + IDbCommand cmd = Connection.CreateCommand(); + cmd.CommandText = "SELECT one, two, three, four, five, six, seven FROM Test"; + cmd.Prepare(); + // Execute the reader + using (IDataReader reader = cmd.ExecuteReader()) + { + // Fetch the first record + reader.Read(); + + Assert.That(reader.GetInt32(0), Is.EqualTo(1)); + Assert.That(reader.GetInt32(1), Is.EqualTo(2)); + Assert.That(reader.GetInt32(2), Is.EqualTo(3)); + Assert.That(reader.GetInt32(3), Is.EqualTo(4)); + Assert.That(reader.GetInt32(4), Is.EqualTo(5)); + Assert.That(reader.GetInt32(5), Is.EqualTo(6)); + Assert.That(reader.GetInt32(6), Is.EqualTo(7)); + } + } + + [Test] + [Ignore("Fix this")] + public void Bug6271() + { + MySqlCommand cmd = null; + string sql = null; + + // Updating the default charset for servers 8.0+. + if (Connection.driver.Version.isAtLeast(8, 0, 1)) + { + sql = "SET NAMES 'latin1' COLLATE 'latin1_swedish_ci'"; + cmd = new MySqlCommand(sql, Connection); + cmd.ExecuteNonQuery(); + } + + // Create the table again + ExecuteSQL("CREATE TABLE `Test2` (id INT unsigned NOT NULL auto_increment, " + + "`xpDOSG_Name` text,`xpDOSG_Desc` text, `Avatar` MEDIUMBLOB, `dtAdded` DATETIME, `dtTime` TIMESTAMP, " + + "PRIMARY KEY(id)) ENGINE=InnoDB DEFAULT CHARSET=latin1"); + + sql = "INSERT INTO `Test2` (`xpDOSG_Name`,`dtAdded`, `xpDOSG_Desc`,`Avatar`, `dtTime`) " + + "VALUES(?name, ?dt, ?desc, ?avatar, NULL)"; + + cmd = new MySqlCommand(sql, Connection); + + DateTime dt = DateTime.Now; + dt = dt.AddMilliseconds(dt.Millisecond * -1); + + byte[] xpDOSG_Avatar = Utils.CreateBlob(13000); + cmd.Parameters.AddWithValue("?name", "Ceci est un nom"); + + cmd.Parameters.AddWithValue("?desc", "Ceci est une description facile à plantouiller"); + cmd.Parameters.AddWithValue("?avatar", xpDOSG_Avatar); + cmd.Parameters.AddWithValue("?dt", dt); + cmd.Prepare(); + int count = cmd.ExecuteNonQuery(); + Assert.That(count, Is.EqualTo(1)); + + cmd.CommandText = "SELECT * FROM Test2"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetString(1), Is.EqualTo("Ceci est un nom")); + Assert.That(reader.GetDateTime(4).ToString("G"), Is.EqualTo(dt.ToString("G"))); + Assert.That(reader.GetString(2), Is.EqualTo("Ceci est une description facile à plantouiller")); + + long len = reader.GetBytes(3, 0, null, 0, 0); + Assert.That(len, Is.EqualTo(xpDOSG_Avatar.Length)); + byte[] outBytes = new byte[len]; + reader.GetBytes(3, 0, outBytes, 0, (int)len); + + for (int x = 0; x < xpDOSG_Avatar.Length; x++) + Assert.That(outBytes[x], Is.EqualTo(xpDOSG_Avatar[x])); + } + } + + [Test] + public void SimpleTest() + { + ExecuteSQL("CREATE TABLE Test (one integer, two integer )"); + ExecuteSQL("INSERT INTO Test VALUES( 1, 2)"); + // create the command and prepare the statement + IDbCommand cmd = Connection.CreateCommand(); + cmd.CommandText = "SELECT * FROM Test where one = ?p1"; + // create the parameter + IDbDataParameter p1 = cmd.CreateParameter(); + p1.ParameterName = "?p1"; + p1.DbType = DbType.Int32; + p1.Precision = (byte)10; + p1.Scale = (byte)0; + p1.Size = 4; + cmd.Parameters.Add(p1); + // prepare the command + cmd.Prepare(); + // set the parameter value + p1.Value = 1; + // Execute the reader + IDataReader reader = null; + reader = cmd.ExecuteReader(); + // Fetch the first record + reader.Read(); + if (reader != null) reader.Close(); + + } + + /// + /// Bug #13662 Prepare() truncates accented character input + /// + [Test] + public void InsertAccentedCharacters() + { + ExecuteSQL("CREATE TABLE Test (id INT UNSIGNED NOT NULL PRIMARY KEY " + + "AUTO_INCREMENT, input TEXT NOT NULL) CHARACTER SET UTF8"); + // COLLATE " + + //"utf8_bin"); + using (MySqlConnection conn2 = new MySqlConnection(Connection.ConnectionString + + ";charset=utf8")) + { + conn2.Open(); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test(input) " + + "VALUES (?input) ON DUPLICATE KEY UPDATE " + + "id=LAST_INSERT_ID(id)", conn2); + cmd.Parameters.Add(new MySqlParameter("?input", "")); + cmd.Prepare(); + cmd.Parameters[0].Value = "irache martínez@yahoo.es aol.com"; + cmd.ExecuteNonQuery(); + + MySqlCommand cmd2 = new MySqlCommand("SELECT input FROM Test", conn2); + Assert.That(cmd2.ExecuteScalar(), Is.EqualTo("irache martínez@yahoo.es aol.com")); + } + } + + /// + /// Bug #13541 Prepare breaks if a parameter is used more than once + /// + [Test] + public void UsingParametersTwice() + { + ExecuteSQL(@"CREATE TABLE IF NOT EXISTS Test (input TEXT NOT NULL, + UNIQUE (input(100)), state INT NOT NULL, score INT NOT NULL)"); + + MySqlCommand cmd = new MySqlCommand(@"Insert into Test (input, + state, score) VALUES (?input, ?st, ?sc) ON DUPLICATE KEY + UPDATE state=state|?st;", Connection); + cmd.Parameters.Add(new MySqlParameter("?input", "")); + cmd.Parameters.Add(new MySqlParameter("?st", Convert.ToInt32(0))); + cmd.Parameters.Add(new MySqlParameter("?sc", Convert.ToInt32(0))); + cmd.Prepare(); + + cmd.Parameters["?input"].Value = "test"; + cmd.Parameters["?st"].Value = 1; + cmd.Parameters["?sc"].Value = 42; + int result = cmd.ExecuteNonQuery(); + Assert.That(result, Is.EqualTo(1)); + + MySqlCommand cmd2 = new MySqlCommand("SELECT * FROM Test", Connection); + using (var reader = cmd2.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetString("input"), Is.EqualTo("test")); + Assert.That(reader.GetValue(reader.GetOrdinal("state")), Is.EqualTo(1)); + Assert.That(reader.GetValue(reader.GetOrdinal("score")), Is.EqualTo(42)); + + Assert.That(reader.Read(), Is.False); + } + } + + /// + /// Bug #19261 Supplying Input Parameters + /// + [Test] + public void MoreParametersOutOfOrder() + { + ExecuteSQL("CREATE TABLE `Test` (`BlockListID` int(11) NOT NULL auto_increment, " + + "`SubscriberID` int(11) NOT NULL, `Phone` varchar(50) default NULL, " + + "`ContactID` int(11) default NULL, " + + "`AdminJunk` tinyint(1) NOT NULL default '0', " + + "PRIMARY KEY (`BlockListID`), KEY `SubscriberID` (`SubscriberID`))"); + + IDbCommand cmd = Connection.CreateCommand(); + cmd.CommandText = "INSERT INTO `Test`(`SubscriberID`,`Phone`,`ContactID`, " + + "`AdminJunk`) VALUES (?SubscriberID,?Phone,?ContactID, ?AdminJunk);"; + + MySqlParameter oParameterSubscriberID = new MySqlParameter(); + oParameterSubscriberID.ParameterName = "?SubscriberID"; + oParameterSubscriberID.DbType = DbType.Int32; + oParameterSubscriberID.Value = 1; + + MySqlParameter oParameterPhone = new MySqlParameter(); + oParameterPhone.ParameterName = "?Phone"; + oParameterPhone.DbType = DbType.String; + oParameterPhone.Value = DBNull.Value; + + MySqlParameter oParameterContactID = new MySqlParameter(); + oParameterContactID.ParameterName = "?ContactID"; + oParameterContactID.DbType = DbType.Int32; + oParameterContactID.Value = DBNull.Value; + + MySqlParameter oParameterAdminJunk = new MySqlParameter(); + oParameterAdminJunk.ParameterName = "?AdminJunk"; + oParameterAdminJunk.DbType = DbType.Boolean; + oParameterAdminJunk.Value = true; + + cmd.Parameters.Add(oParameterSubscriberID); + cmd.Parameters.Add(oParameterPhone); + cmd.Parameters.Add(oParameterAdminJunk); + cmd.Parameters.Add(oParameterContactID); + + cmd.Prepare(); + int cnt = cmd.ExecuteNonQuery(); + Assert.That(cnt, Is.EqualTo(1)); + } + + /// + /// Bug #16627 Index and length must refer to a location within the string." when executing c + /// + [Test] + public void ParameterLengths() + { + ExecuteSQL("CREATE TABLE Test (id int, name VARCHAR(255))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?id, ?name)", Connection); + cmd.Parameters.Add("?id", MySqlDbType.Int32); + cmd.Parameters.Add("?name", MySqlDbType.VarChar); + cmd.Parameters[1].Size = 255; + cmd.Prepare(); + + cmd.Parameters[0].Value = 1; + cmd.Parameters[1].Value = "short string"; + cmd.ExecuteNonQuery(); + + MySqlCommand cmd2 = new MySqlCommand("SELECT * FROM Test", Connection); + using (var reader = cmd2.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetValue(reader.GetOrdinal("id")), Is.EqualTo(1)); + Assert.That(reader.GetString("name"), Is.EqualTo("short string")); + + Assert.That(reader.Read(), Is.False); + } + } + + /// + /// Bug #18570 Unsigned tinyint (NET byte) incorrectly determined param type from param val + /// + [Test] + public void UnsignedTinyInt() + { + ExecuteSQL("CREATE TABLE Test(ID TINYINT UNSIGNED NOT NULL, " + + "Name VARCHAR(50) NOT NULL, PRIMARY KEY (ID), UNIQUE (ID), " + + "UNIQUE (Name))"); + ExecuteSQL("INSERT INTO Test VALUES ('127', 'name1')"); + ExecuteSQL("INSERT INTO Test VALUES ('128', 'name2')"); + ExecuteSQL("INSERT INTO Test VALUES ('255', 'name3')"); + + string sql = " SELECT count(*) FROM Test WHERE ID = ?id"; + + MySqlCommand command = new MySqlCommand(); + command.CommandText = sql; + command.CommandType = CommandType.Text; + command.Connection = (MySqlConnection)Connection; + + command.Parameters.AddWithValue("?id", (byte)127); + command.Prepare(); + int count = Convert.ToInt32(command.ExecuteScalar()); + Assert.That(count, Is.EqualTo(1)); + + command.Parameters.Clear(); + command.Parameters.AddWithValue("?id", (byte)128); + count = Convert.ToInt32(command.ExecuteScalar()); + Assert.That(count, Is.EqualTo(1)); + + command.Parameters.Clear(); + command.Parameters.AddWithValue("?id", (byte)255); + count = Convert.ToInt32(command.ExecuteScalar()); + Assert.That(count, Is.EqualTo(1)); + + command.Parameters.Clear(); + command.Parameters.AddWithValue("?id", "255"); + count = Convert.ToInt32(command.ExecuteScalar()); + Assert.That(count, Is.EqualTo(1)); + } + + /// + /// Bug #16934 Unsigned values > 2^63 (UInt64) cannot be used in prepared statements + /// + [Test] + public void UnsignedValues() + { + ExecuteSQL("CREATE TABLE Test (ulVal BIGINT UNSIGNED, lVal INT UNSIGNED, " + + "mVal MEDIUMINT UNSIGNED, sVal SMALLINT UNSIGNED)"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?ulVal, " + + "?lVal, ?mVal, ?sVal)", Connection); + cmd.Parameters.Add("?ulVal", MySqlDbType.UInt64); + cmd.Parameters.Add("?lVal", MySqlDbType.UInt32); + cmd.Parameters.Add("?mVal", MySqlDbType.UInt24); + cmd.Parameters.Add("?sVal", MySqlDbType.UInt16); + cmd.Prepare(); + cmd.Parameters[0].Value = UInt64.MaxValue; + cmd.Parameters[1].Value = UInt32.MaxValue; + cmd.Parameters[2].Value = 16777215; + cmd.Parameters[3].Value = UInt16.MaxValue; + Assert.That(cmd.ExecuteNonQuery(), Is.EqualTo(1)); + cmd.CommandText = "SELECT * FROM Test"; + cmd.CommandType = CommandType.Text; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetUInt64(0), Is.EqualTo(UInt64.MaxValue)); + Assert.That(reader.GetUInt32(1), Is.EqualTo(UInt32.MaxValue)); + Assert.That(Convert.ToInt32(reader.GetUInt32(2)), Is.EqualTo(16777215)); + Assert.That(reader.GetUInt16(3), Is.EqualTo(UInt16.MaxValue)); + } + } + + [Test] + /// + /// Bug #29959124 PREPARED COMMANDS EXECUTE WITH ERROR ON MYSQL SERVER + /// Above bug, was introduced in ConnectorNet as result of change on MySQL Server + /// Released in version 8.0.13, fixing Bug#27591525 - commit 69e990f35449bbc493ae9df2b2ed83ac62ed1720 + /// + public void PreparedStmtJsonParamBug() + { + if (Version < new Version(8, 0)) return; + ExecuteSQL(@"CREATE TABLE `example` ( + `one` varchar(26) NOT NULL, + `two` int(1) NOT NULL, + `three` int(1) NOT NULL, + `four` tinyint(1) NOT NULL, + `five` json NOT NULL, + `six` datetime DEFAULT NULL, + PRIMARY KEY(`one`) + ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci"); + + ExecuteSQL(@"INSERT INTO `example` (`one`, `two`, `three`, `four`, `five`, `six`) + VALUES ('test', '9', '8', '0', '{""name"":""test""}', '2018-07-09 22:30:13')"); + + using (var cmd = new MySqlCommand("UPDATE example SET two = @Two, three = @Three, four = @Four, five = @Five, six = @Six WHERE one = @One", Connection)) + { + cmd.Parameters.AddWithValue("@Two", 0).MySqlDbType = MySqlDbType.Int32; + cmd.Parameters.AddWithValue("@Three", 0).MySqlDbType = MySqlDbType.Int32; + cmd.Parameters.AddWithValue("@Four", false).MySqlDbType = MySqlDbType.Byte; + cmd.Parameters.AddWithValue("@Five", "[]").MySqlDbType = MySqlDbType.JSON; + cmd.Parameters.AddWithValue("@Six", DateTime.Now).MySqlDbType = MySqlDbType.DateTime; + cmd.Parameters.AddWithValue("@One", "test").MySqlDbType = MySqlDbType.VarChar; + cmd.Prepare(); + var result = cmd.ExecuteNonQuery(); + Assert.That(result, Is.EqualTo(1)); + } + } + + /// + /// Bug #18391 Better error handling for the .NET class "MySqlCommand" needed. + /// + [Test] + public void PrepareEmptyString() + { + MySqlCommand cmd = new MySqlCommand("", Connection); + cmd.Prepare(); + Exception ex = Assert.Throws(() => cmd.ExecuteNonQuery()); + Assert.That(ex.Message, Is.EqualTo("The CommandText property has not been properly initialized")); + } + + /// + /// Bug #14115 Prepare() with compound statements breaks + /// + [Test] + public void CompoundStatements() + { + ExecuteSQL("CREATE TABLE IF NOT EXISTS Test (" + + "id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT," + + "test1 INT UNSIGNED, test2 INT UNSIGNED)"); + + MySqlCommand cmd = Connection.CreateCommand(); + cmd.CommandText = "INSERT INTO Test VALUES (NULL, ?t1, ?t2);" + + "SELECT last_insert_id()"; + cmd.Parameters.Add("?t1", MySqlDbType.Int32); + cmd.Parameters.Add("?t2", MySqlDbType.Int32); + Exception ex = Assert.Throws(() => cmd.Prepare()); + Assert.That(ex.Message, Does.Contain("You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version")); + } + + [Test] + public void SchemaOnly() + { + ExecuteSQL("CREATE TABLE Test (id INT, name VARCHAR(50))"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", Connection); + cmd.Prepare(); + using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly)) + { + reader.Read(); + } + } + + private int GetPreparedStatementCount() + { + MySqlCommand cmd = new MySqlCommand("SHOW GLOBAL STATUS LIKE 'Prepared%'", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + string s = reader.GetString(1); + return Int32.Parse(s); + } + } + + [Test] + public void ClosingCommandsProperly() + { + ExecuteSQL("CREATE TABLE Test (id INT, name VARCHAR(50))"); + + string connStr = Connection.ConnectionString; + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + + int initialCount = GetPreparedStatementCount(); + + for (int i = 0; i < 10; i++) + { + using (MySqlCommand cmd = + new MySqlCommand("INSERT INTO Test VALUES (?id, ?name)", c)) + { + cmd.Parameters.Add("?id", MySqlDbType.Int32); + cmd.Parameters.Add("?name", MySqlDbType.VarChar); + cmd.Prepare(); + cmd.Parameters[0].Value = i; + cmd.Parameters[1].Value = "foobar"; + cmd.ExecuteNonQuery(); + } + } + c.Ping(); + Assert.That(GetPreparedStatementCount(), Is.EqualTo(initialCount)); + } + } + + /// + /// Bug #37968 Prepared statements byte/tinyint causes data corruption. + /// + [Test] + public void InsertingUnsignedTinyInt() + { + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL(@"CREATE TABLE Test(id TINYINT UNSIGNED NOT NULL, + id2 INT UNSIGNED, id3 TINYINT UNSIGNED, id4 INT UNSIGNED NOT NULL)"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?id, ?id2, ?id3, ?id4)", Connection); + cmd.Parameters.Add("?id", MySqlDbType.UByte); + cmd.Parameters.Add("?id2", MySqlDbType.UByte); + cmd.Parameters.Add("?id3", MySqlDbType.UByte); + cmd.Parameters.Add("?id4", MySqlDbType.UByte); + cmd.Prepare(); + + cmd.Parameters[0].Value = 127; + cmd.Parameters[1].Value = 1; + cmd.Parameters[2].Value = 2; + cmd.Parameters[3].Value = 3; + cmd.ExecuteNonQuery(); + + MySqlCommand cmd2 = new MySqlCommand("SELECT * FROM Test", Connection); + using (var reader = cmd2.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(Convert.ToInt32(reader.GetValue(0)), Is.EqualTo(127)); + Assert.That(Convert.ToInt32(reader.GetValue(1)), Is.EqualTo(1)); + Assert.That(Convert.ToInt32(reader.GetValue(2)), Is.EqualTo(2)); + Assert.That(Convert.ToInt32(reader.GetValue(3)), Is.EqualTo(3)); + + Assert.That(reader.Read(), Is.False); + } + } + + /// + /// Bug #39275 Inserting negative time value through the use of MySqlParameter throws exception + /// Bug #39294 Reading negative time value greater than -01:00:00 return positive value + /// + [Test] + public void NegativeTimePrepared() + { + NegativeTime(true); + ReadNegativeTime(true); + } + + /// + /// Bug #39275 Inserting negative time value through the use of MySqlParameter throws exception + /// Bug #39294 Reading negative time value greater than -01:00:00 return positive value + /// + [Test] + public void NegativeTimeNonPrepared() + { + NegativeTime(false); + ReadNegativeTime(false); + } + + internal void NegativeTime(bool prepared) + { + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL(@"CREATE TABLE Test(id int, t time)"); + + MySqlCommand cmd = new MySqlCommand(@"INSERT INTO Test VALUES (1, @t)", Connection); + cmd.Parameters.Add("@t", MySqlDbType.Time); + + TimeSpan[] times = new TimeSpan[8] { + new TimeSpan(-10, 0, 0), new TimeSpan(2, -5, 10, 20), + new TimeSpan(20, -10, 10), new TimeSpan(0, -15, 25), + new TimeSpan(-4, -10, 20, -10), new TimeSpan(3, 17, 23, 6), + new TimeSpan(-1,-2,-3,-4), new TimeSpan(0,0,0,-15) }; + if (prepared) + cmd.Prepare(); + foreach (TimeSpan ts in times) + { + cmd.Parameters[0].Value = ts; + cmd.ExecuteNonQuery(); + } + + cmd.CommandText = "SELECT * FROM Test"; + cmd.Parameters.Clear(); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + foreach (TimeSpan ts in times) + { + reader.Read(); + TimeSpan t = reader.GetTimeSpan(1); + Assert.That(t, Is.EqualTo(ts)); + } + } + } + + private void ReadNegativeTime(bool prepared) + { + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE Test(id int, t time)"); + ExecuteSQL("INSERT INTO Test VALUES (1, '-00:10:00')"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", Connection); + if (prepared) + cmd.Prepare(); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + TimeSpan ts = reader.GetTimeSpan(1); + Assert.That(ts.Hours, Is.EqualTo(0)); + Assert.That(ts.Minutes, Is.EqualTo(-10)); + Assert.That(ts.Seconds, Is.EqualTo(0)); + } + } + + /// + /// Bug #28383726 00:00:00 IS CONVERTED TO NULL WITH PREPARED COMMAND + /// + [Test] + public void ZeroTimePrepared() + { + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL(@"CREATE TABLE Test(id int, t time NOT NULL)"); + ExecuteSQL(@"INSERT INTO Test VALUES(1, 0)"); + + MySqlCommand cmd = new MySqlCommand(@"SELECT t FROM Test", Connection); + cmd.Prepare(); + + using (var reader = cmd.ExecuteReader()) + { + reader.Read(); + var t = reader.GetValue(0); + Assert.That(t.ToString(), Is.EqualTo("00:00:00")); + + TimeSpan timeSpan = reader.GetTimeSpan(0); + Assert.That(timeSpan.Hours, Is.EqualTo(0)); + Assert.That(timeSpan.Minutes, Is.EqualTo(0)); + Assert.That(timeSpan.Seconds, Is.EqualTo(0)); + } + } + + + [Test] + public void SprocOutputParams() + { + ExecuteSQL("CREATE PROCEDURE spOutTest(id INT, OUT age INT) BEGIN SET age=id; END"); + + MySqlCommand cmd = new MySqlCommand("spOutTest", Connection); + cmd.Parameters.Add("@id", MySqlDbType.Int32); + cmd.Parameters.Add("@age", MySqlDbType.Int32).Direction = ParameterDirection.Output; + cmd.CommandType = CommandType.StoredProcedure; + cmd.Prepare(); + + cmd.Parameters[0].Value = 20; + Assert.That(cmd.ExecuteNonQuery(), Is.EqualTo(0)); + Assert.That(cmd.Parameters[1].Value, Is.EqualTo(20)); + + ExecuteSQL("DROP PROCEDURE IF EXISTS spOutTest"); + ExecuteSQL("CREATE PROCEDURE spOutTest(id INT, OUT age INT) BEGIN SET age=age*2; END"); + + cmd.Parameters[0].Value = 1; + cmd.Parameters[1].Value = 20; + Assert.That(cmd.ExecuteNonQuery(), Is.EqualTo(0)); + + Assert.That(cmd.Parameters[1].Value, Is.InstanceOf()); + } + + + [Test] + public void SprocInputOutputParams() + { + ExecuteSQL("CREATE PROCEDURE spInOutTest(id INT, INOUT age INT) BEGIN SET age=age*2; END"); + + MySqlCommand cmd = new MySqlCommand("spInOutTest", Connection); + cmd.Parameters.Add("@id", MySqlDbType.Int32); + cmd.Parameters.Add("@age", MySqlDbType.Int32).Direction = ParameterDirection.InputOutput; + cmd.CommandType = CommandType.StoredProcedure; + cmd.Prepare(); + + cmd.Parameters[0].Value = 1; + cmd.Parameters[1].Value = 20; + Assert.That(cmd.ExecuteNonQuery(), Is.EqualTo(0)); + Assert.That(cmd.Parameters[1].Value, Is.EqualTo(40)); + } + + /// + /// Bug #49794 MySqlDataReader.GetUInt64 doesn't work for large BIGINT UNSIGNED + /// + [Test] + public void BigIntUnsigned() + { + ExecuteSQL("DROP TABLE IF EXISTS test"); + ExecuteSQL(@"CREATE TABLE test(id int(10) unsigned NOT NULL, testValue bigint(20) unsigned NOT NULL, + PRIMARY KEY USING BTREE (Id)) ENGINE=InnoDB DEFAULT CHARSET=latin1"); + ExecuteSQL("INSERT INTO test(Id,TestValue) VALUES(1, 3000000000)"); + + MySqlCommand cmd = new MySqlCommand("SELECT testValue FROM test WHERE id=@id", Connection); + cmd.Parameters.Add("@id", MySqlDbType.UInt32); + cmd.Prepare(); + + cmd.Parameters["@id"].Value = 1; + using (MySqlDataReader rdr = cmd.ExecuteReader()) + { + rdr.Read(); + UInt64 v = rdr.GetUInt64(0); + Assert.That(v, Is.EqualTo(3000000000)); + } + } + + /// + /// Server Bug + /// Bug #31667061 - INCONSISTENT BEHAVIOR OF @@SQL_SELECT_LIMIT WITH PREPARED STATEMENTS + /// + [Test] + public void InconsistentBehaviorForSelectLimit() + { + ExecuteSQL("CREATE TABLE Test (id INT)"); + ExecuteSQL("INSERT INTO Test VALUES (1), (2), (3)"); + ExecuteSQL("set @@sql_select_limit=1"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test WHERE id > ?p1", Connection); + cmd.Parameters.AddWithValue("?p1", 0); + cmd.Prepare(); + + ExecuteSQL("set @@sql_select_limit=DEFAULT"); + + using (MySqlDataReader result = cmd.ExecuteReader()) + { + int rows = 0; + while (result.Read()) + rows += 1; + Assert.That(rows, Is.EqualTo(3)); + } + } + + /// + /// Bug #33827735 ["Incorrect arguments to mysqld_stmt_execute" with MySqlDbType.Enum] + /// + [Test] + public void MySqlDbTypeEnumParameter() + { + ExecuteSQL("CREATE TABLE Test(data ENUM('small', 'medium', 'large'));"); + + string[] dataEnum = new string[] { "small", "medium", "large" }; + + using var command = new MySqlCommand("INSERT INTO Test(data) VALUES (@data),(@data2),(@data3);", Connection); + var parameter = new MySqlParameter("@data", MySqlDbType.Enum); + parameter.Value = "medium"; + command.Parameters.Add(parameter); + parameter = new MySqlParameter("@data2", MySqlDbType.Enum); + parameter.Value = 1; + command.Parameters.Add(parameter); + parameter = new MySqlParameter("@data3", "large"); + command.Parameters.Add(parameter); + command.Prepare(); + command.ExecuteNonQuery(); + + command.CommandText = "SELECT * FROM Test"; + using var reader = command.ExecuteReader(); + while (reader.Read()) + Assert.That(dataEnum.Contains(reader.GetString(0))); + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Properties/AssemblyInfo.cs b/MySQL.Data/tests/MySql.Data.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..9a48da313 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,82 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Reflection; +using System.Security; +using NUnit.Framework; + +// +// 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. +// +[assembly: AssemblyTitle("MySql.Data.Tests Class Library")] +[assembly: AssemblyDescription("Test fixtures for MySQL Connector/NET")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Oracle")] +[assembly: AssemblyProduct("MySql.Data.Tests")] +[assembly: AssemblyCopyright("Copyright © 2004, 2025, Oracle and/or its affiliates.")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// + +[assembly: AllowPartiallyTrustedCallers] +[assembly: SecurityRules(SecurityRuleSet.Level1)] +[assembly: NonParallelizable] + +//[assembly: InternalsVisibleTo("MySql.Data.MySqlClient, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] +//[assembly: InternalsVisibleTo("MySql.Data.Entity.Tests, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] +//[assembly: InternalsVisibleTo("MySql.Data.Entity.CodeFirst.Tests, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] +//[assembly: InternalsVisibleTo("MySql.Web.Tests, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] +//[assembly: InternalsVisibleTo("MySql.Data.Entity.Migrations.Tests, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] +//[assembly: InternalsVisibleTo("MySql.Data.Tests.Stress, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] diff --git a/MySQL.Data/tests/MySql.Data.Tests/Resources/image1.jpg b/MySQL.Data/tests/MySql.Data.Tests/Resources/image1.jpg new file mode 100644 index 000000000..3e037f115 Binary files /dev/null and b/MySQL.Data/tests/MySql.Data.Tests/Resources/image1.jpg differ diff --git a/MySQL.Data/tests/MySql.Data.Tests/Resources/mtr.keytab b/MySQL.Data/tests/MySql.Data.Tests/Resources/mtr.keytab new file mode 100644 index 000000000..e62515972 Binary files /dev/null and b/MySQL.Data/tests/MySql.Data.Tests/Resources/mtr.keytab differ diff --git a/MySQL.Data/tests/MySql.Data.Tests/Resources/my.ini b/MySQL.Data/tests/MySql.Data.Tests/Resources/my.ini new file mode 100644 index 000000000..9cc75dd70 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Resources/my.ini @@ -0,0 +1,31 @@ +[mysqld] +basedir=pathToYourMySQLCommercialServer +datadir=pathToYourMySQLCommercialServer\\data +log-error=pathToYourMySQLCommercialServer\\data\\error.log +log_error_verbosity=3 + +plugin-load-add=authentication_ldap_simple.dll +authentication_ldap_simple_server_host=100.103.18.98 +authentication_ldap_simple_bind_base_dn="dc=MYSQL,dc=local" +authentication_ldap_simple_log_status=5 +authentication_ldap_simple_group_search_attr='cn' +authentication_ldap_simple_auth_method_name='simple' +authentication_ldap_simple_user_search_attr='cn' + +### SCRAM-SHA-1 +plugin-load-add=authentication_ldap_sasl.dll +authentication_ldap_sasl_server_host=10.172.166.126 +authentication_ldap_sasl_bind_base_dn="dc=my-domain,dc=com" +authentication_ldap_sasl_auth_method_name='SCRAM-SHA-1' +authentication_ldap_sasl_log_status=6 +authentication_ldap_sasl_group_search_attr='' +authentication_ldap_sasl_user_search_attr='cn' + +### SCRAM-SHA-256 +plugin-load-add=authentication_ldap_sasl.dll +authentication_ldap_sasl_server_host=100.103.19.5 +authentication_ldap_sasl_bind_base_dn="dc=my-domain,dc=com" +authentication_ldap_sasl_auth_method_name='SCRAM-SHA-256' +authentication_ldap_sasl_log_status=6 +authentication_ldap_sasl_group_search_attr='' +authentication_ldap_sasl_user_search_attr='cn' diff --git a/MySQL.Data/tests/MySql.Data.Tests/ScriptExecution.cs b/MySQL.Data/tests/MySql.Data.Tests/ScriptExecution.cs new file mode 100644 index 000000000..8df02c17a --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/ScriptExecution.cs @@ -0,0 +1,342 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Text; +using System.Threading.Tasks; +using NUnit.Framework; +using NUnit.Framework.Legacy; + +namespace MySql.Data.MySqlClient.Tests +{ + public class ScriptExecution : TestBase + { + private int statementCount; + + private string statementTemplate1 = @"CREATE PROCEDURE `spTest1-{0}`() NOT DETERMINISTIC + CONTAINS SQL SQL SECURITY DEFINER COMMENT '' + BEGIN + SELECT 1,2,3; + END{1}"; + + [Test] + public void ExecuteScriptWithProcedures() + { + statementCount = 0; + string scriptText = String.Empty; + for (int i = 0; i < 10; i++) + { + scriptText += String.Format(statementTemplate1, i, "$$"); + } + MySqlScript script = new MySqlScript(scriptText); + script.StatementExecuted += new MySqlStatementExecutedEventHandler(ExecuteScriptWithProcedures_QueryExecuted); + script.Connection = Connection; + script.Delimiter = "$$"; + int count = script.Execute(); + Assert.That(count, Is.EqualTo(10)); + + MySqlCommand cmd = new MySqlCommand( + String.Format(@"SELECT COUNT(*) FROM information_schema.routines WHERE + routine_schema = '{0}' AND routine_name LIKE 'spTest1-%'", + Connection.Database), Connection); + Assert.That(Convert.ToInt32(cmd.ExecuteScalar()), Is.EqualTo(10)); + } + + void ExecuteScriptWithProcedures_QueryExecuted(object sender, MySqlScriptEventArgs e) + { + string stmt = String.Format(statementTemplate1, statementCount++, null); + Assert.That(e.StatementText, Is.EqualTo(stmt)); + } + + private string statementTemplate2 = @"INSERT INTO Test (id, name) VALUES ({0}, 'a "" na;me'){1}"; + + [Test] + public void ExecuteScriptWithInserts() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); + statementCount = 0; + string scriptText = String.Empty; + for (int i = 0; i < 10; i++) + { + scriptText += String.Format(statementTemplate2, i, ";"); + } + MySqlScript script = new MySqlScript(scriptText); + script.Connection = Connection; + script.StatementExecuted += new MySqlStatementExecutedEventHandler(ExecuteScriptWithInserts_StatementExecuted); + int count = script.Execute(); + Assert.That(count, Is.EqualTo(10)); + + MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM Test", Connection); + Assert.That(Convert.ToInt32(cmd.ExecuteScalar()), Is.EqualTo(10)); + } + + void ExecuteScriptWithInserts_StatementExecuted(object sender, MySqlScriptEventArgs e) + { + string stmt = String.Format(statementTemplate2, statementCount++, null); + Assert.That(e.StatementText, Is.EqualTo(stmt)); + } + + [Test] + [Ignore("Fix this")] + public void ExecuteScriptContinueOnFailure() + { + statementCount = 0; + string scriptText = String.Empty; + for (int i = 0; i < 5; i++) + scriptText += String.Format(statementTemplate2, i, ";"); + scriptText += "bogus statement;"; + for (int i = 5; i < 10; i++) + scriptText += String.Format(statementTemplate2, i, ";"); + MySqlScript script = new MySqlScript(scriptText); + script.Connection = Connection; + script.Error += new MySqlScriptErrorEventHandler(ExecuteScript_ContinueOnError); + int count = script.Execute(); + Assert.That(count, Is.EqualTo((int)10)); + Assert.That(statementCount, Is.EqualTo((int)1)); + + MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM Test", Connection); + Assert.That(Convert.ToInt32(cmd.ExecuteScalar()), Is.EqualTo(10)); + } + + void ExecuteScript_ContinueOnError(object sender, MySqlScriptErrorEventArgs args) + { + args.Ignore = true; + statementCount++; + } + + [Test] + [Ignore("Fix this")] + public void ExecuteScriptNotContinueOnFailure() + { + statementCount = 0; + string scriptText = String.Empty; + for (int i = 0; i < 5; i++) + scriptText += String.Format(statementTemplate2, i, ";"); + scriptText += "bogus statement;"; + for (int i = 5; i < 10; i++) + scriptText += String.Format(statementTemplate2, i, ";"); + MySqlScript script = new MySqlScript(scriptText); + script.Connection = Connection; + script.Error += new MySqlScriptErrorEventHandler(ExecuteScript_NotContinueOnError); + int count = script.Execute(); + Assert.That(count, Is.EqualTo(5)); + Assert.That(statementCount, Is.EqualTo(1)); + + MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM Test", Connection); + Assert.That(Convert.ToInt32(cmd.ExecuteScalar()), Is.EqualTo(5)); + } + + void ExecuteScript_NotContinueOnError(object sender, MySqlScriptErrorEventArgs args) + { + args.Ignore = false; + statementCount++; + } + + [Test] + public void ExecuteScriptWithUserVariables() + { + string connStr = Connection.ConnectionString.ToLowerInvariant(); + connStr = connStr.Replace("allow user variables=true", + "allow user variables=false"); + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + string scriptText = "SET @myvar = 1"; + MySqlScript script = new MySqlScript(scriptText); + script.Connection = c; + int count = script.Execute(); + Assert.That(count, Is.EqualTo(1)); + } + } + + /// + /// Bug #46429 use DELIMITER command in MySql.Data.MySqlClient.MySqlScript + /// + [Test] + [Ignore("Fix for non-windows OS")] + public void ScriptWithDelimiterStatements() + { + StringBuilder sql = new StringBuilder(); + + sql.AppendFormat(@"{0}DELIMITER $${0} + SELECT 1,2,3$${0} + DELIMITER //{0} + SELECT 4,5,6//{0}", Environment.NewLine); + + MySqlScript s = new MySqlScript(); + s.Query = sql.ToString(); + s.Delimiter = "XX"; + s.Connection = Connection; + int count = s.Execute(); + } + + /// + /// Bug #46429 use DELIMITER command in MySql.Data.MySqlClient.MySqlScript + /// + [Test] + public void DelimiterInScriptV2() + { + StringBuilder sql = new StringBuilder(); + + sql.AppendLine("DELIMITER MySuperDelimiter"); + sql.AppendLine("CREATE PROCEDURE TestProcedure1()"); + sql.AppendLine("BEGIN"); + sql.AppendLine(" SELECT * FROM mysql.proc;"); + sql.AppendLine("END MySuperDelimiter"); + sql.AppendLine("CREATE PROCEDURE TestProcedure2()"); + sql.AppendLine("BEGIN"); + sql.AppendLine(" SELECT * FROM mysql.proc;"); + sql.AppendLine("END mysuperdelimiter"); + + sql.AppendLine("DELIMITER ;"); + + MySqlScript script = new MySqlScript(Connection, sql.ToString()); + script.Execute(); + } + + /// + /// Bug #50344 MySqlScript.Execute() throws InvalidOperationException + /// + [Test] + public void EmptyLastLineWithScriptExecute() + { + StringBuilder sb = new StringBuilder(); + sb.AppendLine("DROP FUNCTION IF EXISTS `BlaBla`;"); + sb.AppendLine("DELIMITER ;;"); + MySqlScript script = new MySqlScript(Connection, sb.ToString()); + // InvalidOperationException : The CommandText property has not been properly initialized. + script.Execute(); + } + + [Test] + public void DelimiterCommandDoesNotThrow() + { + MySqlScript script = new MySqlScript(Connection, "DELIMITER ;"); + script.Execute(); + } + + #region Async + + [Test] + public async Task ExecuteScriptWithProceduresAsync() + { + string spTpl = @"CREATE PROCEDURE `SEScriptWithProceduresAsyncSpTest{0}`() NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER COMMENT '' BEGIN SELECT 1,2,3; END{1}"; + statementCount = 0; + string scriptText = String.Empty; + for (int i = 0; i < 10; i++) + { + scriptText += String.Format(spTpl, i, "$$"); + } + MySqlScript script = new MySqlScript(scriptText); + script.StatementExecuted += new MySqlStatementExecutedEventHandler(delegate(object sender, MySqlScriptEventArgs e) + { + string stmt = String.Format(spTpl, statementCount++, null); + Assert.That(e.StatementText, Is.EqualTo(stmt)); + }); + script.Connection = Connection; + script.Delimiter = "$$"; + int count = await script.ExecuteAsync(); + Assert.That(count, Is.EqualTo(10)); + + MySqlCommand cmd = new MySqlCommand( + String.Format(@"SELECT COUNT(*) FROM information_schema.routines WHERE routine_schema = '{0}' AND routine_name LIKE 'SEScriptWithProceduresAsyncSpTest%'", + Connection.Database), Connection); + Assert.That(Convert.ToInt32(cmd.ExecuteScalar()), Is.EqualTo(10)); + } + + [Test] + public async Task ExecuteScriptWithInsertsAsync() + { + ExecuteSQL("CREATE TABLE SEScriptWithInsertsAsyncTest (id int, name varchar(50))"); + string queryTpl = @"INSERT INTO SEScriptWithInsertsAsyncTest (id, name) VALUES ({0}, 'a "" na;me'){1}"; + statementCount = 0; + string scriptText = String.Empty; + for (int i = 0; i < 10; i++) + { + scriptText += String.Format(queryTpl, i, ";"); + } + MySqlScript script = new MySqlScript(scriptText); + script.Connection = Connection; + script.StatementExecuted += new MySqlStatementExecutedEventHandler(delegate(object sender, MySqlScriptEventArgs e) + { + string stmt = String.Format(queryTpl, statementCount++, null); + Assert.That(e.StatementText, Is.EqualTo(stmt)); + }); + int count = await script.ExecuteAsync(); + Assert.That(count, Is.EqualTo(10)); + + MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM SEScriptWithInsertsAsyncTest", Connection); + Assert.That(Convert.ToInt32(cmd.ExecuteScalar()), Is.EqualTo(10)); + } + #endregion + + #region WL14389 + + [Test,Description("MySQL Delimiter ran with Automation")] + public void ScriptDelimiter() + { + var sql = "DROP PROCEDURE IF EXISTS test_routine??" + + "CREATE PROCEDURE test_routine() " + + "BEGIN " + + "SELECT 1;" + + "END??" + + "CALL test_routine()??"; + using (var conn = new MySqlConnection(Connection.ConnectionString)) + { + conn.Open(); + var script = new MySqlScript(conn); + script.Query = sql; + script.Delimiter = "??"; + var count = script.Execute(); + Assert.That(count, Is.EqualTo(3)); + } + } + + [Test, Description("Test Script Async")] + public async Task ScriptDelimiterAsync() + { + using (var conn = new MySqlConnection(Connection.ConnectionString)) + { + conn.Open(); + var sql = "DROP PROCEDURE IF EXISTS test_routine??" + + "CREATE PROCEDURE test_routine() " + + "BEGIN " + + "SELECT 1;" + + "END??" + + "CALL test_routine()"; + var script = new MySqlScript(conn); + script.Query = sql; + script.Delimiter = "??"; + var count = await script.ExecuteAsync(); + } + } + + #endregion WL14389 + + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/SimpleTransactions.cs b/MySQL.Data/tests/MySql.Data.Tests/SimpleTransactions.cs new file mode 100644 index 000000000..00d1d4148 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/SimpleTransactions.cs @@ -0,0 +1,207 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System.Data; +using System.Reflection; + +namespace MySql.Data.MySqlClient.Tests +{ + public class SimpleTransactions : TestBase + { + protected override void Cleanup() + { + ExecuteSQL(String.Format("DROP TABLE IF EXISTS `{0}`.Test", Connection.Database)); + } + + [Test] + public void TestReader() + { + ExecuteSQL("CREATE TABLE Test (key2 VARCHAR(1), name VARCHAR(100), name2 VARCHAR(100))"); + ExecuteSQL("INSERT INTO Test VALUES('P', 'Test1', 'Test2')"); + + MySqlTransaction txn = Connection.BeginTransaction(); + MySqlConnection c = txn.Connection; + Assert.That(c, Is.EqualTo(Connection)); + MySqlCommand cmd = new MySqlCommand("SELECT name, name2 FROM Test WHERE key2='P'", + Connection, txn); + MySqlTransaction t2 = cmd.Transaction; + Assert.That(t2, Is.EqualTo(txn)); + MySqlDataReader reader = null; + try + { + reader = cmd.ExecuteReader(); + reader.Close(); + txn.Commit(); + } + catch (Exception ex) + { + Assert.That(ex.Message != string.Empty, Is.False, ex.Message); + txn.Rollback(); + } + finally + { + if (reader != null) reader.Close(); + } + } + + /// + /// Bug #22400 Nested transactions + /// + [Test] + public void NestedTransactions() + { + MySqlTransaction t1 = Connection.BeginTransaction(); + + Exception ex = Assert.Throws(() => { Connection.BeginTransaction(); }); + Assert.That(ex.Message, Is.EqualTo("Nested transactions are not supported")); + + t1.Rollback(); + } + + [Test] + public void BeginTransactionOnPreviouslyOpenConnection() + { + string connStr = Connection.ConnectionString; + MySqlConnection c = new MySqlConnection(connStr); + c.Open(); + c.Close(); + try + { + c.BeginTransaction(); + } + catch (Exception ex) + { + Assert.That(ex.Message, Is.EqualTo("The connection is not open")); + } + } + + /// + /// Bug #37991 Connection fails when trying to close after a commit while network to db is bad + /// This test is not a perfect test of this bug as the kill connection is not quite the + /// same as unplugging the network but it's the best I've figured out so far + /// + [Test] + public void CommitAfterConnectionDead() + { + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE Test(id INT, name VARCHAR(20))"); + + string connStr = Connection.ConnectionString + ";pooling=false"; + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + MySqlTransaction trans = c.BeginTransaction(); + + using (MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (1, 'boo')", c)) + { + cmd.ExecuteNonQuery(); + } + KillConnection(c); + //try + //{ + Exception ex = Assert.Throws(() => trans.Commit()); + Assert.That(ex.Message, Is.EqualTo("Connection must be valid and open to commit transaction")); + //} + //catch (Exception) + //{ + //} + Assert.That(c.State, Is.EqualTo(ConnectionState.Closed)); + c.Close(); // this should work even though we are closed + } + } + + /// + /// Bug #39817 Transaction Dispose does not roll back + /// + [Test] + public void DisposingCallsRollback() + { + ExecuteSQL("CREATE TABLE Test (key2 VARCHAR(1), name VARCHAR(100), name2 VARCHAR(100))"); + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES ('a', 'b', 'c')", Connection); + MySqlTransaction txn = Connection.BeginTransaction(); + using (txn) + { + cmd.ExecuteNonQuery(); + } + // the txn should be closed now as a rollback should have happened. + Type t = txn.GetType(); + FieldInfo fi = t.GetField("open", BindingFlags.Instance | BindingFlags.NonPublic); + bool isOpen = (bool)fi.GetValue(txn); + Assert.That(isOpen, Is.False); + } + + [Test] + public void SimpleRollback() + { + try + { + MySqlTransaction trans = Connection.BeginTransaction(); + trans.Rollback(); + } + catch (Exception) { } + } + + #region WL14389 + + [Test, Description("Transaction Scope")] + public void TransactionScope() + { + using (var myConn = new MySqlConnection(Connection.ConnectionString)) + { + myConn.Open(); + var cmdtoexec = myConn.CreateCommand(); + var myTransaction = myConn.BeginTransaction(); + cmdtoexec.Transaction = myTransaction; + + cmdtoexec.CommandText = "SET autocommit = 0"; + cmdtoexec.ExecuteNonQuery(); + + cmdtoexec.CommandText = "DROP TABLE IF EXISTS transactiontable;"; + cmdtoexec.ExecuteNonQuery(); + + cmdtoexec.CommandText = + "CREATE TABLE transactiontable(Id int(10) unsigned NOT NULL default '0', PRIMARY KEY (Id))ENGINE=InnoDB"; + cmdtoexec.ExecuteNonQuery(); + + for (var i = 0; i < 50; i++) + MySqlHelper.ExecuteNonQuery(myConn, string.Format("INSERT INTO transactiontable VALUES({0})", i)); + + myTransaction.Rollback(); // to rollback actions + cmdtoexec.CommandText = "select count(*) from transactiontable"; + var count = cmdtoexec.ExecuteScalar(); + Assert.That(count, Is.EqualTo(0)); + } + } + + #endregion WL14389 + + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/SqlServerMode.cs b/MySQL.Data/tests/MySql.Data.Tests/SqlServerMode.cs new file mode 100644 index 000000000..bbf289029 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/SqlServerMode.cs @@ -0,0 +1,56 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework; +using NUnit.Framework.Legacy; + +namespace MySql.Data.MySqlClient.Tests +{ + public class SqlServerMode : TestBase + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.SqlServerMode = true; + } + + [Test] + public void Simple() + { + ExecuteSQL("CREATE TABLE Test (id INT, name VARCHAR(20))"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'A')"); + + MySqlCommand cmd = new MySqlCommand("SELECT [id], [name] FROM [Test]", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetInt32(0), Is.EqualTo(1)); + Assert.That(reader.GetString(1), Is.EqualTo("A")); + } + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/SqlTokenizer.cs b/MySQL.Data/tests/MySql.Data.Tests/SqlTokenizer.cs new file mode 100644 index 000000000..a512bfb2f --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/SqlTokenizer.cs @@ -0,0 +1,102 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +using System.Reflection; + +namespace MySql.Data.MySqlClient.Tests +{ + public class SqlTokenizer + { + object tokenizer; + + public SqlTokenizer(string sql) + { + Assembly a = Assembly.Load(new AssemblyName("MySql.Data")); + tokenizer = a.CreateInstance("MySql.Data.Common.MySqlTokenizer"); + Text = sql; + } + + public string Text + { + set + { + PropertyInfo pi = tokenizer.GetType().GetProperty("Text"); + pi.SetValue(tokenizer, value, null); + } + } + + public bool ReturnComments + { + set + { + PropertyInfo pi = tokenizer.GetType().GetProperty("ReturnComments"); + pi.SetValue(tokenizer, value, null); + } + } + + public bool AnsiQuotes + { + set + { + PropertyInfo pi = tokenizer.GetType().GetProperty("AnsiQuotes"); + pi.SetValue(tokenizer, value, null); + } + } + + public bool SqlServerMode + { + set + { + PropertyInfo pi = tokenizer.GetType().GetProperty("SqlServerMode"); + pi.SetValue(tokenizer, value, null); + } + } + + public bool Quoted + { + get + { + PropertyInfo pi = tokenizer.GetType().GetProperty("Quoted"); + return (bool)pi.GetValue(tokenizer, null); + } + } + + public string NextToken() + { + MethodInfo method = tokenizer.GetType().GetTypeInfo().GetDeclaredMethod("NextToken"); + return (string)method.Invoke(tokenizer, null); + } + + public string NextParameter() + { + MethodInfo method = tokenizer.GetType().GetTypeInfo().GetDeclaredMethod("NextParameter"); + return (string)method.Invoke(tokenizer, null); + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/SslTests.cs b/MySQL.Data/tests/MySql.Data.Tests/SslTests.cs new file mode 100644 index 000000000..54276c39d --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/SslTests.cs @@ -0,0 +1,1221 @@ +// Copyright © 2018, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using MySqlX.XDevAPI; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Linq; +using System.Security.Authentication; +using System.Security.Cryptography.X509Certificates; + +namespace MySql.Data.MySqlClient.Tests +{ + public class SslTests : TestBase + { + private string _sslCa; + private string _sslCert; + private string _sslKey; + + public SslTests() + { + string cPath = TestContext.CurrentContext.TestDirectory + Path.DirectorySeparatorChar; + + _sslCa = cPath + "ca.pem"; + _sslCert = cPath + "client-cert.pem"; + _sslKey = cPath + "client-key.pem"; + } + + #region General + + [Test] + [Property("Category", "Security")] + public void SslModePreferredByDefault() + { + MySqlCommand command = new MySqlCommand("SHOW SESSION STATUS LIKE 'Ssl_version';", Connection); + using (MySqlDataReader reader = command.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetString(1), Does.StartWith("TLSv1")); + } + } + + [Test] + [Property("Category", "Security")] + public void SslModeOverriden() + { + var builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.SslMode = MySqlSslMode.Disabled; + builder.AllowPublicKeyRetrieval = true; + builder.Database = ""; + using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + MySqlCommand command = new MySqlCommand("SHOW SESSION STATUS LIKE 'Ssl_version';", connection); + using (MySqlDataReader reader = command.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetString(1), Is.EqualTo(string.Empty)); + } + } + } + + [Test] + [Property("Category", "Security")] + public void RepeatedSslConnectionOptions() + { + string repeatedOption = "foo"; + + var builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.SslCa = _sslCa; + var conn = new MySqlConnection($"{builder.ConnectionString};sslca={repeatedOption}"); + Assert.That(conn.Settings.SslCa, Is.EqualTo(repeatedOption)); + + builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.CertificateFile = _sslCa; + conn = new MySqlConnection($"{builder.ConnectionString};certificatefile={repeatedOption}"); + Assert.That(conn.Settings.CertificateFile, Is.EqualTo(repeatedOption)); + + builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.SslCa = _sslCa; + conn = new MySqlConnection($"{builder.ConnectionString};certificatefile={repeatedOption}"); + Assert.That(conn.Settings.CertificateFile, Is.EqualTo(repeatedOption)); + + builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.CertificateFile = _sslCa; + conn = new MySqlConnection($"{builder.ConnectionString};sslca={repeatedOption}"); + Assert.That(conn.Settings.SslCa, Is.EqualTo(repeatedOption)); + + builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.SslCa = _sslCa; + conn = new MySqlConnection($"{builder.ConnectionString};sslcert={_sslCert};sslkey={_sslKey};sslca={repeatedOption}"); + Assert.That(conn.Settings.SslCa, Is.EqualTo(repeatedOption)); + + builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.CertificatePassword = "pass"; + conn = new MySqlConnection($"{builder.ConnectionString};certificatepassword={repeatedOption}"); + Assert.That(conn.Settings.CertificatePassword, Is.EqualTo(repeatedOption)); + + builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.SslCert = _sslCert; + conn = new MySqlConnection($"{builder.ConnectionString};sslcert={repeatedOption}"); + Assert.That(conn.Settings.SslCert, Is.EqualTo(repeatedOption)); + + builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.SslKey = _sslKey; + conn = new MySqlConnection($"{builder.ConnectionString};sslkey={repeatedOption}"); + Assert.That(conn.Settings.SslKey, Is.EqualTo(repeatedOption)); + } + + [Test] + [Property("Category", "Security")] + public void SslOptionsWhenSslDisabled() + { + var builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.SslMode = MySqlSslMode.Disabled; + builder.SslCa = "value"; + Assert.DoesNotThrow(() => new MySqlConnection(builder.ConnectionString)); + + builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.SslMode = MySqlSslMode.Disabled; + builder.SslCert = "value"; + Assert.DoesNotThrow(() => new MySqlConnection(builder.ConnectionString)); + + builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.SslMode = MySqlSslMode.Disabled; + builder.SslKey = "value"; + Assert.DoesNotThrow(() => new MySqlConnection(builder.ConnectionString)); + + builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.SslMode = MySqlSslMode.Disabled; + builder.CertificateFile = "value"; + Assert.DoesNotThrow(() => new MySqlConnection(builder.ConnectionString)); + + builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.SslMode = MySqlSslMode.Disabled; + builder.CertificatePassword = "value"; + Assert.DoesNotThrow(() => new MySqlConnection(builder.ConnectionString)); + } + + [Test] + [Property("Category", "Security")] + public void SslPreferredByDefault() + { + MySqlCommand command = new MySqlCommand("SHOW SESSION STATUS LIKE 'Ssl_version';", Connection); + using (MySqlDataReader reader = command.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetString(1), Does.StartWith("TLSv1")); + } + } + + [Test] + [Property("Category", "Security")] + public void SslOverrided() + { + var cstrBuilder = new MySqlConnectionStringBuilder(Connection.ConnectionString); + cstrBuilder.SslMode = MySqlSslMode.Disabled; + cstrBuilder.AllowPublicKeyRetrieval = true; + cstrBuilder.Database = ""; + using (MySqlConnection connection = new MySqlConnection(cstrBuilder.ConnectionString)) + { + connection.Open(); + MySqlCommand command = new MySqlCommand("SHOW SESSION STATUS LIKE 'Ssl_version';", connection); + using (MySqlDataReader reader = command.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetString(1), Is.EqualTo(string.Empty)); + } + } + } + + /// + /// WL14811 - Remove support for TLS 1.0 and 1.1 + /// WL16176 - Add support for TLS 1.3 + /// + [TestCase("[]", 1)] + [TestCase("Tlsv1, Tlsv1.1", 2)] + [TestCase("Tlsv1, foo", 2)] + [TestCase("Tlsv1", 2)] + [TestCase("Tlsv1.1", 2)] + [TestCase("foo, bar", 3)] + [TestCase("Tlsv1.0, Tlsv1.2", 0)] + [TestCase("foo, Tlsv1.2", 0)] + [TestCase("Tlsv1.3", 4)] + [Property("Category", "Security")] + public void TlsVersionTest(string tlsVersion, int error) + { + Assume.That(error != 4 || !Platform.IsMacOSX()); + + var builder = new MySqlConnectionStringBuilder(Connection.ConnectionString); + void SetTlsVersion() { builder.TlsVersion = tlsVersion; } + string ex; + string tlsdefault = "TLSv1.2"; + + switch (error) + { + case 1: + ex = Assert.Throws(SetTlsVersion).Message; + Assert.That(ex, Is.EqualTo(Resources.TlsVersionsEmpty).IgnoreCase); + break; + case 2: + ex = Assert.Throws(SetTlsVersion).Message; + Assert.That(ex, Is.EqualTo(Resources.TlsUnsupportedVersions).IgnoreCase); + break; + case 3: + ex = Assert.Throws(SetTlsVersion).Message; + Assert.That(ex, Is.EqualTo(Resources.TlsNonValidProtocols).IgnoreCase); + break; + default: + SetTlsVersion(); + var conn = new MySqlConnection(builder.ConnectionString); + + using (conn) + { + conn.Open(); + Assert.That(conn.State, Is.EqualTo(ConnectionState.Open)); + + MySqlCommand cmd = conn.CreateCommand(); + cmd.CommandText = "SHOW SESSION STATUS LIKE 'ssl_version'"; + + using MySqlDataReader dr = cmd.ExecuteReader(); + Assert.That(dr.Read()); + if (error==4) + Assert.That(dr[1].ToString(), Is.EqualTo(tlsVersion).IgnoreCase); + else + Assert.That(dr[1].ToString(), Is.EqualTo(tlsdefault).IgnoreCase); + } + break; + } + } + + /// + /// WL14811 - Remove support for TLS 1.0 and 1.1 + /// + [TestCase("Tlsv1.0, Tlsv1.2")] + [TestCase("foo, Tlsv1.2")] + public void TlsVersionNoSslTest(string tlsVersion) + { + var builder = new MySqlConnectionStringBuilder(Connection.ConnectionString) + { + TlsVersion = tlsVersion, + SslMode = MySqlSslMode.Disabled + }; + + using (var conn = new MySqlConnection(builder.ConnectionString)) + { + conn.Open(); + Assert.That(conn.State, Is.EqualTo(ConnectionState.Open)); + + MySqlCommand cmd = conn.CreateCommand(); + cmd.CommandText = "SHOW SESSION STATUS LIKE 'ssl_version'"; + + using MySqlDataReader dr = cmd.ExecuteReader(); + Assert.That(dr.Read()); + Assert.That(dr[1].ToString(), Is.Empty); + } + } + #endregion + + #region PFX + + /// + /// A client can connect to MySQL server using SSL and a pfx file. + /// + /// This test requires starting the server with SSL support. + /// For instance, the following command line enables SSL in the server: + /// mysqld --no-defaults --standalone --console --ssl-ca='MySQLServerDir'\mysql-test\std_data\cacert.pem --ssl-cert='MySQLServerDir'\mysql-test\std_data\server-cert.pem --ssl-key='MySQLServerDir'\mysql-test\std_data\server-key.pem + /// + /// + [Test] + [Property("Category", "Security")] + public void CanConnectUsingFileBasedCertificate() + { + string connstr = Connection.ConnectionString; + connstr += ";CertificateFile=client.pfx;CertificatePassword=pass;SSL Mode=Required;"; + using (MySqlConnection c = new MySqlConnection(connstr)) + { + c.Open(); + Assert.That(c.State, Is.EqualTo(ConnectionState.Open)); + MySqlCommand command = new MySqlCommand("SHOW SESSION STATUS LIKE 'Ssl_version';", c); + using (MySqlDataReader reader = command.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetString(1), Does.StartWith("TLSv1")); + } + } + } + + [Test] + [Property("Category", "Security")] + public void ConnectUsingPFXCertificates() + { + string connstr = Settings.ConnectionString; + connstr += ";CertificateFile=client.pfx;CertificatePassword=pass;SSL Mode=Required;"; + using (MySqlConnection c = new MySqlConnection(connstr)) + { + c.Open(); + Assert.That(c.State, Is.EqualTo(ConnectionState.Open)); + MySqlCommand command = new MySqlCommand("SHOW SESSION STATUS LIKE 'Ssl_version';", c); + using (MySqlDataReader reader = command.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetString(1), Does.StartWith("TLSv1")); + } + + command = new MySqlCommand("show variables like 'tls_version'", c); + using (MySqlDataReader reader = command.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetString(1), Does.Contain("TLS")); + } + } + + connstr = Settings.ConnectionString; + connstr += ";CertificateFile=client-incorrect.pfx;CertificatePassword=pass;SSL Mode=" + MySqlSslMode.VerifyCA; + using (MySqlConnection c = new MySqlConnection(connstr)) + { + Assert.Catch(() => c.Open()); + } + + connstr = Settings.ConnectionString; + connstr += ";CertificateFile=client.pfx;CertificatePassword=WRONGPASSWORD;SSL Mode=" + MySqlSslMode.VerifyCA; + using (MySqlConnection c = new MySqlConnection(connstr)) + { + Assert.Catch(() => c.Open()); + } + } + + /// + /// Bug#31954655 - NET CONNECTOR - THUMBPRINT OPTION DOES NOT CHECK THUMBPRINT + /// + [Test] + [Property("Category", "Security")] + public void InvalidCertificateThumbprint() + { +#if !NETFRAMEWORK + Assume.That(System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Windows)); +#endif + + // Create a mock of certificate store + string assemblyPath = TestContext.CurrentContext.TestDirectory; + var store = new X509Store(StoreName.My, StoreLocation.CurrentUser); + store.Open(OpenFlags.ReadWrite); + var certificate = new X509Certificate2(assemblyPath + "\\client.pfx", "pass"); + store.Add(certificate); + + MySqlConnectionStringBuilder csb = new MySqlConnectionStringBuilder(Settings.ConnectionString); + csb.CertificateStoreLocation = MySqlCertificateStoreLocation.CurrentUser; + csb.CertificateThumbprint = "spaghetti"; + + // Throws an exception with and invalid/incorrect Thumbprint + var ex = Assert.Throws(() => new MySqlConnection(csb.ConnectionString).Open()); + Assert.That(ex.Message, Is.EqualTo(string.Format(Resources.InvalidCertificateThumbprint, csb.CertificateThumbprint))); + + csb.CertificateThumbprint = certificate.Thumbprint; + using (var conn = new MySqlConnection(csb.ConnectionString)) + { + conn.Open(); + Assert.That(conn.connectionState, Is.EqualTo(ConnectionState.Open)); + } + } + + #endregion + + #region PEM + + [Test] + [Property("Category", "Security")] + public void SslCertificateConnectionOptionsExistAndDefaultToNull() + { + var builder = new MySqlConnectionStringBuilder(); + + // Options exist. + Assert.That(builder.values.ContainsKey("sslca")); + Assert.That(builder.values.ContainsKey("sslcert")); + Assert.That(builder.values.ContainsKey("sslkey")); + + // Options default to null. + Assert.That(builder["sslca"], Is.Null); + Assert.That(builder["sslcert"], Is.Null); + Assert.That(builder["sslkey"], Is.Null); + Assert.That(builder["ssl-ca"], Is.Null); + Assert.That(builder["ssl-cert"], Is.Null); + Assert.That(builder["ssl-key"], Is.Null); + Assert.That(builder.SslCa, Is.Null); + Assert.That(builder.SslCert, Is.Null); + Assert.That(builder.SslKey, Is.Null); + + // Null or whitespace options are ignored. + var connectionString = $"host={Settings.Server};user={Settings.UserID};port={Settings.Port};password={Settings.Password};"; + builder = new MySqlConnectionStringBuilder(connectionString); + builder.SslCa = null; + builder.SslCert = string.Empty; + builder.SslKey = " "; + using (var connection = new MySqlConnection(builder.ConnectionString)) + { + Assert.That(connection.Settings.SslCa, Is.Null); + Assert.That(connection.Settings.SslCert, Is.Null); + Assert.That(connection.Settings.SslKey, Is.EqualTo(" ")); + connection.Open(); + connection.Close(); + } + + // Failing to provide a value defaults to null. + connectionString = $"{connectionString}sslca=;sslcert=;sslkey="; + using (var connection = new MySqlConnection(connectionString)) + { + Assert.That(connection.Settings.SslCa, Is.Null); + Assert.That(connection.Settings.SslCert, Is.Null); + Assert.That(connection.Settings.SslKey, Is.Null); + connection.Open(); + connection.Close(); + } + } + + [Test] + [Property("Category", "Security")] + public void MissingSslCaConnectionOption() + { + var builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.SslMode = MySqlSslMode.VerifyCA; + using (var connection = new MySqlConnection(builder.ConnectionString)) + { + var exception = Assert.Throws(() => connection.Open()); + Assert.That(exception.Message, Is.EqualTo(Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(string.Format(Resources.FilePathNotSet, nameof(Settings.SslCa)))); + } + + builder.SslMode = MySqlSslMode.VerifyFull; + using (var connection = new MySqlConnection(builder.ConnectionString)) + { + var exception = Assert.Throws(() => connection.Open()); + Assert.That(exception.Message, Is.EqualTo(Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(string.Format(Resources.FilePathNotSet, nameof(Settings.SslCa)))); + } + } + + [Test] + [Property("Category", "Security")] + public void MissingSslCertConnectionOption() + { + var builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.SslCa = _sslCa; + builder.SslCert = string.Empty; + builder.SslMode = MySqlSslMode.VerifyFull; + using (var connection = new MySqlConnection(builder.ConnectionString)) + { + var exception = Assert.Throws(() => connection.Open()); + Assert.That(exception.Message, Is.EqualTo(Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(string.Format(Resources.FilePathNotSet, nameof(Settings.SslCert)))); + } + } + + [Test] + [Property("Category", "Security")] + public void MissingSslKeyConnectionOption() + { + var builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.SslCa = _sslCa; + builder.SslCert = _sslCert; + builder.SslKey = " "; + builder.SslMode = MySqlSslMode.VerifyFull; + using (var connection = new MySqlConnection(builder.ConnectionString)) + { + var exception = Assert.Throws(() => connection.Open()); + Assert.That(exception.Message, Is.EqualTo(Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(string.Format(Resources.FilePathNotSet, nameof(Settings.SslKey)))); + } + } + + [Test] + [Property("Category", "Security")] + public void InvalidFileNameForSslCaConnectionOption() + { + var builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.SslCa = "C:\\certs\\ca.pema"; + builder.SslMode = MySqlSslMode.VerifyCA; + using (var connection = new MySqlConnection(builder.ConnectionString)) + { + var exception = Assert.Throws(() => connection.Open()); + Assert.That(exception.Message, Is.EqualTo(Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(Resources.FileNotFound)); + } + } + + [Test] + [Property("Category", "Security")] + public void InvalidFileNameForSslCertConnectionOption() + { + var builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.SslCa = _sslCa; + builder.SslCert = "C:\\certs\\client-cert"; + builder.SslMode = MySqlSslMode.VerifyFull; + using (var connection = new MySqlConnection(builder.ConnectionString)) + { + var exception = Assert.Throws(() => connection.Open()); + Assert.That(exception.Message, Is.EqualTo(Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(Resources.FileNotFound)); + } + } + + [Test] + [Property("Category", "Security")] + public void InvalidFileNameForSslKeyConnectionOption() + { + var builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.SslCa = _sslCa; + builder.SslCert = _sslCert; + builder.SslKey = "file"; + builder.SslMode = MySqlSslMode.VerifyFull; + using (var connection = new MySqlConnection(builder.ConnectionString)) + { + var exception = Assert.Throws(() => connection.Open()); + Assert.That(exception.Message, Is.EqualTo(Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(Resources.FileNotFound)); + } + } + + [Test] + [Property("Category", "Security")] + public void ConnectUsingCaPemCertificate() + { + var builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.SslCa = _sslCa; + builder.SslMode = MySqlSslMode.VerifyCA; + using (var connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + connection.Close(); + } + } + + [Test] + [Property("Category", "Security")] + public void ConnectUsingAllCertificates() + { + var builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.SslCa = _sslCa; + builder.SslCert = _sslCert; + builder.SslKey = _sslKey; + builder.SslMode = MySqlSslMode.VerifyFull; + builder.TlsVersion = "Tlsv1.2"; + using (var connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + connection.Close(); + } + + builder.SslKey = _sslKey.Replace("client-key.pem", "client-key_altered.pem"); + using (var connection = new MySqlConnection(builder.ConnectionString)) + { + try { connection.Open(); } + catch (Exception ex) + { + Assert.That(ex is MySqlException || + ex is AuthenticationException || + ex is FormatException, ex.Message); + } + } + } + + [Test] + [Property("Category", "Security")] + public void SslCaConnectionOptionsAreIgnoredOnDifferentSslModes() + { + var builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.SslCa = "dummy_file"; + builder.SslMode = MySqlSslMode.Required; + + // Connection attempt is successful since SslMode=Preferred causign SslCa to be ignored. + using (var connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + connection.Close(); + } + } + + [Test] + [Property("Category", "Security")] + public void SslCertandKeyConnectionOptionsAreIgnoredOnDifferentSslModes() + { + var builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.SslCa = "dummy_file"; + builder.SslCert = null; + builder.SslKey = " "; + builder.SslMode = MySqlSslMode.Required; + + // Connection attempt is successful since SslMode=Required causing SslCa, SslCert and SslKey to be ignored. + using (var connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + connection.Close(); + } + } + + [Test] + [Property("Category", "Security")] + public void AttemptConnectionWithDummyPemCertificates() + { + var builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.SslCa = _sslCa.Replace("ca.pem", "ca_dummy.pem"); + builder.SslMode = MySqlSslMode.VerifyCA; + using (var connection = new MySqlConnection(builder.ConnectionString)) + { + var exception = Assert.Throws(() => connection.Open()); + Assert.That(exception.Message, Is.EqualTo(Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(Resources.FileIsNotACertificate), $"Cert. path: {_sslCa}"); + } + + builder.SslCa = _sslCa; + builder.SslCert = _sslCert.Replace("client-cert.pem", "client-cert_dummy.pem"); + builder.SslMode = MySqlSslMode.VerifyFull; + using (var connection = new MySqlConnection(builder.ConnectionString)) + { + var exception = Assert.Throws(() => connection.Open()); + Assert.That(exception.Message, Is.EqualTo(Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(Resources.FileIsNotACertificate)); + } + + builder.SslCa = _sslCa; + builder.SslCert = _sslCert; + builder.SslKey = _sslKey.Replace("client-key.pem", "client-key_dummy.pem"); + builder.SslMode = MySqlSslMode.VerifyFull; + using (var connection = new MySqlConnection(builder.ConnectionString)) + { + var exception = Assert.Throws(() => connection.Open()); + Assert.That(exception.Message, Is.EqualTo(Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(Resources.FileIsNotAKey)); + } + } + + [Test] + [Property("Category", "Security")] + public void AttemptConnectionWithSwitchedPemCertificates() + { + var builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.SslCa = _sslCert; + builder.SslMode = MySqlSslMode.VerifyCA; + using (var connection = new MySqlConnection(builder.ConnectionString)) + { + var exception = Assert.Throws(() => connection.Open()); + Assert.That(exception.Message, Is.EqualTo(Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(Resources.SslCertificateIsNotCA)); + } + + builder.SslCa = _sslKey; + builder.SslMode = MySqlSslMode.VerifyCA; + using (var connection = new MySqlConnection(builder.ConnectionString)) + { + var exception = Assert.Throws(() => connection.Open()); + Assert.That(exception.Message, Is.EqualTo(Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(Resources.FileIsNotACertificate)); + } + + builder.SslCa = _sslCa; + builder.SslCert = _sslCa; + builder.SslMode = MySqlSslMode.VerifyFull; + using (var connection = new MySqlConnection(builder.ConnectionString)) + { + var exception = Assert.Throws(() => connection.Open()); + Assert.That(exception.Message, Is.EqualTo(Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(Resources.InvalidSslCertificate)); + } + + builder.SslCert = _sslCert; + builder.SslKey = _sslCa; + builder.SslMode = MySqlSslMode.VerifyFull; + using (var connection = new MySqlConnection(builder.ConnectionString)) + { + var exception = Assert.Throws(() => connection.Open()); + Assert.That(exception.Message, Is.EqualTo(Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(Resources.FileIsNotAKey)); + } + } + + #endregion + + [Test, Description("Test session variables specific to clients ")] + [Ignore("This test needs to be executed individually because server setup affects to other tests")] + public void MaxConnectionsWithPersistAndGlobalVariables() + { + var connStr = $"server={Settings.Server};user={Settings.UserID};port={Settings.Port};password={Settings.Password};ssl-mode=required;ConnectionTimeout=5"; + var maxIterations = 7; + ExecuteSQL("SET GLOBAL max_connections = 10;"); + List connectionList = new(); + using (var conn = new MySqlConnection(connStr)) + { + while (connectionList.Count() < maxIterations) + { + var c1 = new MySqlConnection(connStr); + c1.Open(); + connectionList.Add(c1); + } + Exception ex = Assert.Throws(() => conn.Open()); + Assert.That(ex.Message, Does.Contain("Too many connections")); + } + foreach (var item in connectionList) + { + item.Close(); + item.Dispose(); + } + connectionList.Clear(); + + ExecuteSQL("SET PERSIST max_connections = 10;"); + + using (var conn = new MySqlConnection(connStr)) + { + while (connectionList.Count() < maxIterations) + { + var c1 = new MySqlConnection(connStr); + c1.Open(); + connectionList.Add(c1); + } + Exception ex = Assert.Throws(() => conn.Open()); + Assert.That(ex.Message, Does.Contain("Too many connections")); + } + foreach (var item in connectionList) + { + item.Close(); + item.Dispose(); + } + connectionList.Clear(); + + ExecuteSQL("SET GLOBAL max_connections = 151", true); + } + + [Test, Description("CONNECTOR/NET DOESN'T NEED TO RUN SHOW VARIABLES")] + public void ShowVariablesRemoved() + { + using (var dbConn = new MySqlConnection(Settings.ConnectionString)) + { + dbConn.Open();//Manually verify in server log that show variables is not present + Assert.That(dbConn.State, Is.EqualTo(ConnectionState.Open)); + } + } + + [Test] + public void ConnectUsingCertificateFileAndTlsVersion() + { + Assume.That(Version >= new Version(8, 0, 16), "This test for MySql server 8.0.16 or higher"); + var builder = new MySqlConnectionStringBuilder(Settings.ConnectionString); + builder.SslMode = MySqlSslMode.Required; + builder.CertificateFile = "client.pfx"; + builder.CertificatePassword = "pass"; + builder.TlsVersion = "Tlsv1.2"; + using (var connection = new MySqlConnection(builder.ConnectionString)) + { + connection.Open(); + MySqlCommand cmd = new MySqlCommand("show variables like '%tls_version%'", connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetString(1), Does.Contain("TLSv1")); + } + + cmd = new MySqlCommand("show status like 'Ssl_cipher'", connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetString(1).ToString().Length > 0); + } + + cmd = new MySqlCommand("show status like 'Ssl_version'", connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetString(1), Is.EqualTo("TLSv1.2").IgnoreCase); + } + } + } + + [Test, Description("Classic-Scenario(correct ssl-ca,wrong ssl-key/ssl-cert,ssl-mode required and default)")] + public void CorrectSslcaWrongSslkeySslcertRequiredMode() + { + Assume.That(Platform.IsWindows(), "This test is only for Windows OS"); + Assume.That(Version >= new Version(8, 0, 16), "This test for MySql server 8.0.16 or higher"); + string[] sslcertlist = new string[] { "", " ", null, "file", "file.pem" }; + string[] sslkeylist = new string[] { "", " ", null, "file", "file.pem" }; + for (int i = 0; i < sslcertlist.Length; i++) + { + + var connClassic = new MySqlConnectionStringBuilder(); + connClassic.Server = Host; + connClassic.Port = Convert.ToUInt32(Port); + connClassic.UserID = Settings.UserID; + connClassic.Password = Settings.Password; + connClassic.SslCert = sslcertlist[i]; + connClassic.SslKey = sslkeylist[i]; + connClassic.SslCa = _sslCa; + connClassic.SslMode = MySqlSslMode.Required; + using (var c = new MySqlConnection(connClassic.ConnectionString)) + { + c.Open(); + Assert.That(c.State, Is.EqualTo(ConnectionState.Open)); + } + + connClassic = new MySqlConnectionStringBuilder(); + connClassic.Server = Host; + connClassic.Port = Convert.ToUInt32(Port); + connClassic.UserID = Settings.UserID; + connClassic.Password = Settings.Password; + connClassic.SslCert = sslcertlist[i]; + connClassic.SslKey = sslkeylist[i]; + connClassic.SslCa = _sslCa; + using (var c = new MySqlConnection(connClassic.ConnectionString)) + { + c.Open(); + Assert.That(c.State, Is.EqualTo(ConnectionState.Open)); + } + + connClassic = new MySqlConnectionStringBuilder(); + connClassic.Server = Host; + connClassic.Port = Convert.ToUInt32(Port); + connClassic.UserID = Settings.UserID; + connClassic.Password = Settings.Password; + connClassic.SslCert = sslcertlist[i]; + connClassic.SslKey = sslkeylist[i]; + connClassic.SslCa = _sslCa; + connClassic.SslMode = MySqlSslMode.Prefered; + using (var c = new MySqlConnection(connClassic.ConnectionString)) + { + c.Open(); + Assert.That(c.State, Is.EqualTo(ConnectionState.Open)); + } + + var conn = new MySqlXConnectionStringBuilder(); + conn.Server = Host; + conn.Port = Convert.ToUInt32(Port); + conn.UserID = Settings.UserID; + conn.Password = Settings.Password; + conn.SslCert = sslcertlist[i]; + conn.SslKey = sslkeylist[i]; + conn.SslCa = _sslCa; + conn.SslMode = MySqlSslMode.Required; + using (var c = new MySqlConnection(connClassic.ConnectionString)) + { + c.Open(); + Assert.That(c.State, Is.EqualTo(ConnectionState.Open)); + } + + conn = new MySqlXConnectionStringBuilder(); + conn.Server = Host; + conn.Port = Convert.ToUInt32(Port); + conn.UserID = Settings.UserID; + conn.Password = Settings.Password; + conn.SslCert = sslcertlist[i]; + conn.SslKey = sslkeylist[i]; + conn.SslCa = _sslCa; + using (var c = new MySqlConnection(connClassic.ConnectionString)) + { + c.Open(); + Assert.That(c.State, Is.EqualTo(ConnectionState.Open)); + } + } + } + + [Test, Description("Clasic-Scenario(correct ssl-ca,no ssl-key/ssl-cert,ssl-mode required and default)")] + public void CorrectSslcaNoSslkeyorCertRequiredMode() + { + Assume.That(Platform.IsWindows(), "This test is only for Windows OS"); + Assume.That(Version >= new Version(8, 0, 16), "This test for MySql server 8.0.16 or higher"); + var connClassic = new MySqlConnectionStringBuilder(); + connClassic.Server = Host; + connClassic.Port = Convert.ToUInt32(Port); + connClassic.UserID = Settings.UserID; + connClassic.Password = Settings.Password; + connClassic.SslCa = _sslCa; + connClassic.SslMode = MySqlSslMode.Required; + using (var c = new MySqlConnection(connClassic.ConnectionString)) + { + c.Open(); + Assert.That(c.State, Is.EqualTo(ConnectionState.Open)); + } + + connClassic = new MySqlConnectionStringBuilder(); + connClassic.Server = Host; + connClassic.Port = Convert.ToUInt32(Port); + connClassic.UserID = Settings.UserID; + connClassic.Password = Settings.Password; + connClassic.SslCa = _sslCa; + using (var c = new MySqlConnection(connClassic.ConnectionString)) + { + c.Open(); + Assert.That(c.State, Is.EqualTo(ConnectionState.Open)); + } + + connClassic = new MySqlConnectionStringBuilder(); + connClassic.Server = Host; + connClassic.Port = Convert.ToUInt32(Port); + connClassic.UserID = Settings.UserID; + connClassic.Password = Settings.Password; + connClassic.SslCa = _sslCa; + connClassic.SslMode = MySqlSslMode.Prefered; + using (var c = new MySqlConnection(connClassic.ConnectionString)) + { + c.Open(); + Assert.That(c.State, Is.EqualTo(ConnectionState.Open)); + } + + connClassic = new MySqlConnectionStringBuilder(); + connClassic.Server = Host; + connClassic.Port = Convert.ToUInt32(Port); + connClassic.UserID = Settings.UserID; + connClassic.Password = Settings.Password; + connClassic.SslCa = _sslCa; + connClassic.SslMode = MySqlSslMode.Preferred; + using (var c = new MySqlConnection(connClassic.ConnectionString)) + { + c.Open(); + Assert.That(c.State, Is.EqualTo(ConnectionState.Open)); + } + + var conn = new MySqlXConnectionStringBuilder(); + conn.Server = Host; + conn.Port = Convert.ToUInt32(Port); + conn.UserID = Settings.UserID; + conn.Password = Settings.Password; + conn.SslCa = _sslCa; + conn.SslMode = MySqlSslMode.Required; + using (var c = new MySqlConnection(conn.ConnectionString)) + { + c.Open(); + Assert.That(c.State, Is.EqualTo(ConnectionState.Open)); + } + + conn = new MySqlXConnectionStringBuilder(); + conn.Server = Host; + conn.Port = Convert.ToUInt32(Port); + conn.UserID = Settings.UserID; + conn.Password = Settings.Password; + conn.SslCa = _sslCa; + using (var c = new MySqlConnection(conn.ConnectionString)) + { + c.Open(); + Assert.That(c.State, Is.EqualTo(ConnectionState.Open)); + } + } + + [Test, Description("checking different versions of TLS versions")] + public void SecurityTlsCheck() + { + Assume.That(Platform.IsWindows(), "This test is only for Windows OS"); + Assume.That(Version >= new Version(8, 0, 16), "This test for MySql server 8.0.16 or higher"); + Assume.That(ServerHaveSsl(), "Server doesn't have Ssl support"); + + MySqlSslMode[] modes = { MySqlSslMode.Required, MySqlSslMode.VerifyCA, MySqlSslMode.VerifyFull }; + String[] version; + var conStr = $"server={Host};port={Port};userid={Settings.UserID};password={Settings.Password};SslCa={_sslCa};SslCert={_sslCert};SslKey={_sslKey};ssl-ca-pwd=pass"; + + foreach (MySqlSslMode mode in modes) + { + version = new string[] { "TLSv1.2" }; + foreach (string tlsVersion in version) + { + using (var conn = new MySqlConnection(conStr + ";ssl-mode=" + mode + ";tls-version=" + tlsVersion)) + { + conn.Open(); + MySqlCommand cmd = new MySqlCommand("SELECT variable_value FROM performance_schema.session_status WHERE VARIABLE_NAME='Ssl_version'", conn); + object result = cmd.ExecuteScalar(); + Assert.That(result, Is.EqualTo(tlsVersion)); + } + } + + version = new string[] { "[TLSv1.1,TLSv1.2]", "[TLSv1,TLSv1.2]" }; + for (int i = 0; i < 2; i++) + { + using (var conn = new MySqlConnection(conStr + ";ssl-mode=" + mode + ";tls-version=" + version[i])) + { + // TLSv1.0 and TLSv1.1 has been deprecated in Ubuntu 20.04 so an exception is thrown + try { conn.Open(); } + catch (Exception ex) { Assert.That(ex is AuthenticationException); return; } + MySqlCommand cmd = new MySqlCommand("SELECT variable_value FROM performance_schema.session_status WHERE VARIABLE_NAME='Ssl_version'", conn); + object result = cmd.ExecuteScalar(); + Assert.That(result.ToString().StartsWith("TLSv1")); + } + } + } + } + + [Test, Description("checking errors when invalid values are used ")] + public void InvalidTlsversionValues() + { + Assume.That(Version >= new Version(8, 0, 16), "This test for MySql server 8.0.16 or higher"); + Assume.That(ServerHaveSsl(), "Server doesn't have Ssl support"); + + string[] version = new string[] { "null", "v1", "[ ]", "[TLSv1.9]", "[TLSv1.1,TLSv1.7]", "ui9" };//blank space is considered as default value + var conStr = $"server={Host};port={Port};userid={Settings.UserID};password={Settings.Password};SslCa={_sslCa};SslCert={_sslCert};SslKey={_sslKey};ssl-ca-pwd=pass"; + MySqlConnection conn; + foreach (string tlsVersion in version) + { + Assert.Throws(() => conn = new MySqlConnection(conStr + $";ssl-mode={MySqlSslMode.Required};tls-version={tlsVersion}")); + } + + // Not supported protocols + var ex = Assert.Throws(() => conn = new MySqlConnection(conStr + $";ssl-mode={MySqlSslMode.Required};tls-version=[TLSv1];tls-version=[TLSv1]")); + Assert.That(ex.Message, Is.EqualTo("TLS protocols TLSv1 and TLSv1.1 are no longer supported. Accepted values are TLSv1.2 and TLSv1.3").IgnoreCase); + + // Repeated options are allowed + Assert.DoesNotThrow(() => conn = new MySqlConnection(conStr + $";ssl-mode={MySqlSslMode.Required};tls-version=[TLSv1.1,TLSv1.2];tls-version=[TLSv1.2]")); + } + + [Test, Description("Default SSL user with SSL but without SSL Parameters")] + public void SslUserWithoutSslParams() + { + Assume.That(ServerHaveSsl(), "Server doesn't have Ssl support"); + MySqlCommand cmd = new MySqlCommand(); + string connstr = $"server={Host};user={Settings.UserID};port={Port};password={Settings.Password};sslmode={MySqlSslMode.Disabled}"; + using (var c = new MySqlConnection(connstr)) + { + c.Open(); + cmd.Connection = c; + cmd.CommandText = "SHOW STATUS like 'ssl_cipher'"; + cmd.ExecuteNonQuery(); + var rdr1 = cmd.ExecuteReader(); + while (rdr1.Read()) + Assert.That(rdr1.GetValue(1).ToString().Trim() == ""); + } + + connstr = $"server={Host};user={Settings.UserID};port={Port};password=;sslmode={MySqlSslMode.Disabled}"; + using (var c = new MySqlConnection(connstr)) + { + Assert.Throws(() => c.Open()); + } + } + + [Test] + public void PositiveSslConnectionWithCertificates() + { + Assume.That(Version >= new Version(5, 7, 0), "This test for MySql server 5.7 or higher"); + Assume.That(ServerHaveSsl(), "Server doesn't have Ssl support"); + MySqlCommand cmd = new MySqlCommand(); + + var connStr = $"server={Host};port={Port};user={Settings.UserID};password={Settings.Password};CertificateFile={_sslCa};CertificatePassword=pass;SSL Mode=Required;"; + using (var c = new MySqlConnection(connStr)) + { + c.Open(); + cmd.Connection = c; + cmd.CommandText = "show variables like 'tls_version'"; + using (var rdr = cmd.ExecuteReader()) + { + while (rdr.Read()) + { + Assert.That(rdr.GetValue(1).ToString().Trim().Contains("TLSv1")); + } + } + + cmd.CommandText = "show status like 'Ssl_cipher'"; + using (var rdr = cmd.ExecuteReader()) + { + while (rdr.Read()) + { + Assert.That(rdr.GetValue(1).ToString().Trim().Length > 0); + } + } + + cmd.CommandText = "show status like 'Ssl_version'"; + using (var rdr = cmd.ExecuteReader()) + { + while (rdr.Read()) + { + Assert.That(rdr.GetValue(1).ToString().StartsWith("TLSv1")); + } + } + } + + connStr = $"server={Host};port={Port};user={Settings.UserID};password={Settings.Password};sslcert={_sslCert};sslkey={_sslKey};sslca={_sslCa};SSL Mode=VerifyCA;"; + using (var c = new MySqlConnection(connStr)) + { + c.Open(); + cmd.Connection = c; + cmd.CommandText = "show status like 'Ssl_version'"; + using (var rdr = cmd.ExecuteReader()) + { + while (rdr.Read()) + { + Assert.That(rdr.GetValue(1).ToString().Trim().Contains("TLSv1")); + } + } + + cmd.Connection = c; + cmd.CommandText = "show status like 'Ssl_cipher'"; + using (var rdr = cmd.ExecuteReader()) + { + while (rdr.Read()) + { + Assert.That(rdr.GetValue(1).ToString().Trim().Length > 0); + } + } + cmd.Connection = c; + cmd.CommandText = "show status like 'Ssl_version'"; + using (var rdr = cmd.ExecuteReader()) + { + while (rdr.Read()) + { + Assert.That(rdr.GetValue(1).ToString().StartsWith("TLSv1")); + } + } + } + } + + /// + /// WL14828 - Align TLS option checking across connectors + /// + [TestCase(MySqlSslMode.Disabled)] + [TestCase(MySqlSslMode.Disabled, "ssl-ca=foo")] + [TestCase(MySqlSslMode.Disabled, "ssl-cert=foo")] + [TestCase(MySqlSslMode.Disabled, "ssl-key=foo")] + [TestCase(MySqlSslMode.Disabled, "tls-version=TLSv1.2")] + [TestCase(MySqlSslMode.Required, "ssl-mode=disabled")] + [Theory] + public void SslOptionsCombinedWhenDisabled(MySqlSslMode sslMode, string sslOption = "") + { + var connStr = Connection.ConnectionString + $";ssl-mode={sslMode};{sslOption}"; + + using var conn = new MySqlConnection(connStr); + conn.Open(); + var cmd = new MySqlCommand("SHOW SESSION STATUS LIKE 'Ssl_cipher'", conn); + using var reader = cmd.ExecuteReader(); + reader.Read(); + string encryption = reader.GetString(1); + + Assert.That(encryption, Is.Empty); + Assert.That(conn.State, Is.EqualTo(ConnectionState.Open)); + } + + [Test] + public void SslRequiredOverDisabled() + { + var connStr = Connection.ConnectionString + $";ssl-mode={MySqlSslMode.Disabled};ssl-mode={MySqlSslMode.Required}"; + + using var conn = new MySqlConnection(connStr); + conn.Open(); + var cmd = new MySqlCommand("SHOW SESSION STATUS LIKE 'Ssl_cipher'", conn); + using var reader = cmd.ExecuteReader(); + reader.Read(); + string encryption = reader.GetString(1); + + Assert.That(encryption, Is.Not.Empty); + Assert.That(conn.State, Is.EqualTo(ConnectionState.Open)); + } + + /// + /// Bug #33179908 [SSL CONNECTION FAILS WITH CHAINED CERTIFICATES] + /// In order to execute this tests, it is needed to start the server with next configuration: + /// --ssl-ca=/ca/root.crt --ssl-key=/server/server.key --ssl-cert=/server/server.cachain + /// The chained certificates (certificates.zip) are attached in the bug report. + /// + [Ignore("MySQL Server needs to start with special configuration.")] + [TestCase(MySqlSslMode.VerifyCA)] + [TestCase(MySqlSslMode.VerifyFull)] + public void SslChainedCertificates(MySqlSslMode sslMode) + { + MySqlConnectionStringBuilder stringBuilder = new() + { + Server = "localhost", + Port = 3306, + UserID = "root", + SslCa = @"\root.crt", + SslCert = @"\client.cachain", + SslKey = @"\client.key", + SslMode = sslMode + }; + + using var conn = new MySqlConnection(stringBuilder.ConnectionString); + conn.Open(); + + Assert.That(conn.State == ConnectionState.Open); + } + + #region Methods + public bool ServerHaveSsl() + { + Dictionary strValues = new(); + + var commandList = new string[] { "show status like '%Ssl_version'", "show variables like 'tls_version'" }; + foreach (var item in commandList) + { + var cmd = Connection.CreateCommand(); + cmd.CommandText = item; + using (var rdr = cmd.ExecuteReader()) + { + while (rdr.Read()) + { + strValues[rdr.GetString(0)] = rdr.GetString(1); + } + } + } + return (strValues["Ssl_version"].StartsWith("TLS") && !string.IsNullOrEmpty(strValues["tls_version"])) ? true : false; + } + #endregion Methods + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/StoredProcedure.cs b/MySQL.Data/tests/MySql.Data.Tests/StoredProcedure.cs new file mode 100644 index 000000000..87bda77c9 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/StoredProcedure.cs @@ -0,0 +1,1225 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Data; +using System.Data.Common; +using System.Globalization; +using System.Threading; + +namespace MySql.Data.MySqlClient.Tests +{ + public class StoredProcedure : TestBase + { + protected override void Cleanup() + { + ExecuteSQL("DROP PROCEDURE IF EXISTS spTest"); + ExecuteSQL(String.Format("DROP TABLE IF EXISTS `{0}`.Test", Connection.Database)); + ExecuteSQL("DROP DATABASE IF EXISTS `dotnet3.1`"); + Connection.ProcedureCache.Clear(); + } + + /// + /// Bug #7623 Adding MySqlParameter causes error if MySqlDbType is Decimal + /// + [Test] + public void ReturningResultset() + { + // create our procedure + ExecuteSQL("CREATE PROCEDURE spTest(val decimal(10,3)) begin select val; end"); + + using (MySqlCommand cmd = new MySqlCommand("spTest", Connection)) + { + cmd.CommandType = CommandType.StoredProcedure; + + MySqlParameter p = cmd.Parameters.Add("?val", MySqlDbType.Decimal); + p.Precision = 10; + p.Scale = 3; + p.Value = 21; + + decimal id = (decimal)cmd.ExecuteScalar(); + Assert.That(id, Is.EqualTo(21)); + } + } + + [Test] + public void NonQuery() + { + ExecuteSQL("CREATE TABLE Test(id INT, name VARCHAR(20))"); + ExecuteSQL(@"CREATE PROCEDURE spTest(IN value INT) + BEGIN INSERT INTO Test VALUES(value, 'Test'); END"); + + //setup testing data + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.AddWithValue("?value", 2); + int rowsAffected = cmd.ExecuteNonQuery(); + Assert.That(rowsAffected, Is.EqualTo(1)); + + cmd.CommandText = "SELECT * FROM Test"; + cmd.CommandType = CommandType.Text; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetInt32(0), Is.EqualTo(2)); + Assert.That(reader.GetString(1), Is.EqualTo("Test")); + Assert.That(reader.Read(), Is.False); + Assert.That(reader.NextResult(), Is.False); + } + } + + [Test] + public void NoBatch() + { + MySqlCommand cmd = new MySqlCommand("spTest;select * from Test", Connection); + cmd.CommandType = CommandType.StoredProcedure; + Exception ex = Assert.Throws(() => cmd.ExecuteNonQuery()); + } + + [Test] + public void WrongParameters() + { + ExecuteSQL("CREATE PROCEDURE spTest(p1 INT) BEGIN SELECT 1; END"); + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.AddWithValue("?p2", 1); + Exception ex = Assert.Throws(() => cmd.ExecuteNonQuery()); + } + + [Test] + public void NoInOutMarker() + { + // create our procedure + ExecuteSQL("CREATE PROCEDURE spTest(valin varchar(50)) BEGIN SELECT valin; END"); + + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.AddWithValue("?valin", "myvalue"); + object val = cmd.ExecuteScalar(); + Assert.That(val, Is.EqualTo("myvalue")); + } + + [Test] + public void NoSPOnPre50() + { + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.CommandType = CommandType.StoredProcedure; + Exception ex = Assert.Throws(() => cmd.ExecuteNonQuery()); + } + + /// + /// Bug #13590 ExecuteScalar returns only Int64 regardless of actual SQL type + /// + [Test] + public void ExecuteScalar2() + { + // create our procedure + ExecuteSQL("CREATE PROCEDURE spTest() " + + "BEGIN DECLARE myVar1 INT; SET myVar1 := 1; SELECT myVar1; END"); + + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.CommandType = CommandType.StoredProcedure; + object result = cmd.ExecuteScalar(); + Assert.That(result, Is.EqualTo(1)); + Assert.That(result is Int32); + } + + [Test] + public void MultipleResultsets() + { + MultipleResultsetsImpl(false); + } + + [Test] + [Ignore("Fix this")] + public void MultipleResultsetsPrepared() + { + MultipleResultsetsImpl(true); + } + + private void MultipleResultsetsImpl(bool prepare) + { + ExecuteSQL("DROP PROCEDURE IF EXISTS multiResults"); + // create our procedure + ExecuteSQL("CREATE PROCEDURE multiResults() BEGIN SELECT 1; SELECT 2; END"); + + MySqlCommand cmd = new MySqlCommand("multiResults", Connection); + if (prepare) cmd.Prepare(); + cmd.CommandType = CommandType.StoredProcedure; + MySqlDataReader reader = cmd.ExecuteReader(); + Assert.That(reader.Read()); + Assert.That(reader.NextResult()); + Assert.That(reader.Read()); + Assert.That(reader.NextResult(), Is.False); + Assert.That(reader.Read(), Is.False); + reader.Close(); + + DataSet ds = new DataSet(); + MySqlCommand cmd2 = new MySqlCommand("multiResults", Connection); + cmd2.CommandType = CommandType.StoredProcedure; + MySqlDataAdapter da = new MySqlDataAdapter(cmd2); + da.FillError += new FillErrorEventHandler(da_FillError); + fillError = null; + da.Fill(ds); + Assert.That(ds.Tables.Count, Is.EqualTo(2)); + Assert.That(Convert.ToInt32(ds.Tables[0].Rows.Count), Is.EqualTo(1)); + Assert.That(Convert.ToInt32(ds.Tables[1].Rows.Count), Is.EqualTo(1)); + Assert.That(Convert.ToInt32(ds.Tables[0].Rows[0][0]), Is.EqualTo(1)); + Assert.That(Convert.ToInt32(ds.Tables[1].Rows[0][0]), Is.EqualTo(2)); + Assert.That(fillError, Is.Null); + } + + private static string fillError = null; + + private static void da_FillError(object sender, FillErrorEventArgs e) + { + fillError = e.Errors.Message; + e.Continue = true; + } + + [Test] + public void ExecuteWithCreate() + { + // create our procedure + string sql = "CREATE PROCEDURE spTest(IN var INT) BEGIN SELECT var; END; call spTest(?v)"; + + MySqlCommand cmd = new MySqlCommand(sql, Connection); + cmd.Parameters.Add(new MySqlParameter("?v", 33)); + object val = cmd.ExecuteScalar(); + Assert.That(val, Is.EqualTo(33)); + } + + /// + /// Bug #9722 Connector does not recognize parameters separated by a linefeed + /// + [Test] + public void OtherProcSigs() + { + // create our procedure + ExecuteSQL("CREATE PROCEDURE spTest(IN \r\nvalin DECIMAL(10,2),\nIN val2 INT) " + + "SQL SECURITY INVOKER BEGIN SELECT valin; END"); + + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.AddWithValue("?valin", 20.4); + cmd.Parameters.AddWithValue("?val2", 4); + decimal val = (decimal)cmd.ExecuteScalar(); + Decimal d = new Decimal(20.4); + Assert.That(val, Is.EqualTo(d)); + + // create our second procedure + ExecuteSQL("DROP PROCEDURE IF EXISTS spTest"); + ExecuteSQL("CREATE PROCEDURE spTest( \r\n) BEGIN SELECT 4; END"); + cmd.Parameters.Clear(); + object val1 = cmd.ExecuteScalar(); + Assert.That(Convert.ToInt32(val1), Is.EqualTo(4)); + } + + /// + /// Bug #11450 Connector/NET, current database and stored procedures + /// + [Test] + public void NoDefaultDatabase() + { + // create our procedure + ExecuteSQL("CREATE PROCEDURE spTest() BEGIN SELECT 4; END"); + string dbName = CreateDatabase("1"); + + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.CommandType = CommandType.StoredProcedure; + object val = cmd.ExecuteScalar(); + Assert.That(Convert.ToInt32(val), Is.EqualTo(4)); + + cmd.CommandText = String.Format("USE `{0}`", dbName); + cmd.CommandType = CommandType.Text; + cmd.ExecuteNonQuery(); + + cmd.CommandText = String.Format("`{0}`.spTest", Connection.Database); + cmd.CommandType = CommandType.StoredProcedure; + val = cmd.ExecuteScalar(); + Assert.That(Convert.ToInt32(val), Is.EqualTo(4)); + + cmd.CommandText = String.Format("USE `{0}`", Connection.Database); + cmd.CommandType = CommandType.Text; + cmd.ExecuteNonQuery(); + } + + /// + /// Bug #13590 ExecuteScalar returns only Int64 regardless of actual SQL type + /// + /* [Test] + public void TestSelectingInts() + { + executeSQL("CREATE PROCEDURE spTest() BEGIN DECLARE myVar INT; " + + "SET MyVar := 1; SELECT CAST(myVar as SIGNED); END"); + + MySqlCommand cmd = new MySqlCommand("spTest", connection); + cmd.CommandType = CommandType.StoredProcedure; + object val = cmd.ExecuteScalar(); + Assert.AreEqual(1, val, "Checking value"); + Assert.True(val is Int32, "Checking type"); + } + */ + + /// + /// Bug #11386 Numeric parameters with Precision and Scale not taken into account by Connector + /// + [Test] + public void DecimalAsParameter() + { + ExecuteSQL("CREATE PROCEDURE spTest(IN d DECIMAL(19,4)) BEGIN SELECT d; END"); + + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.AddWithValue("?d", 21); + decimal d = (decimal)cmd.ExecuteScalar(); + Assert.That(d, Is.EqualTo(21)); + } + + /// + /// Bug #6902 Errors in parsing stored procedure parameters + /// + [Test] + public void ParmWithCharacterSet() + { + ExecuteSQL("CREATE PROCEDURE spTest(P longtext character set utf8) " + + "BEGIN SELECT P; END"); + + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.AddWithValue("?P", "This is my value"); + string p = (string)cmd.ExecuteScalar(); + Assert.That(p, Is.EqualTo("This is my value")); + } + + /// + /// Bug #13753 Exception calling stored procedure with special characters in parameters + /// + [Test] + public void SpecialCharacters() + { + ExecuteSQL("SET sql_mode=ANSI_QUOTES"); + try + { + ExecuteSQL("CREATE PROCEDURE spTest(\"@Param1\" text) BEGIN SELECT \"@Param1\"; END"); + + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.Parameters.AddWithValue("@Param1", "This is my value"); + cmd.CommandType = CommandType.StoredProcedure; + + string val = (string)cmd.ExecuteScalar(); + Assert.That(val, Is.EqualTo("This is my value")); + } + finally + { + ExecuteSQL("SET sql_mode=\"\""); + } + } + + [Test] + public void CallingSPWithPrepare() + { + ExecuteSQL("CREATE PROCEDURE spTest(P int) BEGIN SELECT P; END"); + + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.AddWithValue("?P", 33); + cmd.Prepare(); + + int p = (int)cmd.ExecuteScalar(); + Assert.That(p, Is.EqualTo(33)); + } + + /// + /// Bug #13927 Multiple Records to same Table in Transaction Problem + /// + [Test] + public void MultipleRecords() + { + ExecuteSQL("CREATE TABLE Test (id INT, name VARCHAR(20))"); + ExecuteSQL("CREATE PROCEDURE spTest(id int, str VARCHAR(45)) " + + "BEGIN INSERT INTO Test VALUES(id, str); END"); + + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.CommandType = CommandType.StoredProcedure; + + cmd.Parameters.AddWithValue("?id", 1); + cmd.Parameters.AddWithValue("?str", "First record"); + cmd.ExecuteNonQuery(); + + cmd.Parameters.Clear(); + cmd.Parameters.AddWithValue("?id", 2); + cmd.Parameters.AddWithValue("?str", "Second record"); + cmd.ExecuteNonQuery(); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + DataTable dt = new DataTable(); + da.Fill(dt); + + Assert.That(dt.Rows[0]["id"], Is.EqualTo(1)); + Assert.That(dt.Rows[1]["id"], Is.EqualTo(2)); + Assert.That(dt.Rows[0]["name"], Is.EqualTo("First record")); + Assert.That(dt.Rows[1]["name"], Is.EqualTo("Second record")); + } + + /// + /// Bug #16788 Only byte arrays and strings can be serialized by MySqlBinary + /// + [Test] + public void Bug16788() + { + ExecuteSQL("CREATE TABLE Test (id integer(9), state varchar(2))"); + ExecuteSQL("CREATE PROCEDURE spTest(IN p1 integer(9), IN p2 varchar(2)) " + + "BEGIN " + + "INSERT INTO Test (id, state) VALUES (p1, p2); " + + "END"); + + MySqlCommand cmd = Connection.CreateCommand(); + cmd.CommandType = CommandType.StoredProcedure; + cmd.CommandText = "spTest"; + cmd.Parameters.Add("?p1", MySqlDbType.UInt16, 9); + cmd.Parameters["?p1"].Value = 44; + cmd.Parameters.Add("?p2", MySqlDbType.VarChar, 2); + cmd.Parameters["?p2"].Value = "ss"; + cmd.ExecuteNonQuery(); + } + + [Test] + public void ProcedureCache() + { + // open a new connection using a procedure cache + string connStr = Connection.ConnectionString; + connStr += ";procedure cache size=25;logging=true"; + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + + // install our custom trace listener + GenericListener myListener = new GenericListener(); + System.Diagnostics.Trace.Listeners.Add(myListener); + + for (int x = 0; x < 10; x++) + { + ExecuteSQL("CREATE PROCEDURE spTest" + x + "() BEGIN SELECT 1; END"); + MySqlCommand cmd = new MySqlCommand("spTest" + x, c); + cmd.CommandType = CommandType.StoredProcedure; + for (int y = 0; y < 20; y++) + { + cmd.ExecuteNonQuery(); + } + } + + // remove our custom trace listener + System.Diagnostics.Trace.Listeners.Remove(myListener); + + // now see how many times our listener recorded a cache hit + Assert.That(myListener.Find("from procedure cache"), Is.EqualTo(190)); + Assert.That(myListener.Find("from server"), Is.EqualTo(10)); + } + } + + /// + /// Bug #20581 Null Reference Exception when closing reader after stored procedure. + /// + [Test] + public void Bug20581() + { + ExecuteSQL("CREATE PROCEDURE spTest(p int) BEGIN SELECT p; END"); + MySqlParameter param1; + MySqlCommand command = new MySqlCommand("spTest", Connection); + command.CommandType = CommandType.StoredProcedure; + + param1 = command.Parameters.Add("?p", MySqlDbType.Int32); + param1.Value = 3; + + command.Prepare(); + using (MySqlDataReader reader = command.ExecuteReader()) + { + reader.Read(); + } + } + + /// + /// Bug #17046 Null pointer access when stored procedure is used + /// + [Test] + public void PreparedReader() + { + ExecuteSQL("CREATE TABLE Test (id int(10) unsigned NOT NULL default '0', " + + "val int(10) unsigned default NULL, PRIMARY KEY (id)) " + + "ENGINE=InnoDB DEFAULT CHARSET=utf8"); + ExecuteSQL("CREATE PROCEDURE spTest (IN pp INTEGER) " + + "select * from Test where id > pp "); + + MySqlCommand c = new MySqlCommand("spTest", Connection); + c.CommandType = CommandType.StoredProcedure; + IDataParameter p = c.CreateParameter(); + p.ParameterName = "?pp"; + p.Value = 10; + c.Parameters.Add(p); + c.Prepare(); + using (MySqlDataReader reader = c.ExecuteReader()) + { + while (reader.Read()) + { + + } + } + } + + /// + /// Bug #22452 MySql.Data.MySqlClient.MySqlException: + /// + [Test] + public void TurkishStoredProcs() + { + ExecuteSQL("CREATE PROCEDURE spTest(IN p_paramname INT) BEGIN SELECT p_paramname; END"); + CultureInfo uiCulture = Thread.CurrentThread.CurrentUICulture; + CultureInfo culture = Thread.CurrentThread.CurrentCulture; + Thread.CurrentThread.CurrentCulture = new CultureInfo("tr-TR"); + Thread.CurrentThread.CurrentUICulture = new CultureInfo("tr-TR"); + + try + { + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.Parameters.AddWithValue("?p_paramname", 2); + cmd.CommandType = CommandType.StoredProcedure; + cmd.ExecuteScalar(); + } + finally + { + Thread.CurrentThread.CurrentCulture = culture; + Thread.CurrentThread.CurrentUICulture = uiCulture; + } + } + + /// + /// Bug #23268 System.FormatException when invoking procedure with ENUM input parameter + /// + [Test] + public void ProcEnumParamTest() + { + ExecuteSQL("CREATE TABLE Test(str VARCHAR(50), e ENUM ('P','R','F','E'), i INT(6))"); + ExecuteSQL("CREATE PROCEDURE spTest(IN p_enum ENUM('P','R','F','E')) BEGIN " + + "INSERT INTO Test (str, e, i) VALUES (null, p_enum, 55); END"); + + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.AddWithValue("?p_enum", "P"); + cmd.Parameters["?p_enum"].Direction = ParameterDirection.Input; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + } + cmd.CommandText = "SELECT e FROM Test"; + cmd.CommandType = CommandType.Text; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetString(0), Is.EqualTo("P")); + } + } + + /// + /// Bug #25609 MySqlDataAdapter.FillSchema + /// + [Test] + public void GetSchema() + { + ExecuteSQL("CREATE PROCEDURE GetSchema() BEGIN SELECT * FROM Test; END"); + ExecuteSQL(@"CREATE TABLE Test(id INT AUTO_INCREMENT, name VARCHAR(20), PRIMARY KEY (id)) "); + + MySqlCommand cmd = new MySqlCommand("GetSchema", Connection); + cmd.CommandType = CommandType.StoredProcedure; + + MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly); + reader.Read(); + reader.Close(); + + MySqlDataAdapter da = new MySqlDataAdapter(cmd); + DataTable schema = new DataTable(); + da.FillSchema(schema, SchemaType.Source); + Assert.That(schema.Columns.Count, Is.EqualTo(2)); + } + + /// + /// Bug #26139 MySqlCommand.LastInsertedId doesn't work for stored procedures + /// Currently this is borked on the server so we are marking this as notworking + /// until the server has this fixed. + /// + /* [Test] + public void LastInsertId() + { + executeSQL("CREATE TABLE Test (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(200))"); + executeSQL("INSERT INTO Test VALUES (NULL, 'Test1')"); + executeSQL("CREATE PROCEDURE spTest() BEGIN " + + "INSERT INTO Test VALUES (NULL, 'test'); END"); + + MySqlCommand cmd = new MySqlCommand("spTest", connection); + cmd.CommandType = CommandType.StoredProcedure; + cmd.ExecuteNonQuery(); + Assert.AreEqual(2, cmd.LastInsertedId); + } + */ + + /// + /// Bug #27093 Exception when using large values in IN UInt64 parameters + /// + [Test] + public void UsingUInt64AsParam() + { + ExecuteSQL(@"CREATE TABLE Test(f1 bigint(20) unsigned NOT NULL, + PRIMARY KEY(f1)) ENGINE=InnoDB DEFAULT CHARSET=utf8"); + + ExecuteSQL(@"CREATE PROCEDURE spTest(in _val bigint unsigned) + BEGIN insert into Test set f1=_val; END"); + + DbCommand cmd = new MySqlCommand(); + DbParameter param = cmd.CreateParameter(); + param.DbType = DbType.UInt64; + cmd.Connection = Connection; + cmd.CommandType = CommandType.StoredProcedure; + cmd.CommandText = "spTest"; + param.Direction = ParameterDirection.Input; + param.ParameterName = "?_val"; + ulong bigval = long.MaxValue; + bigval += 1000; + param.Value = bigval; + cmd.Parameters.Add(param); + cmd.ExecuteNonQuery(); + } + + /// + /// Bug #29526 syntax error: "show create procedure" with catalog names containing hyphens + /// + [Test] + public void CatalogWithHyphens() + { + // make sure this test is valid + Assert.That(Connection.Database.IndexOf('-') != -1); + + MySqlCommand cmd = new MySqlCommand("CREATE PROCEDURE spTest() BEGIN SELECT 1; END", Connection); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "spTest"; + cmd.CommandType = CommandType.StoredProcedure; + Assert.That(Convert.ToInt32(cmd.ExecuteScalar()), Is.EqualTo(1)); + } + + [Test] + public void ComplexDefinition() + { + Cleanup(); + ExecuteSQL(@"CREATE PROCEDURE `spTest`() NOT DETERMINISTIC + CONTAINS SQL SQL SECURITY DEFINER COMMENT '' + BEGIN + SELECT 1,2,3; + END"); + MySqlCommand command = new MySqlCommand("spTest", Connection); + command.CommandType = CommandType.StoredProcedure; + using (MySqlDataReader reader = command.ExecuteReader()) + { + } + } + + [Test] + public void AmbiguousColumns() + { + ExecuteSQL("CREATE TABLE t1 (id INT)"); + ExecuteSQL("CREATE TABLE t2 (id1 INT, id INT)"); + ExecuteSQL(@"CREATE PROCEDURE spTest() BEGIN SELECT * FROM t1; + SELECT id FROM t1 JOIN t2 on t1.id=t2.id; + SELECT * FROM t2; END"); + + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.CommandType = CommandType.StoredProcedure; + cmd.CommandTimeout = 0; + MySqlDataAdapter da = new MySqlDataAdapter(cmd); + DataSet ds = new DataSet(); + Exception ex = Assert.Throws(() => da.Fill(ds)); + } + + /// + /// Bug #41034 .net parameter not found in the collection + /// + [Test] + public void SPWithSpaceInParameterType() + { + ExecuteSQL("CREATE PROCEDURE spTest(myparam decimal (8,2)) BEGIN SELECT 1; END"); + + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.Parameters.Add("@myparam", MySqlDbType.Decimal).Value = 20; + cmd.CommandType = CommandType.StoredProcedure; + object o = cmd.ExecuteScalar(); + Assert.That(Convert.ToInt32(o), Is.EqualTo(1)); + } + + private void ParametersInReverseOrderInternal(bool isOwner) + { + ExecuteSQL(@"CREATE PROCEDURE spTest(IN p_1 VARCHAR(5), IN p_2 VARCHAR(5)) + BEGIN SELECT p_1 AS P1, p_2 AS P2; END"); + string spName = "spTest"; + + string connStr = Connection.ConnectionString; + if (!isOwner) + connStr += ";check parameters=false"; + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + MySqlCommand cmd = new MySqlCommand(spName, c); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.AddWithValue("?p_2", ("World")); + cmd.Parameters[0].Direction = ParameterDirection.Input; + cmd.Parameters.AddWithValue("?p_1", ("Hello")); + cmd.Parameters[1].Direction = ParameterDirection.Input; + cmd.Parameters[0].DbType = DbType.AnsiString; + cmd.Parameters[1].DbType = DbType.AnsiString; + MySqlDataAdapter da = new MySqlDataAdapter(cmd); + DataTable dt = new DataTable(); + da.Fill(dt); + if (!isOwner) + { + Assert.That(dt.Rows[0][0], Is.EqualTo("World")); + Assert.That(dt.Rows[0][1], Is.EqualTo("Hello")); + } + else + { + Assert.That(dt.Rows[0]["P1"], Is.EqualTo("Hello")); + Assert.That(dt.Rows[0]["P2"], Is.EqualTo("World")); + } + } + } + + [Test] + public void ParametersInReverseOrderNotOwner() + { + ParametersInReverseOrderInternal(false); + } + + [Test] + public void ParametersInReverseOrderOwner() + { + ParametersInReverseOrderInternal(true); + } + + [Test] + public void DeriveParameters() + { + ExecuteSQL(@"CREATE PROCEDURE spTest (id INT, name VARCHAR(20)) + BEGIN SELECT name; END"); + + MySqlCommand cmd = new MySqlCommand("spTest", Connection); + cmd.CommandType = CommandType.StoredProcedure; + MySqlCommandBuilder.DeriveParameters(cmd); + Assert.That(cmd.Parameters.Count, Is.EqualTo(2)); + } + + /// + /// Bug #52562 Sometimes we need to reload cached function parameters + /// + [Test] + public void ProcedureCacheMiss() + { + + ExecuteSQL("CREATE PROCEDURE spTest(id INT) BEGIN SELECT 1; END"); + + string connStr = Connection.ConnectionString + ";procedure cache size=25;"; + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + MySqlCommand cmd = new MySqlCommand("spTest", c); + cmd.Parameters.AddWithValue("@id", 1); + cmd.CommandType = CommandType.StoredProcedure; + cmd.ExecuteScalar(); + + ExecuteSQL("DROP PROCEDURE spTest"); + ExecuteSQL("CREATE PROCEDURE spTest(id INT, id2 INT, id3 INT) BEGIN SELECT 1; END"); + + cmd.Parameters.AddWithValue("@id2", 2); + cmd.Parameters.AddWithValue("@id3", 3); + cmd.ExecuteScalar(); + } + } + + /// + /// Verifies that GetProcedureParameters does not require SELECT permission on mysql.proc table. + /// + [Test] + public void GetProcedureParametersDoesNotRequireSelectFromMySqlProceduresTable() + { + ExecuteSQL(@"CREATE PROCEDURE spTest(id INT, name VARCHAR(20)) + BEGIN SELECT name; END"); + + MySqlConnectionStringBuilder cb = new MySqlConnectionStringBuilder(Connection.ConnectionString); + cb.CheckParameters = false; + + using (MySqlConnection c = new MySqlConnection(cb.ConnectionString)) + { + c.Open(); + + string[] restrictions = new string[4]; + restrictions[1] = c.Database; + restrictions[2] = "spTest"; + + DataTable procTable = c.GetSchema("procedures", restrictions); + + ISSchemaProvider isp = new ISSchemaProvider(c); + string[] rest = isp.CleanRestrictions(restrictions); + + MySqlSchemaCollection parametersTable = isp.GetProcedureParametersAsync(rest, new MySqlSchemaCollection(procTable), false).GetAwaiter().GetResult(); + + Assert.That(parametersTable, Is.Not.Null); + } + } + + /// + /// Bug #31237338 CANNOT CALL STORED PROCEDURES IN DATABASES WHOSE NAME CONTAINS A PERIOD + /// + [Test] + public void NamesWithPeriods() + { + //stored procedure wich name contains "." + ExecuteSQL("CREATE PROCEDURE `spversion1.2.3`(p int) BEGIN SELECT p; END"); + using (var connection = new MySqlConnection(Connection.ConnectionString)) + { + connection.Open(); + var strName = "`SPversion1.2.3`"; + using (MySqlCommand cmd = new MySqlCommand(strName, Connection)) + { + cmd.Parameters.AddWithValue("?p", 2); + cmd.CommandType = CommandType.StoredProcedure; + var result = cmd.ExecuteScalar(); + Assert.That(result, Is.EqualTo(2)); + } + } + //Database and stored procedure contains "." + ExecuteSQL("CREATE DATABASE IF NOT EXISTS `dotnet3.1`;", true); + ExecuteSQL("CREATE PROCEDURE `dotnet3.1`.`sp_normalname.1`(p int) BEGIN SELECT p; END", true); + using (MySqlConnection rootConnection = new MySqlConnection($"server={Host};port={Port};user id={RootUser};password={RootPassword};persistsecurityinfo=True;allowuservariables=True;database=dotnet3.1;")) + { + rootConnection.Open(); + using (MySqlCommand cmd = new MySqlCommand("`sp_normalname.1`", rootConnection)) + { + cmd.Parameters.AddWithValue("?p", 3); + cmd.CommandType = CommandType.StoredProcedure; + var result = cmd.ExecuteScalar(); + Assert.That(result, Is.EqualTo(3)); + } + } + } + + /// + /// Bug #31622907 GETSCHEMA("PROCEDURES") RETURNS ROUTINE_DEFINITION OF "SYSTEM.BYTE[]" + /// + [Test] + public void GetSchemaProcedures() + { + using (var connection = new MySqlConnection(Connection.ConnectionString)) + { + connection.Open(); + ExecuteSQL($"CREATE PROCEDURE `{connection.Settings.Database}`.`sp_testname1`(p int) BEGIN SELECT p; END", true); + var table = connection.GetSchema("Procedures"); + if (table.Rows.Count > 0) + { + var column = table.Rows[0]["ROUTINE_DEFINITION"]; + Assert.That(column.ToString(), Is.Not.Empty); + } + } + } + + /// + /// Bug #31669587 - COMMAND.PREPARE() SEND WRONG STATEMENT TO SERVER + /// + [Test] + public void ProcedureWithoutDbNameInConnString() + { + ExecuteSQL($"DROP SCHEMA IF EXISTS test_prepare; CREATE SCHEMA test_prepare", true); + ExecuteSQL($"CREATE PROCEDURE test_prepare.spTest () BEGIN SELECT 1; END", true); + + using (MySqlConnection conn = new MySqlConnection($"server={Host};user={RootUser};password={RootPassword};port={Port};")) + { + conn.Open(); + + MySqlCommand command = conn.CreateCommand(); + command.CommandText = $"test_prepare.spTest"; + command.CommandType = CommandType.StoredProcedure; + Assert.That(command.ExecuteScalar(), Is.EqualTo(1)); + + command.CommandText = $"`test_prepare`.`spTest`"; + command.CommandType = CommandType.StoredProcedure; + Assert.That(command.ExecuteScalar(), Is.EqualTo(1)); + } + } + + /// + /// Bug #31458774 PREPARED STORED PROCEDURE COMMAND DOESN'T VERIFY PARAMETER TYPES + /// + [Test] + public void VerifyParametersType() + { + ExecuteSQL($"CREATE PROCEDURE spTest(OUT value VARCHAR(100)) BEGIN SELECT 'test value' INTO value; END"); + + using (var connection = new MySqlConnection(Connection.ConnectionString)) + { + connection.Open(); + + //don't call Prepare() when SP and MySqlParameter have different data types + var cmd = new MySqlCommand("spTest", connection); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.Add(new MySqlParameter + { + ParameterName = "@value", + DbType = DbType.Int32, + Direction = ParameterDirection.Output + }); + Assert.Throws(() => cmd.ExecuteNonQuery()); + + //call Prepare() when SP and MySqlParameter have the same data types + cmd = new MySqlCommand("spTest", connection); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.Add(new MySqlParameter + { + ParameterName = "@value", + DbType = DbType.String, + Direction = ParameterDirection.Output + }); + cmd.Prepare(); + cmd.ExecuteNonQuery(); + var result = cmd.Parameters["@value"].Value; + Assert.That(result, Is.EqualTo("test value")); + + //call Prepare() when SP and MySqlParameter have different data types + cmd = new MySqlCommand("spTest", connection); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.Add(new MySqlParameter + { + ParameterName = "@value", + DbType = DbType.Int32, + Direction = ParameterDirection.Output + }); + cmd.Prepare(); + Assert.Throws(() => cmd.ExecuteNonQuery()); + } + } + + [Test] + public void PassJsonParameter() + { + Assume.That(Version >= new Version(5, 7, 8), "JSON data type was included in MySQL Server from v5.7.8"); + + ExecuteSQL("CREATE TABLE Test(jsonValue json NOT NULL)"); + ExecuteSQL("CREATE PROCEDURE spTest(IN p_jsonValue JSON) BEGIN INSERT INTO Test VALUES(p_jsonValue); END"); + + using (var conn = new MySqlConnection(Connection.ConnectionString)) + { + conn.Open(); + + var cmd = new MySqlCommand("spTest", conn); + cmd.CommandType = CommandType.StoredProcedure; + var json = "{\"prop\":[null]}"; + cmd.Parameters.Add(new MySqlParameter { ParameterName = "p_jsonValue", Value = json }); + cmd.Prepare(); + cmd.ExecuteNonQuery(); + + cmd = new MySqlCommand("SELECT jsonValue FROM Test", conn); + cmd.CommandType = CommandType.Text; + Assert.That(cmd.ExecuteScalar().ToString().Replace(" ", ""), Is.EqualTo(json).IgnoreCase); + } + } + + [Test] + public void PassBoolParameter() + { + ExecuteSQL("CREATE PROCEDURE spTest(success BOOL) BEGIN SELECT success; END"); + + using (var conn = new MySqlConnection(Connection.ConnectionString + ";")) + { + conn.Open(); + + var cmd = new MySqlCommand("spTest", conn); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.Add(new MySqlParameter { ParameterName = "success", Value = true, MySqlDbType = MySqlDbType.Int32 }); + cmd.Prepare(); + Assert.That(Convert.ToBoolean(cmd.ExecuteScalar())); + } + } + + [Test] + public void PassDateTimeParameter() + { + ExecuteSQL($"CREATE PROCEDURE spTest(OUT value DATETIME) BEGIN SELECT '2020-11-27 12:25:59' INTO value; END"); + + using (var connection = new MySqlConnection(Connection.ConnectionString)) + { + connection.Open(); + + var cmd = new MySqlCommand("spTest", connection); + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.Add(new MySqlParameter + { + ParameterName = "@value", + DbType = DbType.DateTime, + Direction = ParameterDirection.Output + }); + + cmd.Prepare(); + cmd.ExecuteNonQuery(); + var result = cmd.Parameters["@value"].Value; + + DateTime dateTime = new DateTime(2020, 11, 27, 12, 25, 59); + Assert.That(result, Is.EqualTo(dateTime)); + } + + ExecuteSQL("DROP PROCEDURE spTest"); + ExecuteSQL("CREATE TABLE Test(DATETIME dateTime)"); + ExecuteSQL("CREATE PROCEDURE spTest(IN p_dateTimeValue DATETIME) BEGIN INSERT INTO Test VALUES(p_dateTimeValue); END"); + + using (var conn = new MySqlConnection(Connection.ConnectionString)) + { + conn.Open(); + + var cmd = new MySqlCommand("spTest", conn); + cmd.CommandType = CommandType.StoredProcedure; + DateTime dateTime = new DateTime(2020, 11, 27, 12, 25, 59); + cmd.Parameters.Add(new MySqlParameter { ParameterName = "p_dateTimeValue", Value = dateTime, MySqlDbType = MySqlDbType.DateTime }); + cmd.ExecuteNonQuery(); + + cmd = new MySqlCommand("SELECT dateTime FROM Test", conn); + cmd.CommandType = CommandType.Text; + Assert.That(cmd.ExecuteScalar(), Is.EqualTo(dateTime)); + } + } + + public enum TestStatus + { + Pending = 1, + InProgress = 2, + Cancel = 3 + } + + /// + /// Bug #101424 Insert/Update enum error "Value *column name* is not of the correct type". + /// + [Test] + public void PassEnumParameter() + { + ExecuteSQL("CREATE PROCEDURE spTest(data ENUM('Pending','InProgress','Cancel'), ID int) BEGIN SELECT 1; END"); + using (var connection = new MySqlConnection(Settings.ConnectionString)) + { + connection.Open(); + MySqlCommand command = new MySqlCommand("spTest", connection); + command.CommandType = CommandType.StoredProcedure; + command.Parameters.Add(new MySqlParameter("data", TestStatus.InProgress)); + command.Parameters.Add(new MySqlParameter("ID", 1)); + command.ExecuteNonQuery(); + } + } + + [Test] + public void EventsStatementsHistory() + { + Assume.That(Version >= new Version(8, 0, 0), "This test is for MySql 8.0 or higher"); + bool testResult = false; + var spName = "spGetCount"; + var cmd = new MySqlCommand(" show variables like 'general_log'", Connection); + using (var rdr = cmd.ExecuteReader()) + { + while (rdr.Read()) + { + Assume.That(rdr.GetString(1) == "ON", "general_log is disabled"); + } + } + + ExecuteSQL("CREATE PROCEDURE spGetCount() BEGIN SELECT 5; END"); + cmd = new MySqlCommand(spName, Connection); + cmd.CommandType = CommandType.StoredProcedure; + var cmd2 = new MySqlCommand("truncate table performance_schema.events_statements_history", Connection); + cmd2.ExecuteNonQuery(); + + using (var rdr = cmd.ExecuteReader()) + { + while (rdr.Read()) + { + Assert.That(rdr.GetString(0), Is.EqualTo("5")); + } + } + + cmd = new MySqlCommand("select SQL_TEXT from performance_schema.events_statements_history where SQL_text is not null;", Connection); + using (var rdr = cmd.ExecuteReader()) + { + while (rdr.Read()) + { + if (rdr.GetString(0).ToString().Contains($"CALL {spName}()")) + { + testResult = true; + } + } + } + Assert.That(testResult); + + cmd = new MySqlCommand($"SELECT count(*) FROM information_schema.routines WHERE 1=1 AND ROUTINE_SCHEMA='{Settings.Database}' AND ROUTINE_NAME='{spName}';", Connection); + var count = cmd.ExecuteScalar(); + Assert.That(count, Is.EqualTo(1)); + + } + + /// + /// Bug #33097912 - FULLY QUALIFIED PROCEDURE OR FUNCTION NAMES FAIL + /// + [Test] + public void FullyQualifiedProcedures() + { + ExecuteSQL("DROP SCHEMA IF EXISTS Test; CREATE SCHEMA Test"); + ExecuteSQL("CREATE PROCEDURE `Test`.`spTest` () BEGIN SELECT 1; END"); + + using (MySqlConnection conn = new MySqlConnection(Connection.ConnectionString)) + { + conn.Open(); + + MySqlCommand command = conn.CreateCommand(); + command.CommandText = $"`Test`.`spTest`"; + command.CommandType = CommandType.StoredProcedure; + Assert.That(command.ExecuteScalar(), Is.EqualTo(1)); + + command.CommandText = $"Test.spTest"; + command.CommandType = CommandType.StoredProcedure; + Assert.That(command.ExecuteScalar(), Is.EqualTo(1)); + } + } + + /// + /// Bug #33338458 - Cannot execute stored procedure with backtick in name + /// + [TestCase("`a``b`", "a`b")] + [TestCase("`a``b`", "`a``b`")] + [TestCase("`my``crazy``proc`", "my`crazy`proc")] + [TestCase("`test.spTest2`", "`test.spTest2`")] + [TestCase("`my``.``proc`", "my`.`proc")] + [TestCase("`foo``bar``.quaz`", "foo`bar`.quaz")] + public void StoredProceduresWithBackticks(string quotedName, string spNameCnet) + { + // In this case since the spNameCnet is not well written, the connector will quote everything + ExecuteSQL($"DROP PROCEDURE IF EXISTS {quotedName}"); + ExecuteSQL($"CREATE PROCEDURE {quotedName} () BEGIN SELECT 1; END"); + using (var conn = new MySqlConnection(Connection.ConnectionString)) + { + conn.Open(); + MySqlCommand command = conn.CreateCommand(); + command.CommandText = spNameCnet; + command.CommandType = CommandType.StoredProcedure; + + Assert.That(command.ExecuteScalar(), Is.EqualTo(1)); + } + } + + [TestCase("`my``.``db`", "`my``.``proc`", "`my``.``db`.`my``.``proc`")] + [TestCase("`my````schema`", "`my````proc`", "`my````schema`.`my````proc`")] + [TestCase("`my``schema`", "`my``proc`", "`my``schema`.`my``proc`")] + [TestCase("`my.schema`", "myproc", "`my.schema`.myproc")] + [TestCase("foo", "`bar.baz`", "foo.`bar.baz`")] + [TestCase("foo", "bar", " foo.bar ")] + [TestCase("foo", "bar", " `foo`.`bar` ")] + public void StoredProceduresWithBackticks2(string schema, string spName, string spNameCnet) + { + ExecuteSQL($"DROP SCHEMA IF EXISTS {schema}; CREATE SCHEMA {schema}", true); + ExecuteSQL($"CREATE PROCEDURE {schema}.{spName} () BEGIN SELECT 1; END", true); + using (var conn = new MySqlConnection(Connection.ConnectionString)) + { + conn.Open(); + MySqlCommand command = conn.CreateCommand(); + command.CommandText = spNameCnet; + command.CommandType = CommandType.StoredProcedure; + + Assert.That(command.ExecuteScalar(), Is.EqualTo(1)); + } + + ExecuteSQL($"DROP SCHEMA {schema};", true); + } + + [TestCase("`myschema`", "`my``proc`", "myschema.`my`proc`")] + [TestCase("`myschema`", "`my``proc`", "`myschema.my`proc")] + [TestCase("`myschema`", "`my``proc`", "myschema.my``proc")] + [TestCase("`myschema`", "`my``proc`", "myschema.`my`proc`")] + [TestCase("`my``.``schema`", "`my``.``proc`", "my`.`schema.my`.`proc")] + [TestCase("`my``schema`", "`myproc`", "`my`schema`.myproc")] + [TestCase("`my``schema`", "`myproc`", "my``schema.myproc")] + [TestCase("`my.schema`", "`myproc`", "my.schema.myproc")] + [TestCase("foo", "`bar.baz`", "`foo`.bar.baz")] + public void StoredProceduresWithBackticksExceptionRaised(string schema, string spName, string spNameCnet) + { + ExecuteSQL($"DROP SCHEMA IF EXISTS {schema}; CREATE SCHEMA {schema}", true); + ExecuteSQL($"CREATE PROCEDURE {schema}.{spName} () BEGIN SELECT 1; END", true); + + using (var conn = new MySqlConnection(Connection.ConnectionString)) + { + conn.Open(); + MySqlCommand command = conn.CreateCommand(); + command.CommandText = spNameCnet; + command.CommandType = CommandType.StoredProcedure; + + Assert.Throws(() => command.ExecuteScalar()); + } + + ExecuteSQL($"DROP SCHEMA {schema};", true); + } + + [TestCase("test.test.spTest", false)] + [TestCase("`myschema`.my`table`", false)] + [TestCase("`db``.`tbl`", false)] + [TestCase("my``.``db.`my``.``proc`", false)] + [TestCase("`db`.`my``other```proc`", false)] + [TestCase("a``b", false)] + [TestCase("a`b`c", false)] + [TestCase("my`.`db.my`.`table", false)] + [TestCase("`myschema.my`proc", false)] + [TestCase("`foo`bar`", false)] + [TestCase(" \n`foo`.bar", false)] + [TestCase("foo.`bar`.baz", false)] + [TestCase("`foo`.bar.baz", false)] + [TestCase("foo.`bar.baz`", true)] + [TestCase("`schema`.`procedure`", true)] + [TestCase("`a``b`", true)] + [TestCase("`schema`.proc", true)] + [TestCase("schema.`proc`", true)] + [TestCase("`my``.``db`.`my``.``proc`", true)] + [TestCase("`my``.``proc`", true)] + [TestCase("`my``db`.myproc", true)] + [TestCase("`my``db`.`myproc`", true)] + [TestCase("`my``db``proc`", true)] + [TestCase("a.b", true)] + [TestCase("`a.b`", true)] + [TestCase("test.```spTest``3`", true)] + [TestCase("`db``.``1`.`tbl`", true)] + [TestCase("` foo`.bar", true)] + public void IsSyntacticallyCorrect(string spName, bool isIt) + { + Assert.That(MySqlClient.StoredProcedure.IsSyntacticallyCorrect(spName) == isIt); + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/StoredProcedureWithAccess.cs b/MySQL.Data/tests/MySql.Data.Tests/StoredProcedureWithAccess.cs new file mode 100644 index 000000000..6b6d3f171 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/StoredProcedureWithAccess.cs @@ -0,0 +1,429 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Collections.Generic; +using System.Text; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System.Data; +using System.Globalization; + +namespace MySql.Data.MySqlClient.Tests +{ + public class StoredProcedureWithAccess : TestBase + { + //private static string fillError = null; + /* + //public void SetFixture(SetUpClass data) + //{ + // st = data; + // st.accessToMySqlDb = true; + //} + + + /// + /// Bug #40139 ExecuteNonQuery hangs + /// + [Test] + public void CallingStoredProcWithOnlyExecPrivs() + { + executeSQL("CREATE PROCEDURE spTest() BEGIN SELECT 1; END"); + executeSQL("CREATE PROCEDURE spTest2() BEGIN SELECT 1; END"); + executeSQL(String.Format("GRANT USAGE ON `{0}`.* TO 'abc'@'%' IDENTIFIED BY 'abc'", ts.baseDBName + "0")); + + try + { + executeAsRoot(String.Format("GRANT SELECT ON `{0}`.* TO 'abc'@'%'", ts.baseDBName + "0")); + executeAsRoot(String.Format("GRANT EXECUTE ON PROCEDURE `{0}`.spTest TO abc", ts.baseDBName + "0")); + + string connStr = "server=localhost;userid=abc;pwd=abc;port=3305;database=" + ts.baseDBName + "0" + "; check parameters=false"; + + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + MySqlCommand cmd = new MySqlCommand("spTest", c); + cmd.CommandType = CommandType.StoredProcedure; + object o = null; + o = cmd.ExecuteScalar(); + Assert.AreEqual(1, Convert.ToInt32(o)); + + cmd.CommandText = "spTest2"; + Assert.Throws(typeof(MySqlException), delegate { cmd.ExecuteScalar(); }); + } + } + finally + { + executeAsRoot("DROP USER abc"); + } + } + + [Test] + public void ProcedureParameters() + { + if (ts.version < new Version(5, 0)) return; + + executeSQL("DROP PROCEDURE IF EXISTS spTest"); + executeSQL("CREATE PROCEDURE spTest (id int, name varchar(50)) BEGIN SELECT 1; END"); + + string[] restrictions = new string[5]; + restrictions[1] = ts.baseDBName + "0"; + restrictions[2] = "spTest"; + #if NETCOREAPP1_1 + MySqlSchemaCollection dt = connection.GetSchemaCollection("Procedure Parameters", restrictions); + string tableName = dt.Name; + #else + DataTable dt = connection.GetSchema("Procedure Parameters", restrictions); + string tableName = dt.TableName; + #endif + Assert.True(dt.Rows.Count == 2); + Assert.AreEqual("Procedure Parameters", tableName); + Assert.AreEqual(ts.baseDBName.ToLower() + "0", dt.Rows[0]["SPECIFIC_SCHEMA"].ToString().ToLower()); + Assert.AreEqual("sptest", dt.Rows[0]["SPECIFIC_NAME"].ToString().ToLower()); + Assert.AreEqual("id", dt.Rows[0]["PARAMETER_NAME"].ToString().ToLower()); + Assert.AreEqual(1, dt.Rows[0]["ORDINAL_POSITION"]); + Assert.AreEqual("IN", dt.Rows[0]["PARAMETER_MODE"]); + + restrictions[4] = "name"; + #if NETCOREAPP1_1 + dt = connection.GetSchemaCollection("Procedure Parameters", restrictions); + #else + dt.Clear(); + dt = connection.GetSchema("Procedure Parameters", restrictions); + #endif + Assert.AreEqual(1, dt.Rows.Count); + Assert.AreEqual("sptest", dt.Rows[0]["SPECIFIC_NAME"].ToString().ToLower()); + Assert.AreEqual("name", dt.Rows[0]["PARAMETER_NAME"].ToString().ToLower()); + Assert.AreEqual(2, dt.Rows[0]["ORDINAL_POSITION"]); + Assert.AreEqual("IN", dt.Rows[0]["PARAMETER_MODE"]); + + executeSQL("DROP FUNCTION IF EXISTS spFunc"); + executeSQL("CREATE FUNCTION spFunc (id int) RETURNS INT BEGIN RETURN 1; END"); + + restrictions[4] = null; + restrictions[1] = ts.baseDBName + "0"; + restrictions[2] = "spFunc"; + #if NETCOREAPP1_1 + dt = connection.GetSchemaCollection("Procedure Parameters", restrictions); + #else + dt = connection.GetSchema("Procedure Parameters", restrictions); + #endif + Assert.True(dt.Rows.Count == 2); + Assert.AreEqual("Procedure Parameters", tableName); + Assert.AreEqual(ts.baseDBName.ToLower() + "0", dt.Rows[0]["SPECIFIC_SCHEMA"].ToString().ToLower()); + Assert.AreEqual("spfunc", dt.Rows[0]["SPECIFIC_NAME"].ToString().ToLower()); + Assert.AreEqual(0, dt.Rows[0]["ORDINAL_POSITION"]); + + Assert.AreEqual(ts.baseDBName.ToLower() + "0", dt.Rows[1]["SPECIFIC_SCHEMA"].ToString().ToLower()); + Assert.AreEqual("spfunc", dt.Rows[1]["SPECIFIC_NAME"].ToString().ToLower()); + Assert.AreEqual("id", dt.Rows[1]["PARAMETER_NAME"].ToString().ToLower()); + Assert.AreEqual(1, dt.Rows[1]["ORDINAL_POSITION"]); + Assert.AreEqual("IN", dt.Rows[1]["PARAMETER_MODE"]); + } + + [Test] + public void SingleProcedureParameters() + { + executeSQL("DROP PROCEDURE IF EXISTS spTest"); + executeSQL("CREATE PROCEDURE spTest(id int, IN id2 INT(11), " + + "INOUT io1 VARCHAR(20), OUT out1 FLOAT) BEGIN END"); + string[] restrictions = new string[4]; + restrictions[1] = ts.baseDBName + "0"; + restrictions[2] = "spTest"; + #if NETCOREAPP1_1 + MySqlSchemaCollection procs = connection.GetSchemaCollection("PROCEDURES", restrictions); + #else + DataTable procs = connection.GetSchema("PROCEDURES", restrictions); + #endif + Assert.AreEqual(1, procs.Rows.Count); + Assert.AreEqual("spTest", procs.Rows[0][0]); + Assert.AreEqual(ts.baseDBName.ToLower() + "0", procs.Rows[0][2].ToString().ToLower(CultureInfo.InvariantCulture)); + Assert.AreEqual("spTest", procs.Rows[0][3]); + + #if NETCOREAPP1_1 + MySqlSchemaCollection parameters = connection.GetSchemaCollection("PROCEDURE PARAMETERS", restrictions); + #else + DataTable parameters = connection.GetSchema("PROCEDURE PARAMETERS", restrictions); + #endif + Assert.AreEqual(4, parameters.Rows.Count); + + #if RT + MySqlSchemaRow row = parameters.Rows[0]; + #else + DataRow row = parameters.Rows[0]; + #endif + Assert.AreEqual(ts.baseDBName.ToLower(CultureInfo.InvariantCulture) + "0", + row["SPECIFIC_SCHEMA"].ToString().ToLower(CultureInfo.InvariantCulture)); + Assert.AreEqual("spTest", row["SPECIFIC_NAME"]); + Assert.AreEqual(1, row["ORDINAL_POSITION"]); + Assert.AreEqual("IN", row["PARAMETER_MODE"]); + Assert.AreEqual("id", row["PARAMETER_NAME"]); + Assert.AreEqual("INT", row["DATA_TYPE"].ToString().ToUpper(CultureInfo.InvariantCulture)); + + row = parameters.Rows[1]; + Assert.AreEqual(ts.baseDBName.ToLower(CultureInfo.InvariantCulture) + "0", row["SPECIFIC_SCHEMA"].ToString().ToLower(CultureInfo.InvariantCulture)); + Assert.AreEqual("spTest", row["SPECIFIC_NAME"]); + Assert.AreEqual(2, row["ORDINAL_POSITION"]); + Assert.AreEqual("IN", row["PARAMETER_MODE"]); + Assert.AreEqual("id2", row["PARAMETER_NAME"]); + Assert.AreEqual("INT", row["DATA_TYPE"].ToString().ToUpper(CultureInfo.InvariantCulture)); + + row = parameters.Rows[2]; + Assert.AreEqual(ts.baseDBName.ToLower(CultureInfo.InvariantCulture) + "0", row["SPECIFIC_SCHEMA"].ToString().ToLower(CultureInfo.InvariantCulture)); + Assert.AreEqual("spTest", row["SPECIFIC_NAME"]); + Assert.AreEqual(3, row["ORDINAL_POSITION"]); + Assert.AreEqual("INOUT", row["PARAMETER_MODE"]); + Assert.AreEqual("io1", row["PARAMETER_NAME"]); + Assert.AreEqual("VARCHAR", row["DATA_TYPE"].ToString().ToUpper(CultureInfo.InvariantCulture)); + + row = parameters.Rows[3]; + Assert.AreEqual(ts.baseDBName.ToLower(CultureInfo.InvariantCulture) + "0", row["SPECIFIC_SCHEMA"].ToString().ToLower(CultureInfo.InvariantCulture)); + Assert.AreEqual("spTest", row["SPECIFIC_NAME"]); + Assert.AreEqual(4, row["ORDINAL_POSITION"]); + Assert.AreEqual("OUT", row["PARAMETER_MODE"]); + Assert.AreEqual("out1", row["PARAMETER_NAME"]); + Assert.AreEqual("FLOAT", row["DATA_TYPE"].ToString().ToUpper(CultureInfo.InvariantCulture)); + } + + #if !NETCOREAPP1_1 + /// + /// Bug #27679 MySqlCommandBuilder.DeriveParameters ignores UNSIGNED flag + /// + [Test] + public void UnsignedParametersInSP() + { + if (ts.version < new Version(5, 0)) return; + + executeSQL("CREATE PROCEDURE spTest(testid TINYINT UNSIGNED) BEGIN SELECT testid; END"); + + MySqlCommand cmd = new MySqlCommand("spTest", connection); + cmd.CommandType = CommandType.StoredProcedure; + MySqlCommandBuilder.DeriveParameters(cmd); + Assert.AreEqual(MySqlDbType.UByte, cmd.Parameters[0].MySqlDbType); + Assert.AreEqual(DbType.Byte, cmd.Parameters[0].DbType); + } + + [Test] + public void CheckNameOfReturnParameter() + { + if (ts.version < new Version(5, 0)) return; + + executeSQL("DROP FUNCTION IF EXISTS fnTest"); + executeSQL("CREATE FUNCTION fnTest() RETURNS CHAR(50)" + + " LANGUAGE SQL DETERMINISTIC BEGIN RETURN \"Test\"; END"); + + MySqlCommand cmd = new MySqlCommand("fnTest", connection); + cmd.CommandType = CommandType.StoredProcedure; + MySqlCommandBuilder.DeriveParameters(cmd); + Assert.AreEqual(1, cmd.Parameters.Count); + Assert.AreEqual("@RETURN_VALUE", cmd.Parameters[0].ParameterName); + } + + /// + /// Bug #13632 the MySQLCommandBuilder.deriveparameters has not been updated for MySQL 5 + /// Bug #15077 Error MySqlCommandBuilder.DeriveParameters for sp without parameters. + /// Bug #19515 DiscoverParameters fails on numeric datatype + /// + [Test] + public void DeriveParameters() + { + if (ts.version < new Version(5, 0)) return; + + executeSQL("CREATE TABLE test2 (c CHAR(20))"); + executeSQL("INSERT INTO test2 values ( 'xxxx')"); + MySqlCommand cmd2 = new MySqlCommand("SELECT * FROM test2", connection); + using (MySqlDataReader reader = cmd2.ExecuteReader()) + { + } + + executeSQL("CREATE PROCEDURE spTest(IN \r\nvalin DECIMAL(10,2), " + + "\nIN val2 INT, INOUT val3 FLOAT, OUT val4 DOUBLE, INOUT val5 BIT, " + + "val6 VARCHAR(155), val7 SET('a','b'), val8 CHAR, val9 NUMERIC(10,2)) " + + "BEGIN SELECT 1; END"); + + MySqlCommand cmd = new MySqlCommand("spTest", connection); + cmd.CommandType = CommandType.StoredProcedure; + MySqlCommandBuilder.DeriveParameters(cmd); + + Assert.AreEqual(9, cmd.Parameters.Count); + Assert.AreEqual("@valin", cmd.Parameters[0].ParameterName); + Assert.AreEqual(ParameterDirection.Input, cmd.Parameters[0].Direction); + Assert.AreEqual(MySqlDbType.NewDecimal, cmd.Parameters[0].MySqlDbType); + + Assert.AreEqual("@val2", cmd.Parameters[1].ParameterName); + Assert.AreEqual(ParameterDirection.Input, cmd.Parameters[1].Direction); + Assert.AreEqual(MySqlDbType.Int32, cmd.Parameters[1].MySqlDbType); + + Assert.AreEqual("@val3", cmd.Parameters[2].ParameterName); + Assert.AreEqual(ParameterDirection.InputOutput, cmd.Parameters[2].Direction); + Assert.AreEqual(MySqlDbType.Float, cmd.Parameters[2].MySqlDbType); + + Assert.AreEqual("@val4", cmd.Parameters[3].ParameterName); + Assert.AreEqual(ParameterDirection.Output, cmd.Parameters[3].Direction); + Assert.AreEqual(MySqlDbType.Double, cmd.Parameters[3].MySqlDbType); + + Assert.AreEqual("@val5", cmd.Parameters[4].ParameterName); + Assert.AreEqual(ParameterDirection.InputOutput, cmd.Parameters[4].Direction); + Assert.AreEqual(MySqlDbType.Bit, cmd.Parameters[4].MySqlDbType); + + Assert.AreEqual("@val6", cmd.Parameters[5].ParameterName); + Assert.AreEqual(ParameterDirection.Input, cmd.Parameters[5].Direction); + Assert.AreEqual(MySqlDbType.VarChar, cmd.Parameters[5].MySqlDbType); + + Assert.AreEqual("@val7", cmd.Parameters[6].ParameterName); + Assert.AreEqual(ParameterDirection.Input, cmd.Parameters[6].Direction); + Assert.AreEqual(MySqlDbType.Set, cmd.Parameters[6].MySqlDbType); + + Assert.AreEqual("@val8", cmd.Parameters[7].ParameterName); + Assert.AreEqual(ParameterDirection.Input, cmd.Parameters[7].Direction); + Assert.AreEqual(MySqlDbType.String, cmd.Parameters[7].MySqlDbType); + + Assert.AreEqual("@val9", cmd.Parameters[8].ParameterName); + Assert.AreEqual(ParameterDirection.Input, cmd.Parameters[8].Direction); + Assert.AreEqual(MySqlDbType.NewDecimal, cmd.Parameters[8].MySqlDbType); + + executeSQL("DROP PROCEDURE spTest"); + executeSQL("CREATE PROCEDURE spTest() BEGIN END"); + cmd.CommandText = "spTest"; + cmd.CommandType = CommandType.StoredProcedure; + cmd.Parameters.Clear(); + MySqlCommandBuilder.DeriveParameters(cmd); + Assert.AreEqual(0, cmd.Parameters.Count); + } + + /// + /// Bug #13632 the MySQLCommandBuilder.deriveparameters has not been updated for MySQL 5 + /// + [Test] + public void DeriveParametersForFunction() + { + if (ts.version < new Version(5, 0)) return; + + executeSQL("DROP FUNCTION IF EXISTS fnTest"); + executeSQL("CREATE FUNCTION fnTest(v1 DATETIME) RETURNS INT " + + " LANGUAGE SQL DETERMINISTIC BEGIN RETURN 1; END"); + + MySqlCommand cmd = new MySqlCommand("fnTest", connection); + cmd.CommandType = CommandType.StoredProcedure; + MySqlCommandBuilder.DeriveParameters(cmd); + + Assert.AreEqual(2, cmd.Parameters.Count); + Assert.AreEqual("@v1", cmd.Parameters[1].ParameterName); + Assert.AreEqual(ParameterDirection.Input, cmd.Parameters[1].Direction); + Assert.AreEqual(MySqlDbType.DateTime, cmd.Parameters[1].MySqlDbType); + + Assert.AreEqual(ParameterDirection.ReturnValue, cmd.Parameters[0].Direction); + Assert.AreEqual(MySqlDbType.Int32, cmd.Parameters[0].MySqlDbType); + } + + /// + /// Bug #49642 FormatException when returning empty string from a stored function + /// + [Test] + public void NotSpecifyingDataTypeOfReturnValue() + { + if (ts.version < new Version(5, 0)) return; + + executeSQL("DROP FUNCTION IF EXISTS TestFunction"); + + executeSQL(@"CREATE FUNCTION `TestFunction`() + RETURNS varchar(20) + RETURN ''"); + MySqlCommand cmd = new MySqlCommand("TestFunction", connection); + cmd.CommandType = CommandType.StoredProcedure; + MySqlParameter returnParam = new MySqlParameter(); + returnParam.ParameterName = "?RetVal_"; + returnParam.Direction = ParameterDirection.ReturnValue; + cmd.Parameters.Add(returnParam); + cmd.ExecuteNonQuery(); + } + + /// + /// Bug #50123 Batch updates bug when UpdateBatchSize > 1 + /// Bug #50444 Parameters.Clear() not working + /// + [Test] + public void UpdateBatchSizeMoreThanOne() + { + executeSQL(@"CREATE TABLE test(fldID INT NOT NULL, + fldValue VARCHAR(50) NOT NULL, PRIMARY KEY(fldID))"); + + MySqlDataAdapter adapter = new MySqlDataAdapter("SELECT * FROM test", connection); + DataTable data = new DataTable(); + adapter.Fill(data); + + MySqlCommand ins = new MySqlCommand( + "INSERT INTO test(fldID, fldValue) VALUES (?p1, ?p2)", connection); + ins.Parameters.Add("p1", MySqlDbType.Int32).SourceColumn = "fldID"; + ins.Parameters.Add("p2", MySqlDbType.String).SourceColumn = "fldValue"; + + ins.UpdatedRowSource = UpdateRowSource.None; + adapter.InsertCommand = ins; + adapter.UpdateBatchSize = 10; + + int numToInsert = 20; + for (int i = 0; i < numToInsert; i++) + { + DataRow row = data.NewRow(); + row["fldID"] = i + 1; + row["fldValue"] = "ID = " + (i + 1); + data.Rows.Add(row); + } + Assert.AreEqual(numToInsert, adapter.Update(data)); + + //UPDATE VIA SP + MySqlCommand comm = new MySqlCommand("DROP PROCEDURE IF EXISTS pbug50123", connection); + comm.ExecuteNonQuery(); + comm.CommandText = "CREATE PROCEDURE pbug50123(" + + "IN pfldID INT, IN pfldValue VARCHAR(50)) " + + "BEGIN INSERT INTO test(fldID, fldValue) " + + "VALUES(pfldID, pfldValue); END"; + comm.ExecuteNonQuery(); + + // Set the Insert Command + ins.Parameters.Clear(); + ins.CommandText = "pbug50123"; + ins.CommandType = CommandType.StoredProcedure; + ins.Parameters.Add("pfldID", MySqlDbType.Int32).SourceColumn = "fldID"; + ins.Parameters.Add("pfldValue", MySqlDbType.String).SourceColumn = "fldValue"; + ins.UpdatedRowSource = UpdateRowSource.None; + + for (int i = 21; i < 41; i++) + { + DataRow row = data.NewRow(); + row["fldID"] = i + 1; + row["fldValue"] = "ID = " + (i + 1); + data.Rows.Add(row); + } + // Do the update + Assert.AreEqual(numToInsert, adapter.Update(data)); + } + #endif + */ + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/StressTests.cs b/MySQL.Data/tests/MySql.Data.Tests/StressTests.cs new file mode 100644 index 000000000..1746e11bc --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/StressTests.cs @@ -0,0 +1,154 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Threading.Tasks; +using NUnit.Framework; +using NUnit.Framework.Legacy; + +namespace MySql.Data.MySqlClient.Tests +{ + public class StressTests : TestBase + { + protected override void Cleanup() + { + ExecuteSQL(String.Format("DROP TABLE IF EXISTS `{0}`.Test", Connection.Database)); + } + + [Test] + [Ignore("Fix this")] + public void TestMultiPacket() + { + int len = 20000000; + + ExecuteSQL(@"CREATE TABLE Test (id INT NOT NULL, name varchar(100), blob1 LONGBLOB, text1 TEXT, + PRIMARY KEY(id))"); + ExecuteSQL("SET GLOBAL max_allowed_packet=64000000", true); + + // currently do not test this with compression + if (Connection.UseCompression) return; + + using (MySqlConnection c = GetConnection()) + { + c.Open(); + byte[] dataIn = MySql.Data.MySqlClient.Tests.Utils.CreateBlob(len); + byte[] dataIn2 = MySql.Data.MySqlClient.Tests.Utils.CreateBlob(len); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?id, NULL, ?blob, NULL )", c); + cmd.CommandTimeout = 0; + cmd.Parameters.Add(new MySqlParameter("?id", 1)); + cmd.Parameters.Add(new MySqlParameter("?blob", dataIn)); + cmd.ExecuteNonQuery(); + + cmd.Parameters[0].Value = 2; + cmd.Parameters[1].Value = dataIn2; + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM Test"; + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + byte[] dataOut = new byte[len]; + long count = reader.GetBytes(2, 0, dataOut, 0, len); + Assert.That(count, Is.EqualTo(len)); + int i = 0; + try + { + for (; i < len; i++) + Assert.That(dataOut[i], Is.EqualTo(dataIn[i])); + } + catch (Exception) + { + int z = i; + } + + reader.Read(); + count = reader.GetBytes(2, 0, dataOut, 0, len); + Assert.That(count, Is.EqualTo(len)); + + for (int x = 0; x < len; x++) + Assert.That(dataOut[x], Is.EqualTo(dataIn2[x])); + } + } + } + + [Test] + public void TestSequence() + { + if (Version > new Version(5, 6, 6)) + ExecuteSQL("SET GLOBAL innodb_lru_scan_depth=256"); + + ExecuteSQL(@"CREATE TABLE Test (id INT NOT NULL, name varchar(100), blob1 LONGBLOB, text1 TEXT, + PRIMARY KEY(id))"); + MySqlCommand cmd = new MySqlCommand("insert into Test (id, name) values (?id, 'test')", Connection); + cmd.Parameters.Add(new MySqlParameter("?id", 1)); + + for (int i = 1; i <= 8000; i++) + { + cmd.Parameters[0].Value = i; + cmd.ExecuteNonQuery(); + } + + int i2 = 0; + cmd = new MySqlCommand("select * from Test", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + Assert.That(i2 + 1 == reader.GetInt32(0), "Sequence out of order"); + i2++; + } + reader.Close(); + + Assert.That(i2, Is.EqualTo(8000)); + cmd = new MySqlCommand("delete from Test where id >= 100", Connection); + cmd.ExecuteNonQuery(); + } + } + + #region WL14389 + [Test, Description("Command Async Stress ")] + public async Task CommandAsyncStress() + { + for (var i = 0; i < 1000; i++) + { + using (var dbConn = new MySqlConnection($"server={Host};user={Settings.UserID};database={Settings.Database};port={Port};password={Settings.Password};sslmode=none")) + using (var cmd = new MySqlCommand("DROP DATABASE IF EXISTS code_first_2", dbConn)) + { + await dbConn.OpenAsync(); + await cmd.ExecuteNonQueryAsync(); + await dbConn.ChangeDatabaseAsync(Settings.Database); + await dbConn.CloseAsync(); + } + } + } + #endregion WL14389 + + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/StressTestsCompressed.cs b/MySQL.Data/tests/MySql.Data.Tests/StressTestsCompressed.cs new file mode 100644 index 000000000..15be16ca4 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/StressTestsCompressed.cs @@ -0,0 +1,40 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + + +namespace MySql.Data.MySqlClient.Tests +{ + public class StressTestsCompressed : StressTests + { + internal override void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) + { + settings.UseCompression = true; + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Syntax.cs b/MySQL.Data/tests/MySql.Data.Tests/Syntax.cs new file mode 100644 index 000000000..646cace02 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Syntax.cs @@ -0,0 +1,571 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Data; +using System.IO; + +namespace MySql.Data.MySqlClient.Tests +{ + public class Syntax : TestBase + { + protected override void Cleanup() + { + ExecuteSQL(String.Format("DROP TABLE IF EXISTS `{0}`.Test", Connection.Database)); + } + + [Test] + public void ShowCreateTable() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); + DataTable dt = Utils.FillTable("SHOW CREATE TABLE Test", Connection); + + Assert.That(dt.Rows, Has.One.Items); + Assert.That(dt.Columns.Count, Is.EqualTo(2)); + } + + [Test] + public void ProblemCharsInSQLUTF8() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), mt MEDIUMTEXT, " + + "PRIMARY KEY(id)) CHAR SET utf8"); + + MySqlConnectionStringBuilder cb = new MySqlConnectionStringBuilder(Connection.ConnectionString); + cb.CharacterSet = "utf8"; + using (MySqlConnection c = new MySqlConnection(cb.ConnectionString)) + { + c.Open(); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?id, ?text, ?mt)", c); + cmd.Parameters.AddWithValue("?id", 1); + cmd.Parameters.AddWithValue("?text", "This is my;test ? string–’‘’“”…"); + cmd.Parameters.AddWithValue("?mt", "My MT string: ?"); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM Test"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetInt32(0), Is.EqualTo(1)); + Assert.That(reader.GetString(1), Is.EqualTo("This is my;test ? string–’‘’“”…")); + Assert.That(reader.GetString(2), Is.EqualTo("My MT string: ?")); + } + } + } + + + [Test] + public void ProblemCharsInSQL() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), mt MEDIUMTEXT, " + + "PRIMARY KEY(id))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?id, ?text, ?mt)", Connection); + cmd.Parameters.AddWithValue("?id", 1); + cmd.Parameters.AddWithValue("?text", "This is my;test ? string-'''\"\"."); + cmd.Parameters.AddWithValue("?mt", "My MT string: ?"); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT * FROM Test"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + Assert.That(reader.Read()); + Assert.That(reader.GetInt32(0), Is.EqualTo(1)); + Assert.That(reader.GetString(1), Is.EqualTo("This is my;test ? string-'''\"\".")); + Assert.That(reader.GetString(2), Is.EqualTo("My MT string: ?")); + } + } + + [Test] + public void LoadDataLocalInfile() + { + if (Version >= new Version(8, 0, 2)) ExecuteSQL("SET GLOBAL local_infile = 1"); + + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); + + string path = Path.GetTempFileName(); + StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); + for (int i = 0; i < 200000; i++) + sw.WriteLine(i + ",'Test'"); + sw.Flush(); + sw.Dispose(); + + path = path.Replace(@"\", @"\\"); + + LoadFile(new MySqlConnection(Connection.ConnectionString + ";allowloadlocalinfile=true;"), path); + Assert.Throws(() => LoadFile(new MySqlConnection(Connection.ConnectionString), path)); + } + + private void LoadFile(MySqlConnection conn, string path) + { + using (conn) + { + conn.Open(); + + + MySqlCommand cmd = new MySqlCommand( + "LOAD DATA LOCAL INFILE '" + path + "' INTO TABLE Test FIELDS TERMINATED BY ','", conn); + cmd.CommandTimeout = 0; + + object cnt = 0; + cnt = cmd.ExecuteNonQuery(); + Assert.That(Convert.ToInt32(cnt), Is.EqualTo(200000)); + + cmd.CommandText = "SELECT COUNT(*) FROM Test"; + cnt = cmd.ExecuteScalar(); + Assert.That(Convert.ToInt32(cnt), Is.EqualTo(200000)); + } + } + + [Test] + public void ShowTablesInNonExistentDb() + { + MySqlCommand cmd = new MySqlCommand("SHOW TABLES FROM dummy", Connection); + Assert.Throws(() => cmd.ExecuteReader()); + } + + [Test] + public void Bug6135() + { + MySqlCommand cmd = null; + string sql = null; + + // Updating the default charset for servers 8.0+. + if (Connection.driver.Version.isAtLeast(8, 0, 1)) + { + sql = "SET NAMES 'latin1' COLLATE 'latin1_swedish_ci'"; + cmd = new MySqlCommand(sql, Connection); + cmd.ExecuteNonQuery(); + } + + sql = @"CREATE TABLE `KLANT` (`KlantNummer` int(11) NOT NULL auto_increment, + `Username` varchar(50) NOT NULL default '', `Password` varchar(100) NOT NULL default '', + `Naam` varchar(100) NOT NULL default '', `Voornaam` varchar(100) NOT NULL default '', + `Straat` varchar(100) NOT NULL default '', `StraatNr` varchar(10) NOT NULL default '', + `Gemeente` varchar(100) NOT NULL default '', `Postcode` varchar(10) NOT NULL default '', + `DefaultMail` varchar(255) default '', `BtwNr` varchar(50) default '', + `ReceiveMail` tinyint(1) NOT NULL default '0', `Online` tinyint(1) NOT NULL default '0', + `LastVisit` timestamp NOT NULL, `Categorie` int(11) NOT NULL default '0', + PRIMARY KEY (`KlantNummer`), UNIQUE KEY `UniqueUsername` (`Username`), + UNIQUE KEY `UniqueDefaultMail` (`DefaultMail`) )"; + ExecuteSQL(sql); + + cmd = new MySqlCommand("SELECT * FROM KLANT", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + while (reader.Read()) { } + } + } + + [Test] + public void Sum() + { + ExecuteSQL("CREATE TABLE Test (field1 mediumint(9) default '0', field2 float(9,3) " + + "default '0.000', field3 double(15,3) default '0.000') engine=innodb "); + ExecuteSQL("INSERT INTO Test values (1,1,1)"); + + MySqlCommand cmd2 = new MySqlCommand("SELECT sum(field2) FROM Test", Connection); + using (MySqlDataReader reader = cmd2.ExecuteReader()) + { + reader.Read(); + object o = reader[0]; + Assert.That(Convert.ToInt32(o), Is.EqualTo(1)); + } + } + + [Test] + public void Sum2() + { + ExecuteSQL("CREATE TABLE Test (id int, count int)"); + ExecuteSQL("INSERT INTO Test VALUES (1, 21)"); + ExecuteSQL("INSERT INTO Test VALUES (1, 33)"); + ExecuteSQL("INSERT INTO Test VALUES (1, 16)"); + ExecuteSQL("INSERT INTO Test VALUES (1, 40)"); + + MySqlCommand cmd = new MySqlCommand("SELECT id, SUM(count) FROM Test GROUP BY id", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetInt32(0), Is.EqualTo(1)); + Assert.That(reader.GetDouble(1), Is.EqualTo(110)); + } + } + + [Test] + public void ForceWarnings() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); + MySqlCommand cmd = new MySqlCommand( + "SELECT * FROM Test; DROP TABLE IF EXISTS test2; SELECT * FROM Test", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + while (reader.NextResult()) { } + } + } + + [Test] + public void SettingAutoIncrementColumns() + { + ExecuteSQL("CREATE TABLE Test (id int auto_increment, name varchar(100), primary key(id))"); + ExecuteSQL("INSERT INTO Test VALUES (1, 'One')"); + ExecuteSQL("INSERT INTO Test VALUES (3, 'Two')"); + + MySqlCommand cmd = new MySqlCommand("SELECT name FROM Test WHERE id=1", Connection); + object name = cmd.ExecuteScalar(); + Assert.That(name, Is.EqualTo("One")); + + cmd.CommandText = "SELECT name FROM Test WHERE id=3"; + name = cmd.ExecuteScalar(); + Assert.That(name, Is.EqualTo("Two")); + Assert.Throws(() => ExecuteSQL("INSERT INTO Test (id, name2) values (5, 'Three')")); + } + + /// + /// Bug #16645 FOUND_ROWS() Bug + /// + [Test] + public void FoundRows() + { + ExecuteSQL("CREATE TABLE Test (testID int(11) NOT NULL auto_increment, testName varchar(100) default '', " + + "PRIMARY KEY (testID)) ENGINE=InnoDB DEFAULT CHARSET=latin1"); + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (NULL, 'test')", Connection); + for (int i = 0; i < 1000; i++) + cmd.ExecuteNonQuery(); + cmd.CommandText = "SELECT SQL_CALC_FOUND_ROWS * FROM Test LIMIT 0, 10"; + cmd.ExecuteNonQuery(); + cmd.CommandText = "SELECT FOUND_ROWS()"; + object cnt = cmd.ExecuteScalar(); + Assert.That(Convert.ToInt32(cnt), Is.EqualTo(1000)); + } + + [Test] + public void AutoIncrement() + { + ExecuteSQL("CREATE TABLE Test (testID int(11) NOT NULL auto_increment, testName varchar(100) default '', " + + "PRIMARY KEY (testID)) ENGINE=InnoDB DEFAULT CHARSET=latin1"); + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (NULL, 'test')", Connection); + cmd.ExecuteNonQuery(); + cmd.CommandText = "SELECT @@IDENTITY as 'Identity'"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + int ident = Int32.Parse(reader.GetValue(0).ToString()); + Assert.That(ident, Is.EqualTo(1)); + } + } + + /// + /// Bug #21521 # Symbols not allowed in column/table names. + /// + [Test] + public void CommentSymbolInTableName() + { + ExecuteSQL("CREATE TABLE Test (`PO#` int(11) NOT NULL auto_increment, " + + "`PODate` date default NULL, PRIMARY KEY (`PO#`))"); + ExecuteSQL("INSERT INTO Test ( `PO#`, `PODate` ) " + + "VALUES ( NULL, '2006-01-01' )"); + + string sql = "SELECT `PO#` AS PurchaseOrderNumber, " + + "`PODate` AS OrderDate FROM Test"; + DataTable dt = Utils.FillTable(sql, Connection); + Assert.That(dt.Rows, Has.One.Items); + } + + /// + /// Bug #25178 Addition message in error + /// + [Test] + public void ErrorMessage() + { + MySqlCommand cmd = new MySqlCommand("SELEKT NOW() as theTime", Connection); + try + { + cmd.ExecuteScalar(); + } + catch (MySqlException ex) + { + string s = ex.Message; + Assert.That(s.StartsWith("#", StringComparison.Ordinal), Is.False); + } + } + + /// + /// Bug #27221 describe SQL command returns all byte array on MySQL versions older than 4.1.15 + /// + [Test] + public void Describe() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); + var reader = ExecuteReader("DESCRIBE Test"); + using (reader) + { + Assert.That(reader.GetFieldType(0) == typeof(string)); + Assert.That(reader.GetFieldType(1) == typeof(string)); + Assert.That(reader.GetFieldType(2) == typeof(string)); + Assert.That(reader.GetFieldType(3) == typeof(string)); + Assert.That(reader.GetFieldType(4) == typeof(string)); + Assert.That(reader.GetFieldType(5) == typeof(string)); + } + } + + [Test] + public void ShowTableStatus() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); + var reader = ExecuteReader("DESCRIBE Test"); + using (reader) + { + reader.Read(); + Assert.That(reader[0].GetType() == typeof(string)); + } + } + + /// + /// Bug #26960 Connector .NET 5.0.5 / Visual Studio Plugin 1.1.2 + /// + [Test] + public void NullAsAType() + { + DataTable dt = Utils.FillTable(@"SELECT 'localhost' as SERVER_NAME, + null as CATALOG_NAME, database() as SCHEMA_NAME", Connection); + Assert.That(dt.Rows[0][0].GetType() == typeof(string)); + Assert.That(dt.Rows[0][1], Is.EqualTo(DBNull.Value)); + Assert.That(dt.Rows[0][2].GetType() == typeof(string)); + } + + [Test] + public void SpaceInDatabaseName() + { + string fullDbName = CreateDatabase("x y"); + + MySqlConnectionStringBuilder cb = new MySqlConnectionStringBuilder(Connection.ConnectionString); + cb.Database = fullDbName; + using (var c = new MySqlConnection(cb.ConnectionString)) + { + c.Open(); + } + } + + /// + /// Bug #28448 show processlist; returns byte arrays in the resulting data table + /// + [Test] + public void ShowProcessList() + { + MySqlConnectionStringBuilder cb = new MySqlConnectionStringBuilder(Connection.ConnectionString); + cb.RespectBinaryFlags = false; + MySqlConnection c = new MySqlConnection(cb.ConnectionString); + using (c) + { + c.Open(); + + + MySqlCommand cmd = new MySqlCommand("show processlist", c); + DataTable dt = new DataTable(); + + using (MySqlDataReader rdr = cmd.ExecuteReader()) + { + dt.Load(rdr); + } + DataRow row = dt.Rows[0]; + + Assert.That(row["User"].GetType().Name == "String"); + Assert.That(row["Host"].GetType().Name == "String"); + Assert.That(row["Command"].GetType().Name == "String"); + } + } + + [Test] + public void SemisAtStartAndEnd() + { + using (MySqlCommand cmd = new MySqlCommand(";;SELECT 1;;;", Connection)) + { + Assert.That(Convert.ToInt32(cmd.ExecuteScalar()), Is.EqualTo(1)); + } + } + + /// + /// Bug #51610 Exception thrown inside Connector.NET + /// + [Test] + public void Bug51610() + { + MySqlCommand cmd = new MySqlCommand("SELECT 'ABC', (0/`QOH`) from (SELECT 1 as `QOH`) `d1`", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetString(0), Is.EqualTo("ABC")); + Assert.That(reader.GetInt32(1), Is.EqualTo(0)); + } + + cmd.CommandText = "SELECT 'ABC', (0-`QOH`) from (SELECT 1 as `QOH`) `d1`"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetString(0), Is.EqualTo("ABC")); + Assert.That(reader.GetInt32(1), Is.EqualTo(-1)); + } + + cmd.CommandText = "SELECT 'test 2010-03-04 @ 10:14'"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetString(0), Is.EqualTo("test 2010-03-04 @ 10:14")); + } + + } + + /// + /// Bug #51788 Error in SQL syntax not reported. A CLR exception was thrown instead, + /// + [Test] + public void NonTerminatedString() + { + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE Test(id INT, name1 VARCHAR(20), name2 VARCHAR(20))"); + + try + { + MySqlCommand cmd = new MySqlCommand( + "INSERT INTO test VALUES (1, 'test 2010-03-04 @ 10:14, name2=' joe')", Connection); + cmd.ExecuteNonQuery(); + } + catch (MySqlException) + { + } + } + + /// + /// Bug #53865 : crash in QueryNormalizer, "IN" clause incomplete + /// + [Test] + public void QueryNormalizerCrash1() + { + + ExecuteSQL( + "CREATE TABLE extable_1 (x_coord int, y_coord int, z_coord int," + + "edge_id int, life_id int)"); + ExecuteSQL("CREATE TABLE extable_2 (daset_id int, sect_id int, " + + "xyz_id int, edge_id int, life_id int, another_id int, yetanother_id int)"); + + MySqlConnectionStringBuilder cb = new MySqlConnectionStringBuilder(Connection.ConnectionString); + cb.Logging = true; + using (MySqlConnection c = new MySqlConnection(cb.ConnectionString)) + { + c.Open(); + MySqlCommand cmd = new MySqlCommand( + "SELECT tblb.x_coord, tblb.y_coord, tblb.z_coord, " + + "tbl_c.x_coord, tbl_c.y_coord, tbl_c.z_coord, tbl_a.edge_id, " + + "tbl_a.life_id, tbl_a.daset_id, tbl_a.sect_id, tbl_a.yetanother_id," + + " IFNULL(tbl_a.xyz_id,0) FROM extable_2 tbl_a, extable_1 tblb, " + + "extable_1 tbl_c WHERE tbl_a.daset_id=208 AND tbl_a.sect_id IN " + + "(1,2,3,4,5,6,7)", + c); + Console.WriteLine(cmd.ExecuteScalar()); + } + } + + /// + /// Bug #54152 : Crash in QueryNormalizer, VALUES incomplete + /// + [Test] + public void QueryNormalizerCrash2() + { + ExecuteSQL("CREATE TABLE bug54152 (id INT, expr INT,name VARCHAR(20)," + + "fld4 VARCHAR(10), fld5 VARCHAR(10), fld6 VARCHAR(10)," + + "fld7 VARCHAR(10), fld8 VARCHAR(10), fld9 VARCHAR(10)," + + "fld10 VARCHAR(10), PRIMARY KEY(id))"); + + + MySqlConnectionStringBuilder cb = new MySqlConnectionStringBuilder(Connection.ConnectionString); + cb.Logging = true; + using (MySqlConnection c = new MySqlConnection(cb.ConnectionString)) + { + c.Open(); + string query = + "INSERT INTO bug54152 VALUES " + + "(1,1, 'name 1',1,1,1,1,1,1,1)," + + "(2,2,'name 2',2,2,2,2,2,2,2)," + + "(3,3,'name 3',3,3,3,3,3,3,3)," + + "(4,4,'name 4',4,4,4,4,4,4,4)," + + "(5,5,'name 5',5,5,5,5,5,5,5)," + + "(6,6,'name 6',6,6,6,6,6,6,6)," + + "(7,7,'name 7',7,7,7,7,7,7,7)," + + "(8,8,'name 8',8,8,8,8,8,8,8)," + + "(9,9,'name 9',9,9,9,9,9,9,9)," + + "(10,10,'name 10',10,10,10,10,10,10,10)"; + MySqlCommand cmd = new MySqlCommand(query, c); + cmd.ExecuteNonQuery(); + } + } + + /// + /// Bug #54386 : expression with parentheses in INSERT leads to invalid + /// query when using batching + /// + [Test] + public void TokenizerBatching() + { +#if !NETFRAMEWORK + Assume.That(System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Windows)); +#endif + + ExecuteSQL("CREATE TABLE Test (id INT, expr INT,name VARCHAR(20), PRIMARY KEY(id))"); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", + Connection); + MySqlCommand ins = new MySqlCommand( + "INSERT INTO test (id, expr, name) VALUES(?p1, (?p2 * 2) + 3, ?p3)", + Connection); + da.InsertCommand = ins; + ins.UpdatedRowSource = UpdateRowSource.None; + ins.Parameters.Add("?p1", MySqlDbType.Int32).SourceColumn = "id"; + ins.Parameters.Add("?p2", MySqlDbType.Int32).SourceColumn = "expr"; + ins.Parameters.Add("?p3", MySqlDbType.VarChar, 20).SourceColumn = "name"; + + DataTable dt = new DataTable(); + da.Fill(dt); + + for (int i = 1; i <= 100; i++) + { + DataRow row = dt.NewRow(); + row["id"] = i; + row["expr"] = i; + row["name"] = "name " + i; + dt.Rows.Add(row); + } + + da.UpdateBatchSize = 10; + da.Update(dt); + + } + + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Syntax2.cs b/MySQL.Data/tests/MySql.Data.Tests/Syntax2.cs new file mode 100644 index 000000000..5f8180d24 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Syntax2.cs @@ -0,0 +1,116 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Data; + +namespace MySql.Data.MySqlClient.Tests +{ + public class Syntax2 : TestBase + { + protected override void Cleanup() + { + ExecuteSQL(String.Format("DROP TABLE IF EXISTS `{0}`.Test", Connection.Database)); + } + + [Test] + public void CommentsInSQL() + { + ExecuteSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); + string sql = "INSERT INTO Test /* my table */ VALUES (1 /* this is the id */, 'Test' );" + + "/* These next inserts are just for testing \r\n" + + " comments */\r\n" + + "INSERT INTO \r\n" + + " # This table is bogus\r\n" + + "Test VALUES (2, 'Test2')"; + + + MySqlCommand cmd = new MySqlCommand(sql, Connection); + cmd.ExecuteNonQuery(); + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + DataTable table = new DataTable(); + da.Fill(table); + Assert.That(table.Rows[0]["id"], Is.EqualTo(1)); + Assert.That(table.Rows[0]["name"], Is.EqualTo("Test")); + Assert.That(table.Rows.Count, Is.EqualTo(2)); + Assert.That(table.Rows[1]["id"], Is.EqualTo(2)); + Assert.That(table.Rows[1]["name"], Is.EqualTo("Test2")); + } + + [Test] + public void LastInsertid() + { + ExecuteSQL("CREATE TABLE Test(id int auto_increment, name varchar(20), primary key(id))"); + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(NULL, 'test')", Connection); + cmd.ExecuteNonQuery(); + Assert.That(cmd.LastInsertedId, Is.EqualTo(1)); + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + } + Assert.That(cmd.LastInsertedId, Is.EqualTo(2)); + + cmd.CommandText = "SELECT id FROM Test"; + cmd.ExecuteScalar(); + Assert.That(cmd.LastInsertedId, Is.EqualTo(-1)); + } + + [Test] + public void ParsingBugTest() + { + ExecuteSQL(@"CREATE FUNCTION `TestFunction`(A INTEGER (11), B INTEGER (11), C VARCHAR (20)) + RETURNS int(11) + RETURN 1"); + + MySqlCommand command = new MySqlCommand("TestFunction", Connection); + command.CommandType = CommandType.StoredProcedure; + command.CommandText = "TestFunction"; + command.Parameters.AddWithValue("@A", 1); + command.Parameters.AddWithValue("@B", 2); + command.Parameters.AddWithValue("@C", "test"); + command.Parameters.Add("@return", MySqlDbType.Int32).Direction = ParameterDirection.ReturnValue; + command.ExecuteNonQuery(); + } + + /// + /// Bug #44960 backslash in string - connector return exeption + /// + [Test] + public void EscapedBackslash() + { + ExecuteSQL("CREATE TABLE Test(id INT, name VARCHAR(20))"); + + MySqlCommand cmd = new MySqlCommand(@"INSERT INTO Test VALUES (1, '\\=\\')", Connection); + cmd.ExecuteNonQuery(); + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/TableCaching.cs b/MySQL.Data/tests/MySql.Data.Tests/TableCaching.cs new file mode 100644 index 000000000..656843ff2 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/TableCaching.cs @@ -0,0 +1,137 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System.Data; +using System.Threading; +using System.Diagnostics; + +namespace MySql.Data.MySqlClient.Tests +{ + public class TableCaching : TestBase + { + [Test] + public void SimpleTableCaching() + { + ExecuteSQL("CREATE TABLE test (id INT, name VARCHAR(20), name2 VARCHAR(20))"); + ExecuteSQL("INSERT INTO test VALUES (1, 'boo', 'hoo'), (2, 'first', 'last'), (3, 'fred', 'flintstone')"); + + MySqlTrace.Listeners.Clear(); + MySqlTrace.Switch.Level = SourceLevels.All; + GenericListener listener = new GenericListener(); + MySqlTrace.Listeners.Add(listener); + string connStr = Connection.ConnectionString + ";logging=true;table cache=true"; + + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + + MySqlCommand cmd = new MySqlCommand("test", c); + cmd.CommandType = CommandType.TableDirect; + ConsumeReader(cmd); + // now run the query again but this time it shouldn't generate a call to the database + ConsumeReader(cmd); + } + Assert.That(listener.Find("Resultset Opened: field(s) = 3"), Is.EqualTo(1)); + } + + [Test] + public void ConnectionStringExpiry() + { + ExecuteSQL("CREATE TABLE test3 (id INT, name VARCHAR(20), name2 VARCHAR(20))"); + ExecuteSQL("INSERT INTO test3 VALUES (1, 'boo', 'hoo'), (2, 'first', 'last'), (3, 'fred', 'flintstone')"); + + MySqlTrace.Listeners.Clear(); + MySqlTrace.Switch.Level = SourceLevels.All; + GenericListener listener = new GenericListener(); + MySqlTrace.Listeners.Add(listener); + string connStr = Connection.ConnectionString + ";logging=true;table cache=true;default table cache age=1"; + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + MySqlCommand cmd = new MySqlCommand("test3", c); + cmd.CommandType = CommandType.TableDirect; + ConsumeReader(cmd); + Thread.Sleep(1500); + // now run the query again but this time it should generate a call to the database + // since our next query is past the cache age of 1 second + ConsumeReader(cmd); + } + Assert.That(listener.Find("Resultset Opened: field(s) = 3"), Is.EqualTo(2)); + } + + [Test] + public void SettingAgeOnCommand() + { + ExecuteSQL("CREATE TABLE test2 (id INT, name VARCHAR(20), name2 VARCHAR(20))"); + ExecuteSQL("INSERT INTO test2 VALUES (1, 'boo', 'hoo'), (2, 'first', 'last'), (3, 'fred', 'flintstone')"); + + MySqlTrace.Listeners.Clear(); + MySqlTrace.Switch.Level = SourceLevels.All; + GenericListener listener = new GenericListener(); + MySqlTrace.Listeners.Add(listener); + string connStr = Connection.ConnectionString + ";logging=true;table cache=true;default table cache age=1"; + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + + MySqlCommand cmd = new MySqlCommand("test2", c); + cmd.CommandType = CommandType.TableDirect; + cmd.CacheAge = 20; + ConsumeReader(cmd); + Thread.Sleep(1000); + // now run the query again but this time it shouldn't generate a call to the database + // since we have overriden the connection string cache age of 1 second and set it + // to 20 seconds on our command + ConsumeReader(cmd); + } + Assert.That(listener.Find("Resultset Opened: field(s) = 3"), Is.EqualTo(1)); + } + + private void ConsumeReader(MySqlCommand cmd) + { + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + Assert.That(reader.GetInt32(0), Is.EqualTo(1)); + Assert.That(reader.GetString(1), Is.EqualTo("boo")); + Assert.That(reader.GetString(2), Is.EqualTo("hoo")); + reader.Read(); + Assert.That(reader.GetInt32(0), Is.EqualTo(2)); + Assert.That(reader.GetString(1), Is.EqualTo("first")); + Assert.That(reader.GetString(2), Is.EqualTo("last")); + reader.Read(); + Assert.That(reader.GetInt32(0), Is.EqualTo(3)); + Assert.That(reader.GetString(1), Is.EqualTo("fred")); + Assert.That(reader.GetString(2), Is.EqualTo("flintstone")); + Assert.That(reader.Read(), Is.False); + } + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/TestBase.cs b/MySQL.Data/tests/MySql.Data.Tests/TestBase.cs new file mode 100644 index 000000000..49109a360 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/TestBase.cs @@ -0,0 +1,369 @@ +// Copyright © 2016, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Data; +using System.Diagnostics; +using System.Net; +using System.Net.Sockets; + +namespace MySql.Data.MySqlClient.Tests +{ + public class TestBase + { + #region Properties + public MySqlConnectionStringBuilder Settings { get; private set; } + public MySqlConnectionStringBuilder RootSettings { get; private set; } + public static string UnixSocket { get; private set; } = Environment.GetEnvironmentVariable("MYSQL_SOCKET") ?? "/tmp/mysql.sock"; + public static string Host { get; private set; } = Environment.GetEnvironmentVariable("MYSQL_HOST") ?? "localhost"; + public static string Port { get; private set; } = Environment.GetEnvironmentVariable("MYSQL_PORT") ?? "3306"; + public static string RootUser { get; private set; } = Environment.GetEnvironmentVariable("MYSQL_ROOT_USER") ?? "root"; + public static string RootPassword { get; private set; } = Environment.GetEnvironmentVariable("MYSQL_ROOT_PASSWORD") ?? string.Empty; + public static string MemName { get; private set; } = Environment.GetEnvironmentVariable("MYSQL_MEM") ?? "MySQLSocket"; + public static string PipeName { get; private set; } = Environment.GetEnvironmentVariable("MYSQL_PIPE") ?? "MySQLSocket"; + public string BaseDBName { get; private set; } + public string BaseUserName { get; private set; } + public Version Version { get; private set; } + public int MaxPacketSize { get; set; } + public MySqlConnection Connection { get; set; } + public MySqlConnection Root { get; private set; } + #endregion + + #region Setup + [OneTimeSetUp] + public void OneTimeSetUp() + { + string _namespace = this.GetType().Name.ToLower(); + string ns = _namespace.Length > 10 ? _namespace.Substring(0, 10) : _namespace; + BaseDBName = "db-" + ns + "-"; + BaseUserName = "u-" + ns + "-"; + + var settings = new MySqlConnectionStringBuilder(); + settings.Server = Host; + settings.Port = UInt32.Parse(Port); + settings.UserID = RootUser; + settings.Password = RootPassword; + settings.PersistSecurityInfo = true; + settings.AllowUserVariables = true; + settings.Pooling = false; + settings.ConnectionTimeout = 600; + + if (Platform.IsWindows()) + { + settings.SharedMemoryName = MemName; + settings.PipeName = PipeName; + } + + AdjustConnectionSettings(settings); + MaxPacketSize = 1000 * 1024; + + RootSettings = new MySqlConnectionStringBuilder(settings.GetConnectionString(true)); + Settings = new MySqlConnectionStringBuilder(settings.GetConnectionString(true)); + Version = GetVersion(); + Debug.Assert(!string.IsNullOrEmpty(BaseDBName)); + InitializeDatabase(); + + Connection = GetConnection(false); + Root = GetConnection(true); + } + #endregion + + #region TearDown + [OneTimeTearDown] + public void OneTimeTearDownAttribute() + { + MySqlConnection.ClearAllPools(); + CleanupDatabase(); + + if (Connection != null && Connection.State == ConnectionState.Open) + Connection.Dispose(); + if (Root != null && Root.State == ConnectionState.Open) + Root.Dispose(); + } + + [TearDown] + public void TearDown() + { + Cleanup(); + } + #endregion + + #region Private Methods + private Version GetVersion() + { + using (var root = GetConnection(true)) + { + string versionString = root.ServerVersion; + int i = 0; + while (i < versionString.Length && + (Char.IsDigit(versionString[i]) || versionString[i] == '.')) + i++; + + return new Version(versionString.Substring(0, i)); + } + } + + private void InitializeDatabase() + { + CleanupDatabase(); + Settings.Database = CreateDatabase("0"); + Settings.UserID = CreateUser("0", "pwd"); + Settings.Password = "pwd"; + } + + private void CleanupDatabase() + { + using (var root = GetConnection(true)) + { + ExecuteSQL("SET GLOBAL max_allowed_packet=" + MaxPacketSize, root); // Need to fix for BlobTest.BlobBiggerThanMaxPacket + ExecuteSQL("SET GLOBAL SQL_MODE = STRICT_ALL_TABLES", root); + ExecuteSQL("SET GLOBAL connect_timeout=600", root); + ExecuteSQL("SET GLOBAL net_read_timeout=6000", root); + ExecuteSQL("SET GLOBAL net_write_timeout=6000", root); + ExecuteSQL("SET @@global.time_zone='SYSTEM'", root); + + var data = Utils.FillTable("SHOW DATABASES", root); + foreach (DataRow row in data.Rows) + { + string name = row[0].ToString(); + if (!name.StartsWith(BaseDBName)) continue; + ExecuteSQL(String.Format("DROP DATABASE IF EXISTS `{0}`", name), root); + } + data = Utils.FillTable(String.Format("SELECT user,host FROM mysql.user WHERE user LIKE '{0}%' OR user LIKE 'test%' OR user LIKE 'expired%'", BaseUserName), root); + foreach (DataRow row in data.Rows) + { + if (Version >= new Version("5.7")) + ExecuteSQL(String.Format("DROP USER IF EXISTS '{0}'@'{1}'", row[0].ToString(), row[1].ToString()), root); + else + ExecuteSQL(String.Format("DROP USER '{0}'@'{1}'", row[0].ToString(), row[1].ToString()), root); + } + ExecuteSQL("FLUSH PRIVILEGES", root); + } + } + + private void ExecuteSQL(string sql, MySqlConnection connection) + { + var cmd = connection.CreateCommand(); + cmd.CommandText = sql; + cmd.ExecuteNonQuery(); + } + #endregion + + #region Virtual Methods + internal virtual void AdjustConnectionSettings(MySqlConnectionStringBuilder settings) { } + + protected virtual void Cleanup() { } + #endregion + + #region Public Methods + + #if !NETFRAMEWORK + public static ActivityListener TestListener(Action activityCheck) + { + ActivityListener activity_listener = new ActivityListener + { + ShouldListenTo = source => + { + return source.Name == "connector-net"; + }, + ActivityStopped = activity => + { + if (activityCheck != null) + activityCheck(activity); + }, + Sample = (ref ActivityCreationOptions options) => ActivitySamplingResult.AllData, + }; + ActivitySource.AddActivityListener(activity_listener); + return activity_listener; + } + #endif + + public MySqlConnection GetConnection(bool asRoot = false) + { + var s = asRoot ? RootSettings : Settings; + var conn = new MySqlConnection(s.GetConnectionString(true)); + conn.Open(); + return conn; + } + + public string CreateDatabase(string postfix) + { + using (var connection = GetConnection(true)) + { + string dbName = String.Format("{0}{1}", BaseDBName, postfix); + ExecuteSQL(String.Format("CREATE DATABASE IF NOT EXISTS `{0}`", dbName), connection); + return dbName; + } + } + + public string CreateUser(string postfix, string password) + { + string host = Host == "localhost" ? Host : "%"; + using (var connection = GetConnection(true)) + { + string userName = String.Format("{0}{1}", BaseUserName, postfix); + + ExecuteSQL($"CREATE USER '{userName}'@'{host}' IDENTIFIED BY '{password}'", connection); + ExecuteSQL($"GRANT ALL ON *.* TO '{userName}'@'{host}'", connection); + ExecuteSQL("FLUSH PRIVILEGES", connection); + return userName; + } + } + + public string CreateUser(string userName, string password, string plugin) + { + string host = Host == "localhost" ? Host : "%"; + using (var connection = GetConnection(true)) + { + ExecuteSQL(String.Format("DROP USER IF EXISTS '{0}'@'{1}';", userName, host), connection); + ExecuteSQL( + String.Format( + "CREATE USER '{0}'@'{1}' IDENTIFIED {2} BY '{3}'", userName, host, + (plugin == null ? string.Empty : String.Format("WITH '{0}' ", plugin)), password), + connection); + + ExecuteSQL(String.Format("GRANT ALL ON *.* TO '{0}'@'{1}'", userName, host), connection); + ExecuteSQL("FLUSH PRIVILEGES", connection); + return userName; + } + } + + public void ExecuteSQL(string sql, bool asRoot = false) + { + var connection = asRoot ? Root : Connection; + var cmd = connection.CreateCommand(); + cmd.CommandText = sql; + cmd.ExecuteNonQuery(); + } + + public object ExecuteScalar(string sql, bool asRoot = false) + { + var connection = asRoot ? Root : Connection; + var cmd = connection.CreateCommand(); + cmd.CommandText = sql; + return cmd.ExecuteScalar(); + } + + public MySqlDataReader ExecuteReader(string sql, bool asRoot = false) + { + var conn = asRoot ? Root : Connection; + MySqlCommand cmd = new MySqlCommand(sql, conn); + return cmd.ExecuteReader(); + } + + public void KillConnection(MySqlConnection c, bool useCompression = false) + { + int threadId = c.ServerThread; + + var sb = new MySqlConnectionStringBuilder(RootSettings.ConnectionString); + if (useCompression) + { + sb.UseCompression = useCompression; + } + var root = new MySqlConnection(sb.GetConnectionString(true)); + root.Open(); + MySqlCommand cmd = new MySqlCommand("KILL " + threadId, root); + cmd.ExecuteNonQuery(); + + // the kill flag might need a little prodding to do its thing + try + { + cmd.CommandText = "SELECT 1"; + cmd.Connection = c; + cmd.ExecuteNonQuery(); + } + catch (Exception) { } + + // now wait till the process dies + while (true) + { + bool processStillAlive = false; + MySqlCommand cmdProcess = new MySqlCommand("SHOW PROCESSLIST", root); + MySqlDataReader dr = cmdProcess.ExecuteReader(); + while (dr.Read()) + { + if (dr.GetInt32(0) == threadId) processStillAlive = true; + } + dr.Close(); + + if (!processStillAlive) break; + System.Threading.Thread.Sleep(500); + } + root.Close(); + } + + public void KillPooledConnection(string connStr) + { + MySqlConnection c = new MySqlConnection(connStr); + c.Open(); + KillConnection(c); + } + + /// + /// Method to get the local ip address of the active MySql Server + /// + /// when is true return IPv6(::1), otherwise return IPv4(127.0.0.1) which is the default + /// Return the ip address as string + public string GetMySqlServerIp(bool isIpV6 = false) + { + string hostname, ipv4 = string.Empty, ipv6 = string.Empty; + string query = @"SELECT SUBSTRING_INDEX(host, ':', 1) as IP FROM information_schema.processlist WHERE ID = connection_id()"; + + using var conn = GetConnection(true); + using MySqlCommand cmd = new(query, conn); + hostname = cmd.ExecuteScalar().ToString(); + + foreach (var item in Dns.GetHostEntry(hostname).AddressList) + { + switch (item.AddressFamily) + { + case AddressFamily.InterNetwork: + ipv4 = item.ToString(); + break; + case AddressFamily.InterNetworkV6: + ipv6 = item.ToString(); + break; + } + } + + return isIpV6 ? ipv6 : ipv4; + } + + public bool Check_Plugin_Enabled(string pluginname) + { + using (var rdr = ExecuteReader($"SELECT PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = '{pluginname}' AND plugin_status = 'ACTIVE';")) + { + return rdr.HasRows; + } + } + #endregion + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Tokenizer.cs b/MySQL.Data/tests/MySql.Data.Tests/Tokenizer.cs new file mode 100644 index 000000000..76b01d3cf --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Tokenizer.cs @@ -0,0 +1,296 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using NUnit.Framework; +using NUnit.Framework.Legacy; + +namespace MySql.Data.MySqlClient.Tests +{ + public class Tokenizer : TestBase + { + [Test] + public void Simple() + { + SqlTokenizer tokenizer = new SqlTokenizer("SELECT * FROM Test"); + Assert.That(tokenizer.NextToken(), Is.EqualTo("SELECT")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("*")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("FROM")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("Test")); + Assert.That(tokenizer.NextToken(), Is.Null); + } + + [Test] + public void DashSingleLineComment() + { + string comment = "-- this is my comment\r\n"; + string sql = String.Format("SELECT {0} * FROM Test", comment); + SqlTokenizer tokenizer = new SqlTokenizer(sql); + tokenizer.ReturnComments = true; + Assert.That(tokenizer.NextToken(), Is.EqualTo("SELECT")); + Assert.That(tokenizer.NextToken(), Is.EqualTo(comment)); + Assert.That(tokenizer.NextToken(), Is.EqualTo("*")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("FROM")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("Test")); + Assert.That(tokenizer.NextToken(), Is.Null); + + tokenizer = new SqlTokenizer(sql); + tokenizer.ReturnComments = false; + Assert.That(tokenizer.NextToken(), Is.EqualTo("SELECT")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("*")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("FROM")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("Test")); + Assert.That(tokenizer.NextToken(), Is.Null); + } + + [Test] + public void HashSingleLineComment() + { + string comment = "#this is my comment\r\n"; + string sql = String.Format("SELECT {0} * FROM Test", comment); + SqlTokenizer tokenizer = new SqlTokenizer(sql); + tokenizer.ReturnComments = true; + Assert.That(tokenizer.NextToken(), Is.EqualTo("SELECT")); + Assert.That(tokenizer.NextToken(), Is.EqualTo(comment)); + Assert.That(tokenizer.NextToken(), Is.EqualTo("*")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("FROM")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("Test")); + Assert.That(tokenizer.NextToken(), Is.Null); + + tokenizer = new SqlTokenizer(sql); + tokenizer.ReturnComments = false; + Assert.That(tokenizer.NextToken(), Is.EqualTo("SELECT")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("*")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("FROM")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("Test")); + Assert.That(tokenizer.NextToken(), Is.Null); + } + + [Test] + public void MultiLineComment() + { + string comment = "/* this is my comment \r\n lines 2 \r\n line 3*/"; + string sql = String.Format("SELECT{0} * FROM Test", comment); + SqlTokenizer tokenizer = new SqlTokenizer(sql); + tokenizer.ReturnComments = true; + Assert.That(tokenizer.NextToken(), Is.EqualTo("SELECT")); + Assert.That(tokenizer.NextToken(), Is.EqualTo(comment.Trim())); + Assert.That(tokenizer.NextToken(), Is.EqualTo("*")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("FROM")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("Test")); + Assert.That(tokenizer.NextToken(), Is.Null); + + tokenizer = new SqlTokenizer(sql); + tokenizer.ReturnComments = false; + Assert.That(tokenizer.NextToken(), Is.EqualTo("SELECT")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("*")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("FROM")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("Test")); + Assert.That(tokenizer.NextToken(), Is.Null); + } + + [Test] + public void Parameter() + { + string sql = "SELECT * FROM Test WHERE id=@id AND id2=?id2"; + SqlTokenizer tokenizer = new SqlTokenizer(sql); + tokenizer.ReturnComments = true; + Assert.That(tokenizer.NextToken(), Is.EqualTo("SELECT")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("*")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("FROM")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("Test")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("WHERE")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("id")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("=")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("@id")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("AND")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("id2")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("=")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("?id2")); + Assert.That(tokenizer.NextToken(), Is.Null); + } + + [Test] + public void NextParameter() + { + string sql = "SELECT * FROM Test WHERE id=@id AND id2=?id2"; + SqlTokenizer tokenizer = new SqlTokenizer(sql); + tokenizer.ReturnComments = true; + Assert.That(tokenizer.NextParameter(), Is.EqualTo("@id")); + Assert.That(tokenizer.NextParameter(), Is.EqualTo("?id2")); + Assert.That(tokenizer.NextParameter(), Is.Null); + } + + [Test] + public void ParameterWithSpecialCharacters() + { + string sql = "SELECT * FROM Test WHERE id=@id_$123"; + SqlTokenizer tokenizer = new SqlTokenizer(sql); + tokenizer.ReturnComments = true; + Assert.That(tokenizer.NextToken(), Is.EqualTo("SELECT")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("*")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("FROM")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("Test")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("WHERE")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("id")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("=")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("@id_$123")); + Assert.That(tokenizer.NextToken(), Is.Null); + } + + [Test] + public void StringLiteral() + { + string sql = "SELECT 'a', 1, 'b'"; + SqlTokenizer tokenizer = new SqlTokenizer(sql); + tokenizer.ReturnComments = false; + Assert.That(tokenizer.NextToken(), Is.EqualTo("SELECT")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("'a'")); + Assert.That(tokenizer.NextToken(), Is.EqualTo(",")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("1")); + Assert.That(tokenizer.NextToken(), Is.EqualTo(",")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("'b'")); + Assert.That(tokenizer.NextToken(), Is.Null); + } + + [Test] + public void UserVariable() + { + string sql = "SELECT 'a', 1, @@myVar"; + SqlTokenizer tokenizer = new SqlTokenizer(sql); + tokenizer.ReturnComments = false; + Assert.That(tokenizer.NextToken(), Is.EqualTo("SELECT")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("'a'")); + Assert.That(tokenizer.NextToken(), Is.EqualTo(",")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("1")); + Assert.That(tokenizer.NextToken(), Is.EqualTo(",")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("@@myVar")); + Assert.That(tokenizer.NextToken(), Is.Null); + } + + [Test] + public void AnsiQuotes() + { + string sql = "SELECT 'a', \"a\", `a`"; + SqlTokenizer tokenizer = new SqlTokenizer(sql); + tokenizer.AnsiQuotes = false; + Assert.That(tokenizer.NextToken(), Is.EqualTo("SELECT")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("'a'")); + Assert.That(tokenizer.Quoted); + Assert.That(tokenizer.NextToken(), Is.EqualTo(",")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("\"a\"")); + Assert.That(tokenizer.Quoted); + Assert.That(tokenizer.NextToken(), Is.EqualTo(",")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("`a`")); + Assert.That(tokenizer.Quoted); + Assert.That(tokenizer.NextToken(), Is.Null); + } + + [Test] + public void ParseProcBody() + { + string sql = "CREATE PROCEDURE spTest(testid INT, testname VARCHAR(20)) BEGIN SELECT 1; END"; + SqlTokenizer tokenizer = new SqlTokenizer(sql); + tokenizer.AnsiQuotes = false; + Assert.That(tokenizer.NextToken(), Is.EqualTo("CREATE")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("PROCEDURE")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("spTest")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("(")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("testid")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("INT")); + Assert.That(tokenizer.NextToken(), Is.EqualTo(",")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("testname")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("VARCHAR")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("(")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("20")); + Assert.That(tokenizer.NextToken(), Is.EqualTo(")")); + Assert.That(tokenizer.NextToken(), Is.EqualTo(")")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("BEGIN")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("SELECT")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("1")); + Assert.That(tokenizer.NextToken(), Is.EqualTo(";")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("END")); + Assert.That(tokenizer.NextToken(), Is.Null); + } + + /// + /// Bug #44318 Tokenizer + /// + [Test] + public void NoSpaceAroundEquals() + { + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE Test(name VARCHAR(40))"); + + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test SET name='test -- test';", Connection); + cmd.ExecuteNonQuery(); + cmd.CommandText = "SELECT name FROM Test"; + object o = cmd.ExecuteScalar(); + Assert.That(o, Is.EqualTo("test -- test")); + + cmd.CommandText = "UPDATE Test SET name='Can you explain this ?';"; + cmd.ExecuteNonQuery(); + cmd.CommandText = "SELECT name FROM Test"; + o = cmd.ExecuteScalar(); + Assert.That(o, Is.EqualTo("Can you explain this ?")); + } + + [Test] + public void Slash() + { + string sql = "AND // OR"; + SqlTokenizer tokenizer = new SqlTokenizer(sql); + tokenizer.AnsiQuotes = false; + Assert.That(tokenizer.NextToken(), Is.EqualTo("AND")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("/")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("/")); + Assert.That(tokenizer.NextToken(), Is.EqualTo("OR")); + Assert.That(tokenizer.NextToken(), Is.Null); + } + + [Test] + public void SqlServerMode() + { + string sql = "SELECT `a`, [id], [name] FROM [Test]"; + SqlTokenizer tokenizer = new SqlTokenizer(sql); + tokenizer.SqlServerMode = true; + tokenizer.NextToken(); + Assert.That(tokenizer.NextToken(), Is.EqualTo("`a`")); + Assert.That(tokenizer.Quoted); + tokenizer.NextToken(); // read , + Assert.That(tokenizer.NextToken(), Is.EqualTo("[id]")); + Assert.That(tokenizer.Quoted); + tokenizer.NextToken(); // read , + Assert.That(tokenizer.NextToken(), Is.EqualTo("[name]")); + Assert.That(tokenizer.Quoted); + tokenizer.NextToken(); // read FROM + Assert.That(tokenizer.NextToken(), Is.EqualTo("[Test]")); + Assert.That(tokenizer.Quoted); + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Transactions.cs b/MySQL.Data/tests/MySql.Data.Tests/Transactions.cs new file mode 100644 index 000000000..7b0c331ce --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Transactions.cs @@ -0,0 +1,878 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Data; +using System.Data.Common; +using System.Threading; +using System.Threading.Tasks; +using System.Transactions; + +namespace MySql.Data.MySqlClient.Tests +{ + public class Transactions : TestBase + { + void TransactionScopeInternal(bool commit) + { + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE Test (key2 VARCHAR(1), name VARCHAR(100), name2 VARCHAR(100))"); + using (MySqlConnection c = new MySqlConnection(Connection.ConnectionString)) + { + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES ('a', 'name', 'name2')", c); + + using (TransactionScope ts = new TransactionScope()) + { + c.Open(); + cmd.ExecuteNonQuery(); + if (commit) + ts.Complete(); + } + + cmd.CommandText = "SELECT COUNT(*) FROM Test"; + object count = cmd.ExecuteScalar(); + Assert.That(Convert.ToInt32(count), Is.EqualTo(commit ? 1 : 0)); + } + } + + [Test] + public void TransactionScopeRollback() + { + TransactionScopeInternal(false); + } + + [Test] + public void TransactionScopeCommit() + { + TransactionScopeInternal(true); + } + + /// + /// Bug #34448 Connector .Net 5.2.0 with Transactionscope doesn´t use specified IsolationLevel + /// + [Test] + public void TransactionScopeWithIsolationLevel() + { + TransactionOptions opts = new TransactionOptions(); + opts.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted; + + using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, opts)) + { + string connStr = Connection.ConnectionString; + using (MySqlConnection myconn = new MySqlConnection(connStr)) + { + myconn.Open(); + MySqlCommand cmd = new MySqlCommand(Connection.driver.Version.isAtLeast(8, 0, 1) ? + "SHOW VARIABLES LIKE 'transaction_isolation'" : + "SHOW VARIABLES LIKE 'tx_isolation'" + , myconn); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + string level = reader.GetString(1); + Assert.That(level, Is.EqualTo("READ-COMMITTED")); + } + } + } + + opts.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted; + using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, opts)) + { + string connStr = Connection.ConnectionString; + using (MySqlConnection myconn = new MySqlConnection(connStr)) + { + myconn.Open(); + MySqlCommand cmd = new MySqlCommand(Connection.driver.Version.isAtLeast(8, 0, 1) ? + "SHOW VARIABLES LIKE 'transaction_isolation'" : + "SHOW VARIABLES LIKE 'tx_isolation'" + , myconn); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + string level = reader.GetString(1); + Assert.That(level, Is.EqualTo("READ-UNCOMMITTED")); + } + } + } + } + + [Test] + public void TransactionReadOnlyIsAvailable() + { + string connStr = Connection.ConnectionString; + using (MySqlConnection myconn = new MySqlConnection(connStr)) + { + myconn.Open(); + MySqlCommand cmd = new MySqlCommand(Connection.driver.Version.isAtLeast(8, 0, 1) ? + "SHOW VARIABLES LIKE 'transaction_read_only'" : + "SHOW VARIABLES LIKE 'tx_read_only'" + , myconn); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + if (Connection.driver.Version.isAtLeast(5, 7, 0)) + Assert.That(reader.GetString(1), Is.EqualTo("OFF")); + } + } + } + + /// + /// Bug #27289 Transaction is not rolledback when connection close + /// + [Test] + public void RollingBackOnClose() + { + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE Test (id INT) ENGINE=InnoDB"); + + MySqlConnectionStringBuilder connStrBuilder = new MySqlConnectionStringBuilder(Connection.ConnectionString); + connStrBuilder.Pooling = true; + connStrBuilder.ConnectionReset = true; + string connStr = connStrBuilder.GetConnectionString(true); + + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (1)", c); + c.BeginTransaction(); + cmd.ExecuteNonQuery(); + } + + using (MySqlConnection c2 = new MySqlConnection(connStr)) + { + c2.Open(); + MySqlCommand cmd2 = new MySqlCommand("SELECT COUNT(*) from Test", c2); + c2.BeginTransaction(); + object count = cmd2.ExecuteScalar(); + Assert.That(Convert.ToInt32(count), Is.EqualTo(0)); + } + + MySqlConnection connection = new MySqlConnection(connStr); + connection.Open(); + KillConnection(connection); + } + + /// + /// Bug #22042 mysql-connector-net-5.0.0-alpha BeginTransaction + /// + [Test] + public void Bug22042() + { + DbProviderFactory factory = + new MySql.Data.MySqlClient.MySqlClientFactory(); + using (DbConnection conexion = factory.CreateConnection()) + { + conexion.ConnectionString = Connection.ConnectionString; + conexion.Open(); + DbTransaction trans = conexion.BeginTransaction(); + trans.Rollback(); + } + } + + /// + /// Bug #26754 EnlistTransaction throws false MySqlExeption "Already enlisted" + /// + [Test] + public void EnlistTransactionNullTest() + { + try + { + MySqlCommand cmd = new MySqlCommand(); + cmd.Connection = Connection; + cmd.Connection.EnlistTransaction(null); + } + catch { } + + using (TransactionScope ts = new TransactionScope()) + { + MySqlCommand cmd = new MySqlCommand(); + cmd.Connection = Connection; + cmd.Connection.EnlistTransaction(Transaction.Current); + } + } + + /// + /// Bug #26754 EnlistTransaction throws false MySqlExeption "Already enlisted" + /// + [Test] + public void EnlistTransactionWNestedTrxTest() + { + MySqlTransaction t = Connection.BeginTransaction(); + + using (TransactionScope ts = new TransactionScope()) + { + MySqlCommand cmd = new MySqlCommand(); + cmd.Connection = Connection; + try + { + cmd.Connection.EnlistTransaction(Transaction.Current); + } + catch (InvalidOperationException) + { + /* caught NoNestedTransactions */ + } + } + + t.Rollback(); + + using (TransactionScope ts = new TransactionScope()) + { + MySqlCommand cmd = new MySqlCommand(); + cmd.Connection = Connection; + cmd.Connection.EnlistTransaction(Transaction.Current); + } + } + + [Test] + public void ManualEnlistment() + { +#if !NETFRAMEWORK + Assume.That(System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Windows)); +#endif + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE Test (key2 VARCHAR(1), name VARCHAR(100), name2 VARCHAR(100))"); + string connStr = Connection.ConnectionString + ";auto enlist=false"; + MySqlConnection c = null; + using (TransactionScope ts = new TransactionScope()) + { + c = new MySqlConnection(connStr); + c.Open(); + MySqlCommand cmd = new MySqlCommand("LOCK TABLES test WRITE;", c); + cmd.ExecuteNonQuery(); + cmd = new MySqlCommand("INSERT INTO Test VALUES ('a', 'name', 'name2')", c); + cmd.ExecuteNonQuery(); + ExecuteSQL("UNLOCK TABLES"); + } + MySqlCommand cmd2 = new MySqlCommand("LOCK TABLES test READ; SELECT COUNT(*) FROM test", c); + Assert.That(Convert.ToInt32(cmd2.ExecuteScalar()), Is.EqualTo(1)); + ExecuteSQL("UNLOCK TABLES"); + c.Dispose(); + KillPooledConnection(connStr); + } + + private void ManuallyEnlistingInitialConnection(bool complete) + { + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE Test (key2 VARCHAR(1), name VARCHAR(100), name2 VARCHAR(100))"); + string connStr = Connection.ConnectionString + ";auto enlist=false"; + + using (TransactionScope ts = new TransactionScope()) + { + using (MySqlConnection c1 = new MySqlConnection(connStr)) + { + c1.Open(); + c1.EnlistTransaction(Transaction.Current); + MySqlCommand cmd1 = new MySqlCommand("INSERT INTO Test (key2) VALUES ('a')", c1); + cmd1.ExecuteNonQuery(); + } + + using (MySqlConnection c2 = new MySqlConnection(connStr)) + { + c2.Open(); + c2.EnlistTransaction(Transaction.Current); + MySqlCommand cmd2 = new MySqlCommand("INSERT INTO Test (key2) VALUES ('b')", c2); + cmd2.ExecuteNonQuery(); + } + if (complete) + ts.Complete(); + } + + KillPooledConnection(connStr); + } + + [Test] + public void ManuallyEnlistingInitialConnectionTest() + { + ManuallyEnlistingInitialConnection(true); + } + + [Test] + public void ManuallyEnlistingInitialConnectionNoComplete() + { + ManuallyEnlistingInitialConnection(false); + } + + [Test] + public void ManualEnlistmentWithActiveConnection() + { + using (TransactionScope ts = new TransactionScope()) + { + string connStr = Connection.ConnectionString; + + using (MySqlConnection c1 = new MySqlConnection(connStr)) + { + c1.Open(); + + connStr += "; auto enlist=false"; + using (MySqlConnection c2 = new MySqlConnection(connStr)) + { + c2.Open(); + try + { + c2.EnlistTransaction(Transaction.Current); + } + catch (NotSupportedException) + { + } + } + } + } + } + + [Test] + public void AttemptToEnlistTwoConnections() + { + using (TransactionScope ts = new TransactionScope()) + { + string connStr = Connection.ConnectionString; + + using (MySqlConnection c1 = new MySqlConnection(connStr)) + { + c1.Open(); + + using (MySqlConnection c2 = new MySqlConnection(connStr)) + { + try + { + c2.Open(); + } + catch (NotSupportedException) + { + } + } + } + } + } + + + private void NestedScopeInternalTest( + TransactionScopeOption nestedOption, + bool innerComplete, + bool outerComplete, + bool expectInnerChangesVisible, + bool expectOuterChangesVisible) + { + ExecuteSQL("CREATE TABLE T(str varchar(10))"); + try + { + using (TransactionScope outer = new TransactionScope()) + { + string connStr = Connection.ConnectionString; + using (MySqlConnection c1 = new MySqlConnection(connStr)) + { + c1.Open(); + MySqlCommand cmd1 = new MySqlCommand("INSERT INTO T VALUES ('outer')", c1); + cmd1.ExecuteNonQuery(); + + using (TransactionScope inner = new TransactionScope(nestedOption)) + { + + MySqlConnection c2; + if (nestedOption == TransactionScopeOption.Required) + { + // inner scope joins already running ambient + // transaction, we cannot use new connection here + c2 = c1; + } + else + { + // when TransactionScopeOption.RequiresNew or + // new TransactionScopeOption.Suppress is used, + // we have to use a new transaction. We create a + // new connection for it. + c2 = new MySqlConnection(connStr); + c2.Open(); + } + + MySqlCommand cmd2 = new MySqlCommand("INSERT INTO T VALUES ('inner')", c2); + cmd2.ExecuteNonQuery(); + + if (innerComplete) + { + inner.Complete(); + } + + // Dispose connection if it was created. + if (c2 != c1) + c2.Dispose(); + } + } + + if (outerComplete) + outer.Complete(); + + } + bool innerChangesVisible = + ((long)MySqlHelper.ExecuteScalar(Connection, "select count(*) from T where str = 'inner'") == 1); + bool outerChangesVisible = + ((long)MySqlHelper.ExecuteScalar(Connection, "select count(*) from T where str = 'outer'") == 1); + Assert.That(expectInnerChangesVisible, Is.EqualTo(innerChangesVisible)); + Assert.That(expectOuterChangesVisible, Is.EqualTo(outerChangesVisible)); + } + finally + { + MySqlHelper.ExecuteNonQuery(Connection, "DROP TABLE T"); + } + } + + /// + /// Test inner/outer scope behavior, with different scope options, + /// completing either inner or outer scope, or both. + /// + [Test] + public void NestedScope() + { + // inner scope joins the ambient scope, neither inner not outer scope completes + // Expect empty table. + NestedScopeInternalTest(TransactionScopeOption.Required, false, false, false, false); + + // inner scope joins the ambient scope, inner does not complete, outer completes + // Expect exception while disposing outer transaction + //try + //{ + Assert.Throws(() => NestedScopeInternalTest(TransactionScopeOption.Required, false, true, false, false)); + //} + //catch (TransactionAbortedException) + //{ + //} + + // inner scope joins the ambient scope, inner completes, outer does not + // Expect empty table. + NestedScopeInternalTest(TransactionScopeOption.Required, true, false, false, false); + + // inner scope joins the ambient scope, both complete. + // Expect table with entries for inner and outer scope + NestedScopeInternalTest(TransactionScopeOption.Required, true, true, true, true); + + // inner scope creates new transaction, neither inner not outer scope completes + // Expect empty table. + NestedScopeInternalTest(TransactionScopeOption.RequiresNew, false, false, false, false); + + // inner scope creates new transaction, inner does not complete, outer completes + // Expect changes by outer transaction visible ?? + NestedScopeInternalTest(TransactionScopeOption.RequiresNew, false, true, false, true); + + // inner scope creates new transactiion, inner completes, outer does not + // Expect changes by inner transaction visible + NestedScopeInternalTest(TransactionScopeOption.RequiresNew, true, false, true, false); + + // inner scope creates new transaction, both complete + NestedScopeInternalTest(TransactionScopeOption.RequiresNew, true, true, true, true); + + + // inner scope suppresses transaction, neither inner not outer scope completes + // Expect changes made by inner scope to be visible + NestedScopeInternalTest(TransactionScopeOption.Suppress, false, false, true, false); + + // inner scope supresses transaction, inner does not complete, outer completes + // Expect changes by inner scope to be visible ?? + NestedScopeInternalTest(TransactionScopeOption.Suppress, true, false, true, false); + + // inner scope supresses transaction, inner completes, outer does not + // Expect changes by inner transaction visible + NestedScopeInternalTest(TransactionScopeOption.Suppress, true, false, true, false); + + // inner scope supresses transaction, both complete + NestedScopeInternalTest(TransactionScopeOption.Suppress, true, true, true, true); + } + + private void ReusingSameConnection(bool pooling, bool complete) + { + int c1Thread; + ExecuteSQL("TRUNCATE TABLE Test"); + + using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew, TimeSpan.MaxValue)) + { + string connStr = Connection.ConnectionString; + if (!pooling) + connStr += ";pooling=false"; + + using (MySqlConnection c1 = new MySqlConnection(connStr)) + { + c1.Open(); + MySqlCommand cmd1 = new MySqlCommand("INSERT INTO Test (key2) VALUES ('a')", c1); + cmd1.ExecuteNonQuery(); + c1Thread = c1.ServerThread; + } + + using (MySqlConnection c2 = new MySqlConnection(connStr)) + { + c2.Open(); + MySqlCommand cmd2 = new MySqlCommand("INSERT INTO Test (key2) VALUES ('b')", c2); + cmd2.ExecuteNonQuery(); + Assert.That(c2.ServerThread, Is.EqualTo(c1Thread)); + } + + if (complete) + ts.Complete(); + } + + MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", Connection); + DataTable dt = new DataTable(); + da.Fill(dt); + if (complete) + { + Assert.That(dt.Rows.Count, Is.EqualTo(2)); + Assert.That(dt.Rows[0][0], Is.EqualTo("a")); + Assert.That(dt.Rows[1][0], Is.EqualTo("b")); + } + else + { + Assert.That(dt.Rows.Count, Is.EqualTo(0)); + } + } + + [Test] + public void ReusingSameConnectionTest() + { + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE Test (key2 VARCHAR(1), name VARCHAR(100), name2 VARCHAR(100))"); + ReusingSameConnection(true, true); + ReusingSameConnection(true, false); ; + ReusingSameConnection(false, true); + ReusingSameConnection(false, false); + } + + /// + /// bug#35330 - even if transaction scope has expired, rows can be inserted into + /// the table, due to race condition with the thread doing rollback + /// + [Test] + public void ScopeTimeoutWithMySqlHelper() + { +#if !NETFRAMEWORK + Assume.That(System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Windows)); +#endif + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE Test (id int)"); + string connStr = Connection.ConnectionString; + using (new TransactionScope(TransactionScopeOption.RequiresNew, TimeSpan.FromSeconds(1))) + { + try + { + for (int i = 0; ; i++) + { + MySqlHelper.ExecuteNonQuery(connStr, String.Format("INSERT INTO Test VALUES({0})", i)); ; + } + } + catch (Exception) + { + } + } + long count = (long)MySqlHelper.ExecuteScalar(connStr, "select count(*) from test"); + Assert.That(count, Is.EqualTo(0)); + } + + /// + /// Variation of previous test, with a single connection and maual enlistment. + /// Checks that transaction rollback leaves the connection intact (does not close it) + /// and checks that no command is possible after scope has expired and + /// rollback by timer thread is finished. + /// + [Test] + public void AttemptToUseConnectionAfterScopeTimeout() + { + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE Test (id int)"); + string connStr = Connection.ConnectionString; + using (MySqlConnection c = new MySqlConnection(connStr)) + { + c.Open(); + MySqlCommand cmd = new MySqlCommand("select 1", c); + using (new TransactionScope(TransactionScopeOption.RequiresNew, + TimeSpan.FromSeconds(1))) + { + c.EnlistTransaction(Transaction.Current); + cmd = new MySqlCommand("select 1", c); + try + { + for (int i = 0; ; i++) + { + cmd.CommandText = String.Format("INSERT INTO Test VALUES({0})", i); + cmd.ExecuteNonQuery(); + } + } + catch (Exception) + { + // Eat exception + } + + // Here, scope is timed out and rollback is in progress. + // Wait until timeout thread finishes rollback then try to + // use an aborted connection. + Thread.Sleep(500); + Assert.Throws(() => cmd.ExecuteNonQuery()); + } + Assert.That(c.State == ConnectionState.Open); + cmd.CommandText = "select count(*) from Test"; + long count = (long)cmd.ExecuteScalar(); + Assert.That(count, Is.EqualTo(0)); + } + } + + + /// + /// Bug#54681 : Null Reference exception when using transaction + /// scope in more that one thread + /// + [Test] + public void TransactionScopeWithThreads() + { + // use transaction scope in the current thread + DoThreadWork(); + + //use transaction scope in another thread (used to crash with null + // reference exception) + Thread t = new Thread(new ThreadStart(DoThreadWork)); + t.Start(); + t.Join(); + } + + [Test] + public void SnapshotIsolationLevelThrowsNotSupportedException() + { + using (MySqlConnection newcon = new MySqlConnection(Connection.ConnectionString)) + { + newcon.Open(); + var ex = Assert.Throws(() => newcon.BeginTransaction(System.Data.IsolationLevel.Snapshot)); + Assert.That(ex.Message, Is.EqualTo("Snapshot isolation level is not supported")); + } + } + + private void DoThreadWork() + { + using (TransactionScope ts = new TransactionScope()) + { + string connStr = Connection.ConnectionString; + using (MySqlConnection c1 = new MySqlConnection(connStr)) + { + c1.Open(); + } + } + } + + [Test] + /// + /// Bug #26035791 WRONG ISOLATION LEVEL FOR BEGIN TRANSACTION + /// + public void Bug26035791() + { + using (MySqlConnection db = new MySqlConnection(Connection.ConnectionString)) + { + + ExecuteSQL("Create Table TransTest(id int, name varchar(50))"); + ExecuteSQL("INSERT INTO TransTest VALUES(1, 'Test1')"); + db.Open(); + string initialLevel = string.Empty; + string finalLevel = string.Empty; + + MySqlCommand cmd = new MySqlCommand(@"SHOW VARIABLES WHERE variable_name like '%isolation%'", db); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + initialLevel = reader.GetString(1); + } + + using (MySqlTransaction transaction = db.BeginTransaction(System.Data.IsolationLevel.ReadUncommitted)) + { + MySqlCommand cmd2 = new MySqlCommand(@"INSERT INTO TransTest VALUES(2, 'second')", db, transaction); + cmd2.ExecuteNonQuery(); + + cmd2 = new MySqlCommand(@"select count(*) from TransTest", db, transaction); + int.TryParse(cmd2.ExecuteScalar().ToString(), out int n1); // If ReadUncommitted is applied we should be able to read inserted record before commit + Assert.That(n1 == 2); + transaction.Commit(); + } + ExecuteSQL("drop table TransTest"); + cmd = new MySqlCommand(@"SHOW VARIABLES WHERE variable_name like '%isolation%'", db); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + finalLevel = reader.GetString(1); + } + Assert.That(finalLevel, Is.EqualTo(initialLevel)); // Isolation level should be the same after the transaction + } + } + + /// + /// Related to bug http://bugs.mysql.com/bug.php?id=71502 + /// + [Test] + public void NestedTransactionException() + { + MySqlConnectionStringBuilder sb = new MySqlConnectionStringBuilder(Connection.ConnectionString); + sb.Pooling = true; + sb.ConnectionReset = false; + string connectionString = sb.ToString(); + for (int i = 0; i < 5; i++) + { + using (MySqlConnection connection = new MySqlConnection(connectionString)) + { + connection.Open(); + DbTransaction trx = connection.BeginTransaction(); + MySqlCommand cmd = new MySqlCommand("update abc", connection); + Assert.Throws(() => cmd.ExecuteNonQuery()); + // the following condition validates 2 scenarios + // when trx.Dispose is not invoked (when i == 0 or 1) + // and when the connection is closed before calling trx.Dispose + if (i > 1) connection.Close(); + trx.Dispose(); + } + } + } + + /// + /// Bug #33123597 IF AUTOCOMMIT=0, "SHOW COLLATION" VIA OPEN() WILL CAUSE BEGINTRANSACTION() TO FAIL + /// + [Test] + public void TransactionWithAutoCommit() + { + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("create table Test(id int)"); + ExecuteSQL("set autocommit = 0;"); + + MySqlConnectionStringBuilder sb = new MySqlConnectionStringBuilder(Settings.ConnectionString); + sb.PersistSecurityInfo = true; + sb.Pooling = true; + sb.SslMode = MySqlSslMode.Disabled; + + using (var connection = new MySqlConnection(sb.ConnectionString)) + { + connection.Open(); + var transaction = connection.BeginTransaction(); + Assert.That(transaction, Is.Not.Null); + var myCommand = connection.CreateCommand(); + myCommand.CommandText = "INSERT INTO `Test` VALUES (1);"; + var result = myCommand.ExecuteNonQuery(); + transaction.Commit(); + } + + ExecuteSQL("set autocommit = 1;"); + } + + /// + /// Bug #28662512 ASYNC, TRANSACTIONSCOPE.DISPOSE: "ALREADY AN OPEN DATAREADER ASSOCIATED" + /// + [Test] + [Ignore("If required run manually")] + public void TransactionScopeDispose() + { + ExecuteSQL(@"CREATE TABLE `keyvalue` ( + `id` bigint(20) unsigned NOT NULL, + `name1` varchar(250), + `name2` varchar(250), + `name3` varchar(250), + `name4` varchar(250), + PRIMARY KEY(`id`, name1(10)) + ) ENGINE = innodb; "); + + for (int i = 0; i < 1000; i++) + { + var id = i < 5 ? i + 1 : i + 1000; + var sql = $"insert into `keyvalue` values ({id}, md5(rand() * 1000000), md5(rand() * 1000000), md5(rand() * 1000000), md5(rand() * 1000000));"; + ExecuteSQL(sql); + } + var cs = $"server={Host};port={Port};Database={Connection.Settings.Database};Uid={Connection.Settings.UserID};password={Connection.Settings.Password};ssl-mode=none; "; + PerformQueriesAtIntervals(TimeSpan.FromMilliseconds(70), + connectionString: cs, tableName: "keyvalue") + .GetAwaiter().GetResult(); + } + + /// + /// Bug#34107186 [System.NullReferenceException] + /// When the connection was Aborted due to an exception, this was closed and hence the transaction couldn't be rolled back. + /// + [Test] + public void TransactionScopeNullReference() + { + Assert.DoesNotThrow(() => PerformSelectThatTimesOut(Connection.ConnectionString)); + } + + private void PerformSelectThatTimesOut(string connectionString) + { + using (TransactionScope scope = new TransactionScope()) + { + using (var connection = new MySqlConnection(connectionString)) + { + connection.Open(); + using (var cmd = connection.CreateCommand()) + { + cmd.CommandText = "SELECT * from INFORMATION_SCHEMA.TABLES LIMIT 1; SELECT SLEEP(5);"; + cmd.CommandTimeout = 1; + cmd.ExecuteNonQuery(); + } + } + } + } + private static async Task PerformQueriesAtIntervals(TimeSpan interval, string connectionString, string tableName) + { + for (int i = 0; i < 151; i++) + { + Task.Run(() => PerformQuery(connectionString, tableName)); + await Task.Delay(interval); + } + } + + private static async Task PerformQuery(string connectionString, string tableName) + { + try + { + using (var transactionScope = new TransactionScope( + TransactionScopeOption.Required, + new TransactionOptions() + { + IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted, + Timeout = TimeSpan.FromMinutes(10) + }, + TransactionScopeAsyncFlowOption.Enabled)) + { + await SelectStarLimit1(connectionString, tableName); + var delay = TimeSpan.FromSeconds(10); + await Task.Delay(delay); + transactionScope.Complete(); + } + } + catch (Exception e) + { + Assert.Fail(e.Message); + } + } + + private static async Task SelectStarLimit1(string connectionString, string tableName) + { + using (var connection = new MySqlConnection(connectionString)) + using (var command = connection.CreateCommand()) + { + command.CommandText = $"SELECT * FROM {tableName} LIMIT 1"; + await connection.OpenAsync(); + await command.ExecuteNonQueryAsync(); + } + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/UnixSockets.cs b/MySQL.Data/tests/MySql.Data.Tests/UnixSockets.cs new file mode 100644 index 000000000..1ab79fb24 --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/UnixSockets.cs @@ -0,0 +1,54 @@ +// Copyright © 2017, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Data; + +namespace MySql.Data.MySqlClient.Tests +{ + public class UnixSockets : TestBase + { + [Test] + [Property("Category", "Security")] + public void ConnectionTest() + { + string unixConnectionString = $"server={UnixSocket};user={Settings.UserID};password={Settings.Password};protocol=unix;"; + + Assume.That(!Platform.IsWindows()); + + using (MySqlConnection conn = new MySqlConnection(unixConnectionString)) + { + conn.Open(); + Assert.That(conn.State, Is.EqualTo(ConnectionState.Open)); + } + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/Utils.cs b/MySQL.Data/tests/MySql.Data.Tests/Utils.cs new file mode 100644 index 000000000..16b0cc5bc --- /dev/null +++ b/MySQL.Data/tests/MySql.Data.Tests/Utils.cs @@ -0,0 +1,73 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Data; + +namespace MySql.Data.MySqlClient.Tests +{ + /// + /// Summary description for Utils. + /// + public static class Utils + { + public static byte[] CreateBlob(int size) + { + byte[] buf = new byte[size]; + + Random r = new Random(); + r.NextBytes(buf); + return buf; + } + + public static DataTable FillTable(string sql, MySqlConnection conn) + { + MySqlDataAdapter da = new MySqlDataAdapter(sql, conn); + DataTable dt = new DataTable(); + da.Fill(dt); + return dt; + } + + public static bool TableExists(string tableName, MySqlConnection conn) + { + using (conn) + { + MySqlCommand cmd = new MySqlCommand($"SELECT * FROM {tableName} LIMIT 0", conn); + try + { + cmd.ExecuteScalar(); + return true; + } + catch (Exception) + { + return false; + } + } + } + } +} diff --git a/MySQL.Data/tests/MySql.Data.Tests/certificates/ca-key.pem b/MySQL.Data/tests/MySql.Data.Tests/certificates/ca-key.pem new file mode 100644 index 000000000..fd95a2bae Binary files /dev/null and b/MySQL.Data/tests/MySql.Data.Tests/certificates/ca-key.pem differ diff --git a/MySQL.Data/tests/MySql.Data.Tests/certificates/ca.pem b/MySQL.Data/tests/MySql.Data.Tests/certificates/ca.pem new file mode 100644 index 000000000..e2f2df827 Binary files /dev/null and b/MySQL.Data/tests/MySql.Data.Tests/certificates/ca.pem differ diff --git a/MySQL.Data/tests/MySql.Data.Tests/certificates/ca_dummy.pem b/MySQL.Data/tests/MySql.Data.Tests/certificates/ca_dummy.pem new file mode 100644 index 000000000..e69de29bb diff --git a/MySQL.Data/tests/MySql.Data.Tests/certificates/client-cert.pem b/MySQL.Data/tests/MySql.Data.Tests/certificates/client-cert.pem new file mode 100644 index 000000000..3203bb05b Binary files /dev/null and b/MySQL.Data/tests/MySql.Data.Tests/certificates/client-cert.pem differ diff --git a/MySQL.Data/tests/MySql.Data.Tests/certificates/client-cert_dummy.pem b/MySQL.Data/tests/MySql.Data.Tests/certificates/client-cert_dummy.pem new file mode 100644 index 000000000..e69de29bb diff --git a/MySQL.Data/tests/MySql.Data.Tests/certificates/client-incorrect.pfx b/MySQL.Data/tests/MySql.Data.Tests/certificates/client-incorrect.pfx new file mode 100644 index 000000000..d0fa18422 Binary files /dev/null and b/MySQL.Data/tests/MySql.Data.Tests/certificates/client-incorrect.pfx differ diff --git a/MySQL.Data/tests/MySql.Data.Tests/certificates/client-key.pem b/MySQL.Data/tests/MySql.Data.Tests/certificates/client-key.pem new file mode 100644 index 000000000..278740321 Binary files /dev/null and b/MySQL.Data/tests/MySql.Data.Tests/certificates/client-key.pem differ diff --git a/MySQL.Data/tests/MySql.Data.Tests/certificates/client-key_altered.pem b/MySQL.Data/tests/MySql.Data.Tests/certificates/client-key_altered.pem new file mode 100644 index 000000000..dd8d1bd3a Binary files /dev/null and b/MySQL.Data/tests/MySql.Data.Tests/certificates/client-key_altered.pem differ diff --git a/MySQL.Data/tests/MySql.Data.Tests/certificates/client-key_dummy.pem b/MySQL.Data/tests/MySql.Data.Tests/certificates/client-key_dummy.pem new file mode 100644 index 000000000..e69de29bb diff --git a/MySQL.Data/tests/MySql.Data.Tests/certificates/server-cert.pem b/MySQL.Data/tests/MySql.Data.Tests/certificates/server-cert.pem new file mode 100644 index 000000000..e46422b71 Binary files /dev/null and b/MySQL.Data/tests/MySql.Data.Tests/certificates/server-cert.pem differ diff --git a/MySQL.Data/tests/MySql.Data.Tests/certificates/server-key.pem b/MySQL.Data/tests/MySql.Data.Tests/certificates/server-key.pem new file mode 100644 index 000000000..2269abc15 Binary files /dev/null and b/MySQL.Data/tests/MySql.Data.Tests/certificates/server-key.pem differ diff --git a/MySQL.Data/tests/MySql.Data.Tests/client.pfx b/MySQL.Data/tests/MySql.Data.Tests/client.pfx new file mode 100644 index 000000000..17a8587d9 Binary files /dev/null and b/MySQL.Data/tests/MySql.Data.Tests/client.pfx differ diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/BaseTest.cs b/MySQL.Data/tests/MySqlX.Data.Tests/BaseTest.cs new file mode 100644 index 000000000..f5fc415f0 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/BaseTest.cs @@ -0,0 +1,289 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Common; +using MySqlX.XDevAPI.CRUD; +using MySqlX.XDevAPI.Relational; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Data; +using System.IO; +using System.Net; +using System.Net.Sockets; +using System.Reflection; + +namespace MySqlX.Data.Tests +{ + public class BaseTest + { + protected Session session; + protected Schema testSchema; + protected static readonly string schemaName = "test"; + public static readonly string sslCa = "ca.pem"; + public static readonly string sslCert = "client-cert.pem"; + public static readonly string sslKey = "client-key.pem"; + public static readonly string clientPfxIncorrect = "client-incorrect.pfx"; + public static readonly string clientPfx = "client.pfx"; + public static readonly string sslCertificatePassword = "pass"; + + #region Properties + internal static string Port { get; private set; } = Environment.GetEnvironmentVariable("MYSQL_PORT") ?? "3306"; + internal static string XPort { get; private set; } = Environment.GetEnvironmentVariable("MYSQLX_PORT") ?? "33060"; + internal static string Host { get; private set; } = Environment.GetEnvironmentVariable("MYSQL_HOST") ?? "localhost"; + internal static string RootUser { get; private set; } = Environment.GetEnvironmentVariable("MYSQL_ROOT_USER") ?? "root"; + internal static string RootPassword { get; private set; } = Environment.GetEnvironmentVariable("MYSQL_ROOT_PASSWORD") ?? string.Empty; + public static string ConnectionString { get; private set; } + public static string ConnectionStringUri { get; private set; } + public static string ConnectionStringNoPassword { get; private set; } + public static string ConnectionStringRoot { get; private set; } + public static string ConnectionStringUriNative { get; private set; } + public static string ConnectionStringUserWithSSLPEM { get; private set; } + public static string connSSLURI { get; private set; } + public static bool ServerIsDown { get; set; } + #endregion + + #region Ctor + static BaseTest() + { + ConnectionStringRoot = $"server={Host};port={Port};uid={RootUser};password={RootPassword}"; + ConnectionString = $"server={Host};port={XPort};uid=test;password=test"; + ConnectionStringNoPassword = $"server={Host};port={XPort};uid=testNoPass;"; + ConnectionStringUri = $"mysqlx://test:test@{Host}:{XPort}"; + ConnectionStringUriNative = $"mysqlx://testNative:test@{Host}:{XPort}"; + ConnectionStringUserWithSSLPEM = $"server={Host};user=test;port={XPort};password=test;SslCa={sslCa};SslCert={sslCert};SslKey={sslKey}"; + connSSLURI = ConnectionStringUri + $"?Ssl-ca={sslCa}&SslCert={sslCert}&SslKey={sslKey}&Auth=AUTO"; + } + #endregion + + #region SetUp + [OneTimeSetUp] + public virtual void BaseSetUp() + { + Assembly executingAssembly = typeof(BaseTest).GetTypeInfo().Assembly; + Stream stream = executingAssembly.GetManifestResourceStream("MySqlX.Data.Tests.Properties.CreateUsers.sql"); + StreamReader sr = new StreamReader(stream); + string sql = sr.ReadToEnd(); + sr.Dispose(); + ExecuteSqlAsRoot(sql); + session = GetSession(); + testSchema = session.GetSchema(schemaName); + if (SchemaExistsInDatabase(testSchema)) + session.DropSchema(schemaName); + session.CreateSchema(schemaName); + } + #endregion + + #region TearDown + [OneTimeTearDown] + public virtual void BaseTearDown() + { + using (Session s = GetSession()) + { + Schema schema = s.GetSchema(schemaName); + if (SchemaExistsInDatabase(schema)) + s.DropSchema(schemaName); + schema.Session.DropSchema(schemaName); + Assert.That(SchemaExistsInDatabase(schema), Is.False); + } + + DropUsers(); + } + #endregion + + #region Methods + private void DropUsers() + { + var users = FillTable("SELECT user, host FROM mysql.user WHERE user NOT LIKE 'mysql%' AND user NOT LIKE 'root'"); + foreach (DataRow row in users.Rows) + ExecuteSqlAsRoot(string.Format("DROP USER '{0}'@'{1}'", row[0].ToString(), row[1].ToString())); + ExecuteSqlAsRoot("FLUSH PRIVILEGES"); + } + + public DataTable FillTable(string sql) + { + DataTable dt = new DataTable(); + using (var conn = new MySqlConnection(ConnectionStringRoot)) + { + conn.Open(); + MySqlDataAdapter da = new MySqlDataAdapter(sql, conn); + da.Fill(dt); + } + return dt; + } + + protected Table GetTable(string schema, string table) + { + return GetSession().GetSchema(schema).GetTable(table); + } + + protected SqlResult ExecuteSQL(string sql) + { + Session session = GetSession(); + session.SetCurrentSchema(schemaName); + SqlResult r = ExecuteSQLStatement(session.SQL(sql)); + var rows = r.HasData ? r.FetchAll() : null; + return r; + } + + protected Collection CreateCollection(string name, string schema = null) + { + if (schema == null) + schema = schemaName; + Schema test = session.GetSchema(schema); + test.DropCollection(name); + return test.CreateCollection(name); + } + + public Session GetSession(bool setCurrentSchema = false) + { + if (session == null) + { + session = MySQLX.GetSession(ConnectionString); + if (setCurrentSchema) + session.SetCurrentSchema(schemaName); + } + return session; + } + + protected void ExecuteSqlAsRoot(string sql) + { + using (var conn = new MySqlConnection(ConnectionStringRoot + ";ssl mode=none")) + { + conn.Open(); + MySqlScript s = new(conn, sql); + s.Execute(); + } + } + + protected Result ExecuteAddStatement(AddStatement stmt) + { + return stmt.Execute(); + } + + protected Result ExecuteModifyStatement(ModifyStatement stmt) + { + return stmt.Execute(); + } + + protected DocResult ExecuteFindStatement(FindStatement stmt) + { + return stmt.Execute(); + } + + protected SqlResult ExecuteSQLStatement(SqlStatement stmt) + { + return stmt.Execute(); + } + + protected Result ExecuteRemoveStatement(RemoveStatement stmt) + { + return stmt.Execute(); + } + + protected RowResult ExecuteSelectStatement(TableSelectStatement stmt) + { + return stmt.Execute(); + } + + protected Result ExecuteInsertStatement(TableInsertStatement stmt) + { + return stmt.Execute(); + } + + protected Result ExecuteUpdateStatement(TableUpdateStatement stmt) + { + return stmt.Execute(); + } + + protected Result ExecuteDeleteStatement(TableDeleteStatement stmt) + { + return stmt.Execute(); + } + + protected bool SchemaExistsInDatabase(Schema schema) + { + return schema.ExistsInDatabase(); + } + + protected bool CollectionExistsInDatabase(Collection collection) + { + return collection.ExistsInDatabase(); + } + + protected bool TableExistsInDatabase(Table table) + { + return table.ExistsInDatabase(); + } + + public string GetIPV6Address() + { + string strHostName = System.Net.Dns.GetHostName(); + IPHostEntry ipEntry = System.Net.Dns.GetHostEntry(strHostName); + IPAddress[] addr = ipEntry.AddressList; + return addr[0].ToString(); + } + + /// + /// Method to get the local ip address of the active MySql Server + /// + /// when is true return IPv6(::1), otherwise return IPv4(127.0.0.1) which is the default + /// Return the ip address as string + public string GetMySqlServerIp(bool isIpV6 = false) + { + var hostname = session.SQL("Select SUBSTRING_INDEX(host, ':', 1) as 'ip' From information_schema.processlist WHERE ID = connection_id()").Execute().FetchOne()[0].ToString(); + string ipv4 = string.Empty; + string ipv6 = string.Empty; + + foreach (var item in Dns.GetHostEntry(hostname).AddressList) + { + switch (item.AddressFamily) + { + case AddressFamily.InterNetwork: + ipv4 = item.ToString(); + break; + case AddressFamily.InterNetworkV6: + ipv6 = item.ToString(); + break; + } + } + + return isIpV6 ? ipv6 : ipv4; + } + + public bool Check_Plugin_Enabled(string pluginname) + { + var checkplugin = session.SQL($"SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = '{pluginname}' AND PLUGIN_STATUS='ACTIVE';").Execute().FetchOne(); + return checkplugin != null; + } + + #endregion + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/BasicFindTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/BasicFindTests.cs new file mode 100644 index 000000000..89549ee2a --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/BasicFindTests.cs @@ -0,0 +1,2285 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Common; +using MySqlX.XDevAPI.CRUD; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; + +namespace MySqlX.Data.Tests +{ + public class BasicFindTests : BaseTest + { + [Test] + public void SimpleFind() + { + Collection coll = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + Result r = ExecuteAddStatement(coll.Add(docs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4)); + + var foundDocs = ExecuteFindStatement(coll.Find("pages > 20")); + Assert.That(foundDocs.Next()); + Assert.That(foundDocs.Current["title"].ToString() == "Book 2"); + Assert.That(foundDocs.Next()); + Assert.That(foundDocs.Current["title"].ToString() == "Book 3"); + Assert.That(foundDocs.Next()); + Assert.That(foundDocs.Current["title"].ToString() == "Book 4"); + Assert.That(foundDocs.Next(), Is.False); + } + + [Test] + public void SimpleFindWithSort() + { + Collection coll = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + Result r = ExecuteAddStatement(coll.Add(docs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4)); + + var foundDocs = ExecuteFindStatement(coll.Find("pages > 20").Sort("pages DESC")); + Assert.That(foundDocs.Next()); + Assert.That(foundDocs.Current["title"].ToString() == "Book 4"); + Assert.That(foundDocs.Next()); + Assert.That(foundDocs.Current["title"].ToString() == "Book 3"); + Assert.That(foundDocs.Next()); + Assert.That(foundDocs.Current["title"].ToString() == "Book 2"); + Assert.That(foundDocs.Next(), Is.False); + } + + [Test] + public void SimpleFindWithLimitAndOffset() + { + Collection coll = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + Result r = ExecuteAddStatement(coll.Add(docs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4)); + + var foundDocs = ExecuteFindStatement(coll.Find("pages > 20").Limit(1)); + Assert.That(foundDocs.Next()); + Assert.That(foundDocs.Current["title"].ToString() == "Book 2"); + Assert.That(foundDocs.Next(), Is.False); + + var resultDocs = ExecuteFindStatement(coll.Find("pages > 20").Offset(1).Limit(2)).FetchAll(); + Assert.That(resultDocs[0]["pages"], Is.EqualTo(40)); + Assert.That(resultDocs[1]["pages"], Is.EqualTo(50)); + + // Limit out of range. + Assert.Throws(() => ExecuteFindStatement(coll.Find().Limit(0))); + Assert.Throws(() => ExecuteFindStatement(coll.Find().Limit(-1))); + } + + [Test] + public void FindConditional() + { + Collection coll = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + Result r = ExecuteAddStatement(coll.Add(docs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4)); + + var foundDocs = ExecuteFindStatement(coll.Find("pages = :Pages").Bind("pAges", 40)); + Assert.That(foundDocs.Next()); + Assert.That(foundDocs.Current["title"].ToString() == "Book 3"); + Assert.That(foundDocs.Next(), Is.False); + } + + [Test] + public void BindDbDoc() + { + Collection coll = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + Result r = ExecuteAddStatement(coll.Add(docs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4)); + + DbDoc docParams = new DbDoc(new { pages1 = 30, pages2 = 40 }); + var foundDocs = ExecuteFindStatement(coll.Find("pages = :Pages1 || pages = :Pages2").Bind(docParams)); + Assert.That(foundDocs.Next()); + Assert.That(foundDocs.Current["title"], Is.EqualTo("Book 2")); + Assert.That(foundDocs.Next()); + Assert.That(foundDocs.Current["title"], Is.EqualTo("Book 3")); + Assert.That(foundDocs.Next(), Is.False); + } + + [Test] + public void BindJsonAsAnonymous() + { + Collection coll = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + Result r = ExecuteAddStatement(coll.Add(docs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4)); + + var jsonParams = new { pages1 = 30, pages2 = 40 }; + var foundDocs = ExecuteFindStatement(coll.Find("pages = :Pages1 || pages = :Pages2").Bind(jsonParams)); + Assert.That(foundDocs.Next()); + Assert.That(foundDocs.Current["title"], Is.EqualTo("Book 2")); + Assert.That(foundDocs.Next()); + Assert.That(foundDocs.Current["title"], Is.EqualTo("Book 3")); + Assert.That(foundDocs.Next(), Is.False); + } + + [Test] + public void BindJsonAsString() + { + Collection coll = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + Result r = ExecuteAddStatement(coll.Add(docs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4)); + + var jsonParams = "{ \"pages1\" : 30, \"pages2\" : 40 }"; + var foundDocs = ExecuteFindStatement(coll.Find("pages = :Pages1 || pages = :Pages2").Bind(jsonParams)); + Assert.That(foundDocs.Next()); + Assert.That(foundDocs.Current["title"], Is.EqualTo("Book 2")); + Assert.That(foundDocs.Next()); + Assert.That(foundDocs.Current["title"], Is.EqualTo("Book 3")); + Assert.That(foundDocs.Next(), Is.False); + } + + [Test] + public void RowLockingNotSupportedInOlderVersions() + { + Assume.That(!session.Version.isAtLeast(8, 0, 3), "This test is for MySql lower than 8.0.3."); + Collection coll = CreateCollection("test"); + + Exception ex = Assert.Throws(() => ExecuteFindStatement(coll.Find().LockShared())); + Assert.That(ex.Message, Is.EqualTo("This functionality is only supported from server version 8.0.3 onwards")); + + ex = Assert.Throws(() => ExecuteFindStatement(coll.Find().LockExclusive())); + Assert.That(ex.Message, Is.EqualTo("This functionality is only supported from server version 8.0.3 onwards")); + } + + [Test] + public void SimpleSharedLock() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + ExecuteSQLStatement(session.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + ExecuteSQLStatement(session2.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + Collection coll = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, a = 1 }, + new { _id = 2, a = 1 }, + new { _id = 3, a = 1 }, + }; + ExecuteAddStatement(coll.Add(docs)); + Collection coll2 = session2.GetSchema("test").GetCollection("test"); + + ExecuteSQLStatement(session.SQL("START TRANSACTION")); + var docResult = ExecuteFindStatement(coll.Find("_id = 1").LockShared()); + Assert.That(docResult.FetchAll(), Has.One.Items); + + ExecuteSQLStatement(session2.SQL("START TRANSACTION")); + // Should return immediately since document isn't locked. + docResult = ExecuteFindStatement(coll2.Find("_id = 2").LockShared()); + Assert.That(docResult.FetchAll(), Has.One.Items); + // Should return immediately due to LockShared() allows reading by other sessions. + docResult = ExecuteFindStatement(coll2.Find("_id = 1").LockShared()); + Assert.That(docResult.FetchAll(), Has.One.Items); + + ExecuteSQLStatement(session.SQL("ROLLBACK")); + ExecuteSQLStatement(session2.SQL("ROLLBACK")); + } + } + + [Test] + public void SharedLockForbidsToModifyDocuments() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + ExecuteSQLStatement(session.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + ExecuteSQLStatement(session2.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + Collection coll = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, a = 1 }, + new { _id = 2, a = 1 }, + new { _id = 3, a = 1 }, + }; + ExecuteAddStatement(coll.Add(docs)); + Collection coll2 = session2.GetSchema("test").GetCollection("test"); + + ExecuteSQLStatement(session.SQL("START TRANSACTION")); + var docResult = ExecuteFindStatement(coll.Find("_id = 1").LockShared()); + Assert.That(docResult.FetchAll(), Has.One.Items); + + ExecuteSQLStatement(session2.SQL("START TRANSACTION")); + // Reading the same document is allowed with LockShared(). + docResult = ExecuteFindStatement(coll2.Find("_id = 1")); + Assert.That(docResult.FetchAll(), Has.One.Items); + + // Modify() is allowed for non-locked documents. + Result result = ExecuteModifyStatement(coll2.Modify("_id = 2").Set("a", 2)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + // Session1 blocks, Modify() is not allowed for locked documents. + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + Exception ex = Assert.Throws(() => ExecuteModifyStatement(coll2.Modify("_id = 1").Set("a", 2))); + Assert.That(ex.Message, Is.EqualTo("Lock wait timeout exceeded; try restarting transaction")); + + ExecuteSQLStatement(session.SQL("ROLLBACK")); + // Modify() is allowed since document isn't locked anymore. + ExecuteModifyStatement(coll2.Modify("_id = 1").Set("a", 2)); + ExecuteSQLStatement(session2.SQL("COMMIT")); + } + } + + [Test] + public void ExclusiveLockForbidsToModifyDocuments() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + ExecuteSQLStatement(session.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + ExecuteSQLStatement(session2.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + Collection coll = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, a = 1 }, + new { _id = 2, a = 1 }, + new { _id = 3, a = 1 }, + }; + ExecuteAddStatement(coll.Add(docs)); + Collection coll2 = session2.GetSchema("test").GetCollection("test"); + + ExecuteSQLStatement(session.SQL("START TRANSACTION")); + var docResult = ExecuteFindStatement(coll.Find("_id = 1").LockExclusive()); + Assert.That(docResult.FetchAll(), Has.One.Items); + + ExecuteSQLStatement(session2.SQL("START TRANSACTION")); + + // Modify() is allowed for non-locked documents. + Result result = ExecuteModifyStatement(coll2.Modify("_id = 2").Set("a", 2)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + // Session2 blocks, Modify() is not allowed for locked documents. + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + Exception ex = Assert.Throws(() => ExecuteModifyStatement(coll2.Modify("_id = 1").Set("a", 2))); + Assert.That(ex.Message, Is.EqualTo("Lock wait timeout exceeded; try restarting transaction")); + ex = Assert.Throws(() => ExecuteModifyStatement(coll2.Modify("_id = 1").Change("a", 12))); + Assert.That(ex.Message, Is.EqualTo("Lock wait timeout exceeded; try restarting transaction")); + + ExecuteSQLStatement(session.SQL("ROLLBACK")); + // Modify() is allowed since document isn't locked anymore. + ExecuteModifyStatement(coll2.Modify("_id = 1").Set("a", 2)); + ExecuteSQLStatement(session2.SQL("COMMIT")); + } + } + + [Test] + public void SharedLockAfterExclusiveLock() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + ExecuteSQLStatement(session.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + ExecuteSQLStatement(session2.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + Collection coll = CreateCollection("test"); + ExecuteSQLStatement(session2.SQL("ALTER TABLE `test`.`test` ADD COLUMN `$ix_i_r_index` INT GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(doc, '$._id'))) VIRTUAL NOT NULL, ADD UNIQUE INDEX `myIndex`(`$ix_i_r_index`)")); + var docs = new[] + { + new { _id = 1, a = 1 }, + new { _id = 2, a = 1 }, + new { _id = 3, a = 1 }, + }; + ExecuteAddStatement(coll.Add(docs)); + Collection coll2 = session2.GetSchema("test").GetCollection("test"); + + ExecuteSQLStatement(session.SQL("START TRANSACTION")); + var docResult = ExecuteFindStatement(coll.Find("_id = 1").LockExclusive()); + Assert.That(docResult.FetchAll(), Has.One.Items); + + ExecuteSQLStatement(session2.SQL("START TRANSACTION")); + // Should return immediately since document isn't locked. + docResult = ExecuteFindStatement(coll2.Find("_id = 2").LockShared()); + Assert.That(docResult.FetchAll(), Has.One.Items); + // Session2 blocks due to LockExclusive() not allowing to read locked documents. + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + Exception ex = Assert.Throws(() => ExecuteFindStatement(coll2.Find("_id = 1").LockShared())); + Assert.That(ex.Message, Is.EqualTo("Lock wait timeout exceeded; try restarting transaction")); + + // Session unlocks documents. + ExecuteSQLStatement(session.SQL("ROLLBACK")); + // Document can now be recovered. + docResult = ExecuteFindStatement(coll2.Find("_id = 1").LockShared()); + Assert.That(docResult.FetchAll(), Has.One.Items); + ExecuteSQLStatement(session2.SQL("ROLLBACK")); + } + } + + [Test] + public void ExclusiveLockAfterSharedLock() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + ExecuteSQLStatement(session.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + ExecuteSQLStatement(session2.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + Collection coll = CreateCollection("test"); + ExecuteSQLStatement(session2.SQL("ALTER TABLE `test`.`test` ADD COLUMN `$ix_i_r_index` INT GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(doc, '$._id'))) VIRTUAL NOT NULL, ADD UNIQUE INDEX `myIndex`(`$ix_i_r_index`)")); + var docs = new[] + { + new { _id = 1, a = 1 }, + new { _id = 2, a = 1 }, + new { _id = 3, a = 1 }, + }; + ExecuteAddStatement(coll.Add(docs)); + Collection coll2 = session2.GetSchema("test").GetCollection("test"); + + ExecuteSQLStatement(session.SQL("START TRANSACTION")); + var docResult = ExecuteFindStatement(coll.Find("_id in (1, 3)").LockShared()); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(2)); + + ExecuteSQLStatement(session2.SQL("START TRANSACTION")); + // Should return immediately since document isn't locked. + docResult = ExecuteFindStatement(coll2.Find("_id = 2").LockExclusive()); + // Should return immediately due to LockShared() allows reading by other sessions. + docResult = ExecuteFindStatement(coll2.Find("_id = 2").LockShared()); + Assert.That(docResult.FetchAll(), Has.One.Items); + // Session2 blocks due to to LockExclusive() not allowing to read locked documents. + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + Exception ex = Assert.Throws(() => ExecuteFindStatement(coll2.Find("_id = 1").LockExclusive())); + Assert.That(ex.Message, Is.EqualTo("Lock wait timeout exceeded; try restarting transaction")); + + // Session unlocks documents. + ExecuteSQLStatement(session.SQL("ROLLBACK")); + docResult = ExecuteFindStatement(coll2.Find("_id = 1").LockExclusive()); + Assert.That(docResult.FetchAll(), Has.One.Items); + ExecuteSQLStatement(session2.SQL("ROLLBACK")); + } + } + + [Test] + public void ExclusiveLockAfterExclusiveLock() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + ExecuteSQLStatement(session.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + ExecuteSQLStatement(session2.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + Collection coll = CreateCollection("test"); + ExecuteSQLStatement(session2.SQL("ALTER TABLE `test`.`test` ADD COLUMN `$ix_i_r_index` INT GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(doc, '$._id'))) VIRTUAL NOT NULL, ADD UNIQUE INDEX `myIndex`(`$ix_i_r_index`)")); + var docs = new[] + { + new { _id = 1, a = 1 }, + new { _id = 2, a = 1 }, + new { _id = 3, a = 1 } + }; + ExecuteAddStatement(coll.Add(docs)); + Collection coll2 = session2.GetSchema("test").GetCollection("test"); + + ExecuteSQLStatement(session.SQL("START TRANSACTION")); + var docResult = ExecuteFindStatement(coll.Find("_id = 1").LockExclusive()); + Assert.That(docResult.FetchAll(), Has.One.Items); + + ExecuteSQLStatement(session2.SQL("START TRANSACTION")); + // Should return immediately since document isn't locked. + docResult = ExecuteFindStatement(coll2.Find("_id = 2").LockExclusive()); + Assert.That(docResult.FetchAll(), Has.One.Items); + // Session2 blocks due to to LockExclusive() not allowing to read locked documents. + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + Exception ex = Assert.Throws(() => ExecuteFindStatement(coll2.Find("_id = 1").LockExclusive())); + Assert.That(ex.Message, Is.EqualTo("Lock wait timeout exceeded; try restarting transaction")); + + // Session unlocks documents. + ExecuteSQLStatement(session.SQL("ROLLBACK")); + docResult = ExecuteFindStatement(coll2.Find("_id = 1").LockExclusive()); + Assert.That(docResult.FetchAll(), Has.One.Items); + ExecuteSQLStatement(session2.SQL("ROLLBACK")); + } + } + + [Test] + public void InOperatorWithListOfValues() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + // Validates the IN operator allows expressions of the type + // ( compExpr ["NOT"] "IN" "(" argsList ")" ) | ( compExpr ["NOT"] "IN" "[" argsList "]" ) + Collection coll = CreateCollection("test"); + ExecuteAddStatement(coll.Add(new DbDoc("{ \"a\": 1, \"b\": [ 1, \"value\" ], \"d\":\"\" }"))); + + Assert.That(ExecuteFindStatement(coll.Find("a IN (1,2,3)")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(coll.Find("a not in (0,2,3)")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(coll.Find("b[0] in (1,2,3)")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(coll.Find("b[1] in (\"a\", \"b\", \"value\")")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(coll.Find("b[0] NOT IN (0,2,3)")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(coll.Find("b[1] not in (\"a\", \"b\", \"c\")")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(coll.Find("a in [1,2,3]")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(coll.Find("a in [2,3,4]")).FetchAll(), Is.Empty); + Assert.That(ExecuteFindStatement(coll.Find("a NOT in [0,2,3]")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(coll.Find("b not IN [1,2,3]")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(coll.Find("b[0] not IN [1,2,3]")).FetchAll(), Is.Empty); + Assert.That(ExecuteFindStatement(coll.Find("c NOT IN [1,2,3]")).FetchAll(), Is.Empty); + Assert.That(ExecuteFindStatement(coll.Find("a IN ('', ' ')")).FetchAll(), Is.Empty); + Assert.That(ExecuteFindStatement(coll.Find("'' IN (1,2,3)")).FetchAll(), Is.Empty); + Assert.That(ExecuteFindStatement(coll.Find("d IN ('')")).FetchAll(), Has.One.Items); + + Collection movies = CreateCollection("movies"); + var docString = "{ \"_id\" : \"a6f4b93e1a264a108393524f29546a8c\", \"title\" : \"AFRICAN EGG\", \"description\" : \"A Fast-Paced Documentary of a Pastry Chef And a Dentist who must Pursue a Forensic Psychologist in The Gulf of Mexico\", \"releaseyear\" : 2006, \"language\" : \"English\", \"duration\" : 130, \"rating\" : \"G\", \"genre\" : \"Science fiction\", \"actors\" : [{ \"name\" : \"MILLA PECK\", \"country\" : \"Mexico\", \"birthdate\": \"12 Jan 1984\"}, { \"name\" : \"VAL BOLGER\", \"country\" : \"Botswana\", \"birthdate\": \"26 Jul 1975\" }, { \"name\" : \"SCARLETT BENING\", \"country\" : \"Syria\", \"birthdate\": \"16 Mar 1978\" }], \"additionalinfo\" : { \"director\" : \"Sharice Legaspi\", \"writers\" : [\"Rusty Couturier\", \"Angelic Orduno\", \"Carin Postell\"], \"productioncompanies\" : [\"Qvodrill\", \"Indigoholdings\"] } }"; + ExecuteAddStatement(movies.Add(new DbDoc(docString))); + + Assert.That(ExecuteFindStatement(movies.Find("(1>5) in (true, false)")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(movies.Find("(1+5) in (1, 2, 3, 4, 5)")).FetchAll(), Is.Empty); + Assert.That(ExecuteFindStatement(movies.Find("('a'>'b') in (true, false)")).FetchAll(), Has.One.Items); + Assert.Throws(() => ExecuteFindStatement(movies.Find("(1>5) in [true, false]")).FetchAll()); + Assert.Throws(() => ExecuteFindStatement(movies.Find("(1+5) in [1, 2, 3, 4, 5]")).FetchAll()); + Assert.Throws(() => ExecuteFindStatement(movies.Find("('a'>'b') in [true, false]")).FetchAll()); + Assert.That(ExecuteFindStatement(movies.Find("true IN [(1>5), !(false), (true || false), (false && true)]")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(movies.Find("true IN ((1>5), !(false), (true || false), (false && true))")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(movies.Find("{\"field\":true} IN (\"mystring\", 124, myvar, othervar.jsonobj)")).FetchAll(), Is.Empty); + Assert.That(ExecuteFindStatement(movies.Find("actor.name IN ['a name', null, (1<5-4), myvar.jsonobj.name]")).FetchAll(), Is.Empty); + Assert.That(ExecuteFindStatement(movies.Find("!false && true IN [true]")).FetchAll(), Has.One.Items); + Assert.Throws(() => ExecuteFindStatement(movies.Find("1-5/2*2 > 3-2/1*2 IN [true, false]")).FetchAll()); + Assert.That(ExecuteFindStatement(movies.Find("true IN [1-5/2*2 > 3-2/1*2]")).FetchAll(), Is.Empty); + Assert.That(ExecuteFindStatement(movies.Find(" 'African Egg' IN ('African Egg', 1, true, NULL, [0,1,2], { 'title' : 'Atomic Firefighter' }) ")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(movies.Find(" 1 IN ('African Egg', 1, true, NULL, [0,1,2], { 'title' : 'Atomic Firefighter' }) ")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(movies.Find(" [0,1,2] IN ('African Egg', 1, true, NULL, [0,1,2], { 'title' : 'Atomic Firefighter' }) ")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(movies.Find(" { 'title' : 'Atomic Firefighter' } IN ('African Egg', 1, true, NULL, [0,1,2], { 'title' : 'Atomic Firefighter' }) ")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(movies.Find("title IN ('African Egg', 'The Witcher', 'Jurassic Perk')")).FetchAll(), Is.Empty); + Assert.That(ExecuteFindStatement(movies.Find("releaseyear IN (2006, 2010, 2017)")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(movies.Find("1 IN [1,2,3]")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(movies.Find("0 IN [1,2,3]")).FetchAll(), Is.Empty); + Assert.That(ExecuteFindStatement(movies.Find("0 NOT IN [1,2,3]")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(movies.Find("1 NOT IN [1,2,3]")).FetchAll(), Is.Empty); + Assert.That(ExecuteFindStatement(movies.Find("releaseyear IN [2006, 2007, 2008]")).FetchAll(), Has.One.Items); + } + + [Test] + public void InOperatorWithCompExpr() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + // Validates the IN operator allows expressions of the type: compExpr ["NOT"] "IN" compExpr + Collection coll = CreateCollection("test"); + var docString = "{ \"a\": 1, \"b\": \"foo\", \"c\": { \"d\": true, \"e\": [1,2,3] }, \"f\": [ {\"x\":5}, {\"x\":7 } ] }"; + ExecuteAddStatement(coll.Add(new DbDoc(docString))); + + Assert.That(ExecuteFindStatement(coll.Find("a in [1,2,3]")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(coll.Find("c.e[0] in [1,2,3]")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(coll.Find("5 in f[*].x")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(coll.Find("3 in c.e")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(coll.Find("5 in c.e")).FetchAll(), Is.Empty); + Assert.That(ExecuteFindStatement(coll.Find("\"foo\" in " + docString)).FetchAll(), Is.Empty); + Assert.That(ExecuteFindStatement(coll.Find("\"a\" in " + docString)).FetchAll(), Is.Empty); + Assert.That(ExecuteFindStatement(coll.Find("a in " + docString)).FetchAll(), Is.Empty); + Assert.That(ExecuteFindStatement(coll.Find("{\"a\":1} in " + docString)).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(coll.Find("\"foo\" in b")).FetchAll(), Has.One.Items); + + Collection movies = CreateCollection("movies"); + docString = "{ \"_id\" : \"a6f4b93e1a264a108393524f29546a8c\", \"title\" : \"AFRICAN EGG\", \"description\" : \"A Fast-Paced Documentary of a Pastry Chef And a Dentist who must Pursue a Forensic Psychologist in The Gulf of Mexico\", \"releaseyear\" : 2006, \"language\" : \"English\", \"duration\" : 130, \"rating\" : \"G\", \"genre\" : \"Science fiction\", \"actors\" : [{ \"name\" : \"MILLA PECK\", \"country\" : \"Mexico\", \"birthdate\": \"12 Jan 1984\"}, { \"name\" : \"VAL BOLGER\", \"country\" : \"Botswana\", \"birthdate\": \"26 Jul 1975\" }, { \"name\" : \"SCARLETT BENING\", \"country\" : \"Syria\", \"birthdate\": \"16 Mar 1978\" }], \"additionalinfo\" : { \"director\" : \"Sharice Legaspi\", \"writers\" : [\"Rusty Couturier\", \"Angelic Orduno\", \"Carin Postell\"], \"productioncompanies\" : [\"Qvodrill\", \"Indigoholdings\"] } }"; + ExecuteAddStatement(movies.Add(new DbDoc(docString))); + + Assert.That(ExecuteFindStatement(movies.Find("{ \"name\" : \"MILLA PECK\" } IN actors")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(movies.Find("'African Egg' in movietitle")).FetchAll(), Is.Empty); + Assert.Throws(() => ExecuteFindStatement(movies.Find("(1 = NULL) IN title")).FetchAll()); + Assert.Throws(() => ExecuteFindStatement(movies.Find("NOT NULL IN title")).FetchAll()); + Assert.That(ExecuteFindStatement(movies.Find("[\"Rusty Couturier\", \"Angelic Orduno\", \"Carin Postell\"] IN additionalinfo.writers")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(movies.Find("{ \"name\" : \"MILLA PECK\", \"country\" : \"Mexico\", \"birthdate\": \"12 Jan 1984\"} IN actors")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(movies.Find("true IN title")).FetchAll(), Is.Empty); + Assert.That(ExecuteFindStatement(movies.Find("false IN genre")).FetchAll(), Is.Empty); + Assert.That(ExecuteFindStatement(movies.Find("'Sharice Legaspi' IN additionalinfo.director")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(movies.Find("'Mexico' IN actors[*].country")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(movies.Find("'Angelic Orduno' IN additionalinfo.writers")).FetchAll(), Has.One.Items); + } + + [Test] + public void InOperatorWithJsonArrays() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + Collection coll = CreateCollection("test"); + var docString = "{ \"_id\": \"1001\", \"ARR\":[1,2,3], \"ARR1\":[\"name\", \"name2\", \"name3\"]}"; + ExecuteAddStatement(coll.Add(new DbDoc(docString))); + + Assert.That(ExecuteFindStatement(coll.Find("\"1001\" in $._id")).FetchAll(), Has.One.Items); + Assert.That(ExecuteFindStatement(coll.Find("\"1002\" in $._id")).FetchAll(), Is.Empty); + Assert.That(ExecuteFindStatement(coll.Find("(1+2) in (1, 2, 3)")).FetchAll(), Has.One.Items); + Assert.Throws(() => ExecuteFindStatement(coll.Find("(1+2) in [1, 2, 3]")).FetchAll()); + Assert.Throws(() => ExecuteFindStatement(coll.Find("(1+2) in $.ARR")).FetchAll()); + } + + [Test] + public void GetOne() + { + Collection coll = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + Result r = ExecuteAddStatement(coll.Add(docs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4)); + + // Expected exceptions. + Assert.Throws(() => coll.GetOne(null)); + Assert.Throws(() => coll.GetOne("")); + Assert.Throws(() => coll.GetOne(string.Empty)); + + // Get document using numeric parameter. + DbDoc document = coll.GetOne(1); + Assert.That(document.Id, Is.EqualTo(1)); + Assert.That(document["title"], Is.EqualTo("Book 1")); + Assert.That(Convert.ToInt32(document["pages"]), Is.EqualTo(20)); + + // Get document using string parameter. + document = coll.GetOne("3"); + Assert.That(document.Id, Is.EqualTo(3)); + Assert.That(document["title"], Is.EqualTo("Book 3")); + Assert.That(Convert.ToInt32(document["pages"]), Is.EqualTo(40)); + + // Get a non-existing document. + document = coll.GetOne(5); + Assert.That(document, Is.Null); + } + + public enum LockMode { Exclusive, Shared } + + [TestCase(LockContention.Default, LockMode.Exclusive)] + [TestCase(LockContention.NoWait, LockMode.Exclusive)] + [TestCase(LockContention.SkipLocked, LockMode.Exclusive)] + [TestCase(LockContention.Default, LockMode.Shared)] + [TestCase(LockContention.NoWait, LockMode.Shared)] + [TestCase(LockContention.SkipLocked, LockMode.Shared)] + public void LockExclusiveAndSharedWithWaitingOptions(LockContention lockOption, LockMode lockMode) + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + string collectionName = "test"; + var coll = CreateCollection(collectionName); + ExecuteAddStatement(coll.Add(new { _id = 1, name = "Jonh" })); + + // first session locks the row + using (Session s1 = MySQLX.GetSession(ConnectionString)) + { + var coll1 = s1.GetSchema(schemaName).GetCollection(collectionName); + s1.StartTransaction(); + var r1 = ExecuteFindStatement(coll1.Find("_id = :id").Bind("id", 1).LockExclusive()); + Assert.That(r1.FetchAll(), Has.One.Items); + + // second session tries to read the locked row + using (Session s2 = MySQLX.GetSession(ConnectionString)) + { + var coll2 = s2.GetSchema(schemaName).GetCollection(collectionName); + ExecuteSQLStatement(s2.SQL("SET innodb_lock_wait_timeout = 1")); + s2.StartTransaction(); + var stmt2 = coll2.Find("_id = :id").Bind("id", 1); + if (lockMode == LockMode.Exclusive) + stmt2.LockExclusive(lockOption); + else + stmt2.LockShared(lockOption); + + switch (lockOption) + { + case LockContention.Default: + // error 1205 Lock wait timeout exceeded; try restarting transaction + Assert.That(Assert.Throws(() => ExecuteFindStatement(stmt2).FetchAll()).Code, Is.EqualTo(1205u)); + break; + case LockContention.NoWait: + // error 1205 Lock wait timeout exceeded; try restarting transaction + uint expectedError = 1205; + if (session.XSession.GetServerVersion().isAtLeast(8, 0, 5)) + // error 3572 Statement aborted because lock(s) could not be acquired immediately and NOWAIT is set + expectedError = 3572; + Assert.That(Assert.Throws(() => ExecuteFindStatement(stmt2).FetchAll()).Code, Is.EqualTo(expectedError)); + break; + case LockContention.SkipLocked: + if (!session.XSession.GetServerVersion().isAtLeast(8, 0, 5)) + { + // error 1205 Lock wait timeout exceeded; try restarting transaction + Assert.That(Assert.Throws(() => ExecuteFindStatement(stmt2).FetchAll()).Code, Is.EqualTo(1205u)); + break; + } + Assert.That(ExecuteFindStatement(stmt2).FetchAll(), Is.Empty); + break; + default: + throw new NotImplementedException(lockOption.ToString()); + } + } + // first session frees the lock + s1.Commit(); + } + } + + [Test] + public void Grouping() + { + ExecuteSQLStatement(GetSession().SQL("SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode, 'ONLY_FULL_GROUP_BY', '')); ")); + Collection collection = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, name = "jonh doe", age = 38 }, + new { _id = 2, name = "milton green", age = 45 }, + new { _id = 3, name = "larry smith", age = 24}, + new { _id = 4, name = "mary weinstein", age = 24 }, + new { _id = 5, name = "jerry pratt", age = 45 }, + new { _id = 6, name = "hugh jackman", age = 20}, + new { _id = 7, name = "elizabeth olsen", age = 31} + }; + Result r = ExecuteAddStatement(collection.Add(docs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(7)); + + // GroupBy operation. + // GroupBy returns 5 rows since age 45 and 24 is repeated. + var result = ExecuteFindStatement(collection.Find().Fields("_id as ID", "name as Name", "age as Age").GroupBy("age")); + Assert.That(result.FetchAll().Count, Is.EqualTo(5)); + + // GroupBy with null. + result = ExecuteFindStatement(collection.Find().Fields("_id as ID", "name as Name", "age as Age").GroupBy(null)); + Assert.That(result.FetchAll().Count, Is.EqualTo(7)); + result = ExecuteFindStatement(collection.Find().Fields("_id as ID", "name as Name", "age as Age").GroupBy(null, null)); + Assert.That(result.FetchAll().Count, Is.EqualTo(7)); + result = ExecuteFindStatement(collection.Find().Fields("_id as ID", "name as Name", "age as Age").GroupBy(null, "age")); + Assert.That(result.FetchAll().Count, Is.EqualTo(5)); + + // Having operation. + // Having reduces the original 5 rows to 3 since 2 rows have a cnt=2, due to the repeated names. + result = ExecuteFindStatement(collection.Find().Fields("_id as ID", "count(name) as cnt", "age as Age").GroupBy("age").Having("cnt = 1")); + Assert.That(result.FetchAll().Count, Is.EqualTo(3)); + + // Having with null. + result = ExecuteFindStatement(collection.Find().Fields("_id as ID", "count(name) as cnt", "age as Age").GroupBy("age").Having(null)); + Assert.That(result.FetchAll().Count, Is.EqualTo(5)); + + // GroupBy with invalid field name. + var ex = Assert.Throws(() => ExecuteFindStatement(collection.Find().Fields("_id as ID", "name as Name", "age as Age").GroupBy("none"))); + Assert.That(ex.Message, Is.EqualTo("Unknown column 'none' in 'group statement'")); + + // GroupBy with empty strings. + var ex2 = Assert.Throws(() => ExecuteFindStatement(collection.Find().Fields("_id as ID", "name as Name", "age as Age").GroupBy(""))); + Assert.That(ex2.Message, Is.EqualTo("No more tokens when expecting one at token pos 0")); + ex2 = Assert.Throws(() => ExecuteFindStatement(collection.Find().Fields("_id as ID", "name as Name", "age as Age").GroupBy(" "))); + Assert.That(ex2.Message, Is.EqualTo("No more tokens when expecting one at token pos 0")); + ex2 = Assert.Throws(() => ExecuteFindStatement(collection.Find().Fields("_id as ID", "name as Name", "age as Age").GroupBy(string.Empty))); + Assert.That(ex2.Message, Is.EqualTo("No more tokens when expecting one at token pos 0")); + + // Having with invalid field name. + ex = Assert.Throws(() => ExecuteFindStatement(collection.Find().Fields("_id as ID", "count(name) as cnt", "age as Age").GroupBy("age").Having("none = 1"))); + Assert.That(ex.Message, Is.EqualTo("Invalid expression in grouping criteria")); + + // Having with empty strings. + ex2 = Assert.Throws(() => ExecuteFindStatement(collection.Find().Fields("_id as ID", "count(name) as cnt", "age as Age").GroupBy("age").Having(""))); + Assert.That(ex2.Message, Is.EqualTo("Unable to parse query ''")); + Assert.That(ex2.InnerException.Message, Is.EqualTo("No more tokens when expecting one at token pos 0")); + ex2 = Assert.Throws(() => ExecuteFindStatement(collection.Find().Fields("_id as ID", "count(name) as cnt", "age as Age").GroupBy("age").Having(" "))); + Assert.That(ex2.Message, Is.EqualTo("Unable to parse query ' '")); + Assert.That(ex2.InnerException.Message, Is.EqualTo("No more tokens when expecting one at token pos 0")); + ex2 = Assert.Throws(() => ExecuteFindStatement(collection.Find().Fields("_id as ID", "count(name) as cnt", "age as Age").GroupBy("age").Having(string.Empty))); + Assert.That(ex2.Message, Is.EqualTo("Unable to parse query ''")); + Assert.That(ex2.InnerException.Message, Is.EqualTo("No more tokens when expecting one at token pos 0")); + } + + [Test] + public void Fields() + { + Collection coll = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + Result r = ExecuteAddStatement(coll.Add(docs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4ul)); + + // Single field. + var result = ExecuteFindStatement(coll.Find("pages = :Pages").Bind("pAges", 40).Fields("title")); + var document = result.FetchOne(); + Assert.That(document.values, Has.One.Items); + Assert.That(document["title"], Is.EqualTo("Book 3")); + + // Null values are ignored. + result = ExecuteFindStatement(coll.Find("pages = :Pages").Bind("pAges", 40).Fields(null)); + document = result.FetchOne(); + Assert.That(document.values.Count, Is.EqualTo(3)); + + // Null values are ignored. + result = ExecuteFindStatement(coll.Find("pages = :Pages").Bind("pAges", 40).Fields("title", null)); + document = result.FetchOne(); + Assert.That(document.values, Has.One.Items); + + // Single field in array. + result = ExecuteFindStatement(coll.Find("pages = :Pages").Bind("pAges", 40).Fields(new string[] { "title" })); + document = result.FetchOne(); + Assert.That(document.values, Has.One.Items); + Assert.That(document["title"], Is.EqualTo("Book 3")); + + // Single field with alias. + result = ExecuteFindStatement(coll.Find("pages = :Pages").Bind("pages", 20).Fields("title as title2")); + document = result.FetchOne(); + Assert.That(document.values, Has.One.Items); + Assert.That(document["title2"], Is.EqualTo("Book 1")); + Assert.That(document.values.ContainsKey("title"), Is.False); + + // Unexistent field returns null. + result = ExecuteFindStatement(coll.Find("pages = :Pages").Bind("pages", 20).Fields("book")); + document = result.FetchOne(); + Assert.That(document.values, Has.One.Items); + Assert.That(document["book"], Is.Null); + + // Unexistent field with alias returns null. + result = ExecuteFindStatement(coll.Find("pages = :Pages").Bind("pages", 20).Fields("book as book1")); + document = result.FetchOne(); + Assert.That(document.values, Has.One.Items); + Assert.That(document["book1"], Is.Null); + + // Multiple fields. + result = ExecuteFindStatement(coll.Find("pages = :Pages").Bind("pAges", 40).Fields("title", "pages", "other")); + document = result.FetchOne(); + Assert.That(document.values.Count, Is.EqualTo(3)); + Assert.That(document["title"], Is.EqualTo("Book 3")); + Assert.That(document["pages"], Is.EqualTo(40)); + Assert.That(document["other"], Is.Null); + + // Multiple fields in array. + result = ExecuteFindStatement(coll.Find("pages = :Pages").Bind("pAges", 40).Fields(new string[] { "title", "pages" })); + document = result.FetchOne(); + Assert.That(document.values.Count, Is.EqualTo(2)); + Assert.That(document["title"], Is.EqualTo("Book 3")); + Assert.That(document["pages"], Is.EqualTo(40)); + + // Sending a document doesn't generate an error. + result = ExecuteFindStatement(coll.Find("pages = :Pages").Bind("pages", 20).Fields("{\"_id\":\"1004\",\"F1\": 1234 }")); + document = result.FetchOne(); + + // Empty string and white space raises error. + var ex = Assert.Throws(() => ExecuteFindStatement(coll.Find("pages = :Pages").Bind("pAges", 40).Fields(""))); + Assert.That(ex.Message, Is.EqualTo("No more tokens when expecting one at token pos 0")); + ex = Assert.Throws(() => ExecuteFindStatement(coll.Find("pages = :Pages").Bind("pAges", 40).Fields(" "))); + Assert.That(ex.Message, Is.EqualTo("No more tokens when expecting one at token pos 0")); + ex = Assert.Throws(() => ExecuteFindStatement(coll.Find("pages = :Pages").Bind("pAges", 40).Fields(string.Empty))); + Assert.That(ex.Message, Is.EqualTo("No more tokens when expecting one at token pos 0")); + + // Multiple word field name raises error. + ex = Assert.Throws(() => result = ExecuteFindStatement(coll.Find("pages = :Pages").Bind("pAges", 40).Fields("Book 1"))); + Assert.That(ex.Message, Is.EqualTo("Expression has unexpected token '1' at position 1.")); + } + + [TestCase("", "")] + [TestCase("'", "'")] + [TestCase("", "'")] + [TestCase("'", "")] + public void FindIdAsString(string prefix, string suffix) + { + Collection coll = CreateCollection("test"); + Result r = null; + var docs = new[] + { + new { _id = $"{prefix}1{suffix}", title = $"{prefix}Book 1{suffix}", pages = 20 }, + new { _id = $"{prefix}2{suffix}", title = $"{prefix}Book 2{suffix}", pages = 30 }, + new { _id = $"{prefix}3{suffix}", title = $"{prefix}Book 3{suffix}", pages = 40 }, + new { _id = $"{prefix}4{suffix}", title = $"{prefix}Book 4{suffix}", pages = 50 }, + }; + r = coll.Add(docs).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4)); + + var findStmt = coll.Find("_id = :id and pages = :pages").Bind("id", $"{prefix}3{suffix}").Bind("pages", 40); + var doc = ExecuteFindStatement(findStmt); + var books = doc.FetchAll(); + Assert.That(books, Has.One.Items); + Assert.That(books[0]["_id"], Is.EqualTo($"{prefix}3{suffix}")); + + findStmt = coll.Find("_id = :id and pages = :pages").Bind("Id", $"{prefix}2{suffix}").Bind("Pages", 30); + doc = ExecuteFindStatement(findStmt); + books = doc.FetchAll(); + Assert.That(books, Has.One.Items); + Assert.That(books[0]["_id"], Is.EqualTo($"{prefix}2{suffix}")); + + findStmt = coll.Find("title = :title").Bind("Title", $"{prefix}Book 4{suffix}"); + doc = ExecuteFindStatement(findStmt); + books = doc.FetchAll(); + Assert.That(books, Has.One.Items); + Assert.That(books[0]["_id"], Is.EqualTo($"{prefix}4{suffix}")); + Assert.That(books[0]["pages"], Is.EqualTo(50)); + } + + [TestCase(":hobbies IN $.additionalinfo.hobbies", "hobbies", "painting", 4)] + [TestCase(":hobbies IN $.additionalinfo.hobbies", "hobbies", "[\"playing\", \"listening\"]", 0)] + [TestCase("[\"playing\", \"listening\"] IN $.additionalinfo.hobbies", null, null, 3)] + public void InOperatorBindingJson(string condition, string bind, string value, int id) + { + Collection coll = CreateCollection("test"); + Result r = null; + var docs = new[] + { + new { _id = 1, title = $"Book 1", pages = 20, additionalinfo = new DbDoc("{\"company\":\"xyz\",\"vehicle\":\"bike\",\"hobbies\":\"reading\"}") }, + new { _id = 2, title = $"Book 2", pages = 30, additionalinfo = new DbDoc("{\"company\":\"abc\",\"vehicle\":\"car\",\"hobbies\":\"boxing\"}") }, + new { _id = 3, title = $"Book 3", pages = 40, additionalinfo = new DbDoc("{\"company\":\"qwe\",\"vehicle\":\"airplane\",\"hobbies\":[\"playing\", \"listening\"]}") }, + new { _id = 4, title = $"Book 4", pages = 50, additionalinfo = new DbDoc("{\"company\":\"zxc\",\"vehicle\":\"boat\",\"hobbies\":\"painting\"}") }, + }; + r = coll.Add(docs).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4)); + + var findStmt = coll.Find(condition); + if (bind != null) findStmt.Bind(bind, value); + var result = findStmt.Execute().FetchAll(); + Assert.That(result.Count, Is.EqualTo(id == 0 ? 0 : 1)); + if (id > 0) + { + Assert.That(result[0]["_id"], Is.EqualTo(id)); + } + } + + [Test] + public void FindUsingOverlaps() + { + Collection coll = CreateCollection("test"); + + coll.Add("{ \"_id\":1, \"title\": \"Book 1\", \"list\":[1, 4]}").Execute(); + coll.Add("{ \"_id\":2, \"title\": \"Book 2\", \"list\":[5, 7]}").Execute(); + coll.Add("{ \"_id\":3, \"title\": \"Book 3\", \"list\":[4, 9]}").Execute(); + coll.Add("{ \"_id\":4, \"title\": \"Book 4\", \"list\":[2]}").Execute(); + coll.Add("{ \"_id\":5, \"title\": \"Book 5\",\"list\":[\"\"]}").Execute(); + coll.Add("{ \"_id\":6, \"title\": \"Book 6\",\"list\":[\" \"]}").Execute(); + + var result = ExecuteFindStatement(coll.Find("[7] OVERLAPS $.list")).FetchAll(); + Assert.That(result[0]["title"], Is.EqualTo("Book 2")); + result = ExecuteFindStatement(coll.Find("[8] overlaps $.list")).FetchAll(); + Assert.That(result, Is.Empty); + result = ExecuteFindStatement(coll.Find("[1, 4] OVERLAPS $.list")).FetchAll(); + Assert.That(result, Is.Not.Empty); + Assert.That(result[0]["title"], Is.EqualTo("Book 1")); + Assert.That(result[1]["title"], Is.EqualTo("Book 3")); + result = ExecuteFindStatement(coll.Find("$.list OVERLAPS [1, 2]")).FetchAll(); + Assert.That(result, Is.Not.Empty); + Assert.That(result[0]["title"], Is.EqualTo("Book 1")); + Assert.That(result[1]["title"], Is.EqualTo("Book 4")); + result = ExecuteFindStatement(coll.Find("'Book 1' NOT OVERLAPS $.title").Fields("_id")).FetchAll(); + Assert.That(result.Count, Is.EqualTo(5)); + Assert.That(result[1].Id, Is.EqualTo(3)); + result = ExecuteFindStatement(coll.Find(":title NOT OVERLAPS $.title").Bind("title", "Book 1").Fields("_id")).FetchAll(); + Assert.That(result.Count, Is.EqualTo(5)); + Assert.That(result[2].Id, Is.EqualTo(4)); + result = ExecuteFindStatement(coll.Find("$.list OVERLAPS :list").Bind("list", 9)).FetchAll(); + Assert.That(result[0]["title"], Is.EqualTo("Book 3")); + var jsonParams = new { list = 4 }; + result = ExecuteFindStatement(coll.Find("$.list OVERLAPS :list").Bind(jsonParams).Fields("count(_id) as ID", "title as Title", "list as List"). + GroupBy("title", "list").Having("ID > 0")).FetchAll(); + Assert.That(result.Count, Is.EqualTo(2)); + Assert.That(result[0]["Title"], Is.EqualTo("Book 1")); + result = ExecuteFindStatement(coll.Find("[''] OVERLAPS $.list")).FetchAll(); + Assert.That(result, Has.One.Items); + Assert.That(result[0].Id, Is.EqualTo(5)); + result = ExecuteFindStatement(coll.Find("[' '] OVERLAPS $.list")).FetchAll(); + Assert.That(result, Has.One.Items); + Assert.That(result[0].Id, Is.EqualTo(6)); + + Assert.Throws(() => ExecuteFindStatement(coll.Find("$.list OVERLAPS -")).FetchAll()); + Assert.Throws(() => ExecuteFindStatement(coll.Find("[2, 9] OVERLAPS")).FetchAll()); + Assert.Throws(() => ExecuteFindStatement(coll.Find("[2, 9] OVERPS $.list")).FetchAll()); + } + + #region WL14389 + + [Test, Description("Collection.Find(condition).GroupBy(SearchExprStr).Having(SearchConditionStr)")] + public void FindGroupByHaving() + { + ExecuteSQLStatement(GetSession().SQL("set sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';")); + + Collection collection = CreateCollection("test"); + var docs1 = new[] + { + new { _id = 1, name = "jonh doe", age = 38,profit = 100,test = 1.92,date="21/11/2011" }, + new { _id = 2, name = "milton green", age = 45,profit = 200,test = 12.08,date="21/11/2012" }, + new { _id = 3, name = "larry smith", age = 24,profit = 300,test = 12.1,date="21/11/2013" }, + new { _id = 4, name = "mary weinstein", age = 24 ,profit = 100,test = 12.0,date="21/11/2014" }, + new { _id = 5, name = "jerry pratt", age = 45 ,profit = 400,test = 20.87,date="21/11/2015" }, + new { _id = 6, name = "hugh jackman", age = 20,profit = 500,test = 20.65,date="21/11/2016"}, + new { _id = 7, name = "elizabeth olsen", age = 31,profit = 300,test = 20.45,date="21/11/2017" }, + new { _id = 8, name = "tommy h", age = 31,profit = 3000,test = 0.0,date="21/11/2018"} + }; + + Result r = collection.Add(docs1).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(8)); + + // GroupBy operation. + // GroupBy returns 5 rows since age 45 and 24 is repeated. + var result = collection.Find().Fields("_id as ID", "name as Name", "age as Age").GroupBy("age").Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(5)); + result = collection.Find().Fields("_id as ID", "name as Name", "profit as Profit", "test as test").GroupBy("test").Having("test=1.92").Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(1)); + result = collection.Find().Fields("max($.age) as age", "max($.profit) as Profit", "max($.test) as test").GroupBy("$.test").Having("max($.age)>=31"). + Sort("profit DESC").Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(result.FetchAll().Count)); + result = collection.Find().Fields("max($.age) as age", "max($.profit) as Profit", "max($.test) as test").GroupBy("$.test").Having("max($.age)>30 && max($.age)<32") + .Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(2)); + result = collection.Find().Fields("max($.age) as age", "max($.profit) as Profit", "max($.test) as test").GroupBy("$.test").Having("max($.age)>300000000") + .Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(0)); + + result = collection.Find().Fields("max($.age) as age", "max($.profit) as Profit", "max($.test) as test").GroupBy("$.test").Having("max($.age)>30"). + Having("max($.age)<32") + .Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(5)); + + result = collection.Find().Fields("max($.age) as age", "max($.profit) as Profit", "max($.test) as test").GroupBy("$.test").Having("max($.age)>30"). + Having("max($.age)<32").Limit(5) + .Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(5)); + + result = collection.Find().Fields("max($.age) as age", "max($.profit) as Profit", "max($.test) as test").GroupBy("$.test").Having("max($.age)>30"). + Having("max($.age)<32").Limit(3) + .Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(3)); + + result = collection.Find().Fields("max($.age) as age", "max($.profit) as Profit", "max($.test) as test").GroupBy("$.test").Having("max($.age)>30"). + Having("max($.age)<32").Limit(3).Offset(2) + .Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(3)); + + Assert.Throws(() => collection.Find().Fields("max($.age) as age", "max($.profit) as Profit", "max($.test) as test").GroupBy("$.test").Having("date=21/11/2011").Execute()); + } + + [Test, Description("Collection.Find().Limit(x).Offset(y)")] + public void FindLimitOffset() + { + ExecuteSQLStatement(GetSession().SQL("set sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';")); + + Collection collection = CreateCollection("test"); + var docs1 = new[] + { + new { _id = 1, name = "jonh doe", age = 38,profit = 100,test = 1.92,date="21/11/2011" }, + new { _id = 2, name = "milton green", age = 45,profit = 200,test = 12.08,date="21/11/2012" }, + new { _id = 3, name = "larry smith", age = 24,profit = 300,test = 12.1,date="21/11/2013" }, + new { _id = 4, name = "mary weinstein", age = 24 ,profit = 100,test = 12.0,date="21/11/2014" }, + new { _id = 5, name = "jerry pratt", age = 45 ,profit = 400,test = 20.87,date="21/11/2015" }, + new { _id = 6, name = "hugh jackman", age = 20,profit = 500,test = 20.65,date="21/11/2016"}, + new { _id = 7, name = "elizabeth olsen", age = 31,profit = 300,test = 20.45,date="21/11/2017" }, + new { _id = 8, name = "tommy h", age = 31,profit = 3000,test = 0.0,date="21/11/2018"} + }; + + Result r = collection.Add(docs1).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(8)); + + // GroupBy operation. + // GroupBy returns 5 rows since age 45 and 24 is repeated. + var result1 = collection.Find().Limit(2).Offset(-2378723).Execute(); + int k = result1.FetchAll().Count; + result1 = collection.Find().Limit(2).Offset(-1).Execute(); + k = result1.FetchAll().Count; + result1 = collection.Find().Limit(2).Offset(0).Execute(); + k = result1.FetchAll().Count; + + var result = collection.Find().Fields("_id as ID", "name as Name", "age as Age").GroupBy("age").Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(5)); + result = collection.Find().Fields("_id as ID", "name as Name", "profit as Profit", "test as test").GroupBy("test").Having("test=1.92").Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(1)); + result = collection.Find().Fields("max($.age) as age", "max($.profit) as Profit", "max($.test) as test").GroupBy("$.test").Having("max($.age)>=31"). + Sort("profit DESC").Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(result.FetchAll().Count)); + result = collection.Find().Fields("max($.age) as age", "max($.profit) as Profit", "max($.test) as test").GroupBy("$.test").Having("max($.age)>30 && max($.age)<32") + .Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(2)); + result = collection.Find().Fields("max($.age) as age", "max($.profit) as Profit", "max($.test) as test").GroupBy("$.test").Having("max($.age)>300000000") + .Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(0)); + + result = collection.Find().Fields("max($.age) as age", "max($.profit) as Profit", "max($.test) as test").GroupBy("$.test").Having("max($.age)>30"). + Having("max($.age)<32") + .Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(5)); + + result = collection.Find().Fields("max($.age) as age", "max($.profit) as Profit", "max($.test) as test").GroupBy("$.test").Having("max($.age)>30"). + Having("max($.age)<32").Limit(5) + .Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(5)); + + result = collection.Find().Fields("max($.age) as age", "max($.profit) as Profit", "max($.test) as test").GroupBy("$.test").Having("max($.age)>30"). + Having("max($.age)<32").Limit(3) + .Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(3)); + + result = collection.Find().Fields("max($.age) as age", "max($.profit) as Profit", "max($.test) as test").GroupBy("$.test").Having("max($.age)>30"). + Having("max($.age)<32").Limit(3).Offset(2) + .Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(3)); + + result = collection.Find().Fields("$._id as _id", "$.test as test").GroupBy("$.test").Limit(5).Offset(1).Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(5)); + + result = collection.Find().Fields("$._id as _id", "$.test as test").GroupBy("$.test").Limit(5).Offset(-1).Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(5)); + + result = collection.Find().Fields("$._id as _id", "$.test as test").GroupBy("$.test").Limit(8).Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(8)); + + result = collection.Find().Fields("max($.age) as age", "max($.profit) as Profit", "max($.test) as test").GroupBy("$.test").Having("max($.age)>30"). + Having("max($.age)<32").Limit(3).Offset(-1) + .Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(3)); + + Assert.Throws(() => collection.Find().Fields("max($.age) as age", "max($.profit) as Profit", "max($.test) as test").GroupBy("$.test").Having("max($.age)>30"). + Having("max($.age)<32").Limit(-1).Offset(0) + .Execute()); + + DbDoc[] jsonlist = new DbDoc[2000]; + for (int i = 0; i < 2000; i++) + { + DbDoc newDoc2 = new DbDoc(); + newDoc2.SetValue("_id", (i + 1000).ToString()); + newDoc2.SetValue("F1", ("Field-1-Data-" + i)); + newDoc2.SetValue("F2", ("Field-2-Data-" + i)); + newDoc2.SetValue("F3", (300 + i).ToString()); + jsonlist[i] = newDoc2; + newDoc2 = null; + } + var res = collection.Add(jsonlist).Execute(); + + result = collection.Find().Fields("$.F1 as F1", "$.F2 as F2").GroupBy("$.F1").Limit(3).Offset(1).Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(3)); + + result = collection.Find().Fields("$.F1 as F1", "$.F2 as F2").GroupBy("$.F1").Limit(3).Offset(1844674407370955161).Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(0)); + } + + [Test, Description("Collection.Find().Limit(x,y)")] + public void FindLimitOffsetDeprecated() + { + ExecuteSQLStatement(GetSession().SQL("set sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';")); + Collection collection = CreateCollection("test"); + var docs1 = new[] + { + new { _id = 1, name = "jonh doe", age = 38,profit = 100,test = 1.92,date="21/11/2011" }, + new { _id = 2, name = "milton green", age = 45,profit = 200,test = 12.08,date="21/11/2012" }, + new { _id = 3, name = "larry smith", age = 24,profit = 300,test = 12.1,date="21/11/2013" }, + new { _id = 4, name = "mary weinstein", age = 24 ,profit = 100,test = 12.0,date="21/11/2014" }, + new { _id = 5, name = "jerry pratt", age = 45 ,profit = 400,test = 20.87,date="21/11/2015" }, + new { _id = 6, name = "hugh jackman", age = 20,profit = 500,test = 20.65,date="21/11/2016"}, + new { _id = 7, name = "elizabeth olsen", age = 31,profit = 300,test = 20.45,date="21/11/2017" }, + new { _id = 8, name = "tommy h", age = 31,profit = 3000,test = 0.0,date="21/11/2018"} + }; + + Result r = collection.Add(docs1).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(8)); + + // GroupBy operation. + var result1 = collection.Find().Limit(2).Offset(-2378723).Execute(); + int k = result1.FetchAll().Count; + result1 = collection.Find().Limit(2).Offset(-1).Execute(); + k = result1.FetchAll().Count; + result1 = collection.Find().Limit(2).Offset(0).Execute(); + k = result1.FetchAll().Count; + result1 = collection.Find().Limit(2).Offset(1000000000).Execute(); + k = result1.FetchAll().Count; + collection.Remove("true").Limit(2).Execute(); + + docs1 = new[] + { + new { _id = 1, name = "jonh doe", age = 38,profit = 100,test = 1.92,date="21/11/2011" }, + new { _id = 2, name = "milton green", age = 45,profit = 200,test = 12.08,date="21/11/2012" }, + }; + + r = collection.Add(docs1).Execute(); + Assert.Throws(() => collection.Remove("true").Limit(2).Offset(1).Execute()); + + collection.Remove("true").Limit(2).Offset(0).Execute(); + docs1 = new[] + { + new { _id = 1, name = "jonh doe", age = 38,profit = 100,test = 1.92,date="21/11/2011" }, + new { _id = 2, name = "milton green", age = 45,profit = 200,test = 12.08,date="21/11/2012" }, + }; + + r = collection.Add(docs1).Execute(); + Assert.Throws(() => collection.Modify("_id = 1 || _id = 2").Set("age", 34).Limit(1).Offset(1).Execute()); + + collection.Modify("_id = 1 || _id = 2").Set("age", 34).Limit(2).Offset(0).Execute(); + collection.Modify("_id = 1").Set("age", 38).Limit(2).Offset(0).Execute(); + collection.Modify("_id = 2").Set("age", 45).Limit(2).Offset(0).Execute(); + + var result = collection.Find().Fields("max($.age) as age", "max($.profit) as Profit", "max($.test) as test").GroupBy("$.test").Having("max($.age)>30"). + Having("max($.age)<32").Limit(3).Offset(2) + .Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(3)); + + result = collection.Find().Fields("$._id as _id", "$.test as test").GroupBy("$.test").Limit(5).Offset(1).Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(5)); + result = collection.Find().Fields("$._id as _id", "$.test as test").GroupBy("$.test").Limit(5).Offset(-1).Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(5)); + + result = collection.Find().Fields("max($.age) as age", "max($.profit) as Profit", "max($.test) as test").GroupBy("$.test").Having("max($.age)>30"). + Having("max($.age)<32").Limit(3).Offset(-1) + .Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(3)); + + Assert.Throws(() => collection.Find().Fields("max($.age) as age", "max($.profit) as Profit", "max($.test) as test").GroupBy("$.test").Having("max($.age)>30"). + Having("max($.age)<32").Limit(-1).Offset(0) + .Execute()); + } + + [Test, Description("Test MySQLX plugin Collection Dbdoc Scenarios")] + public void CollectionDbdoc() + { + Collection col = CreateCollection("my_collection_1"); + Collection col1 = CreateCollection("my_collection_2"); + var d1 = new DbDoc(); + d1.SetValue("_id", 1); + var docs1 = new[] + { + new { _id = 1, title = "Book 1" }, + new { _id = 2, title = "Book 2" }, + }; + + d1.SetValue("books", docs1); + d1.SetValue("pages", 20); + + var d2 = new DbDoc(); + d2.SetValue("_id", 2); + var docs2 = new[] + { + new { _id = 1, title = "Book 3" }, + new { _id = 2, title = "Book 4" }, + }; + + d2.SetValue("books", docs2); + d2.SetValue("pages", 30); + + var d3 = new DbDoc(); + d3.SetValue("_id", 3); + var docs3 = new[] + { + new { _id = 1, title = "Book 3" }, + new { _id = 2, title = "Book 4" }, + }; + + d3.SetValue("books", docs3); + d3.SetValue("pages", 40); + col.Add(d1).Add(d2).Add(d3).Execute(); + string[] test1 = new string[] { "_id=1" }; + string[] test2 = new string[] { "_id=2" }; + var res = col.Find("$._id = 1").Execute().FetchAll(); + Assert.That(res.Count, Is.EqualTo(1), "Matching the find count"); + Assert.That(res[0].ToString(), Is.EqualTo(d1.ToString()), "Matching the string"); + res = col.Find("$._id = 2").Execute().FetchAll(); + Assert.That(res.Count, Is.EqualTo(1), "Matching the find count"); + Assert.That(res[0].ToString(), Is.EqualTo(d2.ToString()), "Matching the string"); + res = col.Find("$._id = 3").Execute().FetchAll(); + Assert.That(res.Count, Is.EqualTo(1), "Matching the find count"); + Assert.That(res[0].ToString(), Is.EqualTo(d3.ToString()), "Matching the string"); + + } + + [Test, Description("Test MySQLX plugin Collection Dbdoc Scenarios - ID Present DbDoc Blank")] + public void CollectionIDPresentDbdocBlank() + { + Collection col = CreateCollection("my_collection_1"); + Collection col1 = CreateCollection("my_collection_2"); + var d1 = new DbDoc(); + d1.SetValue("_id", 1); + string[] a = { String.Empty }; + d1.SetValue("books", a); + d1.SetValue("pages", 20); + + var d2 = new DbDoc(); + d2.SetValue("_id", 2); + d2.SetValue("books", a); + d2.SetValue("pages", 30); + + var d3 = new DbDoc(); + d3.SetValue("_id", 3); + d3.SetValue("books", a); + d3.SetValue("pages", 40); + + col.Add(d1).Add(d2).Add(d3).Execute(); + string[] test1 = new string[] { "_id=1" }; + string[] test2 = new string[] { "_id=2" }; + var res = col.Find("$._id = 1").Execute().FetchAll(); + Assert.That(res.Count, Is.EqualTo(1), "Matching the find count"); + Assert.That(res[0].ToString(), Is.EqualTo(d1.ToString()), "Matching the string"); + res = col.Find("$._id = 2").Execute().FetchAll(); + Assert.That(res.Count, Is.EqualTo(1), "Matching the find count"); + Assert.That(res[0].ToString(), Is.EqualTo(d2.ToString()), "Matching the string"); + res = col.Find("$._id = 3").Execute().FetchAll(); + Assert.That(res.Count, Is.EqualTo(1), "Matching the find count"); + Assert.That(res[0].ToString(), Is.EqualTo(d3.ToString()), "Matching the string"); + } + + /// + /// Bug 23542055 + /// + [Test, Description("Test MySQLX plugin Find with Many conditions")] + [Ignore("Uncomment to execute")] + public void FindWithManyConditions() + { + int i = 0; + int Condition = 49; + String query = ""; + var col = CreateCollection("my_collection_1"); + + col.Add("{\"_id\":\"1002\",\"TEST1\":1111}").Execute(); + for (i = 0; i < Condition; i++) + { + if (i > 0) + query = query + " OR "; + query = query + "$.TEST1 > " + i; + } + var docs = col.Find(query).Execute(); + } + + [TestCase(1)] + [TestCase(2)] + [TestCase(3)] + [TestCase(4)] + [Test, Description("Reading exclusively locked anonymous object array using LockShared without waiting option. ")] + public void ExclusiveLocksAndCommit(int scenario) + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + + ExecuteSQLStatement(session.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + ExecuteSQLStatement(session2.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + Collection coll = CreateCollection("test"); + ExecuteSQLStatement(session2.SQL("ALTER TABLE `test`.`test` ADD COLUMN `$ix_i_r_index` INT GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(doc, '$._id'))) VIRTUAL NOT NULL, ADD UNIQUE INDEX `myIndex`(`$ix_i_r_index`)")); + Result result1 = null; + switch (scenario) + { + case 1: // Anonymous Object + var docs = new[] + { + new {_id = 1, a = 1}, + new {_id = 2, a = 2}, + new {_id = 3, a = 3} + }; + coll.Add(docs).Execute(); + break; + case 2: // DbDoc + for (int i = 0; i < 3; i++) + { + DbDoc DbDocs = new DbDoc(); + DbDocs.SetValue("_id", i); + DbDocs.SetValue("a", i); + result1 = coll.Add(DbDocs).Execute(); + } + break; + case 3: // Chained Add + var docs1 = new { _id = 1, title = "Book 1", pages = 20, a = 1 }; + var docs2 = new { _id = 2, title = "Book 1", pages = 20, a = 2 }; + var docs3 = new { _id = 3, title = "Book 1", pages = 20, a = 3 }; + result1 = coll.Add(docs1).Add(docs2).Add(docs3).Execute(); + break; + case 4: //Json string + result1 = coll.Add(@"{ ""_id"": 1,""a"": 1 }", @"{""_id"": 2,""a"": 2 }", @"{""_id"": 3, ""a"": 3 }", @"{ ""_id"": 4,""a"": 4 }").Execute(); + break; + } + + var coll2 = session2.GetSchema("test").GetCollection("test"); + session.SQL("START TRANSACTION").Execute(); + var docResult = coll.Find("_id = 1").LockExclusive().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + docResult = coll2.Find("_id = 2").LockExclusive().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + // Session2 blocks due to to LockExclusive() not allowing to read locked documents. + session2.SQL("SET SESSION innodb_lock_wait_timeout=1").Execute(); + Exception ex = Assert.Throws(() => ExecuteFindStatement(coll2.Find("_id = :id").LockExclusive().Bind("id", 1))); + + Assert.Throws(() => ExecuteModifyStatement(coll2.Modify("a = 1").Change("a", 10))); + + session.Commit(); + var result = coll2.Modify("a = 1").Set("a", 12).Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + } + + [TestCase(null)] + [TestCase(LockMode.Shared)] + [TestCase(LockMode.Exclusive)] + [Test, Description("Reading a document which was locked using lock_shared without waiting option")] + public void SharedLockAndCommit(LockMode? lockMode) + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + ExecuteSQLStatement(session.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + ExecuteSQLStatement(session2.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + Collection coll = CreateCollection("test"); + session2.SQL("ALTER TABLE `test`.`test` ADD COLUMN `$ix_i_r_index` INT GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(doc, '$._id'))) VIRTUAL NOT NULL, ADD UNIQUE INDEX `myIndex`(`$ix_i_r_index`)").Execute(); + var docs = new[] + { + new {_id = 1, a = 1}, + new {_id = 2, a = 2}, + new {_id = 3, a = 3} + }; + + coll.Add(docs).Execute(); + var coll2 = session2.GetSchema("test").GetCollection("test"); + + session.SQL("START TRANSACTION").Execute(); + var docResult = coll.Find("_id = 1").LockShared().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + switch (lockMode) + { + case LockMode.Shared: + docResult = coll2.Find("_id = 2").LockShared().Execute(); + break; + case LockMode.Exclusive: + docResult = coll2.Find("_id = 2").LockExclusive().Execute(); + break; + default: + docResult = coll2.Find("_id = 2").Execute(); + break; + } + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + // Session2 returns immediately. + session2.SQL("SET SESSION innodb_lock_wait_timeout=1").Execute(); + docResult = coll2.Find("_id = :id").Bind("id", 1).Execute(); + Assert.That(docResult.FetchAll(), Has.One.Items); + + // Session2 blocks due to to LockShared() not allowing to modify locked documents. + Exception ex = Assert.Throws(() => ExecuteModifyStatement(coll2.Modify("a = 1").Change("a", 10))); + + // Session2 returns immediately as session is committed. + session.Commit(); + var result = coll2.Modify("a = 1").Set("a", 12).Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + } + + [TestCase(LockMode.Shared)] + [TestCase(LockMode.Exclusive)] + [Test, Description("Reading a document using lock_shared using SKIPLOCK and NOWAIT options with CRUD operations happening parallely.")] + public void SharedAndExclusiveLockWithSkipAndNoWait(LockMode lockMode) + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + ExecuteSQLStatement(session.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + ExecuteSQLStatement(session2.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + Collection coll = CreateCollection("test"); + session2.SQL("ALTER TABLE `test`.`test` ADD COLUMN `$ix_i_r_index` INT GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(doc, '$._id'))) VIRTUAL NOT NULL, ADD UNIQUE INDEX `myIndex`(`$ix_i_r_index`)").Execute(); + if (lockMode == LockMode.Shared) + session2.SQL("ALTER TABLE `test`.`test` ADD COLUMN `$ix_i_m_index` INT GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(doc, '$.a'))) VIRTUAL NOT NULL, ADD UNIQUE INDEX `myIndex1`(`$ix_i_m_index`)").Execute(); + + var docs = new[] + { + new {_id = 1, a = 1}, + new {_id = 2, a = 2}, + new {_id = 3, a = 3} + }; + + coll.Add(docs).Execute(); + var coll2 = session2.GetSchema("test").GetCollection("test"); + + session.SQL("START TRANSACTION").Execute(); + var result1 = coll.Modify("a = 1").Set("a", 10).Execute(); + + session2.SQL("START TRANSACTION").Execute(); + session2.SQL("SET SESSION innodb_lock_wait_timeout=1").Execute(); + DocResult docResult = null; + switch (lockMode) + { + case LockMode.Exclusive: + Assert.Throws(() => ExecuteFindStatement(coll2.Find("_id = :id").LockExclusive(LockContention.NoWait).Bind("id", 1))); + docResult = coll2.Find("_id = :id").LockExclusive(LockContention.SkipLocked).Bind("id", 1).Execute(); + break; + case LockMode.Shared: + Assert.Throws(() => ExecuteFindStatement(coll2.Find("_id = :id").LockShared(LockContention.NoWait).Bind("id", 1))); + docResult = coll2.Find("_id = :id").LockShared(LockContention.SkipLocked).Bind("id", 1).Execute(); + break; + } + Assert.That(docResult.FetchAll().Count, Is.EqualTo(0), "Matching the document ID"); + + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + } + + [Test, Description("Multiple lock calls using NOWAIT and SKIPLOCK waiting option. ")] + public void MultipleLocksWithNowaitAndSkiplock() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + ExecuteSQLStatement(session.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + ExecuteSQLStatement(session2.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + Collection coll = CreateCollection("test"); + session2.SQL("ALTER TABLE `test`.`test` ADD COLUMN `$ix_i_r_index` INT GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(doc, '$._id'))) VIRTUAL NOT NULL, ADD UNIQUE INDEX `myIndex`(`$ix_i_r_index`)").Execute(); + var docs = new[] + { + new {_id = 1, a = 1}, + new {_id = 2, a = 2}, + new {_id = 3, a = 3} + }; + + coll.Add(docs).Execute(); + var coll2 = session2.GetSchema("test").GetCollection("test"); + + session.SQL("START TRANSACTION").Execute(); + var docResult = coll.Find("_id = 1").LockShared().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + session2.SQL("START TRANSACTION").Execute(); + + session2.SQL("SET SESSION innodb_lock_wait_timeout=1").Execute(); + Assert.Throws(() => ExecuteFindStatement(coll2.Find("_id = :id").LockExclusive(LockContention.SkipLocked).LockExclusive(LockContention.NoWait).Bind("id", 1))); + + docResult = coll2.Find("_id = :id").LockExclusive(LockContention.SkipLocked).LockShared(LockContention.NoWait).Bind("id", 1).Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + docResult = coll2.Find("_id = :id").LockExclusive(LockContention.SkipLocked).LockShared(LockContention.SkipLocked).Bind("id", 1).Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + docResult = coll2.Find("_id = :id").LockShared(LockContention.SkipLocked).LockExclusive(LockContention.SkipLocked).Bind("id", 1).Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(0), "Matching the document ID"); + + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + } + + [Test, Description("Reading multiple rows in a locked document(lock_shared) using SKIPLOCK and NOWAIT ")] + public void LockSharedMultipleReads() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + ExecuteSQLStatement(session.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + ExecuteSQLStatement(session2.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + Collection coll = CreateCollection("test"); + session2.SQL("ALTER TABLE `test`.`test` ADD COLUMN `$ix_i_r_index` INT GENERATED ALWAYS AS (JSON_EXTRACT(doc, '$._id')) VIRTUAL NOT NULL, ADD UNIQUE INDEX `myIndex`(`$ix_i_r_index`)").Execute(); + var docs = new[] + { + new {_id = 1, a = 1}, + new {_id = 2, a = 2}, + new {_id = 3, a = 3} + }; + + coll.Add(docs).Execute(); + var coll2 = session2.GetSchema("test").GetCollection("test"); + + session.SQL("START TRANSACTION").Execute(); + var docResult = coll.Find("_id >1").LockShared().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(2), "Matching the document ID"); + + session2.SQL("START TRANSACTION").Execute(); + session2.SQL("SET SESSION innodb_lock_wait_timeout=1").Execute(); + + docResult = coll2.Find("_id < 3").LockShared(LockContention.SkipLocked).Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(2), "Matching the document ID"); + + docResult = coll2.Find("_id < 3").LockShared(LockContention.NoWait).Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(2), "Matching the document ID"); + + docResult = coll2.Find("_id < 3").LockExclusive(LockContention.SkipLocked).Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + } + + [Test, Description("Reading multiple rows in an exclusively locked document using SKIPLOCK and NOWAIT ")] + public void LockExclusiveMultipleReads() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + ExecuteSQLStatement(session.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + ExecuteSQLStatement(session2.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + Collection coll = CreateCollection("test"); + session2.SQL("ALTER TABLE `test`.`test` ADD COLUMN `$ix_i_r_index` INT GENERATED ALWAYS AS (JSON_EXTRACT(doc, '$._id')) VIRTUAL NOT NULL, ADD UNIQUE INDEX `myIndex`(`$ix_i_r_index`)").Execute(); + var docs = new[] + { + new {_id = 1, a = 1}, + new {_id = 2, a = 2}, + new {_id = 3, a = 3} + }; + + coll.Add(docs).Execute(); + var coll2 = session2.GetSchema("test").GetCollection("test"); + + session.SQL("START TRANSACTION").Execute(); + var docResult = coll.Find("_id >1").LockExclusive().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(2), "Matching the document ID"); + + session2.SQL("START TRANSACTION").Execute(); + session2.SQL("SET SESSION innodb_lock_wait_timeout=1").Execute(); + + docResult = coll2.Find("_id < 3").LockShared(LockContention.SkipLocked).Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + docResult = coll2.Find("_id < 3").LockExclusive(LockContention.SkipLocked).Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + } + + [Test, Description("Collection.Find() with shared lock and Collection.Modify() normal from two sessions. ")] + public void LockSharedAndModify() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + ExecuteSQLStatement(session.SQL("SET autocommit = 0")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + session2.SQL("SET autocommit = 0").Execute(); + Collection coll = CreateCollection("test"); + session2.SQL("ALTER TABLE `test`.`test` ADD COLUMN `$ix_i_r_index` INT GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(doc, '$._id'))) VIRTUAL NOT NULL, ADD UNIQUE INDEX `myIndex`(`$ix_i_r_index`)").Execute(); + var docs = new[] + { + new {_id = 1, a = 1}, + new {_id = 2, a = 2}, + new {_id = 3, a = 3} + }; + + coll.Add(docs).Execute(); + var coll2 = session2.GetSchema("test").GetCollection("test"); + + session.SQL("START TRANSACTION").Execute(); + var docResult = coll.Find("_id = 1").LockShared().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + docResult = coll2.Find("_id = 1").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + session2.SQL("SET SESSION innodb_lock_wait_timeout=1").Execute(); + // Should allow to modify immediately since document isn't locked. + var result = coll2.Modify("_id = 2").Set("a", 10).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(1), "Match being done"); + Assert.Throws(() => ExecuteModifyStatement(coll2.Modify("_id = 1").Change("a", 10))); + + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + + ExecuteSQLStatement(session.SQL("SET autocommit = 1")); + } + + [Test, Description("Collection.Find() with shared lock from two sessions. ")] + public void LockSharedTwoSessions() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + ExecuteSQLStatement(session.SQL("SET autocommit = 0")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + session2.SQL("SET autocommit = 0").Execute(); + Collection coll = CreateCollection("test"); + session2.SQL("ALTER TABLE `test`.`test` ADD COLUMN `$ix_i_r_index` INT GENERATED ALWAYS AS (JSON_EXTRACT(doc, '$._id')) VIRTUAL NOT NULL, ADD UNIQUE INDEX `myIndex`(`$ix_i_r_index`)").Execute(); + var docs = new[] + { + new {_id = 1, a = 1}, + new {_id = 2, a = 1}, + new {_id = 3, a = 1} + }; + + coll.Add(docs).Execute(); + var coll2 = session2.GetSchema("test").GetCollection("test"); + + session.SQL("START TRANSACTION").Execute(); + var docResult = coll.Find("_id = 1").LockShared().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + docResult = coll2.Find("_id = 2").LockShared().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + // Should return immediately due to LockShared() allows reading by other sessions. + docResult = coll2.Find("_id = 1").LockShared().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + + ExecuteSQLStatement(session.SQL("SET autocommit = 1")); + } + + [Test, Description("Collection.Find() with exclusive lock and Collection.Find() with shared lock from two sessions. ")] + public void LockExclusiveFindAndLockSharedFind() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + ExecuteSQLStatement(session.SQL("SET autocommit = 0")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + session2.SQL("SET autocommit = 0").Execute(); + Collection coll = CreateCollection("test"); + session2.SQL("ALTER TABLE `test`.`test` ADD COLUMN `$ix_i_r_index` INT GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(doc, '$._id'))) VIRTUAL NOT NULL, ADD UNIQUE INDEX `myIndex`(`$ix_i_r_index`)").Execute(); + var docs = new[] + { + new {_id = 1, a = 1}, + new {_id = 2, a = 1}, + new {_id = 3, a = 1} + }; + + coll.Add(docs).Execute(); + var coll2 = session2.GetSchema("test").GetCollection("test"); + + session.SQL("START TRANSACTION").Execute(); + var docResult = coll.Find("_id = 1").LockExclusive().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + docResult = coll2.Find("_id = 2").LockShared().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + session2.SQL("SET SESSION innodb_lock_wait_timeout=1").Execute(); + // Session2 blocks due to LockExclusive() not allowing to read locked documents. + Assert.Throws(() => ExecuteFindStatement(coll2.Find("_id = 1").LockShared())); + // Session unlocks documents. + session.SQL("ROLLBACK").Execute(); + docResult = coll2.Find("_id = 1").LockShared().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + docResult = coll.Find("_id = 1").LockShared().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + session2.SQL("ROLLBACK").Execute(); + } + + ExecuteSQLStatement(session.SQL("SET autocommit = 1")); + } + + [Test, Description("Collection.Find() with shared lock and Collection.Find() with exclusive lock from two sessions. ")] + public void LockSharedFindAndExclusiveLocks() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + ExecuteSQLStatement(session.SQL("SET autocommit = 0")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + session2.SQL("SET autocommit = 0").Execute(); + Collection coll = CreateCollection("test"); + session2.SQL("ALTER TABLE `test`.`test` ADD COLUMN `$ix_i_r_index` INT GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(doc, '$._id'))) VIRTUAL NOT NULL, ADD UNIQUE INDEX `myIndex`(`$ix_i_r_index`)").Execute(); + var docs = new[] + { + new {_id = 1, a = 1}, + new {_id = 2, a = 1}, + new {_id = 3, a = 1} + }; + + coll.Add(docs).Execute(); + var coll2 = session2.GetSchema("test").GetCollection("test"); + + session.SQL("START TRANSACTION").Execute(); + var docResult = coll.Find("_id = 1").LockShared().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document IDs"); + docResult = coll.Find("_id = 3").LockShared().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document IDs"); + session2.SQL("START TRANSACTION").Execute(); + + // Should return immediately since document isn't locked. + docResult = coll2.Find("_id = 2").LockExclusive().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + // Should return immediately due to LockShared() allows reading by other sessions. + docResult = coll2.Find("_id = 2").LockShared().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + session2.SQL("SET SESSION innodb_lock_wait_timeout=1").Execute(); + // Session1 blocks due to LockExclusive() not allowing to read locked documents. + coll2.Find("_id = 2").LockExclusive().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + Assert.Throws(() => ExecuteFindStatement(coll2.Find("_id = 1").LockExclusive())); + Assert.Throws(() => ExecuteModifyStatement(coll2.Modify("_id = 1").Set("a", 100))); + // Session unlocks documents. + session2.SQL("ROLLBACK").Execute(); + session.SQL("ROLLBACK").Execute(); + } + + ExecuteSQLStatement(session.SQL("SET autocommit = 1")); + } + + [Test, Description("Collection.Find() with exclusive lock and Collection.Find() with exclusive lock from two sessions. ")] + public void LockExclusiveWithRollback() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + ExecuteSQLStatement(session.SQL("SET autocommit = 0")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + session2.SQL("SET autocommit = 0").Execute(); + Collection coll = CreateCollection("test"); + session2.SQL("ALTER TABLE `test`.`test` ADD COLUMN `$ix_i_r_index` INT GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(doc, '$._id'))) VIRTUAL NOT NULL, ADD UNIQUE INDEX `myIndex`(`$ix_i_r_index`)").Execute(); + var docs = new[] + { + new {_id = 1, a = 1}, + new {_id = 2, a = 1}, + new {_id = 3, a = 1} + }; + + coll.Add(docs).Execute(); + var coll2 = session2.GetSchema("test").GetCollection("test"); + + session.SQL("START TRANSACTION").Execute(); + var docResult = coll.Find("_id = 1").LockExclusive().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document IDs"); + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately due to LockShared() allows reading by other sessions. + docResult = coll2.Find("_id = 2").LockExclusive().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + session.SQL("SET SESSION innodb_lock_wait_timeout=1").Execute(); + Assert.Throws(() => ExecuteFindStatement(coll.Find("_id = 2").LockExclusive())); + session2.SQL("SET SESSION innodb_lock_wait_timeout=1").Execute(); + // Session1 blocks due to LockExclusive() not allowing to read locked documents. + Assert.Throws(() => ExecuteFindStatement(coll2.Find("_id = 1").LockExclusive())); + // Session unlocks documents. + session2.SQL("ROLLBACK").Execute(); + docResult = coll.Find("_id = 2").LockExclusive().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + session.SQL("ROLLBACK").Execute(); + docResult = coll2.Find("_id = 1").LockExclusive().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + } + + ExecuteSQLStatement(session.SQL("SET autocommit = 1")); + } + + [Test, Description("Collection.Find() with exclusive lock and Collection.Find() with exclusive lock from two sessions--Select multiple records ")] + public void LockExclusiveWithINSelection() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + ExecuteSQLStatement(session.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + ExecuteSQLStatement(session2.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + Collection coll = CreateCollection("test"); + var docs = new[] + { + new {_id = 1, a = 1}, + new {_id = 2, a = 1}, + new {_id = 3, a = 1} + }; + + coll.Add(docs).Execute(); + session2.SQL("ALTER TABLE `test`.`test` ADD COLUMN `$ix_i_r_index` INT GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(doc, '$._id'))) VIRTUAL NOT NULL, ADD UNIQUE INDEX `myIndex`(`$ix_i_r_index`)").Execute(); + var coll2 = session2.GetSchema("test").GetCollection("test"); + session.SQL("START TRANSACTION").Execute(); + var docResult = coll.Find("_id in (1,3)").LockExclusive().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(2), "Matching the document ID"); + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + docResult = coll2.Find("_id = 2").LockExclusive().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + // Should return immediately due to LockShared() allows reading by other sessions. + docResult = coll2.Find("_id = 2").LockShared().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + session2.SQL("SET SESSION innodb_lock_wait_timeout=1").Execute(); + // Session1 blocks due to LockExclusive() not allowing to read locked documents. + coll2.Find("_id = 2").LockExclusive().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + Assert.Throws(() => ExecuteFindStatement(coll2.Find("_id = 1").LockExclusive())); + Assert.Throws(() => ExecuteModifyStatement(coll2.Modify("_id = 1").Set("a", 100))); + // Session unlocks documents. + session2.SQL("ROLLBACK").Execute(); + session.SQL("ROLLBACK").Execute(); + } + + ExecuteSQLStatement(session.SQL("SET autocommit = 1")); + } + + [Test, Description("Collection.Find() with shared lock twice ")] + public void LockSharedReadTwice() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + ExecuteSQLStatement(session.SQL("SET autocommit = 0")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + session2.SQL("SET autocommit = 0").Execute(); + Collection coll = CreateCollection("test"); + session2.SQL("ALTER TABLE `test`.`test` ADD COLUMN `$ix_i_r_index` INT GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(doc, '$._id'))) VIRTUAL NOT NULL, ADD UNIQUE INDEX `myIndex`(`$ix_i_r_index`)").Execute(); + var docs = new[] + { + new {_id = 1, a = 1}, + new {_id = 2, a = 1}, + new {_id = 3, a = 1} + }; + coll.Add(docs).Execute(); + var coll2 = session2.GetSchema("test").GetCollection("test"); + + session.SQL("START TRANSACTION").Execute(); + var docResult = coll.Find("_id = 1").LockShared().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + session2.SQL("START TRANSACTION").Execute(); + + // Should return immediately since document isn't locked. + docResult = coll2.Find("_id = 2").LockExclusive().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + docResult = coll2.Find("_id = 2").LockExclusive().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + docResult = coll2.Find("_id = 2").LockShared().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + docResult = coll2.Find("_id = 2").LockShared().Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + // Session unlocks documents. + session2.SQL("ROLLBACK").Execute(); + session.SQL("ROLLBACK").Execute(); + } + ExecuteSQLStatement(session.SQL("SET autocommit = 1")); + } + + [Test, Description("Test MySQLX plugin Collection Array or Object contains operator Scenarios-1")] + public void FindInJsonObjects() + { + Assume.That(Platform.IsWindows(), "This test is for Windows OS only"); + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + + var col = CreateCollection("my_collection_1"); + string json = @"{ ""_id"": 0, ""title"": ""Book 0"" ,""pages"": 10,""name"": ""Jeoff Archer""}"; + Result r = col.Add(json).Execute(); + Assert.That((int)r.AffectedItemsCount, Is.EqualTo(1), "Matching Affected Records Count"); + var foundDocs = col.Find("1 in (1,2,3,6)").Execute(); + Assert.That(foundDocs.FetchAll().Count, Is.EqualTo(1), "Matching Count"); + //var result = col.Find("0 in $._id").Fields("$.name as name, $.pages as pages, $.title as title").Execute(); + foundDocs = col.Find("'Book 0' in $.title").Execute(); + Assert.That(foundDocs.FetchAll().Count, Is.EqualTo(1), "Matching Count"); + foundDocs = col.Find("100 in _id").Execute(); + Assert.That(foundDocs.FetchAll().Count, Is.EqualTo(0), "Matching Count"); + foundDocs = col.Find("100 not in _id").Execute(); + Assert.That(foundDocs.FetchAll().Count, Is.EqualTo(1), "Matching Count"); + + json = @"{ ""_id"" : 99950, ""city"" : ""KETCHIKAN"", ""loc"" : ""[ -133.18479, 55.942471 ]"", ""pop"" : 422, ""state"" : ""AK"" }"; + r = col.Add(json).Execute(); + + + var d = new DbDoc(@"{ ""id"": 1, ""pages"": 20, + ""person"": { ""name"": ""Fred"", ""age"": 45 } + }"); + var d2 = new DbDoc(); + d2.SetValue("id", 1); + d2.SetValue("pages", 20); + d2.SetValue("person", new { name = "Fred", age = 45 }); + + Assert.That(true, Is.EqualTo(d.Equals(d2)), "Matching"); + col.Add(d).Execute(); + + + d = new DbDoc(@"{""id"":100,""FirstName"":""xyz"",""lastname"":""pqr"", + ""address"": + {""house"":44,""city"":""Delhi"",""country"":""india""}}"); + col.Add(d).Execute(); + + d = new DbDoc(@"{""customerId"":100,""FirstName"":""xyz"",""lastname"":""pqr"", + ""address"": + {""house"":44,""city"":""Delhi"",""country"":""india""}, + ""employer"": + {""cmpName"":""ABC"",""type"":""IT""}}"); + col.Add(d).Execute(); + + d = new DbDoc(@"{ ""id"": 1, ""pages"": 20, + ""books"": [ + {""_id"" : 1, ""title"" : ""Book 1""}, + { ""_id"" : 2, ""title"" : ""Book 2"" } + ] + }"); + col.Add(d).Execute(); + + var docs = new[] { new { _id = 1, title = "Book 1" }, new { _id = 2, title = "Book 2" } }; + d2 = new DbDoc(); + d2.SetValue("id", 100); + d2.SetValue("pages", 20); + d2.SetValue("books", docs); + col.Add(d2).Execute(); + + var result = col.Find("0 in $._id").Fields("$._id as _id,$.name as name, $.pages as pages, $.title as title").Execute(); + var res1 = result.FetchOne(); + Assert.That(res1["_id"], Is.EqualTo(0)); + Assert.That(res1["name"], Is.EqualTo("Jeoff Archer")); + Assert.That(res1["pages"], Is.EqualTo(10)); + Assert.That(res1["title"], Is.EqualTo("Book 0")); + + result = col.Find("0 in $._id OR 1 in $._id").Fields("$._id as _id,$.name as name, $.pages as pages, $.title as title").Execute(); + res1 = result.FetchOne(); + Assert.That(res1["_id"], Is.EqualTo(0)); + Assert.That(res1["name"], Is.EqualTo("Jeoff Archer")); + Assert.That(res1["pages"], Is.EqualTo(10)); + Assert.That(res1["title"], Is.EqualTo("Book 0")); + + result = col.Find("0 not in $._id").Fields("$._id as _id,$.name as name, $.pages as pages, $.title as title").Execute(); + var res2 = result.FetchAll(); + Assert.That(res2.Count, Is.EqualTo(6), "Matching the find count"); + + result = col.Find("'Jeoff Archer' in $.name").Execute(); + res1 = result.FetchOne(); + Assert.That(res1["_id"], Is.EqualTo(0)); + Assert.That(res1["name"], Is.EqualTo("Jeoff Archer")); + Assert.That(res1["pages"], Is.EqualTo(10)); + Assert.That(res1["title"], Is.EqualTo("Book 0")); + + result = col.Find("0 not in $._id").Fields().Execute(); + res2 = result.FetchAll(); + Assert.That(res2[0]["_id"], Is.Not.Null); + + var test = new DbDoc(); + test.SetValue("_id", 1); + test.SetValue("age", 3488888888.9); + test.SetValue("name", + "ABBBBBBBBBBBBBBXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTTTTTYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYABBBBBBBBBBBBBBXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTTTTTYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYABBBBBBBBBBBBBBXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTTTTTYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYABBBBBBBBBBBBBBXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTTTTTYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYABBBBBBBBBBBBBBXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTTTTTYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"); + + var coll = CreateCollection("my_collection_123456789"); + var res = coll.Add(test).Execute(); + var foundDocs2 = coll + .Find( + "'ABBBBBBBBBBBBBBXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTTTTTYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYABBBBBBBBBBBBBBXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTTTTTYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYABBBBBBBBBBBBBBXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTTTTTYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYABBBBBBBBBBBBBBXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTTTTTYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYABBBBBBBBBBBBBBXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTTTTTYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY' in $.name") + .Execute(); + var docs1 = foundDocs2.FetchAll(); + Assert.That(docs1.Count, Is.EqualTo(1)); + foundDocs2 = coll.Find("3488888888.9 in $.age").Execute(); + docs1 = foundDocs2.FetchAll(); + Assert.That(docs1.Count, Is.EqualTo(1)); + } + + [Test, Description("Test MySQLX plugin Collection Array or Object contains operator Scenarios-3")] + public void FindAndCountJsonValues() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + + var col = CreateCollection("my_collection_1"); + Result add; + add = col.Add("{ \"name\": \"abcdefghijk\", \"age\": 1 , \"misc\": \"10-15-2017\"}") + .Add("{ \"name\": \"xyz\", \"age\": 6 , \"misc\": \"19.5\"}").Execute(); + add = col.Add("{ \"name\": \"qwerty@#$%^&\", \"age\": 4 , \"misc\": \"11.9\"}").Execute(); + add = col.Add("{ \"name\": [\"name1\", \"name2\", \"name3\"], \"age\": 1 , \"misc\": \"1.2\"}").Execute(); + add = col.Add( + "{ \"name\": {\"first\" : \"ABCDEF1\", \"middle\" : \"ABCDEF2\", \"last\" : \"ABCDEF3\"}, " + + "\"age\": 1 , \"misc\": \"1.2\"}") + .Execute(); + add = col.Add( + "{ \"name\": {\"first\" : \"ABCDEF1\", \"middle\" : \"ABCDEF2\", \"last\" : \"ABCDEF3\"}, " + + "\"age\": 2, \"misc\": \"1.2\"}") + .Execute(); + var docs = col.Find().Execute(); + var result1 = col.Find("\"10-15-2017\" in $.misc").Execute().FetchAll().Count; + Assert.That(result1, Is.EqualTo(1)); + result1 = col.Find("\"10-15-2019\" in $.misc").Execute().FetchAll().Count; + Assert.That(result1, Is.EqualTo(0)); + var doc = docs.FetchOne(); + var result = col.Find("1 in $.age").Fields("$.name as name, $.age as age, $.misc as misc").Sort("name DESC").Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(3)); + var coll = CreateCollection("test"); + coll.Add(new DbDoc("{ \"a\": 1, \"b\": [ 1, \"value\" ], \"d\":\"\", \"ARR1\":[\"Field-1-Data-0\"] }")).Execute(); + result = coll.Find("JSON_TYPE($.ARR1) = 'ARRAY' AND \"Field-1-Data-0\" in $.ARR1").Execute(); + var count = result.FetchAll().Count; + Assert.That(count, Is.EqualTo(1)); + + } + + [Test, Description("Test MySQLX plugin Collection Array or Object contains operator Scenarios-4")] + public void CheckCountAfterSort() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + var coll = CreateCollection("test"); + coll.Add("{ \"name\": \"abcdefghijk\", \"age\": 1 , \"misc\": 1.2}") + .Add("{ \"name\": \"xyz\", \"age\": 6 , \"misc\": 19.59}").Execute(); + coll.Add("{ \"name\": \"qwerty@#$%^&\", \"age\": 4 , \"misc\": 11.9}").Execute(); + coll.Add("{ \"name\": \"name1\", \"age\": 4 , \"misc\": 11.9}").Execute(); + coll.Add("{ \"name\": [\"name1\", \"name2\", \"name3\"], \"age\": 1 , \"misc\": 1.2}").Execute(); + coll.Add("{ \"name\": {\"first\" : \"ABCDEF1\", \"middle\" : \"ABCDEF2\", \"last\" : \"ABCDEF3\"}, \"age\": 1 , \"misc\": 1.2}").Execute(); + var docs = coll.Find("4 in $.age").Execute().FetchAll().Count; + Assert.That(docs > 0); + var res3 = coll.Find("4 in $.age").Sort("name ASC").Execute().FetchAll(); + Assert.That(res3.Count, Is.EqualTo(docs)); + } + + [Test, Description("Test MySQLX plugin Find with overlap Bugs")] + public void FindUsingOverLapsBug() + { + Assume.That(session.Version.isAtLeast(8, 0, 17), "This test is for MySql 8.0.17 or higher"); + String json = ""; + String[] splName = { "+", "*", "/", "a+b", "#1", "%", "&", "@1", "!1", "~", "^", + "(", ")", "{", "}", "[", "]", "|", "JSON", "ADD", "JSON_EXTRACT", "JSON_OBJECT", + "?", "=", "+", ";", ",", ":", "<", ">", "-"}; + Collection coll = CreateCollection("test"); + for (int i = 0; i < splName.Length; i++) + { + coll.Add("{\"" + splName[i] + "\":\"data" + i + "\",\"ID\":" + i + "}").Execute(); + var docs2 = coll.Find("$.ID OVERLAPS " + i).Fields("$.`" + splName[i] + "` as col1,$.ID as Id").Execute(); + var res2 = docs2.FetchOne(); + Assert.That(res2["Id"].ToString(), Is.EqualTo(i.ToString()), "Matching the ID"); + if (i == 30) + Assert.That("data30", Is.EqualTo("data" + i), "Matching the String"); + else + Assert.That(res2["col1"].ToString(), Is.EqualTo("data" + i), "Matching the String"); + } + + coll = CreateCollection("test"); + json = "{\"_id\":\"1005\",\"F1\": 123,\"F2\":\"ABCD\" }"; + coll.Add(json).Execute(); + json = "{\"_id\":\"1006\",\"F1\": 123,\"F2\":\"1234\" }"; + coll.Add(json).Execute(); + json = "{\"_id\":\"1007\",\"F1\": 123,\"F2\":\"S()R%^\" }"; + coll.Add(json).Execute(); + + var docs1 = coll.Find().Fields("$._id as _id", "1 << 4 as tmp").Execute(); + var res = docs1.FetchAll(); + docs1 = coll.Find().Fields("$._id as _id", "$.F2 ^ 1 as tmp").Execute(); + res = docs1.FetchAll(); + coll.Add("{\"_id\":\"100001\",\"x1\":\"31\", \"x2\":\"13\", \"x3\":\"8\", \"x4\":\"18446744073709551614\"}").Execute(); + + docs1 = coll.Find("CAST($.x1 as SIGNED) | pow(2,$.x1) = $.x1").Fields("$._id as _id, $.x1 as x1, $.x2 as x2, $.x3 as x3 , $.x2 | pow(2,$.x1) as tmp").Execute(); + res = docs1.FetchAll(); + + docs1 = coll.Find("~16 = ~CAST($.F2 as SIGNED)").Fields("$._id as _id,$.F2 as f2, ~1 as tmp").Execute(); + res = docs1.FetchAll(); + int maxrec = 100; + DbDoc newDoc = new DbDoc(); + newDoc.SetValue("_id", maxrec + 1000); + newDoc.SetValue("F1", "Field-1-Data-" + maxrec); + newDoc.SetValue("F2", "Field-2-Data-" + maxrec); + newDoc.SetValue("F3", 300 + maxrec); + coll.Add(newDoc).Execute(); + + json = "{'_id':'" + (maxrec + 1000 + 1) + "','F1':'Field-1-Data-" + (maxrec + 1) + "','F2':'Field-2-Data-" + (maxrec + 1) + "','F3':" + (300 + maxrec + 1) + "}"; + json = json.Replace("'", "\""); + coll.Add(json).Execute(); + json = "{'F1': 'Field-1-Data-9999','F2': 'Field-2-Data-9999','F3': 'Field-3-Data-9999'}".Replace("'", "\""); + coll.Add(json).Add(json.Replace("9", "8")).Execute(); + + var docs = coll.Find("$._id OVERLAPS 1100").Fields("$_id as _id,$.F1 as f1, $.F2 as f2, $.F3 as f3").Execute(); + var res1 = docs.FetchOne(); + Assert.That(res1["_id"].ToString(), Is.EqualTo("1100")); + Assert.That(res1["f1"].ToString(), Is.EqualTo("Field-1-Data-100")); + Assert.That(res1["f2"].ToString(), Is.EqualTo("Field-2-Data-100")); + Assert.That(res1["f3"].ToString(), Is.EqualTo("400")); + Assert.Throws(() => ExecuteFindStatement(coll.Find("$.F2 OVERLAPS #").Fields("$_id as _id,$.F1 as f1, $.F2 as f2, $.F3 as f3"))); + + docs = coll.Find("$.F2 OVERLAPS 'ABCD'").Fields("$_id as _id,$.F1 as f1, $.F2 as f2, $.F3 as f3").Execute(); + res1 = docs.FetchOne(); + Assert.That(res1["_id"], Is.EqualTo("1005")); + Assert.That(res1["f1"], Is.EqualTo(123)); + Assert.That(res1["f2"], Is.EqualTo("ABCD")); + Assert.Throws(() => ExecuteFindStatement(coll.Find("$.F2 OVERLAPS [1234").Fields("$_id as _id,$.F1 as f1, $.F2 as f2, $.F3 as f3"))); + Assert.Throws(() => ExecuteFindStatement(coll.Find("$.F2 OVERLAPS S()R%^").Fields("$_id as _id,$.F1 as f1, $.F2 as f2, $.F3 as f3"))); + + docs = coll.Find("$.F2 OVERLAPS 'S()R%^'").Fields("$_id as _id,$.F1 as f1, $.F2 as f2, $.F3 as f3").Execute(); + res1 = docs.FetchOne(); + Assert.That(res1["_id"], Is.EqualTo("1007")); + Assert.That(res1["f1"], Is.EqualTo(123)); + Assert.That(res1["f2"], Is.EqualTo("S()R%^")); + } + + [Test, Description("Test MySQLX plugin Find with overlap and Many conditions")] + public void FindUsingOverLapsManyConditions() + { + Assume.That(session.Version.isAtLeast(8, 0, 17), "This test is for MySql 8.0.17 or higher"); + int Condition = 45; + int i, j = 0; + String query = ""; + Collection coll = CreateCollection("test"); + for (i = 0; i < 50; i++) + { + coll.Add("{\"_id\":\"" + i + "\",\"TEST1\":" + (1000 + j) + "}").Execute(); + j++; + } + j = 0; + for (i = 0; i < Condition; i++) + { + if (i > 0) + query = query + " OR "; + query = query + "$.TEST1 OVERLAPS " + (1000 + j); + j++; + } + var docs = coll.Find(query).Execute(); + Assert.That(docs.FetchAll().Count > 0); + } + + [Test, Description("Deprecated Find Where")] + public void FindWhere() + { + Collection collection = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + var result1 = collection.Add(docs).Execute(); + Assert.That(result1.AffectedItemsCount, Is.EqualTo(4)); + + //Deprecated Find().Where() in 8.0.17 + var result2 = collection.Find("$._id = 1").Where("true").Execute().FetchAll(); + Assert.That(result2.Count, Is.EqualTo(4)); + } + + [Test, Description("Test MySQLX plugin Collection match count")] + public void CollectionFindFieldMatchingCount() + { + Collection col = CreateCollection("my_collection_1"); + Collection col1 = CreateCollection("my_collection_2"); + + var d1 = new DbDoc(); + d1.SetValue("_id", 1); + d1.SetValue("books", "test1"); + d1.SetValue("count", 10); + + var d2 = new DbDoc(); + d2.SetValue("_id", 2); + d2.SetValue("books", "test2"); + d2.SetValue("count", 20); + + var d3 = new DbDoc(); + d3.SetValue("_id", 3); + d3.SetValue("books", "test3"); + d3.SetValue("count", 30); + + var d4 = new DbDoc(); + d4.SetValue("_id", 4); + d4.SetValue("books", "test4"); + d4.SetValue("count", 40); + + var d5 = new DbDoc(); + d5.SetValue("_id", 5); + d5.SetValue("books", "test5"); + d5.SetValue("count", 50); + + var d6 = new DbDoc(); + d6.SetValue("_id", 6); + d6.SetValue("books", "test6"); + d6.SetValue("count", 0); + + var d7 = new DbDoc(); + d7.SetValue("_id", 0); + d7.SetValue("books", "test7"); + d7.SetValue("count", 60); + + var final = col.Add(d1, d2).Add(d3).Execute(); + var res1 = col.Find().Fields("{\"_id\":\"1\",\"books\": \"test1\" }").Fields("{\"_id\":\"2\",\"books\": \"test2\" }").Fields("{\"_id\":\"3\",\"books\": \"test3\" }").Execute().FetchAll(); + res1 = col.Find().Fields(new string[] { "_id", "books", "count" }).Execute().FetchAll(); + Assert.That(res1.Count, Is.EqualTo(3), "Matching the find count"); + Assert.That(res1[0].ToString(), Is.EqualTo(d1.ToString()), "Matching the doc string 1"); + Assert.That(res1[1].ToString(), Is.EqualTo(d2.ToString()), "Matching the doc string 2"); + Assert.That(res1[2].ToString(), Is.EqualTo(d3.ToString()), "Matching the doc string 3"); + final = col.Add(new DbDoc[] { d4, d5 }).Execute(); + var res2 = col.Find().Fields("$._id as _id,$.books as books, $.count as count").Execute().FetchAll(); + Assert.That(res2.Count, Is.EqualTo(5), "Matching the find count"); + Assert.That(res2[0].ToString(), Is.EqualTo(d1.ToString()), "Matching the doc string 1"); + Assert.That(res2[1].ToString(), Is.EqualTo(d2.ToString()), "Matching the doc string 2"); + Assert.That(res2[2].ToString(), Is.EqualTo(d3.ToString()), "Matching the doc string 3"); + Assert.That(res2[3].ToString(), Is.EqualTo(d4.ToString()), "Matching the doc string 4"); + Assert.That(res2[4].ToString(), Is.EqualTo(d5.ToString()), "Matching the doc string 5"); + final = col.Add(d6, d7).Execute(); + var res3 = col.Find().Sort("count ASC").Execute().FetchAll(); + Assert.That(res3[0].ToString(), Is.EqualTo(d6.ToString()), "Matching the doc string 7"); + Assert.That(res3[1].ToString(), Is.EqualTo(d1.ToString()), "Matching the doc string 1"); + Assert.That(res3[2].ToString(), Is.EqualTo(d2.ToString()), "Matching the doc string 2"); + Assert.That(res3[3].ToString(), Is.EqualTo(d3.ToString()), "Matching the doc string 3"); + Assert.That(res3[4].ToString(), Is.EqualTo(d4.ToString()), "Matching the doc string 4"); + Assert.That(res3[5].ToString(), Is.EqualTo(d5.ToString()), "Matching the doc string 5"); + Assert.That(res3[6].ToString(), Is.EqualTo(d7.ToString()), "Matching the doc string 6"); + var res4 = col.Find().Sort("count DESC").Execute().FetchAll(); + Assert.That(res4[0].ToString(), Is.EqualTo(d7.ToString()), "Matching the doc string 6"); + Assert.That(res4[1].ToString(), Is.EqualTo(d5.ToString()), "Matching the doc string 1"); + Assert.That(res4[2].ToString(), Is.EqualTo(d4.ToString()), "Matching the doc string 2"); + Assert.That(res4[3].ToString(), Is.EqualTo(d3.ToString()), "Matching the doc string 3"); + Assert.That(res4[4].ToString(), Is.EqualTo(d2.ToString()), "Matching the doc string 4"); + Assert.That(res4[5].ToString(), Is.EqualTo(d1.ToString()), "Matching the doc string 5"); + Assert.That(res4[6].ToString(), Is.EqualTo(d6.ToString()), "Matching the doc string 7"); + col.Modify("_id = 1").Unset("count").Unset("books").Execute(); + col.Modify("_id = 1").Set("count", 10).Set("books", "test1").Execute(); + + } + + [Test, Description("GetName,Schema and Count")] + public void CollectionGetNameSchemaCount() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + var col = CreateCollection("my_collection_123456789"); + + Result r = col.Add(@"{ ""_id"": 1, ""foo"": 1 }").Execute(); + long count = col.Count(); + Assert.That(1, Is.EqualTo(count), "Matching the Collection Count"); + + var collectionName = col.Name; + Assert.That("my_collection_123456789", Is.EqualTo(collectionName), "Matching the collection Name"); + + var schema = col.Schema.Name; + Assert.That(schemaName, Is.EqualTo(schema), "Matching the Schema Name"); + + r = col.Add(@"{ ""_id"": 2, ""foo"": 2 }").Execute(); + count = col.Count(); + Assert.That(2, Is.EqualTo(count), "Matching the Collection Count"); + + r = col.Remove("_id=2").Execute(); + count = col.Count(); + Assert.That(1, Is.EqualTo(count), "Matching the Collection Count"); + session.Schema.DropCollection("my_collection_123456789"); + } + + #endregion WL14389 + + } +} + diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/BasicSelectTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/BasicSelectTests.cs new file mode 100644 index 000000000..60709a8b8 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/BasicSelectTests.cs @@ -0,0 +1,148 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Relational; +using System; +using NUnit.Framework; +using NUnit.Framework.Legacy; + +namespace MySqlX.Data.Tests +{ + public class BasicSelectTests : BaseTest + { + [Test] + public void SimpleSelect() + { + CreateBooksTable(); + Table books = GetTable("test", "books"); + + RowResult result = ExecuteSelectStatement(books.Select("name", "pages")); + var rows = result.FetchAll(); + Assert.That(result.Columns.Count == 2); + Assert.That(rows.Count == 2); + + var result2 = session.SQL("Select* from test.books").Execute(); + var row2 = result2.FetchOne(); + Assert.That(result2.Columns.Count == 3); + } + + [Test] + public void SimpleSelectWithWhere() + { + CreateBooksTable(); + Table books = GetTable("test", "books"); + + RowResult result = ExecuteSelectStatement(books.Select("name", "pages").Where("pages > 250")); + var rows = result.FetchAll(); + Assert.That(result.Columns.Count == 2); + Assert.That(rows, Has.One.Items); + } + + private void CreateBooksTable() + { + ExecuteSQL("DROP TABLE IF EXISTS test.books"); + ExecuteSQL("CREATE TABLE test.books(id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), pages INT)"); + ExecuteSQL("INSERT INTO test.books VALUES (NULL, 'Moby Dick', 500)"); + ExecuteSQL("INSERT INTO test.books VALUES (NULL, 'A Tale of Two Cities', 250)"); + } + + public enum LockMode { Exclusive, Shared } + + [TestCase(LockContention.Default, LockMode.Exclusive)] + [TestCase(LockContention.NoWait, LockMode.Exclusive)] + [TestCase(LockContention.SkipLocked, LockMode.Exclusive)] + [TestCase(LockContention.Default, LockMode.Shared)] + [TestCase(LockContention.NoWait, LockMode.Shared)] + [TestCase(LockContention.SkipLocked, LockMode.Shared)] + public void LockExclusiveAndSharedWithWaitingOptions(LockContention lockOption, LockMode lockMode) + { + if (!session.XSession.GetServerVersion().isAtLeast(8, 0, 3)) return; + + CreateBooksTable(); + string tableName = "books"; + string schemaName = "test"; + + // first session locks the row + using (Session s1 = MySQLX.GetSession(ConnectionString)) + { + var t1 = s1.GetSchema(schemaName).GetTable(tableName); + s1.StartTransaction(); + RowResult r1 = ExecuteSelectStatement(t1.Select().Where("id = :id").Bind("id", 1).LockExclusive()); + var rows1 = r1.FetchAll(); + Assert.That(rows1, Has.One.Items); + Assert.That(rows1[0]["id"], Is.EqualTo(1)); + + // second session tries to read the locked row + using (Session s2 = MySQLX.GetSession(ConnectionString)) + { + var t2 = s2.GetSchema(schemaName).GetTable(tableName); + ExecuteSQLStatement(s2.SQL("SET innodb_lock_wait_timeout = 1")); + s2.StartTransaction(); + var stmt2 = t2.Select(); + if (lockMode == LockMode.Exclusive) + stmt2.LockExclusive(lockOption); + else + stmt2.LockShared(lockOption); + + switch (lockOption) + { + case LockContention.Default: + // error 1205 Lock wait timeout exceeded; try restarting transaction + Assert.That(Assert.Throws(() => ExecuteSelectStatement(stmt2).FetchAll()).Code, Is.EqualTo(1205u)); + break; + case LockContention.NoWait: + // error 1205 Lock wait timeout exceeded; try restarting transaction + uint expectedError = 1205; + if (session.XSession.GetServerVersion().isAtLeast(8, 0, 5)) + // error 3572 Statement aborted because lock(s) could not be acquired immediately and NOWAIT is set + expectedError = 3572; + Assert.That(Assert.Throws(() => ExecuteSelectStatement(stmt2).FetchAll()).Code, Is.EqualTo(expectedError)); + break; + case LockContention.SkipLocked: + if (!session.XSession.GetServerVersion().isAtLeast(8, 0, 5)) + { + // error 1205 Lock wait timeout exceeded; try restarting transaction + Assert.That(Assert.Throws(() => ExecuteSelectStatement(stmt2).FetchAll()).Code, Is.EqualTo(1205u)); + break; + } + var rows2 = ExecuteSelectStatement(stmt2).FetchAll(); + Assert.That(rows2, Has.One.Items); + Assert.That(rows2[0]["id"], Is.EqualTo(2)); + break; + default: + throw new NotImplementedException(lockOption.ToString()); + } + } + // first session frees the lock + s1.Commit(); + } + } + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/CharsetAndCollationTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/CharsetAndCollationTests.cs new file mode 100644 index 000000000..226d722f5 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/CharsetAndCollationTests.cs @@ -0,0 +1,1155 @@ +// Copyright © 2017, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Relational; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace MySqlX.Data.Tests +{ + /// + /// Charset and collation related tests. + /// + public class CharsetAndCollationTests : BaseTest + { + private static DBVersion _serverVersion; + + static CharsetAndCollationTests() + { + using (var connection = new MySqlConnection(ConnectionStringRoot)) + { + connection.Open(); + _serverVersion = connection.driver.Version; + } + } + + [Test] + public void DefaultCharSet() + { + if (!_serverVersion.isAtLeast(8, 0, 1)) return; + + using (var session = MySQLX.GetSession(ConnectionString)) + { + Assert.That(session.Settings.CharacterSet, Is.EqualTo("utf8mb4")); + } + + using (var connection = new MySqlConnection(ConnectionStringRoot)) + { + connection.Open(); + MySqlCommand cmd = new MySqlCommand("SHOW VARIABLES LIKE 'character_set_connection'", connection); + MySqlDataReader reader = cmd.ExecuteReader(); + reader.Read(); + Assert.That(reader.GetString("Value"), Is.EqualTo("utf8mb4")); + reader.Close(); + + cmd.CommandText = "SHOW VARIABLES LIKE 'character_set_database'"; + reader = cmd.ExecuteReader(); + reader.Read(); + Assert.That(reader.GetString("Value"), Is.EqualTo("utf8mb4")); + reader.Close(); + + cmd.CommandText = "SHOW VARIABLES LIKE 'character_set_server'"; + reader = cmd.ExecuteReader(); + reader.Read(); + Assert.That(reader.GetString("Value"), Is.EqualTo("utf8mb4")); + reader.Close(); + + cmd.CommandText = "SHOW VARIABLES LIKE 'collation_%'"; + reader = cmd.ExecuteReader(); + while (reader.Read()) + { + Assert.That(reader.GetString("Value"), Is.EqualTo("utf8mb4_0900_ai_ci")); + } + reader.Close(); + } + } + + [Test] + public void ValidateCollationMapList() + { + if (!_serverVersion.isAtLeast(8, 0, 1)) return; + + using (var connection = new MySqlConnection(ConnectionStringRoot)) + { + connection.Open(); + var command = new MySqlCommand("SELECT id, collation_name FROM INFORMATION_SCHEMA.COLLATIONS", connection); + var reader = command.ExecuteReader(); + Assert.That(reader.HasRows); + + while (reader.Read()) + { + var id = reader.GetInt32("id"); + var collationName = reader.GetString("collation_name"); + + if (!_serverVersion.isAtLeast(8, 0, 30) && collationName.Contains("utf8_")) + collationName = collationName.Replace("utf8_", "utf8mb3_"); + + Assert.That(collationName, Is.EqualTo(CollationMap.GetCollationName(id))); + } + } + } + + /// + /// Bug #26163694 SELECT WITH/WO PARAMS(DIFF COMB) N PROC CALL FAIL WITH KEY NOT FOUND EX-WL#10561 + /// + [Test] + public void Utf8mb4CharsetExists() + { + if (!_serverVersion.isAtLeast(8, 0, 1)) return; + + using (Session session = MySQLX.GetSession(ConnectionString)) + { + // Search utf8mb4 database. + var result = ExecuteSQLStatement(session.SQL("SHOW COLLATION WHERE id = 255")); + Assert.That(result.HasData); + var data = result.FetchOne(); + Assert.That(data.GetString("Collation"), Is.EqualTo("utf8mb4_0900_ai_ci")); + + // Check in CollationMap. + Assert.That(CollationMap.GetCollationName(255), Is.EqualTo("utf8mb4_0900_ai_ci")); + } + } + + /// + /// Bug #26163703 SHOW COLLATION FAILS WITH MYSQL SERVER 8.0-WL#10561 + /// + [Test] + public void IllegalMixCollations() + { + using (Session session = MySQLX.GetSession(ConnectionString)) + { + var result = ExecuteSQLStatement(session.SQL("SHOW COLLATION WHERE `Default` ='Yes';")); + Assert.That(result.HasData); + } + + using (Session session = MySQLX.GetSession(ConnectionString + ";charset=latin1")) + { + var result = ExecuteSQLStatement(session.SQL("SHOW COLLATION WHERE `Default` ='Yes';")); + Assert.That(result.HasData); + } + + using (Session session = MySQLX.GetSession(ConnectionString + ";charset=utf8mb4")) + { + var result = ExecuteSQLStatement(session.SQL("SHOW COLLATION WHERE `Default` ='Yes';")); + Assert.That(result.HasData); + } + + using (Session session = MySQLX.GetSession(ConnectionString + ";charset=utf-8")) + { + var result = ExecuteSQLStatement(session.SQL("SHOW COLLATION WHERE `Default` ='Yes';")); + Assert.That(result.HasData); + } + } + + /// + /// Bug #26163678 VIEW.SELECT RETURNS TYPE INSTEAD OF THE TABLE-WL#10561 + /// Bug #26163667 COLLECTIONS.NAME RETURNS TYPE INSTEAD OF THE NAME OF THE COLLECTION-WL#10561 + /// + [Test] + public void NamesAreReturnedAsStrings() + { + session.SQL("DROP DATABASE IF EXISTS test").Execute(); + session.SQL("CREATE DATABASE test").Execute(); + using (Session mySession = new Session(ConnectionString)) + { + Schema test = mySession.GetSchema("test"); + ExecuteSQL("CREATE TABLE test1(id1 int,firstname varchar(20))"); + ExecuteSQL("INSERT INTO test1 values ('1','Rob')"); + ExecuteSQL("INSERT INTO test1 values ('2','Steve')"); + ExecuteSQL("CREATE TABLE test2(id2 int,lastname varchar(20))"); + ExecuteSQL("INSERT INTO test2 values ('1','Williams')"); + ExecuteSQL("INSERT INTO test2 values ('2','Waugh')"); + ExecuteSQL("CREATE VIEW view1 AS select * from test.test1"); + ExecuteSQL("SELECT * FROM view1"); + ExecuteSQL("CREATE VIEW view2 AS select * from test.test2"); + ExecuteSQL("SELECT * FROM view2"); + + List
tables = test.GetTables(); + Assert.That(tables.Count, Is.EqualTo(4)); + Assert.That(tables.FindAll(i => !i.IsView).Count, Is.EqualTo(2)); + Assert.That(tables.FindAll(i => i.IsView).Count, Is.EqualTo(2)); + ExecuteSelectStatement(tables[0].Select()); + ExecuteSelectStatement(tables[1].Select()); + ExecuteSelectStatement(tables[2].Select()); + ExecuteSelectStatement(tables[3].Select()); + Assert.That(tables[0].Name, Is.EqualTo("test1")); + Assert.That(tables[1].Name, Is.EqualTo("test2")); + Assert.That(tables[2].Name, Is.EqualTo("view1")); + Assert.That(tables[3].Name, Is.EqualTo("view2")); + + Table table = test.GetTable("test2"); + Assert.That(table.Name, Is.EqualTo("test2")); + + Collection c = test.CreateCollection("coll"); + + List collections = test.GetCollections(); + Assert.That(collections, Has.One.Items); + Assert.That(collections[0].Name, Is.EqualTo("coll")); + + Collection collection = test.GetCollection("coll"); + Assert.That(collection.Name, Is.EqualTo("coll")); + } + } + + #region WL14389 + + [Test, Description("Column Default Datatypes")] + public void ColumnDefaultDatatypes() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + session.SQL($"USE {schemaName}").Execute(); + session.SQL("Drop table if exists address").Execute(); + session.SQL("CREATE TABLE address" + + "(address_number1 TINYINT NOT NULL AUTO_INCREMENT, " + + "address_number2 SMALLINT NOT NULL, " + + "address_number3 MEDIUMINT NOT NULL, " + + "address_number4 INT NOT NULL, " + + "address_number5 BIGINT NOT NULL, " + + "address_number6 FLOAT(10) NOT NULL, " + + "address_number7 FLOAT(10,2) NOT NULL, " + + "address_number8 DOUBLE(10,2) NOT NULL, " + + "address_number9 DECIMAL(6,4) NOT NULL, " + + "address_number10 BIT NOT NULL, " + + "building_name1 CHAR(100) NOT NULL, " + + "building_name2 VARCHAR(100) NOT NULL, " + + "building_name3 TINYTEXT NOT NULL, " + + "building_name4 MEDIUMTEXT NOT NULL, " + + "building_name5 LONGTEXT NOT NULL, " + + "building_name6 BINARY NOT NULL, " + + "building_name7 VARBINARY(120) NOT NULL, " + + "building_name8 BLOB NOT NULL, " + + "building_name9 MEDIUMBLOB NOT NULL, " + + "building_name10 LONGBLOB NOT NULL, " + + "building_name11 ENUM('x-small', 'small', 'medium', 'large', 'x-large') NOT NULL, " + + "building_name12 SET('x-small', 'small', 'medium', 'large', 'x-large') NOT NULL, " + + "building_name13 DATE NOT NULL, " + + "building_name14 DATETIME(6) NOT NULL, " + + "building_name15 TIME NOT NULL, " + + "building_name16 TIMESTAMP NOT NULL, " + + "building_name17 YEAR NOT NULL, " + + "PRIMARY KEY (address_number1)" + ");").Execute(); + session.SQL("INSERT INTO address" + + "(address_number1,address_number2,address_number3,address_number4,address_number5,address_number6,address_number7,address_number8,address_number9,address_number10,building_name1,building_name2,building_name3,building_name4,building_name5,building_name6,building_name7,building_name8,building_name9,building_name10,building_name11,building_name12,building_name13,building_name14,building_name15,building_name16,building_name17)" + + " VALUES " + + "(1,1000,100,500,1000000000000,22.7,81.80,10.9,10,0,'BGL','TEST','ABCDEFGHIJKLMNOPQRSTUVWXYZ' ,'A','CHECK',0,256,0,128,256,'large','medium','1000-01-01','2012-11-12 13:54:00.12345678','838:59:59','20160316153000','2100');").Execute(); + string[] columns = new string[] { "address_number1", "address_number2", "address_number3", + "address_number4","address_number5","address_number6","address_number7","address_number8","address_number9","address_number10", + "building_name1","building_name2","building_name3","building_name4","building_name5","building_name6","building_name7", + "building_name8","building_name9","building_name10","building_name11","building_name12","building_name13","building_name14", + "building_name15","building_name16","building_name17"}; + uint[] Length = new uint[] { 4, 6, 9, 11, 20, 12, 10, 10, 8, 1, 100, 100, 255, 16777215, 4294967295, 1, 120, 65535, 16777215, 4294967295, 7, 34, 10, 26, 10, 19, 4 }; + string[] columnTypeMatch = new string[] { "Tinyint", "Smallint", "Mediumint", "Int", "Bigint", "Float", "Float", + "Double", "Decimal", "Bit", "String", "String", "String", "String", "String", "Bytes", "Bytes", "Bytes", + "Bytes", "Bytes", "Enum", "Set", "Date", "DateTime", "Time", "Timestamp", "Smallint" }; + uint[] FDLength = new uint[] { 0, 0, 0, 0, 0, 31, 2, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + string[] columnIsSignedMatch = new string[] { "True", "True", "True", "True", "True", "False", "False", + "False", "False", "False", "False", "False", "False", "False", "False", "False", "False", "False", "False", + "False", "False", "False", "False", "False", "False", "False", "False" }; + string[] columnIsPaddedMatch = new string[] { "False", "False", "False", "False", "False", "False", "False", + "False", "False", "False", "True", "False", "False", "False", "False", "True", "False", "False", "False", + "False", "False", "False", "False", "False", "False", "False", "False" }; + + string[] clrTypeMatch = new string[] { "System.SByte", "System.Int16", "System.Int32", "System.Int32", "System.Int64", "System.Single", "System.Single", + "System.Double", "System.Decimal", "System.UInt64", "System.String", "System.String", "System.String", "System.String", "System.String", "System.Byte[]", "System.Byte[]", "System.Byte[]", + "System.Byte[]", "System.Byte[]", "System.String", "System.String", "System.DateTime", "System.DateTime", "System.TimeSpan", "System.DateTime", "System.UInt16" }; + RowResult result = session.GetSchema(schemaName).GetTable("address").Select(columns).Execute(); + + for (int i = 0; i < columns.Length; i++) + { + var tableType = result.Columns[i].Type; + Assert.That(tableType.ToString(), Is.EqualTo(columnTypeMatch[i]), "Matching the table Type"); + string tableLabel = result.Columns[i].TableLabel; + Assert.That(tableLabel, Is.EqualTo("address"), "Matching the table label"); + string columnName = result.Columns[i].ColumnName; + Assert.That(columnName, Is.EqualTo(columns[i].ToString()), "Matching the Column Name"); + string columnLabel = result.Columns[i].ColumnLabel; + Assert.That(columnLabel, Is.EqualTo(columns[i].ToString()), "Matching the Column Label"); + uint columnLength = result.Columns[i].Length; + Assert.That(columnLength, Is.EqualTo(columnLength), "Matching the Column Length"); + var columnType = result.Columns[i].Type; + Assert.That(columnType.ToString(), Is.EqualTo(columnTypeMatch[i]), "Matching the Column Type"); + var columnFD = result.Columns[i].FractionalDigits; + Assert.That(columnFD, Is.EqualTo(FDLength[i]), "Matching the Column FD"); + var columnIsSigned = result.Columns[i].IsNumberSigned; + Assert.That(columnIsSigned.ToString(), Is.EqualTo(columnIsSignedMatch[i]), "Matching whether column is signed or not"); + string columnCollation = result.Columns[i].CollationName; + if (i == 10 || i == 11 || i == 12 || i == 13 || i == 14 || i == 20 || i == 21) + Assert.That(columnCollation, Is.EqualTo(columnCollation), "Matching the Collation Name for default characters"); + else if (i == 15 || i == 16 || i == 17 || i == 18 || i == 19) + Assert.That(columnCollation, Is.EqualTo("binary"), "Matching the Collation Name for default characters"); + else + Assert.That(columnCollation, Is.EqualTo(null), "Matching the Collation Name as null for data types other than characters"); + string columnCharacterSet = result.Columns[i].CharacterSetName; + if (i == 10 || i == 11 || i == 12 || i == 13 || i == 14 || i == 20 || i == 21) + Assert.That(columnCharacterSet, Is.EqualTo(columnCharacterSet), "Matching the CharacterSet Name for default characters"); + else if (i == 15 || i == 16 || i == 17 || i == 18 || i == 19) + Assert.That(columnCharacterSet, Is.EqualTo("binary"), "Matching the Collation Name for default characters"); + else + Assert.That(columnCharacterSet, Is.EqualTo(null), "Matching the Collation Name as null for data types other than characters"); + var columnIsPadded = result.Columns[i].IsPadded; + Assert.That(columnIsPadded.ToString(), Is.EqualTo(columnIsPaddedMatch[i]), "Matching whether column is padded or not"); + var columnClrType = result.Columns[i].ClrType; + Assert.That(columnClrType.ToString(), Is.EqualTo(clrTypeMatch[i]), "Matching whether column CLR Type"); + } + } + + [Test, Description("Column Custom Datatypes(Unsigned,Padded,CharacterSet,Collation)")] + public void ColumnCustomDatatypes() + { + Assume.That(session.Version.isAtLeast(8, 0, 14), "This test is for MySql 8.0.14 or higher"); + var defaultCharset = "utf8mb4"; + session.SQL($"USE {schemaName}").Execute(); + session.SQL("CREATE TABLE IF NOT EXISTS address" + + "(address_number1 TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, " + + "address_number2 SMALLINT ZEROFILL NOT NULL, " + + "address_number3 MEDIUMINT NOT NULL, " + + "address_number4 INT UNSIGNED NOT NULL, " + + "address_number5 BIGINT NOT NULL, " + + "address_number6 FLOAT(10) NOT NULL, " + + "address_number7 FLOAT(10,2) NOT NULL, " + + "address_number8 DOUBLE(10,2) NOT NULL, " + + "address_number9 DECIMAL(6,4) NOT NULL, " + + "address_number10 BIT NOT NULL, " + + "building_name1 CHAR(100) NOT NULL, " + + "building_name2 VARCHAR(100) NOT NULL, " + + "building_name3 TINYTEXT NOT NULL, " + + "building_name4 MEDIUMTEXT NOT NULL, " + + "building_name5 LONGTEXT NOT NULL, " + + "building_name6 BINARY NOT NULL, " + + "building_name7 VARBINARY(120) NOT NULL, " + + "building_name8 BLOB NOT NULL, " + + "building_name9 MEDIUMBLOB NOT NULL, " + + "building_name10 LONGBLOB NOT NULL, " + + "building_name11 ENUM('x-small', 'small', 'medium', 'large', 'x-large') NOT NULL, " + + "building_name12 SET('x-small', 'small', 'medium', 'large', 'x-large') NOT NULL, " + + "building_name13 DATE NOT NULL, " + + "building_name14 DATETIME(6) NOT NULL, " + + "building_name15 TIME NOT NULL, " + + "building_name16 TIMESTAMP NOT NULL, " + + "building_name17 YEAR NOT NULL, " + + "PRIMARY KEY (address_number1)" + ")CHARACTER SET latin1 COLLATE latin1_danish_ci;").Execute(); + session.SQL("INSERT INTO address" + + "(address_number1,address_number2,address_number3,address_number4,address_number5,address_number6,address_number7,address_number8,address_number9,address_number10,building_name1,building_name2,building_name3,building_name4,building_name5,building_name6,building_name7,building_name8,building_name9,building_name10,building_name11,building_name12,building_name13,building_name14,building_name15,building_name16,building_name17)" + + " VALUES " + + "(0,1000,100,0,1000000000000,22.7,81.8,10.9,10,0,'BGL','TEST','ABCDEFGHIJKLMNOPQRSTUVWXYZ' ,'A','CHECK',0,256,0,128,256,'large','medium','1000-01-01','2012-11-12 13:54:00.12345678','838:59:59','20160316153000','2100');").Execute(); + string[] columns = new string[] { "address_number1", "address_number2", "address_number3", + "address_number4","address_number5","address_number6","address_number7","address_number8","address_number9","address_number10", + "building_name1","building_name2","building_name3","building_name4","building_name5","building_name6","building_name7", + "building_name8","building_name9","building_name10","building_name11","building_name12","building_name13","building_name14", + "building_name15","building_name16","building_name17"}; + uint[] Length = new uint[] { 3, 5, 9, 10, 20, 12, 10, 10, 8, 1, 100, 100, 255, 16777215, 4294967295, 1, 120, 65535, 16777215, 4294967295, 0, 0, 10, 26, 10, 19, 4 }; + string[] columnTypeMatch = new string[] { "Tinyint", "Smallint", "Mediumint", "Int", "Bigint", "Float", "Float", + "Double", "Decimal", "Bit", "String", "String", "String", "String", "String", "Bytes", "Bytes", "Bytes", + "Bytes", "Bytes", "Enum", "Set", "Date", "DateTime", "Time", "Timestamp", "Smallint" }; + uint[] FDLength = new uint[] { 0, 0, 0, 0, 0, 31, 2, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + string[] columnIsSignedMatch = new string[] { "False", "False", "True", "False", "True", "False", "False", + "False", "False", "False", "False", "False", "False", "False", "False", "False", "False", "False", "False", + "False", "False", "False", "False", "False", "False", "False", "False" }; + string[] columnIsPaddedMatch = new string[] { "False", "True", "False", "False", "False", "False", "False", + "False", "False", "False", "True", "False", "False", "False", "False", "True", "False", "False", "False", + "False", "False", "False", "False", "False", "False", "False", "False" }; + + string[] clrTypeMatch = new string[] { "System.Byte", "System.UInt16", "System.Int32", "System.UInt32", "System.Int64", "System.Single", "System.Single", + "System.Double", "System.Decimal", "System.UInt64", "System.String", "System.String", "System.String", "System.String", "System.String", "System.Byte[]", "System.Byte[]", "System.Byte[]", + "System.Byte[]", "System.Byte[]", "System.String", "System.String", "System.DateTime", "System.DateTime", "System.TimeSpan", "System.DateTime", "System.UInt16" }; + RowResult result = session.GetSchema(schemaName).GetTable("address").Select(columns).Execute(); + + for (int i = 0; i < columns.Length; i++) + { + string tableLabel = result.Columns[i].TableLabel; + Assert.That(tableLabel, Is.EqualTo("address"), "Matching the table label"); + string columnName = result.Columns[i].ColumnName; + Assert.That(columnName, Is.EqualTo(columns[i].ToString()), "Matching the Column Name"); + string columnLabel = result.Columns[i].ColumnLabel; + Assert.That(columnLabel, Is.EqualTo(columns[i].ToString()), "Matching the Column Label"); + uint columnLength = result.Columns[i].Length; + Assert.That(columnLength, Is.EqualTo(Length[i]), "Matching the Column Length"); + var columnType = result.Columns[i].Type; + Assert.That(columnType.ToString(), Is.EqualTo(columnTypeMatch[i]), "Matching the Column Type"); + var columnFD = result.Columns[i].FractionalDigits; + Assert.That(columnFD, Is.EqualTo(FDLength[i]), "Matching the Column FD"); + var columnIsSigned = result.Columns[i].IsNumberSigned; + Assert.That(columnIsSigned.ToString(), Is.EqualTo(columnIsSignedMatch[i]), "Matching whether column is signed or not"); + string columnCollation = result.Columns[i].CollationName; + if (i == 10 || i == 11 || i == 12 || i == 13 || i == 14 || i == 20 || i == 21) + Assert.That(columnCollation, Is.EqualTo(columnCollation), "Matching the Collation Name for default characters"); + else if (i == 15 || i == 16 || i == 17 || i == 18 || i == 19) + Assert.That(columnCollation, Is.EqualTo("binary"), "Matching the Collation Name for default characters"); + else + Assert.That(columnCollation, Is.EqualTo(null), "Matching the Collation Name as null for data types other than characters"); + string columnCharacterSet = result.Columns[i].CharacterSetName; + if (i == 10 || i == 11 || i == 12 || i == 13 || i == 14 || i == 20 || i == 21) + Assert.That(columnCharacterSet, Is.EqualTo(defaultCharset).IgnoreCase, "Matching the CharacterSet Name for default characters"); + else if (i == 15 || i == 16 || i == 17 || i == 18 || i == 19) + Assert.That(columnCharacterSet, Is.EqualTo("binary"), "Matching the Collation Name for default characters"); + else + Assert.That(columnCharacterSet, Is.EqualTo(null), "Matching the Collation Name as null for data types other than characters"); + var columnIsPadded = result.Columns[i].IsPadded; + Assert.That(columnIsPadded.ToString(), Is.EqualTo(columnIsPaddedMatch[i]), "Matching whether column is padded or not"); + var columnClrType = result.Columns[i].ClrType; + Assert.That(columnClrType.ToString(), Is.EqualTo(clrTypeMatch[i]), "Matching whether column CLR Type"); + } + session.SQL($"drop table if exists address").Execute(); + } + + [Test, Description("Column Join Two tables")] + public void ColumnJoin() + { + Assume.That(session.Version.isAtLeast(8, 0, 14), "This test is for MySql 8.0.14 or higher"); + var defaultCharset = "utf8mb4"; + session.SQL($"USE {schemaName}").Execute(); + session.SQL("CREATE TABLE address1" + + "(address_number1 TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, " + + "address_number2 SMALLINT ZEROFILL NOT NULL, " + + "address_number3 CHAR(100) NOT NULL, " + + "PRIMARY KEY (address_number1)" + ");").Execute(); + session.SQL("CREATE TABLE address2" + + "(address_number4 INT UNSIGNED NOT NULL AUTO_INCREMENT, " + + "address_number5 BIGINT ZEROFILL NOT NULL, " + + "address_number6 CHAR(100) NOT NULL, " + + "PRIMARY KEY (address_number4)" + ");").Execute(); + session.SQL("INSERT INTO address1" + + "(address_number1,address_number2,address_number3)" + + " VALUES " + + "(1,1000,'ABCDEFGHIJKLMNOPQRSTUVWXYZ');").Execute(); + session.SQL("INSERT INTO address1" + + "(address_number1,address_number2,address_number3)" + + " VALUES " + + "(2,4000,'AEIOU');").Execute(); + session.SQL("INSERT INTO address2" + + "(address_number4,address_number5,address_number6)" + + " VALUES " + + "(1,2000,'TEST1ABCDEFGHIJKLMNOPQRSTUVWXYZ');").Execute(); + session.SQL("INSERT INTO address2" + + "(address_number4,address_number5,address_number6)" + + " VALUES " + + "(3,6000,'TEST1AEIOU');").Execute(); + session.SQL("CREATE TABLE result1 AS SELECT " + + "address1.address_number1, address1.address_number2, address1.address_number3, " + + "address2.address_number4, address2.address_number5,address2.address_number6 " + + "FROM address1,address2 " + + "WHERE address1.address_number1 = address2.address_number4;").Execute(); + session.SQL("CREATE TABLE result2 AS SELECT * FROM address1;").Execute(); + string[] columns1 = new string[] { "address_number1", "address_number2", "address_number3", "address_number4", "address_number5", "address_number6" }; + string[] columns2 = new string[] { "address_number1", "address_number2", "address_number3" }; + uint[] Length1 = new uint[] { 3, 5, 100, 10, 20, 100 }; + uint[] Length2 = new uint[] { 3, 5, 400 }; + string[] columnTypeMatch1 = new string[] { "Tinyint", "Smallint", "String", "Int", "Bigint", "String" }; + string[] columnTypeMatch2 = new string[] { "Tinyint", "Smallint", "String" }; + uint[] FDLength1 = new uint[] { 0, 0, 0, 0, 0, 0 }; + uint[] FDLength2 = new uint[] { 0, 0, 0 }; + string[] columnIsSignedMatch1 = new string[] { "False", "False", "False", "False", "False", "False" }; + string[] columnIsSignedMatch2 = new string[] { "False", "False", "False" }; + string[] columnIsPaddedMatch1 = new string[] { "False", "True", "True", "False", "True", "True" }; + string[] columnIsPaddedMatch2 = new string[] { "False", "True", "True" }; + string[] clrTypeMatch1 = new string[] { "System.Byte", "System.UInt16", "System.String", "System.UInt32", "System.UInt64", "System.String" }; + string[] clrTypeMatch2 = new string[] { "System.Byte", "System.UInt16", "System.String" }; + + RowResult result1 = session.GetSchema(schemaName).GetTable("result1").Select(columns1).Execute(); + RowResult result2 = session.GetSchema(schemaName).GetTable("result2").Select(columns2).Execute(); + for (int i = 0; i < columns1.Length; i++) + { + string tableName = result1.Columns[i].TableName; + Assert.That(tableName, Is.EqualTo("result1"), "Matching the table name"); + string tableLabel = result1.Columns[i].TableLabel; + Assert.That(tableLabel, Is.EqualTo("result1"), "Matching the table label"); + string columnName = result1.Columns[i].ColumnName; + Assert.That(columnName, Is.EqualTo(columns1[i].ToString()), "Matching the Column Name"); + string columnLabel = result1.Columns[i].ColumnLabel; + Assert.That(columnLabel, Is.EqualTo(columns1[i].ToString()), "Matching the Column Label"); + uint columnLength = result1.Columns[i].Length; + Assert.That(Length1[i], Is.EqualTo(Length1[i]), "Matching the Column Length"); + var columnType = result1.Columns[i].Type; + Assert.That(columnType.ToString(), Is.EqualTo(columnTypeMatch1[i]), "Matching the Column Type"); + var columnFD = result1.Columns[i].FractionalDigits; + Assert.That(columnFD, Is.EqualTo(FDLength1[i]), "Matching the Column FD"); + var columnIsSigned = result1.Columns[i].IsNumberSigned; + Assert.That(columnIsSigned.ToString(), Is.EqualTo(columnIsSignedMatch1[i]), "Matching whether column is signed or not"); + string columnCollation = result1.Columns[i].CollationName; + if (i == 2 || i == 5) + { + Assert.That(columnCollation, Does.Contain(defaultCharset), "Matching the Collation Name for default characters"); + } + else + { + Assert.That(columnCollation, Is.EqualTo(null), "Matching the Collation Name as null for data types other than characters"); + } + string columnCharacterSet = result1.Columns[i].CharacterSetName; + if (i == 2 || i == 5) + Assert.That(columnCharacterSet, Is.EqualTo(defaultCharset).IgnoreCase, "Matching the CharacterSet Name for default characters"); + else + Assert.That(columnCharacterSet, Is.EqualTo(null), "Matching the Collation Name as null for data types other than characters"); + var columnIsPadded = result1.Columns[i].IsPadded; + Assert.That(columnIsPadded.ToString(), Is.EqualTo(columnIsPaddedMatch1[i]), "Matching whether column is padded or not"); + var columnClrType = result1.Columns[i].ClrType; + Assert.That(columnClrType.ToString(), Is.EqualTo(clrTypeMatch1[i]), "Matching whether column CLR Type"); + } + + for (int i = 0; i < columns2.Length; i++) + { + string tableName = result2.Columns[i].TableName; + Assert.That(tableName, Is.EqualTo("result2"), "Matching the table name"); + string tableLabel = result2.Columns[i].TableLabel; + Assert.That(tableLabel, Is.EqualTo("result2"), "Matching the table label"); + string columnName = result2.Columns[i].ColumnName; + Assert.That(columnName, Is.EqualTo(columns2[i].ToString()), "Matching the Column Name"); + string columnLabel = result2.Columns[i].ColumnLabel; + Assert.That(columnLabel, Is.EqualTo(columns2[i].ToString()), "Matching the Column Label"); + uint columnLength = result2.Columns[i].Length; + Assert.That(columnLength, Is.EqualTo(Length2[i]), "Matching the Column Length"); + var columnType = result2.Columns[i].Type; + Assert.That(columnType.ToString(), Is.EqualTo(columnTypeMatch2[i]), "Matching the Column Type"); + var columnFD = result2.Columns[i].FractionalDigits; + Assert.That(columnFD, Is.EqualTo(FDLength2[i]), "Matching the Column FD"); + var columnIsSigned = result2.Columns[i].IsNumberSigned; + Assert.That(columnIsSigned.ToString(), Is.EqualTo(columnIsSignedMatch2[i]), "Matching whether column is signed or not"); + string columnCollation = result2.Columns[i].CollationName; + if (i == 2) + Assert.That(columnCollation, Does.Contain(defaultCharset), "Matching the Collation Name for default characters"); + else + Assert.That(columnCollation, Is.EqualTo(null), "Matching the Collation Name as null for data types other than characters"); + string columnCharacterSet = result2.Columns[i].CharacterSetName; + if (i == 2) + Assert.That(columnCharacterSet, Is.EqualTo(defaultCharset).IgnoreCase, "Matching the CharacterSet Name for default characters"); + else + Assert.That(columnCharacterSet, Is.EqualTo(null), "Matching the Collation Name as null for data types other than characters"); + var columnIsPadded = result2.Columns[i].IsPadded; + Assert.That(columnIsPadded.ToString(), Is.EqualTo(columnIsPaddedMatch2[i]), "Matching whether column is padded or not"); + var columnClrType = result2.Columns[i].ClrType; + Assert.That(columnClrType.ToString(), Is.EqualTo(clrTypeMatch2[i]), "Matching whether column CLR Type"); + } + + session.SQL("DROP TABLE if exists test").Execute(); + session.SQL("CREATE TABLE test(b VARCHAR(255) )").Execute(); + session.SQL("INSERT INTO test VALUES('Bob')").Execute(); + result2 = session.GetSchema(schemaName).GetTable("test").Select("1 + 1 as a", "b").Execute(); + var rows = result2.FetchAll(); + Assert.That(result2.Columns.Count, Is.EqualTo(2), "Matching Column Count"); + + Assert.That(result2.Columns[0].SchemaName, Is.EqualTo(null), "Matching Column Schema Name"); + Assert.That(result2.Columns[0].TableName, Is.EqualTo(null), "Matching Column Table Name"); + Assert.That(result2.Columns[0].TableLabel, Is.EqualTo(null), "Matching Column Table Label"); + Assert.That(result2.Columns[0].ColumnName, Is.EqualTo(null), "Matching Column Name"); + Assert.That(result2.Columns[0].ColumnLabel, Is.EqualTo("a"), "Matching Column Label"); + Assert.That(result2.Columns[0].Type.ToString(), Is.EqualTo("Tinyint"), "Matching Column Type"); + Assert.That(result2.Columns[0].Length, Is.EqualTo(3u), "Matching Column Length"); + Assert.That(result2.Columns[0].FractionalDigits, Is.EqualTo(0u), "Matching Column FD"); + Assert.That(result2.Columns[0].IsNumberSigned, Is.EqualTo(true), "Matching Column Is Signed"); + Assert.That(result2.Columns[0].CharacterSetName, Is.EqualTo(null), "Matching Character Set Name"); + Assert.That(result2.Columns[0].CollationName, Is.EqualTo(null), "Matching Collation Name"); + Assert.That(result2.Columns[0].IsPadded, Is.EqualTo(false), "Matching Column Padded"); + + Assert.That(result2.Columns[1].SchemaName, Is.EqualTo(schemaName), "Matching Column Schema Name"); + Assert.That(result2.Columns[1].TableName, Is.EqualTo("test"), "Matching Column Table Name"); + Assert.That(result2.Columns[1].TableLabel, Is.EqualTo("test"), "Matching Column Table Label"); + Assert.That(result2.Columns[1].ColumnName, Is.EqualTo("b"), "Matching Column Name"); + Assert.That(result2.Columns[1].ColumnLabel, Is.EqualTo("b"), "Matching Column Label"); + Assert.That(result2.Columns[1].Type.ToString(), Is.EqualTo("String"), "Matching Column Type"); + Assert.That(result2.Columns[1].Length, Is.EqualTo(1020u), "Matching Column Length"); + Assert.That(result2.Columns[1].FractionalDigits, Is.EqualTo(0u), "Matching Column FD"); + Assert.That(result2.Columns[1].IsNumberSigned, Is.EqualTo(false), "Matching Column Is Signed"); + Assert.That(result2.Columns[1].CharacterSetName, Is.EqualTo(defaultCharset), "Matching Character Set Name"); + Assert.That(result2.Columns[1].CollationName, Does.Contain(defaultCharset), "Matching Collation Name"); + Assert.That(result2.Columns[1].IsPadded, Is.EqualTo(false), "Matching Column Padded"); + + session.SQL("create table test1(c1 int,c2 double GENERATED ALWAYS AS (c1*101/102) Stored COMMENT 'First Gen Col',c3 Json GENERATED ALWAYS AS (concat('{\"F1\":',c1,'}')) VIRTUAL COMMENT 'Second Gen /**/Col', c4 bigint GENERATED ALWAYS as (c1*10000) VIRTUAL UNIQUE KEY Comment '3rd Col' NOT NULL)").Execute(); + session.SQL("insert into test1(c1) values(1000)").Execute(); + result2 = session.GetSchema(schemaName).GetTable("test1").Select("c1").Execute(); + + Assert.That(result2.Columns[0].SchemaName, Is.EqualTo(schemaName), "Matching Column Schema Name"); + Assert.That(result2.Columns[0].TableName, Is.EqualTo("test1"), "Matching Column Table Name"); + Assert.That(result2.Columns[0].TableLabel, Is.EqualTo("test1"), "Matching Column Table Label"); + Assert.That(result2.Columns[0].ColumnName, Is.EqualTo("c1"), "Matching Column Name"); + Assert.That(result2.Columns[0].ColumnLabel, Is.EqualTo("c1"), "Matching Column Label"); + Assert.That(result2.Columns[0].Type.ToString(), Is.EqualTo("Int"), "Matching Column Type"); + Assert.That(result2.Columns[0].Length, Is.EqualTo(11), "Matching Column Length"); + Assert.That(result2.Columns[0].FractionalDigits, Is.EqualTo(0u), "Matching Column FD"); + Assert.That(result2.Columns[0].IsNumberSigned, Is.EqualTo(true), "Matching Column Is Signed"); + Assert.That(result2.Columns[0].CharacterSetName, Is.EqualTo(null), "Matching Character Set Name"); + Assert.That(result2.Columns[0].CollationName, Is.EqualTo(null), "Matching Collation Name"); + Assert.That(result2.Columns[0].IsPadded, Is.EqualTo(false), "Matching Column Padded"); + + result2 = session.GetSchema(schemaName).GetTable("test1").Select("c2").Execute(); + + Assert.That(result2.Columns[0].SchemaName, Is.EqualTo(schemaName), "Matching Column Schema Name"); + Assert.That(result2.Columns[0].TableName, Is.EqualTo("test1"), "Matching Column Table Name"); + Assert.That(result2.Columns[0].TableLabel, Is.EqualTo("test1"), "Matching Column Table Label"); + Assert.That(result2.Columns[0].ColumnName, Is.EqualTo("c2"), "Matching Column Name"); + Assert.That(result2.Columns[0].ColumnLabel, Is.EqualTo("c2"), "Matching Column Label"); + Assert.That(result2.Columns[0].Type.ToString(), Is.EqualTo("Double"), "Matching Column Type"); + Assert.That(result2.Columns[0].Length, Is.EqualTo(22), "Matching Column Length"); + Assert.That(result2.Columns[0].FractionalDigits, Is.EqualTo(31), "Matching Column FD"); + Assert.That(result2.Columns[0].IsNumberSigned, Is.EqualTo(false), "Matching Column Is Signed"); + Assert.That(result2.Columns[0].CharacterSetName, Is.EqualTo(null), "Matching Character Set Name"); + Assert.That(result2.Columns[0].CollationName, Is.EqualTo(null), "Matching Collation Name"); + Assert.That(result2.Columns[0].IsPadded, Is.EqualTo(false), "Matching Column Padded"); + + result2 = session.GetSchema(schemaName).GetTable("test1").Select("c3").Execute(); + + Assert.That(result2.Columns[0].SchemaName, Is.EqualTo(schemaName), "Matching Column Schema Name"); + Assert.That(result2.Columns[0].TableName, Is.EqualTo("test1"), "Matching Column Table Name"); + Assert.That(result2.Columns[0].TableLabel, Is.EqualTo("test1"), "Matching Column Table Label"); + Assert.That(result2.Columns[0].ColumnName, Is.EqualTo("c3"), "Matching Column Name"); + Assert.That(result2.Columns[0].ColumnLabel, Is.EqualTo("c3"), "Matching Column Label"); + Assert.That(result2.Columns[0].Type.ToString(), Is.EqualTo("Json"), "Matching Column Type"); + Assert.That(result2.Columns[0].Length, Is.EqualTo(4294967295), "Matching Column Length"); + Assert.That(result2.Columns[0].FractionalDigits, Is.EqualTo(0u), "Matching Column FD"); + Assert.That(result2.Columns[0].IsNumberSigned, Is.EqualTo(false), "Matching Column Is Signed"); + Assert.That(result2.Columns[0].CharacterSetName, Is.EqualTo("binary"), "Matching Character Set Name"); + Assert.That(result2.Columns[0].CollationName, Is.EqualTo("binary"), "Matching Collation Name"); + Assert.That(result2.Columns[0].IsPadded, Is.EqualTo(false), "Matching Column Padded"); + + result2 = session.GetSchema(schemaName).GetTable("test1").Select("c4").Execute(); + + Assert.That(result2.Columns[0].SchemaName, Is.EqualTo(schemaName), "Matching Column Schema Name"); + Assert.That(result2.Columns[0].TableName, Is.EqualTo("test1"), "Matching Column Table Name"); + Assert.That(result2.Columns[0].TableLabel, Is.EqualTo("test1"), "Matching Column Table Label"); + Assert.That(result2.Columns[0].ColumnName, Is.EqualTo("c4"), "Matching Column Name"); + Assert.That(result2.Columns[0].ColumnLabel, Is.EqualTo("c4"), "Matching Column Label"); + Assert.That(result2.Columns[0].Type.ToString(), Is.EqualTo("Bigint"), "Matching Column Type"); + Assert.That(result2.Columns[0].Length, Is.EqualTo(20), "Matching Column Length"); + Assert.That(result2.Columns[0].FractionalDigits, Is.EqualTo(0u), "Matching Column FD"); + Assert.That(result2.Columns[0].IsNumberSigned, Is.EqualTo(true), "Matching Column Is Signed"); + Assert.That(result2.Columns[0].CharacterSetName, Is.EqualTo(null), "Matching Character Set Name"); + Assert.That(result2.Columns[0].CollationName, Is.EqualTo(null), "Matching Collation Name"); + Assert.That(result2.Columns[0].IsPadded, Is.EqualTo(false), "Matching Column Padded"); + + session.SQL("DROP TABLE if exists test").Execute(); + session.SQL("DROP TABLE if exists test1").Execute(); + session.SQL("DROP TABLE if exists result1").Execute(); + session.SQL("DROP TABLE if exists result2").Execute(); + session.SQL("DROP TABLE if exists address1").Execute(); + session.SQL("DROP TABLE if exists address2").Execute(); + } + + [Test, Description("Column Character Default Datatype")] + public void ColumnCharacterDefaultDatatype() + { + if (!_serverVersion.isAtLeast(5, 7, 0)) return; + session.SQL($"USE {schemaName}").Execute(); + session.SQL("Drop table if exists address").Execute(); + session.SQL("CREATE TABLE address" + + "(address_number1 TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, " + + "building_name1 CHAR(100) NOT NULL, " + + "building_name2 VARCHAR(100) NOT NULL, " + + "building_name3 TINYTEXT NOT NULL, " + + "building_name4 MEDIUMTEXT NOT NULL, " + + "building_name5 LONGTEXT NOT NULL, " + + "PRIMARY KEY (address_number1)" + ");").Execute(); + session.SQL("INSERT INTO address" + + "(address_number1,building_name1,building_name2,building_name3,building_name4,building_name5)" + + " VALUES " + + "(1,'MYSQLDEVTEAM','ORACLETECHPARK1','SURVEYNUMBER1','TEST','TEST123');").Execute(); + string[] columns = new string[] { "address_number1", + "building_name1","building_name2","building_name3","building_name4","building_name5"}; + uint[] Length = new uint[] { 3, 100, 100, 255, 16777215, 4294967295 }; + string[] columnTypeMatch = new string[] { "Tinyint", "String", "String", "String", "String", "String" }; + uint[] FDLength = new uint[] { 0, 0, 0, 0, 0, 0 }; + string[] columnIsSignedMatch = new string[] { "False", "False", "False", "False", "False", "False" }; + string[] columnIsPaddedMatch = new string[] { "False", "True", "False", "False", "False", "False" }; + string[] clrTypeMatch = new string[] { "System.Byte", "System.String", "System.String", "System.String", "System.String", "System.String" }; + RowResult result = session.GetSchema(schemaName).GetTable("address").Select(columns).Execute(); + + for (int i = 0; i < columns.Length; i++) + { + string tableLabel = result.Columns[i].TableLabel; + Assert.That(tableLabel, Is.EqualTo("address"), "Matching the table label"); + string columnName = result.Columns[i].ColumnName; + Assert.That(columnName, Is.EqualTo(columns[i].ToString()), "Matching the Column Name"); + string columnLabel = result.Columns[i].ColumnLabel; + Assert.That(columnLabel, Is.EqualTo(columns[i].ToString()), "Matching the Column Label"); + uint columnLength = result.Columns[i].Length; + Assert.That(columnLength, Is.EqualTo(columnLength), "Matching the Column Length"); + var columnType = result.Columns[i].Type; + Assert.That(columnType.ToString(), Is.EqualTo(columnTypeMatch[i]), "Matching the Column Type"); + var columnFD = result.Columns[i].FractionalDigits; + Assert.That(columnFD, Is.EqualTo(FDLength[i]), "Matching the Column FD"); + var columnIsSigned = result.Columns[i].IsNumberSigned; + Assert.That(columnIsSigned.ToString(), Is.EqualTo(columnIsSignedMatch[i]), "Matching whether column is signed or not"); + string columnCollation = result.Columns[i].CollationName; + if (i == 1 || i == 2 || i == 3 || i == 4 || i == 5) + Assert.That(columnCollation, Is.EqualTo(columnCollation), "Matching the Collation Name for default characters"); + else + Assert.That(columnCollation, Is.EqualTo(null), "Matching the Collation Name as null for data types other than characters"); + string columnCharacterSet = result.Columns[i].CharacterSetName; + if (i == 1 || i == 2 || i == 3 || i == 4 || i == 5) + Assert.That(columnCharacterSet, Is.EqualTo(columnCharacterSet), "Matching the CharacterSet Name for default characters"); + else + Assert.That(columnCharacterSet, Is.EqualTo(null), "Matching the Collation Name as null for data types other than characters"); + var columnIsPadded = result.Columns[i].IsPadded; + Assert.That(columnIsPadded.ToString(), Is.EqualTo(columnIsPaddedMatch[i]), "Matching whether column is padded or not"); + var columnClrType = result.Columns[i].ClrType; + Assert.That(columnClrType.ToString(), Is.EqualTo(clrTypeMatch[i]), "Matching whether column CLR Type"); + } + session.SQL("DROP TABLE if exists address").Execute(); + } + + [Test, Description("Column Character Custom Datatype")] + public void ColumnCharacterCustomDatatype() + { + Assume.That(session.Version.isAtLeast(8, 0, 14), "This test is for MySql 8.0.14 or higher"); + var defaultCharset = "utf8mb4"; + session.SQL($"USE {schemaName}").Execute(); + session.SQL("Drop table if exists address").Execute(); + session.SQL("CREATE TABLE address" + + "(address_number1 TINYINT UNSIGNED NOT NULL AUTO_INCREMENT, " + + "building_name1 CHAR(100) NOT NULL, " + + "building_name2 VARCHAR(100) NOT NULL, " + + "building_name3 TINYTEXT NOT NULL, " + + "building_name4 MEDIUMTEXT NOT NULL, " + + "building_name5 LONGTEXT NOT NULL, " + + "PRIMARY KEY (address_number1)" + ")CHARACTER SET big5 COLLATE big5_chinese_ci;").Execute(); + session.SQL("INSERT INTO address" + + "(address_number1,building_name1,building_name2,building_name3,building_name4,building_name5)" + + " VALUES " + + "(1,'MYSQLDEVTEAM','ORACLETECHPARK1','SURVEYNUMBER1','TEST','TEST123');").Execute(); + string[] columns = new string[] { "address_number1", + "building_name1","building_name2","building_name3","building_name4","building_name5"}; + uint[] Length = new uint[] { 3, 200, 200, 255, 16777215, 4294967295 }; + string[] columnTypeMatch = new string[] { "Tinyint", "String", "String", "String", "String", "String" }; + uint[] FDLength = new uint[] { 0, 0, 0, 0, 0, 0 }; + string[] columnIsSignedMatch = new string[] { "False", "False", "False", "False", "False", "False" }; + string[] columnIsPaddedMatch = new string[] { "False", "True", "False", "False", "False", "False" }; + string[] clrTypeMatch = new string[] { "System.Byte", "System.String", "System.String", "System.String", "System.String", "System.String" }; + RowResult result = session.GetSchema(schemaName).GetTable("address").Select(columns).Execute(); + + for (int i = 0; i < columns.Length; i++) + { + string tableLabel = result.Columns[i].TableLabel; + Assert.That(tableLabel, Is.EqualTo("address"), "Matching the table label"); + string columnName = result.Columns[i].ColumnName; + Assert.That(columnName, Is.EqualTo(columns[i].ToString()), "Matching the Column Name"); + string columnLabel = result.Columns[i].ColumnLabel; + Assert.That(columnLabel, Is.EqualTo(columns[i].ToString()), "Matching the Column Label"); + uint columnLength = result.Columns[i].Length; + Assert.That(columnLength, Is.EqualTo(Length[i]), "Matching the Column Length"); + var columnType = result.Columns[i].Type; + Assert.That(columnType.ToString(), Is.EqualTo(columnTypeMatch[i]), "Matching the Column Type"); + var columnFD = result.Columns[i].FractionalDigits; + Assert.That(columnFD, Is.EqualTo(FDLength[i]), "Matching the Column FD"); + var columnIsSigned = result.Columns[i].IsNumberSigned; + Assert.That(columnIsSigned.ToString(), Is.EqualTo(columnIsSignedMatch[i]), "Matching whether column is signed or not"); + string columnCollation = result.Columns[i].CollationName; + if (i == 1 || i == 2 || i == 3 || i == 4 || i == 5) + Assert.That(columnCollation, Does.Contain(defaultCharset), "Matching the Collation Name for big5_chinese_ci characters"); + else + Assert.That(columnCollation, Is.EqualTo(null), "Matching the Collation Name as null for data types other than characters"); + string columnCharacterSet = result.Columns[i].CharacterSetName; + if (i == 1 || i == 2 || i == 3 || i == 4 || i == 5) + Assert.That(columnCharacterSet, Is.EqualTo(defaultCharset).IgnoreCase, "Matching the CharacterSet Name for big5 characters"); + else + Assert.That(columnCharacterSet, Is.EqualTo(null), "Matching the Collation Name as null for data types other than characters"); + var columnIsPadded = result.Columns[i].IsPadded; + Assert.That(columnIsPadded.ToString(), Is.EqualTo(columnIsPaddedMatch[i]), "Matching whether column is padded or not"); + var columnClrType = result.Columns[i].ClrType; + Assert.That(columnClrType.ToString(), Is.EqualTo(clrTypeMatch[i]), "Matching whether column CLR Type"); + } + session.SQL("Drop table if exists address").Execute(); + } + + [Test, Description("Column Geometric Datatypes")] + public void ColumnCharacterGeometricDatatype() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + session.SQL($"USE {schemaName}").Execute(); + session.SQL($"drop table if exists geotest").Execute(); + session.SQL("CREATE TABLE geotest (g GEOMETRY,p POINT,l LINESTRING,po POLYGON,mp MULTIPOINT,ml MULTILINESTRING,mpo MULTIPOLYGON,gc GEOMETRYCOLLECTION);").Execute(); + string[] columns = new string[] { "g", "p", "l", "po", "mp", "ml", "mpo", "gc" }; + RowResult result = session.GetSchema(schemaName).GetTable("geotest").Select(columns).Execute(); + for (int i = 0; i < columns.Length; i++) + { + string tableName = result.Columns[i].TableName; + Assert.That(tableName, Is.EqualTo("geotest"), "Matching the table name"); + string tableLabel = result.Columns[i].TableLabel; + Assert.That(tableLabel, Is.EqualTo("geotest"), "Matching the table label"); + string columnName = result.Columns[i].ColumnName; + Assert.That(columnName, Is.EqualTo(columns[i].ToString()), "Matching the Column Name"); + string columnLabel = result.Columns[i].ColumnLabel; + Assert.That(columnLabel, Is.EqualTo(columns[i].ToString()), "Matching the Column Label"); + uint columnLength = result.Columns[i].Length; + Assert.That(columnLength, Is.EqualTo(0), "Matching the Column Length"); + var columnType = result.Columns[i].Type; + Assert.That(columnType.ToString(), Is.EqualTo("Geometry"), "Matching the Column Type"); + var columnFD = result.Columns[i].FractionalDigits; + Assert.That(columnFD, Is.EqualTo(0), "Matching the Column FD"); + var columnIsSigned = result.Columns[i].IsNumberSigned; + Assert.That(columnIsSigned, Is.EqualTo(false), "Matching whether column is signed or not"); + string columnCollation = result.Columns[i].CollationName; + Assert.That(columnCollation, Is.EqualTo(null), "Matching the Collation Name for default characters"); + string columnCharacterSet = result.Columns[i].CharacterSetName; + Assert.That(columnCharacterSet, Is.EqualTo(null), "Matching the Collation Name as null for data types other than characters"); + var columnIsPadded = result.Columns[i].IsPadded; + Assert.That(columnIsPadded, Is.EqualTo(false), "Matching whether column is padded or not"); + var columnClrType = result.Columns[i].ClrType; + Assert.That(columnClrType.ToString(), Is.EqualTo("System.Byte[]"), "Matching whether column CLR Type"); + } + } + + [Test, Description("Column Blob Datatype")] + public void ColumnCharacterBlobDatatype() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + session.SQL($"USE {schemaName}").Execute(); + session.SQL($"drop table if exists geotest").Execute(); + session.SQL("CREATE TABLE geotest (g TINYBLOB,p BLOB,l MEDIUMBLOB,po LONGBLOB);").Execute(); + + string[] columns = new string[] { "g", "p", "l", "po" }; + string[] columnTypeMatch = new string[] { "Bytes", "Bytes", "Bytes", "Bytes" }; + uint[] ColumnLength = new uint[] { 255, 65535, 16777215, 4294967295 }; + RowResult result = session.GetSchema(schemaName).GetTable("geotest").Select(columns).Execute(); + for (int i = 0; i < columns.Length; i++) + { + string tableName = result.Columns[i].TableName; + Assert.That(tableName, Is.EqualTo("geotest"), "Matching the table name"); + string tableLabel = result.Columns[i].TableLabel; + Assert.That(tableLabel, Is.EqualTo("geotest"), "Matching the table label"); + string columnName = result.Columns[i].ColumnName; + Assert.That(columnName, Is.EqualTo(columns[i].ToString()), "Matching the Column Name"); + string columnLabel = result.Columns[i].ColumnLabel; + Assert.That(columnLabel, Is.EqualTo(columns[i].ToString()), "Matching the Column Label"); + uint columnLength = result.Columns[i].Length; + Assert.That(columnLength, Is.EqualTo(ColumnLength[i]), "Matching the Column Length"); + var columnType = result.Columns[i].Type; + Assert.That(columnType.ToString(), Is.EqualTo(columnTypeMatch[i]), "Matching the Column Type"); + var columnFD = result.Columns[i].FractionalDigits; + Assert.That(columnFD, Is.EqualTo(0), "Matching the Column FD"); + var columnIsSigned = result.Columns[i].IsNumberSigned; + Assert.That(columnIsSigned.ToString(), Is.EqualTo("False"), "Matching whether column is signed or not"); + string columnCollation = result.Columns[i].CollationName; + Assert.That(columnCollation, Is.EqualTo("binary"), "Matching the Collation Name for default characters"); + string columnCharacterSet = result.Columns[i].CharacterSetName; + //Character name returns binary for blob + Assert.That(columnCharacterSet, Is.EqualTo("binary"), "Matching the Collation Name as null for data types other than characters"); + var columnIsPadded = result.Columns[i].IsPadded; + Assert.That(columnIsPadded.ToString(), Is.EqualTo("False"), "Matching whether column is padded or not"); + var columnClrType = result.Columns[i].ClrType; + Assert.That(columnClrType.ToString(), Is.EqualTo("System.Byte[]"), "Matching whether column CLR Type"); + } + } + + [Test, Description("Verify that different language specific collations are availabe for charset utf8mb4 when server version is 8.0 or greater")] + public void LanguageSpecificCollations() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + var charset = "utf8mb4"; + string[] collationname = + { + "utf8mb4_0900_ai_ci", "utf8mb4_de_pb_0900_ai_ci", "utf8mb4_is_0900_ai_ci", "utf8mb4_lv_0900_ai_ci", + "utf8mb4_ro_0900_ai_ci", "utf8mb4_sl_0900_ai_ci", "utf8mb4_pl_0900_ai_ci", "utf8mb4_et_0900_ai_ci", + "utf8mb4_es_0900_ai_ci", "utf8mb4_sv_0900_ai_ci", "utf8mb4_tr_0900_ai_ci", "utf8mb4_cs_0900_ai_ci", + "utf8mb4_da_0900_ai_ci", "utf8mb4_lt_0900_ai_ci", "utf8mb4_sk_0900_ai_ci", "utf8mb4_es_trad_0900_ai_ci", + "utf8mb4_la_0900_ai_ci", "utf8mb4_eo_0900_ai_ci", "utf8mb4_hu_0900_ai_ci", "utf8mb4_hr_0900_ai_ci", + "utf8mb4_vi_0900_ai_ci" + }; + var database_name = "collation_test"; + session.DropSchema(database_name); + var CommandText1 = "SHOW VARIABLES LIKE 'collation_%';"; + Assert.That(session.Settings.CharacterSet, Is.EqualTo(charset), "Matching the character set of the session"); + + for (var i = 0; i < collationname.Length; i++) + { + CommandText1 = "CREATE DATABASE " + database_name + " CHARACTER SET " + charset + " COLLATE " + + collationname[i]; + var sqlRes = session.SQL(CommandText1).Execute(); + session.SQL("USE " + database_name).Execute(); + session.SQL("create table x(id int,name char(25));").Execute(); + var res = session.SQL("insert into x values(10,'AXTREF');").Execute(); + Assert.That(res.AffectedItemsCount, Is.EqualTo(1)); + session.SQL("insert into x values(20,'Trädgårdsvägen');").Execute(); + Assert.That(res.AffectedItemsCount, Is.EqualTo(1)); + session.SQL("insert into x values(30,'foo𝌆bar');").Execute(); + Assert.That(res.AffectedItemsCount, Is.EqualTo(1)); + session.SQL("insert into x values(40,'Dolphin:🐬');").Execute(); + Assert.That(res.AffectedItemsCount, Is.EqualTo(1)); + + var dbCharset = session.SQL("select @@character_set_database;").Execute().FirstOrDefault(); + var dbCollation = session.SQL("select @@collation_database").Execute().FirstOrDefault(); + Assert.That(charset, Is.EqualTo(dbCharset[0])); + Assert.That(collationname[i], Is.EqualTo(dbCollation[0])); + session.DropSchema(database_name); + } + } + + /// + /// Bug#34156197 - Update utf8 mappings + /// + [Test] + public void VerifyRenamedCollations() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + var charset = "utf8mb3"; + var collation = session.Version.isAtLeast(8, 0, 30) ? "utf8mb3" : "utf8"; + string[] collationname = + { + $"{collation}_general_ci", $"{collation}_tolower_ci", $"{collation}_bin", $"{collation}_unicode_ci", + $"{collation}_icelandic_ci", $"{collation}_latvian_ci", $"{collation}_romanian_ci", $"{collation}_slovenian_ci", $"{collation}_polish_ci", + $"{collation}_estonian_ci", $"{collation}_spanish_ci", $"{collation}_swedish_ci", $"{collation}_turkish_ci", $"{collation}_czech_ci", + $"{collation}_danish_ci", $"{collation}_lithuanian_ci", $"{collation}_slovak_ci", $"{collation}_spanish2_ci", $"{collation}_roman_ci", + $"{collation}_persian_ci", $"{collation}_esperanto_ci", $"{collation}_hungarian_ci", $"{collation}_sinhala_ci", $"{collation}_german2_ci", + $"{collation}_croatian_ci", $"{collation}_unicode_520_ci", $"{collation}_vietnamese_ci", $"{collation}_general_mysql500_ci" + }; + + using var sessionX = MySQLX.GetSession(session.Settings.ConnectionString + $";charset={charset}"); + + var database_name = "collation_test"; + session.DropSchema(database_name); + Assert.That(sessionX.Settings.CharacterSet, Is.EqualTo(charset), "Matching the character set of the session"); + + for (var i = 0; i < collationname.Length; i++) + { + string cmdText = $"CREATE DATABASE {database_name} CHARACTER SET {charset} COLLATE {collationname[i]}"; + var sqlRes = session.SQL(cmdText).Execute(); + sessionX.SQL("USE " + database_name).Execute(); + sessionX.SQL("CREATE TABLE x(id int,name char(25));").Execute(); + var res = sessionX.SQL("insert into x values(10,'AXTREF');").Execute(); + Assert.That(res.AffectedItemsCount, Is.EqualTo(1)); + sessionX.SQL("insert into x values(20,'Trädgårdsvägen');").Execute(); + Assert.That(res.AffectedItemsCount, Is.EqualTo(1)); + sessionX.SQL("insert into x values(30,'foo𝌆bar');").Execute(); + Assert.That(res.AffectedItemsCount, Is.EqualTo(1)); + sessionX.SQL("insert into x values(40,'Dolphin:🐬');").Execute(); + Assert.That(res.AffectedItemsCount, Is.EqualTo(1)); + + var dbCharset = sessionX.SQL("select @@character_set_database;").Execute().FirstOrDefault(); + var dbCollation = sessionX.SQL("select @@collation_database").Execute().FirstOrDefault(); + Assert.That(charset, Is.EqualTo(dbCharset[0])); + Assert.That(collationname[i], Is.EqualTo(dbCollation[0])); + sessionX.DropSchema(database_name); + } + } + + /// + /// Bug #33116709 WRONG CHARSET RETURNED USING XPLUGIN + /// + [Test, Description("Verify default charset and collation")] + public void VerifyLatinCharsetAndCollation() + { + Assume.That(session.Version.isAtLeast(8, 0, 14), "This test is for MySql 8.0.14 or higher"); + var database_name = "collation_test"; + var charset = "latin1"; + var collationname = "latin1_danish_ci"; + var defaultCharset = "utf8mb4"; + Assert.That(session.Settings.CharacterSet, Is.EqualTo(defaultCharset), "Matching the character set of the session"); + session.DropSchema(database_name); + var CommandText1 = $"CREATE DATABASE {database_name} CHARACTER SET {charset} COLLATE {collationname}"; + session.SQL(CommandText1).Execute(); + session.SQL("USE " + database_name).Execute(); + session.SQL("create table x(id int,name char(25));").Execute(); + session.SQL("insert into x values(10,'AXTREF');").Execute(); + RowResult result1 = session.GetSchema(database_name).GetTable("x").Select("id").Execute(); + Assert.That(result1.Columns[0].CharacterSetName, Is.EqualTo(null), "id-charset"); + Assert.That(result1.Columns[0].CollationName, Is.EqualTo(null), "id-collation"); + result1 = session.GetSchema(database_name).GetTable("x").Select("name").Execute(); + Assert.That(result1.Columns[0].CharacterSetName, Is.EqualTo(defaultCharset).IgnoreCase, "name-charset"); + Assert.That(result1.Columns[0].CollationName, Does.Contain(defaultCharset), "name-collation"); + session.DropSchema(database_name); + } + + [Test, Description("Create table/db with collation utf8mb4_0900_bin and insert non ascii characters and fetch data")] + public void Utf8mb4BinaryNopadCollationTable() + { + Assume.That(Platform.IsWindows(), "This test is for Windows OS only."); + Assume.That(session.Version.isAtLeast(8, 0, 17), "This test is for MySql 8.0.17 or higher"); + char t_char; + var charset = "utf8mb4"; + var collation = "utf8mb4_0900_ai_ci"; + string foo = "\x00000281\x00000282\x00000283\x00000284\x00000285\x00000286"; + var conn = new MySqlConnectionStringBuilder(); + var collationname = new List(); + + var CommandText1 = "SHOW COLLATION WHERE Charset = 'utf8mb4'"; + var collation_res = session.SQL(CommandText1).Execute().FetchAll(); + for (var i = 0; i < collation_res.Count; i++) + collationname.Add(collation_res[i][0].ToString()); + + var database_name = "collation_test"; + + Assert.That(session.Settings.CharacterSet, Is.EqualTo(charset), "Matching the character set of the session"); + session.DropSchema(database_name); + CommandText1 = "CREATE DATABASE " + database_name; + var sqlRes = session.SQL(CommandText1).Execute(); + session.SQL("USE " + database_name).Execute(); + session.SQL("CREATE TABLE t(a TEXT)").Execute(); + Table t = session.GetSchema(database_name).GetTable("t"); + t.Insert().Values(foo).Execute(); + Row r = t.Select().Limit(1).Execute().FetchOne(); + Assert.That(r[0].ToString(), Is.EqualTo(foo), "Compare extracted string"); + + session.DropSchema(database_name); + CommandText1 = "SHOW VARIABLES LIKE 'collation_%';"; + sqlRes = session.SQL(CommandText1).Execute(); + while (sqlRes.Next()) ; + Assert.That(sqlRes.Rows.ToArray()[0][1].ToString(), Is.EqualTo(collation), "Matching the collation"); + + for (var i = 0; i < collationname.Count; i++) + { + CommandText1 = $"CREATE DATABASE {database_name} CHARACTER SET {charset} COLLATE {collationname[i]}"; + sqlRes = session.SQL(CommandText1).Execute(); + session.SQL("USE " + database_name).Execute(); + session.SQL("create table x(id int,name char(25));").Execute(); + session.SQL("insert into x values(10,'AXTREF');").Execute(); + session.SQL("insert into x values(20,'Trädgårdsvägen');").Execute(); + session.SQL("insert into x values(30,'foo𝌆bar');").Execute(); + session.SQL("insert into x values(40,'Dolphin:🐬');").Execute(); + t = session.GetSchema(database_name).GetTable("x"); + var res = t.Select().Execute().FetchAll(); + Assert.That(res[0][1].ToString(), Is.EqualTo("AXTREF"), "Matching the data"); + Assert.That(res[1][1].ToString(), Is.EqualTo("Trädgårdsvägen"), "Matching the data"); + Assert.That(res[2][1].ToString(), Is.EqualTo("foo𝌆bar"), "Matching the data"); + Assert.That(res[3][1].ToString(), Is.EqualTo("Dolphin:🐬"), "Matching the data"); + RowResult result_collation = t.Select("name").Execute(); + var collationName = result_collation.Columns[0].CollationName; + Assert.That(collationName, Is.EqualTo(collationname[i]), "Matching the collation"); + var characterName = result_collation.Columns[0].CharacterSetName; + Assert.That(characterName, Is.EqualTo(charset), "Matching the charset"); + session.DropSchema(database_name); + } + + for (var i = 0; i < collationname.Count; i++) + { + CommandText1 = "CREATE DATABASE " + database_name; + sqlRes = session.SQL(CommandText1).Execute(); + session.SQL("USE " + database_name).Execute(); + session.SQL($"create table x(id int,name char(25)) CHARACTER SET {charset} COLLATE {collationname[i]};").Execute(); + session.SQL("insert into x values(10,'AXTREF');").Execute(); + session.SQL("insert into x values(20,'Trädgårdsvägen');").Execute(); + session.SQL("insert into x values(30,'foo𝌆bar');").Execute(); + session.SQL("insert into x values(40,'Dolphin:🐬');").Execute(); + t = session.GetSchema(database_name).GetTable("x"); + var res = t.Select().Execute().FetchAll(); + Assert.That(res[0][1].ToString(), Is.EqualTo("AXTREF"), "Matching the data"); + Assert.That(res[1][1].ToString(), Is.EqualTo("Trädgårdsvägen"), "Matching the data"); + Assert.That(res[2][1].ToString(), Is.EqualTo("foo𝌆bar"), "Matching the data"); + Assert.That(res[3][1].ToString(), Is.EqualTo("Dolphin:🐬"), "Matching the data"); + RowResult result_collation = t.Select("name").Execute(); + var collationName = result_collation.Columns[0].CollationName; + Assert.That(collationName, Is.EqualTo(collationname[i]), "Matching the collation"); + var characterName = result_collation.Columns[0].CharacterSetName; + Assert.That(characterName, Is.EqualTo(charset), "Matching the charset"); + session.DropSchema(database_name); + //ALTER + CommandText1 = "CREATE DATABASE " + database_name; + sqlRes = session.SQL(CommandText1).Execute(); + session.SQL("USE " + database_name).Execute(); + session.SQL("create table x(id int,name char(25))").Execute(); + session.SQL($"ALTER TABLE x MODIFY name CHAR(25) COLLATE {collationname[i]};").Execute(); + session.SQL("insert into x values(10,'AXTREF');").Execute(); + session.SQL("insert into x values(20,'Trädgårdsvägen');").Execute(); + session.SQL("insert into x values(30,'foo𝌆bar');").Execute(); + session.SQL("insert into x values(40,'Dolphin:🐬');").Execute(); + t = session.GetSchema(database_name).GetTable("x"); + res = t.Select().Execute().FetchAll(); + Assert.That(res[0][1].ToString(), Is.EqualTo("AXTREF"), "Matching the data"); + Assert.That(res[1][1].ToString(), Is.EqualTo("Trädgårdsvägen"), "Matching the data"); + Assert.That(res[2][1].ToString(), Is.EqualTo("foo𝌆bar"), "Matching the data"); + Assert.That(res[3][1].ToString(), Is.EqualTo("Dolphin:🐬"), "Matching the data"); + result_collation = t.Select("name").Execute(); + collationName = result_collation.Columns[0].CollationName; + Assert.That(collationName, Is.EqualTo(collationname[i]), "Matching the collation"); + characterName = result_collation.Columns[0].CharacterSetName; + Assert.That(characterName, Is.EqualTo(charset), "Matching the charset"); + session.DropSchema(database_name); + } + + for (int k = 0; k <= 255; k++) + { + CommandText1 = $"CREATE DATABASE {database_name} CHARACTER SET {charset} COLLATE {collationname[0]}"; + sqlRes = session.SQL(CommandText1).Execute(); + session.SQL("USE " + database_name).Execute(); + session.SQL("create table x(id int,name char(25));").Execute(); + + t_char = (char)k; + + if (k != 39 && k != 92 && k != 32) + { + session.SQL($"insert into x values({k},'{t_char}')").Execute(); + t = session.GetSchema(database_name).GetTable("x"); + r = t.Select().Limit(1).Execute().FetchOne(); + Assert.That(r[1].ToString(), Is.EqualTo(t_char.ToString()), "Compare extracted string"); + } + session.DropSchema(database_name); + + CommandText1 = $"CREATE DATABASE {database_name} CHARACTER SET {charset} COLLATE {collationname[21]}"; + sqlRes = session.SQL(CommandText1).Execute(); + session.SQL("USE " + database_name).Execute(); + session.SQL("create table x(id int,name char(25));").Execute(); + t_char = (char)k; + if (k != 39 && k != 92 && k != 32) + { + session.SQL($"insert into x values({k},'{t_char}')").Execute(); + t = session.GetSchema(database_name).GetTable("x"); + r = t.Select().Limit(1).Execute().FetchOne(); + Assert.That(r[1].ToString(), Is.EqualTo(t_char.ToString()), "Compare extracted string"); + } + session.DropSchema(database_name); + } + session.DropSchema(database_name); + + MySqlXConnectionStringBuilder mysqlx0 = new MySqlXConnectionStringBuilder(); + mysqlx0.Server = Host; + mysqlx0.Database = schemaName; + mysqlx0.ConnectionProtocol = MySqlConnectionProtocol.Tcp; + mysqlx0.Port = Convert.ToUInt32(XPort); + mysqlx0.UserID = session.Settings.UserID; + mysqlx0.Password = session.Settings.Password; + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.SslMode = MySqlSslMode.Required; + mysqlx0.ConnectTimeout = 1000; + mysqlx0.Keepalive = 10; + mysqlx0.CertificateFile = sslCa; + mysqlx0.CertificatePassword = sslCertificatePassword; + mysqlx0.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysqlx0.CertificateThumbprint = ""; + + using (var sessiontest = MySQLX.GetSession(mysqlx0.ConnectionString)) + { + Assert.That(sessiontest.Settings.CharacterSet, Is.EqualTo(charset), "Matching the character set of the session"); + sessiontest.DropSchema(database_name); + CommandText1 = "CREATE DATABASE " + database_name; + sqlRes = sessiontest.SQL(CommandText1).Execute(); + sessiontest.SQL("USE " + database_name).Execute(); + sessiontest.SQL("CREATE TABLE t(a TEXT)").Execute(); + t = sessiontest.GetSchema(database_name).GetTable("t"); + t.Insert().Values(foo).Execute(); + r = t.Select().Limit(1).Execute().FetchOne(); + Assert.That(r[0].ToString(), Is.EqualTo(foo), "Compare extracted string"); + sessiontest.DropSchema(database_name); + } + } + + #endregion WL14389 + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/ClientSideFailoverTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/ClientSideFailoverTests.cs new file mode 100644 index 000000000..13fb2e74b --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/ClientSideFailoverTests.cs @@ -0,0 +1,783 @@ +// Copyright © 2017, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySql.Data.Failover; +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Generic; + +namespace MySqlX.Data.Tests +{ + public class ClientSideFailoverTests : BaseTest + { + private string localServerIpv6; + + [OneTimeSetUp] + public void LocalSetUp() + { + //get the local MySql server Ip address, like 127.0.0.1 or ::1 + localServerIpv6 = GetMySqlServerIp(true); + } + + [Test] + public void RandomMethodWithBasicFormatConnectionString() + { + int connectionTimeout = 1000; + + // Single host. + using (var session = MySQLX.GetSession(ConnectionString)) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + // Multiple hosts. + using (var session = MySQLX.GetSession($"server=10.10.10.10, {Host}, 20.20.20.20, 30.30.30.30;port={XPort};uid=test;password=test;connecttimeout={connectionTimeout}")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + // Multiple hosts with IPv6 + if (!string.IsNullOrEmpty(localServerIpv6)) + { + using (var session = MySQLX.GetSession($"server=10.10.10.10, {localServerIpv6}, 20.20.20.20, 30.30.30.30;port={XPort};uid=test;password=test;connecttimeout={connectionTimeout}")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + + // Multiple hosts using synonyms for "server" connection option. + using (var session = MySQLX.GetSession($"host=10.10.10.10, {Host};port={XPort};uid=test;password=test;connecttimeout=" + connectionTimeout)) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + // Multiple hosts. All attempts fail. + Exception ex = Assert.Throws(() => MySQLX.GetSession($"server= 10.10.10.10, 20.20.20.20 ;port={XPort};uid=test;password=test;connecttimeout={connectionTimeout}")); + Assert.That(ex.Message, Is.EqualTo("Unable to connect to any of the specified MySQL hosts")); + + // Providing port number as part of the host name. + ex = Assert.Throws(() => MySQLX.GetSession($"server= 10.10.10.10:33050, 20.20.20.20:33060, {Host}:{XPort} ;port={XPort};uid=test;password=test;connecttimeout={connectionTimeout}")); + Assert.That(ex.Message, Is.EqualTo("Providing a port number as part of the host address isn't supported when using connection strings in basic format or anonymous objects. Use URI format instead")); + } + + [Test] + public void RandomMethodWithUriFormatConnectionString() + { + int connectionTimeout = 1000; + + // Single host. + using (var session = MySQLX.GetSession($"mysqlx://test:test@{Host}:{XPort}?connecttimeout={connectionTimeout}")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + // Single host and port as an array. Successful connection. + using (var session = MySQLX.GetSession($"mysqlx://test:test@[{Host}:" + XPort + "]?connecttimeout=" + connectionTimeout)) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + // Single host as an array. Failed connection. + Exception ex = Assert.Throws(() => MySQLX.GetSession($"mysqlx://test:test@[192.1.10.10:{XPort}]?connecttimeout={connectionTimeout}")); + + // Multiple hosts. + using (var session = MySQLX.GetSession($"mysqlx://test:test@[192.1.10.10,{Host}:" + XPort + "]?connecttimeout=" + connectionTimeout)) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + // Multiple hosts and a schema. + using (var session = MySQLX.GetSession($"mysqlx://test:test@[192.1.10.10,{Host}:" + XPort + "]/test?connecttimeout=" + connectionTimeout)) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + // Multiple hosts which may or may not contain a port number. + if (!string.IsNullOrEmpty(localServerIpv6)) + { + using (var session = MySQLX.GetSession($"mysqlx://test:test@[192.1.10.10,120.0.0.2:22000,[{localServerIpv6}]:{XPort}]/test?connecttimeout={connectionTimeout}")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + } + + [Test] + public void RandomMethodWithAnonymousTypes() + { + int connectionTimeout = 1000; + string uid = "test"; + string password = "test"; + + // Single host. + using (var session = MySQLX.GetSession(new { server = Host, port = XPort, uid = uid, password = password, connecttimeout = connectionTimeout })) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + // Multiple hosts. + using (var session = MySQLX.GetSession(new { server = $"10.10.10.10, {Host}", port = XPort, uid = uid, password = password, connecttimeout = connectionTimeout })) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + // Multiple hosts with IPv6 + if (!string.IsNullOrEmpty(localServerIpv6)) + { + using (var session = MySQLX.GetSession(new { server = $"10.10.10.10, {localServerIpv6}", port = XPort, uid = uid, password = password, connecttimeout = connectionTimeout })) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + + // Multiple hosts using synonyms for "server" connection option. First attempt fails, second is succesful. + using (var session = MySQLX.GetSession(new { datasource = $"10.10.10.10, {Host}", port = XPort, uid = uid, password = password, connecttimeout = connectionTimeout })) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + // Multiple hosts. All attempts fail. + Exception ex = Assert.Throws(() => MySQLX.GetSession(new { server = "10.10.10.10, 20.20.20.20", port = XPort, uid = uid, password = password, connecttimeout = connectionTimeout })); + Assert.That(ex.Message, Is.EqualTo("Unable to connect to any of the specified MySQL hosts")); + + // Providing port number as part of the host name. + ex = Assert.Throws(() => MySQLX.GetSession(new { server = "10.10.10.10:33060, 20.20.20.20:33060", port = XPort, uid = uid, password = password, connecttimeout = connectionTimeout })); + Assert.That(ex.Message, Is.EqualTo("Providing a port number as part of the host address isn't supported when using connection strings in basic format or anonymous objects. Use URI format instead")); + } + + [Test] + public void PriorityMethodWithBasicFormatConnectionString() + { + int connectionTimeout = 1000; + + // Single host with max_connections. + try + { + List sessions = new List(); + ExecuteSqlAsRoot("SET @@global.mysqlx_max_connections = 2"); + for (int i = 0; i <= 2; i++) + { + Session newSession = MySQLX.GetSession($"server=(address={Host},priority=100);port=" + XPort + ";uid=test;password=test;"); + sessions.Add(newSession); + } + Assert.That(true, Is.False, "MySqlException should be thrown"); + } + catch (MySqlException exception) + { + Assert.That(exception.Message, Is.EqualTo(ResourcesX.UnableToOpenSession)); + } + finally + { + ExecuteSqlAsRoot("SET @@global.mysqlx_max_connections = 100"); + } + + using (var session = MySQLX.GetSession($"server=(address={Host},priority=100);port=" + XPort + ";uid=test;password=test;connecttimeout=" + connectionTimeout)) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(Host)); + } + + using (var session = MySQLX.GetSession($"server=(address=server.example,priority=50),(address={Host},priority=100);port=" + XPort + ";uid=test;password=test;connecttimeout=" + connectionTimeout)) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(Host)); + } + + using (var session = MySQLX.GetSession($"server=(address=server.example,priority=100),(address={Host},priority=25),(address=192.0.10.56,priority=75);port=" + XPort + ";uid=test;password=test;connecttimeout=" + connectionTimeout)) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(Host)); + } + + using (var session = MySQLX.GetSession(new + { + server = $"(address = {Host}, priority = 0),(address=192.0.10.56, priority=100)", + port = XPort, + user = "test", + password = "test", + sslmode = MySqlSslMode.Disabled + })) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(Host)); + } + + using (var session = MySQLX.GetSession($"server=(address=server.example,priority=100),(address={Host},priority=25),(address=192.0.10.56,priority=75);port=" + XPort + ";uid=test;password=test;connecttimeout=" + connectionTimeout)) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(Host)); + Assert.That(FailoverManager.FailoverGroup.Hosts[0].Host, Is.EqualTo("server.example")); + Assert.That(FailoverManager.FailoverGroup.Hosts[1].Host, Is.EqualTo("192.0.10.56")); + Assert.That(FailoverManager.FailoverGroup.Hosts[2].Host, Is.EqualTo(Host)); + } + + // Priority outside the 0-100 allowed range. + Exception ex = Assert.Throws(() => MySQLX.GetSession($"server=(address=server.example,priority=-20),(address={Host},priority=100);port=" + XPort + ";uid=test;password=test;connecttimeout=" + connectionTimeout)); + Assert.That(ex.Message, Is.EqualTo("The priority must be between 0 and 100")); + + ex = Assert.Throws(() => MySQLX.GetSession($"server=(address=server.example,priority=-50),(address={Host},priority=101);port=" + XPort + ";uid=test;password=test;connecttimeout=" + connectionTimeout)); + Assert.That(ex.Message, Is.EqualTo("The priority must be between 0 and 100")); + + // Set priority for a subset of the hosts. + ex = Assert.Throws(() => MySQLX.GetSession($"server=(address=server.example),(address={Host},priority=100);port=" + XPort + ";uid=test;password=test;connecttimeout=" + connectionTimeout)); + Assert.That(ex.Message, Is.EqualTo("You must either assign no priority to any of the hosts or give a priority for every host")); + ex = Assert.Throws(() => MySQLX.GetSession($"server=(address=server.example,priority=50),(address={Host});port=" + XPort + ";uid=test;password=test;connecttimeout=" + connectionTimeout)); + Assert.That(ex.Message, Is.EqualTo("You must either assign no priority to any of the hosts or give a priority for every host")); + ex = Assert.Throws(() => MySQLX.GetSession($"server=(address=server.example,priority=50),(address={Host},priority=100),(address=server.example);port=" + XPort + ";uid=test;password=test;connecttimeout=" + connectionTimeout)); + Assert.That(ex.Message, Is.EqualTo("You must either assign no priority to any of the hosts or give a priority for every host")); + + // Automatically set priority if no priority is given. + string hostList = string.Empty; + int priority = 100; + for (int i = 1; i <= 105; i++) + { + hostList += "(address=server" + i + ".example,priority=" + (priority != 0 ? priority-- : 0) + "),"; + if (i == 105) hostList += $"(address={Host},priority=0)"; + } + + using (var session = MySQLX.GetSession($"server={hostList};port={XPort};uid=test;password=test;connecttimeout={connectionTimeout}")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + priority = 100; + foreach (var host in FailoverManager.FailoverGroup.Hosts) + { + Assert.That(host.Priority, Is.EqualTo(priority != 0 ? priority-- : 0)); + } + } + } + + [Test] + public void PriorityMethodWithUriFormatConnectonString() + { + int connectionTimeout = 1000; + + // Single host with max_connections. + try + { + List sessions = new List(); + ExecuteSqlAsRoot("SET @@global.mysqlx_max_connections = 2"); + for (int i = 0; i <= 2; i++) + { + Session newSession = MySQLX.GetSession($"mysqlx://test:test@[(address={Host}:" + XPort + ",priority=50)]?connecttimeout=" + connectionTimeout); + sessions.Add(newSession); + } + Assert.That(true, Is.False, "MySqlException should be thrown"); + } + catch (MySqlException exception) + { + Assert.That(exception.Message, Is.EqualTo(ResourcesX.UnableToOpenSession)); + } + finally + { + ExecuteSqlAsRoot("SET @@global.mysqlx_max_connections = 100"); + } + + using (var session = MySQLX.GetSession($"mysqlx://test:test@[(address=server.example,priority=50),(address={Host}:{XPort},priority=100)]?connecttimeout=" + connectionTimeout)) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(Host)); + } + + using (var session = MySQLX.GetSession($"mysqlx://test:test@[(address=server.example,priority=50),(address={Host}:{XPort},priority=100)]?connecttimeout=" + connectionTimeout)) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(Host)); + } + + using (var session = MySQLX.GetSession($"mysqlx://test:test@[(address=server.example,priority=100),(address={Host}:{XPort},priority=25),(address=192.0.10.56,priority=75)]?connecttimeout=" + connectionTimeout)) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(Host)); + Assert.That(FailoverManager.FailoverGroup.Hosts[0].Host, Is.EqualTo("server.example")); + Assert.That(FailoverManager.FailoverGroup.Hosts[1].Host, Is.EqualTo("192.0.10.56")); + Assert.That(FailoverManager.FailoverGroup.Hosts[2].Host, Is.EqualTo(Host)); + } + + // Priority outside the 0-100 allowed range. + Exception ex = Assert.Throws(() => MySQLX.GetSession($"mysqlx://test:test@[(address=server.example,priority=-20),(address={Host}:{XPort},priority=100)]?connecttimeout=" + connectionTimeout)); + Assert.That(ex.Message, Is.EqualTo("The priority must be between 0 and 100")); + + ex = Assert.Throws(() => MySQLX.GetSession($"mysqlx://test:test@[(address=server.example,priority=50),(address={Host}:{XPort},priority=101)]?connecttimeout=" + connectionTimeout)); + Assert.That(ex.Message, Is.EqualTo("The priority must be between 0 and 100")); + + // Set priority for a subset of the hosts. + ex = Assert.Throws(() => MySQLX.GetSession($"mysqlx://test:test@[(address=server.example),(address={Host}:{XPort},priority=100)]?connecttimeout=" + connectionTimeout)); + Assert.That(ex.Message, Is.EqualTo("You must either assign no priority to any of the hosts or give a priority for every host")); + ex = Assert.Throws(() => MySQLX.GetSession($"mysqlx://test:test@[(address=server.example,priority=100),(address={Host}:{XPort})]?connecttimeout=" + connectionTimeout)); + Assert.That(ex.Message, Is.EqualTo("You must either assign no priority to any of the hosts or give a priority for every host")); + ex = Assert.Throws(() => MySQLX.GetSession($"mysqlx://test:test@[(address=server.example),(address={Host}:{XPort}),(address=server2.example,priority=100)]?connecttimeout=" + connectionTimeout)); + Assert.That(ex.Message, Is.EqualTo("You must either assign no priority to any of the hosts or give a priority for every host")); + + // Automatically set priority if no priority is given. + string hostList = string.Empty; + int priority = 100; + for (int i = 1; i <= 105; i++) + { + hostList += "(address=server" + i + ".example,priority=" + (priority != 0 ? priority-- : 0) + "),"; + if (i == 105) hostList += $"(address={Host}:{XPort},priority=0)"; + } + + using (var session = MySQLX.GetSession($"mysqlx://test:test@[{hostList}]?connecttimeout=" + connectionTimeout)) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + priority = 100; + foreach (var host in FailoverManager.FailoverGroup.Hosts) + { + Assert.That(host.Priority, Is.EqualTo(priority != 0 ? priority-- : 0)); + } + } + } + + [Test] + public void PriorityMethodWithAnonymousTypes() + { + int connectionTimeout = 1000; + string uid = "test"; + string password = "test"; + + // Single host with max_connections. + try + { + List sessions = new List(); + ExecuteSqlAsRoot("SET @@global.mysqlx_max_connections = 2"); + for (int i = 0; i <= 2; i++) + { + Session newSession = MySQLX.GetSession(new { server = $"(address={Host},priority=100)", port = XPort, uid = uid, password = password, connecttimeout = connectionTimeout }); + sessions.Add(newSession); + } + + Assert.That(true, Is.False, "MySqlException should be thrown"); + } + catch (MySqlException exception) + { + Assert.That(exception.Message, Is.EqualTo(ResourcesX.UnableToOpenSession)); + } + finally + { + ExecuteSqlAsRoot("SET @@global.mysqlx_max_connections = 100"); + } + + using (var session = MySQLX.GetSession(new { server = $"(address={Host},priority=100)", port = XPort, uid = uid, password = password, connecttimeout = connectionTimeout })) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(Host)); + } + + using (var session = MySQLX.GetSession(new { server = $"(address=server.example,priority=50),(address={Host},priority=100)", port = XPort, uid = uid, password = password, connecttimeout = connectionTimeout })) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(Host)); + } + + using (var session = MySQLX.GetSession(new { server = $"(address=server.example,priority=100),(address={Host},priority=25),(address=192.0.10.56,priority=75)", port = XPort, uid = uid, password = password, connecttimeout = connectionTimeout })) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(Host)); + Assert.That(FailoverManager.FailoverGroup.Hosts[0].Host, Is.EqualTo("server.example")); + Assert.That(FailoverManager.FailoverGroup.Hosts[1].Host, Is.EqualTo("192.0.10.56")); + Assert.That(FailoverManager.FailoverGroup.Hosts[2].Host, Is.EqualTo(Host)); + } + + using (var session = MySQLX.GetSession(new { host = $"(address={Host},priority=2),(address={Host},priority=3)", port = XPort, uid = uid, password = password, connecttimeout = connectionTimeout })) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + // Priority outside the 0-100 allowed range. + Exception ex = Assert.Throws(() => MySQLX.GetSession(new { server = $"(address=server.example,priority=-20),(address={Host},priority=100)", port = XPort, uid = uid, password = password, connecttimeout = connectionTimeout })); + Assert.That(ex.Message, Is.EqualTo("The priority must be between 0 and 100")); + + ex = Assert.Throws(() => MySQLX.GetSession(new { server = $"(address=server.example,priority=-50),(address={Host},priority=101)", port = XPort, uid = uid, password = password, connecttimeout = connectionTimeout })); + Assert.That(ex.Message, Is.EqualTo("The priority must be between 0 and 100")); + + // Set priority for a subset of the hosts. + ex = Assert.Throws(() => MySQLX.GetSession(new { server = $"(address=server.example),(address={Host},priority=100)", port = XPort, uid = uid, password = password, connecttimeout = connectionTimeout })); + Assert.That(ex.Message, Is.EqualTo("You must either assign no priority to any of the hosts or give a priority for every host")); + ex = Assert.Throws(() => MySQLX.GetSession(new { server = $"(address=server.example,priority=50),(address={Host})", port = XPort, uid = uid, password = password, connecttimeout = connectionTimeout })); + Assert.That(ex.Message, Is.EqualTo("You must either assign no priority to any of the hosts or give a priority for every host")); + ex = Assert.Throws(() => MySQLX.GetSession(new { server = $"(address=server.example,priority=50),(address={Host},priority=100),(address=server.example)", port = XPort, uid = uid, password = password, connecttimeout = connectionTimeout })); + Assert.That(ex.Message, Is.EqualTo("You must either assign no priority to any of the hosts or give a priority for every host")); + + // Automatically set priority if no priority is given. + string hostList = string.Empty; + int priority = 100; + for (int i = 1; i <= 105; i++) + { + hostList += "(address=server" + i + ".example,priority=" + (priority != 0 ? priority-- : 0) + "),"; + if (i == 105) hostList += $"(address={Host},priority=0)"; + } + + using (var session = MySQLX.GetSession(new { server = hostList, port = XPort, uid = uid, password = password, connecttimeout = connectionTimeout })) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + priority = 100; + foreach (var host in FailoverManager.FailoverGroup.Hosts) + { + Assert.That(host.Priority, Is.EqualTo(priority != 0 ? priority-- : 0)); + } + } + } + + #region WL14389 + /// + /// Bug 26198818 + /// + [Test, Description("Test MySQLX Client Side Failover(Implicit Failover -Not supported)")] + public void ImplicitFailover() + { + Assume.That(session.Version.isAtLeast(8, 0, 8), "This test is for MySql 8.0.8 or higher"); + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + string ipV6Address = GetIPV6Address(); + string connectionString = $"mysqlx://test:test@[{sb.Server},{Host},{ipV6Address}:{sb.Port}]?implicit-failover"; + Assert.Catch(() => MySQLX.GetSession(connectionString + "&ssl-mode=required")); + } + + [Test, Description("Provide 101 hosts to connection without priority where 1st 100 hosts are invalid ones(Internal priority is set from 100...0) and the last host is valid")] + public void ManyInvalidHost() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + + // Automatically set priority if no priority is given. + var hostList = string.Empty; + var priority = 100; + for (var i = 1; i <= 101; i++) + { + hostList += "(address=server" + i + ".example,priority=" + (priority != 0 ? priority-- : 0) + "),"; + if (i == 101) hostList += $"(address={Host},priority=0)"; + } + + using (var session1 = MySQLX.GetSession("server=" + hostList + ";port=" + sb.Port + ";uid=" + + sb.UserID + ";password=" + sb.Password + ";connect-timeout=1000;ssl-mode=Required")) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + var schema = session1.GetSchema("test"); + Assert.That(schema, Is.Not.Null); + schema.DropCollection("test123"); + var testColl = schema.CreateCollection("test123"); + Assert.That(testColl, Is.Not.Null); + schema.DropCollection("test123"); + } + + hostList = string.Empty; + priority = 100; + for (int i = 1; i <= 101; i++) + { + hostList += "(address=server" + i + ".example,priority=" + (priority != 0 ? priority-- : 0) + "),"; + if (i == 101) hostList += $"(address={Host}:" + sb.Port + ",priority=0)"; + } + var connStr = "mysqlx://test:test@[" + hostList + "]" + "?ssl-mode=Required"; + using (var session1 = MySQLX.GetSession(connStr)) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + var schema = session1.GetSchema("test"); + Assert.That(schema, Is.Not.Null); + schema.DropCollection("test123"); + var testColl = schema.CreateCollection("test123"); + Assert.That(testColl, Is.Not.Null); + schema.DropCollection("test123"); + } + + hostList = string.Empty; + priority = 100; + for (var i = 1; i <= 101; i++) + { + hostList += "(address=server" + i + ".example,priority=" + (priority != 0 ? priority-- : 0) + "),"; + if (i == 101) hostList += $"(address={Host},priority=0)"; + } + + using (var session1 = MySQLX.GetSession(new + { + server = hostList, + port = sb.Port, + user = sb.UserID, + password = sb.Password, + sslmode = MySqlSslMode.Disabled + })) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + var schema = session.GetSchema("test"); + Assert.That(schema, Is.Not.Null); + schema.DropCollection("test123"); + var testColl = schema.CreateCollection("test123"); + Assert.That(testColl, Is.Not.Null); + schema.DropCollection("test123"); + } + } + + [Test, Description("Provide two hosts to connection with priority where both are valid")] + public void TwoValidHost() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + + var connStr = $"mysqlx://test:test@[ (address={Host}:{XPort}, priority=0,address={Host}:{XPort}, priority=100)]?ssl-mode=Required"; + using (var sessionTest = MySQLX.GetSession(connStr)) + { + Assert.That(sessionTest.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + var address_priority = $"(address = {Host}, priority = 0),(address={Host}, priority=100)"; + + connStr = "server=" + address_priority + ";port=" + XPort + ";uid=" + sb.UserID + + ";password=" + sb.Password + ";ssl-mode=Required"; + using (var sessionTest = MySQLX.GetSession(connStr)) + { + Assert.That(sessionTest.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + using (var sessionTest = MySQLX.GetSession(new + { + server = address_priority, + port = XPort, + user = sb.UserID, + password = sb.Password, + sslmode = MySqlSslMode.Disabled + })) + { + Assert.That(sessionTest.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + } + + [Test, Description("Provide two hosts to connection with priority where both are valid-with default port")] + public void TwoValidHostWithDefaultPort() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + + var connStr = "mysqlx://test:test" + + $"@[ (address={Host}:{sb.Port}, priority=0,address={Host}:{sb.Port}, priority=100)]?ssl-mode=Required"; + + using (var sessionTest = MySQLX.GetSession(connStr)) + { + Assert.That(sessionTest.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + var address_priority = $"(address={Host}, priority=0),(address={Host}, priority=100)"; + connStr = "server=" + address_priority + ";uid=" + sb.UserID + ";password=" + sb.Password + + ";ssl-mode=Required;" + "port=" + sb.Port; + using (var sessionTest = MySQLX.GetSession(connStr)) + { + Assert.That(sessionTest.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + using (var sessionTest = MySQLX.GetSession(new + { + server = address_priority, + user = sb.UserID, + password = sb.Password, + sslmode = MySqlSslMode.Required, + port = sb.Port + })) + { + Assert.That(sessionTest.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + + [Test, Description("Provide a single host to connection with priority and disconnect and connect again(iterate priority from 0 - 100) ")] + public void IteratedPriority() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + var connectionTimeout = 900; + + // Automatically set priority if no priority is given. + var hostList = new string[101]; + var hostListPort = new string[101]; + var priority = 100; + for (var i = 0; i <= 100; i++) + { + hostList[i] = "(address=" + Host + ",priority=" + (priority != 0 ? priority-- : 0) + ")"; + var test = "server=" + hostList[i] + ";uid=test;password=test;connect-timeout=" + connectionTimeout + ";ssl-mode=required;" + "port=" + XPort; + using (var session1 = MySQLX.GetSession(test)) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + using (var session1 = MySQLX.GetSession("server=" + hostList[i] + ";port=" + XPort + ";uid=test;password=test;connect-timeout=" + connectionTimeout + ";ssl-mode=Required")) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + hostList[i] = "(address=" + Host + ":" + XPort + ",priority=" + (priority != 0 ? priority-- : 0) + ")"; + var connStr = "mysqlx://test:test@[" + hostList[i] + "]?ssl-mode=Required"; + using (var session1 = MySQLX.GetSession(connStr)) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + hostListPort[i] = $"(address={Host}:{XPort},priority={(priority != 0 ? priority-- : 0)})"; + connStr = "mysqlx://test:test@[" + hostList[i] + "]?ssl-mode=Required"; + using (var session1 = MySQLX.GetSession(connStr)) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + hostList[i] = "(address=" + Host + ",priority=" + (priority != 0 ? priority-- : 0) + ")"; + using (var session1 = MySQLX.GetSession(new + { + server = hostList[i], + port = XPort, + user = "test", + password = "test", + sslmode = MySqlSslMode.Required + })) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + } + + [Test, Description("Provide a single host to connection with priority with SSL")] + public void PriorityWithSsl() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + var certificatePassword = "pass"; + var certificatewrongPassword = "wrongpass"; + + var connStr = $"mysqlx://test:test@[ (address={Host}:{XPort}, priority=0)]" + + $"/?ssl-mode=VerifyCA&ssl-ca-pwd={certificatePassword}&ssl-ca={sslCa}"; + + using (var session1 = MySQLX.GetSession(connStr)) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + connStr = $"mysqlx://test:test@[ (address={Host}:{XPort}, priority=100)]" + + $"/?ssl-mode=Required&ssl-ca-pwd={certificatePassword}&ssl-ca={sslCa}"; + using (var session1 = MySQLX.GetSession(connStr)) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + connStr = $"mysqlx://test:test@[ (address={Host}" + ":" + XPort + ", priority=100)]" + + $"/?ssl-mode=Required&ssl-ca-pwd={certificatePassword}&ssl-ca={clientPfxIncorrect}"; + Assert.Catch(() => MySQLX.GetSession(connStr)); + + var address_priority = $"(address = {Host}, priority = 50 , address = {Host}, priority = 100)"; + connStr = "server=" + address_priority + ";port=" + XPort + ";uid=test;password=test;ssl-mode=VerifyCA;ssl-ca-pwd=pass;ssl-ca=" + sslCa; + using (var session1 = MySQLX.GetSession(connStr)) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + address_priority = $"(address = {Host}, priority = 25)"; + connStr = "server=" + address_priority + ";port=" + XPort + ";uid=test;password=test;ssl-mode=Required;ssl-ca-pwd=" + certificatePassword + ";ssl-ca=" + sslCa; + using (var session1 = MySQLX.GetSession(connStr)) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + connStr = "server=" + address_priority + ";port=" + XPort + ";uid=test;password=test;ssl-mode=VerifyFull;ssl-ca-pwd=" + + certificatewrongPassword + ";ssl-ca=" + sslCa; + Assert.Catch(() => MySQLX.GetSession(connStr)); + + using (var session1 = MySQLX.GetSession(new + { + server = address_priority, + port = XPort, + user = "test", + password = "test", + sslmode = MySqlSslMode.VerifyCA, + sslca = sslCa, + CertificatePassword = certificatePassword + })) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + using (var session1 = MySQLX.GetSession(new + { + server = address_priority, + port = XPort, + user = "test", + password = "test", + sslmode = MySqlSslMode.Required, + sslca = sslCa, + CertificatePassword = certificatePassword + })) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + Assert.Catch(() => MySQLX.GetSession(new + { + server = address_priority, + port = XPort, + user = "test", + password = "test", + sslmode = MySqlSslMode.VerifyFull, + sslca = clientPfxIncorrect, + CertificatePassword = certificatewrongPassword + })); + + } + + /// + /// Bug26524213 + /// + [Test, Description("Provide a single host to connection with priority with SSL-Anonymous with VerifyFull SSL option")] + public void SingleHostWithPriorityVerifyFull() + { + var address_priority = $"(address = {Host}, priority = 50)"; + var certificatePassword = "pass"; + using (var session1 = MySQLX.GetSession(new + { + server = address_priority, + port = XPort, + user = session.Settings.UserID, + password = session.Settings.Password, + sslmode = MySqlSslMode.VerifyFull, + CertificateFile = sslCa, + sslCert = sslCert, + sslkey = sslKey, + CertificatePassword = certificatePassword + })) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + #endregion + + /// + /// Bug #30581109 - XPLUGIN/CLASSIC CONNECTION SUCCEEDS WHEN MULTIPLE HOSTS ARE USED IN WHICH FIRST HOST FAILS WITH MYSQL ERROR LIKE HOST EXHAUSTED ALL THE CONNECTIONS OR WRONG CREDENTIALS AND THE OTHER HOST IS VALID-WL#13304 + /// Due to the restrictions of the automated test, the approach to this test is to have one invalid host that will be attempted to connect to first given its priority throwing a timeout error, then C/NET will then try with the second host raising a MySQL exception. + /// + [Test] + public void FailWhenMySqlExceptionRaised() + { + ExecuteSqlAsRoot("CREATE USER 'test1'@'%' IDENTIFIED BY 'testpass'"); + var address_priority = $"(address={Host}, priority=90),(address=10.20.30.40, priority=100)"; + Assert.Throws(() => MySQLX.GetSession($"server={address_priority};port={XPort};user=test1;pwd=wrongPass;")); + } + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/ClientTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/ClientTests.cs new file mode 100644 index 000000000..f50aa09fe --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/ClientTests.cs @@ -0,0 +1,2667 @@ +// Copyright © 2018, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySql.Data.Common; +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Common; +using MySqlX.XDevAPI.Relational; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace MySqlX.Data.Tests +{ + public class ClientTests : BaseTest + { + private static string localServerIpv4 = "localServerIpv4"; + + public struct ClientOptions + { + public object ConnectionOptions { get; set; } + public object Options { get; set; } + } + + [DatapointSource] + private readonly ClientOptions[] clientOptions = new ClientOptions[] + { + new ClientOptions { + ConnectionOptions = new { pooling = new { enabled = false } }, + Options = new Func(() => { var c = new Client.ConnectionOptions(); c.Pooling.Enabled = false; return c; }).Invoke() + }, + new ClientOptions { + ConnectionOptions = new { pooling = new { maxsIzE = 100, MAXidleTime = 60000 } }, + Options = new Func(() => { var c = new Client.ConnectionOptions(); c.Pooling.MaxSize = 100; c.Pooling.MaxIdleTime = 60000; return c; }).Invoke() + }, + new ClientOptions { + ConnectionOptions = new { pooling = new { queuetimeout = 45000 } }, + Options = new Func(() => { var c = new Client.ConnectionOptions(); c.Pooling.QueueTimeout = 45000; return c; }).Invoke() + }, + new ClientOptions { + ConnectionOptions = "{ \"pooling\": { \"enabled\": false } }", + Options = new Func(() => { var c = new Client.ConnectionOptions(); c.Pooling.Enabled = false; return c; }).Invoke() + }, + new ClientOptions { + ConnectionOptions = "{ \"pooling\": { \"maxidleTIME\": 55000, \"QUEUEtimeout\": 120000 } }", + Options = new Func(() => { var c = new Client.ConnectionOptions(); c.Pooling.MaxIdleTime = 55000; c.Pooling.QueueTimeout = 120000; return c; }).Invoke() + }, + }; + + [Theory] + public void ParseConnectionOptionsTest(ClientOptions clientOptions) + { + Client.ConnectionOptions poolingOptions = (Client.ConnectionOptions)clientOptions.Options; + Client.ConnectionOptions connectionOptionsResult = Client.ParseConnectionOptions(clientOptions.ConnectionOptions); + Assert.That(poolingOptions.Equals(connectionOptionsResult)); + } + + public struct InvalidOptions + { + public object ConnectionOptions { get; set; } + public string OptionName { get; set; } + } + + [DatapointSource] + private readonly InvalidOptions[] invalidOptions = new InvalidOptions[] + { + new InvalidOptions { + ConnectionOptions = new { pooling = new { isenabled = false } }, + OptionName = "pooling.isenabled" + }, + new InvalidOptions { + ConnectionOptions = new { pooling = new { maxsIzE = 80, MAX_idle_Time = 60000 } }, + OptionName = "pooling.MAX_idle_Time" + }, + new InvalidOptions { + ConnectionOptions = new { enabled = true }, + OptionName = "enabled" + }, + new InvalidOptions { + ConnectionOptions = new { pooling = new { enabled = true }, maxIdleTime = 30000 }, + OptionName = "maxIdleTime" + }, + new InvalidOptions { + ConnectionOptions = "{ \"pooling\": { \"is_enabled\": false } }", + OptionName = "pooling.is_enabled" + }, + new InvalidOptions { + ConnectionOptions = "{ \"queueTimeout\": 50000 }", + OptionName = "queueTimeout" + }, + new InvalidOptions { + ConnectionOptions = "{ \"pooling\": { \"idleTIME\": 55000, \"queuetimeout\": 120000 } }", + OptionName = "pooling.idleTIME" + }, + new InvalidOptions { + ConnectionOptions = "{ \"pooling\": { \"MaxidleTIME\": 55000 }, \"queuetimeout\": 120000 }", + OptionName = "queuetimeout" + }, + new InvalidOptions { + ConnectionOptions = "{ pooling: { MaxidleTIME: 55000 } }", + OptionName = "JSON" + }, + new InvalidOptions { + ConnectionOptions = DateTime.Today, + OptionName = DateTime.Today.ToString() + }, + new InvalidOptions { + ConnectionOptions = 25, + OptionName = "25" + }, + }; + + [Theory] + public void ParseConnectionOptionsInvalidOptions(InvalidOptions invalidOptions) + { + ArgumentException ex = Assert.Throws(() => Client.ParseConnectionOptions(invalidOptions.ConnectionOptions)); + Assert.That(string.Format(ResourcesX.ClientOptionNotValid, invalidOptions.OptionName), Is.EqualTo(ex.Message).IgnoreCase); + } + + public struct InvalidValues + { + public object ConnectionOptions { get; set; } + public string OptionName { get; set; } + public object Value { get; set; } + } + + [DatapointSource] + private readonly InvalidValues[] invalidValues = new InvalidValues[] + { + new InvalidValues { + ConnectionOptions = new { pooling = true }, + OptionName = "pooling", + Value = true + }, + new InvalidValues { + ConnectionOptions = new { pooling = new { maxsIzE = 0 } }, + OptionName = "pooling.maxsIzE", + Value = 0 + }, + new InvalidValues { + ConnectionOptions = new { pooling = new { maxsIzE = -25, MAXidleTime = 60000 } }, + OptionName = "pooling.maxsIzE", + Value = -25 + }, + new InvalidValues { + ConnectionOptions = new { pooling = new { maxsIzE = 90L } }, + OptionName = "pooling.maxsIzE", + Value = 90L + }, + new InvalidValues { + ConnectionOptions = "{ \"pooling\": { \"enabled\": yes } }", + OptionName = "pooling.enabled", + Value = "yes" + }, + new InvalidValues { + ConnectionOptions = "{ \"pooling\": { \"MaxidleTIME\": -22, \"queueTimeout\": 120000 } }", + OptionName = "pooling.MaxidleTIME", + Value = -22 + } + }; + + [Theory] + public void ParseConnectionOptionsInvalidValues(InvalidValues invalidValues) + { + ArgumentException ex = Assert.Throws(() => Client.ParseConnectionOptions(invalidValues.ConnectionOptions)); + Assert.That(string.Format(ResourcesX.ClientOptionInvalidValue, invalidValues.OptionName, invalidValues.Value), Is.EqualTo(ex.Message).IgnoreCase); + } + + public struct PoolingTestData + { + public object ConnectionOptions { get; set; } + public int Size { get; set; } + public int Iterations { get; set; } + } + + [DatapointSource] + private readonly PoolingTestData[] poolingTestData = new PoolingTestData[] { + new PoolingTestData + { + ConnectionOptions = new { pooling = new { maxSize = 5, queueTimeout = 5000 } }, + Size = 5, + Iterations = 10 + }, + new PoolingTestData + { + ConnectionOptions = "{ \"pooling\": { \"maxSize\": 5, \"queueTimeout\": 5000 } }", + Size = 5, + Iterations = 10 + } + }; + + [Theory] + [Property("Category", "Security")] + public void PoolingTest(PoolingTestData poolingTestData) + { + using (Client client = MySQLX.GetClient(ConnectionString, poolingTestData.ConnectionOptions)) + { + List hosts = new List(poolingTestData.Size); + List sessions = new List(poolingTestData.Size); + for (int i = 0; i < poolingTestData.Size; i++) + { + Session session = client.GetSession(); + hosts.Add(session.SQL("SELECT host FROM information_schema.PROCESSLIST where id=CONNECTION_ID()").Execute().FetchOne().GetString("host")); + sessions.Add(session); + } + + Action closeSessions = () => + { + foreach (Session session in sessions) + { + session.Close(); + } + sessions.Clear(); + }; + closeSessions.Invoke(); + + for (int x = 0; x < poolingTestData.Iterations; x++) + { + for (int i = 0; i < poolingTestData.Size; i++) + { + Session session = client.GetSession(); + string host = session.SQL("SELECT host FROM information_schema.PROCESSLIST where id=CONNECTION_ID()").Execute().FetchOne().GetString("host"); + sessions.Add(session); + Assert.That(hosts, Does.Contain(host)); + } + closeSessions.Invoke(); + } + } + } + + [Test] + [Property("Category", "Security")] + public void QueueTimeoutTest() + { + Assume.That(!Platform.IsWindows(), "Fix this for Windows OS"); + int timeout = 3000; + using (Client client = MySQLX.GetClient(ConnectionString, new { pooling = new { maxSize = 1, queueTimeout = timeout } })) + { + using (Session session1 = client.GetSession()) + { + Stopwatch stopwatch = Stopwatch.StartNew(); + TimeoutException ex = Assert.Throws(() => { Session session2 = client.GetSession(); }); + stopwatch.Stop(); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.PoolingQueueTimeout)); + Assert.That(stopwatch.ElapsedMilliseconds >= timeout); + } + } + } + + [Test] + [Property("Category", "Security")] + public void ReuseSessions() + { + int size = 3; + int timeout = 3000; + using (Client client = MySQLX.GetClient(ConnectionString, new { pooling = new { maxSize = size, queueTimeout = timeout } })) + { + Session session = client.GetSession(); + Assert.That(session.SQL("SELECT 5").Execute().FetchOne()[0], Is.EqualTo((sbyte)5)); + session.Close(); + MySqlException ex = Assert.Throws(() => { session.SQL("SELECT 5").Execute(); }); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.InvalidSession)); + } + } + + private const int _connectionTimeout = 1000; + + public struct MultiHostData + { + public object ConnectionData { get; set; } + } + + [DatapointSource] + private readonly MultiHostData[] multiHostData = new MultiHostData[] + { + new MultiHostData { ConnectionData = $"server=10.10.10.10,{Host};port={XPort};user=root;connecttimeout={_connectionTimeout};" }, + new MultiHostData { ConnectionData = $"server=unknown,{Host};port={XPort};user=root;connecttimeout={_connectionTimeout};" }, + new MultiHostData { ConnectionData = $"server=(address=10.10.10.10,priority=20),(address={Host},priority=100);port={XPort};user=root;connecttimeout={_connectionTimeout};" }, + new MultiHostData { ConnectionData = $"mysqlx://root@[10.10.10.10,{Host}:{XPort}]?connecttimeout={_connectionTimeout}" }, + new MultiHostData { ConnectionData = $"mysqlx://root@[unknown,{Host}:{XPort}]?connecttimeout={_connectionTimeout}" }, + new MultiHostData { ConnectionData = $"mysqlx://root@[(address=10.10.10.10,priority=20),(address={Host}:{XPort},priority=100)]?connecttimeout={_connectionTimeout}" }, + new MultiHostData { ConnectionData = new { server = $"10.10.10.10,{Host}", user = "root", port = XPort, connecttimeout = _connectionTimeout } }, + new MultiHostData { ConnectionData = new { server = $"unknown,{Host}", user = "root", port = XPort, connecttimeout = _connectionTimeout } }, + new MultiHostData { ConnectionData = new { server = $"(address=10.10.10.10,priority=100), (address=20.20.20.20,priority=90), (address={Host},priority=20)", user = "root", port = XPort, connecttimeout = _connectionTimeout } } + }; + + [Theory] + public void MultiHostTest(MultiHostData multiHostData) + { + using (Client client = MySQLX.GetClient(multiHostData.ConnectionData, "{ \"pooling\": { \"enabled\": true } }")) + { + using (Session session = client.GetSession()) + { + Assert.That(session.SQL("SELECT 8").Execute().FetchOne()[0], Is.EqualTo((sbyte)8)); + } + } + } + + public struct CloseData + { + public Action Action { get; set; } + } + + [DatapointSource] + private readonly CloseData[] closeData = new CloseData[] + { + new CloseData { Action = new Action(s => { s.SQL("SELECT 9").Execute(); }) }, + new CloseData { Action = new Action(s => { s.Schema.GetCollections(); }) }, + new CloseData { Action = new Action(s => { s.Schema.GetCollections()[0].Find().Execute(); }) }, + new CloseData { Action = new Action(s => { s.Schema.GetTables(); }) }, + new CloseData { Action = new Action(s => { s.Schema.GetTables()[0].Select().Execute(); }) }, + }; + + [Theory] + [Property("Category", "Security")] + public void CloseTests(CloseData closeData) + { + using (Client client = MySQLX.GetClient(ConnectionString, "{ \"pooling\": { \"enabled\": true } }")) + { + using (Session session = client.GetSession()) + { + session.DropSchema(schemaName); + session.CreateSchema(schemaName); + client.Close(); + Assert.That(session.XSession.SessionState, Is.EqualTo(SessionState.Closed)); + MySqlException ex = Assert.Throws(() => { closeData.Action.Invoke(session); }); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.InvalidSession)); + } + } + } + + /// + /// WL12515 - DevAPI: Support new session reset functionality + /// + [Test] + [Property("Category", "Security")] + public void ResetSessionTest() + { + // This feature was implemented since MySQL Server 8.0.16 + if (!(session.InternalSession.GetServerVersion().isAtLeast(8, 0, 16))) return; + + int size = 2; + using (Client client = MySQLX.GetClient(ConnectionString + ";database=test;", new { pooling = new { maxSize = size } })) + { + Session session1 = client.GetSession(); + Session session2 = client.GetSession(); + + int threadId1 = session1.ThreadId; + int threadId2 = session2.ThreadId; + + ResetTestBeforeClose(session1, 1); + ResetTestBeforeClose(session2, 2); + + session1.Close(); + session2.Close(); + + Session session1_1 = client.GetSession(); + Session session2_1 = client.GetSession(); + + ResetTestAfterClose(session1_1, threadId1, 1); + ResetTestAfterClose(session2_1, threadId2, 2); + + session1_1.Close(); + } + } + + private void ResetTestBeforeClose(Session session, int id) + { + session.SQL(string.Format("CREATE TEMPORARY TABLE testResetSession{0} (id int)", id)).Execute(); + session.SQL(string.Format("SET @a='session{0}'", id)).Execute(); + + SqlResult res = session.SQL("SELECT @a AS a").Execute(); + Assert.That(res.FetchAll()[0][0], Is.EqualTo("session" + id)); + res = session.SQL("SHOW CREATE TABLE testResetSession" + id).Execute(); + Assert.That(res.FetchAll()[0][0], Is.EqualTo("testResetSession" + id)); + } + + private void ResetTestAfterClose(Session session, int threadId, int id) + { + Assert.That(session.ThreadId, Is.EqualTo(threadId)); + SqlResult res = session.SQL("SELECT @a IS NULL").Execute(); + Assert.That(res.FetchOne()[0], Is.EqualTo((sbyte)1)); + var ex = Assert.Throws(() => session.SQL("SHOW CREATE TABLE testResetSession" + id).Execute()); + Assert.That(ex.Message, Is.EqualTo(string.Format("Table 'test.testresetsession{0}' doesn't exist", id)).IgnoreCase); + + session.SQL(string.Format("SET @a='session{0}'", id)).Execute(); + res = session.SQL("SELECT @a AS a").Execute(); + Assert.That(res.FetchAll()[0][0], Is.EqualTo("session" + id)); + } + + /// + /// WL12514 - DevAPI: Support session-connect-attributes + /// + [Test] + [Property("Category", "Security")] + public void ConnectionAttributes() + { + Assume.That(session.Version.isAtLeast(8, 0, 16), "This test is for MySql 8.0.16 or higher"); + + // Validate that MySQLX.GetSession() supports a new 'connection-attributes' query parameter + // with default values and all the client attributes starts with a '_'. + TestConnectionAttributes(ConnectionString + ";connection-attributes=true;"); + + // Validate that no attributes, client or user defined, are sent to server when the value is "false". + TestConnectionAttributes(ConnectionString + ";connection-attributes=false;"); + + // Validate default behavior with different scenarios. + TestConnectionAttributes(ConnectionString + ";connection-attributes;"); + TestConnectionAttributes(ConnectionString + ";connection-attributes=true;"); + + + // Validate user-defined attributes to be sent to server. + Dictionary userAttrs = new Dictionary + { + { "foo", "bar" }, + { "quua", "qux" }, + { "key", null } + }; + TestConnectionAttributes(ConnectionString + ";connection-attributes=[foo=bar,quua=qux,key]", userAttrs); + TestConnectionAttributes(ConnectionStringUri + "?connectionattributes=[foo=bar,quua=qux,key=]", userAttrs); + + // Errors + var ex = Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";connection-attributes=[_key=value]")); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.InvalidUserDefinedAttribute)); + + ex = Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";connection-attributes=123")); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.InvalidConnectionAttributes)); + + ex = Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";connection-attributes=[key=value,key=value2]")); + Assert.That(ex.Message, Is.EqualTo(string.Format(ResourcesX.DuplicateUserDefinedAttribute, "key"))); + + MySqlXConnectionStringBuilder builder = new MySqlXConnectionStringBuilder(); + builder.Server = Host; + builder.Port = UInt32.Parse(XPort); + builder.UserID = RootUser; + builder.ConnectionAttributes = ";"; + ex = Assert.Throws(() => MySQLX.GetClient(builder.ConnectionString, "{ \"pooling\": { \"enabled\": true } }")); + Assert.That(ex.Message, Is.EqualTo("The requested value ';' is invalid for the given keyword 'connection-attributes'")); + } + + private void TestConnectionAttributes(string connString, Dictionary userAttrs = null) + { + string sql = "SELECT * FROM performance_schema.session_account_connect_attrs WHERE PROCESSLIST_ID = connection_id()"; + + using (Client client = MySQLX.GetClient(connString, "{ \"pooling\": { \"enabled\": true } }")) + using (Session session = client.GetSession()) + { + Assert.That(session.XSession.SessionState, Is.EqualTo(SessionState.Open)); + var result = session.SQL(sql).Execute().FetchAll(); + + if (session.Settings.ConnectionAttributes == "false") + Assert.That(result, Is.Empty); + else + { + Assert.That(result, Is.Not.Empty); + MySqlConnectAttrs clientAttrs = new MySqlConnectAttrs(); + + if (userAttrs == null) + { + Assert.That(result.Count, Is.EqualTo(8)); + + foreach (Row row in result) + Assert.That(row[1].ToString(), Does.StartWith("_")); + } + else + { + Assert.That(result.Count, Is.EqualTo(11)); + + for (int i = 0; i < userAttrs.Count; i++) + { + Assert.That(userAttrs.ContainsKey(result.ElementAt(i)[1].ToString())); + Assert.That(userAttrs.ContainsValue(result.ElementAt(i)[2])); + } + } + } + } + } + + #region WL14389 + + public static object connObject = new { server = Host, port = XPort, user = "test", password = "test" }; + + // Pooling Tests + [Test, Description("Xprotocol: Reset connection state")] + public void ResetConnectionPooling() + { + string connectionID1 = null; + Session session1, session2 = null; + Client client1 = null; + using (client1 = MySQLX.GetClient(ConnectionStringUri, new { pooling = new { maxSize = 1, queueTimeout = 2000 } })) + { + session1 = client1.GetSession(); + session1.DropSchema("newtest"); + session1.CreateSchema("newtest"); + var s = session1.GetSchema("newtest"); + var col = s.CreateCollection("test"); + object[] data = new object[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + + Result result = col.Add(data).Execute(); + var res0 = session1.SQL("SELECT CONNECTION_ID()").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + Assert.That(row, Is.Not.Null); + connectionID1 = row[0].ToString(); + Assert.That(connectionID1, Is.Not.Null); + } + session1.Close(); + session2 = client1.GetSession(); + res0 = session2.SQL("SELECT CONNECTION_ID()").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + Assert.That(row, Is.Not.Null); + connectionID1 = row[0].ToString(); + Assert.That(connectionID1, Is.Not.Null); + } + s = session2.GetSchema("newtest"); + col = s.GetCollection("test"); + var data1 = col.Remove("_id = 1").Execute(); + client1.Close(); + Assert.Catch(() => client1.GetSession()); + } + session.DropSchema("newtest"); + } + + [Test, Description("Xplugin crash for large number of session open/close operations")] + public void LargeOpenCloseOperations() + { + Thread tid1 = new Thread(new ThreadStart(SubProcessA)); + Thread tid2 = new Thread(new ThreadStart(SubProcessB)); + tid1.Start(); + tid2.Start(); + tid1.Join(); + tid2.Join(); + } + + private void SubProcessA() + { + Session session0 = MySQLX.GetSession(ConnectionStringUri); + session0.SQL("SET @@global.mysqlx_max_connections=3000").Execute(); + session0.SQL("SET @@global.max_connections=3000").Execute(); + session0.Close(); + using (Client client = MySQLX.GetClient(ConnectionStringUri, new { pooling = new { enabled = true, maxSize = 1000, queueTimeout = 1, maxIdleTime = 1 } })) + { + for (int i = 0; i < 1; i++) + { + using (Session session1 = client.GetSession()) + { + session1.DropSchema("thread1"); + session1.CreateSchema("thread1"); + session1.DropSchema("thread1"); + } + } + } + } + + private void SubProcessB() + { + Session session0 = MySQLX.GetSession(ConnectionStringUri); + session0.SQL("SET @@global.mysqlx_max_connections=3000").Execute(); + session0.SQL("SET @@global.max_connections=3000").Execute(); + session0.Close(); + using (Client client = MySQLX.GetClient(ConnectionStringUri, new { pooling = new { enabled = true, maxSize = 1000, queueTimeout = 1, maxIdleTime = 1 } })) + { + for (int i = 0; i < 1; i++) + { + using (Session session1 = client.GetSession()) + { + session1.DropSchema("thread2"); + session1.CreateSchema("thread2"); + session1.DropSchema("thread2"); + } + } + } + } + + [Test, Description("Get Session hangs when Maxsize is set to zero")] + public void MaxsizeSetToZero() + { + string connectionString = ConnectionString + ";protocol=Socket;database=test;characterset=utf8mb4;sslmode=VerifyCA;ssl-ca=" + sslCa + ";certificatepassword=pass;keepalive=10;auth=PLAIN;"; + Assert.Throws(() => MySQLX.GetClient(connectionString, new { pooling = new { maxSize = 0, queueTimeout = 2000 } })); + } + + [Test, Description("Invalid exception while getsession when mysqlx max connection is reached")] + [Ignore("This test needs to be executed individually.")] + public void InvalidExceptionMaxConnection() + { + ExecuteSQL("SET @@global.mysqlx_max_connections=3"); + + Client client1 = MySQLX.GetClient(ConnectionStringUri, new { pooling = new { maxSize = 2 } }); + Session session1 = client1.GetSession(); + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + + session1.Close(); + session1 = client1.GetSession(); + Session session2 = client1.GetSession(); + Assert.That(session2.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + + Client client2 = MySQLX.GetClient(ConnectionStringUri, new { pooling = new { maxSize = 2 } }); + Assert.Catch(() => client2.GetSession()); + + client1.Close(); + client2.Close(); + ExecuteSQL("SET @@global.mysqlx_max_connections=151"); + } + + [TestCase(3, "select @@port;")] + [TestCase(4, "SET @@global.mysqlx_max_connections=2000;")] + [Ignore("This test needs to be executed individually.")] + public void ClientAlreadyClosed(int maxSize, string closeQuery) + { + ExecuteSQL($"SET @@global.mysqlx_max_connections={maxSize}"); + Session session01, session02; + + using (var client1 = MySQLX.GetClient(ConnectionStringUri, new { pooling = new { maxSize = maxSize, queueTimeout = 2000 } })) + { + session01 = client1.GetSession(); + session01.DropSchema("newtest"); + session01.CreateSchema("newtest"); + session01.Close(); + session01 = client1.GetSession(); + session02 = client1.GetSession(); + session02.DropSchema("newtest"); + session02.CreateSchema("newtest"); + client1.Close(); + } + + Assert.Throws(() => session01.SQL(closeQuery).Execute()); + ExecuteSQL("SET @@global.mysqlx_max_connections=100"); + } + + [TestCase(26, 1)] + [TestCase(31, 2)] + [Test, Description("INVALID EXCEPTION WHILE GETSESSION WHEN MYSQLX MAX CONNECTION IS REACHD")] + public void MaxConnectionReached(int iterations, int objectType) + { + Session session1 = null; + Client client1 = null; + object connectionpoolingObject = null; + switch (objectType) + { + case 1: + connectionpoolingObject = new { pooling = new { enabled = true, queueTimeout = 20 } }; + break; + case 2: + connectionpoolingObject = new { pooling = new { enabled = true, maxSize = 30, queueTimeout = 20 } }; + break; + } + + using (client1 = MySQLX.GetClient(ConnectionStringUri, connectionpoolingObject)) + { + for (int i = 0; i < iterations; i++) + { + if (i == iterations - 1) + { + Assert.Throws(() => client1.GetSession()); + } + else + { + session1 = client1.GetSession(); + } + } + } + } + + [Test, Description("Test that a new static method GetClient() has been added to MySQLX class and takes two parameters as input.")] + public void GetClientTest() + { + var connectionpoolingObject = new { pooling = new { enabled = true } }; + var client1 = MySQLX.GetClient(ConnectionStringUri, connectionpoolingObject); + VerifyClient(client1); + client1 = MySQLX.GetClient(ConnectionStringUri, connectionpoolingObject); + VerifyClient(client1); + client1 = MySQLX.GetClient(connObject, connectionpoolingObject); + VerifyClient(client1); + } + + [Test, Description("Test that a new static method GetClient() has been added to MySQLX class and takes two parameters as input.Async test")] + public void GetClientTestAsync() + { + var connectionpoolingObject = new { pooling = new { enabled = true } }; + var client1 = MySQLX.GetClient(ConnectionStringUri, connectionpoolingObject); + Task.Run(() => VerifyClientAsync(client1)).Wait(); + client1 = MySQLX.GetClient(ConnectionStringUri, connectionpoolingObject); + Task.Run(() => VerifyClientAsync(client1)).Wait(); + client1 = MySQLX.GetClient(connObject, connectionpoolingObject); + Task.Run(() => VerifyClientAsync(client1)).Wait(); + } + + [TestCase("string")] + [TestCase("object")] + [Test, Description("Test the option 'maxSize' to configure the max number of sessions allowed in the connection pool.")] + public void MaxSizeOptionTests(string inputType) + { + string[] connectionpooling = { "{ \"pooling\": { \"maxSize\": 15} }", "{ \"pooling\": { \"maxSize\": true} }", "{ \"pooling\": { \"maxSize\": -1} }", "{ \"pooling\": { \"maxSize\": 84584759345 } }", "{ \"pooling\": { \"maxSize\": 0} }", "{ \"pooling\": { \"maxSize\": } }" }; + object[] connectionpoolingObject = { new { pooling = new { maxSize = 15 } }, new { pooling = new { maxSize = true } }, new { pooling = new { maxSize = -1 } }, new { pooling = new { maxSize = 84584759345 } }, new { pooling = new { maxSize = 0 } }, new { pooling = new { maxSize = "" } } }; + + for (int i = 0; i < connectionpoolingObject.Length; i++) + { + + if (i == 0) + { + //Connection String + using (var client1 = MySQLX.GetClient(ConnectionString, (inputType == "string" ? connectionpooling : connectionpoolingObject)[i])) + { + var session1 = client1.GetSession(); + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + //Uri + using (var client1 = MySQLX.GetClient(ConnectionStringUri, (inputType == "string" ? connectionpooling : connectionpoolingObject)[i])) + { + var session1 = client1.GetSession(); + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + //Connectin Object + using (var client1 = MySQLX.GetClient(connObject, (inputType == "string" ? connectionpooling : connectionpoolingObject)[i])) + { + var session1 = client1.GetSession(); + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + else + { + Exception ex = Assert.Catch(() => MySQLX.GetClient(ConnectionString, (inputType == "string" ? connectionpooling : connectionpoolingObject)[i])); + Assert.That(ex.Message.Contains("'pooling.maxSize' does not support value"), "Expected Exception"); + + ex = Assert.Catch(() => MySQLX.GetClient(ConnectionStringUri, (inputType == "string" ? connectionpooling : connectionpoolingObject)[i])); + Assert.That(ex.Message.Contains("'pooling.maxSize' does not support value"), "Expected Exception"); + + ex = Assert.Catch(() => MySQLX.GetClient(connObject, (inputType == "string" ? connectionpooling : connectionpoolingObject)[i])); + Assert.That(ex.Message.Contains("'pooling.maxSize' does not support value"), "Expected Exception"); + } + } + } + + [TestCase("string")] + [TestCase("object")] + [Test, Description("Test maxIdle Timeout with different values")] + public void maxIdleTimeOptionTests(string inputType) + { + int timeout = 5000; + string[] connectionpooling = { "{ \"pooling\": { \"maxSize\": 1, \"maxIdleTime\": 2000 } }", "{ \"pooling\": { \"maxIdleTime\": true} }", "{ \"pooling\": { \"maxIdleTime\": 'true'} }", "{ \"pooling\": { \"maxIdleTime\": -1} }", "{ \"pooling\": { \"maxIdleTime\": 84584759345 } }", "{ \"pooling\": { \"maxIdleTime\": } }" }; + object[] connectionpoolingObject = { new { pooling = new { maxSize = 1, maxIdleTime = 2000 } }, new { pooling = new { maxIdleTime = true } }, new { pooling = new { maxIdleTime = "true" } }, new { pooling = new { maxIdleTime = -1 } }, new { pooling = new { maxIdleTime = 84584759345 } }, new { pooling = new { maxIdleTime = "" } } }; + + for (int i = 0; i < (inputType == "string" ? connectionpooling : connectionpoolingObject).Length; i++) + { + if (i == 0) + { + //Connection string + using (var client1 = MySQLX.GetClient(ConnectionString, (inputType == "string" ? connectionpooling : connectionpoolingObject)[i])) + { + CompareConnectionIDs(client1, timeout, true); + } + + //Uri + using (var client1 = MySQLX.GetClient(ConnectionStringUri, (inputType == "string" ? connectionpooling : connectionpoolingObject)[i])) + { + CompareConnectionIDs(client1, timeout, true); + } + + //Anonymous Object + using (var client1 = MySQLX.GetClient(connObject, (inputType == "string" ? connectionpooling : connectionpoolingObject)[i])) + { + CompareConnectionIDs(client1, timeout, true); + } + } + else + { + Assert.Catch(() => MySQLX.GetClient(ConnectionString, (inputType == "string" ? connectionpooling : connectionpoolingObject)[i])); + Assert.Catch(() => MySQLX.GetClient(ConnectionStringUri, (inputType == "string" ? connectionpooling : connectionpoolingObject)[i])); + Assert.Catch(() => MySQLX.GetClient(connObject, (inputType == "string" ? connectionpooling : connectionpoolingObject)[i])); + } + } + } + + [TestCase("string")] + [TestCase("object")] + [Test, Description("Test queueTimeout with different values")] + public void QueueTimeoutOptionTests(string inputType) + { + Assume.That(!Platform.IsWindows(), "Fix this for Windows OS"); + + int timeoutMS = 3000; + string[] connectionpooling = { "{ \"pooling\": { \"maxSize\": 2,\"queueTimeout\": " + timeoutMS + " } }", "{ \"pooling\": { \"queueTimeout\": true} }", "{ \"pooling\": { \"queueTimeout\": 'true'} }", "{ \"pooling\": { \"queueTimeout\": -1} }", "{ \"pooling\": { \"queueTimeout\": 84584759345 } }", "{ \"pooling\": { \"queueTimeout\": } }" }; + object[] connectionpoolingObject = { new { pooling = new { maxSize = 2, queueTimeout = timeoutMS } }, new { pooling = new { queueTimeout = true } }, new { pooling = new { queueTimeout = "true" } }, new { pooling = new { queueTimeout = -1 } }, new { pooling = new { queueTimeout = 84584759345 } }, new { pooling = new { queueTimeout = "" } } }; + for (int i = 0; i < (inputType == "string" ? connectionpooling : connectionpoolingObject).Length; i++) + { + if (i == 0) + { + //Connection String + using (var client1 = MySQLX.GetClient(ConnectionString, (inputType == "string" ? connectionpooling : connectionpoolingObject)[i])) + { + var session1 = client1.GetSession(); + var session2 = client1.GetSession(); + Stopwatch stopwatch = Stopwatch.StartNew(); + Assert.Catch(() => client1.GetSession()); + stopwatch.Stop(); + Assert.That(stopwatch.ElapsedMilliseconds >= timeoutMS); + } + + //Uri + using (var client1 = MySQLX.GetClient(ConnectionStringUri, (inputType == "string" ? connectionpooling : connectionpoolingObject)[i])) + { + var session1 = client1.GetSession(); + var session2 = client1.GetSession(); + Stopwatch stopwatch = Stopwatch.StartNew(); + Assert.Catch(() => client1.GetSession()); + stopwatch.Stop(); + Assert.That(stopwatch.ElapsedMilliseconds >= timeoutMS); + } + + //Anonymous Object + using (var client1 = MySQLX.GetClient(connObject, (inputType == "string" ? connectionpooling : connectionpoolingObject)[i])) + { + var session1 = client1.GetSession(); + var session2 = client1.GetSession(); + Stopwatch stopwatch = Stopwatch.StartNew(); + Assert.Catch(() => client1.GetSession()); + stopwatch.Stop(); + Assert.That(stopwatch.ElapsedMilliseconds >= timeoutMS); + } + } + else + { + Assert.Catch(() => MySQLX.GetClient(ConnectionString, (inputType == "string" ? connectionpooling : connectionpoolingObject)[i])); + Assert.Catch(() => MySQLX.GetClient(ConnectionStringUri, (inputType == "string" ? connectionpooling : connectionpoolingObject)[i])); + Assert.Catch(() => MySQLX.GetClient(connObject, (inputType == "string" ? connectionpooling : connectionpoolingObject)[i])); + } + } + } + + [TestCase("string")] + [TestCase("object")] + [Test, Description("Try to set a pooling option other than `enable`, `maxSize`, `maxIdleTime`, `queueTimeOut`. Expected to throw error.")] + public void InvalidPoolingOption(string inputType) + { + string[] connectionpooling = { "{ \"pooling\": { \"minSize\": 1} }" }; + object[] connectionpoolingObject = { new { pooling = new { minSize = 1 } } }; + + for (int i = 0; i < (inputType == "string" ? connectionpooling : connectionpoolingObject).Length; i++) + { + //Connection String + Assert.Throws(() => MySQLX.GetClient(ConnectionString, (inputType == "string" ? connectionpooling : connectionpoolingObject)[i])); + //Uri + Assert.Throws(() => MySQLX.GetClient(ConnectionStringUri, (inputType == "string" ? connectionpooling : connectionpoolingObject)[i])); + //Anonymous object + Assert.Throws(() => MySQLX.GetClient(connObject, (inputType == "string" ? connectionpooling : connectionpoolingObject)[i])); + } + } + + [TestCase("string")] + [TestCase("object")] + [Test, Description("Try to set a client option other than `pooling`. Expected to throw error.")] + public void InvalidConnectionOptions(string inputType) + { + string[] connectionpooling = { null, "", " ", "ten", "10000", "&" }; + object[] connectionpoolingObject = { null, "", " ", "ten", "10000", "&" }; + + for (int i = 0; i < (inputType == "string" ? connectionpooling : connectionpoolingObject).Length; i++) + { + //Connection string + Exception ex = Assert.Catch(() => MySQLX.GetClient(ConnectionString, (inputType == "string" ? connectionpooling : connectionpoolingObject)[i])); + Assert.That(ex is ArgumentNullException || ex is ArgumentException); + //Uri + ex = Assert.Catch(() => MySQLX.GetClient(ConnectionStringUri, (inputType == "string" ? connectionpooling : connectionpoolingObject)[i])); + Assert.That(ex is ArgumentNullException || ex is ArgumentException); + //Anonymous object + ex = Assert.Catch(() => MySQLX.GetClient(connObject, (inputType == "string" ? connectionpooling : connectionpoolingObject)[i])); + Assert.That(ex is ArgumentNullException || ex is ArgumentException); + } + } + + [TestCase("string", 1)] + [TestCase("object", 1)] + [TestCase("string", 2)] + [TestCase("object", 2)] + [Test, Description("Verify that the pool is managed per host in case connection string includes multiple hosts having priority set and pool enabled")] + public void MultipleHostsAndPriorityTests(string inputType, int hostNameOrIP) + { + var connectionpooling = "{ \"pooling\": { \"maxSize\": 5, \"queueTimeout\": 5000 } }"; + object connectionpoolingObject = new { pooling = new { maxSize = 5, queueTimeout = 20 } }; + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + //Connection String + StringBuilder hostList = new StringBuilder(); + var connString = string.Empty; + var priority = 100; + if (hostNameOrIP == 1) //Test with Host Names + { + for (var i = 1; i < 101; i++) + { + hostList.Append("(address=server" + i + ".example,priority=" + (priority != 0 ? priority-- : 0) + "),"); + if (i == 100) hostList.Append($"(address={sb.Server},priority=0)"); + } + connString = "server=" + hostList + ";port=" + XPort + ";uid=" + sb.UserID + ";password=" + sb.Password; + } + else //Test with IP's + { + connString = "server=10.10.10.10," + sb.Server + ";port=" + XPort + ";uid=" + sb.UserID + ";password=" + sb.Password; + } + + using (var client1 = MySQLX.GetClient(connString, (inputType == "string" ? connectionpooling : connectionpoolingObject))) + { + using (var localSession = client1.GetSession()) + { + var schema = localSession.GetSchema("test"); + Assert.That(schema, Is.Not.Null); + schema.DropCollection("test123"); + var testColl = schema.CreateCollection("test123"); + Assert.That(testColl, Is.Not.Null); + schema.DropCollection("test123"); + } + } + + //Object + Object connectionObject = null; + if (hostNameOrIP == 1) + { + connectionObject = new + { + server = hostList.ToString(), + port = XPort, + user = sb.UserID, + password = sb.Password, + sslmode = MySqlSslMode.Required + }; + + } + else + { + connectionObject = new { server = "10.10.10.10," + sb.Server, port = XPort, uid = sb.UserID, password = sb.Password }; + } + using (var client1 = MySQLX.GetClient(connectionObject, (inputType == "string" ? connectionpooling : connectionpoolingObject))) + { + using (var localSession = client1.GetSession()) + { + var schema = localSession.GetSchema("test"); + Assert.That(schema, Is.Not.Null); + schema.DropCollection("test123"); + var testColl = schema.CreateCollection("test123"); + Assert.That(testColl, Is.Not.Null); + schema.DropCollection("test123"); + } + } + + //Uri + var connStringURI = string.Empty; + if (hostNameOrIP == 1) + { + hostList.Replace("localhost", "localhost:" + XPort.ToString()); + connStringURI = "mysqlx://" + sb.UserID + ":" + sb.Password + "@[" + hostList + "]"; + } + else + { + connStringURI = "mysqlx://" + sb.UserID + ":" + sb.Password + "@[192.1.10.10," + sb.Server + ":" + XPort + "]"; + } + + using (var client1 = MySQLX.GetClient(connStringURI, (inputType == "string" ? connectionpooling : connectionpoolingObject))) + { + using (var localSession = client1.GetSession()) + { + var schema = localSession.GetSchema("test"); + Assert.That(schema, Is.Not.Null); + schema.DropCollection("test123"); + var testColl = schema.CreateCollection("test123"); + Assert.That(testColl, Is.Not.Null); + schema.DropCollection("test123"); + } + } + } + + [Test, Description("Test that the connection taken from pool is clean and all the user variables, temp tables etc are cleaned up")] + public void ValidateCleanUpVariables() + { + var connectionpooling = "{ \"pooling\": { \"maxSize\": 3, \"queueTimeout\": 2000 , \"maxIdleTime\":2000, \"enabled\": true} }"; + + using (var client1 = MySQLX.GetClient(ConnectionString, connectionpooling)) + { + VerifyDataCleanupAfterClientClose(client1, 3, ConnectionString, connectionpooling); + } + using (var client1 = MySQLX.GetClient(ConnectionStringUri, connectionpooling)) + { + VerifyDataCleanupAfterClientClose(client1, 3, ConnectionStringUri, connectionpooling); + } + using (var client1 = MySQLX.GetClient(connObject, connectionpooling)) + { + VerifyDataCleanupAfterClientClose(client1, 3, ConnectionString, connectionpooling); + } + + } + + [Test, Description("Test that if the pool doesn't have the sessions available and if tried to get the session then the client creates one.")] + public void SessionCreatedByClient() + { + var connectionpooling = "{ \"pooling\": { \"enabled\": true} }"; + var connectionpoolingObject = new { pooling = new { enabled = true } }; + + using (var client1 = MySQLX.GetClient(ConnectionString, connectionpoolingObject)) + { + var rs1 = client1.GetSession(); + Assert.That(rs1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + using (var client1 = MySQLX.GetClient(ConnectionStringUri, connectionpoolingObject)) + { + client1.GetSession(); + var rs1 = client1.GetSession(); + Assert.That(rs1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + using (var client1 = MySQLX.GetClient(connObject, connectionpoolingObject)) + { + client1.GetSession(); + var rs1 = client1.GetSession(); + Assert.That(rs1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + using (var client1 = MySQLX.GetClient(ConnectionString, connectionpooling)) + { + var rs1 = client1.GetSession(); + Assert.That(rs1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + using (var client1 = MySQLX.GetClient(ConnectionStringUri, connectionpooling)) + { + client1.GetSession(); + var rs1 = client1.GetSession(); + Assert.That(rs1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + using (var client1 = MySQLX.GetClient(connObject, connectionpooling)) + { + client1.GetSession(); + var rs1 = client1.GetSession(); + Assert.That(rs1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + } + + [Test, Description("Test that the sessions in the pool increases from 0 to maxSize")] + public void VerifyMaxSizeIsReached() + { + var connectionpooling = "{ \"pooling\": { \"maxSize\": 1, \"queueTimeout\": 2000 , \"maxIdleTime\":1000, \"enabled\": true} }"; + var connectionpoolingObject = new { pooling = new { enabled = true, maxSize = 1, queueTimeout = 2000, maxIdleTime = 1000 } }; + + var client1 = MySQLX.GetClient(ConnectionString, connectionpoolingObject); + client1.GetSession(); + TestClientQueueTimeout(client1, 1000, 3000); + + client1 = MySQLX.GetClient(ConnectionStringUri, connectionpoolingObject); + client1.GetSession(); + TestClientQueueTimeout(client1, 1000, 3000); + + client1 = MySQLX.GetClient(connObject, connectionpoolingObject); + client1.GetSession(); + TestClientQueueTimeout(client1, 1000, 3000); + + client1 = MySQLX.GetClient(ConnectionString, connectionpooling); + client1.GetSession(); + TestClientQueueTimeout(client1, 1000, 3000); + client1 = MySQLX.GetClient(ConnectionStringUri, connectionpooling); + client1.GetSession(); + TestClientQueueTimeout(client1, 1000, 3000); + + client1 = MySQLX.GetClient(connObject, connectionpooling); + client1.GetSession(); + TestClientQueueTimeout(client1, 1000, 3000); + + } + + [Test, Description("Test that when the session is closed, it resets the session, removes all temporary variables etc, and adds it to the pool 1")] + public void ResetSessionsAfterClose() + { + var connectionpooling = "{ \"pooling\": { \"maxSize\": 3, \"queueTimeout\": 1000 , \"maxIdleTime\":1000, \"enabled\": true} }"; + var connectionpoolingObject = new { pooling = new { enabled = true, maxSize = 3, queueTimeout = 1000, maxIdleTime = 1000 } }; + + using (var client1 = MySQLX.GetClient(ConnectionString, connectionpoolingObject)) + { + client1.GetSession(); + client1.GetSession(); + client1.GetSession(); + TestClientQueueTimeout(client1, 0, 2000); + } + using (var client1 = MySQLX.GetClient(ConnectionStringUri, connectionpoolingObject)) + { + client1.GetSession(); + client1.GetSession(); + client1.GetSession(); + TestClientQueueTimeout(client1, 0, 2000); + } + using (var client1 = MySQLX.GetClient(connObject, connectionpoolingObject)) + { + client1.GetSession(); + client1.GetSession(); + client1.GetSession(); + TestClientQueueTimeout(client1, 0, 2000); + } + using (var client1 = MySQLX.GetClient(ConnectionString, connectionpooling)) + { + client1.GetSession(); + client1.GetSession(); + client1.GetSession(); + TestClientQueueTimeout(client1, 0, 2000); + } + using (var client1 = MySQLX.GetClient(ConnectionStringUri, connectionpooling)) + { + client1.GetSession(); + client1.GetSession(); + client1.GetSession(); + TestClientQueueTimeout(client1, 0, 2000); + } + using (var client1 = MySQLX.GetClient(connObject, connectionpooling)) + { + client1.GetSession(); + client1.GetSession(); + client1.GetSession(); + TestClientQueueTimeout(client1, 0, 2000); + } + + } + + [Test, Description("Test that when the session is closed, it resets the session, removes all temporary variables etc, and adds it to the pool 2")] + public void ResetSessionVariablesAfterClose() + { + var connectionpooling = "{ \"pooling\": { \"maxSize\": 3, \"queueTimeout\": 2000 , \"maxIdleTime\":2000, \"enabled\": true} }"; + var connectionpoolingObject = new { pooling = new { enabled = true, maxSize = 3, queueTimeout = 2000, maxIdleTime = 2000 } }; + + using (var client1 = MySQLX.GetClient(ConnectionString, connectionpoolingObject)) + { + VerifyDataCleanupOneSession(client1, 3); + } + using (var client1 = MySQLX.GetClient(ConnectionStringUri, connectionpoolingObject)) + { + VerifyDataCleanupOneSession(client1, 3); + } + using (var client1 = MySQLX.GetClient(connObject, connectionpoolingObject)) + { + VerifyDataCleanupOneSession(client1, 3); + } + using (var client1 = MySQLX.GetClient(ConnectionString, connectionpooling)) + { + VerifyDataCleanupOneSession(client1, 3); + } + using (var client1 = MySQLX.GetClient(ConnectionStringUri, connectionpooling)) + { + VerifyDataCleanupOneSession(client1, 3); + } + using (var client1 = MySQLX.GetClient(connObject, connectionpooling)) + { + VerifyDataCleanupOneSession(client1, 3); + } + + } + + [TestCase("string")] + [TestCase("object")] + [Test, Description("Test that when the session is closed, it resets the session, removes all temporary variables etc, and adds it to the pool 3")] + public void ValidateConnectionIDs(string inputType) + { + if (!(session.InternalSession.GetServerVersion().isAtLeast(8, 0, 16))) return; + Client client1 = null, client2 = null, client3 = null; + var connectionpooling = "{ \"pooling\": { \"maxSize\": 1, \"queueTimeout\": 2000 , \"maxIdleTime\":2000, \"enabled\": true} }"; + var connectionpoolingObject = new { pooling = new { enabled = true, maxSize = 1, queueTimeout = 2000, maxIdleTime = 2000 } }; + //Connection string + client1 = MySQLX.GetClient(ConnectionString, (inputType == "string" ? connectionpooling : connectionpoolingObject)); + client2 = MySQLX.GetClient(ConnectionString, (inputType == "string" ? connectionpooling : connectionpoolingObject)); + client3 = MySQLX.GetClient(ConnectionString, (inputType == "string" ? connectionpooling : connectionpoolingObject)); + CompareConnectionIDs(client1, client2, client3); + //Uri + client1 = MySQLX.GetClient(ConnectionStringUri, (inputType == "string" ? connectionpooling : connectionpoolingObject)); + client2 = MySQLX.GetClient(ConnectionStringUri, (inputType == "string" ? connectionpooling : connectionpoolingObject)); + client3 = MySQLX.GetClient(ConnectionStringUri, (inputType == "string" ? connectionpooling : connectionpoolingObject)); + CompareConnectionIDs(client1, client2, client3); + //Anonymous object + client1 = MySQLX.GetClient(connObject, (inputType == "string" ? connectionpooling : connectionpoolingObject)); + client2 = MySQLX.GetClient(connObject, (inputType == "string" ? connectionpooling : connectionpoolingObject)); + client3 = MySQLX.GetClient(connObject, (inputType == "string" ? connectionpooling : connectionpoolingObject)); + CompareConnectionIDs(client1, client2, client3); + } + + [TestCase("string")] + [TestCase("object")] + [Test, Description("Test that when the session is closed, it resets the session, removes all temporary variables etc, and adds it to the pool 4")] + public void ValidateConnectionIDsAndTimeouts(string inputType) + { + Client client1 = null; + int timeout = 6000; + var connectionpooling = "{ \"pooling\": { \"maxSize\": 1, \"maxIdleTime\": 2000 } }"; + var connectionpoolingObject = new { pooling = new { maxSize = 1, maxIdleTime = 2000 } }; + //Connection String + using (client1 = MySQLX.GetClient(ConnectionString, (inputType == "string" ? connectionpooling : connectionpoolingObject))) + { + CompareConnectionIDs(client1, timeout, true); + } + + //Uri + using (client1 = MySQLX.GetClient(ConnectionStringUri, (inputType == "string" ? connectionpooling : connectionpoolingObject))) + { + CompareConnectionIDs(client1, timeout, true); + } + + //Anoymous Object + using (client1 = MySQLX.GetClient(connObject, (inputType == "string" ? connectionpooling : connectionpoolingObject))) + { + CompareConnectionIDs(client1, timeout, true); + } + } + + [TestCase("string")] + [TestCase("object")] + [Test, Description("Test that when the session is closed, it resets the session, removes all temporary variables etc, and adds it to the pool 5")] + public void CompareConnectionIDMaxTimeoutAndSleep(string inputType) + { + Client client1 = null; + int timeout = 3000; + var connectionpooling = "{ \"pooling\": { \"maxSize\": 1, \"maxIdleTime\": 3000 } }"; + var connectionpoolingObject = new { pooling = new { maxSize = 1, maxIdleTime = timeout } }; + //Connection String + using (client1 = MySQLX.GetClient(ConnectionString, (inputType == "string" ? connectionpooling : connectionpoolingObject))) + { + CompareConnectionIDs(client1, timeout, false, timeout); + } + //Uri + using (client1 = MySQLX.GetClient(ConnectionStringUri, (inputType == "string" ? connectionpooling : connectionpoolingObject))) + { + CompareConnectionIDs(client1, timeout, false, timeout); + } + //Anonymous object + using (client1 = MySQLX.GetClient(connObject, (inputType == "string" ? connectionpooling : connectionpoolingObject))) + { + CompareConnectionIDs(client1, timeout, false, timeout); + } + } + + [TestCase("string")] + [TestCase("object")] + [Test, Description("Test that when the session is closed, it resets the session, removes all temporary variables etc, and adds it to the pool 6")] + public void UpdatePoolingObjectAfterCreateSessions(string inputType) + { + var connectionpooling = "{ \"pooling\": { \"maxSize\": 3, \"queueTimeout\": 1000 , \"maxIdleTime\":1000, \"enabled\": true} }"; + var connectionpoolingObject = new + { + pooling = new + { + enabled = true, + maxSize = 3, + queueTimeout = 1000, + maxIdleTime = 1000 + } + }; + + using (var client1 = MySQLX.GetClient(ConnectionString, (inputType == "string" ? connectionpooling : connectionpoolingObject))) + { + client1.GetSession(); + client1.GetSession(); + client1.GetSession(); + } + + connectionpooling = "{ \"pooling\": { \"maxSize\": 1, \"queueTimeout\": 2000 , \"maxIdleTime\":1000, \"enabled\": true} }"; + connectionpoolingObject = new { pooling = new { enabled = true, maxSize = 1, queueTimeout = 2000, maxIdleTime = 1000 } }; + using (var client1 = MySQLX.GetClient(ConnectionString, (inputType == "string" ? connectionpooling : connectionpoolingObject))) + { + client1.GetSession(); + TestClientQueueTimeout(client1, 1000, 3000); + } + + using (var client1 = MySQLX.GetClient(ConnectionStringUri, (inputType == "string" ? connectionpooling : connectionpoolingObject))) + { + client1.GetSession(); + TestClientQueueTimeout(client1, 1000, 3000); + } + + using (var client1 = MySQLX.GetClient(connObject, (inputType == "string" ? connectionpooling : connectionpoolingObject))) + { + client1.GetSession(); + TestClientQueueTimeout(client1, 1000, 3000); + } + } + + [TestCase("string")] + [TestCase("object")] + [Test, Description("Try to set the pooling from True to False while the sessions are being opened by the client")] + public void UpdateEnabledOptionWhileOpenSessions(string inputType) + { + var connectionpooling = "{ \"pooling\": { \"maxSize\": 3, \"queueTimeout\": 1000 , \"maxIdleTime\":1000, \"enabled\": true} }"; + var connectionpoolingObject = new { pooling = new { enabled = true, maxSize = 3, queueTimeout = 1000, maxIdleTime = 1000 } }; + using (var client1 = MySQLX.GetClient(ConnectionString, connectionpoolingObject)) + { + client1.GetSession(); + client1.GetSession(); + client1.GetSession(); + } + connectionpooling = "{ \"pooling\": { \"maxSize\": 1, \"queueTimeout\": 2000 , \"maxIdleTime\":1000, \"enabled\": false} }"; + connectionpoolingObject = new { pooling = new { enabled = false, maxSize = 1, queueTimeout = 2000, maxIdleTime = 1000 } }; + using (var client1 = MySQLX.GetClient(ConnectionString, (inputType == "string" ? connectionpooling : connectionpoolingObject))) + { + client1.GetSession(); + client1.GetSession(); + } + using (var client1 = MySQLX.GetClient(ConnectionStringUri, (inputType == "string" ? connectionpooling : connectionpoolingObject))) + { + client1.GetSession(); + client1.GetSession(); + } + using (var client1 = MySQLX.GetClient(connObject, (inputType == "string" ? connectionpooling : connectionpoolingObject))) + { + client1.GetSession(); + client1.GetSession(); + } + } + + [Test, Description("Test MySqlX plugin reset connection state")] + public void SessionResetConnectionState() + { + + var connectionpoolingObject = new { pooling = new { enabled = true, maxSize = 3, queueTimeout = 2000, maxIdleTime = 1000 } }; + using (var client1 = MySQLX.GetClient(ConnectionString, connectionpoolingObject)) + { + var session1 = client1.GetSession(); + var session2 = client1.GetSession(); + var db1 = session1.GetSchema("test1"); + if (db1.ExistsInDatabase()) + { + session1.DropSchema("test1"); + db1 = session1.CreateSchema("test1"); + } + else { db1 = session1.CreateSchema("test1"); } + + var col1 = db1.GetCollection("my_collection1"); + if (col1.ExistsInDatabase()) + { + db1.DropCollection("my_collection1"); + col1 = db1.CreateCollection("my_collection1"); + } + else { col1 = db1.CreateCollection("my_collection1"); } + col1 = db1.GetCollection("my_collection1", true); + Assert.That(col1, Is.Not.Null); + + var db2 = session2.GetSchema("test2"); + if (db2.ExistsInDatabase()) + { + session2.DropSchema("test2"); + db2 = session2.CreateSchema("test2"); + } + else { db2 = session2.CreateSchema("test2"); } + var col2 = db2.GetCollection("my_collection2"); + if (col2.ExistsInDatabase()) + { + db2.DropCollection("my_collection2"); + col2 = db2.CreateCollection("my_collection2"); + } + else { col2 = db2.CreateCollection("my_collection2"); } + col2 = db2.GetCollection("my_collection2", true); + Assert.That(col2, Is.Not.Null); + session1.Close(); + + DbDoc DbDocs1 = new DbDoc(); + DbDocs1.SetValue("title", "Book 0"); + DbDocs1.SetValue("pages", 10); + + db1 = session1.GetSchema("test1"); + Exception ex = Assert.Throws(() => db1.ExistsInDatabase()); + Assert.That(ex.Message, Does.Contain("Session state is not valid")); + + var result = col2.Add(DbDocs1).Execute(); + Assert.That(result, Is.Not.Null); + + session1 = client1.GetSession(); + db1 = session1.GetSchema("test1"); + col1 = db1.GetCollection("my_collection1", true); + result = col1.Add(DbDocs1).Execute(); + Assert.That(result, Is.Not.Null); + session1.Close(); + + db1 = session1.GetSchema("test1"); + ex = Assert.Throws(() => db1.ExistsInDatabase()); + Assert.That(ex.Message, Does.Contain("Session state is not valid")); + + session2.DropSchema("test1"); + session2.DropSchema("test2"); + session2.Close(); + client1.Close(); + } + } + + [Test, Description("MAX LENGTH OF KEY VALUE PAIR OF USER DEFINED CONNECTION ATTRIBUTES")] + public void ConnectionAttributesLongValue() + { + Assume.That(session.Version.isAtLeast(8, 0, 16), "This test is for MySql 8.0.16 or higher"); + + var serverSupportedSize = Convert.ToInt32(session.SQL("select @@Global.performance_schema_session_connect_attrs_size;").Execute().First()[0]); + var connectAttributesLost = Convert.ToInt32(session.SQL("SHOW STATUS LIKE 'Performance_schema_session_connect_attrs_lost'").Execute().FirstOrDefault()[1]); + string maxValue = "1234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678"; + var valueSize = System.Text.ASCIIEncoding.Unicode.GetByteCount(maxValue); + if (serverSupportedSize > valueSize) + { + string maxKey = "f"; + string maxCombi = $"[{maxKey}={maxValue},a=bcdefghijk]"; + var userAttrs = new Dictionary + { + {maxKey,maxValue}, + {"a","bcdefghijk"} + }; + //Connection String + using (var s1 = MySQLX.GetSession($"{ConnectionString};connectionattributes={maxCombi}")) + { + Assert.That(s1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + var truncatedValues = (int)session.SQL("SHOW STATUS LIKE 'Performance_schema_session_connect_attrs_lost'").Execute().First()[0]; + Assert.That(truncatedValues > connectAttributesLost); + } + //Uri + using (var s1 = MySQLX.GetSession($"{ConnectionStringUri}?connectionattributes={maxCombi}")) + { + Assert.That(s1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + var truncatedValues = (int)session.SQL("SHOW STATUS LIKE 'Performance_schema_session_connect_attrs_lost'").Execute().First()[0]; + Assert.That(truncatedValues > connectAttributesLost); + } + //Anonymous Object + using (var s1 = MySQLX.GetSession(new + { + server = Host, + port = XPort, + user = session.Settings.UserID, + password = session.Settings.Password, + ConnectionAttributes = maxCombi + })) + { + Assert.That(s1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + var truncatedValues = (int)session.SQL("SHOW STATUS LIKE 'Performance_schema_session_connect_attrs_lost'").Execute().First()[0]; + Assert.That(truncatedValues > connectAttributesLost); + } + } + } + + [Test, Description("GETSESSION THROWS EXCEPTION WHEN EQUAL IS USED AS PARAM FOR CONN ATTRIBUTE IN CONN ANONYMOUS OBJECT-WL#12514")] + public void GetSessionExceptionWithConnetionAttribute() + { + Assume.That(session.Version.isAtLeast(8, 0, 16), "This test is for MySql 8.0.16 or higher"); + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + using (Client client = MySQLX.GetClient(new { server = sb.Server, port = XPort, user = sb.UserID, password = sb.Password, ConnectionAttributes = "=" } + , "{ \"pooling\": { \"enabled\": true } }")) + { + Exception ex = Assert.Throws(() => client.GetSession()); + Assert.That(ex.Message, Is.EqualTo("The requested value '=' is invalid for the given keyword 'connection-attributes'")); + } + } + + [Test, Description("Connection Attributes with arrays")] + public void ConnectionAttributesWithArrays() + { + Assume.That(Platform.IsWindows(), "This test is for Windows OS only."); + Assume.That(session.Version.isAtLeast(8, 0, 16), "This test is for MySql 8.0.16 or higher"); + + object[] arrayCases = new object[] { "[var1 = 1, 2, 3]", "[var1 = { 1, 2, 3}]" }; + for (int i = 0; i < arrayCases.Length; i++) + { + //Connection string + using (Client client = MySQLX.GetClient(ConnectionString + ";connection-attributes=" + arrayCases[i], "{ \"pooling\": { \"enabled\": true } }")) + { + using (Session session1 = client.GetSession()) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + //Uri + using (Client client = MySQLX.GetClient(ConnectionStringUri + "?connection-attributes=" + arrayCases[i], "{ \"pooling\": { \"enabled\": true } }")) + { + using (Session session1 = client.GetSession()) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + //Anonymous Object + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + using (Client client = MySQLX.GetClient(new { server = sb.Server, port = XPort, user = sb.UserID, password = sb.Password, ConnectionAttributes = arrayCases[i] }, "{ \"pooling\": { \"enabled\": true } }")) + { + using (Session session1 = client.GetSession()) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + //MySqlXConnectionStringBuilder + MySqlXConnectionStringBuilder mysqlx0 = new MySqlXConnectionStringBuilder(ConnectionString); + mysqlx0.Database = schemaName; + mysqlx0.Port = Convert.ToUInt32(XPort); + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.SslMode = MySqlSslMode.Required; + mysqlx0.ConnectTimeout = 10; + mysqlx0.Keepalive = 10; + mysqlx0.CertificateFile = sslCa; + mysqlx0.CertificatePassword = sslCertificatePassword; + mysqlx0.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysqlx0.CertificateThumbprint = ""; + mysqlx0.ConnectionAttributes = arrayCases[i].ToString(); + using (Client client = MySQLX.GetClient(mysqlx0.ConnectionString, "{ \"pooling\": { \"enabled\": true } }")) + { + using (Session session1 = client.GetSession()) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + //Connection string + using (Session session1 = MySQLX.GetSession(ConnectionString + ";connection-attributes=" + arrayCases[i])) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + //Uri + using (Session session1 = MySQLX.GetSession(ConnectionStringUri + "?connection-attributes=" + arrayCases[i])) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + //Anonymous Object + sb = new MySqlXConnectionStringBuilder(ConnectionString); + using (Session session1 = MySQLX.GetSession(new { server = sb.Server, port = XPort, user = sb.UserID, password = sb.Password, ConnectionAttributes = arrayCases[i] })) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + //MySqlXConnectionStringBuilder + mysqlx0 = new MySqlXConnectionStringBuilder(ConnectionString); + mysqlx0.Database = schemaName; + mysqlx0.Port = Convert.ToUInt32(XPort); + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.SslMode = MySqlSslMode.Required; + mysqlx0.ConnectTimeout = 10; + mysqlx0.Keepalive = 10; + mysqlx0.CertificateFile = sslCa; + mysqlx0.CertificatePassword = sslCertificatePassword; + mysqlx0.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysqlx0.CertificateThumbprint = ""; + mysqlx0.ConnectionAttributes = arrayCases[i].ToString(); + using (Session session1 = MySQLX.GetSession(mysqlx0.ConnectionString)) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + } + + [Test] + public void NormalConnectionWithUri() + { + Assume.That(session.Version.isAtLeast(8, 0, 16), "This test is for MySql 8.0.16 or higher"); + //Normal connection with URI + using (Client client = MySQLX.GetClient(ConnectionStringUri, "{ \"pooling\": { \"enabled\": true } }")) + { + using (Session session1 = client.GetSession()) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + } + + [Test, Description("Connection Attributes Repeated - Extending scenarios in ConnectionAttributes()")] + [Ignore("Bug #33234243 need to fix Uri scenario")] + public void ConnectionAttributesRepeated() + { + Assume.That(session.Version.isAtLeast(8, 0, 16), "This test is for MySql 8.0.16 or higher"); + //Connection String + Assert.Catch(() => MySQLX.GetClient(ConnectionString + ";connection-attributes=true;connection-attributes=true;", "{ \"pooling\": { \"enabled\": true } }")); + Assert.Catch(() => MySQLX.GetSession(ConnectionString + ";connection-attributes=true;connection-attributes=true;")); + //Uri + Assert.Catch(() => MySQLX.GetClient(ConnectionStringUri + "?connection-attributes=true&connection-attributes=true", "{ \"pooling\": { \"enabled\": true } }")); + Assert.Catch(() => MySQLX.GetSession(ConnectionStringUri + "?connection-attributes=true?connection-attributes=true;")); + } + + [Test, Description("Connection Attributes with key Repeated - Extending scenarios in ConnectionAttributes()")] + public void ConnectionAttributesKeyRepeatedChars() + { + Assume.That(session.Version.isAtLeast(8, 0, 16), "This test is for MySql 8.0.16 or higher"); + var expectedMsg = string.Format(ResourcesX.DuplicateUserDefinedAttribute, "quua"); + //Connection String + using (Client client = MySQLX.GetClient(ConnectionString + ";connection-attributes=[quua=bar,quua=qux,key]", "{ \"pooling\": { \"enabled\": true } }")) + { + Exception ex = Assert.Throws(() => client.GetSession()); + Assert.That(ex.Message, Is.EqualTo(expectedMsg)); + } + //Uri + using (Client client = MySQLX.GetClient(ConnectionStringUri + "?connection-attributes=[quua=bar,quua=qux,key];", "{ \"pooling\": { \"enabled\": true } }")) + { + Exception ex = Assert.Throws(() => client.GetSession()); + Assert.That(ex.Message, Is.EqualTo(expectedMsg)); + } + //Anonymous Object + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + using (Client client = MySQLX.GetClient(new { server = sb.Server, port = XPort, user = sb.UserID, password = sb.Password, ConnectionAttributes = "[quua=bar,quua=qux,key=]" }, "{ \"pooling\": { \"enabled\": true } }")) + { + Exception ex = Assert.Throws(() => client.GetSession()); + Assert.That(ex.Message, Is.EqualTo(expectedMsg)); + } + + if (Platform.IsWindows()) + { + //MySqlXConnectionStringBuilder + MySqlXConnectionStringBuilder mysqlx0 = new MySqlXConnectionStringBuilder(ConnectionString); + mysqlx0.Database = schemaName; + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.SslMode = MySqlSslMode.Required; + mysqlx0.ConnectTimeout = 10; + mysqlx0.Keepalive = 10; + mysqlx0.CertificateFile = sslCa; + mysqlx0.CertificatePassword = sslCertificatePassword; + mysqlx0.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysqlx0.CertificateThumbprint = ""; + mysqlx0.ConnectionAttributes = "[quua=bar,quua=qux,key=]"; + using (Client client = MySQLX.GetClient(mysqlx0.ConnectionString, "{ \"pooling\": { \"enabled\": true } }")) + { + Exception ex = Assert.Throws(() => client.GetSession()); + Assert.That(ex.Message, Is.EqualTo(expectedMsg)); + } + //Connection String + Exception ex1 = Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";connection-attributes=[quua=bar,quua=qux,key]")); + Assert.That(ex1.Message, Is.EqualTo(expectedMsg)); + //Uri + ex1 = Assert.Throws(() => MySQLX.GetSession(ConnectionStringUri + "?connection-attributes=[quua=bar,quua=qux,key];")); + Assert.That(ex1.Message, Is.EqualTo(expectedMsg)); + //Anonymous Object + sb = new MySqlXConnectionStringBuilder(ConnectionString); + ex1 = Assert.Throws(() => MySQLX.GetSession(new { server = sb.Server, port = XPort, user = sb.UserID, password = sb.Password, ConnectionAttributes = "[quua=bar,quua=qux,key=]" })); + Assert.That(ex1.Message, Is.EqualTo(expectedMsg)); + //MySqlXConnectionStringBuilder + mysqlx0 = new MySqlXConnectionStringBuilder(ConnectionString); + mysqlx0.Database = schemaName; + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.SslMode = MySqlSslMode.Required; + mysqlx0.ConnectTimeout = 10; + mysqlx0.Keepalive = 10; + mysqlx0.CertificateFile = sslCa; + mysqlx0.CertificatePassword = sslCertificatePassword; + mysqlx0.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysqlx0.CertificateThumbprint = ""; + mysqlx0.ConnectionAttributes = "[quua=bar,quua=qux,key=]"; + ex1 = Assert.Throws(() => MySQLX.GetSession(mysqlx0.ConnectionString)); + Assert.That(ex1.Message, Is.EqualTo(expectedMsg)); + } + } + + [Test, Description("Connection Attributes with key 33 characters - Extending scenarios in ConnectionAttributes()")] + public void ConnectionAttributesWithKey33Chars() + { + Assume.That(session.Version.isAtLeast(8, 0, 16), "This test is for MySql 8.0.16 or higher"); + var errorMsg = "Key name beginning with 'foo32foo32foo32foo32foo32foo3232'... is too long, currently limited to 32"; + using (Client client = MySQLX.GetClient(ConnectionString + ";connection-attributes=[foo32foo32foo32foo32foo32foo32323=bar,quua=qux,key]", "{ \"pooling\": { \"enabled\": true } }")) + { + Exception ex = Assert.Throws(() => client.GetSession()); + Assert.That(ex.Message, Is.EqualTo(errorMsg)); + } + + using (Client client = MySQLX.GetClient(ConnectionStringUri + "?connection-attributes=[foo32foo32foo32foo32foo32foo32323=bar,quua=qux,key];", "{ \"pooling\": { \"enabled\": true } }")) + { + Exception ex = Assert.Throws(() => client.GetSession()); + Assert.That(ex.Message, Is.EqualTo(errorMsg)); + } + + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + using (Client client = MySQLX.GetClient(new { server = sb.Server, port = XPort, user = sb.UserID, password = sb.Password, ConnectionAttributes = "[foo32foo32foo32foo32foo32foo32323=bar,quua=qux,key=]" }, "{ \"pooling\": { \"enabled\": true } }")) + { + Exception ex = Assert.Throws(() => client.GetSession()); + Assert.That(ex.Message, Is.EqualTo(errorMsg)); + } + + if (Platform.IsWindows()) + { + MySqlXConnectionStringBuilder mysqlx0 = new MySqlXConnectionStringBuilder(ConnectionString); + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.SslMode = MySqlSslMode.Required; + mysqlx0.ConnectTimeout = 10; + mysqlx0.Keepalive = 10; + mysqlx0.CertificateFile = sslCa; + mysqlx0.CertificatePassword = sslCertificatePassword; + mysqlx0.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysqlx0.CertificateThumbprint = ""; + mysqlx0.ConnectionAttributes = "[foo32foo32foo32foo32foo32foo32323=bar,quua=qux,key=]"; + using (Client client = MySQLX.GetClient(mysqlx0.ConnectionString, "{ \"pooling\": { \"enabled\": true } }")) + { + Exception ex = Assert.Throws(() => client.GetSession()); + Assert.That(ex.Message, Is.EqualTo(errorMsg)); + } + + Exception ex1 = Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";connection-attributes=[foo32foo32foo32foo32foo32foo32323=bar,quua=qux,key]")); + Assert.That(ex1.Message, Is.EqualTo(errorMsg)); + + ex1 = Assert.Throws(() => MySQLX.GetSession(ConnectionStringUri + "?connection-attributes=[foo32foo32foo32foo32foo32foo32323=bar,quua=qux,key];")); + Assert.That(ex1.Message, Is.EqualTo(errorMsg)); + + sb = new MySqlXConnectionStringBuilder(ConnectionString); + ex1 = Assert.Throws(() => MySQLX.GetSession(new { server = sb.Server, port = XPort, user = sb.UserID, password = sb.Password, ConnectionAttributes = "[foo32foo32foo32foo32foo32foo32323=bar,quua=qux,key=]" })); + Assert.That(ex1.Message, Is.EqualTo(errorMsg)); + + mysqlx0 = new MySqlXConnectionStringBuilder(ConnectionString); + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.SslMode = MySqlSslMode.Required; + mysqlx0.ConnectTimeout = 10; + mysqlx0.Keepalive = 10; + mysqlx0.CertificateFile = sslCa; + mysqlx0.CertificatePassword = sslCertificatePassword; + mysqlx0.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysqlx0.CertificateThumbprint = ""; + mysqlx0.ConnectionAttributes = "[foo32foo32foo32foo32foo32foo32323=bar,quua=qux,key=]"; + ex1 = Assert.Throws(() => MySQLX.GetSession(mysqlx0.ConnectionString)); + Assert.That(ex1.Message, Is.EqualTo(errorMsg)); + } + } + + [Test, Description("Connection Attributes with invalid combinations - Extending scenarios in ConnectionAttributes()")] + public void ConnectionAttributesInvalidCombinations() + { + Assume.That(session.Version.isAtLeast(8, 0, 16), "This test is for MySql 8.0.16 or higher"); + object[] invalid = new object[] { "var1", "1", "2", "(var1)", "{var1}", "[_testValue = test123, emptyValue]" }; + var errorMsgs = new string[] { @"The value of ""connection-attributes"" must be either a boolean or a list of key-value pairs", @"Key names in ""connection-attributes"" cannot start with ""_""" }; + for (int i = 0; i < invalid.Length; i++) + { + //Connection String + using (Client client = MySQLX.GetClient(ConnectionString + ";connection-attributes=" + invalid[i], "{ \"pooling\": { \"enabled\": true } }")) + { + Exception ex = Assert.Throws(() => client.GetSession()); + Assert.That(errorMsgs.Contains(ex.Message)); + } + //Uri + using (Client client = MySQLX.GetClient(ConnectionStringUri + "?connection-attributes=" + invalid[i], "{ \"pooling\": { \"enabled\": true } }")) + { + Exception ex = Assert.Throws(() => client.GetSession()); + Assert.That(errorMsgs.Contains(ex.Message)); + } + //Anonymous object + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + using (Client client = MySQLX.GetClient(new { server = sb.Server, port = XPort, user = sb.UserID, password = sb.Password, ConnectionAttributes = invalid[i] }, "{ \"pooling\": { \"enabled\": true } }")) + { + Exception ex = Assert.Throws(() => client.GetSession()); + Assert.That(errorMsgs.Contains(ex.Message)); + } + + if (Platform.IsWindows()) + { + //MySqlXConnectionStringBuilder + MySqlXConnectionStringBuilder mysqlx0 = new MySqlXConnectionStringBuilder(ConnectionString); + mysqlx0.Database = schemaName; + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.SslMode = MySqlSslMode.Required; + mysqlx0.ConnectTimeout = 1000; + mysqlx0.Keepalive = 10; + mysqlx0.CertificateFile = sslCa; + mysqlx0.CertificatePassword = sslCertificatePassword; + mysqlx0.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysqlx0.CertificateThumbprint = ""; + mysqlx0.ConnectionAttributes = invalid[i].ToString(); + using (Client client = MySQLX.GetClient(mysqlx0.ConnectionString, "{ \"pooling\": { \"enabled\": true } }")) + { + Exception ex = Assert.Throws(() => client.GetSession()); + Assert.That(errorMsgs.Contains(ex.Message)); + } + + //Connection String + Exception ex1 = Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";connection-attributes=" + invalid[i])); + Assert.That(errorMsgs.Contains(ex1.Message)); + //Uri + ex1 = Assert.Throws(() => MySQLX.GetSession(ConnectionStringUri + "?connection-attributes=" + invalid[i])); + Assert.That(errorMsgs.Contains(ex1.Message)); + //Anonymous object + sb = new MySqlXConnectionStringBuilder(ConnectionString); + ex1 = Assert.Throws(() => MySQLX.GetSession(new { server = sb.Server, port = XPort, user = sb.UserID, password = sb.Password, ConnectionAttributes = invalid[i] })); + Assert.That(errorMsgs.Contains(ex1.Message)); + //MySqlXConnectionStringBuilder + mysqlx0 = new MySqlXConnectionStringBuilder(ConnectionString); + mysqlx0.Database = schemaName; + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.SslMode = MySqlSslMode.Required; + mysqlx0.ConnectTimeout = 1000; + mysqlx0.Keepalive = 10; + mysqlx0.CertificateFile = sslCa; + mysqlx0.CertificatePassword = sslCertificatePassword; + mysqlx0.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysqlx0.CertificateThumbprint = ""; + mysqlx0.ConnectionAttributes = invalid[i].ToString(); + ex1 = Assert.Throws(() => MySQLX.GetSession(mysqlx0.ConnectionString)); + Assert.That(errorMsgs.Contains(ex1.Message)); + } + } + } + + [Test, Description("Connection Attributes with valid combinations - Extending scenarios in ConnectionAttributes()")] + public void ConnectionAttributesValidCombinations() + { + Assume.That(Platform.IsWindows(), "This test is for Windows OS only."); + Assume.That(session.Version.isAtLeast(8, 0, 16), "This test is for MySql 8.0.16 or higher"); + + object[] invalid = new object[] { "[var1 = 1]" }; + for (int i = 0; i < invalid.Length; i++) + { + using (Client client = MySQLX.GetClient(ConnectionString + ";connection-attributes=" + invalid[i], "{ \"pooling\": { \"enabled\": true } }")) + { + using (Session session = client.GetSession()) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + + using (Client client = MySQLX.GetClient(ConnectionStringUri + "?connection-attributes=" + invalid[i], "{ \"pooling\": { \"enabled\": true } }")) + { + using (Session session = client.GetSession()) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + using (Client client = MySQLX.GetClient(new { server = sb.Server, port = XPort, user = sb.UserID, password = sb.Password, ConnectionAttributes = invalid[i] }, "{ \"pooling\": { \"enabled\": true } }")) + { + using (Session session = client.GetSession()) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + + MySqlXConnectionStringBuilder mysqlx0 = new MySqlXConnectionStringBuilder(ConnectionString); + mysqlx0.Database = schemaName; + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.SslMode = MySqlSslMode.Required; + mysqlx0.ConnectTimeout = 1000; + mysqlx0.Keepalive = 10; + mysqlx0.CertificateFile = sslCa; + mysqlx0.CertificatePassword = sslCertificatePassword; + mysqlx0.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysqlx0.CertificateThumbprint = ""; + mysqlx0.ConnectionAttributes = invalid[i].ToString(); + using (Client client = MySQLX.GetClient(mysqlx0.ConnectionString, "{ \"pooling\": { \"enabled\": true } }")) + { + using (Session session = client.GetSession()) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + + using (Session session = MySQLX.GetSession(ConnectionString + ";connection-attributes=" + invalid[i])) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + using (Session session = MySQLX.GetSession(ConnectionStringUri + "?connection-attributes=" + invalid[i])) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + sb = new MySqlXConnectionStringBuilder(ConnectionString); + using (Session session = MySQLX.GetSession(new { server = sb.Server, port = XPort, user = sb.UserID, password = sb.Password, ConnectionAttributes = invalid[i] })) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + mysqlx0 = new MySqlXConnectionStringBuilder(ConnectionString); + mysqlx0.Database = schemaName; + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.SslMode = MySqlSslMode.Required; + mysqlx0.ConnectTimeout = 1000; + mysqlx0.Keepalive = 10; + mysqlx0.CertificateFile = sslCa; + mysqlx0.CertificatePassword = sslCertificatePassword; + mysqlx0.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysqlx0.CertificateThumbprint = ""; + mysqlx0.ConnectionAttributes = invalid[i].ToString(); + + using (Session session = MySQLX.GetSession(mysqlx0.ConnectionString)) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + } + + [Test, Description("Connection Attributes with key special characters - Extending scenarios in ConnectionAttributes()")] + public void ConnectionAttributesKeySpecialChars() + { + Assume.That(Platform.IsWindows(), "This test is for Windows OS only."); + Assume.That(session.Version.isAtLeast(8, 0, 16), "This test is for MySql 8.0.16 or higher"); + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + using (Client client = MySQLX.GetClient(ConnectionString + ";connection-attributes=[@#$%^&* %^()=bar,quua=*(&^&#$%,key]", "{ \"pooling\": { \"enabled\": true } }")) + { + using (Session session = client.GetSession()) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + + using (Client client = MySQLX.GetClient(ConnectionString + ";connection-attributes=[^%&&*^#623%^%33=bar,quua=*(&^&#$%,key]", "{ \"pooling\": { \"enabled\": true } }")) + { + using (Session session = client.GetSession()) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + + using (Client client = MySQLX.GetClient(new + { + server = sb.Server, + port = XPort, + user = sb.UserID, + password = sb.Password, + ConnectionAttributes = "[@#$%^&*()=bar,quua=*(&^&#$%,key=]" + }, "{ \"pooling\": { \"enabled\": true } }")) + { + using (Session session = client.GetSession()) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + + MySqlXConnectionStringBuilder mysqlx0 = new MySqlXConnectionStringBuilder(ConnectionString); + mysqlx0.Database = schemaName; + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.SslMode = MySqlSslMode.Required; + mysqlx0.ConnectTimeout = 1000; + mysqlx0.Keepalive = 10; + mysqlx0.CertificateFile = sslCa; + mysqlx0.CertificatePassword = sslCertificatePassword; + mysqlx0.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysqlx0.CertificateThumbprint = ""; + mysqlx0.ConnectionAttributes = "[@#$%^&*()=bar,quua=*(&^&#$%,key=]"; + using (Client client = MySQLX.GetClient(mysqlx0.ConnectionString, "{ \"pooling\": { \"enabled\": true } }")) + { + using (Session session = client.GetSession()) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + + using (Session session = MySQLX.GetSession(ConnectionString + ";connection-attributes=[@#$%^&*()=bar,quua=*(&^&#$%,key]")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + using (Session session = MySQLX.GetSession(new { server = sb.Server, port = XPort, user = sb.UserID, password = sb.Password, ConnectionAttributes = "[@#$%^&*()=bar,quua=*(&^&#$%,key=]" })) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + mysqlx0 = new MySqlXConnectionStringBuilder(ConnectionString); + mysqlx0.Database = schemaName; + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.SslMode = MySqlSslMode.Required; + mysqlx0.ConnectTimeout = 1000; + mysqlx0.Keepalive = 10; + mysqlx0.CertificateFile = sslCa; + mysqlx0.CertificatePassword = sslCertificatePassword; + mysqlx0.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysqlx0.CertificateThumbprint = ""; + mysqlx0.ConnectionAttributes = "[@#$%^&*()=bar,quua=*(&^&#$%,key=]"; + using (Session session = MySQLX.GetSession(mysqlx0.ConnectionString)) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + } + + [Test, Description("Connection Attributes with key with underline characters - Extending scenarios in ConnectionAttributes()")] + public void ConnectionAttributesKeyWithUnderLineChars() + { + Assume.That(Platform.IsWindows(), "This test is for Windows OS only."); + Assume.That(session.Version.isAtLeast(8, 0, 16), "This test is for MySql 8.0.16 or higher"); + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + var expectedMsg = @"Key names in ""connection-attributes"" cannot start with ""_"""; + //Connection string + using (Client client = MySQLX.GetClient(ConnectionString + ";connection-attributes=[_foo32=bar,quua=qux,key]", "{ \"pooling\": { \"enabled\": true } }")) + { + Exception ex = Assert.Throws(() => client.GetSession()); + Assert.That(ex.Message, Is.EqualTo(expectedMsg)); + } + //Uri + using (Client client = MySQLX.GetClient(ConnectionStringUri + "?connection-attributes=[_foo32=bar,quua=qux,key];", "{ \"pooling\": { \"enabled\": true } }")) + { + Exception ex = Assert.Throws(() => client.GetSession()); + Assert.That(ex.Message, Is.EqualTo(expectedMsg)); + } + //Anonymous object + using (Client client = MySQLX.GetClient(new { server = sb.Server, port = XPort, user = sb.UserID, password = sb.Password, ConnectionAttributes = "[_foo32=bar,quua=qux,key=]" }, "{ \"pooling\": { \"enabled\": true } }")) + { + Exception ex = Assert.Throws(() => client.GetSession()); + Assert.That(ex.Message, Is.EqualTo(expectedMsg)); + } + + MySqlXConnectionStringBuilder mysqlx0 = new MySqlXConnectionStringBuilder(ConnectionString); + mysqlx0.Database = schemaName; + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.SslMode = MySqlSslMode.Required; + mysqlx0.ConnectTimeout = 1000; + mysqlx0.Keepalive = 10; + mysqlx0.CertificateFile = sslCa; + mysqlx0.CertificatePassword = sslCertificatePassword; + mysqlx0.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysqlx0.CertificateThumbprint = ""; + mysqlx0.ConnectionAttributes = "[_foo32=bar,quua=qux,key=]"; + using (Client client = MySQLX.GetClient(mysqlx0.ConnectionString, "{ \"pooling\": { \"enabled\": true } }")) + { + Exception ex = Assert.Throws(() => client.GetSession()); + Assert.That(ex.Message, Is.EqualTo(expectedMsg)); + } + + //Connection string + Exception ex1 = Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";connection-attributes=[_foo32=bar,quua=qux,key]")); + Assert.That(ex1.Message, Is.EqualTo(expectedMsg)); + //Uri + ex1 = Assert.Throws(() => MySQLX.GetSession(ConnectionStringUri + "?connection-attributes=[_foo32=bar,quua=qux,key];")); + Assert.That(ex1.Message, Is.EqualTo(expectedMsg)); + //Anonymous object + ex1 = Assert.Throws(() => MySQLX.GetSession(new { server = sb.Server, port = XPort, user = sb.UserID, password = sb.Password, ConnectionAttributes = "[_foo32=bar,quua=qux,key=]" })); + Assert.That(ex1.Message, Is.EqualTo(expectedMsg)); + //MySqlXConnectionStringBuilder + mysqlx0 = new MySqlXConnectionStringBuilder(ConnectionString); + mysqlx0.Database = schemaName; + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.SslMode = MySqlSslMode.Required; + mysqlx0.ConnectTimeout = 1000; + mysqlx0.Keepalive = 10; + mysqlx0.CertificateFile = sslCa; + mysqlx0.CertificatePassword = sslCertificatePassword; + mysqlx0.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysqlx0.CertificateThumbprint = ""; + mysqlx0.ConnectionAttributes = "[_foo32=bar,quua=qux,key=]"; + ex1 = Assert.Throws(() => MySQLX.GetSession(mysqlx0.ConnectionString)); + Assert.That(ex1.Message, Is.EqualTo(expectedMsg)); + + } + + [Test, Description("Connection Attributes with key blank characters - Extending scenarios in ConnectionAttributes()")] + public void ConnectionAttributesKeyBlankChars() + { + Assume.That(Platform.IsWindows(), "This test is for Windows OS only."); + Assume.That(session.Version.isAtLeast(8, 0, 16), "This test is for MySql 8.0.16 or higher"); + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + var expectedMsg = "Key name in connection attribute cannot be an empty string"; + //Connection String + using (Client client = MySQLX.GetClient(ConnectionString + ";connection-attributes=[=bar,quua=qux,key]", "{ \"pooling\": { \"enabled\": true } }")) + { + Exception ex = Assert.Throws(() => client.GetSession()); + Assert.That(ex.Message, Is.EqualTo(expectedMsg)); + } + + //Uri + using (Client client = MySQLX.GetClient(ConnectionStringUri + "?connection-attributes=[=bar,quua=qux,key];", "{ \"pooling\": { \"enabled\": true } }")) + { + Exception ex = Assert.Throws(() => client.GetSession()); + Assert.That(ex.Message, Is.EqualTo(expectedMsg)); + } + + //Anonymous object + using (Client client = MySQLX.GetClient(new { server = sb.Server, port = XPort, user = sb.UserID, password = sb.Password, ConnectionAttributes = "[=bar,quua=qux,key=]" }, "{ \"pooling\": { \"enabled\": true } }")) + { + Exception ex = Assert.Throws(() => client.GetSession()); + Assert.That(ex.Message, Is.EqualTo(expectedMsg)); + } + + //MySqlXConnectionStringBuilder + MySqlXConnectionStringBuilder mysqlx0 = new MySqlXConnectionStringBuilder(ConnectionString); + mysqlx0.Database = schemaName; + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.SslMode = MySqlSslMode.Required; + mysqlx0.ConnectTimeout = 1000; + mysqlx0.Keepalive = 10; + mysqlx0.CertificateFile = sslCa; + mysqlx0.CertificatePassword = sslCertificatePassword; + mysqlx0.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysqlx0.CertificateThumbprint = ""; + mysqlx0.ConnectionAttributes = "[=bar,quua=qux,key=]"; + using (Client client = MySQLX.GetClient(mysqlx0.ConnectionString, "{ \"pooling\": { \"enabled\": true } }")) + { + Exception ex = Assert.Throws(() => client.GetSession()); + Assert.That(ex.Message, Is.EqualTo(expectedMsg)); + } + + //Connection String + Exception ex1 = Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";connection-attributes=[=bar,quua=qux,key]")); + Assert.That(ex1.Message, Is.EqualTo(expectedMsg)); + //Uri + ex1 = Assert.Throws(() => MySQLX.GetSession(ConnectionStringUri + "?connection-attributes=[=bar,quua=qux,key];")); + Assert.That(ex1.Message, Is.EqualTo(expectedMsg)); + //Anonymous object + ex1 = Assert.Throws(() => MySQLX.GetSession(new { server = sb.Server, port = XPort, user = sb.UserID, password = sb.Password, ConnectionAttributes = "[=bar,quua=qux,key=]" })); + Assert.That(ex1.Message, Is.EqualTo(expectedMsg)); + //MySqlXConnectionStringBuilder + mysqlx0 = new MySqlXConnectionStringBuilder(ConnectionString); + mysqlx0.Database = schemaName; + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.SslMode = MySqlSslMode.Required; + mysqlx0.ConnectTimeout = 1000; + mysqlx0.Keepalive = 10; + mysqlx0.CertificateFile = sslCa; + mysqlx0.CertificatePassword = sslCertificatePassword; + mysqlx0.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysqlx0.CertificateThumbprint = ""; + mysqlx0.ConnectionAttributes = "[=bar,quua=qux,key=]"; + ex1 = Assert.Throws(() => MySQLX.GetSession(mysqlx0.ConnectionString)); + Assert.That(ex1.Message, Is.EqualTo(expectedMsg)); + + } + + [Test, Description("Connection Attributes with value 1025characters - Extending scenarios in ConnectionAttributes()")] + public void ConnectionAttributesValue1025Chars() + { + Assume.That(Platform.IsWindows(), "This test is for Windows OS only."); + Assume.That(session.Version.isAtLeast(8, 0, 16), "This test is for MySql 8.0.16 or higher"); + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + var expectedMsg = "Value is too long for 'foo' attribute, currently limited to 1024"; + var strValue = "[foo=12345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781,quua=qux,key=]"; + //Connection String + using (Client client = MySQLX.GetClient(ConnectionString + $";connection-attributes={strValue}", "{ \"pooling\": { \"enabled\": true } }")) + { + Exception ex = Assert.Catch(() => client.GetSession()); + Assert.That(ex.Message, Is.EqualTo(expectedMsg)); + } + //Uri + using (Client client = MySQLX.GetClient(ConnectionStringUri + $"?connection-attributes={strValue};", "{ \"pooling\": { \"enabled\": true } }")) + { + Exception ex = Assert.Catch(() => client.GetSession()); + Assert.That(ex.Message, Is.EqualTo(expectedMsg)); + } + //Anonymous object + using (Client client = MySQLX.GetClient(new { server = sb.Server, port = XPort, user = sb.UserID, password = sb.Password, ConnectionAttributes = strValue }, "{ \"pooling\": { \"enabled\": true } }")) + { + Exception ex = Assert.Catch(() => client.GetSession()); + Assert.That(ex.Message, Is.EqualTo(expectedMsg)); + } + + //MySqlXConnectionStringBuilder + MySqlXConnectionStringBuilder mysqlx0 = new MySqlXConnectionStringBuilder(ConnectionString); + mysqlx0.Database = schemaName; + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.SslMode = MySqlSslMode.Required; + mysqlx0.ConnectTimeout = 1000; + mysqlx0.Keepalive = 10; + mysqlx0.CertificateFile = sslCa; + mysqlx0.CertificatePassword = sslCertificatePassword; + mysqlx0.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysqlx0.CertificateThumbprint = ""; + mysqlx0.ConnectionAttributes = strValue; + using (Client client = MySQLX.GetClient(mysqlx0.ConnectionString, "{ \"pooling\": { \"enabled\": true } }")) + { + Exception ex = Assert.Catch(() => client.GetSession()); + Assert.That(ex.Message, Is.EqualTo(expectedMsg)); + } + //Connection String + Exception ex2 = Assert.Catch(() => MySQLX.GetSession(ConnectionString + $";connection-attributes={strValue}")); + Assert.That(ex2.Message, Is.EqualTo(expectedMsg)); + //Uri + ex2 = Assert.Catch(() => MySQLX.GetSession(ConnectionStringUri + $"?connection-attributes={strValue};")); + Assert.That(ex2.Message, Is.EqualTo(expectedMsg)); + //Anonymous object + ex2 = Assert.Catch(() => MySQLX.GetSession(new { server = sb.Server, port = XPort, user = sb.UserID, password = sb.Password, ConnectionAttributes = strValue })); + Assert.That(ex2.Message, Is.EqualTo(expectedMsg)); + //MySqlXConnectionStringBuilder + mysqlx0 = new MySqlXConnectionStringBuilder(ConnectionString); + mysqlx0.Database = schemaName; + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.SslMode = MySqlSslMode.Required; + mysqlx0.ConnectTimeout = 1000; + mysqlx0.Keepalive = 10; + mysqlx0.CertificateFile = sslCa; + mysqlx0.CertificatePassword = sslCertificatePassword; + mysqlx0.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysqlx0.CertificateThumbprint = ""; + mysqlx0.ConnectionAttributes = strValue; + ex2 = Assert.Catch(() => MySQLX.GetSession(mysqlx0.ConnectionString)); + Assert.That(ex2.Message, Is.EqualTo(expectedMsg)); + + } + + [Test, Description("Supports session restore functionality")] + public void SessionRestore() + { + // This feature was implemented since MySQL Server 8.0.16 + Assume.That(session.Version.isAtLeast(8, 0, 16), "This test is for MySql 8.0.16 or higher"); + int size = 2; + using (Client client = MySQLX.GetClient(ConnectionString + ";database=test;", new { pooling = new { enabled = true, maxSize = size, queueTimeout = 1000, maxIdleTime = 1000 } })) + { + Session session1 = client.GetSession(); + string threadId1 = session1.SQL("SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID=CONNECTION_ID()").Execute().FetchOne()[0].ToString(); + session1.SQL("SET character_set_connection = 'big5'").Execute(); + var res0 = session1.SQL("show variables like 'character_set_connection'").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + Assert.That(row[1].ToString(), Is.EqualTo("big5")); + } + session1.Close(); + Session session2 = client.GetSession(); + string threadId2 = session2.SQL("SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID=CONNECTION_ID()").Execute().FetchOne()[0].ToString(); + Assert.That(threadId1.Equals(threadId2)); + session2.Close(); + } + } + + [Test, Description("Supports new session auth functionality")] + public void SessionAuthentication() + { + // This feature was implemented since MySQL Server 8.0.16 + Assume.That(session.Version.isAtLeast(8, 0, 16), "This test is for MySql 8.0.16 or higher"); + int size = 1; + using (Client client = MySQLX.GetClient(ConnectionString + ";database=test;", new { pooling = new { enabled = true, maxSize = size, queueTimeout = 1000, maxIdleTime = 1000 } })) + { + Session session1 = client.GetSession(); + string threadId1 = session1.SQL("SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID=CONNECTION_ID()").Execute().FetchOne()[0].ToString(); + session1.Close(); + Thread.Sleep(2000); + Session session2 = client.GetSession(); + string threadId2 = session2.SQL("SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID=CONNECTION_ID()").Execute().FetchOne()[0].ToString(); + if (threadId1.Equals(threadId2)) + { + Assert.Fail("Connection ID should have been different because of the Sleep(Timeout) introduced"); + } + session2.Close(); + } + } + + [Test, Description("Supports new session auth functionality")] + public void MultiSessionAuthentication() + { + // This feature was implemented since MySQL Server 8.0.16 + Assume.That(session.Version.isAtLeast(8, 0, 16), "This test is for MySql 8.0.16 or higher"); + int size = 2; + using (Client client = MySQLX.GetClient(ConnectionString + ";database=test;", new { pooling = new { enabled = true, maxSize = size, queueTimeout = 1000, maxIdleTime = 1000 } })) + { + Session session1 = client.GetSession(); + string threadId1 = session1.SQL("SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID=CONNECTION_ID()").Execute().FetchOne()[0].ToString(); + Session session2 = client.GetSession(); + string threadId2 = session2.SQL("SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID=CONNECTION_ID()").Execute().FetchOne()[0].ToString(); + if (threadId1.Equals(threadId2)) + { + Assert.Fail("Connection ID should have been different because pool should contain two sessions"); + } + session1.Close(); + session2.Close(); + + Session session1_1 = client.GetSession(); + Session session2_1 = client.GetSession(); + string threadId3 = session1_1.SQL("SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID=CONNECTION_ID()").Execute().FetchOne()[0].ToString(); + string threadId4 = session2_1.SQL("SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID=CONNECTION_ID()").Execute().FetchOne()[0].ToString(); + if (!threadId1.Equals(threadId3)) + { + Assert.Fail("Connection ID should have been same as session is closed and reopened without any sleep(timeout)"); + } + if (!threadId2.Equals(threadId4)) + { + Assert.Fail("Connection ID should have been same as session is closed and reopened without any sleep(timeout)"); + } + session1_1.Close(); + session2_1.Close(); + //Timeout + Thread.Sleep(2000); + Session session3_1 = client.GetSession(); + Session session4_1 = client.GetSession(); + string threadId5 = session3_1.SQL("SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID=CONNECTION_ID()").Execute().FetchOne()[0].ToString(); + string threadId6 = session4_1.SQL("SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID=CONNECTION_ID()").Execute().FetchOne()[0].ToString(); + Assert.That(threadId3.Equals(threadId5), Is.False); + Assert.That(threadId4.Equals(threadId6), Is.False); + } + } + + #endregion + + #region Methods + + /// + /// Verify cleanup after client closing + /// + /// + /// + /// + /// + public void VerifyDataCleanupAfterClientClose(Client _client1, int iteration, string connectionString, string clientOptions) + { + + Session sess0 = null; + for (int i = 0; i < iteration; i++) + { + sess0 = _client1.GetSession(); + } + sess0.SQL("SET character_set_connection = 'big5'").Execute(); + var res0 = sess0.SQL("show variables like 'character_set_connection'").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + Assert.That(row[1].ToString(), Is.EqualTo("big5")); + } + _client1.Close(); + _client1 = MySQLX.GetClient(connectionString, clientOptions); + Session sess4 = _client1.GetSession(); + res0 = sess4.SQL("show variables like 'character_set_connection'").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + Assert.That(row[1].ToString(), Is.EqualTo("utf8mb4")); + } + } + + /// + /// Verify cleanup after client closing + /// + /// + /// + public void VerifyDataCleanupOneSession(Client client1, int iteration) + { + Session sess0 = null; + for (int i = 0; i < iteration; i++) + { + sess0 = client1.GetSession(); + } + sess0.SQL("SET character_set_connection = 'big5'").Execute(); + var res0 = sess0.SQL("show variables like 'character_set_connection'").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + Assert.That(row[1].ToString(), Is.EqualTo("big5")); + } + sess0.Close(); + Session sess4 = client1.GetSession(); + res0 = sess4.SQL("show variables like 'character_set_connection'").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + Assert.That(row[1].ToString(), Is.EqualTo("utf8mb4")); + } + } + + /// + /// Compare ConnectionIDs with max timeout + /// + /// + /// + /// + public void CompareConnectionIDs(Client client1, int maxTimeout, bool maxTimeoutGreater) + { + string connectionID1 = null, connectionID2 = null; + int cID1 = 0, cID2 = 0, cID3 = 0; + Session sess0 = client1.GetSession(); + sess0.SQL("SET character_set_connection = 'big5'").Execute(); + var res0 = sess0.SQL("show variables like 'character_set_connection'").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + Assert.That(row[1].ToString(), Is.EqualTo("big5")); + } + res0 = sess0.SQL("SELECT CONNECTION_ID()").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + connectionID1 = row[0].ToString(); + cID1 = Int32.Parse(connectionID1); + cID3 = cID1 + 1; + } + sess0.Close(); + sess0 = client1.GetSession(); + res0 = sess0.SQL("show variables like 'character_set_connection'").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + Assert.That(row[1].ToString(), Is.EqualTo("utf8mb4")); + } + res0 = sess0.SQL("SELECT CONNECTION_ID()").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + connectionID2 = row[0].ToString(); + cID2 = Int32.Parse(connectionID2); + } + sess0.Close(); + cID1 = 0; cID2 = 0; cID3 = 0; + sess0 = client1.GetSession(); + sess0.SQL("SET character_set_connection = 'big5'").Execute(); + res0 = sess0.SQL("show variables like 'character_set_connection'").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + Assert.That(row[1].ToString(), Is.EqualTo("big5")); + } + res0 = sess0.SQL("SELECT CONNECTION_ID()").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + connectionID1 = row[0].ToString(); + cID1 = Int32.Parse(connectionID1); + cID3 = cID1 + 1; + } + sess0.Close(); + Thread.Sleep(maxTimeout); + sess0 = client1.GetSession(); + res0 = sess0.SQL("show variables like 'character_set_connection'").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + Assert.That(row[1].ToString(), Is.EqualTo("utf8mb4")); + } + res0 = sess0.SQL("SELECT CONNECTION_ID()").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + connectionID2 = row[0].ToString(); + cID2 = Int32.Parse(connectionID2); + } + sess0.Close(); + if (maxTimeoutGreater) + { + Assert.That(connectionID1.Equals(connectionID2), Is.False); + } + if (maxTimeoutGreater) + { + Assert.That(cID2, Is.Not.EqualTo(cID3)); + } + else + { + Assert.That(cID3 == cID2); + } + } + + /// + /// Compare ConnectionIDs with close of session and client in between + /// + /// + /// + /// + public void CompareConnectionIDs(Client client1, Client client2, Client client3) + { + string connectionID1 = null, connectionID2 = null; + Session sess0 = client1.GetSession(); + sess0.SQL("SET character_set_connection = 'big5'").Execute(); + var res0 = sess0.SQL("show variables like 'character_set_connection'").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + Assert.That(row[1].ToString(), Is.EqualTo("big5")); + } + res0 = sess0.SQL("SELECT CONNECTION_ID()").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + connectionID1 = row[0].ToString(); + } + sess0.Close(); + sess0 = client1.GetSession(); + res0 = sess0.SQL("show variables like 'character_set_connection'").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + Assert.That(row[1].ToString(), Is.EqualTo("utf8mb4")); + } + res0 = sess0.SQL("SELECT CONNECTION_ID()").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + connectionID2 = row[0].ToString(); + } + sess0.Close(); + if (!connectionID1.Equals(connectionID2)) + { + Assert.Fail("Connection ID Matches when a Client1 session0 is closed and opened again"); + } + + Session sess = client2.GetSession(); + sess.SQL("SET character_set_connection = 'big5'").Execute(); + var res = sess.SQL("show variables like 'character_set_connection'").Execute(); + if (res.HasData) + { + var row = res.FetchOne(); + Assert.That(row[1].ToString(), Is.EqualTo("big5")); + } + res = sess.SQL("SELECT CONNECTION_ID()").Execute(); + if (res.HasData) + { + var row = res.FetchOne(); + connectionID1 = row[0].ToString(); + } + client2.Close(); + sess = client3.GetSession(); + res = sess.SQL("show variables like 'character_set_connection'").Execute(); + if (res.HasData) + { + var row = res.FetchOne(); + Assert.That(row[1].ToString(), Is.EqualTo("utf8mb4")); + } + res = sess.SQL("SELECT CONNECTION_ID()").Execute(); + if (res.HasData) + { + var row = res.FetchOne(); + connectionID2 = row[0].ToString(); + } + sess.Close(); + Assert.That(connectionID1.Equals(connectionID2), Is.False); + } + + /// + /// Compare ConnectionIDs with close of session with maxTimeout introduced as a sleep + /// + /// + /// + public void CompareConnectionIDs(Client client1, int maxTimeout, bool maxTimeoutGreater, int sleepTimeout) + { + string connectionID1 = null, connectionID2 = null; + int cID1 = 0, cID2 = 0, cID3 = 0; + Session sess0 = client1.GetSession(); + sess0.SQL("SET character_set_connection = 'big5'").Execute(); + var res0 = sess0.SQL("show variables like 'character_set_connection'").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + Assert.That(row[1].ToString(), Is.EqualTo("big5")); + } + res0 = sess0.SQL("SELECT CONNECTION_ID()").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + connectionID1 = row[0].ToString(); + cID1 = Int32.Parse(connectionID1); + cID3 = cID1 + 1; + } + sess0.Close(); + sess0 = client1.GetSession(); + res0 = sess0.SQL("show variables like 'character_set_connection'").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + Assert.That(row[1].ToString(), Is.EqualTo("utf8mb4")); + } + res0 = sess0.SQL("SELECT CONNECTION_ID()").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + connectionID2 = row[0].ToString(); + cID2 = Int32.Parse(connectionID2); + } + sess0.Close(); + cID1 = 0; cID2 = 0; cID3 = 0; + sess0 = client1.GetSession(); + sess0.SQL("SET character_set_connection = 'big5'").Execute(); + res0 = sess0.SQL("show variables like 'character_set_connection'").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + Assert.That(row[1].ToString(), Is.EqualTo("big5")); + } + res0 = sess0.SQL("SELECT CONNECTION_ID()").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + connectionID1 = row[0].ToString(); + cID1 = Int32.Parse(connectionID1); + cID3 = cID1 + 1; + } + sess0.Close(); + Thread.Sleep(maxTimeout); + sess0 = client1.GetSession(); + res0 = sess0.SQL("show variables like 'character_set_connection'").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + Assert.That(row[1].ToString(), Is.EqualTo("utf8mb4")); + } + res0 = sess0.SQL("SELECT CONNECTION_ID()").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + connectionID2 = row[0].ToString(); + cID2 = Int32.Parse(connectionID2); + } + sess0.Close(); + if (maxTimeoutGreater) + { + Assert.That(connectionID1.Equals(connectionID2), Is.False, "Connection ID Matches when a session is closed and opened again"); + } + if (maxTimeout.CompareTo(sleepTimeout) > 0) + { + Assert.That(cID3 != cID2); + } + else if (maxTimeout.CompareTo(sleepTimeout) == 0) + { + Assert.That(cID1 == cID2); + } + else + { + Assert.That(cID1 == cID2); + } + + } + + /// + /// TestClientQueueTimeout for a client + /// + /// + /// + /// + public void TestClientQueueTimeout(Client client, int minTime, int maxTime) + { + Stopwatch stopwatch = Stopwatch.StartNew(); + Exception ex = Assert.Throws(() => client.GetSession()); + Assert.That(ex.Message, Does.Contain("timeout")); + stopwatch.Stop(); + Assert.That(stopwatch.ElapsedMilliseconds > minTime && stopwatch.ElapsedMilliseconds < maxTime); + } + + /// + /// Set and check the variable character_set_connection + /// + /// + public static void VerifyClient(Client client1) + { + Session sess0 = client1.GetSession(); + sess0.SQL("SET character_set_connection = 'big5'").Execute(); + var res0 = sess0.SQL("show variables like 'character_set_connection'").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + } + sess0.Close(); + client1.Close(); + } + + /// + /// Check the variable character_set_connection in async way + /// + /// + public async void VerifyClientAsync(Client client1) + { + Session sess0 = client1.GetSession(); + var res0 = await sess0.SQL("show variables like 'character_set_connection'").ExecuteAsync(); + if (res0.ColumnCount > 1) + { + var row = res0.FetchOne(); + } + sess0.Close(); + client1.Close(); + } + + #endregion Methods + + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/CloseConnectionTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/CloseConnectionTests.cs new file mode 100644 index 000000000..7f906380c --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/CloseConnectionTests.cs @@ -0,0 +1,281 @@ +// Copyright © 2020, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Diagnostics; +using System.Threading; + +namespace MySqlX.Data.Tests +{ + public class CloseConnectionTests : BaseTest + { + /// + /// WL14166 - XProtocol: Support connection close notification + /// This feature was implemented since MySQL Server 8.0.23 + /// + + /************************************/ + /* Tests for not pooling connections*/ + /************************************/ + // Kill Notice, exception expected + [Test] + public void NotificationKill() + { + Assume.That(session.Version.isAtLeast(8, 0, 23), "This test is for MySql 8.0.23 or higher"); + using (Session session1 = MySQLX.GetSession(ConnectionString)) + { + Schema test = session1.GetSchema("test"); + Assert.That(session1.XSession.SessionState, Is.EqualTo(SessionState.Open)); + var threadId1 = (UInt64)session1.ThreadId; + + // Kill connection + ExecuteSqlAsRoot($"KILL {threadId1};"); + Thread.Sleep(5000); + + Exception ex = Assert.Throws(() => session1.SQL("select 1").Execute()); + Assert.That(ex.Message, Does.Contain(ResourcesX.NoticeKilledConnection)); + + Assert.That(session1.XSession.SessionState, Is.EqualTo(SessionState.Closed)); + } + } + + //Idle Notice, exception expected + [Test] + public void NotificationIdle() + { + Assume.That(session.Version.isAtLeast(8, 0, 23), "This test is for MySql 8.0.23 or higher"); + + ExecuteSqlAsRoot("SET GLOBAL mysqlx_read_timeout = 5"); + ExecuteSqlAsRoot("SET GLOBAL mysqlx_wait_timeout = 5"); + using (Session localsession = MySQLX.GetSession(ConnectionString)) + { + Assert.That(localsession.XSession.SessionState, Is.EqualTo(SessionState.Open)); + //wait for server to kill idle connection + Thread.Sleep(7000); + + Exception ex = Assert.Throws(() => localsession.SQL("select 1").Execute()); + Assert.That(ex.Message, Does.Contain(ResourcesX.NoticeIdleConnection)); + + Assert.That(localsession.XSession.SessionState, Is.EqualTo(SessionState.Closed)); + } + ExecuteSqlAsRoot("SET GLOBAL mysqlx_read_timeout = 28800"); + ExecuteSqlAsRoot("SET GLOBAL mysqlx_wait_timeout = 28800"); + } + + [DatapointSource] + private readonly CloseData[] closeData = new CloseData[] + { + new CloseData { Action = new Action(s => { s.Schema.CreateCollection("collection1"); }) }, + new CloseData { Action = new Action(s => { s.Schema.GetCollections(); }) }, + new CloseData { Action = new Action(s => { s.Schema.GetCollection("collection1",true); }) }, + new CloseData { Action = new Action(s => { s.Schema.GetCollections()[0].Find().Execute(); }) }, + new CloseData { Action = new Action(s => { s.Schema.GetTables(); }) }, + new CloseData { Action = new Action(s => { s.Schema.GetTables()[0].Select().Execute(); }) }, + new CloseData { Action = new Action(s => { s.Schema.GetTable("test").Count(); }) }, + new CloseData { Action = new Action(s => { s.Schema.GetCollection("collection1",true).ExistsInDatabase(); }) }, + new CloseData { Action = new Action(s => { s.Schema.ExistsInDatabase(); }) }, + }; + + [Theory] + public void CloseWarningsWithCollections(CloseData closeData) + { + Assume.That(session.Version.isAtLeast(8, 0, 23), "This test is for MySql 8.0.23 or higher"); + Session sessionCol = null; + sessionCol = MySQLX.GetSession(ConnectionString); + + sessionCol.DropSchema(schemaName); + sessionCol.CreateSchema(schemaName); + var threadId1 = (ulong)sessionCol.ThreadId; + + // Kill connection + ExecuteSqlAsRoot($"KILL {threadId1};"); + Thread.Sleep(5000); + + MySqlException ex = Assert.Throws(() => { closeData.Action.Invoke(sessionCol); }); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.NoticeKilledConnection)); + Assert.That(sessionCol.XSession.SessionState, Is.EqualTo(SessionState.Closed)); + } + + //Shutdown server Notice, exception expected + [Test] + [Ignore("This test is marked as Ignore because it shutdown the local MySQL Server, comment this line to run this test manually")] + public void NotificationShutdown() + { + Assume.That(session.Version.isAtLeast(8, 0, 23), "This test is for MySql 8.0.23 or higher"); + + using (Session localsession = MySQLX.GetSession(BaseTest.ConnectionString)) + { + Assert.That(localsession.XSession.SessionState, Is.EqualTo(SessionState.Open)); + + // Shutdown local MySQL Server + ShutdownServer(); + Thread.Sleep(2000); + + Exception ex = Assert.Throws(() => localsession.SQL("select 1").Execute()); + Assert.That(ex.Message, Does.Contain(ResourcesX.NoticeServerShutdown)); + + Assert.That(localsession.XSession.SessionState, Is.EqualTo(SessionState.Closed)); + } + } + + /*********************************/ + /* Tests for pooling connections */ + /*********************************/ + // Open multiple connection and one receive close notification + [Test] + public void PoolTestCloseOneConnection() + { + Assume.That(session.Version.isAtLeast(8, 0, 23), "This test is for MySql 8.0.23 or higher"); + int size = 3; + int timeout = 3000; + using (Client client = MySQLX.GetClient(ConnectionString + ";database=test;", new { pooling = new { maxSize = size, queueTimeout = timeout } })) + { + //Creeate 3 sessions + Session session1 = client.GetSession(); + Session session2 = client.GetSession(); + Session session3 = client.GetSession(); + int threadId1 = session1.ThreadId; + int threadId2 = session2.ThreadId; + int threadId3 = session3.ThreadId; + //Attempt 4th session + var overflow = Assert.Throws(() => client.GetSession()); + + //kill session 2, exception expected + ExecuteSqlAsRoot($"KILL {threadId2};"); + Thread.Sleep(5000); + + //verify session 1 open + var result1 = session1.SQL("select sqrt(9) as raiz;").Execute().FetchOne().GetString("raiz"); + Assert.That(result1, Does.Contain("3")); + + //try to use session 2 + Exception ex1 = Assert.Throws(() => session2.SQL("select sqrt(9) as raiz;").Execute()); + Assert.That(ex1.Message, Does.Contain(ResourcesX.NoticeKilledConnection)); + + //verify session 3 open + var result2 = session3.SQL("select sqrt(9) as raiz;").Execute().FetchOne().GetString("raiz"); + Assert.That(result2, Does.Contain("3")); + + //try to use session 2 once it is Invalid + Exception ex2 = Assert.Throws(() => session2.SQL("SELECT 5").Execute()); + Assert.That(ex2.Message, Is.EqualTo(ResourcesX.InvalidSession)); + + //reuse session2 + session2 = client.GetSession(); + var result3 = session2.SQL("select sqrt(9) as raiz;").Execute().FetchOne().GetString("raiz"); + Assert.That(result3, Does.Contain("3")); + } + } + + // Open multiple connection and shutdown server + [Test] + [Ignore("This test is marked as Ignore because it shutdown the local MySQL Server, comment this line to run this test manually")] + public void PoolTestShutdown() + { + Assume.That(session.Version.isAtLeast(8, 0, 23), "This test is for MySql 8.0.23 or higher"); + int size = 3; + using (Client client = MySQLX.GetClient(ConnectionString + ";database=test;", new { pooling = new { maxSize = size } })) + { + Session session1 = client.GetSession(); + Session session2 = client.GetSession(); + Session session3 = client.GetSession(); + + // Shutdown MySQL server + ShutdownServer(); + Thread.Sleep(5000); + + // All connections should receive a close notification and become closed and invalid + Exception ex1 = Assert.Throws(() => session1.SQL("select sqrt(9) as raiz;").Execute()); + Assert.That(ex1.Message, Does.Contain(ResourcesX.NoticeServerShutdown)); + + Exception ex2 = Assert.Throws(() => session2.SQL("select sqrt(9) as raiz;").Execute()); + Assert.That(ex2.Message, Does.Contain(ResourcesX.NoticeServerShutdown)); + + Exception ex3 = Assert.Throws(() => session3.SQL("select sqrt(9) as raiz;").Execute()); + Assert.That(ex3.Message, Does.Contain(ResourcesX.NoticeServerShutdown)); + } + } + + // Open multiple connection and wait o be killed by server + [Test] + public void PoolWithIdleConnections() + { + Assume.That(session.Version.isAtLeast(8, 0, 23), "This test is for MySql 8.0.23 or higher"); + int size = 2; + ExecuteSqlAsRoot("SET GLOBAL mysqlx_read_timeout = 5"); + ExecuteSqlAsRoot("SET GLOBAL mysqlx_wait_timeout = 5"); + using (Client client = MySQLX.GetClient(ConnectionString + ";database=test;", new { pooling = new { maxSize = size } })) + { + Session session1 = client.GetSession(); + Session session2 = client.GetSession(); + + // wait for server to kill connections + Thread.Sleep(8000); + + Exception ex1 = Assert.Throws(() => session1.SQL("select sqrt(9) as raiz;").Execute()); + Assert.That(ex1.Message, Does.Contain(ResourcesX.NoticeIdleConnection)); + + Exception ex2 = Assert.Throws(() => session2.SQL("select sqrt(9) as raiz;").Execute()); + Assert.That(ex2.Message, Does.Contain(ResourcesX.NoticeIdleConnection)); + + } + ExecuteSqlAsRoot("SET GLOBAL mysqlx_read_timeout = 28800"); + ExecuteSqlAsRoot("SET GLOBAL mysqlx_wait_timeout = 28800"); + } + + public void ShutdownServer() + { + var basedir = session.SQL("SELECT @@BASEDIR as basedir;").Execute().FetchOne().GetString("basedir"); + basedir += @"bin\"; + var externalProc = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = basedir + "mysqladmin.exe", + Arguments = " -uroot shutdown", + UseShellExecute = true, + RedirectStandardOutput = false, + CreateNoWindow = true, + WorkingDirectory = basedir + } + }; + + externalProc.Start(); + ServerIsDown = true; + } + public struct CloseData + { + public Action Action { get; set; } + } + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/CollectionAsyncTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/CollectionAsyncTests.cs new file mode 100644 index 000000000..47c992ffc --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/CollectionAsyncTests.cs @@ -0,0 +1,135 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Common; +using MySqlX.XDevAPI.CRUD; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace MySqlX.Data.Tests +{ + public class CollectionAsyncTests : BaseTest + { + [Test] + public void CollectionInsert() + { + var coll = CreateCollection("test"); + List> tasksList = new List>(); + + for (int i = 1; i <= 200; i++) + { + tasksList.Add(coll.Add(string.Format(@"{{ ""_id"": {0}, ""foo"": {0} }}", i)).ExecuteAsync()); + } + + Task.WaitAll(tasksList.ToArray(), TimeSpan.FromMinutes(1)); + + var count = session.SQL("SELECT COUNT(*) FROM test.test").Execute().FetchOne()[0]; + Assert.That(coll.Count(), Is.EqualTo(count)); + } + + [Test] + public void MultipleFindAsync() + { + var coll = CreateCollection("test"); + int docs = 100; + HashSet validator = new HashSet(); + var addStatement = coll.Add(new { id = 1, age = 1 }); + + for (int i = 2; i <= docs; i++) + { + addStatement.Add(new { id = i, age = i }); + } + var result = ExecuteAddStatement(addStatement); + + List>> tasksList = new List>>(); + + for (int i = 1; i <= docs; i++) + { + tasksList.Add(coll.Find("age = :age").Bind("AgE", i).ExecuteAsync()); + } + + Assert.That(Task.WaitAll(tasksList.ToArray(), TimeSpan.FromMinutes(2)), "WaitAll timeout"); + foreach (Task> task in tasksList) + { + var doc = task.Result.FetchOne(); + string value = task.Result.Current["age"].ToString(); + Assert.That(validator.Contains(value), Is.False, value + " value exists"); + validator.Add(value); + } + Assert.That(validator.Count, Is.EqualTo(docs)); + } + + [Test, Description("Create valid index using a document field type of array and setting array to true/with single key on all possible datatypes concurrently)")] + public async Task IndexArrayMultiThreading() + { + var coll = CreateCollection("test"); + // For server not supporting array indexes, array option will be ignored and and old-style index will be created. + if (!session.Version.isAtLeast(8, 0, 17)) + { + coll.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"DATE\", \"array\": true}]}"); + return; + } + int v1 = await IndexArrayMultiThreading_T1(); + int v2 = await IndexArrayMultiThreading_T2(); + + Assert.That(v1 + v2, Is.EqualTo(2)); + } + + private async Task IndexArrayMultiThreading_T1() + { + Schema test = session.GetSchema(schemaName); + var coll = test.GetCollection("test"); + Thread.Sleep(100); + coll.CreateIndex("multiArrayIndex1", "{\"fields\": [{\"field\": \"$.intField\", \"type\": \"INT\", \"array\": false}," + + "{\"field\": \"$.charField\", \"type\": \"CHAR(255)\", \"array\": false}," + + "{\"field\": \"$.decimalField\", \"type\": \"DECIMAL\", \"array\": true}," + + "{\"field\": \"$.dateField\", \"type\": \"DATE\", \"array\": false}," + + "{\"field\": \"$.timeField\", \"type\": \"TIME\", \"array\": false}," + + "{\"field\": \"$.datetimeField\", \"type\": \"DATETIME\", \"array\": false}]}"); + return 1; + } + + private async Task IndexArrayMultiThreading_T2() + { + Schema test = session.GetSchema(schemaName); + var coll = test.GetCollection("test"); + coll.CreateIndex("multiArrayIndex2", "{\"fields\": [{\"field\": \"$.intField\", \"type\": \"INT\", \"array\": false}," + + "{\"field\": \"$.charField\", \"type\": \"CHAR(255)\", \"array\": false}," + + "{\"field\": \"$.decimalField\", \"type\": \"DECIMAL\", \"array\": true}," + + "{\"field\": \"$.dateField\", \"type\": \"DATE\", \"array\": false}," + + "{\"field\": \"$.timeField\", \"type\": \"TIME\", \"array\": false}," + + "{\"field\": \"$.datetimeField\", \"type\": \"DATETIME\", \"array\": false}]}"); + return 1; + } + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/CollectionIndexTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/CollectionIndexTests.cs new file mode 100644 index 000000000..1994f681c --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/CollectionIndexTests.cs @@ -0,0 +1,1857 @@ +// Copyright © 2017, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Common; +using MySqlX.XDevAPI.CRUD; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace MySqlX.Data.Tests +{ + public class CollectionIndexTests : BaseTest + { + public string longval = "123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567"; + + [Test] + public void IncorrectlyFormatedIndexDefinition() + { + var collection = CreateCollection("test"); + + Exception ex = Assert.Throws(() => collection.CreateIndex("myIndex", "{\"type\": \"INDEX\" }")); + Assert.That(ex.Message, Is.EqualTo("Field 'fields' is mandatory")); + + ex = Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"TEXT\" } ], \"unexpectedField\" : false }")); + Assert.That(ex.Message, Is.EqualTo("Field name 'unexpectedField' is not allowed")); + + ex = Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [ { \"fields\":$.myField, \"types\":\"TEXT\" } ] }")); + Assert.That(ex.Message, Is.EqualTo("Field 'field' is mandatory")); + + ex = Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"types\":\"TEXT\" } ] }")); + Assert.That(ex.Message, Is.EqualTo("Field 'type' is mandatory")); + + ex = Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"TEXT\", \"unexpectedField\" : false } ] }")); + Assert.That(ex.Message, Is.EqualTo("Field name 'unexpectedField' is not allowed")); + + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + collection = CreateCollection("test"); + + ex = Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"INT\" } ], \"type\":\"indexa\" }")); + Assert.That(ex.Message, Is.EqualTo("Argument value 'indexa' for index type is invalid")); + + ex = Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"INT\" } ], \"type\":\"OTheR\" }")); + Assert.That(ex.Message, Is.EqualTo("Argument value 'OTheR' for index type is invalid")); + + ex = Assert.Throws(() => collection.CreateIndex("myIndex1", "{\"fields\": [ { \"field\":$.myGeoJsonField, \"type\":\"GEOJSON\" } ], \"type\":\"Spatial\" }")); + Assert.That(ex.Message, Is.EqualTo("GEOJSON index requires 'constraint.required: TRUE")); + + ex = Assert.Throws(() => collection.CreateIndex("myIndex2", "{\"fields\": [ { \"field\":$.myGeoJsonField, \"type\":\"GEOJSON\" } ], \"type\":\"spatial\" }")); + Assert.That(ex.Message, Is.EqualTo("GEOJSON index requires 'constraint.required: TRUE")); + + ex = Assert.Throws(() => collection.CreateIndex("myIndex3", "{\"fields\": [ { \"field\":$.myGeoJsonField, \"type\":\"GEOJSON\" } ], \"type\":\"sPaTiAl\" }")); + Assert.That(ex.Message, Is.EqualTo("GEOJSON index requires 'constraint.required: TRUE")); + } + + [Test] + public void CreateIndexOnSingleFieldWithDefaultOptions() + { + var collection = CreateCollection("test"); + + collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"TEXT(10)\" } ] }"); + ValidateIndex("myIndex", "test", "t10", false, false, false, 1, 10); + } + + [Test] + public void CreateIndexOnSingleFieldWithAllOptions() + { + var collection = CreateCollection("test"); + + collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"INT\", \"required\": true } ] }"); + ValidateIndex("myIndex", "test", "i", false, true, false, 1); + } + + [Test] + public void CreateIndexOnMultipleFields() + { + var collection = CreateCollection("test"); + + collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"INT\" }, { \"field\":$.myField2, \"type\":\"INT\" }, { \"field\":$.myField3, \"type\":\"INT\" } ] }"); + ValidateIndex("myIndex", "test", "i", false, false, false, 1); + ValidateIndex("myIndex", "test", "i", false, false, false, 2); + ValidateIndex("myIndex", "test", "i", false, false, false, 3); + } + + [Test] + public void CreateIndexOnMultipleFieldsWithAllOptions() + { + var collection = CreateCollection("test"); + + collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"INT\" }, { \"field\":$.myField2, \"type\":\"INT\", \"required\":true }, { \"field\":$.myField3, \"type\":\"INT UNSIGNED\", \"required\":false } ] }"); + ValidateIndex("myIndex", "test", "i", false, false, false, 1); + ValidateIndex("myIndex", "test", "i", false, true, false, 2); + ValidateIndex("myIndex", "test", "i_u", false, false, true, 3); + } + + [Test] + public void CreateTypeSpecificIndexesCaseInsensitive() + { + var collection = CreateCollection("test"); + + // Datetime index. + collection.DropIndex("myIndex"); + collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"daTEtiME\" } ] }"); + ValidateIndex("myIndex", "test", "dd", false, false, false, 1); + + // Timestamp index. + collection.DropIndex("myIndex"); + string explicitDefaultTimestamp = session.SQL("SHOW VARIABLES LIKE 'explicit_defaults_for_timestamp'").Execute().FetchAll()[0][1].ToString(); + collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"TIMESTAMP\" } ] }"); + ValidateIndex("myIndex", "test", "ds", false, explicitDefaultTimestamp == "OFF" ? true : false, false, 1); + + // Time index. + collection.DropIndex("myIndex"); + collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"time\" } ] }"); + ValidateIndex("myIndex", "test", "dt", false, false, false, 1); + + // Date index. + collection.DropIndex("myIndex"); + collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"DATE\" } ] }"); + ValidateIndex("myIndex", "test", "d", false, false, false, 1); + + // Numeric index. + collection.DropIndex("myIndex"); + collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"NUMERIC UNSIGNED\" } ] }"); + ValidateIndex("myIndex", "test", "xn_u", false, false, true, 1); + + // Decimal index. + collection.DropIndex("myIndex"); + collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"DECIMAL\" } ] }"); + ValidateIndex("myIndex", "test", "xd", false, false, false, 1); + + // Double index. + collection.DropIndex("myIndex"); + collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"double UNSIGNED\" } ] }"); + ValidateIndex("myIndex", "test", "fd_u", false, false, true, 1); + + // Float index. + collection.DropIndex("myIndex"); + collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"FLOAT UNSIGNED\" } ] }"); + ValidateIndex("myIndex", "test", "f_u", false, false, true, 1); + + // Real index. + collection.DropIndex("myIndex"); + collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"REAL UNSIGNED\" } ] }"); + ValidateIndex("myIndex", "test", "fr_u", false, false, true, 1); + + // Bigint index. + collection.DropIndex("myIndex"); + collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"BIGINT UNSIGNED\" } ] }"); + ValidateIndex("myIndex", "test", "ib_u", false, false, true, 1); + + // Int index. + collection.DropIndex("myIndex"); + collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"INTEGER unsigned\" } ] }"); + ValidateIndex("myIndex", "test", "i_u", false, false, true, 1); + + // Mediumint index. + collection.DropIndex("myIndex"); + collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"MEDIUMINT UNSIGNED\" } ] }"); + ValidateIndex("myIndex", "test", "im_u", false, false, true, 1); + + // Smallint index. + collection.DropIndex("myIndex"); + collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"SMALLINT UNSIGNED\" } ] }"); + ValidateIndex("myIndex", "test", "is_u", false, false, true, 1); + + // Tinyint index. + collection.DropIndex("myIndex"); + collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"TINYINT UNSIGNED\" } ] }"); + ValidateIndex("myIndex", "test", "it_u", false, false, true, 1); + + // Geojson index. + collection.DropIndex("myIndex"); + collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"GEOJSON\", \"required\":true, \"options\":2, \"srid\":4326 } ], \"type\":\"SPATIAL\" }"); + ValidateIndex("myIndex", "test", "gj", false, true, false, 1); + } + + [Test] + public void DropIndex() + { + var collection = CreateCollection("test"); + + collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"TEXT(64)\" }, { \"field\":$.myField2, \"type\":\"TEXT(10)\", \"required\":true }, { \"field\":$.myField3, \"type\":\"INT UNSIGNED\", \"required\":false } ] }"); + ValidateIndex("myIndex", "test", "t64", false, false, false, 1, 64); + ValidateIndex("myIndex", "test", "t10", false, true, false, 2, 10); + ValidateIndex("myIndex", "test", "i_u", false, false, true, 3); + + collection.DropIndex("myIndex"); + Exception ex = Assert.Throws(() => ValidateIndex("myIndex", "test", "t10", false, false, false, 1, 10)); + Assert.That(ex.Message, Is.EqualTo("Index not found.")); + ex = Assert.Throws(() => ValidateIndex("myIndex", "test", "t10", false, true, false, 2, 10)); + Assert.That(ex.Message, Is.EqualTo("Index not found.")); + ex = Assert.Throws(() => ValidateIndex("myIndex", "test", "i_u", false, false, true, 3)); + Assert.That(ex.Message, Is.EqualTo("Index not found.")); + } + + [Test] + public void CreateIndexWithDuplicateName() + { + var collection = CreateCollection("test"); + + collection.CreateIndex("myUniqueIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"INT\" } ] }"); + Exception ex = Assert.Throws(() => collection.CreateIndex("myUniqueIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"INT\" } ] }")); + Assert.That(ex.Message, Is.EqualTo("Duplicate key name 'myUniqueIndex'")); + } + + [Test] + public void CreateIndexWithInvalidJsonDocumentDefinition() + { + var collection = CreateCollection("test"); + + Exception ex = Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\" = $.myField, \"type\" = \"TEXT\" } ] }")); + Assert.That(ex.Message, Is.EqualTo("The value provided is not a valid JSON document. Expected token ':'")); + ex = Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"TEXT\" ] }")); + Assert.That(ex.Message, Is.EqualTo("The value provided is not a valid JSON document. Expected token ','")); + ex = Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, type:\"TEXT\" } }")); + Assert.That(ex.Message, Is.EqualTo("The value provided is not a valid JSON document. Expected token '\"'")); + } + + [Test] + public void CreateIndexWithInvalidJsonDocumentStructure() + { + var collection = CreateCollection("test"); + + Exception ex = Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"INT\", \"myCustomField\":\"myCustomValue\" } ] }")); + Assert.That(ex.Message, Is.EqualTo("Field name 'myCustomField' is not allowed")); + ex = Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"mytype\":\"INT\" } ] }")); + Assert.That(ex.Message, Is.EqualTo("Field 'type' is mandatory")); + ex = Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [ { \"myfield\":$.myField, \"type\":\"INT\" } ] }")); + Assert.That(ex.Message, Is.EqualTo("Field 'field' is mandatory")); + ex = Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.name, \"type\":\"TEXT\" , \"myCustomField\":\"myCustomValue\"} ] }")); + Assert.That(ex.Message, Is.EqualTo("Field name 'myCustomField' is not allowed")); + ex = Assert.Throws(() => collection.CreateIndex("myIndex", "")); + Assert.That(ex.Message, Is.EqualTo("The value provided is not a valid JSON document. Index was outside the bounds of the array.")); + } + + [Test] + public void CreateIndexWithTypeNotIndexOrSpatial() + { + var collection = CreateCollection("test"); + + Exception ex = Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"INT\" } ], \"type\":\"indexa\" }")); + Assert.That(ex.Message, Is.EqualTo("Argument value 'indexa' for index type is invalid")); + ex = Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"INT\" } ], \"type\":\"OTheR\" }")); + Assert.That(ex.Message, Is.EqualTo("Argument value 'OTheR' for index type is invalid")); + } + + [Test] + public void CreateSpatialIndexWithRequiredSetToFalse() + { + var collection = CreateCollection("test"); + + Exception ex = Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"GEOJSON\", \"required\":false, \"options\":2, \"srid\":4326 } ], \"type\":\"SPATIAL\" }")); + Assert.That(ex.Message, Is.EqualTo("GEOJSON index requires 'constraint.required: TRUE")); + } + + [Test] + public void CreateIndexWithInvalidType() + { + var collection = CreateCollection("test"); + + // Missing key length for text type. + Exception ex = Assert.Throws(() => collection.CreateIndex("myIndex", "{ \"fields\": [ { \"field\":\"$.myField\", \"type\":\"Text\" } ] }")); + Assert.That(ex.Message, Does.EndWith("used in key specification without a key length")); + + // Invalid index types. + ex = Assert.Throws(() => collection.CreateIndex("myIndex", "{ \"fields\": [ { \"field\":\"$.myField\", \"type\":\"Texta\" } ] }")); + Assert.That(ex.Message, Does.EndWith("Invalid or unsupported type specification 'Texta'")); + ex = Assert.Throws(() => collection.CreateIndex("myIndex", "{ \"fields\": [ { \"field\":\"$.myField\", \"type\":\"INTO\" } ] }")); + Assert.That(ex.Message, Does.EndWith("Invalid or unsupported type specification 'INTO'")); + try + { + collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.name, \"type\":\"Datetime\"} ] }"); + collection.DropIndex("myIndex"); + collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.name, \"type\":\"Real\"} ] }"); + collection.DropIndex("myIndex"); + collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.name, \"type\":\"Integer\"} ] }"); + collection.DropIndex("myIndex"); + } + catch (Exception) + { + Assert.Fail("Unexpected Exception: " + ex.Message); + } + } + + [Test] + public void CreateIndexWithInvalidGeojsonOptions() + { + var collection = CreateCollection("test"); + + Exception ex = Assert.Throws(() => collection.CreateIndex("myIndex", "{ \"fields\": [ { \"field\":\"$.myField\", \"type\":\"INT\", \"options\":2, \"srid\":4326 } ] }")); + Assert.That(ex.Message, Is.EqualTo("Unsupported argument specification for '$.myField'")); + + ex = Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"GEOJSON\", \"options\":2, \"srid\":4326 } ], \"type\":\"SPATIAL\" }")); + Assert.That(ex.Message, Is.EqualTo("GEOJSON index requires 'constraint.required: TRUE")); + } + + [Test] + public void ValidIndexNames() + { + var collection = CreateCollection("test"); + + collection.CreateIndex("01myIndex", "{ \"fields\": [ { \"field\":\"$.myField\", \"type\":\"TEXT(64)\" } ] }"); + ValidateIndex("01myIndex", "test", "t64", false, false, false, 1, 64); + collection.DropIndex("01myIndex"); + + collection.CreateIndex("!myIndex", "{ \"fields\": [ { \"field\":\"$.myField\", \"type\":\"TEXT(64)\" } ] }"); + ValidateIndex("!myIndex", "test", "t64", false, false, false, 1, 64); + collection.DropIndex("!myIndex"); + + collection.CreateIndex("-myIndex", "{ \"fields\": [ { \"field\":\"$.myField\", \"type\":\"TEXT(64)\" } ] }"); + ValidateIndex("-myIndex", "test", "t64", false, false, false, 1, 64); + collection.DropIndex("-myIndex"); + + Exception ex = Assert.Throws(() => collection.CreateIndex(null, "{\"fields\": [ { \"field\":$.name, \"type\":\"TEXT(64)\" , \"required\":true} ] }")); + Assert.That(ex.Message, Is.EqualTo("Invalid value for argument 'name'")); + ex = Assert.Throws(() => collection.CreateIndex("myIndex1243536464r4urgfu4rgh43urvbnu4rgh4u3rive39irgf9r4fri3jgnfi", "{\"fields\": [ { \"field\":$.name, \"type\":\"TEXT(64)\" , \"required\":true} ] }")); + Assert.That(ex.Message, Is.EqualTo("Identifier name 'myIndex1243536464r4urgfu4rgh43urvbnu4rgh4u3rive39irgf9r4fri3jgnfi' is too long")); + } + + [Test] + public void CreateIndexWithArrayOption() + { + var collection = CreateCollection("test"); + Assume.That(session.Version.isAtLeast(8, 0, 17), "This test is for MySql 8.0.17 or higher"); + + // Supported types + var doc = new[] { new { _id = 1, name = "Char", myField = new[] { "foo@mail.com", "bar@mail.com", "qux@mail.com" } } }; + collection.Add(doc).Execute(); + CreateArrayIndex("CHAR(128)", collection); + + doc = new[] { new { _id = 1, name = "Time", myField = new[] { "01:01:01.001", "23:59:59.15", "12:00:00" } } }; + collection.Add(doc).Execute(); + CreateArrayIndex("TIME", collection); + + doc = new[] { new { _id = 1, name = "Date", myField = new[] { "2019-01-01", "2019-01-01 12:15:00" } } }; + collection.Add(doc).Execute(); + CreateArrayIndex("DATE", collection); + + doc = new[] { new { _id = 1, name = "Int", myField = new[] { "3", "254", "19" } } }; + collection.Add(doc).Execute(); + CreateArrayIndex("SIGNED", collection); + + doc = new[] { new { _id = 1, name = "Decimal", myField = new[] { "3.0", "254.51", "19" } } }; + collection.Add(doc).Execute(); + CreateArrayIndex("DECIMAL(10,2)", collection); + + testSchema.DropCollection("test"); + collection = CreateCollection("test"); + + Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"TINYINT\", \"array\": true}]}")); + Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"GEOJSON\", \"required\":true, \"options\":2, \"srid\":4326, \"array\": true } ], \"type\":\"SPATIAL\" }")); + + Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"CHAR(128)\", \"array\": true, \"required\":true}]}")); + + Assert.Throws(() => collection.CreateIndex("index_1", "{\"fields\": [{\"field\": $.field1, \"type\":\"CHAR(128)\", \"array\": true}, " + + "{\"field\": $.field2, \"type\":\"CHAR(128)\", \"array\": true}]}")); + + Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"TINYINT\", \"array\": null}]}")); + Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"TINYINT\", \"array\": NULL}]}")); + } + + #region WL14389 + + [Test, Description("Add Collection index")] + public void AddIndexAndInsertRecords() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + Collection testColl = CreateCollection("test1"); + Assert.That(testColl.ExistsInDatabase()); + testColl.CreateIndex("testIndex", "{\"fields\": [ { \"field\":$.myId, \"type\":\"INTEGER UNSIGNED\" , \"required\":true} ] }"); + testColl.CreateIndex("testIndex1", "{\"fields\": [ { \"field\":$.myAge, \"type\":\"FLOAT UNSIGNED\" , \"required\":true} ] }"); + var result = testColl.Add(new { myId = 1, myAge = 35.1, _id = 1 }).Add(new { myId = 2, myAge = 41.9, _id = 2 }).Execute(); + Assert.That(result.AffectedItemsCount > 0); + Collection testCol2 = CreateCollection("test2"); + testCol2.CreateIndex("testIndex2", "{\"fields\": [ { \"field\":$.myId, \"type\":\"INT\" , \"required\":true} ] }"); + result = testCol2.Add(new { myId = 1 }).Execute(); + Assert.That(result.AffectedItemsCount > 0); + } + + [Test, Description("Create valid index on a single key with all options")] + public void InsertWithValidIndexAndNoIndex() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + var col = CreateCollection("my_collection"); + Result result = col.Add(new { name = "Sakila", age = 15 }).Execute(); + col.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.name, \"type\":\"TEXT(64)\" , \"required\":true} ] }"); + Assert.Throws(() => ExecuteAddStatement(col.Add(new { age = 10 }))); + col.DropIndex("myIndex"); + result = col.Add(new { age = 10 }).Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + } + + [Test, Description("Create a valid index on a single key of all DATATYPES.Datatypes supported: INT [UNSIGNED] TINYINT [UNSIGNED] SMALLINT [UNSIGNED] MEDIUMINT [UNSIGNED] INTEGER [UNSIGNED] BIGINT [UNSIGNED] REAL [UNSIGNED] FLOAT [UNSIGNED] DOUBLE [UNSIGNED] DECIMAL [UNSIGNED] NUMERIC [UNSIGNED] DATE TIME TIMESTAMP DATETIME TEXT[(length)]")] + public void IndexOfAllDatatypes() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + var col = CreateCollection("my_collection"); + + Result result = col.Add(new { name = "Sakila", age = 15, date_time = "2010-01-01 00:00:00", time_stamp = "2015-01-01 00:11:02", date_check = "2117-12-17", time_check = "12:14:07", real_check = 12E+4, decimal_check = 122.134, float_check = 11.223, double_check = 23.32343425, numeric_check = 1122.3434, tiny_int = 112, medium_int = 12345, big_int = 1234567, int_check = 174734 }).Execute(); + col.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.name, \"type\":\"TEXT(64)\" , \"required\":true} ] }"); + Assert.Throws(() => ExecuteAddStatement(col.Add(new { age = 21 }))); + + col.DropIndex("myIndex"); + col.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.age, \"type\":\"INTEGER UNSIGNED\" , \"required\":true} ] }"); + Assert.Throws(() => ExecuteAddStatement(col.Add(new { name = "abc" }))); + + col.DropIndex("myIndex"); + col.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.time_stamp, \"type\":\"TIMESTAMP\", \"required\":true } ] }"); + Assert.Throws(() => ExecuteAddStatement(col.Add(new { name = "abc" }))); + + col.DropIndex("myIndex"); + col.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.time_check, \"type\":\"TIME\", \"required\":true } ] }"); + Assert.Throws(() => ExecuteAddStatement(col.Add(new { name = "abc" }))); + + col.DropIndex("myIndex"); + col.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.real_check, \"type\":\"REAL\", \"required\":true } ] }"); + Assert.Throws(() => ExecuteAddStatement(col.Add(new { name = "abc" }))); + + col.DropIndex("myIndex"); + col.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.decimal_check, \"type\":\"DECIMAL UNSIGNED\",\"required\":true} ] }"); + Assert.Throws(() => ExecuteAddStatement(col.Add(new { name = "abc" }))); + + col.DropIndex("myIndex"); + col.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.float_check, \"type\":\"FLOAT UNSIGNED\", \"required\":true } ] }"); + Assert.Throws(() => ExecuteAddStatement(col.Add(new { name = "abc" }))); + + col.DropIndex("myIndex"); + col.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.decimal_check, \"type\":\"DECIMAL UNSIGNED\" , \"required\":true } ] }"); + Assert.Throws(() => ExecuteAddStatement(col.Add(new { name = "abc" }))); + + col.DropIndex("myIndex"); + col.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.numeric_check, \"type\":\"NUMERIC UNSIGNED\", \"required\":true } ] }"); + Assert.Throws(() => ExecuteAddStatement(col.Add(new { name = "abc" }))); + + col.DropIndex("myIndex"); + col.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.tiny_int, \"type\":\"TINYINT\" , \"required\":true} ] }"); + Assert.Throws(() => ExecuteAddStatement(col.Add(new { name = "abc" }))); + + col.DropIndex("myIndex"); + col.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.medium_int, \"type\":\"MEDIUMINT\" , \"required\":true} ] }"); + Assert.Throws(() => ExecuteAddStatement(col.Add(new { name = "abc" }))); + + col.DropIndex("myIndex"); + col.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.int_check, \"type\":\"INT\" , \"required\":true} ] }"); + Assert.Throws(() => ExecuteAddStatement(col.Add(new { name = "abc" }))); + } + + [Test, Description("Create an index with mismatched data types")] + public void IndexWithMismatchedDatatypes() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + var col = CreateCollection("my_collection"); + Result result = col.Add(new { name = "Sakila", age = 15 }).Execute(); + Thread.Sleep(2000); + Exception ex = Assert.Throws(() => col.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.name, \"type\":\"DATETIME\"} ] }")); + Assert.That(ex.Message, Does.Contain("Incorrect datetime value")); + } + + [Test, Description("Create an index specifiying SPATIAL as the index type for a non spatial data type and vice versa")] + public void IndexSpatialForNonSpatialDatatype() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + var col = CreateCollection("my_collection"); + Result result = col.Add(new { name = "Sakila", age = 15 }).Execute(); + Assert.Throws(() => col.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.name, \"type\":\"TEXT\"} ] , \"type\":\"SPATIAL\" }")); + col.DropIndex("myIndex"); + Assert.Throws(() => col.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.name, \"type\":\"GEOJSON\"} ] , \"type\":\"INDEX\" }")); + } + + /// + /// Bug 28343828(8.0.13) fix - Server should raise error whenever a length isn't provided for the TEXT index type + /// + [Test, Description("Create valid index with index definition given as DbDoc")] + public void CreateIndexGivenDbDoc() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + var col = CreateCollection("my_collection"); + Result result = col.Add(new { name = "Sakila", age = 15 }).Execute(); + + var data2 = new DbDoc(@"{ + ""fields"": [ + {""field"" : $.name, ""type"" : ""TEXT(64)"",""required"" : true} + ] + }"); + col.CreateIndex("myIndex", data2); + Assert.Throws(() => ExecuteAddStatement(col.Add(new { age = 10 }))); + } + + [Test, Description("Create valid index on member of Array type as key")] + public void IndexOnArrayMember() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + + var col = CreateCollection("my_collection"); + + var t1 = "{\"_id1\": \"1002\", \"ARR1\":[\"name1\",\"name2\",\"name3\"]}"; + col.Add(t1).Execute(); + + col.CreateIndex("myIndex1", "{\"fields\": [{\"field\":\"$.ARR1\",\"type\": \"TEXT(64)\"}]}"); + ValidateIndex("myIndex1", "my_collection", "t64", false, false, false, 1, 64); + col.DropIndex("myIndex1"); + + var t2 = "{\"_id2\": \"2\",\"address2\": {\"zip2\":\"325226\", \"city2\": \"San Francisco\"}}"; + col.Add(t2).Execute(); + col.CreateIndex("myIndex2", "{\"fields\": [{\"field\":\"$.address2[0].city2\",\"type\": \"TEXT(100)\"}]}"); + ValidateIndex("myIndex2", "my_collection", "t100", false, false, false, 1, 100); + col.DropIndex("myIndex2"); + + var t3 = "{\"_id3\": \"32\",\"address3\": [{\"zip3\":\"325227\", \"city3\": \"New York\"}]}"; + col.Add(t3).Execute(); + col.CreateIndex("myIndex3", "{\"fields\": [{\"field\":\"$.address3[0].city3\",\"type\": \"TEXT(100)\"}]}"); + ValidateIndex("myIndex3", "my_collection", "t100", false, false, false, 1, 100); + col.DropIndex("myIndex3"); + + col.CreateIndex("myIndex4", "{\"fields\": [{\"field\":\"$.address3\",\"type\": \"TEXT(64)\"}]}"); + ValidateIndex("myIndex4", "my_collection", "t64", false, false, false, 1, 64); + col.DropIndex("myIndex4"); + + var t4 = "{\"_id\": \"4\",\"address4\": [{\"zip4\":\"32522\", \"city4\": \"New Delhi\"},{\"zip5\": \"325228\", \"city5\":\"Bangalore\"}]}"; + col.Add(t4).Execute(); + col.CreateIndex("myIndex5", "{\"fields\": [{\"field\":\"$.address4[0].city4\",\"type\": \"TEXT(160)\"}]}"); + ValidateIndex("myIndex5", "my_collection", "t160", false, false, false, 1, 160); + col.DropIndex("myIndex5"); + + col.CreateIndex("myIndex6", "{\"fields\": [{\"field\":\"$.address4\",\"type\": \"TEXT(60)\"}]}"); + ValidateIndex("myIndex6", "my_collection", "t60", false, false, false, 1, 60); + col.DropIndex("myIndex6"); + } + + [Test, Description("Create valid index on member of DbDoc type as key")] + public void IndexOnDbDocMember() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + var col = CreateCollection("my_collection"); + DbDoc data2 = new DbDoc(); + data2.SetValue("name", "Sakila"); + data2.SetValue("age", 20); + Result result = col.Add(data2).Execute(); + Assert.Throws(() => col.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.name, \"type\":\"TEXT\" , \"required\":true} ] }")); + col.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.name, \"type\":\"TEXT(64)\" , \"required\":true} ] }"); + DbDoc data1 = new DbDoc(); + data1.SetValue("age", 20); + Assert.Throws(() => ExecuteAddStatement(col.Add(data1))); + } + + [Test, Description("Create valid index perform CRUD operations")] + public void CountRecordsInsertedWithValidIndex() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + var col = CreateCollection("my_collection"); + Result result = col.Add(new { name = "Sakila", age = 15 }).Execute(); + Assert.Throws(() => col.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.name, \"type\":\"TEXT\" , \"required\":true} ] }")); + col.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.name, \"type\":\"TEXT(30)\" , \"required\":true} ] }"); + result = col.Add(new { name = "Maria", age = 20 }).Execute(); + result = col.Add(new { name = "Maria", age = 21 }).Execute(); + var Removing = col.Remove("name='Maria'").Execute(); + Assert.That((int)Removing.AffectedItemsCount, Is.EqualTo(2), "Matches"); + } + + [Test, Description("Create invalid index with non-existent key")] + public void InvalidIndexNonExistentKey() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + var col = CreateCollection("my_collection"); + Result result = col.Add(new { age = 15 }).Execute(); + Assert.Throws(() => col.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.name, \"type\":\"TEXT\" , \"required\":\"true\"} ]}")); + } + + [Test, Description("Create a valid index in async way")] + public async Task CreateIndexInAsync() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + var col = CreateCollection("my_collection"); + await col.Add(new { name = "Sakila", age = 15 }).ExecuteAsync(); + col.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.name, \"type\":\"TEXT(64)\" , \"required\":true} ] }"); + } + + /// + /// //Bug29692534 + /// + [Test, Description("Create valid index using a document field type of array and setting array to true with single key on all possible datatypes-data inserted and then index created")] + public void IndexWithArrayOptionSingleKeyAfterInsertData() + { + Assume.That(session.Version.isAtLeast(8, 0, 17), "This test is for MySql 8.0.17 or higher"); + var collection = CreateCollection("test"); + + // Supported types + var doc = new[] { new { _id = 1, name = "Char", myField = new[] { "foo@mail.com", "bar@mail.com", "qux@mail.com" } } }; + collection.Add(doc).Execute(); + CreateArrayIndex("CHAR(128)", collection); + collection.Add(doc).Execute(); + CreateArrayIndex("CHAR(128)", collection); + + doc = new[] { new { _id = 1, name = "Binary", myField = new[] { "foo@mail.com", "bar@mail.com", "qux@mail.com" } } }; + collection.Add(doc).Execute(); + CreateArrayIndex("BINARY(128)", collection); + collection.Add(doc).Execute(); + CreateArrayIndex("BINARY(128)", collection); + var doc22 = new[] { new { _id = true, name = "Time", myField = new[] { "01:01:01.001", "23:59:59.15", "12:00:00", "1" } } }; + doc = new[] { new { _id = 1, name = "Time", myField = new[] { "01:01:01.001", "23:59:59.15", "12:00:01", "1" } } }; + var doc11 = new[] { new { _id = 2, name = "Time", myField = "1" } }; + collection.Add(doc).Execute(); + collection.Add(doc22).Execute(); + collection.Add(doc11).Execute(); + collection.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "Time" + "\", \"array\": true}]}"); + var docResult = collection.Find("'23:59:59.15' in myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(2), "Matching the document ID"); + docResult = collection.Find("'1' in $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(3), "Matching the document ID"); + docResult = collection.Find("1 in $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(3), "Matching the document ID"); + docResult = collection.Find(":myField IN $.myField").Bind("myField", "23:59:59.15").Execute(); + docResult = collection.Find(":myField IN $._id").Bind("myField", true).Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + collection = CreateCollection("test"); + collection.Add(doc).Execute(); + collection.Add(doc22).Execute(); + CreateArrayIndex("TIME", collection); + + collection = CreateCollection("test"); + collection.Add(doc).Execute(); + collection.Add(doc22).Execute(); + CreateArrayIndex("TIME", collection); + + collection = CreateCollection("test"); + //No Array + var docx = new[] { new { _id = 1, name = "Date", myField = "2019-01-01 12:15:00" } }; + collection.Add(docx).Execute(); + CreateArrayIndex("DATE", collection); + collection.Add(docx).Execute(); + CreateArrayIndex("DATE", collection); + + doc = new[] { new { _id = 1, name = "Date", myField = new[] { "2019-01-01", "2019-01-01 12:15:00" } } }; + collection.Add(doc).Execute(); + CreateArrayIndex("DATE", collection); + collection.Add(doc).Execute(); + CreateArrayIndex("DATE", collection); + + doc = new[] { new { _id = 1, name = "DateTime", myField = new[] { "1000-01-01 00:00:00", "9999-12-31 23:59:59" } } }; + collection.Add(doc).Execute(); + CreateArrayIndex("DATETIME", collection); + collection.Add(doc).Execute(); + CreateArrayIndex("DATETIME", collection); + + collection = CreateCollection("test"); + doc = new[] { new { _id = 1, name = "Int", myField = new[] { "3", "254", "19" } } }; + collection.Add(doc).Execute(); + Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"INT\", \"array\": true}]}")); + + collection = CreateCollection("test"); + doc = new[] { new { _id = 1, name = "Int", myField = new[] { "3", "254", "19" } } }; + collection.Add(doc).Execute(); + Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"INTEGER\", \"array\": true}]}")); + + collection = CreateCollection("test"); + doc = new[] { new { _id = 1, name = "Signed", myField = new[] { "3", "254", "19" } } }; + collection.Add(doc).Execute(); + CreateArrayIndex("SIGNED", collection); + + doc = new[] { new { _id = 1, name = "Unsigned", myField = new[] { "-3", "-254", "-19" } } }; + collection.Add(doc).Execute(); + CreateArrayIndex("UNSIGNED", collection); + + doc = new[] { new { _id = 1, name = "Unsigned Int", myField = new[] { "3", "-254", "-19" } } }; + collection.Add(doc).Execute(); + CreateArrayIndex("UNSIGNED", collection); + + doc = new[] { new { _id = 1, name = "Decimal", myField = new[] { "3.0", "254.51", "19" } } }; + collection.Add(doc).Execute(); + CreateArrayIndex("DECIMAL(10,2)", collection); + + collection = CreateCollection("test"); + + // Invalid datatypes + doc = new[] { new { _id = 1, name = "TINYINT", myField = new[] { "3", "254", "19" } } }; + collection.Add(doc).Execute(); + InvalidCreateArrayIndex("TINYINT", collection); + + doc = new[] { new { _id = 1, name = "TINYINT", myField = new[] { "3", "254", "19" } } }; + collection.Add(doc).Execute(); + InvalidCreateArrayIndex("TINYINT(10)", collection); + + doc = new[] { new { _id = 1, name = "SMALLINT", myField = new[] { "3", "254", "19" } } }; + collection.Add(doc).Execute(); + InvalidCreateArrayIndex("SMALLINT", collection); + + doc = new[] { new { _id = 1, name = "MEDIUMINT", myField = new[] { "3", "254", "19" } } }; + collection.Add(doc).Execute(); + InvalidCreateArrayIndex("MEDIUMINT", collection); + + doc = new[] { new { _id = 1, name = "BIGINT", myField = new[] { "3", "254", "19" } } }; + collection.Add(doc).Execute(); + InvalidCreateArrayIndex("BIGINT", collection); + + doc = new[] { new { _id = 1, name = "Real", myField = new[] { "3", "254", "19" } } }; + collection.Add(doc).Execute(); + InvalidCreateArrayIndex("REAL", collection); + + doc = new[] { new { _id = 1, name = "Float", myField = new[] { "-3.1", "254.50", "19.19" } } }; + collection.Add(doc).Execute(); + InvalidCreateArrayIndex("FLOAT", collection); + + doc = new[] { new { _id = 1, name = "Double", myField = new[] { "3", "254", "19" } } }; + collection.Add(doc).Execute(); + InvalidCreateArrayIndex("DOUBLE", collection); + + doc = new[] { new { _id = 1, name = "Char", myField = new[] { "fooi@mail.com", "bar1@mail.com", "qux1@mail.com" } } }; + collection.Add(doc).Execute(); + InvalidCreateArrayIndex("TEXT(64)", collection); + + doc = new[] { new { _id = 1, name = "BLOB", myField = new[] { "fooi@mail.com", "bar1@mail.com", "qux1@mail.com" } } }; + collection.Add(doc).Execute(); + InvalidCreateArrayIndex("BLOB", collection); + + doc = new[] { new { _id = 1, name = "TINYBLOB", myField = new[] { "fooi@mail.com", "bar1@mail.com", "qux1@mail.com" } } }; + collection.Add(doc).Execute(); + InvalidCreateArrayIndex("TINYBLOB", collection); + + doc = new[] { new { _id = 1, name = "MEDIUMBLOB", myField = new[] { "fooi@mail.com", "bar1@mail.com", "qux1@mail.com" } } }; + collection.Add(doc).Execute(); + InvalidCreateArrayIndex("MEDIUMBLOB", collection); + + doc = new[] { new { _id = 1, name = "LONGBLOB", myField = new[] { "fooi@mail.com", "bar1@mail.com", "qux1@mail.com" } } }; + collection.Add(doc).Execute(); + InvalidCreateArrayIndex("LONGBLOB", collection); + + doc = new[] { new { _id = 1, name = "ENUM", myField = new[] { "fooi@mail.com", "bar1@mail.com", "qux1@mail.com" } } }; + collection.Add(doc).Execute(); + InvalidCreateArrayIndex("ENUM", collection); + + doc = new[] { new { _id = 1, name = "Byte", myField = new[] { "foo@mail.com", "bar@mail.com", "qux@mail.com" } } }; + collection.Add(doc).Execute(); + InvalidCreateArrayIndex("BYTE(128)", collection); + + doc = new[] { new { _id = 1, name = "TimeStamp", myField = new[] { "1970-01-01 00:00:01", "2038-01-19 03:14:07" } } }; + collection.Add(doc).Execute(); + InvalidCreateArrayIndex("TIMESTAMP", collection); + + doc = new[] { new { _id = 1, name = "Year", myField = new[] { "2019", "2155" } } }; + collection.Add(doc).Execute(); + InvalidCreateArrayIndex("YEAR", collection); + + collection = CreateCollection("test"); + + doc = new[] { new { _id = 1, name = "Char", myField = new[] { "foo@mail.com", "bar@mail.com", "qux@mail.com" } } }; + collection.Add(doc).Execute(); + collection.CreateIndex("myIndex1", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "CHAR(128)" + "\", \"array\": true}]," + + "\"type\":\"index\"}"); + ValidateIndex("myIndex1", "test", "CHAR(128)", false, false, false, 1, null, true); + collection.DropIndex("myIndex1"); + collection.RemoveOne(1); + + collection = CreateCollection("test"); + doc = new[] { new { _id = 1, name = "Char", myField = new[] { "foo@mail.com", "bar@mail.com", "qux@mail.com" } } }; + collection.Add(doc).Execute(); + Assert.Throws(() => collection.CreateIndex("myIndex1", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "CHAR(128)" + "\", \"array\": true}],\"type\":\"indexax\"}")); + + Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.myField, \"type\":\"GEOJSON\", \"required\":true, " + + "\"options\":2, \"srid\":4326, \"array\": true } ], \"type\":\"SPATIAL\" }")); + + Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [ { \"field\":$.name, \"type\":\"GEOJSON\", \"required\":true } ],\"type\":\"spatial\" }")); + + Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"CHAR(128)\", \"array\": true, " + + "\"required\":true}]}")); + + Assert.Throws(() => collection.CreateIndex("index_1", "{\"fields\": [{\"field\": $.field1, \"type\":\"CHAR(128)\", \"array\": true}, " + + "{\"field\": $.field2, \"type\":\"CHAR(128)\", \"array\": true}]}")); + + collection = CreateCollection("test"); + collection.CreateIndex("index_11", "{\"fields\": [{\"field\": $.field1, \"type\":\"CHAR(128)\"}, " + + "{\"field\": $.field2, \"type\":\"CHAR(128)\", \"array\": true}]}"); + ValidateIndex("index_11", "test", "c128", false, false, false, 1, null, false); + ValidateIndex("index_11", "test", "CHAR(128)", false, false, false, 2, null, true); + + collection = CreateCollection("test"); + doc = new[] { new { _id = 15, name = "Char", myField = new[] { longval } } }; + collection.Add(doc).Execute(); + collection.CreateIndex("index_15", "{\"fields\": [{\"field\": $.myField, \"type\":\"CHAR(255)\", \"array\": true}]}"); + + collection = CreateCollection("test"); + var doc1 = new[] { new { _id = 16, name = "Char", myField = new[] { "" } } }; + collection.Add(doc1).Execute(); + Assert.Throws(() => collection.CreateIndex("index_16", "{\"fields\": [{\"field\": $.myField, \"type\":\"CHAR(0)\", \"array\": true}]}")); + + collection = CreateCollection("test"); + doc1 = new[] { new { _id = 17, name = "Char", myField = new[] { "" } } }; + collection.Add(doc1).Execute(); + Assert.Throws(() => collection.CreateIndex("index_17", "{\"fields\": [{\"field\": $.myField, \"type\":\"CHAR(0)\", \"array\": false}]}")); + + } + + /// + /// Bug 29692534 + /// + [Test, Description("Create valid index using a document field type of array and setting array to true with single key on all possible datatypes-data " + + "inserted and then index created")] + public void IndexWithArrayOptionSingleKeyBeforeInsertData() + { + Assume.That(session.Version.isAtLeast(8, 0, 17), "This test is for MySql 8.0.17 or higher"); + + var collection = CreateCollection("test"); + + // Supported types + var doc = new[] { new { _id = 1, name = "Char", myField = new[] { "foo@mail.com", "bar@mail.com", "qux@mail.com" } } }; + collection.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "CHAR(128)" + "\", \"array\": true}]}"); + collection.Add(doc).Execute(); + CreateArrayIndex("CHAR(128)", collection, true); + + doc = new[] { new { _id = 1, name = "Char", myField = new[] { "foo@mail.com" } } }; + collection.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "CHAR(11)" + "\", \"array\": true}]}"); + Exception ex = Assert.Throws(() => collection.Add(doc).Execute()); + Assert.That(ex.Message, Is.EqualTo("Data too long for functional index 'myIndex'.")); + + collection = CreateCollection("test"); + var doc1 = new[] { new { _id = 1, name = "Char", myField = "foo@mail.com" } }; + collection.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "CHAR(11)" + "\", \"array\": true}]}"); + ex = Assert.Throws(() => collection.Add(doc1).Execute()); + Assert.That(ex.Message, Is.EqualTo("Data too long for functional index 'myIndex'.")); + + collection = CreateCollection("test"); + doc = new[] { new { _id = 1, name = "Binary", myField = new[] { "foo@mail.com", "bar@mail.com", "qux@mail.com" } } }; + collection.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "BINARY(128)" + "\", \"array\": true}]}"); + collection.Add(doc).Execute(); + CreateArrayIndex("BINARY(128)", collection, true); + + collection = CreateCollection("test"); + doc = new[] { new { _id = 1, name = "Time", myField = new[] { "01:01:01.001", "23:59:59.15", "12:00:00" } } };//Bug29692534 + collection.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "TIME" + "\", \"array\": true}]}"); + collection.Add(doc).Execute(); + CreateArrayIndex("TIME", collection, true); + + //No Array + collection = CreateCollection("test"); + doc = new[] { new { _id = 1, name = "Date", myField = new[] { "2019-01-01", "2019-01-01 12:15:00" } } };//Bug29692534 + collection.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "DATE" + "\", \"array\": true}]}"); + collection.Add(doc).Execute(); + CreateArrayIndex("DATE", collection, true); + + doc = new[] { new { _id = 1, name = "DateTime", myField = new[] { "1000-01-01 00:00:00", "9999-12-31 23:59:59" } } };//Bug29692534 + collection.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "DATETIME" + "\", \"array\": true}]}"); + collection.Add(doc).Execute(); + CreateArrayIndex("DATETIME", collection, true); + + collection = CreateCollection("test"); + doc = new[] { new { _id = 1, name = "Int", myField = new[] { "3", "254", "19" } } }; + Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"INT\", \"array\": true}]}")); + + collection = CreateCollection("test"); + doc = new[] { new { _id = 1, name = "Int", myField = new[] { "3", "254", "19" } } }; + collection.Add(doc).Execute(); + Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"INTEGER\", \"array\": true}]}")); + + collection = CreateCollection("test"); + doc = new[] { new { _id = 1, name = "Signed", myField = new[] { "3", "254", "19" } } };//Bug29692534 + collection.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "SIGNED" + "\", \"array\": true}]}"); + collection.Add(doc).Execute(); + CreateArrayIndex("SIGNED", collection, true); + + + doc = new[] { new { _id = 1, name = "Signed Int", myField = new[] { "3", "254", "19" } } }; + collection.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "SIGNED INTEGER" + "\", \"array\": true}]}"); + collection.Add(doc).Execute(); + CreateArrayIndex("SIGNED INTEGER", collection, true); + + doc = new[] { new { _id = 1, name = "Unsigned", myField = new[] { "-3", "-254", "-19" } } };//Bug29692534 + collection.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "UNSIGNED" + "\", \"array\": true}]}"); + collection.Add(doc).Execute(); + CreateArrayIndex("UNSIGNED", collection, true); + + doc = new[] { new { _id = 1, name = "Unsigned Int", myField = new[] { "3", "-254", "-19" } } }; + collection.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "UNSIGNED INTEGER" + "\", \"array\": true}]}"); + collection.Add(doc).Execute(); + CreateArrayIndex("UNSIGNED INTEGER", collection, true); + + doc = new[] { new { _id = 1, name = "Decimal", myField = new[] { "3.0", "254.51", "19" } } }; + collection.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "DECIMAL(10,2)" + "\", \"array\": true}]}"); + collection.Add(doc).Execute(); + CreateArrayIndex("DECIMAL(10,2)", collection, true); + + collection = CreateCollection("test"); + // Invalid datatypes + doc = new[] { new { _id = 1, name = "TINYINT", myField = new[] { "3", "254", "19" } } }; + InvalidCreateArrayIndex("TINYINT", collection); + + doc = new[] { new { _id = 1, name = "TINYINT", myField = new[] { "3", "254", "19" } } }; + InvalidCreateArrayIndex("TINYINT(10)", collection); + + doc = new[] { new { _id = 1, name = "SMALLINT", myField = new[] { "3", "254", "19" } } }; + InvalidCreateArrayIndex("SMALLINT", collection); + + doc = new[] { new { _id = 1, name = "MEDIUMINT", myField = new[] { "3", "254", "19" } } }; + InvalidCreateArrayIndex("MEDIUMINT", collection); + + doc = new[] { new { _id = 1, name = "BIGINT", myField = new[] { "3", "254", "19" } } }; + InvalidCreateArrayIndex("BIGINT", collection); + + doc = new[] { new { _id = 1, name = "Real", myField = new[] { "3", "254", "19" } } }; + InvalidCreateArrayIndex("REAL", collection); + + doc = new[] { new { _id = 1, name = "Float", myField = new[] { "-3.1", "254.50", "19.19" } } }; + InvalidCreateArrayIndex("FLOAT", collection); + + doc = new[] { new { _id = 1, name = "Double", myField = new[] { "3", "254", "19" } } }; + InvalidCreateArrayIndex("DOUBLE", collection); + + doc = new[] { new { _id = 1, name = "Char", myField = new[] { "fooi@mail.com", "bar1@mail.com", "qux1@mail.com" } } }; + collection.Add(doc).Execute(); + InvalidCreateArrayIndex("TEXT(64)", collection); + + doc = new[] { new { _id = 1, name = "BLOB", myField = new[] { "fooi@mail.com", "bar1@mail.com", "qux1@mail.com" } } }; + InvalidCreateArrayIndex("BLOB", collection); + + doc = new[] { new { _id = 1, name = "TINYBLOB", myField = new[] { "fooi@mail.com", "bar1@mail.com", "qux1@mail.com" } } }; + InvalidCreateArrayIndex("TINYBLOB", collection); + + doc = new[] { new { _id = 1, name = "MEDIUMBLOB", myField = new[] { "fooi@mail.com", "bar1@mail.com", "qux1@mail.com" } } }; + InvalidCreateArrayIndex("MEDIUMBLOB", collection); + + doc = new[] { new { _id = 1, name = "LONGBLOB", myField = new[] { "fooi@mail.com", "bar1@mail.com", "qux1@mail.com" } } }; + InvalidCreateArrayIndex("LONGBLOB", collection); + + doc = new[] { new { _id = 1, name = "ENUM", myField = new[] { "fooi@mail.com", "bar1@mail.com", "qux1@mail.com" } } }; + InvalidCreateArrayIndex("ENUM", collection); + + doc = new[] { new { _id = 1, name = "Byte", myField = new[] { "foo@mail.com", "bar@mail.com", "qux@mail.com" } } }; + InvalidCreateArrayIndex("BYTE(128)", collection); + + doc = new[] { new { _id = 1, name = "TimeStamp", myField = new[] { "1970-01-01 00:00:01", "2038-01-19 03:14:07" } } }; + InvalidCreateArrayIndex("TIMESTAMP", collection); + + doc = new[] { new { _id = 1, name = "Year", myField = new[] { "2019", "2155" } } }; + InvalidCreateArrayIndex("YEAR", collection); + + collection = CreateCollection("test"); + doc = new[] { new { _id = 1, name = "Char", myField = new[] { "foo@mail.com", "bar@mail.com", "qux@mail.com" } } }; + + collection.CreateIndex("myIndex1", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "CHAR(128)" + "\", \"array\": true}]," + + "\"type\":\"index\"}"); + collection.Add(doc).Execute(); + ValidateIndex("myIndex1", "test", "CHAR(128)", false, false, false, 1, null, true); + collection.DropIndex("myIndex1"); + collection.RemoveOne(1); + + collection = CreateCollection("test"); + doc = new[] { new { _id = 1, name = "Char", myField = new[] { "foo@mail.com", "bar@mail.com", "qux@mail.com" } } }; + Assert.Throws(() => collection.CreateIndex("myIndex1", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "CHAR(128)" + "\", \"array\": true}],\"type\":\"indexax\"}")); + collection.Add(doc).Execute(); + + } + + [Test, Description("Create index with array set as null,NULL,multile vel arrays,blank arrays,empty arrays.Also test in multikey scenarios")] + public void IndexArrayCombinations() + { + Assume.That(session.Version.isAtLeast(8, 0, 17), "This test is for MySql 8.0.17 or higher"); + var expectedException = "Index field 'array' member must be boolean."; + var coll = CreateCollection("test"); + + coll.CreateIndex("intArrayIndex", "{\"fields\": [{\"field\": \"$.intField\", \"type\": \"SIGNED INTEGER\", \"array\": true}]}"); + coll.CreateIndex("uintArrayIndex", "{\"fields\": [{\"field\": \"$.uintField\", \"type\": \"UNSIGNED INTEGER\", \"array\": true}]}"); + coll.CreateIndex("floatArrayIndex", "{\"fields\": [{\"field\": \"$.floatField\", \"type\": \"DECIMAL(10,2)\", \"array\": true}]}"); + coll.CreateIndex("dateArrayIndex", "{\"fields\": [{\"field\": \"$.dateField\", \"type\": \"DATE\", \"array\": true}]}"); + coll.CreateIndex("datetimeArrayIndex", "{\"fields\": [{\"field\": \"$.datetimeField\", \"type\": \"DATETIME\", \"array\": true}]}"); + coll.CreateIndex("timeArrayIndex", "{\"fields\": [{\"field\": \"$.timeField\", \"type\": \"TIME\", \"array\": true}]}"); + coll.CreateIndex("charArrayIndex", "{\"fields\": [{\"field\": \"$.charField\", \"type\": \"CHAR(256)\", \"array\": true}]}"); + coll.CreateIndex("binaryArrayIndex", "{\"fields\": [{\"field\": \"$.binaryField\", \"type\": \"BINARY(256)\", \"array\": true}]}"); + + Assert.Throws(() => coll.CreateIndex("charArrayIndex1", "{\"fields\": [{\"field\": \"$.charField1\", \"array\": true}]}")); + + Exception e = Assert.Throws(() => coll.CreateIndex("intArrayIndex1", "{\"fields\": [{\"field\": \"$.intField1\", \"type\": \"SIGNED INTEGER\", \"array\": null}]}")); + Assert.That(e.Message, Is.EqualTo(expectedException), "Matching the expected exception"); + + e = Assert.Throws(() => coll.CreateIndex("intArrayIndex1", "{\"fields\": [{\"field\": \"$.intField1\", \"type\": \"SIGNED INTEGER\", \"array\": NULL}]}")); + Assert.That(e.Message, Is.EqualTo(expectedException), "Matching the expected exception"); + + e = Assert.Throws(() => coll.CreateIndex("uintArrayIndex1", "{\"fields\": [{\"field\": \"$.uintField\", \"type\": \"UNSIGNED INTEGER\", \"array\": null}]}")); + Assert.That(e.Message, Is.EqualTo(expectedException), "Matching the expected exception"); + + e = Assert.Throws(() => coll.CreateIndex("floatArrayIndex1", "{\"fields\": [{\"field\": \"$.floatField\", \"type\": \"DECIMAL(10,2)\", \"array\": null}]}")); + Assert.That(e.Message, Is.EqualTo(expectedException), "Matching the expected exception"); + + e = Assert.Throws(() => coll.CreateIndex("floatArrayIndex1", "{\"fields\": [{\"field\": \"$.floatField\", \"type\": \"DECIMAL(10,2)\", \"array\": NULL}]}")); + Assert.That(e.Message, Is.EqualTo(expectedException), "Matching the expected exception"); + + e = Assert.Throws(() => coll.CreateIndex("dateArrayIndex1", "{\"fields\": [{\"field\": \"$.dateField\", \"type\": \"DATE\", \"array\": null}]}")); + Assert.That(e.Message, Is.EqualTo(expectedException), "Matching the expected exception"); + + e = Assert.Throws(() => coll.CreateIndex("datetimeArrayIndex1", "{\"fields\": [{\"field\": \"$.datetimeField\", \"type\": \"DATETIME\", \"array\": null}]}")); + Assert.That(e.Message, Is.EqualTo(expectedException), "Matching the expected exception"); + + e = Assert.Throws(() => coll.CreateIndex("timeArrayIndex1", "{\"fields\": [{\"field\": \"$.timeField\", \"type\": \"TIME\", \"array\": null}]}")); + Assert.That(e.Message, Is.EqualTo(expectedException), "Matching the expected exception"); + + e = Assert.Throws(() => coll.CreateIndex("charArrayIndex1", "{\"fields\": [{\"field\": \"$.charField\", \"type\": \"CHAR(256)\", \"array\": null}]}")); + Assert.That(e.Message, Is.EqualTo(expectedException), "Matching the expected exception"); + + e = Assert.Throws(() => coll.CreateIndex("binaryArrayIndex1", "{\"fields\": [{\"field\": \"$.binaryField\", \"type\": \"BINARY(256)\", \"array\": null}]}")); + Assert.That(e.Message, Is.EqualTo(expectedException), "Matching the expected exception"); + + Assert.Throws(() => ExecuteAddStatement(coll.Add("{\"intField\" : [1,[2, 3],4], \"uintField\" : [51,[52, 53],54], \"dateField\" : [\"2019-1-1\", [\"2019-2-1\", \"2019-3-1\"], \"2019-4-1\"], " + + "\"datetimeField\" : [\"9999-12-30 23:59:59\", [\"9999-12-31 23:59:59\"], \"9999-12-31 23:59:59\"], \"charField\" : [\"abcd1\", \"abcd1\", \"abcd2\", \"abcd4\"], " + + "\"binaryField\" : [\"abcd1\", [\"abcd1\", \"abcd2\"], \"abcd4\"],\"timeField\" : [\"10.30\", \"11.30\", \"12.30\"], \"floatField\" : [51.2,[52.4],53.6]}"))); + + string[] fields = new string[] {"{\"intField\" : null}", "{\"uintField\" : null}", "{\"dateField\" : null}","{\"datetimeField\" : null}", "{\"charField\" : null}", + "{\"binaryField\" : null}","{\"timeField\" : null}", "{\"floatField\" : null}" }; + for (int i = 0; i < fields.Length; i++) + { + Assert.Throws(() => ExecuteAddStatement(coll.Add(fields[i]))); + } + + fields = new string[] { "{\"dateField\" : []}", "{\"datetimeField\" : []}", "{\"timeField\" : []}", "{\"floatField\" : []}" }; + for (int i = 0; i < fields.Length; i++) + { + var res = coll.Add(fields[i]).Execute(); + Assert.That(res.AffectedItemsCount, Is.EqualTo(1)); + } + + fields = new string[] {"{\"intField\" : []}", "{\"uintField\" : []}", "{\"charField\" : []}", + "{\"binaryField\" : []}"}; + for (int i = 0; i < fields.Length; i++) + { + var res = coll.Add(fields[i]).Execute(); + Assert.That(res.AffectedItemsCount, Is.EqualTo(1)); + } + + fields = new string[] { "[]", "[]", "[]", "[]", "[]", "[]", "[]", "[]" }; + for (int i = 0; i < fields.Length; i++) + { + Assert.Throws(() => ExecuteAddStatement(coll.Add(fields[i]))); + } + + fields = new string[] { "\"\"", "\"\"", "\"\"", "\"\"", "\"\"", "\"\"", "\"\"", "\"\"" }; + for (int i = 0; i < fields.Length; i++) + { + Assert.Throws(() => ExecuteAddStatement(coll.Add(fields[i]))); + } + + var collection = CreateCollection("test"); + Assert.Throws(() => collection.CreateIndex("multiArrayIndex", "{\"fields\": [{\"field\": \"$.intField\", \"type\": \"SIGNED INTEGER\", \"array\": }, " + + "{\"field\": \"$.dateField\", \"type\": \"DATE\", \"array\": false}, " + + "{\"field\": \"$.charField\", \"type\": \"CHAR(255)\", \"array\": false}, " + + "{\"field\": \"$.timeField\", \"type\": \"TIME\", \"array\": false}]}")); + + Assert.Throws(() => collection.CreateIndex("multiArrayIndex", "{\"fields\": [{\"field\": \"$.intField\", \"type\": \"SIGNED INTEGER\", \"array\": true}, " + + "{\"field\": \"$.dateField\", \"type\": \"DATE\", \"array\": }, " + + "{\"field\": \"$.charField\", \"type\": \"CHAR(255)\", \"array\": false}, " + + "{\"field\": \"$.timeField\", \"type\": \"TIME\", \"array\": false}]}")); + + Assert.Throws(() => collection.CreateIndex("multiArrayIndex", "{\"fields\": [{\"field\": \"$.intField\", \"type\": \"SIGNED INTEGER\", \"array\": true}, " + + "{\"field\": \"$.dateField\", \"type\": \"DATE\", \"array\": false}, " + + "{\"field\": \"$.charField\", \"type\": \"CHAR(255)\", \"array\": }, " + + "{\"field\": \"$.timeField\", \"type\": \"TIME\", \"array\": false}]}")); + + Assert.Throws(() => collection.CreateIndex("multiArrayIndex", "{\"fields\": [{\"field\": \"$.intField\", \"type\": \"SIGNED INTEGER\", \"array\": true}, " + + "{\"field\": \"$.dateField\", \"type\": \"DATE\", \"array\": false}, " + + "{\"field\": \"$.charField\", \"type\": \"CHAR(255)\", \"array\": false}, " + + "{\"field\": \"$.timeField\", \"type\": \"TIME\", \"array\": }]}")); + + Assert.Throws(() => collection.CreateIndex("multiArrayIndex", "{\"fields\": [{\"field\": \"$.intField\", \"type\": \"SIGNED INTEGER\", \"array\": null}, " + + "{\"field\": \"$.dateField\", \"type\": \"DATE\", \"array\": false}, " + + "{\"field\": \"$.charField\", \"type\": \"CHAR(255)\", \"array\": false}, " + + "{\"field\": \"$.timeField\", \"type\": \"TIME\", \"array\": false}]}")); + + Assert.Throws(() => collection.CreateIndex("multiArrayIndex", "{\"fields\": [{\"field\": \"$.intField\", \"type\": \"SIGNED INTEGER\", \"array\": true}, " + + "{\"field\": \"$.dateField\", \"type\": \"DATE\", \"array\": null}, " + + "{\"field\": \"$.charField\", \"type\": \"CHAR(255)\", \"array\": false}, " + + "{\"field\": \"$.timeField\", \"type\": \"TIME\", \"array\": false}]}")); + + Assert.Throws(() => collection.CreateIndex("multiArrayIndex11", "{\"fields\": [{\"field\": \"$.intField\", \"type\": \"SIGNED INTEGER\", \"array\": true}, " + + "{\"field\": \"$.dateField\", \"type\": \"DATE\", \"array\": false}, " + + "{\"field\": \"$.charField\", \"type\": \"CHAR(255)\", \"array\": null}, " + + "{\"field\": \"$.timeField\", \"type\": \"TIME\", \"array\": false}]}")); + + Assert.Throws(() => collection.CreateIndex("multiArrayIndex12", "{\"fields\": [{\"field\": \"$.intField\", \"type\": \"SIGNED INTEGER\", \"array\": true}, " + + "{\"field\": \"$.dateField\", \"type\": \"DATE\", \"array\": false}, " + + "{\"field\": \"$.charField\", \"type\": \"CHAR(255)\", \"array\": false}, " + + "{\"field\": \"$.timeField\", \"type\": \"TIME\", \"array\": null}]}")); + + Assert.Throws(() => collection.CreateIndex("multiArrayIndex", "{\"fields\": [{\"field\": \"$.intField\", \"type\": \"SIGNED INTEGER\"}, " + + "{\"field\": \"$.dateField\", \"type\": \"DATE\", \"array\": true}, " + + "{\"field\": \"$.charField\", \"type\": \"CHAR(255)\", \"array\": \"\"}, " + + "{\"field\": \"$.timeField\", \"type\": \"TIME\", \"array\": false}]}")); + + Assert.Throws(() => collection.CreateIndex("multiArrayIndex", "{\"fields\": [{\"field\": \"$.intField\", \"type\": \"SIGNED INTEGER\"}, " + + "{\"field\": \"$.dateField\", \"type\": \"DATE\", \"array\": \"\"}, " + + "{\"field\": \"$.charField\", \"type\": \"CHAR(255)\", \"array\": true}, " + + "{\"field\": \"$.timeField\", \"type\": \"TIME\", \"array\": false}]}")); + + var testColl = CreateCollection("mycoll30"); + testColl.Add("{\"intField\" : [1,[2, 3],4], \"uintField\" : [51,[52, 53],54], \"dateField\" : [\"2019-1-1\", [\"2019-2-1\", \"2019-3-1\"], \"2019-4-1\"], " + + "\"datetimeField\" : [\"9999-12-30 23:59:59\", [\"9999-12-31 23:59:59\"], \"9999-12-31 23:59:59\"], \"arrayField\" : [\"abcd1\", \"abcd1\", \"abcd2\", \"abcd4\"], " + + "\"binaryField\" : [\"abcd1\", [\"abcd1\", \"abcd2\"], \"abcd4\"],\"timeField\" : [\"10.30\", \"11.30\", \"12.30\"], \"floatField\" : [51.2,[52.4],53.6]}").Execute(); + Assert.Throws(() => session.SQL("ALTER TABLE `test`.`mycoll30` ADD COLUMN `$dateField` DATE GENERATED ALWAYS AS (JSON_EXTRACT(doc, '$.dateField')) NOT NULL, ADD INDEX `notnullIndex`(`$dateField`)").Execute()); + + testColl = CreateCollection("mycoll30"); + testColl.Add("{\"intField\" : [1,[2, 3],4], \"uintField\" : [51,[52, 53],54], \"dateField\" : [\"2019-1-1\", [\"2019-2-1\", \"2019-3-1\"], \"2019-4-1\"], " + + "\"datetimeField\" : [\"9999-12-30 23:59:59\", [\"9999-12-31 23:59:59\"], \"9999-12-31 23:59:59\"], \"textField\" : [\"abcd1\", \"abcd1\", \"abcd2\", \"abcd4\"], " + + "\"binaryField\" : [\"abcd1\", \"abcd2\", \"abcd3\", \"abcd4\"],\"timeField\" : [\"10.30\", \"11.30\", \"12.30\"], \"floatField\" : [51.2,[52.4],53.6]}").Execute(); + var stmt = session.SQL("ALTER TABLE `test`.`mycoll30` ADD COLUMN `$textField` TEXT(64) GENERATED ALWAYS AS (JSON_EXTRACT(doc, '$.textField')) NOT NULL, ADD INDEX `notnullIndex`(`$textField`)"); + + Assert.Throws(() => ExecuteSQLStatement(stmt)); + + var db = session.GetSchema(schemaName); + db.DropCollection("mycoll30"); + Assert.Throws(() => testColl.CreateIndex("i3", "{\"fields\": [{\"field\": \"$.FLD1\", \"type\": \"TEXT(13)\", \"required\": true}, " + + "{\"field\": \"$.FLD4\", \"type\": \"TEXT(14)\", \"required\": true}, " + + "{\"field\": \"$.FLD2\", \"type\": \"TEXT(4)\", \"required\": true}, " + + "{\"field\": \"$.FLD3\", \"type\": \"DOUBLE(255,30)\", \"required\": true}], \"type\" : \"INDEX\"}")); + + coll = CreateCollection("test"); + coll.CreateIndex("multiArrayIndex", "{\"fields\": [{\"field\": \"$.intField\", \"type\": \"INT\", \"array\": false}," + + "{\"field\": \"$.charField\", \"type\": \"CHAR(255)\", \"array\": false}," + + "{\"field\": \"$.decimalField\", \"type\": \"DECIMAL\", \"array\": true}," + + "{\"field\": \"$.dateField\", \"type\": \"DATE\", \"array\": false}," + + "{\"field\": \"$.timeField\", \"type\": \"TIME\", \"array\": false}," + + "{\"field\": \"$.datetimeField\", \"type\": \"DATETIME\", \"array\": false}]}"); + coll.Add("{\"intField\" : 12, \"uintField\" : [51,52,53], \"dateField\" : \"2019-1-1\", \"datetimeField\" : \"9999-12-31 23:59:59\", \"charField\" : \"abcd1\", \"binaryField\" : \"abcd1\", \"timeField\" : \"10.30\", \"decimalField\" : [51.2, 57.6, 55.8]}").Execute(); + coll.Add("{\"intField\" : 12, \"uintField\" : [51,52,53], \"dateField\" : \"2019-1-1\", \"datetimeField\" : \"9999-12-31 23:59:59\", \"charField\" : \"abcd1\", \"binaryField\" : \"abcd1\", \"timeField\" : \"10.30\", \"decimalField\" : [51.2, 57.6, 55.8]}").Execute(); + coll.Add("{\"intField\" : 12, \"uintField\" : [51,52,53], \"dateField\" : \"2019-1-1\", \"datetimeField\" : \"9999-12-31 23:59:59\", \"charField\" : \"abcd1\", \"binaryField\" : \"abcd1\", \"timeField\" : \"10.30\", \"decimalField\" : [51.2, 57.6, 55.8]}").Execute(); + coll.Add("{\"intField\" : 18, \"uintField\" : [51,52,53], \"dateField\" : \"2019-1-1\", \"datetimeField\" : \"9999-12-31 23:59:59\", \"charField\" : \"abcd1\", \"binaryField\" : \"abcd1\", \"timeField\" : \"10.30\", \"decimalField\" : [51.2, 57.6, 55.8]}").Execute(); + coll.Add("{\"intField\" : 18, \"uintField\" : [51,52,53], \"dateField\" : \"2019-1-1\", \"datetimeField\" : \"9999-12-31 23:59:59\", \"charField\" : \"abcd1\", \"binaryField\" : \"abcd1\", \"timeField\" : \"10.30\", \"decimalField\" : 57.6}").Execute(); + var cFind = coll.Find(":decimalField in $.decimalField"); + var docs = cFind.Bind("decimalField", 57.6).Execute(); + DbDoc doc = docs.FetchOne(); + var findStatement = coll.Find("57.6"); + var res1 = findStatement.Execute().FetchAll(); + Assert.That(res1.Count, Is.EqualTo(5), "Matching the find count"); + + coll = CreateCollection("test"); + + // The Char size should be max 255 + var doc1 = new[] { new { _id = 10, name = "Char", myField = new[] { longval } } }; + coll.Add(doc1).Execute(); + Assert.Throws(() => coll.CreateIndex("index_12", "{\"fields\": [{\"field\": $.myField, \"type\":\"CHAR(256)\", \"array\": false}]}")); + + coll = CreateCollection("test"); + doc1 = new[] { new { _id = 14, name = "Char", myField = new[] { longval } } }; + coll.Add(doc1).Execute(); + Assert.Throws(() => coll.CreateIndex("index_14", "{\"fields\": [{\"field\": $.myField, \"type\":\"CHAR(513)\", \"array\": true}]}")); + + coll = CreateCollection("test"); + coll.CreateIndex("multiArrayIndex", "{\"fields\": [{\"field\": \"$.intField\", \"type\": \"SIGNED INTEGER\", \"array\": true}, " + + "{\"field\": \"$.dateField\", \"type\": \"DATE\", \"array\": false}, " + + "{\"field\": \"$.charField\", \"type\": \"CHAR(255)\", \"array\": false}, " + + "{\"field\": \"$.datetimeField\", \"type\": \"DATETIME\", \"array\": false}, " + + "{\"field\": \"$.decimalField\", \"type\": \"DECIMAL(10,2)\", \"array\": false}, " + + "{\"field\": \"$.timeField\", \"type\": \"TIME\", \"array\": false}]}"); + coll.Add("{\"intField\" : [15,25,35], \"dateField\" : \"2019-1-1\", \"charField\" : \"abcd1\", \"timeField\" : \"10.30\"}").Execute(); + Assert.Throws(() => ExecuteAddStatement(coll.Add("{\"dateField\" : [\"2019-1-1\",\"2020-12-12\"], \"charField\" : [\"abcd1\", \"abcd1\", \"abcd2\", \"abcd4\"], \"timeField\" : \"10.30\"}"))); + + Assert.Throws(() => ExecuteAddStatement(coll.Add("{\"dateField\" : \"2019-1-1\", \"charField\" : [\"abcd1\", \"abcd1\", \"abcd2\", \"abcd4\"], \"timeField\" : [\"10.30\",\"5.20\"]}"))); + + Assert.Throws(() => ExecuteAddStatement(coll.Add("{\"datetimeField\" : [\"9999-12-31 23:59:59\",\"9999-12-31 23:59:59\"], \"charField\" : [\"abcd1\", \"abcd1\", \"abcd2\", \"abcd4\"], \"timeField\" : \"10.30\"}"))); + + Assert.Throws(() => ExecuteAddStatement(coll.Add("{\"decimalField\" : [\"3.0\",\"19.45\"], \"charField\" : [\"abcd1\", \"abcd1\", \"abcd2\", \"abcd4\"], \"timeField\" : \"10.30\"}"))); + + coll = CreateCollection("test"); + coll.CreateIndex("multiArrayIndex1", "{\"fields\": [{\"field\": \"$.dateField\", \"type\": \"DATE\", \"array\": false}, " + + "{\"field\": \"$.charField\", \"type\": \"CHAR(255)\", \"array\": true}, " + + "{\"field\": \"$.datetimeField\", \"type\": \"DATETIME\", \"array\": false}, " + + "{\"field\": \"$.decimalField\", \"type\": \"DECIMAL(10,2)\", \"array\": false}, " + + "{\"field\": \"$.timeField\", \"type\": \"TIME\", \"array\": false}]}"); + ValidateIndex("multiArrayIndex1", "test", "DATE", false, false, false, 1, null, true); + ValidateIndex("multiArrayIndex1", "test", "CHAR(255)", false, false, false, 2, null, true); + ValidateIndex("multiArrayIndex1", "test", "DATETIME", false, false, false, 3, null, true); + ValidateIndex("multiArrayIndex1", "test", "DECIMAL(10,2)", false, false, false, 4, null, true); + ValidateIndex("multiArrayIndex1", "test", "TIME", false, false, false, 5, null, true); + + coll = CreateCollection("test"); + coll.CreateIndex("multiArrayIndex1", "{\"fields\": [{\"field\": \"$.dateField\", \"type\": \"DATE\", \"array\": false}, " + + "{\"field\": \"$.charField\", \"type\": \"CHAR(255)\", \"array\": false}, " + + "{\"field\": \"$.datetimeField\", \"type\": \"DATETIME\", \"array\": true}, " + + "{\"field\": \"$.decimalField\", \"type\": \"DECIMAL(10,2)\", \"array\": false}, " + + "{\"field\": \"$.timeField\", \"type\": \"TIME\", \"array\": false}]}"); + ValidateIndex("multiArrayIndex1", "test", "DATE", false, false, false, 1, null, true); + ValidateIndex("multiArrayIndex1", "test", "CHAR(255)", false, false, false, 2, null, true); + ValidateIndex("multiArrayIndex1", "test", "DATETIME", false, false, false, 3, null, true); + ValidateIndex("multiArrayIndex1", "test", "DECIMAL(10,2)", false, false, false, 4, null, true); + ValidateIndex("multiArrayIndex1", "test", "TIME", false, false, false, 5, null, true); + + coll = CreateCollection("test"); + + coll.CreateIndex("multiArrayIndex1", "{\"fields\": [{\"field\": \"$.dateField\", \"type\": \"DATE\", \"array\": false}, " + + "{\"field\": \"$.charField\", \"type\": \"CHAR(255)\", \"array\": false}, " + + "{\"field\": \"$.datetimeField\", \"type\": \"DATETIME\", \"array\": false}, " + + "{\"field\": \"$.decimalField\", \"type\": \"DECIMAL(10,2)\", \"array\": true}, " + + "{\"field\": \"$.timeField\", \"type\": \"TIME\", \"array\": false}]}"); + ValidateIndex("multiArrayIndex1", "test", "DATE", false, false, false, 1, null, true); + ValidateIndex("multiArrayIndex1", "test", "CHAR(255)", false, false, false, 2, null, true); + ValidateIndex("multiArrayIndex1", "test", "DATETIME", false, false, false, 3, null, true); + ValidateIndex("multiArrayIndex1", "test", "DECIMAL(10,2)", false, false, false, 4, null, true); + ValidateIndex("multiArrayIndex1", "test", "TIME", false, false, false, 5, null, true); + + coll = CreateCollection("test"); + coll.CreateIndex("multiArrayIndex1", "{\"fields\": [{\"field\": \"$.dateField\", \"type\": \"DATE\", \"array\": false}, " + + "{\"field\": \"$.charField\", \"type\": \"CHAR(255)\", \"array\": false}, " + + "{\"field\": \"$.datetimeField\", \"type\": \"DATETIME\", \"array\": false}, " + + "{\"field\": \"$.decimalField\", \"type\": \"DECIMAL(10,2)\", \"array\": false}, " + + "{\"field\": \"$.timeField\", \"type\": \"TIME\", \"array\": true}]}"); + ValidateIndex("multiArrayIndex1", "test", "DATE", false, false, false, 1, null, true); + ValidateIndex("multiArrayIndex1", "test", "CHAR(255)", false, false, false, 2, null, true); + ValidateIndex("multiArrayIndex1", "test", "DATETIME", false, false, false, 3, null, true); + ValidateIndex("multiArrayIndex1", "test", "DECIMAL(10,2)", false, false, false, 4, null, true); + ValidateIndex("multiArrayIndex1", "test", "TIME", false, false, false, 5, null, true); + } + + [Test, Description("Index Array Date bug with workaround")] + public void IndexArrayBugWorkAround() + { + Assume.That(session.Version.isAtLeast(8, 0, 17), "This test is for MySql 8.0.17 or higher"); + var coll = CreateCollection("test"); + var doc = new[] { new { _id = 1, name = "Time", myField = "9:00:00" } };//Bug29692534 + var doc22 = new[] { new { _id = 2, name = "Time", myField = new[] { "01:01:01.001", "23:59:59.15", "12:00:00", "1" } } };//Bug29692534 + coll.Add(doc).Execute(); + coll.Add(doc22).Execute(); + coll.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "Time" + "\", \"array\": true}]}"); + var docResult = coll.Find("CAST(CAST('12:00:00' as TIME) as JSON) in $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Time"); + docResult = coll.Find("CAST(CAST('9:00:00' as TIME) as JSON) in $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Time"); + docResult = coll.Find("CAST(CAST(:dt as TIME) as JSON) in $.myField").Bind("dt", "9:00:00").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Time-With Bind"); + docResult = coll.Find("CAST(CAST(:dt as TIME) as JSON) in $.myField").Bind("dt", "12:00:00").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Time-With Bind"); + docResult = coll.Find(":dt IN $.myField").Bind("dt", "9:00:00").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Time-With Bind-Bug"); + docResult = coll.Find(":dt IN $.myField").Bind("dt", "01:01:01.001").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Time-With Bind-Bug"); + + coll = CreateCollection("test"); + doc = new[] { new { _id = 1, name = "Decimal", myField = "5" } }; + doc22 = new[] { new { _id = 2, name = "Decimal", myField = new[] { "3.0", "254.51", "19" } } }; + coll.Add(doc).Execute(); + coll.Add(doc22).Execute(); + coll.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "Decimal" + "\", \"array\": true}]}"); + docResult = coll.Find("CAST(CAST('3.0' as DECIMAL) as JSON) in $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Decimal"); + docResult = coll.Find("CAST(CAST('5' as DECIMAL) as JSON) in $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Decimal"); + docResult = coll.Find("CAST(CAST(:dt as DECIMAL) as JSON) in $.myField").Bind("dt", "5").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Decimal-With Bind"); + docResult = coll.Find("CAST(CAST(:dt as DECIMAL) as JSON) in $.myField").Bind("dt", "3.0").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Decimal-With Bind"); + docResult = coll.Find(":dt IN $.myField").Bind("dt", "5").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Decimal-With Bind-Bug"); + docResult = coll.Find(":dt IN $.myField").Bind("dt", 5).Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Decimal-With Bind-Bug"); + docResult = coll.Find(":dt IN $.myField").Bind("dt", 3.0).Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Decimal-With Bind-Bug"); + + coll = CreateCollection("test"); + doc = new[] { new { _id = 1, name = "Date", myField = "2019-01-04" } }; + doc22 = new[] { new { _id = 2, name = "Date", myField = new[] { "2019-01-01", "2019-01-01 12:15:00" } } }; + coll.Add(doc).Execute(); + coll.Add(doc22).Execute(); + coll.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "Date" + "\", \"array\": true}]}"); + docResult = coll.Find("CAST(CAST('2019-01-04' as DATE) as JSON) in $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Date"); + docResult = coll.Find("CAST(CAST('2019-01-01' as DATE) as JSON) in $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Date"); + docResult = coll.Find("CAST(CAST(:dt as DATE) as JSON) in $.myField").Bind("dt", "2019-01-04").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Date-With Bind"); + docResult = coll.Find("CAST(CAST(:dt as DATE) as JSON) in $.myField").Bind("dt", "2019-01-01").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Date-With Bind"); + docResult = coll.Find(":dt IN $.myField").Bind("dt", 2019 - 01 - 04).Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(0), "Matching the document ID-Date-With Bind-Bug"); + docResult = coll.Find(":dt IN $.myField").Bind("dt", "2019-01-04").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Date-With Bind-Bug"); + docResult = coll.Find(":dt IN $.myField").Bind("dt", "2019-01-01").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Date-With Bind-Bug"); + + coll = CreateCollection("test"); + doc = new[] { new { _id = 1, name = "DateTime", myField = "9999-02-02 01:20:33" } }; + doc22 = new[] { new { _id = 2, name = "DateTime", myField = new[] { "1000-01-01 00:00:00", "9999-12-31 23:59:59" } } }; + coll.Add(doc).Execute(); + coll.Add(doc22).Execute(); + coll.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "DateTime" + "\", \"array\": true}]}"); + docResult = coll.Find("CAST(CAST('1000-01-01 00:00:00' as DATETIME) as JSON) in $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-DateTime"); + docResult = coll.Find("CAST(CAST('9999-02-02 01:20:33' as DATETIME) as JSON) in $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-DateTime"); + docResult = coll.Find("CAST(CAST(:dt as DATETIME) as JSON) in $.myField").Bind("dt", "9999-02-02 01:20:33").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Date-With Bind"); + docResult = coll.Find("CAST(CAST(:dt as DATETIME) as JSON) in $.myField").Bind("dt", "9999-12-31 23:59:59").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Date-With Bind"); + docResult = coll.Find(":dt IN $.myField").Bind("dt", "9999-02-02 01:20:33").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-DateTime-With Bind-Bug"); + docResult = coll.Find(":dt IN $.myField").Bind("dt", "1000-01-01 00:00:00").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-DateTime-With Bind-Bug"); + + coll = CreateCollection("test"); + doc = new[] { new { _id = 1, name = "Signed", myField = "100" } }; + doc22 = new[] { new { _id = 2, name = "Signed", myField = new[] { "3", "254", "19" } } }; + coll.Add(doc).Execute(); + coll.Add(doc22).Execute(); + coll.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "Signed" + "\", \"array\": true}]}"); + docResult = coll.Find("CAST(CAST('100' as SIGNED) as JSON) in $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-SIGNED"); + docResult = coll.Find("CAST(CAST('3' as SIGNED) as JSON) in $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-SIGNED"); + docResult = coll.Find("CAST(CAST(:dt as SIGNED) as JSON) in $.myField").Bind("dt", "100").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-SIGNED-With Bind"); + docResult = coll.Find("CAST(CAST(:dt as SIGNED) as JSON) in $.myField").Bind("dt", "19").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-SIGNED-With Bind"); + docResult = coll.Find(":dt IN $.myField").Bind("dt", 100).Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Signed-With Bind"); + docResult = coll.Find(":dt IN $.myField").Bind("dt", "100").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Signed-With Bind"); + docResult = coll.Find(":dt IN $.myField").Bind("dt", "3").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Signed-With Bind"); + + coll = CreateCollection("test"); + doc = new[] { new { _id = 1, name = "SIGNED INTEGER", myField = "100" } }; + doc22 = new[] { new { _id = 2, name = "SIGNED INTEGER", myField = new[] { "3", "254", "19" } } }; + coll.Add(doc).Execute(); + coll.Add(doc22).Execute(); + coll.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "SIGNED INTEGER" + "\", \"array\": true}]}"); + docResult = coll.Find("CAST(CAST('100' as SIGNED INTEGER) as JSON) in $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-SIGNED INTEGER"); + docResult = coll.Find("CAST(CAST('3' as SIGNED INTEGER) as JSON) in $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-SIGNED INTEGER"); + docResult = coll.Find("CAST(CAST(:dt as SIGNED INTEGER) as JSON) in $.myField").Bind("dt", "100").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-SIGNED INTEGER-With Bind"); + docResult = coll.Find("CAST(CAST(:dt as SIGNED INTEGER) as JSON) in $.myField").Bind("dt", "19").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-SIGNED INTEGER-With Bind"); + docResult = coll.Find(":dt IN $.myField").Bind("dt", 100).Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-SIGNED INTEGER-With Bind-Bug"); + docResult = coll.Find(":dt IN $.myField").Bind("dt", "100").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-SIGNED INTEGER-With Bind-Bug"); + docResult = coll.Find(":dt IN $.myField").Bind("dt", 3).Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-SIGNED INTEGER-With Bind-Bug"); + docResult = coll.Find(":dt IN $.myField").Bind("dt", "3").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-SIGNED INTEGER-With Bind-Bug"); + + coll = CreateCollection("test"); + doc = new[] { new { _id = 1, name = "Unsigned", myField = "100" } }; + doc22 = new[] { new { _id = 2, name = "Unsigned", myField = new[] { "3", "254", "19" } } }; + coll.Add(doc).Execute(); + coll.Add(doc22).Execute(); + coll.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "Unsigned" + "\", \"array\": true}]}"); + docResult = coll.Find("CAST(CAST('100' as UNSIGNED) as JSON) in $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Unsigned"); + docResult = coll.Find("CAST(CAST('3' as UNSIGNED) as JSON) in $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Unsigned"); + docResult = coll.Find("CAST(CAST(:dt as UNSIGNED) as JSON) in $.myField").Bind("dt", "100").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Unsigned-With Bind"); + docResult = coll.Find("CAST(CAST(:dt as UNSIGNED) as JSON) in $.myField").Bind("dt", "19").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Unsigned-With Bind"); + docResult = coll.Find(":dt IN $.myField").Bind("dt", 100).Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Unsigned-With Bind-Bug"); + docResult = coll.Find(":dt IN $.myField").Bind("dt", "100").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Unsigned-With Bind-Bug"); + docResult = coll.Find(":dt IN $.myField").Bind("dt", 3).Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Unsigned-With Bind-Bug"); + docResult = coll.Find(":dt IN $.myField").Bind("dt", "3").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Unsigned-With Bind-Bug"); + + coll = CreateCollection("test"); + doc = new[] { new { _id = 1, name = "Char", myField = "too@mail.com" } }; + doc22 = new[] { new { _id = 2, name = "Char", myField = new[] { "foo@mail.com", "bar@mail.com", "qux@mail.com" } } }; + coll.Add(doc).Execute(); + coll.Add(doc22).Execute(); + coll.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "CHAR(128)" + "\", \"array\": true}]}"); + docResult = coll.Find(":dt IN $.myField").Bind("dt", "too@mail.com").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-CHAR(128)-With Bind"); + docResult = coll.Find(":dt IN $.myField").Bind("dt", "foo@mail.com").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-CHAR(128)-With Bind"); + } + + /// + /// Bug 29692534 + /// + [Test, Description("Index Array Date bug with workaround")] + public void IndexArrayWorkAroundOverlaps() + { + Assume.That(session.Version.isAtLeast(8, 0, 17), "This test is for MySql 8.0.17 or higher"); + var coll = CreateCollection("test"); + var doc = new[] { new { _id = 1, name = "Time", myField = "9:00:00" } }; + var doc22 = new[] { new { _id = 2, name = "Time", myField = new[] { "01:01:01.001", "23:59:59.15", "12:00:00", "1" } } }; + coll.Add(doc).Execute(); + coll.Add(doc22).Execute(); + var docResult = coll.Find(":dt overlaps $.myField").Bind("dt", "9:00:00").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Time-With Bind-Bug before index creation"); + docResult = coll.Find(":dt not overlaps $.myField").Bind("dt", "9:00:00").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Time-With Bind-Bug before index creation"); + docResult = coll.Find("CAST(CAST('01:01:01.001' as TIME) as JSON) overlaps $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(0), "Matching the document ID-Time before index creation"); + docResult = coll.Find("CAST(CAST('01:01:01.001' as TIME) as JSON) not overlaps $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(2), "Matching the document ID-Time before index creation"); + + coll.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "Time" + "\", \"array\": true}]}"); + + docResult = coll.Find("CAST(CAST('12:00:00' as TIME) as JSON) overlaps $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Time"); + docResult = coll.Find("CAST(CAST('9:00:00' as TIME) as JSON) overlaps $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Time"); + docResult = coll.Find("CAST(CAST(:dt as TIME) as JSON) overlaps $.myField").Bind("dt", "9:00:00").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Time-With Bind"); + docResult = coll.Find("CAST(CAST(:dt as TIME) as JSON) overlaps $.myField").Bind("dt", "12:00:00").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Time-With Bind"); + docResult = coll.Find(":dt overlaps $.myField").Bind("dt", "9:00:00").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Time-With Bind-Bug"); + docResult = coll.Find(":dt overlaps $.myField").Bind("dt", "01:01:01.001").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Time-With Bind-Bug"); + docResult = coll.Find(":dt not overlaps $.myField").Bind("dt", "01:01:01.001").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Time-With Bind-Bug"); + docResult = coll.Find(":dt not IN $.myField").Bind("dt", "01:01:01.001").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Time-With Bind-Bug"); + docResult = coll.Find("CAST(CAST(:dt as TIME) as JSON) not overlaps $.myField").Bind("dt", "12:00:00").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(2), "Matching the document ID-Time-With Bind"); + + coll = CreateCollection("test"); + + doc = new[] { new { _id = 1, name = "Decimal", myField = "5" } }; + doc22 = new[] { new { _id = 2, name = "Decimal", myField = new[] { "3.0", "254.51", "19" } } }; + coll.Add(doc).Execute(); + coll.Add(doc22).Execute(); + docResult = coll.Find(":dt overlaps $.myField").Bind("dt", "5").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-DECIMAL-With Bind-Bug before index creation"); + docResult = coll.Find(":dt not overlaps $.myField").Bind("dt", "5").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-DECIMAL-With Bind-Bug before index creation"); + docResult = coll.Find("CAST(CAST('5' as DECIMAL) as JSON) overlaps $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(0), "Matching the document ID-DECIMAL before index creation"); + docResult = coll.Find("CAST(CAST('5' as DECIMAL) as JSON) not overlaps $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(2), "Matching the document ID-DECIMAL before index creation"); + + coll.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "Decimal" + "\", \"array\": true}]}"); + docResult = coll.Find("CAST(CAST('3.0' as DECIMAL) as JSON) overlaps $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Decimal"); + docResult = coll.Find("CAST(CAST('5' as DECIMAL) as JSON) overlaps $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Decimal"); + docResult = coll.Find("CAST(CAST(:dt as DECIMAL) as JSON) overlaps $.myField").Bind("dt", "5").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Decimal-With Bind"); + docResult = coll.Find("CAST(CAST(:dt as DECIMAL) as JSON) overlaps $.myField").Bind("dt", "3.0").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Decimal-With Bind"); + docResult = coll.Find(":dt overlaps $.myField").Bind("dt", "5").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Decimal-With Bind-Bug"); + docResult = coll.Find(":dt overlaps $.myField").Bind("dt", 5).Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Decimal-With Bind-Bug"); + docResult = coll.Find(":dt overlaps $.myField").Bind("dt", 3.0).Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Decimal-With Bind-Bug"); + docResult = coll.Find(":dt not overlaps $.myField").Bind("dt", "5").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Decimal-With Bind-Bug"); + docResult = coll.Find(":dt not overlaps $.myField").Bind("dt", 3.0).Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(2), "Matching the document ID-Decimal-With Bind-Bug"); + docResult = coll.Find("CAST(CAST(:dt as DECIMAL) as JSON) not overlaps $.myField").Bind("dt", "3.0").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(2), "Matching the document ID-Decimal-With Bind"); + + coll = CreateCollection("test"); + + doc = new[] { new { _id = 1, name = "Date", myField = "2019-01-04" } }; + doc22 = new[] { new { _id = 2, name = "Date", myField = new[] { "2019-01-01", "2019-01-01 12:15:00" } } }; + coll.Add(doc).Execute(); + coll.Add(doc22).Execute(); + coll.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "Date" + "\", \"array\": true}]}"); + docResult = coll.Find("CAST(CAST('2019-01-04' as DATE) as JSON) overlaps $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Date"); + docResult = coll.Find("CAST(CAST('2019-01-01' as DATE) as JSON) overlaps $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Date"); + docResult = coll.Find("CAST(CAST(:dt as DATE) as JSON) overlaps $.myField").Bind("dt", "2019-01-04").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Date-With Bind"); + docResult = coll.Find("CAST(CAST(:dt as DATE) as JSON) overlaps $.myField").Bind("dt", "2019-01-01").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Date-With Bind"); + docResult = coll.Find(":dt overlaps $.myField").Bind("dt", 2019 - 01 - 04).Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(0), "Matching the document ID-Date-With Bind-Bug"); + docResult = coll.Find(":dt overlaps $.myField").Bind("dt", "2019-01-04").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Date-With Bind-Bug"); + docResult = coll.Find(":dt overlaps $.myField").Bind("dt", "2019-01-01").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Date-With Bind-Bug"); + docResult = coll.Find(":dt not overlaps $.myField").Bind("dt", "2019-01-01").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Date-With Bind-Bug"); + docResult = coll.Find("CAST(CAST(:dt as DATE) as JSON) not overlaps $.myField").Bind("dt", "2019-01-04").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(2), "Matching the document ID-Date-With Bind"); + + coll = CreateCollection("test"); + + doc = new[] { new { _id = 1, name = "DateTime", myField = "9999-02-02 01:20:33" } }; + doc22 = new[] { new { _id = 2, name = "DateTime", myField = new[] { "1000-01-01 00:00:00", "9999-12-31 23:59:59" } } }; + coll.Add(doc).Execute(); + coll.Add(doc22).Execute(); + coll.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "DateTime" + "\", \"array\": true}]}"); + docResult = coll.Find("CAST(CAST('1000-01-01 00:00:00' as DATETIME) as JSON) overlaps $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-DateTime"); + docResult = coll.Find("CAST(CAST('9999-02-02 01:20:33' as DATETIME) as JSON) overlaps $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-DateTime"); + docResult = coll.Find("CAST(CAST(:dt as DATETIME) as JSON) overlaps $.myField").Bind("dt", "9999-02-02 01:20:33").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Date-With Bind"); + docResult = coll.Find("CAST(CAST(:dt as DATETIME) as JSON) overlaps $.myField").Bind("dt", "9999-12-31 23:59:59").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Date-With Bind"); + docResult = coll.Find(":dt overlaps $.myField").Bind("dt", "9999-02-02 01:20:33").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-DateTime-With Bind-Bug"); + docResult = coll.Find(":dt overlaps $.myField").Bind("dt", "1000-01-01 00:00:00").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-DateTime-With Bind-Bug"); + docResult = coll.Find(":dt not overlaps $.myField").Bind("dt", "1000-01-01 00:00:00").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-DateTime-With Bind-Bug"); + docResult = coll.Find("CAST(CAST(:dt as DATETIME) as JSON) not overlaps $.myField").Bind("dt", "9999-12-31 23:59:59").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(2), "Matching the document ID-Date-With Bind"); + + coll = CreateCollection("test"); + + doc = new[] { new { _id = 1, name = "Signed", myField = "100" } }; + doc22 = new[] { new { _id = 2, name = "Signed", myField = new[] { "3", "254", "19" } } }; + coll.Add(doc).Execute(); + coll.Add(doc22).Execute(); + coll.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "Signed" + "\", \"array\": true}]}"); + docResult = coll.Find("CAST(CAST('100' as SIGNED) as JSON) overlaps $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-SIGNED"); + docResult = coll.Find("CAST(CAST('3' as SIGNED) as JSON) overlaps $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-SIGNED"); + docResult = coll.Find("CAST(CAST(:dt as SIGNED) as JSON) overlaps $.myField").Bind("dt", "100").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-SIGNED-With Bind"); + docResult = coll.Find("CAST(CAST(:dt as SIGNED) as JSON) overlaps $.myField").Bind("dt", "19").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-SIGNED-With Bind"); + docResult = coll.Find(":dt overlaps $.myField").Bind("dt", 100).Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Signed-With Bind"); + docResult = coll.Find(":dt overlaps $.myField").Bind("dt", "100").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Signed-With Bind"); + docResult = coll.Find(":dt overlaps $.myField").Bind("dt", "3").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Signed-With Bind"); + docResult = coll.Find(":dt not overlaps $.myField").Bind("dt", "100").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Signed-With Bind"); + docResult = coll.Find("CAST(CAST(:dt as SIGNED) as JSON) not overlaps $.myField").Bind("dt", "19").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(2), "Matching the document ID-SIGNED-With Bind"); + + coll = CreateCollection("test"); + doc = new[] { new { _id = 1, name = "SIGNED INTEGER", myField = "100" } }; + doc22 = new[] { new { _id = 2, name = "SIGNED INTEGER", myField = new[] { "3", "254", "19" } } }; + coll.Add(doc).Execute(); + coll.Add(doc22).Execute(); + coll.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "SIGNED INTEGER" + "\", \"array\": true}]}"); + docResult = coll.Find("CAST(CAST('100' as SIGNED INTEGER) as JSON) overlaps $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-SIGNED INTEGER"); + docResult = coll.Find("CAST(CAST('3' as SIGNED INTEGER) as JSON) overlaps $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-SIGNED INTEGER"); + docResult = coll.Find("CAST(CAST(:dt as SIGNED INTEGER) as JSON) overlaps $.myField").Bind("dt", "100").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-SIGNED INTEGER-With Bind"); + docResult = coll.Find("CAST(CAST(:dt as SIGNED INTEGER) as JSON) overlaps $.myField").Bind("dt", "19").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-SIGNED INTEGER-With Bind"); + docResult = coll.Find(":dt overlaps $.myField").Bind("dt", 100).Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-SIGNED INTEGER-With Bind-Bug"); + docResult = coll.Find(":dt overlaps $.myField").Bind("dt", "100").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-SIGNED INTEGER-With Bind-Bug"); + docResult = coll.Find(":dt overlaps $.myField").Bind("dt", 3).Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-SIGNED INTEGER-With Bind-Bug"); + docResult = coll.Find(":dt overlaps $.myField").Bind("dt", "3").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-SIGNED INTEGER-With Bind-Bug"); + docResult = coll.Find(":dt not overlaps $.myField").Bind("dt", "3").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-SIGNED INTEGER-With Bind-Bug"); + docResult = coll.Find("CAST(CAST(:dt as SIGNED INTEGER) as JSON) overlaps $.myField").Bind("dt", "19").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-SIGNED INTEGER-With Bind"); + + coll = CreateCollection("test"); + doc = new[] { new { _id = 1, name = "Unsigned", myField = "100" } }; + doc22 = new[] { new { _id = 2, name = "Unsigned", myField = new[] { "3", "254", "19" } } }; + coll.Add(doc).Execute(); + coll.Add(doc22).Execute(); + coll.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "Unsigned" + "\", \"array\": true}]}"); + docResult = coll.Find("CAST(CAST('100' as UNSIGNED) as JSON) overlaps $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Unsigned"); + docResult = coll.Find("CAST(CAST('3' as UNSIGNED) as JSON) overlaps $.myField").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Unsigned"); + docResult = coll.Find("CAST(CAST(:dt as UNSIGNED) as JSON) overlaps $.myField").Bind("dt", "100").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Unsigned-With Bind"); + docResult = coll.Find("CAST(CAST(:dt as UNSIGNED) as JSON) overlaps $.myField").Bind("dt", "19").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Unsigned-With Bind"); + docResult = coll.Find(":dt overlaps $.myField").Bind("dt", 100).Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Unsigned-With Bind-Bug"); + docResult = coll.Find(":dt overlaps $.myField").Bind("dt", "100").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Unsigned-With Bind-Bug"); + docResult = coll.Find(":dt overlaps $.myField").Bind("dt", 3).Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Unsigned-With Bind-Bug"); + docResult = coll.Find(":dt overlaps $.myField").Bind("dt", "3").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Unsigned-With Bind-Bug"); + docResult = coll.Find(":dt not overlaps $.myField").Bind("dt", "3").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Unsigned-With Bind-Bug"); + docResult = coll.Find("CAST(CAST(:dt as UNSIGNED) as JSON) overlaps $.myField").Bind("dt", "19").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Unsigned-With Bind"); + + coll = CreateCollection("test"); + doc = new[] { new { _id = 1, name = "Char", myField = "too@mail.com" } }; + doc22 = new[] { new { _id = 2, name = "Char", myField = new[] { "foo@mail.com", "bar@mail.com", "qux@mail.com" } } }; + coll.Add(doc).Execute(); + coll.Add(doc22).Execute(); + coll.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + "CHAR(128)" + "\", \"array\": true}]}"); + docResult = coll.Find(":dt overlaps $.myField").Bind("dt", "too@mail.com").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-CHAR(128)-With Bind"); + docResult = coll.Find(":dt overlaps $.myField").Bind("dt", "foo@mail.com").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-CHAR(128)-With Bind"); + docResult = coll.Find(":dt not overlaps $.myField").Bind("dt", "foo@mail.com").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-CHAR(128)-With Bind"); + } + + [Test, Description("Index using overlaps")] + public void IndexArrayWithOverlaps() + { + var coll = CreateCollection("test"); + Assume.That(session.Version.isAtLeast(8, 0, 17), "This test is for MySql 8.0.17 or higher"); + + var doc = new[] { new { _id = 1, name = "Time", myField1 = "9:00:00" } }; + var doc22 = new[] { new { _id = 2, name = "Time", myField2 = new[] { "01:01:01.001", "23:59:59.15", "12:00:00", "1" }, myField4 = new[] { "01:01:01.001", "23:59:59.15", "12:00:00", "1" } } }; + var doc33 = new[] { new { _id = 3, name = "Time", myField5 = "9:00:00", myField3 = new[] { "01:01:01.001", "23:59:59.15", "12:00:00", "1", "9:00:00" } } }; + var doc34 = new[] { new { _id = 4, name = "Time", myField5 = "8:00", myField3 = new[] { "02:01:01" } } }; + coll.Add(doc).Execute(); + coll.Add(doc22).Execute(); + coll.Add(doc33).Execute(); + coll.Add(doc34).Execute(); + + var docResult = coll.Find(":dt overlaps $.myField1").Bind("dt", "9:00:00").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID-Time-With Bind-Bug before index creation"); + coll.CreateIndex("myIndex1", "{\"fields\": [{\"field\": $.myField1, \"type\":\"" + "Time" + "\", \"array\": true}]}"); + coll.CreateIndex("myIndex2", "{\"fields\": [{\"field\": $.myField2, \"type\":\"" + "Time" + "\", \"array\": true}]}"); + coll.CreateIndex("myIndex3", "{\"fields\": [{\"field\": $.myField3, \"type\":\"" + "Time" + "\", \"array\": true}]}"); + coll.CreateIndex("myIndex4", "{\"fields\": [{\"field\": $.myField1, \"type\":\"" + "Time" + "\", \"array\": true}]}"); + coll.CreateIndex("myIndex5", "{\"fields\": [{\"field\": $.myField3, \"type\":\"" + "Time" + "\", \"array\": true}]}"); + docResult = coll.Find("myIndex1 overlaps myIndex2").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(0), "Matching the indexes using overlaps"); + docResult = coll.Find("myIndex2 overlaps myIndex3").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(0), "Matching the indexes using overlaps"); + docResult = coll.Find("myIndex2 not overlaps myIndex3").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(0), "Matching the indexes using not overlaps"); + docResult = coll.Find("myIndex1 overlaps myIndex4").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(0), "Matching the indexes using overlaps"); + docResult = coll.Find("'myIndex3' overlaps 'myIndex5'").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(0), "Matching the indexes using overlaps"); + docResult = coll.Find("$.myField3 overlaps $.myField2").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(0), "Matching the indexes using overlaps"); + docResult = coll.Find("$.myField1 overlaps $.myField3").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(0), "Matching the indexes using overlaps"); + docResult = coll.Find("$.myField2 overlaps $.myField4").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the indexes using overlaps"); + docResult = coll.Find("$.myField2 not overlaps $.myField4").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(0), "Matching the indexes using not overlaps"); + docResult = coll.Find("$.myField5 overlaps $.myField3").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the indexes using overlaps"); + docResult = coll.Find("$.myField5 not overlaps $.myField3").Execute(); + Assert.That(docResult.FetchAll().Count, Is.EqualTo(1), "Matching the indexes using not overlaps"); + } + + [Test, Description("multikey scenarios with observations")] + public void IndexArrayMultiKey() + { + var coll = CreateCollection("test"); + Assume.That(session.Version.isAtLeast(8, 0, 17), "This test is for MySql 8.0.17 or higher"); + + coll.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"CHAR(255)\", \"array\": false}]}"); + + Collection testColl = CreateCollection("mycoll30"); + testColl.Add("{\"intField\" : [1,[2, 3],4], \"uintField\" : [51,[52, 53],54], \"dateField\" : [\"2019-1-1\", [\"2019-2-1\", \"2019-3-1\"], \"2019-4-1\"], " + + "\"datetimeField\" : [\"9999-12-30 23:59:59\", [\"9999-12-31 23:59:59\"], \"9999-12-31 23:59:59\"], \"arrayField\" : [\"abcd1\", \"abcd1\", \"abcd2\", \"abcd4\"], " + + "\"binaryField\" : [\"abcd1\", [\"abcd1\", \"abcd2\"], \"abcd4\"],\"timeField\" : [\"10.30\", \"11.30\", \"12.30\"], \"floatField\" : [51.2,[52.4],53.6]}").Execute(); + + testColl = CreateCollection("mycoll30"); + testColl.Add("{\"intField\" : [1,[2, 3],4], \"uintField\" : [51,[52, 53],54], \"dateField\" : [\"2019-1-1\", [\"2019-2-1\", \"2019-3-1\"], \"2019-4-1\"], " + + "\"datetimeField\" : [\"9999-12-30 23:59:59\", [\"9999-12-31 23:59:59\"], \"9999-12-31 23:59:59\"], \"arrayField\" : [\"abcd1\", \"abcd1\", \"abcd2\", \"abcd4\"], " + + "\"binaryField\" : [\"abcd1\", \"abcd2\", \"abcd3\", \"abcd4\"],\"timeField\" : [\"10.30\", \"11.30\", \"12.30\"], \"floatField\" : [51.2,[52.4],53.6]}").Execute(); + + Assert.Throws(() => coll.CreateIndex("multiArrayIndex", "{\"fields\": [{\"field\": \"$.intField\", \"type\": \"INT\", \"array\": false}," + + "{\"field\": \"$.charField\", \"type\": \"CHAR(255)\", \"array\": false}," + + "{\"field\": \"$.decimalField\", \"type\": \"DECIMAL\", \"array\": false}," + + "{\"field\": \"$.binaryField\", \"type\": \"BINARY\", \"array\": true}," + + "{\"field\": \"$.dateField\", \"type\": \"DATE\", \"array\": false}," + + "{\"field\": \"$.timeField\", \"type\": \"TIME\", \"array\": false}," + + "{\"field\": \"$.datetimeField\", \"type\": \"DATETIME\", \"array\": false}]}")); + + coll = CreateCollection("test"); + Assert.Throws(() => coll.CreateIndex("multiArrayIndex2", "{\"fields\": [{\"field\": \"$.dateField\", \"type\": \"DATE\", \"array\": false}, " + + "{\"field\": \"$.charField\", \"type\": \"CHAR(255)\", \"array\": true}, " + + "{\"field\": \"$.binField\", \"type\": \"BINARY(128)\", \"array\": false}, " + + "{\"field\": \"$.datetimeField\", \"type\": \"DATETIME\", \"array\": false}, " + + "{\"field\": \"$.decimalField\", \"type\": \"DECIMAL(10,2)\", \"array\": false}, " + + "{\"field\": \"$.timeField\", \"type\": \"TIME\", \"array\": false}]}")); + + Assert.Throws(() => coll.CreateIndex("multiArrayIndex3", "{\"fields\": [{\"field\": \"$.dateField\", \"type\": \"DATE\", \"array\": false}, " + + "{\"field\": \"$.charField\", \"type\": \"CHAR(255)\", \"array\": true}, " + + "{\"field\": \"$.datetimeField\", \"type\": \"DATETIME\", \"array\": false}, " + + "{\"field\": \"$.decimalField\", \"type\": \"DECIMAL(10,2)\", \"array\": false}, " + + "{\"field\": \"$.signedField\", \"type\": \"SIGNED\", \"array\": false}, " + + "{\"field\": \"$.timeField\", \"type\": \"TIME\", \"array\": false}]}")); + + Assert.Throws(() => coll.CreateIndex("multiArrayIndex4", "{\"fields\": [{\"field\": \"$.dateField\", \"type\": \"DATE\", \"array\": false}, " + + "{\"field\": \"$.charField\", \"type\": \"CHAR(255)\", \"array\": true}, " + + "{\"field\": \"$.datetimeField\", \"type\": \"DATETIME\", \"array\": false}, " + + "{\"field\": \"$.decimalField\", \"type\": \"DECIMAL(10,2)\", \"array\": false}, " + + "{\"field\": \"$.signedintField\", \"type\": \"SIGNED INTEGER\", \"array\": false}, " + + "{\"field\": \"$.timeField\", \"type\": \"TIME\", \"array\": false}]}")); + + Assert.Throws(() => coll.CreateIndex("multiArrayIndex5", "{\"fields\": [{\"field\": \"$.dateField\", \"type\": \"DATE\", \"array\": false}, " + + "{\"field\": \"$.charField\", \"type\": \"CHAR(255)\", \"array\": true}, " + + "{\"field\": \"$.datetimeField\", \"type\": \"DATETIME\", \"array\": false}, " + + "{\"field\": \"$.decimalField\", \"type\": \"DECIMAL(10,2)\", \"array\": false}, " + + "{\"field\": \"$.unsignedField\", \"type\": \"UNSIGNED\", \"array\": false}, " + + "{\"field\": \"$.timeField\", \"type\": \"TIME\", \"array\": false}]}")); + + Assert.Throws(() => coll.CreateIndex("multiArrayIndex6", "{\"fields\": [{\"field\": \"$.dateField\", \"type\": \"DATE\", \"array\": false}, " + + "{\"field\": \"$.charField\", \"type\": \"CHAR(255)\", \"array\": true}, " + + "{\"field\": \"$.datetimeField\", \"type\": \"DATETIME\", \"array\": false}, " + + "{\"field\": \"$.decimalField\", \"type\": \"DECIMAL(10,2)\", \"array\": false}, " + + "{\"field\": \"$.unsignedintField\", \"type\": \"UNSIGNED INTEGER\", \"array\": false}, " + + "{\"field\": \"$.timeField\", \"type\": \"TIME\", \"array\": false}]}")); + } + + [Test, Description("Test MySQLX plugin Create Collection Multiple Index Type")] + public void CreateCollectionMultipleIndexDataType() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + Collection testColl = CreateCollection("test"); + Assert.That(testColl.ExistsInDatabase(), Is.EqualTo(true), "ExistsInDatabase failed"); + + testColl.CreateIndex("testIndex12", "{\"fields\": [ { \"field\":$.myId, \"type\":\"DOUBLE\" , \"required\":true} ] }"); + testColl.CreateIndex("testIndex", "{\"fields\": [ { \"field\":$.myId, \"type\":\"DOUBLE UNSIGNED\" , \"required\":true} ] }"); + testColl.CreateIndex("testIndex1", "{\"fields\": [ { \"field\":$.myAge, \"type\":\"BIGINT UNSIGNED\" , \"required\":true} ] }"); + + Assert.Throws(() => testColl.Add( + new { myId = 990.196078431, myAge = 10000000 }).Add(new { myId = -990.196078431, myAge = -10000000 }).Execute()); + + testColl.Add(new { myId = 990.196078431, myAge = 10000000 }).Execute(); + testColl.DropIndex("testIndex"); + var result = testColl.Add(new { myId = 990.196078431, myAge = 10000000 }).Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + + testColl.DropIndex("testIndex1"); + result = testColl.Add(new { myId = 990.196078431, myAge = 10000000 }).Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + Assert.Throws(() => testColl.CreateIndex("testIndex2", "{\"fields\": [ { \"field\":$.myName, \"type\":\"TEXT\" , \"required\":true} ] }")); + } + + [Test, Description("Test MySQLX plugin Create Collection Multiple Index Stress")] + public void CreateCollectionMultipleIndexStress() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + Collection testColl = CreateCollection("test"); + Assert.That(testColl.ExistsInDatabase(), Is.EqualTo(true), "ExistsInDatabase failed"); + + testColl.CreateIndex("testIndex", "{\"fields\": [ { \"field\":$.myId, \"type\":\"TINYINT UNSIGNED\" , \"required\":true} ] }"); + testColl.CreateIndex("testIndex1", "{\"fields\": [ { \"field\":$.myAge, \"type\":\"SMALLINT UNSIGNED\" , \"required\":true} ] }"); + testColl.Add(new { myId = 126, myAge = 255 }).Add(new { myId = 1, myAge = 129 }).Execute(); + testColl.Add(new { myId = 126, myAge = 255 }).Execute(); + testColl.DropIndex("testIndex"); + testColl.Add(new { myId = 126, myAge = 255 }).Execute(); + + for (int i = 0; i < 20; i++) + { + testColl.DropIndex("testIndex1"); + testColl.CreateIndex("testIndex1", "{\"fields\": [ { \"field\":$.myAge, \"type\":\"DECIMAL\" , \"required\":true} ] }"); + var result = testColl.Add(new { myAge = i }).Add(new { myAge = i + 99999 }).Execute(); + } + } + + #endregion WL14389 + + #region Methods + + private void InvalidCreateArrayIndex(string dataType, Collection collection, object doc = null) + { + collection = CreateCollection("test"); + Assert.Throws(() => collection.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + dataType + "\", \"array\": true}]}")); + } + private void CreateArrayIndex(string dataType, XDevAPI.Collection collection, bool isIndexCreated = false) + { + if (!isIndexCreated) + { + collection.CreateIndex("myIndex", "{\"fields\": [{\"field\": $.myField, \"type\":\"" + dataType + "\", \"array\": true}]}"); + } + if (dataType.CompareTo("SIGNED INTEGER") == 0) + { + dataType = "SIGNED"; + } + if (dataType.CompareTo("UNSIGNED INTEGER") == 0) + { + dataType = "UNSIGNED"; + } + ValidateIndex("myIndex", "test", dataType, false, false, false, 1, null, true); + collection.DropIndex("myIndex"); + collection.RemoveOne("1"); + } + + private void ValidateIndex(string fieldName, string collectionName, string dataType, bool unique, bool required, bool isUnsigned, int sequence, int? length = null, bool array = false) + { + bool indexFound = false; + using (var connection = new MySqlConnection(ConnectionStringRoot)) + { + connection.Open(); + var command = new MySqlCommand($"SHOW INDEX FROM `test`.`{collectionName}`", connection); + var reader = command.ExecuteReader(); + if (!reader.HasRows) + throw new Exception("No indexes found."); + + while (reader.Read()) + { + if (fieldName == reader["Key_name"].ToString()) + { + if (sequence != Convert.ToInt32(reader["Seq_in_index"])) + continue; + + indexFound = true; + Assert.That(reader["Table"], Is.EqualTo(collectionName)); + Assert.That(Convert.ToInt16(reader["Non_unique"]), Is.EqualTo(unique ? 0 : 1)); + + if (!array && !string.IsNullOrEmpty(reader["Column_name"].ToString())) + { + var columnNameTokens = reader["Column_name"].ToString().Split('_'); + Assert.That(isUnsigned ? string.Format("{0}_{1}", columnNameTokens[1], columnNameTokens[2]) : columnNameTokens[1], Is.EqualTo(dataType)); + } + else if (array && !string.IsNullOrEmpty(reader["Expression"].ToString())) + { + string expression = reader["Expression"].ToString(); + int pos = reader["Expression"].ToString().IndexOf(" as "); + expression = expression.Substring(pos + 4); + Assert.That(expression, Does.Contain("array")); + expression = expression.Substring(0, expression.IndexOf(" array")); + Assert.That(dataType, Is.EqualTo(expression.Replace(" ", string.Empty)).IgnoreCase); + } + + Assert.That(reader["Null"], Is.EqualTo(required ? "" : "YES")); + if (length != null) + Assert.That(Convert.ToInt32(reader["Sub_part"]), Is.EqualTo(length)); + break; + } + } + + if (!indexFound) + throw new Exception("Index not found."); + } + } + + #endregion Methods + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/CollectionTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/CollectionTests.cs new file mode 100644 index 000000000..ba00db91f --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/CollectionTests.cs @@ -0,0 +1,1740 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Common; +using MySqlX.XDevAPI.Relational; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace MySqlX.Data.Tests +{ + public class CollectionTests : BaseTest + { + [TearDown] + public void tearDown() + { + session.Schema.DropCollection("test"); + session.Schema.DropCollection("test123"); + session.Schema.DropCollection("testcount"); + session.Schema.DropCollection("coll"); + session.Schema.DropCollection("col20"); + session.Schema.DropCollection("col21"); + session.Schema.DropCollection("col22"); + } + + [Test] + public void GetAllCollections() + { + session.DropSchema("test"); + session.CreateSchema("test"); + Collection book = CreateCollection("book"); + List collections = book.Schema.GetCollections(); + Assert.That(collections, Has.One.Items); + Assert.That(collections[0].Name == "book"); + book.Schema.DropCollection("book"); + } + + [Test] + public void CreateAndDropCollection() + { + Session s = GetSession(); + Schema test = s.GetSchema("test"); + Collection testColl = test.CreateCollection("test"); + Assert.That(CollectionExistsInDatabase(testColl)); + + // Drop existing collection. + test.DropCollection("test"); + Assert.That(CollectionExistsInDatabase(testColl), Is.False); + + // Drop non-existing collection. + test.DropCollection("test"); + Assert.That(CollectionExistsInDatabase(testColl), Is.False); + + //dropCollection when the object to drop contains invalid characters + test.DropCollection("%^&!@~*(&*(*&:>(() => test.DropCollection(string.Empty)); + Assert.Throws(() => test.DropCollection(" ")); + Assert.Throws(() => test.DropCollection(" ")); + Assert.Throws(() => test.DropCollection(null)); + } + + [Test] + public void CreateCollectionIndex() + { + Session session = GetSession(); + Schema test = session.GetSchema(schemaName); + Collection testColl = test.CreateCollection("test"); + Assert.That(CollectionExistsInDatabase(testColl), "ExistsInDatabase failed"); + testColl.CreateIndex("testIndex", "{ \"fields\": [ { \"field\":$.myId, \"type\":\"INT\", \"required\":true } ] }"); + var result = ExecuteAddStatement(testColl.Add(new { myId = 1 }).Add(new { myId = 2 })); + Assert.That(2, Is.EqualTo(result.AffectedItemsCount)); + } + + [Test] + public void DropCollectionIndex() + { + Session session = GetSession(); + Schema test = session.GetSchema(schemaName); + Collection testColl = CreateCollection("test"); + testColl.CreateIndex("testIndex", "{ \"fields\": [ { \"field\":$.myId, \"type\":\"INT\", \"required\":true } ] }"); + + // Drop existing index. + testColl.DropIndex("testIndex"); + + // Drop non-existing index. + testColl.DropIndex("testIndex"); + + //dropIndex contains invalid characters + testColl.DropIndex("%^&!@~*(&*(*&:>(() => testColl.DropIndex(string.Empty)); + Assert.Throws(() => testColl.DropIndex(" ")); + Assert.Throws(() => testColl.DropIndex(" ")); + Assert.Throws(() => testColl.DropIndex(null)); + + } + + [Test] + public void DropSchemaTests() + { + session.DropSchema("validSchema"); + session.CreateSchema("validSchema"); + session.DropSchema("validSchema"); + session.DropSchema("%^&!@~*(&*(*&:>(() => session.DropSchema(string.Empty)); + Assert.Throws(() => session.DropSchema(" ")); + Assert.Throws(() => session.DropSchema(" ")); + Assert.Throws(() => session.DropSchema(null)); + } + + + [Test] + public void ValidateExistence() + { + Session session = GetSession(); + Schema schema = session.GetSchema(schemaName); + var ex = Assert.Throws(() => schema.GetCollection("nonExistentCollection", true)); + Assert.That(ex.Message, Is.EqualTo("Collection 'nonExistentCollection' does not exist.")); + } + + [Test] + public void CountCollection() + { + Session session = GetSession(); + Schema schema = session.GetSchema(schemaName); + CreateCollection("testCount"); + var count = session.SQL("SELECT COUNT(*) FROM test.testCount").Execute().FetchOne()[0]; + + // Zero records + var collection = schema.GetCollection("testCount"); + Assert.That(collection.Count(), Is.EqualTo(count)); + var table = schema.GetTable("testCount"); + Assert.That(table.Count(), Is.EqualTo(count)); + + // Insert some records + var stm = collection.Add(@"{ ""_id"": 1, ""foo"": 1 }") + .Add(@"{ ""_id"": 2, ""foo"": 2 }") + .Add(@"{ ""_id"": 3, ""foo"": 3 }"); + stm.Execute(); + count = session.SQL("SELECT COUNT(*) FROM test.testCount").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + table.Insert("doc").Values(@"{ ""_id"": 4, ""foo"": 4 }").Execute(); + count = session.SQL("SELECT COUNT(*) FROM test.testCount").Execute().FetchOne()[0]; + Assert.That(table.Count(), Is.EqualTo(count)); + + collection.RemoveOne(2); + count = session.SQL("SELECT COUNT(*) FROM test.testCount").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + Assert.That(table.Count(), Is.EqualTo(count)); + + // Collection/Table does not exist + var ex = Assert.Throws(() => schema.GetCollection("testCount_").Count()); + Assert.That(ex.Message, Is.EqualTo("Collection 'testCount_' does not exist in schema 'test'")); + ex = Assert.Throws(() => schema.GetTable("testCount_").Count()); + Assert.That(ex.Message, Is.EqualTo("Table 'testCount_' does not exist in schema 'test'")); + } + + [Test] + public void ModifyCollectionNoLevelNorSchema() + { + Session s = GetSession(); + Schema test = s.GetSchema("test"); + + // Modify a Collection without passing schema and Level, (Bug#30660917) + test.CreateCollection("coll"); + ModifyCollectionOptions options1 = new ModifyCollectionOptions(); + options1.Validation = new Validation() { }; + Assert.Throws(() => test.ModifyCollection("coll", options1)); + } + + [Test] + public void CreateCollectionWithOptions() + { + Session s = GetSession(); + Schema test = s.GetSchema("test"); + + // CreateCollection Test Cases + + // Create a Collection passing a valid schema and Level + CreateCollectionOptions options = new CreateCollectionOptions(); + Validation val = new Validation(); + val.Level = ValidationLevel.STRICT; + string str = "{\"id\": \"http://json-schema.org/geo\"," + + "\"$schema\": \"http://json-schema.org/draft-06/schema#\"," + + "\"description\": \"A geographical coordinate\"," + + "\"type\": \"object\"," + + "\"properties\": {" + + "\"latitude\": {" + + "\"type\": \"number\"" + + " }," + + "\"longitude\": {" + + "\"type\": \"number\"" + + "}" + + "}," + + "\"required\": [\"latitude\", \"longitude\"]" + + "}"; + val.Schema = str; + options.ReuseExisting = false; + options.Validation = val; + Collection testColl = test.CreateCollection("testWithSchemaValidation", options); + Assert.That(CollectionExistsInDatabase(testColl)); + + //Bug #30830962 + options = new CreateCollectionOptions(); + val = new Validation() { }; + options.Validation = val; + var testbug1 = test.CreateCollection("bug_0962", options); //create collection with empty options + testbug1.Add(@"{ ""latitude"": 20, ""longitude"": 30 }").Execute(); + testbug1.Add(@"{ ""sexo"": 1, ""edad"": 20 }").Execute(); + int.TryParse(session.SQL("SELECT COUNT(*) FROM test.bug_0962").Execute().FetchOne()[0].ToString(), out int expected_count); + Assert.That(expected_count, Is.EqualTo(2)); //Collection is created as STRICT with empty json schema,both records were inserted + + options = new CreateCollectionOptions(); + val = new Validation() { Schema = str }; + options.Validation = val; + testbug1 = test.CreateCollection("bug_0962b", options);// adding an schema from + testbug1.Add(@"{ ""latitude"": 20, ""longitude"": 30 }").Execute(); + var invalidEx = Assert.Throws(() => testbug1.Add(@"{ ""sexo"": 1, ""edad"": 20 }").Execute()); + Assert.That(invalidEx.Message, Does.Contain("Document is not valid according to the schema assigned to collection")); + + // Create a Collection passing a reuse_existing parameter to server + CreateCollectionOptions options_reuse = new CreateCollectionOptions(); + options_reuse.ReuseExisting = false; + options_reuse.Validation = val; + Collection testCol2 = test.CreateCollection("testReuseExisting_1", options_reuse); + Assert.That(CollectionExistsInDatabase(testCol2)); + + //Insert Valid record with Level Strict + var insert_statement = testColl.Add(@"{ ""latitude"": 20, ""longitude"": 30 }"); + insert_statement.Execute(); + var count = session.SQL("SELECT COUNT(*) FROM test.testWithSchemaValidation").Execute().FetchOne()[0]; + Assert.That(testColl.Count(), Is.EqualTo(count)); + + //Insert invalid record with Level Strict + insert_statement = testColl.Add(@"{ ""OtherField"": ""value"", ""Age"": 30 }"); + var invalidInsertEx = Assert.Throws(() => insert_statement.Execute()); + Assert.That(invalidInsertEx.Message, Does.Contain("Document is not valid according to the schema assigned to collection")); + + //Test: Old MySQL Server Version exceptions + if (!(session.Version.isAtLeast(8, 0, 19))) + { + //FR6.2 + var ex1 = Assert.Throws(() => test.CreateCollection("testInvalid", options)); + Assert.That(ex1.Message, Does.Contain("Invalid number of arguments, expected 2 but got 3, " + + "The server doesn't support the requested operation. Please update the MySQL Server and/or Client library")); + + //FR6.3 + test.CreateCollection("testInvalid"); + ModifyCollectionOptions modifyOptions = new ModifyCollectionOptions(); + modifyOptions.Validation = val; + var ex2 = Assert.Throws(() => test.ModifyCollection("testInvalid", modifyOptions)); + Assert.That(ex2.Message, Does.Contain("Invalid mysqlx command modify_collection_options, " + + "The server doesn't support the requested operation. Please update the MySQL Server and/or Client library")); + } + + //Create collection with json schema and level OFF. Try to insert document matches this schema + options = new CreateCollectionOptions(); + options.Validation = new Validation() { Level = ValidationLevel.OFF, Schema = str }; + Collection col_test = test.CreateCollection("Test_2b_1", options); + Assert.That(CollectionExistsInDatabase(col_test)); + insert_statement = col_test.Add(@"{ ""latitude"": 120, ""longitude"": 78 }"); + insert_statement.Execute(); + count = session.SQL("SELECT COUNT(*) FROM test.Test_2b_1").Execute().FetchOne()[0]; + Assert.That(col_test.Count(), Is.EqualTo(count)); + + //Create collection with json schema and level OFF,ReuseExisting set to true, Try to insert + options = new CreateCollectionOptions(); + options.Validation = new Validation() { Level = ValidationLevel.OFF, Schema = str }; + options.ReuseExisting = true; + col_test = test.CreateCollection("Test_2b_2", options); + Assert.That(CollectionExistsInDatabase(col_test)); + insert_statement = col_test.Add(@"{ ""latitude"": 20, ""longitude"": 42 }"); + insert_statement.Execute(); + count = session.SQL("SELECT COUNT(*) FROM test.Test_2b_2").Execute().FetchOne()[0]; + Assert.That(col_test.Count(), Is.EqualTo(count)); + + //Create collection with only schema option, Try to insert + options = new CreateCollectionOptions(); + options.Validation = new Validation() { Schema = str }; + col_test = test.CreateCollection("Test_2b_3", options); + Assert.That(CollectionExistsInDatabase(col_test)); + insert_statement = col_test.Add(@"{ ""latitude"": 5, ""longitude"": 10 }"); + insert_statement.Execute(); + count = session.SQL("SELECT COUNT(*) FROM test.Test_2b_3").Execute().FetchOne()[0]; + Assert.That(col_test.Count(), Is.EqualTo(count)); + + //Create collection with only schema option,ReuseExisting set to true, Try to insert + options = new CreateCollectionOptions(); + options.Validation = new Validation() { Schema = str }; + options.ReuseExisting = true; + col_test = test.CreateCollection("Test_2b_4", options); + Assert.That(CollectionExistsInDatabase(col_test)); + insert_statement = col_test.Add(@"{ ""latitude"": 25, ""longitude"": 52 }"); + insert_statement.Execute(); + count = session.SQL("SELECT COUNT(*) FROM test.Test_2b_4").Execute().FetchOne()[0]; + Assert.That(col_test.Count(), Is.EqualTo(count)); + + //Create collection with only level option + options = new CreateCollectionOptions(); + options.Validation = new Validation() { Level = ValidationLevel.OFF }; + col_test = test.CreateCollection("Test_2b_5", options); + Assert.That(CollectionExistsInDatabase(col_test)); + + //ResuseExisting = false should throw exception for an existing collection + CreateCollectionOptions testReuseOptions = new CreateCollectionOptions(); + testReuseOptions.ReuseExisting = false; + testReuseOptions.Validation = new Validation() { Level = ValidationLevel.OFF }; + test.CreateCollection("testReuse"); + var exreuse = Assert.Throws(() => test.CreateCollection("testReuse", testReuseOptions)); + Assert.That(exreuse.Message, Is.EqualTo("Table 'testReuse' already exists").IgnoreCase); + + //Test: Resuse Existing = True should return existing collection + testReuseOptions.ReuseExisting = true; + var existing = test.CreateCollection("testReuse", testReuseOptions); + Assert.That(CollectionExistsInDatabase(existing)); + + //Create collection and prepare test data with json schema and level STRICT + CreateCollectionOptions prepareOptions = new CreateCollectionOptions(); + prepareOptions.Validation = new Validation() { Level = ValidationLevel.STRICT, Schema = str }; + var res_stm = test.CreateCollection("TestCreateInsert", prepareOptions).Add(@"{ ""latitude"": 25, ""longitude"": 52 }"); + res_stm.Execute(); + var num = session.SQL("SELECT COUNT(*) FROM test.TestCreateInsert").Execute().FetchOne()[0]; + var collection_test = test.GetCollection("TestCreateInsert"); + Assert.That(collection_test.Count(), Is.EqualTo(num)); + + //Passing invalid Schema + options = new CreateCollectionOptions(); + options.Validation = new Validation() { Level = ValidationLevel.STRICT, Schema = "Not Valid JSON Schema" }; + Exception ex_schema = Assert.Throws(() => test.CreateCollection("testInvalidSchema", options)); + Assert.That(ex_schema.Message, Does.Contain(@"The value provided is not a valid JSON document.")); + + //Testing an schema with different data types + str = "{\"id\": \"http://json-schema.org/geo\"," + + "\"$schema\": \"http://json-schema.org/draft-06/schema#\"," + + "\"description\": \"A Person example\"," + + "\"type\": \"object\"," + + "\"properties\": {" + + "\"name\": {" + + "\"type\": \"string\"" + + " }," + + "\"age\": {" + + "\"type\": \"number\"" + + "}" + + "}," + + "\"required\": [\"name\", \"age\"]" + + "}"; + + options = new CreateCollectionOptions(); + options.Validation = new Validation() { Level = ValidationLevel.STRICT, Schema = str }; + Collection person_col = test.CreateCollection("testWithPersonSchema", options); + Assert.That(CollectionExistsInDatabase(person_col)); + person_col.Add(@"{ ""name"": ""John"", ""age"": 52 }").Execute(); + var rows = session.SQL("SELECT COUNT(*) FROM test.testWithPersonSchema").Execute().FetchOne()[0]; + Assert.That(person_col.Count(), Is.EqualTo(rows)); + + // Create an existing collection with different schema + options = new CreateCollectionOptions(); + options.ReuseExisting = true; + options.Validation = new Validation() { Level = ValidationLevel.STRICT, Schema = str }; + Collection col_schema1 = test.CreateCollection("testSchema1", options); + Assert.That(CollectionExistsInDatabase(col_schema1)); + + col_schema1.Add(@"{ ""name"": ""John"", ""age"": 52 }").Execute(); + Assert.That(col_schema1.Count(), Is.EqualTo(1)); + var sqlDefinition1 = session.SQL("SHOW CREATE TABLE test.testSchema1").Execute().FetchOne()[1]; + + + var schema2 = "{\"id\": \"http://json-schema.org/geo\"," + + "\"$schema\": \"http://json-schema.org/draft-06/schema#\"," + + "\"description\": \"A Movies example\"," + + "\"type\": \"object\"," + + "\"properties\": {" + + "\"title\": {" + + "\"type\": \"string\"" + + " }," + + "\"movie\": {" + + "\"type\": \"string\"" + + "}" + + "}," + + "\"required\": [\"title\", \"movie\"]" + + "}"; + + options.Validation = new Validation() { Level = ValidationLevel.STRICT, Schema = schema2 }; + Collection col_schema2 = test.CreateCollection("testSchema1", options); + var sqlDefinition2 = session.SQL("SHOW CREATE TABLE test.testSchema1").Execute().FetchOne()[1]; + Assert.That(sqlDefinition2, Is.EqualTo(sqlDefinition1)); + + //Create a collection without sending reuseExisting parameter and insert record + Collection original_col1 = test.CreateCollection("testOriginal1"); + Assert.That(CollectionExistsInDatabase(original_col1)); + original_col1.Add(@"{ ""name"": ""John"", ""age"": 52 }").Execute(); + rows = session.SQL("SELECT COUNT(*) FROM test.testOriginal1").Execute().FetchOne()[0]; + Assert.That(original_col1.Count(), Is.EqualTo(rows)); + + //Create a new collection sending reuseExisting as true, insert record + Collection original_col2 = test.CreateCollection("testOriginal2", true); + Assert.That(CollectionExistsInDatabase(original_col2)); + original_col2.Add(@"{ ""name"": ""John"", ""age"": 52 }").Execute(); + rows = session.SQL("SELECT COUNT(*) FROM test.testOriginal2").Execute().FetchOne()[0]; + Assert.That(original_col2.Count(), Is.EqualTo(rows)); + + //Create an existing collection sending reuseExisting as true, insert record + Collection original_col3 = test.CreateCollection("testOriginal2", true); + Assert.That(CollectionExistsInDatabase(original_col3)); + original_col3.Add(@"{ ""name"": ""John2"", ""age"": 12 }").Execute(); + Assert.That(original_col3.Count(), Is.EqualTo(2)); + + //Create an existing collection sending reuseExisting as false,exception expected + var ex_existing = Assert.Throws(() => test.CreateCollection("testOriginal2", false)); + Assert.That(ex_existing.Message, Is.EqualTo(@"Table 'testOriginal2' already exists").IgnoreCase); + + //Modify collection with only level option + ModifyCollectionOptions Test_Options = new ModifyCollectionOptions(); + Test_Options.Validation = new Validation() { Level = ValidationLevel.OFF }; + Collection col_Test_2a_1 = test.ModifyCollection("testWithSchemaValidation", Test_Options); + + // Inser valid and invalid records with level set to Off + insert_statement = col_Test_2a_1.Add(@"{ ""latitude"": 20, ""longitude"": 30 }") + .Add(@"{ ""OtherField"": ""value"", ""Age"": 30 }"); + insert_statement.Execute(); + count = session.SQL("SELECT COUNT(*) FROM test.testWithSchemaValidation").Execute().FetchOne()[0]; + Assert.That(col_Test_2a_1.Count(), Is.EqualTo(count)); + + //Modify collection with only schema option + Test_Options.Validation = new Validation() { Schema = "{ }" }; + test.ModifyCollection("testWithSchemaValidation", Test_Options); + var sqlCreate = session.SQL("SHOW CREATE TABLE test.testWithSchemaValidation").Execute().FetchOne()[1]; + Assert.That(sqlCreate.ToString().Contains(@"'{\r\n}'") || sqlCreate.ToString().Contains("{}")); + + //Passing null as parameter to ModifyCollection + var emptyOptions = new ModifyCollectionOptions(); + emptyOptions.Validation = new Validation() { }; + test.CreateCollection("testnull"); + exreuse = Assert.Throws(() => test.ModifyCollection("testnull", null)); + Assert.That(exreuse.Message, Is.EqualTo(@"Arguments value used under ""validation"" must be an object with at least one field")); + + test.DropCollection("testWithSchemaValidation"); + test.DropCollection("bug_0962"); + test.DropCollection("bug_0962b"); + test.DropCollection("testReuseExisting_1"); + test.DropCollection("Test_2b_1"); + test.DropCollection("Test_2b_2"); + test.DropCollection("Test_2b_3"); + test.DropCollection("Test_2b_4"); + test.DropCollection("Test_2b_5"); + test.DropCollection("testReuse"); + test.DropCollection("TestCreateInsert"); + test.DropCollection("testWithPersonSchema"); + test.DropCollection("testSchema1"); + test.DropCollection("testOriginal1"); + test.DropCollection("testOriginal2"); + test.DropCollection("testnull"); + } + + /// + /// Server Bug + /// Bug #31667405 - INCORRECT PREPARED STATEMENT OUTCOME WITH NUMERIC STRINGS IN JSON + /// + [Test] + public void PreparedStatementWithNumericStrings() + { + Collection coll = CreateCollection("test"); + object[] _docs = new[] + { + new { _id = "1", title = "foo" }, + new { _id = "2", title = "bar" } + }; + + ExecuteAddStatement(coll.Add(_docs)); + + var stmt = coll.Find("_id=:v").Bind("v", "1"); + var res = stmt.Execute(); + var values = res.FetchOne(); + Assert.That(Convert.ToInt32(values.values["_id"]), Is.EqualTo(1)); + Assert.That(values.values["title"].ToString(), Is.EqualTo("foo").IgnoreCase); + + res = coll.Find("_id=:v").Bind("v", "2").Execute(); + values = res.FetchOne(); + Assert.That(Convert.ToInt32(values.values["_id"]), Is.EqualTo(2)); + Assert.That(values.values["title"].ToString(), Is.EqualTo("bar").IgnoreCase); + } + + [Test, Description("Verify Count method for Tables,Collections,Collection As Table,Views with different combinations")] + public void AdditionalCountTests() + { + Session session = GetSession(); + Schema schema = session.GetSchema(schemaName); + CreateCollection("testCount"); + var count = session.SQL("SELECT COUNT(*) FROM test.testCount").Execute().FetchOne()[0]; + var collection = schema.GetCollection("testCount"); + var collectionAsTable = schema.GetCollectionAsTable("testCount"); + Assert.That(collection.Count(), Is.EqualTo(count)); + Assert.That(collectionAsTable.Count(), Is.EqualTo(count)); + + session.SQL($"USE {schemaName}").Execute(); + session.SQL("create table test1(name VARCHAR(40), age INT)").Execute(); + count = session.SQL($"SELECT COUNT(*) FROM {schemaName}.test1").Execute().FetchOne()[0]; + Table table = session.GetSchema(schemaName).GetTable("test1"); + Assert.That(collectionAsTable.Count(), Is.EqualTo(count)); + + var result = table.Insert("name", "age") + .Values("MARK", "34") + .Values("richie", "16") + .Values("TEST", "50") + .Execute(); + + Assert.That(result.AffectedItemsCount, Is.EqualTo((ulong)3)); + var selectResult = table.Select().Execute(); + while (selectResult.Next()) ; + Assert.That(selectResult.Rows.Count, Is.EqualTo(3)); + Assert.That(selectResult.Rows.ToArray()[0][0].ToString(), Is.EqualTo("MARK")); + count = session.SQL($"SELECT COUNT(*) FROM {schemaName}.test1").Execute().FetchOne()[0]; + Assert.That(table.Count(), Is.EqualTo(count)); + + // Insert some records + var stm = collection.Add(@"{ ""_id"": 1, ""foo"": 1 }") + .Add(@"{ ""_id"": 2, ""foo"": 2 }") + .Add(@"{ ""_id"": 3, ""foo"": 3 }"); + stm.Execute(); + count = session.SQL("SELECT COUNT(*) FROM test.testCount").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + collectionAsTable = schema.GetCollectionAsTable("testCount"); + Assert.That(collectionAsTable.Count(), Is.EqualTo(count)); + + table = schema.GetTable("testCount"); + table.Insert("doc").Values(@"{ ""_id"": 4, ""foo"": 4 }").Execute(); + count = session.SQL($"SELECT COUNT(*) FROM {schemaName}.testCount").Execute().FetchOne()[0]; + Assert.That(table.Count(), Is.EqualTo(count)); + + collection.RemoveOne(2); + count = session.SQL($"SELECT COUNT(*) FROM {schemaName}.testCount").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + Assert.That(table.Count(), Is.EqualTo(count)); + + // Collection/Table does not exist + Assert.Throws(() => schema.GetCollection("testCount_").Count()); + Assert.Throws(() => schema.GetTable("testCount_").Count()); + + session.SQL("DROP TABLE IF EXISTS test1").Execute(); + session.SQL("CREATE TABLE test1(id1 int,firstname varchar(20))").Execute(); + session.SQL("INSERT INTO test1 values ('1','Rob')").Execute(); + session.SQL("INSERT INTO test1 values ('2','Steve')").Execute(); + session.SQL("CREATE TABLE test2(id2 int,lastname varchar(20))").Execute(); + session.SQL("INSERT INTO test2 values ('1','Williams')").Execute(); + session.SQL("INSERT INTO test2 values ('2','Waugh')").Execute(); + session.SQL("CREATE VIEW view1 AS select * from test1").Execute(); + session.SQL("SELECT * FROM view1").Execute(); + session.SQL("CREATE VIEW view2 AS select * from test2").Execute(); + session.SQL("SELECT * FROM view2").Execute(); + count = session.SQL("SELECT COUNT(*) FROM view1").Execute().FetchOne()[0]; + Assert.That(schema.GetTable("view1").Count(), Is.EqualTo(count)); + schema.DropCollection("testCount"); + session.SQL("DROP TABLE IF EXISTS test1").Execute(); + session.SQL("DROP TABLE IF EXISTS test2").Execute(); + } + + [Test, Description("Verify Expected exceptions in Count")] + public void ExceptionsInCount() + { + Assume.That(session.Version.isAtLeast(8, 0, 0), "This test is for MySql 8.0 or higher"); + var coll = CreateCollection("testCount"); + var docs = new[] + { + new {_id = 1, title = "Book 1", pages = 20}, + new {_id = 2, title = "Book 2", pages = 30}, + new {_id = 3, title = "Book 3", pages = 40}, + new {_id = 4, title = "Book 4", pages = 50} + }; + var r = coll.Add(docs).Execute(); + var count = session.SQL("SELECT COUNT(*) FROM test.testCount").Execute().FetchOne()[0]; + Schema schema = session.GetSchema(schemaName); + var collection = schema.GetCollection("testCount"); + Assert.That(collection.Count(), Is.EqualTo(4)); + + coll.Add(new { _id = 5, title = "Book 5", pages = 60 }).Execute(); + count = session.SQL("SELECT COUNT(*) FROM test.testCount").Execute().FetchOne()[0]; + schema = session.GetSchema(schemaName); + collection = schema.GetCollection("testCount"); + Assert.That(collection.Count(), Is.EqualTo(5)); + + Table table = session.GetSchema("test").GetTable("testCount"); + Assert.That(table.Count(), Is.EqualTo(5)); + + // Expected exceptions. + Assert.Throws(() => coll.RemoveOne(null)); + Assert.Throws(() => coll.RemoveOne("")); + Assert.Throws(() => coll.RemoveOne(string.Empty)); + Assert.Throws(() => coll.RemoveOne(" ")); + + // Remove sending numeric parameter. + Assert.That(coll.RemoveOne(1).AffectedItemsCount, Is.EqualTo(1)); + Assert.That(collection.Count(), Is.EqualTo(4)); + Assert.That(table.Count(), Is.EqualTo(4)); + + // Remove sending string parameter. + Assert.That(coll.RemoveOne("3").AffectedItemsCount, Is.EqualTo(1)); + Assert.That(collection.Count(), Is.EqualTo(3)); + Assert.That(table.Count(), Is.EqualTo(3)); + + // Remove an auto-generated id. + var document = coll.Find("pages = 60").Execute().FetchOne(); + Assert.That(coll.RemoveOne(document.Id).AffectedItemsCount, Is.EqualTo(1)); + Assert.That(collection.Count(), Is.EqualTo(2)); + Assert.That(table.Count(), Is.EqualTo(2)); + + // Remove a non-existing document. + Assert.That(coll.RemoveOne(5).AffectedItemsCount, Is.EqualTo(0)); + Assert.That(collection.Count(), Is.EqualTo(2)); + Assert.That(table.Count(), Is.EqualTo(2)); + + // Add or ReplaceOne + Assert.That(coll.AddOrReplaceOne(5, new { _id = 5, title = "Book 5", pages = 60 }). + AffectedItemsCount, Is.EqualTo(1)); + Assert.That(collection.Count(), Is.EqualTo(3)); + Assert.That(table.Count(), Is.EqualTo(3)); + + // Add or ReplaceOne + Assert.That(coll.AddOrReplaceOne(2, new { title = "Book 50", pages = 60 }). + AffectedItemsCount, Is.EqualTo(2)); + Assert.That(collection.Count(), Is.EqualTo(3)); + Assert.That(table.Count(), Is.EqualTo(3)); + + // Add or ReplaceOne + Assert.That(coll.AddOrReplaceOne(6, new { _id = 6, title = "Book 6", pages = 70 }). + AffectedItemsCount, Is.EqualTo(1)); + Assert.That(collection.Count(), Is.EqualTo(4)); + Assert.That(table.Count(), Is.EqualTo(4)); + + var result = coll.Modify("_id = 5").Set("title", "Book 5").Execute(); + Assert.That(collection.Count(), Is.EqualTo(4)); + Assert.That(table.Count(), Is.EqualTo(4)); + + coll = CreateCollection("testCount"); + + DbDoc[] jsonlist = new DbDoc[1000]; + DbDoc[] jsonlist1 = new DbDoc[1000]; + for (int i = 0; i < 1000; i++) + { + DbDoc newDoc2 = new DbDoc(); + newDoc2.SetValue("_id", (i + 1000)); + newDoc2.SetValue("F1", ("Field-1-Data-" + i)); + newDoc2.SetValue("F2", ("Field-2-Data-" + i)); + newDoc2.SetValue("F3", (300 + i).ToString()); + jsonlist[i] = newDoc2; + newDoc2 = null; + } + + for (int i = 0; i < 1000; i++) + { + DbDoc newDoc2 = new DbDoc(); + newDoc2.SetValue("_id", (i + 10000)); + newDoc2.SetValue("F1", ("Field-1-Data-" + i)); + newDoc2.SetValue("F2", ("Field-2-Data-" + i)); + newDoc2.SetValue("F3", (300 + i).ToString()); + jsonlist1[i] = newDoc2; + newDoc2 = null; + } + Result res = coll.Add(jsonlist).Add(jsonlist1).Execute(); + count = session.SQL("SELECT COUNT(*) FROM test.testCount").Execute().FetchOne()[0]; + schema = session.GetSchema(schemaName); + collection = schema.GetCollection("testCount"); + Assert.That(collection.Count(), Is.EqualTo(2000)); + + r = coll.Remove("_id = :_id").Bind("_id", 1000).Execute(); + Assert.That(collection.Count(), Is.EqualTo(1999)); + } + + [Test, Description("Verify MultiThreading with count")] + public async Task MultithreadCount() + { + _ = await SubProcessA(); + _ = await SubProcessB(); + } + + private Task SubProcessA() + { + using (var sessionA = MySQLX.GetSession(ConnectionString)) + { + Schema schema = sessionA.GetSchema("test"); + var coll = schema.CreateCollection("testCount"); + DbDoc[] jsonlist = new DbDoc[1000]; + for (int i = 0; i < 1000; i++) + { + DbDoc newDoc2 = new DbDoc(); + newDoc2.SetValue("_id", (i + 1000)); + newDoc2.SetValue("F1", ("Field-1-Data-" + i)); + newDoc2.SetValue("F2", ("Field-2-Data-" + i)); + newDoc2.SetValue("F3", (300 + i).ToString()); + jsonlist[i] = newDoc2; + newDoc2 = null; + } + var res = coll.Add(jsonlist).Execute(); + var count = sessionA.SQL("SELECT COUNT(*) FROM test.testCount").Execute().FetchOne()[0]; + var collection = schema.GetCollection("testCount"); + Assert.That(collection.Count(), Is.EqualTo(1000)); + + var r = coll.Remove("_id = :_id").Bind("_id", 1001).Execute(); + Assert.That(collection.Count(), Is.EqualTo(999)); + } + return Task.FromResult(0); + } + + private Task SubProcessB() + { + Thread.Sleep(8000); + using (var sessionB = MySQLX.GetSession(ConnectionString)) + { + Schema schema = session.GetSchema(schemaName); + var coll = schema.GetCollection("testCount"); + + var count = sessionB.SQL("SELECT COUNT(*) FROM test.testCount").Execute().FetchOne()[0]; + schema = sessionB.GetSchema("test"); + var collection = schema.GetCollection("testCount"); + do + { + if (collection.Count() > 5) + { + Assert.That(collection.Count(), Is.EqualTo(999)); + break; + } + } + while (true); + + var r = coll.Remove("_id = :_id").Bind("_id", 1100).Execute(); + Assert.That(collection.Count(), Is.EqualTo(998)); + } + return Task.FromResult(0); + } + + [Test, Description("Verify the behaviour of the dropX method for dropCollection under stressed conditions")] + public void DropUnderStressedConditions() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + Schema schema = session.GetSchema(schemaName); + + for (var i = 0; i < 10; i++) + { + schema.CreateCollection("my_collection_123456789"); + schema.DropCollection("my_collection_123456789"); + } + + } + + [Test, Description("Verify that dropX method for dropSchema, dropIndex succeeds in stress conditions")] + public void DropObjectsUnderStress() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + var schema = session.GetSchema(schemaName); + var testColl = CreateCollection("test123"); + for (var i = 0; i < 150; i++) + { + testColl.Add(new { myId = 1 }).Execute(); + testColl.DropIndex("testIndex"); + testColl.Add(new { myId = 1 }).Execute(); + testColl.DropIndex("testIndex"); + } + + for (var i = 0; i < 1000; i++) + { + session.CreateSchema("validSchema"); + session.DropSchema("validSchema"); + Assert.That(session.GetSchema("validSchema").ExistsInDatabase(), Is.False); + } + + } + + [Test, Description("Verify that dropX method for dropIndex succeeds when deleted and created again with various combinations")] + public void DropDocuments() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + var schema = session.GetSchema(schemaName); + schema.DropCollection("test123"); + var testColl = schema.CreateCollection("test123"); + + var result = testColl.Add(new { myId = 1 }).Add(new { myId = 2 }).Execute(); + result = testColl.Add(new { myId = 1 }).Execute(); + + testColl.DropIndex("testIndex"); + result = testColl.Add(new { myId = 1 }).Execute(); + + testColl.DropIndex("testIndex"); + + testColl.DropIndex("testIndex"); + testColl.DropIndex("testIndex"); + result = testColl.Remove("myId = :myId").Bind("myId", 1).Execute(); + result = testColl.Add(new { myId = 1 }).Execute(); + result = testColl.Remove("myId = :myId").Bind("myId", 1).Execute(); + + } + + [Test, Description("Verify ModifyCollection with level OFF and JSON schema")] + public void SchemaValidation_S1() + { + Assume.That(session.Version.isAtLeast(8, 0, 19), "This test is for MySql 8.0.19 or higher"); + var schema = session.GetSchema(schemaName); + var options = new CreateCollectionOptions(); + var options1 = new ModifyCollectionOptions(); + var val = new Validation(); + var doc1 = "{\"id\": \"http://json-schema.org/geo\"," + + "\"$schema\": \"http://json-schema.org/draft-06/schema#\"," + + "\"description\": \"A Person example\"," + + "\"type\": \"object\"," + + "\"properties\": {" + + "\"name\": {" + + "\"type\": \"string\"" + + " }," + + "\"age\": {" + + "\"type\": \"number\"" + + "}" + + "}," + + "\"required\": [\"name\", \"age\"]" + + "}"; + + session.SQL($"use {schemaName}").Execute(); + val.Level = ValidationLevel.OFF; + val.Schema = doc1; + options.Validation = val; + options.ReuseExisting = false; + var collection = schema.CreateCollection("coll1", options); + collection.Add(@"{ ""name"": ""John"", ""age"": 52 }").Execute(); + var count = session.SQL("select count(*) from coll1").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + val.Level = ValidationLevel.OFF; + val.Schema = doc1; + options.Validation = val; + options.ReuseExisting = true; + collection = schema.CreateCollection("coll1", options); + collection.Add(@"{ ""name"": ""John"", ""age"": 52 }").Execute(); + count = session.SQL("select count(*) from coll1").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + val.Level = ValidationLevel.OFF; + val.Schema = doc1; + options.Validation = val; + options.ReuseExisting = true; + collection = schema.CreateCollection("coll2", options); + collection.Add(@"{ ""name"": ""John"", ""age"": 52 }").Execute(); + count = session.SQL("select count(*) from coll2").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + options.Validation = new Validation() { Level = ValidationLevel.OFF, Schema = doc1 }; + options.ReuseExisting = false; + collection = schema.CreateCollection("coll3", options); + collection.Add(@"{ ""name"": ""Ram"" , ""age"": 22 }").Execute(); + count = session.SQL("select count(*) from coll3").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + options.Validation = new Validation() { Level = ValidationLevel.OFF, Schema = doc1 }; + options.ReuseExisting = true; + collection = schema.CreateCollection("coll3", options); + collection.Add(@"{ ""name"": ""John"", ""age"": 52 }").Execute(); + count = session.SQL("select count(*) from coll3").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + var doc3 = "{\"id\": \"http://json-schema.org/geo\"," + + "\"$schema\": \"http://json-schema.org/draft-06/schema#\"," + + "\"description\": \"A geographical coordinate\"," + + "\"type\": \"object\"," + + "\"properties\": {" + + "\"latitude\": {" + + "\"type\": \"number\"" + + " }," + + "\"longitude\": {" + + "\"type\": \"number\"" + + "}" + + "}," + + "\"required\": [\"latitude\", \"longitude\"]" + + "}"; + + val.Level = ValidationLevel.OFF; + val.Schema = doc3; + options1.Validation = val; + collection = schema.ModifyCollection("coll1", options1); + collection.Add(@"{ ""latitude"": 20, ""longitude"": 30 }"); + count = session.SQL("select count(*) from coll1").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + var doc4 = "{\"id\": \"http://json-schema.org/geo\"," + + "\"$schema\": \"http://json-schema.org/draft-06/schema#\"," + + "\"description\": \"A Person example\"," + + "\"type\": \"object\"," + + "\"properties\": {" + + "\"name\": {" + + "\"type\": \"string\"" + + " }" + + "}," + + "\"required\": [\"name\"]" + + "}"; + + val.Level = ValidationLevel.STRICT; + val.Schema = doc4; + options1.Validation = val; + collection = schema.ModifyCollection("coll3", options1); + collection.Add(@"{ ""name"": ""Samar"" }"); + count = session.SQL("select count(*) from coll3").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + options1.Validation = new Validation() { Level = ValidationLevel.OFF, Schema = doc1 }; + collection = schema.ModifyCollection("coll2", options1); + collection.Add(@"{ ""name"": ""Ram"" , ""age"": 22 }").Execute(); + count = session.SQL("select count(*) from coll2").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + val.Level = ValidationLevel.STRICT; + val.Schema = doc1; + options1.Validation = new Validation() { Level = ValidationLevel.STRICT, Schema = doc1 }; + collection = schema.ModifyCollection("coll2", options1); + collection.Add(@"{ ""name"": ""Ram"" , ""age"": 22 }").Execute(); + count = session.SQL("select count(*) from coll2").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + } + + [Test, Description("Checking the createcollection() and ModifyCollection() with either the level or the schema")] + public void SchemaValidation_S2() + { + Assume.That(session.Version.isAtLeast(8, 0, 19), "This test is for MySql 8.0.19 or higher"); + var schema = session.GetSchema(schemaName); + session.SQL($"use {schemaName}").Execute(); + var options = new CreateCollectionOptions(); + var options1 = new ModifyCollectionOptions(); + var doc1 = "{\"id\": \"http://json-schema.org/geo\"," + + "\"$schema\": \"http://json-schema.org/draft-06/schema#\"," + + "\"description\": \"A Person example\"," + + "\"type\": \"object\"," + + "\"properties\": {" + + "\"name\": {" + + "\"type\": \"string\"" + + " }," + + "\"age\": {" + + "\"type\": \"number\"" + + "}" + + "}," + + "\"required\": [\"name\", \"age\"]" + + "}"; + + options.Validation = new Validation { Schema = doc1 }; + options.ReuseExisting = false; + var collection = schema.CreateCollection("coll4", options); + collection.Add(@"{ ""name"": ""John"", ""age"": 52 }").Execute(); + var result = session.SQL("select * from coll4").Execute().FetchAll(); + foreach (Row res in result) + Assert.That(res[0], Is.Not.Null); + var count = session.SQL("select count(*) from coll4").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + options.Validation = new Validation { Schema = doc1 }; + options.ReuseExisting = true; + collection = schema.CreateCollection("coll4", options); + collection.Add(@"{ ""name"": ""John"", ""age"": 52 }").Execute(); + result = session.SQL("select * from coll4").Execute().FetchAll(); + foreach (Row res in result) + Assert.That(res[0], Is.Not.Null); + count = session.SQL("select count(*) from coll4").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + options.Validation = new Validation { Schema = doc1 }; + options.ReuseExisting = true; + collection = schema.CreateCollection("colltesting", options); + Assert.Throws(() => ExecuteAddStatement(collection.Add(@"{ ""name"": ""John"", ""age"": ""52"" }"))); + count = session.SQL("select count(*) from colltesting").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + var doc2 = "{\"id\":\"http://json-schema.org/geo\"," + + "\"$schema\": \"http://json-schema.org/draft-06/schema#\"," + + "\"description\": \"A Person example\"," + + "\"type\": \"object\"," + + "\"properties\": {" + + "\"name\": {\"type\": \"string\"}," + + "\"number\": {\"type\": \"number\"}," + + "\"street_name\": {\"type\": \"string\"} ," + + "\"street_type\": {\"type\": \"string\"}," + + "\"colors\": " + + "{\"type\": \"array\" ," + + "\"description\": \"different colors\"," + + "\"items\": [" + + "{\"type\": \"string\"," + + "\"enum\": [\"red\", \"amber\", \"green\"]" + + "}," + + "{\"type\": \"number\"}," + + "{\"type\": \"boolean\"}"//," + + "{\"type\": \"null\"}," + + "]" + + "}" + + "}," + + "\"required\": [\"name\", \"number\"]" + + "}"; + + options.Validation = new Validation { Schema = doc2 }; + options.ReuseExisting = true; + Assert.Throws(() => schema.CreateCollection("colltesting2", options)); + + options.Validation = new Validation { Level = ValidationLevel.OFF }; ; + options.ReuseExisting = false; + collection = schema.CreateCollection("coll5", options); + collection.Add(@"{ ""name"": ""John"", ""age"": 52 }").Execute(); + result = session.SQL("select * from coll5").Execute().FetchAll(); + foreach (Row res in result) + Assert.That(res[0], Is.Not.Null); + count = session.SQL("select count(*) from coll5").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + options.Validation = new Validation { Level = ValidationLevel.STRICT }; + options.ReuseExisting = false; + collection = schema.CreateCollection("coll6", options); + collection.Add(@"{ ""name"": ""John"", ""age"": 52 }").Execute(); + result = session.SQL("select * from coll6").Execute().FetchAll(); + foreach (Row res in result) + Assert.That(res[0], Is.Not.Null); + count = session.SQL("select count(*) from coll6").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + options1.Validation = new Validation() { Schema = doc1 }; + collection = schema.ModifyCollection("coll6", options1); + collection.Add(@"{ ""name"": ""Ram"" , ""age"": 22 }").Execute(); + result = session.SQL("select * from coll6").Execute().FetchAll(); + foreach (Row res in result) + Assert.That(res[0], Is.Not.Null); + count = session.SQL("select count(*) from coll6").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + options1.Validation = new Validation() { Schema = doc1 }; + collection = schema.ModifyCollection("colltesting", options1); + Assert.Throws(() => ExecuteAddStatement(collection.Add(@"{ ""name"": ""Ram"" , ""age"": ""22"" }"))); + + options1.Validation = new Validation() { Schema = doc2 }; + Assert.Throws(() => collection = schema.ModifyCollection("colltesting2", options1)); + + options1.Validation = new Validation() { Level = ValidationLevel.OFF }; + collection = schema.ModifyCollection("coll4", options1); + collection.Add(@"{ ""name"": ""Ram"" , ""age"": 22 }").Execute(); + result = session.SQL("select * from coll4").Execute().FetchAll(); + foreach (Row res in result) + Assert.That(res[0], Is.Not.Null); + count = session.SQL("select count(*) from coll4").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + options1.Validation = new Validation() { Level = ValidationLevel.STRICT }; + collection = schema.ModifyCollection("coll5", options1); + collection.Add(@"{ ""name"": ""Ram"" , ""age"": 22 }").Execute(); + result = session.SQL("select * from coll5").Execute().FetchAll(); + foreach (Row res in result) + Assert.That(res[0], Is.Not.Null); + count = session.SQL("select count(*) from coll5").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + options1.Validation = new Validation() { }; + Assert.Throws(() => schema.ModifyCollection("coll2", options1)); + + string docEnum = "{\"id\":\"http://json-schema.org/draft-06/schema#\",\"$schema\":\"http://json-schema.org/draft-06/schema#\"," + + "\"description\": \"A Person example\",\"type\":\"object\"," + + "\"properties\":{" + + "\"name\":{" + + "\"type\":\"string\"" + + "}," + + "\"number\":{" + + "\"type\":\"number\"" + + "}," + + "\"street_name\":{" + + "\"type\":\"string\"" + + "}," + + "\"street_type\": {" + + "\"type\": \"string\"" + + "}," + + "\"colors\":{" + + "\"type\": \"array\"," + + "\"items\": {" + + "\"type\":\"string\"" + + "}" + + " }," + + "\"consistent\":{" + + "\"type\": \"boolean\"" + + " }," + + "\"Favourite colors\":{" + + "\"enum\": [" + + "\"red\"," + + "\"amber\"," + + "\"green\"" + + "]" + + "}" + + "}" + + "}"; + + options.Validation = new Validation { Schema = docEnum, Level = ValidationLevel.STRICT }; + options.ReuseExisting = true; + collection = schema.CreateCollection("collEnum", options); + collection.Add(@"{ ""name"": ""John"" }").Execute(); + result = session.SQL("select * from collEnum").Execute().FetchAll(); + foreach (Row res in result) + Console.WriteLine("test with enum: " + res[0]); + count = session.SQL("select count(*) from collEnum").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + } + + [Test, Description("Checking the error messages with different level")] + public void SchemaValidation_S3() + { + Assume.That(session.Version.isAtLeast(8, 0, 19), "This test is for MySql 8.0.19 or higher"); + session.SQL($"use {schemaName}").Execute(); + var options = new CreateCollectionOptions(); + var options1 = new ModifyCollectionOptions(); + var doc1 = "{\"id\": \"http://json-schema.org/geo\"," + + "\"$schema\": \"http://json-schema.org/draft-06/schema#\"," + + "\"description\": \"A Person example\"," + + "\"type\": \"object\"," + + "\"properties\": {" + + "\"name\": {" + + "\"type\": \"string\"" + + " }," + + "\"age\": {" + + "\"type\": \"number\"" + + "}" + + "}," + + "\"required\": [\"name\", \"age\"]" + + "}"; + + var schema = session.GetSchema(schemaName); + options.Validation = new Validation { Schema = doc1, Level = ValidationLevel.STRICT }; + options.ReuseExisting = false; + var collection = schema.CreateCollection("coll7", options); + collection.Add(@"{ ""name"": ""John"", ""age"": 52 }").Execute(); + var result = session.SQL("select * from coll7").Execute().FetchAll(); + foreach (Row res in result) + Assert.That(res[0], Is.Not.Null); + var count = session.SQL("select count(*) from coll7").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + options.Validation = new Validation { Schema = doc1, Level = ValidationLevel.STRICT }; + options.ReuseExisting = false; + collection = schema.CreateCollection("collext", options); + collection.Add(@"{ ""name"": ""John"", ""age"": 52 }").Execute(); + result = session.SQL("select * from collext").Execute().FetchAll(); + foreach (Row res in result) + Assert.That(res[0], Is.Not.Null); ; + count = session.SQL("select count(*) from collext").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + var doc2 = "{\"id\":\"http://json-schema.org/geo\"," + + "\"$schema\": \"http://json-schema.org/draft-06/schema#\"," + + "\"description\": \"A Person example\"," + + "\"type\": \"object\"," + + "\"properties\": {" + + "\"name\": {\"type\": \"string\"}," + + "\"number\": {\"type\": \"number\"}," + + "\"street_name\": {\"type\": \"string\"} ," + + "\"street_type\": {\"type\": \"string\"}," + + "\"colors\": " + + "{\"type\": \"array\" ," + + "\"description\": \"different colors\"," + + "\"items\": [" + + "{\"type\": \"string\"," + + "\"enum\": [\"red\", \"amber\", \"green\"]" + + "}," + + "{\"type\": \"number\"}," + + "{\"type\": \"boolean\"}"//," + + "{\"type\": \"null\"}," + + "]" + + "}" + + "}," + + "\"required\": [\"name\", \"number\"]" + + "}"; + + options.Validation = new Validation { Schema = doc2, Level = ValidationLevel.STRICT }; + options.ReuseExisting = false; + Assert.Throws(() => schema.CreateCollection("coll8", options)); + + options.Validation = new Validation { Schema = doc1, Level = ValidationLevel.STRICT }; + options.ReuseExisting = true; + collection = schema.CreateCollection("coll8", options); + collection.Add(@"{ ""name"": ""John"", ""age"": 52 }").Execute(); + result = session.SQL("select * from coll8").Execute().FetchAll(); + foreach (Row res in result) + Assert.That(res[0], Is.Not.Null); ; + count = session.SQL("select count(*) from coll8").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + options.Validation = new Validation { Schema = doc1, Level = ValidationLevel.STRICT }; + options.ReuseExisting = false; + collection = schema.CreateCollection("coll9", options); + Assert.Throws(() => ExecuteAddStatement(collection.Add(@"{""longitude"":""99""}"))); + + options1.Validation = new Validation { Schema = doc1, Level = ValidationLevel.STRICT }; + collection = schema.ModifyCollection("coll7", options1); + Assert.Throws(() => ExecuteAddStatement(collection.Add(@"{ ""number"": ""56"" }"))); + + options.Validation = new Validation { Schema = doc1, Level = ValidationLevel.OFF }; + options.ReuseExisting = false; + collection = schema.CreateCollection("coll10", options); + collection.Add(@"{""longitude"":""99""}").Execute(); + result = session.SQL("select * from coll10").Execute().FetchAll(); + foreach (Row res in result) + Assert.That(res[0], Is.Not.Null); ; + count = session.SQL("select count(*) from coll10").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + options1.Validation = new Validation { Schema = doc1, Level = ValidationLevel.OFF }; + collection = schema.ModifyCollection("coll10", options1); + collection.Add(@"{ ""name"": 67 }").Execute(); + result = session.SQL("select * from coll10").Execute().FetchAll(); + foreach (Row res in result) + Assert.That(res[0], Is.Not.Null); ; + count = session.SQL("select count(*) from coll10").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + options.Validation = new Validation { Schema = doc1, Level = ValidationLevel.STRICT }; + options.ReuseExisting = false; + collection = schema.CreateCollection("coll", options); + collection.Add(@"{""_id"":1,""name"": ""John"", ""age"": 52}").Execute(); + result = session.SQL("select * from coll").Execute().FetchAll(); + foreach (Row res in result) + Assert.That(res[0], Is.Not.Null); ; + count = session.SQL("select count(*) from coll").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + } + + /// + /// Bug 30693969 + /// + [Test, Description("Verify ModifyCollection with level OFF and JSON schema with Json schema")] + public void ModifyCollectionSchemaValidation() + { + Assume.That(session.Version.isAtLeast(8, 0, 19), "This test is for MySql 8.0.19 or higher"); + session.SQL($"use {schemaName}").Execute(); + var schema = session.GetSchema(schemaName); + var options = new CreateCollectionOptions(); + var val = new Validation(); + string doc1 = "{" + + " \"id\":\"https://example.com/arrays.schema.json\"," + + " \"$schema\": \"http://json-schema.org/draft-07/schema#\"," + + " \"description\": \"A representation of a person, company, organization, or place\"," + + " \"type\": \"object\"," + + " \"properties\": {" + + " \"fruits\": {" + + " \"type\": \"array\"," + + " \"items\": {" + + "\"type\": \"string\"" + + " }" + + "}," + + "\"vegetables\": {" + + " \"type\": \"array\"," + + "\"items\": { \"$ref\": \"#/definitions/veggie\" }" + + " }" + + "}," + + "\"definitions\": {" + + " \"veggie\": {" + + " \"type\": \"object\"," + + " \"required\": [ \"veggieName\", \"veggieLike\" ]," + + "\"properties\": {" + + " \"veggieName\": {" + + " \"type\": \"string\"," + + " \"description\": \"The name of the vegetable.\"" + + "}," + + "\"veggieLike\": {" + + "\"type\": \"boolean\"," + + "\"description\": \"Do I like this vegetable?\"" + + "}" + + "}" + + "}" + + "}" + + "}"; + + val.Level = ValidationLevel.STRICT; + val.Schema = doc1; + options.Validation = val; + options.ReuseExisting = false; + var collection = schema.CreateCollection("coll20", options); + collection.Add(@"{""fruits"": [ ""apple"", ""orange"", ""pear"" ],""vegetables"": [{""veggieName"": ""potato"",""veggieLike"": true},{""veggieName"": ""broccoli"",""veggieLike"": false}]}").Execute(); + var result = session.SQL("select * from coll20").Execute().FetchAll(); + foreach (Row res in result) + Assert.That(res[0], Is.Not.Null); + var count = session.SQL("select count(*) from coll20").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + options.Validation = new Validation { Level = ValidationLevel.STRICT, Schema = doc1 }; + options.ReuseExisting = false; + collection = schema.CreateCollection("coll21", options); + collection.Add(@"{""fruits"": [ ""apple"", ""orange"", ""pear"" ],""vegetables"": [{""veggieName"": ""potato"",""veggieLike"": true},{""veggieName"": ""broccoli"",""veggieLike"": false}]}").Execute(); + result = session.SQL("select * from coll21").Execute().FetchAll(); + foreach (Row res in result) + Assert.That(res[0], Is.Not.Null); + count = session.SQL("select count(*) from coll21").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + val.Level = ValidationLevel.STRICT; + val.Schema = doc1; + options.Validation = val; + options.ReuseExisting = true; + collection = schema.CreateCollection("coll20", options); + collection.Add(@"{""fruits"": [ ""apple"", ""orange"", ""pear"" ],""vegetables"": [{""veggieName"": ""potato"",""veggieLike"": true},{""veggieName"": ""broccoli"",""veggieLike"": false}]}").Execute(); + result = session.SQL("select * from coll20").Execute().FetchAll(); + foreach (Row res in result) + Assert.That(res[0], Is.Not.Null); + count = session.SQL("select count(*) from coll20").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + options.Validation = new Validation { Level = ValidationLevel.STRICT, Schema = doc1 }; + options.ReuseExisting = true; + collection = schema.CreateCollection("coll21", options); + collection.Add(@"{""fruits"": [ ""apple"", ""orange"", ""pear"" ],""vegetables"": [{""veggieName"": ""potato"",""veggieLike"": true},{""veggieName"": ""broccoli"",""veggieLike"": false}]}").Execute(); + result = session.SQL("select * from coll21").Execute().FetchAll(); + foreach (Row res in result) + Assert.That(res[0], Is.Not.Null); + count = session.SQL("select count(*) from coll21").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + val.Level = ValidationLevel.OFF; + val.Schema = doc1; + options.Validation = val; + options.ReuseExisting = true; + collection = schema.CreateCollection("coll22", options); + collection.Add(@"{""fruits"": [ 78, ""orange"", ""pear"" ],""vegetables"": [{""veggieName"": ""potato"",""veggieLike"": true},{""veggieName"": ""broccoli"",""veggieLike"": false}]}").Execute(); + result = session.SQL("select * from coll22").Execute().FetchAll(); + foreach (Row res in result) + Assert.That(res[0], Is.Not.Null); + count = session.SQL("select count(*) from coll22").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + } + + [Test, Description("Verify ModifyCollection with level OFF and JSON schema")] + public void SchemaValidationDeleteRecords() + { + // Bug30748283 + Assume.That(session.Version.isAtLeast(8, 0, 19), "This test is for MySql 8.0.19 or higher"); + string doc5 = "{\"id\": \"http://json-schema.org/geo\"," + + "\"$schema\": \"http://json-schema.org/draft-06/schema#\"," + + "\"description\": \"A Person example\"," + + "\"type\": \"object\"," + + "\"properties\": {" + + "\"name\": {" + + "\"type\": \"number\"" + + " }" + + "}," + + "\"required\": [\"name\"]" + + "}"; + + string doc1 = "{\"id\": \"http://json-schema.org/geo\"," + + "\"$schema\": \"http://json-schema.org/draft-06/schema#\"," + + "\"description\": \"A Person example\"," + + "\"type\": \"object\"," + + "\"properties\": {" + + "\"name\": {" + + "\"type\": \"string\"" + + " }" + + ",\"age\": {" + + "\"type\": \"number\"" + + "}" + + "}," + + "\"required\": [\"name\",\"age\"]" + + "}"; + string doc3 = "{\"id\": \"http://json-schema.org/geo\"," + + "\"$schema\": \"http://json-schema.org/draft-06/schema#\"," + + "\"description\": \"A geographical coordinate\"," + + "\"type\": \"object\"," + + "\"properties\": {" + + "\"latitude\": {" + + "\"type\": \"number\"" + + " }," + + "\"longitude\": {" + + "\"type\": \"number\"" + + "}" + + "}," + + "\"required\": [\"latitude\", \"longitude\"]" + + "}"; + + string doc4 = "{\"id\": \"http://json-schema.org/geo\"," + + "\"$schema\": \"http://json-schema.org/draft-06/schema#\"," + + "\"description\": \"A Person example\"," + + "\"type\": \"object\"," + + "\"properties\": {" + + "\"name\": {" + + "\"type\": \"string\"" + + " }" + + "}," + + "\"required\": [\"name\"]" + + "}"; + + session.SQL($"use {schemaName}").Execute(); + var schema = session.GetSchema(schemaName); + var options = new CreateCollectionOptions(); + var options1 = new ModifyCollectionOptions(); + + options.Validation = new Validation { Level = ValidationLevel.STRICT, Schema = doc5 }; + options.ReuseExisting = true; + var collection = schema.CreateCollection("collectiontest", options); + collection.Add(@"{ ""name"": 52 }").Execute(); + var result = session.SQL("select * from collectiontest").Execute().FetchAll(); + foreach (Row res1 in result) + Assert.That(res1[0], Is.Not.Null); + var count = session.SQL("select count(*) from collectiontest").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + options1.Validation = new Validation { Level = ValidationLevel.STRICT, Schema = doc1 }; + session.SQL("delete from collectiontest").Execute(); + + collection = schema.ModifyCollection("collectiontest", options1); + collection.Add(@"{ ""name"": ""sammeer"",""age"":8 }").Execute(); + var result2 = session.SQL("select * from collectiontest").Execute().FetchAll(); + foreach (Row res2 in result2) + Console.WriteLine(res2[0]); + count = session.SQL("select count(*) from collectiontest").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + options1.Validation = new Validation { Level = ValidationLevel.OFF, Schema = doc1 }; + collection = schema.ModifyCollection("collectiontest", options1); + collection.Add(@"{ ""name"": 78 }").Execute(); + result = session.SQL("select * from collectiontest").Execute().FetchAll(); + foreach (Row res2 in result) + Assert.That(res2[0], Is.Not.Null); + count = session.SQL("select count(*) from collectiontest").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + options1.Validation = new Validation { Level = ValidationLevel.STRICT, Schema = doc3 }; + session.SQL("delete from collectiontest").Execute(); + collection = schema.ModifyCollection("collectiontest", options1); + collection.Add(@"{""latitude"": 253, ""longitude"": 525}").Execute(); + result = session.SQL("select * from collectiontest").Execute().FetchAll(); + foreach (Row res2 in result) + Assert.That(res2[0], Is.Not.Null); + count = session.SQL("select count(*) from collectiontest").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + options1.Validation = new Validation { Level = ValidationLevel.STRICT, Schema = doc4 }; + session.SQL("delete from collectiontest").Execute(); + result = session.SQL("select * from collectiontest").Execute().FetchAll(); + collection = schema.ModifyCollection("collectiontest", options1); + collection.Add(@"{ ""name"": ""Johnny"" }").Execute(); + result = session.SQL("select * from collectiontest").Execute().FetchAll(); + foreach (Row res2 in result) + Assert.That(res2[0], Is.Not.Null); + count = session.SQL("select count(*) from collectiontest").Execute().FetchOne()[0]; + Assert.That(collection.Count(), Is.EqualTo(count)); + + } + + [Test, Description("Test MySQLX plugin Remove Bind Stress")] + public void RemoveBindStress() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + Collection coll = CreateCollection("test"); + DbDoc[] jsonlist = new DbDoc[10]; + DbDoc[] jsonlist1 = new DbDoc[10]; + for (int i = 0; i < 10; i++) + { + DbDoc newDoc2 = new DbDoc(); + newDoc2.SetValue("_id", (i + 1000)); + newDoc2.SetValue("F1", ("Field-1-Data-" + i)); + newDoc2.SetValue("F2", ("Field-2-Data-" + i)); + newDoc2.SetValue("F3", (300 + i).ToString()); + jsonlist[i] = newDoc2; + newDoc2 = null; + } + + for (int i = 0; i < 10; i++) + { + DbDoc newDoc2 = new DbDoc(); + newDoc2.SetValue("_id", (i + 10000)); + newDoc2.SetValue("F1", ("Field-1-Data-" + i)); + newDoc2.SetValue("F2", ("Field-2-Data-" + i)); + newDoc2.SetValue("F3", (300 + i).ToString()); + jsonlist1[i] = newDoc2; + newDoc2 = null; + } + Result r = coll.Add(jsonlist).Add(jsonlist1).Execute(); + + Assert.That(r.AffectedItemsCount, Is.EqualTo(20), "Matching"); + + r = coll.Remove("_id = :_id").Bind("_id", 1000).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1), "Matching"); + } + + [Test, Description("Test MySQLX plugin Get Collection as Table")] + public void GetCollectionAsTableStress() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + Collection testCollection = CreateCollection("test"); + + DbDoc[] jsonlist = new DbDoc[1000]; + for (int i = 0; i < 1000; i++) + { + DbDoc newDoc2 = new DbDoc(); + newDoc2.SetValue("_id", (i + 1000)); + newDoc2.SetValue("F1", ("Field-1-Data-" + i)); + newDoc2.SetValue("F2", ("Field-2-Data-" + i)); + newDoc2.SetValue("F3", (300 + i).ToString()); + jsonlist[i] = newDoc2; + newDoc2 = null; + } + Result r = testCollection.Add(jsonlist).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1000), "Matching"); + + Table test = testSchema.GetCollectionAsTable("test"); + Assert.That(test.ExistsInDatabase()); + var rows = test.Select("_id").Execute().FetchAll(); + + for (int j = 0; j < rows.Count; j++) + { + var doc = testCollection.Find("_id like :param").Bind("param", (j + 1000)).Execute(); + var docs = doc.FetchAll().Count(); + Assert.That(docs, Is.EqualTo(1), "Matches"); + } + } + + [Test, Description("Test MySQLX plugin GetCollection Exception Scenario")] + public void GetCollectionException() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + using (Session sessionPlain = MySQLX.GetSession(ConnectionString)) + { + Schema db = sessionPlain.GetSchema(schemaName); + Collection col = db.GetCollection("my_collection_123456789"); + if (col.ExistsInDatabase()) + { + db.DropCollection("my_collection_123456789"); + col = db.CreateCollection("my_collection_123456789"); + } + else { col = db.CreateCollection("my_collection_123456789"); } + + Collection col1 = db.GetCollection("my_collection_123456789", true); + if (col.ExistsInDatabase()) + { + db.DropCollection("my_collection_123456789"); + col1 = db.CreateCollection("my_collection_123456789"); + } + else { col1 = db.CreateCollection("my_collection_123456789"); } + + var col2 = db.GetTable("my_collection_1234567891"); + Assert.Throws(() => db.GetCollection("my_collection_test", true)); + db.DropCollection("my_collection_123456789"); + } + } + + [Test, Description("Collection GetDocumentIDS Stress(1000 records)")] + public void GetDocumentIDSStress() + { + Collection coll = CreateCollection("test"); + DbDoc[] jsonlist = new DbDoc[1000]; + for (int i = 0; i < 1000; i++) + { + DbDoc newDoc2 = new DbDoc(); + newDoc2.SetValue("_id", (i)); + newDoc2.SetValue("F1", ("Field-1-Data-" + i)); + newDoc2.SetValue("F2", ("Field-2-Data-" + i)); + newDoc2.SetValue("F3", (3 + i).ToString()); + jsonlist[i] = newDoc2; + newDoc2 = null; + } + Result r = coll.Add(jsonlist).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1000), "Matching"); + var documentIds = r.GeneratedIds; + Assert.That(documentIds != null && documentIds.Count > 0, Is.False); + } + + [Test, Description("Session Performance Test")] + public void SessionPerformanceTest() + { + string json = ""; + int i = 0, j = 0, maxField = 100; + var collection = CreateCollection("test"); + int maxDepth = 97; + json = "{\"_id\":\"1002\",\"XYZ\":1111"; + for (j = 0; j < maxField; j++) + { + json = json + ",\"ARR" + j + "\":["; + for (i = 0; i < maxDepth; i++) + { + json = json + i + ",["; + } + json = json + i; + for (i = maxDepth - 1; i >= 0; i--) + { + json = json + "]," + i; + } + json = json + "]"; + } + json = json + "}"; + + collection.Add(json).Execute(); + json = "{\"_id\":\"1003\",\"XYZ\":2222"; + for (j = 0; j < maxField; j++) + { + json = json + ",\"DATAX" + j + "\":"; + for (i = 0; i < maxDepth; i++) + { + json = json + "{\"D" + i + "\":"; + } + json = json + maxDepth; + for (i = maxDepth - 1; i >= 0; i--) + { + json = json + "}"; + } + } + json = json + "}"; + + collection.Add(json).Execute(); + json = "{\"_id\":\"1001\",\"XYZ\":3333"; + for (j = 0; j < maxField; j++) + { + json = json + ",\"ARR" + j + "\":["; + for (i = 0; i < maxDepth; i++) + { + json = json + i + ",["; + } + json = json + i; + for (i = maxDepth - 1; i >= 0; i--) + { + json = json + "]," + i; + } + json = json + "]"; + } + + for (j = 0; j < maxField; j++) + { + json = json + ",\"DATAX" + j + "\":"; + for (i = 0; i < maxDepth; i++) + { + json = json + "{\"D" + i + "\":"; + } + json = json + maxDepth; + for (i = maxDepth - 1; i >= 0; i--) + { + json = json + "}"; + } + } + json = json + "}"; + collection.Add(json).Execute(); + + // select + string query = "$.ARR" + (maxField - 1); + for (i = 0; i < maxDepth; i++) + { + query = query + "[1]"; + } + query = query + "[0]"; + json = "CAST(" + query + " as SIGNED)= " + maxDepth; + var docs = collection.Find(json).Fields("$._id as _id," + query + " as Arr").Execute(); + var res = docs.FetchAll(); + Assert.That(res[0]["_id"].ToString(), Is.EqualTo("1001"), "Matching the id"); + Assert.That(res[1]["_id"].ToString(), Is.EqualTo("1002"), "Matching the id"); + + query = "$.DATAX" + (maxField - 1); + for (i = 0; i < maxDepth; i++) + { + query = query + ".D" + i; + } + json = "CAST(" + query + " as SIGNED)"; + docs = collection.Find(json + " =" + maxDepth).Fields("$._id as _id ").Execute(); + res = docs.FetchAll(); + Assert.That(res[0]["_id"].ToString(), Is.EqualTo("1001"), "Matching the id"); + Assert.That(res[1]["_id"].ToString(), Is.EqualTo("1003"), "Matching the id"); + } + + /// + /// Bug #34243143 [Connector/NET allows empty string in Set() method which is chained to Modify()] + /// The fix applied for every method in Modify(). + /// + [Test] + public void EmptyStringInModifyMethods() + { + Collection coll = CreateCollection("test"); + object _doc = new { _id = 1, title = "foo" }; + coll.Add(_doc).Execute(); + var result = coll.Find("_id == 1").Execute().FetchOne(); + + Assert.That(result, Is.Not.Null); + Assert.That(result.Id, Is.EqualTo(1)); + + // empty string + var ex = Assert.Throws(() => coll.Modify("_id == 1").Set("", new { title = "bar" }).Execute()); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.DocPathNullOrEmpty).IgnoreCase); + ex = Assert.Throws(() => coll.Modify("_id == 1").Unset("").Execute()); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.DocPathNullOrEmpty).IgnoreCase); + ex = Assert.Throws(() => coll.Modify("_id == 1").Change("", new { title = "bar" }).Execute()); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.DocPathNullOrEmpty).IgnoreCase); + ex = Assert.Throws(() => coll.Modify("_id == 1").ArrayInsert("", new { title = "bar" }).Execute()); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.DocPathNullOrEmpty).IgnoreCase); + ex = Assert.Throws(() => coll.Modify("_id == 1").ArrayAppend("", new { title = "bar" }).Execute()); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.DocPathNullOrEmpty).IgnoreCase); + + // white space + ex = Assert.Throws(() => coll.Modify("_id == 1").Set(" ", new { title = "bar" }).Execute()); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.DocPathNullOrEmpty).IgnoreCase); + ex = Assert.Throws(() => coll.Modify("_id == 1").Unset(" ").Execute()); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.DocPathNullOrEmpty).IgnoreCase); + ex = Assert.Throws(() => coll.Modify("_id == 1").Change(" ", new { title = "bar" }).Execute()); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.DocPathNullOrEmpty).IgnoreCase); + ex = Assert.Throws(() => coll.Modify("_id == 1").ArrayInsert(" ", new { title = "bar" }).Execute()); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.DocPathNullOrEmpty).IgnoreCase); + ex = Assert.Throws(() => coll.Modify("_id == 1").ArrayAppend(" ", new { title = "bar" }).Execute()); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.DocPathNullOrEmpty).IgnoreCase); + + // null + ex = Assert.Throws(() => coll.Modify("_id == 1").Set(null, new { title = "bar" }).Execute()); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.DocPathNullOrEmpty).IgnoreCase); + ex = Assert.Throws(() => coll.Modify("_id == 1").Change(null, new { title = "bar" }).Execute()); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.DocPathNullOrEmpty).IgnoreCase); + ex = Assert.Throws(() => coll.Modify("_id == 1").ArrayInsert(null, new { title = "bar" }).Execute()); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.DocPathNullOrEmpty).IgnoreCase); + ex = Assert.Throws(() => coll.Modify("_id == 1").ArrayAppend(null, new { title = "bar" }).Execute()); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.DocPathNullOrEmpty).IgnoreCase); + var ex2 = Assert.Throws(() => coll.Modify("_id == 1").Unset(null).Execute()); + } + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/CompressionTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/CompressionTests.cs new file mode 100644 index 000000000..d0a3df97f --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/CompressionTests.cs @@ -0,0 +1,936 @@ +// Copyright © 2019, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using MySql.Data.MySqlClient; +using MySqlX.Common; +using MySqlX.XDevAPI; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; + +namespace MySqlX.Data.Tests +{ + /// + /// Compression/decompression based unit tests. + /// + public class CompressionTests : BaseTest + { + private const string DEFLATE_STREAM = "DEFLATE_STREAM"; + public Client client = null; + + [TearDown] + public void TearDown() + { + ExecuteSQL("drop database if exists compression"); + ExecuteSqlAsRoot(@"SET GLOBAL mysqlx_compression_algorithms = ""ZSTD_STREAM,LZ4_MESSAGE,DEFLATE_STREAM"" "); + } + + [Test] + public void ConnectionOptionIsValidUsingBuilder() + { + var builder = new MySqlXConnectionStringBuilder(ConnectionString); + builder.Compression = CompressionType.Preferred; + Assert.That(builder.ToString(), Does.Contain("compression=Preferred")); + + builder.Compression = CompressionType.Required; + Assert.That(builder.ToString(), Does.Contain("compression=Required")); + + builder.Compression = CompressionType.Disabled; + Assert.That(builder.ToString(), Does.Contain("compression=Disabled")); + } + + [Test] + public void ConnectionOptionIsValidUsingConnectionUri() + { + using (var session = MySQLX.GetSession($"{ConnectionStringUri}?compression=PreFerRed")) + { + Assert.That(session.Settings.Compression, Is.EqualTo(CompressionType.Preferred)); + session.Close(); + } + + using (var session = MySQLX.GetSession($"{ConnectionStringUri}?compression=required")) + { + Assert.That(session.Settings.Compression, Is.EqualTo(CompressionType.Required)); + session.Close(); + } + + using (var session = MySQLX.GetSession($"{ConnectionStringUri}?compression=DISABLED")) + { + Assert.That(session.Settings.Compression, Is.EqualTo(CompressionType.Disabled)); + session.Close(); + } + + // Test whitespace + using (var session = MySQLX.GetSession($"{ConnectionStringUri}?compression= DISABLED")) + { + Assert.That(session.Settings.Compression, Is.EqualTo(CompressionType.Disabled)); + session.Close(); + } + + using (var session = MySQLX.GetSession($"{ConnectionStringUri}?compression= DISABLED ")) + { + Assert.That(session.Settings.Compression, Is.EqualTo(CompressionType.Disabled)); + session.Close(); + } + } + + [Test] + public void ConnectionOptionIsValidUsingAnonymousObject() + { + var connectionData = new + { + server = Host, + user = "test", + password = "test", + port = UInt32.Parse(XPort), + compression = CompressionType.Required + }; + + using (var session = MySQLX.GetSession(connectionData)) + { + Assert.That(session.Settings.Compression, Is.EqualTo(CompressionType.Required)); + session.Close(); + } + } + + [Test] + public void ConnectionOptionIsValidUsingConnectionString() + { + var builder = new MySqlXConnectionStringBuilder($"server={Host};port={XPort};compression=PreFerRed"); + Assert.That(builder.Compression, Is.EqualTo(CompressionType.Preferred)); + + builder = new MySqlXConnectionStringBuilder($"server={Host};port={XPort};compression=required"); + Assert.That(builder.Compression, Is.EqualTo(CompressionType.Required)); + + builder = new MySqlXConnectionStringBuilder($"server={Host};port={XPort};compression=DISABLED"); + Assert.That(builder.Compression, Is.EqualTo(CompressionType.Disabled)); + + // Test whitespace + builder = new MySqlXConnectionStringBuilder($"server={Host};port={XPort};compression= required"); + Assert.That(builder.Compression, Is.EqualTo(CompressionType.Required)); + + builder = new MySqlXConnectionStringBuilder($"server={Host};port={XPort};compression= required"); + Assert.That(builder.Compression, Is.EqualTo(CompressionType.Required)); + + builder = new MySqlXConnectionStringBuilder($"server={Host};port={XPort};compression= required "); + Assert.That(builder.Compression, Is.EqualTo(CompressionType.Required)); + } + + [Test] + public void PreferredIsTheDefaultValue() + { + var builder = new MySqlXConnectionStringBuilder(); + Assert.That(builder.Compression, Is.EqualTo(CompressionType.Preferred)); + + // Empty value is ignored. + var updatedConnectionStringUri = ConnectionStringUri + "?compression="; + using (var session = MySQLX.GetSession(updatedConnectionStringUri)) + { + Assert.That(session.Settings.Compression, Is.EqualTo(CompressionType.Preferred)); + session.Close(); + } + + // Whitespace is ignored. + updatedConnectionStringUri = ConnectionStringUri + "?compression= "; + using (var session = MySQLX.GetSession(updatedConnectionStringUri)) + { + Assert.That(session.Settings.Compression, Is.EqualTo(CompressionType.Preferred)); + session.Close(); + } + } + + [Test] + public void SettingAnInvalidCompressionTypeRaisesException() + { + string[] invalidValues = { "test", "true", "123" }; + foreach (var invalidValue in invalidValues) + { + var exception = Assert.Throws(() => new MySqlXConnectionStringBuilder($"server={Host};port={XPort};compression={invalidValue}")); + Assert.That(exception.Message, Is.EqualTo($"The connection property 'compression' acceptable values are: 'preferred', 'required' or 'disabled'. The value '{invalidValue}' is not acceptable")); + + exception = Assert.Throws(() => MySQLX.GetSession($"server={Host};port={XPort};user=root;compression={invalidValue}")); + Assert.That(exception.Message, Is.EqualTo($"The connection property 'compression' acceptable values are: 'preferred', 'required' or 'disabled'. The value '{invalidValue}' is not acceptable")); + } + } + + [Test] + public void SessionRetainsTheSpecifiedCompressionType() + { + using (var session = MySQLX.GetSession(ConnectionStringUri)) + { + Assert.That(session.Settings.Compression, Is.EqualTo(CompressionType.Preferred)); + session.Close(); + } + + var updatedConnectionStringUri = ConnectionStringUri + "?compression=Disabled"; + using (var session = MySQLX.GetSession(updatedConnectionStringUri)) + { + Assert.That(session.Settings.Compression, Is.EqualTo(CompressionType.Disabled)); + session.Close(); + } + } + + [Test] + public void ValidateRequiredCompressionType() + { + // Compression supported starting server 8.0.19. + if (!session.InternalSession.GetServerVersion().isAtLeast(8, 0, 19)) + { + var exception = Assert.Throws(() => MySQLX.GetSession($"{ConnectionStringUri}?compression=Required")); + Assert.That(exception.Message, Is.EqualTo("Compression requested but the server does not support it.")); + } + else + { + using var session = MySQLX.GetSession($"{ConnectionStringUri}?compression=Required"); + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + + [Test] + public void NegotiationSucceedsWithExpectedCompressionAlgorithm() + { + Assume.That(session.Version.isAtLeast(8, 0, 19), "This test is for MySql 8.0.19 or higher"); + + // Validate zstd_stream is the default. + using (var session = MySQLX.GetSession(ConnectionStringUri)) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.zstd_stream.ToString())); + compressionAlgorithm = session.XSession.GetCompressionAlgorithm(false); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.zstd_stream.ToString())); + } + + using (var session = MySQLX.GetSession(ConnectionStringUri + "?compression-algorithms=lz4_message")) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.lz4_message.ToString())); + compressionAlgorithm = session.XSession.GetCompressionAlgorithm(false); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.lz4_message.ToString())); + } + +#if !NETFRAMEWORK + using (var session = MySQLX.GetSession(ConnectionStringUri + "?compression-algorithms=deflate_stream")) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.deflate_stream.ToString())); + compressionAlgorithm = session.XSession.GetCompressionAlgorithm(false); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.deflate_stream.ToString())); + } +#endif + } + + [Test] + public void NegotiationWithSpecificCompressionAlgorithm() + { + var updatedConnectionStringUri = ConnectionStringUri + "?compression=Required"; + + if (Platform.IsWindows()) + { + // Test with one of the supported compression algorithms. + ExecuteSqlAsRoot($"SET GLOBAL mysqlx_compression_algorithms = \"{CompressionAlgorithms.zstd_stream.ToString().ToUpperInvariant()}\""); + using (var session = MySQLX.GetSession(updatedConnectionStringUri)) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.zstd_stream.ToString())); + } + } + + ExecuteSqlAsRoot($"SET GLOBAL mysqlx_compression_algorithms = \"{CompressionAlgorithms.lz4_message.ToString().ToUpperInvariant()}\""); + using (var session = MySQLX.GetSession(updatedConnectionStringUri)) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.lz4_message.ToString())); + } + + ExecuteSqlAsRoot($"SET GLOBAL mysqlx_compression_algorithms ={DEFLATE_STREAM}"); +#if NETFRAMEWORK + var exception = Assert.Throws(() => MySQLX.GetSession(updatedConnectionStringUri)); + Assert.That(exception.Message, Is.EqualTo("Compression requested but the compression algorithm negotiation failed.")); +#else + using (var session = MySQLX.GetSession(updatedConnectionStringUri)) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.deflate_stream.ToString())); + } +#endif + + // Test with a sublist of supported compression algorithms. + ExecuteSqlAsRoot($"SET GLOBAL mysqlx_compression_algorithms = \"{CompressionAlgorithms.lz4_message.ToString().ToUpperInvariant()},{CompressionAlgorithms.zstd_stream.ToString().ToUpperInvariant()}\""); + using (var session = MySQLX.GetSession(updatedConnectionStringUri)) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(Enum.TryParse(compressionAlgorithm, out var algorithm)); + Assert.That(algorithm == CompressionAlgorithms.lz4_message || algorithm == CompressionAlgorithms.zstd_stream); + } + } + + [Test] + public void ValidateZstdAllocation() + { + using (var session = MySQLX.GetSession(ConnectionStringUri)) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + if (!(CompressionAlgorithms.zstd_stream.ToString() == compressionAlgorithm)) + { + return; + } + } + + // Ensure resources are being released on each session. + // If a memory allocation error is raised then a resource has not been released. + for (int i = 0; i < 4000; i++) + { + var session = MySQLX.GetSession(ConnectionStringUri); + session.Close(); + } + } + + [Test] + // WL-14001 XProtocol -- support for configurable compression algorithms + public void ConfigurableCompressionAlgorithms() + { + // FR1_1 Create session with option compression-algorithms for URI, connectionstring, anonymous object, MySqlXConnectionStringBuilder. + using (var session = MySQLX.GetSession(ConnectionStringUri + "?compression-algorithms=lz4_message;")) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.lz4_message.ToString())); + } + + using (var session = MySQLX.GetSession(ConnectionString + ";compression-algorithms=lz4_message;")) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.lz4_message.ToString())); + } + +#if NETFRAMEWORK + // No exception expected due to compression=preferred, no compression expected + using (var session = MySQLX.GetSession(new { server = Host, port = XPort, uid = "test", password = "test", compressionalgorithms = "deflate_stream" })) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.Null); + } +#else + using (var session = MySQLX.GetSession(new { server = Host, port = XPort, uid = "test", password = "test", compressionalgorithms = "deflate_stream" })) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.deflate_stream.ToString()).IgnoreCase); + } +#endif + + var sb = new MySqlXConnectionStringBuilder($"server={Host};port={XPort};uid=test;password=test;compression-algorithms=lz4_message"); + using (var session = MySQLX.GetSession(sb.GetConnectionString(true))) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.lz4_message.ToString())); + } + + // FR1_2 Create session with option compression-algorithms and set the option with no value either by not including the property in the connection string + // or by setting it with an empty value. + using (var session = MySQLX.GetSession($"server={Host};port={XPort};uid=test;password=test;")) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(Enum.TryParse(compressionAlgorithm, out var result)); + } + + using (var session = MySQLX.GetSession(ConnectionString + ";compression-algorithms=")) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(Enum.TryParse(compressionAlgorithm, out var result)); + } + + // FR2_1,FR2_2 Create session with option compression-algorithms and set the value with multiple compression algorithms for + // URI,connectionstring,anonymous object,MySqlXConnectionStringBuilder.check that the negotiation happens in the order provided in the connection string + using (var session = MySQLX.GetSession(ConnectionStringUri + "?compression-algorithms=lz4_message,zstd_stream,deflate_stream;")) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.lz4_message.ToString())); + } + + using (var session = MySQLX.GetSession(ConnectionString + ";compression-algorithms=lz4_message,zstd_stream,deflate_stream;")) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.lz4_message.ToString())); + } + +#if NETFRAMEWORK + // No exception expected due to compression=preferred, lz4_message compression expected + using (var session = MySQLX.GetSession(new { server = Host, port = XPort, uid = "test", password = "test", compressionalgorithms = "deflate_stream,lz4_message,zstd_stream" })) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.lz4_message.ToString())); + } +#else + using (var session = MySQLX.GetSession(new { server = Host, port = XPort, uid = "test", password = "test", compressionalgorithms = "deflate_stream,lz4_message,zstd_stream" })) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.deflate_stream.ToString()).IgnoreCase); + } +#endif + + sb = new MySqlXConnectionStringBuilder(ConnectionString + ";compression-algorithms=lz4_message,zstd_stream,deflate_stream"); + using (var session = MySQLX.GetSession(sb.GetConnectionString(true))) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.lz4_message.ToString())); + } + + // FR3 Create session with option compression-algorithms and set the option with Algorithm aliases lz4, zstd, and deflate. + using (var session = MySQLX.GetSession(ConnectionString + ";compression-algorithms=lz4,zstd,deflate;")) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.lz4_message.ToString())); + } + + using (var session = MySQLX.GetSession(ConnectionStringUri + "?compression-algorithms=lz4,deflate_stream")) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.lz4_message.ToString())); + } + + // FR4_1 Create session with option compression-algorithms.Set the option with unsupported and supported algorithms by client. + using (var session = MySQLX.GetSession(ConnectionString + ";compression=required;compression-algorithms=NotSupported,lz4,SomethingElse;")) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.lz4_message.ToString())); + } + + using (var session = MySQLX.GetSession(ConnectionStringUri + "?compression-algorithms=lz4,NotSupported")) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.lz4_message.ToString())); + } + + sb = new MySqlXConnectionStringBuilder($"server={Host};port={XPort};uid=test;password=test;compression-algorithms=[NotValid,INVALID,NOTSUPPORTED,lz4]"); + using (var session = MySQLX.GetSession(sb.GetConnectionString(true))) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.lz4_message.ToString())); + } + + // FR4_2 Create session and set invalid values to the compression-algorithm option to check if the connection is uncompressed when + // compression option is either not set or set to preferred or disabled. + using (var session = MySQLX.GetSession(ConnectionString + ";compression-algorithms=NotSupported,SomethingElse;")) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.Null); + } + + using (var session = MySQLX.GetSession(ConnectionString + ";compression=disabled;compression-algorithms=lz4,NotSupported,SomethingElse;")) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.Null); + } + + using (var session = MySQLX.GetSession(ConnectionString + ";compression=preferred;compression-algorithms=[NotSupported,SomethingElse];")) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.Null); + } + + // FR4_3 Create session and set invalid values to the compression-algorithm option. + // The connection should terminate with an error when compression option is set to required. + + Exception ex = Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";compression=required;compression-algorithms=NotSupported,SomethingElse;")); + Assert.That(ex.Message, Is.EqualTo("Compression requested but the compression algorithm negotiation failed")); + + // FR4_4 Start server with specific compression algorithm and create session with option + // compression-algorithms.Set the option with multiple compression algorithms. + ExecuteSqlAsRoot($"SET GLOBAL mysqlx_compression_algorithms = \"{CompressionAlgorithms.lz4_message.ToString().ToUpperInvariant()}\""); + using (var session = MySQLX.GetSession(ConnectionString + ";compression=preferred;compression-algorithms=[lz4_message,deflate,zstd];")) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.lz4_message.ToString())); + } + + // FR4_5 Start the server with a specific compression algorithm and use some other in the client and when compression option is either + // not set or set to preferred or disabled.Verify that the connection is uncompressed. + ExecuteSqlAsRoot($"SET GLOBAL mysqlx_compression_algorithms = \"{CompressionAlgorithms.zstd_stream.ToString().ToUpperInvariant()}\""); + using (var session = MySQLX.GetSession(ConnectionString + ";compression-algorithms=[lz4_message]")) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.Null); + } + + using (var session = MySQLX.GetSession(ConnectionString + ";compression=preferred;compression-algorithms=[lz4_message]")) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.Null); + } + + using (var session = MySQLX.GetSession(ConnectionString + ";compression=disabled;compression-algorithms=[lz4_message]")) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.Null); + } + + //FR4_6,FR_5 Start the server with a specific compression algorithm and use some other in the client and when compression option is set to required.Verify the behaviour + ExecuteSqlAsRoot(@"SET GLOBAL mysqlx_compression_algorithms = ""LZ4_MESSAGE"" "); + using (var session = MySQLX.GetSession(ConnectionString + ";compression=required;")) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.lz4_message.ToString())); + var ele = new List(); + for (int i = 0; i < 1000; i++) + { + ele.Add(new { id = $"{i}", title = $"Book {i}" }); + } + //Verify compression is being done + Collection coll = CreateCollection("testcompress1"); + var result = ExecuteAddStatement(coll.Add(ele.ToArray())); + var result1 = session.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_sent_uncompressed_frame' ").Execute().FetchOne()[1]; + var result2 = session.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_received_uncompressed_frame' ").Execute().FetchOne()[1]; + Assert.That(int.Parse(result1.ToString()), Is.GreaterThan(int.Parse(result2.ToString()))); + var result3 = session.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_sent_compressed_payload' ").Execute().FetchOne()[1]; + var result4 = session.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_received_compressed_payload' ").Execute().FetchOne()[1]; + Assert.That(int.Parse(result3.ToString()), Is.GreaterThan(int.Parse(result4.ToString()))); + } + + using (var session = MySQLX.GetSession(ConnectionString + ";compression=required;compression-algorithms=[lz4_message]")) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.lz4_message.ToString())); + } + + // Server algorithm not contain user defined algorithm, with compression preferred + using (var session = MySQLX.GetSession(ConnectionStringUri + "?compression-algorithms=[zstd];")) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.Null); + + var ele = new List(); + for (int i = 0; i < 1000; i++) + { + ele.Add(new { id = $"{i}", title = $"Book {i}" }); + } + //Verify there is no compression + Collection coll = CreateCollection("testcompress2"); + var result = ExecuteAddStatement(coll.Add(ele.ToArray())); + var result1 = session.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_sent_uncompressed_frame' ").Execute().FetchOne()[1]; + var result2 = session.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_received_uncompressed_frame' ").Execute().FetchOne()[1]; + Assert.That(result2, Is.EqualTo(result1)); + var result3 = session.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_sent_compressed_payload' ").Execute().FetchOne()[1]; + var result4 = session.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_received_compressed_payload' ").Execute().FetchOne()[1]; + Assert.That(result4, Is.EqualTo(result3)); + } + + Exception ex_args = Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";compression=required;compression_algorithms=[lz4_message]")); + Assert.That(ex_args.Message, Does.Contain("Option not supported")); + } + + [Test] + public void CompressionAlgorithms_Bugs() + { + bool success = true; + try + { + // Bug #31544072 +#if NETFRAMEWORK + // Different algorithms available in server hence default compression expected + using (var session = MySQLX.GetSession(ConnectionString + ";compression=required;compression-algorithms=[];")) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.Not.Null); + } + // With only deflate available,Exeption expected + ExecuteSqlAsRoot(@"SET GLOBAL mysqlx_compression_algorithms = ""DEFLATE_STREAM"" "); + Exception ex_bug1 = Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";compression=required;compression-algorithms=[];")); + Assert.That(ex_bug1.Message, Does.Contain("Compression requested but the compression algorithm negotiation failed")); +#else + using (var session = MySQLX.GetSession(ConnectionString + ";compression=required;compression-algorithms=[];")) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.Not.Null); + } + // With only deflate available,compression is expected + ExecuteSqlAsRoot(@"SET GLOBAL mysqlx_compression_algorithms = ""DEFLATE_STREAM"" "); + using (var session = MySQLX.GetSession(ConnectionString + ";compression=required;compression-algorithms=[];")) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.deflate_stream.ToString())); + } +#endif + + // Bug #31541819 + ExecuteSqlAsRoot(@"SET GLOBAL mysqlx_compression_algorithms = ""DEFLATE_STREAM"" "); +#if NETFRAMEWORK + // Exeption expected due to compression=required + Exception ex_bug2 = Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";compression=required;compression-algorithms=deflate_stream;")); + Assert.That(ex_bug2.Message, Does.Contain("is not supported in .NET Framework")); +#else + using (var session = MySQLX.GetSession(ConnectionString + ";compression=required;compression-algorithms=deflate_stream;")) + { + var compressionAlgorithm = session.XSession.GetCompressionAlgorithm(true); + Assert.That(compressionAlgorithm, Is.EqualTo(CompressionAlgorithms.deflate_stream.ToString())); + } +#endif + } + catch (Exception ex) + { + TestContext.WriteLine("Exception: " + ex.Message); + } + finally + { + // This line ensures that the list of supported compression algorithms is set to its default value. + ExecuteSqlAsRoot(@"SET GLOBAL mysqlx_compression_algorithms = ""ZSTD_STREAM,LZ4_MESSAGE,DEFLATE_STREAM"" "); + Assert.That(success); + } + } + + #region WL14389 + + public static Session session1 = null; + public static Session session2 = null; + public static Session session3 = null; + public static Session session4 = null; + public CompressionType[] compressValue = { CompressionType.Required, CompressionType.Preferred, CompressionType.Disabled }; + public MySqlSslMode[] modes = { MySqlSslMode.Required, MySqlSslMode.VerifyCA, MySqlSslMode.VerifyFull, MySqlSslMode.Preferred }; + public static object connObject = new { server = Host, port = XPort, user = "test", password = "test" }; + + [Test, Description("Connection Compression tests to verify the values of compress option with connection string, uri, anonymous object, string builder")] + public void ConnectionStringCombinations() + { + Assume.That(session.Version.isAtLeast(8, 0, 19), "This test is for MySql 8.0.19 or higher"); + + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + sb.SslCa = sslCa; + sb.SslCert = sslCert; + sb.SslKey = sslKey; + for (int j = 0; j < 3; j++) + { + for (int i = 0; i < 3; i++) + { + //ConnectionString + session1 = MySQLX.GetSession(ConnectionStringUserWithSSLPEM + " ;Auth=AUTO;sslmode=" + modes[j] + ";compression=" + compressValue[i]); + Assert.That(session1.XSession.SessionState, Is.EqualTo(SessionState.Open)); + session1.Close(); + + //Uri + session2 = MySQLX.GetSession(connSSLURI + "&sslmode=" + modes[j] + "&compression=" + compressValue[i]); + Assert.That(session2.XSession.SessionState, Is.EqualTo(SessionState.Open)); + session2.Close(); + + //Anonymous Object + session3 = MySQLX.GetSession(new { server = sb.Server, user = sb.UserID, port = sb.Port, password = sb.Password, SslCa = sslCa, SslCert = sslCert, SslKey = sslKey, Auth = MySqlAuthenticationMode.AUTO, sslmode = modes[j], compression = compressValue[i] }); + Assert.That(session3.XSession.SessionState, Is.EqualTo(SessionState.Open)); + session3.Close(); + + //MySqlXConnectionStringBuilder + sb.SslMode = modes[j]; + sb.Auth = MySqlAuthenticationMode.AUTO; + sb.Compression = compressValue[i]; + session4 = MySQLX.GetSession(sb.ConnectionString); + Assert.That(session4.XSession.SessionState, Is.EqualTo(SessionState.Open)); + session4.Close(); + } + } + + sb = new MySqlXConnectionStringBuilder(ConnectionString); + for (int i = 0; i < 3; i++) + { + session1 = MySQLX.GetSession(ConnectionString + ";auth=AUTO;compression=" + compressValue[i]); + Assert.That(session1.XSession.SessionState, Is.EqualTo(SessionState.Open)); + session1.Close(); + + session2 = MySQLX.GetSession(ConnectionStringUri + "?compression=" + compressValue[i]); + Assert.That(session2.XSession.SessionState, Is.EqualTo(SessionState.Open)); + session2.Close(); + + session3 = MySQLX.GetSession(new { server = sb.Server, user = sb.UserID, port = sb.Port, password = sb.Password, compression = compressValue[i] }); + Assert.That(session3.XSession.SessionState, Is.EqualTo(SessionState.Open)); + session3.Close(); + + sb.Compression = compressValue[i]; + session4 = MySQLX.GetSession(sb.ConnectionString); + Assert.That(session4.XSession.SessionState, Is.EqualTo(SessionState.Open)); + session4.Close(); + } + } + + + [Test, Description("Verifying the connection pooling with compression option")] + public void CompressionWithPolling() + { + Assume.That(session.Version.isAtLeast(8, 0, 19), "This test is for MySql 8.0.19 or higher"); + for (int i = 0; i < 3; i++) + { + client = MySQLX.GetClient(ConnectionString + ";compression=" + compressValue[i], new { pooling = new { maxSize = 2, queueTimeout = 2000 } }); + + session1 = client.GetSession(); + Assert.That(session1.XSession.SessionState, Is.EqualTo(SessionState.Open)); + session1.Close(); + + session2 = client.GetSession(); + Assert.That(session2.XSession.SessionState, Is.EqualTo(SessionState.Open)); + session2.Close(); + + session1 = client.GetSession(); + Assert.That(session1.XSession.SessionState, Is.EqualTo(SessionState.Open)); + session2 = client.GetSession(); + Assert.That(session2.XSession.SessionState, Is.EqualTo(SessionState.Open)); + + Assert.Throws(() => client.GetSession()); + session1.Close(); + session2.Close(); + } + } + + [Test, Description("Verify if data sent is compressed")] + public void VerifyDataSentCompression() + { + Assume.That(session.Version.isAtLeast(8, 0, 19), "This test is for MySql 8.0.19 or higher"); + int BYTESIZE = 20000; + string[] compressValue1 = new string[] { "preferred", "required", "required" }; + string[] compressValue2 = new string[] { "disabled", "disabled", "preferred" }; + for (int i = 0; i < 3; i++) + { + session1 = MySQLX.GetSession(ConnectionString + ";compression=" + compressValue1[i]); + session1.SQL("DROP database if exists compression").Execute(); + session1.SQL("create database compression").Execute(); + session1.SQL("use compression").Execute(); + Schema schema = session1.GetSchema("compression"); + var collection = schema.CreateCollection("compressed"); + + string text = GenerateDummyText("Wiki Loves Monuments ", BYTESIZE); + var doc = new[] { new { _id = 1, summary = text } }; + collection.Add(doc).Execute(); + schema.GetCollection("compressed"); + + session2 = MySQLX.GetSession(ConnectionString + ";compression=" + compressValue2[i]); + session2.SQL("use compression").Execute(); + schema = session2.GetSchema("compression"); + + schema.GetCollection("compressed"); + var reader = session2.SQL("Select count(*) from compressed").Execute().FetchOne()[0]; + var reader2 = session2.SQL("Select * from compressed").Execute().FetchAll(); + Assert.That(reader.ToString(), Is.EqualTo("1")); + + // Results of compression when its value for session1 is: compressValue1[i] and for session2 is: compressValue2[i] + var result1 = session1.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_sent_uncompressed_frame' ").Execute().FetchOne()[1]; + Assert.That(result1, Is.Not.Null); + var result2 = session1.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_received_uncompressed_frame' ").Execute().FetchOne()[1]; + Assert.That(result2, Is.Not.Null); + var result3 = session1.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_sent_compressed_payload' ").Execute().FetchOne()[1]; + Assert.That(result3, Is.Not.Null); + var result4 = session1.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_received_compressed_payload' ").Execute().FetchOne()[1]; + Assert.That(result4, Is.Not.Null); + if (Convert.ToInt32(result4) == 0 || Convert.ToInt32(result2) == 0) + { + Assert.Fail("Compression failed"); + } + + // Results of compression when its value for session2 is: compressValue1[i] and for session2 is: compressValue2[i] + var result21 = session2.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_sent_uncompressed_frame' ").Execute().FetchOne()[1]; + Assert.That(result21, Is.Not.Null); + var result22 = session2.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_received_uncompressed_frame' ").Execute().FetchOne()[1]; + Assert.That(result22, Is.Not.Null); + var result23 = session2.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_sent_compressed_payload' ").Execute().FetchOne()[1]; + Assert.That(result23, Is.Not.Null); + var result24 = session2.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_received_compressed_payload' ").Execute().FetchOne()[1]; + Assert.That(result24, Is.Not.Null); + session1.Close(); + session2.Close(); + } + } + + [Test, Description("Verify if data read is compressed")] + public void VerifyDataReadCompression() + { + Assume.That(session.Version.isAtLeast(8, 0, 19), "This test is for MySql 8.0.19 or higher"); + const int BYTESIZE = 20000; + string[] compressValue1 = new string[] { "preferred", "required" }; + for (int i = 0; i < 2; i++) + { + session1 = MySQLX.GetSession(ConnectionString + ";compression=disabled"); + session1.SQL("DROP database if exists compression").Execute(); + session1.SQL("create database compression").Execute(); + session1.SQL("use compression").Execute(); + Schema schema = session1.GetSchema("compression"); + var collection = schema.CreateCollection("compressed"); + string text = GenerateDummyText("Wiki Loves Monuments ", BYTESIZE); + var doc = new[] { new { _id = 1, summary = text } }; + collection.Add(doc).Execute(); + schema.GetCollection("compressed"); + + session2 = MySQLX.GetSession(ConnectionString + ";compression=" + compressValue1[i]); + session2.SQL("use compression").Execute(); + schema = session2.GetSchema("compression"); + + schema.GetCollection("compressed"); + var reader = session2.SQL("Select count(*) from compressed").Execute().FetchOne()[0]; + var reader2 = session2.SQL("Select * from compressed").Execute().FetchAll(); + Assert.That(reader.ToString(), Is.EqualTo("1")); + + var result1 = session1.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_sent_uncompressed_frame' ").Execute().FetchOne()[1]; + Assert.That(result1, Is.Not.Null); + var result2 = session1.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_received_uncompressed_frame' ").Execute().FetchOne()[1]; + Assert.That(result2, Is.Not.Null); + var result3 = session1.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_sent_compressed_payload' ").Execute().FetchOne()[1]; + Assert.That(result3, Is.Not.Null); + var result4 = session1.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_received_compressed_payload' ").Execute().FetchOne()[1]; + Assert.That(result4, Is.Not.Null); + + var result21 = session2.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_sent_uncompressed_frame' ").Execute().FetchOne()[1]; + Assert.That(result21, Is.Not.Null); + var result22 = session2.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_received_uncompressed_frame' ").Execute().FetchOne()[1]; + Assert.That(result22, Is.Not.Null); + var result23 = session2.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_sent_compressed_payload' ").Execute().FetchOne()[1]; + Assert.That(result23, Is.Not.Null); + var result24 = session2.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_received_compressed_payload' ").Execute().FetchOne()[1]; + Assert.That(result24, Is.Not.Null); + session1.Close(); + session2.Close(); + } + } + + + [Test, Description("Verifying the threshold for compression")] + public void CompressionThreshold() + { + Assume.That(session.Version.isAtLeast(8, 0, 19), "This test is for MySql 8.0.19 or higher"); + using (session1 = MySQLX.GetSession(ConnectionString + ";compression=required")) + { + session1.SQL("DROP database if exists compression").Execute(); + session1.SQL("create database compression").Execute(); + session1.SQL("use compression").Execute(); + Schema schema = session1.GetSchema("compression"); + var collection = schema.CreateCollection("compressed"); + string text1 = GenerateDummyText("Wiki Loves Monuments ", 47).Substring(0, 917); + var doc1 = new[] { new { _id = 1, summary = text1 } }; + + collection.Add(doc1).Execute(); + var result1 = session1.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_sent_uncompressed_frame' ").Execute().FetchOne()[1]; + Assert.That(result1, Is.Not.Null); + var result2 = session1.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_received_uncompressed_frame' ").Execute().FetchOne()[1]; + Assert.That(result2, Is.Not.Null); + var result3 = session1.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_sent_compressed_payload' ").Execute().FetchOne()[1]; + Assert.That(result3, Is.Not.Null); + var result4 = session1.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_received_compressed_payload' ").Execute().FetchOne()[1]; + Assert.That(result4, Is.Not.Null); + + if (!Platform.IsWindows()) + if (Convert.ToInt32(result2) != 0 || Convert.ToInt32(result4) != 0) + Assert.Fail("Compression failed"); + + var collection2 = schema.CreateCollection("compressed2"); + string text2 = GenerateDummyText("Wiki Loves Monuments ", 48).Substring(0, 1000); + var doc2 = new[] { new { _id = 1, summary = text2 } }; + + collection2.Add(doc2).Execute(); + var result1b = session1.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_sent_uncompressed_frame' ").Execute().FetchOne()[1]; + Assert.That(result1b, Is.Not.Null); + var result2b = session1.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_received_uncompressed_frame' ").Execute().FetchOne()[1]; + Assert.That(result2b, Is.Not.Null); + var result3b = session1.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_sent_compressed_payload' ").Execute().FetchOne()[1]; + Assert.That(result3b, Is.Not.Null); + var result4b = session1.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_received_compressed_payload' ").Execute().FetchOne()[1]; + Assert.That(result4b, Is.Not.Null); + + if (Convert.ToInt32(result4b) == 0 || Convert.ToInt32(result2b) == 0) + Assert.Fail("Compression failed"); + + var collection3 = schema.CreateCollection("compressed3"); + string text3 = GenerateDummyText("Wiki Loves Monuments ", 48).Substring(0, 1002); + var doc3 = new[] { new { _id = 1, summary = text3 } }; + + collection3.Add(doc3).Execute(); + var result1c = session1.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_sent_uncompressed_frame' ").Execute().FetchOne()[1]; + Assert.That(result1c, Is.Not.Null); + var result2c = session1.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_received_uncompressed_frame' ").Execute().FetchOne()[1]; + Assert.That(result2c, Is.Not.Null); + var result3c = session1.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_sent_compressed_payload' ").Execute().FetchOne()[1]; + Assert.That(result3c, Is.Not.Null); + var result4c = session1.SQL("select * from performance_schema.session_status where variable_name='Mysqlx_bytes_received_compressed_payload' ").Execute().FetchOne()[1]; + Assert.That(result4c, Is.Not.Null); + + if (Convert.ToInt32(result4c) == 0 || Convert.ToInt32(result2c) == 0) + Assert.Fail("Compression failed"); + } + } + + [Test, Description("Checking the network latency")] + public void NetworkLatency() + { + Assume.That(session.Version.isAtLeast(8, 0, 19), "This test is for MySql 8.0.19 or higher"); + const int BYTESIZE = 20000; + Stopwatch watch1 = new Stopwatch(); + Stopwatch watch2 = new Stopwatch(); + Collection collection; + string dummyText = GenerateDummyText("Wiki Loves Monuments ", BYTESIZE); + var doc = new[] { new { _id = 1, summary = dummyText } }; + + using (session1 = MySQLX.GetSession(ConnectionString + ";compression=required")) + { + session1.SQL("DROP DATABASE IF EXISTS compression").Execute(); + session1.SQL("CREATE DATABASE compression").Execute(); + session1.SQL("USE compression").Execute(); + Schema schema = session1.GetSchema("compression"); + collection = schema.CreateCollection("compressed"); + watch1.Start(); + collection.Add(doc).Execute(); + schema.GetCollection("compressed"); + watch1.Stop(); + } + + using (session2 = MySQLX.GetSession(ConnectionString + ";compression=disabled")) + { + session2.SQL("DROP DATABASE IF EXISTS compression").Execute(); + session2.SQL("CREATE DATABASE compression").Execute(); + Schema schema = session2.GetSchema("compression"); + collection = schema.CreateCollection("compressed2"); + watch2.Start(); + collection.Add(doc).Execute(); + schema.GetCollection("compressed2"); + watch2.Stop(); + } + + Assert.That(watch1.ElapsedTicks != watch2.ElapsedTicks, + $"Watch1: {watch1.ElapsedMilliseconds}, Watch2: {watch2.ElapsedMilliseconds}"); + } + #endregion + + #region Methods + /// + /// Repeat the string an specific number of times + /// + /// + /// + /// + protected string GenerateDummyText(string textToRepeat, int timesToRepeat) + { + if (string.IsNullOrEmpty(textToRepeat) || timesToRepeat <= 0) return string.Empty; + + return new StringBuilder(textToRepeat.Length * timesToRepeat).Insert(0, textToRepeat, timesToRepeat).ToString(); + } + #endregion Methods + + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/CrudInsertTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/CrudInsertTests.cs new file mode 100644 index 000000000..80e1d31ef --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/CrudInsertTests.cs @@ -0,0 +1,2507 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySql.Data.Common; +using MySql.Data.MySqlClient; +using MySqlX.Common; +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Common; +using MySqlX.XDevAPI.CRUD; +using MySqlX.XDevAPI.Relational; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MySqlX.Data.Tests +{ + public class CrudInsertTests : BaseTest + { + [Test] + public void InsertSingleDbDocWithId() + { + Collection coll = CreateCollection("test"); + Result r = ExecuteAddStatement(coll.Add(@"{ ""_id"": 1, ""foo"": 1 }")); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + Assert.That(coll.Count(), Is.EqualTo(1)); + } + + [Test] + public void InsertSingleDbDocWithoutId() + { + Collection coll = CreateCollection("test"); + var stmt = coll.Add("{ \"foo\": 1 }"); + if (!session.Version.isAtLeast(8, 0, 5)) + { + // Code 5115 Document is missing a required field + Assert.That(Assert.Throws(() => ExecuteAddStatement(stmt)).Code, Is.EqualTo(5115u)); + return; + } + Result r = ExecuteAddStatement(stmt); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + Assert.That(coll.Count(), Is.EqualTo(1)); + Assert.That(r.GeneratedIds, Has.One.Items); + Assert.That(string.IsNullOrWhiteSpace(r.GeneratedIds[0]), Is.False); + } + + [Test] + public void InsertMultipleDbDocWithoutId() + { + Collection coll = CreateCollection("test"); + var stmt = coll.Add("{ \"foo\": 1 }") + .Add("{ \"amber\": 2 }") + .Add("{ \"any\": 3 }"); + if (!session.Version.isAtLeast(8, 0, 5)) + { + // Code 5115 Document is missing a required field + Assert.That(Assert.Throws(() => ExecuteAddStatement(stmt)).Code, Is.EqualTo(5115u)); + return; + } + Result r = ExecuteAddStatement(stmt); + Assert.That(r.AffectedItemsCount, Is.EqualTo(3)); + Assert.That(coll.Count(), Is.EqualTo(3)); + Assert.That(r.GeneratedIds.Count, Is.EqualTo(3)); + } + + [Test] + public void InsertAnonymousObjectWithId() + { + var obj = new { _id = "5", name = "Sakila", age = 15 }; + + Collection coll = CreateCollection("test"); + Result r = ExecuteAddStatement(coll.Add(obj)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + //TODO: pull object and verify data + Assert.That(coll.Count(), Is.EqualTo(1)); + } + + [Test] + public void InsertAnonymousObjectWithNoId() + { + var obj = new { name = "Sakila", age = 15 }; + + Collection coll = CreateCollection("test"); + var stmt = coll.Add(obj); + if (!session.Version.isAtLeast(8, 0, 5)) + { + // Code 5115 Document is missing a required field + Assert.That(Assert.Throws(() => ExecuteAddStatement(stmt)).Code, Is.EqualTo(5115u)); + return; + } + Result r = ExecuteAddStatement(stmt); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + //TODO: pull object and verify data + Assert.That(coll.Count(), Is.EqualTo(1)); + Assert.That(r.GeneratedIds, Has.One.Items); + Assert.That(string.IsNullOrWhiteSpace(r.GeneratedIds[0]), Is.False); + } + + [Test] + public void InsertMultipleAnonymousObjectsWithId() + { + Collection coll = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + Result r = ExecuteAddStatement(coll.Add(docs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4)); + Assert.That(coll.Count(), Is.EqualTo(4)); + } + + [Test] + public void ValidatesDocumentIds() + { + Collection coll = CreateCollection("test"); + var stmt = coll.Add(new { name = "Book 1" }); + if (!session.Version.isAtLeast(8, 0, 5)) + { + // Code 5115 Document is missing a required field + Assert.That(Assert.Throws(() => ExecuteAddStatement(stmt)).Code, Is.EqualTo(5115u)); + return; + } + Result result = ExecuteAddStatement(stmt); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + + result = ExecuteModifyStatement(coll.Modify($"_id = '{result.GeneratedIds[0]}'").Set("pages", "20")); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + Assert.That(result.GeneratedIds, Is.Empty); + } + + [Test] + public void ReuseStatement() + { + Collection coll = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + var stmt = coll.Add(new { _id = 0 }); + foreach (var doc in docs) + { + stmt.Add(doc); + } + Result r = ExecuteAddStatement(stmt); + Assert.That(r.AffectedItemsCount, Is.EqualTo((ulong)docs.Length + 1)); + Assert.That(coll.Count(), Is.EqualTo(5)); + } + + [Test] + public void EmptyDocArray() + { + Collection coll = CreateCollection("test"); + + var insertResult = ExecuteAddStatement(coll.Add(new DbDoc[] { })); + Assert.That(insertResult.AffectedItemsCount, Is.EqualTo(0ul)); + + var result = ExecuteFindStatement(coll.Find()).FetchAll(); + Assert.That(result, Is.Empty); + } + + [Test] + public void NullParameter() + { + Collection coll = CreateCollection("test"); + + Assert.Throws(() => ExecuteAddStatement(coll.Add(null))); + } + + [Test] + public void InsertingArray() + { + var docs = new[] + { + new { id = 1, title = "Book 1" }, + new { id = 2, title = "Book 2" }, + }; + DbDoc d2 = new DbDoc(); + d2.SetValue("_id", 1); + d2.SetValue("books", docs); + d2.SetValue("pages", 20); + + Collection coll = CreateCollection("test"); + ExecuteAddStatement(coll.Add(d2)); + var result = ExecuteFindStatement(coll.Find()).FetchAll(); + Assert.That(result, Has.One.Items); + Assert.That(result[0].ToString(), Is.EqualTo(d2.ToString())); + } + + [Test] + public void CompareGuids() + { + Guid guid1 = new Guid(); + Guid guid2 = new Guid(); + Assert.That(Tools.CompareGuids(guid1, guid2), Is.EqualTo(0)); + Assert.That(Tools.CompareGuids(guid1.ToString(), guid2.ToString()), Is.EqualTo(0)); + + guid1 = Guid.NewGuid(); + guid2 = Guid.NewGuid(); + Assert.That(Tools.CompareGuids(guid1, guid2) != 0); + Assert.That(Tools.CompareGuids(guid1.ToString(), guid2.ToString()) != 0); + } + + [Test] + public void InsertNullValuesAsDbDoc() + { + Collection collection = CreateCollection("test"); + + var nullValues = new String[] { null, "null", "NULL" }; + var docs = new DbDoc[3]; + for (int i = 0; i < docs.Length; i++) + { + docs[i] = new DbDoc(); + docs[i].SetValue("a", nullValues[i]); + docs[i].SetValue("_id", (i + 1)); + } + + ExecuteAddStatement(collection.Add(docs)); + var result = ExecuteFindStatement(collection.Find()).FetchAll(); + Assert.That(result.Count, Is.EqualTo(docs.Length)); + + for (int i = 0; i < docs.Length; i++) + Assert.That(result[i].ToString(), Is.EqualTo(docs[i].ToString())); + } + + [Test] + public void InsertNullValuesAsJson() + { + var docs = new[] + { + @"{ ""_id"": 1, ""foo"": null}", + @"{ ""_id"": 2, ""foo"": null }", + @"{ ""_id"": 3, ""foo"": ""null"" }", + @"{ ""_id"": 4, ""foo"": ""NULL"" }", + }; + + Collection collection = CreateCollection("test"); + ExecuteAddStatement(collection.Add(docs)); + var result = ExecuteFindStatement(collection.Find()).FetchAll(); + Assert.That(result.Count, Is.EqualTo(docs.Length)); + for (int i = 0; i < docs.Length; i++) + { + var currentDoc = new DbDoc(docs[i]); + var resultingDoc = new DbDoc(result[i]); + Assert.That(resultingDoc.Id, Is.EqualTo(currentDoc.Id)); + Assert.That(resultingDoc["foo"], Is.EqualTo(currentDoc["foo"])); + } + } + + [Test] + public void AddOrReplaceOne() + { + if (!session.Version.isAtLeast(8, 0, 3)) return; + + Collection collection = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + Result result = ExecuteAddStatement(collection.Add(docs)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(4)); + + // Add a document. + Assert.That(collection.AddOrReplaceOne(5, new { _id = 5, title = "Book 5", pages = 60 }).AffectedItemsCount, Is.EqualTo(1)); + Assert.That(collection.GetOne(5) != null); + + Assert.That(collection.AddOrReplaceOne("6", new { title = "Book 6", pages = 70 }).AffectedItemsCount, Is.EqualTo(1)); + Assert.That(collection.GetOne(6) != null); + Assert.That(collection.GetOne("6") != null); + + // Replace a document. + Assert.That(collection.AddOrReplaceOne(1, new { _id = 1, title = "Book X", pages = 10 }).AffectedItemsCount, Is.EqualTo(2)); + DbDoc document = collection.GetOne(1); + Assert.That(Convert.ToInt32(document.Id), Is.EqualTo(1)); + Assert.That(document["title"], Is.EqualTo("Book X")); + Assert.That(Convert.ToInt32(document["pages"]), Is.EqualTo(10)); + + Assert.That(collection.AddOrReplaceOne(1, new { title = "Book Y", pages = 9, other = "value" }).AffectedItemsCount, Is.EqualTo(2)); + document = collection.GetOne(1); + Assert.That(Convert.ToInt32(document.Id), Is.EqualTo(1)); + Assert.That(document["title"], Is.EqualTo("Book Y")); + Assert.That(Convert.ToInt32(document["pages"]), Is.EqualTo(9)); + Assert.That(document["other"], Is.EqualTo("value")); + + // Expected exceptions. + Assert.Throws(() => collection.AddOrReplaceOne(null, docs[1])); + Assert.Throws(() => collection.AddOrReplaceOne("", docs[1])); + Assert.Throws(() => collection.AddOrReplaceOne(" ", docs[1])); + Assert.Throws(() => collection.AddOrReplaceOne(string.Empty, docs[1])); + Assert.Throws(() => collection.AddOrReplaceOne("1", null)); + Assert.Throws(() => collection.AddOrReplaceOne(4, new DbDoc("{ \"_id\": 2, \"title\": \"Book\", \"pages\": 60 }")), + ResourcesX.ReplaceWithNoMatchingId); + } + + #region WL14389 + + [Test, Description("Test MySQLX plugin Collection Scenarios - with Create a valid collection and reuse existing object")] + public void CreateCollectionAndReuseObject() + { + using (Session sessionPlain = MySQLX.GetSession(ConnectionString)) + { + var col = CreateCollection("my_collection_123456789"); + object[] data = new object[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + Result result = col.Add(data).Execute(); + var data1 = col.Remove("_id = 1").Execute(); + Assert.That((int)data1.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + data1 = col.Remove("_id = 2").Execute(); + Assert.That((int)data1.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + data1 = col.Remove("_id = 3").Execute(); + Assert.That((int)data1.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + data1 = col.Remove("_id = 4").Execute(); + Assert.That((int)data1.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + sessionPlain.Close(); + } + } + + [Test, Description("Collection Scenarios - with Create a collection with emptyname")] + public void CreateCollectionEmptyName() + { + Schema db = session.GetSchema(schemaName); + Assert.Throws(() => db.CreateCollection(null)); + } + + [Test, Description("Test MySQLX plugin Collection Scenarios - with Create a collection which exists without reuse existing object")] + public void CreateCollectionWithoutReuseExistingObject() + { + Schema db = session.GetSchema(schemaName); + var col = CreateCollection("my_collection_123456789"); + col = db.GetCollection("my_collection_123456789", true); + Assert.That(col, Is.Not.Null); + Assert.Throws(() => db.CreateCollection("my_collection_123456789", false)); + } + + [Test, Description("Test MySQLX plugin Collection Scenarios - Add Objects,Find with condition")] + public void CollectionAddObjectsFindCondition() + { + Schema db = session.GetSchema(schemaName); + Collection col = CreateCollection("my_collection_1"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + Result result = col.Add(docs).Execute(); + + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(4), "Matching the updated record count"); + var foundDocs = col.Find("pages > 20").Execute(); + Assert.That(foundDocs.Next(), Is.EqualTo(true), "Next Node Exist"); + Assert.That(foundDocs.Current["title"], Is.EqualTo("Book 2"), "Matching the Node Value"); + Assert.That(foundDocs.Next(), Is.EqualTo(true), "Next Node Exist"); + Assert.That(foundDocs.Current["title"], Is.EqualTo("Book 3"), "Matching the Node Value"); + Assert.That(foundDocs.Next(), Is.EqualTo(true), "Next Node Exist"); + Assert.That(foundDocs.Current["title"], Is.EqualTo("Book 4"), "Matching the Node Value"); + Assert.That(foundDocs.Next(), Is.EqualTo(false), "Next Node doesnot Exist"); + db.DropCollection("my_collection_1"); + } + + [Test, Description("Test MySQLX plugin Collection Scenarios - Add Objects,Find without parameters")] + public void CollectionAddFindNoParams() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + Collection col = CreateCollection("my_collection_1"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + + var result = col.Add(docs).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(4), "Matching the updated record count"); + var foundDocs = col.Find().Execute(); + Assert.That(foundDocs.Next(), Is.EqualTo(true), "Next Node Exist"); + Assert.That(foundDocs.Current["title"], Is.EqualTo("Book 1"), "Matching the Node Value"); + Assert.That(foundDocs.Next(), Is.EqualTo(true), "Next Node Exist"); + Assert.That(foundDocs.Current["title"], Is.EqualTo("Book 2"), "Matching the Node Value"); + Assert.That(foundDocs.Next(), Is.EqualTo(true), "Next Node Exist"); + Assert.That(foundDocs.Current["title"], Is.EqualTo("Book 3"), "Matching the Node Value"); + Assert.That(foundDocs.Next(), Is.EqualTo(true), "Next Node Exist"); + Assert.That(foundDocs.Current["title"], Is.EqualTo("Book 4"), "Matching the Node Value"); + Assert.That(foundDocs.Next(), Is.EqualTo(false), "Next Node doesnot Exist"); + } + + [Test, Description("Test MySQLX plugin Collection Scenarios - Add/Remove JSON Object with id")] + public void CollectionAddRemoveJSONObjectID() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + using (var sessionPlain = MySQLX.GetSession(ConnectionString + ";sslmode=" + MySqlSslMode.Required)) + { + Schema db = sessionPlain.GetSchema(schemaName); + Collection col = CreateCollection("my_collection_1"); + DbDoc DbDocs = new DbDoc(); + DbDocs.SetValue("_id", "0"); + DbDocs.SetValue("title", "Book 0"); + DbDocs.SetValue("pages", "10"); + var result = col.Add(DbDocs).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(1), "Matching the updated record count"); + DbDoc jsonremovedoc = new DbDoc(); + jsonremovedoc.SetValue("_id", "0"); + var foundDocs = col.Remove("_id='0'").Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + db.DropCollection("my_collection_1"); + sessionPlain.Close(); + } + } + + [Test, Description("Test MySQLX plugin Collection Scenarios - Add/Remove with condition")] + public void CollectionAddRemoveJSONObjectCondition() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + Schema db = session.GetSchema(schemaName); + Collection col = CreateCollection("my_collection_1"); + DbDoc DbDocs = new DbDoc(); + DbDocs.SetValue("_id", "0"); + DbDocs.SetValue("title", "Book 0"); + DbDocs.SetValue("pages", "10"); + var result = col.Add(DbDocs).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(1), "Matching the updated record count"); + var foundDocs = col.Remove("pages > 0").Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + db.DropCollection("my_collection_1"); + } + + [Test, Description("Test MySQLX plugin Collection Scenarios - Add,Remove with condition limit")] + public void CollectionAddRemoveObjectConditionLimit() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + Schema db = session.GetSchema(schemaName); + Collection col = CreateCollection("my_collection_1"); + var docs = new[] + { + new { _id = 0, title = "Book 0", pages = 10 }, + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + var result = col.Add(docs).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(5), "Matching the updated record count"); + var foundDocs = col.Remove("_id=1").Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + }; + result = col.Add(docs).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(1), "Matching the updated record count"); + result = col.Remove("pages > 10").Limit(1).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(1), "Matching the updated record count"); + result = col.Remove("pages > 10").Limit(3).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(3), "Matching the updated record count"); + Assert.Throws(() => col.Remove("pages > 10").Limit(0).Execute()); + db.DropCollection("my_collection_1"); + } + + [Test, Description("Test MySQLX plugin Collection Scenarios - Add/Remove 200 JSON records ")] + public void CollectionAddRemove200JSONRecords() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + Collection col = CreateCollection("my_collection_1"); + var numOfRecords = 200; + + DbDoc[] jsonlist = new DbDoc[numOfRecords]; + for (int i = 0; i < numOfRecords; i++) + { + DbDoc newDoc2 = new DbDoc(); + newDoc2.SetValue("_id", (i + 1000).ToString()); + newDoc2.SetValue("F1", ("Field-1-Data-" + i)); + newDoc2.SetValue("F2", ("Field-2-Data-" + i)); + newDoc2.SetValue("F3", (300 + i).ToString()); + jsonlist[i] = newDoc2; + newDoc2 = null; + } + var res = col.Add(jsonlist).Execute(); + + Assert.That(jsonlist[0].ToString(), Is.EqualTo(jsonlist[0].ToString()), "String Match being done"); + for (int i = 0; i < numOfRecords; i++) + { + var data1 = col.Remove($"_id = '{i + 1000}'").Execute(); + Assert.That((int)data1.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + } + } + + [Test, Description("Test MySQLX plugin Collection Scenarios - Add/Remove documents with limit and orderby ")] + public void CollectionAddRemoveJSONRecordsLimitOrderBy() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + Schema db = session.GetSchema(schemaName); + Collection col = CreateCollection("my_collection_1"); + + DbDoc[] jsonlist = new DbDoc[10]; + for (int i = 0; i < 10; i++) + { + DbDoc newDoc2 = new DbDoc(); + newDoc2.SetValue("_id", (i).ToString()); + newDoc2.SetValue("F1", ("Field-1-Data-" + i)); + newDoc2.SetValue("F2", ("Field-2-Data-" + i)); + newDoc2.SetValue("F3", (300 + i)); + jsonlist[i] = newDoc2; + newDoc2 = null; + } + col.Add(jsonlist).Execute(); + Assert.That(jsonlist[0].ToString(), Is.EqualTo(jsonlist[0].ToString()), "String Match being done"); + + Result result = col.Remove("F3 > 305").Limit(1).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(1), "Match being done"); + + result = col.Remove("F3 > 303").Sort("F3 DESC").Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(5), "Match being done"); + + result = col.Remove("F3 > 303").Sort("F3 DESC").Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(0), "Match being done"); + + result = col.Remove("F3 = 303").Sort("F2 DESC").Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(1), "Match being done"); + + result = col.Remove("F3 < 301").Sort("F2 DESC").Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(1), "Match being done"); + + result = col.Remove("F3 < 301").Sort("F2 DESC").Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(0), "Match being done"); + + db.DropCollection("my_collection_1"); + + } + + [Test, Description("Test MySQLX plugin Collection Scenarios - Add Single/Multiple Docs - Remove Condition/ID/Condition-Limit/Condition-Limit-OrderBy/Bind")] + public void CollectionAddRemoveDocsLimitOrderByBind() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + Collection col = CreateCollection("my_collection_1"); + DbDoc DbDocs = new DbDoc(); + DbDocs.SetValue("_id", 100000); + DbDocs.SetValue("title", "Book 0"); + DbDocs.SetValue("pages", 10); + var result = col.Add(DbDocs).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(1), "Matching the updated record count"); + var foundDocs = col.Remove("pages > 0").Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + + var docs = new { _id = 100001, title = "Book 1", pages = 20 }; + result = col.Add(docs).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(1), "Matching the updated record count"); + + foundDocs = col.Remove("pages=20").Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + + docs = new { _id = -100001, title = "Book 1", pages = 20 }; + result = col.Add(docs).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(1), "Matching the updated record count"); + + foundDocs = col.Remove("pages=20").Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + var docs1 = new[] + { + new { _id = -100001, title = "Book 0", pages = 10 }, + new { _id = 0, title = "Book 1", pages = 20 }, + new { _id = 100001, title = "Book 2", pages = 30 }, + new { _id = 10000001, title = "Book 3", pages = 40 } + }; + result = col.Add(docs1).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(4), "Matching the updated record count"); + + foundDocs = col.Remove("pages > 10").Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(3), "Matching the deleted record count"); + + foundDocs = col.Remove("pages=10").Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + docs1 = new[] + { + new { _id = -100001, title = "Book 0", pages = 10 }, + new { _id = 0, title = "Book 1", pages = 20 }, + new { _id = 100001, title = "Book 2", pages = 30 }, + new { _id = 10000001, title = "Book 3", pages = 40 }, + new { _id = 10000009, title = "Book 4", pages = 50 } + }; + result = col.Add(docs1).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(5), "Matching the updated record count"); + + foundDocs = col.Remove("pages = 40").Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + + foundDocs = col.Remove("pages >= 10").Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(4), "Matching the deleted record count"); + + result = col.Add(docs1).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(5), "Matching the updated record count"); + foundDocs = col.Remove("pages = 40").Limit(1).Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + foundDocs = col.Remove("pages <= 50").Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(4), "Matching the deleted record count"); + + result = col.Add(docs1).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(5), "Matching the updated record count"); + foundDocs = col.Remove("pages = 40").Limit(1).Sort("title").Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + foundDocs = col.Remove("pages <= 50").Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(4), "Matching the deleted record count"); + + docs1 = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + + result = col.Add(docs1).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(4), "Matching the updated record count"); + foundDocs = col.Remove("pages = :Pages").Bind("pAges", 50).Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + } + + [Test, Description("Test MySQLX plugin Collection Scenarios - Add Single/Multiple Docs - Remove Condition/ID/Condition-Limit/Condition-Limit-OrderBy/Bind using invalid conditions")] + public void CollectionRemoveDocsLimitOrderByBindNegative() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + Schema db = session.GetSchema(schemaName); + var col = db.CreateCollection("my_collection_1", true); + + DbDoc DbDocs = new DbDoc(); + DbDocs.SetValue("_id", 100000); + DbDocs.SetValue("title", "Book 0"); + DbDocs.SetValue("pages", 10); + var result = col.Add(DbDocs).Execute(); + + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(1), "Matching the updated record count"); + var foundDocs = col.Remove("pages > 10").Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(0), "Matching the deleted record count"); + + var docs = new { _id = 100001, title = "Book 1", pages = 20 }; + result = col.Add(docs).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(1), "Matching the updated record count"); + + foundDocs = col.Remove("pages >= 10").Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(2), "Matching the deleted record count"); + + docs = new { _id = -100001, title = "Book 1", pages = 20 }; + result = col.Add(docs).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(1), "Matching the updated record count"); + + foundDocs = col.Remove("pages > 10").Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + + + var docs1 = new[] + { + new { _id = -100001, title = "Book 0", pages = 10 }, + new { _id = 0, title = "Book 1", pages = 20 }, + new { _id = 100001, title = "Book 2", pages = 30 }, + new { _id = 10000001, title = "Book 3", pages = 40 } + }; + result = col.Add(docs1).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(4), "Matching the updated record count"); + + foundDocs = col.Remove("pages > 50").Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(0), "Matching the deleted record count"); + + foundDocs = col.Remove("pages < 50").Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(4), "Matching the deleted record count"); + + docs1 = new[] + { + new { _id = -100001, title = "Book 0", pages = 10 }, + new { _id = 0, title = "Book 1", pages = 20 }, + new { _id = 100001, title = "Book 2", pages = 30 }, + new { _id = 10000001, title = "Book 3", pages = 40 }, + new { _id = 10000009, title = "Book 4", pages = 50 } + }; + result = col.Add(docs1).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(5), "Matching the updated record count"); + + foundDocs = col.Remove("pages = 0").Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(0), "Matching the deleted record count"); + + foundDocs = col.Remove("pages <= 50").Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(5), "Matching the deleted record count"); + + result = col.Add(docs1).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(5), "Matching the updated record count"); + foundDocs = col.Remove("pages = 60").Limit(1).Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(0), "Matching the deleted record count"); + + foundDocs = col.Remove("pages <= 50").Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(5), "Matching the deleted record count"); + + result = col.Add(docs1).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(5), "Matching the updated record count"); + foundDocs = col.Remove("pages = 04").Limit(1).Sort("title").Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(0), "Matching the deleted record count"); + foundDocs = col.Remove("pages <= 50").Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(5), "Matching the deleted record count"); + + docs1 = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + + result = col.Add(docs1).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(4), "Matching the updated record count"); + foundDocs = col.Remove("pages1 = :Pages").Bind("pAges", 50).Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(0), "Matching the deleted record count"); + foundDocs = col.Remove("pages = :Pages").Bind("pAges", 51).Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(0), "Matching the deleted record count"); + foundDocs = col.Remove("pages = :Pages").Bind("pAges", 50).Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + db.DropCollection("my_collection_1"); + + } + + [Test, Description("Test MySQLX plugin - MYSQLCNET_680 Allow Reuse Statement after execute Positive1(after a succesful execute)")] + public void AllowReuseStatementAfterExecutePositive1() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + Schema db = session.GetSchema(schemaName); + var col = db.CreateCollection("my_collection_123456789"); + object[] data = new object[] + { + new { _id = 1, title = "Book 1", pages = 10 }, + new { _id = 2, title = "Book 2", pages = 20 }, + new { _id = 3, title = "Book 3", pages = 30 }, + new { _id = 4, title = "Book 4", pages = 40 }, + new { _id = 5, title = "Book 5", pages = 50 }, + new { _id = 6, title = "Book 6", pages = 60 }, + new { _id = 7, title = "Book 7", pages = 70 }, + new { _id = 8, title = "Book 8", pages = 80 }, + }; + Result result = col.Add(data).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(8), "Matching the added record count"); + var data1 = col.Remove("_id=1").Execute(); + Assert.That((int)data1.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + data1 = col.Remove("pages = :Pages").Bind("pAges", 80).Execute(); + Assert.That((int)data1.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + data1 = col.Remove("pages = :Pages").Bind("pAges", 70).Execute(); + Assert.That((int)data1.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + var remData = col.Remove("_id = :param1 AND title = :param2"); + data1 = remData.Bind("param1", 5).Bind("param2", "Book 5").Execute(); + Assert.That((int)data1.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + data1 = remData.Bind("param1", 6).Bind("param2", "Book 6").Execute(); + Assert.That((int)data1.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + db.DropCollection("my_collection_123456789"); + } + + [Test, Description("Test MySQLX plugin - MYSQLCNET_680 Allow Reuse Statement after execute-Positive2(after an unsuccessful execute)")] + public void AllowReuseStatementAfterExecutePositive2() + { + var col = CreateCollection("my_collection_123456789"); + object[] data = new object[] + { + new { _id = 1, title = "Book 1", pages = 10 }, + new { _id = 2, title = "Book 2", pages = 20 }, + new { _id = 3, title = "Book 3", pages = 30 }, + new { _id = 4, title = "Book 4", pages = 40 }, + new { _id = 5, title = "Book 5", pages = 50 }, + new { _id = 6, title = "Book 6", pages = 60 }, + new { _id = 7, title = "Book 7", pages = 70 }, + new { _id = 8, title = "Book 8", pages = 80 }, + }; + Result result = col.Add(data).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(8), "Matching the added record count"); + var data1 = col.Remove("_id=1").Execute(); + Assert.That((int)data1.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + data1 = col.Remove("pages = :Pages").Bind("pAges", 80).Execute(); + Assert.That((int)data1.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + data1 = col.Remove("pages = :Pages").Bind("pAges", 70).Execute(); + Assert.That((int)data1.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + var remData = col.Remove("_id = :param1 AND title = :param2"); + + data1 = remData.Bind("param1", 35).Bind("param2", "Book 33").Execute(); + Assert.That((int)data1.AffectedItemsCount, Is.EqualTo(0), "Matching the deleted record count"); + + data1 = remData.Bind("param1", 6).Bind("param2", "Book 6").Execute(); + Assert.That((int)data1.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + testSchema.DropCollection("my_collection_123456789"); + } + + [Test, Description("Test MySQLX plugin - MYSQLCNET 755 Collection GetDocumentID")] + public void CollectionGetDocumentID() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + Collection coll = CreateCollection("test"); + var docs = new[] + { + new { _id = 100, title = "Book 100", pages = 1000 }, + }; + Result result = coll.Add(docs).Execute(); + var documentIds = result.GeneratedIds; + Assert.That(documentIds != null && documentIds.Count > 0, Is.False); + + coll = CreateCollection("test"); + var docs1 = new[] + { + new { title = "Book 1", pages = 100 }, + }; + var r = coll.Add(docs1); + var result1 = r.Execute(); + var documentIds1 = result.GeneratedIds; + HashSet firstset = new HashSet(); + for (int i = 0; i < documentIds.Count; i++) + { + if (documentIds1 != null) + { + Assert.That(documentIds1[i].ToString(), Is.EqualTo(documentIds1[i].ToString()), "Matching the document ID with unique id"); + } + if (!firstset.Add(documentIds1[i])) + { + break; + } + } + + coll = CreateCollection("test"); + docs = new[] + { + new { _id = 100, title = "Book 100", pages = 1000 }, + new { _id = 200, title = "Book 200", pages = 2000 }, + new { _id = 300, title = "Book 300", pages = 3000 }, + new { _id = 400, title = "Book 400", pages = 4000 }, + }; + + var r1 = coll.Add(docs).Execute(); + documentIds = r1.GeneratedIds; + Assert.That(documentIds != null && documentIds.Count > 0, Is.False); + + coll = CreateCollection("test"); + docs1 = new[] + { + new { title = "Book 1", pages = 100 }, + new { title = "Book 2", pages = 200 }, + new { title = "Book 3", pages = 300 }, + new { title = "Book 4", pages = 400 }, + }; + + var stmt = coll.Add(docs1); + result1 = stmt.Execute(); + documentIds1 = result1.GeneratedIds; + firstset = new HashSet(); + for (int i = 0; i < documentIds1.Count; i++) + { + if (documentIds != null) + { + Assert.That(documentIds1[i].ToString(), Is.EqualTo(documentIds1[i].ToString()), "Matching the document ID with unique id"); + } + + if (!firstset.Add(documentIds1[i])) + { + break; + } + } + } + + [Test, Description("Test MySQLX UUID Scenario-1(Check UUID is not generated when JSON doc is added using collection.add() with _id fields)")] + public void CheckDocUUIDScenario1() + { + var col = CreateCollection("my_collection_123456789"); + object[] data = new object[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + Result result = col.Add(data).Execute(); + var documentIds = result.GeneratedIds; + Assert.That(documentIds != null && documentIds.Count > 0, Is.False); + } + + [Test, Description("Test MySQLX UUID Scenario-2(Check UUID generated when multiple JSON docs are added using collection.add().add()..without _id fields)")] + public void CheckDocUUIDScenario2() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + var col = CreateCollection("my_collection_123456789"); + object[] data1 = new object[] + { + new { title ="Book 1", pages = 20 }, + new { title = "Book 2", pages = 30 }, + new { title = "Book 3", pages = 40 }, + new { title = "Book 4", pages = 50 } + }; + + object[] data2 = new object[] + { + new { title = "Book 5", pages = 60 }, + new {title = "Book 6", pages = 70 }, + new { title = "Book 7", pages = 80 }, + new { title = "Book 8", pages = 90 }, + }; + var stmt = col.Add(data1).Add(data2); + var result = stmt.Execute(); + var documentIds = result.GeneratedIds; + HashSet firstset = new HashSet(); + for (int i = 0; i < documentIds.Count; i++) + { + if (documentIds != null) + { + Assert.That(documentIds[i].ToString(), Is.EqualTo(documentIds[i].ToString()), "Matching the document ID with unique id"); + } + if (!firstset.Add(documentIds[i])) + { + Console.WriteLine("Contains duplicate ID"); + break; + } + } + } + + [Test, Description("Test MySQLX UUID Scenario-2(Check UUID generated when multiple JSON docs are added using collection.add(doc, doc, doc... ) without _id fields)")] + public void CheckDocUUIDScenario3() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + var col = CreateCollection("my_collection_123456789"); + var stmt = col.Add(@"{ ""foo"": 1 }", @"{""foo"": 2 }", @"{ ""foo"": 3 }", @"{ ""foo"": 4 }"); + Result r = col.Add(@"{ ""foo"": 1 }", @"{""foo"": 2 }", @"{ ""foo"": 3 }", @"{ ""foo"": 4 }").Execute(); + long count = col.Count(); + Assert.That(4, Is.EqualTo(count), "Matching the Collection Count"); + var documentIds = r.GeneratedIds; + if (documentIds != null) + { + Assert.That(documentIds[0].ToString(), Is.EqualTo(documentIds[0].ToString()), "Matching the document ID without unique id"); + Assert.That(documentIds[1].ToString(), Is.EqualTo(documentIds[1].ToString()), "Matching the document ID without unique id"); + Assert.That(documentIds[2].ToString(), Is.EqualTo(documentIds[2].ToString()), "Matching the document ID without unique id"); + Assert.That(documentIds[3].ToString(), Is.EqualTo(documentIds[3].ToString()), "Matching the document ID without unique id"); + } + + var collectionName = col.Name; + Assert.That("my_collection_123456789", Is.EqualTo(collectionName), "Matching the collection Name"); + Assert.That(col.Schema.Name, Is.EqualTo(schemaName), "Matching the Schema Name"); + } + + [Test, Description("Test MySQLX UUID Scenario-4(Check UUID generated when multiple JSON docs are added using some containing and some not containing _id fields)")] + public void CheckDocUUIDScenario4() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + var col = CreateCollection("my_collection_123456789"); + object[] data1 = new object[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { title = "Book 4", pages = 50 } + }; + + object[] data2 = new object[] + { + new { title = "Book 5", pages = 60 }, + new { _id = 6,title = "Book 6", pages = 70 }, + new { title = "Book 7", pages = 80 }, + new { title = "Book 8", pages = 90 }, + }; + + var stmt = col.Add(data1).Add(data2); + Result result = stmt.Execute(); + var documentIdsCount = result.GeneratedIds.Count; + var documentIds = result.GeneratedIds; + Assert.That(documentIdsCount, Is.EqualTo(4), "Matching the document ID count"); + if (documentIds != null) + { + Assert.That(documentIds[0].ToString(), Is.EqualTo(documentIds[0].ToString()), "Matching the document ID with unique id"); + Assert.That(documentIds[1].ToString(), Is.EqualTo(documentIds[1].ToString()), "Matching the document ID with unique id"); + Assert.That(documentIds[2].ToString(), Is.EqualTo(documentIds[2].ToString()), "Matching the document ID with unique id"); + Assert.That(documentIds[3].ToString(), Is.EqualTo(documentIds[3].ToString()), "Matching the document ID without unique id"); + } + } + + [Test, Description("Test MySQLX UUID Scenario-5(Check that UUID is not generated by adding multiple doc from the same collection in a session with _id fields)")] + public void CheckDocUUIDScenario5() + { + Collection testCollection = CreateCollection("test"); + DbDoc[] jsonlist = new DbDoc[1000]; + for (int i = 0; i < 1000; i++) + { + DbDoc newDoc2 = new DbDoc(); + newDoc2.SetValue("_id", (i + 1000)); + newDoc2.SetValue("F1", ("Field-1-Data-" + i)); + newDoc2.SetValue("F2", ("Field-2-Data-" + i)); + newDoc2.SetValue("F3", (300 + i).ToString()); + jsonlist[i] = newDoc2; + newDoc2 = null; + } + Result r = testCollection.Add(jsonlist).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1000), "Matching"); + var documentIds = r.GeneratedIds; + Assert.That(documentIds != null && documentIds.Count > 0, Is.False); + + Schema testSchema = session.GetSchema(schemaName); + Table test = testSchema.GetCollectionAsTable("test"); + Assert.That(test.ExistsInDatabase(), Is.EqualTo(true), "Matching"); + } + + [Test, Description("Test MySQLX UUID Scenario-6(Check that no duplicate UUID is generated by adding multiple doc from the same collection in a session when there are no _id fields)")] + public void CheckDocUUIDScenario6() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + Collection testCollection = CreateCollection("test"); + DbDoc[] jsonlist = new DbDoc[1000]; + for (int i = 0; i < 1000; i++) + { + DbDoc newDoc2 = new DbDoc(); + newDoc2.SetValue("F1", ("Field-1-Data-" + i)); + newDoc2.SetValue("F2", ("Field-2-Data-" + i)); + newDoc2.SetValue("F3", (300 + i).ToString()); + jsonlist[i] = newDoc2; + newDoc2 = null; + } + + var r = testCollection.Add(jsonlist); + var result = r.Execute(); + var countgenerateIDs = result.GeneratedIds.Count; + Assert.That(countgenerateIDs, Is.EqualTo(1000), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + var generatedIDs1 = result.GeneratedIds[i]; + Assert.That(generatedIDs1, Is.EqualTo(generatedIDs1), "ID generated by the server"); + } + + Schema testSchema = session.GetSchema(schemaName); + Table test = testSchema.GetCollectionAsTable("test"); + Assert.That(test.ExistsInDatabase(), Is.EqualTo(true), "Matching"); + } + + [Test, Description("Test MySQLX UUID Scenario-7(Check UUID generated when multiple JSON docs are added using collection.add(doc, doc, doc... ) when docs contains _id fields with negative numbers,big positive numbers)")] + public void CheckDocUUIDScenario7() + { + var col = CreateCollection("my_collection_123456789"); + object[] data1 = new object[] + { + new { _id = -1, title = "Book 1", pages = 20 }, + new { _id = 200000000, title = "Book 2", pages = 30 }, + new { _id = -300000000, title = "Book 3", pages = 40 }, + new { title = "Book 4", pages = 50 } + }; + + object[] data2 = new object[] + { + new { title = "Book 5", pages = 60 }, + new { _id = 60000000000000,title = "Book 6", pages = 70 }, + new { title = "Book 7", pages = 80 }, + new { title = "Book 8", pages = 90 }, + }; + + var r = col.Add(data1).Add(data2); + var result = r.Execute(); + var countgenerateIDs = result.GeneratedIds.Count; + Assert.That(countgenerateIDs, Is.EqualTo(4), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + var generatedIDs1 = result.GeneratedIds[i]; + Assert.That(generatedIDs1, Is.EqualTo(generatedIDs1), "ID generated by the server"); + } + + } + + [Test, Description("Test MySQLX UUID Scenario-8(Check UUID generated when multiple JSON docs are added using collection.add(doc, doc, doc... ) when docs contains _id fields with zero,strings)")] + public void CheckDocUUIDScenario8() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + var col = CreateCollection("my_collection_123456789"); + object[] data1 = new object[] + { + new { _id = 0, title = "Book 1", pages = 20 }, + new { _id = "test1", title = "Book 2", pages = 30 }, + new { _id = "^%$^&&%)(*&", title = "Book 3", pages = 40 }, + new { title = "Book 4", pages = 50 } + }; + + object[] data2 = new object[] + { + new { title = "Book 5", pages = 60 }, + new { _id = 60000000000000,title = "Book 6", pages = 70 }, + new { title = "Book 7", pages = 80 }, + new { title = "Book 8", pages = 90 }, + }; + + var r = col.Add(data1).Add(data2); + var result = r.Execute(); + var countgenerateIDs = result.GeneratedIds.Count; + Assert.That(countgenerateIDs, Is.EqualTo(4), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + var generatedIDs1 = result.GeneratedIds[i]; + Assert.That(generatedIDs1, Is.EqualTo(generatedIDs1), "ID generated by the server"); + } + + } + + [Test, Description("Test MySQLX UUID Scenario-9(Check the behaviour when JSON docs are added using collection.add(doc) when docs contains _id fields with (blank)")] + public void CheckDocUUIDScenario9() + { + Collection testCollection = CreateCollection("test"); + DbDoc[] jsonlist = new DbDoc[1]; + for (int i = 0; i < 1; i++) + { + DbDoc newDoc2 = new DbDoc(); + newDoc2.SetValue("_id", " "); + newDoc2.SetValue("F1", ("Field-1-Data-" + i)); + newDoc2.SetValue("F2", ("Field-2-Data-" + i)); + newDoc2.SetValue("F3", (300 + i).ToString()); + jsonlist[i] = newDoc2; + } + + Result result = testCollection.Add(jsonlist).Execute(); + //ID with blank could be added as per bug#27627861 as client will not do any validation and server will do" + Assert.That(result, Is.Not.Null); + + Schema testSchema = session.GetSchema("test"); + Table test = testSchema.GetCollectionAsTable("test"); + Assert.That(test.ExistsInDatabase(), Is.EqualTo(true), "Matching"); + } + + [Test, Description("Test MySQLX plugin Collection JSON Depth Scenarios")] + public void CollectionAddJSONDepth() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + int i, maxArrayelement = 100; + Collection col = CreateCollection("my_collection_1"); + Collection col1 = CreateCollection("my_collection_2"); + + DbDoc d1 = new DbDoc(); + for (i = 0; i < maxArrayelement; i++) + { + d1.SetValue("_id" + "_" + i.ToString(), 10000); + d1.SetValue("person" + "_" + i.ToString(), "Person" + "_" + i.ToString()); + } + + var result = col1.Add(d1).Execute(); + Assert.That(result.AffectedItemsCount, Is.GreaterThan(0)); + + var data1 = new DbDoc(@"{ ""_id"": 1, ""pages"": 20, + ""person"": { ""name"": ""Fred"", ""age"": 45 } + }"); + var data2 = new DbDoc(@"{ ""_id"": 1, ""pages"": 20, + ""books"": [ + {""_id"" : 1, ""title"" : ""Book 1""}, + { ""_id"" : 2, ""title"" : ""Book 2"" } + ] + }"); + DbDoc d2 = new DbDoc(); + d2.SetValue("_id", 1); + d2.SetValue("pages", 20); + d2.SetValue("taker1", data1); + d2.SetValue("taker2", data2); + + result = col.Add(d2).Execute(); + Assert.That(result.AffectedItemsCount, Is.GreaterThan(0)); + + var result1 = col1.Find().Execute().FetchAll(); + Assert.That(result1.Count, Is.EqualTo(1)); + var result2 = col.Find().Execute().FetchAll(); + Assert.That(result2.Count, Is.EqualTo(1)); + } + + [Test, Description("Test MySQLX plugin Collection Add function with null")] + public void CollectionAddNullFind() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + int i = 1; + Collection col = CreateCollection("my_collection_1"); + var d1 = new DbDoc(); + d1.SetValue("id" + "_" + i.ToString(), "test"); + Assert.That(col.Add(d1).Execute().AffectedItemsCount, Is.EqualTo(1)); + var result1 = col.Find(null).Execute(); + Assert.That(result1.AffectedItemsCount, Is.EqualTo(0)); + Assert.Throws(() => col.Add(null).Execute()); + var result2 = col.Add().Execute(); + Assert.That(result2.AffectedItemsCount, Is.EqualTo(0)); + } + + [Test, Description("Test MySQLX plugin Invalid JSON String")] + public void InvalidJSONString() + { + Collection col = CreateCollection("my_collection_1"); + String json = ""; + json = "{'_id':'1004','F1': [] }"; + Exception ex = Assert.Throws(() => col.Add(json).Execute()); + Assert.That(ex.Message, Does.Contain("The value provided is not a valid JSON document")); + } + + [Test, Description("Test MySQLX plugin JSON String long expression")] + public void JSONStringLongExpression() + { + Assume.That(!Platform.IsMacOSX(), "Check failure on MacOs: stack overflow");//TO DO + + Collection col = CreateCollection("my_collection_1"); + String json = "", + query2 = ""; + json = "{\"_id\":\"1004\",\"F1\": 1234 }"; + col.Add(json).Execute(); + query2 = "-1+"; + for (int i = 0; i < 230; i++) + { + query2 = query2 + "("; + } + + query2 = query2 + "(100+2)"; + for (int i = 230; i > 0; i--) + { + query2 = query2 + ")"; + } + + var docs = col.Find().Fields(("{'X':" + query2 + "}")).Execute(); + var res = col.Modify("$.F1 = 1234").Set("F1", query2).Limit(1).Execute(); + Assert.That(res.AffectedItemsCount, Is.EqualTo(1)); + } + + [Test, Description("Test MySQLX plugin Binary Expression")] + public void BinaryExpression() + { + String json = ""; + Collection col = CreateCollection("my_collection_1"); + Collection col1 = CreateCollection("my_collection_2"); + json = "{\"_id\":\"1004\",\"F1\": 123,\"F2\":\"#\" }"; + col.Add(json).Execute(); + + var docs1 = col.Find().Fields("$._id as _id", "1 << 4 as tmp").Execute(); + var res = docs1.FetchAll(); + Assert.That(res[0].Id.ToString(), Is.EqualTo("1004").IgnoreCase); + + docs1 = col.Find().Fields("$._id as _id", "$.F2 ^ 1 as tmp").Execute(); + res = docs1.FetchAll(); + Assert.That(res[0].Id.ToString(), Is.EqualTo("1004").IgnoreCase); + col.Add("{\"_id\":\"100001\",\"x1\":\"31\", \"x2\":\"13\", \"x3\":\"8\", \"x4\":\"18446744073709551614\"}").Execute(); + docs1 = col.Find("CAST($.x1 as SIGNED) | pow(2,$.x1) = $.x1").Fields("$._id as _id, $.x1 as x1, $.x2 as x2, $.x3 as x3 , $.x2 | pow(2,$.x1) as tmp").Execute(); + res = docs1.FetchAll(); + Assert.That(res, Is.Not.Null); + docs1 = col.Find("~16 = ~CAST($.F2 as SIGNED)").Fields("$._id as _id,$.F2 as f2, ~1 as tmp").Execute(); + res = docs1.FetchAll(); + Assert.That(res, Is.Not.Null); + int maxrec = 100; + DbDoc newDoc = new DbDoc(); + newDoc.SetValue("_id", maxrec + 1000); + newDoc.SetValue("F1", "Field-1-Data-" + maxrec); + newDoc.SetValue("F2", "Field-2-Data-" + maxrec); + newDoc.SetValue("F3", 300 + maxrec); + col1.Add(newDoc).Execute(); + + json = "{'_id':'" + (maxrec + 1000 + 1) + "','F1':'Field-1-Data-" + (maxrec + 1) + "','F2':'Field-2-Data-" + (maxrec + 1) + "','F3':" + (300 + maxrec + 1) + "}"; + json = json.Replace("'", "\""); + var res1 = col1.Add(json).Execute(); + Assert.That(res1.AffectedItemsCount, Is.EqualTo(1)); + json = "{'F1': 'Field-1-Data-9999','F2': 'Field-2-Data-9999','F3': 'Field-3-Data-9999'}".Replace("'", "\""); + col1.Add(json).Add(json.Replace("9", "8")).Execute(); + Assert.That(res1.AffectedItemsCount, Is.EqualTo(1)); + + var docs = col1.Find("$._id = 1100").Fields("$_id as _id,$.F1 as f1, $.F2 as f2, $.F3 as f3").Execute(); + var res2 = docs.FetchOne(); + Assert.That(res2["_id"].ToString(), Is.EqualTo("1100")); + Assert.That(res2["f1"].ToString(), Is.EqualTo("Field-1-Data-100")); + Assert.That(res2["f2"].ToString(), Is.EqualTo("Field-2-Data-100")); + Assert.That(res2["f3"].ToString(), Is.EqualTo("400")); + + } + + [Test, Description("Test MySQLX plugin Invalid JSON String long expression")] + public void JSONStringSpecialCharacters() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + Collection col = CreateCollection("my_collection_1"); + String[] splName = {"+", "*", "/", "a+b", "#1", "%", "&", "@1", "!1", "~", "^", + "(", ")", "{", "}", "[", "]", "|", "JSON", "ADD", "JSON_EXTRACT", "JSON_OBJECT", + "?", "=", "+", ";", ",", ":", "<", ">", "-"}; + for (int i = 0; i < splName.Length; i++) + { + col.Add("{\"" + splName[i] + "\":\"data" + i + "\",\"ID\":" + i + "}").Execute(); + var docs = col.Find("$.ID = " + i).Fields("$.`" + splName[i] + "` as col1,$.ID as Id").Execute(); + var res = docs.FetchOne(); + Assert.That(res["Id"].ToString(), Is.EqualTo(i.ToString()), "Matching the ID"); + if (i == 30) + Assert.That("data30", Is.EqualTo("data" + i), "Matching the String"); + else + Assert.That(res["col1"].ToString(), Is.EqualTo("data" + i), "Matching the String"); + } + } + + [Test, Description("Test MySQLX plugin Collections Chained Insert")] + public void CollectionsChainedInsert() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + Collection col = CreateCollection("my_collection_1"); + DbDoc newDoc = new DbDoc(); + newDoc.SetValue("F1", 1); + + DbDoc newDoc1 = new DbDoc(); + newDoc1.SetValue("F1", 2); + + DbDoc newDoc2 = new DbDoc(); + newDoc2.SetValue("F1", 3); + + DbDoc[] jsonlist = new DbDoc[5]; + for (int i = 0; i < 5; i++) + { + DbDoc newDoc3 = new DbDoc(); + newDoc3.SetValue("F1", 4 + i); + jsonlist[i] = newDoc3; + newDoc3 = null; + } + + DbDoc[] jsonlist1 = new DbDoc[5]; + for (int i = 0; i < 5; i++) + { + DbDoc newDoc4 = new DbDoc(); + newDoc4.SetValue("F1", 10 + i); + jsonlist1[i] = newDoc4; + newDoc4 = null; + } + + DbDoc[] jsonlist2 = new DbDoc[5]; + for (int i = 0; i < 5; i++) + { + DbDoc newDoc5 = new DbDoc(); + newDoc5.SetValue("F1", 100 + i); + jsonlist2[i] = newDoc5; + newDoc5 = null; + } + + var tabRes = col.Add(newDoc).Add(newDoc1).Execute(); + Assert.That(tabRes.AffectedItemsCount, Is.EqualTo(2), "Matching the affected records"); + + tabRes = col.Add(jsonlist).Add(newDoc2).Execute(); + Assert.That(tabRes.AffectedItemsCount, Is.EqualTo(6), "Matching the affected records"); + + tabRes = col.Add(jsonlist1).Add(jsonlist2).Execute(); + Assert.That(tabRes.AffectedItemsCount, Is.EqualTo(10), "Matching the affected records"); + } + + [Test, Description("Test MySQLX plugin Collection Add Array")] + public void CollectionAddArray() + { + Assume.That(Platform.IsWindows(), "This test is for Windows OS only."); + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + int maxrec = 5; + var col = CreateCollection("my_collection_1"); + DbDoc[] jsonlist = new DbDoc[maxrec]; + for (int i = 0; i < maxrec; i++) + { + DbDoc newDoc2 = new DbDoc(); + newDoc2.SetValue("_id", i); + newDoc2.SetValue("F1", "Field-1-Data-" + i); + newDoc2.SetValue("ARR_INT", new DbDoc(@"{""values"":[1, 2, 3, 4, 5, 6, 7, 8, 9]}")); + newDoc2.SetValue("ARR_STR", new DbDoc(@"{""values"":""['DATA1', 'DATA2', 'DATA3', 'DATA4', 'DATA5', 'DATA6']""}")); + newDoc2.SetValue("ARR_LIT", new DbDoc(@"{""values"":""[null, true, false, null, true, false, null, true, false]""}")); + newDoc2.SetValue("ARR_ARR", new DbDoc(@"{""values"":[[1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]]}")); + + col.Add(newDoc2).Execute(); + jsonlist[i] = newDoc2; + } + + jsonlist = null; + var res = col.Find().Execute().FetchAll(); + Assert.That(res.Count, Is.EqualTo(5), "Matching the find count"); + } + + [Test, Description("Test MySQLX plugin Collection JSON Scenarios")] + public void CollectionAddJSONDocs() + { + Assume.That(Platform.IsWindows(), "This test is for Windows OS only."); + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + + Collection col = CreateCollection("my_collection_1"); + string json = @"{ ""_id"": 0, ""title"": ""Book 0"" ,""pages"": 10,""name"": ""Jeoff Archer""}"; + Result r = col.Add(json).Execute(); + + Assert.That((int)r.AffectedItemsCount, Is.EqualTo(1), "Matching Affected Records Count"); + var foundDocs = col.Find("pages > 5").Execute(); + Assert.That(foundDocs.Count(), Is.EqualTo(1), "Matching Count"); + + json = @"{ ""_id"" : 99950, ""city"" : ""KETCHIKAN"", ""loc"" : ""[ -133.18479, 55.942471 ]"", ""pop"" : 422, ""state"" : ""AK"" }"; + r = col.Add(json).Execute(); + + DbDoc d = new DbDoc(@"{ ""id"": 1, ""pages"": 20, + ""person"": { ""name"": ""Fred"", ""age"": 45 } + }"); + DbDoc d2 = new DbDoc(); + d2.SetValue("id", 1); + d2.SetValue("pages", 20); + d2.SetValue("person", new { name = "Fred", age = 45 }); + + Assert.That(true, Is.EqualTo(d.Equals(d2)), "Matching"); + col.Add(d).Execute(); + + d = new DbDoc(@"{""id"":100,""FirstName"":""xyz"",""lastname"":""pqr"", + ""address"": + {""house"":44,""city"":""Delhi"",""country"":""india""}}"); + col.Add(d).Execute(); + + d = new DbDoc(@"{""customerId"":100,""FirstName"":""xyz"",""lastname"":""pqr"", + ""address"": + {""house"":44,""city"":""Delhi"",""country"":""india""}, + ""employer"": + {""cmpName"":""ABC"",""type"":""IT""}}"); + col.Add(d).Execute(); + + d = new DbDoc(@"{ ""id"": 1, ""pages"": 20, + ""books"": [ + {""_id"" : 1, ""title"" : ""Book 1""}, + { ""_id"" : 2, ""title"" : ""Book 2"" } + ] + }"); + col.Add(d).Execute(); + + var docs = new[] { new { _id = 1, title = "Book 1" }, new { _id = 2, title = "Book 2" } }; + d2 = new DbDoc(); + d2.SetValue("id", 100); + d2.SetValue("pages", 20); + d2.SetValue("books", docs); + col.Add(d2).Execute(); + + var result = col.Find("$._id = 0").Fields("$._id as _id,$.name as name, $.pages as pages, $.title as title").Execute(); + var res1 = result.FetchOne(); + Assert.That(res1["_id"], Is.EqualTo(0)); + Assert.That(res1["name"], Is.EqualTo("Jeoff Archer")); + Assert.That(res1["pages"], Is.EqualTo(10)); + Assert.That(res1["title"], Is.EqualTo("Book 0")); + + result = col.Find("$._id > 0").Fields().Execute(); + var res2 = result.FetchAll(); + Assert.That(res2.Count(), Is.EqualTo(6)); + + DbDoc test = new DbDoc(); + test.SetValue("_id", 1); + test.SetValue("name", "ABBBBBBBBBBBBBBXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTTTTTYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYABBBBBBBBBBBBBBXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTTTTTYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYABBBBBBBBBBBBBBXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTTTTTYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYABBBBBBBBBBBBBBXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTTTTTYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYABBBBBBBBBBBBBBXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYTTTTTTYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"); + var coll = CreateCollection("my_collection_123456789"); + var res = coll.Add(test).Execute(); + foundDocs = coll.Find().Execute(); + var docs1 = foundDocs.FetchAll(); + Assert.That(docs1.Count, Is.EqualTo(1)); + } + + [Test, Description("Verify that the field and column _id has a value when it's not given to a document-Scenario-1(single document add)")] + public void VerifyIDField() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + List idStringList = new List(); + var col = CreateCollection("my_collection"); + Result result = null; + string generatedIDs1 = null, generatedIDs2 = null; + int countgenerateIDs = 0; + // Anonymous Object Array + object[] data = new object[] { new { title = "Book 1", pages = 30 } }; + var stmt = col.Add(data); + result = stmt.Execute(); + generatedIDs1 = result.GeneratedIds[0]; + Assert.That(generatedIDs1, Is.EqualTo(generatedIDs1), "ID generated by the server"); + VerifyGeneratedID(generatedIDs1); + countgenerateIDs = result.GeneratedIds.Count; + Assert.That(countgenerateIDs, Is.EqualTo(1), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(result.GeneratedIds[i]); + } + + // DbDoc + DbDoc DbDocs = new DbDoc(); + DbDocs.SetValue("title", "Book 0"); + DbDocs.SetValue("pages", 10); + stmt = col.Add(DbDocs); + result = stmt.Execute(); + generatedIDs2 = result.GeneratedIds[0]; + Assert.That(generatedIDs2, Is.EqualTo(generatedIDs2), "ID generated by the server"); + VerifyGeneratedID(generatedIDs2); + countgenerateIDs = result.GeneratedIds.Count; + Assert.That(countgenerateIDs, Is.EqualTo(1), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(result.GeneratedIds[i]); + } + + // Anonymous Object + var docs = new { title = "Book 1", pages = 20 }; + stmt = col.Add(docs); + result = stmt.Execute(); + generatedIDs1 = result.GeneratedIds[0]; + Assert.That(generatedIDs1, Is.EqualTo(generatedIDs1), "ID generated by the server"); + VerifyGeneratedID(generatedIDs1); + countgenerateIDs = result.GeneratedIds.Count; + Assert.That(countgenerateIDs, Is.EqualTo(1), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(result.GeneratedIds[i]); + } + + // JSON + stmt = col.Add("{ \"foo\": 100 }"); + result = stmt.Execute(); + generatedIDs2 = result.GeneratedIds[0]; + Assert.That(generatedIDs2, Is.EqualTo(generatedIDs2), "ID generated by the server"); + VerifyGeneratedID(generatedIDs2); + countgenerateIDs = result.GeneratedIds.Count; + Assert.That(countgenerateIDs, Is.EqualTo(1), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(result.GeneratedIds[i]); + } + + int j = 1; + for (int i = 0; i < idStringList.Count; i++) + { + if (j == idStringList.Count) + { + break; + } + VerifySequence(idStringList[i], idStringList[j]); + j++; + } + } + + [Test, Description("Unique _ids generated server side for multiple documents, single add and generated ids count should be number of docs added-Scenario3")] + public void VerifyIDFieldScenario3() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + List idStringList = new List(); + var col = CreateCollection("my_collection"); + Result result = null; + string generatedIDs1 = null; + int countgenerateIDs = 0; + HashSet firstset = new HashSet(); + + object[] data1 = new object[] + { + new { title = "Book 1", pages = 20 }, + new { title = "Book 2", pages = 30 }, + new { title = "Book 3", pages = 40 }, + new { title = "Book 4", pages = 50 } + }; + + var stmt = col.Add(data1); + result = stmt.Execute(); + countgenerateIDs = result.GeneratedIds.Count; + Assert.That(countgenerateIDs, Is.EqualTo(4), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + generatedIDs1 = result.GeneratedIds[i]; + Assert.That(generatedIDs1, Is.EqualTo(generatedIDs1), "ID generated by the server"); + VerifyGeneratedID(generatedIDs1); + Assert.That(!firstset.Add(generatedIDs1), Is.False); + } + + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(result.GeneratedIds[i]); + } + + stmt = col.Add(@"{ ""foo"": 1 }", @"{""foo"": 2 }", @"{ ""foo"": 3 }", @"{ ""foo"": 4 }"); + result = stmt.Execute(); + countgenerateIDs = result.GeneratedIds.Count; + Assert.That(countgenerateIDs, Is.EqualTo(4), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + generatedIDs1 = result.GeneratedIds[i]; + Assert.That(generatedIDs1, Is.EqualTo(generatedIDs1), "ID generated by the server"); + VerifyGeneratedID(generatedIDs1); + Assert.That(!firstset.Add(generatedIDs1), Is.False); + } + + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(result.GeneratedIds[i]); + } + + int j = 1; + for (int i = 0; i < idStringList.Count; i++) + { + if (j == idStringList.Count) + { + break; + } + VerifySequence(idStringList[i], idStringList[j]); + j++; + } + } + + [Test, Description("Verify that the field and column _id has a value when it's not given to a document-Scenario-1(single document add)-when doc already exists")] + public void VerifyIDFieldScenario4() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + List idStringList = new List(); + var col = CreateCollection("my_collection"); + Result result = null; + string generatedIDs1 = null, generatedIDs2 = null; + int countgenerateIDs = 0; + object[] data = null; + data = new object[] + { + new { title ="Book 0", pages = 10 }, + new { title ="Book 5", pages = 60, _id = 6} + }; + result = col.Add(data).Execute(); + countgenerateIDs = result.GeneratedIds.Count; + generatedIDs1 = result.GeneratedIds[0]; + Assert.That(countgenerateIDs, Is.EqualTo(1), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(result.GeneratedIds[i]); + } + + // Anonymous Object Array + data = new object[] { new { title = "Book 1", pages = 30 } }; + var stmt = col.Add(data); + result = stmt.Execute(); + generatedIDs1 = result.GeneratedIds[0]; + Assert.That(generatedIDs1, Is.EqualTo(generatedIDs1), "ID generated by the server"); + VerifyGeneratedID(generatedIDs1); + countgenerateIDs = result.GeneratedIds.Count; + Assert.That(countgenerateIDs, Is.EqualTo(1), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(result.GeneratedIds[i]); + } + + col = CreateCollection("my_collection"); + data = null; + data = new object[] + { + new { title ="Book 0", pages = 10 }, + new { title ="Book 5", pages = 60, _id = 6} + }; + result = col.Add(data).Execute(); + countgenerateIDs = result.GeneratedIds.Count; + generatedIDs1 = result.GeneratedIds[0]; + Assert.That(countgenerateIDs, Is.EqualTo(1), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(result.GeneratedIds[i]); + } + + // DbDoc + DbDoc DbDocs = new DbDoc(); + DbDocs.SetValue("title", "Book 0"); + DbDocs.SetValue("pages", 10); + stmt = col.Add(DbDocs); + result = stmt.Execute(); + generatedIDs2 = result.GeneratedIds[0]; + Assert.That(generatedIDs2, Is.EqualTo(generatedIDs2), "ID generated by the server"); + VerifyGeneratedID(generatedIDs2); + countgenerateIDs = result.GeneratedIds.Count; + Assert.That(countgenerateIDs, Is.EqualTo(1), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(result.GeneratedIds[i]); + } + + col = CreateCollection("my_collection"); + data = null; + data = new object[] + { + new { title ="Book 0", pages = 10 }, + new { title ="Book 5", pages = 60, _id = 6} + }; + result = col.Add(data).Execute(); + countgenerateIDs = result.GeneratedIds.Count; + generatedIDs1 = result.GeneratedIds[0]; + Assert.That(countgenerateIDs, Is.EqualTo(1), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(result.GeneratedIds[i]); + } + + // Anonymous Object + var docs = new { title = "Book 1", pages = 20 }; + stmt = col.Add(docs); + result = stmt.Execute(); + generatedIDs1 = result.GeneratedIds[0]; + Assert.That(generatedIDs1, Is.EqualTo(generatedIDs1), "ID generated by the server"); + VerifyGeneratedID(generatedIDs1); + countgenerateIDs = result.GeneratedIds.Count; + Assert.That(countgenerateIDs, Is.EqualTo(1), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(result.GeneratedIds[i]); + } + + col = CreateCollection("my_collection"); + data = null; + data = new object[] + { + new { title ="Book 0", pages = 10 }, + new { title ="Book 5", pages = 60, _id = 6} + }; + result = col.Add(data).Execute(); + countgenerateIDs = result.GeneratedIds.Count; + generatedIDs1 = result.GeneratedIds[0]; + Assert.That(countgenerateIDs, Is.EqualTo(1), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(result.GeneratedIds[i]); + } + + //JSON + stmt = col.Add("{ \"foo\": 100 }"); + result = stmt.Execute(); + generatedIDs2 = result.GeneratedIds[0]; + Assert.That(generatedIDs2, Is.EqualTo(generatedIDs2), "ID generated by the server"); + VerifyGeneratedID(generatedIDs2); + countgenerateIDs = result.GeneratedIds.Count; + Assert.That(countgenerateIDs, Is.EqualTo(1), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(result.GeneratedIds[i]); + } + + int j = 1; + for (int i = 0; i < idStringList.Count; i++) + { + if (j == idStringList.Count) + { + break; + } + VerifySequence(idStringList[i], idStringList[j]); + j++; + } + } + + [Test, Description("Unique _ids generated server side for multiple documents,multiple add and generated ids count should be number of docs added-when doc already exists Scenario2")] + public void VerifyIDFieldScenario5() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + List idStringList = new List(); + Result result = null; + string generatedIDs1 = null; + int countgenerateIDs = 0; + var col = CreateCollection("my_collection"); + object[] data = null; + + data = new object[] + { + new { title ="Book 0", pages = 10 }, + new { title ="Book 5", pages = 60, _id = 6} + }; + result = col.Add(data).Execute(); + countgenerateIDs = result.GeneratedIds.Count; + generatedIDs1 = result.GeneratedIds[0]; + Assert.That(countgenerateIDs, Is.EqualTo(1), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(result.GeneratedIds[i]); + } + + HashSet firstset = new HashSet(); + // Anonymous Object Array + object[] data1 = new object[] { new { title ="Book 1", pages = 20 } + }; + object[] data2 = new object[] { new { title = "Book 5", pages = 60 } }; + + var stmt = col.Add(data1).Add(data2); + result = stmt.Execute(); + countgenerateIDs = result.GeneratedIds.Count; + Assert.That(countgenerateIDs, Is.EqualTo(2), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + generatedIDs1 = result.GeneratedIds[i]; + Assert.That(generatedIDs1, Is.EqualTo(generatedIDs1), "ID generated by the server"); + VerifyGeneratedID(generatedIDs1); + Assert.That(!firstset.Add(generatedIDs1), Is.False); + } + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(result.GeneratedIds[i]); + } + + col = CreateCollection("my_collection"); + data = new object[] + { + new { title ="Book 0", pages = 10 }, + new { title ="Book 5", pages = 60, _id = 6} + }; + result = col.Add(data).Execute(); + countgenerateIDs = result.GeneratedIds.Count; + generatedIDs1 = result.GeneratedIds[0]; + Assert.That(countgenerateIDs, Is.EqualTo(1), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(result.GeneratedIds[i]); + } + + // DbDoc + DbDoc DbDocs1 = new DbDoc(); + DbDocs1.SetValue("title", "Book 0"); + DbDocs1.SetValue("pages", 10); + DbDoc DbDocs2 = new DbDoc(); + DbDocs2.SetValue("title", "Book 1"); + DbDocs2.SetValue("pages", 20); + stmt = col.Add(DbDocs1).Add(DbDocs2); + result = stmt.Execute(); + countgenerateIDs = result.GeneratedIds.Count; + Assert.That(countgenerateIDs, Is.EqualTo(2), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + generatedIDs1 = result.GeneratedIds[i]; + Assert.That(generatedIDs1, Is.EqualTo(generatedIDs1), "ID generated by the server"); + VerifyGeneratedID(generatedIDs1); + Assert.That(!firstset.Add(generatedIDs1), Is.False); + } + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(result.GeneratedIds[i]); + } + + col = CreateCollection("my_collection"); + + data = new object[] + { + new { title ="Book 0", pages = 10 }, + new { title ="Book 5", pages = 60, _id = 6} + }; + result = col.Add(data).Execute(); + countgenerateIDs = result.GeneratedIds.Count; + generatedIDs1 = result.GeneratedIds[0]; + Assert.That(countgenerateIDs, Is.EqualTo(1), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(result.GeneratedIds[i]); + } + + // Anonymous Object + var docs1 = new { title = "Book 1", pages = 20 }; + var docs2 = new { title = "Book 2", pages = 30 }; + stmt = col.Add(docs1).Add(docs2); + + result = stmt.Execute(); + countgenerateIDs = result.GeneratedIds.Count; + Assert.That(countgenerateIDs, Is.EqualTo(2), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + generatedIDs1 = result.GeneratedIds[i]; + Assert.That(generatedIDs1, Is.EqualTo(generatedIDs1), "ID generated by the server"); + VerifyGeneratedID(generatedIDs1); + Assert.That(!firstset.Add(generatedIDs1), Is.False); + } + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(result.GeneratedIds[i]); + } + + col = CreateCollection("my_collection"); + data = new object[] + { + new { title ="Book 0", pages = 10 }, + new { title ="Book 5", pages = 60, _id = 6} + }; + result = col.Add(data).Execute(); + countgenerateIDs = result.GeneratedIds.Count; + generatedIDs1 = result.GeneratedIds[0]; + Assert.That(countgenerateIDs, Is.EqualTo(1), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(result.GeneratedIds[i]); + } + + // JSON + stmt = col.Add("{ \"foo1\": 100 }").Add("{ \"foo2\": 200 }"); + result = stmt.Execute(); + countgenerateIDs = result.GeneratedIds.Count; + Assert.That(countgenerateIDs, Is.EqualTo(2), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + generatedIDs1 = result.GeneratedIds[i]; + Assert.That(generatedIDs1, Is.EqualTo(generatedIDs1), "ID generated by the server"); + VerifyGeneratedID(generatedIDs1); + if (!firstset.Add(generatedIDs1)) + { + break; + } + } + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(result.GeneratedIds[i]); + } + + int j = 1; + for (int i = 0; i < idStringList.Count; i++) + { + if (j == idStringList.Count) + { + break; + } + VerifySequence(idStringList[i], idStringList[j]); + j++; + } + } + + [Test, Description("Unique _ids generated server side for multiple documents, single add and generated ids count should be number of docs added-when doc already exists Scenario3")] + public void VerifyIDFieldScenario6() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + List idStringList = new List(); + var col = CreateCollection("my_collection"); + Result result = null; + string generatedIDs1 = null; + int countgenerateIDs = 0; + object[] data = null; + + data = new object[] + { + new { title ="Book 0", pages = 10 }, + new { title ="Book 5", pages = 60, _id = 6} + }; + result = col.Add(data).Execute(); + countgenerateIDs = result.GeneratedIds.Count; + generatedIDs1 = result.GeneratedIds[0]; + Assert.That(countgenerateIDs, Is.EqualTo(1), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(result.GeneratedIds[i]); + } + + HashSet firstset = new HashSet(); + // Anonymous Object Array + object[] data1 = new object[] + { + new { title ="Book 1", pages = 20 }, + new { title = "Book 2", pages = 30 }, + new { title = "Book 3", pages = 40 }, + new { title = "Book 4", pages = 50 } + }; + + var stmt = col.Add(data1); + result = stmt.Execute(); + countgenerateIDs = result.GeneratedIds.Count; + Assert.That(countgenerateIDs, Is.EqualTo(4), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + generatedIDs1 = result.GeneratedIds[i]; + Assert.That(generatedIDs1, Is.EqualTo(generatedIDs1), "ID generated by the server"); + VerifyGeneratedID(generatedIDs1); + Assert.That(!firstset.Add(generatedIDs1), Is.False); + } + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(result.GeneratedIds[i]); + } + + col = CreateCollection("my_collection"); + result = col.Add(@"{ ""foo"": 0, ""_id"":0 }", @"{""foo"": 5 }").Execute(); + countgenerateIDs = result.GeneratedIds.Count; + generatedIDs1 = result.GeneratedIds[0]; + Assert.That(countgenerateIDs, Is.EqualTo(1), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(result.GeneratedIds[i]); + } + + // JSON + stmt = col.Add(@"{ ""foo"": 1 }", @"{""foo"": 2 }", @"{ ""foo"": 3 }", @"{ ""foo"": 4 }"); + result = stmt.Execute(); + countgenerateIDs = result.GeneratedIds.Count; + Assert.That(countgenerateIDs, Is.EqualTo(4), "Count of the ID generated by the server"); + for (int i = 0; i < countgenerateIDs; i++) + { + generatedIDs1 = result.GeneratedIds[i]; + Assert.That(generatedIDs1, Is.EqualTo(generatedIDs1), "ID generated by the server"); + VerifyGeneratedID(generatedIDs1); + Assert.That(!firstset.Add(generatedIDs1), Is.False); + } + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(result.GeneratedIds[i]); + } + + int j = 1; + for (int i = 0; i < idStringList.Count; i++) + { + if (j == idStringList.Count) + { + break; + } + VerifySequence(idStringList[i], idStringList[j]); + j++; + } + } + + [Test, Description("Client provided _id shouldnt be discarded and generatedids() should give empty list for anonymous object array -single document add")] + public void VerifyIDFieldScenario7() + { + var col = CreateCollection("my_collection"); + object[] data = new object[] + { + new { _id = "1e9c92fda74ed311944e00059a3c7a00", title = "Book 0", pages = 10 }, + }; + Result result = col.Add(data).Execute(); + var generatedIDs = result.GeneratedIds; + Assert.That(generatedIDs.Count, Is.EqualTo(0), "Matches"); + var doc = col.Find("_id like :param").Bind("param", "1e9c92fda74ed311944e00059a3c7a00").Execute(); + var docs = doc.FetchAll().Count(); + Assert.That(docs, Is.EqualTo(1), "Matches"); + + //Anonymous Object + var data1 = new { _id = "1e9c92fda74ed311944e00059a3c7a01", title = "Book 0", pages = 10 }; + result = col.Add(data1).Execute(); + + generatedIDs = result.GeneratedIds; + Assert.That(generatedIDs.Count, Is.EqualTo(0), "Matches"); + doc = col.Find("_id like :param").Bind("param", "1e9c92fda74ed311944e00059a3c7a01").Execute(); + docs = doc.FetchAll().Count(); + Assert.That(docs, Is.EqualTo(1), "Matches"); + + // DbDoc + DbDoc DbDocs = new DbDoc(); + DbDocs.SetValue("title", "Book 0"); + DbDocs.SetValue("pages", 10); + DbDocs.SetValue("_id", "1e9c92fda74ed311944e00059a3c7a02"); + result = col.Add(DbDocs).Execute(); + + generatedIDs = result.GeneratedIds; + Assert.That(generatedIDs.Count, Is.EqualTo(0), "Matches"); + doc = col.Find("_id like :param").Bind("param", "1e9c92fda74ed311944e00059a3c7a02").Execute(); + docs = doc.FetchAll().Count(); + Assert.That(docs, Is.EqualTo(1), "Matches"); + + //JSON + result = col.Add("{\"_id\":\"1e9c92fda74ed311944e00059a3c7a03\",\"title\": \"Book 0\",\"pages\": 10}").Execute(); + generatedIDs = result.GeneratedIds; + Assert.That(generatedIDs.Count, Is.EqualTo(0), "Matches"); + doc = col.Find("_id like :param").Bind("param", "1e9c92fda74ed311944e00059a3c7a03").Execute(); + docs = doc.FetchAll().Count(); + Assert.That(docs, Is.EqualTo(1), "Matches"); + } + + [Test, Description("Client provided _id shouldnt be discarded and generatedids() should give empty list for anonymous object array -multiple documents multiple add with negative number")] + public void VerifyIDFieldScenario8() + { + var col = CreateCollection("my_collection"); + object[] data1 = new object[] + { + new { _id = "1e9c92fda74ed311944e00059a3c7a00", title = "Book 0", pages = 10 } + }; + object[] data2 = new object[] + { + new { _id = -1, title = "Book 0", pages = 10 } + }; + Result result = col.Add(data1).Add(data2).Execute(); + var generatedIDs = result.GeneratedIds; + Assert.That(generatedIDs.Count, Is.EqualTo(0), "Matches"); + var doc = col.Find("_id like :param").Bind("param", "1e9c92fda74ed311944e00059a3c7a00").Execute(); + var docs = doc.FetchAll().Count(); + Assert.That(docs, Is.EqualTo(1), "Matches"); + doc = col.Find("_id like :param").Bind("param", -1).Execute(); + docs = doc.FetchAll().Count(); + Assert.That(docs, Is.EqualTo(1), "Matches"); + + // Anonymous Object + var data3 = new { _id = "1e9c92fda74ed311944e00059a3c7a01", title = "Book 0", pages = 10 }; + var data4 = new { _id = -2, title = "Book 0", pages = 10 }; + result = col.Add(data3).Add(data4).Execute(); + generatedIDs = result.GeneratedIds; + Assert.That(generatedIDs.Count, Is.EqualTo(0), "Matches"); + doc = col.Find("_id like :param").Bind("param", "1e9c92fda74ed311944e00059a3c7a01").Execute(); + docs = doc.FetchAll().Count(); + Assert.That(docs, Is.EqualTo(1), "Matches"); + doc = col.Find("_id like :param").Bind("param", -2).Execute(); + docs = doc.FetchAll().Count(); + Assert.That(docs, Is.EqualTo(1), "Matches"); + + //DbDoc + DbDoc DbDocs1 = new DbDoc(); + DbDocs1.SetValue("title", "Book 0"); + DbDocs1.SetValue("pages", 10); + DbDocs1.SetValue("_id", "1e9c92fda74ed311944e00059a3c7a02"); + DbDoc DbDocs2 = new DbDoc(); + DbDocs2.SetValue("title", "Book 0"); + DbDocs2.SetValue("pages", 10); + DbDocs2.SetValue("_id", -3); + result = col.Add(DbDocs1).Add(DbDocs2).Execute(); + generatedIDs = result.GeneratedIds; + Assert.That(generatedIDs.Count, Is.EqualTo(0), "Matches"); + doc = col.Find("_id like :param").Bind("param", "1e9c92fda74ed311944e00059a3c7a02").Execute(); + docs = doc.FetchAll().Count(); + Assert.That(docs, Is.EqualTo(1), "Matches"); + doc = col.Find("_id like :param").Bind("param", -3).Execute(); + docs = doc.FetchAll().Count(); + Assert.That(docs, Is.EqualTo(1), "Matches"); + + // JSON + result = col.Add("{\"_id\":\"1e9c92fda74ed311944e00059a3c7a03\",\"title\": \"Book 0\",\"pages\": 10}"). + Add("{\"_id\":-4,\"title\": \"Book 0\",\"pages\": 10}"). + Execute(); + generatedIDs = result.GeneratedIds; + Assert.That(generatedIDs.Count, Is.EqualTo(0), "Matches"); + doc = col.Find("_id like :param").Bind("param", "1e9c92fda74ed311944e00059a3c7a03").Execute(); + docs = doc.FetchAll().Count(); + Assert.That(docs, Is.EqualTo(1), "Matches"); + doc = col.Find("_id like :param").Bind("param", -4).Execute(); + docs = doc.FetchAll().Count(); + Assert.That(docs, Is.EqualTo(1), "Matches"); + } + + [Test, Description("Client provided _id shouldnt be discarded and generatedids() should give empty list for anonymous object array -multiple documents single add with negative number,zero and big positive numbers")] + public void VerifyIDFieldScenario9() + { + var col = CreateCollection("my_collection"); + // Anonymous Object Array + object[] idList = new object[] { "1e9c92fda74ed311944e00059a3c7a00", -1, 60000000000000, -3000000000000, 0 }; + object[] data1 = new object[] + { + new { _id = idList[0], title = "Book 0", pages = 10 }, + new { _id = idList[1], title = "Book 0", pages = 10 }, + new { _id = idList[2] , title = "Book 0", pages = 10 }, + new { _id = idList[3], title = "Book 0", pages = 10 }, + new { _id = idList[4], title = "Book 0", pages = 10 } + }; + Result result = col.Add(data1).Execute(); + var generatedIDs = result.GeneratedIds; + Assert.That(generatedIDs.Count, Is.EqualTo(0), "Matches"); + for (int i = 0; i < idList.Length; i++) + { + var doc = col.Find("_id like :param").Bind("param", idList[i]).Execute(); + var docs = doc.FetchAll().Count(); + Assert.That(docs, Is.EqualTo(1), "Matches the Document ID"); + } + } + + [Test, Description("documents single add with blank id")] + public void CollectionAddBlankId() + { + var col = CreateCollection("my_collection"); + // Anonymous Object Array + object[] idList = new object[] { "", " " }; + object[] data1 = new object[] + { + new { _id = idList[0], title = "Book 0", pages = 10 } + }; + object[] data2 = new object[] + { + new { _id = idList[1], title = "Book 0", pages = 10 } + }; + Result result1 = col.Add(data1).Execute(); + Assert.That(result1.AffectedItemsCount, Is.EqualTo(1)); + result1 = null; + + col = CreateCollection("my_collection"); + result1 = col.Add(data2).Execute(); + Assert.That(result1.AffectedItemsCount, Is.EqualTo(1)); + result1 = null; + + col = CreateCollection("my_collection"); + // DbDoc + DbDoc DbDocs1 = new DbDoc(); + DbDocs1.SetValue("title", "Book 0"); + DbDocs1.SetValue("pages", 10); + DbDocs1.SetValue("_id", ""); + result1 = col.Add(DbDocs1).Execute(); + Assert.That(result1.AffectedItemsCount, Is.EqualTo(1)); + result1 = null; + + col = CreateCollection("my_collection"); + DbDoc DbDocs2 = new DbDoc(); + DbDocs2.SetValue("title", "Book 1"); + DbDocs2.SetValue("pages", 20); + DbDocs2.SetValue("_id", " "); + result1 = col.Add(DbDocs2).Execute(); + Assert.That(result1.AffectedItemsCount, Is.EqualTo(1)); + result1 = null; + + // JSON + col = CreateCollection("my_collection"); + result1 = col.Add("{\"_id\":\"\",\"title\": \"Book 0\",\"pages\": 10}").Execute(); + Assert.That(result1.AffectedItemsCount, Is.EqualTo(1)); + result1 = null; + + col = CreateCollection("my_collection"); + result1 = col.Add("{\"_id\":\" \",\"title\": \"Book 0\",\"pages\": 10}").Execute(); + Assert.That(result1.AffectedItemsCount, Is.EqualTo(1)); + result1 = null; + + } + + [Test, Description("Multiple documents with same id")] + public void CollectionAddMultipleDocsSameId() + { + var col = CreateCollection("my_collection"); + string exception = "Document contains a field value that is not unique but required to be"; + // DbDoc + DbDoc DbDocs1 = new DbDoc(); + DbDocs1.SetValue("title", "Book 0"); + DbDocs1.SetValue("pages", 10); + DbDocs1.SetValue("_id", 1); + DbDoc DbDocs2 = new DbDoc(); + DbDocs2.SetValue("title", "Book 1"); + DbDocs2.SetValue("pages", 20); + DbDocs2.SetValue("_id", 1); + var ex = Assert.Throws(() => col.Add(DbDocs1).Add(DbDocs2).Execute()); + Assert.That(ex.Message, Is.EqualTo(exception), "Checking the exception"); + + // JSON + ex = Assert.Throws(() => col.Add("{\"_id\":1,\"title\": \"Book 0\",\"pages\": 10}"). + Add("{\"_id\":1,\"title\": \"Book 1\",\"pages\": 20}").Execute()); + Assert.That(ex.Message, Is.EqualTo(exception), "Checking the exception"); + + // Anonymous Object Array + object[] data1 = new object[] + { + new { _id = 1, title = "Book 0", pages = 10 } + }; + object[] data2 = new object[] + { + new { _id = 1, title = "Book 1", pages = 20 } + }; + ex = Assert.Throws(() => col.Add(data1).Add(data2).Execute()); + Assert.That(ex.Message, Is.EqualTo(exception), "Checking the exception"); + } + + [Test, Description("Verify the behaviour if a sequence is incremented by the user and added as _id for the document")] + public void VerifySequenceAndIdAdded() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + string incrementedString = null, generatedString = null; + var col = CreateCollection("my_collection"); + Result result = null; + string generatedIDs1 = null; + int countgenerateIDs = 0; + // Anonymous Object Array + object[] data = new object[] { new { title = "Book 1", pages = 30 } }; + var stmt = col.Add(data); + + result = stmt.Execute(); + generatedIDs1 = result.GeneratedIds[0]; + Assert.That(generatedIDs1, Is.EqualTo(generatedIDs1), "ID generated by the server"); + VerifyGeneratedID(generatedIDs1); + countgenerateIDs = result.GeneratedIds.Count; + Assert.That(countgenerateIDs, Is.EqualTo(1), "Count of the ID generated by the server"); + generatedString = generatedIDs1; + incrementedString = Increment(generatedIDs1, Mode.AlphaNumeric); + + data = new object[] { new { title = "Book 2", pages = 40, _id = generatedString } }; + stmt = col.Add(data); + string exception = "Document contains a field value that is not unique but required to be"; + Exception ex = Assert.Throws(() => stmt.Execute()); + Assert.That(ex.Message, Is.EqualTo(exception), "Matching the exception"); + + data = new object[] { new { title = "Book 3", pages = 50, _id = incrementedString } }; + stmt = col.Add(data); + result = stmt.Execute(); + Assert.That(result, Is.Not.Null); + + data = new object[] { new { title = "Book 4", pages = 60 } }; + stmt = col.Add(data); + ex = Assert.Throws(() => stmt.Execute()); + Assert.That(ex.Message, Is.EqualTo(exception), "Matching the exception"); + + } + + [Test, Description("documents inserted concurrently by two threads")] + public async Task CollectionConcurrentAdd() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + + CreateCollection("my_collection"); + var r1 = await CollectionAddThread1(); + _ = await CollectionAddThread2(); + Assert.That(r1, Is.EqualTo(1000)); + } + public Task CollectionAddThread1() + { + List idStringList = new List(); + var col = CreateCollection("my_collection"); + DbDoc[] jsonlist = new DbDoc[1000]; + for (int i = 0; i < 1000; i++) + { + DbDoc newDoc2 = new DbDoc(); + newDoc2.SetValue("F1", ("Field-1-Data-" + i)); + newDoc2.SetValue("F2", ("Field-2-Data-" + i)); + newDoc2.SetValue("F3", (3 + i).ToString()); + jsonlist[i] = newDoc2; + newDoc2 = null; + } + Result r = col.Add(jsonlist).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1000), "Matching"); + int countgenerateIDs = r.GeneratedIds.Count; + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(r.GeneratedIds[i]); + } + + int j = 1; + for (int i = 0; i < idStringList.Count; i++) + { + if (j == idStringList.Count) + { + break; + } + VerifySequence(idStringList[i], idStringList[j]); + j++; + } + return Task.FromResult((int)r.AffectedItemsCount); + } + + public Task CollectionAddThread2() + { + List idStringList = new List(); + var col = CreateCollection("my_collection1"); + DbDoc[] jsonlist = new DbDoc[1000]; + for (int i = 0; i < 1000; i++) + { + DbDoc newDoc2 = new DbDoc(); + newDoc2.SetValue("F4", ("Field-1-Data-" + i)); + newDoc2.SetValue("F5", ("Field-2-Data-" + i)); + newDoc2.SetValue("F6", (3 + i).ToString()); + jsonlist[i] = newDoc2; + newDoc2 = null; + } + Result r = col.Add(jsonlist).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1000), "Matching"); + int countgenerateIDs = r.GeneratedIds.Count; + for (int i = 0; i < countgenerateIDs; i++) + { + idStringList.Add(r.GeneratedIds[i]); + } + + int j = 1; + for (int i = 0; i < idStringList.Count; i++) + { + if (j == idStringList.Count) + { + break; + } + VerifySequence(idStringList[i], idStringList[j]); + j++; + } + return Task.FromResult(0); + } + + ///// + ///// Bug24397888 + ///// + [Test, Description("WHEN A DBDOC IS PASSED AS OBJ TO SETVALUE OF ANOTHER DBDOC IT CONVERTS TO BLANK")] + public void DbDocAsObjectConvertToBlank() + { + string newLine = Platform.IsWindows() ? "\r\n" : "\n"; + + var col = CreateCollection("my_collection"); + var data1 = new DbDoc(@"{ ""id"": 1, ""pages"": 20, + ""person"": { ""name"": ""Fred"", ""age"": 45 } + }"); + DbDoc d2 = new DbDoc(); + d2.SetValue("id", 1); + d2.SetValue("pages", 20); + d2.SetValue("taker1", data1); + string expected = $"{{{newLine} \"id\": 1, {newLine} \"pages\": 20, {newLine} \"taker1\": {{{newLine} \"id\": 1, {newLine} \"pages\": 20, {newLine} \"person\": {{{newLine} \"name\": \"Fred\", {newLine} \"age\": 45{newLine} }}{newLine} }}{newLine}}}"; + Assert.That(d2.ToString(), Is.EqualTo(expected)); + } + + [Test, Description("ADDITION OF OBJ FAILS AFTER CREATE INDEX IN 5.7.12 SERVER(WORKS WITH 5.7.9)")] + public void AdditionOfObject() + { + Collection testColl = CreateCollection("test"); + testColl.CreateIndex("testIndex", "{\"fields\": [ { \"field\":$.myId, \"type\":\"INT\" , \"required\":true} ] }"); + testColl.CreateIndex("testIndex1", "{\"fields\": [ { \"field\":$.myAge, \"type\":\"FLOAT\" , \"required\":true} ] }"); + var result = testColl.Add(new { myId = 1, myAge = 35.1, _id = 1 }).Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + } + + [Test, Description("Test valid insert at Depth n for multiple arrays))")] + public void InsertAtNDepth() + { + if (!session.Version.isAtLeast(8, 0, 3)) return; + string json = ""; + int i = 0, j = 0, maxField = 100; + var collection = CreateCollection("test"); + int maxDepth = 97; + json = "{\"_id\":\"1002\",\"XYZ\":1111"; + for (j = 0; j < maxField; j++) + { + json = json + ",\"ARR" + j + "\":["; + for (i = 0; i < maxDepth; i++) + { + json = json + i + ",["; + } + json = json + i; + for (i = maxDepth - 1; i >= 0; i--) + { + json = json + "]," + i; + } + json = json + "]"; + } + json = json + "}"; + + var res = collection.Add(json).Execute(); + Assert.That(res.AffectedItemsCount, Is.EqualTo(1)); + } + + #endregion WL14389 + + #region Methods + + public void VerifyGeneratedID(string input) + { + byte[] array = Encoding.ASCII.GetBytes(input); + Assert.That(array.Length < 28, Is.False); + + byte[] uniquePrefix = new byte[4]; + Array.Copy(array, 0, uniquePrefix, 0, 4); + + Assert.That(System.Text.Encoding.UTF8.GetString(uniquePrefix), Is.EqualTo(System.Text.Encoding.UTF8.GetString(uniquePrefix)), + "Unique Prefix of the Generated ID"); + + byte[] startTimeStamp = new byte[8]; + Array.Copy(array, 4, startTimeStamp, 0, 8); + Assert.That(System.Text.Encoding.UTF8.GetString(startTimeStamp), Is.EqualTo(System.Text.Encoding.UTF8.GetString(startTimeStamp)), + "StartTimeStamp of the Generated ID"); + + byte[] serial = new byte[16]; + Array.Copy(array, 12, serial, 0, 16); + Assert.That(System.Text.Encoding.UTF8.GetString(serial), Is.EqualTo(System.Text.Encoding.UTF8.GetString(serial)), + "Serial Number of the Generated ID"); + } + + public bool VerifySequence(string input1, string input2) + { + byte[] array1 = Encoding.ASCII.GetBytes(input1); + Assert.That(array1.Length < 28, Is.False); + byte[] array2 = Encoding.ASCII.GetBytes(input2); + Assert.That(array2.Length < 28, Is.False); + Assert.That(input2, Is.Not.EqualTo(input1)); + string incrementedString = Increment(input1, Mode.AlphaNumeric); + if (incrementedString.Equals(input2)) + { + return true; + } + else + { + return false; + } + } + public static string Increment(string text, Mode mode) + { + var textArr = text.ToCharArray(); + var characters = new List(); + + if (mode == Mode.AlphaNumeric || mode == Mode.Numeric) + for (char c = '0'; c <= '9'; c++) + characters.Add(c); + + if (mode == Mode.AlphaNumeric || mode == Mode.Alpha) + for (char c = 'a'; c <= 'f'; c++) + characters.Add(c); + + // Loop from end to beginning + for (int i = textArr.Length - 1; i >= 0; i--) + { + if (textArr[i] == characters.Last()) + { + textArr[i] = characters.First(); + } + else + { + textArr[i] = characters[characters.IndexOf(textArr[i]) + 1]; + break; + } + } + + return new string(textArr); + } + public enum Mode + { + AlphaNumeric = 1, + Alpha = 2, + Numeric = 3 + } + + #endregion Methods + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/CrudRemoveTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/CrudRemoveTests.cs new file mode 100644 index 000000000..a35f65908 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/CrudRemoveTests.cs @@ -0,0 +1,381 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Common; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Generic; + +namespace MySqlX.Data.Tests +{ + public class CrudRemoveTests : BaseTest + { + [Test] + public void RemoveSingleDocumentById() + { + Collection coll = CreateCollection("test"); + var docs = new[]{ + new { _id = 12, title = "Book 1", pages = 20 }, + new { _id = 34, title = "Book 2", pages = 30 }, + new { _id = 56, title = "Book 3", pages = 40 }, + }; + Result r = ExecuteAddStatement(coll.Add(docs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(3)); + + // Remove with condition. + r = ExecuteRemoveStatement(coll.Remove("_id = 12")); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + // Remove by ID. + r = coll.RemoveOne(34); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + var ex = Assert.Throws(() => coll.Remove("")); +#if !NETFRAMEWORK + Assert.That(ex.Message, Is.EqualTo("Parameter can't be null or empty (Parameter 'condition')")); +#else + Assert.That(ex.Message, Is.EqualTo("Parameter can't be null or empty\r\nParameter name: condition")); +#endif + } + + [Test] + public void RemoveMultipleDocuments() + { + Collection coll = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + Result r = ExecuteAddStatement(coll.Add(docs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4)); + + r = ExecuteRemoveStatement(coll.Remove("pages > 20")); + Assert.That(r.AffectedItemsCount, Is.EqualTo(3)); + } + + [Test] + public void RemoveMultipleDocumentsWithLimit() + { + Collection coll = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + Result r = ExecuteAddStatement(coll.Add(docs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4)); + + r = ExecuteRemoveStatement(coll.Remove("pages > 20").Limit(1)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + // Limit out of range. + Assert.Throws(() => ExecuteRemoveStatement(coll.Remove("True").Limit(0))); + Assert.Throws(() => ExecuteRemoveStatement(coll.Remove("True").Limit(-2))); + Assert.Throws(() => ExecuteRemoveStatement(coll.Remove("pages > 10").Limit(0))); + Assert.Throws(() => ExecuteRemoveStatement(coll.Remove("pages > 20").Limit(-3))); + } + + [Test] + public void RemoveMultipleDocumentsWithLimitAndOrder() + { + Collection coll = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + Result r = ExecuteAddStatement(coll.Add(docs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4)); + + r = ExecuteRemoveStatement(coll.Remove("pages > 20").Limit(1)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + } + + [Test] + public void RemovingDocWithNoIdThrowsException() + { + Collection coll = CreateCollection("test"); + DbDoc doc = new DbDoc(); + Exception ex = Assert.Throws(() => ExecuteRemoveStatement(coll.Remove("_id = :id").Bind("id", doc.Id))); + } + + [Test] + public void RemoveBind() + { + Collection coll = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + Result r = ExecuteAddStatement(coll.Add(docs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4)); + + r = ExecuteRemoveStatement(coll.Remove("pages = :Pages").Bind("pAges", 50)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + var jsonParams = new { pages1 = 30, pages2 = 40 }; + var res = coll.Remove("pages = :Pages1 || pages = :Pages2").Bind(jsonParams).Execute(); + Assert.That(res.AffectedItemsCount, Is.EqualTo(2)); + + DbDoc docParams = new DbDoc(new { pages1 = 10, pages2 = 20 }); + coll.Remove("pages = :Pages1 || pages = :Pages2").Bind(docParams).Execute(); + Assert.That(res.AffectedItemsCount > 0); + } + + [Test] + public void RemoveAll() + { + Collection collection = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + Result result = ExecuteAddStatement(collection.Add(docs)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(4)); + + // Condition can't be null or empty. + string errorMessage = string.Empty; +#if !NETFRAMEWORK + errorMessage = "Parameter can't be null or empty (Parameter 'condition')"; +#else + errorMessage = "Parameter can't be null or empty\r\nParameter name: condition"; +#endif + Exception ex = Assert.Throws(() => ExecuteRemoveStatement(collection.Remove(string.Empty))); + Assert.That(ex.Message, Is.EqualTo(errorMessage)); + ex = Assert.Throws(() => ExecuteRemoveStatement(collection.Remove(""))); + Assert.That(ex.Message, Is.EqualTo(errorMessage)); + ex = Assert.Throws(() => ExecuteRemoveStatement(collection.Remove(" "))); + Assert.That(ex.Message, Is.EqualTo(errorMessage)); + ex = Assert.Throws(() => ExecuteRemoveStatement(collection.Remove(" "))); + Assert.That(ex.Message, Is.EqualTo(errorMessage)); + + // Sending an expression that evaluates to true applies changes on all documents. + result = ExecuteRemoveStatement(collection.Remove("true")); + Assert.That(result.AffectedItemsCount, Is.EqualTo(4)); + } + + [Test] + public void RemoveWithInOperator() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + Collection collection = CreateCollection("test"); + var docs = new[] + { + new DbDoc("{ \"a\": 1, \"b\": \"foo\", \"c\": { \"d\": true, \"e\": [1,2,3] }, \"f\": [ {\"x\":5}, {\"x\":7 } ] }"), + new DbDoc("{ \"a\": 2, \"b\": \"foo2\", \"c\": { \"d\": true, \"e\": [4,5,6] }, \"f\": [ {\"x\":5}, {\"x\":8 } ] }"), + new DbDoc("{ \"a\": 1, \"b\": \"foo3\", \"c\": { \"d\": true, \"e\": [1,4,3] }, \"f\": [ {\"x\":6}, {\"x\":9 } ] }"), + }; + Result result = ExecuteAddStatement(collection.Add(docs)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(3)); + + Assert.That(ExecuteRemoveStatement(collection.Remove("a IN (2,3)")).AffectedItemsCount, Is.EqualTo(1)); + Assert.That(ExecuteFindStatement(collection.Find()).FetchAll().Count, Is.EqualTo(2)); + + Assert.That(ExecuteRemoveStatement(collection.Remove("a IN [3]")).AffectedItemsCount, Is.EqualTo(0)); + Assert.That(ExecuteFindStatement(collection.Find()).FetchAll().Count, Is.EqualTo(2)); + + Assert.That(ExecuteRemoveStatement(collection.Remove("1 IN c.e")).AffectedItemsCount, Is.EqualTo(2)); + Assert.That(ExecuteFindStatement(collection.Find()).FetchAll(), Is.Empty); + } + + [Test] + public void RemoveOne() + { + Collection collection = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + Result result = ExecuteAddStatement(collection.Add(docs)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(4)); + + ExecuteAddStatement(collection.Add(new { _id = 5, title = "Book 5", pages = 60 })); + Assert.That(ExecuteFindStatement(collection.Find()).FetchAll().Count, Is.EqualTo(5)); + + // Remove sending numeric parameter. + Assert.That(collection.RemoveOne(1).AffectedItemsCount, Is.EqualTo(1)); + Assert.That(ExecuteFindStatement(collection.Find()).FetchAll().Count, Is.EqualTo(4)); + + // Remove sending string parameter. + Assert.That(collection.RemoveOne("3").AffectedItemsCount, Is.EqualTo(1)); + Assert.That(ExecuteFindStatement(collection.Find()).FetchAll().Count, Is.EqualTo(3)); + + // Remove an auto-generated id. + DbDoc document = ExecuteFindStatement(collection.Find("pages = 60")).FetchOne(); + Assert.That(collection.RemoveOne(document.Id).AffectedItemsCount, Is.EqualTo(1)); + Assert.That(ExecuteFindStatement(collection.Find()).FetchAll().Count, Is.EqualTo(2)); + + // Remove a non-existing document. + Assert.That(collection.RemoveOne(5).AffectedItemsCount, Is.EqualTo(0)); + Assert.That(ExecuteFindStatement(collection.Find()).FetchAll().Count, Is.EqualTo(2)); + + // Expected exceptions. + Assert.Throws(() => collection.RemoveOne(null)); + Assert.Throws(() => collection.RemoveOne("")); + Assert.Throws(() => collection.RemoveOne(string.Empty)); + } + + #region WL14389 + + [Test, Description("MySQLX CNET Forbid remove() with no condition-Scenario-2")] + public void ForbidRemoveWithNoCondition() + { + Collection collection = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + Result result = collection.Add(docs).Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(4)); + + result = collection.Remove("_id = 1").Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + result = collection.Remove("_id = 10").Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(0)); + result = collection.Remove("_id = 2").Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + result = collection.Remove("_id = 10").Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(0)); + Assert.Throws(() => collection.Remove("")); + } + + [Test, Description("Test MySQLX plugin MySQL Net 846 - Collection Unset Multiple")] + public void CollectionUnsetMultiple() + { + Collection col = CreateCollection("my_collection_1"); + + var d1 = new DbDoc(); + d1.SetValue("_id", 1); + d1.SetValue("books", "test1"); + d1.SetValue("count", 10); + + var d2 = new DbDoc(); + d2.SetValue("_id", 2); + d2.SetValue("books", "test2"); + d2.SetValue("count", 20); + + var d3 = new DbDoc(); + d3.SetValue("_id", 3); + d3.SetValue("books", "test3"); + d3.SetValue("count", 30); + + var d4 = new DbDoc(); + d4.SetValue("_id", 4); + d4.SetValue("books", "test4"); + d4.SetValue("count", 40); + + var d5 = new DbDoc(); + d5.SetValue("_id", 5); + d5.SetValue("books", "test5"); + d5.SetValue("count", 50); + + var d6 = new DbDoc(); + d6.SetValue("_id", 6); + d6.SetValue("books", "test6"); + d6.SetValue("count", 0); + + var d7 = new DbDoc(); + d7.SetValue("_id", 0); + d7.SetValue("books", "test7"); + d7.SetValue("count", 60); + + var final = col.Add(d1, d2).Add(d3).Execute(); + + var res1 = col.Find().Fields("{\"_id\":\"1\",\"books\": \"test1\" }").Fields("{\"_id\":\"2\",\"books\": \"test2\" }").Fields("{\"_id\":\"3\",\"books\": \"test3\" }").Execute().FetchAll(); + res1 = col.Find().Fields(new string[] { "_id", "books", "count" }).Execute().FetchAll(); + Assert.That(res1.Count, Is.EqualTo(3), "Matching the find count"); + Assert.That(res1[0].ToString(), Is.EqualTo(d1.ToString()), "Matching the doc string 1"); + Assert.That(res1[1].ToString(), Is.EqualTo(d2.ToString()), "Matching the doc string 2"); + Assert.That(res1[2].ToString(), Is.EqualTo(d3.ToString()), "Matching the doc string 3"); + final = col.Add(new DbDoc[] { d4, d5 }).Execute(); + var res2 = col.Find().Fields("$._id as _id,$.books as books, $.count as count").Execute().FetchAll(); + Assert.That(res2.Count, Is.EqualTo(5), "Matching the find count"); + Assert.That(res2[0].ToString(), Is.EqualTo(d1.ToString()), "Matching the doc string 1"); + Assert.That(res2[1].ToString(), Is.EqualTo(d2.ToString()), "Matching the doc string 2"); + Assert.That(res2[2].ToString(), Is.EqualTo(d3.ToString()), "Matching the doc string 3"); + Assert.That(res2[3].ToString(), Is.EqualTo(d4.ToString()), "Matching the doc string 4"); + Assert.That(res2[4].ToString(), Is.EqualTo(d5.ToString()), "Matching the doc string 5"); + final = col.Add(d6, d7).Execute(); + var res3 = col.Find().Sort("count ASC").Execute().FetchAll(); + Assert.That(res3[0].ToString(), Is.EqualTo(d6.ToString()), "Matching the doc string 7"); + Assert.That(res3[1].ToString(), Is.EqualTo(d1.ToString()), "Matching the doc string 1"); + Assert.That(res3[2].ToString(), Is.EqualTo(d2.ToString()), "Matching the doc string 2"); + Assert.That(res3[3].ToString(), Is.EqualTo(d3.ToString()), "Matching the doc string 3"); + Assert.That(res3[4].ToString(), Is.EqualTo(d4.ToString()), "Matching the doc string 4"); + Assert.That(res3[5].ToString(), Is.EqualTo(d5.ToString()), "Matching the doc string 5"); + Assert.That(res3[6].ToString(), Is.EqualTo(d7.ToString()), "Matching the doc string 6"); + var res4 = col.Find().Sort("count DESC").Execute().FetchAll(); + Assert.That(res4[0].ToString(), Is.EqualTo(d7.ToString()), "Matching the doc string 6"); + Assert.That(res4[1].ToString(), Is.EqualTo(d5.ToString()), "Matching the doc string 1"); + Assert.That(res4[2].ToString(), Is.EqualTo(d4.ToString()), "Matching the doc string 2"); + Assert.That(res4[3].ToString(), Is.EqualTo(d3.ToString()), "Matching the doc string 3"); + Assert.That(res4[4].ToString(), Is.EqualTo(d2.ToString()), "Matching the doc string 4"); + Assert.That(res4[5].ToString(), Is.EqualTo(d1.ToString()), "Matching the doc string 5"); + Assert.That(res4[6].ToString(), Is.EqualTo(d6.ToString()), "Matching the doc string 7"); + //Unset with multiple variables not supported + col.Modify("_id = 1").Unset(new string[] { "count", "books" }).Execute(); + col.Modify("_id = 1").Set("count", 10).Set("books", "test1").Execute(); + + } + + [Test, Description("Test MySQLX plugin RemovingItemUsingDbDoc")] + public void RemovingItemUsingDbDoc() + { + Collection coll = CreateCollection("test"); + DbDoc doc = new DbDoc(new { _id = 1, title = "Book 1", pages = 20 }); + Result r = coll.Add(doc).Execute(); + Assert.That((int)r.AffectedItemsCount, Is.EqualTo(1), "Match being done"); + r = coll.Remove("_id=1").Execute(); + Assert.That((int)r.AffectedItemsCount, Is.EqualTo(1), "Match being done"); + } + + #endregion WL14389 + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/CrudTests/CrudGCTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/CrudTests/CrudGCTests.cs new file mode 100644 index 000000000..add461b08 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/CrudTests/CrudGCTests.cs @@ -0,0 +1,61 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Common; +using System; +using NUnit.Framework; +using NUnit.Framework.Legacy; + +namespace MySqlX.Data.Tests.ResultTests +{ + public class CrudGCTests : BaseTest + { +#if NETFRAMEWORK + [Test] + public void FetchAllNoReference() + { + Collection testColl = CreateCollection("test"); + var stmt = testColl.Add(@"{ ""_id"": 1, ""foo"": 1 }"); + stmt.Add(@"{ ""_id"": 2, ""foo"": 2 }"); + stmt.Add(@"{ ""_id"": 3, ""foo"": 3 }"); + stmt.Add(@"{ ""_id"": 4, ""foo"": 4 }"); + Result result = ExecuteAddStatement(stmt); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(4)); + + var docResult = ExecuteFindStatement(testColl.Find()); + var docs = docResult.FetchAll(); + WeakReference wr = new WeakReference(docResult); + docResult = null; + GC.Collect(); + Assert.That(wr.IsAlive, Is.False); + Assert.That(docs.Count, Is.EqualTo(4)); + } +#endif + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/CrudTests/DocBufferingTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/CrudTests/DocBufferingTests.cs new file mode 100644 index 000000000..1913d0ea9 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/CrudTests/DocBufferingTests.cs @@ -0,0 +1,62 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Common; +using NUnit.Framework; +using NUnit.Framework.Legacy; + +namespace MySqlX.Data.Tests.CrudTests +{ + public class DocBufferingTests : BaseTest + { + [Test] + public void SmartBuffering() + { + Collection test = CreateCollection("test"); + Collection test2 = CreateCollection("test2"); + + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + Result r = ExecuteAddStatement(test.Add(docs)); + Assert.That(r.WarningsCount, Is.EqualTo(r.Warnings.Count)); + + var docResult = ExecuteFindStatement(test.Find()); + foreach (var doc in docResult) + { + var result = ExecuteAddStatement(test2.Add(doc)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + } + } + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/CrudUpdateTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/CrudUpdateTests.cs new file mode 100644 index 000000000..e60869b05 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/CrudUpdateTests.cs @@ -0,0 +1,1283 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Common; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Generic; + +namespace MySqlX.Data.Tests +{ + public class CrudUpdateTests : BaseTest + { + [Test] + public void SetItemInSingleDocument() + { + Collection coll = CreateCollection("test"); + Result result = ExecuteAddStatement(coll.Add(new { _id = 1, name = "Book 1" })); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + + // Set integer value. + result = ExecuteModifyStatement(coll.Modify("_id = 1").Set("pages", "20")); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + Assert.That(coll.GetOne(1)["pages"], Is.EqualTo("20")); + + // Set null value. + result = ExecuteModifyStatement(coll.Modify("_id = 1").Set("pages", null)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + Assert.That(coll.GetOne(1)["pages"], Is.Null); + + // Set existing field. + result = ExecuteModifyStatement(coll.Modify("_id = 1").Set("name", "Book 2")); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + Assert.That(coll.GetOne(1)["name"], Is.EqualTo("Book 2")); + + // Set alphanumeric field. + var document = new DbDoc(); + document.SetValue("_id", 2); + document.SetValue("1a", "other"); + result = ExecuteAddStatement(coll.Add(document)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + var insertedDocument = coll.GetOne(2); + + //result = coll.Modify("_id = 1").Set("1a", "other")); + } + + [Test] + public void ChangeItemInSingleDocument() + { + Collection coll = CreateCollection("test"); + Result result = ExecuteAddStatement(coll.Add(new { _id = 1, name = "Book 1", pages = 20 })); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + + result = ExecuteModifyStatement(coll.Modify("_id = 1").Change("name", "Book 2")); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + } + + [Test] + public void RemoveItemInSingleDocumentUsingUnset() + { + Collection coll = CreateCollection("test"); + Result result = ExecuteAddStatement(coll + .Add(new { _id = 1, name = "Book 1", pages = 20 }) + .Add(new { _id = 2, name = "Book 2", pages = 30 }) + .Add(new { _id = 3, name = "Book 3", pages = 40, author = "John", author2 = "Mary" }) + ); + Assert.That(result.AffectedItemsCount, Is.EqualTo(3)); + + // Unset 1 field. + result = ExecuteModifyStatement(coll.Modify("_id = 1").Unset("pages")); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + var document = ExecuteFindStatement(coll.Find("_id = 1")).FetchOne(); + Assert.That(document.values.Count, Is.EqualTo(2)); + + // Unset multiple fields. + result = ExecuteModifyStatement(coll.Modify("_id = 2").Unset("name", "pages")); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + document = ExecuteFindStatement(coll.Find("_id = 2")).FetchOne(); + Assert.That(document.values, Has.One.Items); + result = ExecuteModifyStatement(coll.Modify("_id = 3").Unset(null, "author", "author2")); + document = ExecuteFindStatement(coll.Find("_id = 3")).FetchOne(); + Assert.That(document.values.Count, Is.EqualTo(3)); + + // Unsetting nonexistent fields doesn't raise an error. + result = ExecuteModifyStatement(coll.Modify("_id = 2").Unset("otherfield")); + Assert.That(result.AffectedItemsCount, Is.EqualTo(0ul)); + + // Unsetting null items combined with valid values are ignored. + result = ExecuteModifyStatement(coll.Modify("_id = 3").Unset(null).Unset("name")); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1ul)); + document = ExecuteFindStatement(coll.Find("_id = 3")).FetchOne(); + Assert.That(document.values.Count, Is.EqualTo(2)); + + // Unsetting single null items raises an error + var ex = Assert.Throws(() => ExecuteModifyStatement(coll.Modify("_id = 3").Unset(null))); + Assert.That(ex.Message, Is.EqualTo("Invalid update expression list")); + + // Unsetting empty strings raises an error. + var ex2 = Assert.Throws(() => ExecuteModifyStatement(coll.Modify("_id = 2").Unset(""))); + Assert.That(ex2.Message, Is.EqualTo(ResourcesX.DocPathNullOrEmpty)); + ex2 = Assert.Throws(() => ExecuteModifyStatement(coll.Modify("_id = 2").Unset(string.Empty))); + Assert.That(ex2.Message, Is.EqualTo(ResourcesX.DocPathNullOrEmpty)); + + // Unset with special chars. + Assert.Throws(() => ExecuteModifyStatement(coll.Modify("_id = 3").Unset(null).Unset("@*%#�"))); + Assert.Throws(() => ExecuteModifyStatement(coll.Modify("_id = 3").Unset(null).Unset("******"))); + } + + [Test] + public void SetItemAndBind() + { + Collection coll = CreateCollection("test"); + Result result = ExecuteAddStatement(coll.Add(new { _id = 1, name = "Book 1" }) + .Add(new { _id = 2, name = "Book 2" })); + Assert.That(result.AffectedItemsCount, Is.EqualTo(2)); + + var stmt = coll.Modify("_id = :ID"); + result = ExecuteModifyStatement(stmt.Bind("Id", 2).Set("pages", "20")); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + result = ExecuteModifyStatement(stmt.Bind("Id", 1).Set("pages", 10)); Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + + var docs = ExecuteFindStatement(coll.Find()).FetchAll(); + Assert.That(docs[0].ToString(), Is.EqualTo(new DbDoc("{ \"_id\": 1, \"name\": \"Book 1\", \"pages\": 10 }").ToString())); + Assert.That(docs[1].ToString(), Is.EqualTo(new DbDoc("{ \"_id\": 2, \"name\": \"Book 2\", \"pages\": \"20\" }").ToString())); + } + + [Test] + public void ModifyAll() + { + Collection collection = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + }; + Result result = ExecuteAddStatement(collection.Add(docs)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(2)); + + // Condition can't be null or empty. + string errorMessage = string.Empty; +#if !NETFRAMEWORK + errorMessage = "Parameter can't be null or empty (Parameter 'condition')"; +#else + errorMessage = "Parameter can't be null or empty\r\nParameter name: condition"; +#endif + Exception ex = Assert.Throws(() => ExecuteModifyStatement(collection.Modify(string.Empty))); + Assert.That(errorMessage, Is.EqualTo(ex.Message)); + ex = Assert.Throws(() => ExecuteModifyStatement(collection.Modify(""))); + Assert.That(errorMessage, Is.EqualTo(ex.Message)); + ex = Assert.Throws(() => ExecuteModifyStatement(collection.Modify(" "))); + Assert.That(errorMessage, Is.EqualTo(ex.Message)); + ex = Assert.Throws(() => ExecuteModifyStatement(collection.Modify(" "))); + Assert.That(errorMessage, Is.EqualTo(ex.Message)); + ex = Assert.Throws(() => ExecuteModifyStatement(collection.Modify(null))); + Assert.That(errorMessage, Is.EqualTo(ex.Message)); + + // Sending an expression that evaluates to true applies changes on all documents. + result = ExecuteModifyStatement(collection.Modify("true").Set("pages", "10")); + Assert.That(result.AffectedItemsCount, Is.EqualTo(2)); + } + + [Test] + public void ModifyWithLimit() + { + Collection collection = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + }; + Result result = ExecuteAddStatement(collection.Add(docs)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(2)); + + ExecuteModifyStatement(collection.Modify("true").Set("title", "Book X").Limit(1)); + Assert.That(ExecuteFindStatement(collection.Find("title = \"Book X\"")).FetchAll(), Has.One.Items); + + // Limit out of range. + Assert.Throws(() => ExecuteModifyStatement(collection.Modify("true").Set("pages", 10).Limit(0))); + Assert.Throws(() => ExecuteModifyStatement(collection.Modify("true").Set("pages", 10).Limit(-10))); + } + + [Test] + public void ModifyWithInOperator() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + Collection collection = CreateCollection("test"); + var docs = new[] + { + new DbDoc("{ \"a\": 1, \"b\": \"foo\", \"c\": { \"d\": true, \"e\": [1,2,3] }, \"f\": [ {\"x\":5}, {\"x\":7 } ] }"), + new DbDoc("{ \"a\": 2, \"b\": \"foo2\", \"c\": { \"d\": true, \"e\": [4,5,6] }, \"f\": [ {\"x\":5}, {\"x\":8 } ] }"), + new DbDoc("{ \"a\": 1, \"b\": \"foo3\", \"c\": { \"d\": true, \"e\": [1,4,3] }, \"f\": [ {\"x\":6}, {\"x\":9 } ] }"), + }; + Result result = ExecuteAddStatement(collection.Add(docs)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(3)); + + Assert.That(ExecuteModifyStatement(collection.Modify("a IN (1,2)").Set("a", 3)).AffectedItemsCount, Is.EqualTo(3)); + Assert.That(ExecuteFindStatement(collection.Find().Where("a = 3")).FetchAll().Count, Is.EqualTo(3)); + + Assert.That(ExecuteModifyStatement(collection.Modify("a IN [3]").Set("a", 1)).AffectedItemsCount, Is.EqualTo(3)); + Assert.That(ExecuteFindStatement(collection.Find().Where("a = 1")).FetchAll().Count, Is.EqualTo(3)); + + Assert.That(ExecuteModifyStatement(collection.Modify("1 IN c.e").Set("c.e", "newValue")).AffectedItemsCount, Is.EqualTo(2)); + Assert.That(ExecuteFindStatement(collection.Find().Where("c.e = \"newValue\"")).FetchAll().Count, Is.EqualTo(2)); + } + + [Test] + public void ReplaceOne() + { + Collection collection = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + Result result = ExecuteAddStatement(collection.Add(docs)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(4)); + + // Expected exceptions. + Assert.Throws(() => collection.ReplaceOne(null, docs[1])); + Assert.Throws(() => collection.ReplaceOne("", docs[1])); + Assert.Throws(() => collection.ReplaceOne(string.Empty, docs[1])); + Assert.Throws(() => collection.ReplaceOne("1", null)); + // Replace using no matching id + Assert.Throws(() => collection.ReplaceOne(3, new DbDoc("{ \"_id\": 2, \"name\": \"John\", \"lastName\": \"Smith\" }")), + ResourcesX.ReplaceWithNoMatchingId); + + var newDoc = new { _id = 1, title = "Book 11", pages = 311 }; + + // Replace using a numeric identifier. + Assert.That(collection.ReplaceOne(1, newDoc).AffectedItemsCount, Is.EqualTo(1)); + DbDoc document = collection.GetOne(1); + Assert.That(Convert.ToInt32(document.Id), Is.EqualTo(1)); + Assert.That(document["title"], Is.EqualTo("Book 11")); + Assert.That(Convert.ToInt32(document["pages"]), Is.EqualTo(311)); + + // Replace using a string identifier. + Assert.That(collection.ReplaceOne("2", new DbDoc("{ \"name\": \"John\", \"lastName\": \"Smith\" }")).AffectedItemsCount, Is.EqualTo(1)); + document = collection.GetOne(2); + Assert.That(Convert.ToInt32(document.Id), Is.EqualTo(2)); + Assert.That(document["name"], Is.EqualTo("John")); + Assert.That(document["lastName"], Is.EqualTo("Smith")); + + // Replace a non-existing document. + Assert.That(collection.ReplaceOne(5, docs[1]).AffectedItemsCount, Is.EqualTo(0)); + Assert.That(collection.GetOne(5) == null); + } + + [Test] + public void ReplaceNestedDocument() + { + var collection = CreateCollection("test"); + var docs = new DbDoc[] + { + new DbDoc(@"{ ""_id"":1, ""pages"":20, ""title"":""Book 1"", ""person"": { ""name"": ""Fred"", ""age"":45 } }" ), + new DbDoc(@"{ ""_id"": 2, ""pages"": 30,""title"" : ""Book 2"", ""person"": { ""name"": ""Peter"", ""age"": 38 } }"), + new DbDoc(@"{ ""_id"": 3, ""pages"": 40,""title"" : ""Book 3"", ""person"": { ""name"": ""Andy"", ""age"": 25 } }"), + new DbDoc(@"{ ""_id"": 4, ""pages"": 50,""title"" : ""Book 4"", ""person"": { ""name"": ""John"", ""age"": 34 } }") + }; + Assert.That(ExecuteAddStatement(collection.Add(docs)).AffectedItemsCount, Is.EqualTo(4)); + + DbDoc d_new = new DbDoc(@"{ ""_id"": 1, ""pages"": 20,""title"" : ""Book 1"", ""person"": { ""name"": ""Fred"", ""age"": 45 ,""State"" : ""Ohio""} }"); + Assert.That(collection.ReplaceOne(1, d_new).AffectedItemsCount, Is.EqualTo(1)); + DbDoc document = collection.GetOne(1); + Assert.That((document.values["person"] as Dictionary)["State"], Is.EqualTo("Ohio")); + + d_new = new DbDoc(@"{ ""_id"": 1, ""pages"": 20,""title"" : ""Book 1"", ""person"": { ""name"": ""Fred"", ""age"": 45 ,""State"" : ""Ohio"", ""newProp"": { ""a"":33 } } }"); + Assert.That(collection.ReplaceOne(1, d_new).AffectedItemsCount, Is.EqualTo(1)); + document = collection.GetOne(1); + Assert.That(((document.values["person"] as Dictionary)["newProp"] as Dictionary)["a"], Is.EqualTo(33)); + } + + [Test] + public void ArrayInsert() + { + Collection collection = CreateCollection("test"); + ExecuteAddStatement(collection.Add("{ \"x\":[1,2] }")); + + // x[1]=43, x[2]=2. + ExecuteModifyStatement(collection.Modify("true").ArrayInsert("x[1]", 43)); + // x[3]=44. + ExecuteModifyStatement(collection.Modify("true").ArrayInsert("x[3]", 44)); + // Since array only contains 4 items the value 46 is assigned to x[4]. + ExecuteModifyStatement(collection.Modify("true").ArrayInsert("x[5]", 46)); + // Since array only contains 5 items the value 50 is assigned to x[5]. + ExecuteModifyStatement(collection.Modify("true").ArrayInsert("x[20]", 50)); + // Assign an item from different data type. + ExecuteModifyStatement(collection.Modify("true").ArrayInsert("x[6]", "string")); + // Assign a document. + ExecuteModifyStatement(collection.Modify("true").ArrayInsert("x[7]", "{ \"name\":\"Mike\" }")); + + var result = ExecuteFindStatement(collection.Find()); + var document = result.FetchOne(); + var x = (object[])document.values["x"]; + + Assert.That(x.Length, Is.EqualTo(8)); + Assert.That((int)x[0], Is.EqualTo(1)); + Assert.That((int)x[1], Is.EqualTo(43)); + Assert.That((int)x[2], Is.EqualTo(2)); + Assert.That((int)x[3], Is.EqualTo(44)); + Assert.That((int)x[4], Is.EqualTo(46)); + Assert.That((int)x[5], Is.EqualTo(50)); + Assert.That(x[6], Is.EqualTo("string")); + Assert.That(new DbDoc(x[7]) is DbDoc); + + // No value is inserted if the array doesn't exist. + ExecuteModifyStatement(collection.Modify("true").ArrayInsert("y[0]", 1)); + + result = ExecuteFindStatement(collection.Find()); + document = result.FetchOne(); + Assert.That(document.values.ContainsKey("y"), Is.False); + + ExecuteModifyStatement(collection.Modify("true").ArrayInsert("x[0]", null)); + ExecuteModifyStatement(collection.Modify("true").ArrayInsert("x[1]", " ")); + + result = ExecuteFindStatement(collection.Find()); + document = result.FetchOne(); + x = (object[])document.values["x"]; + Assert.That(x[0], Is.Null); + Assert.That(x[1], Is.EqualTo(" ")); + + // Insert an empty string fails. + var ex = Assert.Throws(() => ExecuteModifyStatement(collection.Modify("true").ArrayInsert("x[0]", ""))); + Assert.That(ex.Message, Does.Contain("String can't be empty")); + ex = Assert.Throws(() => ExecuteModifyStatement(collection.Modify("true").ArrayInsert("x[0]", string.Empty))); + Assert.That(ex.Message, Does.Contain("String can't be empty")); + + // Not specifying an index raises an error. + var ex2 = Assert.Throws(() => ExecuteModifyStatement(collection.Modify("true").ArrayInsert("dates", "5/1/2018"))); + Assert.That(ex2.Message, Is.EqualTo("A path expression is not a path to a cell in an array.")); + + var col = CreateCollection("my_collection"); + var t1 = "{\"_id\": \"1001\", \"ARR\":[1,2,3], \"ARR1\":[\"name1\",\"name2\", \"name3\"]}"; + col.Add(t1).Execute(); + col.Modify("true").ArrayInsert("ARR[0]", 4).Execute(); + col.Modify("true").ArrayInsert("ARR1[0]", "name4").Execute(); + col.Modify("true").ArrayInsert("ARR[0]", "name5").Execute(); + col.Modify("true").ArrayInsert("ARR1[0]", 5).Execute(); + col.Modify("true").ArrayInsert("ARR[0]", 6).ArrayInsert("ARR1[0]", "name6").ArrayInsert("ARR[0]", 7).ArrayInsert("ARR[0]", 8).Execute(); + col.Modify("true").ArrayInsert("ARR1[0]", null).Execute(); + col.Modify("true").ArrayInsert("ARR1[0]", " ").Execute(); + col.Modify("true").ArrayInsert("ARR1[0]", "****").Execute(); + result = ExecuteFindStatement(col.Find()); + document = result.FetchOne(); + var x2 = (object[])document.values["ARR"]; + Assert.That(x2.Length, Is.EqualTo(8)); + Assert.That((int)x2[0], Is.EqualTo(8)); + x2 = (object[])document.values["ARR1"]; + Assert.That(x2[0], Is.EqualTo("****")); + Assert.That(x2[8], Is.EqualTo("name3")); + } + + [Test] + public void ArrayAppendWithMySqlExpression() + { + Collection collection = CreateCollection("test"); + + // String containing an expression is not evaluted. + ExecuteAddStatement(collection.Add("{ \"_id\":\"123\", \"name\":\"alice\", \"email\":[ \"alice@ora.com\" ], \"dates\":\"4/1/2017\" }")); + ExecuteModifyStatement(collection.Modify("true").ArrayAppend("email", "UPPER($.name)")); + var document = collection.GetOne("123"); + Assert.That((document["email"] as object[])[1], Is.EqualTo("UPPER($.name)")); + + // Use MySqlExpression. + ExecuteAddStatement(collection.Add("{ \"_id\":\"124\", \"name\":\"alice\", \"value\":[ \"alice@ora.com\" ], \"dates\":\"4/1/2017\" }")); + ExecuteModifyStatement(collection.Modify("_id = \"124\"").ArrayAppend("value", new MySqlExpression("UPPER($.name)"))); + document = collection.GetOne("124"); + Assert.That((document["value"] as object[])[1], Is.EqualTo("ALICE")); + + // Use embedded MySqlExpression. + ExecuteAddStatement(collection.Add("{ \"_id\":\"125\", \"name\":\"alice\", \"value\":[ \"alice@ora.com\" ], \"dates\":\"4/1/2017\" }")); + ExecuteModifyStatement(collection.Modify("_id = \"125\"").ArrayAppend("value", new { expression = new MySqlExpression("UPPER($.name)") })); + document = collection.GetOne("125"); + var item = ((document["value"] as object[])[1] as Dictionary); + Assert.That(item["expression"], Is.EqualTo("ALICE")); + + ExecuteAddStatement(collection.Add("{ \"_id\":\"126\", \"name\":\"alice\", \"value\":[ \"alice@ora.com\" ], \"dates\":\"4/1/2017\" }")); + ExecuteModifyStatement(collection.Modify("_id = \"126\"").ArrayAppend("value", new { expression = new MySqlExpression("UPPER($.name)"), literal = "UPPER($.name)" })); + document = collection.GetOne("126"); + item = ((document["value"] as object[])[1] as Dictionary); + Assert.That(item["expression"], Is.EqualTo("ALICE")); + Assert.That(item["literal"], Is.EqualTo("UPPER($.name)")); + } + + [Test] + public void ArrayAppendUsesCorrectDataTypes() + { + Collection collection = CreateCollection("test"); + ExecuteAddStatement(collection.Add("{ \"_id\":\"123\", \"email\":[ \"alice@ora.com\"], \"dates\":\"4/1/2017\" }")); + ExecuteModifyStatement(collection.Modify("true").ArrayAppend("dates", "1")); + ExecuteModifyStatement(collection.Modify("true").ArrayAppend("dates", 1)); + var document = collection.GetOne("123"); + var dates = document["dates"] as object[]; + Assert.That(dates[1] is string); + Assert.That(dates[2] is int); + } + + [Test] + public void ArrayAppend() + { + Collection collection = CreateCollection("test"); + ExecuteAddStatement(collection.Add("{ \"x\":[1,2] }")); + + // Append values of different types, null and spaces. + ExecuteModifyStatement(collection.Modify("true").ArrayAppend("x", 43)); + ExecuteModifyStatement(collection.Modify("true").ArrayAppend("x", "string")); + ExecuteModifyStatement(collection.Modify("true").ArrayAppend("x", true)); + ExecuteModifyStatement(collection.Modify("true").ArrayAppend("x", null)); + ExecuteModifyStatement(collection.Modify("true").ArrayAppend("x", " ")); + var result = ExecuteFindStatement(collection.Find()); + DbDoc document = result.FetchOne(); + var x = (object[])document.values["x"]; + + Assert.That(x.Length, Is.EqualTo(7)); + Assert.That((int)x[0], Is.EqualTo(1)); + Assert.That((int)x[1], Is.EqualTo(2)); + Assert.That((int)x[2], Is.EqualTo(43)); + Assert.That(x[3], Is.EqualTo("string")); + Assert.That(x[4], Is.EqualTo(true)); + Assert.That(x[5], Is.Null); + Assert.That(x[6], Is.EqualTo(" ")); + + // No value is appended if the array doesn't exist. + ExecuteModifyStatement(collection.Modify("true").ArrayAppend("y", 45)); + + result = ExecuteFindStatement(collection.Find()); + document = result.FetchOne(); + Assert.That(document.values.ContainsKey("y"), Is.False); + + var ex = Assert.Throws(() => ExecuteModifyStatement(collection.Modify("true").ArrayAppend("x", ""))); + Assert.That(ex.Message, Does.Contain("String can't be empty")); + ex = Assert.Throws(() => ExecuteModifyStatement(collection.Modify("true").ArrayAppend("x", string.Empty))); + Assert.That(ex.Message, Does.Contain("String can't be empty")); + + var col = CreateCollection("my_collection"); + var t1 = "{\"_id\": \"1001\", \"ARR\":[1,2,3], \"ARR1\":[\"name1\",\"name2\", \"name3\"]}"; + col.Add(t1).Execute(); + col.Modify("true").ArrayAppend("ARR", 4).Execute(); + col.Modify("true").ArrayAppend("ARR1", "name4").Execute(); + col.Modify("true").ArrayAppend("ARR", "name5").Execute(); + col.Modify("true").ArrayAppend("ARR1", 5).Execute(); + col.Modify("true").ArrayAppend("ARR", 6).ArrayAppend("ARR1", "name6").ArrayAppend("ARR", 7).ArrayAppend("ARR", 8).Execute(); + + Assert.Throws(() => ExecuteModifyStatement(col.Modify("true").ArrayAppend("ARR1", ""))); + } + + [Test] + public void ArrayInsertWithMySqlExpression() + { + Collection collection = CreateCollection("test"); + ExecuteAddStatement(collection.Add("{ \"x\":[1,2] }")); + + // String containing an expression is not evaluted. + ExecuteAddStatement(collection.Add("{ \"_id\":\"123\", \"name\":\"alice\", \"email\":[ \"alice@ora.com\" ], \"dates\":\"4/1/2017\" }")); + ExecuteModifyStatement(collection.Modify("true").ArrayInsert("email[0]", "UPPER($.name)")); + var document = collection.GetOne("123"); + Assert.That((document["email"] as object[])[0], Is.EqualTo("UPPER($.name)")); + + // Use MySqlExpression. + ExecuteAddStatement(collection.Add("{ \"_id\":\"124\", \"name\":\"alice\", \"email\":[ \"alice@ora.com\" ], \"dates\":\"4/1/2017\" }")); + ExecuteModifyStatement(collection.Modify("_id = \"124\"").ArrayInsert("email[0]", new MySqlExpression("UPPER($.name)"))); + document = collection.GetOne("124"); + Assert.That((document["email"] as object[])[0], Is.EqualTo("ALICE")); + + // Use embedded MySqlExpression. + ExecuteAddStatement(collection.Add("{ \"_id\":\"125\", \"name\":\"alice\", \"email\":[ \"alice@ora.com\" ], \"dates\":\"4/1/2017\" }")); + ExecuteModifyStatement(collection.Modify("_id = \"125\"").ArrayInsert("email[0]", new { other = new MySqlExpression("UPPER($.name)") })); + document = collection.GetOne("125"); + var item = ((document["email"] as object[])[0] as Dictionary); + Assert.That(item["other"], Is.EqualTo("ALICE")); + + ExecuteAddStatement(collection.Add("{ \"_id\":\"126\", \"name\":\"alice\", \"email\":[ \"alice@ora.com\" ], \"dates\":\"4/1/2017\" }")); + ExecuteModifyStatement(collection.Modify("_id = \"126\"").ArrayInsert("email[0]", new { other = new MySqlExpression("UPPER($.name)"), literal = "UPPER($.name)" })); + document = collection.GetOne("126"); + item = ((document["email"] as object[])[0] as Dictionary); + Assert.That(item["other"], Is.EqualTo("ALICE")); + Assert.That(item["literal"], Is.EqualTo("UPPER($.name)")); + } + + [Test] + public void ArrayOperationsKeepDateValue() + { + Collection collection = CreateCollection("test"); + Result r = ExecuteAddStatement(collection.Add("{ \"_id\": \"123\", \"email\":[\"alice@ora.com\"], \"dates\": \"5/1/2018\" }")); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1ul)); + + // No items are affected since dates isn't an array. + r = ExecuteModifyStatement(collection.Modify("true").ArrayInsert("dates[0]", "4/1/2018")); + Assert.That(r.AffectedItemsCount, Is.EqualTo(0ul)); + + // Converts a non array to an array by appending a value. + ExecuteModifyStatement(collection.Modify("true").ArrayAppend("dates", "6/1/2018")); + + // Array insert at specified index is now succesful since dates is an array. + ExecuteModifyStatement(collection.Modify("true").ArrayInsert("dates[0]", "4/1/2018")); + + DbDoc document = collection.GetOne("123"); + object[] dates = document["dates"] as object[]; + Assert.That(dates.Length, Is.EqualTo(3)); + Assert.That(dates[0], Is.EqualTo("4/1/2018")); + Assert.That(dates[1], Is.EqualTo("5/1/2018")); + Assert.That(dates[2], Is.EqualTo("6/1/2018")); + } + + [Test] + public void Alphanumeric() + { + Collection collection = CreateCollection("test"); + var document = new DbDoc(); + + for (int i = 0; i < 30; i++) + { + document.SetValue("_id", i); + document.SetValue("books", "test" + i); + document.SetValue("pages", i + 10); + document.SetValue("reviewers", "reviewers" + i); + document.SetValue("person", new + { + name = "Fred" + i, + age = i + }); + document.SetValue("1address", "street" + i); + ExecuteAddStatement(collection.Add(document)); + } + + var crudresult = collection.Find("pages=10").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(1), "Count should be 1 before Unset of pages for _id=0."); + var result = collection.Modify("_id = 0").Unset("pages").Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1), "Affected Items Count when modify unset is used"); + crudresult = collection.Find("pages=10").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(0), "Count should be 0 after Unset of pages for _id=0"); + crudresult = collection.Find("books='test0'").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(1), "Count should be 0 after Unset of pages for _id=0"); + + result = collection.Modify("_id = 21").Unset("1address").Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1), "Affected Items Count when modify unset(multiple docs) is used"); + } + + [Test] + public void UnsetVariations() + { + Collection collection = CreateCollection("test"); + var document = new DbDoc("{ \"_id\":1, \"pages\":1, \"pages2\":2, \"pages3\":3, \"pages4\":{ \"internalPages\":4 } }"); + ExecuteAddStatement(collection.Add(document)); + + // Whitespace is ignored. + ExecuteModifyStatement(collection.Modify("_id = 1").Unset("pages ")); + Assert.That(collection.GetOne(1).values.ContainsKey("pages"), Is.False); + ExecuteModifyStatement(collection.Modify("_id = 1").Unset(" pages2 ")); + Assert.That(collection.GetOne(1).values.ContainsKey("pages2"), Is.False); + ExecuteModifyStatement(collection.Modify("_id = 1").Unset(" pages3")); + Assert.That(collection.GetOne(1).values.ContainsKey("pages3"), Is.False); + ExecuteModifyStatement(collection.Modify("_id = 1").Unset(" pages4.internalPages ")); + Assert.That(collection.GetOne(1).values.ContainsKey("pages4")); + Assert.That(collection.GetOne(1).values.ContainsKey("pages4.internalPages"), Is.False); + + // Error is raised with incorrect document path. + var ex = Assert.Throws(() => ExecuteModifyStatement(collection.Modify("_id = 1").Unset("pages*"))); + Assert.That(ex.Message, Is.EqualTo("Invalid document path.")); + ex = Assert.Throws(() => ExecuteModifyStatement(collection.Modify("_id = 1").Unset("pages!"))); + Assert.That(ex.Message, Is.EqualTo("Invalid document path.")); + ex = Assert.Throws(() => ExecuteModifyStatement(collection.Modify("_id = 1").Unset("pages*data"))); + Assert.That(ex.Message, Is.EqualTo("Invalid document path.")); + } + + #region WL14389 + + [Test, Description("Collection.Modify(condition).Unset() to accept a list of elements instead of just one.")] + public void CollectionModifyUnset() + { + List idStringList = new List(); + var col = CreateCollection("my_collection"); + var d1 = new DbDoc(); + for (int i = 0; i < 30; i++) + { + d1.SetValue("_id", i); + d1.SetValue("books", "test" + i); + d1.SetValue("pages", i + 10); + d1.SetValue("reviewers", "reviewers" + i); + d1.SetValue("person", new { name = "Fred" + i, age = i }); + d1.SetValue("1address", "street" + i); + col.Add(d1).Execute(); + } + + var crudresult = col.Find("pages=10").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(1), "Count should be 1 before Unset of pages for _id=0."); + var result = col.Modify("_id = 0").Unset("pages").Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1), "Affected Items Count when modify unset is used"); + crudresult = col.Find("pages=10").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(0), "Count should be 0 after Unset of pages for _id=0"); + crudresult = col.Find("books='test0'").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(1), "Count should be 0 after Unset of pages for _id=0"); + + crudresult = col.Find("pages=11").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(1), "Count of pages=11 should be 1 before Unset of pages for _id=1."); + crudresult = col.Find("reviewers='reviewers1'").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(1), "Count of reviewers1 should be 1 before Unset of pages for _id=1."); + result = col.Modify("_id = 1").Unset("pages").Unset("reviewers").Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1), "Affected Items Count when modify multiple unset is used"); + crudresult = col.Find("pages=11").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(0), "Count should be 0 after Unset of pages for _id=1"); + crudresult = col.Find("reviewers='reviewers1'").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(0), "Count should be 0 after Unset of pages for _id=1"); + + crudresult = col.Find("pages=21").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(1), "Count of pages=21 should be 1 before Unset of pages for _id=11."); + crudresult = col.Find("reviewers='reviewers11'").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(1), "Count of reviewers11 should be 1 before Unset of pages for _id=11."); + result = col.Modify("_id = 11").Unset(new string[] { "pages", "reviewers" }).Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1), "Affected Items Count when modify unset(multiple docs) is used"); + crudresult = col.Find("pages=21").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(0), "Count should be 0 after Unset of pages for _id=11"); + crudresult = col.Find("reviewers='reviewers11'").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(0), "Count should be 0 after Unset of pages for _id=11"); + + crudresult = col.Find("pages=31").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(1), "Count of pages=31 should be 1 before Unset of pages for _id=21."); + crudresult = col.Find("reviewers='reviewers21'").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(1), "Count of reviewers21 should be 1 before Unset of pages for _id=21."); + + result = col.Modify("_id = 21").Unset(" pages ").Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1), "Affected Items Count when modify unset(multiple docs) is used"); + //Should have failed when unset is used for fields with special characters + Assert.Throws(() => ExecuteModifyStatement(col.Modify("_id = 22").Unset("pages*"))); + //Should have failed when unset is used for non-existent fields + Assert.Throws(() => ExecuteModifyStatement(col.Modify("_id = 21").Unset("1"))); + //Should have failed when unset is used for special characters + Assert.Throws(() => ExecuteModifyStatement(col.Modify("_id = 21").Unset("@*%#^)(-+!~<>?/"))); + //Should have failed when unset is used for special characters + Assert.Throws(() => ExecuteModifyStatement(col.Modify("_id = 21").Unset("*******"))); + + crudresult = col.Find("pages=31").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(0), "Count should be 0 after Unset of pages for _id=21"); + + result = col.Modify("_id = 12").Unset(new string[] { " pages1", "reviewers1" }).Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(0), "Affected Items Count when modify unset(invalid docs) is used"); + crudresult = col.Find("pages=22").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(1), "Count should be 1 after Unset with invalid of pages for _id=12"); + crudresult = col.Find("reviewers='reviewers12'").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(1), "Count should be 1 after Unset with invalid of pages for _id=12"); + //Testcase should have failed when unset is used with null + Assert.Throws(() => ExecuteModifyStatement(col.Modify("_id = 12").Unset(null))); + + crudresult = col.Find("pages=22").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(1), "Count should be 1 after Unset with null of pages for _id=12"); + crudresult = col.Find("reviewers='reviewers12'").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(1), "Count should be 1 after Unset with null of pages for _id=12"); + + Assert.Throws(() => ExecuteModifyStatement(col.Modify("_id = 12").Unset(""))); + + crudresult = col.Find("pages=22").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(1), "Count should be 1 after Unset with blank of pages for _id=12"); + crudresult = col.Find("reviewers='reviewers12'").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(1), "Count should be 1 after Unset with blank of pages for _id=12"); + + crudresult = col.Find("pages=22").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(1), "Count should be 1 after Unset with blank with space of pages for _id=12"); + crudresult = col.Find("reviewers='reviewers12'").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(1), "Count should be 1 after Unset with blank with space of pages for _id=12"); + + //Testcase should have failed when unset is used with blank and space + Assert.Throws(() => ExecuteModifyStatement(col.Modify("_id = 12").Unset(new string[] { "", " ", "pages" }))); + + crudresult = col.Find("pages=22").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(1)); + crudresult = col.Find("reviewers='reviewers12'").Execute().FetchAll(); + Assert.That(crudresult.Count, Is.EqualTo(1)); + } + + [Test, Description("All Bug Fixes")] + public void ValidateValuesAfterAppendAndInserts() + { + DbDoc document = null; + Collection collection = CreateCollection("test"); + Result r = collection.Add("{ \"_id\": \"123\", \"email\": [\"alice@ora.com\"], " + + "\"dates\": \"4/1/2017\" }").Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + collection.Modify("true").ArrayAppend("dates", "5/1/2018").Execute(); + document = collection.GetOne("123"); + object[] dates = document["dates"] as object[]; + Assert.That(dates.Length, Is.EqualTo(2)); + Assert.That(dates[0], Is.EqualTo("4/1/2017"), "Existing Date"); + Assert.That(dates[1], Is.EqualTo("5/1/2018"), "Appended Date"); + collection.Modify("true").ArrayInsert("dates[0]", "5/1/2059").Execute(); + document = collection.GetOne("123"); + dates = document["dates"] as object[]; + Assert.That(dates[0], Is.EqualTo("5/1/2059"), "Inserted Date"); + + collection = CreateCollection("test"); + r = collection.Add("{ \"_id\": \"123\", \"email\": [\"alice@ora.com\"], " + + "\"dates\": [\"4/1/2017\"] }").Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + collection = CreateCollection("test"); + r = collection.Add("{ \"_id\": \"123\", \"email\": [\"alice@ora.com\"], " + + "\"dates\": \"4/1/2017\" }").Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + collection.Modify("true").ArrayAppend("dates", "1").Execute(); + collection.Modify("true").ArrayAppend("dates", 1).Execute(); + collection.Modify("true").ArrayAppend("dates", "3.1").Execute(); + collection.Modify("true").ArrayAppend("dates", 3.1).Execute(); + document = collection.GetOne("123"); + dates = document["dates"] as object[]; + Assert.That(dates.Length, Is.EqualTo(5)); + Assert.That(dates[0], Is.EqualTo("4/1/2017"), "Existing Date"); + Assert.That(dates[1], Is.EqualTo("1"), "Appended Date"); + Assert.That(dates[2], Is.EqualTo(1), "Appended Date"); + Assert.That(dates[3], Is.EqualTo("3.1"), "Appended Date"); + Assert.That(dates[4], Is.EqualTo(3.1), "Appended Date"); + + collection.Modify("true").ArrayInsert("dates[0]", "10").Execute(); + collection.Modify("true").ArrayInsert("dates[0]", 1000).Execute(); + collection.Modify("true").ArrayInsert("dates[0]", "3.1").Execute(); + collection.Modify("true").ArrayInsert("dates[0]", 22.7).Execute(); + document = collection.GetOne("123"); + dates = document["dates"] as object[]; + Assert.That(dates[3], Is.EqualTo("10"), "Inserted Date"); + Assert.That(dates[2], Is.EqualTo(1000), "Inserted Date"); + Assert.That(dates[1], Is.EqualTo("3.1"), "Inserted Date"); + Assert.That(dates[0], Is.EqualTo(22.7), "Inserted Date"); + + var d1 = new DbDoc(); + for (int i = 0; i < 30; i++) + { + d1.SetValue("_id", i); + d1.SetValue("books", "test" + i); + d1.SetValue("pages", i + 10); + d1.SetValue("reviewers", "reviewers" + i); + d1.SetValue("person", new + { + name = "Fred" + i, + age = i + }); + d1.SetValue("1address", "street" + i); + collection.Add(d1).Execute(); + } + Assert.Throws(() => ExecuteModifyStatement(collection.Modify("_id = 21").Unset("pages*"))); + + var docs = new[] + { + new { _id = 100, title = "Book 1", pages = 20 }, + new { _id = 200, title = "Book 2", pages = 30 }, + new { _id = 300, title = "Book 3", pages = 40 }, + new { _id = 400, title = "Book 4", pages = 50 }, + }; + r = collection.Add(docs).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4), "Matching the records affected"); + var test1 = collection.Find("pages = :Pages").Bind("pAges", 90).Fields("{\"_id\":100,\"pages\": 20 }").Execute(); + Assert.That(test1, Is.Not.Null); + } + + [Test, Description("Collection.modify(condition).arrayAppend(CollectionField, ExprOrLiteral)")] + public void CollectionModifyArrayAppend() + { + + string currentYear = DateTime.Now.Year.ToString(); + DbDoc document = null; + string t1 = "{\"_id\": \"1\", \"name\": \"Alice\" }"; + var collection = CreateCollection("test"); + Result r = collection.Add(t1).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + object[] expressions1 = new object[] { "YEAR('2000-01-01')", "MONTH('2008-02-03')", "WEEK('2008-02-20')", "DAY('2008-02-20')", "HOUR('10:05:03')", + "MINUTE('2008-02-03 10:05:03')","SECOND('10:05:03')","MICROSECOND('12:00:00.123456')","QUARTER('2008-04-01')","TIME('2003-12-31 01:02:03')","DATE('2003-12-31 01:02:03')", + "Year(CURDATE())"}; + + object[] expressions2 = new object[] { "5/1/2018",2012,"2012",-22.7,22.7,"22.7", "'large'", + "'838:59:59'" ,true,-100000000,"-10000000000","6/6/2018","9999-12-31 23:59:59","0000-00-00 00:00:00","[a,b,c]","[]"}; + object[] compare_expressions1 = new object[] { 2000, 2, 7, 20, 10, 5, 3, 123456, 2, "01:02:03.000000", "2003-12-31", currentYear }; + object[] compare_expressions2 = new object[] { "5/1/2018",2012, "2012", -22.7, 22.7, "22.7", + "'large'", "'838:59:59'", true, -100000000, "-10000000000","6/6/2018" ,"9999-12-31 23:59:59","0000-00-00 00:00:00","[a,b,c]","[]"}; + for (int k = 0; k < expressions1.Length; k++) + { + collection.Modify("true").ArrayAppend("name", "{ \"dateAndTimeValue\": " + expressions1[k] + " }").Execute(); + } + for (int k = 0; k < expressions2.Length; k++) + { + collection.Modify("true").ArrayAppend("name", "{ \"dateAndTimeValue\": \"" + expressions2[k] + "\" }").Execute(); + } + object[] actors = null; + object test = null; + Dictionary actor0 = null; + int l = 1; + for (int k = 0; k < compare_expressions1.Length; k++) + { + + document = collection.GetOne("1"); + actors = document["name"] as object[]; + actor0 = actors[l] as Dictionary; + test = actor0["dateAndTimeValue"]; + Assert.That(test.ToString(), Is.EqualTo(compare_expressions1[k].ToString())); + l++; + } + for (int k = 0; k < compare_expressions2.Length; k++) + { + + document = collection.GetOne("1"); + actors = document["name"] as object[]; + actor0 = actors[l] as Dictionary; + test = actor0["dateAndTimeValue"]; + Assert.That(test.ToString(), Is.EqualTo(compare_expressions2[k].ToString())); + l++; + } + + collection = CreateCollection("test"); + r = collection.Add("{ \"_id\": \"123\", \"email\": [\"alice@ora.com\"], " + + "\"dates\": [\"4/1/2017\"] }").Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + var reg_expression = new + { + test1 = new MySqlExpression("UPPER($.email)"), + test2 = new MySqlExpression("LOWER($.email)"), + test3 = new MySqlExpression("CONCAT('No', 'S', 'QL')"), + test4 = new MySqlExpression("CHAR(77, 121, 83, 81, '76')"), + test5 = new MySqlExpression("CONCAT('My', NULL, 'QL')"), + test6 = new MySqlExpression("ELT(4, 'ej', 'Heja', 'hej', 'foo')"), + test7 = new MySqlExpression("REPEAT('MySQL', 3)"), + test8 = new MySqlExpression("REVERSE('abc')"), + test9 = new MySqlExpression("RIGHT('foobarbar', 4)"), + test10 = new MySqlExpression("REPLACE('www.mysql.com', 'w', 'Ww')"), + test11 = new MySqlExpression(" HEX('abc')"), + test12 = new MySqlExpression(" BIN(12)"), + }; + object[] compare_expressions = null; + if (session.Version.isAtLeast(8, 0, 0)) + { + compare_expressions = new object[] { "[\\\"ALICE@ORA.COM\\\"]", "[\\\"alice@ora.com\\\", \\\"[\\\\\\\"alice@ora.com\\\\\\\"]\\\"]", + "NoSQL","base64:type253:TXlTUUw=",null,"foo","MySQLMySQLMySQL","cba","rbar","WwWwWw.mysql.com","616263","1100" }; + } + else + { + compare_expressions = new object[] { "[\\\"ALICE@ORA.COM\\\"]", "[\\\"alice@ora.com\\\", \\\"[\\\\\\\"alice@ora.com\\\\\\\"]\\\"]", + "NoSQL","base64:type15:TXlTUUw=",null,"foo","MySQLMySQLMySQL","cba","rbar","WwWwWw.mysql.com","616263","1100" }; + } + + var items = new List(); + items.Add(reg_expression.test1); + items.Add(reg_expression.test2); + items.Add(reg_expression.test3); + items.Add(reg_expression.test4); + items.Add(reg_expression.test5); + items.Add(reg_expression.test6); + items.Add(reg_expression.test7); + items.Add(reg_expression.test8); + items.Add(reg_expression.test9); + items.Add(reg_expression.test10); + items.Add(reg_expression.test11); + items.Add(reg_expression.test12); + int m = 1, n = 0; + foreach (var obj in items) + { + collection.Modify("true").ArrayAppend("email", obj).Execute(); + document = collection.GetOne("123"); + actors = document["email"] as object[]; + if (n == 3) + { } + else + { + Assert.That(compare_expressions[n], Is.EqualTo(actors[m])); + } + + m++; n++; + } + + string json = ""; + int i = 0, j = 0, maxField = 40; + collection = CreateCollection("test"); + int maxDepth = 2; + json = "{\"_id\":\"1002\",\"XYZ\":1111"; + for (j = 0; j < maxField; j++) + { + json = json + ",\"ARR" + j + "\":["; + for (i = 0; i < maxDepth; i++) + { + json = json + i + ",["; + } + json = json + i; + for (i = maxDepth - 1; i >= 0; i--) + { + json = json + "]," + i; + } + json = json + "]"; + } + json = json + "}"; + + collection.Add(json).Execute(); + r = collection.Modify("true").ArrayAppend("ARR10", 1).ArrayAppend("ARR20", 2).ArrayAppend("ARR30", 3).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + r = collection.Modify("true").ArrayAppend("ARR0", null).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + r = collection.Modify("true").ArrayAppend("ARR39", null).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + } + + [Test, Description("MySQLX CNET Forbid modify() with no condition-Scenario-1")] + public void ForbidModifyWithNoCondition_S1() + { + + Collection collection = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + Result result = collection.Add(docs).Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(4)); + + // Condition can't be null or empty. + Assert.Throws(() => ExecuteModifyStatement(collection.Modify(string.Empty))); + Assert.Throws(() => ExecuteRemoveStatement(collection.Remove(""))); + Assert.Throws(() => ExecuteModifyStatement(collection.Modify(null))); + + // Sending an expression that evaluates to true applies changes on all documents. + result = collection.Modify("true").Set("pages", "10").Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(4)); + + } + + [Test, Description("MySQLX CNET Forbid modify() with no condition-Scenario-2")] + public void ForbidModifyWithNoCondition_S2() + { + + Collection collection = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + Result result = collection.Add(docs).Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(4)); + + // Sending an expression that evaluates to true applies changes on all documents. + //Deprecated Modify().Where() in 8.0.17 + result = collection.Modify("true").Where("false").Set("pages", "10").Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(0)); + + result = collection.Modify("true").Where("true").Set("pages", "10").Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(4)); + result = collection.Modify("false").Where("true").Set("pages", "40").Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(4)); + result = collection.Modify("false").Where("false").Set("pages", "40").Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(0)); + + // Condition can't be null or empty. + Assert.Throws(() => ExecuteModifyStatement(collection.Modify(" "))); + } + + [Test, Description("Test valid modify.patch to change element at Depth n for multiple arrays#Bug))")] + public void ModifyPatchNDepth() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + string json = ""; + int i = 0, j = 0, maxField = 100; + var collection = CreateCollection("test"); + int maxDepth = 46; + json = "{\"_id\":\"1002\",\"XYZ\":1111"; + for (j = 0; j < maxField; j++) + { + json = json + ",\"ARR" + j + "\":["; + for (i = 0; i < maxDepth; i++) + { + json = json + i + ",["; + } + json = json + i; + for (i = maxDepth - 1; i >= 0; i--) + { + json = json + "]," + i; + } + json = json + "]"; + } + json = json + "}"; + + var r = collection.Modify("age = :age").Patch(json). + Bind("age", "18").Execute(); + Assert.That(r, Is.Not.Null); + } + + [Test, Description("Test valid modify.patch with condition/limit/OrderBy")] + public void ModifyPatch() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + var collection = CreateCollection("test"); + var docs = new[] + { + new {_id = 1, title = "Book 1", pages = 20, age = 12}, + new {_id = 2, title = "Book 2", pages = 30,age = 18}, + new {_id = 3, title = "Book 3", pages = 40,age = 34}, + new {_id = 4, title = "Book 4", pages = 50,age = 15} + }; + var r = collection.Add(docs).Execute(); + Assert.That((int)r.AffectedItemsCount, Is.EqualTo(4), "Matching the updated record count"); + + var jsonParams = new { title = "Book 100" }; + var foundDocs = collection.Modify("age==18").Patch(jsonParams).Execute(); + Assert.That((int)foundDocs.AffectedItemsCount, Is.EqualTo(1), "Matching the record count"); + + var document = collection.GetOne("2"); + Assert.That(document["title"], Is.EqualTo("Book 100")); + + jsonParams = new { title = "Book 300" }; + r = collection.Modify("age<18").Patch(jsonParams).Limit(1).Execute(); + Assert.That((int)r.AffectedItemsCount, Is.EqualTo(1), "Matching the record count"); + + document = collection.GetOne(1); + Assert.That(document["title"], Is.EqualTo("Book 300")); + + var jsonParams1 = new { title = "Book 10", pages = 1000 }; + r = collection.Modify("age>30").Patch(jsonParams1).Sort("age ASC").Execute(); + Assert.That((int)r.AffectedItemsCount, Is.EqualTo(1), "Matching the record count"); + } + + [Test, Description("Test valid modify.patch with set/unset")] + public void ModifyPatchWithSetUnset() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + var collection = CreateCollection("test"); + var docs = new[] + { + new {_id = 1, title = "Book 1", pages = 20, age = "12"}, + new {_id = 2, title = "Book 2", pages = 30,age = "18"}, + new {_id = 3, title = "Book 3", pages = 40,age = "34"}, + new {_id = 4, title = "Book 4", pages = 50,age = "12"} + }; + Result r = collection.Add(docs).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4)); + + var jsonParams = new { title = "Book 500" }; + r = collection.Modify("age = :age").Patch(jsonParams).Bind("age", "18"). + Set("pages", "5000").Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + var document = collection.GetOne("2"); + Assert.That(document["pages"].ToString(), Is.EqualTo("5000")); + Assert.That(document["title"].ToString(), Is.EqualTo("Book 500")); + + var jsonParams1 = new { title = "Book 50000", pages = 5000 }; + r = collection.Modify("age = :age").Patch(jsonParams1).Bind("age", "18"). + Unset("pages").Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1), "Match being done"); + document = collection.GetOne("2"); + DbDoc test = null; + Assert.Throws(() => test = (DbDoc)document["pages"]); + Assert.That(document["title"], Is.EqualTo("Book 50000")); + } + + [Test, Description("Test invalid modify.patch to attempt to change _id using modify.patch")] + public void ModifyPatchChangeId() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + var collection = CreateCollection("test"); + var docs = new[] + { + new {_id = 1, title = "Book 1", pages = 20, age = 12}, + new {_id = 2, title = "Book 2", pages = 30,age = 18}, + new {_id = 3, title = "Book 3", pages = 40,age = 34}, + new {_id = 4, title = "Book 4", pages = 50,age = 12} + }; + Result r = collection.Add(docs).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4)); + var document = collection.GetOne("1"); + var jsonParams = new { _id = 123 }; + + r = collection.Modify("age = :age").Patch(jsonParams). + Bind("age", 18).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(0)); + + var jsonParams2 = new { _id = 123, title = "Book 4000" }; + + r = collection.Modify("age = :age").Patch(jsonParams2). + Bind("age", 18).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + string jsonParams1 = "{ \"_id\": \"123\"}"; + r = collection.Modify("age = :age").Patch(jsonParams1). + Bind("age", 18).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(0)); + + jsonParams1 = "{ \"_id\": \"123\",\"title\": \"Book 400\"}"; + r = collection.Modify("age = :age").Patch(jsonParams1). + Bind("age", 18).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + } + + [Test, Description("Test modify.patch where the key to be modified has array, dbDoc and normal constant value and condition is matched for all.")] + public void ModifyPatchKeyWithArray() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + var collection = CreateCollection("test"); + var docs1 = new[] + { + new {_id = 1, title = "Book 1", pages = 20, age = 12,name = "Morgan"}, + }; + var docs2 = + "{\"_id\": \"2\",\"age\": 12,\"name\": \"Alice\", " + + "\"address\": {\"zip\": \"12345\", \"city\": \"Los Angeles\", \"street\": \"32 Main str\"}}"; + + var docs3 = "{\"_id\": \"3\", \"age\": 12,\"name\":[\"Cynthia\"], \"ARR1\":[\"name1\",\"name2\", \"name3\"]}"; + Result r = collection.Add(docs1).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + r = collection.Add(docs2).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + r = collection.Add(docs3).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + var jsonParams = new { name = "Changed" }; + r = collection.Modify("age = :age").Patch(jsonParams).Bind("age", 12).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(3)); + } + + [Test, Description("Test that documents not matching conditions are not modified.")] + public void ModifyPatchNotMatchingConditions() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + var collection = CreateCollection("test"); + var docs = new[] + { + new {_id = 1, title = "Book 1", pages = 20, age = 12}, + new {_id = 2, title = "Book 2", pages = 30,age = 18}, + new {_id = 3, title = "Book 3", pages = 40,age = 34}, + new {_id = 4, title = "Book 4", pages = 50,age = 12} + }; + Result r = collection.Add(docs).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4)); + var document = collection.GetOne("1"); + var jsonParams = new { title = "Book 100" }; + r = collection.Modify("age = :age").Patch(jsonParams).Bind("age", "19").Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(0)); + string jsonParams1 = "{ \"title\": \"Book 100\"}"; + r = collection.Modify("age = :age").Patch(jsonParams1).Bind("age", "28").Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(0)); + jsonParams1 = "{ \"unknownvalues\": null}"; + r = collection.Modify("age = :age").Patch(jsonParams1).Bind("age", "28").Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(0)); + } + + [Test, Description("Test modify.patch with different types of records(anonymous object,Json String,DbDoc) with same key and try to replace using a patch")] + public void ModifyPatchDifferentTypesSameKey() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + var collection = CreateCollection("test"); + var docs1 = new[] + { + new {_id = 1, title = "Book 1", pages = 20, age = 12,name = "Morgan"}, + }; + var docs2 = + "{\"_id\": \"2\",\"age\": \"12\",\"name\": \"Alice\", " + + "\"address\": {\"zip\": \"12345\", \"city\": \"Los Angeles\", \"street\": \"32 Main str\"}}"; + + var docs3 = new DbDoc(@"{ ""_id"": 3, ""pages"": 20, ""age"":12,""name"":""Cynthiaa"", + ""books"": [ + {""_id"" : 10, ""title"" : ""Book 10""}, + { ""_id"" : 20, ""title"" : ""Book 20"" } + ] + }"); + Result r = collection.Add(docs1).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + r = collection.Add(docs2).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + r = collection.Add(docs3).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + var jsonParams = new { name = "Changed" }; + r = collection.Modify("age = :age").Patch(jsonParams). + Bind("age", 12).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2));//docs2 age is the string + } + + [Test, Description("GetOne with ExistingID and NewID with doc(Verify the Immutable feature also))")] + public void GetOneAndRemoveOne() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + var coll = CreateCollection("test"); + var docs = new[] + { + new {_id = 1, title = "Book 1", pages = 20}, + new {_id = 2, title = "Book 2", pages = 30}, + new {_id = 3, title = "Book 3", pages = 40}, + new {_id = 4, title = "Book 4", pages = 50} + }; + var r = coll.Add(docs).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4)); + + // Expected exceptions. + Assert.Throws(() => coll.GetOne(null)); + Assert.Throws(() => coll.GetOne("")); + Assert.Throws(() => coll.GetOne(string.Empty)); + Assert.Throws(() => coll.GetOne(" ")); + + // Get document using numeric parameter. + var document = coll.GetOne(1); + Assert.That(document.Id, Is.EqualTo(1)); + Assert.That(document["title"], Is.EqualTo("Book 1")); + Assert.That(Convert.ToInt32(document["pages"]), Is.EqualTo(20)); + + // Get document using string parameter. + document = coll.GetOne("3"); + Assert.That(document.Id, Is.EqualTo(3)); + Assert.That(document["title"], Is.EqualTo("Book 3")); + Assert.That(Convert.ToInt32(document["pages"]), Is.EqualTo(40)); + + // Get a non-existing document. + document = coll.GetOne(5); + Assert.That(document, Is.EqualTo(null)); + + coll.Add(new { _id = 5, title = "Book 5", pages = 60 }).Execute(); + Assert.That(coll.Find().Execute().FetchAll().Count, Is.EqualTo(5)); + // Remove sending numeric parameter. + //WL11843-Core API v1 alignment Changes + Assert.That(coll.RemoveOne(1).AffectedItemsCount, Is.EqualTo(1)); + Assert.That(coll.Find().Execute().FetchAll().Count, Is.EqualTo(4)); + + // Remove sending string parameter. + Assert.That(coll.RemoveOne("3").AffectedItemsCount, Is.EqualTo(1)); + Assert.That(coll.Find().Execute().FetchAll().Count, Is.EqualTo(3)); + + // Remove an auto-generated id. + document = coll.Find("pages = 60").Execute().FetchOne(); + Assert.That(coll.RemoveOne(document.Id).AffectedItemsCount, Is.EqualTo(1)); + Assert.That(coll.Find().Execute().FetchAll().Count, Is.EqualTo(2)); + + // Remove a non-existing document. + Assert.That(coll.RemoveOne(5).AffectedItemsCount, Is.EqualTo(0)); + Assert.That(coll.Find().Execute().FetchAll().Count, Is.EqualTo(2)); + + } + + [Test, Description("AddReplaceOne with unique id generated by SQL")] + public void AddReplaceOneUniqueId() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + var collection = CreateCollection("test"); + var docs = new[] + { + new {_id = 1, name = "foo"}, + new {_id = 2, name = "bar"} + }; + var result = collection.Add(docs).Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(2)); + + // Add unique index. + session.SQL( + "ALTER TABLE test.test ADD COLUMN name VARCHAR(3) GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(doc, '$.name'))) VIRTUAL UNIQUE KEY NOT NULL") + .Execute(); + Assert.Throws(() => collection.AddOrReplaceOne(1, new { name = "bar" })); + Assert.Throws(() => collection.AddOrReplaceOne(1, new { _id = 3, name = "bar", age = "55" })); + } + + #endregion WL14389 + + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/CustomTypeTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/CustomTypeTests.cs new file mode 100644 index 000000000..675529fbc --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/CustomTypeTests.cs @@ -0,0 +1,188 @@ +// Copyright © 2023, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Common; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace MySqlX.Data.Tests +{ + internal class CustomTypeTests : BaseTest + { + Schema Schema; + Collection Collection; + CustomType[] Data { get; set; } + + public class CustomType + { + public int _id { get; set; } + public string Name { get; set; } + public Dictionary DictData { get; set; } + public DateTime Date { get; set; } + } + + public class Core + { + public int idMeta { get; set; } + public string[] Meta { get; set; } + } + + private void InitCollection() + { + var data = new CustomType[20]; + + for (int i = 0; i < 20; i++) + { + Core core = new() + { + idMeta = i, + Meta = new string[] { $"Core1_{i}", $"Core2_{i}", $"Core3_{i}" } + }; + + Dictionary dictData = new() + { + { $"DictData1_{i}", core }, + { $"DictData2_{i}", core } + }; + + data[i] = new() { _id = i, Name = $"Name_{i}", DictData = dictData, Date = DateTime.Now }; + } + + Data = data; + + Session session = GetSession(); + Schema = session.GetSchema(schemaName); + CreateCollection("test"); + Collection = Schema.GetCollection("test"); + Collection.Add(Data).Execute(); + + var count = session.SQL("SELECT COUNT(*) FROM test.test").Execute().FetchOne()[0]; + Assert.That(Collection.Count(), Is.EqualTo(count)); + } + + [Test] + public void Find() + { + InitCollection(); + + var result = Collection.Find("_id = :id").Bind("id", 1).Execute().FetchOne(); + Assert.That(result, Is.Not.Null); + Assert.That(typeof(CustomType).Equals(result.GetType())); + Assert.That(Data[1].DictData["DictData1_1"].Meta, Is.EqualTo(result.DictData["DictData1_1"].Meta)); + } + + [Test] + public void RemoveOne() + { + InitCollection(); + + var removeStmt = Collection.RemoveOne(1); + Assert.That(removeStmt.AffectedItemsCount, Is.EqualTo(1)); + Assert.That(Collection.Count(), Is.EqualTo(19)); + } + + [TestCase("_id = :id","id",3)] + [TestCase("Name = :name","name", "Name_3")] + public void Remove(string condition, string bind,object value) + { + InitCollection(); + + var removeStmt = Collection.Remove(condition).Bind(bind,value).Execute(); + Assert.That(removeStmt.AffectedItemsCount, Is.EqualTo(1)); + Assert.That(Collection.Count(), Is.EqualTo(19)); + } + + [Test] + public void Modify() + { + InitCollection(); + + CustomType customTypeNew = new() { Date = DateTime.Now, Name = "NewDoc" }; + var modifyStmt = Collection.Modify("_id = :id").Bind("id", 7).Patch(customTypeNew).Execute(); + Assert.That(modifyStmt.AffectedItemsCount, Is.EqualTo(1)); + Assert.That(Collection.GetOne(7).Name, Is.EqualTo("NewDoc")); + } + + [Test] + public void PrepareStatement() + { + InitCollection(); + + var findStmt = Collection.Find("_id = :id and Name = :name").Bind("id", 15).Bind("name", "Name_15"); + var doc = findStmt.Execute(); + Assert.That(doc.FetchOne().Name, Is.EqualTo("Name_15")); + Assert.That(findStmt._isPrepared, Is.False); + + for (int i = 0; i < Data.Length; i++) + { + doc = findStmt.Bind("id", i).Bind("name", $"Name_{i}").Limit(1).Execute(); + Assert.That(doc.FetchOne().Name, Is.EqualTo($"Name_{i}")); + Assert.That(findStmt._isPrepared || !findStmt.Session.SupportsPreparedStatements); + } + } + + [Test] + public void InsertAsync() + { + Session session = GetSession(); + Schema = session.GetSchema(schemaName); + CreateCollection("test"); + Collection = Schema.GetCollection("test"); + var data = new CustomType[20]; + List> tasksList = new List>(); + + for (int i = 0; i < 20; i++) + { + Core core = new() + { + idMeta = i, + Meta = new string[] { $"Core1_{i}", $"Core2_{i}", $"Core3_{i}" } + }; + + Dictionary dictData = new() + { + { $"DictData1_{i}", core }, + { $"DictData2_{i}", core } + }; + + data[i] = new() { _id = i, Name = $"Name_{i}", DictData = dictData, Date = DateTime.Now }; + + tasksList.Add(Collection.Add(data[i]).ExecuteAsync()); + } + + Task.WaitAll(tasksList.ToArray(), TimeSpan.FromMinutes(1)); + + var count = session.SQL("SELECT COUNT(*) FROM test.test").Execute().FetchOne()[0]; + Assert.That(Collection.Count(), Is.EqualTo(count)); + } + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/DbDocTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/DbDocTests.cs new file mode 100644 index 000000000..05f944bae --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/DbDocTests.cs @@ -0,0 +1,139 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySqlX.XDevAPI; +using System; +using NUnit.Framework; +using NUnit.Framework.Legacy; + +namespace MySqlX.Data.Tests +{ + public class DbDocTests + { + private string RemoveLineEndings(string str) + { + return str.Replace("\r\n", string.Empty).Replace("\r", string.Empty).Replace("\n", string.Empty); + } + + [Test] + public void SimpleConverstionToJson() + { + DbDoc d = new DbDoc(); + d.SetValue("_id", 1); + d.SetValue("pages", 20); + string s = d.ToString(); + string json = @"{ + ""_id"": 1, + ""pages"": 20 +}"; + Assert.That(RemoveLineEndings(s), Is.EqualTo(RemoveLineEndings(json)).IgnoreCase); + } + + [Test] + public void SimpleParse() + { + DbDoc d = new DbDoc(@"{ ""id"": 1, ""pages"": 20}"); + DbDoc d2 = new DbDoc(); + d2.SetValue("id", 1); + d2.SetValue("pages", 20); + Assert.That(d.Equals(d2)); + } + + [Test] + public void NestedParse() + { + DbDoc d = new DbDoc(@"{ ""id"": 1, ""pages"": 20, + ""person"": { ""name"": ""Fred"", ""age"": 45 } + }"); + DbDoc d2 = new DbDoc(); + d2.SetValue("id", 1); + d2.SetValue("pages", 20); + d2.SetValue("person", new { name = "Fred", age = 45 }); + Assert.That(d.Equals(d2)); + } + + [Test] + public void ParseWithArray() + { + string json = @"{ + ""id"": 1, + ""pages"": 20, + ""books"": [ + { + ""_id"": 1, + ""title"": ""Book 1"" + }, + { + ""_id"": 2, + ""title"": ""Book 2"" + } + ] +}"; + + string[] lines = json.Split(new string[] { "\r\n", "\r" }, StringSplitOptions.RemoveEmptyEntries); + for (int i = 0; i < lines.Length; i++) + lines[i] = lines[i].Trim(); + + string noFormat = string.Join(" ", lines); + + DbDoc d = new DbDoc(noFormat); + + var docs = new[] + { + new { _id = 1, title = "Book 1" }, + new { _id = 2, title = "Book 2" }, + }; + DbDoc d2 = new DbDoc(); + d2.SetValue("id", 1); + d2.SetValue("pages", 20); + d2.SetValue("books", docs); + Assert.That(d2.ToString(), Is.EqualTo(d.ToString()).IgnoreCase); + Assert.That(RemoveLineEndings(d2.ToString()), Is.EqualTo(RemoveLineEndings(json)).IgnoreCase); + } + + [Test] + public void ParseLongValues() + { + DbDoc d = new DbDoc(@"{ ""id"": 1, ""pages"": " + ((long)int.MaxValue + 1) + "}"); + DbDoc d2 = new DbDoc(); + d2.SetValue("id", 1); + d2.SetValue("pages", (long)int.MaxValue + 1); + Assert.That(d.Equals(d2)); + } + + [Test] + public void ParseFloatValues() + { + DbDoc d = new DbDoc(@"{ ""id"": 1, ""pi"": 3.14159 }"); + DbDoc d2 = new DbDoc(); + d2.SetValue("id", 1); + d2.SetValue("pi", 3.14159); + Assert.That(d.Equals(d2)); + } + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/DnsSrvTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/DnsSrvTests.cs new file mode 100644 index 000000000..0dfaee5e2 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/DnsSrvTests.cs @@ -0,0 +1,145 @@ +// Copyright © 2019, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; + +namespace MySqlX.Data.Tests +{ + /// + /// WL13368 - DNS SRV Support + /// + public class DnsSrvTests : BaseTest + { + [TestCase("server=localhost;port=33060;dns-srv=true;", "Specifying a port number with DNS SRV lookup is not permitted")] + [TestCase("server=localhost,10.10.10.10;dns-srv=true;", "Specifying multiple host names with DNS SRV lookup is not permitted")] + [TestCase("host=localhost,10.10.10.10;dns-srv=TRUE;", "Specifying multiple host names with DNS SRV lookup is not permitted")] + [TestCase("server=(address=localhost,priority=100), (address=10.10.10.10,priority=90);dns-srv=true;", "Specifying multiple host names with DNS SRV lookup is not permitted")] + [TestCase("server=localhost;protocol=unix;Dns-Srv=true;", "Using Unix domain sockets with DNS SRV lookup is not permitted")] + [TestCase("server=localhost;protocol=unixSocket;dns-srv=true;", "Using Unix domain sockets with DNS SRV lookup is not permitted")] + [TestCase("server=localhost;connectionprotocol=unix;DnsSrv=true;", "Using Unix domain sockets with DNS SRV lookup is not permitted")] + public void DnsSrvConnectionStringInvalidConfiguration(string connString, string exceptionMessage) + { + connString = connString.Replace("localhost", Host).Replace("33060", XPort); + var exception = Assert.Throws(() => MySQLX.GetSession(connString)); + Assert.That(exception.Message, Is.EqualTo(exceptionMessage)); + } + + [TestCase("server=localhost;port=33060;dns-srv=false;uid=test;password=test;")] + [TestCase("server=localhost,10.10.10.10;dns-srv=false;uid=test;password=test;")] + [TestCase("server=localhost,10.10.10.10;dns-srv=False;;uid=test;password=test")] + [TestCase("server=(address=localhost,priority=100);DnsSrv=FALSE;uid=test;password=test;")] + [TestCase("server=(address=localhost,priority=100),;dns-srv=false;uid=test;password=test;")] + public void DnsSrvConnectionStringValidConfiguration(string connString) + { + connString = connString.Replace("localhost", Host).Replace("33060", XPort); + using (var session = MySQLX.GetSession(connString)) + Assert.That(session, Is.Not.Null); + } + + [Test] + public void DnsSrvConnectionAnonymousTypeInvalidConfiguration() + { + var sb = new MySqlXConnectionStringBuilder(); + sb.DnsSrv = true; + sb.Port = UInt32.Parse(XPort); + sb.Server = Host; + var exception = Assert.Throws(() => MySQLX.GetSession(sb.ConnectionString)); + Assert.That(exception.Message, Is.EqualTo(MySql.Data.Resources.DnsSrvInvalidConnOptionPort)); + exception = Assert.Throws(() => MySQLX.GetClient(sb.ConnectionString, new { pooling = new { enabled = true } })); + Assert.That(exception.Message, Is.EqualTo(MySql.Data.Resources.DnsSrvInvalidConnOptionPort)); + + sb = new MySqlXConnectionStringBuilder(); + sb.DnsSrv = true; + sb.Server = $"{Host}, 10.10.10.10"; + exception = Assert.Throws(() => MySQLX.GetSession(sb.ConnectionString)); + Assert.That(exception.Message, Is.EqualTo(MySql.Data.Resources.DnsSrvInvalidConnOptionMultihost)); + exception = Assert.Throws(() => MySQLX.GetClient(sb.ConnectionString, new { pooling = new { enabled = true } })); + Assert.That(exception.Message, Is.EqualTo(MySql.Data.Resources.DnsSrvInvalidConnOptionMultihost)); + + sb = new MySqlXConnectionStringBuilder(); + sb.DnsSrv = true; + sb.Server = $"(address={Host},priority=100), (address=10.10.10.10,priority=90)"; + exception = Assert.Throws(() => MySQLX.GetSession(sb.ConnectionString)); + Assert.That(exception.Message, Is.EqualTo(MySql.Data.Resources.DnsSrvInvalidConnOptionMultihost)); + + var connDataHost = new { server = $"(address={Host},priority=100), (address=10.10.10.10,priority=90)", dnssrv = true }; + exception = Assert.Throws(() => MySQLX.GetClient(connDataHost, new { pooling = new { enabled = true } })); + Assert.That(exception.Message, Is.EqualTo(MySql.Data.Resources.DnsSrvInvalidConnOptionMultihost)); + + var connDataPort = new { server = Host, port = XPort, dnssrv = true }; + exception = Assert.Throws(() => MySQLX.GetClient(connDataPort, new { pooling = new { enabled = true } })); + Assert.That(exception.Message, Is.EqualTo(MySql.Data.Resources.DnsSrvInvalidConnOptionPort)); + + var connDataUnix = new { server = Host, protocol = "unix", dnssrv = true }; + exception = Assert.Throws(() => MySQLX.GetClient(connDataUnix, new { pooling = new { enabled = true } })); + Assert.That(exception.Message, Is.EqualTo(MySql.Data.Resources.DnsSrvInvalidConnOptionUnixSocket)); + } + + [TestCase("mysqlx+srv://test:test@localhost:33060", "Specifying a port number with DNS SRV lookup is not permitted")] + [TestCase("mysqlx+srv://test:test@[192.1.10.10,localhost]", "Specifying multiple host names with DNS SRV lookup is not permitted")] + [TestCase("mysqlx+srv://test:test@[192.1.10.10,localhost:33060]/test", "Specifying multiple host names with DNS SRV lookup is not permitted")] + [TestCase("mysqlx+srv://test:test@[(address = server.example, priority = 50),(address = localhost:33060,priority=100)]", "Specifying multiple host names with DNS SRV lookup is not permitted")] + [TestCase("mysqlx+srv://test:test@./tmp/mysql.sock?protocol=unix", "Using Unix domain sockets with DNS SRV lookup is not permitted")] + [TestCase("mysqlx+srv://test:test@localhost?dns-srv=false;", "'dns-srv' cannot be set to false with DNS SRV lookup enabled")] + public void DnsSrvConnectionStringUriInvalidConfiguration(string connStringUri, string exceptionMessage) + { + connStringUri = connStringUri.Replace("localhost", Host).Replace("33060", XPort); + var exception = Assert.Throws(() => MySQLX.GetSession(connStringUri)); + Assert.That(exception.Message, Is.EqualTo(exceptionMessage)); + + exception = Assert.Throws(() => MySQLX.GetClient(connStringUri, new { pooling = new { enabled = true } })); + Assert.That(exception.Message, Is.EqualTo(exceptionMessage)); + } + + [TestCase("mysqlx+srv://test:test@localhost")] + [TestCase("mysqlx+srv://test:test@[localhost]")] + [TestCase("mysqlx+srv://test:test@[(address=localhost,priority=100)]")] + [TestCase("mysqlx+srv://test:test@localhost?dns-srv=true;")] + [TestCase("server=www.google.com;user=test;password=test;dns-srv=true;")] + public void DnsResolverNoHosts(string connString) + { + connString = connString.Replace("localhost", Host); + var ex = Assert.Throws(() => MySQLX.GetSession(connString)); + Assert.That(ex.Message, Is.EqualTo(string.Format(MySql.Data.Resources.DnsSrvNoHostsAvailable, Host))); + } + + [Test] + public void DnsResolverNoHostsPooling() + { + using (var client = MySQLX.GetClient($"mysqlx+srv://test:test@{Host}?dns-srv=true;", new { pooling = new { enabled = true } })) + { + var ex = Assert.Throws(() => client.GetSession()); + Assert.That(ex.Message, Is.EqualTo(string.Format(MySql.Data.Resources.DnsSrvNoHostsAvailable, Host))); + } + } + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/ExprParserTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/ExprParserTests.cs new file mode 100644 index 000000000..8553d1d55 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/ExprParserTests.cs @@ -0,0 +1,572 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySqlX.Protocol.X; +using Mysqlx.Crud; +using Mysqlx.Datatypes; +using Mysqlx.Expr; +using System; +using System.Collections.Generic; +using System.Linq; +using NUnit.Framework; +using NUnit.Framework.Legacy; + +namespace MySqlX.Data.Tests +{ + public class ExprParserTests + { + /// + /// Check that a string doesn't parse. + /// + /// + private void CheckBadParse(string s) + { + //_testOutput.WriteLine(s); + Assert.Throws(() => { Expr e = new ExprParser(s).Parse(); }); + } + + [Test] + public void TestUnparseables() + { + CheckBadParse("1 + "); + CheckBadParse("x 1,2,3)"); + CheckBadParse("x(1,2,3"); + CheckBadParse("x(1 2,3)"); + CheckBadParse("x(1,, 2,3)"); + CheckBadParse("x not y"); + CheckBadParse("x like"); + CheckBadParse("like"); + CheckBadParse("like x"); + CheckBadParse("x + interval 1 MACROsecond"); + CheckBadParse("x + interval 1 + 1"); + CheckBadParse("x * interval 1 hour"); + CheckBadParse("1.1.1"); + CheckBadParse("a$**"); + CheckBadParse("a.b.c.d > 1"); + CheckBadParse("a$[1.1]"); + CheckBadParse("a$[-1]"); + CheckBadParse("a$1"); + CheckBadParse("a$.1"); + CheckBadParse("a$a"); + CheckBadParse("a$.+"); + CheckBadParse("a$(x)"); + CheckBadParse("\"xyz"); + CheckBadParse("x between 1"); + CheckBadParse("x.1 > 1"); + CheckBadParse("x$ > 1"); + CheckBadParse(":>1"); + CheckBadParse(":1.1"); + CheckBadParse("cast(x as varchar)"); + CheckBadParse("not"); + CheckBadParse("$.a[-1]"); + // TODO: test bad JSON identifiers (quoting?) + } + + /** + * Check that a string parses and is reconstituted as a string that we expect. Futher we parse the canonical version to make sure it doesn't change. + */ + private void CheckParseRoundTrip(string input, string expected) + { + if (expected == null) + { + expected = input; + } + Expr expr = new ExprParser(input).Parse(); + string canonicalized = ExprUnparser.ExprToString(expr); + Assert.That(canonicalized, Is.EqualTo(expected)); + + // System.err.println("Canonicalized: " + canonicalized); + Expr expr2 = new ExprParser(canonicalized).Parse(); + string recanonicalized = ExprUnparser.ExprToString(expr2); + Assert.That(recanonicalized, Is.EqualTo(expected)); + } + + /** + * Test that expressions parsed and serialize back to the expected form. + */ + [Test] + public void TestRoundTrips() + { + //CheckParseRoundTrip("_id == 20", "($.pages > 20)"); + CheckParseRoundTrip("$.pages > 20", "($.pages > 20)"); + CheckParseRoundTrip("now () - interval '10:20' hour_MiNuTe", "date_sub(now(), \"10:20\", \"HOUR_MINUTE\")"); + CheckParseRoundTrip("now () - interval 1 hour - interval 2 minute - interval 3 second", + "date_sub(date_sub(date_sub(now(), 1, \"HOUR\"), 2, \"MINUTE\"), 3, \"SECOND\")"); + // this needs parens around 1+1 in interval expression + CheckParseRoundTrip("a + interval 1 hour + 1 + interval (1 + 1) second", "(date_add(a, 1, \"HOUR\") + date_add(1, (1 + 1), \"SECOND\"))"); + CheckParseRoundTrip("a + interval 1 hour + 1 + interval 1 * 1 second", "(date_add(a, 1, \"HOUR\") + date_add(1, (1 * 1), \"SECOND\"))"); + CheckParseRoundTrip("now () - interval -2 day", "date_sub(now(), -2, \"DAY\")"); // interval exprs compile to date_add/date_sub calls + CheckParseRoundTrip("1", "1"); + CheckParseRoundTrip("1address", "1address"); + CheckParseRoundTrip("11employee", "11employee"); + CheckParseRoundTrip("1^0", "(1 ^ 0)"); + CheckParseRoundTrip("1e1", "10"); + CheckParseRoundTrip("-1e1", "-10"); + CheckParseRoundTrip("!0", "!0"); + CheckParseRoundTrip("1e4", "10000"); + CheckParseRoundTrip("12e-4", "0.0012"); + CheckParseRoundTrip("a + 314.1592e-2", "(a + 3.141592)"); + CheckParseRoundTrip("a + 0.0271e+2", "(a + 2.71)"); + CheckParseRoundTrip("a + 0.0271e2", "(a + 2.71)"); + CheckParseRoundTrip("10+1", "(10 + 1)"); + CheckParseRoundTrip("(abC == 1)", "(abC == 1)"); + CheckParseRoundTrip("(abC = 1)", "(abC == 1)"); + CheckParseRoundTrip("(Func(abc)==1)", "(Func(abc) == 1)"); + CheckParseRoundTrip("(abc == \"jess\")", "(abc == \"jess\")"); + CheckParseRoundTrip("(abc == \"with \\\"\")", "(abc == \"with \"\"\")"); // we escape with two internal quotes + CheckParseRoundTrip("(abc != .10)", "(abc != 0.1)"); + CheckParseRoundTrip("(abc != \"xyz\")", "(abc != \"xyz\")"); + CheckParseRoundTrip("a + b * c + d", "((a + (b * c)) + d)"); // shows precedence and associativity + CheckParseRoundTrip("a * b + c * d", "((a * b) + (c * d))"); + CheckParseRoundTrip("(a + b) * c + d", "(((a + b) * c) + d)"); + CheckParseRoundTrip("(field not in ('a',func('b', 2.0),'c'))", "field not in(\"a\", func(\"b\", 2), \"c\")"); + CheckParseRoundTrip("jess.age beTwEEn 30 and death", "(jess.age between 30 AND death)"); + CheckParseRoundTrip("jess.age not BeTweeN 30 and death", "(jess.age not between 30 AND death)"); + CheckParseRoundTrip("a + b * c + d", "((a + (b * c)) + d)"); + CheckParseRoundTrip("x > 10 and Y >= -20", "((x > 10) && (Y >= -20))"); + CheckParseRoundTrip("a is true and b is null and C + 1 > 40 and (thetime == now() or hungry())", + "((((a is TRUE) && (b is NULL)) && ((C + 1) > 40)) && ((thetime == now()) || hungry()))"); + CheckParseRoundTrip("a + b + -c > 2", "(((a + b) + -c) > 2)"); + CheckParseRoundTrip("now () + b + c > 2", "(((now() + b) + c) > 2)"); + CheckParseRoundTrip("now () + $.b + c > 2", "(((now() + $.b) + c) > 2)"); + CheckParseRoundTrip("now () - interval +2 day > some_other_time() or something_else IS NOT NULL", + "((date_sub(now(), 2, \"DAY\") > some_other_time()) || is_not(something_else, NULL))"); + CheckParseRoundTrip("\"two quotes to one\"\"\"", null); + CheckParseRoundTrip("'two quotes to one'''", "\"two quotes to one'\""); + CheckParseRoundTrip("'different quote \"'", "\"different quote \"\"\""); + CheckParseRoundTrip("\"different quote '\"", "\"different quote '\""); + CheckParseRoundTrip("`ident`", "ident"); // doesn't need quoting + CheckParseRoundTrip("`ident```", "`ident```"); + CheckParseRoundTrip("`ident\"'`", "`ident\"'`"); + CheckParseRoundTrip(":0 > x and func(:3, :2, :1)", "((:0 > x) && func(:1, :2, :3))"); // serialized in order of position (needs mapped externally) + CheckParseRoundTrip("a > now() + interval (2 + x) MiNuTe", "(a > date_add(now(), (2 + x), \"MINUTE\"))"); + CheckParseRoundTrip("a between 1 and 2", "(a between 1 AND 2)"); + CheckParseRoundTrip("a not between 1 and 2", "(a not between 1 AND 2)"); + CheckParseRoundTrip("a in (1,2,a.b(3),4,5,x)", "a in(1, 2, a.b(3), 4, 5, x)"); + CheckParseRoundTrip("a not in (1,2,3,4,5,$.x)", "a not in(1, 2, 3, 4, 5, $.x)"); + CheckParseRoundTrip("a like b escape c", "a like b ESCAPE c"); + CheckParseRoundTrip("a not like b escape c", "a not like b ESCAPE c"); + CheckParseRoundTrip("(1 + 3) in (3, 4, 5)", "(1 + 3) in(3, 4, 5)"); + CheckParseRoundTrip("`a crazy \"function\"``'name'`(1 + 3) in (3, 4, 5)", "`a crazy \"function\"``'name'`((1 + 3)) in(3, 4, 5)"); + CheckParseRoundTrip("a$.b", "a$.b"); + CheckParseRoundTrip("a$.\"bcd\"", "a$.bcd"); + CheckParseRoundTrip("a$.*", "a$.*"); + CheckParseRoundTrip("a$[0].*", "a$[0].*"); + CheckParseRoundTrip("a$[*].*", "a$[*].*"); + CheckParseRoundTrip("a$**[0].*", "a$**[0].*"); + CheckParseRoundTrip("$._id", "$._id"); + CheckParseRoundTrip("$._id == :0", "($._id == :0)"); + CheckParseRoundTrip("'Monty!' REGEXP '.*'", "(\"Monty!\" regexp \".*\")"); + CheckParseRoundTrip("a regexp b regexp c", "((a regexp b) regexp c)"); + CheckParseRoundTrip("a + b + c", "((a + b) + c)"); + CheckParseRoundTrip("a + cast(b as json)", "(a + cast(b AS JSON))"); + CheckParseRoundTrip("a + cast(b as decimal)", "(a + cast(b AS DECIMAL))"); + CheckParseRoundTrip("a + cast(b as decimal(2))", "(a + cast(b AS DECIMAL(2)))"); + CheckParseRoundTrip("a + cast(b as decimal(1, 2))", "(a + cast(b AS DECIMAL(1,2)))"); + CheckParseRoundTrip("a + cast(b as binary)", "(a + cast(b AS BINARY))"); + CheckParseRoundTrip("a + cast(b as DaTe)", "(a + cast(b AS DATE))"); + CheckParseRoundTrip("a + cast(b as char)", "(a + cast(b AS CHAR))"); + CheckParseRoundTrip("a + cast(b as DaTeTiMe)", "(a + cast(b AS DATETIME))"); + CheckParseRoundTrip("a + cast(b as time)", "(a + cast(b AS TIME))"); + CheckParseRoundTrip("a + cast(b as binary(3))", "(a + cast(b AS BINARY(3)))"); + CheckParseRoundTrip("a + cast(b as unsigned)", "(a + cast(b AS UNSIGNED))"); + CheckParseRoundTrip("a + cast(b as unsigned integer)", "(a + cast(b AS UNSIGNED))"); + CheckParseRoundTrip("a is true or a is false", "((a is TRUE) || (a is FALSE))"); + // TODO: this isn't serialized correctly by the unparser + //checkParseRoundTrip("a$.b[0][0].c**.d.\"a weird\\\"key name\"", ""); + CheckParseRoundTrip("*", "*"); + CheckParseRoundTrip("count(*) + 1", "(count(*) + 1)"); + } + + /** + * Explicit test inspecting the expression tree. + */ + [Test] + public void TestExprTree() + { + Expr expr = new ExprParser("a like 'xyz' and $.count > 10 + 1").Parse(); + Assert.That(expr.Type, Is.EqualTo(Expr.Types.Type.Operator)); + Assert.That(expr.Operator.Name, Is.EqualTo("&&")); + Assert.That(expr.Operator.Param.Count, Is.EqualTo(2)); + + // check left side of AND: (a like 'xyz') + Expr andLeft = expr.Operator.Param[0]; + Assert.That(andLeft.Type, Is.EqualTo(Expr.Types.Type.Operator)); + Assert.That(andLeft.Operator.Name, Is.EqualTo("like")); + Assert.That(andLeft.Operator.Param.Count, Is.EqualTo(2)); + Expr identA = andLeft.Operator.Param[0]; + Assert.That(identA.Type, Is.EqualTo(Expr.Types.Type.Ident)); + Assert.That(identA.Identifier.Name, Is.EqualTo("a")); + Expr literalXyz = andLeft.Operator.Param[1]; + Assert.That(literalXyz.Type, Is.EqualTo(Expr.Types.Type.Literal)); + Scalar scalarXyz = literalXyz.Literal; + Assert.That(scalarXyz.Type, Is.EqualTo(Scalar.Types.Type.VString)); + Assert.That(scalarXyz.VString.Value.ToStringUtf8(), Is.EqualTo("xyz")); + + // check right side of AND: ($.count > 10 + 1) + Expr andRight = expr.Operator.Param[1]; + Assert.That(andRight.Type, Is.EqualTo(Expr.Types.Type.Operator)); + Assert.That(andRight.Operator.Name, Is.EqualTo(">")); + Assert.That(andRight.Operator.Param.Count, Is.EqualTo(2)); + Expr countDocPath = andRight.Operator.Param[0]; + Assert.That(countDocPath.Type, Is.EqualTo(Expr.Types.Type.Ident)); + ColumnIdentifier countId = countDocPath.Identifier; + Assert.That(countId.Name, Is.EqualTo(string.Empty)); + Assert.That(countId.TableName, Is.EqualTo(string.Empty)); + Assert.That(countId.SchemaName, Is.EqualTo(string.Empty)); + Assert.That(countId.DocumentPath.Count==1); + Assert.That(countId.DocumentPath[0].Type, Is.EqualTo(DocumentPathItem.Types.Type.Member)); + Assert.That(countId.DocumentPath[0].Value, Is.EqualTo("count")); + Expr addition = andRight.Operator.Param[1]; + Scalar addLeftScalar = addition.Operator.Param[0].Literal; + Scalar addRightScalar = addition.Operator.Param[1].Literal; + Assert.That(addition.Type, Is.EqualTo(Expr.Types.Type.Operator)); + Assert.That(addition.Operator.Name, Is.EqualTo("+")); + Assert.That(addition.Operator.Param.Count, Is.EqualTo(2)); + Assert.That(addition.Operator.Param[0].Type, Is.EqualTo(Expr.Types.Type.Literal)); + Assert.That(addition.Operator.Param[1].Type, Is.EqualTo(Expr.Types.Type.Literal)); + Assert.That(addLeftScalar.Type, Is.EqualTo(Scalar.Types.Type.VSint)); + Assert.That(addRightScalar.Type, Is.EqualTo(Scalar.Types.Type.VSint)); + Assert.That(addLeftScalar.VSignedInt, Is.EqualTo(10)); + Assert.That(addRightScalar.VSignedInt, Is.EqualTo(1)); + } + + [Test] + public void TestOrderByParserBasic() + { + List orderSpec = new ExprParser("a, b desc").ParseOrderSpec(); + Assert.That(orderSpec.Count, Is.EqualTo(2)); + Order o1 = orderSpec[0]; + Assert.That(o1.HasDirection, Is.False); + Assert.That(ExprUnparser.ExprToString(o1.Expr), Is.EqualTo("a")); + Order o2 = orderSpec[1]; + Assert.That(o2.HasDirection); + Assert.That(o2.Direction, Is.EqualTo(Order.Types.Direction.Desc)); + Assert.That(ExprUnparser.ExprToString(o2.Expr), Is.EqualTo("b")); + } + + [Test] + public void TestOrderByParserComplexExpressions() + { + List orderSpec = new ExprParser("field not in ('a',func('b', 2.0),'c') desc, 1-a$**[0].*, now () + $.b + c > 2 asc").ParseOrderSpec(); + Assert.That(orderSpec.Count, Is.EqualTo(3)); + Order o1 = orderSpec[0]; + Assert.That(o1.HasDirection); + Assert.That(o1.Direction, Is.EqualTo(Order.Types.Direction.Desc)); + Assert.That(ExprUnparser.ExprToString(o1.Expr), Is.EqualTo("field not in(\"a\", func(\"b\", 2), \"c\")")); + Order o2 = orderSpec[1]; + Assert.That(o2.HasDirection, Is.False); + Assert.That(ExprUnparser.ExprToString(o2.Expr), Is.EqualTo("(1 - a$**[0].*)")); + Order o3 = orderSpec[2]; + Assert.That(o3.HasDirection); + Assert.That(o3.Direction, Is.EqualTo(Order.Types.Direction.Asc)); + Assert.That(ExprUnparser.ExprToString(o3.Expr), Is.EqualTo("(((now() + $.b) + c) > 2)")); + } + + [Test] + public void TestNamedPlaceholders() + { + ExprParser parser = new ExprParser("a = :a and b = :b and (c = 'x' or d = :b)"); + Assert.That(parser.tokens[0].ToString(), Is.EqualTo("IDENT(a)")); + Assert.That(parser.tokens[1].ToString(), Is.EqualTo("EQ")); + Expr e = parser.Parse(); + Assert.That(parser.placeholderNameToPosition["a"], Is.EqualTo(0)); + Assert.That(parser.placeholderNameToPosition["b"], Is.EqualTo(1)); + Assert.That(parser.positionalPlaceholderCount, Is.EqualTo(2)); + + Expr aEqualsPlaceholder = e.Operator.Param[0].Operator.Param[0].Operator.Param[1]; + Assert.That(aEqualsPlaceholder.Type, Is.EqualTo(Expr.Types.Type.Placeholder)); + Assert.That(aEqualsPlaceholder.Position, Is.EqualTo((uint)0)); + Expr bEqualsPlaceholder = e.Operator.Param[0].Operator.Param[1].Operator.Param[1]; + Assert.That(bEqualsPlaceholder.Type, Is.EqualTo(Expr.Types.Type.Placeholder)); + Assert.That(bEqualsPlaceholder.Position, Is.EqualTo((uint)1)); + Expr dEqualsPlaceholder = e.Operator.Param[1].Operator.Param[1].Operator.Param[1]; + Assert.That(dEqualsPlaceholder.Type, Is.EqualTo(Expr.Types.Type.Placeholder)); + Assert.That(dEqualsPlaceholder.Position, Is.EqualTo((uint)1)); + } + + [Test] + public void TestNumberedPlaceholders() + { + ExprParser parser = new ExprParser("a == :1 and b == :3 and (c == :2 or d == :2)"); + Expr e = parser.Parse(); + Assert.That(parser.placeholderNameToPosition["1"], Is.EqualTo(0)); + Assert.That(parser.placeholderNameToPosition["3"], Is.EqualTo(1)); + Assert.That(parser.placeholderNameToPosition["2"], Is.EqualTo(2)); + Assert.That(parser.positionalPlaceholderCount, Is.EqualTo(3)); + + Expr aEqualsPlaceholder = e.Operator.Param[0].Operator.Param[0].Operator.Param[1]; + Assert.That(aEqualsPlaceholder.Type, Is.EqualTo(Expr.Types.Type.Placeholder)); + Assert.That(aEqualsPlaceholder.Position, Is.EqualTo((uint)0)); + Expr bEqualsPlaceholder = e.Operator.Param[0].Operator.Param[1].Operator.Param[1]; + Assert.That(bEqualsPlaceholder.Type, Is.EqualTo(Expr.Types.Type.Placeholder)); + Assert.That(bEqualsPlaceholder.Position, Is.EqualTo((uint)1)); + Expr cEqualsPlaceholder = e.Operator.Param[1].Operator.Param[0].Operator.Param[1]; + Assert.That(cEqualsPlaceholder.Type, Is.EqualTo(Expr.Types.Type.Placeholder)); + Assert.That(cEqualsPlaceholder.Position, Is.EqualTo((uint)2)); + Expr dEqualsPlaceholder = e.Operator.Param[1].Operator.Param[1].Operator.Param[1]; + Assert.That(dEqualsPlaceholder.Type, Is.EqualTo(Expr.Types.Type.Placeholder)); + Assert.That(dEqualsPlaceholder.Position, Is.EqualTo((uint)2)); + } + + [Test] + public void TestUnnumberedPlaceholders() + { + ExprParser parser = new ExprParser("a = ? and b = ? and (c = 'x' or d = ?)"); + Expr e = parser.Parse(); + Assert.That(parser.placeholderNameToPosition["0"], Is.EqualTo(0)); + Assert.That(parser.placeholderNameToPosition["1"], Is.EqualTo(1)); + Assert.That(parser.placeholderNameToPosition["2"], Is.EqualTo(2)); + Assert.That(parser.positionalPlaceholderCount, Is.EqualTo(3)); + + Expr aEqualsPlaceholder = e.Operator.Param[0].Operator.Param[0].Operator.Param[1]; + Assert.That(aEqualsPlaceholder.Type, Is.EqualTo(Expr.Types.Type.Placeholder)); + Assert.That(aEqualsPlaceholder.Position, Is.EqualTo((uint)0)); + Expr bEqualsPlaceholder = e.Operator.Param[0].Operator.Param[1].Operator.Param[1]; + Assert.That(bEqualsPlaceholder.Type, Is.EqualTo(Expr.Types.Type.Placeholder)); + Assert.That(bEqualsPlaceholder.Position, Is.EqualTo((uint)1)); + Expr dEqualsPlaceholder = e.Operator.Param[1].Operator.Param[1].Operator.Param[1]; + Assert.That(dEqualsPlaceholder.Type, Is.EqualTo(Expr.Types.Type.Placeholder)); + Assert.That(dEqualsPlaceholder.Position, Is.EqualTo((uint)2)); + } + + [Test] + public void TestJsonLiteral() + { + Expr e = new ExprParser("{'a':1, 'b':\"a string\"}").Parse(); + + Assert.That(ExprUnparser.ExprToString(e), Is.EqualTo("{'a':1, 'b':\"a string\"}")); + + Assert.That(e.Type, Is.EqualTo(Expr.Types.Type.Object)); + Mysqlx.Expr.Object o = e.Object; + Assert.That(o.Fld.Count, Is.EqualTo(2)); + Mysqlx.Expr.Object.Types.ObjectField of; + + of = o.Fld[0]; + Assert.That(of.Key, Is.EqualTo("a")); + e = of.Value; + Assert.That(e.Type, Is.EqualTo(Expr.Types.Type.Literal)); + Assert.That(e.Literal.VSignedInt, Is.EqualTo(1)); + + of = o.Fld[1]; + Assert.That(of.Key, Is.EqualTo("b")); + e = of.Value; + Assert.That(e.Type, Is.EqualTo(Expr.Types.Type.Literal)); + Assert.That(e.Literal.VString.Value.ToStringUtf8(), Is.EqualTo("a string")); + } + + [Test] + public void TestTrivialDocumentProjection() + { + List proj; + + proj = new ExprParser("$.a as a").ParseDocumentProjection(); + Assert.That(proj, Has.One.Items); + Assert.That(proj[0].Alias, Is.Not.EqualTo(string.Empty)); + Assert.That(proj[0].Alias, Is.EqualTo("a")); + + proj = new ExprParser("$.a as a, $.b as b, $.c as c").ParseDocumentProjection(); + } + + [Test] + public void TestExprAsPathDocumentProjection() + { + List projList = new ExprParser("$.a as b, (1 + 1) * 100 as x, 2 as j42").ParseDocumentProjection(); + + Assert.That(projList.Count, Is.EqualTo(3)); + + // check $.a as b + Projection proj = projList[0]; + IList paths = proj.Source.Identifier.DocumentPath; + Assert.That(paths.Count, Is.EqualTo(1)); + Assert.That(paths[0].Type, Is.EqualTo(DocumentPathItem.Types.Type.Member)); + Assert.That(paths[0].Value, Is.EqualTo("a")); + + Assert.That(proj.Alias, Is.EqualTo("b")); + + // check (1 + 1) * 100 as x + proj = projList[1]; + Assert.That(ExprUnparser.ExprToString(proj.Source), Is.EqualTo("((1 + 1) * 100)")); + Assert.That(proj.Alias, Is.EqualTo("x")); + + // check 2 as j42 + proj = projList[2]; + Assert.That(ExprUnparser.ExprToString(proj.Source), Is.EqualTo("2")); + Assert.That(proj.Alias, Is.EqualTo("j42")); + } + + [Test] + public void TestJsonConstructorAsDocumentProjection() + { + // same as we use in find().field("{...}") + string projString = "{'a':'value for a', 'b':1+1, 'c'::bindvar, 'd':$.member[22], 'e':{'nested':'doc'}}"; + Projection proj = new Projection(); + proj.Source = new ExprParser(projString, false).Parse(); + Assert.That(proj.Source.Type, Is.EqualTo(Expr.Types.Type.Object)); + + IEnumerator fields = proj.Source.Object.Fld.GetEnumerator(); + string[][] array = new string[][] { + new string[] {"a", "\"value for a\""}, + new string[] {"b", "(1 + 1)"}, + new string[] {"c", ":0"}, + new string[] {"d", "$.member[22]"}, + new string[] {"e", "{'nested':\"doc\"}"}}; + array.ToList().ForEach(pair => + { + fields.MoveNext(); + Mysqlx.Expr.Object.Types.ObjectField f = fields.Current; + Assert.That(f.Key, Is.EqualTo(pair[0])); + Assert.That(ExprUnparser.ExprToString(f.Value), Is.EqualTo(pair[1])); + }); + Assert.That(fields.MoveNext(), Is.False); + } + + [Test] + public void TestJsonExprsInDocumentProjection() + { + // this is not a single doc as the project but multiple docs as embedded fields + string projString = "{'a':1} as a, {'b':2} as b"; + List projList = new ExprParser(projString).ParseDocumentProjection(); + Assert.That(projList.Count, Is.EqualTo(2)); + // TODO: verification of remaining elements + } + + [Test] + public void TestTableInsertProjection() + { + Column col = new ExprParser("a").ParseTableInsertField(); + Assert.That(col.Name, Is.EqualTo("a")); + + col = new ExprParser("`double weird `` string`").ParseTableInsertField(); + Assert.That(col.Name, Is.EqualTo("double weird ` string")); + } + + [Test] + public void TestTableUpdateField() + { + ColumnIdentifier col; + col = new ExprParser("a").ParseTableUpdateField(); + Assert.That(col.Name, Is.EqualTo("a")); + + col = new ExprParser("b.c").ParseTableUpdateField(); + Assert.That(col.TableName, Is.EqualTo("b")); + Assert.That(col.Name, Is.EqualTo("c")); + + col = new ExprParser("d.e$.the_path[2]").ParseTableUpdateField(); + Assert.That(col.TableName, Is.EqualTo("d")); + Assert.That(col.Name, Is.EqualTo("e")); + Assert.That(col.DocumentPath.Count, Is.EqualTo(2)); + Assert.That(col.DocumentPath[0].Value, Is.EqualTo("the_path")); + Assert.That(col.DocumentPath[1].Index, Is.EqualTo((uint)2)); + + col = new ExprParser("`zzz\\``").ParseTableUpdateField(); + Assert.That(col.Name, Is.EqualTo("zzz`")); + } + + [Test] + public void TestTrivialTableSelectProjection() + { + List proj = new ExprParser("a, b as c").ParseTableSelectProjection(); + Assert.That(proj.Count, Is.EqualTo(2)); + Assert.That(ExprUnparser.ExprToString(proj[0].Source), Is.EqualTo("a")); + Assert.That(proj[0].Alias, Is.EqualTo(string.Empty)); + Assert.That(ExprUnparser.ExprToString(proj[1].Source), Is.EqualTo("b")); + Assert.That(proj[1].Alias, Is.Not.EqualTo(string.Empty)); + Assert.That(proj[1].Alias, Is.EqualTo("c")); + } + + [Test] + public void TestStarTableSelectProjection() + { + List proj = new ExprParser("*, b as c").ParseTableSelectProjection(); + Assert.That(proj.Count, Is.EqualTo(2)); + Assert.That(ExprUnparser.ExprToString(proj[0].Source), Is.EqualTo("*")); + Assert.That(proj[0].Alias, Is.EqualTo(string.Empty)); + Assert.That(ExprUnparser.ExprToString(proj[1].Source), Is.EqualTo("b")); + Assert.That(proj[1].Alias, Is.Not.EqualTo(string.Empty)); + Assert.That(proj[1].Alias, Is.EqualTo("c")); + } + + [Test] + public void TestComplexTableSelectProjection() + { + string projectionString = "(1 + 1) * 100 as `one-o-two`, 'a is \\'a\\'' as `what is 'a'`"; + List proj = new ExprParser(projectionString).ParseTableSelectProjection(); + Assert.That(proj.Count, Is.EqualTo(2)); + + Assert.That(ExprUnparser.ExprToString(proj[0].Source), Is.EqualTo("((1 + 1) * 100)")); + Assert.That(proj[0].Alias, Is.EqualTo("one-o-two")); + + Assert.That(proj[1].Source.Literal.VString.Value.ToStringUtf8(), Is.EqualTo("a is 'a'")); + Assert.That(proj[1].Alias, Is.EqualTo("what is 'a'")); + } + + [Test] + public void TestRandom() + { + // tests generated by the random expression generator + CheckParseRoundTrip("x - INTERVAL { } DAY_HOUR * { } + { }", "((date_sub(x, {}, \"DAY_HOUR\") * {}) + {})"); + CheckParseRoundTrip("NULL - INTERVAL $ ** [ 89 ] << { '' : { } - $ . V << { '' : { } + { } REGEXP ? << { } - { } < { } | { } << { '' : : 8 + : 26 ^ { } } + { } >> { } } || { } } & { } SECOND", "date_sub(NULL, (($**[89] << {'':((({} - $.V) << {'':(({} + {}) regexp ((:0 << ({} - {})) < ({} | (({} << ({'':((:1 + :2) ^ {})} + {})) >> {}))))}) || {})}) & {}), \"SECOND\")"); + // TODO: check the validity of this: + // checkParseRoundTrip("_XJl . F ( `ho` @ [*] [*] - ~ ! { '' : { } LIKE { } && : rkc & 1 & y @ ** . d [*] [*] || { } ^ { } REGEXP { } } || { } - { } ^ { } < { } IN ( ) >= { } IN ( ) )", ""); + } + + [Test] + public void UnqualifiedDocPaths() + { + Expr expr = new ExprParser("1 + b[0]", false).Parse(); + Assert.That(ExprUnparser.ExprToString(expr), Is.EqualTo("(1 + $.b[0])")); + expr = new ExprParser("a.*", false).Parse(); + Assert.That(ExprUnparser.ExprToString(expr), Is.EqualTo("$.a.*")); + expr = new ExprParser("bL . vT .*", false).Parse(); + Assert.That(ExprUnparser.ExprToString(expr), Is.EqualTo("$.bL.vT.*")); + expr = new ExprParser("dd ** .X", false).Parse(); + Assert.That(ExprUnparser.ExprToString(expr), Is.EqualTo("$.dd**.X")); + } + + [TestCase("info$.additionalinfo.hobbies", "info$.additionalinfo.hobbies", true)] + [TestCase("info->$.additionalinfo.hobbies", "info$.additionalinfo.hobbies", true)] + [TestCase("info->>$.additionalinfo.hobbies", null, true)] + [TestCase("info$.additionalinfo.hobbies", null, false)] + [TestCase("info->$.additionalinfo.hobbies", null, false)] + [TestCase("info->>$.additionalinfo.hobbies", null, false)] + [TestCase("$.additionalinfo.hobbies", "$.additionalinfo.hobbies", false)] + public void JsonColumnPath(string exprString, string unparserString, bool isRelational) + { + if(unparserString == null) + { + Assert.That(Assert.Throws(() => new ExprParser(exprString, isRelational).Parse()).Message, Is.EqualTo($"Unable to parse query '{exprString}'")); + } + else + { + Expr expr = new ExprParser(exprString, isRelational).Parse(); + Assert.That(ExprUnparser.ExprToString(expr), Is.EqualTo(unparserString)); + } + } + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/GenericListener.cs b/MySQL.Data/tests/MySqlX.Data.Tests/GenericListener.cs new file mode 100644 index 000000000..b12077da7 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/GenericListener.cs @@ -0,0 +1,86 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Collections.Generic; +using System.Diagnostics; +using System.Text; + +namespace MySqlX.Data.Tests +{ + public class GenericListener : TraceListener + { + List strings; + StringBuilder partial; + + public GenericListener() + { + strings = new List(); + partial = new StringBuilder(); + } + + public List Strings + { + get { return strings; } + } + + public int Find(string sToFind) + { + int count = 0; + foreach (string s in strings) + if (s.IndexOf(sToFind) != -1) + count++; + return count; + } + + public void Clear() + { + partial.Remove(0, partial.Length); + strings.Clear(); + } + + public override void Write(string message) + { + partial.Append(message); + } + + public override void WriteLine(string message) + { + Write(message); + strings.Add(partial.ToString()); + partial.Remove(0, partial.Length); + } + + public int CountLinesContaining(string text) + { + int count = 0; + foreach (string s in strings) + if (s.Contains(text)) count++; + return count; + } + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/JsonParserTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/JsonParserTests.cs new file mode 100644 index 000000000..c9ee9d1fb --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/JsonParserTests.cs @@ -0,0 +1,158 @@ +// Copyright © 2017, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Common; +using System; +using System.Collections.Generic; +using NUnit.Framework; +using NUnit.Framework.Legacy; + +namespace MySqlX.Data.Tests +{ + public class JsonParserTests : BaseTest + { + [Test] + public void ParseBooleanValue() + { + Collection collection = CreateCollection("test"); + + DbDoc document = new DbDoc(@"{ ""_id"": 1, ""isDocument"": true }"); + Result result = ExecuteAddStatement(collection.Add(document)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + + document = collection.GetOne(1); + Assert.That(document.values.ContainsKey("isDocument")); + Assert.That((bool) document.values["isDocument"]); + + document = new DbDoc(new { _id=2, isDocument=false }); + result = ExecuteAddStatement(collection.Add(document)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + + document = collection.GetOne(2); + Assert.That(document.values.ContainsKey("isDocument")); + Assert.That((bool) document.values["isDocument"], Is.False); + + Assert.That(ExecuteFindStatement(collection.Find("isDocument = false")).FetchAll().Count > 0); + } + + [Test] + public void ParseNullValue() + { + Collection collection = CreateCollection("test"); + + DbDoc document = new DbDoc(@"{ ""isDocument"": null }"); + Result result = ExecuteAddStatement(collection.Add(document)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + + document = ExecuteFindStatement(collection.Find()).FetchOne(); + Assert.That(document.values.ContainsKey("isDocument")); + Assert.That(document.values["isDocument"], Is.Null); + } + + [Test] + public void ParseNumberArray() + { + Collection collection = CreateCollection("test"); + + DbDoc document = new DbDoc(@"{ ""id"": 1, ""list"": [1,2,3] }"); + Result result = ExecuteAddStatement(collection.Add(document)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + + document = ExecuteFindStatement(collection.Find()).FetchOne(); + Assert.That(document.values.ContainsKey("list")); + Assert.That(document.values["list"], Is.EqualTo(new object[] { 1, 2, 3 })); + } + + [Test] + public void ParsObjectArray() + { + Collection collection = CreateCollection("test"); + + DbDoc document = new DbDoc(@"{ ""id"": 1, ""list"": [1,""a""] }"); + //DbDoc document = new DbDoc(@"{ ""id"": 1, ""list"": [1,""a"",true,null] }"); + Result result = ExecuteAddStatement(collection.Add(document)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + + document = ExecuteFindStatement(collection.Find()).FetchOne(); + Assert.That(document.values.ContainsKey("list")); + Assert.That(document.values["list"], Is.EqualTo(new object[] { 1, "a" })); + //Assert.AreEqual(new object[] { 1, "a", true, null }, document.values["list"]); + } + + [Test] + public void ParseGroupsEmbededInArrays() + { + DbDoc document = new DbDoc(@"{ ""id"": 1, ""list"": [1,""a"", { ""b"": 1 } ] }"); + //DbDoc document = new DbDoc(@"{ ""id"": 1, ""list"": [1,""a"",true,null] }"); + Collection collection = CreateCollection("test"); + Result result = ExecuteAddStatement(collection.Add(document)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + + document = ExecuteFindStatement(collection.Find()).FetchOne(); + Assert.That(document.values.ContainsKey("list")); + var dictionary = new Dictionary(); + dictionary.Add("b",1); + Assert.That(document.values["list"], Is.EqualTo(new object[] { 1, "a", dictionary })); + //Assert.AreEqual(new object[] { 1, "a", true, null, dictionary }, document.values["list"]); + } + + [Test] + public void ParseWithEscapedQuotes() + { + Collection collection = CreateCollection("test"); + Result r = ExecuteAddStatement(collection.Add("{ \"_id\": \"123\", \"email\": [\"alice@ora.com\"], \"dates\": [\"4/1/2017\"] }")); + var expr = new + { + email = new MySqlExpression("UPPER($.email)") + }; + ExecuteModifyStatement(collection.Modify("true").ArrayAppend("email", expr)); + var expr2 = new + { + email = new MySqlExpression("UPPER($.email[0])") + }; + ExecuteModifyStatement(collection.Modify("true").ArrayAppend("email", expr2)); + + var document = collection.GetOne("123"); + var innerEmail = ((document["email"] as object[])[1]) as Dictionary; + Assert.That(innerEmail["email"], Is.EqualTo("[\\\"ALICE@ORA.COM\\\"]")); + innerEmail = ((document["email"] as object[])[2]) as Dictionary; + Assert.That(innerEmail["email"], Is.EqualTo("ALICE@ORA.COM")); + + ExecuteAddStatement(collection.Add("{ \"_id\": \"124\", \"email\": \"\\\"\" }")); + document = collection.GetOne("124"); + Assert.That(document["email"], Is.EqualTo("\\\"")); + + var ex = Assert.Throws(() => ExecuteAddStatement(collection.Add("{ \"_id\": \"124\", \"email\": \"\"\" }"))); + Assert.That(ex.Message, Is.EqualTo("The value provided is not a valid JSON document. Expected token ','")); + + ex = Assert.Throws(() => ExecuteAddStatement(collection.Add("{ \"_id\": \"124\", \"email\": \"\\\" }"))); + Assert.That(ex.Message, Is.EqualTo("The value provided is not a valid JSON document. Failed to find ending '\"' while reading stream.")); + } + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/MergePatch.cs b/MySQL.Data/tests/MySqlX.Data.Tests/MergePatch.cs new file mode 100644 index 000000000..63d3093e9 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/MergePatch.cs @@ -0,0 +1,1789 @@ +// Copyright © 2017, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Common; +using System; +using System.Collections.Generic; +using NUnit.Framework; +using NUnit.Framework.Legacy; + +namespace MySqlX.Data.Tests +{ + public class MergePatch : BaseTest + { + private static string[] documentsAsJsonStrings; + private static DbDoc[] documentsAsDbDocs; + private string documentAsJsonString2 = + "{ " + + // Document 2. + "\"_id\": \"123456789asdferdfghhghjh12334\", " + + "\"title\": \"CASTAWAY\", " + + "\"description\": \"A FedEx executive must transform himself physically and " + + "emotionally to survive a crash landing on a deserted island\", " + + "\"releaseyear\": 2000, " + + "\"language\": \"English\", " + + "\"duration\": 150, " + + "\"rating\": \"PG\", " + + "\"genre\": \"Drama\", " + + "\"actors\": [ " + + "{ \"name\": \"TOM HANKS\", \"country\": \"USA\", \"birthdate\": \"9 Jul 1956\" }, " + + "{ \"name\": \"Paul Sanchez\", \"country\": \"Spain\", \"birthdate\": \"26 Oct 1975\" }, " + + "{ \"name\": \"Lari White\", \"country\": \"France\", \"birthdate\": \"13 May 1965\" }" + + "], " + + "\"additionalinfo\": { " + + "\"director\": { " + + "\"name\": \"Steven Spielberg\", " + + "\"birthplace\": " + + "{ \"country\": {\"countryActual\": \"USA\", \"city\": \"Florida\"} }, " + + "\"age\":67, " + + "\"awards\": [ " + + "{ \"award\": \"Best Movie\", \"movie\": \"American Beauty\", \"year\": 1999}, " + + "{ \"award\": \"Best Director\", \"movie\": \"Saving Private Ryan\", \"year\": 1998 }" + + "] " + + "}, " + + "\"writers\": [\"Tom Sizemore\", \"Barry Pepper\", \"Giovanni Ribisi\"], " + + "\"productioncompanies\": [\"Amblin Entertainment\", \"Mutual Film Company\"] " + + "} " + + "}"; + + static MergePatch() + { + documentsAsJsonStrings = new string[] { + "{ " + + // Document 1. + "\"_id\": \"a6f4b93e1a264a108393524f29546a8c\", " + + "\"title\": \"AFRICAN EGG\", " + + "\"description\": \"A Fast-Paced Documentary of a Pastry Chef And a Dentist who must Pursue a Forensic Psychologist in The Gulf of Mexico\", " + + "\"releaseyear\": 2006, " + + "\"language\": \"English\", " + + "\"duration\": 130, " + + "\"rating\": \"G\", " + + "\"genre\": \"Science fiction\", " + + "\"actors\": [ " + + "{ \"name\": \"MILLA PECK\", \"country\": \"Mexico\", \"birthdate\": \"12 Jan 1984\" }, " + + "{ \"name\": \"VAL BOLGER\", \"country\": \"Botswana\", \"birthdate\": \"26 Jul 1975\" }, " + + "{ \"name\": \"SCARLETT BENING\", \"country\": \"Syria\", \"birthdate\": \"16 Mar 1978\" }" + + "], " + + "\"additionalinfo\": { " + + "\"director\": { " + + "\"name\": \"Sharice Legaspi\", " + + "\"age\":57, " + + "\"birthplace\": " + + "{ \"country\": \"Italy\", \"city\": \"Rome\" }, " + + "\"awards\": [ " + + "{ \"award\": \"Best Movie\", \"movie\": \"THE EGG\", \"year\": 2002}, " + + "{ \"award\": \"Best Special Effects\", \"movie\": \"AFRICAN EGG\", \"year\": 2006 }" + + "] " + + "}, " + + "\"writers\": [\"Rusty Couturier\", \"Angelic Orduno\", \"Carin Postell\"], " + + "\"productioncompanies\": [\"Qvodrill\", \"Indigoholdings\"] " + + "} " + + "}" + }; + + documentsAsDbDocs = new DbDoc[documentsAsJsonStrings.Length]; + for (int i = 0; i < documentsAsJsonStrings.Length; i++) + documentsAsDbDocs[i] = new DbDoc(documentsAsJsonStrings[i]); + } + + #region General + + [Test] + public void PatchExpectedExceptions() + { + Collection collection = CreateCollection("test"); + + if (!session.InternalSession.GetServerVersion().isAtLeast(8, 0, 3)) + Assert.Throws(() => collection.Modify("true").Patch(null)); + else + { + Assert.Throws(() => collection.Modify("true").Patch(null)); + Assert.Throws(() => collection.Modify("true").Patch(" ")); + Assert.Throws(() => collection.Modify("true").Patch("")); + Assert.Throws(() => collection.Modify("true").Patch(string.Empty)); + } + } + + [Test] + public void SimplePatch() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + Collection collection = CreateCollection("test"); + Result r = ExecuteAddStatement(collection.Add("{ \"_id\": \"123\", \"email\": \"alice@ora.com\", \"startDate\": \"4/1/2017\" }")); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + r = ExecuteAddStatement(collection.Add("{ \"_id\": \"124\", \"email\": \"jose@ora.com\", \"startDate\": \"4/1/2017\" }")); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + ExecuteModifyStatement(collection.Modify("email = \"alice@ora.com\"").Patch("{ \"_id\": \"123\", \"email\":\"bob@ora.com\", \"startDate\":null }")); + + DbDoc document = collection.GetOne("123"); + Assert.That(document.Id, Is.EqualTo("123")); + Assert.That(document.values["email"], Is.EqualTo("bob@ora.com")); + Assert.That(!document.values.ContainsKey("startDate")); + + document = collection.GetOne("124"); + Assert.That(document.Id, Is.EqualTo("124")); + Assert.That(document.values["email"], Is.EqualTo("jose@ora.com")); + Assert.That(document.values.ContainsKey("startDate")); + } + + [Test] + public void SimplePatchUsingMySqlExpressionClass() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + Collection collection = CreateCollection("test"); + Result r = ExecuteAddStatement(collection.Add("{ \"_id\": \"123\", \"email\": \"alice@ora.com\", \"startDate\": \"4/1/2017\" }")); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + var patch = new + { + email = new MySqlExpression("UPPER($.email)") + }; + + ExecuteModifyStatement(collection.Modify("true").Patch(patch)); + DbDoc document = collection.GetOne("123"); + Assert.That(document.values["email"], Is.EqualTo("ALICE@ORA.COM")); + } + + [Test] + public void CRUD() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + Collection collection = CreateCollection("test"); + Result r = ExecuteAddStatement(collection.Add(documentsAsJsonStrings)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + // Add field. + ExecuteModifyStatement(collection.Modify("language = :lang").Patch("{ \"translations\": [\"Spanish\"] }").Bind("lang", "English")); + var document = ExecuteFindStatement(collection.Find("language = :lang").Bind("lang", "English")).FetchOne(); + Assert.That(document.values.ContainsKey("translations")); + + // Update field. + ExecuteModifyStatement(collection.Modify("language = :lang").Patch("{ \"translations\": [\"Spanish\", \"Italian\"] }").Bind("lang", "English")); + document = ExecuteFindStatement(collection.Find("language = :lang").Bind("lang", "English")).FetchOne(); + Assert.That(document.values.ContainsKey("translations")); + var translations = (object[])document.values["translations"]; + Assert.That((string)translations[0], Is.EqualTo("Spanish")); + Assert.That((string)translations[1], Is.EqualTo("Italian")); + + // Remove field. + ExecuteModifyStatement(collection.Modify("language = :lang").Patch("{ \"translations\": null }").Bind("lang", "English")); + document = ExecuteFindStatement(collection.Find("language = :lang").Bind("lang", "English")).FetchOne(); + Assert.That(document.values.ContainsKey("translations"), Is.False); + + // Add field. + Assert.That(((Dictionary)document.values["additionalinfo"]).ContainsKey("musicby"), Is.False); + ExecuteModifyStatement(collection.Modify("additionalinfo.director.name = :director").Patch("{ \"additionalinfo\": { \"musicby\": \"Sakila D\" } }").Bind("director", "Sharice Legaspi")); + document = ExecuteFindStatement(collection.Find("language = :lang").Bind("lang", "English")).FetchOne(); + Assert.That(((Dictionary)document.values["additionalinfo"]).ContainsKey("musicby")); + + // Update field. + ExecuteModifyStatement(collection.Modify("additionalinfo.director.name = :director").Patch("{ \"additionalinfo\": { \"musicby\": \"The Sakila\" } }").Bind("director", "Sharice Legaspi")); + document = ExecuteFindStatement(collection.Find("language = :lang").Bind("lang", "English")).FetchOne(); + Assert.That(((Dictionary)document.values["additionalinfo"]).ContainsKey("musicby")); + Assert.That(((Dictionary)document.values["additionalinfo"])["musicby"], Is.EqualTo("The Sakila")); + + // Remove field. + ExecuteModifyStatement(collection.Modify("additionalinfo.director.name = :director").Patch("{ \"additionalinfo\": { \"musicby\": null } }").Bind("director", "Sharice Legaspi")); + document = ExecuteFindStatement(collection.Find("additionalinfo.director.name = :director").Bind("director", "Sharice Legaspi")).FetchOne(); + Assert.That(((Dictionary)document.values["additionalinfo"]).ContainsKey("musicby"), Is.False); + + // Add field. + Assert.That(((Dictionary)((Dictionary)document.values["additionalinfo"])["director"]).ContainsKey("country"), Is.False); + ExecuteModifyStatement(collection.Modify("additionalinfo.director.name = :director").Patch("{ \"additionalinfo\": { \"director\": { \"country\": \"France\" } } }").Bind("director", "Sharice Legaspi")); + document = ExecuteFindStatement(collection.Find("language = :lang").Bind("lang", "English")).FetchOne(); + Assert.That(((Dictionary)((Dictionary)document.values["additionalinfo"])["director"]).ContainsKey("country")); + + // Update field. + ExecuteModifyStatement(collection.Modify("additionalinfo.director.name = :director").Patch("{ \"additionalinfo\": { \"director\": { \"country\": \"Canada\" } } }").Bind("director", "Sharice Legaspi")); + document = ExecuteFindStatement(collection.Find("language = :lang").Bind("lang", "English")).FetchOne(); + Assert.That(((Dictionary)((Dictionary)document.values["additionalinfo"])["director"]).ContainsKey("country")); + Assert.That(((Dictionary)((Dictionary)document.values["additionalinfo"])["director"])["country"], Is.EqualTo("Canada")); + + // Remove field. + ExecuteModifyStatement(collection.Modify("additionalinfo.director.name = :director").Patch("{ \"additionalinfo\": { \"director\": { \"country\": null } } }").Bind("director", "Sharice Legaspi")); + document = ExecuteFindStatement(collection.Find("additionalinfo.director.name = :director").Bind("director", "Sharice Legaspi")).FetchOne(); + Assert.That(((Dictionary)((Dictionary)document.values["additionalinfo"])["director"]).ContainsKey("country"), Is.False); + } + + #endregion + + #region Nested operations + + [Test] + public void ReplaceUpdateInDifferentNestingLevels() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + Collection collection = CreateCollection("test"); + Result r = ExecuteAddStatement(collection.Add(documentsAsDbDocs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + DbDoc document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document["title"], Is.EqualTo("AFRICAN EGG")); + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"title\": \"The African Egg\" }").Bind("id", "a6f4b93e1a264a108393524f29546a8c")); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document["title"], Is.EqualTo("The African Egg")); + + Assert.That(((Dictionary)((Dictionary)document.values["additionalinfo"])["director"])["age"], Is.EqualTo(57)); + ExecuteModifyStatement(collection.Modify("additionalinfo.director.name = :director").Patch("{ \"additionalinfo\": { \"director\": { \"age\": 67 } } }").Bind("director", "Sharice Legaspi")); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(((Dictionary)((Dictionary)document.values["additionalinfo"])["director"])["age"], Is.EqualTo(67)); + + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"additionalinfo\": { \"director\": { \"age\": 77 } } }").Bind("id", "a6f4b93e1a264a108393524f29546a8c")); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(((Dictionary)((Dictionary)document.values["additionalinfo"])["director"])["age"], Is.EqualTo(77)); + + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"title\": { \"movie\": \"The African Egg\"} }").Bind("id", "a6f4b93e1a264a108393524f29546a8c")); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(((Dictionary)document.values["title"])["movie"], Is.EqualTo("The African Egg")); + + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"additionalinfo\": \"No data available\" }").Bind("id", "a6f4b93e1a264a108393524f29546a8c")); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document.values["additionalinfo"], Is.EqualTo("No data available")); + } + + [Test] + public void AddRemoveFieldInDifferentNestingLevels() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + Collection collection = CreateCollection("test"); + Result r = ExecuteAddStatement(collection.Add(documentsAsDbDocs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + DbDoc document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document.values.ContainsKey("translations"), Is.False); + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"translations\": [\"Spanish\"] }").Bind("id", "a6f4b93e1a264a108393524f29546a8c")); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document.values.ContainsKey("translations")); + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"translations\": null }").Bind("id", "a6f4b93e1a264a108393524f29546a8c")); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document.values.ContainsKey("translations"), Is.False); + + Assert.That(((Dictionary)((Dictionary)document.values["additionalinfo"])["director"]).ContainsKey("country"), Is.False); + ExecuteModifyStatement(collection.Modify("additionalinfo.director.name = :director").Patch("{ \"additionalinfo\": { \"director\": { \"country\": \"France\" } } }").Bind("director", "Sharice Legaspi")); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(((Dictionary)((Dictionary)document.values["additionalinfo"])["director"]).ContainsKey("country")); + ExecuteModifyStatement(collection.Modify("additionalinfo.director.name = :director").Patch("{ \"additionalinfo\": { \"director\": { \"country\": null } } }").Bind("director", "Sharice Legaspi")); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(((Dictionary)((Dictionary)document.values["additionalinfo"])["director"]).ContainsKey("country"), Is.False); + + Assert.That(((Dictionary)document.values["additionalinfo"]).ContainsKey("musicby"), Is.False); + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"additionalinfo\": { \"musicby\": \"The Sakila\" } }").Bind("id", "a6f4b93e1a264a108393524f29546a8c")); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(((Dictionary)document.values["additionalinfo"]).ContainsKey("musicby")); + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"additionalinfo\": { \"musicby\": null } }").Bind("id", "a6f4b93e1a264a108393524f29546a8c")); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(((Dictionary)document.values["additionalinfo"]).ContainsKey("musicby"), Is.False); + } + + #endregion + + #region Multiple fields + + [Test] + public void CRUDMultipleFields() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + Collection collection = CreateCollection("test"); + Result r = ExecuteAddStatement(collection.Add(documentsAsDbDocs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + DbDoc document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + + // Add fields. + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"field 1\": \"one\", \"field 2\": \"two\", \"field 3\": \"three\" }").Bind("id", "a6f4b93e1a264a108393524f29546a8c")); + ExecuteModifyStatement(collection.Modify("additionalinfo.director.name = :director").Patch("{ \"additionalinfo\": { \"director\": { \"field 1\": \"one\", \"field 2\": \"two\", \"field 3\": \"three\" } } }").Bind("director", "Sharice Legaspi")); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document.values["field 1"], Is.EqualTo("one")); + Assert.That(document.values["field 2"], Is.EqualTo("two")); + Assert.That(document.values["field 3"], Is.EqualTo("three")); + Assert.That((((Dictionary)((Dictionary)document.values["additionalinfo"])["director"]))["field 1"], Is.EqualTo("one")); + Assert.That((((Dictionary)((Dictionary)document.values["additionalinfo"])["director"]))["field 2"], Is.EqualTo("two")); + Assert.That((((Dictionary)((Dictionary)document.values["additionalinfo"])["director"]))["field 3"], Is.EqualTo("three")); + + // Update/Replace fields. + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"field 1\": \"ONE\", \"field 2\": \"TWO\", \"field 3\": \"THREE\" }").Bind("id", "a6f4b93e1a264a108393524f29546a8c")); + ExecuteModifyStatement(collection.Modify("additionalinfo.director.name = :director").Patch("{ \"additionalinfo\": { \"director\": { \"field 1\": \"ONE\", \"field 2\": \"TWO\", \"field 3\": \"THREE\" } } }").Bind("director", "Sharice Legaspi")); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document.values["field 1"], Is.EqualTo("ONE")); + Assert.That(document.values["field 2"], Is.EqualTo("TWO")); + Assert.That(document.values["field 3"], Is.EqualTo("THREE")); + Assert.That((((Dictionary)((Dictionary)document.values["additionalinfo"])["director"]))["field 1"], Is.EqualTo("ONE")); + Assert.That((((Dictionary)((Dictionary)document.values["additionalinfo"])["director"]))["field 2"], Is.EqualTo("TWO")); + Assert.That((((Dictionary)((Dictionary)document.values["additionalinfo"])["director"]))["field 3"], Is.EqualTo("THREE")); + + // Remove fields. + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"field 1\": null, \"field 2\": null, \"field 3\": null }").Bind("id", "a6f4b93e1a264a108393524f29546a8c")); + ExecuteModifyStatement(collection.Modify("additionalinfo.director.name = :director").Patch("{ \"additionalinfo\": { \"director\": { \"field 1\": null, \"field 2\": null, \"field 3\": null } } }").Bind("director", "Sharice Legaspi")); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document.values.ContainsKey("field 1"), Is.False); + Assert.That(document.values.ContainsKey("field 2"), Is.False); + Assert.That(document.values.ContainsKey("field 3"), Is.False); + Assert.That((((Dictionary)((Dictionary)document.values["additionalinfo"])["director"])).ContainsKey("field 1"), Is.False); + Assert.That((((Dictionary)((Dictionary)document.values["additionalinfo"])["director"])).ContainsKey("field 2"), Is.False); + Assert.That((((Dictionary)((Dictionary)document.values["additionalinfo"])["director"])).ContainsKey("field 3"), Is.False); + } + + #endregion + + #region Using expressions + + [Test] + public void AddNewFieldUsingExpressions() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + Collection collection = CreateCollection("test"); + Result r = ExecuteAddStatement(collection.Add(documentsAsDbDocs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + DbDoc document = ExecuteFindStatement(collection.Find()).FetchOne(); + Assert.That(((Dictionary)((object[])document.values["actors"])[0]).ContainsKey("age"), Is.False); + Assert.Throws(() => ExecuteModifyStatement(collection.Modify("true").Patch("{ \"actors\": { \"age\": Year(CURDATE()) - CAST(SUBSTRING_INDEX(actors.birthdate, ' ', - 1) AS DECIMAL)) } }"))); + + document = ExecuteFindStatement(collection.Find()).FetchOne(); + Assert.That(document.values.ContainsKey("audio"), Is.False); + ExecuteModifyStatement(collection.Modify("true").Patch("{ \"audio\": CONCAT($.language, ', no subtitles') }")); + document = ExecuteFindStatement(collection.Find()).FetchOne(); + Assert.That(document.values["audio"], Is.EqualTo("English, no subtitles")); + } + + [Test] + public void ReplaceUpdateUsingExpressions() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + Collection collection = CreateCollection("test"); + Result r = ExecuteAddStatement(collection.Add(documentsAsDbDocs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + DbDoc document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + + Assert.That(document.values.ContainsKey("audio"), Is.False); + ExecuteModifyStatement(collection.Modify("true").Patch("{ \"audio\": CONCAT(UPPER($.language), ', No Subtitles') }")); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document.values["audio"], Is.EqualTo("ENGLISH, No Subtitles")); + } + + [Test] + public void ReplaceUpdateIdUsingExpressions() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + Collection collection = CreateCollection("test"); + Result r = ExecuteAddStatement(collection.Add(documentsAsDbDocs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + // Changes to the _id field are ignored. + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"_id\": replace(UUID(), '-', '') }").Bind("id", "a6f4b93e1a264a108393524f29546a8c")); + DbDoc document = ExecuteFindStatement(collection.Find()).FetchOne(); + Assert.That(document.Id, Is.EqualTo("a6f4b93e1a264a108393524f29546a8c")); + } + + [Test] + public void AddIdToNestedDocumentUsingExpressions() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + Collection collection = CreateCollection("test"); + Result r = ExecuteAddStatement(collection.Add(documentsAsDbDocs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + DbDoc document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(((Dictionary)document.values["additionalinfo"]).ContainsKey("_id"), Is.False); + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"additionalinfo\": { \"_id\": replace(UUID(), '-', '') } }").Bind("id", "a6f4b93e1a264a108393524f29546a8c")); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(((Dictionary)document.values["additionalinfo"]).ContainsKey("_id")); + } + + [Test] + public void AddNullFieldUsingExpressions() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + Collection collection = CreateCollection("test"); + Result r = ExecuteAddStatement(collection.Add(documentsAsDbDocs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + DbDoc document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(((Dictionary)document.values["additionalinfo"]).ContainsKey("releasedate"), Is.False); + Exception ex = Assert.Throws(() => ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"releasedate\": DATE_ADD('2006-04-00',INTERVAL 1 DAY) }").Bind("id", "a6f4b93e1a264a108393524f29546a8c"))); + Assert.That(ex.Message, Is.EqualTo("Invalid data for update operation on document collection table")); + } + + [Test] + public void ReplaceUpdateNullFieldReturnedFromExpression() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + Collection collection = CreateCollection("test"); + Result r = ExecuteAddStatement(collection.Add(documentsAsDbDocs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + DbDoc document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document.values["title"], Is.EqualTo("AFRICAN EGG")); + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"title\": concat('my ', NULL, ' title') }").Bind("id", "a6f4b93e1a264a108393524f29546a8c")); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document.values.ContainsKey("title"), Is.False); + } + + [Test] + public void AddNewFieldReturnedFromExpression() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + Collection collection = CreateCollection("test"); + Result r = ExecuteAddStatement(collection.Add(documentsAsDbDocs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + DbDoc document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document.values.ContainsKey("docfield"), Is.False); + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"docfield\": JSON_OBJECT('field 1', 1, 'field 2', 'two') }").Bind("id", "a6f4b93e1a264a108393524f29546a8c")); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document.values.ContainsKey("docfield")); + } + + [Test] + public void ReplaceUpdateFieldWithDocumentReturnedFromExpression() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + Collection collection = CreateCollection("test"); + Result r = ExecuteAddStatement(collection.Add(documentsAsDbDocs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + DbDoc document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document.values["genre"], Is.EqualTo("Science fiction")); + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"genre\": JSON_OBJECT('name', 'Science Fiction') }").Bind("id", "a6f4b93e1a264a108393524f29546a8c")); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(((Dictionary)document.values["genre"])["name"], Is.EqualTo("Science Fiction")); + } + + #endregion + + #region Using _id + + [Test] + public void ReplaceUpdateId() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + Collection collection = CreateCollection("test"); + Result r = ExecuteAddStatement(collection.Add(documentsAsDbDocs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + // Changes to the _id field are ignored. + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"_id\": \"b5f4b93e1a264a108393524f29546a9d\" }").Bind("id", "a6f4b93e1a264a108393524f29546a8c")); + DbDoc document = ExecuteFindStatement(collection.Find()).FetchOne(); + Assert.That(document.Id, Is.EqualTo("a6f4b93e1a264a108393524f29546a8c")); + } + + [Test] + public void AddIdToNestedDocument() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + Collection collection = CreateCollection("test"); + Result r = ExecuteAddStatement(collection.Add(documentsAsDbDocs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + // Add id to nested document is allowed. + DbDoc document = ExecuteFindStatement(collection.Find()).FetchOne(); + var field = (Dictionary)document.values["additionalinfo"]; + Assert.That(field.Count, Is.EqualTo(3)); + Assert.That(field.ContainsKey("_id"), Is.False); + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"additionalinfo\": { \"_id\": \"b5f4b93e1a264a108393524f29546a9d\" } }").Bind("id", "a6f4b93e1a264a108393524f29546a8c")); + document = ExecuteFindStatement(collection.Find()).FetchOne(); + field = (Dictionary)document.values["additionalinfo"]; + Assert.That(field.Count, Is.EqualTo(4)); + Assert.That(field.ContainsKey("_id")); + Assert.That(field["_id"], Is.EqualTo("b5f4b93e1a264a108393524f29546a9d")); + } + + [Test] + public void SetNullToId() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + Collection collection = CreateCollection("test"); + Result r = ExecuteAddStatement(collection.Add(documentsAsJsonStrings)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + // Changes to the _id field are ignored. + ExecuteModifyStatement(collection.Modify("true").Patch("{ \"_id\": NULL }")); + Assert.That(ExecuteFindStatement(collection.Find()).FetchOne().Id, Is.EqualTo("a6f4b93e1a264a108393524f29546a8c")); + } + + [Test] + public void AddNullFields() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + Collection collection = CreateCollection("test"); + Result r = ExecuteAddStatement(collection.Add(documentsAsJsonStrings)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + ExecuteModifyStatement(collection.Modify("true").Patch("{ \"nullfield\": NULL }")); + Assert.That(ExecuteFindStatement(collection.Find()).FetchOne().values.ContainsKey("nullfield"), Is.False); + + ExecuteModifyStatement(collection.Modify("true").Patch("{ \"nullfield\": [NULL, NULL] }")); + DbDoc document = ExecuteFindStatement(collection.Find()).FetchOne(); + Assert.That(document.values.ContainsKey("nullfield")); + var nullArray = (object[])document.values["nullfield"]; + Assert.That(nullArray[0], Is.Null); + Assert.That(nullArray[1], Is.Null); + + ExecuteModifyStatement(collection.Modify("true").Patch("{ \"nullfield\": { \"nested\": NULL } }")); + document = ExecuteFindStatement(collection.Find()).FetchOne(); + Assert.That(ExecuteFindStatement(collection.Find()).FetchOne().values.ContainsKey("nullfield")); + Assert.That(((Dictionary)document.values["nullfield"]).Count == 0); + + ExecuteModifyStatement(collection.Modify("true").Patch("{ \"nullfield\": { \"nested\": [NULL, NULL] } }")); + document = ExecuteFindStatement(collection.Find()).FetchOne(); + var nestedNullArray = (object[])((Dictionary)document.values["nullfield"])["nested"]; + Assert.That(nestedNullArray[0], Is.Null); + Assert.That(nestedNullArray[1], Is.Null); + } + + [Test] + public void AddNestedNullFields() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + Collection collection = CreateCollection("test"); + Result r = ExecuteAddStatement(collection.Add(documentsAsJsonStrings)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + ExecuteModifyStatement(collection.Modify("true").Patch("{ \"additionalinfo\": { \"nullfield\": NULL } }")); + Assert.That(((Dictionary)ExecuteFindStatement(collection.Find()).FetchOne().values["additionalinfo"]).ContainsKey("nullfield"), Is.False); + + ExecuteModifyStatement(collection.Modify("true").Patch("{ \"additionalinfo\": { \"nullfield\": [NULL, NULL] } }")); + DbDoc document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + var nestedNullArray = (object[])((Dictionary)document.values["additionalinfo"])["nullfield"]; + Assert.That(nestedNullArray[0], Is.Null); + Assert.That(nestedNullArray[1], Is.Null); + + ExecuteModifyStatement(collection.Modify("true").Patch("{ \"additionalinfo\": { \"nullfield\": { \"nested\": NULL } } }")); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(((Dictionary)((Dictionary)document.values["additionalinfo"])["nullfield"]).ContainsKey("nullfield"), Is.False); + + ExecuteModifyStatement(collection.Modify("true").Patch("{ \"additionalinfo\": { \"nullfield\": { \"nested\": [NULL, NULL] } } }")); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + nestedNullArray = (object[])((Dictionary)((Dictionary)document.values["additionalinfo"])["nullfield"])["nested"]; + Assert.That(nestedNullArray[0], Is.Null); + Assert.That(nestedNullArray[1], Is.Null); + + ExecuteModifyStatement(collection.Modify("true").Patch("{ \"additionalinfo\": { \"nullfield\": { \"nested\": JSON_OBJECT('field', null) } } }")); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + var nestedObject = (Dictionary)((Dictionary)((Dictionary)document.values["additionalinfo"])["nullfield"])["nested"]; + Assert.That(nestedObject, Is.Empty); + } + + #endregion + + [Test] + public void GetDocumentProperties() + { + Collection collection = CreateCollection("test"); + Result r = ExecuteAddStatement(collection.Add(documentsAsDbDocs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + // Get root string properties. + DbDoc document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document.Id, Is.EqualTo("a6f4b93e1a264a108393524f29546a8c")); + Assert.That(document["title"], Is.EqualTo("AFRICAN EGG")); + Assert.That(document["rating"], Is.EqualTo("G")); + + // Get root numeric properties. + Assert.That(document["releaseyear"], Is.EqualTo(2006)); + Assert.That(document["duration"], Is.EqualTo(130)); + + // Get root array. + object[] actors = document["actors"] as object[]; + Assert.That(actors.Length == 3); + Dictionary actor1 = actors[1] as Dictionary; + Assert.That(actor1["name"], Is.EqualTo("VAL BOLGER")); + + // Get nested string properies. + Assert.That(document["additionalinfo.director.name"], Is.EqualTo("Sharice Legaspi")); + Assert.That(document["additionalinfo.director.age"], Is.EqualTo(57)); + Assert.That(document["additionalinfo.director.birthplace.country"], Is.EqualTo("Italy")); + + // Get nested array. + object[] awards = document["additionalinfo.director.awards"] as object[]; + Assert.That(awards.Length == 2); + } + + [Test] + public void PatchUsingDateAndTimeFunctions() + { + string t1 = "{\"_id\": \"1\", \"name\": \"Alice\" }"; + Collection collection = CreateCollection("test"); + Result r = ExecuteAddStatement(collection.Add(t1)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"dateAndTimeValue\": YEAR('2000-01-01') }").Bind("id", "1")); + DbDoc document = collection.GetOne("1"); + Assert.That(document["dateAndTimeValue"], Is.EqualTo(2000)); + + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"dateAndTimeValue\": MONTH('2008-02-03') }").Bind("id", "1")); + document = collection.GetOne("1"); + Assert.That(document["dateAndTimeValue"], Is.EqualTo(2)); + + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"dateAndTimeValue\": WEEK('2008-02-20') }").Bind("id", "1")); + document = collection.GetOne("1"); + Assert.That(document["dateAndTimeValue"], Is.EqualTo(7)); + + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"dateAndTimeValue\": DAY('2008-02-20') }").Bind("id", "1")); + document = collection.GetOne("1"); + Assert.That(document["dateAndTimeValue"], Is.EqualTo(20)); + + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"dateAndTimeValue\": HOUR('10:05:03') }").Bind("id", "1")); + document = collection.GetOne("1"); + Assert.That(document["dateAndTimeValue"], Is.EqualTo(10)); + + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"dateAndTimeValue\": MINUTE('2008-02-03 10:05:03') }").Bind("id", "1")); + document = collection.GetOne("1"); + Assert.That(document["dateAndTimeValue"], Is.EqualTo(5)); + + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"dateAndTimeValue\": SECOND('10:05:03') }").Bind("id", "1")); + document = collection.GetOne("1"); + Assert.That(document["dateAndTimeValue"], Is.EqualTo(3)); + + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"dateAndTimeValue\": MICROSECOND('12:00:00.123456') }").Bind("id", "1")); + document = collection.GetOne("1"); + Assert.That(document["dateAndTimeValue"], Is.EqualTo(123456)); + + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"dateAndTimeValue\": QUARTER('2008-04-01') }").Bind("id", "1")); + document = collection.GetOne("1"); + Assert.That(document["dateAndTimeValue"], Is.EqualTo(2)); + + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"dateAndTimeValue\": TIME('2003-12-31 01:02:03') }").Bind("id", "1")); + document = collection.GetOne("1"); + Assert.That(document["dateAndTimeValue"], Is.EqualTo("01:02:03.000000")); + + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"dateAndTimeValue\": DATE('2003-12-31 01:02:03') }").Bind("id", "1")); + document = collection.GetOne("1"); + Assert.That(document["dateAndTimeValue"], Is.EqualTo("2003-12-31")); + } + + [Test] + public void PatchUsingOtherKnownFunctions() + { + string t1 = "{\"_id\": \"1\", \"name\": \"Alice\" }"; + Collection collection = CreateCollection("test"); + Result r = ExecuteAddStatement(collection.Add(t1)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"otherValue\": CHAR(77, 121, 83, 81, '76') }").Bind("id", "1")); + DbDoc document = collection.GetOne("1"); + Assert.That(document["otherValue"], Is.EqualTo("base64:type15:TXlTUUw=")); + + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"otherValue\": HEX('abc') }").Bind("id", "1")); + document = collection.GetOne("1"); + Assert.That(document["otherValue"], Is.EqualTo("616263")); + + ExecuteModifyStatement(collection.Modify("_id = :id").Patch("{ \"otherValue\": BIN(12) }").Bind("id", "1")); + document = collection.GetOne("1"); + Assert.That(document["otherValue"], Is.EqualTo("1100")); + } + + #region WL14389 + + [Test, Description("Test valid modify.patch on condition matching multiple records))")] + public void ModifyPatchMultipleRecords_S1() + { + + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + var collection = CreateCollection("test"); + var docs = new[] + { + new {_id = 1, title = "Book 1", pages = 20, age = "12"}, + new {_id = 2, title = "Book 2", pages = 30,age = "18"}, + new {_id = 3, title = "Book 3", pages = 40,age = "34"}, + new {_id = 4, title = "Book 4", pages = 50,age = "12"} + }; + Result r = collection.Add(docs).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4)); + var document = collection.GetOne("1"); + var jsonParams = new { title = "Book 100" }; + r = collection.Modify("age = :age").Patch(jsonParams). + Bind("age", "12").Execute();//Multiple Records + Assert.That(r.AffectedItemsCount, Is.EqualTo(2)); + string jsonParams1 = "{ \"title\": \"Book 400\"}"; + r = collection.Modify("age = :age").Patch(jsonParams1). + Bind("age", "18").Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + document = collection.GetOne("1"); + Assert.That(document["title"], Is.EqualTo("Book 100")); + document = collection.GetOne("4"); + Assert.That(document["title"], Is.EqualTo("Book 100")); + document = collection.GetOne("2"); + Assert.That(document["title"], Is.EqualTo("Book 400")); + + string splName = "A*b"; + jsonParams1 = "{\"data1\":\"" + splName + "\"}"; + r = collection.Modify("age = :age").Patch(jsonParams1). + Bind("age", "18").Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + document = collection.GetOne("2"); + Assert.That(document["data1"], Is.EqualTo(splName)); + + splName = "A/b"; + jsonParams1 = "{\"data1\":\"" + splName + "\"}"; + r = collection.Modify("age = :age").Patch(jsonParams1). + Bind("age", "18").Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + document = collection.GetOne("2"); + Assert.That(document["data1"], Is.EqualTo(splName)); + + splName = "A&b!c@d#e$f%g^h&i(j)k-l+m=0_p~q`r}s{t][.,?/><"; + jsonParams1 = "{\"data1\":\"" + splName + "\"}"; + r = collection.Modify("age = :age").Patch(jsonParams1). + Bind("age", "18").Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + document = collection.GetOne("2"); + Assert.That(document["data1"], Is.EqualTo(splName)); + + //Large Key Length + string myString = new string('*', 65535); + jsonParams1 = "{\"data1\":\"" + myString + "\"}"; + r = collection.Modify("age = :age").Patch(jsonParams1). + Bind("age", "18").Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + document = collection.GetOne("2"); + Assert.That(document["data1"], Is.EqualTo(myString)); + + collection = CreateCollection("test"); + r = collection.Add(documentsAsJsonStrings).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + r = collection.Add(documentAsJsonString2).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + collection.Modify("_id = :id").Patch("{ \"field 1\": \"one\", \"field 2\": \"two\", \"field 3\": \"three\" }"). + Bind("id", "a6f4b93e1a264a108393524f29546a8c").Execute(); + collection.Modify("additionalinfo.director.name = :director"). + Patch("{ \"additionalinfo\": { \"director\": { \"field1 11\": " + + "\"one\", \"field2 12\": \"two\", \"field3 13\": \"three\" } } }"). + Bind("director", "Sharice Legaspi").Execute(); + document = collection.GetOne("123456789asdferdfghhghjh12334"); + collection.Modify("_id = :id").Patch("{ \"field 1\": \"one\", \"field 2\": \"two\", \"field 3\": \"three\" }"). + Bind("id", "123456789asdferdfghhghjh12334").Execute(); + collection.Modify("additionalinfo.director.name = :director"). + Patch("{ \"additionalinfo\": { \"director\": { \"field1 11\": " + + "\"one\", \"field2 12\": \"two\", \"field3 13\": \"three\" } } }"). + Bind("director", "Steven Spielberg").Execute(); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document["field 1"], Is.EqualTo("one")); + Assert.That(document["field 2"], Is.EqualTo("two")); + Assert.That(document["field 3"], Is.EqualTo("three")); + Assert.That((((Dictionary)((Dictionary)document["additionalinfo"])["director"]))["field1 11"], Is.EqualTo("one")); + Assert.That((((Dictionary)((Dictionary)document["additionalinfo"])["director"]))["field2 12"], Is.EqualTo("two")); + Assert.That((((Dictionary)((Dictionary)document["additionalinfo"])["director"]))["field3 13"], Is.EqualTo("three")); + + document = collection.GetOne("123456789asdferdfghhghjh12334"); + Assert.That(document["field 1"], Is.EqualTo("one")); + Assert.That(document["field 2"], Is.EqualTo("two")); + Assert.That(document["field 3"], Is.EqualTo("three")); + Assert.That((((Dictionary)((Dictionary)document["additionalinfo"])["director"]))["field1 11"], Is.EqualTo("one")); + Assert.That((((Dictionary)((Dictionary)document["additionalinfo"])["director"]))["field2 12"], Is.EqualTo("two")); + Assert.That((((Dictionary)((Dictionary)document["additionalinfo"])["director"]))["field3 13"], Is.EqualTo("three")); + + collection.Modify("language = :language"). + Patch("{ \"additionalinfo\": { \"director\": { \"test1\": " + + "\"one\", \"test2\": \"two\", \"test3\": \"three\" } } }"). + Bind("language", "English").Execute(); + collection.Modify("language = :language"). + Patch("{ \"field 1\": \"check1\", \"field 2\": \"check2\", \"field 3\": \"check3\" }"). + Bind("language", "English").Execute(); + //Multiple Records + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document["field 1"], Is.EqualTo("check1")); + Assert.That(document["field 2"], Is.EqualTo("check2")); + Assert.That(document["field 3"], Is.EqualTo("check3")); + Assert.That((((Dictionary)((Dictionary)document["additionalinfo"])["director"]))["test1"], Is.EqualTo("one")); + Assert.That((((Dictionary)((Dictionary)document["additionalinfo"])["director"]))["test2"], Is.EqualTo("two")); + Assert.That((((Dictionary)((Dictionary)document["additionalinfo"])["director"]))["test3"], Is.EqualTo("three")); + document = collection.GetOne("123456789asdferdfghhghjh12334"); + Assert.That(document["field 1"], Is.EqualTo("check1")); + Assert.That(document["field 2"], Is.EqualTo("check2")); + Assert.That(document["field 3"], Is.EqualTo("check3")); + Assert.That((((Dictionary)((Dictionary)document["additionalinfo"])["director"]))["test1"], Is.EqualTo("one")); + Assert.That((((Dictionary)((Dictionary)document["additionalinfo"])["director"]))["test2"], Is.EqualTo("two")); + Assert.That((((Dictionary)((Dictionary)document["additionalinfo"])["director"]))["test3"], Is.EqualTo("three")); + + collection = CreateCollection("test"); + var data2 = new DbDoc(@"{ ""_id"": -1, ""pages"": 20, + ""books"": [ + {""_id"" : 10, ""title"" : ""Book 10""}, + { ""_id"" : 20, ""title"" : ""Book 20"" } + ] + }"); + r = collection.Add(data2).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + document = collection.GetOne("-1"); + Assert.That(document["pages"].ToString(), Is.EqualTo("20")); + collection.Modify("_id = :id").Patch("{ \"pages\": \"200\" }"). + Bind("id", -1).Execute(); + document = collection.GetOne("-1"); + Assert.That(document["pages"], Is.EqualTo("200")); + data2 = new DbDoc(@"{ ""_id"": 1, ""pages"": 20, + ""books"": [ + {""_id"" : 10, ""title"" : ""Book 10""}, + { ""_id"" : 20, ""title"" : ""Book 20"" } + ] + }"); + r = collection.Add(data2).Execute(); + collection.Modify("_id = :id"). + Patch("{ \"books\": [{ \"_id\": \"11\",\"title\":\"Ganges\"}]}"). + Bind("id", "1").Execute(); + document = collection.GetOne("1"); + object[] books = document["books"] as object[]; + Assert.That(books.Length, Is.EqualTo(1)); + Dictionary book1 = books[0] as Dictionary; + Assert.That(book1["_id"], Is.EqualTo("11")); + Assert.That(book1["title"], Is.EqualTo("Ganges")); + var t1 = + "{\"_id\": \"1\", \"name\": \"Alice\", \"address\": [{\"zip\": \"12345\", \"city\": \"Los Angeles\", \"street\": \"32 Main str\"}]}"; + var t2 = + "{\"_id\": \"2\", \"name\": \"Bob\", \"address\": [{\"zip\": \"325226\", \"city\": \"San Francisco\", \"street\": \"42 2nd str\"}]}"; + var t3 = + "{\"_id\": \"3\", \"name\": \"Bob\", \"address\": [{\"zip1\": \"325226\", \"city1\": \"San Francisco\", \"street1\": \"42 2nd str\"}," + + "{\"zip2\": \"325226\", \"city2\": \"San Francisco\", \"street2\": \"42 2nd str\"}]}"; + + collection = CreateCollection("test"); + r = collection.Add(t1).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + r = collection.Add(t2).Execute(); + //update the name and zip code of match + collection.Modify("_id = :id").Patch("{\"name\": \"Joe\", \"address\": [{\"zip\":\"91234\"}]}").Bind("id", "1").Execute(); + document = collection.GetOne("1"); + Assert.That(document["name"], Is.EqualTo("Joe")); + object[] address = document["address"] as object[]; + Assert.That(address.Length, Is.EqualTo(1)); + Dictionary address1 = address[0] as Dictionary; + Assert.That(address1["zip"], Is.EqualTo("91234")); + + collection = CreateCollection("test"); + r = collection.Add(t1).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + r = collection.Add(t2).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + r = collection.Add(t3).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + collection.Modify("_id = :id").Patch("{\"name\": \"Joe\", \"address\": [{\"zip1\":\"91234\"},{\"zip2\":\"10000\"}]}"). + Bind("id", "3").Execute(); + document = collection.GetOne("3"); + Assert.That(document["name"], Is.EqualTo("Joe")); + address = document["address"] as object[]; + Assert.That(address.Length, Is.EqualTo(2)); + address1 = address[0] as Dictionary; + Assert.That(address1["zip1"], Is.EqualTo("91234")); + address1 = address[1] as Dictionary; + Assert.That(address1["zip2"], Is.EqualTo("10000")); + + collection = CreateCollection("test"); + var t = "{\"_id\": \"id1004\", \"age\": 1, \"misc\": 1.2, \"name\": { \"last\": \"ABCDEF3\", \"first\": \"ABCDEF1\", \"middle\": { \"middle1\": \"ABCDEF21\", \"middle2\": \"ABCDEF22\"}}}"; + r = collection.Add(t).Execute(); + collection.Modify("_id = :id").Patch("{\"name\":{\"middle\":{\"middle1\": {\"middle11\" : \"ABCDEF211\", \"middle12\" : \"ABCDEF212\", \"middle13\" : \"ABCDEF213\"}}}}").Bind("id", "id1004").Execute(); + document = collection.GetOne("id1004"); + Assert.That(document["name.middle.middle1.middle11"], Is.EqualTo("ABCDEF211")); + Assert.That(document["name.middle.middle1.middle12"], Is.EqualTo("ABCDEF212")); + Assert.That(document["name.middle.middle1.middle13"], Is.EqualTo("ABCDEF213")); + + t1 = "{\"_id\": \"1001\", \"ARR\":[1,2,3], \"ARR1\":[\"name1\",\"name2\", \"name3\"]}"; + t2 = "{\"_id\": \"1002\", \"ARR\":[1,1,2], \"ARR1\":[\"name1\",\"name2\", \"name3\"]}"; + t3 = "{\"_id\": \"1003\", \"ARR\":[1,4,5], \"ARR1\":[\"name1\",\"name2\", \"name3\"]}"; + collection = CreateCollection("test"); + r = collection.Add(t1).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + r = collection.Add(t2).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + r = collection.Add(t3).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + collection.Modify("_id = :_id"). + Patch("{\"ARR\":[6,8,3],\"ARR1\":[\"changed name1\",\"changed name2\", \"changed name3\"]}"). + Bind("_id", "1001").Execute(); + document = collection.GetOne("1001"); + + object[] arr = document["ARR1"] as object[]; + Assert.That(arr.Length, Is.EqualTo(3)); + int j = 1; + for (int i = 0; i < arr.Length; i++) + { + Assert.That(arr[i], Is.EqualTo("changed name" + j)); + j++; + } + + t1 = + "{\"_id\": \"1\", \"name\": \"Alice\", \"address\": {\"zip\": \"12345\", \"city\": \"Los Angeles\", \"street\": \"32 Main str\"}}"; + t2 = + "{\"_id\": \"2\", \"name\": \"Bob\", \"address\": [{\"zip\": \"325226\", \"city\": \"San Francisco\", \"street\": \"42 2nd str\"}]}"; + t3 = + "{\"_id\": \"3\", \"name\": \"Bob\", \"address\": [{\"zip1\": \"325226\", \"city1\": \"San Francisco\", \"street1\": \"42 2nd str\"}," + + "{\"zip2\": \"325226\", \"city2\": \"San Francisco\", \"street2\": \"42 2nd str\"}]}"; + + collection = CreateCollection("test"); + r = collection.Add(t1).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + r = collection.Add(t2).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + r = collection.Add(t3).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + collection.Modify("_id = :id"). + Patch("{\"address\": null, \"zip\": $.address.zip, \"street\": $.address.street, \"city\": upper($.address.city)}").Bind("id", "1"). + Execute(); + document = collection.GetOne("1"); + Assert.That(document["name"], Is.EqualTo("Alice")); + Assert.That(document["street"], Is.EqualTo("32 Main str")); + Assert.That(document["city"], Is.EqualTo("LOS ANGELES")); + Assert.That(document["zip"], Is.EqualTo("12345")); + + t1 = + "{\"_id\": \"1\", \"name\": \"Alice\", \"address\": {\"test\":{\"zip\": \"12345\", " + + "\"city\": \"Los Angeles\", \"street\": \"32 Main str\"}}}"; + collection = CreateCollection("test"); + r = collection.Add(t1).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + collection.Modify("_id = :id"). + Patch("{\"address\":{\"test\": null,\"zip\":$.address.test.zip,\"city\": lower($.address.test.city)}}").Bind("id", "1"). + Execute(); + document = collection.GetOne("1"); + Assert.That(document["name"], Is.EqualTo("Alice")); + Assert.That(document["address.city"], Is.EqualTo("los angeles")); + Assert.That(document["address.zip"], Is.EqualTo("12345")); + + } + + [Test, Description("Test valid modify.patch to change element at Depth 5 for multiple arrays))")] + public void ModifyInNestedObjects() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + string json = ""; + int i = 0, j = 0, k = 0, l = 0, m = 0, n = 0, maxFld = 10; + var collection = CreateCollection("test"); + int maxdepth = 5; + json = "{\"_id\":\"1002\",\"XYZ\":1111"; + for (j = 0; j < maxFld; j++) + { + json = json + ",\"ARR" + j + "\":["; + for (i = 0; i < maxdepth; i++) + { + json = json + i + ",["; + } + json = json + i; + for (i = maxdepth - 1; i >= 0; i--) + { + json = json + "]," + i; + } + json = json + "]"; + } + json = json + "}"; + + collection.Add(json).Execute(); + + json = "{\"_id\":\"1003\",\"XYZ\":2222"; + for (j = 0; j < maxFld; j++) + { + json = json + ",\"DATAX" + j + "\":"; + for (i = 0; i < maxdepth; i++) + { + json = json + "{\"D" + i + "\":"; + } + json = json + maxdepth; + for (i = maxdepth - 1; i >= 0; i--) + { + json = json + "}"; + } + } + json = json + "}"; + + collection.Add(json).Execute(); + + json = "{\"_id\":\"1001\",\"XYZ\":3333"; + for (j = 0; j < maxFld; j++) + { + json = json + ",\"ARR" + j + "\":["; + for (i = 0; i < maxdepth; i++) + { + json = json + i + ",["; + } + json = json + i; + for (i = maxdepth - 1; i >= 0; i--) + { + json = json + "]," + i; + } + json = json + "]"; + } + + for (j = 0; j < maxFld; j++) + { + json = json + ",\"DATAX" + j + "\":"; + for (i = 0; i < maxdepth; i++) + { + json = json + "{\"D" + i + "\":"; + } + json = json + maxdepth; + for (i = maxdepth - 1; i >= 0; i--) + { + json = json + "}"; + } + } + json = json + "}"; + + collection.Add(json).Execute(); + + //Update each array one by one + for (n = 1; n < 2; n++) + { + collection.Modify("_id = :_id"). + Patch("{\"ARR" + i + "\":[9,[8,[7,[6,[5,[4],5],6],7],8],9]}"). + Bind("_id", "1002").Execute(); + var document1 = collection.GetOne("1002"); + var test = "ARR" + i; + object[] arr1 = document1[test] as object[]; + Assert.That(arr1.Length, Is.EqualTo(3)); + i = 0; + j = 0; + for (i = 0; i < arr1.Length; i++) + { + + if (i == 1) + { + object[] arr2 = arr1[1] as object[]; + Assert.That(arr2.Length, Is.EqualTo(3)); + for (j = 0; j < arr2.Length; j++) + { + + if (j == 1) + { + object[] arr3 = arr2[1] as object[]; + Assert.That(arr3.Length, Is.EqualTo(3)); + for (k = 0; k < arr3.Length; k++) + { + + if (k == 1) + { + object[] arr4 = arr3[1] as object[]; + Assert.That(arr4.Length, Is.EqualTo(3)); + for (l = 0; l < arr4.Length; l++) + { + + if (l == 1) + { + object[] arr5 = arr4[1] as object[]; + Assert.That(arr5.Length, Is.EqualTo(3)); + for (m = 0; m < arr5.Length; m++) + { + + if (m == 1) + { + object[] arr6 = arr5[1] as object[]; + Assert.That(arr6.Length, Is.EqualTo(1)); + if (arr6.Length == 1) + Assert.That(arr6[0], Is.EqualTo(4)); + } + else + Assert.That(arr5[m], Is.EqualTo(5)); + if (m == 2) + break; + } + } + else + Assert.That(arr4[l], Is.EqualTo(6)); + if (l == 2) + break; + + } + } + else + Assert.That(arr3[k], Is.EqualTo(7)); + if (k == 2) + break; + } + } + if (j == 0 || j == 2) + Assert.That(arr2[j], Is.EqualTo(8)); + if (j == 2) + break; + } + } + else + Assert.That(arr1[i], Is.EqualTo(9)); + if (i == 2) + break; + } + } + //Update each array at one shot + string updatedPatch = "{\"ARR" + 0 + "\":[9,[8,[7,[6,[5,[4],5],6],7],8],9]," + + "\"ARR" + 1 + "\":[9,[8,[7,[6,[5,[4],5],6],7],8],9]," + + "\"ARR" + 2 + "\":[9,[8,[7,[6,[5,[4],5],6],7],8],9]," + + "\"ARR" + 3 + "\":[9,[8,[7,[6,[5,[4],5],6],7],8],9]," + + "\"ARR" + 4 + "\":[9,[8,[7,[6,[5,[4],5],6],7],8],9]," + + "\"ARR" + 5 + "\":[9,[8,[7,[6,[5,[4],5],6],7],8],9]," + + "\"ARR" + 6 + "\":[9,[8,[7,[6,[5,[4],5],6],7],8],9]," + + "\"ARR" + 7 + "\":[9,[8,[7,[6,[5,[4],5],6],7],8],9]," + + "\"ARR" + 8 + "\":[9,[8,[7,[6,[5,[4],5],6],7],8],9]," + + "\"ARR" + 9 + "\":[9,[8,[7,[6,[5,[4],5],6],7],8],9]}"; + + collection.Modify("_id = :_id"). + Patch(updatedPatch). + Bind("_id", "1002").Execute(); + var document = collection.GetOne("1002"); + for (n = 0; n < 10; n++) + { + var test = "ARR" + i; + object[] arr1 = document[test] as object[]; + Assert.That(arr1.Length, Is.EqualTo(3)); + i = 0; + j = 0; + for (i = 0; i < arr1.Length; i++) + { + + if (i == 1) + { + object[] arr2 = arr1[1] as object[]; + Assert.That(arr2.Length, Is.EqualTo(3)); + for (j = 0; j < arr2.Length; j++) + { + + if (j == 1) + { + object[] arr3 = arr2[1] as object[]; + Assert.That(arr3.Length, Is.EqualTo(3)); + for (k = 0; k < arr3.Length; k++) + { + + if (k == 1) + { + object[] arr4 = arr3[1] as object[]; + Assert.That(arr4.Length, Is.EqualTo(3)); + for (l = 0; l < arr4.Length; l++) + { + + if (l == 1) + { + object[] arr5 = arr4[1] as object[]; + Assert.That(arr5.Length, Is.EqualTo(3)); + for (m = 0; m < arr5.Length; m++) + { + + if (m == 1) + { + object[] arr6 = arr5[1] as object[]; + Assert.That(arr6.Length, Is.EqualTo(1)); + if (arr6.Length == 1) + Assert.That(arr6[0], Is.EqualTo(4)); + } + else + Assert.That(arr5[m], Is.EqualTo(5)); + if (m == 2) + break; + } + } + else + Assert.That(arr4[l], Is.EqualTo(6)); + if (l == 2) + break; + + } + } + else + Assert.That(arr3[k], Is.EqualTo(7)); + if (k == 2) + break; + } + } + if (j == 0 || j == 2) + Assert.That(arr2[j], Is.EqualTo(8)); + if (j == 2) + break; + } + } + else + Assert.That(arr1[i], Is.EqualTo(9)); + if (i == 2) + break; + } + } + + // Replace/Update in different Nesting Depths + List listDocs = new List(); + listDocs.Add(documentsAsDbDocs[0]); + listDocs.Add(new DbDoc(documentAsJsonString2)); + collection = CreateCollection("test"); + Result r = collection.Add(listDocs.ToArray()).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2)); + + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document["title"], Is.EqualTo("AFRICAN EGG")); + // Modify Using ID and Patch Title + collection.Modify("_id = :id").Patch("{ \"title\": \"The African Egg\" }"). + Bind("id", "a6f4b93e1a264a108393524f29546a8c").Execute(); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document["title"], Is.EqualTo("The African Egg")); + + Assert.That(((Dictionary)((Dictionary)document["additionalinfo"])["director"])["age"], Is.EqualTo(57)); + // Modify Using additionalinfo.director.name = :director and Patch Age 67 + collection.Modify("additionalinfo.director.name = :director"). + Patch("{ \"additionalinfo\": { \"director\": { \"age\": 67 } } }"). + Bind("director", "Sharice Legaspi").Execute(); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(((Dictionary)((Dictionary)document["additionalinfo"])["director"])["age"], Is.EqualTo(67)); + + // Modify Using _id=:id and Patch Age 77 + collection.Modify("_id = :id"). + Patch("{ \"additionalinfo\": { \"director\": { \"age\": 77 } } }"). + Bind("id", "a6f4b93e1a264a108393524f29546a8c").Execute(); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(((Dictionary)((Dictionary)document["additionalinfo"])["director"])["age"], Is.EqualTo(77)); + + // Modify Using _id=:id and Patch contains movie title + collection.Modify("_id = :id"). + Patch("{ \"title\": { \"movie\": \"The African Egg\"} }"). + Bind("id", "a6f4b93e1a264a108393524f29546a8c").Execute(); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(((Dictionary)document["title"])["movie"], Is.EqualTo("The African Egg")); + + // Modify Using _id=:id and Patch additionalinfo Birthplace director country countryActual + collection.Modify("_id = :id"). + Patch("{ \"additionalinfo\": { \"director\": { \"birthplace\": { \"country\": { \"countryActual\": \"India\" } } } } }"). + Bind("id", "123456789asdferdfghhghjh12334").Execute(); + document = collection.GetOne("123456789asdferdfghhghjh12334"); + Assert.That(document["additionalinfo.director.birthplace.country.countryActual"], Is.EqualTo("India")); + + // Modify Using _id=:id and Patch additionalinfo Birthplace director country countryActual" + collection.Modify("_id = :id"). + Patch("{ \"additionalinfo\": { \"director\": { \"birthplace\": { \"country\": { \"city\": \"NewDelhi\",\"countryActual\": \"India\" } } } } }"). + Bind("id", "123456789asdferdfghhghjh12334").Execute(); + document = collection.GetOne("123456789asdferdfghhghjh12334"); + Assert.That(document["additionalinfo.director.birthplace.country.countryActual"], Is.EqualTo("India")); + Assert.That(document["additionalinfo.director.birthplace.country.city"], Is.EqualTo("NewDelhi")); + + // Modify Using _id=:id and Patch additionalinfo Birthplace director country to replace an array + collection.Modify("_id = :id"). + Patch("{ \"additionalinfo\": { \"director\": { \"birthplace\": { \"country\": \"India\" } } } }"). + Bind("id", "123456789asdferdfghhghjh12334").Execute(); + document = collection.GetOne("123456789asdferdfghhghjh12334"); + Assert.That(document["additionalinfo.director.birthplace.country"], Is.EqualTo("India")); + + // Modify Using _id=:id and Patch additionalinfo writers to replace an array + collection.Modify("_id = :id"). + Patch("{ \"additionalinfo\": { \"writers\": \"Jeoff Archer\" } }"). + Bind("id", "123456789asdferdfghhghjh12334").Execute(); + document = collection.GetOne("123456789asdferdfghhghjh12334"); + Assert.That(document["additionalinfo.writers"], Is.EqualTo("Jeoff Archer")); + + //Reset the docs + collection = CreateCollection("test"); + r = collection.Add(listDocs.ToArray()).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2)); + + // Modify Using _id=:id and Patch contains blank + collection.Modify("_id = :id").Patch("{ \"additionalinfo\": \"\" }"). + Bind("id", "a6f4b93e1a264a108393524f29546a8c").Execute(); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + + + } + + [Test, Description("Test valid modify.patch to add/remove fields at Depth for multiple arrays.))")] + public void ModifyPatchAtDepthMultipleArrays_S1() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + Collection collection = CreateCollection("test"); + List listDocs = new List(); + listDocs.Add(documentsAsDbDocs[0]); + listDocs.Add(new DbDoc(documentAsJsonString2)); + Result r = collection.Add(listDocs.ToArray()).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2)); + object[] path = null; + DbDoc document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.Throws(() => path = document["translations"] as object[]); + + collection.Modify("_id = :id"). + Patch("{ \"translations\": [\"Spanish\"] }"). + Bind("id", "a6f4b93e1a264a108393524f29546a8c").Execute(); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + path = document["translations"] as object[]; + Assert.That(path[0], Is.EqualTo("Spanish"), + "Verify transalations field is present or not"); + collection.Modify("_id = :id"). + Patch("{ \"translations\": null }"). + Bind("id", "a6f4b93e1a264a108393524f29546a8c").Execute(); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.Throws(() => path = document["translations"] as object[]); + Assert.Throws(() => path[0] = document["additionalinfo.director.mobile"]); + + collection.Modify("additionalinfo.director.age = :age"). + Patch("{ \"additionalinfo\": { \"director\": { \"mobile\": \"9876543210\" } } }"). + Bind("age", 57).Execute(); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document["additionalinfo.director.mobile"], Is.EqualTo("9876543210"), + "Verify mobile field is present or not"); + collection.Modify("additionalinfo.director.name = :director"). + Patch("{ \"additionalinfo\": { \"director\": { \"mobile\": null } } }"). + Bind("director", "Sharice Legaspi").Execute(); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.Throws(() => path[0] = document["additionalinfo.director.mobile"]); + Assert.Throws(() => path[0] = document["additionalinfo.musicby"]); + + collection.Modify("_id = :id"). + Patch("{ \"additionalinfo\": { \"musicby\": \"The Sakila\" } }"). + Bind("id", "a6f4b93e1a264a108393524f29546a8c").Execute(); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document["additionalinfo.musicby"], Is.EqualTo("The Sakila"), + "Verify musicby field is present or not"); + collection.Modify("_id = :id").Patch("{ \"additionalinfo\": { \"musicby\": null } }"). + Bind("id", "a6f4b93e1a264a108393524f29546a8c").Execute(); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.Throws(() => path[0] = document["additionalinfo.musicby"]); + Assert.Throws(() => path[0] = document["additionalinfo.director.awards.genre"]); + + collection.Modify("_id = :id"). + Patch("{\"additionalinfo\": { \"director\": { \"awards\": { \"genre\": \"Action\" } } } }"). + Bind("id", "a6f4b93e1a264a108393524f29546a8c").Execute(); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document["additionalinfo.director.awards.genre"], Is.EqualTo("Action"), + "Verify musicby field is present or not"); + collection.Modify("_id = :id"). + Patch("{\"additionalinfo\": { \"director\": { \"awards\": { \"genre\": null } } } }"). + Bind("id", "a6f4b93e1a264a108393524f29546a8c").Execute(); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.Throws(() => path[0] = document["additionalinfo.director.awards.genre"]); + + } + + [Test, Description("Test valid modify.patch to use expr to change existing keys in document))")] + public void ModifyPatchAtDepthMultipleArrays_S2() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + DbDoc document = null; + Collection collection = CreateCollection("test"); + Result r = collection.Add("{ \"_id\": \"123\", \"email\": \"alice@ora.com\", " + + "\"startDate\": \"4/1/2017\" }").Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + var patch1 = new + { + email = new MySqlExpression("UPPER($.email)") + }; + var patch2 = new + { + email = new MySqlExpression("LOWER($.email)") + }; + var patch3 = new + { + email = new MySqlExpression("CONCAT('No', 'S', 'QL')") + }; + var patch4 = new + { + email = new MySqlExpression("CHAR(77, 121, 83, 81, '76')") + }; + var patch5 = new + { + email = new MySqlExpression("CONCAT('My', NULL, 'QL')") + }; + var patch6 = new + { + email = new MySqlExpression("ELT(4, 'ej', 'Heja', 'hej', 'foo')") + }; + var patch7 = new + { + email = new MySqlExpression("REPEAT('MySQL', 3)") + }; + var patch8 = new + { + email = new MySqlExpression("REVERSE('abc')") + }; + var patch9 = new + { + email = new MySqlExpression("RIGHT('foobarbar', 4)") + }; + var patch10 = new + { + email = new MySqlExpression(" REPLACE('www.mysql.com', 'w', 'Ww')") + }; + var patch11 = new + { + email = new MySqlExpression(" HEX('abc')") + }; + var patch12 = new + { + email = new MySqlExpression(" BIN(12)") + }; + + collection.Modify("true").Patch(patch1).Execute(); + document = collection.GetOne("123"); + Assert.That(document["email"], Is.EqualTo("ALICE@ORA.COM")); + collection.Modify("true").Patch(patch2).Execute(); + document = collection.GetOne("123"); + Assert.That(document["email"], Is.EqualTo("alice@ora.com")); + collection.Modify("true").Patch(patch3).Execute(); + document = collection.GetOne("123"); + Assert.That(document["email"], Is.EqualTo("NoSQL")); + collection.Modify("true").Patch(patch4).Execute(); + document = collection.GetOne("123"); + Assert.That(document["email"], Is.EqualTo("base64:type15:TXlTUUw=")); + collection.Modify("true").Patch(patch5).Execute(); + document = collection.GetOne("123"); + DbDoc test = null; + Assert.Throws(()=> test = (DbDoc)document["email"]); + + collection = CreateCollection("test"); + r = collection.Add("{ \"_id\": \"123\", \"email\": \"alice@ora.com\", " + + "\"startDate\": \"4/1/2017\" }").Execute(); + collection.Modify("true").Patch(patch6).Execute(); + document = collection.GetOne("123"); + Assert.That(document["email"], Is.EqualTo("foo")); + collection.Modify("true").Patch(patch7).Execute(); + document = collection.GetOne("123"); + Assert.That(document["email"], Is.EqualTo("MySQLMySQLMySQL")); + collection.Modify("true").Patch(patch8).Execute(); + document = collection.GetOne("123"); + Assert.That(document["email"], Is.EqualTo("cba")); + collection.Modify("true").Patch(patch9).Execute(); + document = collection.GetOne("123"); + Assert.That(document["email"], Is.EqualTo("rbar")); + collection.Modify("true").Patch(patch10).Execute(); + document = collection.GetOne("123"); + Assert.That(document["email"], Is.EqualTo("WwWwWw.mysql.com")); + collection.Modify("true").Patch(patch11).Execute(); + document = collection.GetOne("123"); + Assert.That(document["email"], Is.EqualTo("616263")); + collection.Modify("true").Patch(patch12).Execute(); + document = collection.GetOne("123"); + Assert.That(document["email"], Is.EqualTo("1100")); + + string t1 = "{\"_id\": \"1\", \"name\": \"Alice\" }"; + collection = CreateCollection("test"); + r = collection.Add(t1).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + collection.Modify("_id = :id").Patch("{ \"dateAndTimeValue\": YEAR('2000-01-01') }").Bind("id", "1").Execute(); + document = collection.GetOne("1"); + Assert.That(document["dateAndTimeValue"], Is.EqualTo(2000)); + + collection.Modify("_id = :id").Patch("{ \"dateAndTimeValue\": MONTH('2008-02-03') }").Bind("id", "1").Execute(); + document = collection.GetOne("1"); + Assert.That(document["dateAndTimeValue"], Is.EqualTo(2)); + + collection.Modify("_id = :id").Patch("{ \"dateAndTimeValue\": WEEK('2008-02-20') }").Bind("id", "1").Execute(); + document = collection.GetOne("1"); + Assert.That(document["dateAndTimeValue"], Is.EqualTo(7)); + + collection.Modify("_id = :id").Patch("{ \"dateAndTimeValue\": DAY('2008-02-20') }").Bind("id", "1").Execute(); + document = collection.GetOne("1"); + Assert.That(document["dateAndTimeValue"], Is.EqualTo(20)); + + collection.Modify("_id = :id").Patch("{ \"dateAndTimeValue\": HOUR('10:05:03') }").Bind("id", "1").Execute(); + document = collection.GetOne("1"); + Assert.That(document["dateAndTimeValue"], Is.EqualTo(10)); + + collection.Modify("_id = :id").Patch("{ \"dateAndTimeValue\": MINUTE('2008-02-03 10:05:03') }").Bind("id", "1").Execute(); + document = collection.GetOne("1"); + Assert.That(document["dateAndTimeValue"], Is.EqualTo(5)); + + collection.Modify("_id = :id").Patch("{ \"dateAndTimeValue\": SECOND('10:05:03') }").Bind("id", "1").Execute(); + document = collection.GetOne("1"); + Assert.That(document["dateAndTimeValue"], Is.EqualTo(3)); + + collection.Modify("_id = :id").Patch("{ \"dateAndTimeValue\": MICROSECOND('12:00:00.123456') }").Bind("id", "1").Execute(); + document = collection.GetOne("1"); + Assert.That(document["dateAndTimeValue"], Is.EqualTo(123456)); + + collection.Modify("_id = :id").Patch("{ \"dateAndTimeValue\": QUARTER('2008-04-01') }").Bind("id", "1").Execute(); + document = collection.GetOne("1"); + Assert.That(document["dateAndTimeValue"], Is.EqualTo(2)); + + collection.Modify("_id = :id").Patch("{ \"dateAndTimeValue\": TIME('2003-12-31 01:02:03') }").Bind("id", "1").Execute(); + document = collection.GetOne("1"); + Assert.That(document["dateAndTimeValue"], Is.EqualTo("01:02:03.000000")); + + collection.Modify("_id = :id").Patch("{ \"dateAndTimeValue\": DATE('2003-12-31 01:02:03') }").Bind("id", "1").Execute(); + document = collection.GetOne("1"); + Assert.That(document["dateAndTimeValue"], Is.EqualTo("2003-12-31")); + + List listDocs = new List(); + listDocs.Add(documentsAsDbDocs[0]); + listDocs.Add(new DbDoc(documentAsJsonString2)); + r = collection.Add(listDocs.ToArray()).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2)); + + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + object[] actors = document["actors"] as object[]; + Assert.That(actors.Length, Is.EqualTo(3)); + Dictionary actor0 = actors[0] as Dictionary; + + Assert.Throws(() => test = (DbDoc)actor0["age"]); + + t1 = + "{\"_id\": \"1\", \"name\": \"Alice\", \"details\": {\"personal\":{\"mobile\": \"9876543210\", " + + "\"DOB\": \"19 Mar 1982\", \"citizen\": \"USA\"}}}"; + collection = CreateCollection("test"); + r = collection.Add(t1).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + collection.Modify("_id = :id"). + Patch("{\"details\":{\"personal\": null,\"mobile\":$.details.personal.mobile,\"yearofbirth\":" + + "CAST(SUBSTRING_INDEX($.details.personal.DOB, ' ', -1) AS DECIMAL)}}").Bind("id", "1"). + Execute(); + document = collection.GetOne("1"); + Assert.That(document["name"], Is.EqualTo("Alice")); + Assert.That(document["details.mobile"], Is.EqualTo("9876543210")); + Assert.That(document["details.yearofbirth"].ToString(), Is.EqualTo("1982")); + collection = CreateCollection("test"); + r = collection.Add(t1).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + collection.Modify("_id = :id"). + Patch("{\"details\":{\"personal\": null,\"mobile\":$.details.personal.mobile,\"currentyear\":" + + "CURDATE()}}").Bind("id", "1"). + Execute(); + document = collection.GetOne("1"); + Assert.That(document["name"], Is.EqualTo("Alice")); + Assert.That(document["details.mobile"], Is.EqualTo("9876543210")); + Assert.That(document["details.currentyear"].ToString(), Is.EqualTo(document["details.currentyear"].ToString()), "Matching the current date"); + collection = CreateCollection("test"); + r = collection.Add(t1).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + collection.Modify("_id = :id"). + Patch("{\"details\":{\"personal\": null,\"mobile\":$.details.personal.mobile,\"currentyear\":" + + "Year(CURDATE())}}").Bind("id", "1"). + Execute(); + document = collection.GetOne("1"); + Assert.That(document["name"], Is.EqualTo("Alice")); + Assert.That(document["details.mobile"], Is.EqualTo("9876543210")); + Assert.That(document["details.currentyear"].ToString(), Is.EqualTo(document["details.currentyear"].ToString())); + collection = CreateCollection("test"); + r = collection.Add(t1).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + collection.Modify("_id = :id"). + Patch("{\"details\":{\"personal\": null,\"mobile\":$.details.personal.mobile,\"currentage\":" + + "Year(CURDATE()) - CAST(SUBSTRING_INDEX($.details.personal.DOB, ' ', -1) AS DECIMAL)}}").Bind("id", "1"). + Execute(); + document = collection.GetOne("1"); + Assert.That(document["name"], Is.EqualTo("Alice")); + Assert.That(document["details.mobile"], Is.EqualTo("9876543210")); + Assert.That(document["details.currentage"].ToString(), Is.EqualTo(document["details.currentage"].ToString())); + + collection = CreateCollection("test"); + r = collection.Add(listDocs.ToArray()).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2)); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + // Get root array. + Assert.Throws(() => test = (DbDoc)document["audio"]); + + collection.Modify("true"). + Patch("{ \"audio\": CONCAT($.language, ', no subtitles') }").Execute(); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document["audio"], Is.EqualTo("English, no subtitles")); + + collection = CreateCollection("test"); + r = collection.Add(listDocs.ToArray()).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2)); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.Throws(() => test = (DbDoc)document["audio"]); + + collection.Modify("true").Patch("{ \"audio\": CONCAT(UPPER($.language), ', No Subtitles') }").Execute(); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document["audio"], Is.EqualTo("ENGLISH, No Subtitles")); + + collection = CreateCollection("test"); + r = collection.Add(listDocs.ToArray()).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2)); + + collection.Modify("_id = :id").Patch("{ \"_id\": replace(UUID(), '-', '') }"). + Bind("id", "a6f4b93e1a264a108393524f29546a8c").Execute(); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document.Id, Is.EqualTo("a6f4b93e1a264a108393524f29546a8c")); + + collection = CreateCollection("test"); + r = collection.Add(listDocs.ToArray()).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2)); + Assert.Throws(() => test = (DbDoc)document["additionalinfo._id"]); + + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + collection.Modify("_id = :id").Patch("{ \"additionalinfo\": { \"_id\": replace(UUID(), '-', '') } }"). + Bind("id", "a6f4b93e1a264a108393524f29546a8c").Execute(); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(((Dictionary)document["additionalinfo"])["_id"] != null); + + collection = CreateCollection("test"); + r = collection.Add(listDocs.ToArray()).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2)); + + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.Throws(() => test = (DbDoc)document["additionalinfo.releasedate"]); + + try + { + collection.Modify("_id = :id"). + Patch("{ \"releasedate\": DATE_ADD('2006-04-00',INTERVAL 1 DAY) }"). + Bind("id", "a6f4b93e1a264a108393524f29546a8c").Execute(); + } + catch (MySqlException ex) + { + Assert.That(ex.Message, Is.EqualTo("Invalid data for update operation on document collection table")); + } + + collection = CreateCollection("test"); + r = collection.Add(listDocs.ToArray()).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2)); + + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document["title"], Is.EqualTo("AFRICAN EGG")); + collection.Modify("_id = :id").Patch("{ \"title\": concat('my ', NULL, ' title') }"). + Bind("id", "a6f4b93e1a264a108393524f29546a8c").Execute(); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.Throws(() => test = (DbDoc)document["title"]); + + collection = CreateCollection("test"); + r = collection.Add(listDocs.ToArray()).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2)); + + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.Throws(() => test = (DbDoc)document["docfield"]); + + collection.Modify("_id = :id").Patch("{ \"docfield\": JSON_OBJECT('field 1', 1, 'field 2', 'two') }"). + Bind("id", "a6f4b93e1a264a108393524f29546a8c").Execute(); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + object docField = document["docfield"] as object; + + Assert.That(docField != null); + + collection = CreateCollection("test"); + r = collection.Add(listDocs.ToArray()).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2)); + + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(document["genre"], Is.EqualTo("Science fiction")); + + collection.Modify("_id = :id").Patch("{ \"genre\": JSON_OBJECT('name', 'Science Fiction') }"). + Bind("id", "a6f4b93e1a264a108393524f29546a8c").Execute(); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + Assert.That(((Dictionary)document["genre"])["name"], Is.EqualTo("Science Fiction")); + + } + + [Test, Description("Test invalid modify.patch to attempt to use invalid string (non JSON string/empty/NULL) as patch string.))")] + public void ModifyPatchInvalidString() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + var collection = CreateCollection("test"); + var docs = new[] + { + new {_id = 1, title = "Book 1", pages = 20, age = 12}, + new {_id = 2, title = "Book 2", pages = 30,age = 18}, + new {_id = 3, title = "Book 3", pages = 40,age = 34}, + new {_id = 4, title = "Book 4", pages = 50,age = 12} + }; + Result r = collection.Add(docs).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4)); + var document = collection.GetOne("1"); + var jsonParams = "invalidJsonString"; + Assert.Throws(() => ExecuteModifyStatement(collection.Modify("age = :age").Patch(jsonParams).Bind("age", "12"))); + + jsonParams = "{invalidJsonString}"; + Assert.Throws(() => ExecuteModifyStatement(collection.Modify("age = :age").Patch(jsonParams).Bind("age", "12"))); + + jsonParams = "{\"_id\":\"1004\",\"F1\": ] }"; + Assert.Throws(() => ExecuteModifyStatement(collection.Modify("age = :age").Patch(jsonParams).Bind("age", "12"))); + + Assert.Throws(() => ExecuteModifyStatement(collection.Modify("true").Patch(null))); + + Assert.Throws(() => ExecuteModifyStatement(collection.Modify("true").Patch(""))); + + Assert.Throws(() => ExecuteModifyStatement(collection.Modify("true").Patch(" "))); + + Assert.Throws(() => ExecuteModifyStatement(collection.Modify("true").Patch(string.Empty))); + + + r = collection.Add(documentsAsJsonStrings).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + collection.Modify("true").Patch("{ \"_id\": NULL }").Execute(); + Assert.That(collection.Find().Execute().FetchOne().Id.ToString(), Is.EqualTo("1")); + + collection = CreateCollection("test"); + r = collection.Add(documentsAsJsonStrings).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + collection.Modify("true").Patch("{ \"nullfield\": NULL }").Execute(); + DbDoc test = null; + Assert.Throws (() => test = (DbDoc)collection.Find().Execute().FetchOne()["nullfield"]); + + collection.Modify("true").Patch("{ \"nullfield\": [NULL, NULL] }").Execute(); + document = collection.Find().Execute().FetchOne(); + var nullArray = (object[])document["nullfield"]; + Assert.That(nullArray[0], Is.EqualTo(null)); + Assert.That(nullArray[1], Is.EqualTo(null)); + + collection.Modify("true").Patch("{ \"nullfield\": { \"nested\": NULL } }").Execute(); + document = collection.Find().Execute().FetchOne(); + Assert.That(((Dictionary)document["nullfield"]).Count == 0, Is.EqualTo(true)); + + collection.Modify("true").Patch("{ \"nullfield\": { \"nested\": [NULL, NULL] } }").Execute(); + document = collection.Find().Execute().FetchOne(); + var nestedNullArray = (object[])((Dictionary)document["nullfield"])["nested"]; + Assert.That(nestedNullArray[0], Is.EqualTo(null)); + Assert.That(nestedNullArray[1], Is.EqualTo(null)); + + collection.Modify("true").Patch("{ \"additionalinfo\": { \"nullfield\": NULL } }").Execute(); + Dictionary test2 = null; + Assert.Throws(() => test2 = ((Dictionary)collection.Find().Execute().FetchOne()["additionalinfo.nullfield"])); + + collection.Modify("true").Patch("{ \"additionalinfo\": { \"nullfield\": [NULL, NULL] } }").Execute(); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + nestedNullArray = (object[])((Dictionary)document["additionalinfo"])["nullfield"]; + Assert.That(nestedNullArray[0], Is.EqualTo(null)); + Assert.That(nestedNullArray[1], Is.EqualTo(null)); + + collection.Modify("true").Patch("{ \"additionalinfo\": { \"nullfield\": { \"nested\": [NULL, NULL] } } }").Execute(); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + + nestedNullArray = (object[])((((Dictionary)((Dictionary)document["additionalinfo"])["nullfield"]))["nested"]); + Assert.That(nestedNullArray[0], Is.EqualTo(null)); + Assert.That(nestedNullArray[1], Is.EqualTo(null)); + + collection.Modify("true").Patch("{ \"additionalinfo\": { \"nullfield\": { \"nested\": JSON_OBJECT('field', null) } } }").Execute(); + document = collection.GetOne("a6f4b93e1a264a108393524f29546a8c"); + var nestedObject = (Dictionary)((Dictionary)((Dictionary)document["additionalinfo.nullfield.nested"])); + Assert.That(nestedObject.Count, Is.EqualTo(0)); + } + + #endregion WL14389 + + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/MockServer.cs b/MySQL.Data/tests/MySqlX.Data.Tests/MockServer.cs new file mode 100644 index 000000000..d600576b6 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/MockServer.cs @@ -0,0 +1,138 @@ +// Copyright © 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Net; +using System.Net.Sockets; +using System.Threading; +using System.Threading.Tasks; + +namespace MySqlX.Data.Tests +{ + public class MockServer + { + private TcpListener listener; + + private int _port; + + private IPAddress _address; + + private ManualResetEvent _stopserver = new ManualResetEvent(false); + + private CancellationTokenSource cts; + + private bool _usetimeout; + + public int Port + { + get => _port; + set => _port = value; + } + + public IPAddress Address + { + get => _address; + set => _address = value; + } + + public MockServer(bool usetimeout) + { + GetMockServerInfo(); + _stopserver.Reset(); + _usetimeout = usetimeout; + cts = new CancellationTokenSource(TimeSpan.FromSeconds(12)); + } + + public void GetMockServerInfo() + { + TcpListener loopback = new TcpListener(IPAddress.Loopback, 0); + loopback.Start(); + _port = ((IPEndPoint)loopback.LocalEndpoint).Port; + loopback.Stop(); + _address = Dns.GetHostEntry("localhost").AddressList[0]; + } + + public void StopServer() + { + _stopserver.Set(); + } + public void DisposeListener() + { + if (listener != null) + { + listener.Stop(); + } + } + + public async Task ServerWorker(CancellationToken ct) + { + await Task.Run(() => + { + IPEndPoint endpoint = new IPEndPoint(IPAddress.Loopback, Port); + listener = new(endpoint); + + try + { + listener.Start(); + while (!_stopserver.WaitOne(1)) + { + listener.BeginAcceptSocket(new AsyncCallback(beginConnection), null); + } + } + catch (Exception) + { + } + finally + { + listener.Stop(); + } + }, ct).ConfigureAwait(false); + } + + public void StartServer() + { + ServerWorker(cts.Token).ConfigureAwait(false); + } + + private void beginConnection(IAsyncResult iar) + { + try + { + Socket client = listener.EndAcceptSocket(iar); + if (_usetimeout) + { + Task.Delay(500).Wait(); + client.Close(); + } + } + catch (Exception) + { + } + } + } +} \ No newline at end of file diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/MySqlX.Data.Tests.csproj b/MySQL.Data/tests/MySqlX.Data.Tests/MySqlX.Data.Tests.csproj new file mode 100644 index 000000000..0835199a7 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/MySqlX.Data.Tests.csproj @@ -0,0 +1,120 @@ + + + + MySql.Data.Tests + MySql.Data.Tests Class Library + Copyright © 2016, 2025, Oracle and/or its affiliates. + 9.4.0 + Oracle + Oracle + MySql.Data.Tests + net9.0;net8.0; + MySqlx.Data.Tests + MySql;.NET Connector;MySql Connector/NET;netcore;.Net Core;MySql Conector/Net Core;coreclr;C/NET;C/Net Core + http://www.mysql.com/common/logos/logo-mysql-170x115.png + http://dev.mysql.com/downloads/ + GPL-2.0-only WITH Universal-FOSS-exception-1.0 + true + false + false + false + false + false + false + True + True + ..\..\..\ConnectorNetPublicKey.snk + CS1591,CS1587,CS1574,CS1570,CS1701,CA2100 + latest + + + + $(TargetFrameworks);net10.0 + + + + net462;net48;$(TargetFrameworks) + + + + + + + + + + + + + True + True + Resources.resx + + + + + + PublicResXFileCodeGenerator + Resources.Designer.cs + + + + + $(DefineConstants);TRACE;DEBUG + true + + + + $(DefineConstants);TRACE;RELEASE + true + + + + + + + + + + + + + + + + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + \ No newline at end of file diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/PerformanceTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/PerformanceTests.cs new file mode 100644 index 000000000..b35491dff --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/PerformanceTests.cs @@ -0,0 +1,243 @@ +// Copyright © 2018, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Relational; +using System; +using System.Collections.Generic; + +namespace MySqlX.Data.Tests +{ + /// + /// Provides methods designed to identify performance issues. Tests in this class are only meant to be ran + /// when working with Performance Profiling. + /// + public class PerformanceTests + { + private const string PERFORMANCE_SCHEMA = "PerfSchema"; + private string HOST = Environment.GetEnvironmentVariable("MYSQL_HOST") ?? "localhost"; + private string USER = Environment.GetEnvironmentVariable("MYSQL_ROOT_USER") ?? "root"; + private int X_DEVAPI_PORT = int.Parse(Environment.GetEnvironmentVariable("MYSQLX_PORT") ?? "33060"); + + private static Session _session; + private static string _connectionString; + private static string _connectionURI; + private static Schema _schema; + private static DbDoc _emptyDocument; + + public PerformanceTests() + { + _connectionString = $"server={HOST};user={USER};port={X_DEVAPI_PORT};database={PERFORMANCE_SCHEMA}"; + _connectionURI = $"mysqlx://{USER}:@{HOST}:{X_DEVAPI_PORT}?database={PERFORMANCE_SCHEMA}"; + + _session = MySQLX.GetSession($"server={HOST};user={USER};port={X_DEVAPI_PORT};"); + _schema = _session.GetSchema(PERFORMANCE_SCHEMA); + if (_schema.ExistsInDatabase()) + _session.DropSchema(PERFORMANCE_SCHEMA); + + _schema = _session.CreateSchema(PERFORMANCE_SCHEMA); + _session.SetCurrentSchema(PERFORMANCE_SCHEMA); + + _emptyDocument = new DbDoc(); + } + + #region CreateAndCloseSession + + public void SessionCreateWithConnectionString() + { + using (var internalSession = MySQLX.GetSession(_connectionString)) + { } + + _session = MySQLX.GetSession(_connectionString); + _session.Close(); + } + + public void SessionCreateWithURI() + { + using (var internalSession = MySQLX.GetSession(_connectionURI)) + { } + + _session = MySQLX.GetSession(_connectionURI); + _session.Close(); + } + + public void SessionCreateWithAnonymousObject() + { + var connectionObject = new { server = HOST, user = USER, port = X_DEVAPI_PORT }; + using (var internalSession = MySQLX.GetSession(connectionObject)) + { } + + _session = MySQLX.GetSession(connectionObject); + _session.Close(); + } + + public void SessionCreateWithComplexConnectionString() + { + var connectionString = _connectionString + ";auth=AUTO;charset=utf8mb4;sslmode=required"; + using (var internalSession = MySQLX.GetSession(connectionString)) + { } + + _session = MySQLX.GetSession(_connectionString); + _session.Close(); + } + + public void SessionCreateWithComplexConnectionURI() + { + var connectionUri = _connectionURI + "&auth=AUTO&charset=utf8mb4&sslmode=required"; + using (var internalSession = MySQLX.GetSession(connectionUri)) + { } + + _session = MySQLX.GetSession(_connectionURI); + _session.Close(); + } + + public void SessionCreateWithComplexAnonymousObject() + { + var connectionObject = new + { + server = HOST, + user = USER, + port = X_DEVAPI_PORT, + auth = MySqlAuthenticationMode.AUTO, + charset = "utf8mb4", + sslmode = MySqlSslMode.Required + }; + using (var internalSession = MySQLX.GetSession(connectionObject)) + { } + + _session = MySQLX.GetSession(connectionObject); + _session.Close(); + } + + #endregion + + #region RawSQL + + public void SQLRaw() + { + ExecuteSQL("CREATE TABLE test(a VARCHAR(255), b INT, c DATE, d BIT, e TINYINT(1))"); + ExecuteSQL("CREATE TABLE test2(a VARCHAR(255), b INT, c DATE, d BIT, e TINYINT(1))"); + ExecuteSQL("CREATE TABLE test3(a VARCHAR(255), b INT, c DATE, d BIT, e TINYINT(1))"); + for (int i = 0; i < 10; i++) + { + ExecuteSQL("INSERT INTO test VALUES('a', 1, '2018-01-01', 1, 0)"); + ExecuteSQL("INSERT INTO test2 VALUES('a', 1, '2018-01-01', 1, 0)"); + ExecuteSQL("INSERT INTO test3 VALUES('a', 1, '2018-01-01', 1, 0)"); + } + ExecuteSQL("SELECT * FROM test"); + ExecuteSQL("SELECT * FROM test2"); + ExecuteSQL("SELECT * FROM test3"); + ExecuteSQL("DROP TABLE test"); + ExecuteSQL("DROP TABLE test2"); + ExecuteSQL("DROP TABLE test3"); + ExecuteSQL("SHOW DATABASES"); + ExecuteSQL($"USE {PERFORMANCE_SCHEMA}"); + ExecuteSQL($"SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '{PERFORMANCE_SCHEMA}';"); + ExecuteSQL("START TRANSACTION"); + ExecuteSQL("ROLLBACK"); + } + + private SqlResult ExecuteSQL(string sql) + { + return _session.SQL(sql).Execute(); + } + + #endregion + + public void SchemaGetCollectionValidatingExistence() + { + var collection = _schema.CreateCollection("test", true); + collection = _schema.GetCollection("test", true); + } + + public void SchemaGetCollectionNotValidatingExistence() + { + var collection = _schema.CreateCollection("test"); + collection = _schema.GetCollection("test"); + } + + public void SchemaExistsInDatabase() + { + _schema.ExistsInDatabase(); + } + + public void DbDocCreateEmpty() + { + var document = new DbDoc(); + } + + public void DbDocCreateWithJSONString() + { + var document = new DbDoc("{ \"_id\": 1, \"title\": \"Book 1\", \"pagess\":10, \"author\":\"Ana\" }"); + } + + public void DbDocCreateWithAnonymousObject() + { + var document = new DbDoc(new { _id = 2, title = "Book 2", pages = 20, author = "John" }); + } + + public void DbDocCreateWithDbDocObject() + { + var document = _emptyDocument; + document.Id = 3; + document.SetValue("title", "Book 3"); + document.SetValue("pages", 30); + document.SetValue("author", "Pedro"); + document = new DbDoc(document); + } + + public void DbDocCreateWithDictionary() + { + var dictionary = new Dictionary(); + dictionary.Add("title", "Book 4"); + dictionary.Add("pages", 40); + dictionary.Add("author", "Laura"); + var document = new DbDoc(dictionary); + } + + public void DbDocToString() + { + var document = new DbDoc("{ \"_id\": 1, \"title\": \"Book 1\", \"pagess\":10, \"author\":\"Ana\" }"); + document.ToString(); + } + + public void DbDocEquals() + { + var document = new DbDoc("{ \"_id\": 1, \"title\": \"Book 1\", \"pagess\":10, \"author\":\"Ana\" }"); + var document2 = new DbDoc(new { _id = 2, title = "Book 2", pages = 20, author = "John" }); + document.Equals(document2); + } + + public void SessionSSLModeNone() + { + var session = new Session($"mysqlx://{USER}:@{HOST}:{X_DEVAPI_PORT}?auth=SHA256_MEMORY&sslmode=none"); + session.Close(); + } + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/PreparedStatementsTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/PreparedStatementsTests.cs new file mode 100644 index 000000000..c33e85059 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/PreparedStatementsTests.cs @@ -0,0 +1,948 @@ +// Copyright © 2018, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Common; +using MySqlX.XDevAPI.CRUD; +using MySqlX.XDevAPI.Relational; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace MySqlX.Data.Tests +{ + public class PreparedStatementsTests : BaseTest + { + private const string _collectionName = "Books"; + private string _tableName = "BookTable"; + + private static object[] _docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + + private static object[][] _allRows = { + new object[] { 1, "jonh doe", 38 }, + new object[] { 2, "milton green", 45 }, + new object[] { 3, "larry smith", 24} + }; + + [SetUp] + public void SetUp() => session.Reset(); + + private void InitCollection() + { + Collection coll = CreateCollection(_collectionName); + Result r = ExecuteAddStatement(coll.Add(_docs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4)); + } + + public void InitTable() + { + ExecuteSQL($"DROP TABLE IF EXISTS {_tableName}"); + ExecuteSQL($"CREATE TABLE {_tableName} (id INT, name VARCHAR(45), age INT)"); + TableInsertStatement stmt = testSchema.GetTable(_tableName).Insert(); + for (int i = 0; i < _allRows.Length; i++) + { + stmt.Values(_allRows[i]); + } + Result result = ExecuteInsertStatement(stmt); + } + + private void ValidatePreparedStatements(int count, ulong executions, string sqlText, string threadId = null) + { + if (!GetSession().SupportsPreparedStatements) + { + Console.Error.WriteLine("Prepared statements not supported."); + return; + } + string condition; + if (threadId == null) + condition = "t.processlist_id = @@pseudo_thread_id"; + else + condition = $"t.thread_id = {threadId}"; + + string sql = $"SELECT SQL_TEXT, COUNT_EXECUTE " + + $"FROM performance_schema.prepared_statements_instances AS p " + + $"JOIN performance_schema.threads AS t " + + $"ON p.owner_thread_id = t.thread_id " + + $"WHERE {condition}"; + var preparedStatements = ExecuteSQL(sql).FetchAll(); + + Assert.That(preparedStatements.Count, Is.EqualTo(count)); + if (count > 0) + { + Assert.That(preparedStatements[0]["SQL_TEXT"].ToString(), Is.EqualTo(sqlText).IgnoreCase); + Assert.That(preparedStatements[0]["COUNT_EXECUTE"], Is.EqualTo(executions)); + } + } + + private Collection GetCollection() => GetSession() + .GetSchema(schemaName) + .GetCollection(_collectionName); + + private Table GetTable() => GetSession() + .GetSchema(schemaName) + .GetTable(_tableName); + + [Test] + public void Find() + { + InitCollection(); + Collection coll = GetCollection(); + var findStmt = coll.Find("_id = :id and pages = :pages").Bind("id", 1).Bind("pages", 20); + var doc = ExecuteFindStatement(findStmt); + Assert.That(doc.FetchAll()[0]["title"].ToString(), Is.EqualTo("Book 1")); + Assert.That(findStmt._isPrepared, Is.False); + ValidatePreparedStatements(0, 0, null); + + for (int i = 1; i <= _docs.Length; i++) + { + doc = ExecuteFindStatement(findStmt.Bind("id", i).Bind("pages", i * 10 + 10).Limit(1)); + Assert.That(doc.FetchAll()[0]["title"].ToString(), Is.EqualTo($"Book {i}")); + Assert.That(findStmt._isPrepared || !findStmt.Session.SupportsPreparedStatements); + } + + ValidatePreparedStatements(1, 4, + $"SELECT doc FROM `{schemaName}`.`{_collectionName}` WHERE ((JSON_UNQUOTE(JSON_EXTRACT(doc,'$._id')) = ?) AND (JSON_EXTRACT(doc,'$.pages') = ?)) LIMIT ?, ?"); + } + + [Test] + public void FindWithChanges() + { + InitCollection(); + Collection coll = GetCollection(); + var findStmt = coll.Find("_id = 1"); + + var foundDoc = ExecuteFindStatement(findStmt); + Assert.That(foundDoc.FetchAll()[0]["title"].ToString(), Is.EqualTo("Book 1")); + Assert.That(findStmt._isPrepared, Is.False); + ValidatePreparedStatements(0, 0, null); + + foundDoc = ExecuteFindStatement(findStmt.Limit(1)); + Assert.That(foundDoc.FetchAll()[0]["title"].ToString(), Is.EqualTo("Book 1")); + Assert.That(findStmt._isPrepared || !findStmt.Session.SupportsPreparedStatements); + + ValidatePreparedStatements(1, 1, + $"SELECT doc FROM `{schemaName}`.`{_collectionName}` WHERE (JSON_UNQUOTE(JSON_EXTRACT(doc,'$._id')) = 1) LIMIT ?, ?"); + + for (int i = 1; i <= _docs.Length; i++) + { + var foundDoc2 = ExecuteFindStatement(findStmt.Where($"_id = {i}")); + Assert.That(foundDoc2.FetchAll()[0]["title"].ToString(), Is.EqualTo($"Book {i}")); + Assert.That(findStmt._isPrepared, Is.False); + } + + ValidatePreparedStatements(0, 0, null); + } + + [Test] + public void DeallocatePreparedStatmentsWhenClosingSession() + { + InitCollection(); + string threadId; + using (Session mySession = MySQLX.GetSession(ConnectionString)) + { + mySession.SetCurrentSchema(schemaName); + threadId = mySession.SQL("SELECT THREAD_ID FROM performance_schema.threads WHERE PROCESSLIST_ID=CONNECTION_ID()").Execute().FetchOne()[0].ToString(); + Collection coll = mySession.GetSchema(schemaName).GetCollection(_collectionName); + + var findStmt = coll.Find($"_id = 1"); + + var foundDoc = ExecuteFindStatement(findStmt); + Assert.That(foundDoc.FetchAll()[0]["title"].ToString(), Is.EqualTo("Book 1")); + Assert.That(findStmt._isPrepared, Is.False); + ValidatePreparedStatements(0, 0, null, threadId); + + foundDoc = ExecuteFindStatement(findStmt.Limit(1)); + Assert.That(foundDoc.FetchAll()[0]["title"].ToString(), Is.EqualTo("Book 1")); + Assert.That(findStmt._isPrepared || !findStmt.Session.SupportsPreparedStatements); + + if (findStmt.Session.SupportsPreparedStatements) + { + ValidatePreparedStatements(1, 1, + $"SELECT doc FROM `{schemaName}`.`{_collectionName}` WHERE (JSON_UNQUOTE(JSON_EXTRACT(doc,'$._id')) = 1) LIMIT ?, ?", + threadId); + } + + } + ValidatePreparedStatements(0, 0, null, threadId); + } + + [Test] + public void Select() + { + InitTable(); + Table table = GetTable(); + var selectStmt = table.Select().Where("id = :id").Bind("id", 1); + RowResult row = ExecuteSelectStatement(selectStmt); + Assert.That(row.FetchAll()[0]["name"].ToString(), Is.EqualTo(_allRows[0][1])); + Assert.That(selectStmt._isPrepared, Is.False); + ValidatePreparedStatements(0, 0, null); + + for (int i = 0; i < _allRows.Length; i++) + { + row = ExecuteSelectStatement(selectStmt.Bind("id", i + 1).Limit(1)); + Assert.That(row.FetchAll()[0]["name"].ToString(), Is.EqualTo(_allRows[i][1])); + Assert.That(selectStmt._isPrepared || !selectStmt.Session.SupportsPreparedStatements); + } + + ValidatePreparedStatements(1, 3, + $"SELECT * FROM `{schemaName}`.`{_tableName}` WHERE (`id` = ?) LIMIT ?, ?"); + } + + [Test] + public void SelectWithChanges() + { + InitTable(); + Table table = GetTable(); + var selectStmt = table.Select().Where("id = 1"); + + RowResult row = ExecuteSelectStatement(selectStmt); + Assert.That(row.FetchAll()[0]["name"].ToString(), Is.EqualTo(_allRows[0][1])); + Assert.That(selectStmt._isPrepared, Is.False); + ValidatePreparedStatements(0, 0, null); + + row = ExecuteSelectStatement(selectStmt.Limit(1)); + Assert.That(row.FetchAll()[0]["name"].ToString(), Is.EqualTo(_allRows[0][1])); + Assert.That(selectStmt._isPrepared || !selectStmt.Session.SupportsPreparedStatements); + + ValidatePreparedStatements(1, 1, + $"SELECT * FROM `{schemaName}`.`{_tableName}` WHERE (`id` = 1) LIMIT ?, ?"); + + for (int i = 2; i <= _allRows.Length; i++) + { + row = ExecuteSelectStatement(selectStmt.Where($"id = {i}")); + Assert.That(row.FetchAll()[0]["name"].ToString(), Is.EqualTo(_allRows[i - 1][1])); + Assert.That(selectStmt._isPrepared, Is.False); + } + + ValidatePreparedStatements(0, 0, null); + } + + [Test] + public void Modify() + { + InitCollection(); + Collection coll = GetCollection(); + var modifyStmt = coll.Modify("_id = :id").Set("title", "Magazine 1").Bind("id", 1); + Result result = ExecuteModifyStatement(modifyStmt); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1ul)); + Assert.That(modifyStmt._isPrepared, Is.False); + ValidatePreparedStatements(0, 0, null); + + for (int i = 2; i <= _docs.Length; i++) + { + result = ExecuteModifyStatement(modifyStmt.Bind("id", i).Limit(1)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1ul)); + Assert.That(modifyStmt._isPrepared || !modifyStmt.Session.SupportsPreparedStatements); + } + + ValidatePreparedStatements(1, 3, + $"UPDATE `{schemaName}`.`{_collectionName}` SET doc=JSON_SET(JSON_SET(doc,'$.title','Magazine 1'),'$._id',JSON_EXTRACT(`doc`,'$._id')) WHERE (JSON_EXTRACT(doc,'$._id') = ?) LIMIT ?"); + } + + [Test] + public void ModifyWithChanges() + { + InitCollection(); + Collection coll = GetCollection(); + var modifyStmt = coll.Modify("_id = :id").Set("title", "CONCAT('Magazine ', id)").Bind("id", 1); + Result result = ExecuteModifyStatement(modifyStmt); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1ul)); + Assert.That(modifyStmt._isPrepared, Is.False); + ValidatePreparedStatements(0, 0, null); + + result = ExecuteModifyStatement(modifyStmt.Bind("id", 2).Limit(1)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1ul)); + Assert.That(modifyStmt._isPrepared || !modifyStmt.Session.SupportsPreparedStatements); + ValidatePreparedStatements(1, 1, + $"UPDATE `{schemaName}`.`{_collectionName}` SET doc=JSON_SET(JSON_SET(doc,'$.title','CONCAT(\\'Magazine \\', id)'),'$._id',JSON_EXTRACT(`doc`,'$._id')) WHERE (JSON_EXTRACT(doc,'$._id') = ?) LIMIT ?"); + + for (int i = 3; i <= _docs.Length; i++) + { + result = ExecuteModifyStatement(modifyStmt.Set("title", $"Magazine {i}").Bind("id", i)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1ul)); + Assert.That(modifyStmt._isPrepared, Is.False); + } + + ValidatePreparedStatements(0, 0, null); + } + + [Test] + public void Update() + { + InitTable(); + Table table = GetTable(); + var updateStmt = table.Update().Where("id = :id").Set("name", "Magazine").Bind("id", 1); + Result result = ExecuteUpdateStatement(updateStmt); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1ul)); + Assert.That(updateStmt._isPrepared, Is.False); + ValidatePreparedStatements(0, 0, null); + + for (int i = 2; i <= _allRows.Length; i++) + { + result = ExecuteUpdateStatement(updateStmt.Bind("id", i).Limit(1)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1ul)); + Assert.That(updateStmt._isPrepared || !updateStmt.Session.SupportsPreparedStatements); + } + + ValidatePreparedStatements(1, 2, + $"UPDATE `{schemaName}`.`{_tableName}` SET `name`='Magazine' WHERE (`id` = ?) LIMIT ?"); + } + + [Test] + public void UpdateWithChanges() + { + InitTable(); + Table table = GetTable(); + var updateStmt = table.Update().Where("id = :id").Set("name", "CONCAT('Magazine ', id)").Bind("id", 1); + Result result = ExecuteUpdateStatement(updateStmt); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1ul)); + Assert.That(updateStmt._isPrepared, Is.False); + ValidatePreparedStatements(0, 0, null); + + result = ExecuteUpdateStatement(updateStmt.Bind("id", 2).Limit(1)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1ul)); + Assert.That(updateStmt._isPrepared || !updateStmt.Session.SupportsPreparedStatements); + ValidatePreparedStatements(1, 1, + $"UPDATE `{schemaName}`.`{_tableName}` SET `name`=CONCAT('Magazine ',`id`) WHERE (`id` = ?) LIMIT ?"); + + for (int i = 3; i <= _allRows.Length; i++) + { + result = ExecuteUpdateStatement(updateStmt.Set("name", $"Magazine {i}").Bind("id", i)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1ul)); + Assert.That(updateStmt._isPrepared, Is.False); + } + + ValidatePreparedStatements(0, 0, null); + } + + [Test] + public void Remove() + { + InitCollection(); + Collection coll = GetCollection(); + var removeStmt = coll.Remove("_id = :id").Bind("id", 1); + Result result = ExecuteRemoveStatement(removeStmt); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1ul)); + Assert.That(removeStmt._isPrepared, Is.False); + ValidatePreparedStatements(0, 0, null); + + for (int i = 2; i <= _docs.Length; i++) + { + result = ExecuteRemoveStatement(removeStmt.Bind("id", i).Limit(1)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1ul)); + Assert.That(removeStmt._isPrepared || !removeStmt.Session.SupportsPreparedStatements); + } + + ValidatePreparedStatements(1, 3, + $"DELETE FROM `{schemaName}`.`{_collectionName}` WHERE (JSON_EXTRACT(doc,'$._id') = ?) LIMIT ?"); + } + + [Test] + public void RemoveWithChanges() + { + InitCollection(); + Collection coll = GetCollection(); + var removeStmt = coll.Remove("_id = :id").Bind("id", 1); + Result result = ExecuteRemoveStatement(removeStmt); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1ul)); + Assert.That(removeStmt._isPrepared, Is.False); + ValidatePreparedStatements(0, 0, null); + + result = ExecuteRemoveStatement(removeStmt.Bind("id", 2).Limit(1)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1ul)); + Assert.That(removeStmt._isPrepared || !removeStmt.Session.SupportsPreparedStatements); + ValidatePreparedStatements(1, 1, + $"DELETE FROM `{schemaName}`.`{_collectionName}` WHERE (JSON_EXTRACT(doc,'$._id') = ?) LIMIT ?"); + + for (int i = 3; i <= _docs.Length; i++) + { + result = ExecuteRemoveStatement(removeStmt.Where($"_id = {i}")); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1ul)); + Assert.That(removeStmt._isPrepared, Is.False); + } + + ValidatePreparedStatements(0, 0, null); + } + + [Test] + public void Delete() + { + InitTable(); + Table table = GetTable(); + var deleteStmt = table.Delete().Where("id = :id").Bind("id", 1); + Result result = ExecuteDeleteStatement(deleteStmt); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1ul)); + Assert.That(deleteStmt._isPrepared, Is.False); + ValidatePreparedStatements(0, 0, null); + + for (int i = 2; i <= _allRows.Length; i++) + { + result = ExecuteDeleteStatement(deleteStmt.Bind("id", i).Limit(1)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1ul)); + Assert.That(deleteStmt._isPrepared || !deleteStmt.Session.SupportsPreparedStatements); + } + + ValidatePreparedStatements(1, 2, + $"DELETE FROM `{schemaName}`.`{_tableName}` WHERE (`id` = ?) LIMIT ?"); + } + + [Test] + public void DeleteWithChanges() + { + InitTable(); + Table table = GetTable(); + var deleteStmt = table.Delete().Where("id = :id").Bind("id", 1); + Result result = ExecuteDeleteStatement(deleteStmt); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1ul)); + Assert.That(deleteStmt._isPrepared, Is.False); + ValidatePreparedStatements(0, 0, null); + + result = ExecuteDeleteStatement(deleteStmt.Bind("id", 2).Limit(1)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1ul)); + Assert.That(deleteStmt._isPrepared || !deleteStmt.Session.SupportsPreparedStatements); + ValidatePreparedStatements(1, 1, + $"DELETE FROM `{schemaName}`.`{_tableName}` WHERE (`id` = ?) LIMIT ?"); + + for (int i = 3; i <= _allRows.Length; i++) + { + result = ExecuteDeleteStatement(deleteStmt.Where($"id = {i}")); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1ul)); + Assert.That(deleteStmt._isPrepared, Is.False); + } + + ValidatePreparedStatements(0, 0, null); + } + + [Test] + public void MaxPreparedStmtCount() + { + InitCollection(); + Collection coll = GetCollection(); + try + { + ((Session)coll.Session).SQL("SET GLOBAL max_prepared_stmt_count=0").Execute(); + var findStmt = coll.Find("_id = :id and pages = :pages").Bind("id", 1).Bind("pages", 20); + var doc = ExecuteFindStatement(findStmt); + Assert.That(doc.FetchAll()[0]["title"].ToString(), Is.EqualTo("Book 1")); + Assert.That(findStmt._isPrepared, Is.False); + Assert.That(findStmt.Session.SupportsPreparedStatements); + ValidatePreparedStatements(0, 0, null); + + doc = ExecuteFindStatement(findStmt.Bind("id", 2).Bind("pages", 30).Limit(1)); + Assert.That(doc.FetchAll()[0]["title"].ToString(), Is.EqualTo($"Book 2")); + Assert.That(findStmt._isPrepared, Is.False); + Assert.That(findStmt.Session.SupportsPreparedStatements, Is.False); + + doc = ExecuteFindStatement(findStmt.Bind("id", 3).Bind("pages", 40).Limit(1)); + Assert.That(doc.FetchAll()[0]["title"].ToString(), Is.EqualTo($"Book 3")); + Assert.That(findStmt._isPrepared, Is.False); + Assert.That(findStmt.Session.SupportsPreparedStatements, Is.False); + } + finally + { + ((Session)coll.Session).SQL("SET GLOBAL max_prepared_stmt_count=16382").Execute(); + } + } + + [Test] + public void LimitAndOffset() + { + InitCollection(); + Collection coll = GetCollection(); + + // first execution (normal) + var findStmt = coll.Find("pages >= :lower AND pages <= :upper").Bind("lower", 20).Bind("upper", 20); + var result = ExecuteFindStatement(findStmt).FetchAll(); + Assert.That(result, Has.One.Items); + Assert.That(result[0]["title"].ToString(), Is.EqualTo("Book 1")); + Assert.That(findStmt._isPrepared, Is.False); + + ValidatePreparedStatements(0, 0, null); + + // second execution adding limit (prepared statement) + result = ExecuteFindStatement(findStmt.Bind("lower", 0).Bind("upper", 100).Limit(1)).FetchAll(); + Assert.That(result, Has.One.Items); + Assert.That(result[0]["title"].ToString(), Is.EqualTo($"Book 1")); + Assert.That(findStmt._isPrepared); + + ValidatePreparedStatements(1, 1, + $"SELECT doc FROM `{schemaName}`.`{_collectionName}` WHERE ((JSON_EXTRACT(doc,'$.pages') >= ?) AND (JSON_EXTRACT(doc,'$.pages') <= ?)) LIMIT ?, ?"); + + // new execution using a different limit and offset (prepared statement) + result = ExecuteFindStatement(findStmt.Bind("lower", 0).Bind("upper", 100).Limit(2).Offset(1)).FetchAll(); + Assert.That(result.Count, Is.EqualTo(2)); + Assert.That(result[0]["title"].ToString(), Is.EqualTo($"Book 2")); + Assert.That(result[1]["title"].ToString(), Is.EqualTo($"Book 3")); + Assert.That(findStmt._isPrepared || !findStmt.Session.SupportsPreparedStatements); + + ValidatePreparedStatements(1, 2, + $"SELECT doc FROM `{schemaName}`.`{_collectionName}` WHERE ((JSON_EXTRACT(doc,'$.pages') >= ?) AND (JSON_EXTRACT(doc,'$.pages') <= ?)) LIMIT ?, ?"); + + // execution without limit and offset but persisting previous values (prepared statement) + result = ExecuteFindStatement(findStmt.Bind("lower", 0).Bind("upper", 100)).FetchAll(); + Assert.That(result.Count, Is.EqualTo(2)); + Assert.That(findStmt._isPrepared); + + ValidatePreparedStatements(1, 3, + $"SELECT doc FROM `{schemaName}`.`{_collectionName}` WHERE ((JSON_EXTRACT(doc,'$.pages') >= ?) AND (JSON_EXTRACT(doc,'$.pages') <= ?)) LIMIT ?, ?"); + } + + #region WL14389 + + [Test, Description("Validate prepared statements for connection pooling")] + public void ConnectionPoolingTest() + { + string connectionID1 = null; + Session session1, session2 = null; + Client client1 = null; + using (client1 = MySQLX.GetClient(ConnectionStringUri, new { pooling = new { maxSize = 1, queueTimeout = 2000 } })) + { + session1 = client1.GetSession(); + session1.DropSchema(schemaName); + session1.CreateSchema(schemaName); + InitCollection(); + var s = session1.GetSchema(schemaName); + var col = GetCollection(); + + var res0 = session1.SQL("SELECT CONNECTION_ID()").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + connectionID1 = row[0].ToString(); + Assert.That(connectionID1, Is.Not.Empty); + } + var findStmt = col.Find("_id = :id and pages = :pages").Bind("id", 1).Bind("pages", 20); + var doc = ExecuteFindStatement(findStmt); + Assert.That(doc.FetchAll()[0]["title"].ToString(), Is.EqualTo("Book 1")); + ValidatePreparedStatements(0, 0, null); + for (int i = 1; i < _docs.Length; i++) + { + doc = ExecuteFindStatement(findStmt.Bind("id", i).Bind("pages", i * 10 + 10).Limit(1)); + Assert.That(doc.FetchAll()[0]["title"].ToString(), Is.EqualTo($"Book {i}")); + } + ValidatePreparedStatements(1, 3, + $"SELECT doc FROM `{schemaName}`.`{_collectionName}` WHERE ((JSON_UNQUOTE(JSON_EXTRACT(doc,'$._id')) = ?) AND (JSON_EXTRACT(doc,'$.pages') = ?)) LIMIT ?, ?"); + session1.Close(); + + session2 = client1.GetSession(); + res0 = session2.SQL("SELECT CONNECTION_ID()").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + connectionID1 = row[0].ToString(); + Assert.That(connectionID1, Is.Not.Empty); + } + s = session2.GetSchema(schemaName); + col = s.GetCollection(_collectionName); + findStmt = col.Find("_id = :id and pages = :pages").Bind("id", 1).Bind("pages", 20); + doc = ExecuteFindStatement(findStmt); + Assert.That(doc.FetchAll()[0]["title"].ToString(), Is.EqualTo("Book 1")); + ValidatePreparedStatements(0, 0, null, connectionID1); + for (int i = 1; i < _docs.Length; i++) + { + doc = ExecuteFindStatement(findStmt.Bind("id", i).Bind("pages", i * 10 + 10).Limit(1)); + Assert.That(doc.FetchAll()[0]["title"].ToString(), Is.EqualTo($"Book {i}")); + } + ValidatePreparedStatements(1, 3, + $"SELECT doc FROM `{schemaName}`.`{_collectionName}` WHERE ((JSON_UNQUOTE(JSON_EXTRACT(doc,'$._id')) = ?) AND (JSON_EXTRACT(doc,'$.pages') = ?)) LIMIT ?, ?"); + session2.Close(); + Assert.Throws(() => doc = ExecuteFindStatement(findStmt)); + session2 = client1.GetSession(); + res0 = session2.SQL("SELECT CONNECTION_ID()").Execute(); + if (res0.HasData) + { + var row = res0.FetchOne(); + connectionID1 = row[0].ToString(); + Assert.That(connectionID1, Is.Not.Empty); + } + s = session2.GetSchema(schemaName); + col = s.GetCollection(_collectionName); + findStmt = col.Find("_id = :id and pages = :pages").Bind("id", 1).Bind("pages", 20); + doc = ExecuteFindStatement(findStmt); + Assert.That(doc.FetchAll()[0]["title"].ToString(), Is.EqualTo("Book 1")); + ValidatePreparedStatements(0, 0, null, connectionID1); + for (int i = 1; i < _docs.Length; i++) + { + doc = ExecuteFindStatement(findStmt.Bind("id", i).Bind("pages", i * 10 + 10).Limit(1)); + Assert.That(doc.FetchAll()[0]["title"].ToString(), Is.EqualTo($"Book {i}")); + } + ValidatePreparedStatements(1, 3, + $"SELECT doc FROM `{schemaName}`.`{_collectionName}` WHERE ((JSON_UNQUOTE(JSON_EXTRACT(doc,'$._id')) = ?) AND (JSON_EXTRACT(doc,'$.pages') = ?)) LIMIT ?, ?"); + session2.Close(); + Assert.Throws(() => doc = ExecuteFindStatement(findStmt)); + } + } + + [Test, Description("Deallocate PreparedStatments When Closing Session Load-100 times")] + public void DeallocatePreparedStatmentsWhenClosingSessionLoad() + { + Assume.That(Platform.IsWindows(), "Check for Linux OS"); + + InitCollection(); + string threadId; + for (int k = 0; k < 100; k++) + { + using (Session mySession = MySQLX.GetSession(ConnectionString)) + { + mySession.SetCurrentSchema(schemaName); + threadId = mySession.SQL("SELECT THREAD_ID FROM performance_schema.threads " + + "WHERE PROCESSLIST_ID=CONNECTION_ID()").Execute().FetchOne()[0].ToString(); + Collection coll = mySession.GetSchema(schemaName).GetCollection(_collectionName); + var findStmt = coll.Find("_id = :id and pages = :pages").Bind("id", 1).Bind("pages", 20); + var doc = ExecuteFindStatement(findStmt); + Assert.That(doc.FetchAll()[0]["title"].ToString(), Is.EqualTo("Book 1")); + ValidatePreparedStatements(0, 0, null, threadId); + + for (int i = 1; i <= _docs.Length; i++) + { + doc = ExecuteFindStatement(findStmt.Bind("id", i).Bind("pages", i * 10 + 10).Limit(1)); + Assert.That(doc.FetchAll()[0]["title"].ToString(), Is.EqualTo($"Book {i}")); + } + ValidatePreparedStatements(1, 4, + $"SELECT doc FROM `{schemaName}`.`{_collectionName}` WHERE ((JSON_UNQUOTE(JSON_EXTRACT(doc,'$._id')) = ?) AND (JSON_EXTRACT(doc,'$.pages') = ?)) LIMIT ?, ?", threadId); + } + ValidatePreparedStatements(0, 0, null, threadId); + } + } + + [Test, Description("Deallocate PreparedStatments When Closing Session Parallel")] + public void DeallocatePreparedStatmentsWhenClosingSessionParallel() + { + InitCollection(); + string threadId1, threadId2; + + Session mySession1 = MySQLX.GetSession(ConnectionString); + Session mySession2 = MySQLX.GetSession(ConnectionString); + mySession1.SetCurrentSchema(schemaName); + mySession2.SetCurrentSchema(schemaName); + threadId1 = mySession1.SQL("SELECT THREAD_ID FROM performance_schema.threads " + + "WHERE PROCESSLIST_ID=CONNECTION_ID()").Execute().FetchOne()[0].ToString(); + threadId2 = mySession2.SQL("SELECT THREAD_ID FROM performance_schema.threads " + + "WHERE PROCESSLIST_ID=CONNECTION_ID()").Execute().FetchOne()[0].ToString(); + Collection coll1 = mySession1.GetSchema(schemaName).GetCollection(_collectionName); + Collection coll2 = mySession2.GetSchema(schemaName).GetCollection(_collectionName); + var findStmt1 = coll1.Find("_id = :id and pages = :pages").Bind("id", 1).Bind("pages", 20); + var findStmt2 = coll2.Find("_id = :id and pages = :pages").Bind("id", 1).Bind("pages", 20); + var doc1 = ExecuteFindStatement(findStmt1); + Assert.That(doc1.FetchAll()[0]["title"].ToString(), Is.EqualTo("Book 1")); + ValidatePreparedStatements(0, 0, null, threadId1); + + var doc2 = ExecuteFindStatement(findStmt2); + Assert.That(doc2.FetchAll()[0]["title"].ToString(), Is.EqualTo("Book 1")); + ValidatePreparedStatements(0, 0, null, threadId2); + + for (int i = 1; i <= _docs.Length; i++) + { + doc1 = ExecuteFindStatement(findStmt1.Bind("id", i).Bind("pages", i * 10 + 10).Limit(1)); + Assert.That(doc1.FetchAll()[0]["title"].ToString(), Is.EqualTo($"Book {i}")); + } + + for (int i = 1; i <= _docs.Length; i++) + { + doc2 = ExecuteFindStatement(findStmt2.Bind("id", i).Bind("pages", i * 10 + 10).Limit(1)); + Assert.That(doc2.FetchAll()[0]["title"].ToString(), Is.EqualTo($"Book {i}")); + } + + ValidatePreparedStatements(1, 4, + $"SELECT doc FROM `{schemaName}`.`{_collectionName}` WHERE ((JSON_UNQUOTE(JSON_EXTRACT(doc,'$._id')) = ?) AND (JSON_EXTRACT(doc,'$.pages') = ?)) LIMIT ?, ?", threadId1); + ValidatePreparedStatements(1, 4, + $"SELECT doc FROM `{schemaName}`.`{_collectionName}` WHERE ((JSON_UNQUOTE(JSON_EXTRACT(doc,'$._id')) = ?) AND (JSON_EXTRACT(doc,'$.pages') = ?)) LIMIT ?, ?", threadId2); + + mySession1.Close(); + mySession2.Close(); + ValidatePreparedStatements(0, 0, null, threadId1); + ValidatePreparedStatements(0, 0, null, threadId2); + } + + [Test, Description("Max PreparedStatment Count set to one")] + public void MaxPreparedStmtCountAsOne() + { + Collection coll = CreateCollection("testGlobal"); + Result r = ExecuteAddStatement(coll.Add(_docs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4)); + + try + { + ((Session)coll.Session).SQL("SET GLOBAL max_prepared_stmt_count=1").Execute(); + var findStmt = coll.Find("_id = :id and pages = :pages").Bind("id", 1).Bind("pages", 20); + var doc = ExecuteFindStatement(findStmt); + Assert.That(doc.FetchAll()[0]["title"].ToString(), Is.EqualTo("Book 1")); + + ValidatePreparedStatements(0, 0, null); + + for (int i = 1; i <= _docs.Length; i++) + { + doc = ExecuteFindStatement(findStmt.Bind("id", i).Bind("pages", i * 10 + 10).Limit(1)); + Assert.That(doc.FetchAll()[0]["title"].ToString(), Is.EqualTo($"Book {i}")); + } + ValidatePreparedStatements(1, 4, + $"SELECT doc FROM `{schemaName}`.`testGlobal` WHERE ((JSON_EXTRACT(doc,'$._id') = ?) AND (JSON_EXTRACT(doc,'$.pages') = ?)) LIMIT ?, ?"); + + findStmt = coll.Find("_id = :id and pages = :pages").Bind("id", 1).Bind("pages", 20); + ExecuteFindStatement(findStmt).FetchAll(); + ExecuteFindStatement(findStmt).FetchAll(); + ValidatePreparedStatements(0, 0, null); + } + finally + { + ((Session)coll.Session).SQL("SET GLOBAL max_prepared_stmt_count=16382").Execute(); + } + } + + [Test, Description("PS with Async")] + public void PSMultipleFindAsync() + { + var coll = CreateCollection("test"); + int docs = 100; + HashSet validator = new HashSet(); + var addStatement = coll.Add(new { id = 1, age = 1, _id = 1 }); + + for (int i = 2; i <= docs; i++) + { + addStatement.Add(new + { + id = i, + age = i, + _id = i + }); + } + var result = ExecuteAddStatement(addStatement); + + List tasksList = new List(); + var findStmt = coll.Find("age = 1"); + tasksList.Add(findStmt.ExecuteAsync().ContinueWith((findResult) => + { + Assert.That(findResult.Result.FetchAll()[0]["age"], Is.EqualTo(1)); + })); + tasksList.Add(findStmt.ExecuteAsync().ContinueWith((findResult) => + { + Assert.That(findResult.Result.FetchAll()[0]["age"], Is.EqualTo(1)); + })); + Assert.That(Task.WaitAll(tasksList.ToArray(), TimeSpan.FromMinutes(2)), Is.EqualTo(true), "WaitAll timeout"); + ValidatePreparedStatements(1, 1, $"SELECT doc FROM `test`.`test` WHERE (JSON_EXTRACT(doc,'$.age') = 1)"); + + } + + /// + /// Bug 29304767 + /// + [Test, Description("BIND WITH FIND/REMOVE DOESN'T WORK WHEN STRING IS PASSED-WL#12174")] + public void FindRemoveWithString() + { + InitCollection(); + Collection coll = GetCollection(); + Assert.That(coll.Count(), Is.EqualTo(4)); + var findStmt = coll.Find("_id = :id and pages = :pages").Bind("id", "1").Bind("pages", 20); + var doc = ExecuteFindStatement(findStmt); + findStmt = coll.Find("_id = :id and pages = :pages").Bind("id", "2").Bind("pages", 30); + doc = ExecuteFindStatement(findStmt); + var remStatement = coll.Remove("$._id == :id").Sort().Limit(2); + for (int i = 1; i < 4; i++) + { + var r1 = remStatement.Bind("id", i.ToString()).Execute(); + } + findStmt = coll.Find("_id = :id").Bind("id", "4"); + var docCount = ExecuteFindStatement(findStmt).FetchAll(); + Assert.That(docCount.Count, Is.EqualTo(1), "There should be a record"); + Assert.That(docCount[0]["title"].ToString(), Is.EqualTo("Book 4")); + findStmt = coll.Find("_id = :id").Bind("id", "1"); + docCount = ExecuteFindStatement(findStmt).FetchAll(); + Assert.That(docCount.Count, Is.EqualTo(0), "There should not be any records"); + } + + /// + /// Bug 29311658 + /// + [Test, Description("STATEMENT WITH OFFSET FAILS WHEN EXECUTED FOR THE SECOND TIME-WL#12174")] + public void StatementWithOffset() + { + + var coll = CreateCollection("test"); + ExecuteSQLStatement(session.SQL("SET sql_mode='';")); + var docs1 = new[] + { + new { _id = 11, name = "jonh doe", age =38,profit = 100 }, + new { _id = 12, name = "milton green", age =45,profit = 200 }, + new { _id = 13, name = "larry smith", age =24,profit = 300}, + new { _id = 14, name = "mary weinstein", age= 24 ,profit = 100}, + new { _id = 15, name = "jerry pratt", age =45 ,profit = 400 }, + new { _id = 16, name = "hugh jackman", age =20,profit = 500}, + new { _id = 117, name = "elizabeth olsen",age = 31,profit = 300 }, + new { _id = 8, name = "tommy h", age =31,profit = 3000} + }; + var r = coll.Add(docs1).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo((ulong)8)); + var findStmt = coll.Find().Fields("_id as ID", "name as Name", + "age as Age", "profit as Profit").GroupBy("age"). + GroupBy("profit").Sort("profit ASC").Limit(3); + ExecuteFindStatement(findStmt).FetchAll(); + ValidatePreparedStatements(0, 0, null); + ExecuteFindStatement(findStmt).FetchAll(); + ExecuteFindStatement(findStmt).FetchAll(); + ValidatePreparedStatements(1, 2, "SELECT JSON_OBJECT('ID', `_DERIVED_TABLE_`.`ID`,'Name', `_DERIVED_TABLE_`.`Name`,'Age', `_DERIVED_TABLE_`.`Age`," + + "'Profit', `_DERIVED_TABLE_`.`Profit`) AS doc FROM (SELECT JSON_EXTRACT(doc,'$._id') AS `ID`,JSON_EXTRACT(doc,'$.name') " + + "AS `Name`,JSON_EXTRACT(doc,'$.age') AS `Age`,JSON_EXTRACT(doc,'$.profit') AS `Profit` FROM `test`.`Books` GROUP BY `profit` " + + "ORDER BY JSON_EXTRACT(doc,'$.profit') LIMIT ?, ?) AS `_DERIVED_TABLE_`"); + + findStmt = coll.Find().Fields("_id as ID", "name as Name", + "age as Age", "profit as Profit").GroupBy("age"). + GroupBy("profit").Sort("profit ASC").Offset(0); + ExecuteFindStatement(findStmt).FetchAll(); + ValidatePreparedStatements(0, 0, null); + ExecuteFindStatement(findStmt).FetchAll(); + ExecuteFindStatement(findStmt).FetchAll(); + ValidatePreparedStatements(1, 2, "SELECT JSON_OBJECT('ID', `_DERIVED_TABLE_`.`ID`,'Name', `_DERIVED_TABLE_`.`Name`,'Age', `_DERIVED_TABLE_`.`Age`," + + "'Profit', `_DERIVED_TABLE_`.`Profit`) AS doc FROM (SELECT JSON_EXTRACT(doc,'$._id') AS `ID`,JSON_EXTRACT(doc,'$.name') " + + "AS `Name`,JSON_EXTRACT(doc,'$.age') AS `Age`,JSON_EXTRACT(doc,'$.profit') AS `Profit` FROM `test`.`Books` GROUP BY `profit` " + + "ORDER BY JSON_EXTRACT(doc,'$.profit')) AS `_DERIVED_TABLE_`"); + + + findStmt = coll.Find().Fields("_id as ID", "name as Name", + "age as Age", "profit as Profit").GroupBy("age"). + GroupBy("profit").Sort("profit ASC").Limit(3).Offset(2); + ExecuteFindStatement(findStmt).FetchAll(); + ValidatePreparedStatements(0, 0, null); + + ExecuteFindStatement(findStmt).FetchAll(); + ExecuteFindStatement(findStmt.Offset(0)).FetchAll(); + ValidatePreparedStatements(1, 2, "SELECT JSON_OBJECT('ID', `_DERIVED_TABLE_`.`ID`,'Name', `_DERIVED_TABLE_`.`Name`,'Age', " + + "`_DERIVED_TABLE_`.`Age`,'Profit', `_DERIVED_TABLE_`.`Profit`) AS doc FROM (SELECT JSON_EXTRACT(doc,'$._id') AS `ID`," + + "JSON_EXTRACT(doc,'$.name') AS `Name`,JSON_EXTRACT(doc,'$.age') " + + "AS `Age`,JSON_EXTRACT(doc,'$.profit') AS `Profit` FROM `test`.`Books` GROUP BY `profit` ORDER BY JSON_EXTRACT(doc,'$.profit') LIMIT ?, ?) AS `_DERIVED_TABLE_`"); + + ExecuteSQLStatement(session.SQL("set sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';")); + + } + + /// + /// Bug 29249857 + /// + [Test, Description("SESSION.SQL STATEMENT EXECUTION FAILS WHEN EXECUTED FOR SECOND TIME WITH BIND-WL#12174")] + public void SessionSqlStatementFail() + { + InitTable(); + var sqlStmt = session.SQL(@"INSERT INTO test.BookTable VALUES(8, 'name 8', 40)"); + for (int i = 0; i < 100; i++) + { + sqlStmt.Execute(); + } + ValidatePreparedStatements(0, 0, null); + ExecuteSQL("DROP TABLE if EXISTS test.BookTable"); + InitTable(); + sqlStmt = session.SQL(@"INSERT INTO test.BookTable VALUES(8, 'name 8', 40)"); + sqlStmt.Execute(); + sqlStmt.Execute(); + ExecuteSQL("DROP TABLE if EXISTS test.test1"); + ExecuteSQL("CREATE TABLE test.test1(id INT, letter varchar(1))"); + var statment = session.SQL("INSERT INTO test.test1 VALUES(1, ?), (2, 'B');").Bind(1); + statment.Execute(); + sqlStmt.Execute(); + ValidatePreparedStatements(0, 0, null); + } + + /// + /// Bug 29347028 + /// + [Test, Description("DELETE WHERE THROWS PARSE EXCEPTION WITH IN OPERATOR FOR ARRAY")] + public void DeleteParseException() + { + Assume.That(session.Version.isAtLeast(8, 0, 16), "This test is for MySql 8.0.16 or higher"); + var tableName = "newtable"; + Session session1 = null; + Client client1 = null; + using (client1 = MySQLX.GetClient(ConnectionStringUri, new { pooling = new { maxSize = 1, queueTimeout = 2000 } })) + { + session1 = client1.GetSession(); + session1.DropSchema(schemaName); + session1.CreateSchema(schemaName); + var s = session1.GetSchema(schemaName); + + session1.SQL($"create table `{schemaName}`.`{tableName}`(id JSON, n JSON, a JSON, info JSON)").Execute(); + Table tabNew = s.GetTable(tableName); + tabNew.Insert(). + Values("{\"_id\":101}", "{\"name\":\"joy\"}", "{\"age\":21}", "{\"additionalinfo\":{\"company\":\"xyz\",\"vehicle\":\"bike\",\"hobbies\":\"reading\"}}"). + Values("{\"_id\":102}", "{\"name\":\"happy\"}", "{\"age\":24}", "{\"additionalinfo\":{\"company\":\"abc\",\"vehicle\":\"car\",\"hobbies\":[\"playing\",\"painting\",\"boxing\"]}}"). + Execute(); + + var tDelete = tabNew.Delete().Where("[\"playing\", \"painting\",\"boxing\"] IN info->$.additionalinfo.hobbies"); + tDelete.Execute(); + + tableName = "newtable1"; + session1.SQL($"create table `{schemaName}`.`{tableName}`(c1 varchar(256), c2 JSON)").Execute(); + tabNew = s.GetTable(tableName); + tabNew.Insert("c1", "c2").Values("12345", "{ \"name\": \"abc\", \"age\": 1 , \"misc\": 1.2}").Execute(); + tabNew.Insert("c1", "c2").Values("123456", "{ \"name\": \"abc\", \"age\": 2 , \"misc\": 1.3}").Execute(); + tabNew.Insert("c1", "c2").Values("1234567", "{ \"name\": \"abc\", \"age\": 3 , \"misc\": 1.4}").Execute(); + + tDelete = tabNew.Delete().Where(":C2 in c2->$.name and :C1 = c1"); + tDelete.Bind("C1", "123456"); + tDelete.Bind("C2", "abc"); + tDelete.Execute(); + session1.Close(); + } + + } + + /// + /// Bug 29346856 + /// + [Test, Description("SECOND FIND/SELECT FAILS WITH IN OPERATOR-WL#12174-TS1")] + public void SecondFindFails() + { + var collectionName = "newcollection"; + var t1 = "{\"_id\": \"1001\", \"ARR\":[1,2,3], \"ARR1\":[\"name1\",\"name2\", \"name3\"]}"; + var t2 = "{\"_id\": \"1002\", \"ARR\":[1,1,2], \"ARR1\":[\"name1\",\"name2\", \"name3\"]}"; + var t3 = "{\"_id\": \"1003\", \"ARR\":[1,4,5], \"ARR1\":[\"name1\",\"name2\", \"name3\"]}"; + var testCollection = CreateCollection(collectionName); + testCollection.Add(t1).Execute(); + testCollection.Add(t2).Execute(); + testCollection.Add(t3).Execute(); + var findStatement = testCollection.Find("(1+2) in (1, 2, 3)"); + findStatement.Execute().FetchAll(); + findStatement.Execute().FetchAll(); + + var table1 = testSchema.GetCollectionAsTable(collectionName); + var selectStatement = table1.Select().Where("(1+2) in (1, 2, 3)"); + selectStatement.Execute().FetchAll(); + selectStatement.Execute().FetchAll(); + } + + #endregion + + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/Properties/AssemblyInfo.cs b/MySQL.Data/tests/MySqlX.Data.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..20a236993 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,55 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework; +using System.Reflection; +using 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. +[assembly: AssemblyTitle("MySqlX.Data.Tests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("MySQL Connector/NET")] +[assembly: AssemblyCopyright("Copyright © 2016, 2025, Oracle and/or its affiliates.")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("2f36ea96-5616-4b9e-9e53-eb380b8c4292")] +[assembly: NonParallelizable] + +#if !DEBUG +[assembly: AssemblyKeyName("ConnectorNet")] +#endif diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/Properties/CreateUsers.sql b/MySQL.Data/tests/MySqlX.Data.Tests/Properties/CreateUsers.sql new file mode 100644 index 000000000..8c0ea0906 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/Properties/CreateUsers.sql @@ -0,0 +1,12 @@ +DROP USER IF EXISTS 'test'; +DROP USER IF EXISTS 'testNoPass'; +DROP USER IF EXISTS 'testSha2'; +DROP USER IF EXISTS 'testAnyhost'; +CREATE USER 'test'@'%' identified by 'test'; +GRANT ALL PRIVILEGES ON *.* TO 'test'@'%'; +CREATE USER 'testNoPass'@'%'; +CREATE USER 'testSha2'@'%' identified with caching_sha2_password by 'mysql'; +GRANT ALL PRIVILEGES ON *.* TO 'testSha2'@'%'; +CREATE USER 'testAnyhost'@'%' identified by 'test'; +GRANT ALL PRIVILEGES ON *.* TO 'testAnyhost'@'%'; +FLUSH PRIVILEGES; \ No newline at end of file diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/ColumnMetadataTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/ColumnMetadataTests.cs new file mode 100644 index 000000000..aae0a3684 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/ColumnMetadataTests.cs @@ -0,0 +1,165 @@ +// Copyright © 2016, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySql.Data.MySqlClient.X.XDevAPI.Common; +using MySqlX.XDevAPI.Relational; +using NUnit.Framework; +using NUnit.Framework.Legacy; + +namespace MySqlX.Data.Tests.RelationalTests +{ + public class ColumnMetadataTests : BaseTest + { + [TearDown] + public void TearDown() => ExecuteSQL("DROP TABLE IF EXISTS test"); + [Test] + public void ColumnMetadata() + { + ExecuteSQL("CREATE TABLE test(b VARCHAR(255) COLLATE latin1_swedish_ci, c VARCHAR(20) CHARSET greek)"); + ExecuteSQL("INSERT INTO test VALUES('Bob', 'Δ')"); + + RowResult r = ExecuteSelectStatement(GetSession().GetSchema(schemaName).GetTable("test").Select("1 + 1 as a", "b", "c")); + var rows = r.FetchAll(); + Assert.That(r.Columns.Count, Is.EqualTo(3)); + Assert.That(r.Columns[0].DatabaseName, Is.EqualTo("def")); + Assert.That(r.Columns[0].SchemaName, Is.Null); + Assert.That(r.Columns[0].TableName, Is.Null); + Assert.That(r.Columns[0].TableLabel, Is.Null); + Assert.That(r.Columns[0].ColumnName, Is.Null); + Assert.That(r.Columns[0].ColumnLabel, Is.EqualTo("a")); + Assert.That(r.Columns[0].Type, Is.EqualTo(ColumnType.Tinyint)); + Assert.That(r.Columns[0].Length, Is.EqualTo(3u)); + Assert.That(r.Columns[0].FractionalDigits, Is.EqualTo(0u)); + Assert.That(r.Columns[0].IsNumberSigned); + Assert.That(r.Columns[0].CharacterSetName, Is.Null); + Assert.That(r.Columns[0].CollationName, Is.Null); + Assert.That(r.Columns[0].IsPadded, Is.False); + + Assert.That(r.Columns[1].SchemaName, Is.EqualTo(schemaName)); + Assert.That(r.Columns[1].TableName, Is.EqualTo("test")); + Assert.That(r.Columns[1].TableLabel, Is.EqualTo("test")); + Assert.That(r.Columns[1].ColumnName, Is.EqualTo("b")); + Assert.That(r.Columns[1].ColumnLabel, Is.EqualTo("b")); + Assert.That(r.Columns[1].Type, Is.EqualTo(ColumnType.String)); + Assert.That(r.Columns[1].Length, Is.EqualTo(255u)); + Assert.That(r.Columns[1].FractionalDigits, Is.EqualTo(0u)); + Assert.That(r.Columns[1].IsNumberSigned, Is.False); + Assert.That(r.Columns[1].CharacterSetName, Is.EqualTo("utf8mb4")); + Assert.That(r.Columns[1].CollationName, Is.EqualTo("utf8mb4_0900_ai_ci")); + Assert.That(r.Columns[1].IsPadded, Is.False); + + Assert.That(r.Columns[2].SchemaName, Is.EqualTo(schemaName)); + Assert.That(r.Columns[2].TableName, Is.EqualTo("test")); + Assert.That(r.Columns[2].TableLabel, Is.EqualTo("test")); + Assert.That(r.Columns[2].ColumnName, Is.EqualTo("c")); + Assert.That(r.Columns[2].ColumnLabel, Is.EqualTo("c")); + Assert.That(r.Columns[2].Type, Is.EqualTo(ColumnType.String)); + Assert.That(r.Columns[2].Length, Is.EqualTo(20u)); + Assert.That(r.Columns[2].FractionalDigits, Is.EqualTo(0u)); + Assert.That(r.Columns[2].IsNumberSigned, Is.False); + Assert.That(r.Columns[2].CharacterSetName, Is.EqualTo("utf8mb4")); + Assert.That(r.Columns[2].CollationName, Is.EqualTo("utf8mb4_0900_ai_ci")); + Assert.That(r.Columns[2].IsPadded, Is.False); + //Assert.AreEqual("Δ", rows[0][2]); + } + + [Test] + public void SchemaDefaultCharset() + { + ExecuteSQL("CREATE TABLE test(b VARCHAR(255))"); + ExecuteSQL("INSERT INTO test VALUES('CAR')"); + + var defaultValues = ExecuteSQLStatement(GetSession(true).SQL("SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME " + + $"FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '{schemaName}'; ")).FetchAll(); + + RowResult r = ExecuteSelectStatement(GetSession().GetSchema(schemaName).GetTable("test").Select("b")); + var rows = r.FetchAll(); + + Assert.That(r.Columns[0].SchemaName, Is.EqualTo(schemaName)); + Assert.That(r.Columns[0].TableName, Is.EqualTo("test")); + Assert.That(r.Columns[0].TableLabel, Is.EqualTo("test")); + Assert.That(r.Columns[0].ColumnName, Is.EqualTo("b")); + Assert.That(r.Columns[0].ColumnLabel, Is.EqualTo("b")); + Assert.That(r.Columns[0].Type, Is.EqualTo(ColumnType.String)); + Assert.That(r.Columns[0].FractionalDigits, Is.EqualTo(0u)); + Assert.That(r.Columns[0].IsNumberSigned, Is.EqualTo(false)); + Assert.That(r.Columns[0].CharacterSetName, Is.EqualTo(defaultValues[0][0])); + Assert.That(r.Columns[0].CollationName, Is.EqualTo(defaultValues[0][1])); + Assert.That(r.Columns[0].IsPadded, Is.EqualTo(false)); + Assert.That(rows[0][0], Is.EqualTo("CAR")); + + using (var connection = new MySqlConnection(ConnectionStringRoot)) + { + connection.Open(); + if (connection.driver.Version.isAtLeast(8, 0, 1)) + Assert.That(r.Columns[0].Length, Is.EqualTo(1020u)); + else + Assert.That(r.Columns[0].Length, Is.EqualTo(255u)); + } + } + + [Test] + public void ColumnNames() + { + ExecuteSQL("CREATE TABLE test(columnA VARCHAR(255), columnB INT, columnX BIT)"); + RowResult r = ExecuteSelectStatement(GetSession().GetSchema(schemaName).GetTable("test").Select()); + + Assert.That(r.ColumnCount, Is.EqualTo(3)); + Assert.That(r.ColumnCount, Is.EqualTo(r.Columns.Count)); + Assert.That(r.ColumnNames[0], Is.EqualTo("columnA")); + Assert.That(r.ColumnNames[1], Is.EqualTo("columnB")); + Assert.That(r.ColumnNames[2], Is.EqualTo("columnX")); + } + + [Test] + public void TableDefaultCharset() + { + ExecuteSQL("Drop Table if exists test"); + ExecuteSQL("CREATE TABLE test(b VARCHAR(255)) CHARSET greek"); + ExecuteSQL("INSERT INTO test VALUES('Δ')"); + + RowResult r = ExecuteSelectStatement(GetSession().GetSchema(schemaName).GetTable("test").Select("b")); + var rows = r.FetchAll(); + + Assert.That(r.Columns[0].SchemaName, Is.EqualTo(schemaName)); + Assert.That(r.Columns[0].TableName, Is.EqualTo("test")); + Assert.That(r.Columns[0].TableLabel, Is.EqualTo("test")); + Assert.That(r.Columns[0].ColumnName, Is.EqualTo("b")); + Assert.That(r.Columns[0].ColumnLabel, Is.EqualTo("b")); + Assert.That(r.Columns[0].Type, Is.EqualTo(ColumnType.String)); + Assert.That(r.Columns[0].Length, Is.EqualTo(255u)); + Assert.That(r.Columns[0].FractionalDigits, Is.EqualTo(0u)); + Assert.That(r.Columns[0].IsNumberSigned, Is.False); + Assert.That(r.Columns[0].CharacterSetName, Is.EqualTo("utf8mb4")); + Assert.That(r.Columns[0].CollationName, Is.EqualTo("utf8mb4_0900_ai_ci")); + Assert.That(r.Columns[0].IsPadded, Is.False); + Assert.That(rows[0][0], Is.EqualTo("Δ")); + } + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/DataTypeTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/DataTypeTests.cs new file mode 100644 index 000000000..b13a25a79 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/DataTypeTests.cs @@ -0,0 +1,313 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySql.Data.MySqlClient.X.XDevAPI.Common; +using MySqlX.XDevAPI.Relational; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; + +namespace MySqlX.Data.Tests.RelationalTests +{ + public class DataTypeTests : BaseTest + { + [TearDown] + public void TearDown() => ExecuteSQL("DROP TABLE IF EXISTS test"); + + [Test] + public void Float() + { + ExecuteSQL("CREATE TABLE test(rvalue FLOAT(14,8))"); + ExecuteSQL("INSERT INTO test VALUES(23.4), (14.8), (11.9)"); + + RowResult r = ExecuteSelectStatement(GetSession().GetSchema("test").GetTable("test").Select("rvalue")); + var rows = r.FetchAll(); + Assert.That(r.Columns, Has.One.Items); + Assert.That(r.Columns[0].ClrType, Is.EqualTo(typeof(float))); + Assert.That((int)r.Columns[0].Length, Is.EqualTo(14)); + Assert.That((int)r.Columns[0].FractionalDigits, Is.EqualTo(8)); + Assert.That(r.Columns[0].Type, Is.EqualTo(ColumnType.Float)); + Assert.That(rows.Count, Is.EqualTo(3)); + Assert.That((float)rows[0][0], Is.EqualTo(23.4f)); + Assert.That(rows[1][0], Is.EqualTo(14.8f)); + Assert.That(rows[2][0], Is.EqualTo(11.9f)); + } + + [Test] + public void Double() + { + ExecuteSQL("CREATE TABLE test(rvalue DOUBLE(12,4))"); + ExecuteSQL("INSERT INTO test VALUES(23.4), (14.8), (11.9)"); + + RowResult r = ExecuteSelectStatement(GetSession().GetSchema("test").GetTable("test").Select("rvalue")); + var rows = r.FetchAll(); + Assert.That(r.Columns, Has.One.Items); + Assert.That(r.Columns[0].ClrType, Is.EqualTo(typeof(double))); + Assert.That(r.Columns[0].Type, Is.EqualTo(ColumnType.Double)); + Assert.That((int)r.Columns[0].Length, Is.EqualTo(12)); + Assert.That((int)r.Columns[0].FractionalDigits, Is.EqualTo(4)); + Assert.That(rows.Count, Is.EqualTo(3)); + Assert.That(rows[0][0], Is.EqualTo(23.4)); + Assert.That(rows[1][0], Is.EqualTo(14.8)); + Assert.That(rows[2][0], Is.EqualTo(11.9)); + } + + [Test] + public void Set() + { + ExecuteSQL("CREATE TABLE test(rvalue SET('A','B','C','D'))"); + ExecuteSQL("INSERT INTO test VALUES('A'), ('B,A'), ('B')"); + + RowResult r = ExecuteSelectStatement(GetSession().GetSchema("test").GetTable("test").Select("rvalue")); + var rows = r.FetchAll(); + Assert.That(r.Columns, Has.One.Items); + Assert.That(r.Columns[0].ClrType, Is.EqualTo(typeof(string))); + Assert.That(r.Columns[0].Type, Is.EqualTo(ColumnType.Set)); + Assert.That(rows.Count, Is.EqualTo(3)); + Assert.That(rows[0][0], Is.EqualTo("A")); + Assert.That(rows[1][0], Is.EqualTo("A,B")); + Assert.That(rows[2][0], Is.EqualTo("B")); + } + + [Test] + public void Enum() + { + ExecuteSQL("CREATE TABLE test(rvalue Enum('Alpha','Beta','C','D'))"); + ExecuteSQL("INSERT INTO test VALUES('Alpha'), ('Beta'), ('C')"); + + RowResult r = ExecuteSelectStatement(GetSession().GetSchema("test").GetTable("test").Select("rvalue")); + var rows = r.FetchAll(); + Assert.That(r.Columns, Has.One.Items); + Assert.That(r.Columns[0].ClrType, Is.EqualTo(typeof(string))); + Assert.That(r.Columns[0].Type, Is.EqualTo(ColumnType.Enum)); + Assert.That(rows.Count, Is.EqualTo(3)); + Assert.That(rows[0][0], Is.EqualTo("Alpha")); + Assert.That(rows[1][0], Is.EqualTo("Beta")); + Assert.That(rows[2][0], Is.EqualTo("C")); + } + + [Test] + public void SignedIntegers() + { + ExecuteSQL("CREATE TABLE test(tinyCol TINYINT, smallCol SMALLINT, mediumCol MEDIUMINT, intCol INT, bigCol BIGINT)"); + ExecuteSQL("INSERT INTO test VALUES(127, 32767, 8388607, 2147483647, 9223372036854775807)"); + ExecuteSQL("INSERT INTO test VALUES(-128, -32768, -8388608, -2147483648, -9223372036854775808)"); + + RowResult r = ExecuteSelectStatement(GetSession().GetSchema("test").GetTable("test").Select()); + var rows = r.FetchAll(); + Assert.That(r.Columns.Count, Is.EqualTo(5)); + Assert.That(r.Columns[0].ClrType, Is.EqualTo(typeof(sbyte))); + Assert.That(r.Columns[0].Type, Is.EqualTo(ColumnType.Tinyint)); + Assert.That(rows[0][0], Is.EqualTo((sbyte)127)); + Assert.That(rows[1][0], Is.EqualTo((sbyte)-128)); + Assert.That(r.Columns[1].ClrType, Is.EqualTo(typeof(Int16))); + Assert.That(r.Columns[1].Type, Is.EqualTo(ColumnType.Smallint)); + Assert.That(rows[0][1], Is.EqualTo((short)32767)); + Assert.That(rows[1][1], Is.EqualTo((short)-32768)); + Assert.That(r.Columns[2].ClrType, Is.EqualTo(typeof(Int32))); + Assert.That(r.Columns[2].Type, Is.EqualTo(ColumnType.Mediumint)); + Assert.That(rows[0][2], Is.EqualTo(8388607)); + Assert.That(rows[1][2], Is.EqualTo(-8388608)); + Assert.That(r.Columns[3].ClrType, Is.EqualTo(typeof(Int32))); + Assert.That(r.Columns[3].Type, Is.EqualTo(ColumnType.Int)); + Assert.That(rows[0][3], Is.EqualTo(2147483647)); + Assert.That(rows[1][3], Is.EqualTo(-2147483648)); + Assert.That(r.Columns[4].ClrType, Is.EqualTo(typeof(Int64))); + Assert.That(r.Columns[4].Type, Is.EqualTo(ColumnType.Bigint)); + Assert.That(rows[0][4], Is.EqualTo((long)9223372036854775807)); + Assert.That(rows[1][4], Is.EqualTo((long)-9223372036854775808)); + } + + [Test] + public void UnsignedIntegers() + { + ExecuteSQL("CREATE TABLE test(tinyCol TINYINT UNSIGNED, smallCol SMALLINT UNSIGNED, mediumCol MEDIUMINT UNSIGNED, intCol INT UNSIGNED, bigCol BIGINT UNSIGNED)"); + ExecuteSQL("INSERT INTO test VALUES(255, 65535, 16777215, 4294967295, 18446744073709551615)"); + + RowResult r = ExecuteSelectStatement(GetSession().GetSchema("test").GetTable("test").Select()); + var rows = r.FetchAll(); + Assert.That(r.Columns.Count, Is.EqualTo(5)); + Assert.That(r.Columns[0].ClrType, Is.EqualTo(typeof(byte))); + Assert.That(r.Columns[0].Type, Is.EqualTo(ColumnType.Tinyint)); + Assert.That(rows[0][0], Is.EqualTo((byte)255)); + Assert.That(r.Columns[1].ClrType, Is.EqualTo(typeof(UInt16))); + Assert.That(r.Columns[1].Type, Is.EqualTo(ColumnType.Smallint)); + Assert.That(rows[0][1], Is.EqualTo((ushort)65535)); + Assert.That(r.Columns[2].ClrType, Is.EqualTo(typeof(UInt32))); + Assert.That(r.Columns[2].Type, Is.EqualTo(ColumnType.Mediumint)); + Assert.That(rows[0][2], Is.EqualTo((uint)16777215)); + Assert.That(r.Columns[3].ClrType, Is.EqualTo(typeof(UInt32))); + Assert.That(r.Columns[3].Type, Is.EqualTo(ColumnType.Int)); + Assert.That(rows[0][3], Is.EqualTo((uint)4294967295)); + Assert.That(r.Columns[4].ClrType, Is.EqualTo(typeof(UInt64))); + Assert.That(r.Columns[4].Type, Is.EqualTo(ColumnType.Bigint)); + Assert.That(rows[0][4], Is.EqualTo((ulong)18446744073709551615)); + } + + [Test] + public void Bit() + { + ExecuteSQL("CREATE TABLE test(bitCol BIT(8))"); + ExecuteSQL("INSERT INTO test VALUES(b'1111111')"); + + RowResult r = ExecuteSelectStatement(GetSession().GetSchema("test").GetTable("test").Select()); + var rows = r.FetchAll(); + Assert.That(r.Columns, Has.One.Items); + Assert.That(r.Columns[0].ClrType, Is.EqualTo(typeof(UInt64))); + Assert.That(r.Columns[0].Type, Is.EqualTo(ColumnType.Bit)); + Assert.That(rows[0][0], Is.EqualTo((ulong)127)); + } + + [Test] + public void Decimal() + { + ExecuteSQL("CREATE TABLE test(decCol1 DECIMAL(20,9))"); + ExecuteSQL("INSERT INTO test VALUES(-1.23), (-12.345), (5), (43)"); + ExecuteSQL("INSERT INTO test VALUES(14523.2887238), (-8947.8923784)"); + + RowResult r = ExecuteSelectStatement(GetSession().GetSchema("test").GetTable("test").Select()); + var rows = r.FetchAll(); + Assert.That(r.Columns, Has.One.Items); + Assert.That(r.Columns[0].ClrType, Is.EqualTo(typeof(decimal))); + Assert.That(r.Columns[0].Type, Is.EqualTo(ColumnType.Decimal)); + Assert.That(rows[0][0], Is.EqualTo(-1.23m)); + Assert.That(rows[1][0], Is.EqualTo(-12.345m)); + Assert.That(rows[2][0], Is.EqualTo(5m)); + Assert.That(rows[3][0], Is.EqualTo(43m)); + Assert.That(rows[4][0], Is.EqualTo(14523.2887238m)); + Assert.That(rows[5][0], Is.EqualTo(-8947.8923784m)); + } + + [Test] + public void Json() + { + ExecuteSQL("CREATE TABLE test(jdoc JSON)"); + ExecuteSQL("INSERT INTO test VALUES('{ \"id\": 1, \"name\": \"John\" }')"); + ExecuteSQL("INSERT INTO test VALUES('[ \"a\", 1, \"b\", 2 ]')"); + + RowResult r = ExecuteSelectStatement(GetSession().GetSchema("test").GetTable("test").Select()); + var rows = r.FetchAll(); + Assert.That(r.Columns, Has.One.Items); + Assert.That(r.Columns[0].ClrType, Is.EqualTo(typeof(string))); + Assert.That(r.Columns[0].Type, Is.EqualTo(ColumnType.Json)); + Assert.That(rows[0][0], Is.EqualTo("{\"id\": 1, \"name\": \"John\"}")); + Assert.That(rows[1][0], Is.EqualTo("[\"a\", 1, \"b\", 2]")); + } + + [Test] + public void Strings() + { + ExecuteSQL("CREATE TABLE test(name VARCHAR(255) COLLATE cp932_japanese_ci)"); + ExecuteSQL("INSERT INTO test VALUES('表')"); + + RowResult r = ExecuteSelectStatement(GetSession().GetSchema("test").GetTable("test").Select()); + var rows = r.FetchAll(); + Assert.That(r.Columns, Has.One.Items); + Assert.That(r.Columns[0].ClrType, Is.EqualTo(typeof(string))); + Assert.That(r.Columns[0].Type, Is.EqualTo(ColumnType.String)); + Assert.That(rows[0][0], Is.EqualTo("表")); + } + + [Test] + [Ignore("Fix for 8.0.13")] + public void UnsingedZeroFill() + { + ExecuteSQL("CREATE TABLE test(id INT ZEROFILL)"); + ExecuteSQL("INSERT INTO test VALUES(100)"); + + RowResult r = ExecuteSelectStatement(GetSession().GetSchema("test").GetTable("test").Select()); + var rows = r.FetchAll(); + Assert.That(r.Columns, Has.One.Items); + Assert.That(r.Columns[0].ClrType, Is.EqualTo(typeof(UInt32))); + Assert.That(r.Columns[0].Type, Is.EqualTo(ColumnType.Int)); + Assert.That(r.Columns[0].IsNumberSigned, Is.False); + Assert.That(r.Columns[0].IsPadded); + Assert.That(rows[0][0].ToString(), Is.EqualTo("0000000100")); + } + + [Test] + public void Bytes() + { + ExecuteSQL("CREATE TABLE test(name VARCHAR(255) BINARY)"); + ExecuteSQL("INSERT INTO test VALUES('John')"); + + RowResult r = ExecuteSelectStatement(GetSession().GetSchema("test").GetTable("test").Select()); + var rows = r.FetchAll(); + Assert.That(r.Columns, Has.One.Items); + Assert.That(r.Columns[0].ClrType, Is.EqualTo(typeof(string))); + Assert.That(r.Columns[0].Type, Is.EqualTo(ColumnType.String)); + Assert.That(rows[0][0], Is.EqualTo("John")); + } + + [Test] + public void BytesUsingCollation() + { + ExecuteSQL("CREATE TABLE test(name VARCHAR(255) COLLATE utf8_bin)"); + ExecuteSQL("INSERT INTO test VALUES('Mark')"); + + RowResult r = ExecuteSelectStatement(GetSession().GetSchema("test").GetTable("test").Select()); + var rows = r.FetchAll(); + Assert.That(r.Columns, Has.One.Items); + Assert.That(r.Columns[0].ClrType, Is.EqualTo(typeof(string))); + Assert.That(r.Columns[0].Type, Is.EqualTo(ColumnType.String)); + Assert.That(rows[0][0], Is.EqualTo("Mark")); + } + + [Test] + public void Geometry() + { + ExecuteSQL("CREATE TABLE test(line GEOMETRY)"); + ExecuteSQL("INSERT INTO test VALUES(ST_GeomFromText('LINESTRING(0 0, 10 10, 20 25, 50 60)'))"); + + RowResult r = ExecuteSelectStatement(GetSession().GetSchema("test").GetTable("test").Select()); + var rows = r.FetchAll(); + Assert.That(r.Columns, Has.One.Items); + Assert.That(r.Columns[0].ClrType, Is.EqualTo(typeof(byte[]))); + Assert.That(r.Columns[0].Type, Is.EqualTo(ColumnType.Geometry)); + Assert.That(BitConverter.ToString((byte[])rows[0][0]).Replace("-", ""), Is.EqualTo("0000000001020000000400000000000000000000000000000000000000000000000000244000000000000024400000000000003440000000000000394000000000000049400000000000004E40")); + } + + [Test] + public void BlobTypes() + { + ExecuteSQL("CREATE TABLE test(a BLOB, b TEXT)"); + ExecuteSQL("INSERT INTO test VALUES('Car', 'Plane')"); + + RowResult r = ExecuteSelectStatement(GetSession().GetSchema(schemaName).GetTable("test").Select()); + var rows = r.FetchAll(); + Assert.That(r.Columns.Count, Is.EqualTo(2)); + Assert.That(r.Columns[0].ClrType, Is.EqualTo(typeof(byte[]))); + Assert.That(r.Columns[1].ClrType, Is.EqualTo(typeof(string))); + Assert.That(r.Columns[0].Type, Is.EqualTo(ColumnType.Bytes)); + Assert.That(r.Columns[1].Type, Is.EqualTo(ColumnType.String)); + Assert.That(rows[0][0], Is.EqualTo(CharSetMap.GetEncoding(r.Columns[0].CharacterSetName).GetBytes("Car"))); + Assert.That(rows[0][1], Is.EqualTo("Plane")); + } + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/DateTimeTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/DateTimeTests.cs new file mode 100644 index 000000000..fdd9ca112 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/DateTimeTests.cs @@ -0,0 +1,127 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient.X.XDevAPI.Common; +using MySqlX.XDevAPI.Relational; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; + +namespace MySqlX.Data.Tests.RelationalTests +{ + public class DateTimeTests : BaseTest + { + [TearDown] + public void TearDown() => ExecuteSQL("DROP TABLE IF EXISTS test"); + [Test] + public void DateTime() + { + ExecuteSQL("CREATE TABLE test.test(DT DATETIME)"); + ExecuteSQL("INSERT INTO test.test VALUES('2001-02-03 04:05:06')"); + + RowResult r = ExecuteSelectStatement(GetSession().GetSchema("test").GetTable("test").Select("dt")); + var rows = r.FetchAll(); + Assert.That(r.Columns, Has.One.Items); + Assert.That(r.Columns[0].ClrType, Is.EqualTo(typeof(DateTime))); + Assert.That(r.Columns[0].Type, Is.EqualTo(ColumnType.DateTime)); + Assert.That(rows, Has.One.Items); + DateTime dt = (DateTime)rows[0]["dt"]; + DateTime test = new DateTime(2001, 2, 3, 4, 5, 6); + Assert.That(dt, Is.EqualTo(test)); + } + + [Test] + public void Date() + { + ExecuteSQL("CREATE TABLE test.test(DT DATE)"); + ExecuteSQL("INSERT INTO test.test VALUES('2001-02-03')"); + + RowResult r = ExecuteSelectStatement(GetSession().GetSchema("test").GetTable("test").Select("dt")); + var rows = r.FetchAll(); + Assert.That(r.Columns, Has.One.Items); + Assert.That(r.Columns[0].ClrType, Is.EqualTo(typeof(DateTime))); + Assert.That(r.Columns[0].Type, Is.EqualTo(ColumnType.Date)); + Assert.That(rows, Has.One.Items); + DateTime dt = (DateTime)rows[0]["dt"]; + DateTime test = new DateTime(2001, 2, 3); + Assert.That(dt, Is.EqualTo(test)); + } + + [Test] + public void Timestamp() + { + ExecuteSQL("CREATE TABLE test.test(DT TIMESTAMP)"); + ExecuteSQL("INSERT INTO test.test VALUES('2001-02-03')"); + + RowResult r = ExecuteSelectStatement(GetSession().GetSchema("test").GetTable("test").Select("dt")); + var rows = r.FetchAll(); + Assert.That(r.Columns, Has.One.Items); + Assert.That(r.Columns[0].ClrType, Is.EqualTo(typeof(DateTime))); + //TODO: this should support timestamp + Assert.That(r.Columns[0].Type, Is.EqualTo(ColumnType.Timestamp)); + Assert.That(rows, Has.One.Items); + DateTime dt = (DateTime)rows[0]["dt"]; + DateTime test = new DateTime(2001, 2, 3); + Assert.That(dt, Is.EqualTo(test)); + } + + [Test] + public void Time() + { + ExecuteSQL("CREATE TABLE test.test(DT TIME)"); + ExecuteSQL("INSERT INTO test.test VALUES('01:02:03')"); + + RowResult r = ExecuteSelectStatement(GetSession().GetSchema("test").GetTable("test").Select("dt")); + var rows = r.FetchAll(); + Assert.That(r.Columns, Has.One.Items); + Assert.That(r.Columns[0].ClrType, Is.EqualTo(typeof(TimeSpan))); + Assert.That(r.Columns[0].Type, Is.EqualTo(ColumnType.Time)); + Assert.That(rows, Has.One.Items); + TimeSpan t = (TimeSpan)rows[0]["dt"]; + TimeSpan test = new TimeSpan(1, 2, 3); + Assert.That(t, Is.EqualTo(test)); + } + + [Test] + public void NegativeTime() + { + ExecuteSQL("CREATE TABLE test.test(DT TIME)"); + ExecuteSQL("INSERT INTO test.test VALUES('-01:02:03')"); + + RowResult r = ExecuteSelectStatement(GetSession().GetSchema("test").GetTable("test").Select("dt")); + var rows = r.FetchAll(); + Assert.That(r.Columns, Has.One.Items); + Assert.That(r.Columns[0].ClrType, Is.EqualTo(typeof(TimeSpan))); + Assert.That(r.Columns[0].Type, Is.EqualTo(ColumnType.Time)); + Assert.That(rows, Has.One.Items); + TimeSpan t = (TimeSpan)rows[0]["dt"]; + TimeSpan test = new TimeSpan(-1, 2, 3); + Assert.That(t, Is.EqualTo(test)); + } + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/RelationalGCTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/RelationalGCTests.cs new file mode 100644 index 000000000..553f9ec47 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/RelationalGCTests.cs @@ -0,0 +1,58 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySqlX.XDevAPI.Relational; +using System; +using NUnit.Framework; +using NUnit.Framework.Legacy; + +namespace MySqlX.Data.Tests.ResultTests +{ + public class RelationalGCTests : BaseTest + { +#if NETFRAMEWORK + [Test] + public void FetchAllNoReference() + { + ExecuteSQL("CREATE TABLE test(name VARCHAR(40), age INT)"); + Table table = testSchema.GetTable("test"); + + ExecuteInsertStatement(table.Insert("name", "age").Values("Henry", "22").Values("Patric", 30)); + var result = ExecuteSelectStatement(table.Select()); + var rows = result.FetchAll(); + WeakReference wr = new WeakReference(result); + result = null; + GC.Collect(); + Assert.That(wr.IsAlive, Is.False); + Assert.That(rows.Count, Is.EqualTo(2)); + Assert.That(rows[0]["age"], Is.EqualTo(22)); + Assert.That(rows[1]["name"], Is.EqualTo("Patric")); + } +#endif + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/RowBufferingTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/RowBufferingTests.cs new file mode 100644 index 000000000..f0d8790a6 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/RowBufferingTests.cs @@ -0,0 +1,57 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySqlX.XDevAPI.Relational; +using NUnit.Framework; +using NUnit.Framework.Legacy; + +namespace MySqlX.Data.Tests.RelationalTests +{ + public class RowBufferingTests : BaseTest + { + [Test] + public void SmartBuffering() + { + ExecuteSQL("CREATE TABLE test1(id INT)"); + ExecuteSQL("INSERT INTO test1 VALUES (1),(2),(3),(4)"); + ExecuteSQL("CREATE TABLE test2(id INT, val INT)"); + ExecuteSQL("INSERT INTO test2 VALUES (1,0)"); + + var rowResult = ExecuteSelectStatement(testSchema.GetTable("test1").Select("id")); + Assert.That(rowResult.IndexOf("id"), Is.EqualTo(0)); + foreach (var row in rowResult) + { + var result = ExecuteUpdateStatement(testSchema.GetTable("test2").Update().Where("id=1").Set("val", row["id"])); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + } + + Row valRow = ExecuteSelectStatement(testSchema.GetTable("test2").Select("val")).FetchOne(); + Assert.That(valRow[0], Is.EqualTo(4)); + } + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/SqlTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/SqlTests.cs new file mode 100644 index 000000000..3ebe3e995 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/SqlTests.cs @@ -0,0 +1,1066 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using Google.Protobuf; +using MySql.Data.Common; +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Relational; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System.Collections.Generic; + +namespace MySqlX.Data.Tests.RelationalTests +{ + public class SqlTests : BaseTest + { + [TearDown] + public void TearDown() + { + ExecuteSQL("DROP TABLE IF EXISTS test"); + } + + [Test] + public void ReturnSimpleScalar() + { + ExecuteSQL("DROP TABLE IF EXISTS test.test"); + ExecuteSQL("CREATE TABLE test.test(id INT)"); + ExecuteSQL("INSERT INTO test.test VALUES (1)"); + using (var ss = MySQLX.GetSession(ConnectionString)) + { + SqlResult r = ss.SQL("SELECT * FROM test.test").Execute(); + Assert.That(r.Next()); + Assert.That(r[0], Is.EqualTo(1)); + Assert.That(r.NextResult(), Is.False); + } + + } + + [Test] + public void ExecuteStoredProcedure() + { + ExecuteSQL("CREATE PROCEDURE `my_proc` () BEGIN SELECT 5; END"); + + Session session = GetSession(true); + var result = ExecuteSQLStatement(session.SQL("CALL my_proc()")); + Assert.That(result.HasData); + var row = result.FetchOne(); + Assert.That(row, Is.Not.Null); + Assert.That(row[0], Is.EqualTo((sbyte)5)); + Assert.That(result.Next(), Is.False); + Assert.That(result.FetchOne(), Is.Null); + Assert.That(result.NextResult(), Is.False); + } + + [Test] + public void ExecuteStoredProcedureMultipleResults() + { + ExecuteSQL("drop procedure if exists my_proc"); + ExecuteSQL("CREATE PROCEDURE `my_proc` () BEGIN SELECT 5; SELECT 'A'; SELECT 5 * 2; END"); + + Session session = GetSession(true); + var result = ExecuteSQLStatement(session.SQL("CALL my_proc()")); + Assert.That(result.HasData); + var row = result.FetchOne(); + Assert.That(row, Is.Not.Null); + Assert.That(row[0], Is.EqualTo((sbyte)5)); + Assert.That(result.Next(), Is.False); + Assert.That(result.FetchOne(), Is.Null); + + Assert.That(result.NextResult()); + row = result.FetchOne(); + Assert.That(row, Is.Not.Null); + Assert.That(row[0], Is.EqualTo("A")); + Assert.That(result.Next(), Is.False); + Assert.That(result.FetchOne(), Is.Null); + + Assert.That(result.NextResult()); + row = result.FetchOne(); + Assert.That(row, Is.Not.Null); + Assert.That(row[0], Is.EqualTo((sbyte)10)); + Assert.That(result.Next(), Is.False); + Assert.That(result.FetchOne(), Is.Null); + + Assert.That(result.NextResult(), Is.False); + } + + [Test] + public void Bind() + { + ExecuteSQL("drop table if exists test.test"); + ExecuteSQL("CREATE TABLE test.test(id INT, letter varchar(1))"); + for (int i = 1; i <= 10; i++) + ExecuteSQLStatement(GetSession(true).SQL("INSERT INTO test.test VALUES (?, ?), (?, ?)") + .Bind(i, ((char)('@' + i)).ToString()) + .Bind(++i, ((char)('@' + i)).ToString())); + + SqlResult result = ExecuteSQLStatement(GetSession(true).SQL("select * from test.test where id=?").Bind(5)); + Assert.That(result.Next()); + Assert.That(result.Rows, Has.One.Items); + Assert.That(result[0], Is.EqualTo(5)); + Assert.That(result[1], Is.EqualTo("E")); + } + + [Test] + public void BindNull() + { + ExecuteSQL("drop table if exists test.test"); + ExecuteSQL("CREATE TABLE test.test(id INT, letter varchar(1))"); + + var session = GetSession(true); + var result = ExecuteSQLStatement(session.SQL("INSERT INTO test.test VALUES(1, ?), (2, 'B');").Bind(null)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(2ul)); + + var sqlResult = ExecuteSQLStatement(session.SQL("SELECT * FROM test.test WHERE letter is ?").Bind(null)).FetchAll(); + Assert.That(sqlResult, Has.One.Items); + Assert.That(sqlResult[0][0], Is.EqualTo(1)); + Assert.That(sqlResult[0][1], Is.Null); + } + + [Test] + public void Alias() + { + var session = GetSession(true); + var stmt = ExecuteSQLStatement(session.SQL("SELECT 1 AS UNO")); + var result = stmt.FetchAll(); + Assert.That(stmt.Columns[0].ColumnLabel, Is.EqualTo("UNO")); + } + + #region WL14389 + + [Test, Description("call after failed procedure")] + public void ProcedureWithNoTable() + { + ExecuteSQL("create procedure newproc (in p1 int,in p2 char(20)) begin select 1; select 'XXX' from notab; end;"); + + var session = MySQLX.GetSession(ConnectionString + ";database=test;"); + + + var sqlRes = session.SQL("call newproc(?, ?)").Bind(10).Bind("X").Execute(); + var ex = Assert.Throws(() => session.SQL("drop procedure if exists newproc ").Execute()); + Assert.That(ex.Message, Is.EqualTo("Table 'test.notab' doesn't exist").IgnoreCase); + } + + [Test, Description("Stored Procedure Table Positive using Session")] + public void TablePositiveSession() + { + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + var connectionStringObject = new { connection = "server=" + sb.Server + ";user=" + sb.UserID + ";port=" + sb.Port + ";password=" + sb.Password + ";sslmode=" + MySqlSslMode.Required + ";" }; + using (Session sessionPlain = MySQLX.GetSession(connectionStringObject.connection)) + { + sessionPlain.SQL("DROP DATABASE IF EXISTS DBName").Execute(); + sessionPlain.SQL("CREATE DATABASE DBName").Execute(); + sessionPlain.SQL("USE DBName").Execute(); + sessionPlain.SQL("CREATE TABLE address" + + "(address_number INT NOT NULL AUTO_INCREMENT, " + + "building_name VARCHAR(100) NOT NULL, " + + "district VARCHAR(100) NOT NULL, PRIMARY KEY (address_number)" + ");").Execute(); + sessionPlain.SQL("INSERT INTO address" + + "(address_number,building_name,district)" + + " VALUES " + + "(1573,'MySQL','BGL');").Execute(); + string procI = "CREATE PROCEDURE my_add_one_procedure " + + " (IN address_id INT) " + + "BEGIN " + + "select * from address as a where a.address_number = address_id;" + + "END;"; + sessionPlain.SQL(procI).Execute(); + var res = sessionPlain.SQL("CALL my_add_one_procedure(1573);").Execute(); + if (res.HasData) + { + var row = res.FetchOne(); + if (row != null) + { + do + { + if (row[0] != null) + Assert.That(row[0].ToString(), Is.Not.Null); + + if (row[1] != null) + Assert.That(row[1].ToString(), Is.Not.Null); + + if (row[2] != null) + Assert.That(row[2].ToString(), Is.Not.Null); + + } while (res.Next()); while (res.NextResult()) ; + } + } + sessionPlain.SQL("DROP DATABASE DBName").Execute(); + } + } + + [Test, Description("Stored Procedure Table-StringBuilder and Session")] + public void StoredProcTablePositiveStringBuilderSession() + { + Assume.That(Platform.IsWindows(), "This test is only for Windows OS."); + + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + var connectionStringObject = new { connection = "server=" + sb.Server + ";user=" + sb.UserID + ";port=" + sb.Port + ";password=" + sb.Password }; + + using (MySqlConnection mysql = new MySqlConnection(ConnectionStringRoot)) + { + mysql.Open(); + System.Text.StringBuilder sql = new System.Text.StringBuilder(); + sql.AppendLine("DROP DATABASE IF EXISTS DBName"); + MySqlScript script = new MySqlScript(mysql, sql.ToString()); + script.Execute(); + sql = new System.Text.StringBuilder(); + sql.AppendLine("CREATE DATABASE DBName"); + script = new MySqlScript(mysql, sql.ToString()); + script.Execute(); + sql = new System.Text.StringBuilder(); + sql.AppendLine("USE DBName"); + script = new MySqlScript(mysql, sql.ToString()); + script.Execute(); + sql = new System.Text.StringBuilder(); + sql.AppendLine("CREATE TABLE address" + + "(address_number INT NOT NULL AUTO_INCREMENT, " + + "building_name VARCHAR(100) NOT NULL, " + + "district VARCHAR(100) NOT NULL, PRIMARY KEY (address_number)" + ");" + ); + script = new MySqlScript(mysql, sql.ToString()); + script.Execute(); + sql = new System.Text.StringBuilder(); + sql.AppendLine("INSERT INTO address" + + "(address_number,building_name,district)" + + " VALUES " + + "(1573,'MySQL','BGL');"); + script = new MySqlScript(mysql, sql.ToString()); + script.Execute(); + sql = new System.Text.StringBuilder(); + sql.AppendLine("INSERT INTO address" + + "(address_number,building_name,district)" + + " VALUES " + + "(1,'MySQLTest1','BGLTest1');"); + script = new MySqlScript(mysql, sql.ToString()); + script.Execute(); + sql = new System.Text.StringBuilder(); + sql.AppendLine("INSERT INTO address" + + "(address_number,building_name,district)" + + " VALUES " + + "(2,'MySQLTest2','BGLTest2');"); + script = new MySqlScript(mysql, sql.ToString()); + script.Execute(); + sql = new System.Text.StringBuilder(); + sql.AppendLine("DELIMITER //"); + sql.AppendLine("CREATE PROCEDURE my_add_one_procedure " + + " (IN address_id INT) " + + "BEGIN " + + "select * from address as a where a.address_number = address_id;" + + "END//"); + script = new MySqlScript(mysql, sql.ToString()); + script.Execute(); + sql = new System.Text.StringBuilder(); + sql.AppendLine("DELIMITER ;"); + script = new MySqlScript(mysql, sql.ToString()); + script.Execute(); + } + + using (Session sessionPlain = MySQLX.GetSession(connectionStringObject.connection)) + { + sessionPlain.SQL("USE DBName").Execute(); + var res = sessionPlain.SQL("CALL my_add_one_procedure(1573);").Execute(); + if (res.HasData) + { + var row = res.FetchOne(); + if (row != null) + { + do + { + if (row[0] != null) + Assert.That(row[0].ToString(), Is.Not.Null); + + if (row[1] != null) + Assert.That(row[1].ToString(), Is.Not.Null); + + if (row[2] != null) + Assert.That(row[2].ToString(), Is.Not.Null); + + } while (res.Next()); while (res.NextResult()) ; + } + } + sessionPlain.SQL("DROP PROCEDURE my_add_one_procedure;").Execute(); + sessionPlain.SQL("DROP TABLE address;").Execute(); + sessionPlain.SQL("DROP DATABASE DBName;").Execute(); + } + } + + [Test, Description("Stored Procedure Table-Negative(procedure returns null)")] + public void StoredProcReturnsNull() + { + Assume.That(Platform.IsWindows(), "This test is only for Windows OS."); + + MySqlConnection mysql = new MySqlConnection(ConnectionStringRoot); + mysql.Open(); + System.Text.StringBuilder sql = new System.Text.StringBuilder(); + sql.AppendLine("DROP DATABASE IF EXISTS DBName"); + MySqlScript script = new MySqlScript(mysql, sql.ToString()); + script.Execute(); + sql = new System.Text.StringBuilder(); + sql.AppendLine("CREATE DATABASE DBName"); + script = new MySqlScript(mysql, sql.ToString()); + script.Execute(); + sql = new System.Text.StringBuilder(); + sql.AppendLine("USE DBName"); + script = new MySqlScript(mysql, sql.ToString()); + script.Execute(); + sql = new System.Text.StringBuilder(); + sql.AppendLine("CREATE TABLE address" + + "(address_number INT NOT NULL AUTO_INCREMENT, " + + "building_name VARCHAR(100) NOT NULL, " + + "district VARCHAR(100) NOT NULL, PRIMARY KEY (address_number)" + ");" + ); + script = new MySqlScript(mysql, sql.ToString()); + script.Execute(); + sql = new System.Text.StringBuilder(); + sql.AppendLine("INSERT INTO address" + + "(address_number,building_name,district)" + + " VALUES " + + "(1573,'MySQL','BGL');"); + script = new MySqlScript(mysql, sql.ToString()); + script.Execute(); + sql = new System.Text.StringBuilder(); + sql.AppendLine("INSERT INTO address" + + "(address_number,building_name,district)" + + " VALUES " + + "(1,'MySQLTest1','BGLTest1');"); + script = new MySqlScript(mysql, sql.ToString()); + script.Execute(); + sql = new System.Text.StringBuilder(); + sql.AppendLine("INSERT INTO address" + + "(address_number,building_name,district)" + + " VALUES " + + "(2,'MySQLTest2','BGLTest2');"); + script = new MySqlScript(mysql, sql.ToString()); + script.Execute(); + sql = new System.Text.StringBuilder(); + sql.AppendLine("DELIMITER //"); + sql.AppendLine("CREATE PROCEDURE my_add_one_procedure " + + " (IN address_id INT) " + + "BEGIN " + + "select * from address as a where a.address_number = address_id;" + + "END//"); + script = new MySqlScript(mysql, sql.ToString()); + script.Execute(); + sql = new System.Text.StringBuilder(); + sql.AppendLine("DELIMITER ;"); + script = new MySqlScript(mysql, sql.ToString()); + script.Execute(); + + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + var connectionStringObject = new { connection = "server=" + sb.Server + ";user=" + sb.UserID + ";port=" + sb.Port + ";password=" + sb.Password + ";sslmode=" + MySqlSslMode.Required + ";" }; + using (Session sessionPlain = MySQLX.GetSession(connectionStringObject.connection)) + { + sessionPlain.SQL("USE DBName").Execute(); + + var res = sessionPlain.SQL("CALL my_add_one_procedure(1000);").Execute(); + if (res.HasData) + { + var row = res.FetchOne(); + Assert.That(row, Is.Null); + } + res.Next(); + res.NextResult(); + } + } + + //SQLTests + [Test, Description("Bind Support for Session SQL Numeric Datatypes- integer,JSON,tinyint,smallint,mediumint,bigint,float,double,decimal")] + public void BindSupportSessionSQLNumericDatatypes() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + var connectionString = ConnectionString + ";sslmode=" + MySqlSslMode.Required; + SqlResult myResult; + Row row; + + //integer + using (Session sessionTest = MySQLX.GetSession(connectionString)) + { + sessionTest.SQL("DROP DATABASE IF EXISTS DBName ").Execute(); + sessionTest.SQL("CREATE DATABASE IF NOT EXISTS DBName").Execute(); + sessionTest.SQL("USE DBName").Execute(); + sessionTest.SQL("CREATE PROCEDURE my_add_one_procedure " + + " (INOUT incr_param INT) " + + "BEGIN " + + " SET incr_param = incr_param + 1;" + + "END;").Execute(); + //Uncomment once Bind is implemented in 7.0.2 + sessionTest.SQL("SET @my_var = ?;").Bind(10).Execute(); + sessionTest.SQL("CALL my_add_one_procedure(@my_var);").Execute(); + sessionTest.SQL("DROP PROCEDURE my_add_one_procedure;").Execute(); + // Use a SQL query to get the result + myResult = sessionTest.SQL("SELECT @my_var").Execute(); + // Gets the row and prints the first column + row = myResult.FetchOne(); + Assert.That(row[0].ToString(), Is.Not.Null); + sessionTest.SQL("DROP DATABASE DBName").Execute(); + } + + //JSON + using (var sessionTest = MySQLX.GetSession(connectionString)) + { + sessionTest.SQL("CREATE DATABASE IF NOT EXISTS DBName").Execute(); + sessionTest.SQL("USE DBName").Execute(); + sessionTest.SQL("CREATE PROCEDURE my_add_one_procedure " + + " (INOUT incr_param Json) " + + "BEGIN " + + " SET incr_param = incr_param;" + + "END;").Execute(); + //Uncomment once Bind is implemented in 7.0.2 + var jsonParams = "{ \"pages1\" : 30, \"pages2\" : 40 }"; + sessionTest.SQL("SET @my_var = ?;").Bind(jsonParams).Execute(); + sessionTest.SQL("CALL my_add_one_procedure(@my_var);").Execute(); + sessionTest.SQL("DROP PROCEDURE my_add_one_procedure;").Execute(); + // Use a SQL query to get the result + myResult = sessionTest.SQL("SELECT @my_var").Execute(); + // Gets the row and prints the first column + row = myResult.FetchOne(); + Assert.That(row[0].ToString(), Is.Not.Null); + sessionTest.SQL("DROP DATABASE DBName").Execute(); + } + + //TINYINT + using (var sessionTest = MySQLX.GetSession(connectionString)) + { + sessionTest.SQL("CREATE DATABASE IF NOT EXISTS DBName").Execute(); + sessionTest.SQL("USE DBName").Execute(); + sessionTest.SQL("CREATE PROCEDURE my_add_one_procedure " + + " (INOUT incr_param TINYINT) " + + "BEGIN " + + " SET incr_param = incr_param + 1;" + + "END;").Execute(); + //Uncomment once Bind is implemented in 7.0.2 + sessionTest.SQL("SET @my_var = ?;").Bind(1).Execute(); + sessionTest.SQL("CALL my_add_one_procedure(@my_var);").Execute(); + sessionTest.SQL("DROP PROCEDURE my_add_one_procedure;").Execute(); + // Use a SQL query to get the result + myResult = sessionTest.SQL("SELECT @my_var").Execute(); + // Gets the row and prints the first column + row = myResult.FetchOne(); + Assert.That(row[0].ToString(), Is.Not.Null); + sessionTest.SQL("DROP DATABASE DBName").Execute(); + } + + //SMALLINT + using (var sessionTest = MySQLX.GetSession(connectionString)) + { + sessionTest.SQL("CREATE DATABASE IF NOT EXISTS DBName").Execute(); + sessionTest.SQL("USE DBName").Execute(); + sessionTest.SQL("CREATE PROCEDURE my_add_one_procedure " + + " (INOUT incr_param SMALLINT) " + + "BEGIN " + + " SET incr_param = incr_param + 1;" + + "END;").Execute(); + //Uncomment once Bind is implemented in 7.0.2 + sessionTest.SQL("SET @my_var = ?;").Bind(11111).Execute(); + sessionTest.SQL("CALL my_add_one_procedure(@my_var);").Execute(); + sessionTest.SQL("DROP PROCEDURE my_add_one_procedure;").Execute(); + // Use a SQL query to get the result + myResult = sessionTest.SQL("SELECT @my_var").Execute(); + // Gets the row and prints the first column + row = myResult.FetchOne(); + Assert.That(row[0].ToString(), Is.Not.Null); + sessionTest.SQL("DROP DATABASE DBName").Execute(); + } + + //MEDIUMINT + using (var sessionTest = MySQLX.GetSession(connectionString)) + { + sessionTest.SQL("CREATE DATABASE IF NOT EXISTS DBName").Execute(); + sessionTest.SQL("USE DBName").Execute(); + sessionTest.SQL("CREATE PROCEDURE my_add_one_procedure " + + " (INOUT incr_param MEDIUMINT) " + + "BEGIN " + + " SET incr_param = incr_param + 1;" + + "END;").Execute(); + //Uncomment once Bind is implemented in 7.0.2 + sessionTest.SQL("SET @my_var = ?;").Bind(1111).Execute(); + sessionTest.SQL("CALL my_add_one_procedure(@my_var);").Execute(); + sessionTest.SQL("DROP PROCEDURE my_add_one_procedure;").Execute(); + // Use a SQL query to get the result + myResult = sessionTest.SQL("SELECT @my_var").Execute(); + // Gets the row and prints the first column + row = myResult.FetchOne(); + Assert.That(row[0].ToString(), Is.Not.Null); + sessionTest.SQL("DROP DATABASE DBName").Execute(); + } + + //FLOATMD + using (var sessionTest = MySQLX.GetSession(connectionString)) + { + sessionTest.SQL("CREATE DATABASE IF NOT EXISTS DBName").Execute(); + sessionTest.SQL("USE DBName").Execute(); + sessionTest.SQL("CREATE PROCEDURE my_add_one_procedure " + + " (INOUT incr_param FLOAT(10,2)) " + + "BEGIN " + + " SET incr_param = incr_param + 1;" + + "END;").Execute(); + //Uncomment once Bind is implemented in 7.0.2 + sessionTest.SQL("SET @my_var = ?;").Bind(100.2).Execute(); + sessionTest.SQL("CALL my_add_one_procedure(@my_var);").Execute(); + sessionTest.SQL("DROP PROCEDURE my_add_one_procedure;").Execute(); + // Use a SQL query to get the result + myResult = sessionTest.SQL("SELECT @my_var").Execute(); + // Gets the row and prints the first column + row = myResult.FetchOne(); + Assert.That(row[0].ToString(), Is.Not.Null); + sessionTest.SQL("DROP DATABASE DBName").Execute(); + } + + //DOUBLEMD + using (var sessionTest = MySQLX.GetSession(connectionString)) + { + sessionTest.SQL("CREATE DATABASE IF NOT EXISTS DBName").Execute(); + sessionTest.SQL("USE DBName").Execute(); + sessionTest.SQL("CREATE PROCEDURE my_add_one_procedure " + + " (INOUT incr_param DOUBLE(10,2)) " + + "BEGIN " + + " SET incr_param = incr_param + 1;" + + "END;").Execute(); + //Uncomment once Bind is implemented in 7.0.2 + sessionTest.SQL("SET @my_var = ?;").Bind(1000.2).Execute(); + sessionTest.SQL("CALL my_add_one_procedure(@my_var);").Execute(); + sessionTest.SQL("DROP PROCEDURE my_add_one_procedure;").Execute(); + // Use a SQL query to get the result + myResult = sessionTest.SQL("SELECT @my_var").Execute(); + // Gets the row and prints the first column + row = myResult.FetchOne(); + Assert.That(row[0].ToString(), Is.Not.Null); + sessionTest.SQL("DROP DATABASE DBName").Execute(); + } + + //DECIMALMD + using (var sessionTest = MySQLX.GetSession(connectionString)) + { + sessionTest.SQL("CREATE DATABASE IF NOT EXISTS DBName").Execute(); + sessionTest.SQL("USE DBName").Execute(); + sessionTest.SQL("CREATE PROCEDURE my_add_one_procedure " + + " (INOUT incr_param DECIMAL(10,2)) " + + "BEGIN " + + " SET incr_param = incr_param + 1;" + + "END;").Execute(); + //Uncomment once Bind is implemented in 7.0.2 + sessionTest.SQL("SET @my_var = ?;").Bind(10000.2).Execute(); + sessionTest.SQL("CALL my_add_one_procedure(@my_var);").Execute(); + sessionTest.SQL("DROP PROCEDURE my_add_one_procedure;").Execute(); + // Use a SQL query to get the result + myResult = sessionTest.SQL("SELECT @my_var").Execute(); + // Gets the row and prints the first column + row = myResult.FetchOne(); + Assert.That(row[0].ToString(), Is.Not.Null); + sessionTest.SQL("DROP DATABASE DBName").Execute(); + } + } + + + [Test, Description("Bind Support for Session SQL DateTime Types- date,datetime,timestamp,time,year(M)")] + public void BindSupportSessionSQLDateTimetypes() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + //DATE + string connectionString = ConnectionString + ";sslmode=" + MySqlSslMode.Required; + SqlResult myResult; + Row row; + + using (Session sessionTest = MySQLX.GetSession(connectionString)) + { + sessionTest.SQL("DROP DATABASE IF EXISTS DBName ").Execute(); + sessionTest.SQL("CREATE DATABASE IF NOT EXISTS DBName").Execute(); + sessionTest.SQL("USE DBName").Execute(); + sessionTest.SQL("CREATE PROCEDURE my_add_one_procedure " + + " (INOUT incr_param DATE) " + + "BEGIN " + + " SET incr_param = incr_param ;" + + "END;").Execute(); + //Uncomment once Bind is implemented in 7.0.2 + sessionTest.SQL("SET @my_var = ?;").Bind("1973-12-30").Execute(); + sessionTest.SQL("CALL my_add_one_procedure(@my_var);").Execute(); + sessionTest.SQL("DROP PROCEDURE my_add_one_procedure;").Execute(); + // Use a SQL query to get the result + myResult = sessionTest.SQL("SELECT @my_var").Execute(); + // Gets the row and prints the first column + row = myResult.FetchOne(); + Assert.That(row[0].ToString(), Is.Not.Null); + sessionTest.SQL("DROP DATABASE DBName").Execute(); + } + + //DATETIME + using (Session sessionTest = MySQLX.GetSession(connectionString)) + { + sessionTest.SQL("CREATE DATABASE IF NOT EXISTS DBName").Execute(); + sessionTest.SQL("USE DBName").Execute(); + sessionTest.SQL("CREATE PROCEDURE my_add_one_procedure " + + " (INOUT incr_param DATETIME) " + + "BEGIN " + + " SET incr_param = incr_param ;" + + "END;").Execute(); + //Uncomment once Bind is implemented in 7.0.2 + sessionTest.SQL("SET @my_var = ?;").Bind("1981-04-10 15:30:00").Execute(); + sessionTest.SQL("CALL my_add_one_procedure(@my_var);").Execute(); + sessionTest.SQL("DROP PROCEDURE my_add_one_procedure;").Execute(); + // Use a SQL query to get the result + myResult = sessionTest.SQL("SELECT @my_var").Execute(); + // Gets the row and prints the first column + row = myResult.FetchOne(); + Assert.That(row[0].ToString(), Is.Not.Null); + sessionTest.SQL("DROP DATABASE DBName").Execute(); + } + + //TIMESTAMP + using (Session sessionTest = MySQLX.GetSession(connectionString)) + { + sessionTest.SQL("CREATE DATABASE IF NOT EXISTS DBName").Execute(); + sessionTest.SQL("USE DBName").Execute(); + sessionTest.SQL("CREATE PROCEDURE my_add_one_procedure " + + " (INOUT incr_param TIMESTAMP) " + + "BEGIN " + + " SET incr_param = incr_param ;" + + "END;").Execute(); + //Uncomment once Bind is implemented in 7.0.2 + sessionTest.SQL("SET @my_var = ?;").Bind("20160316153000").Execute(); + sessionTest.SQL("CALL my_add_one_procedure(@my_var);").Execute(); + sessionTest.SQL("DROP PROCEDURE my_add_one_procedure;").Execute(); + // Use a SQL query to get the result + myResult = sessionTest.SQL("SELECT @my_var").Execute(); + // Gets the row and prints the first column + row = myResult.FetchOne(); + Assert.That(row[0].ToString(), Is.Not.Null); + sessionTest.SQL("DROP DATABASE DBName").Execute(); + } + + //TIME + using (Session sessionTest = MySQLX.GetSession(connectionString)) + { + sessionTest.SQL("CREATE DATABASE IF NOT EXISTS DBName").Execute(); + sessionTest.SQL("USE DBName").Execute(); + sessionTest.SQL("CREATE PROCEDURE my_add_one_procedure " + + " (INOUT incr_param TIME) " + + "BEGIN " + + " SET incr_param = incr_param ;" + + "END;").Execute(); + //Uncomment once Bind is implemented in 7.0.2 + sessionTest.SQL("SET @my_var = ?;").Bind("12:00:00").Execute(); + sessionTest.SQL("CALL my_add_one_procedure(@my_var);").Execute(); + sessionTest.SQL("DROP PROCEDURE my_add_one_procedure;").Execute(); + // Use a SQL query to get the result + myResult = sessionTest.SQL("SELECT @my_var").Execute(); + // Gets the row and prints the first column + row = myResult.FetchOne(); + Assert.That(row[0].ToString(), Is.Not.Null); + sessionTest.SQL("DROP DATABASE DBName").Execute(); + } + + //YEAR + using (Session sessionTest = MySQLX.GetSession(connectionString)) + { + sessionTest.SQL("CREATE DATABASE IF NOT EXISTS DBName").Execute(); + sessionTest.SQL("USE DBName").Execute(); + sessionTest.SQL("CREATE PROCEDURE my_add_one_procedure " + + " (INOUT incr_param YEAR(4)) " + + "BEGIN " + + " SET incr_param = incr_param ;" + + "END;").Execute(); + //Uncomment once Bind is implemented in 7.0.2 + sessionTest.SQL("SET @my_var = ?;").Bind("2111").Execute(); + sessionTest.SQL("CALL my_add_one_procedure(@my_var);").Execute(); + sessionTest.SQL("DROP PROCEDURE my_add_one_procedure;").Execute(); + // Use a SQL query to get the result + myResult = sessionTest.SQL("SELECT @my_var").Execute(); + // Gets the row and prints the first column + row = myResult.FetchOne(); + Assert.That(row[0].ToString(), Is.Not.Null); + sessionTest.SQL("DROP DATABASE DBName").Execute(); + } + } + + + [Test, Description("Bind Support for Session SQL String Types- CHAR(M),VARCHAR(M),BLOB,TINYBLOB,MEDIUMBLOB,LONGBLOB,ENUM")] + public void BindSupportSessionSQLStringtypes() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + //CHAR(20) + string connectionString = ConnectionString + ";sslmode=" + MySqlSslMode.Required; + SqlResult myResult; + Row row; + + using (Session sessionTest = MySQLX.GetSession(connectionString)) + { + sessionTest.SQL("DROP DATABASE IF EXISTS DBName ").Execute(); + sessionTest.SQL("CREATE DATABASE IF NOT EXISTS DBName").Execute(); + sessionTest.SQL("USE DBName").Execute(); + sessionTest.SQL("CREATE PROCEDURE my_add_one_procedure " + + " (INOUT incr_param CHAR(20)) " + + "BEGIN " + + " SET incr_param = incr_param;" + + "END;").Execute(); + //Uncomment once Bind is implemented in 7.0.2 + sessionTest.SQL("SET @my_var = ?;").Bind("ABCDEFGHIJABCDEFGHIJ").Execute(); + sessionTest.SQL("CALL my_add_one_procedure(@my_var);").Execute(); + sessionTest.SQL("DROP PROCEDURE my_add_one_procedure;").Execute(); + // Use a SQL query to get the result + myResult = sessionTest.SQL("SELECT @my_var").Execute(); + // Gets the row and prints the first column + row = myResult.FetchOne(); + Assert.That(row[0].ToString(), Is.Not.Null); + sessionTest.SQL("DROP DATABASE DBName").Execute(); + } + + //VARCHAR(20) + using (Session sessionTest = MySQLX.GetSession(connectionString)) + { + sessionTest.SQL("CREATE DATABASE IF NOT EXISTS DBName").Execute(); + sessionTest.SQL("USE DBName").Execute(); + sessionTest.SQL("CREATE PROCEDURE my_add_one_procedure " + + " (INOUT incr_param VARCHAR(20)) " + + "BEGIN " + + " SET incr_param = incr_param;" + + "END;").Execute(); + //Uncomment once Bind is implemented in 7.0.2 + sessionTest.SQL("SET @my_var = ?;").Bind("ABCDEFGHIJABCDEFGHIJ").Execute(); + sessionTest.SQL("CALL my_add_one_procedure(@my_var);").Execute(); + sessionTest.SQL("DROP PROCEDURE my_add_one_procedure;").Execute(); + // Use a SQL query to get the result + myResult = sessionTest.SQL("SELECT @my_var").Execute(); + // Gets the row and prints the first column + row = myResult.FetchOne(); + Assert.That(row[0].ToString(), Is.Not.Null); + sessionTest.SQL("DROP DATABASE DBName").Execute(); + } + + //BLOB + using (Session sessionTest = MySQLX.GetSession(connectionString)) + { + sessionTest.SQL("CREATE DATABASE IF NOT EXISTS DBName").Execute(); + sessionTest.SQL("USE DBName").Execute(); + sessionTest.SQL("CREATE PROCEDURE my_add_one_procedure " + + " (INOUT incr_param BLOB) " + + "BEGIN " + + " SET incr_param = incr_param ;" + + "END;").Execute(); + //Uncomment once Bind is implemented in 7.0.2 + sessionTest.SQL("SET @my_var = ?;").Bind(19731230153000).Execute(); + sessionTest.SQL("CALL my_add_one_procedure(@my_var);").Execute(); + sessionTest.SQL("DROP PROCEDURE my_add_one_procedure;").Execute(); + // Use a SQL query to get the result + myResult = sessionTest.SQL("SELECT @my_var").Execute(); + // Gets the row and prints the first column + row = myResult.FetchOne(); + Assert.That(row[0].ToString(), Is.Not.Null); + sessionTest.SQL("DROP DATABASE DBName").Execute(); + } + + //TINYBLOB + using (Session sessionTest = MySQLX.GetSession(connectionString)) + { + sessionTest.SQL("CREATE DATABASE IF NOT EXISTS DBName").Execute(); + sessionTest.SQL("USE DBName").Execute(); + sessionTest.SQL("CREATE PROCEDURE my_add_one_procedure " + + " (INOUT incr_param TINYBLOB) " + + "BEGIN " + + " SET incr_param = incr_param ;" + + "END;").Execute(); + //Uncomment once Bind is implemented in 7.0.2 + sessionTest.SQL("SET @my_var = ?;").Bind("12:00:00").Execute(); + sessionTest.SQL("CALL my_add_one_procedure(@my_var);").Execute(); + sessionTest.SQL("DROP PROCEDURE my_add_one_procedure;").Execute(); + // Use a SQL query to get the result + myResult = sessionTest.SQL("SELECT @my_var").Execute(); + // Gets the row and prints the first column + row = myResult.FetchOne(); + Assert.That(row[0].ToString(), Is.Not.Null); + sessionTest.SQL("DROP DATABASE DBName").Execute(); + } + + //MEDIUMBLOB + using (Session sessionTest = MySQLX.GetSession(connectionString)) + { + sessionTest.SQL("CREATE DATABASE IF NOT EXISTS DBName").Execute(); + sessionTest.SQL("USE DBName").Execute(); + sessionTest.SQL("CREATE PROCEDURE my_add_one_procedure " + + " (INOUT incr_param MEDIUMBLOB) " + + "BEGIN " + + " SET incr_param = incr_param ;" + + "END;").Execute(); + //Uncomment once Bind is implemented in 7.0.2 + sessionTest.SQL("SET @my_var = ?;").Bind(2111).Execute(); + sessionTest.SQL("CALL my_add_one_procedure(@my_var);").Execute(); + sessionTest.SQL("DROP PROCEDURE my_add_one_procedure;").Execute(); + // Use a SQL query to get the result + myResult = sessionTest.SQL("SELECT @my_var").Execute(); + // Gets the row and prints the first column + row = myResult.FetchOne(); + Assert.That(row[0].ToString(), Is.Not.Null); + sessionTest.SQL("DROP DATABASE DBName").Execute(); + } + + //LONGBLOB + using (Session sessionTest = MySQLX.GetSession(connectionString)) + { + sessionTest.SQL("CREATE DATABASE IF NOT EXISTS DBName").Execute(); + sessionTest.SQL("USE DBName").Execute(); + sessionTest.SQL("CREATE PROCEDURE my_add_one_procedure " + + " (INOUT incr_param LONGBLOB) " + + "BEGIN " + + " SET incr_param = incr_param ;" + + "END;").Execute(); + //Uncomment once Bind is implemented in 7.0.2 + sessionTest.SQL("SET @my_var = ?;").Bind(111232).Execute(); + sessionTest.SQL("CALL my_add_one_procedure(@my_var);").Execute(); + sessionTest.SQL("DROP PROCEDURE my_add_one_procedure;").Execute(); + // Use a SQL query to get the result + myResult = sessionTest.SQL("SELECT @my_var").Execute(); + // Gets the row and prints the first column + row = myResult.FetchOne(); + Assert.That(row[0].ToString(), Is.Not.Null); + sessionTest.SQL("DROP DATABASE DBName").Execute(); + } + + //ENUM + using (Session sessionTest = MySQLX.GetSession(connectionString)) + { + sessionTest.SQL("CREATE DATABASE IF NOT EXISTS DBName").Execute(); + sessionTest.SQL("USE DBName").Execute(); + sessionTest.SQL("CREATE PROCEDURE my_add_one_procedure " + + " (INOUT incr_param ENUM('x-small', 'small', 'medium', 'large', 'x-large')) " + + "BEGIN " + + " SET incr_param = incr_param ;" + + "END;").Execute(); + //Uncomment once Bind is implemented in 7.0.2 + sessionTest.SQL("SET @my_var = ?;").Bind("large").Execute(); + sessionTest.SQL("CALL my_add_one_procedure(@my_var);").Execute(); + sessionTest.SQL("DROP PROCEDURE my_add_one_procedure;").Execute(); + // Use a SQL query to get the result + myResult = sessionTest.SQL("SELECT @my_var").Execute(); + // Gets the row and prints the first column + row = myResult.FetchOne(); + Assert.That(row[0].ToString(), Is.Not.Null); + sessionTest.SQL("DROP DATABASE DBName").Execute(); + } + } + + [Test, Description("Bind Support for Session SQL Negative Tests-Null")] + public void BindSupportSessionSQLNegativeTest1() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + SqlResult myResult = null; + + //integer + string connectionString = ConnectionString + ";sslmode=" + MySqlSslMode.Required; + Session sessionTest = MySQLX.GetSession(connectionString); + sessionTest.SQL("DROP DATABASE IF EXISTS DBName ").Execute(); + sessionTest.SQL("CREATE DATABASE IF NOT EXISTS DBName").Execute(); + sessionTest.SQL("USE DBName").Execute(); + sessionTest.SQL("CREATE PROCEDURE my_add_one_procedure " + + " (INOUT incr_param INT) " + + "BEGIN " + + " SET incr_param = incr_param+1;" + + "END;").Execute(); + + sessionTest.SQL("SET @my_var = ?;").Bind(null).Execute(); + sessionTest.SQL("CALL my_add_one_procedure(@my_var);").Execute(); + sessionTest.SQL("DROP PROCEDURE my_add_one_procedure;").Execute(); + // Use a SQL query to get the result + myResult = sessionTest.SQL("SELECT @my_var").Execute(); + + Assert.Throws(() => myResult.FetchOne()); + sessionTest.SQL("DROP DATABASE DBName").Execute(); + sessionTest.Close(); + sessionTest.Dispose(); + } + + [Test, Description("Bind Support for Session SQL Negative Tests-Bind Chaining Tests")] + public void BindSupportSessionSQLNegativeTest2() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + + //integer + string connectionString = ConnectionString + ";sslmode=" + MySqlSslMode.Required; + Session sessionTest = MySQLX.GetSession(connectionString); + sessionTest.SQL("DROP DATABASE IF EXISTS DBName ").Execute(); + sessionTest.SQL("CREATE DATABASE IF NOT EXISTS DBName").Execute(); + sessionTest.SQL("USE DBName").Execute(); + sessionTest.SQL("CREATE PROCEDURE my_add_one_procedure " + + " (INOUT incr_param INT) " + + "BEGIN " + + " SET incr_param = incr_param + 1;" + + "END;").Execute(); + sessionTest.SQL("CREATE TABLE DBName.test(id INT, letter varchar(1))").Execute(); + + for (int i = 1; i <= 100; i++) + + session.SQL("INSERT INTO DBName.test VALUES (?, ?), (?, ?)") + .Bind(1, "a") + .Bind(2, "b") + .Execute(); + + SqlResult result = session.SQL("select * from DBName.test where id=?").Bind(5).Execute(); + + //Uncomment once Bind is implemented in 7.0.2 + Assert.Throws(() => session.SQL("SET @my_var = ?;").Bind(1).Bind(2).Execute()); + sessionTest.SQL("DROP DATABASE DBName").Execute(); + sessionTest.Close(); + sessionTest.Dispose(); + + } + + // Aditional Tests + [Test, Description("Test MySQLX plugin MySQL mixed scenario")] + public void MixedChainedCommands() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + ExecuteSQL("Drop table if exists test"); + ExecuteSQL("CREATE TABLE test(c1 float(14,8),c2 double GENERATED ALWAYS AS (c1*101/102) Stored COMMENT 'First Gen Col')"); + ExecuteSQL("INSERT INTO test(c1) VALUES (22.7)"); + ExecuteSQL("INSERT INTO test(c1) VALUES (-100000.38984)"); + ExecuteSQL("INSERT INTO test(c1) VALUES (0)"); + + RowResult r = session.GetSchema("test").GetTable("test").Select("c1").Execute(); + var rows = r.FetchAll(); + Assert.That(r.Columns.Count, Is.EqualTo(1), "Matching"); + Assert.That(r.Columns[0].ClrType.ToString(), Is.EqualTo(typeof(float).ToString()), "Matching"); + Assert.That(r.Columns[0].Type.ToString(), Is.EqualTo(MySqlDbType.Float.ToString()), "Matching"); + Assert.That((int)r.Columns[0].Length, Is.EqualTo(14), "Matching"); + Assert.That((int)r.Columns[0].FractionalDigits, Is.EqualTo(8), "Matching"); + Assert.That(rows.Count, Is.EqualTo(3), "Matching"); + Assert.That((float)rows[0][0], Is.EqualTo(22.7f), "Matching"); + Assert.That((float)rows[1][0], Is.EqualTo(-100000.38984f), "Matching"); + Assert.That((float)rows[2][0], Is.EqualTo(0f), "Matching"); + } + + [Test, Description("Test MySQLX plugin MySQL Date Time Bug")] + public void DateTimeCheck() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + ExecuteSQL("CREATE TABLE test.test1212(dt DATETIME(6))"); + ExecuteSQL("INSERT INTO test.test1212 VALUES('2015-10-21 18:01:00.12345678')"); + + RowResult r = session.GetSchema("test").GetTable("test1212").Select("dt").Execute(); + var rows = r.FetchAll(); + Assert.That(r.Columns.Count, Is.EqualTo(1), "Matching Coulumn Count"); + + } + + [Test, Description("Test MySQLX plugin MySQL Datetime JSON")] + public void DateTimeJSON() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + ExecuteSQL("DROP TABLE IF EXISTS test.test"); + ExecuteSQL("CREATE TABLE test.test(Id int NOT NULL PRIMARY KEY, jsoncolumn JSON)"); + ExecuteSQL(@"INSERT INTO test.test VALUES(100000,' { ""name"" : ""bob"",""Date"": ""2015-10-09"",""Time"": ""12:18:29.000000"",""DateTimeOfRegistration"": ""2015-10-09 12:18:29.000000"",""age"":12} ')"); + RowResult r = session.GetSchema("test").GetTable("test").Select("jsoncolumn").Execute(); + var rows = r.FetchAll(); + Assert.That(r.Columns.Count, Is.EqualTo(1), "Matching"); + } + + [Test, Description("Test MySQLX plugin JSON Variant")] + public void JSONVariant() + { + Assume.That(Platform.IsWindows(), "This test is only for Windows OS."); + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE test (Id int NOT NULL PRIMARY KEY, jsoncolumn JSON)"); + ExecuteSQL("INSERT INTO test VALUES (1, '[1]')"); + ExecuteSQL(@"INSERT INTO test VALUES (2, '[""a"", {""b"": [true, false]}, [10, 20]]')"); + ExecuteSQL(@"INSERT INTO test VALUES (3, '{""id"":1,""name"":""test""}')"); + var r = ExecuteSQL(@"SELECT JSON_EXTRACT('{""id"": 1, ""name"": ""test""}','$.name')").FetchOne(); + Assert.That(r[0], Is.EqualTo("\"test\"")); + } + + [Test, Description("Test MySQLX plugin big int as PK")] + public void BigIntasPK() + { + Assume.That(Platform.IsWindows(), "This test is only for Windows OS."); + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + + ExecuteSQL("DROP TABLE IF EXISTS Test"); + ExecuteSQL("CREATE TABLE test (Id bigint NOT NULL PRIMARY KEY, jsoncolumn JSON)"); + var res = ExecuteSQL("INSERT INTO test VALUES (934157136952, '[1]')"); + Assert.That(res.AffectedItemsCount, Is.EqualTo(1)); + res = ExecuteSQL(@"INSERT INTO test VALUES (9223372036854775807, '[""a"", {""b"": [true, false]}, [10, 20]]')"); + Assert.That(res.AffectedItemsCount, Is.EqualTo(1)); + Assert.Throws(() => ExecuteSQL("INSERT INTO test VALUES ('str1', '[1]')")); + } + + [Test, Description("Test MySQLX plugin tiny int as PK")] + public void TinyIntasPK() + { + Assume.That(Platform.IsWindows(), "This test is only for Windows OS."); + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + + using (var ss = MySQLX.GetSession(ConnectionString)) + { + ss.SQL("DROP TABLE IF EXISTS test.test").Execute(); + ss.SQL("CREATE TABLE test.test (Id tinyint NOT NULL PRIMARY KEY, jsoncolumn JSON)").Execute(); + var res = ss.SQL("INSERT INTO test.test VALUES (1, '[1]')").Execute(); + Assert.That(res.AffectedItemsCount, Is.EqualTo(1)); + res = ss.SQL(@"INSERT INTO test.test VALUES (2, '[""a"", {""b"": [true, false]}, [10, 20]]')").Execute(); + Assert.That(res.AffectedItemsCount, Is.EqualTo(1)); + Assert.Throws(() => ss.SQL("INSERT INTO test.test VALUES ('str1', '[1]')").Execute()); + } + } + + [Test, Description("Test MySQLX plugin small int as PK")] + public void SmallIntasPK() + { + Assume.That(Platform.IsWindows(), "This test is only for Windows OS."); + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + + using (var ss = MySQLX.GetSession(ConnectionString)) + { + ss.SQL("DROP TABLE IF EXISTS test.test").Execute(); + ss.SQL("CREATE TABLE test.test (Id smallint NOT NULL PRIMARY KEY, jsoncolumn JSON)").Execute(); + var res = ss.SQL("INSERT INTO test.test VALUES (99, '[1]')").Execute(); + Assert.That(res.AffectedItemsCount, Is.EqualTo(1)); + res = ss.SQL(@"INSERT INTO test.test VALUES (1, '[""a"", {""b"": [true, false]}, [10, 20]]')").Execute(); + Assert.That(res.AffectedItemsCount, Is.EqualTo(1)); + Assert.Throws(() => ss.SQL("INSERT INTO test.test VALUES ('str1', '[1]')").Execute()); + ss.SQL("DROP TABLE IF EXISTS test.test"); + } + } + + [Test, Description("MySQL sample data insertion and viewing")] + public void DataValidation() + { + ExecuteSQL("DROP TABLE IF EXISTS TEST"); + ExecuteSQL("CREATE TABLE TEST(name VARCHAR(20),id INT NOT NULL,sports VARCHAR(20))"); + ExecuteSQL("INSERT INTO TEST(name,id,sports) VALUES ('Federer',1,'Tennis')"); + ExecuteSQL("INSERT INTO TEST(name,id,sports) VALUES ('Ronaldo',2,'Soccer')"); + ExecuteSQL("INSERT INTO TEST(name,id,sports) VALUES ('Messi',3,'Soccer')"); + var expecteddataValue = new List { "Federer", "Ronaldo", "Messi" }; + using (SqlResult result = ExecuteSQLStatement(session.SQL("SELECT name FROM TEST;"))) + { + while (result.Next()) + { + Assert.That(result.Rows, Has.Exactly(3).Items); + Assert.That(expecteddataValue.Contains(result[0].ToString())); + } + } + } + #endregion + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/TableAsyncTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/TableAsyncTests.cs new file mode 100644 index 000000000..cc1b90324 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/TableAsyncTests.cs @@ -0,0 +1,165 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Common; +using MySqlX.XDevAPI.Relational; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace MySqlX.Data.Tests.RelationalTests +{ + public class TableAsyncTests : BaseTest + { + [TearDown] + public void TearDown() => ExecuteSQL("DROP TABLE IF EXISTS test"); + + [SetUp] + public void SetUp() => ExecuteSQL("CREATE TABLE test.test(id INT, age INT)"); + + [Test] + public void MultipleTableInsertAsync() + { + Table table = testSchema.GetTable("test"); + List> tasksList = new List>(); + + for (int i = 1; i <= 200; i++) + { + tasksList.Add(table.Insert().Values(i, i % 250).ExecuteAsync()); + } + + Assert.That(Task.WaitAll(tasksList.ToArray(), TimeSpan.FromMinutes(2)), "WaitAll timeout"); + Assert.That(table.Count(), Is.EqualTo(200)); + } + + [Test] + public void MultipleTableSelectAsync() + { + var table = testSchema.GetTable("test"); + int rows = 100; + var insert = table.Insert(); + HashSet validator = new HashSet(); + + for (int i = 1; i <= rows; i++) + { + insert.Values(i, i); + } + var result = ExecuteInsertStatement(insert); + + List> tasksList = new List>(); + + for (int i = 1; i <= rows; i++) + { + tasksList.Add(table.Select().Where("age = :age").Bind("aGe", i).ExecuteAsync()); + } + + Assert.That(Task.WaitAll(tasksList.ToArray(), TimeSpan.FromMinutes(2)), "WaitAll timeout"); + foreach (Task task in tasksList) + { + Assert.That(task.Result.Columns.Count, Is.EqualTo(2)); + Assert.That(task.Result.Rows, Has.One.Items); + int value = (int)task.Result.Rows[0][1]; + Assert.That(validator.Contains(value), Is.False, value + " value exists"); + validator.Add(value); + } + Assert.That(validator.Count, Is.EqualTo(rows)); + } + #region WL14389 + [Test, Description("Table.Select() with shared lock and Table.Update() ")] + public async Task TableSelectAndUpdateAsync() + { + _ = await SubProcess1(); + _ = await SubProcess2(); + } + + private Task SubProcess1() + { + if (!session.Version.isAtLeast(8, 0, 3)) return Task.FromResult(0); + session.SQL("SET autocommit = 0").Execute(); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + session2.SQL("SET autocommit = 0").Execute(); + var table = session.Schema.GetTable("test"); + try + { + session.SQL("CREATE UNIQUE INDEX myIndex ON test.test (id)").Execute(); + } + catch (MySqlException ex) + { + Assert.That(ex.Message.Contains("Duplicate")); + } + + var table2 = session2.GetSchema("test").GetTable("test"); + session2.SQL("START TRANSACTION").Execute(); + for (var i = 0; i < 1000; i++) + { + var result = table2.Update().Where("id = 1").Set("age", 2).Execute(); + Assert.That(result, Is.Not.Null); + } + } + + session.SQL("SET autocommit = 1").Execute(); + return Task.FromResult(0); + } + + + private Task SubProcess2() + { + Thread.Sleep(1000); + if (!session.InternalSession.GetServerVersion().isAtLeast(8, 0, 3)) return Task.FromResult(0); + session.SQL("SET autocommit = 0").Execute(); + + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + session2.SQL("SET autocommit = 0").Execute(); + var table = session.Schema.GetTable("test"); + try + { + session.SQL("CREATE UNIQUE INDEX myIndex ON test.test (id)").Execute(); + } + catch (MySqlException ex) + { + Assert.That(ex.Message.Contains("Duplicate")); + } + + var table2 = session2.GetSchema("test").GetTable("test"); + session.SQL("START TRANSACTION").Execute(); + var rowResult = table.Select().Where("id = 1").LockExclusive().Execute(); + } + + session.SQL("SET autocommit = 0").Execute(); + return Task.FromResult(0); + } + #endregion WL14389 + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/TableDeleteTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/TableDeleteTests.cs new file mode 100644 index 000000000..01f4660ce --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/TableDeleteTests.cs @@ -0,0 +1,117 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI.Common; +using MySqlX.XDevAPI.Relational; +using NUnit.Framework; +using NUnit.Framework.Legacy; + +namespace MySqlX.Data.Tests.RelationalTests +{ + public class TableDeleteTests : BaseTest + { + [TearDown] + public void TearDown() => ExecuteSQL("DROP TABLE IF EXISTS test"); + + [SetUp] + public void SetUp() + { + ExecuteSQL("CREATE TABLE test.test(id INT, age INT)"); + + var insertStatement = testSchema.GetTable("test").Insert(); + int rowsToInsert = 10; + for (int i = 1; i <= rowsToInsert; i++) + { + insertStatement.Values(i, i); + } + ExecuteInsertStatement(insertStatement); + Assert.That(CountRows(), Is.EqualTo(rowsToInsert)); + } + + private long CountRows() + { + return testSchema.GetTable("test").Count(); + } + + private void ExecuteDelete(TableDeleteStatement statement, int expectedRowsCount) + { + Result result = ExecuteDeleteStatement(statement); + Assert.That(CountRows(), Is.EqualTo(expectedRowsCount)); + } + + [Test] + public void DeleteAllTest() + { + ExecuteDelete(testSchema.GetTable("test").Delete(), 0); + } + + [Test] + public void DeleteConditionTest() + { + ExecuteDelete(testSchema.GetTable("test").Delete().Where("age % 2 = 0"), 5); + } + + [Test] + public void DeleteOrderbyAndLimit() + { + ExecuteDelete(testSchema.GetTable("test").Delete().OrderBy("age Desc").Limit(3), 7); + } + + [Test] + public void DeleteConditionOrderbyAndLimit() + { + ExecuteDelete(testSchema.GetTable("test").Delete().Where("id > 5").OrderBy("id Desc").Limit(2), 8); + } + + [Test] + public void DeleteBindTest() + { + var deleteStmt = testSchema.GetTable("test").Delete().Where("age = :aGe"); + ExecuteDelete(deleteStmt.Bind("Age", 4), 9); + ExecuteDelete(deleteStmt.Bind("age", 6), 8); + } + + [Test] + public void DeleteWithInOperator() + { + Table table = testSchema.GetTable("test"); + Assert.That(CountRows(), Is.EqualTo(10)); + + Assert.That(ExecuteDeleteStatement(table.Delete().Where("id IN (1,2)")).AffectedItemsCount, Is.EqualTo(2)); + Assert.That(CountRows(), Is.EqualTo(8)); + + Assert.Throws(() => ExecuteDeleteStatement(table.Delete().Where("a IN [3]"))); + Assert.Throws(() => ExecuteDeleteStatement(table.Delete().Where("3 IN a"))); + Assert.Throws(() => ExecuteDeleteStatement(table.Delete().Where("age IN [3]"))); + + Assert.That(ExecuteDeleteStatement(table.Delete().Where("age IN (3)")).AffectedItemsCount, Is.EqualTo(1)); + Assert.That(CountRows(), Is.EqualTo(7)); + } + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/TableInsertTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/TableInsertTests.cs new file mode 100644 index 000000000..1f9f379ea --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/TableInsertTests.cs @@ -0,0 +1,126 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI.Relational; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System.Linq; + +namespace MySqlX.Data.Tests.RelationalTests +{ + public class TableInsertTests : BaseTest + { + [TearDown] + public void TearDown() => ExecuteSQL("DROP TABLE IF EXISTS test"); + public TableInsertTests() + { + } + + [Test] + public void InsertMultipleValues() + { + ExecuteSQL("CREATE TABLE test.test(name VARCHAR(40), age INT)"); + Table table = testSchema.GetTable("test"); + + var result = ExecuteInsertStatement(table.Insert("name", "age") + .Values("Henry", "22") + .Values("Patric", 30) + ); + Assert.That(result.AffectedItemsCount, Is.EqualTo(2)); + + var selectResult = ExecuteSelectStatement(table.Select()); + while (selectResult.Next()) ; + Assert.That(selectResult.Rows.Count, Is.EqualTo(2)); + Assert.That(selectResult.Rows.ToArray()[0][0], Is.EqualTo("Henry")); + Assert.That(selectResult.Rows.ToArray()[0][1], Is.EqualTo(22)); + Assert.That(selectResult.Rows.ToArray()[1][0], Is.EqualTo("Patric")); + Assert.That(selectResult.Rows.ToArray()[1][1], Is.EqualTo(30)); + + Assert.That(table.Count(), Is.EqualTo(2)); + } + + [Test] + public void InsertExpressions() + { + ExecuteSQL("CREATE TABLE test.test(name VARCHAR(40), age INT)"); + Table table = testSchema.GetTable("test"); + + var result = ExecuteInsertStatement(table.Insert("name", "age").Values("MARK", "34")); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + + var selectResult = ExecuteSelectStatement(table.Select()); + while (selectResult.Next()) ; + Assert.That(selectResult.Rows, Has.One.Items); + Assert.That(selectResult.Rows.ToArray()[0][0], Is.EqualTo("MARK")); + Assert.That(selectResult.Rows.ToArray()[0][1], Is.EqualTo(34)); + } + + [Test] + public void ReuseStatement() + { + ExecuteSQL("CREATE TABLE test(name VARCHAR(40), age INT)"); + Table table = testSchema.GetTable("test"); + + var stmt = table.Insert("name", "age"); + var result = ExecuteInsertStatement(stmt.Values("MARK", "34")); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + // error 5014 - Wrong number of fields in row being inserted + Assert.That(Assert.Throws(() => result = ExecuteInsertStatement(stmt.Values("George", 34, 1))).Code, Is.EqualTo(5014u)); + Assert.That(Assert.Throws(() => ExecuteInsertStatement(stmt.Values("George", 34))).Code, Is.EqualTo(5014u)); + Assert.That(ExecuteSelectStatement(table.Select()).FetchAll(), Has.One.Items); + } + + /// + /// Bug#31692694 - TABLEINSERTSTATEMENT STRING SPECIAL CARAC VALUES OBJECT ARE UNCORRECTLY MANAGED + /// + [TestCase("-")] + [TestCase("+")] + [TestCase("*")] + [TestCase("/")] + [TestCase("\\")] + [TestCase("=")] + [TestCase("(")] + [TestCase(")")] + public void InsertWithExpressionsAlikeValues(string specialChar) + { + ExecuteSQL("CREATE TABLE test(ID INT, COLUMN_TEST VARCHAR(40))"); + string value = $"ImproperFieldNameBug {specialChar} Bug"; + + Table table = testSchema.GetTable("test"); + var insertResult = table.Insert("ID", "COLUMN_TEST").Values("1", value).Execute(); + var selectResult = ExecuteSelectStatement(table.Select()); + while (selectResult.Next()) ; + + Assert.That(insertResult.AffectedItemsCount, Is.EqualTo(1)); + Assert.That(selectResult.Rows, Has.One.Items); + Assert.That(selectResult.Rows.ToArray()[0][0].ToString(), Is.EqualTo("1").IgnoreCase); + Assert.That(selectResult.Rows.ToArray()[0][1].ToString(), Is.EqualTo(value).IgnoreCase); + } + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/TableSelectTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/TableSelectTests.cs new file mode 100644 index 000000000..970cf6090 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/TableSelectTests.cs @@ -0,0 +1,1755 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Common; +using MySqlX.XDevAPI.Relational; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Linq; +using System.Text; + +namespace MySqlX.Data.Tests.RelationalTests +{ + public class TableSelectTests : BaseTest + { + object[][] allRows = { + new object[] { 1, "jonh doe", 38, "{\"company\": \"xyz\", \"hobbies\": \"reading\", \"vehicle\": \"bike\"}" }, + new object[] { 2, "milton green", 45, "{\"company\": \"abc\", \"hobbies\": [\"boxing\", \"running\"], \"vehicle\": \"car\"}" }, + new object[] { 3, "larry smith", 24, "{\"company\": \"zxc\", \"hobbies\": \"painting\", \"vehicle\": \"boat\"}" } + }; + + [SetUp] + public void SetUp() + { + ExecuteSQL("CREATE TABLE test.test (id INT, name VARCHAR(45), age INT, additionalinfo JSON)"); + TableInsertStatement stmt = testSchema.GetTable("test").Insert(); + stmt.Values(allRows[0]); + stmt.Values(allRows[1]); + stmt.Values(allRows[2]); + Result result = ExecuteInsertStatement(stmt); + } + + [TearDown] + public void TearDown() + { + ExecuteSQL("DROP TABLE IF EXISTS test"); + ExecuteSQL("DROP TABLE IF EXISTS testDate"); + } + + [Test] + public void FetchOne() + { + Table t = testSchema.GetTable("test"); + Assert.That(ExecuteSelectStatement(t.Select("age")).FetchOne()["age"], Is.EqualTo(38)); + } + + private void MultiTableSelectTest(TableSelectStatement statement, object[][] expectedValues) + { + RowResult result = ExecuteSelectStatement(statement); + int rowCount = result.FetchAll().Count; + + Assert.That(rowCount, Is.EqualTo(expectedValues.Length)); + Assert.That(result.Rows.Count, Is.EqualTo(expectedValues.Length)); + for (int i = 0; i < expectedValues.Length; i++) + { + for (int j = 0; j < expectedValues[i].Length; j++) + { + Assert.That(result.Rows.ToArray()[i][j], Is.EqualTo(expectedValues[i][j])); + } + } + } + + [Test] + public void TableSelect() + { + var table = testSchema.GetTable("test"); + + MultiTableSelectTest(table.Select(), allRows); + MultiTableSelectTest(table.Select("name", "age"), + allRows.Select(c => new[] { c[1], c[2] }).ToArray()); + MultiTableSelectTest(table.Select("name", "age").Where("age == 38"), + allRows.Select(c => new[] { c[1], c[2] }).Where(c => (int)c[1] == 38).ToArray()); + MultiTableSelectTest(table.Select().Where("age == 45"), + allRows.Where(c => (int)c[2] == 45).ToArray()); + MultiTableSelectTest(table.Select().OrderBy("age"), + allRows.OrderBy(c => c[2]).ToArray()); + MultiTableSelectTest(table.Select().OrderBy("age desc"), + allRows.OrderByDescending(c => c[2]).ToArray()); + MultiTableSelectTest(table.Select().OrderBy("age desc, name"), + allRows.OrderByDescending(c => c[2]).ThenBy(c => c[1]).ToArray()); + MultiTableSelectTest(table.Select().Limit(1), + allRows.Take(1).ToArray()); + MultiTableSelectTest(table.Select().Limit(10).Offset(1), + allRows.Skip(1).Take(10).ToArray()); + MultiTableSelectTest(table.Select().Limit(1).Offset(1), + allRows.Skip(1).Take(1).ToArray()); + MultiTableSelectTest(table.Select().Where("name like :name").Bind("nAme", "%jon%"), + allRows.Where(c => c[1].ToString().Contains("jon")).ToArray()); + MultiTableSelectTest(table.Select().Where("name like :name").Bind("naMe", "%on%"), + allRows.Where(c => c[1].ToString().Contains("on")).ToArray()); + } + + [Test] + public void AllColumns() + { + var table = testSchema.GetTable("test"); + var select = ExecuteSelectStatement(table.Select("*, 42 as a_number, '43' as a_string")); + var rows = select.FetchAll(); + Assert.That(select.Columns.Count, Is.EqualTo(6)); + Assert.That(rows.Count, Is.EqualTo(allRows.Length)); + Assert.That(rows[0]["id"], Is.EqualTo(allRows[0][0])); + Assert.That(rows[0]["name"], Is.EqualTo(allRows[0][1])); + Assert.That(rows[0]["age"], Is.EqualTo(allRows[0][2])); + Assert.That(rows[0]["additionalinfo"], Is.EqualTo(allRows[0][3])); + Assert.That(rows[0]["a_number"], Is.EqualTo((sbyte)42)); + Assert.That(rows[0]["a_string"], Is.EqualTo("43")); + } + + [Test] + public void CountAllColumns() + { + var table = testSchema.GetTable("test"); + var select = ExecuteSelectStatement(table.Select("count(*) + 10")); + var rows = select.FetchAll(); + Assert.That(select.Columns, Has.One.Items); + Assert.That(rows, Has.One.Items); + Assert.That((long)rows[0][0], Is.EqualTo(allRows.Length + 10)); + } + + [Test] + public void MultipleBind() + { + object[] validationRow = allRows[1]; + var table = testSchema.GetTable("test"); + var select = ExecuteSelectStatement(table.Select().Where("Name = :nAme && Age = :aGe").Bind("agE", validationRow[2]).Bind("naMe", validationRow[1])); + var rows = select.FetchAll(); + Assert.That(rows, Has.One.Items); + Assert.That(rows[0]["namE"], Is.EqualTo(validationRow[1])); + Assert.That(rows[0]["AGe"], Is.EqualTo(validationRow[2])); + } + + [Test] + public void DatetimeAndMicroseconds() + { + ExecuteSQL("CREATE TABLE test.testDate (id INT, name VARCHAR(45), birthday DATETIME(6))"); + ExecuteSQL("INSERT INTO test.testDate VALUES(1, 'JOHN', '1985-10-21 16:34:22.123456')"); + ExecuteSQL("INSERT INTO test.testDate VALUES(1, 'BILL', '1985-10-21 10:00:45.987')"); + var rows = ExecuteSelectStatement(GetSession().GetSchema("test").GetTable("testDate").Select()).FetchAll(); + Assert.That(rows.Count, Is.EqualTo(2)); + Assert.That((DateTime)rows[0]["birthday"], Is.EqualTo(new DateTime(1985, 10, 21, 16, 34, 22).AddTicks(1234560))); + Assert.That((DateTime)rows[1]["birthday"], Is.EqualTo(new DateTime(1985, 10, 21, 10, 0, 45).AddTicks(9870000))); + } + + [Test] + public void DatetimeAndMilliseconds() + { + ExecuteSQL("CREATE TABLE test.testDate2 (id INT, name VARCHAR(45), birthday DATETIME(3))"); + ExecuteSQL("INSERT INTO test.testDate2 VALUES(1, 'JOHN', '1985-10-21 16:34:22.123456')"); + ExecuteSQL("INSERT INTO test.testDate2 VALUES(1, 'BILL', '1985-10-21 10:00:45.098')"); + var rows = ExecuteSelectStatement(GetSession().GetSchema("test").GetTable("testDate2").Select()).FetchAll(); + Assert.That(rows.Count, Is.EqualTo(2)); + Assert.That((DateTime)rows[0]["birthday"], Is.EqualTo(new DateTime(1985, 10, 21, 16, 34, 22).AddTicks(1230000))); + Assert.That((DateTime)rows[1]["birthday"], Is.EqualTo(new DateTime(1985, 10, 21, 10, 0, 45).AddTicks(980000))); + } + + [Test] + public void RowLockingNotSupportedInOlderVersions() + { + if (session.InternalSession.GetServerVersion().isAtLeast(8, 0, 3)) return; + + Table table = session.Schema.GetTable("test"); + + Exception ex = Assert.Throws(() => ExecuteSelectStatement(table.Select().LockShared())); + Assert.That(ex.Message, Is.EqualTo("This functionality is only supported from server version 8.0.3 onwards")); + + ex = Assert.Throws(() => ExecuteSelectStatement(table.Select().LockExclusive())); + Assert.That(ex.Message, Is.EqualTo("This functionality is only supported from server version 8.0.3 onwards")); + } + + [Test] + public void SimpleSharedLock() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + ExecuteSQLStatement(session.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + ExecuteSQLStatement(session2.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + Table table = session.Schema.GetTable("test"); + Table table2 = session2.GetSchema("test").GetTable("test"); + + ExecuteSQLStatement(session.SQL("START TRANSACTION")); + RowResult rowResult = ExecuteSelectStatement(table.Select().Where("id = 1").LockShared()); + Assert.That(rowResult.FetchAll(), Has.One.Items); + + ExecuteSQLStatement(session2.SQL("START TRANSACTION")); + // Should return immediately since row isn't locked. + rowResult = ExecuteSelectStatement(table2.Select().Where("id = 2").LockShared()); + Assert.That(rowResult.FetchAll(), Has.One.Items); + // Should return immediately due to LockShared() allows reading by other sessions. + rowResult = ExecuteSelectStatement(table2.Select().Where("id = 1").LockShared()); + Assert.That(rowResult.FetchAll(), Has.One.Items); + + ExecuteSQLStatement(session.SQL("ROLLBACK")); + ExecuteSQLStatement(session2.SQL("ROLLBACK")); + } + } + + [Test] + public void SimpleExclusiveLock() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + ExecuteSQLStatement(session.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + ExecuteSQLStatement(session2.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + Table table = session.Schema.GetTable("test"); + ExecuteSQLStatement(session.SQL("CREATE UNIQUE INDEX myIndex ON test.test (id)")); + Table table2 = session2.GetSchema("test").GetTable("test"); + + ExecuteSQLStatement(session.SQL("START TRANSACTION")); + RowResult rowResult = ExecuteSelectStatement(table.Select().Where("id = 1").LockExclusive()); + Assert.That(rowResult.FetchAll(), Has.One.Items); + + ExecuteSQLStatement(session2.SQL("START TRANSACTION")); + // Should return immediately since row isn't locked. + rowResult = ExecuteSelectStatement(table2.Select().Where("id = 2").LockExclusive()); + Assert.That(rowResult.FetchAll(), Has.One.Items); + // Session2 blocks due to to LockExclusive() not allowing to read locked rows. + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + Exception ex = Assert.Throws(() => ExecuteSelectStatement(table2.Select().Where("id = 1").LockExclusive())); + Assert.That(ex.Message, Is.EqualTo("Lock wait timeout exceeded; try restarting transaction")); + + ExecuteSQLStatement(session.SQL("ROLLBACK")); + ExecuteSQLStatement(session2.SQL("ROLLBACK")); + } + } + + [Test] + public void SharedLockForbidsToModifyDocuments() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + ExecuteSQLStatement(session.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + ExecuteSQLStatement(session2.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + Table table = session.Schema.GetTable("test"); + Table table2 = session2.GetSchema("test").GetTable("test"); + + ExecuteSQLStatement(session.SQL("START TRANSACTION")); + RowResult rowResult = ExecuteSelectStatement(table.Select().Where("id = 1").LockShared()); + Assert.That(rowResult.FetchAll(), Has.One.Items); + + ExecuteSQLStatement(session2.SQL("START TRANSACTION")); + // Reading the same row is allowed with LockShared(). + rowResult = ExecuteSelectStatement(table2.Select().Where("id = 1")); + Assert.That(rowResult.FetchAll(), Has.One.Items); + + // Modify() is allowed for non-locked rows. + Result result = ExecuteUpdateStatement(table2.Update().Where("id = 2").Set("age", 2)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + // Session1 blocks, Modify() is not allowed for locked rows. + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + Exception ex = Assert.Throws(() => ExecuteUpdateStatement(table2.Update().Where("id = 1").Set("age", 2))); + Assert.That(ex.Message, Is.EqualTo("Lock wait timeout exceeded; try restarting transaction")); + + ExecuteSQLStatement(session.SQL("ROLLBACK")); + // Modify() is allowed since row isn't locked anymore. + ExecuteUpdateStatement(table2.Update().Where("id = 1").Set("age", 2)); + ExecuteSQLStatement(session2.SQL("COMMIT")); + } + } + + [Test] + public void ExclusiveLockForbidsToModifyDocuments() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + ExecuteSQLStatement(session.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + ExecuteSQLStatement(session2.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + Table table = session.Schema.GetTable("test"); + Table table2 = session2.GetSchema("test").GetTable("test"); + + ExecuteSQLStatement(session.SQL("START TRANSACTION")); + RowResult rowResult = ExecuteSelectStatement(table.Select().Where("id = 1").LockExclusive()); + Assert.That(rowResult.FetchAll(), Has.One.Items); + + ExecuteSQLStatement(session2.SQL("START TRANSACTION")); + + // Modify() is allowed for non-locked rows. + Result result = ExecuteUpdateStatement(table2.Update().Where("id = 2").Set("age", 2)); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + // Session1 blocks, Modify() is not allowed for locked rows. + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + Exception ex = Assert.Throws(() => ExecuteUpdateStatement(table2.Update().Where("id = 1").Set("age", 2))); + Assert.That(ex.Message, Is.EqualTo("Lock wait timeout exceeded; try restarting transaction")); + + ExecuteSQLStatement(session.SQL("ROLLBACK")); + // Modify() is allowed since row isn't locked anymore. + ExecuteUpdateStatement(table2.Update().Where("id = 1").Set("age", 2)); + ExecuteSQLStatement(session2.SQL("COMMIT")); + } + } + + [Test] + public void SharedLockAfterExclusiveLock() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + ExecuteSQLStatement(session.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + ExecuteSQLStatement(session2.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + Table table = session.Schema.GetTable("test"); + ExecuteSQLStatement(session.SQL("CREATE UNIQUE INDEX myIndex ON test.test (id)")); + Table table2 = session2.GetSchema("test").GetTable("test"); + + ExecuteSQLStatement(session.SQL("START TRANSACTION")); + RowResult rowResult = ExecuteSelectStatement(table.Select().Where("id = 1").LockExclusive()); + Assert.That(rowResult.FetchAll(), Has.One.Items); + + ExecuteSQLStatement(session2.SQL("START TRANSACTION")); + // Should return immediately since row isn't locked. + rowResult = ExecuteSelectStatement(table2.Select().Where("id = 2").LockShared()); + Assert.That(rowResult.FetchAll(), Has.One.Items); + // Session2 blocks due to LockExclusive() not allowing to read locked rows. + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + Exception ex = Assert.Throws(() => ExecuteSelectStatement(table2.Select().Where("id = 1").LockShared())); + Assert.That(ex.Message, Is.EqualTo("Lock wait timeout exceeded; try restarting transaction")); + + // Session unlocks rows. + ExecuteSQLStatement(session.SQL("ROLLBACK")); + // Row can now be recovered. + rowResult = ExecuteSelectStatement(table2.Select().Where("id = 1").LockShared()); + Assert.That(rowResult.FetchAll(), Has.One.Items); + ExecuteSQLStatement(session2.SQL("ROLLBACK")); + } + } + + [Test] + public void ExclusiveLockAfterSharedLock() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + ExecuteSQLStatement(session.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + ExecuteSQLStatement(session2.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + Table table = session.Schema.GetTable("test"); + ExecuteSQLStatement(session.SQL("CREATE UNIQUE INDEX myIndex ON test.test (id)")); + Table table2 = session2.GetSchema("test").GetTable("test"); + + ExecuteSQLStatement(session.SQL("START TRANSACTION")); + RowResult rowResult = ExecuteSelectStatement(table.Select().Where("id in (1, 3)").LockShared()); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(2)); + + ExecuteSQLStatement(session2.SQL("START TRANSACTION")); + // Should return immediately since row isn't locked. + rowResult = ExecuteSelectStatement(table2.Select().Where("id = 2").LockExclusive()); + // Should return immediately due to LockShared() allows reading by other sessions. + rowResult = ExecuteSelectStatement(table2.Select().Where("id = 2").LockShared()); + Assert.That(rowResult.FetchAll(), Has.One.Items); + // Session2 blocks due to to LockExclusive() not allowing to read locked rows. + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + Exception ex = Assert.Throws(() => ExecuteSelectStatement(table2.Select().Where("id = 1").LockExclusive())); + Assert.That(ex.Message, Is.EqualTo("Lock wait timeout exceeded; try restarting transaction")); + + // Session unlocks rows. + ExecuteSQLStatement(session.SQL("ROLLBACK")); + rowResult = ExecuteSelectStatement(table2.Select().Where("id = 1").LockExclusive()); + Assert.That(rowResult.FetchAll(), Has.One.Items); + ExecuteSQLStatement(session2.SQL("ROLLBACK")); + } + } + + [Test] + public void SelectWithInOperator() + { + Table table = testSchema.GetTable("test"); + Assert.That(ExecuteSelectStatement(table.Select()).FetchAll().Count, Is.EqualTo(3)); + + Assert.That(ExecuteSelectStatement(table.Select().Where("name IN (\"jonh doe\", \"milton green\")")).FetchAll().Count, Is.EqualTo(2)); + Assert.That(ExecuteSelectStatement(table.Select().Where("name NOT IN (\"jonh doe\", \"milton green\")")).FetchAll(), Has.One.Items); + Assert.That(ExecuteSelectStatement(table.Select().Where("name IN (\"\", \"\")")).FetchAll(), Is.Empty); + Assert.That(ExecuteSelectStatement(table.Select().Where("\"\" IN (1,2,3)")).FetchAll(), Is.Empty); + Assert.That(ExecuteSelectStatement(table.Select().Where("name IN ('', '')")).FetchAll(), Is.Empty); + Assert.That(ExecuteSelectStatement(table.Select().Where("'' IN (1,2,3)")).FetchAll(), Is.Empty); + Assert.That(ExecuteSelectStatement(table.Select().Where("'' IN ('')")).FetchAll().Count, Is.EqualTo(3)); + + Assert.Throws(() => ExecuteSelectStatement(table.Select().Where("name NOT IN [\"jonh doe\", \"milton green\"]")).FetchAll()); + Assert.Throws(() => ExecuteSelectStatement(table.Select().Where("a IN [3]")).FetchAll()); + Assert.Throws(() => ExecuteSelectStatement(table.Select().Where("3 IN a")).FetchAll()); + } + + [Test] + public void Grouping() + { + ExecuteSQLStatement(GetSession().SQL("set sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';")); + Table table = testSchema.GetTable("test"); + + // Insert additonal users. + object[][] additionalUsers = { + new object[] { 4, "mary weinstein", 24, null }, + new object[] { 5, "jerry pratt", 45, null }, + new object[] { 6, "hugh jackman", 20, null }, + new object[] { 7, "elizabeth olsen", 31, null } + }; + var statement = table.Insert(); + foreach (object[] user in additionalUsers) + { + statement = statement.Values(user); + } + + Assert.That(ExecuteInsertStatement(statement).AffectedItemsCount, Is.EqualTo(4)); + + // GroupBy returns 5 rows since age 45 and 24 is repeated. + var result = ExecuteSelectStatement(table.Select().GroupBy("age")); + Assert.That(result.FetchAll().Count, Is.EqualTo(5)); + + // GroupBy with null. + result = ExecuteSelectStatement(table.Select("id as ID", "name as Name", "age as Age").GroupBy(null)); + Assert.That(result.FetchAll().Count, Is.EqualTo(7)); + result = ExecuteSelectStatement(table.Select("id as ID", "name as Name", "age as Age").GroupBy(null, null)); + Assert.That(result.FetchAll().Count, Is.EqualTo(7)); + result = ExecuteSelectStatement(table.Select("id as ID", "name as Name", "age as Age").GroupBy(null, "age")); + Assert.That(result.FetchAll().Count, Is.EqualTo(5)); + + // Having operation. + // Having reduces the original 5 rows to 3 since 2 rows have a cnt=2, due to the repeated names. + result = ExecuteSelectStatement(table.Select("id", "count(name) as cnt", "age").GroupBy("age").Having("cnt = 1")); + Assert.That(result.FetchAll().Count, Is.EqualTo(3)); + + // Having with null. + result = ExecuteSelectStatement(table.Select("id as ID", "count(name) as cnt", "age as Age").GroupBy("age").Having(null)); + Assert.That(result.FetchAll().Count, Is.EqualTo(5)); + + // GroupBy with invalid field name. + var ex = Assert.Throws(() => ExecuteSelectStatement(table.Select("id as ID", "name as Name", "age as Age").GroupBy("none"))); + Assert.That(ex.Message, Is.EqualTo("Unknown column 'none' in 'group statement'")); + + // GroupBy with empty strings. + var ex2 = Assert.Throws(() => ExecuteSelectStatement(table.Select("id as ID", "name as Name", "age as Age").GroupBy(""))); + Assert.That(ex2.Message, Is.EqualTo("No more tokens when expecting one at token pos 0")); + ex2 = Assert.Throws(() => ExecuteSelectStatement(table.Select("id as ID", "name as Name", "age as Age").GroupBy(" "))); + Assert.That(ex2.Message, Is.EqualTo("No more tokens when expecting one at token pos 0")); + ex2 = Assert.Throws(() => ExecuteSelectStatement(table.Select("id as ID", "name as Name", "age as Age").GroupBy(string.Empty))); + Assert.That(ex2.Message, Is.EqualTo("No more tokens when expecting one at token pos 0")); + + // Having with invalid field name. + ex = Assert.Throws(() => ExecuteSelectStatement(table.Select("id as ID", "count(name) as cnt", "age as Age").GroupBy("age").Having("none = 1"))); + Assert.That(ex.Message, Is.EqualTo("Unknown column 'none' in 'having clause'")); + + // Having with empty strings. + ex2 = Assert.Throws(() => ExecuteSelectStatement(table.Select("id as ID", "count(name) as cnt", "age as Age").GroupBy("age").Having(""))); + Assert.That(ex2.Message, Is.EqualTo("Unable to parse query ''")); + Assert.That(ex2.InnerException.Message, Is.EqualTo("No more tokens when expecting one at token pos 0")); + ex2 = Assert.Throws(() => ExecuteSelectStatement(table.Select("id as ID", "count(name) as cnt", "age as Age").GroupBy("age").Having(" "))); + Assert.That(ex2.Message, Is.EqualTo("Unable to parse query ' '")); + Assert.That(ex2.InnerException.Message, Is.EqualTo("No more tokens when expecting one at token pos 0")); + ex2 = Assert.Throws(() => ExecuteSelectStatement(table.Select("id as ID", "count(name) as cnt", "age as Age").GroupBy("age").Having(string.Empty))); + Assert.That(ex2.Message, Is.EqualTo("Unable to parse query ''")); + Assert.That(ex2.InnerException.Message, Is.EqualTo("No more tokens when expecting one at token pos 0")); + } + + /// + /// Bug-29838254 + /// RESULTSET ERROR WHEN SELECT IS ISSUED WITH IN OPERATOR WITH BLANKS WITH 8.0.17 SERVER-C/NET8.0.17TRUNK + /// + [Test] + public void SelectWithInBlanksAndBrackets() + { + Session session = GetSession(); + Schema schema = session.GetSchema("test"); + object[][] allRows = + { + new object[] {1, "john doe", 38}, + new object[] {2, "milton green", 45}, + new object[] {3, "milton blue", 46}, + new object[] {4, "milton red", 47}, + new object[] {5, "milton yellow", 48}, + new object[] {6, "milton check", 49}, + new object[] {7, "milton pink", 14}, + new object[] {8, "milton beize", 25}, + new object[] {9, "milton silver", 35}, + new object[] {10, "milton city", 65} + }; + session.SQL("USE test").Execute(); + session.SQL("DROP table if exists test").Execute(); + var r = session.SQL("CREATE TABLE test.test(id INT,name VARCHAR(45), age INT)").Execute(); + var rows = r.HasData ? r.FetchAll() : null; + testSchema = session.GetSchema("test"); + var insertStatement = testSchema.GetTable("test").Insert(); + var rowsToInsert = 10; + for (var i = 0; i < rowsToInsert; i++) + insertStatement.Values(allRows[i]); + insertStatement.Execute(); + var table = testSchema.GetTable("test"); + int count = 0; + + //Exception expected when square brackets are used instead of parenthesis + Assert.Throws(() => table.Select().Where("name IN ['', ' ']").Execute().FetchAll()); + + // Test using parenthesis should return result + count = table.Select().Where("name IN (\"john doe\", \"milton green\")").Execute().FetchAll().Count; + Assert.That(count > 0); + + // Using parenthesis should return empty resultset for empty parameters + count = table.Select().Where("name IN ('', ' ')").Execute().FetchAll().Count; + Assert.That(count == 0); + } + + [TestCase(":hobbies IN additionalinfo->$.hobbies", "hobbies", "painting", 3)] + [TestCase(":hobbies IN additionalinfo->$.hobbies", "hobbies", "[\"boxing\", \"running\"]", 0)] + [TestCase("[\"boxing\", \"running\"] IN additionalinfo->$.hobbies", null, null, 2)] + [TestCase(":hobbies IN additionalinfo$.hobbies", "hobbies", "painting", 3)] + public void InOperatorBindingJson(string condition, string bind, string value, int id) + { + Table table = testSchema.GetTable("test"); + Assert.That(ExecuteSelectStatement(table.Select()).FetchAll().Count, Is.EqualTo(3)); + + var stmt = table.Select().Where(condition); + if (bind != null) stmt.Bind(bind, value); + var result = ExecuteSelectStatement(stmt).FetchAll(); + Assert.That(result.Count, Is.EqualTo(id == 0 ? 0 : 1)); + if (id > 0) + { + Assert.That(result[0]["id"], Is.EqualTo(id)); + } + } + + #region WL14389 + + [Test, Description("Reading locked document(lock_shared) in a table using lock_exclusive with DEFAULT waiting option.")] + public void ExclusiveLockAfterSharedLockDefaultWaiting() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + + session.SQL("DROP TABLE IF EXISTS test.test").Execute(); + session.SQL("CREATE TABLE test.test (id INT, a INT)").Execute(); + var table1 = testSchema.GetTable("test"); + table1.Insert("id", "a").Values(1, 1).Values(2, 2).Values(3, 3).Execute(); + ExecuteSQLStatement(session.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + ExecuteSQLStatement(session2.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + var table = session.Schema.GetTable("test"); + session.SQL("CREATE UNIQUE INDEX myIndex ON test.test (id)").Execute(); + var table2 = session2.GetSchema("test").GetTable("test"); + + ExecuteSQLStatement(session.SQL("START TRANSACTION")); + var rowResult = ExecuteSelectStatement(table.Select().Where("id = 1").LockShared()); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + ExecuteSQLStatement(session2.SQL("START TRANSACTION")); + + // Should return immediately since document isn't locked. + rowResult = table2.Select().Where("id = 2").LockExclusive(LockContention.Default).Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + // Session2 blocks as LockExclusive trying to access locked document + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + Exception ex = Assert.Throws(() => ExecuteSelectStatement(table2.Select().Where("id = 1").LockExclusive(LockContention.Default))); + Assert.That(ex.Message, Is.EqualTo("Lock wait timeout exceeded; try restarting transaction")); + + // Session2 blocks due to to LockShared() not allowing to modify locked documents. + Result result1; + ex = Assert.Throws(() => result1 = table2.Update().Where("id = 1").Set("a", 2).Execute()); + Assert.That(ex.Message, Is.EqualTo("Lock wait timeout exceeded; try restarting transaction")); + + // Session2 returns immediately as session is committed. + session.Commit(); + var result = table2.Update().Where("id = 1").Set("a", 2).Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + + ExecuteSQLStatement(session.SQL("ROLLBACK")); + ExecuteSQLStatement(session2.SQL("ROLLBACK")); + } + } + + [Test, Description("Reading exclusively locked document in a table using lock_shared with NOWAIT waiting option. ")] + public void SharedLockAfterExclusiveLockWithNoWait() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + + session.SQL("DROP TABLE IF EXISTS test.test").Execute(); + session.SQL("CREATE TABLE test.test (id INT, a INT)").Execute(); + var table1 = testSchema.GetTable("test"); + table1.Insert("id", "a").Values(1, 1).Values(2, 2).Values(3, 3).Execute(); + ExecuteSQLStatement(session.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + ExecuteSQLStatement(session2.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED")); + var table = session.Schema.GetTable("test"); + session.SQL("CREATE UNIQUE INDEX myIndex ON test.test (id)").Execute(); + var table2 = session2.GetSchema("test").GetTable("test"); + + session.SQL("START TRANSACTION").Execute(); + var rowResult = table.Select().Where("id = 1").LockExclusive().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + rowResult = table2.Select().Where("id = 2").LockShared(LockContention.NoWait).Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + // Session2 blocks due to to LockExclusive() not allowing to read locked documents. + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + Assert.Throws(() => ExecuteSelectStatement(table2.Select().Where("id = 1").LockShared(LockContention.NoWait))); + + // Session2 blocks due to to LockExclusive() not allowing to modify locked documents. + Result result1; + Assert.Throws(() => result1 = table2.Update().Where("id = 1").Set("a", 2).Execute()); + + session.Commit(); + var result = table2.Update().Where("id = 1").Set("a", 2).Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + + ExecuteSQLStatement(session.SQL("ROLLBACK")); + ExecuteSQLStatement(session2.SQL("ROLLBACK")); + } + } + + [Test, Description("Testing Non ASCII characters for utf8mb4 characterset")] + public void NonAsciiCharsForUtf8mb4() + { + //Bug28261283 + string record = "{\"name\": \"New\",\"age\": 4 , "; + string name1 = "\u201C\u2199\u2197\u2196\u2198\u201D"; + string name2 = "{\"age\": 1, \"misc\": 1.2, \"name\": \"\u201C\u2199\u2197\u2196\u2198\u201D\"}"; + + session.SQL($"use {schemaName}").Execute(); + session.SQL("drop table if exists newTable").Execute(); + session.SQL("create table newTable(c1 varchar(200), c2 JSON) CHARACTER SET utf8mb4").Execute(); + var db = session.GetSchema(schemaName); + Table tabNew = db.GetTable("newTable"); + + tabNew.Insert("c1", "c2").Values("\u201C\u2199\u2197\u2196\u2198\u201D", "{ \"name\": \"\u201C\u2199\u2197\u2196\u2198\u201D\", \"age\": 1 , \"misc\": 1.2}").Execute(); + tabNew.Insert().Values("abcNew£¢€©§°√", "{ \"name\": \"abcNew£¢€©§°√\", \"age\": 2 , \"misc\": 1.2}").Execute(); + RowResult result = tabNew.Select("c1", "c2").Where("c1 ='\u201C\u2199\u2197\u2196\u2198\u201D'").Execute(); + var r1 = result.FetchOne(); + Assert.That(r1[0].ToString(), Is.EqualTo(name1));//"“↙↗↖↘”" + Assert.That(r1[1].ToString(), Is.Not.EqualTo(name2));//"{\"age\": 1, \"misc\": 1.2, \"name\": \"??????????????????\"}" + var t = session.SQL("SELECT c1, CONVERT(c2 USING utf8mb4) FROM newTable WHERE c1 = '\u201C\u2199\u2197\u2196\u2198\u201D'").Execute(); + r1 = t.FetchOne(); + Assert.That(r1[0].ToString(), Is.EqualTo(name1));//"“↙↗↖↘”" + Assert.That(r1[1].ToString(), Is.EqualTo(name2));//"{\"age\": 1, \"misc\": 1.2, \"name\": \"??????????????????\"}" + + Collection coll = CreateCollection("test"); + + int klen = 1024 * 64; + string[] key = new string[klen]; + int dlen = 1024 * 100; + string[] data = new string[dlen]; + Array.Resize(ref key, 'S'); + Array.Resize(ref data, '$'); + string unicodeString = "Maths use \u03a0 (Pi) for calculations"; + // You can convert a string into a byte array + byte[] asciiBytes = Encoding.ASCII.GetBytes(unicodeString); + // You can convert a byte array into a char array + char[] asciiChars = Encoding.ASCII.GetChars(asciiBytes); + string asciiString = new string(asciiChars); + + record = record + "\""; + record = record + "\":\""; + record = record + asciiString; + record = record + "\"}"; + + Result r = coll.Add("{ \"name\": \"\u201C\u2199\u2197\u2196\u2198\u201D\", \"age\": 4 , \"misc\": 1.2}"). + Add("{ \"name\": \"xyz£¢€©§°√\", \"age\": 6 , \"misc\": 10}").Execute(); + var docs = coll.Find("name = '\u201C\u2199\u2197\u2196\u2198\u201D' and age>= 4 and age <= 6").Execute(); + DbDoc doc = docs.FetchOne(); + Assert.That(doc["name"], Is.EqualTo(name1)); + session.SQL("drop table if exists test").Execute(); + session.SQL("drop table if exists newTable").Execute(); + } + + [Test, Description("Test MySQLX plugin Datatype Tests")] + public void DatatypesOnCreateTable() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + + session.SQL($"use {schemaName}"); + session.SQL("create table test1(c1 int,c2 double GENERATED ALWAYS AS (c1*101/102) Stored COMMENT 'First Gen Col',c3 Json GENERATED ALWAYS AS (concat('{\"F1\":',c1,'}')) VIRTUAL COMMENT 'Second Gen /**/Col', c4 bigint GENERATED ALWAYS as (c1*10000) VIRTUAL UNIQUE KEY Comment '3rd Col' NOT NULL)").Execute(); + session.SQL("insert into test1(c1) values(1000)").Execute(); + RowResult r = session.GetSchema(schemaName).GetTable("test1").Select("c1").Execute(); + r.FetchAll(); + Assert.That(r.Rows[0][0].ToString(), Is.EqualTo("1000"), "Matching the values"); + session.SQL("drop table if exists test1").Execute(); + } + + [Test, Description("Test MySQLX plugin Table Expression using Where")] + public void TableExpressionWhereBindGroupBy() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + + string match = null; + session.SQL("create table test1(name VARCHAR(40), age INT)").Execute(); + Table table = session.GetSchema(schemaName).GetTable("test1"); + + for (int i = 10; i < 30; i++) + { + int j = 1; + string name = RandomString(i); + var result = table.Insert("name", "age") + .Values(name, i) + .Execute(); + if (i == 28) + match = name; + Assert.That(result.AffectedItemsCount, Is.EqualTo((ulong)j), "Matching the values"); + j = j + 1; + } + + var whereResult = table.Select("name", "age").Where("age == 28").Execute(); + int rowCount = whereResult.FetchAll().Count; + Assert.That(rowCount, Is.EqualTo(1), "Matching the row count"); + Assert.That(whereResult.Rows.ToArray()[0][0].ToString(), Is.EqualTo(match), "Matching the name"); + + whereResult = table.Select("name", "age").Where("age == 100").Execute(); + rowCount = whereResult.FetchAll().Count; + Assert.That(rowCount, Is.EqualTo(0), "Matching that there is no such value "); + + whereResult = table.Select().Where("name like :name").Bind("nAme", "%ABCDEFGHIJ%").Execute(); + rowCount = whereResult.FetchAll().Count; + for (int i = 0; i < whereResult.Rows.Count; i++) + { + var res = whereResult.Rows.ToArray()[i][0]; + Assert.That(res.ToString(), Does.Contain("ABCDEFGHIJ")); + } + + whereResult = table.Select().Where("name like :name").Bind("nAme", "%ABCD%").Execute(); + rowCount = whereResult.FetchAll().Count; + for (int j = 0; j < whereResult.Rows.Count; j++) + { + var res = whereResult.Rows.ToArray()[j][0]; + Assert.That(res.ToString(), Does.Contain("ABCD")); + } + } + + [Test, Description("Test MySQLX plugin Table")] + public void TableSelectFetchValuesInOrder() + { + ExecuteSQL("drop table if exists test1"); + ExecuteSQL("create table test1(name VARCHAR(40), age INT)"); + Table table = session.GetSchema(schemaName).GetTable("test1"); + var result = table.Insert("name", "age") + .Values("MARK", 34) + .Execute(); + + Assert.That(result.AffectedItemsCount, Is.EqualTo((ulong)1), "Matching the values"); + result = table.Insert("name", "age") + .Values("richie", 16) + .Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo((ulong)1), "Matching the values"); + var selectResult = table.Select().Execute(); + + while (selectResult.Next()) ; + Assert.That(selectResult.Rows.Count, Is.EqualTo(2), "Matching the row count"); + Assert.That(selectResult.Rows.ToArray()[0][0].ToString(), Is.EqualTo("MARK"), "Matching the value MARK"); + Assert.That((int)selectResult.Rows.ToArray()[0][1], Is.EqualTo(34), "Matching the age 34"); + Assert.That(selectResult.Rows.ToArray()[1][0].ToString(), Is.EqualTo("richie"), "Matching the value richie"); + Assert.That((int)selectResult.Rows.ToArray()[1][1], Is.EqualTo(16), "Matching the age 16"); + + var result1 = testSchema.GetTable("test").Select().OrderBy("age desc").Execute(); + int rowCount = result1.FetchAll().Count; + for (int i = 0; i < rowCount; i++) + { + Assert.That(result1.Rows[0][2].ToString(), Is.EqualTo("45"), "Matching the values"); + Assert.That(result1.Rows[1][2].ToString(), Is.EqualTo("38"), "Matching the values"); + Assert.That(result1.Rows[2][2].ToString(), Is.EqualTo("24"), "Matching the values"); + } + + result1 = testSchema.GetTable("test").Select().OrderBy("age asc").Execute(); + rowCount = result1.FetchAll().Count; + for (int i = 0; i < rowCount; i++) + { + Assert.That(result1.Rows[0][2].ToString(), Is.EqualTo("24"), "Matching the values"); + Assert.That(result1.Rows[1][2].ToString(), Is.EqualTo("38"), "Matching the values"); + Assert.That(result1.Rows[2][2].ToString(), Is.EqualTo("45"), "Matching the values"); + } + } + + [Test, Description("Reading exclusively locked document in a table using lock_exclusive with NOWAIT waiting option. ")] + public void DoubleExclusiveLockWithNoWait() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + + session.SQL("DROP TABLE IF EXISTS test.test").Execute(); + session.SQL("CREATE TABLE test.test (id INT, a INT)").Execute(); + var table1 = testSchema.GetTable("test"); + table1.Insert("id", "a").Values(1, 1).Values(2, 2).Values(3, 3).Execute(); + ExecuteSQLStatement(session.SQL("SET autocommit = 0")); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + ExecuteSQLStatement(session2.SQL("SET autocommit = 0")); + var table = testSchema.GetTable("test"); + session.SQL("CREATE UNIQUE INDEX myIndex ON test.test (id)").Execute(); + var table2 = session2.GetSchema("test").GetTable("test"); + + session.SQL("START TRANSACTION").Execute(); + var rowResult = table.Select().Where("id = 1").LockExclusive().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + rowResult = table2.Select().Where("id = 2").LockExclusive(LockContention.NoWait).Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + // Session2 blocks due to to LockExclusive() not allowing to read locked documents. + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + Assert.Throws(() => ExecuteSelectStatement(table2.Select().Where("id = 1").LockShared(LockContention.NoWait))); + + // Session2 blocks due to to LockExclusive() not allowing to modify locked documents. + Result result1; + Assert.Throws(() => result1 = table2.Update().Where("id = 1").Set("a", 2).Execute()); + + // Session2 returns immediately as session is committed. + session.Commit(); + var result = table2.Update().Where("id = 1").Set("a", 2).Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + + ExecuteSQLStatement(session.SQL("SET autocommit = 1")); + } + + [Test, Description("Reading a locked document(lock_shared) in a table using lock_shared with NOWAIT waiting option. ")] + public void DoubleSharedLockWithNoWait() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + + session.SQL("DROP TABLE IF EXISTS test.test").Execute(); + session.SQL("CREATE TABLE test.test (id INT, a INT)").Execute(); + var table1 = testSchema.GetTable("test"); + table1.Insert("id", "a").Values(1, 1).Values(2, 2).Values(3, 3).Execute(); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + var table = session.Schema.GetTable("test"); + var table2 = session2.GetSchema("test").GetTable("test"); + + session.SQL("START TRANSACTION").Execute(); + var rowResult = table.Select().Where("id = 1").LockShared().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + rowResult = table2.Select().Where("id = 2").LockShared(LockContention.NoWait).Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + // Session2 doesnt block as LockShare trying to read locked(Lock_shared) document + session2.SQL("SET SESSION innodb_lock_wait_timeout=1").Execute(); + rowResult = table2.Select().Where("id = 1").LockShared(LockContention.NoWait).Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + // Session2 blocks due to to LockShared() not allowing to modify locked documents. + Result result1; + Assert.Throws(() => result1 = table2.Update().Where("id = 1").Set("a", 2).Execute()); + + // Session2 returns immediately as session is committed. + session.Commit(); + var result = table2.Update().Where("id = 1").Set("a", 2).Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + } + + [Test, Description("Reading a locked document(lock_shared) in a table using lock_shared with NOWAIT waiting option. ")] + public void ExclusiveLockAfterSharedLockWithNoWait() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + + session.SQL("DROP TABLE IF EXISTS test.test").Execute(); + session.SQL("CREATE TABLE test.test (id INT, a INT)").Execute(); + var table1 = testSchema.GetTable("test"); + table1.Insert("id", "a").Values(1, 1).Values(2, 2).Values(3, 3).Execute(); + + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + var table = session.Schema.GetTable("test"); + session.SQL("CREATE UNIQUE INDEX myIndex ON test.test (id)").Execute(); + var table2 = session2.GetSchema("test").GetTable("test"); + + session.SQL("START TRANSACTION").Execute(); + var rowResult = table.Select().Where("id = 1").LockShared().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + rowResult = table2.Select().Where("id = 2").LockExclusive(LockContention.NoWait).Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + // Session2 blocks as LockExclusive() trying to access locked(LockShared) documents. + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + Assert.Throws(() => ExecuteSelectStatement(table2.Select().Where("id = 1").LockExclusive(LockContention.NoWait))); + + // Session2 blocks due to to LockShared() not allowing to modify locked documents. + Result result1; + Assert.Throws(() => result1 = table2.Update().Where("id = 1").Set("a", 2).Execute()); + + // Session2 returns immediately as session is committed. + session.Commit(); + var result = table2.Update().Where("id = 1").Set("a", 2).Execute(); + Assert.That(result.AffectedItemsCount, Is.EqualTo(1)); + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + } + + [Test, Description("Reading exclusively locked document in a table using lock_shared with SKIPLOCK waiting option. ")] + public void SharedLockAfterExclusiveWithSkiplock() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + + session.SQL("DROP TABLE IF EXISTS test.test").Execute(); + session.SQL("CREATE TABLE test.test (id INT, a INT)").Execute(); + var table1 = testSchema.GetTable("test"); + table1.Insert("id", "a").Values(1, 1).Values(2, 2).Values(3, 3).Execute(); + + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + var table = session.Schema.GetTable("test"); + session.SQL("CREATE UNIQUE INDEX myIndex ON test.test (id)").Execute(); + var table2 = session2.GetSchema("test").GetTable("test"); + + session.SQL("START TRANSACTION").Execute(); + var rowResult = table.Select().Where("id = 1").LockExclusive().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + rowResult = table2.Select().Where("id = 2").LockShared(LockContention.NoWait).Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + // Session2 blocks due to to LockExclusive() not allowing to read locked documents. + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + rowResult = table2.Select().Where("id = 1").LockShared(LockContention.SkipLocked).Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(0), "Matching the document ID"); + + // Session2 blocks due to to LockExclusive() not allowing to modify locked documents. + Result result1; + Assert.Throws(() => result1 = table2.Update().Where("id = 1").Set("a", 2).Execute()); + + // Session2 returns immediately as session is committed. + session.Commit(); + var result = table2.Update().Where("id = 1").Set("a", 2).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(1), "Matching the record count"); + + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + } + + [Test, Description("Reading exclusively locked document in a table using lock_exclusive with SKIPLOCK waiting option.")] + public void DoubleExclusiveLockWithSkiplock() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + + session.SQL("DROP TABLE IF EXISTS test.test").Execute(); + session.SQL("CREATE TABLE test.test (id INT, a INT)").Execute(); + var table1 = testSchema.GetTable("test"); + table1.Insert("id", "a").Values(1, 1).Values(2, 2).Values(3, 3).Execute(); + + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + var table = session.Schema.GetTable("test"); + session.SQL("CREATE UNIQUE INDEX myIndex ON test.test (id)").Execute(); + var table2 = session2.GetSchema("test").GetTable("test"); + + session.SQL("START TRANSACTION").Execute(); + var rowResult = table.Select().Where("id = 1").LockExclusive().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + rowResult = table2.Select().Where("id = 2").LockExclusive(LockContention.SkipLocked).Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + // Session2 doesn't block as SKIPLOCK used + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + rowResult = table2.Select().Where("id = 1").LockExclusive(LockContention.SkipLocked).Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(0), "Matching the document ID"); + // Session2 blocks due to to LockExclusive() not allowing to modify locked documents. + Result result1; + Assert.Throws(() => result1 = table2.Update().Where("id = 1").Set("a", 2).Execute()); + + // Session2 returns immediately as session is committed. + session.Commit(); + var result = table2.Update().Where("id = 1").Set("a", 2).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(1), "Matching the record count"); + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + } + + [Test, Description("Reading a locked document(lock_shared) in a table using lock_shared with SKIPLOCK waiting option. ")] + public void DoubleSharedLockWithSkiplock() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + + session.SQL("DROP TABLE IF EXISTS test.test").Execute(); + session.SQL("CREATE TABLE test.test (id INT, a INT)").Execute(); + var table1 = testSchema.GetTable("test"); + table1.Insert("id", "a").Values(1, 1).Values(2, 2).Values(3, 3).Execute(); + + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + var table = session.Schema.GetTable("test"); + var table2 = session2.GetSchema("test").GetTable("test"); + + session.SQL("START TRANSACTION").Execute(); + var rowResult = table.Select().Where("id = 1").LockShared().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + rowResult = table2.Select().Where("id = 2").LockShared(LockContention.SkipLocked).Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + // Session2 doesn't block as SKIPLOCK being used + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + rowResult = table2.Select().Where("id = 1").LockShared(LockContention.SkipLocked).Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + // Session2 blocks due to to LockShared() not allowing to modify locked documents. + Result result1; + Assert.Throws(() => result1 = table2.Update().Where("id = 1").Set("a", 2).Execute()); + + // Session2 returns immediately as session is committed. + session.Commit(); + var result = table2.Update().Where("id = 1").Set("a", 2).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(1), "Matching the record count"); + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + } + + [Test, Description("Reading a locked document(lock_shared) in a table using lock_exclusive with SKIPLOCK waiting option.")] + public void ExclusiveLockAfterSharedLockWithSkiplock() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + + session.SQL("DROP TABLE IF EXISTS test.test").Execute(); + session.SQL("CREATE TABLE test.test (id INT, a INT)").Execute(); + var table1 = testSchema.GetTable("test"); + table1.Insert("id", "a").Values(1, 1).Values(2, 2).Values(3, 3).Execute(); + + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + var table = session.Schema.GetTable("test"); + session.SQL("CREATE UNIQUE INDEX myIndex ON test.test (id)").Execute(); + var table2 = session2.GetSchema("test").GetTable("test"); + + session.SQL("START TRANSACTION").Execute(); + var rowResult = table.Select().Where("id = 1").LockShared().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + rowResult = table2.Select().Where("id = 2").LockExclusive(LockContention.SkipLocked).Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + // Session2 doesn't block as SKIPLOCK being used + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + rowResult = table2.Select().Where("id = 1").LockExclusive(LockContention.SkipLocked).Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(0), "Matching the document ID"); + + // Session2 blocks due to to LockExclusive() not allowing to modify locked documents. + Result result1; + Assert.Throws(() => result1 = table2.Update().Where("id = 1").Set("a", 2).Execute()); + + // Session2 returns immediately as session is committed. + session.Commit(); + var result = table2.Update().Where("id = 1").Set("a", 2).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(1), "Matching the record count"); + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + } + + [Test, Description("Reading an exclusively locked document in a table using lock_shared without any waiting option. ")] + public void ExclusiveLockBeforeSharedLockWithoutAwaiting() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + + session.SQL("DROP TABLE IF EXISTS test.test").Execute(); + session.SQL("CREATE TABLE test.test (id INT, a INT)").Execute(); + var table1 = testSchema.GetTable("test"); + table1.Insert("id", "a").Values(1, 1).Values(2, 2).Values(3, 3).Execute(); + + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + var table = session.Schema.GetTable("test"); + session.SQL("CREATE UNIQUE INDEX myIndex ON test.test (id)").Execute(); + var table2 = session2.GetSchema("test").GetTable("test"); + + session.SQL("START TRANSACTION").Execute(); + var rowResult = table.Select().Where("id = 1").LockExclusive().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + rowResult = table2.Select().Where("id = 2").LockShared().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + // Session2 blocks due to to LockExclusive() not allowing to read locked documents. + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + Assert.Throws(() => ExecuteSelectStatement(table2.Select().Where("id = 1").LockShared())); + + // Session2 blocks due to to LockExclusive() not allowing to modify locked documents. + Result result1; + Assert.Throws(() => result1 = table2.Update().Where("id = 1").Set("a", 2).Execute()); + + // Session2 returns immediately as session is committed. + session.Commit(); + var result = table2.Update().Where("id = 1").Set("a", 2).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(1), "Matching the record count"); + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + } + + [Test, Description("Reading an exclusively locked document in a table using lock_exclusive without any waiting option.")] + public void DoubleExclusiveLockWithoutWaiting() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + var table = session.Schema.GetTable("test"); + session.SQL("CREATE UNIQUE INDEX myIndex ON test.test (id)").Execute(); + var table2 = session2.GetSchema("test").GetTable("test"); + + session.SQL("START TRANSACTION").Execute(); + var rowResult = table.Select().Where("id = 1").LockExclusive().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + rowResult = table2.Select().Where("id = 2").LockExclusive().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + // Session2 blocks due to to LockExclusive() not allowing to read locked documents. + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + Assert.Throws(() => ExecuteSelectStatement(table2.Select().Where("id = 1").LockExclusive())); + + // Session2 blocks due to to LockExclusive() not allowing to modify locked documents. + Result result1; + Assert.Throws(() => result1 = table2.Update().Where("id = 1").Set("age", 2).Execute()); + + // Session2 returns immediately as session is committed. + session.Commit(); + var result = table2.Update().Where("id = 1").Set("age", 2).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(1), "Matching the record count"); + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + } + + [Test, Description("Reading a locked document(lock_shared) in a table using lock_shared without any waiting option.")] + public void DoubleSharedLockWithoutWaiting() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + + session.SQL("DROP TABLE IF EXISTS test.test").Execute(); + session.SQL("CREATE TABLE test.test (id INT, a INT)").Execute(); + var table1 = testSchema.GetTable("test"); + table1.Insert("id", "a").Values(1, 1).Values(2, 2).Values(3, 3).Execute(); + + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + var table = session.Schema.GetTable("test"); + var table2 = session2.GetSchema("test").GetTable("test"); + + session.SQL("START TRANSACTION").Execute(); + var rowResult = table.Select().Where("id = 1").LockShared().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + rowResult = table2.Select().Where("id = 2").LockShared().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + rowResult = table2.Select().Where("id = 1").LockShared().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + // Session2 blocks due to to LockExclusive() not allowing to modify locked documents. + Result result1; + Assert.Throws(() => result1 = table2.Update().Where("id = 1").Set("a", 2).Execute()); + + // Session2 returns immediately as session is committed. + session.Commit(); + var result = table2.Update().Where("id = 1").Set("a", 2).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(1), "Matching the record count"); + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + } + + [Test, Description("Reading a locked document(lock_shared) in a table using lock_exclusive without any waiting option. ")] + public void SharedLockBeforeExclusiveLockWithoutWaiting() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + + session.SQL("DROP TABLE IF EXISTS test.test").Execute(); + session.SQL("CREATE TABLE test.test (id INT, a INT)").Execute(); + var table1 = testSchema.GetTable("test"); + table1.Insert("id", "a").Values(1, 1).Values(2, 2).Values(3, 3).Execute(); + + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + var table = session.Schema.GetTable("test"); + session.SQL("CREATE UNIQUE INDEX myIndex ON test.test (id)").Execute(); + var table2 = session2.GetSchema("test").GetTable("test"); + + session.SQL("START TRANSACTION").Execute(); + var rowResult = table.Select().Where("id = 1").LockShared().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + rowResult = table2.Select().Where("id = 2").LockExclusive().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + // Session2 blocks as LockExclusive() is trying to read locked documents. + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + Assert.Throws(() => ExecuteSelectStatement(table2.Select().Where("id = 1").LockExclusive())); + + // Session2 blocks due to to LockShared() not allowing to modify locked documents. + Result result1; + Assert.Throws(() => result1 = table2.Update().Where("id = 1").Set("a", 2).Execute()); + + // Session2 returns immediately as session is committed. + session.Commit(); + var result = table2.Update().Where("id = 1").Set("a", 2).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(1), "Matching the record count"); + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + } + + [Test, Description("Reading a locked document(shared/exclusive) in a table using SKIPLOCK and NOWAIT waiting options when CRUD is happening parallely")] + public void SingleLockExclusiveWithNoWaitAndSkip() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + + session.SQL("DROP TABLE IF EXISTS test.test").Execute(); + session.SQL("CREATE TABLE test.test (id INT, a INT)").Execute(); + var table1 = testSchema.GetTable("test"); + table1.Insert("id", "a").Values(1, 1).Values(2, 2).Values(3, 3).Execute(); + + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + var table = session.Schema.GetTable("test"); + session.SQL("CREATE UNIQUE INDEX myIndex ON test.test (id)").Execute(); + var table2 = session2.GetSchema("test").GetTable("test"); + + session.SQL("START TRANSACTION").Execute(); + var result1 = table.Update().Where("id = 1").Set("a", 2).Execute(); + + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + var rowResult1 = table2.Select().Where("id = 2").LockExclusive(LockContention.NoWait).Execute(); + Assert.That(rowResult1.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + // Session2 blocks due to to LockExclusive() not allowing to read locked documents. + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + Assert.Throws(() => ExecuteSelectStatement(table2.Select().Where("id = 1").LockExclusive(LockContention.NoWait))); + Assert.Throws(() => ExecuteSelectStatement(table2.Select().Where("id = 1").LockShared(LockContention.NoWait))); + + var rowResult = table2.Select().Where("id = 1").LockShared(LockContention.SkipLocked).Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(0), "Matching the document ID"); + + rowResult = table2.Select().Where("id = 1").LockExclusive(LockContention.SkipLocked).Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(0), "Matching the document ID"); + + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + } + + [Test, Description("Multiple lock calls on a document in table using NOWAIT and SKIPLOCK waiting options")] + public void ChainedExclusiveLocks() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + + session.SQL("DROP TABLE IF EXISTS test.test").Execute(); + session.SQL("CREATE TABLE test.test (id INT, a INT)").Execute(); + var table1 = testSchema.GetTable("test"); + table1.Insert("id", "a").Values(1, 1).Values(2, 2).Values(3, 3).Execute(); + + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + var table = session.Schema.GetTable("test"); + session.SQL("CREATE UNIQUE INDEX myIndex ON test.test (id)").Execute(); + var table2 = session2.GetSchema("test").GetTable("test"); + + session.SQL("START TRANSACTION").Execute(); + var rowResult = table.Select().Where("id = 1").LockShared().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + session2.SQL("START TRANSACTION").Execute(); + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + Assert.Throws(() => rowResult = table2.Select().Where("id = 1").LockExclusive(LockContention.SkipLocked).LockExclusive(LockContention.NoWait).Execute()); + + Assert.Throws(() => ExecuteSelectStatement(table2.Select().Where("id = 1") + .LockExclusive(LockContention.SkipLocked) + .LockExclusive(LockContention.NoWait))); + + rowResult = table2.Select().Where("id = 1").LockExclusive(LockContention.SkipLocked).LockShared(LockContention.SkipLocked).Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + rowResult = table2.Select().Where("id = 1").LockShared(LockContention.SkipLocked).LockExclusive(LockContention.SkipLocked).Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(0), "Matching the document ID"); + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + } + + [Test, Description("Test MySQLX plugin - MYSQLCNET 755 Table GetIncrementValue")] + public void TableGetAutoIncrementValue() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + + session.SQL("CREATE TABLE address1" + + "(address_number1 MEDIUMINT NOT NULL AUTO_INCREMENT, " + + "address_number2 CHAR(100) NOT NULL, " + + "PRIMARY KEY (address_number1)" + ");").Execute(); + Table table = testSchema.GetTable("address1"); + var result = table.Insert("address_number1", "address_number2") + .Values(100, "Test the document id in address table") + .Execute(); + + var docId = result.AutoIncrementValue; + Assert.That(docId.ToString(), Is.EqualTo("100"), "Matching the value if already it is inserted"); + + result = table.Insert("address_number2") + .Values("Test the document id by 2nd insert without id in address table") + .Execute(); + docId = result.AutoIncrementValue; + Assert.That(docId.ToString(), Is.EqualTo("101"), "Matching the value if already it is inserted"); + + session.SQL("CREATE TABLE address2" + + "(address_number3 INT NOT NULL AUTO_INCREMENT, " + + "address_number4 CHAR(100) NOT NULL, " + + "PRIMARY KEY (address_number3)" + ");").Execute(); + table = testSchema.GetTable("address2"); + result = table.Insert("address_number4") + .Values("Test the document id in address table without unique id") + .Execute(); + + docId = result.AutoIncrementValue; + Assert.That(docId.ToString(), Is.EqualTo("1"), "Matching the auto increment value"); + + session.SQL("CREATE TABLE address3" + + "(address_number5 MEDIUMINT NOT NULL AUTO_INCREMENT, " + + "address_number6 CHAR(100) NOT NULL, " + + "PRIMARY KEY (address_number5)" + ");").Execute(); + table = testSchema.GetTable("address3"); + result = table.Insert("address_number5", "address_number6") + .Values(100, "Test multiple document ids in address table - 1st document") + .Values(200, "Test multiple document ids in address table - 2nd document") + .Values(300, "Test multiple document ids in address table - 3rd document") + .Execute(); + + docId = result.AutoIncrementValue; + Assert.That(docId.ToString(), Is.EqualTo("300"), "Matching the value if more than one documents inserted"); + + result = table.Insert("address_number6") + .Values("Test multiple document ids in address table - 4th document without ID") + .Values("Test multiple document ids in address table - 5th document without ID") + .Values("Test multiple document ids in address table - 6th document without ID") + .Execute(); + + docId = result.AutoIncrementValue; + Assert.That(docId.ToString(), Is.EqualTo("301"), "Matching the value if more than one documents inserted"); + + session.SQL("CREATE TABLE address4" + + "(address_number7 INT NOT NULL AUTO_INCREMENT, " + + "address_number8 CHAR(100) NOT NULL, " + + "PRIMARY KEY (address_number7)" + ");").Execute(); + table = testSchema.GetTable("address4"); + result = table.Insert("address_number8") + .Values("Test the document ids in address table without unique id - 1st document") + .Values("Test the document ids in address table without unique id - 2nd document") + .Values("Test the document ids in address table without unique id - 3rd document") + .Execute(); + + docId = result.AutoIncrementValue; + Assert.That(docId.ToString(), Is.EqualTo("1"), "Matching the auto increment value"); + + result = table.Insert("address_number8") + .Values("Test the document ids in address table without unique id - 4th document") + .Values("Test the document ids in address table without unique id - 5th document") + .Values("Test the document ids in address table without unique id - 6th document") + .Execute(); + + docId = result.AutoIncrementValue; + Assert.That(docId.ToString(), Is.EqualTo("4"), "Matching the auto increment value"); + + session.SQL("CREATE TABLE address5" + + "(address_number9 INT, " + + "address_number10 CHAR(100));").Execute(); + + session.SQL("ALTER TABLE address5 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY(c)").Execute(); + + table = testSchema.GetTable("address5"); + result = table.Insert("address_number9", "address_number10") + .Values(100, "Test the document ids in address table without unique id - 1st document") + .Values(200, "Test the document ids in address table without unique id - 2nd document") + .Values(300, "Test the document ids in address table without unique id - 3rd document") + .Execute(); + + docId = result.AutoIncrementValue; + Assert.That(docId.ToString(), Is.EqualTo("1"), "Matching the auto increment value"); + session.SQL("drop table if exists address1").Execute(); + session.SQL("drop table if exists address2").Execute(); + session.SQL("drop table if exists address3").Execute(); + session.SQL("drop table if exists address4").Execute(); + session.SQL("drop table if exists address5").Execute(); + } + + [Test, Description("Test MySQLX plugin - MYSQLCNET_684 Fetchone returns null when no rows")] + public void FetchoneReturnsNullNoRows() + { + ExecuteSQL("CREATE TABLE test1(id INT)"); + ExecuteSQL("INSERT INTO test1 VALUES (1),(2),(3),(4)"); + ExecuteSQL("CREATE TABLE test2(id INT, val INT)"); + ExecuteSQL("INSERT INTO test2 VALUES (1,0)"); + var rowResult = testSchema.GetTable("test1").Select("id").Execute(); + foreach (var row in rowResult) + { + var result = testSchema.GetTable("test2").Update().Where("id=1").Set("val", row["id"]).Execute(); + //WL11843-Core API v1 alignment Changes + Assert.That(result.AffectedItemsCount, Is.EqualTo(1), "Matching"); + } + + Row valRow = testSchema.GetTable("test2").Select("val").Execute().FetchOne(); + Assert.That(valRow[0].ToString(), Is.EqualTo("4"), "Matching"); + ExecuteSQL("DELETE FROM test2 WHERE id=1"); + valRow = testSchema.GetTable("test2").Select("val").Execute().FetchOne(); + Assert.That(valRow, Is.Null); + ExecuteSQL("DROP TABLE if exists test1"); + ExecuteSQL("DROP TABLE if exists test2"); + } + + [Test, Description("Test MySQLX plugin - MYSQLCNET_684 Fetchone returns null when no table")] + public void FetchoneReturnsNullNoTable() + { + ExecuteSQL("CREATE TABLE test111(id INT)"); + ExecuteSQL("INSERT INTO test111 VALUES (1),(2),(3),(4)"); + ExecuteSQL("CREATE TABLE test222(id INT, val INT)"); + ExecuteSQL("INSERT INTO test222 VALUES (1,0)"); + var rowResult = testSchema.GetTable("test111").Select("id").Execute(); + foreach (var row in rowResult) + { + var result = testSchema.GetTable("test222").Update().Where("id=1").Set("val", row["id"]).Execute(); + //WL11843-Core API v1 alignment Changes + Assert.That(result.AffectedItemsCount, Is.EqualTo(1), "Matching"); + } + + Row valRow = testSchema.GetTable("test222").Select("val").Execute().FetchOne(); + Assert.That(valRow[0].ToString(), Is.EqualTo("4"), "Matching"); + ExecuteSQL("DROP TABLE test222"); + Assert.Throws(() => valRow = testSchema.GetTable("test222").Select("val").Execute().FetchOne()); + ExecuteSQL("DROP TABLE IF EXISTS test111"); + } + + [Test, Description("MySQLX CNET-Test Table.Select() with exclusive lock and Table.Update() normal from two sessions. ")] + public void DoubleChainedLocksWithTwoSessions_S1() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + session.SQL("SET autocommit = 0").Execute(); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + session2.SQL("SET autocommit = 0").Execute(); + var table = session.Schema.GetTable("test"); + session.SQL("CREATE UNIQUE INDEX myIndex ON test.test (id)").Execute(); + var table2 = session2.GetSchema("test").GetTable("test"); + + session.SQL("START TRANSACTION").Execute(); + var rowResult = table.Select().Where("id = 1").LockExclusive().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the record ID"); + + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + rowResult = table2.Select().Where("id = 2").LockExclusive().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the record ID"); + + // Session2 blocks due to to LockExclusive() not allowing to read locked documents. + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + Assert.Throws(() => ExecuteSelectStatement(table2.Select().Where("id = 1").LockExclusive())); + + // Session2 blocks due to to LockExclusive() not allowing to modify locked documents. + Result result1; + Assert.Throws(() => result1 = table2.Update().Where("id = 1").Set("age", 2).Execute()); + + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + session2.SQL("SET autocommit = 0").Execute(); + var table = session.Schema.GetTable("test"); + var table2 = session2.GetSchema("test").GetTable("test"); + + session.SQL("START TRANSACTION").Execute(); + var rowResult = table.Select().Where("id = 1").LockShared().LockExclusive().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the record ID"); + + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + rowResult = table2.Select().Where("id = 2").LockShared().LockExclusive().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the record ID"); + + // Session2 blocks due to to LockExclusive() not allowing to read locked documents. + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + Assert.Throws(() => ExecuteSelectStatement(table2.Select().Where("id = 1").LockShared().LockExclusive())); + + // Session2 blocks due to to LockExclusive() not allowing to modify locked documents. + Result result1; + Assert.Throws(() => result1 = table2.Update().Where("id = 1").Set("age", 2).Execute()); + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + session.SQL("SET autocommit = 1").Execute(); + } + + [Test, Description("MySQLX CNET-Test Table.Select() with shared lock and Table.Update() normal from two sessions. ")] + public void DoubleChainedLocksWithTwoSessions_S2() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + session.SQL("SET autocommit = 0").Execute(); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + session2.SQL("SET autocommit = 0").Execute(); + var table = session.Schema.GetTable("test"); + session.SQL("CREATE UNIQUE INDEX myIndex ON test.test (id)").Execute(); + var table2 = session2.GetSchema("test").GetTable("test"); + + session.SQL("START TRANSACTION").Execute(); + var rowResult = table.Select().Where("id = 1").LockShared().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the record ID"); + + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + rowResult = table2.Select().Where("id = 1").Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the record ID"); + + // Session2 blocks due to to LockExclusive() not allowing to read locked documents. + ExecuteSQLStatement(session2.SQL("SET SESSION innodb_lock_wait_timeout=1")); + var result = table2.Update().Where("id = 2").Set("age", 30).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(1), "Match being done"); + Assert.Throws(() => ExecuteSelectStatement(table2.Select().Where("id = 1").LockExclusive())); + + // Session2 blocks due to to LockExclusive() not allowing to modify locked documents. + Result result1; + Assert.Throws(() => result1 = table2.Update().Where("id = 1").Set("age", 2).Execute()); + + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + + session.SQL("SET autocommit = 0").Execute(); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + session2.SQL("SET autocommit = 0").Execute(); + var table = session.Schema.GetTable("test"); + var table2 = session2.GetSchema("test").GetTable("test"); + + session.SQL("START TRANSACTION").Execute(); + var rowResult = table.Select().Where("id = 1").LockExclusive().LockShared().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the record ID"); + + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + rowResult = table2.Select().Where("id = 1").Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the record ID"); + + // Session2 blocks due to to LockExclusive() not allowing to read locked documents. + session2.SQL("SET SESSION innodb_lock_wait_timeout=1").Execute(); + var result = table2.Update().Where("id = 2").Set("age", 30).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(1), "Match being done"); + Assert.Throws(() => ExecuteSelectStatement(table2.Select().Where("id = 1").LockShared().LockExclusive())); + + // Session2 blocks due to to LockExclusive() not allowing to modify locked documents. + Result result1; + Assert.Throws(() => result1 = table2.Update().Where("id = 1").Set("age", 2).Execute()); + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + session.SQL("SET autocommit = 1").Execute(); + } + + [Test, Description("MySQLX CNET-Test Table.Select() with exclusive lock from two sessions. ")] + public void SingleExclusiveLock() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + session.SQL("SET autocommit = 0").Execute(); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + session2.SQL("SET autocommit = 0").Execute(); + var table = session.Schema.GetTable("test"); + session.SQL("CREATE UNIQUE INDEX myIndex ON test.test (id)").Execute(); + var table2 = session2.GetSchema("test").GetTable("test"); + + session.SQL("START TRANSACTION").Execute(); + var rowResult = table.Select().Where("id = 1").LockExclusive().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the record ID"); + + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + rowResult = table2.Select().Where("id = 2").Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the record ID"); + + // Session2 blocks due to to LockExclusive() not allowing to read locked documents. + session2.SQL("SET SESSION innodb_lock_wait_timeout=1").Execute(); + Assert.Throws(() => ExecuteSelectStatement(table2.Select().Where("id = 1").LockExclusive())); + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + session.SQL("SET autocommit = 1").Execute(); + } + + [Test, Description("MySQLX CNET-Test Table.Select() with exclusive lock and Table.Select() with exclusive lock from two sessions-Select multiple records")] + public void SingleTransactionWithLocks() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + session.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED").Execute(); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + session2.SQL("SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED").Execute(); + session.SQL("CREATE UNIQUE INDEX myIndex ON test.test (id)").Execute(); + var table = session.Schema.GetTable("test"); + var table2 = session2.GetSchema("test").GetTable("test"); + + session.SQL("START TRANSACTION").Execute(); + var rowResult = table.Select().Where("id in (1,3)").LockShared().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(2), "Matching the record ID"); + + rowResult = table2.Select().Where("id = 2").LockExclusive().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the record ID"); + rowResult = table2.Select().Where("id = 2").LockShared().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the record ID"); + // Session2 blocks due to to LockExclusive() not allowing to read locked documents. + session.SQL("SET SESSION innodb_lock_wait_timeout=1").Execute(); + table2.Select().Where("id = 2").LockExclusive().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the record ID"); + session2.SQL("SET SESSION innodb_lock_wait_timeout=1").Execute(); + Assert.Throws(() => ExecuteSelectStatement(table2.Select().Where("id = 1").LockExclusive())); + + session2.SQL("SET SESSION innodb_lock_wait_timeout=1").Execute(); + // Session2 blocks due to to LockExclusive() not allowing to modify locked documents. + Assert.Throws(() => ExecuteUpdateStatement(table2.Update().Where("id = 1").Set("age", 2))); + + session.SQL("ROLLBACK").Execute(); + rowResult = table2.Select().Where("id = 1").LockExclusive().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + session2.SQL("ROLLBACK").Execute(); + rowResult = table.Select().Where("id = 2").LockExclusive().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + } + } + + [Test, Description("MySQLX CNET-Test Table.Select() with exclusive lock and Table.Update() normal from two sessions-50 Iterations")] + public void IteratedExclusiveLocks() + { + Assume.That(Platform.IsWindows(), "This test is only for Windows OS."); + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + session.SQL("SET autocommit = 0").Execute(); + session.SQL("CREATE UNIQUE INDEX myIndex ON test.test (id)").Execute(); + const int iterations = 30; + for (var i = 0; i < iterations; i++) + { + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + session2.SQL("SET autocommit = 0").Execute(); + var table = session.Schema.GetTable("test"); + + var table2 = session2.GetSchema("test").GetTable("test"); + + session.SQL("START TRANSACTION").Execute(); + var rowResult = table.Select().Where("id = 1").LockExclusive().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the record ID"); + + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + rowResult = table2.Select().Where("id = 2").LockExclusive().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the record ID"); + + // Session2 blocks due to to LockExclusive() not allowing to read locked documents. + session2.SQL("SET SESSION innodb_lock_wait_timeout=1").Execute(); + Assert.Throws(() => ExecuteSelectStatement(table2.Select().Where("id = 1").LockExclusive())); + + // Session2 blocks due to to LockExclusive() not allowing to modify locked documents. + Result result1; + Assert.Throws(() => result1 = table2.Update().Where("id = 1").Set("age", 2).Execute()); + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + } + session.SQL("SET autocommit = 1").Execute(); + } + + #endregion WL14389 + + #region Methods + public static string RandomString(int length) + { + const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + const string chars1 = "ABCDEFGHIJ"; + var random = new Random(); + if (length == 20) + { + return chars1; + } + else + { + return new string(Enumerable.Repeat(chars, length) + .Select(s => s[random.Next(s.Length)]).ToArray()); + } + + } + #endregion Methods + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/TableUpdateTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/TableUpdateTests.cs new file mode 100644 index 000000000..9129143e4 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/TableUpdateTests.cs @@ -0,0 +1,368 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI.Common; +using MySqlX.XDevAPI.Relational; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Generic; +using MySqlX.XDevAPI; + +namespace MySqlX.Data.Tests.RelationalTests +{ + public class TableUpdateTests : BaseTest + { + Table table; + + [TearDown] + public void TearDown() => ExecuteSQL("DROP TABLE IF EXISTS test"); + + [SetUp] + public void SetUp() + { + ExecuteSQL("CREATE TABLE test.test(id INT, name VARCHAR(40), age INT)"); + + table = testSchema.GetTable("test"); + var insertStatement = table.Insert(); + int rowsToInsert = 10; + for (int i = 1; i <= rowsToInsert; i++) + { + insertStatement.Values(i, i, i); + } + ExecuteInsertStatement(insertStatement); + Assert.That(CountRows(), Is.EqualTo(rowsToInsert)); + } + + private int CountRows() + { + return GetRows(null).Count; + } + + private IReadOnlyCollection GetRows(FilterParams filter) + { + var statement = table.Select(); + if (filter != null) + { + statement.FilterData.Condition = filter.Condition; + statement.FilterData.Limit = filter.Limit; + statement.FilterData.OrderBy = filter.OrderBy; + statement.FilterData.Parameters = filter.Parameters; + } + var result = ExecuteSelectStatement(statement); + while (result.Next()) ; + return result.Rows; + } + + private void ValidateUpdate(TableUpdateStatement statement) + { + Dictionary parameters = new Dictionary(statement.FilterData.Parameters); + var result = ExecuteUpdateStatement(statement); + statement.FilterData.Parameters = parameters; + var rows = GetRows(statement.FilterData); + foreach (var row in rows) + { + foreach (var set in statement.updates) + { + Assert.That(row.GetString(set.Path), Is.EqualTo(set.Value.ToString())); + } + } + } + + [Test] + public void EmptyUpdateTest() + { + Assert.Throws(() => ExecuteUpdateStatement(table.Update())); + } + + [Test] + public void UpdateConditionTest() + { + ValidateUpdate(table.Update().Where("id = 5").Set("name", "other")); + } + + [Test] + public void UpdateMultiSet() + { + ValidateUpdate(table.Update().Set("name", "other") + .Set("age", 21) + .Set("id", 30) + .Where("id = 3")); + } + + [Test] + public void UpdateMultiRows() + { + ValidateUpdate(table.Update().Set("age", 85).Where("id % 2 = 0")); + } + + [Test] + public void UpdateAllRows() + { + ValidateUpdate(table.Update().Set("age", 32).Set("name", "jonh")); + } + + [Test] + public void UpdateOrderbyAndLimit() + { + ValidateUpdate(table.Update().Set("age", 15).OrderBy("id DES").Limit(5)); + } + + [Test] + public void UpdateBind() + { + var stmt = table.Update().Set("age", 55).Where("id = :id or id = :id or id = :id2"); + ValidateUpdate(stmt.Bind("id", 4).Bind("id2", 7)); + ValidateUpdate(stmt.Bind("id", 5).Bind("id2", 8)); + } + + [Test] + public void UpdateWithInOperator() + { + Table table = testSchema.GetTable("test"); + Assert.That(CountRows(), Is.EqualTo(10)); + + Assert.That(ExecuteUpdateStatement(table.Update().Where("id IN (1,2)").Set("id", 0)).AffectedItemsCount, Is.EqualTo(2)); + Assert.That(ExecuteSelectStatement(table.Select().Where("id = 0")).FetchAll().Count, Is.EqualTo(2)); + + Assert.Throws(() => ExecuteDeleteStatement(table.Delete().Where("a IN [3]"))); + Assert.Throws(() => ExecuteDeleteStatement(table.Delete().Where("3 IN a"))); + Assert.Throws(() => ExecuteUpdateStatement(table.Update().Where("age IN [3]").Set("id", 0))); + + Assert.That(ExecuteUpdateStatement(table.Update().Where("age IN (3)").Set("id", 0)).AffectedItemsCount, Is.EqualTo(1)); + Assert.That(ExecuteSelectStatement(table.Select().Where("id = 0")).FetchAll().Count, Is.EqualTo(3)); + } + + #region WL14389 + + [Test, Description("Collection.Find(condition).GroupBy(SearchExprStr)")] + public void TableSelectGroupBy() + { + ExecuteSQLStatement(session.SQL("set sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';")); + session.SQL("delete from test").Execute(); + Table table = testSchema.GetTable("test"); + var result1 = table.Insert("id", "name", "age") + .Values(1, "jonh doe", 38) + .Values(2, "milton greenh", 45) + .Values(3, "larry smith", 24) + .Values(4, "mary weinstein", 24) + .Values(5, "jerry pratt", 45) + .Values(6, "hugh jackman", 20) + .Values(7, "elizabeth olsen", 31) + .Execute(); + RowResult result = table.Select().OrderBy("age desc").Execute(); + Assert.Throws(() => table.Delete().Limit(1).Offset(3).Execute()); + + var t2 = table.Delete().Limit(1).Offset(0).Execute(); + result1 = table.Insert("id", "name", "age") + .Values(1, "jonh doe", 38) + .Execute(); + + Assert.Throws(() => table.Update().Set("name", "updated").Limit(1).Offset(3).Execute()); + + t2 = table.Update().Set("name", "updated").Limit(1).Offset(0).Execute(); + var t = table.Select().Limit(1).Offset(3).Execute(); + t = table.Select().Limit(10).Offset(3).Execute(); + Assert.Throws(() => ExecuteSelectStatement(table.Select().Limit(-1).Offset(3))); + + t = table.Select().Limit(100000000).Offset(3).Execute(); + t = table.Select().Limit(2).Offset(-1).Execute(); + t = table.Select().Limit(2).Offset(1000000).Execute(); + + result = table.Select().GroupBy("age").Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(5)); + + // GroupBy with null. + result = table.Select("id as ID", "name as Name", "age as Age").GroupBy(null).Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(7)); + + result = table.Select("id as ID", "name as Name", "age as Age").GroupBy(null, null).Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(7)); + + result = table.Select("id as ID", "name as Name", "age as Age").GroupBy(null, "age").Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(5)); + + // Having operation. + // Having reduces the original 5 rows to 3 since 2 rows have a cnt=2, due to the repeated names. + result = table.Select("id", "count(name) as cnt", "age").GroupBy("age").Having("cnt = 1").Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(3)); + + // Having with null. + result = table.Select("id as ID", "count(name) as cnt", "age as Age").GroupBy("age").Having(null).Execute(); + Assert.That(result.FetchAll().Count, Is.EqualTo(5)); + + // GroupBy with invalid field name. + Exception ex = Assert.Throws(() => ExecuteSelectStatement(table.Select("id as ID", "name as Name", "age as Age").GroupBy("Required"))); + Assert.That(ex.Message, Is.EqualTo("Unknown column 'Required' in 'group statement'")); + + ex = Assert.Throws(() => ExecuteSelectStatement(table.Select("id as ID", "name as Name", "age as Age").GroupBy(""))); + Assert.That(ex.Message, Is.EqualTo("No more tokens when expecting one at token pos 0")); + + ex = Assert.Throws(() => ExecuteSelectStatement(table.Select("id as ID", "name as Name", "age as Age").GroupBy(" "))); + Assert.That(ex.Message, Is.EqualTo("No more tokens when expecting one at token pos 0")); + + ex = Assert.Throws(() => ExecuteSelectStatement(table.Select("id as ID", "name as Name", "age as Age").GroupBy(string.Empty))); + Assert.That(ex.Message, Is.EqualTo("No more tokens when expecting one at token pos 0")); + + ex = Assert.Throws(() => ExecuteSelectStatement(table.Select("id as ID", "count(name) as cnt", "age as Age").GroupBy("age").Having("Required = 1"))); + Assert.That(ex.Message, Is.EqualTo("Unknown column 'Required' in 'having clause'")); + + ex = Assert.Throws(() => ExecuteSelectStatement(table.Select("id as ID", "count(name) as cnt", "age as Age").GroupBy("age").Having(""))); + Assert.That(ex.Message, Is.EqualTo("Unable to parse query ''")); + Assert.That(ex.InnerException.Message, Is.EqualTo("No more tokens when expecting one at token pos 0")); + + Assert.Throws(() => ExecuteSelectStatement(table.Select("id as ID", "count(name) as cnt", "age as Age").GroupBy("age").Having(" "))); + Assert.Throws(() => ExecuteSelectStatement(table.Select("id as ID", "count(name) as cnt", "age as Age").GroupBy("age").Having(string.Empty))); + } + + [Test, Description("Reading exclusively locked document in a table using lock_shared with DEFAULT waiting option.")] + public void ExclusiveLockBeforeSharedLockDefaultWaiting() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + session.SQL("DROP TABLE IF EXISTS test.test").Execute(); + session.SQL("CREATE TABLE test.test (id INT, a INT)").Execute(); + var table1 = testSchema.GetTable("test"); + table1.Insert("id", "a").Values(1, 1).Values(2, 2).Values(3, 3).Execute(); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + var table = session.Schema.GetTable("test"); + session.SQL("CREATE UNIQUE INDEX myIndex ON test.test (id)").Execute(); + var table2 = session2.GetSchema("test").GetTable("test"); + + session.SQL("START TRANSACTION").Execute(); + var rowResult = table.Select().Where("id = 1").LockExclusive().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + rowResult = table2.Select().Where("id = 2").LockShared(LockContention.Default).Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + // Session2 blocks due to to LockExclusive() not allowing to read locked documents. + session2.SQL("SET SESSION innodb_lock_wait_timeout=1").Execute(); + Assert.Throws(() => ExecuteSelectStatement(table2.Select().Where("id = 1").LockShared(LockContention.Default))); + + // Session2 blocks due to to LockExclusive() not allowing to modify locked documents. + Result result1; + Assert.Throws(() => result1 = table2.Update().Where("id = 1").Set("a", 2).Execute()); + + // Session2 returns immediately as session is committed. + session.Commit(); + var result = table2.Update().Where("id = 1").Set("a", 2).Execute(); + Assert.That((int)result.AffectedItemsCount, Is.EqualTo(1), "Matching the deleted record count"); + + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + } + + [Test, Description("Reading locked document(lock_shared) in a table using lock_shared with DEFAULT waiting option.")] + public void SharedLockDefaultWaiting() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + session.SQL("DROP TABLE IF EXISTS test.test").Execute(); + session.SQL("CREATE TABLE test.test (id INT, a INT)").Execute(); + var table1 = testSchema.GetTable("test"); + table1.Insert("id", "a").Values(1, 1).Values(2, 2).Values(3, 3).Execute(); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + var table = session.Schema.GetTable("test"); + var table2 = session2.GetSchema("test").GetTable("test"); + + session.SQL("START TRANSACTION").Execute(); + var rowResult = table.Select().Where("id = 1").LockShared().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + rowResult = table2.Select().Where("id = 2").LockShared(LockContention.Default).Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + session2.SQL("SET SESSION innodb_lock_wait_timeout=1").Execute(); + rowResult = table2.Select().Where("id = 1").LockShared(LockContention.Default).Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + // Session2 blocks due to to LockShared() not allowing to modify locked documents. + Result result1; + Assert.Throws(() => result1 = table2.Update().Where("id = 1").Set("a", 2).Execute()); + + // Session2 returns immediately as session is committed. + session.Commit(); + var result = table2.Update().Where("id = 1").Set("a", 2).Execute(); + + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + } + + [Test,Description("Reading exclusively locked document in a table using lock_exclusive with DEFAULT waiting option ")] + public void OnlyExclusiveLocksWithDefaultWaiting() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + session.SQL("DROP TABLE IF EXISTS test.test").Execute(); + session.SQL("CREATE TABLE test.test (id INT, a INT)").Execute(); + var table1 = testSchema.GetTable("test"); + table1.Insert("id", "a").Values(1, 1).Values(2, 2).Values(3, 3).Execute(); + using (var session2 = MySQLX.GetSession(ConnectionString)) + { + var table = session.Schema.GetTable("test"); + session.SQL("CREATE UNIQUE INDEX myIndex ON test.test (id)").Execute(); + var table2 = session2.GetSchema("test").GetTable("test"); + + session.SQL("START TRANSACTION").Execute(); + var rowResult = table.Select().Where("id = 1").LockExclusive().Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + session2.SQL("START TRANSACTION").Execute(); + // Should return immediately since document isn't locked. + rowResult = table2.Select().Where("id = 2").LockExclusive(LockContention.Default).Execute(); + Assert.That(rowResult.FetchAll().Count, Is.EqualTo(1), "Matching the document ID"); + + // Session2 blocks due to to LockExclusive() not allowing to read locked documents. + session2.SQL("SET SESSION innodb_lock_wait_timeout=1").Execute(); + Assert.Throws(() => ExecuteSelectStatement(table2.Select().Where("id = 1").LockExclusive(LockContention.Default))); + + // Session2 blocks due to to LockExclusive() not allowing to modify locked documents. + Result result1; + Assert.Throws(() => result1 = table2.Update().Where("id = 1").Set("a", 2).Execute()); + + // Session2 returns immediately as session is committed. + session.Commit(); + var result = table2.Update().Where("id = 1").Set("a", 2).Execute(); + session.SQL("ROLLBACK").Execute(); + session2.SQL("ROLLBACK").Execute(); + } + } + + #endregion WL14389 + + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/ViewTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/ViewTests.cs new file mode 100644 index 000000000..40903ff04 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/RelationalTests/ViewTests.cs @@ -0,0 +1,258 @@ +// Copyright © 2016, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI.Relational; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System.Collections.Generic; +using System.Linq; +using MySqlX.XDevAPI; +using System; + +namespace MySqlX.Data.Tests.RelationalTests +{ + public class ViewTests : BaseTest + { + [TearDown] + public void TearDown() + { + ExecuteSQL("DROP TABLE IF EXISTS test"); + ExecuteSQL("DROP view IF EXISTS view1"); + ExecuteSQL("DROP view IF EXISTS view2"); + } + + [Test] + public void TryUpdatingView() + { + ExecuteSQL("CREATE TABLE test(id int)"); + ExecuteSQL("CREATE VIEW view2 AS select *, 1 from test"); + + List
tables = testSchema.GetTables(); + Assert.That(tables.Count, Is.EqualTo(2)); + + Table view = tables.First(i => i.IsView); + Assert.That(view.Name, Is.EqualTo("view2")); + MySqlException ex = Assert.Throws(() => ExecuteInsertStatement(view.Insert().Values(1))); + Assert.That(ex.Message, Is.EqualTo("Column '1' is not updatable")); + } + + [Test] + public void GetView() + { + ExecuteSQL("CREATE TABLE test(id int)"); + ExecuteSQL("CREATE VIEW view1 AS select *, 1 from test"); + + Table table = testSchema.GetTable("test"); + Table view = testSchema.GetTable("view1"); + Assert.That(view.IsView); + Assert.That(table.IsView, Is.False); + + ExecuteSQL("DROP VIEW view1"); + } + + [Test] + public void NonExistingView() + { + bool isView; + void IsView() { isView = testSchema.GetTable("no_exists").IsView; }; + Assert.Throws(() => IsView()); + } + + #region WL14389 + [Test, Description("Test MySQLX plugin MySQL Net 839 - Views-Get Table with param")] + public void CreateJoinAndGetTableValidation() + { + CreateCollection("coll"); + ExecuteSQL("CREATE TABLE test1(id1 int,firstname varchar(20))"); + ExecuteSQL("INSERT INTO test1 values ('1','Rob')"); + ExecuteSQL("INSERT INTO test1 values ('2','Steve')"); + ExecuteSQL("CREATE TABLE test2(id2 int,lastname varchar(20))"); + ExecuteSQL("INSERT INTO test2 values ('1','Williams')"); + ExecuteSQL("INSERT INTO test2 values ('2','Waugh')"); + ExecuteSQL("CREATE VIEW view1 AS select * from test.test1"); + ExecuteSQL("SELECT * FROM view1"); + ExecuteSQL("CREATE VIEW view2 AS select * from test.test2"); + + var tables = testSchema.GetTables(); + Assert.That(tables.Count == 4, Is.EqualTo(true), "Match being done"); + Assert.That(tables.Count(i => !i.IsView), Is.EqualTo(2), "Match being done when isview not true"); + Assert.That(tables.Count(i => i.IsView), Is.EqualTo(2), "Match being done when isview true"); + List colls = testSchema.GetCollections(); + Assert.That(colls.Count, Is.EqualTo(1), "Match being done"); + var view1 = testSchema.GetTable("view1"); + Assert.That(view1.IsView); + + //Valid Scenario-1 + view1.Select().Execute(); + var result = testSchema.GetTable("test1").Update().Set("firstname", "Peter").Where("id1=1").Execute(); + result = view1.Update().Set("firstname", "Rob").Where("id1=1").Execute(); + result = view1.Insert("id1", "firstname").Values("3", "Mark").Execute(); + result = view1.Delete().Where("id1=3").Execute(); + ExecuteSQL("ALTER VIEW view1 AS select * from test.test2"); + result = testSchema.GetTable("test2").Update().Set("lastname", "Morgan").Where("id2=1").Execute(); + result = view1.Update().Set("lastname", "Williams").Where("id2=1").Execute(); + result = view1.Insert("id2", "lastname").Values("3", "Twain").Execute(); + result = view1.Delete().Where("id2=3").Execute(); + + //Join Two Views Scenario-2 + ExecuteSQL( + "CREATE VIEW myView AS SELECT a.ID1 as a_tID,b.ID2 as b_tID, a.firstname as a_firstname, " + + "b.lastname as b_lastname FROM test1 a JOIN test2 b ON a.ID1=b.ID2;"); + var joinedview = testSchema.GetTable("myView"); + Assert.That(joinedview.IsView); + + joinedview.Select().Execute(); + result = joinedview.Update().Set("a_firstname", "Peter").Where("a_tID=1").Execute(); + result = joinedview.Update().Set("a_firstname", "Rob").Where("a_tID=1").Execute(); + result = joinedview.Insert("a_tID", "a_firstname").Values("3", "Mark").Execute(); + result = joinedview.Insert("b_tID", "b_lastname").Values("3", "Twain").Execute(); + + Assert.Throws(() => joinedview.Delete().Where("a_tID=3").Where("b_tID=3").Execute()); + + //Valid View - Invalid Select/Insert/Update Statements-Scenario-3 + var view2 = testSchema.GetTable("view2"); + Assert.That(view2.IsView); + + Assert.Throws(() => view2.Select("id2", "age").Execute()); + + view2.Select().Execute(); + Assert.Throws(() => view2.Update().Set("firstname", "Rob").Where("id2=100").Execute()); + view2.Select().Execute(); + Assert.Throws(() => view2.Insert("id2", "firstname").Values("3", "Mark").Execute()); + + view2.Select().Execute(); + var res = view2.Delete().Where("id2=100").Execute(); + Assert.That(res.AffectedItemsCount, Is.EqualTo(0), "View2-Not Possible to remove an invalid record"); + + //View Doesn't Exist-Scenario-4 + var view3 = testSchema.GetTable("view3"); + Assert.Throws(() => view3.Select().Execute()); + + //View Passed as Null-Scenario-5 + view3 = testSchema.GetTable(null); + Assert.Throws(() => view3.Select().Execute()); + + //View Passed as Null-Scenario-6 + var view4 = testSchema.GetTable("test1"); + Assert.That(view4.IsView, Is.False); + + //Change the query processing env-Scenario-7 + ExecuteSQL("SET sql_mode = '';"); + var result_view = view1.Select().Execute(); + session.SQL("Drop table if exists test1").Execute(); + session.SQL("Drop table if exists test2").Execute(); + session.SQL("Drop view if exists view1").Execute(); + session.SQL("Drop view if exists view2").Execute(); + session.SQL("Drop view if exists myView").Execute(); + } + + [Test, Description("Test MySQLX plugin MySQL Net 839 - Views-Get Tables")] + public void ViewsGetTables() + { + CreateCollection("coll"); + ExecuteSQL("CREATE TABLE test1(id1 int,firstname varchar(20))"); + ExecuteSQL("INSERT INTO test1 values ('1','Rob')"); + ExecuteSQL("INSERT INTO test1 values ('2','Steve')"); + ExecuteSQL("CREATE TABLE test2(id2 int,lastname varchar(20))"); + ExecuteSQL("INSERT INTO test2 values ('1','Williams')"); + ExecuteSQL("INSERT INTO test2 values ('2','Waugh')"); + ExecuteSQL("CREATE VIEW view1 AS select * from test.test1"); + ExecuteSQL("SELECT * FROM view1"); + ExecuteSQL("CREATE VIEW view2 AS select * from test.test2"); + ExecuteSQL("SELECT * FROM view2"); + var tables = testSchema.GetTables(); + Assert.That(tables.Count >= 4, "Match being done"); + Assert.That(tables.Count(i => !i.IsView), Is.EqualTo(2), "Match being done when isview not true"); + Assert.That(tables.Count(i => i.IsView), Is.EqualTo(2), "Match being done when isview true"); + List colls = testSchema.GetCollections(); + Assert.That(colls.Count, Is.EqualTo(1), "Match being done"); + + var view1 = tables[2]; + Assert.That(view1.IsView); + //Valid Scenario-1 + view1.Select().Execute(); + + var result = testSchema.GetTable("test1").Update().Set("firstname", "Peter").Where("id1=1").Execute(); + result = tables[2].Update().Set("firstname", "Rob").Where("id1=1").Execute(); + result = tables[2].Insert("id1", "firstname").Values("3", "Mark").Execute(); + result = tables[2].Delete().Where("id1=3").Execute(); + ExecuteSQL("ALTER VIEW view1 AS select * from test.test2"); + result = testSchema.GetTable("test2").Update().Set("lastname", "Morgan").Where("id2=1").Execute(); + result = tables[2].Update().Set("lastname", "Williams").Where("id2=1").Execute(); + result = tables[2].Insert("id2", "lastname").Values("3", "Twain").Execute(); + result = tables[2].Delete().Where("id2=3").Execute(); + + //Join Two Views Scenario-2 + ExecuteSQL( + "CREATE VIEW myView AS SELECT a.ID1 as a_tID,b.ID2 as b_tID, a.firstname as a_firstname, " + + "b.lastname as b_lastname FROM test1 a JOIN test2 b ON a.ID1=b.ID2;"); + var joinedview = testSchema.GetTables(); + Assert.That(joinedview[0].IsView); + joinedview[0].Select().Execute(); + result = joinedview[0].Update().Set("a_firstname", "Peter").Where("a_tID=1").Execute(); + result = joinedview[0].Update().Set("a_firstname", "Rob").Where("a_tID=1").Execute(); + result = joinedview[0].Insert("a_tID", "a_firstname").Values("3", "Mark").Execute(); + result = joinedview[0].Insert("b_tID", "b_lastname").Values("3", "Twain").Execute(); + + Assert.Throws(() => joinedview[0].Delete().Where("a_tID=3").Where("b_tID=3").Execute()); + + ExecuteSQL("DROP VIEW " + joinedview[0].Name); + //Valid View - Invalid Select/Insert/Update Statements-Scenario-3 + var view2 = testSchema.GetTables(); + Assert.That(view2[3].IsView); + + Assert.Throws(() => view2[3].Select("id2", "age").Execute()); + + view2[3].Select().Execute(); + Assert.Throws(() => view2[3].Update().Set("firstname", "Rob").Where("id2=100").Execute()); + + view2[3].Select().Execute(); + Assert.Throws(() => view2[3].Insert("id2", "firstname").Values("3", "Mark").Execute()); + + view2[3].Select().Execute(); + var res = view2[3].Delete().Where("id2=100").Execute(); + //WL11843-Core API v1 alignment Changes + Assert.That(res.AffectedItemsCount, Is.EqualTo(0)); + + //Change the query processing env-Scenario-5 + ExecuteSQL("SET sql_mode = '';"); + var result_view = view1.Select().Execute(); + + ExecuteSQL("DROP TABLE test1"); + ExecuteSQL("DROP TABLE test2"); + ExecuteSQL("DROP VIEW view1"); + ExecuteSQL("DROP VIEW view2"); + //GetTables when there no tables/views -Scenario-4 + var view3 = testSchema.GetTables(); + Assert.That(view3.Count(), Is.EqualTo(0)); + } + #endregion WL14389 + + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/Resources.Designer.cs b/MySQL.Data/tests/MySqlX.Data.Tests/Resources.Designer.cs new file mode 100644 index 000000000..139f343d3 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/Resources.Designer.cs @@ -0,0 +1,98 @@ +//------------------------------------------------------------------------------ +// +// 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 MySqlX.Data.Tests { + using System; + using System.Reflection; + + + /// + /// 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", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MySqlX.Data.Tests.Resources", typeof(Resources).GetTypeInfo().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)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to DROP SCHEMA IF EXISTS `{0}`; + ///CREATE SCHEMA `{0}`; + ///USE `{0}`; + /// + ///CREATE TABLE `{1}` ( + /// `employee_id` INT NOT NULL AUTO_INCREMENT, + /// `name` VARCHAR(450) NOT NULL, + /// `age` TINYINT UNSIGNED NULL, + /// PRIMARY KEY (`employee_id`)); + /// + ///INSERT INTO `{1}` + ///(`name`, `age`) + ///VALUES + ///('jonh doe', 38); + /// + ///INSERT INTO `{1}` + ///(`name`, `age`) + ///VALUES + ///('milton green', 45); + /// + /// + ///CREATE TABLE `{2}` ( + /// `employee_id` INT NOT NULL AUTO_INCREMENT, + /// `name` VARCHAR(450) NOT NULL, + /// `age` TINYINT UNSIGNED NULL, + /// PRIMARY [rest of string was truncated]";. + /// + public static string TableScripts { + get { + return ResourceManager.GetString("TableScripts", resourceCulture); + } + } + } +} diff --git a/Tests/MySqlX.Data.Tests/Resources.resx b/MySQL.Data/tests/MySqlX.Data.Tests/Resources.resx similarity index 100% rename from Tests/MySqlX.Data.Tests/Resources.resx rename to MySQL.Data/tests/MySqlX.Data.Tests/Resources.resx diff --git a/Tests/MySqlX.Data.Tests/Resources/TableScripts.txt b/MySQL.Data/tests/MySqlX.Data.Tests/Resources/TableScripts.txt similarity index 100% rename from Tests/MySqlX.Data.Tests/Resources/TableScripts.txt rename to MySQL.Data/tests/MySqlX.Data.Tests/Resources/TableScripts.txt diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/SchemaTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/SchemaTests.cs new file mode 100644 index 000000000..601db8a74 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/SchemaTests.cs @@ -0,0 +1,298 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Common; +using MySqlX.XDevAPI.Relational; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace MySqlX.Data.Tests +{ + public class SchemaTests : BaseTest + { + [TearDown] + public void TearDown() => ExecuteSQL("DROP TABLE IF EXISTS test"); + [Test] + public void GetSchemas() + { + Session session = GetSession(); + List schemas = session.GetSchemas(); + + Assert.That(schemas.Exists(s => s.Name == base.testSchema.Name)); + + Schema schema = session.GetSchema(schemaName); + Assert.That(schema.Name, Is.EqualTo(schemaName)); + schema = session.GetSchema(null); + Assert.That(schema.Name, Is.Null); + } + + [Test] + public void GetInvalidSchema() + { + Session s = GetSession(); + Schema schema = s.GetSchema("test-schema"); + Assert.That(SchemaExistsInDatabase(schema), Is.False); + } + + [Test] + public void GetAllTables() + { + ExecuteSQL("DROP TABLE IF EXISTS test"); + ExecuteSQL("CREATE TABLE test(id int)"); + + List
tables = testSchema.GetTables(); + Assert.That(tables.Count == 1); + } + + [Test] + public void GetAllViews() + { + CreateCollection("coll"); + + ExecuteSQL("DROP TABLE IF EXISTS test"); + ExecuteSQL("CREATE TABLE test(id int)"); + ExecuteSQL("CREATE VIEW view1 AS select * from test"); + ExecuteSQL("CREATE VIEW view2 AS select * from test"); + + List
tables = testSchema.GetTables(); + Assert.That(tables.Count, Is.EqualTo(3)); + Assert.That(tables.Count(i => !i.IsView), Is.EqualTo(1)); + Assert.That(tables.Count(i => i.IsView), Is.EqualTo(2)); + + List colls = testSchema.GetCollections(); + Assert.That(colls, Has.One.Items); + } + + [Test] + [Ignore("Fix for 8.0.13")] + public void GetCollectionAsTable() + { + Collection testCollection = CreateCollection("test"); + + Result r = ExecuteAddStatement(testCollection.Add(@"{ ""_id"": 1, ""foo"": 1 }")); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + + Table test = testSchema.GetCollectionAsTable("test"); + Assert.That(TableExistsInDatabase(test)); + + RowResult result = ExecuteSelectStatement(test.Select("_id")); + Assert.That(result.Next()); + Assert.That(result[0], Is.EqualTo("1")); + } + + [Test] + public void DropSchema() + { + string schemaName = "testDrop"; + Session session = GetSession(); + session.CreateSchema(schemaName); + Schema schema = session.GetSchema(schemaName); + Assert.That(SchemaExistsInDatabase(schema)); + + // Drop existing schema. + session.DropSchema(schemaName); + Assert.That(SchemaExistsInDatabase(schema), Is.False); + + // Drop non-existing schema. + session.DropSchema(schemaName); + Assert.That(SchemaExistsInDatabase(schema), Is.False); + + // Empty, whitespace and null schema name. + Assert.Throws(() => session.DropSchema(string.Empty)); + Assert.Throws(() => session.DropSchema(" ")); + Assert.Throws(() => session.DropSchema(" ")); + Assert.Throws(() => session.DropSchema(null)); + } + + #region WL14389 + + [Test, Description("Test MySQLX plugin Exception Handling Scenario 1")] + public void ExceptionHandlingSchema() + { + Session sessionPlain = MySQLX.GetSession(ConnectionString); + sessionPlain.DropSchema("test1"); + var db = sessionPlain.CreateSchema("test1"); + db = sessionPlain.GetSchema("test1"); + if (db.ExistsInDatabase()) + { + sessionPlain.DropSchema("test1"); + db = sessionPlain.CreateSchema("test1"); + db.DropCollection("test"); + var coll = db.CreateCollection("test"); + var res = coll.Add("{\"_id\":null,\"FLD1\":\"nulldata\"}").Execute(); + var docIds = res.GeneratedIds.Count; + + var docs = coll.Find("$.FLD1 == 'nulldata'").Execute(); + while (docs.Next()) + { + Assert.Throws(() => docs.Current["_id"].ToString()); + } + } + else { db = sessionPlain.CreateSchema("test1"); } + Assert.Throws(() => sessionPlain.CreateSchema("test1")); + sessionPlain.SQL(@"drop database if exists test1;").Execute(); + + sessionPlain.SQL(@"drop database if exists `test\84`;").Execute(); + db = sessionPlain.CreateSchema("test\\84"); + + sessionPlain.SQL(@"drop database if exists `test\84`;").Execute(); + db = sessionPlain.CreateSchema(@"test\84"); + + sessionPlain.SQL(@"drop database if exists `test\84`;").Execute(); + } + + [Test, Description("Test MySQLX plugin Exception Handling Scenario 2")] + public void ExceptionHandlingCollection() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + + Session sessionPlain = MySQLX.GetSession(ConnectionString); + + if (sessionPlain.GetSchema("test_collection_123456789").ExistsInDatabase()) + { + sessionPlain.DropSchema("test_collection_123456789"); + } + var db = sessionPlain.CreateSchema("test_collection_123456789"); + if (db.GetCollection("my_collection_123456789").ExistsInDatabase()) + { + db.DropCollection("my_collection_123456789"); + } + db.CreateCollection("my_collection_123456789"); + Assert.Throws(() => db.CreateCollection("my_collection_123456789")); + + sessionPlain.DropSchema("test_collection_123456789"); + } + + [Test, Description("GetSession Create Schema Valid Name(Session and Session)")] + public void CreateValidSchema() + { + Schema db = session.GetSchema("test_123456789"); + if (db.ExistsInDatabase()) + { + session.DropSchema("test_123456789"); + db = session.CreateSchema("test_123456789"); + } + else { db = session.CreateSchema("test_123456789"); } + Assert.That(db.ExistsInDatabase()); + Assert.Throws(() => session.CreateSchema("test_123456789")); + session.DropSchema("test_123456789"); + Assert.Throws(() => session.CreateSchema("test_123456789_123456789_123456789_123456789_123456789_123456789_123456789_123456789")); + Assert.Throws(() => session.CreateSchema(null)); + } + + [Test, Description("Set Node Schema")] + public void SessionSetSchema() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + if (!session.GetSchema("test1").ExistsInDatabase()) + session.CreateSchema("test1"); + Assert.DoesNotThrow(() => session.SetCurrentSchema("test1")); + Assert.That(session.Schema.Name, Is.EqualTo("test1")); + // Retry the same schema + Assert.DoesNotThrow(() => session.SetCurrentSchema("test1")); + Assert.That(session.Schema.Name, Is.EqualTo("test1")); + session.Schema.CreateCollection("my_collection_123456789"); + session.Schema.DropCollection("my_collection_123456789"); + //Exceptions + Assert.Throws(() => session.SQL("USE nonExistingSchema").Execute()); + Assert.Throws(() => session.SetCurrentSchema("nonExistingSchema")); + Assert.Throws(() => session.SetCurrentSchema(null)); + session.DropSchema("test1"); + //No Active Schema + using (Session sessionPlain = MySQLX.GetSession(ConnectionString)) + { + Assert.That(sessionPlain.GetCurrentSchema(), Is.Null); + } + } + + [Test, Description("Session Status before Execution - Negative")] + public void SessionClosedBeforeExecution() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + Schema schema = null; + Session sessionPlain = MySQLX.GetSession(ConnectionString); + schema = sessionPlain.GetSchema(schemaName); + schema.CreateCollection("test123"); + schema.DropCollection("test123"); + sessionPlain.Close(); + Assert.Throws(() => schema.CreateCollection("test123")); + sessionPlain.Dispose(); + } + + [Test, Description("Session Switch-SetCurrentSchema(Same and Different Session)")] + public void SessionChangeCurrentSchema() + { + using (Session session = MySQLX.GetSession(ConnectionString)) + { + session.SQL("DROP DATABASE IF EXISTS dbname1").Execute(); + session.SQL("CREATE DATABASE dbname1").Execute(); + session.SQL("USE dbname1").Execute(); + Assert.That(session.GetCurrentSchema().Name, Is.EqualTo("dbname1").IgnoreCase); + session.SQL("CREATE TABLE address1" + + "(address_number INT NOT NULL AUTO_INCREMENT, " + + "building_name VARCHAR(100) NOT NULL, " + + "district VARCHAR(100) NOT NULL, PRIMARY KEY (address_number)" + ");").Execute(); + session.SQL("INSERT INTO address1" + + "(address_number,building_name,district)" + + " VALUES " + + "(1,'MySQL1','BGL1');").Execute(); + + session.SQL("DROP DATABASE IF EXISTS dbname2").Execute(); + session.SQL("CREATE DATABASE dbname2").Execute(); + session.SQL("USE dbname2").Execute(); + Assert.That(session.GetCurrentSchema().Name, Is.EqualTo("dbname2").IgnoreCase); + session.SQL("CREATE TABLE address2" + + "(address_number INT NOT NULL AUTO_INCREMENT, " + + "building_name VARCHAR(100) NOT NULL, " + + "district VARCHAR(100) NOT NULL, PRIMARY KEY (address_number)" + ");").Execute(); + session.SQL("INSERT INTO address2" + + "(address_number,building_name,district)" + + " VALUES " + + "(2,'MySQL2','BGL2');").Execute(); + session.SetCurrentSchema("dbname1"); + Assert.That(session.Schema.Name, Is.EqualTo("dbname1")); + session.SQL("SELECT * FROM address1").Execute(); + session.SQL("DROP TABLE address1").Execute(); + session.SetCurrentSchema("dbname2"); + Assert.That(session.Schema.Name, Is.EqualTo("dbName2").IgnoreCase); + session.SQL("SELECT * FROM address2").Execute(); + session.SQL("DROP TABLE address2").Execute(); + session.SQL("DROP DATABASE dbname1").Execute(); + session.SQL("DROP DATABASE dbname2").Execute(); + session.Close(); + session.Dispose(); + } + } + #endregion WL14389 + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/SessionTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/SessionTests.cs new file mode 100644 index 000000000..d1fe27a25 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/SessionTests.cs @@ -0,0 +1,2519 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data; +using MySql.Data.Common; +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Relational; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Data; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MySqlX.Data.Tests +{ + public class SessionTests : BaseTest + { + [Test] + [Property("Category", "Security")] + public void CanCloseSession() + { + Session s = MySQLX.GetSession(ConnectionString); + Assert.That(s.InternalSession.SessionState == SessionState.Open); + s.Close(); + Assert.That(SessionState.Closed, Is.EqualTo(s.InternalSession.SessionState)); + } + + [Test] + [Property("Category", "Security")] + public void NoPassword() + { + Session session = MySQLX.GetSession(ConnectionStringNoPassword); + Assert.That(session.InternalSession.SessionState == SessionState.Open); + session.Close(); + Assert.That(SessionState.Closed, Is.EqualTo(session.InternalSession.SessionState)); + } + + [Test] + [Property("Category", "Security")] + public void SessionClose() + { + Session session = MySQLX.GetSession(ConnectionString); + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + session.Close(); + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Closed)); + } + + [Test] + [Property("Category", "Security")] + [Ignore("Check this. Result is not always the same")] + public void CountClosedSession() + { + int sessions, newSessions; + + using (Session nodeSession = MySQLX.GetSession(ConnectionString)) + { + sessions = ExecuteSQLStatement(nodeSession.SQL("show processlist")).FetchAll().Count; + + for (int i = 0; i < 20; i++) + { + Session session = MySQLX.GetSession(ConnectionString); + Assert.That(session.InternalSession.SessionState == SessionState.Open); + session.Close(); + Assert.That(SessionState.Closed, Is.EqualTo(session.InternalSession.SessionState)); + } + + newSessions = ExecuteSQLStatement(nodeSession.SQL("show processlist")).FetchAll().Count; + } + + Assert.That(newSessions, Is.EqualTo(sessions)); + } + + [Test] + [Property("Category", "Security")] + public void ConnectionStringAsAnonymousType() + { + var connstring = new + { + server = session.Settings.Server, + port = session.Settings.Port, + user = session.Settings.UserID, + password = session.Settings.Password + }; + + using (var testSession = MySQLX.GetSession(connstring)) + { + Assert.That(testSession.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + + [Test] + [Property("Category", "Security")] + public void SessionGetSetCurrentSchema() + { + using (Session testSession = MySQLX.GetSession(ConnectionString)) + { + Assert.That(testSession.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(testSession.GetCurrentSchema(), Is.Null); + Assert.Throws(() => testSession.SetCurrentSchema("")); + testSession.SetCurrentSchema(schemaName); + Assert.That(testSession.Schema.Name, Is.EqualTo(schemaName)); + Assert.That(testSession.GetCurrentSchema().Name, Is.EqualTo(schemaName)); + } + } + + [Test] + [Property("Category", "Security")] + public void SessionUsingSchema() + { + using (Session mySession = MySQLX.GetSession(ConnectionString + $";database={schemaName};")) + { + Assert.That(mySession.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(mySession.Schema.Name, Is.EqualTo(schemaName)); + Assert.That(mySession.GetCurrentSchema().Name, Is.EqualTo(schemaName)); + Assert.That(SchemaExistsInDatabase(mySession.Schema)); + } + } + + [Test] + [Property("Category", "Security")] + public void SessionUsingDefaultSchema() + { + using (Session mySession = MySQLX.GetSession(ConnectionString + $";database={schemaName};")) + { + Assert.That(mySession.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(mySession.DefaultSchema.Name, Is.EqualTo(schemaName)); + Assert.That(mySession.GetCurrentSchema().Name, Is.EqualTo(schemaName)); + Assert.That(mySession.Schema.ExistsInDatabase()); + mySession.SetCurrentSchema("mysql"); + Assert.That(mySession.Schema.Name, Is.Not.EqualTo(mySession.DefaultSchema.Name)); + } + + // DefaultSchema is null because no database was provided in the connection string/URI. + using (Session mySession = MySQLX.GetSession(ConnectionString)) + { + Assert.That(mySession.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(mySession.DefaultSchema, Is.Null); + } + } + + [Test] + [Property("Category", "Security")] + public void SessionUsingDefaultSchemaWithAnonymousObject() + { + var globalSession = GetSession(); + + using (var internalSession = MySQLX.GetSession(new + { + server = globalSession.Settings.Server, + port = globalSession.Settings.Port, + user = globalSession.Settings.UserID, + password = globalSession.Settings.Password, + sslmode = MySqlSslMode.Required, + database = "mysql" + })) + { + Assert.That(internalSession.DefaultSchema.Name, Is.EqualTo("mysql")); + } + + // DefaultSchema is null when no database is provided. + using (var internalSession = MySQLX.GetSession(new + { + server = globalSession.Settings.Server, + port = globalSession.Settings.Port, + user = globalSession.Settings.UserID, + password = globalSession.Settings.Password, + sslmode = MySqlSslMode.Required, + })) + { + Assert.That(internalSession.DefaultSchema, Is.Null); + } + + // Access denied error is raised when database does not exist for servers 8.0.12 and below. + // This behavior was fixed since MySql Server 8.0.13 version. Now the error + // shows the proper message, "Unknown database..." + if (session.InternalSession.GetServerVersion().isAtLeast(8, 0, 13)) return; + var exception = Assert.Throws(() => MySQLX.GetSession(new + { + server = globalSession.Settings.Server, + port = globalSession.Settings.Port, + user = globalSession.Settings.UserID, + password = globalSession.Settings.Password, + sslmode = MySqlSslMode.Required, + database = "test1" + } + )); + + if (session.InternalSession.GetServerVersion().isAtLeast(8, 0, 13)) + Assert.That(exception.Message, Does.StartWith(string.Format("Unknown database 'test1'"))); + else + Assert.That(exception.Message, Does.StartWith(string.Format("Access denied"))); + } + + [Test] + [Property("Category", "Security")] + public void SessionUsingDefaultSchemaWithConnectionURI() + { + using (var session = MySQLX.GetSession(ConnectionStringUri + "?database=mysql")) + { + Assert.That(session.DefaultSchema.Name, Is.EqualTo("mysql")); + } + } + + [Test] + [Property("Category", "Security")] + public void CheckConnectionUri() + { + CheckConnectionData($"mysqlx://myuser:password@{Host}:{XPort}", "myuser", "password", Host, uint.Parse(XPort)); + CheckConnectionData($"mysqlx://my%3Auser:p%40ssword@{Host}:{XPort}", "my:user", "p@ssword", Host, uint.Parse(XPort)); + CheckConnectionData($"mysqlx://my%20user:p%40ss%20word@{Host}:{XPort}", "my user", "p@ss word", Host, uint.Parse(XPort)); + CheckConnectionData($"mysqlx:// myuser : p%40ssword@{Host}:{XPort}", "myuser", "p@ssword", Host, uint.Parse(XPort)); + CheckConnectionData($"mysqlx://myuser@{Host}:{XPort}", "myuser", "", Host, uint.Parse(XPort)); + CheckConnectionData($"mysqlx://myuser:p%40ssword@{Host}", "myuser", "p@ssword", Host, uint.Parse(XPort)); + CheckConnectionData($"mysqlx://myuser:p%40ssw%40rd@{Host}", "myuser", "p@ssw@rd", Host, uint.Parse(XPort)); + CheckConnectionData($"mysqlx://my%40user:p%40ssword@{Host}", "my@user", "p@ssword", Host, uint.Parse(XPort)); + CheckConnectionData($"mysqlx://myuser@{Host}", "myuser", "", Host, uint.Parse(XPort)); + CheckConnectionData($"mysqlx://myuser@{Host}", "myuser", "", Host, uint.Parse(XPort)); + CheckConnectionData("mysqlx://myuser@[::1]", "myuser", "", "[::1]", uint.Parse(XPort)); + CheckConnectionData("mysqlx://myuser:password@[2606:b400:440:1040:bd41:e449:45ee:2e1a]", "myuser", "password", "[2606:b400:440:1040:bd41:e449:45ee:2e1a]", uint.Parse(XPort)); + CheckConnectionData($"mysqlx://myuser:password@[2606:b400:440:1040:bd41:e449:45ee:2e1a]:{XPort}", "myuser", "password", "[2606:b400:440:1040:bd41:e449:45ee:2e1a]", uint.Parse(XPort)); + Assert.Throws(() => CheckConnectionData("mysqlx://myuser:password@[2606:b400:440:1040:bd41:e449:45ee:2e1a:33060]", "myuser", "password", "[2606:b400:440:1040:bd41:e449:45ee:2e1a]", uint.Parse(XPort))); + Assert.Throws(() => CheckConnectionData($"mysqlx://myuser:password@2606:b400:440:1040:bd41:e449:45ee:2e1a:{XPort}", "myuser", "password", "[2606:b400:440:1040:bd41:e449:45ee:2e1a]", uint.Parse(XPort))); + CheckConnectionData("mysqlx://myuser:password@[fe80::bd41:e449:45ee:2e1a%17]", "myuser", "password", "[fe80::bd41:e449:45ee:2e1a]", uint.Parse(XPort)); + CheckConnectionData("mysqlx://myuser:password@[(address=[fe80::bd41:e449:45ee:2e1a%17],priority=100)]", "myuser", "password", "[fe80::bd41:e449:45ee:2e1a]", uint.Parse(XPort)); + CheckConnectionData("mysqlx://myuser:password@[(address=[fe80::bd41:e449:45ee:2e1a%17]:3305,priority=100)]", "myuser", "password", "[fe80::bd41:e449:45ee:2e1a]", 3305); + Assert.Throws(() => CheckConnectionData("mysqlx://myuser:password@[(address=fe80::bd41:e449:45ee:2e1a%17,priority=100)]", "myuser", "password", "[fe80::bd41:e449:45ee:2e1a]", 33060)); + CheckConnectionData("mysqlx://myuser@localhost/test", "myuser", "", "localhost", 33060, "database", schemaName); +#if NET8_0_OR_GREATER + CheckConnectionData("mysqlx://myuser@localhost/test?ssl%20mode=disabled&connecttimeout=10", "myuser", "", "localhost", 33060, "database", schemaName, "ssl mode", "None", "connecttimeout", "10"); +#else + CheckConnectionData("mysqlx://myuser@localhost/test?ssl%20mode=disabled&connecttimeout=10", "myuser", "", "localhost", 33060, "database", schemaName, "ssl mode", "Disabled", "connecttimeout", "10"); +#endif + CheckConnectionData("mysqlx://_%21%22%23%24s%26%2F%3D-%25r@localhost", "_!\"#$s&/=-%r", "", "localhost", 33060); + CheckConnectionData("mysql://myuser@localhost", "", "", "", 33060); + CheckConnectionData("myuser@localhost", "", "", "", 33060); + Assert.Throws(() => CheckConnectionData("mysqlx://uid=myuser;server=localhost", "", "", "", 33060)); + CheckConnectionData("mysqlx://user:password@server.example.com/", "user", "password", "server.example.com", 33060, "ssl mode", "Required"); + CheckConnectionData("mysqlx://user:password@server.example.com/?ssl-ca=(c:%5Cclient.pfx)", "user", "password", "server.example.com", 33060, "ssl mode", "Required", "ssl-ca", "c:\\client.pfx"); + Assert.Throws(() => CheckConnectionData("mysqlx://user:password@server.example.com/?ssl-crl=(c:%5Ccrl.pfx)", "user", "password", "server.example.com", 33060, "ssl mode", "Required", "ssl-crl", "(c:\\crl.pfx)")); + // tls-version + CheckConnectionData("mysqlx://myuser:password@localhost:33060?tls-version=TlSv1.2", "myuser", "password", "localhost", 33060, "tls-version", "Tls12"); + CheckConnectionData("mysqlx://myuser:password@localhost:33060?tls-version=TlS1.2", "myuser", "password", "localhost", 33060, "tls-version", "Tls12"); + CheckConnectionData("mysqlx://myuser:password@localhost:33060?tls-version=TlSv12", "myuser", "password", "localhost", 33060, "tls-version", "Tls12"); + CheckConnectionData("mysqlx://myuser:password@localhost:33060?tls-version=TlS12", "myuser", "password", "localhost", 33060, "tls-version", "Tls12"); + CheckConnectionData("mysqlx://myuser:password@localhost:33060?tls-version=[ TlSv1.2 ,tLsV11, TLSv1.0 , tls13 ]", "myuser", "password", "localhost", 33060, "tls-version", "Tls12, Tls13"); + CheckConnectionData("mysqlx://myuser:password@localhost:33060?tls-version=( TlSv1.2 ,tLsV11, TLSv1 , tls13 )", "myuser", "password", "localhost", 33060, "tls-version", "Tls12, Tls13"); + CheckConnectionData("mysqlx://myuser:password@localhost:33060?tls-version= TlSv1.2 ,tLsV11, TLSv10 , tls13", "myuser", "password", "localhost", 33060, "tls-version", "Tls12, Tls13"); + Assert.Throws(() => CheckConnectionData("mysqlx://myuser:password@localhost:33060?tls-version=SSL3", "myuser", "password", "localhost", 33060, "tls-version", "")); + } + + [Test] + [Property("Category", "Security")] + public void ConnectionUsingUri() + { + using (var session = MySQLX.GetSession(ConnectionStringUri)) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + + [Test] + [Property("Category", "Security")] + public void ConnectionStringNull() + { + Assert.Throws(() => MySQLX.GetSession(null)); + } + + [Test] + [Property("Category", "Security")] + public void IPv6() + { + var csBuilder = new MySqlXConnectionStringBuilder(ConnectionString); + csBuilder.Server = GetMySqlServerIp(true); + csBuilder.Port = uint.Parse(XPort); + + Assume.That(!string.IsNullOrEmpty(csBuilder.Server), "No IPv6 available."); + + using (var session = MySQLX.GetSession(csBuilder.ToString())) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + + [Test] + [Property("Category", "Security")] + public void IPv6AsUrl() + { + var csBuilder = new MySqlXConnectionStringBuilder(ConnectionString); + string ipv6 = GetMySqlServerIp(true); + Assume.That(!string.IsNullOrEmpty(ipv6), "No IPv6 available."); + + string connString = $"mysqlx://{csBuilder.UserID}:{csBuilder.Password}@[{ipv6}]:{XPort}"; + using (Session session = MySQLX.GetSession(connString)) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + + [Test] + [Property("Category", "Security")] + public void IPv6AsAnonymous() + { + var csBuilder = new MySqlXConnectionStringBuilder(ConnectionString); + string ipv6 = GetMySqlServerIp(true); + Assume.That(!string.IsNullOrEmpty(ipv6), "No IPv6 available."); + + using (Session session = MySQLX.GetSession(new { server = ipv6, user = csBuilder.UserID, password = csBuilder.Password, port = XPort })) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + + [Test] + [Property("Category", "Security")] + public void CreateSessionWithUnsupportedOptions() + { + var errorMessage = "Option not supported"; + var connectionUri = string.Format("{0}?", ConnectionStringUri); + + // Use a connection URI. + var ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "pipe=MYSQL")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "compress=true")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "allow batch=false")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "logging=true")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "sharedmemoryname=MYSQL")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "defaultcommandtimeout=30")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "usedefaultcommandtimeoutforef=true")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "persistsecurityinfo=false")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "encrypt=false")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "integratedsecurity=true")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "allowpublickeyretrieval=false")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "autoenlist=true")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "includesecurityasserts=false")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "allowzerodatetime=true")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "convert zero datetime=false")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "useusageadvisor=true")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "procedurecachesize=50")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "useperformancemonitor=true")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "respectbinaryflags=true")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "treat tiny as boolean=false")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "allowuservariables=true")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "interactive=false")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "functionsreturnstring=true")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "useaffectedrows=false")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "oldguids=true")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "sqlservermode=false")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "tablecaching=true")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "defaulttablecacheage=60")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "checkparameters=true")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "replication=replication_group")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "exceptioninterceptors=none")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "commandinterceptors=none")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "connectionlifetime=100")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "pooling=false")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "minpoolsize=0")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "maxpoolsize=20")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "connectionreset=false")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession(connectionUri + "cacheserverproperties=true")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + + // Use a connection string. + ex = Assert.Throws(() => MySQLX.GetSession("treatblobsasutf8=false")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession("blobasutf8includepattern=pattern")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => MySQLX.GetSession("blobasutf8excludepattern=pattern")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + } + + [Test] + [Property("Category", "Security")] + public void CreateBuilderWithUnsupportedOptions() + { + var errorMessage = "Option not supported"; + var ex = Assert.Throws(() => new MySqlXConnectionStringBuilder("pipe=MYSQL")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => new MySqlXConnectionStringBuilder("allow batch=false")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => new MySqlXConnectionStringBuilder("respectbinaryflags=true")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => new MySqlXConnectionStringBuilder("pooling=false")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => new MySqlXConnectionStringBuilder("cacheserverproperties=true")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + } + + [Test] + [Property("Category", "Security")] + public void GetUri() + { + using (var internalSession = MySQLX.GetSession(session.Uri)) + { + // Validate that all properties keep their original value. + foreach (var connectionOption in session.Settings.values) + { + // SslCrl connection option is skipped since it isn't currently supported. + if (connectionOption.Key == "sslcrl") + continue; + + try + { + Assert.That(internalSession.Settings[connectionOption.Key], Is.EqualTo(session.Settings[connectionOption.Key])); + } + catch (ArgumentException ex) + { + Assert.That(ex.Message, Does.StartWith("Option not supported.")); + } + } + } + } + + /// + /// WL #16033 Fix timeout tests + /// + [Test] + [Property("Category", "Security")] + [TestCase($"server=_server;user=test;password=test;port=_port;connect-timeout=0;", 0, 1000, true, true)] + [TestCase($"server=_server;user=test;password=test;port=_port;", 8, 25, true)] + [TestCase($"server=_server,server_;port=port_;user=test;password=test;", 0, 25, false)] + [TestCase($"server=_server;user=test;password=test;port=_port;connect-timeout=5000;", 3, 15, true)] + [TestCase($"mysqlx://test:test@[_server:_port]", 0, 25, true, false, true)] + public void ConnectionTimeout(string connstring,int min,int max,bool failure, bool usemockservertimeout=false, bool isUri=false) + { + MockServer mServer = new MockServer(usemockservertimeout); + mServer.StartServer(); + + if (failure) + { + if (isUri) + { + if (Uri.TryCreate(connstring, UriKind.Absolute, out _)) + { + TestConnectTimeoutFailureTimeout(connstring.Replace("_server", mServer.Address.ToString()).Replace("_port", mServer.Port.ToString()), min, max, "default timeout", usemockservertimeout); + } + else + { + mServer.StopServer(); + mServer.DisposeListener(); + Assert.Ignore("not parseable Uri: "+ connstring); + } + } + else + { + TestConnectTimeoutFailureTimeout(connstring.Replace("_server", mServer.Address.ToString()).Replace("_port", mServer.Port.ToString()), min, max, "default timeout", usemockservertimeout); + } + } + else + { + connstring = connstring.Replace("_server", mServer.Address.ToString()).Replace("_port", mServer.Port.ToString()).Replace("server_", Host).Replace("port_", XPort); + TestConnectTimeoutSuccessTimeout(connstring, min, max, "Fail over success"); + } + mServer.StopServer(); + mServer.DisposeListener(); + } + + /// + /// WL #12177 Implement connect timeout + /// + [Test] + [Property("Category", "Security")] + public void ConnectTimeoutParameterValidation() + { + Assume.That(!Platform.IsMacOSX(), "Check failure on MacOS: (() => MySQLX.GetSession(conn)); + TimeSpan diff = DateTime.Now.Subtract(start); + Assert.That(diff.TotalSeconds > 1 && diff.TotalSeconds < 45, String.Format("Timeout exceeded ({0}). Actual time: {1}", "Fail over failure", diff)); + mServer1.StopServer(); + mServer1.DisposeListener(); + mServer2.StopServer(); + mServer2.DisposeListener(); + + // Valid session no time out + start = DateTime.Now; + using (Session session = MySQLX.GetSession(ConnectionStringUri+ "?connecttimeout=0")) + session.SQL("SELECT SLEEP(10)").Execute(); + diff = DateTime.Now.Subtract(start); + Assert.That(diff.TotalSeconds > 10); + + //Invalid Values for Connection Timeout parameter + var ex = Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";connect-timeout=-1;")); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.InvalidConnectionTimeoutValue)); + + ex = Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";connect-timeout=foo;")); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.InvalidConnectionTimeoutValue)); + + ex = Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";connect-timeout='';")); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.InvalidConnectionTimeoutValue)); + + ex = Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";connect-timeout=10.5;")); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.InvalidConnectionTimeoutValue)); + + ex = Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";connect-timeout=" + Int32.MaxValue + 1)); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.InvalidConnectionTimeoutValue)); + + ex = Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";connect-timeout=10.5;")); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.InvalidConnectionTimeoutValue)); + + ex = Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";connect-timeout=;")); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.InvalidConnectionTimeoutValue)); + + ex = Assert.Throws(() => MySQLX.GetSession(ConnectionStringUri + "?connect-timeout= ")); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.InvalidConnectionTimeoutValue)); + + ex = Assert.Throws(() => MySQLX.GetSession(ConnectionStringUri + "?connecttimeout=")); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.InvalidConnectionTimeoutValue)); + + // Valid value for ConnectionTimeout, invalid credentials + var exception = Assert.Throws(() => MySQLX.GetSession($"server={Host};user=test;password=noPass;port={XPort};connect-timeout=2000;")); + Assert.That(exception, Is.Not.Null); + } + + private void TestConnectTimeoutFailureTimeout(String connString, int minTime, int maxTime, string test, bool usingmocktimeout) + { + DateTime start = DateTime.Now; + if(usingmocktimeout) + Assert.Throws(() => MySQLX.GetSession(connString)); + else + Assert.Throws(() => MySQLX.GetSession(connString)); + TimeSpan diff = DateTime.Now.Subtract(start); + Assert.That(diff.TotalSeconds > minTime && diff.TotalSeconds < maxTime, String.Format("Timeout exceeded ({0}). Actual time: {1}", test, diff)); + } + + private void TestConnectTimeoutSuccessTimeout(String connString, int minTime, int maxTime, string test) + { + DateTime start = DateTime.Now; + MySQLX.GetSession(connString); + TimeSpan diff = DateTime.Now.Subtract(start); + Assert.That(diff.TotalSeconds > minTime && diff.TotalSeconds < maxTime, String.Format("Timeout exceeded ({0}). Actual time: {1}", test, diff)); + } + + [Test] + [Property("Category", "Security")] + public void MaxConnections() + { + try + { + List sessions = new List(); + ExecuteSqlAsRoot("SET @@global.mysqlx_max_connections = 2"); + for (int i = 0; i <= 2; i++) + { + Session newSession = MySQLX.GetSession(ConnectionString); + sessions.Add(newSession); + } + Assert.That(true, Is.False, "MySqlException should be thrown"); + } + catch (MySqlException ex) + { + Assert.That(ex.Message, Is.EqualTo(ResourcesX.UnableToOpenSession)); + } + finally + { + ExecuteSqlAsRoot("SET @@global.mysqlx_max_connections = 100"); + } + } + + protected void CheckConnectionData(string connectionData, string user, string password, string server, uint port, params string[] parameters) + { + string result = this.session.ParseConnectionData(connectionData); + var csbuilder = new MySqlXConnectionStringBuilder(result); + Assert.That(user == csbuilder.UserID, string.Format("Expected:{0} Current:{1} in {2}", user, csbuilder.UserID, connectionData)); + Assert.That(password == csbuilder.Password, string.Format("Expected:{0} Current:{1} in {2}", password, csbuilder.Password, connectionData)); + Assert.That(server == csbuilder.Server, string.Format("Expected:{0} Current:{1} in {2}", server, csbuilder.Server, connectionData)); + Assert.That(port == csbuilder.Port, string.Format("Expected:{0} Current:{1} in {2}", port, csbuilder.Port, connectionData)); + if (parameters != null) + { + if (parameters.Length % 2 != 0) + throw new ArgumentOutOfRangeException(); + for (int i = 0; i < parameters.Length; i += 2) + { + Assert.That(csbuilder.ContainsKey(parameters[i])); + Assert.That(csbuilder[parameters[i]].ToString(), Is.EqualTo(parameters[i + 1])); + } + } + } + + /// + /// WL12514 - DevAPI: Support session-connect-attributes + /// + [Test] + [Property("Category", "Security")] + public void ConnectionAttributes() + { + if (!(session.Version.isAtLeast(8, 0, 16))) return; + + // Validate that MySQLX.GetSession() supports a new 'connection-attributes' query parameter + // with default values and all the client attributes starts with a '_'. + TestConnectionAttributes(ConnectionString + ";connection-attributes=true;"); + TestConnectionAttributes(ConnectionStringUri + "?connectionattributes"); + + // Validate that no attributes, client or user defined, are sent to server when the value is "false". + TestConnectionAttributes(ConnectionString + ";connection-attributes=false;"); + TestConnectionAttributes(ConnectionStringUri + "?connectionattributes=false"); + + // Validate default behavior with different scenarios. + TestConnectionAttributes(ConnectionString + ";connection-attributes;"); + TestConnectionAttributes(ConnectionStringUri + "?connectionattributes=true"); + TestConnectionAttributes(ConnectionString + ";connection-attributes=;"); + TestConnectionAttributes(ConnectionStringUri + "?connectionattributes=[]"); + + // Validate user-defined attributes to be sent to server. + Dictionary userAttrs = new Dictionary + { + { "foo", "bar" }, + { "quua", "qux" }, + { "key", null } + }; + TestConnectionAttributes(ConnectionString + ";connection-attributes=[foo=bar,quua=qux,key]", userAttrs); + TestConnectionAttributes(ConnectionStringUri + "?connectionattributes=[foo=bar,quua=qux,key=]", userAttrs); + + // Errors + var ex = Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";connection-attributes=[_key=value]")); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.InvalidUserDefinedAttribute)); + + ex = Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";connection-attributes=123")); + Assert.That(ex.Message, Is.EqualTo(ResourcesX.InvalidConnectionAttributes)); + + ex = Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";connection-attributes=[key=value,key=value2]")); + Assert.That(ex.Message, Is.EqualTo(string.Format(ResourcesX.DuplicateUserDefinedAttribute, "key"))); + + ex = Assert.Throws(() => MySQLX.GetSession(new { server = Host, port = XPort, user = RootUser, connectionattributes = "=" })); + + ex = Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";connectionattributes=[=bar]")); + Assert.That(ex.Message, Is.EqualTo(string.Format(ResourcesX.EmptyKeyConnectionAttribute))); + } + + private void TestConnectionAttributes(string connString, Dictionary userAttrs = null) + { + string sql = "SELECT * FROM performance_schema.session_account_connect_attrs WHERE PROCESSLIST_ID = connection_id()"; + + using (Session session = MySQLX.GetSession(connString)) + { + Assert.That(session.XSession.SessionState, Is.EqualTo(SessionState.Open)); + var result = session.SQL(sql).Execute().FetchAll(); + + if (session.Settings.ConnectionAttributes == "false") + Assert.That(result, Is.Empty); + else + { + Assert.That(result, Is.Not.Empty); + MySqlConnectAttrs clientAttrs = new MySqlConnectAttrs(); + + if (userAttrs == null) + { + Assert.That(result.Count, Is.EqualTo(8)); + + foreach (Row row in result) + Assert.That(row[1].ToString(), Does.StartWith("_")); + } + else + { + Assert.That(result.Count, Is.EqualTo(11)); + + for (int i = 0; i < userAttrs.Count; i++) + { + Assert.That(userAttrs.ContainsKey(result.ElementAt(i)[1].ToString())); + Assert.That(userAttrs.ContainsValue(result.ElementAt(i)[2])); + } + } + } + } + } + + [TestCase("localhost")] + [TestCase("127.0.0.1")] + [TestCase("[::1]")] + [Description("IPv6 connection Scenario [localhost],[127.0.0.1]")] + public void ConnectionTest(string serverName) + { + Assume.That(Platform.IsWindows(), "This test is only for Windows OS."); + + serverName = serverName.Replace("localhost", Host); + + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + string connStr = "server=" + Host + ";user=" + sb.UserID + ";port=" + XPort + ";password=" + sb.Password + ";" + "sslmode=" + MySqlSslMode.Required; + + using (var sessionTest = MySQLX.GetSession(connStr)) + { + Assert.That(sessionTest.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + using (var sessionTest = MySQLX.GetSession("mysqlx://" + sb.UserID + ":" + sb.Password + "@" + serverName + ":" + XPort)) + { + Assert.That(sessionTest.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + using (var sessionTest = MySQLX.GetSession(new { server = serverName, port = XPort, user = sb.UserID, password = sb.Password })) + { + Assert.That(sessionTest.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + //wrong port + connStr = "server=" + sb.Server + ";user=" + sb.UserID + ";port=" + 33090 + ";password=" + sb.Password + ";" + "sslmode=" + MySqlSslMode.Required; + Assert.Throws(() => MySQLX.GetSession(connStr)); + + } + + [TestCase("[::$]")] + [TestCase("[::11]")] + [Description("IPv6 connection server * and ::$,invalid hostname")] + public void IPv6ConnectionExceptions(string serverName) + { + Assume.That(Platform.IsWindows(), "This test is only for Windows OS."); + + Session sessionTest = null; + string connStr = "server=" + serverName + ";user=test;port=" + XPort + ";password=test;sslmode=" + MySqlSslMode.Required; + Assert.Catch(() => sessionTest = MySQLX.GetSession(connStr)); + Assert.Catch(() => sessionTest = MySQLX.GetSession("mysqlx://test:test@" + serverName + ":" + XPort)); + Assert.Catch(() => sessionTest = MySQLX.GetSession(new { server = serverName, port = XPort, user = schemaName, password = schemaName })); + } + + [Test, Description("Unified connection string refinement-Negative Scenarios")] + public void ConnectionNegativeScenarios() + { + Assume.That(Platform.IsWindows(), "This test is only for Windows OS."); + var ipv6HostName2 = GetIPV6Address(); + string ipAddress = GetMySqlServerIp(); + + Session session1 = null; + Assert.Catch(() => session1 = MySQLX.GetSession("mysql:x//test:test@" + ipAddress + ":" + XPort)); + Assert.Catch(() => session1 = MySQLX.GetSession("my:sqlx//test:test@" + ipAddress + ":" + XPort)); + Assert.Catch(() => session1 = MySQLX.GetSession("mysqlx:://test:test@" + ipAddress + ":" + XPort)); + string ipv6address = "f345::" + GetIPV6Address() + ":1xde"; + Assert.Catch(() => session1 = MySQLX.GetSession("mysqlx://test:test@[" + ipv6address + "]:" + XPort)); + Assert.Catch(() => session1 = MySQLX.GetSession("mysqlx://test:test@" + ipAddress + ":" + XPort + "/" + "unknowndatabase")); + string connStr = "mysqlx://test:test@" + session.Settings.Server + ":" + XPort + "/?" + "ssl-mode=VerifyFull&ssl-ca=" + sslCa + "&ssl-ca-pwd=wrongpass"; + Assert.Catch(() => session1 = MySQLX.GetSession(connStr)); + } + + [Test, Description("Session.Uri")] + public void SessionUriAndDefaultSchemaTest() + { + if (!Platform.IsWindows()) return; + + using (var session1 = MySQLX.GetSession(ConnectionString)) + { + Assert.That(session1.Uri, Is.Not.Null); + } + + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + var connectionString = ConnectionStringUserWithSSLPEM + ";protocol=TCP;database=" + + sb.Database + ";characterset=utf8mb4;sslmode=Required;connect-timeout=10;keepalive=10;auth=PLAIN"; + using (var session1 = MySQLX.GetSession(connectionString)) + { + Assert.That(session1.Uri, Is.Not.Null); + } + + using (var session1 = MySQLX.GetSession(new + { + server = sb.Server, + port = XPort, + user = sb.UserID, + password = sb.Password, + sslmode = MySqlSslMode.Required + })) + { + Assert.That(session1.Uri, Is.Not.Null); + } + + var conn = new MySqlConnectionStringBuilder(); + conn.Server = sb.Server; + conn.UserID = sb.UserID; + conn.Password = sb.Password; + conn.Port = Convert.ToUInt32(XPort); + conn.Database = schemaName; + conn.CharacterSet = "utf8mb4"; + conn.SslMode = MySqlSslMode.VerifyCA; + conn.SslCa = sslCa; + conn.CertificatePassword = sslCertificatePassword; + conn.Keepalive = 10; + conn.ConnectionProtocol = MySqlConnectionProtocol.Tcp; + + using (var session1 = MySQLX.GetSession(conn.ConnectionString)) + { + Assert.That(session1.Uri, Is.Not.Null); + } + + using (var session1 = MySQLX.GetSession(ConnectionStringUri + "/?ssl-mode=Required;")) + { + Assert.That(session1.Uri, Is.Not.Null); + } + + conn = new MySqlConnectionStringBuilder(); + conn.Server = sb.Server; + conn.UserID = sb.UserID; + conn.Password = sb.Password; + conn.Port = Convert.ToUInt32(XPort); + conn.ConnectionProtocol = MySqlConnectionProtocol.Tcp; + conn.Database = schemaName; + conn.CharacterSet = "utf8mb4"; + conn.SslMode = MySqlSslMode.Required; + conn.SslCa = sslCa; + conn.CertificatePassword = sslCertificatePassword; + conn.Keepalive = 10; + connectionString = conn.ConnectionString; + using (var session1 = MySQLX.GetSession(connectionString)) + { + Assert.That(session1.DefaultSchema.Name, Is.EqualTo(schemaName)); + Assert.That(session1.Uri, Is.Not.Null); + } + + conn = new MySqlConnectionStringBuilder(); + conn.Server = sb.Server; + conn.UserID = sb.UserID; + conn.Password = sb.Password; + conn.Port = Convert.ToUInt32(XPort); + conn.ConnectionProtocol = MySqlConnectionProtocol.Tcp; + conn.Database = schemaName; + conn.CharacterSet = "utf8mb4"; + conn.SslMode = MySqlSslMode.VerifyCA; + conn.SslCa = sslCa; + conn.CertificatePassword = sslCertificatePassword; + conn.Keepalive = 10; + connectionString = conn.ConnectionString; + using (var session1 = MySQLX.GetSession(connectionString)) + { + Assert.That(session1.DefaultSchema.Name, Is.EqualTo(schemaName)); + Assert.That(session1.Uri, Is.Not.Null); + } + + conn = new MySqlConnectionStringBuilder(); + conn.Server = sb.Server; + conn.UserID = sb.UserID; + conn.Password = sb.Password; + conn.Port = Convert.ToUInt32(XPort); + conn.ConnectionProtocol = MySqlConnectionProtocol.Tcp; + conn.Database = schemaName; + conn.CharacterSet = "utf8mb4"; + conn.Keepalive = 10; + connectionString = conn.ConnectionString; + using (var session1 = MySQLX.GetSession(connectionString)) + { + Assert.That(session1.DefaultSchema.Name, Is.EqualTo(schemaName)); + Assert.That(session1.Uri, Is.Not.Null); + session1.DropSchema("㭋玤䂜蚌"); + session1.CreateSchema("㭋玤䂜蚌"); + session1.SQL("USE 㭋玤䂜蚌").Execute(); + Assert.That(session1.DefaultSchema.Name, Is.EqualTo(schemaName)); + } + + conn.Database = "㭋玤䂜蚌"; + connectionString = conn.ConnectionString; + using (var session1 = MySQLX.GetSession(connectionString)) + { + Assert.That(session1.DefaultSchema.Name, Is.EqualTo("㭋玤䂜蚌")); + Assert.That(session1.Uri, Is.Not.Null); + } + + conn.Server = sb.Server; + conn.UserID = sb.UserID; + conn.Password = sb.Password; + conn.Port = Convert.ToUInt32(XPort); + conn.ConnectionProtocol = MySqlConnectionProtocol.Tcp; + conn.Database = "㭋玤䂜蚌"; + conn.CharacterSet = "utf8mb4"; + conn.SslMode = MySqlSslMode.VerifyCA; + conn.SslCa = sslCa; + conn.CertificatePassword = sslCertificatePassword; + conn.Keepalive = 10; + connectionString = conn.ConnectionString; + using (var session1 = MySQLX.GetSession(connectionString)) + { + Assert.That(session1.DefaultSchema.Name, Is.EqualTo("㭋玤䂜蚌")); + Assert.That(session1.Uri, Is.Not.Null); + session1.DropSchema("㭋玤䂜蚌"); + } + + } + + [Test, Description("Test MySqlX plugin Connection for user with wrong password")] + public void GetSessionWithWrongPassword() + { + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + sb.Password = "wrongPassword"; + Assert.Throws(() => MySQLX.GetSession(sb.ConnectionString)); + } + + [Test, Description("Test MySqlX plugin Connection for user with correct password but non MysqlX Server")] + public void GetSessionWithWrongPort() + { + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + sb.Port = Convert.ToUInt32(Port); + Assert.Throws(() => MySQLX.GetSession(sb.ConnectionString)); + } + + [Test, Description("Test MySqlX plugin Issue a drop command after session already closed")] + public void GetSessionDropAlreadyClosedConnection() + { + Session testSession = MySQLX.GetSession(ConnectionString); + testSession.Close(); + testSession.Close();//works and behaviour expected but any input command should fail + Assert.Throws(() => testSession.DropSchema(schemaName)); + + testSession = MySQLX.GetSession(ConnectionStringNoPassword); + testSession.Close(); + testSession.Close();//works and behaviour expected but any input command should fail + Assert.Throws(() => testSession.DropSchema(schemaName)); + } + + [Test, Description("Session.DefaultSchema")] + public void SessionDefaultSchema() + { + if (!Platform.IsWindows()) return; + + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + sb.Database = null; + var session1 = MySQLX.GetSession(sb.ConnectionString); + Assert.That(session1.DefaultSchema, Is.EqualTo(null)); + string connectionString = ConnectionString + ";protocol=Socket;database=" + schemaName + ";characterset=utf8mb4;sslmode=VerifyCA;ssl-ca=" + + sslCa + ";certificatepassword=" + sslCertificatePassword + ";connect-timeout=10;keepalive=10;auth=PLAIN"; + session1 = MySQLX.GetSession(connectionString); + Assert.That(session1.DefaultSchema.Name, Is.EqualTo(schemaName)); + + session1 = MySQLX.GetSession(ConnectionStringUri + "/" + schemaName + "?" + "auth=PLAIN&characterset=utf8mb4"); + Assert.That(session1.DefaultSchema.Name, Is.EqualTo(schemaName)); + + session1 = MySQLX.GetSession(new + { + server = sb.Server, + port = XPort, + user = sb.UserID, + password = sb.Password, + sslmode = MySqlSslMode.Required, + database = schemaName + }); + Assert.That(session1.DefaultSchema.Name, Is.EqualTo(schemaName)); + session1.DefaultSchema.CreateCollection("tester"); + session1.DefaultSchema.DropCollection("tester"); + Assert.That(session1.DefaultSchema.Session.DefaultSchema.Name, Is.EqualTo(schemaName)); + + var conn = new MySqlConnectionStringBuilder(); + session1.DropSchema("㭋玤䂜蚌"); + session1.CreateSchema("㭋玤䂜蚌"); + session1.SQL("USE 㭋玤䂜蚌").Execute(); + Assert.That(session1.DefaultSchema.Name, Is.EqualTo(schemaName)); + session1.Dispose(); + conn.Server = sb.Server; + conn.UserID = sb.UserID; + conn.Password = sb.Password; + conn.Port = Convert.ToUInt32(XPort); + conn.ConnectionProtocol = MySqlConnectionProtocol.Tcp; + conn.Database = "㭋玤䂜蚌"; + conn.CharacterSet = "utf8mb4"; + conn.SslMode = MySqlSslMode.Required; + conn.SslCa = sslCa; + conn.CertificatePassword = sslCertificatePassword; + conn.Keepalive = 10; + connectionString = conn.ConnectionString; + session1 = MySQLX.GetSession(connectionString); + Assert.That(session1.DefaultSchema.Name, Is.EqualTo("㭋玤䂜蚌")); + Assert.That(session1.Uri, Does.Contain("㭋玤䂜蚌")); + + conn.Server = sb.Server; + conn.UserID = sb.UserID; + conn.Password = sb.Password; + conn.Port = Convert.ToUInt32(XPort); + conn.ConnectionProtocol = MySqlConnectionProtocol.Tcp; + conn.Database = "㭋玤䂜蚌"; + conn.CharacterSet = "utf8mb4"; + conn.SslMode = MySqlSslMode.Required; + conn.SslCa = sslCa; + conn.CertificatePassword = sslCertificatePassword; + conn.Keepalive = 10; + connectionString = conn.ConnectionString; + session1 = MySQLX.GetSession(connectionString); + Assert.That(session1.DefaultSchema.Name, Is.EqualTo("㭋玤䂜蚌")); + Assert.That(session1.Uri, Does.Contain("㭋玤䂜蚌")); + session1.DefaultSchema.CreateCollection("tester"); + session1.DefaultSchema.DropCollection("tester"); + Assert.That(session1.DefaultSchema.Session.DefaultSchema.Name, Is.EqualTo("㭋玤䂜蚌")); + } + + [Test, Description("Session BaseString/MySQLXConnectionString Builder")] + public void ConnectionStringBuilderXpluginTests() + { + if (!Platform.IsWindows()) return; + + MySqlXConnectionStringBuilder mysqlx0 = new MySqlXConnectionStringBuilder(ConnectionString); + mysqlx0.ConnectionProtocol = MySqlConnectionProtocol.Tcp; + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.SslMode = MySqlSslMode.Required; + mysqlx0.ConnectTimeout = 10; + mysqlx0.Keepalive = 10; + mysqlx0.CertificateFile = sslCa; + mysqlx0.CertificatePassword = sslCertificatePassword; + mysqlx0.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysqlx0.CertificateThumbprint = ""; + + + using (var xpluginconn = MySQLX.GetSession(mysqlx0.ConnectionString)) + { + Assert.That(xpluginconn.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + mysqlx0 = new MySqlXConnectionStringBuilder(ConnectionString); + mysqlx0.Server = "::1"; + mysqlx0.Database = schemaName; + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.ConnectionProtocol = MySqlConnectionProtocol.Tcp; + mysqlx0.SslMode = MySqlSslMode.Required; + mysqlx0.ConnectTimeout = 10; + mysqlx0.Keepalive = 10; + mysqlx0.CertificateFile = sslCa; + mysqlx0.CertificatePassword = sslCertificatePassword; + mysqlx0.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysqlx0.CertificateThumbprint = sslCertificatePassword; + + using (var xpluginconn = MySQLX.GetSession(mysqlx0.ConnectionString)) + { + Assert.That(xpluginconn.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + mysqlx0 = new MySqlXConnectionStringBuilder(ConnectionString); + mysqlx0.Database = schemaName; + mysqlx0.ConnectionProtocol = MySqlConnectionProtocol.Tcp; + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.SslMode = MySqlSslMode.VerifyCA; + mysqlx0.ConnectTimeout = 10; + mysqlx0.Keepalive = 10; + mysqlx0.CertificateFile = sslCa; + mysqlx0.CertificatePassword = "pass"; + mysqlx0.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysqlx0.CertificateThumbprint = ""; + + using (var xpluginconn = MySQLX.GetSession(mysqlx0.ConnectionString)) + { + Assert.That(xpluginconn.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + mysqlx0 = new MySqlXConnectionStringBuilder(ConnectionString); + mysqlx0.Database = schemaName; + mysqlx0.ConnectionProtocol = MySqlConnectionProtocol.Tcp; + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.SslMode = MySqlSslMode.Required; + mysqlx0.ConnectTimeout = 10; + mysqlx0.Keepalive = 10; + + using (var xpluginconn = MySQLX.GetSession(mysqlx0.ConnectionString)) + { + Assert.That(xpluginconn.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + //Scenario-2 + string valid = "server=" + mysqlx0.Server + ";user id=" + mysqlx0.UserID + ";password=" + mysqlx0.Password + ";port=" + XPort + ";protocol=Socket;database=" + schemaName + ";characterset=utf8mb4;sslmode=Required;certificatefile=" + sslCa + ";certificatepassword=" + sslCertificatePassword + ";connect-timeout=10;keepalive=10;certificatestorelocation=LocalMachine;certificatethumbprint=;"; + using (var xpluginconn = MySQLX.GetSession(valid)) + { + Assert.That(xpluginconn.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + //Scenario-3 + mysqlx0 = new MySqlXConnectionStringBuilder(ConnectionString); + mysqlx0.Database = schemaName; + mysqlx0.ConnectionProtocol = MySqlConnectionProtocol.Tcp; + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.SslMode = MySqlSslMode.Required; + mysqlx0.ConnectTimeout = 10; + mysqlx0.Keepalive = 10; + mysqlx0.CertificateFile = sslCa; + mysqlx0.CertificatePassword = sslCertificatePassword; + mysqlx0.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysqlx0.CertificateThumbprint = ""; + mysqlx0.Auth = MySqlAuthenticationMode.AUTO; + mysqlx0.SslCa = sslCa; + using (var xpluginconn = MySQLX.GetSession(mysqlx0.ConnectionString)) + { + Assert.That(xpluginconn.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + //Basic Scenarios + var connectionstr = "server=" + mysqlx0.Server + ";database=" + mysqlx0.Database + ";port=" + + XPort + ";userid=" + mysqlx0.UserID + ";password=" + + mysqlx0.Password + + ";characterset=utf8mb4;sslmode=Required;connect-timeout=20000;keepalive=20000;certificatefile=" + + sslCa + ";certificatepassword=" + sslCertificatePassword + + ";certificatestorelocation=LocalMachine;certificatethumbprint="; + using (var xpluginconn = MySQLX.GetSession(connectionstr)) + { + Assert.That(xpluginconn.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + connectionstr = "mysqlx://" + mysqlx0.Server + ":" + XPort + "/" + + schemaName + "?connect-timeout=10&userid=" + mysqlx0.UserID + "&password=" + + mysqlx0.Password + "&sslca=" + sslCa + "&certificatepassword=" + + sslCertificatePassword + "&keepalive=10&characterset=utf8mb4"; + + using (var xpluginconn = MySQLX.GetSession(connectionstr)) + { + Assert.That(xpluginconn.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + using (var xpluginconn = MySQLX.GetSession(new + { + server = mysqlx0.Server, + port = XPort, + user = mysqlx0.UserID, + password = mysqlx0.Password + })) + { + Assert.That(xpluginconn.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + } + + [Test, Description("Connection Measurement Test")] + public void ConnectionTimeTest() + { + int secondsExpected = 15; + var connObject = new { server = Host, port = XPort, user = session.Settings.UserID, password = session.Settings.Password }; + MeasureConnectionString(ConnectionString, secondsExpected, "Connection String", 5); + MeasureConnectionString(ConnectionStringUri, secondsExpected, "Connection String URI", 5); + MeasureConnectionObject(connObject, secondsExpected, "Connection Object", 5); + } + + [Test, Description("Connection time with Database set")] + public void ConnectionTimeWithDatabaseTest() + { + int secondsExpected = 15; + var connString = ConnectionString + ";database=test"; + var connStringURI = ConnectionStringUri + "/?database=test"; + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + var connectionObject = new + { + server = sb.Server, + port = XPort, + user = sb.UserID, + password = sb.Password, + database = schemaName + }; + MeasureConnectionString(connString, secondsExpected, "Connection String", 5); + MeasureConnectionString(connStringURI, secondsExpected, "Connection String URI", 5); + MeasureConnectionObject(connectionObject, secondsExpected, "Connection Object", 5); + } + + [Test, Description("REFACTOR PARSING OF CONNECTION STRING IN X DEVAPI")] + [Ignore("Uncomment to execute")] + public void ParseConnectionStringBenchmark_S1() + { + long transactions = 0; + long startTime = 0; + long endTime = 0; + long queryRunTime = 0; + int iterations = 10; + long NANO_TO_MILLI = 1000000; + long elapsedTime = 0; + long conTime = 0; + int i = 0; + + string connStr = ConnectionString; + + var session = MySQLX.GetSession(connStr); + session.Close(); + + for (int j = 0; j < 1; j++) + { + transactions = 0; + startTime = 0; + endTime = 0; + queryRunTime = 0; + iterations = 20; + elapsedTime = 0; + conTime = 0; + connStr = ConnectionStringUri; + startTime = NanoTime(); + for (i = 0; i < iterations; i++) + { + queryRunTime = queryRunTime + DoConnectString(connStr); + } + endTime = NanoTime(); + transactions = i; + elapsedTime = (endTime - startTime); //in nano + conTime = (elapsedTime / NANO_TO_MILLI) - (queryRunTime / NANO_TO_MILLI); + var t = CalculateTPS(conTime, transactions); + var log = ("Connected to MySQL using URI with iterations " + iterations + " with TPS:" + t); + Assert.That(t, Is.Not.Empty); + + transactions = 0; + startTime = 0; + endTime = 0; + queryRunTime = 0; + iterations = 20; + elapsedTime = 0; + conTime = 0; + connStr = ConnectionString; + startTime = NanoTime(); + for (i = 0; i < iterations; i++) + { + queryRunTime = queryRunTime + DoConnectString(connStr); + } + endTime = NanoTime(); + transactions = i; + elapsedTime = (endTime - startTime); //in nano + conTime = (elapsedTime / NANO_TO_MILLI) - (queryRunTime / NANO_TO_MILLI); + t = CalculateTPS(conTime, transactions); + log = ("Connected to MySQL using connection string with iterations " + iterations + " with TPS:" + t); + Console.WriteLine(log); + Assert.That(t, Is.Not.Empty); + + transactions = 0; + startTime = 0; + endTime = 0; + queryRunTime = 0; + iterations = 20; + elapsedTime = 0; + conTime = 0; + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + var conn = new + { + server = sb.Server, + port = XPort, + user = sb.UserID, + password = sb.Password + }; + startTime = NanoTime(); + for (i = 0; i < iterations; i++) + { + queryRunTime = queryRunTime + DoConnectObject(conn); + } + endTime = NanoTime(); + transactions = i; + elapsedTime = (endTime - startTime); //in nano + conTime = (elapsedTime / NANO_TO_MILLI) - (queryRunTime / NANO_TO_MILLI); + t = CalculateTPS(conTime, transactions); + log = ("Connected to MySQL using Anonymous with iterations " + + iterations + + " with TPS:" + t); + } + } + + [Test, Description("REFACTOR PARSING OF CONNECTION STRING IN X DEVAPI")] + [Ignore("Uncomment to execute")] + public void ParseConnectionStringBenchmark_S2() + { + var connStr = ConnectionStringUri; + long queryStartTime = 0, queryRunTime = 0; + queryStartTime = NanoTime(); + var session1 = MySQLX.GetSession(connStr); + queryRunTime = NanoTime() - queryStartTime; + session1.Close(); + for (int j = 0; j < 20; j++) + { + connStr = ConnectionStringUri; + queryStartTime = 0; queryRunTime = 0; + queryStartTime = NanoTime(); + session1 = MySQLX.GetSession(connStr); + queryRunTime = NanoTime() - queryStartTime; + session1.Close(); + session1.Dispose(); + var log = ("Connected to MySQL using URI:" + queryRunTime / 1000000); + + connStr = ConnectionString; + queryStartTime = 0; queryRunTime = 0; + queryStartTime = NanoTime(); + session1 = MySQLX.GetSession(connStr); + queryRunTime = NanoTime() - queryStartTime; + session1.Close(); + session1.Dispose(); + log = ("Connected to MySQL using connection string:" + queryRunTime / 1000000); + + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + var conn = new + { + server = sb.Server, + port = XPort, + user = sb.UserID, + password = sb.Password + }; + queryStartTime = 0; queryRunTime = 0; + queryStartTime = NanoTime(); + session1 = MySQLX.GetSession(conn); + queryRunTime = NanoTime() - queryStartTime; + session1.Close(); + session1.Dispose(); + log = ("Connected to MySQL using Connection Object:" + queryRunTime / 1000000); + } + } + + [Test, Description("Getsession/Session-URI")] + public void GetSessionUriPositiveTests() + { + string[] positiveStringList = new string[6]; + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + positiveStringList[0] = "mysqlx://" + sb.UserID + ":" + sb.Password + "@" + sb.Server + ":" + XPort + "/?ssl-mode=Required"; + positiveStringList[1] = "mysqlx://" + sb.UserID + ":" + sb.Password + "@" + Host + ":" + XPort + "/?ssl-mode=Required"; + positiveStringList[2] = "mysqlx://" + sb.UserID + ":" + sb.Password + "@" + Host + ":" + XPort + "/" + schemaName + "?ssl-mode=Required"; + positiveStringList[3] = "mysqlx://" + sb.UserID + ":" + sb.Password + "@" + sb.Server + ":" + XPort + "/" + schemaName + "?ssl-mode=Required&auth=SHA256_MEMORY"; + positiveStringList[4] = "mysqlx://" + sb.UserID + ":" + sb.Password + "@" + sb.Server + ":" + XPort + "/" + schemaName + "?ssl-mode=Required&characterset=utf8mb4"; + positiveStringList[5] = "mysqlx://" + sb.UserID + ":" + sb.Password + "@" + sb.Server + ":" + XPort + "/" + schemaName + "?" + "ssl-mode=Required"; + + foreach (var connStr in positiveStringList) + { + using (Session c = MySQLX.GetSession(connStr)) + { + Assert.That(c.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + } + + [Test, Description("Getsession/Session-URI Negative Scenarios")] + public void GetSessionUriNegativeTests() + { + string[] NegativeStringList = new string[8]; + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + NegativeStringList[0] = "mysqlx://" + sb.UserID + ":" + sb.Password + "@" + sb.Server + ":" + 9999 + ";ssl-mode=required"; + NegativeStringList[1] = "mysqlx://" + sb.UserID + ":" + sb.Password + "@" + "129.0.0.1" + ":" + XPort + ";ssl-mode=required"; + NegativeStringList[2] = "mysqlx://" + sb.UserID + ":" + "wrongpassword" + "@" + "localhost" + ":" + XPort + "/" + schemaName + "?ssl-mode=required"; + NegativeStringList[3] = "mysqlxyzzzz://" + sb.UserID + ":" + sb.Password + "@" + sb.Server + ":" + XPort + "/" + schemaName + "?ssl-mode=required"; + NegativeStringList[4] = "mysqlx://" + "wrongsb.UserID" + ":" + sb.Password + "@" + sb.Server + ":" + XPort + "/" + schemaName + "?ssl-mode=required"; + NegativeStringList[5] = "mysqlx://" + sb.UserID + ":" + sb.Password + "@" + "wronglocalhost" + "/" + schemaName + "?sslmode=required"; + NegativeStringList[6] = "mysqlx://" + sb.UserID + ":" + sb.Password + "@" + sb.Server + ":" + XPort + "/" + schemaName + "?" + "ssl-mode*&^%$#@!invalidvalues123*()"; + NegativeStringList[7] = "mysqlx://" + sb.UserID + ":" + sb.Password + "@" + sb.Server + ":" + XPort + "/" + schemaName + "?" + "invalidvalues123invalidvalues123invalidvalues123invalidvalues123invalidvalues123invalidvalues123invalidvalues123invalidvalues123" + ";ssl-mode=required"; + + foreach (var connStr in NegativeStringList) + { + Assert.Catch(() => MySQLX.GetSession(connStr)); + } + } + + [Test, Description("Getsession using Anonymous Type Negative-Wrong Password")] + public void GetSessionAnonymousTypeNegative() + { + var connectionStringObject = new { connection = $"server={Host};user={session.Settings.UserID};port={XPort};password=wrong_password;sslmode={MySqlSslMode.Required}" }; + Assert.Throws(() => MySQLX.GetSession(connectionStringObject.connection)); + } + + [Test, Description("Support Session Anonymous as uri string Positive")] + public void GetSessionWithAnonymousObjectURI() + { + var connectionStringObject = new { connection = ConnectionStringUri }; + using (Session sessionPlain = MySQLX.GetSession(connectionStringObject.connection)) + { + var db = sessionPlain.GetSchema(schemaName); + var col = db.GetCollection("my_collection_123456789"); + if (col.ExistsInDatabase()) + { + db.DropCollection("my_collection_123456789"); + db.CreateCollection("my_collection_123456789"); + } + else { db.CreateCollection("my_collection_123456789"); } + db.DropCollection("my_collection_123456789"); + } + if (Convert.ToInt32(XPort) == 33060)//Connect to server on localhost with user userx using URI string default port + { + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + connectionStringObject = new { connection = "mysqlx://" + sb.UserID + ":" + sb.Password + "@" + sb.Server }; + using (Session sessionPlain = MySQLX.GetSession(connectionStringObject.connection)) + { + var db = sessionPlain.GetSchema(schemaName); + var col = db.GetCollection("my_collection_123456789"); + if (col.ExistsInDatabase()) + { + db.DropCollection("my_collection_123456789"); + db.CreateCollection("my_collection_123456789"); + } + else { db.CreateCollection("my_collection_123456789"); } + db.DropCollection("my_collection_123456789"); + } + } + } + + [Test, Description("Support Session connection string as uri string Negative-Invalid Password")] + public void GetSessionURIWrongPassword() + { + string invalidPassword = "invalid"; + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + string connectionString = "mysqlx://" + sb.UserID + ":" + invalidPassword + "@" + sb.Server + ":" + XPort; + Assert.Throws(() => MySQLX.GetSession(connectionString)); + connectionString = "mysqlx://" + sb.UserID + ":" + invalidPassword + "@" + sb.Server; + Assert.Throws(() => MySQLX.GetSession(connectionString)); + } + + // Connection Timeout Tests + [Test, Description("Remote offline host without connect-timeout parameter.Mysql getclient with pooling and maxsize 2 and queue timeout 2000 milliseconds")] + public void TimeoutUsingClientAndPooling_S1() + { + MySqlXConnectionStringBuilder sb = new MySqlXConnectionStringBuilder(ConnectionString); + string serverName = "10.10.10.10"; + string connStr = "server=" + serverName + ";user=" + sb.UserID + ";port=" + XPort + ";password=" + + sb.Password + ";"; + var connectionpooling = "{ \"pooling\": { \"maxSize\": 1, \"queueTimeout\": 2000 , \"maxIdleTime\":1000, \"enabled\": true} }"; + var connectionpoolingObject = new { pooling = new { enabled = true, maxSize = 1, queueTimeout = 2000, maxIdleTime = 1000 } }; + Client client = MySQLX.GetClient(connStr, connectionpoolingObject); + TestFailureTimeout(client, 1, 11, "Timeout value between 9 and 11 seconds"); + var connStrUri = "mysqlx://" + sb.UserID + ":" + sb.Password + "@" + serverName + ":" + XPort; + client = MySQLX.GetClient(connStrUri, connectionpoolingObject); + TestFailureTimeout(client, 1, 11, "Timeout value between 9 and 11 seconds"); + var connObj = new { server = serverName, port = XPort, user = sb.UserID, password = sb.Password }; + client = MySQLX.GetClient(connObj, connectionpoolingObject); + TestFailureTimeout(client, 1, 11, "Timeout value between 9 and 11 seconds"); + client = MySQLX.GetClient(connStr, connectionpooling); + TestFailureTimeout(client, 1, 11, "Timeout value between 9 and 11 seconds"); + client = MySQLX.GetClient(connStrUri, connectionpooling); + TestFailureTimeout(client, 1, 11, "Timeout value between 9 and 11 seconds"); + client = MySQLX.GetClient(connObj, connectionpooling); + TestFailureTimeout(client, 1, 11, "Timeout value between 9 and 11 seconds"); + } + + [Test, Description("failover connection string with one offline host and one online host and disable connect - timeout parameter(set to 0) " + + ".Mysql getclient with pooling and maxsize 2 and queue timeout 2000 milliseconds.Both the session should be successful after" + + "waiting for the respective lower layer socket timeout")] + public void TimeoutUsingClientAndPooling_S2() + { + int connectTimeout = 1; + string hostList = string.Empty; + string localIP = session.Settings.Server; + int minTime = 0; + int maxTime = 30; + session.Settings.UserID = "testAnyhost"; + string connStr = "server=10.10.10.10," + localIP + ";port=" + XPort + ";uid=" + session.Settings.UserID + ";" + "password=" + session.Settings.Password + + ";connect-timeout=" + connectTimeout; + var connectionpoolingObject = new { pooling = new { enabled = true, maxSize = 1, queueTimeout = 20000, maxIdleTime = 1000 } }; + + TestClientSuccessTimeout(minTime, maxTime, $"Timeout value between {minTime} and {maxTime} seconds", connStr, connectionpoolingObject); + + var connStrUri = "mysqlx://" + session.Settings.UserID + ":" + session.Settings.Password + "@[192.1.10.10," + localIP + ":" + XPort + "]" + "/?connect-timeout=" + connectTimeout; + TestClientSuccessTimeout(minTime, maxTime, $"Timeout value between {minTime} and {maxTime} seconds", connStr, connectionpoolingObject); + + } + + [Test, Description("connect - timeout parameter set as 1000 milliseconds.Create a pool of two sessions." + + "pooling(enabled:true,maxSize:2,queueTimeout: 2000 milliseconds).Try to create a third connection and verify the behaviour(Queue timeout expected)")] + public void TimeoutReachingMaxSizePool() + { + int connectTimeout = 1000; + string hostList = string.Empty; + string localIP = session.Settings.Server; + string connStr = "server=" + localIP + ";port=" + XPort + ";uid=" + session.Settings.UserID + ";" + "password=" + session.Settings.Password + + ";connect-timeout=" + connectTimeout; + var connectionpooling = "{ \"pooling\": { \"maxSize\": 2, \"queueTimeout\": 2000 , \"maxIdleTime\":1000, \"enabled\": true} }"; + var connectionpoolingObject = new { pooling = new { enabled = true, maxSize = 2, queueTimeout = 2000, maxIdleTime = 1000 } }; + using (Client client = MySQLX.GetClient(connStr, connectionpoolingObject)) + { + var session1 = client.GetSession(); + var session2 = client.GetSession(); + TestClientQueueTimeout(client, 1, 3, "Test queue timeout"); + } + var connStrUri = "mysqlx://" + session.Settings.UserID + ":" + session.Settings.Password + "@[" + localIP + ":" + XPort + "]" + "/?connect-timeout=" + connectTimeout; + using (var client = MySQLX.GetClient(connStrUri, connectionpoolingObject)) + { + + var session1 = client.GetSession(); + var session2 = client.GetSession(); + TestClientQueueTimeout(client, 1, 3, "Test queue timeout"); + } + var connObj = new { server = "" + localIP, port = XPort, uid = session.Settings.UserID, password = session.Settings.Password, connecttimeout = connectTimeout }; + using (var client = MySQLX.GetClient(connObj, connectionpoolingObject)) + { + var session1 = client.GetSession(); + var session2 = client.GetSession(); + TestClientQueueTimeout(client, 1, 3, "Test queue timeout"); + } + + using (Client client = MySQLX.GetClient(connStr, connectionpooling)) + { + var session1 = client.GetSession(); + var session2 = client.GetSession(); + TestClientQueueTimeout(client, 1, 3, "Test queue timeout"); + } + using (var client = MySQLX.GetClient(connStrUri, connectionpooling)) + { + var session1 = client.GetSession(); + var session2 = client.GetSession(); + TestClientQueueTimeout(client, 1, 3, "Test queue timeout"); + } + using (var client = MySQLX.GetClient(connObj, connectionpooling)) + { + var session1 = client.GetSession(); + var session2 = client.GetSession(); + TestClientQueueTimeout(client, 1, 3, "Test queue timeout"); + } + for (var i = 1; i <= 2; i++) + { + hostList = "(address=143.24.20.36,priority=1),(address=" + localIP + ",priority=0)"; + } + connStr = "server=" + hostList + ";user=" + session.Settings.UserID + ";port=" + XPort + ";password=" + + session.Settings.Password + ";connect-timeout=" + connectTimeout; + + using (var client = MySQLX.GetClient(connStr, connectionpoolingObject)) + { + var session1 = client.GetSession(); + var session2 = client.GetSession(); + TestClientQueueTimeout(client, 1, 3, "Test queue timeout X"); + } + + var connObj1 = new { server = hostList, port = XPort, user = session.Settings.UserID, password = session.Settings.Password, connecttimeout = connectTimeout }; + using (var client = MySQLX.GetClient(connObj1, connectionpoolingObject)) + { + var session1 = client.GetSession(); + var session2 = client.GetSession(); + TestClientQueueTimeout(client, 1, 3, "Test queue timeout Y"); + } + using (var client = MySQLX.GetClient(connStr, connectionpooling)) + { + var session1 = client.GetSession(); + var session2 = client.GetSession(); + TestClientQueueTimeout(client, 1, 3, "Test queue timeout X"); + } + connObj1 = new { server = hostList, port = XPort, user = session.Settings.UserID, password = session.Settings.Password, connecttimeout = connectTimeout }; + using (var client = MySQLX.GetClient(connObj1, connectionpooling)) + { + var session1 = client.GetSession(); + var session2 = client.GetSession(); + TestClientQueueTimeout(client, 1, 3, "Test queue timeout A"); + } + + } + + [Test, Description("scenario 0(connectionString,connectionUri,Anonymous Object)-Without connect timeout and max timeout should be 10s")] + public void TimeoutWithWrongHost() + { + MockServer mServer= new MockServer(false); + mServer.StartServer(); + + string connStr = $"server={mServer.Address.ToString()};user={session.Settings.UserID};port={mServer.Port.ToString()};password={ session.Settings.Password};"; + TestConnectStringTimeoutFailureTimeout(connStr, 9, 100, "Timeout value between 9 and 20 seconds"); + mServer.StopServer(); + mServer.DisposeListener(); + + mServer = new MockServer(false); + mServer.StartServer(); + connStr = $"mysqlx://{session.Settings.UserID}:{ session.Settings.Password}@{mServer.Address.ToString()}:{mServer.Port.ToString()}"; + if(Uri.TryCreate(connStr, UriKind.Absolute, out _)) + TestConnectStringTimeoutFailureTimeout(connStr, 9, 100, "Timeout value between 9 and 20 seconds"); + + var connObj = new { server = mServer.Address.ToString(), port = mServer.Port.ToString(), user = session.Settings.UserID, password = session.Settings.Password }; + TestConnectObjTimeoutFailureTimeout(connObj, 9, 100, "Timeout value between 9 and 20 seconds"); + + mServer.StopServer(); + mServer.DisposeListener(); + } + + [Test, Description("scenario 1(connectionString,connectionUri,Anonymous Object)")] + public void MeasureNoTimeoutResponse() + { + string connStr = "server=" + session.Settings.Server + ";user=" + session.Settings.UserID + ";port=" + XPort + ";password=" + + session.Settings.Password + ";" + "connect-timeout=90;"; + TestConnectStringTimeoutSuccessTimeout(connStr, 0, 3, "Timeout value between 0 and 1 second"); + connStr = "mysqlx://" + session.Settings.UserID + ":" + session.Settings.Password + "@" + session.Settings.Server + ":" + XPort + "?connect-timeout=900;"; + TestConnectStringTimeoutSuccessTimeout(connStr, 0, 3, "Timeout value between 0 and 1 second"); + var connObj = new { server = session.Settings.Server, port = XPort, user = session.Settings.UserID, password = session.Settings.Password, connecttimeout = 9000 }; + TestConnectObjectTimeoutSuccessTimeout(connObj, 0, 3, "Timeout value between 0 and 1 second"); + } + + [Test, Description("scenario 2(connectionString,connectionUri,Anonymous Object with all options)")] + public void NoTimeoutWithManyOptions() + { + if (!Platform.IsWindows()) return; + string connStr = "server=" + session.Settings.Server + ";user id=" + session.Settings.UserID + ";password=" + + session.Settings.Password + ";port=" + XPort + ";protocol=Socket;" + + "database=" + schemaName + ";characterset=utf8mb4;sslmode=VerifyCA;ssl-ca=" + + sslCa + ";certificatepassword=pass;keepalive=10;auth=PLAIN;" + + "connect-timeout=900;"; + TestConnectStringTimeoutSuccessTimeout(connStr, 0, 1, "Timeout value between 0 and 1 second"); + connStr = "mysqlx://" + session.Settings.Server + ":" + XPort + "/" + schemaName + + "?" + "user id=" + session.Settings.UserID + "&password=" + session.Settings.Password + "&sslca=" + + sslCa + "&certificatepassword=pass&keepalive=10&characterset=utf8mb4&auth=PLAIN&connect-timeout=900"; + TestConnectStringTimeoutSuccessTimeout(connStr, 0, 1, "Timeout value between 0 and 1 second"); + var connObj = + new + { + server = session.Settings.Server, + port = XPort, + user = session.Settings.UserID, + password = session.Settings.Password, + sslmode = MySqlSslMode.VerifyCA, + CertificateFile = sslCa, + CertificatePassword = sslCertificatePassword, + database = schemaName, + keepalive = 10, + characterset = "utf8mb4", + auth = MySqlAuthenticationMode.PLAIN, + connecttimeout = 9000 + }; + TestConnectStringTimeoutSuccessTimeout(connStr, 0, 1, "Timeout value between 0 and 1 second"); + } + + [Test, Description("scenario 1(MysqlxStringBuilder)")] + public void TimeoutSuccessWithStringBuilder() + { + var connStrBuilder = new MySqlXConnectionStringBuilder(); + connStrBuilder.ConnectTimeout = 2000; + connStrBuilder.UserID = session.Settings.UserID; + connStrBuilder.Password = session.Settings.Password; + connStrBuilder.Port = Convert.ToUInt32(XPort); + connStrBuilder.Server = session.Settings.Server; + TestConnectStringTimeoutSuccessTimeout(connStrBuilder.ConnectionString, 0, 3, "Timeout value between 0 and 3 second"); + string connStr = "server=" + session.Settings.Server + ";user=" + session.Settings.UserID + ";port=" + XPort + ";password=" + + session.Settings.Password + ";" + "connect-timeout=9000;"; + connStrBuilder = new MySqlXConnectionStringBuilder(connStr); + TestConnectStringTimeoutSuccessTimeout(connStrBuilder.ConnectionString, 0, 3, "Timeout value between 0 and 3 second"); + } + + [Test, Description("scenario 2(MysqlxStringBuilder with all options)")] + public void TimeoutSuccessWithStringBuilderAllOptions() + { + string connStr = null; + MySqlXConnectionStringBuilder mysqlx0 = null; + if (!Platform.IsWindows()) return; + connStr = "server=" + session.Settings.Server + ";user id=" + session.Settings.UserID + ";password=" + + session.Settings.Password + ";port=" + XPort + ";protocol=Socket;" + + "database=" + schemaName + ";characterset=utf8mb4;sslmode=Required;ssl-ca=" + + sslCa + $";certificatepassword={sslCertificatePassword};certificatestorelocation=LocalMachine;" + + ";keepalive =10;auth=PLAIN;certificatethumbprint=;" + + "connect-timeout=" + 9000; + mysqlx0 = new MySqlXConnectionStringBuilder(connStr); + TestConnectStringTimeoutSuccessTimeout(mysqlx0.ConnectionString, 0, 1, "Timeout value between 0 and 1 second"); + mysqlx0 = new MySqlXConnectionStringBuilder(); + mysqlx0.Server = session.Settings.Server; + mysqlx0.UserID = session.Settings.UserID; + mysqlx0.Password = session.Settings.Password; + mysqlx0.Port = Convert.ToUInt32(XPort); + mysqlx0.ConnectionProtocol = MySqlConnectionProtocol.Tcp; + mysqlx0.Database = schemaName; + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.SslMode = MySqlSslMode.Required; + mysqlx0.SslCa = sslCa; + mysqlx0.CertificatePassword = sslCertificatePassword; + mysqlx0.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysqlx0.Keepalive = 10; + mysqlx0.Auth = MySqlAuthenticationMode.PLAIN; + mysqlx0.CertificateThumbprint = ""; + mysqlx0.ConnectTimeout = (uint)90000; + TestConnectStringTimeoutSuccessTimeout(mysqlx0.ConnectionString, 0, 1, "Timeout value between 0 and 1 second"); + } + + [Test, Description("scenario 3(MysqlxStringBuilder with all options-set minimum timeout to 1 and keep on increasing till gets connected)")] + public void TimeoutIncreasingUntilConnect() + { + string connStr = null; + MySqlXConnectionStringBuilder mysqlx0 = null; + + for (int i = 1; i < 20; i++) + { + connStr = ConnectionString + ";protocol=Socket;" + + "database=" + schemaName + ";characterset=utf8mb4;sslmode=VerifyCA;ssl-ca=" + + sslCa + $";certificatepassword={sslCertificatePassword};certificatestorelocation=LocalMachine;" + + ";auth=PLAIN;certificatethumbprint=;" + + "connect-timeout=" + (i * 1000); + mysqlx0 = new MySqlXConnectionStringBuilder(connStr); + using (var conn = MySQLX.GetSession(mysqlx0.ConnectionString)) + { + Assert.That(conn.Uri, Is.Not.Null); + } + break; + } + + for (int i = 1; i < 20; i++) + { + mysqlx0 = new MySqlXConnectionStringBuilder(); + mysqlx0.Server = session.Settings.Server; + mysqlx0.UserID = session.Settings.UserID; + mysqlx0.Password = session.Settings.Password; + mysqlx0.Port = Convert.ToUInt32(XPort); + mysqlx0.ConnectionProtocol = MySqlConnectionProtocol.Tcp; + mysqlx0.Database = schemaName; + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.SslMode = MySqlSslMode.VerifyCA; + mysqlx0.SslCa = sslCa; + mysqlx0.CertificatePassword = sslCertificatePassword; + mysqlx0.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysqlx0.Auth = MySqlAuthenticationMode.PLAIN; + mysqlx0.CertificateThumbprint = ""; + mysqlx0.ConnectTimeout = (uint)(i * 1000); + + using (var conn = MySQLX.GetSession(mysqlx0.ConnectionString)) + { + Assert.That(conn.Uri, Is.Not.Null); + } + break; + } + } + + [Test, Description("scenario 1(connectionString,connectionUri,Anonymous Object with default timeout)")] + public void ValidateDefaultTimeoutParameter() + { + uint defaultTimeout = 1000; + string connStr = ConnectionString + ";" + "connect-timeout=" + defaultTimeout; + for (int i = 0; i < 10; i++) + { + using (var conn = MySQLX.GetSession(connStr)) + { + Assert.That(defaultTimeout, Is.EqualTo(conn.Settings.ConnectTimeout)); + } + } + connStr = "mysqlx://" + session.Settings.UserID + ":" + session.Settings.Password + "@" + session.Settings.Server + ":" + XPort + "?connect-timeout=" + defaultTimeout; + for (int i = 0; i < 10; i++) + { + using (var conn = MySQLX.GetSession(connStr)) + { + Assert.That(defaultTimeout, Is.EqualTo(conn.Settings.ConnectTimeout)); + } + } + var connObj1 = new { server = session.Settings.Server, port = XPort, user = session.Settings.UserID, password = session.Settings.Password, connecttimeout = defaultTimeout }; + for (int i = 0; i < 10; i++) + { + using (var conn = MySQLX.GetSession(connObj1)) + { + Assert.That(defaultTimeout, Is.EqualTo(conn.Settings.ConnectTimeout)); + } + } + } + + [Test, Description("scenario 2(MysqlxStringBuilder with default timeout)")] + public void ValidateDefaultTimeoutParameterWithStringBuilder() + { + uint defaultTimeout = 1000; + var connStrBuilder = new MySqlXConnectionStringBuilder(); + connStrBuilder.ConnectTimeout = defaultTimeout; + connStrBuilder.UserID = session.Settings.UserID; + connStrBuilder.Password = session.Settings.Password; + connStrBuilder.Port = Convert.ToUInt32(XPort); + connStrBuilder.Server = session.Settings.Server; + for (int i = 0; i < 10; i++) + { + using (var conn = MySQLX.GetSession(connStrBuilder.ConnectionString)) + { + Assert.That(defaultTimeout, Is.EqualTo(conn.Settings.ConnectTimeout)); + } + } + string connStr = ConnectionString + ";" + "connect-timeout=" + defaultTimeout; + connStrBuilder = new MySqlXConnectionStringBuilder(connStr); + for (int i = 0; i < 10; i++) + { + using (var conn = MySQLX.GetSession(connStrBuilder.ConnectionString)) + { + Assert.That(defaultTimeout, Is.EqualTo(conn.Settings.ConnectTimeout)); + } + } + } + + [Test, Description("scenario 1(MysqlxStringBuilder with connect timeout option for offline server)")] + public void TimeoutOfflineServerWithStringBuilder() + { + MockServer mServer = new MockServer(false); + mServer.StartServer(); + + int connectionTimeout = 2000; + var connStrBuilder = new MySqlXConnectionStringBuilder(); + connStrBuilder.ConnectTimeout = (uint)connectionTimeout; + connStrBuilder.UserID = session.Settings.UserID; + connStrBuilder.Password = session.Settings.Password; + connStrBuilder.Port = Convert.ToUInt32(mServer.Port); + connStrBuilder.Server = mServer.Address.ToString(); + TestConnectStringTimeoutFailureTimeout(connStrBuilder.ConnectionString, 0, 21, "Offline host timeout value in between 1 and 21 seconds"); + mServer.StopServer(); + mServer.DisposeListener(); + + mServer = new MockServer(false); + mServer.StartServer(); + string connStr = $"server={mServer.Address.ToString()};user={session.Settings.UserID}; port={mServer.Port.ToString()};password={session.Settings.Password};connect-timeout={connectionTimeout}"; + connStrBuilder = new MySqlXConnectionStringBuilder(connStr); + TestConnectStringTimeoutFailureTimeout(connStrBuilder.ConnectionString, 0, 21, "Offline host timeout value in between 1 and 21 seconds"); + + mServer.StopServer(); + mServer.DisposeListener(); + } + + [Test, Description("scenario 1(connectionString,connectionUri,Anonymous Object,MysqlxStringBuilder with connect timeout option=1 for online server)")] + public void TimeoutSuccessConnectOptionOne() + { + int connectionTimeout = 2000; + string connStr = ConnectionString + ";" + "connect-timeout=" + connectionTimeout; + TestConnectStringTimeoutSuccessTimeout(connStr, 0, 5, "Checking the timeout between 0 to 5 seconds"); + connStr = ConnectionStringUri + "?connect-timeout=" + connectionTimeout; + TestConnectStringTimeoutSuccessTimeout(connStr, 0, 5, "Checking the timeout between 0 to 5 seconds"); + var connectionObj = new { server = session.Settings.Server, port = XPort, user = session.Settings.UserID, password = session.Settings.Password, connecttimeout = connectionTimeout }; + TestConnectObjectTimeoutSuccessTimeout(connectionObj, 0, 5, "Checking the timeout between 0 to 5 seconds"); + + var connStrBuilder = new MySqlXConnectionStringBuilder(); + connStrBuilder.ConnectTimeout = (uint)connectionTimeout; + connStrBuilder.UserID = session.Settings.UserID; + connStrBuilder.Password = session.Settings.Password; + connStrBuilder.Port = Convert.ToUInt32(XPort); + connStrBuilder.Server = session.Settings.Server; + TestConnectStringTimeoutSuccessTimeout(connStrBuilder.ConnectionString, 0, 5, "Checking the timeout between 0 to 5 seconds"); + + connStr = ConnectionString + ";" + "connect-timeout=" + connectionTimeout; + connStrBuilder = new MySqlXConnectionStringBuilder(connStr); + TestConnectStringTimeoutSuccessTimeout(connStrBuilder.ConnectionString, 0, 5, "Checking the timeout between 0 to 5 seconds"); + + } + + [Test, Description("scenario 1(connectionString,connectionUri,Anonymous Object,MysqlxStringBuilder with connect timeout option=0 for offline server)")] + public void TimeoutOfflineServerConnectOptionZero() + { + //, Ignore("Disabling the connection timeout will wait until the OS closes the socket, which can take several time.") + MockServer mServer = new MockServer(true); + mServer.StartServer(); + int connectionTimeout = 0; + + string connStr = $"server={mServer.Address.ToString()};user={session.Settings.UserID};port={mServer.Port.ToString()};password={session.Settings.Password};connect-timeout={connectionTimeout}"; + TestConnectStringTimeoutFailureNoConnectTimeout(connStr, 0, 50000, "Checking the timeout between 0 to 50000 milliseconds"); + mServer.StopServer(); + mServer.DisposeListener(); + + mServer = new MockServer(true); + mServer.StartServer(); + connStr = $"mysqlx://{session.Settings.UserID}:{session.Settings.Password}@[{mServer.Address.ToString()}:{mServer.Port.ToString()}]/?connect-timeout=" + connectionTimeout; + if (Uri.TryCreate(connStr,UriKind.Absolute, out _)) + TestConnectStringTimeoutFailureNoConnectTimeout(connStr, 0, 50000, "Checking the timeout between 0 to 50000 milliseconds"); + + mServer.StopServer(); + mServer.DisposeListener(); + + mServer = new MockServer(true); + mServer.StartServer(); + var connObj = new { server = mServer.Address.ToString(), port = mServer.Port.ToString(), user = session.Settings.UserID, password = session.Settings.Password, connecttimeout = connectionTimeout }; + TestConnectObjTimeoutFailureNoTimeout(connObj, 0, 50000, "Checking the timeout between 0 to 50000 milliseconds"); + mServer.StopServer(); + mServer.DisposeListener(); + + mServer = new MockServer(true); + mServer.StartServer(); + var connStrBuilder = new MySqlXConnectionStringBuilder(); + connStrBuilder.ConnectTimeout = (uint)connectionTimeout; + connStrBuilder.UserID = session.Settings.UserID; + connStrBuilder.Password = session.Settings.Password; + connStrBuilder.Port = (uint)mServer.Port; + connStrBuilder.Server = mServer.Address.ToString(); + TestConnectStringTimeoutFailureNoConnectTimeout(connStrBuilder.ConnectionString, 0, 50000, "Checking the timeout between 0 to 50000 milliseconds"); + mServer.StopServer(); + mServer.DisposeListener(); + + mServer = new MockServer(true); + mServer.StartServer(); + connStr = $"server={mServer.Address.ToString()};user={session.Settings.UserID};port={mServer.Port.ToString()};password={session.Settings.Password};connect-timeout={connectionTimeout}"; + connStrBuilder = new MySqlXConnectionStringBuilder(connStr); + TestConnectStringTimeoutFailureNoConnectTimeout(connStr, 0, 50000, "Checking the timeout between 0 to 50000 milliseconds"); + + mServer.StopServer(); + mServer.DisposeListener(); + } + + [Test, Description("(connectionString,connectionUri,Anonymous Object.Test that the timeout will be reset for each connection attempt in a failover scenario")] + public void ConnectTimeoutSeveralAddreses() + { + StringBuilder hostList = new StringBuilder(); + int connectionTimeout = 1000; + var priority = 100; + for (var i = 1; i <= 101; i++) + { + hostList.Append("(address=server" + i + ".example,priority=" + (priority != 0 ? priority-- : 0) + "),"); + if (i == 101) hostList.Append($"(address={Host},priority=0)"); + } + + using (var session1 = MySQLX.GetSession("server=" + hostList + ";port=" + XPort + ";uid=" + + session.Settings.UserID + ";password=" + session.Settings.Password + ";connect-timeout=" + + connectionTimeout + ";ssl-mode=required")) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + var schema = session1.GetSchema("test"); + Assert.That(schema, Is.Not.Null); + } + + var connStr = "mysqlx://" + session.Settings.UserID + ":" + session.Settings.Password + "@[" + hostList + "]/?connect-timeout=" + connectionTimeout; + using (var session1 = MySQLX.GetSession(connStr)) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + var schema = session1.GetSchema("test"); + Assert.That(schema, Is.Not.Null); + } + + using (var session1 = MySQLX.GetSession(new + { + server = hostList.ToString(), + port = XPort, + user = session.Settings.UserID, + password = session.Settings.Password, + sslmode = MySqlSslMode.Required + })) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + var schema = session1.GetSchema("test"); + Assert.That(schema, Is.Not.Null); + } + + var strList = "(address=143.24.20.36,priority=0),(address=10.172.165.157,priority=1)"; + connectionTimeout = 2000; + var connString = "server=" + strList + ";port=" + XPort + ";uid=" + + session.Settings.UserID + ";password=" + session.Settings.Password + ";connect-timeout=" + + connectionTimeout + ";ssl-mode=required"; + Stopwatch sw = new Stopwatch(); + sw.Start(); + Assert.Throws(() => MySQLX.GetSession(connString)); + sw.Stop(); + Assert.That(sw.Elapsed.Seconds > 0 && sw.Elapsed.Seconds < 21); + + connStr = "mysqlx://" + session.Settings.UserID + ":" + session.Settings.Password + "@[" + strList + "]" + "/?connect-timeout=" + connectionTimeout; + sw = new Stopwatch(); + sw.Start(); + Assert.Throws(() => MySQLX.GetSession(connString)); + sw.Stop(); + Assert.That(sw.Elapsed.Seconds > 0 && sw.Elapsed.Seconds < 21); + + var connObj1 = new + { + server = strList, + port = XPort, + user = session.Settings.UserID, + password = session.Settings.Password, + connecttimeout = connectionTimeout + }; + sw = new Stopwatch(); + sw.Start(); + Assert.Throws(() => MySQLX.GetSession(connString)); + sw.Stop(); + Assert.That(sw.Elapsed.Seconds > 0 && sw.Elapsed.Seconds < 21); + } + + [Test, Description("(connectionString,connectionUri,Anonymous Object.Test that the timeout will be reset for each connection attempt in a failover scenario")] + public void ConnectTimeoutWithFailoverAndNotValidHost() + { + string hostList = "(address=143.24.20.36,priority=0),(address=143.24.70.98,priority=1)"; + int connectionTimeout = 2000; + // URL + var connString = "server=" + hostList + ";port=" + XPort + ";uid=" + + session.Settings.UserID + ";password=" + session.Settings.Password + ";connect-timeout=" + + connectionTimeout; + Stopwatch sw = new Stopwatch(); + sw.Start(); + Assert.Throws(() => MySQLX.GetSession(connString)); + sw.Stop(); + Assert.That(sw.Elapsed.Seconds > 0 && sw.Elapsed.Seconds < 10); + // URI + var connStr = "mysqlx://" + session.Settings.UserID + ":" + session.Settings.Password + "@[" + hostList + "]" + "/?connect-timeout=" + connectionTimeout; + sw = new Stopwatch(); + sw.Start(); + Assert.Throws(() => MySQLX.GetSession(connString)); + sw.Stop(); + Assert.That(sw.Elapsed.Seconds > 0 && sw.Elapsed.Seconds < 10); + + // Object + var connObj = new + { + server = hostList, + port = XPort, + user = session.Settings.UserID, + password = session.Settings.Password, + connecttimeout = connectionTimeout + }; + sw = new Stopwatch(); + sw.Start(); + Assert.Throws(() => MySQLX.GetSession(connString)); + sw.Stop(); + Assert.That(sw.Elapsed.Seconds > 0 && sw.Elapsed.Seconds < 10); + } + + [Test, Description("Confirm that the timeout is only applied to the connection process, not to any subsequent operation after the connection is established")] + public void ValidateConnectTimeoutScope() + { + if (!Platform.IsWindows()) return; + string connStr = null; + connStr = "server=" + session.Settings.Server + ";user=" + session.Settings.UserID + ";port=" + XPort + ";password=" + + session.Settings.Password + ";" + "connect-timeout=10000;"; + using (var conn = MySQLX.GetSession(connStr)) + { + conn.SQL("SELECT SLEEP(10)").Execute(); + var res = conn.SQL("select @@port").Execute().FirstOrDefault(); + Assert.That(res, Is.Not.Null); + } + + connStr = "mysqlx://" + session.Settings.UserID + ":" + session.Settings.Password + "@" + session.Settings.Server + ":" + XPort + "?connect-timeout=10000;"; + using (var conn = MySQLX.GetSession(connStr)) + { + conn.SQL("SELECT SLEEP(10)").Execute(); + var res = conn.SQL("select @@port").Execute().FirstOrDefault(); + Assert.That(res, Is.Not.Null); + } + + var connObj = new + { + server = session.Settings.Server, + port = XPort, + user = session.Settings.UserID, + password = session.Settings.Password, + connecttimeout = 10000 + }; + using (var conn = MySQLX.GetSession(connObj)) + { + conn.SQL("SELECT SLEEP(10)").Execute(); + var res = conn.SQL("select @@port").Execute().FirstOrDefault(); + Assert.That(res, Is.Not.Null); + } + + var connStrBuilder = new MySqlXConnectionStringBuilder(); + connStrBuilder.ConnectTimeout = 10000; + connStrBuilder.UserID = session.Settings.UserID; + connStrBuilder.Password = session.Settings.Password; + connStrBuilder.Port = Convert.ToUInt32(XPort); + connStrBuilder.Server = session.Settings.Server; + using (var conn = MySQLX.GetSession(connStrBuilder.ConnectionString)) + { + conn.SQL("SELECT SLEEP(10)").Execute(); + var res = conn.SQL("select @@port").Execute().FirstOrDefault(); + Assert.That(res, Is.Not.Null); + } + + connStr = "server=" + session.Settings.Server + ";user=" + session.Settings.UserID + ";port=" + XPort + ";password=" + + session.Settings.Password + ";" + "connect-timeout=10000;"; + connStrBuilder = new MySqlXConnectionStringBuilder(connStr); + using (var conn = MySQLX.GetSession(connStrBuilder.ConnectionString)) + { + conn.SQL("SELECT SLEEP(10)").Execute(); + var res = conn.SQL("select @@port").Execute().FirstOrDefault(); + Assert.That(res, Is.Not.Null); + } + + connStr = ConnectionString + ";protocol=Socket;" + + "database=" + schemaName + ";characterset=utf8mb4;sslmode=Required;ssl-ca=" + + sslCa + $";certificatepassword={sslCertificatePassword};certificatestorelocation=LocalMachine;" + + ";keepalive =10;auth=PLAIN;certificatethumbprint=;" + + "connect-timeout=" + 10000; + var mysqlx0 = new MySqlXConnectionStringBuilder(connStr); + using (var conn = MySQLX.GetSession(mysqlx0.ConnectionString)) + { + conn.SQL("SELECT SLEEP(10)").Execute(); + var res = conn.SQL("select @@port").Execute().FirstOrDefault(); + Assert.That(res, Is.Not.Null); + } + + mysqlx0 = new MySqlXConnectionStringBuilder(); + mysqlx0.UserID = session.Settings.UserID; + mysqlx0.Password = session.Settings.Password; + mysqlx0.Port = Convert.ToUInt32(XPort); + mysqlx0.Server = session.Settings.Server; + mysqlx0.ConnectionProtocol = MySqlConnectionProtocol.Tcp; + mysqlx0.Database = schemaName; + mysqlx0.CharacterSet = "utf8mb4"; + mysqlx0.SslMode = MySqlSslMode.Required; + mysqlx0.SslCa = sslCa; + mysqlx0.CertificatePassword = sslCertificatePassword; + mysqlx0.CertificateStoreLocation = MySqlCertificateStoreLocation.LocalMachine; + mysqlx0.Keepalive = 10; + mysqlx0.Auth = MySqlAuthenticationMode.PLAIN; + mysqlx0.CertificateThumbprint = ""; + mysqlx0.ConnectTimeout = (uint)10000; + + using (var conn = MySQLX.GetSession(mysqlx0.ConnectionString)) + { + conn.SQL("SELECT SLEEP(10)").Execute(); + var res = conn.SQL("select @@port").Execute().FirstOrDefault(); + Assert.That(res, Is.Not.Null); + } + } + + [Test, Description("Test that if an unexpected error occurs during the specified time frame, the execution should stop and the error must be reported to the user")] + public void WrongPasswordException() + { + string connStr = null; + string password = "wrongpassword"; + Object[] ConnectTimeout = new Object[] { 10000 }; + for (int i = 0; i < ConnectTimeout.Length; i++) + { + // Connection String + connStr = "server=" + session.Settings.Server + ";user=" + session.Settings.UserID + ";port=" + XPort + ";password=" + + password + ";" + "connect-timeout=" + ConnectTimeout[i]; + Assert.Throws(() => MySQLX.GetSession(connStr)); + //String Builder + var connStrBuilder = new MySqlXConnectionStringBuilder(connStr); + Assert.Throws(() => MySQLX.GetSession(connStrBuilder.ConnectionString)); + // Uri + connStr = "mysqlx://" + session.Settings.UserID + ":" + password + "@" + session.Settings.Server + ":" + XPort + "?connect-timeout=" + ConnectTimeout[i]; + Assert.Throws(() => MySQLX.GetSession(connStr)); + // Anonymous Object + var connObj = new { server = session.Settings.Server, port = XPort, user = session.Settings.UserID, password = password, connecttimeout = ConnectTimeout[i] }; + Assert.Throws(() => MySQLX.GetSession(connStr)); + } + } + + [Test, Description("Test the default connect timeout with mock server with concurrent connections")] + public async Task ConnectTimeoutConcurrentConnections() + { + MockServer mServer = new MockServer(false); + mServer.StartServer(); + + await Task.Run(() => SubThread1(mServer.Address.ToString(), mServer.Port.ToString())); + await Task.Run(() => SubThread2(mServer.Address.ToString(), mServer.Port.ToString())); + + mServer.StopServer(); + mServer.DisposeListener(); + } + + private void SubThread1(string address, string port) + { + for (int i = 0; i < 5; i++) + { + string connStr = "server=" + address + ";user=" + session.Settings.UserID + ";port=" + port + ";password=" + + session.Settings.Password + ";" + "connect-timeout=2000;"; + TestConnectStringTimeoutFailureTimeout(connStr, 1, 5, "Timeout value between 1 and 3 second"); + } + } + + private void SubThread2(string address, string port) + { + for (int i = 0; i < 5; i++) + { + string connStr = "server=" + address + ";user=" + session.Settings.UserID + ";port=" + port + ";password=" + + session.Settings.Password + ";" + "connect-timeout=2000;"; + TestConnectStringTimeoutFailureTimeout(connStr, 1, 5, "Timeout value between 1 and 3 second"); + } + } + + + [Test, Description("CONNECT-TIMEOUT WORKS WITH BLANK VALUES FOR CONNECTION STRING AND URI")] + public void ConnectTimeoutBlankValues() + { + var connObj = new { server = session.Settings.Server, port = XPort, user = session.Settings.UserID, password = session.Settings.Password, connecttimeout = "" }; + Assert.Throws(() => MySQLX.GetSession(connObj)); + + connObj = new { server = session.Settings.Server, port = XPort, user = session.Settings.UserID, password = session.Settings.Password, connecttimeout = " " }; + Assert.Throws(() => MySQLX.GetSession(connObj)); + + var connStr = $"server={session.Settings.Server};user={session.Settings.UserID};port={XPort};password={session.Settings.Password};connect-timeout=''"; + Assert.Throws(() => MySQLX.GetSession(connStr)); + + connStr = $"server={session.Settings.Server};user={session.Settings.UserID};port={XPort};password={session.Settings.Password};connect-timeout=' '"; + Assert.Throws(() => MySQLX.GetSession(connStr)); + + connStr = $"server={session.Settings.Server};user={session.Settings.UserID};port={XPort};password={session.Settings.Password};connect-timeout="; + Assert.Throws(() => MySQLX.GetSession(connStr)); + + connStr = $"server={session.Settings.Server};user={session.Settings.UserID};port={XPort};password={session.Settings.Password};connect-timeout= "; + Assert.Throws(() => MySQLX.GetSession(connStr)); + + connStr = $"mysqlx://{session.Settings.UserID}:{session.Settings.Password}@{session.Settings.Server}:{XPort}?connect-timeout="; + Assert.Throws(() => MySQLX.GetSession(connStr)); + + connStr = $"mysqlx://{session.Settings.UserID}:{session.Settings.Password}@{session.Settings.Server}:{XPort}?connect-timeout= "; + Assert.Throws(() => MySQLX.GetSession(connStr)); + } + + /// + /// Bug28624010 + /// + [Test, Description("CONNECTIONTIMEOUT OPT WORKS WITH XPLUGN IF A CLASSIC CONN IS ESTABLISD")] + public void TimeoutWithClassicConnection() + { + int connectionTimeout = 10; + var connStr1 = $"server={session.Settings.Server};user={session.Settings.UserID};port={Port};password={session.Settings.Password};sslmode={MySqlSslMode.Required}"; + var conn = new MySqlConnection(connStr1); + conn.Open(); + conn.Close(); + var connStr = $"server={session.Settings.Server};user={session.Settings.UserID};port={XPort};password={session.Settings.Password};connectiontimeout={connectionTimeout}"; + Assert.Throws(() => MySQLX.GetSession(connStr)); + + connStr = $"mysqlx://{session.Settings.UserID}:{session.Settings.Password}@{session.Settings.Server}:{XPort}?connectiontimeout={connectionTimeout} "; + Assert.Throws(() => MySQLX.GetSession(connStr)); + + var connObj = new { server = session.Settings.Server, port = XPort, user = session.Settings.UserID, password = session.Settings.Password, connectiontimeout = connectionTimeout }; + Assert.Throws(() => MySQLX.GetSession(connObj)); + } + + [Test, Description("MySQLX Session Stress test")] + public void SessionStressTest() + { + for (int i = 0; i < 1000; i++) + { + using (Session session1 = MySQLX.GetSession(ConnectionString)) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + session1.Close(); + } + } + } + + [Test, Description("Getsession using Anonymous Type-Positive")] + public void GetSessionAnonymousTypePositiveStress() + { + for (int i = 0; i < 200; i++) + { + var connectionStringObject = new { connection = $"server={Host};user={session.Settings.UserID};port={XPort};password={session.Settings.Password};sslmode={MySqlSslMode.Required};" }; + using (Session sessionPlain = MySQLX.GetSession(connectionStringObject.connection)) + { + var db = sessionPlain.GetSchema(schemaName); + var col = CreateCollection("my_collection_123456789"); + sessionPlain.Close(); + } + } + } + + [Test, Description("Test Audit Plugin")] + public void SessionAuditPluginTest() + { + using (var mysqlx = MySQLX.GetSession(ConnectionString)) + { + Assert.That(mysqlx.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + mysqlx.Close(); + } + using (var mysql = new MySqlConnection($"server={Host};user={session.Settings.UserID};port={Port};password={session.Settings.Password}")) + { + mysql.Open(); + Assert.That(mysql.connectionState, Is.EqualTo(ConnectionState.Open)); + mysql.Close(); + } + Assert.Throws(() => MySQLX.GetSession($"server={Host};user={session.Settings.UserID};port={XPort};password=wrong")); + } + + [Test, Description("Classic Client with xprotocol server")] + public void ClassicClientXProtocol() + { + Assume.That(Platform.IsWindows(), "This test is only for Windows OS."); + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + + string connectionString = $"server={Host};user={session.Settings.UserID};port={XPort};password={session.Settings.Password}"; + using (var session1 = new MySqlConnection(connectionString)) + { + Exception ex = Assert.Throws(() => session1.Open()); + Assert.That(ex.Message, Is.EqualTo("Unsupported protocol version.")); + } + } + + #region Methods + + public void TestConnectObjectTimeoutSuccessTimeout(object connString, int minTime, int maxTime, string test) + { + Stopwatch sw = new Stopwatch(); + sw.Start(); + var conn = MySQLX.GetSession(connString); + sw.Stop(); + Assert.That(sw.Elapsed.Seconds >= minTime && sw.Elapsed.Seconds <= maxTime, String.Format("Timeout exceeded ({0}). Actual time: {1}", test, sw.Elapsed)); + } + + public void TestConnectStringTimeoutSuccessTimeout(String connString, int minTime, int maxTime, string test) + { + Stopwatch sw = new Stopwatch(); + sw.Start(); + var conn = MySQLX.GetSession(connString); + sw.Stop(); + Assert.That(sw.Elapsed.Seconds >= minTime && sw.Elapsed.Seconds <= maxTime, String.Format("Timeout exceeded ({0}). Actual time: {1}", test, sw.Elapsed)); + } + + public void TestConnectObjTimeoutFailureTimeout(object connString, int minTime, int maxTime, string test) + { + Stopwatch sw = new Stopwatch(); + sw.Start(); + Assert.Throws(() => MySQLX.GetSession(connString)); + sw.Stop(); + Assert.That(sw.Elapsed.Seconds >= minTime && sw.Elapsed.Seconds < maxTime, String.Format("Timeout exceeded ({0}). Actual time: {1}", test, sw.Elapsed)); + } + + public void TestConnectObjTimeoutFailureNoTimeout(object connString, int minTime, int maxTime, string test) + { + Stopwatch sw = new Stopwatch(); + sw.Start(); + Assert.Throws(() => MySQLX.GetSession(connString)); + sw.Stop(); + Assert.That(sw.Elapsed.Seconds >= minTime && sw.Elapsed.Seconds < maxTime, String.Format("Timeout exceeded ({0}). Actual time: {1}", test, sw.Elapsed)); + } + + public void TestConnectStringTimeoutFailureTimeout(String connString, int minTime, int maxTime, string test) + { + Stopwatch sw = new Stopwatch(); + sw.Start(); + Assert.Throws(() => MySQLX.GetSession(connString)); + sw.Stop(); + Assert.That(sw.Elapsed.Seconds >= minTime && sw.Elapsed.Seconds < maxTime, String.Format("Timeout exceeded ({0}). Actual time: {1}", test, sw.Elapsed)); + } + + public void TestConnectStringTimeoutFailureNoConnectTimeout(String connString, int minTime, int maxTime, string test) + { + Stopwatch sw = new Stopwatch(); + sw.Start(); + Assert.Throws(() => MySQLX.GetSession(connString)); + sw.Stop(); + Assert.That(sw.Elapsed.Seconds >= minTime && sw.Elapsed.Seconds < maxTime, String.Format("Timeout exceeded ({0}). Actual time: {1}", test, sw.Elapsed)); + } + + public void TestClientQueueTimeout(Client client, int minTime, int maxTime, string test) + { + Stopwatch sw = new Stopwatch(); + sw.Start(); + Assert.Throws(() => client.GetSession()); + sw.Stop(); + Assert.That(sw.Elapsed.Seconds >= minTime && sw.Elapsed.Seconds < maxTime, + String.Format("Timeout exceeded ({0}). Actual time: {1}", test, sw.Elapsed)); + } + + public void TestClientSuccessTimeout(int minTime, int maxTime, string test, string connectionString, object poolingObject) + { + using (var client = MySQLX.GetClient(connectionString, poolingObject)) + { + Stopwatch sw = new Stopwatch(); + sw.Start(); + client.GetSession(); + sw.Stop(); + Assert.That(sw.Elapsed.Seconds >= minTime && sw.Elapsed.Seconds < maxTime, String.Format("Timeout exceeded ({0}). Actual time: {1}", test, sw.Elapsed)); + } + } + + public void TestClientSuccessTimeout(int minTime, int maxTime, string test, object connectionObject, object poolingObject) + { + using (var client = MySQLX.GetClient(connectionObject, poolingObject)) + { + Stopwatch sw = new Stopwatch(); + sw.Start(); + client.GetSession(); + sw.Stop(); + Assert.That(sw.Elapsed.Seconds >= minTime && sw.Elapsed.Seconds < maxTime, String.Format("Timeout exceeded ({0}). Actual time: {1}", test, sw.Elapsed)); + } + } + public void TestFailureTimeout(Client client, int minTime, int maxTime, string test) + { + DateTime start = DateTime.Now; + Assert.Catch(() => client.GetSession()); + TimeSpan diff = DateTime.Now.Subtract(start); + Assert.That(diff.TotalSeconds >= minTime && diff.TotalSeconds < maxTime, String.Format("Timeout exceeded ({0}). Actual time: {1}", test, diff)); + } + + private void MeasureConnectionString(string connStr, int maxTime, string test, int iteration) + { + Stopwatch sw = new Stopwatch(); + sw.Start(); + + for (int i = 0; i < iteration; i++) + { + using Session conn = MySQLX.GetSession(connStr); + } + + sw.Stop(); + Assert.That(sw.Elapsed.Seconds < maxTime, String.Format("Timeout exceeded ({0}). Actual time: {1}", test, sw.Elapsed)); + } + + private void MeasureConnectionObject(object connStr, int maxTime, string test, int iteration) + { + Stopwatch sw = new Stopwatch(); + sw.Start(); + + for (int i = 0; i < iteration; i++) + { + using Session conn = MySQLX.GetSession(connStr); + } + + sw.Stop(); + Assert.That(sw.Elapsed.Seconds < maxTime, String.Format("Timeout exceeded ({0}). Actual time: {1}", test, sw.Elapsed)); + } + + public long NanoTime() + { + long nano = 10000L * Stopwatch.GetTimestamp(); + nano /= TimeSpan.TicksPerMillisecond; + nano *= 100L; + return nano; + } + + public long DoConnectString(string connectionString) + { + long queryStartTime, queryRunTime = 0; + queryStartTime = NanoTime(); + var session = MySQLX.GetSession(connectionString); + queryRunTime = NanoTime() - queryStartTime; + session.Close(); + session.Dispose(); + return queryRunTime; + } + + public long DoConnectObject(object connectionString) + { + long queryStartTime, queryRunTime = 0; + queryStartTime = NanoTime(); + var session = MySQLX.GetSession(connectionString); + queryRunTime = NanoTime() - queryStartTime; + session.Close(); + session.Dispose(); + return queryRunTime; + } + + /// + /// Calculate the Connection per second + /// Total execution time.(Connection+query execution time) + /// Query execution time + public float CalculateTPS(long elapsedTime, long transactions) + { + float tps = 0; + if (elapsedTime > 0.0) + { + tps = (float)transactions / elapsedTime; + tps = tps * 1000; + } + return tps; + } + + #endregion Methods + + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/SslTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/SslTests.cs new file mode 100644 index 000000000..f424c85d4 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/SslTests.cs @@ -0,0 +1,1554 @@ +// Copyright © 2018, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Generic; + +namespace MySqlX.Data.Tests +{ + public class SslTests : BaseTest + { + #region General + + [Test] + public void SslSession() + { + using (var s3 = MySQLX.GetSession(ConnectionStringUri)) + { + Assert.That(s3.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + var result = ExecuteSQLStatement(s3.SQL("SHOW SESSION STATUS LIKE 'Mysqlx_ssl_version';")).FetchAll(); + Assert.That(result[0][1].ToString(), Does.StartWith("TLSv1")); + } + } + + [Test] + public void SslEmptyCertificate() + { + string connstring = ConnectionStringUri + $"/?ssl-ca="; + // if certificate is empty, it connects without a certificate + using (var s1 = MySQLX.GetSession(connstring)) + { + Assert.That(s1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + var result = ExecuteSQLStatement(s1.SQL("SHOW SESSION STATUS LIKE 'Mysqlx_ssl_version';")).FetchAll(); + Assert.That(result[0][1].ToString(), Does.StartWith("TLSv1")); + } + } + + [Test] + public void SslOptions() + { + string connectionUri = ConnectionStringUri; + // sslmode is valid. + using (var connection = MySQLX.GetSession(connectionUri + "?sslmode=required")) + { + Assert.That(connection.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + using (var connection = MySQLX.GetSession(connectionUri + "?ssl-mode=required")) + { + Assert.That(connection.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + // sslenable is invalid. + Assert.Throws(() => MySQLX.GetSession(connectionUri + "?sslenable")); + Assert.Throws(() => MySQLX.GetSession(connectionUri + "?ssl-enable")); + + // sslmode=Required is default value. + using (var connection = MySQLX.GetSession(connectionUri)) + { + Assert.That(MySqlSslMode.Required, Is.EqualTo(connection.Settings.SslMode)); + } + + // sslmode case insensitive. + using (var connection = MySQLX.GetSession(connectionUri + "?SsL-mOdE=required")) + { + Assert.That(connection.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + using (var connection = MySQLX.GetSession(connectionUri + "?SsL-mOdE=VeRiFyca&ssl-ca=../../../../MySql.Data.Tests/client.pfx&ssl-ca-pwd=pass")) + { + Assert.That(connection.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + var uri = connection.Uri; + } + + // Duplicate SSL connection options do not send error message. + Assert.DoesNotThrow(() => MySQLX.GetSession(connectionUri + "?sslmode=Required&ssl mode=None")); + Assert.DoesNotThrow(() => MySQLX.GetSession(connectionUri + "?ssl-ca-pwd=pass&ssl-ca-pwd=pass")); + Assert.DoesNotThrow(() => MySQLX.GetSession(connectionUri + "?certificatepassword=pass&certificatepassword=pass")); + Assert.DoesNotThrow(() => MySQLX.GetSession(connectionUri + "?certificatepassword=pass&ssl-ca-pwd=pass")); + + // Does not error out if sslmode=Disabled and another ssl parameter exists. + Assert.DoesNotThrow(() => MySQLX.GetSession(connectionUri + "?sslmode=Disabled&ssl-ca=../../../../MySql.Data.Tests/certificates/client.pfx")); + } + + [Test] + public void SslRequiredByDefault() + { + using (var connection = MySQLX.GetSession(ConnectionStringUri)) + { + Assert.That(connection.Settings.SslMode, Is.EqualTo(MySqlSslMode.Required)); + } + } + + [Test] + public void SslPreferredIsInvalid() + { + string prefered = "Prefered"; +#if NET8_0_OR_GREATER + prefered = "Preferred"; +#endif + var expectedErrorMessage = "Value '{0}' is not of the correct type"; + + // In connection string. + var exception = Assert.Throws(() => MySQLX.GetSession(ConnectionStringUri + "?ssl-mode=Preferred")); + Assert.That(exception.Message, Is.EqualTo(string.Format(expectedErrorMessage, "Preferred"))); + exception = Assert.Throws(() => MySQLX.GetSession(ConnectionStringUri + "?ssl-mode=Prefered")); + Assert.That(exception.Message, Is.EqualTo(string.Format(expectedErrorMessage, "Prefered"))); + + // In anonymous object. + var builder = new MySqlXConnectionStringBuilder(ConnectionString); + var connectionObject = new + { + server = builder.Server, + port = builder.Port, + user = builder.UserID, + password = builder.Password, + sslmode = MySqlSslMode.Prefered + }; + exception = Assert.Throws(() => MySQLX.GetSession(connectionObject)); + Assert.That(exception.Message, Is.EqualTo(string.Format(expectedErrorMessage, prefered))); + + // In MySqlXConnectionStringBuilder. + builder = new MySqlXConnectionStringBuilder(ConnectionString); + builder.SslMode = MySqlSslMode.Prefered; + exception = Assert.Throws(() => MySQLX.GetSession(connectionObject)); + Assert.That(exception.Message, Is.EqualTo(string.Format(expectedErrorMessage, prefered))); + + builder = new MySqlXConnectionStringBuilder(ConnectionString); + builder.SslMode = MySqlSslMode.Preferred; + exception = Assert.Throws(() => MySQLX.GetSession(connectionObject)); + Assert.That(exception.Message, Is.EqualTo(string.Format(expectedErrorMessage, prefered))); + } + + [Test] + [Property("Category", "Security")] + public void GetUriWithSSLParameters() + { + var session = GetSession(); + + var builder = new MySqlXConnectionStringBuilder(); + builder.Server = session.Settings.Server; + builder.UserID = session.Settings.UserID; ; + builder.Password = session.Settings.Password; + builder.Port = session.Settings.Port; + builder.ConnectionProtocol = MySqlConnectionProtocol.Tcp; + builder.Database = session.Settings.Database; + builder.CharacterSet = session.Settings.CharacterSet; + builder.SslMode = MySqlSslMode.Required; + builder.SslCa = "../../../../MySql.Data.Tests/client.pfx"; + builder.CertificatePassword = sslCertificatePassword; + builder.ConnectTimeout = 10000; + builder.Auth = MySqlAuthenticationMode.AUTO; + + var connectionString = builder.ConnectionString; + string uri = null; + + // Create session with connection string. + using (var internalSession = MySQLX.GetSession(connectionString)) + { + uri = internalSession.Uri; + } + + // Create session with the uri version of the connection string. + using (var internalSession = MySQLX.GetSession(uri)) + { + // Compare values of the connection options. + foreach (string connectionOption in builder.Keys) + { + // SslCrl connection option is skipped since it isn't currently supported. + if (connectionOption == "sslcrl") + continue; + + // Authentication mode AUTO/DEFAULT is internally assigned, hence it is expected to be different in this scenario. + if (connectionOption == "auth") + Assert.That(internalSession.Settings[connectionOption], Is.EqualTo(MySqlAuthenticationMode.PLAIN)); + else + Assert.That(internalSession.Settings[connectionOption], Is.EqualTo(builder[connectionOption])); + } + } + } + + [Test] + [Property("Category", "Security")] + [Ignore("Check failure: The remote certificate was rejected by the provided RemoteCertificateValidationCallback.")] + public void GetUriKeepsSSLMode() + { + var globalSession = GetSession(); + var builder = new MySqlXConnectionStringBuilder(); + builder.Server = globalSession.Settings.Server; + builder.UserID = globalSession.Settings.UserID; + builder.Password = globalSession.Settings.Password; + builder.Port = globalSession.Settings.Port; + builder.Database = schemaName; + builder.CharacterSet = globalSession.Settings.CharacterSet; + builder.SslMode = MySqlSslMode.VerifyCA; + // Setting SslCa will also set CertificateFile. + builder.SslCa = "client.pfx"; + builder.CertificatePassword = sslCertificatePassword; + builder.ConnectTimeout = 10000; + // Auth will change to the authentication mode internally used PLAIN, MySQL41, SHA256_MEMORY: + builder.Auth = MySqlAuthenticationMode.AUTO; + // Doesn't show in the session.URI because Tcp is the default value. Tcp, Socket and Sockets are treated the same. + builder.ConnectionProtocol = MySqlConnectionProtocol.Tcp; + + string uri = null; + using (var internalSession = MySQLX.GetSession(builder.ConnectionString)) + { + uri = internalSession.Uri; + } + + using (var internalSession = MySQLX.GetSession(uri)) + { + Assert.That(internalSession.Settings.Server, Is.EqualTo(builder.Server)); + Assert.That(internalSession.Settings.UserID, Is.EqualTo(builder.UserID)); + Assert.That(internalSession.Settings.Password, Is.EqualTo(builder.Password)); + Assert.That(internalSession.Settings.Port, Is.EqualTo(builder.Port)); + Assert.That(internalSession.Settings.Database, Is.EqualTo(builder.Database)); + Assert.That(internalSession.Settings.CharacterSet, Is.EqualTo(builder.CharacterSet)); + Assert.That(internalSession.Settings.SslMode, Is.EqualTo(builder.SslMode)); + Assert.That(internalSession.Settings.SslCa, Is.EqualTo(builder.SslCa)); + Assert.That(internalSession.Settings.CertificatePassword, Is.EqualTo(builder.CertificatePassword)); + Assert.That(internalSession.Settings.ConnectTimeout, Is.EqualTo(builder.ConnectTimeout)); + Assert.That(internalSession.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.PLAIN)); + } + } + + /// + /// WL14811 - Remove support for TLS 1.0 and 1.1 + /// + [TestCase("[]", 1)] + [TestCase("Tlsv1, Tlsv1.1", 2)] + [TestCase("Tlsv1, foo", 2)] + [TestCase("Tlsv1", 2)] + [TestCase("Tlsv1.1", 2)] + [TestCase("foo, bar", 3)] + [TestCase("Tlsv1.0, Tlsv1.2", 0)] + [TestCase("foo, Tlsv1.2", 0)] + //#if NET48 || NETCOREAPP3_1 || NET5_0 || NET6_0 + // [TestCase("Tlsv1.3", "Tlsv1.3")] + // [TestCase("Tlsv1.0, Tlsv1.1, Tlsv1.2, Tlsv1.3", "Tlsv1.3")] + //#endif +#if NET452 + [TestCase("Tlsv1.3", 4)] + [TestCase("Tlsv1.0, Tlsv1.1, Tlsv1.2, Tlsv1.3", 0)] +#endif + [Property("Category", "Security")] + public void TlsVersionTest(string tlsVersion, int error) + { + var globalSession = GetSession(); + var builder = new MySqlXConnectionStringBuilder + { + Server = globalSession.Settings.Server, + UserID = globalSession.Settings.UserID, + Password = globalSession.Settings.Password, + Port = globalSession.Settings.Port, + Database = schemaName + }; + void SetTlsVersion() { builder.TlsVersion = tlsVersion; } + + string ex; + string tls = "TLSv1"; + + switch (error) + { + case 1: + ex = Assert.Throws(SetTlsVersion).Message; + Assert.That(ex, Is.EqualTo(MySql.Data.Resources.TlsVersionsEmpty).IgnoreCase); + break; + case 2: + ex = Assert.Throws(SetTlsVersion).Message; + Assert.That(ex, Is.EqualTo(MySql.Data.Resources.TlsUnsupportedVersions).IgnoreCase); + break; + case 3: + ex = Assert.Throws(SetTlsVersion).Message; + Assert.That(ex, Is.EqualTo(MySql.Data.Resources.TlsNonValidProtocols).IgnoreCase); + break; + case 4: + SetTlsVersion(); + Assert.Throws(() => MySQLX.GetSession(builder.ConnectionString)); + break; + default: + SetTlsVersion(); + string uri = null; + + using (var internalSession = MySQLX.GetSession(builder.ConnectionString)) + { + uri = internalSession.Uri; + Assert.That(internalSession.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(internalSession.SQL("SHOW SESSION STATUS LIKE 'mysqlx_ssl_version'").Execute().FetchAll()[0][1].ToString(), Does.StartWith(tls)); + } + using (var internalSession = MySQLX.GetSession(uri)) + { + Assert.That(internalSession.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(internalSession.SQL("SHOW SESSION STATUS LIKE 'mysqlx_ssl_version'").Execute().FetchAll()[0][1].ToString(), Does.StartWith(tls)); + } + + break; + } + } + + /// + /// WL14811 - Remove support for TLS 1.0 and 1.1 + /// + [TestCase("Tlsv1.0, Tlsv1.2")] + [TestCase("foo, Tlsv1.2")] + public void TlsVersionNoSslTest(string tlsVersion) + { + var globalSession = GetSession(); + var builder = new MySqlXConnectionStringBuilder + { + Server = globalSession.Settings.Server, + UserID = globalSession.Settings.UserID, + Password = globalSession.Settings.Password, + Port = globalSession.Settings.Port, + Database = schemaName, + TlsVersion = tlsVersion, + SslMode = MySqlSslMode.Disabled + }; + + string uri = null; + + using (var internalSession = MySQLX.GetSession(builder.ConnectionString)) + { + uri = internalSession.Uri; + Assert.That(internalSession.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(internalSession.SQL("SHOW SESSION STATUS LIKE 'mysqlx_ssl_version'").Execute().FetchAll()[0][1].ToString(), Is.Empty); + } + using (var internalSession = MySQLX.GetSession(uri)) + { + Assert.That(internalSession.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(internalSession.SQL("SHOW SESSION STATUS LIKE 'mysqlx_ssl_version'").Execute().FetchAll()[0][1].ToString(), Is.Empty); + } + } + + #endregion + + #region PFX Certificates + + [Test] + public void SslCertificate() + { + string path = "../../../../MySql.Data.Tests/"; + string connstring = ConnectionStringUri + $"/?ssl-ca={path}client.pfx&ssl-ca-pwd=pass"; + using (var s3 = MySQLX.GetSession(connstring)) + { + Assert.That(s3.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + var result = ExecuteSQLStatement(s3.SQL("SHOW SESSION STATUS LIKE 'Mysqlx_ssl_version';")).FetchAll(); + Assert.That(result[0][1].ToString(), Does.StartWith("TLSv1")); + } + } + + [Test] + public void SslCrl() + { + string connstring = ConnectionStringUri + "/?ssl-crl=crlcert.pfx"; + Assert.Throws(() => MySQLX.GetSession(connstring)); + } + + [Test] + public void SslCertificatePathKeepsCase() + { + var certificatePath = "../../../../MySql.Data.Tests/client.pfx"; + // Connection string in basic format. + string connString = ConnectionString + ";ssl-ca=" + certificatePath + ";ssl-ca-pwd=pass;"; + var stringBuilder = new MySqlXConnectionStringBuilder(connString); + Assert.That(stringBuilder.CertificateFile, Is.EqualTo(certificatePath)); + Assert.That(stringBuilder.SslCa, Is.EqualTo(certificatePath)); + Assert.That(stringBuilder.ConnectionString.Contains(certificatePath)); + connString = stringBuilder.ToString(); + Assert.That(connString.Contains(certificatePath)); + + // Connection string in uri format. + string connStringUri = ConnectionStringUri + "/?ssl-ca=" + certificatePath + "& ssl-ca-pwd=pass;"; + using (var session = MySQLX.GetSession(connStringUri)) + { + Assert.That(session.Settings.CertificateFile, Is.EqualTo(certificatePath)); + Assert.That(session.Settings.SslCa, Is.EqualTo(certificatePath)); + Assert.That(session.Settings.ConnectionString.Contains(certificatePath)); + connString = session.Settings.ToString(); + Assert.That(connString.Contains(certificatePath)); + } + } + + // Fix Bug 24510329 - UNABLE TO CONNECT USING TLS/SSL OPTIONS FOR THE MYSQLX URI SCHEME. + [TestCase("../../../../MySql.Data.Tests/client.pfx")] + [TestCase("(../../../../MySql.Data.Tests/client.pfx)")] + [TestCase(@"(..\..\..\..\MySql.Data.Tests\client.pfx")] + [TestCase("..\\..\\..\\..\\MySql.Data.Tests\\client.pfx")] + public void SslCertificatePathVariations(string certificatePath) + { + string connStringUri = ConnectionStringUri + "/?ssl-ca=" + certificatePath + "& ssl-ca-pwd=pass;"; + + using (var session = MySQLX.GetSession(connStringUri)) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + + #endregion + + #region PEM Certificates + + [Test] + [Property("Category", "Security")] + public void SslCertificateConnectionOptionsExistAndDefaultToNull() + { + var builder = new MySqlXConnectionStringBuilder(); + + // Options exist. + Assert.That(builder.values.ContainsKey("sslca")); + Assert.That(builder.values.ContainsKey("sslcert")); + Assert.That(builder.values.ContainsKey("sslkey")); + + // Options default to null. + Assert.That(builder["sslca"], Is.Null); + Assert.That(builder["sslcert"], Is.Null); + Assert.That(builder["sslkey"], Is.Null); + Assert.That(builder["ssl-ca"], Is.Null); + Assert.That(builder["ssl-cert"], Is.Null); + Assert.That(builder["ssl-key"], Is.Null); + Assert.That(builder.SslCa, Is.Null); + Assert.That(builder.SslCert, Is.Null); + Assert.That(builder.SslKey, Is.Null); + + // Null or whitespace options are ignored. + builder = new MySqlXConnectionStringBuilder(ConnectionString); + builder.SslCa = null; + builder.SslCert = string.Empty; + builder.SslKey = " "; + using (var session = MySQLX.GetSession(builder.ConnectionString)) + { + Assert.That(session.Settings.SslCa, Is.Null); + Assert.That(session.Settings.SslCert, Is.Null); + Assert.That(session.Settings.SslKey, Is.EqualTo(" ")); + session.Close(); + } + + // Failing to provide a value defaults to null. + using (var session = MySQLX.GetSession($"{ConnectionString};sslca=;sslcert=;sslkey=")) + { + Assert.That(session.Settings.SslCa, Is.Null); + Assert.That(session.Settings.SslCert, Is.Null); + Assert.That(session.Settings.SslKey, Is.Null); + session.Close(); + } + } + + [Test] + [Property("Category", "Security")] + public void MissingSslCaConnectionOption() + { + var builder = new MySqlXConnectionStringBuilder(ConnectionString); + builder.SslMode = MySqlSslMode.VerifyCA; + var exception = Assert.Throws(() => MySQLX.GetSession(builder.ConnectionString)); + Assert.That(exception.Message, Is.EqualTo(MySql.Data.Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(string.Format(MySql.Data.Resources.FilePathNotSet, nameof(builder.SslCa)))); + + builder.SslMode = MySqlSslMode.VerifyFull; + exception = Assert.Throws(() => MySQLX.GetSession(builder.ConnectionString)); + Assert.That(exception.Message, Is.EqualTo(MySql.Data.Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(string.Format(MySql.Data.Resources.FilePathNotSet, nameof(builder.SslCa)))); + } + + [Test] + [Property("Category", "Security")] + public void MissingSslCertConnectionOption() + { + var builder = new MySqlXConnectionStringBuilder(ConnectionString); + builder.SslCa = sslCa; + builder.SslCert = string.Empty; + builder.SslMode = MySqlSslMode.VerifyFull; + var exception = Assert.Throws(() => MySQLX.GetSession(builder.ConnectionString)); + Assert.That(exception.Message, Is.EqualTo(MySql.Data.Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(string.Format(MySql.Data.Resources.FilePathNotSet, nameof(builder.SslCert)))); + } + + [Test] + [Property("Category", "Security")] + public void MissingSslKeyConnectionOption() + { + var builder = new MySqlXConnectionStringBuilder(ConnectionString); + builder.SslCa = sslCa; + builder.SslCert = sslCert; + builder.SslKey = " "; + builder.SslMode = MySqlSslMode.VerifyFull; + var exception = Assert.Throws(() => MySQLX.GetSession(builder.ConnectionString)); + Assert.That(exception.Message, Is.EqualTo(MySql.Data.Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(string.Format(MySql.Data.Resources.FilePathNotSet, nameof(builder.SslKey)))); + } + + [Test] + [Property("Category", "Security")] + public void InvalidFileNameForSslCaConnectionOption() + { + var builder = new MySqlXConnectionStringBuilder(ConnectionString); + builder.SslCa = "C:\\certs\\ca.pema"; + builder.SslMode = MySqlSslMode.VerifyCA; + var exception = Assert.Throws(() => MySQLX.GetSession(builder.ConnectionString)); + Assert.That(exception.Message, Is.EqualTo(MySql.Data.Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(MySql.Data.Resources.FileNotFound)); + } + + [Test] + [Property("Category", "Security")] + public void InvalidFileNameForSslCertConnectionOption() + { + var builder = new MySqlXConnectionStringBuilder(ConnectionString); + builder.SslCa = sslCa; + builder.SslCert = "C:\\certs\\client-cert"; + builder.SslMode = MySqlSslMode.VerifyFull; + var exception = Assert.Throws(() => MySQLX.GetSession(builder.ConnectionString)); + Assert.That(exception.Message, Is.EqualTo(MySql.Data.Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(MySql.Data.Resources.FileNotFound)); + } + + [Test] + [Property("Category", "Security")] + public void InvalidFileNameForSslKeyConnectionOption() + { + var builder = new MySqlXConnectionStringBuilder(ConnectionString); + builder.SslCa = sslCa; + builder.SslCert = sslCert; + builder.SslKey = "file"; + builder.SslMode = MySqlSslMode.VerifyFull; + var exception = Assert.Throws(() => MySQLX.GetSession(builder.ConnectionString)); + Assert.That(exception.Message, Is.EqualTo(MySql.Data.Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(MySql.Data.Resources.FileNotFound)); + } + + [Test] + [Property("Category", "Security")] + public void ConnectUsingCaPemCertificate() + { + var builder = new MySqlXConnectionStringBuilder(ConnectionString); + builder.SslCa = sslCa; + builder.SslMode = MySqlSslMode.VerifyCA; + using (var session = MySQLX.GetSession(builder.ConnectionString)) + { + session.Close(); + } + } + + [Test] + [Property("Category", "Security")] + public void ConnectUsingAllCertificates() + { + var builder = new MySqlXConnectionStringBuilder(ConnectionString); + builder.SslCa = sslCa; + builder.SslCert = sslCert; + builder.SslKey = sslKey; + builder.SslMode = MySqlSslMode.VerifyFull; + using (var session = MySQLX.GetSession(builder.ConnectionString)) + { + session.Close(); + } + + builder.SslKey = sslKey.Replace("client-key.pem", "client-key_altered.pem"); + Assert.Throws(() => MySQLX.GetSession(builder.ConnectionString)); + } + + [Test] + [Property("Category", "Security")] + public void SslCaConnectionOptionsAreIgnoredOnDifferentSslModes() + { + var builder = new MySqlXConnectionStringBuilder(ConnectionString); + builder.SslCa = "dummy_file"; + builder.SslMode = MySqlSslMode.Required; + + // Connection attempt is successful since SslMode=Preferred causing SslCa to be ignored. + using (var session = MySQLX.GetSession(builder.ConnectionString)) + { + session.Close(); + } + } + + [Test] + [Property("Category", "Security")] + public void SslCertandKeyConnectionOptionsAreIgnoredOnDifferentSslModes() + { + var builder = new MySqlConnectionStringBuilder(ConnectionString); + builder.SslCa = "dummy_file"; + builder.SslCert = null; + builder.SslKey = " "; + builder.SslMode = MySqlSslMode.Required; + + // Connection attempt is successful since SslMode=Required causing SslCa, SslCert and SslKey to be ignored. + using (var session = MySQLX.GetSession(builder.ConnectionString)) + { + session.Close(); + } + } + + [Test] + [Property("Category", "Security")] + public void AttemptConnectionWithDummyPemCertificates() + { + var builder = new MySqlXConnectionStringBuilder(ConnectionString); + builder.SslCa = sslCa.Replace("ca.pem", "ca_dummy.pem"); + builder.SslMode = MySqlSslMode.VerifyCA; + var exception = Assert.Throws(() => MySQLX.GetSession(builder.ConnectionString)); + Assert.That(exception.Message, Is.EqualTo(MySql.Data.Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(MySql.Data.Resources.FileIsNotACertificate)); + + builder.SslCa = sslCa; + builder.SslCert = sslCert.Replace("client-cert.pem", "client-cert_dummy.pem"); + builder.SslMode = MySqlSslMode.VerifyFull; + exception = Assert.Throws(() => MySQLX.GetSession(builder.ConnectionString)); + Assert.That(exception.Message, Is.EqualTo(MySql.Data.Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(MySql.Data.Resources.FileIsNotACertificate)); + + builder.SslCa = sslCa; + builder.SslCert = sslCert; + builder.SslKey = sslKey.Replace("client-key.pem", "client-key_dummy.pem"); + builder.SslMode = MySqlSslMode.VerifyFull; + exception = Assert.Throws(() => MySQLX.GetSession(builder.ConnectionString)); + Assert.That(exception.Message, Is.EqualTo(MySql.Data.Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(MySql.Data.Resources.FileIsNotAKey)); + } + + [Test] + [Property("Category", "Security")] + public void AttemptConnectionWitSwitchedPemCertificates() + { + var builder = new MySqlXConnectionStringBuilder(ConnectionString); + builder.SslCa = sslCert; + builder.SslMode = MySqlSslMode.VerifyCA; + var exception = Assert.Throws(() => MySQLX.GetSession(builder.ConnectionString)); + Assert.That(exception.Message, Is.EqualTo(MySql.Data.Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(MySql.Data.Resources.SslCertificateIsNotCA)); + + builder.SslCa = sslKey; + builder.SslMode = MySqlSslMode.VerifyCA; + exception = Assert.Throws(() => MySQLX.GetSession(builder.ConnectionString)); + Assert.That(exception.Message, Is.EqualTo(MySql.Data.Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(MySql.Data.Resources.FileIsNotACertificate)); + + builder.SslCa = sslCa; + builder.SslCert = sslCa; + builder.SslMode = MySqlSslMode.VerifyFull; + exception = Assert.Throws(() => MySQLX.GetSession(builder.ConnectionString)); + Assert.That(exception.Message, Is.EqualTo(MySql.Data.Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(MySql.Data.Resources.InvalidSslCertificate)); + + builder.SslCert = sslCert; + builder.SslKey = sslCa; + builder.SslMode = MySqlSslMode.VerifyFull; + exception = Assert.Throws(() => MySQLX.GetSession(builder.ConnectionString)); + Assert.That(exception.Message, Is.EqualTo(MySql.Data.Resources.SslConnectionError)); + Assert.That(exception.InnerException.Message, Is.EqualTo(MySql.Data.Resources.FileIsNotAKey)); + } + + #endregion + + [Test, Description("Wrong Certificate with TLS with URI")] + public void PfxCertificateWithUri() + { + Assume.That(session.Version.isAtLeast(8, 0, 0), "This test is for MySql 8.0 or higher"); + + var connStr = ConnectionStringUri + $"?ssl-mode=VerifyCA&ssl-ca={clientPfxIncorrect}&ssl-ca-pwd={sslCertificatePassword}"; + Assert.That(() => MySQLX.GetSession(connStr), Throws.Exception); + + connStr = ConnectionStringUri + $"?ssl-mode=VerifyCA&ssl-ca={clientPfx}&ssl-ca-pwd=Wrongpassword"; + Assert.That(() => MySQLX.GetSession(connStr), Throws.Exception); + + connStr = ConnectionStringUri + $"?ssl-mode=Required&ssl-ca={clientPfx}&ssl-ca-pwd={sslCertificatePassword}"; + using (var c = MySQLX.GetSession(connStr)) + { + Assert.That(c.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + var res = ExecuteSQLStatement(c.SQL("SHOW SESSION STATUS LIKE 'Mysqlx_ssl_version';")).FetchAll(); + Assert.That(res[0][1].ToString(), Does.StartWith("TLSv1")); + } + } + + [Test, Description("MySQLX ran with Automation for server with TLS")] + public void PfxCertificateWithConnectionString() + { + Assume.That(session.Version.isAtLeast(8, 0, 0), "This test is for MySql 8.0 or higher"); + + var connStr = ConnectionString + $";ssl-mode=Required;ssl-ca={clientPfx};ssl-ca-pwd={sslCertificatePassword};"; + using (Session c = MySQLX.GetSession(connStr)) + { + Assert.That(c.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + var res = ExecuteSQLStatement(c.SQL("SHOW SESSION STATUS LIKE 'Mysqlx_ssl_version';")).FetchAll(); + Assert.That(res[0][1].ToString(), Does.StartWith("TLSv1")); + } + + //wrong certificate + connStr = ConnectionString + $";CertificateFile={clientPfxIncorrect};CertificatePassword={sslCertificatePassword};SSL Mode=Required;"; + Assert.That(() => MySQLX.GetSession(connStr), Throws.Exception); + //wrong password + connStr = ConnectionString + $";CertificateFile={clientPfx};CertificatePassword=WrongPassword;SSL Mode=Required;"; + Assert.That(() => MySQLX.GetSession(connStr), Throws.Exception); + } + + [Test] + public void ConnectUsingCertificateFileAndTlsVersionXplugin() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + + var builder = new MySqlConnectionStringBuilder(ConnectionString); + builder.SslMode = MySqlSslMode.Required; + builder.CertificateFile = "client.pfx"; + builder.CertificatePassword = "pass"; + builder.TlsVersion = "Tlsv1.2"; + using (var session1 = MySQLX.GetSession(builder.ConnectionString)) + { + var result = session1.SQL("show variables like '%tls_version%'").Execute().FetchOne(); + Assert.That(result[1].ToString(), Does.Contain("TLSv1")); + + result = session1.SQL("show status like 'Mysqlx_ssl_cipher'").Execute().FetchOne(); + Assert.That(result[1].ToString().Trim().Length > 0); + + result = session1.SQL("show status like 'Mysqlx_ssl_version'").Execute().FetchOne(); + Assert.That(result[1].ToString(), Is.EqualTo("TLSv1.2").IgnoreCase); + } + } + + [TestCase("TLSv1.2")] + public void TlsVersionInConnectionStringXplugin(string tlsVersion) + { + Assume.That(Platform.IsWindows(), "This test is only for Windows OS."); + Assume.That(session.Version.isAtLeast(8, 0, 16), "This test is for MySql 8.0.16 or higher"); + + var connStr = ConnectionString + $";sslmode=Required;tls-version={tlsVersion}"; + using (var c = MySQLX.GetSession(connStr)) + { + Assert.That(c.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + var res = c.SQL("SHOW SESSION STATUS LIKE 'Mysqlx_ssl_version';").Execute().FetchAll(); + Assert.That(res[0][1].ToString(), Is.EqualTo(tlsVersion).IgnoreCase); + } + } + + [Test, Description("Verify PEM options (SslCa,SslCert,SslKey) with different SSL modes")] + public void PemCertDifferentSSLmodes() + { + Assume.That(session.Version.isAtLeast(8, 0, 16), "This test is for MySql 8.0.16 or higher"); + string CommandText1 = "SHOW STATUS LIKE '%Ssl_cipher%';"; + string CommandText2 = "show status like '%Ssl_version%';"; + string connStr = null; + + string[] sslmodes = { "Disabled", "Prefered", "Preferred", "Required", "VerifyCA" }; + MySqlSslMode[] sslmode = + { MySqlSslMode.Disabled,MySqlSslMode.Prefered,MySqlSslMode.Preferred,MySqlSslMode.Required,MySqlSslMode.VerifyCA }; + string tls = "TLSv1.2"; + + for (int i = 0; i < sslmodes.Length; i++) + { + //Uri + connStr = ConnectionStringUri + $"?Ssl-ca={sslCa}&SslCert={sslCert}&SslKey={sslKey}&ssl-ca-pwd={sslCertificatePassword}&ssl-mode={sslmodes[i]}"; + if (i == 0) + { + using (var session1 = MySQLX.GetSession(connStr)) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + else + { + string sslcompare = sslmodes[i]; + if (i == 2) + { + sslcompare = "Preferred"; + } + if (i == 1 || i == 2) + { + Assert.Throws(() => MySQLX.GetSession(connStr)); + } + else + { + using (var session1 = MySQLX.GetSession(connStr)) + { + var result = session1.SQL(CommandText1).Execute().FetchAll(); + Assert.That(result[0][1].ToString(), Is.EqualTo(result[0][1].ToString()), "Matching the Cipher"); + result = session1.SQL(CommandText2).Execute().FetchAll(); + Assert.That(result[0][1].ToString(), Is.EqualTo(tls), "Matching the TLS version"); + } + } + } + + //Connection string + connStr = ConnectionStringUserWithSSLPEM + $";ssl-ca-pwd={sslCertificatePassword};ssl-mode={sslmodes[i]}"; + if (i == 0) + { + using (var session1 = MySQLX.GetSession(connStr)) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + else + { + if (i == 1 || i == 2) + { + string sslcompare = sslmodes[i]; + if (i == 2) + { + sslcompare = "Preferred"; + } + Assert.Throws(() => MySQLX.GetSession(connStr)); + } + else + { + using (var session1 = MySQLX.GetSession(connStr)) + { + var result = session1.SQL(CommandText1).Execute().FetchAll(); + Assert.That(result[0][1].ToString(), Is.EqualTo(result[0][1].ToString()), "Matching the Cipher"); + result = session1.SQL(CommandText2).Execute().FetchAll(); + Assert.That(result[0][1].ToString(), Is.EqualTo(tls), "Matching the TLS version"); + } + } + } + + //Anonymous Object + var connObject = new + { + server = Host, + port = XPort, + user = session.Settings.UserID, + password = session.Settings.Password, + SslCert = sslCert, + SslKey = sslKey, + CertificatePassword = sslCertificatePassword, + SslCa = sslCa, + sslmode = sslmode[i] + }; + + if (i == 0) + { + using (var session1 = MySQLX.GetSession(connStr)) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } + else + { + string sslcompare = sslmodes[i]; + if (i == 2) + { + sslcompare = "Prefered"; + } + if (i == 1 | i == 2) + { + Assert.Throws(() => MySQLX.GetSession(connObject)); + } + else + { + using (var session1 = MySQLX.GetSession(connObject)) + { + var result = session1.SQL(CommandText1).Execute().FetchAll(); + Assert.That(result[0][1].ToString(), Is.EqualTo(result[0][1].ToString()), "Matching the Cipher"); + result = session1.SQL(CommandText2).Execute().FetchAll(); + Assert.That(result[0][1].ToString(), Is.EqualTo(tls), "Matching the TLS version"); + } + } + } + + //Connection String builder + MySqlXConnectionStringBuilder conn = new MySqlXConnectionStringBuilder(ConnectionString); + conn.SslCert = sslCert; + conn.SslKey = sslKey; + conn.SslCa = sslCa; + conn.SslMode = sslmode[i]; + + if (i == 1 || i == 2) + { + string sslcompare = sslmodes[i]; + if (i == 2) + { + sslcompare = "Prefered"; + } + Assert.Throws(() => MySQLX.GetSession(conn.ConnectionString)); + } + else if (i != 0) + { + using (var session1 = MySQLX.GetSession(conn.ConnectionString)) + { + var result = session1.SQL(CommandText1).Execute().FetchAll(); + Assert.That(result[0][1].ToString(), Is.EqualTo(result[0][1].ToString()), "Matching the Cipher"); + result = session1.SQL(CommandText2).Execute().FetchAll(); + Assert.That(result[0][1].ToString(), Is.EqualTo(tls), "Matching the TLS version"); + } + } + } + } + + [Test, Description("MySQLX-scenario (wrong/no ssl-ca,correct ssl-key/ssl-cert,ssl-mode VerifyCA)")] + public void IncorrectSslCAVerifyCAMode() + { + Assume.That(Platform.IsWindows(), "This test is only for Windows OS."); + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + string sslmode = "VerifyCA"; + string[] sslcalist = new string[] { "ca_dummy.pem", "", " ", null, "file", "file.pem" }; + for (int i = 0; i < sslcalist.Length; i++) + { + var connStr = ConnectionStringUri + $"?Ssl-ca={sslcalist[i]}&SslCert={sslCert}&SslKey={sslKey}&ssl-ca-pwd={sslCertificatePassword}&ssl-mode={sslmode}"; + Assert.Throws(() => MySQLX.GetSession(connStr)); + + connStr = ConnectionStringUri + $"?&SslCert={sslCert}&SslKey={sslKey}&ssl-mode={sslmode}"; + Assert.Throws(() => MySQLX.GetSession(connStr)); + + connStr = ConnectionString + $";Ssl-ca={sslcalist[i]};SslCert={sslCert};SslKey={sslKey};ssl-mode={sslmode}"; + Assert.Throws(() => MySQLX.GetSession(connStr)); + + connStr = ConnectionString + $";SslCert={sslCert};SslKey={sslKey};ssl-mode={sslmode}"; + Assert.Throws(() => MySQLX.GetSession(connStr)); + + var connObject = new + { + server = Host, + port = XPort, + user = session.Settings.UserID, + password = session.Settings.Password, + SslCert = sslCert, + SslKey = sslKey, + CertificatePassword = sslCertificatePassword, + SslCa = sslcalist[i], + sslmode = MySqlSslMode.VerifyCA + }; + Assert.Throws(() => MySQLX.GetSession(connObject)); + + var connObject1 = new + { + server = Host, + port = XPort, + user = session.Settings.UserID, + password = session.Settings.Password, + SslCert = sslCert, + SslKey = sslKey, + CertificatePassword = sslCertificatePassword, + sslmode = MySqlSslMode.VerifyCA + }; + Assert.Throws(() => MySQLX.GetSession(connObject1)); + + MySqlConnectionStringBuilder connClassic = new MySqlConnectionStringBuilder(ConnectionString); + connClassic.SslCert = sslCert; + connClassic.SslKey = sslKey; + connClassic.SslCa = sslcalist[i]; + connClassic.SslMode = MySqlSslMode.VerifyCA; + Assert.Throws(() => MySQLX.GetSession(connClassic.ConnectionString)); + + connClassic = new MySqlConnectionStringBuilder(ConnectionString); + connClassic.SslCert = sslCert; + connClassic.SslKey = sslKey; + connClassic.SslMode = MySqlSslMode.VerifyCA; + Assert.Throws(() => MySQLX.GetSession(connClassic.ConnectionString)); + + MySqlXConnectionStringBuilder conn = new MySqlXConnectionStringBuilder(ConnectionString); + conn.SslCert = sslCert; + conn.SslKey = sslKey; + conn.SslCa = sslcalist[i]; + conn.SslMode = MySqlSslMode.VerifyCA; + Assert.Throws(() => MySQLX.GetSession(connClassic.ConnectionString)); + } + } + + [Test, Description("MySQLX-Scenario (correct ssl-ca,wrong/no ssl-key/ssl-cert,ssl-mode VerifyCA)")] + public void IncorrectSslkeyAndSslcertVerifyCAMode() + { + Assume.That(Platform.IsWindows(), "This test is only for Windows OS."); + Assume.That(session.Version.isAtLeast(8, 0, 0), "This test is for MySql 8.0 or higher"); + string sslmode = "VerifyCA"; + string[] sslcertlist = new string[] { "", " ", null, "file", "file.pem" }; + string[] sslkeylist = new string[] { "", " ", null, "file", "file.pem" }; + List csAndUriList = new List(); + List connObjectList = new List(); + for (int i = 0; i < sslcertlist.Length; i++) + { + csAndUriList.Clear(); + connObjectList.Clear(); + csAndUriList.Add(ConnectionStringUri + $"?Ssl-ca={sslCa}&SslCert={sslcertlist[i]}&SslKey={sslkeylist[i]}&ssl-mode={sslmode}"); + csAndUriList.Add(ConnectionStringUri + $"?Ssl-ca={sslCa}&ssl-mode={sslmode}"); + csAndUriList.Add(ConnectionString + $";Ssl-ca={sslCa};SslCert={sslcertlist[i]};SslKey={sslkeylist[i]};ssl-mode={sslmode}"); + csAndUriList.Add(ConnectionString + $";Ssl-ca={sslCa};ssl-mode={sslmode}"); + foreach (string item in csAndUriList) + { + AssertTlsConnection(item); + } + + connObjectList.Add(new + { + server = Host, + port = XPort, + user = session.Settings.UserID, + password = session.Settings.Password, + SslCert = sslcertlist[i], + SslKey = sslkeylist[i], + CertificatePassword = sslCertificatePassword, + SslCa = sslCa, + sslmode = MySqlSslMode.VerifyCA + }); + connObjectList.Add(new + { + server = Host, + port = XPort, + user = session.Settings.UserID, + password = session.Settings.Password, + CertificatePassword = sslCertificatePassword, + SslCa = sslCa, + sslmode = MySqlSslMode.VerifyCA + }); + foreach (var item in connObjectList) + { + AssertTlsConnection(item); + } + + MySqlConnectionStringBuilder connClassic = new MySqlConnectionStringBuilder(ConnectionString); + connClassic.SslCert = sslcertlist[i]; + connClassic.SslKey = sslkeylist[i]; + connClassic.SslCa = sslCa; + connClassic.SslMode = MySqlSslMode.VerifyCA; + AssertTlsConnection(connClassic.ConnectionString); + + connClassic = new MySqlConnectionStringBuilder(ConnectionString); + connClassic.SslCa = sslCa; + connClassic.SslMode = MySqlSslMode.VerifyCA; + AssertTlsConnection(connClassic.ConnectionString); + + MySqlXConnectionStringBuilder conn = new MySqlXConnectionStringBuilder(ConnectionString); + conn.SslCert = sslcertlist[i]; + conn.SslKey = sslkeylist[i]; + conn.SslCa = sslCa; + conn.SslMode = MySqlSslMode.VerifyCA; + AssertTlsConnection(conn.ConnectionString); + + conn = new MySqlXConnectionStringBuilder(ConnectionString); + conn.SslCa = sslCa; + conn.SslMode = MySqlSslMode.VerifyCA; + AssertTlsConnection(conn.ConnectionString); + } + + } + + [Test, Description("MySQLX-Scenario (wrong ssl-ca,correct ssl-key/ssl-cert,ssl-mode required and default)")] + public void IncorrectSslCACorrectKeyAndCertRequiredMode() + { + Assume.That(Platform.IsWindows(), "This test is only for Windows OS."); + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + string sslmode = "Required"; + string[] sslcalist = new string[] { "ca_dummy.pem", "", " ", null, "file", "file.pem" }; + List csAndUriList = new List(); + List connObjectList = new List(); + for (int i = 0; i < sslcalist.Length; i++) + { + csAndUriList.Clear(); + connObjectList.Clear(); + //Connection String and Uris + csAndUriList.Add(ConnectionStringUri + $"?Ssl-ca={sslcalist[i]}&SslCert={sslCert}&SslKey={sslKey}&ssl-mode={sslmode}"); + csAndUriList.Add(ConnectionStringUri + $"?Ssl-ca={sslcalist[i]}&SslCert={sslCert}&SslKey={sslKey}"); + csAndUriList.Add(ConnectionString + $";Ssl-ca={sslcalist[i]};SslCert={sslCert};SslKey={sslKey};ssl-mode={sslmode}"); + csAndUriList.Add(ConnectionString + $";Ssl-ca={sslcalist[i]};SslCert={sslCert};SslKey={sslKey}"); + foreach (string item in csAndUriList) + { + AssertTlsConnection(item); + } + //Anonymous Objects + connObjectList.Add(new + { + server = Host, + port = XPort, + user = session.Settings.UserID, + password = session.Settings.Password, + SslCert = sslCert, + SslKey = sslKey, + CertificatePassword = sslCertificatePassword, + SslCa = sslcalist[i], + sslmode = MySqlSslMode.Required + }); + connObjectList.Add(new + { + server = Host, + port = XPort, + user = session.Settings.UserID, + password = session.Settings.Password, + SslCert = sslCert, + SslKey = sslKey, + CertificatePassword = sslCertificatePassword, + SslCa = sslcalist[i] + }); + foreach (var item in connObjectList) + { + AssertTlsConnection(item); + } + //MySqlConnectionStringBuilder + var connClassic = new MySqlConnectionStringBuilder(ConnectionString); + connClassic.SslCert = sslCert; + connClassic.SslKey = sslKey; + connClassic.SslCa = sslcalist[i]; + connClassic.SslMode = MySqlSslMode.Required; + AssertTlsConnection(connClassic.ConnectionString); + + connClassic = new MySqlConnectionStringBuilder(ConnectionString); + connClassic.SslCert = sslCert; + connClassic.SslKey = sslKey; + connClassic.SslCa = sslcalist[i]; + AssertTlsConnection(connClassic.ConnectionString); + } + } + + [Test, Description("MySQLX-Scenario (no ssl-ca,correct ssl-key/ssl-cert,ssl-mode required and default)")] + public void NoSslcaWithSslkeySslcertRequiredMode() + { + Assume.That(Platform.IsWindows(), "This test is only for Windows OS."); + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + string sslmode = "Required"; + List csAndUriList = new List(); + List connObjectList = new List(); + //Connection String and Uris + csAndUriList.Add(ConnectionStringUri + $"?SslCert={sslCert}&SslKey={sslKey}&ssl-mode={sslmode}"); + csAndUriList.Add(ConnectionStringUri + $"?SslCert={sslCert}&SslKey={sslKey}"); + csAndUriList.Add(ConnectionString + $";SslCert={sslCert};SslKey={sslKey};ssl-mode={sslmode}"); + csAndUriList.Add(ConnectionString + $";SslCert={sslCert};SslKey={sslKey}"); + foreach (string item in csAndUriList) + { + AssertTlsConnection(item); + } + //Anonymous Objects + connObjectList.Add(new + { + server = Host, + port = XPort, + user = session.Settings.UserID, + password = session.Settings.Password, + SslCert = sslCert, + SslKey = sslKey, + CertificatePassword = sslCertificatePassword, + sslmode = MySqlSslMode.Required + }); + connObjectList.Add(new + { + server = Host, + port = XPort, + user = session.Settings.UserID, + password = session.Settings.Password, + SslCert = sslCert, + SslKey = sslKey, + CertificatePassword = sslCertificatePassword, + }); + foreach (var item in connObjectList) + { + AssertTlsConnection(item); + } + } + + [Test, Description("MySQLX-Scenario (correct ssl-ca,wrong ssl-key/ssl-cert,ssl-mode required and default)")] + public void CorrectSslcaWrongSslkeySslcertRequiredMode() + { + Assume.That(Platform.IsWindows(), "This test is only for Windows OS."); + string sslmode = "Required"; + string[] sslcertlist = new string[] { "", " ", null, "file", "file.pem" }; + string[] sslkeylist = new string[] { "", " ", null, "file", "file.pem" }; + List csAndUriList = new List(); + List connObjectList = new List(); + for (int i = 0; i < sslcertlist.Length; i++) + { + csAndUriList.Clear(); + connObjectList.Clear(); + //Connection String and Uri + csAndUriList.Add(ConnectionStringUri + $"?Ssl-ca={sslCa}&SslCert={sslcertlist[i]}&SslKey={sslkeylist[i]}&ssl-mode={sslmode}"); + csAndUriList.Add(ConnectionStringUri + $"?Ssl-ca={sslCa}&SslCert={sslcertlist[i]}&SslKey={sslkeylist[i]}"); + csAndUriList.Add(ConnectionString + $";Ssl-ca={sslCa};SslCert={sslcertlist[i]};SslKey={sslkeylist[i]};ssl-mode={sslmode}"); + csAndUriList.Add(ConnectionString + $";Ssl-ca={sslCa};SslCert={sslcertlist[i]};SslKey={sslkeylist[i]}"); + foreach (string item in csAndUriList) + { + AssertTlsConnection(item); + } + //Anonymous Objects + connObjectList.Add(new + { + server = Host, + port = XPort, + user = session.Settings.UserID, + password = session.Settings.Password, + SslCert = sslcertlist[i], + SslKey = sslkeylist[i], + CertificatePassword = sslCertificatePassword, + SslCa = sslCa, + sslmode = MySqlSslMode.Required + }); + connObjectList.Add(new + { + server = Host, + port = XPort, + user = session.Settings.UserID, + password = session.Settings.Password, + SslCert = sslcertlist[i], + SslKey = sslkeylist[i], + CertificatePassword = sslCertificatePassword, + SslCa = sslCa, + }); + + foreach (var item in connObjectList) + { + AssertTlsConnection(item); + } + //MySqlConnectionStringBuilder and MySqlXConnectionStringBuilder + MySqlConnectionStringBuilder connClassic = new MySqlConnectionStringBuilder(ConnectionString); + connClassic.SslCert = sslcertlist[i]; + connClassic.SslKey = sslkeylist[i]; + connClassic.SslCa = sslCa; + connClassic.SslMode = MySqlSslMode.Required; + AssertTlsConnection(connClassic.ConnectionString); + + connClassic = new MySqlConnectionStringBuilder(ConnectionString); + connClassic.SslCert = sslcertlist[i]; + connClassic.SslKey = sslkeylist[i]; + connClassic.SslCa = sslCa; + AssertTlsConnection(connClassic.ConnectionString); + + MySqlXConnectionStringBuilder conn = new MySqlXConnectionStringBuilder(ConnectionString); + conn.SslCert = sslcertlist[i]; + conn.SslKey = sslkeylist[i]; + conn.SslCa = sslCa; + conn.SslMode = MySqlSslMode.Required; + AssertTlsConnection(conn.ConnectionString); + + conn = new MySqlXConnectionStringBuilder(ConnectionString); + conn.SslCert = sslcertlist[i]; + conn.SslKey = sslkeylist[i]; + conn.SslCa = sslCa; + AssertTlsConnection(conn.ConnectionString); + } + } + + [Test, Description("MySQLX-Scenario (correct ssl-ca,no ssl-key/ssl-cert,ssl-mode required and default)")] + public void CorrectSslcaNoSslkeyorCertRequiredMode() + { + Assume.That(Platform.IsWindows(), "This test is only for Windows OS."); + Assume.That(session.Version.isAtLeast(8, 0, 0), "This test is for MySql 8.0 or higher"); + string sslmode = "Required"; + List csAndUriList = new List(); + //Connection string and Uris + csAndUriList.Add(ConnectionStringUri + $"?Ssl-ca={sslCa}&ssl-mode={sslmode}"); + csAndUriList.Add(ConnectionStringUri + $"?Ssl-ca={sslCa}"); + csAndUriList.Add(ConnectionString + $";Ssl-ca={sslCa};ssl-mode={sslmode}"); + csAndUriList.Add(ConnectionString + $";Ssl-ca={sslCa}"); + foreach (string item in csAndUriList) + { + AssertTlsConnection(item); + } + //Anonymous Objects + List connObjectList = new List(); + connObjectList.Add(new + { + server = Host, + port = XPort, + user = session.Settings.UserID, + password = session.Settings.Password, + CertificatePassword = sslCertificatePassword, + SslCa = sslCa, + sslmode = MySqlSslMode.Required + }); + connObjectList.Add(new + { + server = Host, + port = XPort, + user = session.Settings.UserID, + password = session.Settings.Password, + CertificatePassword = sslCertificatePassword, + SslCa = sslCa, + }); + + foreach (var item in connObjectList) + { + AssertTlsConnection(item); + } + //MySqlConnectionStringBuilder and MySqlXConnectionStringBuilder + MySqlConnectionStringBuilder connClassic = new MySqlConnectionStringBuilder(ConnectionString); + connClassic.SslCa = sslCa; + connClassic.SslMode = MySqlSslMode.Required; + AssertTlsConnection(connClassic.ConnectionString); + + connClassic = new MySqlConnectionStringBuilder(ConnectionString); + connClassic.SslCa = sslCa; + AssertTlsConnection(connClassic.ConnectionString); + + MySqlXConnectionStringBuilder conn = new MySqlXConnectionStringBuilder(ConnectionString); + conn.SslCa = sslCa; + conn.SslMode = MySqlSslMode.Required; + AssertTlsConnection(conn.ConnectionString); + + conn = new MySqlXConnectionStringBuilder(ConnectionString); + conn.SslCa = sslCa; + AssertTlsConnection(conn.ConnectionString); + } + + [Test, Description("mixed spelling ssl-ca, ssl-key/ssl-cert, ssl-mode VerifyCA and Required)")] + public void MixedspellingSslcaSslkeySslcert() + { + Assume.That(Platform.IsWindows(), "This test is only for Windows OS."); + Assume.That(session.Version.isAtLeast(8, 0, 0), "This test is for MySql 8.0.0 or higher"); + string[] sslmode = new string[] { "VerifyCA", "Required" }; + for (int i = 0; i < sslmode.Length; i++) + { + string[] sslcalist = new string[] { "Ssl-ca", "ssl-ca", "ssl-CA", "sSl-cA", "sslca", "SslCa", "SSLCA" }; + for (int j = 0; j < sslcalist.Length; j++) + { + var connStr = ConnectionStringUri + $"?{sslcalist[j]}={sslCa}&SslCert={sslCert}&SslKey={sslKey}&ssl-mode={sslmode[i]}"; + AssertTlsConnection(connStr); + + connStr = ConnectionString + $";{sslcalist[j]}={sslCa}&SslCert={sslCert}&SslKey={sslKey}&ssl-mode={sslmode[i]}"; + AssertTlsConnection(connStr); + } + + string[] sslcertlist = new string[] { "Ssl-cert", "ssl-cert", "ssl-CERT", "sSl-cErt", "sslcert", "SslCert", "SSLCERT" }; + for (int j = 0; j < sslcertlist.Length; j++) + { + var connStr = ConnectionStringUri + $"?Ssl-ca={sslCa}&{sslcertlist[j]}={sslCert}&SslKey={sslKey}&ssl-mode={sslmode[i]}"; + AssertTlsConnection(connStr); + + connStr = ConnectionString + $";Ssl-ca={sslCa};{sslcertlist[j]}={sslCert};SslKey={sslKey}&ssl-mode={sslmode[i]}"; + AssertTlsConnection(connStr); + } + + string[] sslkeylist = new string[] { "Ssl-key", "ssl-key", "ssl-KEY", "sSl-kEy", "sslkey", "SslKey", "SSLKEY" }; + for (int j = 0; j < sslkeylist.Length; j++) + { + var connStr = ConnectionStringUri + $"?Ssl-ca={sslCa}&Ssl-cert={sslCert}&{sslkeylist[j]}={sslKey}&ssl-mode={sslmode[i]}"; + AssertTlsConnection(connStr); + + connStr = ConnectionString + $";Ssl-ca={sslCa};{sslcertlist[j]}={sslCert};{sslkeylist[j]}={sslKey}&ssl-mode={sslmode[i]}"; + AssertTlsConnection(connStr); + } + } + } + + [Test, Description("checking errors when invalid values are used ")] + public void InvalidTlsversionValues() + { + string[] version = new string[] { "null", "v1", "[ ]", "[TLSv1.9]", "[TLSv1.1,TLSv1.7]", "ui9" }; + var conStr = $"{ConnectionString};SslCa={sslCa};SslCert={sslCert};SslKey={sslKey};ssl-ca-pwd={sslCertificatePassword}"; + foreach (string tlsVersion in version) + { + Assert.Throws(() => MySQLX.GetSession(conStr + $";ssl-mode={MySqlSslMode.Required};tls-version={tlsVersion}")); + } + + Assert.Throws(() => MySQLX.GetSession(conStr + $";ssl-mode={MySqlSslMode.Required};tls-version=[TLSv1];tls-version=[TLSv1]")); + Assert.Throws(() => MySQLX.GetSession(conStr + $";ssl-mode={MySqlSslMode.Required};tls-version=[TLSv1.1,TLSv1.2];tls-version=[TLSv1.1,TLSv1.2]")); + } + + /// + /// Bug 30411413 + /// + [Test, Description("bug:checking behaviour of error obtained due to repeated tls option")] + public void RepeatedTlsOption() + { + var conStr = $"{ConnectionString};SslCa={sslCa};SslCert={sslCert};SslKey={sslKey};ssl-ca-pwd={sslCertificatePassword}"; + Assert.Throws(() => new MySqlConnection(conStr + ";tls-version=TLSv1.2;tls-version=TLSv1.1")); + Assert.Throws(() => MySQLX.GetSession(conStr + ";tls-version=TLSv1.2;tls-version=TLSv1.2")); + } + + [Test, Description("checking different versions of TLS")] + public void SecurityTlsCheck() + { + Assume.That(Platform.IsWindows(), "This test is only for Windows OS."); + MySqlSslMode[] modes = { MySqlSslMode.Required, MySqlSslMode.VerifyCA, MySqlSslMode.VerifyFull }; + String[] version, ver1Tls; + var conStrX = $"{ConnectionString};SslCa={sslCa};SslCert={sslCert};SslKey={sslKey};ssl-ca-pwd={sslCertificatePassword}"; + foreach (MySqlSslMode mode in modes) + { + using (Session session1 = MySQLX.GetSession(conStrX + $";ssl-mode={mode};tls-version=TLSv1.2")) + { + var sess = session1.SQL("select variable_value from performance_schema.session_status where variable_name='mysqlx_ssl_version'").Execute().FetchOne()[0]; + Assert.That(sess, Is.EqualTo("TLSv1.2")); + } + + version = new string[] { "[TLSv1.1,TLSv1.2]", "[TLSv1,TLSv1.2]" }; + ver1Tls = new string[] { "TLSv1.2", "TLSv1.2" }; + for (int i = 0; i < 2; i++) + { + using (Session session1 = MySQLX.GetSession(conStrX + ";ssl-mode=" + mode + ";tls-version=" + version[i])) + { + var sess = session1.SQL("select variable_value from performance_schema.session_status where variable_name='mysqlx_ssl_version'").Execute().FetchOne()[0]; + Assert.That(sess, Is.EqualTo(ver1Tls[i])); + } + } + } + } + + [Test, Description("bug: checking behaviour of TLSv1.3 in dotnet framework 4.8")] + [Ignore("Bug30411389")] + public void Tlsv13Bug() + { + Session session1 = null; + var conStr = $"{ConnectionString};SslCa={sslCa};SslCert={sslCert};SslKey={sslKey};ssl-ca-pwd={sslCertificatePassword}"; + + using (session1 = MySQLX.GetSession(conStr + ";tls-version=TLSv1.3")) + { + var sess1 = session1.SQL("select variable_value from performance_schema.session_status where variable_name='mysqlx_ssl_version'").Execute().FetchOne()[0]; + Assert.That(sess1, Is.EqualTo("TLSv1.3")); + } + + using (session1 = MySQLX.GetSession(conStr + ";tls-version=TLSv1.2")) + { + var sess1 = session1.SQL("select variable_value from performance_schema.session_status where variable_name='mysqlx_ssl_version'").Execute().FetchOne()[0]; + Assert.That(sess1, Is.EqualTo("TLSv1.2")); + } + + using (session1 = MySQLX.GetSession(conStr + ";tls-version=TLSv1.2,TLSv1.3")) + { + var sess1 = session1.SQL("select variable_value from performance_schema.session_status where variable_name='mysqlx_ssl_version'").Execute().FetchOne()[0]; + Assert.That(sess1, Is.EqualTo("TLSv1.3")); + } + } + + [Test, Description("checking TLSv1.3 in Linux")] + [Ignore("Fix this")] + public void Tlsv13Linux() + { + Assume.That(!Platform.IsWindows(), "This test is only for Linux OS."); + + MySqlSslMode[] modes = { MySqlSslMode.Required, MySqlSslMode.VerifyCA, MySqlSslMode.VerifyFull }; + var conStr = $"{ConnectionString};SslCa={sslCa};SslCert={sslCert};SslKey={sslKey};ssl-ca-pwd={sslCertificatePassword}"; + foreach (MySqlSslMode mode in modes) + { + string[] version = new string[] { "TLSv1.3", "[TLSv1.3]" }; + + foreach (string tlsVersion in version) + { + Assert.That(MySQLX.GetSession(conStr + ";ssl-mode=" + mode + ";tls-version=" + tlsVersion).InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + version = new string[] { "[TLSv1,TLSv1.3]", "[TLSv1.1,TLSv1.3]", "[TLSv1,TLSv1.2,TLSv1.3]", "[TLSv1.2,TLSv1.3]", "[TLSv1,TLSv1.1,TLSv1.2,TLSv1.3]" }; + + for (int i = 0; i < version.Length; i++) + { + using (var session1 = MySQLX.GetSession(conStr + ";ssl-mode=" + mode + ";tls-version=" + version[i])) + { + var sess = session1.SQL("select variable_value from performance_schema.session_status where variable_name='mysqlx_ssl_version'").Execute().FetchOne()[0]; + Assert.That(sess.ToString().Contains("TLSv1")); + } + } + } + } + + private void AssertTlsConnection(string inputString) + { + string CommandText1 = "SHOW STATUS LIKE '%Ssl_cipher%';"; + string CommandText2 = "show status like '%Ssl_version%';"; + + string cipher = ""; + if (session.Version.isAtLeast(9, 2, 0)) + cipher = "ECDHE-RSA-AES128-GCM-SHA256"; + else + cipher = "ECDHE-RSA-AES256-GCM-SHA384"; + + string tls = "TLSv1.2"; + using (var session1 = MySQLX.GetSession(inputString)) + { + var result = session1.SQL(CommandText1).Execute().FetchAll(); + Assert.That(result[0][1].ToString(), Is.EqualTo(cipher), "Matching the Cipher"); + result = session1.SQL(CommandText2).Execute().FetchAll(); + Assert.That(result[0][1].ToString(), Is.EqualTo(tls), "Matching the TLS version"); + } + } + + private void AssertTlsConnection(object inputObject) + { + string CommandText1 = "SHOW STATUS LIKE '%Ssl_cipher%';"; + string CommandText2 = "show status like '%Ssl_version%';"; + + string cipher = ""; + if (session.Version.isAtLeast(9, 2, 0)) + cipher = "ECDHE-RSA-AES128-GCM-SHA256"; + else + cipher = "ECDHE-RSA-AES256-GCM-SHA384"; + + string tls = "TLSv1.2"; + using (var session1 = MySQLX.GetSession(inputObject)) + { + var result = session1.SQL(CommandText1).Execute().FetchAll(); + Assert.That(result[0][1].ToString(), Is.EqualTo(cipher), "Matching the Cipher"); + result = session1.SQL(CommandText2).Execute().FetchAll(); + Assert.That(result[0][1].ToString(), Is.EqualTo(tls), "Matching the TLS version"); + } + } + + /// + /// WL14828 - Align TLS option checking across connectors + /// + [TestCase(MySqlSslMode.Disabled)] + [TestCase(MySqlSslMode.Disabled, "ssl-ca=foo")] + [TestCase(MySqlSslMode.Disabled, "ssl-cert=foo")] + [TestCase(MySqlSslMode.Disabled, "ssl-key=foo")] + [TestCase(MySqlSslMode.Disabled, "tls-version=TLSv1.2")] + [Theory] + public void SslOptionsCombinedWhenDisabled(MySqlSslMode sslMode, string sslOption = "") + { + // ConnectionString + var connStr = ConnectionString + $";ssl-mode={sslMode};{sslOption}"; + + using var session = MySQLX.GetSession(connStr); + var encryption = session.SQL("SHOW SESSION STATUS LIKE 'mysqlx_ssl_cipher'").Execute().FetchAll()[0][1].ToString(); + + Assert.That(encryption, Is.Empty); + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + + // ConnectionString Uri + var connStrUri = ConnectionStringUri + $"?ssl-mode={sslMode}&{sslOption}"; + + using var sessionUri = MySQLX.GetSession(connStrUri); + encryption = sessionUri.SQL("SHOW SESSION STATUS LIKE 'mysqlx_ssl_cipher'").Execute().FetchAll()[0][1].ToString(); + + Assert.That(encryption, Is.Empty); + Assert.That(sessionUri.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + [Test] + public void SslRequiredAndDisabled() + { + var connStrUri = ConnectionStringUri + $"?ssl-mode={MySqlSslMode.Required}&ssl-mode={MySqlSslMode.Disabled}"; + + using var sessionUriDisabled = MySQLX.GetSession(connStrUri); + var encryption = sessionUriDisabled.SQL("SHOW SESSION STATUS LIKE 'mysqlx_ssl_cipher'").Execute().FetchAll()[0][1].ToString(); + + Assert.That(encryption, Is.Empty); + Assert.That(sessionUriDisabled.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + + connStrUri = ConnectionStringUri + $"?ssl-mode={MySqlSslMode.Disabled}&ssl-mode={MySqlSslMode.Required}"; + + using var sessionUriRequired = MySQLX.GetSession(connStrUri); + encryption = sessionUriRequired.SQL("SHOW SESSION STATUS LIKE 'mysqlx_ssl_cipher'").Execute().FetchAll()[0][1].ToString(); + + Assert.That(encryption, Is.Not.Empty); + Assert.That(sessionUriRequired.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/TransactionTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/TransactionTests.cs new file mode 100644 index 000000000..778a06428 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/TransactionTests.cs @@ -0,0 +1,997 @@ +// Copyright © 2015, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI; +using MySqlX.XDevAPI.Common; +using MySqlX.XDevAPI.CRUD; +using MySqlX.XDevAPI.Relational; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Linq; + +namespace MySqlX.Data.Tests +{ + public class TransactionTests : BaseTest + { + private string collName = "collSp"; + + [TearDown] + public void TearDown() => session.Schema.DropCollection(collName); + + [Test] + public void Commit() + { + Collection coll = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + + // start the transaction + coll.Session.StartTransaction(); + + Result r = ExecuteAddStatement(coll.Add(docs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4)); + + // now roll it back + coll.Session.Commit(); + + var foundDocs = ExecuteFindStatement(coll.Find()); + Assert.That(foundDocs.Next()); + Assert.That(foundDocs.Next()); + Assert.That(foundDocs.Next()); + Assert.That(foundDocs.Next()); + Assert.That(foundDocs.Next(), Is.False); + } + + [Test] + public void Rollback() + { + Collection coll = CreateCollection("test"); + var docs = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + + // start the transaction + coll.Session.StartTransaction(); + + Result r = ExecuteAddStatement(coll.Add(docs)); + Assert.That(r.AffectedItemsCount, Is.EqualTo(4)); + + // now roll it back + coll.Session.Rollback(); + + var foundDocs = ExecuteFindStatement(coll.Find()); + Assert.That(foundDocs.Next(), Is.False); + } + + #region Savepoints + + [Test] + public void CreateUnnamedSavepoint() + { + using (var session = MySQLX.GetSession(ConnectionString)) + { + session.StartTransaction(); + + string spName = session.SetSavepoint(); + Assert.That(string.IsNullOrWhiteSpace(spName), Is.False); + + session.Rollback(); + } + } + + [Test] + public void RollbackToSavepoint() + { + using (var session = MySQLX.GetSession(ConnectionString)) + { + var schema = session.GetSchema("test"); + schema.DropCollection("collSP"); + var coll = schema.CreateCollection("collSP"); + + session.StartTransaction(); + + ExecuteAddStatement(coll.Add("{ \"test\": \"test\" }")); + var sp = session.SetSavepoint(); + ExecuteAddStatement(coll.Add("{ \"test\": \"test\" }")); + Assert.That(ExecuteFindStatement(coll.Find()).FetchAll().Count, Is.EqualTo(2)); + session.RollbackTo(sp); + Assert.That(ExecuteFindStatement(coll.Find()).FetchAll(), Has.One.Items); + + session.Rollback(); + } + } + + [Test] + public void ReleaseSavepoint() + { + using (var sessionTest = MySQLX.GetSession(ConnectionString)) + { + var coll = CreateCollection("test"); + sessionTest.StartTransaction(); + ExecuteAddStatement(coll.Add("{ \"test\": \"test\" }")); + var sp = sessionTest.SetSavepoint(); + ExecuteAddStatement(coll.Add("{ \"test2\": \"test2\" }")); + Assert.That(ExecuteFindStatement(coll.Find()).FetchAll().Count, Is.EqualTo(2)); + sessionTest.ReleaseSavepoint(sp); + Assert.That(ExecuteFindStatement(coll.Find()).FetchAll().Count, Is.EqualTo(2)); + sessionTest.Rollback(); + } + } + + [Test] + public void CreateNamedSavepoint() + { + using (var session = MySQLX.GetSession(ConnectionString)) + { + session.StartTransaction(); + + string spName = session.SetSavepoint("mySavedPoint"); + Assert.That(string.IsNullOrWhiteSpace(spName), Is.False); + + session.Rollback(); + } + } + + [Test] + public void RollbackToNamedSavepoint() + { + using (var session = MySQLX.GetSession(ConnectionString)) + { + var schema = session.GetSchema("test"); + schema.DropCollection("collSP"); + var coll = schema.CreateCollection("collSP"); + session.StartTransaction(); + ExecuteAddStatement(coll.Add("{ \"test\": \"test\" }")); + var sp = session.SetSavepoint("mySavedPoint"); + ExecuteAddStatement(coll.Add("{ \"test2\": \"test2\" }")); + Assert.That(ExecuteFindStatement(coll.Find()).FetchAll().Count, Is.EqualTo(2)); + session.RollbackTo(sp); + Assert.That(ExecuteFindStatement(coll.Find()).FetchAll(), Has.One.Items); + session.Rollback(); + } + } + + [Test] + public void ReleaseNamedSavepoint() + { + using (var session = MySQLX.GetSession(ConnectionString)) + { + var schema = session.GetSchema("test"); + schema.DropCollection("test"); + var coll = schema.CreateCollection("test"); + session.StartTransaction(); + ExecuteAddStatement(coll.Add("{ \"test\": \"test\" }")); + var sp = session.SetSavepoint("mySavedPoint"); + ExecuteAddStatement(coll.Add("{ \"test2\": \"test2\" }")); + Assert.That(ExecuteFindStatement(coll.Find()).FetchAll().Count, Is.EqualTo(2)); + session.ReleaseSavepoint(sp); + Assert.That(ExecuteFindStatement(coll.Find()).FetchAll().Count, Is.EqualTo(2)); + session.Rollback(); + } + } + + [Test] + public void NonExistentSavepoint() + { + using (var session = MySQLX.GetSession(ConnectionString)) + { + session.StartTransaction(); + + Exception exception = Assert.Throws(() => session.RollbackTo("nonExistentSavePoint")); + Assert.That(exception.Message, Is.EqualTo("SAVEPOINT nonExistentSavePoint does not exist")); + + exception = Assert.Throws(() => session.ReleaseSavepoint("nonExistentSavePoint")); + Assert.That(exception.Message, Is.EqualTo("SAVEPOINT nonExistentSavePoint does not exist")); + + session.Rollback(); + } + } + + [Test] + public void CreateSavepointWithWeirdNames() + { + using (var session = MySQLX.GetSession(ConnectionString)) + { + string errorMessage = "You have an error in your SQL syntax"; + session.StartTransaction(); + + Exception ex = Assert.Throws(() => session.SetSavepoint("")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => session.SetSavepoint(" ")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => session.SetSavepoint(null)); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => session.SetSavepoint("-")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => session.SetSavepoint("mysp+")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + ex = Assert.Throws(() => session.SetSavepoint("3306")); + Assert.That(ex.Message, Does.StartWith(errorMessage)); + + var sp = session.SetSavepoint("_"); + session.RollbackTo(sp); + sp = session.SetSavepoint("mysql3306"); + session.RollbackTo(sp); + + session.Rollback(); + } + } + + [Test] + public void OverwriteSavepoint() + { + using (var session = MySQLX.GetSession(ConnectionString)) + { + var schema = session.GetSchema("test"); + var coll = schema.CreateCollection(collName); + + session.StartTransaction(); + + ExecuteAddStatement(coll.Add("{ \"test\": \"test\" }")); + var sp = session.SetSavepoint("mySP"); + ExecuteAddStatement(coll.Add("{ \"test2\": \"test2\" }")); + sp = session.SetSavepoint("mySP"); + ExecuteAddStatement(coll.Add("{ \"test3\": \"test3\" }")); + sp = session.SetSavepoint("mySP"); + ExecuteAddStatement(coll.Add("{ \"test4\": \"test4\" }")); + sp = session.SetSavepoint("mySP"); + session.RollbackTo(sp); + Assert.That(ExecuteFindStatement(coll.Find()).FetchAll().Count, Is.EqualTo(4)); + + session.Rollback(); + } + } + + [Test] + public void MultipleReleasesForSavepoint() + { + using (var session = MySQLX.GetSession(ConnectionString)) + { + session.StartTransaction(); + + var sp = session.SetSavepoint("mySP"); + session.ReleaseSavepoint(sp); + Exception exception = Assert.Throws(() => session.ReleaseSavepoint(sp)); + Assert.That(exception.Message, Is.EqualTo(string.Format("SAVEPOINT {0} does not exist", sp))); + + session.Rollback(); + } + } + + [Test] + public void RollbackAndReleaseAfterTransactionCommit() + { + using (var sessionTest = MySQLX.GetSession(ConnectionString)) + { + var coll = CreateCollection("collSP"); + sessionTest.StartTransaction(); + var sp = sessionTest.SetSavepoint("mySP"); + ExecuteAddStatement(coll.Add("{ \"test\": \"test\" }")); + sessionTest.Commit(); + Exception exception = Assert.Throws(() => sessionTest.RollbackTo(sp)); + Assert.That(exception.Message, Is.EqualTo(string.Format("SAVEPOINT {0} does not exist", sp))); + exception = Assert.Throws(() => sessionTest.ReleaseSavepoint(sp)); + Assert.That(exception.Message, Is.EqualTo(string.Format("SAVEPOINT {0} does not exist", sp))); + } + } + + [Test] + public void RollbackAndReleaseAfterTransactionRollback() + { + using (var sessionTest = MySQLX.GetSession(ConnectionString)) + { + var coll = CreateCollection("collSP"); + sessionTest.StartTransaction(); + + var sp = sessionTest.SetSavepoint("mySP"); + ExecuteAddStatement(coll.Add("{ \"test\": \"test\" }")); + + sessionTest.Rollback(); + + Exception exception = Assert.Throws(() => sessionTest.RollbackTo(sp)); + Assert.That(exception.Message, Is.EqualTo(string.Format("SAVEPOINT {0} does not exist", sp))); + + exception = Assert.Throws(() => sessionTest.ReleaseSavepoint(sp)); + Assert.That(exception.Message, Is.EqualTo(string.Format("SAVEPOINT {0} does not exist", sp))); + } + } + + #endregion + + #region WL14389 + + [Test, Description("Session Close Transaction")] + public void SessionCloseTransaction() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + using (Session sessionTest = MySQLX.GetSession(ConnectionString)) + { + Schema db = null; + db = sessionTest.GetSchema("test"); + sessionTest.StartTransaction(); + + if (db.GetCollection("my_collection_1").ExistsInDatabase()) + { + db.DropCollection("my_collection_1"); + } + Collection col = db.CreateCollection("my_collection_1"); + sessionTest.Close(); + Assert.Throws(() => sessionTest.Rollback()); + } + } + + [Test, Description("Valid Commit and Check Warning ")] + public void CommitValidWarning() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + using (Session sessionPlain = MySQLX.GetSession(ConnectionString)) + { + sessionPlain.SetCurrentSchema("test"); + sessionPlain.SQL("drop table if exists temp").Execute(); + sessionPlain.SQL("CREATE TABLE temp(id INT primary key)").Execute(); + Table table = sessionPlain.Schema.GetTable("temp"); + sessionPlain.StartTransaction(); + table.Insert().Values(5).Execute(); + sessionPlain.Commit(); + Assert.That(table.Count(), Is.EqualTo(1)); + } + } + + /// + /// Bug 23542005 + /// + [Test, Description("Invalid Commit and Check Warning ")] + public void CommitInvalidWarning() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + using (Session sessionPlain = MySQLX.GetSession(ConnectionString)) + { + sessionPlain.SetCurrentSchema("test"); + sessionPlain.SQL("CREATE TABLE temp(v VARCHAR(4))").Execute(); + Table table = sessionPlain.Schema.GetTable("temp"); + sessionPlain.StartTransaction(); + Assert.Throws(() => sessionPlain.GetSchema("test").GetTable("temp").Insert().Values("abcdef").Execute()); + sessionPlain.Commit(); + Assert.That(table.Count(), Is.EqualTo(0)); + var warnings = sessionPlain.SQL("DROP TABLE IF EXISTS temp1").Execute().Warnings; + Assert.That(warnings.Count > 0); + sessionPlain.Commit(); + } + } + + + [Test, Description("Valid Rollback and Check Warning ")] + public void RollbackValidWarning() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + using (Session sessionPlain = MySQLX.GetSession(ConnectionString)) + { + sessionPlain.SetCurrentSchema("test"); + sessionPlain.SQL("DROP TABLE IF EXISTS temp").Execute(); + sessionPlain.SQL("CREATE TABLE temp(id INT primary key)").Execute(); + Table table = sessionPlain.Schema.GetTable("temp"); + sessionPlain.StartTransaction(); + var res = table.Insert().Values(5).Execute(); + sessionPlain.Rollback(); + Assert.That(table.Count(), Is.EqualTo(0)); + Assert.That(res.Warnings.Count, Is.EqualTo(0)); + } + } + + /// + /// Bug 23542005 + /// + [Test, Description("Invalid Rollback and Check Warning ")] + public void RollbackInvalidWarning() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + using (Session sessionPlain = MySQLX.GetSession(ConnectionString)) + { + sessionPlain.SetCurrentSchema("test"); + sessionPlain.SQL("DROP TABLE IF EXISTS temp").Execute(); + sessionPlain.SQL("CREATE TABLE temp(v VARCHAR(4))").Execute(); + Table table = sessionPlain.Schema.GetTable("temp"); + sessionPlain.StartTransaction(); + Assert.Throws(() => sessionPlain.GetSchema("test").GetTable("temp").Insert().Values("abcdef").Execute()); + sessionPlain.Rollback(); + Assert.That(table.Count(), Is.EqualTo(0)); + var res = sessionPlain.SQL("DROP TABLE IF EXISTS temp1").Execute(); + Assert.That(res.Warnings.Count > 0); + } + } + + /// + /// Bug 23542005 + /// + [Test, Description("Commit Rollback Invalid Warning")] + public void CommitRollbackInvalidWarning() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + Collection coll = CreateCollection("test"); + var docs1 = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + }; + + var docs2 = new[] + { + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + + var docs3 = new[] + + { + new { _id = 5, title = "Book 5", pages = 60 }, + new { _id = 6, title = "Book 6", pages = 70 }, + }; + + // start the transaction + coll.Session.StartTransaction(); + + Result r = coll.Add(docs1).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2)); + + r = coll.Add(docs2).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2)); + + r = coll.Add(docs3).Execute(); + Assert.Throws(() => coll.Add(docs3).Execute()); + coll.Session.Commit(); + Assert.That(coll.Count(), Is.EqualTo(6)); + // now Rollback + coll.Session.Rollback(); + Assert.That(coll.Count(), Is.EqualTo(6)); + + var foundDocs = coll.Find().Execute(); + Assert.That(foundDocs, Is.Not.Null); + } + + [Test, Description("MySQLX plugin Warnings")] + public void Warnings() + { + if (!session.Version.isAtLeast(8, 0, 0)) return; + using (Session sessionTest = MySQLX.GetSession(ConnectionString)) + { + Schema schema = sessionTest.GetSchema("test"); + Collection coll = CreateCollection("test"); + + Result r = coll.Add("{ \"foo\": 1 }").Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(1)); + Assert.That(coll.Count(), Is.EqualTo(1)); + r = coll.Add("{ \"fool\": 2 }").Execute(); + Assert.That(r.Warnings.Count, Is.EqualTo(0)); + r = coll.Add("{ \"fool\": 10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }").Execute(); + Assert.That(r.Warnings.Count, Is.EqualTo(0)); + + sessionTest.SQL("use test").Execute(); + sessionTest.SQL("CREATE TABLE nontrac(id INT primary key) ENGINE=MyISAM;").Execute(); + Table table = schema.GetTable("nontrac"); + sessionTest.StartTransaction(); + table.Insert().Values(5).Execute(); + + schema = sessionTest.GetSchema(schemaName); + sessionTest.StartTransaction(); + + var res = sessionTest.SQL("drop table if exists t1, t2").Execute(); + Assert.That(res.Warnings.Count, Is.EqualTo(2)); + Assert.That(res.Warnings[0].Code, Is.EqualTo(1051)); + + Assert.That(res.Warnings[1].Code, Is.EqualTo(1051)); + + res = sessionTest.SQL("create table t1 (a int) engine=innodb").Execute(); + Assert.That(res.Warnings.Count, Is.EqualTo(0)); + res = sessionTest.SQL("create table t2 (a int) engine=myisam").Execute(); + Assert.That(res.Warnings.Count, Is.EqualTo(0)); + res = sessionTest.SQL("insert into t1 values(1)").Execute(); + Assert.That(res.Warnings.Count, Is.EqualTo(0)); + res = sessionTest.SQL("insert into t2 select * from t1").Execute(); + Assert.That(res.Warnings.Count, Is.EqualTo(1)); + sessionTest.Commit(); + + } + } + + //Savepoints + [Test, Description("Rollback to same savepoint multiple times")] + public void RollbackToSameSavepoint() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + + var col = CreateCollection("my_collection"); + session.StartTransaction(); + object[] data = new object[] + { + new { _id = 1, title = "Book 1", pages = 30 }, + new { _id = 2, title = "Book 2", pages = 50 }, + }; + Result result = col.Add(data).Execute(); + var sp = session.SetSavepoint("SavePoint1"); + data = new object[] + { + new { _id = 3, title = "Book 3", pages = 30 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + result = col.Add(data).Execute(); + var sp1 = session.SetSavepoint("SavePoint2"); + + session.RollbackTo(sp); + data = new object[] + { + new { _id = 5, title = "Book 5", pages = 30 }, + new { _id = 6, title = "Book 6", pages = 50 }, + }; + result = col.Add(data).Execute(); + session.RollbackTo(sp); + var doc = col.Find().Execute(); + var docs = doc.FetchAll().Count(); + Assert.That(docs, Is.EqualTo(2)); + } + + + [Test, Description("Releasing a savepoint multiple times")] + public void ReleaseSavepointMoreThanOnce() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + using (Session sessionTest = MySQLX.GetSession(ConnectionString)) + { + var col = CreateCollection("my_collection"); + sessionTest.StartTransaction(); + object[] data = new object[] + { + new { _id = 1, title = "Book 1", pages = 30 }, + new { _id = 2, title = "Book 2", pages = 50 }, + }; + Result result = col.Add(data).Execute(); + var sp = sessionTest.SetSavepoint("SavePoint1"); + data = new object[] + { + new { _id = 3, title = "Book 3", pages = 30 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + result = col.Add(data).Execute(); + sessionTest.ReleaseSavepoint(sp); + data = new object[] + { + new { _id = 5, title = "Book 5", pages = 30 }, + new { _id = 6, title = "Book 6", pages = 50 }, + }; + result = col.Add(data).Execute(); + var ex = Assert.Throws(() => sessionTest.ReleaseSavepoint(sp)); + sessionTest.Rollback(); + } + } + + [TestCase("Savepoint1", "Savepoint2")] + [TestCase("", "")] + [Description("Creating multiple savepoints with SetSavepoint([name]) and rolling back to a specific one")] + public void MultipleSavepointsAndRollback(string savePoint1, string savePoint2) + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + var col = CreateCollection("my_collection"); + session.StartTransaction(); + object[] data = new object[] + { + new { _id = 1, title = "Book 1", pages = 30 }, + new { _id = 2, title = "Book 2", pages = 50 }, + }; + Result result = col.Add(data).Execute(); + var sp = string.IsNullOrEmpty(savePoint1) ? session.SetSavepoint() : session.SetSavepoint(savePoint1); + data = new object[] + { + new { _id = 3, title = "Book 3", pages = 30 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + result = col.Add(data).Execute(); + var sp2 = string.IsNullOrEmpty(savePoint2) ? session.SetSavepoint() : session.SetSavepoint(savePoint2); + session.RollbackTo(sp); + var doc = col.Find().Execute(); + var docs = doc.FetchAll().Count(); + Assert.That(docs, Is.EqualTo(2)); + } + + [Test, Description("Test creating a savepoint without starting a transaction")] + public void SavepointWithoutTransaction() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + var col = CreateCollection("my_collection"); + object[] data = new object[] + { + new { _id = 1, title = "Book 1", pages = 30 }, + new { _id = 2, title = "Book 2", pages = 50 }, + }; + Result result = col.Add(data).Execute(); + var sp = ""; + sp = session.SetSavepoint("SP"); + data = new object[] + { + new { _id =3, title = "Book 3", pages = 30 }, + new { _id =4, title = "Book 4", pages = 50 }, + }; + result = col.Add(data).Execute(); + var sp1 = session.SetSavepoint("SP"); + Assert.Throws(() => session.ReleaseSavepoint(sp1)); + } + + [Test, Description("Validate that further savepoints get released once you release a preceding savepoint")] + public void ValidateSavepointsReleased() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + var col = CreateCollection("my_collection"); + session.StartTransaction(); + + object[] data = new object[] + { + new { _id = 1, title = "Book 1", pages = 30 }, + new { _id = 2, title = "Book 2", pages = 50 }, + }; + Result result = col.Add(data).Execute(); + var sp = session.SetSavepoint("SavePoint1"); + data = new object[] + { + new { _id = 3, title = "Book 3", pages = 30 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + result = col.Add(data).Execute(); + var sp1 = session.SetSavepoint("SavePoint2"); + session.ReleaseSavepoint(sp); + Assert.Throws(() => session.ReleaseSavepoint(sp1)); + + var doc = col.Find().Execute(); + var docs = doc.FetchAll().Count(); + Assert.That(docs, Is.EqualTo(4)); + + } + + + [Test, Description("Validate Nested-transactions with multiple savepoints")] + public void NestedTransactions() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + var col = CreateCollection("my_collection"); + session.StartTransaction(); + object[] data = new object[] + { + new { _id = 1, title = "Book 1", pages = 30 }, + new { _id = 2, title = "Book 2", pages = 50 }, + }; + Result result = col.Add(data).Execute(); + var sp = session.SetSavepoint("Savepoint1"); + session.StartTransaction(); + + data = new object[] + { + new { _id = 3, title = "Book 3", pages = 30 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + result = col.Add(data).Execute(); + var sp1 = session.SetSavepoint("Savepoint2"); + session.Rollback(); + var doc = col.Find().Execute(); + var docs = doc.FetchAll().Count(); + Assert.That(docs, Is.EqualTo(2)); + } + + [Test, Description("Test the behaviour of Savepoints created immediately after one another")] + public void SavepointsCreatedImmediately() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + var col = CreateCollection("my_collection"); + session.StartTransaction(); + object[] data = new object[] + { + new { _id = 1, title = "Book 1", pages = 30 }, + new { _id = 2, title = "Book 2", pages = 50 }, + }; + Result result = col.Add(data).Execute(); + var sp = session.SetSavepoint("Savepoint1"); + var sp1 = session.SetSavepoint("Savepoint2"); + session.RollbackTo(sp); + var doc = col.Find().Execute(); + var docs = doc.FetchAll().Count(); + Assert.That(docs, Is.EqualTo(2)); + } + + [Test, Description("Test MySQLX plugin Commit After Commit")] + public void CommitAfterCommit() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + Collection coll = CreateCollection("test"); + var docs1 = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + }; + + var docs2 = new[] + { + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + + var docs3 = new[] + { + new { _id = 5, title = "Book 5", pages = 60 }, + new { _id = 6, title = "Book 6", pages = 70 }, + }; + + var docs4 = new[] + { + new { _id = 7, title = "Book 7", pages = 80 }, + new { _id = 8, title = "Book 8", pages = 90 }, + }; + + // start the transaction + coll.Session.StartTransaction(); + + Result r = coll.Add(docs1).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2), "Matching"); + + r = coll.Add(docs2).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2), "Matching"); + + r = coll.Add(docs3).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2), "Matching"); + + // now Commit + coll.Session.Commit(); + // start the transaction + coll.Session.StartTransaction(); + r = coll.Add(docs4).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2), "Matching"); + // now Commit Again + coll.Session.Commit(); + + var foundDocs = coll.Find().Execute(); + Assert.That(foundDocs.Next(), Is.EqualTo(true), "Matching"); + Assert.That(foundDocs.Next(), Is.EqualTo(true), "Matching"); + Assert.That(foundDocs.Next(), Is.EqualTo(true), "Matching"); + Assert.That(foundDocs.Next(), Is.EqualTo(true), "Matching"); + Assert.That(foundDocs.Next(), Is.EqualTo(true), "Matching"); + Assert.That(foundDocs.Next(), Is.EqualTo(true), "Matching"); + Assert.That(foundDocs.Next(), Is.EqualTo(true), "Matching"); + Assert.That(foundDocs.Next(), Is.EqualTo(true), "Matching"); + Assert.That(foundDocs.Next(), Is.EqualTo(false), "Matching"); + + } + + [Test, Description("Test MySQLX plugin Rollback Multiple")] + public void RollBackMultiple() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + Collection coll = CreateCollection("test"); + var docs1 = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + }; + + var docs2 = new[] + { + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + + var docs3 = new[] + { + new { _id = 5, title = "Book 5", pages = 60 }, + new { _id = 6, title = "Book 6", pages = 70 }, + }; + + // start the transaction + coll.Session.StartTransaction(); + + Result r = coll.Add(docs1).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2), "Matching"); + + r = coll.Add(docs2).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2), "Matching"); + + r = coll.Add(docs3).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2), "Matching"); + + // now Rollback + coll.Session.Rollback(); + + var foundDocs = coll.Find().Execute(); + Assert.That(foundDocs.Next(), Is.EqualTo(false), "Matching"); + + } + + [Test, Description("Test MySQLX plugin Rollback after RollBack")] + public void RollBackAfterRollBack() + { + Assume.That(session.Version.isAtLeast(8, 0, 3), "This test is for MySql 8.0.3 or higher"); + Collection coll = CreateCollection("test"); + var docs1 = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + }; + + var docs2 = new[] + { + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + + var docs3 = new[] + { + new { _id = 5, title = "Book 5", pages = 60 }, + new { _id = 6, title = "Book 6", pages = 70 }, + }; + + var docs4 = new[] + { + new { _id = 7, title = "Book 7", pages = 80 }, + new { _id = 8, title = "Book 8", pages = 90 }, + }; + + // start the transaction + coll.Session.StartTransaction(); + + Result r = coll.Add(docs1).Execute(); + //WL11843-Core API v1 alignment Changes + Assert.That(r.AffectedItemsCount, Is.EqualTo(2), "Matching"); + + r = coll.Add(docs2).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2), "Matching"); + + r = coll.Add(docs3).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2), "Matching"); + + // now Rollback + coll.Session.Rollback(); + + // start the transaction + coll.Session.StartTransaction(); + + r = coll.Add(docs4).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2), "Matching"); + + // now Rollback Again + coll.Session.Rollback(); + + var foundDocs = coll.Find().Execute(); + Assert.That(foundDocs.Next(), Is.EqualTo(false), "Matching"); + + } + + [Test, Description("Test MySQLX plugin Commit Rollback")] + public void CommitRollBack() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + Collection coll = CreateCollection("test"); + var docs1 = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + }; + + var docs2 = new[] + { + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + + var docs3 = new[] + { + new { _id = 5, title = "Book 5", pages = 60 }, + new { _id = 6, title = "Book 6", pages = 70 }, + }; + + // start the transaction + coll.Session.StartTransaction(); + + Result r = coll.Add(docs1).Execute(); + //WL11843-Core API v1 alignment Changes + Assert.That(r.AffectedItemsCount, Is.EqualTo(2), "Matching"); + + r = coll.Add(docs2).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2), "Matching"); + + r = coll.Add(docs3).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2), "Matching"); + + //now Commit + coll.Session.Commit(); + // now Rollback + coll.Session.Rollback(); + + var foundDocs = coll.Find().Execute(); + Assert.That(foundDocs.Next(), Is.EqualTo(true), "Matching"); + Assert.That(foundDocs.Next(), Is.EqualTo(true), "Matching"); + Assert.That(foundDocs.Next(), Is.EqualTo(true), "Matching"); + Assert.That(foundDocs.Next(), Is.EqualTo(true), "Matching"); + Assert.That(foundDocs.Next(), Is.EqualTo(true), "Matching"); + Assert.That(foundDocs.Next(), Is.EqualTo(true), "Matching"); + Assert.That(foundDocs.Next(), Is.EqualTo(false), "Matching"); + + } + + [Test, Description("Test MySQLX plugin RollBack Commit")] + public void RollBackCommit() + { + Assume.That(session.Version.isAtLeast(5, 7, 0), "This test is for MySql 5.7 or higher"); + Collection coll = CreateCollection("test"); + var docs1 = new[] + { + new { _id = 1, title = "Book 1", pages = 20 }, + new { _id = 2, title = "Book 2", pages = 30 }, + }; + + var docs2 = new[] + { + new { _id = 3, title = "Book 3", pages = 40 }, + new { _id = 4, title = "Book 4", pages = 50 }, + }; + + var docs3 = new[] + { + new { _id = 5, title = "Book 5", pages = 60 }, + new { _id = 6, title = "Book 6", pages = 70 }, + }; + + // start the transaction + coll.Session.StartTransaction(); + Result r = coll.Add(docs1).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2), "Matching"); + + // now Rollback + coll.Session.Rollback(); + r = coll.Add(docs2).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2), "Matching"); + r = coll.Add(docs3).Execute(); + Assert.That(r.AffectedItemsCount, Is.EqualTo(2), "Matching"); + //now Commit + coll.Session.Commit(); + var foundDocs = coll.Find().Execute(); + Assert.That(foundDocs.Next(), Is.EqualTo(true), "Matching"); + Assert.That(foundDocs.Next(), Is.EqualTo(true), "Matching"); + Assert.That(foundDocs.Next(), Is.EqualTo(true), "Matching"); + Assert.That(foundDocs.Next(), Is.EqualTo(true), "Matching"); + Assert.That(foundDocs.Next(), Is.EqualTo(false), "Matching"); + + } + + #endregion + + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/UnixSocketsTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/UnixSocketsTests.cs new file mode 100644 index 000000000..58ff81014 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/UnixSocketsTests.cs @@ -0,0 +1,254 @@ +// Copyright © 2017, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; + +namespace MySqlX.Data.Tests +{ + public class UnixSocketsTests : BaseTest + { + private string defaultUnixSocket; + + public UnixSocketsTests() + { + defaultUnixSocket = Environment.GetEnvironmentVariable("MYSQL_SOCKET") ?? "/tmp/mysqlx.sock"; + } + + [Test] + [Property("Category", "Security")] + public void ConnectionWithUriConnectionString() + { + if (Platform.IsWindows()) return; + + using (var session = MySQLX.GetSession("mysqlx://root:@" + defaultUnixSocket + "?protocol=unix&sslmode=none")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(defaultUnixSocket)); + } + + using (var session = MySQLX.GetSession("mysqlx://root:@" + defaultUnixSocket.Replace("/", "%2F") + "?protocol=unix&sslmode=none")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(defaultUnixSocket)); + } + } + + [Test] + [Property("Category", "Security")] + public void ConnectionWithUriConnectionStringIncludingSchema() + { + if (Platform.IsWindows()) return; + + using (var session = MySQLX.GetSession($"mysqlx://root:@({defaultUnixSocket})/mysql?protocol=unix&sslmode=none")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(defaultUnixSocket)); + } + } + + [Test] + [Property("Category", "Security")] + public void ConnectionWithParenthesisEnclosedSockets() + { + if (Platform.IsWindows()) return; + + using (var session = MySQLX.GetSession($"mysqlx://{RootUser}:@({defaultUnixSocket})?protocol=unix&sslmode=none")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(defaultUnixSocket)); + } + + using (var session = MySQLX.GetSession($"server=({defaultUnixSocket});uid={RootUser};protocol=unix;sslmode=none")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(defaultUnixSocket)); + } + + using (var session = MySQLX.GetSession(new + { + server = "(" + defaultUnixSocket + ")", + uid = "root", + protocol = "unix", + sslmode = MySqlSslMode.Disabled + })) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(defaultUnixSocket)); + } + } + + [Test] + [Property("Category", "Security")] + public void ConnectionWithBasicConnectionString() + { + if (Platform.IsWindows()) return; + + using (var session = MySQLX.GetSession($"server={defaultUnixSocket};uid={RootUser};protocol=unixsocket;sslmode=none")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(defaultUnixSocket)); + } + } + + [Test] + [Property("Category", "Security")] + public void ConnectionWithAnonymousObject() + { + if (Platform.IsWindows()) return; + + using (var session = MySQLX.GetSession(new + { + server = defaultUnixSocket, + uid = RootUser, + protocol = "unix", + sslmode = MySqlSslMode.Disabled + })) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(defaultUnixSocket)); + } + } + + [Test] + [Property("Category", "Security")] + public void MissingProtocolConnectionOption() + { + if (Platform.IsWindows()) return; + + Assert.Throws(() => MySQLX.GetSession($"mysqlx://{RootUser}:@{defaultUnixSocket}")); + } + + [Test] + [Property("Category", "Security")] + public void Failover() + { + if (Platform.IsWindows()) return; + + using (var session = MySQLX.GetSession($"server=/tmp/mysql.sock1, (/tmp/mysql.sock2) ,(%2Ftmp%2Fmysql.sock3) ,{defaultUnixSocket};uid={RootUser};protocol=unix;sslmode=none;")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(defaultUnixSocket)); + } + + using (var session = MySQLX.GetSession($"server=(address=/tmp/mysql.sock1, priority=100),(address=(/tmp/mysql.sock2),priority=99),(address=(%2tmp%2mysql.sock3),priority=98),(address={defaultUnixSocket},priority=97);uid={RootUser};protocol=unix;sslmode=none;")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(defaultUnixSocket)); + } + + using (var session = MySQLX.GetSession($"server=(address={defaultUnixSocket},priority=100);uid={RootUser};protocol=unix;sslmode=none;")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(defaultUnixSocket)); + } + + using (var session = MySQLX.GetSession($"server=(address=({defaultUnixSocket}),priority=100);uid={RootUser};protocol=unix;sslmode=none;")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(defaultUnixSocket)); + } + + using (var session = MySQLX.GetSession($"mysqlx://{RootUser}:@[./tmp/mysql.sock, (../tmp/mysql.sock) ,(%2Ftmpsocket%2Fmysql.sock) , {defaultUnixSocket}]?protocol=unix&sslmode=none")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(defaultUnixSocket)); + } + + using (var session = MySQLX.GetSession($"mysqlx://{RootUser}:@[(address=./tmp/mysql.sock,priority=100),(address=(../tmp/mysql.sock),priority=99),(address=(%2tmpsocket%2mysql.sock),priority=98),(address={defaultUnixSocket},priority=97)]?protocol=unix&sslmode=none")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(defaultUnixSocket)); + } + + using (var session = MySQLX.GetSession($"mysqlx://{RootUser}:@[(address={defaultUnixSocket},priority=100)]?protocol=unix&sslmode=none")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(defaultUnixSocket)); + } + + using (var session = MySQLX.GetSession($"mysqlx://{RootUser}:@[(address=({defaultUnixSocket}),priority=100)]?protocol=unix&sslmode=none")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(defaultUnixSocket)); + } + + using (var session = MySQLX.GetSession(new + { + server = "/tmp/mysql.sock1, (/tmp/mysql.sock2) ,(%2Ftmp%2Fmysql.sock3) , " + defaultUnixSocket, + uid = RootUser, + protocol = "unix", + sslmode = MySqlSslMode.Disabled + })) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(defaultUnixSocket)); + } + + using (var session = MySQLX.GetSession(new + { + server = "(address=/tmp/mysql.sock1, priority=100),(address=(/tmp/mysql.sock2),priority=99),(address=(%2Ftmp%2Fmysql.sock3),priority=98),(address=" + defaultUnixSocket + ",priority=97)", + uid = RootUser, + protocol = "unix", + sslmode = MySqlSslMode.Disabled + })) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(defaultUnixSocket)); + } + + using (var session = MySQLX.GetSession(new + { + server = "(address=" + defaultUnixSocket + ",priority=100)", + uid = RootUser, + protocol = "unix", + sslmode = MySqlSslMode.Disabled + })) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(defaultUnixSocket)); + } + + using (var session = MySQLX.GetSession(new + { + server = "(address=(" + defaultUnixSocket + "),priority=100)", + uid = RootUser, + protocol = "unix", + sslmode = MySqlSslMode.Disabled + })) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Server, Is.EqualTo(defaultUnixSocket)); + } + } + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/XAuth.cs b/MySQL.Data/tests/MySqlX.Data.Tests/XAuth.cs new file mode 100644 index 000000000..71d5c655f --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/XAuth.cs @@ -0,0 +1,698 @@ +// Copyright © 2021, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; + +namespace MySqlX.Data.Tests +{ + public class XAuth : BaseTest + { + + [Test, Description("User selects DEFAULT as authentication mechanism-(default user,ssl mode none,fresh connection - ensure password is not cached")] + [Property("Category", "Security")] + public void DefaultAuthNullPlugin() + { + Assume.That(Platform.IsWindows(), "Check For Linux OS"); + Assume.That(session.Version.isAtLeast(8, 4, 0), "This test is for MySql 8.4.0 or higher"); + + string pluginName = "caching_sha2_password";//default plugin + MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder(ConnectionString); + builder.UserID = "testDefaultPlugin"; + builder.Password = "test"; + CreateUser(builder.UserID, builder.Password, pluginName); + string connectionString = null, connectionStringUri = null; + string defaultAuthPlugin = session.SQL("SHOW VARIABLES LIKE 'authentication_policy'").Execute().FetchAll()[0][1].ToString().Split(',')[0] == "*" ? "caching_sha2_password" : ""; + + //Connection String + connectionString = $"server={Host};user={builder.UserID};port={XPort};password={builder.Password}"; + using (var session1 = MySQLX.GetSession(connectionString)) + { + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.PLAIN)); + var result = session1.SQL("SHOW SESSION STATUS LIKE 'Mysqlx_ssl_version';").Execute().FetchAll(); + Assert.That(result[0][1].ToString().Contains("TLSv1")); + } + + connectionString = connectionString + ";sslmode=none;"; + using (var session1 = MySQLX.GetSession(connectionString)) + Assert.That(session1.Settings.Auth, Is.EqualTo(defaultAuthPlugin == "mysql_native_password" ? MySqlAuthenticationMode.MYSQL41 : MySqlAuthenticationMode.SHA256_MEMORY)); + + connectionString = $"server={Host};user={builder.UserID};port={XPort};password={builder.Password};ssl-mode=VerifyCA;ssl-ca={sslCa};ssl-ca-pwd=pass;"; + using (var session1 = MySQLX.GetSession(connectionString)) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.PLAIN)); + + //invalid values + connectionString = $"server={Host};user={builder.UserID};port={XPort};password={builder.Password};ssl-mode=required;auth=shaa256memory"; + Assert.Throws(() => MySQLX.GetSession(connectionString)); + + //Uri + connectionStringUri = "mysqlx://" + builder.UserID + ":" + builder.Password + "@" + + builder.Server + ":" + XPort; + using (var session1 = MySQLX.GetSession(connectionStringUri)) + { + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.PLAIN)); + var result = session1.SQL("SHOW SESSION STATUS LIKE 'Mysqlx_ssl_version';").Execute().FetchAll(); + Assert.That(result[0][1].ToString().Contains("TLSv1")); + } + + connectionStringUri = connectionStringUri + "?sslmode=none"; + using (var session1 = MySQLX.GetSession(connectionStringUri)) + Assert.That(session1.Settings.Auth, Is.EqualTo(defaultAuthPlugin == "mysql_native_password" ? MySqlAuthenticationMode.MYSQL41 : MySqlAuthenticationMode.SHA256_MEMORY)); + + //Anonymous Object + using (var session1 = MySQLX.GetSession(new { server = builder.Server, port = XPort, user = builder.UserID, password = builder.Password })) + { + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.PLAIN)); + var result = session1.SQL("SHOW SESSION STATUS LIKE 'Mysqlx_ssl_version';").Execute().FetchAll(); + Assert.That(result[0][1].ToString().Contains("TLSv1")); + } + + using (var session1 = MySQLX.GetSession( + new + { + server = builder.Server, + port = XPort, + user = builder.UserID, + sslmode = MySqlSslMode.Disabled, + password = builder.Password + })) + Assert.That(session1.Settings.Auth, Is.EqualTo(defaultAuthPlugin == "mysql_native_password" ? MySqlAuthenticationMode.MYSQL41 : MySqlAuthenticationMode.SHA256_MEMORY)); + + ExecuteSQL("flush privileges"); + connectionString = $"server={Host};user={builder.UserID};port={XPort};password={builder.Password};ssl-mode=none"; + if (defaultAuthPlugin == "mysql_native_password") + Assert.That(MySQLX.GetSession(connectionString), Is.Not.Null); + else + Assert.Throws(() => MySQLX.GetSession(connectionString)); + + //URI + connectionStringUri = $"mysqlx://{builder.UserID}:{builder.Password}@{builder.Server}:{XPort}?sslmode=none"; + if (defaultAuthPlugin == "mysql_native_password") + Assert.That(MySQLX.GetSession(connectionStringUri), Is.Not.Null); + else + Assert.Throws(() => MySQLX.GetSession(connectionStringUri)); + + //Anonymous Object + if (defaultAuthPlugin == "mysql_native_password") + Assert.That(MySQLX.GetSession(new + { + server = Host, + port = XPort, + user = builder.UserID, + sslmode = MySqlSslMode.Disabled, + password = builder.Password + }), Is.Not.Null); + else + Assert.Throws(() => MySQLX.GetSession(new + { + server = Host, + port = XPort, + user = builder.UserID, + sslmode = MySqlSslMode.Disabled, + password = builder.Password + })); + } + + [Test, Description("User selects DEFAULT as authentication mechanism-(default user,ssl mode none with allow public key retrieval=true,fresh connection - ensure password is not cached")] + [Property("Category", "Security")] + public void DefaultAuthPublicKeyRetrieval() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + + string pluginName = "caching_sha2_password";//default plugin + MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder(ConnectionString); + builder.UserID = "testDefaultPlugin"; + builder.Password = "test"; + CreateUser(builder.UserID, builder.Password, pluginName); + string connectionString = null, connectionStringUri = null; + //Flush Privileges + ExecuteSQL("flush privileges"); + connectionString = "server=" + Host + ";user=" + builder.UserID + ";" + "port=" + XPort + + ";password=" + builder.Password + ";ssl-mode=none;allowpublickeyretrieval=true;pooling=false"; + Assert.Catch(() => MySQLX.GetSession(connectionString)); + connectionString = "server=" + Host + ";user=" + builder.UserID + ";" + "port=" + XPort + + ";password=" + builder.Password + ";ssl-mode=none;AllowPublicKeyRetrieval=true;pooling=false"; + Assert.Catch(() => MySQLX.GetSession(connectionString)); + + + ExecuteSQL("flush privileges"); + connectionStringUri = "mysqlx://" + builder.UserID + ":" + builder.Password + "@" + + builder.Server + ":" + XPort + "?sslmode=none&allowpublickeyretrieval=true&pooling=false"; + Assert.Catch(() => MySQLX.GetSession(connectionString)); + connectionStringUri = "mysqlx://" + builder.UserID + ":" + builder.Password + "@" + + builder.Server + ":" + XPort + "?sslmode=none&AllowPublicKeyRetrieval=false&pooling=false"; + Assert.Catch(() => MySQLX.GetSession(connectionString)); + + ExecuteSQL("flush privileges"); + Assert.Catch(() => MySQLX.GetSession(new + { + server = builder.Server, + port = XPort, + user = builder.UserID, + sslmode = MySqlSslMode.Disabled, + allowpublickeyretrieval = true, + pooling = false, + password = builder.Password + })); + Assert.Catch(() => MySQLX.GetSession(new + { + server = builder.Server, + port = XPort, + user = builder.UserID, + sslmode = MySqlSslMode.Disabled, + allowpublickeyretrieval = false, + pooling = false, + password = builder.Password + })); + } + + [Test, Description("User selects DEFAULT as authentication mechanism-mysql_native_password user,ssl mode default,fresh connection")] + public void MySqlNativePlugin() + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + Assume.That(Check_Plugin_Enabled("mysql_native_password"), "mysql_native_password plugin must be enabled on the server to run this test."); + Assume.That(Check_Plugin_Enabled("caching_sha2_password"), "The caching_sha2_password plugin isn't available."); + + string pluginName = "mysql_native_password";//mysql_native_password plugin + MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder(ConnectionString); + builder.UserID = "testDefaultPlugin"; + builder.Password = "test"; + CreateUser(builder.UserID, builder.Password, pluginName); + string connectionString = null, connectionStringUri = null; + //Connection String + connectionString = $"server={Host};user={builder.UserID};port={XPort};password={builder.Password}"; + using (var session1 = MySQLX.GetSession(connectionString)) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.PLAIN)); + + connectionString += ";ssl-mode=VerifyCA;ssl-ca=" + sslCa + ";ssl-ca-pwd=pass;"; + using (var session1 = MySQLX.GetSession(connectionString)) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.PLAIN)); + + connectionString = $"server={Host};user={builder.UserID};port={XPort};password={builder.Password};ssl-mode=none"; + using (var session1 = MySQLX.GetSession(connectionString)) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.MYSQL41)); + + connectionString = $"server={Host};user={builder.UserID};port={XPort};password={builder.Password};ssl-mode=Required;ssl-ca={sslCa};ssl-ca-pwd=pass;"; + using (var session1 = MySQLX.GetSession(connectionString)) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.PLAIN)); + + //URI + ExecuteSQL("flush privileges"); + connectionStringUri = $"mysqlx://{builder.UserID}:{builder.Password}@{builder.Server}:{XPort}"; + using (var session1 = MySQLX.GetSession(connectionStringUri)) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.PLAIN)); + + connectionStringUri = connectionStringUri + "?ssl-mode=none"; + using (var session1 = MySQLX.GetSession(connectionStringUri)) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.MYSQL41)); + + //Anonymous Object + ExecuteSQL("flush privileges"); + using (var session1 = MySQLX.GetSession(new + { + server = builder.Server, + port = XPort, + user = builder.UserID, + password = builder.Password + })) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.PLAIN)); + + using (var session1 = MySQLX.GetSession(new + { + server = builder.Server, + port = XPort, + user = builder.UserID, + sslmode = MySqlSslMode.Disabled, + password = builder.Password + })) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.MYSQL41)); + } + + [Test] + [Property("Category", "Security")] + public void ConnectUsingMySQL41Auth() + { + Assume.That(Check_Plugin_Enabled("mysql_native_password"), "mysql_native_password plugin must be enabled on the server to run this test."); + ExecuteSqlAsRoot("CREATE USER IF NOT EXISTS 'testNative'@'%' identified with mysql_native_password by 'test';"); + + var connectionStringUri = ConnectionStringUri; + if (session.InternalSession.GetServerVersion().isAtLeast(8, 0, 4)) + { + // Use connection string uri set with a mysql_native_password user. + connectionStringUri = ConnectionStringUriNative; + } + + using (var session = MySQLX.GetSession(connectionStringUri + "?auth=MySQL41")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.MYSQL41)); + } + + using (var session = MySQLX.GetSession(connectionStringUri + "?auth=mysql41&sslmode=none")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.MYSQL41)); + } + } + + [Test] + [Property("Category", "Security")] + public void DefaultAuth() + { + if (!session.InternalSession.GetServerVersion().isAtLeast(8, 0, 5)) return; + + string user = "testsha256"; + + ExecuteSQLStatement(session.SQL($"DROP USER IF EXISTS {user}@'%'")); + ExecuteSQLStatement(session.SQL($"CREATE USER {user}@'%' IDENTIFIED WITH caching_sha2_password BY '{user}'")); + + string connString = $"mysqlx://{user}:{user}@{Host}:{XPort}"; + // Default to PLAIN when TLS is enabled. + using (var session = MySQLX.GetSession(connString)) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.PLAIN)); + var result = ExecuteSQLStatement(session.SQL("SHOW SESSION STATUS LIKE 'Mysqlx_ssl_version';")).FetchAll(); + Assert.That(result[0][1].ToString(), Does.StartWith("TLSv1")); + } + + // Default to SHA256_MEMORY when TLS is not enabled. + using (var session = MySQLX.GetSession(connString + "?sslmode=none")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.SHA256_MEMORY)); + } + } + + [Test] + [Property("Category", "Security")] + public void ConnectUsingSha256Memory() + { + if (!session.InternalSession.GetServerVersion().isAtLeast(8, 0, 5)) return; + + using (var session = MySQLX.GetSession(ConnectionStringUri + "?auth=SHA256_MEMORY")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.SHA256_MEMORY)); + var result = session.SQL("SHOW SESSION STATUS LIKE 'Mysqlx_ssl_version';").Execute().FetchAll(); + Assert.That(result[0][1].ToString().Contains("TLSv1")); + } + + using (var session = MySQLX.GetSession(ConnectionStringUri + "?auth=SHA256_MEMORY&sslmode=none")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.SHA256_MEMORY)); + } + + using (var session1 = MySQLX.GetSession( + new + { + server = Host, + port = XPort, + user = session.Settings.UserID, + sslmode = MySqlSslMode.Disabled, + password = session.Settings.Password, + auth = MySqlAuthenticationMode.SHA256_MEMORY + })) + { + Assert.That(session1.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.SHA256_MEMORY)); + } + + //Exceptions + var cs = $"server={Host};user={session.Settings.UserID};port={XPort};password=;ssl-mode=none;auth=SHA256_MEMORY"; + Assert.Throws(() => MySQLX.GetSession(cs)); + cs = $"mysqlx://{session.Settings.UserID}:@{Host}:{XPort}?sslmode=none&auth=SHA256_MEMORY"; + Assert.Throws(() => MySQLX.GetSession(cs)); + Assert.Throws(() => MySQLX.GetSession(new + { + server = Host, + port = XPort, + user = session.Settings.UserID, + sslmode = MySqlSslMode.Disabled, + password = "", + auth = MySqlAuthenticationMode.SHA256_MEMORY + })); + + } + + [TestCase("mysql_native_password")] + [TestCase("sha256_password")] + [Property("Category", "Security")] + public void Sha256MemoryAuthWithDifferentPlugin(string pluginName) + { + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + Assume.That(Check_Plugin_Enabled("mysql_native_password"), "mysql_native_password plugin must be enabled on the server to run this test."); + + MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder(ConnectionString); + builder.UserID = "testDefaultPlugin"; + builder.Password = "test"; + CreateUser(builder.UserID, builder.Password, pluginName); + string connectionString = null, connectionStringUri = null; + //Connection string + connectionString = $"server={Host};user={builder.UserID};port={XPort};password={builder.Password};auth = SHA256_MEMORY"; + Assert.Throws(() => MySQLX.GetSession(connectionString)); + + connectionString = $"server={Host};user={builder.UserID};port={XPort};password={builder.Password};sslmode=none;auth=SHA256_MEMORY"; + Assert.Throws(() => MySQLX.GetSession(connectionString)); + ExecuteSQL("flush privileges"); + //Uri + connectionStringUri = $"mysqlx://{builder.UserID}:{builder.Password}@{builder.Server}:{XPort}?auth=SHA256_MEMORY"; + Assert.Throws(() => MySQLX.GetSession(connectionStringUri)); + + connectionStringUri = $"mysqlx://{builder.UserID}:{builder.Password}@{builder.Server}:{XPort}?sslmode=none;auth=SHA256_MEMORY"; + Assert.Throws(() => MySQLX.GetSession(connectionStringUri)); + ExecuteSQL("flush privileges"); + //Anonymous Object + Assert.Throws(() => MySQLX.GetSession(new + { + server = builder.Server, + port = XPort, + user = builder.UserID, + password = builder.Password, + auth = MySqlAuthenticationMode.SHA256_MEMORY + })); + + Assert.Throws(() => MySQLX.GetSession(new + { + server = builder.Server, + port = XPort, + user = builder.UserID, + password = builder.Password, + sslmode = MySqlSslMode.Disabled, + auth = MySqlAuthenticationMode.SHA256_MEMORY + })); + } + + [Test, Description("Test MySQLX plugin Extern Support")] + [Property("Category", "Security")] + public void NativeAuthValidAndInvalidConnection() + { + Assume.That(Platform.IsWindows(), "Check for Linux OS"); + Assume.That(session.Version.isAtLeast(8, 0, 11), "This test is for MySql 8.0.11 or higher"); + Assume.That(Check_Plugin_Enabled("mysql_native_password"), "mysql_native_password plugin must be enabled on the server to run this test."); + ExecuteSqlAsRoot("CREATE USER IF NOT EXISTS 'testNative'@'%' identified with mysql_native_password by 'test';"); + + var user = "testNative"; + var pwd = "test"; + var cs = $"server={Host};user={user};port={XPort};password={pwd}"; + //Connection String + using (var session1 = MySQLX.GetSession(ConnectionString)) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.PLAIN)); + + using (var session1 = MySQLX.GetSession(cs + ";auth=mysql41")) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.MYSQL41)); + + using (var session1 = MySQLX.GetSession(cs + ";auth=mysql41;ssl-mode=none")) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.MYSQL41)); + + using (var session1 = MySQLX.GetSession(cs + ";auth=mysql41;ssl-mode=Required")) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.MYSQL41)); + + using (var session1 = MySQLX.GetSession(ConnectionString + ";auth=PLAIN")) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.PLAIN)); + + using (var session1 = MySQLX.GetSession(ConnectionString + ";auth=plain;ssl-mode=Required")) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.PLAIN)); + + using (var session1 = MySQLX.GetSession(cs + ";ssl-mode=none")) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.MYSQL41)); + + using (var session1 = MySQLX.GetSession(ConnectionString + ";ssl-mode=Required")) + { + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.PLAIN)); + var result = session.SQL("SHOW SESSION STATUS LIKE 'Mysqlx_ssl_version';").Execute().FetchAll(); + Assert.That(result[0][1].ToString().Contains("TLSv1")); + } + + Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";auth=PLAIN;ssl-mode=none")); + Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";auth=EXTERNAL")); + Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";auth=EXTERNAL;ssl-mode=none")); + Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";auth=EXTERNAL;ssl-mode=Required")); + Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";auth=INVALID")); + Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";auth=INVALID;ssl-mode=none")); + Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";auth=INVALID;ssl-mode=Required")); + //Uri + using (var session1 = MySQLX.GetSession(ConnectionStringUriNative)) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.PLAIN)); + + using (var session1 = MySQLX.GetSession(ConnectionStringUriNative + "?auth=MySQL41")) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.MYSQL41)); + + using (var session1 = MySQLX.GetSession(ConnectionStringUriNative + "?auth=MySQL41&ssl-mode=none")) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.MYSQL41)); + + using (var session1 = MySQLX.GetSession(ConnectionStringUriNative + "?auth=MySQL41&ssl-mode=Required")) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.MYSQL41)); + + using (var session1 = MySQLX.GetSession(ConnectionStringUriNative + "?auth=PLAIN")) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.PLAIN)); + + Assert.Throws(() => MySQLX.GetSession(ConnectionStringUriNative + "?auth=PLAIN&ssl-mode=none")); + + using (var session1 = MySQLX.GetSession(ConnectionStringUriNative + "?auth=PLAIN&ssl-mode=Required")) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.PLAIN)); + + using (var session1 = MySQLX.GetSession(ConnectionStringUriNative + "?ssl-mode=none")) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.MYSQL41)); + + using (var session1 = MySQLX.GetSession(ConnectionStringUriNative + "?ssl-mode=Required")) + { + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.PLAIN)); + var result = session.SQL("SHOW SESSION STATUS LIKE 'Mysqlx_ssl_version';").Execute().FetchAll(); + Assert.That(result[0][1].ToString().Contains("TLSv1")); + } + + Assert.Throws(() => MySQLX.GetSession(ConnectionStringUriNative + "?auth=EXTERNAL")); + Assert.Throws(() => MySQLX.GetSession(ConnectionStringUriNative + "?auth=EXTERNAL&ssl-mode=none")); + Assert.Throws(() => MySQLX.GetSession(ConnectionStringUriNative + "?auth=EXTERNAL&ssl-mode=Required")); + Assert.Throws(() => MySQLX.GetSession(ConnectionStringUriNative + "?auth=INVALID")); + Assert.Throws(() => MySQLX.GetSession(ConnectionStringUriNative + "?auth=INVALID&ssl-mode=none")); + Assert.Throws(() => MySQLX.GetSession(ConnectionStringUriNative + "?auth=INVALID&ssl-mode=Required")); + //Anonymous Object + using (var session1 = MySQLX.GetSession(new + { + server = Host, + port = XPort, + user = user, + password = pwd + })) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.PLAIN)); + + using (var session1 = MySQLX.GetSession(new + { + server = Host, + port = XPort, + user = user, + password = pwd, + auth = MySqlAuthenticationMode.MYSQL41 + })) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.MYSQL41)); + + using (var session1 = MySQLX.GetSession(new + { + server = Host, + port = XPort, + user = user, + password = pwd, + auth = MySqlAuthenticationMode.MYSQL41, + sslmode = MySqlSslMode.Disabled + })) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.MYSQL41)); + + using (var session1 = MySQLX.GetSession(new + { + server = Host, + port = XPort, + user = user, + password = pwd, + auth = MySqlAuthenticationMode.MYSQL41, + sslmode = MySqlSslMode.Required + })) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.MYSQL41)); + + using (var session1 = MySQLX.GetSession(new + { + server = Host, + port = XPort, + user = user, + password = pwd, + auth = MySqlAuthenticationMode.PLAIN + })) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.PLAIN)); + + Assert.Throws(() => MySQLX.GetSession(new + { + server = Host, + port = XPort, + user = user, + password = pwd, + auth = MySqlAuthenticationMode.PLAIN, + sslmode = MySqlSslMode.Disabled + })); + + using (var session1 = MySQLX.GetSession(new + { + server = Host, + port = XPort, + user = user, + password = pwd, + auth = MySqlAuthenticationMode.PLAIN, + sslmode = MySqlSslMode.Required + })) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.PLAIN)); + + using (var session1 = MySQLX.GetSession(new + { + server = Host, + port = XPort, + user = user, + password = pwd, + sslmode = MySqlSslMode.Disabled + })) + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.MYSQL41)); + + using (var session1 = MySQLX.GetSession(new + { + server = Host, + port = XPort, + user = user, + password = pwd, + sslmode = MySqlSslMode.Required + })) + { + Assert.That(session1.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.PLAIN)); + var result = session1.SQL("SHOW SESSION STATUS LIKE 'Mysqlx_ssl_version';").Execute().FetchAll(); + Assert.That(result[0][1].ToString().Contains("TLSv1")); + } + + Assert.Throws(() => MySQLX.GetSession(new + { + server = Host, + port = XPort, + user = user, + password = pwd, + auth = MySqlAuthenticationMode.EXTERNAL + })); + + } + + [Test] + [Property("Category", "Security")] + public void ConnectUsingExternalAuth() + { + // Should fail since EXTERNAL is currently not supported by X Plugin. + Exception ex = Assert.Throws(() => MySQLX.GetSession(ConnectionString + ";auth=EXTERNAL")); + Assert.That(ex.Message, Is.EqualTo("Invalid authentication method EXTERNAL")); + + ex = Assert.Throws(() => MySQLX.GetSession(ConnectionStringUri + "?auth=EXTERNAL")); + Assert.That(ex.Message, Is.EqualTo("Invalid authentication method EXTERNAL")); + } + + [Test] + [Property("Category", "Security")] + public void ConnectUsingPlainAuth() + { + using (var session = MySQLX.GetSession(ConnectionString + ";auth=pLaIn")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.PLAIN)); + } + + using (var session = MySQLX.GetSession(ConnectionStringUri + "?auth=pLaIn")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.PLAIN)); + } + + // Should fail since PLAIN requires TLS to be enabled. + Assert.Throws(() => MySQLX.GetSession(ConnectionStringUri + "?auth=PLAIN&sslmode=none")); + } + + [Test] + [Property("Category", "Security")] + public void ConnectUsingSha256PasswordPlugin() + { + ExecuteSqlAsRoot($"DROP USER IF EXISTS 'testSha256'@'%';"); + ExecuteSqlAsRoot($"CREATE USER 'testSha256'@'%' identified with sha256_password by 'mysql';"); + ExecuteSqlAsRoot($"GRANT ALL PRIVILEGES ON *.* TO 'testSha256'@'%';"); + + string userName = "testSha256"; + string password = "mysql"; + string pluginName = "sha256_password"; + string connectionStringUri = ConnectionStringUri.Replace("test:test", string.Format("{0}:{1}", userName, password)); + + // User with password over TLS connection. + using (var session = MySQLX.GetSession(connectionStringUri)) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + var result = ExecuteSQLStatement(session.SQL(string.Format("SELECT `User`, `plugin` FROM `mysql`.`user` WHERE `User` = '{0}';", userName))).FetchAll(); + Assert.That(session.Settings.UserID, Is.EqualTo(userName)); + Assert.That(result[0][0].ToString(), Is.EqualTo(session.Settings.UserID)); + Assert.That(result[0][1].ToString(), Is.EqualTo(pluginName)); + } + + // Connect over non-TLS connection. + using (var session = MySQLX.GetSession(connectionStringUri + "?sslmode=none")) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + Assert.That(session.Settings.Auth, Is.EqualTo(MySqlAuthenticationMode.SHA256_MEMORY)); + } + + // User without password over TLS connection. + ExecuteSQL($"ALTER USER {userName}@'%' IDENTIFIED BY ''"); + using (var session = MySQLX.GetSession(ConnectionStringUri.Replace("test:test", string.Format("{0}:{1}", userName, "")))) + { + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + var result = ExecuteSQLStatement(session.SQL(string.Format("SELECT `User`, `plugin` FROM `mysql`.`user` WHERE `User` = '{0}';", userName))).FetchAll(); + Assert.That(session.Settings.UserID, Is.EqualTo(userName)); + Assert.That(result[0][0].ToString(), Is.EqualTo(session.Settings.UserID)); + Assert.That(result[0][1].ToString(), Is.EqualTo(pluginName)); + } + } + + public string CreateUser(string userName, string password, string plugin) + { + string host = Host == "localhost" ? Host : "%"; + + ExecuteSqlAsRoot(String.Format("DROP USER IF EXISTS '{0}'@'{1}';", userName, host)); + ExecuteSqlAsRoot( + String.Format( + "CREATE USER '{0}'@'{1}' IDENTIFIED {2} BY '{3}'", userName, host, + (plugin == null ? string.Empty : String.Format("WITH '{0}' ", plugin)), password)); + + ExecuteSqlAsRoot(String.Format("GRANT ALL ON *.* TO '{0}'@'{1}'", userName, host)); + ExecuteSqlAsRoot("FLUSH PRIVILEGES"); + return userName; + } + } +} diff --git a/MySQL.Data/tests/MySqlX.Data.Tests/XConnectionStringBuilderTests.cs b/MySQL.Data/tests/MySqlX.Data.Tests/XConnectionStringBuilderTests.cs new file mode 100644 index 000000000..616f67d33 --- /dev/null +++ b/MySQL.Data/tests/MySqlX.Data.Tests/XConnectionStringBuilderTests.cs @@ -0,0 +1,191 @@ +// Copyright © 2018, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using MySql.Data.MySqlClient; +using MySqlX.XDevAPI; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Data; + +namespace MySqlX.Data.Tests +{ + /// + /// The purpose of this class is to incorporate MySqlBaseConnectionStringBuilder, MySqlConnectionStringBuilder and MySqlXConnectionStringBuilder + /// tests that aren't affected by previously opened connections/sessions. + /// + public class XConnectionStringBuilderTests + { + private static string _connectionString; + private static string _xConnectionURI; + private static string _connectionStringWithSslMode; + + static XConnectionStringBuilderTests() + { + _connectionString = $"server={BaseTest.Host};user={BaseTest.RootUser};password={BaseTest.RootPassword};port={BaseTest.Port};"; + _xConnectionURI = $"mysqlx://{BaseTest.RootUser}:{BaseTest.RootPassword}@{BaseTest.Host}:{BaseTest.XPort}"; + _connectionStringWithSslMode = _connectionString + "sslmode=required;"; + } + + [Test] + public void SessionCanBeOpened() + { + using (var session = MySQLX.GetSession(_xConnectionURI)) + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + + [Test] + public void ConnectionAfterSessionCanBeOpened() + { + Assume.That(Platform.IsWindows(), "Check for Linux OS"); + + using (var session = MySQLX.GetSession(_xConnectionURI)) + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + + using (var connection = new MySqlConnection(_connectionStringWithSslMode)) + { + connection.Open(); + Assert.That(connection.State, Is.EqualTo(ConnectionState.Open)); + } + + using (var session = MySQLX.GetSession(_xConnectionURI + "?sslca=client.pfx&certificatepassword=pass")) + Assert.That(session.InternalSession.SessionState, Is.EqualTo(SessionState.Open)); + } + +#if !NET452 + [TestCase(";tls-version=TlSv1.3", "Tls13")] + [TestCase(";tls-version=TlSv1.2, tLsV11, TLS13, tls1.0", "Tls12, Tls13")] +#endif + [TestCase(";tls-version=TlSv1.2, tLsV11, tls1.0", "Tls12")] + [TestCase(";tls-version=TlSv1.2, SsLv3", "Tls12")] + public void ValidateTlsVersionOptionAsString(string options, string result) + { + MySqlXConnectionStringBuilder builder = new MySqlXConnectionStringBuilder(_connectionString + options); + Assert.That(builder.TlsVersion, Is.EqualTo(result)); + } + +#if !NET452 + [TestCase("TlSv1.2, tLsV11, TLS13, tls1.0", "Tls12, Tls13")] + [TestCase("TlSv1.2, TLS13, SsLv3", "Tls12, Tls13")] +#endif + [TestCase("TlSv1.2, tLsV11, tls1.0", "Tls12")] + [TestCase("TlSv1.2, SsLv3", "Tls12")] + public void ValidateTlsVersionOptionAsProperty(string options, string result) + { + MySqlXConnectionStringBuilder builder = new MySqlXConnectionStringBuilder(_connectionString); + + builder.TlsVersion = options; + Assert.That(builder.TlsVersion, Is.EqualTo(result)); + } + +#if !NET452 + [TestCase(MySqlSslMode.Prefered, "TlSv1.2, tLsV11, TLS13, tls1.0", "Tls12, Tls13")] + [TestCase(MySqlSslMode.Disabled, "TlSv1.2, tLsV11, TLS13, tls1.0", "TLS12, TLS13")] + [TestCase(null, "TlSv1.2, tLsV11, TLS13, tls1.0", "Tls12, Tls13")] +#endif + [TestCase(MySqlSslMode.Prefered, "TlSv1.2, tLsV11, tls1.0", "Tls12")] + [TestCase(MySqlSslMode.Disabled, "TlSv1.2, tLsV11, tls1.0", "Tls12")] + [TestCase(null, "TlSv1.2, tLsV11, tls1.0", "Tls12")] + public void ValidateTlsVersionOptionAndSslMode(MySqlSslMode? sslMode1, string options, string result) + { + MySqlXConnectionStringBuilder builder = new MySqlXConnectionStringBuilder(_connectionString); + + if (sslMode1.HasValue) + builder.SslMode = sslMode1.Value; + + if (result != null) + { + builder.TlsVersion = options; + Assert.That(builder.TlsVersion, Is.EqualTo(result).IgnoreCase); + } + else + Assert.Throws(() => { builder.TlsVersion = options; }); + } + + [Test] + public void CaseInsensitiveAuthOption() + { + string[,] values = new string[,] { + { "PLAIN", "plain", "PLAin", "PlaIn" }, + { "MYSQL41", "MySQL41", "mysql41", "mYSqL41" }, + { "EXTERNAL", "external", "exterNAL", "eXtERNal" } + }; + + for (int i = 0; i < values.GetLength(0); i++) + { + for (int j = 0; j < values.GetLength(1); j++) + { + var builder = new MySqlXConnectionStringBuilder(String.Format("server=localhost;auth={0}", values[i, j])); + Assert.That(builder.Auth, Is.EqualTo((MySqlAuthenticationMode)(i + 1))); + } + } + } + + [Test] + public void IncorrectAuthOptionThrowsArgumentException() + { + string[] values = { "OTHER", "Other", "MYSQL42", "PlaINs" }; + foreach (var value in values) + { + Exception ex = Assert.Throws(() => new MySqlXConnectionStringBuilder(String.Format("server=localhost;aUth={0}", value))); + Assert.That(ex.Message, Is.EqualTo(String.Format("Value '{0}' is not of the correct type", value))); + } + } + + /// + /// Bug #33351775 [MySqlConnectionStringBuilder.TryGetValue always returns false] + /// TryGetValue() method of ConnectionStringBuilder object was not overrided. + /// + [Test] + public void TryGetValue() + { + MySqlXConnectionStringBuilder connStringBuilder = new() + { + DnsSrv = true, + CompressionAlgorithm = "deflate, lz4", + }; + + Assert.That(connStringBuilder.ContainsKey("dnssrv")); + Assert.That(connStringBuilder.TryGetValue("dns-srv", out var dnssrv)); + Assert.That((bool)dnssrv, Is.EqualTo(connStringBuilder.DnsSrv)); + + Assert.That(connStringBuilder.ContainsKey("compressionAlgorithms")); + Assert.That(connStringBuilder.TryGetValue("Compression-Algorithms", out var compressionAlgorithm)); + Assert.That((string)compressionAlgorithm, Is.EqualTo(connStringBuilder.CompressionAlgorithm).IgnoreCase); + + // Default value + Assert.That(connStringBuilder.TryGetValue("connection-attributes", out var connectionattributes)); + Assert.That(connectionattributes, Is.EqualTo(connStringBuilder.GetOption("connection-attributes").DefaultValue)); + + // Non existing option + Assert.That(connStringBuilder.TryGetValue("foo", out var nonexistingoption), Is.False); + Assert.That(nonexistingoption, Is.Null); + } + } +} diff --git a/MySQLClient.sln b/MySQLClient.sln deleted file mode 100644 index b748f6383..000000000 --- a/MySQLClient.sln +++ /dev/null @@ -1,126 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Source", "Source", "{F50317E3-9DBA-4F6D-8EA2-BEBBB3FB17FE}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{27400DB7-CF82-4DC4-98DF-5978644E4E53}" - ProjectSection(SolutionItems) = preProject - global.json = global.json - EndProjectSection -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "MySql.Data", "Source\MySql.Data\MySql.Data.xproj", "{8F0F6915-49B2-42F8-A592-BEF9A09F3811}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "MySql.Core.Test.Console", "Samples\Core\MySql.Core.Test.Console.xproj", "{742DC4B9-D6D3-4063-821F-BB2FD980CE10}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{019C5460-E964-4688-9A91-57ED26D09F4B}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{81A599B5-6ED5-45F7-84BE-1E5F772EA38D}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "MySql.Data.Tests", "Tests\MySql.Data.Tests\MySql.Data.Tests.xproj", "{42229016-61AC-4ABF-88EB-354055D2AC40}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "MySql.Data.EntityFrameworkCore", "Source\MySql.Data.EntityFrameworkCore\MySql.Data.EntityFrameworkCore.xproj", "{E0EA25B2-FF20-4B52-9325-57BBEDD777EF}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "MySql.EntityFrameworkCore.Basic.Tests", "Tests\MySql.EntityFrameworkCore.Basic.Tests\MySql.EntityFrameworkCore.Basic.Tests.xproj", "{1CAAB7D0-8D06-46B8-B3C9-8639828A6AE8}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "MySql.EntityFrameworkCore.Migrations.Tests", "Tests\MySql.EntityFrameworkCore.Migrations.Tests\MySql.EntityFrameworkCore.Migrations.Tests.xproj", "{ACCD7F4B-A8E5-4642-BFD3-CDD2E3F52495}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "MySqlX.Data.Tests", "Tests\MySqlX.Data.Tests\MySqlX.Data.Tests.xproj", "{863B140B-0956-4871-B9F5-AA2681AF59DA}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "MySql.EntityFramework6.CodeFirst.Tests", "Tests\MySql.EntityFramework6.CodeFirst.Tests\MySql.EntityFramework6.CodeFirst.Tests.xproj", "{1CDC2D65-C754-4E0C-8F72-0A0C0FA2F17A}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "MySql.EntityFramework6.Basic.Tests", "Tests\MySql.EntityFramework6.Basic.Tests\MySql.EntityFramework6.Basic.Tests.xproj", "{F8C09FA3-67C7-4AD6-9FE2-17A3F82C1F2B}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "MySql.EntityFramework6.Migrations.Tests", "Tests\MySql.EntityFramework6.Migrations.Tests\MySql.EntityFramework6.Migrations.Tests.xproj", "{F3AE9F45-D8CC-47BB-BF30-F11EB24EAD16}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "MySql.Data.Entity.EF6", "Source\MySql.Data.Entity.EF6\MySql.Data.Entity.EF6.xproj", "{256547DD-4C49-48E7-BEB1-78FC17EAA464}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "MySql.Web", "Source\MySql.Web\MySql.Web.xproj", "{644C0442-74D1-4CEA-8B5B-B70099D4CCB2}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "MySql.Data.Tests.Stress", "Tests\MySql.Data.Tests.Stress\MySql.Data.Tests.Stress.xproj", "{BF425D4D-96A8-4EC7-9DD6-D8C83459E52D}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "MySql.Web.Tests", "Tests\MySql.Web.Tests\MySql.Web.Tests.xproj", "{2D54AE12-2CB6-455D-BA87-87D0DF71F603}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {8F0F6915-49B2-42F8-A592-BEF9A09F3811}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8F0F6915-49B2-42F8-A592-BEF9A09F3811}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8F0F6915-49B2-42F8-A592-BEF9A09F3811}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8F0F6915-49B2-42F8-A592-BEF9A09F3811}.Release|Any CPU.Build.0 = Release|Any CPU - {742DC4B9-D6D3-4063-821F-BB2FD980CE10}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {742DC4B9-D6D3-4063-821F-BB2FD980CE10}.Debug|Any CPU.Build.0 = Debug|Any CPU - {742DC4B9-D6D3-4063-821F-BB2FD980CE10}.Release|Any CPU.ActiveCfg = Release|Any CPU - {42229016-61AC-4ABF-88EB-354055D2AC40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {42229016-61AC-4ABF-88EB-354055D2AC40}.Debug|Any CPU.Build.0 = Debug|Any CPU - {42229016-61AC-4ABF-88EB-354055D2AC40}.Release|Any CPU.ActiveCfg = Release|Any CPU - {42229016-61AC-4ABF-88EB-354055D2AC40}.Release|Any CPU.Build.0 = Release|Any CPU - {E0EA25B2-FF20-4B52-9325-57BBEDD777EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E0EA25B2-FF20-4B52-9325-57BBEDD777EF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E0EA25B2-FF20-4B52-9325-57BBEDD777EF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E0EA25B2-FF20-4B52-9325-57BBEDD777EF}.Release|Any CPU.Build.0 = Release|Any CPU - {1CAAB7D0-8D06-46B8-B3C9-8639828A6AE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1CAAB7D0-8D06-46B8-B3C9-8639828A6AE8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1CAAB7D0-8D06-46B8-B3C9-8639828A6AE8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1CAAB7D0-8D06-46B8-B3C9-8639828A6AE8}.Release|Any CPU.Build.0 = Release|Any CPU - {ACCD7F4B-A8E5-4642-BFD3-CDD2E3F52495}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ACCD7F4B-A8E5-4642-BFD3-CDD2E3F52495}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ACCD7F4B-A8E5-4642-BFD3-CDD2E3F52495}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ACCD7F4B-A8E5-4642-BFD3-CDD2E3F52495}.Release|Any CPU.Build.0 = Release|Any CPU - {863B140B-0956-4871-B9F5-AA2681AF59DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {863B140B-0956-4871-B9F5-AA2681AF59DA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {863B140B-0956-4871-B9F5-AA2681AF59DA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {863B140B-0956-4871-B9F5-AA2681AF59DA}.Release|Any CPU.Build.0 = Release|Any CPU - {1CDC2D65-C754-4E0C-8F72-0A0C0FA2F17A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1CDC2D65-C754-4E0C-8F72-0A0C0FA2F17A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1CDC2D65-C754-4E0C-8F72-0A0C0FA2F17A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1CDC2D65-C754-4E0C-8F72-0A0C0FA2F17A}.Release|Any CPU.Build.0 = Release|Any CPU - {F8C09FA3-67C7-4AD6-9FE2-17A3F82C1F2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F8C09FA3-67C7-4AD6-9FE2-17A3F82C1F2B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F8C09FA3-67C7-4AD6-9FE2-17A3F82C1F2B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F8C09FA3-67C7-4AD6-9FE2-17A3F82C1F2B}.Release|Any CPU.Build.0 = Release|Any CPU - {F3AE9F45-D8CC-47BB-BF30-F11EB24EAD16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F3AE9F45-D8CC-47BB-BF30-F11EB24EAD16}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F3AE9F45-D8CC-47BB-BF30-F11EB24EAD16}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F3AE9F45-D8CC-47BB-BF30-F11EB24EAD16}.Release|Any CPU.Build.0 = Release|Any CPU - {256547DD-4C49-48E7-BEB1-78FC17EAA464}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {256547DD-4C49-48E7-BEB1-78FC17EAA464}.Debug|Any CPU.Build.0 = Debug|Any CPU - {256547DD-4C49-48E7-BEB1-78FC17EAA464}.Release|Any CPU.ActiveCfg = Release|Any CPU - {256547DD-4C49-48E7-BEB1-78FC17EAA464}.Release|Any CPU.Build.0 = Release|Any CPU - {644C0442-74D1-4CEA-8B5B-B70099D4CCB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {644C0442-74D1-4CEA-8B5B-B70099D4CCB2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {644C0442-74D1-4CEA-8B5B-B70099D4CCB2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {644C0442-74D1-4CEA-8B5B-B70099D4CCB2}.Release|Any CPU.Build.0 = Release|Any CPU - {BF425D4D-96A8-4EC7-9DD6-D8C83459E52D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BF425D4D-96A8-4EC7-9DD6-D8C83459E52D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BF425D4D-96A8-4EC7-9DD6-D8C83459E52D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BF425D4D-96A8-4EC7-9DD6-D8C83459E52D}.Release|Any CPU.Build.0 = Release|Any CPU - {2D54AE12-2CB6-455D-BA87-87D0DF71F603}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2D54AE12-2CB6-455D-BA87-87D0DF71F603}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2D54AE12-2CB6-455D-BA87-87D0DF71F603}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2D54AE12-2CB6-455D-BA87-87D0DF71F603}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {8F0F6915-49B2-42F8-A592-BEF9A09F3811} = {F50317E3-9DBA-4F6D-8EA2-BEBBB3FB17FE} - {742DC4B9-D6D3-4063-821F-BB2FD980CE10} = {019C5460-E964-4688-9A91-57ED26D09F4B} - {42229016-61AC-4ABF-88EB-354055D2AC40} = {81A599B5-6ED5-45F7-84BE-1E5F772EA38D} - {E0EA25B2-FF20-4B52-9325-57BBEDD777EF} = {F50317E3-9DBA-4F6D-8EA2-BEBBB3FB17FE} - {1CAAB7D0-8D06-46B8-B3C9-8639828A6AE8} = {81A599B5-6ED5-45F7-84BE-1E5F772EA38D} - {ACCD7F4B-A8E5-4642-BFD3-CDD2E3F52495} = {81A599B5-6ED5-45F7-84BE-1E5F772EA38D} - {863B140B-0956-4871-B9F5-AA2681AF59DA} = {81A599B5-6ED5-45F7-84BE-1E5F772EA38D} - {1CDC2D65-C754-4E0C-8F72-0A0C0FA2F17A} = {81A599B5-6ED5-45F7-84BE-1E5F772EA38D} - {F8C09FA3-67C7-4AD6-9FE2-17A3F82C1F2B} = {81A599B5-6ED5-45F7-84BE-1E5F772EA38D} - {F3AE9F45-D8CC-47BB-BF30-F11EB24EAD16} = {81A599B5-6ED5-45F7-84BE-1E5F772EA38D} - {256547DD-4C49-48E7-BEB1-78FC17EAA464} = {F50317E3-9DBA-4F6D-8EA2-BEBBB3FB17FE} - {644C0442-74D1-4CEA-8B5B-B70099D4CCB2} = {F50317E3-9DBA-4F6D-8EA2-BEBBB3FB17FE} - {BF425D4D-96A8-4EC7-9DD6-D8C83459E52D} = {81A599B5-6ED5-45F7-84BE-1E5F772EA38D} - {2D54AE12-2CB6-455D-BA87-87D0DF71F603} = {81A599B5-6ED5-45F7-84BE-1E5F772EA38D} - EndGlobalSection -EndGlobal diff --git a/MySql.Web/MySql.Web.sln b/MySql.Web/MySql.Web.sln new file mode 100644 index 000000000..9fbddef5b --- /dev/null +++ b/MySql.Web/MySql.Web.sln @@ -0,0 +1,34 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26403.7 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MySql.Web", "src\MySql.Web.csproj", "{D5EBEF6A-8841-4796-B061-26BDC7458818}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MySql.Data", "..\MySQL.Data\src\MySql.Data.csproj", "{1745969D-2A70-41AD-9020-A219BA019F73}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MySql.Web.Tests", "tests\MySql.Web.Tests.csproj", "{4306517D-FEBB-4052-B48F-FDD8E0EF0484}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D5EBEF6A-8841-4796-B061-26BDC7458818}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D5EBEF6A-8841-4796-B061-26BDC7458818}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D5EBEF6A-8841-4796-B061-26BDC7458818}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D5EBEF6A-8841-4796-B061-26BDC7458818}.Release|Any CPU.Build.0 = Release|Any CPU + {1745969D-2A70-41AD-9020-A219BA019F73}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1745969D-2A70-41AD-9020-A219BA019F73}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1745969D-2A70-41AD-9020-A219BA019F73}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1745969D-2A70-41AD-9020-A219BA019F73}.Release|Any CPU.Build.0 = Release|Any CPU + {4306517D-FEBB-4052-B48F-FDD8E0EF0484}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4306517D-FEBB-4052-B48F-FDD8E0EF0484}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4306517D-FEBB-4052-B48F-FDD8E0EF0484}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4306517D-FEBB-4052-B48F-FDD8E0EF0484}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/MySql.Web/src/Application.cs b/MySql.Web/src/Application.cs new file mode 100644 index 000000000..fcfc033ea --- /dev/null +++ b/MySql.Web/src/Application.cs @@ -0,0 +1,94 @@ +// Copyright © 2009, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Configuration.Provider; + +namespace MySql.Web.General +{ + internal class Application + { + private long _id; + private string _desc; + + public Application(string name, string desc) + { + Id = -1; + Name = name; + Description = desc; + } + public long Id + { + get { return _id; } + private set { _id = value; } + } + public string Name; + + public string Description + { + get { return _desc; } + private set { _desc = value; } + } + + public long FetchId(MySqlConnection connection) + { + if (Id == -1) + { + MySqlCommand cmd = new MySqlCommand( + @"SELECT id FROM my_aspnet_applications WHERE name=@name", connection); + cmd.Parameters.AddWithValue("@name", Name); + object id = cmd.ExecuteScalar(); + Id = id == null ? -1 : Convert.ToInt64(id); + } + return Id; + } + + /// + /// Creates the or fetch application id. + /// + /// The connection. + public long EnsureId(MySqlConnection connection) + { + // first try and retrieve the existing id + if (FetchId(connection) <= 0) + { + MySqlCommand cmd = new MySqlCommand( + "INSERT INTO my_aspnet_applications VALUES (NULL, @appName, @appDesc)", connection); + cmd.Parameters.AddWithValue("@appName", Name); + cmd.Parameters.AddWithValue("@appDesc", Description); + int recordsAffected = cmd.ExecuteNonQuery(); + if (recordsAffected != 1) + throw new ProviderException(Properties.Resources.UnableToCreateApplication); + + Id = cmd.LastInsertedId; + } + return Id; + } + } +} diff --git a/MySql.Web/src/ConfigUtility.cs b/MySql.Web/src/ConfigUtility.cs new file mode 100644 index 000000000..6bb236523 --- /dev/null +++ b/MySql.Web/src/ConfigUtility.cs @@ -0,0 +1,58 @@ +// Copyright © 2017, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +// This code was contributed by Sean Wright (srwright@alcor.concordia.ca) on 2007-01-12 +// The copyright was assigned and transferred under the terms of +// the MySQL Contributor License Agreement (CLA) + +using MySql.Web.Properties; +using System; +using System.Collections.Specialized; +using System.Configuration; + +namespace MySql.Web +{ + internal class ConfigUtility + { + public static string GetConnectionString(NameValueCollection config) + { + var name = config["connectionStringName"]; + var connStr = config["connectionString"]; + + if (name != null && connStr != null) + throw new InvalidOperationException(Resources.CannotSpecifyNameAndConnectionString); + + if (connStr != null) + return connStr; + + var connectionStringSettings = ConfigurationManager.ConnectionStrings[name]; + if (connectionStringSettings == null) return null; + return connectionStringSettings.ConnectionString.Trim(); + } + } +} diff --git a/Source/MySql.Web/MembershipProvider.cs b/MySql.Web/src/MembershipProvider.cs similarity index 81% rename from Source/MySql.Web/MembershipProvider.cs rename to MySql.Web/src/MembershipProvider.cs index 8a26f1e0a..d3b82785a 100644 --- a/Source/MySql.Web/MembershipProvider.cs +++ b/MySql.Web/src/MembershipProvider.cs @@ -1,1503 +1,1727 @@ -// Copyright � 2004, 2014, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -// This code was contributed by Sean Wright (srwright@alcor.concordia.ca) on 2007-01-12 -// The copyright was assigned and transferred under the terms of -// the MySQL Contributor License Agreement (CLA) - -using System; -using System.Collections.Specialized; -using System.Configuration; -using System.Configuration.Provider; -using System.Data; -using System.Diagnostics; -using System.Security.Cryptography; -using System.Text; -using System.Web.Configuration; -using System.Web.Hosting; -using System.Web.Security; -using MySql.Data.MySqlClient; -using MySql.Web.Properties; -using MySql.Web.Profile; -using MySql.Web.Common; -using System.Text.RegularExpressions; -using MySql.Web.General; - -namespace MySql.Web.Security -{ - /// - /// Manages storage of membership information for an ASP.NET application in a MySQL database. - /// - /// - /// - /// This class is used by the and classes - /// to provide membership services for ASP.NET applications using a MySQL database. - /// - /// - /// - /// - /// - public sealed class MySQLMembershipProvider : MembershipProvider - { - private int newPasswordLength = 8; - private string eventSource = "MySQLMembershipProvider"; - private string eventLog = "Application"; - private string exceptionMessage = "An exception occurred. Please check the Event Log."; - private string connectionString; - private int minRequiredPasswordLength; - private bool writeExceptionsToEventLog; - private bool enablePasswordReset; - private bool enablePasswordRetrieval; - private bool requiresQuestionAndAnswer; - private bool requiresUniqueEmail; - private int maxInvalidPasswordAttempts; - private int passwordAttemptWindow; - private MembershipPasswordFormat passwordFormat; - private int minRequiredNonAlphanumericCharacters; - private string passwordStrengthRegularExpression; - private Application app; - - /// - /// Initializes the MySQL membership provider with the property values specified in the - /// ASP.NET application's configuration file. This method is not intended to be used directly - /// from your code. - /// - /// The name of the instance to initialize. - /// A collection of the name/value pairs representing the - /// provider-specific attributes specified in the configuration for this provider. - /// config is a null reference. - /// An attempt is made to call on a provider after the provider has already been initialized. - /// - public override void Initialize(string name, NameValueCollection config) - { - if (config == null) - { - throw new ArgumentNullException("config"); - } - if (name == null || name.Length == 0) - { - name = "MySQLMembershipProvider"; - } - if (string.IsNullOrEmpty(config["description"])) - { - config.Remove("description"); - config.Add("description", "MySQL default application"); - } - base.Initialize(name, config); - - string applicationName = GetConfigValue(config["applicationName"], - HostingEnvironment.ApplicationVirtualPath); - maxInvalidPasswordAttempts = Convert.ToInt32(GetConfigValue(config["maxInvalidPasswordAttempts"], "5")); - passwordAttemptWindow = Convert.ToInt32(GetConfigValue(config["passwordAttemptWindow"], "10")); - minRequiredNonAlphanumericCharacters = - Convert.ToInt32(GetConfigValue(config["minRequiredNonalphanumericCharacters"], "1")); - minRequiredPasswordLength = Convert.ToInt32(GetConfigValue(config["minRequiredPasswordLength"], "7")); - passwordStrengthRegularExpression = - Convert.ToString(GetConfigValue(config["passwordStrengthRegularExpression"], "")); - enablePasswordReset = Convert.ToBoolean(GetConfigValue(config["enablePasswordReset"], "True")); - enablePasswordRetrieval = Convert.ToBoolean( - GetConfigValue(config["enablePasswordRetrieval"], "False")); - requiresQuestionAndAnswer = Convert.ToBoolean(GetConfigValue(config["requiresQuestionAndAnswer"], "False")); - requiresUniqueEmail = Convert.ToBoolean(GetConfigValue(config["requiresUniqueEmail"], "True")); - writeExceptionsToEventLog = Convert.ToBoolean(GetConfigValue(config["writeExceptionsToEventLog"], "True")); - string temp_format = config["passwordFormat"]; - - if (temp_format == null) - temp_format = "hashed"; - else - temp_format = temp_format.ToLowerInvariant(); - - if (temp_format == "hashed") - passwordFormat = MembershipPasswordFormat.Hashed; - else if (temp_format == "encrypted") - passwordFormat = MembershipPasswordFormat.Encrypted; - else if (temp_format == "clear") - passwordFormat = MembershipPasswordFormat.Clear; - else - throw new ProviderException("Password format not supported."); - - // if the user is asking for the ability to retrieve hashed passwords, then let - // them know we can't - if (PasswordFormat == MembershipPasswordFormat.Hashed) - { - if (EnablePasswordRetrieval) - throw new ProviderException(Properties.Resources.CannotRetrieveHashedPasswords); - } - - ConnectionStringSettings ConnectionStringSettings = ConfigurationManager.ConnectionStrings[ - config["connectionStringName"]]; - if (ConnectionStringSettings != null) - connectionString = ConnectionStringSettings.ConnectionString.Trim(); - else - connectionString = ""; - - if (String.IsNullOrEmpty(connectionString)) return; - - // make sure we have the correct schema - SchemaManager.CheckSchema(connectionString, config); - - app = new Application(applicationName, base.Description); - } - - private static string GetConfigValue(string configValue, string defaultValue) - { - if (string.IsNullOrEmpty(configValue)) - { - return defaultValue; - } - return configValue; - } - - #region Properties - - /// - /// The name of the application using the MySQL membership provider. - /// - /// The name of the application using the MySQL membership provider. The default is the - /// application virtual path. - /// The ApplicationName is used by the MySqlMembershipProvider to separate - /// membership information for multiple applications. Using different application names, - /// applications can use the same membership database. - /// Likewise, multiple applications can make use of the same membership data by simply using - /// the same application name. - /// Caution should be taken with multiple applications as the ApplicationName property is not - /// thread safe during writes. - /// - /// - /// The following example shows the membership element being used in an applications web.config file. - /// The application name setting is being used. - /// - /// - public override string ApplicationName - { - get { return app.Name; } - set - { - lock (this) - { - if (value.ToLowerInvariant() == app.Name.ToLowerInvariant()) return; - app = new Application(value, String.Empty); - } - } - } - - /// - /// Indicates whether the membership provider is configured to allow users to reset their passwords. - /// - /// true if the membership provider supports password reset; otherwise, false. The default is true. - /// Allows the user to replace their password with a new, randomly generated password. - /// This can be especially handy when using hashed passwords since hashed passwords cannot be - /// retrieved. - /// - /// The following example shows the membership element being used in an applications web.config file. - /// - /// - public override bool EnablePasswordReset - { - get { return enablePasswordReset; } - } - - /// - /// Indicates whether the membership provider is configured to allow users to retrieve - /// their passwords. - /// - /// true if the membership provider is configured to support password retrieval; - /// otherwise, false. The default is false. - /// If the system is configured to use hashed passwords, then retrieval is not possible. - /// If the user attempts to initialize the provider with hashed passwords and enable password retrieval - /// set to true then a is thrown. - /// - /// The following example shows the membership element being used in an applications web.config file. - /// - /// - public override bool EnablePasswordRetrieval - { - get { return enablePasswordRetrieval; } - } - - /// - /// Gets a value indicating whether the membership provider is - /// configured to require the user to answer a password question - /// for password reset and retrieval. - /// - /// true if a password answer is required for password - /// reset and retrieval; otherwise, false. The default is false. - /// - /// The following example shows the membership element being used in an applications web.config file. - /// - /// - public override bool RequiresQuestionAndAnswer - { - get { return requiresQuestionAndAnswer; } - } - - /// - /// Gets a value indicating whether the membership provider is configured - /// to require a unique e-mail address for each user name. - /// - /// true if the membership provider requires a unique e-mail address; - /// otherwise, false. The default is true. - /// - /// The following example shows the membership element being used in an applications web.config file. - /// - /// - public override bool RequiresUniqueEmail - { - get { return requiresUniqueEmail; } - } - - /// - /// Gets the number of invalid password or password-answer attempts allowed - /// before the membership user is locked out. - /// - /// The number of invalid password or password-answer attempts allowed - /// before the membership user is locked out. - /// - /// The following example shows the membership element being used in an applications web.config file. - /// - /// - public override int MaxInvalidPasswordAttempts - { - get { return maxInvalidPasswordAttempts; } - } - - /// - /// Gets the number of minutes in which a maximum number of invalid password or - /// password-answer attempts are allowed before the membership user is locked out. - /// - /// The number of minutes in which a maximum number of invalid password or - /// password-answer attempts are allowed before the membership user is locked out. - /// - /// The following example shows the membership element being used in an applications web.config file. - /// - /// - public override int PasswordAttemptWindow - { - get { return passwordAttemptWindow; } - } - - /// - /// Gets a value indicating the format for storing passwords in the membership data store. - /// - /// One of the - /// values indicating the format for storing passwords in the data store. - /// - /// The following example shows the membership element being used in an applications web.config file. - /// - /// - public override MembershipPasswordFormat PasswordFormat - { - get { return passwordFormat; } - } - - /// - /// Gets the minimum number of special characters that must be present in a valid password. - /// - /// The minimum number of special characters that must be present - /// in a valid password. - /// - /// The following example shows the membership element being used in an applications web.config file. - /// - /// - public override int MinRequiredNonAlphanumericCharacters - { - get { return minRequiredNonAlphanumericCharacters; } - } - - /// - /// Gets the minimum length required for a password. - /// - /// The minimum length required for a password. - /// - /// The following example shows the membership element being used in an applications web.config file. - /// - /// - public override int MinRequiredPasswordLength - { - get { return minRequiredPasswordLength; } - } - - /// - /// Gets the regular expression used to evaluate a password. - /// - /// A regular expression used to evaluate a password. - /// - /// The following example shows the membership element being used in an applications web.config file. - /// In this example, the regular expression specifies that the password must meet the following - /// criteria: - ///
    - /// Is at least seven characters. - /// Contains at least one digit. - /// Contains at least one special (non-alphanumeric) character. - ///
- /// - ///
- public override string PasswordStrengthRegularExpression - { - get { return passwordStrengthRegularExpression; } - } - - /// - /// Gets or sets a value indicating whether exceptions are written to the event log. - /// - /// - /// true if exceptions should be written to the log; otherwise, false. - /// - public bool WriteExceptionsToEventLog - { - get { return writeExceptionsToEventLog; } - set { writeExceptionsToEventLog = value; } - } - - #endregion - - #region Public Methods - - /// - /// Changes the password. - /// - /// The username. - /// The old password. - /// The new password. - /// true if the password was updated successfully, false if the supplied old password - /// is invalid, the user is locked out, or the user does not exist in the database. - public override bool ChangePassword(string username, string oldPassword, string newPassword) - { - // this will return false if the username doesn't exist - if (!(ValidateUser(username, oldPassword))) - return false; - - ValidatePasswordEventArgs args = new ValidatePasswordEventArgs(username, newPassword, true); - OnValidatingPassword(args); - if (args.Cancel) - { - if (!(args.FailureInformation == null)) - throw args.FailureInformation; - else - throw new ProviderException(Properties.Resources.ChangePasswordCanceled); - } - - // validate the password according to current guidelines - if (!ValidatePassword(newPassword, "newPassword", true)) - return false; - - try - { - using (MySqlConnection connection = new MySqlConnection(connectionString)) - { - connection.Open(); - - // retrieve the existing key and format for this user - string passwordKey; - MembershipPasswordFormat passwordFormat; - int userId = GetUserId(connection, username); - - GetPasswordInfo(connection, userId, out passwordKey, out passwordFormat); - - MySqlCommand cmd = new MySqlCommand( - @"UPDATE my_aspnet_membership - SET Password = @pass, LastPasswordChangedDate = @lastPasswordChangedDate - WHERE userId=@userId", connection); - cmd.Parameters.AddWithValue("@pass", - EncodePassword(newPassword, passwordKey, passwordFormat)); - cmd.Parameters.AddWithValue("@lastPasswordChangedDate", DateTime.Now); - cmd.Parameters.AddWithValue("@userId", userId); - return cmd.ExecuteNonQuery() > 0; - } - } - catch (MySqlException e) - { - if (WriteExceptionsToEventLog) - WriteToEventLog(e, "ChangePassword"); - throw new ProviderException(exceptionMessage, e); - } - } - - /// - /// Changes the password question and answer. - /// - /// The username. - /// The password. - /// The new password question. - /// The new password answer. - /// true if the update was successful; otherwise, false. A value of false is - /// also returned if the password is incorrect, the user is locked out, or the user - /// does not exist in the database. - public override bool ChangePasswordQuestionAndAnswer(string username, - string password, string newPwdQuestion, string newPwdAnswer) - { - // this handles the case where the username doesn't exist - if (!(ValidateUser(username, password))) - return false; - - try - { - using (MySqlConnection connection = new MySqlConnection(connectionString)) - { - connection.Open(); - - string passwordKey; - MembershipPasswordFormat passwordFormat; - int userId = GetUserId(connection, username); - - GetPasswordInfo(connection, userId, out passwordKey, out passwordFormat); - - - MySqlCommand cmd = new MySqlCommand( - @"UPDATE my_aspnet_membership - SET PasswordQuestion = @passwordQuestion, PasswordAnswer = @passwordAnswer - WHERE userId=@userId", connection); - cmd.Parameters.AddWithValue("@passwordQuestion", newPwdQuestion); - cmd.Parameters.AddWithValue("@passwordAnswer", - EncodePassword(newPwdAnswer, passwordKey, passwordFormat)); - cmd.Parameters.AddWithValue("@userId", userId); - return cmd.ExecuteNonQuery() > 0; - } - } - catch (MySqlException e) - { - if (WriteExceptionsToEventLog) - WriteToEventLog(e, "ChangePasswordQuestionAndAnswer"); - throw new ProviderException(exceptionMessage, e); - } - } - - /// - /// Adds a new membership user to the data source. - /// - /// The user name for the new user. - /// The password for the new user. - /// The e-mail address for the new user. - /// The password question for the new user. - /// The password answer for the new user - /// Whether or not the new user is approved to be validated. - /// The unique identifier from the membership data source for the user. - /// A enumeration value indicating whether the user was created successfully. - /// - /// A object populated with the information for the newly created user. - /// - public override MembershipUser CreateUser(string username, string password, - string email, string passwordQuestion, string passwordAnswer, - bool isApproved, object providerUserKey, out MembershipCreateStatus status) - { - //basis on MSDN documentation we should trim all the paramater values: http://msdn.microsoft.com/en-us/library/d8t4h2es%28v=vs.110%29.aspx - TrimParametersValues(ref username, ref password, ref email, ref passwordQuestion, ref passwordAnswer); - - ValidatePasswordEventArgs Args = new ValidatePasswordEventArgs(username, password, true); - OnValidatingPassword(Args); - if (Args.Cancel) - { - status = MembershipCreateStatus.InvalidPassword; - return null; - } - if (RequiresUniqueEmail && !String.IsNullOrEmpty(GetUserNameByEmail(email))) - { - status = MembershipCreateStatus.DuplicateEmail; - return null; - } - - ValidateQA(passwordQuestion, passwordAnswer); - - // now try to validate the password - if (!ValidatePassword(password, "password", false)) - { - status = MembershipCreateStatus.InvalidPassword; - return null; - } - - // now check to see if we already have a member by this name - MembershipUser u = GetUser(username, false); - if (u != null) - { - status = MembershipCreateStatus.DuplicateUserName; - return null; - } - - string passwordKey = GetPasswordKey(); - DateTime createDate = DateTime.Now; - MySqlTransaction transaction = null; - - using (MySqlConnection connection = new MySqlConnection(connectionString)) - { - try - { - connection.Open(); - transaction = connection.BeginTransaction(); - - // either create a new user or fetch the existing user id - long userId = SchemaManager.CreateOrFetchUserId(connection, username, - app.EnsureId(connection), true); - - MySqlCommand cmd = new MySqlCommand( - @"INSERT INTO my_aspnet_membership - VALUES(@userId, @email, @comment, @password, @passwordKey, - @passwordFormat, @passwordQuestion, @passwordAnswer, - @isApproved, @lastActivityDate, @lastLoginDate, - @lastPasswordChangedDate, @creationDate, - @isLockedOut, @lastLockedOutDate, @failedPasswordAttemptCount, - @failedPasswordAttemptWindowStart, @failedPasswordAnswerAttemptCount, - @failedPasswordAnswerAttemptWindowStart)", - connection); - cmd.Parameters.AddWithValue("@userId", userId); - cmd.Parameters.AddWithValue("@email", email); - cmd.Parameters.AddWithValue("@comment", ""); - cmd.Parameters.AddWithValue("@password", - EncodePassword(password, passwordKey, PasswordFormat)); - cmd.Parameters.AddWithValue("@passwordKey", passwordKey); - cmd.Parameters.AddWithValue("@passwordFormat", PasswordFormat); - cmd.Parameters.AddWithValue("@passwordQuestion", passwordQuestion); - cmd.Parameters.AddWithValue("@passwordAnswer", - EncodePassword(passwordAnswer, passwordKey, PasswordFormat)); - cmd.Parameters.AddWithValue("@isApproved", isApproved); - cmd.Parameters.AddWithValue("@lastActivityDate", createDate); - cmd.Parameters.AddWithValue("@lastLoginDate", createDate); - cmd.Parameters.AddWithValue("@lastPasswordChangedDate", createDate); - cmd.Parameters.AddWithValue("@creationDate", createDate); - cmd.Parameters.AddWithValue("@isLockedOut", false); - cmd.Parameters.AddWithValue("@lastLockedOutDate", createDate); - cmd.Parameters.AddWithValue("@failedPasswordAttemptCount", 0); - cmd.Parameters.AddWithValue("@failedPasswordAttemptWindowStart", createDate); - cmd.Parameters.AddWithValue("@failedPasswordAnswerAttemptCount", 0); - cmd.Parameters.AddWithValue("@failedPasswordAnswerAttemptWindowStart", createDate); - - int recAdded = cmd.ExecuteNonQuery(); - if (recAdded > 0) - status = MembershipCreateStatus.Success; - else - status = MembershipCreateStatus.UserRejected; - transaction.Commit(); - } - catch (MySqlException e) - { - if (WriteExceptionsToEventLog) - WriteToEventLog(e, "CreateUser"); - status = MembershipCreateStatus.ProviderError; - if (transaction != null) - transaction.Rollback(); - return null; - } - } - - return GetUser(username, false); - } - - /// - /// Removes a user from the membership data source. - /// - /// The name of the user to delete. - /// true to delete data related to the user from the database; false to leave data related to the user in the database. - /// - /// true if the user was successfully deleted; otherwise, false. - /// - public override bool DeleteUser(string username, bool deleteAllRelatedData) - { - try - { - using (MySqlConnection conn = new MySqlConnection(connectionString)) - { - conn.Open(); - - int userId = GetUserId(conn, username); - if (-1 == userId) return false; - - // if we are supposed to delete all related data, then delegate that to those providers - if (deleteAllRelatedData) - { - MySQLRoleProvider.DeleteUserData(conn, userId); - MySQLProfileProvider.DeleteUserData(conn, userId); - } - - string sql = @"DELETE {0}m - FROM my_aspnet_users u, my_aspnet_membership m - WHERE u.id=m.userId AND u.id=@userId"; - - MySqlCommand cmd = new MySqlCommand( - String.Format(sql, deleteAllRelatedData ? "u," : ""), conn); - cmd.Parameters.AddWithValue("@appId", app.FetchId(conn)); - cmd.Parameters.AddWithValue("@userId", userId); - return cmd.ExecuteNonQuery() > 0; - } - } - catch (MySqlException e) - { - if (WriteExceptionsToEventLog) - WriteToEventLog(e, "DeleteUser"); - throw new ProviderException(exceptionMessage, e); - } - } - - /// - /// Gets a collection of all the users in the data source in pages of data. - /// - /// The index of the page of results to return. is zero-based. - /// The size of the page of results to return. - /// The total number of matched users. - /// - /// A collection that contains a page of objects beginning at the page specified by . - /// - public override MembershipUserCollection GetAllUsers(int pageIndex, - int pageSize, out int totalRecords) - { - return GetUsers(null, null, pageIndex, pageSize, out totalRecords); - } - - /// - /// Gets the number of users currently accessing the application. - /// - /// - /// The number of users currently accessing the application. - /// - public override int GetNumberOfUsersOnline() - { - TimeSpan onlineSpan = new TimeSpan(0, Membership.UserIsOnlineTimeWindow, 0); - DateTime compareTime = DateTime.Now.Subtract(onlineSpan); - - try - { - using (MySqlConnection connection = new MySqlConnection(connectionString)) - { - connection.Open(); - MySqlCommand cmd = new MySqlCommand( - @"SELECT COUNT(*) FROM my_aspnet_membership m JOIN my_aspnet_users u - ON m.userId=u.id WHERE m.LastActivityDate > @date AND u.applicationId=@appId", - connection); - cmd.Parameters.AddWithValue("@date", compareTime); - cmd.Parameters.AddWithValue("@appId", app.FetchId(connection)); - return Convert.ToInt32(cmd.ExecuteScalar()); - } - } - catch (MySqlException e) - { - if (WriteExceptionsToEventLog) - WriteToEventLog(e, "GetNumberOfUsersOnline"); - throw new ProviderException(exceptionMessage, e); - } - } - - /// - /// Gets the password for the specified user name from the data source. - /// - /// The user to retrieve the password for. - /// The password answer for the user. - /// - /// The password for the specified user name. - /// - public override string GetPassword(string username, string answer) - { - if (!EnablePasswordRetrieval) - throw new ProviderException(Properties.Resources.PasswordRetrievalNotEnabled); - - try - { - using (MySqlConnection connection = new MySqlConnection(connectionString)) - { - connection.Open(); - - int userId = GetUserId(connection, username); - if (-1 == userId) - throw new ProviderException("Username not found."); - - string sql = @"SELECT Password, PasswordAnswer, PasswordKey, PasswordFormat, - IsLockedOut FROM my_aspnet_membership WHERE userId=@userId"; - MySqlCommand cmd = new MySqlCommand(sql, connection); - cmd.Parameters.AddWithValue("@userId", userId); - - using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) - { - reader.Read(); - if (reader.GetBoolean("IsLockedOut")) - throw new MembershipPasswordException(Properties.Resources.UserIsLockedOut); - - string password = reader.GetString("Password"); - string passwordAnswer = reader.GetValue(reader.GetOrdinal("PasswordAnswer")).ToString(); - string passwordKey = reader.GetString("PasswordKey"); - MembershipPasswordFormat format = (MembershipPasswordFormat)reader.GetInt32(3); - reader.Close(); - - if (RequiresQuestionAndAnswer && - !(CheckPassword(answer, passwordAnswer, passwordKey, format))) - { - UpdateFailureCount(userId, "PasswordAnswer", connection); - throw new MembershipPasswordException(Properties.Resources.IncorrectPasswordAnswer); - } - if (PasswordFormat == MembershipPasswordFormat.Encrypted) - { - password = UnEncodePassword(password, format); - } - return password; - } - } - } - catch (MySqlException e) - { - if (WriteExceptionsToEventLog) - WriteToEventLog(e, "GetPassword"); - throw new ProviderException(exceptionMessage, e); - } - } - - /// - /// Gets information from the data source for a user. Provides an option to update the last-activity date/time stamp for the user. - /// - /// The name of the user to get information for. - /// true to update the last-activity date/time stamp for the user; false to return user information without updating the last-activity date/time stamp for the user. - /// - /// A object populated with the specified user's information from the data source. - /// - public override MembershipUser GetUser(string username, bool userIsOnline) - { - try - { - int userId = -1; - using (MySqlConnection connection = new MySqlConnection(connectionString)) - { - connection.Open(); - - userId = GetUserId(connection, username); - if (-1 == userId) return null; - } - - return GetUser(userId, userIsOnline); - } - catch (MySqlException e) - { - if (WriteExceptionsToEventLog) - WriteToEventLog(e, "GetUser(String, Boolean)"); - throw new ProviderException(exceptionMessage, e); - } - } - - /// - /// Gets user information from the data source based on the unique identifier for the membership user. Provides an option to update the last-activity date/time stamp for the user. - /// - /// The unique identifier for the membership user to get information for. - /// true to update the last-activity date/time stamp for the user; false to return user information without updating the last-activity date/time stamp for the user. - /// - /// A object populated with the specified user's information from the data source. - /// - public override MembershipUser GetUser(object providerUserKey, bool userIsOnline) - { - MySqlTransaction txn = null; - - try - { - using (MySqlConnection connection = new MySqlConnection(connectionString)) - { - connection.Open(); - - txn = connection.BeginTransaction(); - MySqlCommand cmd = new MySqlCommand("", connection); - cmd.Parameters.AddWithValue("@userId", providerUserKey); - - if (userIsOnline) - { - cmd.CommandText = - @"UPDATE my_aspnet_users SET lastActivityDate = @date WHERE id=@userId"; - cmd.Parameters.AddWithValue("@date", DateTime.Now); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "UPDATE my_aspnet_membership SET LastActivityDate=@date WHERE userId=@userId"; - cmd.ExecuteNonQuery(); - } - - cmd.CommandText = @"SELECT m.*,u.name - FROM my_aspnet_membership m JOIN my_aspnet_users u ON m.userId=u.id - WHERE u.id=@userId"; - - MembershipUser user; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - if (!reader.Read()) return null; - user = GetUserFromReader(reader); - } - txn.Commit(); - return user; - } - } - catch (MySqlException e) - { - if (txn != null) - txn.Rollback(); - if (WriteExceptionsToEventLog) - WriteToEventLog(e, "GetUser(Object, Boolean)"); - throw new ProviderException(exceptionMessage); - } - } - - /// - /// Unlocks the user. - /// - /// The username. - /// true if the membership user was successfully unlocked; - /// otherwise, false. A value of false is also returned if the user - /// does not exist in the database. - public override bool UnlockUser(string username) - { - try - { - using (MySqlConnection conn = new MySqlConnection(connectionString)) - { - conn.Open(); - - int userId = GetUserId(conn, username); - if (-1 == userId) return false; - - string sql = @"UPDATE my_aspnet_membership - SET IsLockedOut = false, LastLockedOutDate = @lastDate - WHERE userId=@userId"; - - MySqlCommand cmd = new MySqlCommand(sql, conn); - cmd.Parameters.AddWithValue("@lastDate", DateTime.Now); - cmd.Parameters.AddWithValue("@userId", userId); - return cmd.ExecuteNonQuery() > 0; - } - } - catch (MySqlException e) - { - if (WriteExceptionsToEventLog) - WriteToEventLog(e, "UnlockUser"); - throw new ProviderException(exceptionMessage, e); - } - } - - /// - /// Gets the user name associated with the specified e-mail address. - /// - /// The e-mail address to search for. - /// - /// The user name associated with the specified e-mail address. If no match is found, return null. - /// - public override string GetUserNameByEmail(string email) - { - try - { - using (MySqlConnection conn = new MySqlConnection(connectionString)) - { - conn.Open(); - - string sql = @"SELECT u.name FROM my_aspnet_users u - JOIN my_aspnet_membership m ON m.userid=u.id - WHERE m.Email = @email AND u.applicationId=@appId"; - MySqlCommand cmd = new MySqlCommand(sql, conn); - cmd.Parameters.AddWithValue("@email", email); - cmd.Parameters.AddWithValue("@appId", app.FetchId(conn)); - return (string)cmd.ExecuteScalar(); - } - } - catch (MySqlException e) - { - if (WriteExceptionsToEventLog) - WriteToEventLog(e, "GetUserNameByEmail"); - throw new ProviderException(exceptionMessage); - } - } - - /// - /// Resets a user's password to a new, automatically generated password. - /// - /// The user to reset the password for. - /// The password answer for the specified user. - /// The new password for the specified user. - public override string ResetPassword(string username, string answer) - { - if (!(EnablePasswordReset)) - throw new NotSupportedException(Properties.Resources.PasswordResetNotEnabled); - - try - { - using (MySqlConnection connection = new MySqlConnection(connectionString)) - { - connection.Open(); - - // fetch the userid first - int userId = GetUserId(connection, username); - if (-1 == userId) - throw new ProviderException(Properties.Resources.UsernameNotFound); - - if (answer == null && RequiresQuestionAndAnswer) - { - UpdateFailureCount(userId, "PasswordAnswer", connection); - throw new ProviderException(Properties.Resources.PasswordRequiredForReset); - } - - string newPassword = Membership.GeneratePassword(newPasswordLength, MinRequiredNonAlphanumericCharacters); - ValidatePasswordEventArgs Args = new ValidatePasswordEventArgs(username, newPassword, true); - OnValidatingPassword(Args); - if (Args.Cancel) - { - if (!(Args.FailureInformation == null)) - throw Args.FailureInformation; - else - throw new MembershipPasswordException(Properties.Resources.PasswordResetCanceledNotValid); - } - - MySqlCommand cmd = new MySqlCommand(@"SELECT PasswordAnswer, - PasswordKey, PasswordFormat, IsLockedOut - FROM my_aspnet_membership WHERE userId=@userId", connection); - cmd.Parameters.AddWithValue("@userId", userId); - - string passwordKey = String.Empty; - MembershipPasswordFormat format; - using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) - { - reader.Read(); - if (reader.GetBoolean("IsLockedOut")) - throw new MembershipPasswordException(Properties.Resources.UserIsLockedOut); - - object passwordAnswer = reader.GetValue(reader.GetOrdinal("PasswordAnswer")); - passwordKey = reader.GetString("PasswordKey"); - format = (MembershipPasswordFormat)reader.GetByte("PasswordFormat"); - reader.Close(); - - if (RequiresQuestionAndAnswer) - { - if (!CheckPassword(answer, (string)passwordAnswer, passwordKey, format)) - { - UpdateFailureCount(userId, "PasswordAnswer", connection); - throw new MembershipPasswordException(Properties.Resources.IncorrectPasswordAnswer); - } - } - } - - cmd.CommandText = @"UPDATE my_aspnet_membership - SET Password = @pass, LastPasswordChangedDate = @lastPassChange - WHERE userId=@userId"; - - cmd.Parameters.AddWithValue("@pass", - EncodePassword(newPassword, passwordKey, format)); - cmd.Parameters.AddWithValue("@lastPassChange", DateTime.Now); - int rowsAffected = cmd.ExecuteNonQuery(); - if (rowsAffected != 1) - throw new MembershipPasswordException(Properties.Resources.ErrorResettingPassword); - return newPassword; - } - } - catch (MySqlException e) - { - if (WriteExceptionsToEventLog) - WriteToEventLog(e, "ResetPassword"); - throw new ProviderException(exceptionMessage, e); - } - } - - /// - /// Updates information about a user in the data source. - /// - /// A object - /// that represents the user to update and the updated information for the user. - public override void UpdateUser(MembershipUser user) - { - try - { - using (MySqlConnection conn = new MySqlConnection(connectionString)) - { - conn.Open(); - - int userId = GetUserId(conn, user.UserName); - if (-1 == userId) - throw new ProviderException(Properties.Resources.UsernameNotFound); - - string sql = @"UPDATE my_aspnet_membership m, my_aspnet_users u - SET m.Email=@email, m.Comment=@comment, m.IsApproved=@isApproved, - m.LastLoginDate=@lastLoginDate, u.lastActivityDate=@lastActivityDate, - m.LastActivityDate=@lastActivityDate - WHERE m.userId=u.id AND u.name LIKE @name AND u.applicationId=@appId"; - MySqlCommand cmd = new MySqlCommand(sql, conn); - cmd.Parameters.AddWithValue("@Email", user.Email); - cmd.Parameters.AddWithValue("@Comment", user.Comment); - cmd.Parameters.AddWithValue("@isApproved", user.IsApproved); - cmd.Parameters.AddWithValue("@lastLoginDate", user.LastLoginDate); - cmd.Parameters.AddWithValue("@lastActivityDate", user.LastActivityDate); - cmd.Parameters.AddWithValue("@name", user.UserName); - cmd.Parameters.AddWithValue("@appId", app.FetchId(conn)); - cmd.ExecuteNonQuery(); - } - } - catch (MySqlException e) - { - if (WriteExceptionsToEventLog) - WriteToEventLog(e, "UpdateUser"); - throw new ProviderException(exceptionMessage); - } - } - - /// - /// Verifies that the specified user name and password exist in the data source. - /// - /// The name of the user to validate. - /// The password for the specified user. - /// - /// true if the specified username and password are valid; otherwise, false. - /// - public override bool ValidateUser(string username, string password) - { - bool isValid = false; - try - { - using (MySqlConnection connection = new MySqlConnection(connectionString)) - { - connection.Open(); - - // first get the user id. If that is -1, then the user doesn't exist - // so we just return false since we can't bump any counters - int userId = GetUserId(connection, username); - if (-1 == userId) return false; - - string sql = @"SELECT Password, PasswordKey, PasswordFormat, IsApproved, - Islockedout FROM my_aspnet_membership WHERE userId=@userId"; - MySqlCommand cmd = new MySqlCommand(sql, connection); - cmd.Parameters.AddWithValue("@userId", userId); - - using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) - { - if (!reader.HasRows) return false; - reader.Read(); - if (reader.GetBoolean("IsLockedOut")) return false; - - string pwd = reader.GetString(0); - string passwordKey = reader.GetString(1); - MembershipPasswordFormat format = (MembershipPasswordFormat) - reader.GetInt32(2); - bool isApproved = reader.GetBoolean(3); - reader.Close(); - - if (!CheckPassword(password, pwd, passwordKey, format)) - UpdateFailureCount(userId, "Password", connection); - else if (isApproved) - { - isValid = true; - DateTime currentDate = DateTime.Now; - MySqlCommand updateCmd = new MySqlCommand( - @"UPDATE my_aspnet_membership m, my_aspnet_users u - SET m.LastLoginDate = @lastLoginDate, u.lastActivityDate = @date, - m.LastActivityDate=@date - WHERE m.userId=@userid AND u.id=@userid", connection); - updateCmd.Parameters.AddWithValue("@lastLoginDate", currentDate); - updateCmd.Parameters.AddWithValue("@date", currentDate); - updateCmd.Parameters.AddWithValue("@userid", userId); - updateCmd.ExecuteNonQuery(); - } - } - return isValid; - } - } - catch (MySqlException e) - { - if (WriteExceptionsToEventLog) - WriteToEventLog(e, "ValidateUser"); - throw new ProviderException(exceptionMessage, e); - } - } - - /// - /// Gets a collection of membership users where the user name contains the specified user name to match. - /// - /// The user name to search for. - /// The index of the page of results to return. is zero-based. - /// The size of the page of results to return. - /// The total number of matched users. - /// - /// A collection that contains a page of objects beginning at the page specified by . - /// - public override MembershipUserCollection FindUsersByName(string usernameToMatch, - int pageIndex, int pageSize, out int totalRecords) - { - return GetUsers(usernameToMatch, null, pageIndex, pageSize, out totalRecords); - } - - /// - /// Gets a collection of membership users where the e-mail address contains the specified e-mail address to match. - /// - /// The e-mail address to search for. - /// The index of the page of results to return. is zero-based. - /// The size of the page of results to return. - /// The total number of matched users. - /// - /// A collection that contains a page of objects beginning at the page specified by . - /// - public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, - int pageSize, out int totalRecords) - { - return GetUsers(null, emailToMatch, pageIndex, pageSize, out totalRecords); - } - - #endregion - - #region Private Methods - - private int GetUserId(MySqlConnection connection, string username) - { - MySqlCommand cmd = new MySqlCommand( - "SELECT id FROM my_aspnet_users WHERE name = @name AND applicationId=@appId", connection); - cmd.Parameters.AddWithValue("@name", username); - cmd.Parameters.AddWithValue("@appId", app.FetchId(connection)); - object id = cmd.ExecuteScalar(); - if (id == null) return -1; - return (int)id; - } - - private void WriteToEventLog(Exception e, string action) - { - using (EventLog log = new EventLog()) - { - log.Source = eventSource; - log.Log = eventLog; - string message = "An exception occurred communicating with the data source." + - Environment.NewLine + Environment.NewLine; - message += "Action: " + action + Environment.NewLine + Environment.NewLine; - message += "Exception: " + e; - log.WriteEntry(message); - } - } - - private MembershipUser GetUserFromReader(MySqlDataReader reader) - { - object providerUserKey = reader.GetInt32("userId"); - string username = reader.GetString("name"); - - string email = null; - if (!reader.IsDBNull(reader.GetOrdinal("Email"))) - email = reader.GetString("Email"); - - string passwordQuestion = ""; - if (!(reader.GetValue(reader.GetOrdinal("PasswordQuestion")) == DBNull.Value)) - passwordQuestion = reader.GetString("PasswordQuestion"); - - string comment = ""; - if (!(reader.GetValue(reader.GetOrdinal("Comment")) == DBNull.Value)) - comment = reader.GetString("Comment"); - - bool isApproved = reader.GetBoolean("IsApproved"); - bool isLockedOut = reader.GetBoolean("IsLockedOut"); - DateTime creationDate = reader.GetDateTime("CreationDate"); - DateTime lastLoginDate = new DateTime(); - if (!(reader.GetValue(reader.GetOrdinal("LastLoginDate")) == DBNull.Value)) - lastLoginDate = reader.GetDateTime("LastLoginDate"); - - DateTime lastActivityDate = reader.GetDateTime("LastActivityDate"); - DateTime lastPasswordChangedDate = reader.GetDateTime("LastPasswordChangedDate"); - DateTime lastLockedOutDate = new DateTime(); - if (!(reader.GetValue(reader.GetOrdinal("LastLockedoutDate")) == DBNull.Value)) - lastLockedOutDate = reader.GetDateTime("LastLockedoutDate"); - - MembershipUser u = - new MembershipUser(Name, username, providerUserKey, email, passwordQuestion, comment, isApproved, - isLockedOut, creationDate, lastLoginDate, lastActivityDate, lastPasswordChangedDate, - lastLockedOutDate); - return u; - } - - private string UnEncodePassword(string encodedPassword, MembershipPasswordFormat format) - { - string password = encodedPassword; - if (format == MembershipPasswordFormat.Clear) - return encodedPassword; - else if (format == MembershipPasswordFormat.Encrypted) - return Encoding.Unicode.GetString(DecryptPassword( - Convert.FromBase64String(password))); - else if (format == MembershipPasswordFormat.Hashed) - throw new ProviderException(Properties.Resources.CannotUnencodeHashedPwd); - else - throw new ProviderException(Properties.Resources.UnsupportedPasswordFormat); - } - - private string GetPasswordKey() - { - RNGCryptoServiceProvider cryptoProvider = - new RNGCryptoServiceProvider(); - byte[] key = new byte[16]; - cryptoProvider.GetBytes(key); - return Convert.ToBase64String(key); - } - - /// - /// this method is only necessary because early versions of Mono did not support - /// the HashAlgorithmType property - /// - /// - /// - private string HashPasswordBytes(byte[] key, byte[] bytes) - { - HashAlgorithm hash = HashAlgorithm.Create(Membership.HashAlgorithmType); - - if (hash is KeyedHashAlgorithm) - { - KeyedHashAlgorithm keyedHash = hash as KeyedHashAlgorithm; - keyedHash.Key = key; - } - return Convert.ToBase64String(hash.ComputeHash(bytes)); - } - - private string EncodePassword(string password, string passwordKey, - MembershipPasswordFormat format) - { - if (password == null) - return null; - if (format == MembershipPasswordFormat.Clear) - return password; - - byte[] passwordBytes = Encoding.Unicode.GetBytes(password); - byte[] keyBytes = Convert.FromBase64String(passwordKey); - byte[] keyedBytes = new byte[passwordBytes.Length + keyBytes.Length]; - Array.Copy(keyBytes, keyedBytes, keyBytes.Length); - Array.Copy(passwordBytes, 0, keyedBytes, keyBytes.Length, passwordBytes.Length); - - if (format == MembershipPasswordFormat.Encrypted) - { - byte[] encryptedBytes = EncryptPassword(passwordBytes); - return Convert.ToBase64String(encryptedBytes); - } - else if (format == MembershipPasswordFormat.Hashed) - return HashPasswordBytes(keyBytes, keyedBytes); - else - throw new ProviderException(Properties.Resources.UnsupportedPasswordFormat); - } - - private void UpdateFailureCount(int userId, string failureType, MySqlConnection connection) - { - MySqlCommand cmd = new MySqlCommand( - @"SELECT FailedPasswordAttemptCount, - FailedPasswordAttemptWindowStart, FailedPasswordAnswerAttemptCount, - FailedPasswordAnswerAttemptWindowStart FROM my_aspnet_membership - WHERE userId=@userId", connection); - cmd.Parameters.AddWithValue("@userId", userId); - - DateTime windowStart = new DateTime(); - int failureCount = 0; - try - { - using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) - { - if (!reader.HasRows) - throw new ProviderException(Properties.Resources.UnableToUpdateFailureCount); - - reader.Read(); - if (failureType == "Password") - { - failureCount = reader.GetInt32(0); - windowStart = reader.GetDateTime(1); - } - if (failureType == "PasswordAnswer") - { - failureCount = reader.GetInt32(2); - windowStart = reader.GetDateTime(3); - } - } - - DateTime windowEnd = windowStart.AddMinutes(PasswordAttemptWindow); - if (failureCount == 0 || DateTime.Now > windowEnd) - { - if (failureType == "Password") - { - cmd.CommandText = - @"UPDATE my_aspnet_membership - SET FailedPasswordAttemptCount = @count, - FailedPasswordAttemptWindowStart = @windowStart - WHERE userId=@userId"; - } - if (failureType == "PasswordAnswer") - { - cmd.CommandText = - @"UPDATE my_aspnet_membership - SET FailedPasswordAnswerAttemptCount = @count, - FailedPasswordAnswerAttemptWindowStart = @windowStart - WHERE userId = @userId"; - } - cmd.Parameters.Clear(); - cmd.Parameters.AddWithValue("@count", 1); - cmd.Parameters.AddWithValue("@windowStart", DateTime.Now); - cmd.Parameters.AddWithValue("@userId", userId); - if (cmd.ExecuteNonQuery() < 0) - throw new ProviderException(Properties.Resources.UnableToUpdateFailureCount); - } - else - { - failureCount += 1; - if (failureCount >= MaxInvalidPasswordAttempts) - { - cmd.CommandText = - @"UPDATE my_aspnet_membership SET IsLockedOut = @isLockedOut, - LastLockedOutDate = @lastLockedOutDate WHERE userId=@userId"; - cmd.Parameters.Clear(); - cmd.Parameters.AddWithValue("@isLockedOut", true); - cmd.Parameters.AddWithValue("@lastLockedOutDate", DateTime.Now); - cmd.Parameters.AddWithValue("@userId", userId); - if (cmd.ExecuteNonQuery() < 0) - throw new ProviderException(Properties.Resources.UnableToLockOutUser); - } - else - { - if (failureType == "Password") - { - cmd.CommandText = - @"UPDATE my_aspnet_membership - SET FailedPasswordAttemptCount = @count WHERE userId=@userId"; - } - if (failureType == "PasswordAnswer") - { - cmd.CommandText = - @"UPDATE my_aspnet_membership - SET FailedPasswordAnswerAttemptCount = @count - WHERE userId=@userId"; - } - cmd.Parameters.Clear(); - cmd.Parameters.AddWithValue("@count", failureCount); - cmd.Parameters.AddWithValue("@userId", userId); - if (cmd.ExecuteNonQuery() < 0) - throw new ProviderException("Unable to update failure count."); - } - } - } - catch (MySqlException e) - { - if (WriteExceptionsToEventLog) - WriteToEventLog(e, "UpdateFailureCount"); - throw new ProviderException(exceptionMessage, e); - } - } - - private bool CheckPassword(string password, string dbpassword, - string passwordKey, MembershipPasswordFormat format) - { - password = EncodePassword(password, passwordKey, format); - return password == dbpassword; - } - - private void GetPasswordInfo(MySqlConnection connection, int userId, - out string passwordKey, out MembershipPasswordFormat passwordFormat) - { - MySqlCommand cmd = new MySqlCommand( - @"SELECT PasswordKey, PasswordFormat FROM my_aspnet_membership WHERE - userId=@userId", connection); - cmd.Parameters.AddWithValue("@userId", userId); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - passwordKey = reader.GetString(reader.GetOrdinal("PasswordKey")); - passwordFormat = (MembershipPasswordFormat)reader.GetByte( - reader.GetOrdinal("PasswordFormat")); - } - } - - private MembershipUserCollection GetUsers(string username, string email, - int pageIndex, int pageSize, out int totalRecords) - { - MembershipUserCollection users = new MembershipUserCollection(); - try - { - using (MySqlConnection connection = new MySqlConnection(connectionString)) - { - connection.Open(); - MySqlCommand cmd = new MySqlCommand(); - cmd.Connection = connection; - - string sql = @"SELECT SQL_CALC_FOUND_ROWS u.name,m.* FROM my_aspnet_users u - JOIN my_aspnet_membership m ON m.userId=u.id - WHERE u.applicationId=@appId"; - - if (username != null) - { - sql += " AND u.name LIKE @name"; - cmd.Parameters.AddWithValue("@name", username); - } - else if (email != null) - { - sql += " AND m.Email LIKE @email"; - cmd.Parameters.AddWithValue("@email", email); - } - sql += " ORDER BY u.id ASC LIMIT {0},{1}"; - cmd.CommandText = String.Format(sql, pageIndex * pageSize, pageSize); - cmd.Parameters.AddWithValue("@appId", app.FetchId(connection)); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - while (reader.Read()) - users.Add(GetUserFromReader(reader)); - } - cmd.CommandText = "SELECT FOUND_ROWS()"; - cmd.Parameters.Clear(); - totalRecords = Convert.ToInt32(cmd.ExecuteScalar()); - } - return users; - } - catch (MySqlException e) - { - if (WriteExceptionsToEventLog) - WriteToEventLog(e, "GetUsers"); - throw new ProviderException(exceptionMessage); - } - } - - private void ValidateQA(string question, string answer) - { - if (RequiresQuestionAndAnswer && String.IsNullOrEmpty(question)) - throw new ArgumentException(Properties.Resources.PasswordQuestionInvalid); - if (RequiresQuestionAndAnswer && String.IsNullOrEmpty(answer)) - throw new ArgumentException(Properties.Resources.PasswordAnswerInvalid); - } - - private bool ValidatePassword(string password, string argumentName, bool throwExceptions) - { - string exceptionString = null; - object correctValue = MinRequiredPasswordLength; - - if (password.Length < MinRequiredPasswordLength) - exceptionString = Properties.Resources.PasswordNotLongEnough; - else - { - int count = 0; - foreach (char c in password) - if (!char.IsLetterOrDigit(c)) - count++; - if (count < MinRequiredNonAlphanumericCharacters) - exceptionString = Properties.Resources.NotEnoughNonAlphaNumericInPwd; - correctValue = MinRequiredNonAlphanumericCharacters; - } - - if (exceptionString != null) - { - if (throwExceptions) - throw new ArgumentException( - string.Format(exceptionString, argumentName, correctValue), - argumentName); - else - return false; - } - - if (PasswordStrengthRegularExpression.Length > 0) - if (!Regex.IsMatch(password, PasswordStrengthRegularExpression)) - return false; - - return true; - } - - private void TrimParametersValues(ref string username, ref string password, ref string email, ref string passwordQuestion, ref string passwordAnswer) - { - username = string.IsNullOrEmpty(username) ? username : username.Trim(); - password = string.IsNullOrEmpty(password) ? password : password.Trim(); - email = string.IsNullOrEmpty(email) ? email : email.Trim(); - passwordQuestion = string.IsNullOrEmpty(passwordQuestion) ? passwordQuestion : passwordQuestion.Trim(); - passwordAnswer = string.IsNullOrEmpty(passwordAnswer) ? passwordAnswer : passwordAnswer.Trim(); - } - - #endregion - } -} +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +// This code was contributed by Sean Wright (srwright@alcor.concordia.ca) on 2007-01-12 +// The copyright was assigned and transferred under the terms of +// the MySQL Contributor License Agreement (CLA) + +using MySql.Data.MySqlClient; +using MySql.Web.Common; +using MySql.Web.General; +using MySql.Web.Profile; +using System; +using System.Collections.Specialized; +using System.Configuration.Provider; +using System.Data; +using System.Diagnostics; +using System.Security.Cryptography; +using System.Text; +using System.Text.RegularExpressions; +using System.Web.Hosting; +using System.Web.Security; + +namespace MySql.Web.Security +{ + /// + /// Manages storage of membership information for an ASP.NET application in a MySQL database. + /// + /// + /// + /// This class is used by the and classes + /// to provide membership services for ASP.NET applications using a MySQL database. + /// + /// + /// + /// + /// configuration> + /// connectionStrings> + /// add name = "LocalMySqlService" connectionString="server=localhost;user id=myuser;password=mypass;database=test" /> + /// /connectionStrings> + /// system.web> + /// authentication mode = "Forms" > + /// forms loginUrl="login.aspx" name=".ASPXFORMSAUTH" /> + /// /authentication> + /// authorization> + /// deny users = "?" /> + /// /authorization> + /// membership defaultProvider="MySQLProvider" userIsOnlineTimeWindow="15"> + /// providers> + /// add + /// name = "MySQLProvider" + /// type="MySql.Web.Security.MySQLMembershipProvider" + /// connectionStringName="LocalMySqlService" + /// applicationName="MyApplication" + /// enablePasswordRetrieval="false" + /// enablePasswordReset="true" + /// requiresQuestionAndAnswer="true" + /// requiresUniqueEmail="false" + /// passwordFormat="Hashed" + /// maxInvalidPasswordAttempts="5" + /// passwordAttemptWindow="10" /> + /// /providers> + /// /membership> + /// /system.web> + /// /configuration> + /// + /// + public sealed class MySQLMembershipProvider : MembershipProvider + { + private int newPasswordLength = 8; + private string eventSource = "MySQLMembershipProvider"; + private string eventLog = "Application"; + private string exceptionMessage = "An exception occurred. Please check the Event Log."; + private string connectionString; + private int minRequiredPasswordLength; + private bool writeExceptionsToEventLog; + private bool enablePasswordReset; + private bool enablePasswordRetrieval; + private bool requiresQuestionAndAnswer; + private bool requiresUniqueEmail; + private int maxInvalidPasswordAttempts; + private int passwordAttemptWindow; + private MembershipPasswordFormat passwordFormat; + private int minRequiredNonAlphanumericCharacters; + private string passwordStrengthRegularExpression; + private Application app; + + /// + /// Initializes the MySQL membership provider with the property values specified in the + /// ASP.NET application's configuration file. This method is not intended to be used directly + /// from your code. + /// + /// The name of the instance to initialize. + /// A collection of the name/value pairs representing the + /// provider-specific attributes specified in the configuration for this provider. + /// config is a null reference. + /// An attempt is made to call on a provider after the provider has already been initialized. + /// + public override void Initialize(string name, NameValueCollection config) + { + if (config == null) + { + throw new ArgumentNullException("config"); + } + if (name == null || name.Length == 0) + { + name = "MySQLMembershipProvider"; + } + if (string.IsNullOrEmpty(config["description"])) + { + config.Remove("description"); + config.Add("description", "MySQL default application"); + } + base.Initialize(name, config); + + string applicationName = GetConfigValue(config["applicationName"], + HostingEnvironment.ApplicationVirtualPath); + maxInvalidPasswordAttempts = Convert.ToInt32(GetConfigValue(config["maxInvalidPasswordAttempts"], "5")); + passwordAttemptWindow = Convert.ToInt32(GetConfigValue(config["passwordAttemptWindow"], "10")); + minRequiredNonAlphanumericCharacters = + Convert.ToInt32(GetConfigValue(config["minRequiredNonalphanumericCharacters"], "1")); + minRequiredPasswordLength = Convert.ToInt32(GetConfigValue(config["minRequiredPasswordLength"], "7")); + passwordStrengthRegularExpression = + Convert.ToString(GetConfigValue(config["passwordStrengthRegularExpression"], "")); + enablePasswordReset = Convert.ToBoolean(GetConfigValue(config["enablePasswordReset"], "True")); + enablePasswordRetrieval = Convert.ToBoolean( + GetConfigValue(config["enablePasswordRetrieval"], "False")); + requiresQuestionAndAnswer = Convert.ToBoolean(GetConfigValue(config["requiresQuestionAndAnswer"], "False")); + requiresUniqueEmail = Convert.ToBoolean(GetConfigValue(config["requiresUniqueEmail"], "True")); + writeExceptionsToEventLog = Convert.ToBoolean(GetConfigValue(config["writeExceptionsToEventLog"], "True")); + string temp_format = config["passwordFormat"]; + + if (temp_format == null) + temp_format = "hashed"; + else + temp_format = temp_format.ToLowerInvariant(); + + if (temp_format == "hashed") + passwordFormat = MembershipPasswordFormat.Hashed; + else if (temp_format == "encrypted") + passwordFormat = MembershipPasswordFormat.Encrypted; + else if (temp_format == "clear") + passwordFormat = MembershipPasswordFormat.Clear; + else + throw new ProviderException("Password format not supported."); + + // if the user is asking for the ability to retrieve hashed passwords, then let + // them know we can't + if (PasswordFormat == MembershipPasswordFormat.Hashed) + { + if (EnablePasswordRetrieval) + throw new ProviderException(Properties.Resources.CannotRetrieveHashedPasswords); + } + + connectionString = ConfigUtility.GetConnectionString(config); + if (String.IsNullOrEmpty(connectionString)) return; + + // make sure we have the correct schema + SchemaManager.CheckSchema(connectionString, config); + + app = new Application(applicationName, base.Description); + } + + private static string GetConfigValue(string configValue, string defaultValue) + { + if (string.IsNullOrEmpty(configValue)) + { + return defaultValue; + } + return configValue; + } + + #region Properties + + /// + /// The name of the application using the MySQL membership provider. + /// + /// The name of the application using the MySQL membership provider. The default is the + /// application virtual path. + /// The ApplicationName is used by the MySqlMembershipProvider to separate + /// membership information for multiple applications. Using different application names, + /// applications can use the same membership database. + /// Likewise, multiple applications can make use of the same membership data by simply using + /// the same application name. + /// Caution should be taken with multiple applications as the ApplicationName property is not + /// thread safe during writes. + /// + /// + /// The following example shows the membership element being used in an applications web.config file. + /// The application name setting is being used. + /// + /// membership defaultProvider="MySQLMembershipProvider"> + /// providers> + /// add name="MySqlMembershipProvider" + /// type="MySql.Web.Security.MySQLMembershipProvider" + /// connectionStringName="LocalMySqlServer" + /// enablePasswordRetrieval="true" + /// enablePasswordReset="false" + /// requiresQuestionAndAnswer="true" + /// requiresUniqueEmail="false" + /// passwordFormat="Encrypted" + /// maxInvalidPasswordAttempts="3" + /// passwordAttemptWindow="20" + /// minRequiredNonAlphanumericCharacters="1" + /// minRequiredPasswordLength="11" + /// applicationName="MyApplication" /> + /// /providers> + /// /membership> + /// + /// + public override string ApplicationName + { + get { return app.Name; } + set + { + lock (this) + { + if (value.ToLowerInvariant() == app.Name.ToLowerInvariant()) return; + app = new Application(value, String.Empty); + } + } + } + + /// + /// Indicates whether the membership provider is configured to allow users to reset their passwords. + /// + /// true if the membership provider supports password reset; otherwise, false. The default is true. + /// Allows the user to replace their password with a new, randomly generated password. + /// This can be especially handy when using hashed passwords since hashed passwords cannot be + /// retrieved. + /// + /// The following example shows the membership element being used in an applications web.config file. + /// + /// membership defaultProvider="MySQLMembershipProvider"> + /// providers> + /// add name="MySqlMembershipProvider" + /// type="MySql.Web.Security.MySQLMembershipProvider" + /// connectionStringName="LocalMySqlServer" + /// enablePasswordRetrieval="true" + /// enablePasswordReset="false" + /// requiresQuestionAndAnswer="true" + /// requiresUniqueEmail="false" + /// passwordFormat="Encrypted" + /// maxInvalidPasswordAttempts="3" + /// passwordAttemptWindow="20" + /// minRequiredNonAlphanumericCharacters="1" + /// minRequiredPasswordLength="11" + /// applicationName="MyApplication" /> + /// /providers> + /// /membership> + /// + /// + public override bool EnablePasswordReset + { + get { return enablePasswordReset; } + } + + /// + /// Indicates whether the membership provider is configured to allow users to retrieve + /// their passwords. + /// + /// true if the membership provider is configured to support password retrieval; + /// otherwise, false. The default is false. + /// If the system is configured to use hashed passwords, then retrieval is not possible. + /// If the user attempts to initialize the provider with hashed passwords and enable password retrieval + /// set to true then a is thrown. + /// + /// The following example shows the membership element being used in an applications web.config file. + /// + /// membership defaultProvider="MySQLMembershipProvider"> + /// providers> + /// add name="MySqlMembershipProvider" + /// type="MySql.Web.Security.MySQLMembershipProvider" + /// connectionStringName="LocalMySqlServer" + /// enablePasswordRetrieval="true" + /// enablePasswordReset="false" + /// requiresQuestionAndAnswer="true" + /// requiresUniqueEmail="false" + /// passwordFormat="Encrypted" + /// maxInvalidPasswordAttempts="3" + /// passwordAttemptWindow="20" + /// minRequiredNonAlphanumericCharacters="1" + /// minRequiredPasswordLength="11" + /// applicationName="MyApplication" /> + /// /providers> + /// /membership> + /// + /// + public override bool EnablePasswordRetrieval + { + get { return enablePasswordRetrieval; } + } + + /// + /// Gets a value indicating whether the membership provider is + /// configured to require the user to answer a password question + /// for password reset and retrieval. + /// + /// true if a password answer is required for password + /// reset and retrieval; otherwise, false. The default is false. + /// + /// The following example shows the membership element being used in an applications web.config file. + /// + /// membership defaultProvider="MySQLMembershipProvider"> + /// providers> + /// add name="MySqlMembershipProvider" + /// type="MySql.Web.Security.MySQLMembershipProvider" + /// connectionStringName="LocalMySqlServer" + /// enablePasswordRetrieval="true" + /// enablePasswordReset="false" + /// requiresQuestionAndAnswer="true" + /// requiresUniqueEmail="false" + /// passwordFormat="Encrypted" + /// maxInvalidPasswordAttempts="3" + /// passwordAttemptWindow="20" + /// minRequiredNonAlphanumericCharacters="1" + /// minRequiredPasswordLength="11" + /// applicationName="MyApplication" /> + /// /providers> + /// /membership> + /// + /// + public override bool RequiresQuestionAndAnswer + { + get { return requiresQuestionAndAnswer; } + } + + /// + /// Gets a value indicating whether the membership provider is configured + /// to require a unique e-mail address for each user name. + /// + /// true if the membership provider requires a unique e-mail address; + /// otherwise, false. The default is true. + /// + /// The following example shows the membership element being used in an applications web.config file. + /// + /// membership defaultProvider="MySQLMembershipProvider"> + /// providers> + /// add name="MySqlMembershipProvider" + /// type="MySql.Web.Security.MySQLMembershipProvider" + /// connectionStringName="LocalMySqlServer" + /// enablePasswordRetrieval="true" + /// enablePasswordReset="false" + /// requiresQuestionAndAnswer="true" + /// requiresUniqueEmail="false" + /// passwordFormat="Encrypted" + /// maxInvalidPasswordAttempts="3" + /// passwordAttemptWindow="20" + /// minRequiredNonAlphanumericCharacters="1" + /// minRequiredPasswordLength="11" + /// applicationName="MyApplication" /> + /// /providers> + /// /membership> + /// + /// + public override bool RequiresUniqueEmail + { + get { return requiresUniqueEmail; } + } + + /// + /// Gets the number of invalid password or password-answer attempts allowed + /// before the membership user is locked out. + /// + /// The number of invalid password or password-answer attempts allowed + /// before the membership user is locked out. + /// + /// The following example shows the membership element being used in an applications web.config file. + /// + /// membership defaultProvider="MySQLMembershipProvider"> + /// providers> + /// add name="MySqlMembershipProvider" + /// type="MySql.Web.Security.MySQLMembershipProvider" + /// connectionStringName="LocalMySqlServer" + /// enablePasswordRetrieval="true" + /// enablePasswordReset="false" + /// requiresQuestionAndAnswer="true" + /// requiresUniqueEmail="false" + /// passwordFormat="Encrypted" + /// maxInvalidPasswordAttempts="3" + /// passwordAttemptWindow="20" + /// minRequiredNonAlphanumericCharacters="1" + /// minRequiredPasswordLength="11" + /// applicationName="MyApplication" /> + /// /providers> + /// /membership> + /// + /// + public override int MaxInvalidPasswordAttempts + { + get { return maxInvalidPasswordAttempts; } + } + + /// + /// Gets the number of minutes in which a maximum number of invalid password or + /// password-answer attempts are allowed before the membership user is locked out. + /// + /// The number of minutes in which a maximum number of invalid password or + /// password-answer attempts are allowed before the membership user is locked out. + /// + /// The following example shows the membership element being used in an applications web.config file. + /// + /// membership defaultProvider="MySQLMembershipProvider"> + /// providers> + /// add name="MySqlMembershipProvider" + /// type="MySql.Web.Security.MySQLMembershipProvider" + /// connectionStringName="LocalMySqlServer" + /// enablePasswordRetrieval="true" + /// enablePasswordReset="false" + /// requiresQuestionAndAnswer="true" + /// requiresUniqueEmail="false" + /// passwordFormat="Encrypted" + /// maxInvalidPasswordAttempts="3" + /// passwordAttemptWindow="20" + /// minRequiredNonAlphanumericCharacters="1" + /// minRequiredPasswordLength="11" + /// applicationName="MyApplication" /> + /// /providers> + /// /membership> + /// + /// + public override int PasswordAttemptWindow + { + get { return passwordAttemptWindow; } + } + + /// + /// Gets a value indicating the format for storing passwords in the membership data store. + /// + /// One of the + /// values indicating the format for storing passwords in the data store. + /// + /// The following example shows the membership element being used in an applications web.config file. + /// + /// membership defaultProvider="MySQLMembershipProvider"> + /// providers> + /// add name="MySqlMembershipProvider" + /// type="MySql.Web.Security.MySQLMembershipProvider" + /// connectionStringName="LocalMySqlServer" + /// enablePasswordRetrieval="true" + /// enablePasswordReset="false" + /// requiresQuestionAndAnswer="true" + /// requiresUniqueEmail="false" + /// passwordFormat="Encrypted" + /// maxInvalidPasswordAttempts="3" + /// passwordAttemptWindow="20" + /// minRequiredNonAlphanumericCharacters="1" + /// minRequiredPasswordLength="11" + /// applicationName="MyApplication" /> + /// /providers> + /// /membership> + /// + /// + public override MembershipPasswordFormat PasswordFormat + { + get { return passwordFormat; } + } + + /// + /// Gets the minimum number of special characters that must be present in a valid password. + /// + /// The minimum number of special characters that must be present + /// in a valid password. + /// + /// The following example shows the membership element being used in an applications web.config file. + /// + /// membership defaultProvider="MySQLMembershipProvider"> + /// providers> + /// add name="MySqlMembershipProvider" + /// type="MySql.Web.Security.MySQLMembershipProvider" + /// connectionStringName="LocalMySqlServer" + /// enablePasswordRetrieval="true" + /// enablePasswordReset="false" + /// requiresQuestionAndAnswer="true" + /// requiresUniqueEmail="false" + /// passwordFormat="Encrypted" + /// maxInvalidPasswordAttempts="3" + /// passwordAttemptWindow="20" + /// minRequiredNonAlphanumericCharacters="1" + /// minRequiredPasswordLength="11" + /// applicationName="MyApplication" /> + /// /providers> + /// /membership> + /// + /// + public override int MinRequiredNonAlphanumericCharacters + { + get { return minRequiredNonAlphanumericCharacters; } + } + + /// + /// Gets the minimum length required for a password. + /// + /// The minimum length required for a password. + /// + /// The following example shows the membership element being used in an applications web.config file. + /// + /// membership defaultProvider="MySQLMembershipProvider"> + /// providers> + /// add name="MySqlMembershipProvider" + /// type="MySql.Web.Security.MySQLMembershipProvider" + /// connectionStringName="LocalMySqlServer" + /// enablePasswordRetrieval="true" + /// enablePasswordReset="false" + /// requiresQuestionAndAnswer="true" + /// requiresUniqueEmail="false" + /// passwordFormat="Encrypted" + /// maxInvalidPasswordAttempts="3" + /// passwordAttemptWindow="20" + /// minRequiredNonAlphanumericCharacters="1" + /// minRequiredPasswordLength="11" + /// applicationName="MyApplication" /> + /// /providers> + /// /membership> + /// + /// + public override int MinRequiredPasswordLength + { + get { return minRequiredPasswordLength; } + } + + /// + /// Gets the regular expression used to evaluate a password. + /// + /// A regular expression used to evaluate a password. + /// + /// The following example shows the membership element being used in an applications web.config file. + /// In this example, the regular expression specifies that the password must meet the following + /// criteria: + /// * Is at least seven characters. + /// * Contains at least one digit. + /// * Contains at least one special (non-alphanumeric) character. + /// + /// membership defaultProvider="MySQLMembershipProvider"> + /// providers> + /// add name="MySqlMembershipProvider" + /// type="MySql.Web.Security.MySQLMembershipProvider" + /// connectionStringName="LocalMySqlServer" + /// enablePasswordRetrieval="true" + /// enablePasswordReset="false" + /// requiresQuestionAndAnswer="true" + /// requiresUniqueEmail="false" + /// passwordFormat="Encrypted" + /// maxInvalidPasswordAttempts="3" + /// passwordAttemptWindow="20" + /// minRequiredNonAlphanumericCharacters="1" + /// minRequiredPasswordLength="11" + /// applicationName="MyApplication" /> + /// /providers> + /// /membership> + /// + /// + public override string PasswordStrengthRegularExpression + { + get { return passwordStrengthRegularExpression; } + } + + /// + /// Gets or sets a value indicating whether exceptions are written to the event log. + /// + /// + /// true if exceptions should be written to the log; otherwise, false. + /// + public bool WriteExceptionsToEventLog + { + get { return writeExceptionsToEventLog; } + set { writeExceptionsToEventLog = value; } + } + + #endregion + + #region Public Methods + + /// + /// Changes the password. + /// + /// The username. + /// The old password. + /// The new password. + /// true if the password was updated successfully; false if the supplied old password + /// is invalid, the user is locked out, or the user does not exist in the database. + public override bool ChangePassword(string username, string oldPassword, string newPassword) + { + // this will return false if the username doesn't exist + if (!(ValidateUser(username, oldPassword))) + return false; + + ValidatePasswordEventArgs args = new ValidatePasswordEventArgs(username, newPassword, true); + OnValidatingPassword(args); + if (args.Cancel) + { + if (!(args.FailureInformation == null)) + throw args.FailureInformation; + else + throw new ProviderException(Properties.Resources.ChangePasswordCanceled); + } + + // validate the password according to current guidelines + if (!ValidatePassword(newPassword, "newPassword", true)) + return false; + + try + { + using (MySqlConnection connection = new MySqlConnection(connectionString)) + { + connection.Open(); + + // retrieve the existing key and format for this user + string passwordKey; + MembershipPasswordFormat passwordFormat; + int userId = GetUserId(connection, username); + + GetPasswordInfo(connection, userId, out passwordKey, out passwordFormat); + + MySqlCommand cmd = new MySqlCommand( + @"UPDATE my_aspnet_membership + SET Password = @pass, LastPasswordChangedDate = @lastPasswordChangedDate + WHERE userId=@userId", connection); + cmd.Parameters.AddWithValue("@pass", + EncodePassword(newPassword, passwordKey, passwordFormat)); + cmd.Parameters.AddWithValue("@lastPasswordChangedDate", DateTime.Now); + cmd.Parameters.AddWithValue("@userId", userId); + return cmd.ExecuteNonQuery() > 0; + } + } + catch (MySqlException e) + { + if (WriteExceptionsToEventLog) + WriteToEventLog(e, "ChangePassword"); + throw new ProviderException(exceptionMessage, e); + } + } + + /// + /// Changes the password question and answer. + /// + /// The user name. + /// The password. + /// The new password question. + /// The new password answer. + /// true if the update was successful; otherwise, false. A value of false is + /// also returned if the password is incorrect, the user is locked out, or the user + /// does not exist in the database. + public override bool ChangePasswordQuestionAndAnswer(string username, + string password, string newPwdQuestion, string newPwdAnswer) + { + // this handles the case where the username doesn't exist + if (!(ValidateUser(username, password))) + return false; + + try + { + using (MySqlConnection connection = new MySqlConnection(connectionString)) + { + connection.Open(); + + string passwordKey; + MembershipPasswordFormat passwordFormat; + int userId = GetUserId(connection, username); + + GetPasswordInfo(connection, userId, out passwordKey, out passwordFormat); + + + MySqlCommand cmd = new MySqlCommand( + @"UPDATE my_aspnet_membership + SET PasswordQuestion = @passwordQuestion, PasswordAnswer = @passwordAnswer + WHERE userId=@userId", connection); + cmd.Parameters.AddWithValue("@passwordQuestion", newPwdQuestion); + cmd.Parameters.AddWithValue("@passwordAnswer", + EncodePassword(newPwdAnswer, passwordKey, passwordFormat)); + cmd.Parameters.AddWithValue("@userId", userId); + return cmd.ExecuteNonQuery() > 0; + } + } + catch (MySqlException e) + { + if (WriteExceptionsToEventLog) + WriteToEventLog(e, "ChangePasswordQuestionAndAnswer"); + throw new ProviderException(exceptionMessage, e); + } + } + + /// + /// Adds a new membership user to the data source. + /// + /// The user name for the new user. + /// The password for the new user. + /// The e-mail address for the new user. + /// The password question for the new user. + /// The password answer for the new user + /// Whether or not the new user is approved to be validated. + /// The unique identifier from the membership data source for the user. + /// A enumeration value indicating whether the user was created successfully. + /// + /// A object populated with the information for the newly created user. + /// + public override MembershipUser CreateUser(string username, string password, + string email, string passwordQuestion, string passwordAnswer, + bool isApproved, object providerUserKey, out MembershipCreateStatus status) + { + //basis on MSDN documentation we should trim all the paramater values: http://msdn.microsoft.com/en-us/library/d8t4h2es%28v=vs.110%29.aspx + TrimParametersValues(ref username, ref password, ref email, ref passwordQuestion, ref passwordAnswer); + + ValidatePasswordEventArgs Args = new ValidatePasswordEventArgs(username, password, true); + OnValidatingPassword(Args); + if (Args.Cancel) + { + status = MembershipCreateStatus.InvalidPassword; + return null; + } + if (RequiresUniqueEmail && !String.IsNullOrEmpty(GetUserNameByEmail(email))) + { + status = MembershipCreateStatus.DuplicateEmail; + return null; + } + + ValidateQA(passwordQuestion, passwordAnswer); + + // now try to validate the password + if (!ValidatePassword(password, "password", false)) + { + status = MembershipCreateStatus.InvalidPassword; + return null; + } + + // now check to see if we already have a member by this name + MembershipUser u = GetUser(username, false); + if (u != null) + { + status = MembershipCreateStatus.DuplicateUserName; + return null; + } + + string passwordKey = GetPasswordKey(); + DateTime createDate = DateTime.Now; + MySqlTransaction transaction = null; + + using (MySqlConnection connection = new MySqlConnection(connectionString)) + { + try + { + connection.Open(); + transaction = connection.BeginTransaction(); + + // either create a new user or fetch the existing user id + long userId = SchemaManager.CreateOrFetchUserId(connection, username, + app.EnsureId(connection), true); + + MySqlCommand cmd = new MySqlCommand( + @"INSERT INTO my_aspnet_membership + VALUES(@userId, @email, @comment, @password, @passwordKey, + @passwordFormat, @passwordQuestion, @passwordAnswer, + @isApproved, @lastActivityDate, @lastLoginDate, + @lastPasswordChangedDate, @creationDate, + @isLockedOut, @lastLockedOutDate, @failedPasswordAttemptCount, + @failedPasswordAttemptWindowStart, @failedPasswordAnswerAttemptCount, + @failedPasswordAnswerAttemptWindowStart)", + connection); + cmd.Parameters.AddWithValue("@userId", userId); + cmd.Parameters.AddWithValue("@email", email); + cmd.Parameters.AddWithValue("@comment", ""); + cmd.Parameters.AddWithValue("@password", + EncodePassword(password, passwordKey, PasswordFormat)); + cmd.Parameters.AddWithValue("@passwordKey", passwordKey); + cmd.Parameters.AddWithValue("@passwordFormat", PasswordFormat); + cmd.Parameters.AddWithValue("@passwordQuestion", passwordQuestion); + cmd.Parameters.AddWithValue("@passwordAnswer", + EncodePassword(passwordAnswer, passwordKey, PasswordFormat)); + cmd.Parameters.AddWithValue("@isApproved", isApproved); + cmd.Parameters.AddWithValue("@lastActivityDate", createDate); + cmd.Parameters.AddWithValue("@lastLoginDate", createDate); + cmd.Parameters.AddWithValue("@lastPasswordChangedDate", createDate); + cmd.Parameters.AddWithValue("@creationDate", createDate); + cmd.Parameters.AddWithValue("@isLockedOut", false); + cmd.Parameters.AddWithValue("@lastLockedOutDate", createDate); + cmd.Parameters.AddWithValue("@failedPasswordAttemptCount", 0); + cmd.Parameters.AddWithValue("@failedPasswordAttemptWindowStart", createDate); + cmd.Parameters.AddWithValue("@failedPasswordAnswerAttemptCount", 0); + cmd.Parameters.AddWithValue("@failedPasswordAnswerAttemptWindowStart", createDate); + + int recAdded = cmd.ExecuteNonQuery(); + if (recAdded > 0) + status = MembershipCreateStatus.Success; + else + status = MembershipCreateStatus.UserRejected; + transaction.Commit(); + } + catch (MySqlException e) + { + if (WriteExceptionsToEventLog) + WriteToEventLog(e, "CreateUser"); + status = MembershipCreateStatus.ProviderError; + if (transaction != null) + transaction.Rollback(); + return null; + } + } + + return GetUser(username, false); + } + + /// + /// Removes a user from the membership data source. + /// + /// The name of the user to delete. + /// true to delete data related to the user from the database; false to leave data related to the user in the database. + /// + /// true if the user was successfully deleted; otherwise, false. + /// + public override bool DeleteUser(string username, bool deleteAllRelatedData) + { + try + { + using (MySqlConnection conn = new MySqlConnection(connectionString)) + { + conn.Open(); + + int userId = GetUserId(conn, username); + if (-1 == userId) return false; + + // if we are supposed to delete all related data, then delegate that to those providers + if (deleteAllRelatedData) + { + MySQLRoleProvider.DeleteUserData(conn, userId); + MySQLProfileProvider.DeleteUserData(conn, userId); + } + + string sql = @"DELETE {0}m + FROM my_aspnet_users u, my_aspnet_membership m + WHERE u.id=m.userId AND u.id=@userId"; + + MySqlCommand cmd = new MySqlCommand( + String.Format(sql, deleteAllRelatedData ? "u," : ""), conn); + cmd.Parameters.AddWithValue("@appId", app.FetchId(conn)); + cmd.Parameters.AddWithValue("@userId", userId); + return cmd.ExecuteNonQuery() > 0; + } + } + catch (MySqlException e) + { + if (WriteExceptionsToEventLog) + WriteToEventLog(e, "DeleteUser"); + throw new ProviderException(exceptionMessage, e); + } + } + + /// + /// Gets a collection of all the users in the data source in pages of data. + /// + /// The index of the page of results to return. is zero-based. + /// The size of the page of results to return. + /// The total number of matched users. + /// + /// A collection that contains a page of objects beginning at the page specified by . + /// + public override MembershipUserCollection GetAllUsers(int pageIndex, + int pageSize, out int totalRecords) + { + return GetUsers(null, null, pageIndex, pageSize, out totalRecords); + } + + /// + /// Gets the number of users currently accessing the application. + /// + /// + /// The number of users currently accessing the application. + /// + public override int GetNumberOfUsersOnline() + { + TimeSpan onlineSpan = new TimeSpan(0, Membership.UserIsOnlineTimeWindow, 0); + DateTime compareTime = DateTime.Now.Subtract(onlineSpan); + + try + { + using (MySqlConnection connection = new MySqlConnection(connectionString)) + { + connection.Open(); + MySqlCommand cmd = new MySqlCommand( + @"SELECT COUNT(*) FROM my_aspnet_membership m JOIN my_aspnet_users u + ON m.userId=u.id WHERE m.LastActivityDate > @date AND u.applicationId=@appId", + connection); + cmd.Parameters.AddWithValue("@date", compareTime); + cmd.Parameters.AddWithValue("@appId", app.FetchId(connection)); + return Convert.ToInt32(cmd.ExecuteScalar()); + } + } + catch (MySqlException e) + { + if (WriteExceptionsToEventLog) + WriteToEventLog(e, "GetNumberOfUsersOnline"); + throw new ProviderException(exceptionMessage, e); + } + } + + /// + /// Gets the password for the specified user name from the data source. + /// + /// The user to retrieve the password for. + /// The password answer for the user. + /// + /// The password for the specified user name. + /// + public override string GetPassword(string username, string answer) + { + if (!EnablePasswordRetrieval) + throw new ProviderException(Properties.Resources.PasswordRetrievalNotEnabled); + + try + { + using (MySqlConnection connection = new MySqlConnection(connectionString)) + { + connection.Open(); + + int userId = GetUserId(connection, username); + if (-1 == userId) + throw new ProviderException("Username not found."); + + string sql = @"SELECT Password, PasswordAnswer, PasswordKey, PasswordFormat, + IsLockedOut FROM my_aspnet_membership WHERE userId=@userId"; + MySqlCommand cmd = new MySqlCommand(sql, connection); + cmd.Parameters.AddWithValue("@userId", userId); + + using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) + { + reader.Read(); + if (reader.GetBoolean("IsLockedOut")) + throw new MembershipPasswordException(Properties.Resources.UserIsLockedOut); + + string password = reader.GetString("Password"); + string passwordAnswer = reader.GetValue(reader.GetOrdinal("PasswordAnswer")).ToString(); + string passwordKey = reader.GetString("PasswordKey"); + MembershipPasswordFormat format = (MembershipPasswordFormat)reader.GetInt32(3); + reader.Close(); + + if (RequiresQuestionAndAnswer && + !(CheckPassword(answer, passwordAnswer, passwordKey, format))) + { + UpdateFailureCount(userId, "PasswordAnswer", connection); + throw new MembershipPasswordException(Properties.Resources.IncorrectPasswordAnswer); + } + if (PasswordFormat == MembershipPasswordFormat.Encrypted) + { + password = UnEncodePassword(password, format); + } + return password; + } + } + } + catch (MySqlException e) + { + if (WriteExceptionsToEventLog) + WriteToEventLog(e, "GetPassword"); + throw new ProviderException(exceptionMessage, e); + } + } + + /// + /// Gets information from the data source for a user. Provides an option to update the last-activity date/time stamp for the user. + /// + /// The name of the user to get information for. + /// true to update the last-activity date/time stamp for the user; false to return user information without updating the last-activity date/time stamp for the user. + /// + /// A object populated with the specified user's information from the data source. + /// + public override MembershipUser GetUser(string username, bool userIsOnline) + { + try + { + int userId = -1; + using (MySqlConnection connection = new MySqlConnection(connectionString)) + { + connection.Open(); + + userId = GetUserId(connection, username); + if (-1 == userId) return null; + } + + return GetUser(userId, userIsOnline); + } + catch (MySqlException e) + { + if (WriteExceptionsToEventLog) + WriteToEventLog(e, "GetUser(String, Boolean)"); + throw new ProviderException(exceptionMessage, e); + } + } + + /// + /// Gets user information from the data source based on the unique identifier for the membership user. Provides an option to update the last-activity date/time stamp for the user. + /// + /// The unique identifier for the membership user to get information for. + /// true to update the last-activity date/time stamp for the user; false to return user information without updating the last-activity date/time stamp for the user. + /// + /// A object populated with the specified user's information from the data source. + /// + public override MembershipUser GetUser(object providerUserKey, bool userIsOnline) + { + MySqlTransaction txn = null; + + try + { + using (MySqlConnection connection = new MySqlConnection(connectionString)) + { + connection.Open(); + + txn = connection.BeginTransaction(); + MySqlCommand cmd = new MySqlCommand("", connection); + cmd.Parameters.AddWithValue("@userId", providerUserKey); + + if (userIsOnline) + { + cmd.CommandText = + @"UPDATE my_aspnet_users SET lastActivityDate = @date WHERE id=@userId"; + cmd.Parameters.AddWithValue("@date", DateTime.Now); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "UPDATE my_aspnet_membership SET LastActivityDate=@date WHERE userId=@userId"; + cmd.ExecuteNonQuery(); + } + + cmd.CommandText = @"SELECT m.*,u.name + FROM my_aspnet_membership m JOIN my_aspnet_users u ON m.userId=u.id + WHERE u.id=@userId"; + + MembershipUser user; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + if (!reader.Read()) return null; + user = GetUserFromReader(reader); + } + txn.Commit(); + return user; + } + } + catch (MySqlException e) + { + if (txn != null) + txn.Rollback(); + if (WriteExceptionsToEventLog) + WriteToEventLog(e, "GetUser(Object, Boolean)"); + throw new ProviderException(exceptionMessage); + } + } + + /// + /// Unlocks the user. + /// + /// The username. + /// true if the membership user was successfully unlocked; + /// otherwise, false. A value of false is also returned if the user + /// does not exist in the database. + public override bool UnlockUser(string username) + { + try + { + using (MySqlConnection conn = new MySqlConnection(connectionString)) + { + conn.Open(); + + int userId = GetUserId(conn, username); + if (-1 == userId) return false; + + string sql = @"UPDATE my_aspnet_membership + SET IsLockedOut = false, LastLockedOutDate = @lastDate + WHERE userId=@userId"; + + MySqlCommand cmd = new MySqlCommand(sql, conn); + cmd.Parameters.AddWithValue("@lastDate", DateTime.Now); + cmd.Parameters.AddWithValue("@userId", userId); + return cmd.ExecuteNonQuery() > 0; + } + } + catch (MySqlException e) + { + if (WriteExceptionsToEventLog) + WriteToEventLog(e, "UnlockUser"); + throw new ProviderException(exceptionMessage, e); + } + } + + /// + /// Gets the user name associated with the specified e-mail address. + /// + /// The e-mail address to search for. + /// + /// The user name associated with the specified e-mail address. If no match is found, return null. + /// + public override string GetUserNameByEmail(string email) + { + try + { + using (MySqlConnection conn = new MySqlConnection(connectionString)) + { + conn.Open(); + + string sql = @"SELECT u.name FROM my_aspnet_users u + JOIN my_aspnet_membership m ON m.userid=u.id + WHERE m.Email = @email AND u.applicationId=@appId"; + MySqlCommand cmd = new MySqlCommand(sql, conn); + cmd.Parameters.AddWithValue("@email", email); + cmd.Parameters.AddWithValue("@appId", app.FetchId(conn)); + return (string)cmd.ExecuteScalar(); + } + } + catch (MySqlException e) + { + if (WriteExceptionsToEventLog) + WriteToEventLog(e, "GetUserNameByEmail"); + throw new ProviderException(exceptionMessage); + } + } + + /// + /// Resets a user's password to a new, automatically generated password. + /// + /// The user to reset the password for. + /// The password answer for the specified user. + /// The new password for the specified user. + public override string ResetPassword(string username, string answer) + { + if (!(EnablePasswordReset)) + throw new NotSupportedException(Properties.Resources.PasswordResetNotEnabled); + + try + { + using (MySqlConnection connection = new MySqlConnection(connectionString)) + { + connection.Open(); + + // fetch the userid first + int userId = GetUserId(connection, username); + if (-1 == userId) + throw new ProviderException(Properties.Resources.UsernameNotFound); + + if (answer == null && RequiresQuestionAndAnswer) + { + UpdateFailureCount(userId, "PasswordAnswer", connection); + throw new ProviderException(Properties.Resources.PasswordRequiredForReset); + } + + string newPassword = Membership.GeneratePassword(newPasswordLength, MinRequiredNonAlphanumericCharacters); + ValidatePasswordEventArgs Args = new ValidatePasswordEventArgs(username, newPassword, true); + OnValidatingPassword(Args); + if (Args.Cancel) + { + if (!(Args.FailureInformation == null)) + throw Args.FailureInformation; + else + throw new MembershipPasswordException(Properties.Resources.PasswordResetCanceledNotValid); + } + + MySqlCommand cmd = new MySqlCommand(@"SELECT PasswordAnswer, + PasswordKey, PasswordFormat, IsLockedOut + FROM my_aspnet_membership WHERE userId=@userId", connection); + cmd.Parameters.AddWithValue("@userId", userId); + + string passwordKey = String.Empty; + MembershipPasswordFormat format; + using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) + { + reader.Read(); + if (reader.GetBoolean("IsLockedOut")) + throw new MembershipPasswordException(Properties.Resources.UserIsLockedOut); + + object passwordAnswer = reader.GetValue(reader.GetOrdinal("PasswordAnswer")); + passwordKey = reader.GetString("PasswordKey"); + format = (MembershipPasswordFormat)reader.GetByte("PasswordFormat"); + reader.Close(); + + if (RequiresQuestionAndAnswer) + { + if (!CheckPassword(answer, (string)passwordAnswer, passwordKey, format)) + { + UpdateFailureCount(userId, "PasswordAnswer", connection); + throw new MembershipPasswordException(Properties.Resources.IncorrectPasswordAnswer); + } + } + } + + cmd.CommandText = @"UPDATE my_aspnet_membership + SET Password = @pass, LastPasswordChangedDate = @lastPassChange + WHERE userId=@userId"; + + cmd.Parameters.AddWithValue("@pass", + EncodePassword(newPassword, passwordKey, format)); + cmd.Parameters.AddWithValue("@lastPassChange", DateTime.Now); + int rowsAffected = cmd.ExecuteNonQuery(); + if (rowsAffected != 1) + throw new MembershipPasswordException(Properties.Resources.ErrorResettingPassword); + return newPassword; + } + } + catch (MySqlException e) + { + if (WriteExceptionsToEventLog) + WriteToEventLog(e, "ResetPassword"); + throw new ProviderException(exceptionMessage, e); + } + } + + /// + /// Updates information about a user in the data source. + /// + /// A object + /// that represents the user to update and the updated information for the user. + public override void UpdateUser(MembershipUser user) + { + try + { + using (MySqlConnection conn = new MySqlConnection(connectionString)) + { + conn.Open(); + + int userId = GetUserId(conn, user.UserName); + if (-1 == userId) + throw new ProviderException(Properties.Resources.UsernameNotFound); + + string sql = @"UPDATE my_aspnet_membership m, my_aspnet_users u + SET m.Email=@email, m.Comment=@comment, m.IsApproved=@isApproved, + m.LastLoginDate=@lastLoginDate, u.lastActivityDate=@lastActivityDate, + m.LastActivityDate=@lastActivityDate + WHERE m.userId=u.id AND u.name LIKE @name AND u.applicationId=@appId"; + MySqlCommand cmd = new MySqlCommand(sql, conn); + cmd.Parameters.AddWithValue("@Email", user.Email); + cmd.Parameters.AddWithValue("@Comment", user.Comment); + cmd.Parameters.AddWithValue("@isApproved", user.IsApproved); + cmd.Parameters.AddWithValue("@lastLoginDate", user.LastLoginDate); + cmd.Parameters.AddWithValue("@lastActivityDate", user.LastActivityDate); + cmd.Parameters.AddWithValue("@name", user.UserName); + cmd.Parameters.AddWithValue("@appId", app.FetchId(conn)); + cmd.ExecuteNonQuery(); + } + } + catch (MySqlException e) + { + if (WriteExceptionsToEventLog) + WriteToEventLog(e, "UpdateUser"); + throw new ProviderException(exceptionMessage); + } + } + + /// + /// Verifies that the specified user name and password exist in the data source. + /// + /// The name of the user to validate. + /// The password for the specified user. + /// + /// true if the specified username and password are valid; otherwise, false. + /// + public override bool ValidateUser(string username, string password) + { + bool isValid = false; + try + { + using (MySqlConnection connection = new MySqlConnection(connectionString)) + { + connection.Open(); + + // first get the user id. If that is -1, then the user doesn't exist + // so we just return false since we can't bump any counters + int userId = GetUserId(connection, username); + if (-1 == userId) return false; + + string sql = @"SELECT Password, PasswordKey, PasswordFormat, IsApproved, + Islockedout FROM my_aspnet_membership WHERE userId=@userId"; + MySqlCommand cmd = new MySqlCommand(sql, connection); + cmd.Parameters.AddWithValue("@userId", userId); + + using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) + { + if (!reader.HasRows) return false; + reader.Read(); + if (reader.GetBoolean("IsLockedOut")) return false; + + string pwd = reader.GetString(0); + string passwordKey = reader.GetString(1); + MembershipPasswordFormat format = (MembershipPasswordFormat) + reader.GetInt32(2); + bool isApproved = reader.GetBoolean(3); + reader.Close(); + + if (!CheckPassword(password, pwd, passwordKey, format)) + UpdateFailureCount(userId, "Password", connection); + else if (isApproved) + { + isValid = true; + DateTime currentDate = DateTime.Now; + MySqlCommand updateCmd = new MySqlCommand( + @"UPDATE my_aspnet_membership m, my_aspnet_users u + SET m.LastLoginDate = @lastLoginDate, u.lastActivityDate = @date, + m.LastActivityDate=@date + WHERE m.userId=@userid AND u.id=@userid", connection); + updateCmd.Parameters.AddWithValue("@lastLoginDate", currentDate); + updateCmd.Parameters.AddWithValue("@date", currentDate); + updateCmd.Parameters.AddWithValue("@userid", userId); + updateCmd.ExecuteNonQuery(); + } + } + return isValid; + } + } + catch (MySqlException e) + { + if (WriteExceptionsToEventLog) + WriteToEventLog(e, "ValidateUser"); + throw new ProviderException(exceptionMessage, e); + } + } + + /// + /// Gets a collection of membership users where the user name contains the specified user name to match. + /// + /// The user name to search for. + /// The index of the page of results to return. is zero-based. + /// The size of the page of results to return. + /// The total number of matched users. + /// + /// A collection that contains a page of objects beginning at the page specified by . + /// + public override MembershipUserCollection FindUsersByName(string usernameToMatch, + int pageIndex, int pageSize, out int totalRecords) + { + return GetUsers(usernameToMatch, null, pageIndex, pageSize, out totalRecords); + } + + /// + /// Gets a collection of membership users where the e-mail address contains the specified e-mail address to match. + /// + /// The e-mail address to search for. + /// The index of the page of results to return. is zero-based. + /// The size of the page of results to return. + /// The total number of matched users. + /// + /// A collection that contains a page of objects beginning at the page specified by . + /// + public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, + int pageSize, out int totalRecords) + { + return GetUsers(null, emailToMatch, pageIndex, pageSize, out totalRecords); + } + + #endregion + + #region Private Methods + + private int GetUserId(MySqlConnection connection, string username) + { + MySqlCommand cmd = new MySqlCommand( + "SELECT id FROM my_aspnet_users WHERE name = @name AND applicationId=@appId", connection); + cmd.Parameters.AddWithValue("@name", username); + cmd.Parameters.AddWithValue("@appId", app.FetchId(connection)); + object id = cmd.ExecuteScalar(); + if (id == null) return -1; + return (int)id; + } + + private void WriteToEventLog(Exception e, string action) + { + using (EventLog log = new EventLog()) + { + log.Source = eventSource; + log.Log = eventLog; + string message = "An exception occurred communicating with the data source." + + Environment.NewLine + Environment.NewLine; + message += "Action: " + action + Environment.NewLine + Environment.NewLine; + message += "Exception: " + e; + log.WriteEntry(message); + } + } + + private MembershipUser GetUserFromReader(MySqlDataReader reader) + { + object providerUserKey = reader.GetInt32("userId"); + string username = reader.GetString("name"); + + string email = null; + if (!reader.IsDBNull(reader.GetOrdinal("Email"))) + email = reader.GetString("Email"); + + string passwordQuestion = ""; + if (!(reader.GetValue(reader.GetOrdinal("PasswordQuestion")) == DBNull.Value)) + passwordQuestion = reader.GetString("PasswordQuestion"); + + string comment = ""; + if (!(reader.GetValue(reader.GetOrdinal("Comment")) == DBNull.Value)) + comment = reader.GetString("Comment"); + + bool isApproved = reader.GetBoolean("IsApproved"); + bool isLockedOut = reader.GetBoolean("IsLockedOut"); + DateTime creationDate = reader.GetDateTime("CreationDate"); + DateTime lastLoginDate = new DateTime(); + if (!(reader.GetValue(reader.GetOrdinal("LastLoginDate")) == DBNull.Value)) + lastLoginDate = reader.GetDateTime("LastLoginDate"); + + DateTime lastActivityDate = reader.GetDateTime("LastActivityDate"); + DateTime lastPasswordChangedDate = reader.GetDateTime("LastPasswordChangedDate"); + DateTime lastLockedOutDate = new DateTime(); + if (!(reader.GetValue(reader.GetOrdinal("LastLockedoutDate")) == DBNull.Value)) + lastLockedOutDate = reader.GetDateTime("LastLockedoutDate"); + + MembershipUser u = + new MembershipUser(Name, username, providerUserKey, email, passwordQuestion, comment, isApproved, + isLockedOut, creationDate, lastLoginDate, lastActivityDate, lastPasswordChangedDate, + lastLockedOutDate); + return u; + } + + private string UnEncodePassword(string encodedPassword, MembershipPasswordFormat format) + { + string password = encodedPassword; + if (format == MembershipPasswordFormat.Clear) + return encodedPassword; + else if (format == MembershipPasswordFormat.Encrypted) + return Encoding.Unicode.GetString(DecryptPassword( + Convert.FromBase64String(password))); + else if (format == MembershipPasswordFormat.Hashed) + throw new ProviderException(Properties.Resources.CannotUnencodeHashedPwd); + else + throw new ProviderException(Properties.Resources.UnsupportedPasswordFormat); + } + + private string GetPasswordKey() + { + RNGCryptoServiceProvider cryptoProvider = + new RNGCryptoServiceProvider(); + byte[] key = new byte[16]; + cryptoProvider.GetBytes(key); + return Convert.ToBase64String(key); + } + + /// + /// this method is only necessary because early versions of Mono did not support + /// the HashAlgorithmType property + /// + /// + /// + /// + private string HashPasswordBytes(byte[] key, byte[] bytes) + { + HashAlgorithm hash = HashAlgorithm.Create(Membership.HashAlgorithmType); + + if (hash is KeyedHashAlgorithm) + { + KeyedHashAlgorithm keyedHash = hash as KeyedHashAlgorithm; + keyedHash.Key = key; + } + return Convert.ToBase64String(hash.ComputeHash(bytes)); + } + + private string EncodePassword(string password, string passwordKey, + MembershipPasswordFormat format) + { + if (password == null) + return null; + if (format == MembershipPasswordFormat.Clear) + return password; + + byte[] passwordBytes = Encoding.Unicode.GetBytes(password); + byte[] keyBytes = Convert.FromBase64String(passwordKey); + byte[] keyedBytes = new byte[passwordBytes.Length + keyBytes.Length]; + Array.Copy(keyBytes, keyedBytes, keyBytes.Length); + Array.Copy(passwordBytes, 0, keyedBytes, keyBytes.Length, passwordBytes.Length); + + if (format == MembershipPasswordFormat.Encrypted) + { + byte[] encryptedBytes = EncryptPassword(passwordBytes); + return Convert.ToBase64String(encryptedBytes); + } + else if (format == MembershipPasswordFormat.Hashed) + return HashPasswordBytes(keyBytes, keyedBytes); + else + throw new ProviderException(Properties.Resources.UnsupportedPasswordFormat); + } + + private void UpdateFailureCount(int userId, string failureType, MySqlConnection connection) + { + MySqlCommand cmd = new MySqlCommand( + @"SELECT FailedPasswordAttemptCount, + FailedPasswordAttemptWindowStart, FailedPasswordAnswerAttemptCount, + FailedPasswordAnswerAttemptWindowStart FROM my_aspnet_membership + WHERE userId=@userId", connection); + cmd.Parameters.AddWithValue("@userId", userId); + + DateTime windowStart = new DateTime(); + int failureCount = 0; + try + { + using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) + { + if (!reader.HasRows) + throw new ProviderException(Properties.Resources.UnableToUpdateFailureCount); + + reader.Read(); + if (failureType == "Password") + { + failureCount = reader.GetInt32(0); + windowStart = reader.GetDateTime(1); + } + if (failureType == "PasswordAnswer") + { + failureCount = reader.GetInt32(2); + windowStart = reader.GetDateTime(3); + } + } + + DateTime windowEnd = windowStart.AddMinutes(PasswordAttemptWindow); + if (failureCount == 0 || DateTime.Now > windowEnd) + { + if (failureType == "Password") + { + cmd.CommandText = + @"UPDATE my_aspnet_membership + SET FailedPasswordAttemptCount = @count, + FailedPasswordAttemptWindowStart = @windowStart + WHERE userId=@userId"; + } + if (failureType == "PasswordAnswer") + { + cmd.CommandText = + @"UPDATE my_aspnet_membership + SET FailedPasswordAnswerAttemptCount = @count, + FailedPasswordAnswerAttemptWindowStart = @windowStart + WHERE userId = @userId"; + } + cmd.Parameters.Clear(); + cmd.Parameters.AddWithValue("@count", 1); + cmd.Parameters.AddWithValue("@windowStart", DateTime.Now); + cmd.Parameters.AddWithValue("@userId", userId); + if (cmd.ExecuteNonQuery() < 0) + throw new ProviderException(Properties.Resources.UnableToUpdateFailureCount); + } + else + { + failureCount += 1; + if (failureCount >= MaxInvalidPasswordAttempts) + { + cmd.CommandText = + @"UPDATE my_aspnet_membership SET IsLockedOut = @isLockedOut, + LastLockedOutDate = @lastLockedOutDate WHERE userId=@userId"; + cmd.Parameters.Clear(); + cmd.Parameters.AddWithValue("@isLockedOut", true); + cmd.Parameters.AddWithValue("@lastLockedOutDate", DateTime.Now); + cmd.Parameters.AddWithValue("@userId", userId); + if (cmd.ExecuteNonQuery() < 0) + throw new ProviderException(Properties.Resources.UnableToLockOutUser); + } + else + { + if (failureType == "Password") + { + cmd.CommandText = + @"UPDATE my_aspnet_membership + SET FailedPasswordAttemptCount = @count WHERE userId=@userId"; + } + if (failureType == "PasswordAnswer") + { + cmd.CommandText = + @"UPDATE my_aspnet_membership + SET FailedPasswordAnswerAttemptCount = @count + WHERE userId=@userId"; + } + cmd.Parameters.Clear(); + cmd.Parameters.AddWithValue("@count", failureCount); + cmd.Parameters.AddWithValue("@userId", userId); + if (cmd.ExecuteNonQuery() < 0) + throw new ProviderException("Unable to update failure count."); + } + } + } + catch (MySqlException e) + { + if (WriteExceptionsToEventLog) + WriteToEventLog(e, "UpdateFailureCount"); + throw new ProviderException(exceptionMessage, e); + } + } + + private bool CheckPassword(string password, string dbpassword, + string passwordKey, MembershipPasswordFormat format) + { + password = EncodePassword(password, passwordKey, format); + return password == dbpassword; + } + + private void GetPasswordInfo(MySqlConnection connection, int userId, + out string passwordKey, out MembershipPasswordFormat passwordFormat) + { + MySqlCommand cmd = new MySqlCommand( + @"SELECT PasswordKey, PasswordFormat FROM my_aspnet_membership WHERE + userId=@userId", connection); + cmd.Parameters.AddWithValue("@userId", userId); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + passwordKey = reader.GetString(reader.GetOrdinal("PasswordKey")); + passwordFormat = (MembershipPasswordFormat)reader.GetByte( + reader.GetOrdinal("PasswordFormat")); + } + } + + private MembershipUserCollection GetUsers(string username, string email, + int pageIndex, int pageSize, out int totalRecords) + { + MembershipUserCollection users = new MembershipUserCollection(); + try + { + using (MySqlConnection connection = new MySqlConnection(connectionString)) + { + connection.Open(); + MySqlCommand cmd = new MySqlCommand(); + cmd.Connection = connection; + + string sql = @"SELECT SQL_CALC_FOUND_ROWS u.name,m.* FROM my_aspnet_users u + JOIN my_aspnet_membership m ON m.userId=u.id + WHERE u.applicationId=@appId"; + + if (username != null) + { + sql += " AND u.name LIKE @name"; + cmd.Parameters.AddWithValue("@name", username); + } + else if (email != null) + { + sql += " AND m.Email LIKE @email"; + cmd.Parameters.AddWithValue("@email", email); + } + sql += " ORDER BY u.id ASC LIMIT {0},{1}"; + cmd.CommandText = String.Format(sql, pageIndex * pageSize, pageSize); + cmd.Parameters.AddWithValue("@appId", app.FetchId(connection)); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + while (reader.Read()) + users.Add(GetUserFromReader(reader)); + } + cmd.CommandText = "SELECT FOUND_ROWS()"; + cmd.Parameters.Clear(); + totalRecords = Convert.ToInt32(cmd.ExecuteScalar()); + } + return users; + } + catch (MySqlException e) + { + if (WriteExceptionsToEventLog) + WriteToEventLog(e, "GetUsers"); + throw new ProviderException(exceptionMessage); + } + } + + private void ValidateQA(string question, string answer) + { + if (RequiresQuestionAndAnswer && String.IsNullOrEmpty(question)) + throw new ArgumentException(Properties.Resources.PasswordQuestionInvalid); + if (RequiresQuestionAndAnswer && String.IsNullOrEmpty(answer)) + throw new ArgumentException(Properties.Resources.PasswordAnswerInvalid); + } + + private bool ValidatePassword(string password, string argumentName, bool throwExceptions) + { + string exceptionString = null; + object correctValue = MinRequiredPasswordLength; + + if (password.Length < MinRequiredPasswordLength) + exceptionString = Properties.Resources.PasswordNotLongEnough; + else + { + int count = 0; + foreach (char c in password) + if (!char.IsLetterOrDigit(c)) + count++; + if (count < MinRequiredNonAlphanumericCharacters) + exceptionString = Properties.Resources.NotEnoughNonAlphaNumericInPwd; + correctValue = MinRequiredNonAlphanumericCharacters; + } + + if (exceptionString != null) + { + if (throwExceptions) + throw new ArgumentException( + string.Format(exceptionString, argumentName, correctValue), + argumentName); + else + return false; + } + + if (PasswordStrengthRegularExpression.Length > 0) + if (!Regex.IsMatch(password, PasswordStrengthRegularExpression)) + return false; + + return true; + } + + private void TrimParametersValues(ref string username, ref string password, ref string email, ref string passwordQuestion, ref string passwordAnswer) + { + username = string.IsNullOrEmpty(username) ? username : username.Trim(); + password = string.IsNullOrEmpty(password) ? password : password.Trim(); + email = string.IsNullOrEmpty(email) ? email : email.Trim(); + passwordQuestion = string.IsNullOrEmpty(passwordQuestion) ? passwordQuestion : passwordQuestion.Trim(); + passwordAnswer = string.IsNullOrEmpty(passwordAnswer) ? passwordAnswer : passwordAnswer.Trim(); + } + + #endregion + } +} diff --git a/MySql.Web/src/MySql.Web.csproj b/MySql.Web/src/MySql.Web.csproj new file mode 100644 index 000000000..ed1ebd6ba --- /dev/null +++ b/MySql.Web/src/MySql.Web.csproj @@ -0,0 +1,89 @@ + + + + MySql.Web + Copyright © 2004, 2025, Oracle and/or its affiliates. + en-US + 9.4.0 + Oracle Corporation + net462;net48; + $(NoWarn);CS1591 + MySql.Web + MySql.Web + MySql;.NET Connector;MySql Connector/NET + logo-mysql-170x115.png + README.md + https://dev.mysql.com/downloads/ + GPL-2.0-only WITH Universal-FOSS-exception-1.0 + true + false + False + True + True + ..\..\ConnectorNetPublicKey.snk + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + true + + + + + Component + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + \ No newline at end of file diff --git a/Source/MySql.Web/MySqlDatabaseWrapper.cs b/MySql.Web/src/MySqlDatabaseWrapper.cs similarity index 82% rename from Source/MySql.Web/MySqlDatabaseWrapper.cs rename to MySql.Web/src/MySqlDatabaseWrapper.cs index d3f363c48..5fa161e80 100644 --- a/Source/MySql.Web/MySqlDatabaseWrapper.cs +++ b/MySql.Web/src/MySqlDatabaseWrapper.cs @@ -1,206 +1,208 @@ -// Copyright © 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Data.Common; -using MySql.Data.MySqlClient; -using System.Data; -using System.Globalization; - -namespace MySql.Web.Security -{ - /// - /// Perform basic operations against a Database - /// - internal class MySqlDatabaseWrapper : IDisposable - { - private MySqlConnection _conn; - #region Public - /// - /// Initialize a new instance of the class - /// - /// Connection String - public MySqlDatabaseWrapper(string connectionString) - { - _conn = new MySqlConnection(connectionString); - } - ~MySqlDatabaseWrapper() - { - this.Dispose(true); - } - /// - /// Close the current instance - /// - public void Close() - { - this.Dispose(); - } - /// - /// Dispose the current instance - /// - public void Dispose() - { - this.Dispose(true); - GC.SuppressFinalize(this); - } - - /// - /// Execute given query on the database - /// - /// Query to exeute - /// Parameters used in the query - /// Query resultset - public IEnumerable ExecuteQuery(string cmdText, params object[] parametersValues) - { - CheckIsConnectionOpen(); - MySqlCommand cmd = _conn.CreateCommand(); - cmd.CommandText = cmdText; - AddParameters(cmd, parametersValues); - DataTable result = new DataTable(); - MySqlDataAdapter adapter = new MySqlDataAdapter(cmd); - adapter.Fill(result); - foreach (DataRow row in result.Rows) - { - yield return row; - } - } - - /// - /// Execute given query on the database - /// - /// Query to exeute - /// Parameters used in the query - /// First record in the Query resultset - public DataRow ExecuteQuerySingleRecord(string cmdText, params object[] parametersValues) - { - return ExecuteQuery(cmdText, parametersValues).FirstOrDefault(); - } - - /// - /// Execute given query on the database - /// - /// Query to exeute - /// Parameters used in the query - /// Rows affected by the query - public int ExecuteNonQuery(string cmdText, params object[] parametersValues) - { - CheckIsConnectionOpen(); - MySqlCommand cmd = _conn.CreateCommand(); - cmd.CommandText = cmdText; - AddParameters(cmd, parametersValues); - return cmd.ExecuteNonQuery(); - } - - /// - /// Execute given query on the database - /// - /// Query to exeute - /// Parameters used in the query - /// Value of the first column in the first row in the query resulset - public object ExecuteScalar(string cmdText, params object[] parametersValues) - { - CheckIsConnectionOpen(); - MySqlCommand cmd = _conn.CreateCommand(); - cmd.CommandText = cmdText; - AddParameters(cmd, parametersValues); - return cmd.ExecuteScalar(); - } - - /// - /// Execute all given queries on the database inside of a transaction - /// - /// Queries to exeute - /// If queries were successfully executed - public bool ExecuteInTransaction(IEnumerable> commands) - { - CheckIsConnectionOpen(); - MySqlTransaction tran = _conn.BeginTransaction(); - try - { - foreach (var command in commands) - { - MySqlCommand cmd = _conn.CreateCommand(); - cmd.CommandText = command.Item1; - AddParameters(cmd, command.Item2); - cmd.ExecuteNonQuery(); - } - tran.Commit(); - return true; - } - catch (Exception) - { - tran.Rollback(); - return false; - } - } - #endregion - - #region Protected - protected virtual void Dispose(bool disposing) - { - if (disposing && (this._conn != null)) - { - if (_conn.State != ConnectionState.Closed) - _conn.Close(); - - _conn = null; - } - } - #endregion - - #region Private - /// - /// Verifies if the current connection is open, if not is opened - /// - private void CheckIsConnectionOpen() - { - if (this._conn.State != ConnectionState.Open) - { - this._conn.Open(); - } - } - - /// - /// Add parameters to a command, nomenclature name used for the parameters are 'param[n]' - /// - /// Command that will stores the parameters - /// Parameters values - private void AddParameters(MySqlCommand cmd, object[] values) - { - int ctr = 1; - foreach (object value in values) - { - cmd.Parameters.Add(new MySqlParameter() - { - ParameterName = string.Format("param{0}", ctr), - Value = value ?? DBNull.Value - }); - ctr++; - } - } - #endregion - } -} +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; + +namespace MySql.Web.Security +{ + /// + /// Perform basic operations against a Database + /// + internal class MySqlDatabaseWrapper : IDisposable + { + private MySqlConnection _conn; + #region Public + /// + /// Initialize a new instance of the class + /// + /// Connection String + public MySqlDatabaseWrapper(string connectionString) + { + _conn = new MySqlConnection(connectionString); + } + ~MySqlDatabaseWrapper() + { + this.Dispose(true); + } + /// + /// Close the current instance + /// + public void Close() + { + this.Dispose(); + } + /// + /// Dispose the current instance + /// + public void Dispose() + { + this.Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// Execute given query on the database + /// + /// Query to exeute + /// Parameters used in the query + /// Query resultset + public IEnumerable ExecuteQuery(string cmdText, params object[] parametersValues) + { + CheckIsConnectionOpen(); + MySqlCommand cmd = _conn.CreateCommand(); + cmd.CommandText = cmdText; + AddParameters(cmd, parametersValues); + DataTable result = new DataTable(); + MySqlDataAdapter adapter = new MySqlDataAdapter(cmd); + adapter.Fill(result); + foreach (DataRow row in result.Rows) + { + yield return row; + } + } + + /// + /// Execute given query on the database + /// + /// Query to exeute + /// Parameters used in the query + /// First record in the Query resultset + public DataRow ExecuteQuerySingleRecord(string cmdText, params object[] parametersValues) + { + return ExecuteQuery(cmdText, parametersValues).FirstOrDefault(); + } + + /// + /// Execute given query on the database + /// + /// Query to exeute + /// Parameters used in the query + /// Rows affected by the query + public int ExecuteNonQuery(string cmdText, params object[] parametersValues) + { + CheckIsConnectionOpen(); + MySqlCommand cmd = _conn.CreateCommand(); + cmd.CommandText = cmdText; + AddParameters(cmd, parametersValues); + return cmd.ExecuteNonQuery(); + } + + /// + /// Execute given query on the database + /// + /// Query to exeute + /// Parameters used in the query + /// Value of the first column in the first row in the query resulset + public object ExecuteScalar(string cmdText, params object[] parametersValues) + { + CheckIsConnectionOpen(); + MySqlCommand cmd = _conn.CreateCommand(); + cmd.CommandText = cmdText; + AddParameters(cmd, parametersValues); + return cmd.ExecuteScalar(); + } + + /// + /// Execute all given queries on the database inside of a transaction + /// + /// Queries to exeute + /// If queries were successfully executed + public bool ExecuteInTransaction(IEnumerable> commands) + { + CheckIsConnectionOpen(); + MySqlTransaction tran = _conn.BeginTransaction(); + try + { + foreach (var command in commands) + { + MySqlCommand cmd = _conn.CreateCommand(); + cmd.CommandText = command.Item1; + AddParameters(cmd, command.Item2); + cmd.ExecuteNonQuery(); + } + tran.Commit(); + return true; + } + catch (Exception) + { + tran.Rollback(); + return false; + } + } + #endregion + + #region Protected + protected virtual void Dispose(bool disposing) + { + if (disposing && (this._conn != null)) + { + if (_conn.State != ConnectionState.Closed) + _conn.Close(); + + _conn = null; + } + } + #endregion + + #region Private + /// + /// Verifies if the current connection is open, if not is opened + /// + private void CheckIsConnectionOpen() + { + if (this._conn.State != ConnectionState.Open) + { + this._conn.Open(); + } + } + + /// + /// Add parameters to a command, nomenclature name used for the parameters are 'param[n]' + /// + /// Command that will stores the parameters + /// Parameters values + private void AddParameters(MySqlCommand cmd, object[] values) + { + int ctr = 1; + foreach (object value in values) + { + cmd.Parameters.Add(new MySqlParameter() + { + ParameterName = string.Format("param{0}", ctr), + Value = value ?? DBNull.Value + }); + ctr++; + } + } + #endregion + } +} diff --git a/MySql.Web/src/MySqlWebSecurity.cs b/MySql.Web/src/MySqlWebSecurity.cs new file mode 100644 index 000000000..4b5939251 --- /dev/null +++ b/MySql.Web/src/MySqlWebSecurity.cs @@ -0,0 +1,577 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Web.Properties; +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Configuration; +using System.Net; +using System.Web; +using System.Web.Routing; +using System.Web.Security; +using System.Web.WebPages; + +namespace MySql.Web.Security +{ + /// + /// Provides security features for web projects implementing a MySql database. + /// + public static class MySqlWebSecurity + { + /// + /// Name of the key required to enable simple membership. + /// + public static readonly string EnableSimpleMembershipKey = "enableSimpleMembership"; + private static readonly string MySqlMembershipProviderName = "MySqlMembershipProvider"; + private static readonly string MySqlRoleProviderName = "MySQLRoleProvider"; + + #region Public + /// + /// Changes the password for the user provided. + /// + /// The user name. + /// The current pasword. + /// The new Password. + /// + public static bool ChangePassword(string userName, string oldPassword, string newPassword) + { + ValidProvider(); + var user = Membership.GetUser(userName, true); + return user.ChangePassword(oldPassword, newPassword); + } + + /// + /// Confirms user by confirmation token. + /// + /// The confirmation token. + /// true if the user was confirmed; otherwise, false. + public static bool ConfirmAccount(string confirmationToken) + { + var provider = ValidProvider(); + return provider.ConfirmAccount(confirmationToken); + } + + /// + /// Confirms user by confirmation token and user name. + /// + /// The user name. + /// The confirmation token. + /// true if the user was confirmed; otherwise, false. + public static bool ConfirmAccount(string userName, string confirmationToken) + { + var provider = ValidProvider(); + return provider.ConfirmAccount(userName, confirmationToken); + } + + /// + /// Creates a user account. + /// + /// The user name. + /// The user password. + /// Flag to indicate if a confirmation token is required. + /// A confirmation token if required. + public static string CreateAccount(string userName, string password, bool requireConfirmationToken = false) + { + var provider = ValidProvider(); + return provider.CreateAccount(userName, password, requireConfirmationToken); + } + + /// + /// Creates user and account. + /// + /// The user name. + /// The user password. + /// Additional data for user table. + /// Flag to indicate if a confirmation token is required. + /// A confirmation token if required. + public static string CreateUserAndAccount(string userName, string password, object additionalUserAttributes = null, bool requireConfirmationToken = false) + { + var provider = ValidProvider(); + IDictionary userAttrs = additionalUserAttributes as RouteValueDictionary; + + if (userAttrs == null && additionalUserAttributes != null) + { + var attrs = additionalUserAttributes as IDictionary; + userAttrs = attrs != null ? new RouteValueDictionary(attrs) : new RouteValueDictionary(additionalUserAttributes); + } + + return provider.CreateUserAndAccount(userName, password, requireConfirmationToken, userAttrs); + } + + /// + /// Gets the date when the specified user was created. + /// + /// The user name. + /// Date created or minimum date value if the user was not found. + public static DateTime GetCreateDate(string userName) + { + var provider = ValidProvider(); + return provider.GetCreateDate(userName); + } + + /// + /// Gets the last date when password fails. + /// + /// The user name. + /// Last failure date or minimum date value if the user was not found. + public static DateTime GetLastPasswordFailureDate(string userName) + { + var provider = ValidProvider(); + return provider.GetLastPasswordFailureDate(userName); + } + + /// + /// Gets the date when password was changed. + /// + /// The user name. + /// Last password changed date or minimum date value if the user was not found. + public static DateTime GetPasswordChangedDate(string userName) + { + var provider = ValidProvider(); + return provider.GetPasswordChangedDate(userName); + } + + /// + /// Gets the password failures since last success. + /// + /// The user name. + /// The number of failures since last success. + public static int GetPasswordFailuresSinceLastSuccess(string userName) + { + var provider = ValidProvider(); + return provider.GetPasswordFailuresSinceLastSuccess(userName); + } + + /// + /// Generates password reset token for a confirmed user. + /// + /// The user name. + /// The time that the token will be valid. + /// A generated token or null if the user is not confirmed or does not have a token. + public static string GeneratePasswordResetToken(string userName, int tokenExpirationInMinutesFromNow = 1440) + { + var provider = ValidProvider(); + return provider.GeneratePasswordResetToken(userName, tokenExpirationInMinutesFromNow); + } + + /// + /// Gets the user id. + /// + /// The user name. + /// The user id. -1 if the user doesn't exists + public static int GetUserId(string userName) + { + ValidProvider(); + var user = Membership.GetUser(userName); + return user != null ? (int)user.ProviderUserKey : -1; + } + + /// + /// Gets the user id from the password reset token. + /// + /// The reset token. + /// The user id. 0 if the user doesn't exists. + public static int GetUserIdFromPasswordResetToken(string resetToken) + { + var provider = ValidProvider(); + return provider.GetUserIdFromPasswordResetToken(resetToken); + } + + /// + /// Initializes the simple membership provider with the values given. + /// + /// The connection string name defined in the config file. + /// The table name defined to create new users. + /// The column name defined to store the user ids. + /// The column name defined to store the user name. + /// Flag indicating if the tables should be created. + /// Flag indicating to check if the database has been initialized. + public static void InitializeDatabaseConnection(string connectionStringName, string userTableName, string userIdColumn, string userNameColumn, bool createTables, bool checkIfInitialized = false) + { + InitializeMembershipProvider(connectionStringName, null, null, userTableName, userIdColumn, userNameColumn, createTables, checkIfInitialized); + InitializeRoleProvider(connectionStringName, null, null, userTableName, userIdColumn, userNameColumn, createTables, checkIfInitialized); + Initialized = true; + } + + /// + /// Initializes the simple membership provider with the values given. + /// + /// The connection string. + /// The name of the provider. + /// The table name defined to create new users. + /// The column name defined to store the user ids. + /// The column name defined to store the user name. + /// Flag indicating if the tables should be created. + /// Flag indicating to check if the database has been initialized. + public static void InitializeDatabaseConnection(string connectionString, string providerName, string userTableName, string userIdColumn, string userNameColumn, bool createTables, bool checkIfInitialized = false) + { + InitializeMembershipProvider(null, connectionString, providerName, userTableName, userIdColumn, userNameColumn, createTables, checkIfInitialized); + InitializeRoleProvider(null, connectionString, providerName, userTableName, userIdColumn, userNameColumn, createTables, checkIfInitialized); + Initialized = true; + } + + /// + /// Determines if the account is locked out. + /// + /// The name of the user. + /// The number of allowed password attempts. + /// true if the account is locked; otherwise, false. + public static bool IsAccountLockedOut(string userName, int allowedPasswordAttempts, int intervalInSeconds) + { + return IsAccountLockedOut(userName, allowedPasswordAttempts, TimeSpan.FromSeconds(intervalInSeconds)); + } + + /// + /// Determines if the account is locked out. + /// + /// The name of the user. + /// The number of allowed password attempts. + /// true if the account is locked; otherwise, false. + public static bool IsAccountLockedOut(string userName, int allowedPasswordAttempts, TimeSpan interval) + { + var provider = ValidProvider(); + return (provider.GetUser(userName, false) != null && provider.GetPasswordFailuresSinceLastSuccess(userName) > allowedPasswordAttempts && provider.GetLastPasswordFailureDate(userName).Add(interval) > DateTime.UtcNow); + } + + /// + /// Determines if the user has been confirmed. + /// + /// The user name. + /// true if the user is confirmed; otherwise false. + public static bool IsConfirmed(string userName) + { + var provider = ValidProvider(); + return provider.IsConfirmed(userName); + } + + /// + /// Determines if the is the same as the provided user name. + /// + /// The user name. + /// true if the user matches the ; otherwise, false. + public static bool IsCurrentUser(string userName) + { + ValidProvider(); + return string.Equals(CurrentUserName, userName, StringComparison.OrdinalIgnoreCase); + } + + /// + /// Determines if the matches the provided user id. + /// + /// The user id to match. + /// true if the id matches the ; otherwise, false. + public static bool IsUseLoggedOn(int userId) + { + ValidProvider(); + return CurrentUserId == userId; + } + + /// + /// Performs a login for the specified user. + /// + /// The user name. + /// The user password. + /// Flag to indicate if a persistent cookie should be created. + /// true if the login was successful; otherwise, false. + public static bool Login(string userName, string password, bool createPersistentCookie = false) + { + var curentProvider = ValidProvider(); + bool loginSuccessful = false; + if (curentProvider != null) + loginSuccessful = curentProvider.ValidateUser(userName, password); + else + loginSuccessful = Membership.ValidateUser(userName, password); + + if (loginSuccessful) + { + FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); + } + return loginSuccessful; + } + + /// + /// Performs a logout for the current item. + /// + public static void Logout() + { + ValidProvider(); + FormsAuthentication.SignOut(); + } + + /// + /// Evalutes if the user is authenticated. + /// + public static void RequireAuthenticatedUser() + { + ValidProvider(); + var user = CurrentContext.User; + if (user == null || !user.Identity.IsAuthenticated) + { + CurrentContext.Response.SetStatus(HttpStatusCode.Unauthorized); + } + } + + /// + /// Evaluates if the user belongs to the specified roles. + /// + /// + public static void RequireRoles(params string[] roles) + { + ValidProvider(); + foreach (var role in roles) + { + if (!Roles.IsUserInRole(CurrentUserName, role)) + { + CurrentContext.Response.SetStatus(HttpStatusCode.Unauthorized); + } + } + } + + /// + /// Evaluates if the user is logged on. + /// + /// + public static void RequiresUser(int userId) + { + ValidProvider(); + if (!IsUseLoggedOn(userId)) + { + CurrentContext.Response.SetStatus(HttpStatusCode.Unauthorized); + } + } + + /// + /// Evaluates if the provided user name matches the . + /// + /// + public static void RequiresUser(string userName) + { + ValidProvider(); + if (!string.Equals(CurrentUserName, userName, StringComparison.OrdinalIgnoreCase)) + { + CurrentContext.Response.SetStatus(HttpStatusCode.Unauthorized); + } + } + + /// + /// Resets the password identified by the provided password reset token. + /// + /// The password reset token. + /// The new password. + /// true if the password reset was successful; otherwise, false. + public static bool ResetPassword(string passwordResetToken, string newPassword) + { + var provider = ValidProvider(); + return provider.ResetPasswordWithToken(passwordResetToken, newPassword); + } + + /// + /// Determines if the user exists. + /// + /// The user name. + /// true if the user exists; otherwise, false. + public static bool UserExists(string username) + { + var curentProvider = ValidProvider(); + if (curentProvider != null) + return curentProvider.GetUser(username, false) != null; + else + return Membership.GetUser(username) != null; + } + #endregion + + /// + /// Gets the initialized status. + /// + #region Properties + public static bool Initialized + { + get; + private set; + } + + /// + /// Gets the current user id. + /// + public static int CurrentUserId + { + get { return GetUserId(CurrentUserName); } + } + + /// + /// Gets the current user name. + /// + public static string CurrentUserName + { + get { return CurrentContext.User.Identity.Name; } + } + + /// + /// Gets a flag indicating if there is an associated user id. + /// + public static bool HasUserId + { + get { return CurrentUserId != -1; } + } + + /// + /// Gets a flag indicating if the user is authenticated. + /// + public static bool IsAuthenticated + { + get { return CurrentContext.Request.IsAuthenticated; } + } + #endregion + + #region Private_Internal + + private static MySqlSimpleMembershipProvider CreateSimpleMembershipProvider(string name, MySQLMembershipProvider currentDefault) + { + MySqlSimpleMembershipProvider simpleProvider = new MySqlSimpleMembershipProvider(currentDefault); + NameValueCollection config = new NameValueCollection(); + simpleProvider.Initialize(name, config); + return simpleProvider; + } + + private static MySqlSimpleRoleProvider CreateSimpleRoleProvider(string name, MySQLRoleProvider currentDefault) + { + MySqlSimpleRoleProvider simpleProvider = new MySqlSimpleRoleProvider(currentDefault); + NameValueCollection config = new NameValueCollection(); + simpleProvider.Initialize(name, config); + return simpleProvider; + } + + private static MySqlSimpleMembershipProvider ValidProvider() + { + if (_provider.Initialized) + return _provider; + + throw new Exception(Resources.SimpleMembershipNotInitialized); + } + + private static void InitializeMembershipProvider(string connectionStringName, string connectionString, string providerName, string userTableName, string userIdColumn, string userNameColumn, bool createTables, bool checkIfInitialized = false) + { + if (checkIfInitialized) + { + if (_provider != null) + return; + } + + MySqlSimpleMembershipProvider simpleMembership = new MySqlSimpleMembershipProvider(Membership.Provider); + if (_provider != null && _provider.Initialized) + { + throw new InvalidOperationException(Resources.SimpleMembershipAlreadyInitialized); + } + simpleMembership.ConnectionStringName = connectionStringName; + simpleMembership.ConnectionString = connectionString; + simpleMembership.ProviderName = providerName; + simpleMembership.UserTableName = userTableName; + simpleMembership.UserIdColumn = userIdColumn; + simpleMembership.UserNameColumn = userNameColumn; + if (createTables) + { + simpleMembership.CreateTables(); + } + else + { + simpleMembership.ValidateUserTable(); + } + simpleMembership.Initialized = true; + _provider = simpleMembership; + } + + private static void InitializeRoleProvider(string connectionStringName, string connectionString, string providerName, string userTableName, string userIdColumn, string userNameColumn, bool createTables, bool checkIfInitialized = false) + { + if (checkIfInitialized) + { + if (_roleprovider != null) + return; + } + + MySqlSimpleRoleProvider roleProvider = new MySqlSimpleRoleProvider(Roles.Provider); + if (_roleprovider != null && _roleprovider.Initialized) + { + throw new InvalidOperationException(Resources.SimpleRoleAlreadyInitialized); + } + roleProvider.ConnectionStringName = connectionStringName; + roleProvider.ConnectionString = connectionString; + roleProvider.UserTableName = userTableName; + roleProvider.UserIdColumn = userIdColumn; + roleProvider.UserNameColumn = userNameColumn; + if (createTables) + { + roleProvider.CreateTables(); + } + roleProvider.Initialized = true; + _roleprovider = roleProvider; + } + + private static bool IsSimpleMembershipEnabled() + { + string config = ConfigurationManager.AppSettings[EnableSimpleMembershipKey]; + bool isEnabled = false; + if (!string.IsNullOrEmpty(config)) + { + bool.TryParse(config, out isEnabled); + } + return isEnabled; + } + + internal static void PreAppStartInit() + { + if (IsSimpleMembershipEnabled()) + { + MembershipProvider provider = Membership.Providers[MySqlMembershipProviderName]; + if (provider != null) + { + MySqlSimpleMembershipProvider mysqlProvider = CreateSimpleMembershipProvider(MySqlMembershipProviderName, (MySQLMembershipProvider)provider); + Membership.Providers.Remove(MySqlMembershipProviderName); + Membership.Providers.Add(mysqlProvider); + } + Roles.Enabled = true; + RoleProvider roleProvider = Roles.Providers[MySqlRoleProviderName]; + if (roleProvider != null) + { + MySqlSimpleRoleProvider simpleRoleProv = CreateSimpleRoleProvider(MySqlRoleProviderName, (MySQLRoleProvider)roleProvider); + Roles.Providers.Remove(MySqlRoleProviderName); + Roles.Providers.Add(simpleRoleProv); + } + } + } + + internal static HttpContextBase CurrentContext + { + get { return new HttpContextWrapper(HttpContext.Current); } + } + + private static MySqlSimpleMembershipProvider _provider; + private static MySqlSimpleRoleProvider _roleprovider; + #endregion + } +} diff --git a/MySql.Web/src/PersonalizationConnectionHelper.cs b/MySql.Web/src/PersonalizationConnectionHelper.cs new file mode 100644 index 000000000..027113ded --- /dev/null +++ b/MySql.Web/src/PersonalizationConnectionHelper.cs @@ -0,0 +1,86 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Web.Hosting; + +namespace MySql.Web +{ + internal sealed class MySQLPersonalizationConnectionHelper + { + private MySqlConnection _connection; + + public MySqlConnection Connection + { + get { + return _connection; + } + } + + public bool Opened + { + get { + return _connection.State == System.Data.ConnectionState.Open; + } + } + + internal MySQLPersonalizationConnectionHelper(string connectionString) + { + if (string.IsNullOrEmpty(connectionString)) + { + throw new ArgumentNullException("connectionString"); + } + + _connection = new MySqlConnection(connectionString); + } + + internal void OpenConnection(bool impersonateContext) + { + if (_connection.State != System.Data.ConnectionState.Open) + { + if (impersonateContext) + { + using (HostingEnvironment.Impersonate()) + { + _connection.Open(); + } + } + else + _connection.Open(); + } + } + + internal void CloseConnection() + { + if (_connection.State != System.Data.ConnectionState.Closed) + _connection.Close(); + } + + } +} diff --git a/MySql.Web/src/PersonalizationProvider.cs b/MySql.Web/src/PersonalizationProvider.cs new file mode 100644 index 000000000..6c80f47f4 --- /dev/null +++ b/MySql.Web/src/PersonalizationProvider.cs @@ -0,0 +1,569 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySql.Web.Common; +using MySql.Web.General; +using System; +using System.Diagnostics; +using System.Web.Hosting; +using System.Web.UI.WebControls.WebParts; + +namespace MySql.Web.Personalization +{ + /// + /// Implementation for Personalization Provider to use web parts in ASP.NET websites. + /// + public class MySqlPersonalizationProvider : PersonalizationProvider + { + + string connectionString; + + + string eventSource = "MySQLPersonalizationProvider"; + string eventLog = "Application"; + string exceptionMessage = "An exception occurred. Please check the event log."; + bool writeExceptionsToEventLog = false; + + Application app; + + /// + /// Gets or sets the application name. + /// + public override string ApplicationName + { + get { return app.Name; } + set { app.Name = value; } + } + + private long ApplicationId + { + get { return app.Id; } + } + + private enum ResetUserStateMode + { + PerInactiveDate, + PerPaths, + PerUsers + } + + + /// + /// Initializes settings values for Personalization Provider. + /// + /// The name of the provider. + /// A named value collection representing the configurations for this provider. + public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) + { + if (config == null) + throw new ArgumentNullException("config"); + + if (string.IsNullOrEmpty(name)) + { + name = "MySqlPersonalizationProvider"; + } + + if (string.IsNullOrEmpty(config["description"])) + { + config.Remove("description"); + config.Add("description", "MySql Personalization provider"); + } + + base.Initialize(name, config); + + string applicationName = HostingEnvironment.ApplicationVirtualPath; + if (!String.IsNullOrEmpty(config["applicationName"])) + applicationName = config["applicationName"]; + + + if (!(config["writeExceptionsToEventLog"] == null)) + { + if (config["writeExceptionsToEventLog"].ToUpper() == "TRUE") + { + writeExceptionsToEventLog = true; + } + } + connectionString = ConfigUtility.GetConnectionString(config); + if (String.IsNullOrEmpty(connectionString)) return; + + // Make sure we have the correct schema. + SchemaManager.CheckSchema(connectionString, config); + + app = new Application(applicationName, base.Description); + + // Get the application id. + try + { + using (MySqlConnection conn = new MySqlConnection(connectionString)) + { + conn.Open(); + app.EnsureId(conn); + } + } + catch (Exception ex) + { + if (writeExceptionsToEventLog) + WriteToEventLog(ex, "MySQLPersonalizationProvider - Initialize"); + throw; + } + } + + /// + /// Returns a collection of PersonalizationStateInfo objects containing administrative information regarding records in the database that match the specified criteria. + /// + /// The personalization scope. + /// The set of query parameters. + /// The index of the page. + /// The size of the page. + /// The total number of records to return. + /// For example, records corresponding to users named Jeff* that have been modified since January 1, 2005. Wildcard support is provider-dependent. + public override PersonalizationStateInfoCollection FindState(PersonalizationScope scope, PersonalizationStateQuery query, int pageIndex, int pageSize, out int totalRecords) + { + + if (query == null) + throw new ArgumentNullException("query"); + + if (pageIndex < 0) + throw new ArgumentOutOfRangeException("pageIndex"); + + if (pageSize < 1) + throw new ArgumentOutOfRangeException("pageSize"); + + if (query.PathToMatch == null) + throw new ArgumentNullException("query.PathToMatch"); + + if (query.UsernameToMatch == null) + throw new ArgumentNullException("query.UserToMatch"); + + DateTime inactiveSinceDate = query.UserInactiveSinceDate; + + if (scope == PersonalizationScope.User) + { + return FindUserState(query.PathToMatch.Trim(), inactiveSinceDate, query.UsernameToMatch.Trim(), pageIndex, pageSize, out totalRecords); + } + else + { + return FindSharedState(query.PathToMatch.Trim(), pageIndex, pageSize, out totalRecords); + } + } + + + /// + /// Returns the number of records in the database that match the specified criteria. + /// + /// The personalization scope. + /// The set of query parameters. + /// For example, records corresponding to users named Jeff* that haven't been modified since January 1, 2005. Wildcard support is provider-dependent. + public override int GetCountOfState(PersonalizationScope scope, PersonalizationStateQuery query) + { + if (query == null) + throw new ArgumentNullException("query"); + + if (scope == PersonalizationScope.User) + { + return GetCountUserState(query.PathToMatch.Trim(), query.UserInactiveSinceDate, query.UsernameToMatch); + } + else + { + return GetCountOfSharedState(query.PathToMatch.Trim()); + } + } + + + /// + /// Retrieves personalization state as opaque blobs from the data source. + /// + /// The web part manager. + /// The path indicating where to save the data. + /// The user name. + /// A byte array containing the user shared data to loaded. + /// A byte array containing the user data to be loaded. + /// Retrieves both shared and user personalization state corresponding to a specified user and a specified page. + protected override void LoadPersonalizationBlobs(WebPartManager webPartManager, string path, string userName, ref Byte[] sharedDataBlob, ref Byte[] userDataBlob) + { + sharedDataBlob = null; + userDataBlob = null; + MySQLPersonalizationConnectionHelper connection = new MySQLPersonalizationConnectionHelper(connectionString); + connection.OpenConnection(true); + try + { + sharedDataBlob = PersonalizationProviderProcedures.my_aspnet_PersonalizationAllUsers_GetPageSettings( + ApplicationId, path, connection); + if (!String.IsNullOrEmpty(userName)) + { + userDataBlob = PersonalizationProviderProcedures.my_aspnet_PersonalizationPerUser_GetPageSettings( + ApplicationId, path, userName, DateTime.UtcNow, connection); + } + + connection.CloseConnection(); + } + catch (Exception ex) + { + if (writeExceptionsToEventLog) + WriteToEventLog(ex, "MySQLPersonalizationProvider - LoadPersonazalitionBlobs"); + throw; + } + finally + { + connection.CloseConnection(); + } + } + + /// + /// Deletes personalization state corresponding to a specified user and a specified page from the database. + /// + /// The web part manager. + /// The path indicating where to save the data. + /// The user name. + protected override void ResetPersonalizationBlob(WebPartManager webPartManager, string path, string userName) + { + MySQLPersonalizationConnectionHelper connection = new MySQLPersonalizationConnectionHelper(connectionString); + connection.OpenConnection(true); + try + { + if (string.IsNullOrEmpty(userName)) + { + PersonalizationProviderProcedures.my_aspnet_PersonalizationAllUsers_ResetPageSettings(ApplicationId, path, connection); + } + else + { + PersonalizationProviderProcedures.my_aspnet_PersonalizationPerUser_ResetPageSettings(ApplicationId, userName, path, DateTime.UtcNow, connection); + } + } + catch (Exception ex) + { + if (writeExceptionsToEventLog) + WriteToEventLog(ex, "MySQLPersonalizationProvider - ResetPersonalizationBlob"); + throw; + } + finally + { + connection.CloseConnection(); + } + } + + /// + /// Deletes personalization state corresponding to the specified users and specified pages from the database. + /// + /// The personalization scope. + /// The paths indicating where to save the data. + /// The user names. + /// + public override int ResetState(PersonalizationScope scope, string[] paths, string[] usernames) + { + + bool hasPaths = !(paths == null || paths.Length == 0); + bool hasUsers = !(usernames == null || usernames.Length == 0); + + var count = 0; + + var connection = new MySQLPersonalizationConnectionHelper(connectionString); + connection.OpenConnection(true); + + if (scope == PersonalizationScope.Shared) + { + try + { + if (paths == null) // reset all state + { + return PersonalizationProviderProcedures.my_aspnet_PersonalizationAdministration_DeleteAllState(true, ApplicationId, connection); + } + else + { + return PersonalizationProviderProcedures.my_aspnet_PersonalizationAdministration_ResetSharedState(ApplicationId, paths, connection); + } + } + catch (Exception ex) + { + if (writeExceptionsToEventLog) + WriteToEventLog(ex, "MySQLPersonalizationProvider - ResetState"); + throw; + } + finally + { + connection.CloseConnection(); + } + } + else + { + DateTime dateTime = Convert.ToDateTime("2038-01-19 03:14:07.999999"); // MySQL TimeStamp MaxValue + + if (!hasPaths && !hasUsers) + { + count = PersonalizationProviderProcedures.my_aspnet_PersonalizationAdministration_DeleteAllState(true, ApplicationId, connection); + } + else if (!hasUsers) + { + count = ResetUserState(ResetUserStateMode.PerPaths, dateTime, paths, null); + } + else + { + count = ResetUserState(ResetUserStateMode.PerUsers, dateTime, paths, usernames); + } + } + return count; + } + + + /// + /// Deletes user personalization state corresponding to the specified pages and that hasn't been updated since a specified date from the database. + /// + /// The path indicating where to retrieve the user state from. + /// A time and date indicating since when the user has been inactive. + /// + public override int ResetUserState(string path, DateTime userInactiveSinceDate) + { + if (string.IsNullOrEmpty(path)) + return 0; + + string[] paths = (path == null) ? null : new string[] { path }; + try + { + return ResetUserState(ResetUserStateMode.PerInactiveDate, userInactiveSinceDate, paths, null); + } + catch (Exception ex) + { + if (writeExceptionsToEventLog) + WriteToEventLog(ex, "MySQLPersonalizationProvider - ResetUserState"); + throw; + } + } + + /// + /// Writes personalization state corresponding to a specified user and a specified page as an opaque blob to the database. + /// + /// The web part manager. + /// The path indicating where to save the data. + /// The user name. + /// A byte array containing the data to be saved. + /// If userName is null, then the personalization state is shared state and is not keyed by user name. + protected override void SavePersonalizationBlob(WebPartManager webPartManager, string path, string userName, Byte[] dataBlob) + { + + MySQLPersonalizationConnectionHelper connection = new MySQLPersonalizationConnectionHelper(connectionString); + + try + { + MySqlCommand cmd = new MySqlCommand(); + connection.OpenConnection(true); + if (!string.IsNullOrEmpty(userName)) + { + PersonalizationProviderProcedures.my_aspnet_PersonalizationPerUser_SetPageSettings(ApplicationId, userName, path, dataBlob, DateTime.UtcNow, connection); + } + else + { + PersonalizationProviderProcedures.my_aspnet_PersonalizationAllUsers_SetPageSettings(ApplicationId, path, dataBlob, DateTime.UtcNow, connection); + } + } + catch (Exception ex) + { + if (writeExceptionsToEventLog) + WriteToEventLog(ex, "MySQLPersonalizationProvider - SavePersonalizationBlob"); + throw; + } + } + + private PersonalizationStateInfoCollection FindSharedState(string path, int pageIndex, int pageSize, out int totalRecords) + { + MySQLPersonalizationConnectionHelper connection = new MySQLPersonalizationConnectionHelper(connectionString); + + try + { + MySqlCommand cmd = new MySqlCommand(); + connection.OpenConnection(true); + totalRecords = PersonalizationProviderProcedures.myaspnet_PersonalizationAdministration_FindState(true, ApplicationId, ApplicationName, pageIndex, pageSize, + path, null, DateTime.MinValue, connection, ref cmd); + + PersonalizationStateInfoCollection sharedStateInfoCollection = new PersonalizationStateInfoCollection(); + + using (var reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + string pathQuery = reader.GetString("Path"); + DateTime lastUpdatedDate = (reader.IsDBNull(1)) ? DateTime.MinValue : + DateTime.SpecifyKind(reader.GetDateTime(1), DateTimeKind.Utc); + int size = (reader.IsDBNull(2)) ? 0 : reader.GetInt32("SharedDataLength"); + int userDataLength = (reader.IsDBNull(3)) ? 0 : reader.GetInt32("UserDataLength"); + int userCount = (reader.IsDBNull(4)) ? 0 : reader.GetInt32("UserCount"); + + sharedStateInfoCollection.Add(new SharedPersonalizationStateInfo( + pathQuery, lastUpdatedDate, size, userDataLength, userCount)); + } + } + connection.CloseConnection(); + return sharedStateInfoCollection; + } + catch (Exception ex) + { + if (writeExceptionsToEventLog) + WriteToEventLog(ex, "MySQLPersonalizationProvider - FindSharedState"); + throw; + } + finally + { + connection.CloseConnection(); + } + } + + private PersonalizationStateInfoCollection FindUserState(string path, DateTime inactiveSinceDate, string userName, int pageIndex, int pageSize, out int totalRecords) + { + MySQLPersonalizationConnectionHelper connection = new MySQLPersonalizationConnectionHelper(connectionString); + + try + { + + MySqlCommand cmd = new MySqlCommand(); + connection.OpenConnection(true); + totalRecords = PersonalizationProviderProcedures.myaspnet_PersonalizationAdministration_FindState(false, ApplicationId, ApplicationName, pageIndex, pageSize, + path, userName, inactiveSinceDate, connection, ref cmd); + + PersonalizationStateInfoCollection stateInfoCollection = new PersonalizationStateInfoCollection(); + + using (var reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + string pathQuery = reader.GetString("Path"); + DateTime lastUpdatedDate = DateTime.SpecifyKind(reader.GetDateTime("LastUpdatedDate"), DateTimeKind.Utc); + int size = reader.GetInt32("Size"); + string usernameQuery = reader.GetString("name"); + DateTime lastActivityDate = DateTime.SpecifyKind(reader.GetDateTime("LastActivityDate"), DateTimeKind.Utc); + stateInfoCollection.Add(new UserPersonalizationStateInfo(pathQuery, lastActivityDate, size, usernameQuery, lastActivityDate)); + } + } + connection.CloseConnection(); + + return stateInfoCollection; + } + catch (Exception ex) + { + if (writeExceptionsToEventLog) + WriteToEventLog(ex, "MySQLPersonalizationProvider - FindUserState"); + throw; + } + finally + { + connection.CloseConnection(); + } + } + + private int GetCountOfSharedState(string path) + { + MySQLPersonalizationConnectionHelper connection = new MySQLPersonalizationConnectionHelper(connectionString); + try + { + MySqlCommand cmd = new MySqlCommand(); + connection.OpenConnection(true); + return PersonalizationProviderProcedures.myaspnet_PersonalizationAdministration_GetCountOfState( + true, ApplicationName, ApplicationId, path, + null, DateTime.MinValue, connection); + } + catch (Exception ex) + { + if (writeExceptionsToEventLog) + WriteToEventLog(ex, "MySQLPersonalizationProvider - GetCountOfSharedState"); + throw; + } + finally + { + connection.CloseConnection(); + } + } + + private int GetCountUserState(string path, DateTime userInactiveSinceDate, string userName) + { + MySQLPersonalizationConnectionHelper connection = new MySQLPersonalizationConnectionHelper(connectionString); + try + { + MySqlCommand cmd = new MySqlCommand(); + connection.OpenConnection(true); + return PersonalizationProviderProcedures.myaspnet_PersonalizationAdministration_GetCountOfState( + false, ApplicationName, ApplicationId, path, + userName, userInactiveSinceDate, connection); + } + catch (Exception ex) + { + if (writeExceptionsToEventLog) + WriteToEventLog(ex, "MySQLPersonalizationProvider - GetCountUserState"); + throw; + } + finally + { + connection.CloseConnection(); + } + } + + private int ResetUserState(ResetUserStateMode mode, DateTime userInactiveSinceDate, string[] paths, string[] usernames) + { + var connection = new MySQLPersonalizationConnectionHelper(connectionString); + connection.OpenConnection(true); + + try + { + if (ResetUserStateMode.PerInactiveDate == mode) + { + return PersonalizationProviderProcedures.my_aspnet_PersonalizationAdministration_ResetUserState(ApplicationId, userInactiveSinceDate.ToUniversalTime(), null, null, connection); + } + if (ResetUserStateMode.PerPaths == mode) + { + return PersonalizationProviderProcedures.my_aspnet_PersonalizationAdministration_ResetUserState(ApplicationId, userInactiveSinceDate, null, paths, connection); + } + else + { + return PersonalizationProviderProcedures.my_aspnet_PersonalizationAdministration_ResetUserState(ApplicationId, userInactiveSinceDate, usernames, paths, connection); + } + } + catch (Exception ex) + { + if (writeExceptionsToEventLog) + WriteToEventLog(ex, "MySQLPersonalizationProvider - ResetUserState"); + throw; + } + finally + { + connection.CloseConnection(); + } + } + + private void WriteToEventLog(Exception e, string action) + { + using (EventLog log = new EventLog()) + { + log.Source = eventSource; + log.Log = eventLog; + string message = exceptionMessage + Environment.NewLine + Environment.NewLine; + message += "Action: " + action + Environment.NewLine + Environment.NewLine; + message += "Exception: " + e; + log.WriteEntry(message); + } + } + + } +} diff --git a/Source/MySql.Web/PersonalizationProviderProcedures.cs b/MySql.Web/src/PersonalizationProviderProcedures.cs similarity index 89% rename from Source/MySql.Web/PersonalizationProviderProcedures.cs rename to MySql.Web/src/PersonalizationProviderProcedures.cs index b5a1a084e..7a150871a 100644 --- a/Source/MySql.Web/PersonalizationProviderProcedures.cs +++ b/MySql.Web/src/PersonalizationProviderProcedures.cs @@ -1,691 +1,698 @@ -// Copyright © 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -namespace MySql.Web.Personalization -{ - internal class PersonalizationProviderProcedures - { - - /// - /// Retrieves profile data from my_aspnet_PersonalizationAllUsers or my_aspnet_PersonalizationPerUser meeting several input criteria. - /// - internal static int myaspnet_PersonalizationAdministration_FindState(bool allUsersScope, long applicationId, string applicationName, int pageIndex, int pageSize, string path, string userName, - DateTime inactiveSinceDate, MySQLPersonalizationConnectionHelper connection, ref MySqlCommand findStateCommand) - { - // create memory table to store results - - var sql = "CREATE TEMPORARY TABLE IF NOT EXISTS pageIndexResults(" + - "IndexId int AUTO_INCREMENT NOT NULL PRIMARY KEY, " + - "ItemId int not null)"; - - if (!connection.Opened) - throw new Exception("Error: Connection should be open"); - - var cmd = new MySqlCommand(sql, connection.Connection); - cmd.ExecuteNonQuery(); - - //make sure table is empty - cmd.CommandText = "TRUNCATE TABLE pageIndexResults"; - cmd.Connection = connection.Connection; - cmd.ExecuteNonQuery(); - - int pageLowerBound = pageSize * pageIndex; - int pageUpperBound = pageSize - 1 + pageLowerBound; - - - if (allUsersScope) - { - - var query = "INSERT INTO pageIndexResults (ItemId) (" + - "SELECT myaspnet_Paths.PathId " + - "FROM myaspnet_Paths, " + - "((SELECT aspnet_Paths.PathId " + - "FROM myaspnet_PersonalizationAllUsers, aspnet_Paths " + - "WHERE myaspnet_Paths.ApplicationId = @ApplicationId " + - "AND aspnet_PersonalizationAllUsers.PathId = aspnet_Paths.PathId " + - "AND (@Path IS NULL OR aspnet_Paths.LoweredPath LIKE @Path) " + - ") AS SharedDataPerPath " + - "FULL OUTER JOIN " + - "(SELECT DISTINCT aspnet_Paths.PathId " + - "FROM my_aspnet_personalizationperuser, my_aspnet_paths " + - "WHERE my_aspnet_paths.ApplicationId = @ApplicationId " + - "AND my_aspnet_personalizationperuser.PathId = aspnet_Paths.PathId " + - "AND (@Path IS NULL OR my_aspnet_paths.LoweredPath LIKE @Path) " + - ") AS UserDataPerPath " + - "ON SharedDataPerPath.PathId = UserDataPerPath.PathId " + - ") " + - "WHERE my_aspnet_Paths.PathId = SharedDataPerPath.PathId OR my_aspnet_Paths.PathId = UserDataPerPath.PathId " + - "ORDER BY my_aspnet_Paths.Path ASC)"; - - cmd.CommandText = query; - cmd.Parameters.AddWithValue("@ApplicationId", applicationId); - cmd.Parameters.AddWithValue("@Path", path); - cmd.Connection = connection.Connection; - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT Count(PathId) FROM pageIndexResults"; - cmd.Connection = connection.Connection; - int totalRecords = (int)cmd.ExecuteScalar(); - - query = "SELECT my_aspnet_Paths.Path, " + - "SharedDataPerPath.LastUpdatedDate, " + - "SharedDataPerPath.SharedDataLength, " + - "UserDataPerPath.UserDataLength, " + - "UserDataPerPath.UserCount " + - "FROM aspnet_Paths, " + - "((SELECT pageIndexResults.ItemId AS PathId, " + - "aspnet_PersonalizationAllUsers.LastUpdatedDate AS LastUpdatedDate, " + - "LENGTH(aspnet_PersonalizationAllUsers.PageSettings) AS SharedDataLength " + - "FROM my_aspnet_personalizationallusers, PageIndex " + - "WHERE my_aspnet_personalizationallusers.PathId = pageIndexResults.IndexId " + - "AND pageIndexResults.IndexId >= @PageLowerBound AND pageIndexResults.IndexId <= @PageUpperBound " + - ") AS SharedDataPerPath " + - "FULL OUTER JOIN " + - "(SELECT pageIndexResults.ItemId AS PathId, " + - "SUM(LENGTH(my_aspnet_personalizationperuser.PageSettings)) AS UserDataLength, " + - "COUNT(*) AS UserCount " + - "FROM my_aspnet_personalizationperuser, pageIndexResults " + - "WHERE my_aspnet_personalizationperuser.PathId = pageIndexResults.IndexId " + - "AND pageIndexResults.IndexId >= @PageLowerBound AND pageIndexResults.IndexId <= @PageUpperBound " + - "GROUP BY pageIndexResults.IndexId " + - ") AS UserDataPerPath " + - "ON SharedDataPerPath.PathId = UserDataPerPath.PathId " + - ") " + - "WHERE aspnet_Paths.PathId = SharedDataPerPath.PathId OR aspnet_Paths.PathId = UserDataPerPath.PathId " + - "ORDER BY my_aspnet_Paths.Path ASC "; - - findStateCommand.CommandText = query; - findStateCommand.Connection = connection.Connection; - findStateCommand.Parameters.AddWithValue("@PageLowerBound", pageLowerBound); - findStateCommand.Parameters.AddWithValue("@PageUpperBound", pageUpperBound); - - return totalRecords; - } - else - { - var query = "INSERT INTO pageIndexResults (ItemId) (" + - "SELECT my_aspnet_personalizationperuser.Id " + - "FROM my_aspnet_personalizationperuser, my_aspnet_users, my_aspnet_paths " + - "WHERE my_aspnet_paths.ApplicationId = @ApplicationId " + - "AND my_aspnet_personalizationperuser.UserId = my_aspnet_Users.Id " + - "AND my_aspnet_personalizationperuser.PathId = my_aspnet_Paths.PathId " + - "AND (@Path IS NULL OR my_aspnet_paths.LoweredPath LIKE @Path) " + - "AND (@UserName IS NULL OR my_aspnet_users.name LIKE @UserName) " + - "AND (@InactiveSinceDate IS NULL OR my_aspnet_users.LastActivityDate <= @InactiveSinceDate) " + - "ORDER BY my_aspnet_paths.Path ASC, my_aspnet_users.name ASC )"; - - cmd.CommandText = query; - cmd.Parameters.AddWithValue("@ApplicationId", applicationId); - cmd.Parameters.AddWithValue("@Path", path); - cmd.Parameters.AddWithValue("@UserName", userName); - cmd.Parameters.AddWithValue("@InactiveSinceDate", inactiveSinceDate); - cmd.Connection = connection.Connection; - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT Count(IndexId) FROM pageIndexResults"; - cmd.Connection = connection.Connection; - var totalRecords = cmd.ExecuteScalar().ToString(); - - query = "SELECT my_aspnet_Paths.Path, my_aspnet_personalizationperuser.LastUpdatedDate, LENGTH(my_aspnet_personalizationperuser.PageSettings) as Size, my_aspnet_Users.Name, my_aspnet_Users.LastActivityDate " + - "FROM my_aspnet_personalizationperuser, my_aspnet_users, my_aspnet_paths, pageIndexResults " + - "WHERE my_aspnet_personalizationperuser.Id = PageIndexResults.IndexId " + - "AND my_aspnet_personalizationperuser.UserId = my_aspnet_users.Id " + - "AND my_aspnet_personalizationperuser.PathId = my_aspnet_paths.PathId " + - "AND pageIndexResults.ItemId >= @PageLowerBound AND PageIndexResults.ItemId <= @PageUpperBound " + - "ORDER BY my_aspnet_paths.Path ASC, my_aspnet_users.name ASC "; - - findStateCommand.CommandText = query; - findStateCommand.Parameters.AddWithValue("@PageUpperBound", pageUpperBound); - findStateCommand.Parameters.AddWithValue("@PageLowerBound", pageLowerBound); - findStateCommand.Connection = connection.Connection; - - return int.Parse(totalRecords); - } - } - - - internal static int myaspnet_PersonalizationAdministration_GetCountOfState(bool allUsersScope, string applicationName, long applicationId, string path, string userName, DateTime inactiveSinceDate, MySQLPersonalizationConnectionHelper connection) - { - if (applicationId <= 0) - return 0; - - if (!connection.Opened) - throw new Exception("Error: Connection should be open"); - - if (allUsersScope) - { - - MySqlCommand cmd = new MySqlCommand("Select count(*) from my_aspnet_personalizationallusers, my_aspnet_paths " + - "where my_aspnet_paths.applicationId = @ApplicationId and " + - "my_aspnet_personalizationallusers.pathid = my_aspnet_paths.pathid and " + - "(@Path is null or my_aspnet_paths.loweredpath like lower(@Path))", connection.Connection); - - cmd.Parameters.AddWithValue("@ApplicationId", applicationId); - cmd.Parameters.AddWithValue("@Path", path); - cmd.Connection = connection.Connection; - var count = cmd.ExecuteScalar().ToString(); - return int.Parse(count); - } - else { - MySqlCommand cmd = new MySqlCommand("Select count(*) from my_aspnet_personalizationperuser as peruser, my_aspnet_users as users, "+ - "my_aspnet_paths as paths " + - "where paths.applicationId = @ApplicationId and " + - "peruser.userid = users.id and " + - "peruser.pathId = paths.pathId and " + - "(@Path is null or paths.loweredpath like lower(@Path) and " + - "(@UserName is null or users.name like lower(@UserName))) and " + - "(@InactiveSinceDate is null or users.lastactivitydate <= @InactiveSinceDate) ", connection.Connection); - - cmd.Parameters.AddWithValue("@ApplicationId", applicationId); - cmd.Parameters.AddWithValue("@Path", path); - cmd.Parameters.AddWithValue("@UserName", userName); - cmd.Parameters.AddWithValue("@InactiveSinceDate", inactiveSinceDate); - cmd.Connection = connection.Connection; - var count = cmd.ExecuteScalar().ToString(); - return int.Parse(count); - } - } - - - internal static Byte[] my_aspnet_PersonalizationPerUser_GetPageSettings(long applicationId, string path, string userName, DateTime currentTimeUtc, MySQLPersonalizationConnectionHelper connection) - { - if (applicationId <= 0) - return null; - - if (!connection.Opened) - throw new Exception("Error: Connection should be open"); - - //get pathid - var cmd = new MySqlCommand("select pathId from my_aspnet_paths where applicationid = @ApplicationId and loweredpath = lower(@Path)", connection.Connection); - cmd.Connection = connection.Connection; - - cmd.Parameters.AddWithValue("@ApplicationId", applicationId); - cmd.Parameters.AddWithValue("@Path", path); - - var pathId = (cmd.ExecuteScalar() ?? "").ToString(); - - if (string.IsNullOrEmpty(pathId)) - return null; - - cmd = new MySqlCommand("select Id from my_aspnet_users where applicationid = @ApplicationId and name = @UserName", connection.Connection); - cmd.Connection = connection.Connection; - cmd.Parameters.AddWithValue("@ApplicationId", applicationId); - cmd.Parameters.AddWithValue("@UserName", userName); - - - var userId = (cmd.ExecuteScalar() ?? "").ToString(); - userId = string.IsNullOrEmpty(userId) ? "0" : userId; - - if (int.Parse(userId) == 0) - return null; - - UpdateUserLastActiveDate(connection.Connection, int.Parse(userId), currentTimeUtc); - - cmd = new MySqlCommand("select pagesettings from my_aspnet_personalizationperuser as peruser where peruser.pathid = @PathId and peruser.userid = @UserId"); - cmd.Connection = connection.Connection; - cmd.Parameters.AddWithValue("@PathId", pathId); - cmd.Parameters.AddWithValue("@UserId", userId); - - var reader = cmd.ExecuteReader(); - - byte[] settings = null; - while (reader.Read()) - { - int size = (int)reader.GetBytes(0, 0, null, 0, 0); - settings = new byte[size]; - reader.GetBytes(0, 0, settings, 0, size); - } - reader.Close(); - return settings; - } - - - internal static byte[] my_aspnet_PersonalizationAllUsers_GetPageSettings(long applicationId, string path, MySQLPersonalizationConnectionHelper connection) - { - if (applicationId <= 0) - return null; - - if (!connection.Opened) - throw new Exception("Error: Connection should be open"); - - var cmd = new MySqlCommand("Select pathid from my_aspnet_paths as paths where paths.applicationid = @ApplicationId and paths.loweredPath = lower(@Path)", connection.Connection); - cmd.Parameters.AddWithValue("@ApplicationId", applicationId); - cmd.Parameters.AddWithValue("@Path", path); - var pathId = (string)cmd.ExecuteScalar(); - - if (!string.IsNullOrEmpty(pathId)) - { - cmd.CommandText = "Select PageSettings from my_aspnet_personalizationallusers where pathId = @PathId"; - cmd.Parameters.AddWithValue("@PathId", pathId); - cmd.Connection = connection.Connection; - var reader = cmd.ExecuteReader(); - - byte[] settings = null; - while (reader.Read()) - { - int size = (int)reader.GetBytes(0, 0, null, 0, 0); - settings = new byte[size]; - reader.GetBytes(0, 0, settings, 0, size); - } - reader.Close(); - return settings; - } - - return null; - } - - - internal static void my_aspnet_PersonalizationPerUser_ResetPageSettings(long applicationId, string userName, string path, DateTime currentTimeUtc, MySQLPersonalizationConnectionHelper connection) - { - - if (applicationId <= 0) - return; - - if (!connection.Opened) - throw new Exception("Error: Connection should be open"); - - var cmd = new MySqlCommand("Select pathid from my_aspnet_paths as paths where paths.applicationid = @ApplicationId and paths.loweredPath = lower(@Path)", connection.Connection); - cmd.Parameters.AddWithValue("@ApplicationId", applicationId); - cmd.Parameters.AddWithValue("@Path", path); - var pathId = (string)cmd.ExecuteScalar(); - - if (!string.IsNullOrEmpty(pathId)) - { - cmd = new MySqlCommand("select Id from my_aspnet_users where applicationid = @ApplicationId and name = @UserName", connection.Connection); - cmd.Connection = connection.Connection; - cmd.Parameters.AddWithValue("@ApplicationId", applicationId); - cmd.Parameters.AddWithValue("@UserName", userName); - - var userId = (int)cmd.ExecuteScalar(); - if (userId != 0) - { - var rows = UpdateUserLastActiveDate(connection.Connection, userId, currentTimeUtc); - if (rows != 0) - { - cmd = new MySqlCommand("delete from my_aspnet_personalizationperuser WHERE pathId = @PathId AND userId = @UserId"); - cmd.Connection = connection.Connection; - cmd.Parameters.AddWithValue("@PathId", pathId); - cmd.Parameters.AddWithValue("@UserId", userId); - cmd.ExecuteNonQuery(); - } - } - } - } - - internal static void my_aspnet_PersonalizationAllUsers_ResetPageSettings(long applicationId, string path, MySQLPersonalizationConnectionHelper connection) - { - - if (applicationId <= 0) - return; - - if (!connection.Opened) - throw new Exception("Error: Connection should be open"); - - var cmd = new MySqlCommand("Select pathid from my_aspnet_paths as paths where paths.applicationid = @ApplicationId and paths.loweredPath = lower(@Path)", connection.Connection); - cmd.Parameters.AddWithValue("@ApplicationId", applicationId); - cmd.Parameters.AddWithValue("@Path", path); - var pathId = (cmd.ExecuteScalar() ?? "").ToString(); - - if (!string.IsNullOrEmpty(pathId)) - { - cmd = new MySqlCommand("delete my_aspnet_personalizationallusers.* from my_aspnet_personalizationallusers WHERE pathId = @PathId"); - cmd.Connection = connection.Connection; - cmd.Parameters.AddWithValue("@PathId", pathId); - cmd.ExecuteNonQuery(); - } - - } - - - private static int UpdateUserLastActiveDate(MySqlConnection cnn, int userId, DateTime currentTimeUtc) - { - MySqlTransaction trans; - trans = cnn.BeginTransaction(); - try - { - var cmd = new MySqlCommand("update my_aspnet_users set lastactivitydate = @CurrentTimeUtc where id = @UserId"); - cmd.Connection = cnn; - cmd.Transaction = trans; - cmd.Parameters.AddWithValue("@CurrentTimeUtc", currentTimeUtc); - cmd.Parameters.AddWithValue("@UserId", userId); - var rows = cmd.ExecuteNonQuery(); - trans.Commit(); - return rows; - } - catch - { - trans.Rollback(); - throw; - } - } - - - internal static int my_aspnet_PersonalizationAdministration_ResetUserState(long applicationId, DateTime inactiveSinceDate,string[] usernames, string[] paths, MySQLPersonalizationConnectionHelper connection) - { - if (applicationId <= 0) - return 0; - - if (!connection.Opened) - throw new Exception("Error: Connection should be open"); - - var rows = 0; - var cmd = new MySqlCommand(); - if (usernames == null) usernames = new string[1] { "" }; - if (paths == null ) paths = new string[1] { "" }; - - foreach (var username in usernames) - { - foreach (var path in paths) - { - var query = "DELETE peruser.* FROM (my_aspnet_personalizationperuser as peruser " + - "INNER JOIN my_aspnet_users as users ON " + - "peruser.userid = users.id) " + - "INNER JOIN my_aspnet_paths as paths ON " + - "paths.applicationId = @ApplicationId AND " + - "paths.pathid = peruser.pathid AND " + - "(@InactiveSinceDate is null OR users.lastactivitydate <= @InactiveSinceDate) "; - query = string.IsNullOrEmpty(username) ? query : query += " AND (@UserName is null OR users.name = @UserName) "; - query = string.IsNullOrEmpty(path) ? query : query += " AND (@Path is null OR paths.loweredpath = LOWER(@Path))"; - cmd.CommandText = query; - cmd.Parameters.AddWithValue("@ApplicationId", applicationId); - cmd.Parameters.AddWithValue("@InactiveSinceDate", inactiveSinceDate); - cmd.Parameters.AddWithValue("@Path", path); - cmd.Parameters.AddWithValue("@UserName", username); - cmd.Connection = connection.Connection; - rows += cmd.ExecuteNonQuery(); - } - } - - return rows; - } - - - internal static int my_aspnet_PersonalizationAdministration_DeleteAllState(long applicationId, bool allUsersScope, MySQLPersonalizationConnectionHelper connection) - { - if (applicationId <= 0) - return 0; - - if (!connection.Opened) - throw new Exception("Error: Connection should be open"); - - var cmd = new MySqlCommand(); - cmd.Connection = connection.Connection; - - if (allUsersScope) - { - cmd.CommandText = "DELETE FROM my_aspnet_personalizationallusers " + - "WHERE PathId IN (SELECT Paths.PathId FROM my_aspnet_paths as paths " + - "WHERE paths.ApplicationId = @ApplicationId)"; - cmd.Parameters.AddWithValue("@ApplicationId", applicationId); - } - else - { - cmd.CommandText = "DELETE FROM my_aspnet_personalizationperuser " + - "WHERE PathId IN (SELECT Paths.PathId FROM my_aspnet_paths as paths " + - "WHERE paths.ApplicationId = @ApplicationId)"; - cmd.Parameters.AddWithValue("@ApplicationId", applicationId); - } - - var rows = cmd.ExecuteNonQuery(); - return rows; - } - - internal static int my_aspnet_PersonalizationAdministration_ResetSharedState(long applicationId, string[] paths, MySQLPersonalizationConnectionHelper connection) - { - if (applicationId <= 0) - return 0; - - if (!connection.Opened) - throw new Exception("Error: Connection should be open"); - - if (paths == null) - return 0; - - var cmd = new MySqlCommand(); - cmd.Connection = connection.Connection; - - var rows = 0; - - foreach (var path in paths) - { - cmd.CommandText = "DELETE my_aspnet_personalizationallusers.* FROM my_aspnet_personalizationallusers " + - "INNER JOIN my_aspnet_paths as paths ON " + - "((paths.ApplicationId = @ApplicationId AND " + - "my_aspnet_personalizationallusers.PathId = paths.PathId) AND " + - "paths.loweredpath = LOWER(@Path))"; - - cmd.Parameters.AddWithValue("@ApplicationId", applicationId); - cmd.Parameters.AddWithValue("@Path", path); - rows += cmd.ExecuteNonQuery(); - } - - return rows; - } - - - internal static int my_aspnet_PersonalizationAdministration_DeleteAllState(bool allUsersScope, long applicationId, MySQLPersonalizationConnectionHelper connection) - { - if (applicationId <= 0) - return 0; - - if (!connection.Opened) - throw new Exception("Error: Connection should be open"); - - var cmd = new MySqlCommand(); - cmd.Connection = connection.Connection; - - if (allUsersScope) - { - - cmd.CommandText = "DELETE FROM my_aspnet_personalizationallusers " + - "WHERE PathId IN " + - "(SELECT paths.PathId FROM my_aspnet_paths as paths " + - "WHERE paths.ApplicationId = @ApplicationId)"; - } - else - { - cmd.CommandText = "DELETE FROM my_aspnet_personalizationperuser " + - "WHERE PathId IN " + - "(SELECT Paths.PathId FROM my_aspnet_paths Paths " + - "WHERE Paths.ApplicationId = @ApplicationId)"; - } - cmd.Parameters.AddWithValue("@ApplicationId", applicationId); - var rows = cmd.ExecuteNonQuery(); - return rows; - } - - /// - /// Saves per-user state for the specified page and the specified user in the my_aspnet_PersonalizationPerUser table. - /// - /// - internal static int my_aspnet_PersonalizationPerUser_SetPageSettings(long applicationId, string userName, string path, byte[] settings, DateTime currentTimeUtc, MySQLPersonalizationConnectionHelper connection) - { - if (applicationId <= 0) - return 0; - - if (!connection.Opened) - throw new Exception("Error: Connection should be open"); - - var cmd = new MySqlCommand(); - cmd.Connection = connection.Connection; - - cmd.CommandText = "SELECT PathId FROM my_aspnet_paths WHERE ApplicationId = @ApplicationId AND LoweredPath = LOWER(@Path)"; - cmd.Parameters.AddWithValue("@ApplicationId", applicationId); - cmd.Parameters.AddWithValue("@Path", path); - var pathId = (string)cmd.ExecuteScalar(); - - cmd.Parameters.Clear(); - - if (pathId == null) - { - // create path - MySqlTransaction trans; - trans = connection.Connection.BeginTransaction(); - - try - { - cmd.Transaction = trans; - cmd.CommandText = "INSERT INTO my_aspnet_paths (applicationId, pathId, path, loweredpath) values (@ApplicationId, @PathId, @Path, LOWER(@Path))"; - cmd.Parameters.AddWithValue("@ApplicationId", applicationId); - cmd.Parameters.AddWithValue("@PathId", pathId = Guid.NewGuid().ToString()); - cmd.Parameters.AddWithValue("@Path", path); - cmd.ExecuteNonQuery(); - trans.Commit(); - } - catch - { - trans.Rollback(); - throw; - } - } - - cmd.Parameters.Clear(); - cmd.CommandText = "SELECT id FROM my_aspnet_users WHERE ApplicationId = @ApplicationId AND name = LOWER(@UserName)"; - cmd.Parameters.AddWithValue("@ApplicationId", applicationId); - cmd.Parameters.AddWithValue("@UserName", userName); - var userId = (cmd.ExecuteScalar() ?? "").ToString(); - - userId = string.IsNullOrEmpty(userId) ? "0" : userId; - - // create user - if (int.Parse(userId) == 0) - { - // create path - MySqlTransaction trans; - trans = connection.Connection.BeginTransaction(); - - try - { - cmd.Parameters.Clear(); - cmd.Transaction = trans; - cmd.CommandText = "INSERT INTO my_aspnet_users (applicationId, name, isAnonymous, lastActivityDate) values (@ApplicationId, @UserName, false, @CurrentTimeUtc)"; - cmd.Parameters.AddWithValue("@ApplicationId", applicationId); - cmd.Parameters.AddWithValue("@UserName", userName); - cmd.Parameters.AddWithValue("@CurrentTimeUtc", DateTime.UtcNow); - cmd.ExecuteNonQuery(); - trans.Commit(); - } - catch - { - trans.Rollback(); - throw; - } - - cmd.Parameters.Clear(); - cmd.CommandText = "SELECT Id from my_aspnet_users where applicationId = @ApplicationId and name = @UserName)"; - cmd.Parameters.AddWithValue("@ApplicationId", applicationId); - cmd.Parameters.AddWithValue("@UserName", userName); - userId = (string)cmd.ExecuteScalar(); - - } - var rows = UpdateUserLastActiveDate(connection.Connection, int.Parse(userId), DateTime.UtcNow); - if (rows == 0) - throw new Exception("User not found"); - - cmd.Parameters.Clear(); - cmd.CommandText = "Select COUNT(*) from my_aspnet_personalizationperuser where userid = @UserId and pathId = @PathId"; - cmd.Parameters.AddWithValue("@UserId", userId); - cmd.Parameters.AddWithValue("@PathId", pathId); - if ((long)cmd.ExecuteScalar() > 0) - { - cmd.Parameters.Clear(); - cmd.CommandText = "UPDATE my_aspnet_personalizationperuser SET PageSettings = @PageSettings, LastUpdatedDate = @CurrentTimeUtc " + - "where userid = @UserId and pathId = @PathId"; - cmd.Parameters.AddWithValue("@UserId", userId); - cmd.Parameters.AddWithValue("@PathId", pathId); - cmd.Parameters.AddWithValue("@PageSettings", settings); - cmd.Parameters.AddWithValue("@CurrentTimeUtc", DateTime.UtcNow); - cmd.ExecuteNonQuery(); - } - else { - cmd.Parameters.Clear(); - cmd.CommandText = "INSERT INTO my_aspnet_personalizationperuser(applicationId, pathId, userId, pageSettings, lastUpdatedDate) VALUES(@applicationId, @PathId, @userId, @PageSettings, @LastUpdatedDate)"; - cmd.Parameters.AddWithValue("@applicationId", applicationId); - cmd.Parameters.AddWithValue("@UserId", userId); - cmd.Parameters.AddWithValue("@PathId", pathId); - cmd.Parameters.AddWithValue("@PageSettings", settings); - cmd.Parameters.AddWithValue("@LastUpdatedDate", DateTime.UtcNow); - rows = cmd.ExecuteNonQuery(); - } - return rows; - } - - /// - /// Saves shared state for the specified page in the aspnet_PersonalizationAllUsers table - /// - /// - internal static int my_aspnet_PersonalizationAllUsers_SetPageSettings(long applicationId, string path, byte[] settings, DateTime currentTimeUtc, MySQLPersonalizationConnectionHelper connection) - { - if (applicationId <= 0) - return 0; - - if (!connection.Opened) - throw new Exception("Error: Connection should be open"); - - var cmd = new MySqlCommand(); - cmd.Connection = connection.Connection; - - cmd.CommandText = "SELECT PathId FROM my_aspnet_paths WHERE ApplicationId = @ApplicationId AND LoweredPath = LOWER(@Path)"; - cmd.Parameters.AddWithValue("@ApplicationId", applicationId); - cmd.Parameters.AddWithValue("@Path", path); - var pathId = (string)cmd.ExecuteScalar(); - cmd.Parameters.Clear(); - - if (pathId == null) - { - // create path - MySqlTransaction trans; - trans = connection.Connection.BeginTransaction(); - - try - { - cmd.Transaction = trans; - cmd.CommandText = "INSERT INTO my_aspnet_paths (applicationId, pathId, path, loweredpath) values (@ApplicationId, @PathId, @Path, LOWER(@Path))"; - cmd.Parameters.AddWithValue("@ApplicationId", applicationId); - cmd.Parameters.AddWithValue("@PathId", pathId = Guid.NewGuid().ToString()); - cmd.Parameters.AddWithValue("@Path", path); - cmd.ExecuteNonQuery(); - trans.Commit(); - } - catch - { - trans.Rollback(); - throw; - } - } - - cmd.CommandText = "INSERT INTO my_aspnet_personalizationallusers(PathId, PageSettings, LastUpdatedDate) VALUES (@PathId, @PageSettings, @CurrentTimeUtc)"; - cmd.CommandText += " ON DUPLICATE KEY UPDATE PageSettings=Values(PageSettings), LastUpdatedDate=Values(LastUpdatedDate)"; - cmd.Parameters.Clear(); - cmd.Parameters.AddWithValue("@PageSettings", settings); - cmd.Parameters.AddWithValue("@PathId", pathId); - cmd.Parameters.AddWithValue("@CurrentTimeUtc", currentTimeUtc); - var rows = cmd.ExecuteNonQuery(); - return rows; - } - } -} +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using System; +using System.Globalization; + +namespace MySql.Web.Personalization +{ + internal class PersonalizationProviderProcedures + { + + /// + /// Retrieves profile data from my_aspnet_PersonalizationAllUsers or my_aspnet_PersonalizationPerUser meeting several input criteria. + /// + internal static int myaspnet_PersonalizationAdministration_FindState(bool allUsersScope, long applicationId, string applicationName, int pageIndex, int pageSize, string path, string userName, + DateTime inactiveSinceDate, MySQLPersonalizationConnectionHelper connection, ref MySqlCommand findStateCommand) + { + // create memory table to store results + + var sql = "CREATE TEMPORARY TABLE IF NOT EXISTS pageIndexResults(" + + "IndexId int AUTO_INCREMENT NOT NULL PRIMARY KEY, " + + "ItemId int not null)"; + + if (!connection.Opened) + throw new Exception("Error: Connection should be open"); + + var cmd = new MySqlCommand(sql, connection.Connection); + cmd.ExecuteNonQuery(); + + //make sure table is empty + cmd.CommandText = "TRUNCATE TABLE pageIndexResults"; + cmd.Connection = connection.Connection; + cmd.ExecuteNonQuery(); + + int pageLowerBound = pageSize * pageIndex; + int pageUpperBound = pageSize - 1 + pageLowerBound; + + + if (allUsersScope) + { + + var query = "INSERT INTO pageIndexResults (ItemId) (" + + "SELECT myaspnet_Paths.PathId " + + "FROM myaspnet_Paths, " + + "((SELECT aspnet_Paths.PathId " + + "FROM myaspnet_PersonalizationAllUsers, aspnet_Paths " + + "WHERE myaspnet_Paths.ApplicationId = @ApplicationId " + + "AND aspnet_PersonalizationAllUsers.PathId = aspnet_Paths.PathId " + + "AND (@Path IS NULL OR aspnet_Paths.LoweredPath LIKE @Path) " + + ") AS SharedDataPerPath " + + "FULL OUTER JOIN " + + "(SELECT DISTINCT aspnet_Paths.PathId " + + "FROM my_aspnet_personalizationperuser, my_aspnet_paths " + + "WHERE my_aspnet_paths.ApplicationId = @ApplicationId " + + "AND my_aspnet_personalizationperuser.PathId = aspnet_Paths.PathId " + + "AND (@Path IS NULL OR my_aspnet_paths.LoweredPath LIKE @Path) " + + ") AS UserDataPerPath " + + "ON SharedDataPerPath.PathId = UserDataPerPath.PathId " + + ") " + + "WHERE my_aspnet_Paths.PathId = SharedDataPerPath.PathId OR my_aspnet_Paths.PathId = UserDataPerPath.PathId " + + "ORDER BY my_aspnet_Paths.Path ASC)"; + + cmd.CommandText = query; + cmd.Parameters.AddWithValue("@ApplicationId", applicationId); + cmd.Parameters.AddWithValue("@Path", path); + cmd.Connection = connection.Connection; + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT Count(PathId) FROM pageIndexResults"; + cmd.Connection = connection.Connection; + int totalRecords = (int)cmd.ExecuteScalar(); + + query = "SELECT my_aspnet_Paths.Path, " + + "SharedDataPerPath.LastUpdatedDate, " + + "SharedDataPerPath.SharedDataLength, " + + "UserDataPerPath.UserDataLength, " + + "UserDataPerPath.UserCount " + + "FROM aspnet_Paths, " + + "((SELECT pageIndexResults.ItemId AS PathId, " + + "aspnet_PersonalizationAllUsers.LastUpdatedDate AS LastUpdatedDate, " + + "LENGTH(aspnet_PersonalizationAllUsers.PageSettings) AS SharedDataLength " + + "FROM my_aspnet_personalizationallusers, PageIndex " + + "WHERE my_aspnet_personalizationallusers.PathId = pageIndexResults.IndexId " + + "AND pageIndexResults.IndexId >= @PageLowerBound AND pageIndexResults.IndexId <= @PageUpperBound " + + ") AS SharedDataPerPath " + + "FULL OUTER JOIN " + + "(SELECT pageIndexResults.ItemId AS PathId, " + + "SUM(LENGTH(my_aspnet_personalizationperuser.PageSettings)) AS UserDataLength, " + + "COUNT(*) AS UserCount " + + "FROM my_aspnet_personalizationperuser, pageIndexResults " + + "WHERE my_aspnet_personalizationperuser.PathId = pageIndexResults.IndexId " + + "AND pageIndexResults.IndexId >= @PageLowerBound AND pageIndexResults.IndexId <= @PageUpperBound " + + "GROUP BY pageIndexResults.IndexId " + + ") AS UserDataPerPath " + + "ON SharedDataPerPath.PathId = UserDataPerPath.PathId " + + ") " + + "WHERE aspnet_Paths.PathId = SharedDataPerPath.PathId OR aspnet_Paths.PathId = UserDataPerPath.PathId " + + "ORDER BY my_aspnet_Paths.Path ASC "; + + findStateCommand.CommandText = query; + findStateCommand.Connection = connection.Connection; + findStateCommand.Parameters.AddWithValue("@PageLowerBound", pageLowerBound); + findStateCommand.Parameters.AddWithValue("@PageUpperBound", pageUpperBound); + + return totalRecords; + } + else + { + var query = "INSERT INTO pageIndexResults (ItemId) (" + + "SELECT my_aspnet_personalizationperuser.Id " + + "FROM my_aspnet_personalizationperuser, my_aspnet_users, my_aspnet_paths " + + "WHERE my_aspnet_paths.ApplicationId = @ApplicationId " + + "AND my_aspnet_personalizationperuser.UserId = my_aspnet_Users.Id " + + "AND my_aspnet_personalizationperuser.PathId = my_aspnet_Paths.PathId " + + "AND (@Path IS NULL OR my_aspnet_paths.LoweredPath LIKE @Path) " + + "AND (@UserName IS NULL OR my_aspnet_users.name LIKE @UserName) " + + "AND (@InactiveSinceDate IS NULL OR my_aspnet_users.LastActivityDate <= @InactiveSinceDate) " + + "ORDER BY my_aspnet_paths.Path ASC, my_aspnet_users.name ASC )"; + + cmd.CommandText = query; + cmd.Parameters.AddWithValue("@ApplicationId", applicationId); + cmd.Parameters.AddWithValue("@Path", path); + cmd.Parameters.AddWithValue("@UserName", userName); + cmd.Parameters.AddWithValue("@InactiveSinceDate", inactiveSinceDate); + cmd.Connection = connection.Connection; + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT Count(IndexId) FROM pageIndexResults"; + cmd.Connection = connection.Connection; + var totalRecords = cmd.ExecuteScalar().ToString(); + + query = "SELECT my_aspnet_Paths.Path, my_aspnet_personalizationperuser.LastUpdatedDate, LENGTH(my_aspnet_personalizationperuser.PageSettings) as Size, my_aspnet_Users.Name, my_aspnet_Users.LastActivityDate " + + "FROM my_aspnet_personalizationperuser, my_aspnet_users, my_aspnet_paths, pageIndexResults " + + "WHERE my_aspnet_personalizationperuser.Id = PageIndexResults.IndexId " + + "AND my_aspnet_personalizationperuser.UserId = my_aspnet_users.Id " + + "AND my_aspnet_personalizationperuser.PathId = my_aspnet_paths.PathId " + + "AND pageIndexResults.ItemId >= @PageLowerBound AND PageIndexResults.ItemId <= @PageUpperBound " + + "ORDER BY my_aspnet_paths.Path ASC, my_aspnet_users.name ASC "; + + findStateCommand.CommandText = query; + findStateCommand.Parameters.AddWithValue("@PageUpperBound", pageUpperBound); + findStateCommand.Parameters.AddWithValue("@PageLowerBound", pageLowerBound); + findStateCommand.Connection = connection.Connection; + + return int.Parse(totalRecords, CultureInfo.InvariantCulture); + } + } + + + internal static int myaspnet_PersonalizationAdministration_GetCountOfState(bool allUsersScope, string applicationName, long applicationId, string path, string userName, DateTime inactiveSinceDate, MySQLPersonalizationConnectionHelper connection) + { + if (applicationId <= 0) + return 0; + + if (!connection.Opened) + throw new Exception("Error: Connection should be open"); + + if (allUsersScope) + { + + MySqlCommand cmd = new MySqlCommand("Select count(*) from my_aspnet_personalizationallusers, my_aspnet_paths " + + "where my_aspnet_paths.applicationId = @ApplicationId and " + + "my_aspnet_personalizationallusers.pathid = my_aspnet_paths.pathid and " + + "(@Path is null or my_aspnet_paths.loweredpath like lower(@Path))", connection.Connection); + + cmd.Parameters.AddWithValue("@ApplicationId", applicationId); + cmd.Parameters.AddWithValue("@Path", path); + cmd.Connection = connection.Connection; + var count = cmd.ExecuteScalar().ToString(); + return int.Parse(count, CultureInfo.InvariantCulture); + } + else + { + MySqlCommand cmd = new MySqlCommand("Select count(*) from my_aspnet_personalizationperuser as peruser, my_aspnet_users as users, " + + "my_aspnet_paths as paths " + + "where paths.applicationId = @ApplicationId and " + + "peruser.userid = users.id and " + + "peruser.pathId = paths.pathId and " + + "(@Path is null or paths.loweredpath like lower(@Path) and " + + "(@UserName is null or users.name like lower(@UserName))) and " + + "(@InactiveSinceDate is null or users.lastactivitydate <= @InactiveSinceDate) ", connection.Connection); + + cmd.Parameters.AddWithValue("@ApplicationId", applicationId); + cmd.Parameters.AddWithValue("@Path", path); + cmd.Parameters.AddWithValue("@UserName", userName); + cmd.Parameters.AddWithValue("@InactiveSinceDate", inactiveSinceDate); + cmd.Connection = connection.Connection; + var count = cmd.ExecuteScalar().ToString(); + return int.Parse(count, CultureInfo.InvariantCulture); + } + } + + + internal static Byte[] my_aspnet_PersonalizationPerUser_GetPageSettings(long applicationId, string path, string userName, DateTime currentTimeUtc, MySQLPersonalizationConnectionHelper connection) + { + if (applicationId <= 0) + return null; + + if (!connection.Opened) + throw new Exception("Error: Connection should be open"); + + //get pathid + var cmd = new MySqlCommand("select pathId from my_aspnet_paths where applicationid = @ApplicationId and loweredpath = lower(@Path)", connection.Connection); + cmd.Connection = connection.Connection; + + cmd.Parameters.AddWithValue("@ApplicationId", applicationId); + cmd.Parameters.AddWithValue("@Path", path); + + var pathId = (cmd.ExecuteScalar() ?? "").ToString(); + + if (string.IsNullOrEmpty(pathId)) + return null; + + cmd = new MySqlCommand("select Id from my_aspnet_users where applicationid = @ApplicationId and name = @UserName", connection.Connection); + cmd.Connection = connection.Connection; + cmd.Parameters.AddWithValue("@ApplicationId", applicationId); + cmd.Parameters.AddWithValue("@UserName", userName); + + + var userId = (cmd.ExecuteScalar() ?? "").ToString(); + userId = string.IsNullOrEmpty(userId) ? "0" : userId; + + if (int.Parse(userId, CultureInfo.InvariantCulture) == 0) + return null; + + UpdateUserLastActiveDate(connection.Connection, int.Parse(userId, CultureInfo.InvariantCulture), currentTimeUtc); + + cmd = new MySqlCommand("select pagesettings from my_aspnet_personalizationperuser as peruser where peruser.pathid = @PathId and peruser.userid = @UserId"); + cmd.Connection = connection.Connection; + cmd.Parameters.AddWithValue("@PathId", pathId); + cmd.Parameters.AddWithValue("@UserId", userId); + + var reader = cmd.ExecuteReader(); + + byte[] settings = null; + while (reader.Read()) + { + int size = (int)reader.GetBytes(0, 0, null, 0, 0); + settings = new byte[size]; + reader.GetBytes(0, 0, settings, 0, size); + } + reader.Close(); + return settings; + } + + + internal static byte[] my_aspnet_PersonalizationAllUsers_GetPageSettings(long applicationId, string path, MySQLPersonalizationConnectionHelper connection) + { + if (applicationId <= 0) + return null; + + if (!connection.Opened) + throw new Exception("Error: Connection should be open"); + + var cmd = new MySqlCommand("Select pathid from my_aspnet_paths as paths where paths.applicationid = @ApplicationId and paths.loweredPath = lower(@Path)", connection.Connection); + cmd.Parameters.AddWithValue("@ApplicationId", applicationId); + cmd.Parameters.AddWithValue("@Path", path); + var pathId = (string)cmd.ExecuteScalar(); + + if (!string.IsNullOrEmpty(pathId)) + { + cmd.CommandText = "Select PageSettings from my_aspnet_personalizationallusers where pathId = @PathId"; + cmd.Parameters.AddWithValue("@PathId", pathId); + cmd.Connection = connection.Connection; + var reader = cmd.ExecuteReader(); + + byte[] settings = null; + while (reader.Read()) + { + int size = (int)reader.GetBytes(0, 0, null, 0, 0); + settings = new byte[size]; + reader.GetBytes(0, 0, settings, 0, size); + } + reader.Close(); + return settings; + } + + return null; + } + + + internal static void my_aspnet_PersonalizationPerUser_ResetPageSettings(long applicationId, string userName, string path, DateTime currentTimeUtc, MySQLPersonalizationConnectionHelper connection) + { + + if (applicationId <= 0) + return; + + if (!connection.Opened) + throw new Exception("Error: Connection should be open"); + + var cmd = new MySqlCommand("Select pathid from my_aspnet_paths as paths where paths.applicationid = @ApplicationId and paths.loweredPath = lower(@Path)", connection.Connection); + cmd.Parameters.AddWithValue("@ApplicationId", applicationId); + cmd.Parameters.AddWithValue("@Path", path); + var pathId = (string)cmd.ExecuteScalar(); + + if (!string.IsNullOrEmpty(pathId)) + { + cmd = new MySqlCommand("select Id from my_aspnet_users where applicationid = @ApplicationId and name = @UserName", connection.Connection); + cmd.Connection = connection.Connection; + cmd.Parameters.AddWithValue("@ApplicationId", applicationId); + cmd.Parameters.AddWithValue("@UserName", userName); + + var userId = (int)cmd.ExecuteScalar(); + if (userId != 0) + { + var rows = UpdateUserLastActiveDate(connection.Connection, userId, currentTimeUtc); + if (rows != 0) + { + cmd = new MySqlCommand("delete from my_aspnet_personalizationperuser WHERE pathId = @PathId AND userId = @UserId"); + cmd.Connection = connection.Connection; + cmd.Parameters.AddWithValue("@PathId", pathId); + cmd.Parameters.AddWithValue("@UserId", userId); + cmd.ExecuteNonQuery(); + } + } + } + } + + internal static void my_aspnet_PersonalizationAllUsers_ResetPageSettings(long applicationId, string path, MySQLPersonalizationConnectionHelper connection) + { + + if (applicationId <= 0) + return; + + if (!connection.Opened) + throw new Exception("Error: Connection should be open"); + + var cmd = new MySqlCommand("Select pathid from my_aspnet_paths as paths where paths.applicationid = @ApplicationId and paths.loweredPath = lower(@Path)", connection.Connection); + cmd.Parameters.AddWithValue("@ApplicationId", applicationId); + cmd.Parameters.AddWithValue("@Path", path); + var pathId = (cmd.ExecuteScalar() ?? "").ToString(); + + if (!string.IsNullOrEmpty(pathId)) + { + cmd = new MySqlCommand("delete my_aspnet_personalizationallusers.* from my_aspnet_personalizationallusers WHERE pathId = @PathId"); + cmd.Connection = connection.Connection; + cmd.Parameters.AddWithValue("@PathId", pathId); + cmd.ExecuteNonQuery(); + } + + } + + + private static int UpdateUserLastActiveDate(MySqlConnection cnn, int userId, DateTime currentTimeUtc) + { + MySqlTransaction trans; + trans = cnn.BeginTransaction(); + try + { + var cmd = new MySqlCommand("update my_aspnet_users set lastactivitydate = @CurrentTimeUtc where id = @UserId"); + cmd.Connection = cnn; + cmd.Transaction = trans; + cmd.Parameters.AddWithValue("@CurrentTimeUtc", currentTimeUtc); + cmd.Parameters.AddWithValue("@UserId", userId); + var rows = cmd.ExecuteNonQuery(); + trans.Commit(); + return rows; + } + catch + { + trans.Rollback(); + throw; + } + } + + + internal static int my_aspnet_PersonalizationAdministration_ResetUserState(long applicationId, DateTime inactiveSinceDate, string[] usernames, string[] paths, MySQLPersonalizationConnectionHelper connection) + { + if (applicationId <= 0) + return 0; + + if (!connection.Opened) + throw new Exception("Error: Connection should be open"); + + var rows = 0; + var cmd = new MySqlCommand(); + if (usernames == null) usernames = new string[1] { "" }; + if (paths == null) paths = new string[1] { "" }; + + foreach (var username in usernames) + { + foreach (var path in paths) + { + var query = "DELETE peruser.* FROM (my_aspnet_personalizationperuser as peruser " + + "INNER JOIN my_aspnet_users as users ON " + + "peruser.userid = users.id) " + + "INNER JOIN my_aspnet_paths as paths ON " + + "paths.applicationId = @ApplicationId AND " + + "paths.pathid = peruser.pathid AND " + + "(@InactiveSinceDate is null OR users.lastactivitydate <= @InactiveSinceDate) "; + query = string.IsNullOrEmpty(username) ? query : query += " AND (@UserName is null OR users.name = @UserName) "; + query = string.IsNullOrEmpty(path) ? query : query += " AND (@Path is null OR paths.loweredpath = LOWER(@Path))"; + cmd.CommandText = query; + cmd.Parameters.AddWithValue("@ApplicationId", applicationId); + cmd.Parameters.AddWithValue("@InactiveSinceDate", inactiveSinceDate); + cmd.Parameters.AddWithValue("@Path", path); + cmd.Parameters.AddWithValue("@UserName", username); + cmd.Connection = connection.Connection; + rows += cmd.ExecuteNonQuery(); + } + } + + return rows; + } + + + internal static int my_aspnet_PersonalizationAdministration_DeleteAllState(long applicationId, bool allUsersScope, MySQLPersonalizationConnectionHelper connection) + { + if (applicationId <= 0) + return 0; + + if (!connection.Opened) + throw new Exception("Error: Connection should be open"); + + var cmd = new MySqlCommand(); + cmd.Connection = connection.Connection; + + if (allUsersScope) + { + cmd.CommandText = "DELETE FROM my_aspnet_personalizationallusers " + + "WHERE PathId IN (SELECT Paths.PathId FROM my_aspnet_paths as paths " + + "WHERE paths.ApplicationId = @ApplicationId)"; + cmd.Parameters.AddWithValue("@ApplicationId", applicationId); + } + else + { + cmd.CommandText = "DELETE FROM my_aspnet_personalizationperuser " + + "WHERE PathId IN (SELECT Paths.PathId FROM my_aspnet_paths as paths " + + "WHERE paths.ApplicationId = @ApplicationId)"; + cmd.Parameters.AddWithValue("@ApplicationId", applicationId); + } + + var rows = cmd.ExecuteNonQuery(); + return rows; + } + + internal static int my_aspnet_PersonalizationAdministration_ResetSharedState(long applicationId, string[] paths, MySQLPersonalizationConnectionHelper connection) + { + if (applicationId <= 0) + return 0; + + if (!connection.Opened) + throw new Exception("Error: Connection should be open"); + + if (paths == null) + return 0; + + var cmd = new MySqlCommand(); + cmd.Connection = connection.Connection; + + var rows = 0; + + foreach (var path in paths) + { + cmd.CommandText = "DELETE my_aspnet_personalizationallusers.* FROM my_aspnet_personalizationallusers " + + "INNER JOIN my_aspnet_paths as paths ON " + + "((paths.ApplicationId = @ApplicationId AND " + + "my_aspnet_personalizationallusers.PathId = paths.PathId) AND " + + "paths.loweredpath = LOWER(@Path))"; + + cmd.Parameters.AddWithValue("@ApplicationId", applicationId); + cmd.Parameters.AddWithValue("@Path", path); + rows += cmd.ExecuteNonQuery(); + } + + return rows; + } + + + internal static int my_aspnet_PersonalizationAdministration_DeleteAllState(bool allUsersScope, long applicationId, MySQLPersonalizationConnectionHelper connection) + { + if (applicationId <= 0) + return 0; + + if (!connection.Opened) + throw new Exception("Error: Connection should be open"); + + var cmd = new MySqlCommand(); + cmd.Connection = connection.Connection; + + if (allUsersScope) + { + + cmd.CommandText = "DELETE FROM my_aspnet_personalizationallusers " + + "WHERE PathId IN " + + "(SELECT paths.PathId FROM my_aspnet_paths as paths " + + "WHERE paths.ApplicationId = @ApplicationId)"; + } + else + { + cmd.CommandText = "DELETE FROM my_aspnet_personalizationperuser " + + "WHERE PathId IN " + + "(SELECT Paths.PathId FROM my_aspnet_paths Paths " + + "WHERE Paths.ApplicationId = @ApplicationId)"; + } + cmd.Parameters.AddWithValue("@ApplicationId", applicationId); + var rows = cmd.ExecuteNonQuery(); + return rows; + } + + /// + /// Saves per-user state for the specified page and the specified user in the my_aspnet_PersonalizationPerUser table. + /// + /// + internal static int my_aspnet_PersonalizationPerUser_SetPageSettings(long applicationId, string userName, string path, byte[] settings, DateTime currentTimeUtc, MySQLPersonalizationConnectionHelper connection) + { + if (applicationId <= 0) + return 0; + + if (!connection.Opened) + throw new Exception("Error: Connection should be open"); + + var cmd = new MySqlCommand(); + cmd.Connection = connection.Connection; + + cmd.CommandText = "SELECT PathId FROM my_aspnet_paths WHERE ApplicationId = @ApplicationId AND LoweredPath = LOWER(@Path)"; + cmd.Parameters.AddWithValue("@ApplicationId", applicationId); + cmd.Parameters.AddWithValue("@Path", path); + var pathId = (string)cmd.ExecuteScalar(); + + cmd.Parameters.Clear(); + + if (pathId == null) + { + // create path + MySqlTransaction trans; + trans = connection.Connection.BeginTransaction(); + + try + { + cmd.Transaction = trans; + cmd.CommandText = "INSERT INTO my_aspnet_paths (applicationId, pathId, path, loweredpath) values (@ApplicationId, @PathId, @Path, LOWER(@Path))"; + cmd.Parameters.AddWithValue("@ApplicationId", applicationId); + cmd.Parameters.AddWithValue("@PathId", pathId = Guid.NewGuid().ToString()); + cmd.Parameters.AddWithValue("@Path", path); + cmd.ExecuteNonQuery(); + trans.Commit(); + } + catch + { + trans.Rollback(); + throw; + } + } + + cmd.Parameters.Clear(); + cmd.CommandText = "SELECT id FROM my_aspnet_users WHERE ApplicationId = @ApplicationId AND name = LOWER(@UserName)"; + cmd.Parameters.AddWithValue("@ApplicationId", applicationId); + cmd.Parameters.AddWithValue("@UserName", userName); + var userId = (cmd.ExecuteScalar() ?? "").ToString(); + + userId = string.IsNullOrEmpty(userId) ? "0" : userId; + + // create user + if (int.Parse(userId, CultureInfo.InvariantCulture) == 0) + { + // create path + MySqlTransaction trans; + trans = connection.Connection.BeginTransaction(); + + try + { + cmd.Parameters.Clear(); + cmd.Transaction = trans; + cmd.CommandText = "INSERT INTO my_aspnet_users (applicationId, name, isAnonymous, lastActivityDate) values (@ApplicationId, @UserName, false, @CurrentTimeUtc)"; + cmd.Parameters.AddWithValue("@ApplicationId", applicationId); + cmd.Parameters.AddWithValue("@UserName", userName); + cmd.Parameters.AddWithValue("@CurrentTimeUtc", DateTime.UtcNow); + cmd.ExecuteNonQuery(); + trans.Commit(); + } + catch + { + trans.Rollback(); + throw; + } + + cmd.Parameters.Clear(); + cmd.CommandText = "SELECT Id from my_aspnet_users where applicationId = @ApplicationId and name = @UserName)"; + cmd.Parameters.AddWithValue("@ApplicationId", applicationId); + cmd.Parameters.AddWithValue("@UserName", userName); + userId = (string)cmd.ExecuteScalar(); + + } + var rows = UpdateUserLastActiveDate(connection.Connection, int.Parse(userId, CultureInfo.InvariantCulture), DateTime.UtcNow); + if (rows == 0) + throw new Exception("User not found"); + + cmd.Parameters.Clear(); + cmd.CommandText = "Select COUNT(*) from my_aspnet_personalizationperuser where userid = @UserId and pathId = @PathId"; + cmd.Parameters.AddWithValue("@UserId", userId); + cmd.Parameters.AddWithValue("@PathId", pathId); + if ((long)cmd.ExecuteScalar() > 0) + { + cmd.Parameters.Clear(); + cmd.CommandText = "UPDATE my_aspnet_personalizationperuser SET PageSettings = @PageSettings, LastUpdatedDate = @CurrentTimeUtc " + + "where userid = @UserId and pathId = @PathId"; + cmd.Parameters.AddWithValue("@UserId", userId); + cmd.Parameters.AddWithValue("@PathId", pathId); + cmd.Parameters.AddWithValue("@PageSettings", settings); + cmd.Parameters.AddWithValue("@CurrentTimeUtc", DateTime.UtcNow); + cmd.ExecuteNonQuery(); + } + else + { + cmd.Parameters.Clear(); + cmd.CommandText = "INSERT INTO my_aspnet_personalizationperuser(applicationId, pathId, userId, pageSettings, lastUpdatedDate) VALUES(@applicationId, @PathId, @userId, @PageSettings, @LastUpdatedDate)"; + cmd.Parameters.AddWithValue("@applicationId", applicationId); + cmd.Parameters.AddWithValue("@UserId", userId); + cmd.Parameters.AddWithValue("@PathId", pathId); + cmd.Parameters.AddWithValue("@PageSettings", settings); + cmd.Parameters.AddWithValue("@LastUpdatedDate", DateTime.UtcNow); + rows = cmd.ExecuteNonQuery(); + } + return rows; + } + + /// + /// Saves shared state for the specified page in the aspnet_PersonalizationAllUsers table + /// + /// + internal static int my_aspnet_PersonalizationAllUsers_SetPageSettings(long applicationId, string path, byte[] settings, DateTime currentTimeUtc, MySQLPersonalizationConnectionHelper connection) + { + if (applicationId <= 0) + return 0; + + if (!connection.Opened) + throw new Exception("Error: Connection should be open"); + + var cmd = new MySqlCommand(); + cmd.Connection = connection.Connection; + + cmd.CommandText = "SELECT PathId FROM my_aspnet_paths WHERE ApplicationId = @ApplicationId AND LoweredPath = LOWER(@Path)"; + cmd.Parameters.AddWithValue("@ApplicationId", applicationId); + cmd.Parameters.AddWithValue("@Path", path); + var pathId = (string)cmd.ExecuteScalar(); + cmd.Parameters.Clear(); + + if (pathId == null) + { + // create path + MySqlTransaction trans; + trans = connection.Connection.BeginTransaction(); + + try + { + cmd.Transaction = trans; + cmd.CommandText = "INSERT INTO my_aspnet_paths (applicationId, pathId, path, loweredpath) values (@ApplicationId, @PathId, @Path, LOWER(@Path))"; + cmd.Parameters.AddWithValue("@ApplicationId", applicationId); + cmd.Parameters.AddWithValue("@PathId", pathId = Guid.NewGuid().ToString()); + cmd.Parameters.AddWithValue("@Path", path); + cmd.ExecuteNonQuery(); + trans.Commit(); + } + catch + { + trans.Rollback(); + throw; + } + } + + cmd.CommandText = "INSERT INTO my_aspnet_personalizationallusers(PathId, PageSettings, LastUpdatedDate) VALUES (@PathId, @PageSettings, @CurrentTimeUtc)"; + cmd.CommandText += " ON DUPLICATE KEY UPDATE PageSettings=Values(PageSettings), LastUpdatedDate=Values(LastUpdatedDate)"; + cmd.Parameters.Clear(); + cmd.Parameters.AddWithValue("@PageSettings", settings); + cmd.Parameters.AddWithValue("@PathId", pathId); + cmd.Parameters.AddWithValue("@CurrentTimeUtc", currentTimeUtc); + var rows = cmd.ExecuteNonQuery(); + return rows; + } + } +} diff --git a/Source/MySql.Web/ProfileProvider.cs b/MySql.Web/src/ProfileProvider.cs similarity index 93% rename from Source/MySql.Web/ProfileProvider.cs rename to MySql.Web/src/ProfileProvider.cs index 430628b6f..778ae9a5c 100644 --- a/Source/MySql.Web/ProfileProvider.cs +++ b/MySql.Web/src/ProfileProvider.cs @@ -1,675 +1,673 @@ -// Copyright � 2004, 2011, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -// This code was contributed by Sean Wright (srwright@alcor.concordia.ca) on 2007-01-12 -// The copyright was assigned and transferred under the terms of -// the MySQL Contributor License Agreement (CLA) - -using System; -using System.Web.Profile; -using System.Configuration; -using System.Collections.Specialized; -using System.Web.Hosting; -using MySql.Data.MySqlClient; -using System.Configuration.Provider; -using System.Collections; -using System.Collections.Generic; -using System.Text; -using System.Data; -using System.IO; -using System.Globalization; -using System.Web.Security; -using MySql.Web.Common; -using MySql.Web.Properties; -using MySql.Web.General; - -namespace MySql.Web.Profile -{ - /// - /// - /// - public class MySQLProfileProvider : ProfileProvider - { - private string connectionString; - private Application app; - - #region Abstract Members - - /// - /// Initializes the provider. - /// - /// The friendly name of the provider. - /// A collection of the name/value pairs representing the provider-specific attributes specified in the configuration for this provider. - /// The name of the provider is null. - /// The name of the provider has a length of zero. - /// An attempt is made to call on a provider after the provider has already been initialized. - public override void Initialize(string name, NameValueCollection config) - { - if (config == null) - throw new ArgumentNullException("config"); - - if (name == null || name.Length == 0) - name = "MySQLProfileProvider"; - - if (string.IsNullOrEmpty(config["description"])) - { - config.Remove("description"); - config.Add("description", "MySQL Profile provider"); - } - base.Initialize(name, config); - - try - { - string applicationName = GetConfigValue(config["applicationName"], HostingEnvironment.ApplicationVirtualPath); - - connectionString = ""; - ConnectionStringSettings ConnectionStringSettings = ConfigurationManager.ConnectionStrings[ - config["connectionStringName"]]; - if (ConnectionStringSettings != null) - connectionString = ConnectionStringSettings.ConnectionString.Trim(); - - if (String.IsNullOrEmpty(connectionString)) return; - - // make sure our schema is up to date - SchemaManager.CheckSchema(connectionString, config); - - app = new Application(applicationName, base.Description); - } - catch (Exception ex) - { - throw new ProviderException(Properties.Resources.ErrorInitProfileProvider, ex); - } - } - - /// - /// When overridden in a derived class, deletes all user-profile data - /// for profiles in which the last activity date occurred before the - /// specified date. - /// - /// One of the - /// - /// values, specifying whether anonymous, authenticated, or both - /// types of profiles are deleted. - /// A - /// that identifies which user profiles are considered inactive. If the - /// - /// value of a user profile occurs on or before this date and time, the - /// profile is considered inactive. - /// - /// The number of profiles deleted from the data source. - /// - public override int DeleteInactiveProfiles( - ProfileAuthenticationOption authenticationOption, - DateTime userInactiveSinceDate) - { - using (MySqlConnection c = new MySqlConnection(connectionString)) - { - c.Open(); - - MySqlCommand queryCmd = new MySqlCommand( - @"SELECT * FROM my_aspnet_users - WHERE applicationId=@appId AND - lastActivityDate < @lastActivityDate", - c); - queryCmd.Parameters.AddWithValue("@appId", app.FetchId(c)); - queryCmd.Parameters.AddWithValue("@lastActivityDate", userInactiveSinceDate); - if (authenticationOption == ProfileAuthenticationOption.Anonymous) - queryCmd.CommandText += " AND isAnonymous = 1"; - else if (authenticationOption == ProfileAuthenticationOption.Authenticated) - queryCmd.CommandText += " AND isAnonymous = 0"; - - MySqlCommand deleteCmd = new MySqlCommand( - "DELETE FROM my_aspnet_profiles WHERE userId = @userId", c); - deleteCmd.Parameters.Add("@userId", MySqlDbType.UInt64); - - List uidList = new List(); - using (MySqlDataReader reader = queryCmd.ExecuteReader()) - { - while (reader.Read()) - uidList.Add(reader.GetUInt64("userId")); - } - - int count = 0; - foreach (ulong uid in uidList) - { - deleteCmd.Parameters[0].Value = uid; - count += deleteCmd.ExecuteNonQuery(); - } - return count; - } - } - - /// - /// When overridden in a derived class, deletes profile properties - /// and information for profiles that match the supplied list of user names. - /// - /// A string array of user names for - /// profiles to be deleted. - /// - /// The number of profiles deleted from the data source. - /// - public override int DeleteProfiles(string[] usernames) - { - using (MySqlConnection c = new MySqlConnection(connectionString)) - { - c.Open(); - - MySqlCommand queryCmd = new MySqlCommand( - @"SELECT * FROM my_aspnet_users - WHERE applicationId=@appId AND name = @name", c); - queryCmd.Parameters.AddWithValue("@appId", app.FetchId(c)); - queryCmd.Parameters.Add("@name", MySqlDbType.VarChar); - - MySqlCommand deleteCmd = new MySqlCommand( - "DELETE FROM my_aspnet_profiles WHERE userId = @userId", c); - deleteCmd.Parameters.Add("@userId", MySqlDbType.Int32); - - int count = 0; - foreach (string name in usernames) - { - queryCmd.Parameters[1].Value = name; - int uid = (int)queryCmd.ExecuteScalar(); - - deleteCmd.Parameters[0].Value = uid; - count += deleteCmd.ExecuteNonQuery(); - } - return count; - } - } - - /// - /// When overridden in a derived class, deletes profile properties - /// and information for the supplied list of profiles. - /// - /// A - /// of - /// information about profiles that are to be deleted. - /// - /// The number of profiles deleted from the data source. - /// - public override int DeleteProfiles(ProfileInfoCollection profiles) - { - string[] s = new string[profiles.Count]; - - int i = 0; - foreach (ProfileInfo p in profiles) - s[i++] = p.UserName; - return DeleteProfiles(s); - } - - /// - /// When overridden in a derived class, retrieves profile information - /// for profiles in which the last activity date occurred on or before - /// the specified date and the user name matches the specified user name. - /// - /// One of the - /// values, - /// specifying whether anonymous, authenticated, or both types of profiles - /// are returned. - /// The user name to search for. - /// A - /// that identifies which user profiles are considered inactive. If the - /// value - /// of a user profile occurs on or before this date and time, the profile - /// is considered inactive. - /// The index of the page of results to return. - /// The size of the page of results to return. - /// When this method returns, contains the total - /// number of profiles. - /// - /// A containing - /// user profile information for inactive profiles where the user name - /// matches the supplied parameter. - /// - public override ProfileInfoCollection FindInactiveProfilesByUserName( - ProfileAuthenticationOption authenticationOption, - string usernameToMatch, DateTime userInactiveSinceDate, - int pageIndex, int pageSize, out int totalRecords) - { - return GetProfiles(authenticationOption, usernameToMatch, - userInactiveSinceDate, pageIndex, pageSize, out totalRecords); - } - - /// - /// When overridden in a derived class, retrieves profile information - /// for profiles in which the user name matches the specified user names. - /// - /// One of the - /// values, - /// specifying whether anonymous, authenticated, or both types of profiles - /// are returned. - /// The user name to search for. - /// The index of the page of results to return. - /// The size of the page of results to return. - /// When this method returns, contains the total - /// number of profiles. - /// - /// A containing - /// user-profile information for profiles where the user name matches the - /// supplied parameter. - /// - public override ProfileInfoCollection FindProfilesByUserName( - ProfileAuthenticationOption authenticationOption, - string usernameToMatch, int pageIndex, int pageSize, - out int totalRecords) - { - return GetProfiles(authenticationOption, usernameToMatch, - DateTime.MinValue, pageIndex, pageSize, out totalRecords); - } - - /// - /// When overridden in a derived class, retrieves user-profile data - /// from the data source for profiles in which the last activity date - /// occurred on or before the specified date. - /// - /// One of the - /// values, - /// specifying whether anonymous, authenticated, or both types of profiles - /// are returned. - /// A - /// that identifies which user profiles are considered inactive. If the - /// of - /// a user profile occurs on or before this date and time, the profile is - /// considered inactive. - /// The index of the page of results to return. - /// The size of the page of results to return. - /// When this method returns, contains the - /// total number of profiles. - /// - /// A containing user-profile information about the inactive profiles. - /// - public override ProfileInfoCollection GetAllInactiveProfiles( - ProfileAuthenticationOption authenticationOption, - DateTime userInactiveSinceDate, int pageIndex, int pageSize, - out int totalRecords) - { - return GetProfiles(authenticationOption, null, - userInactiveSinceDate, pageIndex, pageSize, out totalRecords); - } - - /// - /// When overridden in a derived class, retrieves user profile data for - /// all profiles in the data source. - /// - /// One of the - /// values, - /// specifying whether anonymous, authenticated, or both types of profiles - /// are returned. - /// The index of the page of results to return. - /// The size of the page of results to return. - /// When this method returns, contains the - /// total number of profiles. - /// - /// A containing - /// user-profile information for all profiles in the data source. - /// - public override ProfileInfoCollection GetAllProfiles( - ProfileAuthenticationOption authenticationOption, int pageIndex, - int pageSize, out int totalRecords) - { - return GetProfiles(authenticationOption, null, - DateTime.MinValue, pageIndex, pageSize, out totalRecords); - } - - /// - /// When overridden in a derived class, returns the number of profiles - /// in which the last activity date occurred on or before the specified - /// date. - /// - /// One of the - /// values, - /// specifying whether anonymous, authenticated, or both types of profiles - /// are returned. - /// A - /// that identifies which user profiles are considered inactive. If the - /// of - /// a user profile occurs on or before this date and time, the profile - /// is considered inactive. - /// - /// The number of profiles in which the last activity date occurred on - /// or before the specified date. - /// - public override int GetNumberOfInactiveProfiles( - ProfileAuthenticationOption authenticationOption, - DateTime userInactiveSinceDate) - { - using (MySqlConnection c = new MySqlConnection(connectionString)) - { - c.Open(); - - MySqlCommand queryCmd = new MySqlCommand( - @"SELECT COUNT(*) FROM my_aspnet_users - WHERE applicationId = @appId AND - lastActivityDate < @lastActivityDate", - c); - queryCmd.Parameters.AddWithValue("@appId", app.FetchId(c)); - queryCmd.Parameters.AddWithValue("@lastActivityDate", userInactiveSinceDate); - if (authenticationOption == ProfileAuthenticationOption.Anonymous) - queryCmd.CommandText += " AND isAnonymous = 1"; - else if (authenticationOption == ProfileAuthenticationOption.Authenticated) - queryCmd.CommandText += " AND isAnonymous = 0"; - return (int)queryCmd.ExecuteScalar(); - } - } - - /// - /// Gets or sets the name of the currently running application. - /// - /// - /// A that contains the application's shortened name, which does not contain a full path or extension, for example, SimpleAppSettings. - public override string ApplicationName - { - get { return app.Name; } - set { app.Name = value; } - } - - /// - /// Returns the collection of settings property values for the specified application instance and settings property group. - /// - /// A describing the current application use. - /// A containing the settings property group whose values are to be retrieved. - /// - /// A containing the values for the specified settings property group. - /// - public override SettingsPropertyValueCollection GetPropertyValues( - SettingsContext context, SettingsPropertyCollection collection) - { - SettingsPropertyValueCollection values = new SettingsPropertyValueCollection(); - - if (collection.Count < 1) return values; - - string username = (string)context["UserName"]; - - foreach (SettingsProperty property in collection) - { - if (property.PropertyType.IsPrimitive || property.PropertyType == typeof(string)) - property.SerializeAs = SettingsSerializeAs.String; - else - property.SerializeAs = SettingsSerializeAs.Xml; - - values.Add(new SettingsPropertyValue(property)); - } - - if (String.IsNullOrEmpty(username)) - return values; - - // retrieve encoded profile data from the database - try - { - - using (MySqlConnection c = new MySqlConnection(connectionString)) - { - c.Open(); - MySqlCommand cmd = new MySqlCommand( - @"SELECT * FROM my_aspnet_profiles p - JOIN my_aspnet_users u ON u.id = p.userId - WHERE u.applicationId = @appId AND u.name = @name", c); - cmd.Parameters.AddWithValue("@appId", app.FetchId(c)); - cmd.Parameters.AddWithValue("@name", username); - MySqlDataAdapter da = new MySqlDataAdapter(cmd); - DataTable dt = new DataTable(); - da.Fill(dt); - - if (dt.Rows.Count > 0) - DecodeProfileData(dt.Rows[0], values); - return values; - } - } - catch (Exception ex) - { - throw new ProviderException(Properties.Resources.UnableToRetrieveProfileData, ex); - } - } - - /// - /// Sets the values of the specified group of property settings. - /// - /// A describing the current application usage. - /// A representing the group of property settings to set. - public override void SetPropertyValues( - SettingsContext context, SettingsPropertyValueCollection collection) - { - bool isAuthenticated = (bool)context["IsAuthenticated"]; - string username = (string)context["UserName"]; - - if (String.IsNullOrEmpty(username)) return; - if (collection.Count < 1) return; - - string index = String.Empty; - string stringData = String.Empty; - byte[] binaryData = null; - int count = EncodeProfileData(collection, isAuthenticated, ref index, ref stringData, ref binaryData); - if (count < 1) return; - - MySqlTransaction txn = null; - // save the encoded profile data to the database - using (MySqlConnection connection = new MySqlConnection(connectionString)) - { - try - { - connection.Open(); - txn = connection.BeginTransaction(); - - // either create a new user or fetch the existing user id - long userId = SchemaManager.CreateOrFetchUserId(connection, username, - app.EnsureId(connection), isAuthenticated); - - MySqlCommand cmd = new MySqlCommand( - @"INSERT INTO my_aspnet_profiles - VALUES (@userId, @index, @stringData, @binaryData, NULL) ON DUPLICATE KEY UPDATE - valueindex=VALUES(valueindex), stringdata=VALUES(stringdata), - binarydata=VALUES(binarydata)", connection); - cmd.Parameters.Clear(); - cmd.Parameters.AddWithValue("@userId", userId); - cmd.Parameters.AddWithValue("@index", index); - cmd.Parameters.AddWithValue("@stringData", stringData); - cmd.Parameters.AddWithValue("@binaryData", binaryData); - count = cmd.ExecuteNonQuery(); - if (count == 0) - throw new Exception(Properties.Resources.ProfileUpdateFailed); - txn.Commit(); - } - catch (Exception ex) - { - if (txn != null) - txn.Rollback(); - throw new ProviderException(Properties.Resources.ProfileUpdateFailed, ex); - } - } - } - - #endregion - - internal static void DeleteUserData(MySqlConnection connection, int userId) - { - MySqlCommand cmd = new MySqlCommand( - "DELETE FROM my_aspnet_profiles WHERE userId=@userId", connection); - cmd.Parameters.AddWithValue("@userId", userId); - cmd.ExecuteNonQuery(); - } - - #region Private Methods - - private void DecodeProfileData(DataRow profileRow, SettingsPropertyValueCollection values) - { - string indexData = (string)profileRow["valueindex"]; - string stringData = (string)profileRow["stringData"]; - byte[] binaryData = (byte[])profileRow["binaryData"]; - - if (indexData == null) return; - - string[] indexes = indexData.Split(':'); - - foreach (string index in indexes) - { - string[] parts = index.Split('/'); - SettingsPropertyValue value = values[parts[0]]; - if (value == null) continue; - - int pos = Int32.Parse(parts[2], CultureInfo.InvariantCulture); - int len = Int32.Parse(parts[3], CultureInfo.InvariantCulture); - if (len == -1) - { - value.PropertyValue = null; - value.IsDirty = false; - value.Deserialized = true; - } - else if (parts[1].Equals("0")) - value.SerializedValue = stringData.Substring(pos, len); - else - { - byte[] buf = new byte[len]; - Buffer.BlockCopy(binaryData, pos, buf, 0, len); - value.SerializedValue = buf; - } - } - } - - private int EncodeProfileData(SettingsPropertyValueCollection collection, bool isAuthenticated, - ref string index, ref string stringData, ref byte[] binaryData) - { - bool itemsToSave = false; - - // first we need to determine if there are any items that need saving - // this is an optimization - foreach (SettingsPropertyValue value in collection) - { - if (!value.IsDirty) continue; - if (value.Property.Attributes["AllowAnonymous"].Equals(false) && - !isAuthenticated) continue; - itemsToSave = true; - break; - } - if (!itemsToSave) return 0; - - StringBuilder indexBuilder = new StringBuilder(); - StringBuilder stringDataBuilder = new StringBuilder(); - MemoryStream binaryBuilder = new MemoryStream(); - int count = 0; - - // ok, we have some values that need to be saved so we go back through - foreach (SettingsPropertyValue value in collection) - { - // if the value has not been written to and is still using the default value - // no need to save it - if (value.UsingDefaultValue && !value.IsDirty) continue; - - // we don't save properties that require the user to be authenticated when the - // current user is not authenticated. - if (value.Property.Attributes["AllowAnonymous"].Equals(false) && - !isAuthenticated) continue; - - count++; - object propValue = value.SerializedValue; - if ((value.Deserialized && value.PropertyValue == null) || - value.SerializedValue == null) - indexBuilder.AppendFormat("{0}//0/-1:", value.Name); - else if (propValue is string) - { - indexBuilder.AppendFormat("{0}/0/{1}/{2}:", value.Name, - stringDataBuilder.Length, (propValue as string).Length); - stringDataBuilder.Append(propValue); - } - else - { - byte[] binaryValue = (byte[])propValue; - indexBuilder.AppendFormat("{0}/1/{1}/{2}:", value.Name, - binaryBuilder.Position, binaryValue.Length); - binaryBuilder.Write(binaryValue, 0, binaryValue.Length); - } - } - index = indexBuilder.ToString(); - stringData = stringDataBuilder.ToString(); - binaryData = binaryBuilder.ToArray(); - return count; - } - - - private ProfileInfoCollection GetProfiles( - ProfileAuthenticationOption authenticationOption, - string usernameToMatch, DateTime userInactiveSinceDate, - int pageIndex, int pageSize, out int totalRecords) - { - List whereClauses = new List(); - - using (MySqlConnection c = new MySqlConnection(connectionString)) - { - c.Open(); - - MySqlCommand cmd = new MySqlCommand( - @"SELECT p.*, u.name, u.isAnonymous, u.lastActivityDate, - LENGTH(p.stringdata) + LENGTH(p.binarydata) AS profilesize - FROM my_aspnet_profiles p - JOIN my_aspnet_users u ON u.id = p.userId - WHERE u.applicationId = @appId", c); - cmd.Parameters.AddWithValue("@appId", app.FetchId(c)); - - if (usernameToMatch != null) - { - cmd.CommandText += " AND u.name LIKE @userName"; - cmd.Parameters.AddWithValue("@userName", usernameToMatch); - } - if (userInactiveSinceDate != DateTime.MinValue) - { - cmd.CommandText += " AND u.lastActivityDate < @lastActivityDate"; - cmd.Parameters.AddWithValue("@lastActivityDate", userInactiveSinceDate); - } - if (authenticationOption == ProfileAuthenticationOption.Anonymous) - cmd.CommandText += " AND u.isAnonymous = 1"; - else if (authenticationOption == ProfileAuthenticationOption.Authenticated) - cmd.CommandText += " AND u.isAnonymous = 0"; - - cmd.CommandText += String.Format(" LIMIT {0},{1}", pageIndex * pageSize, pageSize); - - ProfileInfoCollection pic = new ProfileInfoCollection(); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - while (reader.Read()) - { - ProfileInfo pi = new ProfileInfo( - reader.GetString("name"), - reader.GetBoolean("isAnonymous"), - reader.GetDateTime("lastActivityDate"), - reader.GetDateTime("lastUpdatedDate"), - reader.GetInt32("profilesize")); - pic.Add(pi); - } - } - cmd.CommandText = "SELECT FOUND_ROWS()"; - totalRecords = Convert.ToInt32(cmd.ExecuteScalar()); - return pic; - } - } - - private static string GetConfigValue(string configValue, string defaultValue) - { - if (string.IsNullOrEmpty(configValue)) - { - return defaultValue; - } - return configValue; - } - - #endregion - - } -} +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +// This code was contributed by Sean Wright (srwright@alcor.concordia.ca) on 2007-01-12 +// The copyright was assigned and transferred under the terms of +// the MySQL Contributor License Agreement (CLA) + +using MySql.Data.MySqlClient; +using MySql.Web.Common; +using MySql.Web.General; +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Configuration; +using System.Configuration.Provider; +using System.Data; +using System.Globalization; +using System.IO; +using System.Text; +using System.Web.Hosting; +using System.Web.Profile; + +namespace MySql.Web.Profile +{ + /// + /// Manages storage of profile information for an ASP.NET application in a MySQL database. + /// + public class MySQLProfileProvider : ProfileProvider + { + private string connectionString; + private Application app; + + #region Abstract Members + + /// + /// Initializes the provider. + /// + /// The friendly name of the provider. + /// A collection of the name/value pairs representing the provider-specific attributes specified in the configuration for this provider. + /// The name of the provider is null. + /// The name of the provider has a length of zero. + /// An attempt is made to call on a provider after the provider has already been initialized. + public override void Initialize(string name, NameValueCollection config) + { + if (config == null) + throw new ArgumentNullException("config"); + + if (name == null || name.Length == 0) + name = "MySQLProfileProvider"; + + if (string.IsNullOrEmpty(config["description"])) + { + config.Remove("description"); + config.Add("description", "MySQL Profile provider"); + } + base.Initialize(name, config); + + try + { + string applicationName = GetConfigValue(config["applicationName"], HostingEnvironment.ApplicationVirtualPath); + + connectionString = ConfigUtility.GetConnectionString(config); + if (String.IsNullOrEmpty(connectionString)) return; + + // make sure our schema is up to date + SchemaManager.CheckSchema(connectionString, config); + + app = new Application(applicationName, base.Description); + } + catch (Exception ex) + { + throw new ProviderException(Properties.Resources.ErrorInitProfileProvider, ex); + } + } + + /// + /// When overridden in a derived class, deletes all user-profile data + /// for profiles in which the last activity date occurred before the + /// specified date. + /// + /// One of the + /// + /// values, specifying whether anonymous, authenticated, or both + /// types of profiles are deleted. + /// A + /// that identifies which user profiles are considered inactive. If the + /// + /// value of a user profile occurs on or before this date and time, the + /// profile is considered inactive. + /// + /// The number of profiles deleted from the data source. + /// + public override int DeleteInactiveProfiles( + ProfileAuthenticationOption authenticationOption, + DateTime userInactiveSinceDate) + { + using (MySqlConnection c = new MySqlConnection(connectionString)) + { + c.Open(); + + MySqlCommand queryCmd = new MySqlCommand( + @"SELECT * FROM my_aspnet_users + WHERE applicationId=@appId AND + lastActivityDate < @lastActivityDate", + c); + queryCmd.Parameters.AddWithValue("@appId", app.FetchId(c)); + queryCmd.Parameters.AddWithValue("@lastActivityDate", userInactiveSinceDate); + if (authenticationOption == ProfileAuthenticationOption.Anonymous) + queryCmd.CommandText += " AND isAnonymous = 1"; + else if (authenticationOption == ProfileAuthenticationOption.Authenticated) + queryCmd.CommandText += " AND isAnonymous = 0"; + + MySqlCommand deleteCmd = new MySqlCommand( + "DELETE FROM my_aspnet_profiles WHERE userId = @userId", c); + deleteCmd.Parameters.Add("@userId", MySqlDbType.UInt64); + + List uidList = new List(); + using (MySqlDataReader reader = queryCmd.ExecuteReader()) + { + while (reader.Read()) + uidList.Add(reader.GetUInt64("userId")); + } + + int count = 0; + foreach (ulong uid in uidList) + { + deleteCmd.Parameters[0].Value = uid; + count += deleteCmd.ExecuteNonQuery(); + } + return count; + } + } + + /// + /// When overridden in a derived class, deletes profile properties + /// and information for profiles that match the supplied list of user names. + /// + /// A string array of user names for + /// profiles to be deleted. + /// + /// The number of profiles deleted from the data source. + /// + public override int DeleteProfiles(string[] usernames) + { + using (MySqlConnection c = new MySqlConnection(connectionString)) + { + c.Open(); + + MySqlCommand queryCmd = new MySqlCommand( + @"SELECT * FROM my_aspnet_users + WHERE applicationId=@appId AND name = @name", c); + queryCmd.Parameters.AddWithValue("@appId", app.FetchId(c)); + queryCmd.Parameters.Add("@name", MySqlDbType.VarChar); + + MySqlCommand deleteCmd = new MySqlCommand( + "DELETE FROM my_aspnet_profiles WHERE userId = @userId", c); + deleteCmd.Parameters.Add("@userId", MySqlDbType.Int32); + + int count = 0; + foreach (string name in usernames) + { + queryCmd.Parameters[1].Value = name; + int uid = (int)queryCmd.ExecuteScalar(); + + deleteCmd.Parameters[0].Value = uid; + count += deleteCmd.ExecuteNonQuery(); + } + return count; + } + } + + /// + /// When overridden in a derived class, deletes profile properties + /// and information for the supplied list of profiles. + /// + /// A + /// of + /// information about profiles that are to be deleted. + /// + /// The number of profiles deleted from the data source. + /// + public override int DeleteProfiles(ProfileInfoCollection profiles) + { + string[] s = new string[profiles.Count]; + + int i = 0; + foreach (ProfileInfo p in profiles) + s[i++] = p.UserName; + return DeleteProfiles(s); + } + + /// + /// When overridden in a derived class, retrieves profile information + /// for profiles in which the last activity date occurred on or before + /// the specified date and the user name matches the specified user name. + /// + /// One of the + /// values, + /// specifying whether anonymous, authenticated, or both types of profiles + /// are returned. + /// The user name to search for. + /// A + /// that identifies which user profiles are considered inactive. If the + /// value + /// of a user profile occurs on or before this date and time, the profile + /// is considered inactive. + /// The index of the page of results to return. + /// The size of the page of results to return. + /// When this method returns, contains the total + /// number of profiles. + /// + /// A containing + /// user profile information for inactive profiles where the user name + /// matches the supplied parameter. + /// + public override ProfileInfoCollection FindInactiveProfilesByUserName( + ProfileAuthenticationOption authenticationOption, + string usernameToMatch, DateTime userInactiveSinceDate, + int pageIndex, int pageSize, out int totalRecords) + { + return GetProfiles(authenticationOption, usernameToMatch, + userInactiveSinceDate, pageIndex, pageSize, out totalRecords); + } + + /// + /// When overridden in a derived class, retrieves profile information + /// for profiles in which the user name matches the specified user names. + /// + /// One of the + /// values, + /// specifying whether anonymous, authenticated, or both types of profiles + /// are returned. + /// The user name to search for. + /// The index of the page of results to return. + /// The size of the page of results to return. + /// When this method returns, contains the total + /// number of profiles. + /// + /// A containing + /// user-profile information for profiles where the user name matches the + /// supplied parameter. + /// + public override ProfileInfoCollection FindProfilesByUserName( + ProfileAuthenticationOption authenticationOption, + string usernameToMatch, int pageIndex, int pageSize, + out int totalRecords) + { + return GetProfiles(authenticationOption, usernameToMatch, + DateTime.MinValue, pageIndex, pageSize, out totalRecords); + } + + /// + /// When overridden in a derived class, retrieves user-profile data + /// from the data source for profiles in which the last activity date + /// occurred on or before the specified date. + /// + /// One of the + /// values, + /// specifying whether anonymous, authenticated, or both types of profiles + /// are returned. + /// A + /// that identifies which user profiles are considered inactive. If the + /// of + /// a user profile occurs on or before this date and time, the profile is + /// considered inactive. + /// The index of the page of results to return. + /// The size of the page of results to return. + /// When this method returns, contains the + /// total number of profiles. + /// + /// A containing user-profile information about the inactive profiles. + /// + public override ProfileInfoCollection GetAllInactiveProfiles( + ProfileAuthenticationOption authenticationOption, + DateTime userInactiveSinceDate, int pageIndex, int pageSize, + out int totalRecords) + { + return GetProfiles(authenticationOption, null, + userInactiveSinceDate, pageIndex, pageSize, out totalRecords); + } + + /// + /// When overridden in a derived class, retrieves user profile data for + /// all profiles in the data source. + /// + /// One of the + /// values, + /// specifying whether anonymous, authenticated, or both types of profiles + /// are returned. + /// The index of the page of results to return. + /// The size of the page of results to return. + /// When this method returns, contains the + /// total number of profiles. + /// + /// A containing + /// user-profile information for all profiles in the data source. + /// + public override ProfileInfoCollection GetAllProfiles( + ProfileAuthenticationOption authenticationOption, int pageIndex, + int pageSize, out int totalRecords) + { + return GetProfiles(authenticationOption, null, + DateTime.MinValue, pageIndex, pageSize, out totalRecords); + } + + /// + /// When overridden in a derived class, returns the number of profiles + /// in which the last activity date occurred on or before the specified + /// date. + /// + /// One of the + /// values, + /// specifying whether anonymous, authenticated, or both types of profiles + /// are returned. + /// A + /// that identifies which user profiles are considered inactive. If the + /// of + /// a user profile occurs on or before this date and time, the profile + /// is considered inactive. + /// + /// The number of profiles in which the last activity date occurred on + /// or before the specified date. + /// + public override int GetNumberOfInactiveProfiles( + ProfileAuthenticationOption authenticationOption, + DateTime userInactiveSinceDate) + { + using (MySqlConnection c = new MySqlConnection(connectionString)) + { + c.Open(); + + MySqlCommand queryCmd = new MySqlCommand( + @"SELECT COUNT(*) FROM my_aspnet_users + WHERE applicationId = @appId AND + lastActivityDate < @lastActivityDate", + c); + queryCmd.Parameters.AddWithValue("@appId", app.FetchId(c)); + queryCmd.Parameters.AddWithValue("@lastActivityDate", userInactiveSinceDate); + if (authenticationOption == ProfileAuthenticationOption.Anonymous) + queryCmd.CommandText += " AND isAnonymous = 1"; + else if (authenticationOption == ProfileAuthenticationOption.Authenticated) + queryCmd.CommandText += " AND isAnonymous = 0"; + return (int)queryCmd.ExecuteScalar(); + } + } + + /// + /// Gets or sets the name of the currently running application. + /// + /// + /// A that contains the application's shortened name, which does not contain a full path or extension, for example, SimpleAppSettings. + public override string ApplicationName + { + get { return app.Name; } + set { app.Name = value; } + } + + /// + /// Returns the collection of settings property values for the specified application instance and settings property group. + /// + /// A describing the current application use. + /// A containing the settings property group whose values are to be retrieved. + /// + /// A containing the values for the specified settings property group. + /// + public override SettingsPropertyValueCollection GetPropertyValues( + SettingsContext context, SettingsPropertyCollection collection) + { + SettingsPropertyValueCollection values = new SettingsPropertyValueCollection(); + + if (collection.Count < 1) return values; + + string username = (string)context["UserName"]; + + foreach (SettingsProperty property in collection) + { + if (property.PropertyType.IsPrimitive || property.PropertyType == typeof(string)) + property.SerializeAs = SettingsSerializeAs.String; + else + property.SerializeAs = SettingsSerializeAs.Xml; + + values.Add(new SettingsPropertyValue(property)); + } + + if (String.IsNullOrEmpty(username)) + return values; + + // retrieve encoded profile data from the database + try + { + + using (MySqlConnection c = new MySqlConnection(connectionString)) + { + c.Open(); + MySqlCommand cmd = new MySqlCommand( + @"SELECT * FROM my_aspnet_profiles p + JOIN my_aspnet_users u ON u.id = p.userId + WHERE u.applicationId = @appId AND u.name = @name", c); + cmd.Parameters.AddWithValue("@appId", app.FetchId(c)); + cmd.Parameters.AddWithValue("@name", username); + MySqlDataAdapter da = new MySqlDataAdapter(cmd); + DataTable dt = new DataTable(); + da.Fill(dt); + + if (dt.Rows.Count > 0) + DecodeProfileData(dt.Rows[0], values); + return values; + } + } + catch (Exception ex) + { + throw new ProviderException(Properties.Resources.UnableToRetrieveProfileData, ex); + } + } + + /// + /// Sets the values of the specified group of property settings. + /// + /// A describing the current application usage. + /// A representing the group of property settings to set. + public override void SetPropertyValues( + SettingsContext context, SettingsPropertyValueCollection collection) + { + bool isAuthenticated = (bool)context["IsAuthenticated"]; + string username = (string)context["UserName"]; + + if (String.IsNullOrEmpty(username)) return; + if (collection.Count < 1) return; + + string index = String.Empty; + string stringData = String.Empty; + byte[] binaryData = null; + int count = EncodeProfileData(collection, isAuthenticated, ref index, ref stringData, ref binaryData); + if (count < 1) return; + + MySqlTransaction txn = null; + // save the encoded profile data to the database + using (MySqlConnection connection = new MySqlConnection(connectionString)) + { + try + { + connection.Open(); + txn = connection.BeginTransaction(); + + // either create a new user or fetch the existing user id + long userId = SchemaManager.CreateOrFetchUserId(connection, username, + app.EnsureId(connection), isAuthenticated); + + MySqlCommand cmd = new MySqlCommand( + @"INSERT INTO my_aspnet_profiles + VALUES (@userId, @index, @stringData, @binaryData, NULL) ON DUPLICATE KEY UPDATE + valueindex=VALUES(valueindex), stringdata=VALUES(stringdata), + binarydata=VALUES(binarydata)", connection); + cmd.Parameters.Clear(); + cmd.Parameters.AddWithValue("@userId", userId); + cmd.Parameters.AddWithValue("@index", index); + cmd.Parameters.AddWithValue("@stringData", stringData); + cmd.Parameters.AddWithValue("@binaryData", binaryData); + count = cmd.ExecuteNonQuery(); + if (count == 0) + throw new Exception(Properties.Resources.ProfileUpdateFailed); + txn.Commit(); + } + catch (Exception ex) + { + if (txn != null) + txn.Rollback(); + throw new ProviderException(Properties.Resources.ProfileUpdateFailed, ex); + } + } + } + + #endregion + + internal static void DeleteUserData(MySqlConnection connection, int userId) + { + MySqlCommand cmd = new MySqlCommand( + "DELETE FROM my_aspnet_profiles WHERE userId=@userId", connection); + cmd.Parameters.AddWithValue("@userId", userId); + cmd.ExecuteNonQuery(); + } + + #region Private Methods + + private void DecodeProfileData(DataRow profileRow, SettingsPropertyValueCollection values) + { + string indexData = (string)profileRow["valueindex"]; + string stringData = (string)profileRow["stringData"]; + byte[] binaryData = (byte[])profileRow["binaryData"]; + + if (indexData == null) return; + + string[] indexes = indexData.Split(':'); + + foreach (string index in indexes) + { + string[] parts = index.Split('/'); + SettingsPropertyValue value = values[parts[0]]; + if (value == null) continue; + + int pos = Int32.Parse(parts[2], CultureInfo.InvariantCulture); + int len = Int32.Parse(parts[3], CultureInfo.InvariantCulture); + if (len == -1) + { + value.PropertyValue = null; + value.IsDirty = false; + value.Deserialized = true; + } + else if (parts[1].Equals("0")) + value.SerializedValue = stringData.Substring(pos, len); + else + { + byte[] buf = new byte[len]; + Buffer.BlockCopy(binaryData, pos, buf, 0, len); + value.SerializedValue = buf; + } + } + } + + private int EncodeProfileData(SettingsPropertyValueCollection collection, bool isAuthenticated, + ref string index, ref string stringData, ref byte[] binaryData) + { + bool itemsToSave = false; + + // first we need to determine if there are any items that need saving + // this is an optimization + foreach (SettingsPropertyValue value in collection) + { + if (!value.IsDirty) continue; + if (value.Property.Attributes["AllowAnonymous"].Equals(false) && + !isAuthenticated) continue; + itemsToSave = true; + break; + } + if (!itemsToSave) return 0; + + StringBuilder indexBuilder = new StringBuilder(); + StringBuilder stringDataBuilder = new StringBuilder(); + MemoryStream binaryBuilder = new MemoryStream(); + int count = 0; + + // ok, we have some values that need to be saved so we go back through + foreach (SettingsPropertyValue value in collection) + { + // if the value has not been written to and is still using the default value + // no need to save it + if (value.UsingDefaultValue && !value.IsDirty) continue; + + // we don't save properties that require the user to be authenticated when the + // current user is not authenticated. + if (value.Property.Attributes["AllowAnonymous"].Equals(false) && + !isAuthenticated) continue; + + count++; + object propValue = value.SerializedValue; + if ((value.Deserialized && value.PropertyValue == null) || + value.SerializedValue == null) + indexBuilder.AppendFormat("{0}//0/-1:", value.Name); + else if (propValue is string) + { + indexBuilder.AppendFormat("{0}/0/{1}/{2}:", value.Name, + stringDataBuilder.Length, (propValue as string).Length); + stringDataBuilder.Append(propValue); + } + else + { + byte[] binaryValue = (byte[])propValue; + indexBuilder.AppendFormat("{0}/1/{1}/{2}:", value.Name, + binaryBuilder.Position, binaryValue.Length); + binaryBuilder.Write(binaryValue, 0, binaryValue.Length); + } + } + index = indexBuilder.ToString(); + stringData = stringDataBuilder.ToString(); + binaryData = binaryBuilder.ToArray(); + return count; + } + + + private ProfileInfoCollection GetProfiles( + ProfileAuthenticationOption authenticationOption, + string usernameToMatch, DateTime userInactiveSinceDate, + int pageIndex, int pageSize, out int totalRecords) + { + List whereClauses = new List(); + + using (MySqlConnection c = new MySqlConnection(connectionString)) + { + c.Open(); + + MySqlCommand cmd = new MySqlCommand( + @"SELECT p.*, u.name, u.isAnonymous, u.lastActivityDate, + LENGTH(p.stringdata) + LENGTH(p.binarydata) AS profilesize + FROM my_aspnet_profiles p + JOIN my_aspnet_users u ON u.id = p.userId + WHERE u.applicationId = @appId", c); + cmd.Parameters.AddWithValue("@appId", app.FetchId(c)); + + if (usernameToMatch != null) + { + cmd.CommandText += " AND u.name LIKE @userName"; + cmd.Parameters.AddWithValue("@userName", usernameToMatch); + } + if (userInactiveSinceDate != DateTime.MinValue) + { + cmd.CommandText += " AND u.lastActivityDate < @lastActivityDate"; + cmd.Parameters.AddWithValue("@lastActivityDate", userInactiveSinceDate); + } + if (authenticationOption == ProfileAuthenticationOption.Anonymous) + cmd.CommandText += " AND u.isAnonymous = 1"; + else if (authenticationOption == ProfileAuthenticationOption.Authenticated) + cmd.CommandText += " AND u.isAnonymous = 0"; + + cmd.CommandText += String.Format(" LIMIT {0},{1}", pageIndex * pageSize, pageSize); + + ProfileInfoCollection pic = new ProfileInfoCollection(); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + ProfileInfo pi = new ProfileInfo( + reader.GetString("name"), + reader.GetBoolean("isAnonymous"), + reader.GetDateTime("lastActivityDate"), + reader.GetDateTime("lastUpdatedDate"), + reader.GetInt32("profilesize")); + pic.Add(pi); + } + } + cmd.CommandText = "SELECT FOUND_ROWS()"; + totalRecords = Convert.ToInt32(cmd.ExecuteScalar()); + return pic; + } + } + + private static string GetConfigValue(string configValue, string defaultValue) + { + if (string.IsNullOrEmpty(configValue)) + { + return defaultValue; + } + return configValue; + } + + #endregion + + } +} diff --git a/MySql.Web/src/Properties/AssemblyInfo.cs b/MySql.Web/src/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..fa38956fc --- /dev/null +++ b/MySql.Web/src/Properties/AssemblyInfo.cs @@ -0,0 +1,60 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Security; + +// 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. +[assembly: AssemblyTitle("MySql.Web")] +[assembly: AssemblyDescription("MySql.Web includes a provider model for use with ASP.NET applications.")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Oracle Corporation")] +[assembly: AssemblyProduct("MySQL Connector/NET")] +[assembly: AssemblyCopyright("Copyright © 2004, 2025, Oracle and/or its affiliates.")] +[assembly: AssemblyTrademark("Oracle®, Java, MySQL, and NetSuite are registered trademarks of Oracle and/or its affiliates.")] +[assembly: AssemblyCulture("")] +[assembly: SecurityRules(SecurityRuleSet.Level1)] +[assembly: CLSCompliant(false)] +[assembly: AllowPartiallyTrustedCallers()] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + + + + +#if !DEBUG +[assembly: AssemblyKeyName("ConnectorNet")] +#endif + diff --git a/MySql.Web/src/Properties/Resources.Designer.cs b/MySql.Web/src/Properties/Resources.Designer.cs new file mode 100644 index 000000000..095ec407c --- /dev/null +++ b/MySql.Web/src/Properties/Resources.Designer.cs @@ -0,0 +1,630 @@ +//------------------------------------------------------------------------------ +// +// 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 MySql.Web.Properties { + 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", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 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("MySql.Web.Properties.Resources", typeof(Resources).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 Cannot delete a populated role.. + /// + internal static string CannotDeleteAPopulatedRole { + get { + return ResourceManager.GetString("CannotDeleteAPopulatedRole", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Setting EnablePasswordRetrieval to true when PasswordFormat is Hashed is not supported.. + /// + internal static string CannotRetrieveHashedPasswords { + get { + return ResourceManager.GetString("CannotRetrieveHashedPasswords", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to You cannot specify both a connection string name and a connection string.. + /// + internal static string CannotSpecifyNameAndConnectionString { + get { + return ResourceManager.GetString("CannotSpecifyNameAndConnectionString", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cannot unencode a hashed password.. + /// + internal static string CannotUnencodeHashedPwd { + get { + return ResourceManager.GetString("CannotUnencodeHashedPwd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Change password operation was canceled.. + /// + internal static string ChangePasswordCanceled { + get { + return ResourceManager.GetString("ChangePasswordCanceled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed to clear the token for the userid {0} in the table {1} after password update.. + /// + internal static string ClearPassTokenFailed { + get { + return ResourceManager.GetString("ClearPassTokenFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to An unexpected error occurred while creating the role '{0}'.. + /// + internal static string CreateRoleFailed { + get { + return ResourceManager.GetString("CreateRoleFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed to delete OAuth Account, combination of provider '{0}' and provider user id '{1}' not found.. + /// + internal static string DeleteOAuthAccountFailed { + get { + return ResourceManager.GetString("DeleteOAuthAccountFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There was an error during membership provider initilization.. + /// + internal static string ErrorInitOfMembershipProvider { + get { + return ResourceManager.GetString("ErrorInitOfMembershipProvider", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There was an error during role provider initilization.. + /// + internal static string ErrorInitOfRoleProvider { + get { + return ResourceManager.GetString("ErrorInitOfRoleProvider", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There was an error during profile provider initilization.. + /// + internal static string ErrorInitProfileProvider { + get { + return ResourceManager.GetString("ErrorInitProfileProvider", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There was an error resetting the password.. + /// + internal static string ErrorResettingPassword { + get { + return ResourceManager.GetString("ErrorResettingPassword", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed to generates the PasswordVerificationToken, update not performed to Database.. + /// + internal static string GeneratePassVerificationTokenFailed { + get { + return ResourceManager.GetString("GeneratePassVerificationTokenFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Role names must not be null or empty.. + /// + internal static string IllegalRoleName { + get { + return ResourceManager.GetString("IllegalRoleName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User names must not be null or empty.. + /// + internal static string IllegalUserName { + get { + return ResourceManager.GetString("IllegalUserName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Incorrect password answer.. + /// + internal static string IncorrectPasswordAnswer { + get { + return ResourceManager.GetString("IncorrectPasswordAnswer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Please provide a valid value: value provided is null or empty.. + /// + internal static string InvalidArgument { + get { + return ResourceManager.GetString("InvalidArgument", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Some of the values in the arrays received are null or empty, please verify it.. + /// + internal static string InvalidArrayValue { + get { + return ResourceManager.GetString("InvalidArrayValue", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Invalid characters in user name.. + /// + internal static string InvalidCharactersInUserName { + get { + return ResourceManager.GetString("InvalidCharactersInUserName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User {0} not found in the table {1}.. + /// + internal static string InvalidUser { + get { + return ResourceManager.GetString("InvalidUser", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to initialize provider. Missing or incorrect schema.. + /// + internal static string MissingOrWrongSchema { + get { + return ResourceManager.GetString("MissingOrWrongSchema", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The mono runtime did not support hashed passwords. Please use clear or encrypted passwords.. + /// + internal static string MonoDoesNotSupportHash { + get { + return ResourceManager.GetString("MonoDoesNotSupportHash", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Change password canceled due to New password validation failure.. + /// + internal static string NewPasswordValidationFailed { + get { + return ResourceManager.GetString("NewPasswordValidationFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to There is no connection string configured.. + /// + internal static string NoConnString { + get { + return ResourceManager.GetString("NoConnString", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Non alpha numeric characters in '{0}' needs to be greater than or equal to '{1}'.. + /// + internal static string NotEnoughNonAlphaNumericInPwd { + get { + return ResourceManager.GetString("NotEnoughNonAlphaNumericInPwd", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Password answer supplied is invalid.. + /// + internal static string PasswordAnswerInvalid { + get { + return ResourceManager.GetString("PasswordAnswerInvalid", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Password exceeds maximum length allowed.. + /// + internal static string PasswordExceedsMaxLength { + get { + return ResourceManager.GetString("PasswordExceedsMaxLength", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Password format not supported.. + /// + internal static string PasswordFormatNotSupported { + get { + return ResourceManager.GetString("PasswordFormatNotSupported", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The length of parameter '{0}' needs to be greater or equal to '{1}'.. + /// + internal static string PasswordNotLongEnough { + get { + return ResourceManager.GetString("PasswordNotLongEnough", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Password question supplied is invalid.. + /// + internal static string PasswordQuestionInvalid { + get { + return ResourceManager.GetString("PasswordQuestionInvalid", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Password answer required for password reset.. + /// + internal static string PasswordRequiredForReset { + get { + return ResourceManager.GetString("PasswordRequiredForReset", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Reset password canceled due to password validation failure.. + /// + internal static string PasswordResetCanceledNotValid { + get { + return ResourceManager.GetString("PasswordResetCanceledNotValid", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Password Reset is not enabled.. + /// + internal static string PasswordResetNotEnabled { + get { + return ResourceManager.GetString("PasswordResetNotEnabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Password Retrieval Not Enabled.. + /// + internal static string PasswordRetrievalNotEnabled { + get { + return ResourceManager.GetString("PasswordRetrievalNotEnabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to MySqlSimpleMembershipProvider is already initialized and its schema does not match the MySqlMembershipProvider schema.. + /// + internal static string PreviousProviderException { + get { + return ResourceManager.GetString("PreviousProviderException", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Profile update failed.. + /// + internal static string ProfileUpdateFailed { + get { + return ResourceManager.GetString("ProfileUpdateFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The role '{0}' already exists.. + /// + internal static string RoleAlreadyExists { + get { + return ResourceManager.GetString("RoleAlreadyExists", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The role '{0}' is in use.. + /// + internal static string RoleInUse { + get { + return ResourceManager.GetString("RoleInUse", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Role name already exists.. + /// + internal static string RoleNameAlreadyExists { + get { + return ResourceManager.GetString("RoleNameAlreadyExists", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Role name not found.. + /// + internal static string RoleNameNotFound { + get { + return ResourceManager.GetString("RoleNameNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed to save the request token secret value '{0}'.. + /// + internal static string SaveTokenFailed { + get { + return ResourceManager.GetString("SaveTokenFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The MySqlSimpleMembershipProvider is already initialized.. + /// + internal static string SimpleMembershipAlreadyInitialized { + get { + return ResourceManager.GetString("SimpleMembershipAlreadyInitialized", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The membership provider was not initialized, it must be initialized before start using it.. + /// + internal static string SimpleMembershipNotInitialized { + get { + return ResourceManager.GetString("SimpleMembershipNotInitialized", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The MySqlSimpleRoleProvider is already initialized.. + /// + internal static string SimpleRoleAlreadyInitialized { + get { + return ResourceManager.GetString("SimpleRoleAlreadyInitialized", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The connection string name is missing for the MySqlSiteMapProvider. + /// + internal static string SiteMapConnectionStringMissing { + get { + return ResourceManager.GetString("SiteMapConnectionStringMissing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to create application.. + /// + internal static string UnableToCreateApplication { + get { + return ResourceManager.GetString("UnableToCreateApplication", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to create user.. + /// + internal static string UnableToCreateUser { + get { + return ResourceManager.GetString("UnableToCreateUser", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to lock out user.. + /// + internal static string UnableToLockOutUser { + get { + return ResourceManager.GetString("UnableToLockOutUser", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to retrieve profile data from database.. + /// + internal static string UnableToRetrieveProfileData { + get { + return ResourceManager.GetString("UnableToRetrieveProfileData", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to update failure count. Membership database may be corrupt.. + /// + internal static string UnableToUpdateFailureCount { + get { + return ResourceManager.GetString("UnableToUpdateFailureCount", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unsupported password format.. + /// + internal static string UnsupportedPasswordFormat { + get { + return ResourceManager.GetString("UnsupportedPasswordFormat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Failed to update the request token secret value '{0}'.. + /// + internal static string UpdateTokenFailed { + get { + return ResourceManager.GetString("UpdateTokenFailed", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User {0} already exists.. + /// + internal static string UserAlreadyExists { + get { + return ResourceManager.GetString("UserAlreadyExists", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to UserIdColumn configuration was not initialized.. + /// + internal static string UserIdColumnNotInitialized { + get { + return ResourceManager.GetString("UserIdColumnNotInitialized", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User is already in role.. + /// + internal static string UserIsAlreadyInRole { + get { + return ResourceManager.GetString("UserIsAlreadyInRole", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The supplied user is locked out.. + /// + internal static string UserIsLockedOut { + get { + return ResourceManager.GetString("UserIsLockedOut", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to UserNameColumn configuration was not initialized.. + /// + internal static string UserNameColumnNotInitialized { + get { + return ResourceManager.GetString("UserNameColumnNotInitialized", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Username not found.. + /// + internal static string UsernameNotFound { + get { + return ResourceManager.GetString("UsernameNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User not found int the table {0}.. + /// + internal static string UserNotFound { + get { + return ResourceManager.GetString("UserNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to User not in role.. + /// + internal static string UserNotInRole { + get { + return ResourceManager.GetString("UserNotInRole", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to UserTableName configuration was not initialized.. + /// + internal static string UserTableNameNotInitilized { + get { + return ResourceManager.GetString("UserTableNameNotInitilized", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unable to find the table users {0}. Please create it or initialize the MySqlSimpleMembershipProvider with 'createTables=true'.. + /// + internal static string UserTableNotFound { + get { + return ResourceManager.GetString("UserTableNotFound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The validate password operation was canceled.. + /// + internal static string ValidatePasswordCanceled { + get { + return ResourceManager.GetString("ValidatePasswordCanceled", resourceCulture); + } + } + } +} diff --git a/MySql.Web/src/Properties/Resources.resx b/MySql.Web/src/Properties/Resources.resx new file mode 100644 index 000000000..101e7193a --- /dev/null +++ b/MySql.Web/src/Properties/Resources.resx @@ -0,0 +1,309 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + Cannot delete a populated role. + + + Setting EnablePasswordRetrieval to true when PasswordFormat is Hashed is not supported. + + + Cannot unencode a hashed password. + + + There was an error during membership provider initilization. + + + There was an error during role provider initilization. + + + There was an error during profile provider initilization. + + + There was an error resetting the password. + + + Incorrect password answer. + + + Invalid characters in user name. + + + Change password canceled due to New password validation failure. + + + Password answer required for password reset. + + + Reset password canceled due to password validation failure. + + + Password Reset is not enabled. + + + Password Retrieval Not Enabled. + + + Profile update failed. + + + Role name already exists. + + + Role name not found. + + + Unable to lock out user. + + + Unable to retrieve profile data from database. + + + Unable to update failure count. Membership database may be corrupt. + + + Unsupported password format. + + + User is already in role. + + + The supplied user is locked out. + + + Username not found. + + + User not in role. + + + Unable to initialize provider. Missing or incorrect schema. + + + Unable to create application. + + + Unable to create user. + + + Change password operation was canceled. + + + Non alpha numeric characters in '{0}' needs to be greater than or equal to '{1}'. + + + The length of parameter '{0}' needs to be greater or equal to '{1}'. + + + The validate password operation was canceled. + + + Password answer supplied is invalid. + + + Password question supplied is invalid. + + + Role names must not be null or empty. + + + User names must not be null or empty. + + + The mono runtime did not support hashed passwords. Please use clear or encrypted passwords. + + + The connection string name is missing for the MySqlSiteMapProvider + + + Failed to clear the token for the userid {0} in the table {1} after password update. + + + An unexpected error occurred while creating the role '{0}'. + + + Failed to delete OAuth Account, combination of provider '{0}' and provider user id '{1}' not found. + + + Failed to generates the PasswordVerificationToken, update not performed to Database. + + + Please provide a valid value: value provided is null or empty. + + + Some of the values in the arrays received are null or empty, please verify it. + + + User {0} not found in the table {1}. + + + There is no connection string configured. + + + Password exceeds maximum length allowed. + + + Password format not supported. + + + MySqlSimpleMembershipProvider is already initialized and its schema does not match the MySqlMembershipProvider schema. + + + The role '{0}' already exists. + + + The role '{0}' is in use. + + + Failed to save the request token secret value '{0}'. + + + The MySqlSimpleMembershipProvider is already initialized. + + + The membership provider was not initialized, it must be initialized before start using it. + + + The MySqlSimpleRoleProvider is already initialized. + + + Failed to update the request token secret value '{0}'. + + + User {0} already exists. + + + UserIdColumn configuration was not initialized. + + + UserNameColumn configuration was not initialized. + + + User not found int the table {0}. + + + UserTableName configuration was not initialized. + + + Unable to find the table users {0}. Please create it or initialize the MySqlSimpleMembershipProvider with 'createTables=true'. + + + You cannot specify both a connection string name and a connection string. + + \ No newline at end of file diff --git a/MySql.Web/src/Properties/VersionInfo.cs b/MySql.Web/src/Properties/VersionInfo.cs new file mode 100644 index 000000000..e577111b1 --- /dev/null +++ b/MySql.Web/src/Properties/VersionInfo.cs @@ -0,0 +1,46 @@ +// Copyright © 2024, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Reflection; +using System.Resources; + +// +// 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 Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("9.4.0")] +[assembly: AssemblyInformationalVersion("9.4.0.0")] +[assembly: AssemblyFileVersion("9.4.0.0")] +[assembly: NeutralResourcesLanguage("en-US")] diff --git a/Source/MySql.Web/Properties/schema1.sql b/MySql.Web/src/Properties/schema1.sql similarity index 98% rename from Source/MySql.Web/Properties/schema1.sql rename to MySql.Web/src/Properties/schema1.sql index 0b253cb86..ec80889ac 100644 --- a/Source/MySql.Web/Properties/schema1.sql +++ b/MySql.Web/src/Properties/schema1.sql @@ -1,33 +1,33 @@ -CREATE TABLE mysql_Membership(`PKID` varchar(36) NOT NULL, - Username varchar(255) NOT NULL, - ApplicationName varchar(255) NOT NULL, - Email varchar(128) NOT NULL, - Comment varchar(255) default NULL, - Password varchar(128) NOT NULL, - PasswordQuestion varchar(255) default NULL, - PasswordAnswer varchar(255) default NULL, - IsApproved tinyint(1) default NULL, - LastActivityDate datetime default NULL, - LastLoginDate datetime default NULL, - LastPasswordChangedDate datetime default NULL, - CreationDate datetime default NULL, - IsOnline tinyint(1) default NULL, - IsLockedOut tinyint(1) default NULL, - LastLockedOutDate datetime default NULL, - FailedPasswordAttemptCount int(10) unsigned default NULL, - FailedPasswordAttemptWindowStart datetime default NULL, - FailedPasswordAnswerAttemptCount int(10) unsigned default NULL, - FailedPasswordAnswerAttemptWindowStart datetime default NULL, - PRIMARY KEY (`PKID`)) DEFAULT CHARSET=latin1 COMMENT='1'; - -CREATE TABLE mysql_UsersInRoles(`Username` varchar(255) NOT NULL, - `Rolename` varchar(255) NOT NULL, `ApplicationName` varchar(255) NOT NULL, - KEY `Username` (`Username`,`Rolename`,`ApplicationName`) - ) DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - -CREATE TABLE mysql_Roles(`Rolename` varchar(255) NOT NULL, - `ApplicationName` varchar(255) NOT NULL, - KEY `Rolename` (`Rolename`,`ApplicationName`) - ) DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; - +CREATE TABLE mysql_Membership(`PKID` varchar(36) NOT NULL, + Username varchar(255) NOT NULL, + ApplicationName varchar(255) NOT NULL, + Email varchar(128) NOT NULL, + Comment varchar(255) default NULL, + Password varchar(128) NOT NULL, + PasswordQuestion varchar(255) default NULL, + PasswordAnswer varchar(255) default NULL, + IsApproved tinyint(1) default NULL, + LastActivityDate datetime default NULL, + LastLoginDate datetime default NULL, + LastPasswordChangedDate datetime default NULL, + CreationDate datetime default NULL, + IsOnline tinyint(1) default NULL, + IsLockedOut tinyint(1) default NULL, + LastLockedOutDate datetime default NULL, + FailedPasswordAttemptCount int(10) unsigned default NULL, + FailedPasswordAttemptWindowStart datetime default NULL, + FailedPasswordAnswerAttemptCount int(10) unsigned default NULL, + FailedPasswordAnswerAttemptWindowStart datetime default NULL, + PRIMARY KEY (`PKID`)) DEFAULT CHARSET=latin1 COMMENT='1'; + +CREATE TABLE mysql_UsersInRoles(`Username` varchar(255) NOT NULL, + `Rolename` varchar(255) NOT NULL, `ApplicationName` varchar(255) NOT NULL, + KEY `Username` (`Username`,`Rolename`,`ApplicationName`) + ) DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; + +CREATE TABLE mysql_Roles(`Rolename` varchar(255) NOT NULL, + `ApplicationName` varchar(255) NOT NULL, + KEY `Rolename` (`Rolename`,`ApplicationName`) + ) DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC; + \ No newline at end of file diff --git a/Source/MySql.Web/Properties/schema10.sql b/MySql.Web/src/Properties/schema10.sql similarity index 96% rename from Source/MySql.Web/Properties/schema10.sql rename to MySql.Web/src/Properties/schema10.sql index 08f758ccc..3bbc8dcde 100644 --- a/Source/MySql.Web/Properties/schema10.sql +++ b/MySql.Web/src/Properties/schema10.sql @@ -1,23 +1,23 @@ -CREATE TABLE my_aspnet_personalizationperuser( -id INT PRIMARY KEY AUTO_INCREMENT, -applicationId INT NOT NULL, -pathId VARCHAR(36) DEFAULT NULL, -userId INT, -pageSettings BLOB NOT NULL, -lastUpdatedDate DATETIME NOT NULL)DEFAULT CHARSET=latin1 ; - - -CREATE TABLE my_aspnet_personalizationallusers( -pathId VARCHAR(36) PRIMARY KEY, -pageSettings BLOB NOT NULL, -lastUpdatedDate DATETIME NOT NULL)DEFAULT CHARSET=latin1 ; - -CREATE TABLE my_aspnet_paths -( -applicationId INT NOT NULL, -pathId VARCHAR(36) PRIMARY KEY, -path VARCHAR(256) NOT NULL, -loweredPath VARCHAR(256) NOT NULL -)DEFAULT CHARSET=latin1 ; - +CREATE TABLE my_aspnet_personalizationperuser( +id INT PRIMARY KEY AUTO_INCREMENT, +applicationId INT NOT NULL, +pathId VARCHAR(36) DEFAULT NULL, +userId INT, +pageSettings BLOB NOT NULL, +lastUpdatedDate DATETIME NOT NULL)DEFAULT CHARSET=latin1 ; + + +CREATE TABLE my_aspnet_personalizationallusers( +pathId VARCHAR(36) PRIMARY KEY, +pageSettings BLOB NOT NULL, +lastUpdatedDate DATETIME NOT NULL)DEFAULT CHARSET=latin1 ; + +CREATE TABLE my_aspnet_paths +( +applicationId INT NOT NULL, +pathId VARCHAR(36) PRIMARY KEY, +path VARCHAR(256) NOT NULL, +loweredPath VARCHAR(256) NOT NULL +)DEFAULT CHARSET=latin1 ; + UPDATE my_aspnet_schemaversion SET version=10; \ No newline at end of file diff --git a/Source/MySql.Web/Properties/schema11.sql b/MySql.Web/src/Properties/schema11.sql similarity index 100% rename from Source/MySql.Web/Properties/schema11.sql rename to MySql.Web/src/Properties/schema11.sql diff --git a/Source/MySql.Web/Properties/schema2.sql b/MySql.Web/src/Properties/schema2.sql similarity index 97% rename from Source/MySql.Web/Properties/schema2.sql rename to MySql.Web/src/Properties/schema2.sql index a34b8d152..69f091f8a 100644 --- a/Source/MySql.Web/Properties/schema2.sql +++ b/MySql.Web/src/Properties/schema2.sql @@ -1,7 +1,7 @@ - ALTER TABLE mysql_Membership - ADD PasswordKey char(32) AFTER Password, - ADD PasswordFormat tinyint AFTER PasswordKey, - CHANGE Email Email VARCHAR(128), COMMENT='2'; - - + ALTER TABLE mysql_Membership + ADD PasswordKey char(32) AFTER Password, + ADD PasswordFormat tinyint AFTER PasswordKey, + CHANGE Email Email VARCHAR(128), COMMENT='2'; + + \ No newline at end of file diff --git a/Source/MySql.Web/Properties/schema3.sql b/MySql.Web/src/Properties/schema3.sql similarity index 97% rename from Source/MySql.Web/Properties/schema3.sql rename to MySql.Web/src/Properties/schema3.sql index 8016b4b07..ee38a1017 100644 --- a/Source/MySql.Web/Properties/schema3.sql +++ b/MySql.Web/src/Properties/schema3.sql @@ -1,85 +1,85 @@ -/* Provider schema block -- version 3 */ - -/* create our application and user tables */ -create table my_aspnet_applications(id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(256), description VARCHAR(256)); -create table my_aspnet_users(id INT PRIMARY KEY AUTO_INCREMENT, - applicationId INT NOT NULL, name VARCHAR(256) NOT NULL, - isAnonymous TINYINT(1) NOT NULL DEFAULT 1, lastActivityDate DATETIME); -create table my_aspnet_profiles(userId INT PRIMARY KEY, valueindex longtext, stringdata longtext, binarydata longblob, lastUpdatedDate timestamp); -create table my_aspnet_schemaversion(version INT); - -insert into my_aspnet_schemaversion VALUES (3); - -/* now we need to migrate all applications into our apps table */ -insert into my_aspnet_applications (name) select ApplicationName from mysql_Membership UNION select ApplicationName from mysql_UsersInRoles; - -/* now we make our changes to the existing tables */ -alter table mysql_Membership - rename to my_aspnet_membership, - drop primary key, - drop column pkid, - drop column IsOnline, - add column userId INT FIRST, - add column applicationId INT AFTER userId; - -alter table mysql_Roles - rename to my_aspnet_roles, - drop key Rolename, - add column id INT PRIMARY KEY AUTO_INCREMENT FIRST, - add column applicationId INT NOT NULL AFTER id; - -alter table mysql_UsersInRoles - drop key Username, - rename to my_aspnet_usersinroles, - add column userId INT FIRST, - add column roleId INT AFTER userId, - add column applicationId INT AFTER roleId; - -ALTER TABLE my_aspnet_membership CONVERT TO CHARACTER SET DEFAULT; -ALTER TABLE my_aspnet_roles CONVERT TO CHARACTER SET DEFAULT; -ALTER TABLE my_aspnet_usersinroles CONVERT TO CHARACTER SET DEFAULT; - -/* these next lines set the application Id on our tables appropriately */ -update my_aspnet_membership m, my_aspnet_applications a set m.applicationId = a.id where a.name=m.ApplicationName; -update my_aspnet_roles r, my_aspnet_applications a set r.applicationId = a.id where a.name=r.ApplicationName; -update my_aspnet_usersinroles u, my_aspnet_applications a set u.applicationId = a.id where a.name=u.ApplicationName; - -/* now merge our usernames into our users table */ -insert into my_aspnet_users (applicationId, name) - select applicationId, Username from my_aspnet_membership - UNION select applicationId, Username from my_aspnet_usersinroles; - -/* now set the user ids in our tables accordingly */ -update my_aspnet_membership m, my_aspnet_users u set m.userId = u.id where u.name=m.Username AND u.applicationId=m.applicationId; -update my_aspnet_usersinroles r, my_aspnet_users u set r.userId = u.id where u.name=r.Username AND u.applicationId=r.applicationId; - -/* now update the isanonymous and last activity date fields for the users */ -update my_aspnet_users u, my_aspnet_membership m - set u.isAnonymous=0, u.lastActivityDate=m.LastActivityDate - where u.name = m.Username; - -/* make final changes to our tables */ -alter table my_aspnet_membership - drop column Username, - drop column ApplicationName, - drop column applicationId, - add primary key (userId); - -/* next we set our role id values appropriately */ -update my_aspnet_usersinroles u, my_aspnet_roles r set u.roleId = r.id where u.Rolename = r.Rolename and r.applicationId=u.applicationId; - -/* now we make the final changes to our roles tables */ -alter table my_aspnet_roles - drop column ApplicationName, - change column Rolename name VARCHAR(255) NOT NULL; - -alter table my_aspnet_usersinroles - drop column ApplicationName, - drop column applicationId, - drop column Username, - drop column Rolename, - add primary key (userId, roleId); - - - +/* Provider schema block -- version 3 */ + +/* create our application and user tables */ +create table my_aspnet_applications(id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(256), description VARCHAR(256)); +create table my_aspnet_users(id INT PRIMARY KEY AUTO_INCREMENT, + applicationId INT NOT NULL, name VARCHAR(256) NOT NULL, + isAnonymous TINYINT(1) NOT NULL DEFAULT 1, lastActivityDate DATETIME); +create table my_aspnet_profiles(userId INT PRIMARY KEY, valueindex longtext, stringdata longtext, binarydata longblob, lastUpdatedDate timestamp); +create table my_aspnet_schemaversion(version INT); + +insert into my_aspnet_schemaversion VALUES (3); + +/* now we need to migrate all applications into our apps table */ +insert into my_aspnet_applications (name) select ApplicationName from mysql_Membership UNION select ApplicationName from mysql_UsersInRoles; + +/* now we make our changes to the existing tables */ +alter table mysql_Membership + rename to my_aspnet_membership, + drop primary key, + drop column pkid, + drop column IsOnline, + add column userId INT FIRST, + add column applicationId INT AFTER userId; + +alter table mysql_Roles + rename to my_aspnet_roles, + drop key Rolename, + add column id INT PRIMARY KEY AUTO_INCREMENT FIRST, + add column applicationId INT NOT NULL AFTER id; + +alter table mysql_UsersInRoles + drop key Username, + rename to my_aspnet_usersinroles, + add column userId INT FIRST, + add column roleId INT AFTER userId, + add column applicationId INT AFTER roleId; + +ALTER TABLE my_aspnet_membership CONVERT TO CHARACTER SET DEFAULT; +ALTER TABLE my_aspnet_roles CONVERT TO CHARACTER SET DEFAULT; +ALTER TABLE my_aspnet_usersinroles CONVERT TO CHARACTER SET DEFAULT; + +/* these next lines set the application Id on our tables appropriately */ +update my_aspnet_membership m, my_aspnet_applications a set m.applicationId = a.id where a.name=m.ApplicationName; +update my_aspnet_roles r, my_aspnet_applications a set r.applicationId = a.id where a.name=r.ApplicationName; +update my_aspnet_usersinroles u, my_aspnet_applications a set u.applicationId = a.id where a.name=u.ApplicationName; + +/* now merge our usernames into our users table */ +insert into my_aspnet_users (applicationId, name) + select applicationId, Username from my_aspnet_membership + UNION select applicationId, Username from my_aspnet_usersinroles; + +/* now set the user ids in our tables accordingly */ +update my_aspnet_membership m, my_aspnet_users u set m.userId = u.id where u.name=m.Username AND u.applicationId=m.applicationId; +update my_aspnet_usersinroles r, my_aspnet_users u set r.userId = u.id where u.name=r.Username AND u.applicationId=r.applicationId; + +/* now update the isanonymous and last activity date fields for the users */ +update my_aspnet_users u, my_aspnet_membership m + set u.isAnonymous=0, u.lastActivityDate=m.LastActivityDate + where u.name = m.Username; + +/* make final changes to our tables */ +alter table my_aspnet_membership + drop column Username, + drop column ApplicationName, + drop column applicationId, + add primary key (userId); + +/* next we set our role id values appropriately */ +update my_aspnet_usersinroles u, my_aspnet_roles r set u.roleId = r.id where u.Rolename = r.Rolename and r.applicationId=u.applicationId; + +/* now we make the final changes to our roles tables */ +alter table my_aspnet_roles + drop column ApplicationName, + change column Rolename name VARCHAR(255) NOT NULL; + +alter table my_aspnet_usersinroles + drop column ApplicationName, + drop column applicationId, + drop column Username, + drop column Rolename, + add primary key (userId, roleId); + + + \ No newline at end of file diff --git a/Source/MySql.Web/Properties/schema4.sql b/MySql.Web/src/Properties/schema4.sql similarity index 98% rename from Source/MySql.Web/Properties/schema4.sql rename to MySql.Web/src/Properties/schema4.sql index 4f91e3145..1470878dd 100644 --- a/Source/MySql.Web/Properties/schema4.sql +++ b/MySql.Web/src/Properties/schema4.sql @@ -1,5 +1,5 @@ -ALTER TABLE my_aspnet_membership CONVERT TO CHARACTER SET DEFAULT; -ALTER TABLE my_aspnet_roles CONVERT TO CHARACTER SET DEFAULT; -ALTER TABLE my_aspnet_usersinroles CONVERT TO CHARACTER SET DEFAULT; - -UPDATE my_aspnet_schemaversion SET version=4 WHERE version=3; +ALTER TABLE my_aspnet_membership CONVERT TO CHARACTER SET DEFAULT; +ALTER TABLE my_aspnet_roles CONVERT TO CHARACTER SET DEFAULT; +ALTER TABLE my_aspnet_usersinroles CONVERT TO CHARACTER SET DEFAULT; + +UPDATE my_aspnet_schemaversion SET version=4 WHERE version=3; diff --git a/Source/MySql.Web/Properties/schema5.sql b/MySql.Web/src/Properties/schema5.sql similarity index 96% rename from Source/MySql.Web/Properties/schema5.sql rename to MySql.Web/src/Properties/schema5.sql index 39e1f6ca1..d1708c5a6 100644 --- a/Source/MySql.Web/Properties/schema5.sql +++ b/MySql.Web/src/Properties/schema5.sql @@ -1,30 +1,30 @@ -CREATE TABLE my_aspnet_sessions -( - SessionId varchar(191) NOT NULL, - ApplicationId int NOT NULL, - Created datetime NOT NULL, - Expires datetime NOT NULL, - LockDate datetime NOT NULL, - LockId int NOT NULL, - Timeout int NOT NULL, - Locked tinyint(1) NOT NULL, - SessionItems BLOB, - Flags int NOT NULL, - primary key (SessionId,ApplicationId) -) DEFAULT CHARSET=latin1; - -/* - Cleaning up timed out sessions. - In 5.1 events provide a support for periodic jobs. - In older version we need a do-it-yourself event. -*/ -CREATE TABLE my_aspnet_sessioncleanup -( - LastRun datetime NOT NULL, - IntervalMinutes int NOT NULL -); - -INSERT INTO my_aspnet_sessioncleanup(LastRun,IntervalMinutes) values(NOW(), 10); - -UPDATE my_aspnet_schemaversion SET version=5; - +CREATE TABLE my_aspnet_sessions +( + SessionId varchar(191) NOT NULL, + ApplicationId int NOT NULL, + Created datetime NOT NULL, + Expires datetime NOT NULL, + LockDate datetime NOT NULL, + LockId int NOT NULL, + Timeout int NOT NULL, + Locked tinyint(1) NOT NULL, + SessionItems BLOB, + Flags int NOT NULL, + primary key (SessionId,ApplicationId) +) DEFAULT CHARSET=latin1; + +/* + Cleaning up timed out sessions. + In 5.1 events provide a support for periodic jobs. + In older version we need a do-it-yourself event. +*/ +CREATE TABLE my_aspnet_sessioncleanup +( + LastRun datetime NOT NULL, + IntervalMinutes int NOT NULL +); + +INSERT INTO my_aspnet_sessioncleanup(LastRun,IntervalMinutes) values(NOW(), 10); + +UPDATE my_aspnet_schemaversion SET version=5; + diff --git a/Source/MySql.Web/Properties/schema6.sql b/MySql.Web/src/Properties/schema6.sql similarity index 97% rename from Source/MySql.Web/Properties/schema6.sql rename to MySql.Web/src/Properties/schema6.sql index 6147d16f3..58aad3cd1 100644 --- a/Source/MySql.Web/Properties/schema6.sql +++ b/MySql.Web/src/Properties/schema6.sql @@ -1,4 +1,4 @@ -ALTER TABLE my_aspnet_sessions CONVERT TO CHARACTER SET DEFAULT; -ALTER TABLE my_aspnet_sessions MODIFY SessionItems LONGBLOB; - -UPDATE my_aspnet_schemaversion SET version=6; +ALTER TABLE my_aspnet_sessions CONVERT TO CHARACTER SET DEFAULT; +ALTER TABLE my_aspnet_sessions MODIFY SessionItems LONGBLOB; + +UPDATE my_aspnet_schemaversion SET version=6; diff --git a/Source/MySql.Web/Properties/schema7.sql b/MySql.Web/src/Properties/schema7.sql similarity index 98% rename from Source/MySql.Web/Properties/schema7.sql rename to MySql.Web/src/Properties/schema7.sql index 0708c129e..be4a9691b 100644 --- a/Source/MySql.Web/Properties/schema7.sql +++ b/MySql.Web/src/Properties/schema7.sql @@ -1,11 +1,11 @@ -RENAME TABLE my_aspnet_Applications TO my_aspnet_applications; -RENAME TABLE my_aspnet_Membership TO my_aspnet_membership; -RENAME TABLE my_aspnet_Profiles TO my_aspnet_profiles; -RENAME TABLE my_aspnet_Roles TO my_aspnet_roles; -RENAME TABLE my_aspnet_SchemaVersion TO my_aspnet_schemaversion; -RENAME TABLE my_aspnet_SessionCleanup TO my_aspnet_sessioncleanup; -RENAME TABLE my_aspnet_Sessions TO my_aspnet_sessions; -RENAME TABLE my_aspnet_Users TO my_aspnet_users; -RENAME TABLE my_aspnet_UsersInRoles TO my_aspnet_usersinroles; - +RENAME TABLE my_aspnet_Applications TO my_aspnet_applications; +RENAME TABLE my_aspnet_Membership TO my_aspnet_membership; +RENAME TABLE my_aspnet_Profiles TO my_aspnet_profiles; +RENAME TABLE my_aspnet_Roles TO my_aspnet_roles; +RENAME TABLE my_aspnet_SchemaVersion TO my_aspnet_schemaversion; +RENAME TABLE my_aspnet_SessionCleanup TO my_aspnet_sessioncleanup; +RENAME TABLE my_aspnet_Sessions TO my_aspnet_sessions; +RENAME TABLE my_aspnet_Users TO my_aspnet_users; +RENAME TABLE my_aspnet_UsersInRoles TO my_aspnet_usersinroles; + UPDATE my_aspnet_schemaversion SET version=7; \ No newline at end of file diff --git a/Source/MySql.Web/Properties/schema8.sql b/MySql.Web/src/Properties/schema8.sql similarity index 97% rename from Source/MySql.Web/Properties/schema8.sql rename to MySql.Web/src/Properties/schema8.sql index 108026f76..8fcc73642 100644 --- a/Source/MySql.Web/Properties/schema8.sql +++ b/MySql.Web/src/Properties/schema8.sql @@ -1,6 +1,6 @@ -DELETE FROM my_aspnet_sessioncleanup; - -ALTER TABLE my_aspnet_sessioncleanup ADD ApplicationId INT NOT NULL; -ALTER TABLE my_aspnet_sessioncleanup ADD Primary Key (ApplicationId); - +DELETE FROM my_aspnet_sessioncleanup; + +ALTER TABLE my_aspnet_sessioncleanup ADD ApplicationId INT NOT NULL; +ALTER TABLE my_aspnet_sessioncleanup ADD Primary Key (ApplicationId); + UPDATE my_aspnet_schemaversion SET version=8; \ No newline at end of file diff --git a/Source/MySql.Web/Properties/schema9.sql b/MySql.Web/src/Properties/schema9.sql similarity index 100% rename from Source/MySql.Web/Properties/schema9.sql rename to MySql.Web/src/Properties/schema9.sql diff --git a/Source/MySql.Web/RoleProvider.cs b/MySql.Web/src/RoleProvider.cs similarity index 84% rename from Source/MySql.Web/RoleProvider.cs rename to MySql.Web/src/RoleProvider.cs index d64ca4e76..ef8177e1d 100644 --- a/Source/MySql.Web/RoleProvider.cs +++ b/MySql.Web/src/RoleProvider.cs @@ -1,618 +1,643 @@ -// Copyright (c) 2004-2008 MySQL AB, 2008-2009 Sun Microsystems, Inc. 2014, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -// This code was contributed by Sean Wright (srwright@alcor.concordia.ca) on 2007-01-12 -// The copyright was assigned and transferred under the terms of -// the MySQL Contributor License Agreement (CLA) - -using System; -using System.Collections.Specialized; -using System.Configuration; -using System.Configuration.Provider; -using System.Diagnostics; -using System.Web.Hosting; -using System.Web.Security; -using MySql.Data.MySqlClient; -using System.Collections.Generic; -using MySql.Web.Common; -using MySql.Web.Properties; -using System.Web; -using MySql.Web.General; - -namespace MySql.Web.Security -{ - /// - /// Manages storage of role membership information for an ASP.NET application in a MySQL database. - /// - public sealed class MySQLRoleProvider : RoleProvider - { - private string eventSource = "MySQLRoleProvider"; - private string eventLog = "Application"; - private string exceptionMessage = "An exception occurred. Please check the Event Log."; - private ConnectionStringSettings pConnectionStringSettings; - private string connectionString; - private bool pWriteExceptionsToEventLog = false; - private Application app; - - /// - /// Initializes the provider. - /// - /// The friendly name of the provider. - /// A collection of the name/value pairs representing the provider-specific attributes specified in the configuration for this provider. - /// The name of the provider is null. - /// The name of the provider has a length of zero. - /// An attempt is made to call on a provider after the provider has already been initialized. - public override void Initialize(string name, NameValueCollection config) - { - if (config == null) - { - throw new ArgumentNullException("config"); - } - if (name == null || name.Length == 0) - { - name = "MySQLRoleProvider"; - } - if (string.IsNullOrEmpty(config["description"])) - { - config.Remove("description"); - config.Add("description", "MySQL Role provider"); - } - base.Initialize(name, config); - - string applicationName = HostingEnvironment.ApplicationVirtualPath; - if (!String.IsNullOrEmpty(config["applicationName"])) - applicationName = config["applicationName"]; - - if (!(config["writeExceptionsToEventLog"] == null)) - { - if (config["writeExceptionsToEventLog"].ToUpper() == "TRUE") - { - pWriteExceptionsToEventLog = true; - } - } - pConnectionStringSettings = ConfigurationManager.ConnectionStrings[config["connectionStringName"]]; - if (pConnectionStringSettings != null) - connectionString = pConnectionStringSettings.ConnectionString.Trim(); - else - connectionString = ""; - - if (String.IsNullOrEmpty(connectionString)) return; - - // make sure our schema is up to date - SchemaManager.CheckSchema(connectionString, config); - - app = new Application(applicationName, Description); - } - - #region Properties - - /// - /// Gets or sets the name of the application to store and retrieve role information for. - /// - /// The name of the application to store and retrieve role information for. - /// - /// - /// - public override string ApplicationName - { - get { return app.Name; } - set { app.Name = value; } - } - - /// - /// Gets or sets a value indicating whether [write exceptions to event log]. - /// - /// - /// true if exceptions should be written to the event log; otherwise, false. - /// - /// - /// - /// - public bool WriteExceptionsToEventLog - { - get { return pWriteExceptionsToEventLog; } - set { pWriteExceptionsToEventLog = value; } - } - - #endregion - - #region Public Methods - - /// - /// Adds the users to roles. - /// - /// The usernames. - /// The rolenames. - public override void AddUsersToRoles(string[] usernames, string[] rolenames) - { - if (rolenames == null || rolenames.Length == 0) return; - if (usernames == null || usernames.Length == 0) return; - - foreach (string rolename in rolenames) - { - if (String.IsNullOrEmpty(rolename)) - throw new ArgumentException(Properties.Resources.IllegalRoleName, "rolenames"); - if (!RoleExists(rolename)) - throw new ProviderException(Properties.Resources.RoleNameNotFound); - } - - foreach (string username in usernames) - { - if (String.IsNullOrEmpty(username)) - throw new ArgumentException(Properties.Resources.IllegalUserName, "usernames"); - if (username.IndexOf(',') != -1) - throw new ArgumentException(Properties.Resources.InvalidCharactersInUserName); - - foreach (string rolename in rolenames) - { - if (IsUserInRole(username, rolename)) - throw new ProviderException(Properties.Resources.UserIsAlreadyInRole); - } - } - - using (MySqlConnection connection = new MySqlConnection(connectionString)) - { - MySqlTransaction txn = null; - try - { - connection.Open(); - txn = connection.BeginTransaction(); - MySqlCommand cmd = new MySqlCommand( - "INSERT INTO my_aspnet_usersinroles VALUES(@userId, @roleId)", connection); - cmd.Parameters.Add("@userId", MySqlDbType.Int32); - cmd.Parameters.Add("@roleId", MySqlDbType.Int32); - foreach (string username in usernames) - { - // either create a new user or fetch the existing user id - long userId = SchemaManager.CreateOrFetchUserId(connection, - username, app.FetchId(connection), true); - foreach (string rolename in rolenames) - { - int roleId = GetRoleId(connection, rolename); - cmd.Parameters[0].Value = userId; - cmd.Parameters[1].Value = roleId; - cmd.ExecuteNonQuery(); - } - } - txn.Commit(); - } - catch (Exception ex) - { - if (txn != null) - txn.Rollback(); - if (WriteExceptionsToEventLog) - WriteToEventLog(ex, "AddUsersToRoles"); - throw; - } - } - } - - /// - /// Creates the role. - /// - /// The rolename. - public override void CreateRole(string rolename) - { - if (rolename.IndexOf(',') != -1) - throw new ArgumentException(Properties.Resources.InvalidCharactersInUserName); - if (RoleExists(rolename)) - throw new ProviderException(Properties.Resources.RoleNameAlreadyExists); - - using (MySqlConnection connection = new MySqlConnection(connectionString)) - { - try - { - connection.Open(); - - MySqlCommand cmd = new MySqlCommand( - @"INSERT INTO my_aspnet_roles Values(NULL, @appId, @name)", connection); - cmd.Parameters.AddWithValue("@appId", app.EnsureId(connection)); - cmd.Parameters.AddWithValue("@name", rolename); - cmd.ExecuteNonQuery(); - } - catch (MySqlException e) - { - if (WriteExceptionsToEventLog) - WriteToEventLog(e, "CreateRole"); - throw; - } - } - } - - /// - /// Deletes the role. - /// - /// The rolename. - /// if set to true [throw on populated role]. - /// true if the role was successfully deleted; otherwise, false. - public override bool DeleteRole(string rolename, bool throwOnPopulatedRole) - { - using (MySqlConnection connection = new MySqlConnection(connectionString)) - { - MySqlTransaction txn = null; - try - { - if (!(RoleExists(rolename))) - throw new ProviderException(Properties.Resources.RoleNameNotFound); - if (throwOnPopulatedRole && GetUsersInRole(rolename).Length > 0) - throw new ProviderException(Properties.Resources.CannotDeleteAPopulatedRole); - - connection.Open(); - txn = connection.BeginTransaction(); - - // first delete all the user/role mappings with that roleid - MySqlCommand cmd = new MySqlCommand( - @"DELETE uir FROM my_aspnet_usersinroles uir JOIN - my_aspnet_roles r ON uir.roleId=r.id - WHERE r.name LIKE @rolename AND r.applicationId=@appId", connection); - cmd.Parameters.AddWithValue("@rolename", rolename); - cmd.Parameters.AddWithValue("@appId", app.FetchId(connection)); - cmd.ExecuteNonQuery(); - - // now delete the role itself - cmd.CommandText = @"DELETE FROM my_aspnet_roles WHERE name=@rolename - AND applicationId=@appId"; - cmd.ExecuteNonQuery(); - txn.Commit(); - } - catch (Exception ex) - { - if (txn != null) - txn.Rollback(); - if (WriteExceptionsToEventLog) - WriteToEventLog(ex, "DeleteRole"); - throw; - } - } - return true; - } - - /// - /// Gets a list of all the roles for the configured applicationName. - /// - /// - /// A string array containing the names of all the roles stored in the data source for the configured applicationName. - /// - public override string[] GetAllRoles() - { - using (MySqlConnection connection = new MySqlConnection(connectionString)) - { - connection.Open(); - return GetRolesByUserName(connection, null); - } - } - - /// - /// Gets a list of the roles that a specified user is in for the configured applicationName. - /// - /// The user to return a list of roles for. - /// - /// A string array containing the names of all the roles that the specified user is in for the configured applicationName. - /// - public override string[] GetRolesForUser(string username) - { - using (MySqlConnection connection = new MySqlConnection(connectionString)) - { - connection.Open(); - return GetRolesByUserName(connection, username); - } - } - - /// - /// Gets the users in role. - /// - /// The rolename. - /// A string array containing the names of all the users - /// who are members of the specified role. - public override string[] GetUsersInRole(string rolename) - { - List users = new List(); - - try - { - using (MySqlConnection connection = new MySqlConnection(connectionString)) - { - connection.Open(); - int roleId = GetRoleId(connection, rolename); - - string sql = @"SELECT u.name FROM my_aspnet_users u JOIN - my_aspnet_usersinroles uir ON uir.userId=u.id AND uir.roleId=@roleId - WHERE u.applicationId=@appId"; - MySqlCommand cmd = new MySqlCommand(sql, connection); - cmd.Parameters.AddWithValue("@roleId", roleId); - cmd.Parameters.AddWithValue("@appId", app.FetchId(connection)); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - while (reader.Read()) - users.Add(reader.GetString(0)); - } - } - return users.ToArray(); - } - catch (Exception ex) - { - if (WriteExceptionsToEventLog) - WriteToEventLog(ex, "GetUsersInRole"); - throw; - } - } - - /// - /// Determines whether [is user in role] [the specified username]. - /// - /// The username. - /// The rolename. - /// - /// true if [is user in role] [the specified username]; otherwise, false. - /// - public override bool IsUserInRole(string username, string rolename) - { - try - { - // this will refresh the app id if necessary - if (!RoleExists(rolename)) return false; - - using (MySqlConnection connection = new MySqlConnection(connectionString)) - { - connection.Open(); - - string sql = @"SELECT COUNT(*) FROM my_aspnet_usersinroles uir - JOIN my_aspnet_users u ON uir.userId=u.id - JOIN my_aspnet_roles r ON uir.roleId=r.id - WHERE u.applicationId=@appId AND - u.name = @userName AND r.name = @roleName"; - MySqlCommand cmd = new MySqlCommand(sql, connection); - cmd.Parameters.AddWithValue("@appId", app.FetchId(connection)); - cmd.Parameters.AddWithValue("@userName", username); - cmd.Parameters.AddWithValue("@roleName", rolename); - int count = Convert.ToInt32(cmd.ExecuteScalar()); - return count > 0; - } - } - catch (Exception ex) - { - if (WriteExceptionsToEventLog) - WriteToEventLog(ex, "IsUserInRole"); - throw; - } - } - - /// - /// Removes the users from roles. - /// - /// The usernames. - /// The rolenames. - public override void RemoveUsersFromRoles(string[] usernames, string[] rolenames) - { - if (rolenames == null || rolenames.Length == 0) return; - if (usernames == null || usernames.Length == 0) return; - - foreach (string rolename in rolenames) - { - if (!(RoleExists(rolename))) - throw new ProviderException(Properties.Resources.RoleNameNotFound); - } - - foreach (string username in usernames) - { - foreach (string rolename in rolenames) - { - if (!(IsUserInRole(username, rolename))) - throw new ProviderException(Properties.Resources.UserNotInRole); - } - } - - using (MySqlConnection connection = new MySqlConnection(connectionString)) - { - MySqlTransaction txn = null; - try - { - connection.Open(); - txn = connection.BeginTransaction(); - - string sql = @"DELETE uir FROM my_aspnet_usersinroles uir - JOIN my_aspnet_users u ON uir.userId=u.id - JOIN my_aspnet_roles r ON uir.roleId=r.id - WHERE u.name LIKE @username AND r.name LIKE @rolename - AND u.applicationId=@appId AND r.applicationId=@appId"; - - MySqlCommand cmd = new MySqlCommand(sql, connection); - cmd.Parameters.Add("@username", MySqlDbType.VarChar, 255); - cmd.Parameters.Add("@rolename", MySqlDbType.VarChar, 255); - cmd.Parameters.AddWithValue("@appId", app.FetchId(connection)); - - foreach (string username in usernames) - { - foreach (string rolename in rolenames) - { - cmd.Parameters[0].Value = username; - cmd.Parameters[1].Value = rolename; - cmd.ExecuteNonQuery(); - } - } - txn.Commit(); - } - catch (MySqlException e) - { - if (txn != null) - txn.Rollback(); - if (WriteExceptionsToEventLog) - WriteToEventLog(e, "RemoveUsersFromRoles"); - throw; - } - } - } - - /// - /// Roles the exists. - /// - /// The rolename. - /// true if the role name already exists in the database; otherwise, false. - public override bool RoleExists(string rolename) - { - try - { - using (MySqlConnection connection = new MySqlConnection(connectionString)) - { - connection.Open(); - MySqlCommand cmd = new MySqlCommand( - @"SELECT COUNT(*) FROM my_aspnet_roles WHERE applicationId=@appId - AND name LIKE @name", connection); - cmd.Parameters.AddWithValue("@appId", app.FetchId(connection)); - cmd.Parameters.AddWithValue("@name", rolename); - int count = Convert.ToInt32(cmd.ExecuteScalar()); - return count != 0; - } - } - catch (Exception ex) - { - if (WriteExceptionsToEventLog) - WriteToEventLog(ex, "RoleExists"); - throw; - } - } - - /// - /// Finds the users in role. - /// - /// The rolename. - /// The username to match. - /// A string array containing the names of all the users where the - /// user name matches usernameToMatch and the user is a member of the specified role. - public override string[] FindUsersInRole(string rolename, string usernameToMatch) - { - if (!RoleExists(rolename)) - throw new ProviderException(Properties.Resources.RoleNameNotFound); - - List users = new List(); - - try - { - using (MySqlConnection connection = new MySqlConnection(connectionString)) - { - connection.Open(); - - string sql = @"SELECT u.name FROM my_aspnet_usersinroles uir - JOIN my_aspnet_users u ON uir.userId=u.id - JOIN my_aspnet_roles r ON uir.roleId=r.id - WHERE r.name LIKE @rolename AND - u.name LIKE @username AND - u.applicationId=@appId"; - - MySqlCommand cmd = new MySqlCommand(sql, connection); - cmd.Parameters.AddWithValue("@username", usernameToMatch); - cmd.Parameters.AddWithValue("@rolename", rolename); - cmd.Parameters.AddWithValue("@appId", app.FetchId(connection)); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - while (reader.Read()) - users.Add(reader.GetString(0)); - } - } - return users.ToArray(); - } - catch (MySqlException e) - { - if (WriteExceptionsToEventLog) - WriteToEventLog(e, "FindUsersInRole"); - throw; - } - } - - #endregion - - internal static void DeleteUserData(MySqlConnection connection, int userId) - { - MySqlCommand cmd = new MySqlCommand( - "DELETE FROM my_aspnet_usersinroles WHERE userId=@userId", connection); - cmd.Parameters.AddWithValue("@userId", userId); - cmd.ExecuteNonQuery(); - } - - #region Private Methods - - private string[] GetRolesByUserName(MySqlConnection connection, string username) - { - List roleList = new List(); - - try - { - string sql = "SELECT r.name FROM my_aspnet_roles r "; - if (username != null) - sql += "JOIN my_aspnet_usersinroles uir ON uir.roleId=r.id AND uir.userId=" + - GetUserId(connection, username); - sql += " WHERE r.applicationId=@appId"; - MySqlCommand cmd = new MySqlCommand(sql, connection); - cmd.Parameters.AddWithValue("@appId", app.FetchId(connection)); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - while (reader.Read()) - roleList.Add(reader.GetString(0)); - } - return (string[])roleList.ToArray(); - } - catch (Exception ex) - { - if (WriteExceptionsToEventLog) - WriteToEventLog(ex, "GetRolesByUserName"); - throw; - } - } - - private int GetUserId(MySqlConnection connection, string username) - { - MySqlCommand cmd = new MySqlCommand( - "SELECT id FROM my_aspnet_users WHERE name=@name AND applicationId=@appId", - connection); - cmd.Parameters.AddWithValue("@name", username); - cmd.Parameters.AddWithValue("@appId", app.FetchId(connection)); - object id = cmd.ExecuteScalar(); - return Convert.ToInt32(id); - } - - private int GetRoleId(MySqlConnection connection, string rolename) - { - MySqlCommand cmd = new MySqlCommand( - "SELECT id FROM my_aspnet_roles WHERE name=@name AND applicationId=@appId", - connection); - cmd.Parameters.AddWithValue("@name", rolename); - cmd.Parameters.AddWithValue("@appId", app.FetchId(connection)); - return (int)cmd.ExecuteScalar(); - } - - private void WriteToEventLog(Exception e, string action) - { - using (EventLog log = new EventLog()) - { - log.Source = eventSource; - log.Log = eventLog; - string message = exceptionMessage + Environment.NewLine + Environment.NewLine; - message += "Action: " + action + Environment.NewLine + Environment.NewLine; - message += "Exception: " + e; - log.WriteEntry(message); - } - } - - #endregion - - } -} \ No newline at end of file +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +// This code was contributed by Sean Wright (srwright@alcor.concordia.ca) on 2007-01-12 +// The copyright was assigned and transferred under the terms of +// the MySQL Contributor License Agreement (CLA) + +using MySql.Data.MySqlClient; +using MySql.Web.Common; +using MySql.Web.General; +using System; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Configuration.Provider; +using System.Diagnostics; +using System.Web.Hosting; +using System.Web.Security; + +namespace MySql.Web.Security +{ + /// + /// Manages storage of role membership information for an ASP.NET application in a MySQL database. + /// + public sealed class MySQLRoleProvider : RoleProvider + { + private string eventSource = "MySQLRoleProvider"; + private string eventLog = "Application"; + private string exceptionMessage = "An exception occurred. Please check the Event Log."; + private string connectionString; + private bool pWriteExceptionsToEventLog = false; + private Application app; + + /// + /// Initializes the provider. + /// + /// The friendly name of the provider. + /// A collection of the name/value pairs representing the provider-specific attributes specified in the configuration for this provider. + /// The name of the provider is null. + /// The name of the provider has a length of zero. + /// An attempt is made to call on a provider after the provider has already been initialized. + public override void Initialize(string name, NameValueCollection config) + { + if (config == null) + { + throw new ArgumentNullException("config"); + } + if (name == null || name.Length == 0) + { + name = "MySQLRoleProvider"; + } + if (string.IsNullOrEmpty(config["description"])) + { + config.Remove("description"); + config.Add("description", "MySQL Role provider"); + } + base.Initialize(name, config); + + string applicationName = HostingEnvironment.ApplicationVirtualPath; + if (!String.IsNullOrEmpty(config["applicationName"])) + applicationName = config["applicationName"]; + + if (!(config["writeExceptionsToEventLog"] == null)) + { + if (config["writeExceptionsToEventLog"].ToUpper() == "TRUE") + { + pWriteExceptionsToEventLog = true; + } + } + + connectionString = ConfigUtility.GetConnectionString(config); + if (String.IsNullOrEmpty(connectionString)) return; + + // make sure our schema is up to date + SchemaManager.CheckSchema(connectionString, config); + + app = new Application(applicationName, Description); + } + + #region Properties + + /// + /// Gets or sets the name of the application to store and retrieve role information for. + /// + /// The name of the application to store and retrieve role information for. + /// + /// + /// roleManager defaultProvider = "MySqlProvider" + /// enabled="true"> + /// providers> + /// add + /// name = "MySqlProvider" + /// type="MySql.Web.Security.MySQLRoleProvider" + /// connectionStringName="LocalMySqlServices" + /// writeExceptionsToEventLog="false" + /// applicationName="MyApplication" /> + /// /providers> + /// roleManager> + /// + /// + public override string ApplicationName + { + get { return app.Name; } + set { app.Name = value; } + } + + /// + /// Gets or sets a value indicating whether exceptions should be written to the event log. + /// + /// + /// true if exceptions should be written to the event log; otherwise, false. + /// + /// + /// + /// roleManager defaultProvider = "MySqlProvider" + /// enabled="true"> + /// providers> + /// add + /// name = "MySqlProvider" + /// type="MySql.Web.Security.MySQLRoleProvider" + /// connectionStringName="LocalMySqlServices" + /// writeExceptionsToEventLog="false" + /// applicationName="MyApplication" /> + /// /providers> + /// roleManager> + /// + /// + public bool WriteExceptionsToEventLog + { + get { return pWriteExceptionsToEventLog; } + set { pWriteExceptionsToEventLog = value; } + } + + #endregion + + #region Public Methods + + /// + /// Adds the users to the specified roles. + /// + /// The user names. + /// The role names. + public override void AddUsersToRoles(string[] usernames, string[] rolenames) + { + if (rolenames == null || rolenames.Length == 0) return; + if (usernames == null || usernames.Length == 0) return; + + foreach (string rolename in rolenames) + { + if (String.IsNullOrEmpty(rolename)) + throw new ArgumentException(Properties.Resources.IllegalRoleName, "rolenames"); + if (!RoleExists(rolename)) + throw new ProviderException(Properties.Resources.RoleNameNotFound); + } + + foreach (string username in usernames) + { + if (String.IsNullOrEmpty(username)) + throw new ArgumentException(Properties.Resources.IllegalUserName, "usernames"); + if (username.IndexOf(',') != -1) + throw new ArgumentException(Properties.Resources.InvalidCharactersInUserName); + + foreach (string rolename in rolenames) + { + if (IsUserInRole(username, rolename)) + throw new ProviderException(Properties.Resources.UserIsAlreadyInRole); + } + } + + using (MySqlConnection connection = new MySqlConnection(connectionString)) + { + MySqlTransaction txn = null; + try + { + connection.Open(); + txn = connection.BeginTransaction(); + MySqlCommand cmd = new MySqlCommand( + "INSERT INTO my_aspnet_usersinroles VALUES(@userId, @roleId)", connection); + cmd.Parameters.Add("@userId", MySqlDbType.Int32); + cmd.Parameters.Add("@roleId", MySqlDbType.Int32); + foreach (string username in usernames) + { + // either create a new user or fetch the existing user id + long userId = SchemaManager.CreateOrFetchUserId(connection, + username, app.FetchId(connection), true); + foreach (string rolename in rolenames) + { + int roleId = GetRoleId(connection, rolename); + cmd.Parameters[0].Value = userId; + cmd.Parameters[1].Value = roleId; + cmd.ExecuteNonQuery(); + } + } + txn.Commit(); + } + catch (Exception ex) + { + if (txn != null) + txn.Rollback(); + if (WriteExceptionsToEventLog) + WriteToEventLog(ex, "AddUsersToRoles"); + throw; + } + } + } + + /// + /// Creates the specified role. + /// + /// The role name. + public override void CreateRole(string rolename) + { + if (rolename.IndexOf(',') != -1) + throw new ArgumentException(Properties.Resources.InvalidCharactersInUserName); + if (RoleExists(rolename)) + throw new ProviderException(Properties.Resources.RoleNameAlreadyExists); + + using (MySqlConnection connection = new MySqlConnection(connectionString)) + { + try + { + connection.Open(); + + MySqlCommand cmd = new MySqlCommand( + @"INSERT INTO my_aspnet_roles Values(NULL, @appId, @name)", connection); + cmd.Parameters.AddWithValue("@appId", app.EnsureId(connection)); + cmd.Parameters.AddWithValue("@name", rolename); + cmd.ExecuteNonQuery(); + } + catch (MySqlException e) + { + if (WriteExceptionsToEventLog) + WriteToEventLog(e, "CreateRole"); + throw; + } + } + } + + /// + /// Deletes the specified role. + /// + /// The role name. + /// If set to true a will be raised if + /// there are users with the specified role. + /// true if the role was successfully deleted; otherwise, false. + /// The specified role doesn't exist or + /// is set to true and there are users with the specified role. + public override bool DeleteRole(string rolename, bool throwOnPopulatedRole) + { + using (MySqlConnection connection = new MySqlConnection(connectionString)) + { + MySqlTransaction txn = null; + try + { + if (!(RoleExists(rolename))) + throw new ProviderException(Properties.Resources.RoleNameNotFound); + if (throwOnPopulatedRole && GetUsersInRole(rolename).Length > 0) + throw new ProviderException(Properties.Resources.CannotDeleteAPopulatedRole); + + connection.Open(); + txn = connection.BeginTransaction(); + + // first delete all the user/role mappings with that roleid + MySqlCommand cmd = new MySqlCommand( + @"DELETE uir FROM my_aspnet_usersinroles uir JOIN + my_aspnet_roles r ON uir.roleId=r.id + WHERE r.name LIKE @rolename AND r.applicationId=@appId", connection); + cmd.Parameters.AddWithValue("@rolename", rolename); + cmd.Parameters.AddWithValue("@appId", app.FetchId(connection)); + cmd.ExecuteNonQuery(); + + // now delete the role itself + cmd.CommandText = @"DELETE FROM my_aspnet_roles WHERE name=@rolename + AND applicationId=@appId"; + cmd.ExecuteNonQuery(); + txn.Commit(); + } + catch (Exception ex) + { + if (txn != null) + txn.Rollback(); + if (WriteExceptionsToEventLog) + WriteToEventLog(ex, "DeleteRole"); + throw; + } + } + return true; + } + + /// + /// Gets a list of all the roles for the configured applicationName. + /// + /// + /// A string array containing the names of all the roles stored in the data source for the configured applicationName. + /// + public override string[] GetAllRoles() + { + using (MySqlConnection connection = new MySqlConnection(connectionString)) + { + connection.Open(); + return GetRolesByUserName(connection, null); + } + } + + /// + /// Gets a list of the roles that a specified user is in for the configured applicationName. + /// + /// The user to return a list of roles for. + /// + /// A string array containing the names of all the roles that the specified user is in for the configured applicationName. + /// + public override string[] GetRolesForUser(string username) + { + using (MySqlConnection connection = new MySqlConnection(connectionString)) + { + connection.Open(); + return GetRolesByUserName(connection, username); + } + } + + /// + /// Gets the users with the specified role. + /// + /// The role name. + /// A string array containing the names of all the users + /// who are members of the specified role. + public override string[] GetUsersInRole(string rolename) + { + List users = new List(); + + try + { + using (MySqlConnection connection = new MySqlConnection(connectionString)) + { + connection.Open(); + int roleId = GetRoleId(connection, rolename); + + string sql = @"SELECT u.name FROM my_aspnet_users u JOIN + my_aspnet_usersinroles uir ON uir.userId=u.id AND uir.roleId=@roleId + WHERE u.applicationId=@appId"; + MySqlCommand cmd = new MySqlCommand(sql, connection); + cmd.Parameters.AddWithValue("@roleId", roleId); + cmd.Parameters.AddWithValue("@appId", app.FetchId(connection)); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + while (reader.Read()) + users.Add(reader.GetString(0)); + } + } + return users.ToArray(); + } + catch (Exception ex) + { + if (WriteExceptionsToEventLog) + WriteToEventLog(ex, "GetUsersInRole"); + throw; + } + } + + /// + /// Determines whether [is user in role] [the specified username]. + /// + /// The username. + /// The rolename. + /// + /// true if [is user in role] [the specified username]; otherwise, false. + /// + public override bool IsUserInRole(string username, string rolename) + { + try + { + // this will refresh the app id if necessary + if (!RoleExists(rolename)) return false; + + using (MySqlConnection connection = new MySqlConnection(connectionString)) + { + connection.Open(); + + string sql = @"SELECT COUNT(*) FROM my_aspnet_usersinroles uir + JOIN my_aspnet_users u ON uir.userId=u.id + JOIN my_aspnet_roles r ON uir.roleId=r.id + WHERE u.applicationId=@appId AND + u.name = @userName AND r.name = @roleName"; + MySqlCommand cmd = new MySqlCommand(sql, connection); + cmd.Parameters.AddWithValue("@appId", app.FetchId(connection)); + cmd.Parameters.AddWithValue("@userName", username); + cmd.Parameters.AddWithValue("@roleName", rolename); + int count = Convert.ToInt32(cmd.ExecuteScalar()); + return count > 0; + } + } + catch (Exception ex) + { + if (WriteExceptionsToEventLog) + WriteToEventLog(ex, "IsUserInRole"); + throw; + } + } + + /// + /// Removes the users from the specified roles. + /// + /// The user names. + /// The role names. + public override void RemoveUsersFromRoles(string[] usernames, string[] rolenames) + { + if (rolenames == null || rolenames.Length == 0) return; + if (usernames == null || usernames.Length == 0) return; + + foreach (string rolename in rolenames) + { + if (!(RoleExists(rolename))) + throw new ProviderException(Properties.Resources.RoleNameNotFound); + } + + foreach (string username in usernames) + { + foreach (string rolename in rolenames) + { + if (!(IsUserInRole(username, rolename))) + throw new ProviderException(Properties.Resources.UserNotInRole); + } + } + + using (MySqlConnection connection = new MySqlConnection(connectionString)) + { + MySqlTransaction txn = null; + try + { + connection.Open(); + txn = connection.BeginTransaction(); + + string sql = @"DELETE uir FROM my_aspnet_usersinroles uir + JOIN my_aspnet_users u ON uir.userId=u.id + JOIN my_aspnet_roles r ON uir.roleId=r.id + WHERE u.name LIKE @username AND r.name LIKE @rolename + AND u.applicationId=@appId AND r.applicationId=@appId"; + + MySqlCommand cmd = new MySqlCommand(sql, connection); + cmd.Parameters.Add("@username", MySqlDbType.VarChar, 255); + cmd.Parameters.Add("@rolename", MySqlDbType.VarChar, 255); + cmd.Parameters.AddWithValue("@appId", app.FetchId(connection)); + + foreach (string username in usernames) + { + foreach (string rolename in rolenames) + { + cmd.Parameters[0].Value = username; + cmd.Parameters[1].Value = rolename; + cmd.ExecuteNonQuery(); + } + } + txn.Commit(); + } + catch (MySqlException e) + { + if (txn != null) + txn.Rollback(); + if (WriteExceptionsToEventLog) + WriteToEventLog(e, "RemoveUsersFromRoles"); + throw; + } + } + } + + /// + /// Determines whether the role exists. + /// + /// The rolename. + /// true if the role name already exists in the database; otherwise, false. + public override bool RoleExists(string rolename) + { + try + { + using (MySqlConnection connection = new MySqlConnection(connectionString)) + { + connection.Open(); + MySqlCommand cmd = new MySqlCommand( + @"SELECT COUNT(*) FROM my_aspnet_roles WHERE applicationId=@appId + AND name LIKE @name", connection); + cmd.Parameters.AddWithValue("@appId", app.FetchId(connection)); + cmd.Parameters.AddWithValue("@name", rolename); + int count = Convert.ToInt32(cmd.ExecuteScalar()); + return count != 0; + } + } + catch (Exception ex) + { + if (WriteExceptionsToEventLog) + WriteToEventLog(ex, "RoleExists"); + throw; + } + } + + /// + /// Finds the users with the specified role. + /// + /// The role name. + /// The user name to match. + /// A string array containing the names of all the users where the + /// user name matches usernameToMatch and the user is a member of the specified role. + public override string[] FindUsersInRole(string rolename, string usernameToMatch) + { + if (!RoleExists(rolename)) + throw new ProviderException(Properties.Resources.RoleNameNotFound); + + List users = new List(); + + try + { + using (MySqlConnection connection = new MySqlConnection(connectionString)) + { + connection.Open(); + + string sql = @"SELECT u.name FROM my_aspnet_usersinroles uir + JOIN my_aspnet_users u ON uir.userId=u.id + JOIN my_aspnet_roles r ON uir.roleId=r.id + WHERE r.name LIKE @rolename AND + u.name LIKE @username AND + u.applicationId=@appId"; + + MySqlCommand cmd = new MySqlCommand(sql, connection); + cmd.Parameters.AddWithValue("@username", usernameToMatch); + cmd.Parameters.AddWithValue("@rolename", rolename); + cmd.Parameters.AddWithValue("@appId", app.FetchId(connection)); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + while (reader.Read()) + users.Add(reader.GetString(0)); + } + } + return users.ToArray(); + } + catch (MySqlException e) + { + if (WriteExceptionsToEventLog) + WriteToEventLog(e, "FindUsersInRole"); + throw; + } + } + + #endregion + + internal static void DeleteUserData(MySqlConnection connection, int userId) + { + MySqlCommand cmd = new MySqlCommand( + "DELETE FROM my_aspnet_usersinroles WHERE userId=@userId", connection); + cmd.Parameters.AddWithValue("@userId", userId); + cmd.ExecuteNonQuery(); + } + + #region Private Methods + + private string[] GetRolesByUserName(MySqlConnection connection, string username) + { + List roleList = new List(); + + try + { + string sql = "SELECT r.name FROM my_aspnet_roles r "; + if (username != null) + sql += "JOIN my_aspnet_usersinroles uir ON uir.roleId=r.id AND uir.userId=" + + GetUserId(connection, username); + sql += " WHERE r.applicationId=@appId"; + MySqlCommand cmd = new MySqlCommand(sql, connection); + cmd.Parameters.AddWithValue("@appId", app.FetchId(connection)); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + while (reader.Read()) + roleList.Add(reader.GetString(0)); + } + return (string[])roleList.ToArray(); + } + catch (Exception ex) + { + if (WriteExceptionsToEventLog) + WriteToEventLog(ex, "GetRolesByUserName"); + throw; + } + } + + private int GetUserId(MySqlConnection connection, string username) + { + MySqlCommand cmd = new MySqlCommand( + "SELECT id FROM my_aspnet_users WHERE name=@name AND applicationId=@appId", + connection); + cmd.Parameters.AddWithValue("@name", username); + cmd.Parameters.AddWithValue("@appId", app.FetchId(connection)); + object id = cmd.ExecuteScalar(); + return Convert.ToInt32(id); + } + + private int GetRoleId(MySqlConnection connection, string rolename) + { + MySqlCommand cmd = new MySqlCommand( + "SELECT id FROM my_aspnet_roles WHERE name=@name AND applicationId=@appId", + connection); + cmd.Parameters.AddWithValue("@name", rolename); + cmd.Parameters.AddWithValue("@appId", app.FetchId(connection)); + return (int)cmd.ExecuteScalar(); + } + + private void WriteToEventLog(Exception e, string action) + { + using (EventLog log = new EventLog()) + { + log.Source = eventSource; + log.Log = eventLog; + string message = exceptionMessage + Environment.NewLine + Environment.NewLine; + message += "Action: " + action + Environment.NewLine + Environment.NewLine; + message += "Exception: " + e; + log.WriteEntry(message); + } + } + + #endregion + + } +} diff --git a/MySql.Web/src/Runtime.cs b/MySql.Web/src/Runtime.cs new file mode 100644 index 000000000..78214fe94 --- /dev/null +++ b/MySql.Web/src/Runtime.cs @@ -0,0 +1,59 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +// This code was contributed by Sean Wright (srwright@alcor.concordia.ca) on 2007-01-12 +// The copyright was assigned and transferred under the terms of +// the MySQL Contributor License Agreement (CLA) + +using System; + +namespace MySql.Web.Security +{ + internal static class Runtime + { + private static bool inited; + private static bool isMono; + + public static bool IsMono + { + get + { + if (!inited) + Init(); + return isMono; + } + } + + private static void Init() + { + inited = true; + Type t = Type.GetType("Mono.Runtime"); + isMono = t != null; + } + } +} diff --git a/MySql.Web/src/SchemaManager.cs b/MySql.Web/src/SchemaManager.cs new file mode 100644 index 000000000..ed0632e3c --- /dev/null +++ b/MySql.Web/src/SchemaManager.cs @@ -0,0 +1,191 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +// This code was contributed by Sean Wright (srwright@alcor.concordia.ca) on 2007-01-12 +// The copyright was assigned and transferred under the terms of +// the MySQL Contributor License Agreement (CLA) + +using MySql.Data.MySqlClient; +using System; +using System.Collections.Specialized; +using System.Configuration.Provider; +using System.Data; +using System.Diagnostics; +using System.IO; +using System.Reflection; +using System.Text; + +namespace MySql.Web.Common +{ + /// + /// Provided methods that allow managing a database. + /// + public static class SchemaManager + { + private const int schemaVersion = 10; + + /// + /// Gets the most recent version of the schema. + /// + /// The most recent version number of the schema. + public static int Version + { + get { return schemaVersion; } + } + + internal static void CheckSchema(string connectionString, NameValueCollection config) + { + int ver = GetSchemaVersion(connectionString); + if (ver == Version) return; + + try + { + if (String.Compare(config["autogenerateschema"], "true", true) == 0) + UpgradeToCurrent(connectionString, ver); + else + throw new ProviderException(Properties.Resources.MissingOrWrongSchema); + + } + catch (Exception ex) + { + throw new ProviderException(Properties.Resources.MissingOrWrongSchema, ex); + } + } + + internal static string GetSchema(int version) + { + var assembly = Assembly.GetExecutingAssembly(); + using (Stream stream = assembly.GetManifestResourceStream($"MySql.Web.Properties.schema{version}.sql")) + using (StreamReader reader = new StreamReader(stream)) + return reader.ReadToEnd(); + } + + private static void UpgradeToCurrent(string connectionString, int version) + { + if (version == Version) return; + + using (MySqlConnection connection = new MySqlConnection(connectionString)) + { + connection.Open(); + + for (int ver = version + 1; ver <= Version; ver++) + { + string schema = GetSchema(ver); + MySqlScript script = new MySqlScript(connection); + script.Query = schema; + + try + { + script.Execute(); + } + catch (MySqlException ex) + { + if (ex.Number == 1050 && ver == 7) + { + // Schema7 performs several renames of tables to their lowercase representation. + // If the current server OS does not support renaming to lowercase, then let's just continue. + script.Query = "UPDATE my_aspnet_schemaversion SET version=7"; + script.Execute(); + continue; + } + throw ex; + } + } + } + } + + private static int GetSchemaVersion(string connectionString) + { + // retrieve the current schema version + using (MySqlConnection conn = new MySqlConnection(connectionString)) + { + conn.Open(); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM my_aspnet_schemaversion", conn); + try + { + object ver = cmd.ExecuteScalar(); + if (ver != null) + return (int)ver; + } + catch (MySqlException ex) + { + if (ex.Number != (int)MySqlErrorCode.NoSuchTable) + throw; + string[] restrictions = new string[4]; + restrictions[2] = "mysql_membership"; + DataTable dt = conn.GetSchema("Tables", restrictions); + if (dt.Rows.Count == 1) + { + var value = dt.Rows[0]["TABLE_COMMENT"]; + if (value is Byte[]) + { + Byte[] byteArray = value as Byte[]; + return Convert.ToInt32(Encoding.UTF8.GetString(byteArray, 0, byteArray.Length)); + } + else + return Convert.ToInt32(value); + } + } + return 0; + } + } + + /// + /// Creates the or fetch user id. + /// + /// The connection. + /// The username. + /// The application id. + /// if set to true [authenticated]. + /// + internal static long CreateOrFetchUserId(MySqlConnection connection, string username, + long applicationId, bool authenticated) + { + Debug.Assert(applicationId > 0); + + // first attempt to fetch an existing user id + MySqlCommand cmd = new MySqlCommand(@"SELECT id FROM my_aspnet_users + WHERE applicationId = @appId AND name = @name", connection); + cmd.Parameters.AddWithValue("@appId", applicationId); + cmd.Parameters.AddWithValue("@name", username); + object userId = cmd.ExecuteScalar(); + if (userId != null) return (int)userId; + + cmd.CommandText = @"INSERT INTO my_aspnet_users VALUES + (NULL, @appId, @name, @isAnon, Now())"; + cmd.Parameters.AddWithValue("@isAnon", !authenticated); + int recordsAffected = cmd.ExecuteNonQuery(); + if (recordsAffected != 1) + throw new ProviderException(Properties.Resources.UnableToCreateUser); + + cmd.CommandText = "SELECT LAST_INSERT_ID()"; + return Convert.ToInt64(cmd.ExecuteScalar()); + } + } +} diff --git a/Source/MySql.Web/SessionProvider.cs b/MySql.Web/src/SessionProvider.cs similarity index 78% rename from Source/MySql.Web/SessionProvider.cs rename to MySql.Web/src/SessionProvider.cs index 428c94cbc..c24f741f1 100644 --- a/Source/MySql.Web/SessionProvider.cs +++ b/MySql.Web/src/SessionProvider.cs @@ -1,904 +1,909 @@ -// Copyright � 2004, 2014, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System; -using System.Configuration; -using System.Collections.Specialized; -using System.Web.Hosting; -using MySql.Data.MySqlClient; -using System.Configuration.Provider; -using System.IO; -using MySql.Web.Common; -using MySql.Web.General; -using System.Web.SessionState; -using System.Web.Configuration; -using System.Web; -using System.Diagnostics; -using System.Threading; -using System.Security; - - -namespace MySql.Web.SessionState -{ - /// - /// This class allows ASP.NET applications to store and manage session state information in a - /// MySQL database. - /// Expired session data is periodically deleted from the database. - /// - public class MySqlSessionStateStore : SessionStateStoreProviderBase - { - string connectionString; - ConnectionStringSettings connectionStringSettings; - string eventSource = "MySQLSessionStateStore"; - string eventLog = "Application"; - string exceptionMessage = "An exception occurred. Please check the event log."; - Application app; - - SessionStateSection sessionStateConfig; - - // cleanup old session - Timer cleanupTimer; - int cleanupInterval; - bool cleanupRunning; - - - bool writeExceptionsToEventLog = false; - - SessionStateItemExpireCallback expireCallback = null; - bool enableExpireCallback = false; - - - /// - /// Indicates whether if expire callback is on or off - /// - public bool EnableExpireCallback - { - get { return enableExpireCallback; } - set { enableExpireCallback = value; } - } - - /// - /// Indicates whether to write exceptions to event log - /// - public bool WriteExceptionsToEventLog - { - get { return writeExceptionsToEventLog; } - set { writeExceptionsToEventLog = value; } - } - - public string ApplicationName - { - get { return app.Name; } - set { app.Name = value; } - } - - private long ApplicationId - { - get { return app.Id; } - } - - - /// - /// Handles MySql exception. - /// If WriteExceptionsToEventLog is set, will write exception info - /// to event log. - /// It throws provider exception (original exception is stored as inner exception) - /// - /// exception - /// name of the function that throwed the exception - private void HandleMySqlException(MySqlException e, string action) - { - if (WriteExceptionsToEventLog) - { - using (EventLog log = new EventLog()) - { - log.Source = eventSource; - log.Log = eventLog; - - string message = "An exception occurred communicating with the data source.\n\n"; - message += "Action: " + action; - message += "Exception: " + e.ToString(); - log.WriteEntry(message); - } - } - throw new ProviderException(exceptionMessage, e); - } - - - - /// - /// Initializes the provider with the property values specified in the ASP.NET application configuration file - /// - /// The name of the provider instance to initialize. - /// Object that contains the names and values of configuration options for the provider. - /// - public override void Initialize(string name, NameValueCollection config) - { - //Initialize values from web.config. - if (config == null) - throw new ArgumentException("config"); - if (name == null || name.Length == 0) - throw new ArgumentException("name"); - if (String.IsNullOrEmpty(config["description"])) - { - config.Remove("description"); - config["description"] = "MySQL Session State Store Provider"; - } - base.Initialize(name, config); - string applicationName = HostingEnvironment.ApplicationVirtualPath; - if (!String.IsNullOrEmpty(config["applicationName"])) - applicationName = config["applicationName"]; - - // Get configuration element. - Configuration webConfig = WebConfigurationManager.OpenWebConfiguration(HostingEnvironment.ApplicationVirtualPath); - sessionStateConfig = (SessionStateSection)webConfig.SectionGroups["system.web"].Sections["sessionState"]; - - // Initialize connection. - connectionStringSettings = ConfigurationManager.ConnectionStrings[config["connectionStringName"]]; - if (connectionStringSettings == null || connectionStringSettings.ConnectionString.Trim() == "") - throw new HttpException("Connection string can not be blank"); - connectionString = connectionStringSettings.ConnectionString; - - writeExceptionsToEventLog = false; - if (config["writeExceptionsToEventLog"] != null) - { - writeExceptionsToEventLog = (config["writeExceptionsToEventLog"].ToUpper() == "TRUE"); - } - - enableExpireCallback = false; - - if (config["enableExpireCallback"] != null) - { - enableExpireCallback = (config["enableExpireCallback"].ToUpper() == "TRUE"); - } - - // Make sure we have the correct schema. - SchemaManager.CheckSchema(connectionString, config); - app = new Application(applicationName, base.Description); - - // Get the application id. - try - { - using (MySqlConnection conn = new MySqlConnection(connectionString)) - { - conn.Open(); - app.EnsureId(conn); - CheckStorageEngine(conn); - } - } - catch (MySqlException e) - { - HandleMySqlException(e, "Initialize"); - } - - try - { - using (MySqlConnection conn = new MySqlConnection(connectionString)) - { - MySqlCommand cmd = new MySqlCommand( - "INSERT IGNORE INTO my_aspnet_sessioncleanup SET" + - " ApplicationId = @ApplicationId, " + - " LastRun = NOW(), " + - " IntervalMinutes = 10", - conn); - cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); - conn.Open(); - cmd.ExecuteNonQuery(); - cleanupInterval = GetCleanupInterval(conn, ApplicationId); - } - } - catch (MySqlException e) - { - HandleMySqlException(e, "Initialize"); - } - - // Setup the cleanup timer - if (cleanupInterval <= 0) - cleanupInterval = 1; - cleanupTimer = new Timer(new TimerCallback(CleanupOldSessions), null, 0, - cleanupInterval * 1000 * 60); - } - - /// - /// This method creates a new SessionStateStoreData object for the current request. - /// - /// - /// The HttpContext object for the current request. - /// - /// - /// The timeout value (in minutes) for the SessionStateStoreData object that is created. - /// - public override SessionStateStoreData CreateNewStoreData(System.Web.HttpContext context, int timeout) - { - - return new SessionStateStoreData(new SessionStateItemCollection(), - SessionStateUtility.GetSessionStaticObjects(context), timeout); - } - - /// - /// This method adds a new session state item to the database. - /// - /// - /// The HttpContext object for the current request. - /// - /// - /// The session ID for the current request. - /// - /// - /// The timeout value for the current request. - /// - public override void CreateUninitializedItem(System.Web.HttpContext context, string id, int timeout) - { - try - { - using (MySqlConnection conn = new MySqlConnection(connectionString)) - { - MySqlCommand cmd = new MySqlCommand( - @"INSERT INTO my_aspnet_sessions - (SessionId, ApplicationId, Created, Expires, LockDate, - LockId, Timeout, Locked, SessionItems, Flags) - Values (@SessionId, @ApplicationId, NOW(), NOW() + INTERVAL @Timeout MINUTE, NOW(), - @LockId , @Timeout, @Locked, @SessionItems, @Flags) - on duplicate key update Created = values( Created ), Expires = values( Expires ), - LockDate = values( LockDate ), LockId = values( LockId ), Timeout = values( Timeout) , - Locked = values( Locked ), SessionItems = values( SessionItems ), Flags = values( Flags )", - conn); - - cmd.Parameters.AddWithValue("@SessionId", id); - cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); - cmd.Parameters.AddWithValue("@LockId", 0); - cmd.Parameters.AddWithValue("@Timeout", timeout); - cmd.Parameters.AddWithValue("@Locked", 0); - cmd.Parameters.AddWithValue("@SessionItems", null); - cmd.Parameters.AddWithValue("@Flags", 1); - conn.Open(); - cmd.ExecuteNonQuery(); - } - } - catch (MySqlException e) - { - HandleMySqlException(e, "CreateUninitializedItem"); - } - } - - - /// - /// This method releases all the resources for this instance. - /// - public override void Dispose() - { - if (cleanupTimer != null) - cleanupTimer.Dispose(); - } - - /// - /// This method allows the MySqlSessionStateStore object to perform any cleanup that may be - /// required for the current request. - /// - /// The HttpContext object for the current request - public override void EndRequest(System.Web.HttpContext context) - { - } - - /// - /// This method returns a read-only session item from the database. - /// - public override SessionStateStoreData GetItem(System.Web.HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) - { - return GetSessionStoreItem(false, context, id, out locked, out lockAge, out lockId, out actions); - } - - /// - /// This method locks a session item and returns it from the database - /// - /// The HttpContext object for the current request - /// The session ID for the current request - /// - /// true if the session item is locked in the database; otherwise, it is false. - /// - /// - /// TimeSpan object that indicates the amount of time the session item has been locked in the database. - /// - /// - /// A lock identifier object. - /// - /// - /// A SessionStateActions enumeration value that indicates whether or - /// not the session is uninitialized and cookieless. - /// - /// - public override SessionStateStoreData GetItemExclusive(System.Web.HttpContext context, string id, - out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) - { - return GetSessionStoreItem(true, context, id, out locked, out lockAge, out lockId, out actions); - } - - /// - /// This method performs any per-request initializations that the MySqlSessionStateStore provider requires. - /// - public override void InitializeRequest(System.Web.HttpContext context) - { - } - - /// - /// This method forcibly releases the lock on a session item in the database, if multiple attempts to - /// retrieve the session item fail. - /// - /// The HttpContext object for the current request. - /// The session ID for the current request. - /// The lock identifier for the current request. - public override void ReleaseItemExclusive(System.Web.HttpContext context, string id, object lockId) - { - try - { - using (MySqlConnection conn = new MySqlConnection(connectionString)) - { - MySqlCommand cmd = new MySqlCommand( - "UPDATE my_aspnet_sessions SET Locked = 0, Expires = NOW() + INTERVAL @Timeout MINUTE " + - "WHERE SessionId = @SessionId AND ApplicationId = @ApplicationId AND LockId = @LockId", - conn); - - cmd.Parameters.AddWithValue("@Timeout", sessionStateConfig.Timeout.TotalMinutes); - cmd.Parameters.AddWithValue("@SessionId", id); - cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); - cmd.Parameters.AddWithValue("@LockId", lockId); - conn.Open(); - cmd.ExecuteNonQuery(); - } - } - catch(MySqlException e) - { - HandleMySqlException(e, "ReleaseItemExclusive"); - } - } - - /// - /// This method removes the specified session item from the database - /// - /// The HttpContext object for the current request - /// The session ID for the current request - /// The lock identifier for the current request. - /// The session item to remove from the database. - public override void RemoveItem(System.Web.HttpContext context, string id, object lockId, SessionStateStoreData item) - { - bool sessionDeleted; - - try - { - using (MySqlConnection conn = new MySqlConnection(connectionString)) - { - MySqlCommand cmd = new MySqlCommand("DELETE FROM my_aspnet_sessions " + - " WHERE SessionId = @SessionId AND ApplicationId = @ApplicationId AND LockId = @LockId", - conn); - - cmd.Parameters.AddWithValue("@SessionId", id); - cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); - cmd.Parameters.AddWithValue("@LockId", lockId); - conn.Open(); - sessionDeleted = cmd.ExecuteNonQuery() > 0; - } - if (sessionDeleted && this.enableExpireCallback) - { - this.expireCallback.Invoke(id, item); - } - } - catch (MySqlException ex) - { - HandleMySqlException(ex, "RemoveItem Error: " + ex.Message); - } - } - - - /// - /// This method resets the expiration date and timeout for a session item in the database. - /// - /// The HttpContext object for the current request - /// The session ID for the current request - public override void ResetItemTimeout(System.Web.HttpContext context, string id) - { - try - { - using (MySqlConnection conn = new MySqlConnection(connectionString)) - { - MySqlCommand cmd = new MySqlCommand( - "UPDATE my_aspnet_sessions SET Expires = NOW() + INTERVAL @Timeout MINUTE" + - " WHERE SessionId = @SessionId AND ApplicationId = @ApplicationId", conn); - - cmd.Parameters.AddWithValue("@Timeout", sessionStateConfig.Timeout.TotalMinutes); - cmd.Parameters.AddWithValue("@SessionId", id); - cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); - conn.Open(); - cmd.ExecuteNonQuery(); - } - } - catch (MySqlException e) - { - HandleMySqlException(e, "ResetItemTimeout"); - } - } - - /// - /// This method updates the session time information in the database with the specified session item, - /// and releases the lock. - /// - /// The HttpContext object for the current request - /// The session ID for the current request - /// The session item containing new values to update the session item in the database with. - /// - /// The lock identifier for the current request. - /// A Boolean value that indicates whether or not the session item is new in the database. - /// A false value indicates an existing item. - /// - public override void SetAndReleaseItemExclusive(System.Web.HttpContext context, string id, SessionStateStoreData item, object lockId, bool newItem) - { - try - { - using (MySqlConnection conn = new MySqlConnection(connectionString)) - { - // Serialize the SessionStateItemCollection as a byte array - byte[] sessItems = Serialize((SessionStateItemCollection)item.Items); - MySqlCommand cmd; - if (newItem) - { - //Insert the new session item . If there was expired session - //with the same SessionId and Application id, it will be removed - - cmd = new MySqlCommand( - @"INSERT INTO my_aspnet_sessions - (SessionId, ApplicationId, Created, Expires, LockDate, - LockId, Timeout, Locked, SessionItems, Flags) - Values (@SessionId, @ApplicationId, NOW(), NOW() + INTERVAL @Timeout MINUTE, NOW(), - @LockId , @Timeout, @Locked, @SessionItems, @Flags) - on duplicate key update Created = values( Created ), Expires = values( Expires ), - LockDate = values( LockDate ), LockId = values( LockId ), Timeout = values( Timeout) , - Locked = values( Locked ), SessionItems = values( SessionItems ), Flags = values( Flags )", conn); - cmd.Parameters.AddWithValue("@SessionId", id); - cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); - cmd.Parameters.AddWithValue("@Timeout", item.Timeout); - cmd.Parameters.AddWithValue("@LockId", 0); - cmd.Parameters.AddWithValue("@Locked", 0); - cmd.Parameters.AddWithValue("@SessionItems", sessItems); - cmd.Parameters.AddWithValue("@Flags", 0); - } - else - { - //Update the existing session item. - cmd = new MySqlCommand( - "UPDATE my_aspnet_sessions SET Expires = NOW() + INTERVAL @Timeout MINUTE," + - " SessionItems = @SessionItems, Locked = @Locked " + - " WHERE SessionId = @SessionId AND ApplicationId = @ApplicationId AND LockId = @LockId", - conn); - - cmd.Parameters.AddWithValue("@Timeout", item.Timeout); - cmd.Parameters.AddWithValue("@SessionItems", sessItems); - cmd.Parameters.AddWithValue("@Locked", 0); - cmd.Parameters.AddWithValue("@SessionId", id); - cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); - cmd.Parameters.AddWithValue("@LockId", lockId); - } - conn.Open(); - cmd.ExecuteNonQuery(); - } - } - catch (MySqlException e) - { - HandleMySqlException(e, "SetAndReleaseItemExclusive"); - } - } - - - /// - /// GetSessionStoreItem is called by both the GetItem and GetItemExclusive methods. GetSessionStoreItem - /// retrieves the session data from the data source. If the lockRecord parameter is true (in the case of - /// GetItemExclusive), then GetSessionStoreItem locks the record and sets a New LockId and LockDate. - /// - private SessionStateStoreData GetSessionStoreItem(bool lockRecord, - HttpContext context, - string id, - out bool locked, - out TimeSpan lockAge, - out object lockId, - out SessionStateActions actionFlags) - { - - // Initial values for return value and out parameters. - SessionStateStoreData item = null; - lockAge = TimeSpan.Zero; - lockId = null; - locked = false; - actionFlags = SessionStateActions.None; - - // MySqlCommand for database commands. - MySqlCommand cmd = null; - // serialized SessionStateItemCollection. - byte[] serializedItems = null; - // True if a record is found in the database. - bool foundRecord = false; - // True if the returned session item is expired and needs to be deleted. - bool deleteData = false; - // Timeout value from the data store. - int timeout = 0; - - try - { - using (MySqlConnection conn = new MySqlConnection(connectionString)) - { - conn.Open(); - // lockRecord is True when called from GetItemExclusive and - // False when called from GetItem. - // Obtain a lock if possible. Ignore the record if it is expired. - if (lockRecord) - { - cmd = new MySqlCommand( - "UPDATE my_aspnet_sessions SET " + - " Locked = 1, LockDate = NOW()" + - " WHERE SessionId = @SessionId AND ApplicationId = @ApplicationId AND" + - " Locked = 0 AND Expires > NOW()", conn); - - cmd.Parameters.AddWithValue("@SessionId", id); - cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); - - if (cmd.ExecuteNonQuery() == 0) - { - // No record was updated because the record was locked or not found. - locked = true; - } - else - { - // The record was updated. - locked = false; - } - } - - // Retrieve the current session item information. - cmd = new MySqlCommand( - "SELECT NOW(), Expires , SessionItems, LockId, Flags, Timeout, " + - " LockDate, Locked " + - " FROM my_aspnet_sessions" + - " WHERE SessionId = @SessionId AND ApplicationId = @ApplicationId", conn); - - cmd.Parameters.AddWithValue("@SessionId", id); - cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); - - // Retrieve session item data from the data source. - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - if (reader.Read()) - { - DateTime now = reader.GetDateTime(0); - DateTime expires = reader.GetDateTime(1); - if (now.CompareTo(expires) > 0) - { - //The record was expired. Mark it as not locked. - locked = false; - // The session was expired. Mark the data for deletion. - deleteData = true; - } - else - { - foundRecord = true; - } - - object items = reader.GetValue(2); - serializedItems = (items is DBNull) ? null : (byte[])items; - lockId = reader.GetValue(3); - if (lockId is DBNull) - lockId = (int)0; - - actionFlags = (SessionStateActions)(reader.GetInt32(4)); - timeout = reader.GetInt32(5); - DateTime lockDate = reader.GetDateTime(6); - lockAge = now.Subtract(lockDate); - // If it's a read-only session set locked to the current lock - // status (writable sessions have already done this) - if (!lockRecord) - locked = reader.GetBoolean(7); - } - } - - // The record was not found. Ensure that locked is false. - if (!foundRecord) - locked = false; - - // If the record was found and you obtained a lock, then set - // the lockId, clear the actionFlags, - // and create the SessionStateStoreItem to return. - if (foundRecord && !locked) - { - lockId = (int)(lockId) + 1; - - cmd = new MySqlCommand("UPDATE my_aspnet_sessions SET" + - " LockId = @LockId, Flags = 0 " + - " WHERE SessionId = @SessionId AND ApplicationId = @ApplicationId", conn); - - cmd.Parameters.AddWithValue("@LockId", lockId); - cmd.Parameters.AddWithValue("@SessionId", id); - cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); - cmd.ExecuteNonQuery(); - - - // If the actionFlags parameter is not InitializeItem, - // deserialize the stored SessionStateItemCollection. - if (actionFlags == SessionStateActions.InitializeItem) - { - item = CreateNewStoreData(context, (int)sessionStateConfig.Timeout.TotalMinutes); - } - else - { - item = Deserialize(context, serializedItems, timeout); - } - } - } - } - catch(MySqlException e) - { - HandleMySqlException(e, "GetSessionStoreItem"); - } - return item; - } - - /// - /// This method sets the reference for the ExpireCallback delegate if setting is enabled. - /// - /// - /// false - public override bool SetItemExpireCallback(SessionStateItemExpireCallback expireCallback) - { - if (this.enableExpireCallback) - { - this.expireCallback = expireCallback; - return true; - } - return false; - } - - /// - /// Serialize is called by the SetAndReleaseItemExclusive method to - /// convert the SessionStateItemCollection into a byte array to - /// be stored in the blob field. - /// - private byte[] Serialize(SessionStateItemCollection items) - { - MemoryStream ms = new MemoryStream(); - BinaryWriter writer = new BinaryWriter(ms); - if (items != null) - { - items.Serialize(writer); - } - writer.Close(); - return ms.ToArray(); - } - - /// - /// Deserialize is called by the GetSessionStoreItem method to - /// convert the byte array stored in the blob field to a - /// SessionStateItemCollection. - /// - private SessionStateStoreData Deserialize(HttpContext context, - byte[] serializedItems, int timeout) - { - - SessionStateItemCollection sessionItems = new SessionStateItemCollection(); - - if (serializedItems != null) - { - MemoryStream ms = new MemoryStream(serializedItems); - if (ms.Length > 0) - { - BinaryReader reader = new BinaryReader(ms); - sessionItems = SessionStateItemCollection.Deserialize(reader); - } - } - - return new SessionStateStoreData(sessionItems, SessionStateUtility.GetSessionStaticObjects(context), - timeout); - } - - - private SessionStateItemCollection DeserializeSessionItems(byte[] serializedItems) - { - SessionStateItemCollection sessionItems = new SessionStateItemCollection(); - if (serializedItems != null) - { - MemoryStream ms = new MemoryStream(serializedItems); - if (ms.Length > 0) - { - BinaryReader reader = new BinaryReader(ms); - sessionItems = SessionStateItemCollection.Deserialize(reader); - } - } - return sessionItems; - } - - - private void CleanupOldSessions(object o) - { - - lock(this) - { - if (cleanupRunning) - return; - - cleanupRunning = true; - } - try - { - using (MySqlConnection con = new MySqlConnection(connectionString)) - { - con.Open(); - MySqlCommand cmd = new MySqlCommand( - "UPDATE my_aspnet_sessioncleanup SET LastRun=NOW() WHERE" + - " LastRun + INTERVAL IntervalMinutes MINUTE < NOW() AND ApplicationId = @ApplicationId", con); - cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); - int updatedSessions = cmd.ExecuteNonQuery(); - if (updatedSessions > 0) - DeleteTimedOutSessions(); - } - } - catch (MySqlException e) - { - HandleMySqlException(e, "CleanupOldSessions"); - } - finally - { - lock (this) - { - cleanupRunning = false; - } - } - } - - int GetCleanupInterval(MySqlConnection con, long ApplicationId) - { - MySqlCommand cmd = new MySqlCommand("SELECT IntervalMinutes from my_aspnet_sessioncleanup where ApplicationId = @ApplicationId", con); - cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); - return (int)cmd.ExecuteScalar(); - } - - /// - /// Check storage engine used by my_aspnet_sessions. - /// Warn if MyISAM is used - it does not handle concurrent updates well - /// which is important for session provider, as each access to session - /// does an update to "expires" field. - /// - /// - private void CheckStorageEngine(MySqlConnection con) - { - - try - { - MySqlCommand cmd = new MySqlCommand( - "SELECT ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='my_aspnet_sessions'", - con); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - if (reader.Read()) - { - string engine = reader.GetString(0); - if (engine == "MyISAM") - { - string message = - "Storage engine for table my_aspnet_sessions is MyISAM." + - "If possible, please change it to a transactional storage engine " + - "to improve performance,e.g with 'alter table my_aspnet_sessions engine innodb'\n"; - try - { - using (EventLog log = new EventLog()) - { - log.Source = eventSource; - log.Log = eventLog; - log.WriteEntry(message); - } - } - catch (SecurityException) - { - // Can't write to event log due to security restrictions - Trace.WriteLine(message); - } - } - } - } - } - catch (MySqlException e) - { - Trace.Write("got exception while checking for engine" + e); - } - } - - private void DeleteTimedOutSessions() - { - if (this.enableExpireCallback) - { - DeleteTimedOutSessionsWithCallback(); - } - else - { - DeleteTimedOutSessionsWithoutCallback(); - } - } - - private void DeleteTimedOutSessionsWithoutCallback() - { - try - { - using (MySqlConnection con = new MySqlConnection(connectionString)) - { - con.Open(); - MySqlCommand cmd = new MySqlCommand("DELETE FROM my_aspnet_sessions WHERE Expires < NOW() AND ApplicationId = @ApplicationId", con); - cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); - cmd.ExecuteNonQuery(); - } - } - catch (Exception e) - { - Trace.Write("Got exception in Delete Timed Out Sessions With Out Callback " + e); - throw; - } - } - - private void DeleteTimedOutSessionsWithCallback() - { - using (MySqlConnection con = new MySqlConnection(connectionString)) - { - con.Open(); - MySqlCommand cmd = new MySqlCommand("SELECT SessionID, SessionItems FROM my_aspnet_sessions WHERE Expires < NOW() AND ApplicationId = @ApplicationId", con); - cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); - - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - while (reader.Read()) - { - string sid = reader.GetString(0); - object items = reader.GetValue(1); - byte[] rawSessionItems = (items is DBNull) ? null : (byte[])items; - - SessionStateItemCollection sessionItems = this.DeserializeSessionItems(rawSessionItems); - SessionStateStoreData ssd = new SessionStateStoreData(sessionItems, new HttpStaticObjectsCollection(), 0); - - try - { - if (this.expireCallback != null) this.expireCallback.Invoke(sid, ssd); - - using (MySqlConnection con2 = new MySqlConnection(connectionString)) - { - MySqlCommand cmd2 = new MySqlCommand("DELETE FROM my_aspnet_sessions" + - " WHERE SessionId = @SessionId" + - " AND ApplicationId = @ApplicationId", con2); - cmd2.Parameters.AddWithValue("@SessionId", sid); - cmd2.Parameters.AddWithValue("@ApplicationId", ApplicationId); - con2.Open(); - cmd2.ExecuteNonQuery(); - } - - } - catch(Exception e) - { - Trace.Write("Got exception in Delete Timed Out Sessions With Callback " + e); - throw; - } - } - } - } - } - } -} \ No newline at end of file +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySql.Web.Common; +using MySql.Web.General; +using System; +using System.Collections.Specialized; +using System.Configuration; +using System.Configuration.Provider; +using System.Diagnostics; +using System.IO; +using System.Security; +using System.Threading; +using System.Web; +using System.Web.Configuration; +using System.Web.Hosting; +using System.Web.SessionState; + +namespace MySql.Web.SessionState +{ + /// + /// This class allows ASP.NET applications to store and manage session state information in a + /// MySQL database. + /// Expired session data is periodically deleted from the database. + /// + public class MySqlSessionStateStore : SessionStateStoreProviderBase + { + string connectionString; + // ConnectionStringSettings connectionStringSettings; + string eventSource = "MySQLSessionStateStore"; + string eventLog = "Application"; + string exceptionMessage = "An exception occurred. Please check the event log."; + Application app; + + SessionStateSection sessionStateConfig; + + // cleanup old session + Timer cleanupTimer; + int cleanupInterval; + bool cleanupRunning; + + + bool writeExceptionsToEventLog = false; + + SessionStateItemExpireCallback expireCallback = null; + bool enableExpireCallback = false; + + + /// + /// Indicates whether if expire callback is on or off. + /// + public bool EnableExpireCallback + { + get { return enableExpireCallback; } + set { enableExpireCallback = value; } + } + + /// + /// Indicates whether to write exceptions to event log. + /// + public bool WriteExceptionsToEventLog + { + get { return writeExceptionsToEventLog; } + set { writeExceptionsToEventLog = value; } + } + + /// + /// The name of the ASP .NET application. + /// + public string ApplicationName + { + get { return app.Name; } + set { app.Name = value; } + } + + private long ApplicationId + { + get { return app.Id; } + } + + + /// + /// Handles a MySql type exception. + /// + /// exception + /// name of the function that throwed the exception + /// If is set it will write exception info to event log. + /// + /// is false. + private void HandleMySqlException(MySqlException e, string action) + { + if (WriteExceptionsToEventLog) + { + using (EventLog log = new EventLog()) + { + log.Source = eventSource; + log.Log = eventLog; + + string message = "An exception occurred communicating with the data source.\n\n"; + message += "Action: " + action; + message += "Exception: " + e.ToString(); + log.WriteEntry(message); + } + } + throw new ProviderException(exceptionMessage, e); + } + + + + /// + /// Initializes the provider with the property values specified in the ASP .NET application configuration file. + /// + /// The name of the provider instance to initialize. + /// Object that contains the names and values of configuration options for the provider. + /// + public override void Initialize(string name, NameValueCollection config) + { + //Initialize values from web.config. + if (config == null) + throw new ArgumentException("config"); + if (name == null || name.Length == 0) + throw new ArgumentException("name"); + if (String.IsNullOrEmpty(config["description"])) + { + config.Remove("description"); + config["description"] = "MySQL Session State Store Provider"; + } + base.Initialize(name, config); + string applicationName = HostingEnvironment.ApplicationVirtualPath; + if (!String.IsNullOrEmpty(config["applicationName"])) + applicationName = config["applicationName"]; + + // Get configuration element. + Configuration webConfig = WebConfigurationManager.OpenWebConfiguration(HostingEnvironment.ApplicationVirtualPath); + sessionStateConfig = (SessionStateSection)webConfig.SectionGroups["system.web"].Sections["sessionState"]; + + // Initialize connection. + connectionString = ConfigUtility.GetConnectionString(config); + if (string.IsNullOrEmpty(connectionString)) return; + + writeExceptionsToEventLog = false; + if (config["writeExceptionsToEventLog"] != null) + { + writeExceptionsToEventLog = (config["writeExceptionsToEventLog"].ToUpper() == "TRUE"); + } + + enableExpireCallback = false; + + if (config["enableExpireCallback"] != null) + { + enableExpireCallback = (config["enableExpireCallback"].ToUpper() == "TRUE"); + } + + // Make sure we have the correct schema. + SchemaManager.CheckSchema(connectionString, config); + app = new Application(applicationName, base.Description); + + // Get the application id. + try + { + using (MySqlConnection conn = new MySqlConnection(connectionString)) + { + conn.Open(); + app.EnsureId(conn); + CheckStorageEngine(conn); + } + } + catch (MySqlException e) + { + HandleMySqlException(e, "Initialize"); + } + + try + { + using (MySqlConnection conn = new MySqlConnection(connectionString)) + { + MySqlCommand cmd = new MySqlCommand( + "INSERT IGNORE INTO my_aspnet_sessioncleanup SET" + + " ApplicationId = @ApplicationId, " + + " LastRun = NOW(), " + + " IntervalMinutes = 10", + conn); + cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); + conn.Open(); + cmd.ExecuteNonQuery(); + cleanupInterval = GetCleanupInterval(conn, ApplicationId); + } + } + catch (MySqlException e) + { + HandleMySqlException(e, "Initialize"); + } + + // Setup the cleanup timer + if (cleanupInterval <= 0) + cleanupInterval = 1; + cleanupTimer = new Timer(new TimerCallback(CleanupOldSessions), null, 0, + cleanupInterval * 1000 * 60); + } + + /// + /// Creates a new object for the current request. + /// + /// + /// The HttpContext object for the current request. + /// + /// + /// The timeout value (in minutes) for the SessionStateStoreData object that is created. + /// + public override SessionStateStoreData CreateNewStoreData(System.Web.HttpContext context, int timeout) + { + + return new SessionStateStoreData(new SessionStateItemCollection(), + SessionStateUtility.GetSessionStaticObjects(context), timeout); + } + + /// + /// Adds a new session state item to the database. + /// + /// + /// The HttpContext object for the current request. + /// + /// + /// The session ID for the current request. + /// + /// + /// The timeout value for the current request. + /// + public override void CreateUninitializedItem(System.Web.HttpContext context, string id, int timeout) + { + try + { + using (MySqlConnection conn = new MySqlConnection(connectionString)) + { + MySqlCommand cmd = new MySqlCommand( + @"INSERT INTO my_aspnet_sessions + (SessionId, ApplicationId, Created, Expires, LockDate, + LockId, Timeout, Locked, SessionItems, Flags) + Values (@SessionId, @ApplicationId, NOW(), NOW() + INTERVAL @Timeout MINUTE, NOW(), + @LockId , @Timeout, @Locked, @SessionItems, @Flags) + on duplicate key update Created = values( Created ), Expires = values( Expires ), + LockDate = values( LockDate ), LockId = values( LockId ), Timeout = values( Timeout) , + Locked = values( Locked ), SessionItems = values( SessionItems ), Flags = values( Flags )", + conn); + + cmd.Parameters.AddWithValue("@SessionId", id); + cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); + cmd.Parameters.AddWithValue("@LockId", 0); + cmd.Parameters.AddWithValue("@Timeout", timeout); + cmd.Parameters.AddWithValue("@Locked", 0); + cmd.Parameters.AddWithValue("@SessionItems", null); + cmd.Parameters.AddWithValue("@Flags", 1); + conn.Open(); + cmd.ExecuteNonQuery(); + } + } + catch (MySqlException e) + { + HandleMySqlException(e, "CreateUninitializedItem"); + } + } + + + /// + /// Releases all the resources for this instance. + /// + public override void Dispose() + { + if (cleanupTimer != null) + cleanupTimer.Dispose(); + } + + /// + /// Allows the object to perform any cleanup that may be + /// required for the current request. + /// + /// The HttpContext object for the current request. + public override void EndRequest(System.Web.HttpContext context) + { + } + + /// + /// Returns a read-only session item from the database. + /// + public override SessionStateStoreData GetItem(System.Web.HttpContext context, string id, out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) + { + return GetSessionStoreItem(false, context, id, out locked, out lockAge, out lockId, out actions); + } + + /// + /// Locks a session item and returns it from the database. + /// + /// The HttpContext object for the current request. + /// The session ID for the current request. + /// + /// true if the session item is locked in the database; otherwise, false. + /// + /// + /// TimeSpan object that indicates the amount of time the session item has been locked in the database. + /// + /// + /// A lock identifier object. + /// + /// + /// A enumeration value that indicates whether or + /// not the session is uninitialized and cookieless. + /// + /// + public override SessionStateStoreData GetItemExclusive(System.Web.HttpContext context, string id, + out bool locked, out TimeSpan lockAge, out object lockId, out SessionStateActions actions) + { + return GetSessionStoreItem(true, context, id, out locked, out lockAge, out lockId, out actions); + } + + /// + /// Performs any per-request initializations that the MySqlSessionStateStore provider requires. + /// + public override void InitializeRequest(System.Web.HttpContext context) + { + } + + /// + /// Forcibly releases the lock on a session item in the database if multiple attempts to + /// retrieve the session item fail. + /// + /// The HttpContext object for the current request. + /// The session ID for the current request. + /// The lock identifier for the current request. + public override void ReleaseItemExclusive(System.Web.HttpContext context, string id, object lockId) + { + try + { + using (MySqlConnection conn = new MySqlConnection(connectionString)) + { + MySqlCommand cmd = new MySqlCommand( + "UPDATE my_aspnet_sessions SET Locked = 0, Expires = NOW() + INTERVAL @Timeout MINUTE " + + "WHERE SessionId = @SessionId AND ApplicationId = @ApplicationId AND LockId = @LockId", + conn); + + cmd.Parameters.AddWithValue("@Timeout", sessionStateConfig.Timeout.TotalMinutes); + cmd.Parameters.AddWithValue("@SessionId", id); + cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); + cmd.Parameters.AddWithValue("@LockId", lockId); + conn.Open(); + cmd.ExecuteNonQuery(); + } + } + catch (MySqlException e) + { + HandleMySqlException(e, "ReleaseItemExclusive"); + } + } + + /// + /// Removes the specified session item from the database + /// + /// The HttpContext object for the current request. + /// The session ID for the current request. + /// The lock identifier for the current request. + /// The session item to remove from the database. + public override void RemoveItem(System.Web.HttpContext context, string id, object lockId, SessionStateStoreData item) + { + bool sessionDeleted; + + try + { + using (MySqlConnection conn = new MySqlConnection(connectionString)) + { + MySqlCommand cmd = new MySqlCommand("DELETE FROM my_aspnet_sessions " + + " WHERE SessionId = @SessionId AND ApplicationId = @ApplicationId AND LockId = @LockId", + conn); + + cmd.Parameters.AddWithValue("@SessionId", id); + cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); + cmd.Parameters.AddWithValue("@LockId", lockId); + conn.Open(); + sessionDeleted = cmd.ExecuteNonQuery() > 0; + } + if (sessionDeleted && this.enableExpireCallback) + { + this.expireCallback.Invoke(id, item); + } + } + catch (MySqlException ex) + { + HandleMySqlException(ex, "RemoveItem Error: " + ex.Message); + } + } + + + /// + /// Resets the expiration date and timeout for a session item in the database. + /// + /// The HttpContext object for the current request. + /// The session ID for the current request. + public override void ResetItemTimeout(System.Web.HttpContext context, string id) + { + try + { + using (MySqlConnection conn = new MySqlConnection(connectionString)) + { + MySqlCommand cmd = new MySqlCommand( + "UPDATE my_aspnet_sessions SET Expires = NOW() + INTERVAL @Timeout MINUTE" + + " WHERE SessionId = @SessionId AND ApplicationId = @ApplicationId", conn); + + cmd.Parameters.AddWithValue("@Timeout", sessionStateConfig.Timeout.TotalMinutes); + cmd.Parameters.AddWithValue("@SessionId", id); + cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); + conn.Open(); + cmd.ExecuteNonQuery(); + } + } + catch (MySqlException e) + { + HandleMySqlException(e, "ResetItemTimeout"); + } + } + + /// + /// Updates the session time information in the database with the specified session item, + /// and releases the lock. + /// + /// The HttpContext object for the current request. + /// The session ID for the current request. + /// The session item containing new values to update the session item in the database with. + /// + /// The lock identifier for the current request. + /// A Boolean value that indicates whether or not the session item is new in the database. + /// A false value indicates an existing item. + /// + public override void SetAndReleaseItemExclusive(System.Web.HttpContext context, string id, SessionStateStoreData item, object lockId, bool newItem) + { + try + { + using (MySqlConnection conn = new MySqlConnection(connectionString)) + { + // Serialize the SessionStateItemCollection as a byte array + byte[] sessItems = Serialize((SessionStateItemCollection)item.Items); + MySqlCommand cmd; + if (newItem) + { + //Insert the new session item . If there was expired session + //with the same SessionId and Application id, it will be removed + + cmd = new MySqlCommand( + @"INSERT INTO my_aspnet_sessions + (SessionId, ApplicationId, Created, Expires, LockDate, + LockId, Timeout, Locked, SessionItems, Flags) + Values (@SessionId, @ApplicationId, NOW(), NOW() + INTERVAL @Timeout MINUTE, NOW(), + @LockId , @Timeout, @Locked, @SessionItems, @Flags) + on duplicate key update Created = values( Created ), Expires = values( Expires ), + LockDate = values( LockDate ), LockId = values( LockId ), Timeout = values( Timeout) , + Locked = values( Locked ), SessionItems = values( SessionItems ), Flags = values( Flags )", conn); + cmd.Parameters.AddWithValue("@SessionId", id); + cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); + cmd.Parameters.AddWithValue("@Timeout", item.Timeout); + cmd.Parameters.AddWithValue("@LockId", 0); + cmd.Parameters.AddWithValue("@Locked", 0); + cmd.Parameters.AddWithValue("@SessionItems", sessItems); + cmd.Parameters.AddWithValue("@Flags", 0); + } + else + { + //Update the existing session item. + cmd = new MySqlCommand( + "UPDATE my_aspnet_sessions SET Expires = NOW() + INTERVAL @Timeout MINUTE," + + " SessionItems = @SessionItems, Locked = @Locked " + + " WHERE SessionId = @SessionId AND ApplicationId = @ApplicationId AND LockId = @LockId", + conn); + + cmd.Parameters.AddWithValue("@Timeout", item.Timeout); + cmd.Parameters.AddWithValue("@SessionItems", sessItems); + cmd.Parameters.AddWithValue("@Locked", 0); + cmd.Parameters.AddWithValue("@SessionId", id); + cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); + cmd.Parameters.AddWithValue("@LockId", lockId); + } + conn.Open(); + cmd.ExecuteNonQuery(); + } + } + catch (MySqlException e) + { + HandleMySqlException(e, "SetAndReleaseItemExclusive"); + } + } + + + /// + /// GetSessionStoreItem is called by both the GetItem and GetItemExclusive methods. GetSessionStoreItem + /// retrieves the session data from the data source. If the lockRecord parameter is true (in the case of + /// GetItemExclusive), then GetSessionStoreItem locks the record and sets a New LockId and LockDate. + /// + private SessionStateStoreData GetSessionStoreItem(bool lockRecord, + HttpContext context, + string id, + out bool locked, + out TimeSpan lockAge, + out object lockId, + out SessionStateActions actionFlags) + { + + // Initial values for return value and out parameters. + SessionStateStoreData item = null; + lockAge = TimeSpan.Zero; + lockId = null; + locked = false; + actionFlags = SessionStateActions.None; + + // MySqlCommand for database commands. + MySqlCommand cmd = null; + // serialized SessionStateItemCollection. + byte[] serializedItems = null; + // True if a record is found in the database. + bool foundRecord = false; + // True if the returned session item is expired and needs to be deleted. + bool deleteData = false; + // Timeout value from the data store. + int timeout = 0; + + try + { + using (MySqlConnection conn = new MySqlConnection(connectionString)) + { + conn.Open(); + // lockRecord is True when called from GetItemExclusive and + // False when called from GetItem. + // Obtain a lock if possible. Ignore the record if it is expired. + if (lockRecord) + { + cmd = new MySqlCommand( + "UPDATE my_aspnet_sessions SET " + + " Locked = 1, LockDate = NOW()" + + " WHERE SessionId = @SessionId AND ApplicationId = @ApplicationId AND" + + " Locked = 0 AND Expires > NOW()", conn); + + cmd.Parameters.AddWithValue("@SessionId", id); + cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); + + if (cmd.ExecuteNonQuery() == 0) + { + // No record was updated because the record was locked or not found. + locked = true; + } + else + { + // The record was updated. + locked = false; + } + } + + // Retrieve the current session item information. + cmd = new MySqlCommand( + "SELECT NOW(), Expires , SessionItems, LockId, Flags, Timeout, " + + " LockDate, Locked " + + " FROM my_aspnet_sessions" + + " WHERE SessionId = @SessionId AND ApplicationId = @ApplicationId", conn); + + cmd.Parameters.AddWithValue("@SessionId", id); + cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); + + // Retrieve session item data from the data source. + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + if (reader.Read()) + { + DateTime now = reader.GetDateTime(0); + DateTime expires = reader.GetDateTime(1); + if (now.CompareTo(expires) > 0) + { + //The record was expired. Mark it as not locked. + locked = false; + // The session was expired. Mark the data for deletion. + deleteData = true; + } + else + { + foundRecord = true; + } + + object items = reader.GetValue(2); + serializedItems = (items is DBNull) ? null : (byte[])items; + lockId = reader.GetValue(3); + if (lockId is DBNull) + lockId = (int)0; + + actionFlags = (SessionStateActions)(reader.GetInt32(4)); + timeout = reader.GetInt32(5); + DateTime lockDate = reader.GetDateTime(6); + lockAge = now.Subtract(lockDate); + // If it's a read-only session set locked to the current lock + // status (writable sessions have already done this) + if (!lockRecord) + locked = reader.GetBoolean(7); + } + } + + // The record was not found. Ensure that locked is false. + if (!foundRecord) + locked = false; + + // If the record was found and you obtained a lock, then set + // the lockId, clear the actionFlags, + // and create the SessionStateStoreItem to return. + if (foundRecord && !locked) + { + lockId = (int)(lockId) + 1; + + cmd = new MySqlCommand("UPDATE my_aspnet_sessions SET" + + " LockId = @LockId, Flags = 0 " + + " WHERE SessionId = @SessionId AND ApplicationId = @ApplicationId", conn); + + cmd.Parameters.AddWithValue("@LockId", lockId); + cmd.Parameters.AddWithValue("@SessionId", id); + cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); + cmd.ExecuteNonQuery(); + + + // If the actionFlags parameter is not InitializeItem, + // deserialize the stored SessionStateItemCollection. + if (actionFlags == SessionStateActions.InitializeItem) + { + item = CreateNewStoreData(context, (int)sessionStateConfig.Timeout.TotalMinutes); + } + else + { + item = Deserialize(context, serializedItems, timeout); + } + } + } + } + catch (MySqlException e) + { + HandleMySqlException(e, "GetSessionStoreItem"); + } + return item; + } + + /// + /// Sets the reference for the ExpireCallback delegate if setting is enabled. + /// + /// + /// true if is true; otherwise, false. + public override bool SetItemExpireCallback(SessionStateItemExpireCallback expireCallback) + { + if (this.enableExpireCallback) + { + this.expireCallback = expireCallback; + return true; + } + return false; + } + + /// + /// Serialize is called by the SetAndReleaseItemExclusive method to + /// convert the SessionStateItemCollection into a byte array to + /// be stored in the blob field. + /// + private byte[] Serialize(SessionStateItemCollection items) + { + MemoryStream ms = new MemoryStream(); + BinaryWriter writer = new BinaryWriter(ms); + if (items != null) + { + items.Serialize(writer); + } + writer.Close(); + return ms.ToArray(); + } + + /// + /// Deserialize is called by the GetSessionStoreItem method to + /// convert the byte array stored in the blob field to a + /// SessionStateItemCollection. + /// + private SessionStateStoreData Deserialize(HttpContext context, + byte[] serializedItems, int timeout) + { + + SessionStateItemCollection sessionItems = new SessionStateItemCollection(); + + if (serializedItems != null) + { + MemoryStream ms = new MemoryStream(serializedItems); + if (ms.Length > 0) + { + BinaryReader reader = new BinaryReader(ms); + sessionItems = SessionStateItemCollection.Deserialize(reader); + } + } + + return new SessionStateStoreData(sessionItems, SessionStateUtility.GetSessionStaticObjects(context), + timeout); + } + + + private SessionStateItemCollection DeserializeSessionItems(byte[] serializedItems) + { + SessionStateItemCollection sessionItems = new SessionStateItemCollection(); + if (serializedItems != null) + { + MemoryStream ms = new MemoryStream(serializedItems); + if (ms.Length > 0) + { + BinaryReader reader = new BinaryReader(ms); + sessionItems = SessionStateItemCollection.Deserialize(reader); + } + } + return sessionItems; + } + + + private void CleanupOldSessions(object o) + { + + lock (this) + { + if (cleanupRunning) + return; + + cleanupRunning = true; + } + try + { + using (MySqlConnection con = new MySqlConnection(connectionString)) + { + con.Open(); + MySqlCommand cmd = new MySqlCommand( + "UPDATE my_aspnet_sessioncleanup SET LastRun=NOW() WHERE" + + " LastRun + INTERVAL IntervalMinutes MINUTE < NOW() AND ApplicationId = @ApplicationId", con); + cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); + int updatedSessions = cmd.ExecuteNonQuery(); + if (updatedSessions > 0) + DeleteTimedOutSessions(); + } + } + catch (MySqlException e) + { + HandleMySqlException(e, "CleanupOldSessions"); + } + finally + { + lock (this) + { + cleanupRunning = false; + } + } + } + + int GetCleanupInterval(MySqlConnection con, long ApplicationId) + { + MySqlCommand cmd = new MySqlCommand("SELECT IntervalMinutes from my_aspnet_sessioncleanup where ApplicationId = @ApplicationId", con); + cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); + return (int)cmd.ExecuteScalar(); + } + + /// + /// Checks storage engine used by my_aspnet_sessions. + /// + /// The connection object used to check the storage engine. + /// Warn if MyISAM is used - it does not handle concurrent updates well + /// which is important for session provider, as each access to session + /// does an update to "expires" field. + private void CheckStorageEngine(MySqlConnection con) + { + + try + { + MySqlCommand cmd = new MySqlCommand( + "SELECT ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='my_aspnet_sessions'", + con); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + if (reader.Read()) + { + string engine = reader.GetString(0); + if (engine == "MyISAM") + { + string message = + "Storage engine for table my_aspnet_sessions is MyISAM." + + "If possible, please change it to a transactional storage engine " + + "to improve performance,e.g with 'alter table my_aspnet_sessions engine innodb'\n"; + try + { + using (EventLog log = new EventLog()) + { + log.Source = eventSource; + log.Log = eventLog; + log.WriteEntry(message); + } + } + catch (SecurityException) + { + // Can't write to event log due to security restrictions + Trace.WriteLine(message); + } + } + } + } + } + catch (MySqlException e) + { + Trace.Write("got exception while checking for engine" + e); + } + } + + private void DeleteTimedOutSessions() + { + if (this.enableExpireCallback) + { + DeleteTimedOutSessionsWithCallback(); + } + else + { + DeleteTimedOutSessionsWithoutCallback(); + } + } + + private void DeleteTimedOutSessionsWithoutCallback() + { + try + { + using (MySqlConnection con = new MySqlConnection(connectionString)) + { + con.Open(); + MySqlCommand cmd = new MySqlCommand("DELETE FROM my_aspnet_sessions WHERE Expires < NOW() AND ApplicationId = @ApplicationId", con); + cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); + cmd.ExecuteNonQuery(); + } + } + catch (Exception e) + { + Trace.Write("Got exception in Delete Timed Out Sessions With Out Callback " + e); + throw; + } + } + + private void DeleteTimedOutSessionsWithCallback() + { + using (MySqlConnection con = new MySqlConnection(connectionString)) + { + con.Open(); + MySqlCommand cmd = new MySqlCommand("SELECT SessionID, SessionItems FROM my_aspnet_sessions WHERE Expires < NOW() AND ApplicationId = @ApplicationId", con); + cmd.Parameters.AddWithValue("@ApplicationId", ApplicationId); + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + string sid = reader.GetString(0); + object items = reader.GetValue(1); + byte[] rawSessionItems = (items is DBNull) ? null : (byte[])items; + + SessionStateItemCollection sessionItems = this.DeserializeSessionItems(rawSessionItems); + SessionStateStoreData ssd = new SessionStateStoreData(sessionItems, new HttpStaticObjectsCollection(), 0); + + try + { + if (this.expireCallback != null) this.expireCallback.Invoke(sid, ssd); + + using (MySqlConnection con2 = new MySqlConnection(connectionString)) + { + MySqlCommand cmd2 = new MySqlCommand("DELETE FROM my_aspnet_sessions" + + " WHERE SessionId = @SessionId" + + " AND ApplicationId = @ApplicationId", con2); + cmd2.Parameters.AddWithValue("@SessionId", sid); + cmd2.Parameters.AddWithValue("@ApplicationId", ApplicationId); + con2.Open(); + cmd2.ExecuteNonQuery(); + } + + } + catch (Exception e) + { + Trace.Write("Got exception in Delete Timed Out Sessions With Callback " + e); + throw; + } + } + } + } + } + } +} diff --git a/Source/MySql.Web/SimpleMembershipProvider.cs b/MySql.Web/src/SimpleMembershipProvider.cs similarity index 92% rename from Source/MySql.Web/SimpleMembershipProvider.cs rename to MySql.Web/src/SimpleMembershipProvider.cs index 29c676892..a2d1d6735 100644 --- a/Source/MySql.Web/SimpleMembershipProvider.cs +++ b/MySql.Web/src/SimpleMembershipProvider.cs @@ -1,1106 +1,1138 @@ -// Copyright © 2014, 2015 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySql.Web.General; -using MySql.Web.Properties; -using System; -using System.Collections.Generic; -using System.Configuration; -using System.Configuration.Provider; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Web.Hosting; -using System.Web.Security; -using WebMatrix.WebData; -using System.Security.Cryptography; -using System.Web; -using System.Resources; -using MySql.Web.Common; - -namespace MySql.Web.Security -{ - public class MySqlSimpleMembershipProvider : ExtendedMembershipProvider - { - #region Private - private readonly MembershipProvider _prevProvider; - - Application _app; - bool _enablePwdReset; - bool _enablePwdRetrival; - int _maxPwdAttempts; - int _minReqNonAlphanumericalChars; - int _minReqPwdLength; - int _pwdAttemptWindow; - MembershipPasswordFormat _pwdFormat; - string _pwdStrenghtRegex; - bool _reqQuestionAnswer; - bool _reqUniqueEmail; - string _connString; - string _userTableName; - string _userIdColumn; - string _userNameColumn; - bool _autoGenerateTables; - private readonly string _membershipTable = "webpages_membership"; - private readonly string _oauthMembershipTable = "webpages_oauthmembership"; - private readonly string _userInRolesTable = "webpages_usersinroles"; - private readonly string _oauthTokenTable = "webpages_oauthtoken"; - - private static string GetConfigValue(string configVal, string defaultVal) - { - return !string.IsNullOrEmpty(configVal) ? configVal : defaultVal; - } - #endregion - public MySqlSimpleMembershipProvider() - : this(null) - { } - - public MySqlSimpleMembershipProvider(MembershipProvider previousProvider) - { - _prevProvider = previousProvider; - if (_prevProvider != null) - { - _prevProvider.ValidatingPassword += delegate(object sender, ValidatePasswordEventArgs args) { this.OnValidatingPassword(args); }; - } - } - - public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) - { - if (config == null) - { - NullArgumentException("config"); - } - if (string.IsNullOrEmpty(name)) - { - name = "MySqlExtendedMembershipProvider"; - } - if (string.IsNullOrEmpty(config["description"])) - { - config.Remove("description"); - config.Add("description", string.Format("MySql Default {0} Description", name)); - } - - base.Initialize(name, config); - - var appName = GetConfigValue(config["applicationName"], HostingEnvironment.SiteName); - _maxPwdAttempts = Int32.Parse(GetConfigValue(config["maxInvalidPasswordAttempts"], "5")); - _pwdAttemptWindow = Int32.Parse(GetConfigValue(config["passwordAttemptWindow"], "10")); - _minReqNonAlphanumericalChars = Int32.Parse(GetConfigValue(config["minRequiredNonalphanumericCharacters"], "1")); - _minReqPwdLength = Int32.Parse(GetConfigValue(config["minRequiredPasswordLength"], "7")); - _pwdStrenghtRegex = GetConfigValue(config["passwordStrengthRegularExpression"], ""); - _enablePwdReset = bool.Parse(GetConfigValue(config["enablePasswordReset"], "True")); - _enablePwdRetrival = bool.Parse(GetConfigValue(config["enablePasswordRetrieval"], "False")); - _reqQuestionAnswer = bool.Parse(GetConfigValue(config["requiresQuestionAndAnswer"], "False")); - _reqUniqueEmail = bool.Parse(GetConfigValue(config["requiresUniqueEmail"], "True")); - - var pwdFormat = !string.IsNullOrEmpty(config["passwordFormat"]) ? config["passwordFormat"].ToString().ToLowerInvariant() : "hashed"; - - switch (pwdFormat) - { - case "hashed": - _pwdFormat = MembershipPasswordFormat.Hashed; - break; - case "encrypted": - _pwdFormat = MembershipPasswordFormat.Encrypted; - break; - case "clear": - _pwdFormat = MembershipPasswordFormat.Clear; - break; - default: - throw new ProviderException(Resources.PasswordFormatNotSupported); - } - - if (_pwdFormat == MembershipPasswordFormat.Hashed) - { - if (_enablePwdRetrival) - throw new ProviderException(Resources.CannotRetrieveHashedPasswords); - } - - _app = new Application(appName, base.Description); - ConnectionStringSettings connStrSettings = ConfigurationManager.ConnectionStrings[config["connectionStringName"]]; - _connString = connStrSettings != null ? connStrSettings.ConnectionString.Trim() : ""; - if (string.IsNullOrEmpty(_connString)) return; - - UserTableName = GetConfigValue(config["userTableName"], ""); - UserIdColumn = GetConfigValue(config["userIdColumn"], ""); - UserNameColumn = GetConfigValue(config["userNameColumn"], ""); - _autoGenerateTables = bool.Parse(GetConfigValue(config["autoGenerateTables"], "True")); - if (_autoGenerateTables) - CreateTables(); - else - ValidateUserTable(); - - Initialized = true; - } - - public override bool ChangePassword(string username, string oldPassword, string newPassword) - { - if (!Initialized) - { - _prevProvider.ChangePassword(username, oldPassword, newPassword); - } - - if (string.IsNullOrEmpty(username)) - NullArgumentException("username"); - if (string.IsNullOrEmpty(oldPassword)) - NullArgumentException("oldPassword"); - if (string.IsNullOrEmpty(newPassword)) - NullArgumentException("newPassword"); - - int userid = GetUserId(username); - if (userid <= 0) - { - return false; - } - if (VerifyPassword(userid, oldPassword, GetHashedUserPassword(userid))) - { - return UpdatePassword(userid, newPassword) > 0; - } - - return false; - } - - public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer) - { - IsValidOperation(false); - return _prevProvider.ChangePasswordQuestionAndAnswer(username, password, newPasswordQuestion, newPasswordAnswer); - } - - public override bool ConfirmAccount(string accountConfirmationToken) - { - IsValidOperation(true); - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - var token = dbConn.ExecuteQuerySingleRecord(string.Format("select userid, confirmationtoken from {0} where confirmationtoken=?", _membershipTable), accountConfirmationToken); - if (token == null || (token != null && string.IsNullOrEmpty(token[1].ToString()))) - { - return false; - } - return dbConn.ExecuteNonQuery(string.Format("update {0} set isconfirmed=1 where userid=?;", _membershipTable), (int)token[0]) > 0; - } - } - - public override bool ConfirmAccount(string userName, string accountConfirmationToken) - { - var userid = GetUserId(userName); - if (userid <= 0) - return false; - - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - var token = dbConn.ExecuteQuerySingleRecord(string.Format("select userid, confirmationtoken from {0} where confirmationtoken=? and userid=?", _membershipTable), accountConfirmationToken, userid); - if (token == null || (token != null && string.IsNullOrEmpty(token[1].ToString()))) - { - return false; - } - return dbConn.ExecuteNonQuery(string.Format("update {0} set isconfirmed=1 where userid=?;", _membershipTable), userid) > 0; - } - } - - public override string CreateAccount(string userName, string password, bool requireConfirmationToken) - { - IsValidOperation(true); - if (string.IsNullOrEmpty(userName)) - NullArgumentException(userName); - if (string.IsNullOrEmpty(password)) - NullArgumentException(password); - var hashedPass = HashPassword(password); - if (hashedPass.Length > 128) - throw new ArgumentException(Resources.PasswordExceedsMaxLength, password); - - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - var userid = GetUserId(userName); - if (userid <= 0) - { - throw new InvalidOperationException(string.Format(Resources.UserNotFound, UserTableName)); - } - if (dbConn.ExecuteQuerySingleRecord(string.Format("select userid from {0} where userid=?;", _membershipTable), userid) != null) - { - throw new InvalidOperationException(string.Format(Resources.UserAlreadyExists, userName)); - } - object token = DBNull.Value; - if (requireConfirmationToken) - token = GenerateToken(); - - string insertQuery = string.Format("insert into {0} (userid, createdate, confirmationtoken, isconfirmed, password, passwordchangeddate, passwordsalt) values(?,now(),?,?,?,now(),?)", _membershipTable); - if (dbConn.ExecuteNonQuery(insertQuery, userid, token, !requireConfirmationToken, hashedPass, string.Empty) <= 0) - { - throw new MembershipCreateUserException(MembershipCreateStatus.ProviderError); - } - return token == DBNull.Value ? null : token.ToString(); - } - } - - public override void CreateOrUpdateOAuthAccount(string provider, string providerUserId, string userName) - { - IsValidOperation(true); - if (string.IsNullOrEmpty(userName)) - NullArgumentException(userName); - var userid = GetUserId(userName); - if (userid <= 0) - { - throw new InvalidOperationException(string.Format(Resources.UserNotFound, UserTableName)); - } - var oauthUserId = GetUserIdFromOAuth(provider, providerUserId); - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - if (oauthUserId == 0) - { - if (dbConn.ExecuteNonQuery(string.Format("insert into {0} (provider, provideruserid, userid) values(?,?,?)", _oauthMembershipTable), provider, providerUserId, userid) <= 0) - { - throw new MembershipCreateUserException(MembershipCreateStatus.ProviderError); - } - } - else - { - if (dbConn.ExecuteNonQuery(string.Format("update {0} set userid=? where upper(provider) = ? and upper(provideruserid)=?;", _oauthMembershipTable), userid, provider.ToUpper(), providerUserId.ToUpper()) <= 0) - { - throw new MembershipCreateUserException(MembershipCreateStatus.ProviderError); - } - } - } - } - - public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status) - { - IsValidOperation(false); - return _prevProvider.CreateUser(username, password, email, passwordQuestion, passwordAnswer, isApproved, providerUserKey, out status); - } - - public override string CreateUserAndAccount(string userName, string password, bool requireConfirmation, IDictionary values) - { - IsValidOperation(true); - CreateUserInUserTable(userName, values); - return CreateAccount(userName, password, requireConfirmation); - } - - public override bool DeleteAccount(string userName) - { - IsValidOperation(true); - int userid = GetUserId(userName); - if (userid < 0) - { - return false; - } - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - return (dbConn.ExecuteNonQuery(string.Format("delete from {0} where userid=?;", _membershipTable), userid) > 0); - } - } - - public override void DeleteOAuthAccount(string provider, string providerUserId) - { - IsValidOperation(true); - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - if (dbConn.ExecuteNonQuery(string.Format("delete from {0} where upper(provider) = ? and upper(provideruserid)=?;", _oauthMembershipTable), provider.ToUpper(), providerUserId.ToUpper()) <= 0) - { - throw new Exception(string.Format(Resources.DeleteOAuthAccountFailed, provider, providerUserId)); - } - } - } - - public override void DeleteOAuthToken(string token) - { - IsValidOperation(true); - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - dbConn.ExecuteNonQuery(string.Format("delete from {0} where token=?", _oauthTokenTable), token); - } - } - - public override bool DeleteUser(string username, bool deleteAllRelatedData) - { - if (!Initialized) - return _prevProvider.DeleteUser(username, deleteAllRelatedData); - - int userid = GetUserId(username); - if (userid < 0) - return false; - - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - if (deleteAllRelatedData) - { - return dbConn.ExecuteInTransaction( - new List>() - { - new Tuple(string.Format("delete from {0} where {1}=?;", UserTableName, UserIdColumn), new object [] { userid }), - new Tuple(string.Format("delete from {0} where userid=?;", _oauthMembershipTable), new object [] { userid }), - new Tuple(string.Format("delete from {0} where userid=?;", _membershipTable), new object [] { userid }), - new Tuple(string.Format("delete from {0} where userid=?;", _userInRolesTable), new object [] { userid }) - }); - } - else - { - return (dbConn.ExecuteNonQuery(string.Format("delete from {0} where {1}=?;", UserTableName, UserIdColumn), userid) > 0); - } - } - } - - public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords) - { - IsValidOperation(false); - return _prevProvider.FindUsersByEmail(emailToMatch, pageIndex, pageSize, out totalRecords); - } - - public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords) - { - IsValidOperation(false); - return _prevProvider.FindUsersByName(usernameToMatch, pageIndex, pageSize, out totalRecords); - } - - public override string GeneratePasswordResetToken(string userName, int tokenExpirationInMinutesFromNow) - { - IsValidOperation(true); - if (string.IsNullOrEmpty(userName)) - NullArgumentException("username"); - int userid = GetUserId(userName); - if (userid <= 0) - InvalidUserException(userName); - - if (UserConfirmed(userid)) - { - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - string token = dbConn.ExecuteScalar(string.Format("select PasswordVerificationToken from {0} where userid=? and PasswordVerificationTokenExpirationDate > ?;", _membershipTable), userid, DateTime.Now) as string; - if (token != null) - { - token = GenerateToken(); - if (dbConn.ExecuteNonQuery(string.Format("update {0} set PasswordVerificationToken=?, PasswordVerificationTokenExpirationDate=? where userid=?;", _membershipTable), token, DateTime.Now.AddMinutes(tokenExpirationInMinutesFromNow), userid) <= 0) - { - throw new ProviderException(Resources.GeneratePassVerificationTokenFailed); - } - } - return token; - } - } - return null; - } - - public override ICollection GetAccountsForUser(string userName) - { - IsValidOperation(true); - int userid = GetUserId(userName); - if (userid > 0) - { - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - var records = dbConn.ExecuteQuery(string.Format("select provider, provideruserid from {0} where userid=?", _oauthMembershipTable), userid); - if (records != null && records.Count() > 0) - { - var accounts = new List(); - records.ToList().ForEach(record => accounts.Add(new OAuthAccountData(record["provider"].ToString(), record["provideruserid"].ToString()))); - return accounts; - } - } - } - return new OAuthAccountData[0]; - } - - public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords) - { - IsValidOperation(false); - return _prevProvider.GetAllUsers(pageIndex, pageSize, out totalRecords); - } - - public override DateTime GetCreateDate(string userName) - { - int userid = GetUserId(userName); - if (userid < 0) - InvalidUserException(userName); - - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - var createDate = dbConn.ExecuteScalar(string.Format("select CreateDate from {0} where userid=?;", _membershipTable), userid); - if (createDate != null && createDate != DBNull.Value) - return (DateTime)createDate; - - return DateTime.MinValue; - } - } - - public override DateTime GetLastPasswordFailureDate(string userName) - { - int userid = GetUserId(userName); - if (userid < 0) - InvalidUserException(userName); - - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - var failureDate = dbConn.ExecuteScalar(string.Format("select LastPasswordFailureDate from {0} where userid=?;", _membershipTable), userid); - if (failureDate != null && failureDate != DBNull.Value) - return (DateTime)failureDate; - - return DateTime.MinValue; - } - } - - public override int GetNumberOfUsersOnline() - { - IsValidOperation(false); - return _prevProvider.GetNumberOfUsersOnline(); - } - - public override string GetPassword(string username, string answer) - { - IsValidOperation(false); - return _prevProvider.GetPassword(username, answer); - } - - public override DateTime GetPasswordChangedDate(string userName) - { - int userid = GetUserId(userName); - if (userid < 0) - InvalidUserException(userName); - - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - var changedDate = dbConn.ExecuteScalar(string.Format("select PasswordChangedDate from {0} where userid=?;", _membershipTable), userid); - if (changedDate != null) - return (DateTime)changedDate; - - return DateTime.MinValue; - } - } - - public override int GetPasswordFailuresSinceLastSuccess(string userName) - { - int userid = GetUserId(userName); - if (userid < 0) - InvalidUserException(userName); - - return GetPasswordFailuresSinceLastSuccess(userid); - } - - private int GetPasswordFailuresSinceLastSuccess(int userId) - { - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - var failures = dbConn.ExecuteScalar(string.Format("select PasswordFailuresSinceLastSuccess from {0} where userid=?;", _membershipTable), userId); - if (failures != null) - return (int)failures; - - return -1; - } - } - - public override MembershipUser GetUser(object providerUserKey, bool userIsOnline) - { - IsValidOperation(false); - return _prevProvider.GetUser(providerUserKey, userIsOnline); - } - - public override MembershipUser GetUser(string username, bool userIsOnline) - { - if (!Initialized) - return _prevProvider.GetUser(username, userIsOnline); - - int userid = GetUserId(username); - if (userid < 0) - { - return null; - } - return new MembershipUser(Membership.Provider.Name, username, userid, null, null, null, true, false, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue); - } - - public int GetUserId(string userName) - { - return GetUserId(userName, GetConnectionString(), UserTableName, UserIdColumn, UserNameColumn); - } - - internal static int GetUserId(string userName, string connectionString, string userTableName, string userIdColumn, string userNameColumn) - { - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(connectionString)) - { - var user = dbConn.ExecuteQuerySingleRecord(string.Format("select {0} from {1} where {2} = ?;", userIdColumn, userTableName, userNameColumn), userName); - if (user != null) - return (int)user[userIdColumn]; - - return 0; - } - } - - public override int GetUserIdFromOAuth(string provider, string providerUserId) - { - IsValidOperation(true); - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - var user = dbConn.ExecuteQuerySingleRecord(string.Format("select userid from {0} where upper(provider) = ? and upper(provideruserid)=?;", _oauthMembershipTable), provider.ToUpper(), providerUserId.ToUpper()); - if (user != null) - return (int)user["userid"]; - - return 0; - } - } - - public override int GetUserIdFromPasswordResetToken(string token) - { - IsValidOperation(true); - return GetUserIdFromPasswordResetToken(token, false); - } - - public override string GetOAuthTokenSecret(string token) - { - IsValidOperation(true); - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - return dbConn.ExecuteScalar(string.Format("select secret from {0} where token=?;", _oauthTokenTable), token) as string; - } - } - - private int GetUserIdFromPasswordResetToken(string token, bool checkExpirationDate = false) - { - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - var user = dbConn.ExecuteQuerySingleRecord(string.Format("select userid from {0} where PasswordVerificationToken = ? {1};", _membershipTable, (checkExpirationDate ? "and PasswordVerificationTokenExpirationDate > now()" : "")), token); - if (user != null) - return (int)user["userid"]; - - return 0; - } - } - - public override string GetUserNameByEmail(string email) - { - IsValidOperation(false); - return _prevProvider.GetUserNameByEmail(email); - } - - public override string GetUserNameFromId(int userId) - { - IsValidOperation(true); - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - return dbConn.ExecuteScalar(string.Format("select {0} from {1} where {2}=?;", UserNameColumn, UserTableName, UserIdColumn), userId) as string; - } - } - - public override bool HasLocalAccount(int userId) - { - IsValidOperation(true); - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - return (dbConn.ExecuteQuery(string.Format("select userid from {0} where userid=?;", _membershipTable), userId).Count() > 0); - } - } - - public override bool IsConfirmed(string userName) - { - IsValidOperation(true); - if (string.IsNullOrEmpty(userName)) - NullArgumentException("username"); - int userid = GetUserId(userName); - if (userid <= 0) - InvalidUserException(userName); - return UserConfirmed(userid); - } - - public override void ReplaceOAuthRequestTokenWithAccessToken(string requestToken, string accessToken, string accessTokenSecret) - { - IsValidOperation(true); - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - dbConn.ExecuteNonQuery(string.Format("delete from {0} where token=?", _oauthTokenTable), requestToken); - } - StoreOAuthRequestToken(accessToken, accessTokenSecret); - } - - public override string ResetPassword(string username, string answer) - { - IsValidOperation(false); - return _prevProvider.ResetPassword(username, answer); - } - - public override bool ResetPasswordWithToken(string token, string newPassword) - { - IsValidOperation(true); - if (string.IsNullOrEmpty(token)) - { - NullArgumentException("token"); - } - if (string.IsNullOrEmpty(newPassword)) - { - NullArgumentException("newPasword"); - } - int userid = GetUserIdFromPasswordResetToken(token, true); - if (userid <= 0) - { - return false; - } - bool passUpdated = UpdatePassword(userid, newPassword) > 0; - if (passUpdated) - { - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - if (dbConn.ExecuteNonQuery(string.Format("update {0} set PasswordVerificationToken=null, PasswordVerificationTokenExpirationDate=null where userid=?;", _membershipTable), userid) <= 0) - { - throw new ProviderException(string.Format(Resources.ClearPassTokenFailed, userid, _membershipTable)); - } - } - } - return passUpdated; - } - - public override void StoreOAuthRequestToken(string requestToken, string requestTokenSecret) - { - IsValidOperation(true); - string secret = GetOAuthTokenSecret(requestToken); - if (secret != null) - { - if (secret.Equals(requestTokenSecret, StringComparison.OrdinalIgnoreCase)) - return; - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - if (dbConn.ExecuteNonQuery(string.Format("update {0} set secret=? where token=?;", _oauthTokenTable), requestTokenSecret, requestToken) <= 0) - throw new ProviderException(string.Format(Resources.UpdateTokenFailed, requestTokenSecret)); - } - } - else - { - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - if (dbConn.ExecuteNonQuery(string.Format("insert into {0} (token, secret) values (?,?);", _oauthTokenTable), requestTokenSecret, requestToken) <= 0) - throw new ProviderException(string.Format(Resources.SaveTokenFailed, requestTokenSecret)); - } - } - } - - public override bool UnlockUser(string userName) - { - IsValidOperation(false); - return _prevProvider.UnlockUser(userName); - } - - public override void UpdateUser(MembershipUser user) - { - IsValidOperation(false); - _prevProvider.UpdateUser(user); - } - - public override bool ValidateUser(string username, string password) - { - if (!Initialized) - return _prevProvider.ValidateUser(username, password); - if (string.IsNullOrEmpty(username)) - NullArgumentException("userName"); - if (string.IsNullOrEmpty(password)) - NullArgumentException("password"); - int userid = GetUserId(username); - if (userid > 0) - { - if (!UserConfirmed(userid)) - return false; - else - return VerifyPassword(userid, password, GetHashedUserPassword(userid)); - } - return false; - } - - #region Properties - public override string ApplicationName - { - get - { - if (Initialized) - throw new NotSupportedException(); - else - return _prevProvider.ApplicationName; - } - set - { - if (Initialized) - throw new NotSupportedException(); - else - _prevProvider.ApplicationName = value; - } - } - - public string ConnectionString - { get; set; } - - public string ConnectionStringName - { get; set; } - - public override bool EnablePasswordReset - { - get - { - return Initialized ? false : _prevProvider.EnablePasswordReset; - } - } - - public override bool EnablePasswordRetrieval - { - get - { - return Initialized ? false : _prevProvider.EnablePasswordRetrieval; - } - } - - public override int MaxInvalidPasswordAttempts - { - get - { - return Initialized ? Int32.MaxValue : _prevProvider.MaxInvalidPasswordAttempts; - } - } - - public override int MinRequiredPasswordLength - { - get - { - return Initialized ? 7 : _prevProvider.MinRequiredPasswordLength; - } - } - - public override int MinRequiredNonAlphanumericCharacters - { - get - { - return Initialized ? 1 : _prevProvider.MinRequiredNonAlphanumericCharacters; - } - } - - public override int PasswordAttemptWindow - { - get - { - return Initialized ? Int32.MaxValue : _prevProvider.PasswordAttemptWindow; - } - } - - public override MembershipPasswordFormat PasswordFormat - { - get - { - return Initialized ? MembershipPasswordFormat.Hashed : _prevProvider.PasswordFormat; - } - } - - public override string PasswordStrengthRegularExpression - { - get - { - return Initialized ? string.Empty : _prevProvider.PasswordStrengthRegularExpression; - } - } - - public string ProviderName - { get; set; } - - public override bool RequiresQuestionAndAnswer - { - get - { - return Initialized ? false : _prevProvider.RequiresQuestionAndAnswer; - } - } - - public override bool RequiresUniqueEmail - { - get - { - return Initialized ? false : _prevProvider.RequiresUniqueEmail; - } - } - - public string UserTableName - { - get - { - if (string.IsNullOrEmpty(_userTableName)) - throw new InvalidOperationException(Resources.UserTableNameNotInitilized); - - return _userTableName; - } - internal set - { - _userTableName =value; - } - } - - public string UserIdColumn - { - get - { - if (string.IsNullOrEmpty(_userIdColumn)) - throw new InvalidOperationException(Resources.UserIdColumnNotInitialized); - - return _userIdColumn; - } - internal set - { - _userIdColumn = value; - } - } - - public string UserNameColumn - { - get - { - if (string.IsNullOrEmpty(_userNameColumn)) - throw new InvalidOperationException(Resources.UserNameColumnNotInitialized); - - return _userNameColumn; - } - internal set - { - _userNameColumn = value; - } - } - - #endregion - - #region Private_Internal - - internal void CreateTables() - { - string connString = GetConnectionString(); - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(connString)) - { - if (!VerifyIfTableExists(connString, UserTableName)) - { - dbConn.ExecuteNonQuery(string.Format("create table {0} ({1} int not null primary key auto_increment, {2} varchar(250) not null unique);", UserTableName, UserIdColumn, UserNameColumn)); - } - - //create schema - ResourceManager r = new ResourceManager("MySql.Web.Properties.Resources", typeof(SchemaManager).Assembly); - string schema = r.GetString("schema11"); - dbConn.ExecuteNonQuery(schema); - } - } - - internal void ValidateUserTable() - { - if (!VerifyIfTableExists(GetConnectionString(), UserTableName)) - { - throw new InvalidOperationException(string.Format(Resources.UserTableNotFound, UserTableName)); - } - } - - internal bool Initialized - { - get; - set; - } - - private string GetConnectionString() - { - if (!string.IsNullOrEmpty(ConnectionString)) - return ConnectionString; - else - { - ConnectionStringSettings connString = ConfigurationManager.ConnectionStrings[ConnectionStringName]; - if (connString != null) - return connString.ConnectionString; - } - - if (!string.IsNullOrEmpty(_connString)) - return _connString; - throw new InvalidOperationException(Resources.NoConnString); - } - - internal static bool VerifyIfTableExists(string connectionString, string tableName) - { - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(connectionString)) - { - var tables = dbConn.ExecuteQuery("show tables;"); - return tables.Where(record => record[0].ToString().Equals(tableName, StringComparison.OrdinalIgnoreCase)).Count() > 0; - } - } - - internal string GetHashedUserPassword(int userId) - { - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - var userPassword = dbConn.ExecuteQuerySingleRecord(string.Format("select password from {0} where userid=?;", _membershipTable), userId); - if (userPassword != null) - return userPassword[0].ToString(); - return null; - } - } - - internal string HashPassword(string password) - { - if (string.IsNullOrEmpty(password)) - { - throw new ArgumentException(Resources.InvalidArgument, password); - } - - Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(password, 16, 1000); - byte[] salt = rfc2898.Salt; - byte[] passBytes = rfc2898.GetBytes(32); - byte[] result = new byte[48]; - Buffer.BlockCopy(salt, 0, result, 0, 16); - Buffer.BlockCopy(passBytes, 0, result, 16, 32); - return Convert.ToBase64String(result); - } - - internal bool VerifyPassword(int userid, string password, string hashedPassword) - { - if (string.IsNullOrEmpty(password)) - { - throw new ArgumentException(Resources.InvalidArgument, password); - } - if (string.IsNullOrEmpty(hashedPassword)) - { - throw new ArgumentException(Resources.InvalidArgument, hashedPassword); - } - byte[] hashed = Convert.FromBase64String(hashedPassword); - if (hashed.Length != 48) - { - return false; - } - byte[] salt = new byte[16]; - byte[] passBytes = new byte[32]; - Buffer.BlockCopy(hashed, 0, salt, 0, 16); - Buffer.BlockCopy(hashed, 16, passBytes, 0, 32); - - Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(password, salt, 1000); - bool validation = CompareBuffer(rfc2898.GetBytes(32), passBytes); - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - if (validation) - { - dbConn.ExecuteNonQuery(string.Format("update {0} set PasswordFailuresSinceLastSuccess=0 where userid=?;", _membershipTable), userid); - } - else - { - int failures = GetPasswordFailuresSinceLastSuccess(userid); - dbConn.ExecuteNonQuery(string.Format("update {0} set PasswordFailuresSinceLastSuccess=?, LastPasswordFailureDate=now() where userid=?;", _membershipTable), (failures == -1 ? 1 : failures + 1), userid); - } - } - return validation; - } - - internal bool CompareBuffer(byte[] source, byte[] target) - { - if (source == null || target == null || (source.Length != target.Length)) - return false; - for (int ctr = 0; ctr < target.Length; ctr++) - { - if (target[ctr] != source[ctr]) - return false; - } - - return true; - } - - private int UpdatePassword(int userId, string newPassword) - { - string hashedPass = HashPassword(newPassword); - if (hashedPass.Length > 128) - throw new ArgumentException(Resources.PasswordExceedsMaxLength, newPassword); - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - return dbConn.ExecuteNonQuery(string.Format("update {0} set password=?, PasswordChangedDate=now(), PasswordSalt='' where userid=?;", _membershipTable), hashedPass, userId); - } - } - - internal void IsValidOperation(bool currentProvider) - { - switch (currentProvider) - { - case true: - if (!Initialized) - ProviderException(); - break; - case false: - if (Initialized) - PreviousProviderException(); - break; - } - } - - private void ProviderException() - { - throw new Exception(Resources.SimpleMembershipNotInitialized); - } - - private void PreviousProviderException() - { - throw new NotSupportedException(Resources.PreviousProviderException); - } - - private void InvalidUserException(string userName) - { - throw new Exception(string.Format(Resources.InvalidUser, userName, UserTableName)); - } - - internal static void NullArgumentException(string parameterName) - { - throw new ArgumentException(Resources.InvalidArgument, parameterName); - } - - private string GenerateToken() - { - RNGCryptoServiceProvider provider = new RNGCryptoServiceProvider(); - byte[] data = new byte[16]; - provider.GetBytes(data); - return HttpServerUtility.UrlTokenEncode(data); - } - - private void CreateUserInUserTable(string userName, IDictionary values) - { - IsValidOperation(true); - var userid = GetUserId(userName); - if (userid > 0) - { - throw new MembershipCreateUserException(MembershipCreateStatus.DuplicateUserName); - } - StringBuilder columns = new StringBuilder(); - columns.Append(UserNameColumn); - StringBuilder args = new StringBuilder(); - args.Append("?"); - var argsValues = new List(); - if (values != null) - { - foreach (var value in values) - { - if (string.Equals(UserNameColumn, value.Key, StringComparison.OrdinalIgnoreCase)) - continue; - columns.Append(string.Format(",{0}", value.Value)); - args.Append(",?"); - argsValues.Add(value.Value != null ? value.Value : DBNull.Value); - } - } - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - if (dbConn.ExecuteNonQuery(string.Format("insert into {0} ({1}) values({2})", UserTableName, columns.ToString(), args.ToString()), userName, argsValues.ToArray()) < 1) - { - throw new MembershipCreateUserException(MembershipCreateStatus.ProviderError); - } - } - } - - private bool UserConfirmed(int userId) - { - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - return ((long)dbConn.ExecuteScalar(string.Format("select count(*) from {0} where userid=? and isconfirmed=1;", _membershipTable), userId)) > 0; - } - } - #endregion - } -} +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Web.Common; +using MySql.Web.General; +using MySql.Web.Properties; +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Configuration.Provider; +using System.Globalization; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Web; +using System.Web.Hosting; +using System.Web.Security; +using WebMatrix.WebData; + +namespace MySql.Web.Security +{ + /// + /// Manages storage of simple membership information for an ASP.NET application in a MySQL database. + /// + public class MySqlSimpleMembershipProvider : ExtendedMembershipProvider + { + #region Private + private readonly MembershipProvider _prevProvider; + + Application _app; + bool _enablePwdReset; + bool _enablePwdRetrival; + int _maxPwdAttempts; + int _minReqNonAlphanumericalChars; + int _minReqPwdLength; + int _pwdAttemptWindow; + MembershipPasswordFormat _pwdFormat; + string _pwdStrenghtRegex; + bool _reqQuestionAnswer; + bool _reqUniqueEmail; + string _connString; + string _userTableName; + string _userIdColumn; + string _userNameColumn; + bool _autoGenerateTables; + private readonly string _membershipTable = "webpages_membership"; + private readonly string _oauthMembershipTable = "webpages_oauthmembership"; + private readonly string _userInRolesTable = "webpages_usersinroles"; + private readonly string _oauthTokenTable = "webpages_oauthtoken"; + + private static string GetConfigValue(string configVal, string defaultVal) + { + return !string.IsNullOrEmpty(configVal) ? configVal : defaultVal; + } + #endregion + public MySqlSimpleMembershipProvider() + : this(null) + { } + + public MySqlSimpleMembershipProvider(MembershipProvider previousProvider) + { + _prevProvider = previousProvider; + if (_prevProvider != null) + { + _prevProvider.ValidatingPassword += delegate (object sender, ValidatePasswordEventArgs args) { this.OnValidatingPassword(args); }; + } + } + + public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) + { + if (config == null) + { + NullArgumentException("config"); + } + if (string.IsNullOrEmpty(name)) + { + name = "MySqlExtendedMembershipProvider"; + } + if (string.IsNullOrEmpty(config["description"])) + { + config.Remove("description"); + config.Add("description", string.Format("MySql Default {0} Description", name)); + } + + base.Initialize(name, config); + + var appName = GetConfigValue(config["applicationName"], HostingEnvironment.SiteName); + _maxPwdAttempts = Int32.Parse(GetConfigValue(config["maxInvalidPasswordAttempts"], "5"), CultureInfo.InvariantCulture); + _pwdAttemptWindow = Int32.Parse(GetConfigValue(config["passwordAttemptWindow"], "10"), CultureInfo.InvariantCulture); + _minReqNonAlphanumericalChars = Int32.Parse(GetConfigValue(config["minRequiredNonalphanumericCharacters"], "1"), CultureInfo.InvariantCulture); + _minReqPwdLength = Int32.Parse(GetConfigValue(config["minRequiredPasswordLength"], "7"), CultureInfo.InvariantCulture); + _pwdStrenghtRegex = GetConfigValue(config["passwordStrengthRegularExpression"], ""); + _enablePwdReset = bool.Parse(GetConfigValue(config["enablePasswordReset"], "True")); + _enablePwdRetrival = bool.Parse(GetConfigValue(config["enablePasswordRetrieval"], "False")); + _reqQuestionAnswer = bool.Parse(GetConfigValue(config["requiresQuestionAndAnswer"], "False")); + _reqUniqueEmail = bool.Parse(GetConfigValue(config["requiresUniqueEmail"], "True")); + + var pwdFormat = !string.IsNullOrEmpty(config["passwordFormat"]) ? config["passwordFormat"].ToString().ToLowerInvariant() : "hashed"; + + switch (pwdFormat) + { + case "hashed": + _pwdFormat = MembershipPasswordFormat.Hashed; + break; + case "encrypted": + _pwdFormat = MembershipPasswordFormat.Encrypted; + break; + case "clear": + _pwdFormat = MembershipPasswordFormat.Clear; + break; + default: + throw new ProviderException(Resources.PasswordFormatNotSupported); + } + + if (_pwdFormat == MembershipPasswordFormat.Hashed) + { + if (_enablePwdRetrival) + throw new ProviderException(Resources.CannotRetrieveHashedPasswords); + } + + _app = new Application(appName, base.Description); + _connString = ConfigUtility.GetConnectionString(config); + if (string.IsNullOrEmpty(_connString)) return; + + UserTableName = GetConfigValue(config["userTableName"], ""); + UserIdColumn = GetConfigValue(config["userIdColumn"], ""); + UserNameColumn = GetConfigValue(config["userNameColumn"], ""); + _autoGenerateTables = bool.Parse(GetConfigValue(config["autoGenerateTables"], "True")); + if (_autoGenerateTables) + CreateTables(); + else + ValidateUserTable(); + + Initialized = true; + } + + public override bool ChangePassword(string username, string oldPassword, string newPassword) + { + if (!Initialized) + { + _prevProvider.ChangePassword(username, oldPassword, newPassword); + } + + if (string.IsNullOrEmpty(username)) + NullArgumentException("username"); + if (string.IsNullOrEmpty(oldPassword)) + NullArgumentException("oldPassword"); + if (string.IsNullOrEmpty(newPassword)) + NullArgumentException("newPassword"); + + int userid = GetUserId(username); + if (userid <= 0) + { + return false; + } + if (VerifyPassword(userid, oldPassword, GetHashedUserPassword(userid))) + { + return UpdatePassword(userid, newPassword) > 0; + } + + return false; + } + + public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer) + { + IsValidOperation(false); + return _prevProvider.ChangePasswordQuestionAndAnswer(username, password, newPasswordQuestion, newPasswordAnswer); + } + + public override bool ConfirmAccount(string accountConfirmationToken) + { + IsValidOperation(true); + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + var token = dbConn.ExecuteQuerySingleRecord(string.Format("select userid, confirmationtoken from {0} where confirmationtoken=?", _membershipTable), accountConfirmationToken); + if (token == null || (token != null && string.IsNullOrEmpty(token[1].ToString()))) + { + return false; + } + return dbConn.ExecuteNonQuery(string.Format("update {0} set isconfirmed=1 where userid=?;", _membershipTable), (int)token[0]) > 0; + } + } + + public override bool ConfirmAccount(string userName, string accountConfirmationToken) + { + var userid = GetUserId(userName); + if (userid <= 0) + return false; + + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + var token = dbConn.ExecuteQuerySingleRecord(string.Format("select userid, confirmationtoken from {0} where confirmationtoken=? and userid=?", _membershipTable), accountConfirmationToken, userid); + if (token == null || (token != null && string.IsNullOrEmpty(token[1].ToString()))) + { + return false; + } + return dbConn.ExecuteNonQuery(string.Format("update {0} set isconfirmed=1 where userid=?;", _membershipTable), userid) > 0; + } + } + + public override string CreateAccount(string userName, string password, bool requireConfirmationToken) + { + IsValidOperation(true); + if (string.IsNullOrEmpty(userName)) + NullArgumentException(userName); + if (string.IsNullOrEmpty(password)) + NullArgumentException(password); + var hashedPass = HashPassword(password); + if (hashedPass.Length > 128) + throw new ArgumentException(Resources.PasswordExceedsMaxLength, password); + + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + var userid = GetUserId(userName); + if (userid <= 0) + { + throw new InvalidOperationException(string.Format(Resources.UserNotFound, UserTableName)); + } + if (dbConn.ExecuteQuerySingleRecord(string.Format("select userid from {0} where userid=?;", _membershipTable), userid) != null) + { + throw new InvalidOperationException(string.Format(Resources.UserAlreadyExists, userName)); + } + object token = DBNull.Value; + if (requireConfirmationToken) + token = GenerateToken(); + + string insertQuery = string.Format("insert into {0} (userid, createdate, confirmationtoken, isconfirmed, password, passwordchangeddate, passwordsalt) values(?,now(),?,?,?,now(),?)", _membershipTable); + if (dbConn.ExecuteNonQuery(insertQuery, userid, token, !requireConfirmationToken, hashedPass, string.Empty) <= 0) + { + throw new MembershipCreateUserException(MembershipCreateStatus.ProviderError); + } + return token == DBNull.Value ? null : token.ToString(); + } + } + + public override void CreateOrUpdateOAuthAccount(string provider, string providerUserId, string userName) + { + IsValidOperation(true); + if (string.IsNullOrEmpty(userName)) + NullArgumentException(userName); + var userid = GetUserId(userName); + if (userid <= 0) + { + throw new InvalidOperationException(string.Format(Resources.UserNotFound, UserTableName)); + } + var oauthUserId = GetUserIdFromOAuth(provider, providerUserId); + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + if (oauthUserId == 0) + { + if (dbConn.ExecuteNonQuery(string.Format("insert into {0} (provider, provideruserid, userid) values(?,?,?)", _oauthMembershipTable), provider, providerUserId, userid) <= 0) + { + throw new MembershipCreateUserException(MembershipCreateStatus.ProviderError); + } + } + else + { + if (dbConn.ExecuteNonQuery(string.Format("update {0} set userid=? where upper(provider) = ? and upper(provideruserid)=?;", _oauthMembershipTable), userid, provider.ToUpper(), providerUserId.ToUpper()) <= 0) + { + throw new MembershipCreateUserException(MembershipCreateStatus.ProviderError); + } + } + } + } + + public override MembershipUser CreateUser(string username, string password, string email, string passwordQuestion, string passwordAnswer, bool isApproved, object providerUserKey, out MembershipCreateStatus status) + { + IsValidOperation(false); + return _prevProvider.CreateUser(username, password, email, passwordQuestion, passwordAnswer, isApproved, providerUserKey, out status); + } + + public override string CreateUserAndAccount(string userName, string password, bool requireConfirmation, IDictionary values) + { + IsValidOperation(true); + CreateUserInUserTable(userName, values); + return CreateAccount(userName, password, requireConfirmation); + } + + public override bool DeleteAccount(string userName) + { + IsValidOperation(true); + int userid = GetUserId(userName); + if (userid < 0) + { + return false; + } + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + return (dbConn.ExecuteNonQuery(string.Format("delete from {0} where userid=?;", _membershipTable), userid) > 0); + } + } + + public override void DeleteOAuthAccount(string provider, string providerUserId) + { + IsValidOperation(true); + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + if (dbConn.ExecuteNonQuery(string.Format("delete from {0} where upper(provider) = ? and upper(provideruserid)=?;", _oauthMembershipTable), provider.ToUpper(), providerUserId.ToUpper()) <= 0) + { + throw new Exception(string.Format(Resources.DeleteOAuthAccountFailed, provider, providerUserId)); + } + } + } + + public override void DeleteOAuthToken(string token) + { + IsValidOperation(true); + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + dbConn.ExecuteNonQuery(string.Format("delete from {0} where token=?", _oauthTokenTable), token); + } + } + + public override bool DeleteUser(string username, bool deleteAllRelatedData) + { + if (!Initialized) + return _prevProvider.DeleteUser(username, deleteAllRelatedData); + + int userid = GetUserId(username); + if (userid < 0) + return false; + + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + if (deleteAllRelatedData) + { + return dbConn.ExecuteInTransaction( + new List>() + { + new Tuple(string.Format("delete from {0} where {1}=?;", UserTableName, UserIdColumn), new object [] { userid }), + new Tuple(string.Format("delete from {0} where userid=?;", _oauthMembershipTable), new object [] { userid }), + new Tuple(string.Format("delete from {0} where userid=?;", _membershipTable), new object [] { userid }), + new Tuple(string.Format("delete from {0} where userid=?;", _userInRolesTable), new object [] { userid }) + }); + } + else + { + return (dbConn.ExecuteNonQuery(string.Format("delete from {0} where {1}=?;", UserTableName, UserIdColumn), userid) > 0); + } + } + } + + public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords) + { + IsValidOperation(false); + return _prevProvider.FindUsersByEmail(emailToMatch, pageIndex, pageSize, out totalRecords); + } + + public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords) + { + IsValidOperation(false); + return _prevProvider.FindUsersByName(usernameToMatch, pageIndex, pageSize, out totalRecords); + } + + public override string GeneratePasswordResetToken(string userName, int tokenExpirationInMinutesFromNow) + { + IsValidOperation(true); + if (string.IsNullOrEmpty(userName)) + NullArgumentException("username"); + int userid = GetUserId(userName); + if (userid <= 0) + InvalidUserException(userName); + + if (UserConfirmed(userid)) + { + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + string token = dbConn.ExecuteScalar(string.Format("select PasswordVerificationToken from {0} where userid=? and PasswordVerificationTokenExpirationDate > ?;", _membershipTable), userid, DateTime.Now) as string; + if (token != null) + { + token = GenerateToken(); + if (dbConn.ExecuteNonQuery(string.Format("update {0} set PasswordVerificationToken=?, PasswordVerificationTokenExpirationDate=? where userid=?;", _membershipTable), token, DateTime.Now.AddMinutes(tokenExpirationInMinutesFromNow), userid) <= 0) + { + throw new ProviderException(Resources.GeneratePassVerificationTokenFailed); + } + } + return token; + } + } + return null; + } + + public override ICollection GetAccountsForUser(string userName) + { + IsValidOperation(true); + int userid = GetUserId(userName); + if (userid > 0) + { + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + var records = dbConn.ExecuteQuery(string.Format("select provider, provideruserid from {0} where userid=?", _oauthMembershipTable), userid); + if (records != null && records.Count() > 0) + { + var accounts = new List(); + records.ToList().ForEach(record => accounts.Add(new OAuthAccountData(record["provider"].ToString(), record["provideruserid"].ToString()))); + return accounts; + } + } + } + return new OAuthAccountData[0]; + } + + public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords) + { + IsValidOperation(false); + return _prevProvider.GetAllUsers(pageIndex, pageSize, out totalRecords); + } + + public override DateTime GetCreateDate(string userName) + { + int userid = GetUserId(userName); + if (userid < 0) + InvalidUserException(userName); + + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + var createDate = dbConn.ExecuteScalar(string.Format("select CreateDate from {0} where userid=?;", _membershipTable), userid); + if (createDate != null && createDate != DBNull.Value) + return (DateTime)createDate; + + return DateTime.MinValue; + } + } + + public override DateTime GetLastPasswordFailureDate(string userName) + { + int userid = GetUserId(userName); + if (userid < 0) + InvalidUserException(userName); + + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + var failureDate = dbConn.ExecuteScalar(string.Format("select LastPasswordFailureDate from {0} where userid=?;", _membershipTable), userid); + if (failureDate != null && failureDate != DBNull.Value) + return (DateTime)failureDate; + + return DateTime.MinValue; + } + } + + public override int GetNumberOfUsersOnline() + { + IsValidOperation(false); + return _prevProvider.GetNumberOfUsersOnline(); + } + + public override string GetPassword(string username, string answer) + { + IsValidOperation(false); + return _prevProvider.GetPassword(username, answer); + } + + public override DateTime GetPasswordChangedDate(string userName) + { + int userid = GetUserId(userName); + if (userid < 0) + InvalidUserException(userName); + + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + var changedDate = dbConn.ExecuteScalar(string.Format("select PasswordChangedDate from {0} where userid=?;", _membershipTable), userid); + if (changedDate != null) + return (DateTime)changedDate; + + return DateTime.MinValue; + } + } + + public override int GetPasswordFailuresSinceLastSuccess(string userName) + { + int userid = GetUserId(userName); + if (userid < 0) + InvalidUserException(userName); + + return GetPasswordFailuresSinceLastSuccess(userid); + } + + private int GetPasswordFailuresSinceLastSuccess(int userId) + { + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + var failures = dbConn.ExecuteScalar(string.Format("select PasswordFailuresSinceLastSuccess from {0} where userid=?;", _membershipTable), userId); + if (failures != null) + return (int)failures; + + return -1; + } + } + + public override MembershipUser GetUser(object providerUserKey, bool userIsOnline) + { + IsValidOperation(false); + return _prevProvider.GetUser(providerUserKey, userIsOnline); + } + + public override MembershipUser GetUser(string username, bool userIsOnline) + { + if (!Initialized) + return _prevProvider.GetUser(username, userIsOnline); + + int userid = GetUserId(username); + if (userid < 0) + { + return null; + } + return new MembershipUser(Membership.Provider.Name, username, userid, null, null, null, true, false, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue, DateTime.MinValue); + } + + /// + /// Gets the id of the specified user. + /// + /// The name of the user. + /// An integer representing the id of the user. + public int GetUserId(string userName) + { + return GetUserId(userName, GetConnectionString(), UserTableName, UserIdColumn, UserNameColumn); + } + + internal static int GetUserId(string userName, string connectionString, string userTableName, string userIdColumn, string userNameColumn) + { + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(connectionString)) + { + var user = dbConn.ExecuteQuerySingleRecord(string.Format("select {0} from {1} where {2} = ?;", userIdColumn, userTableName, userNameColumn), userName); + if (user != null) + return (int)user[userIdColumn]; + + return 0; + } + } + + public override int GetUserIdFromOAuth(string provider, string providerUserId) + { + IsValidOperation(true); + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + var user = dbConn.ExecuteQuerySingleRecord(string.Format("select userid from {0} where upper(provider) = ? and upper(provideruserid)=?;", _oauthMembershipTable), provider.ToUpper(), providerUserId.ToUpper()); + if (user != null) + return (int)user["userid"]; + + return 0; + } + } + + public override int GetUserIdFromPasswordResetToken(string token) + { + IsValidOperation(true); + return GetUserIdFromPasswordResetToken(token, false); + } + + public override string GetOAuthTokenSecret(string token) + { + IsValidOperation(true); + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + return dbConn.ExecuteScalar(string.Format("select secret from {0} where token=?;", _oauthTokenTable), token) as string; + } + } + + private int GetUserIdFromPasswordResetToken(string token, bool checkExpirationDate = false) + { + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + var user = dbConn.ExecuteQuerySingleRecord(string.Format("select userid from {0} where PasswordVerificationToken = ? {1};", _membershipTable, (checkExpirationDate ? "and PasswordVerificationTokenExpirationDate > now()" : "")), token); + if (user != null) + return (int)user["userid"]; + + return 0; + } + } + + public override string GetUserNameByEmail(string email) + { + IsValidOperation(false); + return _prevProvider.GetUserNameByEmail(email); + } + + public override string GetUserNameFromId(int userId) + { + IsValidOperation(true); + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + return dbConn.ExecuteScalar(string.Format("select {0} from {1} where {2}=?;", UserNameColumn, UserTableName, UserIdColumn), userId) as string; + } + } + + public override bool HasLocalAccount(int userId) + { + IsValidOperation(true); + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + return (dbConn.ExecuteQuery(string.Format("select userid from {0} where userid=?;", _membershipTable), userId).Count() > 0); + } + } + + public override bool IsConfirmed(string userName) + { + IsValidOperation(true); + if (string.IsNullOrEmpty(userName)) + NullArgumentException("username"); + int userid = GetUserId(userName); + if (userid <= 0) + InvalidUserException(userName); + return UserConfirmed(userid); + } + + public override void ReplaceOAuthRequestTokenWithAccessToken(string requestToken, string accessToken, string accessTokenSecret) + { + IsValidOperation(true); + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + dbConn.ExecuteNonQuery(string.Format("delete from {0} where token=?", _oauthTokenTable), requestToken); + } + StoreOAuthRequestToken(accessToken, accessTokenSecret); + } + + public override string ResetPassword(string username, string answer) + { + IsValidOperation(false); + return _prevProvider.ResetPassword(username, answer); + } + + public override bool ResetPasswordWithToken(string token, string newPassword) + { + IsValidOperation(true); + if (string.IsNullOrEmpty(token)) + { + NullArgumentException("token"); + } + if (string.IsNullOrEmpty(newPassword)) + { + NullArgumentException("newPasword"); + } + int userid = GetUserIdFromPasswordResetToken(token, true); + if (userid <= 0) + { + return false; + } + bool passUpdated = UpdatePassword(userid, newPassword) > 0; + if (passUpdated) + { + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + if (dbConn.ExecuteNonQuery(string.Format("update {0} set PasswordVerificationToken=null, PasswordVerificationTokenExpirationDate=null where userid=?;", _membershipTable), userid) <= 0) + { + throw new ProviderException(string.Format(Resources.ClearPassTokenFailed, userid, _membershipTable)); + } + } + } + return passUpdated; + } + + public override void StoreOAuthRequestToken(string requestToken, string requestTokenSecret) + { + IsValidOperation(true); + string secret = GetOAuthTokenSecret(requestToken); + if (secret != null) + { + if (secret.Equals(requestTokenSecret, StringComparison.OrdinalIgnoreCase)) + return; + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + if (dbConn.ExecuteNonQuery(string.Format("update {0} set secret=? where token=?;", _oauthTokenTable), requestTokenSecret, requestToken) <= 0) + throw new ProviderException(string.Format(Resources.UpdateTokenFailed, requestTokenSecret)); + } + } + else + { + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + if (dbConn.ExecuteNonQuery(string.Format("insert into {0} (token, secret) values (?,?);", _oauthTokenTable), requestTokenSecret, requestToken) <= 0) + throw new ProviderException(string.Format(Resources.SaveTokenFailed, requestTokenSecret)); + } + } + } + + public override bool UnlockUser(string userName) + { + IsValidOperation(false); + return _prevProvider.UnlockUser(userName); + } + + public override void UpdateUser(MembershipUser user) + { + IsValidOperation(false); + _prevProvider.UpdateUser(user); + } + + public override bool ValidateUser(string username, string password) + { + if (!Initialized) + return _prevProvider.ValidateUser(username, password); + if (string.IsNullOrEmpty(username)) + NullArgumentException("userName"); + if (string.IsNullOrEmpty(password)) + NullArgumentException("password"); + int userid = GetUserId(username); + if (userid > 0) + { + if (!UserConfirmed(userid)) + return false; + else + return VerifyPassword(userid, password, GetHashedUserPassword(userid)); + } + return false; + } + + #region Properties + public override string ApplicationName + { + get + { + if (Initialized) + throw new NotSupportedException(); + else + return _prevProvider.ApplicationName; + } + set + { + if (Initialized) + throw new NotSupportedException(); + else + _prevProvider.ApplicationName = value; + } + } + + /// + /// Gets or sets the connection string. + /// + public string ConnectionString + { get; set; } + + /// + /// Gets or sets the name associated to the connection string when stored in the configuration manager. + /// + public string ConnectionStringName + { get; set; } + + public override bool EnablePasswordReset + { + get + { + return Initialized ? false : _prevProvider.EnablePasswordReset; + } + } + + public override bool EnablePasswordRetrieval + { + get + { + return Initialized ? false : _prevProvider.EnablePasswordRetrieval; + } + } + + public override int MaxInvalidPasswordAttempts + { + get + { + return Initialized ? Int32.MaxValue : _prevProvider.MaxInvalidPasswordAttempts; + } + } + + public override int MinRequiredPasswordLength + { + get + { + return Initialized ? 7 : _prevProvider.MinRequiredPasswordLength; + } + } + + public override int MinRequiredNonAlphanumericCharacters + { + get + { + return Initialized ? 1 : _prevProvider.MinRequiredNonAlphanumericCharacters; + } + } + + public override int PasswordAttemptWindow + { + get + { + return Initialized ? Int32.MaxValue : _prevProvider.PasswordAttemptWindow; + } + } + + public override MembershipPasswordFormat PasswordFormat + { + get + { + return Initialized ? MembershipPasswordFormat.Hashed : _prevProvider.PasswordFormat; + } + } + + public override string PasswordStrengthRegularExpression + { + get + { + return Initialized ? string.Empty : _prevProvider.PasswordStrengthRegularExpression; + } + } + + /// + /// Gets or sets the name of this provider. + /// + public string ProviderName + { get; set; } + + public override bool RequiresQuestionAndAnswer + { + get + { + return Initialized ? false : _prevProvider.RequiresQuestionAndAnswer; + } + } + + public override bool RequiresUniqueEmail + { + get + { + return Initialized ? false : _prevProvider.RequiresUniqueEmail; + } + } + + /// + /// Gets the name of the table storing user information. + /// + public string UserTableName + { + get + { + if (string.IsNullOrEmpty(_userTableName)) + throw new InvalidOperationException(Resources.UserTableNameNotInitilized); + + return _userTableName; + } + internal set + { + _userTableName = value; + } + } + + /// + /// Gets the name of the column storing the user ids. + /// + public string UserIdColumn + { + get + { + if (string.IsNullOrEmpty(_userIdColumn)) + throw new InvalidOperationException(Resources.UserIdColumnNotInitialized); + + return _userIdColumn; + } + internal set + { + _userIdColumn = value; + } + } + + /// + /// Gets the name of the column storing the user names. + /// + public string UserNameColumn + { + get + { + if (string.IsNullOrEmpty(_userNameColumn)) + throw new InvalidOperationException(Resources.UserNameColumnNotInitialized); + + return _userNameColumn; + } + internal set + { + _userNameColumn = value; + } + } + + #endregion + + #region Private_Internal + + internal void CreateTables() + { + string connString = GetConnectionString(); + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(connString)) + { + if (!VerifyIfTableExists(connString, UserTableName)) + { + dbConn.ExecuteNonQuery(string.Format("create table {0} ({1} int not null primary key auto_increment, {2} varchar(250) not null unique);", UserTableName, UserIdColumn, UserNameColumn)); + } + + //create schema + string schema = SchemaManager.GetSchema(11); + dbConn.ExecuteNonQuery(schema); + } + } + + internal void ValidateUserTable() + { + if (!VerifyIfTableExists(GetConnectionString(), UserTableName)) + { + throw new InvalidOperationException(string.Format(Resources.UserTableNotFound, UserTableName)); + } + } + + internal bool Initialized + { + get; + set; + } + + private string GetConnectionString() + { + if (!string.IsNullOrEmpty(ConnectionString)) + return ConnectionString; + else + { + ConnectionStringSettings connString = ConfigurationManager.ConnectionStrings[ConnectionStringName]; + if (connString != null) + return connString.ConnectionString; + } + + if (!string.IsNullOrEmpty(_connString)) + return _connString; + throw new InvalidOperationException(Resources.NoConnString); + } + + internal static bool VerifyIfTableExists(string connectionString, string tableName) + { + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(connectionString)) + { + var tables = dbConn.ExecuteQuery("show tables;"); + return tables.Where(record => record[0].ToString().Equals(tableName, StringComparison.OrdinalIgnoreCase)).Count() > 0; + } + } + + internal string GetHashedUserPassword(int userId) + { + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + var userPassword = dbConn.ExecuteQuerySingleRecord(string.Format("select password from {0} where userid=?;", _membershipTable), userId); + if (userPassword != null) + return userPassword[0].ToString(); + return null; + } + } + + internal string HashPassword(string password) + { + if (string.IsNullOrEmpty(password)) + { + throw new ArgumentException(Resources.InvalidArgument, password); + } + + Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(password, 16, 1000); + byte[] salt = rfc2898.Salt; + byte[] passBytes = rfc2898.GetBytes(32); + byte[] result = new byte[48]; + Buffer.BlockCopy(salt, 0, result, 0, 16); + Buffer.BlockCopy(passBytes, 0, result, 16, 32); + return Convert.ToBase64String(result); + } + + internal bool VerifyPassword(int userid, string password, string hashedPassword) + { + if (string.IsNullOrEmpty(password)) + { + throw new ArgumentException(Resources.InvalidArgument, password); + } + if (string.IsNullOrEmpty(hashedPassword)) + { + throw new ArgumentException(Resources.InvalidArgument, hashedPassword); + } + byte[] hashed = Convert.FromBase64String(hashedPassword); + if (hashed.Length != 48) + { + return false; + } + byte[] salt = new byte[16]; + byte[] passBytes = new byte[32]; + Buffer.BlockCopy(hashed, 0, salt, 0, 16); + Buffer.BlockCopy(hashed, 16, passBytes, 0, 32); + + Rfc2898DeriveBytes rfc2898 = new Rfc2898DeriveBytes(password, salt, 1000); + bool validation = CompareBuffer(rfc2898.GetBytes(32), passBytes); + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + if (validation) + { + dbConn.ExecuteNonQuery(string.Format("update {0} set PasswordFailuresSinceLastSuccess=0 where userid=?;", _membershipTable), userid); + } + else + { + int failures = GetPasswordFailuresSinceLastSuccess(userid); + dbConn.ExecuteNonQuery(string.Format("update {0} set PasswordFailuresSinceLastSuccess=?, LastPasswordFailureDate=now() where userid=?;", _membershipTable), (failures == -1 ? 1 : failures + 1), userid); + } + } + return validation; + } + + internal bool CompareBuffer(byte[] source, byte[] target) + { + if (source == null || target == null || (source.Length != target.Length)) + return false; + for (int ctr = 0; ctr < target.Length; ctr++) + { + if (target[ctr] != source[ctr]) + return false; + } + + return true; + } + + private int UpdatePassword(int userId, string newPassword) + { + string hashedPass = HashPassword(newPassword); + if (hashedPass.Length > 128) + throw new ArgumentException(Resources.PasswordExceedsMaxLength, newPassword); + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + return dbConn.ExecuteNonQuery(string.Format("update {0} set password=?, PasswordChangedDate=now(), PasswordSalt='' where userid=?;", _membershipTable), hashedPass, userId); + } + } + + internal void IsValidOperation(bool currentProvider) + { + switch (currentProvider) + { + case true: + if (!Initialized) + ProviderException(); + break; + case false: + if (Initialized) + PreviousProviderException(); + break; + } + } + + private void ProviderException() + { + throw new Exception(Resources.SimpleMembershipNotInitialized); + } + + private void PreviousProviderException() + { + throw new NotSupportedException(Resources.PreviousProviderException); + } + + private void InvalidUserException(string userName) + { + throw new Exception(string.Format(Resources.InvalidUser, userName, UserTableName)); + } + + internal static void NullArgumentException(string parameterName) + { + throw new ArgumentException(Resources.InvalidArgument, parameterName); + } + + private string GenerateToken() + { + RNGCryptoServiceProvider provider = new RNGCryptoServiceProvider(); + byte[] data = new byte[16]; + provider.GetBytes(data); + return HttpServerUtility.UrlTokenEncode(data); + } + + private void CreateUserInUserTable(string userName, IDictionary values) + { + IsValidOperation(true); + var userid = GetUserId(userName); + if (userid > 0) + { + throw new MembershipCreateUserException(MembershipCreateStatus.DuplicateUserName); + } + StringBuilder columns = new StringBuilder(); + columns.Append(UserNameColumn); + StringBuilder args = new StringBuilder(); + args.Append("?"); + var argsValues = new List(); + argsValues.Add(userName); + + if (values != null) + { + foreach (var value in values) + { + if (string.Equals(UserNameColumn, value.Key, StringComparison.OrdinalIgnoreCase)) + continue; + columns.Append(string.Format(",{0}", value.Key)); + args.Append(",?"); + argsValues.Add(value.Value != null ? value.Value : DBNull.Value); + } + } + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + string query = string.Format("insert into {0} ({1}) values({2})", UserTableName, columns.ToString(), args.ToString()); + if (dbConn.ExecuteNonQuery(query, argsValues.ToArray()) < 1) + { + throw new MembershipCreateUserException(MembershipCreateStatus.ProviderError); + } + } + } + + private bool UserConfirmed(int userId) + { + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) + { + return ((long)dbConn.ExecuteScalar(string.Format("select count(*) from {0} where userid=? and isconfirmed=1;", _membershipTable), userId)) > 0; + } + } + #endregion + } +} diff --git a/Source/MySql.Web/SimpleRoleProvider.cs b/MySql.Web/src/SimpleRoleProvider.cs similarity index 81% rename from Source/MySql.Web/SimpleRoleProvider.cs rename to MySql.Web/src/SimpleRoleProvider.cs index e94825ba6..f75e7f193 100644 --- a/Source/MySql.Web/SimpleRoleProvider.cs +++ b/MySql.Web/src/SimpleRoleProvider.cs @@ -1,518 +1,534 @@ -// Copyright © 2014, 2015 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySql.Web.Common; -using MySql.Web.General; -using MySql.Web.Properties; -using System; -using System.Collections.Generic; -using System.Configuration; -using System.Configuration.Provider; -using System.Linq; -using System.Resources; -using System.Text; -using System.Threading.Tasks; -using System.Web.Hosting; -using System.Web.Security; -using WebMatrix.WebData; - -namespace MySql.Web.Security -{ - public class MySqlSimpleRoleProvider : SimpleRoleProvider - { - #region Private - private readonly RoleProvider _prevProvider; - - Application _app; - bool _enablePwdReset; - bool _enablePwdRetrival; - int _maxPwdAttempts; - int _minReqNonAlphanumericalChars; - int _minReqPwdLength; - int _pwdAttemptWindow; - MembershipPasswordFormat _pwdFormat; - string _pwdStrenghtRegex; - bool _reqQuestionAnswer; - bool _reqUniqueEmail; - string _connString; - string _userTableName; - string _userIdColumn; - string _userNameColumn; - bool _autoGenerateTables; - private readonly string _rolesTable = "webpages_Roles"; - private readonly string _userInRolesTable = "webpages_UsersInRoles"; - private static string GetConfigValue(string configVal, string defaultVal) - { - return !string.IsNullOrEmpty(configVal) ? configVal : defaultVal; - } - - private void NotInitializedException() - { - throw new Exception(Resources.SimpleMembershipNotInitialized); - } - - #endregion - public MySqlSimpleRoleProvider() - : this(null) - { } - - public MySqlSimpleRoleProvider(RoleProvider previousProvider) - { - _prevProvider = previousProvider; - } - - public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) - { - if (config == null) - { - throw new ArgumentNullException("config"); - } - if (string.IsNullOrEmpty(name)) - { - name = "MySqlExtendedMembershipProvider"; - } - if (string.IsNullOrEmpty(config["description"])) - { - config.Remove("description"); - config.Add("description", string.Format("MySql Default {0} Description", name)); - } - - base.Initialize(name, config); - - var appName = GetConfigValue(config["applicationName"], HostingEnvironment.SiteName); - _maxPwdAttempts = Int32.Parse(GetConfigValue(config["maxInvalidPasswordAttempts"], "5")); - _pwdAttemptWindow = Int32.Parse(GetConfigValue(config["passwordAttemptWindow"], "10")); - _minReqNonAlphanumericalChars = Int32.Parse(GetConfigValue(config["minRequiredNonalphanumericCharacters"], "1")); - _minReqPwdLength = Int32.Parse(GetConfigValue(config["minRequiredPasswordLength"], "7")); - _pwdStrenghtRegex = GetConfigValue(config["passwordStrengthRegularExpression"], ""); - _enablePwdReset = bool.Parse(GetConfigValue(config["enablePasswordReset"], "True")); - _enablePwdRetrival = bool.Parse(GetConfigValue(config["enablePasswordRetrieval"], "False")); - _reqQuestionAnswer = bool.Parse(GetConfigValue(config["requiresQuestionAndAnswer"], "False")); - _reqUniqueEmail = bool.Parse(GetConfigValue(config["requiresUniqueEmail"], "True")); - - var pwdFormat = !string.IsNullOrEmpty(config["passwordFormat"]) ? config["passwordFormat"].ToString().ToLowerInvariant() : "hashed"; - - switch (pwdFormat) - { - case "hashed": - _pwdFormat = MembershipPasswordFormat.Hashed; - break; - case "encrypted": - _pwdFormat = MembershipPasswordFormat.Encrypted; - break; - case "clear": - _pwdFormat = MembershipPasswordFormat.Clear; - break; - default: - throw new ProviderException(Resources.PasswordFormatNotSupported); - } - - if (_pwdFormat == MembershipPasswordFormat.Hashed) - { - if (_enablePwdRetrival) - throw new ProviderException(Resources.CannotRetrieveHashedPasswords); - } - - _app = new Application(appName, base.Description); - ConnectionStringSettings connStrSettings = ConfigurationManager.ConnectionStrings[config["connectionStringName"]]; - _connString = connStrSettings != null ? connStrSettings.ConnectionString.Trim() : ""; - if (string.IsNullOrEmpty(_connString)) return; - - UserTableName = GetConfigValue(config["userTableName"], ""); - UserIdColumn = GetConfigValue(config["userIdColumn"], ""); - UserNameColumn = GetConfigValue(config["userNameColumn"], ""); - _autoGenerateTables = bool.Parse(GetConfigValue(config["autoGenerateTables"], "True")); - if (_autoGenerateTables) - CreateTables(); - - Initialized = true; - } - - public override void AddUsersToRoles(string[] usernames, string[] roleNames) - { - if (!Initialized) - { - _prevProvider.AddUsersToRoles(usernames, roleNames); - } - else - { - if (usernames.Where(username => string.IsNullOrEmpty(username)).Count() > 0 || usernames.Where(username => string.IsNullOrEmpty(username)).Count() > 0) - throw new ArgumentException(Resources.InvalidArrayValue); - - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - foreach (var userid in GetUsersId(usernames)) - { - foreach (var roleid in GetRolesId(roleNames)) - { - if (userid > 0 && roleid > 0) - { - dbConn.ExecuteNonQuery(string.Format("insert into {0} (userid, roleid) values(?,?);", _userInRolesTable), userid, roleid); - } - } - } - } - } - } - - public override void CreateRole(string roleName) - { - if (!Initialized) - { - _prevProvider.CreateRole(roleName); - } - else - { - if (string.IsNullOrEmpty(roleName)) - MySqlSimpleMembershipProvider.NullArgumentException("roleName"); - - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - int roleid = GetRoleId(roleName); - if (roleid != 0) - { - throw new InvalidOperationException(string.Format(Resources.RoleAlreadyExists, roleName)); - } - if (dbConn.ExecuteNonQuery(string.Format("insert into {0} (rolename) values(?);", _rolesTable), roleName) <= 0) - { - throw new ProviderException(string.Format(Resources.CreateRoleFailed, roleName)); - } - } - } - } - - public override bool DeleteRole(string roleName, bool throwOnPopulatedRole) - { - if (!Initialized) - { - return _prevProvider.DeleteRole(roleName, throwOnPopulatedRole); - } - if (string.IsNullOrEmpty(roleName)) - MySqlSimpleMembershipProvider.NullArgumentException("roleName"); - - int roleid = GetRoleId(roleName); - if (roleid <= 0) - { - return false; - } - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - if (throwOnPopulatedRole) - { - if (IsRoleInUse(roleid)) - throw new InvalidOperationException(string.Format(Resources.RoleInUse, roleName)); - } - else - { - dbConn.ExecuteNonQuery(string.Format("delete from {0} where roleid=?;", _userInRolesTable), roleid); - } - return dbConn.ExecuteNonQuery(string.Format("delete from {0} where roleid=?;", _rolesTable), roleid) > 0; - } - } - - public override string[] FindUsersInRole(string roleName, string usernameToMatch) - { - if (!Initialized) - { - return _prevProvider.FindUsersInRole(roleName, usernameToMatch); - } - if (string.IsNullOrEmpty(roleName)) - MySqlSimpleMembershipProvider.NullArgumentException("roleName"); - if (string.IsNullOrEmpty(usernameToMatch)) - return GetUsersInRole(roleName); - - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - var usersName = dbConn.ExecuteQuery(string.Format("select ut.{0} from {1} as rt join {2} as urt on rt.roleid=urt.roleid join {3} as ut on rt.userid=ut.{4} where rt.rolename=? and ut.name like '%?%'", UserNameColumn, _rolesTable, _userInRolesTable, UserTableName, UserIdColumn), roleName, usernameToMatch); - if (usersName.Count() > 0) - return usersName.Select(username => username[0].ToString()).ToArray(); - } - return null; - } - - public override string[] GetAllRoles() - { - if (!Initialized) - return _prevProvider.GetAllRoles(); - - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - var roles = dbConn.ExecuteQuery(string.Format("select rolename from {0};", _rolesTable)); - if (roles.Count() > 0) - return roles.Select(role => role[0].ToString()).ToArray(); - } - return null; - } - - public override string[] GetRolesForUser(string username) - { - if (!Initialized) - return _prevProvider.GetRolesForUser(username); - if (string.IsNullOrEmpty(username)) - MySqlSimpleMembershipProvider.NullArgumentException("username"); - - string connString = GetConnectionString(); - int userid = MySqlSimpleMembershipProvider.GetUserId(username, connString, UserTableName, UserIdColumn, UserNameColumn); - if (userid > 0) - { - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(connString)) - { - var roles = dbConn.ExecuteQuery(string.Format("select rt.rolename from {0} as urt join {1} as rt on urt.roleid = rt.roleid where urt.userid=?;", _userInRolesTable, _rolesTable), userid); - if (roles.Count() > 0) - return roles.Select(role => role[0].ToString()).ToArray(); - } - } - return null; - } - - public override string[] GetUsersInRole(string roleName) - { - if (!Initialized) - return _prevProvider.GetUsersInRole(roleName); - if (string.IsNullOrEmpty(roleName)) - MySqlSimpleMembershipProvider.NullArgumentException("roleName"); - - int roleid = GetRoleId(roleName); - if (roleid > 0) - { - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - var users = dbConn.ExecuteQuery(string.Format("select ut.{0} from {1} as urt join {2} as ut on urt.userid = ut.{3} where urt.roleid=?;", UserNameColumn, _userInRolesTable, UserTableName, UserIdColumn), roleid); - if (users.Count() > 0) - return users.Select(role => role[0].ToString()).ToArray(); - } - } - return null; - } - - public override bool IsUserInRole(string username, string roleName) - { - if (!Initialized) - return _prevProvider.IsUserInRole(username, roleName); - string connString = GetConnectionString(); - if (string.IsNullOrEmpty(username)) - MySqlSimpleMembershipProvider.NullArgumentException("username"); - if (string.IsNullOrEmpty(roleName)) - MySqlSimpleMembershipProvider.NullArgumentException("roleName"); - int userid = MySqlSimpleMembershipProvider.GetUserId(username, connString, UserTableName, UserIdColumn, UserNameColumn); - int roleid = GetRoleId(roleName); - if (userid <= 0 || roleid <= 0) - return false; - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(connString)) - { - return (dbConn.ExecuteQuery(string.Format("select count(userid) from {0} where userid=? and roleid=?;", _userInRolesTable), userid, roleid)).Count() > 0; - } - } - - public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames) - { - if (!Initialized) - _prevProvider.RemoveUsersFromRoles(usernames, roleNames); - else - { - if (usernames.Where(username => string.IsNullOrEmpty(username)).Count() > 0 || usernames.Where(username => string.IsNullOrEmpty(username)).Count() > 0) - throw new ArgumentException(Resources.InvalidArrayValue); - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - foreach (var userid in GetUsersId(usernames)) - { - foreach (var roleid in GetRolesId(roleNames)) - { - if (userid > 0 && roleid > 0) - { - dbConn.ExecuteNonQuery(string.Format("delete from {0} where userid=? and roleid=?;", _userInRolesTable), userid, roleid); - } - } - } - } - } - } - - public override bool RoleExists(string roleName) - { - if (!Initialized) - return _prevProvider.RoleExists(roleName); - return (GetRoleId(roleName) > 0); - } - - #region Properties - - public override string ApplicationName - { - get - { - if (Initialized) - { - throw new NotSupportedException(); - } - else - { - return _prevProvider.ApplicationName; - } - } - set - { - if (Initialized) - { - throw new NotSupportedException(); - } - else - { - _prevProvider.ApplicationName = value; - } - } - } - - public string ConnectionString - { get; set; } - - public string ConnectionStringName - { get; set; } - - public string UserTableName - { - get - { - if (string.IsNullOrEmpty(_userTableName)) - throw new InvalidOperationException(Resources.UserTableNameNotInitilized); - - return _userTableName; - } - internal set - { - _userTableName = value; - } - } - - public string UserIdColumn - { - get - { - if (string.IsNullOrEmpty(_userIdColumn)) - throw new InvalidOperationException(Resources.UserIdColumnNotInitialized); - - return _userIdColumn; - } - internal set - { - _userIdColumn = value; - } - } - - public string UserNameColumn - { - get - { - if (string.IsNullOrEmpty(_userNameColumn)) - throw new InvalidOperationException(Resources.UserNameColumnNotInitialized); - - return _userNameColumn; - } - internal set - { - _userNameColumn = value; - } - } - - #endregion - - #region Private_Internal - internal bool Initialized - { - get; - set; - } - - internal void CreateTables() - { - var connString = GetConnectionString(); - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(connString)) - { - //create schema - ResourceManager r = new ResourceManager("MySql.Web.Properties.Resources", typeof(SchemaManager).Assembly); - string schema = r.GetString("schema11"); - dbConn.ExecuteNonQuery(schema); - } - } - - private string GetConnectionString() - { - if (!string.IsNullOrEmpty(ConnectionString)) - return ConnectionString; - else - { - ConnectionStringSettings connString = ConfigurationManager.ConnectionStrings[ConnectionStringName]; - if (connString != null) - return connString.ConnectionString; - } - - if (!string.IsNullOrEmpty(_connString)) - return _connString; - throw new InvalidOperationException(Resources.NoConnString); - } - - private IEnumerable GetUsersId(string[] usersName) - { - foreach (string userName in usersName) - { - yield return MySqlSimpleMembershipProvider.GetUserId(userName, GetConnectionString(), UserTableName, UserIdColumn, UserNameColumn); - } - } - - private IEnumerable GetRolesId(string[] roles) - { - foreach (string role in roles) - { - yield return GetRoleId(role); - } - } - - internal int GetRoleId(string role) - { - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - var roleid = dbConn.ExecuteQuerySingleRecord(string.Format("select roleid from {0} where rolename=?;", _rolesTable), role); - if (roleid != null) - return (int)role[0]; - - return 0; - } - } - - private bool UserHasRole(int userid, int roleid) - { - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - return (dbConn.ExecuteQuery(string.Format("select count(*) from {0} where userid=? and roleid=?;", _userInRolesTable), userid, roleid).Count() > 0); - } - } - - private bool IsRoleInUse(int roleid) - { - using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(GetConnectionString())) - { - return (dbConn.ExecuteQuery(string.Format("select count(*) from {0} where roleid=?;", _userInRolesTable), roleid).Count() > 0); - } - } - #endregion - } -} +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Web.Common; +using MySql.Web.General; +using MySql.Web.Properties; +using System; +using System.Collections.Generic; +using System.Configuration.Provider; +using System.Globalization; +using System.Linq; +using System.Web.Hosting; +using System.Web.Security; +using WebMatrix.WebData; + +namespace MySql.Web.Security +{ + /// + /// Manages storage of simple role membership information for an ASP.NET application in a MySQL database. + /// + public class MySqlSimpleRoleProvider : SimpleRoleProvider + { + #region Private + private readonly RoleProvider _prevProvider; + + Application _app; + bool _enablePwdReset; + bool _enablePwdRetrival; + int _maxPwdAttempts; + int _minReqNonAlphanumericalChars; + int _minReqPwdLength; + int _pwdAttemptWindow; + MembershipPasswordFormat _pwdFormat; + string _pwdStrenghtRegex; + bool _reqQuestionAnswer; + bool _reqUniqueEmail; + string _userTableName; + string _userIdColumn; + string _userNameColumn; + bool _autoGenerateTables; + private readonly string _rolesTable = "webpages_Roles"; + private readonly string _userInRolesTable = "webpages_UsersInRoles"; + private static string GetConfigValue(string configVal, string defaultVal) + { + return !string.IsNullOrEmpty(configVal) ? configVal : defaultVal; + } + + private void NotInitializedException() + { + throw new Exception(Resources.SimpleMembershipNotInitialized); + } + + #endregion + public MySqlSimpleRoleProvider() + : this(null) + { } + + public MySqlSimpleRoleProvider(RoleProvider previousProvider) + { + _prevProvider = previousProvider; + } + + public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) + { + if (config == null) + { + throw new ArgumentNullException("config"); + } + if (string.IsNullOrEmpty(name)) + { + name = "MySqlExtendedMembershipProvider"; + } + if (string.IsNullOrEmpty(config["description"])) + { + config.Remove("description"); + config.Add("description", string.Format("MySql Default {0} Description", name)); + } + + base.Initialize(name, config); + + var appName = GetConfigValue(config["applicationName"], HostingEnvironment.SiteName); + _maxPwdAttempts = Int32.Parse(GetConfigValue(config["maxInvalidPasswordAttempts"], "5"), CultureInfo.InvariantCulture); + _pwdAttemptWindow = Int32.Parse(GetConfigValue(config["passwordAttemptWindow"], "10"), CultureInfo.InvariantCulture); + _minReqNonAlphanumericalChars = Int32.Parse(GetConfigValue(config["minRequiredNonalphanumericCharacters"], "1"), CultureInfo.InvariantCulture); + _minReqPwdLength = Int32.Parse(GetConfigValue(config["minRequiredPasswordLength"], "7"), CultureInfo.InvariantCulture); + _pwdStrenghtRegex = GetConfigValue(config["passwordStrengthRegularExpression"], ""); + _enablePwdReset = bool.Parse(GetConfigValue(config["enablePasswordReset"], "True")); + _enablePwdRetrival = bool.Parse(GetConfigValue(config["enablePasswordRetrieval"], "False")); + _reqQuestionAnswer = bool.Parse(GetConfigValue(config["requiresQuestionAndAnswer"], "False")); + _reqUniqueEmail = bool.Parse(GetConfigValue(config["requiresUniqueEmail"], "True")); + + var pwdFormat = !string.IsNullOrEmpty(config["passwordFormat"]) ? config["passwordFormat"].ToString().ToLowerInvariant() : "hashed"; + + switch (pwdFormat) + { + case "hashed": + _pwdFormat = MembershipPasswordFormat.Hashed; + break; + case "encrypted": + _pwdFormat = MembershipPasswordFormat.Encrypted; + break; + case "clear": + _pwdFormat = MembershipPasswordFormat.Clear; + break; + default: + throw new ProviderException(Resources.PasswordFormatNotSupported); + } + + if (_pwdFormat == MembershipPasswordFormat.Hashed) + { + if (_enablePwdRetrival) + throw new ProviderException(Resources.CannotRetrieveHashedPasswords); + } + + _app = new Application(appName, base.Description); + ConnectionString = ConfigUtility.GetConnectionString(config); + if (string.IsNullOrEmpty(ConnectionString)) return; + + UserTableName = GetConfigValue(config["userTableName"], ""); + UserIdColumn = GetConfigValue(config["userIdColumn"], ""); + UserNameColumn = GetConfigValue(config["userNameColumn"], ""); + _autoGenerateTables = bool.Parse(GetConfigValue(config["autoGenerateTables"], "True")); + if (_autoGenerateTables) + CreateTables(); + + Initialized = true; + } + + public override void AddUsersToRoles(string[] usernames, string[] roleNames) + { + if (!Initialized) + { + _prevProvider.AddUsersToRoles(usernames, roleNames); + } + else + { + if (usernames.Where(username => string.IsNullOrEmpty(username)).Count() > 0 || usernames.Where(username => string.IsNullOrEmpty(username)).Count() > 0) + throw new ArgumentException(Resources.InvalidArrayValue); + + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(ConnectionString)) + { + foreach (var userid in GetUsersId(usernames)) + { + foreach (var roleid in GetRolesId(roleNames)) + { + if (userid > 0 && roleid > 0) + { + dbConn.ExecuteNonQuery(string.Format("insert into {0} (userid, roleid) values(?,?);", _userInRolesTable), userid, roleid); + } + } + } + } + } + } + + public override void CreateRole(string roleName) + { + if (!Initialized) + { + _prevProvider.CreateRole(roleName); + } + else + { + if (string.IsNullOrEmpty(roleName)) + MySqlSimpleMembershipProvider.NullArgumentException("roleName"); + + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(ConnectionString)) + { + int roleid = GetRoleId(roleName); + if (roleid != 0) + { + throw new InvalidOperationException(string.Format(Resources.RoleAlreadyExists, roleName)); + } + if (dbConn.ExecuteNonQuery(string.Format("insert into {0} (rolename) values(?);", _rolesTable), roleName) <= 0) + { + throw new ProviderException(string.Format(Resources.CreateRoleFailed, roleName)); + } + } + } + } + + public override bool DeleteRole(string roleName, bool throwOnPopulatedRole) + { + if (!Initialized) + { + return _prevProvider.DeleteRole(roleName, throwOnPopulatedRole); + } + if (string.IsNullOrEmpty(roleName)) + MySqlSimpleMembershipProvider.NullArgumentException("roleName"); + + int roleid = GetRoleId(roleName); + if (roleid <= 0) + { + return false; + } + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(ConnectionString)) + { + if (throwOnPopulatedRole) + { + if (IsRoleInUse(roleid)) + throw new InvalidOperationException(string.Format(Resources.RoleInUse, roleName)); + } + else + { + dbConn.ExecuteNonQuery(string.Format("delete from {0} where roleid=?;", _userInRolesTable), roleid); + } + return dbConn.ExecuteNonQuery(string.Format("delete from {0} where roleid=?;", _rolesTable), roleid) > 0; + } + } + + public override string[] FindUsersInRole(string roleName, string usernameToMatch) + { + if (!Initialized) + { + return _prevProvider.FindUsersInRole(roleName, usernameToMatch); + } + if (string.IsNullOrEmpty(roleName)) + MySqlSimpleMembershipProvider.NullArgumentException("roleName"); + if (string.IsNullOrEmpty(usernameToMatch)) + return GetUsersInRole(roleName); + + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(ConnectionString)) + { + var usersName = dbConn.ExecuteQuery(string.Format("select ut.{0} from {1} as rt join {2} as urt on rt.roleid=urt.roleid join {3} as ut on rt.userid=ut.{4} where rt.rolename=? and ut.name like '%?%'", UserNameColumn, _rolesTable, _userInRolesTable, UserTableName, UserIdColumn), roleName, usernameToMatch); + if (usersName.Count() > 0) + return usersName.Select(username => username[0].ToString()).ToArray(); + } + return null; + } + + public override string[] GetAllRoles() + { + if (!Initialized) + return _prevProvider.GetAllRoles(); + + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(ConnectionString)) + { + var roles = dbConn.ExecuteQuery(string.Format("select rolename from {0};", _rolesTable)); + if (roles.Count() > 0) + return roles.Select(role => role[0].ToString()).ToArray(); + } + return null; + } + + public override string[] GetRolesForUser(string username) + { + if (!Initialized) + return _prevProvider.GetRolesForUser(username); + if (string.IsNullOrEmpty(username)) + MySqlSimpleMembershipProvider.NullArgumentException("username"); + + string connString = ConnectionString; + int userid = MySqlSimpleMembershipProvider.GetUserId(username, connString, UserTableName, UserIdColumn, UserNameColumn); + if (userid > 0) + { + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(connString)) + { + var roles = dbConn.ExecuteQuery(string.Format("select rt.rolename from {0} as urt join {1} as rt on urt.roleid = rt.roleid where urt.userid=?;", _userInRolesTable, _rolesTable), userid); + if (roles.Count() > 0) + return roles.Select(role => role[0].ToString()).ToArray(); + } + } + return null; + } + + public override string[] GetUsersInRole(string roleName) + { + if (!Initialized) + return _prevProvider.GetUsersInRole(roleName); + if (string.IsNullOrEmpty(roleName)) + MySqlSimpleMembershipProvider.NullArgumentException("roleName"); + + int roleid = GetRoleId(roleName); + if (roleid > 0) + { + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(ConnectionString)) + { + var users = dbConn.ExecuteQuery(string.Format("select ut.{0} from {1} as urt join {2} as ut on urt.userid = ut.{3} where urt.roleid=?;", UserNameColumn, _userInRolesTable, UserTableName, UserIdColumn), roleid); + if (users.Count() > 0) + return users.Select(role => role[0].ToString()).ToArray(); + } + } + return null; + } + + public override bool IsUserInRole(string username, string roleName) + { + if (!Initialized) + return _prevProvider.IsUserInRole(username, roleName); + string connString = ConnectionString; + if (string.IsNullOrEmpty(username)) + MySqlSimpleMembershipProvider.NullArgumentException("username"); + if (string.IsNullOrEmpty(roleName)) + MySqlSimpleMembershipProvider.NullArgumentException("roleName"); + int userid = MySqlSimpleMembershipProvider.GetUserId(username, connString, UserTableName, UserIdColumn, UserNameColumn); + int roleid = GetRoleId(roleName); + if (userid <= 0 || roleid <= 0) + return false; + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(connString)) + { + return (dbConn.ExecuteQuery(string.Format("select count(userid) from {0} where userid=? and roleid=?;", _userInRolesTable), userid, roleid)).Count() > 0; + } + } + + public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames) + { + if (!Initialized) + _prevProvider.RemoveUsersFromRoles(usernames, roleNames); + else + { + if (usernames.Where(username => string.IsNullOrEmpty(username)).Count() > 0 || usernames.Where(username => string.IsNullOrEmpty(username)).Count() > 0) + throw new ArgumentException(Resources.InvalidArrayValue); + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(ConnectionString)) + { + foreach (var userid in GetUsersId(usernames)) + { + foreach (var roleid in GetRolesId(roleNames)) + { + if (userid > 0 && roleid > 0) + { + dbConn.ExecuteNonQuery(string.Format("delete from {0} where userid=? and roleid=?;", _userInRolesTable), userid, roleid); + } + } + } + } + } + } + + public override bool RoleExists(string roleName) + { + if (!Initialized) + return _prevProvider.RoleExists(roleName); + return (GetRoleId(roleName) > 0); + } + + #region Properties + + public override string ApplicationName + { + get + { + if (Initialized) + { + throw new NotSupportedException(); + } + else + { + return _prevProvider.ApplicationName; + } + } + set + { + if (Initialized) + { + throw new NotSupportedException(); + } + else + { + _prevProvider.ApplicationName = value; + } + } + } + + /// + /// Gets or sets the connection string. + /// + public string ConnectionString { get; set; } + + /// + /// Gets or sets the name associated to the connection string when stored in the configuration manager. + /// + public string ConnectionStringName { get; set; } + + /// + /// Gets the name of the table storing user information. + /// + public string UserTableName + { + get + { + if (string.IsNullOrEmpty(_userTableName)) + throw new InvalidOperationException(Resources.UserTableNameNotInitilized); + + return _userTableName; + } + internal set + { + _userTableName = value; + } + } + + /// + /// Gets the name of the column storing the user ids. + /// + public string UserIdColumn + { + get + { + if (string.IsNullOrEmpty(_userIdColumn)) + throw new InvalidOperationException(Resources.UserIdColumnNotInitialized); + + return _userIdColumn; + } + internal set + { + _userIdColumn = value; + } + } + + /// + /// Gets the name of the column storing the user names. + /// + public string UserNameColumn + { + get + { + if (string.IsNullOrEmpty(_userNameColumn)) + throw new InvalidOperationException(Resources.UserNameColumnNotInitialized); + + return _userNameColumn; + } + internal set + { + _userNameColumn = value; + } + } + + #endregion + + #region Private_Internal + internal bool Initialized + { + get; + set; + } + + internal void CreateTables() + { + var connString = ConnectionString; + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(connString)) + { + //create schema + string schema = SchemaManager.GetSchema(11); + dbConn.ExecuteNonQuery(schema); + } + } + + //private string GetConnectionString() + //{ + // if (!string.IsNullOrEmpty(ConnectionString)) + // return ConnectionString; + // else + // { + // ConnectionStringSettings connString = ConfigurationManager.ConnectionStrings[ConnectionStringName]; + // if (connString != null) + // return connString.ConnectionString; + // } + + // if (!string.IsNullOrEmpty(_connString)) + // return _connString; + // throw new InvalidOperationException(Resources.NoConnString); + //} + + private IEnumerable GetUsersId(string[] usersName) + { + foreach (string userName in usersName) + { + yield return MySqlSimpleMembershipProvider.GetUserId(userName, ConnectionString, UserTableName, UserIdColumn, UserNameColumn); + } + } + + private IEnumerable GetRolesId(string[] roles) + { + foreach (string role in roles) + { + yield return GetRoleId(role); + } + } + + internal int GetRoleId(string role) + { + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(ConnectionString)) + { + var roleid = dbConn.ExecuteQuerySingleRecord(string.Format("select roleid from {0} where rolename=?;", _rolesTable), role); + if (roleid != null) + return (int)roleid[0]; + + return 0; + } + } + + private bool UserHasRole(int userid, int roleid) + { + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(ConnectionString)) + { + return (dbConn.ExecuteQuery(string.Format("select count(*) from {0} where userid=? and roleid=?;", _userInRolesTable), userid, roleid).Count() > 0); + } + } + + private bool IsRoleInUse(int roleid) + { + using (MySqlDatabaseWrapper dbConn = new MySqlDatabaseWrapper(ConnectionString)) + { + return (dbConn.ExecuteQuery(string.Format("select count(*) from {0} where roleid=?;", _userInRolesTable), roleid).Count() > 0); + } + } + #endregion + } +} diff --git a/Source/MySql.Web/SiteMapProvider.cs b/MySql.Web/src/SiteMapProvider.cs similarity index 76% rename from Source/MySql.Web/SiteMapProvider.cs rename to MySql.Web/src/SiteMapProvider.cs index d7e66cf7d..257ad7991 100644 --- a/Source/MySql.Web/SiteMapProvider.cs +++ b/MySql.Web/src/SiteMapProvider.cs @@ -1,195 +1,199 @@ -// Copyright © 2004, 2014, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Configuration; -using System.Configuration.Provider; -using System.Data; -using System.Diagnostics; -using System.Text; -using System.Web; -using MySql.Data.MySqlClient; -using MySql.Web.Common; -using MySql.Web.Properties; - - -namespace MySql.Web.SiteMap -{ - /// - /// SiteMap provider backed by MySql database. - /// - public class MySqlSiteMapProvider : StaticSiteMapProvider - { - private readonly object _lockObject = new object(); - private string _connStr; - private SiteMapNode _rootNode; - private Dictionary _nodes = new Dictionary(); - private bool writeExceptionsToEventLog; - string eventSource = "MySQLSiteMap"; - string eventLog = "Application"; - string exceptionMessage = "An exception occurred. Please check the event log."; - - internal bool WriteExceptionsToEventLog { get { return writeExceptionsToEventLog; } } - - public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) - { - base.Initialize(name, config); - - if (config == null) - throw new ArgumentException(MySql.Web.Properties.Resources.SiteMapConnectionStringMissing); - - string connStrName; - if (string.IsNullOrEmpty(connStrName = config["connectionStringName"])) - throw new ArgumentException(MySql.Web.Properties.Resources.SiteMapConnectionStringMissing); - - _connStr = ConfigurationManager.ConnectionStrings[connStrName].ConnectionString; - - writeExceptionsToEventLog = false; - if (config["writeExceptionsToEventLog"] != null) - { - writeExceptionsToEventLog = (config["writeExceptionsToEventLog"].ToUpper() == "TRUE"); - } - - SchemaManager.CheckSchema(_connStr, config); - } - - public override SiteMapNode BuildSiteMap() - { - lock (_lockObject) - { - if (_rootNode != null) return _rootNode; - string sql = "select Id, Title, Description, Url, Roles, ParentId from my_aspnet_sitemap"; - MySqlConnection conn = new MySqlConnection(_connStr); - try - { - conn.Open(); - MySqlCommand cmd = new MySqlCommand(sql, conn); - using (MySqlDataReader r = cmd.ExecuteReader()) - { - int IdFld = r.GetOrdinal("Id"); - int TitleFld = r.GetOrdinal("Title"); - int DescFld = r.GetOrdinal("Description"); - int UrlFld = r.GetOrdinal("Url"); - int RolesFld = r.GetOrdinal("Roles"); - int ParentIdFld = r.GetOrdinal("ParentId"); - - while (r.Read()) - { - int IdVal; - string TitleVal; - string DescVal; - string UrlVal; - string RolesVal; - int ParentIdVal; - - LoadValue(r, IdFld, out IdVal); - LoadValue(r, TitleFld, out TitleVal); - LoadValue(r, DescFld, out DescVal); - LoadValue(r, UrlFld, out UrlVal); - LoadValue(r, RolesFld, out RolesVal); - LoadValue(r, ParentIdFld, out ParentIdVal); - - SiteMapNode node = new SiteMapNode(this, IdVal.ToString(), UrlVal, TitleVal, DescVal); - _nodes.Add(IdVal, node); - if (ParentIdVal != 0) - { - SiteMapNode parentNode = _nodes[ParentIdVal]; - AddNode(node, parentNode); - } - else - { - AddNode(node); - } - if (ParentIdVal == 0) - { - _rootNode = node; - } - } - } - } - catch (MySqlException ex) { - HandleMySqlException(ex, "BuildSiteMap"); - } finally { - if ((conn.State & ConnectionState.Open) != 0) conn.Close(); - } - return _rootNode; - } - } - - private void LoadValue(MySqlDataReader r, int fldNum, out T val) - { - if (r.IsDBNull(fldNum)) - val = default(T); - else - { - val = (T)r.GetValue(fldNum); - } - } - - public override SiteMapNode FindSiteMapNodeFromKey(string key) - { - if (string.IsNullOrEmpty(key)) return null; - else - { - int idKey = Convert.ToInt32(key); - SiteMapNode node; - _nodes.TryGetValue(idKey, out node); - return node; - } - } - - /// - /// Handles MySql exception. - /// If WriteExceptionsToEventLog is set, will write exception info - /// to event log. - /// It throws provider exception (original exception is stored as inner exception) - /// - /// exception - /// name of the function that throwed the exception - private void HandleMySqlException(MySqlException e, string action) - { - if (WriteExceptionsToEventLog) - { - using (EventLog log = new EventLog()) - { - log.Source = eventSource; - log.Log = eventLog; - - string message = "An exception occurred communicating with the data source.\n\n"; - message += "Action: " + action; - message += "Exception: " + e.ToString(); - log.WriteEntry(message); - } - } - throw new ProviderException(exceptionMessage, e); - } - - protected override SiteMapNode GetRootNodeCore() - { - if (_rootNode == null) - BuildSiteMap(); - - return _rootNode; - } - } -} +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySql.Web.Common; +using MySql.Web.Properties; +using System; +using System.Collections.Generic; +using System.Configuration.Provider; +using System.Data; +using System.Diagnostics; +using System.Web; + +namespace MySql.Web.SiteMap +{ + /// + /// SiteMap provider backed by MySql database. + /// + public class MySqlSiteMapProvider : StaticSiteMapProvider + { + private readonly object _lockObject = new object(); + private string _connStr; + private SiteMapNode _rootNode; + private Dictionary _nodes = new Dictionary(); + private bool writeExceptionsToEventLog; + string eventSource = "MySQLSiteMap"; + string eventLog = "Application"; + string exceptionMessage = "An exception occurred. Please check the event log."; + + internal bool WriteExceptionsToEventLog { get { return writeExceptionsToEventLog; } } + + public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) + { + base.Initialize(name, config); + + if (config == null) + throw new ArgumentException(Resources.SiteMapConnectionStringMissing); + + _connStr = ConfigUtility.GetConnectionString(config); + if (string.IsNullOrEmpty(_connStr)) + throw new ArgumentException(Resources.SiteMapConnectionStringMissing); + + writeExceptionsToEventLog = false; + if (config["writeExceptionsToEventLog"] != null) + { + writeExceptionsToEventLog = (config["writeExceptionsToEventLog"].ToUpper() == "TRUE"); + } + + SchemaManager.CheckSchema(_connStr, config); + } + + public override SiteMapNode BuildSiteMap() + { + lock (_lockObject) + { + if (_rootNode != null) return _rootNode; + string sql = "select Id, Title, Description, Url, Roles, ParentId from my_aspnet_sitemap"; + MySqlConnection conn = new MySqlConnection(_connStr); + try + { + conn.Open(); + MySqlCommand cmd = new MySqlCommand(sql, conn); + using (MySqlDataReader r = cmd.ExecuteReader()) + { + int IdFld = r.GetOrdinal("Id"); + int TitleFld = r.GetOrdinal("Title"); + int DescFld = r.GetOrdinal("Description"); + int UrlFld = r.GetOrdinal("Url"); + int RolesFld = r.GetOrdinal("Roles"); + int ParentIdFld = r.GetOrdinal("ParentId"); + + while (r.Read()) + { + int IdVal; + string TitleVal; + string DescVal; + string UrlVal; + string RolesVal; + int ParentIdVal; + + LoadValue(r, IdFld, out IdVal); + LoadValue(r, TitleFld, out TitleVal); + LoadValue(r, DescFld, out DescVal); + LoadValue(r, UrlFld, out UrlVal); + LoadValue(r, RolesFld, out RolesVal); + LoadValue(r, ParentIdFld, out ParentIdVal); + + SiteMapNode node = new SiteMapNode(this, IdVal.ToString(), UrlVal, TitleVal, DescVal); + _nodes.Add(IdVal, node); + if (ParentIdVal != 0) + { + SiteMapNode parentNode = _nodes[ParentIdVal]; + AddNode(node, parentNode); + } + else + { + AddNode(node); + } + if (ParentIdVal == 0) + { + _rootNode = node; + } + } + } + } + catch (MySqlException ex) + { + HandleMySqlException(ex, "BuildSiteMap"); + } + finally + { + if ((conn.State & ConnectionState.Open) != 0) conn.Close(); + } + return _rootNode; + } + } + + private void LoadValue(MySqlDataReader r, int fldNum, out T val) + { + if (r.IsDBNull(fldNum)) + val = default(T); + else + { + val = (T)r.GetValue(fldNum); + } + } + + public override SiteMapNode FindSiteMapNodeFromKey(string key) + { + if (string.IsNullOrEmpty(key)) return null; + else + { + int idKey = Convert.ToInt32(key); + SiteMapNode node; + _nodes.TryGetValue(idKey, out node); + return node; + } + } + + /// + /// Handles MySql exception. + /// If WriteExceptionsToEventLog is set, will write exception info + /// to event log. + /// It throws provider exception (original exception is stored as inner exception) + /// + /// exception + /// name of the function that throwed the exception + private void HandleMySqlException(MySqlException e, string action) + { + if (WriteExceptionsToEventLog) + { + using (EventLog log = new EventLog()) + { + log.Source = eventSource; + log.Log = eventLog; + + string message = "An exception occurred communicating with the data source.\n\n"; + message += "Action: " + action; + message += "Exception: " + e.ToString(); + log.WriteEntry(message); + } + } + throw new ProviderException(exceptionMessage, e); + } + + protected override SiteMapNode GetRootNodeCore() + { + if (_rootNode == null) + BuildSiteMap(); + + return _rootNode; + } + } +} diff --git a/MySql.Web/tests/App.config b/MySql.Web/tests/App.config new file mode 100644 index 000000000..1ecceec04 --- /dev/null +++ b/MySql.Web/tests/App.config @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MySql.Web/tests/MySql.Web.Tests.csproj b/MySql.Web/tests/MySql.Web.Tests.csproj new file mode 100644 index 000000000..600a45c0d --- /dev/null +++ b/MySql.Web/tests/MySql.Web.Tests.csproj @@ -0,0 +1,67 @@ + + + + MySql.Web.Tests + Copyright © 2016, 2025, Oracle and/or its affiliates. + en-US + 9.4.0 + Oracle + net462;net48; + MySql.Web.Tests + MySql.Web.Tests + MySql;.NET Connector;MySql Connector/NET + http://www.mysql.com/common/logos/logo-mysql-170x115.png + http://dev.mysql.com/downloads/ + GPL-2.0-only WITH Universal-FOSS-exception-1.0 + true + false + false + false + false + false + false + True + True + ..\..\ConnectorNetPublicKey.snk + latest + + + + + + + + + + + + + + + + + + + + + ASPXCodeBehind + + + + ASPXCodeBehind + + + + ASPXCodeBehind + + + + ASPXCodeBehind + + + + + + + + \ No newline at end of file diff --git a/MySql.Web/tests/PersonalizationTests.cs b/MySql.Web/tests/PersonalizationTests.cs new file mode 100644 index 000000000..1ed8622c8 --- /dev/null +++ b/MySql.Web/tests/PersonalizationTests.cs @@ -0,0 +1,235 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySql.Web.Personalization; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Specialized; +using System.Web.UI.WebControls.WebParts; + +namespace MySql.Web.Tests +{ + public class PersonalizationTests : WebTestBase + { + private long applicationId; + + private void CreateDataForSharedScope() + { + execSQL(@"delete from my_aspnet_applications; + delete from my_aspnet_paths; + delete from my_aspnet_personalizationallusers;"); + + var cmd = new MySqlCommand(); + cmd.CommandText = @"insert into my_aspnet_applications(name,description) values('\\', '\\')"; + cmd.Connection = Connection; + cmd.ExecuteNonQuery(); + applicationId = cmd.LastInsertedId; + + // Add my_aspnet_paths + var pathId = new Guid(); + cmd.CommandText = @"insert into my_aspnet_paths(applicationId, pathid, path, loweredpath) values(" + applicationId + + ",'" + pathId.ToString() + @"', '~/default.aspx', '~/default.aspx')"; + cmd.Connection = Connection; + cmd.ExecuteNonQuery(); + + + // personalization all users + byte[] settings = CreateBlob(1000); + + cmd.CommandText = @"insert into my_aspnet_personalizationallusers(pathid, pagesettings, lastUpdatedDate) values(" + + "'" + pathId.ToString() + "', @pageSettings, @LastUpdatedDate)"; + cmd.Parameters.AddWithValue("@pathId", pathId); + cmd.Parameters.AddWithValue("@pageSettings", settings); + cmd.Parameters.AddWithValue("@LastUpdatedDate", DateTime.UtcNow); + cmd.Connection = Connection; + cmd.ExecuteNonQuery(); + } + + + public static byte[] CreateBlob(int size) + { + byte[] buf = new byte[size]; + + Random r = new Random(); + r.NextBytes(buf); + return buf; + } + + + private void CreateDataForUserScope() + { + execSQL(@"delete from my_aspnet_applications; + delete from my_aspnet_paths; + delete from my_aspnet_users; + delete from my_aspnet_personalizationallusers;"); + var cmd = new MySqlCommand(); + cmd.CommandText = @"insert into my_aspnet_applications(name,description) values('\\', '\\')"; + cmd.Connection = Connection; + cmd.ExecuteNonQuery(); + applicationId = cmd.LastInsertedId; + + // Add my_aspnet_paths + var pathId = new Guid(); + cmd.CommandText = @"insert into my_aspnet_paths(applicationId, pathid, path, loweredpath) values(" + applicationId + + ",'" + pathId.ToString() + @"', '~/default.aspx', '~/default.aspx')"; + cmd.Connection = Connection; + cmd.ExecuteNonQuery(); + + // add user + cmd.CommandText = @"insert into my_aspnet_users(applicationId, name, isAnonymous, lastActivityDate) values(" + applicationId + + @",'GabPC\\Gab', 0, @LastActivityDate)"; + cmd.Connection = Connection; + cmd.Parameters.AddWithValue("@LastActivityDate", DateTime.UtcNow); + cmd.ExecuteNonQuery(); + var userId = cmd.LastInsertedId; + + // personalization per user + byte[] settings = CreateBlob(1000); + + cmd.CommandText = @"insert into my_aspnet_personalizationperuser(applicationId, pathid, userId, pagesettings, lastUpdatedDate) values(" + + applicationId + ", '" + pathId.ToString() + "', " + userId + ", @pageSettings, @LastUpdatedDate)"; + cmd.Parameters.AddWithValue("@pageSettings", settings); + cmd.Parameters.AddWithValue("@LastUpdatedDate", DateTime.UtcNow); + cmd.Connection = Connection; + cmd.ExecuteNonQuery(); + } + + private MySqlPersonalizationProvider InitPersonalizationProvider() + { + MySqlPersonalizationProvider p = new MySqlPersonalizationProvider(); + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("applicationName", @"\"); + config.Add("description", @"\"); + config.Add("autogenerateschema", "true"); + p.Initialize(null, config); + return p; + } + + [Test] + public void CanFindState() + { + CreateDataForUserScope(); + var p = InitPersonalizationProvider(); + int totalRecords; + var psq = new PersonalizationStateQuery(); + psq.UsernameToMatch = @"GabPC\\Gab"; + psq.PathToMatch = "~/default.aspx"; + psq.UserInactiveSinceDate = DateTime.UtcNow.AddMinutes(1); + var collection = p.FindState(PersonalizationScope.User, psq, 1, 1, out totalRecords); + Assert.That(totalRecords, Is.EqualTo(1)); + } + + [Test] + public void CanGetCountofStateForUser() + { + CreateDataForUserScope(); + var p = InitPersonalizationProvider(); + int totalRecords; + var psq = new PersonalizationStateQuery(); + psq.UsernameToMatch = @"GabPC\\Gab"; + psq.PathToMatch = "~/default.aspx"; + psq.UserInactiveSinceDate = DateTime.UtcNow.AddMinutes(1); + //System.Threading.Thread.Sleep(1000); + totalRecords = p.GetCountOfState(PersonalizationScope.User, psq); + Assert.That(totalRecords, Is.EqualTo(1)); + } + + [Test] + public void CanGetCountofStateForAllUsers() + { + CreateDataForSharedScope(); + var p = InitPersonalizationProvider(); + int totalRecords; + var psq = new PersonalizationStateQuery(); + psq.PathToMatch = "~/default.aspx"; + psq.UserInactiveSinceDate = DateTime.UtcNow; + totalRecords = p.GetCountOfState(PersonalizationScope.Shared, psq); + Assert.That(totalRecords, Is.EqualTo(1)); + } + + [Test] + public void CanResetStateForUser() + { + CreateDataForUserScope(); + var p = InitPersonalizationProvider(); + int totalRecords; + string[] paths = new string[1]; + paths[0] = "~/default.aspx"; + + string[] users = new string[1]; + users[0] = @"GabPC\Gab"; + + totalRecords = p.ResetState(PersonalizationScope.User, paths, users); + Assert.That(totalRecords, Is.EqualTo(1)); + } + + [Test] + public void CanResetStateForAllUsers() + { + CreateDataForSharedScope(); + var p = InitPersonalizationProvider(); + + string[] paths = new string[1]; + paths[0] = "~/default.aspx"; + + string[] users = new string[1]; + users[0] = @"GabPC\Gab"; + + int totalRecords; + totalRecords = p.ResetState(PersonalizationScope.Shared, paths, users); + Assert.That(totalRecords, Is.EqualTo(1)); + } + + [Test] + public void CanResetAllState() + { + CreateDataForSharedScope(); + var p = InitPersonalizationProvider(); + + int totalRecords; + totalRecords = p.ResetState(PersonalizationScope.Shared, null, null); + Assert.That(totalRecords, Is.EqualTo(1)); + } + + + [Test] + public void CanResetUsertState() + { + CreateDataForUserScope(); + var p = InitPersonalizationProvider(); + int totalRecords; + + totalRecords = p.ResetUserState("~/default.aspx", Convert.ToDateTime("2038-01-19 03:14:07.999999")); // TimeStamp MaxValue + Assert.That(totalRecords, Is.EqualTo(1)); + } + + } +} diff --git a/MySql.Web/tests/ProfileTests.cs b/MySql.Web/tests/ProfileTests.cs new file mode 100644 index 000000000..dbceae9cb --- /dev/null +++ b/MySql.Web/tests/ProfileTests.cs @@ -0,0 +1,288 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Web.Profile; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Specialized; +using System.Configuration; +using System.Data; +using System.Reflection; +using System.Web.Profile; + +namespace MySql.Web.Tests +{ + public class ProfileTests : WebTestBase + { + private MySQLProfileProvider InitProfileProvider() + { + MySQLProfileProvider p = new MySQLProfileProvider(); + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("applicationName", "/"); + p.Initialize(null, config); + return p; + } + [TearDown] + public void Cleanup() + { + execSQL(@"delete from my_aspnet_applications; + delete from my_aspnet_paths; + delete from my_aspnet_users; + delete from my_aspnet_profiles; + delete from my_aspnet_personalizationallusers;"); + } + + [Test] + public void SettingValuesCreatesAnAppAndUserId() + { + + MySQLProfileProvider provider = InitProfileProvider(); + SettingsContext ctx = new SettingsContext(); + ctx.Add("IsAuthenticated", false); + ctx.Add("UserName", "user1"); + + SettingsPropertyValueCollection values = new SettingsPropertyValueCollection(); + SettingsProperty property1 = new SettingsProperty("color"); + property1.PropertyType = typeof(string); + property1.Attributes["AllowAnonymous"] = true; + SettingsPropertyValue value = new SettingsPropertyValue(property1); + value.PropertyValue = "blue"; + values.Add(value); + + provider.SetPropertyValues(ctx, values); + + DataTable dt = FillTable("SELECT * FROM my_aspnet_applications"); + Assert.That(1 == dt.Rows.Count, "Rows count on table my_aspnet_applications is not 1"); + + dt = FillTable("SELECT * FROM my_aspnet_users"); + Assert.That(1 == dt.Rows.Count, "Rows count on table my_aspnet_users is not 1"); + + + dt = FillTable("SELECT * FROM my_aspnet_profiles"); + Assert.That(1 == dt.Rows.Count, "Rows count on table my_aspnet_profiles is not 1"); + + values["color"].PropertyValue = "green"; + provider.SetPropertyValues(ctx, values); + + dt = FillTable("SELECT * FROM my_aspnet_applications"); + Assert.That(1 == dt.Rows.Count, "Rows count on table my_aspnet_applications is not 1 after setting property"); + + dt = FillTable("SELECT * FROM my_aspnet_users"); + Assert.That(1 == dt.Rows.Count, "Rows count on table my_aspnet_users is not 1 after setting property"); + + dt = FillTable("SELECT * FROM my_aspnet_profiles"); + Assert.That(1 == dt.Rows.Count, "Rows count on table my_aspnet_profiles is not 1 after setting property"); + } + + [Test] + public void AnonymousUserSettingNonAnonymousProperties() + { + MySQLProfileProvider provider = InitProfileProvider(); + SettingsContext ctx = new SettingsContext(); + ctx.Add("IsAuthenticated", false); + ctx.Add("UserName", "user1"); + + SettingsPropertyValueCollection values = new SettingsPropertyValueCollection(); + SettingsProperty property1 = new SettingsProperty("color"); + property1.PropertyType = typeof(string); + property1.Attributes["AllowAnonymous"] = false; + SettingsPropertyValue value = new SettingsPropertyValue(property1); + value.PropertyValue = "blue"; + values.Add(value); + + provider.SetPropertyValues(ctx, values); + + DataTable dt = FillTable("SELECT * FROM my_aspnet_applications"); + Assert.That(0 == dt.Rows.Count, "Table my_aspnet_applications Rows is not 0"); + + dt = FillTable("SELECT * FROM my_aspnet_users"); + Assert.That(0 == dt.Rows.Count, "Table my_aspnet_users Rows is not 0"); + + dt = FillTable("SELECT * FROM my_aspnet_profiles"); + Assert.That(0 == dt.Rows.Count, "Table my_aspnet_profiles Rows is not 0"); + + } + + [Test] + public void StringCollectionAsProperty() + { + ProfileBase profile = ProfileBase.Create("foo", true); + ResetAppId(profile.Providers["MySqlProfileProvider"] as MySQLProfileProvider); + StringCollection colors = new StringCollection(); + colors.Add("red"); + colors.Add("green"); + colors.Add("blue"); + profile["FavoriteColors"] = colors; + profile.Save(); + + DataTable dt = FillTable("SELECT * FROM my_aspnet_applications"); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + dt = FillTable("SELECT * FROM my_aspnet_users"); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + dt = FillTable("SELECT * FROM my_aspnet_profiles"); + Assert.That(dt.Rows.Count, Is.EqualTo(1)); + + // now retrieve them + SettingsPropertyCollection getProps = new SettingsPropertyCollection(); + SettingsProperty getProp1 = new SettingsProperty("FavoriteColors"); + getProp1.PropertyType = typeof(StringCollection); + getProp1.SerializeAs = SettingsSerializeAs.Xml; + getProps.Add(getProp1); + + MySQLProfileProvider provider = InitProfileProvider(); + SettingsContext ctx = new SettingsContext(); + ctx.Add("IsAuthenticated", true); + ctx.Add("UserName", "foo"); + SettingsPropertyValueCollection getValues = provider.GetPropertyValues(ctx, getProps); + Assert.That(getValues.Count, Is.EqualTo(1)); + SettingsPropertyValue getValue1 = getValues["FavoriteColors"]; + StringCollection outValue = (StringCollection)getValue1.PropertyValue; + Assert.That(outValue.Count, Is.EqualTo(3)); + Assert.That(outValue[0], Is.EqualTo("red")); + Assert.That(outValue[1], Is.EqualTo("green")); + Assert.That(outValue[2], Is.EqualTo("blue")); + } + + [Test] + public void AuthenticatedDateTime() + { + ProfileBase profile = ProfileBase.Create("foo", true); + ResetAppId(profile.Providers["MySqlProfileProvider"] as MySQLProfileProvider); + DateTime date = DateTime.Now; + profile["BirthDate"] = date; + profile.Save(); + + SettingsPropertyCollection getProps = new SettingsPropertyCollection(); + SettingsProperty getProp1 = new SettingsProperty("BirthDate"); + getProp1.PropertyType = typeof(DateTime); + getProp1.SerializeAs = SettingsSerializeAs.Xml; + getProps.Add(getProp1); + + MySQLProfileProvider provider = InitProfileProvider(); + SettingsContext ctx = new SettingsContext(); + ctx.Add("IsAuthenticated", true); + ctx.Add("UserName", "foo"); + + SettingsPropertyValueCollection getValues = provider.GetPropertyValues(ctx, getProps); + Assert.That(getValues.Count, Is.EqualTo(1)); + SettingsPropertyValue getValue1 = getValues["BirthDate"]; + Assert.That(getValue1.PropertyValue, Is.EqualTo(date)); + } + + /// + /// We have to manually reset the app id because our profile provider is loaded from + /// previous tests but we are destroying our database between tests. This means that + /// our provider thinks we have an application in our database when we really don't. + /// Doing this will force the provider to generate a new app id. + /// Note that this is not really a problem in a normal app that is not destroying + /// the database behind the back of the provider. + /// + /// + private void ResetAppId(MySQLProfileProvider p) + { + Type t = p.GetType(); + FieldInfo fi = t.GetField("app", + BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.GetField); + object appObject = fi.GetValue(p); + Type appType = appObject.GetType(); + PropertyInfo pi = appType.GetProperty("Id"); + pi.SetValue(appObject, -1, null); + } + + [Test, Order(4)] + public void AuthenticatedStringProperty() + { + ProfileBase profile = ProfileBase.Create("foo", true); + ResetAppId(profile.Providers["MySqlProfileProvider"] as MySQLProfileProvider); + profile["Name"] = "Fred Flintstone"; + profile.Save(); + + SettingsPropertyCollection getProps = new SettingsPropertyCollection(); + SettingsProperty getProp1 = new SettingsProperty("Name"); + getProp1.PropertyType = typeof(String); + getProps.Add(getProp1); + + MySQLProfileProvider provider = InitProfileProvider(); + SettingsContext ctx = new SettingsContext(); + ctx.Add("IsAuthenticated", true); + ctx.Add("UserName", "foo"); + + SettingsPropertyValueCollection getValues = provider.GetPropertyValues(ctx, getProps); + Assert.That(getValues.Count, Is.EqualTo(1)); + SettingsPropertyValue getValue1 = getValues["Name"]; + Assert.That(getValue1.PropertyValue, Is.EqualTo("Fred Flintstone")); + } + + /// + /// Bug #41654 FindProfilesByUserName error into Connector .NET + /// + [Test] + public void GetAllProfiles() + { + ProfileBase profile = ProfileBase.Create("foo", true); + ResetAppId(profile.Providers["MySqlProfileProvider"] as MySQLProfileProvider); + profile["Name"] = "Fred Flintstone"; + profile.Save(); + + SettingsPropertyCollection getProps = new SettingsPropertyCollection(); + SettingsProperty getProp1 = new SettingsProperty("Name"); + getProp1.PropertyType = typeof(String); + getProps.Add(getProp1); + + MySQLProfileProvider provider = InitProfileProvider(); + SettingsContext ctx = new SettingsContext(); + ctx.Add("IsAuthenticated", true); + ctx.Add("UserName", "foo"); + + int total; + ProfileInfoCollection profiles = provider.GetAllProfiles( + ProfileAuthenticationOption.All, 0, 10, out total); + Assert.That(total, Is.EqualTo(1)); + } + + /// + /// Tests deleting a user profile + /// + [Test] + public void DeleteProfiles() + { + ProfileBase profile = ProfileBase.Create("foo", true); + profile.SetPropertyValue("Name", "this is my name"); + profile.Save(); + profile = ProfileBase.Create("foo", true); // refresh profile from database + Assert.That(profile.GetPropertyValue("Name"), Is.EqualTo("this is my name")); + + Assert.That(ProfileManager.DeleteProfiles(new string[] { "foo" }), Is.EqualTo(1)); + profile = ProfileBase.Create("foo", true); // refresh profile from database + Assert.That(profile.GetPropertyValue("Name"), Is.Empty); + } + + } +} diff --git a/MySql.Web/tests/Properties/AssemblyInfo.cs b/MySql.Web/tests/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..e4cc0a0e5 --- /dev/null +++ b/MySql.Web/tests/Properties/AssemblyInfo.cs @@ -0,0 +1,49 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using NUnit.Framework; +using System.Reflection; +using 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. +[assembly: AssemblyTitle("MySql.Web.Tests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Oracle")] +[assembly: AssemblyProduct("MySql.Web.Tests")] +[assembly: AssemblyCopyright("Copyright © 2004, 2025, Oracle and/or its affiliates.")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: NonParallelizable] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] diff --git a/MySql.Web/tests/RoleManagement.cs b/MySql.Web/tests/RoleManagement.cs new file mode 100644 index 000000000..7a1d56fcc --- /dev/null +++ b/MySql.Web/tests/RoleManagement.cs @@ -0,0 +1,235 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Web.Security; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Specialized; +using System.Web.Security; + +namespace MySql.Web.Tests +{ + public class RoleManagement : WebTestBase + { + private MySQLMembershipProvider membershipProvider; + private MySQLRoleProvider roleProvider; + + public RoleManagement() + { + membershipProvider = new MySQLMembershipProvider(); + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("applicationName", "/"); + membershipProvider.Initialize(null, config); + + roleProvider = new MySQLRoleProvider(); + roleProvider.Initialize(null, config); + } + + private void AddUser(string username, string password) + { + MembershipCreateStatus status; + membershipProvider.CreateUser(username, password, "foo@bar.com", null, + null, true, null, out status); + Assert.That(status == MembershipCreateStatus.Success, "User creation failed"); + } + + private void AttemptToAddUserToRole(string username, string role) + { + try + { + roleProvider.AddUsersToRoles(new string[] { username }, + new string[] { role }); + } + catch (ArgumentException) + { + } + } + + + [Test] + public void CreateAndDeleteRoles() + { + // Add the role + roleProvider.CreateRole("Administrator"); + string[] roles = roleProvider.GetAllRoles(); + Assert.That(roles.Length, Is.EqualTo(1)); + Assert.That(roles[0], Is.EqualTo("Administrator")); + roleProvider.DeleteRole("Administrator", false); + } + + [Test] + public void AddUserToRole() + { + AddUser("eve", "eveeve!"); + roleProvider.CreateRole("Administrator"); + + roleProvider.AddUsersToRoles(new string[] { "eve" }, + new string[] { "Administrator" }); + Assert.That(roleProvider.IsUserInRole("eve", "Administrator")); + + roleProvider.RemoveUsersFromRoles(new string[] { "eve" }, new string[] { "Administrator" }); + Assert.That(!roleProvider.IsUserInRole("eve", "Administrator")); + + roleProvider.DeleteRole("Administrator", false); + Assert.That(roleProvider.GetAllRoles().Length, Is.EqualTo(0)); + + //clean up + membershipProvider.DeleteUser("eve", true); + + } + + /// + /// Bug #38243 Not Handling non existing user when calling AddUsersToRoles method + /// + [Test] + public void AddNonExistingUserToRole() + { + roleProvider.CreateRole("Administrator"); + roleProvider.AddUsersToRoles(new string[] { "eve" }, + new string[] { "Administrator" }); + Assert.That(roleProvider.IsUserInRole("eve", "Administrator")); + + //Cleanup + roleProvider.RemoveUsersFromRoles(new string[] { "eve" }, new string[] { "Administrator" }); + roleProvider.DeleteRole("Administrator", false); + + } + + + [Test] + public void IllegalRoleAndUserNames() + { + AttemptToAddUserToRole("test", null); + AttemptToAddUserToRole("test", ""); + roleProvider.CreateRole("Administrator"); + AttemptToAddUserToRole(null, "Administrator"); + AttemptToAddUserToRole("", "Administrator"); + + //Cleanup + roleProvider.DeleteRole("Administrator", false); + } + + [Test] + public void AddUserToRoleWithRoleClass() + { + roleProvider.CreateRole("Administrator"); + + MembershipCreateStatus status; + membershipProvider.CreateUser("eve", "eve1@eve", "eve@boo.com", + "question", "answer", true, null, out status); + Assert.That(status, Is.EqualTo(MembershipCreateStatus.Success)); + + roleProvider.AddUsersToRoles(new string[] { "eve" }, new string[] { "Administrator" }); + Assert.That(roleProvider.IsUserInRole("eve", "Administrator")); + + //Cleanup + membershipProvider.DeleteUser("eve", true); + roleProvider.DeleteRole("Administrator", true); + + } + + [Test] + public void IsUserInRoleCrossDomain() + { + MySQLMembershipProvider provider = new MySQLMembershipProvider(); + NameValueCollection config1 = new NameValueCollection(); + config1.Add("connectionStringName", "LocalMySqlServer"); + config1.Add("applicationName", "/"); + config1.Add("passwordStrengthRegularExpression", "bar.*"); + config1.Add("passwordFormat", "Clear"); + provider.Initialize(null, config1); + MembershipCreateStatus status; + provider.CreateUser("foo", "bar!bar", null, null, null, true, null, out status); + + MySQLMembershipProvider provider2 = new MySQLMembershipProvider(); + NameValueCollection config2 = new NameValueCollection(); + config2.Add("connectionStringName", "LocalMySqlServer"); + config2.Add("applicationName", "/myapp"); + config2.Add("passwordStrengthRegularExpression", ".*"); + config2.Add("passwordFormat", "Clear"); + provider2.Initialize(null, config2); + + roleProvider = new MySQLRoleProvider(); + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("applicationName", "/"); + roleProvider.Initialize(null, config); + + MySQLRoleProvider r2 = new MySQLRoleProvider(); + NameValueCollection configr2 = new NameValueCollection(); + configr2.Add("connectionStringName", "LocalMySqlServer"); + configr2.Add("applicationName", "/myapp"); + r2.Initialize(null, configr2); + + roleProvider.CreateRole("Administrator"); + roleProvider.AddUsersToRoles(new string[] { "foo" }, + new string[] { "Administrator" }); + Assert.That(!r2.IsUserInRole("foo", "Administrator")); + + roleProvider.DeleteRole("Administrator", false); + Assert.That(roleProvider.GetAllRoles().Length, Is.EqualTo(0)); + + //Cleanup + provider.DeleteUser("foo", true); + + } + + /// + /// Testing fix for Calling RoleProvider.RemoveUserFromRole() causes an exception due to a wrong table being used. + /// http://clustra.no.oracle.com/orabugs/bug.php?id=14405338 / http://bugs.mysql.com/bug.php?id=65805. + /// + [Test] + public void TestUserRemoveFindFromRole() + { + roleProvider = new MySQLRoleProvider(); + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("applicationName", "/"); + roleProvider.Initialize(null, config); + + AddUser("eve", "eveeve!"); + roleProvider.CreateRole("Administrator"); + roleProvider.AddUsersToRoles(new string[] { "eve" }, + new string[] { "Administrator" }); + Assert.That(roleProvider.IsUserInRole("eve", "Administrator")); + string[] users = roleProvider.FindUsersInRole("Administrator", "eve"); + Assert.That(users.Length, Is.EqualTo(1)); + Assert.That(users[0], Is.EqualTo("eve")); + roleProvider.RemoveUsersFromRoles(new string[] { "eve" }, new string[] { "Administrator" }); + Assert.That(!roleProvider.IsUserInRole("eve", "Administrator")); + + //Cleanup + membershipProvider.DeleteUser("eve", true); + roleProvider.DeleteRole("Administrator", false); + + } + + } +} diff --git a/MySql.Web/tests/SchemaManagerTests.cs b/MySql.Web/tests/SchemaManagerTests.cs new file mode 100644 index 000000000..2b089c4c3 --- /dev/null +++ b/MySql.Web/tests/SchemaManagerTests.cs @@ -0,0 +1,320 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySql.Web.Common; +using MySql.Web.Security; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Specialized; +using System.Configuration.Provider; +using System.Data; +using System.Web.Security; + +namespace MySql.Web.Tests +{ + public class SchemaManagerTests : WebTestBase + { + protected override void InitSchema() + { + // we override this and leave it empty because we don't want + // to init the schema for this test. + } + + [OneTimeSetUp] + public void Setup() + { + LoadData(); + } + + + /// + /// Bug #37469 autogenerateschema optimizing + /// + [Test] + public void SchemaCheck() + { + for (int i = 0; i <= SchemaManager.Version; i++) + { + MySQLMembershipProvider provider = new MySQLMembershipProvider(); + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("applicationName", "/"); + config.Add("passwordFormat", "Clear"); + + if (i > 0) + for (int x = 1; x <= i; x++) + LoadSchema(x); + + try + { + provider.Initialize(null, config); + if (i < SchemaManager.Version) + Assert.That(false, Is.False, "Should have failed"); + } + catch (ProviderException) + { + if (i == SchemaManager.Version) + Assert.That(false, Is.False, "This should not have failed"); + } + } + } + + /// + /// Bug #36444 'autogenerateschema' produces tables with 'random' collations + /// + [Test] + public void CurrentSchema() + { + execSQL(@"set character_set_database=utf8; + ALTER TABLE my_aspnet_membership CONVERT TO CHARACTER SET DEFAULT; + UPDATE my_aspnet_schemaversion SET version=4;"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM my_aspnet_schemaversion", Connection); + object ver = cmd.ExecuteScalar(); + Assert.That(ver, Is.EqualTo(4)); + + cmd.CommandText = "SHOW CREATE TABLE my_aspnet_membership"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + string createSql = reader.GetString(1); + Assert.That(createSql.IndexOf("CHARSET=utf8") != -1); + } + } + + [Test] + public void UpgradeV1ToV2() + { + execSQL(@"CREATE TABLE if not exists mysql_Membership(`PKID` varchar(36) NOT NULL, + Username varchar(255) NOT NULL, + ApplicationName varchar(255) NOT NULL, + Email varchar(128) NOT NULL, + Comment varchar(255) default NULL, + Password varchar(128) NOT NULL, + PasswordQuestion varchar(255) default NULL, + PasswordAnswer varchar(255) default NULL, + IsApproved tinyint(1) default NULL, + LastActivityDate datetime default NULL, + LastLoginDate datetime default NULL, + LastPasswordChangedDate datetime default NULL, + CreationDate datetime default NULL, + IsOnline tinyint(1) default NULL, + IsLockedOut tinyint(1) default NULL, + LastLockedOutDate datetime default NULL, + FailedPasswordAttemptCount int(10) unsigned default NULL, + FailedPasswordAttemptWindowStart datetime default NULL, + FailedPasswordAnswerAttemptCount int(10) unsigned default NULL, + FailedPasswordAnswerAttemptWindowStart datetime default NULL, + PRIMARY KEY (`PKID`)) DEFAULT CHARSET=latin1 COMMENT='1'; + ALTER TABLE mysql_Membership CHANGE Email Email VARCHAR(128), COMMENT='1';"); + + + MySqlCommand cmd = new MySqlCommand("SHOW CREATE TABLE mysql_membership", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + string createTable = reader.GetString(1); + int index = createTable.IndexOf("COMMENT='1'"); + Assert.That(index, Is.Not.EqualTo(-1)); + } + + execSQL(@" ALTER TABLE mysql_Membership + CHANGE Email Email VARCHAR(128), COMMENT='2';"); + cmd = new MySqlCommand("SHOW CREATE TABLE mysql_membership", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + string createTable = reader.GetString(1); + int index = createTable.IndexOf("COMMENT='2'"); + Assert.That(index, Is.Not.EqualTo(-1)); + } + } + + private void LoadData() + { + LoadSchema(1); + LoadSchema(2); + execSQL(@"INSERT INTO mysql_membership (pkid, username, password, applicationname, lastactivitydate) + VALUES('1', 'user1', '', 'app1', '2007-01-01')"); + execSQL(@"INSERT INTO mysql_membership (pkid, username, password, applicationname, lastactivitydate) + VALUES('2', 'user2', '', 'app1', '2007-01-01')"); + execSQL(@"INSERT INTO mysql_membership (pkid, username, password, applicationname, lastactivitydate) + VALUES('3', 'user1', '', 'app2', '2007-01-01')"); + execSQL(@"INSERT INTO mysql_membership (pkid, username, password, applicationname, lastactivitydate) + VALUES('4', 'user2', '', 'app2', '2007-01-01')"); + execSQL(@"INSERT INTO mysql_roles VALUES ('role1', 'app1')"); + execSQL(@"INSERT INTO mysql_roles VALUES ('role2', 'app1')"); + execSQL(@"INSERT INTO mysql_roles VALUES ('role1', 'app2')"); + execSQL(@"INSERT INTO mysql_roles VALUES ('role2', 'app2')"); + execSQL(@"INSERT INTO mysql_UsersInRoles VALUES ('user1', 'role1', 'app1')"); + execSQL(@"INSERT INTO mysql_UsersInRoles VALUES ('user2', 'role2', 'app1')"); + execSQL(@"INSERT INTO mysql_UsersInRoles VALUES ('user1', 'role1', 'app2')"); + execSQL(@"INSERT INTO mysql_UsersInRoles VALUES ('user2', 'role2', 'app2')"); + LoadSchema(3); + Assert.That(!TableExists("mysql_membership")); + Assert.That(!TableExists("mysql_roles")); + Assert.That(!TableExists("mysql_usersinroles")); + } + + [Test] + public void CheckAppsUpgrade() + { + DataTable apps = FillTable("SELECT * FROM my_aspnet_applications"); + Assert.That(apps.Rows.Count, Is.EqualTo(2)); + Assert.That(apps.Rows[0]["id"], Is.EqualTo(1)); + Assert.That(apps.Rows[0]["name"], Is.EqualTo("app1")); + Assert.That(apps.Rows[1]["id"], Is.EqualTo(2)); + Assert.That(apps.Rows[1]["name"], Is.EqualTo("app2")); + } + + [Test] + public void CheckUsersUpgrade() + { + DataTable dt = FillTable("SELECT * FROM my_aspnet_users"); + Assert.That(dt.Rows.Count, Is.EqualTo(4)); + Assert.That(dt.Rows[0]["id"], Is.EqualTo(1)); + Assert.That(dt.Rows[0]["applicationId"], Is.EqualTo(1)); + Assert.That(dt.Rows[0]["name"], Is.EqualTo("user1")); + Assert.That(dt.Rows[1]["id"], Is.EqualTo(2)); + Assert.That(dt.Rows[1]["applicationId"], Is.EqualTo(1)); + Assert.That(dt.Rows[1]["name"], Is.EqualTo("user2")); + Assert.That(dt.Rows[2]["id"], Is.EqualTo(3)); + Assert.That(dt.Rows[2]["applicationId"], Is.EqualTo(2)); + Assert.That(dt.Rows[2]["name"], Is.EqualTo("user1")); + Assert.That(dt.Rows[3]["id"], Is.EqualTo(4)); + Assert.That(dt.Rows[3]["applicationId"], Is.EqualTo(2)); + Assert.That(dt.Rows[3]["name"], Is.EqualTo("user2")); + } + + [Test] + public void CheckRolesUpgrade() + { + DataTable dt = FillTable("SELECT * FROM my_aspnet_roles"); + Assert.That(dt.Rows.Count, Is.EqualTo(4)); + Assert.That(dt.Rows[0]["id"], Is.EqualTo(1)); + Assert.That(dt.Rows[0]["applicationId"], Is.EqualTo(1)); + Assert.That(dt.Rows[0]["name"], Is.EqualTo("role1")); + Assert.That(dt.Rows[1]["id"], Is.EqualTo(2)); + Assert.That(dt.Rows[1]["applicationId"], Is.EqualTo(1)); + Assert.That(dt.Rows[1]["name"], Is.EqualTo("role2")); + Assert.That(dt.Rows[2]["id"], Is.EqualTo(3)); + Assert.That(dt.Rows[2]["applicationId"], Is.EqualTo(2)); + Assert.That(dt.Rows[2]["name"], Is.EqualTo("role1")); + Assert.That(dt.Rows[3]["id"], Is.EqualTo(4)); + Assert.That(dt.Rows[3]["applicationId"], Is.EqualTo(2)); + Assert.That(dt.Rows[3]["name"], Is.EqualTo("role2")); + } + + [Test] + public void CheckMembershipUpgrade() + { + DataTable dt = FillTable("SELECT * FROM my_aspnet_membership"); + Assert.That(dt.Rows.Count, Is.EqualTo(4)); + Assert.That(dt.Rows[0]["userid"], Is.EqualTo(1)); + Assert.That(dt.Rows[1]["userid"], Is.EqualTo(2)); + Assert.That(dt.Rows[2]["userid"], Is.EqualTo(3)); + Assert.That(dt.Rows[3]["userid"], Is.EqualTo(4)); + } + + [Test] + public void CheckUsersInRolesUpgrade() + { + DataTable dt = FillTable("SELECT * FROM my_aspnet_usersinroles"); + Assert.That(dt.Rows.Count, Is.EqualTo(4)); + Assert.That(dt.Rows[0]["userid"], Is.EqualTo(1)); + Assert.That(dt.Rows[0]["roleid"], Is.EqualTo(1)); + Assert.That(dt.Rows[1]["userid"], Is.EqualTo(2)); + Assert.That(dt.Rows[1]["roleid"], Is.EqualTo(2)); + Assert.That(dt.Rows[2]["userid"], Is.EqualTo(3)); + Assert.That(dt.Rows[2]["roleid"], Is.EqualTo(3)); + Assert.That(dt.Rows[3]["userid"], Is.EqualTo(4)); + Assert.That(dt.Rows[3]["roleid"], Is.EqualTo(4)); + } + + /// + /// Bug #39072 Web provider does not work + /// + [Test] + public void AutoGenerateSchema() + { + MySQLMembershipProvider provider = new MySQLMembershipProvider(); + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("autogenerateschema", "true"); + config.Add("applicationName", "/"); + config.Add("passwordFormat", "Clear"); + + provider.Initialize(null, config); + + MembershipCreateStatus status; + MembershipUser user = provider.CreateUser("boo", "password", "email@email.com", + "question", "answer", true, null, out status); + } + + [Test] + public void SchemaTablesUseSameEngine() + { + for (int x = 1; x <= SchemaManager.Version; x++) + LoadSchema(x); + + string query = string.Format("SELECT TABLE_NAME, ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{0}'", Connection.Database); + MySqlCommand cmd = new MySqlCommand(query, Connection); + string lastEngine = null; + string currentEngine; + + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + while (reader.Read()) + { + currentEngine = reader.GetString("ENGINE"); + + if (string.IsNullOrEmpty(lastEngine)) + { + lastEngine = currentEngine; + } + + Assert.That(currentEngine, Is.EqualTo(lastEngine)); + } + } + } + + [Test] + public void InitializeInvalidConnStringThrowsArgumentException() + { + MySQLMembershipProvider provider = new MySQLMembershipProvider(); + NameValueCollection config = new NameValueCollection(); + var badConnectionString = ConnectionString + ";fookey=boo"; + config.Add("connectionString", badConnectionString); + + Exception ex = Assert.Throws(() => provider.Initialize(null, config)); + Assert.That(ex.Message, Is.EqualTo("Option not supported\r\nParameter name: fookey")); + } + } +} diff --git a/MySql.Web/tests/SchemaTests.cs b/MySql.Web/tests/SchemaTests.cs new file mode 100644 index 000000000..6f8558474 --- /dev/null +++ b/MySql.Web/tests/SchemaTests.cs @@ -0,0 +1,358 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySql.Web.Common; +using MySql.Web.Security; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System.Collections.Specialized; +using System.Configuration.Provider; +using System.Data; +using System.Web.Security; + +namespace MySql.Web.Tests +{ + public class SchemaTests : WebTestBase + { + protected override void InitSchema() + { + // we override this and leave it empty because we don't want + // to init the schema for this test. + } + + [OneTimeSetUp] + public void Setup() + { + LoadData(); + } + /// + /// Bug #37469 autogenerateschema optimizing + /// + [Test] + public void SchemaCheck() + { + for (int i = 0; i <= SchemaManager.Version; i++) + { + MySQLMembershipProvider provider = new MySQLMembershipProvider(); + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("applicationName", "/"); + config.Add("passwordFormat", "Clear"); + + if (i > 0) + for (int x = 1; x <= i; x++) + LoadSchema(x); + + try + { + provider.Initialize(null, config); + if (i < SchemaManager.Version) + Assert.That(false, Is.False, "Should have failed"); + } + catch (ProviderException) + { + if (i == SchemaManager.Version) + Assert.That(false, Is.False, "This should not have failed"); + } + } + } + + /// + /// Bug #36444 'autogenerateschema' produces tables with 'random' collations + /// + [Test] + public void CurrentSchema() + { + execSQL(@"set character_set_database=utf8; + ALTER TABLE my_aspnet_membership CONVERT TO CHARACTER SET DEFAULT; + UPDATE my_aspnet_schemaversion SET version=4;"); + + MySqlCommand cmd = new MySqlCommand("SELECT * FROM my_aspnet_schemaversion", Connection); + object ver = cmd.ExecuteScalar(); + Assert.That(ver, Is.EqualTo(4)); + + cmd.CommandText = "SHOW CREATE TABLE my_aspnet_membership"; + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + string createSql = reader.GetString(1); + Assert.That(createSql.IndexOf("CHARSET=utf8") != -1); + } + } + + [Test] + public void UpgradeV1ToV2() + { + execSQL(@"CREATE TABLE if not exists mysql_Membership(`PKID` varchar(36) NOT NULL, + Username varchar(255) NOT NULL, + ApplicationName varchar(255) NOT NULL, + Email varchar(128) NOT NULL, + Comment varchar(255) default NULL, + Password varchar(128) NOT NULL, + PasswordQuestion varchar(255) default NULL, + PasswordAnswer varchar(255) default NULL, + IsApproved tinyint(1) default NULL, + LastActivityDate datetime default NULL, + LastLoginDate datetime default NULL, + LastPasswordChangedDate datetime default NULL, + CreationDate datetime default NULL, + IsOnline tinyint(1) default NULL, + IsLockedOut tinyint(1) default NULL, + LastLockedOutDate datetime default NULL, + FailedPasswordAttemptCount int(10) unsigned default NULL, + FailedPasswordAttemptWindowStart datetime default NULL, + FailedPasswordAnswerAttemptCount int(10) unsigned default NULL, + FailedPasswordAnswerAttemptWindowStart datetime default NULL, + PRIMARY KEY (`PKID`)) DEFAULT CHARSET=latin1 COMMENT='1'; + ALTER TABLE mysql_Membership CHANGE Email Email VARCHAR(128), COMMENT='1';"); + + + MySqlCommand cmd = new MySqlCommand("SHOW CREATE TABLE mysql_membership", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + string createTable = reader.GetString(1); + int index = createTable.IndexOf("COMMENT='1'"); + Assert.That(index, Is.Not.EqualTo(-1)); + } + + execSQL(@" ALTER TABLE mysql_Membership + CHANGE Email Email VARCHAR(128), COMMENT='2';"); + cmd = new MySqlCommand("SHOW CREATE TABLE mysql_membership", Connection); + using (MySqlDataReader reader = cmd.ExecuteReader()) + { + reader.Read(); + string createTable = reader.GetString(1); + int index = createTable.IndexOf("COMMENT='2'"); + Assert.That(index, Is.Not.EqualTo(-1)); + } + } + + private void LoadData() + { + LoadSchema(1); + LoadSchema(2); + execSQL(@"INSERT INTO mysql_membership (pkid, username, password, applicationname, lastactivitydate) + VALUES('1', 'user1', '', 'app1', '2007-01-01')"); + execSQL(@"INSERT INTO mysql_membership (pkid, username, password, applicationname, lastactivitydate) + VALUES('2', 'user2', '', 'app1', '2007-01-01')"); + execSQL(@"INSERT INTO mysql_membership (pkid, username, password, applicationname, lastactivitydate) + VALUES('3', 'user1', '', 'app2', '2007-01-01')"); + execSQL(@"INSERT INTO mysql_membership (pkid, username, password, applicationname, lastactivitydate) + VALUES('4', 'user2', '', 'app2', '2007-01-01')"); + execSQL(@"INSERT INTO mysql_roles VALUES ('role1', 'app1')"); + execSQL(@"INSERT INTO mysql_roles VALUES ('role2', 'app1')"); + execSQL(@"INSERT INTO mysql_roles VALUES ('role1', 'app2')"); + execSQL(@"INSERT INTO mysql_roles VALUES ('role2', 'app2')"); + execSQL(@"INSERT INTO mysql_UsersInRoles VALUES ('user1', 'role1', 'app1')"); + execSQL(@"INSERT INTO mysql_UsersInRoles VALUES ('user2', 'role2', 'app1')"); + execSQL(@"INSERT INTO mysql_UsersInRoles VALUES ('user1', 'role1', 'app2')"); + execSQL(@"INSERT INTO mysql_UsersInRoles VALUES ('user2', 'role2', 'app2')"); + LoadSchema(3); + Assert.That(!TableExists("mysql_membership")); + Assert.That(!TableExists("mysql_roles")); + Assert.That(!TableExists("mysql_usersinroles")); + } + + [Test] + public void CheckAppsUpgrade() + { + DataTable apps = FillTable("SELECT * FROM my_aspnet_applications"); + Assert.That(apps.Rows.Count, Is.EqualTo(2)); + Assert.That(apps.Rows[0]["id"], Is.EqualTo(1)); + Assert.That(apps.Rows[0]["name"], Is.EqualTo("app1")); + Assert.That(apps.Rows[1]["id"], Is.EqualTo(2)); + Assert.That(apps.Rows[1]["name"], Is.EqualTo("app2")); + } + + //[Test] + //public void CheckUsersUpgrade() + //{ + // LoadData(); + + // DataTable dt = FillTable("SELECT * FROM my_aspnet_users"); + // Assert.AreEqual(4, dt.Rows.Count); + // Assert.AreEqual(1, dt.Rows[0]["id"]); + // Assert.AreEqual(1, dt.Rows[0]["applicationId"]); + // Assert.AreEqual("user1", dt.Rows[0]["name"]); + // Assert.AreEqual(2, dt.Rows[1]["id"]); + // Assert.AreEqual(1, dt.Rows[1]["applicationId"]); + // Assert.AreEqual("user2", dt.Rows[1]["name"]); + // Assert.AreEqual(3, dt.Rows[2]["id"]); + // Assert.AreEqual(2, dt.Rows[2]["applicationId"]); + // Assert.AreEqual("user1", dt.Rows[2]["name"]); + // Assert.AreEqual(4, dt.Rows[3]["id"]); + // Assert.AreEqual(2, dt.Rows[3]["applicationId"]); + // Assert.AreEqual("user2", dt.Rows[3]["name"]); + //} + + // [Test] + // public void CheckRolesUpgrade() + // { + // LoadData(); + + // DataTable dt = FillTable("SELECT * FROM my_aspnet_roles"); + // Assert.AreEqual(4, dt.Rows.Count); + // Assert.AreEqual(1, dt.Rows[0]["id"]); + // Assert.AreEqual(1, dt.Rows[0]["applicationId"]); + // Assert.AreEqual("role1", dt.Rows[0]["name"]); + // Assert.AreEqual(2, dt.Rows[1]["id"]); + // Assert.AreEqual(1, dt.Rows[1]["applicationId"]); + // Assert.AreEqual("role2", dt.Rows[1]["name"]); + // Assert.AreEqual(3, dt.Rows[2]["id"]); + // Assert.AreEqual(2, dt.Rows[2]["applicationId"]); + // Assert.AreEqual("role1", dt.Rows[2]["name"]); + // Assert.AreEqual(4, dt.Rows[3]["id"]); + // Assert.AreEqual(2, dt.Rows[3]["applicationId"]); + // Assert.AreEqual("role2", dt.Rows[3]["name"]); + // } + + // [Test] + // public void CheckMembershipUpgrade() + // { + // LoadData(); + + // DataTable dt = FillTable("SELECT * FROM my_aspnet_membership"); + // Assert.AreEqual(4, dt.Rows.Count); + // Assert.AreEqual(1, dt.Rows[0]["userid"]); + // Assert.AreEqual(2, dt.Rows[1]["userid"]); + // Assert.AreEqual(3, dt.Rows[2]["userid"]); + // Assert.AreEqual(4, dt.Rows[3]["userid"]); + // } + + // [Test] + // public void CheckUsersInRolesUpgrade() + // { + // LoadData(); + + // DataTable dt = FillTable("SELECT * FROM my_aspnet_usersinroles"); + // Assert.AreEqual(4, dt.Rows.Count); + // Assert.AreEqual(1, dt.Rows[0]["userid"]); + // Assert.AreEqual(1, dt.Rows[0]["roleid"]); + // Assert.AreEqual(2, dt.Rows[1]["userid"]); + // Assert.AreEqual(2, dt.Rows[1]["roleid"]); + // Assert.AreEqual(3, dt.Rows[2]["userid"]); + // Assert.AreEqual(3, dt.Rows[2]["roleid"]); + // Assert.AreEqual(4, dt.Rows[3]["userid"]); + // Assert.AreEqual(4, dt.Rows[3]["roleid"]); + // } + + /// + /// Bug #39072 Web provider does not work + /// + [Test] + public void AutoGenerateSchema() + { + MySQLMembershipProvider provider = new MySQLMembershipProvider(); + NameValueCollection config = new NameValueCollection(); + config.Add("ConnectionStringName", "LocalMySqlServer"); + config.Add("autogenerateschema", "true"); + config.Add("applicationName", "/"); + config.Add("passwordFormat", "Clear"); + + provider.Initialize(null, config); + + MembershipCreateStatus status; + MembershipUser user = provider.CreateUser("boo", "password", "email@email.com", + "question", "answer", true, null, out status); + } + + // [Test] + // public void SchemaTablesUseSameEngine() + // { + // DropAllTables(); + + // for (int x = 1; x <= SchemaManager.Version; x++) + // LoadSchema(x); + + // string query = string.Format("SELECT TABLE_NAME, ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{0}'", st.conn.Database); + // MySqlCommand cmd = new MySqlCommand(query, st.conn); + // string lastEngine = null; + // string currentEngine; + + // using (MySqlDataReader reader = cmd.ExecuteReader()) + // { + // while (reader.Read()) + // { + // currentEngine = reader.GetString("ENGINE"); + + // if (string.IsNullOrEmpty(lastEngine)) + // { + // lastEngine = currentEngine; + // } + + // Assert.AreEqual(lastEngine, currentEngine); + // } + // } + // } + + // [Test] + // public void InitializeInvalidConnStringThrowsArgumentException() + // { + // Configuration configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); + // string connStr = configFile.ConnectionStrings.ConnectionStrings["LocalMySqlServer"].ConnectionString; + // string fakeConnectionString = connStr.Replace("database", "fooKey"); + // configFile.ConnectionStrings.ConnectionStrings["LocalMySqlServer"].ConnectionString = fakeConnectionString; + // configFile.Save(); + // ConfigurationManager.RefreshSection("connectionStrings"); + + // MySQLMembershipProvider provider = new MySQLMembershipProvider(); + // NameValueCollection config = new NameValueCollection(); + // config.Add("connectionStringName", "LocalMySqlServer"); + + // Exception ex = Assert.Throws(() => provider.Initialize(null, config)); + // Assert.AreEqual(ex.Message, "Keyword not supported.\r\nParameter name: fookey"); + + // configFile.ConnectionStrings.ConnectionStrings["LocalMySqlServer"].ConnectionString = connStr; + // configFile.Save(); + // ConfigurationManager.RefreshSection("connectionStrings"); + + // } + + /// + /// Checking fix for http://bugs.mysql.com/bug.php?id=65144 / http://clustra.no.oracle.com/orabugs/14495292 + /// (Net Connector 6.4.4 Asp.Net Membership Database fails on MySql Db of UTF32). + /// + [Test] + public void AttemptLatestSchemaVersion() + { + execSQL(string.Format("alter database `{0}` character set = 'utf32' collate = 'utf32_general_ci'", Connection.Database)); + for (int i = 1; i <= 4; i++) + { + LoadSchema(i); + } + MySQLRoleProvider roleProvider = new MySQLRoleProvider(); + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("applicationName", "/"); + config.Add("autogenerateschema", "true"); + roleProvider.Initialize(null, config); + } + } +} diff --git a/Tests/MySql.Web.Tests/SessionLocking/Global.asax b/MySql.Web/tests/SessionLocking/Global.asax similarity index 100% rename from Tests/MySql.Web.Tests/SessionLocking/Global.asax rename to MySql.Web/tests/SessionLocking/Global.asax diff --git a/MySql.Web/tests/SessionLocking/Global.asax.cs b/MySql.Web/tests/SessionLocking/Global.asax.cs new file mode 100644 index 000000000..934ba143b --- /dev/null +++ b/MySql.Web/tests/SessionLocking/Global.asax.cs @@ -0,0 +1,100 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +// This code was contributed by Sean Wright (srwright@alcor.concordia.ca) on 2007-01-12 +// The copyright was assigned and transferred under the terms of +// the MySQL Contributor License Agreement (CLA) + +using System; +using System.Collections.Generic; +using System.Web; +using System.Web.Security; +using System.Web.SessionState; +using MySql.Web.Tests; +using System.Threading; + +namespace MySql.Web.Tests +{ + public class Global : System.Web.HttpApplication + { + + void Application_Start(object sender, EventArgs e) + { + // Code that runs on application startup + + } + + void Application_End(object sender, EventArgs e) + { + // Code that runs on application shutdown + + } + + void Application_Error(object sender, EventArgs e) + { + // Code that runs when an unhandled error occurs + + } + + void Session_Start(object sender, EventArgs e) + { + // Code that runs when a new session is started + + } + + void Session_End(object sender, EventArgs e) + { + // Code that runs when a session ends. + // Note: The Session_End event is raised only when the sessionstate mode + // is set to InProc in the Web.config file. If session mode is set to StateServer + // or SQLServer, the event is not raised. + + } + + void Application_EndRequest(object sender, EventArgs e) + { + + } + + void Application_BeginRequest(object sender, EventArgs e) + { + //System.Diagnostics.Debugger.Break(); + if (HttpContext.Current.Request.Path == "/read.aspx") + { + // Signaler + //TODO: fix this +// SessionTests.mtxReader = new ManualResetEvent(false); + // SessionTests.WaitSyncCreation(true); + } + else if (HttpContext.Current.Request.Path == "/write.aspx") + { + // SessionTests.mtxWriter = new ManualResetEvent(false); + } + } + } +} diff --git a/Tests/MySql.Web.Tests/SessionLocking/InitSessionLocking.aspx b/MySql.Web/tests/SessionLocking/InitSessionLocking.aspx similarity index 100% rename from Tests/MySql.Web.Tests/SessionLocking/InitSessionLocking.aspx rename to MySql.Web/tests/SessionLocking/InitSessionLocking.aspx diff --git a/MySql.Web/tests/SessionLocking/InitSessionLocking.aspx.cs b/MySql.Web/tests/SessionLocking/InitSessionLocking.aspx.cs new file mode 100644 index 000000000..b4ab197ad --- /dev/null +++ b/MySql.Web/tests/SessionLocking/InitSessionLocking.aspx.cs @@ -0,0 +1,48 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +// This code was contributed by Sean Wright (srwright@alcor.concordia.ca) on 2007-01-12 +// The copyright was assigned and transferred under the terms of +// the MySQL Contributor License Agreement (CLA) + +using System; +using System.Collections.Generic; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +namespace MySql.Web.Tests.SessionLocking +{ + public partial class InitSessionLocking : System.Web.UI.Page + { + protected void Page_Load(object sender, EventArgs e) + { + + } + } +} diff --git a/Tests/MySql.Web.Tests/SessionLocking/InitSessionLocking.aspx.designer.cs b/MySql.Web/tests/SessionLocking/InitSessionLocking.aspx.designer.cs similarity index 96% rename from Tests/MySql.Web.Tests/SessionLocking/InitSessionLocking.aspx.designer.cs rename to MySql.Web/tests/SessionLocking/InitSessionLocking.aspx.designer.cs index 5bb831374..c15fda308 100644 --- a/Tests/MySql.Web.Tests/SessionLocking/InitSessionLocking.aspx.designer.cs +++ b/MySql.Web/tests/SessionLocking/InitSessionLocking.aspx.designer.cs @@ -1,26 +1,26 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace MySql.Web.Tests.SessionLocking -{ - - - public partial class InitSessionLocking - { - - /// - /// form1 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.HtmlControls.HtmlForm form1; - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace MySql.Web.Tests.SessionLocking +{ + + + public partial class InitSessionLocking + { + + /// + /// form1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlForm form1; + } +} diff --git a/Tests/MySql.Web.Tests/SessionLocking/Web.config b/MySql.Web/tests/SessionLocking/Web.config similarity index 100% rename from Tests/MySql.Web.Tests/SessionLocking/Web.config rename to MySql.Web/tests/SessionLocking/Web.config diff --git a/Tests/MySql.Web.Tests/SessionLocking/read.aspx b/MySql.Web/tests/SessionLocking/read.aspx similarity index 100% rename from Tests/MySql.Web.Tests/SessionLocking/read.aspx rename to MySql.Web/tests/SessionLocking/read.aspx diff --git a/MySql.Web/tests/SessionLocking/read.aspx.cs b/MySql.Web/tests/SessionLocking/read.aspx.cs new file mode 100644 index 000000000..fe2865af1 --- /dev/null +++ b/MySql.Web/tests/SessionLocking/read.aspx.cs @@ -0,0 +1,52 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +// This code was contributed by Sean Wright (srwright@alcor.concordia.ca) on 2007-01-12 +// The copyright was assigned and transferred under the terms of +// the MySQL Contributor License Agreement (CLA) + +using System; +using System.Collections.Generic; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Threading; +using MySql.Web.Tests; + +namespace MySql.Web.Tests +{ + public partial class read : System.Web.UI.Page + { + protected void Page_Load(object sender, EventArgs e) + { + object o = Session["x"]; + // Signaler +// SessionTests.mtxReader.Set(); + } + } +} diff --git a/Tests/MySql.Web.Tests/SessionLocking/read.aspx.designer.cs b/MySql.Web/tests/SessionLocking/read.aspx.designer.cs similarity index 96% rename from Tests/MySql.Web.Tests/SessionLocking/read.aspx.designer.cs rename to MySql.Web/tests/SessionLocking/read.aspx.designer.cs index fe385e6b1..44778047d 100644 --- a/Tests/MySql.Web.Tests/SessionLocking/read.aspx.designer.cs +++ b/MySql.Web/tests/SessionLocking/read.aspx.designer.cs @@ -1,24 +1,24 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace MySql.Web.Tests { - - - public partial class read { - - /// - /// form1 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.HtmlControls.HtmlForm form1; - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace MySql.Web.Tests { + + + public partial class read { + + /// + /// form1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlForm form1; + } +} diff --git a/Tests/MySql.Web.Tests/SessionLocking/web_config_src.txt b/MySql.Web/tests/SessionLocking/web_config_src.txt similarity index 100% rename from Tests/MySql.Web.Tests/SessionLocking/web_config_src.txt rename to MySql.Web/tests/SessionLocking/web_config_src.txt diff --git a/Tests/MySql.Web.Tests/SessionLocking/write.aspx b/MySql.Web/tests/SessionLocking/write.aspx similarity index 100% rename from Tests/MySql.Web.Tests/SessionLocking/write.aspx rename to MySql.Web/tests/SessionLocking/write.aspx diff --git a/MySql.Web/tests/SessionLocking/write.aspx.cs b/MySql.Web/tests/SessionLocking/write.aspx.cs new file mode 100644 index 000000000..0d0b2bc1a --- /dev/null +++ b/MySql.Web/tests/SessionLocking/write.aspx.cs @@ -0,0 +1,54 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +// This code was contributed by Sean Wright (srwright@alcor.concordia.ca) on 2007-01-12 +// The copyright was assigned and transferred under the terms of +// the MySQL Contributor License Agreement (CLA) + +using System; +using System.Collections.Generic; +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; +using System.Threading; +using MySql.Web.Tests; + +namespace MySql.Web.Tests +{ + public partial class write : System.Web.UI.Page + { + protected void Page_Load(object sender, EventArgs e) + { + // Make session dirty +// Session["x"] = "x"; + + // SessionTests.mtxWriter.Set(); + // SessionTests.WaitSyncCreation( false ); + } + } +} diff --git a/Tests/MySql.Web.Tests/SessionLocking/write.aspx.designer.cs b/MySql.Web/tests/SessionLocking/write.aspx.designer.cs similarity index 96% rename from Tests/MySql.Web.Tests/SessionLocking/write.aspx.designer.cs rename to MySql.Web/tests/SessionLocking/write.aspx.designer.cs index b73b0eea1..1035ebd07 100644 --- a/Tests/MySql.Web.Tests/SessionLocking/write.aspx.designer.cs +++ b/MySql.Web/tests/SessionLocking/write.aspx.designer.cs @@ -1,24 +1,24 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace MySql.Web.Tests { - - - public partial class write { - - /// - /// form1 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.HtmlControls.HtmlForm form1; - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace MySql.Web.Tests { + + + public partial class write { + + /// + /// form1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlForm form1; + } +} diff --git a/Tests/MySql.Web.Tests/SessionLocking/write2.aspx b/MySql.Web/tests/SessionLocking/write2.aspx similarity index 100% rename from Tests/MySql.Web.Tests/SessionLocking/write2.aspx rename to MySql.Web/tests/SessionLocking/write2.aspx diff --git a/MySql.Web/tests/SessionLocking/write2.aspx.cs b/MySql.Web/tests/SessionLocking/write2.aspx.cs new file mode 100644 index 000000000..54a33c439 --- /dev/null +++ b/MySql.Web/tests/SessionLocking/write2.aspx.cs @@ -0,0 +1,51 @@ +// Copyright © 2004, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +// This code was contributed by Sean Wright (srwright@alcor.concordia.ca) on 2007-01-12 +// The copyright was assigned and transferred under the terms of +// the MySQL Contributor License Agreement (CLA) + +using System; +using System.Collections.Generic; +#if CLR4 + +#endif +using System.Web; +using System.Web.UI; +using System.Web.UI.WebControls; + +namespace MySql.Web.Tests +{ + public partial class write2 : System.Web.UI.Page + { + protected void Page_Load(object sender, EventArgs e) + { + Session["x"] = "x2"; + } + } +} diff --git a/Tests/MySql.Web.Tests/SessionLocking/write2.aspx.designer.cs b/MySql.Web/tests/SessionLocking/write2.aspx.designer.cs similarity index 96% rename from Tests/MySql.Web.Tests/SessionLocking/write2.aspx.designer.cs rename to MySql.Web/tests/SessionLocking/write2.aspx.designer.cs index 5c0052461..b545ee60b 100644 --- a/Tests/MySql.Web.Tests/SessionLocking/write2.aspx.designer.cs +++ b/MySql.Web/tests/SessionLocking/write2.aspx.designer.cs @@ -1,24 +1,24 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace MySql.Web.Tests { - - - public partial class write2 { - - /// - /// form1 control. - /// - /// - /// Auto-generated field. - /// To modify move field declaration from designer file to code-behind file. - /// - protected global::System.Web.UI.HtmlControls.HtmlForm form1; - } -} +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace MySql.Web.Tests { + + + public partial class write2 { + + /// + /// form1 control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.HtmlControls.HtmlForm form1; + } +} diff --git a/Tests/MySql.Web.Tests/SessionLockingBuild.bat b/MySql.Web/tests/SessionLockingBuild.bat similarity index 100% rename from Tests/MySql.Web.Tests/SessionLockingBuild.bat rename to MySql.Web/tests/SessionLockingBuild.bat diff --git a/MySql.Web/tests/SessionTests.cs b/MySql.Web/tests/SessionTests.cs new file mode 100644 index 000000000..b147fea74 --- /dev/null +++ b/MySql.Web/tests/SessionTests.cs @@ -0,0 +1,382 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySql.Web.SessionState; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Specialized; +using System.Configuration; +using System.Diagnostics; +using System.IO; +using System.Net; +using System.Threading; +using System.Web.SessionState; + +namespace MySql.Web.Tests +{ + public class SessionTests : WebTestBase + { + private string strSessionID { get; set; } + private string calledId { get; set; } + private AutoResetEvent _evt { get; set; } + + private byte[] Serialize(SessionStateItemCollection items) + { + MemoryStream ms = new MemoryStream(); + BinaryWriter writer = new BinaryWriter(ms); + if (items != null) + { + items.Serialize(writer); + } + writer.Close(); + return ms.ToArray(); + } + + + private void CreateSessionData(int AppId, DateTime timeCreated) + { + MySqlCommand cmd = new MySqlCommand(); + strSessionID = System.Guid.NewGuid().ToString(); + + //DateTime now = DateTime.Now; + //DateTime lastHour = now.Subtract(new TimeSpan(1, 0, 0)); + + SessionStateItemCollection collection = new SessionStateItemCollection(); + collection["FirstName"] = "Some"; + collection["LastName"] = "Name"; + byte[] items = Serialize(collection); + + string sql = @"INSERT INTO my_aspnet_sessions VALUES ( + @sessionId, @appId, @created, @expires, @lockdate, @lockid, @timeout, + @locked, @items, @flags)"; + + cmd = new MySqlCommand(sql, Connection); + cmd.Parameters.AddWithValue("@sessionId", strSessionID); + cmd.Parameters.AddWithValue("@appId", AppId); + cmd.Parameters.AddWithValue("@created", timeCreated); + cmd.Parameters.AddWithValue("@expires", timeCreated); + cmd.Parameters.AddWithValue("@lockdate", timeCreated); + cmd.Parameters.AddWithValue("@lockid", 1); + cmd.Parameters.AddWithValue("@timeout", 1); + cmd.Parameters.AddWithValue("@locked", 0); + cmd.Parameters.AddWithValue("@items", items); + cmd.Parameters.AddWithValue("@flags", 0); + cmd.ExecuteNonQuery(); + + //create new row on sessioncleanup table + cmd.CommandText = "INSERT IGNORE INTO my_aspnet_sessioncleanup SET" + + " ApplicationId = @ApplicationId, " + + " LastRun = NOW(), " + + " IntervalMinutes = 10"; + cmd.Parameters.Clear(); + cmd.Parameters.AddWithValue("@ApplicationId", AppId); + cmd.ExecuteNonQuery(); + + // set our last run table to 1 hour ago + cmd.CommandText = "UPDATE my_aspnet_sessioncleanup SET LastRun=@lastHour WHERE ApplicationId = @ApplicationId"; + cmd.Parameters.Clear(); + cmd.Parameters.AddWithValue("@lastHour", DateTime.Now.Subtract(new TimeSpan(1, 0, 0))); + cmd.Parameters.AddWithValue("@ApplicationId", AppId); + cmd.ExecuteNonQuery(); + } + + + private void SetSessionItemExpiredCallback(bool includeCallback) + { + _evt = new AutoResetEvent(false); + calledId = null; + + CreateSessionData(1, DateTime.Now.Subtract(new TimeSpan(1, 0, 0))); + + MySqlSessionStateStore session = new MySqlSessionStateStore(); + + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("applicationName", "/"); + config.Add("enableExpireCallback", includeCallback ? "true" : "false"); + session.Initialize("SessionProvTest", config); + if (includeCallback) session.SetItemExpireCallback(expireCallback); + Thread.Sleep(1000); + session.Dispose(); + } + + private long CountSessions() + { + return (long)MySqlHelper.ExecuteScalar(Connection, "SELECT COUNT(*) FROM my_aspnet_sessions"); + } + + public void expireCallback(string id, SessionStateStoreData item) + { + calledId = id; + _evt.Set(); + } + + + [Test] + public void SessionItemWithExpireCallback() + { + execSQL(@"delete from my_aspnet_sessions; + delete from my_aspnet_sessioncleanup;"); + SetSessionItemExpiredCallback(true); + _evt.WaitOne(); + + Assert.That(calledId, Is.EqualTo(strSessionID)); + + int i = 0; + while (((long)CountSessions() != 0) && (i < 10)) + { + Thread.Sleep(500); + i++; + } + + Assert.That(CountSessions(), Is.EqualTo(0)); + } + + + [Test] + public void SessionItemWithoutExpireCallback() + { + execSQL(@"delete from my_aspnet_sessions; + delete from my_aspnet_sessioncleanup;"); + SetSessionItemExpiredCallback(false); + Assert.That(calledId, Is.Not.EqualTo(strSessionID)); + + int i = 0; + while (((long)MySqlHelper.ExecuteScalar(Connection, "SELECT Count(*) FROM my_aspnet_sessions;") != 0) && (i < 10)) + { + Thread.Sleep(500); + i++; + } + + Assert.That(CountSessions(), Is.EqualTo(0)); + } + + [Test] + public void DeleteSessionAppSpecific() + { + // create two sessions of different appId + // it should delete only 1 + CreateSessionData(1, DateTime.Now.Subtract(new TimeSpan(1, 10, 0))); + CreateSessionData(2, DateTime.Now.Subtract(new TimeSpan(1, 0, 0))); + + MySqlSessionStateStore session = new MySqlSessionStateStore(); + + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("applicationName", "/"); + config.Add("enableExpireCallback", "false"); + session.Initialize("SessionTests", config); + + int i = 0; + while (CountSessions() == 2 && (i < 10)) + { + Thread.Sleep(500); + i++; + } + + session.Dispose(); + Assert.That(CountSessions(), Is.EqualTo(1)); + session.Dispose(); + } + + public class ThreadRequestData + { + public string pageName; + public ManualResetEvent signal; + public bool FirstDateToUpdate; + } + + delegate WebResponse GetResponse(); + delegate void ThreadRequest(ThreadRequestData data); + + [Ignore("Fix Me")] + public void SessionLocking() + { + // Copy updated configuration file for web server process + Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); + ConnectionStringSettings css = config.ConnectionStrings.ConnectionStrings["LocalMySqlServer"]; + string curDir = Directory.GetCurrentDirectory(); + string webconfigPath = string.Format(@"{0}\SessionLocking\{1}", Directory.GetCurrentDirectory(), @"web.config"); + string webconfigPathSrc = string.Format(@"{0}\SessionLocking\{1}", Directory.GetCurrentDirectory(), @"web_config_src.txt"); + + string text = File.ReadAllText(webconfigPathSrc); + text = text.Replace("connection_string_here", css.ConnectionString); + Version ver = System.Environment.Version; + if (ver.Major != 4) + { + text = text.Replace("", ""); + } + + File.WriteAllText(webconfigPath, text); + + int port = 12224; + + string webserverPath; + if (ver.Major == 4) + { + webserverPath = @"C:\Program Files (x86)\Common Files\microsoft shared\DevServer\10.0\WebDev.WebServer40.exe"; + } + else + { + webserverPath = @"C:\Program Files (x86)\Common Files\microsoft shared\DevServer\9.0\WebDev.WebServer.exe"; + } + string webserverArgs = string.Format(" /port:{0} /path:{1}\\SessionLocking", port, + Path.GetFullPath(@".")); + + DirectoryInfo di = new DirectoryInfo(Path.GetFullPath(curDir)); + Directory.CreateDirectory(Path.GetFullPath(@".\SessionLocking\bin")); + foreach (FileInfo fi in di.GetFiles("*.dll")) + { + File.Copy(fi.FullName, Path.Combine(Path.GetFullPath(@".\SessionLocking\bin\"), fi.Name), true); + } + + Process webserver = Process.Start(webserverPath, webserverArgs); + System.Threading.Thread.Sleep(2000); + + // This dummy request is just to get the ASP.NET sessionid to reuse. + HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:12224/InitSessionLocking.aspx"); + HttpWebResponse res = (HttpWebResponse)req.GetResponse(); + WebHeaderCollection headers = new WebHeaderCollection(); + + string url = res.ResponseUri.ToString().Replace("InitSessionLocking.aspx", ""); + Debug.Write(url); + + try + { + DateTime? firstDt = null; + DateTime? secondDt = null; + + ManualResetEvent[] re = new ManualResetEvent[2]; + re[0] = new ManualResetEvent(false); + re[1] = new ManualResetEvent(false); + ParameterizedThreadStart ts = + (object data1) => + { + ThreadRequestData data = (ThreadRequestData)data1; + Debug.WriteLine(string.Format("Requesting {0}", data.pageName)); + try + { + HttpWebRequest req1 = + (HttpWebRequest)WebRequest.Create(string.Format(@"{0}{1}", url, data.pageName)); + req1.Timeout = 2000000; + WebResponse res1 = req1.GetResponse(); + Debug.WriteLine(string.Format("Response from {0}", data.pageName)); + Stream s = res1.GetResponseStream(); + while (s.ReadByte() != -1) + ; + res1.Close(); + if (data.FirstDateToUpdate) + { + firstDt = DateTime.Now; + } + else + { + secondDt = DateTime.Now; + } + } + catch (Exception e) + { + Debug.WriteLine(string.Format("Server error: {0}", e.ToString())); + throw; + } + finally + { + data.signal.Set(); + } + }; + + Thread t = new Thread(ts); + Thread t2 = new Thread(ts); + t.Start(new ThreadRequestData() + { + pageName = "write.aspx", + FirstDateToUpdate = true, + signal = re[0] + }); + t2.Start(new ThreadRequestData() + { + pageName = "read.aspx", + FirstDateToUpdate = false, + signal = re[1] + }); + WaitHandle.WaitAll(re); + re[0].Reset(); + Thread t3 = new Thread(ts); + t3.Start(new ThreadRequestData() + { + pageName = "write2.aspx", + FirstDateToUpdate = false, + signal = re[0] + }); + WaitHandle.WaitAll(re); + double totalMillisecs = Math.Abs((secondDt.Value - firstDt.Value).TotalMilliseconds); + // OK if wait is less than session timeout + Debug.WriteLine(string.Empty); + Debug.WriteLine(totalMillisecs); + Assert.That(totalMillisecs < 30000); + } + finally + { + webserver.Kill(); + } + } + + public volatile static ManualResetEvent mtxReader = null; + public volatile static ManualResetEvent mtxWriter = null; + + public static void WaitSyncCreation(bool writer) + { + if (writer) + { + while (true) + { + if (mtxWriter == null) + Thread.Sleep(100); + else + break; + } + mtxWriter.WaitOne(); + } + else + { + while (true) + { + if (mtxReader == null) + Thread.Sleep(100); + else + break; + } + mtxReader.WaitOne(); + } + } + + + } +} diff --git a/MySql.Web/tests/SimpleMembership.cs b/MySql.Web/tests/SimpleMembership.cs new file mode 100644 index 000000000..da2b09a37 --- /dev/null +++ b/MySql.Web/tests/SimpleMembership.cs @@ -0,0 +1,229 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySql.Web.Security; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Specialized; +using System.Web.Security; + +namespace MySql.Web.Tests +{ + public class SimpleMembership : WebTestBase + { + private readonly string _userTable = "UserProfile"; + private readonly string _userIdColumn = "UserId"; + private readonly string _userNameColumn = "UserName"; + private readonly string _userName = "New User"; + private readonly string _pass = "password"; + private MySqlSimpleMembershipProvider _simpleProvider; + private MySqlSimpleRoleProvider _simpleRoleProvider; + + public SimpleMembership() + { + _simpleProvider = new MySqlSimpleMembershipProvider(); + _simpleRoleProvider = new MySqlSimpleRoleProvider(); + + var _config = new NameValueCollection(); + _config.Add("connectionStringName", "LocalMySqlServer"); + _config.Add("userTableName", "UserProfile"); + _config.Add("userIdColumn", "UserId"); + _config.Add("userNameColumn", "UserName"); + + _simpleProvider.Initialize("Test", _config); + _simpleRoleProvider.Initialize("TestRoleProvider", _config); + + MySqlWebSecurity.InitializeDatabaseConnection(ConnectionString, "MySqlSimpleMembership", _userTable, _userIdColumn, _userNameColumn, true, true); + } + + [TearDown] + public void Cleanup() + { + execSQL(@"delete from userprofile; + delete from webpages_membership;"); + } + + [Test] + public void CheckIfRoleNotExists() + { + var roleExists = _simpleRoleProvider.RoleExists("roleName"); + Assert.That(!roleExists); + } + + [Test] + public void CheckIfRoleExists() + { + if (!Roles.RoleExists("Administrator")) + { + _simpleRoleProvider.CreateRole("Administrator"); + var roleExists = _simpleRoleProvider.RoleExists("Administrator"); + Assert.That(roleExists); + } + } + + [Test] + public void CreateUserAndAccountTest() + { + MySqlWebSecurity.CreateUserAndAccount(_userName, _pass); + Assert.That(MySqlWebSecurity.UserExists(_userName)); + var user = MySqlHelper.ExecuteDataRow(ConnectionString, string.Format("select * from {0} where {1} = '{2}'", _userTable, _userNameColumn, _userName)); + Assert.That(user, Is.Not.Null); + Assert.That(user[_userNameColumn], Is.EqualTo(_userName)); + + Assert.That(_simpleProvider.ValidateUser(_userName, _pass)); + //We need to mock the login because in that method there is a call to "FormsAuthentication.SetAuthCookie" which causes an "Object reference not set to an instance of an object" exception, because the test doesn't run on web application context + //Assert.True(MySqlWebSecurity.Login(_userName, _pass)); + } + + //We need to mock this test because there is no data on Membership object, there is no user available because login doesn't add it to the context + //[Test] + public void ChangePasswordTest() + { + string newPass = "newpassword"; + MySqlWebSecurity.CreateUserAndAccount(_userName, _pass); + Assert.That(MySqlWebSecurity.UserExists(_userName)); + + //We need to mock the login because in that method there is a call to "FormsAuthentication.SetAuthCookie" which causes an "Object reference not set to an instance of an object" exception, because the test doesn't run on web application context + + Assert.That(_simpleProvider.ValidateUser(_userName, _pass)); + //Assert.True(MySqlWebSecurity.Login(_userName, _pass)); + + Assert.That(MySqlWebSecurity.ChangePassword(_userName, _pass, newPass)); + + Assert.That(_simpleProvider.ValidateUser(_userName, newPass)); + //Assert.True(MySqlWebSecurity.Login(_userName, newPass)); + } + + [Test] + public void ConfirmAccountWithTokenTest() + { + var token = MySqlWebSecurity.CreateUserAndAccount(_userName, _pass, null, true); + Assert.That(MySqlWebSecurity.UserExists(_userName)); + Assert.That(MySqlWebSecurity.ConfirmAccount(token)); + } + + [Test] + public void ConfirmAccountWithUserAndTokenTest() + { + var token = MySqlWebSecurity.CreateUserAndAccount(_userName, _pass, null, true); + Assert.That(MySqlWebSecurity.UserExists(_userName)); + Assert.That(MySqlWebSecurity.ConfirmAccount(_userName, token)); + } + + [Test] + public void ConfirmAccountWithoutTokenTest() + { + var token = "falsetoken"; + MySqlWebSecurity.CreateUserAndAccount(_userName, _pass); + Assert.That(MySqlWebSecurity.UserExists(_userName)); + Assert.That(!MySqlWebSecurity.ConfirmAccount(token)); + } + + [Test] + public void CreatedDateTest() + { + execSQL(@"delete from userprofile; + delete from webpages_membership;"); + MySqlWebSecurity.CreateUserAndAccount(_userName, _pass); + Assert.That(MySqlWebSecurity.GetCreateDate(_userName), Is.Not.EqualTo(DateTime.MinValue)); + } + + [Test] + public void DeleteTest() + { + _simpleProvider.CreateUserAndAccount(_userName, _pass, false, null); + Assert.That(_simpleProvider.DeleteAccount(_userName)); + _simpleProvider.CreateAccount(_userName, _pass, false); + Assert.That(_simpleProvider.DeleteUser(_userName, true)); + } + + [Test] + public void UserIsConfirmedTest() + { + MySqlWebSecurity.CreateUserAndAccount(_userName, _pass, null, true); + Assert.That(!MySqlWebSecurity.IsConfirmed(_userName)); + } + + [Test] + public void UserIsLockedOutTest() + { + MySqlWebSecurity.CreateUserAndAccount(_userName, _pass, null, true); + Assert.That(!MySqlWebSecurity.IsAccountLockedOut(_userName, 5, 60)); + } + + [Test] + public void PasswordTest() + { + MySqlWebSecurity.CreateUserAndAccount(_userName, _pass); + Assert.That(MySqlWebSecurity.GetLastPasswordFailureDate(_userName), Is.EqualTo(DateTime.MinValue)); + Assert.That(MySqlWebSecurity.GetPasswordChangedDate(_userName), Is.Not.EqualTo(DateTime.MinValue)); + Assert.That(MySqlWebSecurity.GetPasswordFailuresSinceLastSuccess(_userName), Is.EqualTo(0)); + } + + //Password reset token must be assigned to the user but that field is not added in any part of the code, so maybe that field must be handled manually by the user + // should we handle this functionality? WebMatrix.WebData.SimpleMembershipProvider doesn't handle it + [Ignore("Fix Me")] + public void PasswordResetTokenTest() + { + var token = MySqlWebSecurity.CreateUserAndAccount(_userName, _pass, null, true); + int userID = MySqlWebSecurity.GetUserId(_userName); + Assert.That(MySqlWebSecurity.ConfirmAccount(token)); + var newToken = MySqlWebSecurity.GeneratePasswordResetToken(_userName, 1440); + Assert.That(newToken, Is.Not.EqualTo(null)); + Assert.That(userID, Is.EqualTo(MySqlWebSecurity.GetUserIdFromPasswordResetToken(newToken))); + } + + #region WL14389 + [TestCase(1, "Waren", null)] + [TestCase(2, "Bill", false)] + [TestCase(3, "Steve", true)] + public void CreateUserAccountWithAttributes(int id, string userN, bool? token) + { + //Bug25046364 + switch (token) + { + case null: + MySqlWebSecurity.CreateUserAndAccount(userN, _pass, new {UserId = id, UserName = userN}); + break; + + default: + MySqlWebSecurity.CreateUserAndAccount(userN, _pass, new { UserId = id, UserName = userN }, (bool)token); + break; + } + + Assert.That(MySqlWebSecurity.UserExists(userN)); + var user = MySqlHelper.ExecuteDataRow(ConnectionString, string.Format("select * from {0} where {1} = '{2}'", _userTable, _userNameColumn, userN)); + Assert.That(user, Is.Not.Null); + Assert.That(user[_userNameColumn], Is.EqualTo(userN)); + } + #endregion + + } +} diff --git a/MySql.Web/tests/SiteMapTests.cs b/MySql.Web/tests/SiteMapTests.cs new file mode 100644 index 000000000..1cde4f895 --- /dev/null +++ b/MySql.Web/tests/SiteMapTests.cs @@ -0,0 +1,119 @@ +// Copyright © 2014, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySql.Web.SiteMap; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Specialized; +using System.IO; +using System.Web; +using System.Web.Hosting; + +namespace MySql.Web.Tests +{ + public class SiteMapTests : WebTestBase + { + private void PopulateSiteMapTable() + { + string sql = @" + insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentId ) values ( 1, 'Index', 'The Index page', '~/Index.aspx', null, null ); + insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentId ) values ( 2, 'Chess Openings', 'Collection of Chess openings articles', '~/Openings.aspx', null, 1 ); + insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentId ) values ( 3, 'King''s Gambit', 'The hyper sharp King''s Gambit', '~/Openings/KingsGambit.aspx', null, 2 ); + insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentId ) values ( 4, 'Ruy Lopez', 'The spanish opening', '~/RuyLopez.aspx', null, 2 ); + insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentId ) values ( 5, 'Evan''s Gambit', 'The Funny Italian Game', '~/EvansGambit.aspx', null, 2 ); + insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentId ) values ( 6, 'Sicilian Defense', 'Sharp Double Edge Defense', '~/Sicilian.aspx', null, 2 ); + insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentId ) values ( 7, 'Middle Game', 'Middle Game Topics', '~/MiddleGame.aspx', null, 1 ); + insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentId ) values ( 8, 'Isolated Queen Pawn', 'Isolani Typical Positions', '~/Isolani.aspx', null, 7 ); + insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentId ) values ( 9, 'Rook vs Two Minor pieces', 'Rook vs Two Minor Pieces', '~/RookVsTwoMinor.aspx', null, 7 ); + insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentID ) values (10, 'Exchange Sacrifice', 'Sacrifice of Rook per Bishop or Knight', '~/ExchangeSacrifice.aspx', null, 7 ); + insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentID ) values (11, 'Nd5 Sacrifice in Sicilian', 'Sacrifice Nc3-Nd5 against Schevening like structures', '~/Nd5SacSicilian.aspx', null, 7 ); + insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentID ) values (12, 'Endings', 'Theory of chess endings & practical endings', '~/Endings.aspx', null, 1 ); + insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentID ) values (13, 'Rook Endings', 'Rook Endings', '~/RookEndigs.aspx', null, 12 ); + insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentID ) values (14, 'Queen vs Rook', 'Queen vs Rook, pawnless endings', '~/QueenVsRook.aspx ', null, 12 ); + insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentID ) values (15, 'Isolated Queen Pawn Ending', 'Endings with queen pawn isolated', '~/IQPending.aspx', null, 12 ); + "; + MySqlScript script = new MySqlScript(Connection, sql); + script.Execute(); + } + + [Test] + public void TestBuildSiteMap() + { + PopulateSiteMapTable(); + + MySqlSiteMapProvider prov = new MySqlSiteMapProvider(); + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("applicationName", "/"); + config.Add("enableExpireCallback", "false"); + + prov.Initialize("SiteMapTests", config); + prov.BuildSiteMap(); + SiteMapNode node = prov.FindSiteMapNodeFromKey("5"); + SimpleWorkerRequest req = new SimpleWorkerRequest("/dummy", Environment.CurrentDirectory, "default.aspx", null, new StringWriter()); + HttpContext.Current = new HttpContext(req); + + Assert.That("Evan's Gambit", Is.EqualTo(node.Title)); + SiteMapNode nodep = prov.GetParentNode(node); + Assert.That("The Funny Italian Game", Is.EqualTo(node.Description)); + Assert.That(!node.HasChildNodes); + SiteMapNode node2 = node.NextSibling; + Assert.That(node2, Is.Not.Null); + Assert.That("Sicilian Defense", Is.EqualTo(node2.Title)); + Assert.That("Sharp Double Edge Defense", Is.EqualTo(node2.Description)); + + node = node.PreviousSibling; + Assert.That(node, Is.Not.Null); + Assert.That("Ruy Lopez", Is.EqualTo(node.Title)); + Assert.That("The spanish opening", Is.EqualTo(node.Description)); + Assert.That(!node.HasChildNodes); + Assert.That(node.NextSibling, Is.Not.Null); + + node = node.ParentNode; + Assert.That("Chess Openings", Is.EqualTo(node.Title)); + + node = node.ParentNode; + Assert.That("Index", Is.EqualTo(node.Title)); + + node = node.ParentNode; + Assert.That(node, Is.Null); + + node = prov.RootNode; + Assert.That("Index", Is.EqualTo(node.Title)); + string[] childData = new string[] { "Chess Openings", "Middle Game", "Endings" }; + + for (int i = 0; i < node.ChildNodes.Count; i++) + { + SiteMapNode child = node.ChildNodes[i]; + Assert.That(childData[i], Is.EqualTo(child.Title)); + } + } + } +} diff --git a/MySql.Web/tests/TestProfile.cs b/MySql.Web/tests/TestProfile.cs new file mode 100644 index 000000000..92a352b2b --- /dev/null +++ b/MySql.Web/tests/TestProfile.cs @@ -0,0 +1,67 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using System.Web.Profile; +using System.Web.Security; + +namespace MySql.Web.Tests +{ + public class TestProfile : ProfileBase + { + public static TestProfile GetUserProfile(string username, bool auth) + { + return Create(username, auth) as TestProfile; + } + + public static TestProfile GetUserProfile(bool auth) + { + return Create(Membership.GetUser().UserName, auth) as TestProfile; + } + + [SettingsAllowAnonymous(false)] + public string Description + { + get { return base["Description"] as string; } + set { base["Description"] = value; } + } + + [SettingsAllowAnonymous(false)] + public string Location + { + get { return base["Location"] as string; } + set { base["Location"] = value; } + } + + [SettingsAllowAnonymous(false)] + public string FavoriteMovie + { + get { return base["FavoriteMovie"] as string; } + set { base["FavoriteMovie"] = value; } + } + } +} diff --git a/MySql.Web/tests/UserManagement.cs b/MySql.Web/tests/UserManagement.cs new file mode 100644 index 000000000..cd79da523 --- /dev/null +++ b/MySql.Web/tests/UserManagement.cs @@ -0,0 +1,826 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.MySqlClient; +using MySql.Web.Security; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Collections.Specialized; +using System.Configuration.Provider; +using System.Data; +using System.Web.Security; + +namespace MySql.Web.Tests +{ + public class UserManagement : WebTestBase + { + private MySQLMembershipProvider provider { get; set; } + + private void CreateUserWithFormat(MembershipPasswordFormat format) + { + provider = new MySQLMembershipProvider(); + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("applicationName", "/"); + config.Add("passwordStrengthRegularExpression", "bar.*"); + config.Add("passwordFormat", format.ToString()); + provider.Initialize(null, config); + + // create the user + MembershipCreateStatus status; + provider.CreateUser("foo", "barbar!", "foo@bar.com", null, null, true, null, out status); + Assert.That(status, Is.EqualTo(MembershipCreateStatus.Success)); + + // verify that the password format is hashed. + DataTable table = FillTable("SELECT * FROM my_aspnet_membership"); + MembershipPasswordFormat rowFormat = + (MembershipPasswordFormat)Convert.ToInt32(table.Rows[0]["PasswordFormat"]); + Assert.That(rowFormat, Is.EqualTo(format)); + + // then attempt to verify the user + Assert.That(provider.ValidateUser("foo", "barbar!")); + + } + + [Test] + public void CreateUserWithHashedPassword() + { + CreateUserWithFormat(MembershipPasswordFormat.Hashed); + //Cleanup + provider.DeleteUser("foo", true); + } + + [Test] + public void CreateUserWithEncryptedPasswordWithAutoGenKeys() + { + //TODO check this test logic + try + { + CreateUserWithFormat(MembershipPasswordFormat.Encrypted); + } + catch (ProviderException) + { + } + //Cleanup + provider.DeleteUser("foo", true); + } + + [Test] + public void CreateUserWithClearPassword() + { + CreateUserWithFormat(MembershipPasswordFormat.Clear); + //Cleanup + provider.DeleteUser("foo", true); + } + + /// + /// Bug #34792 New User/Changing Password Validation Not working. + /// + [Test] + public void ChangePassword() + { + CreateUserWithFormat(MembershipPasswordFormat.Hashed); + ArgumentException ex = Assert.Throws(() => provider.ChangePassword("foo", "barbar!", "bar2")); + + Assert.That(ex.ParamName, Is.EqualTo("newPassword")); + Assert.That(ex.Message.Contains("length of parameter")); + ArgumentException ex1 = Assert.Throws(() => provider.ChangePassword("foo", "barbar!", "barbar2")); + Assert.That(ex1.ParamName, Is.EqualTo("newPassword")); + Assert.That(ex1.Message.Contains("alpha numeric")); + + // now test regex strength testing + bool result = provider.ChangePassword("foo", "barbar!", "zzzxxx!"); + Assert.That(!result); + + // now do one that should work + result = provider.ChangePassword("foo", "barbar!", "barfoo!"); + Assert.That(result); + + provider.ValidateUser("foo", "barfoo!"); + + //Cleanup + provider.DeleteUser("foo", true); + } + + /// + /// Bug #34792 New User/Changing Password Validation Not working. + /// + [Test] + public void CreateUserWithErrors() + { + provider = new MySQLMembershipProvider(); + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("applicationName", "/"); + config.Add("passwordStrengthRegularExpression", "bar.*"); + config.Add("passwordFormat", "Hashed"); + provider.Initialize(null, config); + + // first try to create a user with a password not long enough + MembershipCreateStatus status; + MembershipUser user = provider.CreateUser("foo", "xyz", + "foo@bar.com", null, null, true, null, out status); + Assert.That(user, Is.Null); + Assert.That(status, Is.EqualTo(MembershipCreateStatus.InvalidPassword)); + + // now with not enough non-alphas + user = provider.CreateUser("foo", "xyz1234", + "foo@bar.com", null, null, true, null, out status); + Assert.That(user, Is.Null); + Assert.That(status, Is.EqualTo(MembershipCreateStatus.InvalidPassword)); + + // now one that doesn't pass the regex test + user = provider.CreateUser("foo", "xyzxyz!", + "foo@bar.com", null, null, true, null, out status); + Assert.That(user, Is.Null); + Assert.That(status, Is.EqualTo(MembershipCreateStatus.InvalidPassword)); + + // now one that works + user = provider.CreateUser("foo", "barbar!", + "foo@bar.com", null, null, true, null, out status); + Assert.That(user, Is.Not.Null); + Assert.That(status, Is.EqualTo(MembershipCreateStatus.Success)); + + //Cleanup + provider.DeleteUser("foo", true); + + } + + [Test] + public void DeleteUser() + { + execSQL(@"delete from my_aspnet_membership; + delete from my_aspnet_users;"); + CreateUserWithFormat(MembershipPasswordFormat.Hashed); + Assert.That(provider.DeleteUser("foo", true)); + DataTable table = FillTable("SELECT * FROM my_aspnet_membership"); + Assert.That(table.Rows.Count, Is.EqualTo(0)); + table = FillTable("SELECT * FROM my_aspnet_users"); + Assert.That(table.Rows.Count, Is.EqualTo(0)); + + CreateUserWithFormat(MembershipPasswordFormat.Hashed); + provider = new MySQLMembershipProvider(); + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("applicationName", "/"); + provider.Initialize(null, config); + Assert.That(Membership.DeleteUser("foo", false)); + table = FillTable("SELECT * FROM my_aspnet_membership"); + Assert.That(table.Rows.Count, Is.EqualTo(0)); + table = FillTable("SELECT * FROM my_aspnet_users"); + Assert.That(table.Rows.Count, Is.EqualTo(1)); + } + + [Test] + public void FindUsersByName() + { + CreateUserWithFormat(MembershipPasswordFormat.Hashed); + int records; + MembershipUserCollection users = provider.FindUsersByName("F%", 0, 10, out records); + Assert.That(records, Is.EqualTo(1)); + Assert.That(users["foo"].UserName, Is.EqualTo("foo")); + + //Cleanup + provider.DeleteUser("foo", true); + } + + [Test] + public void FindUsersByEmail() + { + CreateUserWithFormat(MembershipPasswordFormat.Hashed); + + int records; + MembershipUserCollection users = provider.FindUsersByEmail("foo@bar.com", 0, 10, out records); + Assert.That(records, Is.EqualTo(1)); + Assert.That(users["foo"].UserName, Is.EqualTo("foo")); + + //Cleanup + provider.DeleteUser("foo", true); + } + + [Test] + public void TestCreateUserOverrides() + { + try + { + MembershipCreateStatus status; + Membership.CreateUser("foo", "barbar!", null, "question", "answer", true, out status); + int records; + MembershipUserCollection users = Membership.FindUsersByName("F%", 0, 10, out records); + Assert.That(records, Is.EqualTo(1)); + Assert.That(users["foo"].UserName, Is.EqualTo("foo")); + + Membership.CreateUser("test", "barbar!", "myemail@host.com", + "question", "answer", true, out status); + users = Membership.FindUsersByName("T%", 0, 10, out records); + Assert.That(records, Is.EqualTo(1)); + Assert.That(users["test"].UserName, Is.EqualTo("test")); + } + catch (Exception ex) + { + Assert.That(ex.Message != String.Empty, ex.Message); + } + + //Cleanup + Membership.DeleteUser("test", true); + Membership.DeleteUser("foo", true); + } + + [Test] + public void NumberOfUsersOnline() + { + int numOnline = Membership.GetNumberOfUsersOnline(); + Assert.That(numOnline, Is.EqualTo(0)); + + MembershipCreateStatus status; + Membership.CreateUser("foo", "barbar!", null, "question", "answer", true, out status); + Membership.CreateUser("foo2", "barbar!", null, "question", "answer", true, out status); + + numOnline = Membership.GetNumberOfUsersOnline(); + Assert.That(numOnline, Is.EqualTo(2)); + + //Cleanup + Membership.DeleteUser("foo"); + Membership.DeleteUser("foo2"); + } + + [Test] + public void UnlockUser() + { + MembershipCreateStatus status; + Membership.CreateUser("foo", "barbar!", null, "question", "answer", true, out status); + Assert.That(!Membership.ValidateUser("foo", "bar2")); + Assert.That(!Membership.ValidateUser("foo", "bar3")); + Assert.That(!Membership.ValidateUser("foo", "bar3")); + Assert.That(!Membership.ValidateUser("foo", "bar3")); + Assert.That(!Membership.ValidateUser("foo", "bar3")); + + // the user should be locked now so the right password should fail + Assert.That(!Membership.ValidateUser("foo", "barbar!")); + + MembershipUser user = Membership.GetUser("foo"); + Assert.That(user.IsLockedOut); + + Assert.That(user.UnlockUser()); + user = Membership.GetUser("foo"); + Assert.That(!user.IsLockedOut); + + Assert.That(Membership.ValidateUser("foo", "barbar!")); + + //Cleanup + Membership.DeleteUser("foo"); + } + + [Test] + public void GetUsernameByEmail() + { + MembershipCreateStatus status; + Membership.CreateUser("foo", "barbar!", "foo@bar.com", "question", "answer", true, out status); + string username = Membership.GetUserNameByEmail("foo@bar.com"); + Assert.That(username, Is.EqualTo("foo")); + + username = Membership.GetUserNameByEmail("foo@b.com"); + Assert.That(username, Is.Null); + + username = Membership.GetUserNameByEmail(" foo@bar.com "); + Assert.That(username, Is.EqualTo("foo")); + + //Cleanup + Membership.DeleteUser("foo"); + } + + [Test] + public void UpdateUser() + { + MembershipCreateStatus status; + Membership.CreateUser("foo", "barbar!", "foo@bar.com", "color", "blue", true, out status); + Assert.That(status, Is.EqualTo(MembershipCreateStatus.Success)); + + MembershipUser user = Membership.GetUser("foo"); + + user.Comment = "my comment"; + user.Email = "my email"; + user.IsApproved = false; + user.LastActivityDate = new DateTime(2008, 1, 1); + user.LastLoginDate = new DateTime(2008, 2, 1); + Membership.UpdateUser(user); + + MembershipUser newUser = Membership.GetUser("foo"); + Assert.That(newUser.Comment, Is.EqualTo(user.Comment)); + Assert.That(newUser.Email, Is.EqualTo(user.Email)); + Assert.That(newUser.IsApproved, Is.EqualTo(user.IsApproved)); + Assert.That(newUser.LastActivityDate, Is.EqualTo(user.LastActivityDate)); + Assert.That(newUser.LastLoginDate, Is.EqualTo(user.LastLoginDate)); + + //Cleanup + Membership.DeleteUser("foo"); + } + + private void ChangePasswordQAHelper(MembershipUser user, string pw, string newQ, string newA) + { + try + { + user.ChangePasswordQuestionAndAnswer(pw, newQ, newA); + } + catch (ArgumentNullException ane) + { + Assert.That(ane.ParamName, Is.EqualTo("password")); + } + catch (ArgumentException) + { + Assert.That(pw, Is.Not.Null); + } + } + + [Test] + public void ChangePasswordQuestionAndAnswer() + { + MembershipCreateStatus status; + Membership.CreateUser("foo", "barbar!", "foo@bar.com", "color", "blue", true, out status); + Assert.That(status, Is.EqualTo(MembershipCreateStatus.Success)); + + MembershipUser user = Membership.GetUser("foo"); + ChangePasswordQAHelper(user, "", "newQ", "newA"); + ChangePasswordQAHelper(user, "barbar!", "", "newA"); + ChangePasswordQAHelper(user, "barbar!", "newQ", ""); + ChangePasswordQAHelper(user, null, "newQ", "newA"); + + bool result = user.ChangePasswordQuestionAndAnswer("barbar!", "newQ", "newA"); + Assert.That(result); + + user = Membership.GetUser("foo"); + Assert.That(user.PasswordQuestion, Is.EqualTo("newQ")); + + //Cleanup + Membership.DeleteUser("foo"); + + } + + [Test] + public void GetAllUsers() + { + MembershipCreateStatus status; + // first create a bunch of users + for (int i = 0; i < 100; i++) + Membership.CreateUser(String.Format("foo{0}", i), "barbar!", null, + "question", "answer", true, out status); + + MembershipUserCollection users = Membership.GetAllUsers(); + Assert.That(users.Count, Is.EqualTo(100)); + int index = 0; + foreach (MembershipUser user in users) + Assert.That(user.UserName, Is.EqualTo(String.Format("foo{0}", index++))); + + int total; + users = Membership.GetAllUsers(2, 10, out total); + Assert.That(users.Count, Is.EqualTo(10)); + Assert.That(total, Is.EqualTo(100)); + index = 0; + foreach (MembershipUser user in users) + Assert.That(user.UserName, Is.EqualTo(String.Format("foo2{0}", index++))); + + //Cleanup + MySqlHelper.ExecuteScalar(Connection, "DELETE FROM my_aspnet_users"); + MySqlHelper.ExecuteScalar(Connection, "DELETE FROM my_aspnet_membership"); + } + + private void GetPasswordHelper(bool requireQA, bool enablePasswordRetrieval, string answer) + { + MembershipCreateStatus status; + provider = new MySQLMembershipProvider(); + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("requiresQuestionAndAnswer", requireQA ? "true" : "false"); + config.Add("enablePasswordRetrieval", enablePasswordRetrieval ? "true" : "false"); + config.Add("passwordFormat", "clear"); + config.Add("applicationName", "/"); + config.Add("writeExceptionsToEventLog", "false"); + provider.Initialize(null, config); + + provider.CreateUser("foo", "barbar!", "foo@bar.com", "color", "blue", true, null, out status); + + string password = string.Empty; + if (!enablePasswordRetrieval) + { + if (requireQA && answer != null) + { + Exception ex = Assert.Throws(() => provider.GetPassword("foo", answer)); + } + else + { + Exception ex = Assert.Throws(() => provider.GetPassword("foo", answer)); + Assert.That("Password Retrieval Not Enabled.", Is.EqualTo(ex.Message)); + } + } + else + { + if (requireQA && answer != null) + { + provider.GetPassword("foo", answer); + } + else if (requireQA && answer == null) + { + //Incorrect password answer. + Assert.Throws(() => provider.GetPassword("foo", answer)); + } + else + { + password = provider.GetPassword("foo", answer); + Assert.That(password, Is.EqualTo("barbar!")); + } + } + + //Cleanup + provider.DeleteUser("foo", true); + } + + [Test] + public void GetPassword() + { + GetPasswordHelper(false, false, null); + GetPasswordHelper(false, true, null); + GetPasswordHelper(true, true, null); + GetPasswordHelper(true, true, "blue"); + } + + /// + /// Bug #38939 MembershipUser.GetPassword(string answer) fails when incorrect answer is passed. + /// + [Test] + public void GetPasswordWithWrongAnswer() + { + MembershipCreateStatus status; + provider = new MySQLMembershipProvider(); + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("requiresQuestionAndAnswer", "true"); + config.Add("enablePasswordRetrieval", "true"); + config.Add("passwordFormat", "Encrypted"); + config.Add("applicationName", "/"); + provider.Initialize(null, config); + provider.CreateUser("foo", "barbar!", "foo@bar.com", "color", "blue", true, null, out status); + + MySQLMembershipProvider provider2 = new MySQLMembershipProvider(); + NameValueCollection config2 = new NameValueCollection(); + config2.Add("connectionStringName", "LocalMySqlServer"); + config2.Add("requiresQuestionAndAnswer", "true"); + config2.Add("enablePasswordRetrieval", "true"); + config2.Add("passwordFormat", "Encrypted"); + config2.Add("applicationName", "/"); + provider2.Initialize(null, config2); + Assert.Throws(() => provider2.GetPassword("foo", "wrong")); + + //Cleanup + provider.DeleteUser("foo", true); + } + + [Test] + public void GetUser() + { + //Resetting PK + MySqlHelper.ExecuteScalar(Connection, "ALTER TABLE my_aspnet_users AUTO_INCREMENT = 1;"); + + MembershipCreateStatus status; + Membership.CreateUser("foo", "barbar!", null, "question", "answer", true, out status); + MembershipUser user = Membership.GetUser(1); + Assert.That(user.UserName, Is.EqualTo("foo")); + + // now move the activity date back outside the login + // window + user.LastActivityDate = new DateTime(2008, 1, 1); + Membership.UpdateUser(user); + + user = Membership.GetUser("foo"); + Assert.That(!user.IsOnline); + + user = Membership.GetUser("foo", true); + Assert.That(user.IsOnline); + + // now move the activity date back outside the login + // window again + user.LastActivityDate = new DateTime(2008, 1, 1); + Membership.UpdateUser(user); + + user = Membership.GetUser(1); + Assert.That(!user.IsOnline); + + user = Membership.GetUser(1, true); + Assert.That(user.IsOnline); + + //Cleanup + Membership.DeleteUser("foo"); + } + + [Ignore("Fix Me")] + public void FindUsers() + { + MembershipCreateStatus status; + for (int i = 0; i < 100; i++) + Membership.CreateUser(String.Format("boo{0}", i), "barbar!", null, + "question", "answer", true, out status); + for (int i = 0; i < 100; i++) + Membership.CreateUser(String.Format("foo{0}", i), "barbar!", null, + "question", "answer", true, out status); + for (int i = 0; i < 100; i++) + Membership.CreateUser(String.Format("schmoo{0}", i), "barbar!", null, + "question", "answer", true, out status); + + + MembershipUserCollection users = Membership.FindUsersByName("fo%"); + Assert.That(users.Count, Is.EqualTo(100)); + + int total; + users = Membership.FindUsersByName("fo%", 2, 10, out total); + Assert.That(users.Count, Is.EqualTo(10)); + Assert.That(total, Is.EqualTo(100)); + int index = 0; + foreach (MembershipUser user in users) + Assert.That(user.UserName, Is.EqualTo(String.Format("foo2{0}", index++))); + + //Cleanup + MySqlHelper.ExecuteScalar(Connection, "DELETE FROM my_aspnet_users"); + MySqlHelper.ExecuteScalar(Connection, "DELETE FROM my_aspnet_membership"); + + } + + [Test] + public void CreateUserWithNoQA() + { + MembershipCreateStatus status; + provider = new MySQLMembershipProvider(); + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("requiresQuestionAndAnswer", "true"); + config.Add("passwordFormat", "clear"); + config.Add("applicationName", "/"); + provider.Initialize(null, config); + + Exception ex = Assert.Throws(() => provider.CreateUser("foo", "barbar!", "foo@bar.com", "color", null, true, null, out status)); + Assert.That(ex.Message.StartsWith("Password answer supplied is invalid", StringComparison.OrdinalIgnoreCase)); + + ex = Assert.Throws(() => provider.CreateUser("foo", "barbar!", "foo@bar.com", "", "blue", true, null, out status)); + Assert.That(ex.Message.StartsWith("Password question supplied is invalid", StringComparison.OrdinalIgnoreCase)); + + } + + [Test] + public void MinRequiredAlpha() + { + provider = new MySQLMembershipProvider(); + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("applicationName", "/"); + config.Add("minRequiredNonalphanumericCharacters", "3"); + provider.Initialize(null, config); + + MembershipCreateStatus status; + MembershipUser user = provider.CreateUser("foo", "pw!pass", "email", null, null, true, null, out status); + Assert.That(user, Is.Null); + + user = provider.CreateUser("foo", "pw!pa!!", "email", null, null, true, null, out status); + Assert.That(user, Is.Not.Null); + + //Cleanup + Membership.DeleteUser("foo"); + + } + + /// + /// Bug #35332 GetPassword() don't working (when PasswordAnswer is NULL) + /// + [Test] + public void GetPasswordWithNullValues() + { + MembershipCreateStatus status; + provider = new MySQLMembershipProvider(); + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("requiresQuestionAndAnswer", "false"); + config.Add("enablePasswordRetrieval", "true"); + config.Add("passwordFormat", "clear"); + config.Add("applicationName", "/"); + provider.Initialize(null, config); + + MembershipUser user = provider.CreateUser("foo", "barbar!", "foo@bar.com", null, null, true, null, out status); + Assert.That(user, Is.Not.Null); + + string pw = provider.GetPassword("foo", null); + Assert.That(pw, Is.EqualTo("barbar!")); + + //Cleanup + Membership.DeleteUser("foo"); + } + + /// + /// Bug #35336 GetPassword() return wrong password (when format is encrypted) + /// + [Test] + public void GetEncryptedPassword() + { + MembershipCreateStatus status; + provider = new MySQLMembershipProvider(); + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("requiresQuestionAndAnswer", "false"); + config.Add("enablePasswordRetrieval", "true"); + config.Add("passwordFormat", "encrypted"); + config.Add("applicationName", "/"); + provider.Initialize(null, config); + + MembershipUser user = provider.CreateUser("foo", "barbar!", "foo@bar.com", null, null, true, null, out status); + Assert.That(user, Is.Not.Null); + + string pw = provider.GetPassword("foo", null); + Assert.That(pw, Is.EqualTo("barbar!")); + + //Cleanup + provider.DeleteUser("foo", true); + } + + /// + /// Bug #42574 ValidateUser does not use the application id, allowing cross application login + /// + [Test] + public void CrossAppLogin() + { + provider = new MySQLMembershipProvider(); + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("applicationName", "/"); + config.Add("passwordStrengthRegularExpression", "bar.*"); + config.Add("passwordFormat", "Clear"); + provider.Initialize(null, config); + MembershipCreateStatus status; + provider.CreateUser("foo", "bar!bar", null, null, null, true, null, out status); + + MySQLMembershipProvider provider2 = new MySQLMembershipProvider(); + NameValueCollection config2 = new NameValueCollection(); + config2.Add("connectionStringName", "LocalMySqlServer"); + config2.Add("applicationName", "/myapp"); + config2.Add("passwordStrengthRegularExpression", ".*"); + config2.Add("passwordFormat", "Clear"); + provider2.Initialize(null, config2); + + bool worked = provider2.ValidateUser("foo", "bar!bar"); + Assert.That(worked, Is.EqualTo(false)); + + //Cleanup + provider.DeleteUser("foo", true); + } + + /// + /// Bug #41408 PasswordReset not possible when requiresQuestionAndAnswer="false" + /// + [Test] + public void ResetPassword() + { + provider = new MySQLMembershipProvider(); + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("applicationName", "/"); + config.Add("passwordStrengthRegularExpression", "bar.*"); + config.Add("passwordFormat", "Clear"); + config.Add("requiresQuestionAndAnswer", "false"); + provider.Initialize(null, config); + + MembershipCreateStatus status; + provider.CreateUser("foo", "bar!bar", null, null, null, true, null, out status); + + MembershipUser u = provider.GetUser("foo", false); + string newpw = provider.ResetPassword("foo", null); + + //Cleanup + provider.DeleteUser("foo", true); + } + + /// + /// Bug #59438 setting Membership.ApplicationName has no effect + /// + [Test] + public void ChangeAppName() + { + provider = new MySQLMembershipProvider(); + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("applicationName", "/"); + config.Add("passwordStrengthRegularExpression", "bar.*"); + config.Add("passwordFormat", "Clear"); + provider.Initialize(null, config); + MembershipCreateStatus status; + provider.CreateUser("foo", "bar!bar", null, null, null, true, null, out status); + Assert.That(status == MembershipCreateStatus.Success); + + MySQLMembershipProvider provider2 = new MySQLMembershipProvider(); + NameValueCollection config2 = new NameValueCollection(); + config2.Add("connectionStringName", "LocalMySqlServer"); + config2.Add("applicationName", "/myapp"); + config2.Add("passwordStrengthRegularExpression", "foo.*"); + config2.Add("passwordFormat", "Clear"); + provider2.Initialize(null, config2); + provider2.CreateUser("foo2", "foo!foo", null, null, null, true, null, out status); + Assert.That(status == MembershipCreateStatus.Success); + + provider.ApplicationName = "/myapp"; + Assert.That(!provider.ValidateUser("foo", "bar!bar")); + Assert.That(provider.ValidateUser("foo2", "foo!foo")); + + //Cleanup + //provider.DeleteUser("foo2", true); + //provider.DeleteUser("foo", true); + + //Cleanup + MySqlHelper.ExecuteScalar(Connection, "DELETE FROM my_aspnet_users"); + MySqlHelper.ExecuteScalar(Connection, "DELETE FROM my_aspnet_membership"); + + } + + [Test] + public void GetUserLooksForExactUsername() + { + MembershipCreateStatus status; + Membership.CreateUser("code", "thecode!", null, "question", "answer", true, out status); + + MembershipUser user = Membership.GetUser("code"); + Assert.That(user.UserName, Is.EqualTo("code")); + + user = Membership.GetUser("co_e"); + Assert.That(user, Is.Null); + + //Cleanup + Membership.DeleteUser("code"); + } + + [Test] + public void GetUserNameByEmailLooksForExactEmail() + { + MembershipCreateStatus status; + Membership.CreateUser("code", "thecode!", "code@mysql.com", "question", "answer", true, out status); + + string username = Membership.GetUserNameByEmail("code@mysql.com"); + Assert.That(username, Is.EqualTo("code")); + + username = Membership.GetUserNameByEmail("co_e@mysql.com"); + Assert.That(username, Is.Null); + + //Cleanup + Membership.DeleteUser("code"); + } + + /// + /// MySqlBug 73411, Oracle Bug: 19453313 + /// + [Test] + public void CreateUserWithLeadingAndTrailingSpaces() + { + provider = new MySQLMembershipProvider(); + NameValueCollection config = new NameValueCollection(); + config.Add("connectionStringName", "LocalMySqlServer"); + config.Add("autogenerateschema", "true"); + config.Add("applicationName", "/"); + provider.Initialize(null, config); + + MembershipCreateStatus status; + MembershipUser muser1 = provider.CreateUser(" with trailing space ", "dummypassword1!", "w@w1.w", "yes", "yes", true, null, out status); + Assert.That(muser1, Is.Not.EqualTo(null)); + MembershipUser muser2 = provider.GetUser("with trailing space", false); + Assert.That(muser1, Is.Not.EqualTo(null)); + + Roles.CreateRole("SomeRole"); + Assert.That(Roles.GetAllRoles().Length > 0); + + bool isInRole = Roles.IsUserInRole(muser2.UserName, "SomeRole"); + Assert.That(!isInRole); + + Roles.AddUserToRole(muser2.UserName, "SomeRole"); + + isInRole = Roles.IsUserInRole(muser2.UserName, "SomeRole"); + Assert.That(isInRole); + } + } +} diff --git a/MySql.Web/tests/WebTestBase.cs b/MySql.Web/tests/WebTestBase.cs new file mode 100644 index 000000000..c7e06a723 --- /dev/null +++ b/MySql.Web/tests/WebTestBase.cs @@ -0,0 +1,166 @@ +// Copyright © 2013, 2025, Oracle and/or its affiliates. +// +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License, version 2.0, as +// published by the Free Software Foundation. +// +// This program is designed to work with certain software (including +// but not limited to OpenSSL) that is licensed under separate terms, as +// designated in a particular file or component or in included license +// documentation. The authors of MySQL hereby grant you an additional +// permission to link the program and your derivative works with the +// separately licensed software that they have either included with +// the program or referenced in the documentation. +// +// Without limiting anything contained in the foregoing, this file, +// which is part of MySQL Connector/NET, is also subject to the +// Universal FOSS Exception, version 1.0, a copy of which can be found at +// http://oss.oracle.com/licenses/universal-foss-exception. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License, version 2.0, for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software Foundation, Inc., +// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +using MySql.Data.Common; +using MySql.Data.MySqlClient; +using MySql.Web.Common; +using MySql.Web.Security; +using NUnit.Framework; +using NUnit.Framework.Legacy; +using System; +using System.Configuration; +using System.Data; +using System.IO; + +namespace MySql.Web.Tests +{ + public class WebTestBase + { + protected MySqlConnection Connection; + protected string ConnectionString; + protected uint Port; + + public WebTestBase() + { + var strPort = Environment.GetEnvironmentVariable("MYSQL_PORT"); + Port = strPort == null ? 3306 : UInt32.Parse(strPort); + Init(); + ConnectionString = $"server=localhost;uid=root;database=mysqlweb;pooling=false;port={Port}"; + Connection = new MySqlConnection(ConnectionString); + Connection.Open(); + InitSchema(); + AddConnectionStringToConfigFile(); + } + + [OneTimeTearDown] + public void OneTimeTearDown() + { + using (var conn = new MySqlConnection(ConnectionString)) + { + conn.Open(); + execSQL($"DROP DATABASE IF EXISTS `mysqlweb`"); + } + } + + protected virtual void Init() + { + ConnectionString = $"server=localhost;uid=root;database=mysql;pooling=false;port={Port}"; + Connection = new MySqlConnection(ConnectionString); + Connection.Open(); + execSQL($"DROP DATABASE IF EXISTS `mysqlweb`"); + execSQL($"CREATE DATABASE `mysqlweb`"); + Connection.Close(); + } + + protected virtual void InitSchema() + { + if (DBVersion.Parse(Connection.ServerVersion).isAtLeast(8, 0, 2)) + { + execSQL("SET explicit_defaults_for_timestamp=OFF"); + execSQL("SET GLOBAL explicit_defaults_for_timestamp=OFF"); + } + + for (int ver = 1; ver <= SchemaManager.Version; ver++) + LoadSchema(ver); + } + + private void AddConnectionStringToConfigFile() + { + Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); + config.ConnectionStrings.ConnectionStrings.Remove("LocalMySqlServer"); + ConnectionStringSettings css = new ConnectionStringSettings(); + css.ConnectionString = ConnectionString; + css.Name = "LocalMySqlServer"; + config.ConnectionStrings.ConnectionStrings.Add(css); + config.Save(); + ConfigurationManager.RefreshSection("connectionStrings"); + } + + public bool TableExists(string tableName) + { + MySqlCommand cmd = new MySqlCommand($"SELECT * FROM {tableName} LIMIT 0", Connection); + try + { + cmd.ExecuteScalar(); + return true; + } + catch (Exception) + { + return false; + } + } + + public DataTable FillTable(string sql) + { + DataTable dt = new DataTable(); + MySqlDataAdapter da = new MySqlDataAdapter(sql, Connection); + da.Fill(dt); + return dt; + } + + public void execSQL(string sql) + { + MySqlCommand cmd = new MySqlCommand(sql, Connection); + cmd.ExecuteNonQuery(); + } + + private string LoadResource(string name) + { + var assembly = typeof(MySQLMembershipProvider).Assembly; + using (Stream stream = assembly.GetManifestResourceStream(name)) + using (StreamReader reader = new StreamReader(stream)) + return reader.ReadToEnd(); + } + + internal protected void LoadSchema(int version) + { + if (version < 1) return; + + MySQLMembershipProvider provider = new MySQLMembershipProvider(); + string schema = LoadResource($"MySql.Web.Properties.schema{version}.sql"); + MySqlScript script = new MySqlScript(Connection); + script.Query = schema.ToString(); + + try + { + script.Execute(); + } + catch (MySqlException ex) + { + if (ex.Number == 1050 && version == 7) + { + // Schema7 performs several renames of tables to their lowercase representation. + // If the current server OS does not support renaming to lowercase, then let's just continue. + script.Query = "UPDATE my_aspnet_schemaversion SET version=7"; + script.Execute(); + } + } + } + } +} + diff --git a/Package.sln b/Package.sln deleted file mode 100644 index 7a9c0b714..000000000 --- a/Package.sln +++ /dev/null @@ -1,59 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.24720.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "Installer", "Installer\Installer.wixproj", "{F533FC43-6C05-4A64-8AF6-72B690EB06C3}" - ProjectSection(ProjectDependencies) = postProject - {CDB0903E-AC9C-409D-B5FE-3D30F31E14EB} = {CDB0903E-AC9C-409D-B5FE-3D30F31E14EB} - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MySql.ConnectorInstaller", "Source\MySql.ConnectorInstaller\MySql.ConnectorInstaller.csproj", "{CDB0903E-AC9C-409D-B5FE-3D30F31E14EB}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Commercial|Any CPU = Commercial|Any CPU - Commercial|x86 = Commercial|x86 - Debug|Any CPU = Debug|Any CPU - Debug|x86 = Debug|x86 - GPL|Any CPU = GPL|Any CPU - GPL|x86 = GPL|x86 - Release|Any CPU = Release|Any CPU - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {F533FC43-6C05-4A64-8AF6-72B690EB06C3}.Commercial|Any CPU.ActiveCfg = Commercial|x86 - {F533FC43-6C05-4A64-8AF6-72B690EB06C3}.Commercial|x86.ActiveCfg = Commercial|x86 - {F533FC43-6C05-4A64-8AF6-72B690EB06C3}.Commercial|x86.Build.0 = Commercial|x86 - {F533FC43-6C05-4A64-8AF6-72B690EB06C3}.Debug|Any CPU.ActiveCfg = GPL|x86 - {F533FC43-6C05-4A64-8AF6-72B690EB06C3}.Debug|Any CPU.Build.0 = GPL|x86 - {F533FC43-6C05-4A64-8AF6-72B690EB06C3}.Debug|x86.ActiveCfg = GPL|x86 - {F533FC43-6C05-4A64-8AF6-72B690EB06C3}.Debug|x86.Build.0 = GPL|x86 - {F533FC43-6C05-4A64-8AF6-72B690EB06C3}.GPL|Any CPU.ActiveCfg = GPL|x86 - {F533FC43-6C05-4A64-8AF6-72B690EB06C3}.GPL|x86.ActiveCfg = GPL|x86 - {F533FC43-6C05-4A64-8AF6-72B690EB06C3}.GPL|x86.Build.0 = GPL|x86 - {F533FC43-6C05-4A64-8AF6-72B690EB06C3}.Release|Any CPU.ActiveCfg = GPL|x86 - {F533FC43-6C05-4A64-8AF6-72B690EB06C3}.Release|Any CPU.Build.0 = GPL|x86 - {F533FC43-6C05-4A64-8AF6-72B690EB06C3}.Release|x86.ActiveCfg = GPL|x86 - {F533FC43-6C05-4A64-8AF6-72B690EB06C3}.Release|x86.Build.0 = GPL|x86 - {CDB0903E-AC9C-409D-B5FE-3D30F31E14EB}.Commercial|Any CPU.ActiveCfg = Release|Any CPU - {CDB0903E-AC9C-409D-B5FE-3D30F31E14EB}.Commercial|Any CPU.Build.0 = Release|Any CPU - {CDB0903E-AC9C-409D-B5FE-3D30F31E14EB}.Commercial|x86.ActiveCfg = Release|Any CPU - {CDB0903E-AC9C-409D-B5FE-3D30F31E14EB}.Commercial|x86.Build.0 = Release|Any CPU - {CDB0903E-AC9C-409D-B5FE-3D30F31E14EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CDB0903E-AC9C-409D-B5FE-3D30F31E14EB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CDB0903E-AC9C-409D-B5FE-3D30F31E14EB}.Debug|x86.ActiveCfg = Debug|Any CPU - {CDB0903E-AC9C-409D-B5FE-3D30F31E14EB}.Debug|x86.Build.0 = Debug|Any CPU - {CDB0903E-AC9C-409D-B5FE-3D30F31E14EB}.GPL|Any CPU.ActiveCfg = Release|Any CPU - {CDB0903E-AC9C-409D-B5FE-3D30F31E14EB}.GPL|Any CPU.Build.0 = Release|Any CPU - {CDB0903E-AC9C-409D-B5FE-3D30F31E14EB}.GPL|x86.ActiveCfg = Release|Any CPU - {CDB0903E-AC9C-409D-B5FE-3D30F31E14EB}.GPL|x86.Build.0 = Release|Any CPU - {CDB0903E-AC9C-409D-B5FE-3D30F31E14EB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CDB0903E-AC9C-409D-B5FE-3D30F31E14EB}.Release|Any CPU.Build.0 = Release|Any CPU - {CDB0903E-AC9C-409D-B5FE-3D30F31E14EB}.Release|x86.ActiveCfg = Release|Any CPU - {CDB0903E-AC9C-409D-B5FE-3D30F31E14EB}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/README b/README index f5c6fb8bf..0a47845c3 100644 --- a/README +++ b/README @@ -1,45 +1,16 @@ -MySQL Connector/Net 7.x - -This is a release of MySQL Connector/Net, Oracle's dual- -license ADO.Net Driver for MySQL. For the avoidance of -doubt, this particular copy of the software is released -under the version 2 of the GNU General Public License. -MySQL Connector/Net is brought to you by Oracle. - -Copyright (c) 2004, 2017, Oracle and/or its affiliates. All rights reserved. - -License information can be found in the COPYING file. - -MySQL FOSS License Exception -We want free and open source software applications under -certain licenses to be able to use the GPL-licensed MySQL -Connector/NET (specified GPL-licensed MySQL client libraries) -despite the fact that not all such FOSS licenses are -compatible with version 2 of the GNU General Public License. -Therefore there are special exceptions to the terms and -conditions of the GPLv2 as applied to these client libraries, -which are identified and described in more detail in the -FOSS License Exception at - - -This distribution may include materials developed by third -parties. For license and attribution notices for these -materials, please refer to the documentation that accompanies -this distribution (see the "Licenses for Third-Party Components" -appendix) or view the online documentation at - - -The accompanying documentation currently exists in MSDN help -format and is located in the 'doc' directory. - -GPLv2 Disclaimer -For the avoidance of doubt, except that if any license choice -other than GPL or LGPL is available it will apply instead, -Oracle elects to use only the General Public License version 2 -(GPLv2) at this time for any software where a choice of GPL -license versions is made available with the language indicating -that GPLv2 or any later version may be used, or where a choice -of which version of the GPL is applied is otherwise unspecified. - -This software is OSI Certified Open Source Software. -OSI Certified is a certification mark of the Open Source Initiative. +Copyright © 2004, 2025, Oracle and/or its affiliates. + +This is a release of MySQL Connector/NET, Oracle's fully managed ADO .NET Driver +for MySQL. + +License information can be found in the LICENSE file. This distribution may +include materials developed by third parties. For license and attribution +notices for these materials, please refer to the LICENSE file. + +For more information on MySQL Connector/NET, visit +http://dev.mysql.com/doc/connector-net/en/. + +For additional downloads and the source of MySQL Connector/NET, visit +http://dev.mysql.com/downloads/. + +MySQL Connector/NET is brought to you by the MySQL team at Oracle. diff --git a/README.md b/README.md new file mode 100644 index 000000000..c9d28945f --- /dev/null +++ b/README.md @@ -0,0 +1,76 @@ +# MySQL Connector/NET + +[![GitHub top language](https://img.shields.io/github/languages/top/mysql/mysql-connector-net)](https://github.com/mysql/mysql-connector-net) [![License: GPLv2 with FOSS exception](https://img.shields.io/badge/license-GPLv2_with_FOSS_exception-c30014)](LICENSE) [![NuGet Version](https://img.shields.io/nuget/v/MySQL.Data)](https://www.nuget.org/profiles/MySQL/) + +MySQL provides connectivity for client applications developed in .NET compatible programming languages with Connector/NET. + +MySQL Connector/NET is a library compatible with .NET Framework and .NET Core, for specific versions see [MySQL Connector/NET Versions](https://dev.mysql.com/doc/connector-net/en/connector-net-versions.html). The driver is a pure C# implementation of the MySQL protocol and does not rely on the MySQL client library. + +From MySQL Connector/NET 8.0, the driver also contains an implementation of [MySQL X DevAPI](https://dev.mysql.com/doc/x-devapi-userguide/en/), an Application Programming Interface for working with [MySQL as a Document Store](https://dev.mysql.com/doc/refman/8.0/en/document-store.html) through CRUD-based, NoSQL operations. + +From MySQL Connector/NET 8.1, the driver contains an implementation of [OpenTelemetry](https://dev.mysql.com/doc/connector-net/en/connector-net-programming-telemetry.html) which requires the use of the [MySql.Data.OpenTelemetry](https://www.nuget.org/packages/MySql.Data.OpenTelemetry/) Nuget package to enable the generation of telemetry data. + +From MySQL Connector/NET 8.2, the driver adds support for [WebAuthn authentication](https://dev.mysql.com/doc/dev/connector-net/latest/api/data_api/MySql.Data.MySqlClient.WebAuthnActionCallback.html), the driver also adds support for [.NET 8](https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-8/). + +From MySQL Connector/NET 8.3, the driver also adds support for [.NET 8](https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-8/) and [EFCore 8](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-8.0/whatsnew/) GA versions. + +From MySQL Connector/NET 8.4, the driver adds support for TLS1.3 and removes support for FIDO authentication plugin. + +From MySQL Connector/NET 9.0, the driver removes support for .NET 7 and EF Core 7. + +From MySQL Connector/NET 9.1, the driver adds support for [.NET 9](https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-9/overview/) and [EF Core 9](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-9.0/whatsnew/) preview versions. + +From MySQL Connector/NET 9.2, the driver adds support for [.NET 9](https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-9/overview/) and [EF Core 9](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-9.0/whatsnew/) GA versions. + +From MySQL Connector/NET 9.2, the driver removes support for .NET 6 and EF Core 6. + +From MySQL Connector/NET 9.3, the driver adds fixes to test suite and support for newest versions of EF Core 8 and EF Core 9. + +From MySQL Connector/NET 9.4, the driver adds fixes to test suite and support for preview versions of [EF Core 10](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-10.0/whatsnew) and [.NET 10](https://learn.microsoft.com/en-us/dotnet/core/whats-new/dotnet-10/overview). + +For detailed information please visit the official [MySQL Connector/NET documentation](https://dev.mysql.com/doc/connector-net/en/). + +## Licensing + +Please refer to files [README](README) and [LICENSE](LICENSE), available in this repository, and [Legal Notices in documentation](https://dev.mysql.com/doc/connector-net/en/preface.html) for further details. + +## Security + +Oracle values the independent security research community and believes that responsible disclosure of security vulnerabilities helps us ensure the security and privacy of all our users. Please refer to the [security guidelines](SECURITY.md) document for additional information. + +## Download & Install + +MySQL Connector/NET can be installed from precompiled libraries by using MySQL installer or download the libraries itself, both can be found at [Connector/NET download page](https://dev.mysql.com/downloads/connector/net/). Also, you can get the latest stable release from the [official Nuget.org feed](https://www.nuget.org/profiles/MySQL). + +* By using MySQL Installer, you just need to follow the wizard in order to obtain the precompiled library and then add it to your project. +* If you decided to download the precompiled libraries, decompress the folder and then add the library needed to your project as a reference. +* If you go for NuGet, you could use the NuGet Package Manager inside Visual Studio or use the NuGet Command Line Interface (CLI). + +### Building from sources + +This driver can also be complied and installed from the sources available in this repository. Please refer to the documentation for [detailed instructions](https://dev.mysql.com/doc/connector-net/en/connector-net-installation-source.html) on how to do it. + +### Github Repository + +This repository contains the MySQL Connector/NET source code as per latest released version. You should expect to see the same content here and within the latest released Connector/NET package. + +## Contributing + +We greatly appreciate feedback from our users, including bug reports and code contributions. Your input helps us improve, and we thank you for any issues you report or code you contribute. Please refer to the [contributing guidelines](CONTRIBUTING.md) document for additional information. + +### Additional Resources + +* [MySQL Connector/NET Developer Guide](https://dev.mysql.com/doc/connector-net/en/) +* [MySQL Connector/NET API](https://dev.mysql.com/doc/dev/connector-net/latest/) +* [MySQL NuGet](https://www.nuget.org/profiles/MySQL/) +* [MySQL Connector/NET and C#, Mono, .Net Forum](https://forums.mysql.com/list.php?38) +* [`#connectors` channel on MySQL Community Slack](https://mysqlcommunity.slack.com/messages/connectors/) ([Sign-up](https://lefred.be/mysql-community-on-slack/) required if you do not have an Oracle account.) +* [@MySQL on X](https://x.com/MySQL/). +* [MySQL Blog](https://blogs.oracle.com/mysql/). +* [MySQL Connectors Blog archive](https://dev.mysql.com/blog-archive/?cat=Connectors%20%2F%20Languages). +* [MySQL Newsletter](https://www.mysql.com/news-and-events/newsletter/). +* [MySQL Bugs Tracking System](https://bugs.mysql.com). + +For more information about this and other MySQL products, please visit [MySQL Contact & Questions](https://www.mysql.com/about/contact/). + +[![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/MySQL.svg?label=Follow%20%40MySQL&style=social)](https://x.com/intent/follow?screen_name=MySQL) diff --git a/Release Notes.txt b/Release Notes.txt index cb03ae19c..bb3cd1af3 100644 --- a/Release Notes.txt +++ b/Release Notes.txt @@ -1,21 +1,10 @@ -Connector/Net 7.0 Release Notes +Connector/NET 9.4 Release Notes ------------------------------------ -Welcome to the release notes for Connector/Net 7.0 +Welcome to the release notes for Connector/NET 9.4 -What's new in 7.0 +What's new in 9.4 -------------------- -Connector/Net has implemented the new X DevAPI that enables communication -using the X Protocol with a MySQL Server running the X Plugin, released -with MySQL 5.7.x. With the X DevAPI you can write code that treats -MySQL Server as a document database, using a NoSQL-like syntax that does -not assume previous experience writing traditional SQL. -To learn more about how to write applications using X DevAPI see -http://dev.mysql.com/doc/x-devapi-userguide/en/index.html. - -This version also includes the support for .NET Core Framework, which enables -MySQL Connector/Net > = 7.0.4 to be run in all the platforms supported for this -framework. Entity Framework Core support is also included. - -For General documentation about how to get started using MySQL as a document -database, see http://dev.mysql.com/doc/refman/5.7/en/document-database.html. +Connector/NET now supports the preview version of .NET 10 and EF Core 10. +Connector/NET now supports GSSAPI/Kerberos authentication on windows through authentication_ldap_sasl_client plug-in. +Connector/NET added fixes to testsuite. \ No newline at end of file diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..d25bea8e0 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,29 @@ +# Reporting security vulnerabilities + +Oracle values the independent security research community and believes that +responsible disclosure of security vulnerabilities helps us ensure the security +and privacy of all our users. + +Please do NOT raise a GitHub Issue to report a security vulnerability. If you +believe you have found a security vulnerability, please submit a report to +secalert_us@oracle.com preferably with a proof of concept. Please review some +additional information [on how to report security vulnerabilities to Oracle](https://www.oracle.com/corporate/security-practices/assurance/vulnerability/reporting.html). +We encourage people who contact Oracle Security to use email encryption using +our [encryption key](https://www.oracle.com/security-alerts/encryptionkey.html). + +We ask that you do not use other channels or contact the project maintainers +directly. + +# Security updates, alerts and bulletins + +Security updates will be released on a regular cadence. Many of our projects +will typically release security fixes in conjunction with the Oracle Critical +Patch Update program. Additional information, including past advisories, is +available on our [security alerts page](https://www.oracle.com/security-alerts/). + +# Security-related information + +We will provide security related information such as a threat model, +considerations for secure use, or any known security issues in our +documentation. Please note that labs and sample code are intended to demonstrate +a concept and may not be sufficiently hardened for production use. diff --git a/Samples/Async/cs/App.ico b/Samples/Async/cs/App.ico deleted file mode 100644 index 3a5525fd7..000000000 Binary files a/Samples/Async/cs/App.ico and /dev/null differ diff --git a/Samples/Async/cs/AssemblyInfo.cs b/Samples/Async/cs/AssemblyInfo.cs deleted file mode 100644 index 177a4f0e7..000000000 --- a/Samples/Async/cs/AssemblyInfo.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; - -// -// 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. -// -[assembly: AssemblyTitle("")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// -// 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 Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("1.0.*")] - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the project output directory which is -// %Project Directory%\obj\. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// -[assembly: AssemblyDelaySign(false)] -[assembly: AssemblyKeyFile("")] -[assembly: AssemblyKeyName("")] diff --git a/Samples/Async/cs/Async.csproj b/Samples/Async/cs/Async.csproj deleted file mode 100644 index 1edcd4ed7..000000000 --- a/Samples/Async/cs/Async.csproj +++ /dev/null @@ -1,114 +0,0 @@ - - - Local - 8.0.50727 - 2.0 - {4DEB1579-3952-4A42-9AA7-18AD522F02FF} - Debug - AnyCPU - App.ico - - - Async - - - JScript - Grid - IE50 - false - WinExe - Async - OnBuildSuccess - - - - - - - - - bin\Debug\ - false - 285212672 - false - - - DEBUG;TRACE - - - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - - - bin\Release\ - false - 285212672 - false - - - TRACE - - - false - 4096 - false - - - true - false - false - false - 4 - none - prompt - - - - MySQL.Data - ..\..\bin\net-1.1\Debug\MySQL.Data.dll - - - System - - - System.Data - - - System.Drawing - - - System.Windows.Forms - - - System.XML - - - - - - - Form - - - Form1.cs - Designer - - - - - - - - - - \ No newline at end of file diff --git a/Samples/Async/cs/Form1.cs b/Samples/Async/cs/Form1.cs deleted file mode 100644 index 5cba7a08d..000000000 --- a/Samples/Async/cs/Form1.cs +++ /dev/null @@ -1,287 +0,0 @@ -using System; -using System.Drawing; -using System.Collections; -using System.ComponentModel; -using System.Windows.Forms; -using System.Data; -using MySql.Data.MySqlClient; - -namespace Async -{ - /// - /// Summary description for Form1. - /// - public class Form1 : System.Windows.Forms.Form - { - private System.Windows.Forms.TabControl tabControl1; - private System.Windows.Forms.TabPage tabPage1; - private System.Windows.Forms.TextBox nonQueryOutput; - private System.Windows.Forms.Button nonQueryGo; - private System.Windows.Forms.TabPage tabPage2; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.TextBox server; - private System.Windows.Forms.TextBox uid; - private System.Windows.Forms.TextBox pwd; - private System.Windows.Forms.TextBox database; - private System.Windows.Forms.Timer timer1; - private System.ComponentModel.IContainer components; - - private MySqlConnection conn; - private MySqlCommand cmd; - private int nextTime; - private IAsyncResult asyncResult; - private DateTime start; - - public Form1() - { - // - // Required for Windows Form Designer support - // - InitializeComponent(); - } - - /// - /// Clean up any resources being used. - /// - protected override void Dispose( bool disposing ) - { - if( disposing ) - { - if (components != null) - { - components.Dispose(); - } - } - base.Dispose( disposing ); - } - - #region Windows Form Designer generated code - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.tabControl1 = new System.Windows.Forms.TabControl(); - this.tabPage2 = new System.Windows.Forms.TabPage(); - this.database = new System.Windows.Forms.TextBox(); - this.pwd = new System.Windows.Forms.TextBox(); - this.uid = new System.Windows.Forms.TextBox(); - this.server = new System.Windows.Forms.TextBox(); - this.label4 = new System.Windows.Forms.Label(); - this.label3 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.label1 = new System.Windows.Forms.Label(); - this.tabPage1 = new System.Windows.Forms.TabPage(); - this.nonQueryGo = new System.Windows.Forms.Button(); - this.nonQueryOutput = new System.Windows.Forms.TextBox(); - this.timer1 = new System.Windows.Forms.Timer(this.components); - this.tabControl1.SuspendLayout(); - this.tabPage2.SuspendLayout(); - this.tabPage1.SuspendLayout(); - this.SuspendLayout(); - // - // tabControl1 - // - this.tabControl1.Controls.Add(this.tabPage2); - this.tabControl1.Controls.Add(this.tabPage1); - this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill; - this.tabControl1.Location = new System.Drawing.Point(0, 0); - this.tabControl1.Name = "tabControl1"; - this.tabControl1.SelectedIndex = 0; - this.tabControl1.Size = new System.Drawing.Size(504, 370); - this.tabControl1.TabIndex = 0; - // - // tabPage2 - // - this.tabPage2.Controls.Add(this.database); - this.tabPage2.Controls.Add(this.pwd); - this.tabPage2.Controls.Add(this.uid); - this.tabPage2.Controls.Add(this.server); - this.tabPage2.Controls.Add(this.label4); - this.tabPage2.Controls.Add(this.label3); - this.tabPage2.Controls.Add(this.label2); - this.tabPage2.Controls.Add(this.label1); - this.tabPage2.Location = new System.Drawing.Point(4, 22); - this.tabPage2.Name = "tabPage2"; - this.tabPage2.Size = new System.Drawing.Size(496, 344); - this.tabPage2.TabIndex = 1; - this.tabPage2.Text = "Configuration"; - // - // database - // - this.database.Location = new System.Drawing.Point(116, 128); - this.database.Name = "database"; - this.database.Size = new System.Drawing.Size(228, 20); - this.database.TabIndex = 7; - this.database.Text = ""; - // - // pwd - // - this.pwd.Location = new System.Drawing.Point(116, 92); - this.pwd.Name = "pwd"; - this.pwd.Size = new System.Drawing.Size(228, 20); - this.pwd.TabIndex = 6; - this.pwd.Text = ""; - // - // uid - // - this.uid.Location = new System.Drawing.Point(116, 56); - this.uid.Name = "uid"; - this.uid.Size = new System.Drawing.Size(228, 20); - this.uid.TabIndex = 5; - this.uid.Text = ""; - // - // server - // - this.server.Location = new System.Drawing.Point(116, 20); - this.server.Name = "server"; - this.server.Size = new System.Drawing.Size(228, 20); - this.server.TabIndex = 4; - this.server.Text = ""; - // - // label4 - // - this.label4.Location = new System.Drawing.Point(16, 128); - this.label4.Name = "label4"; - this.label4.TabIndex = 3; - this.label4.Text = "Database:"; - // - // label3 - // - this.label3.Location = new System.Drawing.Point(16, 92); - this.label3.Name = "label3"; - this.label3.TabIndex = 2; - this.label3.Text = "Password:"; - // - // label2 - // - this.label2.Location = new System.Drawing.Point(16, 56); - this.label2.Name = "label2"; - this.label2.TabIndex = 1; - this.label2.Text = "User Id:"; - // - // label1 - // - this.label1.Location = new System.Drawing.Point(16, 20); - this.label1.Name = "label1"; - this.label1.TabIndex = 0; - this.label1.Text = "Server/Host:"; - // - // tabPage1 - // - this.tabPage1.Controls.Add(this.nonQueryGo); - this.tabPage1.Controls.Add(this.nonQueryOutput); - this.tabPage1.Location = new System.Drawing.Point(4, 22); - this.tabPage1.Name = "tabPage1"; - this.tabPage1.Size = new System.Drawing.Size(496, 344); - this.tabPage1.TabIndex = 0; - this.tabPage1.Text = "NonQuery"; - // - // nonQueryGo - // - this.nonQueryGo.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.nonQueryGo.Location = new System.Drawing.Point(404, 312); - this.nonQueryGo.Name = "nonQueryGo"; - this.nonQueryGo.TabIndex = 1; - this.nonQueryGo.Text = "Go"; - this.nonQueryGo.Click += new System.EventHandler(this.nonQueryGo_Click); - // - // nonQueryOutput - // - this.nonQueryOutput.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.nonQueryOutput.Location = new System.Drawing.Point(12, 36); - this.nonQueryOutput.Multiline = true; - this.nonQueryOutput.Name = "nonQueryOutput"; - this.nonQueryOutput.Size = new System.Drawing.Size(468, 268); - this.nonQueryOutput.TabIndex = 0; - this.nonQueryOutput.Text = ""; - // - // timer1 - // - this.timer1.Tick += new System.EventHandler(this.timer1_Tick); - // - // Form1 - // - this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); - this.ClientSize = new System.Drawing.Size(504, 370); - this.Controls.Add(this.tabControl1); - this.Name = "Form1"; - this.Text = "Form1"; - this.tabControl1.ResumeLayout(false); - this.tabPage2.ResumeLayout(false); - this.tabPage1.ResumeLayout(false); - this.ResumeLayout(false); - - } - #endregion - - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() - { - Application.Run(new Form1()); - } - - private void nonQueryGo_Click(object sender, System.EventArgs e) - { - string connStr = String.Format("server={0};uid={1};pwd={2};database={3}", - server.Text, uid.Text, pwd.Text, database.Text); - conn = new MySqlConnection(connStr); - try - { - conn.Open(); - - string sql = "DROP TABLE IF EXISTS AsyncSampleTable; CREATE TABLE AsyncSampleTable (numVal int)"; - cmd = new MySqlCommand(sql, conn); - cmd.ExecuteNonQuery(); - - sql = "DROP PROCEDURE IF EXISTS AsyncSample;" + - "CREATE PROCEDURE AsyncSample() BEGIN " + - "set @x=0; repeat set @x=@x+1; until @x > 5000000 end repeat; " + - "INSERT INTO AsyncSampleTable VALUES (1); end;"; - cmd.CommandText = sql; - cmd.ExecuteNonQuery(); - - cmd.CommandText = "AsyncSample"; - cmd.CommandType = CommandType.StoredProcedure; - - asyncResult = cmd.BeginExecuteNonQuery(); - nextTime = 5; - timer1.Enabled = true; - start = DateTime.Now; - } - catch (Exception ex) - { - MessageBox.Show("Exception: " + ex.Message); - } - } - - private void timer1_Tick(object sender, System.EventArgs e) - { - if (! asyncResult.IsCompleted) - { - TimeSpan ts = DateTime.Now.Subtract(start); - if (ts.TotalSeconds > nextTime) - { - nonQueryOutput.Text += Convert.ToInt32(ts.TotalSeconds) + " seconds" + Environment.NewLine; - nextTime += 5; - } - return; - } - - int recordsAffected = cmd.EndExecuteNonQuery(asyncResult); - nonQueryOutput.Text += "Records Affected = " + recordsAffected; - conn.Close(); - timer1.Enabled = false; - } - } -} diff --git a/Samples/Async/cs/Form1.resx b/Samples/Async/cs/Form1.resx deleted file mode 100644 index db7aa9916..000000000 --- a/Samples/Async/cs/Form1.resx +++ /dev/null @@ -1,283 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - True - - - Private - - - Private - - - 4, 4 - - - False - - - True - - - True - - - Private - - - Private - - - 4, 4 - - - Private - - - False - - - Private - - - Private - - - False - - - Private - - - Private - - - False - - - Private - - - Private - - - False - - - Private - - - False - - - Private - - - Private - - - False - - - Private - - - Private - - - False - - - Private - - - Private - - - False - - - Private - - - Private - - - False - - - True - - - True - - - Private - - - Private - - - 4, 4 - - - False - - - Private - - - Private - - - Private - - - False - - - Private - - - Private - - - 17, 17 - - - Private - - - False - - - (Default) - - - False - - - Form1 - - - False - - - 4, 4 - - - True - - - 80 - - - True - - - Private - - \ No newline at end of file diff --git a/Samples/Core/.vscode/launch.json b/Samples/Core/.vscode/launch.json deleted file mode 100644 index 745243bb2..000000000 --- a/Samples/Core/.vscode/launch.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "name": ".NET Core Launch (console)", - "type": "coreclr", - "request": "launch", - "preLaunchTask": "build", - "program": "${workspaceRoot}/bin/Debug/netcoreapp1.0/Core.dll", - "args": [], - "cwd": "${workspaceRoot}", - "externalConsole": false, - "stopAtEntry": false - }, - { - "name": ".NET Core Attach", - "type": "coreclr", - "request": "attach", - "processId": 0 - } - ] -} \ No newline at end of file diff --git a/Samples/Core/.vscode/tasks.json b/Samples/Core/.vscode/tasks.json deleted file mode 100644 index 67d6eb75c..000000000 --- a/Samples/Core/.vscode/tasks.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "version": "0.1.0", - "command": "dotnet", - "isShellCommand": true, - "args": [], - "tasks": [ - { - "taskName": "build", - "args": [], - "isBuildCommand": true, - "problemMatcher": "$msCompile" - } - ] -} \ No newline at end of file diff --git a/Samples/Core/MySql.Core.Test.Console.xproj b/Samples/Core/MySql.Core.Test.Console.xproj deleted file mode 100644 index 913aca33a..000000000 --- a/Samples/Core/MySql.Core.Test.Console.xproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 742dc4b9-d6d3-4063-821f-bb2fd980ce10 - MySql.Core.Test.Console - .\obj - .\bin\ - v4.6.1 - - - 2.0 - - - \ No newline at end of file diff --git a/Samples/Core/NuGet.Config b/Samples/Core/NuGet.Config deleted file mode 100644 index 22115598f..000000000 --- a/Samples/Core/NuGet.Config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/Samples/Core/Program.cs b/Samples/Core/Program.cs deleted file mode 100644 index b08be8a10..000000000 --- a/Samples/Core/Program.cs +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.Extensions.Configuration; -using MySql.Data.MySqlClient; - -namespace MySql.Core.Test.Console -{ - public class Program - { - public static void Main(string[] args) - { - System.Console.WriteLine("Starting the demo for MySql Connector / .Net Core"); - System.Console.ReadKey(); - - IConfiguration configuration = null; - - var builder = new ConfigurationBuilder() - .AddJsonFile("appsettings.json"); - - configuration = builder.Build(); - - MySqlConnection connection = new MySqlConnection(); - connection.ConnectionString = configuration?.GetSection("Data:DefaultConnection:ConnectionString").Value; - connection.Open(); - - MySqlCommand command = new MySqlCommand("SELECT * FROM sakila.category;", connection); - - var result = command.ExecuteNonQuery(); - - using (MySqlDataReader reader = command.ExecuteReader()) - { - System.Console.WriteLine("Category Id\t\tName\t\tLast Update"); - while (reader.Read()) - { - string row = string.Format("{0}\t\t{1}\t\t{2}", reader["category_id"], reader["name"], reader["last_update"]); - System.Console.WriteLine(row); - } - } - - connection.Close(); - System.Console.ReadKey(); - } - } -} diff --git a/Samples/Core/Properties/AssemblyInfo.cs b/Samples/Core/Properties/AssemblyInfo.cs deleted file mode 100644 index 6fb65ce30..000000000 --- a/Samples/Core/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Reflection; -using System.Runtime.CompilerServices; -using 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. -[assembly: AssemblyTitle("MySql.Core.Test.Console")] -[assembly: AssemblyDescription("Console Sample application for Connector/Net Core")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Oracle")] -[assembly: AssemblyProduct("MySql.Core.Test.Console")] -[assembly: AssemblyCopyright("Copyright © 2016, Oracle and/or its affiliates. All rights reserved.")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("742dc4b9-d6d3-4063-821f-bb2fd980ce10")] diff --git a/Samples/Core/appsettings.json b/Samples/Core/appsettings.json deleted file mode 100644 index 3cbd2d791..000000000 --- a/Samples/Core/appsettings.json +++ /dev/null @@ -1,7 +0,0 @@ - { - "Data": { - "DefaultConnection": { - "ConnectionString": "server=localhost;user id=root;password=;persistsecurityinfo=True;port=3305;database=sakila;ssl mode=Preferred;" - } - } - } \ No newline at end of file diff --git a/Samples/Core/project.json b/Samples/Core/project.json deleted file mode 100644 index b381a2370..000000000 --- a/Samples/Core/project.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "version": "7.0.7-m6", - "description": "MySql.Data.MySqlClient.Test Console", - "authors": [ "Oracle" ], - "copyright": "Copyright © 2016, 2017, Oracle and/or its affiliates. All rights reserved.", - - "buildOptions": { - "define": [ "NETCORE10" ], - "warningsAsErrors": false, - "copyToOutput": [ "appsettings.json" ], - "emitEntryPoint": true - }, - - "dependencies": { - "Microsoft.NETCore.App": { - "type": "platform", - "version": "1.0.0" - }, - - "MySql.Data": { - "target": "project" - } - }, - - "frameworks": { - "netcoreapp1.0": { - "imports": [ - "dnxcore50", - "portable-net452+win81" - ], - "buildOptions": { - "warningsAsErrors": false, - "resource": [ "**/*.resx" ], - "compile": { - "exclude": [ - "**/._*" - ] - }, - "optimize": true, - "xmlDoc": true, - "preserveCompilationContext": true - } - } - } -} diff --git a/Samples/Pocket PC/MobileExplorer/AssemblyInfo.cs b/Samples/Pocket PC/MobileExplorer/AssemblyInfo.cs deleted file mode 100644 index 564de00f0..000000000 --- a/Samples/Pocket PC/MobileExplorer/AssemblyInfo.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; - -// -// 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. -// -[assembly: AssemblyTitle("")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// -// 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 Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("1.0.*")] - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified - the assembly cannot be signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. -// (*) If the key file and a key name attributes are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP - that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the file is installed into the CSP and used. -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// -[assembly: AssemblyDelaySign(false)] -[assembly: AssemblyKeyFile("")] -[assembly: AssemblyKeyName("")] diff --git a/Samples/Pocket PC/MobileExplorer/Form1.cs b/Samples/Pocket PC/MobileExplorer/Form1.cs deleted file mode 100644 index 6a02bfbfd..000000000 --- a/Samples/Pocket PC/MobileExplorer/Form1.cs +++ /dev/null @@ -1,543 +0,0 @@ -using System; -using System.Data; -using System.IO; -using System.Drawing; -using System.Collections; -using System.Windows.Forms; -using MySql.Data.MySqlClient; - -namespace MobileExplorer -{ - /// - /// Summary description for Form1. - /// - public class Form1 : System.Windows.Forms.Form - { - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Button serverConnect; - private System.Windows.Forms.Panel chooseServerPanel; - private System.Windows.Forms.Panel showServerPanel; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Label activeServer; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.ComboBox objectTypeList; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.ComboBox dbList; - private System.Windows.Forms.ListBox objectList; - private System.Windows.Forms.Label label5; - private System.Windows.Forms.ListBox serverList; - private System.Windows.Forms.Button backToChooserBtn; - private System.Windows.Forms.Panel tableViewPanel; - private System.Windows.Forms.Label label6; - private System.Windows.Forms.DataGrid tableGrid; - private System.Windows.Forms.Button backToServerBtn; - private System.Windows.Forms.Button showObject; - private System.Windows.Forms.MainMenu mainMenu1; - private System.Windows.Forms.MenuItem menuItem1; - private System.Windows.Forms.MenuItem newServer; - - private MySqlConnection server; - private System.Windows.Forms.Label activeTable; - private ArrayList servers; - private System.Windows.Forms.MenuItem deleteServer; - private System.Windows.Forms.Panel spViewPanel; - private System.Windows.Forms.Label label7; - private System.Windows.Forms.TextBox spText; - private System.Windows.Forms.Button ok; - private System.Windows.Forms.Button cancel; - private System.Windows.Forms.Label activeProc; - private ServerConfig activeConfig; - - public Form1() - { - // - // Required for Windows Form Designer support - // - InitializeComponent(); - server = new MySqlConnection(); - servers = new ArrayList(); - LoadServers(); - } - /// - /// Clean up any resources being used. - /// - protected override void Dispose( bool disposing ) - { - base.Dispose( disposing ); - } - #region Windows Form Designer generated code - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.chooseServerPanel = new System.Windows.Forms.Panel(); - this.serverConnect = new System.Windows.Forms.Button(); - this.serverList = new System.Windows.Forms.ListBox(); - this.label1 = new System.Windows.Forms.Label(); - this.showServerPanel = new System.Windows.Forms.Panel(); - this.label5 = new System.Windows.Forms.Label(); - this.objectList = new System.Windows.Forms.ListBox(); - this.dbList = new System.Windows.Forms.ComboBox(); - this.label4 = new System.Windows.Forms.Label(); - this.objectTypeList = new System.Windows.Forms.ComboBox(); - this.label3 = new System.Windows.Forms.Label(); - this.activeServer = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.backToChooserBtn = new System.Windows.Forms.Button(); - this.tableViewPanel = new System.Windows.Forms.Panel(); - this.label6 = new System.Windows.Forms.Label(); - this.activeTable = new System.Windows.Forms.Label(); - this.tableGrid = new System.Windows.Forms.DataGrid(); - this.backToServerBtn = new System.Windows.Forms.Button(); - this.showObject = new System.Windows.Forms.Button(); - this.mainMenu1 = new System.Windows.Forms.MainMenu(); - this.menuItem1 = new System.Windows.Forms.MenuItem(); - this.newServer = new System.Windows.Forms.MenuItem(); - this.deleteServer = new System.Windows.Forms.MenuItem(); - this.spViewPanel = new System.Windows.Forms.Panel(); - this.label7 = new System.Windows.Forms.Label(); - this.activeProc = new System.Windows.Forms.Label(); - this.spText = new System.Windows.Forms.TextBox(); - this.ok = new System.Windows.Forms.Button(); - this.cancel = new System.Windows.Forms.Button(); - // - // chooseServerPanel - // - this.chooseServerPanel.Controls.Add(this.serverConnect); - this.chooseServerPanel.Controls.Add(this.serverList); - this.chooseServerPanel.Controls.Add(this.label1); - this.chooseServerPanel.Location = new System.Drawing.Point(4, 4); - this.chooseServerPanel.Size = new System.Drawing.Size(220, 296); - // - // serverConnect - // - this.serverConnect.Location = new System.Drawing.Point(132, 212); - this.serverConnect.Text = "Connect"; - this.serverConnect.Click += new System.EventHandler(this.serverConnect_Click); - // - // serverList - // - this.serverList.Location = new System.Drawing.Point(12, 32); - this.serverList.Size = new System.Drawing.Size(192, 170); - // - // label1 - // - this.label1.Location = new System.Drawing.Point(12, 12); - this.label1.Size = new System.Drawing.Size(140, 20); - this.label1.Text = "Configured Servers"; - // - // showServerPanel - // - this.showServerPanel.Controls.Add(this.objectList); - this.showServerPanel.Controls.Add(this.showObject); - this.showServerPanel.Controls.Add(this.backToChooserBtn); - this.showServerPanel.Controls.Add(this.label5); - this.showServerPanel.Controls.Add(this.dbList); - this.showServerPanel.Controls.Add(this.label4); - this.showServerPanel.Controls.Add(this.objectTypeList); - this.showServerPanel.Controls.Add(this.label3); - this.showServerPanel.Controls.Add(this.activeServer); - this.showServerPanel.Controls.Add(this.label2); - this.showServerPanel.Location = new System.Drawing.Point(4, 4); - this.showServerPanel.Size = new System.Drawing.Size(228, 264); - // - // label5 - // - this.label5.Location = new System.Drawing.Point(12, 104); - this.label5.Text = "Objects"; - // - // objectList - // - this.objectList.Location = new System.Drawing.Point(12, 120); - this.objectList.Size = new System.Drawing.Size(200, 100); - // - // dbList - // - this.dbList.Location = new System.Drawing.Point(80, 40); - this.dbList.Size = new System.Drawing.Size(132, 22); - this.dbList.SelectedIndexChanged += new System.EventHandler(this.dbList_SelectedIndexChanged); - // - // label4 - // - this.label4.Location = new System.Drawing.Point(12, 40); - this.label4.Size = new System.Drawing.Size(72, 20); - this.label4.Text = "Database:"; - // - // objectTypeList - // - this.objectTypeList.Items.Add("Tables"); - this.objectTypeList.Items.Add("Stored Procedures"); - this.objectTypeList.Items.Add("User Defined Functions"); - this.objectTypeList.Items.Add("Views"); - this.objectTypeList.Location = new System.Drawing.Point(80, 76); - this.objectTypeList.Size = new System.Drawing.Size(132, 22); - this.objectTypeList.SelectedIndexChanged += new System.EventHandler(this.objectTypeList_SelectedIndexChanged); - // - // label3 - // - this.label3.Location = new System.Drawing.Point(12, 76); - this.label3.Size = new System.Drawing.Size(48, 20); - this.label3.Text = "Object:"; - // - // activeServer - // - this.activeServer.Location = new System.Drawing.Point(80, 12); - this.activeServer.Size = new System.Drawing.Size(128, 20); - // - // label2 - // - this.label2.Location = new System.Drawing.Point(12, 12); - this.label2.Size = new System.Drawing.Size(48, 20); - this.label2.Text = "Server:"; - // - // backToChooserBtn - // - this.backToChooserBtn.Location = new System.Drawing.Point(64, 232); - this.backToChooserBtn.Text = "Back"; - this.backToChooserBtn.Click += new System.EventHandler(this.backToChooserBtn_Click); - // - // tableViewPanel - // - this.tableViewPanel.Controls.Add(this.backToServerBtn); - this.tableViewPanel.Controls.Add(this.tableGrid); - this.tableViewPanel.Controls.Add(this.activeTable); - this.tableViewPanel.Controls.Add(this.label6); - this.tableViewPanel.Location = new System.Drawing.Point(4, 4); - this.tableViewPanel.Size = new System.Drawing.Size(224, 264); - // - // label6 - // - this.label6.Location = new System.Drawing.Point(12, 12); - this.label6.Size = new System.Drawing.Size(52, 20); - this.label6.Text = "Table:"; - // - // activeTable - // - this.activeTable.Location = new System.Drawing.Point(60, 12); - this.activeTable.Size = new System.Drawing.Size(152, 20); - // - // tableGrid - // - this.tableGrid.Location = new System.Drawing.Point(4, 32); - this.tableGrid.Size = new System.Drawing.Size(216, 196); - this.tableGrid.Text = "dataGrid1"; - // - // backToServerBtn - // - this.backToServerBtn.Location = new System.Drawing.Point(144, 236); - this.backToServerBtn.Text = "Back"; - this.backToServerBtn.Click += new System.EventHandler(this.backToServerBtn_Click); - // - // showObject - // - this.showObject.Location = new System.Drawing.Point(140, 232); - this.showObject.Text = "Show"; - this.showObject.Click += new System.EventHandler(this.showObject_Click); - // - // mainMenu1 - // - this.mainMenu1.MenuItems.Add(this.menuItem1); - // - // menuItem1 - // - this.menuItem1.MenuItems.Add(this.newServer); - this.menuItem1.MenuItems.Add(this.deleteServer); - this.menuItem1.Text = "Servers"; - // - // newServer - // - this.newServer.Text = "&New..."; - this.newServer.Click += new System.EventHandler(this.newServer_Click); - // - // deleteServer - // - this.deleteServer.Text = "&Delete"; - this.deleteServer.Click += new System.EventHandler(this.deleteServer_Click); - // - // spViewPanel - // - this.spViewPanel.Controls.Add(this.cancel); - this.spViewPanel.Controls.Add(this.ok); - this.spViewPanel.Controls.Add(this.spText); - this.spViewPanel.Controls.Add(this.activeProc); - this.spViewPanel.Controls.Add(this.label7); - this.spViewPanel.Location = new System.Drawing.Point(4, 4); - this.spViewPanel.Size = new System.Drawing.Size(220, 296); - // - // label7 - // - this.label7.Location = new System.Drawing.Point(8, 12); - this.label7.Size = new System.Drawing.Size(72, 20); - this.label7.Text = "Procedure:"; - // - // activeProc - // - this.activeProc.Location = new System.Drawing.Point(80, 12); - this.activeProc.Size = new System.Drawing.Size(132, 20); - // - // spText - // - this.spText.Location = new System.Drawing.Point(8, 36); - this.spText.Multiline = true; - this.spText.Size = new System.Drawing.Size(204, 192); - this.spText.Text = ""; - // - // ok - // - this.ok.Location = new System.Drawing.Point(64, 236); - this.ok.Text = "OK"; - this.ok.Click += new System.EventHandler(this.ok_Click); - // - // cancel - // - this.cancel.Location = new System.Drawing.Point(140, 236); - this.cancel.Text = "Cancel"; - this.cancel.Click += new System.EventHandler(this.cancel_Click); - // - // Form1 - // - this.ClientSize = new System.Drawing.Size(230, 372); - this.Controls.Add(this.chooseServerPanel); - this.Controls.Add(this.tableViewPanel); - this.Controls.Add(this.showServerPanel); - this.Controls.Add(this.spViewPanel); - this.Menu = this.mainMenu1; - this.Text = "Form1"; - - } - #endregion - - /// - /// The main entry point for the application. - /// - - static void Main() - { - Application.Run(new Form1()); - } - - private void serverConnect_Click(object sender, System.EventArgs e) - { - activeConfig = (ServerConfig)servers[serverList.SelectedIndex]; - server.ConnectionString = "server=" + activeConfig.host + ";uid=" + activeConfig.uid + - ";pwd=" + activeConfig.pwd + ";pooling=false;database=mysql"; - MessageBox.Show(server.ConnectionString, "connstr"); - objectList.Items.Clear(); - activeServer.Text = activeConfig.name; - - try - { - server.Open(); - - MySqlCommand cmd = new MySqlCommand("SHOW DATABASES", server); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - dbList.Items.Clear(); - while (reader.Read()) - { - dbList.Items.Add(reader.GetString(0)); - } - } - } - catch (MySqlException ex) - { - MessageBox.Show(ex.Message); - } - - showServerPanel.BringToFront(); - } - - private void dbList_SelectedIndexChanged(object sender, System.EventArgs e) - { - try - { - server.Close(); - server.ConnectionString = "server=monster;uid=reggie;pwd=reggie;database=" + dbList.SelectedItem; - server.Open(); - } - catch (Exception ex) - { - MessageBox.Show(ex.Message); - } - } - - private void objectTypeList_SelectedIndexChanged(object sender, System.EventArgs e) - { - string sql = null; - - objectList.Items.Clear(); - - switch (objectTypeList.SelectedIndex) - { - case 0: - sql = "SHOW TABLES"; - break; - case 1: - if (!server.ServerVersion.StartsWith("5")) return; - sql = "SELECT name FROM mysql.proc WHERE db='" + server.Database + "'"; - break; - case 2: - sql = "select name from mysql.func"; - break; - case 3: - return; - } - - MySqlCommand cmd = new MySqlCommand(sql, server); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - while (reader.Read()) - objectList.Items.Add(reader.GetString(0)); - } - } - - private void backToChooserBtn_Click(object sender, System.EventArgs e) - { - server.Close(); - this.chooseServerPanel.BringToFront(); - } - - private void backToServerBtn_Click(object sender, System.EventArgs e) - { - activeTable.Text = String.Empty; - tableGrid.DataSource = null; - showServerPanel.BringToFront(); - } - - private void ShowTable() - { - DataSet ds = new DataSet(); - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM " + objectList.SelectedItem, server); - activeTable.Text = objectList.SelectedItem.ToString(); - da.Fill(ds); - tableGrid.DataSource = ds.Tables[0]; - this.tableViewPanel.BringToFront(); - } - - private void ShowProc() - { - MySqlCommand cmd = new MySqlCommand("SHOW CREATE PROCEDURE " + objectList.SelectedItem, server); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - string body = reader.GetString(2); - body = body.Replace("\n", "\r\n"); - spText.Text = body; - } - activeProc.Text = objectList.SelectedItem.ToString(); - spViewPanel.BringToFront(); - } - - private void showObject_Click(object sender, System.EventArgs e) - { - switch (objectTypeList.SelectedIndex) - { - case 0: - ShowTable(); break; - case 1: - ShowProc(); break; - } - } - - private void newServer_Click(object sender, System.EventArgs e) - { - NewServerDialog d = new NewServerDialog(); - DialogResult result = d.ShowDialog(); - if (result == DialogResult.Cancel) return; - - ServerConfig sc = d.GetServerConfig(); - servers.Add(sc); - serverList.Items.Add(sc); - SaveServers(); - } - - private void SaveServers() - { - FileStream fs = new FileStream(@"\My Documents\MobileExplorer.dat", FileMode.Create); - StreamWriter sw = new StreamWriter(fs); - - foreach (ServerConfig sc in servers) - { - string line = sc.name + "|" + sc.host + "|" + sc.uid + "|" + sc.pwd; - sw.WriteLine(line); - } - - sw.Close(); - fs.Close(); - } - - private void LoadServers() - { - servers.Clear(); - serverList.Items.Clear(); - - try - { - if (!File.Exists(@"\My Documents\MobileExplorer.dat")) return; - - StreamReader sr = new StreamReader(@"\My Documents\MobileExplorer.dat"); - string line = sr.ReadLine(); - while (line != null) - { - string[] parts = line.Split('|'); - ServerConfig sc = new ServerConfig(); - sc.name = parts[0]; - sc.host = parts[1]; - sc.uid = parts[2]; - sc.pwd = parts[3]; - servers.Add(sc); - serverList.Items.Add(sc.name); - line = sr.ReadLine(); - } - sr.Close(); - } - catch (Exception ex) - { - } - } - - private void deleteServer_Click(object sender, System.EventArgs e) - { - if (serverList.SelectedIndex == -1) - { - MessageBox.Show("You do not have a server selected"); - return; - } - - ServerConfig sc = (ServerConfig)servers[serverList.SelectedIndex]; - DialogResult result = MessageBox.Show("Are you sure you want to delete server '" + sc.name + "'", - "Delete Server", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxDefaultButton.Button3); - if (result == DialogResult.Cancel) return; - if (result == DialogResult.No) return; - servers.RemoveAt(serverList.SelectedIndex); - SaveServers(); - } - - private void cancel_Click(object sender, System.EventArgs e) - { - activeProc.Text = String.Empty; - spText.Text = String.Empty; - showServerPanel.BringToFront(); - } - - private void ok_Click(object sender, System.EventArgs e) - { - MySqlCommand cmd = new MySqlCommand("DROP PROCEDURE " + objectList.SelectedItem + - ";" + spText.Text, server); - cmd.ExecuteNonQuery(); - activeProc.Text = String.Empty; - spText.Text = String.Empty; - showServerPanel.BringToFront(); - } - } - - internal struct ServerConfig - { - public string name; - public string host; - public string uid; - public string pwd; - } -} diff --git a/Samples/Pocket PC/MobileExplorer/Form1.resx b/Samples/Pocket PC/MobileExplorer/Form1.resx deleted file mode 100644 index f0c2219c9..000000000 --- a/Samples/Pocket PC/MobileExplorer/Form1.resx +++ /dev/null @@ -1,427 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Windows.Forms.Design.CFResXResourceReader, System.CF.Design, Version=7.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - System.Windows.Forms.Design.CFResXResourceWriter, System.CF.Design, Version=7.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - False - - - True - - - Private - - - 4, 4 - - - True - - - Private - - - False - - - Private - - - Private - - - Private - - - False - - - Private - - - False - - - Private - - - Private - - - False - - - True - - - Private - - - 4, 4 - - - True - - - Private - - - False - - - Private - - - Private - - - Private - - - False - - - Private - - - Private - - - False - - - Private - - - False - - - Private - - - Private - - - Private - - - False - - - Private - - - False - - - Private - - - Private - - - False - - - Private - - - Private - - - False - - - Private - - - Private - - - False - - - Private - - - Private - - - False - - - True - - - Private - - - 4, 4 - - - True - - - Private - - - False - - - Private - - - Private - - - False - - - Private - - - Private - - - False - - - Private - - - Private - - - False - - - Private - - - Private - - - False - - - Private - - - Private - - - Private - - - 17, 17 - - - Private - - - Private - - - Private - - - Private - - - Private - - - Private - - - Private - - - False - - - True - - - Private - - - 4, 4 - - - True - - - Private - - - False - - - Private - - - Private - - - False - - - Private - - - Private - - - Private - - - False - - - Private - - - False - - - Private - - - Private - - - False - - - Private - - - Private - - - False - - - (Default) - - - False - - - False - - - 4, 4 - - - True - - - 80 - - - True - - - Private - - - Form1 - - \ No newline at end of file diff --git a/Samples/Pocket PC/MobileExplorer/MobileExplorer.csdproj b/Samples/Pocket PC/MobileExplorer/MobileExplorer.csdproj deleted file mode 100644 index 3893e85e6..000000000 --- a/Samples/Pocket PC/MobileExplorer/MobileExplorer.csdproj +++ /dev/null @@ -1,182 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Samples/Pocket PC/MobileExplorer/MobileExplorer.sln b/Samples/Pocket PC/MobileExplorer/MobileExplorer.sln deleted file mode 100644 index 2e8fc23ce..000000000 --- a/Samples/Pocket PC/MobileExplorer/MobileExplorer.sln +++ /dev/null @@ -1,23 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{20D4826A-C6FA-45DB-90F4-C717570B9F32}") = "MobileExplorer", "MobileExplorer.csdproj", "{64CC840B-DDA1-4CBB-98FC-FC19FF591C3C}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {64CC840B-DDA1-4CBB-98FC-FC19FF591C3C}.Debug.ActiveCfg = Debug|Windows CE - {64CC840B-DDA1-4CBB-98FC-FC19FF591C3C}.Debug.Build.0 = Debug|Windows CE - {64CC840B-DDA1-4CBB-98FC-FC19FF591C3C}.Debug.Deploy.0 = Debug|Windows CE - {64CC840B-DDA1-4CBB-98FC-FC19FF591C3C}.Release.ActiveCfg = Release|Windows CE - {64CC840B-DDA1-4CBB-98FC-FC19FF591C3C}.Release.Build.0 = Release|Windows CE - {64CC840B-DDA1-4CBB-98FC-FC19FF591C3C}.Release.Deploy.0 = Release|Windows CE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/Samples/Pocket PC/MobileExplorer/MobileExplorer.suo b/Samples/Pocket PC/MobileExplorer/MobileExplorer.suo deleted file mode 100644 index a0d61bbee..000000000 Binary files a/Samples/Pocket PC/MobileExplorer/MobileExplorer.suo and /dev/null differ diff --git a/Samples/Pocket PC/MobileExplorer/NewServerDialog.cs b/Samples/Pocket PC/MobileExplorer/NewServerDialog.cs deleted file mode 100644 index 243fe9123..000000000 --- a/Samples/Pocket PC/MobileExplorer/NewServerDialog.cs +++ /dev/null @@ -1,169 +0,0 @@ -using System; -using System.Drawing; -using System.Collections; -using System.ComponentModel; -using System.Windows.Forms; - -namespace MobileExplorer -{ - /// - /// Summary description for NewServerDialog. - /// - public class NewServerDialog : System.Windows.Forms.Form - { - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.Button okBtn; - private System.Windows.Forms.TextBox name; - private System.Windows.Forms.TextBox host; - private System.Windows.Forms.TextBox uid; - private System.Windows.Forms.TextBox pwd; - private System.Windows.Forms.Button cancelBtn; - - public NewServerDialog() - { - // - // Required for Windows Form Designer support - // - InitializeComponent(); - - // - // TODO: Add any constructor code after InitializeComponent call - // - } - - /// - /// Clean up any resources being used. - /// - protected override void Dispose( bool disposing ) - { - base.Dispose( disposing ); - } - - #region Windows Form Designer generated code - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.label1 = new System.Windows.Forms.Label(); - this.name = new System.Windows.Forms.TextBox(); - this.label2 = new System.Windows.Forms.Label(); - this.host = new System.Windows.Forms.TextBox(); - this.label3 = new System.Windows.Forms.Label(); - this.uid = new System.Windows.Forms.TextBox(); - this.label4 = new System.Windows.Forms.Label(); - this.pwd = new System.Windows.Forms.TextBox(); - this.okBtn = new System.Windows.Forms.Button(); - this.cancelBtn = new System.Windows.Forms.Button(); - // - // label1 - // - this.label1.Location = new System.Drawing.Point(8, 12); - this.label1.Size = new System.Drawing.Size(52, 20); - this.label1.Text = "Name:"; - // - // name - // - this.name.Location = new System.Drawing.Point(8, 28); - this.name.Size = new System.Drawing.Size(168, 22); - this.name.Text = ""; - // - // label2 - // - this.label2.Location = new System.Drawing.Point(8, 72); - this.label2.Size = new System.Drawing.Size(52, 20); - this.label2.Text = "Host:"; - // - // host - // - this.host.Location = new System.Drawing.Point(8, 88); - this.host.Size = new System.Drawing.Size(168, 22); - this.host.Text = ""; - // - // label3 - // - this.label3.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular); - this.label3.Location = new System.Drawing.Point(8, 120); - this.label3.Size = new System.Drawing.Size(60, 20); - this.label3.Text = "User Id:"; - // - // uid - // - this.uid.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular); - this.uid.Location = new System.Drawing.Point(8, 136); - this.uid.Size = new System.Drawing.Size(168, 22); - this.uid.Text = ""; - // - // label4 - // - this.label4.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular); - this.label4.Location = new System.Drawing.Point(8, 168); - this.label4.Size = new System.Drawing.Size(60, 20); - this.label4.Text = "Password:"; - // - // pwd - // - this.pwd.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular); - this.pwd.Location = new System.Drawing.Point(8, 184); - this.pwd.Size = new System.Drawing.Size(168, 22); - this.pwd.Text = ""; - // - // okBtn - // - this.okBtn.Location = new System.Drawing.Point(104, 220); - this.okBtn.Text = "OK"; - this.okBtn.Click += new System.EventHandler(this.okBtn_Click); - // - // cancelBtn - // - this.cancelBtn.Location = new System.Drawing.Point(24, 220); - this.cancelBtn.Text = "Cancel"; - this.cancelBtn.Click += new System.EventHandler(this.cancelBtn_Click); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; - // - // NewServerDialog - // - this.ClientSize = new System.Drawing.Size(190, 272); - this.ControlBox = false; - this.Controls.Add(this.cancelBtn); - this.Controls.Add(this.okBtn); - this.Controls.Add(this.pwd); - this.Controls.Add(this.label4); - this.Controls.Add(this.uid); - this.Controls.Add(this.label3); - this.Controls.Add(this.host); - this.Controls.Add(this.label2); - this.Controls.Add(this.name); - this.Controls.Add(this.label1); - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Text = "NewServerDialog"; - - } - #endregion - - private void cancelBtn_Click(object sender, System.EventArgs e) - { - this.Close(); - } - - private void okBtn_Click(object sender, System.EventArgs e) - { - this.Close(); - } - - internal ServerConfig GetServerConfig() - { - ServerConfig sc = new ServerConfig(); - sc.name = name.Text; - sc.host = host.Text; - sc.uid = uid.Text; - sc.pwd = pwd.Text; - return sc; - } - } -} diff --git a/Samples/Pocket PC/MobileExplorer/NewServerDialog.resx b/Samples/Pocket PC/MobileExplorer/NewServerDialog.resx deleted file mode 100644 index fec443063..000000000 --- a/Samples/Pocket PC/MobileExplorer/NewServerDialog.resx +++ /dev/null @@ -1,220 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Windows.Forms.Design.CFResXResourceReader, System.CF.Design, Version=7.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - System.Windows.Forms.Design.CFResXResourceWriter, System.CF.Design, Version=7.0.5000.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - False - - - Private - - - Private - - - Private - - - False - - - Private - - - False - - - Private - - - Private - - - Private - - - Private - - - False - - - False - - - Private - - - Private - - - Private - - - False - - - Private - - - False - - - Private - - - Private - - - Private - - - False - - - Private - - - False - - - Private - - - Private - - - False - - - Private - - - Private - - - False - - - (Default) - - - False - - - NewServerDialog - - - False - - - 4, 4 - - - True - - - 80 - - - True - - - Private - - \ No newline at end of file diff --git a/Samples/Pocket PC/Tester/FailDetails.Designer.cs b/Samples/Pocket PC/Tester/FailDetails.Designer.cs deleted file mode 100644 index 33a787b9e..000000000 --- a/Samples/Pocket PC/Tester/FailDetails.Designer.cs +++ /dev/null @@ -1,106 +0,0 @@ -namespace DeviceApplication1 -{ - partial class FailDetails - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - private System.Windows.Forms.MainMenu mainMenu1; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.mainMenu1 = new System.Windows.Forms.MainMenu(); - this.msg = new System.Windows.Forms.TextBox(); - this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.trace = new System.Windows.Forms.TextBox(); - this.ok = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // msg - // - this.msg.Location = new System.Drawing.Point(3, 34); - this.msg.Multiline = true; - this.msg.Name = "msg"; - this.msg.Size = new System.Drawing.Size(234, 52); - this.msg.TabIndex = 0; - // - // label1 - // - this.label1.Location = new System.Drawing.Point(3, 11); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(100, 20); - this.label1.Text = "Message"; - // - // label2 - // - this.label2.Location = new System.Drawing.Point(3, 98); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(100, 20); - this.label2.Text = "Stack trace"; - // - // trace - // - this.trace.Location = new System.Drawing.Point(3, 121); - this.trace.Multiline = true; - this.trace.Name = "trace"; - this.trace.Size = new System.Drawing.Size(234, 118); - this.trace.TabIndex = 3; - // - // ok - // - this.ok.DialogResult = System.Windows.Forms.DialogResult.OK; - this.ok.Location = new System.Drawing.Point(165, 256); - this.ok.Name = "ok"; - this.ok.Size = new System.Drawing.Size(72, 20); - this.ok.TabIndex = 5; - this.ok.Text = "OK"; - // - // FailDetails - // - this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; - this.AutoScroll = true; - this.ClientSize = new System.Drawing.Size(240, 294); - this.ControlBox = false; - this.Controls.Add(this.ok); - this.Controls.Add(this.label2); - this.Controls.Add(this.trace); - this.Controls.Add(this.label1); - this.Controls.Add(this.msg); - this.MinimizeBox = false; - this.Name = "FailDetails"; - this.Text = "FailDetails"; - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.TextBox msg; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.TextBox trace; - private System.Windows.Forms.Button ok; - } -} \ No newline at end of file diff --git a/Samples/Pocket PC/Tester/FailDetails.cs b/Samples/Pocket PC/Tester/FailDetails.cs deleted file mode 100644 index 610015115..000000000 --- a/Samples/Pocket PC/Tester/FailDetails.cs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (C) 2004-2007 MySQL AB -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Text; -using System.Windows.Forms; - -namespace DeviceApplication1 -{ - public partial class FailDetails : Form - { - public FailDetails() - { - InitializeComponent(); - } - - public string Message - { - set { msg.Text = value; } - } - - public string Trace - { - set { trace.Text = value; } - } - } -} \ No newline at end of file diff --git a/Samples/Pocket PC/Tester/FailDetails.resx b/Samples/Pocket PC/Tester/FailDetails.resx deleted file mode 100644 index 7a83ef27f..000000000 --- a/Samples/Pocket PC/Tester/FailDetails.resx +++ /dev/null @@ -1,129 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - 17, 17 - - - POCKET_PC_2003_PORTRAIT - - - True - - \ No newline at end of file diff --git a/Samples/Pocket PC/Tester/Form1.Designer.cs b/Samples/Pocket PC/Tester/Form1.Designer.cs deleted file mode 100644 index 8f66301dd..000000000 --- a/Samples/Pocket PC/Tester/Form1.Designer.cs +++ /dev/null @@ -1,117 +0,0 @@ -namespace DeviceApplication1 -{ - partial class MainForm - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - private System.Windows.Forms.MainMenu mainMenu1; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); - this.mainMenu1 = new System.Windows.Forms.MainMenu(); - this.menuItem1 = new System.Windows.Forms.MenuItem(); - this.runTestsMenu = new System.Windows.Forms.MenuItem(); - this.showDetailsMenu = new System.Windows.Forms.MenuItem(); - this.label1 = new System.Windows.Forms.Label(); - this.testTree = new System.Windows.Forms.TreeView(); - this.imageList1 = new System.Windows.Forms.ImageList(); - this.runSelected = new System.Windows.Forms.MenuItem(); - this.SuspendLayout(); - // - // mainMenu1 - // - this.mainMenu1.MenuItems.Add(this.menuItem1); - // - // menuItem1 - // - this.menuItem1.MenuItems.Add(this.runTestsMenu); - this.menuItem1.MenuItems.Add(this.showDetailsMenu); - this.menuItem1.MenuItems.Add(this.runSelected); - this.menuItem1.Text = "&Options"; - // - // runTestsMenu - // - this.runTestsMenu.Text = "&Run Tests"; - this.runTestsMenu.Click += new System.EventHandler(this.runTestsMenu_Click); - // - // showDetailsMenu - // - this.showDetailsMenu.Text = "&Show Details..."; - this.showDetailsMenu.Click += new System.EventHandler(this.showDetailsMenu_Click); - // - // label1 - // - this.label1.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Bold); - this.label1.Location = new System.Drawing.Point(11, 11); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(108, 20); - this.label1.Text = "Tests:"; - // - // testTree - // - this.testTree.ImageIndex = 2; - this.testTree.ImageList = this.imageList1; - this.testTree.Location = new System.Drawing.Point(3, 34); - this.testTree.Name = "testTree"; - this.testTree.SelectedImageIndex = 2; - this.testTree.Size = new System.Drawing.Size(234, 231); - this.testTree.TabIndex = 17; - this.imageList1.Images.Clear(); - this.imageList1.Images.Add(((System.Drawing.Image)(resources.GetObject("resource")))); - this.imageList1.Images.Add(((System.Drawing.Image)(resources.GetObject("resource1")))); - this.imageList1.Images.Add(((System.Drawing.Image)(resources.GetObject("resource2")))); - // - // runSelected - // - this.runSelected.Text = "Run Selected &Tests"; - this.runSelected.Click += new System.EventHandler(this.runSelected_Click); - // - // MainForm - // - this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; - this.AutoScroll = true; - this.ClientSize = new System.Drawing.Size(240, 268); - this.Controls.Add(this.testTree); - this.Controls.Add(this.label1); - this.Menu = this.mainMenu1; - this.Name = "MainForm"; - this.Text = "MySQL Tester"; - this.ResumeLayout(false); - - } - - #endregion - - private System.Windows.Forms.MenuItem menuItem1; - private System.Windows.Forms.MenuItem runTestsMenu; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.TreeView testTree; - private System.Windows.Forms.ImageList imageList1; - private System.Windows.Forms.MenuItem showDetailsMenu; - private System.Windows.Forms.MenuItem runSelected; - } -} - diff --git a/Samples/Pocket PC/Tester/Form1.cs b/Samples/Pocket PC/Tester/Form1.cs deleted file mode 100644 index 4a1514165..000000000 --- a/Samples/Pocket PC/Tester/Form1.cs +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright (C) 2004-2007 MySQL AB -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Text; -using System.Windows.Forms; -using MySql.Data.MySqlClient.Tests; -using System.Reflection; -using System.Collections; -using System.Threading; - -namespace DeviceApplication1 -{ - public partial class MainForm : Form - { - private TestRunner runner; - public delegate void NodeUpdater(int fixture, int test, int index); - public NodeUpdater updater; - int fixtureStart; - int fixtureEnd; - int testStart; - int testEnd; - - public MainForm() - { - InitializeComponent(); - LoadTests(); - updater = new NodeUpdater(UpdateNode); - } - - private void LoadTests() - { - runner = new TestRunner(); - ArrayList tests = runner.LoadTests(); - foreach (TestCollection tc in tests) - { - TreeNode fixture = testTree.Nodes.Add(tc.name); - fixture.Tag = tc; - foreach (TestMethod tm in tc.testMethods) - { - TreeNode test = fixture.Nodes.Add(tm.member.Name); - test.Tag = tm; - } - } - } - - private void RunTests() - { - Thread t = new Thread(new ThreadStart(RunTestsWorker)); - t.Start(); - } - - private void UpdateNode(int fixture, int test, int index) - { - TreeNode node; - - if (test == -1) - node = testTree.Nodes[fixture]; - else - node = testTree.Nodes[fixture].Nodes[test]; - node.ImageIndex = index; - node.SelectedImageIndex = index; - } - - private void RunTestsWorker() - { - for (int i = fixtureStart; i < fixtureEnd; i++) - { - int fixtureIndex = 1; - - try - { - TestCollection tc = (TestCollection)testTree.Nodes[i].Tag; - runner.StartFixture(tc); - - int myTestEnd = testEnd; - if (testEnd == -1) - myTestEnd = tc.testMethods.Count; - for (int x = testStart; x < myTestEnd; x++) - { - int index = 1; - if (!runner.RunTest(i, x)) - { - fixtureIndex = 0; - index = 0; - } - this.Invoke(updater, i, x, index); - } - - runner.EndFixture(tc); - } - catch (Exception ex) - { - fixtureIndex = 0; - } - this.Invoke(updater, i, -1, fixtureIndex); - } - } - - private void showDetailsMenu_Click(object sender, EventArgs e) - { - if (testTree.SelectedNode == null) - MessageBox.Show("No test selected"); - FailDetails fd = new FailDetails(); - TreeNode node = testTree.SelectedNode; - if (node.Parent == null) - { - TestCollection tc = (TestCollection)node.Tag; - fd.Message = tc.message; - fd.Trace = tc.stack; - } - else - { - TestMethod tm = (TestMethod)node.Tag; - fd.Message = tm.message; - fd.Trace = tm.stack; - } - fd.ShowDialog(); - } - - private void runTestsMenu_Click(object sender, EventArgs e) - { - ResetTree(); - fixtureStart = 0; - fixtureEnd = testTree.Nodes.Count; - testStart = 0; - testEnd = -1; - RunTests(); - } - - private void runSelected_Click(object sender, EventArgs e) - { - if (testTree.SelectedNode == null) - MessageBox.Show("No test selected"); - ResetTree(); - TreeNode selNode = testTree.SelectedNode; - testStart = 0; - testEnd = -1; - if (selNode.Parent != null) - { - testStart = selNode.Index; - testEnd = testStart + 1; - selNode = selNode.Parent; - } - fixtureStart = selNode.Index; - fixtureEnd = fixtureStart + 1; - RunTests(); - } - - private void ResetTree() - { - foreach (TreeNode node in testTree.Nodes) - { - node.ImageIndex = 2; - node.SelectedImageIndex = 2; - foreach (TreeNode test in node.Nodes) - { - test.ImageIndex = 2; - test.SelectedImageIndex = 2; - } - } - } - } -} \ No newline at end of file diff --git a/Samples/Pocket PC/Tester/Form1.resx b/Samples/Pocket PC/Tester/Form1.resx deleted file mode 100644 index 5c3acaf9f..000000000 --- a/Samples/Pocket PC/Tester/Form1.resx +++ /dev/null @@ -1,156 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - 17, 17 - - - 134, 17 - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAFpJREFUOE9j/A8E - DOiAkRFDCCyARSlQDAlAlBDGyFrgbGI0IquBaoS4gFTNMPUgrZQbQK7tUH0MZDt/1AB41FMhGqmSkMgx - BCUpwzIEsYkKa2YiJleiZF0IBwCCRi/wAJMMHQAAAABJRU5ErkJggg== - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAGVJREFUOE9j/A8E - DGiAkUEJXQjM/89wD1McZAAMMPxX/E8MRtUD5RGjEVkNwlKQF4i0GV0d2PsQgjinYzWAXM1wfaMGABMh - mTGA0EdpNFKcDkjNBzCnoyRlUg3BmpmIyZXIamBsAB5jSfqm8jHwAAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAACVJREFUOE9j/A8E - DJQAkAGUAAZKNINdP2rAaBiMpgNwLqA4LwAAlW3Aa6noFWgAAAAASUVORK5CYII= - - - - POCKET_PC_2003_PORTRAIT - - - True - - \ No newline at end of file diff --git a/Samples/Pocket PC/Tester/MySql.Data.Tests.CF.dll.config b/Samples/Pocket PC/Tester/MySql.Data.Tests.CF.dll.config deleted file mode 100644 index fa19191a3..000000000 --- a/Samples/Pocket PC/Tester/MySql.Data.Tests.CF.dll.config +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/Samples/Pocket PC/Tester/Program.cs b/Samples/Pocket PC/Tester/Program.cs deleted file mode 100644 index bd4a2deb8..000000000 --- a/Samples/Pocket PC/Tester/Program.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Windows.Forms; - -namespace DeviceApplication1 -{ - static class Program - { - /// - /// The main entry point for the application. - /// - [MTAThread] - static void Main() - { - Application.Run(new MainForm()); - } - } -} \ No newline at end of file diff --git a/Samples/Pocket PC/Tester/Properties/AssemblyInfo.cs b/Samples/Pocket PC/Tester/Properties/AssemblyInfo.cs deleted file mode 100644 index fca10c6d2..000000000 --- a/Samples/Pocket PC/Tester/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using 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. -[assembly: AssemblyTitle("DeviceApplication1")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Microsoft")] -[assembly: AssemblyProduct("DeviceApplication1")] -[assembly: AssemblyCopyright("Copyright © Microsoft 2007")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("add8ee1a-806b-4fba-bd00-1507ed0a2087")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -[assembly: AssemblyVersion("1.0.0.0")] - diff --git a/Samples/Pocket PC/Tester/Properties/Resources.Designer.cs b/Samples/Pocket PC/Tester/Properties/Resources.Designer.cs deleted file mode 100644 index fe4276b3b..000000000 --- a/Samples/Pocket PC/Tester/Properties/Resources.Designer.cs +++ /dev/null @@ -1,60 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.312 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace DeviceApplication1.Properties { - 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.Diagnostics.DebuggerNonUserCodeAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - internal Resources() { - } - - /// - /// 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("DeviceApplication1.Properties.Resources", typeof(Resources).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; - } - } - } -} diff --git a/Samples/Pocket PC/Tester/Properties/Resources.resx b/Samples/Pocket PC/Tester/Properties/Resources.resx deleted file mode 100644 index a81444952..000000000 --- a/Samples/Pocket PC/Tester/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Samples/Pocket PC/Tester/Properties/green.png b/Samples/Pocket PC/Tester/Properties/green.png deleted file mode 100644 index 298f319a0..000000000 Binary files a/Samples/Pocket PC/Tester/Properties/green.png and /dev/null differ diff --git a/Samples/Pocket PC/Tester/Properties/red.png b/Samples/Pocket PC/Tester/Properties/red.png deleted file mode 100644 index 4a1678d67..000000000 Binary files a/Samples/Pocket PC/Tester/Properties/red.png and /dev/null differ diff --git a/Samples/Pocket PC/Tester/Properties/white.png b/Samples/Pocket PC/Tester/Properties/white.png deleted file mode 100644 index a0057d071..000000000 Binary files a/Samples/Pocket PC/Tester/Properties/white.png and /dev/null differ diff --git a/Samples/Pocket PC/Tester/Tester.csproj b/Samples/Pocket PC/Tester/Tester.csproj deleted file mode 100644 index 4089cf56b..000000000 --- a/Samples/Pocket PC/Tester/Tester.csproj +++ /dev/null @@ -1,115 +0,0 @@ - - - Debug - AnyCPU - 8.0.50727 - 2.0 - {C3904AC7-1888-42CF-A3AC-7ADC1BA41704} - WinExe - Properties - DeviceApplication1 - DeviceApplication1 - {4D628B5B-2FBC-4AA6-8C16-197242AEB884};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - PocketPC - 3C41C503-53EF-4c2a-8DD4-A8217CAD115E - 4.20 - DeviceApplication1 - v2.0 - - - - - true - full - false - bin\Debug\ - DEBUG;TRACE;$(PlatformFamilyName) - true - true - prompt - 512 - 4 - Off - - - pdbonly - true - bin\Release\ - TRACE;$(PlatformFamilyName) - true - true - prompt - 512 - 4 - Off - - - - - - - - - - - - Form - - - FailDetails.cs - - - Form - - - Form1.cs - - - - - Designer - FailDetails.cs - - - Designer - Form1.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - True - - - - - {710D9251-17A3-4429-9A91-63F03267F310} - MySql.Data.Tests.CF - - - - - Always - - - - - - - - - - - - - \ No newline at end of file diff --git a/Samples/Profiling/cs/Form1.Designer.cs b/Samples/Profiling/cs/Form1.Designer.cs deleted file mode 100644 index 50a3c8db6..000000000 --- a/Samples/Profiling/cs/Form1.Designer.cs +++ /dev/null @@ -1,278 +0,0 @@ -namespace Profiling -{ - partial class Form1 - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.server = new System.Windows.Forms.TextBox(); - this.userid = new System.Windows.Forms.TextBox(); - this.label3 = new System.Windows.Forms.Label(); - this.password = new System.Windows.Forms.TextBox(); - this.label4 = new System.Windows.Forms.Label(); - this.database = new System.Windows.Forms.TextBox(); - this.sockets = new System.Windows.Forms.CheckBox(); - this.portNum = new System.Windows.Forms.TextBox(); - this.label5 = new System.Windows.Forms.Label(); - this.pipeName = new System.Windows.Forms.TextBox(); - this.label6 = new System.Windows.Forms.Label(); - this.useNamedPipes = new System.Windows.Forms.CheckBox(); - this.memName = new System.Windows.Forms.TextBox(); - this.label7 = new System.Windows.Forms.Label(); - this.useSharedMem = new System.Windows.Forms.CheckBox(); - this.output = new System.Windows.Forms.TextBox(); - this.testBtn = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(12, 15); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(41, 13); - this.label1.TabIndex = 0; - this.label1.Text = "Server:"; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(12, 40); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(44, 13); - this.label2.TabIndex = 1; - this.label2.Text = "User Id:"; - // - // server - // - this.server.Location = new System.Drawing.Point(59, 8); - this.server.Name = "server"; - this.server.Size = new System.Drawing.Size(149, 20); - this.server.TabIndex = 2; - // - // userid - // - this.userid.Location = new System.Drawing.Point(59, 34); - this.userid.Name = "userid"; - this.userid.Size = new System.Drawing.Size(149, 20); - this.userid.TabIndex = 3; - // - // label3 - // - this.label3.AutoSize = true; - this.label3.Location = new System.Drawing.Point(214, 37); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(56, 13); - this.label3.TabIndex = 4; - this.label3.Text = "Password:"; - // - // password - // - this.password.Location = new System.Drawing.Point(276, 37); - this.password.Name = "password"; - this.password.Size = new System.Drawing.Size(149, 20); - this.password.TabIndex = 5; - // - // label4 - // - this.label4.AutoSize = true; - this.label4.Location = new System.Drawing.Point(214, 15); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(56, 13); - this.label4.TabIndex = 6; - this.label4.Text = "Database:"; - // - // database - // - this.database.Location = new System.Drawing.Point(276, 8); - this.database.Name = "database"; - this.database.Size = new System.Drawing.Size(149, 20); - this.database.TabIndex = 7; - this.database.Text = "test"; - // - // sockets - // - this.sockets.AutoSize = true; - this.sockets.Checked = true; - this.sockets.CheckState = System.Windows.Forms.CheckState.Checked; - this.sockets.Location = new System.Drawing.Point(15, 65); - this.sockets.Name = "sockets"; - this.sockets.Size = new System.Drawing.Size(84, 17); - this.sockets.TabIndex = 8; - this.sockets.Text = "Use TCP/IP"; - this.sockets.UseVisualStyleBackColor = true; - // - // portNum - // - this.portNum.Location = new System.Drawing.Point(220, 62); - this.portNum.Name = "portNum"; - this.portNum.Size = new System.Drawing.Size(53, 20); - this.portNum.TabIndex = 10; - this.portNum.Text = "3306"; - // - // label5 - // - this.label5.AutoSize = true; - this.label5.Location = new System.Drawing.Point(139, 65); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(29, 13); - this.label5.TabIndex = 9; - this.label5.Text = "Port:"; - // - // pipeName - // - this.pipeName.Location = new System.Drawing.Point(220, 86); - this.pipeName.Name = "pipeName"; - this.pipeName.Size = new System.Drawing.Size(53, 20); - this.pipeName.TabIndex = 13; - this.pipeName.Text = "MYSQL"; - // - // label6 - // - this.label6.AutoSize = true; - this.label6.Location = new System.Drawing.Point(139, 89); - this.label6.Name = "label6"; - this.label6.Size = new System.Drawing.Size(62, 13); - this.label6.TabIndex = 12; - this.label6.Text = "Pipe Name:"; - // - // useNamedPipes - // - this.useNamedPipes.AutoSize = true; - this.useNamedPipes.Checked = true; - this.useNamedPipes.CheckState = System.Windows.Forms.CheckState.Checked; - this.useNamedPipes.Location = new System.Drawing.Point(15, 88); - this.useNamedPipes.Name = "useNamedPipes"; - this.useNamedPipes.Size = new System.Drawing.Size(111, 17); - this.useNamedPipes.TabIndex = 11; - this.useNamedPipes.Text = "Use Named Pipes"; - this.useNamedPipes.UseVisualStyleBackColor = true; - // - // memName - // - this.memName.Location = new System.Drawing.Point(220, 109); - this.memName.Name = "memName"; - this.memName.Size = new System.Drawing.Size(53, 20); - this.memName.TabIndex = 16; - this.memName.Text = "MYSQL"; - // - // label7 - // - this.label7.AutoSize = true; - this.label7.Location = new System.Drawing.Point(139, 112); - this.label7.Name = "label7"; - this.label7.Size = new System.Drawing.Size(78, 13); - this.label7.TabIndex = 15; - this.label7.Text = "Memory Name:"; - // - // useSharedMem - // - this.useSharedMem.AutoSize = true; - this.useSharedMem.Checked = true; - this.useSharedMem.CheckState = System.Windows.Forms.CheckState.Checked; - this.useSharedMem.Location = new System.Drawing.Point(15, 111); - this.useSharedMem.Name = "useSharedMem"; - this.useSharedMem.Size = new System.Drawing.Size(122, 17); - this.useSharedMem.TabIndex = 14; - this.useSharedMem.Text = "Use Shared Memory"; - this.useSharedMem.UseVisualStyleBackColor = true; - // - // output - // - this.output.Location = new System.Drawing.Point(12, 160); - this.output.Multiline = true; - this.output.Name = "output"; - this.output.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.output.Size = new System.Drawing.Size(413, 332); - this.output.TabIndex = 17; - // - // testBtn - // - this.testBtn.Location = new System.Drawing.Point(350, 102); - this.testBtn.Name = "testBtn"; - this.testBtn.Size = new System.Drawing.Size(75, 23); - this.testBtn.TabIndex = 18; - this.testBtn.Text = "Test"; - this.testBtn.UseVisualStyleBackColor = true; - this.testBtn.Click += new System.EventHandler(this.testBtn_Click); - // - // Form1 - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(436, 504); - this.Controls.Add(this.testBtn); - this.Controls.Add(this.output); - this.Controls.Add(this.memName); - this.Controls.Add(this.label7); - this.Controls.Add(this.useSharedMem); - this.Controls.Add(this.pipeName); - this.Controls.Add(this.label6); - this.Controls.Add(this.useNamedPipes); - this.Controls.Add(this.portNum); - this.Controls.Add(this.label5); - this.Controls.Add(this.sockets); - this.Controls.Add(this.database); - this.Controls.Add(this.label4); - this.Controls.Add(this.password); - this.Controls.Add(this.label3); - this.Controls.Add(this.userid); - this.Controls.Add(this.server); - this.Controls.Add(this.label2); - this.Controls.Add(this.label1); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D; - this.Name = "Form1"; - this.Text = "Form1"; - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.TextBox server; - private System.Windows.Forms.TextBox userid; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.TextBox password; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.TextBox database; - private System.Windows.Forms.CheckBox sockets; - private System.Windows.Forms.TextBox portNum; - private System.Windows.Forms.Label label5; - private System.Windows.Forms.TextBox pipeName; - private System.Windows.Forms.Label label6; - private System.Windows.Forms.CheckBox useNamedPipes; - private System.Windows.Forms.TextBox memName; - private System.Windows.Forms.Label label7; - private System.Windows.Forms.CheckBox useSharedMem; - private System.Windows.Forms.TextBox output; - private System.Windows.Forms.Button testBtn; - } -} - diff --git a/Samples/Profiling/cs/Form1.cs b/Samples/Profiling/cs/Form1.cs deleted file mode 100644 index 40e51658d..000000000 --- a/Samples/Profiling/cs/Form1.cs +++ /dev/null @@ -1,159 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Text; -using System.Windows.Forms; -using System.Data.Common; -using MySql.Data.MySqlClient; -using System.Diagnostics; - -namespace Profiling -{ - public partial class Form1 : Form - { - MySqlConnection connection; - - public Form1() - { - InitializeComponent(); - } - - private void Log(string s) - { - output.Text += "\r\n" + s; - output.Refresh(); - } - - private void testBtn_Click(object sender, EventArgs e) - { - output.Clear(); - DateTime start = DateTime.Now; - Log("Starting tests at " + start.ToString()); - - try - { - if (sockets.Checked) - { - Log("\r\nTesting sockets"); - TestSockets(); - } - if (useNamedPipes.Checked) - { - Log("\r\nTesting named pipes"); - TestNamedPipes(); - } - if (useSharedMem.Checked) - { - Log("\r\nTesting shared memory"); - TestSharedMemory(); - } - Log("Done!"); - } - catch (Exception ex) - { - Log(ex.Message); - } - TimeSpan ts = DateTime.Now.Subtract(start); - Log(ts.ToString()); - } - - private void TestSockets() - { - Test(String.Format( - "server={0};uid={1};password={2};database={3};port={4}", - server.Text, userid.Text, password.Text, database.Text, portNum.Text)); - } - - private void TestNamedPipes() - { - Test(String.Format( - "server={0};uid={1};password={2};database={3};protocol=pipe;pipe={4}", - server.Text, userid.Text, password.Text, database.Text, pipeName.Text)); - } - - private void TestSharedMemory() - { - Test(String.Format( - "server={0};uid={1};password={2};database={3};protocol=memory;shared memory name={4}", - server.Text, userid.Text, password.Text, database.Text, memName.Text)); - } - - private void Test(string connectionString) - { - string[] desc = new string[4] { "no compression, no pooling", - "no compression, pooling", "compression, no pooling", "compression, pooling" }; - - string[] addons = new string[4] { ";compress=false;pooling=false", - ";compress=false;pooling=true", ";compress=true;pooling=false", - ";compress=true;pooling=true"}; - - for (int x=0; x < addons.Length; x++) - { - if (connection != null) - connection.Close(); - - Log("\r\nTest " + desc[x]); - connection = new MySqlConnection(connectionString + addons[x]); - connection.Open(); - - Log("\r\nnot using prepared tests"); - DoInsertTests(false); - DoSelectTests(false); - - Log("\r\nusing prepared tests"); - DoInsertTests(true); - DoSelectTests(true); - } - } - - private void DoInsertTests(bool prepared) - { - Log("Starting Insert tests"); - MySqlCommand cmd = new MySqlCommand("DROP TABLE IF EXISTS test", connection); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "CREATE TABLE test (id INT, name VARCHAR(50), fl FLOAT, dt DATETIME)"; - cmd.ExecuteNonQuery(); - - cmd.CommandText = "INSERT INTO test VALUES (?id, ?name, ?f1, ?dt)"; - cmd.Parameters.Add("?id", MySqlDbType.Int32); - cmd.Parameters.Add("?name", MySqlDbType.VarChar); - cmd.Parameters.Add("?f1", MySqlDbType.Float); - cmd.Parameters.Add("?dt", MySqlDbType.Datetime); - if (prepared) - cmd.Prepare(); - - for (int x=0; x < 500; x++) - { - cmd.Parameters[0].Value = x; - cmd.Parameters[1].Value = "Test"; - cmd.Parameters[2].Value = 0.0; - cmd.Parameters[3].Value = DateTime.Now; - cmd.ExecuteNonQuery(); - } - } - - private void DoSelectTests(bool prepared) - { - Log("Starting select tests"); - MySqlCommand cmd = new MySqlCommand("SELECT * FROM test", connection); - cmd.CommandTimeout = 0; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - int count = 0; - while (reader.Read()) - { - int id = reader.GetInt32(0); - Trace.WriteLine("id = " + id); - string name = reader.GetString(1); - float fl = reader.GetFloat(2); - DateTime dt = reader.GetDateTime(3); - count++; - } - Log("read " + count + " records"); - } - } - } -} \ No newline at end of file diff --git a/Samples/Profiling/cs/Form1.resx b/Samples/Profiling/cs/Form1.resx deleted file mode 100644 index ff31a6db5..000000000 --- a/Samples/Profiling/cs/Form1.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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/Samples/Profiling/cs/Profiling.csproj b/Samples/Profiling/cs/Profiling.csproj deleted file mode 100644 index 19e8f731a..000000000 --- a/Samples/Profiling/cs/Profiling.csproj +++ /dev/null @@ -1,83 +0,0 @@ - - - Debug - AnyCPU - 8.0.50727 - 2.0 - {79AEF3F3-2D3F-4CF4-91C8-BE94F77B6150} - WinExe - Properties - Profiling - Profiling - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - False - ..\..\..\mysqlclient\bin\net-2.0\Debug\MySql.Data.dll - - - - - - - - - - - Form - - - Form1.cs - - - - - Designer - Form1.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - \ No newline at end of file diff --git a/Samples/Profiling/cs/Program.cs b/Samples/Profiling/cs/Program.cs deleted file mode 100644 index b4aab0b7b..000000000 --- a/Samples/Profiling/cs/Program.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Windows.Forms; - -namespace Profiling -{ - static class Program - { - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() - { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new Form1()); - } - } -} \ No newline at end of file diff --git a/Samples/Profiling/cs/Properties/AssemblyInfo.cs b/Samples/Profiling/cs/Properties/AssemblyInfo.cs deleted file mode 100644 index 0533f0fb0..000000000 --- a/Samples/Profiling/cs/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using 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. -[assembly: AssemblyTitle("Profiling")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Profiling")] -[assembly: AssemblyCopyright("Copyright © 2006")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("2c383097-c402-454b-bb02-57d84d96a540")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Samples/Profiling/cs/Properties/Resources.Designer.cs b/Samples/Profiling/cs/Properties/Resources.Designer.cs deleted file mode 100644 index 9dc666e80..000000000 --- a/Samples/Profiling/cs/Properties/Resources.Designer.cs +++ /dev/null @@ -1,71 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.112 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Profiling.Properties -{ - - - /// - /// 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", "2.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources - { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() - { - } - - /// - /// 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 ((resourceMan == null)) - { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Profiling.Properties.Resources", typeof(Resources).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; - } - } - } -} diff --git a/Samples/Profiling/cs/Properties/Resources.resx b/Samples/Profiling/cs/Properties/Resources.resx deleted file mode 100644 index ffecec851..000000000 --- a/Samples/Profiling/cs/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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/Samples/Profiling/cs/Properties/Settings.Designer.cs b/Samples/Profiling/cs/Properties/Settings.Designer.cs deleted file mode 100644 index d4044370a..000000000 --- a/Samples/Profiling/cs/Properties/Settings.Designer.cs +++ /dev/null @@ -1,30 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.112 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Profiling.Properties -{ - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase - { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default - { - get - { - return defaultInstance; - } - } - } -} diff --git a/Samples/Profiling/cs/Properties/Settings.settings b/Samples/Profiling/cs/Properties/Settings.settings deleted file mode 100644 index abf36c5d3..000000000 --- a/Samples/Profiling/cs/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Samples/TableEditor/CS/App.ico b/Samples/TableEditor/CS/App.ico deleted file mode 100644 index 3a5525fd7..000000000 Binary files a/Samples/TableEditor/CS/App.ico and /dev/null differ diff --git a/Samples/TableEditor/CS/AssemblyInfo.cs b/Samples/TableEditor/CS/AssemblyInfo.cs deleted file mode 100644 index d2f19783c..000000000 --- a/Samples/TableEditor/CS/AssemblyInfo.cs +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (C) 2004-2005 MySQL AB -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Reflection; -using System.Runtime.CompilerServices; - -// -// 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. -// -[assembly: AssemblyTitle("")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// -// 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 Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("1.0.*")] - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the project output directory which is -// %Project Directory%\obj\. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// -[assembly: AssemblyDelaySign(false)] -[assembly: AssemblyKeyFile("")] -[assembly: AssemblyKeyName("")] diff --git a/Samples/TableEditor/CS/Form1.cs b/Samples/TableEditor/CS/Form1.cs deleted file mode 100644 index 1963c40e7..000000000 --- a/Samples/TableEditor/CS/Form1.cs +++ /dev/null @@ -1,347 +0,0 @@ -// Copyright (C) 2004-2005 MySQL AB -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Drawing; -using System.Collections; -using System.ComponentModel; -using System.Windows.Forms; -using System.Data; -using MySql.Data.MySqlClient; - -namespace TableEditor -{ - /// - /// Summary description for Form1. - /// - public class Form1 : System.Windows.Forms.Form - { - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Label label3; - private System.Windows.Forms.Label label4; - private System.Windows.Forms.ComboBox tables; - private System.Windows.Forms.TextBox server; - private System.Windows.Forms.TextBox userid; - private System.Windows.Forms.TextBox password; - private System.Windows.Forms.Button connectBtn; - private System.Windows.Forms.Button updateBtn; - /// - /// Required designer variable. - /// - private System.ComponentModel.Container components = null; - private System.Windows.Forms.ComboBox databaseList; - private System.Windows.Forms.Label label5; - - private MySqlConnection conn; - private DataTable data; - private MySqlDataAdapter da; - private System.Windows.Forms.DataGrid dataGrid; - private MySqlCommandBuilder cb; - - public Form1() - { - // - // Required for Windows Form Designer support - // - InitializeComponent(); - - // - // TODO: Add any constructor code after InitializeComponent call - // - } - - /// - /// Clean up any resources being used. - /// - protected override void Dispose( bool disposing ) - { - if( disposing ) - { - if (components != null) - { - components.Dispose(); - } - } - base.Dispose( disposing ); - } - - #region Windows Form Designer generated code - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.label1 = new System.Windows.Forms.Label(); - this.server = new System.Windows.Forms.TextBox(); - this.userid = new System.Windows.Forms.TextBox(); - this.label2 = new System.Windows.Forms.Label(); - this.password = new System.Windows.Forms.TextBox(); - this.label3 = new System.Windows.Forms.Label(); - this.connectBtn = new System.Windows.Forms.Button(); - this.label4 = new System.Windows.Forms.Label(); - this.tables = new System.Windows.Forms.ComboBox(); - this.dataGrid = new System.Windows.Forms.DataGrid(); - this.updateBtn = new System.Windows.Forms.Button(); - this.databaseList = new System.Windows.Forms.ComboBox(); - this.label5 = new System.Windows.Forms.Label(); - ((System.ComponentModel.ISupportInitialize)(this.dataGrid)).BeginInit(); - this.SuspendLayout(); - // - // label1 - // - this.label1.Location = new System.Drawing.Point(8, 11); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(48, 16); - this.label1.TabIndex = 0; - this.label1.Text = "Server:"; - // - // server - // - this.server.Location = new System.Drawing.Point(56, 8); - this.server.Name = "server"; - this.server.Size = new System.Drawing.Size(320, 20); - this.server.TabIndex = 1; - this.server.Text = ""; - // - // userid - // - this.userid.Location = new System.Drawing.Point(56, 32); - this.userid.Name = "userid"; - this.userid.Size = new System.Drawing.Size(120, 20); - this.userid.TabIndex = 3; - this.userid.Text = ""; - // - // label2 - // - this.label2.Location = new System.Drawing.Point(8, 37); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(48, 16); - this.label2.TabIndex = 2; - this.label2.Text = "User Id:"; - // - // password - // - this.password.Location = new System.Drawing.Point(260, 32); - this.password.Name = "password"; - this.password.PasswordChar = '*'; - this.password.Size = new System.Drawing.Size(116, 20); - this.password.TabIndex = 5; - this.password.Text = ""; - // - // label3 - // - this.label3.Location = new System.Drawing.Point(192, 37); - this.label3.Name = "label3"; - this.label3.Size = new System.Drawing.Size(56, 16); - this.label3.TabIndex = 4; - this.label3.Text = "Password:"; - // - // connectBtn - // - this.connectBtn.Location = new System.Drawing.Point(400, 8); - this.connectBtn.Name = "connectBtn"; - this.connectBtn.TabIndex = 6; - this.connectBtn.Text = "Connect"; - this.connectBtn.Click += new System.EventHandler(this.connectBtn_Click); - // - // label4 - // - this.label4.Location = new System.Drawing.Point(8, 109); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(64, 16); - this.label4.TabIndex = 0; - this.label4.Text = "Tables"; - // - // tables - // - this.tables.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.tables.Location = new System.Drawing.Point(80, 104); - this.tables.Name = "tables"; - this.tables.Size = new System.Drawing.Size(296, 21); - this.tables.TabIndex = 7; - this.tables.SelectedIndexChanged += new System.EventHandler(this.tables_SelectedIndexChanged); - // - // dataGrid - // - this.dataGrid.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.dataGrid.DataMember = ""; - this.dataGrid.HeaderForeColor = System.Drawing.SystemColors.ControlText; - this.dataGrid.Location = new System.Drawing.Point(8, 136); - this.dataGrid.Name = "dataGrid"; - this.dataGrid.Size = new System.Drawing.Size(544, 312); - this.dataGrid.TabIndex = 8; - // - // updateBtn - // - this.updateBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.updateBtn.Location = new System.Drawing.Point(477, 104); - this.updateBtn.Name = "updateBtn"; - this.updateBtn.TabIndex = 9; - this.updateBtn.Text = "Update"; - this.updateBtn.Click += new System.EventHandler(this.updateBtn_Click); - // - // databaseList - // - this.databaseList.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; - this.databaseList.Location = new System.Drawing.Point(80, 80); - this.databaseList.Name = "databaseList"; - this.databaseList.Size = new System.Drawing.Size(296, 21); - this.databaseList.TabIndex = 11; - this.databaseList.SelectedIndexChanged += new System.EventHandler(this.databaseList_SelectedIndexChanged); - // - // label5 - // - this.label5.Location = new System.Drawing.Point(8, 85); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(64, 16); - this.label5.TabIndex = 10; - this.label5.Text = "Databases"; - // - // Form1 - // - this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); - this.ClientSize = new System.Drawing.Size(560, 453); - this.Controls.Add(this.databaseList); - this.Controls.Add(this.label5); - this.Controls.Add(this.updateBtn); - this.Controls.Add(this.dataGrid); - this.Controls.Add(this.tables); - this.Controls.Add(this.connectBtn); - this.Controls.Add(this.password); - this.Controls.Add(this.label3); - this.Controls.Add(this.userid); - this.Controls.Add(this.label2); - this.Controls.Add(this.server); - this.Controls.Add(this.label1); - this.Controls.Add(this.label4); - this.Name = "Form1"; - this.Text = "Form1"; - ((System.ComponentModel.ISupportInitialize)(this.dataGrid)).EndInit(); - this.ResumeLayout(false); - - } - #endregion - - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() - { - Application.Run(new Form1()); - } - - private void connectBtn_Click(object sender, System.EventArgs e) - { - if (conn != null) - conn.Close(); - - string connStr = String.Format("server={0};user id={1}; password={2}; database=mysql; pooling=false", - server.Text, userid.Text, password.Text ); - - try - { - conn = new MySqlConnection( connStr ); - conn.Open(); - - GetDatabases(); - } - catch (MySqlException ex) - { - MessageBox.Show( "Error connecting to the server: " + ex.Message ); - } - } - - private void GetDatabases() - { - MySqlDataReader reader = null; - - MySqlCommand cmd = new MySqlCommand("SHOW DATABASES", conn); - try - { - reader = cmd.ExecuteReader(); - databaseList.Items.Clear(); - while (reader.Read()) - { - databaseList.Items.Add( reader.GetString(0) ); - } - } - catch (MySqlException ex) - { - MessageBox.Show("Failed to populate database list: " + ex.Message ); - } - finally - { - if (reader != null) reader.Close(); - } - } - - private void databaseList_SelectedIndexChanged(object sender, System.EventArgs e) - { - MySqlDataReader reader = null; - - conn.ChangeDatabase( databaseList.SelectedItem.ToString() ); - - MySqlCommand cmd = new MySqlCommand("SHOW TABLES", conn); - try - { - reader = cmd.ExecuteReader(); - tables.Items.Clear(); - while (reader.Read()) - { - tables.Items.Add( reader.GetString(0) ); - } - } - catch (MySqlException ex) - { - MessageBox.Show("Failed to populate table list: " + ex.Message ); - } - finally - { - if (reader != null) reader.Close(); - } - } - - private void tables_SelectedIndexChanged(object sender, System.EventArgs e) - { - data = new DataTable(); - - da = new MySqlDataAdapter("SELECT * FROM " + tables.SelectedItem.ToString(), conn ); - cb = new MySqlCommandBuilder( da ); - - da.Fill( data ); - - dataGrid.DataSource = data; - } - - private void updateBtn_Click(object sender, System.EventArgs e) - { - DataTable changes = data.GetChanges(); - da.Update( changes ); - data.AcceptChanges(); - } - } -} diff --git a/Samples/TableEditor/CS/Form1.resx b/Samples/TableEditor/CS/Form1.resx deleted file mode 100644 index 869003609..000000000 --- a/Samples/TableEditor/CS/Form1.resx +++ /dev/null @@ -1,247 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - False - - - Private - - - Private - - - Private - - - False - - - Private - - - Private - - - False - - - Private - - - False - - - Private - - - Private - - - Private - - - False - - - Private - - - False - - - Private - - - Private - - - False - - - Private - - - Private - - - False - - - Private - - - Private - - - Private - - - False - - - Private - - - False - - - Private - - - Private - - - False - - - Private - - - Private - - - Private - - - False - - - Private - - - False - - - Private - - - Private - - - False - - - (Default) - - - False - - - False - - - 8, 8 - - - True - - - 80 - - - True - - - Private - - - Form1 - - \ No newline at end of file diff --git a/Samples/TableEditor/CS/TableEditor.build b/Samples/TableEditor/CS/TableEditor.build deleted file mode 100644 index 762e0a674..000000000 --- a/Samples/TableEditor/CS/TableEditor.build +++ /dev/null @@ -1,37 +0,0 @@ - - TableEditor sample - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Samples/TableEditor/CS/TableEditor.csproj b/Samples/TableEditor/CS/TableEditor.csproj deleted file mode 100644 index 2af461277..000000000 --- a/Samples/TableEditor/CS/TableEditor.csproj +++ /dev/null @@ -1,116 +0,0 @@ - - - Local - 8.0.50727 - 2.0 - {EE6AE06F-6BAC-4265-89B3-9CB5099D2D70} - Debug - AnyCPU - App.ico - - - TableEditor - - - JScript - Grid - IE50 - false - WinExe - TableEditor - OnBuildSuccess - - - - - - - - - bin\Debug\ - false - 285212672 - false - - - DEBUG;TRACE - - - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - - - bin\Release\ - false - 285212672 - false - - - TRACE - - - false - 4096 - false - - - true - false - false - false - 4 - none - prompt - - - - MySQL.Data - ..\..\..\bin\net-1.1\Debug\MySQL.Data.dll - - - System - - - System.Data - - - System.Drawing - - - System.Windows.Forms - - - System.XML - - - - - - Code - - - Form - - - Form1.cs - Designer - - - - - - - - - - \ No newline at end of file diff --git a/Samples/TableEditor/VB/AssemblyInfo.vb b/Samples/TableEditor/VB/AssemblyInfo.vb deleted file mode 100644 index 107cd573c..000000000 --- a/Samples/TableEditor/VB/AssemblyInfo.vb +++ /dev/null @@ -1,52 +0,0 @@ -' Copyright (C) 2004-2005 MySQL AB -' -' This program is free software; you can redistribute it and/or modify -' it under the terms of the GNU General Public License version 2 as published by -' the Free Software Foundation -' -' There are special exceptions to the terms and conditions of the GPL -' as it is applied to this software. View the full text of the -' exception in file EXCEPTIONS in the directory of this software -' distribution. -' -' This program is distributed in the hope that it will be useful, -' but WITHOUT ANY WARRANTY; without even the implied warranty of -' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -' GNU General Public License for more details. -' -' You should have received a copy of the GNU General Public License -' along with this program; if not, write to the Free Software -' Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -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/Samples/TableEditor/VB/Form1.resx b/Samples/TableEditor/VB/Form1.resx deleted file mode 100644 index 65a55a08a..000000000 --- a/Samples/TableEditor/VB/Form1.resx +++ /dev/null @@ -1,247 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Assembly - - - False - - - Assembly - - - False - - - Assembly - - - Assembly - - - False - - - Assembly - - - Assembly - - - False - - - Assembly - - - Assembly - - - Assembly - - - False - - - Assembly - - - False - - - Assembly - - - Assembly - - - Assembly - - - False - - - Assembly - - - False - - - Assembly - - - Assembly - - - Assembly - - - False - - - Assembly - - - False - - - Assembly - - - Assembly - - - Assembly - - - False - - - Assembly - - - False - - - Assembly - - - Assembly - - - False - - - Assembly - - - Assembly - - - False - - - (Default) - - - False - - - Form1 - - - False - - - 8, 8 - - - True - - - 80 - - - True - - - Assembly - - \ No newline at end of file diff --git a/Samples/TableEditor/VB/Form1.vb b/Samples/TableEditor/VB/Form1.vb deleted file mode 100644 index c24721f65..000000000 --- a/Samples/TableEditor/VB/Form1.vb +++ /dev/null @@ -1,304 +0,0 @@ -' Copyright (C) 2004-2005 MySQL AB -' -' This program is free software; you can redistribute it and/or modify -' it under the terms of the GNU General Public License version 2 as published by -' the Free Software Foundation -' -' There are special exceptions to the terms and conditions of the GPL -' as it is applied to this software. View the full text of the -' exception in file EXCEPTIONS in the directory of this software -' distribution. -' -' This program is distributed in the hope that it will be useful, -' but WITHOUT ANY WARRANTY; without even the implied warranty of -' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -' GNU General Public License for more details. -' -' You should have received a copy of the GNU General Public License -' along with this program; if not, write to the Free Software -' Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - -Imports System -Imports System.Data -Imports System.Windows.Forms -Imports MySql.Data.MySqlClient - -Public Class Form1 - Inherits System.Windows.Forms.Form - - Dim conn As MySqlConnection - Dim data As DataTable - Dim da As MySqlDataAdapter - Dim cb As MySqlCommandBuilder - - -#Region " Windows Form Designer generated code " - - Public Sub New() - MyBase.New() - - 'This call is required by the Windows Form Designer. - InitializeComponent() - - 'Add any initialization after the InitializeComponent() call - - End Sub - - 'Form overrides dispose to clean up the component list. - Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) - If disposing Then - If Not (components Is Nothing) Then - components.Dispose() - End If - End If - MyBase.Dispose(disposing) - End Sub - - 'Required by the Windows Form Designer - Private components As System.ComponentModel.IContainer - - 'NOTE: The following procedure is required by the Windows Form Designer - 'It can be modified using the Windows Form Designer. - 'Do not modify it using the code editor. - Friend WithEvents databaseList As System.Windows.Forms.ComboBox - Friend WithEvents label5 As System.Windows.Forms.Label - Friend WithEvents updateBtn As System.Windows.Forms.Button - Friend WithEvents dataGrid As System.Windows.Forms.DataGrid - Friend WithEvents tables As System.Windows.Forms.ComboBox - Friend WithEvents connectBtn As System.Windows.Forms.Button - Friend WithEvents password As System.Windows.Forms.TextBox - Friend WithEvents label3 As System.Windows.Forms.Label - Friend WithEvents userid As System.Windows.Forms.TextBox - Friend WithEvents label2 As System.Windows.Forms.Label - Friend WithEvents server As System.Windows.Forms.TextBox - Friend WithEvents label1 As System.Windows.Forms.Label - Friend WithEvents label4 As System.Windows.Forms.Label - Private Sub InitializeComponent() - Me.databaseList = New System.Windows.Forms.ComboBox - Me.label5 = New System.Windows.Forms.Label - Me.updateBtn = New System.Windows.Forms.Button - Me.dataGrid = New System.Windows.Forms.DataGrid - Me.tables = New System.Windows.Forms.ComboBox - Me.connectBtn = New System.Windows.Forms.Button - Me.password = New System.Windows.Forms.TextBox - Me.label3 = New System.Windows.Forms.Label - Me.userid = New System.Windows.Forms.TextBox - Me.label2 = New System.Windows.Forms.Label - Me.server = New System.Windows.Forms.TextBox - Me.label1 = New System.Windows.Forms.Label - Me.label4 = New System.Windows.Forms.Label - CType(Me.dataGrid, System.ComponentModel.ISupportInitialize).BeginInit() - Me.SuspendLayout() - ' - 'databaseList - ' - Me.databaseList.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList - Me.databaseList.Location = New System.Drawing.Point(80, 80) - Me.databaseList.Name = "databaseList" - Me.databaseList.Size = New System.Drawing.Size(296, 21) - Me.databaseList.TabIndex = 24 - ' - 'label5 - ' - Me.label5.Location = New System.Drawing.Point(8, 88) - Me.label5.Name = "label5" - Me.label5.Size = New System.Drawing.Size(64, 16) - Me.label5.TabIndex = 23 - Me.label5.Text = "Databases" - ' - 'updateBtn - ' - Me.updateBtn.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) - Me.updateBtn.Location = New System.Drawing.Point(464, 104) - Me.updateBtn.Name = "updateBtn" - Me.updateBtn.Size = New System.Drawing.Size(80, 23) - Me.updateBtn.TabIndex = 22 - Me.updateBtn.Text = "Update" - ' - 'dataGrid - ' - Me.dataGrid.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _ - Or System.Windows.Forms.AnchorStyles.Left) _ - Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) - Me.dataGrid.DataMember = "" - Me.dataGrid.HeaderForeColor = System.Drawing.SystemColors.ControlText - Me.dataGrid.Location = New System.Drawing.Point(8, 136) - Me.dataGrid.Name = "dataGrid" - Me.dataGrid.Size = New System.Drawing.Size(536, 384) - Me.dataGrid.TabIndex = 21 - ' - 'tables - ' - Me.tables.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList - Me.tables.Location = New System.Drawing.Point(80, 104) - Me.tables.Name = "tables" - Me.tables.Size = New System.Drawing.Size(296, 21) - Me.tables.TabIndex = 20 - ' - 'connectBtn - ' - Me.connectBtn.Location = New System.Drawing.Point(400, 8) - Me.connectBtn.Name = "connectBtn" - Me.connectBtn.TabIndex = 19 - Me.connectBtn.Text = "Connect" - ' - 'password - ' - Me.password.Location = New System.Drawing.Point(264, 32) - Me.password.Name = "password" - Me.password.PasswordChar = Microsoft.VisualBasic.ChrW(42) - Me.password.Size = New System.Drawing.Size(116, 20) - Me.password.TabIndex = 18 - Me.password.Text = "" - ' - 'label3 - ' - Me.label3.Location = New System.Drawing.Point(192, 40) - Me.label3.Name = "label3" - Me.label3.Size = New System.Drawing.Size(56, 16) - Me.label3.TabIndex = 17 - Me.label3.Text = "Password:" - ' - 'userid - ' - Me.userid.Location = New System.Drawing.Point(56, 32) - Me.userid.Name = "userid" - Me.userid.Size = New System.Drawing.Size(120, 20) - Me.userid.TabIndex = 16 - Me.userid.Text = "" - ' - 'label2 - ' - Me.label2.Location = New System.Drawing.Point(8, 40) - Me.label2.Name = "label2" - Me.label2.Size = New System.Drawing.Size(48, 16) - Me.label2.TabIndex = 15 - Me.label2.Text = "User Id:" - ' - 'server - ' - Me.server.Location = New System.Drawing.Point(56, 8) - Me.server.Name = "server" - Me.server.Size = New System.Drawing.Size(320, 20) - Me.server.TabIndex = 14 - Me.server.Text = "" - ' - 'label1 - ' - Me.label1.Location = New System.Drawing.Point(8, 16) - Me.label1.Name = "label1" - Me.label1.Size = New System.Drawing.Size(48, 16) - Me.label1.TabIndex = 12 - Me.label1.Text = "Server:" - ' - 'label4 - ' - Me.label4.Location = New System.Drawing.Point(8, 112) - Me.label4.Name = "label4" - Me.label4.Size = New System.Drawing.Size(64, 16) - Me.label4.TabIndex = 13 - Me.label4.Text = "Tables" - ' - 'Form1 - ' - Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13) - Me.ClientSize = New System.Drawing.Size(552, 525) - Me.Controls.Add(Me.databaseList) - Me.Controls.Add(Me.label5) - Me.Controls.Add(Me.updateBtn) - Me.Controls.Add(Me.dataGrid) - Me.Controls.Add(Me.tables) - Me.Controls.Add(Me.connectBtn) - Me.Controls.Add(Me.password) - Me.Controls.Add(Me.label3) - Me.Controls.Add(Me.userid) - Me.Controls.Add(Me.label2) - Me.Controls.Add(Me.server) - Me.Controls.Add(Me.label1) - Me.Controls.Add(Me.label4) - Me.Name = "Form1" - Me.Text = "Form1" - CType(Me.dataGrid, System.ComponentModel.ISupportInitialize).EndInit() - Me.ResumeLayout(False) - - End Sub - -#End Region - - Private Sub connectBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles connectBtn.Click - If Not conn Is Nothing Then conn.Close() - - Dim connStr As String - connStr = String.Format("server={0};user id={1}; password={2}; database=mysql; pooling=false", _ - server.Text, userid.Text, password.Text ) - - Try - conn = New MySqlConnection(connStr) - conn.Open() - - GetDatabases() - Catch ex As MySqlException - MessageBox.Show("Error connecting to the server: " + ex.Message) - End Try - End Sub - - Private Sub GetDatabases() - Dim reader As MySqlDataReader - reader = Nothing - - Dim cmd As New MySqlCommand("SHOW DATABASES", conn) - Try - reader = cmd.ExecuteReader() - databaseList.Items.Clear() - - While (reader.Read()) - databaseList.Items.Add(reader.GetString(0)) - End While - Catch ex As MySqlException - MessageBox.Show("Failed to populate database list: " + ex.Message) - Finally - If Not reader Is Nothing Then reader.Close() - End Try - - End Sub - - Private Sub databaseList_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles databaseList.SelectedIndexChanged - Dim reader As MySqlDataReader - - conn.ChangeDatabase(databaseList.SelectedItem.ToString()) - - Dim cmd As New MySqlCommand("SHOW TABLES", conn) - - Try - reader = cmd.ExecuteReader() - tables.Items.Clear() - - While (reader.Read()) - tables.Items.Add(reader.GetString(0)) - End While - - Catch ex As MySqlException - MessageBox.Show("Failed to populate table list: " + ex.Message) - Finally - If Not reader Is Nothing Then reader.Close() - End Try - End Sub - - Private Sub tables_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles tables.SelectedIndexChanged - data = New DataTable - - da = New MySqlDataAdapter("SELECT * FROM " + tables.SelectedItem.ToString(), conn) - cb = New MySqlCommandBuilder(da) - - da.Fill(data) - - dataGrid.DataSource = data - End Sub - - Private Sub updateBtn_Click(ByVal sender As Object, ByVal e As EventArgs) Handles updateBtn.Click - Dim changes As DataTable = data.GetChanges() - da.Update(changes) - data.AcceptChanges() - End Sub - -End Class diff --git a/Samples/TableEditor/VB/TableEditor.build b/Samples/TableEditor/VB/TableEditor.build deleted file mode 100644 index 779a63adb..000000000 --- a/Samples/TableEditor/VB/TableEditor.build +++ /dev/null @@ -1,42 +0,0 @@ - - TableEditor sample - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Samples/TableEditor/VB/TableEditor.vbproj b/Samples/TableEditor/VB/TableEditor.vbproj deleted file mode 100644 index b175658de..000000000 --- a/Samples/TableEditor/VB/TableEditor.vbproj +++ /dev/null @@ -1,120 +0,0 @@ - - - Local - 8.0.50727 - 2.0 - {B1FDEC2E-E8B1-4239-A03A-8B096585F610} - Debug - AnyCPU - - - - - TableEditor - - - None - JScript - Grid - IE50 - false - WinExe - Binary - On - Off - TableEditor - TableEditor.Form1 - - - WindowsFormsWithCustomSubMain - - - - - bin\ - TableEditor.xml - 285212672 - - - - - true - true - true - false - false - false - false - 1 - 42016,42017,42018,42019,42032 - full - - - bin\ - TableEditor.xml - 285212672 - - - - - false - true - false - true - false - false - false - 1 - 42016,42017,42018,42019,42032 - none - - - - MySQL.Data - ..\..\..\bin\net-1.1\Debug\MySQL.Data.dll - - - System - - - System.Data - - - System.Drawing - - - System.Windows.Forms - - - System.XML - - - - - - - - - - - - - - Code - - - Form - - - Form1.vb - Designer - - - - - - - - - - \ No newline at end of file diff --git a/Server55.config b/Server55.config deleted file mode 100644 index 055ea835f..000000000 --- a/Server55.config +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Server55MT.config b/Server55MT.config deleted file mode 100644 index 928ed3d26..000000000 --- a/Server55MT.config +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Server56.config b/Server56.config deleted file mode 100644 index 233a789d9..000000000 --- a/Server56.config +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Server57.config b/Server57.config deleted file mode 100644 index 32869a1c6..000000000 --- a/Server57.config +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/MySql.Data.Entity.EF6/EFMySqlCommand.cs b/Source/MySql.Data.Entity.EF6/EFMySqlCommand.cs deleted file mode 100644 index 3ebc40cd6..000000000 --- a/Source/MySql.Data.Entity.EF6/EFMySqlCommand.cs +++ /dev/null @@ -1,188 +0,0 @@ -// Copyright © 2008, 2014, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Data.Common; -using System.Data; -using MySql.Data.MySqlClient; -#if EF6 -using System.Data.Entity.Core.Metadata.Edm; -#else -using System.Data.Metadata.Edm; -#endif -#if NET_40_OR_GREATER -using System.Threading.Tasks; -using System.Threading; -#endif - -namespace MySql.Data.Entity -{ - class EFMySqlCommand : DbCommand, ICloneable - { - private bool designTimeVisible = true; - private DbConnection connection; - private MySqlCommand command = new MySqlCommand(); - - internal PrimitiveType[] ColumnTypes; - - #region Properties - - public override string CommandText - { - get { return command.CommandText; } - set { command.CommandText = value; } - } - - public override int CommandTimeout - { - get { return command.CommandTimeout; } - set { command.CommandTimeout = value; } - } - - public override CommandType CommandType - { - get { return command.CommandType; } - set { command.CommandType = value; } - } - - public override bool DesignTimeVisible - { - get { return designTimeVisible; } - set { designTimeVisible = value; } - } - - protected override DbConnection DbConnection - { - get { return connection; } - set - { - connection = value; - command.Connection = (MySqlConnection)value; - MySqlConnection _con = (MySqlConnection)connection; - if (_con.Settings.UseDefaultCommandTimeoutForEF) - { - command.CommandTimeout = (int)(_con.Settings.DefaultCommandTimeout); - } - } - } - - protected override DbTransaction DbTransaction - { - get { return command.Transaction; } - set { command.Transaction = (MySqlTransaction)value; } - } - - protected override DbParameterCollection DbParameterCollection - { - get { return command.Parameters; } - } - - public override UpdateRowSource UpdatedRowSource - { - get { return command.UpdatedRowSource; } - set { command.UpdatedRowSource = value; } - } - - #endregion - - public override void Cancel() - { - command.Cancel(); - } - - protected override DbParameter CreateDbParameter() - { - return new MySqlParameter(); - } - - protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior) - { - return new EFMySqlDataReader(this, command.ExecuteReader(behavior)); - } - - public override int ExecuteNonQuery() - { - return command.ExecuteNonQuery(); - } - - public override object ExecuteScalar() - { - return command.ExecuteScalar(); - } - - public override void Prepare() - { - command.Prepare(); - } - - #region ICloneable Members - - public object Clone() - { - EFMySqlCommand clone = new EFMySqlCommand(); - - clone.connection = connection; - clone.ColumnTypes = ColumnTypes; - clone.command = (MySqlCommand)((ICloneable)command).Clone(); - - return clone; - } - - #endregion - -#if NET_40_OR_GREATER -#region Async - /// - /// Async version of Prepare - /// - /// Information about the task executed. - public Task PrepareAsync() - { - return PrepareAsync(CancellationToken.None); - } - - public Task PrepareAsync(CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - Prepare(); - result.SetResult(true); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - #endregion -#endif - - } -} diff --git a/Source/MySql.Data.Entity.EF6/Fragments/InputFragment.cs b/Source/MySql.Data.Entity.EF6/Fragments/InputFragment.cs deleted file mode 100644 index cfeec1842..000000000 --- a/Source/MySql.Data.Entity.EF6/Fragments/InputFragment.cs +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright © 2008, 2014, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace MySql.Data.Entity -{ - abstract class InputFragment : SqlFragment - { - // not all input classes will support two inputs but union and join do - // in cases where only one input is used, Left is it - public InputFragment Left; - public InputFragment Right; - - public InputFragment() - { - } - - public InputFragment(string name) - { - Name = name; - } - - public string Name { get; set; } - public bool IsWrapped { get; private set; } - public bool Scoped { get; set; } - - public virtual void Wrap(Scope scope) - { - IsWrapped = true; - Scoped = true; - - if (scope == null) return; - if (Left != null) - scope.Remove(Left); - if (Right != null) - scope.Remove(Right); - } - - public virtual void WriteInnerSql(StringBuilder sql) - { - } - - public override void WriteSql(StringBuilder sql) - { - if (IsWrapped) - sql.Append("("); - WriteInnerSql(sql); - if (IsWrapped) - sql.Append(")"); - if (Name == null) return; - if (this is TableFragment || - (IsWrapped && !(this is JoinFragment))) - sql.AppendFormat(" AS {0}", QuoteIdentifier(Name)); - } - - public ColumnFragment GetColumnFromProperties(PropertyFragment properties) - { - ColumnFragment col = Left.GetColumnFromProperties(properties); - if (col == null) - col = Right.GetColumnFromProperties(properties); - return col; - } - - internal override void Accept(SqlFragmentVisitor visitor) - { - if (Left != null) - Left.Accept(visitor); - if (Right != null) - Right.Accept(visitor); - } - } -} - diff --git a/Source/MySql.Data.Entity.EF6/Fragments/JoinFragment.cs b/Source/MySql.Data.Entity.EF6/Fragments/JoinFragment.cs deleted file mode 100644 index 0b4882cbb..000000000 --- a/Source/MySql.Data.Entity.EF6/Fragments/JoinFragment.cs +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright © 2008, 2014, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Text; -using System.Diagnostics; - -namespace MySql.Data.Entity -{ - class JoinFragment : InputFragment - { - public SqlFragment Condition; - public string JoinType; - - public override void WriteInnerSql(StringBuilder sql) - { - Left.WriteSql(sql); - sql.AppendFormat(" {0} ", JoinType); - Right.WriteSql(sql); - if (Condition != null) - { - sql.Append(" ON "); - Condition.WriteSql(sql); - } - } - - //public override void WriteSql(StringBuilder sql) - //{ - // // we don't want our join to write out its name - // string name = Name; - // Name = null; - // base.WriteSql(sql); - // Name = name; - //} - - internal override void Accept(SqlFragmentVisitor visitor) - { - base.Accept(visitor); - if (Condition != null) - Condition.Accept(visitor); - visitor.Visit(this); - } - } -} diff --git a/Source/MySql.Data.Entity.EF6/Fragments/TableFragment.cs b/Source/MySql.Data.Entity.EF6/Fragments/TableFragment.cs deleted file mode 100644 index 94917d6e2..000000000 --- a/Source/MySql.Data.Entity.EF6/Fragments/TableFragment.cs +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright © 2008, 2014, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using System.Diagnostics; -#if EF6 -using System.Data.Entity.Core.Metadata.Edm; -#else -using System.Data.Metadata.Edm; -#endif - - -namespace MySql.Data.Entity -{ - class TableFragment : InputFragment - { - public string Schema; - public string Table; - public SqlFragment DefiningQuery; - public TypeUsage Type; - public List Columns; - - public TableFragment() - { - Scoped = true; - } - - public override void WriteSql(StringBuilder sql) - { - if (DefiningQuery != null) - sql.AppendFormat("({0})", DefiningQuery); - else - sql.AppendFormat("{0}", QuoteIdentifier(Table)); - base.WriteSql(sql); - } - - internal override void Accept(SqlFragmentVisitor visitor) - { - if (Columns != null) - { - foreach (ColumnFragment cf in Columns) - { - cf.Accept(visitor); - } - } - visitor.Visit(this); - } - } -} diff --git a/Source/MySql.Data.Entity.EF6/Generators/DeleteGenerator.cs b/Source/MySql.Data.Entity.EF6/Generators/DeleteGenerator.cs deleted file mode 100644 index b31c5b08a..000000000 --- a/Source/MySql.Data.Entity.EF6/Generators/DeleteGenerator.cs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright © 2008, 2011, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Text; -using MySql.Data.MySqlClient; -#if EF6 -using System.Data.Entity.Core.Common.CommandTrees; -#else -using System.Data.Common.CommandTrees; -using System.Data.Metadata.Edm; -#endif - -namespace MySql.Data.Entity -{ - class DeleteGenerator : SqlGenerator - { - public override string GenerateSQL(DbCommandTree tree) - { - DbDeleteCommandTree commandTree = tree as DbDeleteCommandTree; - - DeleteStatement statement = new DeleteStatement(); - - statement.Target = commandTree.Target.Expression.Accept(this); - scope.Add("target", statement.Target as InputFragment); - - statement.Where = commandTree.Predicate.Accept(this); - - return statement.ToString(); - } - } -} diff --git a/Source/MySql.Data.Entity.EF6/Generators/FunctionGenerator.cs b/Source/MySql.Data.Entity.EF6/Generators/FunctionGenerator.cs deleted file mode 100644 index 6169514e4..000000000 --- a/Source/MySql.Data.Entity.EF6/Generators/FunctionGenerator.cs +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright © 2008, 2009, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Data; -#if EF6 -using System.Data.Entity.Core.Common.CommandTrees; -using System.Data.Entity.Core.Metadata.Edm; -#else -using System.Data.Common.CommandTrees; -using System.Data.Metadata.Edm; -#endif - - -namespace MySql.Data.Entity -{ - class FunctionGenerator : SqlGenerator - { - public CommandType CommandType { get; private set; } - - public override string GenerateSQL(DbCommandTree commandTree) - { - DbFunctionCommandTree tree = (commandTree as DbFunctionCommandTree); - EdmFunction function = tree.EdmFunction; - CommandType = CommandType.StoredProcedure; - - string cmdText = (string)function.MetadataProperties["CommandTextAttribute"].Value; - if (String.IsNullOrEmpty(cmdText)) - { - string schema = (string)function.MetadataProperties["Schema"].Value; - if (String.IsNullOrEmpty(schema)) - schema = function.NamespaceName; - - string functionName = (string)function.MetadataProperties["StoreFunctionNameAttribute"].Value; - if (String.IsNullOrEmpty(functionName)) - functionName = function.Name; - - return String.Format("`{0}`", functionName); - } - else - { - CommandType = CommandType.Text; - return cmdText; - } - } - } -} diff --git a/Source/MySql.Data.Entity.EF6/Generators/InsertGenerator.cs b/Source/MySql.Data.Entity.EF6/Generators/InsertGenerator.cs deleted file mode 100644 index 41ae99998..000000000 --- a/Source/MySql.Data.Entity.EF6/Generators/InsertGenerator.cs +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright © 2008, 2014, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Text; -using System.Collections.Generic; -using MySql.Data.MySqlClient; -using System.Data.Common; -using System.Diagnostics; -using System; -#if EF6 -using System.Data.Entity.Core.Common.CommandTrees; -using System.Data.Entity.Core.Metadata.Edm; -#else -using System.Data.Common.CommandTrees; -using System.Data.Metadata.Edm; -#endif - - -namespace MySql.Data.Entity -{ - class InsertGenerator : SqlGenerator - { - public override string GenerateSQL(DbCommandTree tree) - { - DbInsertCommandTree commandTree = tree as DbInsertCommandTree; - - InsertStatement statement = new InsertStatement(); - - DbExpressionBinding e = commandTree.Target; - statement.Target = (InputFragment)e.Expression.Accept(this); - - scope.Add("target", statement.Target); - - foreach (DbSetClause setClause in commandTree.SetClauses) - statement.Sets.Add(setClause.Property.Accept(this)); - - if (values == null) - values = new Dictionary(); - - foreach (DbSetClause setClause in commandTree.SetClauses) - { - DbExpression value = setClause.Value; - SqlFragment valueFragment = value.Accept(this); - statement.Values.Add(valueFragment); - - if (value.ExpressionKind != DbExpressionKind.Null) - { - EdmMember property = ((DbPropertyExpression)setClause.Property).Property; - values.Add(property, valueFragment); - } - } - - if (commandTree.Returning != null) - statement.ReturningSelect = GenerateReturningSql(commandTree, commandTree.Returning); - - return statement.ToString(); - } - - protected virtual SelectStatement GenerateReturningSql(DbModificationCommandTree tree, DbExpression returning) - { - SelectStatement select = base.GenerateReturningSql(tree, returning); - - ListFragment where = new ListFragment(); - - EntitySetBase table = ((DbScanExpression)tree.Target.Expression).Target; - bool foundIdentity = false; - where.Append(" row_count() > 0"); - foreach (EdmMember keyMember in table.ElementType.KeyMembers) - { - SqlFragment value; - if (!values.TryGetValue(keyMember, out value)) - { - if (foundIdentity) - throw new NotSupportedException(); - foundIdentity = true; - PrimitiveTypeKind type = ((PrimitiveType)keyMember.TypeUsage.EdmType.BaseType).PrimitiveTypeKind; - if ((type == PrimitiveTypeKind.Byte) || (type == PrimitiveTypeKind.SByte) || - (type == PrimitiveTypeKind.Int16) || (type == PrimitiveTypeKind.Int32) || - (type == PrimitiveTypeKind.Int64) || (type == PrimitiveTypeKind.Decimal && IsValidMySqlDataType(keyMember.TypeUsage.EdmType.FullName))) - { - value = new LiteralFragment("last_insert_id()"); - } - else if (keyMember.TypeUsage.EdmType.BaseType.Name == "Guid") - value = new LiteralFragment(string.Format("ANY(SELECT guid FROM tmpIdentity_{0})", (table as MetadataItem).MetadataProperties["Table"].Value)); - } - where.Append(String.Format(" AND `{0}`=", keyMember)); - where.Append(value); - } - select.Where = where; - return select; - } - - private bool IsValidMySqlDataType(string dataType) - { - return (new List() { "MySql.ubigint" }).Contains(dataType); - } - } -} diff --git a/Source/MySql.Data.Entity.EF6/Generators/Scope.cs b/Source/MySql.Data.Entity.EF6/Generators/Scope.cs deleted file mode 100644 index 8f9052d95..000000000 --- a/Source/MySql.Data.Entity.EF6/Generators/Scope.cs +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright © 2008, 2013, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Diagnostics; - -namespace MySql.Data.Entity -{ - class Scope - { - private Dictionary scopeTable = new Dictionary(); - - public void Add(string name, InputFragment fragment) - { - scopeTable.Add(name, fragment); - } - - public void Remove( string Name, InputFragment fragment) - { - if (fragment == null) return; - if (Name != null) - scopeTable.Remove(Name); - - if (fragment is SelectStatement) - Remove((fragment as SelectStatement).From); - else if (fragment is JoinFragment) - { - JoinFragment j = fragment as JoinFragment; - Remove(j.Left); - Remove(j.Right); - } - else if (fragment is UnionFragment) - { - UnionFragment u = fragment as UnionFragment; - Remove(u.Left); - Remove(u.Right); - } - } - - public void Remove(InputFragment fragment) - { - if( fragment == null ) return; - Remove(fragment.Name, fragment); - } - - public InputFragment GetFragment(string name) - { - if (!scopeTable.ContainsKey(name)) - return null; - return scopeTable[name]; - } - - public InputFragment FindInputFromProperties(PropertyFragment fragment) - { - Debug.Assert(fragment != null); - PropertyFragment propertyFragment = fragment as PropertyFragment; - Debug.Assert(propertyFragment != null); - - if (propertyFragment.Properties.Count >= 2) - { - for (int x = propertyFragment.Properties.Count - 2; x >= 0; x--) - { - string reference = propertyFragment.Properties[x]; - if (reference == null) continue; - InputFragment input = GetFragment(reference); - if (input == null) continue; - if (input.Scoped) return input; - if (input is SelectStatement) - return (input as SelectStatement).From; - continue; - } - } - Debug.Fail("Should have found an input"); - return null; - } - } - - public enum OpType : int - { - Join = 1, - Union = 2 - } -} diff --git a/Source/MySql.Data.Entity.EF6/Generators/UpdateGenerator.cs b/Source/MySql.Data.Entity.EF6/Generators/UpdateGenerator.cs deleted file mode 100644 index 6faf30337..000000000 --- a/Source/MySql.Data.Entity.EF6/Generators/UpdateGenerator.cs +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright © 2008, 2011, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Text; -using System.Diagnostics; -using MySql.Data.MySqlClient; -using System.Collections.Generic; -#if EF6 -using System.Data.Entity.Core.Common.CommandTrees; -using System.Data.Entity.Core.Metadata.Edm; -#else -using System.Data.Common.CommandTrees; -using System.Data.Metadata.Edm; -#endif - - -namespace MySql.Data.Entity -{ - class UpdateGenerator : SqlGenerator - { - private bool _onReturningSelect; - - public override string GenerateSQL(DbCommandTree tree) - { - DbUpdateCommandTree commandTree = tree as DbUpdateCommandTree; - - UpdateStatement statement = new UpdateStatement(); - - _onReturningSelect = false; - statement.Target = commandTree.Target.Expression.Accept(this); - scope.Add("target", statement.Target as InputFragment); - - if (values == null) - values = new Dictionary(); - - foreach (DbSetClause setClause in commandTree.SetClauses) - { - statement.Properties.Add(setClause.Property.Accept(this)); - DbExpression value = setClause.Value; - SqlFragment valueFragment = value.Accept(this); - statement.Values.Add(valueFragment); - - if (value.ExpressionKind != DbExpressionKind.Null) - { - EdmMember property = ((DbPropertyExpression)setClause.Property).Property; - values.Add(property, valueFragment); - } - } - - statement.Where = commandTree.Predicate.Accept(this); - - _onReturningSelect = true; - if (commandTree.Returning != null) - statement.ReturningSelect = GenerateReturningSql(commandTree, commandTree.Returning); - - return statement.ToString(); - } - - protected override SelectStatement GenerateReturningSql(DbModificationCommandTree tree, DbExpression returning) - { - SelectStatement select = base.GenerateReturningSql(tree, returning); - ListFragment where = new ListFragment(); - where.Append(" row_count() > 0 and "); - where.Append( ((DbUpdateCommandTree)tree).Predicate.Accept(this) ); - select.Where = where; - - return select; - } - - private Stack _columnsVisited = new Stack(); - - protected override SqlFragment VisitBinaryExpression(DbExpression left, DbExpression right, string op) - { - BinaryFragment f = new BinaryFragment(); - f.Operator = op; - f.Left = left.Accept(this); - f.WrapLeft = ShouldWrapExpression(left); - if (f.Left is ColumnFragment) - { - _columnsVisited.Push( (( DbPropertyExpression )left ).Property ); - } - f.Right = right.Accept(this); - if (f.Left is ColumnFragment) - { - _columnsVisited.Pop(); - } - f.WrapRight = ShouldWrapExpression(right); - return f; - } - - public override SqlFragment Visit(DbConstantExpression expression) - { - SqlFragment value = null; - if ( _onReturningSelect && values.TryGetValue(_columnsVisited.Peek(), out value)) - { - if (value is LiteralFragment) - { - MySqlParameter par = Parameters.Find(p => p.ParameterName == ( value as LiteralFragment ).Literal ); - if (par != null) - return new LiteralFragment(par.ParameterName); - } - } - return base.Visit(expression); - } - } -} diff --git a/Source/MySql.Data.Entity.EF6/MySql.Data.Entity.EF6.xproj b/Source/MySql.Data.Entity.EF6/MySql.Data.Entity.EF6.xproj deleted file mode 100644 index 92abc7b72..000000000 --- a/Source/MySql.Data.Entity.EF6/MySql.Data.Entity.EF6.xproj +++ /dev/null @@ -1,18 +0,0 @@ - - - - 14.0.25420 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 256547dd-4c49-48e7-beb1-78fc17eaa464 - MySql.Data.EF6 - .\obj - .\bin\ - - - 2.0 - - - \ No newline at end of file diff --git a/Source/MySql.Data.Entity.EF6/MySqlConnectionFactory.cs b/Source/MySql.Data.Entity.EF6/MySqlConnectionFactory.cs deleted file mode 100644 index aa20e3f64..000000000 --- a/Source/MySql.Data.Entity.EF6/MySqlConnectionFactory.cs +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright © 2008, 2012, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Data.Common; -using System.Data.Entity.Infrastructure; -using System.Data.Entity.Migrations; -using System.Linq; -using System.Text; -using MySql.Data.MySqlClient; - -namespace MySql.Data.Entity -{ - /// - /// Used for creating connections in Code First 4.3. - /// - public class MySqlConnectionFactory : IDbConnectionFactory - { - public DbConnection CreateConnection(string connectionString) - { - return new MySqlConnection(connectionString); - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data.Entity.EF6/MySqlDependencyResolver.cs b/Source/MySql.Data.Entity.EF6/MySqlDependencyResolver.cs deleted file mode 100644 index aa00434b0..000000000 --- a/Source/MySql.Data.Entity.EF6/MySqlDependencyResolver.cs +++ /dev/null @@ -1,183 +0,0 @@ -// Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Data.Common; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Data.Entity.Infrastructure.DependencyResolution; -using System.Data.Entity.Infrastructure; - -namespace MySql.Data.Entity -{ - public class MySqlDependencyResolver : IDbDependencyResolver - { - public object GetService(Type type, object key) - { - EServiceType servType; - if (Enum.TryParse(type.Name, true, out servType)) - { - switch (servType) - { - case EServiceType.DbProviderFactory: - return new MySqlClient.MySqlClientFactory(); - case EServiceType.IDbConnectionFactory: - return new MySqlConnectionFactory(); - case EServiceType.MigrationSqlGenerator: - return new MySqlMigrationSqlGenerator(); - case EServiceType.DbProviderServices: - return new MySqlClient.MySqlProviderServices(); - case EServiceType.IProviderInvariantName: - return new MySqlProviderInvariantName(); -#if NET_45_OR_GREATER - case EServiceType.IDbProviderFactoryResolver: - return new MySqlProviderFactoryResolver(); -#endif - case EServiceType.IManifestTokenResolver: - return new MySqlManifestTokenResolver(); - case EServiceType.IDbModelCacheKey: - return new SingletonDependencyResolver>(new MySqlModelCacheKeyFactory().Create); - case EServiceType.IDbExecutionStrategy: - return new MySqlExecutionStrategy(); - } - } - return null; - } - - public IEnumerable GetServices(Type type, object key) - { - var service = GetService(type, key); - return service == null ? Enumerable.Empty() : new[] { service }; - } - } - - public class MySqlProviderInvariantName : IProviderInvariantName - { - private const string _providerName = "MySql.Data.MySqlClient"; - - public string Name - { - get { return _providerName; } - } - - public static string ProviderName - { - get { return MySqlProviderInvariantName._providerName; } - } - } - - public class MySqlProviderFactoryResolver : IDbProviderFactoryResolver - { - public DbProviderFactory ResolveProviderFactory(DbConnection connection) - { -#if NET_45_OR_GREATER - return DbProviderFactories.GetFactory(connection); -#else - return DbProviderFactories.GetFactory(MySqlProviderInvariantName.ProviderName); -#endif - } - } - - public class MySqlManifestTokenResolver : IManifestTokenResolver - { - public string ResolveManifestToken(System.Data.Common.DbConnection connection) - { - return MySqlClient.MySqlProviderServices.GetProviderServices(connection).GetProviderManifestToken(connection); - } - } - - public class MySqlModelCacheKey : IDbModelCacheKey - { - private readonly Type _ctxType; - private readonly string _providerName; - private readonly Type _providerType; - private readonly string _customKey; - - public MySqlModelCacheKey(Type contextType, string providerName, Type providerType, string customKey) - { - _ctxType = contextType; - _providerName = providerName; - _providerType = providerType; - _customKey = customKey; - } - - public bool Equals(object other) - { - if (ReferenceEquals(this, other)) - return true; - - var modelCacheKey = other as MySqlModelCacheKey; - return (modelCacheKey != null) && Equals(modelCacheKey); - } - - public int GetHashCode() - { - unchecked - { - int hash = 43; - hash = hash * 47 + _ctxType.GetHashCode(); - hash = hash * 47 + _providerName.GetHashCode(); - hash = hash * 47 + _providerType.GetHashCode(); - hash = hash * 47 + (!string.IsNullOrWhiteSpace(_customKey) ? _customKey.GetHashCode() : 0); - return hash; - } - } - - private bool Equals(MySqlModelCacheKey other) - { - return (_ctxType == other._ctxType && string.Equals(_providerName, other._providerName) && Equals(_providerType, other._providerType) && string.Equals(_customKey, other._customKey)); - } - } - - internal class MySqlModelCacheKeyFactory - { - public IDbModelCacheKey Create(System.Data.Entity.DbContext context) - { - string customKey = null; - - var modelCacheKeyProvider = context as IDbModelCacheKeyProvider; - if (modelCacheKeyProvider != null) - { - customKey = modelCacheKeyProvider.CacheKey; - } - - return new MySqlModelCacheKey(context.GetType(), MySqlProviderInvariantName.ProviderName, typeof(MySqlClient.MySqlClientFactory), customKey); - } - } - - internal enum EServiceType - { - DbProviderFactory, - DbProviderServices, - IDbConnectionFactory, - DbSpatialServices, - MigrationSqlGenerator, - IProviderInvariantName, - IDbProviderFactoryResolver, - IManifestTokenResolver, - HistoryContext, - IDbModelCacheKey, - IDbExecutionStrategy - } -} diff --git a/Source/MySql.Data.Entity.EF6/MySqlEFConfiguration.cs b/Source/MySql.Data.Entity.EF6/MySqlEFConfiguration.cs deleted file mode 100644 index b5f5f5d9a..000000000 --- a/Source/MySql.Data.Entity.EF6/MySqlEFConfiguration.cs +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Data.Entity; -using System.Data.Entity.Infrastructure; -using System.Data.Entity.Internal; -using MySql.Data.MySqlClient; - -namespace MySql.Data.Entity -{ - public class MySqlEFConfiguration : DbConfiguration - { - public MySqlEFConfiguration() - { - AddDependencyResolver(new MySqlDependencyResolver()); - - SetProviderFactory(MySqlProviderInvariantName.ProviderName, new MySqlClientFactory()); - SetProviderServices(MySqlProviderInvariantName.ProviderName, new MySqlProviderServices()); - SetDefaultConnectionFactory(new MySqlConnectionFactory()); - SetMigrationSqlGenerator(MySqlProviderInvariantName.ProviderName, () => new MySqlMigrationSqlGenerator()); -#if NET_45_OR_GREATER - SetProviderFactoryResolver(new MySqlProviderFactoryResolver()); -#endif - SetManifestTokenResolver(new MySqlManifestTokenResolver()); - SetHistoryContext(MySqlProviderInvariantName.ProviderName, (existingConnection, defaultSchema) => new MySqlHistoryContext(existingConnection, defaultSchema)); -// //CURRENTLY IS NOT SUPPORTED WORK WITH TRANSACTIONS AND EXECUTION STRATEGY AT THE SAME TIME: http://msdn.microsoft.com/en-US/data/dn307226 -// //IF WE SET THE EXECUTION STRATEGY HERE THAT WILL AFFECT THE USERS WHEN THEY TRY TO USE TRANSACTIONS, FOR THAT REASON EXECUTION STRATEGY WILL BE ENABLED ON DEMAND BY THEM -// //SetExecutionStrategy(MySqlProviderInvariantName.ProviderName, () => { return new MySqlExecutionStrategy(); }); - } - } -} diff --git a/Source/MySql.Data.Entity.EF6/MySqlHistoryContext.cs b/Source/MySql.Data.Entity.EF6/MySqlHistoryContext.cs deleted file mode 100644 index d6367e1c0..000000000 --- a/Source/MySql.Data.Entity.EF6/MySqlHistoryContext.cs +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Data.Common; -using System.Data.Entity.Migrations.History; - -namespace MySql.Data.Entity -{ - public class MySqlHistoryContext : HistoryContext - { - public MySqlHistoryContext(DbConnection existingConnection, string defaultSchema) - : base(existingConnection, defaultSchema) - { - } - - protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder) - { - base.OnModelCreating(modelBuilder); - modelBuilder.Entity().HasKey(h => new { h.MigrationId }); - } - } -} diff --git a/Source/MySql.Data.Entity.EF6/MySqlLogger.cs b/Source/MySql.Data.Entity.EF6/MySqlLogger.cs deleted file mode 100644 index 87c5050dd..000000000 --- a/Source/MySql.Data.Entity.EF6/MySqlLogger.cs +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Linq; -using System.Text; -using System.IO; - -namespace MySql.Data.Entity -{ - public class MySqlLogger : TextWriter - { - private readonly Action _action; - public MySqlLogger(Action action) - { - _action = action; - } - - public override void Write(char[] buffer, int index, int count) - { - Write(new string(buffer, index, count)); - } - - public override void Write(string value) - { - _action.Invoke(value); - } - - public override Encoding Encoding - { - get { return Encoding.Default; } - } - - public static StreamWriter Logger(string logPath, bool append) - { - return new StreamWriter(path: logPath, append: append) { AutoFlush = true }; - } - } -} diff --git a/Source/MySql.Data.Entity.EF6/MySqlSpatialDataReader.cs b/Source/MySql.Data.Entity.EF6/MySqlSpatialDataReader.cs deleted file mode 100644 index f4f83dd46..000000000 --- a/Source/MySql.Data.Entity.EF6/MySqlSpatialDataReader.cs +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright © 2013, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using MySql.Data.MySqlClient; -using MySql.Data.Types; -using System.Reflection; -#if EF6 -using System.Data.Entity.Spatial; -#else -using System.Data.Spatial; -#endif - - -namespace MySql.Data.Entity -{ - internal sealed class MySqlSpatialDataReader : DbSpatialDataReader - { - private readonly EFMySqlDataReader reader; - - static MySqlSpatialDataReader() - { - } - - public MySqlSpatialDataReader(EFMySqlDataReader underlyingReader) - { - this.reader = underlyingReader; - } - - public override DbGeography GetGeography(int ordinal) - { - throw new NotImplementedException(); - } - - public override DbGeometry GetGeometry(int ordinal) - { - ReturnGeometryColumn(ordinal); - - var geometryBytes = this.reader.GetValue(ordinal); - Type t = geometryBytes.GetType(); - - object geometry = Activator.CreateInstance(t); - - var providerValue = new MySqlGeometry(); - - MySqlGeometry.TryParse(geometryBytes.ToString(), out providerValue); - - return MySqlSpatialServices.Instance.GeometryFromProviderValue(providerValue); - - } - - private void ReturnGeometryColumn(int ordinal) - { - string fieldTypeName = this.reader.GetDataTypeName(ordinal); - if (!fieldTypeName.Equals("Geometry", StringComparison.Ordinal)) - { - throw new InvalidOperationException( - string.Format( - "Invalid Geometry type reading operation on type {0}", - fieldTypeName)); - } - } - -#if EF6 - public override bool IsGeographyColumn(int ordinal) - { - //throw new NotImplementedException(); - return false; - } - - public override bool IsGeometryColumn(int ordinal) - { - //throw new NotImplementedException(); - return false; - } -#endif - } -} diff --git a/Source/MySql.Data.Entity.EF6/Properties/AssemblyInfo.cs b/Source/MySql.Data.Entity.EF6/Properties/AssemblyInfo.cs deleted file mode 100644 index 71b396b23..000000000 --- a/Source/MySql.Data.Entity.EF6/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright © 2008, 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Security; -using System.Reflection; -using System.Runtime.CompilerServices; -using 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. -[assembly: AssemblyTitle("MySql.Data.Entity for EF6")] -[assembly: AssemblyDescription("Entity Framework 6.0 supported")] - -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Oracle")] -[assembly: AssemblyProduct("MySql.Data.Entity")] -[assembly: AssemblyCopyright("Copyright © 2008, 2015, Oracle and/or its affiliates. All rights reserved.")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] -[assembly: AllowPartiallyTrustedCallers] -[assembly: AssemblyKeyName("ConnectorNet")] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("540e7b3c-bd0b-4980-96d1-5d140d303f7e")] -[assembly: InternalsVisibleTo("MySql.Data.Entity.Tests, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] -[assembly: InternalsVisibleTo("MySql.Data.Entity.CodeFirst.Tests, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] -[assembly: InternalsVisibleTo("MySql.EntityFramework6.Basic.Tests, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] -[assembly: InternalsVisibleTo("MySql.EntityFramework6.Migrations.Tests, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] \ No newline at end of file diff --git a/Source/MySql.Data.Entity.EF6/Properties/Resources.Designer.cs b/Source/MySql.Data.Entity.EF6/Properties/Resources.Designer.cs deleted file mode 100644 index 8ab791965..000000000 --- a/Source/MySql.Data.Entity.EF6/Properties/Resources.Designer.cs +++ /dev/null @@ -1,99 +0,0 @@ -//------------------------------------------------------------------------------ -// -// 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 MySql.Data.Entity.Properties { - 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", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// 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("MySql.Data.Entity.Properties.Resources", typeof(Resources).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 The connection parameter must reference an object of type MySql.Data.MySqlConnection. - /// - internal static string ConnectionMustBeOfTypeMySqlConnection { - get { - return ResourceManager.GetString("ConnectionMustBeOfTypeMySqlConnection", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to There is no store type corresponding to the EDM type '{0}' of primitive type '{1}'.. - /// - internal static string NoStoreTypeForEdmType { - get { - return ResourceManager.GetString("NoStoreTypeForEdmType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The underlying provider does not support the type '{0}'.. - /// - internal static string TypeNotSupported { - get { - return ResourceManager.GetString("TypeNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Result type of a function is expected to be a collection of RowType or PrimitiveType. - /// - internal static string WrongFunctionResultType { - get { - return ResourceManager.GetString("WrongFunctionResultType", resourceCulture); - } - } - } -} diff --git a/Source/MySql.Data.Entity.EF6/Properties/SchemaDefinition-5.0.ssdl b/Source/MySql.Data.Entity.EF6/Properties/SchemaDefinition-5.0.ssdl deleted file mode 100644 index 420f20329..000000000 --- a/Source/MySql.Data.Entity.EF6/Properties/SchemaDefinition-5.0.ssdl +++ /dev/null @@ -1,719 +0,0 @@ - - - - - - - SELECT /* Tables */ - CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS `Id`, - TABLE_CATALOG AS `Catalog`, - TABLE_SCHEMA AS `Schema`, - TABLE_NAME AS `Name` - FROM INFORMATION_SCHEMA.TABLES - WHERE TABLE_TYPE = 'BASE TABLE' - AND TABLE_SCHEMA=schema() - - - - - - SELECT /* Table columns */ - CONCAT(TABLE_SCHEMA, '.', TABLE_NAME, '.', COLUMN_NAME) AS `Id`, - CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS `ParentId`, - COLUMN_NAME AS `Name`, - ORDINAL_POSITION AS `Ordinal`, - CASE IS_NULLABLE WHEN 'YES' THEN 1 ELSE 0 END AS `IsNullable`, - IF(LEFT(COLUMN_TYPE,10) = 'tinyint(1)', 'bool', - IF (LEFT(COLUMN_TYPE,10) = 'binary(16)' OR LEFT(COLUMN_TYPE,8) = 'char(36)', 'guid', - IF (INSTR(COLUMN_TYPE, 'unsigned') = 0, DATA_TYPE, - CONCAT('u', DATA_TYPE)))) AS `TypeName`, - IF (CHARACTER_MAXIMUM_LENGTH > 2147483647, 2147483647, CHARACTER_MAXIMUM_LENGTH) AS `MaxLength`, - NUMERIC_PRECISION AS `Precision`, - 0 AS `DateTimePrecision`, - NUMERIC_SCALE AS `Scale`, - NULL AS `CollationCatalog`, - NULL AS `CollationSchema`, - COLLATION_NAME AS `CollationName`, - NULL AS `CharacterSetCatalog`, - NULL AS `CharacterSetSchema`, - CHARACTER_SET_NAME AS `CharacterSetName`, - 0 AS `IsMultiSet`, - CASE WHEN EXTRA LIKE '%auto%' THEN 1 ELSE 0 END AS `IsIdentity`, - CASE WHEN EXTRA LIKE '%auto%' THEN 1 ELSE 0 END AS `IsStoreGenerated`, - COLUMN_DEFAULT AS `Default` - FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=schema() - - - - - - SELECT /* Views */ - CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS `Id`, - TABLE_CATALOG AS`CatalogName`, - TABLE_SCHEMA AS `SchemaName`, - TABLE_NAME AS `Name`, - VIEW_DEFINITION AS `ViewDefinition`, - CASE IS_UPDATABLE WHEN 'YES' THEN 1 ELSE 0 END AS `IsUpdatable` - FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA=schema() - - - - - - SELECT /* View columns */ - CONCAT(TABLE_SCHEMA, '.', TABLE_NAME, '.', COLUMN_NAME) AS `Id`, - CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS `ParentId`, - COLUMN_NAME AS `Name`, - ORDINAL_POSITION AS `Ordinal`, - CASE IS_NULLABLE WHEN 'YES' THEN 1 ELSE 0 END AS `IsNullable`, - IF(LEFT(COLUMN_TYPE,10) = 'tinyint(1)', 'bool', - IF (LEFT(COLUMN_TYPE,10) = 'binary(16)' OR LEFT(COLUMN_TYPE,8) = 'char(36)', 'guid', - IF (INSTR(COLUMN_TYPE, 'unsigned') = 0, DATA_TYPE, - CONCAT('u', DATA_TYPE)))) AS `TypeName`, - IF (CHARACTER_MAXIMUM_LENGTH > 2147483647, 2147483647, CHARACTER_MAXIMUM_LENGTH) AS `MaxLength`, - NUMERIC_PRECISION AS `Precision`, - 0 AS `DateTimePrecision`, - NUMERIC_SCALE AS `Scale`, - NULL AS `CollationCatalog`, - NULL AS `CollationSchema`, - COLLATION_NAME AS `CollationName`, - NULL AS `CharacterSetCatalog`, - NULL AS `CharacterSetSchema`, - CHARACTER_SET_NAME AS `CharacterSetName`, - 0 AS `IsMultiSet`, - CASE WHEN EXTRA LIKE '%auto%' THEN 1 ELSE 0 END AS `IsIdentity`, - CASE WHEN EXTRA LIKE '%auto%' THEN 1 ELSE 0 END AS `IsStoreGenerated`, - COLUMN_DEFAULT AS `Default` - FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=schema() - - - - - - SELECT /* Functions */ - CONCAT(ROUTINE_SCHEMA, '.', SPECIFIC_NAME) AS `Id`, - ROUTINE_CATALOG AS `CatalogName`, - ROUTINE_SCHEMA AS `SchemaName`, - ROUTINE_NAME AS `Name`, - SUBSTRING_INDEX(DTD_IDENTIFIER, '(', 1) AS `ReturnTypeName`, - NULL AS `ReturnMaxLength`, - NULL AS `ReturnPrecision`, - 0 AS `ReturnDateTimePrecision`, - NULL AS `ReturnScale`, - NULL AS `ReturnCollationCatalog`, - NULL AS `ReturnCollationSchema`, - NULL AS `ReturnCollationName`, - NULL AS `ReturnCharacterSetCatalog`, - NULL AS `ReturnCharacterSetSchema`, - NULL AS `ReturnCharacterSetName`, - NULL AS `ReturnIsMultiSet`, - NULL AS `IsAggregate`, - NULL AS `IsBuiltIn`, - NULL AS `IsNiladic` - FROM INFORMATION_SCHEMA.ROUTINES - WHERE ROUTINE_TYPE='FUNCTION' - AND ROUTINE_SCHEMA=schema() - - - - - - SELECT /* Procedures */ - CONCAT(ROUTINE_SCHEMA, '.', SPECIFIC_NAME) AS `Id`, - ROUTINE_CATALOG AS `CatalogName`, - ROUTINE_SCHEMA AS `SchemaName`, - ROUTINE_NAME AS `Name` - FROM INFORMATION_SCHEMA.ROUTINES - WHERE ROUTINE_TYPE='PROCEDURE' - AND ROUTINE_SCHEMA=schema() - - - - - - - SELECT /* Function parameters */ - NULL AS `Id`, - NULL AS `ParentId`, - NULL AS `Name`, - NULL AS `Ordinal`, - NULL AS `TypeName`, - NULL AS `MaxLength`, - NULL AS `Precision`, - NULL AS `DateTimePrecision`, - NULL AS `Scale`, - NULL AS `CollatioCatalog`, - NULL AS `CollationSchema`, - NULL AS `CollationName`, - NULL AS `CharacterSetCatalog`, - NULL AS `CharacterSetSchema`, - NULL AS `CharacterSetName`, - NULL AS `IsMultiSet`, - NULL AS `Mode`, - NULL AS `Default` - - - - - - SELECT /* Procedure parameters */ - NULL AS `Id`, - NULL AS `ParentId`, - NULL AS `Name`, - NULL AS `Ordinal`, - NULL AS `TypeName`, - NULL AS `MaxLength`, - NULL AS `Precision`, - NULL AS `DateTimePrecision`, - NULL AS `Scale`, - NULL AS `CollatioCatalog`, - NULL AS `CollationSchema`, - NULL AS `CollationName`, - NULL AS `CharacterSetCatalog`, - NULL AS `CharacterSetSchema`, - NULL AS `CharacterSetName`, - NULL AS `IsMultiSet`, - NULL AS `Mode`, - NULL AS `Default` - - - - - - - SELECT /* Constraints */ - CONCAT(CONSTRAINT_SCHEMA, '.', TABLE_NAME, '.', CONSTRAINT_NAME) AS `Id`, - CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS `ParentId`, - CONSTRAINT_NAME AS `Name`, - CONSTRAINT_TYPE AS `ConstraintType`, - 0 AS `IsDeferrable`, - 0 AS `IsInitiallyDeferred` - FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS - WHERE CONSTRAINT_TYPE != 'CHECK' AND TABLE_SCHEMA=schema() - - - - - - SELECT /* Check constraints */ - NULL AS `Id`, - NULL AS `Expression` - - - - - - SELECT /* Constraint columns */ - CONCAT(CONSTRAINT_SCHEMA, '.', TABLE_NAME, '.', CONSTRAINT_NAME) AS `ConstraintId`, - CONCAT(TABLE_SCHEMA, '.', TABLE_NAME, '.', COLUMN_NAME) AS `ColumnId` - FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA=schema() - - - - - - SELECT - CONCAT(CONSTRAINT_SCHEMA, '.', TABLE_NAME, '.', CONSTRAINT_NAME) AS `Id`, - 'NO ACTION' AS `UpdateRule`, - 'NO ACTION' AS `DeleteRule` - FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE='FOREIGN KEY' - - - - - - SELECT /* Foreign keys */ - CONCAT(KCU.TABLE_SCHEMA, '.', KCU.CONSTRAINT_NAME, '.', KCU.ORDINAL_POSITION) AS `Id`, - CONCAT(KCU.REFERENCED_TABLE_SCHEMA, '.', KCU.REFERENCED_TABLE_NAME, '.', KCU.REFERENCED_COLUMN_NAME) AS `ToColumnId`, - CONCAT(KCU.TABLE_SCHEMA, '.', KCU.TABLE_NAME, '.', KCU.COLUMN_NAME) AS `FromColumnId`, - CONCAT(KCU.TABLE_SCHEMA, '.', KCU.TABLE_NAME, '.', KCU.CONSTRAINT_NAME) AS `ConstraintId`, - KCU.ORDINAL_POSITION AS `Ordinal` - FROM - INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC - INNER JOIN - INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU - WHERE TC.CONSTRAINT_TYPE = 'FOREIGN KEY' - AND TC.TABLE_SCHEMA = KCU.TABLE_SCHEMA - AND TC.TABLE_NAME = KCU.TABLE_NAME - AND TC.CONSTRAINT_NAME = KCU.CONSTRAINT_NAME - AND TC.TABLE_SCHEMA = schema() - - - - - - SELECT /* View constraints */ - NULL AS `Id`, - NULL AS `ParentId`, - NULL AS `Name`, - NULL AS `ConstraintType`, - NULL AS `Expression`, - NULL AS `UpdateRule`, - NULL AS `DeleteRule` - - - - - - SELECT /* View constraint columns */ - NULL AS `ConstraintId`, - NULL AS `ColumnId` - - - - - - SELECT /* View foreign keys */ - NULL AS `Id`, - NULL AS `ToColumnId`, - NULL AS `FromColumnId`, - NULL AS `ConstraintId`, - 0 AS `Ordinal` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/MySql.Data.Entity.EF6/Properties/SchemaDefinition-5.1.ssdl b/Source/MySql.Data.Entity.EF6/Properties/SchemaDefinition-5.1.ssdl deleted file mode 100644 index cae37e3ce..000000000 --- a/Source/MySql.Data.Entity.EF6/Properties/SchemaDefinition-5.1.ssdl +++ /dev/null @@ -1,737 +0,0 @@ - - - - - - - SELECT /* Tables */ - CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS `Id`, - TABLE_CATALOG AS `Catalog`, - TABLE_SCHEMA AS `Schema`, - TABLE_NAME AS `Name` - FROM INFORMATION_SCHEMA.TABLES - WHERE TABLE_TYPE = 'BASE TABLE' - AND TABLE_SCHEMA=schema() - - - - - - SELECT /* Table columns */ - CONCAT(TABLE_SCHEMA, '.', TABLE_NAME, '.', COLUMN_NAME) AS `Id`, - CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS `ParentId`, - COLUMN_NAME AS `Name`, - ORDINAL_POSITION AS `Ordinal`, - CASE IS_NULLABLE WHEN 'YES' THEN 1 ELSE 0 END AS `IsNullable`, - IF(LEFT(COLUMN_TYPE,10) = 'tinyint(1)', 'bool', - IF (LEFT(COLUMN_TYPE,10) = 'binary(16)' OR LEFT(COLUMN_TYPE,8) = 'char(36)', 'guid', - IF (INSTR(COLUMN_TYPE, 'unsigned') = 0, DATA_TYPE, - CONCAT('u', DATA_TYPE)))) AS `TypeName`, - IF (CHARACTER_MAXIMUM_LENGTH > 2147483647, 2147483647, CHARACTER_MAXIMUM_LENGTH) AS `MaxLength`, - NUMERIC_PRECISION AS `Precision`, - 0 AS `DateTimePrecision`, - NUMERIC_SCALE AS `Scale`, - NULL AS `CollationCatalog`, - NULL AS `CollationSchema`, - COLLATION_NAME AS `CollationName`, - NULL AS `CharacterSetCatalog`, - NULL AS `CharacterSetSchema`, - CHARACTER_SET_NAME AS `CharacterSetName`, - 0 AS `IsMultiSet`, - CASE WHEN EXTRA LIKE '%auto%' THEN 1 ELSE 0 END AS `IsIdentity`, - CASE WHEN EXTRA LIKE '%auto%' THEN 1 ELSE 0 END AS `IsStoreGenerated`, - IF (COLUMN_TYPE = 'tinyint(1)', -128, COLUMN_DEFAULT) AS `Default` - FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=schema() - - - - - - SELECT /* Views */ - CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS `Id`, - TABLE_CATALOG AS`CatalogName`, - TABLE_SCHEMA AS `SchemaName`, - TABLE_NAME AS `Name`, - VIEW_DEFINITION AS `ViewDefinition`, - CASE IS_UPDATABLE WHEN 'YES' THEN 1 ELSE 0 END AS `IsUpdatable` - FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA=schema() - - - - - - SELECT /* View columns */ - CONCAT(TABLE_SCHEMA, '.', TABLE_NAME, '.', COLUMN_NAME) AS `Id`, - CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS `ParentId`, - COLUMN_NAME AS `Name`, - ORDINAL_POSITION AS `Ordinal`, - CASE IS_NULLABLE WHEN 'YES' THEN 1 ELSE 0 END AS `IsNullable`, - IF(LEFT(COLUMN_TYPE,10) = 'tinyint(1)', 'bool', - IF (LEFT(COLUMN_TYPE,10) = 'binary(16)' OR LEFT(COLUMN_TYPE,8) = 'char(36)', 'guid', - IF (INSTR(COLUMN_TYPE, 'unsigned') = 0, DATA_TYPE, - CONCAT('u', DATA_TYPE)))) AS `TypeName`, - IF (CHARACTER_MAXIMUM_LENGTH > 2147483647, 2147483647, CHARACTER_MAXIMUM_LENGTH) AS `MaxLength`, - NUMERIC_PRECISION AS `Precision`, - 0 AS `DateTimePrecision`, - NUMERIC_SCALE AS `Scale`, - NULL AS `CollationCatalog`, - NULL AS `CollationSchema`, - COLLATION_NAME AS `CollationName`, - NULL AS `CharacterSetCatalog`, - NULL AS `CharacterSetSchema`, - CHARACTER_SET_NAME AS `CharacterSetName`, - 0 AS `IsMultiSet`, - CASE WHEN EXTRA LIKE '%auto%' THEN 1 ELSE 0 END AS `IsIdentity`, - CASE WHEN EXTRA LIKE '%auto%' THEN 1 ELSE 0 END AS `IsStoreGenerated`, - COLUMN_DEFAULT AS `Default` - FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=schema() - - - - - - SELECT /* Functions */ - CONCAT(ROUTINE_SCHEMA, '.', SPECIFIC_NAME) AS `Id`, - ROUTINE_CATALOG AS `CatalogName`, - ROUTINE_SCHEMA AS `SchemaName`, - ROUTINE_NAME AS `Name`, - SUBSTRING_INDEX(DTD_IDENTIFIER, '(', 1) AS `ReturnTypeName`, - NULL AS `ReturnMaxLength`, - NULL AS `ReturnPrecision`, - 0 AS `ReturnDateTimePrecision`, - NULL AS `ReturnScale`, - NULL AS `ReturnCollationCatalog`, - NULL AS `ReturnCollationSchema`, - NULL AS `ReturnCollationName`, - NULL AS `ReturnCharacterSetCatalog`, - NULL AS `ReturnCharacterSetSchema`, - NULL AS `ReturnCharacterSetName`, - NULL AS `ReturnIsMultiSet`, - NULL AS `IsAggregate`, - NULL AS `IsBuiltIn`, - NULL AS `IsNiladic` - FROM INFORMATION_SCHEMA.ROUTINES - WHERE ROUTINE_TYPE='FUNCTION' - AND ROUTINE_SCHEMA=schema() - - - - - - SELECT /* Procedures */ - CONCAT(ROUTINE_SCHEMA, '.', SPECIFIC_NAME) AS `Id`, - ROUTINE_CATALOG AS `CatalogName`, - ROUTINE_SCHEMA AS `SchemaName`, - ROUTINE_NAME AS `Name` - FROM INFORMATION_SCHEMA.ROUTINES - WHERE ROUTINE_TYPE='PROCEDURE' - AND ROUTINE_SCHEMA=schema() - - - - - - - SELECT /* Function parameters */ - NULL AS `Id`, - NULL AS `ParentId`, - NULL AS `Name`, - NULL AS `Ordinal`, - NULL AS `TypeName`, - NULL AS `MaxLength`, - NULL AS `Precision`, - NULL AS `DateTimePrecision`, - NULL AS `Scale`, - NULL AS `CollatioCatalog`, - NULL AS `CollationSchema`, - NULL AS `CollationName`, - NULL AS `CharacterSetCatalog`, - NULL AS `CharacterSetSchema`, - NULL AS `CharacterSetName`, - NULL AS `IsMultiSet`, - NULL AS `Mode`, - NULL AS `Default` - - - - - - SELECT /* Procedure parameters */ - NULL AS `Id`, - NULL AS `ParentId`, - NULL AS `Name`, - NULL AS `Ordinal`, - NULL AS `TypeName`, - NULL AS `MaxLength`, - NULL AS `Precision`, - NULL AS `DateTimePrecision`, - NULL AS `Scale`, - NULL AS `CollatioCatalog`, - NULL AS `CollationSchema`, - NULL AS `CollationName`, - NULL AS `CharacterSetCatalog`, - NULL AS `CharacterSetSchema`, - NULL AS `CharacterSetName`, - NULL AS `IsMultiSet`, - NULL AS `Mode`, - NULL AS `Default` - - - - - - - SELECT /* Constraints */ - CONCAT(CONSTRAINT_SCHEMA, '.', TABLE_NAME, '.', CONSTRAINT_NAME) AS `Id`, - CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS `ParentId`, - CONSTRAINT_NAME AS `Name`, - CONSTRAINT_TYPE AS `ConstraintType`, - 0 AS `IsDeferrable`, - 0 AS `IsInitiallyDeferred` - FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS - WHERE CONSTRAINT_TYPE != 'CHECK' AND TABLE_SCHEMA=schema() - - - - - - SELECT /* Check constraints */ - NULL AS `Id`, - NULL AS `Expression` - - - - - - SELECT /* Constraint columns */ - CONCAT(CONSTRAINT_SCHEMA, '.', TABLE_NAME, '.', CONSTRAINT_NAME) AS `ConstraintId`, - CONCAT(TABLE_SCHEMA, '.', TABLE_NAME, '.', COLUMN_NAME) AS `ColumnId` - FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA=schema() - - - - - - - - SELECT - CONCAT(CONSTRAINT_SCHEMA, '.', TABLE_NAME, '.', CONSTRAINT_NAME) AS `Id`, - UPDATE_RULE AS `UpdateRule`, - DELETE_RULE AS `DeleteRule` - FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS - - - - - - SELECT - CONCAT(FC.CONSTRAINT_SCHEMA, '.', FC.CONSTRAINT_NAME, '.', FC.ORDINAL_POSITION) AS `Id`, - CONCAT(PC.TABLE_SCHEMA, '.', PC.TABLE_NAME, '.', PC.COLUMN_NAME) AS `ToColumnId`, - CONCAT(FC.TABLE_SCHEMA, '.', FC.TABLE_NAME, '.', FC.COLUMN_NAME) AS `FromColumnId`, - CONCAT(FC.CONSTRAINT_SCHEMA, '.', FC.TABLE_NAME, '.', FC.CONSTRAINT_NAME) AS `ConstraintId`, - FC.ORDINAL_POSITION AS `Ordinal` - FROM - INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC - INNER JOIN - INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS PC /* PRIMARY KEY COLS*/ - ON RC.UNIQUE_CONSTRAINT_SCHEMA = PC.CONSTRAINT_SCHEMA - AND RC.UNIQUE_CONSTRAINT_NAME = PC.CONSTRAINT_NAME - AND RC.REFERENCED_TABLE_NAME = PC.TABLE_NAME - INNER JOIN - INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS FC /* FOREIGN KEY COLS*/ - ON RC.CONSTRAINT_SCHEMA = FC.CONSTRAINT_SCHEMA - AND RC.CONSTRAINT_NAME = FC.CONSTRAINT_NAME - AND RC.TABLE_NAME = FC.TABLE_NAME - AND PC.ORDINAL_POSITION = FC.ORDINAL_POSITION - - - - - - - SELECT /* View constraints */ - NULL AS `Id`, - NULL AS `ParentId`, - NULL AS `Name`, - NULL AS `ConstraintType`, - NULL AS `Expression`, - NULL AS `UpdateRule`, - NULL AS `DeleteRule` - - - - - - SELECT /* View constraint columns */ - NULL AS `ConstraintId`, - NULL AS `ColumnId` - - - - - - SELECT /* View foreign keys */ - NULL AS `Id`, - NULL AS `ToColumnId`, - NULL AS `FromColumnId`, - NULL AS `ConstraintId`, - 0 AS `Ordinal` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/MySql.Data.Entity.EF6/Properties/SchemaDefinition-5.5.ssdl b/Source/MySql.Data.Entity.EF6/Properties/SchemaDefinition-5.5.ssdl deleted file mode 100644 index 019102ed4..000000000 --- a/Source/MySql.Data.Entity.EF6/Properties/SchemaDefinition-5.5.ssdl +++ /dev/null @@ -1,775 +0,0 @@ - - - - - - - SELECT /* Tables */ - CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS `Id`, - TABLE_CATALOG AS `Catalog`, - TABLE_SCHEMA AS `Schema`, - TABLE_NAME AS `Name` - FROM INFORMATION_SCHEMA.TABLES - WHERE TABLE_TYPE = 'BASE TABLE' - AND TABLE_SCHEMA=schema() - - - - - - SELECT /* Table columns */ - CONCAT(TABLE_SCHEMA, '.', TABLE_NAME, '.', COLUMN_NAME) AS `Id`, - CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS `ParentId`, - COLUMN_NAME AS `Name`, - ORDINAL_POSITION AS `Ordinal`, - CASE IS_NULLABLE WHEN 'YES' THEN 1 ELSE 0 END AS `IsNullable`, - IF(LEFT(COLUMN_TYPE,10) = 'tinyint(1)', 'bool', - IF (LEFT(COLUMN_TYPE,10) = 'binary(16)' OR LEFT(COLUMN_TYPE,8) = 'char(36)', 'guid', - IF (INSTR(COLUMN_TYPE, 'unsigned') = 0, DATA_TYPE, - CONCAT('u', DATA_TYPE)))) AS `TypeName`, - IF (CHARACTER_MAXIMUM_LENGTH > 2147483647, 2147483647, CHARACTER_MAXIMUM_LENGTH) AS `MaxLength`, - NUMERIC_PRECISION AS `Precision`, - 0 AS `DateTimePrecision`, - NUMERIC_SCALE AS `Scale`, - NULL AS `CollationCatalog`, - NULL AS `CollationSchema`, - COLLATION_NAME AS `CollationName`, - NULL AS `CharacterSetCatalog`, - NULL AS `CharacterSetSchema`, - CHARACTER_SET_NAME AS `CharacterSetName`, - 0 AS `IsMultiSet`, - CASE WHEN EXTRA LIKE '%auto%' THEN 1 ELSE 0 END AS `IsIdentity`, - CASE WHEN EXTRA LIKE '%auto%' THEN 1 ELSE 0 END AS `IsStoreGenerated`, - COLUMN_DEFAULT AS `Default` - FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=schema() - - - - - - SELECT /* Views */ - CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS `Id`, - TABLE_CATALOG AS`CatalogName`, - TABLE_SCHEMA AS `SchemaName`, - TABLE_NAME AS `Name`, - VIEW_DEFINITION AS `ViewDefinition`, - CASE IS_UPDATABLE WHEN 'YES' THEN 1 ELSE 0 END AS `IsUpdatable` - FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA=schema() - - - - - - SELECT /* View columns */ - CONCAT(TABLE_SCHEMA, '.', TABLE_NAME, '.', COLUMN_NAME) AS `Id`, - CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS `ParentId`, - COLUMN_NAME AS `Name`, - ORDINAL_POSITION AS `Ordinal`, - CASE IS_NULLABLE WHEN 'YES' THEN 1 ELSE 0 END AS `IsNullable`, - IF(LEFT(COLUMN_TYPE,10) = 'tinyint(1)', 'bool', - IF (LEFT(COLUMN_TYPE,10) = 'binary(16)' OR LEFT(COLUMN_TYPE,8) = 'char(36)', 'guid', - IF (INSTR(COLUMN_TYPE, 'unsigned') = 0, DATA_TYPE, - CONCAT('u', DATA_TYPE)))) AS `TypeName`, - IF (CHARACTER_MAXIMUM_LENGTH > 2147483647, 2147483647, CHARACTER_MAXIMUM_LENGTH) AS `MaxLength`, - NUMERIC_PRECISION AS `Precision`, - 0 AS `DateTimePrecision`, - NUMERIC_SCALE AS `Scale`, - NULL AS `CollationCatalog`, - NULL AS `CollationSchema`, - COLLATION_NAME AS `CollationName`, - NULL AS `CharacterSetCatalog`, - NULL AS `CharacterSetSchema`, - CHARACTER_SET_NAME AS `CharacterSetName`, - 0 AS `IsMultiSet`, - CASE WHEN EXTRA LIKE '%auto%' THEN 1 ELSE 0 END AS `IsIdentity`, - CASE WHEN EXTRA LIKE '%auto%' THEN 1 ELSE 0 END AS `IsStoreGenerated`, - COLUMN_DEFAULT AS `Default` - FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=schema() - - - - - - SELECT /* Functions */ - CONCAT(ROUTINE_SCHEMA, '.', SPECIFIC_NAME) AS `Id`, - ROUTINE_CATALOG AS `CatalogName`, - ROUTINE_SCHEMA AS `SchemaName`, - ROUTINE_NAME AS `Name`, - SUBSTRING_INDEX(DTD_IDENTIFIER, '(', 1) AS `ReturnTypeName`, - NULL AS `ReturnMaxLength`, - NULL AS `ReturnPrecision`, - 0 AS `ReturnDateTimePrecision`, - NULL AS `ReturnScale`, - NULL AS `ReturnCollationCatalog`, - NULL AS `ReturnCollationSchema`, - NULL AS `ReturnCollationName`, - NULL AS `ReturnCharacterSetCatalog`, - NULL AS `ReturnCharacterSetSchema`, - NULL AS `ReturnCharacterSetName`, - NULL AS `ReturnIsMultiSet`, - NULL AS `IsAggregate`, - NULL AS `IsBuiltIn`, - NULL AS `IsNiladic` - FROM INFORMATION_SCHEMA.ROUTINES - WHERE ROUTINE_TYPE='FUNCTION' - AND ROUTINE_SCHEMA=schema() - - - - - - SELECT /* Procedures */ - CONCAT(ROUTINE_SCHEMA, '.', SPECIFIC_NAME) AS `Id`, - ROUTINE_CATALOG AS `CatalogName`, - ROUTINE_SCHEMA AS `SchemaName`, - ROUTINE_NAME AS `Name` - FROM INFORMATION_SCHEMA.ROUTINES - WHERE ROUTINE_TYPE='PROCEDURE' - AND ROUTINE_SCHEMA=schema() - - - - - - SELECT - CONCAT(f.SPECIFIC_SCHEMA, '.', f.SPECIFIC_NAME, '.', f.PARAMETER_NAME) AS `Id`, - CONCAT(f.SPECIFIC_SCHEMA, '.', f.SPECIFIC_NAME) AS `ParentId`, - f.PARAMETER_NAME AS `Name`, - f.ORDINAL_POSITION `Ordinal`, - f.DATA_TYPE AS `TypeName`, - f.CHARACTER_MAXIMUM_LENGTH AS `MaxLength`, - f.NUMERIC_PRECISION AS`Precision`, - NULL AS `DateTimePrecision`, - f.NUMERIC_SCALE AS `Scale`, - NULL AS `CollationCatalog`, - NULL AS `CollationSchema`, - f.COLLATION_NAME AS `CollationName`, - NULL AS `CharacterSetCatalog`, - NULL AS `CharacterSetSchema`, - f.CHARACTER_SET_NAME AS `CharacterSetName`, - CAST(0 as decimal(0,0)) AS `IsMultiSet`, - f.PARAMETER_MODE AS `Mode`, - NULL AS `Default` - FROM - INFORMATION_SCHEMA.PARAMETERS f - INNER JOIN INFORMATION_SCHEMA.ROUTINES r ON - f.SPECIFIC_SCHEMA = r.ROUTINE_SCHEMA AND - f.SPECIFIC_NAME = r.SPECIFIC_NAME AND - r.ROUTINE_TYPE = 'FUNCTION' - WHERE - r.ROUTINE_SCHEMA=schema() AND f.ORDINAL_POSITION > 0 - - - - - - SELECT - CONCAT(f.SPECIFIC_SCHEMA, '.', f.SPECIFIC_NAME, '.', f.PARAMETER_NAME) AS `Id`, - CONCAT(f.SPECIFIC_SCHEMA, '.', f.SPECIFIC_NAME) AS `ParentId`, - f.PARAMETER_NAME AS `Name`, - f.ORDINAL_POSITION `Ordinal`, - f.DATA_TYPE AS `TypeName`, - f.CHARACTER_MAXIMUM_LENGTH AS `MaxLength`, - f.NUMERIC_PRECISION AS`Precision`, - NULL AS `DateTimePrecision`, - f.NUMERIC_SCALE AS `Scale`, - NULL AS `CollationCatalog`, - NULL AS `CollationSchema`, - f.COLLATION_NAME AS `CollationName`, - NULL AS `CharacterSetCatalog`, - NULL AS `CharacterSetSchema`, - f.CHARACTER_SET_NAME AS `CharacterSetName`, - CAST(0 as decimal(0,0)) AS `IsMultiSet`, - f.PARAMETER_MODE AS `Mode`, - NULL AS `Default` - FROM - INFORMATION_SCHEMA.PARAMETERS f - INNER JOIN INFORMATION_SCHEMA.ROUTINES r ON - f.SPECIFIC_SCHEMA = r.ROUTINE_SCHEMA AND - f.SPECIFIC_NAME = r.SPECIFIC_NAME AND - r.ROUTINE_TYPE = 'PROCEDURE' - WHERE - r.ROUTINE_SCHEMA=schema() AND f.ORDINAL_POSITION > 0 - - - - - - SELECT /* Constraints */ - CONCAT(CONSTRAINT_SCHEMA, '.', TABLE_NAME, '.', CONSTRAINT_NAME) AS `Id`, - CONCAT(TABLE_SCHEMA, '.', TABLE_NAME) AS `ParentId`, - CONSTRAINT_NAME AS `Name`, - CONSTRAINT_TYPE AS `ConstraintType`, - 0 AS `IsDeferrable`, - 0 AS `IsInitiallyDeferred` - FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS - WHERE CONSTRAINT_TYPE != 'CHECK' AND TABLE_SCHEMA=schema() - - - - - - SELECT /* Check constraints */ - NULL AS `Id`, - NULL AS `Expression` - - - - - - SELECT /* Constraint columns */ - CONCAT(CONSTRAINT_SCHEMA, '.', TABLE_NAME, '.', CONSTRAINT_NAME) AS `ConstraintId`, - CONCAT(TABLE_SCHEMA, '.', TABLE_NAME, '.', COLUMN_NAME) AS `ColumnId` - FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA=schema() - - - - - - - - SELECT - CONCAT(CONSTRAINT_SCHEMA, '.', TABLE_NAME, '.', CONSTRAINT_NAME) AS `Id`, - UPDATE_RULE AS `UpdateRule`, - DELETE_RULE AS `DeleteRule` - FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS - - - - - - SELECT - CONCAT(FC.CONSTRAINT_SCHEMA, '.', FC.CONSTRAINT_NAME, '.', FC.ORDINAL_POSITION) AS `Id`, - CONCAT(PC.TABLE_SCHEMA, '.', PC.TABLE_NAME, '.', PC.COLUMN_NAME) AS `ToColumnId`, - CONCAT(FC.TABLE_SCHEMA, '.', FC.TABLE_NAME, '.', FC.COLUMN_NAME) AS `FromColumnId`, - CONCAT(FC.CONSTRAINT_SCHEMA, '.', FC.TABLE_NAME, '.', FC.CONSTRAINT_NAME) AS `ConstraintId`, - FC.ORDINAL_POSITION AS `Ordinal` - FROM - INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS RC - INNER JOIN - INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS PC /* PRIMARY KEY COLS*/ - ON RC.UNIQUE_CONSTRAINT_SCHEMA = PC.CONSTRAINT_SCHEMA - AND RC.UNIQUE_CONSTRAINT_NAME = PC.CONSTRAINT_NAME - AND RC.REFERENCED_TABLE_NAME = PC.TABLE_NAME - INNER JOIN - INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS FC /* FOREIGN KEY COLS*/ - ON RC.CONSTRAINT_SCHEMA = FC.CONSTRAINT_SCHEMA - AND RC.CONSTRAINT_NAME = FC.CONSTRAINT_NAME - AND RC.TABLE_NAME = FC.TABLE_NAME - AND PC.ORDINAL_POSITION = FC.ORDINAL_POSITION - - - - - - - - - SELECT /* View constraints */ - NULL AS `Id`, - NULL AS `ParentId`, - NULL AS `Name`, - NULL AS `ConstraintType`, - NULL AS `Expression`, - NULL AS `UpdateRule`, - NULL AS `DeleteRule` - - - - - - SELECT /* View constraint columns */ - NULL AS `ConstraintId`, - NULL AS `ColumnId` - - - - - - SELECT /* View foreign keys */ - NULL AS `Id`, - NULL AS `ToColumnId`, - NULL AS `FromColumnId`, - NULL AS `ConstraintId`, - 0 AS `Ordinal` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/MySql.Data.Entity.EF6/Statements/DeleteStatement.cs b/Source/MySql.Data.Entity.EF6/Statements/DeleteStatement.cs deleted file mode 100644 index f18a4d498..000000000 --- a/Source/MySql.Data.Entity.EF6/Statements/DeleteStatement.cs +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright © 2008, 2013, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Text; -namespace MySql.Data.Entity -{ - class DeleteStatement : SqlFragment - { - public SqlFragment Target { get; set; } - public SqlFragment Where { get; set; } - - public override void WriteSql(StringBuilder sql) - { - sql.Append("DELETE FROM "); - Target.WriteSql(sql); - if (Where != null) - { - sql.Append(" WHERE "); - Where.WriteSql(sql); - } - } - - internal override void Accept(SqlFragmentVisitor visitor) - { - throw new System.NotImplementedException(); - } - } -} diff --git a/Source/MySql.Data.Entity.EF6/Statements/InsertStatement.cs b/Source/MySql.Data.Entity.EF6/Statements/InsertStatement.cs deleted file mode 100644 index abb6997cf..000000000 --- a/Source/MySql.Data.Entity.EF6/Statements/InsertStatement.cs +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright © 2008, 2013, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Text; -using System.Collections.Generic; - -namespace MySql.Data.Entity -{ - class InsertStatement : SqlFragment - { - public InsertStatement() - { - Sets = new List(); - Values = new List(); - } - - public InputFragment Target { get; set; } - public List Sets { get; private set; } - public List Values { get; private set; } - public SelectStatement ReturningSelect; - - public override void WriteSql(StringBuilder sql) - { - // changes sql_mode to allow inserting data without identity columns - if (ReturningSelect != null && ReturningSelect.Columns.Count > 0) - sql.Append("SET SESSION sql_mode='ANSI';"); - - sql.Append("INSERT INTO "); - Target.WriteSql(sql); - if (Sets.Count > 0) - { - sql.Append("("); - WriteList(Sets, sql); - sql.Append(")"); - } - sql.Append(" VALUES "); - sql.Append("("); - WriteList(Values, sql); - sql.Append(")"); - - if (ReturningSelect != null) - { - sql.Append(";\r\n"); - ReturningSelect.WriteSql(sql); - } - } - - internal override void Accept(SqlFragmentVisitor visitor) - { - throw new System.NotImplementedException(); - } - } -} diff --git a/Source/MySql.Data.Entity.EF6/Statements/UpdateStatement.cs b/Source/MySql.Data.Entity.EF6/Statements/UpdateStatement.cs deleted file mode 100644 index bcc5e444f..000000000 --- a/Source/MySql.Data.Entity.EF6/Statements/UpdateStatement.cs +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright © 2008, 2013, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Text; -using System.Collections.Generic; -namespace MySql.Data.Entity -{ - class UpdateStatement : SqlFragment - { - public UpdateStatement() - { - Properties = new List(); - Values = new List(); - } - - public SqlFragment Target { get; set; } - public List Properties { get; private set; } - public List Values { get; private set; } - public SqlFragment Where { get; set; } - public SelectStatement ReturningSelect; - - public override void WriteSql(StringBuilder sql) - { - sql.Append("UPDATE "); - Target.WriteSql(sql); - sql.Append(" SET "); - - string seperator = ""; - for (int i = 0; i < Properties.Count; i++) - { - sql.Append(seperator); - Properties[i].WriteSql(sql); - sql.Append("="); - Values[i].WriteSql(sql); - seperator = ", "; - } - if (Where != null) - { - sql.Append(" WHERE "); - Where.WriteSql(sql); - } - if (ReturningSelect != null) - { - sql.Append(";\r\n"); - ReturningSelect.WriteSql(sql); - } - } - - internal override void Accept(SqlFragmentVisitor visitor) - { - throw new System.NotImplementedException(); - } - } -} diff --git a/Source/MySql.Data.Entity.EF6/project.json b/Source/MySql.Data.Entity.EF6/project.json deleted file mode 100644 index 19d8c22b7..000000000 --- a/Source/MySql.Data.Entity.EF6/project.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "version": "7.0.7-m6", - "description": "MySql.Data.Entity.EF6", - "authors": [ - "Oracle" - ], - "copyright": "Copyright © 2016, 2017, Oracle and/or its affiliates. All rights reserved.", - "language": "en-US", - "packOptions": { - "projectUrl": "http://dev.mysql.com/downloads/", - "licenseUrl": "http://www.gnu.org/licenses/old-licenses/gpl-2.0.html", - "iconUrl": "http://www.mysql.com/common/logos/logo-mysql-170x115.png", - "tags": [ - "MySql", - ".NET Connector", - "MySql Connector/NET" - ], - "requireLicenseAcceptance": true - }, - "buildOptions": { - "nowarn": [ "CS1591" ] - }, - "dependencies": { - "EntityFramework": "6.1.3", - "MySql.Data": { - "target": "project" - } - }, - "frameworks": { - "net451": { - "buildOptions": { - "define": [ "EF6" ], - "keyFile": "../../ConnectorNetPublicKey.snk", - "delaySign": true, - "publicSign": false - }, - "frameworkAssemblies": { - "System.Data": "", - "System.ComponentModel.DataAnnotations": "", - "System.Core": "", - "System.Data.DataSetExtensions": "", - "System.Security": "", - "System.Xml": "", - "System.Runtime": { - "type": "build" - } - } - } - }, - "configurations": { - "Debug": { - "buildOptions": { - "define": [ "DEBUG" ], - "optimize": false, - "preserveCompilationContext": true - } - }, - "Release": { - "buildOptions": { - "define": [ "RELEASE" ], - "optimize": true, - "preserveCompilationContext": true, - "xmlDoc": true - } - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data.EntityFrameworkCore/Content/ReleaseNotes.txt b/Source/MySql.Data.EntityFrameworkCore/Content/ReleaseNotes.txt deleted file mode 100644 index 49f5fffef..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Content/ReleaseNotes.txt +++ /dev/null @@ -1,12 +0,0 @@ -Connector/Net 7.0 Release Notes ------------------------------------- - -Welcome to the release notes for Connector/Net 7.0 - -What's new in 7.0 --------------------- - -- Entity Framework Core support -- .NET Core Support - -Be sure and check the documentation for more information on these new features. \ No newline at end of file diff --git a/Source/MySql.Data.EntityFrameworkCore/Extensions/MySQLDbContextOptionsExtensions.cs b/Source/MySql.Data.EntityFrameworkCore/Extensions/MySQLDbContextOptionsExtensions.cs deleted file mode 100644 index 6780199bd..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Extensions/MySQLDbContextOptionsExtensions.cs +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using MySQL.Data.EntityFrameworkCore.Infraestructure; -using MySQL.Data.EntityFrameworkCore.Infraestructure.Internal; -using System; -using System.Data.Common; - -namespace MySQL.Data.EntityFrameworkCore.Extensions -{ - /// - /// ContextOptionsExtensions implementations for MySQL - /// - public static class MySQLDbContextOptionsExtensions - { - public static DbContextOptionsBuilder UseMySQL(this DbContextOptionsBuilder optionsBuilder, - string connectionString, - Action MySQLOptionsAction = null) - { - var extension = optionsBuilder.Options.FindExtension(); - if (extension == null) - extension = new MySQLOptionsExtension(); - extension.ConnectionString = connectionString; - - IDbContextOptionsBuilderInfrastructure o = optionsBuilder as IDbContextOptionsBuilderInfrastructure; - o.AddOrUpdateExtension(extension); - - MySQLOptionsAction?.Invoke(new MySQLDbContextOptionsBuilder(optionsBuilder)); - - return optionsBuilder; - } - - public static DbContextOptionsBuilder UseMySQL(this DbContextOptionsBuilder optionsBuilder, - DbConnection connection, - Action MySQLOptionsAction = null) - { - var extension = GetOrCreateExtension(optionsBuilder); - extension.Connection = connection; - IDbContextOptionsBuilderInfrastructure o = optionsBuilder as IDbContextOptionsBuilderInfrastructure; - o.AddOrUpdateExtension(extension); - MySQLOptionsAction?.Invoke(new MySQLDbContextOptionsBuilder(optionsBuilder)); - return optionsBuilder; - } - - - public static DbContextOptionsBuilder UseMySQL( - this DbContextOptionsBuilder optionsBuilder, - string connectionString, - Action MySQLOptionsAction = null) - where TContext : DbContext - => (DbContextOptionsBuilder)UseMySQL( - (DbContextOptionsBuilder)optionsBuilder, connectionString, MySQLOptionsAction); - - - public static DbContextOptionsBuilder UseMySQL( - [NotNull] this DbContextOptionsBuilder optionsBuilder, - [NotNull] DbConnection connection, - [CanBeNull] Action MySQLOptionsAction = null) - where TContext : DbContext - => (DbContextOptionsBuilder)UseMySQL( - (DbContextOptionsBuilder)optionsBuilder, connection, MySQLOptionsAction); - - - private static MySQLOptionsExtension GetOrCreateExtension(DbContextOptionsBuilder optionsBuilder) - { - var existing = optionsBuilder.Options.FindExtension(); - return existing != null - ? new MySQLOptionsExtension(existing) - : new MySQLOptionsExtension(); - } - - } -} \ No newline at end of file diff --git a/Source/MySql.Data.EntityFrameworkCore/Extensions/MySQLPropertyBuilderExtensions.cs b/Source/MySql.Data.EntityFrameworkCore/Extensions/MySQLPropertyBuilderExtensions.cs deleted file mode 100644 index 20c8f06cc..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Extensions/MySQLPropertyBuilderExtensions.cs +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore.Metadata.Builders; - -namespace MySQL.Data.EntityFrameworkCore.Extensions -{ - /// - /// MySQLPropertyBuilderExtensions implementation - /// - public static class MySQLPropertyBuilderExtensions - { - public static PropertyBuilder UseMySQLAutoIncrementColumn( - [NotNull] this PropertyBuilder propertyBuilder, - [CanBeNull] string typeName) - { - ThrowIf.Argument.IsNull(propertyBuilder, "propertyBuilder"); - - propertyBuilder.ValueGeneratedOnAdd(); - return propertyBuilder; - } - - public static PropertyBuilder ForMySQLHasColumnType( - [NotNull] this PropertyBuilder propertyBuilder, - [CanBeNull] string typeName) - { - - ThrowIf.Argument.IsNull(propertyBuilder, "propertyBuilder"); - - propertyBuilder.Metadata.MySQL().ColumnType = typeName; - - return propertyBuilder; - } - - - public static PropertyBuilder ForMySQLHasDefaultValue( - [NotNull] this PropertyBuilder propertyBuilder, - [CanBeNull] string sql) - { - ThrowIf.Argument.IsNull(propertyBuilder, "propertyBuilder"); - - if (sql != null && sql.Length == 0) - ThrowIf.Argument.IsEmpty(sql, "sql"); - - propertyBuilder.ValueGeneratedOnAdd(); - //propertyBuilder.Metadata.MySQL().GeneratedValueSql = sql; - - propertyBuilder.Metadata.MySQL().DefaultValueSql = sql; - return propertyBuilder; - - } - - public static PropertyBuilder ForMySQLHasDefaultValueSql( - [NotNull] this PropertyBuilder propertyBuilder, - [CanBeNull] string sql) - { - ThrowIf.Argument.IsNull(propertyBuilder, "propertyBuilder"); - - if (sql != null && sql.Length == 0) - ThrowIf.Argument.IsEmpty(sql, "sql"); - - propertyBuilder.ValueGeneratedOnAdd(); - //propertyBuilder.Metadata.MySQL().GeneratedValueSql = sql; - - propertyBuilder.Metadata.MySQL().DefaultValueSql = sql; - return propertyBuilder; - } - } - -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Extensions/MySQLServiceCollectionExtensions.cs b/Source/MySql.Data.EntityFrameworkCore/Extensions/MySQLServiceCollectionExtensions.cs deleted file mode 100644 index 4a7cb286a..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Extensions/MySQLServiceCollectionExtensions.cs +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore.Infrastructure; -using MySQL.Data.EntityFrameworkCore.Metadata; -using MySQL.Data.EntityFrameworkCore.Migrations; -using MySQL.Data.EntityFrameworkCore.Update; -using Microsoft.EntityFrameworkCore.Storage; -using MySQL.Data.EntityFrameworkCore.Query; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; -using MySql.Data.EntityFrameworkCore.Storage.Internal; -using MySQL.Data.EntityFrameworkCore.Migrations.Internal; -using MySQL.Data.EntityFrameworkCore.Infraestructure.Internal; -using MySql.Data.EntityFrameworkCore.Query.Internal; - -namespace MySQL.Data.EntityFrameworkCore -{ - public static class MySQLServiceCollectionExtensions - { - - /// - /// MySQL specific extension methods for IServiceCollection. - /// - public static IServiceCollection AddEntityFrameworkMySQL(this IServiceCollection services) - { - ThrowIf.Argument.IsNull(services, "services"); - - var service = services.AddRelational() - .AddScoped(); - - service.TryAddEnumerable(ServiceDescriptor.Singleton>()); - - service.TryAdd(new ServiceCollection() - .AddSingleton() - .AddSingleton() - .AddSingleton() - .AddSingleton() - .AddSingleton() - .AddSingleton() - .AddScoped() - .AddScoped() - .AddScoped() - .AddScoped() - .AddScoped() - .AddScoped() - .AddScoped() - .AddQuery()); - - return services; - } - - private static IServiceCollection AddQuery(this IServiceCollection serviceCollection) - { - return serviceCollection - .AddScoped() - .AddScoped() - .AddScoped() - .AddScoped(); - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data.EntityFrameworkCore/Infraestructure/Internal/MySQLModelSource.cs b/Source/MySql.Data.EntityFrameworkCore/Infraestructure/Internal/MySQLModelSource.cs deleted file mode 100644 index fee7aa5b3..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Infraestructure/Internal/MySQLModelSource.cs +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Infrastructure.Internal; -using Microsoft.EntityFrameworkCore.Internal; -using Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal; - -namespace MySQL.Data.EntityFrameworkCore -{ - public class MySQLModelSource : RelationalModelSource - { - public MySQLModelSource( - [NotNull] IDbSetFinder setFinder, - [NotNull] ICoreConventionSetBuilder coreConventionSetBuilder, - [NotNull] IModelCustomizer modelCustomizer, - [NotNull] IModelCacheKeyFactory modelCacheKeyFactory) - : base(setFinder, coreConventionSetBuilder, modelCustomizer, modelCacheKeyFactory) - { - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data.EntityFrameworkCore/Infraestructure/Internal/MySQLOptionsExtension.cs b/Source/MySql.Data.EntityFrameworkCore/Infraestructure/Internal/MySQLOptionsExtension.cs deleted file mode 100644 index e10061bb0..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Infraestructure/Internal/MySQLOptionsExtension.cs +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.Extensions.DependencyInjection; - -namespace MySQL.Data.EntityFrameworkCore.Infraestructure.Internal -{ - /// - /// RelationalOptionsExtension implementation for MySQL - /// - public class MySQLOptionsExtension : RelationalOptionsExtension - { - public MySQLOptionsExtension() - { - } - - public MySQLOptionsExtension(MySQLOptionsExtension copyFrom) - : base(copyFrom) - { - } - - - public override void ApplyServices(IServiceCollection services) - { - services.AddEntityFrameworkMySQL(); - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data.EntityFrameworkCore/Infraestructure/MySQLDbContextOptionsBuilder.cs b/Source/MySql.Data.EntityFrameworkCore/Infraestructure/MySQLDbContextOptionsBuilder.cs deleted file mode 100644 index 43b677eeb..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Infraestructure/MySQLDbContextOptionsBuilder.cs +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using MySQL.Data.EntityFrameworkCore.Infraestructure.Internal; - -namespace MySQL.Data.EntityFrameworkCore.Infraestructure -{ - /// - /// RelationalDbContextOptionsBuilder implementation for MySQL - /// - public class MySQLDbContextOptionsBuilder : RelationalDbContextOptionsBuilder - { - public MySQLDbContextOptionsBuilder(DbContextOptionsBuilder optionsBuilder) - : base(optionsBuilder) - { - } - - protected override MySQLOptionsExtension CloneExtension() - { - return new MySQLOptionsExtension(OptionsBuilder.Options.GetExtension()); - } - - - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Metadata/Internal/MySQLAnnotationNames.cs b/Source/MySql.Data.EntityFrameworkCore/Metadata/Internal/MySQLAnnotationNames.cs deleted file mode 100644 index e109d6771..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Metadata/Internal/MySQLAnnotationNames.cs +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore.Metadata.Internal; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MySQL.Data.EntityFrameworkCore.Metadata.Internal -{ - /// - /// Annotations for MySQL specifics - /// - public static class MySQLAnnotationNames - { - public const string Prefix = "MySQL:"; - public const string AutoIncrement = "AutoIncrement"; - - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Metadata/Internal/MySQLAnnotationProvider.cs b/Source/MySql.Data.EntityFrameworkCore/Metadata/Internal/MySQLAnnotationProvider.cs deleted file mode 100644 index 72122846a..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Metadata/Internal/MySQLAnnotationProvider.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore.Metadata; - -namespace MySQL.Data.EntityFrameworkCore.Metadata -{ - /// - /// Annotation Provider implementation - /// - public class MySQLAnnotationProvider : IRelationalAnnotationProvider - { - public virtual IRelationalEntityTypeAnnotations For(IEntityType entityType) => entityType.MySQL(); - public virtual IRelationalForeignKeyAnnotations For(IForeignKey foreignKey) => foreignKey.MySQL(); - public virtual IRelationalIndexAnnotations For(IIndex index) => index.MySQL(); - public virtual IRelationalKeyAnnotations For(IKey key) => key.MySQL(); - public virtual IRelationalPropertyAnnotations For(IProperty property) => property.MySQL(); - public virtual IRelationalModelAnnotations For(IModel model) => model.MySQL(); - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Metadata/Internal/MySQLFullAnnotationNames.cs b/Source/MySql.Data.EntityFrameworkCore/Metadata/Internal/MySQLFullAnnotationNames.cs deleted file mode 100644 index 77f42c73b..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Metadata/Internal/MySQLFullAnnotationNames.cs +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore.Metadata.Internal; - -namespace MySQL.Data.EntityFrameworkCore.Metadata.Internal -{ - /// - /// RelationalFullAnnotationNames for MySQL - /// - public class MySQLFullAnnotationNames : RelationalFullAnnotationNames - { - public readonly string AutoIncrement; - protected MySQLFullAnnotationNames(string prefix) : base(prefix) - { - AutoIncrement = "AutoIncrement"; - } - - public new static MySQLFullAnnotationNames Instance { get; } = new MySQLFullAnnotationNames(MySQLAnnotationNames.Prefix); - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Metadata/MySQLMetadataExtensions.cs b/Source/MySql.Data.EntityFrameworkCore/Metadata/MySQLMetadataExtensions.cs deleted file mode 100644 index 1abc4a45b..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Metadata/MySQLMetadataExtensions.cs +++ /dev/null @@ -1,100 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Metadata.Internal; -using MySQL.Data.EntityFrameworkCore.Metadata; -using MySQL.Data.EntityFrameworkCore.Metadata.Internal; - -namespace MySQL.Data.EntityFrameworkCore -{ - public static class MySQLMetadataExtensions - { - public static RelationalEntityTypeAnnotations MySQL(this IEntityType entityType) - { - ThrowIf.Argument.IsNull(entityType, "entityType"); - - return new RelationalEntityTypeAnnotations(entityType, MySQLFullAnnotationNames.Instance); - } - - public static RelationalEntityTypeAnnotations MySQL(this EntityType entityType) - { - return (RelationalEntityTypeAnnotations)MySQL((IEntityType)entityType); - } - - public static RelationalModelAnnotations MySQL(this Model model) - { - return MySQL((IModel)model); - } - - public static RelationalModelAnnotations MySQL(this IModel model) - { - ThrowIf.Argument.IsNull(model, "model"); - return new RelationalModelAnnotations(model, MySQLFullAnnotationNames.Instance); - } - - public static RelationalKeyAnnotations MySQL(this Key key) - { - return (RelationalKeyAnnotations)MySQL((IKey)key); - } - - public static RelationalKeyAnnotations MySQL(this IKey key) - { - ThrowIf.Argument.IsNull(key, "key"); - return new RelationalKeyAnnotations(key, MySQLFullAnnotationNames.Instance); - } - - public static IRelationalForeignKeyAnnotations MySQL(this IForeignKey foreignKey) - { - ThrowIf.Argument.IsNull(foreignKey, "foreignKey"); - return new RelationalForeignKeyAnnotations(foreignKey, MySQLFullAnnotationNames.Instance); - } - - public static RelationalForeignKeyAnnotations MySQL(this ForeignKey foreignKey) - { - return (RelationalForeignKeyAnnotations)MySQL((IForeignKey)foreignKey); - } - - public static RelationalIndexAnnotations MySQL(this Index index) - { - return (RelationalIndexAnnotations)MySQL((IIndex)index); - } - - public static IRelationalIndexAnnotations MySQL(this IIndex index) - { - ThrowIf.Argument.IsNull(index, "index"); - return new RelationalIndexAnnotations(index, MySQLFullAnnotationNames.Instance); - } - - public static MySQLPropertyAnnotations MySQL(this IProperty property) - { - ThrowIf.Argument.IsNull(property, "property"); - - return new MySQLPropertyAnnotations(property); - } - - public static MySQLPropertyAnnotations MySQL(this Property property) - { - return (MySQLPropertyAnnotations)MySQL((IProperty)property); - } - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Metadata/MySQLPropertyAnnotations.cs b/Source/MySql.Data.EntityFrameworkCore/Metadata/MySQLPropertyAnnotations.cs deleted file mode 100644 index 63e77b19f..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Metadata/MySQLPropertyAnnotations.cs +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore.Metadata; -using MySQL.Data.EntityFrameworkCore.Metadata.Internal; - -namespace MySQL.Data.EntityFrameworkCore.Metadata -{ - public class MySQLPropertyAnnotations : RelationalPropertyAnnotations - { - private const string AUTOINC_ANNOTATION = "MySQL:AutoIncrement"; - - public MySQLPropertyAnnotations(IProperty property) - : base(property, MySQLFullAnnotationNames.Instance) - { - } - - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Migrations/Internal/MySQLHistoryRepository.cs b/Source/MySql.Data.EntityFrameworkCore/Migrations/Internal/MySQLHistoryRepository.cs deleted file mode 100644 index c8edc2b8a..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Migrations/Internal/MySQLHistoryRepository.cs +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using System.Text; - -namespace MySQL.Data.EntityFrameworkCore.Migrations.Internal -{ - public class MySQLHistoryRepository : HistoryRepository - { - public MySQLHistoryRepository( - IDatabaseCreator databaseCreator, - IRawSqlCommandBuilder sqlCommandBuilder, - MySQLServerConnection connection, - IDbContextOptions options, - IMigrationsModelDiffer modelDiffer, - MySQLMigrationsSqlGenerator sqlGenerator, - IRelationalAnnotationProvider annotations, - ISqlGenerationHelper sql) - : base( - databaseCreator, - sqlCommandBuilder, - connection, - options, - modelDiffer, - sqlGenerator, - annotations, - sql) - { - } - - protected override string ExistsSql - { - get - { - var builder = new StringBuilder(); - - builder.AppendLine("SELECT 1 FROM information_schema.tables ") - .AppendLine("WHERE table_name = '") - .Append(SqlGenerationHelper.EscapeLiteral(TableName)) - .Append("' AND table_schema = DATABASE()"); - - return builder.ToString(); - } - } - - - protected override bool InterpretExistsResult(object value) => value != DBNull.Value; - - public override string GetBeginIfExistsScript(string migrationId) - { - ThrowIf.Argument.IsNull(migrationId, "migrationId"); - - return new StringBuilder() - .Append("IF EXISTS(SELECT * FROM ") - .Append(SqlGenerationHelper.DelimitIdentifier(TableName, TableSchema)) - .Append(" WHERE ") - .Append(SqlGenerationHelper.DelimitIdentifier(MigrationIdColumnName)) - .Append(" = '") - .Append(SqlGenerationHelper.EscapeLiteral(migrationId)) - .AppendLine("')") - .Append("BEGIN") - .ToString(); - } - - public override string GetBeginIfNotExistsScript(string migrationId) - { - ThrowIf.Argument.IsNull(migrationId, "migrationId"); - - return new StringBuilder() - .Append("IF NOT EXISTS(SELECT * FROM ") - .Append(SqlGenerationHelper.DelimitIdentifier(TableName, TableSchema)) - .Append(" WHERE ") - .Append(SqlGenerationHelper.DelimitIdentifier(MigrationIdColumnName)) - .Append(" = '") - .Append(SqlGenerationHelper.EscapeLiteral(migrationId)) - .AppendLine("')") - .Append("BEGIN") - .ToString(); - } - - public override string GetCreateIfNotExistsScript() - { - var builder = new StringBuilder(); - builder.AppendLine(" IF EXISTS(SELECT 1 FROM information_schema.tables "); - builder.AppendLine(" WHERE table_name = '") - .Append(SqlGenerationHelper.EscapeLiteral(TableName)) - .AppendLine("' AND table_schema = DATABASE()) ") - .AppendLine("BEGIN") - .AppendLine(GetCreateScript()) - .AppendLine("END;"); - return builder.ToString(); - } - - public override string GetEndIfScript() => "END;" + Environment.NewLine; - - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Migrations/Internal/MySQLMigrationsAnnotationProvider.cs b/Source/MySql.Data.EntityFrameworkCore/Migrations/Internal/MySQLMigrationsAnnotationProvider.cs deleted file mode 100644 index 45d1cd700..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Migrations/Internal/MySQLMigrationsAnnotationProvider.cs +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Collections.Generic; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations; -using MySQL.Data.EntityFrameworkCore.Metadata; -using MySQL.Data.EntityFrameworkCore.Utils; -using MySQL.Data.EntityFrameworkCore.Metadata.Internal; - -namespace MySQL.Data.EntityFrameworkCore.Migrations.Internal -{ - public class MySQLMigrationsAnnotationProvider : MigrationsAnnotationProvider - { - public override IEnumerable For(IProperty property) - { - if (property.ValueGenerated == ValueGenerated.OnAdd && - property.ClrType.CanBeAutoIncrement()) - { - yield return new Annotation(MySQLAnnotationNames.Prefix + MySQLAnnotationNames.AutoIncrement, true); - } - } - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Migrations/MySQLMigrationsSqlGenerator.cs b/Source/MySql.Data.EntityFrameworkCore/Migrations/MySQLMigrationsSqlGenerator.cs deleted file mode 100644 index 3be2be06e..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Migrations/MySQLMigrationsSqlGenerator.cs +++ /dev/null @@ -1,304 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations.Operations; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage; -using Microsoft.EntityFrameworkCore.Infrastructure; -using System.Linq; -using MySQL.Data.EntityFrameworkCore.Migrations.Operations; -using MySQL.Data.EntityFrameworkCore.Metadata.Internal; - -namespace MySQL.Data.EntityFrameworkCore.Migrations -{ - /// - /// MigrationSqlGenerator implementation for MySQL - /// - public class MySQLMigrationsSqlGenerator : MigrationsSqlGenerator - { - private readonly ISqlGenerationHelper _sqlGenerationHelper; - - public MySQLMigrationsSqlGenerator( - [NotNull] IRelationalCommandBuilderFactory commandBuilderFactory, - [NotNull] ISqlGenerationHelper sqlGenerationHelper, - [NotNull] IRelationalTypeMapper typeMapper, - [NotNull] IRelationalAnnotationProvider annotations) - : base(commandBuilderFactory, sqlGenerationHelper, typeMapper, annotations) - { - _sqlGenerationHelper = sqlGenerationHelper; - } - - protected override void Generate( - [NotNull] MigrationOperation operation, - [CanBeNull] IModel model, - [NotNull] MigrationCommandListBuilder builder) - { - ThrowIf.Argument.IsNull(operation, "operation"); - ThrowIf.Argument.IsNull(builder, "builder"); - - if (operation is MySQLCreateDatabaseOperation) - Generate(operation as MySQLCreateDatabaseOperation, model, builder); - else if (operation is MySQLDropDatabaseOperation) - Generate(operation as MySQLDropDatabaseOperation, model, builder); - else - base.Generate(operation, model, builder); - } - - protected override void Generate( - [NotNull] EnsureSchemaOperation operation, - [CanBeNull] IModel model, - [NotNull] MigrationCommandListBuilder builder) - { - ThrowIf.Argument.IsNull(operation, "operation"); - ThrowIf.Argument.IsNull(builder, "builder"); - - throw new NotImplementedException(); - //base.Generate(operation, model, builder); - } - - protected virtual void Generate( - [NotNull] MySQLCreateDatabaseOperation operation, - [CanBeNull] IModel model, - MigrationCommandListBuilder builder) - { - ThrowIf.Argument.IsNull(operation, "operation"); - ThrowIf.Argument.IsNull(builder, "builder"); - - builder - .Append("CREATE DATABASE ") - .Append(_sqlGenerationHelper.DelimitIdentifier(operation.Name)); - - EndStatement(builder, suppressTransaction: true); - } - - protected virtual void Generate( - [NotNull] MySQLDropDatabaseOperation operation, - [CanBeNull] IModel model, - [NotNull] MigrationCommandListBuilder builder) - { - ThrowIf.Argument.IsNull(operation, "operation"); - ThrowIf.Argument.IsNull(builder, "builder"); - - builder - .Append("DROP DATABASE IF EXISTS ") - .Append(_sqlGenerationHelper.DelimitIdentifier(operation.Name)); - - EndStatement(builder, suppressTransaction: true); - } - - - protected override void ColumnDefinition( - string schema, - string table, - string name, - Type clrType, - string type, - bool? unicode, - int? maxLength, - bool rowVersion, - bool nullable, - object defaultValue, - string defaultValueSql, - string computedColumnSql, - IAnnotatable annotatable, - IModel model, - MigrationCommandListBuilder builder) - { - ThrowIf.Argument.IsEmpty(name, "name"); - ThrowIf.Argument.IsNull(clrType, "clrType"); - ThrowIf.Argument.IsNull(annotatable, "annotatable"); - ThrowIf.Argument.IsNull(builder, "builder"); - - - if (type == null) - { - //Any property that maps to the column will work - //var property = FindProperties(model, schema, table, name)?.FirstOrDefault(); - var property = FindProperty(model, schema, table, name); - type = property != null - ? TypeMapper.GetMapping(property).StoreType - : TypeMapper.GetMapping(clrType).StoreType; - } - - if (computedColumnSql != null) - { - builder - .Append(_sqlGenerationHelper.DelimitIdentifier(name)) - .Append(string.Format(" {0} AS ", type)) - .Append(" (" + computedColumnSql + ")"); - - return; - - } - - if (defaultValue != null && clrType == typeof(string)) - { - defaultValue = "'" + defaultValue + "'"; - } - - var autoInc = annotatable[MySQLAnnotationNames.Prefix + MySQLAnnotationNames.AutoIncrement]; - - base.ColumnDefinition( - schema, table, name, clrType, type, unicode, maxLength, rowVersion, nullable, - defaultValue, defaultValueSql, computedColumnSql, annotatable, model, builder); - - if (autoInc != null && (bool)autoInc) - { - builder.Append(" AUTO_INCREMENT"); - } - } - - - protected override void DefaultValue( - [CanBeNull] object defaultValue, - [CanBeNull] string defaultValueSql, - [NotNull] MigrationCommandListBuilder builder) - { - ThrowIf.Argument.IsNull(builder, nameof(builder)); - - if (defaultValueSql != null) - { - builder - .Append(" DEFAULT ") - .Append(defaultValueSql); - } - else if (defaultValue != null) - { - builder - .Append(" DEFAULT ") - .Append(defaultValue); - } - } - - - - protected override void PrimaryKeyConstraint( - [NotNull] AddPrimaryKeyOperation operation, - [CanBeNull] IModel model, - [NotNull] MigrationCommandListBuilder builder) - { - - ThrowIf.Argument.IsNull(operation, "AddPrimaryKeyOperation"); - ThrowIf.Argument.IsNull(builder, "RelationalCommandListBuider"); - - - //MySQL always assign PRIMARY to the PK name no way to override that. - // check http://dev.mysql.com/doc/refman/5.1/en/create-table.html - - builder - .Append("PRIMARY KEY ") - .Append("(") - .Append(string.Join(", ", operation.Columns.Select(_sqlGenerationHelper.DelimitIdentifier))) - .Append(")"); - - IndexTraits(operation, model, builder); - } - - protected override void Generate(AlterColumnOperation operation, IModel model, MigrationCommandListBuilder builder) - { - ThrowIf.Argument.IsNull(operation, "AlterColumnOperation"); - ThrowIf.Argument.IsNull(model, "model"); - ThrowIf.Argument.IsNull(builder, "builder"); - - var operationColumn = new AddColumnOperation(); - operationColumn.Schema = operation.Schema; - operationColumn.Table = operation.Table; - operationColumn.Name = operation.Name; - operationColumn.ClrType = operation.ClrType; - operationColumn.ColumnType = operation.ColumnType; - operationColumn.ComputedColumnSql = operation.ComputedColumnSql; - operationColumn.DefaultValue = operation.DefaultValue; - operationColumn.DefaultValueSql = operation.DefaultValueSql; - - builder - .Append("ALTER TABLE " + operation.Table) - .Append(" MODIFY "); - ColumnDefinition(operationColumn, model, builder); - builder - .AppendLine(SqlGenerationHelper.StatementTerminator); - EndStatement(builder); - } - - protected override void Generate(RenameTableOperation operation, IModel model, MigrationCommandListBuilder builder) - { - ThrowIf.Argument.IsNull(operation, "RenameTableOperation"); - ThrowIf.Argument.IsNull(model, "model"); - ThrowIf.Argument.IsNull(builder, "builder"); - - builder - .Append("ALTER TABLE " + operation.Name) - .Append(" RENAME " + operation.NewName) - .AppendLine(SqlGenerationHelper.StatementTerminator); - - EndStatement(builder); - } - - protected override void Generate(CreateIndexOperation operation, IModel model, MigrationCommandListBuilder builder) - { - - ThrowIf.Argument.IsNull(operation, "CreateIndexOperation"); - ThrowIf.Argument.IsNull(model, "model"); - ThrowIf.Argument.IsNull(builder, "builder"); - - builder - .Append("CREATE " + (operation.IsUnique ? "UNIQUE " : "") + "INDEX "); - - builder.Append(_sqlGenerationHelper.DelimitIdentifier(operation.Name) + " ON " + operation.Table + " (" + string.Join(", ", operation.Columns.Select(_sqlGenerationHelper.DelimitIdentifier)) + ")") - .AppendLine(SqlGenerationHelper.StatementTerminator); - - EndStatement(builder); - } - - protected override void Generate(RenameIndexOperation operation, IModel model, MigrationCommandListBuilder builder) - { - - throw new NotSupportedException(); - - //ThrowIf.Argument.IsNull(operation, "RenameIndexOperation"); - //ThrowIf.Argument.IsNull(model, "model"); - //ThrowIf.Argument.IsNull(builder, "builder"); - - ////table content remains the same - //builder - //.Append("DROP INDEX ") - //.Append(_sqlGenerationHelper.DelimitIdentifier(operation.Name) + ", ") - //.Append("CREATE INDEX " ) - //.Append(_sqlGenerationHelper.DelimitIdentifier(operation.Name) + " ON " + operation.Table ); - } - - protected override void Generate(DropIndexOperation operation, IModel model, MigrationCommandListBuilder builder) - { - ThrowIf.Argument.IsNull(operation, "DropIndexOperation"); - ThrowIf.Argument.IsNull(model, "model"); - ThrowIf.Argument.IsNull(builder, "builder"); - - builder - .Append("DROP INDEX ") - .Append(operation.Name) - .Append(" ON " + operation.Table) - .AppendLine(SqlGenerationHelper.StatementTerminator); - EndStatement(builder); - } - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Migrations/Operations/CreateDatabaseOperation.cs b/Source/MySql.Data.EntityFrameworkCore/Migrations/Operations/CreateDatabaseOperation.cs deleted file mode 100644 index 73af911bb..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Migrations/Operations/CreateDatabaseOperation.cs +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore.Migrations.Operations; - -namespace MySQL.Data.EntityFrameworkCore.Migrations.Operations -{ - /// - /// Create database operation class for migrations - /// - public class MySQLCreateDatabaseOperation : MigrationOperation - { - public string Name { get; set; } - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Migrations/Operations/DropDatabaseOperation.cs b/Source/MySql.Data.EntityFrameworkCore/Migrations/Operations/DropDatabaseOperation.cs deleted file mode 100644 index 907ee3de3..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Migrations/Operations/DropDatabaseOperation.cs +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore.Migrations.Operations; - -namespace MySQL.Data.EntityFrameworkCore.Migrations.Operations -{ - /// - /// Drop database operation for migrations. - /// - public class MySQLDropDatabaseOperation : MigrationOperation - { - public string Name { get; set; } - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/MySql.Data.EntityFrameworkCore.csproj b/Source/MySql.Data.EntityFrameworkCore/MySql.Data.EntityFrameworkCore.csproj deleted file mode 100644 index 5a4aa32cf..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/MySql.Data.EntityFrameworkCore.csproj +++ /dev/null @@ -1,106 +0,0 @@ - - - - - Debug - AnyCPU - {11E455EE-8BA8-466C-B8D6-5E5EDB0767FC} - Library - Properties - MySQL.Data.EntityFrameworkCore - MySQL.Data.EntityFrameworkCore - v4.5.1 - 512 - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - bin\Release\MySQL.Data.EntityFrameworkCore.XML - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Designer - - - - - {e9df5ed1-4cbd-4226-b931-9a51610ac14d} - MySql.Data - - - - - \ No newline at end of file diff --git a/Source/MySql.Data.EntityFrameworkCore/MySql.Data.EntityFrameworkCore.xproj b/Source/MySql.Data.EntityFrameworkCore/MySql.Data.EntityFrameworkCore.xproj deleted file mode 100644 index f9e0f6171..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/MySql.Data.EntityFrameworkCore.xproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - e0ea25b2-ff20-4b52-9325-57bbedd777ef - MySql.Data.EntityFrameworkCore - .\obj - .\bin\ - v4.6 - - - 2.0 - - - \ No newline at end of file diff --git a/Source/MySql.Data.EntityFrameworkCore/Properties/AssemblyInfo.cs b/Source/MySql.Data.EntityFrameworkCore/Properties/AssemblyInfo.cs deleted file mode 100644 index 6699ff08b..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Security; -using System.Reflection; -using System.Runtime.CompilerServices; -using 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. - -[assembly: AssemblyTitle("MySql.Data.EntityFrameworkCore for Entity Framework")] -[assembly: AssemblyDescription("Entity Framework Core 1.0 supported")] - -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Oracle")] -[assembly: AssemblyProduct("MySql.Data.EntityFrameworkCore")] -[assembly: AssemblyCopyright("Copyright © 2015, Oracle and/or its affiliates. All rights reserved.")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("540e7b3c-bd0b-4980-96d1-5d140d303f7e")] -[assembly: AssemblyKeyName("ConnectorNet")] \ No newline at end of file diff --git a/Source/MySql.Data.EntityFrameworkCore/Query/ExpressionTranslators/Internal/MySQLCompositeMemberTranslator.cs b/Source/MySql.Data.EntityFrameworkCore/Query/ExpressionTranslators/Internal/MySQLCompositeMemberTranslator.cs deleted file mode 100644 index 3dfb76043..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Query/ExpressionTranslators/Internal/MySQLCompositeMemberTranslator.cs +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore.Query.ExpressionTranslators; - -namespace MySQL.Data.EntityFrameworkCore -{ - /// - /// RelationalCompositeMemberTranslator implementation for MySQL - /// - public class MySQLCompositeMemberTranslator : RelationalCompositeMemberTranslator - { - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Query/ExpressionTranslators/Internal/MySQLCompositeMethodCallTranslator.cs b/Source/MySql.Data.EntityFrameworkCore/Query/ExpressionTranslators/Internal/MySQLCompositeMethodCallTranslator.cs deleted file mode 100644 index 329df7005..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Query/ExpressionTranslators/Internal/MySQLCompositeMethodCallTranslator.cs +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.Extensions.Logging; -using Microsoft.EntityFrameworkCore.Query.ExpressionTranslators; -using MySql.Data.EntityFrameworkCore.Query.ExpressionTranslators.Internal; - -namespace MySQL.Data.EntityFrameworkCore -{ - /// - /// RelationalCompositeMethodCallTranslator implementation for MySQL - /// - public class MySQLCompositeMethodCallTranslator : RelationalCompositeMethodCallTranslator - { - - public static readonly IMethodCallTranslator[] _mysqlTranslators = - { - new MySQLContainsOptimizedTranslator() - }; - - public MySQLCompositeMethodCallTranslator(ILogger logger) : base(logger) - { - AddTranslators(_mysqlTranslators); - } - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Query/ExpressionTranslators/Internal/MySQLContainsOptimizedTranslator.cs b/Source/MySql.Data.EntityFrameworkCore/Query/ExpressionTranslators/Internal/MySQLContainsOptimizedTranslator.cs deleted file mode 100644 index 04fdc40a4..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Query/ExpressionTranslators/Internal/MySQLContainsOptimizedTranslator.cs +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using Microsoft.EntityFrameworkCore.Query.Expressions; -using Microsoft.EntityFrameworkCore.Query.ExpressionTranslators; -using Microsoft.Extensions.Logging; -using MySQL.Data.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Reflection; -using System.Threading.Tasks; - -namespace MySql.Data.EntityFrameworkCore.Query.ExpressionTranslators.Internal -{ - public class MySQLContainsOptimizedTranslator : IMethodCallTranslator - { - - private static readonly MethodInfo _methodInfo - = typeof(string).GetRuntimeMethod(nameof(string.Contains), new[] { typeof(string) }); - - private static readonly MethodInfo _concat - = typeof(string).GetRuntimeMethod(nameof(string.Concat), new[] { typeof(string), typeof(string) }); - - public virtual Expression Translate(MethodCallExpression methodCallExpression) - { - ThrowIf.Argument.IsNull(methodCallExpression, nameof(methodCallExpression)); - - if (ReferenceEquals(methodCallExpression.Method, _methodInfo)) - { - var patternExpression = methodCallExpression.Arguments[0]; - var patternConstantExpression = patternExpression as ConstantExpression; - - var sqlArguments = new List(); - sqlArguments.Add(ConstantExpression.Constant("%")); - sqlArguments.Add(patternConstantExpression); - sqlArguments.Add(ConstantExpression.Constant("%")); - - var concatFunctionExpression = new SqlFunctionExpression("concat", methodCallExpression.Type, sqlArguments); - - return new LikeExpression( - methodCallExpression.Object, - concatFunctionExpression); - } - return null; - } - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Query/ExpressionTranslators/Internal/MySQLStringLengthTranslator.cs b/Source/MySql.Data.EntityFrameworkCore/Query/ExpressionTranslators/Internal/MySQLStringLengthTranslator.cs deleted file mode 100644 index 190c17331..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Query/ExpressionTranslators/Internal/MySQLStringLengthTranslator.cs +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright © 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using Microsoft.EntityFrameworkCore.Query.Expressions; -using Microsoft.EntityFrameworkCore.Query.ExpressionTranslators; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Threading.Tasks; - -namespace MySql.Data.EntityFrameworkCore.Query.ExpressionTranslators.Internal -{ - public class MySQLStringLengthTranslator : IMemberTranslator - { - public virtual Expression Translate(MemberExpression memberExpression) - => (memberExpression.Expression != null) - && (memberExpression.Expression.Type == typeof(string)) - && (memberExpression.Member.Name == nameof(string.Length)) - ? new SqlFunctionExpression("LENGTH", memberExpression.Type, new[] { memberExpression.Expression }) - : null; - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Query/ExpressionTranslators/Internal/MySQLStringReplaceTranslator.cs b/Source/MySql.Data.EntityFrameworkCore/Query/ExpressionTranslators/Internal/MySQLStringReplaceTranslator.cs deleted file mode 100644 index 7464e13e1..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Query/ExpressionTranslators/Internal/MySQLStringReplaceTranslator.cs +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright © 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using Microsoft.EntityFrameworkCore.Query.Expressions; -using Microsoft.EntityFrameworkCore.Query.ExpressionTranslators; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Reflection; -using System.Threading.Tasks; - -namespace MySql.Data.EntityFrameworkCore.Query.ExpressionTranslators.Internal -{ - public class MySQLStringReplaceTranslator : IMethodCallTranslator - { - - private static readonly MethodInfo _methodInfo = typeof(string).GetTypeInfo() - .GetDeclaredMethods(nameof(string.Replace)) - .Single(m => m.GetParameters()[0].ParameterType == typeof(string)); - - public virtual Expression Translate(MethodCallExpression methodCallExpression) - => methodCallExpression.Method == _methodInfo - ? new SqlFunctionExpression("REPLACE", methodCallExpression.Type, - new[] { methodCallExpression.Object }.Concat(methodCallExpression.Arguments)) - : null; - - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Query/Internal/MySQLQueryCompilationContext.cs b/Source/MySql.Data.EntityFrameworkCore/Query/Internal/MySQLQueryCompilationContext.cs deleted file mode 100644 index 9ce683ebb..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Query/Internal/MySQLQueryCompilationContext.cs +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using Microsoft.EntityFrameworkCore.Query; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using JetBrains.Annotations; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Query.ExpressionVisitors.Internal; -using Microsoft.EntityFrameworkCore.Query.Internal; -using MySQL.Data.EntityFrameworkCore; - -namespace MySql.Data.EntityFrameworkCore.Query.Internal -{ - public class MySQLQueryCompilationContext : RelationalQueryCompilationContext - { - public MySQLQueryCompilationContext( - [NotNull] IModel model, - [NotNull] ISensitiveDataLogger logger, - [NotNull] IEntityQueryModelVisitorFactory entityQueryModelVisitorFactory, - [NotNull] IRequiresMaterializationExpressionVisitorFactory requiresMaterializationExpressionVisitorFactory, - [NotNull] ILinqOperatorProvider linqOperatorProvider, - [NotNull] IQueryMethodProvider queryMethodProvider, - [NotNull] Type contextType, bool trackQueryResults) - : base(model, logger, entityQueryModelVisitorFactory, requiresMaterializationExpressionVisitorFactory, linqOperatorProvider, queryMethodProvider, contextType, trackQueryResults) - { - } - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Query/Internal/MySQLQueryCompilationContextFactory.cs b/Source/MySql.Data.EntityFrameworkCore/Query/Internal/MySQLQueryCompilationContextFactory.cs deleted file mode 100644 index 95bf89bb3..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Query/Internal/MySQLQueryCompilationContextFactory.cs +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore.Query; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using JetBrains.Annotations; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Internal; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Query.ExpressionVisitors.Internal; -using Remotion.Linq.Parsing.Structure.NodeTypeProviders; -using MySQL.Data.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Query.Internal; - -namespace MySql.Data.EntityFrameworkCore.Query.Internal -{ - public class MySQLQueryCompilationContextFactory : RelationalQueryCompilationContextFactory - { - public MySQLQueryCompilationContextFactory( - [NotNull] IModel model, - [NotNull] ISensitiveDataLogger logger, - [NotNullAttribute] IEntityQueryModelVisitorFactory entityQueryModelVisitorFactory, - [NotNullAttribute] IRequiresMaterializationExpressionVisitorFactory requiresMaterializationExpressionVisitorFactory, - [NotNullAttribute] MethodInfoBasedNodeTypeRegistry methodInfoBasedNodeTypeRegistry, - [NotNullAttribute] ICurrentDbContext currentContext) : - base(model, logger, entityQueryModelVisitorFactory, requiresMaterializationExpressionVisitorFactory, methodInfoBasedNodeTypeRegistry, currentContext) - { - } - - public override QueryCompilationContext Create(bool async) - { - if (!async) - { - return new MySQLQueryCompilationContext( - Model, - (ISensitiveDataLogger)Logger, - EntityQueryModelVisitorFactory, - RequiresMaterializationExpressionVisitorFactory, - new LinqOperatorProvider(), - new QueryMethodProvider(), - ContextType, - TrackQueryResults); - - } - else - return base.Create(async); - } - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Query/Sql/Internal/MySQLQueryGeneratorFactory.cs b/Source/MySql.Data.EntityFrameworkCore/Query/Sql/Internal/MySQLQueryGeneratorFactory.cs deleted file mode 100644 index 240af87cf..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Query/Sql/Internal/MySQLQueryGeneratorFactory.cs +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using Microsoft.EntityFrameworkCore.Query.Expressions; -using Microsoft.EntityFrameworkCore.Query.Sql; -using Microsoft.EntityFrameworkCore.Storage; - -namespace MySQL.Data.EntityFrameworkCore.Query -{ - /// - /// Implementation for QuerySqlGeneratorFactoryBase - /// - public class MySQLQueryGeneratorFactory : QuerySqlGeneratorFactoryBase - { - - public MySQLQueryGeneratorFactory(IRelationalCommandBuilderFactory commandBuilderFactory, - ISqlGenerationHelper sqlGenerationHelper, - IParameterNameGeneratorFactory parameterNameGeneratorFactory, - IRelationalTypeMapper relationalTypeMapper) - : base( - commandBuilderFactory, - sqlGenerationHelper, - parameterNameGeneratorFactory, - relationalTypeMapper) - { - } - - - public override IQuerySqlGenerator CreateDefault(SelectExpression selectExpression) - => new MySQLQuerySqlGenerator( - CommandBuilderFactory, - SqlGenerationHelper, - ParameterNameGeneratorFactory, - RelationalTypeMapper, - selectExpression); - - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Query/Sql/Internal/MySQLQuerySqlGenerator.cs b/Source/MySql.Data.EntityFrameworkCore/Query/Sql/Internal/MySQLQuerySqlGenerator.cs deleted file mode 100644 index 3526be332..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Query/Sql/Internal/MySQLQuerySqlGenerator.cs +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright © 2015, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using Microsoft.EntityFrameworkCore.Query.Expressions; -using Microsoft.EntityFrameworkCore.Query.Sql; -using Microsoft.EntityFrameworkCore.Storage; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Text; -using System.Threading.Tasks; - - -namespace MySQL.Data.EntityFrameworkCore.Query -{ - public class MySQLQuerySqlGenerator : DefaultQuerySqlGenerator - { - protected override string TypedFalseLiteral - { - get - { - return "('0')"; - } - } - - protected override string ConcatOperator - { - get - { - return String.Empty; - } - } - - protected override string TypedTrueLiteral - { - get - { - return "('1')"; - } - } - - public MySQLQuerySqlGenerator( - [NotNull] IRelationalCommandBuilderFactory relationalCommandBuilderFactory, - [NotNull] ISqlGenerationHelper sqlGenerationHelper, - [NotNull] IParameterNameGeneratorFactory parameterNameGeneratorFactory, - [NotNull] IRelationalTypeMapper relationalTypeMapper, - [NotNull] SelectExpression selectExpression) - : base( - relationalCommandBuilderFactory, - sqlGenerationHelper, - parameterNameGeneratorFactory, - relationalTypeMapper, - selectExpression) - { - } - - - protected override void GenerateTop([NotNull]SelectExpression selectExpression) - { - //Nothing to do - } - - protected override void GenerateLimitOffset([NotNull] SelectExpression selectExpression) - { - - ThrowIf.Argument.IsNull(selectExpression, "selectExpression"); - - if (selectExpression.Limit != null) - { - Sql.AppendLine().Append("LIMIT ").Append(selectExpression.Limit); - } - - } - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLDataReader.cs b/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLDataReader.cs deleted file mode 100644 index 75dc9a045..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLDataReader.cs +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySql.Data.MySqlClient; -using MySQL.Data.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Data.Common; -using System.Linq; -using System.Threading.Tasks; -using System.Collections; - -namespace MySql.Data.EntityFrameworkCore.Storage.Internal -{ - public class MySQLDataReader : DbDataReader - { - private MySqlDataReader _reader; - private bool _disposed; - - public MySQLDataReader(MySqlDataReader reader) - { - _reader = reader; - } - - public override T GetFieldValue(int ordinal) - { - if (typeof(T).Equals(typeof(DateTimeOffset))) - { - var dtValue = new DateTime(); - var result = DateTime.TryParse(_reader.GetValue(ordinal).ToString(), out dtValue); - DateTime datetime = result ? dtValue : DateTime.MinValue; - return (T)Convert.ChangeType(new DateTimeOffset(datetime), typeof(T)); - } - else - return base.GetFieldValue(ordinal); - } - - public override bool GetBoolean(int ordinal) => GetReader().GetBoolean(ordinal); - public override byte GetByte(int ordinal) => GetReader().GetByte(ordinal); - public override long GetBytes(int ordinal, long dataOffset, byte[] buffer, int bufferOffset, int length) => GetReader().GetBytes(ordinal, dataOffset, buffer, bufferOffset, length); - public override char GetChar(int ordinal) => GetReader().GetChar(ordinal); - public override long GetChars(int ordinal, long dataOffset, char[] buffer, int bufferOffset, int length) => GetReader().GetChars(ordinal, dataOffset, buffer, bufferOffset, length); - public override string GetDataTypeName(int ordinal) => GetReader().GetDataTypeName(ordinal); - public override DateTime GetDateTime(int ordinal) => GetReader().GetDateTime(ordinal); - public override decimal GetDecimal(int ordinal) => GetReader().GetDecimal(ordinal); - public override double GetDouble(int ordinal) => GetReader().GetDouble(ordinal); - public override Type GetFieldType(int ordinal) => GetReader().GetFieldType(ordinal); - public override float GetFloat(int ordinal) => GetReader().GetFloat(ordinal); - public override Guid GetGuid(int ordinal) => GetReader().GetGuid(ordinal); - public override short GetInt16(int ordinal) => GetReader().GetInt16(ordinal); - public override int GetInt32(int ordinal) => GetReader().GetInt32(ordinal); - public override long GetInt64(int ordinal) => GetReader().GetInt64(ordinal); - public override string GetName(int ordinal) => GetReader().GetName(ordinal); - public override int GetOrdinal(string name) => GetReader().GetOrdinal(name); - public override string GetString(int ordinal) => GetReader().GetString(ordinal); - public override object GetValue(int ordinal) => GetReader().GetValue(ordinal); - public override int GetValues(object[] values) => GetReader().GetValues(values); - public override bool IsDBNull(int ordinal) => GetReader().IsDBNull(ordinal); - public override int FieldCount => GetReader().FieldCount; - public override object this[int ordinal] => GetReader()[ordinal]; - public override object this[string name] => GetReader()[name]; - public override int RecordsAffected => GetReader().RecordsAffected; - public override bool HasRows => GetReader().HasRows; - public override bool IsClosed => _reader == null || _reader.IsClosed; - public override int Depth => GetReader().Depth; - public override IEnumerator GetEnumerator() => GetReader().GetEnumerator(); - public override Type GetProviderSpecificFieldType(int ordinal) => GetReader().GetProviderSpecificFieldType(ordinal); - public override object GetProviderSpecificValue(int ordinal) => GetReader().GetProviderSpecificValue(ordinal); - public override int GetProviderSpecificValues(object[] values) => GetReader().GetProviderSpecificValues(values); - public override int VisibleFieldCount => GetReader().VisibleFieldCount; - - - private MySqlDataReader GetReader() - { - if (_reader == null) - throw new ObjectDisposedException(nameof(MySQLDataReader)); - return _reader; - } - - public override bool NextResult() - { - return GetReader().NextResult(); - } - - public override bool Read() - { - return GetReader().Read(); - } - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLDatabaseCreator.cs b/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLDatabaseCreator.cs deleted file mode 100644 index de9d2d3a6..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLDatabaseCreator.cs +++ /dev/null @@ -1,178 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Migrations.Operations; -using Microsoft.EntityFrameworkCore.Storage; -using MySql.Data.MySqlClient; -using Microsoft.EntityFrameworkCore.Migrations; -using MySQL.Data.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.Internal; -using MySQL.Data.EntityFrameworkCore.Migrations.Operations; - -namespace MySQL.Data.EntityFrameworkCore -{ - /// - /// Relational Database creator implementation in MySQL - /// - public class MySQLDatabaseCreator : RelationalDatabaseCreator - { - private readonly MySQLServerConnection _connection; - private readonly IMigrationsSqlGenerator _sqlGenerator; - private readonly IRawSqlCommandBuilder _rawSqlCommandBuilder; - - - - public MySQLDatabaseCreator( - MySQLServerConnection cxn, - IMigrationsModelDiffer differ, - IMigrationsSqlGenerator generator, - IMigrationCommandExecutor migrationCommandExecutor, - IModel model, - IRawSqlCommandBuilder rawSqlCommandBuilder, - IExecutionStrategyFactory executionStrategyFactory) - : base(model, cxn, differ, generator, migrationCommandExecutor, executionStrategyFactory) - { - ThrowIf.Argument.IsNull(cxn, "connection"); - ThrowIf.Argument.IsNull(differ, "modelDiffer"); - ThrowIf.Argument.IsNull(generator, "generator"); - ThrowIf.Argument.IsNull(rawSqlCommandBuilder, "commandBuilder"); - - _connection = cxn; - _sqlGenerator = generator; - _rawSqlCommandBuilder = rawSqlCommandBuilder; - } - - public override void Create() - { - using (var workingConnection = _connection.CreateSystemConnection()) - { - MigrationCommandExecutor.ExecuteNonQuery(GetCreateOps(), workingConnection); - MySqlConnection.ClearPool((MySqlConnection)_connection.DbConnection); - } - - } - - public override async Task CreateAsync(CancellationToken cancellationToken = default(CancellationToken)) - { - using (var workingConnection = _connection.CreateSystemConnection()) - { - await MigrationCommandExecutor.ExecuteNonQueryAsync(GetCreateOps(), workingConnection, cancellationToken); - MySqlConnection.ClearPool((MySqlConnection)_connection.DbConnection); - } - } - - //public override void CreateTables() - //{ - // IReadOnlyList ops = modelDiffer.GetDifferences(null, Model); - // IReadOnlyList sqlBatches = sqlGenerator.Generate(ops, Model); - // SqlStatementExecutor.ExecuteNonQuery(connection, connection.DbTransaction, sqlBatches); - //} - - //public override async Task CreateTablesAsync(CancellationToken cancellationToken = default(CancellationToken)) - //{ - // IReadOnlyList ops = modelDiffer.GetDifferences(null, Model); - // IReadOnlyList sqlBatches = sqlGenerator.Generate(ops, Model); - // await SqlStatementExecutor.ExecuteNonQueryAsync(connection, connection.DbTransaction, sqlBatches, cancellationToken); - //} - - public override void Delete() - { - MySqlConnection.ClearAllPools(); - using (var workingConnecton = _connection.CreateSystemConnection()) - { - MigrationCommandExecutor.ExecuteNonQuery(GetDropOps(), workingConnecton); - } - } - - public override async Task DeleteAsync(CancellationToken cancellationToken = default(CancellationToken)) - { - MySqlConnection.ClearAllPools(); - using (var workingConnecton = _connection.CreateSystemConnection()) - { - await MigrationCommandExecutor.ExecuteNonQueryAsync(GetDropOps(), workingConnecton, cancellationToken); - } - } - - public override bool Exists() - { - try - { - _connection.Open(); - _connection.Close(); - return true; - } - catch (Exception ex) - { - MySqlException mex = ex as MySqlException; - if (mex == null) throw; - if (mex.Number == 1049) return false; - if (mex.InnerException == null) throw; - mex = mex.InnerException as MySqlException; - if (mex == null) throw; - if (mex.Number == 1049) return false; - throw; - } - } - - public override Task ExistsAsync(CancellationToken cancellationToken = default(CancellationToken)) - { - throw new NotImplementedException(); - } - - protected override bool HasTables() - { - string sql = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '" + _connection.DbConnection.Database + "'"; - long count = (long)_rawSqlCommandBuilder.Build(sql).ExecuteScalar(_connection); - return count != 0; - } - - protected override async Task HasTablesAsync(CancellationToken cancellationToken = default(CancellationToken)) - { - string sql = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = `" + _connection.DbConnection.Database + "`"; - long count = (long)await _rawSqlCommandBuilder.Build(sql).ExecuteScalarAsync(_connection, cancellationToken: cancellationToken); - return count != 0; - } - - private IReadOnlyList GetCreateOps() - { - var ops = new MigrationOperation[] - { - new MySQLCreateDatabaseOperation { Name = _connection.DbConnection.Database } - }; - return _sqlGenerator.Generate(ops); - } - - private IReadOnlyList GetDropOps() - { - var ops = new MigrationOperation[] - { - new MySQLDropDatabaseOperation { Name = _connection.DbConnection.Database } - }; - return _sqlGenerator.Generate(ops); - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLDatabaseProviderServices.cs b/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLDatabaseProviderServices.cs deleted file mode 100644 index 8c5757c71..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLDatabaseProviderServices.cs +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright � 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Reflection; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage; -using Microsoft.EntityFrameworkCore.Update; -using Microsoft.EntityFrameworkCore.ValueGeneration; -using MySQL.Data.EntityFrameworkCore.Migrations; -using MySQL.Data.EntityFrameworkCore.Update; -using MySQL.Data.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Query; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Query.ExpressionTranslators; -using MySQL.Data.EntityFrameworkCore.Query; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Query.Internal; -using Microsoft.EntityFrameworkCore.Query.Sql; -using MySql.Data.EntityFrameworkCore.Storage.Internal; -using MySQL.Data.EntityFrameworkCore.Migrations.Internal; -using MySql.Data.EntityFrameworkCore.Query.Internal; - -namespace MySQL.Data.EntityFrameworkCore -{ - /// - /// RelationalDatabaseProviderServices implementation for MySQL - /// - public class MySQLDatabaseProviderServices : RelationalDatabaseProviderServices - { - public MySQLDatabaseProviderServices(IServiceProvider serviceProvider) : base(serviceProvider) - { - } - - public override string InvariantName => GetType().GetTypeInfo().Assembly.GetName().Name; - public override IDatabaseCreator Creator => GetService(); - - public override IRelationalConnection RelationalConnection => GetService(); - - public override ISqlGenerationHelper SqlGenerationHelper => GetService(); - - public override IRelationalDatabaseCreator RelationalDatabaseCreator => GetService(); - - public override IMigrationsAnnotationProvider MigrationsAnnotationProvider => GetService(); - public override IHistoryRepository HistoryRepository => GetService(); - - public override IMigrationsSqlGenerator MigrationsSqlGenerator => GetService(); - - public override IModelSource ModelSource => GetService(); - public override IUpdateSqlGenerator UpdateSqlGenerator => GetService(); - - public override IValueGeneratorCache ValueGeneratorCache => GetService(); - - public override IRelationalTypeMapper TypeMapper => GetService(); - public override IModificationCommandBatchFactory ModificationCommandBatchFactory => GetService(); - public override IRelationalAnnotationProvider AnnotationProvider => GetService(); - public override IMethodCallTranslator CompositeMethodCallTranslator => GetService(); - public override IMemberTranslator CompositeMemberTranslator => GetService(); - public override IQueryCompilationContextFactory QueryCompilationContextFactory => GetService(); - public override IQuerySqlGeneratorFactory QuerySqlGeneratorFactory => GetService(); - - } -} \ No newline at end of file diff --git a/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLRelationalCommand.cs b/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLRelationalCommand.cs deleted file mode 100644 index 21b2d7109..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLRelationalCommand.cs +++ /dev/null @@ -1,173 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Internal; -using Microsoft.EntityFrameworkCore.Storage; -using Microsoft.EntityFrameworkCore.Storage.Internal; -using MySql.Data.MySqlClient; -using MySQL.Data.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Data; -using System.Data.Common; -using System.Diagnostics; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; - - -namespace MySql.Data.EntityFrameworkCore.Storage.Internal -{ - public class MySQLRelationalCommand : RelationalCommand - { - - public MySQLRelationalCommand([NotNull] ISensitiveDataLogger logger, - [NotNull] DiagnosticSource diagnosticSource, - [NotNull] string commandText, - [NotNull] IReadOnlyList parameters) - : base(logger, diagnosticSource, commandText, parameters) - { - } - - protected override object Execute(IRelationalConnection connection, string executeMethod, IReadOnlyDictionary parameterValues, bool closeConnection) - { - ThrowIf.Argument.IsNull(connection, nameof(connection)); - ThrowIf.Argument.IsNull(executeMethod, nameof(executeMethod)); - var dbCommand = CreateCommand(connection, parameterValues); - object result = null; - - if (connection.DbConnection.State != ConnectionState.Open) - { - connection.Open(); - } - - if (executeMethod.Equals(nameof(ExecuteReader))) - { - try - { - result = new MySQLRelationalDataReader(connection, dbCommand, new MySQLDataReader(((MySqlCommand)dbCommand).ExecuteReader() as MySqlDataReader)); - return result; - } - catch - { - dbCommand.Dispose(); - throw; - } - } - - return base.Execute(connection, executeMethod, parameterValues, closeConnection); - } - - protected override async Task ExecuteAsync(IRelationalConnection connection, string executeMethod, IReadOnlyDictionary parameterValues, bool closeConnection, CancellationToken cancellationToken = default(CancellationToken)) - { - - ThrowIf.Argument.IsNull(connection, nameof(connection)); - ThrowIf.Argument.IsNull(executeMethod, nameof(executeMethod)); - - var dbCommand = CreateCommand(connection, parameterValues); - object result = null; - - if (connection.DbConnection.State != ConnectionState.Open) - { - connection.Open(); - } - - if (executeMethod.Equals(nameof(ExecuteReader))) - { - try - { - result = new RelationalDataReader(connection, - dbCommand, - new MySQLDataReader(await ((MySqlCommand)dbCommand).ExecuteReaderAsync() as MySqlDataReader)); - return result; - } - catch - { - dbCommand.Dispose(); - throw; - } - } - - return await base.ExecuteAsync(connection, executeMethod, parameterValues, closeConnection, cancellationToken); - } - - - private DbCommand CreateCommand( - IRelationalConnection connection, - IReadOnlyDictionary parameterValues) - { - var command = connection.DbConnection.CreateCommand(); - ((MySqlCommand)command).InternallyCreated = true; - command.CommandText = CommandText; - - if (connection.CurrentTransaction != null) - { - command.Transaction = connection.CurrentTransaction.GetDbTransaction(); - } - - if (connection.CommandTimeout != null) - { - command.CommandTimeout = (int)connection.CommandTimeout; - } - - if (Parameters.Count > 0) - { - if (parameterValues == null) - { - throw new InvalidOperationException( - RelationalStrings.MissingParameterValue( - Parameters[0].InvariantName)); - } - - foreach (var parameter in Parameters) - { - object parameterValue; - - if (parameterValues.TryGetValue(parameter.InvariantName, out parameterValue)) - { - if (parameterValue != null && parameterValue.GetType().FullName.StartsWith("System.DateTimeOffset")) - { - DateTimeOffset dto = (DateTimeOffset)parameterValue; - DateTime dt = dto.DateTime; - - if (dt.Year < 1970) - dt = new DateTime(1970, 1, 1, 0, 0, 1); - parameter.AddDbParameter(command, dt); - } - else - { - parameter.AddDbParameter(command, parameterValue); - } - } - else - { - throw new InvalidOperationException( - RelationalStrings.MissingParameterValue(parameter.InvariantName)); - } - } - } - - return command; - } - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLRelationalDataReader.cs b/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLRelationalDataReader.cs deleted file mode 100644 index 0b8e82376..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLRelationalDataReader.cs +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore.Storage; -using System; -using System.Collections.Generic; -using System.Data.Common; -using System.Linq; -using System.Threading.Tasks; - -namespace MySql.Data.EntityFrameworkCore.Storage.Internal -{ - public class MySQLRelationalDataReader : RelationalDataReader - { - private DbDataReader _reader; - private DbCommand _command; - private bool _disposed; - - - public MySQLRelationalDataReader( - IRelationalConnection connection, - DbCommand command, - DbDataReader reader) : base(connection, command, reader) - { - _reader= reader; - _command = command; - } - - public override void Dispose() - { - if (!_disposed) - { - _reader.Dispose(); - _command.Dispose(); - _disposed = true; - } - - } - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLServerConnection.cs b/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLServerConnection.cs deleted file mode 100644 index 3a94216d1..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLServerConnection.cs +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Data.Common; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage; -using Microsoft.Extensions.Logging; -using MySql.Data.MySqlClient; -using Microsoft.EntityFrameworkCore; -using MySQL.Data.EntityFrameworkCore.Extensions; -using System.Reflection; - -namespace MySQL.Data.EntityFrameworkCore -{ - public class MySQLServerConnection : RelationalConnection - { - - private string _cnnStr - { - get - { - if (this.DbConnection != null) - { - var cstr = ((MySqlConnectionStringBuilder)((MySqlConnection)this.DbConnection).GetType().GetProperty("Settings", System.Reflection.BindingFlags.Instance - | System.Reflection.BindingFlags.NonPublic).GetValue(((MySqlConnection)this.DbConnection), null)); - return cstr.ConnectionString; - } - return null; - } - } - - - public MySQLServerConnection( - [NotNull]IDbContextOptions options, - [NotNull]ILogger logger) - : base(options, logger) - { - } - - public MySQLServerConnection( - [NotNull]IDbContextOptions options, - [NotNull]ILogger logger) - : base(options, logger) - { - } - - protected override DbConnection CreateDbConnection() - { - return new MySqlConnection(ConnectionString); - } - - - public MySQLServerConnection CreateSystemConnection() - { - MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder(_cnnStr ?? ConnectionString); - builder.Database = "mysql"; - - var optionsBuilder = new DbContextOptionsBuilder(); - optionsBuilder.UseMySQL(builder.ConnectionString); - - MySQLServerConnection c = new MySQLServerConnection(optionsBuilder.Options, Logger); - return c; - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLSizeableMapping.cs b/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLSizeableMapping.cs deleted file mode 100644 index 7b234dae0..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLSizeableMapping.cs +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright © 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore.Storage; -using MySQL.Data.EntityFrameworkCore; -using System; -using System.Data; - -namespace MySql.Data.EntityFrameworkCore.Storage.Internal -{ - public class MySQLSizeableMapping : RelationalTypeMapping - { - - public MySQLSizeableMapping([NotNull] string storeType, - [NotNull] Type clrType, - DbType? dbType, - bool unicode, - int? size, - bool hasNonDefaultUnicode = false, - bool hasNonDefaultSize = false) - : base(storeType, clrType, dbType, unicode, GetSizeForString(unicode, size), hasNonDefaultUnicode, hasNonDefaultSize) - - { - } - - private static int GetSizeForString(bool unicode, int? size) - { - int _textMaxLength; - int _medTextMaxLength; - int _longTextMaxLength; - - //max lenght for text types considering 3-bytes character sets. - //_textMaxLength = ((int)Math.Pow(2, 16) - 1) / 3; - //_medTextMaxLength = ((int)Math.Pow(2, 24) - 1) / 3; - //_longTextMaxLength = ((int)Math.Pow(2, 32) - 1) / 3; - - _medTextMaxLength = 255; // 65535 / 4; // ((int)Math.Pow(2, 24) - 1) / 3; - _longTextMaxLength = 255; //65535 / 3; //((int)Math.Pow(2, 32) - 1) / 3; - _textMaxLength = 255; //65535; // ((int)Math.Pow(2, 16) - 1) / 3; - - if (unicode) - { - //_textMaxLength = ((int)Math.Pow(2, 16) - 1) / 4; - //_medTextMaxLength = ((int)Math.Pow(2, 24) - 1) / 4; - //_longTextMaxLength = ((int)Math.Pow(2, 32) - 1) / 4; - - _medTextMaxLength = 255; //65535 / 4; // ((int)Math.Pow(2, 24) - 1) / 3; - _longTextMaxLength = 255; // 65535 / 3; //((int)Math.Pow(2, 32) - 1) / 3; - _textMaxLength = 255; //65535; // ((int)Math.Pow(2, 16) - 1) / 3; - } - - if (size.HasValue) - { - if (size > _medTextMaxLength) - return _longTextMaxLength; - else - return size.Value < _textMaxLength ? size.Value : _medTextMaxLength; - } - - return _textMaxLength; - } - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLSqlGenerationHelper.cs b/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLSqlGenerationHelper.cs deleted file mode 100644 index cba3e1f80..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLSqlGenerationHelper.cs +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Text; -using Microsoft.EntityFrameworkCore.Storage; -using System.Globalization; - -namespace MySQL.Data.EntityFrameworkCore -{ - public class MySQLSqlGenerationHelper : RelationalSqlGenerationHelper - { - - private const string DateTimeFormatConst = "yyyy-MM-ddTHH:mm:ss.fffK"; - private const string DateTimeFormatStringConst = "'{0:" + DateTimeFormatConst + "}'"; - private const string DateTimeOffsetFormatConst = "yyyy-MM-ddTHH:mm:ss"; - private const string DateTimeOffsetFormatStringConst = "'{0:" + DateTimeOffsetFormatConst + "}'"; - - protected override string DateTimeFormat => DateTimeFormatConst; - protected override string DateTimeFormatString => DateTimeFormatStringConst; - protected override string DateTimeOffsetFormat => DateTimeOffsetFormatConst; - protected override string DateTimeOffsetFormatString => DateTimeOffsetFormatStringConst; - - - public override void DelimitIdentifier(StringBuilder builder, string identifier) - { - ThrowIf.Argument.IsEmpty(identifier, "identifier"); - builder.Append('`'); - EscapeIdentifier(builder, identifier); - builder.Append('`'); - } - - - public override string DelimitIdentifier([NotNull] string identifier) - { - ThrowIf.Argument.IsEmpty(identifier, "identifier"); - return "`" + identifier + "`"; - } - - - protected override string GenerateLiteralValue(DateTime value) - { - return $"'{value.ToString(DateTimeFormat, CultureInfo.InvariantCulture)}'"; - } - - - protected override string GenerateLiteralValue(DateTimeOffset value) - { - return $"'{value.ToString(DateTimeOffsetFormat, CultureInfo.InvariantCulture)}'"; - } - - //public override string GenerateLiteralValue(DateTime value) - // => $"'{value.ToString(DateTimeFormat, CultureInfo.InvariantCulture)}'"; // Interpolation okay; strings - - - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLTypeMapper.cs b/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLTypeMapper.cs deleted file mode 100644 index 238bb4905..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLTypeMapper.cs +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Data; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Storage; -using MySQL.Data.EntityFrameworkCore; - -namespace MySql.Data.EntityFrameworkCore.Storage.Internal -{ - public class MySQLTypeMapper : RelationalTypeMapper - { - private static int _medTextMaxLength = 255; /// 4; // ((int)Math.Pow(2, 24) - 1) / 3; - private static int _longTextMaxLength = 255; //65535 / 3; //((int)Math.Pow(2, 32) - 1) / 3; - private static int _textMaxLength = 255; //65535; // ((int)Math.Pow(2, 16) - 1) / 3; - - private readonly RelationalTypeMapping _int = new RelationalTypeMapping("int", typeof(Int32)); - private readonly RelationalTypeMapping _bigint = new RelationalTypeMapping("bigint", typeof(Int64)); - private readonly RelationalTypeMapping _bit = new RelationalTypeMapping("bit", typeof(SByte)); - private readonly RelationalTypeMapping _smallint = new RelationalTypeMapping("smallint", typeof(Int16)); - private readonly RelationalTypeMapping _tinyint = new RelationalTypeMapping("tinyint", typeof(Byte)); - private readonly RelationalTypeMapping _char = new RelationalTypeMapping("char", typeof(Byte)); - - private readonly MySQLSizeableMapping _varcharmax - = new MySQLSizeableMapping("varchar("+ _longTextMaxLength.ToString() +")", typeof(string), dbType: null, unicode: false, size: _longTextMaxLength); - - private readonly MySQLSizeableMapping _varcharmed - = new MySQLSizeableMapping("varchar(" + _medTextMaxLength.ToString() + ")", typeof(string), dbType: null, unicode: false, size: _medTextMaxLength); - - private readonly RelationalTypeMapping _varchar = new MySQLSizeableMapping("varchar(" + _textMaxLength + ")", typeof(string), dbType: null, unicode: false, size: _textMaxLength, hasNonDefaultUnicode: true); - - private readonly MySQLSizeableMapping _nvarcharmax - = new MySQLSizeableMapping("varchar(" + _longTextMaxLength.ToString() + ")", typeof(string), dbType: null, unicode: true, size: _longTextMaxLength); - - private readonly MySQLSizeableMapping _nvarcharmed - = new MySQLSizeableMapping("varchar(" + _medTextMaxLength.ToString() + ")", typeof(string), dbType: null, unicode: true, size: _medTextMaxLength); - - private readonly MySQLSizeableMapping _varbinarymax - = new MySQLSizeableMapping("varbinary(" + _longTextMaxLength.ToString() + ")", typeof(byte[]), dbType: DbType.Binary, unicode: false, size: _longTextMaxLength); - - private readonly MySQLSizeableMapping _varbinarymed - = new MySQLSizeableMapping("varbinary(" + _medTextMaxLength.ToString() + ")", typeof(byte[]), dbType: DbType.Binary, unicode: false, size: _medTextMaxLength); - - private readonly RelationalTypeMapping _rowversion = new RelationalTypeMapping("timestamp", typeof(DateTime), dbType: DbType.DateTime); - - private readonly RelationalTypeMapping _longText = new RelationalTypeMapping("longtext", typeof(string)); - private readonly RelationalTypeMapping _mediumText = new RelationalTypeMapping("mediumtext", typeof(string)); - private readonly RelationalTypeMapping _Text = new RelationalTypeMapping("text", typeof(string)); - private readonly RelationalTypeMapping _tinyText = new RelationalTypeMapping("tinytext", typeof(string)); - - private readonly RelationalTypeMapping _datetime = new RelationalTypeMapping("datetime", typeof(DateTime)); - private readonly RelationalTypeMapping _datetimeoffset = new RelationalTypeMapping("timestamp", typeof(DateTimeOffset), DbType.DateTime); - private readonly RelationalTypeMapping _date = new RelationalTypeMapping("date", typeof(DateTime)); - private readonly RelationalTypeMapping _time = new RelationalTypeMapping("time", typeof(DateTime)); - private readonly RelationalTypeMapping _double = new RelationalTypeMapping("float", typeof(Single)); - private readonly RelationalTypeMapping _real = new RelationalTypeMapping("real", typeof(Single)); - private readonly RelationalTypeMapping _decimal = new RelationalTypeMapping("decimal(18, 2)", typeof(Decimal)); - - - private readonly RelationalTypeMapping _varbinary = new RelationalTypeMapping("blob", typeof(byte[])); - - - private readonly Dictionary _storeTypeMappings; - private readonly Dictionary _clrTypeMappings; - public override IStringRelationalTypeMapper StringMapper { get; } - public override IByteArrayRelationalTypeMapper ByteArrayMapper { get; } - - public MySQLTypeMapper() - { - _storeTypeMappings = new Dictionary(StringComparer.OrdinalIgnoreCase) - { - {"bigint", _bigint}, - { "decimal", _decimal }, - { "double", _double }, - { "float", _double }, - {"int", _int}, - { "mediumint", _int }, - { "real", _real }, - { "smallint", _smallint }, - { "tinyint", _tinyint }, - { "char", _char }, - { "varchar", _varchar}, - { "longtext", _longText}, - { "mediumtext", _mediumText}, - { "text", _Text}, - { "tinytext", _tinyText}, - { "datetime", _datetime }, - { "datetimeoffset", _datetimeoffset }, - { "timestamp", _datetime }, - { "bit", _bit }, - { "string", _varchar }, - { "blob", _varbinary } - }; - - _clrTypeMappings - = new Dictionary - { - { typeof(int), _int }, - { typeof(long), _bigint }, - { typeof(DateTime), _datetime }, - { typeof(DateTimeOffset), _datetimeoffset }, - { typeof(bool), _bit }, - { typeof(byte), _tinyint }, - { typeof(double), _double }, - { typeof(char), _int }, - { typeof(sbyte), new RelationalTypeMapping("smallint", _smallint.GetType()) }, - { typeof(ushort), new RelationalTypeMapping("int", _int.GetType()) }, - { typeof(uint), new RelationalTypeMapping("bigint", _bigint.GetType()) }, - { typeof(ulong), new RelationalTypeMapping("numeric(20, 0)" ,_decimal.GetType()) }, - { typeof(short), _smallint }, - { typeof(float), _real }, - { typeof(decimal), _decimal }, - { typeof(string), _varchar }, - { typeof(byte[]), _varbinary } - }; - - - StringMapper - = new StringRelationalTypeMapper( - _longTextMaxLength, - _varcharmax, - _varcharmax, - _varcharmed, - size => new MySQLSizeableMapping( - "varchar(" + size + ")", - typeof(string), - dbType: DbType.AnsiString, - unicode: false, - size: size, - hasNonDefaultUnicode: true, - hasNonDefaultSize: true), - _medTextMaxLength, - _nvarcharmax, - _nvarcharmax, - _nvarcharmed, - size => new MySQLSizeableMapping( - "nvarchar(" + size + ")", - typeof(string), - dbType: null, - unicode: true, - size: size, - hasNonDefaultUnicode: false, - hasNonDefaultSize: true)); - - - - ByteArrayMapper - = new ByteArrayRelationalTypeMapper( - _longTextMaxLength, - _varbinarymax, - _varbinarymax, - _varbinarymed, - _rowversion, size => new MySQLSizeableMapping( - "Timestamp", - typeof(DateTime), - DbType.DateTime, - unicode: false, - size: size, - hasNonDefaultUnicode: false, - hasNonDefaultSize: true)); - - } - - protected override IReadOnlyDictionary GetClrTypeMappings() - => _clrTypeMappings; - - protected override IReadOnlyDictionary GetStoreTypeMappings() - => _storeTypeMappings; - - - protected override string GetColumnType(IProperty property) - { - return property.MySQL().ColumnType; - } - - - public override RelationalTypeMapping FindMapping(Type clrType) - { - ThrowIf.Argument.IsNull(clrType, "clrType"); - var sType = Nullable.GetUnderlyingType(clrType) ?? clrType; - return sType == typeof(string) - ? _nvarcharmax - : (sType == typeof(byte[]) - ? _varbinarymax - : base.FindMapping(clrType)); - } - - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLTypedRelationalValueBufferFactory.cs b/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLTypedRelationalValueBufferFactory.cs deleted file mode 100644 index 21d936db8..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySQLTypedRelationalValueBufferFactory.cs +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore.Storage.Internal; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using JetBrains.Annotations; -using System.Data.Common; -using MySQL.Data.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Storage; - -namespace MySql.Data.EntityFrameworkCore.Storage.Internal -{ - public class MySQLTypedRelationalValueBufferFactory : TypedRelationalValueBufferFactory - { - public MySQLTypedRelationalValueBufferFactory([NotNull] Func valueFactory) : base(valueFactory) - { - } - - public override ValueBuffer Create(DbDataReader dataReader) - { - //create our datareader - MySQLDataReader mydatareader = (MySQLDataReader)dataReader; - return base.Create(mydatareader); - } - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySqlCommandBuilder.cs b/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySqlCommandBuilder.cs deleted file mode 100644 index 0348ed4ec..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySqlCommandBuilder.cs +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Internal; -using Microsoft.EntityFrameworkCore.Storage; -using Microsoft.EntityFrameworkCore.Storage.Internal; -using MySQL.Data.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Threading.Tasks; - -namespace MySql.Data.EntityFrameworkCore.Storage.Internal -{ - public class MySQLCommandBuilder : RelationalCommandBuilder, IInfrastructure - { - - private readonly ISensitiveDataLogger _logger; - private readonly DiagnosticSource _diagnosticSource; - private readonly IndentedStringBuilder _commandTextBuilder = new IndentedStringBuilder(); - - public MySQLCommandBuilder([NotNull] ISensitiveDataLogger logger, - [NotNull] DiagnosticSource diagnosticSource, - [NotNull] IRelationalTypeMapper typeMapper) : base(logger, diagnosticSource, typeMapper) - { - _logger = logger; - _diagnosticSource = diagnosticSource; - ParameterBuilder = new RelationalParameterBuilder(typeMapper); - } - - public override IRelationalParameterBuilder ParameterBuilder { get; } - - IndentedStringBuilder IInfrastructure.Instance - => _commandTextBuilder; - - - /// - /// This API supports the Entity Framework Core infrastructure and is not intended to be used - /// directly from your code. This API may change or be removed in future releases. - /// - public override IRelationalCommand Build() - => new MySQLRelationalCommand( - _logger, - _diagnosticSource, - _commandTextBuilder.ToString(), - ParameterBuilder.Parameters); - - /// - /// This API supports the Entity Framework Core infrastructure and is not intended to be used - /// directly from your code. This API may change or be removed in future releases. - /// - public override string ToString() => _commandTextBuilder.ToString(); - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySqlCommandBuilderFactory.cs b/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySqlCommandBuilderFactory.cs deleted file mode 100644 index 7f512bcf0..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Storage/Internal/MySqlCommandBuilderFactory.cs +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage; -using Microsoft.EntityFrameworkCore.Storage.Internal; -using MySQL.Data.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Threading.Tasks; - -namespace MySql.Data.EntityFrameworkCore.Storage.Internal -{ - public class MySQLCommandBuilderFactory : RelationalCommandBuilderFactory - { - private readonly ISensitiveDataLogger _logger; - private readonly DiagnosticSource _diagnosticSource; - private readonly IRelationalTypeMapper _typeMapper; - - public MySQLCommandBuilderFactory( - [NotNull] ISensitiveDataLogger logger, - [NotNull] DiagnosticSource diagnosticSource, - [NotNull] IRelationalTypeMapper typeMapper) - : base(logger, diagnosticSource, typeMapper) - { - _logger = logger; - _diagnosticSource = diagnosticSource; - _typeMapper = typeMapper; - } - - public override IRelationalCommandBuilder Create() - { - return new MySQLCommandBuilder( - _logger, - _diagnosticSource, - _typeMapper); - } - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Update/MySQLModificationCommandBatch.cs b/Source/MySql.Data.EntityFrameworkCore/Update/MySQLModificationCommandBatch.cs deleted file mode 100644 index c343038da..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Update/MySQLModificationCommandBatch.cs +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore.Update; -using Microsoft.EntityFrameworkCore.Storage; - -namespace MySQL.Data.EntityFrameworkCore.Update -{ - /// - /// AffectedCountModificationCommandBatch implementation for MySQL - /// - public class MySQLModificationCommandBatch : AffectedCountModificationCommandBatch - { - public MySQLModificationCommandBatch( - [NotNull] IRelationalCommandBuilderFactory commandBuilderFactory, - [NotNull] ISqlGenerationHelper sqlGenerator, - [NotNull] MySQLUpdateSqlGenerator updateSqlGenerator, - [NotNull] IRelationalValueBufferFactoryFactory valueBufferFactoryFactory, - [CanBeNull] int? maxBatchSize) - : base(commandBuilderFactory, sqlGenerator, updateSqlGenerator, valueBufferFactoryFactory) - { - } - - protected override bool CanAddCommand(ModificationCommand modificationCommand) - { - // TODO: check this - return true; - } - - protected override string GetCommandText() - { - return base.GetCommandText(); - } - - protected override bool IsCommandTextValid() - { - string s = GetCommandText(); - return true; - } - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Update/MySQLModificationCommandBatchFactory.cs b/Source/MySql.Data.EntityFrameworkCore/Update/MySQLModificationCommandBatchFactory.cs deleted file mode 100644 index fbc1ff8e6..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Update/MySQLModificationCommandBatchFactory.cs +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage; -using Microsoft.EntityFrameworkCore.Update; -using MySQL.Data.EntityFrameworkCore.Infraestructure.Internal; -using System.Linq; - -namespace MySQL.Data.EntityFrameworkCore.Update -{ - /// - /// IModificationCommandBatchFactory implemntation for MySQL - /// - public class MySQLModificationCommandBatchFactory : IModificationCommandBatchFactory - { - private readonly IRelationalCommandBuilderFactory _commandBuilderFactory; - private readonly ISqlGenerationHelper _sqlGenerator; - private readonly MySQLUpdateSqlGenerator _updateSqlGenerator; - private readonly IRelationalValueBufferFactoryFactory _valueBufferFactoryFactory; - private readonly IDbContextOptions _options; - - public MySQLModificationCommandBatchFactory( - [NotNull] IRelationalCommandBuilderFactory commandBuilderFactory, - [NotNull] ISqlGenerationHelper sqlGenerator, - [NotNull] MySQLUpdateSqlGenerator updateSqlGenerator, - [NotNull] IRelationalValueBufferFactoryFactory valueBufferFactoryFactory, - [NotNull] IDbContextOptions options) - { - ThrowIf.Argument.IsNull(commandBuilderFactory, "commandBuilderFactory"); - ThrowIf.Argument.IsNull(updateSqlGenerator, "updateSqlGenerator"); - ThrowIf.Argument.IsNull(valueBufferFactoryFactory, "valueBufferFactoryFactory"); - ThrowIf.Argument.IsNull(options, "options"); - - _commandBuilderFactory = commandBuilderFactory; - _sqlGenerator = sqlGenerator; - _updateSqlGenerator = updateSqlGenerator; - _valueBufferFactoryFactory = valueBufferFactoryFactory; - _options = options; - } - - public virtual ModificationCommandBatch Create() - { - var optionsExtension = _options.Extensions.OfType().FirstOrDefault(); - - return new MySQLModificationCommandBatch( - _commandBuilderFactory, - _sqlGenerator, - _updateSqlGenerator, - _valueBufferFactoryFactory, - optionsExtension?.MaxBatchSize); - } - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Update/MySQLUpdateSqlGenerator.cs b/Source/MySql.Data.EntityFrameworkCore/Update/MySQLUpdateSqlGenerator.cs deleted file mode 100644 index 5a8daa3a5..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Update/MySQLUpdateSqlGenerator.cs +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Text; -using Microsoft.EntityFrameworkCore.Update; -using Microsoft.EntityFrameworkCore.Storage; - -namespace MySQL.Data.EntityFrameworkCore -{ - public class MySQLUpdateSqlGenerator : UpdateSqlGenerator - { - - public MySQLUpdateSqlGenerator([NotNull] ISqlGenerationHelper sqlGenerationHelper) - : base(sqlGenerationHelper) - { - } - - protected override void AppendIdentityWhereCondition(StringBuilder commandStringBuilder, ColumnModification columnModification) - { - ThrowIf.Argument.IsNull(columnModification, "columnModification"); - ThrowIf.Argument.IsNull(commandStringBuilder, "commandStringBuilder"); - commandStringBuilder.AppendFormat("{0}=LAST_INSERT_ID()", SqlGenerationHelper.DelimitIdentifier(columnModification.ColumnName)); - } - - - protected override void AppendRowsAffectedWhereCondition(StringBuilder commandStringBuilder, int expectedRowsAffected) - { - ThrowIf.Argument.IsNull(commandStringBuilder, "commandStringBuilder"); - commandStringBuilder - .Append("ROW_COUNT() = " + expectedRowsAffected) - .AppendLine(); - } - - protected override ResultSetMapping AppendSelectAffectedCountCommand(StringBuilder commandStringBuilder, string name, string schemaName, int commandPosition) - { - ThrowIf.Argument.IsNull(commandStringBuilder, "commandStringBuilder"); - ThrowIf.Argument.IsEmpty(name, "name"); - - - commandStringBuilder - .Append("SELECT ROW_COUNT()") - .Append(SqlGenerationHelper.StatementTerminator) - .AppendLine(); - - return ResultSetMapping.LastInResultSet; - } - - public enum ResultsGrouping - { - OneResultSet, - OneCommandPerResultSet - } - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Utils/CodeAttributes.cs b/Source/MySql.Data.EntityFrameworkCore/Utils/CodeAttributes.cs deleted file mode 100644 index f2988d77a..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Utils/CodeAttributes.cs +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; - -namespace MySQL.Data.EntityFrameworkCore -{ - [AttributeUsage(AttributeTargets.All)] - internal sealed class NotNullAttribute : Attribute - { - } - - [AttributeUsage(AttributeTargets.All)] - internal sealed class CanBeNullAttribute : Attribute - { - - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Utils/SharedTypeExtensions.cs b/Source/MySql.Data.EntityFrameworkCore/Utils/SharedTypeExtensions.cs deleted file mode 100644 index 0ef63be68..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Utils/SharedTypeExtensions.cs +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Diagnostics; -using System.Reflection; - -namespace MySQL.Data.EntityFrameworkCore.Utils -{ - [DebuggerStepThrough] - internal static class SharedTypeExtensions - { - public static Type UnwrapNullableType(this Type type) => Nullable.GetUnderlyingType(type) ?? type; - - public static bool IsNullableType(this Type type) - { - var typeInfo = type.GetTypeInfo(); - - return !typeInfo.IsValueType - || (typeInfo.IsGenericType - && typeInfo.GetGenericTypeDefinition() == typeof(Nullable<>)); - } - - public static bool IsInteger(this Type type) - { - type = type.UnwrapNullableType(); - - return type == typeof(int) - || type == typeof(long) - || type == typeof(short) - || type == typeof(byte) - || type == typeof(uint) - || type == typeof(ulong) - || type == typeof(ushort) - || type == typeof(sbyte) - || type == typeof(char); - } - - public static bool CanBeAutoIncrement(this Type type) - { - return IsInteger(type) - || type == typeof(float) - || type == typeof(double); - } - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/Utils/ThrowIf.cs b/Source/MySql.Data.EntityFrameworkCore/Utils/ThrowIf.cs deleted file mode 100644 index 7a27393a3..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/Utils/ThrowIf.cs +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MySQL.Data.EntityFrameworkCore -{ - internal static class ThrowIf - { - public static class Argument - { - public static void IsNull(object argument, string argumentName) - { - if (argument == null) - { - throw new ArgumentNullException(argumentName); - } - } - - public static void IsEmpty(string argument, string argumentName) - { - if (argument == null) - throw new ArgumentNullException(argumentName); - if (argument.Trim().Length == 0) - throw new ArgumentException(String.Format("{0} cannot be empty", argumentName)); - } - } - } -} diff --git a/Source/MySql.Data.EntityFrameworkCore/ValueGeneration/MySQLValueGeneratorCache.cs b/Source/MySql.Data.EntityFrameworkCore/ValueGeneration/MySQLValueGeneratorCache.cs deleted file mode 100644 index 2c60a64b2..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/ValueGeneration/MySQLValueGeneratorCache.cs +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore.ValueGeneration; - -namespace MySQL.Data.EntityFrameworkCore -{ - public class MySQLValueGeneratorCache : ValueGeneratorCache - { - } -} \ No newline at end of file diff --git a/Source/MySql.Data.EntityFrameworkCore/project.json b/Source/MySql.Data.EntityFrameworkCore/project.json deleted file mode 100644 index 6df61c987..000000000 --- a/Source/MySql.Data.EntityFrameworkCore/project.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "version": "7.0.7-m6", - "description": "MySql.Data.EntityFrameworkCore for Entity Framework.", - "authors": [ "Oracle" ], - "copyright": "Copyright © 2016, 2017, Oracle and/or its affiliates. All rights reserved.", - "language": "en-US", - "packOptions": { - "projectUrl": "http://dev.mysql.com/downloads/", - "licenseUrl": "http://www.gnu.org/licenses/old-licenses/gpl-2.0.html", - "iconUrl": "http://www.mysql.com/common/logos/logo-mysql-170x115.png", - "tags": [ "MySql", ".NET Connector", "MySql Entity Framework Core", "netcore", ".Net Core", "MySql Conector/Net Entity Framework Core", "coreclr", "C/NET", "C/Net Core" ], - "files": { - "includeFiles": [ - "Content/ReleaseNotes.txt" - ], - "include": [ - "../../README" - ] - }, - "releaseNotes": "Review ReleaseNotes.txt for details.", - "requireLicenseAcceptance": true - }, - "buildOptions": { - "warningsAsErrors": false, - "keyFile": "../../ConnectorNetPublicKey.snk", - "delaySign": true, - "publicSign": false, - "nowarn": ["CS1591"] - }, - "dependencies": { - "MySql.Data": { - "target": "project" - }, - "NETStandard.Library": "1.6.1", - "Remotion.Linq": "2.2.0-alpha-001", - "System.Collections.Immutable": "1.3.0", - "Microsoft.EntityFrameworkCore": "1.1.0", - "Microsoft.EntityFrameworkCore.Relational": "1.1.0", - "Microsoft.Extensions.Caching.Memory": "1.1.0", - "Microsoft.Extensions.DependencyInjection": "1.1.0", - "Microsoft.Extensions.Logging": "1.1.0", - "System.Interactive.Async": "3.1.1" - }, - "frameworks": { - "net451": { - "frameworkAssemblies": { - "System.ComponentModel.DataAnnotations": "", - "System.Runtime": { - "type": "build" - } - } - }, - "netstandard1.6": { - "dependencies": {} - } - }, - "configurations": { - "Debug": { - "buildOptions": { - "define": [ "DEBUG" ], - "optimize": false, - "preserveCompilationContext": true - } - }, - "Release": { - "buildOptions": { - "define": [ "RELEASE" ], - "optimize": true, - "preserveCompilationContext": true, - "xmlDoc": true - } - } - } -} - diff --git a/Source/MySql.Data/.vscode/launch.json b/Source/MySql.Data/.vscode/launch.json deleted file mode 100644 index 2a54b49e2..000000000 --- a/Source/MySql.Data/.vscode/launch.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "name": ".NET Core Launch (console)", - "type": "coreclr", - "request": "launch", - "preLaunchTask": "build", - "program": "${workspaceRoot}/bin/Debug//", - "args": [], - "cwd": "${workspaceRoot}", - "externalConsole": false, - "stopAtEntry": false - }, - { - "name": ".NET Core Attach", - "type": "coreclr", - "request": "attach", - "processId": 0 - } - ] -} \ No newline at end of file diff --git a/Source/MySql.Data/.vscode/tasks.json b/Source/MySql.Data/.vscode/tasks.json deleted file mode 100644 index 24e89ccd3..000000000 --- a/Source/MySql.Data/.vscode/tasks.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "version": "0.1.0", - "command": "dotnet", - "isShellCommand": true, - "args": [], - "tasks": [ - { - "taskName": "build", - "args": [ ], - "isBuildCommand": true, - "problemMatcher": "$msCompile" - } - ] -} diff --git a/Source/MySql.Data/Authentication/AuthenticationManager.cs b/Source/MySql.Data/Authentication/AuthenticationManager.cs deleted file mode 100644 index 8fc13b4b5..000000000 --- a/Source/MySql.Data/Authentication/AuthenticationManager.cs +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright © 2012, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Reflection; -using MySql.Data.MySqlClient; - - -namespace MySql.Data.MySqlClient.Authentication -{ - internal partial class AuthenticationPluginManager - { - private static readonly Dictionary Plugins = new Dictionary(); - - static partial void AuthenticationManagerCtorConfiguration(); - - static AuthenticationPluginManager() - { - Plugins["mysql_native_password"] = new PluginInfo("MySql.Data.MySqlClient.Authentication.MySqlNativePasswordPlugin"); - Plugins["sha256_password"] = new PluginInfo("MySql.Data.MySqlClient.Authentication.Sha256AuthenticationPlugin"); - - AuthenticationManagerCtorConfiguration(); - } - - public static MySqlAuthenticationPlugin GetPlugin(string method) - { - if (!Plugins.ContainsKey(method)) - throw new MySqlException(String.Format(Resources.AuthenticationMethodNotSupported, method)); - return CreatePlugin(method); - } - - private static MySqlAuthenticationPlugin CreatePlugin(string method) - { - PluginInfo pi = Plugins[method]; - - try - { - Type t = Type.GetType(pi.Type); - MySqlAuthenticationPlugin o = (MySqlAuthenticationPlugin)Activator.CreateInstance(t); - return o; - } - catch (Exception e) - { - throw new MySqlException(String.Format(Resources.UnableToCreateAuthPlugin, method), e); - } - } - } - - struct PluginInfo - { - public string Type; - public Assembly Assembly; - - public PluginInfo(string type) - { - Type = type; - Assembly = null; - } - } -} diff --git a/Source/MySql.Data/Authentication/MySQLAuthenticationPlugin.cs b/Source/MySql.Data/Authentication/MySQLAuthenticationPlugin.cs deleted file mode 100644 index 631464296..000000000 --- a/Source/MySql.Data/Authentication/MySQLAuthenticationPlugin.cs +++ /dev/null @@ -1,218 +0,0 @@ -// Copyright © 2012, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Diagnostics; -using System.Text; -using MySql.Data.MySqlClient; - - -namespace MySql.Data.MySqlClient.Authentication -{ - public abstract class MySqlAuthenticationPlugin - { - private NativeDriver _driver; - protected byte[] AuthenticationData; - - /// - /// This is a factory method that is used only internally. It creates an auth plugin based on the method type - /// - /// - /// - /// - /// - internal static MySqlAuthenticationPlugin GetPlugin(string method, NativeDriver driver, byte[] authData) - { - if (method == "mysql_old_password") - { - driver.Close(true); - throw new MySqlException(Resources.OldPasswordsNotSupported); - } - MySqlAuthenticationPlugin plugin = AuthenticationPluginManager.GetPlugin(method); - if (plugin == null) - throw new MySqlException(String.Format(Resources.UnknownAuthenticationMethod, method)); - - plugin._driver = driver; - plugin.SetAuthData(authData); - return plugin; - } - - protected MySqlConnectionStringBuilder Settings => _driver.Settings; - - protected Version ServerVersion => new Version(_driver.Version.Major, _driver.Version.Minor, _driver.Version.Build); - - internal ClientFlags Flags => _driver.Flags; - - protected Encoding Encoding => _driver.Encoding; - - protected virtual void SetAuthData(byte[] data) - { - AuthenticationData = data; - } - - protected virtual void CheckConstraints() - { - } - - protected virtual void AuthenticationFailed(Exception ex) - { - string msg = String.Format(Resources.AuthenticationFailed, Settings.Server, GetUsername(), PluginName, ex.Message); - throw new MySqlException(msg, ex); - } - - protected virtual void AuthenticationSuccessful() - { - } - - protected virtual byte[] MoreData(byte[] data) - { - return null; - } - - internal void Authenticate(bool reset) - { - CheckConstraints(); - - MySqlPacket packet = _driver.Packet; - - // send auth response - packet.WriteString(GetUsername()); - - // now write the password - WritePassword(packet); - - if ((Flags & ClientFlags.CONNECT_WITH_DB) != 0 || reset) - { - if (!String.IsNullOrEmpty(Settings.Database)) - packet.WriteString(Settings.Database); - } - - if (reset) - packet.WriteInteger(8, 2); - - if ((Flags & ClientFlags.PLUGIN_AUTH) != 0) - packet.WriteString(PluginName); - - _driver.SetConnectAttrs(); - _driver.SendPacket(packet); - //read server response - packet = ReadPacket(); - byte[] b = packet.Buffer; - if (b[0] == 0xfe) - { - if (packet.IsLastPacket) - { - _driver.Close(true); - throw new MySqlException( Resources.OldPasswordsNotSupported ); - } - else - { - HandleAuthChange(packet); - } - } - _driver.ReadOk(false); - AuthenticationSuccessful(); - } - - private void WritePassword(MySqlPacket packet) - { - bool secure = (Flags & ClientFlags.SECURE_CONNECTION) != 0; - object password = GetPassword(); - if (password is string) - { - if (secure) - packet.WriteLenString((string)password); - else - packet.WriteString((string)password); - } - else if (password == null) - packet.WriteByte(0); - else if (password is byte[]) - packet.Write(password as byte[]); - else throw new MySqlException("Unexpected password format: " + password.GetType()); - } - - private MySqlPacket ReadPacket() - { - try - { - MySqlPacket p = _driver.ReadPacket(); - return p; - } - catch (MySqlException ex) - { - // make sure this is an auth failed ex - AuthenticationFailed(ex); - return null; - } - } - - private void HandleAuthChange(MySqlPacket packet) - { - byte b = packet.ReadByte(); - Debug.Assert(b == 0xfe); - - string method = packet.ReadString(); - byte[] authData = new byte[packet.Length - packet.Position]; - Array.Copy(packet.Buffer, packet.Position, authData, 0, authData.Length); - - MySqlAuthenticationPlugin plugin = GetPlugin(method, _driver, authData); - plugin.AuthenticationChange(); - } - - private void AuthenticationChange() - { - MySqlPacket packet = _driver.Packet; - packet.Clear(); - byte[] moreData = MoreData(null); - while (moreData != null) - { - packet.Clear(); - packet.Write(moreData); - _driver.SendPacket(packet); - - packet = ReadPacket(); - byte prefixByte = packet.Buffer[0]; - if (prefixByte != 1) return; - - // a prefix of 0x01 means need more auth data - byte[] responseData = new byte[packet.Length - 1]; - Array.Copy(packet.Buffer, 1, responseData, 0, responseData.Length); - moreData = MoreData(responseData); - } - // we get here if MoreData returned null but the last packet read was a more data packet - ReadPacket(); - } - - public abstract string PluginName { get; } - - public virtual string GetUsername() - { - return Settings.UserID; - } - - public virtual object GetPassword() - { - return null; - } - } -} diff --git a/Source/MySql.Data/Authentication/NativePasswordPlugins.cs b/Source/MySql.Data/Authentication/NativePasswordPlugins.cs deleted file mode 100644 index d9e01be74..000000000 --- a/Source/MySql.Data/Authentication/NativePasswordPlugins.cs +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright © 2012, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Security.Cryptography; -#if NETCORE10 -using AliasText = MySql.Data.MySqlClient.Framework.NetCore10; -#else -using AliasText = System.Text; -#endif - -namespace MySql.Data.MySqlClient.Authentication -{ - public class MySqlNativePasswordPlugin : MySqlAuthenticationPlugin - { - public override string PluginName => "mysql_native_password"; - - protected override void SetAuthData(byte[] data) - { - // if the data given to us is a null terminated string, we need to trim off the trailing zero - if (data[data.Length - 1] == 0) - { - byte[] b = new byte[data.Length - 1]; - Buffer.BlockCopy(data, 0, b, 0, data.Length - 1); - base.SetAuthData(b); - } - else - base.SetAuthData(data); - } - - protected override byte[] MoreData(byte[] data) - { - byte[] passBytes = (GetPassword() ?? new byte[1]) as byte[]; - byte[] buffer = new byte[passBytes.Length - 1]; - Array.Copy(passBytes, 1, buffer, 0, passBytes.Length - 1); - return buffer; - } - - public override object GetPassword() - { - byte[] bytes = Get411Password(Settings.Password, AuthenticationData); - if (bytes != null && bytes.Length == 1 && bytes[0] == 0) return null; - return bytes; - } - - /// - /// Returns a byte array containing the proper encryption of the - /// given password/seed according to the new 4.1.1 authentication scheme. - /// - /// - /// - /// - protected byte[] Get411Password(string password, byte[] seedBytes) - { - // if we have no password, then we just return 1 zero byte - if (password.Length == 0) return new byte[1]; - //SHA1 sha = new SHA1CryptoServiceProvider(); - SHA1 sha = SHA1.Create(); - - byte[] firstHash = sha.ComputeHash(AliasText.Encoding.Default.GetBytes(password)); - byte[] secondHash = sha.ComputeHash(firstHash); - - byte[] input = new byte[seedBytes.Length + secondHash.Length]; - Array.Copy(seedBytes, 0, input, 0, seedBytes.Length); - Array.Copy(secondHash, 0, input, seedBytes.Length, secondHash.Length); - byte[] thirdHash = sha.ComputeHash(input); - - byte[] finalHash = new byte[thirdHash.Length + 1]; - finalHash[0] = 0x14; - Array.Copy(thirdHash, 0, finalHash, 1, thirdHash.Length); - - for (int i = 1; i < finalHash.Length; i++) - finalHash[i] = (byte)(finalHash[i] ^ firstHash[i - 1]); - return finalHash; - } - } -} diff --git a/Source/MySql.Data/Authentication/Sha256AuthenticationPlugin.cs b/Source/MySql.Data/Authentication/Sha256AuthenticationPlugin.cs deleted file mode 100644 index 147245255..000000000 --- a/Source/MySql.Data/Authentication/Sha256AuthenticationPlugin.cs +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -//#define BOUNCY_CASTLE_INCLUDED - -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using System.Security.Cryptography; - -#if BOUNCY_CASTLE_INCLUDED -using Org.BouncyCastle.Crypto; -using Org.BouncyCastle.Security; -using Org.BouncyCastle.OpenSsl; -using Org.BouncyCastle.Crypto.Parameters; -#endif - -namespace MySql.Data.MySqlClient.Authentication -{ - /// - /// The implementation of the sha256_password authentication plugin. - /// - public class Sha256AuthenticationPlugin : MySqlAuthenticationPlugin - { -#if BOUNCY_CASTLE_INCLUDED - private RsaKeyParameters publicKey; -#endif - private byte[] rawPubkey; - - public override string PluginName => "sha256_password"; - - protected override byte[] MoreData(byte[] data) - { - rawPubkey = data; - byte[] buffer = GetPassword() as byte[]; - return buffer; - } - - public override object GetPassword() - { -#if !NETCORE10 - if (Settings.SslMode != MySqlSslMode.None) - { - // send as clear text, since the channel is already encrypted - byte[] passBytes = Encoding.GetBytes(Settings.Password); - byte[] buffer = new byte[passBytes.Length + 1]; - Array.Copy(passBytes, 0, buffer, 0, passBytes.Length); - buffer[passBytes.Length] = 0; - return buffer; - } - else - { -#endif -#if BOUNCY_CASTLE_INCLUDED - // send RSA encrypted, since the channel is not protected - if (rawPubkey != null) - { - publicKey = GenerateKeysFromPem(rawPubkey); - } - if (publicKey == null) return new byte[] { 0x01 }; //RequestPublicKey(); - else - { - byte[] bytes = GetRsaPassword(Settings.Password, AuthenticationData); - if (bytes != null && bytes.Length == 1 && bytes[0] == 0) return null; - return bytes; - } -#else - throw new NotImplementedException( "You can use sha256 plugin only in SSL connections in this implementation." ); -#endif -#if !NETCORE10 - } -#endif - } - -#if BOUNCY_CASTLE_INCLUDED - private void RequestPublicKey() - { - RsaKeyParameters keys = GenerateKeysFromPem(rawPubkey); - publicKey = keys; - } - - private RsaKeyParameters GenerateKeysFromPem(byte[] rawData) - { - PemReader pem = new PemReader(new StreamReader(new MemoryStream( rawData ))); - RsaKeyParameters keyPair = (RsaKeyParameters)pem.ReadObject(); - return keyPair; - } - - private byte[] GetRsaPassword(string password, byte[] seedBytes) - { - // Obfuscate the plain text password with the session scramble - byte[] ofuscated = GetXor(this.Encoding.GetBytes(password), seedBytes); - // Encrypt the password and send it to the server - byte[] result = Encrypt(ofuscated, publicKey ); - return result; - } - - private byte[] GetXor( byte[] src, byte[] pattern ) - { - byte[] src2 = new byte[src.Length + 1]; - Array.Copy(src, 0, src2, 0, src.Length); - src2[src.Length] = 0; - byte[] result = new byte[src2.Length]; - for (int i = 0; i < src2.Length; i++) - { - result[ i ] = ( byte )( src2[ i ] ^ ( pattern[ i % pattern.Length ] )); - } - return result; - } - - private byte[] Encrypt(byte[] data, RsaKeyParameters key) - { - IBufferedCipher c = CipherUtilities.GetCipher("RSA/NONE/OAEPPadding"); - c.Init(true, key); - byte[] result = c.DoFinal(data); - return result; - } -#endif - - } -} diff --git a/Source/MySql.Data/Authentication/WindowsAuthenticationPlugin.cs b/Source/MySql.Data/Authentication/WindowsAuthenticationPlugin.cs deleted file mode 100644 index 337878db0..000000000 --- a/Source/MySql.Data/Authentication/WindowsAuthenticationPlugin.cs +++ /dev/null @@ -1,408 +0,0 @@ -// Copyright © 2012, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Diagnostics; -using System.Runtime.InteropServices; -using System.Security; -using MySql.Data.MySqlClient; - - -namespace MySql.Data.MySqlClient.Authentication -{ - /// - /// - /// -#if !NETCORE10 - [SuppressUnmanagedCodeSecurity()] -#endif - internal class MySqlWindowsAuthenticationPlugin : MySqlAuthenticationPlugin - { - SECURITY_HANDLE outboundCredentials = new SECURITY_HANDLE(0); - SECURITY_HANDLE clientContext = new SECURITY_HANDLE(0); - SECURITY_INTEGER lifetime = new SECURITY_INTEGER(0); - bool continueProcessing; - string targetName = null; - - protected override void CheckConstraints() - { - string platform = String.Empty; - -#if !NETCORE10 - int p = (int)Environment.OSVersion.Platform; - if ((p == 4) || (p == 128)) - platform = "Unix"; - else if (Environment.OSVersion.Platform == PlatformID.MacOSX) - platform = "Mac OS/X"; - - if (!String.IsNullOrEmpty(platform)) - throw new MySqlException(String.Format(Resources.WinAuthNotSupportOnPlatform, platform)); -#endif - base.CheckConstraints(); - } - - public override string GetUsername() - { - string username = base.GetUsername(); - if (String.IsNullOrEmpty(username)) - return "auth_windows"; - return username; - } - - public override string PluginName - { - get { return "authentication_windows_client"; } - } - - protected override byte[] MoreData(byte[] moreData) - { - if (moreData == null) - AcquireCredentials(); - - byte[] clientBlob = null; - - if (continueProcessing) - InitializeClient(out clientBlob, moreData, out continueProcessing); - - if (!continueProcessing || clientBlob == null || clientBlob.Length == 0) - { - FreeCredentialsHandle(ref outboundCredentials); - DeleteSecurityContext(ref clientContext); - return null; - } - return clientBlob; - } - - void InitializeClient(out byte[] clientBlob, byte[] serverBlob, out bool continueProcessing) - { - clientBlob = null; - continueProcessing = true; - SecBufferDesc clientBufferDesc = new SecBufferDesc(MAX_TOKEN_SIZE); - SECURITY_INTEGER initLifetime = new SECURITY_INTEGER(0); - int ss = -1; - try - { - uint ContextAttributes = 0; - - if (serverBlob == null) - { - ss = InitializeSecurityContext( - ref outboundCredentials, - IntPtr.Zero, - targetName, - STANDARD_CONTEXT_ATTRIBUTES, - 0, - SECURITY_NETWORK_DREP, - IntPtr.Zero, /* always zero first time around */ - 0, - out clientContext, - out clientBufferDesc, - out ContextAttributes, - out initLifetime); - - } - else - { - SecBufferDesc serverBufferDesc = new SecBufferDesc(serverBlob); - - try - { - ss = InitializeSecurityContext(ref outboundCredentials, - ref clientContext, - targetName, - STANDARD_CONTEXT_ATTRIBUTES, - 0, - SECURITY_NETWORK_DREP, - ref serverBufferDesc, - 0, - out clientContext, - out clientBufferDesc, - out ContextAttributes, - out initLifetime); - } - finally - { - serverBufferDesc.Dispose(); - } - } - - - if ((SEC_I_COMPLETE_NEEDED == ss) - || (SEC_I_COMPLETE_AND_CONTINUE == ss)) - { - CompleteAuthToken(ref clientContext, ref clientBufferDesc); - } - - if (ss != SEC_E_OK && - ss != SEC_I_CONTINUE_NEEDED && - ss != SEC_I_COMPLETE_NEEDED && - ss != SEC_I_COMPLETE_AND_CONTINUE) - { - throw new MySqlException( - "InitializeSecurityContext() failed with errorcode " + ss); - } - - clientBlob = clientBufferDesc.GetSecBufferByteArray(); - } - finally - { - clientBufferDesc.Dispose(); - } - continueProcessing = (ss != SEC_E_OK && ss != SEC_I_COMPLETE_NEEDED); - } - - private void AcquireCredentials() - { - - continueProcessing = true; - - int ss = AcquireCredentialsHandle(null, "Negotiate", SECPKG_CRED_OUTBOUND, - IntPtr.Zero, IntPtr.Zero, 0, IntPtr.Zero, ref outboundCredentials, - ref lifetime); - if (ss != SEC_E_OK) - throw new MySqlException("AcquireCredentialsHandle failed with errorcode" + ss); - } - - #region SSPI Constants and Imports - - const int SEC_E_OK = 0; - const int SEC_I_CONTINUE_NEEDED = 0x90312; - const int SEC_I_COMPLETE_NEEDED = 0x1013; - const int SEC_I_COMPLETE_AND_CONTINUE = 0x1014; - - const int SECPKG_CRED_OUTBOUND = 2; - const int SECURITY_NETWORK_DREP = 0; - const int SECURITY_NATIVE_DREP = 0x10; - const int SECPKG_CRED_INBOUND = 1; - const int MAX_TOKEN_SIZE = 12288; - const int SECPKG_ATTR_SIZES = 0; - const int STANDARD_CONTEXT_ATTRIBUTES = 0; - - [DllImport("secur32", CharSet = CharSet.Unicode)] - static extern int AcquireCredentialsHandle( - string pszPrincipal, - string pszPackage, - int fCredentialUse, - IntPtr PAuthenticationID, - IntPtr pAuthData, - int pGetKeyFn, - IntPtr pvGetKeyArgument, - ref SECURITY_HANDLE phCredential, - ref SECURITY_INTEGER ptsExpiry); - - [DllImport("secur32", CharSet = CharSet.Unicode, SetLastError = true)] - static extern int InitializeSecurityContext( - ref SECURITY_HANDLE phCredential, - IntPtr phContext, - string pszTargetName, - int fContextReq, - int Reserved1, - int TargetDataRep, - IntPtr pInput, - int Reserved2, - out SECURITY_HANDLE phNewContext, - out SecBufferDesc pOutput, - out uint pfContextAttr, - out SECURITY_INTEGER ptsExpiry); - - [DllImport("secur32", CharSet = CharSet.Unicode, SetLastError = true)] - static extern int InitializeSecurityContext( - ref SECURITY_HANDLE phCredential, - ref SECURITY_HANDLE phContext, - string pszTargetName, - int fContextReq, - int Reserved1, - int TargetDataRep, - ref SecBufferDesc SecBufferDesc, - int Reserved2, - out SECURITY_HANDLE phNewContext, - out SecBufferDesc pOutput, - out uint pfContextAttr, - out SECURITY_INTEGER ptsExpiry); - - [DllImport("secur32", CharSet = CharSet.Unicode, SetLastError = true)] - static extern int CompleteAuthToken( - ref SECURITY_HANDLE phContext, - ref SecBufferDesc pToken); - - [DllImport("secur32.Dll", CharSet = CharSet.Unicode, SetLastError = false)] - public static extern int QueryContextAttributes( - ref SECURITY_HANDLE phContext, - uint ulAttribute, - out SecPkgContext_Sizes pContextAttributes); - - [DllImport("secur32.Dll", CharSet = CharSet.Unicode, SetLastError = false)] - public static extern int FreeCredentialsHandle(ref SECURITY_HANDLE pCred); - - [DllImport("secur32.Dll", CharSet = CharSet.Unicode, SetLastError = false)] - public static extern int DeleteSecurityContext(ref SECURITY_HANDLE pCred); - - #endregion - } - - [StructLayout(LayoutKind.Sequential)] - struct SecBufferDesc : IDisposable - { - - public int ulVersion; - public int cBuffers; - public IntPtr pBuffers; //Point to SecBuffer - - public SecBufferDesc(int bufferSize) - { - ulVersion = (int)SecBufferType.SECBUFFER_VERSION; - cBuffers = 1; - SecBuffer secBuffer = new SecBuffer(bufferSize); - pBuffers = Marshal.AllocHGlobal(Marshal.SizeOf(secBuffer)); - Marshal.StructureToPtr(secBuffer, pBuffers, false); - } - - public SecBufferDesc(byte[] secBufferBytes) - { - ulVersion = (int)SecBufferType.SECBUFFER_VERSION; - cBuffers = 1; - SecBuffer thisSecBuffer = new SecBuffer(secBufferBytes); - pBuffers = Marshal.AllocHGlobal(Marshal.SizeOf(thisSecBuffer)); - Marshal.StructureToPtr(thisSecBuffer, pBuffers, false); - } - - public void Dispose() - { - if (pBuffers != IntPtr.Zero) - { - Debug.Assert(cBuffers == 1); - SecBuffer ThisSecBuffer = Marshal.PtrToStructure< SecBuffer>(pBuffers); - ThisSecBuffer.Dispose(); - Marshal.FreeHGlobal(pBuffers); - pBuffers = IntPtr.Zero; - } - } - - public byte[] GetSecBufferByteArray() - { - byte[] Buffer = null; - - if (pBuffers == IntPtr.Zero) - { - throw new InvalidOperationException("Object has already been disposed!!!"); - } - Debug.Assert(cBuffers == 1); - SecBuffer secBuffer = Marshal.PtrToStructure< SecBuffer>(pBuffers); - if (secBuffer.cbBuffer > 0) - { - Buffer = new byte[secBuffer.cbBuffer]; - Marshal.Copy(secBuffer.pvBuffer, Buffer, 0, secBuffer.cbBuffer); - } - return (Buffer); - } - - } - - public enum SecBufferType - { - SECBUFFER_VERSION = 0, - SECBUFFER_EMPTY = 0, - SECBUFFER_DATA = 1, - SECBUFFER_TOKEN = 2 - } - - [StructLayout(LayoutKind.Sequential)] - public struct SecHandle //=PCtxtHandle - { - IntPtr dwLower; // ULONG_PTR translates to IntPtr not to uint - IntPtr dwUpper; // this is crucial for 64-Bit Platforms - } - - [StructLayout(LayoutKind.Sequential)] - public struct SecBuffer : IDisposable - { - public int cbBuffer; - public int BufferType; - public IntPtr pvBuffer; - - - public SecBuffer(int bufferSize) - { - cbBuffer = bufferSize; - BufferType = (int)SecBufferType.SECBUFFER_TOKEN; - pvBuffer = Marshal.AllocHGlobal(bufferSize); - } - - public SecBuffer(byte[] secBufferBytes) - { - cbBuffer = secBufferBytes.Length; - BufferType = (int)SecBufferType.SECBUFFER_TOKEN; - pvBuffer = Marshal.AllocHGlobal(cbBuffer); - Marshal.Copy(secBufferBytes, 0, pvBuffer, cbBuffer); - } - - public SecBuffer(byte[] secBufferBytes, SecBufferType bufferType) - { - cbBuffer = secBufferBytes.Length; - BufferType = (int)bufferType; - pvBuffer = Marshal.AllocHGlobal(cbBuffer); - Marshal.Copy(secBufferBytes, 0, pvBuffer, cbBuffer); - } - - public void Dispose() - { - if (pvBuffer != IntPtr.Zero) - { - Marshal.FreeHGlobal(pvBuffer); - pvBuffer = IntPtr.Zero; - } - } - } - - [StructLayout(LayoutKind.Sequential)] - public struct SECURITY_INTEGER - { - public uint LowPart; - public int HighPart; - public SECURITY_INTEGER(int dummy) - { - LowPart = 0; - HighPart = 0; - } - }; - - [StructLayout(LayoutKind.Sequential)] - public struct SECURITY_HANDLE - { - public IntPtr LowPart; - public IntPtr HighPart; - public SECURITY_HANDLE(int dummy) - { - LowPart = HighPart = new IntPtr(0); - } - }; - - [StructLayout(LayoutKind.Sequential)] - public struct SecPkgContext_Sizes - { - public uint cbMaxToken; - public uint cbMaxSignature; - public uint cbBlockSize; - public uint cbSecurityTrailer; - }; - -} diff --git a/Source/MySql.Data/BulkLoader.cs b/Source/MySql.Data/BulkLoader.cs deleted file mode 100644 index c09fa0c69..000000000 --- a/Source/MySql.Data/BulkLoader.cs +++ /dev/null @@ -1,344 +0,0 @@ -// Copyright © 2006, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Data; -using System.Text; -using System.Threading.Tasks; -using System.Threading; -using System.IO; - -namespace MySql.Data.MySqlClient -{ - /// - /// - /// - public class MySqlBulkLoader - { - // constant values - private const string defaultFieldTerminator = "\t"; - private const string defaultLineTerminator = "\n"; - private const char defaultEscapeCharacter = '\\'; - - // fields - - public MySqlBulkLoader(MySqlConnection connection) - { - Connection = connection; - Local = true; - FieldTerminator = defaultFieldTerminator; - LineTerminator = defaultLineTerminator; - FieldQuotationCharacter = Char.MinValue; - ConflictOption = MySqlBulkLoaderConflictOption.None; - Columns = new List(); - Expressions = new List(); - } - -#region Properties - - /// - /// Gets or sets the connection. - /// - /// The connection. - public MySqlConnection Connection { get; set; } - - /// - /// Gets or sets the field terminator. - /// - /// The field terminator. - public string FieldTerminator { get; set; } - - /// - /// Gets or sets the line terminator. - /// - /// The line terminator. - public string LineTerminator { get; set; } - - /// - /// Gets or sets the name of the table. - /// - /// The name of the table. - public string TableName { get; set; } - - /// - /// Gets or sets the character set. - /// - /// The character set. - public string CharacterSet { get; set; } - - /// - /// Gets or sets the name of the file. - /// - /// The name of the file. - public string FileName { get; set; } - - /// - /// Gets or sets the timeout. - /// - /// The timeout. - public int Timeout { get; set; } - - /// - /// Gets or sets a value indicating whether the filename that is to be loaded - /// is local to the client or not - /// - /// true if local; otherwise, false. - public bool Local { get; set; } - - /// - /// Gets or sets the number of lines to skip. - /// - /// The number of lines to skip. - public int NumberOfLinesToSkip { get; set; } - - /// - /// Gets or sets the line prefix. - /// - /// The line prefix. - public string LinePrefix { get; set; } - - /// - /// Gets or sets the field quotation character. - /// - /// The field quotation character. - public char FieldQuotationCharacter { get; set; } - - /// - /// Gets or sets a value indicating whether [field quotation optional]. - /// - /// - /// true if [field quotation optional]; otherwise, false. - /// - public bool FieldQuotationOptional { get; set; } - - /// - /// Gets or sets the escape character. - /// - /// The escape character. - public char EscapeCharacter { get; set; } - - /// - /// Gets or sets the conflict option. - /// - /// The conflict option. - public MySqlBulkLoaderConflictOption ConflictOption { get; set; } - - /// - /// Gets or sets the priority. - /// - /// The priority. - public MySqlBulkLoaderPriority Priority { get; set; } - - /// - /// Gets the columns. - /// - /// The columns. - public List Columns { get; } - - /// - /// Gets the expressions. - /// - /// The expressions. - public List Expressions { get; } - -#endregion - - /// - /// Execute the load operation - /// - /// The number of rows inserted. - public int Load() - { - bool openedConnection = false; - - if (Connection == null) - throw new InvalidOperationException(Resources.ConnectionNotSet); - - // next we open up the connetion if it is not already open - if (Connection.State != ConnectionState.Open) - { - openedConnection = true; - Connection.Open(); - } - - try - { - string sql = BuildSqlCommand(); - MySqlCommand cmd = new MySqlCommand(sql, Connection) {CommandTimeout = Timeout}; - return cmd.ExecuteNonQuery(); - } - finally - { - if (openedConnection) - Connection.Close(); - } - } - -#region Async - /// - /// Async version of Load - /// - /// The number of rows inserted. - public Task LoadAsync() - { - return LoadAsync(CancellationToken.None); - } - - public Task LoadAsync(CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - int loadResult = Load(); - result.SetResult(loadResult); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } -#endregion - - private string BuildSqlCommand() - { - StringBuilder sql = new StringBuilder("LOAD DATA "); - if (Priority == MySqlBulkLoaderPriority.Low) - sql.Append("LOW_PRIORITY "); - else if (Priority == MySqlBulkLoaderPriority.Concurrent) - sql.Append("CONCURRENT "); - - if (Local) - sql.Append("LOCAL "); - sql.Append("INFILE "); - if (Path.DirectorySeparatorChar == '\\') - sql.AppendFormat("'{0}' ", FileName.Replace(@"\", @"\\")); - else - sql.AppendFormat("'{0}' ", FileName); - - if (ConflictOption == MySqlBulkLoaderConflictOption.Ignore) - sql.Append("IGNORE "); - else if (ConflictOption == MySqlBulkLoaderConflictOption.Replace) - sql.Append("REPLACE "); - - sql.AppendFormat("INTO TABLE {0} ", TableName); - - if (CharacterSet != null) - sql.AppendFormat("CHARACTER SET {0} ", CharacterSet); - - StringBuilder optionSql = new StringBuilder(String.Empty); - if (FieldTerminator != defaultFieldTerminator) - optionSql.AppendFormat("TERMINATED BY '{0}' ", FieldTerminator); - if (FieldQuotationCharacter != Char.MinValue) - optionSql.AppendFormat("{0} ENCLOSED BY '{1}' ", - FieldQuotationOptional ? "OPTIONALLY" : "", FieldQuotationCharacter); - if (EscapeCharacter != defaultEscapeCharacter && - EscapeCharacter != Char.MinValue) - optionSql.AppendFormat("ESCAPED BY '{0}' ", EscapeCharacter); - if (optionSql.Length > 0) - sql.AppendFormat("FIELDS {0}", optionSql.ToString()); - - optionSql = new StringBuilder(String.Empty); - if (!string.IsNullOrEmpty(LinePrefix)) - optionSql.AppendFormat("STARTING BY '{0}' ", LinePrefix); - if (LineTerminator != defaultLineTerminator) - optionSql.AppendFormat("TERMINATED BY '{0}' ", LineTerminator); - if (optionSql.Length > 0) - sql.AppendFormat("LINES {0}", optionSql.ToString()); - - if (NumberOfLinesToSkip > 0) - sql.AppendFormat("IGNORE {0} LINES ", NumberOfLinesToSkip); - - if (Columns.Count > 0) - { - sql.Append("("); - sql.Append(Columns[0]); - for (int i = 1; i < Columns.Count; i++) - sql.AppendFormat(",{0}", Columns[i]); - sql.Append(") "); - } - - if (Expressions.Count > 0) - { - sql.Append("SET "); - sql.Append(Expressions[0]); - for (int i = 1; i < Expressions.Count; i++) - sql.AppendFormat(",{0}", Expressions[i]); - } - - return sql.ToString(); - } - } - - /// - /// - /// - public enum MySqlBulkLoaderPriority - { - /// - /// This is the default and indicates normal priority - /// - None, - /// - /// Low priority will cause the load operation to wait until all readers of the table - /// have finished. This only affects storage engines that use only table-level locking - /// such as MyISAM, Memory, and Merge. - /// - Low, - /// - /// Concurrent priority is only relevant for MyISAM tables and signals that if the table - /// has no free blocks in the middle that other readers can retrieve data from the table - /// while the load operation is happening. - /// - Concurrent - } - - /// - /// - /// - public enum MySqlBulkLoaderConflictOption - { - /// - /// This is the default and indicates normal operation. In the event of a LOCAL load, this - /// is the same as ignore. When the data file is on the server, then a key conflict will - /// cause an error to be thrown and the rest of the data file ignored. - /// - None, - /// - /// Replace column values when a key conflict occurs. - /// - Replace, - /// - /// Ignore any rows where the primary key conflicts. - /// - Ignore - } - -} diff --git a/Source/MySql.Data/CharSetMap.cs b/Source/MySql.Data/CharSetMap.cs deleted file mode 100644 index ee8f10df9..000000000 --- a/Source/MySql.Data/CharSetMap.cs +++ /dev/null @@ -1,212 +0,0 @@ -// Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.Common; - -namespace MySql.Data.MySqlClient -{ - /// - /// Summary description for CharSetMap. - /// - internal class CharSetMap - { - private static Dictionary _defaultCollations; - private static Dictionary _maxLengths; - private static Dictionary _mapping; - private static readonly object LockObject; - - // we use a static constructor here since we only want to init - // the mapping once - static CharSetMap() - { - LockObject = new Object(); - InitializeMapping(); - } - - public static CharacterSet GetCharacterSet(DBVersion version, string charSetName) - { - if (charSetName == null) - throw new ArgumentNullException("CharSetName is null"); - CharacterSet cs = null; - if(_mapping.ContainsKey(charSetName)) - cs = _mapping[charSetName]; - - if (cs == null) - throw new NotSupportedException("Character set '" + charSetName + "' is not supported by .Net Framework."); - return cs; - } - - /// - /// Returns the text encoding for a given MySQL character set name - /// - /// Version of the connection requesting the encoding - /// Name of the character set to get the encoding for - /// Encoding object for the given character set name - public static Encoding GetEncoding(DBVersion version, string charSetName) - { - try - { - CharacterSet cs = GetCharacterSet(version, charSetName); - -#if NETCORE10 - Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); -#endif - - return Encoding.GetEncoding(cs.name); - } - catch (ArgumentException) - { - return Encoding.GetEncoding("utf-8"); - } - catch (NotSupportedException) - { - return Encoding.GetEncoding("utf-8"); - } - } - - /// - /// Initializes the mapping. - /// - private static void InitializeMapping() - { - LoadCharsetMap(); - } - - private static void LoadCharsetMap() - { - _mapping = new Dictionary(); - - _mapping.Add("latin1", new CharacterSet("windows-1252", 1)); - _mapping.Add("big5", new CharacterSet("big5", 2)); - _mapping.Add("dec8", _mapping["latin1"]); - _mapping.Add("cp850", new CharacterSet("ibm850", 1)); - _mapping.Add("hp8", _mapping["latin1"]); - _mapping.Add("koi8r", new CharacterSet("koi8-u", 1)); - _mapping.Add("latin2", new CharacterSet("latin2", 1)); - _mapping.Add("swe7", _mapping["latin1"]); - _mapping.Add("ujis", new CharacterSet("EUC-JP", 3)); - _mapping.Add("eucjpms", _mapping["ujis"]); - _mapping.Add("sjis", new CharacterSet("sjis", 2)); - _mapping.Add("cp932", _mapping["sjis"]); - _mapping.Add("hebrew", new CharacterSet("hebrew", 1)); - _mapping.Add("tis620", new CharacterSet("windows-874", 1)); - _mapping.Add("euckr", new CharacterSet("euc-kr", 2)); - _mapping.Add("euc_kr", _mapping["euckr"]); - _mapping.Add("koi8u", new CharacterSet("koi8-u", 1)); - _mapping.Add("koi8_ru", _mapping["koi8u"]); - _mapping.Add("gb2312", new CharacterSet("gb2312", 2)); - _mapping.Add("gbk", _mapping["gb2312"]); - _mapping.Add("greek", new CharacterSet("greek", 1)); - _mapping.Add("cp1250", new CharacterSet("windows-1250", 1)); - _mapping.Add("win1250", _mapping["cp1250"]); - _mapping.Add("latin5", new CharacterSet("latin5", 1)); - _mapping.Add("armscii8", _mapping["latin1"]); - _mapping.Add("utf8", new CharacterSet("utf-8", 3)); - _mapping.Add("ucs2", new CharacterSet("UTF-16BE", 2)); - _mapping.Add("cp866", new CharacterSet("cp866", 1)); - _mapping.Add("keybcs2", _mapping["latin1"]); - _mapping.Add("macce", new CharacterSet("x-mac-ce", 1)); - _mapping.Add("macroman", new CharacterSet("x-mac-romanian", 1)); - _mapping.Add("cp852", new CharacterSet("ibm852", 2)); - _mapping.Add("latin7", new CharacterSet("iso-8859-7", 1)); - _mapping.Add("cp1251", new CharacterSet("windows-1251", 1)); - _mapping.Add("win1251ukr", _mapping["cp1251"]); - _mapping.Add("cp1251csas", _mapping["cp1251"]); - _mapping.Add("cp1251cias", _mapping["cp1251"]); - _mapping.Add("win1251", _mapping["cp1251"]); - _mapping.Add("cp1256", new CharacterSet("cp1256", 1)); - _mapping.Add("cp1257", new CharacterSet("windows-1257", 1)); - _mapping.Add("ascii", new CharacterSet("us-ascii", 1)); - _mapping.Add("usa7", _mapping["ascii"]); - _mapping.Add("binary", _mapping["ascii"]); - _mapping.Add("latin3", new CharacterSet("latin3", 1)); - _mapping.Add("latin4", new CharacterSet("latin4", 1)); - _mapping.Add("latin1_de", new CharacterSet("iso-8859-1", 1)); - _mapping.Add("german1", new CharacterSet("iso-8859-1", 1)); - _mapping.Add("danish", new CharacterSet("iso-8859-1", 1)); - _mapping.Add("czech", new CharacterSet("iso-8859-2", 1)); - _mapping.Add("hungarian", new CharacterSet("iso-8859-2", 1)); - _mapping.Add("croat", new CharacterSet("iso-8859-2", 1)); - _mapping.Add("latvian", new CharacterSet("iso-8859-13", 1)); - _mapping.Add("latvian1", new CharacterSet("iso-8859-13", 1)); - _mapping.Add("estonia", new CharacterSet("iso-8859-13", 1)); - _mapping.Add("dos", new CharacterSet("ibm437", 1)); - _mapping.Add("utf8mb4", new CharacterSet("utf-8", 4)); - _mapping.Add("utf16", new CharacterSet("utf-16BE", 2)); - _mapping.Add("utf16le", new CharacterSet("utf-16", 2)); - _mapping.Add("utf32", new CharacterSet("utf-32BE", 4)); - _mapping.Add("gb18030", new CharacterSet("gb18030", 4)); - } - - internal static void InitCollections(MySqlConnection connection) - { - _defaultCollations = new Dictionary(); - _maxLengths = new Dictionary(); - - MySqlCommand cmd = new MySqlCommand("SHOW CHARSET", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - while (reader.Read()) - { - _defaultCollations.Add(reader.GetString(0), reader.GetString(2)); - _maxLengths.Add(reader.GetString(0), Convert.ToInt32(reader.GetValue(3))); - } - } - } - - internal static string GetDefaultCollation(string charset, MySqlConnection connection) - { - lock (LockObject) - { - if (_defaultCollations == null) - InitCollections(connection); - } - return !_defaultCollations.ContainsKey(charset) ? null : _defaultCollations[charset]; - } - - internal static int GetMaxLength(string charset, MySqlConnection connection) - { - lock (LockObject) - { - if (_maxLengths == null) - InitCollections(connection); - } - - return !_maxLengths.ContainsKey(charset) ? 1 : _maxLengths[charset]; - } - } - - internal class CharacterSet - { - public string name; - public int byteCount; - - public CharacterSet(string name, int byteCount) - { - this.name = name; - this.byteCount = byteCount; - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data/CommandBuilder.cs b/Source/MySql.Data/CommandBuilder.cs deleted file mode 100644 index 955fd9423..000000000 --- a/Source/MySql.Data/CommandBuilder.cs +++ /dev/null @@ -1,295 +0,0 @@ -// Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.ComponentModel; -using System.Data.Common; -using System.Data; -using System.Text; -using MySql.Data.Types; -using System.Globalization; - -using System.Collections.Generic; -using MySql.Data.Common; - -namespace MySql.Data.MySqlClient -{ - /// -#if !NETCORE10 - [ToolboxItem(false)] - [System.ComponentModel.DesignerCategory("Code")] -#endif - public sealed class MySqlCommandBuilder : DbCommandBuilder - { - /// - public MySqlCommandBuilder() - { - QuotePrefix = QuoteSuffix = "`"; - } - - /// - public MySqlCommandBuilder(MySqlDataAdapter adapter) - : this() - { - DataAdapter = adapter; - } - - /// - public new MySqlDataAdapter DataAdapter - { - get { return (MySqlDataAdapter)base.DataAdapter; } - set { base.DataAdapter = value; } - } - - #region Public Methods - - /// - /// Retrieves parameter information from the stored procedure specified - /// in the MySqlCommand and populates the Parameters collection of the - /// specified MySqlCommand object. - /// This method is not currently supported since stored procedures are - /// not available in MySql. - /// - /// The MySqlCommand referencing the stored - /// procedure from which the parameter information is to be derived. - /// The derived parameters are added to the Parameters collection of the - /// MySqlCommand. - /// The command text is not - /// a valid stored procedure name. - public static void DeriveParameters(MySqlCommand command) - { - if (command.CommandType != CommandType.StoredProcedure) - throw new InvalidOperationException(Resources.CanNotDeriveParametersForTextCommands); - - // retrieve the proc definition from the cache. - string spName = command.CommandText; - if (spName.IndexOf(".") == -1) - spName = command.Connection.Database + "." + spName; - - try - { - ProcedureCacheEntry entry = command.Connection.ProcedureCache.GetProcedure(command.Connection, spName, null); - command.Parameters.Clear(); - foreach (MySqlSchemaRow row in entry.parameters.Rows) - { - MySqlParameter p = new MySqlParameter(); - p.ParameterName = String.Format("@{0}", row["PARAMETER_NAME"]); - if (row["ORDINAL_POSITION"].Equals(0) && p.ParameterName == "@") - p.ParameterName = "@RETURN_VALUE"; - p.Direction = GetDirection(row); - bool unsigned = StoredProcedure.GetFlags(row["DTD_IDENTIFIER"].ToString()).IndexOf("UNSIGNED") != -1; - bool real_as_float = entry.procedure.Rows[0]["SQL_MODE"].ToString().IndexOf("REAL_AS_FLOAT") != -1; - p.MySqlDbType = MetaData.NameToType(row["DATA_TYPE"].ToString(), - unsigned, real_as_float, command.Connection); - if (row["CHARACTER_MAXIMUM_LENGTH"] != null ) - p.Size = (int)row["CHARACTER_MAXIMUM_LENGTH"]; - if (row["NUMERIC_PRECISION"] != null) - p.Precision = Convert.ToByte(row["NUMERIC_PRECISION"]); - if (row["NUMERIC_SCALE"] != null ) - p.Scale = Convert.ToByte(row["NUMERIC_SCALE"]); - if (p.MySqlDbType == MySqlDbType.Set || p.MySqlDbType == MySqlDbType.Enum) - p.PossibleValues = GetPossibleValues(row); - command.Parameters.Add(p); - } - } - catch (InvalidOperationException ioe) - { - throw new MySqlException(Resources.UnableToDeriveParameters, ioe); - } - } - - private static List GetPossibleValues(MySqlSchemaRow row) - { - string[] types = new string[] { "ENUM", "SET" }; - string dtdIdentifier = row["DTD_IDENTIFIER"].ToString().Trim(); - - int index = 0; - for (; index < 2; index++) - if (dtdIdentifier.StartsWith(types[index], StringComparison.OrdinalIgnoreCase )) - break; - if (index == 2) return null; - dtdIdentifier = dtdIdentifier.Substring(types[index].Length).Trim(); - dtdIdentifier = dtdIdentifier.Trim('(', ')').Trim(); - - List values = new List(); - MySqlTokenizer tokenzier = new MySqlTokenizer(dtdIdentifier); - string token = tokenzier.NextToken(); - int start = tokenzier.StartIndex; - while (true) - { - if (token == null || token == ",") - { - int end = dtdIdentifier.Length - 1; - if (token == ",") - end = tokenzier.StartIndex; - - string value = dtdIdentifier.Substring(start, end - start).Trim('\'', '\"').Trim(); - values.Add(value); - start = tokenzier.StopIndex; - } - if (token == null) break; - token = tokenzier.NextToken(); - } - return values; - } - - private static ParameterDirection GetDirection(MySqlSchemaRow row) - { - string mode = row["PARAMETER_MODE"].ToString(); - int ordinal = Convert.ToInt32(row["ORDINAL_POSITION"]); - - if (0 == ordinal) - return ParameterDirection.ReturnValue; - else if (mode == "IN") - return ParameterDirection.Input; - else if (mode == "OUT") - return ParameterDirection.Output; - return ParameterDirection.InputOutput; - } - - /// - /// Gets the delete command. - /// - /// - public new MySqlCommand GetDeleteCommand() - { - return (MySqlCommand)base.GetDeleteCommand(); - } - - /// - /// Gets the update command. - /// - /// - public new MySqlCommand GetUpdateCommand() - { - return (MySqlCommand)base.GetUpdateCommand(); - } - - /// - /// Gets the insert command. - /// - /// - public new MySqlCommand GetInsertCommand() - { - return (MySqlCommand)GetInsertCommand(false); - } - - public override string QuoteIdentifier(string unquotedIdentifier) - { - if (unquotedIdentifier == null) throw new - ArgumentNullException("unquotedIdentifier"); - - // don't quote again if it is already quoted - if (unquotedIdentifier.StartsWith(QuotePrefix) && - unquotedIdentifier.EndsWith(QuoteSuffix)) - return unquotedIdentifier; - - unquotedIdentifier = unquotedIdentifier.Replace(QuotePrefix, QuotePrefix + QuotePrefix); - - return String.Format("{0}{1}{2}", QuotePrefix, unquotedIdentifier, QuoteSuffix); - } - - public override string UnquoteIdentifier(string quotedIdentifier) - { - if (quotedIdentifier == null) throw new - ArgumentNullException("quotedIdentifier"); - - // don't unquote again if it is already unquoted - if (!quotedIdentifier.StartsWith(QuotePrefix) || - !quotedIdentifier.EndsWith(QuoteSuffix)) - return quotedIdentifier; - - if (quotedIdentifier.StartsWith(QuotePrefix)) - quotedIdentifier = quotedIdentifier.Substring(1); - if (quotedIdentifier.EndsWith(QuoteSuffix)) - quotedIdentifier = quotedIdentifier.Substring(0, quotedIdentifier.Length - 1); - - quotedIdentifier = quotedIdentifier.Replace(QuotePrefix + QuotePrefix, QuotePrefix); - - return quotedIdentifier; - } - - #endregion - - protected override DataTable GetSchemaTable(DbCommand sourceCommand) - { - DataTable schemaTable = base.GetSchemaTable(sourceCommand); - - foreach (DataRow row in schemaTable.Rows) - if (row["BaseSchemaName"].Equals(sourceCommand.Connection.Database)) - row["BaseSchemaName"] = null; - - return schemaTable; - } - - /// - /// - /// - /// - /// - protected override string GetParameterName(string parameterName) - { - StringBuilder sb = new StringBuilder(parameterName); - sb.Replace(" ", ""); - sb.Replace("/", "_per_"); - sb.Replace("-", "_"); - sb.Replace(")", "_cb_"); - sb.Replace("(", "_ob_"); - sb.Replace("%", "_pct_"); - sb.Replace("<", "_lt_"); - sb.Replace(">", "_gt_"); - sb.Replace(".", "_pt_"); - return String.Format("@{0}", sb.ToString()); - } - - protected override void ApplyParameterInfo(DbParameter parameter, DataRow row, - StatementType statementType, bool whereClause) - { - ((MySqlParameter)parameter).MySqlDbType = (MySqlDbType)row["ProviderType"]; - } - - protected override string GetParameterName(int parameterOrdinal) - { - return String.Format("@p{0}", parameterOrdinal.ToString(CultureInfo.InvariantCulture)); - } - - protected override string GetParameterPlaceholder(int parameterOrdinal) - { - return String.Format("@p{0}", parameterOrdinal.ToString(CultureInfo.InvariantCulture)); - } - - protected override void SetRowUpdatingHandler(DbDataAdapter adapter) - { - MySqlDataAdapter myAdapter = (adapter as MySqlDataAdapter); - if (adapter != base.DataAdapter) - myAdapter.RowUpdating += new MySqlRowUpdatingEventHandler(RowUpdating); - else - myAdapter.RowUpdating -= new MySqlRowUpdatingEventHandler(RowUpdating); - } - - private void RowUpdating(object sender, MySqlRowUpdatingEventArgs args) - { - base.RowUpdatingHandler(args); - } - - } -} diff --git a/Source/MySql.Data/CompressedStream.cs b/Source/MySql.Data/CompressedStream.cs deleted file mode 100644 index dd7b67948..000000000 --- a/Source/MySql.Data/CompressedStream.cs +++ /dev/null @@ -1,357 +0,0 @@ -// Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.IO; -using System.Linq; -using zlib; -using MySql.Data.Common; - -namespace MySql.Data.MySqlClient -{ - /// - /// Summary description for CompressedStream. - /// - internal class CompressedStream : Stream - { - // writing fields - private Stream baseStream; - private MemoryStream cache; - - // reading fields - private byte[] localByte; - private byte[] inBuffer; - private byte[] lengthBytes; - private WeakReference inBufferRef; - private int inPos; - private int maxInPos; - private ZInputStream zInStream; - - public CompressedStream(Stream baseStream) - { - this.baseStream = baseStream; - localByte = new byte[1]; - lengthBytes = new byte[7]; - cache = new MemoryStream(); - inBufferRef = new WeakReference(inBuffer, false); - } - - #region Properties - - - public override bool CanRead => baseStream.CanRead; - - public override bool CanWrite => baseStream.CanWrite; - - public override bool CanSeek => baseStream.CanSeek; - - public override long Length => baseStream.Length; - - public override long Position - { - get { return baseStream.Position; } - set { baseStream.Position = value; } - } - - #endregion - -#if NETCORE10 - public void Close() - { - base.Dispose(); -#else - public override void Close() - { - base.Close(); -#endif -#if NETCORE10 - baseStream.Dispose(); -#else - baseStream.Close(); -#endif - cache.Dispose(); - } - - public override void SetLength(long value) - { - throw new NotSupportedException(Resources.CSNoSetLength); - } - - public override int ReadByte() - { - try - { - Read(localByte, 0, 1); - return localByte[0]; - } - catch (EndOfStreamException) - { - return -1; - } - } - - public override bool CanTimeout => baseStream.CanTimeout; - - public override int ReadTimeout - { - get - { - return baseStream.ReadTimeout; - } - set - { - baseStream.ReadTimeout = value; - } - } - - public override int WriteTimeout - { - get - { - return baseStream.WriteTimeout; - } - set - { - baseStream.WriteTimeout = value; - } - } - - public override int Read(byte[] buffer, int offset, int count) - { - if (buffer == null) - throw new ArgumentNullException(nameof(buffer), Resources.BufferCannotBeNull); - if (offset < 0 || offset >= buffer.Length) - throw new ArgumentOutOfRangeException(nameof(offset), Resources.OffsetMustBeValid); - if ((offset + count) > buffer.Length) - throw new ArgumentException(Resources.BufferNotLargeEnough, nameof(buffer)); - - if (inPos == maxInPos) - PrepareNextPacket(); - - int countToRead = Math.Min(count, maxInPos - inPos); - int countRead; - if (zInStream != null) - countRead = zInStream.read(buffer, offset, countToRead); - else - countRead = baseStream.Read(buffer, offset, countToRead); - inPos += countRead; - - // release the weak reference - if (inPos == maxInPos) - { - zInStream = null; - if (!Platform.IsMono()) - { - inBufferRef = new WeakReference(inBuffer, false); - inBuffer = null; - } - } - - return countRead; - } - - private void PrepareNextPacket() - { - MySqlStream.ReadFully(baseStream, lengthBytes, 0, 7); - int compressedLength = lengthBytes[0] + (lengthBytes[1] << 8) + (lengthBytes[2] << 16); - // lengthBytes[3] is seq - int unCompressedLength = lengthBytes[4] + (lengthBytes[5] << 8) + - (lengthBytes[6] << 16); - - if (unCompressedLength == 0) - { - unCompressedLength = compressedLength; - zInStream = null; - } - else - { - ReadNextPacket(compressedLength); - MemoryStream ms = new MemoryStream(inBuffer); - zInStream = new ZInputStream(ms) { maxInput = compressedLength }; - } - - inPos = 0; - maxInPos = unCompressedLength; - } - - private void ReadNextPacket(int len) - { - if (!Platform.IsMono()) - inBuffer = inBufferRef.Target as byte[]; - - if (inBuffer == null || inBuffer.Length < len) - inBuffer = new byte[len]; - MySqlStream.ReadFully(baseStream, inBuffer, 0, len); - } - - private MemoryStream CompressCache() - { - // small arrays almost never yeild a benefit from compressing - if (cache.Length < 50) - return null; - -#if NETCORE10 - byte[] cacheBytes; - ArraySegment cacheBuffer; - var cacheResult = cache.TryGetBuffer(out cacheBuffer); - - if (cacheResult) - cacheBytes = cacheBuffer.ToArray(); - else // if the conversion fail, then just return null - return null; -#else - byte[] cacheBytes = cache.GetBuffer(); -#endif - - MemoryStream compressedBuffer = new MemoryStream(); - ZOutputStream zos = new ZOutputStream(compressedBuffer, zlibConst.Z_DEFAULT_COMPRESSION); - zos.Write(cacheBytes, 0, (int)cache.Length); - zos.finish(); - - // if the compression hasn't helped, then just return null - if (compressedBuffer.Length >= cache.Length) - return null; - return compressedBuffer; - } - - private void CompressAndSendCache() - { - long compressedLength, uncompressedLength; - - // we need to save the sequence byte that is written -#if NETCORE10 - byte[] cacheBuffer; - ArraySegment cacheContentArraySegment; - var cacheResult = cache.TryGetBuffer(out cacheContentArraySegment); - - if (cacheResult) - cacheBuffer = cacheContentArraySegment.ToArray(); - else - throw new InvalidDataException(); -#else - byte[] cacheBuffer = cache.GetBuffer(); -#endif - - byte seq = cacheBuffer[3]; - cacheBuffer[3] = 0; - - // first we compress our current cache - MemoryStream compressedBuffer = CompressCache(); - - // now we set our compressed and uncompressed lengths - // based on if our compression is going to help or not - MemoryStream memStream; - - if (compressedBuffer == null) - { - compressedLength = cache.Length; - uncompressedLength = 0; - memStream = cache; - } - else - { - compressedLength = compressedBuffer.Length; - uncompressedLength = cache.Length; - memStream = compressedBuffer; - } - - // Make space for length prefix (7 bytes) at the start of output - long dataLength = memStream.Length; - int bytesToWrite = (int)dataLength + 7; - memStream.SetLength(bytesToWrite); - -#if NETCORE10 - byte[] buffer; - ArraySegment contentArraySegment; - var result = memStream.TryGetBuffer(out contentArraySegment); - - if (result) - buffer = contentArraySegment.ToArray(); - else - throw new InvalidDataException(); - -#else - byte[] buffer = memStream.GetBuffer(); -#endif - Array.Copy(buffer, 0, buffer, 7, (int)dataLength); - - // Write length prefix - buffer[0] = (byte)(compressedLength & 0xff); - buffer[1] = (byte)((compressedLength >> 8) & 0xff); - buffer[2] = (byte)((compressedLength >> 16) & 0xff); - buffer[3] = seq; - buffer[4] = (byte)(uncompressedLength & 0xff); - buffer[5] = (byte)((uncompressedLength >> 8) & 0xff); - buffer[6] = (byte)((uncompressedLength >> 16) & 0xff); - - baseStream.Write(buffer, 0, bytesToWrite); - baseStream.Flush(); - cache.SetLength(0); - - compressedBuffer?.Dispose(); - } - - public override void Flush() - { - if (!InputDone()) return; - - CompressAndSendCache(); - } - - private bool InputDone() - { - // if we have not done so yet, see if we can calculate how many bytes we are expecting - if (baseStream is TimedStream && ((TimedStream)baseStream).IsClosed) return false; - if (cache.Length < 4) return false; -#if NETCORE10 - byte[] buf; - ArraySegment contentArraySegment; - var result = cache.TryGetBuffer(out contentArraySegment); - - if (result) - buf = contentArraySegment.ToArray(); - else - throw new InvalidDataException(); -#else - byte[] buf = cache.GetBuffer(); -#endif - int expectedLen = buf[0] + (buf[1] << 8) + (buf[2] << 16); - if (cache.Length < (expectedLen + 4)) return false; - return true; - } - - public override void WriteByte(byte value) - { - cache.WriteByte(value); - } - - public override void Write(byte[] buffer, int offset, int count) - { - cache.Write(buffer, offset, count); - } - - public override long Seek(long offset, SeekOrigin origin) - { - return baseStream.Seek(offset, origin); - } - } -} diff --git a/Source/MySql.Data/ConfigUtils.cs b/Source/MySql.Data/ConfigUtils.cs deleted file mode 100644 index c6cf1510d..000000000 --- a/Source/MySql.Data/ConfigUtils.cs +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -namespace MySql.Data.MySqlClient -{ -#if NETCORE10 - using Microsoft.Extensions.Configuration; - using System; - using System.Diagnostics; - using System.IO; - using System.Runtime.InteropServices; - - public class ConfigUtils - { - private IConfiguration _configuration; - public ConfigUtils(string settingsFile) - { - var builder = new ConfigurationBuilder() - .AddJsonFile(settingsFile, false); - _configuration = builder.Build(); - } - - public string GetValue(string section) - { - var value = _configuration?.GetSection(section).Value; - return value; - } - - public string GetPort() - { - return GetValue("MySql:Data:Port"); - } - } - - public enum PlatformRunning - { - Windows, - Linux, - OsX, - Unsupported - } - - public static class PlatformUtils - { - public static PlatformRunning OsPlatform - { - get { - if (File.Exists(@"/proc/sys/kernel/ostype")) - { - string osType = File.ReadAllText(@"/proc/sys/kernel/ostype"); - if (osType.StartsWith("Linux", StringComparison.OrdinalIgnoreCase)) - return PlatformRunning.Linux; - } - else if (File.Exists(@"/System/Library/CoreServices/SystemVersion.plist")) - return PlatformRunning.OsX; - else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - return PlatformRunning.Windows; - return PlatformRunning.Unsupported; - } - } - - public static string OSDescription() - { - return RuntimeInformation.OSDescription; - } - } -#endif -} diff --git a/Source/MySql.Data/Connection.cs b/Source/MySql.Data/Connection.cs deleted file mode 100644 index 19cd6d572..000000000 --- a/Source/MySql.Data/Connection.cs +++ /dev/null @@ -1,1012 +0,0 @@ -// Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.ComponentModel; -using System.Data; -using System.Data.Common; -using System.Threading; -using System.Threading.Tasks; -using MySql.Data.Common; - -using IsolationLevel = System.Data.IsolationLevel; - -#if NETCORE10 -using Microsoft.Extensions.Configuration; -using MySql.Data.MySqlClient.Interceptors; -#else -using MySql.Data.MySqlClient.Replication; -using System.Drawing.Design; -using System.Transactions; -#endif - -namespace MySql.Data.MySqlClient -{ - /// - public sealed partial class MySqlConnection : IDisposable - { - internal ConnectionState connectionState; - internal Driver driver; - internal bool hasBeenOpen; - private SchemaProvider _schemaProvider; - private ExceptionInterceptor _exceptionInterceptor; - internal CommandInterceptor commandInterceptor; - private bool _isKillQueryConnection; - private string _database; - private int _commandTimeout; - - /// - public event MySqlInfoMessageEventHandler InfoMessage; - - private static readonly Cache ConnectionStringCache = - new Cache(0, 25); - - /// - public MySqlConnection() - { - //TODO: add event data to StateChange docs - Settings = new MySqlConnectionStringBuilder(); - _database = String.Empty; - -#if NETCORE10 - //TODO: what is thi sabout - //ConnectionString = Startup.ConnectionString; -#endif - } - - /// - public MySqlConnection(string connectionString) - : this() - { - ConnectionString = connectionString; - } - - #region Destructor - ~MySqlConnection() - { - Dispose(); - } - #endregion - - #region Interal Methods & Properties - - internal PerformanceMonitor PerfMonitor { get; private set; } - - internal ProcedureCache ProcedureCache { get; private set; } - - internal MySqlConnectionStringBuilder Settings { get; private set; } - - internal MySqlDataReader Reader - { - get - { - return driver?.reader; - } - set - { - driver.reader = value; - IsInUse = driver.reader != null; - } - } - - internal void OnInfoMessage(MySqlInfoMessageEventArgs args) - { - InfoMessage?.Invoke(this, args); - } - - internal bool SoftClosed - { - get - { -#if !NETCORE10 - return (State == ConnectionState.Closed) && - driver != null && driver.currentTransaction != null; -#else - return (State == ConnectionState.Closed) && - driver != null; -#endif - } - } - - internal bool IsInUse { get; set; } - - #endregion - - #region Properties - - /// - /// Returns the id of the server thread this connection is executing on - /// - [Browsable(false)] - public int ServerThread => driver.ThreadID; - - /// - /// Gets the name of the MySQL server to which to connect. - /// - [Browsable(true)] - public override string DataSource => Settings.Server; - - /// - [Browsable(true)] - public override int ConnectionTimeout => (int)Settings.ConnectionTimeout; - - /// - [Browsable(true)] - public override string Database => _database; - - /// - /// Indicates if this connection should use compression when communicating with the server. - /// - [Browsable(false)] - public bool UseCompression => Settings.UseCompression; - - /// - [Browsable(false)] - public override ConnectionState State => connectionState; - - /// #if !NETCORE10 - [Browsable(false)] - public override string ServerVersion => driver.Version.ToString(); - - /// -#if !NETCORE10 - [Editor("MySql.Data.MySqlClient.Design.ConnectionStringTypeEditor,MySqlClient.Design", typeof(UITypeEditor))] - [Browsable(true)] - [Category("Data")] - [Description("Information used to connect to a DataSource, such as 'Server=xxx;UserId=yyy;Password=zzz;Database=dbdb'.")] -#endif - public override string ConnectionString - { - get - { - // Always return exactly what the user set. - // Security-sensitive information may be removed. - return Settings.GetConnectionString(!hasBeenOpen || Settings.PersistSecurityInfo); - } - set - { - if (State != ConnectionState.Closed) - Throw(new MySqlException( - "Not allowed to change the 'ConnectionString' property while the connection (state=" + State + ").")); - - MySqlConnectionStringBuilder newSettings; - lock (ConnectionStringCache) - { - if (value == null) - newSettings = new MySqlConnectionStringBuilder(); - else - { - newSettings = ConnectionStringCache[value]; - if (null == newSettings) - { - newSettings = new MySqlConnectionStringBuilder(value); - ConnectionStringCache.Add(value, newSettings); - } - } - } - - Settings = newSettings; - - if (!string.IsNullOrEmpty(Settings.Database)) - _database = Settings.Database; - - if (driver != null) - driver.Settings = newSettings; - } - } - -#if !NETCORE10 - protected override DbProviderFactory DbProviderFactory => MySqlClientFactory.Instance; -#endif - public bool IsPasswordExpired => driver.IsPasswordExpired; - - #endregion - - partial void AssertPermissions(); - - #region Transactions - /// - public new MySqlTransaction BeginTransaction() - { - return BeginTransaction(IsolationLevel.RepeatableRead); - } - - /// - public new MySqlTransaction BeginTransaction(IsolationLevel iso) - { - //TODO: check note in help - if (State != ConnectionState.Open) - Throw(new InvalidOperationException(Resources.ConnectionNotOpen)); - - // First check to see if we are in a current transaction - if (driver.HasStatus(ServerStatusFlags.InTransaction)) - Throw(new InvalidOperationException(Resources.NoNestedTransactions)); - - MySqlTransaction t = new MySqlTransaction(this, iso); - - MySqlCommand cmd = new MySqlCommand("", this); - - cmd.CommandText = "SET SESSION TRANSACTION ISOLATION LEVEL "; - switch (iso) - { - case IsolationLevel.ReadCommitted: - cmd.CommandText += "READ COMMITTED"; - break; - case IsolationLevel.ReadUncommitted: - cmd.CommandText += "READ UNCOMMITTED"; - break; - case IsolationLevel.RepeatableRead: - cmd.CommandText += "REPEATABLE READ"; - break; - case IsolationLevel.Serializable: - cmd.CommandText += "SERIALIZABLE"; - break; - case IsolationLevel.Chaos: - Throw(new NotSupportedException(Resources.ChaosNotSupported)); - break; - case IsolationLevel.Snapshot: - Throw(new NotSupportedException(Resources.SnapshotNotSupported)); - break; - } - - cmd.ExecuteNonQuery(); - - cmd.CommandText = "BEGIN"; - cmd.CommandType = CommandType.Text; - cmd.ExecuteNonQuery(); - - return t; - } - - #endregion - - /// - public override void ChangeDatabase(string databaseName) - { - if (databaseName == null || databaseName.Trim().Length == 0) - Throw(new ArgumentException(Resources.ParameterIsInvalid, "databaseName")); - - if (State != ConnectionState.Open) - Throw(new InvalidOperationException(Resources.ConnectionNotOpen)); - - // This lock prevents promotable transaction rollback to run - // in parallel - lock (driver) - { - // We use default command timeout for SetDatabase - using (new CommandTimer(this, (int)Settings.DefaultCommandTimeout)) - { - driver.SetDatabase(databaseName); - } - } - this._database = databaseName; - } - - internal void SetState(ConnectionState newConnectionState, bool broadcast) - { - if (newConnectionState == connectionState && !broadcast) - return; - ConnectionState oldConnectionState = connectionState; - connectionState = newConnectionState; - if (broadcast) - OnStateChange(new StateChangeEventArgs(oldConnectionState, connectionState)); - } - - /// - /// Ping - /// - /// - public bool Ping() - { - if (Reader != null) - Throw(new MySqlException(Resources.DataReaderOpen)); - if (driver != null && driver.Ping()) - return true; - driver = null; - SetState(ConnectionState.Closed, true); - return false; - } - - /// - public override void Open() - { - if (State == ConnectionState.Open) - Throw(new InvalidOperationException(Resources.ConnectionAlreadyOpen)); - - // start up our interceptors - _exceptionInterceptor = new ExceptionInterceptor(this); - commandInterceptor = new CommandInterceptor(this); - - SetState(ConnectionState.Connecting, true); - - AssertPermissions(); -#if !NETCORE10 - - //TODO: SUPPORT FOR 452 AND 46X - // if we are auto enlisting in a current transaction, then we will be - // treating the connection as pooled - if (Settings.AutoEnlist && Transaction.Current != null) - { - driver = DriverTransactionManager.GetDriverInTransaction(Transaction.Current); - if (driver != null && - (driver.IsInActiveUse || - !driver.Settings.EquivalentTo(this.Settings))) - Throw(new NotSupportedException(Resources.MultipleConnectionsInTransactionNotSupported)); - } - -#endif - try - { - MySqlConnectionStringBuilder currentSettings = Settings; - - //TODO: SUPPORT FOR 452 AND 46X - // Load balancing -#if !NETCORE10 - if (ReplicationManager.IsReplicationGroup(Settings.Server)) - { - if (driver == null) - { - ReplicationManager.GetNewConnection(Settings.Server, false, this); - } - else - currentSettings = driver.Settings; - } -#endif - - if (Settings.Pooling) - { - MySqlPool pool = MySqlPoolManager.GetPool(currentSettings); - if (driver == null || !driver.IsOpen) - driver = pool.GetConnection(); - ProcedureCache = pool.ProcedureCache; - - } - else - { - if (driver == null || !driver.IsOpen) - driver = Driver.Create(currentSettings); - ProcedureCache = new ProcedureCache((int)Settings.ProcedureCacheSize); - } - } - catch (Exception) - { - SetState(ConnectionState.Closed, true); - throw; - } - - SetState(ConnectionState.Open, false); - driver.Configure(this); - - if (!(driver.SupportsPasswordExpiration && driver.IsPasswordExpired)) - { - if (!string.IsNullOrEmpty(Settings.Database)) - ChangeDatabase(Settings.Database); - } - - // setup our schema provider - _schemaProvider = new ISSchemaProvider(this); - PerfMonitor = new PerformanceMonitor(this); - - // if we are opening up inside a current transaction, then autoenlist - // TODO: control this with a connection string option -#if !NETCORE10 - if (Transaction.Current != null && Settings.AutoEnlist) - EnlistTransaction(Transaction.Current); -#endif - - hasBeenOpen = true; - SetState(ConnectionState.Open, true); - } - - /// - public new MySqlCommand CreateCommand() - { - // Return a new instance of a command object. - MySqlCommand c = new MySqlCommand(); - c.Connection = this; - return c; - } - - /// - /// Creates a new MySqlConnection object with the exact same ConnectionString value - /// - /// A cloned MySqlConnection object - public object Clone() - { - MySqlConnection clone = new MySqlConnection(); - string connectionString = Settings.ConnectionString; - if (connectionString != null) - clone.ConnectionString = connectionString; - return clone; - } - - internal void Abort() - { - try - { - driver.Close(); - } - catch (Exception ex) - { - MySqlTrace.LogWarning(ServerThread, String.Concat("Error occurred aborting the connection. Exception was: ", ex.Message)); - } - finally - { - this.IsInUse = false; - } - SetState(ConnectionState.Closed, true); - } - - internal void CloseFully() - { - if (Settings.Pooling && driver.IsOpen) - { -#if !NETCORE10 - //TODO: SUPPORT FOR 452 AND 46X - //// if we are in a transaction, roll it back - if (driver.HasStatus(ServerStatusFlags.InTransaction)) - { - MySql.Data.MySqlClient.MySqlTransaction t = new MySql.Data.MySqlClient.MySqlTransaction(this, IsolationLevel.Unspecified); - t.Rollback(); - } -#endif - - MySqlPoolManager.ReleaseConnection(driver); - } - else - driver.Close(); - driver = null; - } - - /// - public override void Close() - { - if (driver != null) - driver.IsPasswordExpired = false; - - if (State == ConnectionState.Closed) return; - - if (Reader != null) - Reader.Close(); - - // if the reader was opened with CloseConnection then driver - // will be null on the second time through - if (driver != null) - { -#if !NETCORE10 - //TODO: Add support for 452 and 46X - if (driver.currentTransaction == null) -#endif - CloseFully(); -#if !NETCORE10 - //TODO: Add support for 452 and 46X - else - driver.IsInActiveUse = false; -#endif - } - - SetState(ConnectionState.Closed, true); - } - - internal string CurrentDatabase() - { - if (!string.IsNullOrEmpty(Database)) - return Database; - MySqlCommand cmd = new MySqlCommand("SELECT database()", this); - return cmd.ExecuteScalar().ToString(); - } - - -#if !NETCORE10 - /// - /// Enlists in the specified transaction. - /// - /// - /// A reference to an existing in which to enlist. - /// - public override void EnlistTransaction(Transaction transaction) - { - // enlisting in the null transaction is a noop - if (transaction == null) - return; - - // guard against trying to enlist in more than one transaction - if (driver.currentTransaction != null) - { - if (driver.currentTransaction.BaseTransaction == transaction) - return; - - Throw(new MySqlException("Already enlisted")); - } - - // now see if we need to swap out drivers. We would need to do this since - // we have to make sure all ops for a given transaction are done on the - // same physical connection. - Driver existingDriver = DriverTransactionManager.GetDriverInTransaction(transaction); - if (existingDriver != null) - { - // we can't allow more than one driver to contribute to the same connection - if (existingDriver.IsInActiveUse) - Throw(new NotSupportedException(Resources.MultipleConnectionsInTransactionNotSupported)); - - // there is an existing driver and it's not being currently used. - // now we need to see if it is using the same connection string - string text1 = existingDriver.Settings.ConnectionString; - string text2 = Settings.ConnectionString; - if (String.Compare(text1, text2, true) != 0) - Throw(new NotSupportedException(Resources.MultipleConnectionsInTransactionNotSupported)); - - // close existing driver - // set this new driver as our existing driver - CloseFully(); - driver = existingDriver; - } - - if (driver.currentTransaction == null) - { - MySqlPromotableTransaction t = new MySqlPromotableTransaction(this, transaction); - if (!transaction.EnlistPromotableSinglePhase(t)) - Throw(new NotSupportedException(Resources.DistributedTxnNotSupported)); - - driver.currentTransaction = t; - DriverTransactionManager.SetDriverInTransaction(driver); - driver.IsInActiveUse = true; - } - } -#endif - - - internal void HandleTimeoutOrThreadAbort(Exception ex) - { - bool isFatal = false; - - if (_isKillQueryConnection) - { - // Special connection started to cancel a query. - // Abort will prevent recursive connection spawning - Abort(); - if (ex is TimeoutException) - { - Throw(new MySqlException(Resources.Timeout, true, ex)); - } - else - { - return; - } - } - - try - { - - // Do a fast cancel.The reason behind small values for connection - // and command timeout is that we do not want user to wait longer - // after command has already expired. - // Microsoft's SqlClient seems to be using 5 seconds timeouts - // here as well. - // Read the error packet with "interrupted" message. - CancelQuery(5); - driver.ResetTimeout(5000); - if (Reader != null) - { - Reader.Close(); - Reader = null; - } - } - catch (Exception ex2) - { - MySqlTrace.LogWarning(ServerThread, "Could not kill query, " + - " aborting connection. Exception was " + ex2.Message); - Abort(); - isFatal = true; - } - if (ex is TimeoutException) - { - Throw(new MySqlException(Resources.Timeout, isFatal, ex)); - } - } - - public void CancelQuery(int timeout) - { - MySqlConnectionStringBuilder cb = new MySqlConnectionStringBuilder( - Settings.ConnectionString); - cb.Pooling = false; - cb.AutoEnlist = false; - cb.ConnectionTimeout = (uint)timeout; - - using (MySqlConnection c = new MySqlConnection(cb.ConnectionString)) - { - c._isKillQueryConnection = true; - c.Open(); - string commandText = "KILL QUERY " + ServerThread; - MySqlCommand cmd = new MySqlCommand(commandText, c) {CommandTimeout = timeout}; - cmd.ExecuteNonQuery(); - } - } - -#region Routines for timeout support. - - // Problem description: - // Sometimes, ExecuteReader is called recursively. This is the case if - // command behaviors are used and we issue "set sql_select_limit" - // before and after command. This is also the case with prepared - // statements , where we set session variables. In these situations, we - // have to prevent recursive ExecuteReader calls from overwriting - // timeouts set by the top level command. - - // To solve the problem, SetCommandTimeout() and ClearCommandTimeout() are - // introduced . Query timeout here is "sticky", that is once set with - // SetCommandTimeout, it only be overwritten after ClearCommandTimeout - // (SetCommandTimeout would return false if it timeout has not been - // cleared). - - // The proposed usage pattern of there routines is following: - // When timed operations starts, issue SetCommandTimeout(). When it - // finishes, issue ClearCommandTimeout(), but _only_ if call to - // SetCommandTimeout() was successful. - - - /// - /// Sets query timeout. If timeout has been set prior and not - /// yet cleared ClearCommandTimeout(), it has no effect. - /// - /// timeout in seconds - /// true if - internal bool SetCommandTimeout(int value) - { - if (!hasBeenOpen) - // Connection timeout is handled by driver - return false; - - if (_commandTimeout != 0) - // someone is trying to set a timeout while command is already - // running. It could be for example recursive call to ExecuteReader - // Ignore the request, as only top-level (non-recursive commands) - // can set timeouts. - return false; - - if (driver == null) - return false; - - _commandTimeout = value; - driver.ResetTimeout(_commandTimeout * 1000); - return true; - } - - /// - /// Clears query timeout, allowing next SetCommandTimeout() to succeed. - /// - internal void ClearCommandTimeout() - { - if (!hasBeenOpen) - return; - _commandTimeout = 0; - driver?.ResetTimeout(0); - } -#endregion - - public MySqlSchemaCollection GetSchemaCollection(string collectionName, string[] restrictionValues) - { - if (collectionName == null) - collectionName = SchemaProvider.MetaCollection; - - string[] restrictions = _schemaProvider.CleanRestrictions(restrictionValues); - MySqlSchemaCollection c = _schemaProvider.GetSchema(collectionName, restrictions); - return c; - } - -#region Pool Routines - - /// - public static void ClearPool(MySqlConnection connection) - { - MySqlPoolManager.ClearPool(connection.Settings); - } - - /// - public static void ClearAllPools() - { - MySqlPoolManager.ClearAllPools(); - } - -#endregion - - internal void Throw(Exception ex) - { -#if !NETCORE10 - if (_exceptionInterceptor == null) - throw ex; - _exceptionInterceptor.Throw(ex); -#else - throw ex; -#endif - } - - public new void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - -#region Async - /// - /// Async version of BeginTransaction - /// - /// An object representing the new transaction. - public Task BeginTransactionAsync() - { - return BeginTransactionAsync(IsolationLevel.RepeatableRead, CancellationToken.None); - } - - public Task BeginTransactionAsync(CancellationToken cancellationToken) - { - return BeginTransactionAsync(IsolationLevel.RepeatableRead, cancellationToken); - } - - /// - /// Async version of BeginTransaction - /// - /// The isolation level under which the transaction should run. - /// An object representing the new transaction. - public Task BeginTransactionAsync(IsolationLevel iso) - { - return BeginTransactionAsync(iso, CancellationToken.None); - } - - public Task BeginTransactionAsync(IsolationLevel iso, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - MySqlTransaction tranResult = BeginTransaction(iso); - result.SetResult(tranResult); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - - return result.Task; - } - - public Task ChangeDataBaseAsync(string databaseName) - { - return ChangeDataBaseAsync(databaseName, CancellationToken.None); - } - - /// - /// Async version of ChangeDataBase - /// - /// The name of the database to use. - /// Cancellation Token. - /// - public Task ChangeDataBaseAsync(string databaseName, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - ChangeDatabase(databaseName); - result.SetResult(true); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - return result.Task; - } - - ///// - ///// Async version of Open - ///// - ///// - //public Task OpenAsync() - //{ - // return Task.Run(() => - // { - // Open(); - // }); - //} - - /// - /// Async version of Close - /// - /// - public Task CloseAsync() - { - return CloseAsync(CancellationToken.None); - } - - public Task CloseAsync(CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - Close(); - result.SetResult(true); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of ClearPool - /// - /// The connection associated with the pool to be cleared. - /// - public Task ClearPoolAsync(MySqlConnection connection) - { - return ClearPoolAsync(connection, CancellationToken.None); - } - - public Task ClearPoolAsync(MySqlConnection connection, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - ClearPool(connection); - result.SetResult(true); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of ClearAllPools - /// - /// - public Task ClearAllPoolsAsync() - { - return ClearAllPoolsAsync(CancellationToken.None); - } - - public Task ClearAllPoolsAsync(CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - ClearAllPools(); - result.SetResult(true); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - /// - /// Async version of GetSchemaCollection - /// - /// Name of the collection - /// Values to restrict - /// A schema collection - public Task GetSchemaCollectionAsync(string collectionName, string[] restrictionValues) - { - return GetSchemaCollectionAsync(collectionName, restrictionValues, CancellationToken.None); - } - - public Task GetSchemaCollectionAsync(string collectionName, string[] restrictionValues, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var schema = GetSchemaCollection(collectionName, restrictionValues); - result.SetResult(schema); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } -#endregion - } - - /// - /// Represents the method that will handle the event of a - /// . - /// - public delegate void MySqlInfoMessageEventHandler(object sender, MySqlInfoMessageEventArgs args); - - /// - /// Provides data for the InfoMessage event. This class cannot be inherited. - /// - public class MySqlInfoMessageEventArgs : EventArgs - { - /// - /// - /// - public MySqlError[] errors { get; set; } - } - - /// - /// IDisposable wrapper around SetCommandTimeout and ClearCommandTimeout - /// functionality - /// - internal class CommandTimer : IDisposable - { - private bool _timeoutSet; - private MySqlConnection _connection; - - public CommandTimer(MySqlConnection connection, int timeout) - { - _connection = connection; - if (connection != null) - { - _timeoutSet = connection.SetCommandTimeout(timeout); - } - } - -#region IDisposable Members - public void Dispose() - { - if (!_timeoutSet) return; - - _timeoutSet = false; - _connection.ClearCommandTimeout(); - _connection = null; - } -#endregion - } -} diff --git a/Source/MySql.Data/Content/ReleaseNotes.txt b/Source/MySql.Data/Content/ReleaseNotes.txt deleted file mode 100644 index 49f5fffef..000000000 --- a/Source/MySql.Data/Content/ReleaseNotes.txt +++ /dev/null @@ -1,12 +0,0 @@ -Connector/Net 7.0 Release Notes ------------------------------------- - -Welcome to the release notes for Connector/Net 7.0 - -What's new in 7.0 --------------------- - -- Entity Framework Core support -- .NET Core Support - -Be sure and check the documentation for more information on these new features. \ No newline at end of file diff --git a/Source/MySql.Data/Driver.cs b/Source/MySql.Data/Driver.cs deleted file mode 100644 index c1095829b..000000000 --- a/Source/MySql.Data/Driver.cs +++ /dev/null @@ -1,542 +0,0 @@ -// Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Security; -using System.Text; -using MySql.Data.Common; -using MySql.Data.Types; -using System.IO; - -namespace MySql.Data.MySqlClient -{ - /// - /// Summary description for BaseDriver. - /// - internal partial class Driver : IDisposable - { - protected Encoding encoding; - protected MySqlConnectionStringBuilder ConnectionString; - protected DateTime creationTime; - protected string serverCharSet; - protected Dictionary serverProps; - internal int timeZoneOffset; - private bool firstResult; - protected IDriver handler; - internal MySqlDataReader reader; - private bool disposeInProgress; - internal bool isFabric; - - /// - /// For pooled connections, time when the driver was - /// put into idle queue - /// - public DateTime IdleSince { get; set; } - - public Driver(MySqlConnectionStringBuilder settings) - { - encoding = Encoding.GetEncoding("UTF-8"); - if (encoding == null) - throw new MySqlException(Resources.DefaultEncodingNotFound); - ConnectionString = settings; - serverCharSet = "utf8"; - ConnectionCharSetIndex = -1; - MaxPacketSize = 1024; - handler = new NativeDriver(this); - } - - ~Driver() - { - Dispose(false); - } - - #region Properties - - public int ThreadID => handler.ThreadId; - - public DBVersion Version => handler.Version; - - public MySqlConnectionStringBuilder Settings - { - get { return ConnectionString; } - set { ConnectionString = value; } - } - public Encoding Encoding - { - get { return encoding; } - set { encoding = value; } - } - -#if !NETCORE10 - public MySqlPromotableTransaction currentTransaction { get; set; } - - public bool IsInActiveUse { get; set; } -#endif - - public bool IsOpen { get; protected set; } - - public MySqlPool Pool { get; set; } - - public long MaxPacketSize { get; protected set; } - - protected internal int ConnectionCharSetIndex { get; set; } - - protected internal Dictionary CharacterSets { get; protected set; } - - public bool SupportsOutputParameters => Version.isAtLeast(5, 5, 0); - - public bool SupportsBatch => (handler.Flags & ClientFlags.MULTI_STATEMENTS) != 0; - - public bool SupportsConnectAttrs => (handler.Flags & ClientFlags.CONNECT_ATTRS) != 0; - - public bool SupportsPasswordExpiration => (handler.Flags & ClientFlags.CAN_HANDLE_EXPIRED_PASSWORD) != 0; - - public bool IsPasswordExpired { get; internal set; } - #endregion - - public string Property(string key) - { - return serverProps[key]; - } - - public bool ConnectionLifetimeExpired() - { - TimeSpan ts = DateTime.Now.Subtract(creationTime); - return Settings.ConnectionLifeTime != 0 && - ts.TotalSeconds > Settings.ConnectionLifeTime; - } - - public static Driver Create(MySqlConnectionStringBuilder settings) - { - Driver d = null; - - try - { -#if !NETCORE10 - if (MySqlTrace.QueryAnalysisEnabled || settings.Logging || settings.UseUsageAdvisor) - d = new TracingDriver(settings); -#endif - } - catch (TypeInitializationException ex) - { - if (!(ex.InnerException is SecurityException)) - throw ex; - //Only rethrow if InnerException is not a SecurityException. If it is a SecurityException then - //we couldn't initialize MySqlTrace because we don't have unmanaged code permissions. - } - if (d == null) - d = new Driver(settings); - - //this try was added as suggested fix submitted on MySql Bug 72025, socket connections are left in CLOSE_WAIT status when connector fails to open a new connection. - //the bug is present when the client try to get more connections that the server support or has configured in the max_connections variable. - try - { - d.Open(); - } - catch - { - d.Dispose(); - throw; - } - return d; - } - - public bool HasStatus(ServerStatusFlags flag) - { - return (handler.ServerStatus & flag) != 0; - } - - public virtual void Open() - { - int count = 0; - do - { - try - { - creationTime = DateTime.Now; - handler.Open(); - IsOpen = true; - break; - } - catch (IOException) - { - if (count++ >= 5) throw; - } - } while (true); - } - - public virtual void Close() - { - Dispose(); - } - - public virtual void Configure(MySqlConnection connection) - { - bool firstConfigure = false; - - // if we have not already configured our server variables - // then do so now - if (serverProps == null) - { - firstConfigure = true; - - // if we are in a pool and the user has said it's ok to cache the - // properties, then grab it from the pool - try - { - if (Pool != null && Settings.CacheServerProperties) - { - if (Pool.ServerProperties == null) - Pool.ServerProperties = LoadServerProperties(connection); - serverProps = Pool.ServerProperties; - } - else - serverProps = LoadServerProperties(connection); - - LoadCharacterSets(connection); - } - catch (MySqlException ex) - { - // expired password capability - if (ex.Number == 1820) - { - IsPasswordExpired = true; - return; - } - throw; - } - } - - -#if AUTHENTICATED - string licenseType = serverProps["license"]; - if (licenseType == null || licenseType.Length == 0 || - licenseType != "commercial") - throw new MySqlException( "This client library licensed only for use with commercially-licensed MySQL servers." ); -#endif - // if the user has indicated that we are not to reset - // the connection and this is not our first time through, - // then we are done. - if (!Settings.ConnectionReset && !firstConfigure) return; - - string charSet = ConnectionString.CharacterSet; - if (string.IsNullOrEmpty(charSet)) - { - if (ConnectionCharSetIndex >= 0 && CharacterSets.ContainsKey(ConnectionCharSetIndex)) - charSet = CharacterSets[ConnectionCharSetIndex]; - else - charSet = serverCharSet; - } - - if (serverProps.ContainsKey("max_allowed_packet")) - MaxPacketSize = Convert.ToInt64(serverProps["max_allowed_packet"]); - - // now tell the server which character set we will send queries in and which charset we - // want results in - MySqlCommand charSetCmd = new MySqlCommand("SET character_set_results=NULL", - connection) {InternallyCreated = true}; - - string clientCharSet; - serverProps.TryGetValue("character_set_client", out clientCharSet); - string connCharSet; - serverProps.TryGetValue("character_set_connection", out connCharSet); - if ((clientCharSet != null && clientCharSet.ToString() != charSet) || - (connCharSet != null && connCharSet.ToString() != charSet)) - { - MySqlCommand setNamesCmd = new MySqlCommand("SET NAMES " + charSet, connection); - setNamesCmd.InternallyCreated = true; - setNamesCmd.ExecuteNonQuery(); - } - charSetCmd.ExecuteNonQuery(); - - Encoding = CharSetMap.GetEncoding(Version, charSet ?? "utf-8"); - - handler.Configure(); - } - - /// - /// Loads the properties from the connected server into a hashtable - /// - /// - /// - private Dictionary LoadServerProperties(MySqlConnection connection) - { - // load server properties - Dictionary hash = new Dictionary(); - MySqlCommand cmd = new MySqlCommand("SHOW VARIABLES", connection); - try - { - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - while (reader.Read()) - { - string key = reader.GetString(0); - string value = reader.GetString(1); - hash[key] = value; - } - } - // Get time zone offset as numerical value - timeZoneOffset = GetTimeZoneOffset(connection); - return hash; - } - catch (Exception ex) - { - MySqlTrace.LogError(ThreadID, ex.Message); - throw; - } - } - - private int GetTimeZoneOffset(MySqlConnection con ) - { - MySqlCommand cmd = new MySqlCommand("SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP())", con); - TimeSpan? timeZoneDiff = cmd.ExecuteScalar() as TimeSpan?; - string timeZoneString = "0:00"; - if (timeZoneDiff.HasValue) - timeZoneString = timeZoneDiff.ToString(); - - return int.Parse(timeZoneString.Substring(0, timeZoneString.IndexOf(':'))); - } - - /// - /// Loads all the current character set names and ids for this server - /// into the charSets hashtable - /// - private void LoadCharacterSets(MySqlConnection connection) - { - MySqlCommand cmd = new MySqlCommand("SHOW COLLATION", connection); - - // now we load all the currently active collations - try - { - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - CharacterSets = new Dictionary(); - while (reader.Read()) - { - CharacterSets[Convert.ToInt32(reader["id"], NumberFormatInfo.InvariantInfo)] = - reader.GetString(reader.GetOrdinal("charset")); - } - } - } - catch (Exception ex) - { - MySqlTrace.LogError(ThreadID, ex.Message); - throw; - } - } - - public virtual List ReportWarnings(MySqlConnection connection) - { - List warnings = new List(); - - MySqlCommand cmd = new MySqlCommand("SHOW WARNINGS", connection) {InternallyCreated = true}; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - while (reader.Read()) - { - warnings.Add(new MySqlError(reader.GetString(0), - reader.GetInt32(1), reader.GetString(2))); - } - } - - MySqlInfoMessageEventArgs args = new MySqlInfoMessageEventArgs(); - args.errors = warnings.ToArray(); - connection?.OnInfoMessage(args); - return warnings; - } - - public virtual void SendQuery(MySqlPacket p) - { - handler.SendQuery(p); - firstResult = true; - } - - public virtual ResultSet NextResult(int statementId, bool force) - { - if (!force && !firstResult && !HasStatus(ServerStatusFlags.AnotherQuery | ServerStatusFlags.MoreResults)) - return null; - firstResult = false; - - int affectedRows = -1; - long insertedId = -1; - int fieldCount = GetResult(statementId, ref affectedRows, ref insertedId); - if (fieldCount == -1) - return null; - if (fieldCount > 0) - return new ResultSet(this, statementId, fieldCount); - else - return new ResultSet(affectedRows, insertedId); - } - - protected virtual int GetResult(int statementId, ref int affectedRows, ref long insertedId) - { - return handler.GetResult(ref affectedRows, ref insertedId); - } - - public virtual bool FetchDataRow(int statementId, int columns) - { - return handler.FetchDataRow(statementId, columns); - } - - public virtual bool SkipDataRow() - { - return FetchDataRow(-1, 0); - } - - public virtual void ExecuteDirect(string sql) - { - MySqlPacket p = new MySqlPacket(Encoding); - p.WriteString(sql); - SendQuery(p); - NextResult(0, false); - } - - public MySqlField[] GetColumns(int count) - { - MySqlField[] fields = new MySqlField[count]; - for (int i = 0; i < count; i++) - fields[i] = new MySqlField(this); - handler.GetColumnsData(fields); - - return fields; - } - - public virtual int PrepareStatement(string sql, ref MySqlField[] parameters) - { - return handler.PrepareStatement(sql, ref parameters); - } - - public IMySqlValue ReadColumnValue(int index, MySqlField field, IMySqlValue value) - { - return handler.ReadColumnValue(index, field, value); - } - - public void SkipColumnValue(IMySqlValue valObject) - { - handler.SkipColumnValue(valObject); - } - - public void ResetTimeout(int timeoutMilliseconds) - { - handler.ResetTimeout(timeoutMilliseconds); - } - - public bool Ping() - { - return handler.Ping(); - } - - public virtual void SetDatabase(string dbName) - { - handler.SetDatabase(dbName); - } - - public virtual void ExecuteStatement(MySqlPacket packetToExecute) - { - handler.ExecuteStatement(packetToExecute); - } - - - public virtual void CloseStatement(int id) - { - handler.CloseStatement(id); - } - - public virtual void Reset() - { - handler.Reset(); - } - - public virtual void CloseQuery(MySqlConnection connection, int statementId) - { - if (handler.WarningCount > 0) - ReportWarnings(connection); - } - -#region IDisposable Members - - protected virtual void Dispose(bool disposing) - { - // Avoid cyclic calls to Dispose. - if (disposeInProgress) - return; - - disposeInProgress = true; - - try - { - ResetTimeout(1000); - if (disposing) - handler.Close(IsOpen); - // if we are pooling, then release ourselves - if (ConnectionString.Pooling) - MySqlPoolManager.RemoveConnection(this); - } - catch (Exception) - { - if (disposing) - throw; - } - finally - { - reader = null; - IsOpen = false; - disposeInProgress = false; - } - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - -#endregion - } - - internal interface IDriver - { - int ThreadId { get; } - DBVersion Version { get; } - ServerStatusFlags ServerStatus { get; } - ClientFlags Flags { get; } - void Configure(); - void Open(); - void SendQuery(MySqlPacket packet); - void Close(bool isOpen); - bool Ping(); - int GetResult(ref int affectedRows, ref long insertedId); - bool FetchDataRow(int statementId, int columns); - int PrepareStatement(string sql, ref MySqlField[] parameters); - void ExecuteStatement(MySqlPacket packet); - void CloseStatement(int statementId); - void SetDatabase(string dbName); - void Reset(); - IMySqlValue ReadColumnValue(int index, MySqlField field, IMySqlValue valObject); - void SkipColumnValue(IMySqlValue valueObject); - void GetColumnsData(MySqlField[] columns); - void ResetTimeout(int timeout); - int WarningCount { get; } - } -} diff --git a/Source/MySql.Data/Exception.cs b/Source/MySql.Data/Exception.cs deleted file mode 100644 index f59fc83fb..000000000 --- a/Source/MySql.Data/Exception.cs +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using MySql.Data.MySqlClient; -using System.Data.Common; -using System.Runtime.Serialization; - -namespace MySql.Data.MySqlClient -{ - /// - /// The exception that is thrown when MySQL returns an error. This class cannot be inherited. - /// - /// -#if !NETCORE10 - [Serializable] -#endif - public sealed class MySqlException : DbException - { - internal MySqlException() - { - } - - internal MySqlException(string msg) - : base(msg) - { - } - - internal MySqlException(string msg, Exception ex) - : base(msg, ex) - { - } - - internal MySqlException(string msg, bool isFatal, Exception inner) - : base(msg, inner) - { - IsFatal = isFatal; - } - - internal MySqlException(string msg, int errno, Exception inner) - : this(msg, inner) - { - Number = errno; - Data.Add("Server Error Code", errno); - } - - internal MySqlException(string msg, int errno) - : this(msg, errno, null) - { - } - - internal MySqlException(UInt32 code, string sqlState, string msg) : base(msg) - { - Code = code; - SqlState = sqlState; - } - -#if !NETCORE10 - private MySqlException(SerializationInfo info, StreamingContext context) - : base(info, context) - { - } -#endif - - /// - /// Gets a number that identifies the type of error. - /// - public int Number { get; } - - /// - /// True if this exception was fatal and cause the closing of the connection, false otherwise. - /// - internal bool IsFatal { get; } - - internal bool IsQueryAborted => (Number == (int)MySqlErrorCode.QueryInterrupted || - Number == (int)MySqlErrorCode.FileSortAborted); - - public string SqlState { get; private set; } - - public UInt32 Code { get; private set; } - } -} diff --git a/Source/MySql.Data/Framework/MySqlCommand.cs b/Source/MySql.Data/Framework/MySqlCommand.cs deleted file mode 100644 index 86bac790e..000000000 --- a/Source/MySql.Data/Framework/MySqlCommand.cs +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright © 2004, 2013, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.ComponentModel; -using System.Data; -using System.Data.Common; -#if !NETCORE10 -using System.Drawing; -#endif - -namespace MySql.Data.MySqlClient -{ -#if !NETCORE10 - [ToolboxBitmap(typeof(MySqlCommand), "MySqlClient.resources.command.bmp")] - [DesignerCategory("Code")] -#endif - public sealed partial class MySqlCommand : DbCommand - { - partial void Constructor() - { - UpdatedRowSource = UpdateRowSource.Both; - } - - partial void PartialClone(MySqlCommand clone) - { - clone.UpdatedRowSource = UpdatedRowSource; - } - - /// - /// Gets or sets how command results are applied to the DataRow when used by the - /// Update method of the DbDataAdapter. - /// - public override UpdateRowSource UpdatedRowSource { get; set; } - - /// - /// Gets or sets a value indicating whether the command object should be visible in a Windows Form Designer control. - /// -#if !NETCORE10 - [Browsable(false)] -#endif - public override bool DesignTimeVisible { get; set; } - - protected override DbParameter CreateDbParameter() - { - return new MySqlParameter(); - } - - protected override DbConnection DbConnection - { - get { return Connection; } - set { Connection = (MySqlConnection)value; } - } - - protected override DbParameterCollection DbParameterCollection - { - get { return Parameters; } - } - - protected override DbTransaction DbTransaction - { - get { return Transaction; } - set { Transaction = (MySqlTransaction)value; } - } - - protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior) - { - return ExecuteReader(behavior); - } - } -} diff --git a/Source/MySql.Data/Framework/MySqlConnection.cs b/Source/MySql.Data/Framework/MySqlConnection.cs deleted file mode 100644 index 3ede9d91d..000000000 --- a/Source/MySql.Data/Framework/MySqlConnection.cs +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright © 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System; -using System.ComponentModel; -using System.Data; -using System.Data.Common; -using System.Security; -#if !NETCORE10 -using System.Drawing; -using System.Security.Permissions; -#endif - -namespace MySql.Data.MySqlClient -{ -#if !NETCORE10 - [ToolboxBitmap(typeof(MySqlConnection), "MySqlClient.resources.connection.bmp")] - [DesignerCategory("Code")] - [ToolboxItem(true)] - public sealed partial class MySqlConnection : DbConnection, ICloneable -#else - public sealed partial class MySqlConnection : DbConnection -#endif - { -#if !NETCORE10 - /// - /// Returns schema information for the data source of this . - /// - /// A that contains schema information. - public override DataTable GetSchema() - { - return GetSchema(null); - } - - /// - /// Returns schema information for the data source of this - /// using the specified string for the schema name. - /// - /// Specifies the name of the schema to return. - /// A that contains schema information. - public override DataTable GetSchema(string collectionName) - { - if (collectionName == null) - collectionName = SchemaProvider.MetaCollection; - - return GetSchema(collectionName, null); - } - - /// - /// Returns schema information for the data source of this - /// using the specified string for the schema name and the specified string array - /// for the restriction values. - /// - /// Specifies the name of the schema to return. - /// Specifies a set of restriction values for the requested schema. - /// A that contains schema information. - public override DataTable GetSchema(string collectionName, string[] restrictionValues) - { - if (collectionName == null) - collectionName = SchemaProvider.MetaCollection; - - string[] restrictions = _schemaProvider.CleanRestrictions(restrictionValues); - MySqlSchemaCollection c = _schemaProvider.GetSchema(collectionName, restrictions); - return c.AsDataTable(); - } -#endif - - protected override DbTransaction BeginDbTransaction(IsolationLevel isolationLevel) - { - if (isolationLevel == IsolationLevel.Unspecified) - return BeginTransaction(); - return BeginTransaction(isolationLevel); - } - - protected override DbCommand CreateDbCommand() - { - return CreateCommand(); - } - -#if !NETCORE10 - partial void AssertPermissions() - { - // Security Asserts can only be done when the assemblies - // are put in the GAC as documented in - // http://msdn.microsoft.com/en-us/library/ff648665.aspx - if (this.Settings.IncludeSecurityAsserts) - { - PermissionSet set = new PermissionSet(PermissionState.None); - set.AddPermission(new MySqlClientPermission(ConnectionString)); - set.Demand(); - MySqlSecurityPermission.CreatePermissionSet(true).Assert(); - } - } -#endif - -#region IDisposeable - - protected override void Dispose(bool disposing) - { - if (State == ConnectionState.Open) - Close(); - base.Dispose(disposing); - } - -#endregion - } -} diff --git a/Source/MySql.Data/Framework/MySqlConnectionStringBuilder.cs b/Source/MySql.Data/Framework/MySqlConnectionStringBuilder.cs deleted file mode 100644 index 44ee38f35..000000000 --- a/Source/MySql.Data/Framework/MySqlConnectionStringBuilder.cs +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright © 2004, 2013, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Data.Common; - -namespace MySql.Data.MySqlClient -{ - public sealed partial class MySqlConnectionStringBuilder : DbConnectionStringBuilder - { - } -} diff --git a/Source/MySql.Data/Framework/MySqlDataReader.cs b/Source/MySql.Data/Framework/MySqlDataReader.cs deleted file mode 100644 index beb2e4f07..000000000 --- a/Source/MySql.Data/Framework/MySqlDataReader.cs +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright © 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections; -using System.Data.Common; -using MySql.Data.Types; -using System.Data; - -namespace MySql.Data.MySqlClient -{ -#if NETCORE10 - public sealed partial class MySqlDataReader : DbDataReader -#else - public sealed partial class MySqlDataReader : DbDataReader, IDataReader, IDataRecord -#endif - { - /// - /// Gets a value indicating the depth of nesting for the current row. This method is not - /// supported currently and always returns 0. - /// - public override int Depth => 0; - - public MySqlGeometry GetMySqlGeometry(int i) - { - try - { - IMySqlValue v = GetFieldValue(i, false); - if (v is MySqlGeometry || v is MySqlBinary) - return new MySqlGeometry(MySqlDbType.Geometry, (Byte[])v.Value); - } - catch - { - Throw(new Exception("Can't get MySqlGeometry from value")); - } - return new MySqlGeometry(true); - } - - public MySqlGeometry GetMySqlGeometry(string column) - { - return GetMySqlGeometry(GetOrdinal(column)); - } - -#if !NETCORE10 - /// - /// Returns a DataTable that describes the column metadata of the MySqlDataReader. - /// - /// - public override DataTable GetSchemaTable() - { - // Only Results from SQL SELECT Queries - // get a DataTable for schema of the result - // otherwise, DataTable is null reference - if (FieldCount == 0) return null; - - DataTable dataTableSchema = new DataTable("SchemaTable"); - - dataTableSchema.Columns.Add("ColumnName", typeof(string)); - dataTableSchema.Columns.Add("ColumnOrdinal", typeof(int)); - dataTableSchema.Columns.Add("ColumnSize", typeof(int)); - dataTableSchema.Columns.Add("NumericPrecision", typeof(int)); - dataTableSchema.Columns.Add("NumericScale", typeof(int)); - dataTableSchema.Columns.Add("IsUnique", typeof(bool)); - dataTableSchema.Columns.Add("IsKey", typeof(bool)); - DataColumn dc = dataTableSchema.Columns["IsKey"]; - dc.AllowDBNull = true; // IsKey can have a DBNull - dataTableSchema.Columns.Add("BaseCatalogName", typeof(string)); - dataTableSchema.Columns.Add("BaseColumnName", typeof(string)); - dataTableSchema.Columns.Add("BaseSchemaName", typeof(string)); - dataTableSchema.Columns.Add("BaseTableName", typeof(string)); - dataTableSchema.Columns.Add("DataType", typeof(Type)); - dataTableSchema.Columns.Add("AllowDBNull", typeof(bool)); - dataTableSchema.Columns.Add("ProviderType", typeof(int)); - dataTableSchema.Columns.Add("IsAliased", typeof(bool)); - dataTableSchema.Columns.Add("IsExpression", typeof(bool)); - dataTableSchema.Columns.Add("IsIdentity", typeof(bool)); - dataTableSchema.Columns.Add("IsAutoIncrement", typeof(bool)); - dataTableSchema.Columns.Add("IsRowVersion", typeof(bool)); - dataTableSchema.Columns.Add("IsHidden", typeof(bool)); - dataTableSchema.Columns.Add("IsLong", typeof(bool)); - dataTableSchema.Columns.Add("IsReadOnly", typeof(bool)); - - int ord = 1; - for (int i = 0; i < FieldCount; i++) - { - MySqlField f = ResultSet.Fields[i]; - DataRow r = dataTableSchema.NewRow(); - r["ColumnName"] = f.ColumnName; - r["ColumnOrdinal"] = ord++; - r["ColumnSize"] = f.IsTextField ? f.ColumnLength / f.MaxLength : f.ColumnLength; - int prec = f.Precision; - int pscale = f.Scale; - if (prec != -1) - r["NumericPrecision"] = (short)prec; - if (pscale != -1) - r["NumericScale"] = (short)pscale; - r["DataType"] = GetFieldType(i); - r["ProviderType"] = (int)f.Type; - r["IsLong"] = f.IsBlob && f.ColumnLength > 255; - r["AllowDBNull"] = f.AllowsNull; - r["IsReadOnly"] = false; - r["IsRowVersion"] = false; - r["IsUnique"] = false; - r["IsKey"] = f.IsPrimaryKey; - r["IsAutoIncrement"] = f.IsAutoIncrement; - r["BaseSchemaName"] = f.DatabaseName; - r["BaseCatalogName"] = null; - r["BaseTableName"] = f.RealTableName; - r["BaseColumnName"] = f.OriginalColumnName; - - dataTableSchema.Rows.Add(r); - } - - return dataTableSchema; - } -#endif - - /// - /// Returns an that iterates through the . - /// - public override IEnumerator GetEnumerator() - { - //TODO: REMOVE WHEN DBENUMERATOR IS INCLUDED IN SYSTEM.DATA.COMMON -#if NETCORE10 - throw new NotImplementedException(); -#else - return new DbEnumerator(this, (CommandBehavior & CommandBehavior.CloseConnection) != 0); -#endif - } - } -} diff --git a/Source/MySql.Data/Framework/MySqlDateTime.cs b/Source/MySql.Data/Framework/MySqlDateTime.cs deleted file mode 100644 index e97c1d233..000000000 --- a/Source/MySql.Data/Framework/MySqlDateTime.cs +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright © 2004, 2013, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; - -namespace MySql.Data.Types -{ -#if !NETCORE10 - [Serializable] -#endif - public partial struct MySqlDateTime : IConvertible - { -#region IConvertible Members - - ulong IConvertible.ToUInt64(IFormatProvider provider) - { - return 0; - } - - sbyte IConvertible.ToSByte(IFormatProvider provider) - { - // TODO: Add MySqlDateTime.ToSByte implementation - return 0; - } - - double IConvertible.ToDouble(IFormatProvider provider) - { - return 0; - } - - DateTime IConvertible.ToDateTime(IFormatProvider provider) - { - return GetDateTime(); - } - - float IConvertible.ToSingle(IFormatProvider provider) - { - return 0; - } - - bool IConvertible.ToBoolean(IFormatProvider provider) - { - return false; - } - - int IConvertible.ToInt32(IFormatProvider provider) - { - return 0; - } - - ushort IConvertible.ToUInt16(IFormatProvider provider) - { - return 0; - } - - short IConvertible.ToInt16(IFormatProvider provider) - { - return 0; - } - - string System.IConvertible.ToString(IFormatProvider provider) - { - return null; - } - - byte IConvertible.ToByte(IFormatProvider provider) - { - return 0; - } - - char IConvertible.ToChar(IFormatProvider provider) - { - return '\0'; - } - - long IConvertible.ToInt64(IFormatProvider provider) - { - return 0; - } - - System.TypeCode IConvertible.GetTypeCode() - { - return new System.TypeCode(); - } - - decimal IConvertible.ToDecimal(IFormatProvider provider) - { - return 0; - } - - object IConvertible.ToType(Type conversionType, IFormatProvider provider) - { - return null; - } - - uint IConvertible.ToUInt32(IFormatProvider provider) - { - return 0; - } - -#endregion - - } -} diff --git a/Source/MySql.Data/Framework/MySqlParameter.cs b/Source/MySql.Data/Framework/MySqlParameter.cs deleted file mode 100644 index 91bc6c5b8..000000000 --- a/Source/MySql.Data/Framework/MySqlParameter.cs +++ /dev/null @@ -1,377 +0,0 @@ -// Copyright © 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.ComponentModel; -using System.Data; -using System.Data.Common; -using System.Globalization; -using System.Reflection; -using MySql.Data.MySqlClient; -#if !NETCORE10 -using System.ComponentModel.Design.Serialization; -using ParameterDirection = System.Data.ParameterDirection; -#endif - -namespace MySql.Data.MySqlClient -{ - [TypeConverter(typeof(MySqlParameterConverter))] -#if NETCORE10 - public sealed partial class MySqlParameter : DbParameter -#else - public sealed partial class MySqlParameter : DbParameter, IDbDataParameter -#endif - { - private DbType _dbType; - - /// - /// Initializes a new instance of the class with the parameter name, the , the size, and the source column name. - /// - /// The name of the parameter to map. - /// One of the values. - /// The length of the parameter. - /// The name of the source column. - public MySqlParameter(string parameterName, MySqlDbType dbType, int size, string sourceColumn) : this(parameterName, dbType) - { - Size = size; - Direction = ParameterDirection.Input; - SourceColumn = sourceColumn; -#if !NETCORE10 - SourceVersion = DataRowVersion.Current; -#endif - } - - /// - /// Initializes a new instance of the class with the parameter name, the type of the parameter, the size of the parameter, a , the precision of the parameter, the scale of the parameter, the source column, a to use, and the value of the parameter. - /// - /// The name of the parameter to map. - /// One of the values. - /// The length of the parameter. - /// One of the values. - /// true if the value of the field can be null, otherwise false. - /// The total number of digits to the left and right of the decimal point to which is resolved. - /// The total number of decimal places to which is resolved. - /// The name of the source column. - /// One of the values. - /// An that is the value of the . - /// -#if NETCORE10 - public MySqlParameter(string parameterName, MySqlDbType dbType, int size, ParameterDirection direction, - bool isNullable, byte precision, byte scale, string sourceColumn, object value) - : this(parameterName, dbType, size, sourceColumn) -#else - public MySqlParameter(string parameterName, MySqlDbType dbType, int size, ParameterDirection direction, - bool isNullable, byte precision, byte scale, string sourceColumn, - DataRowVersion sourceVersion, object value) - : this(parameterName, dbType, size, sourceColumn) -#endif - { - Direction = direction; - IsNullable = isNullable; - Precision = precision; - Scale = scale; - Value = value; -#if !NETCORE10 - SourceVersion = sourceVersion; -#endif - - } - -#if NETCORE10 - internal MySqlParameter(string name, MySqlDbType type, ParameterDirection dir, string col, object val) - : this(name, type) - -#else - internal MySqlParameter(string name, MySqlDbType type, ParameterDirection dir, string col, DataRowVersion sourceVersion, object val) - : this(name, type) -#endif - { - Direction = dir; - SourceColumn = col; - Value = val; -#if !NETCORE10 - SourceVersion = sourceVersion; -#endif - } - - partial void Init() - { -#if !NETCORE10 - SourceVersion = DataRowVersion.Current; -#endif - Direction = ParameterDirection.Input; - } - -#if !NETCORE10 - /// - /// Gets or sets the to use when loading . - /// - [Category("Data")] - public override DataRowVersion SourceVersion { get; set; } -#endif - - /// - /// Gets or sets the name of the source column that is mapped to the and used for loading or returning the . - /// -#if !NETCORE10 - [Category("Data")] -#endif - public override String SourceColumn { get; set; } - - /// - /// Resets the DbType property to its original settings. - /// - public override void ResetDbType() - { - _inferType = true; - } - - /// - /// Sets or gets a value which indicates whether the source column is nullable. - /// This allows to correctly generate Update statements - /// for nullable columns. - /// - public override bool SourceColumnNullMapping { get; set; } - - /// - /// Gets or sets the of the parameter. - /// - public override DbType DbType - { - get { return _dbType; } - set - { - SetDbType(value); - _inferType = false; - } - } - - partial void SetDbTypeFromMySqlDbType() - { - switch (_mySqlDbType) - { - case MySqlDbType.NewDecimal: - case MySqlDbType.Decimal: - _dbType = DbType.Decimal; - break; - case MySqlDbType.Byte: - _dbType = DbType.SByte; - break; - case MySqlDbType.UByte: - _dbType = DbType.Byte; - break; - case MySqlDbType.Int16: - _dbType = DbType.Int16; - break; - case MySqlDbType.UInt16: - _dbType = DbType.UInt16; - break; - case MySqlDbType.Int24: - case MySqlDbType.Int32: - _dbType = DbType.Int32; - break; - case MySqlDbType.UInt24: - case MySqlDbType.UInt32: - _dbType = DbType.UInt32; - break; - case MySqlDbType.Int64: - _dbType = DbType.Int64; - break; - case MySqlDbType.UInt64: - _dbType = DbType.UInt64; - break; - case MySqlDbType.Bit: - _dbType = DbType.UInt64; - break; - case MySqlDbType.Float: - _dbType = DbType.Single; - break; - case MySqlDbType.Double: - _dbType = DbType.Double; - break; - case MySqlDbType.Timestamp: - case MySqlDbType.DateTime: - _dbType = DbType.DateTime; - break; - case MySqlDbType.Date: - case MySqlDbType.Newdate: - case MySqlDbType.Year: - _dbType = DbType.Date; - break; - case MySqlDbType.Time: - _dbType = DbType.Time; - break; - case MySqlDbType.Enum: - case MySqlDbType.Set: - case MySqlDbType.VarChar: - _dbType = DbType.String; - break; - case MySqlDbType.TinyBlob: - case MySqlDbType.MediumBlob: - case MySqlDbType.LongBlob: - case MySqlDbType.Blob: - _dbType = DbType.Object; - break; - case MySqlDbType.String: - _dbType = DbType.StringFixedLength; - break; - case MySqlDbType.Guid: - _dbType = DbType.Guid; - break; - } - } - - - private void SetDbType(DbType dbType) - { - _dbType = dbType; - switch (_dbType) - { - case DbType.Guid: - _mySqlDbType = MySqlDbType.Guid; - break; - - case DbType.AnsiString: - case DbType.String: - _mySqlDbType = MySqlDbType.VarChar; - break; - - case DbType.AnsiStringFixedLength: - case DbType.StringFixedLength: - _mySqlDbType = MySqlDbType.String; - break; - - case DbType.Boolean: - case DbType.Byte: - _mySqlDbType = MySqlDbType.UByte; - break; - - case DbType.SByte: - _mySqlDbType = MySqlDbType.Byte; - break; - - case DbType.Date: - _mySqlDbType = MySqlDbType.Date; - break; - case DbType.DateTime: - _mySqlDbType = MySqlDbType.DateTime; - break; - - case DbType.Time: - _mySqlDbType = MySqlDbType.Time; - break; - case DbType.Single: - _mySqlDbType = MySqlDbType.Float; - break; - case DbType.Double: - _mySqlDbType = MySqlDbType.Double; - break; - - case DbType.Int16: - _mySqlDbType = MySqlDbType.Int16; - break; - case DbType.UInt16: - _mySqlDbType = MySqlDbType.UInt16; - break; - - case DbType.Int32: - _mySqlDbType = MySqlDbType.Int32; - break; - case DbType.UInt32: - _mySqlDbType = MySqlDbType.UInt32; - break; - - case DbType.Int64: - _mySqlDbType = MySqlDbType.Int64; - break; - case DbType.UInt64: - _mySqlDbType = MySqlDbType.UInt64; - break; - - case DbType.Decimal: - case DbType.Currency: - _mySqlDbType = MySqlDbType.Decimal; - break; - - case DbType.Object: - case DbType.VarNumeric: - case DbType.Binary: - default: - _mySqlDbType = MySqlDbType.Blob; - break; - } - - if (_dbType == DbType.Object) - { - var value = this._paramValue as byte[]; - if (value != null && value.Length == GEOMETRY_LENGTH) - _mySqlDbType = MySqlDbType.Geometry; - } - - ValueObject = MySqlField.GetIMySqlValue(_mySqlDbType); - } - } - - internal class MySqlParameterConverter : TypeConverter - { - - public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) - { -#if !NETCORE10 - if (destinationType == typeof(InstanceDescriptor)) - { - return true; - } -#endif - - // Always call the base to see if it can perform the conversion. - return base.CanConvertTo(context, destinationType); - } - - public override object ConvertTo(ITypeDescriptorContext context, - CultureInfo culture, object value, Type destinationType) - { -#if !NETCORE10 - if (destinationType == typeof(InstanceDescriptor)) - { - ConstructorInfo ci = typeof(MySqlParameter).GetConstructor( - new[] - { - typeof (string), typeof (MySqlDbType), typeof (int), typeof (ParameterDirection), - typeof (bool), typeof (byte), typeof (byte), typeof (string), - typeof (object) - }); - MySqlParameter p = (MySqlParameter)value; - return new InstanceDescriptor(ci, new object[] - { - p.ParameterName, p.DbType, p.Size, p.Direction, - p.IsNullable, p.Precision, - p.Scale, p.SourceColumn, p.Value - }); - } -#endif - - // Always call base, even if you can't convert. - return base.ConvertTo(context, culture, value, destinationType); - } - } -} diff --git a/Source/MySql.Data/Framework/MySqlParameterCollection.cs b/Source/MySql.Data/Framework/MySqlParameterCollection.cs deleted file mode 100644 index a574b25cb..000000000 --- a/Source/MySql.Data/Framework/MySqlParameterCollection.cs +++ /dev/null @@ -1,232 +0,0 @@ -// Copyright © 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections; -using System.ComponentModel; -using System.Data.Common; -using MySql.Data.MySqlClient; - -namespace MySql.Data.MySqlClient -{ -#if !NETCORE10 - [Editor("MySql.Data.MySqlClient.Design.DBParametersEditor,MySql.Design", typeof(System.Drawing.Design.UITypeEditor))] - [ListBindable(true)] -#endif - public sealed partial class MySqlParameterCollection : DbParameterCollection - { - /// - /// Adds a to the with the parameter name, the data type, the column length, and the source column name. - /// - /// The name of the parameter. - /// One of the values. - /// The length of the column. - /// The name of the source column. - /// The newly added object. - public MySqlParameter Add(string parameterName, MySqlDbType dbType, int size, string sourceColumn) - { - return Add(new MySqlParameter(parameterName, dbType, size, sourceColumn)); - } - -#region DbParameterCollection Implementation - - /// - /// Adds an array of values to the end of the . - /// - /// - public override void AddRange(Array values) - { - foreach (DbParameter p in values) - Add(p); - } - - /// - /// Retrieve the parameter with the given name. - /// - /// - /// - protected override DbParameter GetParameter(string parameterName) - { - return InternalGetParameter(parameterName); - } - - protected override DbParameter GetParameter(int index) - { - return InternalGetParameter(index); - } - - protected override void SetParameter(string parameterName, DbParameter value) - { - InternalSetParameter(parameterName, value as MySqlParameter); - } - - protected override void SetParameter(int index, DbParameter value) - { - InternalSetParameter(index, value as MySqlParameter); - } - - /// - /// Adds the specified object to the . - /// - /// The to add to the collection. - /// The index of the new object. - public override int Add(object value) - { - MySqlParameter parameter = value as MySqlParameter; - if (parameter == null) - throw new MySqlException("Only MySqlParameter objects may be stored"); - - parameter = Add(parameter); - return IndexOf(parameter); - } - - /// - /// Gets a value indicating whether a with the specified parameter name exists in the collection. - /// - /// The name of the object to find. - /// true if the collection contains the parameter; otherwise, false. - public override bool Contains(string parameterName) - { - return IndexOf(parameterName) != -1; - } - - /// - /// Gets a value indicating whether a MySqlParameter exists in the collection. - /// - /// The value of the object to find. - /// true if the collection contains the object; otherwise, false. - /// Gets a value indicating whether a exists in the collection. - public override bool Contains(object value) - { - MySqlParameter parameter = value as MySqlParameter; - if (null == parameter) - throw new ArgumentException("Argument must be of type DbParameter", nameof(value)); - return _items.Contains(parameter); - } - - /// - /// Copies MySqlParameter objects from the MySqlParameterCollection to the specified array. - /// - /// - /// - public override void CopyTo(Array array, int index) - { - _items.ToArray().CopyTo(array, index); - } - - /// - /// Returns an enumerator that iterates through the . - /// - /// - public override IEnumerator GetEnumerator() - { - return _items.GetEnumerator(); - } - - /// - /// Inserts a MySqlParameter into the collection at the specified index. - /// - /// - /// - public override void Insert(int index, object value) - { - MySqlParameter parameter = value as MySqlParameter; - if (parameter == null) - throw new MySqlException("Only MySqlParameter objects may be stored"); - InternalAdd(parameter, index); - } - -#if !NETCORE10 - /// - /// Gets a value that indicates whether the - /// has a fixed size. - /// - public override bool IsFixedSize - { - get { return (_items as IList).IsFixedSize; } - } - - /// - /// Gets a value that indicates whether the - /// is read-only. - /// - public override bool IsReadOnly - { - get { return (_items as IList).IsReadOnly; } - } - - /// - /// Gets a value that indicates whether the - /// is synchronized. - /// - public override bool IsSynchronized - { - get { return (_items as IList).IsSynchronized; } - } -#endif - - /// - /// Removes the specified MySqlParameter from the collection. - /// - /// - public override void Remove(object value) - { - MySqlParameter p = (value as MySqlParameter); - p.Collection = null; - int index = IndexOf(p); - _items.Remove(p); - - _indexHashCs.Remove(p.ParameterName); - _indexHashCi.Remove(p.ParameterName); - AdjustHashes(index, false); - } - - /// - /// Removes the specified from the collection using the parameter name. - /// - /// The name of the object to retrieve. - public override void RemoveAt(string parameterName) - { - DbParameter p = GetParameter(parameterName); - Remove(p); - } - - /// - /// Removes the specified from the collection using a specific index. - /// - /// The zero-based index of the parameter. - /// Removes the specified from the collection. - public override void RemoveAt(int index) - { - object o = _items[index]; - Remove(o); - } - - /// - /// Gets an object that can be used to synchronize access to the - /// . - /// - public override object SyncRoot => (_items as IList).SyncRoot; - -#endregion - } -} diff --git a/Source/MySql.Data/Framework/MySqlTransaction.cs b/Source/MySql.Data/Framework/MySqlTransaction.cs deleted file mode 100644 index 796cfa715..000000000 --- a/Source/MySql.Data/Framework/MySqlTransaction.cs +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright © 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Data.Common; -using System.Text; - -namespace MySql.Data.MySqlClient -{ - public sealed partial class MySqlTransaction : DbTransaction - { - protected override DbConnection DbConnection - { - get { return Connection; } - } - } - -} diff --git a/Source/MySql.Data/Framework/Net451/AuthenticationManager.cs b/Source/MySql.Data/Framework/Net451/AuthenticationManager.cs deleted file mode 100644 index d0f24b2a5..000000000 --- a/Source/MySql.Data/Framework/Net451/AuthenticationManager.cs +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright © 2012, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Reflection; -using MySql.Data.MySqlClient; - - -namespace MySql.Data.MySqlClient.Authentication -{ - internal partial class AuthenticationPluginManager - { - static partial void AuthenticationManagerCtorConfiguration() - { - //TODO: TEST (CHANGE THIS CODE TO AuthenticationManagerCtorConfiguration in 452 and 46 project) - Plugins["authentication_windows_client"] = new PluginInfo("MySql.Data.MySqlClient.Authentication.MySqlWindowsAuthenticationPlugin"); - if (MySqlConfiguration.Settings != null && MySqlConfiguration.Settings.AuthenticationPlugins != null) - { - foreach (AuthenticationPluginConfigurationElement e in MySqlConfiguration.Settings.AuthenticationPlugins) - Plugins[e.Name] = new PluginInfo(e.Type); - } - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data/Framework/Net451/MySqlTrace.cs b/Source/MySql.Data/Framework/Net451/MySqlTrace.cs deleted file mode 100644 index 500681c07..000000000 --- a/Source/MySql.Data/Framework/Net451/MySqlTrace.cs +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright © 2009, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Diagnostics; -using System.Linq; -using System.Reflection; - - -namespace MySql.Data.MySqlClient -{ - public class MySqlTrace - { - private static TraceSource source = new TraceSource("mysql"); - - static MySqlTrace() - { - foreach (TraceListener listener in source.Listeners.Cast().Where(listener => listener.GetType().ToString().Contains("MySql.EMTrace.EMTraceListener"))) - { - QueryAnalysisEnabled = true; - break; - } - } - - public static TraceListenerCollection Listeners { get; } = source.Listeners; - - public static SourceSwitch Switch - { - get { return source.Switch; } - set { source.Switch = value; } - } - - public static bool QueryAnalysisEnabled { get; set; } - - public static void EnableQueryAnalyzer(string host, int postInterval) - { - if (QueryAnalysisEnabled) return; - // create a EMTraceListener and add it to our source - TraceListener l = (TraceListener)Activator.CreateInstance(Type.GetType("MySql.EMTrace.EMTraceListener"), host, postInterval); - - if (l == null) - throw new MySqlException(Resources.UnableToEnableQueryAnalysis); - - source.Listeners.Add(l); - Switch.Level = SourceLevels.All; - } - - public static void DisableQueryAnalyzer() - { - QueryAnalysisEnabled = false; - foreach (TraceListener l in from TraceListener l in Source.Listeners where l.GetType().ToString().Contains("EMTraceListener") select l) - { - source.Listeners.Remove(l); - break; - } - } - - internal static TraceSource Source - { - get - { - return source; - } - } - - internal static void LogInformation(int id, string msg) - { - Source.TraceEvent(TraceEventType.Information, id, msg, MySqlTraceEventType.NonQuery, -1); - Trace.TraceInformation(msg); - } - - internal static void LogWarning(int id, string msg) - { - Source.TraceEvent(TraceEventType.Warning, id, msg, MySqlTraceEventType.NonQuery, -1); - Trace.TraceWarning(msg); - } - - internal static void LogError(int id, string msg) - { - Source.TraceEvent(TraceEventType.Error, id, msg, MySqlTraceEventType.NonQuery, -1); - Trace.TraceError(msg); - } - - internal static void TraceEvent(TraceEventType eventType, - MySqlTraceEventType mysqlEventType, string msgFormat, params object[] args) - { - Source.TraceEvent(eventType, (int)mysqlEventType, msgFormat, args); - } - } - - public enum UsageAdvisorWarningFlags - { - NoIndex = 1, - BadIndex, - SkippedRows, - SkippedColumns, - FieldConversion - } - - public enum MySqlTraceEventType : int - { - ConnectionOpened = 1, - ConnectionClosed, - QueryOpened, - ResultOpened, - ResultClosed, - QueryClosed, - StatementPrepared, - StatementExecuted, - StatementClosed, - NonQuery, - UsageAdvisorWarning, - Warning, - Error, - QueryNormalized - } -} diff --git a/Source/MySql.Data/Framework/NetCore10/Encoding.cs b/Source/MySql.Data/Framework/NetCore10/Encoding.cs deleted file mode 100644 index 005da8c76..000000000 --- a/Source/MySql.Data/Framework/NetCore10/Encoding.cs +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright © 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -namespace MySql.Data.MySqlClient.Framework.NetCore10 -{ - public class Encoding - { - private readonly System.Text.Encoding _defaultEncoding = new System.Text.UTF8Encoding(); - - public static Encoding Instance { get; } = new Encoding(); - - public static System.Text.Encoding Default => Instance._defaultEncoding; - } -} diff --git a/Source/MySql.Data/Framework/NetCore10/ExtensionMethods.cs b/Source/MySql.Data/Framework/NetCore10/ExtensionMethods.cs deleted file mode 100644 index 6ca8acb48..000000000 --- a/Source/MySql.Data/Framework/NetCore10/ExtensionMethods.cs +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections; - -namespace MySql.Data.Common -{ - public static class ExtensionMethods - { - public static void CopyTo(this BitArray bitArray, Array array, int index) - { - if (bitArray == null) throw new ArgumentNullException(nameof(bitArray)); - if (array == null) throw new ArgumentNullException(nameof(array)); - if (index < 0) throw new ArgumentOutOfRangeException(nameof(index)); - if (array.Rank != 1) throw new ArgumentException("array is multidimensional."); - - ArrayList newBuffer = new ArrayList(); - - for (int i = index; i < bitArray.Length; i++) - { - newBuffer.Add(bitArray[i]); - } - - newBuffer.CopyTo(array); - } - } -} diff --git a/Source/MySql.Data/Framework/NetCore10/Interfaces.cs b/Source/MySql.Data/Framework/NetCore10/Interfaces.cs deleted file mode 100644 index 8060e136c..000000000 --- a/Source/MySql.Data/Framework/NetCore10/Interfaces.cs +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; - -namespace MySql.Data.Common -{ - interface ICloneable - { - - } - - internal class DbProviderSpecificTypePropertyAttribute : Attribute - { - public DbProviderSpecificTypePropertyAttribute(bool b) { } - } -} - -namespace MySql.Data.MySqlClient.Replication -{ -} diff --git a/Source/MySql.Data/Framework/NetCore10/MySqlTrace.cs b/Source/MySql.Data/Framework/NetCore10/MySqlTrace.cs deleted file mode 100644 index acffce49d..000000000 --- a/Source/MySql.Data/Framework/NetCore10/MySqlTrace.cs +++ /dev/null @@ -1,196 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; - -namespace MySql.Data.MySqlClient -{ - public class MySqlTrace - { - - public static TraceListenerCollection Listeners - { - get { throw new NotImplementedException(); } - } - - public static SourceSwitch Switch - { - get - { - throw new NotImplementedException(); - } - set - { - throw new NotImplementedException(); - } - } - - public static bool QueryAnalysisEnabled - { - get { throw new NotImplementedException(); } - } - - public static void EnableQueryAnalyzer(string host, int postInterval) - { - throw new NotImplementedException(); - } - - public static void DisableQueryAnalyzer() - { - throw new NotImplementedException(); - } - - public static TraceSource Source - { - get { throw new NotImplementedException(); } - } - - public static void LogInformation(int id, string msg) - { - //TODO implement - } - - public static void LogWarning(int id, string msg) - { - //TODO implement - } - - public static void LogError(int id, string msg) - { - //TODO implement - } - - public static void TraceEvent(TraceEventType eventType, MySqlTraceEventType mysqlEventType, string msgFormat, params object[] args) - { - throw new NotImplementedException(); - } - } - - // These types are just placeholders to keep same api for MySqlTrace in both .NET & RT (ie. they supply missing types in .NET for RT). - public enum TraceEventType - { - Critical = 1, - Error = 2, - Warning = 3, - Information = 4, - Verbose = 5 - } - - - public class TraceListener - { - public virtual void Write(string message) { } - public virtual void WriteLine(string message) { } - } - - public class TraceListenerCollection - { - - public TraceListenerCollection Add() - { - throw new NotImplementedException(); - - } - - - public TraceListenerCollection Clear() - { - throw new NotImplementedException(); - - } - - } - - public class TraceSource - { - public void TraceEvent(TraceEventType type, int id, string msg, MySqlTraceEventType type2, int code) - { - throw new NotImplementedException(); - } - - public void TraceEvent(TraceEventType type, int id, string msg, params object[] args) - { - throw new NotImplementedException(); - } - } - - public class SourceSwitch - { - public SourceLevels Level { get; set; } - } - - public enum SourceLevels - { - All = 1, - None - } - - internal static class Trace - { - internal static void TraceInformation(string msg) - { - throw new NotImplementedException(); - } - - internal static void TraceWarning(string msg) - { - throw new NotImplementedException(); - } - - internal static void TraceError(string msg) - { - throw new NotImplementedException(); - } - - internal static void TraceEven(string msg) - { - throw new NotImplementedException(); - } - } - - public enum UsageAdvisorWarningFlags - { - NoIndex = 1, - BadIndex, - SkippedRows, - SkippedColumns, - FieldConversion - } - - public enum MySqlTraceEventType : int - { - ConnectionOpened = 1, - ConnectionClosed, - QueryOpened, - ResultOpened, - ResultClosed, - QueryClosed, - StatementPrepared, - StatementExecuted, - StatementClosed, - NonQuery, - UsageAdvisorWarning, - Warning, - Error, - QueryNormalized - } -} diff --git a/Source/MySql.Data/ISSchemaProvider.cs b/Source/MySql.Data/ISSchemaProvider.cs deleted file mode 100644 index fcdef05f2..000000000 --- a/Source/MySql.Data/ISSchemaProvider.cs +++ /dev/null @@ -1,728 +0,0 @@ -// Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Text; -using MySql.Data.Common; -using MySql.Data.Types; - -namespace MySql.Data.MySqlClient -{ - internal class ISSchemaProvider : SchemaProvider - { - public ISSchemaProvider(MySqlConnection connection) - : base(connection) - { - } - - protected override MySqlSchemaCollection GetCollections() - { - MySqlSchemaCollection dt = base.GetCollections(); - - object[][] collections = { - new object[] {"Views", 2, 3}, - new object[] {"ViewColumns", 3, 4}, - new object[] {"Procedure Parameters", 5, 1}, - new object[] {"Procedures", 4, 3}, - new object[] {"Triggers", 2, 4} - }; - - FillTable(dt, collections); - return dt; - } - - protected override MySqlSchemaCollection GetRestrictions() - { - MySqlSchemaCollection dt = base.GetRestrictions(); - - object[][] restrictions = new object[][] - { - new object[] {"Procedure Parameters", "Database", "", 0}, - new object[] {"Procedure Parameters", "Schema", "", 1}, - new object[] {"Procedure Parameters", "Name", "", 2}, - new object[] {"Procedure Parameters", "Type", "", 3}, - new object[] {"Procedure Parameters", "Parameter", "", 4}, - new object[] {"Procedures", "Database", "", 0}, - new object[] {"Procedures", "Schema", "", 1}, - new object[] {"Procedures", "Name", "", 2}, - new object[] {"Procedures", "Type", "", 3}, - new object[] {"Views", "Database", "", 0}, - new object[] {"Views", "Schema", "", 1}, - new object[] {"Views", "Table", "", 2}, - new object[] {"ViewColumns", "Database", "", 0}, - new object[] {"ViewColumns", "Schema", "", 1}, - new object[] {"ViewColumns", "Table", "", 2}, - new object[] {"ViewColumns", "Column", "", 3}, - new object[] {"Triggers", "Database", "", 0}, - new object[] {"Triggers", "Schema", "", 1}, - new object[] {"Triggers", "Name", "", 2}, - new object[] {"Triggers", "EventObjectTable", "", 3}, - }; - FillTable(dt, restrictions); - return dt; - } - - public override MySqlSchemaCollection GetDatabases(string[] restrictions) - { - string[] keys = new string[1]; - keys[0] = "SCHEMA_NAME"; - MySqlSchemaCollection dt = Query("SCHEMATA", "", keys, restrictions); - dt.Columns[1].Name = "database_name"; - dt.Name = "Databases"; - return dt; - } - - public override MySqlSchemaCollection GetTables(string[] restrictions) - { - string[] keys = new string[4]; - keys[0] = "TABLE_CATALOG"; - keys[1] = "TABLE_SCHEMA"; - keys[2] = "TABLE_NAME"; - keys[3] = "TABLE_TYPE"; - MySqlSchemaCollection dt = Query("TABLES", "TABLE_TYPE != 'VIEW'", keys, restrictions); - dt.Name = "Tables"; - return dt; - } - - public override MySqlSchemaCollection GetColumns(string[] restrictions) - { - string[] keys = new string[4]; - keys[0] = "TABLE_CATALOG"; - keys[1] = "TABLE_SCHEMA"; - keys[2] = "TABLE_NAME"; - keys[3] = "COLUMN_NAME"; - MySqlSchemaCollection dt = Query("COLUMNS", null, keys, restrictions); - dt.RemoveColumn("CHARACTER_OCTET_LENGTH"); - dt.Name = "Columns"; - QuoteDefaultValues(dt); - return dt; - } - - private MySqlSchemaCollection GetViews(string[] restrictions) - { - string[] keys = new string[3]; - keys[0] = "TABLE_CATALOG"; - keys[1] = "TABLE_SCHEMA"; - keys[2] = "TABLE_NAME"; - MySqlSchemaCollection dt = Query("VIEWS", null, keys, restrictions); - dt.Name = "Views"; - return dt; - } - - private MySqlSchemaCollection GetViewColumns(string[] restrictions) - { - StringBuilder where = new StringBuilder(); - StringBuilder sql = new StringBuilder( - "SELECT C.* FROM information_schema.columns C"); - sql.Append(" JOIN information_schema.views V "); - sql.Append("ON C.table_schema=V.table_schema AND C.table_name=V.table_name "); - if (restrictions != null && restrictions.Length >= 2 && - restrictions[1] != null) - where.AppendFormat(CultureInfo.InvariantCulture, "C.table_schema='{0}' ", restrictions[1]); - if (restrictions != null && restrictions.Length >= 3 && - restrictions[2] != null) - { - if (where.Length > 0) - where.Append("AND "); - where.AppendFormat(CultureInfo.InvariantCulture, "C.table_name='{0}' ", restrictions[2]); - } - if (restrictions != null && restrictions.Length == 4 && - restrictions[3] != null) - { - if (where.Length > 0) - where.Append("AND "); - where.AppendFormat(CultureInfo.InvariantCulture, "C.column_name='{0}' ", restrictions[3]); - } - if (where.Length > 0) - sql.AppendFormat(CultureInfo.InvariantCulture, " WHERE {0}", where); - MySqlSchemaCollection dt = GetTable(sql.ToString()); - dt.Name = "ViewColumns"; - dt.Columns[0].Name = "VIEW_CATALOG"; - dt.Columns[1].Name = "VIEW_SCHEMA"; - dt.Columns[2].Name = "VIEW_NAME"; - QuoteDefaultValues(dt); - return dt; - } - - private MySqlSchemaCollection GetTriggers(string[] restrictions) - { - string[] keys = new string[4]; - keys[0] = "TRIGGER_CATALOG"; - keys[1] = "TRIGGER_SCHEMA"; - keys[2] = "EVENT_OBJECT_TABLE"; - keys[3] = "TRIGGER_NAME"; - MySqlSchemaCollection dt = Query("TRIGGERS", null, keys, restrictions); - dt.Name = "Triggers"; - return dt; - } - - /// - /// Return schema information about procedures and functions - /// Restrictions supported are: - /// schema, name, type - /// - /// - /// - public override MySqlSchemaCollection GetProcedures(string[] restrictions) - { - try - { - if (connection.Settings.HasProcAccess) - return base.GetProcedures(restrictions); - } - catch (MySqlException ex) - { - if (ex.Number == (int)MySqlErrorCode.TableAccessDenied) - connection.Settings.HasProcAccess = false; - else - throw; - } - - string[] keys = new string[4]; - keys[0] = "ROUTINE_CATALOG"; - keys[1] = "ROUTINE_SCHEMA"; - keys[2] = "ROUTINE_NAME"; - keys[3] = "ROUTINE_TYPE"; - - MySqlSchemaCollection dt = Query("ROUTINES", null, keys, restrictions); - dt.Name = "Procedures"; - return dt; - } - - private MySqlSchemaCollection GetProceduresWithParameters(string[] restrictions) - { - MySqlSchemaCollection dt = GetProcedures(restrictions); - dt.AddColumn("ParameterList", typeof(string)); - - foreach (MySqlSchemaRow row in dt.Rows) - { - row["ParameterList"] = GetProcedureParameterLine(row); - } - return dt; - } - - private string GetProcedureParameterLine(MySqlSchemaRow isRow) - { - string sql = "SHOW CREATE {0} `{1}`.`{2}`"; - sql = String.Format(sql, isRow["ROUTINE_TYPE"], isRow["ROUTINE_SCHEMA"], - isRow["ROUTINE_NAME"]); - MySqlCommand cmd = new MySqlCommand(sql, connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - - // if we are not the owner of this proc or have permissions - // then we will get null for the body - if (reader.IsDBNull(2)) return null; - - string sqlMode = reader.GetString(1); - - string body = reader.GetString(2); - MySqlTokenizer tokenizer = new MySqlTokenizer(body); - tokenizer.AnsiQuotes = sqlMode.IndexOf("ANSI_QUOTES") != -1; - tokenizer.BackslashEscapes = sqlMode.IndexOf("NO_BACKSLASH_ESCAPES") == -1; - - string token = tokenizer.NextToken(); - while (token != "(") - token = tokenizer.NextToken(); - int start = tokenizer.StartIndex + 1; - token = tokenizer.NextToken(); - while (token != ")" || tokenizer.Quoted) - { - token = tokenizer.NextToken(); - // if we see another ( and we are not quoted then we - // are in a size element and we need to look for the closing paren - if (token == "(" && !tokenizer.Quoted) - { - while (token != ")" || tokenizer.Quoted) - token = tokenizer.NextToken(); - token = tokenizer.NextToken(); - } - } - return body.Substring(start, tokenizer.StartIndex - start); - } - } - - private MySqlSchemaCollection GetParametersForRoutineFromIS(string[] restrictions) - { - string[] keys = new string[5]; - keys[0] = "SPECIFIC_CATALOG"; - keys[1] = "SPECIFIC_SCHEMA"; - keys[2] = "SPECIFIC_NAME"; - keys[3] = "ROUTINE_TYPE"; - keys[4] = "PARAMETER_NAME"; - - StringBuilder sql = new StringBuilder(@"SELECT * FROM INFORMATION_SCHEMA.PARAMETERS"); - // now get our where clause and append it if there is one - string where = GetWhereClause(null, keys, restrictions); - if (!String.IsNullOrEmpty(where)) - sql.AppendFormat(CultureInfo.InvariantCulture, " WHERE {0}", where); - - MySqlSchemaCollection coll = QueryCollection("parameters", sql.ToString()); - - if ((coll.Rows.Count != 0) && ((string)coll.Rows[0]["routine_type"] == "FUNCTION")) - { - // update missing data for the first row (function return value). - // (using sames valus than GetParametersFromShowCreate). - coll.Rows[0]["parameter_mode"] = "IN"; - coll.Rows[0]["parameter_name"] = "return_value"; // "FUNCTION"; - } - return coll; - } - - private MySqlSchemaCollection GetParametersFromIS(string[] restrictions, MySqlSchemaCollection routines) - { - MySqlSchemaCollection parms = null; - - if (routines == null || routines.Rows.Count == 0) - { - if (restrictions == null) - { - parms = QueryCollection("parameters", "SELECT * FROM INFORMATION_SCHEMA.PARAMETERS WHERE 1=2"); - } - else - parms = GetParametersForRoutineFromIS(restrictions); - } - else foreach (MySqlSchemaRow routine in routines.Rows) - { - if (restrictions != null && restrictions.Length >= 3) - restrictions[2] = routine["ROUTINE_NAME"].ToString(); - - parms = GetParametersForRoutineFromIS(restrictions); - } - parms.Name = "Procedure Parameters"; - return parms; - } - - internal MySqlSchemaCollection CreateParametersTable() - { - MySqlSchemaCollection dt = new MySqlSchemaCollection("Procedure Parameters"); - dt.AddColumn("SPECIFIC_CATALOG", typeof(string)); - dt.AddColumn("SPECIFIC_SCHEMA", typeof(string)); - dt.AddColumn("SPECIFIC_NAME", typeof(string)); - dt.AddColumn("ORDINAL_POSITION", typeof(Int32)); - dt.AddColumn("PARAMETER_MODE", typeof(string)); - dt.AddColumn("PARAMETER_NAME", typeof(string)); - dt.AddColumn("DATA_TYPE", typeof(string)); - dt.AddColumn("CHARACTER_MAXIMUM_LENGTH", typeof(Int32)); - dt.AddColumn("CHARACTER_OCTET_LENGTH", typeof(Int32)); - dt.AddColumn("NUMERIC_PRECISION", typeof(byte)); - dt.AddColumn("NUMERIC_SCALE", typeof(Int32)); - dt.AddColumn("CHARACTER_SET_NAME", typeof(string)); - dt.AddColumn("COLLATION_NAME", typeof(string)); - dt.AddColumn("DTD_IDENTIFIER", typeof(string)); - dt.AddColumn("ROUTINE_TYPE", typeof(string)); - return dt; - } - - /// - /// Return schema information about parameters for procedures and functions - /// Restrictions supported are: - /// schema, name, type, parameter name - /// - public virtual MySqlSchemaCollection GetProcedureParameters(string[] restrictions, - MySqlSchemaCollection routines) - { - bool is55 = connection.driver.Version.isAtLeast(5, 5, 3); - - try - { - // we want to avoid using IS if we can as it is painfully slow - MySqlSchemaCollection dt = CreateParametersTable(); - GetParametersFromShowCreate(dt, restrictions, routines); - return dt; - } - catch (Exception) - { - if (!is55) throw; - - // we get here by not having access and we are on 5.5 or later so just use IS - return GetParametersFromIS(restrictions, routines); - } - } - - protected override MySqlSchemaCollection GetSchemaInternal(string collection, string[] restrictions) - { - MySqlSchemaCollection dt = base.GetSchemaInternal(collection, restrictions); - if (dt != null) - return dt; - - switch (collection) - { - case "VIEWS": - return GetViews(restrictions); - case "PROCEDURES": - return GetProcedures(restrictions); - case "PROCEDURES WITH PARAMETERS": - return GetProceduresWithParameters(restrictions); - case "PROCEDURE PARAMETERS": - return GetProcedureParameters(restrictions, null); - case "TRIGGERS": - return GetTriggers(restrictions); - case "VIEWCOLUMNS": - return GetViewColumns(restrictions); - } - return null; - } - - private static string GetWhereClause(string initial_where, string[] keys, string[] values) - { - StringBuilder where = new StringBuilder(initial_where); - if (values != null) - { - for (int i = 0; i < keys.Length; i++) - { - if (i >= values.Length) break; - if (values[i] == null || values[i] == String.Empty) continue; - if (where.Length > 0) - where.Append(" AND "); - where.AppendFormat(CultureInfo.InvariantCulture, - "{0} LIKE '{1}'", keys[i], values[i]); - } - } - return where.ToString(); - } - - private MySqlSchemaCollection Query(string tableName, string initialWhere, - string[] keys, string[] values) - { - StringBuilder query = new StringBuilder("SELECT * FROM INFORMATION_SCHEMA."); - query.Append(tableName); - - string where = GetWhereClause(initialWhere, keys, values); - - if (where.Length > 0) - query.AppendFormat(CultureInfo.InvariantCulture, " WHERE {0}", where); - - return GetTable(query.ToString()); - } - - private MySqlSchemaCollection GetTable(string sql) - { - MySqlSchemaCollection c = new MySqlSchemaCollection(); - MySqlCommand cmd = new MySqlCommand(sql, connection); - MySqlDataReader reader = cmd.ExecuteReader(); - - // add columns - for (int i = 0; i < reader.FieldCount; i++) - c.AddColumn(reader.GetName(i), reader.GetFieldType(i)); - - using (reader) - { - while (reader.Read()) - { - MySqlSchemaRow row = c.AddRow(); - for (int i = 0; i < reader.FieldCount; i++) - row[i] = reader.GetValue(i); - } - } - return c; - } - - public override MySqlSchemaCollection GetForeignKeys(string[] restrictions) - { - if (!connection.driver.Version.isAtLeast(5, 1, 16)) - return base.GetForeignKeys(restrictions); - - string sql = @"SELECT rc.constraint_catalog, rc.constraint_schema, - rc.constraint_name, kcu.table_catalog, kcu.table_schema, rc.table_name, - rc.match_option, rc.update_rule, rc.delete_rule, - NULL as referenced_table_catalog, - kcu.referenced_table_schema, rc.referenced_table_name - FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc - LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu ON - kcu.constraint_catalog <=> rc.constraint_catalog AND - kcu.constraint_schema <=> rc.constraint_schema AND - kcu.constraint_name <=> rc.constraint_name AND - kcu.ORDINAL_POSITION=1 WHERE 1=1"; - - StringBuilder where = new StringBuilder(); - if (restrictions.Length >= 2 && !String.IsNullOrEmpty(restrictions[1])) - where.AppendFormat(CultureInfo.InvariantCulture, - " AND rc.constraint_schema LIKE '{0}'", restrictions[1]); - if (restrictions.Length >= 3 && !String.IsNullOrEmpty(restrictions[2])) - where.AppendFormat(CultureInfo.InvariantCulture, - " AND rc.table_name LIKE '{0}'", restrictions[2]); - if (restrictions.Length >= 4 && !String.IsNullOrEmpty(restrictions[3])) - where.AppendFormat(CultureInfo.InvariantCulture, - " AND rc.constraint_name LIKE '{0}'", restrictions[2]); - - sql += where.ToString(); - - return GetTable(sql); - } - - public override MySqlSchemaCollection GetForeignKeyColumns(string[] restrictions) - { - if (!connection.driver.Version.isAtLeast(5, 0, 6)) - return base.GetForeignKeyColumns(restrictions); - - string sql = @"SELECT kcu.* FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu - WHERE kcu.referenced_table_name IS NOT NULL"; - - StringBuilder where = new StringBuilder(); - if (restrictions.Length >= 2 && !String.IsNullOrEmpty(restrictions[1])) - where.AppendFormat(CultureInfo.InvariantCulture, - " AND kcu.constraint_schema LIKE '{0}'", restrictions[1]); - if (restrictions.Length >= 3 && !String.IsNullOrEmpty(restrictions[2])) - where.AppendFormat(CultureInfo.InvariantCulture, - " AND kcu.table_name LIKE '{0}'", restrictions[2]); - if (restrictions.Length >= 4 && !String.IsNullOrEmpty(restrictions[3])) - where.AppendFormat(CultureInfo.InvariantCulture, - " AND kcu.constraint_name LIKE '{0}'", restrictions[3]); - - sql += where.ToString(); - - return GetTable(sql); - } - - #region Procedures Support Rouines - - internal void GetParametersFromShowCreate(MySqlSchemaCollection parametersTable, - string[] restrictions, MySqlSchemaCollection routines) - { - // this allows us to pass in a pre-populated routines table - // and avoid the querying for them again. - // we use this when calling a procedure or function - if (routines == null) - routines = GetSchema("procedures", restrictions); - - MySqlCommand cmd = connection.CreateCommand(); - - foreach (MySqlSchemaRow routine in routines.Rows) - { - string showCreateSql = String.Format("SHOW CREATE {0} `{1}`.`{2}`", - routine["ROUTINE_TYPE"], routine["ROUTINE_SCHEMA"], - routine["ROUTINE_NAME"]); - cmd.CommandText = showCreateSql; - try - { - string nameToRestrict = null; - if (restrictions != null && restrictions.Length == 5 && - restrictions[4] != null) - nameToRestrict = restrictions[4]; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - string body = reader.GetString(2); - reader.Close(); - ParseProcedureBody(parametersTable, body, routine, nameToRestrict); - } - } - catch (System.Data.SqlTypes.SqlNullValueException snex) - { - throw new InvalidOperationException( - String.Format(Resources.UnableToRetrieveParameters, routine["ROUTINE_NAME"]), snex); - } - } - } - - private void ParseProcedureBody(MySqlSchemaCollection parametersTable, string body, - MySqlSchemaRow row, string nameToRestrict) - { - List modes = new List(new string[3] { "IN", "OUT", "INOUT" }); - - string sqlMode = row["SQL_MODE"].ToString(); - - int pos = 1; - MySqlTokenizer tokenizer = new MySqlTokenizer(body); - tokenizer.AnsiQuotes = sqlMode.IndexOf("ANSI_QUOTES") != -1; - tokenizer.BackslashEscapes = sqlMode.IndexOf("NO_BACKSLASH_ESCAPES") == -1; - tokenizer.ReturnComments = false; - string token = tokenizer.NextToken(); - - // this block will scan for the opening paren while also determining - // if this routine is a function. If so, then we need to add a - // parameter row for the return parameter since it is ordinal position - // 0 and should appear first. - while (token != "(") - { - if (String.Compare(token, "FUNCTION", StringComparison.OrdinalIgnoreCase) == 0 && - nameToRestrict == null) - { - parametersTable.AddRow(); - InitParameterRow(row, parametersTable.Rows[0]); - } - token = tokenizer.NextToken(); - } - token = tokenizer.NextToken(); // now move to the next token past the ( - - while (token != ")") - { - MySqlSchemaRow parmRow = parametersTable.NewRow(); - InitParameterRow(row, parmRow); - parmRow["ORDINAL_POSITION"] = pos++; - - // handle mode and name for the parameter - string mode = StringUtility.ToUpperInvariant(token); - if (!tokenizer.Quoted && modes.Contains(mode)) - { - parmRow["PARAMETER_MODE"] = mode; - token = tokenizer.NextToken(); - } - if (tokenizer.Quoted) - token = token.Substring(1, token.Length - 2); - parmRow["PARAMETER_NAME"] = token; - - // now parse data type - token = ParseDataType(parmRow, tokenizer); - if (token == ",") - token = tokenizer.NextToken(); - - // now determine if we should include this row after all - // we need to parse it before this check so we are correctly - // positioned for the next parameter - if (nameToRestrict == null || - String.Compare(parmRow["PARAMETER_NAME"].ToString(), nameToRestrict, StringComparison.OrdinalIgnoreCase) == 0) - parametersTable.Rows.Add(parmRow); - } - - // now parse out the return parameter if there is one. - token = StringUtility.ToUpperInvariant(tokenizer.NextToken()); - if (String.Compare(token, "RETURNS", StringComparison.OrdinalIgnoreCase) == 0) - { - MySqlSchemaRow parameterRow = parametersTable.Rows[0]; - parameterRow["PARAMETER_NAME"] = "RETURN_VALUE"; - ParseDataType(parameterRow, tokenizer); - } - } - - /// - /// Initializes a new row for the procedure parameters table. - /// - private static void InitParameterRow(MySqlSchemaRow procedure, MySqlSchemaRow parameter) - { - parameter["SPECIFIC_CATALOG"] = null; - parameter["SPECIFIC_SCHEMA"] = procedure["ROUTINE_SCHEMA"]; - parameter["SPECIFIC_NAME"] = procedure["ROUTINE_NAME"]; - parameter["PARAMETER_MODE"] = "IN"; - parameter["ORDINAL_POSITION"] = 0; - parameter["ROUTINE_TYPE"] = procedure["ROUTINE_TYPE"]; - } - - /// - /// Parses out the elements of a procedure parameter data type. - /// - private string ParseDataType(MySqlSchemaRow row, MySqlTokenizer tokenizer) - { - StringBuilder dtd = new StringBuilder( - StringUtility.ToUpperInvariant(tokenizer.NextToken())); - row["DATA_TYPE"] = dtd.ToString(); - string type = row["DATA_TYPE"].ToString(); - - string token = tokenizer.NextToken(); - if (token == "(") - { - token = tokenizer.ReadParenthesis(); - dtd.AppendFormat(CultureInfo.InvariantCulture, "{0}", token); - if (type != "ENUM" && type != "SET") - ParseDataTypeSize(row, token); - token = tokenizer.NextToken(); - } - else - dtd.Append(GetDataTypeDefaults(type, row)); - - while (token != ")" && - token != "," && - String.Compare(token, "begin", StringComparison.OrdinalIgnoreCase) != 0 && - String.Compare(token, "return", StringComparison.OrdinalIgnoreCase) != 0) - { - if (String.Compare(token, "CHARACTER", StringComparison.OrdinalIgnoreCase) == 0 || - String.Compare(token, "BINARY", StringComparison.OrdinalIgnoreCase) == 0) - { } // we don't need to do anything with this - else if (String.Compare(token, "SET", StringComparison.OrdinalIgnoreCase) == 0 || - String.Compare(token, "CHARSET", StringComparison.OrdinalIgnoreCase) == 0) - row["CHARACTER_SET_NAME"] = tokenizer.NextToken(); - else if (String.Compare(token, "ASCII", StringComparison.OrdinalIgnoreCase) == 0) - row["CHARACTER_SET_NAME"] = "latin1"; - else if (String.Compare(token, "UNICODE", StringComparison.OrdinalIgnoreCase) == 0) - row["CHARACTER_SET_NAME"] = "ucs2"; - else if (String.Compare(token, "COLLATE", StringComparison.OrdinalIgnoreCase) == 0) - row["COLLATION_NAME"] = tokenizer.NextToken(); - else - dtd.AppendFormat(CultureInfo.InvariantCulture, " {0}", token); - token = tokenizer.NextToken(); - } - - if (dtd.Length > 0) - row["DTD_IDENTIFIER"] = dtd.ToString(); - - // now default the collation if one wasn't given - if (string.IsNullOrEmpty((string)row["COLLATION_NAME"]) && - !string.IsNullOrEmpty((string)row["CHARACTER_SET_NAME"])) - row["COLLATION_NAME"] = CharSetMap.GetDefaultCollation( - row["CHARACTER_SET_NAME"].ToString(), connection); - - // now set the octet length - if (row["CHARACTER_MAXIMUM_LENGTH"] != null) - { - if (row["CHARACTER_SET_NAME"] == null) - row["CHARACTER_SET_NAME"] = ""; - row["CHARACTER_OCTET_LENGTH"] = - CharSetMap.GetMaxLength((string)row["CHARACTER_SET_NAME"], connection) * - (int)row["CHARACTER_MAXIMUM_LENGTH"]; - } - - return token; - } - - private static string GetDataTypeDefaults(string type, MySqlSchemaRow row) - { - string format = "({0},{1})"; - object precision = row["NUMERIC_PRECISION"]; - if (MetaData.IsNumericType(type) && - string.IsNullOrEmpty((string)row["NUMERIC_PRECISION"])) - { - row["NUMERIC_PRECISION"] = 10; - row["NUMERIC_SCALE"] = 0; - if (!MetaData.SupportScale(type)) - format = "({0})"; - return String.Format(format, row["NUMERIC_PRECISION"], - row["NUMERIC_SCALE"]); - } - return String.Empty; - } - - private static void ParseDataTypeSize(MySqlSchemaRow row, string size) - { - size = size.Trim('(', ')'); - string[] parts = size.Split(','); - - if (!MetaData.IsNumericType(row["DATA_TYPE"].ToString())) - { - row["CHARACTER_MAXIMUM_LENGTH"] = Int32.Parse(parts[0]); - // will set octet length in a minute - } - else - { - row["NUMERIC_PRECISION"] = Int32.Parse(parts[0]); - if (parts.Length == 2) - row["NUMERIC_SCALE"] = Int32.Parse(parts[1]); - } - } - - #endregion - - } -} diff --git a/Source/MySql.Data/Installer.cs b/Source/MySql.Data/Installer.cs deleted file mode 100644 index cddb3cb6b..000000000 --- a/Source/MySql.Data/Installer.cs +++ /dev/null @@ -1,325 +0,0 @@ -// Copyright � 2004, 2013, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -#if !MONO && !PocketPC - -using System.Configuration.Install; -using System.ComponentModel; -using System.Reflection; -using System; -using Microsoft.Win32; -using System.Xml; -using System.IO; -using System.Diagnostics; -using System.Security; -using System.Security.Permissions; - -namespace MySql.Data.MySqlClient -{ - /// - /// We are adding a custom installer class to our assembly so our installer - /// can make proper changes to the machine.config file. - /// - [RunInstaller(true)] - [PermissionSetAttribute(SecurityAction.InheritanceDemand, Name = "FullTrust")] - [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")] - public class CustomInstaller : Installer - { - /// - /// We override Install so we can add our assembly to the proper - /// machine.config files. - /// - /// - public override void Install(System.Collections.IDictionary stateSaver) - { - base.Install(stateSaver); - AddProviderToMachineConfig(); - } - - private static void AddProviderToMachineConfig() - { - object installRoot = Registry.GetValue( - @"HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\", - "InstallRoot", null); - if (installRoot == null) - throw new Exception("Unable to retrieve install root for .NET framework"); - UpdateMachineConfigs(installRoot.ToString(), true); - - string installRoot64 = installRoot.ToString(); - installRoot64 = installRoot64.Substring(0, installRoot64.Length - 1); - installRoot64 = string.Format("{0}64{1}", installRoot64, - Path.DirectorySeparatorChar); - if (Directory.Exists(installRoot64)) - UpdateMachineConfigs(installRoot64, true); - } - - internal static void UpdateMachineConfigs(string rootPath, bool add) - { - string[] dirs = new string[2] { "v2.0.50727", "v4.0.30319" }; - foreach (string frameworkDir in dirs) - { - string path = rootPath + frameworkDir; - - string configPath = String.Format(@"{0}\CONFIG", path); - if (Directory.Exists(configPath)) - { - if (add) - AddProviderToMachineConfigInDir(configPath); - else - RemoveProviderFromMachineConfigInDir(configPath); - } - } - } - - private static XmlElement CreateNodeAssemblyBindingRedirection(XmlElement mysqlNode, XmlDocument doc, string oldVersion, string newVersion) - { - - if (doc == null || mysqlNode == null) - return null; - - XmlElement dA; - XmlElement aI; - XmlElement bR; - - string ns = "urn:schemas-microsoft-com:asm.v1"; - - //mysql.data - dA = (XmlElement)doc.CreateNode(XmlNodeType.Element, "dependentAssembly", ns); - aI = (XmlElement)doc.CreateNode(XmlNodeType.Element, "assemblyIdentity", ns); - aI.SetAttribute("name", "MySql.Data"); - aI.SetAttribute("publicKeyToken", "c5687fc88969c44d"); - aI.SetAttribute("culture", "neutral"); - - bR = (XmlElement)doc.CreateNode(XmlNodeType.Element, "bindingRedirect", ns); - bR.SetAttribute("oldVersion", oldVersion); - bR.SetAttribute("newVersion", newVersion); - dA.AppendChild(aI); - dA.AppendChild(bR); - mysqlNode.AppendChild(dA); - - //mysql.data.entity - dA = (XmlElement)doc.CreateNode(XmlNodeType.Element, "dependentAssembly", ns); - aI = (XmlElement)doc.CreateNode(XmlNodeType.Element, "assemblyIdentity", ns); - aI.SetAttribute("name", "MySql.Data.Entity"); - aI.SetAttribute("publicKeyToken", "c5687fc88969c44d"); - aI.SetAttribute("culture", "neutral"); - - bR = (XmlElement)doc.CreateNode(XmlNodeType.Element, "bindingRedirect", ns); - bR.SetAttribute("oldVersion", oldVersion); - bR.SetAttribute("newVersion", newVersion); - dA.AppendChild(aI); - dA.AppendChild(bR); - mysqlNode.AppendChild(dA); - - //mysql.web - - dA = (XmlElement)doc.CreateNode(XmlNodeType.Element, "dependentAssembly", ns); - aI = (XmlElement)doc.CreateNode(XmlNodeType.Element, "assemblyIdentity", ns); - aI.SetAttribute("name", "MySql.Web"); - aI.SetAttribute("publicKeyToken", "c5687fc88969c44d"); - aI.SetAttribute("culture", "neutral"); - - bR = (XmlElement)doc.CreateNode(XmlNodeType.Element, "bindingRedirect", ns); - bR.SetAttribute("oldVersion", oldVersion); - bR.SetAttribute("newVersion", newVersion); - dA.AppendChild(aI); - dA.AppendChild(bR); - mysqlNode.AppendChild(dA); - - return mysqlNode; - } - - - private static void AddProviderToMachineConfigInDir(string path) - { - string configFile = String.Format(@"{0}\machine.config", path); - if (!File.Exists(configFile)) return; - - // now read the config file into memory - StreamReader sr = new StreamReader(configFile); - string configXML = sr.ReadToEnd(); - sr.Close(); - - // load the XML into the XmlDocument - XmlDocument doc = new XmlDocument(); - doc.LoadXml(configXML); - - doc = RemoveOldBindingRedirection(doc); - - // create our new node - XmlElement newNode = (XmlElement)doc.CreateNode(XmlNodeType.Element, "add", ""); - - // add the proper attributes - newNode.SetAttribute("name", "MySQL Data Provider"); - newNode.SetAttribute("invariant", "MySql.Data.MySqlClient"); - newNode.SetAttribute("description", ".Net Framework Data Provider for MySQL"); - - // add the type attribute by reflecting on the executing assembly - Assembly a = Assembly.GetExecutingAssembly(); - string type = String.Format("MySql.Data.MySqlClient.MySqlClientFactory, {0}", a.FullName.Replace("Installers", "Data")); - newNode.SetAttribute("type", type); - - XmlNodeList nodes = doc.GetElementsByTagName("DbProviderFactories"); - - foreach (XmlNode node in nodes[0].ChildNodes) - { - if (node.Attributes == null) continue; - foreach (XmlAttribute attr in node.Attributes) - { - if (attr.Name == "invariant" && attr.Value == "MySql.Data.MySqlClient") - { - nodes[0].RemoveChild(node); - break; - } - } - } - nodes[0].AppendChild(newNode); - - try - { - XmlElement mysqlNode; - - //add binding redirection to our assemblies - if (doc.GetElementsByTagName("assemblyBinding").Count == 0) - { - mysqlNode = (XmlElement)doc.CreateNode(XmlNodeType.Element, "assemblyBinding", ""); - mysqlNode.SetAttribute("xmlns", "urn:schemas-microsoft-com:asm.v1"); - } - else - { - mysqlNode = (XmlElement)doc.GetElementsByTagName("assemblyBinding")[0]; - } - - string newVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString(); - mysqlNode = CreateNodeAssemblyBindingRedirection(mysqlNode, doc, "6.7.4.0", newVersion); - - XmlNodeList runtimeNode = doc.GetElementsByTagName("runtime"); - runtimeNode[0].AppendChild(mysqlNode); - } - catch {} - - - // Save the document to a file and auto-indent the output. - XmlTextWriter writer = new XmlTextWriter(configFile, null); - writer.Formatting = Formatting.Indented; - doc.Save(writer); - writer.Flush(); - writer.Close(); - } - - private static XmlDocument RemoveOldBindingRedirection(XmlDocument doc) - { - - if (doc.GetElementsByTagName("assemblyBinding").Count == 0) return doc; - - XmlNodeList nodesDependantAssembly = doc.GetElementsByTagName("assemblyBinding")[0].ChildNodes; - if (nodesDependantAssembly != null) - { - int nodesCount = nodesDependantAssembly.Count; - for (int i = 0; i < nodesCount; i++) - { - if (nodesDependantAssembly[0].ChildNodes[0].Attributes[0].Name == "name" - && - nodesDependantAssembly[0].ChildNodes[0].Attributes[0].Value.Contains("MySql")) - { - doc.GetElementsByTagName("assemblyBinding")[0].RemoveChild(nodesDependantAssembly[0]); - } - } - } - return doc; - } - - - - - - /// - /// We override Uninstall so we can remove out assembly from the - /// machine.config files. - /// - /// - public override void Uninstall(System.Collections.IDictionary savedState) - { - base.Uninstall(savedState); - RemoveProviderFromMachineConfig(); - } - - private static void RemoveProviderFromMachineConfig() - { - object installRoot = Registry.GetValue( - @"HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\", - "InstallRoot", null); - if (installRoot == null) - throw new Exception("Unable to retrieve install root for .NET framework"); - UpdateMachineConfigs(installRoot.ToString(), false); - - string installRoot64 = installRoot.ToString(); - installRoot64 = installRoot64.Substring(0, installRoot64.Length - 1); - installRoot64 = string.Format("{0}64{1}", installRoot64, - Path.DirectorySeparatorChar); - if (Directory.Exists(installRoot64)) - UpdateMachineConfigs(installRoot64, false); - } - - private static void RemoveProviderFromMachineConfigInDir(string path) - { - string configFile = String.Format(@"{0}\machine.config", path); - if (!File.Exists(configFile)) return; - - // now read the config file into memory - StreamReader sr = new StreamReader(configFile); - string configXML = sr.ReadToEnd(); - sr.Close(); - - // load the XML into the XmlDocument - XmlDocument doc = new XmlDocument(); - doc.LoadXml(configXML); - - XmlNodeList nodes = doc.GetElementsByTagName("DbProviderFactories"); - foreach (XmlNode node in nodes[0].ChildNodes) - { - if (node.Attributes == null) continue; - string name = node.Attributes["name"].Value; - if (name == "MySQL Data Provider") - { - nodes[0].RemoveChild(node); - break; - } - } - - try - { - doc = RemoveOldBindingRedirection(doc); - } - catch { } - - // Save the document to a file and auto-indent the output. - XmlTextWriter writer = new XmlTextWriter(configFile, null); - writer.Formatting = Formatting.Indented; - doc.Save(writer); - writer.Flush(); - writer.Close(); - } - } -} - -#endif diff --git a/Source/MySql.Data/Interceptors/CommandInterceptor.cs b/Source/MySql.Data/Interceptors/CommandInterceptor.cs deleted file mode 100644 index 03ea326d3..000000000 --- a/Source/MySql.Data/Interceptors/CommandInterceptor.cs +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright © 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Data; -using MySql.Data.MySqlClient; - - -#if NETCORE10 -namespace MySql.Data.MySqlClient.Interceptors -#else -namespace MySql.Data.MySqlClient -#endif -{ - /// - /// BaseCommandInterceptor is the base class that should be used for all userland - /// command interceptors - /// - public abstract class BaseCommandInterceptor - { - protected MySqlConnection ActiveConnection { get; private set; } - - public virtual bool ExecuteScalar(string sql, ref object returnValue) - { - return false; - } - - public virtual bool ExecuteNonQuery(string sql, ref int returnValue) - { - return false; - } - - public virtual bool ExecuteReader(string sql, CommandBehavior behavior, ref MySqlDataReader returnValue) - { - return false; - } - - public virtual void Init(MySqlConnection connection) - { - ActiveConnection = connection; - } - } - - /// - /// CommandInterceptor is the "manager" class that keeps the list of registered interceptors - /// for the given connection. - /// - internal sealed partial class CommandInterceptor : Interceptor - { - bool _insideInterceptor = false; - readonly List _interceptors = new List(); - - public CommandInterceptor(MySqlConnection connection) - { - Connection = connection; - - LoadInterceptors(connection.Settings.CommandInterceptors); - } - - public bool ExecuteScalar(string sql, ref object returnValue) - { - if (_insideInterceptor) return false; - _insideInterceptor = true; - - bool handled = false; - - foreach (BaseCommandInterceptor bci in _interceptors) - handled |= bci.ExecuteScalar(sql, ref returnValue); - - _insideInterceptor = false; - return handled; - } - - public bool ExecuteNonQuery(string sql, ref int returnValue) - { - if (_insideInterceptor) return false; - _insideInterceptor = true; - - bool handled = false; - - foreach (BaseCommandInterceptor bci in _interceptors) - handled |= bci.ExecuteNonQuery(sql, ref returnValue); - - _insideInterceptor = false; - return handled; - } - - public bool ExecuteReader(string sql, CommandBehavior behavior, ref MySqlDataReader returnValue) - { - if (_insideInterceptor) return false; - _insideInterceptor = true; - - bool handled = false; - - foreach (BaseCommandInterceptor bci in _interceptors) - handled |= bci.ExecuteReader(sql, behavior, ref returnValue); - - _insideInterceptor = false; - return handled; - } - - protected override void AddInterceptor(object o) - { - if (o == null) - throw new ArgumentException("Unable to instantiate CommandInterceptor"); - - if (!(o is BaseCommandInterceptor)) - throw new InvalidOperationException(String.Format(Resources.TypeIsNotCommandInterceptor, - o.GetType())); - BaseCommandInterceptor ie = (BaseCommandInterceptor) o; - ie.Init(Connection); - _interceptors.Insert(0, (BaseCommandInterceptor)o); - } - - - protected override string ResolveType(string nameOrType) - { -#if NETCORE10 - return base.ResolveType(nameOrType); -#else - if (MySqlConfiguration.Settings == null || MySqlConfiguration.Settings.CommandInterceptors == null) - return base.ResolveType(nameOrType); - foreach (InterceptorConfigurationElement e in MySqlConfiguration.Settings.CommandInterceptors) - if (String.Compare(e.Name, nameOrType, true) == 0) - return e.Type; - return base.ResolveType(nameOrType); -#endif - } - } -} diff --git a/Source/MySql.Data/Interceptors/ExceptionInterceptor.cs b/Source/MySql.Data/Interceptors/ExceptionInterceptor.cs deleted file mode 100644 index 34d2f9ac3..000000000 --- a/Source/MySql.Data/Interceptors/ExceptionInterceptor.cs +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright © 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using MySql.Data.MySqlClient; - - -#if NETCORE10 -namespace MySql.Data.MySqlClient.Interceptors -#else -namespace MySql.Data.MySqlClient -#endif -{ - /// - /// BaseExceptionInterceptor is the base class that should be used for all userland - /// exception interceptors - /// - public abstract class BaseExceptionInterceptor - { - public abstract Exception InterceptException(Exception exception); - - protected MySqlConnection ActiveConnection { get; private set; } - - public virtual void Init(MySqlConnection connection) - { - ActiveConnection = connection; - } - } - - /// - /// StandardExceptionInterceptor is the standard interceptor that simply throws the exception. - /// It is the default action. - /// - internal sealed class StandardExceptionInterceptor : BaseExceptionInterceptor - { - public override Exception InterceptException(Exception exception) - { - return exception; - } - } - - /// - /// ExceptionInterceptor is the "manager" class that keeps the list of registered interceptors - /// for the given connection. - /// - internal sealed class ExceptionInterceptor : Interceptor - { - readonly List _interceptors = new List(); - - public ExceptionInterceptor(MySqlConnection connection) - { - Connection = connection; - - LoadInterceptors(connection.Settings.ExceptionInterceptors); - - // we always have the standard interceptor - _interceptors.Add(new StandardExceptionInterceptor()); - - } - - protected override void AddInterceptor(object o) - { - if (o == null) - throw new ArgumentException("Unable to instantiate ExceptionInterceptor"); - - if (!(o is BaseExceptionInterceptor)) - throw new InvalidOperationException(String.Format(Resources.TypeIsNotExceptionInterceptor, - o.GetType())); - BaseExceptionInterceptor ie = o as BaseExceptionInterceptor; - ie.Init(Connection); - _interceptors.Insert(0, (BaseExceptionInterceptor)o); - } - - public void Throw(Exception exception) - { - Exception e = _interceptors.Aggregate(exception, (current, ie) => ie.InterceptException(current)); - throw e; - } - -#if !NETCORE10 - protected override string ResolveType(string nameOrType) - { - if (MySqlConfiguration.Settings == null || MySqlConfiguration.Settings.ExceptionInterceptors == null) - return base.ResolveType(nameOrType); - foreach (InterceptorConfigurationElement e in MySqlConfiguration.Settings.ExceptionInterceptors) - if (String.Compare(e.Name, nameOrType, true) == 0) - return e.Type; - return base.ResolveType(nameOrType); - } -#endif - } -} diff --git a/Source/MySql.Data/Interceptors/Interceptor.cs b/Source/MySql.Data/Interceptors/Interceptor.cs deleted file mode 100644 index 3d53f40fd..000000000 --- a/Source/MySql.Data/Interceptors/Interceptor.cs +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright © 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; - -#if NETCORE10 -namespace MySql.Data.MySqlClient.Interceptors -#else -namespace MySql.Data.MySqlClient -#endif -{ - /// - /// Interceptor is the base class for the "manager" classes such as ExceptionInterceptor, - /// CommandInterceptor, etc - /// - internal abstract class Interceptor - { - protected MySqlConnection Connection; - - protected void LoadInterceptors(string interceptorList) - { - if (String.IsNullOrEmpty(interceptorList)) return; - - string[] interceptors = interceptorList.Split('|'); - foreach (string interceptorType in interceptors) - { - if (String.IsNullOrEmpty(interceptorType)) continue; - - string type = ResolveType(interceptorType); - Type t = Type.GetType(type); - object interceptorObject = Activator.CreateInstance(t); - AddInterceptor(interceptorObject); - } - } - - protected abstract void AddInterceptor(object o); - - protected virtual string ResolveType(string nameOrType) - { - return nameOrType; - } - } -} diff --git a/Source/MySql.Data/Memcached/BinaryClient.cs b/Source/MySql.Data/Memcached/BinaryClient.cs deleted file mode 100644 index 2ca35c538..000000000 --- a/Source/MySql.Data/Memcached/BinaryClient.cs +++ /dev/null @@ -1,458 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; - -namespace MySql.Data.MySqlClient.Memcached -{ - /// - /// Implementation of memcached binary client protocol. - /// - /// According to http://code.google.com/p/memcached/wiki/BinaryProtocolRevamped - public class BinaryClient : Client - { - private readonly Encoding _encoding; - - private enum OpCodes : byte - { - Get = 0x00, - Set = 0x01, - Add = 0x02, - Replace = 0x03, - Delete = 0x04, - Increment = 0x05, - Decrement = 0x06, - Quit = 0x07, - Flush = 0x08, - GetK = 0x0c, - GetKQ = 0x0d, - Append = 0x0e, - Prepend = 0x0f, - SASL_list_mechs = 0x20, - SASL_Auth = 0x21, - SASL_Step = 0x22 - } - - private enum MagicByte : byte - { - Request = 0x80, - Response = 0x81 - } - - private enum ResponseStatus : ushort - { - NoError = 0x0000, - KeyNotFound = 0x0001, - KeyExists = 0x0002, - ValueTooLarge = 0x0003, - InvalidArguments = 0x0004, - ItemNotStored = 0x0005, - IncrDecrOnNonNumericValue = 0x0006, - VbucketBelongsToAnotherServer = 0x0007, - AuthenticationError = 0x0008, - AuthenticationContinue = 0x0009, - UnknownCommand = 0x0081, - OutOfMemory = 0x0082, - NotSupported = 0x0083, - InternalError = 0x0084, - Busy = 0x0085, - TemporaryFailure = 0x0086 - } - - public BinaryClient( string server, uint port ) : base( server, port ) - { - _encoding = Encoding.UTF8; - } - - #region Memcached protocol interface - - public override void Add(string key, object data, TimeSpan expiration) - { - SendCommand((byte)MagicByte.Request, (byte)OpCodes.Add, key, data, expiration, true); - } - - public override void Append(string key, object data) - { - SendCommand((byte)MagicByte.Request, (byte)OpCodes.Append, key, data, TimeSpan.Zero, false); - } - - public override void Cas(string key, object data, TimeSpan expiration, ulong casUnique) - { - throw new NotImplementedException("Not available in binary protocol"); - //SendCommand((byte)MagicByte.Request, (byte)OpCodes.Cas, key, data, expiration, true, casUnique); - } - - public override void Decrement(string key, int amount) - { - SendCommand((byte)MagicByte.Request, (byte)OpCodes.Decrement, key, amount); - } - - public override void Delete(string key) - { - SendCommand((byte)MagicByte.Request, (byte)OpCodes.Delete, key ); - } - - public override void FlushAll(TimeSpan delay) - { - SendCommand((byte)MagicByte.Request, (byte)OpCodes.Flush, delay); - } - - public override KeyValuePair Get(string key) - { - string val; - SendCommand((byte)MagicByte.Request, (byte)OpCodes.Get, key, out val ); - return new KeyValuePair(key, val); - } - - public override void Increment(string key, int amount) - { - SendCommand((byte)MagicByte.Request, (byte)OpCodes.Increment, key, amount); - } - - public override void Prepend(string key, object data) - { - SendCommand((byte)MagicByte.Request, (byte)OpCodes.Prepend, key, data, TimeSpan.Zero, false); - } - - public override void Replace(string key, object data, TimeSpan expiration) - { - SendCommand((byte)MagicByte.Request, (byte)OpCodes.Replace, key, data, expiration, true); - } - - public override void Set(string key, object data, TimeSpan expiration) - { - SendCommand( ( byte )MagicByte.Request, ( byte )OpCodes.Set, key, data, expiration, true ); - } - - #endregion - - /// - /// Sends an store command (add, replace, set). - /// - /// - /// - /// - /// - /// - /// - private void SendCommand( - byte magic, byte opcode, string key, object data, TimeSpan expiration, bool hasExtra ) - { - // Send data - byte[] dataToSend = EncodeStoreCommand(magic, opcode, key, data, expiration, hasExtra ); - stream.Write(dataToSend, 0, dataToSend.Length); - byte[] res = GetResponse(); - } - - /// - /// Sends a get command. - /// - /// - /// - /// - /// - private void SendCommand(byte magic, byte opcode, string key, out string value) - { - // Send data - byte[] dataToSend = EncodeGetCommand(magic, opcode, key ); - stream.Write(dataToSend, 0, dataToSend.Length); - byte[] res = GetResponse(); - byte[] bValue = new byte[res[4] - 4]; - Array.Copy(res, 28, bValue, 0, res[4] - 4); - value = _encoding.GetString(bValue, 0, bValue.Length); - } - - /// - /// Sends a delete command. - /// - /// - /// - /// - private void SendCommand(byte magic, byte opcode, string key ) - { - // Send data - byte[] dataToSend = EncodeGetCommand(magic, opcode, key ); - stream.Write(dataToSend, 0, dataToSend.Length); - byte[] res = GetResponse(); - } - - /// - /// Sends a command without args (like flush). - /// - /// - /// - /// - private void SendCommand(byte magic, byte opcode, TimeSpan expiration ) - { - // Send data - byte[] dataToSend = EncodeFlushCommand(magic, opcode, expiration); - stream.Write(dataToSend, 0, dataToSend.Length); - byte[] res = GetResponse(); - } - - /// - /// Sends a command with amount (INCR/DECR) - /// - /// - /// - /// - /// - private void SendCommand(byte magic, byte opcode, string key, int amount ) - { - // Send data - byte[] dataToSend = EncodeIncrCommand(magic, opcode, key, amount); - stream.Write(dataToSend, 0, dataToSend.Length); - byte[] res = GetResponse(); - } - - private byte[] GetResponse() - { - byte[] response = new byte[24]; - stream.Read(response, 0, response.Length); - ValidateResponse( response ); - return response; - } - - private void ValidateResponse(byte[] res) - { - // Memcached returns words in big endian. - ushort status = (ushort)(( res[ 6 ] << 8 ) | res[ 7 ] ); - if( status != 0 ) - { - throw new MemcachedException(((ResponseStatus)status).ToString()); - } - } - - /// - /// Encodes in the binary protocol the a command of the kind set, add or replace. - /// - /// - /// - /// - /// - /// - /// If true applies to set, add or replace commands; if false applies to append and prepend commands. - /// - private byte[] EncodeStoreCommand( - byte magic, byte opcode, string key, object data, TimeSpan expiration, - bool hasExtra ) - { - /* - * Field (offset) (value) - Magic (0) : 0x80 - Opcode (1) : 0x02 - Key length (2,3) : 0x0005 - Extra length (4) : 0x08 - Data type (5) : 0x00 - VBucket (6,7) : 0x0000 - Total body (8-11) : 0x00000012 - Opaque (12-15): 0x00000000 - CAS (16-23): 0x0000000000000000 - Extras : - Flags (24-27): 0xdeadbeef - Expiry (28-31): 0x00000e10 - Key (32-36): The textual string "Hello" - Value (37-41): The textual string "World" - * */ - byte[] bKey = _encoding.GetBytes(key); - byte[] bData = _encoding.GetBytes(data.ToString()); - MemoryStream ms = new MemoryStream(); - // write magic - ms.WriteByte(magic); - // write opcode - ms.WriteByte(opcode); - // write keylength - WriteToMemoryStream(BitConverter.GetBytes((ushort)bKey.Length), ms); - // write extra length - ms.WriteByte(8); - // write data type - ms.WriteByte(0); - // write status - ms.WriteByte(0); ms.WriteByte(0); - // write total body length - WriteToMemoryStream(BitConverter.GetBytes((uint) - (bKey.Length + bData.Length + ( hasExtra? 8 : 0))), ms); - // write opaque - WriteToMemoryStream(BitConverter.GetBytes((uint)0), ms); - // write CAS - // NOTE: For some reason in the Innodb implementation of Memcached the CAS - // is 4 bytes long (instead of 8 bytes). - WriteToMemoryStream(BitConverter.GetBytes((ushort)0), ms); - // write extras, flags - if (hasExtra) - { - ms.Write(new byte[4], 0, 4); - WriteToMemoryStream(BitConverter.GetBytes((uint)(expiration.TotalSeconds)), ms); - } - // write key - ms.Write(bKey, 0, bKey.Length); - // write value - ms.Write(bData, 0, bData.Length); - return ms.ToArray(); - } - - private byte[] EncodeGetCommand(byte magic, byte opcode, string key ) - { - /* - * Field (offset) (value) - Magic (0) : 0x80 - Opcode (1) : 0x00 - Key length (2,3) : 0x0005 - Extra length (4) : 0x00 - Data type (5) : 0x00 - VBucket (6,7) : 0x0000 - Total body (8-11) : 0x00000005 - Opaque (12-15): 0x00000000 - CAS (16-23): 0x0000000000000000 - Extras : None - Key (24-29): The textual string: "Hello" - Value : None - * */ - byte[] bKey = _encoding.GetBytes(key); - MemoryStream ms = new MemoryStream(); - // write magic - ms.WriteByte(magic); - // write opcode - ms.WriteByte(opcode); - // write keylength - WriteToMemoryStream(BitConverter.GetBytes((ushort)bKey.Length), ms); - // write extra length - ms.WriteByte(8); - // write data type - ms.WriteByte(0); - // write status - ms.WriteByte(0); ms.WriteByte(0); - // write total body length - WriteToMemoryStream(BitConverter.GetBytes((ushort)bKey.Length), ms); - // write opaque - WriteToMemoryStream(BitConverter.GetBytes((uint)0), ms); - // write CAS - WriteToMemoryStream(BitConverter.GetBytes((uint)0), ms); - // write key - ms.Write(bKey, 0, bKey.Length); - return ms.ToArray(); - } - - private byte[] EncodeFlushCommand(byte magic, byte opcode, TimeSpan expiration ) - { - /* - * Field (offset) (value) - Magic (0) : 0x80 - Opcode (1) : 0x08 - Key length (2,3) : 0x0000 - Extra length (4) : 0x04 - Data type (5) : 0x00 - VBucket (6,7) : 0x0000 - Total body (8-11) : 0x00000004 - Opaque (12-15): 0x00000000 - CAS (16-23): 0x0000000000000000 - Extras : - Expiry (24-27): 0x000e10 - Key : None - Value : None - * */ - MemoryStream ms = new MemoryStream(); - // write magic - ms.WriteByte(magic); - // write opcode - ms.WriteByte(opcode); - // write keylength - ms.WriteByte(0); ms.WriteByte(0); - // write extra length - ms.WriteByte(4); - // write data type - ms.WriteByte(0); - // write status - ms.WriteByte(0); ms.WriteByte(0); - // write total body length - WriteToMemoryStream(BitConverter.GetBytes((ushort)4), ms); - // write opaque - WriteToMemoryStream(BitConverter.GetBytes((uint)0), ms); - // write CAS - WriteToMemoryStream(BitConverter.GetBytes((uint)0), ms); - // write extra (flags) - WriteToMemoryStream(BitConverter.GetBytes((uint)(expiration.TotalSeconds)), ms); - return ms.ToArray(); - } - - private byte[] EncodeIncrCommand(byte magic, byte opcode, string key, int amount ) - { - /* - * Field (offset) (value) - Magic (0) : 0x80 - Opcode (1) : 0x05 - Key length (2,3) : 0x0007 - Extra length (4) : 0x14 - Data type (5) : 0x00 - VBucket (6,7) : 0x0000 - Total body (8-11) : 0x0000001b - Opaque (12-15): 0x00000000 - CAS (16-23): 0x0000000000000000 - Extras : - delta (24-31): 0x0000000000000001 - initial (32-39): 0x0000000000000000 - exipration (40-43): 0x00000e10 - Key : Textual string "counter" - Value : None - * */ - byte[] bKey = _encoding.GetBytes(key); - MemoryStream ms = new MemoryStream(); - // write magic - ms.WriteByte(magic); - // write opcode - ms.WriteByte(opcode); - // write keylength - WriteToMemoryStream(BitConverter.GetBytes((ushort)bKey.Length), ms); - // write extra length - ms.WriteByte(20); - // write data type - ms.WriteByte(0); - // write status - ms.WriteByte(0); ms.WriteByte(0); - // write total body length - WriteToMemoryStream(BitConverter.GetBytes((ushort)( bKey.Length + 20 )), ms); - // write opaque - WriteToMemoryStream(BitConverter.GetBytes((uint)0), ms); - // write CAS - WriteToMemoryStream(BitConverter.GetBytes((uint)0), ms); - // write extra (flags) - long delta = amount; - if ((OpCodes)opcode == OpCodes.Decrement) - delta *= -1; - WriteToMemoryStream(BitConverter.GetBytes((long)0), ms); - WriteToMemoryStream(BitConverter.GetBytes((uint)(TimeSpan.Zero.TotalSeconds)), ms); - // write key - ms.Write(bKey, 0, bKey.Length); - return ms.ToArray(); - } - - private void WriteToMemoryStream(byte[] data, MemoryStream ms) - { - // .NET runs in x86 which uses little endian, and Memcached runs in big endian. - Array.Reverse(data); - ms.Write(data, 0, data.Length); - } - } -} diff --git a/Source/MySql.Data/Memcached/Client.cs b/Source/MySql.Data/Memcached/Client.cs deleted file mode 100644 index aac706957..000000000 --- a/Source/MySql.Data/Memcached/Client.cs +++ /dev/null @@ -1,196 +0,0 @@ -// Copyright © 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.IO; -using MySql.Data.Common; - -namespace MySql.Data.MySqlClient.Memcached -{ - /// - /// An interface of the client memcached protocol. This class is abstract for - /// implementation of the Memcached client interface see for the - /// text protocol version and for the binary protocol version. - /// - public abstract class Client - { - /// - /// The port used by the connection. - /// - protected uint port; - - /// - /// The server DNS or IP address used by the connection. - /// - protected string server; - - /// - /// The network stream used by the connecition. - /// - protected Stream stream; - - /// - /// Factory method for creating instances of that implement a connection with the requested features. - /// The connection object returned must be explicitely opened see method . - /// - /// The Memcached server DNS or IP address. - /// The port for the Memcached server - /// A set of flags indicating characterestics requested. - /// An instance of a client connection ready to be used. - public static Client GetInstance(string server, uint port, MemcachedFlags flags) - { - if ((flags | MemcachedFlags.TextProtocol) != 0) - { - return new TextClient(server, port); - } - else if ( ( flags | MemcachedFlags.BinaryProtocol ) != 0 ) - { - return new BinaryClient(server, port); - } - return null; - } - - /// - /// Opens the client connection. - /// - public virtual void Open() - { - this.stream = StreamCreator.GetStream(server, port, null, 10, new DBVersion(), 60); - } - - /// - /// Closes the client connection. - /// - public virtual void Close() - { - stream.Dispose(); - } - - protected Client(string server, uint port) - { - this.server = server; - this.port = port; - } - - /// - /// Adds a new key/value pair with the given TimeSpan expiration. - /// - /// The key for identifying the entry. - /// The data to associate with the key. - /// The interval of timespan, use TimeSpan.Zero for no expiration. - public abstract void Add(string key, object data, TimeSpan expiration); - - /// - /// Appens the data to the existing data for the associated key. - /// - /// The key for identifying the entry. - /// The data to append with the data associated with the key. - public abstract void Append(string key, object data); - - /// - /// Executes the Check-and-set Memcached operation. - /// - /// The key for identifying the entry. - /// The data to use in the CAS. - /// The interval of timespan, use TimeSpan.Zero for no expiration. - /// The CAS unique value to use. - /// - public abstract void Cas(string key, object data, TimeSpan expiration, ulong casUnique); - - /// - /// Decrements the value associated with a key by the given amount. - /// - /// The key associated with the value to decrement. - /// The amount to decrement the value. - public abstract void Decrement(string key, int amount); - - /// - /// Removes they pair key/value given the specified key. - /// - /// - public abstract void Delete(string key); - - /// - /// Removes all entries from the storage, effectively invalidating the whole cache. - /// - /// The interval after which the cache will be cleaned. Can be TimeSpan.Zero for immediately. - public abstract void FlushAll(TimeSpan delay); - - /// - /// Get the key/value pair associated with a given key. - /// - /// The key for which to returm the key/value. - /// The key/value associated with the key or a MemcachedException if it does not exists. - public abstract KeyValuePair Get(string key); - - /// - /// Increments the value associated with a key by the given amount. - /// - /// The key associated with the value to increment. - /// The amount to increment the value. - public abstract void Increment(string key, int amount); - - /// - /// Prepends the data to the existing data for the associated key. - /// - /// The key for identifying the entry. - /// The data to append with the data associated with the key. - public abstract void Prepend(string key, object data); - - /// - /// Replaces the value associated with the given key with another value. - /// - /// The key for identifying the entry. - /// The data to replace the value associated with the key. - /// The interval of timespan, use TimeSpan.Zero for no expiration. - public abstract void Replace(string key, object data, TimeSpan expiration); - - /// - /// Set the value of a given key. - /// - /// The key for identifying the entry. - /// The data to associate with the given key. - /// The interval of timespan, use TimeSpan.Zero for no expiration. - public abstract void Set(string key, object data, TimeSpan expiration); - } - - /// - /// A set of flags for requesting new instances of connections - /// - [Flags] - public enum MemcachedFlags : ushort - { - /// - /// Requests a connection implememting the text protocol. - /// - TextProtocol = 0x1, - /// - /// Requests a connection implementing the binary protocol. - /// - BinaryProtocol = 0x2, - /// - /// Requests a TCP connection. Currently UDP is not supported. - /// - Tcp = 0x4 - } -} diff --git a/Source/MySql.Data/Memcached/MemcachedException.cs b/Source/MySql.Data/Memcached/MemcachedException.cs deleted file mode 100644 index fd8893e32..000000000 --- a/Source/MySql.Data/Memcached/MemcachedException.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; - -namespace MySql.Data.MySqlClient.Memcached -{ - /// - /// The base exception class for all Memcached exceptions. - /// - public class MemcachedException : Exception - { - public MemcachedException(string msg) - : base(msg) - { - } - - public MemcachedException(string msg, Exception e) - : base(msg, e) - { - } - } -} diff --git a/Source/MySql.Data/Memcached/TextClient.cs b/Source/MySql.Data/Memcached/TextClient.cs deleted file mode 100644 index 7d500439b..000000000 --- a/Source/MySql.Data/Memcached/TextClient.cs +++ /dev/null @@ -1,321 +0,0 @@ -// Copyright © 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; - -namespace MySql.Data.MySqlClient.Memcached -{ - /// - /// Implementation of the Memcached text client protocol. - /// - public class TextClient : Client - { - private readonly Encoding _encoding; - - private static readonly string PROTOCOL_ADD = "add"; - private static readonly string PROTOCOL_APPEND = "append"; - private static readonly string PROTOCOL_CAS = "cas"; - private static readonly string PROTOCOL_DECREMENT = "decr"; - private static readonly string PROTOCOL_DELETE = "delete"; - private static readonly string PROTOCOL_FLUSHALL = "flush_all"; - private static readonly string PROTOCOL_GETS = "gets"; - private static readonly string PROTOCOL_INCREMENT = "incr"; - private static readonly string PROTOCOL_PREPEND = "prepend"; - private static readonly string PROTOCOL_REPLACE = "replace"; - private static readonly string PROTOCOL_SET = "set"; - - private static readonly string VALUE = "VALUE"; - private static readonly string END = "END"; - // Errors - private static readonly string ERR_ERROR = "ERROR"; - private static readonly string ERR_CLIENT_ERROR = "CLIENT_ERROR"; - private static readonly string ERR_SERVER_ERROR = "SERVER_ERROR"; - - protected internal TextClient( string server, uint port ) : base( server, port ) - { - _encoding = Encoding.UTF8; - } - - #region Memcached protocol interface - - public override void Add(string key, object data, TimeSpan expiration) - { - SendCommand(PROTOCOL_ADD, key, data, expiration); - } - - public override void Append(string key, object data ) - { - SendCommand(PROTOCOL_APPEND, key, data); - } - - public override void Cas(string key, object data, TimeSpan expiration, ulong casUnique) - { - SendCommand(PROTOCOL_CAS, key, data, expiration, casUnique); - } - - public override void Decrement(string key, int amount) - { - SendCommand(PROTOCOL_DECREMENT, key, amount); - } - - public override void Delete(string key) - { - SendCommand(PROTOCOL_DELETE, key); - } - - public override void FlushAll(TimeSpan delay) - { - SendCommand(PROTOCOL_FLUSHALL, delay); - } - - public override KeyValuePair Get(string key) - { - KeyValuePair[] kvp = Gets(key); - if (kvp.Length == 0) - throw new MemcachedException("Item does not exists."); - else - return kvp[0]; - } - - private KeyValuePair[] Gets(params string[] keys) - { - StringBuilder sb = new StringBuilder(); - sb.Append(string.Format("{0}", PROTOCOL_GETS)); - for (int i = 0; i < keys.Length; i++) - { - sb.Append(string.Format(" {0}", keys[i])); - } - sb.Append("\r\n"); - SendData(sb.ToString()); - byte[] res = GetResponse(); - return ParseGetResponse(res); - } - - public override void Increment(string key, int amount) - { - SendCommand(PROTOCOL_INCREMENT, key, amount); - } - - public override void Prepend(string key, object data) - { - SendCommand(PROTOCOL_PREPEND, key, data); - } - - public override void Replace(string key, object data, TimeSpan expiration) - { - SendCommand(PROTOCOL_REPLACE, key, data, expiration); - } - - public override void Set(string key, object data, TimeSpan expiration) - { - SendCommand(PROTOCOL_SET, key, data, expiration); - } - - #endregion - - #region Support methods - - - /// - /// Sends a command to the memcached server. - /// - /// - /// - /// - /// - /// - /// This version is for commands that take a key, data, expiration and casUnique. - private void SendCommand(string cmd, string key, object data, TimeSpan expiration, ulong casUnique) - { - StringBuilder sb = new StringBuilder(); - // set key flags exptime - sb.Append(string.Format("{0} {1} 0 {2} ", cmd, key, (int)(expiration.TotalSeconds))); - byte[] buf = _encoding.GetBytes(data.ToString()); - string s = _encoding.GetString(buf, 0, buf.Length); - sb.Append(s.Length.ToString()); - sb.AppendFormat(" {0}", casUnique); - sb.Append("\r\n"); - sb.Append(s); - sb.Append("\r\n"); - SendData(sb.ToString()); - GetResponse(); - } - - /// - /// Sends a command to the memcached server. - /// - /// - /// - /// - /// - /// This version is for commands that take a key, data and expiration - private void SendCommand(string cmd, string key, object data, TimeSpan expiration) - { - StringBuilder sb = new StringBuilder(); - // set key flags exptime - sb.Append(string.Format("{0} {1} 0 {2} ", cmd, key, (int)(expiration.TotalSeconds))); - byte[] buf = _encoding.GetBytes(data.ToString()); - string s = _encoding.GetString(buf, 0, buf.Length); - sb.Append(s.Length.ToString()); - sb.Append("\r\n"); - sb.Append(s); - sb.Append("\r\n"); - SendData(sb.ToString()); - GetResponse(); - } - - /// - /// Send a command to memcached server. - /// - /// - /// - /// - /// This version is for commands that don't need flags neither expiration fields. - private void SendCommand(string cmd, string key, object data ) - { - StringBuilder sb = new StringBuilder(); - // set key - sb.Append(string.Format("{0} {1} ", cmd, key )); - byte[] buf = _encoding.GetBytes(data.ToString()); - string s = _encoding.GetString(buf, 0, buf.Length); - if ((cmd == PROTOCOL_APPEND) || (cmd == PROTOCOL_PREPEND)) - { - sb.Append("0 0 "); - } - sb.Append(s.Length.ToString()); - sb.Append("\r\n"); - sb.Append(s); - sb.Append("\r\n"); - SendData(sb.ToString()); - GetResponse(); - } - - /// - /// Sends a command to the server. - /// - /// - /// - /// This version is for commands that only require a key - private void SendCommand(string cmd, string key ) - { - StringBuilder sb = new StringBuilder(); - // set key - sb.Append(string.Format("{0} {1} ", cmd, key )); - sb.Append("\r\n"); - SendData(sb.ToString()); - GetResponse(); - } - - /// - /// Sends a command to the server. - /// - /// - /// - /// This version is for commands that only require a key and an integer value. - private void SendCommand(string cmd, string key, int amount ) - { - StringBuilder sb = new StringBuilder(); - // set key - sb.Append(string.Format("{0} {1} {2}", cmd, key, amount)); - sb.Append("\r\n"); - SendData(sb.ToString()); - GetResponse(); - } - - /// - /// Sends a command to the server. - /// - /// - /// - /// - /// This version is for commands that only require a key and expiration. - private void SendCommand(string cmd, TimeSpan expiration) - { - StringBuilder sb = new StringBuilder(); - sb.Append(string.Format("{0} {1}\r\n", PROTOCOL_FLUSHALL, expiration.TotalSeconds)); - SendData(sb.ToString()); - GetResponse(); - } - - private void ValidateErrorResponse(byte[] res) - { - string s = _encoding.GetString(res, 0, res.Length); - if ((s.StartsWith(ERR_ERROR, StringComparison.OrdinalIgnoreCase)) || - (s.StartsWith(ERR_CLIENT_ERROR, StringComparison.OrdinalIgnoreCase)) || - (s.StartsWith(ERR_SERVER_ERROR, StringComparison.OrdinalIgnoreCase))) - { - throw new MemcachedException(s); - } - } - - private void SendData(string sData) - { - byte[] data = _encoding.GetBytes(sData); - stream.Write(data, 0, data.Length); - } - - private KeyValuePair[] ParseGetResponse(byte[] input) - { - // VALUE key2 10 9 2\r\n111222333\r\nEND\r\n - string[] sInput = _encoding.GetString(input, 0, input.Length).Split(new string[] { "\r\n" }, StringSplitOptions.None); - List> l = new List>(); - int i = 0; - string key = ""; - KeyValuePair kvp; - while ((sInput[i] != END) && (i < sInput.Length)) - { - if (sInput[i].StartsWith(VALUE, StringComparison.OrdinalIgnoreCase)) - { - key = sInput[i].Split(' ')[1]; - } - else - { - kvp = new KeyValuePair(key, sInput[i]); - l.Add(kvp); - } - i++; - } - return l.ToArray(); - } - - private byte[] GetResponse() - { - byte[] res = new byte[1024]; - MemoryStream ms = new MemoryStream(); - int cnt = stream.Read(res, 0, 1024); - while (cnt > 0) - { - ms.Write(res, 0, cnt); - if (cnt < 1024) break; - cnt = stream.Read(res, 0, 1024); - } - byte[] res2 = ms.ToArray(); - ValidateErrorResponse(res2); - return res2; - } - - #endregion - } -} diff --git a/Source/MySql.Data/MySql.Data.csproj b/Source/MySql.Data/MySql.Data.csproj deleted file mode 100644 index 6b2cf112a..000000000 --- a/Source/MySql.Data/MySql.Data.csproj +++ /dev/null @@ -1,385 +0,0 @@ - - - - Debug - AnyCPU - - - - - - 9.0.30729 - 2.0 - 4.5 - v4.5.1 - NET_45_OR_GREATER - false - - - - - 9.0.30729 - 2.0 - 4.0 - v4.0 - NET_40_OR_GREATER - - - - - 9.0.30729 - 2.0 - 4.5 - v4.5.1 - NET_45_OR_GREATER; - true - - - - - {E9DF5ED1-4CBD-4226-B931-9A51610AC14D} - Library - Properties - MySql.Data.MySqlClient - MySql.Data - 512 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - true - full - false - $(TargetFrameworkVersion)\ - obj\$(TargetFrameworkVersion)\ - obj\$(TargetFrameworkVersion)\ - bin\$(TargetFrameworkVersion)\Debug\ - TRACE;DEBUG;NET_45_OR_GREATER - prompt - 4 - AllRules.ruleset - true - false - - - pdbonly - true - $(TargetFrameworkVersion)\ - obj\$(TargetFrameworkVersion)\ - obj\$(TargetFrameworkVersion)\ - bin\$(TargetFrameworkVersion)\Release\ - $(DefineConstants);TRACE - prompt - 4 - AllRules.ruleset - bin\Release\MySql.Data.XML - false - - - pdbonly - true - NET40_Only\ - obj\NET40_Only\ - obj\NET40_Only\ - bin\NET40_Only\Release\ - $(DefineConstants);TRACE - prompt - 4 - AllRules.ruleset - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Component - - - - - - - - Code - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - True - True - Resources.resx - - - ResourcesX.resx - True - True - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - PublicResXFileCodeGenerator - Resources.Designer.cs - - - ResXFileCodeGenerator - ResourcesX.Designer.cs - - - - - CHANGES - - - - - - - - - - - - - - - - MySql.Data - - - MySql.Data.MySqlClient.Properties - - - - - - - - - - - - - \ No newline at end of file diff --git a/Source/MySql.Data/MySql.Data.xproj b/Source/MySql.Data/MySql.Data.xproj deleted file mode 100644 index 8f1c1d426..000000000 --- a/Source/MySql.Data/MySql.Data.xproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 8f0f6915-49b2-42f8-a592-bef9a09f3811 - MySql.Data.MySqlClient - .\obj - .\bin\ - v4.6.1 - - - 2.0 - - - \ No newline at end of file diff --git a/Source/MySql.Data/MySqlClientFactory.cs b/Source/MySql.Data/MySqlClientFactory.cs deleted file mode 100644 index 1cf87ba1a..000000000 --- a/Source/MySql.Data/MySqlClientFactory.cs +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -#if !PocketPC - -using System; -using System.Data.Common; -using System.Reflection; - -#if !NETCORE10 -using System.Security.Permissions; -#endif - -namespace MySql.Data.MySqlClient -{ - /// - /// DBProviderFactory implementation for MysqlClient. - /// -#if !NETCORE10 - [ReflectionPermission(SecurityAction.Assert, MemberAccess = true)] -#endif - public sealed partial class MySqlClientFactory : DbProviderFactory, IServiceProvider - { - /// - /// Gets an instance of the . - /// This can be used to retrieve strongly typed data objects. - /// - public static MySqlClientFactory Instance = new MySqlClientFactory(); - private Type _dbServicesType; - private FieldInfo _mySqlDbProviderServicesInstance; - - /// - /// Returns a strongly typed instance. - /// - /// A new strongly typed instance of DbCommand. - public override DbCommand CreateCommand() - { - return new MySqlCommand(); - } - - /// - /// Returns a strongly typed instance. - /// - /// A new strongly typed instance of DbConnection. - public override DbConnection CreateConnection() - { - return new MySqlConnection(); - } - - /// - /// Returns a strongly typed instance. - /// - /// A new strongly typed instance of DbParameter. - public override DbParameter CreateParameter() - { - return new MySqlParameter(); - } - - /// - /// Returns a strongly typed instance. - /// - /// A new strongly typed instance of DbConnectionStringBuilder. - public override DbConnectionStringBuilder CreateConnectionStringBuilder() - { - return new MySqlConnectionStringBuilder(); - } - - #region IServiceProvider Members - - /// - /// Provide a simple caching layer - /// - private Type DbServicesType => _dbServicesType ?? (_dbServicesType = Type.GetType( - @"System.Data.Common.DbProviderServices, System.Data.Entity, - Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", - false)); - - private FieldInfo MySqlDbProviderServicesInstance - { - get - { - if (_mySqlDbProviderServicesInstance == null) - { -#if NETCORE10 - string fullName = typeof(MySqlClientFactory).GetTypeInfo().Assembly.FullName; -#else - string fullName = Assembly.GetExecutingAssembly().FullName; -#endif - string assemblyName = fullName.Replace("MySql.Data", "MySql.Data.Entity"); - string assemblyEf5Name = fullName.Replace("MySql.Data", "MySql.Data.Entity.EF5"); - fullName = $"MySql.Data.MySqlClient.MySqlProviderServices, {assemblyEf5Name}"; - - Type providerServicesType = Type.GetType(fullName, false); - if (providerServicesType == null) - { - fullName = $"MySql.Data.MySqlClient.MySqlProviderServices, {assemblyName}"; - providerServicesType = Type.GetType(fullName, false); - if (providerServicesType == null) - throw new DllNotFoundException(fullName); - } - _mySqlDbProviderServicesInstance = providerServicesType.GetField("Instance", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); - } - return _mySqlDbProviderServicesInstance; - } - } - - object IServiceProvider.GetService(Type serviceType) - { - // DbProviderServices is the only service we offer up right now - return serviceType != DbServicesType ? null : MySqlDbProviderServicesInstance?.GetValue(null); - } - - #endregion - } -} - -#endif diff --git a/Source/MySql.Data/MySqlClientPermission.cs b/Source/MySql.Data/MySqlClientPermission.cs deleted file mode 100644 index 5b493bcdd..000000000 --- a/Source/MySql.Data/MySqlClientPermission.cs +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright © 2004, 2010, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Data; -using System.Data.Common; -using System.Security; -using System.Security.Permissions; - -namespace MySql.Data.MySqlClient -{ - [Serializable] - public sealed class MySqlClientPermission : DBDataPermission - { - - #region Contructors - - public MySqlClientPermission(PermissionState permissionState) - : base(permissionState) - { - } - - private MySqlClientPermission(MySqlClientPermission permission):base(permission) - { - } - - internal MySqlClientPermission(MySqlClientPermissionAttribute permissionAttribute):base(permissionAttribute) - { - } - - internal MySqlClientPermission (DBDataPermission permission) - : base (permission) - { - } - - internal MySqlClientPermission(string connectionString) - : base(PermissionState.None) - { - if ((connectionString == null) || connectionString.Length == 0) - base.Add(string.Empty, string.Empty, KeyRestrictionBehavior.AllowOnly); - else - base.Add(connectionString, string.Empty, KeyRestrictionBehavior.AllowOnly); - } - - - #endregion - - #region Methods - - /// - /// Adds a new connection string with set of restricted keywords to the MySqlClientPermission object - /// - ///Settings to be used for the connection - ///Keywords to define the restrictions - ///KeyRestrictionBehavior to be used - public override void Add(string connectionString, string restrictions, KeyRestrictionBehavior behavior) - { - base.Add(connectionString, restrictions, behavior); - } - - /// - /// Returns MySqlClientPermission as an IPermission - /// - /// - public override IPermission Copy() - { - return new MySqlClientPermission(this); - } - - #endregion - - } -} diff --git a/Source/MySql.Data/MySqlClientPermissionAttribute.cs b/Source/MySql.Data/MySqlClientPermissionAttribute.cs deleted file mode 100644 index 217069378..000000000 --- a/Source/MySql.Data/MySqlClientPermissionAttribute.cs +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright © 2004, 2010, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Data.Common; -using System.Security; -using System.Security.Permissions; - -namespace MySql.Data.MySqlClient -{ - [Serializable, AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Struct | AttributeTargets.Class | AttributeTargets.Assembly, AllowMultiple = true, Inherited = false)] - public sealed class MySqlClientPermissionAttribute : DBDataPermissionAttribute - { - // Methods - public MySqlClientPermissionAttribute(SecurityAction action) : base(action) - { - } - - public override IPermission CreatePermission() - { - return new MySqlClientPermission(this); - } - } -} diff --git a/Source/MySql.Data/MySqlConfiguration.cs b/Source/MySql.Data/MySqlConfiguration.cs deleted file mode 100644 index 2a4cbe259..000000000 --- a/Source/MySql.Data/MySqlConfiguration.cs +++ /dev/null @@ -1,165 +0,0 @@ -// Copyright © 2013, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using System.Configuration; - -namespace MySql.Data.MySqlClient -{ - public sealed class MySqlConfiguration : ConfigurationSection - { - private static MySqlConfiguration settings - = ConfigurationManager.GetSection("MySQL") as MySqlConfiguration; - - public static MySqlConfiguration Settings - { - get { return settings; } - } - - [ConfigurationProperty("ExceptionInterceptors", IsRequired = false)] - [ConfigurationCollection(typeof(InterceptorConfigurationElement), AddItemName = "add", ClearItemsName = "clear", RemoveItemName = "remove")] - public GenericConfigurationElementCollection ExceptionInterceptors - { - get { return (GenericConfigurationElementCollection)this["ExceptionInterceptors"]; } - } - - [ConfigurationProperty("CommandInterceptors", IsRequired = false)] - [ConfigurationCollection(typeof(InterceptorConfigurationElement), AddItemName = "add", ClearItemsName = "clear", RemoveItemName = "remove")] - public GenericConfigurationElementCollection CommandInterceptors - { - get { return (GenericConfigurationElementCollection)this["CommandInterceptors"]; } - } - - [ConfigurationProperty("AuthenticationPlugins", IsRequired = false)] - [ConfigurationCollection(typeof(AuthenticationPluginConfigurationElement), AddItemName = "add", ClearItemsName = "clear", RemoveItemName = "remove")] - public GenericConfigurationElementCollection AuthenticationPlugins - { - get { return (GenericConfigurationElementCollection)this["AuthenticationPlugins"]; } - } - - [ConfigurationProperty("Replication", IsRequired = true)] - public ReplicationConfigurationElement Replication - { - get - { - return (ReplicationConfigurationElement)this["Replication"]; - } - set - { - this["Replication"] = value; - } - } - - } - - /// - /// - /// - public sealed class AuthenticationPluginConfigurationElement : ConfigurationElement - { - [ConfigurationProperty("name", IsRequired = true)] - public string Name - { - get - { - return (string)this["name"]; - } - set - { - this["name"] = value; - } - } - - [ConfigurationProperty("type", IsRequired = true)] - public string Type - { - get - { - return (string)this["type"]; - } - set - { - this["type"] = value; - } - } - } - - /// - /// - /// - public sealed class InterceptorConfigurationElement : ConfigurationElement - { - [ConfigurationProperty("name", IsRequired = true)] - public string Name - { - get - { - return (string)this["name"]; - } - set - { - this["name"] = value; - } - } - - [ConfigurationProperty("type", IsRequired = true)] - public string Type - { - get - { - return (string)this["type"]; - } - set - { - this["type"] = value; - } - } - } - - /// - /// - /// - /// - public sealed class GenericConfigurationElementCollection : ConfigurationElementCollection, IEnumerable where T : ConfigurationElement, new() - { - List _elements = new List(); - - protected override ConfigurationElement CreateNewElement() - { - T newElement = new T(); - _elements.Add(newElement); - return newElement; - } - - protected override object GetElementKey(ConfigurationElement element) - { - return _elements.Find(e => e.Equals(element)); - } - - public new IEnumerator GetEnumerator() - { - return _elements.GetEnumerator(); - } - } -} diff --git a/Source/MySql.Data/MySqlConnectionStringBuilder.cs b/Source/MySql.Data/MySqlConnectionStringBuilder.cs deleted file mode 100644 index 7d0a99faf..000000000 --- a/Source/MySql.Data/MySqlConnectionStringBuilder.cs +++ /dev/null @@ -1,1383 +0,0 @@ -// Copyright © 2013, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using MySql.Data.Common; -using System.Reflection; - -namespace MySql.Data.MySqlClient -{ - public sealed partial class MySqlConnectionStringBuilder - { - internal Dictionary values = new Dictionary(); - //internal Dictionary values - //{ - // get { lock (this) { return _values; } } - //} - - private static readonly MySqlConnectionStringOptionCollection Options = new MySqlConnectionStringOptionCollection(); - - static MySqlConnectionStringBuilder() - { - // Server options - Options.Add(new MySqlConnectionStringOption("server", "host,data source,datasource,address,addr,network address", typeof(string), "" /*"localhost"*/, false)); - Options.Add(new MySqlConnectionStringOption("database", "initial catalog", typeof(string), string.Empty, false)); - Options.Add(new MySqlConnectionStringOption("protocol", "connection protocol, connectionprotocol", typeof(MySqlConnectionProtocol), MySqlConnectionProtocol.Sockets, false)); - Options.Add(new MySqlConnectionStringOption("port", null, typeof(uint), ( uint )3306, false)); - Options.Add(new MySqlConnectionStringOption("pipe", "pipe name,pipename", typeof(string), "MYSQL", false)); - Options.Add(new MySqlConnectionStringOption("compress", "use compression,usecompression", typeof(bool), false, false)); - Options.Add(new MySqlConnectionStringOption("allowbatch", "allow batch", typeof(bool), true, false)); - Options.Add(new MySqlConnectionStringOption("logging", null, typeof(bool), false, false)); - Options.Add(new MySqlConnectionStringOption("sharedmemoryname", "shared memory name", typeof(string), "MYSQL", false)); - Options.Add(new MySqlConnectionStringOption("useoldsyntax", "old syntax,oldsyntax,use old syntax", typeof(bool), false, true, - delegate(MySqlConnectionStringBuilder msb, MySqlConnectionStringOption sender, object value) - { - MySqlTrace.LogWarning(-1, "Use Old Syntax is now obsolete. Please see documentation"); - msb.SetValue("useoldsyntax", value); - }, - (msb, sender) => (bool) msb.values["useoldsyntax"] - )); - Options.Add(new MySqlConnectionStringOption("connectiontimeout", "connection timeout,connect timeout", typeof(uint), (uint)15, false, - delegate(MySqlConnectionStringBuilder msb, MySqlConnectionStringOption sender, object Value) - { - uint value = (uint)Convert.ChangeType(Value, sender.BaseType); - // Timeout in milliseconds should not exceed maximum for 32 bit - // signed integer (~24 days). We truncate the value if it exceeds - // maximum (MySqlCommand.CommandTimeout uses the same technique - uint timeout = Math.Min(value, Int32.MaxValue / 1000); - if (timeout != value) - { - MySqlTrace.LogWarning(-1, "Connection timeout value too large (" - + value + " seconds). Changed to max. possible value" + - +timeout + " seconds)"); - } - msb.SetValue("connectiontimeout", timeout); - }, - (msb, sender) => (uint) msb.values["connectiontimeout"] - )); - Options.Add(new MySqlConnectionStringOption("defaultcommandtimeout", "command timeout,default command timeout", typeof(uint), ( uint )30, false)); - Options.Add(new MySqlConnectionStringOption("usedefaultcommandtimeoutforef", "use default command timeout for ef", typeof(bool), false, false)); - - // authentication options - Options.Add(new MySqlConnectionStringOption("user id", "uid,username,user name,user,userid", typeof(string), "", false)); - Options.Add(new MySqlConnectionStringOption("password", "pwd", typeof(string), "", false)); - Options.Add(new MySqlConnectionStringOption("persistsecurityinfo", "persist security info", typeof(bool), false, false)); - Options.Add(new MySqlConnectionStringOption("encrypt", null, typeof(bool), false, true, - delegate(MySqlConnectionStringBuilder msb, MySqlConnectionStringOption sender, object value) - { - // just for this case, reuse the logic to translate string to bool - sender.ValidateValue(ref value); - MySqlTrace.LogWarning(-1, "Encrypt is now obsolete. Use Ssl Mode instead"); - msb.SetValue("Ssl Mode", ( bool)value ? MySqlSslMode.Prefered : MySqlSslMode.None); - }, - (msb, sender) => msb.SslMode != MySqlSslMode.None - )); - Options.Add(new MySqlConnectionStringOption("certificatefile", "certificate file", typeof(string), null, false)); - Options.Add(new MySqlConnectionStringOption("certificatepassword", "certificate password,ssl-ca-pwd", typeof(string), null, false)); - Options.Add(new MySqlConnectionStringOption("certificatestorelocation", "certificate store location", typeof(MySqlCertificateStoreLocation), MySqlCertificateStoreLocation.None, false)); - Options.Add(new MySqlConnectionStringOption("certificatethumbprint", "certificate thumb print", typeof(string), null, false)); - Options.Add(new MySqlConnectionStringOption("integratedsecurity", "integrated security", typeof(bool), false, false, - delegate(MySqlConnectionStringBuilder msb, MySqlConnectionStringOption sender, object value) - { -#if !NETCORE10 - if (!Platform.IsWindows()) - throw new MySqlException("IntegratedSecurity is supported on Windows only"); -#endif - msb.SetValue("Integrated Security", value); - }, - delegate(MySqlConnectionStringBuilder msb, MySqlConnectionStringOption sender) - { - object val = msb.values["Integrated Security"]; - return (bool)val; - } - )); - - // Other properties - Options.Add(new MySqlConnectionStringOption("allowzerodatetime", "allow zero datetime", typeof(bool), false, false)); - Options.Add(new MySqlConnectionStringOption("convertzerodatetime", "convert zero datetime", typeof(bool), false, false)); - Options.Add(new MySqlConnectionStringOption("useusageadvisor", "use usage advisor,usage advisor", typeof(bool), false, false)); - Options.Add(new MySqlConnectionStringOption("procedurecachesize", "procedure cache size,procedure cache,procedurecache", typeof(uint), ( uint )25, false)); - Options.Add(new MySqlConnectionStringOption("useperformancemonitor", "use performance monitor,useperfmon,perfmon", typeof(bool), false, false)); - Options.Add(new MySqlConnectionStringOption("ignoreprepare", "ignore prepare", typeof(bool), true, false)); - Options.Add(new MySqlConnectionStringOption("useprocedurebodies", "use procedure bodies,procedure bodies", typeof(bool), true, true, - delegate(MySqlConnectionStringBuilder msb, MySqlConnectionStringOption sender, object value) - { - sender.ValidateValue(ref value); - MySqlTrace.LogWarning(-1, "Use Procedure Bodies is now obsolete. Use Check Parameters instead"); - msb.SetValue("checkparameters", value); - msb.SetValue("useprocedurebodies", value); - }, - (msb, sender) => (bool) msb.values["useprocedurebodies"] - )); - Options.Add(new MySqlConnectionStringOption("autoenlist", "auto enlist", typeof(bool), true, false)); - Options.Add(new MySqlConnectionStringOption("respectbinaryflags", "respect binary flags", typeof(bool), true, false)); - Options.Add(new MySqlConnectionStringOption("treattinyasboolean", "treat tiny as boolean", typeof(bool), true, false)); - Options.Add(new MySqlConnectionStringOption("allowuservariables", "allow user variables", typeof(bool), false, false)); - Options.Add(new MySqlConnectionStringOption("interactivesession", "interactive session,interactive", typeof(bool), false, false)); - Options.Add(new MySqlConnectionStringOption("functionsreturnstring", "functions return string", typeof(bool), false, false)); - Options.Add(new MySqlConnectionStringOption("useaffectedrows", "use affected rows", typeof(bool), false, false)); - Options.Add(new MySqlConnectionStringOption("oldguids", "old guids", typeof(bool), false, false)); - Options.Add(new MySqlConnectionStringOption("keepalive", "keep alive", typeof(uint), (uint)0, false)); - Options.Add(new MySqlConnectionStringOption("sqlservermode", "sql server mode", typeof(bool), false, false)); - Options.Add(new MySqlConnectionStringOption("tablecaching", "table cache,tablecache", typeof(bool), false, false)); - Options.Add(new MySqlConnectionStringOption("defaulttablecacheage", "default table cache age", typeof(int), ( int ) 60, false)); - Options.Add(new MySqlConnectionStringOption("checkparameters", "check parameters", typeof(bool), true, false)); - Options.Add(new MySqlConnectionStringOption("replication", null, typeof(bool), false, false)); - Options.Add(new MySqlConnectionStringOption("exceptioninterceptors", "exception interceptors", typeof(string), null, false)); - Options.Add(new MySqlConnectionStringOption("commandinterceptors", "command interceptors", typeof(string), null, false)); - Options.Add(new MySqlConnectionStringOption("includesecurityasserts", "include security asserts", typeof(bool), false, false)); - - // pooling options - Options.Add(new MySqlConnectionStringOption("connectionlifetime", "connection lifetime", typeof(uint), ( uint )0, false)); - Options.Add(new MySqlConnectionStringOption("pooling", null, typeof(bool), true, false)); - Options.Add(new MySqlConnectionStringOption("minpoolsize", "minimumpoolsize,min pool size,minimum pool size", typeof(uint), (uint)0, false)); - Options.Add(new MySqlConnectionStringOption("maxpoolsize", "maximumpoolsize,max pool size,maximum pool size", typeof(uint), (uint)100, false)); - Options.Add(new MySqlConnectionStringOption("connectionreset", "connection reset", typeof(bool), false, false)); - Options.Add(new MySqlConnectionStringOption("cacheserverproperties", "cache server properties", typeof(bool), false, false)); - - // language and charset options - Options.Add(new MySqlConnectionStringOption("characterset", "character set,charset", typeof(string), "", false)); - Options.Add(new MySqlConnectionStringOption("treatblobsasutf8", "treat blobs as utf8", typeof(bool), false, false)); - Options.Add(new MySqlConnectionStringOption("blobasutf8includepattern", null, typeof(string), "", false)); - Options.Add(new MySqlConnectionStringOption("blobasutf8excludepattern", null, typeof(string), "", false)); - Options.Add(new MySqlConnectionStringOption("sslmode", "ssl mode", typeof(MySqlSslMode), MySqlSslMode.Preferred, false)); - Options.Add(new MySqlConnectionStringOption("sslenable", "ssl-enable", typeof(bool), false, false, - (msb, sender, value) => { msb.SslEnable = bool.Parse(value as string); }, - (msb, sender) => { return msb.SslEnable; })); - Options.Add(new MySqlConnectionStringOption("sslca", "ssl-ca", typeof(string), null, false, - (msb, sender, value) => { msb.SslCa = value as string; }, - (msb, sender) => { return msb.SslCa; })); - Options.Add(new MySqlConnectionStringOption("sslcrl", "ssl-crl", typeof(string), null, false, - (msb, sender, value) => { msb.SslCrl = value as string; }, - (msb, sender) => { return msb.SslCrl; })); - } - - public MySqlConnectionStringBuilder() - { - HasProcAccess = true; - // Populate initial values - lock (this) - { - foreach (MySqlConnectionStringOption option in Options.Options) - { - values[option.Keyword] = option.DefaultValue; - } - } - } - - public MySqlConnectionStringBuilder(string connStr) - : this() - { - lock (this) - { - ConnectionString = connStr; - } - } - - #region Server Properties - -/// -/// Gets or sets the name of the server. -/// -/// The server. -#if !NETCORE10 - [Category("Connection")] - [Description("Server to connect to")] - [RefreshProperties(RefreshProperties.All)] -#endif - public string Server - { - get { return this["server"] as string; } - set { this[ "server" ] = value; } - } - - /// - /// Gets or sets the name of the database the connection should - /// initially connect to. - /// -#if !NETCORE10 - [Category("Connection")] - [Description("Database to use initially")] - [RefreshProperties(RefreshProperties.All)] -#endif - public string Database - { - get { return values["database"] as string; } - set { SetValue("database", value); } - } - - /// - /// Gets or sets the protocol that should be used for communicating - /// with MySQL. - /// -#if !NETCORE10 - [Category("Connection")] - [DisplayName("Connection Protocol")] - [Description("Protocol to use for connection to MySQL")] - [RefreshProperties(RefreshProperties.All)] -#endif - public MySqlConnectionProtocol ConnectionProtocol - { - get { return (MySqlConnectionProtocol)values["protocol"]; } - set { SetValue("protocol", value); } - } - - /// - /// Gets or sets the name of the named pipe that should be used - /// for communicating with MySQL. - /// -#if !NETCORE10 - [Category("Connection")] - [DisplayName("Pipe Name")] - [Description("Name of pipe to use when connecting with named pipes (Win32 only)")] - [RefreshProperties(RefreshProperties.All)] -#endif - public string PipeName - { - get { return (string)values["pipe"]; } - set { SetValue("pipe", value); } - } - - /// - /// Gets or sets a boolean value that indicates whether this connection - /// should use compression. - /// -#if !NETCORE10 - [Category("Connection")] - [DisplayName("Use Compression")] - [Description("Should the connection use compression")] - [RefreshProperties(RefreshProperties.All)] -#endif - public bool UseCompression - { - get { return (bool)values["compress"]; } - set { SetValue("compress", value); } - } - - /// - /// Gets or sets a boolean value that indicates whether this connection will allow - /// commands to send multiple SQL statements in one execution. - /// -#if !NETCORE10 - [Category("Connection")] - [DisplayName("Allow Batch")] - [Description("Allows execution of multiple SQL commands in a single statement")] - [RefreshProperties(RefreshProperties.All)] -#endif - public bool AllowBatch - { - get { return (bool)values["allowbatch"]; } - set { SetValue("allowbatch", value); } - } - - /// - /// Gets or sets a boolean value that indicates whether logging is enabled. - /// -#if !NETCORE10 - [Category("Connection")] - [Description("Enables output of diagnostic messages")] - [RefreshProperties(RefreshProperties.All)] -#endif - public bool Logging - { - get { return (bool)values["logging"]; } - set { SetValue("logging", value); } - } - - /// - /// Gets or sets the base name of the shared memory objects used to - /// communicate with MySQL when the shared memory protocol is being used. - /// -#if !NETCORE10 - [Category("Connection")] - [DisplayName("Shared Memory Name")] - [Description("Name of the shared memory object to use")] - [RefreshProperties(RefreshProperties.All)] -#endif - public string SharedMemoryName - { - get { return (string)values["sharedmemoryname"]; } - set { SetValue("sharedmemoryname", value); } - } - - /// - /// Gets or sets a boolean value that indicates whether this connection uses - /// the old style (@) parameter markers or the new (?) style. - /// -#if !NETCORE10 - [Category("Connection")] - [DisplayName("Use Old Syntax")] - [Description("Allows the use of old style @ syntax for parameters")] - [RefreshProperties(RefreshProperties.All)] -#endif - [Obsolete("Use Old Syntax is no longer needed. See documentation")] - public bool UseOldSyntax - { - get { return (bool)values["useoldsyntax"]; } - set { SetValue("useoldsyntax", value); } - } - - /// - /// Gets or sets the port number that is used when the socket - /// protocol is being used. - /// -#if !NETCORE10 - [Category("Connection")] - [Description("Port to use for TCP/IP connections")] - [RefreshProperties(RefreshProperties.All)] -#endif - public uint Port - { - get { return (uint)values["port"]; } - set { SetValue("port", value); } - } - - /// - /// Gets or sets the connection timeout. - /// -#if !NETCORE10 - [Category("Connection")] - [DisplayName("Connect Timeout")] - [Description("The length of time (in seconds) to wait for a connection " + - "to the server before terminating the attempt and generating an error.")] - [RefreshProperties(RefreshProperties.All)] -#endif - public uint ConnectionTimeout - { - get { return (uint)values["connectiontimeout"]; } - - set - { - // Timeout in milliseconds should not exceed maximum for 32 bit - // signed integer (~24 days). We truncate the value if it exceeds - // maximum (MySqlCommand.CommandTimeout uses the same technique - uint timeout = Math.Min(value, Int32.MaxValue / 1000); - if (timeout != value) - { - MySqlTrace.LogWarning(-1, "Connection timeout value too large (" - + value + " seconds). Changed to max. possible value" + - +timeout + " seconds)"); - } - SetValue("connectiontimeout", timeout); - } - } - - /// - /// Gets or sets the default command timeout. - /// -#if !NETCORE10 - [Category("Connection")] - [DisplayName("Default Command Timeout")] - [Description(@"The default timeout that MySqlCommand objects will use - unless changed.")] - [RefreshProperties(RefreshProperties.All)] -#endif - public uint DefaultCommandTimeout - { - get { return (uint)values["defaultcommandtimeout"]; } - set { SetValue("defaultcommandtimeout", value); } - } - - #endregion - - #region Authentication Properties - - /// - /// Gets or sets the user id that should be used to connect with. - /// -#if !NETCORE10 - [Category("Security")] - [DisplayName("User Id")] - [Description("Indicates the user ID to be used when connecting to the data source.")] - [RefreshProperties(RefreshProperties.All)] -#endif - public string UserID - { - get { return (string)values["user id"]; } - set { SetValue("user id", value); } - } - - /// - /// Gets or sets the password that should be used to connect with. - /// -#if !NETCORE10 - [Category("Security")] - [Description("Indicates the password to be used when connecting to the data source.")] - [PasswordPropertyText(true)] - [RefreshProperties(RefreshProperties.All)] -#endif - public string Password - { - get { return (string)values["password"]; } - set { SetValue("password", value); } - } - - /// - /// Gets or sets a boolean value that indicates if the password should be persisted - /// in the connection string. - /// -#if !NETCORE10 - [Category("Security")] - [DisplayName("Persist Security Info")] - [Description("When false, security-sensitive information, such as the password, " + - "is not returned as part of the connection if the connection is open or " + - "has ever been in an open state.")] - [RefreshProperties(RefreshProperties.All)] -#endif - public bool PersistSecurityInfo - { - get { return (bool)values["persistsecurityinfo"]; } - set { SetValue("persistsecurityinfo", value); } - } - -#if !NETCORE10 - [Category("Authentication")] - [Description("Should the connection use SSL.")] -#endif - [Obsolete("Use Ssl Mode instead.")] - internal bool Encrypt - { - get { return SslMode != MySqlSslMode.None; } - set - { - SetValue("Ssl Mode", value ? MySqlSslMode.Prefered : MySqlSslMode.None); - } - } - -#if !NETCORE10 - [Category("Authentication")] - [DisplayName("Certificate File")] - [Description("Certificate file in PKCS#12 format (.pfx)")] -#endif - public string CertificateFile - { - get { return (string)values["certificatefile"]; } - set { SetValue("certificatefile", value); } - } - -#if !NETCORE10 - [Category("Authentication")] - [DisplayName("Certificate Password")] - [Description("Password for certificate file")] -#endif - public string CertificatePassword - { - get { return (string)values["certificatepassword"]; } - set { SetValue("certificatepassword", value); } - } - -#if !NETCORE10 - [Category("Authentication")] - [DisplayName("Certificate Store Location")] - [Description("Certificate Store Location for client certificates")] -#endif - [DefaultValue(MySqlCertificateStoreLocation.None)] - public MySqlCertificateStoreLocation CertificateStoreLocation - { - get { return (MySqlCertificateStoreLocation)values["certificatestorelocation"]; } - set { SetValue("certificatestorelocation", value); } - } - -#if !NETCORE10 - [Category("Authentication")] - [DisplayName("Certificate Thumbprint")] - [Description("Certificate thumbprint. Can be used together with Certificate " + - "Store Location parameter to uniquely identify certificate to be used " + - "for SSL authentication.")] -#endif - public string CertificateThumbprint - { - get { return (string)values["certificatethumbprint"]; } - set { SetValue("certificatethumbprint", value); } - } - -#if !NETCORE10 - [Category("Authentication")] - [DisplayName("Integrated Security")] - [Description("Use windows authentication when connecting to server")] -#endif - [DefaultValue(false)] - public bool IntegratedSecurity - { - get { return (bool)values["integratedsecurity"]; } - set - { -#if !NETCORE10 - if (!Platform.IsWindows()) - throw new MySqlException("IntegratedSecurity is supported on Windows only"); -#endif - - SetValue("integratedsecurity", value); - } - } - - #endregion - - #region Other Properties - - /// - /// Gets or sets a boolean value that indicates if zero date time values are supported. - /// -#if !NETCORE10 - [Category("Advanced")] - [DisplayName("Allow Zero Datetime")] - [Description("Should zero datetimes be supported")] - [RefreshProperties(RefreshProperties.All)] -#endif - [DefaultValue(false)] - public bool AllowZeroDateTime - { - get { return (bool)values["allowzerodatetime"]; } - set { SetValue("allowzerodatetime", value); } - } - - /// - /// Gets or sets a boolean value indicating if zero datetime values should be - /// converted to DateTime.MinValue. - /// -#if !NETCORE10 - [Category("Advanced")] - [DisplayName("Convert Zero Datetime")] - [Description("Should illegal datetime values be converted to DateTime.MinValue")] - [RefreshProperties(RefreshProperties.All)] -#endif - [DefaultValue(false)] - public bool ConvertZeroDateTime - { - get { return (bool)values["convertzerodatetime"]; } - set { SetValue("convertzerodatetime", value); } - } - - /// - /// Gets or sets a boolean value indicating if the Usage Advisor should be enabled. - /// -#if !NETCORE10 - [Category("Advanced")] - [DisplayName("Use Usage Advisor")] - [Description("Logs inefficient database operations")] - [RefreshProperties(RefreshProperties.All)] -#endif - [DefaultValue(false)] - public bool UseUsageAdvisor - { - get { return (bool)values["useusageadvisor"]; } - set { SetValue("useusageadvisor", value); } - } - - /// - /// Gets or sets the size of the stored procedure cache. - /// -#if !NETCORE10 - [Category("Advanced")] - [DisplayName("Procedure Cache Size")] - [Description("Indicates how many stored procedures can be cached at one time. " + - "A value of 0 effectively disables the procedure cache.")] - [RefreshProperties(RefreshProperties.All)] -#endif - [DefaultValue(25)] - public uint ProcedureCacheSize - { - get { return (uint)values["procedurecachesize"]; } - set { SetValue("procedurecachesize", value); } - } - - /// - /// Gets or sets a boolean value indicating if the permon hooks should be enabled. - /// -#if !NETCORE10 - [Category("Advanced")] - [DisplayName("Use Performance Monitor")] - [Description("Indicates that performance counters should be updated during execution.")] - [RefreshProperties(RefreshProperties.All)] -#endif - [DefaultValue(false)] - public bool UsePerformanceMonitor - { - get { return (bool)values["useperformancemonitor"]; } - set { SetValue("useperformancemonitor", value); } - } - - /// - /// Gets or sets a boolean value indicating if calls to Prepare() should be ignored. - /// -#if !NETCORE10 - [Category("Advanced")] - [DisplayName("Ignore Prepare")] - [Description("Instructs the provider to ignore any attempts to prepare a command.")] - [RefreshProperties(RefreshProperties.All)] -#endif - [DefaultValue(true)] - public bool IgnorePrepare - { - get { return (bool)values["ignoreprepare"]; } - set { SetValue("ignoreprepare", value); } - } - -#if !NETCORE10 - [Category("Advanced")] - [DisplayName("Use Procedure Bodies")] - [Description("Indicates if stored procedure bodies will be available for parameter detection.")] -#endif - [DefaultValue(true)] - [Obsolete("Use CheckParameters instead")] - public bool UseProcedureBodies - { - get { return (bool)values["useprocedurebodies"]; } - set { SetValue("useprocedurebodies", value); } - } - -#if !NETCORE10 - [Category("Advanced")] - [DisplayName("Auto Enlist")] - [Description("Should the connetion automatically enlist in the active connection, if there are any.")] - [RefreshProperties(RefreshProperties.All)] -#endif - [DefaultValue(true)] - public bool AutoEnlist - { - get { return (bool)values["autoenlist"]; } - set { SetValue("autoenlist", value); } - } - -#if !NETCORE10 - [Category("Advanced")] - [DisplayName("Respect Binary Flags")] - [Description("Should binary flags on column metadata be respected.")] - [RefreshProperties(RefreshProperties.All)] -#endif - [DefaultValue(true)] - public bool RespectBinaryFlags - { - get { return (bool)values["respectbinaryflags"]; } - set { SetValue("respectbinaryflags", value); } - } - -#if !NETCORE10 - [Category("Advanced")] - [DisplayName("Treat Tiny As Boolean")] - [Description("Should the provider treat TINYINT(1) columns as boolean.")] - [RefreshProperties(RefreshProperties.All)] -#endif - [DefaultValue(true)] - public bool TreatTinyAsBoolean - { - get { return (bool)values["treattinyasboolean"]; } - set { SetValue("treattinyasboolean", value); } - } - -#if !NETCORE10 - [Category("Advanced")] - [DisplayName("Allow User Variables")] - [Description("Should the provider expect user variables to appear in the SQL.")] - [RefreshProperties(RefreshProperties.All)] -#endif - [DefaultValue(false)] - public bool AllowUserVariables - { - get { return (bool)values["allowuservariables"]; } - set { SetValue("allowuservariables", value); } - } - -#if !NETCORE10 - [Category("Advanced")] - [DisplayName("Interactive Session")] - [Description("Should this session be considered interactive?")] - [RefreshProperties(RefreshProperties.All)] -#endif - [DefaultValue(false)] - public bool InteractiveSession - { - get { return (bool)values["interactivesession"]; } - set { SetValue("interactivesession", value); } - } - -#if !NETCORE10 - [Category("Advanced")] - [DisplayName("Functions Return String")] - [Description("Should all server functions be treated as returning string?")] -#endif - [DefaultValue(false)] - public bool FunctionsReturnString - { - get { return (bool)values["functionsreturnstring"]; } - set { SetValue("functionsreturnstring", value); } - } - -#if !NETCORE10 - [Category("Advanced")] - [DisplayName("Use Affected Rows")] - [Description("Should the returned affected row count reflect affected rows instead of found rows?")] -#endif - [DefaultValue(false)] - public bool UseAffectedRows - { - get { return (bool)values["useaffectedrows"]; } - set { SetValue("useaffectedrows", value); } - } - -#if !NETCORE10 - [Category("Advanced")] - [DisplayName("Old Guids")] - [Description("Treat binary(16) columns as guids")] -#endif - [DefaultValue(false)] - public bool OldGuids - { - get { return (bool)values["oldguids"]; } - set { SetValue("oldguids", value); } - } - -#if !NETCORE10 - [DisplayName("Keep Alive")] - [Description("For TCP connections, idle connection time measured in seconds, before the first keepalive packet is sent." + - "A value of 0 indicates that keepalive is not used.")] -#endif - [DefaultValue(0)] - public uint Keepalive - { - get { return (uint)values["keepalive"]; } - set { SetValue("keepalive", value); } - } - -#if !NETCORE10 - [Category("Advanced")] - [DisplayName("Sql Server Mode")] - [Description("Allow Sql Server syntax. " + - "A value of yes allows symbols to be enclosed with [] instead of ``. This does incur " + - "a performance hit so only use when necessary.")] -#endif - [DefaultValue(false)] - public bool SqlServerMode - { - get { return (bool)values["sqlservermode"]; } - set { SetValue("sqlservermode", value); } - } - -#if !NETCORE10 - [Category("Advanced")] - [DisplayName("Table Cache")] - [Description(@"Enables or disables caching of TableDirect command. - A value of yes enables the cache while no disables it.")] -#endif - [DefaultValue(false)] - public bool TableCaching - { - get { return (bool)values["tablecaching"]; } - set { SetValue("tablecachig", value); } - } - -#if !NETCORE10 - [Category("Advanced")] - [DisplayName("Default Table Cache Age")] - [Description(@"Specifies how long a TableDirect result should be cached in seconds.")] -#endif - [DefaultValue(60)] - public int DefaultTableCacheAge - { - get { return (int)values["defaulttablecacheage"]; } - set { SetValue("defaulttablecacheage", value); } - } - -#if !NETCORE10 - [Category("Advanced")] - [DisplayName("Check Parameters")] - [Description("Indicates if stored routine parameters should be checked against the server.")] -#endif - [DefaultValue(true)] - public bool CheckParameters - { - get { return (bool)values["checkparameters"]; } - set { SetValue("checkparameters", value); } - } - -#if !NETCORE10 - [Category("Advanced")] - [DisplayName("Replication")] - [Description("Indicates if this connection is to use replicated servers.")] -#endif - [DefaultValue(false)] - public bool Replication - { - get { return (bool)values["replication"]; } - set { SetValue("replication", value); } - } - -#if !NETCORE10 - [Category("Advanced")] - [DisplayName("Exception Interceptors")] - [Description("The list of interceptors that can triage thrown MySqlExceptions.")] -#endif - public string ExceptionInterceptors - { - get { return (string)values["exceptioninterceptors"]; } - set { SetValue("exceptioninterceptors", value); } - } - -#if !NETCORE10 - [Category("Advanced")] - [DisplayName("Command Interceptors")] - [Description("The list of interceptors that can intercept command operations.")] -#endif - public string CommandInterceptors - { - get { return (string)values["commandinterceptors"]; } - set { SetValue("commandinterceptors", value); } - } - -#if !NETCORE10 - [Category("Advanced")] - [DisplayName("Include Security Asserts")] - [Description("Include security asserts to support Medium Trust")] -#endif - [DefaultValue(false)] - public bool IncludeSecurityAsserts - { - get { return (bool)values["includesecurityasserts"]; } - set { SetValue("includesecurityasserts", value); } - } - - #endregion - - #region Pooling Properties - - /// - /// Gets or sets the lifetime of a pooled connection. - /// -#if !NETCORE10 - [Category("Pooling")] - [DisplayName("Connection Lifetime")] - [Description("The minimum amount of time (in seconds) for this connection to " + - "live in the pool before being destroyed.")] - [RefreshProperties(RefreshProperties.All)] -#endif - [DefaultValue(0)] - public uint ConnectionLifeTime - { - get { return (uint)values["connectionlifetime"]; } - set { SetValue("connectionlifetime", value); } - } - - /// - /// Gets or sets a boolean value indicating if connection pooling is enabled. - /// -#if !NETCORE10 - [Category("Pooling")] - [Description("When true, the connection object is drawn from the appropriate " + - "pool, or if necessary, is created and added to the appropriate pool.")] - [RefreshProperties(RefreshProperties.All)] -#endif - [DefaultValue(true)] - public bool Pooling - { - get { return (bool)values["pooling"]; } - set { SetValue("pooling", value); } - } - - /// - /// Gets the minimum connection pool size. - /// -#if !NETCORE10 - [Category("Pooling")] - [DisplayName("Minimum Pool Size")] - [Description("The minimum number of connections allowed in the pool.")] - [RefreshProperties(RefreshProperties.All)] -#endif - [DefaultValue(0)] - public uint MinimumPoolSize - { - get { return (uint)values["minpoolsize"]; } - set { SetValue("minpoolsize", value); } - } - - /// - /// Gets or sets the maximum connection pool setting. - /// -#if !NETCORE10 - [Category("Pooling")] - [DisplayName("Maximum Pool Size")] - [Description("The maximum number of connections allowed in the pool.")] - [RefreshProperties(RefreshProperties.All)] -#endif - [DefaultValue(100)] - public uint MaximumPoolSize - { - get { return (uint)values["maxpoolsize"]; } - set { SetValue("maxpoolsize", value); } - } - - /// - /// Gets or sets a boolean value indicating if the connection should be reset when retrieved - /// from the pool. - /// -#if !NETCORE10 - [Category("Pooling")] - [DisplayName("Connection Reset")] - [Description("When true, indicates the connection state is reset when removed from the pool.")] - [RefreshProperties(RefreshProperties.All)] -#endif - [DefaultValue(false)] - public bool ConnectionReset - { - get { return (bool)values["connectionreset"]; } - set { SetValue("connectionreset", value); } - } - -#if !NETCORE10 - [Category("Pooling")] - [DisplayName("Cache Server Properties")] - [Description("When true, server properties will be cached after the first server in the pool is created")] - [RefreshProperties(RefreshProperties.All)] -#endif - [DefaultValue(false)] - public bool CacheServerProperties - { - get { return (bool)values["cacheserverproperties"]; } - set { SetValue("cacheserverproperties", value); } - } - - #endregion - - #region Language and Character Set Properties - - /// - /// Gets or sets the character set that should be used for sending queries to the server. - /// -#if !NETCORE10 - [DisplayName("Character Set")] - [Category("Advanced")] - [Description("Character set this connection should use")] - [RefreshProperties(RefreshProperties.All)] -#endif - [DefaultValue("")] - public string CharacterSet - { - get { return (string)values["characterset"]; } - set { SetValue("characterset", value); } - } - - /// - /// Indicates whether the driver should treat binary blobs as UTF8 - /// -#if !NETCORE10 - [DisplayName("Treat Blobs As UTF8")] - [Category("Advanced")] - [Description("Should binary blobs be treated as UTF8")] - [RefreshProperties(RefreshProperties.All)] -#endif - [DefaultValue(false)] - public bool TreatBlobsAsUTF8 - { - get { return (bool)values["treatblobsasutf8"]; } - set { SetValue("treatblobsasutf8", value); } - } - - /// - /// Gets or sets the pattern that matches the columns that should be treated as UTF8 - /// -#if !NETCORE10 - [Category("Advanced")] - [Description("Pattern that matches columns that should be treated as UTF8")] - [RefreshProperties(RefreshProperties.All)] -#endif - public string BlobAsUTF8IncludePattern - { - get { return (string)values["blobasutf8includepattern"]; } - set { SetValue("blobasutf8includepattern", value); } - } - - /// - /// Gets or sets the pattern that matches the columns that should not be treated as UTF8 - /// -#if !NETCORE10 - [Category("Advanced")] - [Description("Pattern that matches columns that should not be treated as UTF8")] - [RefreshProperties(RefreshProperties.All)] -#endif - public string BlobAsUTF8ExcludePattern - { - get { return (string)values["blobasutf8excludepattern"]; } - set { SetValue("blobasutf8excludepattern", value); } - } - - /// - /// Indicates whether to use SSL connections and how to handle server certificate errors. - /// -#if !NETCORE10 - [DisplayName("Ssl Mode")] - [Category("Security")] - [Description("SSL properties for connection")] -#endif - [DefaultValue(MySqlSslMode.None)] - public MySqlSslMode SslMode - { - get { return (MySqlSslMode)values["sslmode"]; } - set { SetValue("sslmode", value); } - } - - #endregion - - #region Backwards compatibility properties -#if !NETCORE10 - [DisplayName("Use Default Command Timeout For EF")] - [Category("Backwards Compatibility")] - [Description("Enforces the command timeout of EFMySqlCommand to the value provided in 'DefaultCommandTimeout' property")] -#endif - [DefaultValue(false)] - public bool UseDefaultCommandTimeoutForEF - { - get { return (bool)values["usedefaultcommandtimeoutforef"]; } - set { SetValue("usedefaultcommandtimeoutforef", value); } - } -#endregion - -#region Fabric Properties - - public string FabricGroup { get; internal set; } - - public string ShardingTable { get; internal set; } - - public object ShardingKey { get; internal set; } - - public int? FabricServerMode { get; internal set; } - - public int? FabricScope { get; internal set; } - -#endregion - -#region XProperties - - [Description("X DevApi: enables the use of SSL as required")] - public bool SslEnable - { - get { return ((MySqlSslMode)this["sslmode"] != MySqlSslMode.None); } - set - { - if (value) - SslMode = MySqlSslMode.Required; - else - SslMode = MySqlSslMode.None; - } - } - - [Description("X DevApi: path to a local file that contains a list of trusted TLS/SSL CAs")] - public string SslCa - { - get { return CertificateFile; } - set - { - SslEnable = true; - CertificateFile = value; - } - } - - [Description("X DevApi: path to a local file containing certificate revocation lists")] - public string SslCrl - { - get { throw new NotSupportedException(); } - set { throw new NotSupportedException(); } - } - -#endregion - - internal bool HasProcAccess { get; set; } - - public override object this[string keyword] - { - get { MySqlConnectionStringOption opt = GetOption(keyword); return opt.Getter( this, opt ); } - set { MySqlConnectionStringOption opt = GetOption(keyword); opt.Setter( this, opt, value); } - } - - internal Regex GetBlobAsUTF8IncludeRegex() - { - if (String.IsNullOrEmpty(BlobAsUTF8IncludePattern)) return null; - return new Regex(BlobAsUTF8IncludePattern); - } - - internal Regex GetBlobAsUTF8ExcludeRegex() - { - if (String.IsNullOrEmpty(BlobAsUTF8ExcludePattern)) return null; - return new Regex(BlobAsUTF8ExcludePattern); - } - - public override void Clear() - { - base.Clear(); - lock (this) - { - foreach (var option in Options.Options) - if (option.DefaultValue != null) - values[option.Keyword] = option.DefaultValue; - else - values[option.Keyword] = null; - } - } - - internal void SetValue(string keyword, object value) - { - MySqlConnectionStringOption option = GetOption(keyword); - option.ValidateValue(ref value); - - // remove all related keywords - option.Clean(this); - - if (value != null) - { - lock (this) - { - // set value for the given keyword - values[option.Keyword] = value; - base[keyword] = value; - } - } - } - - private MySqlConnectionStringOption GetOption(string key) - { - MySqlConnectionStringOption option = Options.Get(key); - if (option == null) - throw new ArgumentException(Resources.KeywordNotSupported, key); - else - return option; - } - - public override bool ContainsKey(string keyword) - { - MySqlConnectionStringOption option = Options.Get(keyword); - return option != null; - } - - public override bool Remove(string keyword) - { - bool removed = false; - lock (this) { removed = base.Remove(keyword); } - if (!removed) return false; - MySqlConnectionStringOption option = GetOption(keyword); - lock (this) - { - values[option.Keyword] = option.DefaultValue; - } - return true; - } - - public string GetConnectionString(bool includePass) - { - if (includePass) return ConnectionString; - - StringBuilder conn = new StringBuilder(); - string delimiter = ""; - foreach (string key in this.Keys) - { - if (String.Compare(key, "password", StringComparison.OrdinalIgnoreCase) == 0 || - String.Compare(key, "pwd", StringComparison.OrdinalIgnoreCase) == 0) continue; - conn.AppendFormat(CultureInfo.CurrentCulture, "{0}{1}={2}", - delimiter, key, this[key]); - delimiter = ";"; - } - return conn.ToString(); - } - - public override bool Equals(object obj) - { - MySqlConnectionStringBuilder other = obj as MySqlConnectionStringBuilder; - if( obj == null ) - return false; - - if( this.values.Count != other.values.Count ) return false; - - foreach (KeyValuePair kvp in this.values) - { - if (other.values.ContainsKey(kvp.Key)) - { - object v = other.values[kvp.Key]; - if (v == null && kvp.Value != null) return false; - if (kvp.Value == null && v != null) return false; - if (kvp.Value == null && v == null) return true; - if (!v.Equals(kvp.Value)) return false; - } - else - { - return false; - } - } - - return true; - } - - public override int GetHashCode() - { - return base.GetHashCode(); - } - - } - - class MySqlConnectionStringOption - { - public MySqlConnectionStringOption(string keyword, string synonyms, Type baseType, object defaultValue, bool obsolete, - SetterDelegate setter, GetterDelegate getter ) - { - Keyword = StringUtility.ToLowerInvariant(keyword); - if (synonyms != null) - Synonyms = StringUtility.ToLowerInvariant( synonyms ).Split(','); - BaseType = baseType; - Obsolete = obsolete; - DefaultValue = defaultValue; - Setter = setter; - Getter = getter; - } - - public MySqlConnectionStringOption(string keyword, string synonyms, Type baseType, object defaultValue, bool obsolete) : - this(keyword, synonyms, baseType, defaultValue, obsolete, - delegate(MySqlConnectionStringBuilder msb, MySqlConnectionStringOption sender, object value) - { - sender.ValidateValue(ref value); - //if ( sender.BaseType.IsEnum ) - // msb.SetValue( sender.Keyword, Enum.Parse( sender.BaseType, ( string )value, true )); - //else - msb.SetValue(sender.Keyword, Convert.ChangeType(value, sender.BaseType)); - }, - (msb, sender) => msb.values[sender.Keyword] - ) - { - } - - public string[] Synonyms { get; private set; } - public bool Obsolete { get; private set; } - public Type BaseType { get; private set; } - public string Keyword { get; private set; } - public object DefaultValue { get; private set; } - public SetterDelegate Setter { get; private set; } - public GetterDelegate Getter { get; private set; } - - public delegate void SetterDelegate(MySqlConnectionStringBuilder msb, MySqlConnectionStringOption sender, object value); - public delegate object GetterDelegate(MySqlConnectionStringBuilder msb, MySqlConnectionStringOption sender); - - public bool HasKeyword(string key) - { - if (Keyword == key) return true; - if (Synonyms == null) return false; - return Synonyms.Any(syn => syn == key); - } - - public void Clean(MySqlConnectionStringBuilder builder) - { - builder.Remove(Keyword); - if (Synonyms == null) return; - foreach (var syn in Synonyms) - builder.Remove(syn); - } - - public void ValidateValue(ref object value) - { - bool b; - if (value == null) return; - string typeName = BaseType.Name; - Type valueType = value.GetType(); - if (valueType.Name == "String" ) { - if( BaseType == valueType) return; - else if (BaseType == typeof(bool)) - { - if (string.Compare("yes", ( string )value, StringComparison.OrdinalIgnoreCase) == 0) value = true; - else if (string.Compare("no", (string)value, StringComparison.OrdinalIgnoreCase) == 0) value = false; - else if (Boolean.TryParse(value.ToString(), out b)) value = b; - else throw new ArgumentException(String.Format(Resources.ValueNotCorrectType, value)); - return; - } - } - - if (typeName == "Boolean" && Boolean.TryParse(value.ToString(), out b)) { value = b; return; } - - UInt64 uintVal; - if (typeName.StartsWith("UInt64") && UInt64.TryParse(value.ToString(), out uintVal)) { value = uintVal; return; } - - UInt32 uintVal32; - if (typeName.StartsWith("UInt32") && UInt32.TryParse(value.ToString(), out uintVal32)) { value = uintVal32; return; } - - Int64 intVal; - if (typeName.StartsWith("Int64") && Int64.TryParse(value.ToString(), out intVal)) { value = intVal; return; } - - Int32 intVal32; - if (typeName.StartsWith("Int32") && Int32.TryParse(value.ToString(), out intVal32)) { value = intVal32; return; } - - object objValue; - //#if NETCORE10 - // Type baseType = BaseType.GetTypeInfo().BaseType; - //#else - Type baseType = BaseType.GetTypeInfo().BaseType; -//#endif - if (baseType != null && baseType.Name == "Enum" && ParseEnum(value.ToString(), out objValue)) - { - value = objValue; return; - } - - throw new ArgumentException(String.Format(Resources.ValueNotCorrectType, value)); - } - - private bool ParseEnum(string requestedValue, out object value) - { - value = null; - try - { - value = Enum.Parse(BaseType, requestedValue, true); - return true; - } - catch (ArgumentException) - { - return false; - } - } - - } - - internal class MySqlConnectionStringOptionCollection : Dictionary - { - internal List Options { get; } - - internal MySqlConnectionStringOptionCollection() : base( StringComparer.OrdinalIgnoreCase ) - { - Options = new List(); - } - - internal void Add(MySqlConnectionStringOption option) - { - Options.Add(option); - // Register the option with all the keywords. - base.Add(option.Keyword, option); - if (option.Synonyms == null) return; - - foreach (string t in option.Synonyms) - base.Add(t, option); - } - - internal MySqlConnectionStringOption Get(string keyword) - { - MySqlConnectionStringOption option = null; - base.TryGetValue(keyword, out option); - return option; - } - } -} diff --git a/Source/MySql.Data/MySqlHelper.cs b/Source/MySql.Data/MySqlHelper.cs deleted file mode 100644 index 7c14d1478..000000000 --- a/Source/MySql.Data/MySqlHelper.cs +++ /dev/null @@ -1,940 +0,0 @@ -// Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Data; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; - -namespace MySql.Data.MySqlClient -{ - /// - /// Helper class that makes it easier to work with the provider. - /// - public sealed partial class MySqlHelper - { - enum CharClass : byte - { - None, - Quote, - Backslash - } - - private static string stringOfBackslashChars = "\u005c\u00a5\u0160\u20a9\u2216\ufe68\uff3c"; - private static string stringOfQuoteChars = - "\u0022\u0027\u0060\u00b4\u02b9\u02ba\u02bb\u02bc\u02c8\u02ca\u02cb\u02d9\u0300\u0301\u2018\u2019\u201a\u2032\u2035\u275b\u275c\uff07"; - - private static CharClass[] charClassArray = MakeCharClassArray(); - - // this class provides only static methods - private MySqlHelper() - { - } - - #region ExecuteNonQuery - - /// - /// Executes a single command against a MySQL database. The is assumed to be - /// open when the method is called and remains open after the method completes. - /// - /// object to use - /// SQL command to be executed - /// Array of objects to use with the command. - /// - public static int ExecuteNonQuery(MySqlConnection connection, string commandText, params MySqlParameter[] commandParameters) - { - //create a command and prepare it for execution - MySqlCommand cmd = new MySqlCommand(); - cmd.Connection = connection; - cmd.CommandText = commandText; - cmd.CommandType = CommandType.Text; - - if (commandParameters != null) - foreach (MySqlParameter p in commandParameters) - cmd.Parameters.Add(p); - - int result = cmd.ExecuteNonQuery(); - cmd.Parameters.Clear(); - - return result; - } - - /// - /// Executes a single command against a MySQL database. A new is created - /// using the given. - /// - /// to use - /// SQL command to be executed - /// Array of objects to use with the command. - /// - public static int ExecuteNonQuery(string connectionString, string commandText, params MySqlParameter[] parms) - { - //create & open a SqlConnection, and dispose of it after we are done. - using (MySqlConnection cn = new MySqlConnection(connectionString)) - { - cn.Open(); - - //call the overload that takes a connection in place of the connection string - return ExecuteNonQuery(cn, commandText, parms); - } - } - #endregion - -#if !NETCORE10 - #region ExecuteDataSet - - /// - /// Executes a single SQL command and returns the first row of the resultset. A new MySqlConnection object - /// is created, opened, and closed during this method. - /// - /// Settings to be used for the connection - /// Command to execute - /// Parameters to use for the command - /// DataRow containing the first row of the resultset - public static DataRow ExecuteDataRow(string connectionString, string commandText, params MySqlParameter[] parms) - { - DataSet ds = ExecuteDataset(connectionString, commandText, parms); - if (ds == null) return null; - if (ds.Tables.Count == 0) return null; - if (ds.Tables[0].Rows.Count == 0) return null; - return ds.Tables[0].Rows[0]; - } - - /// - /// Executes a single SQL command and returns the resultset in a . - /// A new MySqlConnection object is created, opened, and closed during this method. - /// - /// Settings to be used for the connection - /// Command to execute - /// containing the resultset - public static DataSet ExecuteDataset(string connectionString, string commandText) - { - //pass through the call providing null for the set of SqlParameters - return ExecuteDataset(connectionString, commandText, (MySqlParameter[])null); - } - - /// - /// Executes a single SQL command and returns the resultset in a . - /// A new MySqlConnection object is created, opened, and closed during this method. - /// - /// Settings to be used for the connection - /// Command to execute - /// Parameters to use for the command - /// containing the resultset - public static DataSet ExecuteDataset(string connectionString, string commandText, params MySqlParameter[] commandParameters) - { - //create & open a SqlConnection, and dispose of it after we are done. - using (MySqlConnection cn = new MySqlConnection(connectionString)) - { - cn.Open(); - - //call the overload that takes a connection in place of the connection string - return ExecuteDataset(cn, commandText, commandParameters); - } - } - - /// - /// Executes a single SQL command and returns the resultset in a . - /// The state of the object remains unchanged after execution - /// of this method. - /// - /// object to use - /// Command to execute - /// containing the resultset - public static DataSet ExecuteDataset(MySqlConnection connection, string commandText) - { - //pass through the call providing null for the set of SqlParameters - return ExecuteDataset(connection, commandText, (MySqlParameter[])null); - } - - /// - /// Executes a single SQL command and returns the resultset in a . - /// The state of the object remains unchanged after execution - /// of this method. - /// - /// object to use - /// Command to execute - /// Parameters to use for the command - /// containing the resultset - public static DataSet ExecuteDataset(MySqlConnection connection, string commandText, params MySqlParameter[] commandParameters) - { - //create a command and prepare it for execution - MySqlCommand cmd = new MySqlCommand(); - cmd.Connection = connection; - cmd.CommandText = commandText; - cmd.CommandType = CommandType.Text; - - if (commandParameters != null) - foreach (MySqlParameter p in commandParameters) - cmd.Parameters.Add(p); - - //create the DataAdapter & DataSet - MySqlDataAdapter da = new MySqlDataAdapter(cmd); - DataSet ds = new DataSet(); - - //fill the DataSet using default values for DataTable names, etc. - da.Fill(ds); - - // detach the MySqlParameters from the command object, so they can be used again. - cmd.Parameters.Clear(); - - //return the dataset - return ds; - } - - /// - /// Updates the given table with data from the given - /// - /// Settings to use for the update - /// Command text to use for the update - /// containing the new data to use in the update - /// Tablename in the dataset to update - public static void UpdateDataSet(string connectionString, string commandText, DataSet ds, string tablename) - { - MySqlConnection cn = new MySqlConnection(connectionString); - cn.Open(); - MySqlDataAdapter da = new MySqlDataAdapter(commandText, cn); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - cb.ToString(); - da.Update(ds, tablename); - cn.Close(); - } - #endregion -#endif - - #region ExecuteDataReader - - /// - /// Executes a single command against a MySQL database, possibly inside an existing transaction. - /// - /// object to use for the command - /// object to use for the command - /// Command text to use - /// Array of objects to use with the command - /// True if the connection should be preserved, false if not - /// object ready to read the results of the command - private static MySqlDataReader ExecuteReader(MySqlConnection connection, MySqlTransaction transaction, string commandText, MySqlParameter[] commandParameters, bool externalConn) - { - //create a command and prepare it for execution - MySqlCommand cmd = new MySqlCommand(); - cmd.Connection = connection; - cmd.Transaction = transaction; - cmd.CommandText = commandText; - cmd.CommandType = CommandType.Text; - - if (commandParameters != null) - foreach (MySqlParameter p in commandParameters) - cmd.Parameters.Add(p); - - //create a reader - MySqlDataReader dr; - - // call ExecuteReader with the appropriate CommandBehavior - if (externalConn) - { - dr = cmd.ExecuteReader(); - } - else - { - dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); - } - - // detach the SqlParameters from the command object, so they can be used again. - cmd.Parameters.Clear(); - - return dr; - } - - /// - /// Executes a single command against a MySQL database. - /// - /// Settings to use for this command - /// Command text to use - /// object ready to read the results of the command - public static MySqlDataReader ExecuteReader(string connectionString, string commandText) - { - //pass through the call providing null for the set of SqlParameters - return ExecuteReader(connectionString, commandText, null); - } - - /// - /// Executes a single command against a MySQL database. - /// - /// object to use for the command - /// Command text to use - /// object ready to read the results of the command - public static MySqlDataReader ExecuteReader(MySqlConnection connection, string commandText) - { - //pass through the call providing null for the set of SqlParameters - return ExecuteReader(connection, null, commandText, null, true); - } - - /// - /// Executes a single command against a MySQL database. - /// - /// Settings to use for this command - /// Command text to use - /// Array of objects to use with the command - /// object ready to read the results of the command - public static MySqlDataReader ExecuteReader(string connectionString, string commandText, params MySqlParameter[] commandParameters) - { - //create & open a SqlConnection - MySqlConnection cn = new MySqlConnection(connectionString); - cn.Open(); - - //call the private overload that takes an internally owned connection in place of the connection string - return ExecuteReader(cn, null, commandText, commandParameters, false); - } - - /// - /// Executes a single command against a MySQL database. - /// - /// Connection to use for the command - /// Command text to use - /// Array of objects to use with the command - /// object ready to read the results of the command - public static MySqlDataReader ExecuteReader(MySqlConnection connection, string commandText, params MySqlParameter[] commandParameters) - { - //call the private overload that takes an internally owned connection in place of the connection string - return ExecuteReader(connection, null, commandText, commandParameters, true); - } - - - #endregion - - #region ExecuteScalar - - /// - /// Execute a single command against a MySQL database. - /// - /// Settings to use for the update - /// Command text to use for the update - /// The first column of the first row in the result set, or a null reference if the result set is empty. - public static object ExecuteScalar(string connectionString, string commandText) - { - //pass through the call providing null for the set of MySqlParameters - return ExecuteScalar(connectionString, commandText, null); - } - - /// - /// Execute a single command against a MySQL database. - /// - /// Settings to use for the command - /// Command text to use for the command - /// Parameters to use for the command - /// The first column of the first row in the result set, or a null reference if the result set is empty. - public static object ExecuteScalar(string connectionString, string commandText, params MySqlParameter[] commandParameters) - { - //create & open a SqlConnection, and dispose of it after we are done. - using (MySqlConnection cn = new MySqlConnection(connectionString)) - { - cn.Open(); - - //call the overload that takes a connection in place of the connection string - return ExecuteScalar(cn, commandText, commandParameters); - } - } - - /// - /// Execute a single command against a MySQL database. - /// - /// object to use - /// Command text to use for the command - /// The first column of the first row in the result set, or a null reference if the result set is empty. - public static object ExecuteScalar(MySqlConnection connection, string commandText) - { - //pass through the call providing null for the set of MySqlParameters - return ExecuteScalar(connection, commandText, null); - } - - /// - /// Execute a single command against a MySQL database. - /// - /// object to use - /// Command text to use for the command - /// Parameters to use for the command - /// The first column of the first row in the result set, or a null reference if the result set is empty. - public static object ExecuteScalar(MySqlConnection connection, string commandText, params MySqlParameter[] commandParameters) - { - //create a command and prepare it for execution - MySqlCommand cmd = new MySqlCommand(); - cmd.Connection = connection; - cmd.CommandText = commandText; - cmd.CommandType = CommandType.Text; - - if (commandParameters != null) - foreach (MySqlParameter p in commandParameters) - cmd.Parameters.Add(p); - - //execute the command & return the results - object retval = cmd.ExecuteScalar(); - - // detach the SqlParameters from the command object, so they can be used again. - cmd.Parameters.Clear(); - return retval; - - } - - #endregion - - #region Utility methods - private static CharClass[] MakeCharClassArray() - { - - CharClass[] a = new CharClass[65536]; - foreach (char c in stringOfBackslashChars) - { - a[c] = CharClass.Backslash; - } - foreach (char c in stringOfQuoteChars) - { - a[c] = CharClass.Quote; - } - return a; - } - - private static bool NeedsQuoting(string s) - { - return s.Any(c => charClassArray[c] != CharClass.None); - } - - /// - /// Escapes the string. - /// - /// The string to escape - /// The string with all quotes escaped. - public static string EscapeString(string value) - { - if (!NeedsQuoting(value)) - return value; - - StringBuilder sb = new StringBuilder(); - - foreach (char c in value) - { - CharClass charClass = charClassArray[c]; - if (charClass != CharClass.None) - { - sb.Append("\\"); - } - sb.Append(c); - } - return sb.ToString(); - } - - public static string DoubleQuoteString(string value) - { - if (!NeedsQuoting(value)) - return value; - - StringBuilder sb = new StringBuilder(); - foreach (char c in value) - { - CharClass charClass = charClassArray[c]; - if (charClass == CharClass.Quote) - sb.Append(c); - else if (charClass == CharClass.Backslash) - sb.Append("\\"); - sb.Append(c); - } - return sb.ToString(); - } - - #endregion - - #region Async - -#if !NETCORE10 - #region DataRow - /// - /// Async version of ExecuteDataRow - /// - /// Settings to be used for the connection - /// Command to execute - /// Parameters to use for the command - /// DataRow containing the first row of the resultset - public static Task ExecuteDataRowAsync(string connectionString, string commandText, params MySqlParameter[] parms) - { - return ExecuteDataRowAsync(connectionString, commandText, CancellationToken.None, parms); - } - - public static Task ExecuteDataRowAsync(string connectionString, string commandText, CancellationToken cancellationToken, params MySqlParameter[] parms) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var row = ExecuteDataRow(connectionString, commandText, parms); - result.SetResult(row); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - #endregion -#endif - - #region NonQuery - /// - /// Async version of ExecuteNonQuery - /// - /// object to use - /// SQL command to be executed - /// Array of objects to use with the command. - /// Rows affected - public static Task ExecuteNonQueryAsync(MySqlConnection connection, string commandText, params MySqlParameter[] commandParameters) - { - return ExecuteNonQueryAsync(connection, commandText, CancellationToken.None, commandParameters); - } - - public static Task ExecuteNonQueryAsync(MySqlConnection connection, string commandText, CancellationToken cancellationToken, params MySqlParameter[] commandParameters) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var queryResult = ExecuteNonQuery(connection, commandText, commandParameters); - result.SetResult(queryResult); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of ExecuteNonQuery - /// - /// to use - /// SQL command to be executed - /// Array of objects to use with the command. - /// Rows affected - public static Task ExecuteNonQueryAsync(string connectionString, string commandText, params MySqlParameter[] commandParameters) - { - return ExecuteNonQueryAsync(connectionString, commandText, CancellationToken.None, commandParameters); - } - - public static Task ExecuteNonQueryAsync(string connectionString, string commandText, CancellationToken cancellationToken, params MySqlParameter[] commandParameters) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var queryResult = ExecuteNonQuery(connectionString, commandText, commandParameters); - result.SetResult(queryResult); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - #endregion - -#if !NETCORE10 - #region DataSet - /// - /// Async version of ExecuteDataset - /// - /// Settings to be used for the connection - /// Command to execute - /// containing the resultset - public static Task ExecuteDatasetAsync(string connectionString, string commandText) - { - return ExecuteDatasetAsync(connectionString, commandText, CancellationToken.None, (MySqlParameter[])null); - } - - public static Task ExecuteDatasetAsync(string connectionString, string commandText, CancellationToken cancellationToken) - { - return ExecuteDatasetAsync(connectionString, commandText, cancellationToken, (MySqlParameter[])null); - } - - /// - /// Async version of ExecuteDataset - /// - /// Settings to be used for the connection - /// Command to execute - /// Parameters to use for the command - /// containing the resultset - public static Task ExecuteDatasetAsync(string connectionString, string commandText, params MySqlParameter[] commandParameters) - { - return ExecuteDatasetAsync(connectionString, commandText, CancellationToken.None, commandParameters); - } - - public static Task ExecuteDatasetAsync(string connectionString, string commandText, CancellationToken cancellationToken, params MySqlParameter[] commandParameters) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var dataset = ExecuteDataset(connectionString, commandText, commandParameters); - result.SetResult(dataset); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of ExecuteDataset - /// - /// object to use - /// Command to execute - /// containing the resultset - public static Task ExecuteDatasetAsync(MySqlConnection connection, string commandText) - { - return ExecuteDatasetAsync(connection, commandText, CancellationToken.None, (MySqlParameter[])null); - } - - public static Task ExecuteDatasetAsync(MySqlConnection connection, string commandText, CancellationToken cancellationToken) - { - return ExecuteDatasetAsync(connection, commandText, cancellationToken, (MySqlParameter[])null); - } - - /// - /// Async version of ExecuteDataset - /// - /// object to use - /// Command to execute - /// Parameters to use for the command - /// containing the resultset - public static Task ExecuteDatasetAsync(MySqlConnection connection, string commandText, params MySqlParameter[] commandParameters) - { - return ExecuteDatasetAsync(connection, commandText, CancellationToken.None, commandParameters); - } - - public static Task ExecuteDatasetAsync(MySqlConnection connection, string commandText, CancellationToken cancellationToken, params MySqlParameter[] commandParameters) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var dataset = ExecuteDataset(connection, commandText, commandParameters); - result.SetResult(dataset); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of UpdateDataset - /// - /// Settings to use for the update - /// Command text to use for the update - /// containing the new data to use in the update - /// Tablename in the dataset to update - public static Task UpdateDataSetAsync(string connectionString, string commandText, DataSet ds, string tablename) - { - return UpdateDataSetAsync(connectionString, commandText, ds, tablename, CancellationToken.None); - } - - public static Task UpdateDataSetAsync(string connectionString, string commandText, DataSet ds, string tablename, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - UpdateDataSet(connectionString, commandText, ds, tablename); - result.SetResult(true); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - #endregion -#endif - - #region DataReader - /// - /// Async version of ExecuteReader - /// - /// object to use for the command - /// object to use for the command - /// Command text to use - /// Array of objects to use with the command - /// True if the connection should be preserved, false if not - /// object ready to read the results of the command - private static Task ExecuteReaderAsync(MySqlConnection connection, MySqlTransaction transaction, string commandText, MySqlParameter[] commandParameters, bool ExternalConn) - { - return ExecuteReaderAsync(connection, transaction, commandText, commandParameters, ExternalConn, CancellationToken.None); - } - - private static Task ExecuteReaderAsync(MySqlConnection connection, MySqlTransaction transaction, string commandText, MySqlParameter[] commandParameters, bool ExternalConn, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var reader = ExecuteReader(connection, transaction, commandText, commandParameters, ExternalConn); - result.SetResult(reader); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of ExecuteReader - /// - /// Settings to use for this command - /// Command text to use - /// object ready to read the results of the command - public static Task ExecuteReaderAsync(string connectionString, string commandText) - { - return ExecuteReaderAsync(connectionString, commandText, CancellationToken.None, (MySqlParameter[])null); - } - - public static Task ExecuteReaderAsync(string connectionString, string commandText, CancellationToken cancellationToken) - { - return ExecuteReaderAsync(connectionString, commandText, cancellationToken, (MySqlParameter[])null); - } - - /// - /// Async version of ExecuteReader - /// - /// object to use for the command - /// Command text to use - /// object ready to read the results of the command - public static Task ExecuteReaderAsync(MySqlConnection connection, string commandText) - { - return ExecuteReaderAsync(connection, null, commandText, (MySqlParameter[])null, true, CancellationToken.None); - } - - public static Task ExecuteReaderAsync(MySqlConnection connection, string commandText, CancellationToken cancellationToken) - { - return ExecuteReaderAsync(connection, null, commandText, (MySqlParameter[])null, true, cancellationToken); - } - - /// - /// Async version of ExecuteReader - /// - /// Settings to use for this command - /// Command text to use - /// Array of objects to use with the command - /// object ready to read the results of the command - public static Task ExecuteReaderAsync(string connectionString, string commandText, params MySqlParameter[] commandParameters) - { - return ExecuteReaderAsync(connectionString, commandText, CancellationToken.None, commandParameters); - } - - public static Task ExecuteReaderAsync(string connectionString, string commandText, CancellationToken cancellationToken, params MySqlParameter[] commandParameters) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var reader = ExecuteReader(connectionString, commandText, commandParameters); - result.SetResult(reader); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of ExecuteReader - /// - /// Connection to use for the command - /// Command text to use - /// Array of objects to use with the command - /// object ready to read the results of the command - public static Task ExecuteReaderAsync(MySqlConnection connection, string commandText, params MySqlParameter[] commandParameters) - { - return ExecuteReaderAsync(connection, null, commandText, commandParameters, true, CancellationToken.None); - } - - public static Task ExecuteReaderAsync(MySqlConnection connection, string commandText, CancellationToken cancellationToken, params MySqlParameter[] commandParameters) - { - return ExecuteReaderAsync(connection, null, commandText, commandParameters, true, cancellationToken); - } - - #endregion - - #region Scalar - /// - /// Async version of ExecuteScalar - /// - /// Settings to use for the update - /// Command text to use for the update - /// The first column of the first row in the result set, or a null reference if the result set is empty. - public static Task ExecuteScalarAsync(string connectionString, string commandText) - { - return ExecuteScalarAsync(connectionString, commandText, CancellationToken.None, (MySqlParameter[])null); - } - - public static Task ExecuteScalarAsync(string connectionString, string commandText, CancellationToken cancellationToken) - { - return ExecuteScalarAsync(connectionString, commandText, cancellationToken, (MySqlParameter[])null); - } - - /// - /// Async version of ExecuteScalar - /// - /// Settings to use for the command - /// Command text to use for the command - /// Parameters to use for the command - /// The first column of the first row in the result set, or a null reference if the result set is empty. - public static Task ExecuteScalarAsync(string connectionString, string commandText, params MySqlParameter[] commandParameters) - { - return ExecuteScalarAsync(connectionString, commandText, CancellationToken.None, commandParameters); - } - - public static Task ExecuteScalarAsync(string connectionString, string commandText, CancellationToken cancellationToken, params MySqlParameter[] commandParameters) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var scalarResult = ExecuteScalar(connectionString, commandText, commandParameters); - result.SetResult(scalarResult); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of ExecuteScalar - /// - /// object to use - /// Command text to use for the command - /// The first column of the first row in the result set, or a null reference if the result set is empty. - public static Task ExecuteScalarAsync(MySqlConnection connection, string commandText) - { - return ExecuteScalarAsync(connection, commandText, CancellationToken.None, (MySqlParameter[])null); - } - - public static Task ExecuteScalarAsync(MySqlConnection connection, string commandText, CancellationToken cancellationToken) - { - return ExecuteScalarAsync(connection, commandText, cancellationToken, (MySqlParameter[])null); - } - - /// - /// Async version of ExecuteScalar - /// - /// object to use - /// Command text to use for the command - /// Parameters to use for the command - /// The first column of the first row in the result set, or a null reference if the result set is empty. - public static Task ExecuteScalarAsync(MySqlConnection connection, string commandText, params MySqlParameter[] commandParameters) - { - return ExecuteScalarAsync(connection, commandText, CancellationToken.None, commandParameters); - } - - public static Task ExecuteScalarAsync(MySqlConnection connection, string commandText, CancellationToken cancellationToken, params MySqlParameter[] commandParameters) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var scalarResult = ExecuteScalar(connection, commandText, commandParameters); - result.SetResult(scalarResult); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - #endregion - #endregion - } -} diff --git a/Source/MySql.Data/MySqlPacket.cs b/Source/MySql.Data/MySqlPacket.cs deleted file mode 100644 index c5a0def25..000000000 --- a/Source/MySql.Data/MySqlPacket.cs +++ /dev/null @@ -1,436 +0,0 @@ -// Copyright © 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Diagnostics; -using System.IO; -using System.Text; -using MySql.Data.Common; - - -namespace MySql.Data.MySqlClient -{ - class MySqlPacket - { - private byte[] _tempBuffer = new byte[256]; - private Encoding _encoding; - private readonly MemoryStream _buffer = new MemoryStream(5); - - private MySqlPacket() - { - Clear(); - } - - public MySqlPacket(Encoding enc) - : this() - { - Encoding = enc; - } - - public MySqlPacket(MemoryStream stream) - : this() - { - _buffer = stream; - } - - #region Properties - - public Encoding Encoding - { - get { return _encoding; } - set - { - Debug.Assert(value != null); - _encoding = value; - } - } - - public bool HasMoreData - { - get { return _buffer.Position < _buffer.Length; } - } - - public int Position - { - get { return (int)_buffer.Position; } - set { _buffer.Position = (long)value; } - } - - public int Length - { - get { return (int)_buffer.Length; } - set { _buffer.SetLength(value); } - } - - public bool IsLastPacket - { - get - { -#if !NETCORE10 - byte[] bits = _buffer.GetBuffer(); - - return bits[0] == 0xfe && Length <= 5; -#else - ArraySegment bits; - _buffer.TryGetBuffer(out bits); - - return bits.Array[0] == 0xfe && Length <= 5; -#endif - } - } - - public byte[] Buffer - { - get - { -#if !NETCORE10 - byte[] bits = _buffer.GetBuffer(); - - return bits; -#else - ArraySegment bits; - - _buffer.TryGetBuffer(out bits); - - return bits.Array; -#endif - } - } - - public DBVersion Version { get; set; } - - #endregion - - public void Clear() - { - Position = 4; - } - - -#region Byte methods - - public byte ReadByte() - { - return (byte)_buffer.ReadByte(); - } - - public int Read(byte[] byteBuffer, int offset, int count) - { - return _buffer.Read(byteBuffer, offset, count); - } - - public void WriteByte(byte b) - { - _buffer.WriteByte(b); - } - - public void Write(byte[] bytesToWrite) - { - Write(bytesToWrite, 0, bytesToWrite.Length); - } - - public void Write(byte[] bytesToWrite, int offset, int countToWrite) - { - _buffer.Write(bytesToWrite, offset, countToWrite); - } - - public int ReadNBytes() - { - byte c = ReadByte(); - if (c < 1 || c > 4) - throw new MySqlException(Resources.IncorrectTransmission); - return ReadInteger(c); - } - - public void SetByte(long position, byte value) - { - long currentPosition = _buffer.Position; - _buffer.Position = position; - _buffer.WriteByte(value); - _buffer.Position = currentPosition; - } - -#endregion - -#region Integer methods - - public long ReadFieldLength() - { - byte c = ReadByte(); - - switch (c) - { - case 251: return -1; - case 252: return ReadInteger(2); - case 253: return ReadInteger(3); - case 254: return ReadLong(8); - default: return c; - } - } - - public ulong ReadBitValue(int numbytes) - { - ulong value = 0; - - int pos = (int)_buffer.Position; - -#if !NETCORE10 - byte[] bits = _buffer.GetBuffer(); -#else - ArraySegment bytes; - _buffer.TryGetBuffer(out bytes); - byte[] bits = bytes.Array; -#endif - - int shift = 0; - - for (int i = 0; i < numbytes; i++) - { - value <<= shift; - value |= bits[pos++]; - shift = 8; - } - _buffer.Position += numbytes; - return value; - } - - public long ReadLong(int numbytes) - { - Debug.Assert((_buffer.Position + numbytes) <= _buffer.Length); - -#if !NETCORE10 - byte[] bits = _buffer.GetBuffer(); -#else - ArraySegment bytes; - _buffer.TryGetBuffer(out bytes); - byte[] bits = bytes.Array; -#endif - - int pos = (int)_buffer.Position; - _buffer.Position += numbytes; - - switch (numbytes) - { - case 2: return BitConverter.ToUInt16(bits, pos); - case 4: return BitConverter.ToUInt32(bits, pos); - case 8: return BitConverter.ToInt64(bits, pos); - } - throw new NotSupportedException("Only byte lengths of 2, 4, or 8 are supported"); - } - - public ulong ReadULong(int numbytes) - { - Debug.Assert((_buffer.Position + numbytes) <= _buffer.Length); - -#if !NETCORE10 - byte[] bits = _buffer.GetBuffer(); -#else - ArraySegment bytes; - _buffer.TryGetBuffer(out bytes); - byte[] bits = bytes.Array; -#endif - - int pos = (int)_buffer.Position; - _buffer.Position += numbytes; - - switch (numbytes) - { - case 2: return BitConverter.ToUInt16(bits, pos); - case 4: return BitConverter.ToUInt32(bits, pos); - case 8: return BitConverter.ToUInt64(bits, pos); - } - throw new NotSupportedException("Only byte lengths of 2, 4, or 8 are supported"); - } - - public int Read3ByteInt() - { - int value = 0; - - int pos = (int)_buffer.Position; -#if !NETCORE10 - byte[] bits = _buffer.GetBuffer(); -#else - ArraySegment bytes; - _buffer.TryGetBuffer(out bytes); - byte[] bits = bytes.Array; -#endif - int shift = 0; - - for (int i = 0; i < 3; i++) - { - value |= (int)(bits[pos++] << shift); - shift += 8; - } - _buffer.Position += 3; - return value; - } - - public int ReadInteger(int numbytes) - { - if (numbytes == 3) - return Read3ByteInt(); - Debug.Assert(numbytes <= 4); - return (int)ReadLong(numbytes); - } - - /// - /// WriteInteger - /// - /// - /// - public void WriteInteger(long v, int numbytes) - { - long val = v; - - Debug.Assert(numbytes > 0 && numbytes < 9); - - for (int x = 0; x < numbytes; x++) - { - _tempBuffer[x] = (byte)(val & 0xff); - val >>= 8; - } - Write(_tempBuffer, 0, numbytes); - } - - public int ReadPackedInteger() - { - byte c = ReadByte(); - - switch (c) - { - case 251: return -1; - case 252: return ReadInteger(2); - case 253: return ReadInteger(3); - case 254: return ReadInteger(4); - default: return c; - } - } - - public void WriteLength(long length) - { - if (length < 251) - WriteByte((byte)length); - else if (length < 65536L) - { - WriteByte(252); - WriteInteger(length, 2); - } - else if (length < 16777216L) - { - WriteByte(253); - WriteInteger(length, 3); - } - else - { - WriteByte(254); - WriteInteger(length, 4); - } - } - -#endregion - -#region String methods - - public void WriteLenString(string s) - { - byte[] bytes = _encoding.GetBytes(s); - WriteLength(bytes.Length); - Write(bytes, 0, bytes.Length); - } - - public void WriteStringNoNull(string v) - { - byte[] bytes = _encoding.GetBytes(v); - Write(bytes, 0, bytes.Length); - } - - public void WriteString(string v) - { - WriteStringNoNull(v); - WriteByte(0); - } - - public string ReadLenString() - { - long len = ReadPackedInteger(); - return ReadString(len); - } - - public string ReadAsciiString(long length) - { - if (length == 0) - return String.Empty; - // byte[] buf = new byte[length]; - Read(_tempBuffer, 0, (int)length); - return Encoding.GetEncoding("us-ascii").GetString(_tempBuffer, 0, (int)length); - //return encoding.GetString(tempBuffer, 0, (int)length); //buf.Length); - } - - public string ReadString(long length) - { - if (length == 0) - return String.Empty; - if (_tempBuffer == null || length > _tempBuffer.Length) - _tempBuffer = new byte[length]; - Read(_tempBuffer, 0, (int)length); - return _encoding.GetString(_tempBuffer, 0, (int)length); - } - - public string ReadString() - { - return ReadString(_encoding); - } - - public string ReadString(Encoding theEncoding) - { - byte[] bytes = ReadStringAsBytes(); - string s = theEncoding.GetString(bytes, 0, bytes.Length); - return s; - } - - public byte[] ReadStringAsBytes() - { - byte[] readBytes; -#if !NETCORE10 - byte[] bits = _buffer.GetBuffer(); -#else - ArraySegment bytes; - _buffer.TryGetBuffer(out bytes); - byte[] bits = bytes.Array; -#endif - int end = (int)_buffer.Position; - byte[] tempBuffer = bits; - - while (end < (int)_buffer.Length && - tempBuffer[end] != 0 && (int)tempBuffer[end] != -1) - end++; - - readBytes = new byte[end - _buffer.Position]; - Array.Copy(tempBuffer, (int)_buffer.Position, readBytes, 0, (int)(end - _buffer.Position)); - _buffer.Position = end + 1; - - return readBytes; - } - -#endregion - } -} diff --git a/Source/MySql.Data/MySqlPool.cs b/Source/MySql.Data/MySqlPool.cs deleted file mode 100644 index 11f611358..000000000 --- a/Source/MySql.Data/MySqlPool.cs +++ /dev/null @@ -1,319 +0,0 @@ -// Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Diagnostics; -using System.Threading; -using MySql.Data.MySqlClient; - - -namespace MySql.Data.MySqlClient -{ - /// - /// Summary description for MySqlPool. - /// - internal sealed class MySqlPool - { - private readonly List _inUsePool; - private readonly Queue _idlePool; - private readonly uint _minSize; - private readonly uint _maxSize; - private readonly AutoResetEvent _autoEvent; - private int _available; - - private void EnqueueIdle(Driver driver) - { - driver.IdleSince = DateTime.Now; - _idlePool.Enqueue(driver); - } - public MySqlPool(MySqlConnectionStringBuilder settings) - { - _minSize = settings.MinimumPoolSize; - _maxSize = settings.MaximumPoolSize; - - _available = (int)_maxSize; - _autoEvent = new AutoResetEvent(false); - - if (_minSize > _maxSize) - _minSize = _maxSize; - this.Settings = settings; - _inUsePool = new List((int)_maxSize); - _idlePool = new Queue((int)_maxSize); - - // prepopulate the idle pool to minSize - for (int i = 0; i < _minSize; i++) - EnqueueIdle(CreateNewPooledConnection()); - - ProcedureCache = new ProcedureCache((int)settings.ProcedureCacheSize); - } - - #region Properties - - public MySqlConnectionStringBuilder Settings { get; set; } - - public ProcedureCache ProcedureCache { get; } - - /// - /// It is assumed that this property will only be used from inside an active - /// lock. - /// - private bool HasIdleConnections => _idlePool.Count > 0; - - private int NumConnections => _idlePool.Count + _inUsePool.Count; - - /// - /// Indicates whether this pool is being cleared. - /// - public bool BeingCleared { get; private set; } - - internal Dictionary ServerProperties { get; set; } - - #endregion - - /// - /// It is assumed that this method is only called from inside an active lock. - /// - private Driver GetPooledConnection() - { - Driver driver = null; - - // if we don't have an idle connection but we have room for a new - // one, then create it here. - lock ((_idlePool as ICollection).SyncRoot) - { - if (HasIdleConnections) - driver = _idlePool.Dequeue(); - } - - // Obey the connection timeout - if (driver != null) - { - try - { - driver.ResetTimeout((int)Settings.ConnectionTimeout * 1000); - } - catch (Exception) - { - driver.Close(); - driver = null; - } - } - - if (driver != null) - { - // first check to see that the server is still alive - if (!driver.Ping()) - { - driver.Close(); - driver = null; - } - else if (Settings.ConnectionReset) - // if the user asks us to ping/reset pooled connections - // do so now - driver.Reset(); - } - if (driver == null) - driver = CreateNewPooledConnection(); - - Debug.Assert(driver != null); - lock ((_inUsePool as ICollection).SyncRoot) - { - _inUsePool.Add(driver); - } - return driver; - } - - /// - /// It is assumed that this method is only called from inside an active lock. - /// - private Driver CreateNewPooledConnection() - { - Debug.Assert((_maxSize - NumConnections) > 0, "Pool out of sync."); - - Driver driver = Driver.Create(Settings); - driver.Pool = this; - return driver; - } - - public void ReleaseConnection(Driver driver) - { - lock ((_inUsePool as ICollection).SyncRoot) - { - if (_inUsePool.Contains(driver)) - _inUsePool.Remove(driver); - } - - if (driver.ConnectionLifetimeExpired() || BeingCleared) - { - driver.Close(); - Debug.Assert(!_idlePool.Contains(driver)); - } - else - { - lock ((_idlePool as ICollection).SyncRoot) - { - EnqueueIdle(driver); - } - } - - Interlocked.Increment(ref _available); - _autoEvent.Set(); - } - - /// - /// Removes a connection from the in use pool. The only situations where this method - /// would be called are when a connection that is in use gets some type of fatal exception - /// or when the connection is being returned to the pool and it's too old to be - /// returned. - /// - /// - public void RemoveConnection(Driver driver) - { - lock ((_inUsePool as ICollection).SyncRoot) - { - if (_inUsePool.Contains(driver)) - { - _inUsePool.Remove(driver); - Interlocked.Increment(ref _available); - _autoEvent.Set(); - } - } - - // if we are being cleared and we are out of connections then have - // the manager destroy us. - if (BeingCleared && NumConnections == 0) - MySqlPoolManager.RemoveClearedPool(this); - } - - private Driver TryToGetDriver() - { - int count = Interlocked.Decrement(ref _available); - if (count < 0) - { - Interlocked.Increment(ref _available); - return null; - } - try - { - Driver driver = GetPooledConnection(); - return driver; - } - catch (Exception ex) - { - MySqlTrace.LogError(-1, ex.Message); - Interlocked.Increment(ref _available); - throw; - } - } - - public Driver GetConnection() - { - int fullTimeOut = (int)Settings.ConnectionTimeout * 1000; - int timeOut = fullTimeOut; - - DateTime start = DateTime.Now; - - while (timeOut > 0) - { - Driver driver = TryToGetDriver(); - if (driver != null) return driver; - - // We have no tickets right now, lets wait for one. -#if NETCORE10 - if (!_autoEvent.WaitOne(timeOut)) break; -#else - if (!_autoEvent.WaitOne(timeOut, false)) break; -#endif - - timeOut = fullTimeOut - (int)DateTime.Now.Subtract(start).TotalMilliseconds; - } - throw new MySqlException(Resources.TimeoutGettingConnection); - } - - /// - /// Clears this pool of all idle connections and marks this pool and being cleared - /// so all other connections are closed when they are returned. - /// - internal void Clear() - { - lock ((_idlePool as ICollection).SyncRoot) - { - // first, mark ourselves as being cleared - BeingCleared = true; - - // then we remove all connections sitting in the idle pool - while (_idlePool.Count > 0) - { - Driver d = _idlePool.Dequeue(); - d.Close(); - } - - // there is nothing left to do here. Now we just wait for all - // in use connections to be returned to the pool. When they are - // they will be closed. When the last one is closed, the pool will - // be destroyed. - } - } - - /// - /// Remove expired drivers from the idle pool - /// - /// - /// - /// Closing driver is a potentially lengthy operation involving network - /// IO. Therefore we do not close expired drivers while holding - /// idlePool.SyncRoot lock. We just remove the old drivers from the idle - /// queue and return them to the caller. The caller will need to close - /// them (or let GC close them) - /// - internal List RemoveOldIdleConnections() - { - List oldDrivers = new List(); - DateTime now = DateTime.Now; - - lock ((_idlePool as ICollection).SyncRoot) - { - // The drivers appear to be ordered by their age, i.e it is - // sufficient to remove them until the first element is not - // too old. - while (_idlePool.Count > _minSize) - { - Driver d = _idlePool.Peek(); - DateTime expirationTime = d.IdleSince.Add( - new TimeSpan(0, 0, MySqlPoolManager.maxConnectionIdleTime)); - if (expirationTime.CompareTo(now) < 0) - { - oldDrivers.Add(d); - _idlePool.Dequeue(); - } - else - { - break; - } - } - } - return oldDrivers; - } - } -} diff --git a/Source/MySql.Data/MySqlPoolManager.cs b/Source/MySql.Data/MySqlPoolManager.cs deleted file mode 100644 index e2b2eb74f..000000000 --- a/Source/MySql.Data/MySqlPoolManager.cs +++ /dev/null @@ -1,208 +0,0 @@ -// Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Threading; - - -namespace MySql.Data.MySqlClient -{ - /// - /// Summary description for MySqlPoolManager. - /// - internal class MySqlPoolManager - { - private static readonly Dictionary Pools = new Dictionary(); - private static readonly List ClearingPools = new List(); - - // Timeout in seconds, after which an unused (idle) connection - // should be closed. - internal static int maxConnectionIdleTime = 180; - - -#if !NETCORE10 - static MySqlPoolManager() - { - AppDomain.CurrentDomain.ProcessExit += EnsureClearingPools; - AppDomain.CurrentDomain.DomainUnload += EnsureClearingPools; - } - - private static void EnsureClearingPools( object sender, EventArgs e ) - { - ClearAllPools(); - } -#endif - - - // we add a small amount to the due time to let the cleanup detect - //expired connections in the first cleanup. - private static Timer timer = new Timer(CleanIdleConnections, - null, (maxConnectionIdleTime * 1000) + 8000, maxConnectionIdleTime * 1000); - - private static string GetKey(MySqlConnectionStringBuilder settings) - { - string key = ""; - lock (settings) - { - key = settings.ConnectionString; - } - - if (!settings.IntegratedSecurity || settings.ConnectionReset) return key; - - try - { - // Append SID to the connection string to generate a key - // With Integrated security different Windows users with the same - // connection string may be mapped to different MySQL accounts. - System.Security.Principal.WindowsIdentity id = - System.Security.Principal.WindowsIdentity.GetCurrent(); - - key += ";" + id.User; - } - catch (System.Security.SecurityException ex) - { - // Documentation for WindowsIdentity.GetCurrent() states - // SecurityException can be thrown. In this case the - // connection can only be pooled if reset is done. - throw new MySqlException(Resources.NoWindowsIdentity, ex); - } - - return key; - } - public static MySqlPool GetPool(MySqlConnectionStringBuilder settings) - { - string text = GetKey(settings); - - lock (Pools) - { - MySqlPool pool; - Pools.TryGetValue(text, out pool); - - if (pool == null) - { - pool = new MySqlPool(settings); - Pools.Add(text, pool); - } - else - pool.Settings = settings; - - return pool; - } - } - - public static void RemoveConnection(Driver driver) - { - Debug.Assert(driver != null); - - MySqlPool pool = driver.Pool; - - pool?.RemoveConnection(driver); - } - - public static void ReleaseConnection(Driver driver) - { - Debug.Assert(driver != null); - - MySqlPool pool = driver.Pool; - - pool?.ReleaseConnection(driver); - } - - public static void ClearPool(MySqlConnectionStringBuilder settings) - { - Debug.Assert(settings != null); - string text; - try - { - text = GetKey(settings); - } - catch (MySqlException) - { - // Cannot retrieve windows identity for IntegratedSecurity=true - // This can be ignored. - return; - } - ClearPoolByText(text); - } - - private static void ClearPoolByText(string key) - { - lock (Pools) - { - // if pools doesn't have it, then this pool must already have been cleared - if (!Pools.ContainsKey(key)) return; - - // add the pool to our list of pools being cleared - MySqlPool pool = (Pools[key] as MySqlPool); - ClearingPools.Add(pool); - - // now tell the pool to clear itself - pool.Clear(); - - // and then remove the pool from the active pools list - Pools.Remove(key); - } - } - - public static void ClearAllPools() - { - lock (Pools) - { - // Create separate keys list. - List keys = new List(Pools.Count); - keys.AddRange(Pools.Keys); - - // Remove all pools by key. - foreach (string key in keys) - ClearPoolByText(key); - } - } - - public static void RemoveClearedPool(MySqlPool pool) - { - Debug.Assert(ClearingPools.Contains(pool)); - ClearingPools.Remove(pool); - } - - /// - /// Remove drivers that have been idle for too long. - /// - public static void CleanIdleConnections(object obj) - { - List oldDrivers = new List(); - lock (Pools) - { - foreach (MySqlPool pool in Pools.Keys.Select(key => Pools[key])) - { - oldDrivers.AddRange(pool.RemoveOldIdleConnections()); - } - } - foreach (Driver driver in oldDrivers) - { - driver.Close(); - } - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data/MySqlPromotableTransaction.cs b/Source/MySql.Data/MySqlPromotableTransaction.cs deleted file mode 100644 index 092ce1685..000000000 --- a/Source/MySql.Data/MySqlPromotableTransaction.cs +++ /dev/null @@ -1,200 +0,0 @@ -// Copyright � 2004, 2010, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Transactions; -using System.Collections; -using System.Collections.Generic; -using System.Data; -using System.Threading; - -namespace MySql.Data.MySqlClient -{ - /// - /// Represents a single(not nested) TransactionScope - /// - internal class MySqlTransactionScope - { - public MySqlConnection connection; - public Transaction baseTransaction; - public MySqlTransaction simpleTransaction; - public int rollbackThreadId; - - public MySqlTransactionScope(MySqlConnection con, Transaction trans, - MySqlTransaction simpleTransaction) - { - connection = con; - baseTransaction = trans; - this.simpleTransaction = simpleTransaction; - } - - public void Rollback(SinglePhaseEnlistment singlePhaseEnlistment) - { - // prevent commands in main thread to run concurrently - Driver driver = connection.driver; - lock (driver) - { - rollbackThreadId = Thread.CurrentThread.ManagedThreadId; - while (connection.Reader != null) - { - // wait for reader to finish. Maybe we should not wait - // forever and cancel it after some time? - System.Threading.Thread.Sleep(100); - } - simpleTransaction.Rollback(); - singlePhaseEnlistment.Aborted(); - DriverTransactionManager.RemoveDriverInTransaction(baseTransaction); - - driver.currentTransaction = null; - - if (connection.State == ConnectionState.Closed) - connection.CloseFully(); - rollbackThreadId = 0; - } - } - - public void SinglePhaseCommit(SinglePhaseEnlistment singlePhaseEnlistment) - { - simpleTransaction.Commit(); - singlePhaseEnlistment.Committed(); - DriverTransactionManager.RemoveDriverInTransaction(baseTransaction); - connection.driver.currentTransaction = null; - - if (connection.State == ConnectionState.Closed) - connection.CloseFully(); - } - } - - internal sealed class MySqlPromotableTransaction : IPromotableSinglePhaseNotification, ITransactionPromoter - { - // Per-thread stack to manage nested transaction scopes - [ThreadStatic] - static Stack globalScopeStack; - - MySqlConnection connection; - Transaction baseTransaction; - Stack scopeStack; - - - public MySqlPromotableTransaction(MySqlConnection connection, Transaction baseTransaction) - { - this.connection = connection; - this.baseTransaction = baseTransaction; - } - - public Transaction BaseTransaction - { - get - { - if (scopeStack.Count > 0) - return scopeStack.Peek().baseTransaction; - else - return null; - } - } - - public bool InRollback - { - get - { - if (scopeStack.Count > 0) - { - MySqlTransactionScope currentScope = scopeStack.Peek(); - if (currentScope.rollbackThreadId == Thread.CurrentThread.ManagedThreadId) - { - return true; - } - } - return false; - } - } - void IPromotableSinglePhaseNotification.Initialize() - { - string valueName = Enum.GetName( - typeof(System.Transactions.IsolationLevel), baseTransaction.IsolationLevel); - System.Data.IsolationLevel dataLevel = (System.Data.IsolationLevel)Enum.Parse( - typeof(System.Data.IsolationLevel), valueName); - MySqlTransaction simpleTransaction = connection.BeginTransaction(dataLevel); - - // We need to save the per-thread scope stack locally. - // We cannot always use thread static variable in rollback: when scope - // times out, rollback is issued by another thread. - if (globalScopeStack == null) - { - globalScopeStack = new Stack(); - } - - scopeStack = globalScopeStack; - scopeStack.Push(new MySqlTransactionScope(connection, baseTransaction, - simpleTransaction)); - } - - void IPromotableSinglePhaseNotification.Rollback(SinglePhaseEnlistment singlePhaseEnlistment) - { - - MySqlTransactionScope current = scopeStack.Peek(); - current.Rollback(singlePhaseEnlistment); - scopeStack.Pop(); - } - - void IPromotableSinglePhaseNotification.SinglePhaseCommit(SinglePhaseEnlistment singlePhaseEnlistment) - { - scopeStack.Pop().SinglePhaseCommit(singlePhaseEnlistment); - } - - byte[] ITransactionPromoter.Promote() - { - throw new NotSupportedException(); - } - } - - internal class DriverTransactionManager - { - private static Hashtable driversInUse = new Hashtable(); - - public static Driver GetDriverInTransaction(Transaction transaction) - { - lock (driversInUse.SyncRoot) - { - Driver d = (Driver)driversInUse[transaction.GetHashCode()]; - return d; - } - } - - public static void SetDriverInTransaction(Driver driver) - { - lock (driversInUse.SyncRoot) - { - driversInUse[driver.currentTransaction.BaseTransaction.GetHashCode()] = driver; - } - } - - public static void RemoveDriverInTransaction(Transaction transaction) - { - lock (driversInUse.SyncRoot) - { - driversInUse.Remove(transaction.GetHashCode()); - } - } - } -} - diff --git a/Source/MySql.Data/MySqlSecurityPermission.cs b/Source/MySql.Data/MySqlSecurityPermission.cs deleted file mode 100644 index fe844fbc1..000000000 --- a/Source/MySql.Data/MySqlSecurityPermission.cs +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright © 2011, 2013, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using System.Security; -using System.Security.Permissions; -using System.Net; - - -namespace MySql.Data.MySqlClient -{ - public sealed class MySqlSecurityPermission : MarshalByRefObject - { - private MySqlSecurityPermission() - { - } - - public static PermissionSet CreatePermissionSet(bool includeReflectionPermission) - { - PermissionSet permissionsSet = new PermissionSet(null); - permissionsSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution)); - permissionsSet.AddPermission(new SocketPermission(PermissionState.Unrestricted)); - permissionsSet.AddPermission(new SecurityPermission(SecurityPermissionFlag.UnmanagedCode)); - permissionsSet.AddPermission(new DnsPermission(PermissionState.Unrestricted)); - permissionsSet.AddPermission(new FileIOPermission(PermissionState.Unrestricted)); - permissionsSet.AddPermission(new EnvironmentPermission(PermissionState.Unrestricted)); - - if (includeReflectionPermission) permissionsSet.AddPermission(new ReflectionPermission(PermissionState.Unrestricted)); - - return permissionsSet; - } - } -} diff --git a/Source/MySql.Data/MySqlStream.cs b/Source/MySql.Data/MySqlStream.cs deleted file mode 100644 index 3249eb135..000000000 --- a/Source/MySql.Data/MySqlStream.cs +++ /dev/null @@ -1,257 +0,0 @@ -// Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.IO; -using System.Diagnostics; -using System.Text; -using MySql.Data.Common; - -namespace MySql.Data.MySqlClient -{ - /// - /// Summary description for MySqlStream. - /// - internal class MySqlStream - { - private byte sequenceByte; - private int maxBlockSize; - private ulong maxPacketSize; - private byte[] packetHeader = new byte[4]; - MySqlPacket packet; - TimedStream timedStream; - Stream inStream; - Stream outStream; - - internal Stream BaseStream - { - get - { - return timedStream; - } - } - public MySqlStream(Encoding encoding) - { - // we have no idea what the real value is so we start off with the max value - // The real value will be set in NativeDriver.Configure() - maxPacketSize = ulong.MaxValue; - - // we default maxBlockSize to MaxValue since we will get the 'real' value in - // the authentication handshake and we know that value will not exceed - // true maxBlockSize prior to that. - maxBlockSize = Int32.MaxValue; - - packet = new MySqlPacket(encoding); - } - - public MySqlStream(Stream baseStream, Encoding encoding, bool compress) - : this(encoding) - { - timedStream = new TimedStream(baseStream); - Stream stream; - if (compress) - stream = new CompressedStream(timedStream); - else - stream = timedStream; - - inStream = new BufferedStream(stream); - outStream = stream; - } - - public void Close() - { -#if NETCORE10 - - outStream.Dispose(); - inStream.Dispose(); -#else - outStream.Close(); - inStream.Close(); -#endif - timedStream.Close(); - } - -#region Properties - - public Encoding Encoding - { - get { return packet.Encoding; } - set { packet.Encoding = value; } - } - - public void ResetTimeout(int timeout) - { - timedStream.ResetTimeout(timeout); - } - - public byte SequenceByte - { - get { return sequenceByte; } - set { sequenceByte = value; } - } - - public int MaxBlockSize - { - get { return maxBlockSize; } - set { maxBlockSize = value; } - } - - public ulong MaxPacketSize - { - get { return maxPacketSize; } - set { maxPacketSize = value; } - } - -#endregion - -#region Packet methods - - /// - /// ReadPacket is called by NativeDriver to start reading the next - /// packet on the stream. - /// - public MySqlPacket ReadPacket() - { - //Debug.Assert(packet.Position == packet.Length); - - // make sure we have read all the data from the previous packet - //Debug.Assert(HasMoreData == false, "HasMoreData is true in OpenPacket"); - - LoadPacket(); - - // now we check if this packet is a server error - if (packet.Buffer[0] == 0xff) - { - packet.ReadByte(); // read off the 0xff - - int code = packet.ReadInteger(2); - string msg = String.Empty; - - if (packet.Version.isAtLeast(5, 5, 0)) - msg = packet.ReadString(Encoding.UTF8); - else - msg = packet.ReadString(); - - if (msg.StartsWith("#", StringComparison.Ordinal)) - { - msg.Substring(1, 5); /* state code */ - msg = msg.Substring(6); - } - throw new MySqlException(msg, code); - } - return packet; - } - - /// - /// Reads the specified number of bytes from the stream and stores them at given - /// offset in the buffer. - /// Throws EndOfStreamException if not all bytes can be read. - /// - /// Stream to read from - /// Array to store bytes read from the stream - /// The offset in buffer at which to begin storing the data read from the current stream. - /// Number of bytes to read - internal static void ReadFully(Stream stream, byte[] buffer, int offset, int count) - { - int numRead = 0; - int numToRead = count; - while (numToRead > 0) - { - int read = stream.Read(buffer, offset + numRead, numToRead); - if (read == 0) - { - throw new EndOfStreamException(); - } - numRead += read; - numToRead -= read; - } - } - - /// - /// LoadPacket loads up and decodes the header of the incoming packet. - /// - public void LoadPacket() - { - try - { - packet.Length = 0; - int offset = 0; - while (true) - { - ReadFully(inStream, packetHeader, 0, 4); - sequenceByte = (byte)(packetHeader[3] + 1); - int length = (int)(packetHeader[0] + (packetHeader[1] << 8) + - (packetHeader[2] << 16)); - - // make roo for the next block - packet.Length += length; - ReadFully(inStream, packet.Buffer, offset, length); - offset += length; - - // if this block was < maxBlock then it's last one in a multipacket series - if (length < maxBlockSize) break; - } - packet.Position = 0; - } - catch (IOException ioex) - { - throw new MySqlException(Resources.ReadFromStreamFailed, true, ioex); - } - } - - public void SendPacket(MySqlPacket packet) - { - byte[] buffer = packet.Buffer; - int length = packet.Position - 4; - - if ((ulong)length > maxPacketSize) - throw new MySqlException(Resources.QueryTooLarge, (int)MySqlErrorCode.PacketTooLarge); - - int offset = 0; - do - { - int lenToSend = length > maxBlockSize ? maxBlockSize : length; - buffer[offset] = (byte)(lenToSend & 0xff); - buffer[offset + 1] = (byte)((lenToSend >> 8) & 0xff); - buffer[offset + 2] = (byte)((lenToSend >> 16) & 0xff); - buffer[offset + 3] = sequenceByte++; - - outStream.Write(buffer, offset, lenToSend + 4); - outStream.Flush(); - length -= lenToSend; - offset += lenToSend; - } while (length > 0); - } - - public void SendEntirePacketDirectly(byte[] buffer, int count) - { - buffer[0] = (byte)(count & 0xff); - buffer[1] = (byte)((count >> 8) & 0xff); - buffer[2] = (byte)((count >> 16) & 0xff); - buffer[3] = sequenceByte++; - outStream.Write(buffer, 0, count + 4); - outStream.Flush(); - } - -#endregion - } -} diff --git a/Source/MySql.Data/MysqlDefs.cs b/Source/MySql.Data/MysqlDefs.cs deleted file mode 100644 index 8f4ea8b4f..000000000 --- a/Source/MySql.Data/MysqlDefs.cs +++ /dev/null @@ -1,571 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.ComponentModel; -using System.Reflection; - -namespace MySql.Data.MySqlClient -{ - /// - /// Summary description for ClientParam. - /// - [Flags] - internal enum ClientFlags : ulong - { - LONG_PASSWORD = 1, // new more secure passwords - FOUND_ROWS = 2, // found instead of affected rows - LONG_FLAG = 4, // Get all column flags - CONNECT_WITH_DB = 8, // One can specify db on connect - NO_SCHEMA = 16, // Don't allow db.table.column - COMPRESS = 32, // Client can use compression protocol - ODBC = 64, // ODBC client - LOCAL_FILES = 128, // Can use LOAD DATA LOCAL - IGNORE_SPACE = 256, // Ignore spaces before '(' - PROTOCOL_41 = 512, // Support new 4.1 protocol - INTERACTIVE = 1024, // This is an interactive client - SSL = 2048, // Switch to SSL after handshake - IGNORE_SIGPIPE = 4096, // IGNORE sigpipes - TRANSACTIONS = 8192, // Client knows about transactions - RESERVED = 16384, // old 4.1 protocol flag - SECURE_CONNECTION = 32768, // new 4.1 authentication - MULTI_STATEMENTS = 65536, // Allow multi-stmt support - MULTI_RESULTS = 131072, // Allow multiple resultsets - PS_MULTI_RESULTS = 1UL << 18, // allow multi results using PS protocol - PLUGIN_AUTH = (1UL << 19), //Client supports plugin authentication - CONNECT_ATTRS = (1UL << 20), // Allows client connection attributes - CAN_HANDLE_EXPIRED_PASSWORD = (1UL << 22), // Support for password expiration > 5.6.6 - CLIENT_SSL_VERIFY_SERVER_CERT = (1UL << 30), - CLIENT_REMEMBER_OPTIONS = (1UL << 31) - } - - [Flags] - internal enum ServerStatusFlags - { - InTransaction = 1, // Transaction has started - AutoCommitMode = 2, // Server in auto_commit mode - MoreResults = 4, // More results on server - AnotherQuery = 8, // Multi query - next query exists - BadIndex = 16, - NoIndex = 32, - CursorExists = 64, - LastRowSent = 128, - OutputParameters = 4096 - } - - - /// - /// DB Operations Code - /// - internal enum DBCmd : byte - { - SLEEP = 0, - QUIT = 1, - INIT_DB = 2, - QUERY = 3, - FIELD_LIST = 4, - CREATE_DB = 5, - DROP_DB = 6, - RELOAD = 7, - SHUTDOWN = 8, - STATISTICS = 9, - PROCESS_INFO = 10, - CONNECT = 11, - PROCESS_KILL = 12, - DEBUG = 13, - PING = 14, - TIME = 15, - DELAYED_INSERT = 16, - CHANGE_USER = 17, - BINLOG_DUMP = 18, - TABLE_DUMP = 19, - CONNECT_OUT = 20, - REGISTER_SLAVE = 21, - PREPARE = 22, - EXECUTE = 23, - LONG_DATA = 24, - CLOSE_STMT = 25, - RESET_STMT = 26, - SET_OPTION = 27, - FETCH = 28 - } - - - /// - /// Specifies MySQL specific data type of a field, property, for use in a . - /// - public enum MySqlDbType - { - /// - /// - /// A fixed precision and scale numeric value between -1038 - /// -1 and 10 38 -1. - /// - Decimal = 0, - /// - /// The signed range is -128 to 127. The unsigned - /// range is 0 to 255. - /// - Byte = 1, - /// - /// A 16-bit signed integer. The signed range is - /// -32768 to 32767. The unsigned range is 0 to 65535 - /// - Int16 = 2, - /// - /// Specifies a 24 (3 byte) signed or unsigned value. - /// - Int24 = 9, - /// - /// A 32-bit signed integer - /// - Int32 = 3, - /// - /// A 64-bit signed integer. - /// - Int64 = 8, - /// - /// A small (single-precision) floating-point - /// number. Allowable values are -3.402823466E+38 to -1.175494351E-38, - /// 0, and 1.175494351E-38 to 3.402823466E+38. - /// - Float = 4, - /// - /// A normal-size (double-precision) - /// floating-point number. Allowable values are -1.7976931348623157E+308 - /// to -2.2250738585072014E-308, 0, and 2.2250738585072014E-308 to - /// 1.7976931348623157E+308. - /// - Double = 5, - /// - /// A timestamp. The range is '1970-01-01 00:00:00' to sometime in the - /// year 2037 - /// - Timestamp = 7, - /// - ///Date The supported range is '1000-01-01' to '9999-12-31'. - /// - Date = 10, - /// - /// Time The range is '-838:59:59' to '838:59:59'. - /// - Time = 11, - /// - ///DateTime The supported range is '1000-01-01 00:00:00' to - ///'9999-12-31 23:59:59'. - /// - DateTime = 12, - /// - ///Datetime The supported range is '1000-01-01 00:00:00' to - ///'9999-12-31 23:59:59'. - /// - [Obsolete("The Datetime enum value is obsolete. Please use DateTime.")] - Datetime = 12, - /// - /// A year in 2- or 4-digit format (default is 4-digit). The - /// allowable values are 1901 to 2155, 0000 in the 4-digit year - /// format, and 1970-2069 if you use the 2-digit format (70-69). - /// - Year = 13, - /// - /// Obsolete Use Datetime or Date type - /// - Newdate = 14, - /// - /// A variable-length string containing 0 to 65535 characters - /// - VarString = 15, - /// - /// Bit-field data type - /// - Bit = 16, - /// - /// JSON - /// - JSON = 245, - /// - /// New Decimal - /// - NewDecimal = 246, - /// - /// An enumeration. A string object that can have only one value, - /// chosen from the list of values 'value1', 'value2', ..., NULL - /// or the special "" error value. An ENUM can have a maximum of - /// 65535 distinct values - /// - Enum = 247, - /// - /// A set. A string object that can have zero or more values, each - /// of which must be chosen from the list of values 'value1', 'value2', - /// ... A SET can have a maximum of 64 members. - /// - Set = 248, - /// - /// A binary column with a maximum length of 255 (2^8 - 1) - /// characters - /// - TinyBlob = 249, - /// - /// A binary column with a maximum length of 16777215 (2^24 - 1) bytes. - /// - MediumBlob = 250, - /// - /// A binary column with a maximum length of 4294967295 or - /// 4G (2^32 - 1) bytes. - /// - LongBlob = 251, - /// - /// A binary column with a maximum length of 65535 (2^16 - 1) bytes. - /// - Blob = 252, - /// - /// A variable-length string containing 0 to 255 bytes. - /// - VarChar = 253, - /// - /// A fixed-length string. - /// - String = 254, - /// - /// Geometric (GIS) data type. - /// - Geometry = 255, - /// - /// Unsigned 8-bit value. - /// - UByte = 501, - /// - /// Unsigned 16-bit value. - /// - UInt16 = 502, - /// - /// Unsigned 24-bit value. - /// - UInt24 = 509, - /// - /// Unsigned 32-bit value. - /// - UInt32 = 503, - /// - /// Unsigned 64-bit value. - /// - UInt64 = 508, - /// - /// Fixed length binary string. - /// - Binary = 600, - /// - /// Variable length binary string. - /// - VarBinary = 601, - /// - /// A text column with a maximum length of 255 (2^8 - 1) characters. - /// - TinyText = 749, - /// - /// A text column with a maximum length of 16777215 (2^24 - 1) characters. - /// - MediumText = 750, - /// - /// A text column with a maximum length of 4294967295 or - /// 4G (2^32 - 1) characters. - /// - LongText = 751, - /// - /// A text column with a maximum length of 65535 (2^16 - 1) characters. - /// - Text = 752, - /// - /// A guid column - /// - Guid = 800 - } ; - - - internal enum Field_Type : byte - { - DECIMAL = 0, - BYTE = 1, - SHORT = 2, - LONG = 3, - FLOAT = 4, - DOUBLE = 5, - NULL = 6, - TIMESTAMP = 7, - LONGLONG = 8, - INT24 = 9, - DATE = 10, - TIME = 11, - DATETIME = 12, - YEAR = 13, - NEWDATE = 14, - ENUM = 247, - SET = 248, - TINY_BLOB = 249, - MEDIUM_BLOB = 250, - LONG_BLOB = 251, - BLOB = 252, - VAR_STRING = 253, - STRING = 254, - } - - /// - /// Allows the user to specify the type of connection that should - /// be used. - /// - public enum MySqlConnectionProtocol - { - /// - /// TCP/IP style connection. Works everywhere. - /// - Sockets = 1, - Socket = 1, - Tcp = 1, - /// - /// Named pipe connection. Works only on Windows systems. - /// - Pipe = 2, - NamedPipe = 2, - /// - /// Unix domain socket connection. Works only with Unix systems. - /// - UnixSocket = 3, - Unix = 3, - /// - /// Shared memory connection. Currently works only with Windows systems. - /// - SharedMemory = 4, - Memory = 4 - } - - /// - /// SSL options for connection. - /// - public enum MySqlSslMode - { - /// - /// Do not use SSL. - /// - None, - /// - /// Use SSL, if server supports it. - /// - Preferred, - Prefered = Preferred, - /// - /// Always use SSL. Deny connection if server does not support SSL. - /// Do not perform server certificate validation. - /// - Required, - /// - /// Always use SSL. Validate server SSL certificate, but different host name mismatch. - /// - VerifyCA, - /// - /// Always use SSL and perform full certificate validation. - /// - VerifyFull - } - - /// - /// Specifies the connection types supported - /// - public enum MySqlDriverType - { - /// - /// Use TCP/IP sockets. - /// - Native, - /// - /// Use client library. - /// - Client, - /// - /// Use MySQL embedded server. - /// - Embedded - } - - public enum MySqlCertificateStoreLocation - { - /// - /// Do not use certificate store - /// - None, - /// - /// Use certificate store for the current user - /// - CurrentUser, - /// - /// User certificate store for the machine - /// - LocalMachine - } - - internal class MySqlConnectAttrs - { - [DisplayName("_client_name")] - public string ClientName => "MySql Connector/NET"; - - [DisplayName("_pid")] - public string PID - { - get - { - string pid = string.Empty; - try - { - pid = System.Diagnostics.Process.GetCurrentProcess().Id.ToString(); - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine(ex.ToString()); - } - - return pid; - } - } - - [DisplayName("_client_version")] - public string ClientVersion - { - get - { - string version = string.Empty; - try - { - version = typeof(MySqlConnectAttrs).GetTypeInfo().Assembly.GetName().Version.ToString(); - } - catch (Exception ex) - { - System.Diagnostics.Debug.WriteLine(ex.ToString()); - } - return version; - } - } - -#if !NETCORE10 - [DisplayName("_platform")] - public string Platform => Is64BitOS() ? "x86_64" : "x86_32"; -#endif - - [DisplayName("program_name")] - public string ProgramName - { - get - { - string name = Environment.GetCommandLineArgs()[0]; - try - { - string path = name.Trim('"'); - name = System.IO.Path.GetFileName(path); - if (Assembly.GetEntryAssembly() != null) - name = Assembly.GetEntryAssembly().ManifestModule.Name; - } - catch (Exception ex) - { - name = ClientName; - System.Diagnostics.Debug.WriteLine(ex.ToString()); - } - return name; - } - } - - [DisplayName("_os")] - public string OS - { - get - { - string os = string.Empty; - try - { - if (MySql.Data.Common.Platform.IsDotNetCore()) - { - return ".Net Core"; - } -#if !NETCORE10 - os = Environment.OSVersion.Platform.ToString(); - if (os == "Win32NT") - { - os = "Win"; - os += Is64BitOS() ? "64" : "32"; - } -#endif - } - catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.ToString()); } - - return os; - } - } - -#if !NETCORE10 - [DisplayName("_os_details")] - public string OSDetails - { - get - { - string os = string.Empty; - try - { - var searcher = new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem"); - var collection = searcher.Get(); - foreach (var mgtObj in collection) - { - os = mgtObj.GetPropertyValue("Caption").ToString(); - break; - } - } - catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.ToString()); } - - return os; - } - } -#endif - - [DisplayName("_thread")] - public string Thread - { - get - { - string thread = string.Empty; - try - { - thread = System.Diagnostics.Process.GetCurrentProcess().Threads[0].Id.ToString(); - } - catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.ToString()); } - - return thread; - } - } - -#if !NETCORE10 - private bool Is64BitOS() - { -#if CLR4 - return Environment.Is64BitOperatingSystem; -#else - return Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE") == "AMD64"; -#endif - } -#endif - } -} diff --git a/Source/MySql.Data/NativeDriver.cs b/Source/MySql.Data/NativeDriver.cs deleted file mode 100644 index 944dbc47e..000000000 --- a/Source/MySql.Data/NativeDriver.cs +++ /dev/null @@ -1,825 +0,0 @@ -// Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections; -using System.Diagnostics; -using System.IO; -using MySql.Data.Common; -using MySql.Data.Types; -using System.Text; -using MySql.Data.MySqlClient.Authentication; -using System.Reflection; -using System.ComponentModel; -using System.Collections.Generic; -using System.Linq; - -namespace MySql.Data.MySqlClient -{ - /// - /// Summary description for Driver. - /// - internal class NativeDriver : IDriver - { - private DBVersion version; - private int threadId; - protected byte[] encryptionSeed; - protected ServerStatusFlags serverStatus; - protected MySqlStream stream; - protected Stream baseStream; - private BitArray nullMap; - private MySqlPacket packet; - private ClientFlags connectionFlags; - private Driver owner; - private int warnings; - private MySqlAuthenticationPlugin authPlugin; - - // Windows authentication method string, used by the protocol. - // Also known as "client plugin name". - const string AuthenticationWindowsPlugin = "authentication_windows_client"; - - // Predefined username for IntegratedSecurity - const string AuthenticationWindowsUser = "auth_windows"; - - public NativeDriver(Driver owner) - { - this.owner = owner; - threadId = -1; - } - - public ClientFlags Flags - { - get { return connectionFlags; } - } - - public int ThreadId - { - get { return threadId; } - } - - public DBVersion Version - { - get { return version; } - } - - public ServerStatusFlags ServerStatus - { - get { return serverStatus; } - } - - public int WarningCount - { - get { return warnings; } - } - - public MySqlPacket Packet - { - get { return packet; } - } - - internal MySqlConnectionStringBuilder Settings - { - get { return owner.Settings; } - } - - internal Encoding Encoding - { - get { return owner.Encoding; } - } - - private void HandleException(MySqlException ex) - { - if (ex.IsFatal) - owner.Close(); - } - - internal void SendPacket(MySqlPacket p) - { - stream.SendPacket(p); - } - - internal void SendEmptyPacket() - { - byte[] buffer = new byte[4]; - stream.SendEntirePacketDirectly(buffer, 0); - } - - internal MySqlPacket ReadPacket() - { - return packet = stream.ReadPacket(); - } - - internal void ReadOk(bool read) - { - try - { - if (read) - packet = stream.ReadPacket(); - byte marker = (byte)packet.ReadByte(); - if (marker != 0) - { - throw new MySqlException("Out of sync with server", true, null); - } - - packet.ReadFieldLength(); /* affected rows */ - packet.ReadFieldLength(); /* last insert id */ - if (packet.HasMoreData) - { - serverStatus = (ServerStatusFlags)packet.ReadInteger(2); - packet.ReadInteger(2); /* warning count */ - if (packet.HasMoreData) - { - packet.ReadLenString(); /* message */ - } - } - } - catch (MySqlException ex) - { - HandleException(ex); - throw; - } - } - - /// - /// Sets the current database for the this connection - /// - /// - public void SetDatabase(string dbName) - { - byte[] dbNameBytes = Encoding.GetBytes(dbName); - - packet.Clear(); - packet.WriteByte((byte)DBCmd.INIT_DB); - packet.Write(dbNameBytes); - ExecutePacket(packet); - - ReadOk(true); - } - - public void Configure() - { - stream.MaxPacketSize = (ulong)owner.MaxPacketSize; - stream.Encoding = Encoding; - } - - public void Open() - { - // connect to one of our specified hosts - try - { - baseStream = StreamCreator.GetStream(Settings); -#if !NETCORE10 - if (Settings.IncludeSecurityAsserts) - MySqlSecurityPermission.CreatePermissionSet(false).Assert(); -#endif - } - catch (System.Security.SecurityException) - { - throw; - } - catch (Exception ex) - { - throw new MySqlException(Resources.UnableToConnectToHost, - (int)MySqlErrorCode.UnableToConnectToHost, ex); - } - if (baseStream == null) - throw new MySqlException(Resources.UnableToConnectToHost, - (int)MySqlErrorCode.UnableToConnectToHost); - - int maxSinglePacket = 255 * 255 * 255; - stream = new MySqlStream(baseStream, Encoding, false); - - stream.ResetTimeout((int)Settings.ConnectionTimeout * 1000); - - // read off the welcome packet and parse out it's values - packet = stream.ReadPacket(); - int protocol = packet.ReadByte(); - string versionString = packet.ReadString(); - owner.isFabric = versionString.EndsWith("fabric", StringComparison.OrdinalIgnoreCase); - version = DBVersion.Parse(versionString); - if (!owner.isFabric && !version.isAtLeast(5, 0, 0)) - throw new NotSupportedException(Resources.ServerTooOld); - threadId = packet.ReadInteger(4); - - byte[] seedPart1 = packet.ReadStringAsBytes(); - - maxSinglePacket = (256 * 256 * 256) - 1; - - // read in Server capabilities if they are provided - ClientFlags serverCaps = 0; - if (packet.HasMoreData) - serverCaps = (ClientFlags)packet.ReadInteger(2); - - /* New protocol with 16 bytes to describe server characteristics */ - owner.ConnectionCharSetIndex = (int)packet.ReadByte(); - - serverStatus = (ServerStatusFlags)packet.ReadInteger(2); - - // Since 5.5, high bits of server caps are stored after status. - // Previously, it was part of reserved always 0x00 13-byte filler. - uint serverCapsHigh = (uint)packet.ReadInteger(2); - serverCaps |= (ClientFlags)(serverCapsHigh << 16); - - packet.Position += 11; - byte[] seedPart2 = packet.ReadStringAsBytes(); - encryptionSeed = new byte[seedPart1.Length + seedPart2.Length]; - seedPart1.CopyTo(encryptionSeed, 0); - seedPart2.CopyTo(encryptionSeed, seedPart1.Length); - - string authenticationMethod = ""; - if ((serverCaps & ClientFlags.PLUGIN_AUTH) != 0) - { - authenticationMethod = packet.ReadString(); - } - else - { - // Some MySql versions like 5.1, don't give name of plugin, default to native password. - authenticationMethod = "mysql_native_password"; - } - - // based on our settings, set our connection flags - SetConnectionFlags(serverCaps); - - packet.Clear(); - packet.WriteInteger((int)connectionFlags, 4); - packet.WriteInteger(maxSinglePacket, 4); - packet.WriteByte(33); //character set utf-8 - packet.Write(new byte[23]); - - if ((serverCaps & ClientFlags.SSL) == 0) - { - if ((Settings.SslMode != MySqlSslMode.None) - && (Settings.SslMode != MySqlSslMode.Preferred)) - { - // Client requires SSL connections. - string message = String.Format(Resources.NoServerSSLSupport, - Settings.Server); - throw new MySqlException(message); - } - } - else if (Settings.SslMode != MySqlSslMode.None) - { - stream.SendPacket(packet); - stream = new Ssl(Settings).StartSSL(ref baseStream, Encoding, Settings.ToString()); - packet.Clear(); - packet.WriteInteger((int)connectionFlags, 4); - packet.WriteInteger(maxSinglePacket, 4); - packet.WriteByte(33); //character set utf-8 - packet.Write(new byte[23]); - } - - Authenticate(authenticationMethod, false); - - // if we are using compression, then we use our CompressedStream class - // to hide the ugliness of managing the compression - if ((connectionFlags & ClientFlags.COMPRESS) != 0) - stream = new MySqlStream(baseStream, Encoding, true); - - // give our stream the server version we are connected to. - // We may have some fields that are read differently based - // on the version of the server we are connected to. - packet.Version = version; - stream.MaxBlockSize = maxSinglePacket; - } - -#region Authentication - - /// - /// Return the appropriate set of connection flags for our - /// server capabilities and our user requested options. - /// - private void SetConnectionFlags(ClientFlags serverCaps) - { - // allow load data local infile - ClientFlags flags = ClientFlags.LOCAL_FILES; - - if (!Settings.UseAffectedRows) - flags |= ClientFlags.FOUND_ROWS; - - flags |= ClientFlags.PROTOCOL_41; - // Need this to get server status values - flags |= ClientFlags.TRANSACTIONS; - - // user allows/disallows batch statements - if (Settings.AllowBatch) - flags |= ClientFlags.MULTI_STATEMENTS; - - // We always allow multiple result sets - flags |= ClientFlags.MULTI_RESULTS; - - // if the server allows it, tell it that we want long column info - if ((serverCaps & ClientFlags.LONG_FLAG) != 0) - flags |= ClientFlags.LONG_FLAG; - - // if the server supports it and it was requested, then turn on compression - if ((serverCaps & ClientFlags.COMPRESS) != 0 && Settings.UseCompression) - flags |= ClientFlags.COMPRESS; - - flags |= ClientFlags.LONG_PASSWORD; // for long passwords - - // did the user request an interactive session? - if (Settings.InteractiveSession) - flags |= ClientFlags.INTERACTIVE; - - // if the server allows it and a database was specified, then indicate - // that we will connect with a database name - if ((serverCaps & ClientFlags.CONNECT_WITH_DB) != 0 && - Settings.Database != null && Settings.Database.Length > 0) - flags |= ClientFlags.CONNECT_WITH_DB; - - // if the server is requesting a secure connection, then we oblige - if ((serverCaps & ClientFlags.SECURE_CONNECTION) != 0) - flags |= ClientFlags.SECURE_CONNECTION; - - // if the server is capable of SSL and the user is requesting SSL - if ((serverCaps & ClientFlags.SSL) != 0 && Settings.SslMode != MySqlSslMode.None) - flags |= ClientFlags.SSL; - - // if the server supports output parameters, then we do too - if ((serverCaps & ClientFlags.PS_MULTI_RESULTS) != 0) - flags |= ClientFlags.PS_MULTI_RESULTS; - - if ((serverCaps & ClientFlags.PLUGIN_AUTH) != 0) - flags |= ClientFlags.PLUGIN_AUTH; - - // if the server supports connection attributes - if ((serverCaps & ClientFlags.CONNECT_ATTRS) != 0) - flags |= ClientFlags.CONNECT_ATTRS; - - if ((serverCaps & ClientFlags.CAN_HANDLE_EXPIRED_PASSWORD) != 0) - flags |= ClientFlags.CAN_HANDLE_EXPIRED_PASSWORD; - - connectionFlags = flags; - } - - public void Authenticate(string authMethod, bool reset) - { - if (authMethod != null) - { - // Integrated security is a shortcut for windows auth - if (Settings.IntegratedSecurity) - authMethod = "authentication_windows_client"; - - authPlugin = MySqlAuthenticationPlugin.GetPlugin(authMethod, this, encryptionSeed); - } - authPlugin.Authenticate(reset); - } - -#endregion - - public void Reset() - { - warnings = 0; - stream.Encoding = this.Encoding; - stream.SequenceByte = 0; - packet.Clear(); - packet.WriteByte((byte)DBCmd.CHANGE_USER); - Authenticate(null, true); - } - - /// - /// Query is the method that is called to send all queries to the server - /// - public void SendQuery(MySqlPacket queryPacket) - { - warnings = 0; - queryPacket.SetByte(4, (byte)DBCmd.QUERY); - ExecutePacket(queryPacket); - // the server will respond in one of several ways with the first byte indicating - // the type of response. - // 0 == ok packet. This indicates non-select queries - // 0xff == error packet. This is handled in stream.OpenPacket - // > 0 = number of columns in select query - // We don't actually read the result here since a single query can generate - // multiple resultsets and we don't want to duplicate code. See ReadResult - // Instead we set our internal server status flag to indicate that we have a query waiting. - // This flag will be maintained by ReadResult - serverStatus |= ServerStatusFlags.AnotherQuery; - } - - public void Close(bool isOpen) - { - try - { - if (isOpen) - { - try - { - packet.Clear(); - packet.WriteByte((byte)DBCmd.QUIT); - ExecutePacket(packet); - } - catch (Exception) - { - // Eat exception here. We should try to closing - // the stream anyway. - } - } - - if (stream != null) - stream.Close(); - stream = null; - } - catch (Exception) - { - // we are just going to eat any exceptions - // generated here - } - } - - public bool Ping() - { - try - { - packet.Clear(); - packet.WriteByte((byte)DBCmd.PING); - ExecutePacket(packet); - ReadOk(true); - return true; - } - catch (Exception) - { - owner.Close(); - return false; - } - } - - public int GetResult(ref int affectedRow, ref long insertedId) - { - try - { - packet = stream.ReadPacket(); - } - catch (TimeoutException) - { - // Do not reset serverStatus, allow to reenter, e.g when - // ResultSet is closed. - throw; - } - catch (Exception) - { - serverStatus &= ~(ServerStatusFlags.AnotherQuery | - ServerStatusFlags.MoreResults); - throw; - } - - int fieldCount = (int)packet.ReadFieldLength(); - if (-1 == fieldCount) - { - string filename = packet.ReadString(); - SendFileToServer(filename); - - return GetResult(ref affectedRow, ref insertedId); - } - else if (fieldCount == 0) - { - // the code to read last packet will set these server status vars - // again if necessary. - serverStatus &= ~(ServerStatusFlags.AnotherQuery | - ServerStatusFlags.MoreResults); - affectedRow = (int)packet.ReadFieldLength(); - insertedId = (long)packet.ReadFieldLength(); - - serverStatus = (ServerStatusFlags)packet.ReadInteger(2); - warnings += packet.ReadInteger(2); - if (packet.HasMoreData) - { - packet.ReadLenString(); //TODO: server message - } - } - return fieldCount; - } - - /// - /// Sends the specified file to the server. - /// This supports the LOAD DATA LOCAL INFILE - /// - /// - private void SendFileToServer(string filename) - { - byte[] buffer = new byte[8196]; - - long len = 0; - try - { - using (FileStream fs = new FileStream(filename, FileMode.Open, - FileAccess.Read)) - { - len = fs.Length; - while (len > 0) - { - int count = fs.Read(buffer, 4, (int)(len > 8192 ? 8192 : len)); - stream.SendEntirePacketDirectly(buffer, count); - len -= count; - } - stream.SendEntirePacketDirectly(buffer, 0); - } - } - catch (Exception ex) - { - throw new MySqlException("Error during LOAD DATA LOCAL INFILE", ex); - } - } - - private void ReadNullMap(int fieldCount) - { - // if we are binary, then we need to load in our null bitmap - nullMap = null; - byte[] nullMapBytes = new byte[(fieldCount + 9) / 8]; - packet.ReadByte(); - packet.Read(nullMapBytes, 0, nullMapBytes.Length); - nullMap = new BitArray(nullMapBytes); - } - - public IMySqlValue ReadColumnValue(int index, MySqlField field, IMySqlValue valObject) - { - long length = -1; - bool isNull; - - if (nullMap != null) - isNull = nullMap[index + 2]; - else - { - length = packet.ReadFieldLength(); - isNull = length == -1; - } - - packet.Encoding = field.Encoding; - packet.Version = version; - return valObject.ReadValue(packet, length, isNull); - } - - public void SkipColumnValue(IMySqlValue valObject) - { - int length = -1; - if (nullMap == null) - { - length = (int)packet.ReadFieldLength(); - if (length == -1) return; - } - if (length > -1) - packet.Position += length; - else - valObject.SkipValue(packet); - } - - public void GetColumnsData(MySqlField[] columns) - { - for (int i = 0; i < columns.Length; i++) - GetColumnData(columns[i]); - ReadEOF(); - } - - private void GetColumnData(MySqlField field) - { - stream.Encoding = Encoding; - packet = stream.ReadPacket(); - field.Encoding = Encoding; - field.CatalogName = packet.ReadLenString(); - field.DatabaseName = packet.ReadLenString(); - field.TableName = packet.ReadLenString(); - field.RealTableName = packet.ReadLenString(); - field.ColumnName = packet.ReadLenString(); - field.OriginalColumnName = packet.ReadLenString(); - packet.ReadByte(); - field.CharacterSetIndex = packet.ReadInteger(2); - field.ColumnLength = packet.ReadInteger(4); - MySqlDbType type = (MySqlDbType)packet.ReadByte(); - ColumnFlags colFlags; - if ((connectionFlags & ClientFlags.LONG_FLAG) != 0) - colFlags = (ColumnFlags)packet.ReadInteger(2); - else - colFlags = (ColumnFlags)packet.ReadByte(); - field.Scale = (byte)packet.ReadByte(); - - if (packet.HasMoreData) - { - packet.ReadInteger(2); // reserved - } - - if (type == MySqlDbType.Decimal || type == MySqlDbType.NewDecimal) - { - field.Precision = (byte)(field.ColumnLength - 2); - if ((colFlags & ColumnFlags.UNSIGNED) != 0) - field.Precision++; - } - - field.SetTypeAndFlags(type, colFlags); - } - - private void ExecutePacket(MySqlPacket packetToExecute) - { - try - { - warnings = 0; - stream.SequenceByte = 0; - stream.SendPacket(packetToExecute); - } - catch (MySqlException ex) - { - HandleException(ex); - throw; - } - } - - public void ExecuteStatement(MySqlPacket packetToExecute) - { - warnings = 0; - packetToExecute.SetByte(4, (byte)DBCmd.EXECUTE); - ExecutePacket(packetToExecute); - serverStatus |= ServerStatusFlags.AnotherQuery; - } - - private void CheckEOF() - { - if (!packet.IsLastPacket) - throw new MySqlException("Expected end of data packet"); - - packet.ReadByte(); // read off the 254 - - if (packet.HasMoreData) - { - warnings += packet.ReadInteger(2); - serverStatus = (ServerStatusFlags)packet.ReadInteger(2); - - // if we are at the end of this cursor based resultset, then we remove - // the last row sent status flag so our next fetch doesn't abort early - // and we remove this command result from our list of active CommandResult objects. - // if ((serverStatus & ServerStatusFlags.LastRowSent) != 0) - // { - // serverStatus &= ~ServerStatusFlags.LastRowSent; - // commandResults.Remove(lastCommandResult); - // } - } - } - - private void ReadEOF() - { - packet = stream.ReadPacket(); - CheckEOF(); - } - - public int PrepareStatement(string sql, ref MySqlField[] parameters) - { - //TODO: check this - //ClearFetchedRow(); - - packet.Length = sql.Length * 4 + 5; - byte[] buffer = packet.Buffer; - int len = Encoding.GetBytes(sql, 0, sql.Length, packet.Buffer, 5); - packet.Position = len + 5; - buffer[4] = (byte)DBCmd.PREPARE; - ExecutePacket(packet); - - packet = stream.ReadPacket(); - - int marker = packet.ReadByte(); - if (marker != 0) - throw new MySqlException("Expected prepared statement marker"); - - int statementId = packet.ReadInteger(4); - int numCols = packet.ReadInteger(2); - int numParams = packet.ReadInteger(2); - //TODO: find out what this is needed for - packet.ReadInteger(3); - if (numParams > 0) - { - parameters = owner.GetColumns(numParams); - // we set the encoding for each parameter back to our connection encoding - // since we can't trust what is coming back from the server - for (int i = 0; i < parameters.Length; i++) - parameters[i].Encoding = Encoding; - } - - if (numCols > 0) - { - while (numCols-- > 0) - { - packet = stream.ReadPacket(); - //TODO: handle streaming packets - } - - ReadEOF(); - } - - return statementId; - } - - // private void ClearFetchedRow() - // { - // if (lastCommandResult == 0) return; - - //TODO - /* CommandResult result = (CommandResult)commandResults[lastCommandResult]; - result.ReadRemainingColumns(); - - stream.OpenPacket(); - if (! stream.IsLastPacket) - throw new MySqlException("Cursor reading out of sync"); - - ReadEOF(false); - lastCommandResult = 0;*/ - // } - - /// - /// FetchDataRow is the method that the data reader calls to see if there is another - /// row to fetch. In the non-prepared mode, it will simply read the next data packet. - /// In the prepared mode (statementId > 0), it will - /// - public bool FetchDataRow(int statementId, int columns) - { - /* ClearFetchedRow(); - - if (!commandResults.ContainsKey(statementId)) return false; - - if ( (serverStatus & ServerStatusFlags.LastRowSent) != 0) - return false; - - stream.StartPacket(9, true); - stream.WriteByte((byte)DBCmd.FETCH); - stream.WriteInteger(statementId, 4); - stream.WriteInteger(1, 4); - stream.Flush(); - - lastCommandResult = statementId; - */ - packet = stream.ReadPacket(); - if (packet.IsLastPacket) - { - CheckEOF(); - return false; - } - nullMap = null; - if (statementId > 0) - ReadNullMap(columns); - - return true; - } - - public void CloseStatement(int statementId) - { - packet.Clear(); - packet.WriteByte((byte)DBCmd.CLOSE_STMT); - packet.WriteInteger((long)statementId, 4); - stream.SequenceByte = 0; - stream.SendPacket(packet); - } - - /// - /// Execution timeout, in milliseconds. When the accumulated time for network IO exceeds this value - /// TimeoutException is thrown. This timeout needs to be reset for every new command - /// - /// - public void ResetTimeout(int timeout) - { - if (stream != null) - stream.ResetTimeout(timeout); - } - - internal void SetConnectAttrs() - { - // Sets connect attributes - if ((connectionFlags & ClientFlags.CONNECT_ATTRS) != 0) - { - string connectAttrs = string.Empty; - MySqlConnectAttrs attrs = new MySqlConnectAttrs(); - foreach (PropertyInfo property in attrs.GetType().GetProperties()) - { - string name = property.Name; -#if NETCORE10 - object[] customAttrs = property.GetCustomAttributes(typeof(DisplayNameAttribute), false).ToArray(); -#else - object[] customAttrs = property.GetCustomAttributes(typeof(DisplayNameAttribute), false); -#endif - if (customAttrs.Length > 0) - name = (customAttrs[0] as DisplayNameAttribute).DisplayName; - - string value = (string)property.GetValue(attrs, null); - connectAttrs += string.Format("{0}{1}", (char)name.Length, name); - connectAttrs += string.Format("{0}{1}", (char)value.Length, value); - } - packet.WriteLenString(connectAttrs); - } - } - } - -} diff --git a/Source/MySql.Data/PerformanceMonitor.cs b/Source/MySql.Data/PerformanceMonitor.cs deleted file mode 100644 index 19ba17080..000000000 --- a/Source/MySql.Data/PerformanceMonitor.cs +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Diagnostics; - - -namespace MySql.Data.MySqlClient -{ - internal class PerformanceMonitor - { - public PerformanceMonitor(MySqlConnection connection) - { - Connection = connection; - } - - public MySqlConnection Connection { get; private set; } - - public virtual void AddHardProcedureQuery() - { - } - - public virtual void AddSoftProcedureQuery() - { - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data/PreparableStatement.cs b/Source/MySql.Data/PreparableStatement.cs deleted file mode 100644 index fc4634f10..000000000 --- a/Source/MySql.Data/PreparableStatement.cs +++ /dev/null @@ -1,202 +0,0 @@ -// Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections; -using System.Text; -using System.Collections.Generic; -using System.Data; -using MySql.Data.Common; - -namespace MySql.Data.MySqlClient -{ - /// - /// Summary description for PreparedStatement. - /// - internal class PreparableStatement : Statement - { - BitArray _nullMap; - readonly List _parametersToSend = new List(); - MySqlPacket _packet; - int _dataPosition; - int _nullMapPosition; - - public PreparableStatement(MySqlCommand command, string text) - : base(command, text) - { - } - - #region Properties - - public int ExecutionCount { get; set; } - - public bool IsPrepared => StatementId > 0; - - public int StatementId { get; private set; } - - #endregion - - public virtual void Prepare() - { - // strip out names from parameter markers - string text; - List parameterNames = PrepareCommandText(out text); - - // ask our connection to send the prepare command - MySqlField[] paramList = null; - StatementId = Driver.PrepareStatement(text, ref paramList); - - // now we need to assign our field names since we stripped them out - // for the prepare - for (int i = 0; i < parameterNames.Count; i++) - { - //paramList[i].ColumnName = (string) parameter_names[i]; - string parameterName = (string)parameterNames[i]; - MySqlParameter p = Parameters.GetParameterFlexible(parameterName, false); - if (p == null) - throw new InvalidOperationException( - String.Format(Resources.ParameterNotFoundDuringPrepare, parameterName)); - p.Encoding = paramList[i].Encoding; - _parametersToSend.Add(p); - } - - // now prepare our null map - int numNullBytes = 0; - if (paramList != null && paramList.Length > 0) - { - _nullMap = new BitArray(paramList.Length); - numNullBytes = (_nullMap.Length + 7) / 8; - } - - _packet = new MySqlPacket(Driver.Encoding); - - // write out some values that do not change run to run - _packet.WriteByte(0); - _packet.WriteInteger(StatementId, 4); - _packet.WriteByte((byte)0); // flags; always 0 for 4.1 - _packet.WriteInteger(1, 4); // interation count; 1 for 4.1 - _nullMapPosition = _packet.Position; - _packet.Position += numNullBytes; // leave room for our null map - _packet.WriteByte(1); // rebound flag - // write out the parameter types - foreach (MySqlParameter p in _parametersToSend) - _packet.WriteInteger(p.GetPSType(), 2); - _dataPosition = _packet.Position; - } - - public override void Execute() - { - // if we are not prepared, then call down to our base - if (!IsPrepared) - { - base.Execute(); - return; - } - - //TODO: support long data here - // create our null bitmap - - // we check this because Mono doesn't ignore the case where nullMapBytes - // is zero length. - // if (nullMapBytes.Length > 0) - // { - // byte[] bits = packet.Buffer; - // nullMap.CopyTo(bits, - // nullMap.CopyTo(nullMapBytes, 0); - - // start constructing our packet - // if (Parameters.Count > 0) - // nullMap.CopyTo(packet.Buffer, nullMapPosition); - //if (parameters != null && parameters.Count > 0) - //else - // packet.WriteByte( 0 ); - //TODO: only send rebound if parms change - - // now write out all non-null values - _packet.Position = _dataPosition; - for (int i = 0; i < _parametersToSend.Count; i++) - { - MySqlParameter p = _parametersToSend[i]; - _nullMap[i] = (p.Value == DBNull.Value || p.Value == null) || - p.Direction == ParameterDirection.Output; - if (_nullMap[i]) continue; - _packet.Encoding = p.Encoding; - p.Serialize(_packet, true, Connection.Settings); - } - _nullMap?.CopyTo(_packet.Buffer, _nullMapPosition); - - ExecutionCount++; - - Driver.ExecuteStatement(_packet); - } - - public override bool ExecuteNext() - { - if (!IsPrepared) - return base.ExecuteNext(); - return false; - } - - /// - /// Prepares CommandText for use with the Prepare method - /// - /// Command text stripped of all paramter names - /// - /// Takes the output of TokenizeSql and creates a single string of SQL - /// that only contains '?' markers for each parameter. It also creates - /// the parameterMap array list that includes all the paramter names in the - /// order they appeared in the SQL - /// - private List PrepareCommandText(out string stripped_sql) - { - StringBuilder newSQL = new StringBuilder(); - List parameterMap = new List(); - - int startPos = 0; - string sql = ResolvedCommandText; - MySqlTokenizer tokenizer = new MySqlTokenizer(sql); - string parameter = tokenizer.NextParameter(); - while (parameter != null) - { - if (parameter.IndexOf(StoredProcedure.ParameterPrefix) == -1) - { - newSQL.Append(sql.Substring(startPos, tokenizer.StartIndex - startPos)); - newSQL.Append("?"); - parameterMap.Add(parameter); - startPos = tokenizer.StopIndex; - } - parameter = tokenizer.NextParameter(); - } - newSQL.Append(sql.Substring(startPos)); - stripped_sql = newSQL.ToString(); - return parameterMap; - } - - public virtual void CloseStatement() - { - if (!IsPrepared) return; - - Driver.CloseStatement(StatementId); - StatementId = 0; - } - } -} diff --git a/Source/MySql.Data/ProcedureCache.cs b/Source/MySql.Data/ProcedureCache.cs deleted file mode 100644 index 6a5009cd1..000000000 --- a/Source/MySql.Data/ProcedureCache.cs +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Text; -using MySql.Data.MySqlClient; - - -namespace MySql.Data.MySqlClient -{ - internal class ProcedureCacheEntry - { - public MySqlSchemaCollection procedure; - public MySqlSchemaCollection parameters; - } - - internal class ProcedureCache - { - private readonly Dictionary _procHash; - private readonly Queue _hashQueue; - private readonly int _maxSize; - - public ProcedureCache(int size) - { - _maxSize = size; - _hashQueue = new Queue(_maxSize); - _procHash = new Dictionary(_maxSize); - } - - public ProcedureCacheEntry GetProcedure(MySqlConnection conn, string spName, string cacheKey) - { - ProcedureCacheEntry proc = null; - - if (cacheKey != null) - { - int hash = cacheKey.GetHashCode(); - - lock (_procHash) - { - _procHash.TryGetValue(hash, out proc); - } - } - if (proc == null) - { - proc = AddNew(conn, spName); - conn.PerfMonitor.AddHardProcedureQuery(); - if (conn.Settings.Logging) - MySqlTrace.LogInformation(conn.ServerThread, - String.Format(Resources.HardProcQuery, spName)); - } - else - { - conn.PerfMonitor.AddSoftProcedureQuery(); - if (conn.Settings.Logging) - MySqlTrace.LogInformation(conn.ServerThread, - String.Format(Resources.SoftProcQuery, spName)); - } - return proc; - } - - internal string GetCacheKey(string spName, ProcedureCacheEntry proc) - { - string retValue = String.Empty; - StringBuilder key = new StringBuilder(spName); - key.Append("("); - string delimiter = ""; - if (proc.parameters != null) - { - foreach (MySqlSchemaRow row in proc.parameters.Rows) - { - if (row["ORDINAL_POSITION"].Equals(0)) - retValue = "?="; - else - { - key.AppendFormat(CultureInfo.InvariantCulture, "{0}?", delimiter); - delimiter = ","; - } - } - } - key.Append(")"); - return retValue + key.ToString(); - } - - private ProcedureCacheEntry AddNew(MySqlConnection connection, string spName) - { - ProcedureCacheEntry procData = GetProcData(connection, spName); - - if (_maxSize <= 0) return procData; - - string cacheKey = GetCacheKey(spName, procData); - int hash = cacheKey.GetHashCode(); - lock (_procHash) - { - if (_procHash.Keys.Count >= _maxSize) - TrimHash(); - if (!_procHash.ContainsKey(hash)) - { - _procHash[hash] = procData; - _hashQueue.Enqueue(hash); - } - } - return procData; - } - - private void TrimHash() - { - int oldestHash = _hashQueue.Dequeue(); - _procHash.Remove(oldestHash); - } - - private static ProcedureCacheEntry GetProcData(MySqlConnection connection, string spName) - { - string schema = String.Empty; - string name = spName; - - int dotIndex = spName.IndexOf("."); - if (dotIndex != -1) - { - schema = spName.Substring(0, dotIndex); - name = spName.Substring(dotIndex + 1, spName.Length - dotIndex - 1); - } - - string[] restrictions = new string[4]; - restrictions[1] = schema.Length > 0 ? schema : connection.CurrentDatabase(); - restrictions[2] = name; - MySqlSchemaCollection proc = connection.GetSchemaCollection("procedures", restrictions); - if (proc.Rows.Count > 1) - throw new MySqlException(Resources.ProcAndFuncSameName); - if (proc.Rows.Count == 0) - throw new MySqlException(String.Format(Resources.InvalidProcName, name, schema)); - - ProcedureCacheEntry entry = new ProcedureCacheEntry(); - entry.procedure = proc; - - // we don't use GetSchema here because that would cause another - // query of procedures and we don't need that since we already - // know the procedure we care about. - ISSchemaProvider isp = new ISSchemaProvider(connection); - string[] rest = isp.CleanRestrictions(restrictions); - MySqlSchemaCollection parameters = isp.GetProcedureParameters(rest, proc); - entry.parameters = parameters; - - return entry; - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data/Properties/AssemblyInfo.cs b/Source/MySql.Data/Properties/AssemblyInfo.cs deleted file mode 100644 index 3bd303ac7..000000000 --- a/Source/MySql.Data/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright © 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -// 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. -[assembly: AssemblyTitle("MySql.Data")] -[assembly: AssemblyDescription("ADO.Net driver for MySQL for .Net Core 1.0")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Oracle")] -[assembly: AssemblyProduct("MySql.Data.Core")] -[assembly: AssemblyCopyright("Copyright © 2016, Oracle and/or its affiliates. All rights reserved.")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -#if !NETCORE10 -[assembly: SecurityRules(SecurityRuleSet.Level1)] -[assembly: CLSCompliant(false)] -#endif - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("8f0f6915-49b2-42f8-a592-bef9a09f3811")] - - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the project output directory which is -// %Project Directory%\obj\. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// - -[assembly: AssemblyKeyName("ConnectorNet")] -[assembly: AllowPartiallyTrustedCallers()] - -[assembly: InternalsVisibleTo("MySql.Data.Tests, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] -[assembly: InternalsVisibleTo("MySql.Data.Tests.Stress, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] -[assembly: InternalsVisibleTo("MySql.Data.Entity, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] -[assembly: InternalsVisibleTo("MySql.Data.EntityFrameworkCore, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] -[assembly: InternalsVisibleTo("MySql.Data.Entity.EF5, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] -[assembly: InternalsVisibleTo("MySql.Data.Entity.EF6, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] -[assembly: InternalsVisibleTo("MySql.Fabric.Plugin, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] -[assembly: InternalsVisibleTo("MySqlX.Data.Tests, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] diff --git a/Source/MySql.Data/Properties/ReservedWords.txt b/Source/MySql.Data/Properties/ReservedWords.txt deleted file mode 100644 index 767d97d6a..000000000 --- a/Source/MySql.Data/Properties/ReservedWords.txt +++ /dev/null @@ -1,76 +0,0 @@ -ACCESSIBLE ADD ALL -ALTER ANALYZE AND -AS ASC ASENSITIVE -BEFORE BETWEEN BIGINT -BINARY BLOB BOTH -BY CALL CASCADE -CASE CHANGE CHAR -CHARACTER CHECK COLLATE -COLUMN CONDITION CONNECTION -CONSTRAINT CONTINUE CONTRIBUTORS -CONVERT CREATE CROSS -CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP -CURRENT_USER CURSOR DATABASE -DATABASES DAY_HOUR DAY_MICROSECOND -DAY_MINUTE DAY_SECOND DEC -DECIMAL DECLARE DEFAULT -DELAYED DELETE DESC -DESCRIBE DETERMINISTIC DISTINCT -DISTINCTROW DIV DOUBLE -DROP DUAL EACH -ELSE ELSEIF ENCLOSED -ESCAPED EXISTS EXIT -EXPLAIN FALSE FETCH -FLOAT FLOAT4 FLOAT8 -FOR FORCE FOREIGN -FROM FULLTEXT GRANT -GROUP HAVING HIGH_PRIORITY -HOUR_MICROSECOND HOUR_MINUTE HOUR_SECOND -IF IGNORE IN -INDEX INFILE INNER -INOUT INSENSITIVE INSERT -INT INT1 INT2 -INT3 INT4 INT8 -INTEGER INTERVAL INTO -IS ITERATE JOIN -KEY KEYS KILL -LEADING LEAVE LEFT -LIKE LIMIT LINEAR -LINES LOAD LOCALTIME -LOCALTIMESTAMP LOCK LONG -LONGBLOB LONGTEXT LOOP -LOW_PRIORITY MATCH MEDIUMBLOB -MEDIUMINT MEDIUMTEXT MIDDLEINT -MINUTE_MICROSECOND MINUTE_SECOND MOD -MODIFIES NATURAL NOT -NO_WRITE_TO_BINLOG NULL NUMERIC -ON OPTIMIZE OPTION -OPTIONALLY OR ORDER -OUT OUTER OUTFILE -PRECISION PRIMARY PROCEDURE -PURGE RANGE READ -READS READ_ONLY READ_WRITE -REAL REFERENCES REGEXP -RELEASE RENAME REPEAT -REPLACE REQUIRE RESTRICT -RETURN REVOKE RIGHT -RLIKE SCHEMA SCHEMAS -SECOND_MICROSECOND SELECT SENSITIVE -SEPARATOR SET SHOW -SMALLINT SPATIAL SPECIFIC -SQL SQLEXCEPTION SQLSTATE -SQLWARNING SQL_BIG_RESULT SQL_CALC_FOUND_ROWS -SQL_SMALL_RESULT SSL STARTING -STRAIGHT_JOIN TABLE TERMINATED -THEN TINYBLOB TINYINT -TINYTEXT TO TRAILING -TRIGGER TRUE UNDO -UNION UNIQUE UNLOCK -UNSIGNED UPDATE UPGRADE -USAGE USE USING -UTC_DATE UTC_TIME UTC_TIMESTAMP -VALUES VARBINARY VARCHAR -VARCHARACTER VARYING WHEN -WHERE WHILE WITH -WRITE X509 XOR -YEAR_MONTH ZEROFILL diff --git a/Source/MySql.Data/Properties/VersionInfo.cs b/Source/MySql.Data/Properties/VersionInfo.cs deleted file mode 100644 index e74f85a09..000000000 --- a/Source/MySql.Data/Properties/VersionInfo.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Reflection; -using System.Resources; - -// -// 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 Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("7.0.7")] -[assembly: AssemblyInformationalVersion("7.0.7")] -[assembly: NeutralResourcesLanguage("en-US")] \ No newline at end of file diff --git a/Source/MySql.Data/Replication/ReplicationConfiguration.cs b/Source/MySql.Data/Replication/ReplicationConfiguration.cs deleted file mode 100644 index bef8ddd67..000000000 --- a/Source/MySql.Data/Replication/ReplicationConfiguration.cs +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright © 2013, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Configuration; -using System.Text; - -namespace MySql.Data.MySqlClient -{ - /// - /// Used to define a Replication configurarion element in configuration file - /// - public sealed class ReplicationConfigurationElement : ConfigurationElement - { - [ConfigurationProperty("ServerGroups", IsRequired = true)] - [ConfigurationCollection(typeof(ReplicationServerGroupConfigurationElement), AddItemName = "Group")] - public GenericConfigurationElementCollection ServerGroups - { - get { return (GenericConfigurationElementCollection)this["ServerGroups"]; } - } - } - - /// - /// Used to define a Replication server group in configuration file - /// - public sealed class ReplicationServerGroupConfigurationElement : ConfigurationElement - { - [ConfigurationProperty("name", IsRequired = true)] - public string Name - { - get { return (string)this["name"]; } - set { this["name"] = value; } - } - - [ConfigurationProperty("groupType", IsRequired = false)] - public string GroupType - { - get { return (string)this["groupType"]; } - set { this["groupType"] = value; } - } - - [ConfigurationProperty("retryTime", IsRequired = false, DefaultValue = 60)] - public int RetryTime - { - get { return (int)this["retryTime"]; } - set { this["retryTime"] = value; } - } - - [ConfigurationProperty("Servers")] - [ConfigurationCollection(typeof(ReplicationServerConfigurationElement), AddItemName = "Server")] - public GenericConfigurationElementCollection Servers - { - get { return (GenericConfigurationElementCollection)this["Servers"]; } - } - } - - /// - /// Defines a Replication server in configuration file - /// - public sealed class ReplicationServerConfigurationElement : ConfigurationElement - { - [ConfigurationProperty("name", IsRequired = true)] - public string Name - { - get { return (string)this["name"]; } - set { this["name"] = value; } - } - - [ConfigurationProperty("IsMaster", IsRequired = false, DefaultValue = false)] - public bool IsMaster - { - get { return (bool)this["IsMaster"]; } - set { this["IsMaster"] = value; } - } - - [ConfigurationProperty("connectionstring", IsRequired = true)] - public string ConnectionString - { - get { return (string)this["connectionstring"]; } - set { this["connectionstring"] = value; } - } - } -} diff --git a/Source/MySql.Data/Replication/ReplicationManager.cs b/Source/MySql.Data/Replication/ReplicationManager.cs deleted file mode 100644 index 8804721a6..000000000 --- a/Source/MySql.Data/Replication/ReplicationManager.cs +++ /dev/null @@ -1,194 +0,0 @@ -// Copyright © 2014, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Text; -using MySql.Data.MySqlClient; - - -namespace MySql.Data.MySqlClient.Replication -{ - /// - /// Manager for Replication and Load Balancing features - /// - internal static class ReplicationManager - { - private static List groups = new List(); - private static Object thisLock = new Object(); - //private static Dictionary selectors = new Dictionary(); - - static ReplicationManager() - { - Groups = groups; - -#if !NETCORE10 - // load up our selectors - if (MySqlConfiguration.Settings == null) return; - - foreach (var group in MySqlConfiguration.Settings.Replication.ServerGroups) - { - ReplicationServerGroup g = AddGroup(group.Name, group.GroupType, group.RetryTime); - foreach (var server in group.Servers) - g.AddServer(server.Name, server.IsMaster, server.ConnectionString); - } -#endif - } - - /// - /// Returns Replication Server Group List - /// - internal static IList Groups { get; private set; } - - /// - /// Adds a Default Server Group to the list - /// - /// Group name - /// Time between reconnections for failed servers - /// Replication Server Group added - internal static ReplicationServerGroup AddGroup(string name, int retryTime) - { - return AddGroup( name, null, retryTime); - } - - /// - /// Adds a Server Group to the list - /// - /// Group name - /// ServerGroup type reference - /// Time between reconnections for failed servers - /// Server Group added - internal static ReplicationServerGroup AddGroup(string name, string groupType, int retryTime) - { - if (string.IsNullOrEmpty(groupType)) - groupType = "MySql.Data.MySqlClient.Replication.ReplicationRoundRobinServerGroup"; - Type t = Type.GetType(groupType); - ReplicationServerGroup g = (ReplicationServerGroup)Activator.CreateInstance(t, name, retryTime) as ReplicationServerGroup; - groups.Add(g); - return g; - } - - /// - /// Gets the next server from a replication group - /// - /// Group name - /// True if the server to return must be a master - /// Replication Server defined by the Load Balancing plugin - internal static ReplicationServer GetServer(string groupName, bool isMaster) - { - ReplicationServerGroup group = GetGroup(groupName); - return group.GetServer(isMaster); - } - - /// - /// Gets a Server Group by name - /// - /// Group name - /// Server Group if found, otherwise throws an MySqlException - internal static ReplicationServerGroup GetGroup(string groupName) - { - ReplicationServerGroup group = null; - foreach (ReplicationServerGroup g in groups) - { - if (String.Compare(g.Name, groupName, StringComparison.OrdinalIgnoreCase) != 0) continue; - group = g; - break; - } - if (group == null) - throw new MySqlException(String.Format(Resources.ReplicationGroupNotFound, groupName)); - return group; - } - - /// - /// Validates if the replication group name exists - /// - /// Group name to validate - /// True if replication group name is found, otherwise false - internal static bool IsReplicationGroup(string groupName) - { - foreach (ReplicationServerGroup g in groups) - if (String.Compare(g.Name, groupName, StringComparison.OrdinalIgnoreCase) == 0) return true; - return false; - } - - /// - /// Assigns a new server driver to the connection object - /// - /// Group name - /// True if the server connection to assign must be a master - /// MySqlConnection object where the new driver will be assigned - internal static void GetNewConnection(string groupName, bool master, MySqlConnection connection) - { - do - { - lock (thisLock) - { - if (!IsReplicationGroup(groupName)) return; - - ReplicationServerGroup group = GetGroup(groupName); - ReplicationServer server = group.GetServer(master, connection.Settings); - - if (server == null) - throw new MySqlException(Resources.Replication_NoAvailableServer); - - try - { - bool isNewServer = false; - if (connection.driver == null || !connection.driver.IsOpen) - { - isNewServer = true; - } - else - { - MySqlConnectionStringBuilder msb = new MySqlConnectionStringBuilder(server.ConnectionString); - if (!msb.Equals(connection.driver.Settings)) - { - isNewServer = true; - } - } - if (isNewServer) - { - Driver driver = Driver.Create(new MySqlConnectionStringBuilder(server.ConnectionString)); - connection.driver = driver; - } - return; - } - catch (MySqlException ex) - { - connection.driver = null; - server.IsAvailable = false; - MySqlTrace.LogError(ex.Number, ex.ToString()); - if (ex.Number == 1042) - { - // retry to open a failed connection and update its status - group.HandleFailover(server, ex); - } - else - throw; - } - } - } while (true); - } - } -} diff --git a/Source/MySql.Data/Replication/ReplicationRoundRobinServerGroup.cs b/Source/MySql.Data/Replication/ReplicationRoundRobinServerGroup.cs deleted file mode 100644 index 76a3afdad..000000000 --- a/Source/MySql.Data/Replication/ReplicationRoundRobinServerGroup.cs +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright © 2013, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; - -namespace MySql.Data.MySqlClient.Replication -{ - /// - /// Class that implements Round Robing Load Balancing technique - /// - public class ReplicationRoundRobinServerGroup : ReplicationServerGroup - { - private int nextServer; - - public ReplicationRoundRobinServerGroup(string name, int retryTime) : base(name, retryTime) - { - nextServer = -1; - } - - /// - /// Gets an available server based on Round Robin load balancing - /// - /// True if the server to return must be a master - /// Next available server - internal protected override ReplicationServer GetServer(bool isMaster) - { - for (int i = 0; i < Servers.Count; i++) - { - nextServer++; - if (nextServer == Servers.Count) - nextServer = 0; - ReplicationServer s = Servers[nextServer]; - if (!s.IsAvailable) continue; - if (isMaster && !s.IsMaster) continue; - return s; - } - return null; - } - } -} diff --git a/Source/MySql.Data/Replication/ReplicationServer.cs b/Source/MySql.Data/Replication/ReplicationServer.cs deleted file mode 100644 index 4de85889d..000000000 --- a/Source/MySql.Data/Replication/ReplicationServer.cs +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright © 2014, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; - -namespace MySql.Data.MySqlClient.Replication -{ - /// - /// Represents a server in Replication environment - /// - public class ReplicationServer - { - public ReplicationServer(string name, bool isMaster, string connectionString) - { - Name = name; - IsMaster = isMaster; - ConnectionString = connectionString; - IsAvailable = true; - } - - /// - /// Server name - /// - public string Name { get; private set; } - /// - /// Defines if the server is master (True) or slave - /// - public bool IsMaster { get; private set; } - /// - /// Connection string used to connect to the server - /// - public string ConnectionString { get; internal set; } - /// - /// Defines if the server is available to be considered in load balancing - /// - public bool IsAvailable { get; set; } - } -} diff --git a/Source/MySql.Data/Replication/ReplicationServerGroup.cs b/Source/MySql.Data/Replication/ReplicationServerGroup.cs deleted file mode 100644 index 3b4593907..000000000 --- a/Source/MySql.Data/Replication/ReplicationServerGroup.cs +++ /dev/null @@ -1,199 +0,0 @@ -// Copyright © 2014, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Text; - -namespace MySql.Data.MySqlClient.Replication -{ - /// - /// Base class used to implement load balancing features - /// - public abstract class ReplicationServerGroup - { - protected List servers = new List(); - - /// Group name - /// - public ReplicationServerGroup(string name, int retryTime) - { - Servers = servers; - Name = name; - RetryTime = retryTime; - } - - /// - /// Group name - /// - public string Name { get; protected set; } - /// - /// Retry time between connections to failed servers - /// - public int RetryTime { get; protected set; } - /// - /// Servers list in the group - /// - protected IList Servers { get; private set; } - - /// - /// Adds a server into the group - /// - /// Server name - /// True if the server to add is master, False for slave server - /// Connection string used by this server - /// - internal protected ReplicationServer AddServer(string name, bool isMaster, string connectionString) - { - ReplicationServer server = new ReplicationServer(name, isMaster, connectionString); - servers.Add(server); - return server; - } - - /// - /// Removes a server from group - /// - /// Server name - internal protected void RemoveServer(string name) - { - ReplicationServer serverToRemove = GetServer(name); - if (serverToRemove == null) - throw new MySqlException(String.Format(Resources.ReplicationServerNotFound, name)); - servers.Remove(serverToRemove); - } - - /// - /// Gets a server by name - /// - /// Server name - /// Replication server - internal protected ReplicationServer GetServer(string name) - { - foreach (var server in servers) - if (String.Compare(name, server.Name, StringComparison.OrdinalIgnoreCase) == 0) return server; - return null; - } - - /// - /// Must be implemented. Defines the next server for a custom load balancing implementation. - /// - /// Defines if the server to return is a master or any - /// Next server based on the load balancing implementation. - /// Null if no available server is found. - /// - internal protected abstract ReplicationServer GetServer(bool isMaster); - - internal protected virtual ReplicationServer GetServer(bool isMaster, MySqlConnectionStringBuilder settings) - { - return GetServer(isMaster); - } - - /// - /// Handles a failed connection to a server. - /// This method can be overrided to implement a custom failover handling - /// - /// The failed server - internal protected virtual void HandleFailover(ReplicationServer server) - { - BackgroundWorker worker = new BackgroundWorker(); - worker.DoWork += delegate(object sender, DoWorkEventArgs e) - { - bool isRunning = false; - ReplicationServer server1 = e.Argument as ReplicationServer; -#if !NETCORE10 - System.Timers.Timer timer = new System.Timers.Timer(RetryTime * 1000.0); - - System.Timers.ElapsedEventHandler elapsedEvent = delegate(object sender1, System.Timers.ElapsedEventArgs e1) - { - if (isRunning) return; - try - { - isRunning = true; - using (MySqlConnection connectionFailed = new MySqlConnection(server.ConnectionString)) - { - connectionFailed.Open(); - server1.IsAvailable = true; - timer.Stop(); - } - } - catch - { - MySqlTrace.LogWarning(0, - string.Format(Resources.Replication_ConnectionAttemptFailed, server1.Name)); - } - finally - { - isRunning = false; - } - }; - timer.Elapsed += elapsedEvent; - timer.Start(); - elapsedEvent(sender, null); -#else - Windows.UI.Xaml.DispatcherTimer timer = new Windows.UI.Xaml.DispatcherTimer(); - TimeSpan ts = new TimeSpan(RetryTime * 1000); - System.EventHandler elapsedEvent = (TickSender, TickEventArgs) => - { - if (isRunning) return; - try - { - isRunning = true; - using (MySqlConnection connectionFailed = new MySqlConnection(server.ConnectionString)) - { - connectionFailed.Open(); - server1.IsAvailable = true; - timer.Stop(); - } - } - catch - { - MySqlTrace.LogWarning(0, - string.Format(Properties.Resources.Replication_ConnectionAttemptFailed, server1.Name)); - } - finally - { - isRunning = false; - } - }; - timer.Tick += elapsedEvent; - elapsedEvent(sender, null); - timer.Start(); -#endif - }; - - worker.RunWorkerAsync(server); - } - - /// - /// Handles a failed connection to a server. - /// - /// The failed server - /// Exception that caused the failover - internal protected virtual void HandleFailover(ReplicationServer server, Exception exception) - { - HandleFailover(server); - } - } -} diff --git a/Source/MySql.Data/Resources.Designer.cs b/Source/MySql.Data/Resources.Designer.cs deleted file mode 100644 index e1d6289e4..000000000 --- a/Source/MySql.Data/Resources.Designer.cs +++ /dev/null @@ -1,1390 +0,0 @@ -//------------------------------------------------------------------------------ -// -// 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 MySql.Data { - using System; - using System.Reflection; - - - /// - /// 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.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - public class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - public static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { -#if NETCORE10 - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MySql.Data.Resources", typeof(Resources).GetTypeInfo().Assembly); -#else - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MySql.Data.Resources", typeof(Resources).Assembly); -#endif - 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)] - public static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to Improper MySqlCommandBuilder state: adapter is null. - /// - public static string AdapterIsNull { - get { - return ResourceManager.GetString("AdapterIsNull", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Improper MySqlCommandBuilder state: adapter's SelectCommand is null. - /// - public static string AdapterSelectIsNull { - get { - return ResourceManager.GetString("AdapterSelectIsNull", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid attempt to access a field before calling Read(). - /// - public static string AttemptToAccessBeforeRead { - get { - return ResourceManager.GetString("AttemptToAccessBeforeRead", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Authentication to host '{0}' for user '{1}' using method '{2}' failed with message: {3}. - /// - public static string AuthenticationFailed { - get { - return ResourceManager.GetString("AuthenticationFailed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Authentication method '{0}' not supported by any of the available plugins.. - /// - public static string AuthenticationMethodNotSupported { - get { - return ResourceManager.GetString("AuthenticationMethodNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Version string not in acceptable format. - /// - public static string BadVersionFormat { - get { - return ResourceManager.GetString("BadVersionFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The buffer cannot be null. - /// - public static string BufferCannotBeNull { - get { - return ResourceManager.GetString("BufferCannotBeNull", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Buffer is not large enough. - /// - public static string BufferNotLargeEnough { - get { - return ResourceManager.GetString("BufferNotLargeEnough", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Canceling an executing query requires MySQL 5.0 or higher.. - /// - public static string CancelNeeds50 { - get { - return ResourceManager.GetString("CancelNeeds50", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Canceling an active query is only supported on MySQL 5.0.0 and above. . - /// - public static string CancelNotSupported { - get { - return ResourceManager.GetString("CancelNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Parameters can only be derived for commands using the StoredProcedure command type.. - /// - public static string CanNotDeriveParametersForTextCommands { - get { - return ResourceManager.GetString("CanNotDeriveParametersForTextCommands", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to MySqlCommandBuilder does not support multi-table statements. - /// - public static string CBMultiTableNotSupported { - get { - return ResourceManager.GetString("CBMultiTableNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to MySqlCommandBuilder cannot operate on tables with no unique or key columns. - /// - public static string CBNoKeyColumn { - get { - return ResourceManager.GetString("CBNoKeyColumn", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Chaos isolation level is not supported. - /// - public static string ChaosNotSupported { - get { - return ResourceManager.GetString("ChaosNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The CommandText property has not been properly initialized.. - /// - public static string CommandTextNotInitialized { - get { - return ResourceManager.GetString("CommandTextNotInitialized", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Compression is not supported.. - /// - public static string CompressionNotSupported { - get { - return ResourceManager.GetString("CompressionNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The connection is already open.. - /// - public static string ConnectionAlreadyOpen { - get { - return ResourceManager.GetString("ConnectionAlreadyOpen", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Connection unexpectedly terminated.. - /// - public static string ConnectionBroken { - get { - return ResourceManager.GetString("ConnectionBroken", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Connection must be valid and open. - /// - public static string ConnectionMustBeOpen { - get { - return ResourceManager.GetString("ConnectionMustBeOpen", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The connection is not open.. - /// - public static string ConnectionNotOpen { - get { - return ResourceManager.GetString("ConnectionNotOpen", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The connection property has not been set or is null.. - /// - public static string ConnectionNotSet { - get { - return ResourceManager.GetString("ConnectionNotSet", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Could not find specified column in results: {0}. - /// - public static string CouldNotFindColumnName { - get { - return ResourceManager.GetString("CouldNotFindColumnName", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Count cannot be negative. - /// - public static string CountCannotBeNegative { - get { - return ResourceManager.GetString("CountCannotBeNegative", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SetLength is not a valid operation on CompressedStream. - /// - public static string CSNoSetLength { - get { - return ResourceManager.GetString("CSNoSetLength", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The given value was not in a supported format.. - /// - public static string DataNotInSupportedFormat { - get { - return ResourceManager.GetString("DataNotInSupportedFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to There is already an open DataReader associated with this Connection which must be closed first.. - /// - public static string DataReaderOpen { - get { - return ResourceManager.GetString("DataReaderOpen", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The default connection encoding was not found. Please report this as a bug along with your connection string and system details.. - /// - public static string DefaultEncodingNotFound { - get { - return ResourceManager.GetString("DefaultEncodingNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to MySQL Connector/Net does not currently support distributed transactions.. - /// - public static string DistributedTxnNotSupported { - get { - return ResourceManager.GetString("DistributedTxnNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Error creating socket connection. - /// - public static string ErrorCreatingSocket { - get { - return ResourceManager.GetString("ErrorCreatingSocket", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Fatal error encountered during command execution.. - /// - public static string FatalErrorDuringExecute { - get { - return ResourceManager.GetString("FatalErrorDuringExecute", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Fatal error encountered during data read.. - /// - public static string FatalErrorDuringRead { - get { - return ResourceManager.GetString("FatalErrorDuringRead", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Fatal error encountered attempting to read the resultset.. - /// - public static string FatalErrorReadingResult { - get { - return ResourceManager.GetString("FatalErrorReadingResult", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to File based certificates are only supported when connecting to MySQL Server 5.1 or greater.. - /// - public static string FileBasedCertificateNotSupported { - get { - return ResourceManager.GetString("FileBasedCertificateNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to From index and length use more bytes than from contains. - /// - public static string FromAndLengthTooBig { - get { - return ResourceManager.GetString("FromAndLengthTooBig", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to From index must be a valid index inside the from buffer. - /// - public static string FromIndexMustBeValid { - get { - return ResourceManager.GetString("FromIndexMustBeValid", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Call to GetHostEntry failed after {0} while querying for hostname '{1}': SocketErrorCode={2}, ErrorCode={3}, NativeErrorCode={4}.. - /// - public static string GetHostEntryFailed { - get { - return ResourceManager.GetString("GetHostEntryFailed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Retrieving procedure metadata for {0} from server.. - /// - public static string HardProcQuery { - get { - return ResourceManager.GetString("HardProcQuery", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value has an unsupported format.. - /// - public static string ImproperValueFormat { - get { - return ResourceManager.GetString("ImproperValueFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to An incorrect response was received from the server.. - /// - public static string IncorrectTransmission { - get { - return ResourceManager.GetString("IncorrectTransmission", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Index and length use more bytes than to has room for. - /// - public static string IndexAndLengthTooBig { - get { - return ResourceManager.GetString("IndexAndLengthTooBig", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Index must be a valid position in the buffer. - /// - public static string IndexMustBeValid { - get { - return ResourceManager.GetString("IndexMustBeValid", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to You have specified an invalid column ordinal.. - /// - public static string InvalidColumnOrdinal { - get { - return ResourceManager.GetString("InvalidColumnOrdinal", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The requested value '{0}' is invalid for the given keyword '{1}'.. - /// - public static string InvalidConnectionStringValue { - get { - return ResourceManager.GetString("InvalidConnectionStringValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Microsecond must be a value between 0 and 999999.. - /// - public static string InvalidMicrosecondValue { - get { - return ResourceManager.GetString("InvalidMicrosecondValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Millisecond must be a value between 0 and 999. For more precision use Microsecond.. - /// - public static string InvalidMillisecondValue { - get { - return ResourceManager.GetString("InvalidMillisecondValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Procedure or function '{0}' cannot be found in database '{1}'.. - /// - public static string InvalidProcName { - get { - return ResourceManager.GetString("InvalidProcName", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}' is an illegal value for a boolean option.. - /// - public static string InvalidValueForBoolean { - get { - return ResourceManager.GetString("InvalidValueForBoolean", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Keyword does not allow null values.. - /// - public static string KeywordNoNull { - get { - return ResourceManager.GetString("KeywordNoNull", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Keyword not supported.. - /// - public static string KeywordNotSupported { - get { - return ResourceManager.GetString("KeywordNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ACCESSIBLE - ///ADD - ///ALL - ///ALTER - ///ANALYZE - ///AND - ///AS - ///ASC - ///ASENSITIVE - ///BEFORE - ///BEGIN - ///BETWEEN - ///BIGINT - ///BINARY - ///BLOB - ///BOTH - ///BY - ///CALL - ///CASCADE - ///CASE - ///CHANGE - ///CHAR - ///CHARACTER - ///CHECK - ///COLLATE - ///COLUMN - ///COMMIT - ///CONDITION - ///CONNECTION - ///CONSTRAINT - ///CONTINUE - ///CONVERT - ///CREATE - ///CROSS - ///CURRENT_DATE - ///CURRENT_TIME - ///CURRENT_TIMESTAMP - ///CURRENT_USER - ///CURSOR - ///DATABASE - ///DATABASES - ///DAY_HOUR - ///DAY_MICROSECOND - ///DAY_MINUTE - ///DAY_SECOND - ///DEC - ///DECIMAL - ///DECLARE - ///DEFAULT - ///DELAYED - ///DELETE - ///DESC - ///DESCRIBE - ///DETERMINISTIC - ///DISTINCT - ///DISTINCTROW - ///D [rest of string was truncated]";. - /// - public static string keywords { - get { - return ResourceManager.GetString("keywords", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Mixing named and unnamed parameters is not allowed.. - /// - public static string MixedParameterNamingNotAllowed { - get { - return ResourceManager.GetString("MixedParameterNamingNotAllowed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to INTERNAL ERROR: More than one output parameter row detected.. - /// - public static string MoreThanOneOPRow { - get { - return ResourceManager.GetString("MoreThanOneOPRow", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Multiple simultaneous connections or connections with different connection strings inside the same transaction are not currently supported.. - /// - public static string MultipleConnectionsInTransactionNotSupported { - get { - return ResourceManager.GetString("MultipleConnectionsInTransactionNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to NamedPipeStream does not support seeking. - /// - public static string NamedPipeNoSeek { - get { - return ResourceManager.GetString("NamedPipeNoSeek", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to NamedPipeStream doesn't support SetLength. - /// - public static string NamedPipeNoSetLength { - get { - return ResourceManager.GetString("NamedPipeNoSetLength", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The new value must be a MySqlParameter object.. - /// - public static string NewValueShouldBeMySqlParameter { - get { - return ResourceManager.GetString("NewValueShouldBeMySqlParameter", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid attempt to call NextResult when the reader is closed.. - /// - public static string NextResultIsClosed { - get { - return ResourceManager.GetString("NextResultIsClosed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to When calling stored procedures and 'Use Procedure Bodies' is false, all parameters must have their type explicitly set.. - /// - public static string NoBodiesAndTypeNotSet { - get { - return ResourceManager.GetString("NoBodiesAndTypeNotSet", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Nested transactions are not supported.. - /// - public static string NoNestedTransactions { - get { - return ResourceManager.GetString("NoNestedTransactions", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The host {0} does not support SSL connections.. - /// - public static string NoServerSSLSupport { - get { - return ResourceManager.GetString("NoServerSSLSupport", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unix sockets are not supported on Windows.. - /// - public static string NoUnixSocketsOnWindows { - get { - return ResourceManager.GetString("NoUnixSocketsOnWindows", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cannot retrieve Windows identity for current user. Connections that use IntegratedSecurity cannot be pooled. Use either 'ConnectionReset=true' or 'Pooling=false' in the connection string to fix.. - /// - public static string NoWindowsIdentity { - get { - return ResourceManager.GetString("NoWindowsIdentity", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The object is not open or has been disposed.. - /// - public static string ObjectDisposed { - get { - return ResourceManager.GetString("ObjectDisposed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Offset cannot be negative. - /// - public static string OffsetCannotBeNegative { - get { - return ResourceManager.GetString("OffsetCannotBeNegative", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Offset must be a valid position in buffer. - /// - public static string OffsetMustBeValid { - get { - return ResourceManager.GetString("OffsetMustBeValid", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Authentication with old password no longer supported, use 4.1 style passwords.. - /// - public static string OldPasswordsNotSupported { - get { - return ResourceManager.GetString("OldPasswordsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Parameter '{0}' has already been defined.. - /// - public static string ParameterAlreadyDefined { - get { - return ResourceManager.GetString("ParameterAlreadyDefined", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Parameter cannot have a negative value. - /// - public static string ParameterCannotBeNegative { - get { - return ResourceManager.GetString("ParameterCannotBeNegative", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Parameter cannot be null. - /// - public static string ParameterCannotBeNull { - get { - return ResourceManager.GetString("ParameterCannotBeNull", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Parameter index was not found in Parameter Collection.. - /// - public static string ParameterIndexNotFound { - get { - return ResourceManager.GetString("ParameterIndexNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Parameter is invalid.. - /// - public static string ParameterIsInvalid { - get { - return ResourceManager.GetString("ParameterIsInvalid", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Parameter '{0}' must be defined.. - /// - public static string ParameterMustBeDefined { - get { - return ResourceManager.GetString("ParameterMustBeDefined", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Parameter '{0}' was not found during prepare.. - /// - public static string ParameterNotFoundDuringPrepare { - get { - return ResourceManager.GetString("ParameterNotFoundDuringPrepare", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Password must be valid and contain length characters. - /// - public static string PasswordMustHaveLegalChars { - get { - return ResourceManager.GetString("PasswordMustHaveLegalChars", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to This category includes a series of counters for MySQL. - /// - public static string PerfMonCategoryHelp { - get { - return ResourceManager.GetString("PerfMonCategoryHelp", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to .NET Data Provider for MySQL. - /// - public static string PerfMonCategoryName { - get { - return ResourceManager.GetString("PerfMonCategoryName", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The number of times a procedures metadata had to be queried from the server.. - /// - public static string PerfMonHardProcHelp { - get { - return ResourceManager.GetString("PerfMonHardProcHelp", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Hard Procedure Queries. - /// - public static string PerfMonHardProcName { - get { - return ResourceManager.GetString("PerfMonHardProcName", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The number of times a procedures metadata was retrieved from the client-side cache.. - /// - public static string PerfMonSoftProcHelp { - get { - return ResourceManager.GetString("PerfMonSoftProcHelp", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Soft Procedure Queries. - /// - public static string PerfMonSoftProcName { - get { - return ResourceManager.GetString("PerfMonSoftProcName", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to same name are not supported.. - /// - public static string ProcAndFuncSameName { - get { - return ResourceManager.GetString("ProcAndFuncSameName", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Packets larger than max_allowed_packet are not allowed.. - /// - public static string QueryTooLarge { - get { - return ResourceManager.GetString("QueryTooLarge", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Reading from the stream has failed.. - /// - public static string ReadFromStreamFailed { - get { - return ResourceManager.GetString("ReadFromStreamFailed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid attempt to read a prior column using SequentialAccess. - /// - public static string ReadingPriorColumnUsingSeqAccess { - get { - return ResourceManager.GetString("ReadingPriorColumnUsingSeqAccess", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Replicated connections allow only readonly statements.. - /// - public static string ReplicatedConnectionsAllowOnlyReadonlyStatements { - get { - return ResourceManager.GetString("ReplicatedConnectionsAllowOnlyReadonlyStatements", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Attempt to connect to '{0}' server failed.. - /// - public static string Replication_ConnectionAttemptFailed { - get { - return ResourceManager.GetString("Replication_ConnectionAttemptFailed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No available server found.. - /// - public static string Replication_NoAvailableServer { - get { - return ResourceManager.GetString("Replication_NoAvailableServer", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Replication group '{0}' not found.. - /// - public static string ReplicationGroupNotFound { - get { - return ResourceManager.GetString("ReplicationGroupNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Replicated server not found: '{0}'. - /// - public static string ReplicationServerNotFound { - get { - return ResourceManager.GetString("ReplicationServerNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Routine '{0}' cannot be found. Either check the spelling or make sure you have sufficient rights to execute the routine.. - /// - public static string RoutineNotFound { - get { - return ResourceManager.GetString("RoutineNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Attempt to call stored function '{0}' without specifying a return parameter. - /// - public static string RoutineRequiresReturnParameter { - get { - return ResourceManager.GetString("RoutineRequiresReturnParameter", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Connector/Net no longer supports server versions prior to 5.0. - /// - public static string ServerTooOld { - get { - return ResourceManager.GetString("ServerTooOld", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Snapshot isolation level is not supported.. - /// - public static string SnapshotNotSupported { - get { - return ResourceManager.GetString("SnapshotNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Socket streams do not support seeking. - /// - public static string SocketNoSeek { - get { - return ResourceManager.GetString("SocketNoSeek", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Retrieving procedure metadata for {0} from procedure cache.. - /// - public static string SoftProcQuery { - get { - return ResourceManager.GetString("SoftProcQuery", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Stored procedures are not supported on this version of MySQL. - /// - public static string SPNotSupported { - get { - return ResourceManager.GetString("SPNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SSL Connection error.. - /// - public static string SslConnectionError { - get { - return ResourceManager.GetString("SslConnectionError", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The stream has already been closed. - /// - public static string StreamAlreadyClosed { - get { - return ResourceManager.GetString("StreamAlreadyClosed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The stream does not support reading. - /// - public static string StreamNoRead { - get { - return ResourceManager.GetString("StreamNoRead", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The stream does not support writing. - /// - public static string StreamNoWrite { - get { - return ResourceManager.GetString("StreamNoWrite", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.. - /// - public static string Timeout { - get { - return ResourceManager.GetString("Timeout", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to error connecting: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.. - /// - public static string TimeoutGettingConnection { - get { - return ResourceManager.GetString("TimeoutGettingConnection", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: Connection Closed. - /// - public static string TraceCloseConnection { - get { - return ResourceManager.GetString("TraceCloseConnection", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to trace. There are more than Int32.MaxValue connections in use.. - /// - public static string TraceErrorMoreThanMaxValueConnections { - get { - return ResourceManager.GetString("TraceErrorMoreThanMaxValueConnections", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: Error encountered during row fetch. Number = {1}, Message={2}. - /// - public static string TraceFetchError { - get { - return ResourceManager.GetString("TraceFetchError", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: Connection Opened: connection string = '{1}'. - /// - public static string TraceOpenConnection { - get { - return ResourceManager.GetString("TraceOpenConnection", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: Error encountered attempting to open result: Number={1}, Message={2}. - /// - public static string TraceOpenResultError { - get { - return ResourceManager.GetString("TraceOpenResultError", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: Query Closed. - /// - public static string TraceQueryDone { - get { - return ResourceManager.GetString("TraceQueryDone", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: Query Normalized: {2}. - /// - public static string TraceQueryNormalized { - get { - return ResourceManager.GetString("TraceQueryNormalized", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: Query Opened: {2}. - /// - public static string TraceQueryOpened { - get { - return ResourceManager.GetString("TraceQueryOpened", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: Resultset Opened: field(s) = {1}, affected rows = {2}, inserted id = {3}. - /// - public static string TraceResult { - get { - return ResourceManager.GetString("TraceResult", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: Resultset Closed. Total rows={1}, skipped rows={2}, size (bytes)={3}. - /// - public static string TraceResultClosed { - get { - return ResourceManager.GetString("TraceResultClosed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: Set Database: {1}. - /// - public static string TraceSetDatabase { - get { - return ResourceManager.GetString("TraceSetDatabase", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: Statement closed: statement id = {1}. - /// - public static string TraceStatementClosed { - get { - return ResourceManager.GetString("TraceStatementClosed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: Statement executed: statement id = {1}. - /// - public static string TraceStatementExecuted { - get { - return ResourceManager.GetString("TraceStatementExecuted", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: Statement prepared: sql='{1}', statement id={2}. - /// - public static string TraceStatementPrepared { - get { - return ResourceManager.GetString("TraceStatementPrepared", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: Usage Advisor Warning: Query is using a bad index. - /// - public static string TraceUAWarningBadIndex { - get { - return ResourceManager.GetString("TraceUAWarningBadIndex", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: Usage Advisor Warning: The field '{2}' was converted to the following types: {3}. - /// - public static string TraceUAWarningFieldConversion { - get { - return ResourceManager.GetString("TraceUAWarningFieldConversion", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: Usage Advisor Warning: Query does not use an index. - /// - public static string TraceUAWarningNoIndex { - get { - return ResourceManager.GetString("TraceUAWarningNoIndex", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: Usage Advisor Warning: The following columns were not accessed: {2}. - /// - public static string TraceUAWarningSkippedColumns { - get { - return ResourceManager.GetString("TraceUAWarningSkippedColumns", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: Usage Advisor Warning: Skipped {2} rows. Consider a more focused query.. - /// - public static string TraceUAWarningSkippedRows { - get { - return ResourceManager.GetString("TraceUAWarningSkippedRows", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0}: MySql Warning: Level={1}, Code={2}, Message={3}. - /// - public static string TraceWarning { - get { - return ResourceManager.GetString("TraceWarning", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' is not derived from BaseCommandInterceptor. - /// - public static string TypeIsNotCommandInterceptor { - get { - return ResourceManager.GetString("TypeIsNotCommandInterceptor", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Type '{0}' is not derived from BaseExceptionInterceptor. - /// - public static string TypeIsNotExceptionInterceptor { - get { - return ResourceManager.GetString("TypeIsNotExceptionInterceptor", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to connect to any of the specified MySQL hosts.. - /// - public static string UnableToConnectToHost { - get { - return ResourceManager.GetString("UnableToConnectToHost", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to create plugin for authentication method '{0}'. Please see inner exception for details.. - /// - public static string UnableToCreateAuthPlugin { - get { - return ResourceManager.GetString("UnableToCreateAuthPlugin", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to derive stored routine parameters. The 'Parameters' information schema table is not available and access to the stored procedure body has been disabled.. - /// - public static string UnableToDeriveParameters { - get { - return ResourceManager.GetString("UnableToDeriveParameters", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to enable query analysis. Be sure the MySql.Data.EMTrace assembly is properly located and registered.. - /// - public static string UnableToEnableQueryAnalysis { - get { - return ResourceManager.GetString("UnableToEnableQueryAnalysis", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to An error occured attempting to enumerate the user-defined functions. Do you have SELECT privileges on the mysql.func table?. - /// - public static string UnableToEnumerateUDF { - get { - return ResourceManager.GetString("UnableToEnumerateUDF", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to execute stored procedure '{0}'.. - /// - public static string UnableToExecuteSP { - get { - return ResourceManager.GetString("UnableToExecuteSP", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to There was an error parsing the foreign key definition.. - /// - public static string UnableToParseFK { - get { - return ResourceManager.GetString("UnableToParseFK", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to retrieve stored procedure metadata for routine '{0}'. Either grant SELECT privilege to mysql.proc for this user or use "check parameters=false" with your connection string.. - /// - public static string UnableToRetrieveParameters { - get { - return ResourceManager.GetString("UnableToRetrieveParameters", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to start a second async operation while one is running.. - /// - public static string UnableToStartSecondAsyncOp { - get { - return ResourceManager.GetString("UnableToStartSecondAsyncOp", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unix sockets are not supported on Windows. - /// - public static string UnixSocketsNotSupported { - get { - return ResourceManager.GetString("UnixSocketsNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unknown authentication method '{0}' was requested.. - /// - public static string UnknownAuthenticationMethod { - get { - return ResourceManager.GetString("UnknownAuthenticationMethod", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unknown connection protocol. - /// - public static string UnknownConnectionProtocol { - get { - return ResourceManager.GetString("UnknownConnectionProtocol", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value '{0}' is not of the correct type.. - /// - public static string ValueNotCorrectType { - get { - return ResourceManager.GetString("ValueNotCorrectType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The requested column value could not be treated as or conveted to a Guid.. - /// - public static string ValueNotSupportedForGuid { - get { - return ResourceManager.GetString("ValueNotSupportedForGuid", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Windows authentication connections are not supported on {0}. - /// - public static string WinAuthNotSupportOnPlatform { - get { - return ResourceManager.GetString("WinAuthNotSupportOnPlatform", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Writing to the stream failed.. - /// - public static string WriteToStreamFailed { - get { - return ResourceManager.GetString("WriteToStreamFailed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Parameter '{0}' is not found but a parameter with the name '{1}' is found. Parameter names must include the leading parameter marker.. - /// - public static string WrongParameterName { - get { - return ResourceManager.GetString("WrongParameterName", resourceCulture); - } - } - } -} diff --git a/Source/MySql.Data/Resources.resx b/Source/MySql.Data/Resources.resx deleted file mode 100644 index fd31d75d4..000000000 --- a/Source/MySql.Data/Resources.resx +++ /dev/null @@ -1,544 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - Version string not in acceptable format - - - NamedPipeStream does not support seeking - - - The stream has already been closed - - - The buffer cannot be null - - - Buffer is not large enough - - - Offset cannot be negative - - - Count cannot be negative - - - The stream does not support reading - - - NamedPipeStream doesn't support SetLength - - - The stream does not support writing - - - Error creating socket connection - - - Socket streams do not support seeking - - - Unix sockets are not supported on Windows - - - Offset must be a valid position in buffer - - - SetLength is not a valid operation on CompressedStream - - - From index must be a valid index inside the from buffer - - - From index and length use more bytes than from contains - - - Index must be a valid position in the buffer - - - Index and length use more bytes than to has room for - - - Password must be valid and contain length characters - - - Parameter cannot have a negative value - - - Connection must be valid and open - - - There is already an open DataReader associated with this Connection which must be closed first. - - - Stored procedures are not supported on this version of MySQL - - - The connection property has not been set or is null. - - - The connection is not open. - - - Improper MySqlCommandBuilder state: adapter is null - - - Improper MySqlCommandBuilder state: adapter's SelectCommand is null - - - MySqlCommandBuilder does not support multi-table statements - - - MySqlCommandBuilder cannot operate on tables with no unique or key columns - - - Parameter cannot be null - - - Chaos isolation level is not supported - - - Parameter is invalid. - - - The connection is already open. - - - Keyword not supported. - - - Writing to the stream failed. - - - Reading from the stream has failed. - - - Packets larger than max_allowed_packet are not allowed. - - - Unable to execute stored procedure '{0}'. - - - same name are not supported. - - - Keyword does not allow null values. - - - Value has an unsupported format. - - - Procedure or function '{0}' cannot be found in database '{1}'. - - - Retrieving procedure metadata for {0} from server. - - - Retrieving procedure metadata for {0} from procedure cache. - - - Connection unexpectedly terminated. - - - An incorrect response was received from the server. - - - Canceling an active query is only supported on MySQL 5.0.0 and above. - - - Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. - - - Canceling an executing query requires MySQL 5.0 or higher. - - - Nested transactions are not supported. - - - The CommandText property has not been properly initialized. - - - There was an error parsing the foreign key definition. - - - This category includes a series of counters for MySQL - - - .NET Data Provider for MySQL - - - The number of times a procedures metadata had to be queried from the server. - - - Hard Procedure Queries - - - The number of times a procedures metadata was retrieved from the client-side cache. - - - Soft Procedure Queries - - - Parameter '{0}' is not found but a parameter with the name '{1}' is found. Parameter names must include the leading parameter marker. - - - Unable to connect to any of the specified MySQL hosts. - - - Unable to retrieve stored procedure metadata for routine '{0}'. Either grant SELECT privilege to mysql.proc for this user or use "check parameters=false" with your connection string. - - - Invalid attempt to call NextResult when the reader is closed. - - - When calling stored procedures and 'Use Procedure Bodies' is false, all parameters must have their type explicitly set. - - - error connecting: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached. - - - Parameter '{0}' has already been defined. - - - Parameter '{0}' must be defined. - - - The object is not open or has been disposed. - - - Multiple simultaneous connections or connections with different connection strings inside the same transaction are not currently supported. - - - MySQL Connector/Net does not currently support distributed transactions. - - - Fatal error encountered during command execution. - - - Fatal error encountered during data read. - - - Fatal error encountered attempting to read the resultset. - - - Routine '{0}' cannot be found. Either check the spelling or make sure you have sufficient rights to execute the routine. - - - Parameter '{0}' was not found during prepare. - - - The requested column value could not be treated as or conveted to a Guid. - - - Unable to derive stored routine parameters. The 'Parameters' information schema table is not available and access to the stored procedure body has been disabled. - - - The default connection encoding was not found. Please report this as a bug along with your connection string and system details. - - - Call to GetHostEntry failed after {0} while querying for hostname '{1}': SocketErrorCode={2}, ErrorCode={3}, NativeErrorCode={4}. - - - An error occured attempting to enumerate the user-defined functions. Do you have SELECT privileges on the mysql.func table? - - - The given value was not in a supported format. - - - The host {0} does not support SSL connections. - - - Could not find specified column in results: {0} - - - You have specified an invalid column ordinal. - - - Invalid attempt to read a prior column using SequentialAccess - - - Invalid attempt to access a field before calling Read() - - - Unable to start a second async operation while one is running. - - - INTERNAL ERROR: More than one output parameter row detected. - - - '{0}' is an illegal value for a boolean option. - - - Connector/Net no longer supports server versions prior to 5.0 - - - The requested value '{0}' is invalid for the given keyword '{1}'. - - - {0}: Connection Closed - - - {0}: Connection Opened: connection string = '{1}' - - - {0}: Query Opened: {2} - - - {0}: Resultset Opened: field(s) = {1}, affected rows = {2}, inserted id = {3} - - - {0}: Query Closed - - - {0}: Set Database: {1} - - - {0}: Usage Advisor Warning: Query is using a bad index - - - {0}: Usage Advisor Warning: Query does not use an index - - - {0}: Resultset Closed. Total rows={1}, skipped rows={2}, size (bytes)={3} - - - {0}: Usage Advisor Warning: Skipped {2} rows. Consider a more focused query. - - - {0}: Usage Advisor Warning: The following columns were not accessed: {2} - - - {0}: Usage Advisor Warning: The field '{2}' was converted to the following types: {3} - - - {0}: Error encountered attempting to open result: Number={1}, Message={2} - - - {0}: Error encountered during row fetch. Number = {1}, Message={2} - - - {0}: MySql Warning: Level={1}, Code={2}, Message={3} - - - Unable to trace. There are more than Int32.MaxValue connections in use. - - - {0}: Statement prepared: sql='{1}', statement id={2} - - - {0}: Statement closed: statement id = {1} - - - {0}: Statement executed: statement id = {1} - - - Unable to enable query analysis. Be sure the MySql.Data.EMTrace assembly is properly located and registered. - - - - keywords.txt;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 - - - {0}: Query Normalized: {2} - - - Cannot retrieve Windows identity for current user. Connections that use IntegratedSecurity cannot be pooled. Use either 'ConnectionReset=true' or 'Pooling=false' in the connection string to fix. - - - Attempt to call stored function '{0}' without specifying a return parameter - - - Parameters can only be derived for commands using the StoredProcedure command type. - - - Replicated connections allow only readonly statements. - - - File based certificates are only supported when connecting to MySQL Server 5.1 or greater. - - - Snapshot isolation level is not supported. - - - Type '{0}' is not derived from BaseExceptionInterceptor - - - Type '{0}' is not derived from BaseCommandInterceptor - - - Unknown authentication method '{0}' was requested. - - - Authentication to host '{0}' for user '{1}' using method '{2}' failed with message: {3} - - - Windows authentication connections are not supported on {0} - - - Authentication method '{0}' not supported by any of the available plugins. - - - Unable to create plugin for authentication method '{0}'. Please see inner exception for details. - - - Mixing named and unnamed parameters is not allowed. - - - Parameter index was not found in Parameter Collection. - - - Authentication with old password no longer supported, use 4.1 style passwords. - - - Microsecond must be a value between 0 and 999999. - - - Millisecond must be a value between 0 and 999. For more precision use Microsecond. - - - No available server found. - - - Attempt to connect to '{0}' server failed. - - - Unknown connection protocol - - - Unix sockets are not supported on Windows. - - - Replicated server not found: '{0}' - - - Replication group '{0}' not found. - - - The new value must be a MySqlParameter object. - - - Value '{0}' is not of the correct type. - - - Compression is not supported. - - - SSL Connection error. - - \ No newline at end of file diff --git a/Source/MySql.Data/ResourcesX.Designer.cs b/Source/MySql.Data/ResourcesX.Designer.cs deleted file mode 100644 index 66ae91cc4..000000000 --- a/Source/MySql.Data/ResourcesX.Designer.cs +++ /dev/null @@ -1,318 +0,0 @@ -//------------------------------------------------------------------------------ -// -// 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 MySql.Data { - using System; - using System.Reflection; - - - /// - /// 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.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - public class ResourcesX { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - internal ResourcesX() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - public static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { -#if NETCORE10 - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(typeof(ResourcesX)); -#else - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MySql.Data.ResourcesX", typeof(ResourcesX).Assembly); -#endif - 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)] - public static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to Appdata path is not defined.. - /// - public static string AppdataNotDefined { - get { - return ResourceManager.GetString("AppdataNotDefined", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Error parsing configuration file '{0}'.. - /// - public static string ErrorParsingConfigFile { - get { - return ResourceManager.GetString("ErrorParsingConfigFile", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Collation with id '{0}' not found.. - /// - public static string InvalidCollationId { - get { - return ResourceManager.GetString("InvalidCollationId", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Connection Data is incorrect.. - /// - public static string InvalidConnectionData { - get { - return ResourceManager.GetString("InvalidConnectionData", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The connection string is invalid.. - /// - public static string InvalidConnectionString { - get { - return ResourceManager.GetString("InvalidConnectionString", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to '{0}' is not a valid connection string attribute.. - /// - public static string InvalidConnectionStringAttribute { - get { - return ResourceManager.GetString("InvalidConnectionStringAttribute", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Decimal (BCD) format is invalid.. - /// - public static string InvalidDecimalFormat { - get { - return ResourceManager.GetString("InvalidDecimalFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} is not a valid column name in the row.. - /// - public static string InvalidNameIndex { - get { - return ResourceManager.GetString("InvalidNameIndex", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to {0} is not a valid index for the row.. - /// - public static string InvalidRowIndex { - get { - return ResourceManager.GetString("InvalidRowIndex", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid Uri . - /// - public static string InvalidUriData { - get { - return ResourceManager.GetString("InvalidUriData", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid uri query value. - /// - public static string InvalidUriQuery { - get { - return ResourceManager.GetString("InvalidUriQuery", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Json configuration must contain 'uri' or 'host' but not both.. - /// - public static string JsonUriOrHost { - get { - return ResourceManager.GetString("JsonUriOrHost", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Keyword not supported.. - /// - public static string KeywordNotSupported { - get { - return ResourceManager.GetString("KeywordNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to More than one document id was generated. Please use the DocumentIds property instead.. - /// - public static string MoreThanOneDocumentId { - get { - return ResourceManager.GetString("MoreThanOneDocumentId", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to There is no data at index {0}. - /// - public static string NoDataAtIndex { - get { - return ResourceManager.GetString("NoDataAtIndex", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No 'host' has been specified.. - /// - public static string NoHost { - get { - return ResourceManager.GetString("NoHost", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No more data in resultset.. - /// - public static string NoMoreData { - get { - return ResourceManager.GetString("NoMoreData", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Object '{0}' not found. - /// - public static string NoObjectFound { - get { - return ResourceManager.GetString("NoObjectFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to No placeholders.. - /// - public static string NoPlaceholders { - get { - return ResourceManager.GetString("NoPlaceholders", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Path not found '{0}'.. - /// - public static string PathNotFound { - get { - return ResourceManager.GetString("PathNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ProgramData path is not defined.. - /// - public static string ProgramDataNotDefined { - get { - return ResourceManager.GetString("ProgramDataNotDefined", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Removing a document from a collection requires an _id property.. - /// - public static string RemovingRequiresId { - get { - return ResourceManager.GetString("RemovingRequiresId", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The process of closing the resultset and resulted in results being lost.. - /// - public static string ThrowingAwayResults { - get { - return ResourceManager.GetString("ThrowingAwayResults", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to connect to any specified host.. - /// - public static string UnableToConnect { - get { - return ResourceManager.GetString("UnableToConnect", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to read or decode data value.. - /// - public static string UnableToDecodeDataValue { - get { - return ResourceManager.GetString("UnableToDecodeDataValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unexpected end of packet found while reading data values. - /// - public static string UnexpectedEndOfPacketFound { - get { - return ResourceManager.GetString("UnexpectedEndOfPacketFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unknown placeholder :{0}. - /// - public static string UnknownPlaceholder { - get { - return ResourceManager.GetString("UnknownPlaceholder", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Value '{0}' is not of the correct type.. - /// - public static string ValueNotCorrectType { - get { - return ResourceManager.GetString("ValueNotCorrectType", resourceCulture); - } - } - } -} diff --git a/Source/MySql.Data/ResourcesX.resx b/Source/MySql.Data/ResourcesX.resx deleted file mode 100644 index c601adcd6..000000000 --- a/Source/MySql.Data/ResourcesX.resx +++ /dev/null @@ -1,204 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - Collation with id '{0}' not found. - - - Connection Data is incorrect. - - - '{0}' is not a valid connection string attribute. - - - The connection string is invalid. - - - Decimal (BCD) format is invalid. - - - {0} is not a valid column name in the row. - - - {0} is not a valid index for the row. - - - Keyword not supported. - - - More than one document id was generated. Please use the DocumentIds property instead. - - - There is no data at index {0} - - - No more data in resultset. - - - No placeholders. - - - Path not found '{0}'. - - - Removing a document from a collection requires an _id property. - - - The process of closing the resultset and resulted in results being lost. - - - Unable to connect to any specified host. - - - Unable to read or decode data value. - - - Unexpected end of packet found while reading data values - - - Unknown placeholder :{0} - - - Value '{0}' is not of the correct type. - - - Object '{0}' not found - - - Invalid Uri - - - Invalid uri query value - - - Error parsing configuration file '{0}'. - - - Json configuration must contain 'uri' or 'host' but not both. - - - No 'host' has been specified. - - - Appdata path is not defined. - - - ProgramData path is not defined. - - \ No newline at end of file diff --git a/Source/MySql.Data/ResultSet.cs b/Source/MySql.Data/ResultSet.cs deleted file mode 100644 index a936880d4..000000000 --- a/Source/MySql.Data/ResultSet.cs +++ /dev/null @@ -1,324 +0,0 @@ -// Copyright © 2009, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Data; -using System.Diagnostics; -using MySql.Data.Types; - -namespace MySql.Data.MySqlClient -{ - internal class ResultSet - { - private Driver _driver; - private bool[] _uaFieldsUsed; - private Dictionary _fieldHashCs; - private Dictionary _fieldHashCi; - private int _rowIndex; - private bool _readDone; - private bool _isSequential; - private int _seqIndex; - private readonly int _statementId; - private bool _cached; - private List _cachedValues; - - public ResultSet(int affectedRows, long insertedId) - { - AffectedRows = affectedRows; - InsertedId = insertedId; - _readDone = true; - } - - public ResultSet(Driver d, int statementId, int numCols) - { - AffectedRows = -1; - InsertedId = -1; - _driver = d; - _statementId = statementId; - _rowIndex = -1; - LoadColumns(numCols); - IsOutputParameters = IsOutputParameterResultSet(); - HasRows = GetNextRow(); - _readDone = !HasRows; - } - -#region Properties - - public bool HasRows { get; } - - public int Size => Fields?.Length ?? 0; - - public MySqlField[] Fields { get; private set; } - - public IMySqlValue[] Values { get; private set; } - - public bool IsOutputParameters { get; set; } - - public int AffectedRows { get; private set; } - - public long InsertedId { get; private set; } - - public int TotalRows { get; private set; } - - public int SkippedRows { get; private set; } - - public bool Cached - { - get { return _cached; } - set - { - _cached = value; - if (_cached && _cachedValues == null) - _cachedValues = new List(); - } - } - -#endregion - - /// - /// return the ordinal for the given column name - /// - /// - /// - public int GetOrdinal(string name) - { - // first we try a quick hash lookup - int ordinal; - if (_fieldHashCs.TryGetValue(name, out ordinal)) - return ordinal; - - // ok that failed so we use our CI hash - if (_fieldHashCi.TryGetValue( name, out ordinal )) - return ordinal; - - // Throw an exception if the ordinal cannot be found. - throw new IndexOutOfRangeException( - String.Format(Resources.CouldNotFindColumnName, name)); - } - - /// - /// Retrieve the value as the given column index - /// - /// The column value to retrieve - /// The value as the given column - public IMySqlValue this[int index] - { - get - { - if (_rowIndex < 0) - throw new MySqlException(Resources.AttemptToAccessBeforeRead); - - // keep count of how many columns we have left to access - _uaFieldsUsed[index] = true; - - if (_isSequential && index != _seqIndex) - { - if (index < _seqIndex) - throw new MySqlException(Resources.ReadingPriorColumnUsingSeqAccess); - while (_seqIndex < (index - 1)) - _driver.SkipColumnValue(Values[++_seqIndex]); - Values[index] = _driver.ReadColumnValue(index, Fields[index], Values[index]); - _seqIndex = index; - } - - return Values[index]; - } - } - - private bool GetNextRow() - { - bool fetched = _driver.FetchDataRow(_statementId, Size); - if (fetched) - TotalRows++; - return fetched; - } - - - public bool NextRow(CommandBehavior behavior) - { - if (_readDone) - { - if (Cached) return CachedNextRow(behavior); - return false; - } - - if ((behavior & CommandBehavior.SingleRow) != 0 && _rowIndex == 0) - return false; - - _isSequential = (behavior & CommandBehavior.SequentialAccess) != 0; - _seqIndex = -1; - - // if we are at row index >= 0 then we need to fetch the data row and load it - if (_rowIndex >= 0) - { - bool fetched = false; - try - { - fetched = GetNextRow(); - } - catch (MySqlException ex) - { - if (ex.IsQueryAborted) - { - // avoid hanging on Close() - _readDone = true; - } - throw; - } - - if (!fetched) - { - _readDone = true; - return false; - } - } - - if (!_isSequential) ReadColumnData(false); - _rowIndex++; - return true; - } - - private bool CachedNextRow(CommandBehavior behavior) - { - if ((behavior & CommandBehavior.SingleRow) != 0 && _rowIndex == 0) - return false; - if (_rowIndex == (TotalRows - 1)) return false; - _rowIndex++; - Values = _cachedValues[_rowIndex]; - return true; - } - - /// - /// Closes the current resultset, dumping any data still on the wire - /// - public void Close() - { - if (!_readDone) - { - - // if we have rows but the user didn't read the first one then mark it as skipped - if (HasRows && _rowIndex == -1) - SkippedRows++; - try - { - while (_driver.IsOpen && _driver.SkipDataRow()) - { - TotalRows++; - SkippedRows++; - } - } - catch (System.IO.IOException) - { - // it is ok to eat IO exceptions here, we just want to - // close the result set - } - _readDone = true; - } - else if (_driver == null) - CacheClose(); - - _driver = null; - if (Cached) CacheReset(); - } - - private void CacheClose() - { - SkippedRows = TotalRows - _rowIndex - 1; - } - - private void CacheReset() - { - if (!Cached) return; - _rowIndex = -1; - AffectedRows = -1; - InsertedId = -1; - SkippedRows = 0; - } - - public bool FieldRead(int index) - { - Debug.Assert(Size > index); - return _uaFieldsUsed[index]; - } - - public void SetValueObject(int i, IMySqlValue valueObject) - { - Debug.Assert(Values != null); - Debug.Assert(i < Values.Length); - Values[i] = valueObject; - } - - private bool IsOutputParameterResultSet() - { - if (_driver.HasStatus(ServerStatusFlags.OutputParameters)) return true; - - if (Fields.Length == 0) return false; - - for (int x = 0; x < Fields.Length; x++) - if (!Fields[x].ColumnName.StartsWith("@" + StoredProcedure.ParameterPrefix, StringComparison.OrdinalIgnoreCase)) return false; - return true; - } - - /// - /// Loads the column metadata for the current resultset - /// - private void LoadColumns(int numCols) - { - Fields = _driver.GetColumns(numCols); - - Values = new IMySqlValue[numCols]; - _uaFieldsUsed = new bool[numCols]; - _fieldHashCs = new Dictionary(StringComparer.OrdinalIgnoreCase); - _fieldHashCi = new Dictionary(StringComparer.OrdinalIgnoreCase); - - for (int i = 0; i < Fields.Length; i++) - { - string columnName = Fields[i].ColumnName; - if (!_fieldHashCs.ContainsKey(columnName)) - _fieldHashCs.Add(columnName, i); - if (!_fieldHashCi.ContainsKey(columnName)) - _fieldHashCi.Add(columnName, i); - Values[i] = Fields[i].GetValueObject(); - } - } - - private void ReadColumnData(bool outputParms) - { - for (int i = 0; i < Size; i++) - Values[i] = _driver.ReadColumnValue(i, Fields[i], Values[i]); - - // if we are caching then we need to save a copy of this row of data values - if (Cached) - _cachedValues.Add((IMySqlValue[])Values.Clone()); - - // we don't need to worry about caching the following since you won't have output - // params with TableDirect commands - if (!outputParms) return; - - bool rowExists = _driver.FetchDataRow(_statementId, Fields.Length); - _rowIndex = 0; - if (rowExists) - throw new MySqlException(Resources.MoreThanOneOPRow); - } - } -} diff --git a/Source/MySql.Data/Runtime.cs b/Source/MySql.Data/Runtime.cs deleted file mode 100644 index 40ef50f60..000000000 --- a/Source/MySql.Data/Runtime.cs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright © 2014, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System; - -namespace MySql.Web.Security -{ - internal static class Runtime - { - private static bool inited; - private static bool isMono; - - public static bool IsMono - { - get - { - if (!inited) - Init(); - return isMono; - } - } - - private static void Init() - { - Type t = Type.GetType("Mono.Runtime"); - isMono = t != null; - inited = true; - } - } -} diff --git a/Source/MySql.Data/Schema.cs b/Source/MySql.Data/Schema.cs deleted file mode 100644 index 0946900f7..000000000 --- a/Source/MySql.Data/Schema.cs +++ /dev/null @@ -1,217 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Data; -using System.Text; - -namespace MySql.Data.MySqlClient -{ - public partial class MySqlSchemaCollection - { - private readonly List _columns = new List(); - private readonly List _rows = new List(); -#if !NETCORE10 - private readonly DataTable _table = null; -#endif - - public MySqlSchemaCollection() - { - Mapping = new Dictionary( StringComparer.OrdinalIgnoreCase ); - LogicalMappings = new Dictionary(); - } - - public MySqlSchemaCollection(string name) : this() - { - Name = name; - } - -#if !NETCORE10 - public MySqlSchemaCollection(DataTable dt) : this() - { - // cache the original datatable to avoid the overhead of creating again whenever possible. - _table = dt; - int i = 0; - foreach (DataColumn dc in dt.Columns) - { - Columns.Add(new SchemaColumn() { Name = dc.ColumnName, Type = dc.DataType }); - Mapping.Add(dc.ColumnName, i++); - LogicalMappings[Columns.Count - 1] = Columns.Count - 1; - } - - foreach (DataRow dr in dt.Rows) - { - MySqlSchemaRow row = new MySqlSchemaRow(this); - for (i = 0; i < Columns.Count; i++) - { - row[i] = dr[i]; - } - Rows.Add(row); - } - } -#endif - - internal Dictionary Mapping; - internal Dictionary LogicalMappings; - public string Name { get; set; } - public IList Columns => _columns; - public IList Rows => _rows; - - internal SchemaColumn AddColumn(string name, Type t) - { - SchemaColumn c = new SchemaColumn - { - Name = name, - Type = t - }; - - _columns.Add(c); - Mapping.Add(name, _columns.Count-1); - LogicalMappings[_columns.Count - 1] = _columns.Count - 1; - return c; - } - - internal int ColumnIndex(string name) - { - int index = -1; - for (int i = 0; i < _columns.Count; i++) - { - SchemaColumn c = _columns[i]; - if (String.Compare(c.Name, name, StringComparison.OrdinalIgnoreCase) != 0) continue; - index = i; - break; - } - return index; - } - - internal void RemoveColumn(string name) - { - int index = ColumnIndex(name); - if (index == -1) - throw new InvalidOperationException(); - _columns.RemoveAt(index); - for (int i = index; i < Columns.Count; i++) - LogicalMappings[i] = LogicalMappings[i] + 1; - } - - internal bool ContainsColumn(string name) - { - return ColumnIndex(name) >= 0; - } - - internal MySqlSchemaRow AddRow() - { - MySqlSchemaRow r = new MySqlSchemaRow(this); - _rows.Add(r); - return r; - } - - internal MySqlSchemaRow NewRow() - { - MySqlSchemaRow r = new MySqlSchemaRow(this); - return r; - } - -#if !NETCORE10 - internal DataTable AsDataTable() - { - if (_table != null) return _table; - DataTable dt = new DataTable(Name); - foreach (SchemaColumn col in Columns) - dt.Columns.Add(col.Name, col.Type); - foreach (MySqlSchemaRow row in Rows) - { - DataRow newRow = dt.NewRow(); - for (int i = 0; i < dt.Columns.Count; i++) - newRow[i] = row[i] == null ? DBNull.Value : row[i]; - dt.Rows.Add(newRow); - } - return dt; - } -#endif - } - - public class MySqlSchemaRow - { - private Dictionary _data; - - public MySqlSchemaRow(MySqlSchemaCollection c) - { - Collection = c; - InitMetadata(); - } - - internal void InitMetadata() - { - _data = new Dictionary(); - } - - internal MySqlSchemaCollection Collection { get; } - - internal object this[string s] - { - get { return GetValueForName(s); } - set { SetValueForName(s, value); } - } - - internal object this[int i] - { - get { - int idx = Collection.LogicalMappings[i]; - if (!_data.ContainsKey(idx)) - _data[idx] = null; - return _data[ idx ]; - } - set { _data[ Collection.LogicalMappings[ i ] ] = value; } - } - - private void SetValueForName(string colName, object value) - { - int index = Collection.Mapping[colName]; - this[index] = value; - } - - private object GetValueForName(string colName) - { - int index = Collection.Mapping[colName]; - if (!_data.ContainsKey(index)) - _data[index] = null; - return this[index]; - } - - internal void CopyRow(MySqlSchemaRow row) - { - if (Collection.Columns.Count != row.Collection.Columns.Count) - throw new InvalidOperationException("column count doesn't match"); - for (int i = 0; i < Collection.Columns.Count; i++) - row[i] = this[i]; - } - } - - public class SchemaColumn - { - public string Name { get; set; } - public Type Type { get; set; } - } -} diff --git a/Source/MySql.Data/SchemaProvider.cs b/Source/MySql.Data/SchemaProvider.cs deleted file mode 100644 index 439779e57..000000000 --- a/Source/MySql.Data/SchemaProvider.cs +++ /dev/null @@ -1,1057 +0,0 @@ -// Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Globalization; -using System.IO; -using System.Reflection; -using System.Text; -using System.Text.RegularExpressions; -using System.Collections.Generic; -using System.Data; -using System.Data.Common; -using MySql.Data.Common; -using MySql.Data.Types; - -namespace MySql.Data.MySqlClient -{ - internal class SchemaProvider - { - protected MySqlConnection connection; - public static string MetaCollection = "MetaDataCollections"; - - public SchemaProvider(MySqlConnection connectionToUse) - { - connection = connectionToUse; - } - - public virtual MySqlSchemaCollection GetSchema(string collection, String[] restrictions) - { - if (connection.State != ConnectionState.Open) - throw new MySqlException("GetSchema can only be called on an open connection."); - - collection = StringUtility.ToUpperInvariant(collection); - - MySqlSchemaCollection c = GetSchemaInternal(collection, restrictions); - - if (c == null) - throw new ArgumentException("Invalid collection name"); - return c; - } - - public virtual MySqlSchemaCollection GetDatabases(string[] restrictions) - { - Regex regex = null; - int caseSetting = Int32.Parse(connection.driver.Property("lower_case_table_names")); - - string sql = "SHOW DATABASES"; - - // if lower_case_table_names is zero, then case lookup should be sensitive - // so we can use LIKE to do the matching. - if (caseSetting == 0) - { - if (restrictions != null && restrictions.Length >= 1) - sql = sql + " LIKE '" + restrictions[0] + "'"; - } - - MySqlSchemaCollection c = QueryCollection("Databases", sql); - - if (caseSetting != 0 && restrictions != null && restrictions.Length >= 1 && restrictions[0] != null) - regex = new Regex(restrictions[0], RegexOptions.IgnoreCase); - - MySqlSchemaCollection c2 = new MySqlSchemaCollection("Databases"); - c2.AddColumn("CATALOG_NAME", typeof(string)); - c2.AddColumn("SCHEMA_NAME", typeof(string)); - - foreach (MySqlSchemaRow row in c.Rows) - { - if (regex != null && !regex.Match(row[0].ToString()).Success) continue; - MySqlSchemaRow newRow = c2.AddRow(); - newRow[1] = row[0]; - } - return c2; - } - - public virtual MySqlSchemaCollection GetTables(string[] restrictions) - { - MySqlSchemaCollection c = new MySqlSchemaCollection("Tables"); - c.AddColumn("TABLE_CATALOG", typeof(string)); - c.AddColumn("TABLE_SCHEMA", typeof(string)); - c.AddColumn("TABLE_NAME", typeof(string)); - c.AddColumn("TABLE_TYPE", typeof(string)); - c.AddColumn("ENGINE", typeof(string)); - c.AddColumn("VERSION", typeof(ulong)); - c.AddColumn("ROW_FORMAT", typeof(string)); - c.AddColumn("TABLE_ROWS", typeof(ulong)); - c.AddColumn("AVG_ROW_LENGTH", typeof(ulong)); - c.AddColumn("DATA_LENGTH", typeof(ulong)); - c.AddColumn("MAX_DATA_LENGTH", typeof(ulong)); - c.AddColumn("INDEX_LENGTH", typeof(ulong)); - c.AddColumn("DATA_FREE", typeof(ulong)); - c.AddColumn("AUTO_INCREMENT", typeof(ulong)); - c.AddColumn("CREATE_TIME", typeof(DateTime)); - c.AddColumn("UPDATE_TIME", typeof(DateTime)); - c.AddColumn("CHECK_TIME", typeof(DateTime)); - c.AddColumn("TABLE_COLLATION", typeof(string)); - c.AddColumn("CHECKSUM", typeof(ulong)); - c.AddColumn("CREATE_OPTIONS", typeof(string)); - c.AddColumn("TABLE_COMMENT", typeof(string)); - - // we have to new up a new restriction array here since - // GetDatabases takes the database in the first slot - string[] dbRestriction = new string[4]; - if (restrictions != null && restrictions.Length >= 2) - dbRestriction[0] = restrictions[1]; - MySqlSchemaCollection databases = GetDatabases(dbRestriction); - - if (restrictions != null) - Array.Copy(restrictions, dbRestriction, - Math.Min(dbRestriction.Length, restrictions.Length)); - - foreach (MySqlSchemaRow row in databases.Rows) - { - dbRestriction[1] = row["SCHEMA_NAME"].ToString(); - FindTables(c, dbRestriction); - } - return c; - } - - protected void QuoteDefaultValues(MySqlSchemaCollection schemaCollection) - { - if (schemaCollection == null) return; - if (!schemaCollection.ContainsColumn("COLUMN_DEFAULT")) return; - - foreach (MySqlSchemaRow row in schemaCollection.Rows) - { - object defaultValue = row["COLUMN_DEFAULT"]; - if (MetaData.IsTextType(row["DATA_TYPE"].ToString())) - row["COLUMN_DEFAULT"] = String.Format("{0}", defaultValue); - } - } - - public virtual MySqlSchemaCollection GetColumns(string[] restrictions) - { - MySqlSchemaCollection c = new MySqlSchemaCollection("Columns"); - c.AddColumn("TABLE_CATALOG", typeof(string)); - c.AddColumn("TABLE_SCHEMA", typeof(string)); - c.AddColumn("TABLE_NAME", typeof(string)); - c.AddColumn("COLUMN_NAME", typeof(string)); - c.AddColumn("ORDINAL_POSITION", typeof(ulong)); - c.AddColumn("COLUMN_DEFAULT", typeof(string)); - c.AddColumn("IS_NULLABLE", typeof(string)); - c.AddColumn("DATA_TYPE", typeof(string)); - c.AddColumn("CHARACTER_MAXIMUM_LENGTH", typeof(ulong)); - c.AddColumn("CHARACTER_OCTET_LENGTH", typeof(ulong)); - c.AddColumn("NUMERIC_PRECISION", typeof(ulong)); - c.AddColumn("NUMERIC_SCALE", typeof(ulong)); - c.AddColumn("CHARACTER_SET_NAME", typeof(string)); - c.AddColumn("COLLATION_NAME", typeof(string)); - c.AddColumn("COLUMN_TYPE", typeof(string)); - c.AddColumn("COLUMN_KEY", typeof(string)); - c.AddColumn("EXTRA", typeof(string)); - c.AddColumn("PRIVILEGES", typeof(string)); - c.AddColumn("COLUMN_COMMENT", typeof(string)); - c.AddColumn("GENERATION_EXPRESSION", typeof(string)); - - // we don't allow restricting on table type here - string columnName = null; - if (restrictions != null && restrictions.Length == 4) - { - columnName = restrictions[3]; - restrictions[3] = null; - } - MySqlSchemaCollection tables = GetTables(restrictions); - - foreach (MySqlSchemaRow row in tables.Rows) - LoadTableColumns(c, row["TABLE_SCHEMA"].ToString(), - row["TABLE_NAME"].ToString(), columnName); - - QuoteDefaultValues(c); - return c; - } - - private void LoadTableColumns(MySqlSchemaCollection schemaCollection, string schema, - string tableName, string columnRestriction) - { - string sql = String.Format("SHOW FULL COLUMNS FROM `{0}`.`{1}`", - schema, tableName); - MySqlCommand cmd = new MySqlCommand(sql, connection); - - int pos = 1; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - while (reader.Read()) - { - string colName = reader.GetString(0); - if (columnRestriction != null && colName != columnRestriction) - continue; - MySqlSchemaRow row = schemaCollection.AddRow(); - row["TABLE_CATALOG"] = DBNull.Value; - row["TABLE_SCHEMA"] = schema; - row["TABLE_NAME"] = tableName; - row["COLUMN_NAME"] = colName; - row["ORDINAL_POSITION"] = pos++; - row["COLUMN_DEFAULT"] = reader.GetValue(5); - row["IS_NULLABLE"] = reader.GetString(3); - row["DATA_TYPE"] = reader.GetString(1); - row["CHARACTER_MAXIMUM_LENGTH"] = DBNull.Value; - row["CHARACTER_OCTET_LENGTH"] = DBNull.Value; - row["NUMERIC_PRECISION"] = DBNull.Value; - row["NUMERIC_SCALE"] = DBNull.Value; - row["CHARACTER_SET_NAME"] = reader.GetValue(2); - row["COLLATION_NAME"] = row["CHARACTER_SET_NAME"]; - row["COLUMN_TYPE"] = reader.GetString(1); - row["COLUMN_KEY"] = reader.GetString(4); - row["EXTRA"] = reader.GetString(6); - row["PRIVILEGES"] = reader.GetString(7); - row["COLUMN_COMMENT"] = reader.GetString(8); - row["GENERATION_EXPRESION"] = reader.GetString(6).Contains("VIRTUAL") ? reader.GetString(9) : string.Empty; - ParseColumnRow(row); - } - } - } - - private static void ParseColumnRow(MySqlSchemaRow row) - { - // first parse the character set name - string charset = row["CHARACTER_SET_NAME"].ToString(); - int index = charset.IndexOf('_'); - if (index != -1) - row["CHARACTER_SET_NAME"] = charset.Substring(0, index); - - // now parse the data type - string dataType = row["DATA_TYPE"].ToString(); - index = dataType.IndexOf('('); - if (index == -1) - return; - row["DATA_TYPE"] = dataType.Substring(0, index); - int stop = dataType.IndexOf(')', index); - string dataLen = dataType.Substring(index + 1, stop - (index + 1)); - string lowerType = row["DATA_TYPE"].ToString().ToLower(); - if (lowerType == "char" || lowerType == "varchar") - row["CHARACTER_MAXIMUM_LENGTH"] = dataLen; - else if (lowerType == "real" || lowerType == "decimal") - { - string[] lenparts = dataLen.Split(new char[] { ',' }); - row["NUMERIC_PRECISION"] = lenparts[0]; - if (lenparts.Length == 2) - row["NUMERIC_SCALE"] = lenparts[1]; - } - } - - public virtual MySqlSchemaCollection GetIndexes(string[] restrictions) - { - MySqlSchemaCollection dt = new MySqlSchemaCollection("Indexes"); - dt.AddColumn("INDEX_CATALOG", typeof(string)); - dt.AddColumn("INDEX_SCHEMA", typeof(string)); - dt.AddColumn("INDEX_NAME", typeof(string)); - dt.AddColumn("TABLE_NAME", typeof(string)); - dt.AddColumn("UNIQUE", typeof(bool)); - dt.AddColumn("PRIMARY", typeof(bool)); - dt.AddColumn("TYPE", typeof(string)); - dt.AddColumn("COMMENT", typeof(string)); - - // Get the list of tables first - int max = restrictions?.Length ?? 4; - string[] tableRestrictions = new string[Math.Max(max, 4)]; - restrictions?.CopyTo(tableRestrictions, 0); - tableRestrictions[3] = "BASE TABLE"; - MySqlSchemaCollection tables = GetTables(tableRestrictions); - - foreach (MySqlSchemaRow table in tables.Rows) - { - string sql = String.Format("SHOW INDEX FROM `{0}`.`{1}`", - MySqlHelper.DoubleQuoteString((string)table["TABLE_SCHEMA"]), - MySqlHelper.DoubleQuoteString((string)table["TABLE_NAME"])); - MySqlSchemaCollection indexes = QueryCollection("indexes", sql); - - foreach (MySqlSchemaRow index in indexes.Rows) - { - long seq_index = (long)index["SEQ_IN_INDEX"]; - if (seq_index != 1) continue; - if (restrictions != null && restrictions.Length == 4 && - restrictions[3] != null && - !index["KEY_NAME"].Equals(restrictions[3])) continue; - MySqlSchemaRow row = dt.AddRow(); - row["INDEX_CATALOG"] = null; - row["INDEX_SCHEMA"] = table["TABLE_SCHEMA"]; - row["INDEX_NAME"] = index["KEY_NAME"]; - row["TABLE_NAME"] = index["TABLE"]; - row["UNIQUE"] = (long)index["NON_UNIQUE"] == 0; - row["PRIMARY"] = index["KEY_NAME"].Equals("PRIMARY"); - row["TYPE"] = index["INDEX_TYPE"]; - row["COMMENT"] = index["COMMENT"]; - } - } - - return dt; - } - - public virtual MySqlSchemaCollection GetIndexColumns(string[] restrictions) - { - MySqlSchemaCollection dt = new MySqlSchemaCollection("IndexColumns"); - dt.AddColumn("INDEX_CATALOG", typeof(string)); - dt.AddColumn("INDEX_SCHEMA", typeof(string)); - dt.AddColumn("INDEX_NAME", typeof(string)); - dt.AddColumn("TABLE_NAME", typeof(string)); - dt.AddColumn("COLUMN_NAME", typeof(string)); - dt.AddColumn("ORDINAL_POSITION", typeof(int)); - dt.AddColumn("SORT_ORDER", typeof(string)); - - int max = restrictions == null ? 4 : restrictions.Length; - string[] tableRestrictions = new string[Math.Max(max, 4)]; - if (restrictions != null) - restrictions.CopyTo(tableRestrictions, 0); - tableRestrictions[3] = "BASE TABLE"; - MySqlSchemaCollection tables = GetTables(tableRestrictions); - - foreach (MySqlSchemaRow table in tables.Rows) - { - string sql = String.Format("SHOW INDEX FROM `{0}`.`{1}`", - table["TABLE_SCHEMA"], table["TABLE_NAME"]); - MySqlCommand cmd = new MySqlCommand(sql, connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - while (reader.Read()) - { - string key_name = GetString(reader, reader.GetOrdinal("KEY_NAME")); - string col_name = GetString(reader, reader.GetOrdinal("COLUMN_NAME")); - - if (restrictions != null) - { - if (restrictions.Length >= 4 && restrictions[3] != null && - key_name != restrictions[3]) continue; - if (restrictions.Length >= 5 && restrictions[4] != null && - col_name != restrictions[4]) continue; - } - MySqlSchemaRow row = dt.AddRow(); - row["INDEX_CATALOG"] = null; - row["INDEX_SCHEMA"] = table["TABLE_SCHEMA"]; - row["INDEX_NAME"] = key_name; - row["TABLE_NAME"] = GetString(reader, reader.GetOrdinal("TABLE")); - row["COLUMN_NAME"] = col_name; - row["ORDINAL_POSITION"] = reader.GetValue(reader.GetOrdinal("SEQ_IN_INDEX")); - row["SORT_ORDER"] = reader.GetString("COLLATION"); - } - } - } - - return dt; - } - - public virtual MySqlSchemaCollection GetForeignKeys(string[] restrictions) - { - MySqlSchemaCollection dt = new MySqlSchemaCollection("Foreign Keys"); - dt.AddColumn("CONSTRAINT_CATALOG", typeof(string)); - dt.AddColumn("CONSTRAINT_SCHEMA", typeof(string)); - dt.AddColumn("CONSTRAINT_NAME", typeof(string)); - dt.AddColumn("TABLE_CATALOG", typeof(string)); - dt.AddColumn("TABLE_SCHEMA", typeof(string)); - dt.AddColumn("TABLE_NAME", typeof(string)); - dt.AddColumn("MATCH_OPTION", typeof(string)); - dt.AddColumn("UPDATE_RULE", typeof(string)); - dt.AddColumn("DELETE_RULE", typeof(string)); - dt.AddColumn("REFERENCED_TABLE_CATALOG", typeof(string)); - dt.AddColumn("REFERENCED_TABLE_SCHEMA", typeof(string)); - dt.AddColumn("REFERENCED_TABLE_NAME", typeof(string)); - - // first we use our restrictions to get a list of tables that should be - // consulted. We save the keyname restriction since GetTables doesn't - // understand that. - string keyName = null; - if (restrictions != null && restrictions.Length >= 4) - { - keyName = restrictions[3]; - restrictions[3] = null; - } - - MySqlSchemaCollection tables = GetTables(restrictions); - - // now for each table retrieved, we call our helper function to - // parse it's foreign keys - foreach (MySqlSchemaRow table in tables.Rows) - GetForeignKeysOnTable(dt, table, keyName, false); - - return dt; - } - - public virtual MySqlSchemaCollection GetForeignKeyColumns(string[] restrictions) - { - MySqlSchemaCollection dt = new MySqlSchemaCollection("Foreign Keys"); - dt.AddColumn("CONSTRAINT_CATALOG", typeof(string)); - dt.AddColumn("CONSTRAINT_SCHEMA", typeof(string)); - dt.AddColumn("CONSTRAINT_NAME", typeof(string)); - dt.AddColumn("TABLE_CATALOG", typeof(string)); - dt.AddColumn("TABLE_SCHEMA", typeof(string)); - dt.AddColumn("TABLE_NAME", typeof(string)); - dt.AddColumn("COLUMN_NAME", typeof(string)); - dt.AddColumn("ORDINAL_POSITION", typeof(int)); - dt.AddColumn("REFERENCED_TABLE_CATALOG", typeof(string)); - dt.AddColumn("REFERENCED_TABLE_SCHEMA", typeof(string)); - dt.AddColumn("REFERENCED_TABLE_NAME", typeof(string)); - dt.AddColumn("REFERENCED_COLUMN_NAME", typeof(string)); - - // first we use our restrictions to get a list of tables that should be - // consulted. We save the keyname restriction since GetTables doesn't - // understand that. - string keyName = null; - if (restrictions != null && restrictions.Length >= 4) - { - keyName = restrictions[3]; - restrictions[3] = null; - } - - MySqlSchemaCollection tables = GetTables(restrictions); - - // now for each table retrieved, we call our helper function to - // parse it's foreign keys - foreach (MySqlSchemaRow table in tables.Rows) - GetForeignKeysOnTable(dt, table, keyName, true); - return dt; - } - - - private string GetSqlMode() - { - MySqlCommand cmd = new MySqlCommand("SELECT @@SQL_MODE", connection); - return cmd.ExecuteScalar().ToString(); - } - - #region Foreign Key routines - - /// - /// GetForeignKeysOnTable retrieves the foreign keys on the given table. - /// Since MySQL supports foreign keys on versions prior to 5.0, we can't use - /// information schema. MySQL also does not include any type of SHOW command - /// for foreign keys so we have to resort to use SHOW CREATE TABLE and parsing - /// the output. - /// - /// The table to store the key info in. - /// The table to get the foeign key info for. - /// Only get foreign keys that match this name. - /// Should column information be included in the table. - private void GetForeignKeysOnTable(MySqlSchemaCollection fkTable, MySqlSchemaRow tableToParse, - string filterName, bool includeColumns) - { - string sqlMode = GetSqlMode(); - - if (filterName != null) - filterName = StringUtility.ToLowerInvariant(filterName); - - string sql = string.Format("SHOW CREATE TABLE `{0}`.`{1}`", - tableToParse["TABLE_SCHEMA"], tableToParse["TABLE_NAME"]); - string lowerBody = null, body = null; - MySqlCommand cmd = new MySqlCommand(sql, connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - body = reader.GetString(1); - lowerBody = StringUtility.ToLowerInvariant(body); - } - - MySqlTokenizer tokenizer = new MySqlTokenizer(lowerBody); - tokenizer.AnsiQuotes = sqlMode.IndexOf("ANSI_QUOTES") != -1; - tokenizer.BackslashEscapes = sqlMode.IndexOf("NO_BACKSLASH_ESCAPES") != -1; - - while (true) - { - string token = tokenizer.NextToken(); - // look for a starting contraint - while (token != null && (token != "constraint" || tokenizer.Quoted)) - token = tokenizer.NextToken(); - if (token == null) break; - - ParseConstraint(fkTable, tableToParse, tokenizer, includeColumns); - } - } - - private static void ParseConstraint(MySqlSchemaCollection fkTable, MySqlSchemaRow table, - MySqlTokenizer tokenizer, bool includeColumns) - { - string name = tokenizer.NextToken(); - MySqlSchemaRow row = fkTable.AddRow(); - - // make sure this constraint is a FK - string token = tokenizer.NextToken(); - if (token != "foreign" || tokenizer.Quoted) - return; - tokenizer.NextToken(); // read off the 'KEY' symbol - tokenizer.NextToken(); // read off the '(' symbol - - row["CONSTRAINT_CATALOG"] = table["TABLE_CATALOG"]; - row["CONSTRAINT_SCHEMA"] = table["TABLE_SCHEMA"]; - row["TABLE_CATALOG"] = table["TABLE_CATALOG"]; - row["TABLE_SCHEMA"] = table["TABLE_SCHEMA"]; - row["TABLE_NAME"] = table["TABLE_NAME"]; - row["REFERENCED_TABLE_CATALOG"] = null; - row["CONSTRAINT_NAME"] = name.Trim(new char[] { '\'', '`' }); - - List srcColumns = includeColumns ? ParseColumns(tokenizer) : null; - - // now look for the references section - while (token != "references" || tokenizer.Quoted) - token = tokenizer.NextToken(); - string target1 = tokenizer.NextToken(); - string target2 = tokenizer.NextToken(); - if (target2.StartsWith(".", StringComparison.Ordinal)) - { - row["REFERENCED_TABLE_SCHEMA"] = target1; - row["REFERENCED_TABLE_NAME"] = target2.Substring(1).Trim(new char[] { '\'', '`' }); - tokenizer.NextToken(); // read off the '(' - } - else - { - row["REFERENCED_TABLE_SCHEMA"] = table["TABLE_SCHEMA"]; - row["REFERENCED_TABLE_NAME"] = target1.Substring(1).Trim(new char[] { '\'', '`' }); ; - } - - // if we are supposed to include columns, read the target columns - List targetColumns = includeColumns ? ParseColumns(tokenizer) : null; - - if (includeColumns) - ProcessColumns(fkTable, row, srcColumns, targetColumns); - else - fkTable.Rows.Add(row); - } - - private static List ParseColumns(MySqlTokenizer tokenizer) - { - List sc = new List(); - string token = tokenizer.NextToken(); - while (token != ")") - { - if (token != ",") - sc.Add(token); - token = tokenizer.NextToken(); - } - return sc; - } - - private static void ProcessColumns(MySqlSchemaCollection fkTable, MySqlSchemaRow row, List srcColumns, List targetColumns) - { - for (int i = 0; i < srcColumns.Count; i++) - { - MySqlSchemaRow newRow = fkTable.AddRow(); - row.CopyRow(newRow); - newRow["COLUMN_NAME"] = srcColumns[i]; - newRow["ORDINAL_POSITION"] = i; - newRow["REFERENCED_COLUMN_NAME"] = targetColumns[i]; - fkTable.Rows.Add(newRow); - } - } - - #endregion - - public virtual MySqlSchemaCollection GetUsers(string[] restrictions) - { - StringBuilder sb = new StringBuilder("SELECT Host, User FROM mysql.user"); - if (restrictions != null && restrictions.Length > 0) - sb.AppendFormat(CultureInfo.InvariantCulture, " WHERE User LIKE '{0}'", restrictions[0]); - - MySqlSchemaCollection c = QueryCollection("Users", sb.ToString()); - c.Columns[0].Name = "HOST"; - c.Columns[1].Name = "USERNAME"; - - return c; - } - - public virtual MySqlSchemaCollection GetProcedures(string[] restrictions) - { - MySqlSchemaCollection dt = new MySqlSchemaCollection("Procedures"); - dt.AddColumn("SPECIFIC_NAME", typeof(string)); - dt.AddColumn("ROUTINE_CATALOG", typeof(string)); - dt.AddColumn("ROUTINE_SCHEMA", typeof(string)); - dt.AddColumn("ROUTINE_NAME", typeof(string)); - dt.AddColumn("ROUTINE_TYPE", typeof(string)); - dt.AddColumn("DTD_IDENTIFIER", typeof(string)); - dt.AddColumn("ROUTINE_BODY", typeof(string)); - dt.AddColumn("ROUTINE_DEFINITION", typeof(string)); - dt.AddColumn("EXTERNAL_NAME", typeof(string)); - dt.AddColumn("EXTERNAL_LANGUAGE", typeof(string)); - dt.AddColumn("PARAMETER_STYLE", typeof(string)); - dt.AddColumn("IS_DETERMINISTIC", typeof(string)); - dt.AddColumn("SQL_DATA_ACCESS", typeof(string)); - dt.AddColumn("SQL_PATH", typeof(string)); - dt.AddColumn("SECURITY_TYPE", typeof(string)); - dt.AddColumn("CREATED", typeof(DateTime)); - dt.AddColumn("LAST_ALTERED", typeof(DateTime)); - dt.AddColumn("SQL_MODE", typeof(string)); - dt.AddColumn("ROUTINE_COMMENT", typeof(string)); - dt.AddColumn("DEFINER", typeof(string)); - - StringBuilder sql = new StringBuilder("SELECT * FROM mysql.proc WHERE 1=1"); - if (restrictions != null) - { - if (restrictions.Length >= 2 && restrictions[1] != null) - sql.AppendFormat(CultureInfo.InvariantCulture, - " AND db LIKE '{0}'", restrictions[1]); - if (restrictions.Length >= 3 && restrictions[2] != null) - sql.AppendFormat(CultureInfo.InvariantCulture, - " AND name LIKE '{0}'", restrictions[2]); - if (restrictions.Length >= 4 && restrictions[3] != null) - sql.AppendFormat(CultureInfo.InvariantCulture, - " AND type LIKE '{0}'", restrictions[3]); - } - - MySqlCommand cmd = new MySqlCommand(sql.ToString(), connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - while (reader.Read()) - { - MySqlSchemaRow row = dt.AddRow(); - row["SPECIFIC_NAME"] = reader.GetString("specific_name"); - row["ROUTINE_CATALOG"] = DBNull.Value; - row["ROUTINE_SCHEMA"] = reader.GetString("db"); - row["ROUTINE_NAME"] = reader.GetString("name"); - string routineType = reader.GetString("type"); - row["ROUTINE_TYPE"] = routineType; - row["DTD_IDENTIFIER"] = StringUtility.ToLowerInvariant(routineType) == "function" ? - (object)reader.GetString("returns") : DBNull.Value; - row["ROUTINE_BODY"] = "SQL"; - row["ROUTINE_DEFINITION"] = reader.GetString("body"); - row["EXTERNAL_NAME"] = DBNull.Value; - row["EXTERNAL_LANGUAGE"] = DBNull.Value; - row["PARAMETER_STYLE"] = "SQL"; - row["IS_DETERMINISTIC"] = reader.GetString("is_deterministic"); - row["SQL_DATA_ACCESS"] = reader.GetString("sql_data_access"); - row["SQL_PATH"] = DBNull.Value; - row["SECURITY_TYPE"] = reader.GetString("security_type"); - row["CREATED"] = reader.GetDateTime("created"); - row["LAST_ALTERED"] = reader.GetDateTime("modified"); - row["SQL_MODE"] = reader.GetString("sql_mode"); - row["ROUTINE_COMMENT"] = reader.GetString("comment"); - row["DEFINER"] = reader.GetString("definer"); - } - } - - return dt; - } - - protected virtual MySqlSchemaCollection GetCollections() - { - object[][] collections = { - new object[] {"MetaDataCollections", 0, 0}, - new object[] {"DataSourceInformation", 0, 0}, - new object[] {"DataTypes", 0, 0}, - new object[] {"Restrictions", 0, 0}, - new object[] {"ReservedWords", 0, 0}, - new object[] {"Databases", 1, 1}, - new object[] {"Tables", 4, 2}, - new object[] {"Columns", 4, 4}, - new object[] {"Users", 1, 1}, - new object[] {"Foreign Keys", 4, 3}, - new object[] {"IndexColumns", 5, 4}, - new object[] {"Indexes", 4, 3}, - new object[] {"Foreign Key Columns", 4, 3}, - new object[] {"UDF", 1, 1} - }; - - MySqlSchemaCollection dt = new MySqlSchemaCollection("MetaDataCollections"); - dt.AddColumn("CollectionName", typeof(string)); - dt.AddColumn("NumberOfRestrictions", typeof(int)); - dt.AddColumn("NumberOfIdentifierParts", typeof(int)); - - FillTable(dt, collections); - - return dt; - } - - private MySqlSchemaCollection GetDataSourceInformation() - { -#if RT - throw new NotSupportedException(); -#else - MySqlSchemaCollection dt = new MySqlSchemaCollection("DataSourceInformation"); - dt.AddColumn("CompositeIdentifierSeparatorPattern", typeof(string)); - dt.AddColumn("DataSourceProductName", typeof(string)); - dt.AddColumn("DataSourceProductVersion", typeof(string)); - dt.AddColumn("DataSourceProductVersionNormalized", typeof(string)); -#if !NETCORE10 - dt.AddColumn("GroupByBehavior", typeof(GroupByBehavior)); -#endif - dt.AddColumn("IdentifierPattern", typeof(string)); -#if !NETCORE10 - dt.AddColumn("IdentifierCase", typeof(IdentifierCase)); -#endif - dt.AddColumn("OrderByColumnsInSelect", typeof(bool)); - dt.AddColumn("ParameterMarkerFormat", typeof(string)); - dt.AddColumn("ParameterMarkerPattern", typeof(string)); - dt.AddColumn("ParameterNameMaxLength", typeof(int)); - dt.AddColumn("ParameterNamePattern", typeof(string)); - dt.AddColumn("QuotedIdentifierPattern", typeof(string)); -#if !NETCORE10 - dt.AddColumn("QuotedIdentifierCase", typeof(IdentifierCase)); -#endif - dt.AddColumn("StatementSeparatorPattern", typeof(string)); - dt.AddColumn("StringLiteralPattern", typeof(string)); -#if !NETCORE10 - dt.AddColumn("SupportedJoinOperators", typeof(SupportedJoinOperators)); -#endif - - DBVersion v = connection.driver.Version; - string ver = $"{v.Major:0}.{v.Minor:0}.{v.Build:0}"; - - MySqlSchemaRow row = dt.AddRow(); - row["CompositeIdentifierSeparatorPattern"] = "\\."; - row["DataSourceProductName"] = "MySQL"; - row["DataSourceProductVersion"] = connection.ServerVersion; - row["DataSourceProductVersionNormalized"] = ver; -#if !NETCORE10 - row["GroupByBehavior"] = GroupByBehavior.Unrelated; -#endif - row["IdentifierPattern"] = - @"(^\`\p{Lo}\p{Lu}\p{Ll}_@#][\p{Lo}\p{Lu}\p{Ll}\p{Nd}@$#_]*$)|(^\`[^\`\0]|\`\`+\`$)|(^\"" + [^\""\0]|\""\""+\""$)"; -#if !NETCORE10 - row["IdentifierCase"] = IdentifierCase.Insensitive; -#endif - row["OrderByColumnsInSelect"] = false; - row["ParameterMarkerFormat"] = "{0}"; - row["ParameterMarkerPattern"] = "(@[A-Za-z0-9_$#]*)"; - row["ParameterNameMaxLength"] = 128; - row["ParameterNamePattern"] = - @"^[\p{Lo}\p{Lu}\p{Ll}\p{Lm}_@#][\p{Lo}\p{Lu}\p{Ll}\p{Lm}\p{Nd}\uff3f_@#\$]*(?=\s+|$)"; - row["QuotedIdentifierPattern"] = @"(([^\`]|\`\`)*)"; -#if !NETCORE10 - row["QuotedIdentifierCase"] = IdentifierCase.Sensitive; -#endif - row["StatementSeparatorPattern"] = ";"; - row["StringLiteralPattern"] = "'(([^']|'')*)'"; -#if !NETCORE10 - row["SupportedJoinOperators"] = 15; -#endif - dt.Rows.Add(row); - - return dt; -#endif - } - - private static MySqlSchemaCollection GetDataTypes() - { - MySqlSchemaCollection dt = new MySqlSchemaCollection("DataTypes"); - dt.AddColumn("TypeName", typeof(string)); - dt.AddColumn("ProviderDbType", typeof(int)); - dt.AddColumn("ColumnSize", typeof(long)); - dt.AddColumn("CreateFormat", typeof(string)); - dt.AddColumn("CreateParameters", typeof(string)); - dt.AddColumn("DataType", typeof(string)); - dt.AddColumn("IsAutoincrementable", typeof(bool)); - dt.AddColumn("IsBestMatch", typeof(bool)); - dt.AddColumn("IsCaseSensitive", typeof(bool)); - dt.AddColumn("IsFixedLength", typeof(bool)); - dt.AddColumn("IsFixedPrecisionScale", typeof(bool)); - dt.AddColumn("IsLong", typeof(bool)); - dt.AddColumn("IsNullable", typeof(bool)); - dt.AddColumn("IsSearchable", typeof(bool)); - dt.AddColumn("IsSearchableWithLike", typeof(bool)); - dt.AddColumn("IsUnsigned", typeof(bool)); - dt.AddColumn("MaximumScale", typeof(short)); - dt.AddColumn("MinimumScale", typeof(short)); - dt.AddColumn("IsConcurrencyType", typeof(bool)); - dt.AddColumn("IsLiteralSupported", typeof(bool)); - dt.AddColumn("LiteralPrefix", typeof(string)); - dt.AddColumn("LiteralSuffix", typeof(string)); - dt.AddColumn("NativeDataType", typeof(string)); - - // have each one of the types contribute to the datatypes collection - MySqlBit.SetDSInfo(dt); - MySqlBinary.SetDSInfo(dt); - MySqlDateTime.SetDSInfo(dt); - MySqlTimeSpan.SetDSInfo(dt); - MySqlString.SetDSInfo(dt); - MySqlDouble.SetDSInfo(dt); - MySqlSingle.SetDSInfo(dt); - MySqlByte.SetDSInfo(dt); - MySqlInt16.SetDSInfo(dt); - MySqlInt32.SetDSInfo(dt); - MySqlInt64.SetDSInfo(dt); - MySqlDecimal.SetDSInfo(dt); - MySqlUByte.SetDSInfo(dt); - MySqlUInt16.SetDSInfo(dt); - MySqlUInt32.SetDSInfo(dt); - MySqlUInt64.SetDSInfo(dt); - - return dt; - } - - protected virtual MySqlSchemaCollection GetRestrictions() - { - object[][] restrictions = { - new object[] {"Users", "Name", "", 0}, - new object[] {"Databases", "Name", "", 0}, - new object[] {"Tables", "Database", "", 0}, - new object[] {"Tables", "Schema", "", 1}, - new object[] {"Tables", "Table", "", 2}, - new object[] {"Tables", "TableType", "", 3}, - new object[] {"Columns", "Database", "", 0}, - new object[] {"Columns", "Schema", "", 1}, - new object[] {"Columns", "Table", "", 2}, - new object[] {"Columns", "Column", "", 3}, - new object[] {"Indexes", "Database", "", 0}, - new object[] {"Indexes", "Schema", "", 1}, - new object[] {"Indexes", "Table", "", 2}, - new object[] {"Indexes", "Name", "", 3}, - new object[] {"IndexColumns", "Database", "", 0}, - new object[] {"IndexColumns", "Schema", "", 1}, - new object[] {"IndexColumns", "Table", "", 2}, - new object[] {"IndexColumns", "ConstraintName", "", 3}, - new object[] {"IndexColumns", "Column", "", 4}, - new object[] {"Foreign Keys", "Database", "", 0}, - new object[] {"Foreign Keys", "Schema", "", 1}, - new object[] {"Foreign Keys", "Table", "", 2}, - new object[] {"Foreign Keys", "Constraint Name", "", 3}, - new object[] {"Foreign Key Columns", "Catalog", "", 0}, - new object[] {"Foreign Key Columns", "Schema", "", 1}, - new object[] {"Foreign Key Columns", "Table", "", 2}, - new object[] {"Foreign Key Columns", "Constraint Name", "", 3}, - new object[] {"UDF", "Name", "", 0} - }; - - MySqlSchemaCollection dt = new MySqlSchemaCollection("Restrictions"); - dt.AddColumn("CollectionName", typeof(string)); - dt.AddColumn("RestrictionName", typeof(string)); - dt.AddColumn("RestrictionDefault", typeof(string)); - dt.AddColumn("RestrictionNumber", typeof(int)); - - FillTable(dt, restrictions); - - return dt; - } - - private static MySqlSchemaCollection GetReservedWords() - { - MySqlSchemaCollection dt = new MySqlSchemaCollection("ReservedWords"); -#if !NETCORE10 - dt.AddColumn(DbMetaDataColumnNames.ReservedWord, typeof(string)); - Stream str = Assembly.GetExecutingAssembly().GetManifestResourceStream( - "MySql.Data.Properties.ReservedWords.txt"); -#else - dt.AddColumn("ReservedWord", typeof(string)); - Stream str = typeof(SchemaProvider).GetTypeInfo().Assembly.GetManifestResourceStream("MySql.Data.Properties.ReservedWords.txt"); -#endif - - StreamReader sr = new StreamReader(str); - string line = sr.ReadLine(); - while (line != null) - { - MySqlSchemaRow row = dt.AddRow(); - row[0] = line; - line = sr.ReadLine(); - } - sr.Dispose(); - - return dt; - } - - protected static void FillTable(MySqlSchemaCollection dt, object[][] data) - { - foreach (object[] dataItem in data) - { - MySqlSchemaRow row = dt.AddRow(); - for (int i = 0; i < dataItem.Length; i++) - row[i] = dataItem[i]; - } - } - - private void FindTables(MySqlSchemaCollection schema, string[] restrictions) - { - StringBuilder sql = new StringBuilder(); - StringBuilder where = new StringBuilder(); - sql.AppendFormat(CultureInfo.InvariantCulture, - "SHOW TABLE STATUS FROM `{0}`", restrictions[1]); - if (restrictions != null && restrictions.Length >= 3 && - restrictions[2] != null) - where.AppendFormat(CultureInfo.InvariantCulture, - " LIKE '{0}'", restrictions[2]); - sql.Append(where.ToString()); - - string table_type = restrictions[1].ToLower() == "information_schema" - ? - "SYSTEM VIEW" - : "BASE TABLE"; - - MySqlCommand cmd = new MySqlCommand(sql.ToString(), connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - while (reader.Read()) - { - MySqlSchemaRow row = schema.AddRow(); - row["TABLE_CATALOG"] = null; - row["TABLE_SCHEMA"] = restrictions[1]; - row["TABLE_NAME"] = reader.GetString(0); - row["TABLE_TYPE"] = table_type; - row["ENGINE"] = GetString(reader, 1); - row["VERSION"] = reader.GetValue(2); - row["ROW_FORMAT"] = GetString(reader, 3); - row["TABLE_ROWS"] = reader.GetValue(4); - row["AVG_ROW_LENGTH"] = reader.GetValue(5); - row["DATA_LENGTH"] = reader.GetValue(6); - row["MAX_DATA_LENGTH"] = reader.GetValue(7); - row["INDEX_LENGTH"] = reader.GetValue(8); - row["DATA_FREE"] = reader.GetValue(9); - row["AUTO_INCREMENT"] = reader.GetValue(10); - row["CREATE_TIME"] = reader.GetValue(11); - row["UPDATE_TIME"] = reader.GetValue(12); - row["CHECK_TIME"] = reader.GetValue(13); - row["TABLE_COLLATION"] = GetString(reader, 14); - row["CHECKSUM"] = reader.GetValue(15); - row["CREATE_OPTIONS"] = GetString(reader, 16); - row["TABLE_COMMENT"] = GetString(reader, 17); - } - } - } - - private static string GetString(MySqlDataReader reader, int index) - { - if (reader.IsDBNull(index)) - return null; - return reader.GetString(index); - } - - public virtual MySqlSchemaCollection GetUDF(string[] restrictions) - { - string sql = "SELECT name,ret,dl FROM mysql.func"; - if (restrictions?.Length >= 1 && !String.IsNullOrEmpty(restrictions[0])) - sql += $" WHERE name LIKE '{restrictions[0]}'"; - - MySqlSchemaCollection dt = new MySqlSchemaCollection("User-defined Functions"); - dt.AddColumn("NAME", typeof(string)); - dt.AddColumn("RETURN_TYPE", typeof(int)); - dt.AddColumn("LIBRARY_NAME", typeof(string)); - - MySqlCommand cmd = new MySqlCommand(sql, connection); - try - { - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - while (reader.Read()) - { - MySqlSchemaRow row = dt.AddRow(); - row[0] = reader.GetString(0); - row[1] = reader.GetInt32(1); - row[2] = reader.GetString(2); - } - } - } - catch (MySqlException ex) - { - if (ex.Number != (int)MySqlErrorCode.TableAccessDenied) - throw; - throw new MySqlException(Resources.UnableToEnumerateUDF, ex); - } - - return dt; - } - - protected virtual MySqlSchemaCollection GetSchemaInternal(string collection, string[] restrictions) - { - switch (collection) - { - // common collections - case "METADATACOLLECTIONS": - return GetCollections(); - case "DATASOURCEINFORMATION": - return GetDataSourceInformation(); - case "DATATYPES": - return GetDataTypes(); - case "RESTRICTIONS": - return GetRestrictions(); - case "RESERVEDWORDS": - return GetReservedWords(); - - // collections specific to our provider - case "USERS": - return GetUsers(restrictions); - case "DATABASES": - return GetDatabases(restrictions); - case "UDF": - return GetUDF(restrictions); - } - - // if we have a current database and our users have - // not specified a database, then default to the currently - // selected one. - if (restrictions == null) - restrictions = new string[2]; - if (connection != null && - connection.Database != null && - connection.Database.Length > 0 && - restrictions.Length > 1 && - restrictions[1] == null) - restrictions[1] = connection.Database; - - switch (collection) - { - case "TABLES": - return GetTables(restrictions); - case "COLUMNS": - return GetColumns(restrictions); - case "INDEXES": - return GetIndexes(restrictions); - case "INDEXCOLUMNS": - return GetIndexColumns(restrictions); - case "FOREIGN KEYS": - return GetForeignKeys(restrictions); - case "FOREIGN KEY COLUMNS": - return GetForeignKeyColumns(restrictions); - } - return null; - } - - internal string[] CleanRestrictions(string[] restrictionValues) - { - string[] restrictions = null; - if (restrictionValues != null) - { - restrictions = (string[])restrictionValues.Clone(); - - for (int x = 0; x < restrictions.Length; x++) - { - string s = restrictions[x]; - if (s == null) continue; - restrictions[x] = s.Trim('`'); - } - } - return restrictions; - } - - protected MySqlSchemaCollection QueryCollection(string name, string sql) - { - MySqlSchemaCollection c = new MySqlSchemaCollection(name); - MySqlCommand cmd = new MySqlCommand(sql, connection); - MySqlDataReader reader = cmd.ExecuteReader(); - - for (int i = 0; i < reader.FieldCount; i++) - c.AddColumn(reader.GetName(i), reader.GetFieldType(i)); - - using (reader) - { - while (reader.Read()) - { - MySqlSchemaRow row = c.AddRow(); - for (int i = 0; i < reader.FieldCount; i++) - row[i] = reader.GetValue(i); - } - } - return c; - } - } -} diff --git a/Source/MySql.Data/Statement.cs b/Source/MySql.Data/Statement.cs deleted file mode 100644 index e26e759d5..000000000 --- a/Source/MySql.Data/Statement.cs +++ /dev/null @@ -1,235 +0,0 @@ -// Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySql.Data.Common; -using System; -using System.Collections.Generic; - -namespace MySql.Data.MySqlClient -{ - internal abstract class Statement - { - protected MySqlCommand command; - private readonly List _buffers; - protected string commandText; - - private Statement(MySqlCommand cmd) - { - command = cmd; - _buffers = new List(); - } - - protected Statement(MySqlCommand cmd, string text) - : this(cmd) - { - commandText = text; - } - - #region Properties - - public virtual string ResolvedCommandText - { - get { return commandText; } - } - - protected Driver Driver => command.Connection.driver; - - protected MySqlConnection Connection => command.Connection; - - protected MySqlParameterCollection Parameters => command.Parameters; - - #endregion - - public virtual void Close(MySqlDataReader reader) - { - } - - public virtual void Resolve(bool preparing) - { - } - - public virtual void Execute() - { - // we keep a reference to this until we are done - BindParameters(); - ExecuteNext(); - } - - public virtual bool ExecuteNext() - { - if (_buffers.Count == 0) - return false; - - MySqlPacket packet = _buffers[0]; - //MemoryStream ms = stream.InternalBuffer; - Driver.SendQuery(packet); - _buffers.RemoveAt(0); - return true; - } - - protected virtual void BindParameters() - { - MySqlParameterCollection parameters = command.Parameters; - int index = 0; - - while (true) - { - InternalBindParameters(ResolvedCommandText, parameters, null); - - // if we are not batching, then we are done. This is only really relevant the - // first time through - if (command.Batch == null) return; - while (index < command.Batch.Count) - { - MySqlCommand batchedCmd = command.Batch[index++]; - MySqlPacket packet = (MySqlPacket)_buffers[_buffers.Count - 1]; - - // now we make a guess if this statement will fit in our current stream - long estimatedCmdSize = batchedCmd.EstimatedSize(); - if (((packet.Length - 4) + estimatedCmdSize) > Connection.driver.MaxPacketSize) - { - // it won't, so we setup to start a new run from here - parameters = batchedCmd.Parameters; - break; - } - - // looks like we might have room for it so we remember the current end of the stream - _buffers.RemoveAt(_buffers.Count - 1); - //long originalLength = packet.Length - 4; - - // and attempt to stream the next command - string text = ResolvedCommandText; - if (text.StartsWith("(", StringComparison.Ordinal)) - packet.WriteStringNoNull(", "); - else - packet.WriteStringNoNull("; "); - InternalBindParameters(text, batchedCmd.Parameters, packet); - if ((packet.Length - 4) > Connection.driver.MaxPacketSize) - { - //TODO - //stream.InternalBuffer.SetLength(originalLength); - parameters = batchedCmd.Parameters; - break; - } - } - if (index == command.Batch.Count) - return; - } - } - - private void InternalBindParameters(string sql, MySqlParameterCollection parameters, MySqlPacket packet) - { - bool sqlServerMode = command.Connection.Settings.SqlServerMode; - - if (packet == null) - { - packet = new MySqlPacket(Driver.Encoding) {Version = Driver.Version}; - packet.WriteByte(0); - } - - MySqlTokenizer tokenizer = new MySqlTokenizer(sql) - { - ReturnComments = true, - SqlServerMode = sqlServerMode - }; - - int pos = 0; - string token = tokenizer.NextToken(); - int parameterCount = 0; - while (token != null) - { - // serialize everything that came before the token (i.e. whitespace) - packet.WriteStringNoNull(sql.Substring(pos, tokenizer.StartIndex - pos)); - pos = tokenizer.StopIndex; - - if (MySqlTokenizer.IsParameter(token)) - { - if ((!parameters.containsUnnamedParameters && token.Length == 1 && parameterCount > 0) || parameters.containsUnnamedParameters && token.Length > 1) - throw new MySqlException(Resources.MixedParameterNamingNotAllowed); - - parameters.containsUnnamedParameters = token.Length == 1; - if (SerializeParameter(parameters, packet, token, parameterCount)) - token = null; - parameterCount++; - } - - if (token != null) - { - if (sqlServerMode && tokenizer.Quoted && token.StartsWith("[", StringComparison.Ordinal)) - token = String.Format("`{0}`", token.Substring(1, token.Length - 2)); - packet.WriteStringNoNull(token); - } - token = tokenizer.NextToken(); - } - _buffers.Add(packet); - } - - protected virtual bool ShouldIgnoreMissingParameter(string parameterName) - { - if (Connection.Settings.AllowUserVariables) - return true; - if (parameterName.StartsWith("@" + StoredProcedure.ParameterPrefix, StringComparison.OrdinalIgnoreCase)) - return true; - if (parameterName.Length > 1 && - (parameterName[1] == '`' || parameterName[1] == '\'')) - return true; - return false; - } - - /// - /// Serializes the given parameter to the given memory stream - /// - /// - /// This method is called by PrepareSqlBuffers to convert the given - /// parameter to bytes and write those bytes to the given memory stream. - /// - /// - /// True if the parameter was successfully serialized, false otherwise. - private bool SerializeParameter(MySqlParameterCollection parameters, - MySqlPacket packet, string parmName, int parameterIndex) - { - MySqlParameter parameter = null; - - if (!parameters.containsUnnamedParameters) - parameter = parameters.GetParameterFlexible(parmName, false); - else - { - if (parameterIndex <= parameters.Count) - parameter = parameters[parameterIndex]; - else - throw new MySqlException(Resources.ParameterIndexNotFound); - } - - if (parameter == null) - { - // if we are allowing user variables and the parameter name starts with @ - // then we can't throw an exception - if (parmName.StartsWith("@", StringComparison.Ordinal) && ShouldIgnoreMissingParameter(parmName)) - return false; - throw new MySqlException( - String.Format(Resources.ParameterMustBeDefined, parmName)); - } - parameter.Serialize(packet, false, Connection.Settings); - return true; - } - } -} diff --git a/Source/MySql.Data/StoredProcedure.cs b/Source/MySql.Data/StoredProcedure.cs deleted file mode 100644 index b787b35f8..000000000 --- a/Source/MySql.Data/StoredProcedure.cs +++ /dev/null @@ -1,316 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Data; -using System.Globalization; -using System.Linq; -using System.Text; -using MySql.Data.Common; -using MySql.Data.Types; - -namespace MySql.Data.MySqlClient -{ - /// - /// Summary description for StoredProcedure. - /// - internal class StoredProcedure : PreparableStatement - { - private string _outSelect; - - // Prefix used for to generate inout or output parameters names - internal const string ParameterPrefix = "_cnet_param_"; - private string resolvedCommandText; - - public StoredProcedure(MySqlCommand cmd, string text) - : base(cmd, text) - { - } - - private MySqlParameter GetReturnParameter() - { - return Parameters?.Cast().FirstOrDefault(p => p.Direction == ParameterDirection.ReturnValue); - } - - public bool ServerProvidingOutputParameters { get; private set; } - - public override string ResolvedCommandText - { - get { return resolvedCommandText; } - } - - internal string GetCacheKey(string spName) - { - string retValue = String.Empty; - StringBuilder key = new StringBuilder(spName); - key.Append("("); - string delimiter = ""; - foreach (MySqlParameter p in command.Parameters) - { - if (p.Direction == ParameterDirection.ReturnValue) - retValue = "?="; - else - { - key.AppendFormat(CultureInfo.InvariantCulture, "{0}?", delimiter); - delimiter = ","; - } - } - key.Append(")"); - return retValue + key.ToString(); - } - - private ProcedureCacheEntry GetParameters(string procName) - { - string procCacheKey = GetCacheKey(procName); - ProcedureCacheEntry entry = Connection.ProcedureCache.GetProcedure(Connection, procName, procCacheKey); - return entry; - } - - public static string GetFlags(string dtd) - { - int x = dtd.Length - 1; - while (x > 0 && (Char.IsLetterOrDigit(dtd[x]) || dtd[x] == ' ')) - x--; - string dtdSubstring = dtd.Substring(x); - return StringUtility.ToUpperInvariant(dtdSubstring); - } - - private string FixProcedureName(string name) - { - string[] parts = name.Split('.'); - for (int i = 0; i < parts.Length; i++) - if (!parts[i].StartsWith("`", StringComparison.Ordinal)) - parts[i] = String.Format("`{0}`", parts[i]); - if (parts.Length == 1) return parts[0]; - return String.Format("{0}.{1}", parts[0], parts[1]); - } - - private MySqlParameter GetAndFixParameter(string spName, MySqlSchemaRow param, bool realAsFloat, MySqlParameter returnParameter) - { - string mode = (string)param["PARAMETER_MODE"]; - string pName = (string)param["PARAMETER_NAME"]; - - if (param["ORDINAL_POSITION"].Equals(0)) - { - if (returnParameter == null) - throw new InvalidOperationException( - String.Format(Resources.RoutineRequiresReturnParameter, spName)); - pName = returnParameter.ParameterName; - } - - // make sure the parameters given to us have an appropriate type set if it's not already - MySqlParameter p = command.Parameters.GetParameterFlexible(pName, true); - if (!p.TypeHasBeenSet) - { - string datatype = (string)param["DATA_TYPE"]; - bool unsigned = GetFlags(param["DTD_IDENTIFIER"].ToString()).IndexOf("UNSIGNED") != -1; - p.MySqlDbType = MetaData.NameToType(datatype, unsigned, realAsFloat, Connection); - } - return p; - } - - private MySqlParameterCollection CheckParameters(string spName) - { - MySqlParameterCollection newParms = new MySqlParameterCollection(command); - MySqlParameter returnParameter = GetReturnParameter(); - - ProcedureCacheEntry entry = GetParameters(spName); - if (entry.procedure == null || entry.procedure.Rows.Count == 0) - throw new InvalidOperationException(String.Format(Resources.RoutineNotFound, spName)); - - bool realAsFloat = entry.procedure.Rows[0]["SQL_MODE"].ToString().IndexOf("REAL_AS_FLOAT") != -1; - - foreach (MySqlSchemaRow param in entry.parameters.Rows) - newParms.Add(GetAndFixParameter(spName, param, realAsFloat, returnParameter)); - return newParms; - } - - public override void Resolve(bool preparing) - { - // check to see if we are already resolved - if (ResolvedCommandText != null) return; - - ServerProvidingOutputParameters = Driver.SupportsOutputParameters && preparing; - - // first retrieve the procedure definition from our - // procedure cache - string spName = commandText; - if (spName.IndexOf(".") == -1 && !String.IsNullOrEmpty(Connection.Database)) - spName = Connection.Database + "." + spName; - spName = FixProcedureName(spName); - - MySqlParameter returnParameter = GetReturnParameter(); - - MySqlParameterCollection parms = command.Connection.Settings.CheckParameters ? - CheckParameters(spName) : Parameters; - - string setSql = SetUserVariables(parms, preparing); - string callSql = CreateCallStatement(spName, returnParameter, parms); - string outSql = CreateOutputSelect(parms, preparing); - resolvedCommandText = String.Format("{0}{1}{2}", setSql, callSql, outSql); - } - - private string SetUserVariables(MySqlParameterCollection parms, bool preparing) - { - StringBuilder setSql = new StringBuilder(); - - if (ServerProvidingOutputParameters) return setSql.ToString(); - - string delimiter = String.Empty; - foreach (MySqlParameter p in parms) - { - if (p.Direction != ParameterDirection.InputOutput) continue; - - string pName = "@" + p.BaseName; - string uName = "@" + ParameterPrefix + p.BaseName; - string sql = String.Format("SET {0}={1}", uName, pName); - - if (command.Connection.Settings.AllowBatch && !preparing) - { - setSql.AppendFormat(CultureInfo.InvariantCulture, "{0}{1}", delimiter, sql); - delimiter = "; "; - } - else - { - MySqlCommand cmd = new MySqlCommand(sql, command.Connection); - cmd.Parameters.Add(p); - cmd.ExecuteNonQuery(); - } - } - if (setSql.Length > 0) - setSql.Append("; "); - return setSql.ToString(); - } - - private string CreateCallStatement(string spName, MySqlParameter returnParameter, MySqlParameterCollection parms) - { - StringBuilder callSql = new StringBuilder(); - - string delimiter = String.Empty; - foreach (MySqlParameter p in parms) - { - if (p.Direction == ParameterDirection.ReturnValue) continue; - - string pName = "@" + p.BaseName; - string uName = "@" + ParameterPrefix + p.BaseName; - - bool useRealVar = p.Direction == ParameterDirection.Input || ServerProvidingOutputParameters; - callSql.AppendFormat(CultureInfo.InvariantCulture, "{0}{1}", delimiter, useRealVar ? pName : uName); - delimiter = ", "; - } - - if (returnParameter == null) - return String.Format("CALL {0}({1})", spName, callSql.ToString()); - else - return String.Format("SET @{0}{1}={2}({3})", ParameterPrefix, returnParameter.BaseName, spName, callSql.ToString()); - } - - private string CreateOutputSelect(MySqlParameterCollection parms, bool preparing) - { - StringBuilder outSql = new StringBuilder(); - - string delimiter = String.Empty; - foreach (MySqlParameter p in parms) - { - if (p.Direction == ParameterDirection.Input) continue; - if ((p.Direction == ParameterDirection.InputOutput || - p.Direction == ParameterDirection.Output) && - ServerProvidingOutputParameters) continue; - string pName = "@" + p.BaseName; - string uName = "@" + ParameterPrefix + p.BaseName; - - outSql.AppendFormat(CultureInfo.InvariantCulture, "{0}{1}", delimiter, uName); - delimiter = ", "; - } - - if (outSql.Length == 0) return String.Empty; - - if (command.Connection.Settings.AllowBatch && !preparing) - return String.Format(";SELECT {0}", outSql.ToString()); - - _outSelect = String.Format("SELECT {0}", outSql.ToString()); - return String.Empty; - } - - internal void ProcessOutputParameters(MySqlDataReader reader) - { - // We apparently need to always adjust our output types since the server - // provided data types are not always right - AdjustOutputTypes(reader); - - if ((reader.CommandBehavior & CommandBehavior.SchemaOnly) != 0) - return; - - // now read the output parameters data row - reader.Read(); - - string prefix = "@" + StoredProcedure.ParameterPrefix; - - for (int i = 0; i < reader.FieldCount; i++) - { - string fieldName = reader.GetName(i); - if (fieldName.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) - fieldName = fieldName.Remove(0, prefix.Length); - MySqlParameter parameter = command.Parameters.GetParameterFlexible(fieldName, true); - parameter.Value = reader.GetValue(i); - } - } - - private void AdjustOutputTypes(MySqlDataReader reader) - { - // since MySQL likes to return user variables as strings - // we reset the types of the readers internal value objects - // this will allow those value objects to parse the string based - // return values - for (int i = 0; i < reader.FieldCount; i++) - { - string fieldName = reader.GetName(i); - if (fieldName.IndexOf(StoredProcedure.ParameterPrefix) != -1) - fieldName = fieldName.Remove(0, StoredProcedure.ParameterPrefix.Length + 1); - MySqlParameter parameter = command.Parameters.GetParameterFlexible(fieldName, true); - - IMySqlValue v = MySqlField.GetIMySqlValue(parameter.MySqlDbType); - if (v is MySqlBit) - { - MySqlBit bit = (MySqlBit)v; - bit.ReadAsString = true; - reader.ResultSet.SetValueObject(i, bit); - } - else - reader.ResultSet.SetValueObject(i, v); - } - } - - public override void Close(MySqlDataReader reader) - { - base.Close(reader); - if (String.IsNullOrEmpty(_outSelect)) return; - if ((reader.CommandBehavior & CommandBehavior.SchemaOnly) != 0) return; - - MySqlCommand cmd = new MySqlCommand(_outSelect, command.Connection); - using (MySqlDataReader rdr = cmd.ExecuteReader(reader.CommandBehavior)) - { - ProcessOutputParameters(rdr); - } - } - } -} diff --git a/Source/MySql.Data/SystemPerformanceMonitor.cs b/Source/MySql.Data/SystemPerformanceMonitor.cs deleted file mode 100644 index b50dbf4cc..000000000 --- a/Source/MySql.Data/SystemPerformanceMonitor.cs +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Diagnostics; - - -namespace MySql.Data.MySqlClient -{ - internal class SystemPerformanceMonitor : PerformanceMonitor - { - private static PerformanceCounter procedureHardQueries; - private static PerformanceCounter procedureSoftQueries; - - public SystemPerformanceMonitor(MySqlConnection connection) : base(connection) - { - string categoryName = Resources.PerfMonCategoryName; - - if (connection.Settings.UsePerformanceMonitor && procedureHardQueries == null) - { - try - { - procedureHardQueries = new PerformanceCounter(categoryName, - "HardProcedureQueries", false); - procedureSoftQueries = new PerformanceCounter(categoryName, - "SoftProcedureQueries", false); - } - catch (Exception ex) - { - MySqlTrace.LogError(connection.ServerThread, ex.Message); - } - } - } - - private void EnsurePerfCategoryExist() - { - CounterCreationDataCollection ccdc = new CounterCreationDataCollection(); - CounterCreationData ccd = new CounterCreationData(); - ccd.CounterType = PerformanceCounterType.NumberOfItems32; - ccd.CounterName = "HardProcedureQueries"; - ccdc.Add(ccd); - - ccd = new CounterCreationData(); - ccd.CounterType = PerformanceCounterType.NumberOfItems32; - ccd.CounterName = "SoftProcedureQueries"; - ccdc.Add(ccd); -#if !NETCORE10 - if (!PerformanceCounterCategory.Exists(Resources.PerfMonCategoryName)) - PerformanceCounterCategory.Create(Resources.PerfMonCategoryName,"", new PerformanceCounterCategoryType(), ccdc); -#endif - - } - - public override void AddHardProcedureQuery() - { - if (!Connection.Settings.UsePerformanceMonitor || - procedureHardQueries == null) return; - procedureHardQueries.Increment(); - } - - public override void AddSoftProcedureQuery() - { - if (!Connection.Settings.UsePerformanceMonitor || - procedureSoftQueries == null) return; - procedureSoftQueries.Increment(); - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data/TableCache.cs b/Source/MySql.Data/TableCache.cs deleted file mode 100644 index ab37a9472..000000000 --- a/Source/MySql.Data/TableCache.cs +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright � 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; - -namespace MySql.Data.MySqlClient -{ - internal class TableCache - { - private static readonly BaseTableCache cache; - - static TableCache() - { - cache = new BaseTableCache(480 /* 8 hour max by default */); - } - - public static void AddToCache(string commandText, ResultSet resultSet) - { - cache.AddToCache(commandText, resultSet); - } - - public static ResultSet RetrieveFromCache(string commandText, int cacheAge) - { - return (ResultSet)cache.RetrieveFromCache(commandText, cacheAge); - } - - public static void RemoveFromCache(string commandText) - { - cache.RemoveFromCache(commandText); - } - - public static void DumpCache() - { - cache.Dump(); - } - } - - public class BaseTableCache - { - protected int MaxCacheAge; - private Dictionary cache = new Dictionary(); - - public BaseTableCache(int maxCacheAge) - { - MaxCacheAge = maxCacheAge; - } - - public virtual void AddToCache(string commandText, object resultSet) - { - CleanCache(); - CacheEntry entry = new CacheEntry(); - entry.CacheTime = DateTime.Now; - entry.CacheElement = resultSet; - lock (cache) - { - if (cache.ContainsKey(commandText)) return; - cache.Add(commandText, entry); - } - } - - public virtual object RetrieveFromCache(string commandText, int cacheAge) - { - CleanCache(); - lock (cache) - { - if (!cache.ContainsKey(commandText)) return null; - CacheEntry entry = cache[commandText]; - if (DateTime.Now.Subtract(entry.CacheTime).TotalSeconds > cacheAge) return null; - return entry.CacheElement; - } - } - - public void RemoveFromCache(string commandText) - { - lock (cache) - { - if (!cache.ContainsKey(commandText)) return; - cache.Remove(commandText); - } - } - - public virtual void Dump() - { - lock (cache) - cache.Clear(); - } - - protected virtual void CleanCache() - { - DateTime now = DateTime.Now; - List keysToRemove = new List(); - - lock (cache) - { - keysToRemove.AddRange(from key in cache.Keys let diff = now.Subtract(cache[key].CacheTime) where diff.TotalSeconds > MaxCacheAge select key); - - foreach (string key in keysToRemove) - cache.Remove(key); - } - } - - private struct CacheEntry - { - public DateTime CacheTime; - public object CacheElement; - } - } - -} \ No newline at end of file diff --git a/Source/MySql.Data/TimedStream.cs b/Source/MySql.Data/TimedStream.cs deleted file mode 100644 index e9748d9b2..000000000 --- a/Source/MySql.Data/TimedStream.cs +++ /dev/null @@ -1,278 +0,0 @@ -// Copyright © 2009, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.IO; -using MySql.Data.Common; - -namespace MySql.Data.MySqlClient -{ - /// - /// Stream that supports timeout of IO operations. - /// This class is used is used to support timeouts for SQL command, where a - /// typical operation involves several network reads/writes. - /// Timeout here is defined as the accumulated duration of all IO operations. - /// - - internal class TimedStream : Stream - { - readonly Stream _baseStream; - - int _timeout; - int _lastReadTimeout; - int _lastWriteTimeout; - readonly LowResolutionStopwatch _stopwatch; - - internal bool IsClosed { get; private set; } - - enum IOKind - { - Read, - Write - }; - - /// - /// Construct a TimedStream - /// - /// Undelying stream - public TimedStream(Stream baseStream) - { - this._baseStream = baseStream; - _timeout = baseStream.CanTimeout ? baseStream.ReadTimeout : System.Threading.Timeout.Infinite; - IsClosed = false; - _stopwatch = new LowResolutionStopwatch(); - } - - - /// - /// Figure out whether it is necessary to reset timeout on stream. - /// We track the current value of timeout and try to avoid - /// changing it too often, because setting Read/WriteTimeout property - /// on network stream maybe a slow operation that involves a system call - /// (setsockopt). Therefore, we allow a small difference, and do not - /// reset timeout if current value is slightly greater than the requested - /// one (within 0.1 second). - /// - - private bool ShouldResetStreamTimeout(int currentValue, int newValue) - { - if (!_baseStream.CanTimeout) return false; - if (newValue == System.Threading.Timeout.Infinite - && currentValue != newValue) - return true; - if (newValue > currentValue) - return true; - return currentValue >= newValue + 100; - } - private void StartTimer(IOKind op) - { - - int streamTimeout; - - if (_timeout == System.Threading.Timeout.Infinite) - streamTimeout = System.Threading.Timeout.Infinite; - else - streamTimeout = _timeout - (int)_stopwatch.ElapsedMilliseconds; - - if (op == IOKind.Read) - { - if (ShouldResetStreamTimeout(_lastReadTimeout, streamTimeout)) - { - _baseStream.ReadTimeout = streamTimeout; - _lastReadTimeout = streamTimeout; - } - } - else - { - if (ShouldResetStreamTimeout(_lastWriteTimeout, streamTimeout)) - { - _baseStream.WriteTimeout = streamTimeout; - _lastWriteTimeout = streamTimeout; - } - } - - if (_timeout == System.Threading.Timeout.Infinite) - return; - - _stopwatch.Start(); - } - private void StopTimer() - { - if (_timeout == System.Threading.Timeout.Infinite) - return; - - _stopwatch.Stop(); - - // Normally, a timeout exception would be thrown by stream itself, - // since we set the read/write timeout for the stream. However - // there is a gap between end of IO operation and stopping the - // stop watch, and it makes it possible for timeout to exceed - // even after IO completed successfully. - if (_stopwatch.ElapsedMilliseconds > _timeout) - { - ResetTimeout(System.Threading.Timeout.Infinite); - throw new TimeoutException("Timeout in IO operation"); - } - } - public override bool CanRead => _baseStream.CanRead; - - public override bool CanSeek => _baseStream.CanSeek; - - public override bool CanWrite => _baseStream.CanWrite; - - public override void Flush() - { - try - { - StartTimer(IOKind.Write); - _baseStream.Flush(); - StopTimer(); - } - catch (Exception e) - { - HandleException(e); - throw; - } - } - - public override long Length => _baseStream.Length; - - public override long Position - { - get - { - return _baseStream.Position; - } - set - { - _baseStream.Position = value; - } - } - - public override int Read(byte[] buffer, int offset, int count) - { - try - { - StartTimer(IOKind.Read); - int retval = _baseStream.Read(buffer, offset, count); - StopTimer(); - return retval; - } - catch (Exception e) - { - HandleException(e); - throw; - } - } - - public override int ReadByte() - { - try - { - StartTimer(IOKind.Read); - int retval = _baseStream.ReadByte(); - StopTimer(); - return retval; - } - catch (Exception e) - { - HandleException(e); - throw; - } - } - - public override long Seek(long offset, SeekOrigin origin) - { - return _baseStream.Seek(offset, origin); - } - - public override void SetLength(long value) - { - _baseStream.SetLength(value); - } - - public override void Write(byte[] buffer, int offset, int count) - { - try - { - StartTimer(IOKind.Write); - _baseStream.Write(buffer, offset, count); - StopTimer(); - } - catch (Exception e) - { - HandleException(e); - throw; - } - } - - public override bool CanTimeout => _baseStream.CanTimeout; - - public override int ReadTimeout - { - get { return _baseStream.ReadTimeout; } - set { _baseStream.ReadTimeout = value; } - } - public override int WriteTimeout - { - get { return _baseStream.WriteTimeout; } - set { _baseStream.WriteTimeout = value; } - } - -#if NETCORE10 - public void Close() -#else - public override void Close() -#endif - { - if (IsClosed) - return; - IsClosed = true; -#if !NETCORE10 - _baseStream.Close(); -#endif - _baseStream.Dispose(); - } - - public void ResetTimeout(int newTimeout) - { - if (newTimeout == System.Threading.Timeout.Infinite || newTimeout == 0) - _timeout = System.Threading.Timeout.Infinite; - else - _timeout = newTimeout; - _stopwatch.Reset(); - } - - - /// - /// Common handler for IO exceptions. - /// Resets timeout to infinity if timeout exception is - /// detected and stops the times. - /// - /// original exception - void HandleException(Exception e) - { - _stopwatch.Stop(); - ResetTimeout(-1); - } - } -} diff --git a/Source/MySql.Data/TracingDriver.cs b/Source/MySql.Data/TracingDriver.cs deleted file mode 100644 index f121ec36a..000000000 --- a/Source/MySql.Data/TracingDriver.cs +++ /dev/null @@ -1,250 +0,0 @@ -// Copyright © 2009, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Text; -using System.Threading; -using MySql.Data.Common; - -namespace MySql.Data.MySqlClient -{ - internal class TracingDriver : Driver - { - private static long driverCounter; - private long driverId; - private ResultSet activeResult; - private int rowSizeInBytes; - - public TracingDriver(MySqlConnectionStringBuilder settings) - : base(settings) - { - driverId = Interlocked.Increment(ref driverCounter); - } - - public override void Open() - { - base.Open(); - MySqlTrace.TraceEvent(TraceEventType.Information, MySqlTraceEventType.ConnectionOpened, - Resources.TraceOpenConnection, driverId, Settings.ConnectionString, ThreadID); - } - - public override void Close() - { - base.Close(); - MySqlTrace.TraceEvent(TraceEventType.Information, MySqlTraceEventType.ConnectionClosed, - Resources.TraceCloseConnection, driverId); - } - - public override void SendQuery(MySqlPacket p) - { - rowSizeInBytes = 0; - string cmdText = Encoding.GetString(p.Buffer, 5, p.Length - 5); - string normalizedQuery = null; - - if (cmdText.Length > 300) - { - QueryNormalizer normalizer = new QueryNormalizer(); - normalizedQuery = normalizer.Normalize(cmdText); - cmdText = cmdText.Substring(0, 300); - } - - base.SendQuery(p); - - MySqlTrace.TraceEvent(TraceEventType.Information, MySqlTraceEventType.QueryOpened, - Resources.TraceQueryOpened, driverId, ThreadID, cmdText); - if (normalizedQuery != null) - MySqlTrace.TraceEvent(TraceEventType.Information, MySqlTraceEventType.QueryNormalized, - Resources.TraceQueryNormalized, driverId, ThreadID, normalizedQuery); - } - - protected override int GetResult(int statementId, ref int affectedRows, ref long insertedId) - { - try - { - int fieldCount = base.GetResult(statementId, ref affectedRows, ref insertedId); - MySqlTrace.TraceEvent(TraceEventType.Information, MySqlTraceEventType.ResultOpened, - Resources.TraceResult, driverId, fieldCount, affectedRows, insertedId); - - return fieldCount; - } - catch (MySqlException ex) - { - // we got an error so we report it - MySqlTrace.TraceEvent(TraceEventType.Information, MySqlTraceEventType.Error, - Resources.TraceOpenResultError, driverId, ex.Number, ex.Message); - throw ex; - } - } - - public override ResultSet NextResult(int statementId, bool force) - { - // first let's see if we already have a resultset on this statementId - if (activeResult != null) - { - //oldRS = activeResults[statementId]; - if (Settings.UseUsageAdvisor) - ReportUsageAdvisorWarnings(statementId, activeResult); - MySqlTrace.TraceEvent(TraceEventType.Information, MySqlTraceEventType.ResultClosed, - Resources.TraceResultClosed, driverId, activeResult.TotalRows, activeResult.SkippedRows, - rowSizeInBytes); - rowSizeInBytes = 0; - activeResult = null; - } - - activeResult = base.NextResult(statementId, force); - return activeResult; - } - - public override int PrepareStatement(string sql, ref MySqlField[] parameters) - { - int statementId = base.PrepareStatement(sql, ref parameters); - MySqlTrace.TraceEvent(TraceEventType.Information, MySqlTraceEventType.StatementPrepared, - Resources.TraceStatementPrepared, driverId, sql, statementId); - return statementId; - } - - public override void CloseStatement(int id) - { - base.CloseStatement(id); - MySqlTrace.TraceEvent(TraceEventType.Information, MySqlTraceEventType.StatementClosed, - Resources.TraceStatementClosed, driverId, id); - } - - public override void SetDatabase(string dbName) - { - base.SetDatabase(dbName); - MySqlTrace.TraceEvent(TraceEventType.Information, MySqlTraceEventType.NonQuery, - Resources.TraceSetDatabase, driverId, dbName); - } - - public override void ExecuteStatement(MySqlPacket packetToExecute) - { - base.ExecuteStatement(packetToExecute); - int pos = packetToExecute.Position; - packetToExecute.Position = 1; - int statementId = packetToExecute.ReadInteger(4); - packetToExecute.Position = pos; - - MySqlTrace.TraceEvent(TraceEventType.Information, MySqlTraceEventType.StatementExecuted, - Resources.TraceStatementExecuted, driverId, statementId, ThreadID); - } - - public override bool FetchDataRow(int statementId, int columns) - { - try - { - bool b = base.FetchDataRow(statementId, columns); - if (b) - rowSizeInBytes += (handler as NativeDriver).Packet.Length; - return b; - } - catch (MySqlException ex) - { - MySqlTrace.TraceEvent(TraceEventType.Error, MySqlTraceEventType.Error, - Resources.TraceFetchError, driverId, ex.Number, ex.Message); - throw ex; - } - } - - public override void CloseQuery(MySqlConnection connection, int statementId) - { - base.CloseQuery(connection, statementId); - - MySqlTrace.TraceEvent(TraceEventType.Information, MySqlTraceEventType.QueryClosed, - Resources.TraceQueryDone, driverId); - } - - public override List ReportWarnings(MySqlConnection connection) - { - List warnings = base.ReportWarnings(connection); - foreach (MySqlError warning in warnings) - MySqlTrace.TraceEvent(TraceEventType.Warning, MySqlTraceEventType.Warning, - Resources.TraceWarning, driverId, warning.Level, warning.Code, warning.Message); - return warnings; - } - - private bool AllFieldsAccessed(ResultSet rs) - { - if (rs.Fields == null || rs.Fields.Length == 0) return true; - - for (int i = 0; i < rs.Fields.Length; i++) - if (!rs.FieldRead(i)) return false; - return true; - } - - private void ReportUsageAdvisorWarnings(int statementId, ResultSet rs) - { -#if !NETCORE10 - if (!Settings.UseUsageAdvisor) return; - - if (HasStatus(ServerStatusFlags.NoIndex)) - MySqlTrace.TraceEvent(TraceEventType.Warning, MySqlTraceEventType.UsageAdvisorWarning, - Resources.TraceUAWarningNoIndex, driverId, UsageAdvisorWarningFlags.NoIndex); - else if (HasStatus(ServerStatusFlags.BadIndex)) - MySqlTrace.TraceEvent(TraceEventType.Warning, MySqlTraceEventType.UsageAdvisorWarning, - Resources.TraceUAWarningBadIndex, driverId, UsageAdvisorWarningFlags.BadIndex); - - // report abandoned rows - if (rs.SkippedRows > 0) - MySqlTrace.TraceEvent(TraceEventType.Warning, MySqlTraceEventType.UsageAdvisorWarning, - Resources.TraceUAWarningSkippedRows, driverId, UsageAdvisorWarningFlags.SkippedRows, rs.SkippedRows); - - // report not all fields accessed - if (!AllFieldsAccessed(rs)) - { - StringBuilder notAccessed = new StringBuilder(""); - string delimiter = ""; - for (int i = 0; i < rs.Size; i++) - if (!rs.FieldRead(i)) - { - notAccessed.AppendFormat("{0}{1}", delimiter, rs.Fields[i].ColumnName); - delimiter = ","; - } - MySqlTrace.TraceEvent(TraceEventType.Warning, MySqlTraceEventType.UsageAdvisorWarning, - Resources.TraceUAWarningSkippedColumns, driverId, UsageAdvisorWarningFlags.SkippedColumns, - notAccessed.ToString()); - } - - // report type conversions if any - if (rs.Fields != null) - { - foreach (MySqlField f in rs.Fields) - { - StringBuilder s = new StringBuilder(); - string delimiter = ""; - foreach (Type t in f.TypeConversions) - { - s.AppendFormat("{0}{1}", delimiter, t.Name); - delimiter = ","; - } - if (s.Length > 0) - MySqlTrace.TraceEvent(TraceEventType.Warning, MySqlTraceEventType.UsageAdvisorWarning, - Resources.TraceUAWarningFieldConversion, driverId, UsageAdvisorWarningFlags.FieldConversion, - f.ColumnName, s.ToString()); - } - } -#endif - } - } -} diff --git a/Source/MySql.Data/Types/MySqlBinary.cs b/Source/MySql.Data/Types/MySqlBinary.cs deleted file mode 100644 index ecd1ffaac..000000000 --- a/Source/MySql.Data/Types/MySqlBinary.cs +++ /dev/null @@ -1,202 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using MySql.Data.MySqlClient; - -namespace MySql.Data.Types -{ - - internal struct MySqlBinary : IMySqlValue - { - private readonly MySqlDbType _type; - private readonly byte[] _mValue; - - public MySqlBinary(MySqlDbType type, bool isNull) - { - _type = type; - IsNull = isNull; - _mValue = null; - } - - public MySqlBinary(MySqlDbType type, byte[] val) - { - _type = type; - IsNull = false; - _mValue = val; - } - - #region IMySqlValue Members - - public bool IsNull { get; } - - MySqlDbType IMySqlValue.MySqlDbType => _type; - - object IMySqlValue.Value => _mValue; - - public byte[] Value => _mValue; - - Type IMySqlValue.SystemType => typeof(byte[]); - - string IMySqlValue.MySqlTypeName - { - get - { - switch (_type) - { - case MySqlDbType.TinyBlob: return "TINY_BLOB"; - case MySqlDbType.MediumBlob: return "MEDIUM_BLOB"; - case MySqlDbType.LongBlob: return "LONG_BLOB"; - default: - return "BLOB"; - } - } - } - - void IMySqlValue.WriteValue(MySqlPacket packet, bool binary, object val, int length) - { - byte[] buffToWrite = (val as byte[]); - if (buffToWrite == null) - { - char[] valAsChar = (val as Char[]); - if (valAsChar != null) - buffToWrite = packet.Encoding.GetBytes(valAsChar); - else - { - string s = val.ToString(); - if (length == 0) - length = s.Length; - else - s = s.Substring(0, length); - buffToWrite = packet.Encoding.GetBytes(s); - } - } - - // we assume zero length means write all of the value - if (length == 0) - length = buffToWrite.Length; - - if (buffToWrite == null) - throw new MySqlException("Only byte arrays and strings can be serialized by MySqlBinary"); - - if (binary) - { - packet.WriteLength(length); - packet.Write(buffToWrite, 0, length); - } - else - { - packet.WriteStringNoNull("_binary "); - packet.WriteByte((byte)'\''); - EscapeByteArray(buffToWrite, length, packet); - packet.WriteByte((byte)'\''); - } - } - - private static void EscapeByteArray(byte[] bytes, int length, MySqlPacket packet) - { - for (int x = 0; x < length; x++) - { - byte b = bytes[x]; - if (b == '\0') - { - packet.WriteByte((byte)'\\'); - packet.WriteByte((byte)'0'); - } - - else if (b == '\\' || b == '\'' || b == '\"') - { - packet.WriteByte((byte)'\\'); - packet.WriteByte(b); - } - else - packet.WriteByte(b); - } - } - - IMySqlValue IMySqlValue.ReadValue(MySqlPacket packet, long length, bool nullVal) - { - MySqlBinary b; - if (nullVal) - b = new MySqlBinary(_type, true); - else - { - if (length == -1) - length = (long)packet.ReadFieldLength(); - - byte[] newBuff = new byte[length]; - packet.Read(newBuff, 0, (int)length); - b = new MySqlBinary(_type, newBuff); - } - return b; - } - - void IMySqlValue.SkipValue(MySqlPacket packet) - { - int len = (int)packet.ReadFieldLength(); - packet.Position += len; - } - - #endregion - - public static void SetDSInfo(MySqlSchemaCollection sc) - { - string[] types = new string[] { "BLOB", "TINYBLOB", "MEDIUMBLOB", "LONGBLOB", "BINARY", "VARBINARY" }; - MySqlDbType[] dbtype = new MySqlDbType[] { MySqlDbType.Blob, - MySqlDbType.TinyBlob, MySqlDbType.MediumBlob, MySqlDbType.LongBlob, MySqlDbType.Binary, MySqlDbType.VarBinary }; - long[] sizes = new long[] { 65535L, 255L, 16777215L, 4294967295L, 255L, 65535L }; - string[] format = new string[] { null, null, null, null, "binary({0})", "varbinary({0})" }; - string[] parms = new string[] { null, null, null, null, "length", "length" }; - - // we use name indexing because this method will only be called - // when GetSchema is called for the DataSourceInformation - // collection and then it wil be cached. - for (int x = 0; x < types.Length; x++) - { - MySqlSchemaRow row = sc.AddRow(); - row["TypeName"] = types[x]; - row["ProviderDbType"] = dbtype[x]; - row["ColumnSize"] = sizes[x]; - row["CreateFormat"] = format[x]; - row["CreateParameters"] = parms[x]; - row["DataType"] = "System.Byte[]"; - row["IsAutoincrementable"] = false; - row["IsBestMatch"] = true; - row["IsCaseSensitive"] = false; - row["IsFixedLength"] = x < 4 ? false : true; - row["IsFixedPrecisionScale"] = false; - row["IsLong"] = sizes[x] > 255; - row["IsNullable"] = true; - row["IsSearchable"] = false; - row["IsSearchableWithLike"] = false; - row["IsUnsigned"] = DBNull.Value; - row["MaximumScale"] = DBNull.Value; - row["MinimumScale"] = DBNull.Value; - row["IsConcurrencyType"] = DBNull.Value; - row["IsLiteralSupported"] = false; - row["LiteralPrefix"] = "0x"; - row["LiteralSuffix"] = DBNull.Value; - row["NativeDataType"] = DBNull.Value; - } - } - } -} diff --git a/Source/MySql.Data/Types/MySqlBit.cs b/Source/MySql.Data/Types/MySqlBit.cs deleted file mode 100644 index f616bbc14..000000000 --- a/Source/MySql.Data/Types/MySqlBit.cs +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using MySql.Data.MySqlClient; - -namespace MySql.Data.Types -{ - /// - /// Summary description for MySqlUInt64. - /// - internal struct MySqlBit : IMySqlValue - { - private ulong _value; - - public MySqlBit(bool isnull) - { - _value = 0; - IsNull = isnull; - ReadAsString = false; - } - - public bool ReadAsString { get; set; } - - public bool IsNull { get; private set; } - - MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.Bit; - - object IMySqlValue.Value => _value; - - Type IMySqlValue.SystemType => typeof(ulong); - - string IMySqlValue.MySqlTypeName => "BIT"; - - public void WriteValue(MySqlPacket packet, bool binary, object value, int length) - { - ulong v = value as ulong? ?? Convert.ToUInt64(value); - if (binary) - packet.WriteInteger((long)v, 8); - else - packet.WriteStringNoNull(v.ToString()); - } - - public IMySqlValue ReadValue(MySqlPacket packet, long length, bool isNull) - { - this.IsNull = isNull; - if (isNull) - return this; - - if (length == -1) - length = packet.ReadFieldLength(); - - if (ReadAsString) - _value = UInt64.Parse(packet.ReadString(length)); - else - _value = (UInt64)packet.ReadBitValue((int)length); - return this; - } - - public void SkipValue(MySqlPacket packet) - { - int len = (int)packet.ReadFieldLength(); - packet.Position += len; - } - - internal static void SetDSInfo(MySqlSchemaCollection sc) - { - // we use name indexing because this method will only be called - // when GetSchema is called for the DataSourceInformation - // collection and then it wil be cached. - MySqlSchemaRow row = sc.AddRow(); - row["TypeName"] = "BIT"; - row["ProviderDbType"] = MySqlDbType.Bit; - row["ColumnSize"] = 64; - row["CreateFormat"] = "BIT"; - row["CreateParameters"] = DBNull.Value; ; - row["DataType"] = typeof(ulong).ToString(); - row["IsAutoincrementable"] = false; - row["IsBestMatch"] = true; - row["IsCaseSensitive"] = false; - row["IsFixedLength"] = false; - row["IsFixedPrecisionScale"] = true; - row["IsLong"] = false; - row["IsNullable"] = true; - row["IsSearchable"] = true; - row["IsSearchableWithLike"] = false; - row["IsUnsigned"] = false; - row["MaximumScale"] = 0; - row["MinimumScale"] = 0; - row["IsConcurrencyType"] = DBNull.Value; - row["IsLiteralSupported"] = false; - row["LiteralPrefix"] = DBNull.Value; - row["LiteralSuffix"] = DBNull.Value; - row["NativeDataType"] = DBNull.Value; - } - } -} diff --git a/Source/MySql.Data/Types/MySqlByte.cs b/Source/MySql.Data/Types/MySqlByte.cs deleted file mode 100644 index 8c6536870..000000000 --- a/Source/MySql.Data/Types/MySqlByte.cs +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Globalization; -using MySql.Data.MySqlClient; - -namespace MySql.Data.Types -{ - internal struct MySqlByte : IMySqlValue - { - public MySqlByte(bool isNull) - { - IsNull = isNull; - Value = 0; - TreatAsBoolean = false; - } - - public MySqlByte(sbyte val) - { - IsNull = false; - Value = val; - TreatAsBoolean = false; - } - - #region IMySqlValue Members - - public bool IsNull { get; } - - MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.Byte; - - object IMySqlValue.Value - { - get - { - if (TreatAsBoolean) - return Convert.ToBoolean(Value); - return Value; - } - } - - public sbyte Value { get; set; } - - Type IMySqlValue.SystemType => TreatAsBoolean ? typeof(bool) : typeof(sbyte); - - string IMySqlValue.MySqlTypeName => "TINYINT"; - - void IMySqlValue.WriteValue(MySqlPacket packet, bool binary, object val, int length) - { - sbyte v = val as sbyte? ?? Convert.ToSByte(val); - if (binary) - packet.WriteByte((byte)v); - else - packet.WriteStringNoNull(v.ToString()); - } - - IMySqlValue IMySqlValue.ReadValue(MySqlPacket packet, long length, bool nullVal) - { - if (nullVal) - return new MySqlByte(true); - - if (length == -1) - return new MySqlByte((sbyte)packet.ReadByte()); - - string s = packet.ReadString(length); - MySqlByte b = new MySqlByte(SByte.Parse(s, NumberStyles.Any, CultureInfo.InvariantCulture)); - b.TreatAsBoolean = TreatAsBoolean; - return b; - } - - void IMySqlValue.SkipValue(MySqlPacket packet) - { - packet.ReadByte(); - } - - #endregion - - internal bool TreatAsBoolean { get; set; } - - internal static void SetDSInfo(MySqlSchemaCollection sc) - { - // we use name indexing because this method will only be called - // when GetSchema is called for the DataSourceInformation - // collection and then it wil be cached. - MySqlSchemaRow row = sc.AddRow(); - row["TypeName"] = "TINYINT"; - row["ProviderDbType"] = MySqlDbType.Byte; - row["ColumnSize"] = 0; - row["CreateFormat"] = "TINYINT"; - row["CreateParameters"] = null; - row["DataType"] = "System.SByte"; - row["IsAutoincrementable"] = true; - row["IsBestMatch"] = true; - row["IsCaseSensitive"] = false; - row["IsFixedLength"] = true; - row["IsFixedPrecisionScale"] = true; - row["IsLong"] = false; - row["IsNullable"] = true; - row["IsSearchable"] = true; - row["IsSearchableWithLike"] = false; - row["IsUnsigned"] = false; - row["MaximumScale"] = 0; - row["MinimumScale"] = 0; - row["IsConcurrencyType"] = DBNull.Value; - row["IsLiteralSupported"] = false; - row["LiteralPrefix"] = null; - row["LiteralSuffix"] = null; - row["NativeDataType"] = null; - } - } -} diff --git a/Source/MySql.Data/Types/MySqlConversionException.cs b/Source/MySql.Data/Types/MySqlConversionException.cs deleted file mode 100644 index 7a075ee1b..000000000 --- a/Source/MySql.Data/Types/MySqlConversionException.cs +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; - -namespace MySql.Data.Types -{ - /// - /// Summary description for MySqlConversionException. - /// -#if !NETCORE10 - [Serializable] -#endif - public class MySqlConversionException : Exception - { - /// Ctor - public MySqlConversionException(string msg) - : base(msg) - { - } - } -} diff --git a/Source/MySql.Data/Types/MySqlDateTime.cs b/Source/MySql.Data/Types/MySqlDateTime.cs deleted file mode 100644 index 8d8bbba98..000000000 --- a/Source/MySql.Data/Types/MySqlDateTime.cs +++ /dev/null @@ -1,504 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Globalization; -using MySql.Data.MySqlClient; -using MySql.Data.Common; - -namespace MySql.Data.Types -{ - - /// - /// - /// - public partial struct MySqlDateTime : IMySqlValue, IComparable - { - private readonly MySqlDbType _type; - private int _millisecond, _microsecond; - public int TimezoneOffset; - - /// - /// Constructs a new MySqlDateTime object by setting the individual time properties to - /// the given values. - /// - /// The year to use. - /// The month to use. - /// The day to use. - /// The hour to use. - /// The minute to use. - /// The second to use. - /// The microsecond to use. - public MySqlDateTime(int year, int month, int day, int hour, int minute, int second, int microsecond) - : this(MySqlDbType.DateTime, year, month, day, hour, minute, second, microsecond) - { - } - - /// - /// Constructs a new MySqlDateTime object by using values from the given object. - /// - /// The object to copy. - public MySqlDateTime(DateTime dt) - : this(MySqlDbType.DateTime, dt) - { - } - - /// - /// Constructs a new MySqlDateTime object by copying the current value of the given object. - /// - /// The MySqlDateTime object to copy. - public MySqlDateTime(MySqlDateTime mdt) - { - Year = mdt.Year; - Month = mdt.Month; - Day = mdt.Day; - Hour = mdt.Hour; - Minute = mdt.Minute; - Second = mdt.Second; - _microsecond = 0; - _millisecond = 0; - _type = MySqlDbType.DateTime; - IsNull = false; - TimezoneOffset = 0; - } - - /// - /// Enables the contruction of a MySqlDateTime object by parsing a string. - /// - public MySqlDateTime(string dateTime) - : this(Parse(dateTime)) - { - } - - internal MySqlDateTime(MySqlDbType type, int year, int month, int day, int hour, int minute, - int second, int microsecond) - { - this.IsNull = false; - this._type = type; - this.Year = year; - this.Month = month; - this.Day = day; - this.Hour = hour; - this.Minute = minute; - this.Second = second; - this._microsecond = microsecond; - this._millisecond = this._microsecond / 1000; - this.TimezoneOffset = 0; - } - - internal MySqlDateTime(MySqlDbType type, bool isNull) - : this(type, 0, 0, 0, 0, 0, 0, 0) - { - this.IsNull = isNull; - } - - internal MySqlDateTime(MySqlDbType type, DateTime val) - : this(type, 0, 0, 0, 0, 0, 0, 0) - { - this.IsNull = false; - Year = val.Year; - Month = val.Month; - Day = val.Day; - Hour = val.Hour; - Minute = val.Minute; - Second = val.Second; - Microsecond = (int)(val.Ticks % 10000000) / 10; - } - - #region Properties - - /// - /// Indicates if this object contains a value that can be represented as a DateTime - /// - public bool IsValidDateTime => Year != 0 && Month != 0 && Day != 0; - - /// Returns the year portion of this datetime - public int Year { get; set; } - - /// Returns the month portion of this datetime - public int Month { get; set; } - - /// Returns the day portion of this datetime - public int Day { get; set; } - - /// Returns the hour portion of this datetime - public int Hour { get; set; } - - /// Returns the minute portion of this datetime - public int Minute { get; set; } - - /// Returns the second portion of this datetime - public int Second { get; set; } - - /// - /// Returns the milliseconds portion of this datetime - /// expressed as a value between 0 and 999 - /// - public int Millisecond { - get { return _millisecond; } - set - { - if (value < 0 || value > 999) - throw new ArgumentOutOfRangeException("Millisecond", Resources.InvalidMillisecondValue); - _millisecond = value; - _microsecond = value * 1000; - } - } - - /// - /// Returns the microseconds portion of this datetime (6 digit precision) - /// - public int Microsecond - { - get { return _microsecond; } - set - { - if (value < 0 || value > 999999) - throw new ArgumentOutOfRangeException("Microsecond", Resources.InvalidMicrosecondValue); - _microsecond = value; - _millisecond = value / 1000; - } - } - - #endregion - - #region IMySqlValue Members - - /// - /// Returns true if this datetime object has a null value - /// - public bool IsNull { get; } - - MySqlDbType IMySqlValue.MySqlDbType => _type; - - object IMySqlValue.Value => GetDateTime(); - - /// - /// Retrieves the value of this as a DateTime object. - /// - public DateTime Value => GetDateTime(); - - Type IMySqlValue.SystemType => typeof(DateTime); - - string IMySqlValue.MySqlTypeName - { - get - { - switch (_type) - { - case MySqlDbType.Date: return "DATE"; - case MySqlDbType.Newdate: return "NEWDATE"; - case MySqlDbType.Timestamp: return "TIMESTAMP"; - } - return "DATETIME"; - } - } - - - private void SerializeText(MySqlPacket packet, MySqlDateTime value) - { - var val = String.Format("{0:0000}-{1:00}-{2:00}", - value.Year, value.Month, value.Day); - if (_type != MySqlDbType.Date) - { - val = value.Microsecond > 0 ? - $"{val} {value.Hour:00}:{value.Minute:00}:{value.Second:00}.{value.Microsecond:000000}" - : $"{val} {value.Hour:00}:{value.Minute:00}:{value.Second:00} "; - } - - packet.WriteStringNoNull("'" + val + "'"); - } - - void IMySqlValue.WriteValue(MySqlPacket packet, bool binary, object value, int length) - { - MySqlDateTime dtValue; - - string valueAsString = value as string; - - if (value is DateTime) - dtValue = new MySqlDateTime(_type, (DateTime)value); - else if (valueAsString != null) - dtValue = MySqlDateTime.Parse(valueAsString); - else if (value is MySqlDateTime) - dtValue = (MySqlDateTime)value; - else - throw new MySqlException("Unable to serialize date/time value."); - - if (!binary) - { - SerializeText(packet, dtValue); - return; - } - - if (dtValue.Microsecond > 0) - packet.WriteByte(11); - else - packet.WriteByte(7); - - packet.WriteInteger(dtValue.Year, 2); - packet.WriteByte((byte)dtValue.Month); - packet.WriteByte((byte)dtValue.Day); - if (_type == MySqlDbType.Date) - { - packet.WriteByte(0); - packet.WriteByte(0); - packet.WriteByte(0); - } - else - { - packet.WriteByte((byte)dtValue.Hour); - packet.WriteByte((byte)dtValue.Minute); - packet.WriteByte((byte)dtValue.Second); - } - - if (dtValue.Microsecond > 0) - { - long val = dtValue.Microsecond; - for (int x = 0; x < 4; x++) - { - packet.WriteByte((byte)(val & 0xff)); - val >>= 8; - } - } - } - - internal static MySqlDateTime Parse(string s) - { - MySqlDateTime dt = new MySqlDateTime(); - return dt.ParseMySql(s); - } - - internal static MySqlDateTime Parse(string s, DBVersion version) - { - MySqlDateTime dt = new MySqlDateTime(); - return dt.ParseMySql(s); - } - - private MySqlDateTime ParseMySql(string s) - { - string[] parts = s.Split('-', ' ', ':', '/', '.'); - - int year = int.Parse(parts[0]); - int month = int.Parse(parts[1]); - int day = int.Parse(parts[2]); - - int hour = 0, minute = 0, second = 0, microsecond = 0; - if (parts.Length > 3) - { - hour = int.Parse(parts[3]); - minute = int.Parse(parts[4]); - second = int.Parse(parts[5]); - } - - if (parts.Length > 6) - { - microsecond = int.Parse(parts[6].PadRight(6, '0')); - } - - return new MySqlDateTime(_type, year, month, day, hour, minute, second, microsecond); - } - - IMySqlValue IMySqlValue.ReadValue(MySqlPacket packet, long length, bool nullVal) - { - - if (nullVal) return new MySqlDateTime(_type, true); - - if (length >= 0) - { - string value = packet.ReadString(length); - return ParseMySql(value); - } - - long bufLength = packet.ReadByte(); - int year = 0, month = 0, day = 0; - int hour = 0, minute = 0, second = 0, microsecond = 0; - if (bufLength >= 4) - { - year = packet.ReadInteger(2); - month = packet.ReadByte(); - day = packet.ReadByte(); - } - - if (bufLength > 4) - { - hour = packet.ReadByte(); - minute = packet.ReadByte(); - second = packet.ReadByte(); - } - - if (bufLength > 7) - { - microsecond = packet.Read3ByteInt(); - packet.ReadByte(); - } - - return new MySqlDateTime(_type, year, month, day, hour, minute, second, microsecond); - } - - void IMySqlValue.SkipValue(MySqlPacket packet) - { - int len = packet.ReadByte(); - packet.Position += len; - } - - #endregion - - /// Returns this value as a DateTime - public DateTime GetDateTime() - { - if (!IsValidDateTime) - throw new MySqlConversionException("Unable to convert MySQL date/time value to System.DateTime"); - - DateTimeKind kind = DateTimeKind.Unspecified; - if (_type == MySqlDbType.Timestamp) - { - if (TimezoneOffset == 0) - kind = DateTimeKind.Utc; - else - kind = DateTimeKind.Local; - } - - return new DateTime(Year, Month, Day, Hour, Minute, Second, kind).AddTicks(_microsecond * 10); - } - - private static string FormatDateCustom(string format, int monthVal, int dayVal, int yearVal) - { - format = format.Replace("MM", "{0:00}"); - format = format.Replace("M", "{0}"); - format = format.Replace("dd", "{1:00}"); - format = format.Replace("d", "{1}"); - format = format.Replace("yyyy", "{2:0000}"); - format = format.Replace("yy", "{3:00}"); - format = format.Replace("y", "{4:0}"); - - int year2digit = yearVal - ((yearVal / 1000) * 1000); - year2digit -= ((year2digit / 100) * 100); - int year1digit = year2digit - ((year2digit / 10) * 10); - - return String.Format(format, monthVal, dayVal, yearVal, year2digit, year1digit); - } - - /// Returns a MySQL specific string representation of this value - public override string ToString() - { - if (this.IsValidDateTime) - { - DateTime d = new DateTime(Year, Month, Day, Hour, Minute, Second).AddTicks(_microsecond * 10); - return (_type == MySqlDbType.Date) ? d.ToString("d") : d.ToString(); - } - - string dateString = FormatDateCustom( - CultureInfo.CurrentUICulture.DateTimeFormat.ShortDatePattern, Month, Day, Year); - if (_type == MySqlDbType.Date) - return dateString; - - DateTime dt = new DateTime(1, 2, 3, Hour, Minute, Second).AddTicks(_microsecond * 10); -#if !NETCORE10 - dateString = String.Format("{0} {1}", dateString, dt.ToLongTimeString()); -#else - dateString = String.Format("{0} {1}", dateString, dt.ToString(CultureInfo.CurrentCulture)); -#endif - - return dateString; - } - - /// - /// - /// - public static explicit operator DateTime(MySqlDateTime val) - { - if (!val.IsValidDateTime) return DateTime.MinValue; - return val.GetDateTime(); - } - - internal static void SetDSInfo(MySqlSchemaCollection sc) - { - string[] types = new string[] { "DATE", "DATETIME", "TIMESTAMP" }; - MySqlDbType[] dbtype = new MySqlDbType[] { MySqlDbType.Date, - MySqlDbType.DateTime, MySqlDbType.Timestamp }; - - // we use name indexing because this method will only be called - // when GetSchema is called for the DataSourceInformation - // collection and then it wil be cached. - for (int x = 0; x < types.Length; x++) - { - MySqlSchemaRow row = sc.AddRow(); - row["TypeName"] = types[x]; - row["ProviderDbType"] = dbtype[x]; - row["ColumnSize"] = 0; - row["CreateFormat"] = types[x]; - row["CreateParameters"] = null; - row["DataType"] = "System.DateTime"; - row["IsAutoincrementable"] = false; - row["IsBestMatch"] = true; - row["IsCaseSensitive"] = false; - row["IsFixedLength"] = true; - row["IsFixedPrecisionScale"] = true; - row["IsLong"] = false; - row["IsNullable"] = true; - row["IsSearchable"] = true; - row["IsSearchableWithLike"] = false; - row["IsUnsigned"] = false; - row["MaximumScale"] = 0; - row["MinimumScale"] = 0; - row["IsConcurrencyType"] = DBNull.Value; - row["IsLiteralSupported"] = false; - row["LiteralPrefix"] = null; - row["LiteralSuffix"] = null; - row["NativeDataType"] = null; - } - } - -#region IComparable Members - - int IComparable.CompareTo(object obj) - { - MySqlDateTime otherDate = (MySqlDateTime)obj; - - if (Year < otherDate.Year) return -1; - else if (Year > otherDate.Year) return 1; - - if (Month < otherDate.Month) return -1; - else if (Month > otherDate.Month) return 1; - - if (Day < otherDate.Day) return -1; - else if (Day > otherDate.Day) return 1; - - if (Hour < otherDate.Hour) return -1; - else if (Hour > otherDate.Hour) return 1; - - if (Minute < otherDate.Minute) return -1; - else if (Minute > otherDate.Minute) return 1; - - if (Second < otherDate.Second) return -1; - else if (Second > otherDate.Second) return 1; - - if (Microsecond < otherDate.Microsecond) return -1; - else if (Microsecond > otherDate.Microsecond) return 1; - - return 0; - } - -#endregion - - } -} diff --git a/Source/MySql.Data/Types/MySqlDecimal.cs b/Source/MySql.Data/Types/MySqlDecimal.cs deleted file mode 100644 index 7d0bfff92..000000000 --- a/Source/MySql.Data/Types/MySqlDecimal.cs +++ /dev/null @@ -1,135 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Globalization; -using MySql.Data.MySqlClient; - -namespace MySql.Data.Types -{ - public struct MySqlDecimal : IMySqlValue - { - private readonly string _value; - - internal MySqlDecimal(bool isNull) - { - IsNull = isNull; - _value = null; - Precision = Scale = 0; - } - - internal MySqlDecimal(string val) - { - this.IsNull = false; - Precision = Scale = 0; - _value = val; - } - - #region IMySqlValue Members - - public bool IsNull { get; } - - MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.Decimal; - - public byte Precision { get; set; } - - public byte Scale { get; set; } - - - object IMySqlValue.Value => Value; - - public decimal Value => Convert.ToDecimal(_value, CultureInfo.InvariantCulture); - - public double ToDouble() - { - return Double.Parse(_value); - } - - public override string ToString() - { - return _value; - } - - Type IMySqlValue.SystemType => typeof(decimal); - - string IMySqlValue.MySqlTypeName => "DECIMAL"; - - void IMySqlValue.WriteValue(MySqlPacket packet, bool binary, object val, int length) - { - decimal v = val as decimal? ?? Convert.ToDecimal(val); - string valStr = v.ToString(CultureInfo.InvariantCulture); - if (binary) - packet.WriteLenString(valStr); - else - packet.WriteStringNoNull(valStr); - } - - IMySqlValue IMySqlValue.ReadValue(MySqlPacket packet, long length, bool nullVal) - { - if (nullVal) - return new MySqlDecimal(true); - - string s = String.Empty; - s = length == -1 ? packet.ReadLenString() : packet.ReadString(length); - return new MySqlDecimal(s); - } - - void IMySqlValue.SkipValue(MySqlPacket packet) - { - int len = (int)packet.ReadFieldLength(); - packet.Position += len; - } - - #endregion - - internal static void SetDSInfo(MySqlSchemaCollection sc) - { - // we use name indexing because this method will only be called - // when GetSchema is called for the DataSourceInformation - // collection and then it wil be cached. - MySqlSchemaRow row = sc.AddRow(); - row["TypeName"] = "DECIMAL"; - row["ProviderDbType"] = MySqlDbType.NewDecimal; - row["ColumnSize"] = 0; - row["CreateFormat"] = "DECIMAL({0},{1})"; - row["CreateParameters"] = "precision,scale"; - row["DataType"] = "System.Decimal"; - row["IsAutoincrementable"] = false; - row["IsBestMatch"] = true; - row["IsCaseSensitive"] = false; - row["IsFixedLength"] = true; - row["IsFixedPrecisionScale"] = true; - row["IsLong"] = false; - row["IsNullable"] = true; - row["IsSearchable"] = true; - row["IsSearchableWithLike"] = false; - row["IsUnsigned"] = false; - row["MaximumScale"] = 0; - row["MinimumScale"] = 0; - row["IsConcurrencyType"] = DBNull.Value; - row["IsLiteralSupported"] = false; - row["LiteralPrefix"] = null; - row["LiteralSuffix"] = null; - row["NativeDataType"] = null; - } - } -} diff --git a/Source/MySql.Data/Types/MySqlDouble.cs b/Source/MySql.Data/Types/MySqlDouble.cs deleted file mode 100644 index d283056f8..000000000 --- a/Source/MySql.Data/Types/MySqlDouble.cs +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Globalization; -using MySql.Data.MySqlClient; - -namespace MySql.Data.Types -{ - - internal struct MySqlDouble : IMySqlValue - { - public MySqlDouble(bool isNull) - { - IsNull = isNull; - Value = 0.0; - } - - public MySqlDouble(double val) - { - IsNull = false; - Value = val; - } - - #region IMySqlValue Members - - public bool IsNull { get; } - - MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.Double; - - object IMySqlValue.Value => Value; - - public double Value { get; } - - Type IMySqlValue.SystemType => typeof(double); - - string IMySqlValue.MySqlTypeName => "DOUBLE"; - - void IMySqlValue.WriteValue(MySqlPacket packet, bool binary, object val, int length) - { - double v = val as double? ?? Convert.ToDouble(val); - if (binary) - packet.Write(BitConverter.GetBytes(v)); - else - packet.WriteStringNoNull(v.ToString("R", CultureInfo.InvariantCulture)); - } - - IMySqlValue IMySqlValue.ReadValue(MySqlPacket packet, long length, - bool nullVal) - { - if (nullVal) - return new MySqlDouble(true); - - if (length == -1) - { - byte[] b = new byte[8]; - packet.Read(b, 0, 8); - return new MySqlDouble(BitConverter.ToDouble(b, 0)); - } - string s = packet.ReadString(length); - double d; - try - { - d = Double.Parse(s, CultureInfo.InvariantCulture); - } - catch (OverflowException) - { - // MySQL server < 5.5 can return values not compatible with - // Double.Parse(), i.e out of range for double. - - if (s.StartsWith("-", StringComparison.Ordinal)) - d = double.MinValue; - else - d = double.MaxValue; - } - return new MySqlDouble(d); - } - - void IMySqlValue.SkipValue(MySqlPacket packet) - { - packet.Position += 8; - } - - #endregion - - internal static void SetDSInfo(MySqlSchemaCollection sc) - { - // we use name indexing because this method will only be called - // when GetSchema is called for the DataSourceInformation - // collection and then it wil be cached. - MySqlSchemaRow row = sc.AddRow(); - row["TypeName"] = "DOUBLE"; - row["ProviderDbType"] = MySqlDbType.Double; - row["ColumnSize"] = 0; - row["CreateFormat"] = "DOUBLE"; - row["CreateParameters"] = null; - row["DataType"] = "System.Double"; - row["IsAutoincrementable"] = false; - row["IsBestMatch"] = true; - row["IsCaseSensitive"] = false; - row["IsFixedLength"] = true; - row["IsFixedPrecisionScale"] = true; - row["IsLong"] = false; - row["IsNullable"] = true; - row["IsSearchable"] = true; - row["IsSearchableWithLike"] = false; - row["IsUnsigned"] = false; - row["MaximumScale"] = 0; - row["MinimumScale"] = 0; - row["IsConcurrencyType"] = DBNull.Value; - row["IsLiteralSupported"] = false; - row["LiteralPrefix"] = null; - row["LiteralSuffix"] = null; - row["NativeDataType"] = null; - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data/Types/MySqlGeometry.cs b/Source/MySql.Data/Types/MySqlGeometry.cs deleted file mode 100644 index 0c72ff20e..000000000 --- a/Source/MySql.Data/Types/MySqlGeometry.cs +++ /dev/null @@ -1,356 +0,0 @@ -// Copyright � 2013, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Globalization; -using MySql.Data.MySqlClient; - -namespace MySql.Data.Types -{ - //Bytes structure is: - //SRID [0 - 3] - //Byte order [4] - //WKB type [5 - 8] - //X [9 - 16] - //Y [17 - 24] - //The byte order may be either 1 or 0 to indicate little-endian or - //big-endian storage. The little-endian and big-endian byte orders - //are also known as Network Data Representation (NDR) and External - //Data Representation (XDR), respectively. - - //The WKB type is a code that indicates the geometry type. Values - //from 1 through 7 indicate Point, LineString, Polygon, MultiPoint, - //MultiLineString, MultiPolygon, and GeometryCollection. - - public struct MySqlGeometry : IMySqlValue - { - private readonly MySqlDbType _type; - private readonly Double _xValue; - private readonly Double _yValue; - private readonly int _srid; - - private const int GEOMETRY_LENGTH = 25; - - public Double? XCoordinate => _xValue; - - public Double? YCoordinate => _yValue; - - public int? SRID => _srid; - - public MySqlGeometry(bool isNull):this(MySqlDbType.Geometry, isNull) - { - } - - public MySqlGeometry(Double xValue, Double yValue) - : this(MySqlDbType.Geometry, xValue, yValue, 0) - { } - - public MySqlGeometry(Double xValue, Double yValue, int srid) - : this(MySqlDbType.Geometry, xValue, yValue, srid) - { } - - - internal MySqlGeometry(MySqlDbType type, bool isNull) - { - this._type = type; - isNull = true; - _xValue = 0; - _yValue = 0; - _srid = 0; - Value = null; - this.IsNull = isNull; - } - - - internal MySqlGeometry(MySqlDbType type, Double xValue, Double yValue, int srid) - { - this._type = type; - this._xValue = xValue; - this._yValue = yValue; - this.IsNull = false; - this._srid = srid; - this.Value = new byte[GEOMETRY_LENGTH]; - - byte[] sridBinary = BitConverter.GetBytes(srid); - - for (int i = 0; i < sridBinary.Length; i++) - Value[i] = sridBinary[i]; - - long xVal = BitConverter.DoubleToInt64Bits(xValue); - long yVal = BitConverter.DoubleToInt64Bits(yValue); - - Value[4] = 1; - Value[5] = 1; - - for (int i = 0; i < 8; i++) - { - Value[i + 9] = (byte)(xVal & 0xff); - xVal >>= 8; - } - - for (int i = 0; i < 8; i++) - { - Value[i + 17] = (byte)(yVal & 0xff); - yVal >>= 8; - } - } - - public MySqlGeometry(MySqlDbType type, byte[] val) - { - - if (val == null) - throw new ArgumentNullException(nameof(val)); - - byte[] buffValue = new byte[val.Length]; - - for (int i = 0; i < val.Length; i++) - buffValue[i] = val[i]; - - var xIndex = val.Length == GEOMETRY_LENGTH ? 9 : 5; - var yIndex = val.Length == GEOMETRY_LENGTH ? 17 : 13; - - Value = buffValue; - _xValue = BitConverter.ToDouble(val, xIndex); - _yValue = BitConverter.ToDouble(val, yIndex); - this._srid = val.Length == GEOMETRY_LENGTH ? BitConverter.ToInt32(val, 0) : 0; - this.IsNull = false; - this._type = type; - } - - #region IMySqlValue Members - - - MySqlDbType IMySqlValue.MySqlDbType => _type; - - public bool IsNull { get; } - - - object IMySqlValue.Value => Value; - - public byte[] Value { get; } - - Type IMySqlValue.SystemType => typeof(byte[]); - - string IMySqlValue.MySqlTypeName => "GEOMETRY"; - - void IMySqlValue.WriteValue(MySqlPacket packet, bool binary, object val, int length) - { - byte[] buffToWrite = null; - - try - { - buffToWrite = ((MySqlGeometry)val).Value; - } - catch - { - buffToWrite = val as Byte[]; - } - - if (buffToWrite == null) - { - MySqlGeometry v = new MySqlGeometry(0, 0); - MySqlGeometry.TryParse(val.ToString(), out v); - buffToWrite = v.Value; - } - - byte[] result = new byte[GEOMETRY_LENGTH]; - - for (int i = 0; i < buffToWrite.Length; i++) - { - if (buffToWrite.Length < GEOMETRY_LENGTH) - result[i + 4] = buffToWrite[i]; - else - result[i] = buffToWrite[i]; - } - - packet.WriteStringNoNull("_binary "); - packet.WriteByte((byte)'\''); - EscapeByteArray(result, GEOMETRY_LENGTH, packet); - packet.WriteByte((byte)'\''); - } - - private static void EscapeByteArray(byte[] bytes, int length, MySqlPacket packet) - { - for (int x = 0; x < length; x++) - { - byte b = bytes[x]; - if (b == '\0') - { - packet.WriteByte((byte)'\\'); - packet.WriteByte((byte)'0'); - } - - else if (b == '\\' || b == '\'' || b == '\"') - { - packet.WriteByte((byte)'\\'); - packet.WriteByte(b); - } - else - packet.WriteByte(b); - } - } - - IMySqlValue IMySqlValue.ReadValue(MySqlPacket packet, long length, bool nullVal) - { - MySqlGeometry g; - if (nullVal) - g = new MySqlGeometry(_type, true); - else - { - if (length == -1) - length = (long)packet.ReadFieldLength(); - - byte[] newBuff = new byte[length]; - packet.Read(newBuff, 0, (int)length); - g = new MySqlGeometry(_type, newBuff); - } - return g; - } - - void IMySqlValue.SkipValue(MySqlPacket packet) - { - int len = (int)packet.ReadFieldLength(); - packet.Position += len; - } - - #endregion - - - /// Returns the Well-Known Text representation of this value - /// POINT({0} {1})", longitude, latitude - /// http://dev.mysql.com/doc/refman/4.1/en/gis-wkt-format.html - public override string ToString() - { - if (!this.IsNull) - return _srid != 0 ? string.Format(CultureInfo.InvariantCulture.NumberFormat, "SRID={2};POINT({0} {1})", _xValue, _yValue, _srid) : string.Format(CultureInfo.InvariantCulture.NumberFormat, "POINT({0} {1})", _xValue, _yValue); - - return String.Empty; - } - - /// - /// Get value from WKT format - /// SRID=0;POINT (x y) or POINT (x y) - /// - /// WKT string format - public static MySqlGeometry Parse(string value) - { - if (String.IsNullOrEmpty(value)) - throw new ArgumentNullException(nameof(value)); - - if (!(value.Contains("SRID") || value.Contains("POINT(") || value.Contains("POINT ("))) - throw new FormatException("String does not contain a valid geometry value"); - - MySqlGeometry result = new MySqlGeometry(0,0); - MySqlGeometry.TryParse(value, out result); - - return result; - } - - /// - /// Try to get value from WKT format - /// SRID=0;POINT (x y) or POINT (x y) - /// - /// WKT string format - /// Out mysqlGeometryValue - public static bool TryParse(string value, out MySqlGeometry mySqlGeometryValue) - { - string[] arrayResult = new string[0]; - string strResult = string.Empty; - bool hasX = false; - bool hasY = false; - Double xVal = 0; - Double yVal = 0; - int sridValue = 0; - - try - { - if (value.Contains(";")) - arrayResult = value.Split(';'); - else - strResult = value; - - if (arrayResult.Length > 1 || strResult != String.Empty) - { - string point = strResult != String.Empty ? strResult : arrayResult[1]; - point = point.Replace("POINT (", "").Replace("POINT(", "").Replace(")", ""); - var coord = point.Split(' '); - if (coord.Length > 1) - { - hasX = Double.TryParse(coord[0], out xVal); - hasY = Double.TryParse(coord[1], out yVal); - } - if (arrayResult.Length >= 1) - Int32.TryParse(arrayResult[0].Replace("SRID=", ""), out sridValue); - } - if (hasX && hasY) - { - mySqlGeometryValue = new MySqlGeometry(xVal, yVal, sridValue); - return true; - } - } - catch - { } - - mySqlGeometryValue = new MySqlGeometry(true); - return false; - } - - public static void SetDSInfo(MySqlSchemaCollection dsTable) - { - // we use name indexing because this method will only be called - // when GetSchema is called for the DataSourceInformation - // collection and then it wil be cached. - MySqlSchemaRow row = dsTable.AddRow(); - row["TypeName"] = "GEOMETRY"; - row["ProviderDbType"] = MySqlDbType.Geometry; - row["ColumnSize"] = GEOMETRY_LENGTH; - row["CreateFormat"] = "GEOMETRY"; - row["CreateParameters"] = DBNull.Value; ; - row["DataType"] = "System.Byte[]"; - row["IsAutoincrementable"] = false; - row["IsBestMatch"] = true; - row["IsCaseSensitive"] = false; - row["IsFixedLength"] = false; - row["IsFixedPrecisionScale"] = true; - row["IsLong"] = false; - row["IsNullable"] = true; - row["IsSearchable"] = true; - row["IsSearchableWithLike"] = false; - row["IsUnsigned"] = false; - row["MaximumScale"] = 0; - row["MinimumScale"] = 0; - row["IsConcurrencyType"] = DBNull.Value; - row["IsLiteralSupported"] = false; - row["LiteralPrefix"] = DBNull.Value; - row["LiteralSuffix"] = DBNull.Value; - row["NativeDataType"] = DBNull.Value; - } - - public string GetWKT() - { - if (!this.IsNull) - return string.Format(CultureInfo.InvariantCulture.NumberFormat, "POINT({0} {1})", _xValue, _yValue); - - return String.Empty; - } - } -} diff --git a/Source/MySql.Data/Types/MySqlGuid.cs b/Source/MySql.Data/Types/MySqlGuid.cs deleted file mode 100644 index 2746dcd4a..000000000 --- a/Source/MySql.Data/Types/MySqlGuid.cs +++ /dev/null @@ -1,204 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using MySql.Data.MySqlClient; - - -namespace MySql.Data.Types -{ - - internal struct MySqlGuid : IMySqlValue - { - public MySqlGuid(byte[] buff) - { - OldGuids = false; - Value = new Guid(buff); - IsNull = false; - Bytes = buff; - } - - public byte[] Bytes { get; } - - public bool OldGuids { get; set; } - - #region IMySqlValue Members - - public bool IsNull { get; private set; } - - MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.Guid; - - object IMySqlValue.Value => Value; - - public Guid Value { get; private set; } - - Type IMySqlValue.SystemType => typeof(Guid); - - string IMySqlValue.MySqlTypeName => OldGuids ? "BINARY(16)" : "CHAR(36)"; - - void IMySqlValue.WriteValue(MySqlPacket packet, bool binary, object val, int length) - { - Guid guid = Guid.Empty; - string valAsString = val as string; - byte[] valAsByte = val as byte[]; - - if (val is Guid) - guid = (Guid)val; - else - { - try - { - if (valAsString != null) - guid = new Guid(valAsString); - else if (valAsByte != null) - guid = new Guid(valAsByte); - } - catch (Exception ex) - { - throw new MySqlException(Resources.DataNotInSupportedFormat, ex); - } - } - - if (OldGuids) - WriteOldGuid(packet, guid, binary); - else - { - guid.ToString("D"); - - if (binary) - packet.WriteLenString(guid.ToString("D")); - else - packet.WriteStringNoNull("'" + MySqlHelper.EscapeString(guid.ToString("D")) + "'"); - } - } - - private void WriteOldGuid(MySqlPacket packet, Guid guid, bool binary) - { - byte[] bytes = guid.ToByteArray(); - - if (binary) - { - packet.WriteLength(bytes.Length); - packet.Write(bytes); - } - else - { - packet.WriteStringNoNull("_binary "); - packet.WriteByte((byte)'\''); - EscapeByteArray(bytes, bytes.Length, packet); - packet.WriteByte((byte)'\''); - } - } - - private static void EscapeByteArray(byte[] bytes, int length, MySqlPacket packet) - { - for (int x = 0; x < length; x++) - { - byte b = bytes[x]; - if (b == '\0') - { - packet.WriteByte((byte)'\\'); - packet.WriteByte((byte)'0'); - } - - else if (b == '\\' || b == '\'' || b == '\"') - { - packet.WriteByte((byte)'\\'); - packet.WriteByte(b); - } - else - packet.WriteByte(b); - } - } - - private MySqlGuid ReadOldGuid(MySqlPacket packet, long length) - { - if (length == -1) - length = (long)packet.ReadFieldLength(); - - byte[] buff = new byte[length]; - packet.Read(buff, 0, (int)length); - MySqlGuid g = new MySqlGuid(buff); - g.OldGuids = OldGuids; - return g; - } - - IMySqlValue IMySqlValue.ReadValue(MySqlPacket packet, long length, bool nullVal) - { - MySqlGuid g = new MySqlGuid(); - g.IsNull = true; - g.OldGuids = OldGuids; - if (!nullVal) - { - if (OldGuids) - return ReadOldGuid(packet, length); - string s = String.Empty; - if (length == -1) - s = packet.ReadLenString(); - else - s = packet.ReadString(length); - g.Value = new Guid(s); - g.IsNull = false; - } - return g; - } - - void IMySqlValue.SkipValue(MySqlPacket packet) - { - int len = (int)packet.ReadFieldLength(); - packet.Position += len; - } - - #endregion - - public static void SetDSInfo(MySqlSchemaCollection sc) - { - // we use name indexing because this method will only be called - // when GetSchema is called for the DataSourceInformation - // collection and then it wil be cached. - MySqlSchemaRow row = sc.AddRow(); - row["TypeName"] = "GUID"; - row["ProviderDbType"] = MySqlDbType.Guid; - row["ColumnSize"] = 0; - row["CreateFormat"] = "BINARY(16)"; - row["CreateParameters"] = null; - row["DataType"] = "System.Guid"; - row["IsAutoincrementable"] = false; - row["IsBestMatch"] = true; - row["IsCaseSensitive"] = false; - row["IsFixedLength"] = true; - row["IsFixedPrecisionScale"] = true; - row["IsLong"] = false; - row["IsNullable"] = true; - row["IsSearchable"] = false; - row["IsSearchableWithLike"] = false; - row["IsUnsigned"] = false; - row["MaximumScale"] = 0; - row["MinimumScale"] = 0; - row["IsConcurrencyType"] = DBNull.Value; - row["IsLiteralSupported"] = false; - row["LiteralPrefix"] = null; - row["LiteralSuffix"] = null; - row["NativeDataType"] = null; - } - } -} diff --git a/Source/MySql.Data/Types/MySqlInt16.cs b/Source/MySql.Data/Types/MySqlInt16.cs deleted file mode 100644 index 7fe1c6e7a..000000000 --- a/Source/MySql.Data/Types/MySqlInt16.cs +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using MySql.Data.MySqlClient; - -namespace MySql.Data.Types -{ - internal struct MySqlInt16 : IMySqlValue - { - public MySqlInt16(bool isNull) - { - IsNull = isNull; - Value = 0; - } - - public MySqlInt16(short val) - { - IsNull = false; - Value = val; - } - - #region IMySqlValue Members - - public bool IsNull { get; } - - MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.Int16; - - object IMySqlValue.Value => Value; - - public short Value { get; } - - Type IMySqlValue.SystemType => typeof(short); - - string IMySqlValue.MySqlTypeName => "SMALLINT"; - - void IMySqlValue.WriteValue(MySqlPacket packet, bool binary, object val, int length) - { - int v = val as int? ?? Convert.ToInt32(val); - if (binary) - packet.WriteInteger((long)v, 2); - else - packet.WriteStringNoNull(v.ToString()); - } - - IMySqlValue IMySqlValue.ReadValue(MySqlPacket packet, long length, bool nullVal) - { - if (nullVal) - return new MySqlInt16(true); - - if (length == -1) - return new MySqlInt16((short)packet.ReadInteger(2)); - else - return new MySqlInt16(Int16.Parse(packet.ReadString(length))); - } - - void IMySqlValue.SkipValue(MySqlPacket packet) - { - packet.Position += 2; - } - - #endregion - - internal static void SetDSInfo(MySqlSchemaCollection sc) - { - // we use name indexing because this method will only be called - // when GetSchema is called for the DataSourceInformation - // collection and then it wil be cached. - MySqlSchemaRow row = sc.AddRow(); - row["TypeName"] = "SMALLINT"; - row["ProviderDbType"] = MySqlDbType.Int16; - row["ColumnSize"] = 0; - row["CreateFormat"] = "SMALLINT"; - row["CreateParameters"] = null; - row["DataType"] = "System.Int16"; - row["IsAutoincrementable"] = true; - row["IsBestMatch"] = true; - row["IsCaseSensitive"] = false; - row["IsFixedLength"] = true; - row["IsFixedPrecisionScale"] = true; - row["IsLong"] = false; - row["IsNullable"] = true; - row["IsSearchable"] = true; - row["IsSearchableWithLike"] = false; - row["IsUnsigned"] = false; - row["MaximumScale"] = 0; - row["MinimumScale"] = 0; - row["IsConcurrencyType"] = DBNull.Value; - row["IsLiteralSupported"] = false; - row["LiteralPrefix"] = null; - row["LiteralSuffix"] = null; - row["NativeDataType"] = null; - } - } -} diff --git a/Source/MySql.Data/Types/MySqlInt32.cs b/Source/MySql.Data/Types/MySqlInt32.cs deleted file mode 100644 index b101f3138..000000000 --- a/Source/MySql.Data/Types/MySqlInt32.cs +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Globalization; -using MySql.Data.MySqlClient; - -namespace MySql.Data.Types -{ - internal struct MySqlInt32 : IMySqlValue - { - private readonly int _value; - private readonly bool _is24Bit; - - private MySqlInt32(MySqlDbType type) - { - _is24Bit = type == MySqlDbType.Int24; - IsNull = true; - _value = 0; - } - - public MySqlInt32(MySqlDbType type, bool isNull) - : this(type) - { - IsNull = isNull; - } - - public MySqlInt32(MySqlDbType type, int val) - : this(type) - { - IsNull = false; - _value = val; - } - - #region IMySqlValue Members - - public bool IsNull { get; } - - MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.Int32; - - object IMySqlValue.Value => _value; - - public int Value => _value; - - Type IMySqlValue.SystemType => typeof(Int32); - - string IMySqlValue.MySqlTypeName => _is24Bit ? "MEDIUMINT" : "INT"; - - void IMySqlValue.WriteValue(MySqlPacket packet, bool binary, object val, int length) - { - int v = val as int? ?? Convert.ToInt32(val); - if (binary) - packet.WriteInteger((long)v, _is24Bit ? 3 : 4); - else - packet.WriteStringNoNull(v.ToString()); - } - - IMySqlValue IMySqlValue.ReadValue(MySqlPacket packet, long length, bool nullVal) - { - if (nullVal) - return new MySqlInt32((this as IMySqlValue).MySqlDbType, true); - - if (length == -1) - return new MySqlInt32((this as IMySqlValue).MySqlDbType, - packet.ReadInteger(4)); - else - return new MySqlInt32((this as IMySqlValue).MySqlDbType, - Int32.Parse(packet.ReadString(length), - CultureInfo.InvariantCulture)); - } - - void IMySqlValue.SkipValue(MySqlPacket packet) - { - packet.Position += 4; - } - - #endregion - - internal static void SetDSInfo(MySqlSchemaCollection sc) - { - string[] types = new string[] { "INT", "YEAR", "MEDIUMINT" }; - MySqlDbType[] dbtype = new MySqlDbType[] { MySqlDbType.Int32, - MySqlDbType.Year, MySqlDbType.Int24 }; - - // we use name indexing because this method will only be called - // when GetSchema is called for the DataSourceInformation - // collection and then it wil be cached. - for (int x = 0; x < types.Length; x++) - { - MySqlSchemaRow row = sc.AddRow(); - row["TypeName"] = types[x]; - row["ProviderDbType"] = dbtype[x]; - row["ColumnSize"] = 0; - row["CreateFormat"] = types[x]; - row["CreateParameters"] = null; - row["DataType"] = "System.Int32"; - row["IsAutoincrementable"] = dbtype[x] != MySqlDbType.Year; - row["IsBestMatch"] = true; - row["IsCaseSensitive"] = false; - row["IsFixedLength"] = true; - row["IsFixedPrecisionScale"] = true; - row["IsLong"] = false; - row["IsNullable"] = true; - row["IsSearchable"] = true; - row["IsSearchableWithLike"] = false; - row["IsUnsigned"] = false; - row["MaximumScale"] = 0; - row["MinimumScale"] = 0; - row["IsConcurrencyType"] = DBNull.Value; - row["IsLiteralSupported"] = false; - row["LiteralPrefix"] = null; - row["LiteralSuffix"] = null; - row["NativeDataType"] = null; - } - } - } -} diff --git a/Source/MySql.Data/Types/MySqlInt64.cs b/Source/MySql.Data/Types/MySqlInt64.cs deleted file mode 100644 index f9e2cabff..000000000 --- a/Source/MySql.Data/Types/MySqlInt64.cs +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using MySql.Data.MySqlClient; - -namespace MySql.Data.Types -{ - internal struct MySqlInt64 : IMySqlValue - { - public MySqlInt64(bool isNull) - { - IsNull = isNull; - Value = 0; - } - - public MySqlInt64(long val) - { - IsNull = false; - Value = val; - } - - #region IMySqlValue Members - - public bool IsNull { get; } - - MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.Int64; - - object IMySqlValue.Value => Value; - - public long Value { get; } - - Type IMySqlValue.SystemType => typeof(long); - - string IMySqlValue.MySqlTypeName - { - get { return "BIGINT"; } - } - - void IMySqlValue.WriteValue(MySqlPacket packet, bool binary, object val, int length) - { - long v = val as Int64? ?? Convert.ToInt64(val); - if (binary) - packet.WriteInteger(v, 8); - else - packet.WriteStringNoNull(v.ToString()); - } - - IMySqlValue IMySqlValue.ReadValue(MySqlPacket packet, long length, bool nullVal) - { - if (nullVal) - return new MySqlInt64(true); - - if (length == -1) - return new MySqlInt64((long)packet.ReadULong(8)); - else - return new MySqlInt64(Int64.Parse(packet.ReadString(length))); - } - - void IMySqlValue.SkipValue(MySqlPacket packet) - { - packet.Position += 8; - } - - #endregion - - internal static void SetDSInfo(MySqlSchemaCollection sc) - { - // we use name indexing because this method will only be called - // when GetSchema is called for the DataSourceInformation - // collection and then it wil be cached. - MySqlSchemaRow row = sc.AddRow(); - row["TypeName"] = "BIGINT"; - row["ProviderDbType"] = MySqlDbType.Int64; - row["ColumnSize"] = 0; - row["CreateFormat"] = "BIGINT"; - row["CreateParameters"] = null; - row["DataType"] = "System.Int64"; - row["IsAutoincrementable"] = true; - row["IsBestMatch"] = true; - row["IsCaseSensitive"] = false; - row["IsFixedLength"] = true; - row["IsFixedPrecisionScale"] = true; - row["IsLong"] = false; - row["IsNullable"] = true; - row["IsSearchable"] = true; - row["IsSearchableWithLike"] = false; - row["IsUnsigned"] = false; - row["MaximumScale"] = 0; - row["MinimumScale"] = 0; - row["IsConcurrencyType"] = DBNull.Value; - row["IsLiteralSupported"] = false; - row["LiteralPrefix"] = null; - row["LiteralSuffix"] = null; - row["NativeDataType"] = null; - } - } -} diff --git a/Source/MySql.Data/Types/MySqlSingle.cs b/Source/MySql.Data/Types/MySqlSingle.cs deleted file mode 100644 index c8f737567..000000000 --- a/Source/MySql.Data/Types/MySqlSingle.cs +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Globalization; -using MySql.Data.MySqlClient; - -namespace MySql.Data.Types -{ - internal struct MySqlSingle : IMySqlValue - { - public MySqlSingle(bool isNull) - { - IsNull = isNull; - Value = 0.0f; - } - - public MySqlSingle(float val) - { - IsNull = false; - Value = val; - } - - #region IMySqlValue Members - - public bool IsNull { get; } - - MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.Float; - - object IMySqlValue.Value => Value; - - public float Value { get; } - - Type IMySqlValue.SystemType => typeof(float); - - string IMySqlValue.MySqlTypeName - { - get { return "FLOAT"; } - } - - void IMySqlValue.WriteValue(MySqlPacket packet, bool binary, object val, int length) - { - Single v = val as Single? ?? Convert.ToSingle(val); - if (binary) - packet.Write(BitConverter.GetBytes(v)); - else - packet.WriteStringNoNull(v.ToString("R", - CultureInfo.InvariantCulture)); - } - - IMySqlValue IMySqlValue.ReadValue(MySqlPacket packet, long length, bool nullVal) - { - if (nullVal) - return new MySqlSingle(true); - - if (length == -1) - { - byte[] b = new byte[4]; - packet.Read(b, 0, 4); - return new MySqlSingle(BitConverter.ToSingle(b, 0)); - } - return new MySqlSingle(Single.Parse(packet.ReadString(length), - CultureInfo.InvariantCulture)); - } - - void IMySqlValue.SkipValue(MySqlPacket packet) - { - packet.Position += 4; - } - - #endregion - - internal static void SetDSInfo(MySqlSchemaCollection sc) - { - // we use name indexing because this method will only be called - // when GetSchema is called for the DataSourceInformation - // collection and then it wil be cached. - MySqlSchemaRow row = sc.AddRow(); - row["TypeName"] = "FLOAT"; - row["ProviderDbType"] = MySqlDbType.Float; - row["ColumnSize"] = 0; - row["CreateFormat"] = "FLOAT"; - row["CreateParameters"] = null; - row["DataType"] = "System.Single"; - row["IsAutoincrementable"] = false; - row["IsBestMatch"] = true; - row["IsCaseSensitive"] = false; - row["IsFixedLength"] = true; - row["IsFixedPrecisionScale"] = true; - row["IsLong"] = false; - row["IsNullable"] = true; - row["IsSearchable"] = true; - row["IsSearchableWithLike"] = false; - row["IsUnsigned"] = false; - row["MaximumScale"] = 0; - row["MinimumScale"] = 0; - row["IsConcurrencyType"] = DBNull.Value; - row["IsLiteralSupported"] = false; - row["LiteralPrefix"] = null; - row["LiteralSuffix"] = null; - row["NativeDataType"] = null; - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data/Types/MySqlString.cs b/Source/MySql.Data/Types/MySqlString.cs deleted file mode 100644 index 85357c015..000000000 --- a/Source/MySql.Data/Types/MySqlString.cs +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using MySql.Data.MySqlClient; - -namespace MySql.Data.Types -{ - internal struct MySqlString : IMySqlValue - { - private readonly MySqlDbType _type; - - public MySqlString(MySqlDbType type, bool isNull) - { - _type = type; - IsNull = isNull; - Value = String.Empty; - } - - public MySqlString(MySqlDbType type, string val) - { - _type = type; - IsNull = false; - Value = val; - } - - #region IMySqlValue Members - - public bool IsNull { get; } - - MySqlDbType IMySqlValue.MySqlDbType => _type; - - object IMySqlValue.Value => Value; - - public string Value { get; } - - Type IMySqlValue.SystemType => typeof(string); - - string IMySqlValue.MySqlTypeName => _type == MySqlDbType.Set ? "SET" : _type == MySqlDbType.Enum ? "ENUM" : "VARCHAR"; - - - void IMySqlValue.WriteValue(MySqlPacket packet, bool binary, object val, int length) - { - string v = val.ToString(); - if (length > 0) - { - length = Math.Min(length, v.Length); - v = v.Substring(0, length); - } - - if (binary) - packet.WriteLenString(v); - else - packet.WriteStringNoNull("'" + MySqlHelper.EscapeString(v) + "'"); - } - - IMySqlValue IMySqlValue.ReadValue(MySqlPacket packet, long length, bool nullVal) - { - if (nullVal) - return new MySqlString(_type, true); - - string s = String.Empty; - if (length == -1) - s = packet.ReadLenString(); - else - s = packet.ReadString(length); - MySqlString str = new MySqlString(_type, s); - return str; - } - - void IMySqlValue.SkipValue(MySqlPacket packet) - { - int len = (int)packet.ReadFieldLength(); - packet.Position += len; - } - - #endregion - - internal static void SetDSInfo(MySqlSchemaCollection sc) - { - string[] types = new string[] { "CHAR", "NCHAR", "VARCHAR", "NVARCHAR", "SET", - "ENUM", "TINYTEXT", "TEXT", "MEDIUMTEXT", "LONGTEXT" }; - MySqlDbType[] dbtype = new MySqlDbType[] { MySqlDbType.String, MySqlDbType.String, - MySqlDbType.VarChar, MySqlDbType.VarChar, MySqlDbType.Set, MySqlDbType.Enum, - MySqlDbType.TinyText, MySqlDbType.Text, MySqlDbType.MediumText, - MySqlDbType.LongText }; - - // we use name indexing because this method will only be called - // when GetSchema is called for the DataSourceInformation - // collection and then it wil be cached. - for (int x = 0; x < types.Length; x++) - { - MySqlSchemaRow row = sc.AddRow(); - row["TypeName"] = types[x]; - row["ProviderDbType"] = dbtype[x]; - row["ColumnSize"] = 0; - row["CreateFormat"] = x < 4 ? types[x] + "({0})" : types[x]; - row["CreateParameters"] = x < 4 ? "size" : null; - row["DataType"] = "System.String"; - row["IsAutoincrementable"] = false; - row["IsBestMatch"] = true; - row["IsCaseSensitive"] = false; - row["IsFixedLength"] = false; - row["IsFixedPrecisionScale"] = true; - row["IsLong"] = false; - row["IsNullable"] = true; - row["IsSearchable"] = true; - row["IsSearchableWithLike"] = true; - row["IsUnsigned"] = false; - row["MaximumScale"] = 0; - row["MinimumScale"] = 0; - row["IsConcurrencyType"] = DBNull.Value; - row["IsLiteralSupported"] = false; - row["LiteralPrefix"] = null; - row["LiteralSuffix"] = null; - row["NativeDataType"] = null; - } - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data/Types/MySqlTime.cs b/Source/MySql.Data/Types/MySqlTime.cs deleted file mode 100644 index 47bf950fa..000000000 --- a/Source/MySql.Data/Types/MySqlTime.cs +++ /dev/null @@ -1,199 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using MySql.Data.MySqlClient; - -namespace MySql.Data.Types -{ - internal struct MySqlTimeSpan : IMySqlValue - { - public MySqlTimeSpan(bool isNull) - { - IsNull = isNull; - Value = TimeSpan.MinValue; - } - - public MySqlTimeSpan(TimeSpan val) - { - IsNull = false; - Value = val; - } - - #region IMySqlValue Members - - public bool IsNull { get; private set; } - - MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.Time; - - object IMySqlValue.Value => Value; - - public TimeSpan Value { get; private set; } - - Type IMySqlValue.SystemType => typeof(TimeSpan); - - string IMySqlValue.MySqlTypeName => "TIME"; - - void IMySqlValue.WriteValue(MySqlPacket packet, bool binary, object val, int length) - { - if (!(val is TimeSpan)) - throw new MySqlException("Only TimeSpan objects can be serialized by MySqlTimeSpan"); - - TimeSpan ts = (TimeSpan)val; - bool negative = ts.TotalMilliseconds < 0; - ts = ts.Duration(); - - if (binary) - { - if (ts.Milliseconds > 0) - packet.WriteByte(12); - else - packet.WriteByte(8); - - packet.WriteByte((byte)(negative ? 1 : 0)); - packet.WriteInteger(ts.Days, 4); - packet.WriteByte((byte)ts.Hours); - packet.WriteByte((byte)ts.Minutes); - packet.WriteByte((byte)ts.Seconds); - if (ts.Milliseconds > 0) - { - long mval = ts.Milliseconds*1000; - packet.WriteInteger(mval, 4); - } - } - else - { - String s = $"'{(negative ? "-" : "")}{ts.Days} {ts.Hours:00}:{ts.Minutes:00}:{ts.Seconds:00}.{ts.Ticks%10000000:000000}'"; - - packet.WriteStringNoNull(s); - } - } - - - IMySqlValue IMySqlValue.ReadValue(MySqlPacket packet, long length, bool nullVal) - { - if (nullVal) return new MySqlTimeSpan(true); - - if (length >= 0) - { - string value = packet.ReadString(length); - ParseMySql(value); - return this; - } - - long bufLength = packet.ReadByte(); - int negate = 0; - if (bufLength > 0) - negate = packet.ReadByte(); - - IsNull = false; - if (bufLength == 0) - IsNull = true; - else if (bufLength == 5) - Value = new TimeSpan(packet.ReadInteger(4), 0, 0, 0); - else if (bufLength == 8) - Value = new TimeSpan(packet.ReadInteger(4), - packet.ReadByte(), packet.ReadByte(), packet.ReadByte()); - else - Value = new TimeSpan(packet.ReadInteger(4), - packet.ReadByte(), packet.ReadByte(), packet.ReadByte(), - packet.ReadInteger(4) / 1000000); - - if (negate == 1) - Value = Value.Negate(); - return this; - } - - void IMySqlValue.SkipValue(MySqlPacket packet) - { - int len = packet.ReadByte(); - packet.Position += len; - } - - #endregion - - internal static void SetDSInfo(MySqlSchemaCollection sc) - { - // we use name indexing because this method will only be called - // when GetSchema is called for the DataSourceInformation - // collection and then it wil be cached. - MySqlSchemaRow row = sc.AddRow(); - row["TypeName"] = "TIME"; - row["ProviderDbType"] = MySqlDbType.Time; - row["ColumnSize"] = 0; - row["CreateFormat"] = "TIME"; - row["CreateParameters"] = null; - row["DataType"] = "System.TimeSpan"; - row["IsAutoincrementable"] = false; - row["IsBestMatch"] = true; - row["IsCaseSensitive"] = false; - row["IsFixedLength"] = true; - row["IsFixedPrecisionScale"] = true; - row["IsLong"] = false; - row["IsNullable"] = true; - row["IsSearchable"] = true; - row["IsSearchableWithLike"] = false; - row["IsUnsigned"] = false; - row["MaximumScale"] = 0; - row["MinimumScale"] = 0; - row["IsConcurrencyType"] = DBNull.Value; - row["IsLiteralSupported"] = false; - row["LiteralPrefix"] = null; - row["LiteralSuffix"] = null; - row["NativeDataType"] = null; - } - - public override string ToString() - { - return $"{Value.Days} {Value.Hours:00}:{Value.Minutes:00}:{Value.Seconds:00}"; - } - - private void ParseMySql(string s) - { - - string[] parts = s.Split(':', '.'); - int hours = Int32.Parse(parts[0]); - int mins = Int32.Parse(parts[1]); - int secs = Int32.Parse(parts[2]); - int nanoseconds = 0; - - if (parts.Length > 3) - { - //if the data is saved in MySql as Time(3) the division by 1000 always returns 0, but handling the data as Time(6) the result is the expected - parts[3] = parts[3].PadRight(7, '0'); - nanoseconds = int.Parse(parts[3]); - } - - - if (hours < 0 || parts[0].StartsWith("-", StringComparison.Ordinal)) - { - mins *= -1; - secs *= -1; - nanoseconds *= -1; - } - int days = hours / 24; - hours = hours - (days * 24); - Value = new TimeSpan(days, hours, mins, secs).Add(new TimeSpan(nanoseconds)); - IsNull = false; - } - } -} diff --git a/Source/MySql.Data/Types/MySqlUByte.cs b/Source/MySql.Data/Types/MySqlUByte.cs deleted file mode 100644 index 2d19e8628..000000000 --- a/Source/MySql.Data/Types/MySqlUByte.cs +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using MySql.Data.MySqlClient; - -namespace MySql.Data.Types -{ - internal struct MySqlUByte : IMySqlValue - { - public MySqlUByte(bool isNull) - { - IsNull = isNull; - Value = 0; - } - - public MySqlUByte(byte val) - { - IsNull = false; - Value = val; - } - - #region IMySqlValue Members - - public bool IsNull { get; } - - MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.UByte; - - object IMySqlValue.Value => Value; - - public byte Value { get; } - - Type IMySqlValue.SystemType => typeof(byte); - - string IMySqlValue.MySqlTypeName => "TINYINT"; - - void IMySqlValue.WriteValue(MySqlPacket packet, bool binary, object val, int length) - { - byte v = val as byte? ?? Convert.ToByte(val); - if (binary) - packet.WriteByte(v); - else - packet.WriteStringNoNull(v.ToString()); - } - - IMySqlValue IMySqlValue.ReadValue(MySqlPacket packet, long length, bool nullVal) - { - if (nullVal) - return new MySqlUByte(true); - - if (length == -1) - return new MySqlUByte((byte)packet.ReadByte()); - else - return new MySqlUByte(Byte.Parse(packet.ReadString(length))); - } - - void IMySqlValue.SkipValue(MySqlPacket packet) - { - packet.ReadByte(); - } - - #endregion - - internal static void SetDSInfo(MySqlSchemaCollection sc) - { - // we use name indexing because this method will only be called - // when GetSchema is called for the DataSourceInformation - // collection and then it wil be cached. - MySqlSchemaRow row = sc.AddRow(); - row["TypeName"] = "TINY INT"; - row["ProviderDbType"] = MySqlDbType.UByte; - row["ColumnSize"] = 0; - row["CreateFormat"] = "TINYINT UNSIGNED"; - row["CreateParameters"] = null; - row["DataType"] = "System.Byte"; - row["IsAutoincrementable"] = true; - row["IsBestMatch"] = true; - row["IsCaseSensitive"] = false; - row["IsFixedLength"] = true; - row["IsFixedPrecisionScale"] = true; - row["IsLong"] = false; - row["IsNullable"] = true; - row["IsSearchable"] = true; - row["IsSearchableWithLike"] = false; - row["IsUnsigned"] = true; - row["MaximumScale"] = 0; - row["MinimumScale"] = 0; - row["IsConcurrencyType"] = DBNull.Value; - row["IsLiteralSupported"] = false; - row["LiteralPrefix"] = null; - row["LiteralSuffix"] = null; - row["NativeDataType"] = null; - } - } -} diff --git a/Source/MySql.Data/Types/MySqlUInt16.cs b/Source/MySql.Data/Types/MySqlUInt16.cs deleted file mode 100644 index 8d5402a92..000000000 --- a/Source/MySql.Data/Types/MySqlUInt16.cs +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using MySql.Data.MySqlClient; - -namespace MySql.Data.Types -{ - internal struct MySqlUInt16 : IMySqlValue - { - public MySqlUInt16(bool isNull) - { - IsNull = isNull; - Value = 0; - } - - public MySqlUInt16(ushort val) - { - IsNull = false; - Value = val; - } - - #region IMySqlValue Members - - public bool IsNull { get; } - - MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.UInt16; - - object IMySqlValue.Value => Value; - - public ushort Value { get; } - - Type IMySqlValue.SystemType => typeof(ushort); - - string IMySqlValue.MySqlTypeName => "SMALLINT"; - - void IMySqlValue.WriteValue(MySqlPacket packet, bool binary, object val, int length) - { - int v = (val is UInt16) ? (UInt16)val : Convert.ToUInt16(val); - if (binary) - packet.WriteInteger((long)v, 2); - else - packet.WriteStringNoNull(v.ToString()); - } - - IMySqlValue IMySqlValue.ReadValue(MySqlPacket packet, long length, bool nullVal) - { - if (nullVal) - return new MySqlUInt16(true); - - if (length == -1) - return new MySqlUInt16((ushort)packet.ReadInteger(2)); - else - return new MySqlUInt16(UInt16.Parse(packet.ReadString(length))); - } - - void IMySqlValue.SkipValue(MySqlPacket packet) - { - packet.Position += 2; - } - - #endregion - - internal static void SetDSInfo(MySqlSchemaCollection sc) - { - // we use name indexing because this method will only be called - // when GetSchema is called for the DataSourceInformation - // collection and then it wil be cached. - MySqlSchemaRow row = sc.AddRow(); - row["TypeName"] = "SMALLINT"; - row["ProviderDbType"] = MySqlDbType.UInt16; - row["ColumnSize"] = 0; - row["CreateFormat"] = "SMALLINT UNSIGNED"; - row["CreateParameters"] = null; - row["DataType"] = "System.UInt16"; - row["IsAutoincrementable"] = true; - row["IsBestMatch"] = true; - row["IsCaseSensitive"] = false; - row["IsFixedLength"] = true; - row["IsFixedPrecisionScale"] = true; - row["IsLong"] = false; - row["IsNullable"] = true; - row["IsSearchable"] = true; - row["IsSearchableWithLike"] = false; - row["IsUnsigned"] = true; - row["MaximumScale"] = 0; - row["MinimumScale"] = 0; - row["IsConcurrencyType"] = DBNull.Value; - row["IsLiteralSupported"] = false; - row["LiteralPrefix"] = null; - row["LiteralSuffix"] = null; - row["NativeDataType"] = null; - } - } -} diff --git a/Source/MySql.Data/Types/MySqlUInt32.cs b/Source/MySql.Data/Types/MySqlUInt32.cs deleted file mode 100644 index f2116b980..000000000 --- a/Source/MySql.Data/Types/MySqlUInt32.cs +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Globalization; -using MySql.Data.MySqlClient; - -namespace MySql.Data.Types -{ - internal struct MySqlUInt32 : IMySqlValue - { - private readonly bool _is24Bit; - - private MySqlUInt32(MySqlDbType type) - { - _is24Bit = type == MySqlDbType.Int24; - IsNull = true; - Value = 0; - } - - public MySqlUInt32(MySqlDbType type, bool isNull) - : this(type) - { - IsNull = isNull; - } - - public MySqlUInt32(MySqlDbType type, uint val) - : this(type) - { - IsNull = false; - Value = val; - } - - #region IMySqlValue Members - - public bool IsNull { get; } - - MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.UInt32; - - object IMySqlValue.Value => Value; - - public uint Value { get; } - - Type IMySqlValue.SystemType => typeof(UInt32); - - string IMySqlValue.MySqlTypeName - { - get { return _is24Bit ? "MEDIUMINT" : "INT"; } - } - - void IMySqlValue.WriteValue(MySqlPacket packet, bool binary, object v, int length) - { - uint val = v as uint? ?? Convert.ToUInt32(v); - if (binary) - packet.WriteInteger((long)val, _is24Bit ? 3 : 4); - else - packet.WriteStringNoNull(val.ToString()); - } - - IMySqlValue IMySqlValue.ReadValue(MySqlPacket packet, long length, bool nullVal) - { - if (nullVal) - return new MySqlUInt32((this as IMySqlValue).MySqlDbType, true); - - if (length == -1) - return new MySqlUInt32((this as IMySqlValue).MySqlDbType, - (uint)packet.ReadInteger(4)); - else - return new MySqlUInt32((this as IMySqlValue).MySqlDbType, - UInt32.Parse(packet.ReadString(length), NumberStyles.Any, CultureInfo.InvariantCulture)); - } - - void IMySqlValue.SkipValue(MySqlPacket packet) - { - packet.Position += 4; - } - - #endregion - - internal static void SetDSInfo(MySqlSchemaCollection sc) - { - string[] types = new string[] { "MEDIUMINT", "INT" }; - MySqlDbType[] dbtype = new MySqlDbType[] { MySqlDbType.UInt24, - MySqlDbType.UInt32 }; - - // we use name indexing because this method will only be called - // when GetSchema is called for the DataSourceInformation - // collection and then it wil be cached. - for (int x = 0; x < types.Length; x++) - { - MySqlSchemaRow row = sc.AddRow(); - row["TypeName"] = types[x]; - row["ProviderDbType"] = dbtype[x]; - row["ColumnSize"] = 0; - row["CreateFormat"] = types[x] + " UNSIGNED"; - row["CreateParameters"] = null; - row["DataType"] = "System.UInt32"; - row["IsAutoincrementable"] = true; - row["IsBestMatch"] = true; - row["IsCaseSensitive"] = false; - row["IsFixedLength"] = true; - row["IsFixedPrecisionScale"] = true; - row["IsLong"] = false; - row["IsNullable"] = true; - row["IsSearchable"] = true; - row["IsSearchableWithLike"] = false; - row["IsUnsigned"] = true; - row["MaximumScale"] = 0; - row["MinimumScale"] = 0; - row["IsConcurrencyType"] = DBNull.Value; - row["IsLiteralSupported"] = false; - row["LiteralPrefix"] = null; - row["LiteralSuffix"] = null; - row["NativeDataType"] = null; - } - } - } -} diff --git a/Source/MySql.Data/Types/MySqlUInt64.cs b/Source/MySql.Data/Types/MySqlUInt64.cs deleted file mode 100644 index 0f94400ac..000000000 --- a/Source/MySql.Data/Types/MySqlUInt64.cs +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using MySql.Data.MySqlClient; - -namespace MySql.Data.Types -{ - internal struct MySqlUInt64 : IMySqlValue - { - public MySqlUInt64(bool isNull) - { - IsNull = isNull; - Value = 0; - } - - public MySqlUInt64(ulong val) - { - IsNull = false; - Value = val; - } - - #region IMySqlValue Members - - public bool IsNull { get; } - - MySqlDbType IMySqlValue.MySqlDbType => MySqlDbType.UInt64; - - object IMySqlValue.Value => Value; - - public ulong Value { get; } - - Type IMySqlValue.SystemType => typeof(ulong); - - string IMySqlValue.MySqlTypeName - { - get { return "BIGINT"; } - } - - void IMySqlValue.WriteValue(MySqlPacket packet, bool binary, object val, int length) - { - ulong v = val as ulong? ?? Convert.ToUInt64(val); - if (binary) - packet.WriteInteger((long)v, 8); - else - packet.WriteStringNoNull(v.ToString()); - } - - IMySqlValue IMySqlValue.ReadValue(MySqlPacket packet, long length, bool nullVal) - { - if (nullVal) - return new MySqlUInt64(true); - - if (length == -1) - return new MySqlUInt64(packet.ReadULong(8)); - else - return new MySqlUInt64(UInt64.Parse(packet.ReadString(length))); - } - - void IMySqlValue.SkipValue(MySqlPacket packet) - { - packet.Position += 8; - } - - #endregion - - internal static void SetDSInfo(MySqlSchemaCollection sc) - { - // we use name indexing because this method will only be called - // when GetSchema is called for the DataSourceInformation - // collection and then it wil be cached. - MySqlSchemaRow row = sc.AddRow(); - row["TypeName"] = "BIGINT"; - row["ProviderDbType"] = MySqlDbType.UInt64; - row["ColumnSize"] = 0; - row["CreateFormat"] = "BIGINT UNSIGNED"; - row["CreateParameters"] = null; - row["DataType"] = "System.UInt64"; - row["IsAutoincrementable"] = true; - row["IsBestMatch"] = true; - row["IsCaseSensitive"] = false; - row["IsFixedLength"] = true; - row["IsFixedPrecisionScale"] = true; - row["IsLong"] = false; - row["IsNullable"] = true; - row["IsSearchable"] = true; - row["IsSearchableWithLike"] = false; - row["IsUnsigned"] = true; - row["MaximumScale"] = 0; - row["MinimumScale"] = 0; - row["IsConcurrencyType"] = DBNull.Value; - row["IsLiteralSupported"] = false; - row["LiteralPrefix"] = null; - row["LiteralSuffix"] = null; - row["NativeDataType"] = null; - } - } -} diff --git a/Source/MySql.Data/Types/MySqlValue.cs b/Source/MySql.Data/Types/MySqlValue.cs deleted file mode 100644 index 5181d2b60..000000000 --- a/Source/MySql.Data/Types/MySqlValue.cs +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) 2004-2008 MySQL AB, 2008-2009 Sun Microsystems, Inc. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using MySql.Data.MySqlClient; - -namespace MySql.Data.Types -{ - internal interface IMySqlValue - { - bool IsNull { get; } - MySqlDbType MySqlDbType { get; } - object Value { get; /*set;*/ } - Type SystemType { get; } - string MySqlTypeName { get; } - - void WriteValue(MySqlPacket packet, bool binary, object value, int length); - IMySqlValue ReadValue(MySqlPacket packet, long length, bool isNull); - void SkipValue(MySqlPacket packet); - } -} diff --git a/Source/MySql.Data/Utils.cs b/Source/MySql.Data/Utils.cs deleted file mode 100644 index 8ad9fb705..000000000 --- a/Source/MySql.Data/Utils.cs +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright © 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.IO; -using System.Reflection; -using System.Text; - -namespace MySql.Data.MySqlClient -{ - internal class Utils - { - public static string ReadResource(string name) - { - string rez = ReadResourceInternal(name); - if (rez != null) return rez; - return ReadResourceInternal("MySqlClient/" + name); - } - public static string ReadResourceInternal(string name) - { -#if NETCORE10 - var assembly = typeof(Utils).GetTypeInfo().Assembly; -#else - var assembly = Assembly.GetExecutingAssembly(); -#endif - - var resName = assembly.GetName().Name + "." + name.Replace(" ", "_") - .Replace("\\", ".") - .Replace("/", "."); - var resourceStream = assembly.GetManifestResourceStream(resName); - if (resourceStream == null) return null; - - using (var reader = new StreamReader(resourceStream, Encoding.UTF8)) - { - return reader.ReadToEnd(); - } - } - } -} diff --git a/Source/MySql.Data/X/Authentication/MySQL41AuthenticationPlugin.cs b/Source/MySql.Data/X/Authentication/MySQL41AuthenticationPlugin.cs deleted file mode 100644 index 9c6fed3c8..000000000 --- a/Source/MySql.Data/X/Authentication/MySQL41AuthenticationPlugin.cs +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySql.Data; -using MySql.Data.MySqlClient; -using MySql.Data.MySqlClient.Authentication; -using System; -using System.Security.Cryptography; -using System.Text; - -namespace MySqlX.Security -{ - /// - /// Implementation of MySQL41 authentication type. - /// - internal class MySQL41AuthenticationPlugin : MySqlNativePasswordPlugin - { - private MySqlConnectionStringBuilder _settings; - - public MySQL41AuthenticationPlugin(MySqlConnectionStringBuilder settings) - { - _settings = settings; - } - - public override string PluginName - { - get { return "MySQL 4.1 Authentication Plugin"; } - } - - public string AuthName - { - get - { - return "MYSQL41"; - } - } - - public byte[] Continue(byte[] salt) - { - var encoding = Encoding.GetEncoding("utf-8"); - - byte[] userBytes = encoding.GetBytes(_settings.UserID); - byte[] databaseBytes = encoding.GetBytes(_settings.Database); - byte[] hashedPassword = new byte[0]; - byte[] hex = new byte[0]; - if (!string.IsNullOrWhiteSpace(_settings.Password)) - { - hashedPassword = Get411Password(_settings.Password, salt); - Array.Copy(hashedPassword, 1, hashedPassword, 0, hashedPassword.Length - 1); - Array.Resize(ref hashedPassword, hashedPassword.Length - 1); - //convert to hex value - hex = encoding.GetBytes(string.Format("*{0}", BitConverter.ToString(hashedPassword).Replace("-", string.Empty))); - } - - // create response - byte[] response = new byte[databaseBytes.Length + userBytes.Length + hex.Length + 2]; - databaseBytes.CopyTo(response, 0); - var index = databaseBytes.Length; - response[index++] = 0; - userBytes.CopyTo(response, index); - index += userBytes.Length; - response[index++] = 0; - hex.CopyTo(response, index); - return response; - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data/X/Communication/CommunicationPacket.cs b/Source/MySql.Data/X/Communication/CommunicationPacket.cs deleted file mode 100644 index 2d6d881c2..000000000 --- a/Source/MySql.Data/X/Communication/CommunicationPacket.cs +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.IO; -using System.Linq; - -namespace MySqlX.Communication -{ - internal class CommunicationPacket - { - - public CommunicationPacket(int messageType, int length, byte[] data) - { - MessageType = messageType; - Length = length; - Buffer = data; - } - - public byte[] Buffer; - public int MessageType; - public int Length; - } - - internal enum ClientMessageId - { - CON_CAPABILITIES_GET = 1, - CON_CAPABILITIES_SET = 2, - CON_CLOSE = 3, - - SESS_AUTHENTICATE_START = 4, - SESS_AUTHENTICATE_CONTINUE = 5, - SESS_RESET = 6, - SESS_CLOSE = 7, - - SQL_STMT_EXECUTE = 12, - - CRUD_FIND = 17, - CRUD_INSERT = 18, - CRUD_UPDATE = 19, - CRUD_DELETE = 20, - - EXPECT_OPEN = 24, - EXPECT_CLOSE = 25 - } - - - internal enum ServerMessageId - { - OK = 0, - ERROR = 1, - - CONN_CAPABILITIES = 2, - - SESS_AUTHENTICATE_CONTINUE = 3, - SESS_AUTHENTICATE_OK = 4, - - // NOTICE has to stay at 11 forever - NOTICE = 11, - - RESULTSET_COLUMN_META_DATA = 12, - RESULTSET_ROW = 13, - RESULTSET_FETCH_DONE = 14, - RESULTSET_FETCH_SUSPENDED = 15, - RESULTSET_FETCH_DONE_MORE_RESULTSETS = 16, - - SQL_STMT_EXECUTE_OK = 17, - RESULTSET_FETCH_DONE_MORE_OUT_PARAMS = 18 - } - -} diff --git a/Source/MySql.Data/X/Communication/XPacketReaderWriter.cs b/Source/MySql.Data/X/Communication/XPacketReaderWriter.cs deleted file mode 100644 index 86d9ec58b..000000000 --- a/Source/MySql.Data/X/Communication/XPacketReaderWriter.cs +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright © 2015, 2017, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Google.Protobuf; - -using System; -using System.IO; - -namespace MySqlX.Communication -{ - internal class XPacketReaderWriter - { - private Stream _stream; - - public XPacketReaderWriter(Stream stream) - { - _stream = stream; - } - - public void Write(int id, IMessage message) - { - int size = message.CalculateSize() + 1; - _stream.Write(BitConverter.GetBytes(size), 0, 4); - _stream.WriteByte((byte)id); - if(message.CalculateSize() > 0) - message.WriteTo(_stream); - _stream.Flush(); - } - - public void Write(ClientMessageId id, IMessage message) - { - Write((int)id, message); - } - - public CommunicationPacket Read() - { - byte[] header = new byte[5]; - ReadFully(header, 0, 5); - int length = BitConverter.ToInt32(header, 0); - byte[] data = new byte[length - 1]; - ReadFully(data, 0, length - 1); - return new CommunicationPacket(header[4], length - 1, data); - } - - void ReadFully(byte[] buffer, int offset, int count) - { - int numRead = 0; - int numToRead = count; - while (numToRead > 0) - { - int read = _stream.Read(buffer, offset + numRead, numToRead); - if (read == 0) - { - throw new EndOfStreamException(); - } - numRead += read; - numToRead -= read; - } - } - } -} diff --git a/Source/MySql.Data/X/Data/CollationMap.cs b/Source/MySql.Data/X/Data/CollationMap.cs deleted file mode 100644 index f62105c6e..000000000 --- a/Source/MySql.Data/X/Data/CollationMap.cs +++ /dev/null @@ -1,272 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySql.Data; -using System; -using System.Collections.Generic; - -namespace MySqlX.Data -{ - internal class CollationMap - { - private static Dictionary collations = new Dictionary(); - - static CollationMap() - { - Load(); - } - - public static string GetCollationName(int collation) - { - if (!collations.ContainsKey(collation)) - throw new KeyNotFoundException(String.Format(ResourcesX.InvalidCollationId, collation)); - return collations[collation]; - } - - private static void Load() - { - collations.Add(0, "utf8_general_ci"); - collations.Add(1, "big5_chinese_ci"); - collations.Add(84, "big5_bin"); - collations.Add(3, "dec8_swedish_ci"); - collations.Add(69, "dec8_bin"); - collations.Add(4, "cp850_general_ci"); - collations.Add(80, "cp850_bin"); - collations.Add(6, "hp8_english_ci"); - collations.Add(72, "hp8_bin"); - collations.Add(7, "koi8r_general_ci"); - collations.Add(74, "koi8r_bin"); - collations.Add(5, "latin1_german1_ci"); - collations.Add(8, "latin1_swedish_ci"); - collations.Add(15, "latin1_danish_ci"); - collations.Add(31, "latin1_german2_ci"); - collations.Add(47, "latin1_bin"); - collations.Add(48, "latin1_general_ci"); - collations.Add(49, "latin1_general_cs"); - collations.Add(94, "latin1_spanish_ci"); - collations.Add(2, "latin2_czech_cs"); - collations.Add(9, "latin2_general_ci"); - collations.Add(21, "latin2_hungarian_ci"); - collations.Add(27, "latin2_croatian_ci"); - collations.Add(77, "latin2_bin"); - collations.Add(10, "swe7_swedish_ci"); - collations.Add(82, "swe7_bin"); - collations.Add(11, "ascii_general_ci"); - collations.Add(65, "ascii_bin"); - collations.Add(12, "ujis_japanese_ci"); - collations.Add(91, "ujis_bin"); - collations.Add(13, "sjis_japanese_ci"); - collations.Add(88, "sjis_bin"); - collations.Add(16, "hebrew_general_ci"); - collations.Add(71, "hebrew_bin"); - collations.Add(18, "tis620_thai_ci"); - collations.Add(89, "tis620_bin"); - collations.Add(19, "euckr_korean_ci"); - collations.Add(85, "euckr_bin"); - collations.Add(22, "koi8u_general_ci"); - collations.Add(75, "koi8u_bin"); - collations.Add(24, "gb2312_chinese_ci"); - collations.Add(86, "gb2312_bin"); - collations.Add(25, "greek_general_ci"); - collations.Add(70, "greek_bin"); - collations.Add(26, "cp1250_general_ci"); - collations.Add(34, "cp1250_czech_cs"); - collations.Add(44, "cp1250_croatian_ci"); - collations.Add(66, "cp1250_bin"); - collations.Add(99, "cp1250_polish_ci"); - collations.Add(28, "gbk_chinese_ci"); - collations.Add(87, "gbk_bin"); - collations.Add(30, "latin5_turkish_ci"); - collations.Add(78, "latin5_bin"); - collations.Add(32, "armscii8_general_ci"); - collations.Add(64, "armscii8_bin"); - collations.Add(33, "utf8_general_ci"); - collations.Add(83, "utf8_bin"); - collations.Add(192, "utf8_unicode_ci"); - collations.Add(193, "utf8_icelandic_ci"); - collations.Add(194, "utf8_latvian_ci"); - collations.Add(195, "utf8_romanian_ci"); - collations.Add(196, "utf8_slovenian_ci"); - collations.Add(197, "utf8_polish_ci"); - collations.Add(198, "utf8_estonian_ci"); - collations.Add(199, "utf8_spanish_ci"); - collations.Add(200, "utf8_swedish_ci"); - collations.Add(201, "utf8_turkish_ci"); - collations.Add(202, "utf8_czech_ci"); - collations.Add(203, "utf8_danish_ci"); - collations.Add(204, "utf8_lithuanian_ci"); - collations.Add(205, "utf8_slovak_ci"); - collations.Add(206, "utf8_spanish2_ci"); - collations.Add(207, "utf8_roman_ci"); - collations.Add(208, "utf8_persian_ci"); - collations.Add(209, "utf8_esperanto_ci"); - collations.Add(210, "utf8_hungarian_ci"); - collations.Add(211, "utf8_sinhala_ci"); - collations.Add(212, "utf8_german2_ci"); - collations.Add(213, "utf8_croatian_ci"); - collations.Add(214, "utf8_unicode_520_ci"); - collations.Add(215, "utf8_vietnamese_ci"); - collations.Add(223, "utf8_general_mysql500_ci"); - collations.Add(35, "ucs2_general_ci"); - collations.Add(90, "ucs2_bin"); - collations.Add(128, "ucs2_unicode_ci"); - collations.Add(129, "ucs2_icelandic_ci"); - collations.Add(130, "ucs2_latvian_ci"); - collations.Add(131, "ucs2_romanian_ci"); - collations.Add(132, "ucs2_slovenian_ci"); - collations.Add(133, "ucs2_polish_ci"); - collations.Add(134, "ucs2_estonian_ci"); - collations.Add(135, "ucs2_spanish_ci"); - collations.Add(136, "ucs2_swedish_ci"); - collations.Add(137, "ucs2_turkish_ci"); - collations.Add(138, "ucs2_czech_ci"); - collations.Add(139, "ucs2_danish_ci"); - collations.Add(140, "ucs2_lithuanian_ci"); - collations.Add(141, "ucs2_slovak_ci"); - collations.Add(142, "ucs2_spanish2_ci"); - collations.Add(143, "ucs2_roman_ci"); - collations.Add(144, "ucs2_persian_ci"); - collations.Add(145, "ucs2_esperanto_ci"); - collations.Add(146, "ucs2_hungarian_ci"); - collations.Add(147, "ucs2_sinhala_ci"); - collations.Add(148, "ucs2_german2_ci"); - collations.Add(149, "ucs2_croatian_ci"); - collations.Add(150, "ucs2_unicode_520_ci"); - collations.Add(151, "ucs2_vietnamese_ci"); - collations.Add(159, "ucs2_general_mysql500_ci"); - collations.Add(36, "cp866_general_ci"); - collations.Add(68, "cp866_bin"); - collations.Add(37, "keybcs2_general_ci"); - collations.Add(73, "keybcs2_bin"); - collations.Add(38, "macce_general_ci"); - collations.Add(43, "macce_bin"); - collations.Add(39, "macroman_general_ci"); - collations.Add(53, "macroman_bin"); - collations.Add(40, "cp852_general_ci"); - collations.Add(81, "cp852_bin"); - collations.Add(20, "latin7_estonian_cs"); - collations.Add(41, "latin7_general_ci"); - collations.Add(42, "latin7_general_cs"); - collations.Add(79, "latin7_bin"); - collations.Add(45, "utf8mb4_general_ci"); - collations.Add(46, "utf8mb4_bin"); - collations.Add(224, "utf8mb4_unicode_ci"); - collations.Add(225, "utf8mb4_icelandic_ci"); - collations.Add(226, "utf8mb4_latvian_ci"); - collations.Add(227, "utf8mb4_romanian_ci"); - collations.Add(228, "utf8mb4_slovenian_ci"); - collations.Add(229, "utf8mb4_polish_ci"); - collations.Add(230, "utf8mb4_estonian_ci"); - collations.Add(231, "utf8mb4_spanish_ci"); - collations.Add(232, "utf8mb4_swedish_ci"); - collations.Add(233, "utf8mb4_turkish_ci"); - collations.Add(234, "utf8mb4_czech_ci"); - collations.Add(235, "utf8mb4_danish_ci"); - collations.Add(236, "utf8mb4_lithuanian_ci"); - collations.Add(237, "utf8mb4_slovak_ci"); - collations.Add(238, "utf8mb4_spanish2_ci"); - collations.Add(239, "utf8mb4_roman_ci"); - collations.Add(240, "utf8mb4_persian_ci"); - collations.Add(241, "utf8mb4_esperanto_ci"); - collations.Add(242, "utf8mb4_hungarian_ci"); - collations.Add(243, "utf8mb4_sinhala_ci"); - collations.Add(244, "utf8mb4_german2_ci"); - collations.Add(245, "utf8mb4_croatian_ci"); - collations.Add(246, "utf8mb4_unicode_520_ci"); - collations.Add(247, "utf8mb4_vietnamese_ci"); - collations.Add(14, "cp1251_bulgarian_ci"); - collations.Add(23, "cp1251_ukrainian_ci"); - collations.Add(50, "cp1251_bin"); - collations.Add(51, "cp1251_general_ci"); - collations.Add(52, "cp1251_general_cs"); - collations.Add(54, "utf16_general_ci"); - collations.Add(55, "utf16_bin"); - collations.Add(101, "utf16_unicode_ci"); - collations.Add(102, "utf16_icelandic_ci"); - collations.Add(103, "utf16_latvian_ci"); - collations.Add(104, "utf16_romanian_ci"); - collations.Add(105, "utf16_slovenian_ci"); - collations.Add(106, "utf16_polish_ci"); - collations.Add(107, "utf16_estonian_ci"); - collations.Add(108, "utf16_spanish_ci"); - collations.Add(109, "utf16_swedish_ci"); - collations.Add(110, "utf16_turkish_ci"); - collations.Add(111, "utf16_czech_ci"); - collations.Add(112, "utf16_danish_ci"); - collations.Add(113, "utf16_lithuanian_ci"); - collations.Add(114, "utf16_slovak_ci"); - collations.Add(115, "utf16_spanish2_ci"); - collations.Add(116, "utf16_roman_ci"); - collations.Add(117, "utf16_persian_ci"); - collations.Add(118, "utf16_esperanto_ci"); - collations.Add(119, "utf16_hungarian_ci"); - collations.Add(120, "utf16_sinhala_ci"); - collations.Add(121, "utf16_german2_ci"); - collations.Add(122, "utf16_croatian_ci"); - collations.Add(123, "utf16_unicode_520_ci"); - collations.Add(124, "utf16_vietnamese_ci"); - collations.Add(56, "utf16le_general_ci"); - collations.Add(62, "utf16le_bin"); - collations.Add(57, "cp1256_general_ci"); - collations.Add(67, "cp1256_bin"); - collations.Add(29, "cp1257_lithuanian_ci"); - collations.Add(58, "cp1257_bin"); - collations.Add(59, "cp1257_general_ci"); - collations.Add(60, "utf32_general_ci"); - collations.Add(61, "utf32_bin"); - collations.Add(160, "utf32_unicode_ci"); - collations.Add(161, "utf32_icelandic_ci"); - collations.Add(162, "utf32_latvian_ci"); - collations.Add(163, "utf32_romanian_ci"); - collations.Add(164, "utf32_slovenian_ci"); - collations.Add(165, "utf32_polish_ci"); - collations.Add(166, "utf32_estonian_ci"); - collations.Add(167, "utf32_spanish_ci"); - collations.Add(168, "utf32_swedish_ci"); - collations.Add(169, "utf32_turkish_ci"); - collations.Add(170, "utf32_czech_ci"); - collations.Add(171, "utf32_danish_ci"); - collations.Add(172, "utf32_lithuanian_ci"); - collations.Add(173, "utf32_slovak_ci"); - collations.Add(174, "utf32_spanish2_ci"); - collations.Add(175, "utf32_roman_ci"); - collations.Add(176, "utf32_persian_ci"); - collations.Add(177, "utf32_esperanto_ci"); - collations.Add(178, "utf32_hungarian_ci"); - collations.Add(179, "utf32_sinhala_ci"); - collations.Add(180, "utf32_german2_ci"); - collations.Add(181, "utf32_croatian_ci"); - collations.Add(182, "utf32_unicode_520_ci"); - collations.Add(183, "utf32_vietnamese_ci"); - collations.Add(63, "binary"); - collations.Add(92, "geostd8_general_ci"); - collations.Add(93, "geostd8_bin"); - collations.Add(95, "cp932_japanese_ci"); - collations.Add(96, "cp932_bin"); - collations.Add(97, "eucjpms_japanese_ci"); - collations.Add(98, "eucjpms_bin"); - collations.Add(248, "gb18030_chinese_ci"); - collations.Add(249, "gb18030_bin"); - collations.Add(250, "gb18030_unicode_520_ci"); - } - } -} diff --git a/Source/MySql.Data/X/Data/Enums.cs b/Source/MySql.Data/X/Data/Enums.cs deleted file mode 100644 index 58cecfaa5..000000000 --- a/Source/MySql.Data/X/Data/Enums.cs +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright © 2015, 2017, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -namespace MySqlX.DataAccess -{ - internal enum ConnectionMode - { - Offline = 0, - ReadOnly = 1, - WriteOnly = 2, - ReadWrite = 3 - } - - internal enum AuthenticationMode - { - PlainAccess = 0, - MySQL41 = 1 - } - - internal enum OS - { - Unknown = 0, - Windows, - Linux, - MacOS - } - - public enum ViewAlgorithmEnum - { - Undefined = Mysqlx.Crud.ViewAlgorithm.Undefined, - Merge = Mysqlx.Crud.ViewAlgorithm.Merge, - TempTable = Mysqlx.Crud.ViewAlgorithm.Temptable - } - - public enum ViewSqlSecurityEnum - { - Invoker = Mysqlx.Crud.ViewSqlSecurity.Invoker, - Definer = Mysqlx.Crud.ViewSqlSecurity.Definer - } - - public enum ViewCheckOptionEnum - { - Local = Mysqlx.Crud.ViewCheckOption.Local, - Cascaded = Mysqlx.Crud.ViewCheckOption.Cascaded - } -} diff --git a/Source/MySql.Data/X/Protocol/ProtocolBase.cs b/Source/MySql.Data/X/Protocol/ProtocolBase.cs deleted file mode 100644 index 0e2ee5b71..000000000 --- a/Source/MySql.Data/X/Protocol/ProtocolBase.cs +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System.Collections.Generic; -using MySqlX.XDevAPI; -using MySqlX.XDevAPI.Common; -using MySqlX.XDevAPI.Relational; - -namespace MySqlX.Protocol -{ - - /// - /// Abstract class for the protocol base operations in client/server communication. - /// - /// - public abstract class ProtocolBase - { - public abstract List ReadRow(BaseResult rs); - public abstract void SendSQL(string sql, params object[] args); - - public abstract bool HasData(BaseResult rs); - - public abstract List LoadColumnMetadata(); - - public abstract void CloseResult(BaseResult rs); - } -} diff --git a/Source/MySql.Data/X/Protocol/ValueDecoder.cs b/Source/MySql.Data/X/Protocol/ValueDecoder.cs deleted file mode 100644 index 430b37a2b..000000000 --- a/Source/MySql.Data/X/Protocol/ValueDecoder.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.XDevAPI; -using MySqlX.XDevAPI.Relational; - -namespace MySqlX.Protocol -{ - internal abstract class ValueDecoder - { - - public delegate object ClrDecoderDelegate(byte[] bytes); - - - public Column Column { get; set; } - - public uint Flags { get; set; } - public uint ContentType { get; set; } - - public abstract void SetMetadata(); - public ClrDecoderDelegate ClrValueDecoder; - } -} diff --git a/Source/MySql.Data/X/Protocol/X/BitDecoder.cs b/Source/MySql.Data/X/Protocol/X/BitDecoder.cs deleted file mode 100644 index 1129c2bfe..000000000 --- a/Source/MySql.Data/X/Protocol/X/BitDecoder.cs +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using Google.Protobuf; -using MySql.Data.MySqlClient.X.XDevAPI.Common; -using System; - -namespace MySqlX.Protocol.X -{ - internal class BitDecoder : ValueDecoder - { - public override void SetMetadata() - { - Column.Type = ColumnType.Bit; - Column.ClrType = typeof(UInt64); - ClrValueDecoder = BitValueDecoder; - } - - private UInt64 ReadUInt(byte[] bytes) - { - return new CodedInputStream(bytes).ReadUInt64(); - } - - private object BitValueDecoder(byte[] bytes) - { - return ReadUInt(bytes); - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data/X/Protocol/X/ByteDecoder.cs b/Source/MySql.Data/X/Protocol/X/ByteDecoder.cs deleted file mode 100644 index 3c1b8ab77..000000000 --- a/Source/MySql.Data/X/Protocol/X/ByteDecoder.cs +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Text; -using MySqlX.Data; -using System; -using MySqlX.XDevAPI; -using MySql.Data.MySqlClient; -using MySql.Data.MySqlClient.X.XDevAPI.Common; -using MySql.Data.Common; - -namespace MySqlX.Protocol.X -{ - internal class ByteDecoder : ValueDecoder - { - private Encoding _encoding; - private bool _isEnum; - - public ByteDecoder(bool isEnum) - { - _isEnum = isEnum; - } - - public override void SetMetadata() - { - Column.Type = GetDbType(); - Column.ClrType = GetClrType(Column.Type); - Column.IsPadded = (Flags & 1) != 0; - ClrValueDecoder = GetClrValueDecoder(); - } - - private ColumnType GetDbType() - { - if (_isEnum) - return ColumnType.Enum; - if (ContentType == (uint)ColumnContentType.Geometry) - return ColumnType.Geometry; - if (ContentType == (uint)ColumnContentType.Json) - return ColumnType.Json; - if ((Column.CollationName??"").Equals("binary", StringComparison.OrdinalIgnoreCase)) - return ColumnType.Bytes; - return ColumnType.String; - } - - private Type GetClrType(ColumnType dbType) - { - if (dbType == ColumnType.String || dbType == ColumnType.Json - || dbType == ColumnType.Enum) - return typeof(string); - return typeof(byte[]); - } - - private ClrDecoderDelegate GetClrValueDecoder() - { - if (Column.ClrType == typeof(String)) return StringValueDecoder; - return ByteValueDecoder; - } - - private object StringValueDecoder(byte[] bytes) - { - if (bytes.Length == 0) return null; - - if (_encoding == null) - { - string charset = Column.CharacterSetName ?? string.Empty; - _encoding = CharSetMap.GetEncoding(new DBVersion(), charset); - } - return _encoding.GetString(bytes, 0, bytes.Length - 1); - } - - private object ByteValueDecoder(byte[] bytes) - { - byte[] newValue = new byte[bytes.Length - 1]; - Array.Copy(bytes, newValue, newValue.Length); - return newValue; - } - } -} diff --git a/Source/MySql.Data/X/Protocol/X/DecimalDecoder.cs b/Source/MySql.Data/X/Protocol/X/DecimalDecoder.cs deleted file mode 100644 index 556ff5415..000000000 --- a/Source/MySql.Data/X/Protocol/X/DecimalDecoder.cs +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using MySql.Data; -using MySql.Data.MySqlClient.X.XDevAPI.Common; -using MySqlX.Data; -using System; - -namespace MySqlX.Protocol.X -{ - internal class DecimalDecoder : ValueDecoder - { - public override void SetMetadata() - { - Column.Type = ColumnType.Decimal; - Column.ClrType = typeof(decimal); - ClrValueDecoder = DecimalValueDecoder; - } - - private object DecimalValueDecoder(byte[] bytes) - { - // this decoder is based on the BCD standard - int scale = bytes[0]; - byte sign = bytes[bytes.Length - 1]; - string stringValue = string.Empty; - string lastDigit = string.Empty; - - if (sign == 0xc0) - stringValue = "+"; - else if (sign == 0xd0) - stringValue = "-"; - else if((sign & 0x0F) == 0x0c) - { - stringValue = "+"; - lastDigit = (sign >> 4).ToString(); - } - else if((sign & 0x0F) == 0x0d) - { - stringValue = "-"; - lastDigit = (sign >> 4).ToString(); - } - else - throw new FormatException(ResourcesX.InvalidDecimalFormat); - - for(int i = 1; i < bytes.Length - 1; i++) - { - stringValue += bytes[i].ToString("x2"); - } - stringValue += lastDigit; - stringValue = stringValue.Insert(stringValue.Length - scale, "."); - - return Decimal.Parse(stringValue); - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data/X/Protocol/X/Enum.cs b/Source/MySql.Data/X/Protocol/X/Enum.cs deleted file mode 100644 index 46d300a0b..000000000 --- a/Source/MySql.Data/X/Protocol/X/Enum.cs +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MySqlX.Protocol.X -{ - internal enum NoticeType : int - { - Warning = 1, - SessionVariableChanged = 2, - SessionStateChanged = 3, - } - - internal static class XpluginStatementCommand - { - public static readonly string XPLUGIN_STMT_CREATE_COLLECTION = "create_collection"; - public static readonly string XPLUGIN_STMT_CREATE_COLLECTION_INDEX = "create_collection_index"; - public static readonly string XPLUGIN_STMT_DROP_COLLECTION = - "drop_collection"; - public static readonly string XPLUGIN_STMT_DROP_COLLECTION_INDEX = "drop_collection_index"; - public static readonly string XPLUGIN_STMT_PING = "ping"; - public static readonly string XPLUGIN_STMT_LIST_OBJECTS = - "list_objects"; - public static readonly string XPLUGIN_STMT_ENABLE_NOTICES = "enable_notices"; - public static readonly string XPLUGIN_STMT_DISABLE_NOTICES = "disable_notices"; - public static readonly string XPLUGIN_STMT_LIST_NOTICES = - "list_notices"; - } -} diff --git a/Source/MySql.Data/X/Protocol/X/ExprUtil.cs b/Source/MySql.Data/X/Protocol/X/ExprUtil.cs deleted file mode 100644 index 29cd266b4..000000000 --- a/Source/MySql.Data/X/Protocol/X/ExprUtil.cs +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using Mysqlx.Expr; -using Mysqlx.Datatypes; -using Mysqlx.Crud; -using Google.Protobuf; - -namespace MySqlX.Protocol.X -{ - internal class ExprUtil - { - /** - * Proto-buf helper to build a LITERAL Expr with a Scalar NULL type. - */ - public static Expr BuildLiteralNullScalar() - { - return BuildLiteralExpr(NullScalar()); - } - - /** - * Proto-buf helper to build a LITERAL Expr with a Scalar DOUBLE type (wrapped in Any). - */ - public static Expr BuildLiteralScalar(double d) - { - return BuildLiteralExpr(ScalarOf(d)); - } - - /** - * Proto-buf helper to build a LITERAL Expr with a Scalar SINT (signed int) type (wrapped in Any). - */ - public static Expr BuildLiteralScalar(long l) - { - return BuildLiteralExpr(ScalarOf(l)); - } - - /** - * Proto-buf helper to build a LITERAL Expr with a Scalar STRING type (wrapped in Any). - */ - public static Expr BuildLiteralScalar(String str) - { - return BuildLiteralExpr(ScalarOf(str)); - } - - /** - * Proto-buf helper to build a LITERAL Expr with a Scalar OCTETS type (wrapped in Any). - */ - public static Expr BuildLiteralScalar(byte[] bytes) - { - return BuildLiteralExpr(ScalarOf(bytes)); - } - - /** - * Proto-buf helper to build a LITERAL Expr with a Scalar BOOL type (wrapped in Any). - */ - public static Expr BuildLiteralScalar(Boolean b) - { - return BuildLiteralExpr(ScalarOf(b)); - } - - /** - * Wrap an Any value in a LITERAL expression. - */ - public static Expr BuildLiteralExpr(Scalar scalar) - { - return new Expr() { Type = Expr.Types.Type.Literal, Literal = scalar }; - } - - public static Scalar NullScalar() - { - return new Scalar() { Type = Scalar.Types.Type.VNull }; - } - - public static Scalar ScalarOf(double d) - { - return new Scalar() { Type = Scalar.Types.Type.VDouble, VDouble = d }; - } - - public static Scalar ScalarOf(long l) - { - return new Scalar() { Type = Scalar.Types.Type.VSint, VSignedInt = l}; - } - - public static Scalar ScalarOf(String str) - { - Scalar.Types.String strValue = new Scalar.Types.String() { Value = ByteString.CopyFromUtf8(str) }; - return new Scalar() { Type = Scalar.Types.Type.VString, VString = strValue }; - } - - public static Scalar ScalarOf(byte[] bytes) - { - return new Scalar() { Type = Scalar.Types.Type.VOctets, VOctets = new Scalar.Types.Octets() { Value = ByteString.CopyFrom(bytes) } }; - } - - public static Scalar ScalarOf(Boolean b) - { - return new Scalar() { Type = Scalar.Types.Type.VBool, VBool = b }; - } - - /** - * Build an Any with a string value. - */ - public static Any BuildAny(String str) - { - // same as Expr - Scalar.Types.String sstr = new Scalar.Types.String(); - sstr.Value = ByteString.CopyFromUtf8(str); - Scalar s = new Scalar(); - s.Type = Scalar.Types.Type.VString; - s.VString = sstr; - Any a = new Any(); - a.Type = Any.Types.Type.Scalar; - a.Scalar = s; - return a; - } - - public static Any BuildAny(Boolean b) - { - return new Any() { Type = Any.Types.Type.Scalar, Scalar = ScalarOf(b) }; - } - - public static Any BuildAny(object value) - { - return new Any() { Type = Any.Types.Type.Scalar, Scalar = ExprUtil.ArgObjectToScalar(value) }; - } - - public static Collection BuildCollection(String schemaName, String collectionName) - { - return new Collection() { Schema = schemaName, Name = collectionName }; - } - - public static Scalar ArgObjectToScalar(System.Object value) - { - return ArgObjectToExpr(value, false).Literal; - } - - public static Expr ArgObjectToExpr(System.Object value, Boolean allowRelationalColumns) - { - if (value == null) - return BuildLiteralNullScalar(); - - if (value is bool) - return BuildLiteralScalar(Convert.ToBoolean(value)); - else if (value is byte || value is short || value is int || value is long) - return BuildLiteralScalar(Convert.ToInt64(value)); - else if (value is float || value is double) - return BuildLiteralScalar(Convert.ToDouble(value)); - else if (value is string) - { - try - { - // try to parse expressions - Expr expr = new ExprParser((string)value).Parse(); - if (expr.Identifier != null) - return BuildLiteralScalar((string)value); - return expr; - } - catch - { - // if can't parse, returns as literal - return BuildLiteralScalar((string)value); - } - } - else if (value is XDevAPI.DbDoc) - return (BuildLiteralScalar(value.ToString())); - throw new NotSupportedException("Value of type " + value.GetType() + " is not currently supported."); - } - - public static string JoinString(string[] values) - { - if (values == null) return string.Empty; - return string.Join(", ", values); - } - } -} diff --git a/Source/MySql.Data/X/Protocol/X/FloatDecoder.cs b/Source/MySql.Data/X/Protocol/X/FloatDecoder.cs deleted file mode 100644 index 63c9066c4..000000000 --- a/Source/MySql.Data/X/Protocol/X/FloatDecoder.cs +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - - -using MySqlX.Data; -using MySqlX.XDevAPI; -using System; -using MySql.Data.MySqlClient; -using MySqlX; -using MySql.Data.MySqlClient.X.XDevAPI.Common; -using Google.Protobuf; - -namespace MySqlX.Protocol.X -{ - internal class FloatDecoder : ValueDecoder - { - bool _float; - - public FloatDecoder(bool isFloat) - { - _float = isFloat; - } - - public override void SetMetadata() - { - Column.Type = _float ? ColumnType.Float : ColumnType.Double; - Column.ClrType = _float ? typeof(float) : typeof(double); - ClrValueDecoder = FloatValueDecoder; - if (!_float) - ClrValueDecoder = DoubleValueDecoder; - } - - private object FloatValueDecoder(byte[] bytes) - { - return new CodedInputStream(bytes).ReadFloat(); - } - - private object DoubleValueDecoder(byte[] bytes) - { - return new CodedInputStream(bytes).ReadDouble(); - } - } -} diff --git a/Source/MySql.Data/X/Protocol/X/IntegerDecoder.cs b/Source/MySql.Data/X/Protocol/X/IntegerDecoder.cs deleted file mode 100644 index 7b5efc055..000000000 --- a/Source/MySql.Data/X/Protocol/X/IntegerDecoder.cs +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - - -using Google.Protobuf; -using MySql.Data.MySqlClient; -using MySql.Data.MySqlClient.X.XDevAPI.Common; -using MySqlX.Data; -using MySqlX.XDevAPI; -using System; - -namespace MySqlX.Protocol.X -{ - internal class IntegerDecoder : ValueDecoder - { - bool _signed; - - public IntegerDecoder(bool signed) - { - _signed = signed; - } - - public override void SetMetadata() - { - Column.Type = GetDbType(); - Column.IsNumberSigned = _signed; - Column.ClrType = _signed ? GetSignedClrType() : GetUnsignedClrType(); - ClrValueDecoder = _signed ? GetSignedValueDecoder() : GetUnsignedValueDecoder(); - Column.IsPadded = _signed ? false : (Flags & 1) != 0; - } - - private ColumnType GetDbType() - { - uint len = Column.Length + (_signed ? 0u : 1u); - if (len <= 4) return ColumnType.Tinyint; - else if (len <= 6) return ColumnType.Smallint; - else if (len <= 9) return ColumnType.Mediumint; - else if (len <= 11) return ColumnType.Int; - else return ColumnType.Bigint; - } - - private Type GetSignedClrType() - { - uint len = Column.Length; - if (len <= 4) return typeof(sbyte); - else if (len <= 6) return typeof(Int16); - else if (len <= 9) return typeof(Int32); - else if (len <= 11) return typeof(Int32); - else return typeof(Int64); - } - - private Type GetUnsignedClrType() - { - uint len = Column.Length; - if (len < 4) return typeof(byte); - else if (len < 6) return typeof(UInt16); - else if (len < 9) return typeof(UInt32); - else if (len < 11) return typeof(UInt32); - else return typeof(UInt64); - } - - private ClrDecoderDelegate GetSignedValueDecoder() - { - uint len = Column.Length; - if (len <= 4) return SByteValueDecoder; - else if (len <= 6) return Int16ValueDecoder; - else if (len <= 9) return Int32ValueDecoder; - else if (len <= 11) return Int32ValueDecoder; - else return Int64ValueDecoder; - } - - private ClrDecoderDelegate GetUnsignedValueDecoder() - { - uint len = Column.Length; - if (len < 4) return ByteValueDecoder; - else if (len < 6) return UInt16ValueDecoder; - else if (len < 9) return UInt32ValueDecoder; - else if (len < 11) return UInt32ValueDecoder; - else return UInt64ValueDecoder; - } - - private Int64 ReadInt(byte[] bytes) - { - return new CodedInputStream(bytes).ReadSInt64(); - } - - private UInt64 ReadUInt(byte[] bytes) - { - return new CodedInputStream(bytes).ReadUInt64(); - } - - public object SByteValueDecoder(byte[] bytes) - { - return (sbyte)ReadInt(bytes); - } - - public object Int16ValueDecoder(byte[] bytes) - { - return (Int16)ReadInt(bytes); - } - - public object Int32ValueDecoder(byte[] bytes) - { - return (Int32)ReadInt(bytes); - } - - public object Int64ValueDecoder(byte[] bytes) - { - return ReadInt(bytes); - } - - public object ByteValueDecoder(byte[] bytes) - { - return (byte)ReadUInt(bytes); - } - - public object UInt16ValueDecoder(byte[] bytes) - { - return (UInt16)ReadUInt(bytes); - } - - public object UInt32ValueDecoder(byte[] bytes) - { - return (UInt32)ReadUInt(bytes); - } - - public object UInt64ValueDecoder(byte[] bytes) - { - return (UInt64)ReadUInt(bytes); - } - } -} diff --git a/Source/MySql.Data/X/Protocol/X/Protobuf/Mysqlx.cs b/Source/MySql.Data/X/Protocol/X/Protobuf/Mysqlx.cs deleted file mode 100644 index f1035c475..000000000 --- a/Source/MySql.Data/X/Protocol/X/Protobuf/Mysqlx.cs +++ /dev/null @@ -1,665 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: mysqlx.proto -#pragma warning disable 1591, 0612, 3021 -#region Designer generated code - -using pb = global::Google.Protobuf; -using pbc = global::Google.Protobuf.Collections; -using pbr = global::Google.Protobuf.Reflection; -using scg = global::System.Collections.Generic; -namespace Mysqlx { - - /// Holder for reflection information generated from mysqlx.proto - internal static partial class MysqlxReflection { - - #region Descriptor - /// File descriptor for mysqlx.proto - public static pbr::FileDescriptor Descriptor { - get { return descriptor; } - } - private static pbr::FileDescriptor descriptor; - - static MysqlxReflection() { - byte[] descriptorData = global::System.Convert.FromBase64String( - string.Concat( - "CgxteXNxbHgucHJvdG8SBk15c3FseBoQbXlzcWx4X3NxbC5wcm90bxoWbXlz", - "cWx4X3Jlc3VsdHNldC5wcm90bxoRbXlzcWx4X2NydWQucHJvdG8aFG15c3Fs", - "eF9zZXNzaW9uLnByb3RvGhdteXNxbHhfY29ubmVjdGlvbi5wcm90bxoTbXlz", - "cWx4X2V4cGVjdC5wcm90bxoTbXlzcWx4X25vdGljZS5wcm90byL+AgoOQ2xp", - "ZW50TWVzc2FnZXMi6wIKBFR5cGUSCAoETk9ORRAAEhgKFENPTl9DQVBBQklM", - "SVRJRVNfR0VUEAESGAoUQ09OX0NBUEFCSUxJVElFU19TRVQQAhINCglDT05f", - "Q0xPU0UQAxIbChdTRVNTX0FVVEhFTlRJQ0FURV9TVEFSVBAEEh4KGlNFU1Nf", - "QVVUSEVOVElDQVRFX0NPTlRJTlVFEAUSDgoKU0VTU19SRVNFVBAGEg4KClNF", - "U1NfQ0xPU0UQBxIUChBTUUxfU1RNVF9FWEVDVVRFEAwSDQoJQ1JVRF9GSU5E", - "EBESDwoLQ1JVRF9JTlNFUlQQEhIPCgtDUlVEX1VQREFURRATEg8KC0NSVURf", - "REVMRVRFEBQSDwoLRVhQRUNUX09QRU4QGBIQCgxFWFBFQ1RfQ0xPU0UQGRIU", - "ChBDUlVEX0NSRUFURV9WSUVXEB4SFAoQQ1JVRF9NT0RJRllfVklFVxAfEhIK", - "DkNSVURfRFJPUF9WSUVXECAi4gIKDlNlcnZlck1lc3NhZ2VzIs8CCgRUeXBl", - "EgYKAk9LEAASCQoFRVJST1IQARIVChFDT05OX0NBUEFCSUxJVElFUxACEh4K", - "GlNFU1NfQVVUSEVOVElDQVRFX0NPTlRJTlVFEAMSGAoUU0VTU19BVVRIRU5U", - "SUNBVEVfT0sQBBIKCgZOT1RJQ0UQCxIeChpSRVNVTFRTRVRfQ09MVU1OX01F", - "VEFfREFUQRAMEhEKDVJFU1VMVFNFVF9ST1cQDRIYChRSRVNVTFRTRVRfRkVU", - "Q0hfRE9ORRAOEh0KGVJFU1VMVFNFVF9GRVRDSF9TVVNQRU5ERUQQDxIoCiRS", - "RVNVTFRTRVRfRkVUQ0hfRE9ORV9NT1JFX1JFU1VMVFNFVFMQEBIXChNTUUxf", - "U1RNVF9FWEVDVVRFX09LEBESKAokUkVTVUxUU0VUX0ZFVENIX0RPTkVfTU9S", - "RV9PVVRfUEFSQU1TEBIiEQoCT2sSCwoDbXNnGAEgASgJIoEBCgVFcnJvchIo", - "CghzZXZlcml0eRgBIAEoDjIWLk15c3FseC5FcnJvci5TZXZlcml0eRIMCgRj", - "b2RlGAIgASgNEhEKCXNxbF9zdGF0ZRgEIAEoCRILCgNtc2cYAyABKAkiIAoI", - "U2V2ZXJpdHkSCQoFRVJST1IQABIJCgVGQVRBTBABQh4KHGNvbS5teXNxbC5j", - "ai5teXNxbHgucHJvdG9idWZiBnByb3RvMw==")); - descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, - new pbr::FileDescriptor[] { global::Mysqlx.Sql.MysqlxSqlReflection.Descriptor, global::Mysqlx.Resultset.MysqlxResultsetReflection.Descriptor, global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor, global::Mysqlx.Session.MysqlxSessionReflection.Descriptor, global::Mysqlx.Connection.MysqlxConnectionReflection.Descriptor, global::Mysqlx.Expect.MysqlxExpectReflection.Descriptor, global::Mysqlx.Notice.MysqlxNoticeReflection.Descriptor, }, - new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.ClientMessages), global::Mysqlx.ClientMessages.Parser, null, null, new[]{ typeof(global::Mysqlx.ClientMessages.Types.Type) }, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.ServerMessages), global::Mysqlx.ServerMessages.Parser, null, null, new[]{ typeof(global::Mysqlx.ServerMessages.Types.Type) }, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Ok), global::Mysqlx.Ok.Parser, new[]{ "Msg" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Error), global::Mysqlx.Error.Parser, new[]{ "Severity", "Code", "SqlState", "Msg" }, null, new[]{ typeof(global::Mysqlx.Error.Types.Severity) }, null) - })); - } - #endregion - - } - #region Messages - /// - /// IDs of messages that can be sent from client to the server - /// - /// .. note:: - /// this message is never sent on the wire. It is only used to let ``protoc`` - /// - /// * generate constants - /// * check for uniqueness - /// - internal sealed partial class ClientMessages : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new ClientMessages()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.MysqlxReflection.Descriptor.MessageTypes[0]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public ClientMessages() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public ClientMessages(ClientMessages other) : this() { - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public ClientMessages Clone() { - return new ClientMessages(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as ClientMessages); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(ClientMessages other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(ClientMessages other) { - if (other == null) { - return; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - } - } - } - - #region Nested types - /// Container for nested types declared in the ClientMessages message type. - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - internal static partial class Types { - internal enum Type { - [pbr::OriginalName("NONE")] None = 0, - [pbr::OriginalName("CON_CAPABILITIES_GET")] ConCapabilitiesGet = 1, - [pbr::OriginalName("CON_CAPABILITIES_SET")] ConCapabilitiesSet = 2, - [pbr::OriginalName("CON_CLOSE")] ConClose = 3, - [pbr::OriginalName("SESS_AUTHENTICATE_START")] SessAuthenticateStart = 4, - [pbr::OriginalName("SESS_AUTHENTICATE_CONTINUE")] SessAuthenticateContinue = 5, - [pbr::OriginalName("SESS_RESET")] SessReset = 6, - [pbr::OriginalName("SESS_CLOSE")] SessClose = 7, - [pbr::OriginalName("SQL_STMT_EXECUTE")] SqlStmtExecute = 12, - [pbr::OriginalName("CRUD_FIND")] CrudFind = 17, - [pbr::OriginalName("CRUD_INSERT")] CrudInsert = 18, - [pbr::OriginalName("CRUD_UPDATE")] CrudUpdate = 19, - [pbr::OriginalName("CRUD_DELETE")] CrudDelete = 20, - [pbr::OriginalName("EXPECT_OPEN")] ExpectOpen = 24, - [pbr::OriginalName("EXPECT_CLOSE")] ExpectClose = 25, - [pbr::OriginalName("CRUD_CREATE_VIEW")] CrudCreateView = 30, - [pbr::OriginalName("CRUD_MODIFY_VIEW")] CrudModifyView = 31, - [pbr::OriginalName("CRUD_DROP_VIEW")] CrudDropView = 32, - } - - } - #endregion - - } - - /// - /// IDs of messages that can be sent from server to client - /// - /// .. note:: - /// this message is never sent on the wire. It is only used to let ``protoc`` - /// - /// * generate constants - /// * check for uniqueness - /// - internal sealed partial class ServerMessages : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new ServerMessages()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.MysqlxReflection.Descriptor.MessageTypes[1]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public ServerMessages() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public ServerMessages(ServerMessages other) : this() { - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public ServerMessages Clone() { - return new ServerMessages(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as ServerMessages); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(ServerMessages other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(ServerMessages other) { - if (other == null) { - return; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - } - } - } - - #region Nested types - /// Container for nested types declared in the ServerMessages message type. - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - internal static partial class Types { - internal enum Type { - [pbr::OriginalName("OK")] Ok = 0, - [pbr::OriginalName("ERROR")] Error = 1, - [pbr::OriginalName("CONN_CAPABILITIES")] ConnCapabilities = 2, - [pbr::OriginalName("SESS_AUTHENTICATE_CONTINUE")] SessAuthenticateContinue = 3, - [pbr::OriginalName("SESS_AUTHENTICATE_OK")] SessAuthenticateOk = 4, - /// - /// NOTICE has to stay at 11 forever - /// - [pbr::OriginalName("NOTICE")] Notice = 11, - [pbr::OriginalName("RESULTSET_COLUMN_META_DATA")] ResultsetColumnMetaData = 12, - [pbr::OriginalName("RESULTSET_ROW")] ResultsetRow = 13, - [pbr::OriginalName("RESULTSET_FETCH_DONE")] ResultsetFetchDone = 14, - [pbr::OriginalName("RESULTSET_FETCH_SUSPENDED")] ResultsetFetchSuspended = 15, - [pbr::OriginalName("RESULTSET_FETCH_DONE_MORE_RESULTSETS")] ResultsetFetchDoneMoreResultsets = 16, - [pbr::OriginalName("SQL_STMT_EXECUTE_OK")] SqlStmtExecuteOk = 17, - [pbr::OriginalName("RESULTSET_FETCH_DONE_MORE_OUT_PARAMS")] ResultsetFetchDoneMoreOutParams = 18, - } - - } - #endregion - - } - - /// - /// generic Ok message - /// - internal sealed partial class Ok : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Ok()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.MysqlxReflection.Descriptor.MessageTypes[2]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Ok() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Ok(Ok other) : this() { - msg_ = other.msg_; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Ok Clone() { - return new Ok(this); - } - - /// Field number for the "msg" field. - public const int MsgFieldNumber = 1; - private string msg_ = ""; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string Msg { - get { return msg_; } - set { - msg_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Ok); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Ok other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (Msg != other.Msg) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (Msg.Length != 0) hash ^= Msg.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (Msg.Length != 0) { - output.WriteRawTag(10); - output.WriteString(Msg); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (Msg.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(Msg); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Ok other) { - if (other == null) { - return; - } - if (other.Msg.Length != 0) { - Msg = other.Msg; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - Msg = input.ReadString(); - break; - } - } - } - } - - } - - /// - /// generic Error message - /// - /// A ``severity`` of ``ERROR`` indicates the current message sequence is - /// aborted for the given error and the session is ready for more. - /// - /// In case of a ``FATAL`` error message the client should not expect - /// the server to continue handling any further messages and should - /// close the connection. - /// - /// :param severity: severity of the error message - /// :param code: error-code - /// :param sql_state: SQL state - /// :param msg: human readable error message - /// - internal sealed partial class Error : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Error()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.MysqlxReflection.Descriptor.MessageTypes[3]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Error() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Error(Error other) : this() { - severity_ = other.severity_; - code_ = other.code_; - sqlState_ = other.sqlState_; - msg_ = other.msg_; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Error Clone() { - return new Error(this); - } - - /// Field number for the "severity" field. - public const int SeverityFieldNumber = 1; - private global::Mysqlx.Error.Types.Severity severity_ = 0; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Error.Types.Severity Severity { - get { return severity_; } - set { - severity_ = value; - } - } - - /// Field number for the "code" field. - public const int CodeFieldNumber = 2; - private uint code_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public uint Code { - get { return code_; } - set { - code_ = value; - } - } - - /// Field number for the "sql_state" field. - public const int SqlStateFieldNumber = 4; - private string sqlState_ = ""; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string SqlState { - get { return sqlState_; } - set { - sqlState_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "msg" field. - public const int MsgFieldNumber = 3; - private string msg_ = ""; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string Msg { - get { return msg_; } - set { - msg_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Error); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Error other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (Severity != other.Severity) return false; - if (Code != other.Code) return false; - if (SqlState != other.SqlState) return false; - if (Msg != other.Msg) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (Severity != 0) hash ^= Severity.GetHashCode(); - if (Code != 0) hash ^= Code.GetHashCode(); - if (SqlState.Length != 0) hash ^= SqlState.GetHashCode(); - if (Msg.Length != 0) hash ^= Msg.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (Severity != 0) { - output.WriteRawTag(8); - output.WriteEnum((int) Severity); - } - if (Code != 0) { - output.WriteRawTag(16); - output.WriteUInt32(Code); - } - if (Msg.Length != 0) { - output.WriteRawTag(26); - output.WriteString(Msg); - } - if (SqlState.Length != 0) { - output.WriteRawTag(34); - output.WriteString(SqlState); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (Severity != 0) { - size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Severity); - } - if (Code != 0) { - size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Code); - } - if (SqlState.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(SqlState); - } - if (Msg.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(Msg); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Error other) { - if (other == null) { - return; - } - if (other.Severity != 0) { - Severity = other.Severity; - } - if (other.Code != 0) { - Code = other.Code; - } - if (other.SqlState.Length != 0) { - SqlState = other.SqlState; - } - if (other.Msg.Length != 0) { - Msg = other.Msg; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 8: { - severity_ = (global::Mysqlx.Error.Types.Severity) input.ReadEnum(); - break; - } - case 16: { - Code = input.ReadUInt32(); - break; - } - case 26: { - Msg = input.ReadString(); - break; - } - case 34: { - SqlState = input.ReadString(); - break; - } - } - } - } - - #region Nested types - /// Container for nested types declared in the Error message type. - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - internal static partial class Types { - internal enum Severity { - [pbr::OriginalName("ERROR")] Error = 0, - [pbr::OriginalName("FATAL")] Fatal = 1, - } - - } - #endregion - - } - - #endregion - -} - -#endregion Designer generated code diff --git a/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxConnection.cs b/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxConnection.cs deleted file mode 100644 index be5afb24e..000000000 --- a/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxConnection.cs +++ /dev/null @@ -1,650 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: mysqlx_connection.proto -#pragma warning disable 1591, 0612, 3021 -#region Designer generated code - -using pb = global::Google.Protobuf; -using pbc = global::Google.Protobuf.Collections; -using pbr = global::Google.Protobuf.Reflection; -using scg = global::System.Collections.Generic; -namespace Mysqlx.Connection { - - /// Holder for reflection information generated from mysqlx_connection.proto - internal static partial class MysqlxConnectionReflection { - - #region Descriptor - /// File descriptor for mysqlx_connection.proto - public static pbr::FileDescriptor Descriptor { - get { return descriptor; } - } - private static pbr::FileDescriptor descriptor; - - static MysqlxConnectionReflection() { - byte[] descriptorData = global::System.Convert.FromBase64String( - string.Concat( - "ChdteXNxbHhfY29ubmVjdGlvbi5wcm90bxIRTXlzcWx4LkNvbm5lY3Rpb24a", - "Fm15c3FseF9kYXRhdHlwZXMucHJvdG8iQAoKQ2FwYWJpbGl0eRIMCgRuYW1l", - "GAEgASgJEiQKBXZhbHVlGAIgASgLMhUuTXlzcWx4LkRhdGF0eXBlcy5Bbnki", - "QwoMQ2FwYWJpbGl0aWVzEjMKDGNhcGFiaWxpdGllcxgBIAMoCzIdLk15c3Fs", - "eC5Db25uZWN0aW9uLkNhcGFiaWxpdHkiEQoPQ2FwYWJpbGl0aWVzR2V0IkgK", - "D0NhcGFiaWxpdGllc1NldBI1CgxjYXBhYmlsaXRpZXMYASABKAsyHy5NeXNx", - "bHguQ29ubmVjdGlvbi5DYXBhYmlsaXRpZXMiBwoFQ2xvc2VCHgocY29tLm15", - "c3FsLmNqLm15c3FseC5wcm90b2J1ZmIGcHJvdG8z")); - descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, - new pbr::FileDescriptor[] { global::Mysqlx.Datatypes.MysqlxDatatypesReflection.Descriptor, }, - new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Connection.Capability), global::Mysqlx.Connection.Capability.Parser, new[]{ "Name", "Value" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Connection.Capabilities), global::Mysqlx.Connection.Capabilities.Parser, new[]{ "Capabilities_" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Connection.CapabilitiesGet), global::Mysqlx.Connection.CapabilitiesGet.Parser, null, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Connection.CapabilitiesSet), global::Mysqlx.Connection.CapabilitiesSet.Parser, new[]{ "Capabilities" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Connection.Close), global::Mysqlx.Connection.Close.Parser, null, null, null, null) - })); - } - #endregion - - } - #region Messages - /// - /// a Capability - /// - /// a tuple of a ``name`` and a :protobuf:msg:`Mysqlx.Datatypes::Any` - /// - internal sealed partial class Capability : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Capability()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Connection.MysqlxConnectionReflection.Descriptor.MessageTypes[0]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Capability() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Capability(Capability other) : this() { - name_ = other.name_; - Value = other.value_ != null ? other.Value.Clone() : null; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Capability Clone() { - return new Capability(this); - } - - /// Field number for the "name" field. - public const int NameFieldNumber = 1; - private string name_ = ""; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string Name { - get { return name_; } - set { - name_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "value" field. - public const int ValueFieldNumber = 2; - private global::Mysqlx.Datatypes.Any value_; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Datatypes.Any Value { - get { return value_; } - set { - value_ = value; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Capability); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Capability other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (Name != other.Name) return false; - if (!object.Equals(Value, other.Value)) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (Name.Length != 0) hash ^= Name.GetHashCode(); - if (value_ != null) hash ^= Value.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (Name.Length != 0) { - output.WriteRawTag(10); - output.WriteString(Name); - } - if (value_ != null) { - output.WriteRawTag(18); - output.WriteMessage(Value); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (Name.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(Name); - } - if (value_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Value); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Capability other) { - if (other == null) { - return; - } - if (other.Name.Length != 0) { - Name = other.Name; - } - if (other.value_ != null) { - if (value_ == null) { - value_ = new global::Mysqlx.Datatypes.Any(); - } - Value.MergeFrom(other.Value); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - Name = input.ReadString(); - break; - } - case 18: { - if (value_ == null) { - value_ = new global::Mysqlx.Datatypes.Any(); - } - input.ReadMessage(value_); - break; - } - } - } - } - - } - - /// - /// Capabilities - /// - internal sealed partial class Capabilities : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Capabilities()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Connection.MysqlxConnectionReflection.Descriptor.MessageTypes[1]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Capabilities() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Capabilities(Capabilities other) : this() { - capabilities_ = other.capabilities_.Clone(); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Capabilities Clone() { - return new Capabilities(this); - } - - /// Field number for the "capabilities" field. - public const int Capabilities_FieldNumber = 1; - private static readonly pb::FieldCodec _repeated_capabilities_codec - = pb::FieldCodec.ForMessage(10, global::Mysqlx.Connection.Capability.Parser); - private readonly pbc::RepeatedField capabilities_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField Capabilities_ { - get { return capabilities_; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Capabilities); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Capabilities other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if(!capabilities_.Equals(other.capabilities_)) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - hash ^= capabilities_.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - capabilities_.WriteTo(output, _repeated_capabilities_codec); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - size += capabilities_.CalculateSize(_repeated_capabilities_codec); - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Capabilities other) { - if (other == null) { - return; - } - capabilities_.Add(other.capabilities_); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - capabilities_.AddEntriesFrom(input, _repeated_capabilities_codec); - break; - } - } - } - } - - } - - /// - /// get supported connection capabilities and their current state - /// - /// :returns: :protobuf:msg:`Mysqlx.Connection::Capabilities` or :protobuf:msg:`Mysqlx::Error` - /// - internal sealed partial class CapabilitiesGet : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new CapabilitiesGet()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Connection.MysqlxConnectionReflection.Descriptor.MessageTypes[2]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public CapabilitiesGet() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public CapabilitiesGet(CapabilitiesGet other) : this() { - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public CapabilitiesGet Clone() { - return new CapabilitiesGet(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as CapabilitiesGet); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(CapabilitiesGet other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(CapabilitiesGet other) { - if (other == null) { - return; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - } - } - } - - } - - /// - /// sets connection capabilities atomically - /// - /// only provided values are changed, other values are left unchanged. - /// If any of the changes fails, all changes are discarded. - /// - /// :precond: active sessions == 0 - /// :returns: :protobuf:msg:`Mysqlx::Ok` or :protobuf:msg:`Mysqlx::Error` - /// - internal sealed partial class CapabilitiesSet : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new CapabilitiesSet()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Connection.MysqlxConnectionReflection.Descriptor.MessageTypes[3]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public CapabilitiesSet() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public CapabilitiesSet(CapabilitiesSet other) : this() { - Capabilities = other.capabilities_ != null ? other.Capabilities.Clone() : null; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public CapabilitiesSet Clone() { - return new CapabilitiesSet(this); - } - - /// Field number for the "capabilities" field. - public const int CapabilitiesFieldNumber = 1; - private global::Mysqlx.Connection.Capabilities capabilities_; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Connection.Capabilities Capabilities { - get { return capabilities_; } - set { - capabilities_ = value; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as CapabilitiesSet); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(CapabilitiesSet other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (!object.Equals(Capabilities, other.Capabilities)) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (capabilities_ != null) hash ^= Capabilities.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (capabilities_ != null) { - output.WriteRawTag(10); - output.WriteMessage(Capabilities); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (capabilities_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Capabilities); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(CapabilitiesSet other) { - if (other == null) { - return; - } - if (other.capabilities_ != null) { - if (capabilities_ == null) { - capabilities_ = new global::Mysqlx.Connection.Capabilities(); - } - Capabilities.MergeFrom(other.Capabilities); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - if (capabilities_ == null) { - capabilities_ = new global::Mysqlx.Connection.Capabilities(); - } - input.ReadMessage(capabilities_); - break; - } - } - } - } - - } - - /// - /// announce to the server that the client wants to close the connection - /// - /// it discards any session state of the server - /// - /// :Returns: :protobuf:msg:`Mysqlx::Ok` - /// - internal sealed partial class Close : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Close()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Connection.MysqlxConnectionReflection.Descriptor.MessageTypes[4]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Close() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Close(Close other) : this() { - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Close Clone() { - return new Close(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Close); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Close other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Close other) { - if (other == null) { - return; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - } - } - } - - } - - #endregion - -} - -#endregion Designer generated code diff --git a/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxCrud.cs b/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxCrud.cs deleted file mode 100644 index 815f7ce71..000000000 --- a/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxCrud.cs +++ /dev/null @@ -1,3249 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: mysqlx_crud.proto -#pragma warning disable 1591, 0612, 3021 -#region Designer generated code - -using pb = global::Google.Protobuf; -using pbc = global::Google.Protobuf.Collections; -using pbr = global::Google.Protobuf.Reflection; -using scg = global::System.Collections.Generic; -namespace Mysqlx.Crud { - - /// Holder for reflection information generated from mysqlx_crud.proto - internal static partial class MysqlxCrudReflection { - - #region Descriptor - /// File descriptor for mysqlx_crud.proto - public static pbr::FileDescriptor Descriptor { - get { return descriptor; } - } - private static pbr::FileDescriptor descriptor; - - static MysqlxCrudReflection() { - byte[] descriptorData = global::System.Convert.FromBase64String( - string.Concat( - "ChFteXNxbHhfY3J1ZC5wcm90bxILTXlzcWx4LkNydWQaEW15c3FseF9leHBy", - "LnByb3RvGhZteXNxbHhfZGF0YXR5cGVzLnByb3RvIlsKBkNvbHVtbhIMCgRu", - "YW1lGAEgASgJEg0KBWFsaWFzGAIgASgJEjQKDWRvY3VtZW50X3BhdGgYAyAD", - "KAsyHS5NeXNxbHguRXhwci5Eb2N1bWVudFBhdGhJdGVtIj4KClByb2plY3Rp", - "b24SIQoGc291cmNlGAEgASgLMhEuTXlzcWx4LkV4cHIuRXhwchINCgVhbGlh", - "cxgCIAEoCSIqCgpDb2xsZWN0aW9uEgwKBG5hbWUYASABKAkSDgoGc2NoZW1h", - "GAIgASgJIioKBUxpbWl0EhEKCXJvd19jb3VudBgBIAEoBBIOCgZvZmZzZXQY", - "AiABKAQigwEKBU9yZGVyEh8KBGV4cHIYASABKAsyES5NeXNxbHguRXhwci5F", - "eHByEi8KCWRpcmVjdGlvbhgCIAEoDjIcLk15c3FseC5DcnVkLk9yZGVyLkRp", - "cmVjdGlvbiIoCglEaXJlY3Rpb24SCAoETk9ORRAAEgcKA0FTQxABEggKBERF", - "U0MQAiKlAgoPVXBkYXRlT3BlcmF0aW9uEi0KBnNvdXJjZRgBIAEoCzIdLk15", - "c3FseC5FeHByLkNvbHVtbklkZW50aWZpZXISOgoJb3BlcmF0aW9uGAIgASgO", - "MicuTXlzcWx4LkNydWQuVXBkYXRlT3BlcmF0aW9uLlVwZGF0ZVR5cGUSIAoF", - "dmFsdWUYAyABKAsyES5NeXNxbHguRXhwci5FeHByIoQBCgpVcGRhdGVUeXBl", - "EggKBE5PTkUQABIHCgNTRVQQARIPCgtJVEVNX1JFTU9WRRACEgwKCElURU1f", - "U0VUEAMSEAoMSVRFTV9SRVBMQUNFEAQSDgoKSVRFTV9NRVJHRRAFEhAKDEFS", - "UkFZX0lOU0VSVBAGEhAKDEFSUkFZX0FQUEVORBAHIvICCgRGaW5kEisKCmNv", - "bGxlY3Rpb24YAiABKAsyFy5NeXNxbHguQ3J1ZC5Db2xsZWN0aW9uEioKCmRh", - "dGFfbW9kZWwYAyABKA4yFi5NeXNxbHguQ3J1ZC5EYXRhTW9kZWwSKwoKcHJv", - "amVjdGlvbhgEIAMoCzIXLk15c3FseC5DcnVkLlByb2plY3Rpb24SIwoIY3Jp", - "dGVyaWEYBSABKAsyES5NeXNxbHguRXhwci5FeHByEiYKBGFyZ3MYCyADKAsy", - "GC5NeXNxbHguRGF0YXR5cGVzLlNjYWxhchIhCgVsaW1pdBgGIAEoCzISLk15", - "c3FseC5DcnVkLkxpbWl0EiEKBW9yZGVyGAcgAygLMhIuTXlzcWx4LkNydWQu", - "T3JkZXISIwoIZ3JvdXBpbmcYCCADKAsyES5NeXNxbHguRXhwci5FeHByEiwK", - "EWdyb3VwaW5nX2NyaXRlcmlhGAkgASgLMhEuTXlzcWx4LkV4cHIuRXhwciKL", - "AgoGSW5zZXJ0EisKCmNvbGxlY3Rpb24YASABKAsyFy5NeXNxbHguQ3J1ZC5D", - "b2xsZWN0aW9uEioKCmRhdGFfbW9kZWwYAiABKA4yFi5NeXNxbHguQ3J1ZC5E", - "YXRhTW9kZWwSJwoKcHJvamVjdGlvbhgDIAMoCzITLk15c3FseC5DcnVkLkNv", - "bHVtbhIpCgNyb3cYBCADKAsyHC5NeXNxbHguQ3J1ZC5JbnNlcnQuVHlwZWRS", - "b3cSJgoEYXJncxgFIAMoCzIYLk15c3FseC5EYXRhdHlwZXMuU2NhbGFyGiwK", - "CFR5cGVkUm93EiAKBWZpZWxkGAEgAygLMhEuTXlzcWx4LkV4cHIuRXhwciKl", - "AgoGVXBkYXRlEisKCmNvbGxlY3Rpb24YAiABKAsyFy5NeXNxbHguQ3J1ZC5D", - "b2xsZWN0aW9uEioKCmRhdGFfbW9kZWwYAyABKA4yFi5NeXNxbHguQ3J1ZC5E", - "YXRhTW9kZWwSIwoIY3JpdGVyaWEYBCABKAsyES5NeXNxbHguRXhwci5FeHBy", - "EiYKBGFyZ3MYCCADKAsyGC5NeXNxbHguRGF0YXR5cGVzLlNjYWxhchIhCgVs", - "aW1pdBgFIAEoCzISLk15c3FseC5DcnVkLkxpbWl0EiEKBW9yZGVyGAYgAygL", - "MhIuTXlzcWx4LkNydWQuT3JkZXISLwoJb3BlcmF0aW9uGAcgAygLMhwuTXlz", - "cWx4LkNydWQuVXBkYXRlT3BlcmF0aW9uIvQBCgZEZWxldGUSKwoKY29sbGVj", - "dGlvbhgBIAEoCzIXLk15c3FseC5DcnVkLkNvbGxlY3Rpb24SKgoKZGF0YV9t", - "b2RlbBgCIAEoDjIWLk15c3FseC5DcnVkLkRhdGFNb2RlbBIjCghjcml0ZXJp", - "YRgDIAEoCzIRLk15c3FseC5FeHByLkV4cHISJgoEYXJncxgGIAMoCzIYLk15", - "c3FseC5EYXRhdHlwZXMuU2NhbGFyEiEKBWxpbWl0GAQgASgLMhIuTXlzcWx4", - "LkNydWQuTGltaXQSIQoFb3JkZXIYBSADKAsyEi5NeXNxbHguQ3J1ZC5PcmRl", - "ciKhAgoKQ3JlYXRlVmlldxIrCgpjb2xsZWN0aW9uGAEgASgLMhcuTXlzcWx4", - "LkNydWQuQ29sbGVjdGlvbhIPCgdkZWZpbmVyGAIgASgJEi0KCWFsZ29yaXRo", - "bRgDIAEoDjIaLk15c3FseC5DcnVkLlZpZXdBbGdvcml0aG0SLgoIc2VjdXJp", - "dHkYBCABKA4yHC5NeXNxbHguQ3J1ZC5WaWV3U3FsU2VjdXJpdHkSKwoFY2hl", - "Y2sYBSABKA4yHC5NeXNxbHguQ3J1ZC5WaWV3Q2hlY2tPcHRpb24SDgoGY29s", - "dW1uGAYgAygJEh8KBHN0bXQYByABKAsyES5NeXNxbHguQ3J1ZC5GaW5kEhgK", - "EHJlcGxhY2VfZXhpc3RpbmcYCCABKAgihwIKCk1vZGlmeVZpZXcSKwoKY29s", - "bGVjdGlvbhgBIAEoCzIXLk15c3FseC5DcnVkLkNvbGxlY3Rpb24SDwoHZGVm", - "aW5lchgCIAEoCRItCglhbGdvcml0aG0YAyABKA4yGi5NeXNxbHguQ3J1ZC5W", - "aWV3QWxnb3JpdGhtEi4KCHNlY3VyaXR5GAQgASgOMhwuTXlzcWx4LkNydWQu", - "Vmlld1NxbFNlY3VyaXR5EisKBWNoZWNrGAUgASgOMhwuTXlzcWx4LkNydWQu", - "Vmlld0NoZWNrT3B0aW9uEg4KBmNvbHVtbhgGIAMoCRIfCgRzdG10GAcgASgL", - "MhEuTXlzcWx4LkNydWQuRmluZCJKCghEcm9wVmlldxIrCgpjb2xsZWN0aW9u", - "GAEgASgLMhcuTXlzcWx4LkNydWQuQ29sbGVjdGlvbhIRCglpZl9leGlzdHMY", - "AiABKAgqLgoJRGF0YU1vZGVsEggKBE5PTkUQABIMCghET0NVTUVOVBABEgkK", - "BVRBQkxFEAIqRAoNVmlld0FsZ29yaXRobRIKCgZWQU5PTkUQABINCglVTkRF", - "RklORUQQARIJCgVNRVJHRRACEg0KCVRFTVBUQUJMRRADKjcKD1ZpZXdTcWxT", - "ZWN1cml0eRIKCgZWU05PTkUQABILCgdJTlZPS0VSEAESCwoHREVGSU5FUhAC", - "KjYKD1ZpZXdDaGVja09wdGlvbhIKCgZWT05PTkUQABIJCgVMT0NBTBABEgwK", - "CENBU0NBREVEEAJCHgocY29tLm15c3FsLmNqLm15c3FseC5wcm90b2J1ZmIG", - "cHJvdG8z")); - descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, - new pbr::FileDescriptor[] { global::Mysqlx.Expr.MysqlxExprReflection.Descriptor, global::Mysqlx.Datatypes.MysqlxDatatypesReflection.Descriptor, }, - new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Mysqlx.Crud.DataModel), typeof(global::Mysqlx.Crud.ViewAlgorithm), typeof(global::Mysqlx.Crud.ViewSqlSecurity), typeof(global::Mysqlx.Crud.ViewCheckOption), }, new pbr::GeneratedClrTypeInfo[] { - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.Column), global::Mysqlx.Crud.Column.Parser, new[]{ "Name", "Alias", "DocumentPath" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.Projection), global::Mysqlx.Crud.Projection.Parser, new[]{ "Source", "Alias" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.Collection), global::Mysqlx.Crud.Collection.Parser, new[]{ "Name", "Schema" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.Limit), global::Mysqlx.Crud.Limit.Parser, new[]{ "RowCount", "Offset" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.Order), global::Mysqlx.Crud.Order.Parser, new[]{ "Expr", "Direction" }, null, new[]{ typeof(global::Mysqlx.Crud.Order.Types.Direction) }, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.UpdateOperation), global::Mysqlx.Crud.UpdateOperation.Parser, new[]{ "Source", "Operation", "Value" }, null, new[]{ typeof(global::Mysqlx.Crud.UpdateOperation.Types.UpdateType) }, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.Find), global::Mysqlx.Crud.Find.Parser, new[]{ "Collection", "DataModel", "Projection", "Criteria", "Args", "Limit", "Order", "Grouping", "GroupingCriteria" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.Insert), global::Mysqlx.Crud.Insert.Parser, new[]{ "Collection", "DataModel", "Projection", "Row", "Args" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.Insert.Types.TypedRow), global::Mysqlx.Crud.Insert.Types.TypedRow.Parser, new[]{ "Field" }, null, null, null)}), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.Update), global::Mysqlx.Crud.Update.Parser, new[]{ "Collection", "DataModel", "Criteria", "Args", "Limit", "Order", "Operation" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.Delete), global::Mysqlx.Crud.Delete.Parser, new[]{ "Collection", "DataModel", "Criteria", "Args", "Limit", "Order" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.CreateView), global::Mysqlx.Crud.CreateView.Parser, new[]{ "Collection", "Definer", "Algorithm", "Security", "Check", "Column", "Stmt", "ReplaceExisting" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.ModifyView), global::Mysqlx.Crud.ModifyView.Parser, new[]{ "Collection", "Definer", "Algorithm", "Security", "Check", "Column", "Stmt" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Crud.DropView), global::Mysqlx.Crud.DropView.Parser, new[]{ "Collection", "IfExists" }, null, null, null) - })); - } - #endregion - - } - #region Enums - /// - /// DataModel to use for filters, names, ... - /// - internal enum DataModel { - [pbr::OriginalName("NONE")] None = 0, - [pbr::OriginalName("DOCUMENT")] Document = 1, - [pbr::OriginalName("TABLE")] Table = 2, - } - - /// - /// ViewAlgorithm defines how MySQL Server processes the view - /// - internal enum ViewAlgorithm { - [pbr::OriginalName("VANONE")] Vanone = 0, - /// - /// MySQL chooses which algorithm to use - /// - [pbr::OriginalName("UNDEFINED")] Undefined = 1, - /// - /// the text of a statement that refers to the view and the view definition are merged - /// - [pbr::OriginalName("MERGE")] Merge = 2, - /// - /// the view are retrieved into a temporary table - /// - [pbr::OriginalName("TEMPTABLE")] Temptable = 3, - } - - /// - /// ViewSqlSecurity defines the security context in which the view is going to be - /// executed, this means that VIEW can be executed with current user permissions or - /// with permissions of the uses who defined the VIEW - /// - internal enum ViewSqlSecurity { - [pbr::OriginalName("VSNONE")] Vsnone = 0, - [pbr::OriginalName("INVOKER")] Invoker = 1, - [pbr::OriginalName("DEFINER")] Definer = 2, - } - - /// - /// ViewCheckOption limits the write operations done on a `VIEW` - /// (`INSERT`, `UPDATE`, `DELETE`) to rows in which the `WHERE` clause is `TRUE` - /// - internal enum ViewCheckOption { - [pbr::OriginalName("VONONE")] Vonone = 0, - /// - /// the view WHERE clause is checked, but no underlying views are checked - /// - [pbr::OriginalName("LOCAL")] Local = 1, - /// - /// the view WHERE clause is checked, then checking recurses to underlying views - /// - [pbr::OriginalName("CASCADED")] Cascaded = 2, - } - - #endregion - - #region Messages - /// - /// column definition - /// - internal sealed partial class Column : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Column()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[0]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Column() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Column(Column other) : this() { - name_ = other.name_; - alias_ = other.alias_; - documentPath_ = other.documentPath_.Clone(); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Column Clone() { - return new Column(this); - } - - /// Field number for the "name" field. - public const int NameFieldNumber = 1; - private string name_ = ""; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string Name { - get { return name_; } - set { - name_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "alias" field. - public const int AliasFieldNumber = 2; - private string alias_ = ""; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string Alias { - get { return alias_; } - set { - alias_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "document_path" field. - public const int DocumentPathFieldNumber = 3; - private static readonly pb::FieldCodec _repeated_documentPath_codec - = pb::FieldCodec.ForMessage(26, global::Mysqlx.Expr.DocumentPathItem.Parser); - private readonly pbc::RepeatedField documentPath_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField DocumentPath { - get { return documentPath_; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Column); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Column other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (Name != other.Name) return false; - if (Alias != other.Alias) return false; - if(!documentPath_.Equals(other.documentPath_)) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (Name.Length != 0) hash ^= Name.GetHashCode(); - if (Alias.Length != 0) hash ^= Alias.GetHashCode(); - hash ^= documentPath_.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (Name.Length != 0) { - output.WriteRawTag(10); - output.WriteString(Name); - } - if (Alias.Length != 0) { - output.WriteRawTag(18); - output.WriteString(Alias); - } - documentPath_.WriteTo(output, _repeated_documentPath_codec); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (Name.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(Name); - } - if (Alias.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(Alias); - } - size += documentPath_.CalculateSize(_repeated_documentPath_codec); - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Column other) { - if (other == null) { - return; - } - if (other.Name.Length != 0) { - Name = other.Name; - } - if (other.Alias.Length != 0) { - Alias = other.Alias; - } - documentPath_.Add(other.documentPath_); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - Name = input.ReadString(); - break; - } - case 18: { - Alias = input.ReadString(); - break; - } - case 26: { - documentPath_.AddEntriesFrom(input, _repeated_documentPath_codec); - break; - } - } - } - } - - } - - /// - /// a projection - /// - /// :param source: the expression identifying an element from the source data - /// which can include a column identifier or any expression - /// :param alias: optional alias. Required for DOCUMENTs (clients may use - /// the source string as default) - /// - internal sealed partial class Projection : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Projection()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[1]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Projection() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Projection(Projection other) : this() { - Source = other.source_ != null ? other.Source.Clone() : null; - alias_ = other.alias_; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Projection Clone() { - return new Projection(this); - } - - /// Field number for the "source" field. - public const int SourceFieldNumber = 1; - private global::Mysqlx.Expr.Expr source_; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Expr.Expr Source { - get { return source_; } - set { - source_ = value; - } - } - - /// Field number for the "alias" field. - public const int AliasFieldNumber = 2; - private string alias_ = ""; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string Alias { - get { return alias_; } - set { - alias_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Projection); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Projection other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (!object.Equals(Source, other.Source)) return false; - if (Alias != other.Alias) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (source_ != null) hash ^= Source.GetHashCode(); - if (Alias.Length != 0) hash ^= Alias.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (source_ != null) { - output.WriteRawTag(10); - output.WriteMessage(Source); - } - if (Alias.Length != 0) { - output.WriteRawTag(18); - output.WriteString(Alias); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (source_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Source); - } - if (Alias.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(Alias); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Projection other) { - if (other == null) { - return; - } - if (other.source_ != null) { - if (source_ == null) { - source_ = new global::Mysqlx.Expr.Expr(); - } - Source.MergeFrom(other.Source); - } - if (other.Alias.Length != 0) { - Alias = other.Alias; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - if (source_ == null) { - source_ = new global::Mysqlx.Expr.Expr(); - } - input.ReadMessage(source_); - break; - } - case 18: { - Alias = input.ReadString(); - break; - } - } - } - } - - } - - /// - /// collection - /// - internal sealed partial class Collection : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Collection()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[2]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Collection() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Collection(Collection other) : this() { - name_ = other.name_; - schema_ = other.schema_; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Collection Clone() { - return new Collection(this); - } - - /// Field number for the "name" field. - public const int NameFieldNumber = 1; - private string name_ = ""; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string Name { - get { return name_; } - set { - name_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "schema" field. - public const int SchemaFieldNumber = 2; - private string schema_ = ""; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string Schema { - get { return schema_; } - set { - schema_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Collection); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Collection other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (Name != other.Name) return false; - if (Schema != other.Schema) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (Name.Length != 0) hash ^= Name.GetHashCode(); - if (Schema.Length != 0) hash ^= Schema.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (Name.Length != 0) { - output.WriteRawTag(10); - output.WriteString(Name); - } - if (Schema.Length != 0) { - output.WriteRawTag(18); - output.WriteString(Schema); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (Name.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(Name); - } - if (Schema.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(Schema); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Collection other) { - if (other == null) { - return; - } - if (other.Name.Length != 0) { - Name = other.Name; - } - if (other.Schema.Length != 0) { - Schema = other.Schema; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - Name = input.ReadString(); - break; - } - case 18: { - Schema = input.ReadString(); - break; - } - } - } - } - - } - - /// - /// limit - /// - /// :param row_count: maximum rows to filter - /// :param offset: maximum rows to skip before applying the row_count - /// - internal sealed partial class Limit : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Limit()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[3]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Limit() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Limit(Limit other) : this() { - rowCount_ = other.rowCount_; - offset_ = other.offset_; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Limit Clone() { - return new Limit(this); - } - - /// Field number for the "row_count" field. - public const int RowCountFieldNumber = 1; - private ulong rowCount_; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public ulong RowCount { - get { return rowCount_; } - set { - rowCount_ = value; - } - } - - /// Field number for the "offset" field. - public const int OffsetFieldNumber = 2; - private ulong offset_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public ulong Offset { - get { return offset_; } - set { - offset_ = value; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Limit); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Limit other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (RowCount != other.RowCount) return false; - if (Offset != other.Offset) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (RowCount != 0UL) hash ^= RowCount.GetHashCode(); - if (Offset != 0UL) hash ^= Offset.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (RowCount != 0UL) { - output.WriteRawTag(8); - output.WriteUInt64(RowCount); - } - if (Offset != 0UL) { - output.WriteRawTag(16); - output.WriteUInt64(Offset); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (RowCount != 0UL) { - size += 1 + pb::CodedOutputStream.ComputeUInt64Size(RowCount); - } - if (Offset != 0UL) { - size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Offset); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Limit other) { - if (other == null) { - return; - } - if (other.RowCount != 0UL) { - RowCount = other.RowCount; - } - if (other.Offset != 0UL) { - Offset = other.Offset; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 8: { - RowCount = input.ReadUInt64(); - break; - } - case 16: { - Offset = input.ReadUInt64(); - break; - } - } - } - } - - } - - /// - /// sort order - /// - internal sealed partial class Order : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Order()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[4]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Order() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Order(Order other) : this() { - Expr = other.expr_ != null ? other.Expr.Clone() : null; - direction_ = other.direction_; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Order Clone() { - return new Order(this); - } - - /// Field number for the "expr" field. - public const int ExprFieldNumber = 1; - private global::Mysqlx.Expr.Expr expr_; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Expr.Expr Expr { - get { return expr_; } - set { - expr_ = value; - } - } - - /// Field number for the "direction" field. - public const int DirectionFieldNumber = 2; - private global::Mysqlx.Crud.Order.Types.Direction direction_ = 0; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Crud.Order.Types.Direction Direction { - get { return direction_; } - set { - direction_ = value; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Order); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Order other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (!object.Equals(Expr, other.Expr)) return false; - if (Direction != other.Direction) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (expr_ != null) hash ^= Expr.GetHashCode(); - if (Direction != 0) hash ^= Direction.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (expr_ != null) { - output.WriteRawTag(10); - output.WriteMessage(Expr); - } - if (Direction != 0) { - output.WriteRawTag(16); - output.WriteEnum((int) Direction); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (expr_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Expr); - } - if (Direction != 0) { - size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Direction); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Order other) { - if (other == null) { - return; - } - if (other.expr_ != null) { - if (expr_ == null) { - expr_ = new global::Mysqlx.Expr.Expr(); - } - Expr.MergeFrom(other.Expr); - } - if (other.Direction != 0) { - Direction = other.Direction; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - if (expr_ == null) { - expr_ = new global::Mysqlx.Expr.Expr(); - } - input.ReadMessage(expr_); - break; - } - case 16: { - direction_ = (global::Mysqlx.Crud.Order.Types.Direction) input.ReadEnum(); - break; - } - } - } - } - - #region Nested types - /// Container for nested types declared in the Order message type. - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - internal static partial class Types { - internal enum Direction { - [pbr::OriginalName("NONE")] None = 0, - [pbr::OriginalName("ASC")] Asc = 1, - [pbr::OriginalName("DESC")] Desc = 2, - } - - } - #endregion - - } - - /// - /// update operations - /// - /// :param source: specification of the value to be updated - /// if data_model is TABLE, a column name may be specified and also a document path, if the column has type JSON - /// if data_model is DOCUMENT, only document paths are allowed - /// in both cases, schema and table must be not set - /// :param operation: the type of operation to be performed - /// :param value: an expression to be computed as the new value for the operation - /// - internal sealed partial class UpdateOperation : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new UpdateOperation()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[5]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public UpdateOperation() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public UpdateOperation(UpdateOperation other) : this() { - Source = other.source_ != null ? other.Source.Clone() : null; - operation_ = other.operation_; - Value = other.value_ != null ? other.Value.Clone() : null; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public UpdateOperation Clone() { - return new UpdateOperation(this); - } - - /// Field number for the "source" field. - public const int SourceFieldNumber = 1; - private global::Mysqlx.Expr.ColumnIdentifier source_; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Expr.ColumnIdentifier Source { - get { return source_; } - set { - source_ = value; - } - } - - /// Field number for the "operation" field. - public const int OperationFieldNumber = 2; - private global::Mysqlx.Crud.UpdateOperation.Types.UpdateType operation_ = 0; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Crud.UpdateOperation.Types.UpdateType Operation { - get { return operation_; } - set { - operation_ = value; - } - } - - /// Field number for the "value" field. - public const int ValueFieldNumber = 3; - private global::Mysqlx.Expr.Expr value_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Expr.Expr Value { - get { return value_; } - set { - value_ = value; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as UpdateOperation); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(UpdateOperation other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (!object.Equals(Source, other.Source)) return false; - if (Operation != other.Operation) return false; - if (!object.Equals(Value, other.Value)) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (source_ != null) hash ^= Source.GetHashCode(); - if (Operation != 0) hash ^= Operation.GetHashCode(); - if (value_ != null) hash ^= Value.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (source_ != null) { - output.WriteRawTag(10); - output.WriteMessage(Source); - } - if (Operation != 0) { - output.WriteRawTag(16); - output.WriteEnum((int) Operation); - } - if (value_ != null) { - output.WriteRawTag(26); - output.WriteMessage(Value); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (source_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Source); - } - if (Operation != 0) { - size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Operation); - } - if (value_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Value); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(UpdateOperation other) { - if (other == null) { - return; - } - if (other.source_ != null) { - if (source_ == null) { - source_ = new global::Mysqlx.Expr.ColumnIdentifier(); - } - Source.MergeFrom(other.Source); - } - if (other.Operation != 0) { - Operation = other.Operation; - } - if (other.value_ != null) { - if (value_ == null) { - value_ = new global::Mysqlx.Expr.Expr(); - } - Value.MergeFrom(other.Value); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - if (source_ == null) { - source_ = new global::Mysqlx.Expr.ColumnIdentifier(); - } - input.ReadMessage(source_); - break; - } - case 16: { - operation_ = (global::Mysqlx.Crud.UpdateOperation.Types.UpdateType) input.ReadEnum(); - break; - } - case 26: { - if (value_ == null) { - value_ = new global::Mysqlx.Expr.Expr(); - } - input.ReadMessage(value_); - break; - } - } - } - } - - #region Nested types - /// Container for nested types declared in the UpdateOperation message type. - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - internal static partial class Types { - internal enum UpdateType { - [pbr::OriginalName("NONE")] None = 0, - /// - /// only allowed for TABLE - /// - [pbr::OriginalName("SET")] Set = 1, - /// - /// no value (removes the identified path from a object or array) - /// - [pbr::OriginalName("ITEM_REMOVE")] ItemRemove = 2, - /// - /// sets the new value on the identified path - /// - [pbr::OriginalName("ITEM_SET")] ItemSet = 3, - /// - /// replaces a value if the path exists - /// - [pbr::OriginalName("ITEM_REPLACE")] ItemReplace = 4, - /// - /// source and value must be documents - /// - [pbr::OriginalName("ITEM_MERGE")] ItemMerge = 5, - /// - /// insert the value in the array at the index identified in the source path - /// - [pbr::OriginalName("ARRAY_INSERT")] ArrayInsert = 6, - /// - /// append the value on the array at the identified path - /// - [pbr::OriginalName("ARRAY_APPEND")] ArrayAppend = 7, - } - - } - #endregion - - } - - /// - /// Find Documents/Rows in a Collection/Table - /// - /// .. uml:: - /// - /// client -> server: Find - /// ... one or more Resultset ... - /// - /// :param collection: collection to insert into - /// :param data_model: datamodel that the operations refer to - /// :param projection: list of column projections that shall be returned - /// :param args: values for parameters used in filter expression - /// :param criteria: filter criteria - /// :param limit: numbers of rows that shall be skipped and returned - /// :param order: sort-order in which the rows/document shall be returned in - /// :param grouping: column expression list for aggregation (GROUP BY) - /// :param grouping_criteria: filter criteria for aggregated groups - /// :Returns: :protobuf:msg:`Mysqlx.Resultset::` - /// - internal sealed partial class Find : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Find()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[6]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Find() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Find(Find other) : this() { - Collection = other.collection_ != null ? other.Collection.Clone() : null; - dataModel_ = other.dataModel_; - projection_ = other.projection_.Clone(); - Criteria = other.criteria_ != null ? other.Criteria.Clone() : null; - args_ = other.args_.Clone(); - Limit = other.limit_ != null ? other.Limit.Clone() : null; - order_ = other.order_.Clone(); - grouping_ = other.grouping_.Clone(); - GroupingCriteria = other.groupingCriteria_ != null ? other.GroupingCriteria.Clone() : null; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Find Clone() { - return new Find(this); - } - - /// Field number for the "collection" field. - public const int CollectionFieldNumber = 2; - private global::Mysqlx.Crud.Collection collection_; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Crud.Collection Collection { - get { return collection_; } - set { - collection_ = value; - } - } - - /// Field number for the "data_model" field. - public const int DataModelFieldNumber = 3; - private global::Mysqlx.Crud.DataModel dataModel_ = 0; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Crud.DataModel DataModel { - get { return dataModel_; } - set { - dataModel_ = value; - } - } - - /// Field number for the "projection" field. - public const int ProjectionFieldNumber = 4; - private static readonly pb::FieldCodec _repeated_projection_codec - = pb::FieldCodec.ForMessage(34, global::Mysqlx.Crud.Projection.Parser); - private readonly pbc::RepeatedField projection_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField Projection { - get { return projection_; } - } - - /// Field number for the "criteria" field. - public const int CriteriaFieldNumber = 5; - private global::Mysqlx.Expr.Expr criteria_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Expr.Expr Criteria { - get { return criteria_; } - set { - criteria_ = value; - } - } - - /// Field number for the "args" field. - public const int ArgsFieldNumber = 11; - private static readonly pb::FieldCodec _repeated_args_codec - = pb::FieldCodec.ForMessage(90, global::Mysqlx.Datatypes.Scalar.Parser); - private readonly pbc::RepeatedField args_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField Args { - get { return args_; } - } - - /// Field number for the "limit" field. - public const int LimitFieldNumber = 6; - private global::Mysqlx.Crud.Limit limit_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Crud.Limit Limit { - get { return limit_; } - set { - limit_ = value; - } - } - - /// Field number for the "order" field. - public const int OrderFieldNumber = 7; - private static readonly pb::FieldCodec _repeated_order_codec - = pb::FieldCodec.ForMessage(58, global::Mysqlx.Crud.Order.Parser); - private readonly pbc::RepeatedField order_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField Order { - get { return order_; } - } - - /// Field number for the "grouping" field. - public const int GroupingFieldNumber = 8; - private static readonly pb::FieldCodec _repeated_grouping_codec - = pb::FieldCodec.ForMessage(66, global::Mysqlx.Expr.Expr.Parser); - private readonly pbc::RepeatedField grouping_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField Grouping { - get { return grouping_; } - } - - /// Field number for the "grouping_criteria" field. - public const int GroupingCriteriaFieldNumber = 9; - private global::Mysqlx.Expr.Expr groupingCriteria_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Expr.Expr GroupingCriteria { - get { return groupingCriteria_; } - set { - groupingCriteria_ = value; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Find); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Find other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (!object.Equals(Collection, other.Collection)) return false; - if (DataModel != other.DataModel) return false; - if(!projection_.Equals(other.projection_)) return false; - if (!object.Equals(Criteria, other.Criteria)) return false; - if(!args_.Equals(other.args_)) return false; - if (!object.Equals(Limit, other.Limit)) return false; - if(!order_.Equals(other.order_)) return false; - if(!grouping_.Equals(other.grouping_)) return false; - if (!object.Equals(GroupingCriteria, other.GroupingCriteria)) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (collection_ != null) hash ^= Collection.GetHashCode(); - if (DataModel != 0) hash ^= DataModel.GetHashCode(); - hash ^= projection_.GetHashCode(); - if (criteria_ != null) hash ^= Criteria.GetHashCode(); - hash ^= args_.GetHashCode(); - if (limit_ != null) hash ^= Limit.GetHashCode(); - hash ^= order_.GetHashCode(); - hash ^= grouping_.GetHashCode(); - if (groupingCriteria_ != null) hash ^= GroupingCriteria.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (collection_ != null) { - output.WriteRawTag(18); - output.WriteMessage(Collection); - } - if (DataModel != 0) { - output.WriteRawTag(24); - output.WriteEnum((int) DataModel); - } - projection_.WriteTo(output, _repeated_projection_codec); - if (criteria_ != null) { - output.WriteRawTag(42); - output.WriteMessage(Criteria); - } - if (limit_ != null) { - output.WriteRawTag(50); - output.WriteMessage(Limit); - } - order_.WriteTo(output, _repeated_order_codec); - grouping_.WriteTo(output, _repeated_grouping_codec); - if (groupingCriteria_ != null) { - output.WriteRawTag(74); - output.WriteMessage(GroupingCriteria); - } - args_.WriteTo(output, _repeated_args_codec); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (collection_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Collection); - } - if (DataModel != 0) { - size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) DataModel); - } - size += projection_.CalculateSize(_repeated_projection_codec); - if (criteria_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Criteria); - } - size += args_.CalculateSize(_repeated_args_codec); - if (limit_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Limit); - } - size += order_.CalculateSize(_repeated_order_codec); - size += grouping_.CalculateSize(_repeated_grouping_codec); - if (groupingCriteria_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(GroupingCriteria); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Find other) { - if (other == null) { - return; - } - if (other.collection_ != null) { - if (collection_ == null) { - collection_ = new global::Mysqlx.Crud.Collection(); - } - Collection.MergeFrom(other.Collection); - } - if (other.DataModel != 0) { - DataModel = other.DataModel; - } - projection_.Add(other.projection_); - if (other.criteria_ != null) { - if (criteria_ == null) { - criteria_ = new global::Mysqlx.Expr.Expr(); - } - Criteria.MergeFrom(other.Criteria); - } - args_.Add(other.args_); - if (other.limit_ != null) { - if (limit_ == null) { - limit_ = new global::Mysqlx.Crud.Limit(); - } - Limit.MergeFrom(other.Limit); - } - order_.Add(other.order_); - grouping_.Add(other.grouping_); - if (other.groupingCriteria_ != null) { - if (groupingCriteria_ == null) { - groupingCriteria_ = new global::Mysqlx.Expr.Expr(); - } - GroupingCriteria.MergeFrom(other.GroupingCriteria); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 18: { - if (collection_ == null) { - collection_ = new global::Mysqlx.Crud.Collection(); - } - input.ReadMessage(collection_); - break; - } - case 24: { - dataModel_ = (global::Mysqlx.Crud.DataModel) input.ReadEnum(); - break; - } - case 34: { - projection_.AddEntriesFrom(input, _repeated_projection_codec); - break; - } - case 42: { - if (criteria_ == null) { - criteria_ = new global::Mysqlx.Expr.Expr(); - } - input.ReadMessage(criteria_); - break; - } - case 50: { - if (limit_ == null) { - limit_ = new global::Mysqlx.Crud.Limit(); - } - input.ReadMessage(limit_); - break; - } - case 58: { - order_.AddEntriesFrom(input, _repeated_order_codec); - break; - } - case 66: { - grouping_.AddEntriesFrom(input, _repeated_grouping_codec); - break; - } - case 74: { - if (groupingCriteria_ == null) { - groupingCriteria_ = new global::Mysqlx.Expr.Expr(); - } - input.ReadMessage(groupingCriteria_); - break; - } - case 90: { - args_.AddEntriesFrom(input, _repeated_args_codec); - break; - } - } - } - } - - } - - /// - /// Insert documents/rows into a collection/table - /// - /// :param collection: collection to insert into - /// :param data_model: datamodel that the operations refer to - /// :param projection: name of the columns to insert data into (empty if data_model is DOCUMENT) - /// :param row: set of rows to insert into the collection/table (a single expression with a JSON document literal or an OBJECT expression) - /// :param args: values for parameters used in row expressions - /// :Returns: :protobuf:msg:`Mysqlx.Resultset::` - /// - internal sealed partial class Insert : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Insert()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[7]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Insert() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Insert(Insert other) : this() { - Collection = other.collection_ != null ? other.Collection.Clone() : null; - dataModel_ = other.dataModel_; - projection_ = other.projection_.Clone(); - row_ = other.row_.Clone(); - args_ = other.args_.Clone(); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Insert Clone() { - return new Insert(this); - } - - /// Field number for the "collection" field. - public const int CollectionFieldNumber = 1; - private global::Mysqlx.Crud.Collection collection_; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Crud.Collection Collection { - get { return collection_; } - set { - collection_ = value; - } - } - - /// Field number for the "data_model" field. - public const int DataModelFieldNumber = 2; - private global::Mysqlx.Crud.DataModel dataModel_ = 0; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Crud.DataModel DataModel { - get { return dataModel_; } - set { - dataModel_ = value; - } - } - - /// Field number for the "projection" field. - public const int ProjectionFieldNumber = 3; - private static readonly pb::FieldCodec _repeated_projection_codec - = pb::FieldCodec.ForMessage(26, global::Mysqlx.Crud.Column.Parser); - private readonly pbc::RepeatedField projection_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField Projection { - get { return projection_; } - } - - /// Field number for the "row" field. - public const int RowFieldNumber = 4; - private static readonly pb::FieldCodec _repeated_row_codec - = pb::FieldCodec.ForMessage(34, global::Mysqlx.Crud.Insert.Types.TypedRow.Parser); - private readonly pbc::RepeatedField row_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField Row { - get { return row_; } - } - - /// Field number for the "args" field. - public const int ArgsFieldNumber = 5; - private static readonly pb::FieldCodec _repeated_args_codec - = pb::FieldCodec.ForMessage(42, global::Mysqlx.Datatypes.Scalar.Parser); - private readonly pbc::RepeatedField args_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField Args { - get { return args_; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Insert); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Insert other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (!object.Equals(Collection, other.Collection)) return false; - if (DataModel != other.DataModel) return false; - if(!projection_.Equals(other.projection_)) return false; - if(!row_.Equals(other.row_)) return false; - if(!args_.Equals(other.args_)) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (collection_ != null) hash ^= Collection.GetHashCode(); - if (DataModel != 0) hash ^= DataModel.GetHashCode(); - hash ^= projection_.GetHashCode(); - hash ^= row_.GetHashCode(); - hash ^= args_.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (collection_ != null) { - output.WriteRawTag(10); - output.WriteMessage(Collection); - } - if (DataModel != 0) { - output.WriteRawTag(16); - output.WriteEnum((int) DataModel); - } - projection_.WriteTo(output, _repeated_projection_codec); - row_.WriteTo(output, _repeated_row_codec); - args_.WriteTo(output, _repeated_args_codec); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (collection_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Collection); - } - if (DataModel != 0) { - size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) DataModel); - } - size += projection_.CalculateSize(_repeated_projection_codec); - size += row_.CalculateSize(_repeated_row_codec); - size += args_.CalculateSize(_repeated_args_codec); - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Insert other) { - if (other == null) { - return; - } - if (other.collection_ != null) { - if (collection_ == null) { - collection_ = new global::Mysqlx.Crud.Collection(); - } - Collection.MergeFrom(other.Collection); - } - if (other.DataModel != 0) { - DataModel = other.DataModel; - } - projection_.Add(other.projection_); - row_.Add(other.row_); - args_.Add(other.args_); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - if (collection_ == null) { - collection_ = new global::Mysqlx.Crud.Collection(); - } - input.ReadMessage(collection_); - break; - } - case 16: { - dataModel_ = (global::Mysqlx.Crud.DataModel) input.ReadEnum(); - break; - } - case 26: { - projection_.AddEntriesFrom(input, _repeated_projection_codec); - break; - } - case 34: { - row_.AddEntriesFrom(input, _repeated_row_codec); - break; - } - case 42: { - args_.AddEntriesFrom(input, _repeated_args_codec); - break; - } - } - } - } - - #region Nested types - /// Container for nested types declared in the Insert message type. - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - internal static partial class Types { - internal sealed partial class TypedRow : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new TypedRow()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Crud.Insert.Descriptor.NestedTypes[0]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public TypedRow() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public TypedRow(TypedRow other) : this() { - field_ = other.field_.Clone(); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public TypedRow Clone() { - return new TypedRow(this); - } - - /// Field number for the "field" field. - public const int FieldFieldNumber = 1; - private static readonly pb::FieldCodec _repeated_field_codec - = pb::FieldCodec.ForMessage(10, global::Mysqlx.Expr.Expr.Parser); - private readonly pbc::RepeatedField field_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField Field { - get { return field_; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as TypedRow); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(TypedRow other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if(!field_.Equals(other.field_)) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - hash ^= field_.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - field_.WriteTo(output, _repeated_field_codec); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - size += field_.CalculateSize(_repeated_field_codec); - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(TypedRow other) { - if (other == null) { - return; - } - field_.Add(other.field_); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - field_.AddEntriesFrom(input, _repeated_field_codec); - break; - } - } - } - } - - } - - } - #endregion - - } - - /// - /// Update documents/rows in a collection/table - /// - /// :param collection: collection to change - /// :param data_model: datamodel that the operations refer to - /// :param criteria: filter expression to match rows that the operations will apply on - /// :param args: values for parameters used in filter expression - /// :param limit: limits the number of rows to match - /// :param order: specifies order of matched rows - /// :param operation: list of operations to be applied. Valid operations will depend on the data_model. - /// :Returns: :protobuf:msg:`Mysqlx.Resultset::` - /// - internal sealed partial class Update : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Update()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[8]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Update() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Update(Update other) : this() { - Collection = other.collection_ != null ? other.Collection.Clone() : null; - dataModel_ = other.dataModel_; - Criteria = other.criteria_ != null ? other.Criteria.Clone() : null; - args_ = other.args_.Clone(); - Limit = other.limit_ != null ? other.Limit.Clone() : null; - order_ = other.order_.Clone(); - operation_ = other.operation_.Clone(); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Update Clone() { - return new Update(this); - } - - /// Field number for the "collection" field. - public const int CollectionFieldNumber = 2; - private global::Mysqlx.Crud.Collection collection_; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Crud.Collection Collection { - get { return collection_; } - set { - collection_ = value; - } - } - - /// Field number for the "data_model" field. - public const int DataModelFieldNumber = 3; - private global::Mysqlx.Crud.DataModel dataModel_ = 0; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Crud.DataModel DataModel { - get { return dataModel_; } - set { - dataModel_ = value; - } - } - - /// Field number for the "criteria" field. - public const int CriteriaFieldNumber = 4; - private global::Mysqlx.Expr.Expr criteria_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Expr.Expr Criteria { - get { return criteria_; } - set { - criteria_ = value; - } - } - - /// Field number for the "args" field. - public const int ArgsFieldNumber = 8; - private static readonly pb::FieldCodec _repeated_args_codec - = pb::FieldCodec.ForMessage(66, global::Mysqlx.Datatypes.Scalar.Parser); - private readonly pbc::RepeatedField args_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField Args { - get { return args_; } - } - - /// Field number for the "limit" field. - public const int LimitFieldNumber = 5; - private global::Mysqlx.Crud.Limit limit_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Crud.Limit Limit { - get { return limit_; } - set { - limit_ = value; - } - } - - /// Field number for the "order" field. - public const int OrderFieldNumber = 6; - private static readonly pb::FieldCodec _repeated_order_codec - = pb::FieldCodec.ForMessage(50, global::Mysqlx.Crud.Order.Parser); - private readonly pbc::RepeatedField order_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField Order { - get { return order_; } - } - - /// Field number for the "operation" field. - public const int OperationFieldNumber = 7; - private static readonly pb::FieldCodec _repeated_operation_codec - = pb::FieldCodec.ForMessage(58, global::Mysqlx.Crud.UpdateOperation.Parser); - private readonly pbc::RepeatedField operation_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField Operation { - get { return operation_; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Update); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Update other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (!object.Equals(Collection, other.Collection)) return false; - if (DataModel != other.DataModel) return false; - if (!object.Equals(Criteria, other.Criteria)) return false; - if(!args_.Equals(other.args_)) return false; - if (!object.Equals(Limit, other.Limit)) return false; - if(!order_.Equals(other.order_)) return false; - if(!operation_.Equals(other.operation_)) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (collection_ != null) hash ^= Collection.GetHashCode(); - if (DataModel != 0) hash ^= DataModel.GetHashCode(); - if (criteria_ != null) hash ^= Criteria.GetHashCode(); - hash ^= args_.GetHashCode(); - if (limit_ != null) hash ^= Limit.GetHashCode(); - hash ^= order_.GetHashCode(); - hash ^= operation_.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (collection_ != null) { - output.WriteRawTag(18); - output.WriteMessage(Collection); - } - if (DataModel != 0) { - output.WriteRawTag(24); - output.WriteEnum((int) DataModel); - } - if (criteria_ != null) { - output.WriteRawTag(34); - output.WriteMessage(Criteria); - } - if (limit_ != null) { - output.WriteRawTag(42); - output.WriteMessage(Limit); - } - order_.WriteTo(output, _repeated_order_codec); - operation_.WriteTo(output, _repeated_operation_codec); - args_.WriteTo(output, _repeated_args_codec); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (collection_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Collection); - } - if (DataModel != 0) { - size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) DataModel); - } - if (criteria_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Criteria); - } - size += args_.CalculateSize(_repeated_args_codec); - if (limit_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Limit); - } - size += order_.CalculateSize(_repeated_order_codec); - size += operation_.CalculateSize(_repeated_operation_codec); - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Update other) { - if (other == null) { - return; - } - if (other.collection_ != null) { - if (collection_ == null) { - collection_ = new global::Mysqlx.Crud.Collection(); - } - Collection.MergeFrom(other.Collection); - } - if (other.DataModel != 0) { - DataModel = other.DataModel; - } - if (other.criteria_ != null) { - if (criteria_ == null) { - criteria_ = new global::Mysqlx.Expr.Expr(); - } - Criteria.MergeFrom(other.Criteria); - } - args_.Add(other.args_); - if (other.limit_ != null) { - if (limit_ == null) { - limit_ = new global::Mysqlx.Crud.Limit(); - } - Limit.MergeFrom(other.Limit); - } - order_.Add(other.order_); - operation_.Add(other.operation_); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 18: { - if (collection_ == null) { - collection_ = new global::Mysqlx.Crud.Collection(); - } - input.ReadMessage(collection_); - break; - } - case 24: { - dataModel_ = (global::Mysqlx.Crud.DataModel) input.ReadEnum(); - break; - } - case 34: { - if (criteria_ == null) { - criteria_ = new global::Mysqlx.Expr.Expr(); - } - input.ReadMessage(criteria_); - break; - } - case 42: { - if (limit_ == null) { - limit_ = new global::Mysqlx.Crud.Limit(); - } - input.ReadMessage(limit_); - break; - } - case 50: { - order_.AddEntriesFrom(input, _repeated_order_codec); - break; - } - case 58: { - operation_.AddEntriesFrom(input, _repeated_operation_codec); - break; - } - case 66: { - args_.AddEntriesFrom(input, _repeated_args_codec); - break; - } - } - } - } - - } - - /// - /// Delete documents/rows from a Collection/Table - /// - /// :param collection: collection to change - /// :param data_model: datamodel that the operations refer to - /// :param criteria: filter expression to match rows that the operations will apply on - /// :param args: values for parameters used in filter expression - /// :param limit: limits the number of rows to match - /// :param order: specifies order of matched rows - /// :Returns: :protobuf:msg:`Mysqlx.Resultset::` - /// - internal sealed partial class Delete : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Delete()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[9]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Delete() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Delete(Delete other) : this() { - Collection = other.collection_ != null ? other.Collection.Clone() : null; - dataModel_ = other.dataModel_; - Criteria = other.criteria_ != null ? other.Criteria.Clone() : null; - args_ = other.args_.Clone(); - Limit = other.limit_ != null ? other.Limit.Clone() : null; - order_ = other.order_.Clone(); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Delete Clone() { - return new Delete(this); - } - - /// Field number for the "collection" field. - public const int CollectionFieldNumber = 1; - private global::Mysqlx.Crud.Collection collection_; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Crud.Collection Collection { - get { return collection_; } - set { - collection_ = value; - } - } - - /// Field number for the "data_model" field. - public const int DataModelFieldNumber = 2; - private global::Mysqlx.Crud.DataModel dataModel_ = 0; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Crud.DataModel DataModel { - get { return dataModel_; } - set { - dataModel_ = value; - } - } - - /// Field number for the "criteria" field. - public const int CriteriaFieldNumber = 3; - private global::Mysqlx.Expr.Expr criteria_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Expr.Expr Criteria { - get { return criteria_; } - set { - criteria_ = value; - } - } - - /// Field number for the "args" field. - public const int ArgsFieldNumber = 6; - private static readonly pb::FieldCodec _repeated_args_codec - = pb::FieldCodec.ForMessage(50, global::Mysqlx.Datatypes.Scalar.Parser); - private readonly pbc::RepeatedField args_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField Args { - get { return args_; } - } - - /// Field number for the "limit" field. - public const int LimitFieldNumber = 4; - private global::Mysqlx.Crud.Limit limit_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Crud.Limit Limit { - get { return limit_; } - set { - limit_ = value; - } - } - - /// Field number for the "order" field. - public const int OrderFieldNumber = 5; - private static readonly pb::FieldCodec _repeated_order_codec - = pb::FieldCodec.ForMessage(42, global::Mysqlx.Crud.Order.Parser); - private readonly pbc::RepeatedField order_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField Order { - get { return order_; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Delete); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Delete other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (!object.Equals(Collection, other.Collection)) return false; - if (DataModel != other.DataModel) return false; - if (!object.Equals(Criteria, other.Criteria)) return false; - if(!args_.Equals(other.args_)) return false; - if (!object.Equals(Limit, other.Limit)) return false; - if(!order_.Equals(other.order_)) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (collection_ != null) hash ^= Collection.GetHashCode(); - if (DataModel != 0) hash ^= DataModel.GetHashCode(); - if (criteria_ != null) hash ^= Criteria.GetHashCode(); - hash ^= args_.GetHashCode(); - if (limit_ != null) hash ^= Limit.GetHashCode(); - hash ^= order_.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (collection_ != null) { - output.WriteRawTag(10); - output.WriteMessage(Collection); - } - if (DataModel != 0) { - output.WriteRawTag(16); - output.WriteEnum((int) DataModel); - } - if (criteria_ != null) { - output.WriteRawTag(26); - output.WriteMessage(Criteria); - } - if (limit_ != null) { - output.WriteRawTag(34); - output.WriteMessage(Limit); - } - order_.WriteTo(output, _repeated_order_codec); - args_.WriteTo(output, _repeated_args_codec); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (collection_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Collection); - } - if (DataModel != 0) { - size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) DataModel); - } - if (criteria_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Criteria); - } - size += args_.CalculateSize(_repeated_args_codec); - if (limit_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Limit); - } - size += order_.CalculateSize(_repeated_order_codec); - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Delete other) { - if (other == null) { - return; - } - if (other.collection_ != null) { - if (collection_ == null) { - collection_ = new global::Mysqlx.Crud.Collection(); - } - Collection.MergeFrom(other.Collection); - } - if (other.DataModel != 0) { - DataModel = other.DataModel; - } - if (other.criteria_ != null) { - if (criteria_ == null) { - criteria_ = new global::Mysqlx.Expr.Expr(); - } - Criteria.MergeFrom(other.Criteria); - } - args_.Add(other.args_); - if (other.limit_ != null) { - if (limit_ == null) { - limit_ = new global::Mysqlx.Crud.Limit(); - } - Limit.MergeFrom(other.Limit); - } - order_.Add(other.order_); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - if (collection_ == null) { - collection_ = new global::Mysqlx.Crud.Collection(); - } - input.ReadMessage(collection_); - break; - } - case 16: { - dataModel_ = (global::Mysqlx.Crud.DataModel) input.ReadEnum(); - break; - } - case 26: { - if (criteria_ == null) { - criteria_ = new global::Mysqlx.Expr.Expr(); - } - input.ReadMessage(criteria_); - break; - } - case 34: { - if (limit_ == null) { - limit_ = new global::Mysqlx.Crud.Limit(); - } - input.ReadMessage(limit_); - break; - } - case 42: { - order_.AddEntriesFrom(input, _repeated_order_codec); - break; - } - case 50: { - args_.AddEntriesFrom(input, _repeated_args_codec); - break; - } - } - } - } - - } - - internal sealed partial class CreateView : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new CreateView()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[10]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public CreateView() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public CreateView(CreateView other) : this() { - Collection = other.collection_ != null ? other.Collection.Clone() : null; - definer_ = other.definer_; - algorithm_ = other.algorithm_; - security_ = other.security_; - check_ = other.check_; - column_ = other.column_.Clone(); - Stmt = other.stmt_ != null ? other.Stmt.Clone() : null; - replaceExisting_ = other.replaceExisting_; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public CreateView Clone() { - return new CreateView(this); - } - - /// Field number for the "collection" field. - public const int CollectionFieldNumber = 1; - private global::Mysqlx.Crud.Collection collection_; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Crud.Collection Collection { - get { return collection_; } - set { - collection_ = value; - } - } - - /// Field number for the "definer" field. - public const int DefinerFieldNumber = 2; - private string definer_ = ""; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string Definer { - get { return definer_; } - set { - definer_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "algorithm" field. - public const int AlgorithmFieldNumber = 3; - private global::Mysqlx.Crud.ViewAlgorithm algorithm_ = 0; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Crud.ViewAlgorithm Algorithm { - get { return algorithm_; } - set { - algorithm_ = value; - } - } - - /// Field number for the "security" field. - public const int SecurityFieldNumber = 4; - private global::Mysqlx.Crud.ViewSqlSecurity security_ = 0; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Crud.ViewSqlSecurity Security { - get { return security_; } - set { - security_ = value; - } - } - - /// Field number for the "check" field. - public const int CheckFieldNumber = 5; - private global::Mysqlx.Crud.ViewCheckOption check_ = 0; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Crud.ViewCheckOption Check { - get { return check_; } - set { - check_ = value; - } - } - - /// Field number for the "column" field. - public const int ColumnFieldNumber = 6; - private static readonly pb::FieldCodec _repeated_column_codec - = pb::FieldCodec.ForString(50); - private readonly pbc::RepeatedField column_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField Column { - get { return column_; } - } - - /// Field number for the "stmt" field. - public const int StmtFieldNumber = 7; - private global::Mysqlx.Crud.Find stmt_; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Crud.Find Stmt { - get { return stmt_; } - set { - stmt_ = value; - } - } - - /// Field number for the "replace_existing" field. - public const int ReplaceExistingFieldNumber = 8; - private bool replaceExisting_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool ReplaceExisting { - get { return replaceExisting_; } - set { - replaceExisting_ = value; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as CreateView); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(CreateView other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (!object.Equals(Collection, other.Collection)) return false; - if (Definer != other.Definer) return false; - if (Algorithm != other.Algorithm) return false; - if (Security != other.Security) return false; - if (Check != other.Check) return false; - if(!column_.Equals(other.column_)) return false; - if (!object.Equals(Stmt, other.Stmt)) return false; - if (ReplaceExisting != other.ReplaceExisting) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (collection_ != null) hash ^= Collection.GetHashCode(); - if (Definer.Length != 0) hash ^= Definer.GetHashCode(); - if (Algorithm != 0) hash ^= Algorithm.GetHashCode(); - if (Security != 0) hash ^= Security.GetHashCode(); - if (Check != 0) hash ^= Check.GetHashCode(); - hash ^= column_.GetHashCode(); - if (stmt_ != null) hash ^= Stmt.GetHashCode(); - if (ReplaceExisting != false) hash ^= ReplaceExisting.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (collection_ != null) { - output.WriteRawTag(10); - output.WriteMessage(Collection); - } - if (Definer.Length != 0) { - output.WriteRawTag(18); - output.WriteString(Definer); - } - if (Algorithm != 0) { - output.WriteRawTag(24); - output.WriteEnum((int) Algorithm); - } - if (Security != 0) { - output.WriteRawTag(32); - output.WriteEnum((int) Security); - } - if (Check != 0) { - output.WriteRawTag(40); - output.WriteEnum((int) Check); - } - column_.WriteTo(output, _repeated_column_codec); - if (stmt_ != null) { - output.WriteRawTag(58); - output.WriteMessage(Stmt); - } - if (ReplaceExisting != false) { - output.WriteRawTag(64); - output.WriteBool(ReplaceExisting); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (collection_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Collection); - } - if (Definer.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(Definer); - } - if (Algorithm != 0) { - size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Algorithm); - } - if (Security != 0) { - size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Security); - } - if (Check != 0) { - size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Check); - } - size += column_.CalculateSize(_repeated_column_codec); - if (stmt_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Stmt); - } - if (ReplaceExisting != false) { - size += 1 + 1; - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(CreateView other) { - if (other == null) { - return; - } - if (other.collection_ != null) { - if (collection_ == null) { - collection_ = new global::Mysqlx.Crud.Collection(); - } - Collection.MergeFrom(other.Collection); - } - if (other.Definer.Length != 0) { - Definer = other.Definer; - } - if (other.Algorithm != 0) { - Algorithm = other.Algorithm; - } - if (other.Security != 0) { - Security = other.Security; - } - if (other.Check != 0) { - Check = other.Check; - } - column_.Add(other.column_); - if (other.stmt_ != null) { - if (stmt_ == null) { - stmt_ = new global::Mysqlx.Crud.Find(); - } - Stmt.MergeFrom(other.Stmt); - } - if (other.ReplaceExisting != false) { - ReplaceExisting = other.ReplaceExisting; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - if (collection_ == null) { - collection_ = new global::Mysqlx.Crud.Collection(); - } - input.ReadMessage(collection_); - break; - } - case 18: { - Definer = input.ReadString(); - break; - } - case 24: { - algorithm_ = (global::Mysqlx.Crud.ViewAlgorithm) input.ReadEnum(); - break; - } - case 32: { - security_ = (global::Mysqlx.Crud.ViewSqlSecurity) input.ReadEnum(); - break; - } - case 40: { - check_ = (global::Mysqlx.Crud.ViewCheckOption) input.ReadEnum(); - break; - } - case 50: { - column_.AddEntriesFrom(input, _repeated_column_codec); - break; - } - case 58: { - if (stmt_ == null) { - stmt_ = new global::Mysqlx.Crud.Find(); - } - input.ReadMessage(stmt_); - break; - } - case 64: { - ReplaceExisting = input.ReadBool(); - break; - } - } - } - } - - } - - internal sealed partial class ModifyView : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new ModifyView()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[11]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public ModifyView() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public ModifyView(ModifyView other) : this() { - Collection = other.collection_ != null ? other.Collection.Clone() : null; - definer_ = other.definer_; - algorithm_ = other.algorithm_; - security_ = other.security_; - check_ = other.check_; - column_ = other.column_.Clone(); - Stmt = other.stmt_ != null ? other.Stmt.Clone() : null; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public ModifyView Clone() { - return new ModifyView(this); - } - - /// Field number for the "collection" field. - public const int CollectionFieldNumber = 1; - private global::Mysqlx.Crud.Collection collection_; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Crud.Collection Collection { - get { return collection_; } - set { - collection_ = value; - } - } - - /// Field number for the "definer" field. - public const int DefinerFieldNumber = 2; - private string definer_ = ""; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string Definer { - get { return definer_; } - set { - definer_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "algorithm" field. - public const int AlgorithmFieldNumber = 3; - private global::Mysqlx.Crud.ViewAlgorithm algorithm_ = 0; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Crud.ViewAlgorithm Algorithm { - get { return algorithm_; } - set { - algorithm_ = value; - } - } - - /// Field number for the "security" field. - public const int SecurityFieldNumber = 4; - private global::Mysqlx.Crud.ViewSqlSecurity security_ = 0; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Crud.ViewSqlSecurity Security { - get { return security_; } - set { - security_ = value; - } - } - - /// Field number for the "check" field. - public const int CheckFieldNumber = 5; - private global::Mysqlx.Crud.ViewCheckOption check_ = 0; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Crud.ViewCheckOption Check { - get { return check_; } - set { - check_ = value; - } - } - - /// Field number for the "column" field. - public const int ColumnFieldNumber = 6; - private static readonly pb::FieldCodec _repeated_column_codec - = pb::FieldCodec.ForString(50); - private readonly pbc::RepeatedField column_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField Column { - get { return column_; } - } - - /// Field number for the "stmt" field. - public const int StmtFieldNumber = 7; - private global::Mysqlx.Crud.Find stmt_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Crud.Find Stmt { - get { return stmt_; } - set { - stmt_ = value; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as ModifyView); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(ModifyView other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (!object.Equals(Collection, other.Collection)) return false; - if (Definer != other.Definer) return false; - if (Algorithm != other.Algorithm) return false; - if (Security != other.Security) return false; - if (Check != other.Check) return false; - if(!column_.Equals(other.column_)) return false; - if (!object.Equals(Stmt, other.Stmt)) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (collection_ != null) hash ^= Collection.GetHashCode(); - if (Definer.Length != 0) hash ^= Definer.GetHashCode(); - if (Algorithm != 0) hash ^= Algorithm.GetHashCode(); - if (Security != 0) hash ^= Security.GetHashCode(); - if (Check != 0) hash ^= Check.GetHashCode(); - hash ^= column_.GetHashCode(); - if (stmt_ != null) hash ^= Stmt.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (collection_ != null) { - output.WriteRawTag(10); - output.WriteMessage(Collection); - } - if (Definer.Length != 0) { - output.WriteRawTag(18); - output.WriteString(Definer); - } - if (Algorithm != 0) { - output.WriteRawTag(24); - output.WriteEnum((int) Algorithm); - } - if (Security != 0) { - output.WriteRawTag(32); - output.WriteEnum((int) Security); - } - if (Check != 0) { - output.WriteRawTag(40); - output.WriteEnum((int) Check); - } - column_.WriteTo(output, _repeated_column_codec); - if (stmt_ != null) { - output.WriteRawTag(58); - output.WriteMessage(Stmt); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (collection_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Collection); - } - if (Definer.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(Definer); - } - if (Algorithm != 0) { - size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Algorithm); - } - if (Security != 0) { - size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Security); - } - if (Check != 0) { - size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Check); - } - size += column_.CalculateSize(_repeated_column_codec); - if (stmt_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Stmt); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(ModifyView other) { - if (other == null) { - return; - } - if (other.collection_ != null) { - if (collection_ == null) { - collection_ = new global::Mysqlx.Crud.Collection(); - } - Collection.MergeFrom(other.Collection); - } - if (other.Definer.Length != 0) { - Definer = other.Definer; - } - if (other.Algorithm != 0) { - Algorithm = other.Algorithm; - } - if (other.Security != 0) { - Security = other.Security; - } - if (other.Check != 0) { - Check = other.Check; - } - column_.Add(other.column_); - if (other.stmt_ != null) { - if (stmt_ == null) { - stmt_ = new global::Mysqlx.Crud.Find(); - } - Stmt.MergeFrom(other.Stmt); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - if (collection_ == null) { - collection_ = new global::Mysqlx.Crud.Collection(); - } - input.ReadMessage(collection_); - break; - } - case 18: { - Definer = input.ReadString(); - break; - } - case 24: { - algorithm_ = (global::Mysqlx.Crud.ViewAlgorithm) input.ReadEnum(); - break; - } - case 32: { - security_ = (global::Mysqlx.Crud.ViewSqlSecurity) input.ReadEnum(); - break; - } - case 40: { - check_ = (global::Mysqlx.Crud.ViewCheckOption) input.ReadEnum(); - break; - } - case 50: { - column_.AddEntriesFrom(input, _repeated_column_codec); - break; - } - case 58: { - if (stmt_ == null) { - stmt_ = new global::Mysqlx.Crud.Find(); - } - input.ReadMessage(stmt_); - break; - } - } - } - } - - } - - internal sealed partial class DropView : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new DropView()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Crud.MysqlxCrudReflection.Descriptor.MessageTypes[12]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public DropView() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public DropView(DropView other) : this() { - Collection = other.collection_ != null ? other.Collection.Clone() : null; - ifExists_ = other.ifExists_; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public DropView Clone() { - return new DropView(this); - } - - /// Field number for the "collection" field. - public const int CollectionFieldNumber = 1; - private global::Mysqlx.Crud.Collection collection_; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Crud.Collection Collection { - get { return collection_; } - set { - collection_ = value; - } - } - - /// Field number for the "if_exists" field. - public const int IfExistsFieldNumber = 2; - private bool ifExists_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool IfExists { - get { return ifExists_; } - set { - ifExists_ = value; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as DropView); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(DropView other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (!object.Equals(Collection, other.Collection)) return false; - if (IfExists != other.IfExists) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (collection_ != null) hash ^= Collection.GetHashCode(); - if (IfExists != false) hash ^= IfExists.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (collection_ != null) { - output.WriteRawTag(10); - output.WriteMessage(Collection); - } - if (IfExists != false) { - output.WriteRawTag(16); - output.WriteBool(IfExists); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (collection_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Collection); - } - if (IfExists != false) { - size += 1 + 1; - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(DropView other) { - if (other == null) { - return; - } - if (other.collection_ != null) { - if (collection_ == null) { - collection_ = new global::Mysqlx.Crud.Collection(); - } - Collection.MergeFrom(other.Collection); - } - if (other.IfExists != false) { - IfExists = other.IfExists; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - if (collection_ == null) { - collection_ = new global::Mysqlx.Crud.Collection(); - } - input.ReadMessage(collection_); - break; - } - case 16: { - IfExists = input.ReadBool(); - break; - } - } - } - } - - } - - #endregion - -} - -#endregion Designer generated code diff --git a/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxDatatypes.cs b/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxDatatypes.cs deleted file mode 100644 index 75c512432..000000000 --- a/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxDatatypes.cs +++ /dev/null @@ -1,1345 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: mysqlx_datatypes.proto -#pragma warning disable 1591, 0612, 3021 -#region Designer generated code - -using pb = global::Google.Protobuf; -using pbc = global::Google.Protobuf.Collections; -using pbr = global::Google.Protobuf.Reflection; -using scg = global::System.Collections.Generic; -namespace Mysqlx.Datatypes { - - /// Holder for reflection information generated from mysqlx_datatypes.proto - internal static partial class MysqlxDatatypesReflection { - - #region Descriptor - /// File descriptor for mysqlx_datatypes.proto - public static pbr::FileDescriptor Descriptor { - get { return descriptor; } - } - private static pbr::FileDescriptor descriptor; - - static MysqlxDatatypesReflection() { - byte[] descriptorData = global::System.Convert.FromBase64String( - string.Concat( - "ChZteXNxbHhfZGF0YXR5cGVzLnByb3RvEhBNeXNxbHguRGF0YXR5cGVzItAD", - "CgZTY2FsYXISKwoEdHlwZRgBIAEoDjIdLk15c3FseC5EYXRhdHlwZXMuU2Nh", - "bGFyLlR5cGUSFAoMdl9zaWduZWRfaW50GAIgASgSEhYKDnZfdW5zaWduZWRf", - "aW50GAMgASgEEjEKCHZfb2N0ZXRzGAUgASgLMh8uTXlzcWx4LkRhdGF0eXBl", - "cy5TY2FsYXIuT2N0ZXRzEhAKCHZfZG91YmxlGAYgASgBEg8KB3ZfZmxvYXQY", - "ByABKAISDgoGdl9ib29sGAggASgIEjEKCHZfc3RyaW5nGAkgASgLMh8uTXlz", - "cWx4LkRhdGF0eXBlcy5TY2FsYXIuU3RyaW5nGioKBlN0cmluZxINCgV2YWx1", - "ZRgBIAEoDBIRCgljb2xsYXRpb24YAiABKAQaLQoGT2N0ZXRzEg0KBXZhbHVl", - "GAEgASgMEhQKDGNvbnRlbnRfdHlwZRgCIAEoDSJ3CgRUeXBlEggKBE5PTkUQ", - "ABIKCgZWX1NJTlQQARIKCgZWX1VJTlQQAhIKCgZWX05VTEwQAxIMCghWX09D", - "VEVUUxAEEgwKCFZfRE9VQkxFEAUSCwoHVl9GTE9BVBAGEgoKBlZfQk9PTBAH", - "EgwKCFZfU1RSSU5HEAgifQoGT2JqZWN0EjEKA2ZsZBgBIAMoCzIkLk15c3Fs", - "eC5EYXRhdHlwZXMuT2JqZWN0Lk9iamVjdEZpZWxkGkAKC09iamVjdEZpZWxk", - "EgsKA2tleRgBIAEoCRIkCgV2YWx1ZRgCIAEoCzIVLk15c3FseC5EYXRhdHlw", - "ZXMuQW55Ii0KBUFycmF5EiQKBXZhbHVlGAEgAygLMhUuTXlzcWx4LkRhdGF0", - "eXBlcy5Bbnki3QEKA0FueRIoCgR0eXBlGAEgASgOMhouTXlzcWx4LkRhdGF0", - "eXBlcy5BbnkuVHlwZRIoCgZzY2FsYXIYAiABKAsyGC5NeXNxbHguRGF0YXR5", - "cGVzLlNjYWxhchIlCgNvYmoYAyABKAsyGC5NeXNxbHguRGF0YXR5cGVzLk9i", - "amVjdBImCgVhcnJheRgEIAEoCzIXLk15c3FseC5EYXRhdHlwZXMuQXJyYXki", - "MwoEVHlwZRIICgROT05FEAASCgoGU0NBTEFSEAESCgoGT0JKRUNUEAISCQoF", - "QVJSQVkQA0IeChxjb20ubXlzcWwuY2oubXlzcWx4LnByb3RvYnVmYgZwcm90", - "bzM=")); - descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, - new pbr::FileDescriptor[] { }, - new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Datatypes.Scalar), global::Mysqlx.Datatypes.Scalar.Parser, new[]{ "Type", "VSignedInt", "VUnsignedInt", "VOctets", "VDouble", "VFloat", "VBool", "VString" }, null, new[]{ typeof(global::Mysqlx.Datatypes.Scalar.Types.Type) }, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Datatypes.Scalar.Types.String), global::Mysqlx.Datatypes.Scalar.Types.String.Parser, new[]{ "Value", "Collation" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Datatypes.Scalar.Types.Octets), global::Mysqlx.Datatypes.Scalar.Types.Octets.Parser, new[]{ "Value", "ContentType" }, null, null, null)}), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Datatypes.Object), global::Mysqlx.Datatypes.Object.Parser, new[]{ "Fld" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Datatypes.Object.Types.ObjectField), global::Mysqlx.Datatypes.Object.Types.ObjectField.Parser, new[]{ "Key", "Value" }, null, null, null)}), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Datatypes.Array), global::Mysqlx.Datatypes.Array.Parser, new[]{ "Value" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Datatypes.Any), global::Mysqlx.Datatypes.Any.Parser, new[]{ "Type", "Scalar", "Obj", "Array" }, null, new[]{ typeof(global::Mysqlx.Datatypes.Any.Types.Type) }, null) - })); - } - #endregion - - } - #region Messages - /// - /// a scalar - /// - internal sealed partial class Scalar : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Scalar()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Datatypes.MysqlxDatatypesReflection.Descriptor.MessageTypes[0]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Scalar() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Scalar(Scalar other) : this() { - type_ = other.type_; - vSignedInt_ = other.vSignedInt_; - vUnsignedInt_ = other.vUnsignedInt_; - VOctets = other.vOctets_ != null ? other.VOctets.Clone() : null; - vDouble_ = other.vDouble_; - vFloat_ = other.vFloat_; - vBool_ = other.vBool_; - VString = other.vString_ != null ? other.VString.Clone() : null; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Scalar Clone() { - return new Scalar(this); - } - - /// Field number for the "type" field. - public const int TypeFieldNumber = 1; - private global::Mysqlx.Datatypes.Scalar.Types.Type type_ = 0; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Datatypes.Scalar.Types.Type Type { - get { return type_; } - set { - type_ = value; - } - } - - /// Field number for the "v_signed_int" field. - public const int VSignedIntFieldNumber = 2; - private long vSignedInt_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public long VSignedInt { - get { return vSignedInt_; } - set { - vSignedInt_ = value; - } - } - - /// Field number for the "v_unsigned_int" field. - public const int VUnsignedIntFieldNumber = 3; - private ulong vUnsignedInt_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public ulong VUnsignedInt { - get { return vUnsignedInt_; } - set { - vUnsignedInt_ = value; - } - } - - /// Field number for the "v_octets" field. - public const int VOctetsFieldNumber = 5; - private global::Mysqlx.Datatypes.Scalar.Types.Octets vOctets_; - /// - /// 4 is unused, was Null which doesn't have a storage anymore - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Datatypes.Scalar.Types.Octets VOctets { - get { return vOctets_; } - set { - vOctets_ = value; - } - } - - /// Field number for the "v_double" field. - public const int VDoubleFieldNumber = 6; - private double vDouble_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public double VDouble { - get { return vDouble_; } - set { - vDouble_ = value; - } - } - - /// Field number for the "v_float" field. - public const int VFloatFieldNumber = 7; - private float vFloat_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public float VFloat { - get { return vFloat_; } - set { - vFloat_ = value; - } - } - - /// Field number for the "v_bool" field. - public const int VBoolFieldNumber = 8; - private bool vBool_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool VBool { - get { return vBool_; } - set { - vBool_ = value; - } - } - - /// Field number for the "v_string" field. - public const int VStringFieldNumber = 9; - private global::Mysqlx.Datatypes.Scalar.Types.String vString_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Datatypes.Scalar.Types.String VString { - get { return vString_; } - set { - vString_ = value; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Scalar); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Scalar other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (Type != other.Type) return false; - if (VSignedInt != other.VSignedInt) return false; - if (VUnsignedInt != other.VUnsignedInt) return false; - if (!object.Equals(VOctets, other.VOctets)) return false; - if (VDouble != other.VDouble) return false; - if (VFloat != other.VFloat) return false; - if (VBool != other.VBool) return false; - if (!object.Equals(VString, other.VString)) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (Type != 0) hash ^= Type.GetHashCode(); - if (VSignedInt != 0L) hash ^= VSignedInt.GetHashCode(); - if (VUnsignedInt != 0UL) hash ^= VUnsignedInt.GetHashCode(); - if (vOctets_ != null) hash ^= VOctets.GetHashCode(); - if (VDouble != 0D) hash ^= VDouble.GetHashCode(); - if (VFloat != 0F) hash ^= VFloat.GetHashCode(); - if (VBool != false) hash ^= VBool.GetHashCode(); - if (vString_ != null) hash ^= VString.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (Type != 0) { - output.WriteRawTag(8); - output.WriteEnum((int) Type); - } - if (VSignedInt != 0L) { - output.WriteRawTag(16); - output.WriteSInt64(VSignedInt); - } - if (VUnsignedInt != 0UL) { - output.WriteRawTag(24); - output.WriteUInt64(VUnsignedInt); - } - if (vOctets_ != null) { - output.WriteRawTag(42); - output.WriteMessage(VOctets); - } - if (VDouble != 0D) { - output.WriteRawTag(49); - output.WriteDouble(VDouble); - } - if (VFloat != 0F) { - output.WriteRawTag(61); - output.WriteFloat(VFloat); - } - if (VBool != false) { - output.WriteRawTag(64); - output.WriteBool(VBool); - } - if (vString_ != null) { - output.WriteRawTag(74); - output.WriteMessage(VString); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (Type != 0) { - size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Type); - } - if (VSignedInt != 0L) { - size += 1 + pb::CodedOutputStream.ComputeSInt64Size(VSignedInt); - } - if (VUnsignedInt != 0UL) { - size += 1 + pb::CodedOutputStream.ComputeUInt64Size(VUnsignedInt); - } - if (vOctets_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(VOctets); - } - if (VDouble != 0D) { - size += 1 + 8; - } - if (VFloat != 0F) { - size += 1 + 4; - } - if (VBool != false) { - size += 1 + 1; - } - if (vString_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(VString); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Scalar other) { - if (other == null) { - return; - } - if (other.Type != 0) { - Type = other.Type; - } - if (other.VSignedInt != 0L) { - VSignedInt = other.VSignedInt; - } - if (other.VUnsignedInt != 0UL) { - VUnsignedInt = other.VUnsignedInt; - } - if (other.vOctets_ != null) { - if (vOctets_ == null) { - vOctets_ = new global::Mysqlx.Datatypes.Scalar.Types.Octets(); - } - VOctets.MergeFrom(other.VOctets); - } - if (other.VDouble != 0D) { - VDouble = other.VDouble; - } - if (other.VFloat != 0F) { - VFloat = other.VFloat; - } - if (other.VBool != false) { - VBool = other.VBool; - } - if (other.vString_ != null) { - if (vString_ == null) { - vString_ = new global::Mysqlx.Datatypes.Scalar.Types.String(); - } - VString.MergeFrom(other.VString); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 8: { - type_ = (global::Mysqlx.Datatypes.Scalar.Types.Type) input.ReadEnum(); - break; - } - case 16: { - VSignedInt = input.ReadSInt64(); - break; - } - case 24: { - VUnsignedInt = input.ReadUInt64(); - break; - } - case 42: { - if (vOctets_ == null) { - vOctets_ = new global::Mysqlx.Datatypes.Scalar.Types.Octets(); - } - input.ReadMessage(vOctets_); - break; - } - case 49: { - VDouble = input.ReadDouble(); - break; - } - case 61: { - VFloat = input.ReadFloat(); - break; - } - case 64: { - VBool = input.ReadBool(); - break; - } - case 74: { - if (vString_ == null) { - vString_ = new global::Mysqlx.Datatypes.Scalar.Types.String(); - } - input.ReadMessage(vString_); - break; - } - } - } - } - - #region Nested types - /// Container for nested types declared in the Scalar message type. - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - internal static partial class Types { - internal enum Type { - [pbr::OriginalName("NONE")] None = 0, - [pbr::OriginalName("V_SINT")] VSint = 1, - [pbr::OriginalName("V_UINT")] VUint = 2, - [pbr::OriginalName("V_NULL")] VNull = 3, - [pbr::OriginalName("V_OCTETS")] VOctets = 4, - [pbr::OriginalName("V_DOUBLE")] VDouble = 5, - [pbr::OriginalName("V_FLOAT")] VFloat = 6, - [pbr::OriginalName("V_BOOL")] VBool = 7, - [pbr::OriginalName("V_STRING")] VString = 8, - } - - /// - /// a string with a charset/collation - /// - internal sealed partial class String : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new String()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Datatypes.Scalar.Descriptor.NestedTypes[0]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public String() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public String(String other) : this() { - value_ = other.value_; - collation_ = other.collation_; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public String Clone() { - return new String(this); - } - - /// Field number for the "value" field. - public const int ValueFieldNumber = 1; - private pb::ByteString value_ = pb::ByteString.Empty; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pb::ByteString Value { - get { return value_; } - set { - value_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "collation" field. - public const int CollationFieldNumber = 2; - private ulong collation_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public ulong Collation { - get { return collation_; } - set { - collation_ = value; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as String); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(String other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (Value != other.Value) return false; - if (Collation != other.Collation) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (Value.Length != 0) hash ^= Value.GetHashCode(); - if (Collation != 0UL) hash ^= Collation.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (Value.Length != 0) { - output.WriteRawTag(10); - output.WriteBytes(Value); - } - if (Collation != 0UL) { - output.WriteRawTag(16); - output.WriteUInt64(Collation); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (Value.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeBytesSize(Value); - } - if (Collation != 0UL) { - size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Collation); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(String other) { - if (other == null) { - return; - } - if (other.Value.Length != 0) { - Value = other.Value; - } - if (other.Collation != 0UL) { - Collation = other.Collation; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - Value = input.ReadBytes(); - break; - } - case 16: { - Collation = input.ReadUInt64(); - break; - } - } - } - } - - } - - /// - /// an opaque octet sequence, with an optional content_type - /// See ``Mysqlx.Resultset.ColumnMetadata`` for list of known values. - /// - internal sealed partial class Octets : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Octets()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Datatypes.Scalar.Descriptor.NestedTypes[1]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Octets() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Octets(Octets other) : this() { - value_ = other.value_; - contentType_ = other.contentType_; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Octets Clone() { - return new Octets(this); - } - - /// Field number for the "value" field. - public const int ValueFieldNumber = 1; - private pb::ByteString value_ = pb::ByteString.Empty; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pb::ByteString Value { - get { return value_; } - set { - value_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "content_type" field. - public const int ContentTypeFieldNumber = 2; - private uint contentType_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public uint ContentType { - get { return contentType_; } - set { - contentType_ = value; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Octets); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Octets other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (Value != other.Value) return false; - if (ContentType != other.ContentType) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (Value.Length != 0) hash ^= Value.GetHashCode(); - if (ContentType != 0) hash ^= ContentType.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (Value.Length != 0) { - output.WriteRawTag(10); - output.WriteBytes(Value); - } - if (ContentType != 0) { - output.WriteRawTag(16); - output.WriteUInt32(ContentType); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (Value.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeBytesSize(Value); - } - if (ContentType != 0) { - size += 1 + pb::CodedOutputStream.ComputeUInt32Size(ContentType); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Octets other) { - if (other == null) { - return; - } - if (other.Value.Length != 0) { - Value = other.Value; - } - if (other.ContentType != 0) { - ContentType = other.ContentType; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - Value = input.ReadBytes(); - break; - } - case 16: { - ContentType = input.ReadUInt32(); - break; - } - } - } - } - - } - - } - #endregion - - } - - /// - /// a object - /// - internal sealed partial class Object : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Object()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Datatypes.MysqlxDatatypesReflection.Descriptor.MessageTypes[1]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Object() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Object(Object other) : this() { - fld_ = other.fld_.Clone(); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Object Clone() { - return new Object(this); - } - - /// Field number for the "fld" field. - public const int FldFieldNumber = 1; - private static readonly pb::FieldCodec _repeated_fld_codec - = pb::FieldCodec.ForMessage(10, global::Mysqlx.Datatypes.Object.Types.ObjectField.Parser); - private readonly pbc::RepeatedField fld_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField Fld { - get { return fld_; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Object); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Object other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if(!fld_.Equals(other.fld_)) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - hash ^= fld_.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - fld_.WriteTo(output, _repeated_fld_codec); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - size += fld_.CalculateSize(_repeated_fld_codec); - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Object other) { - if (other == null) { - return; - } - fld_.Add(other.fld_); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - fld_.AddEntriesFrom(input, _repeated_fld_codec); - break; - } - } - } - } - - #region Nested types - /// Container for nested types declared in the Object message type. - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - internal static partial class Types { - internal sealed partial class ObjectField : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new ObjectField()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Datatypes.Object.Descriptor.NestedTypes[0]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public ObjectField() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public ObjectField(ObjectField other) : this() { - key_ = other.key_; - Value = other.value_ != null ? other.Value.Clone() : null; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public ObjectField Clone() { - return new ObjectField(this); - } - - /// Field number for the "key" field. - public const int KeyFieldNumber = 1; - private string key_ = ""; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string Key { - get { return key_; } - set { - key_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "value" field. - public const int ValueFieldNumber = 2; - private global::Mysqlx.Datatypes.Any value_; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Datatypes.Any Value { - get { return value_; } - set { - value_ = value; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as ObjectField); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(ObjectField other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (Key != other.Key) return false; - if (!object.Equals(Value, other.Value)) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (Key.Length != 0) hash ^= Key.GetHashCode(); - if (value_ != null) hash ^= Value.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (Key.Length != 0) { - output.WriteRawTag(10); - output.WriteString(Key); - } - if (value_ != null) { - output.WriteRawTag(18); - output.WriteMessage(Value); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (Key.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(Key); - } - if (value_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Value); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(ObjectField other) { - if (other == null) { - return; - } - if (other.Key.Length != 0) { - Key = other.Key; - } - if (other.value_ != null) { - if (value_ == null) { - value_ = new global::Mysqlx.Datatypes.Any(); - } - Value.MergeFrom(other.Value); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - Key = input.ReadString(); - break; - } - case 18: { - if (value_ == null) { - value_ = new global::Mysqlx.Datatypes.Any(); - } - input.ReadMessage(value_); - break; - } - } - } - } - - } - - } - #endregion - - } - - /// - /// a Array - /// - internal sealed partial class Array : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Array()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Datatypes.MysqlxDatatypesReflection.Descriptor.MessageTypes[2]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Array() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Array(Array other) : this() { - value_ = other.value_.Clone(); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Array Clone() { - return new Array(this); - } - - /// Field number for the "value" field. - public const int ValueFieldNumber = 1; - private static readonly pb::FieldCodec _repeated_value_codec - = pb::FieldCodec.ForMessage(10, global::Mysqlx.Datatypes.Any.Parser); - private readonly pbc::RepeatedField value_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField Value { - get { return value_; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Array); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Array other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if(!value_.Equals(other.value_)) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - hash ^= value_.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - value_.WriteTo(output, _repeated_value_codec); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - size += value_.CalculateSize(_repeated_value_codec); - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Array other) { - if (other == null) { - return; - } - value_.Add(other.value_); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - value_.AddEntriesFrom(input, _repeated_value_codec); - break; - } - } - } - } - - } - - /// - /// a helper to allow all field types - /// - internal sealed partial class Any : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Any()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Datatypes.MysqlxDatatypesReflection.Descriptor.MessageTypes[3]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Any() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Any(Any other) : this() { - type_ = other.type_; - Scalar = other.scalar_ != null ? other.Scalar.Clone() : null; - Obj = other.obj_ != null ? other.Obj.Clone() : null; - Array = other.array_ != null ? other.Array.Clone() : null; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Any Clone() { - return new Any(this); - } - - /// Field number for the "type" field. - public const int TypeFieldNumber = 1; - private global::Mysqlx.Datatypes.Any.Types.Type type_ = 0; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Datatypes.Any.Types.Type Type { - get { return type_; } - set { - type_ = value; - } - } - - /// Field number for the "scalar" field. - public const int ScalarFieldNumber = 2; - private global::Mysqlx.Datatypes.Scalar scalar_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Datatypes.Scalar Scalar { - get { return scalar_; } - set { - scalar_ = value; - } - } - - /// Field number for the "obj" field. - public const int ObjFieldNumber = 3; - private global::Mysqlx.Datatypes.Object obj_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Datatypes.Object Obj { - get { return obj_; } - set { - obj_ = value; - } - } - - /// Field number for the "array" field. - public const int ArrayFieldNumber = 4; - private global::Mysqlx.Datatypes.Array array_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Datatypes.Array Array { - get { return array_; } - set { - array_ = value; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Any); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Any other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (Type != other.Type) return false; - if (!object.Equals(Scalar, other.Scalar)) return false; - if (!object.Equals(Obj, other.Obj)) return false; - if (!object.Equals(Array, other.Array)) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (Type != 0) hash ^= Type.GetHashCode(); - if (scalar_ != null) hash ^= Scalar.GetHashCode(); - if (obj_ != null) hash ^= Obj.GetHashCode(); - if (array_ != null) hash ^= Array.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (Type != 0) { - output.WriteRawTag(8); - output.WriteEnum((int) Type); - } - if (scalar_ != null) { - output.WriteRawTag(18); - output.WriteMessage(Scalar); - } - if (obj_ != null) { - output.WriteRawTag(26); - output.WriteMessage(Obj); - } - if (array_ != null) { - output.WriteRawTag(34); - output.WriteMessage(Array); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (Type != 0) { - size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Type); - } - if (scalar_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Scalar); - } - if (obj_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Obj); - } - if (array_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Array); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Any other) { - if (other == null) { - return; - } - if (other.Type != 0) { - Type = other.Type; - } - if (other.scalar_ != null) { - if (scalar_ == null) { - scalar_ = new global::Mysqlx.Datatypes.Scalar(); - } - Scalar.MergeFrom(other.Scalar); - } - if (other.obj_ != null) { - if (obj_ == null) { - obj_ = new global::Mysqlx.Datatypes.Object(); - } - Obj.MergeFrom(other.Obj); - } - if (other.array_ != null) { - if (array_ == null) { - array_ = new global::Mysqlx.Datatypes.Array(); - } - Array.MergeFrom(other.Array); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 8: { - type_ = (global::Mysqlx.Datatypes.Any.Types.Type) input.ReadEnum(); - break; - } - case 18: { - if (scalar_ == null) { - scalar_ = new global::Mysqlx.Datatypes.Scalar(); - } - input.ReadMessage(scalar_); - break; - } - case 26: { - if (obj_ == null) { - obj_ = new global::Mysqlx.Datatypes.Object(); - } - input.ReadMessage(obj_); - break; - } - case 34: { - if (array_ == null) { - array_ = new global::Mysqlx.Datatypes.Array(); - } - input.ReadMessage(array_); - break; - } - } - } - } - - #region Nested types - /// Container for nested types declared in the Any message type. - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - internal static partial class Types { - internal enum Type { - [pbr::OriginalName("NONE")] None = 0, - [pbr::OriginalName("SCALAR")] Scalar = 1, - [pbr::OriginalName("OBJECT")] Object = 2, - [pbr::OriginalName("ARRAY")] Array = 3, - } - - } - #endregion - - } - - #endregion - -} - -#endregion Designer generated code diff --git a/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxExpect.cs b/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxExpect.cs deleted file mode 100644 index 12442b5c3..000000000 --- a/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxExpect.cs +++ /dev/null @@ -1,507 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: mysqlx_expect.proto -#pragma warning disable 1591, 0612, 3021 -#region Designer generated code - -using pb = global::Google.Protobuf; -using pbc = global::Google.Protobuf.Collections; -using pbr = global::Google.Protobuf.Reflection; -using scg = global::System.Collections.Generic; -namespace Mysqlx.Expect { - - /// Holder for reflection information generated from mysqlx_expect.proto - internal static partial class MysqlxExpectReflection { - - #region Descriptor - /// File descriptor for mysqlx_expect.proto - public static pbr::FileDescriptor Descriptor { - get { return descriptor; } - } - private static pbr::FileDescriptor descriptor; - - static MysqlxExpectReflection() { - byte[] descriptorData = global::System.Convert.FromBase64String( - string.Concat( - "ChNteXNxbHhfZXhwZWN0LnByb3RvEg1NeXNxbHguRXhwZWN0ItsCCgRPcGVu", - "EiwKAm9wGAEgASgOMiAuTXlzcWx4LkV4cGVjdC5PcGVuLkN0eE9wZXJhdGlv", - "bhIrCgRjb25kGAIgAygLMh0uTXlzcWx4LkV4cGVjdC5PcGVuLkNvbmRpdGlv", - "bhq3AQoJQ29uZGl0aW9uEhUKDWNvbmRpdGlvbl9rZXkYASABKA0SFwoPY29u", - "ZGl0aW9uX3ZhbHVlGAIgASgMEjwKAm9wGAMgASgOMjAuTXlzcWx4LkV4cGVj", - "dC5PcGVuLkNvbmRpdGlvbi5Db25kaXRpb25PcGVyYXRpb24iPAoSQ29uZGl0", - "aW9uT3BlcmF0aW9uEhEKDUVYUEVDVF9PUF9TRVQQABITCg9FWFBFQ1RfT1Bf", - "VU5TRVQQASI+CgxDdHhPcGVyYXRpb24SGAoURVhQRUNUX0NUWF9DT1BZX1BS", - "RVYQABIUChBFWFBFQ1RfQ1RYX0VNUFRZEAEiBwoFQ2xvc2VCHgocY29tLm15", - "c3FsLmNqLm15c3FseC5wcm90b2J1ZmIGcHJvdG8z")); - descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, - new pbr::FileDescriptor[] { }, - new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Expect.Open), global::Mysqlx.Expect.Open.Parser, new[]{ "Op", "Cond" }, null, new[]{ typeof(global::Mysqlx.Expect.Open.Types.CtxOperation) }, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Expect.Open.Types.Condition), global::Mysqlx.Expect.Open.Types.Condition.Parser, new[]{ "ConditionKey", "ConditionValue", "Op" }, null, new[]{ typeof(global::Mysqlx.Expect.Open.Types.Condition.Types.ConditionOperation) }, null)}), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Expect.Close), global::Mysqlx.Expect.Close.Parser, null, null, null, null) - })); - } - #endregion - - } - #region Messages - /// - /// open an Expect block and set/unset the conditions that have to be fulfilled - /// - /// if any of the conditions fail, all enclosed messages will fail with - /// a Mysqlx.Error message. - /// - /// :returns: :protobuf:msg:`Mysqlx::Ok` on success, :protobuf:msg:`Mysqlx::Error` on error - /// - internal sealed partial class Open : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Open()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Expect.MysqlxExpectReflection.Descriptor.MessageTypes[0]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Open() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Open(Open other) : this() { - op_ = other.op_; - cond_ = other.cond_.Clone(); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Open Clone() { - return new Open(this); - } - - /// Field number for the "op" field. - public const int OpFieldNumber = 1; - private global::Mysqlx.Expect.Open.Types.CtxOperation op_ = 0; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Expect.Open.Types.CtxOperation Op { - get { return op_; } - set { - op_ = value; - } - } - - /// Field number for the "cond" field. - public const int CondFieldNumber = 2; - private static readonly pb::FieldCodec _repeated_cond_codec - = pb::FieldCodec.ForMessage(18, global::Mysqlx.Expect.Open.Types.Condition.Parser); - private readonly pbc::RepeatedField cond_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField Cond { - get { return cond_; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Open); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Open other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (Op != other.Op) return false; - if(!cond_.Equals(other.cond_)) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (Op != 0) hash ^= Op.GetHashCode(); - hash ^= cond_.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (Op != 0) { - output.WriteRawTag(8); - output.WriteEnum((int) Op); - } - cond_.WriteTo(output, _repeated_cond_codec); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (Op != 0) { - size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Op); - } - size += cond_.CalculateSize(_repeated_cond_codec); - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Open other) { - if (other == null) { - return; - } - if (other.Op != 0) { - Op = other.Op; - } - cond_.Add(other.cond_); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 8: { - op_ = (global::Mysqlx.Expect.Open.Types.CtxOperation) input.ReadEnum(); - break; - } - case 18: { - cond_.AddEntriesFrom(input, _repeated_cond_codec); - break; - } - } - } - } - - #region Nested types - /// Container for nested types declared in the Open message type. - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - internal static partial class Types { - internal enum CtxOperation { - /// - /// copy the operations from the parent Expect-block - /// - [pbr::OriginalName("EXPECT_CTX_COPY_PREV")] ExpectCtxCopyPrev = 0, - /// - /// start with a empty set of operations - /// - [pbr::OriginalName("EXPECT_CTX_EMPTY")] ExpectCtxEmpty = 1, - } - - internal sealed partial class Condition : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Condition()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Expect.Open.Descriptor.NestedTypes[0]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Condition() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Condition(Condition other) : this() { - conditionKey_ = other.conditionKey_; - conditionValue_ = other.conditionValue_; - op_ = other.op_; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Condition Clone() { - return new Condition(this); - } - - /// Field number for the "condition_key" field. - public const int ConditionKeyFieldNumber = 1; - private uint conditionKey_; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public uint ConditionKey { - get { return conditionKey_; } - set { - conditionKey_ = value; - } - } - - /// Field number for the "condition_value" field. - public const int ConditionValueFieldNumber = 2; - private pb::ByteString conditionValue_ = pb::ByteString.Empty; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pb::ByteString ConditionValue { - get { return conditionValue_; } - set { - conditionValue_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "op" field. - public const int OpFieldNumber = 3; - private global::Mysqlx.Expect.Open.Types.Condition.Types.ConditionOperation op_ = 0; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Expect.Open.Types.Condition.Types.ConditionOperation Op { - get { return op_; } - set { - op_ = value; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Condition); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Condition other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (ConditionKey != other.ConditionKey) return false; - if (ConditionValue != other.ConditionValue) return false; - if (Op != other.Op) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (ConditionKey != 0) hash ^= ConditionKey.GetHashCode(); - if (ConditionValue.Length != 0) hash ^= ConditionValue.GetHashCode(); - if (Op != 0) hash ^= Op.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (ConditionKey != 0) { - output.WriteRawTag(8); - output.WriteUInt32(ConditionKey); - } - if (ConditionValue.Length != 0) { - output.WriteRawTag(18); - output.WriteBytes(ConditionValue); - } - if (Op != 0) { - output.WriteRawTag(24); - output.WriteEnum((int) Op); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (ConditionKey != 0) { - size += 1 + pb::CodedOutputStream.ComputeUInt32Size(ConditionKey); - } - if (ConditionValue.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeBytesSize(ConditionValue); - } - if (Op != 0) { - size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Op); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Condition other) { - if (other == null) { - return; - } - if (other.ConditionKey != 0) { - ConditionKey = other.ConditionKey; - } - if (other.ConditionValue.Length != 0) { - ConditionValue = other.ConditionValue; - } - if (other.Op != 0) { - Op = other.Op; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 8: { - ConditionKey = input.ReadUInt32(); - break; - } - case 18: { - ConditionValue = input.ReadBytes(); - break; - } - case 24: { - op_ = (global::Mysqlx.Expect.Open.Types.Condition.Types.ConditionOperation) input.ReadEnum(); - break; - } - } - } - } - - #region Nested types - /// Container for nested types declared in the Condition message type. - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - internal static partial class Types { - internal enum ConditionOperation { - /// - /// set the condition - /// - /// set, if not set - /// overwrite, if set - /// - [pbr::OriginalName("EXPECT_OP_SET")] ExpectOpSet = 0, - /// - /// unset the condition - /// - [pbr::OriginalName("EXPECT_OP_UNSET")] ExpectOpUnset = 1, - } - - } - #endregion - - } - - } - #endregion - - } - - /// - /// close a Expect block - /// - /// closing a Expect block restores the state of the previous Expect block - /// for the following messages - /// - /// :returns: :protobuf:msg:`Mysqlx::Ok` on success, :protobuf:msg:`Mysqlx::Error` on error - /// - internal sealed partial class Close : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Close()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Expect.MysqlxExpectReflection.Descriptor.MessageTypes[1]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Close() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Close(Close other) : this() { - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Close Clone() { - return new Close(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Close); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Close other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Close other) { - if (other == null) { - return; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - } - } - } - - } - - #endregion - -} - -#endregion Designer generated code diff --git a/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxExpr.cs b/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxExpr.cs deleted file mode 100644 index 30ad78c05..000000000 --- a/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxExpr.cs +++ /dev/null @@ -1,1844 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: mysqlx_expr.proto -#pragma warning disable 1591, 0612, 3021 -#region Designer generated code - -using pb = global::Google.Protobuf; -using pbc = global::Google.Protobuf.Collections; -using pbr = global::Google.Protobuf.Reflection; -using scg = global::System.Collections.Generic; -namespace Mysqlx.Expr { - - /// Holder for reflection information generated from mysqlx_expr.proto - internal static partial class MysqlxExprReflection { - - #region Descriptor - /// File descriptor for mysqlx_expr.proto - public static pbr::FileDescriptor Descriptor { - get { return descriptor; } - } - private static pbr::FileDescriptor descriptor; - - static MysqlxExprReflection() { - byte[] descriptorData = global::System.Convert.FromBase64String( - string.Concat( - "ChFteXNxbHhfZXhwci5wcm90bxILTXlzcWx4LkV4cHIaFm15c3FseF9kYXRh", - "dHlwZXMucHJvdG8izgMKBEV4cHISJAoEdHlwZRgBIAEoDjIWLk15c3FseC5F", - "eHByLkV4cHIuVHlwZRIxCgppZGVudGlmaWVyGAIgASgLMh0uTXlzcWx4LkV4", - "cHIuQ29sdW1uSWRlbnRpZmllchIQCgh2YXJpYWJsZRgDIAEoCRIpCgdsaXRl", - "cmFsGAQgASgLMhguTXlzcWx4LkRhdGF0eXBlcy5TY2FsYXISMAoNZnVuY3Rp", - "b25fY2FsbBgFIAEoCzIZLk15c3FseC5FeHByLkZ1bmN0aW9uQ2FsbBInCghv", - "cGVyYXRvchgGIAEoCzIVLk15c3FseC5FeHByLk9wZXJhdG9yEhAKCHBvc2l0", - "aW9uGAcgASgNEiMKBm9iamVjdBgIIAEoCzITLk15c3FseC5FeHByLk9iamVj", - "dBIhCgVhcnJheRgJIAEoCzISLk15c3FseC5FeHByLkFycmF5InsKBFR5cGUS", - "CAoETk9ORRAAEgkKBUlERU5UEAESCwoHTElURVJBTBACEgwKCFZBUklBQkxF", - "EAMSDQoJRlVOQ19DQUxMEAQSDAoIT1BFUkFUT1IQBRIPCgtQTEFDRUhPTERF", - "UhAGEgoKBk9CSkVDVBAHEgkKBUFSUkFZEAgiLwoKSWRlbnRpZmllchIMCgRu", - "YW1lGAEgASgJEhMKC3NjaGVtYV9uYW1lGAIgASgJItUBChBEb2N1bWVudFBh", - "dGhJdGVtEjAKBHR5cGUYASABKA4yIi5NeXNxbHguRXhwci5Eb2N1bWVudFBh", - "dGhJdGVtLlR5cGUSDQoFdmFsdWUYAiABKAkSDQoFaW5kZXgYAyABKA0icQoE", - "VHlwZRIICgROT05FEAASCgoGTUVNQkVSEAESEwoPTUVNQkVSX0FTVEVSSVNL", - "EAISDwoLQVJSQVlfSU5ERVgQAxIYChRBUlJBWV9JTkRFWF9BU1RFUklTSxAE", - "EhMKD0RPVUJMRV9BU1RFUklTSxAFIn8KEENvbHVtbklkZW50aWZpZXISNAoN", - "ZG9jdW1lbnRfcGF0aBgBIAMoCzIdLk15c3FseC5FeHByLkRvY3VtZW50UGF0", - "aEl0ZW0SDAoEbmFtZRgCIAEoCRISCgp0YWJsZV9uYW1lGAMgASgJEhMKC3Nj", - "aGVtYV9uYW1lGAQgASgJIlcKDEZ1bmN0aW9uQ2FsbBIlCgRuYW1lGAEgASgL", - "MhcuTXlzcWx4LkV4cHIuSWRlbnRpZmllchIgCgVwYXJhbRgCIAMoCzIRLk15", - "c3FseC5FeHByLkV4cHIiOgoIT3BlcmF0b3ISDAoEbmFtZRgBIAEoCRIgCgVw", - "YXJhbRgCIAMoCzIRLk15c3FseC5FeHByLkV4cHIidAoGT2JqZWN0EiwKA2Zs", - "ZBgBIAMoCzIfLk15c3FseC5FeHByLk9iamVjdC5PYmplY3RGaWVsZBo8CgtP", - "YmplY3RGaWVsZBILCgNrZXkYASABKAkSIAoFdmFsdWUYAiABKAsyES5NeXNx", - "bHguRXhwci5FeHByIikKBUFycmF5EiAKBXZhbHVlGAEgAygLMhEuTXlzcWx4", - "LkV4cHIuRXhwckIeChxjb20ubXlzcWwuY2oubXlzcWx4LnByb3RvYnVmYgZw", - "cm90bzM=")); - descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, - new pbr::FileDescriptor[] { global::Mysqlx.Datatypes.MysqlxDatatypesReflection.Descriptor, }, - new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Expr.Expr), global::Mysqlx.Expr.Expr.Parser, new[]{ "Type", "Identifier", "Variable", "Literal", "FunctionCall", "Operator", "Position", "Object", "Array" }, null, new[]{ typeof(global::Mysqlx.Expr.Expr.Types.Type) }, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Expr.Identifier), global::Mysqlx.Expr.Identifier.Parser, new[]{ "Name", "SchemaName" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Expr.DocumentPathItem), global::Mysqlx.Expr.DocumentPathItem.Parser, new[]{ "Type", "Value", "Index" }, null, new[]{ typeof(global::Mysqlx.Expr.DocumentPathItem.Types.Type) }, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Expr.ColumnIdentifier), global::Mysqlx.Expr.ColumnIdentifier.Parser, new[]{ "DocumentPath", "Name", "TableName", "SchemaName" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Expr.FunctionCall), global::Mysqlx.Expr.FunctionCall.Parser, new[]{ "Name", "Param" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Expr.Operator), global::Mysqlx.Expr.Operator.Parser, new[]{ "Name", "Param" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Expr.Object), global::Mysqlx.Expr.Object.Parser, new[]{ "Fld" }, null, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Expr.Object.Types.ObjectField), global::Mysqlx.Expr.Object.Types.ObjectField.Parser, new[]{ "Key", "Value" }, null, null, null)}), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Expr.Array), global::Mysqlx.Expr.Array.Parser, new[]{ "Value" }, null, null, null) - })); - } - #endregion - - } - #region Messages - /// - /// Expressions - /// - /// the "root" of the expression tree - /// - /// .. productionlist:: - /// expr: `operator` | - /// : `identifier` | - /// : `function_call` | - /// : variable | - /// : `literal` | - /// : placeholder - /// - /// If expression type is PLACEHOLDER then it refers to the value of a parameter - /// specified when executing a statement (see `args` field of `StmtExecute` command). - /// Field `position` (which must be present for such an expression) gives 0-based - /// position of the parameter in the parameter list. - /// - internal sealed partial class Expr : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Expr()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Expr.MysqlxExprReflection.Descriptor.MessageTypes[0]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Expr() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Expr(Expr other) : this() { - type_ = other.type_; - Identifier = other.identifier_ != null ? other.Identifier.Clone() : null; - variable_ = other.variable_; - Literal = other.literal_ != null ? other.Literal.Clone() : null; - FunctionCall = other.functionCall_ != null ? other.FunctionCall.Clone() : null; - Operator = other.operator_ != null ? other.Operator.Clone() : null; - position_ = other.position_; - Object = other.object_ != null ? other.Object.Clone() : null; - Array = other.array_ != null ? other.Array.Clone() : null; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Expr Clone() { - return new Expr(this); - } - - /// Field number for the "type" field. - public const int TypeFieldNumber = 1; - private global::Mysqlx.Expr.Expr.Types.Type type_ = 0; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Expr.Expr.Types.Type Type { - get { return type_; } - set { - type_ = value; - } - } - - /// Field number for the "identifier" field. - public const int IdentifierFieldNumber = 2; - private global::Mysqlx.Expr.ColumnIdentifier identifier_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Expr.ColumnIdentifier Identifier { - get { return identifier_; } - set { - identifier_ = value; - } - } - - /// Field number for the "variable" field. - public const int VariableFieldNumber = 3; - private string variable_ = ""; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string Variable { - get { return variable_; } - set { - variable_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "literal" field. - public const int LiteralFieldNumber = 4; - private global::Mysqlx.Datatypes.Scalar literal_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Datatypes.Scalar Literal { - get { return literal_; } - set { - literal_ = value; - } - } - - /// Field number for the "function_call" field. - public const int FunctionCallFieldNumber = 5; - private global::Mysqlx.Expr.FunctionCall functionCall_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Expr.FunctionCall FunctionCall { - get { return functionCall_; } - set { - functionCall_ = value; - } - } - - /// Field number for the "operator" field. - public const int OperatorFieldNumber = 6; - private global::Mysqlx.Expr.Operator operator_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Expr.Operator Operator { - get { return operator_; } - set { - operator_ = value; - } - } - - /// Field number for the "position" field. - public const int PositionFieldNumber = 7; - private uint position_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public uint Position { - get { return position_; } - set { - position_ = value; - } - } - - /// Field number for the "object" field. - public const int ObjectFieldNumber = 8; - private global::Mysqlx.Expr.Object object_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Expr.Object Object { - get { return object_; } - set { - object_ = value; - } - } - - /// Field number for the "array" field. - public const int ArrayFieldNumber = 9; - private global::Mysqlx.Expr.Array array_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Expr.Array Array { - get { return array_; } - set { - array_ = value; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Expr); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Expr other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (Type != other.Type) return false; - if (!object.Equals(Identifier, other.Identifier)) return false; - if (Variable != other.Variable) return false; - if (!object.Equals(Literal, other.Literal)) return false; - if (!object.Equals(FunctionCall, other.FunctionCall)) return false; - if (!object.Equals(Operator, other.Operator)) return false; - if (Position != other.Position) return false; - if (!object.Equals(Object, other.Object)) return false; - if (!object.Equals(Array, other.Array)) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (Type != 0) hash ^= Type.GetHashCode(); - if (identifier_ != null) hash ^= Identifier.GetHashCode(); - if (Variable.Length != 0) hash ^= Variable.GetHashCode(); - if (literal_ != null) hash ^= Literal.GetHashCode(); - if (functionCall_ != null) hash ^= FunctionCall.GetHashCode(); - if (operator_ != null) hash ^= Operator.GetHashCode(); - if (Position != 0) hash ^= Position.GetHashCode(); - if (object_ != null) hash ^= Object.GetHashCode(); - if (array_ != null) hash ^= Array.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (Type != 0) { - output.WriteRawTag(8); - output.WriteEnum((int) Type); - } - if (identifier_ != null) { - output.WriteRawTag(18); - output.WriteMessage(Identifier); - } - if (Variable.Length != 0) { - output.WriteRawTag(26); - output.WriteString(Variable); - } - if (literal_ != null) { - output.WriteRawTag(34); - output.WriteMessage(Literal); - } - if (functionCall_ != null) { - output.WriteRawTag(42); - output.WriteMessage(FunctionCall); - } - if (operator_ != null) { - output.WriteRawTag(50); - output.WriteMessage(Operator); - } - if (Position != 0) { - output.WriteRawTag(56); - output.WriteUInt32(Position); - } - if (object_ != null) { - output.WriteRawTag(66); - output.WriteMessage(Object); - } - if (array_ != null) { - output.WriteRawTag(74); - output.WriteMessage(Array); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (Type != 0) { - size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Type); - } - if (identifier_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Identifier); - } - if (Variable.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(Variable); - } - if (literal_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Literal); - } - if (functionCall_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(FunctionCall); - } - if (operator_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Operator); - } - if (Position != 0) { - size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Position); - } - if (object_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Object); - } - if (array_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Array); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Expr other) { - if (other == null) { - return; - } - if (other.Type != 0) { - Type = other.Type; - } - if (other.identifier_ != null) { - if (identifier_ == null) { - identifier_ = new global::Mysqlx.Expr.ColumnIdentifier(); - } - Identifier.MergeFrom(other.Identifier); - } - if (other.Variable.Length != 0) { - Variable = other.Variable; - } - if (other.literal_ != null) { - if (literal_ == null) { - literal_ = new global::Mysqlx.Datatypes.Scalar(); - } - Literal.MergeFrom(other.Literal); - } - if (other.functionCall_ != null) { - if (functionCall_ == null) { - functionCall_ = new global::Mysqlx.Expr.FunctionCall(); - } - FunctionCall.MergeFrom(other.FunctionCall); - } - if (other.operator_ != null) { - if (operator_ == null) { - operator_ = new global::Mysqlx.Expr.Operator(); - } - Operator.MergeFrom(other.Operator); - } - if (other.Position != 0) { - Position = other.Position; - } - if (other.object_ != null) { - if (object_ == null) { - object_ = new global::Mysqlx.Expr.Object(); - } - Object.MergeFrom(other.Object); - } - if (other.array_ != null) { - if (array_ == null) { - array_ = new global::Mysqlx.Expr.Array(); - } - Array.MergeFrom(other.Array); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 8: { - type_ = (global::Mysqlx.Expr.Expr.Types.Type) input.ReadEnum(); - break; - } - case 18: { - if (identifier_ == null) { - identifier_ = new global::Mysqlx.Expr.ColumnIdentifier(); - } - input.ReadMessage(identifier_); - break; - } - case 26: { - Variable = input.ReadString(); - break; - } - case 34: { - if (literal_ == null) { - literal_ = new global::Mysqlx.Datatypes.Scalar(); - } - input.ReadMessage(literal_); - break; - } - case 42: { - if (functionCall_ == null) { - functionCall_ = new global::Mysqlx.Expr.FunctionCall(); - } - input.ReadMessage(functionCall_); - break; - } - case 50: { - if (operator_ == null) { - operator_ = new global::Mysqlx.Expr.Operator(); - } - input.ReadMessage(operator_); - break; - } - case 56: { - Position = input.ReadUInt32(); - break; - } - case 66: { - if (object_ == null) { - object_ = new global::Mysqlx.Expr.Object(); - } - input.ReadMessage(object_); - break; - } - case 74: { - if (array_ == null) { - array_ = new global::Mysqlx.Expr.Array(); - } - input.ReadMessage(array_); - break; - } - } - } - } - - #region Nested types - /// Container for nested types declared in the Expr message type. - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - internal static partial class Types { - internal enum Type { - [pbr::OriginalName("NONE")] None = 0, - [pbr::OriginalName("IDENT")] Ident = 1, - [pbr::OriginalName("LITERAL")] Literal = 2, - [pbr::OriginalName("VARIABLE")] Variable = 3, - [pbr::OriginalName("FUNC_CALL")] FuncCall = 4, - [pbr::OriginalName("OPERATOR")] Operator = 5, - [pbr::OriginalName("PLACEHOLDER")] Placeholder = 6, - [pbr::OriginalName("OBJECT")] Object = 7, - [pbr::OriginalName("ARRAY")] Array = 8, - } - - } - #endregion - - } - - /// - /// identifier: name, schame.name - /// - /// .. productionlist:: - /// identifier: string "." string | - /// : string - /// - internal sealed partial class Identifier : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Identifier()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Expr.MysqlxExprReflection.Descriptor.MessageTypes[1]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Identifier() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Identifier(Identifier other) : this() { - name_ = other.name_; - schemaName_ = other.schemaName_; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Identifier Clone() { - return new Identifier(this); - } - - /// Field number for the "name" field. - public const int NameFieldNumber = 1; - private string name_ = ""; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string Name { - get { return name_; } - set { - name_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "schema_name" field. - public const int SchemaNameFieldNumber = 2; - private string schemaName_ = ""; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string SchemaName { - get { return schemaName_; } - set { - schemaName_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Identifier); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Identifier other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (Name != other.Name) return false; - if (SchemaName != other.SchemaName) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (Name.Length != 0) hash ^= Name.GetHashCode(); - if (SchemaName.Length != 0) hash ^= SchemaName.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (Name.Length != 0) { - output.WriteRawTag(10); - output.WriteString(Name); - } - if (SchemaName.Length != 0) { - output.WriteRawTag(18); - output.WriteString(SchemaName); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (Name.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(Name); - } - if (SchemaName.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(SchemaName); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Identifier other) { - if (other == null) { - return; - } - if (other.Name.Length != 0) { - Name = other.Name; - } - if (other.SchemaName.Length != 0) { - SchemaName = other.SchemaName; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - Name = input.ReadString(); - break; - } - case 18: { - SchemaName = input.ReadString(); - break; - } - } - } - } - - } - - /// - /// DocumentPathItem - /// - /// .. productionlist:: - /// document_path: path_item | path_item document_path - /// path_item : member | array_index | "**" - /// member : "." string | "." "*" - /// array_index : "[" number "]" | "[" "*" "]" - /// - internal sealed partial class DocumentPathItem : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new DocumentPathItem()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Expr.MysqlxExprReflection.Descriptor.MessageTypes[2]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public DocumentPathItem() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public DocumentPathItem(DocumentPathItem other) : this() { - type_ = other.type_; - value_ = other.value_; - index_ = other.index_; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public DocumentPathItem Clone() { - return new DocumentPathItem(this); - } - - /// Field number for the "type" field. - public const int TypeFieldNumber = 1; - private global::Mysqlx.Expr.DocumentPathItem.Types.Type type_ = 0; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Expr.DocumentPathItem.Types.Type Type { - get { return type_; } - set { - type_ = value; - } - } - - /// Field number for the "value" field. - public const int ValueFieldNumber = 2; - private string value_ = ""; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string Value { - get { return value_; } - set { - value_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "index" field. - public const int IndexFieldNumber = 3; - private uint index_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public uint Index { - get { return index_; } - set { - index_ = value; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as DocumentPathItem); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(DocumentPathItem other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (Type != other.Type) return false; - if (Value != other.Value) return false; - if (Index != other.Index) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (Type != 0) hash ^= Type.GetHashCode(); - if (Value.Length != 0) hash ^= Value.GetHashCode(); - if (Index != 0) hash ^= Index.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (Type != 0) { - output.WriteRawTag(8); - output.WriteEnum((int) Type); - } - if (Value.Length != 0) { - output.WriteRawTag(18); - output.WriteString(Value); - } - if (Index != 0) { - output.WriteRawTag(24); - output.WriteUInt32(Index); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (Type != 0) { - size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Type); - } - if (Value.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(Value); - } - if (Index != 0) { - size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Index); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(DocumentPathItem other) { - if (other == null) { - return; - } - if (other.Type != 0) { - Type = other.Type; - } - if (other.Value.Length != 0) { - Value = other.Value; - } - if (other.Index != 0) { - Index = other.Index; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 8: { - type_ = (global::Mysqlx.Expr.DocumentPathItem.Types.Type) input.ReadEnum(); - break; - } - case 18: { - Value = input.ReadString(); - break; - } - case 24: { - Index = input.ReadUInt32(); - break; - } - } - } - } - - #region Nested types - /// Container for nested types declared in the DocumentPathItem message type. - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - internal static partial class Types { - internal enum Type { - [pbr::OriginalName("NONE")] None = 0, - /// - /// .member - /// - [pbr::OriginalName("MEMBER")] Member = 1, - /// - /// .* - /// - [pbr::OriginalName("MEMBER_ASTERISK")] MemberAsterisk = 2, - /// - /// [index] - /// - [pbr::OriginalName("ARRAY_INDEX")] ArrayIndex = 3, - /// - /// [*] - /// - [pbr::OriginalName("ARRAY_INDEX_ASTERISK")] ArrayIndexAsterisk = 4, - /// - /// ** - /// - [pbr::OriginalName("DOUBLE_ASTERISK")] DoubleAsterisk = 5, - } - - } - #endregion - - } - - /// - /// col_identifier (table): col@doc_path, tbl.col@doc_path col, tbl.col, schema.tbl.col - /// col_identifier (document): doc_path - /// - /// .. productionlist:: - /// col_identifier: string "." string "." string | - /// : string "." string | - /// : string | - /// : string "." string "." string "@" document_path | - /// : string "." string "@" document_path | - /// : string "@" document_path | - /// : document_path - /// document_path: member | arrayLocation | doubleAsterisk - /// member = "." string | "." "*" - /// arrayLocation = "[" index "]" | "[" "*" "]" - /// doubleAsterisk = "**" - /// - internal sealed partial class ColumnIdentifier : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new ColumnIdentifier()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Expr.MysqlxExprReflection.Descriptor.MessageTypes[3]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public ColumnIdentifier() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public ColumnIdentifier(ColumnIdentifier other) : this() { - documentPath_ = other.documentPath_.Clone(); - name_ = other.name_; - tableName_ = other.tableName_; - schemaName_ = other.schemaName_; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public ColumnIdentifier Clone() { - return new ColumnIdentifier(this); - } - - /// Field number for the "document_path" field. - public const int DocumentPathFieldNumber = 1; - private static readonly pb::FieldCodec _repeated_documentPath_codec - = pb::FieldCodec.ForMessage(10, global::Mysqlx.Expr.DocumentPathItem.Parser); - private readonly pbc::RepeatedField documentPath_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField DocumentPath { - get { return documentPath_; } - } - - /// Field number for the "name" field. - public const int NameFieldNumber = 2; - private string name_ = ""; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string Name { - get { return name_; } - set { - name_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "table_name" field. - public const int TableNameFieldNumber = 3; - private string tableName_ = ""; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string TableName { - get { return tableName_; } - set { - tableName_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "schema_name" field. - public const int SchemaNameFieldNumber = 4; - private string schemaName_ = ""; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string SchemaName { - get { return schemaName_; } - set { - schemaName_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as ColumnIdentifier); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(ColumnIdentifier other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if(!documentPath_.Equals(other.documentPath_)) return false; - if (Name != other.Name) return false; - if (TableName != other.TableName) return false; - if (SchemaName != other.SchemaName) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - hash ^= documentPath_.GetHashCode(); - if (Name.Length != 0) hash ^= Name.GetHashCode(); - if (TableName.Length != 0) hash ^= TableName.GetHashCode(); - if (SchemaName.Length != 0) hash ^= SchemaName.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - documentPath_.WriteTo(output, _repeated_documentPath_codec); - if (Name.Length != 0) { - output.WriteRawTag(18); - output.WriteString(Name); - } - if (TableName.Length != 0) { - output.WriteRawTag(26); - output.WriteString(TableName); - } - if (SchemaName.Length != 0) { - output.WriteRawTag(34); - output.WriteString(SchemaName); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - size += documentPath_.CalculateSize(_repeated_documentPath_codec); - if (Name.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(Name); - } - if (TableName.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(TableName); - } - if (SchemaName.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(SchemaName); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(ColumnIdentifier other) { - if (other == null) { - return; - } - documentPath_.Add(other.documentPath_); - if (other.Name.Length != 0) { - Name = other.Name; - } - if (other.TableName.Length != 0) { - TableName = other.TableName; - } - if (other.SchemaName.Length != 0) { - SchemaName = other.SchemaName; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - documentPath_.AddEntriesFrom(input, _repeated_documentPath_codec); - break; - } - case 18: { - Name = input.ReadString(); - break; - } - case 26: { - TableName = input.ReadString(); - break; - } - case 34: { - SchemaName = input.ReadString(); - break; - } - } - } - } - - } - - /// - /// function call: ``func(a, b, "1", 3)`` - /// - /// .. productionlist:: - /// function_call: `identifier` "(" [ `expr` ["," `expr` ]* ] ")" - /// - internal sealed partial class FunctionCall : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new FunctionCall()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Expr.MysqlxExprReflection.Descriptor.MessageTypes[4]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public FunctionCall() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public FunctionCall(FunctionCall other) : this() { - Name = other.name_ != null ? other.Name.Clone() : null; - param_ = other.param_.Clone(); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public FunctionCall Clone() { - return new FunctionCall(this); - } - - /// Field number for the "name" field. - public const int NameFieldNumber = 1; - private global::Mysqlx.Expr.Identifier name_; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Expr.Identifier Name { - get { return name_; } - set { - name_ = value; - } - } - - /// Field number for the "param" field. - public const int ParamFieldNumber = 2; - private static readonly pb::FieldCodec _repeated_param_codec - = pb::FieldCodec.ForMessage(18, global::Mysqlx.Expr.Expr.Parser); - private readonly pbc::RepeatedField param_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField Param { - get { return param_; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as FunctionCall); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(FunctionCall other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (!object.Equals(Name, other.Name)) return false; - if(!param_.Equals(other.param_)) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (name_ != null) hash ^= Name.GetHashCode(); - hash ^= param_.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (name_ != null) { - output.WriteRawTag(10); - output.WriteMessage(Name); - } - param_.WriteTo(output, _repeated_param_codec); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (name_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Name); - } - size += param_.CalculateSize(_repeated_param_codec); - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(FunctionCall other) { - if (other == null) { - return; - } - if (other.name_ != null) { - if (name_ == null) { - name_ = new global::Mysqlx.Expr.Identifier(); - } - Name.MergeFrom(other.Name); - } - param_.Add(other.param_); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - if (name_ == null) { - name_ = new global::Mysqlx.Expr.Identifier(); - } - input.ReadMessage(name_); - break; - } - case 18: { - param_.AddEntriesFrom(input, _repeated_param_codec); - break; - } - } - } - } - - } - - /// - /// operator: ``<<(a, b)`` - /// - /// .. note:: - /// - /// Non-authoritative list of operators implemented (case sensitive): - /// - /// Nullary - /// * ``*`` - /// * ``default`` - /// - /// Unary - /// * ``!`` - /// * ``sign_plus`` - /// * ``sign_minus`` - /// * ``~`` - /// - /// Binary - /// * ``&&`` - /// * ``||`` - /// * ``xor`` - /// * ``==`` - /// * ``!=`` - /// * ``>`` - /// * ``>=`` - /// * ``<`` - /// * ``<=`` - /// * ``&`` - /// * ``|`` - /// * ``^`` - /// * ``<<`` - /// * ``>>`` - /// * ``+`` - /// * ``-`` - /// * ``*`` - /// * ``/`` - /// * ``div`` - /// * ``%`` - /// * ``is`` - /// * ``is_not`` - /// * ``regexp`` - /// * ``not_regexp`` - /// * ``like`` - /// * ``not_like`` - /// * ``cast`` - /// - /// Using special representation, with more than 2 params - /// * ``in`` (param[0] IN (param[1], param[2], ...)) - /// * ``not_in`` (param[0] NOT IN (param[1], param[2], ...)) - /// - /// Ternary - /// * ``between`` - /// * ``between_not`` - /// * ``date_add`` - /// * ``date_sub`` - /// - /// Units for date_add/date_sub - /// * ``MICROSECOND`` - /// * ``SECOND`` - /// * ``MINUTE`` - /// * ``HOUR`` - /// * ``DAY`` - /// * ``WEEK`` - /// * ``MONTH`` - /// * ``QUARTER`` - /// * ``YEAR`` - /// * ``SECOND_MICROSECOND`` - /// * ``MINUTE_MICROSECOND`` - /// * ``MINUTE_SECOND`` - /// * ``HOUR_MICROSECOND`` - /// * ``HOUR_SECOND`` - /// * ``HOUR_MINUTE`` - /// * ``DAY_MICROSECOND`` - /// * ``DAY_SECOND`` - /// * ``DAY_MINUTE`` - /// * ``DAY_HOUR`` - /// - /// Types for cast - /// * ``BINARY[(N)]`` - /// * ``CHAR[(N)]`` - /// * ``DATE`` - /// * ``DATETIME`` - /// * ``DECIMAL[(M[,D])]`` - /// * ``JSON`` - /// * ``SIGNED [INTEGER]`` - /// * ``TIME`` - /// * ``UNSIGNED [INTEGER]`` - /// - /// .. productionlist:: - /// operator: `name` "(" [ `expr` ["," `expr` ]* ] ")" - /// - internal sealed partial class Operator : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Operator()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Expr.MysqlxExprReflection.Descriptor.MessageTypes[5]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Operator() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Operator(Operator other) : this() { - name_ = other.name_; - param_ = other.param_.Clone(); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Operator Clone() { - return new Operator(this); - } - - /// Field number for the "name" field. - public const int NameFieldNumber = 1; - private string name_ = ""; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string Name { - get { return name_; } - set { - name_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "param" field. - public const int ParamFieldNumber = 2; - private static readonly pb::FieldCodec _repeated_param_codec - = pb::FieldCodec.ForMessage(18, global::Mysqlx.Expr.Expr.Parser); - private readonly pbc::RepeatedField param_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField Param { - get { return param_; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Operator); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Operator other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (Name != other.Name) return false; - if(!param_.Equals(other.param_)) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (Name.Length != 0) hash ^= Name.GetHashCode(); - hash ^= param_.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (Name.Length != 0) { - output.WriteRawTag(10); - output.WriteString(Name); - } - param_.WriteTo(output, _repeated_param_codec); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (Name.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(Name); - } - size += param_.CalculateSize(_repeated_param_codec); - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Operator other) { - if (other == null) { - return; - } - if (other.Name.Length != 0) { - Name = other.Name; - } - param_.Add(other.param_); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - Name = input.ReadString(); - break; - } - case 18: { - param_.AddEntriesFrom(input, _repeated_param_codec); - break; - } - } - } - } - - } - - /// - /// an object (with expression values) - /// - internal sealed partial class Object : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Object()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Expr.MysqlxExprReflection.Descriptor.MessageTypes[6]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Object() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Object(Object other) : this() { - fld_ = other.fld_.Clone(); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Object Clone() { - return new Object(this); - } - - /// Field number for the "fld" field. - public const int FldFieldNumber = 1; - private static readonly pb::FieldCodec _repeated_fld_codec - = pb::FieldCodec.ForMessage(10, global::Mysqlx.Expr.Object.Types.ObjectField.Parser); - private readonly pbc::RepeatedField fld_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField Fld { - get { return fld_; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Object); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Object other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if(!fld_.Equals(other.fld_)) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - hash ^= fld_.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - fld_.WriteTo(output, _repeated_fld_codec); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - size += fld_.CalculateSize(_repeated_fld_codec); - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Object other) { - if (other == null) { - return; - } - fld_.Add(other.fld_); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - fld_.AddEntriesFrom(input, _repeated_fld_codec); - break; - } - } - } - } - - #region Nested types - /// Container for nested types declared in the Object message type. - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - internal static partial class Types { - internal sealed partial class ObjectField : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new ObjectField()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Expr.Object.Descriptor.NestedTypes[0]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public ObjectField() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public ObjectField(ObjectField other) : this() { - key_ = other.key_; - Value = other.value_ != null ? other.Value.Clone() : null; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public ObjectField Clone() { - return new ObjectField(this); - } - - /// Field number for the "key" field. - public const int KeyFieldNumber = 1; - private string key_ = ""; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string Key { - get { return key_; } - set { - key_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "value" field. - public const int ValueFieldNumber = 2; - private global::Mysqlx.Expr.Expr value_; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Expr.Expr Value { - get { return value_; } - set { - value_ = value; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as ObjectField); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(ObjectField other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (Key != other.Key) return false; - if (!object.Equals(Value, other.Value)) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (Key.Length != 0) hash ^= Key.GetHashCode(); - if (value_ != null) hash ^= Value.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (Key.Length != 0) { - output.WriteRawTag(10); - output.WriteString(Key); - } - if (value_ != null) { - output.WriteRawTag(18); - output.WriteMessage(Value); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (Key.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(Key); - } - if (value_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Value); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(ObjectField other) { - if (other == null) { - return; - } - if (other.Key.Length != 0) { - Key = other.Key; - } - if (other.value_ != null) { - if (value_ == null) { - value_ = new global::Mysqlx.Expr.Expr(); - } - Value.MergeFrom(other.Value); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - Key = input.ReadString(); - break; - } - case 18: { - if (value_ == null) { - value_ = new global::Mysqlx.Expr.Expr(); - } - input.ReadMessage(value_); - break; - } - } - } - } - - } - - } - #endregion - - } - - /// - /// a Array of expressions - /// - internal sealed partial class Array : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Array()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Expr.MysqlxExprReflection.Descriptor.MessageTypes[7]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Array() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Array(Array other) : this() { - value_ = other.value_.Clone(); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Array Clone() { - return new Array(this); - } - - /// Field number for the "value" field. - public const int ValueFieldNumber = 1; - private static readonly pb::FieldCodec _repeated_value_codec - = pb::FieldCodec.ForMessage(10, global::Mysqlx.Expr.Expr.Parser); - private readonly pbc::RepeatedField value_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField Value { - get { return value_; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Array); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Array other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if(!value_.Equals(other.value_)) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - hash ^= value_.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - value_.WriteTo(output, _repeated_value_codec); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - size += value_.CalculateSize(_repeated_value_codec); - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Array other) { - if (other == null) { - return; - } - value_.Add(other.value_); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - value_.AddEntriesFrom(input, _repeated_value_codec); - break; - } - } - } - } - - } - - #endregion - -} - -#endregion Designer generated code diff --git a/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxNotice.cs b/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxNotice.cs deleted file mode 100644 index 6a8636e29..000000000 --- a/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxNotice.cs +++ /dev/null @@ -1,850 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: mysqlx_notice.proto -#pragma warning disable 1591, 0612, 3021 -#region Designer generated code - -using pb = global::Google.Protobuf; -using pbc = global::Google.Protobuf.Collections; -using pbr = global::Google.Protobuf.Reflection; -using scg = global::System.Collections.Generic; -namespace Mysqlx.Notice { - - /// Holder for reflection information generated from mysqlx_notice.proto - internal static partial class MysqlxNoticeReflection { - - #region Descriptor - /// File descriptor for mysqlx_notice.proto - public static pbr::FileDescriptor Descriptor { - get { return descriptor; } - } - private static pbr::FileDescriptor descriptor; - - static MysqlxNoticeReflection() { - byte[] descriptorData = global::System.Convert.FromBase64String( - string.Concat( - "ChNteXNxbHhfbm90aWNlLnByb3RvEg1NeXNxbHguTm90aWNlGhZteXNxbHhf", - "ZGF0YXR5cGVzLnByb3RvInsKBUZyYW1lEgwKBHR5cGUYASABKA0SKQoFc2Nv", - "cGUYAiABKA4yGi5NeXNxbHguTm90aWNlLkZyYW1lLlNjb3BlEg8KB3BheWxv", - "YWQYAyABKAwiKAoFU2NvcGUSCAoETk9ORRAAEgoKBkdMT0JBTBABEgkKBUxP", - "Q0FMEAIihgEKB1dhcm5pbmcSKwoFbGV2ZWwYASABKA4yHC5NeXNxbHguTm90", - "aWNlLldhcm5pbmcuTGV2ZWwSDAoEY29kZRgCIAEoDRILCgNtc2cYAyABKAki", - "MwoFTGV2ZWwSCAoETk9ORRAAEggKBE5PVEUQARILCgdXQVJOSU5HEAISCQoF", - "RVJST1IQAyJQChZTZXNzaW9uVmFyaWFibGVDaGFuZ2VkEg0KBXBhcmFtGAEg", - "ASgJEicKBXZhbHVlGAIgASgLMhguTXlzcWx4LkRhdGF0eXBlcy5TY2FsYXIi", - "3wIKE1Nlc3Npb25TdGF0ZUNoYW5nZWQSOwoFcGFyYW0YASABKA4yLC5NeXNx", - "bHguTm90aWNlLlNlc3Npb25TdGF0ZUNoYW5nZWQuUGFyYW1ldGVyEicKBXZh", - "bHVlGAIgASgLMhguTXlzcWx4LkRhdGF0eXBlcy5TY2FsYXIi4QEKCVBhcmFt", - "ZXRlchIICgROT05FEAASEgoOQ1VSUkVOVF9TQ0hFTUEQARITCg9BQ0NPVU5U", - "X0VYUElSRUQQAhIXChNHRU5FUkFURURfSU5TRVJUX0lEEAMSEQoNUk9XU19B", - "RkZFQ1RFRBAEEg4KClJPV1NfRk9VTkQQBRIQCgxST1dTX01BVENIRUQQBhIR", - "Cg1UUlhfQ09NTUlUVEVEEAcSEgoOVFJYX1JPTExFREJBQ0sQCRIUChBQUk9E", - "VUNFRF9NRVNTQUdFEAoSFgoSQ0xJRU5UX0lEX0FTU0lHTkVEEAtCHgocY29t", - "Lm15c3FsLmNqLm15c3FseC5wcm90b2J1ZmIGcHJvdG8z")); - descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, - new pbr::FileDescriptor[] { global::Mysqlx.Datatypes.MysqlxDatatypesReflection.Descriptor, }, - new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Notice.Frame), global::Mysqlx.Notice.Frame.Parser, new[]{ "Type", "Scope", "Payload" }, null, new[]{ typeof(global::Mysqlx.Notice.Frame.Types.Scope) }, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Notice.Warning), global::Mysqlx.Notice.Warning.Parser, new[]{ "Level", "Code", "Msg" }, null, new[]{ typeof(global::Mysqlx.Notice.Warning.Types.Level) }, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Notice.SessionVariableChanged), global::Mysqlx.Notice.SessionVariableChanged.Parser, new[]{ "Param", "Value" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Notice.SessionStateChanged), global::Mysqlx.Notice.SessionStateChanged.Parser, new[]{ "Param", "Value" }, null, new[]{ typeof(global::Mysqlx.Notice.SessionStateChanged.Types.Parameter) }, null) - })); - } - #endregion - - } - #region Messages - /// - /// Common Frame for all Notices - /// - /// ===================================================== ===== - /// .type value - /// ===================================================== ===== - /// :protobuf:msg:`Mysqlx.Notice::Warning` 1 - /// :protobuf:msg:`Mysqlx.Notice::SessionVariableChanged` 2 - /// :protobuf:msg:`Mysqlx.Notice::SessionStateChanged` 3 - /// ===================================================== ===== - /// - /// :param type: the type of the payload - /// :param payload: the payload of the notification - /// :param scope: global or local notification - /// - internal sealed partial class Frame : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Frame()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Notice.MysqlxNoticeReflection.Descriptor.MessageTypes[0]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Frame() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Frame(Frame other) : this() { - type_ = other.type_; - scope_ = other.scope_; - payload_ = other.payload_; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Frame Clone() { - return new Frame(this); - } - - /// Field number for the "type" field. - public const int TypeFieldNumber = 1; - private uint type_; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public uint Type { - get { return type_; } - set { - type_ = value; - } - } - - /// Field number for the "scope" field. - public const int ScopeFieldNumber = 2; - private global::Mysqlx.Notice.Frame.Types.Scope scope_ = 0; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Notice.Frame.Types.Scope Scope { - get { return scope_; } - set { - scope_ = value; - } - } - - /// Field number for the "payload" field. - public const int PayloadFieldNumber = 3; - private pb::ByteString payload_ = pb::ByteString.Empty; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pb::ByteString Payload { - get { return payload_; } - set { - payload_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Frame); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Frame other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (Type != other.Type) return false; - if (Scope != other.Scope) return false; - if (Payload != other.Payload) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (Type != 0) hash ^= Type.GetHashCode(); - if (Scope != 0) hash ^= Scope.GetHashCode(); - if (Payload.Length != 0) hash ^= Payload.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (Type != 0) { - output.WriteRawTag(8); - output.WriteUInt32(Type); - } - if (Scope != 0) { - output.WriteRawTag(16); - output.WriteEnum((int) Scope); - } - if (Payload.Length != 0) { - output.WriteRawTag(26); - output.WriteBytes(Payload); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (Type != 0) { - size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Type); - } - if (Scope != 0) { - size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Scope); - } - if (Payload.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeBytesSize(Payload); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Frame other) { - if (other == null) { - return; - } - if (other.Type != 0) { - Type = other.Type; - } - if (other.Scope != 0) { - Scope = other.Scope; - } - if (other.Payload.Length != 0) { - Payload = other.Payload; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 8: { - Type = input.ReadUInt32(); - break; - } - case 16: { - scope_ = (global::Mysqlx.Notice.Frame.Types.Scope) input.ReadEnum(); - break; - } - case 26: { - Payload = input.ReadBytes(); - break; - } - } - } - } - - #region Nested types - /// Container for nested types declared in the Frame message type. - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - internal static partial class Types { - internal enum Scope { - [pbr::OriginalName("NONE")] None = 0, - [pbr::OriginalName("GLOBAL")] Global = 1, - [pbr::OriginalName("LOCAL")] Local = 2, - } - - } - #endregion - - } - - /// - /// Server-side warnings and notes - /// - /// ``.scope`` == ``local`` - /// ``.level``, ``.code`` and ``.msg`` map the content of - /// - /// .. code-block:: sql - /// - /// SHOW WARNINGS - /// - /// ``.scope`` == ``global`` - /// (undefined) will be used for global, unstructured messages like: - /// - /// * server is shutting down - /// * a node disconnected from group - /// * schema or table dropped - /// - /// ========================================== ======================= - /// :protobuf:msg:`Mysqlx.Notice::Frame` field value - /// ========================================== ======================= - /// ``.type`` 1 - /// ``.scope`` ``local`` or ``global`` - /// ========================================== ======================= - /// - /// :param level: warning level: Note or Warning - /// :param code: warning code - /// :param msg: warning message - /// - internal sealed partial class Warning : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Warning()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Notice.MysqlxNoticeReflection.Descriptor.MessageTypes[1]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Warning() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Warning(Warning other) : this() { - level_ = other.level_; - code_ = other.code_; - msg_ = other.msg_; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Warning Clone() { - return new Warning(this); - } - - /// Field number for the "level" field. - public const int LevelFieldNumber = 1; - private global::Mysqlx.Notice.Warning.Types.Level level_ = 0; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Notice.Warning.Types.Level Level { - get { return level_; } - set { - level_ = value; - } - } - - /// Field number for the "code" field. - public const int CodeFieldNumber = 2; - private uint code_; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public uint Code { - get { return code_; } - set { - code_ = value; - } - } - - /// Field number for the "msg" field. - public const int MsgFieldNumber = 3; - private string msg_ = ""; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string Msg { - get { return msg_; } - set { - msg_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Warning); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Warning other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (Level != other.Level) return false; - if (Code != other.Code) return false; - if (Msg != other.Msg) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (Level != 0) hash ^= Level.GetHashCode(); - if (Code != 0) hash ^= Code.GetHashCode(); - if (Msg.Length != 0) hash ^= Msg.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (Level != 0) { - output.WriteRawTag(8); - output.WriteEnum((int) Level); - } - if (Code != 0) { - output.WriteRawTag(16); - output.WriteUInt32(Code); - } - if (Msg.Length != 0) { - output.WriteRawTag(26); - output.WriteString(Msg); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (Level != 0) { - size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Level); - } - if (Code != 0) { - size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Code); - } - if (Msg.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(Msg); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Warning other) { - if (other == null) { - return; - } - if (other.Level != 0) { - Level = other.Level; - } - if (other.Code != 0) { - Code = other.Code; - } - if (other.Msg.Length != 0) { - Msg = other.Msg; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 8: { - level_ = (global::Mysqlx.Notice.Warning.Types.Level) input.ReadEnum(); - break; - } - case 16: { - Code = input.ReadUInt32(); - break; - } - case 26: { - Msg = input.ReadString(); - break; - } - } - } - } - - #region Nested types - /// Container for nested types declared in the Warning message type. - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - internal static partial class Types { - internal enum Level { - [pbr::OriginalName("NONE")] None = 0, - [pbr::OriginalName("NOTE")] Note = 1, - [pbr::OriginalName("WARNING")] Warning = 2, - [pbr::OriginalName("ERROR")] Error = 3, - } - - } - #endregion - - } - - /// - /// Notify clients about changes to the current session variables - /// - /// Every change to a variable that is accessable through: - /// - /// .. code-block:: sql - /// - /// SHOW SESSION VARIABLES - /// - /// ========================================== ========= - /// :protobuf:msg:`Mysqlx.Notice::Frame` field value - /// ========================================== ========= - /// ``.type`` 2 - /// ``.scope`` ``local`` - /// ========================================== ========= - /// - /// :param namespace: namespace that param belongs to - /// :param param: name of the variable - /// :param value: the changed value of param - /// - internal sealed partial class SessionVariableChanged : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new SessionVariableChanged()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Notice.MysqlxNoticeReflection.Descriptor.MessageTypes[2]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public SessionVariableChanged() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public SessionVariableChanged(SessionVariableChanged other) : this() { - param_ = other.param_; - Value = other.value_ != null ? other.Value.Clone() : null; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public SessionVariableChanged Clone() { - return new SessionVariableChanged(this); - } - - /// Field number for the "param" field. - public const int ParamFieldNumber = 1; - private string param_ = ""; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string Param { - get { return param_; } - set { - param_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "value" field. - public const int ValueFieldNumber = 2; - private global::Mysqlx.Datatypes.Scalar value_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Datatypes.Scalar Value { - get { return value_; } - set { - value_ = value; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as SessionVariableChanged); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(SessionVariableChanged other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (Param != other.Param) return false; - if (!object.Equals(Value, other.Value)) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (Param.Length != 0) hash ^= Param.GetHashCode(); - if (value_ != null) hash ^= Value.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (Param.Length != 0) { - output.WriteRawTag(10); - output.WriteString(Param); - } - if (value_ != null) { - output.WriteRawTag(18); - output.WriteMessage(Value); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (Param.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(Param); - } - if (value_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Value); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(SessionVariableChanged other) { - if (other == null) { - return; - } - if (other.Param.Length != 0) { - Param = other.Param; - } - if (other.value_ != null) { - if (value_ == null) { - value_ = new global::Mysqlx.Datatypes.Scalar(); - } - Value.MergeFrom(other.Value); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - Param = input.ReadString(); - break; - } - case 18: { - if (value_ == null) { - value_ = new global::Mysqlx.Datatypes.Scalar(); - } - input.ReadMessage(value_); - break; - } - } - } - } - - } - - /// - /// Notify clients about changes to the internal session state - /// - /// ========================================== ========= - /// :protobuf:msg:`Mysqlx.Notice::Frame` field value - /// ========================================== ========= - /// ``.type`` 3 - /// ``.scope`` ``local`` - /// ========================================== ========= - /// - /// :param param: parameter key - /// :param value: updated value - /// - internal sealed partial class SessionStateChanged : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new SessionStateChanged()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Notice.MysqlxNoticeReflection.Descriptor.MessageTypes[3]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public SessionStateChanged() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public SessionStateChanged(SessionStateChanged other) : this() { - param_ = other.param_; - Value = other.value_ != null ? other.Value.Clone() : null; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public SessionStateChanged Clone() { - return new SessionStateChanged(this); - } - - /// Field number for the "param" field. - public const int ParamFieldNumber = 1; - private global::Mysqlx.Notice.SessionStateChanged.Types.Parameter param_ = 0; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Notice.SessionStateChanged.Types.Parameter Param { - get { return param_; } - set { - param_ = value; - } - } - - /// Field number for the "value" field. - public const int ValueFieldNumber = 2; - private global::Mysqlx.Datatypes.Scalar value_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Datatypes.Scalar Value { - get { return value_; } - set { - value_ = value; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as SessionStateChanged); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(SessionStateChanged other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (Param != other.Param) return false; - if (!object.Equals(Value, other.Value)) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (Param != 0) hash ^= Param.GetHashCode(); - if (value_ != null) hash ^= Value.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (Param != 0) { - output.WriteRawTag(8); - output.WriteEnum((int) Param); - } - if (value_ != null) { - output.WriteRawTag(18); - output.WriteMessage(Value); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (Param != 0) { - size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Param); - } - if (value_ != null) { - size += 1 + pb::CodedOutputStream.ComputeMessageSize(Value); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(SessionStateChanged other) { - if (other == null) { - return; - } - if (other.Param != 0) { - Param = other.Param; - } - if (other.value_ != null) { - if (value_ == null) { - value_ = new global::Mysqlx.Datatypes.Scalar(); - } - Value.MergeFrom(other.Value); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 8: { - param_ = (global::Mysqlx.Notice.SessionStateChanged.Types.Parameter) input.ReadEnum(); - break; - } - case 18: { - if (value_ == null) { - value_ = new global::Mysqlx.Datatypes.Scalar(); - } - input.ReadMessage(value_); - break; - } - } - } - } - - #region Nested types - /// Container for nested types declared in the SessionStateChanged message type. - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - internal static partial class Types { - internal enum Parameter { - [pbr::OriginalName("NONE")] None = 0, - [pbr::OriginalName("CURRENT_SCHEMA")] CurrentSchema = 1, - [pbr::OriginalName("ACCOUNT_EXPIRED")] AccountExpired = 2, - [pbr::OriginalName("GENERATED_INSERT_ID")] GeneratedInsertId = 3, - [pbr::OriginalName("ROWS_AFFECTED")] RowsAffected = 4, - [pbr::OriginalName("ROWS_FOUND")] RowsFound = 5, - [pbr::OriginalName("ROWS_MATCHED")] RowsMatched = 6, - [pbr::OriginalName("TRX_COMMITTED")] TrxCommitted = 7, - [pbr::OriginalName("TRX_ROLLEDBACK")] TrxRolledback = 9, - [pbr::OriginalName("PRODUCED_MESSAGE")] ProducedMessage = 10, - /// - /// .. more to be added - /// - [pbr::OriginalName("CLIENT_ID_ASSIGNED")] ClientIdAssigned = 11, - } - - } - #endregion - - } - - #endregion - -} - -#endregion Designer generated code diff --git a/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxResultset.cs b/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxResultset.cs deleted file mode 100644 index 4c9f9ed73..000000000 --- a/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxResultset.cs +++ /dev/null @@ -1,1221 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: mysqlx_resultset.proto -#pragma warning disable 1591, 0612, 3021 -#region Designer generated code - -using pb = global::Google.Protobuf; -using pbc = global::Google.Protobuf.Collections; -using pbr = global::Google.Protobuf.Reflection; -using scg = global::System.Collections.Generic; -namespace Mysqlx.Resultset { - - /// Holder for reflection information generated from mysqlx_resultset.proto - internal static partial class MysqlxResultsetReflection { - - #region Descriptor - /// File descriptor for mysqlx_resultset.proto - public static pbr::FileDescriptor Descriptor { - get { return descriptor; } - } - private static pbr::FileDescriptor descriptor; - - static MysqlxResultsetReflection() { - byte[] descriptorData = global::System.Convert.FromBase64String( - string.Concat( - "ChZteXNxbHhfcmVzdWx0c2V0LnByb3RvEhBNeXNxbHguUmVzdWx0c2V0IhgK", - "FkZldGNoRG9uZU1vcmVPdXRQYXJhbXMiGQoXRmV0Y2hEb25lTW9yZVJlc3Vs", - "dHNldHMiCwoJRmV0Y2hEb25lIqkDCg5Db2x1bW5NZXRhRGF0YRI4CgR0eXBl", - "GAEgASgOMiouTXlzcWx4LlJlc3VsdHNldC5Db2x1bW5NZXRhRGF0YS5GaWVs", - "ZFR5cGUSDAoEbmFtZRgCIAEoDBIVCg1vcmlnaW5hbF9uYW1lGAMgASgMEg0K", - "BXRhYmxlGAQgASgMEhYKDm9yaWdpbmFsX3RhYmxlGAUgASgMEg4KBnNjaGVt", - "YRgGIAEoDBIPCgdjYXRhbG9nGAcgASgMEhEKCWNvbGxhdGlvbhgIIAEoBBIZ", - "ChFmcmFjdGlvbmFsX2RpZ2l0cxgJIAEoDRIOCgZsZW5ndGgYCiABKA0SDQoF", - "ZmxhZ3MYCyABKA0SFAoMY29udGVudF90eXBlGAwgASgNIowBCglGaWVsZFR5", - "cGUSCAoETk9ORRAAEggKBFNJTlQQARIICgRVSU5UEAISCgoGRE9VQkxFEAUS", - "CQoFRkxPQVQQBhIJCgVCWVRFUxAHEggKBFRJTUUQChIMCghEQVRFVElNRRAM", - "EgcKA1NFVBAPEggKBEVOVU0QEBIHCgNCSVQQERILCgdERUNJTUFMEBIiFAoD", - "Um93Eg0KBWZpZWxkGAEgAygMQh4KHGNvbS5teXNxbC5jai5teXNxbHgucHJv", - "dG9idWZiBnByb3RvMw==")); - descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, - new pbr::FileDescriptor[] { }, - new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Resultset.FetchDoneMoreOutParams), global::Mysqlx.Resultset.FetchDoneMoreOutParams.Parser, null, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Resultset.FetchDoneMoreResultsets), global::Mysqlx.Resultset.FetchDoneMoreResultsets.Parser, null, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Resultset.FetchDone), global::Mysqlx.Resultset.FetchDone.Parser, null, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Resultset.ColumnMetaData), global::Mysqlx.Resultset.ColumnMetaData.Parser, new[]{ "Type", "Name", "OriginalName", "Table", "OriginalTable", "Schema", "Catalog", "Collation", "FractionalDigits", "Length", "Flags", "ContentType" }, null, new[]{ typeof(global::Mysqlx.Resultset.ColumnMetaData.Types.FieldType) }, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Resultset.Row), global::Mysqlx.Resultset.Row.Parser, new[]{ "Field" }, null, null, null) - })); - } - #endregion - - } - #region Messages - /// - /// resultsets are finished, OUT paramset is next - /// - internal sealed partial class FetchDoneMoreOutParams : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new FetchDoneMoreOutParams()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Resultset.MysqlxResultsetReflection.Descriptor.MessageTypes[0]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public FetchDoneMoreOutParams() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public FetchDoneMoreOutParams(FetchDoneMoreOutParams other) : this() { - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public FetchDoneMoreOutParams Clone() { - return new FetchDoneMoreOutParams(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as FetchDoneMoreOutParams); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(FetchDoneMoreOutParams other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(FetchDoneMoreOutParams other) { - if (other == null) { - return; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - } - } - } - - } - - /// - /// resultset and out-params are finished, but more resultsets available - /// - internal sealed partial class FetchDoneMoreResultsets : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new FetchDoneMoreResultsets()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Resultset.MysqlxResultsetReflection.Descriptor.MessageTypes[1]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public FetchDoneMoreResultsets() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public FetchDoneMoreResultsets(FetchDoneMoreResultsets other) : this() { - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public FetchDoneMoreResultsets Clone() { - return new FetchDoneMoreResultsets(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as FetchDoneMoreResultsets); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(FetchDoneMoreResultsets other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(FetchDoneMoreResultsets other) { - if (other == null) { - return; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - } - } - } - - } - - /// - /// all resultsets are finished - /// - internal sealed partial class FetchDone : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new FetchDone()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Resultset.MysqlxResultsetReflection.Descriptor.MessageTypes[2]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public FetchDone() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public FetchDone(FetchDone other) : this() { - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public FetchDone Clone() { - return new FetchDone(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as FetchDone); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(FetchDone other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(FetchDone other) { - if (other == null) { - return; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - } - } - } - - } - - /// - /// meta data of a Column - /// - /// .. note:: the encoding used for the different ``bytes`` fields in the meta data is externally - /// controlled. - /// .. seealso:: https://dev.mysql.com/doc/refman/5.0/en/charset-connection.html - /// - /// .. note:: - /// The server may not set the ``original_{table|name}`` fields if they are equal to the plain - /// ``{table|name}`` field. - /// - /// A client has to reconstruct it like:: - /// - /// if .original_name is empty and .name is not empty: - /// .original_name = .name - /// - /// if .original_table is empty and .table is not empty: - /// .original_table = .table - /// - /// .. note:: - /// ``compact metadata format`` can be requested by the client. In that case only ``.type`` is set and - /// all other fields are empty. - /// - /// :param type: - /// .. table:: Expected Datatype of Mysqlx.Resultset.Row per SQL Type for non NULL values - /// - /// ================= ============ ======= ========== ====== ======== - /// SQL Type .type .length .frac_dig .flags .charset - /// ================= ============ ======= ========== ====== ======== - /// TINY SINT x - /// TINY UNSIGNED UINT x x - /// SHORT SINT x - /// SHORT UNSIGNED UINT x x - /// INT24 SINT x - /// INT24 UNSIGNED UINT x x - /// INT SINT x - /// INT UNSIGNED UINT x x - /// LONGLONG SINT x - /// LONGLONG UNSIGNED UINT x x - /// DOUBLE DOUBLE x x x - /// FLOAT FLOAT x x x - /// DECIMAL DECIMAL x x x - /// VARCHAR,CHAR,... BYTES x x x - /// GEOMETRY BYTES - /// TIME TIME x - /// DATE DATETIME x - /// DATETIME DATETIME x - /// YEAR UINT x x - /// TIMESTAMP DATETIME x - /// SET SET x - /// ENUM ENUM x - /// NULL BYTES - /// BIT BIT x - /// ================= ============ ======= ========== ====== ======== - /// - /// .. note:: the SQL "NULL" value is sent as an empty field value in :protobuf:msg:`Mysqlx.Resultset::Row` - /// .. seealso:: protobuf encoding of primitive datatypes are decribed in https://developers.google.com/protocol-buffers/docs/encoding - /// - /// SINT - /// - /// ``.length`` - /// maximum number of displayable decimal digits (including minus sign) of the type - /// - /// .. note:: - /// valid range is 0-255, but usually you'll see 1-20 - /// - /// =============== == - /// SQL Type max digits per type - /// =============== == - /// TINY SIGNED 4 - /// SHORT SIGNED 6 - /// INT24 SIGNED 8 - /// INT SIGNED 11 - /// LONGLONG SIGNED 20 - /// =============== == - /// - /// .. seealso:: definition of ``M`` in https://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html - /// - /// ``value`` - /// variable length encoded signed 64 integer - /// - /// UINT - /// - /// ``.flags & 1`` (zerofill) - /// the client has to left pad with 0's up to .length - /// - /// ``.length`` - /// maximum number of displayable decimal digits of the type - /// - /// .. note:: - /// valid range is 0-255, but usually you'll see 1-20 - /// - /// ================= == - /// SQL Type max digits per type - /// ================= == - /// TINY UNSIGNED 3 - /// SHORT UNSIGNED 5 - /// INT24 UNSIGNED 8 - /// INT UNSIGNED 10 - /// LONGLONG UNSIGNED 20 - /// ================= == - /// - /// .. seealso:: definition of ``M`` in https://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html - /// - /// ``value`` - /// variable length encoded unsigned 64 integer - /// - /// BIT - /// - /// ``.length`` - /// maximum number of displayable binary digits - /// - /// .. note:: valid range for M of the ``BIT`` type is 1 - 64 - /// .. seealso:: https://dev.mysql.com/doc/refman/5.5/en/numeric-type-overview.html - /// - /// ``value`` - /// variable length encoded unsigned 64 integer - /// - /// DOUBLE - /// - /// ``.length`` - /// maximum number of displayable decimal digits (including the decimal point and ``.fractional_digits``) - /// - /// ``.fractional_digits`` - /// maximum number of displayable decimal digits following the decimal point - /// - /// ``value`` - /// encoded as Protobuf's 'double' - /// - /// FLOAT - /// - /// ``.length`` - /// maximum number of displayable decimal digits (including the decimal point and ``.fractional_digits``) - /// - /// ``.fractional_digits`` - /// maximum number of displayable decimal digits following the decimal point - /// - /// ``value`` - /// encoded as Protobuf's 'float' - /// - /// BYTES, ENUM - /// BYTES is used for all opaque byte strings that may have a charset - /// - /// * TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB - /// * TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT - /// * VARCHAR, VARBINARY - /// * CHAR, BINARY - /// * ENUM - /// - /// ``.length`` - /// the maximum length of characters of the underlying type - /// - /// ``.flags & 1`` (rightpad) - /// if the length of the field is less than ``.length``, the receiver is - /// supposed to add padding characters to the right end of the string. - /// If the ``.charset`` is "binary", the padding character is ``0x00``, - /// otherwise it is a space character as defined by that character set. - /// - /// ============= ======= ======== ======= - /// SQL Type .length .charset .flags - /// ============= ======= ======== ======= - /// TINYBLOB 256 binary - /// BLOB 65535 binary - /// VARCHAR(32) 32 utf8 - /// VARBINARY(32) 32 utf8_bin - /// BINARY(32) 32 binary rightpad - /// CHAR(32) 32 utf8 rightpad - /// ============= ======= ======== ======= - /// - /// ``value`` - /// sequence of bytes with added one extra '\0' byte at the end. To obtain the - /// original string, the extra '\0' should be removed. - /// .. note:: the length of the string can be acquired with protobuf's field length() method - /// length of sequence-of-bytes = length-of-field - 1 - /// .. note:: the extra byte allows to distinguish between a NULL and empty byte sequence - /// - /// TIME - /// A time value. - /// - /// ``value`` - /// the following bytes sequence: - /// - /// ``| negate [ | hour | [ | minutes | [ | seconds | [ | useconds | ]]]]`` - /// - /// * negate - one byte, should be one of: 0x00 for "+", 0x01 for "-" - /// * hour - optional variable length encoded unsigned64 value for the hour - /// * minutes - optional variable length encoded unsigned64 value for the minutes - /// * seconds - optional variable length encoded unsigned64 value for the seconds - /// * useconds - optional variable length encoded unsigned64 value for the microseconds - /// - /// .. seealso:: protobuf encoding in https://developers.google.com/protocol-buffers/docs/encoding - /// .. note:: hour, minutes, seconds, useconds are optional if all the values to the right are 0 - /// - /// Example: 0x00 -> +00:00:00.000000 - /// - /// DATETIME - /// A date or date and time value. - /// - /// ``value`` - /// a sequence of variants, arranged as follows: - /// - /// ``| year | month | day | [ | hour | [ | minutes | [ | seconds | [ | useconds | ]]]]`` - /// - /// * year - variable length encoded unsigned64 value for the year - /// * month - variable length encoded unsigned64 value for the month - /// * day - variable length encoded unsigned64 value for the day - /// * hour - optional variable length encoded unsigned64 value for the hour - /// * minutes - optional variable length encoded unsigned64 value for the minutes - /// * seconds - optional variable length encoded unsigned64 value for the seconds - /// * useconds - optional variable length encoded unsigned64 value for the microseconds - /// - /// .. note:: hour, minutes, seconds, useconds are optional if all the values to the right are 0 - /// - /// ``.flags & 1`` (timestamp) - /// - /// ============= ======= - /// SQL Type .flags - /// ============= ======= - /// DATETIME - /// TIMESTAMP 1 - /// - /// DECIMAL - /// An arbitrary length number. The number is encoded as a single byte - /// indicating the position of the decimal point followed by the Packed BCD - /// encoded number. Packed BCD is used to simplify conversion to and - /// from strings and other native arbitrary precision math datatypes. - /// .. seealso:: packed BCD in https://en.wikipedia.org/wiki/Binary-coded_decimal - /// - /// ``.length`` - /// maximum number of displayable decimal digits (*excluding* the decimal point and sign, but including ``.fractional_digits``) - /// - /// .. note:: should be in the range of 1 - 65 - /// - /// ``.fractional_digits`` - /// is the decimal digits to display out of length - /// - /// .. note:: should be in the range of 0 - 30 - /// - /// ``value`` - /// the following bytes sequence: - /// - /// ``| scale | BCD | sign | [0x0] |`` - /// - /// * scale - 8bit scale value (number of decimal digit after the '.') - /// * BCD - BCD encoded digits (4 bits for each digit) - /// * sign - sign encoded on 4 bits (0xc = "+", 0xd = "-") - /// * 0x0 - last 4bits if length(digits) % 2 == 0 - /// - /// Example: x04 0x12 0x34 0x01 0xd0 -> -12.3401 - /// - /// SET - /// A list of strings representing a SET of values. - /// - /// ``value`` - /// A sequence of 0 or more of protobuf's bytes (length prepended octets) or one of - /// the special sequences with a predefined meaning listed below. - /// - /// Example (length of the bytes array shown in brackets): - /// * ``[0]`` - the NULL value - /// * ``[1] 0x00`` - a set containing a blank string '' - /// * ``[1] 0x01`` - this would be an invalid value, but is to be treated as the empty set - /// * ``[2] 0x01 0x00`` - a set with a single item, which is the '\0' character - /// * ``[8] 0x03 F O O 0x03 B A R`` - a set with 2 items: FOO,BAR - /// - /// :param name: name of the column - /// :param original_name: name of the column before an alias was applied - /// :param table: name of the table the column orginates from - /// :param original_table: name of the table the column orginates from before an alias was applied - /// :param schema: schema the column originates from - /// :param catalog: - /// catalog the schema originates from - /// - /// .. note:: - /// as there is current no support for catalogs in MySQL, don't expect this field to be set. - /// In the MySQL C/S protocol the field had the value ``def`` all the time. - /// - /// :param fractional_digits: displayed factional decimal digits for floating point and fixed point numbers - /// :param length: maximum count of displayable characters of .type - /// :param flags: - /// ``.type`` specific flags - /// - /// ======= ====== =========== - /// type value description - /// ======= ====== =========== - /// UINT 0x0001 zerofill - /// DOUBLE 0x0001 unsigned - /// FLOAT 0x0001 unsigned - /// DECIMAL 0x0001 unsigned - /// BYTES 0x0001 rightpad - /// ======= ====== =========== - /// - /// ====== ================ - /// value description - /// ====== ================ - /// 0x0010 NOT_NULL - /// 0x0020 PRIMARY_KEY - /// 0x0040 UNIQUE_KEY - /// 0x0080 MULTIPLE_KEY - /// 0x0100 AUTO_INCREMENT - /// ====== ================ - /// - /// default: 0 - /// :param content_type: - /// a hint about the higher-level encoding of a BYTES field - /// - /// ====== ====== =========== - /// type value description - /// ====== ====== =========== - /// BYTES 0x0001 GEOMETRY (WKB encoding) - /// BYTES 0x0002 JSON (text encoding) - /// BYTES 0x0003 XML (text encoding) - /// ====== ====== =========== - /// - /// .. note:: - /// this list isn't comprehensive. As guideline: the field's value is expected - /// to pass a validator check on client and server if this field is set. - /// If the server adds more internal datatypes that rely on BLOB storage - /// like image manipulation, seeking into complex types in BLOBs, ... more - /// types will be added. - /// - internal sealed partial class ColumnMetaData : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new ColumnMetaData()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Resultset.MysqlxResultsetReflection.Descriptor.MessageTypes[3]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public ColumnMetaData() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public ColumnMetaData(ColumnMetaData other) : this() { - type_ = other.type_; - name_ = other.name_; - originalName_ = other.originalName_; - table_ = other.table_; - originalTable_ = other.originalTable_; - schema_ = other.schema_; - catalog_ = other.catalog_; - collation_ = other.collation_; - fractionalDigits_ = other.fractionalDigits_; - length_ = other.length_; - flags_ = other.flags_; - contentType_ = other.contentType_; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public ColumnMetaData Clone() { - return new ColumnMetaData(this); - } - - /// Field number for the "type" field. - public const int TypeFieldNumber = 1; - private global::Mysqlx.Resultset.ColumnMetaData.Types.FieldType type_ = 0; - /// - /// datatype of the field in a row - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public global::Mysqlx.Resultset.ColumnMetaData.Types.FieldType Type { - get { return type_; } - set { - type_ = value; - } - } - - /// Field number for the "name" field. - public const int NameFieldNumber = 2; - private pb::ByteString name_ = pb::ByteString.Empty; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pb::ByteString Name { - get { return name_; } - set { - name_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "original_name" field. - public const int OriginalNameFieldNumber = 3; - private pb::ByteString originalName_ = pb::ByteString.Empty; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pb::ByteString OriginalName { - get { return originalName_; } - set { - originalName_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "table" field. - public const int TableFieldNumber = 4; - private pb::ByteString table_ = pb::ByteString.Empty; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pb::ByteString Table { - get { return table_; } - set { - table_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "original_table" field. - public const int OriginalTableFieldNumber = 5; - private pb::ByteString originalTable_ = pb::ByteString.Empty; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pb::ByteString OriginalTable { - get { return originalTable_; } - set { - originalTable_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "schema" field. - public const int SchemaFieldNumber = 6; - private pb::ByteString schema_ = pb::ByteString.Empty; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pb::ByteString Schema { - get { return schema_; } - set { - schema_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "catalog" field. - public const int CatalogFieldNumber = 7; - private pb::ByteString catalog_ = pb::ByteString.Empty; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pb::ByteString Catalog { - get { return catalog_; } - set { - catalog_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "collation" field. - public const int CollationFieldNumber = 8; - private ulong collation_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public ulong Collation { - get { return collation_; } - set { - collation_ = value; - } - } - - /// Field number for the "fractional_digits" field. - public const int FractionalDigitsFieldNumber = 9; - private uint fractionalDigits_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public uint FractionalDigits { - get { return fractionalDigits_; } - set { - fractionalDigits_ = value; - } - } - - /// Field number for the "length" field. - public const int LengthFieldNumber = 10; - private uint length_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public uint Length { - get { return length_; } - set { - length_ = value; - } - } - - /// Field number for the "flags" field. - public const int FlagsFieldNumber = 11; - private uint flags_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public uint Flags { - get { return flags_; } - set { - flags_ = value; - } - } - - /// Field number for the "content_type" field. - public const int ContentTypeFieldNumber = 12; - private uint contentType_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public uint ContentType { - get { return contentType_; } - set { - contentType_ = value; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as ColumnMetaData); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(ColumnMetaData other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (Type != other.Type) return false; - if (Name != other.Name) return false; - if (OriginalName != other.OriginalName) return false; - if (Table != other.Table) return false; - if (OriginalTable != other.OriginalTable) return false; - if (Schema != other.Schema) return false; - if (Catalog != other.Catalog) return false; - if (Collation != other.Collation) return false; - if (FractionalDigits != other.FractionalDigits) return false; - if (Length != other.Length) return false; - if (Flags != other.Flags) return false; - if (ContentType != other.ContentType) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (Type != 0) hash ^= Type.GetHashCode(); - if (Name.Length != 0) hash ^= Name.GetHashCode(); - if (OriginalName.Length != 0) hash ^= OriginalName.GetHashCode(); - if (Table.Length != 0) hash ^= Table.GetHashCode(); - if (OriginalTable.Length != 0) hash ^= OriginalTable.GetHashCode(); - if (Schema.Length != 0) hash ^= Schema.GetHashCode(); - if (Catalog.Length != 0) hash ^= Catalog.GetHashCode(); - if (Collation != 0UL) hash ^= Collation.GetHashCode(); - if (FractionalDigits != 0) hash ^= FractionalDigits.GetHashCode(); - if (Length != 0) hash ^= Length.GetHashCode(); - if (Flags != 0) hash ^= Flags.GetHashCode(); - if (ContentType != 0) hash ^= ContentType.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (Type != 0) { - output.WriteRawTag(8); - output.WriteEnum((int) Type); - } - if (Name.Length != 0) { - output.WriteRawTag(18); - output.WriteBytes(Name); - } - if (OriginalName.Length != 0) { - output.WriteRawTag(26); - output.WriteBytes(OriginalName); - } - if (Table.Length != 0) { - output.WriteRawTag(34); - output.WriteBytes(Table); - } - if (OriginalTable.Length != 0) { - output.WriteRawTag(42); - output.WriteBytes(OriginalTable); - } - if (Schema.Length != 0) { - output.WriteRawTag(50); - output.WriteBytes(Schema); - } - if (Catalog.Length != 0) { - output.WriteRawTag(58); - output.WriteBytes(Catalog); - } - if (Collation != 0UL) { - output.WriteRawTag(64); - output.WriteUInt64(Collation); - } - if (FractionalDigits != 0) { - output.WriteRawTag(72); - output.WriteUInt32(FractionalDigits); - } - if (Length != 0) { - output.WriteRawTag(80); - output.WriteUInt32(Length); - } - if (Flags != 0) { - output.WriteRawTag(88); - output.WriteUInt32(Flags); - } - if (ContentType != 0) { - output.WriteRawTag(96); - output.WriteUInt32(ContentType); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (Type != 0) { - size += 1 + pb::CodedOutputStream.ComputeEnumSize((int) Type); - } - if (Name.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeBytesSize(Name); - } - if (OriginalName.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeBytesSize(OriginalName); - } - if (Table.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeBytesSize(Table); - } - if (OriginalTable.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeBytesSize(OriginalTable); - } - if (Schema.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeBytesSize(Schema); - } - if (Catalog.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeBytesSize(Catalog); - } - if (Collation != 0UL) { - size += 1 + pb::CodedOutputStream.ComputeUInt64Size(Collation); - } - if (FractionalDigits != 0) { - size += 1 + pb::CodedOutputStream.ComputeUInt32Size(FractionalDigits); - } - if (Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Length); - } - if (Flags != 0) { - size += 1 + pb::CodedOutputStream.ComputeUInt32Size(Flags); - } - if (ContentType != 0) { - size += 1 + pb::CodedOutputStream.ComputeUInt32Size(ContentType); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(ColumnMetaData other) { - if (other == null) { - return; - } - if (other.Type != 0) { - Type = other.Type; - } - if (other.Name.Length != 0) { - Name = other.Name; - } - if (other.OriginalName.Length != 0) { - OriginalName = other.OriginalName; - } - if (other.Table.Length != 0) { - Table = other.Table; - } - if (other.OriginalTable.Length != 0) { - OriginalTable = other.OriginalTable; - } - if (other.Schema.Length != 0) { - Schema = other.Schema; - } - if (other.Catalog.Length != 0) { - Catalog = other.Catalog; - } - if (other.Collation != 0UL) { - Collation = other.Collation; - } - if (other.FractionalDigits != 0) { - FractionalDigits = other.FractionalDigits; - } - if (other.Length != 0) { - Length = other.Length; - } - if (other.Flags != 0) { - Flags = other.Flags; - } - if (other.ContentType != 0) { - ContentType = other.ContentType; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 8: { - type_ = (global::Mysqlx.Resultset.ColumnMetaData.Types.FieldType) input.ReadEnum(); - break; - } - case 18: { - Name = input.ReadBytes(); - break; - } - case 26: { - OriginalName = input.ReadBytes(); - break; - } - case 34: { - Table = input.ReadBytes(); - break; - } - case 42: { - OriginalTable = input.ReadBytes(); - break; - } - case 50: { - Schema = input.ReadBytes(); - break; - } - case 58: { - Catalog = input.ReadBytes(); - break; - } - case 64: { - Collation = input.ReadUInt64(); - break; - } - case 72: { - FractionalDigits = input.ReadUInt32(); - break; - } - case 80: { - Length = input.ReadUInt32(); - break; - } - case 88: { - Flags = input.ReadUInt32(); - break; - } - case 96: { - ContentType = input.ReadUInt32(); - break; - } - } - } - } - - #region Nested types - /// Container for nested types declared in the ColumnMetaData message type. - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - internal static partial class Types { - internal enum FieldType { - [pbr::OriginalName("NONE")] None = 0, - [pbr::OriginalName("SINT")] Sint = 1, - [pbr::OriginalName("UINT")] Uint = 2, - [pbr::OriginalName("DOUBLE")] Double = 5, - [pbr::OriginalName("FLOAT")] Float = 6, - [pbr::OriginalName("BYTES")] Bytes = 7, - [pbr::OriginalName("TIME")] Time = 10, - [pbr::OriginalName("DATETIME")] Datetime = 12, - [pbr::OriginalName("SET")] Set = 15, - [pbr::OriginalName("ENUM")] Enum = 16, - [pbr::OriginalName("BIT")] Bit = 17, - [pbr::OriginalName("DECIMAL")] Decimal = 18, - } - - } - #endregion - - } - - /// - /// Row in a Resultset - /// - /// a row is represented as a list of fields encoded as byte blobs. - /// Blob of size 0 represents the NULL value. Otherwise, if it contains at least - /// one byte, it encodes a non-null value of the field using encoding appropriate for the - /// type of the value given by ``ColumnMetadata``, as specified - /// in the :protobuf:msg:`Mysqlx.Resultset::ColumnMetaData` description. - /// - internal sealed partial class Row : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Row()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Resultset.MysqlxResultsetReflection.Descriptor.MessageTypes[4]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Row() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Row(Row other) : this() { - field_ = other.field_.Clone(); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Row Clone() { - return new Row(this); - } - - /// Field number for the "field" field. - public const int FieldFieldNumber = 1; - private static readonly pb::FieldCodec _repeated_field_codec - = pb::FieldCodec.ForBytes(10); - private readonly pbc::RepeatedField field_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField Field { - get { return field_; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Row); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Row other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if(!field_.Equals(other.field_)) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - hash ^= field_.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - field_.WriteTo(output, _repeated_field_codec); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - size += field_.CalculateSize(_repeated_field_codec); - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Row other) { - if (other == null) { - return; - } - field_.Add(other.field_); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - field_.AddEntriesFrom(input, _repeated_field_codec); - break; - } - } - } - } - - } - - #endregion - -} - -#endregion Designer generated code diff --git a/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxSession.cs b/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxSession.cs deleted file mode 100644 index 8945ad02a..000000000 --- a/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxSession.cs +++ /dev/null @@ -1,671 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: mysqlx_session.proto -#pragma warning disable 1591, 0612, 3021 -#region Designer generated code - -using pb = global::Google.Protobuf; -using pbc = global::Google.Protobuf.Collections; -using pbr = global::Google.Protobuf.Reflection; -using scg = global::System.Collections.Generic; -namespace Mysqlx.Session { - - /// Holder for reflection information generated from mysqlx_session.proto - internal static partial class MysqlxSessionReflection { - - #region Descriptor - /// File descriptor for mysqlx_session.proto - public static pbr::FileDescriptor Descriptor { - get { return descriptor; } - } - private static pbr::FileDescriptor descriptor; - - static MysqlxSessionReflection() { - byte[] descriptorData = global::System.Convert.FromBase64String( - string.Concat( - "ChRteXNxbHhfc2Vzc2lvbi5wcm90bxIOTXlzcWx4LlNlc3Npb24iUwoRQXV0", - "aGVudGljYXRlU3RhcnQSEQoJbWVjaF9uYW1lGAEgASgJEhEKCWF1dGhfZGF0", - "YRgCIAEoDBIYChBpbml0aWFsX3Jlc3BvbnNlGAMgASgMIikKFEF1dGhlbnRp", - "Y2F0ZUNvbnRpbnVlEhEKCWF1dGhfZGF0YRgBIAEoDCIjCg5BdXRoZW50aWNh", - "dGVPaxIRCglhdXRoX2RhdGEYASABKAwiBwoFUmVzZXQiBwoFQ2xvc2VCHgoc", - "Y29tLm15c3FsLmNqLm15c3FseC5wcm90b2J1ZmIGcHJvdG8z")); - descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, - new pbr::FileDescriptor[] { }, - new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Session.AuthenticateStart), global::Mysqlx.Session.AuthenticateStart.Parser, new[]{ "MechName", "AuthData", "InitialResponse" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Session.AuthenticateContinue), global::Mysqlx.Session.AuthenticateContinue.Parser, new[]{ "AuthData" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Session.AuthenticateOk), global::Mysqlx.Session.AuthenticateOk.Parser, new[]{ "AuthData" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Session.Reset), global::Mysqlx.Session.Reset.Parser, null, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Session.Close), global::Mysqlx.Session.Close.Parser, null, null, null, null) - })); - } - #endregion - - } - #region Messages - /// - /// the initial message send from the client to the server to start the - /// authentication proccess - /// - /// :param mech_name: authentication mechanism name - /// :param auth_data: authentication data - /// :param initial_response: initial response - /// :Returns: :protobuf:msg:`Mysqlx.Session::AuthenticateContinue` - /// - internal sealed partial class AuthenticateStart : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new AuthenticateStart()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Session.MysqlxSessionReflection.Descriptor.MessageTypes[0]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public AuthenticateStart() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public AuthenticateStart(AuthenticateStart other) : this() { - mechName_ = other.mechName_; - authData_ = other.authData_; - initialResponse_ = other.initialResponse_; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public AuthenticateStart Clone() { - return new AuthenticateStart(this); - } - - /// Field number for the "mech_name" field. - public const int MechNameFieldNumber = 1; - private string mechName_ = ""; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string MechName { - get { return mechName_; } - set { - mechName_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "auth_data" field. - public const int AuthDataFieldNumber = 2; - private pb::ByteString authData_ = pb::ByteString.Empty; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pb::ByteString AuthData { - get { return authData_; } - set { - authData_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "initial_response" field. - public const int InitialResponseFieldNumber = 3; - private pb::ByteString initialResponse_ = pb::ByteString.Empty; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pb::ByteString InitialResponse { - get { return initialResponse_; } - set { - initialResponse_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as AuthenticateStart); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(AuthenticateStart other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (MechName != other.MechName) return false; - if (AuthData != other.AuthData) return false; - if (InitialResponse != other.InitialResponse) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (MechName.Length != 0) hash ^= MechName.GetHashCode(); - if (AuthData.Length != 0) hash ^= AuthData.GetHashCode(); - if (InitialResponse.Length != 0) hash ^= InitialResponse.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (MechName.Length != 0) { - output.WriteRawTag(10); - output.WriteString(MechName); - } - if (AuthData.Length != 0) { - output.WriteRawTag(18); - output.WriteBytes(AuthData); - } - if (InitialResponse.Length != 0) { - output.WriteRawTag(26); - output.WriteBytes(InitialResponse); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (MechName.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(MechName); - } - if (AuthData.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeBytesSize(AuthData); - } - if (InitialResponse.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeBytesSize(InitialResponse); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(AuthenticateStart other) { - if (other == null) { - return; - } - if (other.MechName.Length != 0) { - MechName = other.MechName; - } - if (other.AuthData.Length != 0) { - AuthData = other.AuthData; - } - if (other.InitialResponse.Length != 0) { - InitialResponse = other.InitialResponse; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - MechName = input.ReadString(); - break; - } - case 18: { - AuthData = input.ReadBytes(); - break; - } - case 26: { - InitialResponse = input.ReadBytes(); - break; - } - } - } - } - - } - - /// - /// send by client or server after a :protobuf:msg:`Mysqlx.Session::AuthenticateStart` to - /// exchange more auth data - /// - /// :param auth_data: authentication data - /// :Returns: :protobuf:msg:`Mysqlx.Session::AuthenticateContinue` - /// - internal sealed partial class AuthenticateContinue : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new AuthenticateContinue()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Session.MysqlxSessionReflection.Descriptor.MessageTypes[1]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public AuthenticateContinue() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public AuthenticateContinue(AuthenticateContinue other) : this() { - authData_ = other.authData_; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public AuthenticateContinue Clone() { - return new AuthenticateContinue(this); - } - - /// Field number for the "auth_data" field. - public const int AuthDataFieldNumber = 1; - private pb::ByteString authData_ = pb::ByteString.Empty; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pb::ByteString AuthData { - get { return authData_; } - set { - authData_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as AuthenticateContinue); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(AuthenticateContinue other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (AuthData != other.AuthData) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (AuthData.Length != 0) hash ^= AuthData.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (AuthData.Length != 0) { - output.WriteRawTag(10); - output.WriteBytes(AuthData); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (AuthData.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeBytesSize(AuthData); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(AuthenticateContinue other) { - if (other == null) { - return; - } - if (other.AuthData.Length != 0) { - AuthData = other.AuthData; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - AuthData = input.ReadBytes(); - break; - } - } - } - } - - } - - /// - /// sent by the server after successful authentication - /// - /// :param auth_data: authentication data - /// - internal sealed partial class AuthenticateOk : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new AuthenticateOk()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Session.MysqlxSessionReflection.Descriptor.MessageTypes[2]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public AuthenticateOk() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public AuthenticateOk(AuthenticateOk other) : this() { - authData_ = other.authData_; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public AuthenticateOk Clone() { - return new AuthenticateOk(this); - } - - /// Field number for the "auth_data" field. - public const int AuthDataFieldNumber = 1; - private pb::ByteString authData_ = pb::ByteString.Empty; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pb::ByteString AuthData { - get { return authData_; } - set { - authData_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as AuthenticateOk); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(AuthenticateOk other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (AuthData != other.AuthData) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (AuthData.Length != 0) hash ^= AuthData.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (AuthData.Length != 0) { - output.WriteRawTag(10); - output.WriteBytes(AuthData); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (AuthData.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeBytesSize(AuthData); - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(AuthenticateOk other) { - if (other == null) { - return; - } - if (other.AuthData.Length != 0) { - AuthData = other.AuthData; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - AuthData = input.ReadBytes(); - break; - } - } - } - } - - } - - /// - /// reset the current session - /// - /// :Returns: :protobuf:msg:`Mysqlx::Ok` - /// - internal sealed partial class Reset : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Reset()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Session.MysqlxSessionReflection.Descriptor.MessageTypes[3]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Reset() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Reset(Reset other) : this() { - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Reset Clone() { - return new Reset(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Reset); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Reset other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Reset other) { - if (other == null) { - return; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - } - } - } - - } - - /// - /// close the current session - /// - /// :Returns: :protobuf:msg:`Mysqlx::Ok` - /// - internal sealed partial class Close : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new Close()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Session.MysqlxSessionReflection.Descriptor.MessageTypes[4]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Close() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Close(Close other) : this() { - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public Close Clone() { - return new Close(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as Close); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(Close other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(Close other) { - if (other == null) { - return; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - } - } - } - - } - - #endregion - -} - -#endregion Designer generated code diff --git a/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxSql.cs b/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxSql.cs deleted file mode 100644 index 60e6039fa..000000000 --- a/Source/MySql.Data/X/Protocol/X/Protobuf/MysqlxSql.cs +++ /dev/null @@ -1,353 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: mysqlx_sql.proto -#pragma warning disable 1591, 0612, 3021 -#region Designer generated code - -using pb = global::Google.Protobuf; -using pbc = global::Google.Protobuf.Collections; -using pbr = global::Google.Protobuf.Reflection; -using scg = global::System.Collections.Generic; -namespace Mysqlx.Sql { - - /// Holder for reflection information generated from mysqlx_sql.proto - internal static partial class MysqlxSqlReflection { - - #region Descriptor - /// File descriptor for mysqlx_sql.proto - public static pbr::FileDescriptor Descriptor { - get { return descriptor; } - } - private static pbr::FileDescriptor descriptor; - - static MysqlxSqlReflection() { - byte[] descriptorData = global::System.Convert.FromBase64String( - string.Concat( - "ChBteXNxbHhfc3FsLnByb3RvEgpNeXNxbHguU3FsGhZteXNxbHhfZGF0YXR5", - "cGVzLnByb3RvIm0KC1N0bXRFeGVjdXRlEhEKCW5hbWVzcGFjZRgDIAEoCRIM", - "CgRzdG10GAEgASgMEiMKBGFyZ3MYAiADKAsyFS5NeXNxbHguRGF0YXR5cGVz", - "LkFueRIYChBjb21wYWN0X21ldGFkYXRhGAQgASgIIg8KDVN0bXRFeGVjdXRl", - "T2tCHgocY29tLm15c3FsLmNqLm15c3FseC5wcm90b2J1ZmIGcHJvdG8z")); - descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, - new pbr::FileDescriptor[] { global::Mysqlx.Datatypes.MysqlxDatatypesReflection.Descriptor, }, - new pbr::GeneratedClrTypeInfo(null, new pbr::GeneratedClrTypeInfo[] { - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Sql.StmtExecute), global::Mysqlx.Sql.StmtExecute.Parser, new[]{ "Namespace", "Stmt", "Args", "CompactMetadata" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::Mysqlx.Sql.StmtExecuteOk), global::Mysqlx.Sql.StmtExecuteOk.Parser, null, null, null, null) - })); - } - #endregion - - } - #region Messages - /// - /// execute a statement in the given namespace - /// - /// .. uml:: - /// - /// client -> server: StmtExecute - /// ... zero or more Resultsets ... - /// server --> client: StmtExecuteOk - /// - /// Notices: - /// This message may generate a notice containing WARNINGs generated by its execution. - /// This message may generate a notice containing INFO messages generated by its execution. - /// - /// :param namespace: namespace of the statement to be executed - /// :param stmt: statement that shall be executed. - /// :param args: values for wildcard replacements - /// :param compact_metadata: send only type information for :protobuf:msg:`Mysqlx.Resultset::ColumnMetadata`, skipping names and others - /// :returns: - /// * zero or one :protobuf:msg:`Mysqlx.Resultset::` followed by :protobuf:msg:`Mysqlx.Sql::StmtExecuteOk` - /// - internal sealed partial class StmtExecute : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new StmtExecute()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Sql.MysqlxSqlReflection.Descriptor.MessageTypes[0]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public StmtExecute() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public StmtExecute(StmtExecute other) : this() { - namespace_ = other.namespace_; - stmt_ = other.stmt_; - args_ = other.args_.Clone(); - compactMetadata_ = other.compactMetadata_; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public StmtExecute Clone() { - return new StmtExecute(this); - } - - /// Field number for the "namespace" field. - public const int NamespaceFieldNumber = 3; - private string namespace_ = ""; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public string Namespace { - get { return namespace_; } - set { - namespace_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "stmt" field. - public const int StmtFieldNumber = 1; - private pb::ByteString stmt_ = pb::ByteString.Empty; - /// - /// required - /// - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pb::ByteString Stmt { - get { return stmt_; } - set { - stmt_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); - } - } - - /// Field number for the "args" field. - public const int ArgsFieldNumber = 2; - private static readonly pb::FieldCodec _repeated_args_codec - = pb::FieldCodec.ForMessage(18, global::Mysqlx.Datatypes.Any.Parser); - private readonly pbc::RepeatedField args_ = new pbc::RepeatedField(); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public pbc::RepeatedField Args { - get { return args_; } - } - - /// Field number for the "compact_metadata" field. - public const int CompactMetadataFieldNumber = 4; - private bool compactMetadata_; - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool CompactMetadata { - get { return compactMetadata_; } - set { - compactMetadata_ = value; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as StmtExecute); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(StmtExecute other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - if (Namespace != other.Namespace) return false; - if (Stmt != other.Stmt) return false; - if(!args_.Equals(other.args_)) return false; - if (CompactMetadata != other.CompactMetadata) return false; - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - if (Namespace.Length != 0) hash ^= Namespace.GetHashCode(); - if (Stmt.Length != 0) hash ^= Stmt.GetHashCode(); - hash ^= args_.GetHashCode(); - if (CompactMetadata != false) hash ^= CompactMetadata.GetHashCode(); - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - if (Stmt.Length != 0) { - output.WriteRawTag(10); - output.WriteBytes(Stmt); - } - args_.WriteTo(output, _repeated_args_codec); - if (Namespace.Length != 0) { - output.WriteRawTag(26); - output.WriteString(Namespace); - } - if (CompactMetadata != false) { - output.WriteRawTag(32); - output.WriteBool(CompactMetadata); - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - if (Namespace.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeStringSize(Namespace); - } - if (Stmt.Length != 0) { - size += 1 + pb::CodedOutputStream.ComputeBytesSize(Stmt); - } - size += args_.CalculateSize(_repeated_args_codec); - if (CompactMetadata != false) { - size += 1 + 1; - } - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(StmtExecute other) { - if (other == null) { - return; - } - if (other.Namespace.Length != 0) { - Namespace = other.Namespace; - } - if (other.Stmt.Length != 0) { - Stmt = other.Stmt; - } - args_.Add(other.args_); - if (other.CompactMetadata != false) { - CompactMetadata = other.CompactMetadata; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - case 10: { - Stmt = input.ReadBytes(); - break; - } - case 18: { - args_.AddEntriesFrom(input, _repeated_args_codec); - break; - } - case 26: { - Namespace = input.ReadString(); - break; - } - case 32: { - CompactMetadata = input.ReadBool(); - break; - } - } - } - } - - } - - /// - /// statement executed successful - /// - internal sealed partial class StmtExecuteOk : pb::IMessage { - private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new StmtExecuteOk()); - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pb::MessageParser Parser { get { return _parser; } } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public static pbr::MessageDescriptor Descriptor { - get { return global::Mysqlx.Sql.MysqlxSqlReflection.Descriptor.MessageTypes[1]; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - pbr::MessageDescriptor pb::IMessage.Descriptor { - get { return Descriptor; } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public StmtExecuteOk() { - OnConstruction(); - } - - partial void OnConstruction(); - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public StmtExecuteOk(StmtExecuteOk other) : this() { - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public StmtExecuteOk Clone() { - return new StmtExecuteOk(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override bool Equals(object other) { - return Equals(other as StmtExecuteOk); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public bool Equals(StmtExecuteOk other) { - if (ReferenceEquals(other, null)) { - return false; - } - if (ReferenceEquals(other, this)) { - return true; - } - return true; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override int GetHashCode() { - int hash = 1; - return hash; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public override string ToString() { - return pb::JsonFormatter.ToDiagnosticString(this); - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void WriteTo(pb::CodedOutputStream output) { - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public int CalculateSize() { - int size = 0; - return size; - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(StmtExecuteOk other) { - if (other == null) { - return; - } - } - - [global::System.Diagnostics.DebuggerNonUserCodeAttribute] - public void MergeFrom(pb::CodedInputStream input) { - uint tag; - while ((tag = input.ReadTag()) != 0) { - switch(tag) { - default: - input.SkipLastField(); - break; - } - } - } - - } - - #endregion - -} - -#endregion Designer generated code diff --git a/Source/MySql.Data/X/Protocol/X/SetDecoder.cs b/Source/MySql.Data/X/Protocol/X/SetDecoder.cs deleted file mode 100644 index 99e5f8770..000000000 --- a/Source/MySql.Data/X/Protocol/X/SetDecoder.cs +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Text; -using MySqlX.Data; -using System; -using MySqlX.XDevAPI; - -using MySql.Data; -using MySql.Data.MySqlClient; -using MySql.Data.Common; -using MySqlX; -using MySql.Data.MySqlClient.X.XDevAPI.Common; - -namespace MySqlX.Protocol.X -{ - internal class SetDecoder : ValueDecoder - { - private Encoding _encoding; - - public override void SetMetadata() - { - Column.Type = ColumnType.Set; - Column.ClrType = typeof(string); - ClrValueDecoder = DecodeValue; - - string charset = Column.CollationName.Split('_')[0]; - _encoding = CharSetMap.GetEncoding(new DBVersion(), charset); - } - - private object DecodeValue(byte[] bytes) - { - if (bytes == null || bytes.Length == 0) return null; - if (bytes.Length == 1 && bytes[0] == 0) return String.Empty; - if (bytes.Length == 1 && bytes[0] == 1) return String.Empty; - - StringBuilder sb = new StringBuilder(); - string delim = ""; - int len = bytes.Length; - int index = 0; - while (index < len-1) - { - sb.Append(delim); - int strLen = bytes[index++]; - if ((index + strLen) > bytes.Length) - throw new MySqlException(ResourcesX.UnexpectedEndOfPacketFound); - sb.Append(_encoding.GetString(bytes, index, strLen)); - index += strLen; - delim = ","; - } - return sb.ToString(); - } - } -} diff --git a/Source/MySql.Data/X/Protocol/X/XDateTimeDecoder.cs b/Source/MySql.Data/X/Protocol/X/XDateTimeDecoder.cs deleted file mode 100644 index ccf2f29c4..000000000 --- a/Source/MySql.Data/X/Protocol/X/XDateTimeDecoder.cs +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using Google.Protobuf; -using MySql.Data.MySqlClient; -using MySql.Data.MySqlClient.X.XDevAPI.Common; -using MySqlX.Data; -using MySqlX.XDevAPI; -using System; - -namespace MySqlX.Protocol.X -{ - internal class XDateTimeDecoder : ValueDecoder - { - public override void SetMetadata() - { - Column.Type = GetDbType(); - Column.ClrType = typeof(DateTime); - ClrValueDecoder = ValueDecoder; - } - - private ColumnType GetDbType() - { - if ((Flags & 1) != 0) - return ColumnType.Timestamp; - if (Column.Length == 10) - return ColumnType.Date; - return ColumnType.DateTime; - } - - public object ValueDecoder(byte[] bytes) - { - CodedInputStream input = new CodedInputStream(bytes); - UInt64 year = 0, month = 0, day = 0; - Int64 hour = 0, min = 0, sec = 0, usec = 0; - - year = input.ReadUInt64(); - month = input.ReadUInt64(); - day = input.ReadUInt64(); - if (!input.IsAtEnd) - hour = input.ReadInt64(); - if (!input.IsAtEnd) - min = input.ReadInt64(); - if (!input.IsAtEnd) - sec = input.ReadInt64(); - if (!input.IsAtEnd) - usec = input.ReadInt64(); - return new DateTime((int)year, (int)month, (int)day, (int)hour, (int)min, (int)sec).AddTicks(usec * 10); - } - } -} diff --git a/Source/MySql.Data/X/Protocol/X/XProtocol.cs b/Source/MySql.Data/X/Protocol/X/XProtocol.cs deleted file mode 100644 index 8a0fd2bb2..000000000 --- a/Source/MySql.Data/X/Protocol/X/XProtocol.cs +++ /dev/null @@ -1,583 +0,0 @@ -// Copyright © 2015, 2017 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Diagnostics; - -using MySqlX.Communication; -using MySqlX.Data; -using Mysqlx.Resultset; -using Mysqlx.Session; -using Mysqlx.Sql; -using MySqlX.Protocol.X; -using Mysqlx.Expr; -using Mysqlx.Datatypes; -using Mysqlx; -using Mysqlx.Crud; -using Mysqlx.Notice; -using Mysqlx.Connection; -using MySqlX.XDevAPI.Common; -using MySqlX.XDevAPI.Relational; -using MySqlX.XDevAPI.CRUD; -using MySql.Data.MySqlClient; -using MySql.Data; -using MySqlX; -using System.IO; -using Google.Protobuf; - -namespace MySqlX.Protocol -{ - internal class XProtocol : ProtocolBase - { - private CommunicationPacket pendingPacket; - private XPacketReaderWriter _reader; - private XPacketReaderWriter _writer; - - public Capabilities Capabilities { get; protected set; } - - public XProtocol(XPacketReaderWriter reader, XPacketReaderWriter writer) - { - _reader = reader; - _writer = writer; - } - - #region Authentication - - public void SendAuthStart(string method) - { - AuthenticateStart authStart = new AuthenticateStart(); - authStart.MechName = method; - _writer.Write(ClientMessageId.SESS_AUTHENTICATE_START, authStart); - } - - public byte[] ReadAuthContinue() - { - CommunicationPacket p = ReadPacket(); - if (p.MessageType != (int)ServerMessageId.SESS_AUTHENTICATE_CONTINUE) - throw new MySqlException("Unexpected message encountered during authentication handshake"); - AuthenticateContinue response = AuthenticateContinue.Parser.ParseFrom(p.Buffer); - if (!response.AuthData.IsEmpty) - return response.AuthData.ToByteArray(); - return null; - } - - public void SendAuthContinue(byte[] data) - { - Debug.Assert(data != null); - AuthenticateContinue authCont = new AuthenticateContinue(); - authCont.AuthData = (ByteString.CopyFrom(data)); - _writer.Write(ClientMessageId.SESS_AUTHENTICATE_CONTINUE, authCont); - } - - public void ReadAuthOk() - { - CommunicationPacket p = ReadPacket(); - switch ((ServerMessageId)p.MessageType) - { - case ServerMessageId.SESS_AUTHENTICATE_OK: - break; - - case ServerMessageId.ERROR: - var error = Error.Parser.ParseFrom(p.Buffer); - throw new MySqlException("Unable to connect: " + error.Msg); - - case ServerMessageId.NOTICE: - ///TODO: fix this - //ProcessNotice(p, new Result(null)); - ReadAuthOk(); - break; - - default: - throw new MySqlException("Unexpected message encountered during authentication handshake"); - } - } - - #endregion - - public void GetServerCapabilities() - { - _writer.Write(ClientMessageId.CON_CAPABILITIES_GET, new CapabilitiesGet()); - CommunicationPacket packet = ReadPacket(); - if (packet.MessageType != (int)ServerMessageId.CONN_CAPABILITIES) - ThrowUnexpectedMessage(packet.MessageType, (int)ServerMessageId.CONN_CAPABILITIES); - Capabilities = Capabilities.Parser.ParseFrom(packet.Buffer); - } - - public void SetCapabilities(Dictionary clientCapabilities) - { - if (clientCapabilities == null || clientCapabilities.Count == 0) - return; - - var builder = new CapabilitiesSet(); - var capabilities = new Capabilities(); - foreach(var cap in clientCapabilities) - { - var capabilityMsg = new Capability() { Name = (cap.Key), Value = ExprUtil.BuildAny(cap.Value) }; - capabilities.Capabilities_.Add(capabilityMsg); - } - builder.Capabilities = capabilities; - _writer.Write(ClientMessageId.CON_CAPABILITIES_SET, builder); - ReadOk(); - } - - private void ThrowUnexpectedMessage(int received, int expected) - { - throw new MySqlException( - String.Format("Expected message id: {0}. Received message id: {1}", expected, received)); - } - - public override void SendSQL(string sql, params object[] args) - { - SendExecuteStatement("sql", sql, args); - } - - public override bool HasData(BaseResult rs) - { - while (true) - { - CommunicationPacket packet = PeekPacket(); - switch (packet.MessageType) - { - case (int)ServerMessageId.RESULTSET_COLUMN_META_DATA: - return true; - case (int)ServerMessageId.NOTICE: - ProcessNotice(packet, rs); - packet = ReadPacket(); - break; - case (int)ServerMessageId.ERROR: - packet = ReadPacket(); - DecodeAndThrowError(packet); - break; - default: - return false; - } - } - } - - private CommunicationPacket PeekPacket() - { - if (pendingPacket != null) return pendingPacket; - pendingPacket = _reader.Read(); - return pendingPacket; - } - - private CommunicationPacket ReadPacket() - { - while (true) - { - CommunicationPacket p = pendingPacket != null ? pendingPacket : _reader.Read(); - pendingPacket = null; - return p; - } - } - - private void ProcessGlobalNotice(Mysqlx.Notice.Frame frame) - { - } - - private void ProcessNotice(CommunicationPacket packet, BaseResult rs) - { - Frame frame = Frame.Parser.ParseFrom(packet.Buffer); - if (frame.Scope == Frame.Types.Scope.Global) - { - ProcessGlobalNotice(frame); - return; - } - - // if we get here the notice is local - switch ((NoticeType)frame.Type) - { - case NoticeType.Warning: - ProcessWarning(rs, frame.Payload.ToByteArray()); - break; - case NoticeType.SessionStateChanged: - ProcessSessionStateChanged(rs, frame.Payload.ToByteArray()); - break; - case NoticeType.SessionVariableChanged: - break; - } - } - - private void ProcessSessionStateChanged(BaseResult rs, byte[] payload) - { - SessionStateChanged state = SessionStateChanged.Parser.ParseFrom(payload); - switch (state.Param) - { - case SessionStateChanged.Types.Parameter.RowsAffected: - rs._recordsAffected = state.Value.VUnsignedInt; - break; - case SessionStateChanged.Types.Parameter.GeneratedInsertId: - rs._autoIncrementValue = state.Value.VUnsignedInt; - break; - case SessionStateChanged.Types.Parameter.ProducedMessage: - rs.AddWarning(new WarningInfo(0, state.Value.VString.Value.ToStringUtf8())); - break; - // handle the other ones -// default: SessionStateChanged(state); - } - } - - private void ProcessWarning(BaseResult rs, byte[] payload) - { - Warning w = Warning.Parser.ParseFrom(payload); - WarningInfo warning = new WarningInfo(w.Code, w.Msg); - if (w.Level != Warning.Types.Level.None) - warning.Level = (uint)w.Level; - rs.AddWarning(warning); - } - - private Any CreateAny(object o) - { - if (o is string) return ExprUtil.BuildAny((string)o); - if (o is bool) return ExprUtil.BuildAny((bool)o); - return ExprUtil.BuildAny(o); - } - - public void SendSessionClose() - { - _writer.Write(ClientMessageId.SESS_CLOSE, new Mysqlx.Session.Close()); - } - - public void SendConnectionClose() - { - Mysqlx.Connection.Close connClose = new Mysqlx.Connection.Close(); - _writer.Write(ClientMessageId.CON_CLOSE, connClose); - } - - public void SendExecuteStatement(string ns, string stmt, params object[] args) - { - StmtExecute stmtExecute = new StmtExecute(); - stmtExecute.Namespace = ns; - stmtExecute.Stmt = ByteString.CopyFromUtf8(stmt); - stmtExecute.CompactMetadata = false; - if (args != null) - { - foreach (object arg in args) - stmtExecute.Args.Add(CreateAny(arg)); - } - - _writer.Write(ClientMessageId.SQL_STMT_EXECUTE, stmtExecute); - } - - - private void DecodeAndThrowError(CommunicationPacket p) - { - Error e = Error.Parser.ParseFrom(p.Buffer); - throw new MySqlException(e.Code, e.SqlState, e.Msg); - } - - public override List ReadRow(BaseResult rs) - { - CommunicationPacket packet = PeekPacket(); - if (packet.MessageType != (int)ServerMessageId.RESULTSET_ROW) - { - if (rs != null) - CloseResult(rs); - return null; - } - - Mysqlx.Resultset.Row protoRow = Mysqlx.Resultset.Row.Parser.ParseFrom(ReadPacket().Buffer); - List values = new List(protoRow.Field.Count); - for (int i = 0; i < protoRow.Field.Count; i++) - values.Add(protoRow.Field[i].ToByteArray()); - return values; - } - - public override void CloseResult(BaseResult rs) - { - rs._hasData = false; - while (true) - { - CommunicationPacket p = PeekPacket(); - if (p.MessageType == (int)ServerMessageId.RESULTSET_FETCH_DONE_MORE_RESULTSETS) - { - rs._hasMoreResults = true; - ReadPacket(); - break; - } - if (p.MessageType == (int)ServerMessageId.OK) - { - ReadOk(); - break; - } - if (p.MessageType == (int)ServerMessageId.RESULTSET_FETCH_DONE) - ReadPacket(); - else if (p.MessageType == (int)ServerMessageId.NOTICE) - ProcessNotice(ReadPacket(), rs); - else if (p.MessageType == (int)ServerMessageId.ERROR) - DecodeAndThrowError(ReadPacket()); - else if (p.MessageType == (int)ServerMessageId.SQL_STMT_EXECUTE_OK) - { - ReadPacket(); - break; - } - else - throw new MySqlException(ResourcesX.ThrowingAwayResults); - } - } - - public override List LoadColumnMetadata() - { - List columns = new List(); - // we assume our caller has already validated that metadata is there - while (true) - { - if (PeekPacket().MessageType != (int)ServerMessageId.RESULTSET_COLUMN_META_DATA) return columns; - CommunicationPacket p = ReadPacket(); - ColumnMetaData response = ColumnMetaData.Parser.ParseFrom(p.Buffer); - columns.Add(DecodeColumn(response)); - } - } - - private XDevAPI.Relational.Column DecodeColumn(ColumnMetaData colData) - { - XDevAPI.Relational.Column c = new XDevAPI.Relational.Column(); - c._decoder = XValueDecoderFactory.GetValueDecoder(c, colData.Type); - c._decoder.Column = c; - - if (!colData.Name.IsEmpty) - c.ColumnLabel = colData.Name.ToStringUtf8(); - if (!colData.OriginalName.IsEmpty) - c.ColumnName = colData.OriginalName.ToStringUtf8(); - if (!colData.Table.IsEmpty) - c.TableLabel = colData.Table.ToStringUtf8(); - if (!colData.OriginalTable.IsEmpty) - c.TableName = colData.OriginalTable.ToStringUtf8(); - if (!colData.Schema.IsEmpty) - c.SchemaName = colData.Schema.ToStringUtf8(); - if (!colData.Catalog.IsEmpty) - c.DatabaseName = colData.Catalog.ToStringUtf8(); - if (colData.Collation > 0) - { - c._collationNumber = colData.Collation; - c.CollationName = CollationMap.GetCollationName((int)colData.Collation); - c.CharacterSetName = c.CollationName.Split('_')[0]; - } - if (colData.Length > 0) - c.Length = colData.Length; - if (colData.FractionalDigits > 0) - c.FractionalDigits = colData.FractionalDigits; - if (colData.Flags > 0) - c._decoder.Flags = colData.Flags; - if (colData.ContentType > 0) - c._decoder.ContentType = colData.ContentType; - c._decoder.SetMetadata(); - return c; - } - - public void SendInsert(string schema, bool isRelational, string collection, object[] rows, string[] columns) - { - Insert msg = new Mysqlx.Crud.Insert(); - msg.Collection = ExprUtil.BuildCollection(schema, collection); - msg.DataModel = (isRelational ? DataModel.Table : DataModel.Document); - if(columns != null && columns.Length > 0) - { - foreach(string column in columns) - { - msg.Projection.Add(new ExprParser(column).ParseTableInsertField()); - } - } - foreach (object row in rows) - { - Mysqlx.Crud.Insert.Types.TypedRow typedRow = new Mysqlx.Crud.Insert.Types.TypedRow(); - object[] fields = row.GetType().IsArray ? (object[])row : new object[] { row }; - foreach (object field in fields) - { - typedRow.Field.Add(ExprUtil.ArgObjectToExpr(field, isRelational)); - } - - msg.Row.Add(typedRow); - } - _writer.Write(ClientMessageId.CRUD_INSERT, msg); - } - - private void ApplyFilter(Action setLimit, Action setCriteria, Action> setOrder, FilterParams filter, Action> addParams) - { - if (filter.HasLimit) - { - var limit = new Limit(); - limit.RowCount = (ulong)filter.Limit; - if (filter.Offset != -1) limit.Offset = (ulong)filter.Offset; - setLimit(limit); - } - if (!string.IsNullOrEmpty(filter.Condition)) - { - setCriteria(filter.GetConditionExpression(filter.IsRelational)); - if (filter.Parameters != null && filter.Parameters.Count > 0) - addParams(filter.GetArgsExpression(filter.Parameters)); - } - if (filter.OrderBy != null && filter.OrderBy.Length > 0) - setOrder(filter.GetOrderByExpressions(filter.IsRelational)); - - } - - /// - /// Sends the delete documents message - /// - public void SendDelete(string schema, string collection, bool isRelational, FilterParams filter) - { - var msg = new Delete(); - msg.DataModel = (isRelational ? DataModel.Table : DataModel.Document); - msg.Collection = ExprUtil.BuildCollection(schema, collection); - ApplyFilter(v => msg.Limit = v, v => msg.Criteria = v, msg.Order.Add, filter, msg.Args.Add); - _writer.Write(ClientMessageId.CRUD_DELETE, msg); - } - - /// - /// Sends the CRUD modify message - /// - public void SendUpdate(string schema, string collection, bool isRelational, FilterParams filter, List updates) - { - var msg = new Update(); - msg.DataModel = (isRelational ? DataModel.Table : DataModel.Document); - msg.Collection = ExprUtil.BuildCollection(schema, collection); - ApplyFilter(v => msg.Limit = v, v => msg.Criteria = v, msg.Order.Add, filter, msg.Args.Add); - - foreach (var update in updates) - { - var updateBuilder = new UpdateOperation(); - updateBuilder.Operation = update.Type; - updateBuilder.Source = update.GetSource(isRelational); - if (update.HasValue) - updateBuilder.Value = update.GetValue(); - msg.Operation.Add(updateBuilder); - } - _writer.Write(ClientMessageId.CRUD_UPDATE, msg); - } - - internal Find CreateFindMessage(string schema, string collection, bool isRelational, FilterParams filter, FindParams findParams) - { - var builder = new Find(); - builder.Collection = ExprUtil.BuildCollection(schema, collection); - builder.DataModel = (isRelational ? DataModel.Table : DataModel.Document); - if (findParams != null && findParams.Projection != null && findParams.Projection.Length > 0) - builder.Projection.Add(new ExprParser(ExprUtil.JoinString(findParams.Projection)).ParseTableSelectProjection()); - ApplyFilter(v => builder.Limit = v, v => builder.Criteria = v, builder.Order.Add, filter, builder.Args.Add); - return builder; - } - - public void SendFind(string schema, string collection, bool isRelational, FilterParams filter, FindParams findParams) - { - var builder = CreateFindMessage(schema, collection, isRelational, filter, findParams); - _writer.Write(ClientMessageId.CRUD_FIND, builder); - } - - internal void ReadOkClose() - { - try - { - string response = ReadOk(); - if (response.IndexOf("bye", 0, StringComparison.OrdinalIgnoreCase) < 0) - throw new ArgumentException(); - } - catch (IOException) - { - // TODO connection is closed - } - catch (Exception ex) - { - throw new MySqlException("Unexpected message encountered during closing session", ex); - } - } - - internal string ReadOk() - { - CommunicationPacket p = ReadPacket(); - if (p.MessageType == (int)ServerMessageId.ERROR) - { - var error = Error.Parser.ParseFrom(p.Buffer); - throw new MySqlException(error.Msg); - } - if (p.MessageType == (int)ServerMessageId.OK) - { - var response = Ok.Parser.ParseFrom(p.Buffer); - return response.Msg; - } - else - throw new InvalidOperationException(); - } - - internal void SetXPackets(XPacketReaderWriter reader, XPacketReaderWriter writer) - { - _reader = reader; - _writer = writer; - } - - internal void SendCreateView(string schema, string name, string definer, ViewAlgorithm algorithm, ViewSqlSecurity security, ViewCheckOption check, string[] columns, bool replace, QueryStatement queryStatement) - { - var builder = new CreateView(); - builder.Collection = ExprUtil.BuildCollection(schema, name); - builder.Definer = definer; - builder.Algorithm = algorithm; - builder.Security = security; - builder.Check = check; - if (columns != null && columns.Length > 0) - { - foreach (string column in columns) - { - builder.Column.Add(column); - } - } - if(queryStatement != null) - { - builder.Stmt = CreateFindMessage(queryStatement.schema, - queryStatement.collection, queryStatement.isRelational, - queryStatement.filter, queryStatement.findParams); - } - builder.ReplaceExisting = replace; - _writer.Write((int)ClientMessages.Types.Type.CrudCreateView, builder); - } - - internal void SendModifyView(string schema, string name, string definer, ViewAlgorithm algorithm, ViewSqlSecurity security, ViewCheckOption check, string[] columns, QueryStatement queryStatement) - { - var builder = new ModifyView(); - builder.Collection = ExprUtil.BuildCollection(schema, name); - builder.Definer = definer; - builder.Algorithm = algorithm; - builder.Security = security; - builder.Check = check; - if (columns != null && columns.Length > 0) - { - foreach (string column in columns) - { - builder.Column.Add(column); - } - } - if (queryStatement != null) - { - builder.Stmt = CreateFindMessage(queryStatement.schema, - queryStatement.collection, queryStatement.isRelational, - queryStatement.filter, queryStatement.findParams); - } - _writer.Write((int)ClientMessages.Types.Type.CrudModifyView, builder); - } - - internal void SendDropView(string schema, string name, bool ifExists) - { - var builder = new DropView(); - builder.Collection = ExprUtil.BuildCollection(schema, name); - builder.IfExists = ifExists; - _writer.Write((int)ClientMessages.Types.Type.CrudDropView, builder); - } - } -} diff --git a/Source/MySql.Data/X/Protocol/X/XTimeDecoder.cs b/Source/MySql.Data/X/Protocol/X/XTimeDecoder.cs deleted file mode 100644 index 6adcb2fdf..000000000 --- a/Source/MySql.Data/X/Protocol/X/XTimeDecoder.cs +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using Google.Protobuf; -using MySql.Data.MySqlClient; -using MySql.Data.MySqlClient.X.XDevAPI.Common; -using MySqlX.Data; -using MySqlX.XDevAPI; -using System; - -namespace MySqlX.Protocol.X -{ - internal class XTimeDecoder : ValueDecoder - { - public override void SetMetadata() - { - Column.Type = ColumnType.Time; - Column.ClrType = typeof(TimeSpan); - ClrValueDecoder = ValueDecoder; - } - - public object ValueDecoder(byte[] bytes) - { - CodedInputStream input = new CodedInputStream(bytes); - Int64 hour = 0, min = 0, sec = 0, usec = 0; - - bool negative = input.ReadInt32() > 0; - if (!input.IsAtEnd) - hour = input.ReadInt64(); - if (!input.IsAtEnd) - min = input.ReadInt64(); - if (!input.IsAtEnd) - sec = input.ReadInt64(); - if (!input.IsAtEnd) - usec = input.ReadInt64(); - if (negative) hour *= -1; - return new TimeSpan(0, (int)hour, (int)min, (int)sec, (int)usec * 1000); - } - } -} diff --git a/Source/MySql.Data/X/Protocol/X/XValueDecoderFactory.cs b/Source/MySql.Data/X/Protocol/X/XValueDecoderFactory.cs deleted file mode 100644 index 568638248..000000000 --- a/Source/MySql.Data/X/Protocol/X/XValueDecoderFactory.cs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using MySql.Data.MySqlClient; -using MySqlX.XDevAPI.Relational; - -namespace MySqlX.Protocol.X -{ - internal class XValueDecoderFactory - { - public static ValueDecoder GetValueDecoder(Column c, Mysqlx.Resultset.ColumnMetaData.Types.FieldType type) - { - switch (type) - { - case Mysqlx.Resultset.ColumnMetaData.Types.FieldType.Bit: return new BitDecoder(); - case Mysqlx.Resultset.ColumnMetaData.Types.FieldType.Bytes: return new ByteDecoder(false); - case Mysqlx.Resultset.ColumnMetaData.Types.FieldType.Enum: return new ByteDecoder(true); - case Mysqlx.Resultset.ColumnMetaData.Types.FieldType.Set: return new SetDecoder(); - case Mysqlx.Resultset.ColumnMetaData.Types.FieldType.Time: return new XTimeDecoder(); - case Mysqlx.Resultset.ColumnMetaData.Types.FieldType.Datetime: return new XDateTimeDecoder(); - case Mysqlx.Resultset.ColumnMetaData.Types.FieldType.Sint: return new IntegerDecoder(true); - case Mysqlx.Resultset.ColumnMetaData.Types.FieldType.Uint: return new IntegerDecoder(false); - case Mysqlx.Resultset.ColumnMetaData.Types.FieldType.Float: return new FloatDecoder(true); - case Mysqlx.Resultset.ColumnMetaData.Types.FieldType.Double: return new FloatDecoder(false); - case Mysqlx.Resultset.ColumnMetaData.Types.FieldType.Decimal: return new DecimalDecoder(); - } - throw new MySqlException("Unknown field type " + type.ToString()); - } - } -} diff --git a/Source/MySql.Data/X/RoutingServices/DefaultRoutingService.cs b/Source/MySql.Data/X/RoutingServices/DefaultRoutingService.cs deleted file mode 100644 index a3ef9e6db..000000000 --- a/Source/MySql.Data/X/RoutingServices/DefaultRoutingService.cs +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySql.Data.MySqlClient; -using MySqlX.Data; -using System; - -namespace MySqlX.RoutingServices -{ - /// - /// Class implementation for a default communication kind. - /// - internal class DefaultRoutingService : RoutingServiceBase - { - - /// - /// Constructor method for the communication routing service - /// - /// A MySqlConnectionStringBuild setted with the information to use in the connection - public DefaultRoutingService(MySqlConnectionStringBuilder settings) : base(settings) - { - - } - - - /// - /// Gets the current connection base on the connection mode - /// - /// One of the values of ConnectionMode Offline, ReadOnly, WriteOnly, ReadWrite - /// - public override MySqlConnectionStringBuilder GetCurrentConnection(DataAccess.ConnectionMode mode) - { - return this.settings; - } - } -} diff --git a/Source/MySql.Data/X/RoutingServices/RoutingServiceBase.cs b/Source/MySql.Data/X/RoutingServices/RoutingServiceBase.cs deleted file mode 100644 index b824692c4..000000000 --- a/Source/MySql.Data/X/RoutingServices/RoutingServiceBase.cs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright © 2015, 2017, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySql.Data.MySqlClient; -using MySqlX.Data; -using MySqlX.DataAccess; - -namespace MySqlX.RoutingServices -{ - - /// - /// Abstract class used to define the kind of server in environments with multiple types of distributed systems. - /// - internal abstract class RoutingServiceBase - { - protected MySqlConnectionStringBuilder settings; - - public RoutingServiceBase(MySqlConnectionStringBuilder settings) - { - this.settings = settings; - } - - - public virtual MySqlConnectionStringBuilder GetCurrentConnection() - { - return settings; - } - - public abstract MySqlConnectionStringBuilder GetCurrentConnection(ConnectionMode mode); - } -} diff --git a/Source/MySql.Data/X/Serialization/JsonParser.cs b/Source/MySql.Data/X/Serialization/JsonParser.cs deleted file mode 100644 index c4a480e6d..000000000 --- a/Source/MySql.Data/X/Serialization/JsonParser.cs +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; - -namespace MySqlX.Serialization -{ - /// - /// Main class for parsing json strings - /// - public class JsonParser - { - private int _pos = 0; - private String _input; - - public static Dictionary Parse(string s) - { - JsonParser p = new JsonParser(); - return p.ParseInternal(s); - } - - private Dictionary ParseInternal(string s) - { - _input = s; - Dictionary dic = ReadGroup(); - if (_pos != _input.Length) - throw new IndexOutOfRangeException("It's not the end of stream."); - return dic; - } - - private Dictionary ReadGroup() - { - Dictionary values = new Dictionary(); - - RequireToken('{'); - if (PeekToken() != '}') - while (true) - { - string key = ReadQuotedToken(); - if (key == null) break; - RequireToken(':'); - var obj = ReadValue(); - values[key] = obj; - if (PeekToken() == '}') break; - RequireToken(','); - } - RequireToken('}'); - return values; - } - - private object ReadValue() - { - char t = PeekToken(); - if (t == '"') return ReadQuotedToken(); - if (t == '{') return ReadGroup(); - if (t == '[') return ReadArray(); - string stringValue = ReadUntilToken(',', '}'); - int intValue; - long longValue; - double doubleValue; - if (int.TryParse(stringValue, out intValue)) return intValue; - if (long.TryParse(stringValue, out longValue)) return longValue; - if (double.TryParse(stringValue, out doubleValue)) return doubleValue; - return stringValue; - } - - private Dictionary[] ReadArray() - { - List> values = new List>(); - - RequireToken('['); - while (true) - { - values.Add(ReadGroup()); - if (PeekToken() == ']') break; - RequireToken(','); - } - RequireToken(']'); - return values.ToArray(); - } - - private char PeekToken() - { - SkipWhite(); - if (_pos == _input.Length) - throw new Exception("Unexpected end of stream found."); - return _input[_pos]; - } - - private string ReadQuotedToken() - { - RequireToken('"'); - string val = ReadUntilToken('"'); - RequireToken('"'); - return val; - } - - private bool TokenInGroup(char[] tokens, char c) - { - foreach (char token in tokens) - if (token == c) return true; - return false; - } - - private string ReadUntilToken(params char[] end) - { - string val = ""; - while (_pos < _input.Length) - { - char c = _input[_pos++]; - if (TokenInGroup(end, c)) - { - _pos--; - return val; - } - val += c; - } - throw new Exception("Failed to find ending '\"' while reading stream."); - } - - private void RequireToken(char token) - { - if (!ReadToken(token)) - throw new Exception("Expected token '" + token + "'"); - } - - private bool ReadToken(char token) - { - SkipWhite(); - if (_pos == _input.Length) return false; - char c = _input[_pos++]; - return c == token; - } - - private void SkipWhite() - { - while (Char.IsWhiteSpace(_input[_pos])) - _pos++; - } - } -} diff --git a/Source/MySql.Data/X/Session/InternalSession.cs b/Source/MySql.Data/X/Session/InternalSession.cs deleted file mode 100644 index b0488eebe..000000000 --- a/Source/MySql.Data/X/Session/InternalSession.cs +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.IO; -using MySqlX.Data; -using MySqlX.Protocol; -using MySqlX.XDevAPI; -using MySqlX.XDevAPI.Common; -using MySqlX.XDevAPI.Relational; -using MySql.Data.MySqlClient; -using MySql.Data.MySqlClient.Authentication; - -namespace MySqlX.Session -{ - - /// - /// Abstract class to manage and encapsulate one or more actual connections. - /// - public abstract class InternalSession : IDisposable - { - protected Stream _stream; - internal BaseResult ActiveResult; - private bool disposed = false; - - - /// - /// Creates a new session object with the values of the settings parameter. - /// - /// Settings to be used in the session object - public InternalSession(MySqlConnectionStringBuilder settings) - { - Settings = settings; - } - - protected abstract void Open(); - - public abstract void Close(); - - internal abstract ProtocolBase GetProtocol(); - - - protected MySqlConnectionStringBuilder Settings; - - protected MySqlAuthenticationPlugin GetAuthenticationPlugin() - { - return AuthenticationPluginManager.GetPlugin("mysql_native_password"); - } - - public SessionState SessionState { get; protected set; } - - public static InternalSession GetSession(MySqlConnectionStringBuilder settings) - { - InternalSession session = new XInternalSession(settings); - int count = 0; - do - { - try - { - session.Open(); - break; - } - catch (IOException) - { - // retry ssl connection (manual fallback) - if (count++ >= 5) throw; - } - } while (true); - return session; - } - - public Result ExecuteSqlNonQuery(string sql, params object[] args) - { - GetProtocol().SendSQL(sql, args); - return new Result(this); - } - - public RowResult GetSqlRowResult(string sql) - { - GetProtocol().SendSQL(sql); - return new RowResult(this); - } - - public SqlResult GetSQLResult(string sql, object[] args) - { - GetProtocol().SendSQL(sql, args); - return new SqlResult(this); - } - - public object ExecuteQueryAsScalar(string sql) - { - RowResult result = GetSqlRowResult(sql); - var rows = result.FetchAll(); - if (rows.Count == 0) - throw new MySqlException("No data found"); - return rows[0][0]; - } - - - #region IDisposable - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected virtual void Dispose(bool disposing) - { - if (disposed) return; - - if (disposing) - { - // Free any other managed objects here. - // - } - - // Free any unmanaged objects here. - // - disposed = true; - } - - //~BaseSession() - //{ - // Dispose(false); - //} - - #endregion - } -} diff --git a/Source/MySql.Data/X/Session/QueueTaskScheduler.cs b/Source/MySql.Data/X/Session/QueueTaskScheduler.cs deleted file mode 100644 index 963311fc8..000000000 --- a/Source/MySql.Data/X/Session/QueueTaskScheduler.cs +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; - -namespace MySqlX.Session -{ - /// - /// Implementation class for object that manages low-level work of queuing tasks onto threads. - /// - internal class QueueTaskScheduler : TaskScheduler - { - private readonly object lockObject = new object(); - - protected override IEnumerable GetScheduledTasks() - { - throw new NotImplementedException(); - } - - protected override void QueueTask(Task task) - { - System.Threading.ThreadPool.QueueUserWorkItem(_ => - { - lock (lockObject) - { -#if !NETCORE10 - System.Threading.Thread.CurrentThread.Name = "mysqlx"; -#endif - base.TryExecuteTask(task); - } - }); - } - - protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued) - { - throw new NotImplementedException(); - } - - } -} diff --git a/Source/MySql.Data/X/Session/XInternalSession.cs b/Source/MySql.Data/X/Session/XInternalSession.cs deleted file mode 100644 index 7ffa380f1..000000000 --- a/Source/MySql.Data/X/Session/XInternalSession.cs +++ /dev/null @@ -1,358 +0,0 @@ -// Copyright © 2015, 2017, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using MySqlX.XDevAPI; -using MySqlX.Communication; -using System.Text; -using MySql.Data.Common; -using MySqlX.Protocol; -using System.Collections.Generic; -using System.Reflection; -using MySqlX.XDevAPI.Common; -using MySqlX.XDevAPI.Relational; -using MySqlX.XDevAPI.CRUD; -using MySqlX.Protocol.X; -using Mysqlx.Datatypes; -using MySql.Data.MySqlClient; -using MySqlX.Security; -using MySqlX; -using System.Linq; -using MySql.Data; - -namespace MySqlX.Session -{ - - /// - /// Implementation class of InternalSession to manage coonections using the Xprotocol type object. - /// - internal class XInternalSession : InternalSession - { - private XProtocol protocol; - private XPacketReaderWriter _reader; - private XPacketReaderWriter _writer; - private bool serverSupportsTls = false; - private const string mysqlxNamespace = "xplugin"; // TODO change to mysqlx - - - public XInternalSession(MySqlConnectionStringBuilder settings) : base(settings) - { - } - - protected override void Open() - { - _stream = MyNetworkStream.CreateStreamAsync(Settings, false).Result; - if (_stream == null) - throw new MySqlException(ResourcesX.UnableToConnect); - _reader = new XPacketReaderWriter(_stream); - _writer = new XPacketReaderWriter(_stream); - protocol = new XProtocol(_reader, _writer); - - Settings.CharacterSet = String.IsNullOrWhiteSpace(Settings.CharacterSet) ? "UTF-8" : Settings.CharacterSet; - - var encoding = Encoding.GetEncoding(Settings.CharacterSet); - - SetState(SessionState.Connecting, false); - - GetAndSetCapabilities(); - - // validates TLS use - if (Settings.SslMode != MySqlSslMode.None) - { - if (serverSupportsTls) - { - new Ssl(Settings).StartSSL(ref _stream, encoding, Settings.ToString()); - _reader = new XPacketReaderWriter(_stream); - _writer = new XPacketReaderWriter(_stream); - protocol.SetXPackets(_reader, _writer); - } - else if(Settings.SslMode != MySqlSslMode.Prefered) - { - // Client requires SSL connections. - string message = String.Format(Resources.NoServerSSLSupport, - Settings.Server); - throw new MySqlException(message); - } - } - - Authenticate(); - SetState(SessionState.Open, false); - } - - private void GetAndSetCapabilities() - { - protocol.GetServerCapabilities(); - - Dictionary clientCapabilities = new Dictionary(); - - // validates TLS use - if (Settings.SslMode != MySqlSslMode.None) - { - var capability = protocol.Capabilities.Capabilities_.FirstOrDefault(i => i.Name.ToLowerInvariant() == "tls"); - if (capability != null) - { - serverSupportsTls = true; - clientCapabilities.Add("tls", "1"); - } - } - protocol.SetCapabilities(clientCapabilities); - } - - private void Authenticate() - { - // do the authentication - MySQL41AuthenticationPlugin plugin = new MySQL41AuthenticationPlugin(Settings); - protocol.SendAuthStart(plugin.AuthName); - byte[] extraData = protocol.ReadAuthContinue(); - protocol.SendAuthContinue(plugin.Continue(extraData)); - protocol.ReadAuthOk(); - } - - protected void SetState(SessionState newState, bool broadcast) - { - if (newState == SessionState && !broadcast) - return; - SessionState oldSessionState = SessionState; - SessionState = newState; - - //TODO check if we need to send this event - //if (broadcast) - //OnStateChange(new StateChangeEventArgs(oldConnectionState, connectionState)); - } - - - internal override ProtocolBase GetProtocol() - { - return protocol; - } - - public override void Close() - { - try - { - protocol.SendSessionClose(); - } - finally - { - SessionState = SessionState.Closed; - _stream.Dispose(); - } - } - - - public void CreateCollection(string schemaName, string collectionName) - { - ExecuteCmdNonQuery(XpluginStatementCommand.XPLUGIN_STMT_CREATE_COLLECTION, true, schemaName, collectionName); - } - - public void DropCollection(string schemaName, string collectionName) - { - ExecuteCmdNonQuery(XpluginStatementCommand.XPLUGIN_STMT_DROP_COLLECTION, true, schemaName, collectionName); - } - - public Result CreateCollectionIndex(CreateCollectionIndexStatement statement) - { - List args = new List(); - args.Add(statement.Target.Schema.Name); - args.Add(statement.Target.Name); - args.Add(statement.createIndexParams.IndexName); - args.Add(statement.createIndexParams.IsUnique); - for(int i = 0; i < statement.createIndexParams.DocPaths.Count; i++) - { - args.Add(statement.createIndexParams.DocPaths[i]); - args.Add(statement.createIndexParams.Types[i]); - args.Add(statement.createIndexParams.NotNulls[i]); - } - - return ExecuteCmdNonQuery(XpluginStatementCommand.XPLUGIN_STMT_CREATE_COLLECTION_INDEX, false, args.ToArray()); - } - - public Result DropCollectionIndex(string schemaName, string collectionName, string indexName) - { - List args = new List(); - args.Add(schemaName); - args.Add(collectionName); - args.Add(indexName); - return ExecuteCmdNonQuery(XpluginStatementCommand.XPLUGIN_STMT_DROP_COLLECTION_INDEX, false, args.ToArray()); - } - - public long TableCount(Schema schema, string name) - { - string sql = String.Format("SELECT COUNT(*) FROM {0}.{1}", - ExprUnparser.QuoteIdentifier(schema.Name), ExprUnparser.QuoteIdentifier(name)); - return (long)ExecuteQueryAsScalar(sql); - } - - public bool TableExists(Schema schema, string name) - { - string sql = String.Format("SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = '{0}' AND table_name = '{1}'", - schema.Name, name); - long count = (long)ExecuteQueryAsScalar(sql); - return count != 0; - } - - private Result ExecuteCmdNonQuery(string cmd, bool throwOnFail, params object[] args) - { - protocol.SendExecuteStatement(mysqlxNamespace, cmd, args); - return new Result(this); - } - - public List GetObjectList(Schema s, params string[] types) where T : DatabaseObject - { - for (int i = 0; i < types.Length; i++) - types[i] = types[i].ToUpperInvariant(); - RowResult result = GetRowResult("list_objects", s.Name); - var rows = result.FetchAll(); - - List docs = new List(); - foreach (var row in rows) - { - if (!types.Contains(row.GetString("type").ToUpperInvariant())) continue; - - List parameters = new List(new object[] { s, row.GetString("name") }); - - switch (row.GetString("type").ToUpperInvariant()) - { - case "TABLE": - parameters.Add(false); - break; - case "VIEW": - parameters.Add(true); - break; - } -#if NETCORE10 - T t = (T)Activator.CreateInstance(typeof(T), true); - ((DatabaseObject)t).Schema = s; - ((DatabaseObject)t).Name = parameters[1].ToString(); - if (parameters.Count == 3) - t.GetType().GetProperty("IsView").SetValue(t, parameters[2]); -#else - T t = (T)Activator.CreateInstance(typeof(T), - BindingFlags.NonPublic | BindingFlags.Instance, - null, parameters.ToArray(), null); -#endif - docs.Add(t); - } - return docs; - } - - public string GetObjectType(Schema s, string name) - { - RowResult result = GetRowResult("list_objects", s.Name, name); - var row = result.FetchOne(); - if (row == null) - throw new MySqlException(string.Format(ResourcesX.NoObjectFound, name)); - System.Diagnostics.Debug.Assert(result.FetchOne() == null); - return row.GetString("type"); - } - - public RowResult GetRowResult(string cmd, params object[] args) - { - protocol.SendExecuteStatement(mysqlxNamespace, cmd, args); - return new RowResult(this); - } - - public Result Insert(Collection collection, DbDoc[] json, List newIds) - { - protocol.SendInsert(collection.Schema.Name, false, collection.Name, json, null); - return new Result(this) { DocumentIds = newIds.AsReadOnly() } ; - } - - public Result DeleteDocs(RemoveStatement rs) - { - protocol.SendDelete(rs.Target.Schema.Name, rs.Target.Name, false, rs.FilterData); - return new Result(this); - } - - public Result DeleteRows(TableDeleteStatement statement) - { - protocol.SendDelete(statement.Target.Schema.Name, - statement.Target.Name, true, - statement.FilterData); - return new Result(this); - } - - public Result ModifyDocs(ModifyStatement ms) - { - protocol.SendUpdate(ms.Target.Schema.Name, ms.Target.Name, false, ms.FilterData, ms.Updates); - return new Result(this); - } - - public Result UpdateRows(TableUpdateStatement statement) - { - protocol.SendUpdate(statement.Target.Schema.Name, - statement.Target.Name, true, - statement.FilterData, - statement.updates); - return new Result(this); - } - - public DocResult FindDocs(FindStatement fs) - { - protocol.SendFind(fs.Target.Schema.Name, fs.Target.Name, false, fs.FilterData, null); - DocResult result = new DocResult(this); - return result; - } - - public RowResult FindRows(TableSelectStatement ss) - { - protocol.SendFind(ss.Target.Schema.Name, ss.Target.Name, true, ss.FilterData, ss.findParams); - return new RowResult(this); - } - - public Result InsertRows(TableInsertStatement statement) - { - protocol.SendInsert(statement.Target.Schema.Name, true, statement.Target.Name, statement.values.ToArray(), statement.fields); - return new Result(this); - } - - public Result ViewCreate(ViewCreateStatement statement) - { - protocol.SendCreateView(statement.Target.Schema.Name, - statement.name, statement.definer, - (Mysqlx.Crud.ViewAlgorithm)statement.algorithm, - (Mysqlx.Crud.ViewSqlSecurity)statement.sqlSecurity, - (Mysqlx.Crud.ViewCheckOption)statement.checkOption, - statement.columns, statement.replace, - statement.queryStatement); - return new Result(this); - } - - public Result ViewAlter(ViewAlterStatement statement) - { - protocol.SendModifyView(statement.Target.Schema.Name, - statement.name, statement.definer, - (Mysqlx.Crud.ViewAlgorithm)statement.algorithm, - (Mysqlx.Crud.ViewSqlSecurity)statement.sqlSecurity, - (Mysqlx.Crud.ViewCheckOption)statement.checkOption, - statement.columns, statement.queryStatement); - return new Result(this); - } - - public Result ViewDrop(ViewDropStatement statement) - { - protocol.SendDropView(statement.Target.Schema.Name, - statement.name, statement.ifExists); - return new Result(this); - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/BaseSession.cs b/Source/MySql.Data/X/XDevAPI/BaseSession.cs deleted file mode 100644 index 8ed6b8c31..000000000 --- a/Source/MySql.Data/X/XDevAPI/BaseSession.cs +++ /dev/null @@ -1,302 +0,0 @@ -// Copyright © 2015, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using MySqlX.Common; -using MySqlX.Data; -using MySqlX.Session; -using MySqlX.XDevAPI.Relational; -using MySql.Data; -using MySql.Data.MySqlClient; -using System.Text.RegularExpressions; -using MySqlX.XDevAPI.Common; - -namespace MySqlX.XDevAPI -{ - /// - /// Represents a base class for XSession and NodeSession - /// - public abstract class BaseSession : IDisposable - { - private InternalSession _internalSession; - private string connectionString; - private bool disposed = false; - private const uint newDefaultPort = 33060; - - internal QueueTaskScheduler scheduler = new QueueTaskScheduler(); - - /// - /// Connection settings for this session - /// - public MySqlConnectionStringBuilder Settings { get; private set; } - - /// - /// Currently active schema - /// - public Schema Schema { get; protected set; } - - internal InternalSession InternalSession - { - get { return _internalSession; } - } - - internal XInternalSession XSession - { - get { return InternalSession as XInternalSession; } - } - - /// - /// Constructor - /// - /// Session connection string - public BaseSession(string connectionString) - { - if (string.IsNullOrWhiteSpace(connectionString)) - throw new ArgumentNullException("connectionString"); - this.connectionString = ParseConnectionStringFromUri(connectionString); - Settings = new MySqlConnectionStringBuilder(this.connectionString); - _internalSession = InternalSession.GetSession(Settings); - if (!string.IsNullOrWhiteSpace(Settings.Database)) - GetSchema(Settings.Database); - } - - /// - /// Constructor - /// - /// Session data as anonymous type - public BaseSession(object connectionData) - { - if (connectionData == null) - throw new ArgumentNullException("connectionData"); - var values = Tools.GetDictionaryFromAnonymous(connectionData); - if (!values.Keys.Any(s => s.ToLowerInvariant() == "port")) - values.Add("port", newDefaultPort); - Settings = new MySqlConnectionStringBuilder(); - foreach (var value in values) - { - if (!Settings.ContainsKey(value.Key)) - throw new KeyNotFoundException(string.Format(ResourcesX.InvalidConnectionStringAttribute, value.Key)); - Settings.SetValue(value.Key, value.Value); - } - this.connectionString = Settings.ToString(); - _internalSession = InternalSession.GetSession(Settings); - if (!string.IsNullOrWhiteSpace(Settings.Database)) - GetSchema(Settings.Database); - } - - /// - /// Drop the database/schema with the given name - /// - /// Name of the schema - public void DropSchema(string schema) - { - InternalSession.ExecuteSqlNonQuery("DROP DATABASE `" + schema + "`"); - } - - /// - /// Create a schema/database with the given name - /// - /// Name of the schema/database - /// Schema object - public Schema CreateSchema(string schema) - { - InternalSession.ExecuteSqlNonQuery("CREATE DATABASE `" + schema + "`"); - return new Schema(this, schema); - } - - /// - /// Gets the schema with the given name - /// - /// Name of the schema - /// Schema object - public Schema GetSchema(string schema) - { - this.Schema = new Schema(this, schema); - return this.Schema; - } - - //public Schema GetDefaultSchema() - //{ - // return new Schema(this, "default"); - //} - - //public Schema UseDefaultSchema() - //{ - // return new Schema(this, "default"); - //} - - /// - /// Get a list of schemas/databases in this session - /// - /// List - public List GetSchemas() - { - RowResult result = XSession.GetSqlRowResult("select * from information_schema.schemata"); - result.FetchAll(); - var query = from row in result.Rows - select new Schema(this, row.GetString("schema_name")); - return query.ToList(); - } - - /// - /// Start a new transaction - /// - public void StartTransaction() - { - InternalSession.ExecuteSqlNonQuery("START TRANSACTION"); - } - - /// - /// Commit the current transaction - /// - public Result Commit() - { - return InternalSession.ExecuteSqlNonQuery("COMMIT"); - } - - /// - /// Rollback the current transaction - /// - public Result Rollback() - { - return InternalSession.ExecuteSqlNonQuery("ROLLBACK"); - } - - /// - /// Close this session - /// - public void Close() - { - if (XSession.SessionState != SessionState.Closed) - { - XSession.Close(); - } - } - - internal protected string ParseConnectionStringFromUri(string uriString) - { - if (Regex.IsMatch(uriString, @"^mysqlx(\+\w+)?://.*", RegexOptions.IgnoreCase)) - { - Uri uri = new Uri(uriString); - List connectionParts = new List(); - - if (string.IsNullOrWhiteSpace(uri.Host)) - throw new UriFormatException(ResourcesX.InvalidUriData + "host"); - connectionParts.Add("server=" + uri.Host); - connectionParts.Add("port=" + (uri.Port == -1 ? 33060 : uri.Port)); - - if (!string.IsNullOrWhiteSpace(uri.UserInfo)) - { - string[] userData = uri.UserInfo.Split(':'); - if (userData.Length > 2) - throw new UriFormatException(ResourcesX.InvalidUriData + "user info"); - connectionParts.Add("uid=" + Uri.UnescapeDataString(userData[0])); - if (userData.Length > 1) - connectionParts.Add("password=" + Uri.UnescapeDataString(userData[1])); - } - if (uri.Segments.Length > 2) - throw new UriFormatException(ResourcesX.InvalidUriData + "segments"); - if (uri.Segments.Length > 1) - { - connectionParts.Add("database=" + Uri.UnescapeDataString(uri.Segments[1])); - } - if (!string.IsNullOrWhiteSpace(uri.Query)) - { - string[] queries = uri.Query.Substring(1).Split(new char[] { '&' }, StringSplitOptions.RemoveEmptyEntries); - foreach (string query in queries) - { - string[] keyValue = query.Split('='); - if (keyValue.Length > 2) - throw new ArgumentException(ResourcesX.InvalidUriQuery + ":" + keyValue[0]); - string part = Uri.UnescapeDataString(keyValue[0]) + "=" + (keyValue.Length == 2 ? keyValue[1] : "true"); - connectionParts.Add(part); - } - } - - return string.Join("; ", connectionParts); - } - return uriString; - } - - #region IDisposable Support - private bool disposedValue = false; // To detect redundant calls - - protected virtual void Dispose(bool disposing) - { - if (!disposedValue) - { - if (disposing) - { - // dispose managed state (managed objects). - Close(); - } - - // free unmanaged resources (unmanaged objects) and override a finalizer below. - // set large fields to null. - - disposedValue = true; - } - } - - // override a finalizer only if Dispose(bool disposing) above has code to free unmanaged resources. - // ~BaseSession() { - // // Do not change this code. Put cleanup code in Dispose(bool disposing) above. - // Dispose(false); - // } - - /// - /// This code added to correctly implement the disposable pattern. - /// - public void Dispose() - { - // Do not change this code. Put cleanup code in Dispose(bool disposing) above. - Dispose(true); - // uncomment the following line if the finalizer is overridden above. - // GC.SuppressFinalize(this); - } - #endregion - } - - /// - /// Session state - /// - public enum SessionState - { - // Summary: - // The session is closed. - Closed = 0, - // - // Summary: - // The session is open. - Open = 1, - // - // Summary: - // The session object is connecting to the data source. - Connecting = 2, - // - // Summary: - // The session object is executing a command. - Executing = 4, - } -} diff --git a/Source/MySql.Data/X/XDevAPI/CRUD/AddStatement.cs b/Source/MySql.Data/X/XDevAPI/CRUD/AddStatement.cs deleted file mode 100644 index 07ee918f7..000000000 --- a/Source/MySql.Data/X/XDevAPI/CRUD/AddStatement.cs +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright © 2015, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Collections.Generic; -using MySqlX.XDevAPI.Common; -using System.Linq; -using System; - -namespace MySqlX.XDevAPI.CRUD -{ - /// - /// Represent a chaining collection insert statement - /// - public class AddStatement : CrudStatement - { - private List _DbDocs = new List(); - - internal AddStatement(Collection collection) : base(collection) - { - } - - /// - /// Adds documents to the collection - /// - /// Documents to add - /// This AddStatement object - public AddStatement Add(params object[] items) - { - if (items == null) - throw new ArgumentNullException(); - - _DbDocs.AddRange(GetDocs(items)); - return this; - } - - /// - /// Executes the Add statement - /// - /// Result of execution - public override Result Execute() - { - try - { - if (_DbDocs.Count == 0) - return new Result(null); - - List newIds = AssignIds(); - return Target.Session.XSession.Insert(Target, _DbDocs.ToArray(), newIds); - } - finally - { - _DbDocs.Clear(); - } - } - - private List AssignIds() - { - List newIds = new List(); - foreach (DbDoc doc in _DbDocs) - { - doc.EnsureId(); - newIds.Add(doc.Id.ToString()); - } - - return newIds; - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/CRUD/CreateCollectionIndexStatement.cs b/Source/MySql.Data/X/XDevAPI/CRUD/CreateCollectionIndexStatement.cs deleted file mode 100644 index 8ab30056d..000000000 --- a/Source/MySql.Data/X/XDevAPI/CRUD/CreateCollectionIndexStatement.cs +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.XDevAPI.Common; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MySqlX.XDevAPI.CRUD -{ - /// - /// Implementation class for CRUD statements with collections using an index. - /// - public class CreateCollectionIndexStatement : CrudStatement - { - internal CreateIndexParams createIndexParams; - - internal CreateCollectionIndexStatement(Collection collection, string indexName, bool isUnique) : base(collection) - { - createIndexParams = new CreateIndexParams(indexName, isUnique); - } - - public CreateCollectionIndexStatement Field(string docPath, string type, bool notNull) - { - createIndexParams.AddField(docPath, type, notNull); - return this; - } - - public override Result Execute() - { - return Session.XSession.CreateCollectionIndex(this); - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/CRUD/CreateIndexParams.cs b/Source/MySql.Data/X/XDevAPI/CRUD/CreateIndexParams.cs deleted file mode 100644 index 6ae9bbdaa..000000000 --- a/Source/MySql.Data/X/XDevAPI/CRUD/CreateIndexParams.cs +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MySqlX.XDevAPI.CRUD -{ - internal class CreateIndexParams - { - private string indexName; - private bool unique; - private List docPaths = new List(); - private List types = new List(); - private List notNulls = new List(); - - public CreateIndexParams(string indexName, bool unique) - { - this.indexName = indexName; - this.unique = unique; - } - - public void AddField(String docPath, String type, bool notNull) - { - docPaths.Add(docPath); - types.Add(type); - notNulls.Add(notNull); - } - - public string IndexName - { - get { return this.indexName; } - } - - public bool IsUnique - { - get { return this.unique; } - } - - public List DocPaths - { - get { return this.docPaths; } - } - - public List Types - { - get { return this.types; } - } - - public List NotNulls - { - get { return this.notNulls; } - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/CRUD/CrudStatement.cs b/Source/MySql.Data/X/XDevAPI/CRUD/CrudStatement.cs deleted file mode 100644 index cc309f2da..000000000 --- a/Source/MySql.Data/X/XDevAPI/CRUD/CrudStatement.cs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright © 2015, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System.Collections.Generic; -using MySqlX.XDevAPI.Common; - -namespace MySqlX.XDevAPI.CRUD -{ - /// - /// Represents a collection statement - /// - /// - public abstract class CrudStatement : TargetedBaseStatement - where TResult : Result - { - internal CrudStatement(Collection collection) : base(collection) - { - } - - protected IEnumerable GetDocs(object[] items) - { - foreach (object item in items) - { - DbDoc d = item is DbDoc ? item as DbDoc : new DbDoc(item); - yield return d; - } - } - - } -} diff --git a/Source/MySql.Data/X/XDevAPI/CRUD/DocResult.cs b/Source/MySql.Data/X/XDevAPI/CRUD/DocResult.cs deleted file mode 100644 index af860a192..000000000 --- a/Source/MySql.Data/X/XDevAPI/CRUD/DocResult.cs +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Collections.Generic; -using System.Diagnostics; -using MySqlX.XDevAPI.Common; -using MySqlX.XDevAPI.Relational; -using MySqlX.Session; - -namespace MySqlX.XDevAPI.CRUD -{ - /// - /// Represents the result of an operation the includes a collection of documents - /// - public sealed class DocResult : BufferingResult - { - System.Text.Encoding _encoding = System.Text.Encoding.UTF8; - - internal DocResult(InternalSession session) : base(session) - { - // this is just a single column "doc" - Debug.Assert(_columns.Count == 1); - } - - protected override DbDoc ReadItem(bool dumping) - { - List values = Protocol.ReadRow(this); - if (values == null) return null; - - Debug.Assert(values.Count == 1); - return new DbDoc(_encoding.GetString(values[0]).TrimEnd('\0')); - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/CRUD/FindParams.cs b/Source/MySql.Data/X/XDevAPI/CRUD/FindParams.cs deleted file mode 100644 index a5e5365a0..000000000 --- a/Source/MySql.Data/X/XDevAPI/CRUD/FindParams.cs +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.XDevAPI.Common; - -namespace MySqlX.XDevAPI.CRUD -{ - internal class FindParams : FilterParams - { - public string[] GroupBy; - public string GroupByCritieria; - public string[] Projection; - } -} diff --git a/Source/MySql.Data/X/XDevAPI/CRUD/FindStatement.cs b/Source/MySql.Data/X/XDevAPI/CRUD/FindStatement.cs deleted file mode 100644 index b6475835c..000000000 --- a/Source/MySql.Data/X/XDevAPI/CRUD/FindStatement.cs +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Collections.Generic; -using MySqlX.XDevAPI.Common; - -namespace MySqlX.XDevAPI.CRUD -{ - /// - /// Represents a chaining collection find statement - /// - public class FindStatement : FilterableStatement - { - internal List projection; - internal string[] orderBy; - - - internal FindStatement(Collection c, string condition) : base (c, condition) - { - } - - /// - /// List of column projections that shall be returned - /// - /// List of columns - /// This FindStatement object - public FindStatement Fields(params string[] columns) - { - projection = new List(columns); - return this; - } - - /// - /// Executes the Find statement - /// - /// Result of execution and data - public override DocResult Execute() - { - return Execute(Target.Session.XSession.FindDocs, this); - } - - /// - /// Allows the user to set the limit and offset for the operation - /// - /// How many items should be returned - /// How many items should be skipped - /// The implementing statement type - public FindStatement Limit(long rows, long offset) - { - FilterData.Limit = rows; - FilterData.Offset = offset; - return this; - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/CRUD/ModifyStatement.cs b/Source/MySql.Data/X/XDevAPI/CRUD/ModifyStatement.cs deleted file mode 100644 index cbac6a0fe..000000000 --- a/Source/MySql.Data/X/XDevAPI/CRUD/ModifyStatement.cs +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Collections.Generic; -using Mysqlx.Crud; -using MySqlX.XDevAPI.Common; - -namespace MySqlX.XDevAPI.CRUD -{ - /// - /// Represents a chaining collection modify statement - /// - public class ModifyStatement : FilterableStatement - { - internal ModifyStatement(Collection collection, string condition) : base(collection, condition) - { - Updates = new List(); - } - - internal List Updates; - - /// - /// Sets key and value - /// - /// Document path key - /// New value - /// This ModifyStatement object - public ModifyStatement Set(string docPath, object value) - { - Updates.Add(new UpdateSpec(UpdateOperation.Types.UpdateType.ItemSet, docPath).SetValue(value)); - return this; - } - - /// - /// Changes value for a key - /// - /// Document path key - /// New value - /// This ModifyStatement object - public ModifyStatement Change(string docPath, object value) - { - Updates.Add(new UpdateSpec(UpdateOperation.Types.UpdateType.ItemReplace, docPath).SetValue(value)); - return this; - } - - /// - /// Removes a key/value from a document - /// - /// - /// This ModifyStatement object - public ModifyStatement Unset(string docPath) - { - Updates.Add(new UpdateSpec(UpdateOperation.Types.UpdateType.ItemRemove, docPath)); - return this; - } - - /// - /// Executes the modify statement - /// - /// Result of execution - public override Result Execute() - { - return Execute(Target.Session.XSession.ModifyDocs, this); - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/CRUD/RemoveStatement.cs b/Source/MySql.Data/X/XDevAPI/CRUD/RemoveStatement.cs deleted file mode 100644 index a871dd2f1..000000000 --- a/Source/MySql.Data/X/XDevAPI/CRUD/RemoveStatement.cs +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.XDevAPI.Common; - - -namespace MySqlX.XDevAPI.CRUD -{ - /// - /// Represents a chaining collection remove statement - /// - public class RemoveStatement : FilterableStatement - { - internal RemoveStatement(Collection collection, string condition) : base(collection, condition) - { - } - - /// - /// Executes the remove statement - /// - /// - public override Result Execute() - { - return Execute(Target.Session.XSession.DeleteDocs, this); - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/CRUD/UpdateSpec.cs b/Source/MySql.Data/X/XDevAPI/CRUD/UpdateSpec.cs deleted file mode 100644 index 1f55dce0a..000000000 --- a/Source/MySql.Data/X/XDevAPI/CRUD/UpdateSpec.cs +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.Protocol.X; -using Mysqlx.Crud; -using Mysqlx.Expr; - -namespace MySqlX.XDevAPI.CRUD -{ - internal class UpdateSpec - { - public UpdateSpec(UpdateOperation.Types.UpdateType updateType, string docPath) - { - Type = updateType; - Path = docPath; - } - - public string Path { get; private set; } - public UpdateOperation.Types.UpdateType Type { get; private set; } - public object Value { get; private set; } - - public bool HasValue - { - get { return Value != null; } - } - - public Expr GetValue() - { - return ExprUtil.ArgObjectToExpr(Value, false); - } - - public ColumnIdentifier GetSource(bool isRelational) - { - var source = Path; - // accomodate parser's documentField() handling by removing "@" - if (source.Length > 0 && source[0] == '@') - { - source = source.Substring(1); - } - ExprParser p = new ExprParser(Path, false); - ColumnIdentifier identifier; - if (isRelational) - identifier = p.ParseTableUpdateField(); - else - identifier = p.DocumentField().Identifier; - - return identifier; - } - - public UpdateSpec SetValue(object o) - { - Value = o; - return this; - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Collection.cs b/Source/MySql.Data/X/XDevAPI/Collection.cs deleted file mode 100644 index f3fa7e621..000000000 --- a/Source/MySql.Data/X/XDevAPI/Collection.cs +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using MySqlX.XDevAPI.CRUD; -using MySqlX.XDevAPI.Common; -using MySqlX; -using MySql.Data; - -namespace MySqlX.XDevAPI -{ - /// - /// Represents a collection of documents - /// - public class Collection : DatabaseObject - { - internal Collection() :base(null, null) - { - } - - internal Collection(Schema schema, string name) - : base(schema, name) - { - - } - - #region Add Operations - - /// - /// Add one ore more objects to the collection. This method can take anonymous objects, - /// domain objects, or just plain JSON strings. - /// - /// The objects to insert - /// AddStatement - public AddStatement Add(params object[] items) - { - if (items == null) - throw new ArgumentNullException(); - - AddStatement stmt = new AddStatement(this); - stmt.Add(items); - return stmt; - } - - #endregion - - #region Remove Operations - - /// - /// Creates a remove statement with the given condition. The RemoveStatement - /// can then be further modified before execution. This method is intended to remove - /// one or more documents from a collection. - /// - /// The condition to match documents - /// RemoveStatement - public RemoveStatement Remove(string condition) - { - RemoveStatement stmt = new RemoveStatement(this, condition); - return stmt; - } - - /// - /// Remove a single document from this collectoin. The id can really be of any type. - /// - /// The id to match the document - /// RemoveStatement - public RemoveStatement Remove(object id) - { - string key = id is string ? - "\"" + id.ToString() + "\"" : id.ToString(); - string condition = String.Format("_id = {0}", key); - RemoveStatement stmt = new RemoveStatement(this, condition); - return stmt; - } - - /// - /// Remove a single document from this collection. - /// - /// The DbDoc representing the document to remove - /// RemoveStatement - public RemoveStatement Remove(DbDoc doc) - { - if (!doc.HasId) - throw new InvalidOperationException(ResourcesX.RemovingRequiresId); - return Remove(doc.Id); - } - - #endregion - - #region Modify Operations - - /// - /// Modify a single document from this collection. - /// - /// The condition to match documents - /// ModifyStatement object - public ModifyStatement Modify(string condition) - { - ModifyStatement stmt = new ModifyStatement(this, condition); - return stmt; - } - - #endregion - - /// - /// Returns the number of documents in this collection on the server. - /// - /// Number of documents - public long Count() - { - return Session.XSession.TableCount(Schema, Name); - } - - /// - /// Finds documents in current collection - /// - /// Optional condition to match documents - /// FindStatement object - public FindStatement Find(string condition = null) - { - FindStatement stmt = new FindStatement(this, condition); - return stmt; - } - - /// - /// Creates a collection index - /// - /// Index name - /// True if the index is unique - /// CreateCollectionIndexStatement object - public CreateCollectionIndexStatement CreateIndex(string indexName, bool isUnique) - { - return new CreateCollectionIndexStatement(this, indexName, isUnique); - } - - /// - /// Drops a collection index - /// - /// Index name - /// Result of drop statement - public Result DropIndex(string indexName) - { - return Session.XSession.DropCollectionIndex(this.Schema.Name, this.Name, indexName); - } - - /// - /// Verifies if current collection exists in server schema - /// - /// True if exists - public override bool ExistsInDatabase() - { - return Session.XSession.TableExists(Schema, Name); - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Common/BaseResult.cs b/Source/MySql.Data/X/XDevAPI/Common/BaseResult.cs deleted file mode 100644 index c16c83b23..000000000 --- a/Source/MySql.Data/X/XDevAPI/Common/BaseResult.cs +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright © 2015, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Collections.Generic; -using MySqlX.Protocol; -using MySqlX.Session; -using System.Collections.ObjectModel; - -namespace MySqlX.XDevAPI.Common -{ - public abstract class BaseResult - { - private List _warnings = new List(); - internal ulong _recordsAffected; - internal ulong _autoIncrementValue; - protected InternalSession _session; - internal bool _hasData; - internal bool _hasMoreResults = false; - - internal BaseResult(InternalSession session) - { - if (session == null) return; - _session = session; - - // if we have an active resultset then we must buffer it entirely - if (session.ActiveResult != null) - { - session.ActiveResult.Buffer(); - session.ActiveResult = null; - } - - _hasData = Protocol.HasData(this); - if (_hasData) - session.ActiveResult = this; - } - - protected ProtocolBase Protocol - { - get { return _session?.GetProtocol(); } - } - - internal void AddWarning(WarningInfo w) - { - _warnings.Add(w); - } - - /// - /// Warnings derived from statement execution - /// -#if NET_45_OR_GREATER - public IReadOnlyList Warnings -#else - public ReadOnlyCollection Warnings -#endif - { - get { return _warnings.AsReadOnly(); } - } - - protected virtual void Buffer() { } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Common/BaseStatement.cs b/Source/MySql.Data/X/XDevAPI/Common/BaseStatement.cs deleted file mode 100644 index 70b8e3b65..000000000 --- a/Source/MySql.Data/X/XDevAPI/Common/BaseStatement.cs +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.XDevAPI.Relational; -using System.Threading; -using System.Threading.Tasks; - -namespace MySqlX.XDevAPI.Common -{ - /// - /// Base abstract class for API statement - /// - /// - public abstract class BaseStatement where TResult : BaseResult - { - /// - /// Constuctor - /// - /// Session where statement will be executed - public BaseStatement(BaseSession session) - { - Session = session; - } - - /// - /// Session that owns the statement - /// - public BaseSession Session { get; private set; } - - public abstract TResult Execute(); - - /// - /// Executes a statement asynchronously - /// - /// Result object - public async Task ExecuteAsync() - { - return await Task.Factory.StartNew(() => - { - var result = Execute(); - if (result is BufferingResult) - { - (result as BufferingResult).FetchAll(); - } - else if(result is BufferingResult) - { - (result as BufferingResult).FetchAll(); - } - return result; - }, - CancellationToken.None, - TaskCreationOptions.None, - Session.scheduler); - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Common/BufferingResult.cs b/Source/MySql.Data/X/XDevAPI/Common/BufferingResult.cs deleted file mode 100644 index d2a90a39a..000000000 --- a/Source/MySql.Data/X/XDevAPI/Common/BufferingResult.cs +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections; -using System.Collections.Generic; -using MySqlX.XDevAPI.Relational; -using MySqlX.Session; -using System.Collections.ObjectModel; -using MySql.Data; -using MySqlX; -using MySql.Data.MySqlClient; - -namespace MySqlX.XDevAPI.Common -{ - /// - /// Abstract class for Buffered results - /// - /// - public abstract class BufferingResult : BaseResult, IEnumerable, IEnumerator - { - protected int _position; - protected List _items = new List(); - protected bool _isComplete; - Dictionary _nameMap = new Dictionary(StringComparer.OrdinalIgnoreCase); - internal List _columns = null; - - - internal BufferingResult(InternalSession session) : base(session) - { - LoadCoumnData(); - PageSize = 20; - _position = -1; - } - - protected Dictionary NameMap - { - get { return _nameMap; } - } - - public int PageSize { get; private set; } - - protected void LoadCoumnData() - { - _columns = new List(); - if (_hasData) - { - _columns = Protocol.LoadColumnMetadata(); - if (_columns.Count == 0) - _hasData = false; - for (int i = 0; i < _columns.Count; i++) - _nameMap.Add(_columns[i].ColumnLabel ?? _columns[i].ColumnName, i); - } - else - Protocol.CloseResult(this); - } - - public ReadOnlyCollection FetchAll() - { - while (PageInItems()) ; - return _items.AsReadOnly(); - } - - internal void Dump() - { - if (_isComplete) return; - while (true) - { - if (ReadItem(true) == null) break; - } - _isComplete = true; - } - - public T FetchOne() - { - if (!Next()) - return default(T); - return Current; - } - - public bool Next() - { - _position++; - if (_position >= _items.Count) - { - if (_isComplete) return false; - if (!PageInItems()) - { - _isComplete = true; - return false; - } - } - return true; - } - - protected abstract T ReadItem(bool dumping); - - private bool PageInItems() - { - if (_isComplete) return false; - int count = 0; - for (int i = 0; i < PageSize; i++) - { - T item = ReadItem(false); - if (item == null) - { - _isComplete = !_hasData; - _session.ActiveResult = null; - break; - } - _items.Add(item); - count++; - } - return count > 0; - } - - public T Current - { - get - { - if (_position == _items.Count) - throw new InvalidOperationException(String.Format(ResourcesX.NoDataAtIndex, _position)); - return _items[_position]; - } - } - - object IEnumerator.Current - { - get { return this.Current; } - } - - public bool MoveNext() - { - return Next(); - } - - public void Reset() - { - _position = 0; - } - - public IEnumerator GetEnumerator() - { - return this; - } - - IEnumerator IEnumerable.GetEnumerator() - { - return this; - } - - protected override void Buffer() - { - FetchAll(); - } - - public void Dispose() - { - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Common/ColumnType.cs b/Source/MySql.Data/X/XDevAPI/Common/ColumnType.cs deleted file mode 100644 index 2ab006940..000000000 --- a/Source/MySql.Data/X/XDevAPI/Common/ColumnType.cs +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MySql.Data.MySqlClient.X.XDevAPI.Common -{ - public enum ColumnType - { - Bit = 1, - Tinyint, - Smallint, - Mediumint, - Int, - Bigint, - Float, - Decimal, - Double, - - Json, - String, - Bytes, - Time, - Date, - DateTime, - Timestamp, - Set, - Enum, - Geometry, - } - - internal enum ColumnContentType - { - Geometry = 1, - Json, - Xml - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Common/ErrorInfo.cs b/Source/MySql.Data/X/XDevAPI/Common/ErrorInfo.cs deleted file mode 100644 index becfeeb5b..000000000 --- a/Source/MySql.Data/X/XDevAPI/Common/ErrorInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; - -namespace MySqlX.XDevAPI.Common -{ - /// - /// Class to represent an error in this result - /// - public class ErrorInfo - { - public UInt32 Code; - public string SqlState; - public string Message; - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Common/FilterParams.cs b/Source/MySql.Data/X/XDevAPI/Common/FilterParams.cs deleted file mode 100644 index e93aabce0..000000000 --- a/Source/MySql.Data/X/XDevAPI/Common/FilterParams.cs +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright © 2015, 2017, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.Protocol.X; -using Mysqlx.Crud; -using Mysqlx.Expr; -using System.Collections.Generic; -using Mysqlx.Datatypes; -using System; -using MySqlX; -using MySql.Data; - -namespace MySqlX.XDevAPI.Common -{ - internal class FilterParams - { - public long Limit = -1; - public long Offset = -1; - public string Condition; - public Dictionary Parameters = new Dictionary(); - public Dictionary placeholderNameToPosition; - public bool IsRelational; - public string[] OrderBy; - - public bool HasLimit - { - get { return Limit != -1; } - } - - public List GetOrderByExpressions(bool allowRelational) - { - return new ExprParser(ExprUtil.JoinString(OrderBy), allowRelational).ParseOrderSpec(); - } - - public Expr GetConditionExpression(bool allowRelational) - { - ExprParser parser = new ExprParser(Condition, allowRelational); - Expr expr = parser.Parse(); - if (parser.GetPositionalPlaceholderCount() > 0) - { - this.placeholderNameToPosition = parser.GetPlaceholderNameToPositionMap(); - } - return expr; - } - - public IEnumerable GetArgsExpression(Dictionary parameters) - { - if (placeholderNameToPosition == null || placeholderNameToPosition.Count == 0) - throw new ArgumentException(ResourcesX.NoPlaceholders); - - Scalar[] paramsList = new Scalar[placeholderNameToPosition.Count]; - foreach (var param in parameters) - { - if (!placeholderNameToPosition.ContainsKey(param.Key.ToLowerInvariant())) - throw new ArgumentNullException(string.Format(ResourcesX.UnknownPlaceholder, param.Key)); - paramsList[placeholderNameToPosition[param.Key.ToLowerInvariant()]] = ExprUtil.ArgObjectToScalar(param.Value); - } - return paramsList; - } - - public FilterParams Clone() - { - return (FilterParams)this.MemberwiseClone(); - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Common/FilterableStatement.cs b/Source/MySql.Data/X/XDevAPI/Common/FilterableStatement.cs deleted file mode 100644 index 0f774727e..000000000 --- a/Source/MySql.Data/X/XDevAPI/Common/FilterableStatement.cs +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright © 2015, 2017, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.Serialization; -using MySqlX.Common; -using System.Collections.Generic; -using System; - -namespace MySqlX.XDevAPI.Common -{ - /// - /// Abstract class for filterable statements - /// - /// Filterable statement - /// Database object - /// Type of Result - public abstract class FilterableStatement : TargetedBaseStatement - where T : FilterableStatement - where TTarget : DatabaseObject - where TResult : BaseResult - { - private FilterParams filter = new FilterParams(); - - /// - /// Constructor - /// - /// Database object - /// Optional filter condition - public FilterableStatement(TTarget target, string condition = null) : base(target) - { - if (condition != null) - Where(condition); - } - - internal FilterParams FilterData - { - get { return filter; } - } - - /// - /// Allows the user to set the where condition for this operation. - /// - /// Where condition - /// The implementing statement type - public T Where(string condition) - { - filter.Condition = condition; - return (T)this; - } - - /// - /// Allows the user to set the limit and offset for the operation - /// - /// How many items should be returned - /// The implementing statement type - public T Limit(long rows) - { - filter.Limit = rows; - filter.Offset = -1; - return (T)this; - } - - /// - /// Allows the user to set the sorting criteria for the operation. The strings use normal SQL syntax like - /// "order ASC" or "pages DESC, age ASC" - /// - /// The order criteria - /// The implementing statement type - public T OrderBy(params string[] order) - { - filter.OrderBy = order; - return (T)this; - } - - /// - /// Binds the parameter values in filter expression - /// - /// Parameter name - /// Value of parameter - /// The implementing statement type - public T Bind(string parameterName, object value) - { - FilterData.Parameters.Add(parameterName, value); - return (T)this; - } - - /// - /// Binds the parameter values in filter expression - /// - /// Parameters as DbDoc object - /// The implementing statement type - public T Bind(DbDoc dbDocParams) - { - return Bind(dbDocParams.ToString()); - } - - /// - /// Binds the parameter values in filter expression - /// - /// Parameters as JSON string - /// The implementing statement type - public T Bind(string jsonParams) - { - foreach(var item in JsonParser.Parse(jsonParams)) - { - Bind(item.Key, item.Value); - } - return (T)this; - } - - /// - /// Binds the parameter values in filter expression - /// - /// Parameters as anonymous: new { param1 = value1, param2 = value2, ... } - /// The implementing statement type - public T Bind(object jsonParams) - { - return Bind(new DbDoc(jsonParams)); - } - - protected virtual TResult Execute(Func executeFunc, T t) - { - try - { - return executeFunc(t); - } - finally - { - FilterData.Parameters.Clear(); - } - } - - /// - /// Clones the filterable data but Session and Target remain the - /// same - /// - /// - public virtual T Clone() - { - var t = (T)this.MemberwiseClone(); - t.filter = t.FilterData.Clone(); - return t; - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Common/QueryStatement.cs b/Source/MySql.Data/X/XDevAPI/Common/QueryStatement.cs deleted file mode 100644 index 59257261b..000000000 --- a/Source/MySql.Data/X/XDevAPI/Common/QueryStatement.cs +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright © 2017, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.XDevAPI.CRUD; -using MySqlX.XDevAPI.Relational; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace MySqlX.XDevAPI.Common -{ - internal class QueryStatement - { - internal string schema; - internal string collection; - internal bool isRelational; - internal FilterParams filter; - internal FindParams findParams; - internal TableSelectStatement selectStatement; - internal FindStatement findStatement; - - - public QueryStatement(FindStatement statement) - { - this.findStatement = statement; - SetValues(statement.Target, statement.FilterData, null, false); - } - - public QueryStatement(TableSelectStatement statement) - { - this.selectStatement = statement; - SetValues(statement.Target, statement.FilterData, statement.findParams, true); - } - - private void SetValues(DatabaseObject target, FilterParams filter, FindParams findParams, bool isRelational) - { - this.schema = target.Schema.Name; - this.collection = target.Name; - this.isRelational = isRelational; - this.filter = filter; - this.findParams = findParams; - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Common/Result.cs b/Source/MySql.Data/X/XDevAPI/Common/Result.cs deleted file mode 100644 index c6f2fac2d..000000000 --- a/Source/MySql.Data/X/XDevAPI/Common/Result.cs +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright © 2015, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using MySqlX.Session; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using MySql.Data; - -namespace MySqlX.XDevAPI.Common -{ - /// - /// Represents a general statement result - /// - public class Result : BaseResult - { - internal Result(InternalSession session) : base(session) - { - if (session == null) return; - session.GetProtocol().CloseResult(this); - } - - /// - /// The number of records affected by the statement that generated this result. - /// - public UInt64 RecordsAffected - { - get { return _recordsAffected; } - } - - /// - /// The last inserted id (if there is one) by the statement that generated this result. - /// - public UInt64 AutoIncrementValue - { - get { return _autoIncrementValue; } - } - - /// - /// Returns the document generated Id. - /// For multiple document Ids use DocumentIds. - /// - public string DocumentId - { - get - { - if (DocumentIds == null || DocumentIds.Count == 0) - return null; - if (DocumentIds.Count > 1) - throw new ArgumentOutOfRangeException(ResourcesX.MoreThanOneDocumentId); - return DocumentIds[0]; - } - } - - /// - /// Returns a list of generated Ids in the order of the Add() calls - /// -#if NET_45_OR_GREATER - public IReadOnlyList DocumentIds -#else - public ReadOnlyCollection DocumentIds -#endif - { - get; internal set; - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Common/TargetedBaseStatement.cs b/Source/MySql.Data/X/XDevAPI/Common/TargetedBaseStatement.cs deleted file mode 100644 index 401175e2e..000000000 --- a/Source/MySql.Data/X/XDevAPI/Common/TargetedBaseStatement.cs +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -namespace MySqlX.XDevAPI.Common -{ - /// - /// Abstract class to select a database object target - /// - /// Database object - /// Execution result - public abstract class TargetedBaseStatement : BaseStatement - where TTarget : DatabaseObject - where TResult : BaseResult - { - /// - /// Constructor - /// - /// Database object - public TargetedBaseStatement(TTarget target) : base(target.Schema.Session) - { - Target = target; - } - - /// - /// Database target - /// - public TTarget Target { get; private set; } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Common/ViewAlterStatement.cs b/Source/MySql.Data/X/XDevAPI/Common/ViewAlterStatement.cs deleted file mode 100644 index aff0c6d00..000000000 --- a/Source/MySql.Data/X/XDevAPI/Common/ViewAlterStatement.cs +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright © 2017, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace MySqlX.XDevAPI.Common -{ - /// - /// Represents a chaining view alter statement - /// - public class ViewAlterStatement : ViewCreateStatement - { - internal ViewAlterStatement(Schema schema, string name) :base(schema, name, true) - { - - } - - /// - /// Executes the view alter statement - /// - /// Result of execution - public override Result Execute() - { - if (string.IsNullOrWhiteSpace(name)) throw new ArgumentNullException("View name"); - if (queryStatement == null) throw new ArgumentNullException("Query"); - if (definer == null) throw new ArgumentNullException("Definer"); - - return Session.XSession.ViewAlter(this); - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Common/ViewCreateStatement.cs b/Source/MySql.Data/X/XDevAPI/Common/ViewCreateStatement.cs deleted file mode 100644 index 066198597..000000000 --- a/Source/MySql.Data/X/XDevAPI/Common/ViewCreateStatement.cs +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright © 2017, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.DataAccess; -using MySqlX.XDevAPI.CRUD; -using MySqlX.XDevAPI.Relational; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace MySqlX.XDevAPI.Common -{ - /// - /// Represents a chaining view create statement - /// - public class ViewCreateStatement : TargetedBaseStatement - { - internal string name; - internal bool replace; - internal string[] columns; - internal ViewAlgorithmEnum algorithm; - internal ViewSqlSecurityEnum sqlSecurity; - internal string definer = string.Empty; - internal ViewCheckOptionEnum checkOption; - internal QueryStatement queryStatement = null; - - - internal ViewCreateStatement(Schema schema, string name, bool replace) : base(schema) - { - this.name = name; - this.replace = replace; - } - - /// - /// Defines the column names (alias) for the view - /// - /// Alias list for the view columns - /// ViewCreate chaining object - public ViewCreateStatement Columns(params string[] columns) - { - this.columns = columns; - return this; - } - - /// - /// Defines the algorithm of the view - /// - /// View algorithm - /// ViewCreate chaining object - public ViewCreateStatement Algorithm(ViewAlgorithmEnum algorithm) - { - this.algorithm = algorithm; - return this; - } - - /// - /// Defines the security scheme of the view - /// - /// View security scheme - /// ViewCreate chaining object - public ViewCreateStatement Security(ViewSqlSecurityEnum sqlSecurity) - { - this.sqlSecurity = sqlSecurity; - return this; - } - - /// - /// Represents the definer for a view - /// - /// Definer user - /// ViewCreate chaining object - public ViewCreateStatement Definer(string user) - { - this.definer = user; - return this; - } - - /// - /// Defines the table Select statement used to generate the view - /// - /// Table select statement - /// ViewCreate chaining object - public ViewCreateStatement DefinedAs(TableSelectStatement selectFunction) - { - this.queryStatement = new QueryStatement(selectFunction.Clone()); - return this; - } - - /// - /// Sets insert and update constraints on the view - /// - /// Check option - /// ViewCreate chaining object - public ViewCreateStatement WithCheckOption(ViewCheckOptionEnum checkOption) - { - this.checkOption = checkOption; - return this; - } - - /// - /// Executes the view create statement - /// - /// Result of execution - public override Result Execute() - { - if(string.IsNullOrWhiteSpace(name)) throw new ArgumentNullException("Name"); - if (queryStatement == null) throw new ArgumentNullException("Query"); - if (definer == null) throw new ArgumentNullException("Definer"); - - return Session.XSession.ViewCreate(this); - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Common/ViewDropStatement.cs b/Source/MySql.Data/X/XDevAPI/Common/ViewDropStatement.cs deleted file mode 100644 index 1ccc12128..000000000 --- a/Source/MySql.Data/X/XDevAPI/Common/ViewDropStatement.cs +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright © 2017, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; - -namespace MySqlX.XDevAPI.Common -{ - /// - /// Represents a chaining view drop statement - /// - public class ViewDropStatement : TargetedBaseStatement - { - internal string name; - internal bool ifExists = false; - - internal ViewDropStatement(Schema schema, string name) : base(schema) - { - this.name = name; - } - - /// - /// Suppresses errors if the view to drop does not exist - /// - /// ViewDrop chaining object - public ViewDropStatement IfExists() - { - ifExists = true; - return this; - } - - /// - /// Executes the view drop statement - /// - /// Result of execution - public override Result Execute() - { - if (string.IsNullOrWhiteSpace(name)) throw new ArgumentNullException("Name"); - return Session.XSession.ViewDrop(this); - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Common/WarningInfo.cs b/Source/MySql.Data/X/XDevAPI/Common/WarningInfo.cs deleted file mode 100644 index c90a9bef5..000000000 --- a/Source/MySql.Data/X/XDevAPI/Common/WarningInfo.cs +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -namespace MySqlX.XDevAPI.Common -{ - /// - /// Class to represent a warning in this result - /// - public class WarningInfo - { - public uint Code; - public string Message; - public uint Level; - - public WarningInfo(uint code, string msg) - { - Code = code; - Message = msg; - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Config/DefaultPersistenceHandler.cs b/Source/MySql.Data/X/XDevAPI/Config/DefaultPersistenceHandler.cs deleted file mode 100644 index 422853861..000000000 --- a/Source/MySql.Data/X/XDevAPI/Config/DefaultPersistenceHandler.cs +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using MySql.Data; -using MySqlX.Common; -using MySqlX.Serialization; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MySqlX.XDevAPI.Config -{ - internal class DefaultPersistenceHandler : IPersistenceHandler - { - private Dictionary list; - private readonly string fileName = "MySQLsessions.json"; - private readonly string programdataFile; - private readonly string appdataFile; - private const string linux_system_path = "/etc/mysql/sessions.json"; - private const string linux_user_path = "/.mysql/sessions.json"; - - - public DefaultPersistenceHandler() - { - switch (Tools.GetOS()) - { - case DataAccess.OS.Windows: - string programdataPath = Environment.GetEnvironmentVariable("programdata"); - if (string.IsNullOrEmpty(programdataPath)) - throw new ArgumentNullException(ResourcesX.ProgramDataNotDefined); - else - programdataFile = Path.Combine(programdataPath, fileName); - - string appdataPath = Environment.GetEnvironmentVariable("appdata"); - if (string.IsNullOrEmpty(appdataPath)) - throw new ArgumentNullException(ResourcesX.AppdataNotDefined); - else - appdataFile = Path.Combine(appdataPath, fileName); - - break; - - case DataAccess.OS.Linux: - case DataAccess.OS.MacOS: - programdataFile = linux_system_path; - appdataFile = Environment.GetEnvironmentVariable("HOME") + linux_user_path; - break; - } - } - - public void Delete(string name) - { - var data = ReadConfigData(appdataFile); - if (!data.Remove(name)) throw new KeyNotFoundException(name); - DbDoc json = new DbDoc(data); - File.WriteAllText(appdataFile, json.ToString()); - } - - public bool Exists(string name) - { - LoadConfigData(); - return list.ContainsKey(name); - } - - public List List() - { - LoadConfigData(); - return list.Keys.ToList(); - } - - public DbDoc Load(string name) - { - LoadConfigData(); - return new DbDoc(list[name]); - } - - public SessionConfig Save(string name, DbDoc config) - { - var data = ReadConfigData(appdataFile); - SessionConfig sessionConfig = new SessionConfig(name, config["uri"]); - if (config.values.ContainsKey("appdata")) - { - var appdata = config.values["appdata"] as Dictionary; - if (appdata == null) - throw new FormatException("appdata"); - appdata.ToList().ForEach(i => sessionConfig.SetAppData(i.Key, i.Value.ToString())); - } - data.Add(name, config); - DbDoc json = new DbDoc(data); - string dir = Directory.GetParent(appdataFile).FullName; - if(!Directory.Exists(dir)) - Directory.CreateDirectory(dir); - File.WriteAllText(appdataFile, json.ToString()); - return sessionConfig; - } - - - private void LoadConfigData() - { - list = new Dictionary(); - - //Load system configuration data (read only) - if (!string.IsNullOrEmpty(programdataFile)) - { - foreach (var item in ReadConfigData(programdataFile)) - list.Add(item.Key, item.Value); - } - - //Load user configuration data (read/write) - if (!string.IsNullOrEmpty(appdataFile)) - { - foreach (var item in ReadConfigData(appdataFile)) - list[item.Key] = item.Value; - } - } - - - private Dictionary ReadConfigData(string path) - { - try - { - if (!File.Exists(path)) return new Dictionary(); - string fileData = File.ReadAllText(path); - return JsonParser.Parse(fileData); - } - catch(Exception ex) - { - throw new FormatException(string.Format(ResourcesX.ErrorParsingConfigFile, path), ex); - } - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Config/IPasswordHandler.cs b/Source/MySql.Data/X/XDevAPI/Config/IPasswordHandler.cs deleted file mode 100644 index 7e8c1a286..000000000 --- a/Source/MySql.Data/X/XDevAPI/Config/IPasswordHandler.cs +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MySqlX.XDevAPI -{ - public interface IPasswordHandler - { - void Save(string key, string service, string password); - - string Load(string key, string service); - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Config/IPersistenceHandler.cs b/Source/MySql.Data/X/XDevAPI/Config/IPersistenceHandler.cs deleted file mode 100644 index e9cefb286..000000000 --- a/Source/MySql.Data/X/XDevAPI/Config/IPersistenceHandler.cs +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using MySqlX.XDevAPI; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MySqlX.XDevAPI.Config -{ - public interface IPersistenceHandler - { - SessionConfig Save(string name, DbDoc config); - - DbDoc Load(string name); - - void Delete(string name); - - List List(); - - bool Exists(string name); - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Config/SessionConfig.cs b/Source/MySql.Data/X/XDevAPI/Config/SessionConfig.cs deleted file mode 100644 index 8958fd5fe..000000000 --- a/Source/MySql.Data/X/XDevAPI/Config/SessionConfig.cs +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MySqlX.XDevAPI.Config -{ - public class SessionConfig - { - internal Dictionary appData = new Dictionary(); - - internal SessionConfig(string name, string uri) - { - if (string.IsNullOrEmpty(name)) - throw new ArgumentNullException("name"); - if (string.IsNullOrEmpty(uri)) - throw new ArgumentNullException("uri"); - Name = name; - Uri = uri; - } - - public string Name { get; protected set; } - - public string Uri { get; set; } - - public void SetAppData(string key, string value) - { - appData.Add(key, value); - } - - public void DeleteAppData(string key) - { - appData.Remove(key); - } - - public string GetAppData(string key) - { - return appData[key].ToString(); - } - - public void Save() - { - SessionConfigManager.Save(this); - } - - public string ToJsonString() - { - List options = new List(); - options.Add($"\"uri\": \"{Uri}\""); - if(appData.Count > 0) - { - string appdataOptions = string.Join(", ", appData.Select(i => $"\"{i.Key}\": \"{i.Value}\"")); - options.Add($"\"appdata\": {{ {appdataOptions} }}"); - } - return $"{{ \"{Name}\": {{ {string.Join(", ", options)} }} }}"; - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Config/SessionConfigManager.cs b/Source/MySql.Data/X/XDevAPI/Config/SessionConfigManager.cs deleted file mode 100644 index 4326aa65e..000000000 --- a/Source/MySql.Data/X/XDevAPI/Config/SessionConfigManager.cs +++ /dev/null @@ -1,250 +0,0 @@ -// Copyright © 2016, 2017, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using MySql.Data; -using MySqlX.Common; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading.Tasks; - -namespace MySqlX.XDevAPI.Config -{ - public static class SessionConfigManager - { - private static IPersistenceHandler persistenceHandler = new DefaultPersistenceHandler(); - private static IPasswordHandler passwordHandler; - - public static SessionConfig Save(string name, string uri, string jsonAppData) - { - ValidateName(name); - ValidateUri(uri); - - DbDoc json = new DbDoc(); - json.SetValue("uri", uri); - if (jsonAppData != null) - json.SetValue("appdata", new DbDoc(jsonAppData)); - return Save(name, json); - } - - public static SessionConfig Save(string name, string uri, Dictionary appData) - { - ValidateName(name); - ValidateUri(uri); - - SessionConfig sessionConfig = new SessionConfig(name, uri); - appData?.ToList().ForEach(i => sessionConfig.SetAppData(i.Key, i.Value)); - return Save(sessionConfig); - } - - public static SessionConfig Save(string name, DbDoc json) - { - ValidateName(name); - if (json == null) - throw new ArgumentNullException("Json"); - - if (!json.values.ContainsKey("uri")) - { - Dictionary dic = new Dictionary(); - foreach(var item in json.values) - { - Dictionary appdata = item.Value as Dictionary; - if (appdata == null && item.Value.GetType().GetTypeInfo().IsGenericType) - appdata = Tools.GetDictionaryFromAnonymous(item.Value); - - if (appdata == null) - dic.Add(item.Key, json[item.Key]); - else - appdata.ToList().ForEach(i => dic.Add(i.Key, json["appdata." + i.Key])); - } - return Save(name, dic); - } - return persistenceHandler.Save(name, json); - } - - public static SessionConfig Save(string name, string json) - { - ValidateName(name); - if (string.IsNullOrWhiteSpace(json)) - throw new ArgumentNullException("Json"); - - return Save(name, new DbDoc(json)); - } - - public static SessionConfig Save(string name, object json) - { - ValidateName(name); - if (json == null) - throw new ArgumentNullException("Json"); - - return Save(name, new DbDoc(json)); - } - - public static SessionConfig Save(string name, Dictionary data) - { - ValidateName(name); - if (data == null) - throw new ArgumentNullException("Data"); - - DbDoc json = new DbDoc(); - Dictionary appdata = new Dictionary(); - bool hasUri = false, hasHost = false; - foreach (string key in data.Keys) - { - switch (key) - { - case "uri": - if (hasHost) - throw new ArgumentException(ResourcesX.JsonUriOrHost); - if (string.IsNullOrEmpty(data["uri"])) - throw new ArgumentNullException("uri"); - json.SetValue("uri", data["uri"]); - hasUri = true; - break; - case "host": - case "user": - case "password": - case "port": - case "schema": - if (hasUri) - throw new ArgumentException(ResourcesX.JsonUriOrHost); - hasHost = true; - break; - default: - appdata.Add(key, data[key]); - break; - } - } - if (hasHost) - { - if (!data.ContainsKey("host") || string.IsNullOrEmpty(data["host"])) - throw new ArgumentNullException(ResourcesX.NoHost); - StringBuilder sb = new StringBuilder("mysqlx://"); - if (data.ContainsKey("user") && !string.IsNullOrWhiteSpace(data["user"])) - sb.Append(data["user"]).Append("@"); - sb.Append(data["host"]); - if (data.ContainsKey("port") && !string.IsNullOrWhiteSpace(data["port"])) - sb.Append(":").Append(data["port"]); - if (data.ContainsKey("schema") && !string.IsNullOrWhiteSpace(data["schema"])) - sb.Append("/").Append(data["schema"]); - - json.SetValue("uri", sb.ToString()); - } - if(appdata.Count > 0) - { - json.SetValue("appdata", appdata); - } - - return Save(name, json); - } - - public static SessionConfig Save(SessionConfig cfg) - { - if (cfg == null) - throw new ArgumentNullException("SessionConfig"); - - Dictionary options = new Dictionary(); - options.Add("uri", cfg.Uri); - if(cfg.appData.Count > 0) - { - options.Add("appdata", cfg.appData); - } - return Save(cfg.Name, new DbDoc(options)); - } - - public static SessionConfig Update(SessionConfig cfg) - { - if (cfg == null) - throw new ArgumentNullException("SessionConfig"); - - Delete(cfg.Name); - return Save(cfg); - } - - public static SessionConfig Get(string name) - { - ValidateName(name); - - DbDoc config = persistenceHandler.Load(name); - SessionConfig cfg = new SessionConfig(name, config["uri"]); - if (config.values.ContainsKey("appdata")) - { - Dictionary appdata = config.values["appdata"] as Dictionary; - if (appdata != null) - { - foreach (var option in appdata) - cfg.SetAppData(option.Key, option.Value.ToString()); - } - } - return cfg; - } - - public static bool Delete(string name) - { - ValidateName(name); - try - { - persistenceHandler.Delete(name); - return true; - } - catch - { - return false; - } - } - - public static List List() - { - return persistenceHandler.List(); - } - - public static void SetPersistenceHandler(IPersistenceHandler handler) - { - persistenceHandler = handler; - } - - public static void SetPasswordHandler(IPasswordHandler handler) - { - passwordHandler = handler; - } - - private static void ValidateName(string name) - { - if (string.IsNullOrWhiteSpace(name)) - throw new ArgumentNullException("Name"); - if (!Regex.IsMatch(name, @"^\w[\w-.]*$")) - throw new ArgumentException($"Name is invalid.", "Name"); - } - - private static void ValidateUri(string uri) - { - if (string.IsNullOrWhiteSpace(uri)) - throw new ArgumentNullException("Uri"); - if (!Uri.IsWellFormedUriString(uri, UriKind.RelativeOrAbsolute)) - throw new ArgumentException("Uri is invalid.", "Uri"); - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/DatabaseObject.cs b/Source/MySql.Data/X/XDevAPI/DatabaseObject.cs deleted file mode 100644 index a2de984e0..000000000 --- a/Source/MySql.Data/X/XDevAPI/DatabaseObject.cs +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -namespace MySqlX.XDevAPI -{ - /// - /// Represents a database object - /// - public abstract class DatabaseObject - { - internal DatabaseObject(Schema schema, string name) - { - Schema = schema; - Name = name; - } - - /// - /// Session that owns the database object - /// - public BaseSession Session - { - get { return Schema.Session; } - } - - /// - /// Schema that owns the database object - /// - public Schema Schema { get; internal set; } - - /// - /// Database object name - /// - public string Name { get; internal set; } - - /// - /// Verifies if database object exists in database - /// - /// True if the object exists in database - public abstract bool ExistsInDatabase(); - } -} diff --git a/Source/MySql.Data/X/XDevAPI/DbDoc.cs b/Source/MySql.Data/X/XDevAPI/DbDoc.cs deleted file mode 100644 index 17eecb759..000000000 --- a/Source/MySql.Data/X/XDevAPI/DbDoc.cs +++ /dev/null @@ -1,268 +0,0 @@ -// Copyright © 2015, 2017, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySql.Data; -using MySqlX; -using MySqlX.Serialization; -using System; -using System.Collections; -using System.Collections.Generic; -using System.Reflection; -using System.Text; - -namespace MySqlX.XDevAPI -{ - /// - /// Represents a generic documnet in JSON format - /// - public class DbDoc - { - internal Dictionary values = new Dictionary(); - - /// - /// Constructs a DbDoc with the given value. The value can be a domain object, anonymous object, or JSON string. - /// - /// Value for this DbDoc - public DbDoc(object val = null) - { - if (val != null) - { - if (val is string) - values = JsonParser.Parse(val as string); - else if (val is Dictionary) - values = JsonParser.Parse(DictToString(val as Dictionary, 2)); - else if (val is DbDoc) - values = JsonParser.Parse(DictToString((val as DbDoc).values, 2)); - else - values = ParseObject(val); - } - } - - /// - /// Allows a user to get the value of a document property. - /// NOTE: currently this is only supported one level deep - /// - /// - /// - public string this[string path] - { - get { return GetValue(path); } - } - - /// - /// Retrieves the Id of the document. - /// - public object Id - { - get { return values["_id"]; } - } - - /// - /// Indicates if this document has an id (property named _id with a value) - /// - public bool HasId - { - get { return values.ContainsKey("_id"); } - } - - internal void EnsureId() - { - if (!HasId) - SetValue("_id", Guid.NewGuid().ToString("N")); - } - - private string GetValue(string path) - { - string[] levels = path.Split('.'); - Dictionary dic = values; - string returnValue = null; - foreach(string level in levels) - { - if (!dic.ContainsKey(level)) - throw new InvalidOperationException( - String.Format(ResourcesX.PathNotFound, path)); - if (dic[level] is Dictionary) - { - dic = dic[level] as Dictionary; - returnValue = DictToString(dic, 2); - } - else if (dic[level].GetType().GetTypeInfo().IsGenericType) - { - dic = ParseObject(dic[level]); - returnValue = DictToString(dic, 2); - } - else - returnValue = dic[level].ToString(); - } - - return returnValue; - } - - /// - /// Allows a user to set a property on this document. - /// - /// Key of the property - /// New property value - public void SetValue(string key, object val) - { - Type t = val.GetType(); - IList e = val as IList; - - if (e != null) - values[key] = GetArrayValues(e); - else if (val is DbDoc) - values[key] = (val as DbDoc).values; - else if (val is Dictionary) - values[key] = val; - else if (t.Namespace != "System") - values[key] = ParseObject(val); - else - values[key] = val; - } - - private Dictionary[] GetArrayValues(IEnumerable value) - { - List> values = new List>(); - foreach (object o in value) - values.Add(ParseObject(o)); - return values.ToArray(); - } - - /// - /// Returns this document in Json format - /// - /// Json formatted string - public override string ToString() - { - return DictToString(values, 2); - } - - private string DictToString(Dictionary vals, int ident) - { - StringBuilder json = new StringBuilder("{"); - string delimiter = ""; - foreach (string key in vals.Keys) - { - json.Append(delimiter); - json.AppendLine(); - json.Append(' ', ident); - json.AppendFormat("\"{0}\": {1}", key, GetValue(vals[key], ident)); - delimiter = ", "; - } - json.AppendLine(); - json.Append(' ', ident - 2); - json.Append("}"); - return json.ToString(); - } - - private string GetValue(object val, int ident) - { - if(val.GetType().IsArray) - { - - StringBuilder values = new StringBuilder("["); - string separator = string.Empty; - foreach (var item in (Array)val) - { - values.Append(separator); - values.AppendLine(); - values.Append(' ', ident + 2); - values.Append(GetValue(item, ident + 2)); - separator = ", "; - } - values.AppendLine(); - values.Append(' ', ident); - values.Append("]"); - return values.ToString(); - } - if (val is Dictionary) - return DictToString(val as Dictionary, ident + 2); - string quoteChar = ""; - Type type = val.GetType(); - if (val is string || val is DateTime) - { - quoteChar = "\""; - } - return quoteChar + val.ToString() + quoteChar; - } - - private bool CompareDictionaries(Dictionary dict1, Dictionary dict2) - { - IEqualityComparer valueComparer = EqualityComparer.Default; - if (dict1.Count != dict2.Count) return false; - foreach (TKey key in dict1.Keys) - { - if (!dict2.ContainsKey(key)) return false; - object val = dict1[key]; - object val2 = dict2[key]; - if(val is Dictionary[] && val2 is Dictionary[]) - { - Dictionary[] valArray1 = (Dictionary[])val; - Dictionary[] valArray2 = (Dictionary[])val2; - if (valArray1.Length != valArray2.Length) return false; - for(int i = 0; i < valArray1.Length; i++) - { - if (!CompareDictionaries(valArray1[i], valArray2[i])) return false; - } - } - else if (val is Dictionary && val2 is Dictionary) - return CompareDictionaries((Dictionary)val, (Dictionary)val2); - else if (!val.Equals(val2)) return false; - } - return true; - } - - /// - /// Compares this DbDoc with another one - /// - /// The DbDoc to compare to - /// True if they are equal, false otherwise - public override bool Equals(object obj) - { - if (!(obj is DbDoc)) - throw new InvalidOperationException("DbDoc can only be compared with another DbDoc"); - DbDoc toCompare = obj as DbDoc; - return CompareDictionaries(values, toCompare.values); - } - - /// - /// Serves as a hash function for a particular type. - /// - /// A hash code for the current object. - public override int GetHashCode() - { - return base.GetHashCode(); - } - - private Dictionary ParseObject(object val) - { - Type t = val.GetType(); - bool allProps = t.Name.Contains("Anonymous"); - Dictionary vals = new Dictionary(); - - PropertyInfo[] props = allProps ? t.GetProperties() : t.GetProperties(BindingFlags.Public); - foreach (PropertyInfo prop in props) - vals.Add(prop.Name, prop.GetValue(val, null)); - return vals; - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/GenericCollection.cs b/Source/MySql.Data/X/XDevAPI/GenericCollection.cs deleted file mode 100644 index f33b5da59..000000000 --- a/Source/MySql.Data/X/XDevAPI/GenericCollection.cs +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using MySqlX.XDevAPI.CRUD; - -namespace MySqlX.XDevAPI -{ - - /// - /// Represents a collection of documents with a generic type. - /// - public class Collection : Collection - { - public Collection(Schema s, string name) : base(s, name) - { - } - - public AddStatement Add(T value) - { - return Add(new DbDoc(value)); - } - - - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Iterator.cs b/Source/MySql.Data/X/XDevAPI/Iterator.cs deleted file mode 100644 index 469cd7b3a..000000000 --- a/Source/MySql.Data/X/XDevAPI/Iterator.cs +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; - -namespace MySqlX.XDevAPI -{ - public class Iterator - { - public Iterator Open(string p) - { - throw new NotImplementedException(); - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/MySqlX.cs b/Source/MySql.Data/X/XDevAPI/MySqlX.cs deleted file mode 100644 index 28bfa0bfe..000000000 --- a/Source/MySql.Data/X/XDevAPI/MySqlX.cs +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; - -namespace MySqlX.XDevAPI -{ - - /// - /// Main class for session operations for MySQL Hybrid. - /// - - public class MySQLX - { - /// - /// Opens a session to the server given - /// - /// Connection data for the server - /// Session - public static XSession GetSession(string connectionSting) - { - return new XSession(connectionSting); - } - - /// - /// Opens a session to the server given - /// - /// Connection data for the server - /// Session - public static XSession GetSession(object connectionData) - { - return new XSession(connectionData); - } - - /// - /// Opens a node session to the server given - /// - /// Connection string for the server - /// Session - public static NodeSession GetNodeSession(string connectionSting) - { - return new NodeSession(connectionSting); - } - - /// - /// Opens a node session to the server given - /// - /// Connection data for the server - /// Session - public static NodeSession GetNodeSession(object connectionData) - { - return new NodeSession(connectionData); - } - - //public static Iterator CsvFileRowIterator() - //{ - // throw new NotImplementedException(); - //} - - //public static Iterator JsonFileDocIterator() - //{ - // throw new NotImplementedException(); - //} - } -} diff --git a/Source/MySql.Data/X/XDevAPI/NodeSession.cs b/Source/MySql.Data/X/XDevAPI/NodeSession.cs deleted file mode 100644 index 910d30b9a..000000000 --- a/Source/MySql.Data/X/XDevAPI/NodeSession.cs +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using MySqlX.XDevAPI.Common; -using MySqlX.XDevAPI.Relational; - -namespace MySqlX.XDevAPI -{ - /// - /// Represents a single MySql server session - /// - public class NodeSession : BaseSession - { - internal NodeSession(string connectionString) - : base(connectionString) - { - - } - - internal NodeSession(object connectionData) - : base(connectionData) - { - - } - - /// - /// Returns a SqlStatement object that can be used to execute the given SQL - /// - /// The SQL to execute - /// SqlStatement object - public SqlStatement SQL(string sql) - { - return new SqlStatement(this, sql); - } - - /// - /// Sets the schema in the database - /// - /// Schema name to be set - public void SetCurrentSchema(string schema) - { - InternalSession.ExecuteSqlNonQuery($"USE `{schema}`"); - GetSchema(schema); - } - - /// - /// Executes a query in the database to get the current schema - /// - /// Current Database Schema object or null if any schema is selected - public Schema GetCurrentSchema() - { - string schemaName = (string)InternalSession.ExecuteQueryAsScalar("SELECT DATABASE()"); - return schemaName == null ? null : GetSchema(schemaName); - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Relational/Column.cs b/Source/MySql.Data/X/XDevAPI/Relational/Column.cs deleted file mode 100644 index 69236fb83..000000000 --- a/Source/MySql.Data/X/XDevAPI/Relational/Column.cs +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using MySqlX.Protocol; -using MySqlX.Data; -using MySql.Data.MySqlClient; -using MySql.Data.MySqlClient.X.XDevAPI.Common; - -namespace MySqlX.XDevAPI.Relational -{ - /// - /// Represents a table column - /// - public class Column - { - internal ValueDecoder _decoder; - internal UInt64 _collationNumber; - - /// - /// Original column name - /// - public string ColumnName { get; internal set; } - /// - /// Column name alias - /// - public string ColumnLabel { get; internal set; } - /// - /// Table name the column orginates from - /// - public string TableName { get; internal set; } - /// - /// Table name alias - /// - public string TableLabel { get; internal set; } - /// - /// Schema name the column originates from - /// - public string SchemaName { get; internal set; } - /// - /// Catalog the schema originates from. - /// In MySQL protocol this is `def` by default - /// - public string DatabaseName { get; internal set; } - /// - /// Collation used in column - /// - public string CollationName { get; internal set; } - /// - /// Character set used in column - /// - public string CharacterSetName { get; internal set; } - /// - /// Column lenght - /// - public UInt32 Length { get; internal set; } - /// - /// Fractional decimal digits for floating point and fixed point numbers - /// - public UInt32 FractionalDigits { get; internal set; } - /// - /// Mysql data type - /// - public ColumnType Type { get; internal set; } - /// - /// .NET Clr data type - /// - public Type ClrType { get; internal set; } - /// - /// True if it's a signed number - /// - public bool IsNumberSigned { get; internal set; } - /// - /// True if column is UINT zerofill or BYTES rightpad - /// - public bool IsPadded { get; internal set; } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Relational/InternalRowResult.cs b/Source/MySql.Data/X/XDevAPI/Relational/InternalRowResult.cs deleted file mode 100644 index 28d8e426a..000000000 --- a/Source/MySql.Data/X/XDevAPI/Relational/InternalRowResult.cs +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using MySqlX.XDevAPI.Common; -using MySqlX.Session; -using MySql.Data.MySqlClient; -using System.Collections.ObjectModel; - -namespace MySqlX.XDevAPI.Relational -{ - /// - /// Represents a resultset that contains rows of data. - /// - public class InternalRowResult : BufferingResult - { - internal InternalRowResult(InternalSession session) : base(session) - { - } - - /// - /// The columns of this resulset - /// -#if NET_45_OR_GREATER - public IReadOnlyList Columns -#else - public ReadOnlyCollection Columns -#endif - { - get { return _columns.AsReadOnly(); } - } - - /// - /// The rows of this resultset. This collection will be incomplete unless all the rows have been read - /// either by using the Next method or the Buffer method. - /// -#if NET_45_OR_GREATER - public IReadOnlyList Rows -#else - public ReadOnlyCollection Rows -#endif - { - get { return _items.AsReadOnly(); } - } - - /// - /// Allows getting the value of the column value at the current index. - /// - /// Column index - /// CLR value at the column index - public object this[int index] - { - get { return GetValue(index); } - } - - /// - /// Allows getting the value of the column value at the current index. - /// - /// Column index - /// CLR value at the column index - private object GetValue(int index) - { - if (_position == _items.Count) - throw new InvalidOperationException("No data at position"); - return _items[_position][index]; - } - - /// - /// Returns the index of the given column name - /// - /// Name of the column to find - /// Numeric index of column - public int IndexOf(string name) - { - if (!NameMap.ContainsKey(name)) - throw new MySqlException("Column not found '" + name + "'"); - return NameMap[name]; - } - - protected override Row ReadItem(bool dumping) - { - ///TODO: fix this - List values = Protocol.ReadRow(this); - if (values == null) return null; - if (dumping) return new Row(NameMap, null); - - Debug.Assert(values.Count == _columns.Count, "Value count does not equal column count"); - object[] clrValues = new object[values.Count]; - for (int i = 0; i < values.Count; i++) - clrValues[i] = Columns[i]._decoder.ClrValueDecoder(values[i]); - - Row row = new Row(NameMap, clrValues); - return row; - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Relational/Row.cs b/Source/MySql.Data/X/XDevAPI/Relational/Row.cs deleted file mode 100644 index f54809b30..000000000 --- a/Source/MySql.Data/X/XDevAPI/Relational/Row.cs +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySql.Data; -using MySqlX; -using System; -using System.Collections.Generic; - -namespace MySqlX.XDevAPI.Relational -{ - /// - /// Represents a single row of data in a table - /// - public class Row - { - private object[] _values; - private Dictionary _nameMap; - - internal Row(Dictionary nameMap, object[] values) - { - _values = values; - _nameMap = nameMap; - } - - /// - /// Allows getting the value of the row at the given index. - /// - /// The column index to retrieve the value - /// The value at the index - public object this[int index] - { - get { return GetValue(index); } - } - - /// - /// Retrieves the column value as a string. - /// - /// Name of the column - /// The value of the column as a string - public string GetString(string name) - { - return GetValue(name).ToString(); - } - - /// - /// String based indexer into the row. Returns the value as a CLR type - /// - /// The column index to get - /// CLR value for the column - public object this[string name] - { - get - { - return GetValue(name); - } - } - - private object GetValue(int index) - { - if (index < 0 || index >= _values.Length) - throw new IndexOutOfRangeException(String.Format(ResourcesX.InvalidRowIndex, index)); - return _values[index]; - } - - private object GetValue(string name) - { - if (!_nameMap.ContainsKey(name)) - throw new InvalidOperationException(String.Format(ResourcesX.InvalidNameIndex, name)); - return GetValue(_nameMap[name]); - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Relational/RowResult.cs b/Source/MySql.Data/X/XDevAPI/Relational/RowResult.cs deleted file mode 100644 index c68e357fb..000000000 --- a/Source/MySql.Data/X/XDevAPI/Relational/RowResult.cs +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.Session; - -namespace MySqlX.XDevAPI.Relational -{ - - /// - /// Inherits from InternalRowResult. Creates a resultset that contains rows of data. - /// - public sealed class RowResult : InternalRowResult - { - internal RowResult(InternalSession session) : base(session) - { - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Relational/SqlResult.cs b/Source/MySql.Data/X/XDevAPI/Relational/SqlResult.cs deleted file mode 100644 index fa2685f28..000000000 --- a/Source/MySql.Data/X/XDevAPI/Relational/SqlResult.cs +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright © 2015, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using MySqlX.Session; - -namespace MySqlX.XDevAPI.Relational -{ - /// - /// Represents a resultset that contains rows of data for relational operations. - /// - public class SqlResult : InternalRowResult - { - internal SqlResult(InternalSession session) : base(session) - { - - } - - /// - /// Property that indicates if there result has data. - /// - public bool HasData - { - get { return _hasData; } - } - - /// - /// The number of records affected by the statement that generated this result. - /// - public UInt64 RecordsAffected - { - get { return _recordsAffected; } - } - - /// - /// The last inserted id (if there is one) by the statement that generated this result. - /// - public UInt64 AutoIncrementValue - { - get { return _autoIncrementValue; } - } - - /// - /// Moves to next resultset - /// - /// True if there is a new resultset - public bool NextResult() - { - if (!_hasMoreResults) - return false; - _hasData = Protocol.HasData(this); - LoadCoumnData(); - _isComplete = !_hasData; - _position = -1; - _items.Clear(); - return _hasData; - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Relational/SqlStatement.cs b/Source/MySql.Data/X/XDevAPI/Relational/SqlStatement.cs deleted file mode 100644 index b4efa6cd9..000000000 --- a/Source/MySql.Data/X/XDevAPI/Relational/SqlStatement.cs +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.XDevAPI.Common; -using System.Collections.Generic; - -namespace MySqlX.XDevAPI.Relational -{ - /// - /// Represents a sql statement - /// - public class SqlStatement : BaseStatement - { - /// - /// SqlStament constructor - /// - /// Node session the sql statement belongs to - /// Sql statement - public SqlStatement(NodeSession session, string sql) : base(session) - { - SQL = sql; - } - - /// - /// Current Sql statement - /// - public string SQL { get; private set; } - protected List parameters = new List(); - - /// - /// Execute the current sql statement - /// - /// RowResult object with the resultset and execution status - public override SqlResult Execute() - { - return Session.XSession.GetSQLResult(SQL, parameters.ToArray()); - } - - /// - /// Binds the parameters values by position - /// - /// Parameters values - /// The implementing statement type - public SqlStatement Bind(params object[] values) - { - if (values == null) - parameters.Add(null); - else - parameters.AddRange(values); - return this; - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Relational/Table.cs b/Source/MySql.Data/X/XDevAPI/Relational/Table.cs deleted file mode 100644 index 42fd21ea9..000000000 --- a/Source/MySql.Data/X/XDevAPI/Relational/Table.cs +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright © 2015, 2017, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using MySqlX.XDevAPI.Relational; - -namespace MySqlX.XDevAPI.Relational -{ - /// - /// Represents a server Table or View - /// - public class Table : DatabaseObject - { - private bool? isView; - - /// - /// Property to identify whether the object is a View (True) - /// or a Table (False). - /// - public bool IsView { - get - { - return CheckIsView(); - } - internal set - { - isView = value; - } - } - - private bool CheckIsView() - { - if (!isView.HasValue) - { - string type = Session.XSession.GetObjectType(Schema, Name).ToUpperInvariant(); - isView = (type == "VIEW"); - } - return isView.Value; - } - - internal Table(Schema schema, string name, bool isView) - : base(schema, name) - { - this.isView = isView; - } - - internal Table(Schema schema, string name) - : base(schema, name) - { - } - - internal Table() : base(null, null) { } - - /// - /// Selects a set of table rows - /// - /// Optional column names to select - /// TableSelectStatement object for select chain - public TableSelectStatement Select(params string[] columns) - { - return new TableSelectStatement(this, columns); - } - - /// - /// Inserts one or multiple rows into a table - /// - /// Optional list of fields for insert - /// TableInsertStatement object for insert chain - public TableInsertStatement Insert(params string[] fields) - { - return new TableInsertStatement(this, fields); - } - - /// - /// Updates table rows values - /// - /// TableUpdateStatement object for update chain - public TableUpdateStatement Update() - { - return new TableUpdateStatement(this); - } - - /// - /// Deletes rows from a Table - /// - /// DeleteStatement object - public TableDeleteStatement Delete() - { - return new TableDeleteStatement(this, null); - } - - /// - /// Returns the number of rows in the table on the server. - /// - /// Number of rows - public long Count() - { - return Session.XSession.TableCount(Schema, Name); - } - - /// - /// Verifies if the table exists in database - /// - /// True if table exists - public override bool ExistsInDatabase() - { - return Session.XSession.TableExists(Schema, Name); - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Relational/TableDeleteStatement.cs b/Source/MySql.Data/X/XDevAPI/Relational/TableDeleteStatement.cs deleted file mode 100644 index 660097217..000000000 --- a/Source/MySql.Data/X/XDevAPI/Relational/TableDeleteStatement.cs +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using MySqlX.XDevAPI.Common; - -namespace MySqlX.XDevAPI.Relational -{ - /// - /// Represent a chaining table delete statement - /// - public class TableDeleteStatement : FilterableStatement - { - internal TableDeleteStatement(Table table, string condition) : base(table, condition) - { - FilterData.IsRelational = true; - } - - /// - /// Executes the delete statement - /// - /// Result of delete execution - public override Result Execute() - { - return Execute(Target.Session.XSession.DeleteRows, this); - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Relational/TableInsertStatement.cs b/Source/MySql.Data/X/XDevAPI/Relational/TableInsertStatement.cs deleted file mode 100644 index 9ea3e3f07..000000000 --- a/Source/MySql.Data/X/XDevAPI/Relational/TableInsertStatement.cs +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Collections.Generic; -using MySqlX.XDevAPI.Common; - - -namespace MySqlX.XDevAPI.Relational -{ - /// - /// Represents a chaining table insert statement - /// - public class TableInsertStatement : TargetedBaseStatement - { - internal string[] fields; - internal List values = new List(); - internal object[] parameters; - - internal TableInsertStatement(Table table, string[] fields) : base(table) - { - this.fields = fields; - } - - /// - /// Executes the insert statement - /// - /// Result of insert statement - public override Result Execute() - { - try - { - return Target.Session.XSession.InsertRows(this); - } - finally - { - values.Clear(); - } - } - - /// - /// Values to be inserted. - /// Multiple rows supported. - /// - /// - /// This same TableInsertStatement object - public TableInsertStatement Values(params object[] values) - { - this.values.Add(values); - return this; - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Relational/TableSelectStatement.cs b/Source/MySql.Data/X/XDevAPI/Relational/TableSelectStatement.cs deleted file mode 100644 index 9bbd4bc2c..000000000 --- a/Source/MySql.Data/X/XDevAPI/Relational/TableSelectStatement.cs +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Collections.Generic; -using MySqlX.XDevAPI.Common; -using MySqlX.XDevAPI.CRUD; - -namespace MySqlX.XDevAPI.Relational -{ - /// - /// Represents a chaining table select statement - /// - public class TableSelectStatement : FilterableStatement - { - internal FindParams findParams = new FindParams(); - - internal TableSelectStatement(Table t, params string[] projection) : base(t) - { - findParams.Projection = projection; - FilterData.IsRelational = true; - } - - /// - /// Set table aggregation - /// - /// Column list for aggregation - /// This same TableSelectStatement object - public TableSelectStatement GroupBy(params string[] groupBy) - { - findParams.GroupBy = groupBy; - return this; - } - - /// - /// Filter criteria for aggregated groups - /// - /// Filter criteria for aggregated groups - /// This same TableSelectStatement object - public TableSelectStatement Having(string having) - { - findParams.GroupByCritieria = having; - return this; - } - - /// - /// Executes the select statement - /// - /// Result of execution and data - public override RowResult Execute() - { - return Execute(Target.Session.XSession.FindRows, this); - } - - /// - /// Allows the user to set the limit and offset for the operation - /// - /// How many items should be returned - /// How many items should be skipped - /// This same TableSelectStatement object - public TableSelectStatement Limit(long rows, long offset) - { - FilterData.Limit = rows; - FilterData.Offset = offset; - return this; - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Relational/TableUpdateStatement.cs b/Source/MySql.Data/X/XDevAPI/Relational/TableUpdateStatement.cs deleted file mode 100644 index 659707cf7..000000000 --- a/Source/MySql.Data/X/XDevAPI/Relational/TableUpdateStatement.cs +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.XDevAPI.Common; -using MySqlX.XDevAPI.CRUD; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace MySqlX.XDevAPI.Relational -{ - /// - /// Represents a chaining table update statement - /// - public class TableUpdateStatement : FilterableStatement - { - internal List updates = new List(); - - internal TableUpdateStatement(Table table) : base(table) - { - FilterData.IsRelational = true; - FilterData.Parameters = new Dictionary(); - } - - /// - /// Executes the update statement - /// - /// Result of the update statement - public override Result Execute() - { - return Execute(Target.Session.XSession.UpdateRows, this); - } - - /// - /// Column and value to be updated - /// - /// Column name - /// Value to be updated - /// This same TableUpdateStatement object - public TableUpdateStatement Set(string tableField, object value) - { - updates.Add(new UpdateSpec(Mysqlx.Crud.UpdateOperation.Types.UpdateType.Set, tableField).SetValue(value)); - return this; - } - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Schema.cs b/Source/MySql.Data/X/XDevAPI/Schema.cs deleted file mode 100644 index 7d5312254..000000000 --- a/Source/MySql.Data/X/XDevAPI/Schema.cs +++ /dev/null @@ -1,200 +0,0 @@ -// Copyright © 2015, 2017, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySql.Data.MySqlClient; -using MySqlX.XDevAPI.Common; -using MySqlX.XDevAPI.Relational; -using System; -using System.Collections.Generic; - -namespace MySqlX.XDevAPI -{ - /// - /// Represents a MySql schema or database - /// - public class Schema : DatabaseObject - { - internal Schema(BaseSession session, string name) : base(null, name) - { - Schema = this; - Session = session; - } - - /// - /// Session related to current schema - /// - public new BaseSession Session { get; private set; } - - - #region Browse Functions - - /// - /// Returns a list of all collections in this schema - /// - /// List - public List GetCollections() - { - return Session.XSession.GetObjectList(this, "COLLECTION"); - } - - /// - /// Returns list of all tables in this schema - /// - /// List
- public List
GetTables() - { - return Session.XSession.GetObjectList
(this, "TABLE", "VIEW"); - } - - #endregion - - #region Instance Functions - - /// - /// Get a collection by name - /// - /// The name of the collection to get - /// Ensure the collection exists in the schema - /// Collection object - public Collection GetCollection(string name, bool ValidateExistence = false) - { - Collection c = new Collection(this, name); - if (ValidateExistence) - if (!c.ExistsInDatabase()) - throw new MySqlException(String.Format("Collection '{0}' does not exist.", name)); - return c; - } - - /// - /// Returns a typed collection object. This is useful for using domain objects. - /// - /// The type of collection returned - /// The name of collection to get - /// Collection object - public Collection GetCollection(string name) - { - return new Collection(this, name); - } - - /// - /// Returns the given collection as a table - /// - /// Name of the collection - /// Table object - public Table GetCollectionAsTable(string name) - { - return GetTable(name); - } - - /// - /// Gets a table object. Upon return the object may or may not be valid. - /// - /// Name of the table object - /// Table object - public Table GetTable(string name) - { - return new Table(this, name); - } - - #endregion - - #region Create Functions - - /// - /// Creates a collection - /// - /// Name of the collection to create - /// If false, it will throw an exception if collection exists - /// Collection referente - public Collection CreateCollection(string collectionName, bool ReuseExistingObject = false) - { - Collection coll = new Collection(this, collectionName); - if (ReuseExistingObject && coll.ExistsInDatabase()) - return coll; - Session.XSession.CreateCollection(Name, collectionName); - return new Collection(this, collectionName); - } - - #endregion - - /// - /// Drops the given collection - /// - /// Name of the collection to drop - public void DropCollection(string name) - { - Collection c = GetCollection(name); - if (!c.ExistsInDatabase()) return; - Session.XSession.DropCollection(Name, name); - } - - #region Base Class - - /// - /// Determines if this schema actually exists - /// - /// True if exists, false otherwise - public override bool ExistsInDatabase() - { - string sql = String.Format("SELECT COUNT(*) FROM information_schema.schemata WHERE schema_name like '{0}'", Name); - long count = (long)Session.InternalSession.ExecuteQueryAsScalar(sql); - return count > 0; - } - - #endregion - - #region Views Functions - - /// - /// Creates a view - /// - /// View name - /// Specifies if an existing view is replaced or not - /// ViewCreate chaining object - public ViewCreateStatement CreateView(string name, bool replace = false) - { - return new ViewCreateStatement(this, name, replace); - } - - /// - /// Alters an existing view - /// - /// View name - /// ViewAlter chaining object - public ViewAlterStatement AlterView(string name) - { - return new ViewAlterStatement(this, name); - } - - /// - /// Drops a View - /// - /// View name - /// ViewDrop chaining object - public ViewDropStatement DropView(string name) - { - return new ViewDropStatement(this, name); - } - - #endregion - } -} diff --git a/Source/MySql.Data/X/XDevAPI/Session.cs b/Source/MySql.Data/X/XDevAPI/Session.cs deleted file mode 100644 index ff3e4ebcc..000000000 --- a/Source/MySql.Data/X/XDevAPI/Session.cs +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -namespace MySqlX.XDevAPI -{ - /// - /// Session that handles communication to MySql server - /// - public class XSession : BaseSession - { - /// - /// Creates XSession using a connection string - /// - /// - public XSession(string connectionString) - : base(connectionString) - { - - } - - /// - /// Creates XSession using an anonymous type as connection data - /// Example: new { server = "localhost", uid = "user", password = "somepass" } - /// - /// - public XSession(object connectionData) - : base(connectionData) - { - - } - } -} diff --git a/Source/MySql.Data/X/common/Tools.cs b/Source/MySql.Data/X/common/Tools.cs deleted file mode 100644 index 1b87a809d..000000000 --- a/Source/MySql.Data/X/common/Tools.cs +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright © 2014, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Reflection; -using MySql.Data; -using MySqlX.DataAccess; -using System.IO; - -namespace MySqlX.Common -{ - internal static class Tools - { - public static Dictionary GetDictionaryFromAnonymous(object anonymousObject) - { - Dictionary result = new Dictionary(); - - if (!anonymousObject.GetType().IsConstructedGenericType) - throw new FormatException(ResourcesX.InvalidConnectionData); - - foreach (PropertyInfo property in anonymousObject.GetType().GetProperties()) - { - object value = property.GetValue(anonymousObject, null); - result.Add(property.Name, value); - } - - return result; - } - - internal static OS GetOS() - { - if (Path.DirectorySeparatorChar == '/') - return OS.Linux; - if (Path.DirectorySeparatorChar == '\\') - return OS.Windows; - else - return OS.MacOS; - } - } -} diff --git a/Source/MySql.Data/command.cs b/Source/MySql.Data/command.cs deleted file mode 100644 index acafd62b5..000000000 --- a/Source/MySql.Data/command.cs +++ /dev/null @@ -1,949 +0,0 @@ -// Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.IO; -using System.Data; -using System.ComponentModel; -using System.Diagnostics; -using System.Collections.Generic; -using System.Linq; -using MySql.Data.MySqlClient.Replication; -using System.Threading; -using System.Reflection; -using System.Text; -using MySql.Data.Common; - -namespace MySql.Data.MySqlClient -{ - /// -#if !NETCORE10 - public sealed partial class MySqlCommand : System.ICloneable, IDisposable -#else - public sealed partial class MySqlCommand : MySql.Data.Common.ICloneable, IDisposable -#endif - { - MySqlConnection connection; - string cmdText; - private IAsyncResult asyncResult; - private PreparableStatement statement; - private int commandTimeout; - private bool resetSqlSelect; - CommandTimer commandTimer; - private bool useDefaultTimeout; - private static List keywords = null; - private bool disposed = false; - - /// - public MySqlCommand() - { - CommandType = System.Data.CommandType.Text; - Parameters = new MySqlParameterCollection(this); - cmdText = String.Empty; - useDefaultTimeout = true; - Constructor(); - } - - partial void Constructor(); - - /// - public MySqlCommand(string cmdText) - : this() - { - CommandText = cmdText; - } - - /// - public MySqlCommand(string cmdText, MySqlConnection connection) - : this(cmdText) - { - Connection = connection; - } - - /// - public MySqlCommand(string cmdText, MySqlConnection connection, MySqlTransaction transaction) - : this(cmdText, connection) - { - Transaction = transaction; - } - -#region Destructor - ~MySqlCommand() - { - Dispose(false); - } -#endregion - -#region Properties - - - /// - [Browsable(false)] - public Int64 LastInsertedId { get; internal set; } - - /// - [Category("Data")] - [Description("Command text to execute")] -#if !NETCORE10 - [Editor("MySql.Data.Common.Design.SqlCommandTextEditor,MySqlClient.Design", typeof(System.Drawing.Design.UITypeEditor))] -#endif - public override string CommandText - { - get { return cmdText; } - set - { - cmdText = value ?? string.Empty; - statement = null; - BatchableCommandText = null; - if (cmdText != null && cmdText.EndsWith("DEFAULT VALUES", StringComparison.OrdinalIgnoreCase)) - { - cmdText = cmdText.Substring(0, cmdText.Length - 14); - cmdText = cmdText + "() VALUES ()"; - } - } - } - - /// - [Category("Misc")] - [Description("Time to wait for command to execute")] - [DefaultValue(30)] - public override int CommandTimeout - { - get { return useDefaultTimeout ? 30 : commandTimeout; } - set - { - if (commandTimeout < 0) - Throw(new ArgumentException("Command timeout must not be negative")); - - // Timeout in milliseconds should not exceed maximum for 32 bit - // signed integer (~24 days), because underlying driver (and streams) - // use milliseconds expressed ints for timeout values. - // Hence, truncate the value. - int timeout = Math.Min(value, Int32.MaxValue / 1000); - if (timeout != value) - { - MySqlTrace.LogWarning(connection.ServerThread, - "Command timeout value too large (" - + value + " seconds). Changed to max. possible value (" - + timeout + " seconds)"); - } - commandTimeout = timeout; - useDefaultTimeout = false; - } - } - - /// - [Category("Data")] - public override CommandType CommandType { get; set; } - - /// - [Browsable(false)] - public bool IsPrepared => statement != null && statement.IsPrepared; - - /// - [Category("Behavior")] - [Description("Connection used by the command")] - public new MySqlConnection Connection - { - get { return connection; } - set - { - /* - * The connection is associated with the transaction - * so set the transaction object to return a null reference if the connection - * is reset. - */ - if (connection != value) - Transaction = null; - - connection = value; - - // if the user has not already set the command timeout, then - // take the default from the connection - if (connection == null) return; - - if (useDefaultTimeout) - { - commandTimeout = (int)connection.Settings.DefaultCommandTimeout; - useDefaultTimeout = false; - } - - EnableCaching = connection.Settings.TableCaching; - CacheAge = connection.Settings.DefaultTableCacheAge; - } - } - - /// - [Category("Data")] - [Description("The parameters collection")] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] - public new MySqlParameterCollection Parameters { get; } - - - /// - [Browsable(false)] - public new MySqlTransaction Transaction { get; set; } - - public bool EnableCaching { get; set; } - - public int CacheAge { get; set; } - - internal List Batch { get; private set; } - - internal bool Canceled { get; private set; } - - internal string BatchableCommandText { get; private set; } - - internal bool InternallyCreated { get; set; } - -#endregion - -#region Methods - - /// - /// Attempts to cancel the execution of a currently active command - /// - /// - /// Cancelling a currently active query only works with MySQL versions 5.0.0 and higher. - /// - public override void Cancel() - { - connection.CancelQuery(connection.ConnectionTimeout); - Canceled = true; - } - - /// - /// Creates a new instance of a object. - /// - /// - /// This method is a strongly-typed version of . - /// - /// A object. - /// - public new MySqlParameter CreateParameter() - { - return (MySqlParameter)CreateDbParameter(); - } - - /// - /// Check the connection to make sure - /// - it is open - /// - it is not currently being used by a reader - /// - and we have the right version of MySQL for the requested command type - /// - private void CheckState() - { - // There must be a valid and open connection. - if (connection == null) - Throw(new InvalidOperationException("Connection must be valid and open.")); - - if (connection.State != ConnectionState.Open && !connection.SoftClosed) - Throw(new InvalidOperationException("Connection must be valid and open.")); - - // Data readers have to be closed first - if (connection.IsInUse && !this.InternallyCreated) - Throw(new MySqlException("There is already an open DataReader associated with this Connection which must be closed first.")); - } - - /// - public override int ExecuteNonQuery() - { - int records = -1; - - // give our interceptors a shot at it first - if (connection?.commandInterceptor != null && connection.commandInterceptor.ExecuteNonQuery(CommandText, ref records)) - return records; - - // ok, none of our interceptors handled this so we default - using (MySqlDataReader reader = ExecuteReader()) - { - reader.Close(); - return reader.RecordsAffected; - } - } - - internal void ClearCommandTimer() - { - if (commandTimer == null) return; - - commandTimer.Dispose(); - commandTimer = null; - } - - internal void Close(MySqlDataReader reader) - { - statement?.Close(reader); - ResetSqlSelectLimit(); - if (statement != null) - connection?.driver?.CloseQuery(connection, statement.StatementId); - ClearCommandTimer(); - } - - /// - /// Reset reader to null, to avoid "There is already an open data reader" - /// on the next ExecuteReader(). Used in error handling scenarios. - /// - private void ResetReader() - { - if (connection?.Reader == null) return; - - connection.Reader.Close(); - connection.Reader = null; - } - - /// - /// Reset SQL_SELECT_LIMIT that could have been modified by CommandBehavior. - /// - internal void ResetSqlSelectLimit() - { - // if we are supposed to reset the sql select limit, do that here - if (!resetSqlSelect) return; - - resetSqlSelect = false; - MySqlCommand command = new MySqlCommand("SET SQL_SELECT_LIMIT=DEFAULT", connection); - command.InternallyCreated = true; - command.ExecuteNonQuery(); - } - - /// - public new MySqlDataReader ExecuteReader() - { - return ExecuteReader(CommandBehavior.Default); - } - - - /// - public new MySqlDataReader ExecuteReader(CommandBehavior behavior) - { - - // give our interceptors a shot at it first - MySqlDataReader interceptedReader = null; - if (connection?.commandInterceptor != null && connection.commandInterceptor.ExecuteReader(CommandText, behavior, ref interceptedReader)) - return interceptedReader; - - // interceptors didn't handle this so we fall through - bool success = false; - CheckState(); - Driver driver = connection.driver; - - cmdText = cmdText.Trim(); - if (String.IsNullOrEmpty(cmdText)) - Throw(new InvalidOperationException(Resources.CommandTextNotInitialized)); - - string sql = cmdText.Trim(';'); - -#if !NETCORE10 - // Load balancing getting a new connection - if (connection.hasBeenOpen && !driver.HasStatus(ServerStatusFlags.InTransaction)) - { - ReplicationManager.GetNewConnection(connection.Settings.Server, !IsReadOnlyCommand(sql), connection); - } -#endif - - lock (driver) - { - - // We have to recheck that there is no reader, after we got the lock - if (connection.Reader != null) - { - Throw(new MySqlException(Resources.DataReaderOpen)); - } - -#if !NETCORE10 - System.Transactions.Transaction curTrans = System.Transactions.Transaction.Current; - - if (curTrans != null) - { - bool inRollback = false; - //TODO: ADD support for 452 and 46X - if (driver.currentTransaction != null) - inRollback = driver.currentTransaction.InRollback; - if (!inRollback) - { - System.Transactions.TransactionStatus status = System.Transactions.TransactionStatus.InDoubt; - try - { - // in some cases (during state transitions) this throws - // an exception. Ignore exceptions, we're only interested - // whether transaction was aborted or not. - status = curTrans.TransactionInformation.Status; - } - catch (System.Transactions.TransactionException) - { - } - if (status == System.Transactions.TransactionStatus.Aborted) - Throw(new System.Transactions.TransactionAbortedException()); - } - } -#endif - - commandTimer = new CommandTimer(connection, CommandTimeout); - - LastInsertedId = -1; - - if (CommandType == CommandType.TableDirect) - sql = "SELECT * FROM " + sql; - else if (CommandType == CommandType.Text) - { - // validates single word statetment (maybe is a stored procedure call) - if (sql.IndexOf(" ") == -1) - { - if (AddCallStatement(sql)) - sql = "call " + sql; - } - } - - // if we are on a replicated connection, we are only allow readonly statements - if (connection.Settings.Replication && !InternallyCreated) - EnsureCommandIsReadOnly(sql); - - if (statement == null || !statement.IsPrepared) - { - if (CommandType == CommandType.StoredProcedure) - statement = new StoredProcedure(this, sql); - else - statement = new PreparableStatement(this, sql); - } - - // stored procs are the only statement type that need do anything during resolve - statement.Resolve(false); - - // Now that we have completed our resolve step, we can handle our - // command behaviors - HandleCommandBehaviors(behavior); - - try - { - MySqlDataReader reader = new MySqlDataReader(this, statement, behavior); - connection.Reader = reader; - Canceled = false; - // execute the statement - statement.Execute(); - // wait for data to return - reader.NextResult(); - success = true; - return reader; - } - catch (TimeoutException tex) - { - connection.HandleTimeoutOrThreadAbort(tex); - throw; //unreached - } -#if !NETCORE10 - catch (ThreadAbortException taex) - { - connection.HandleTimeoutOrThreadAbort(taex); - throw; - } -#endif - catch (IOException ioex) - { - connection.Abort(); // Closes connection without returning it to the pool - throw new MySqlException(Resources.FatalErrorDuringExecute, ioex); - } - catch (MySqlException ex) - { - - if (ex.InnerException is TimeoutException) - throw; // already handled - - try - { - ResetReader(); - ResetSqlSelectLimit(); - } - catch (Exception) - { - // Reset SqlLimit did not work, connection is hosed. - Connection.Abort(); - throw new MySqlException(ex.Message, true, ex); - } - - // if we caught an exception because of a cancel, then just return null - if (ex.IsQueryAborted) - return null; - if (ex.IsFatal) - Connection.Close(); - if (ex.Number == 0) - throw new MySqlException(Resources.FatalErrorDuringExecute, ex); - throw; - } - finally - { - if (connection != null) - { - if (connection.Reader == null) - { - // Something went seriously wrong, and reader would not - // be able to clear timeout on closing. - // So we clear timeout here. - ClearCommandTimer(); - } - if (!success) - { - // ExecuteReader failed.Close Reader and set to null to - // prevent subsequent errors with DataReaderOpen - ResetReader(); - } - } - } - } - } - - private void EnsureCommandIsReadOnly(string sql) - { - sql = StringUtility.ToLowerInvariant(sql); - if (!sql.StartsWith("select") && !sql.StartsWith("show")) - Throw(new MySqlException(Resources.ReplicatedConnectionsAllowOnlyReadonlyStatements)); - if (sql.EndsWith("for update") || sql.EndsWith("lock in share mode")) - Throw(new MySqlException(Resources.ReplicatedConnectionsAllowOnlyReadonlyStatements)); - } - - private bool IsReadOnlyCommand(string sql) - { - sql = sql.ToLower(); - return (sql.StartsWith("select") || sql.StartsWith("show")) - && !(sql.EndsWith("for update") || sql.EndsWith("lock in share mode")); - } - - - /// - public override object ExecuteScalar() - { - LastInsertedId = -1; - object val = null; - - // give our interceptors a shot at it first - if (connection != null && - connection.commandInterceptor.ExecuteScalar(CommandText, ref val)) - return val; - - using (MySqlDataReader reader = ExecuteReader()) - { - if (reader.Read()) - val = reader.GetValue(0); - } - - return val; - } - - private void HandleCommandBehaviors(CommandBehavior behavior) - { - if ((behavior & CommandBehavior.SchemaOnly) != 0) - { - new MySqlCommand("SET SQL_SELECT_LIMIT=0", connection).ExecuteNonQuery(); - resetSqlSelect = true; - } - else if ((behavior & CommandBehavior.SingleRow) != 0) - { - new MySqlCommand("SET SQL_SELECT_LIMIT=1", connection).ExecuteNonQuery(); - resetSqlSelect = true; - } - } - - /// - private void Prepare(int cursorPageSize) - { - using (new CommandTimer(Connection, CommandTimeout)) - { - // if the length of the command text is zero, then just return - string psSQL = CommandText; - if (psSQL == null || - psSQL.Trim().Length == 0) - return; - - statement = CommandType == CommandType.StoredProcedure ? new StoredProcedure(this, CommandText) : new PreparableStatement(this, CommandText); - - statement.Resolve(true); - statement.Prepare(); - } - } - - /// - public override void Prepare() - { - if (connection == null) - Throw(new InvalidOperationException("The connection property has not been set.")); - if (connection.State != ConnectionState.Open) - Throw(new InvalidOperationException("The connection is not open.")); - if (connection.Settings.IgnorePrepare) - return; - - Prepare(0); - } -#endregion - -#region Async Methods - //TODO: must review, perhaps can be updated to use async and awaits instead of the old fashion way - - internal delegate object AsyncDelegate(int type, CommandBehavior behavior); - internal AsyncDelegate Caller; - internal Exception thrownException; - - internal object AsyncExecuteWrapper(int type, CommandBehavior behavior) - { - thrownException = null; - try - { - if (type == 1) - return ExecuteReader(behavior); - return ExecuteNonQuery(); - } - catch (Exception ex) - { - thrownException = ex; - } - return null; - } - - /// - /// Initiates the asynchronous execution of the SQL statement or stored procedure - /// that is described by this , and retrieves one or more - /// result sets from the server. - /// - /// An that can be used to poll, wait for results, - /// or both; this value is also needed when invoking EndExecuteReader, - /// which returns a instance that can be used to retrieve - /// the returned rows. - public IAsyncResult BeginExecuteReader() - { - return BeginExecuteReader(CommandBehavior.Default); - } - - /// - /// Initiates the asynchronous execution of the SQL statement or stored procedure - /// that is described by this using one of the - /// CommandBehavior values. - /// - /// One of the values, indicating - /// options for statement execution and data retrieval. - /// An that can be used to poll, wait for results, - /// or both; this value is also needed when invoking EndExecuteReader, - /// which returns a instance that can be used to retrieve - /// the returned rows. - public IAsyncResult BeginExecuteReader(CommandBehavior behavior) - { - if (Caller != null) - Throw(new MySqlException(Resources.UnableToStartSecondAsyncOp)); - - Caller = AsyncExecuteWrapper; - asyncResult = Caller.BeginInvoke(1, behavior, null, null); - return asyncResult; - } - - /// - /// Finishes asynchronous execution of a SQL statement, returning the requested - /// . - /// - /// The returned by the call to - /// . - /// A MySqlDataReader object that can be used to retrieve the requested rows. - public MySqlDataReader EndExecuteReader(IAsyncResult result) - { - result.AsyncWaitHandle.WaitOne(); - AsyncDelegate c = Caller; - Caller = null; - if (thrownException != null) - throw thrownException; - return (MySqlDataReader)c.EndInvoke(result); - } - - /// - /// Initiates the asynchronous execution of the SQL statement or stored procedure - /// that is described by this . - /// - /// - /// An delegate that is invoked when the command's - /// execution has completed. Pass a null reference (Nothing in Visual Basic) - /// to indicate that no callback is required. - /// A user-defined state object that is passed to the - /// callback procedure. Retrieve this object from within the callback procedure - /// using the property. - /// An that can be used to poll or wait for results, - /// or both; this value is also needed when invoking , - /// which returns the number of affected rows. - public IAsyncResult BeginExecuteNonQuery(AsyncCallback callback, object stateObject) - { - if (Caller != null) - Throw(new MySqlException(Resources.UnableToStartSecondAsyncOp)); - - Caller = AsyncExecuteWrapper; - asyncResult = Caller.BeginInvoke(2, CommandBehavior.Default, - callback, stateObject); - return asyncResult; - } - - /// - /// Initiates the asynchronous execution of the SQL statement or stored procedure - /// that is described by this . - /// - /// An that can be used to poll or wait for results, - /// or both; this value is also needed when invoking , - /// which returns the number of affected rows. - public IAsyncResult BeginExecuteNonQuery() - { - if (Caller != null) - Throw(new MySqlException(Resources.UnableToStartSecondAsyncOp)); - - Caller = AsyncExecuteWrapper; - asyncResult = Caller.BeginInvoke(2, CommandBehavior.Default, null, null); - return asyncResult; - } - - /// - /// Finishes asynchronous execution of a SQL statement. - /// - /// The returned by the call - /// to . - /// - public int EndExecuteNonQuery(IAsyncResult asyncResult) - { - asyncResult.AsyncWaitHandle.WaitOne(); - AsyncDelegate c = Caller; - Caller = null; - if (thrownException != null) - throw thrownException; - return (int)c.EndInvoke(asyncResult); - } - -#endregion - -#region Private Methods - - /* private ArrayList PrepareSqlBuffers(string sql) - { - ArrayList buffers = new ArrayList(); - MySqlStreamWriter writer = new MySqlStreamWriter(new MemoryStream(), connection.Encoding); - writer.Version = connection.driver.Version; - - // if we are executing as a stored procedure, then we need to add the call - // keyword. - if (CommandType == CommandType.StoredProcedure) - { - if (storedProcedure == null) - storedProcedure = new StoredProcedure(this); - sql = storedProcedure.Prepare( CommandText ); - } - - // tokenize the SQL - sql = sql.TrimStart(';').TrimEnd(';'); - ArrayList tokens = TokenizeSql( sql ); - - foreach (string token in tokens) - { - if (token.Trim().Length == 0) continue; - if (token == ";" && ! connection.driver.SupportsBatch) - { - MemoryStream ms = (MemoryStream)writer.Stream; - if (ms.Length > 0) - buffers.Add( ms ); - - writer = new MySqlStreamWriter(new MemoryStream(), connection.Encoding); - writer.Version = connection.driver.Version; - continue; - } - else if (token[0] == parameters.ParameterMarker) - { - if (SerializeParameter(writer, token)) continue; - } - - // our fall through case is to write the token to the byte stream - writer.WriteStringNoNull(token); - } - - // capture any buffer that is left over - MemoryStream mStream = (MemoryStream)writer.Stream; - if (mStream.Length > 0) - buffers.Add( mStream ); - - return buffers; - }*/ - - internal long EstimatedSize() - { - return CommandText.Length + Parameters.Cast().Sum(parameter => parameter.EstimatedSize()); - } - - /// - /// Verifies if a query is valid even if it has not spaces or is a stored procedure call - /// - /// Query to validate - /// If it is necessary to add call statement - private bool AddCallStatement(string query) - { - if (string.IsNullOrEmpty(query)) return false; - - string keyword = query.ToUpper(); - int indexChar = keyword.IndexOfAny(new char[] { '(', '"', '@', '\'', '`' }); - if (indexChar > 0) - keyword = keyword.Substring(0, indexChar); - - if (keywords == null) - keywords = new List(Utils.ReadResource("keywords.txt").Replace("\r", "").Split('\n')); - - return !keywords.Contains(keyword); - } - -#endregion - -#region ICloneable - - /// - /// Creates a clone of this MySqlCommand object. CommandText, Connection, and Transaction properties - /// are included as well as the entire parameter list. - /// - /// The cloned MySqlCommand object - public MySqlCommand Clone() - { - MySqlCommand clone = new MySqlCommand(cmdText, connection, Transaction) - { - CommandType = CommandType, - commandTimeout = commandTimeout, - useDefaultTimeout = useDefaultTimeout, - BatchableCommandText = BatchableCommandText, - EnableCaching = EnableCaching, - CacheAge = CacheAge - }; - - PartialClone(clone); - - foreach (MySqlParameter p in Parameters) - { - clone.Parameters.Add(p.Clone()); - } - return clone; - } - - partial void PartialClone(MySqlCommand clone); - -#if !NETCORE10 - object System.ICloneable.Clone() - { - return Clone(); - } - -#endif -#endregion - -#region Batching support - - internal void AddToBatch(MySqlCommand command) - { - if (Batch == null) - Batch = new List(); - Batch.Add(command); - } - - internal string GetCommandTextForBatching() - { - if (BatchableCommandText == null) - { - // if the command starts with insert and is "simple" enough, then - // we can use the multi-value form of insert - if (String.Compare(CommandText.Substring(0, 6), "INSERT", StringComparison.OrdinalIgnoreCase) == 0) - { - MySqlCommand cmd = new MySqlCommand("SELECT @@sql_mode", Connection); - string sql_mode = StringUtility.ToUpperInvariant(cmd.ExecuteScalar().ToString()); - MySqlTokenizer tokenizer = new MySqlTokenizer(CommandText); - tokenizer.AnsiQuotes = sql_mode.IndexOf("ANSI_QUOTES") != -1; - tokenizer.BackslashEscapes = sql_mode.IndexOf("NO_BACKSLASH_ESCAPES") == -1; - string token = StringUtility.ToLowerInvariant(tokenizer.NextToken()); - while (token != null) - { - if (StringUtility.ToUpperInvariant(token) == "VALUES" && - !tokenizer.Quoted) - { - token = tokenizer.NextToken(); - Debug.Assert(token == "("); - - // find matching right paren, and ensure that parens - // are balanced. - int openParenCount = 1; - while (token != null) - { - BatchableCommandText += token; - token = tokenizer.NextToken(); - - if (token == "(") - openParenCount++; - else if (token == ")") - openParenCount--; - - if (openParenCount == 0) - break; - } - - if (token != null) - BatchableCommandText += token; - token = tokenizer.NextToken(); - if (token != null && (token == "," || - StringUtility.ToUpperInvariant(token) == "ON")) - { - BatchableCommandText = null; - break; - } - } - token = tokenizer.NextToken(); - } - } - // Otherwise use the command verbatim - else BatchableCommandText = CommandText; - } - - return BatchableCommandText; - } - -#endregion - - // This method is used to throw all exceptions from this class. - private void Throw(Exception ex) - { - connection?.Throw(ex); - throw ex; - } - - public new void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - protected override void Dispose(bool disposing) - { - if (disposed) - return; - - if (!disposing) - return; - - if (statement != null && statement.IsPrepared) - statement.CloseStatement(); - - ResetReader(); - - base.Dispose(disposing); - - disposed = true; - } - } -} - diff --git a/Source/MySql.Data/common/Cache.cs b/Source/MySql.Data/common/Cache.cs deleted file mode 100644 index e2e53f76f..000000000 --- a/Source/MySql.Data/common/Cache.cs +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Collections.Generic; - -namespace MySql.Data.Common -{ - internal class Cache - { - private readonly int _capacity; - private readonly Queue _keyQ; - private readonly Dictionary _contents; - - public Cache(int initialCapacity, int capacity) - { - _capacity = capacity; - _contents = new Dictionary(initialCapacity); - - if (capacity > 0) - _keyQ = new Queue(initialCapacity); - } - - public TValueType this[TKeyType key] - { - get - { - TValueType val; - if (_contents.TryGetValue(key, out val)) - return val; - else - return default(TValueType); - } - set { InternalAdd(key, value); } - } - - public void Add(TKeyType key, TValueType value) - { - InternalAdd(key, value); - } - - private void InternalAdd(TKeyType key, TValueType value) - { - if (!_contents.ContainsKey(key)) - { - - if (_capacity > 0) - { - _keyQ.Enqueue(key); - - if (_keyQ.Count > _capacity) - _contents.Remove(_keyQ.Dequeue()); - } - } - - _contents[key] = value; - } - } -} diff --git a/Source/MySql.Data/common/LowResolutionStopwatch.cs b/Source/MySql.Data/common/LowResolutionStopwatch.cs deleted file mode 100644 index 8ba5d23c6..000000000 --- a/Source/MySql.Data/common/LowResolutionStopwatch.cs +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright © 2009, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; - -namespace MySql.Data.Common -{ - /// - /// This class is modeled after .NET Stopwatch. It provides better - /// performance (no system calls).It is however less precise than - /// .NET Stopwatch, measuring in milliseconds. It is adequate to use - /// when high-precision is not required (e.g for measuring IO timeouts), - /// but not for other tasks. - /// - internal class LowResolutionStopwatch - { - long _startTime; - public static readonly long Frequency = 1000; // measure in milliseconds - public static readonly bool IsHighResolution = false; - - public LowResolutionStopwatch() - { - ElapsedMilliseconds = 0; - } - public long ElapsedMilliseconds { get; private set; } - - public void Start() - { - _startTime = Environment.TickCount; - } - - public void Stop() - { - long now = Environment.TickCount; - // Calculate time different, handle possible overflow - long elapsed = (now < _startTime) ? Int32.MaxValue - _startTime + now : now - _startTime; - ElapsedMilliseconds += elapsed; - } - - public void Reset() - { - ElapsedMilliseconds = 0; - _startTime = 0; - } - - public TimeSpan Elapsed => new TimeSpan(0, 0, 0, 0, (int)ElapsedMilliseconds); - - public static LowResolutionStopwatch StartNew() - { - LowResolutionStopwatch sw = new LowResolutionStopwatch(); - sw.Start(); - return sw; - } - - public static long GetTimestamp() - { - return Environment.TickCount; - } - - bool IsRunning() - { - return (_startTime != 0); - } - } -} diff --git a/Source/MySql.Data/common/MyNetworkStream.cs b/Source/MySql.Data/common/MyNetworkStream.cs deleted file mode 100644 index e65ef4fe2..000000000 --- a/Source/MySql.Data/common/MyNetworkStream.cs +++ /dev/null @@ -1,395 +0,0 @@ -// Copyright � 2009, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Net; -using System.Net.Sockets; -using System.Reflection; -using System.Threading.Tasks; -using MySql.Data.MySqlClient; - -namespace MySql.Data.Common -{ - internal class MyNetworkStream : NetworkStream - { - /// - /// Wrapper around NetworkStream. - /// - /// MyNetworkStream is equivalent to NetworkStream, except - /// 1. It throws TimeoutException if read or write timeout occurs, instead - /// of IOException, to match behavior of other streams (named pipe and - /// shared memory). This property comes handy in TimedStream. - /// - /// 2. It implements workarounds for WSAEWOULDBLOCK errors, that can start - /// occuring after stream has times out. For a discussion about the CLR bug, - /// refer to http://tinyurl.com/lhgpyf. This error should never occur, as - /// we're not using asynchronous operations, but apparerntly it does occur - /// directly after timeout has expired. - /// The workaround is hinted in the URL above and implemented like this: - /// For each IO operation, if it throws WSAEWOULDBLOCK, we explicitely set - /// the socket to Blocking and retry the operation once again. - /// - private const int MaxRetryCount = 2; - - readonly Socket _socket; - - public MyNetworkStream(Socket socket, bool ownsSocket) - : base(socket, ownsSocket) - { - this._socket = socket; - } - - private static bool IsTimeoutException(SocketException e) - { - return (e.SocketErrorCode == SocketError.TimedOut); - } - - private static bool IsWouldBlockException(SocketException e) - { - return (e.SocketErrorCode == SocketError.WouldBlock); - } - - - private void HandleOrRethrowException(Exception e) - { - Exception currentException = e; - while (currentException != null) - { - if (currentException is SocketException) - { - SocketException socketException = (SocketException)currentException; - if (IsWouldBlockException(socketException)) - { - // Workaround for WSAEWOULDBLOCK - _socket.Blocking = true; - // return to give the caller possibility to retry the call - return; - } - if (IsTimeoutException(socketException)) - { - return; - //throw new TimeoutException(socketException.Message, e); - } - } - currentException = currentException.InnerException; - } - throw (e); - } - - - public override int Read(byte[] buffer, int offset, int count) - { - int retry = 0; - Exception exception = null; - do - { - try - { - return base.Read(buffer, offset, count); - } - catch (Exception e) - { - exception = e; - HandleOrRethrowException(e); - } - } - while (++retry < MaxRetryCount); - if (exception.GetBaseException() is SocketException - && IsTimeoutException((SocketException)exception.GetBaseException())) - throw new TimeoutException(exception.Message, exception); - throw exception; - } - - public override int ReadByte() - { - int retry = 0; - Exception exception = null; - do - { - try - { - return base.ReadByte(); - } - catch (Exception e) - { - exception = e; - HandleOrRethrowException(e); - } - } - while (++retry < MaxRetryCount); - throw exception; - } - - public override void Write(byte[] buffer, int offset, int count) - { - int retry = 0; - Exception exception = null; - do - { - try - { - base.Write(buffer, offset, count); - return; - } - catch (Exception e) - { - exception = e; - HandleOrRethrowException(e); - } - } - while (++retry < MaxRetryCount); - throw exception; - } - - public override void Flush() - { - int retry = 0; - Exception exception = null; - do - { - try - { - base.Flush(); - return; - } - catch (Exception e) - { - exception = e; - HandleOrRethrowException(e); - } - } - while (++retry < MaxRetryCount); - throw exception; - } - - #region Create Code - -#if !NETCORE10 - public static MyNetworkStream CreateStream(MySqlConnectionStringBuilder settings, bool unix) - { - MyNetworkStream stream = null; - IPHostEntry ipHE = GetHostEntry(settings.Server); - foreach (IPAddress address in ipHE.AddressList) - { - try - { - stream = CreateSocketStream(settings, address, unix); - if (stream != null) break; - } - catch (Exception ex) - { - SocketException socketException = ex as SocketException; - // if the exception is a ConnectionRefused then we eat it as we may have other address - // to attempt - if (socketException == null) throw; - if (socketException.SocketErrorCode != SocketError.ConnectionRefused) throw; - } - } - return stream; - } -#endif - - public static async Task CreateStreamAsync(MySqlConnectionStringBuilder settings, bool unix) - { - MyNetworkStream stream = null; - IPHostEntry ipHE = await GetHostEntryAsync(settings.Server); - foreach (IPAddress address in ipHE.AddressList) - { - try - { - stream = CreateSocketStream(settings, address, unix); - if (stream != null) break; - } - catch(Exception ex) - { - SocketException socketException = ex.GetBaseException() as SocketException; - // if the exception is a ConnectionRefused then we eat it as we may have other address - // to attempt - if (socketException == null) throw; - if (socketException.SocketErrorCode != SocketError.ConnectionRefused) throw; - } - } - return stream; - } - - private static IPHostEntry ParseIPAddress(string hostname) - { - IPHostEntry ipHE = null; - IPAddress addr; - if (IPAddress.TryParse(hostname, out addr)) - { - ipHE = new IPHostEntry(); - ipHE.AddressList = new IPAddress[1]; - ipHE.AddressList[0] = addr; - } - return ipHE; - } - -#if !NETCORE10 - private static IPHostEntry GetHostEntry(string hostname) - { - IPHostEntry ipHE = ParseIPAddress(hostname); - if (ipHE != null) return ipHE; - return Dns.GetHostEntry(hostname); - } -#endif - - private static async Task GetHostEntryAsync(string hostname) - { - IPHostEntry ipHE = ParseIPAddress(hostname); - if (ipHE != null) return ipHE; - - return await Dns.GetHostEntryAsync(hostname); - } - - #if !NETCORE10 - private static EndPoint CreateUnixEndPoint(string host) - { - // first we need to load the Mono.posix assembly - Assembly a = Assembly.Load(@"Mono.Posix, Version=2.0.0.0, - Culture=neutral, PublicKeyToken=0738eb9f132ed756"); - - - // then we need to construct a UnixEndPoint object - EndPoint ep = (EndPoint)a.CreateInstance("Mono.Posix.UnixEndPoint", - false, BindingFlags.CreateInstance, null, - new object[1] { host }, null, null); - return ep; - } -#endif - - private static MyNetworkStream CreateSocketStream(MySqlConnectionStringBuilder settings, IPAddress ip, bool unix) - { - EndPoint endPoint; -#if !NETCORE10 - if (!Platform.IsWindows() && unix) - { - endPoint = CreateUnixEndPoint(settings.Server); - //endPoint = new DnsEndPoint(settings.Server, (int)settings.Port); - } - else - { -#endif - endPoint = new IPEndPoint(ip, (int)settings.Port); -#if !NETCORE10 - } -#endif - - Socket socket = unix ? - new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.IP) : - new Socket(ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp); - if (settings.Keepalive > 0) - { - SetKeepAlive(socket, settings.Keepalive); - } - -#if NETCORE10 - try - { - Task ias = socket.ConnectAsync(endPoint); - if (!ias.Wait(((int)settings.ConnectionTimeout * 1000))) - { - socket.Dispose(); - } - } - catch (Exception) - { - socket.Dispose(); - throw; - } -#else - IAsyncResult ias = socket.BeginConnect(endPoint, null, null); - - if (!ias.AsyncWaitHandle.WaitOne((int)settings.ConnectionTimeout * 1000, false)) - { - socket.Close(); - } - try - { - socket.EndConnect(ias); - } - catch (Exception) - { - socket.Close(); - throw; - } -#endif - - MyNetworkStream stream = new MyNetworkStream(socket, true); - GC.SuppressFinalize(socket); - GC.SuppressFinalize(stream); - return stream; - } - - - - /// - /// Set keepalive + timeout on socket. - /// - /// socket - /// keepalive timeout, in seconds - private static void SetKeepAlive(Socket s, uint time) - { - uint on = 1; - uint interval = 1000; // default interval = 1 sec - - uint timeMilliseconds; - if (time > UInt32.MaxValue / 1000) - timeMilliseconds = UInt32.MaxValue; - else - timeMilliseconds = time * 1000; - - // Use Socket.IOControl to implement equivalent of - // WSAIoctl with SOL_KEEPALIVE_VALS - - // the native structure passed to WSAIoctl is - //struct tcp_keepalive { - // ULONG onoff; - // ULONG keepalivetime; - // ULONG keepaliveinterval; - //}; - // marshal the equivalent of the native structure into a byte array - - byte[] inOptionValues = new byte[12]; - BitConverter.GetBytes(on).CopyTo(inOptionValues, 0); - BitConverter.GetBytes(timeMilliseconds).CopyTo(inOptionValues, 4); - BitConverter.GetBytes(interval).CopyTo(inOptionValues, 8); - try - { - // call WSAIoctl via IOControl - s.IOControl(IOControlCode.KeepAliveValues, inOptionValues, null); - return; - } - catch (NotImplementedException) - { - // Mono throws not implemented currently - } - // Fallback if Socket.IOControl is not available ( Compact Framework ) - // or not implemented ( Mono ). Keepalive option will still be set, but - // with timeout is kept default. - s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, 1); - } - -#endregion - - } -} \ No newline at end of file diff --git a/Source/MySql.Data/common/NativeMethods.cs b/Source/MySql.Data/common/NativeMethods.cs deleted file mode 100644 index e4b5fd9f1..000000000 --- a/Source/MySql.Data/common/NativeMethods.cs +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright (c) 2004-2008 MySQL AB, 2008-2009 Sun Microsystems, Inc. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Runtime.InteropServices; -using System.Threading; - -namespace MySql.Data.Common -{ - internal class NativeMethods - { - // Keep the compiler from generating a default ctor - private NativeMethods() - { - } - - //Constants for dwDesiredAccess: - public const UInt32 GENERIC_READ = 0x80000000; - public const UInt32 GENERIC_WRITE = 0x40000000; - - //Constants for return value: - public const Int32 INVALIDpipeHandle_VALUE = -1; - - //Constants for dwFlagsAndAttributes: - public const UInt32 FILE_FLAG_OVERLAPPED = 0x40000000; - public const UInt32 FILE_FLAG_NO_BUFFERING = 0x20000000; - - //Constants for dwCreationDisposition: - public const UInt32 OPEN_EXISTING = 3; - - [StructLayout(LayoutKind.Sequential)] - public class SecurityAttributes - { - public SecurityAttributes() - { - Length = Marshal.SizeOf(typeof(SecurityAttributes)); - } - public int Length; - public IntPtr securityDescriptor = IntPtr.Zero; - public bool inheritHandle; - } - - [DllImport("Kernel32", CharSet = CharSet.Unicode)] - static extern public IntPtr CreateFile( - String fileName, - uint desiredAccess, - uint shareMode, - SecurityAttributes securityAttributes, - uint creationDisposition, - uint flagsAndAttributes, - uint templateFile); - - [return: MarshalAs(UnmanagedType.Bool)] - [DllImport("kernel32.dll", EntryPoint = "PeekNamedPipe", SetLastError = true)] - static extern public bool PeekNamedPipe(IntPtr handle, - byte[] buffer, - uint nBufferSize, - ref uint bytesRead, - ref uint bytesAvail, - ref uint BytesLeftThisMessage); - - [return: MarshalAs(UnmanagedType.Bool)] - [DllImport("kernel32.dll", SetLastError = true)] - static extern public bool ReadFile(IntPtr hFile, [Out] byte[] lpBuffer, uint nNumberOfBytesToRead, - out uint lpNumberOfBytesRead, IntPtr lpOverlapped); - - [return: MarshalAs(UnmanagedType.Bool)] - [DllImport("Kernel32")] - public static extern bool WriteFile(IntPtr hFile, [In]byte[] buffer, - uint numberOfBytesToWrite, out uint numberOfBytesWritten, IntPtr lpOverlapped); - - [return: MarshalAs(UnmanagedType.Bool)] - [DllImport("kernel32.dll", SetLastError = true)] - public static extern bool CloseHandle(IntPtr handle); - - [return: MarshalAs(UnmanagedType.Bool)] - [DllImport("kernel32.dll", SetLastError = true)] - public static extern bool CancelIo(IntPtr handle); - - [return: MarshalAs(UnmanagedType.Bool)] - [DllImport("kernel32.dll", SetLastError = true)] - public static extern bool FlushFileBuffers(IntPtr handle); - - [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] - public static extern IntPtr OpenEvent(uint dwDesiredAccess, - [MarshalAs(UnmanagedType.Bool)]bool bInheritHandle, - string lpName); - - [DllImport("kernel32.dll", CharSet = CharSet.Unicode)] - public static extern IntPtr OpenFileMapping(uint dwDesiredAccess, - [MarshalAs(UnmanagedType.Bool)]bool bInheritHandle, - string lpName); - - [DllImport("kernel32.dll")] - public static extern IntPtr MapViewOfFile(IntPtr hFileMappingObject, uint - dwDesiredAccess, uint dwFileOffsetHigh, uint dwFileOffsetLow, - IntPtr dwNumberOfBytesToMap); - - [DllImport("kernel32.dll")] - [return: MarshalAs(UnmanagedType.Bool)] - public static extern bool UnmapViewOfFile(IntPtr lpBaseAddress); - - [DllImport("kernel32.dll", SetLastError = true)] - public static extern int FlushViewOfFile(IntPtr address, uint numBytes); - - [DllImport("kernel32.dll", SetLastError = true)] - public static extern bool WaitNamedPipe(string namedPipeName, uint timeOut); - #region Winsock functions - - // SOcket routines - [DllImport("ws2_32.dll", SetLastError = true)] - static extern public IntPtr socket(int af, int type, int protocol); - - [DllImport("ws2_32.dll", SetLastError = true)] - static extern public int ioctlsocket(IntPtr socket, uint cmd, ref UInt32 arg); - - [DllImport("ws2_32.dll", SetLastError = true)] - public static extern int WSAIoctl(IntPtr s, uint dwIoControlCode, byte[] inBuffer, uint cbInBuffer, - byte[] outBuffer, uint cbOutBuffer, IntPtr lpcbBytesReturned, IntPtr lpOverlapped, - IntPtr lpCompletionRoutine); - - [DllImport("ws2_32.dll", SetLastError = true)] - static extern public int WSAGetLastError(); - - [DllImport("ws2_32.dll", SetLastError = true)] - static extern public int connect(IntPtr socket, byte[] addr, int addrlen); - - [DllImport("ws2_32.dll", SetLastError = true)] - static extern public int recv(IntPtr socket, byte[] buff, int len, int flags); - - [DllImport("ws2_32.Dll", SetLastError = true)] - static extern public int send(IntPtr socket, byte[] buff, int len, int flags); - - #endregion - - } -} diff --git a/Source/MySql.Data/common/Platform.cs b/Source/MySql.Data/common/Platform.cs deleted file mode 100644 index 7af51a86d..000000000 --- a/Source/MySql.Data/common/Platform.cs +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.IO; -using System.Runtime.InteropServices; - -namespace MySql.Data.Common -{ - internal class Platform - { - private static bool _inited; - private static bool _isMono; - - /// - /// By creating a private ctor, we keep the compiler from creating a default ctor - /// - private Platform() - { - } - - public static bool IsWindows() - { -#if NETCORE10 - return RuntimeInformation.IsOSPlatform(OSPlatform.Windows); -#else - OperatingSystem os = Environment.OSVersion; - switch (os.Platform) - { - case PlatformID.Win32NT: - case PlatformID.Win32S: - case PlatformID.Win32Windows: - return true; - } - return false; -#endif - } - - - public static bool IsMono() - { - if (!_inited) - Init(); - return _isMono; - } - - private static void Init() - { - _inited = true; - Type t = Type.GetType("Mono.Runtime"); - _isMono = t != null; - } - - public static bool IsDotNetCore() - { -#if NETCORE10 - return true; -#else - return false; -#endif - } - } -} diff --git a/Source/MySql.Data/common/SHA1.cs b/Source/MySql.Data/common/SHA1.cs deleted file mode 100644 index 3ca8fca26..000000000 --- a/Source/MySql.Data/common/SHA1.cs +++ /dev/null @@ -1,311 +0,0 @@ -// Copyright (c) 2004-2008 MySQL AB, 2008-2009 Sun Microsystems, Inc. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -/* - Original Source from: http://www.faqs.org/rfcs/rfc3174.html - - Copyright (C) The Internet Society (2001). All Rights Reserved. - - This document and translations of it may be copied and furnished to - others, and derivative works that comment on or otherwise explain it - or assist in its implementation may be prepared, copied, published - and distributed, in whole or in part, without restriction of any - kind, provided that the above copyright notice and this paragraph are - included on all such copies and derivative works. However, this - document itself may not be modified in any way, such as by removing - the copyright notice or references to the Internet Society or other - Internet organizations, except as needed for the purpose of - developing Internet standards in which case the procedures for - copyrights defined in the Internet Standards process must be - followed, or as required to translate it into languages other than - English. - - The limited permissions granted above are perpetual and will not be - revoked by the Internet Society or its successors or assigns. - - This document and the information contained herein is provided on an - "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING - TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING - BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION - HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF - MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - - Acknowledgement - Funding for the RFC Editor function is currently provided by the - Internet Society. -*/ - -using System; - -namespace MySql.Data.Common -{ - class SHA1Hash - { - private const int SHA1_HASH_SIZE = 20; // Hash size in bytes - - // Constants defined in SHA-1 - private static uint[] K = new uint[4] { - 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xCA62C1D6 }; - - private static uint[] sha_const_key = new uint[5] { - 0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0 }; - - private ulong length; // Message length in bits - private uint[] intermediateHash; // Message Digest - private bool computed; // Is the digest computed? -// private bool corrupted; // Is the message digest corrupted? - private short messageBlockIndex; // Index into message block array - private byte[] messageBlock; // 512-bit message blocks - - public SHA1Hash() - { - intermediateHash = new uint[SHA1_HASH_SIZE/4]; - messageBlock = new byte[64]; - Reset(); - } - - public void Reset() - { -/*#ifndef DBUG_OFF - if (!context) - return SHA_NULL; -#endif*/ - - length = 0; - messageBlockIndex = 0; - - intermediateHash[0] = sha_const_key[0]; - intermediateHash[1] = sha_const_key[1]; - intermediateHash[2] = sha_const_key[2]; - intermediateHash[3] = sha_const_key[3]; - intermediateHash[4] = sha_const_key[4]; - - computed = false; -// corrupted = false; - } - - public byte[] ComputeHash(byte[] buffer) - { - Reset(); - Input(buffer, 0, buffer.Length); - return Result(); - } - - public void Input(byte[] buffer, int index, int bufLen) - { - if (buffer == null || bufLen == 0) return; - - if (index < 0 || index > buffer.Length - 1) - throw new ArgumentException("Index must be a value between 0 and buffer.Length-1", "index"); - if (bufLen < 0) - throw new ArgumentException("Length must be a value > 0", "length"); - if ((bufLen+index) > buffer.Length) - throw new ArgumentException("Length + index would extend past the end of buffer", "length"); - -/*#ifndef DBUG_OFF - // We assume client konows what it is doing in non-debug mode - if (!context || !message_array) - return SHA_NULL; - if (context->Computed) - return (context->Corrupted= SHA_STATE_ERROR); - if (context->Corrupted) - return context->Corrupted; -#endif*/ - - while (bufLen-- > 0) - { - messageBlock[messageBlockIndex++] = (byte)(buffer[index++] & 0xFF); - length += 8; /* Length is in bits */ - -/*#ifndef DBUG_OFF - - // Then we're not debugging we assume we never will get message longer - //2^64 bits. - - if (context->Length == 0) - return (context->Corrupted= 1); // Message is too long -#endif*/ - - if (messageBlockIndex == 64) - ProcessMessageBlock(); - } - } - - private void ProcessMessageBlock() - { - uint temp; // Temporary word value - uint[] W; // Word sequence - uint A, B, C, D, E; // Word buffers - - W = new uint[80]; - - //Initialize the first 16 words in the array W - for (int t = 0; t < 16; t++) - { - int index=t*4; - W[t] = (uint)messageBlock[index] << 24; - W[t] |= (uint)messageBlock[index + 1] << 16; - W[t] |= (uint)messageBlock[index + 2] << 8; - W[t] |= (uint)messageBlock[index + 3]; - } - - - for (int t = 16; t < 80; t++) - { - W[t] = CircularShift(1, W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]); - } - - A = intermediateHash[0]; - B = intermediateHash[1]; - C = intermediateHash[2]; - D = intermediateHash[3]; - E = intermediateHash[4]; - - for (int t = 0; t < 20; t++) - { - temp= CircularShift(5, A) + ((B & C) | ((~B) & D)) + E + W[t] + K[0]; - E = D; - D = C; - C = CircularShift(30, B); - B = A; - A = temp; - } - - for (int t = 20; t < 40; t++) - { - temp = CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[1]; - E = D; - D = C; - C = CircularShift(30,B); - B = A; - A = temp; - } - - for (int t = 40; t < 60; t++) - { - temp= (CircularShift(5,A) + ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2]); - E = D; - D = C; - C = CircularShift(30,B); - B = A; - A = temp; - } - - for (int t = 60; t < 80; t++) - { - temp = CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[3]; - E = D; - D = C; - C = CircularShift(30,B); - B = A; - A = temp; - } - - intermediateHash[0] += A; - intermediateHash[1] += B; - intermediateHash[2] += C; - intermediateHash[3] += D; - intermediateHash[4] += E; - - messageBlockIndex = 0; - } - - private static uint CircularShift(int bits, uint word) - { - return (((word) << (bits)) | ((word) >> (32-(bits)))); - } - - private void PadMessage() - { - /* - Check to see if the current message block is too small to hold - the initial padding bits and length. If so, we will pad the - block, process it, and then continue padding into a second - block. - */ - - int i = messageBlockIndex; - - if (i > 55) - { - messageBlock[i++] = 0x80; - Array.Clear(messageBlock, i, 64-i); - //bzero((char*) &context->Message_Block[i], sizeof(messageBlock[0])*(64-i)); - messageBlockIndex = 64; - - /* This function sets messageBlockIndex to zero */ - ProcessMessageBlock(); - - Array.Clear(messageBlock, 0, 56); - //bzero((char*) &context->Message_Block[0], sizeof(messageBlock[0])*56); - messageBlockIndex = 56; - } - else - { - messageBlock[i++] = 0x80; - Array.Clear(messageBlock, i, 56-i); - //bzero((char*) &messageBlock[i], sizeof(messageBlock[0])*(56-i)); - messageBlockIndex = 56; - } - - // Store the message length as the last 8 octets - messageBlock[56] = (byte)(length >> 56); - messageBlock[57] = (byte)(length >> 48); - messageBlock[58] = (byte)(length >> 40); - messageBlock[59] = (byte)(length >> 32); - messageBlock[60] = (byte)(length >> 24); - messageBlock[61] = (byte)(length >> 16); - messageBlock[62] = (byte)(length >> 8); - messageBlock[63] = (byte)length; - - ProcessMessageBlock(); - } - - public byte[] Result() - { -/*#ifndef DBUG_OFF - if (!context || !Message_Digest) - return SHA_NULL; - - if (context->Corrupted) - return context->Corrupted; -#endif*/ - - if (!computed) - { - PadMessage(); - - // message may be sensitive, clear it out - Array.Clear(messageBlock, 0, 64); - //bzero((char*) messageBlock,64); - length = 0; /* and clear length */ - computed = true; - } - - byte[] messageDigest = new byte[SHA1_HASH_SIZE]; - for (int i = 0; i < SHA1_HASH_SIZE; i++) - messageDigest[i] = (byte)((intermediateHash[i>>2] >> 8 * ( 3 - ( i & 0x03 ) ))); - return messageDigest; - } - - } -} diff --git a/Source/MySql.Data/common/SharedMemoryStream.cs b/Source/MySql.Data/common/SharedMemoryStream.cs deleted file mode 100644 index 255cf4647..000000000 --- a/Source/MySql.Data/common/SharedMemoryStream.cs +++ /dev/null @@ -1,362 +0,0 @@ -// Copyright (c) 2004-2008 MySQL AB, 2008-2009 Sun Microsystems, Inc. 2014, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Runtime.InteropServices; -using System.Threading; -using System.IO; -using MySql.Data.MySqlClient; -using System.Diagnostics; - - -namespace MySql.Data.Common -{ -#if !PocketPC - - /// - /// Helper class to encapsulate shared memory functionality - /// Also cares of proper cleanup of file mapping object and cew - /// - internal class SharedMemory : IDisposable - { - private const uint FILE_MAP_WRITE = 0x0002; - - IntPtr fileMapping; - IntPtr view; - - public SharedMemory(string name, IntPtr size) - { - fileMapping = NativeMethods.OpenFileMapping(FILE_MAP_WRITE, false, - name); - if (fileMapping == IntPtr.Zero) - { - throw new MySqlException("Cannot open file mapping " + name); - } - view = NativeMethods.MapViewOfFile(fileMapping, FILE_MAP_WRITE, 0, 0, size); - } - - #region Destructor - ~SharedMemory() - { - Dispose(false); - } - #endregion - - public IntPtr View - { - get { return view; } - } - - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - - protected virtual void Dispose(bool disposing) - { - if (disposing) - { - if (view != IntPtr.Zero) - { - NativeMethods.UnmapViewOfFile(view); - view = IntPtr.Zero; - } - if (fileMapping != IntPtr.Zero) - { - // Free the handle - NativeMethods.CloseHandle(fileMapping); - fileMapping = IntPtr.Zero; - } - } - } - - } - /// - /// Summary description for SharedMemoryStream. - /// - internal class SharedMemoryStream : Stream - { - private string memoryName; - private EventWaitHandle serverRead; - private EventWaitHandle serverWrote; - private EventWaitHandle clientRead; - private EventWaitHandle clientWrote; - private EventWaitHandle connectionClosed; - private SharedMemory data; - private int bytesLeft; - private int position; - private int connectNumber; - - private const int BUFFERLENGTH = 16004; - - private int readTimeout = System.Threading.Timeout.Infinite; - private int writeTimeout = System.Threading.Timeout.Infinite; - - public SharedMemoryStream(string memName) - { - memoryName = memName; - } - - public void Open(uint timeOut) - { - if (connectionClosed != null) - { - Debug.Assert(false, "Connection is already open"); - } - - GetConnectNumber(timeOut); - SetupEvents(); - } - - public override void Close() - { - if (connectionClosed != null) - { - bool isClosed = connectionClosed.WaitOne(0); - if (!isClosed) - { - connectionClosed.Set(); - connectionClosed.Close(); - } - connectionClosed = null; - EventWaitHandle[] handles = { serverRead, serverWrote, clientRead, clientWrote }; - - for (int i = 0; i < handles.Length; i++) - { - if (handles[i] != null) - handles[i].Close(); - } - if (data != null) - { - data.Dispose(); - data = null; - } - } - } - - private void GetConnectNumber(uint timeOut) - { - EventWaitHandle connectRequest; - try - { - connectRequest = - EventWaitHandle.OpenExisting(memoryName + "_CONNECT_REQUEST"); - - } - catch (Exception) - { - // If server runs as service, its shared memory is global - // And if connector runs in user session, it needs to prefix - // shared memory name with "Global\" - string prefixedMemoryName = @"Global\" + memoryName; - connectRequest = - EventWaitHandle.OpenExisting(prefixedMemoryName + "_CONNECT_REQUEST"); - memoryName = prefixedMemoryName; - } - EventWaitHandle connectAnswer = - EventWaitHandle.OpenExisting(memoryName + "_CONNECT_ANSWER"); - using (SharedMemory connectData = - new SharedMemory(memoryName + "_CONNECT_DATA", (IntPtr)4)) - { - // now start the connection - if (!connectRequest.Set()) - throw new MySqlException("Failed to open shared memory connection"); - if (!connectAnswer.WaitOne((int)(timeOut * 1000), false)) - throw new MySqlException("Timeout during connection"); - connectNumber = Marshal.ReadInt32(connectData.View); - } - } - - - private void SetupEvents() - { - string prefix = memoryName + "_" + connectNumber; - data = new SharedMemory(prefix + "_DATA", (IntPtr)BUFFERLENGTH); - serverWrote = EventWaitHandle.OpenExisting(prefix + "_SERVER_WROTE"); - serverRead = EventWaitHandle.OpenExisting(prefix + "_SERVER_READ"); - clientWrote = EventWaitHandle.OpenExisting(prefix + "_CLIENT_WROTE"); - clientRead = EventWaitHandle.OpenExisting(prefix + "_CLIENT_READ"); - connectionClosed = EventWaitHandle.OpenExisting(prefix + "_CONNECTION_CLOSED"); - - // tell the server we are ready - serverRead.Set(); - } - - #region Properties - public override bool CanRead - { - get { return true; } - } - - public override bool CanSeek - { - get { return false; } - } - - public override bool CanWrite - { - get { return true; } - } - - public override long Length - { - get { throw new NotSupportedException("SharedMemoryStream does not support seeking - length"); } - } - - public override long Position - { - get { throw new NotSupportedException("SharedMemoryStream does not support seeking - position"); } - set { } - } - - #endregion - - public override void Flush() - { - // No need to flush anything to disk ,as our shared memory is backed - // by the page file - } - - public override int Read(byte[] buffer, int offset, int count) - { - int timeLeft = readTimeout; - WaitHandle[] waitHandles = { serverWrote, connectionClosed }; - LowResolutionStopwatch stopwatch = new LowResolutionStopwatch(); - while (bytesLeft == 0) - { - stopwatch.Start(); - int index = WaitHandle.WaitAny(waitHandles, timeLeft); - stopwatch.Stop(); - if (index == WaitHandle.WaitTimeout) - throw new TimeoutException("Timeout when reading from shared memory"); - - if (waitHandles[index] == connectionClosed) - throw new MySqlException("Connection to server lost", true, null); - - if (readTimeout != System.Threading.Timeout.Infinite) - { - timeLeft = readTimeout - (int)stopwatch.ElapsedMilliseconds; - if (timeLeft < 0) - throw new TimeoutException("Timeout when reading from shared memory"); - } - - bytesLeft = Marshal.ReadInt32(data.View); - position = 4; - } - - int len = Math.Min(count, bytesLeft); - long baseMem = data.View.ToInt64() + position; - - for (int i = 0; i < len; i++, position++) - buffer[offset + i] = Marshal.ReadByte((IntPtr)(baseMem + i)); - - bytesLeft -= len; - if (bytesLeft == 0) - clientRead.Set(); - - return len; - } - - public override long Seek(long offset, SeekOrigin origin) - { - throw new NotSupportedException("SharedMemoryStream does not support seeking"); - } - - public override void Write(byte[] buffer, int offset, int count) - { - int leftToDo = count; - int buffPos = offset; - WaitHandle[] waitHandles = { serverRead, connectionClosed }; - LowResolutionStopwatch stopwatch = new LowResolutionStopwatch(); - int timeLeft = writeTimeout; - - while (leftToDo > 0) - { - stopwatch.Start(); - int index = WaitHandle.WaitAny(waitHandles, timeLeft); - stopwatch.Stop(); - - if (waitHandles[index] == connectionClosed) - throw new MySqlException("Connection to server lost", true, null); - - if (index == WaitHandle.WaitTimeout) - throw new TimeoutException("Timeout when reading from shared memory"); - - if (writeTimeout != System.Threading.Timeout.Infinite) - { - timeLeft = writeTimeout - (int)stopwatch.ElapsedMilliseconds; - if (timeLeft < 0) - throw new TimeoutException("Timeout when writing to shared memory"); - } - int bytesToDo = Math.Min(leftToDo, BUFFERLENGTH); - long baseMem = data.View.ToInt64() + 4; - Marshal.WriteInt32(data.View, bytesToDo); - Marshal.Copy(buffer, buffPos, (IntPtr)baseMem, bytesToDo); - buffPos += bytesToDo; - leftToDo -= bytesToDo; - if (!clientWrote.Set()) - throw new MySqlException("Writing to shared memory failed"); - } - } - - public override void SetLength(long value) - { - throw new NotSupportedException("SharedMemoryStream does not support seeking"); - } - - public override bool CanTimeout - { - get - { - return true; - } - } - - public override int ReadTimeout - { - get - { - return readTimeout; - } - set - { - readTimeout = value; - } - } - - public override int WriteTimeout - { - get - { - return writeTimeout; - } - set - { - writeTimeout = value; - } - } - - } -#endif -} diff --git a/Source/MySql.Data/common/Ssl.cs b/Source/MySql.Data/common/Ssl.cs deleted file mode 100644 index b682ee29d..000000000 --- a/Source/MySql.Data/common/Ssl.cs +++ /dev/null @@ -1,177 +0,0 @@ -// Copyright © 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using MySql.Data.MySqlClient; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Net.Security; -using System.Security.Authentication; -using System.Security.Cryptography.X509Certificates; -using System.Text; - -namespace MySql.Data.Common -{ - internal class Ssl - { - private MySqlConnectionStringBuilder settings; - private static Dictionary tlsConnectionRef = new Dictionary(); - private static Dictionary tlsRetry = new Dictionary(); - private static SslProtocols[] tlsProtocols = new SslProtocols[] { SslProtocols.Tls12, SslProtocols.Tls11 }; - private static Object thisLock = new Object(); - - public Ssl(MySqlConnectionStringBuilder settings) - { - this.settings = settings; - } - - /// - /// Retrieve client SSL certificates. Dependent on connection string - /// settings we use either file or store based certificates. - /// - private X509CertificateCollection GetClientCertificates() - { - X509CertificateCollection certs = new X509CertificateCollection(); - - // Check for file-based certificate - if (settings.CertificateFile != null) - { - X509Certificate2 clientCert = new X509Certificate2(settings.CertificateFile, - settings.CertificatePassword); - certs.Add(clientCert); - return certs; - } - - if (settings.CertificateStoreLocation == MySqlCertificateStoreLocation.None) - return certs; - - StoreLocation location = - (settings.CertificateStoreLocation == MySqlCertificateStoreLocation.CurrentUser) ? - StoreLocation.CurrentUser : StoreLocation.LocalMachine; - - // Check for store-based certificate - X509Store store = new X509Store(StoreName.My, location); - store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly); - - - if (settings.CertificateThumbprint == null) - { - // Return all certificates from the store. - certs.AddRange(store.Certificates); - return certs; - } - - // Find certificate with given thumbprint - certs.AddRange(store.Certificates.Find(X509FindType.FindByThumbprint, - settings.CertificateThumbprint, true)); - - if (certs.Count == 0) - { - throw new MySqlException("Certificate with Thumbprint " + - settings.CertificateThumbprint + " not found"); - } - return certs; - } - - - public MySqlStream StartSSL(ref Stream baseStream, Encoding encoding, string connectionString) - { - RemoteCertificateValidationCallback sslValidateCallback = - new RemoteCertificateValidationCallback(ServerCheckValidation); - SslStream ss = new SslStream(baseStream, true, sslValidateCallback, null); - X509CertificateCollection certs = GetClientCertificates(); - - string connectionId = connectionString.GetHashCode().ToString(); - SslProtocols tlsProtocol = SslProtocols.Tls; - - lock (thisLock) - { - if (tlsConnectionRef.ContainsKey(connectionId)) - { - tlsProtocol = tlsConnectionRef[connectionId]; - } - else - { - if (!tlsRetry.ContainsKey(connectionId)) - { - tlsRetry[connectionId] = 0; - } - for (int i = tlsRetry[connectionId]; i < tlsProtocols.Length; i++) - { - tlsProtocol |= tlsProtocols[i]; - } - } - try - { - ss.AuthenticateAsClientAsync(settings.Server, certs, tlsProtocol, false).Wait(); - tlsConnectionRef[connectionId] = tlsProtocol; - tlsRetry.Remove(connectionId); - } - catch(AggregateException ex) - { - if (ex.GetBaseException() is IOException) - { - tlsConnectionRef.Remove(connectionId); - if (tlsRetry.ContainsKey(connectionId)) - { - if (tlsRetry[connectionId] > tlsProtocols.Length) - throw new MySqlException(Resources.SslConnectionError, ex); - tlsRetry[connectionId] += 1; - } - } - throw ex.GetBaseException(); - } - } - - baseStream = ss; - MySqlStream stream = new MySqlStream(ss, encoding, false); - stream.SequenceByte = 2; - - return stream; - } - - private bool ServerCheckValidation(object sender, X509Certificate certificate, - X509Chain chain, SslPolicyErrors sslPolicyErrors) - { - if (sslPolicyErrors == SslPolicyErrors.None) - return true; - - if (settings.SslMode == MySqlSslMode.Preferred || - settings.SslMode == MySqlSslMode.Required) - { - //Tolerate all certificate errors. - return true; - } - - if (settings.SslMode == MySqlSslMode.VerifyCA && - sslPolicyErrors == SslPolicyErrors.RemoteCertificateNameMismatch) - { - // Tolerate name mismatch in certificate, if full validation is not requested. - return true; - } - - return false; - } - } -} diff --git a/Source/MySql.Data/common/StreamCreator.cs b/Source/MySql.Data/common/StreamCreator.cs deleted file mode 100644 index c11ac193b..000000000 --- a/Source/MySql.Data/common/StreamCreator.cs +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using MySql.Data.MySqlClient; -using System; -using System.IO; -using System.IO.MemoryMappedFiles; -using System.IO.Pipes; -using System.Net.Sockets; -using System.Threading.Tasks; - -namespace MySql.Data.Common -{ - /// - /// Summary description for StreamCreator. - /// - internal class StreamCreator - { - readonly string _hostList; - uint _port; - string pipeName; - uint keepalive; - DBVersion driverVersion; - - public StreamCreator(string hosts, uint port, string pipeName, uint keepalive, DBVersion driverVersion) - { - _hostList = hosts; - if (string.IsNullOrEmpty(_hostList)) - _hostList = "localhost"; - this._port = port; - this.pipeName = pipeName; - this.keepalive = keepalive; - this.driverVersion = driverVersion; - } - - public static Stream GetStream(string server, uint port, string pipename, uint keepalive, DBVersion v, uint timeout) - { - MySqlConnectionStringBuilder settings = new MySqlConnectionStringBuilder - { - Server = server, - Port = port, - PipeName = pipename, - Keepalive = keepalive, - ConnectionTimeout = timeout - }; - - return GetStream(settings); - } - - public static Stream GetStream(MySqlConnectionStringBuilder settings) - { - switch (settings.ConnectionProtocol) - { - case MySqlConnectionProtocol.Tcp: return GetTcpStream(settings); - case MySqlConnectionProtocol.UnixSocket: return GetUnixSocketStream(settings); - case MySqlConnectionProtocol.SharedMemory: return GetSharedMemoryStream(settings); - case MySqlConnectionProtocol.NamedPipe: return GetNamedPipeStream(settings); - } - throw new InvalidOperationException(Resources.UnknownConnectionProtocol); - } - - private static Stream GetTcpStream(MySqlConnectionStringBuilder settings) - { - TcpClient client = new TcpClient(AddressFamily.InterNetwork); - Task task = client.ConnectAsync(settings.Server, (int)settings.Port); - - if (!task.Wait(((int)settings.ConnectionTimeout * 1000))) - throw new MySqlException(Resources.Timeout); - return client.GetStream(); - //TODO: reimplement or remove keepalive - } - - private static Stream GetUnixSocketStream(MySqlConnectionStringBuilder settings) - { - if (Platform.IsWindows()) - throw new InvalidOperationException(Resources.NoUnixSocketsOnWindows); - return null; -// MyNetworkStream s = await MyNetworkStream.CreateStreamAsync(settings, true); - // return s; - } - - private static Stream GetSharedMemoryStream(MySqlConnectionStringBuilder settings) - { -#if NETCORE10 - throw new NotSupportedException("Shared memory streams not currently supported."); -#else - SharedMemoryStream str = new SharedMemoryStream(settings.SharedMemoryName); - str.Open(settings.ConnectionTimeout); - return str; -#endif - } - - private static Stream GetNamedPipeStream(MySqlConnectionStringBuilder settings) - { -#if NETCORE10 - NamedPipeClientStream pipeStream = new NamedPipeClientStream(settings.Server, settings.PipeName, PipeDirection.InOut); - pipeStream.Connect((int)settings.ConnectionTimeout * 1000); - return pipeStream; -#else - Stream stream = MySql.Data.MySqlClient.Common.NamedPipeStream.Create(settings.PipeName, settings.Server, settings.ConnectionTimeout); - return stream; -#endif - } - } -} diff --git a/Source/MySql.Data/common/StringUtility.cs b/Source/MySql.Data/common/StringUtility.cs deleted file mode 100644 index 60dbc5bed..000000000 --- a/Source/MySql.Data/common/StringUtility.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright © 2014, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -namespace MySql.Data.Common -{ - public class StringUtility - { - public static string ToUpperInvariant(string s) - { - return s.ToUpperInvariant(); - } - - public static string ToLowerInvariant(string s) - { - return s.ToLowerInvariant(); - } - - } -} diff --git a/Source/MySql.Data/common/Version.cs b/Source/MySql.Data/common/Version.cs deleted file mode 100644 index ebce87a8f..000000000 --- a/Source/MySql.Data/common/Version.cs +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using MySql.Data.MySqlClient; - -namespace MySql.Data.Common -{ - /// - /// Summary description for Version. - /// - internal struct DBVersion - { - private readonly string _srcString; - - public DBVersion(string s, int major, int minor, int build) - { - Major = major; - Minor = minor; - Build = build; - _srcString = s; - IsEnterprise = s.ToLowerInvariant().Contains("-enterprise-"); - } - - public int Major { get; } - - public int Minor { get; } - - public int Build { get; } - - public bool IsEnterprise - { - get; private set; - } - - public static DBVersion Parse(string versionString) - { - int start = 0; - int index = versionString.IndexOf('.', start); - if (index == -1) - throw new MySqlException(Resources.BadVersionFormat); - string val = versionString.Substring(start, index - start).Trim(); - int major = Convert.ToInt32(val, System.Globalization.NumberFormatInfo.InvariantInfo); - - start = index + 1; - index = versionString.IndexOf('.', start); - if (index == -1) - throw new MySqlException(Resources.BadVersionFormat); - val = versionString.Substring(start, index - start).Trim(); - int minor = Convert.ToInt32(val, System.Globalization.NumberFormatInfo.InvariantInfo); - - start = index + 1; - int i = start; - while (i < versionString.Length && Char.IsDigit(versionString, i)) - i++; - val = versionString.Substring(start, i - start).Trim(); - int build = Convert.ToInt32(val, System.Globalization.NumberFormatInfo.InvariantInfo); - - return new DBVersion(versionString, major, minor, build); - } - - public bool isAtLeast(int majorNum, int minorNum, int buildNum) - { - if (Major > majorNum) return true; - if (Major == majorNum && Minor > minorNum) return true; - if (Major == majorNum && Minor == minorNum && Build >= buildNum) return true; - return false; - } - - public override string ToString() - { - return _srcString; - } - - } -} diff --git a/Source/MySql.Data/dataadapter.cs b/Source/MySql.Data/dataadapter.cs deleted file mode 100644 index a43336a6f..000000000 --- a/Source/MySql.Data/dataadapter.cs +++ /dev/null @@ -1,1131 +0,0 @@ -// Copyright � 2004, 2014, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Data; -using System.Data.Common; -using System.ComponentModel; -using System.Collections.Generic; -using System.Threading.Tasks; -using System.Threading; -#if NET_45_OR_GREATER -using System.Threading.Tasks; -using System.Threading; -#endif - -namespace MySql.Data.MySqlClient -{ - /// - [System.Drawing.ToolboxBitmap(typeof(MySqlDataAdapter), "MySqlClient.resources.dataadapter.bmp")] - [System.ComponentModel.DesignerCategory("Code")] - [Designer("MySql.Data.MySqlClient.Design.MySqlDataAdapterDesigner,MySqlClient.Design")] - public sealed class MySqlDataAdapter : DbDataAdapter, IDbDataAdapter, IDataAdapter, ICloneable - { - private bool loadingDefaults; - private int updateBatchSize; - List commandBatch; - - /// - /// Occurs during Update before a command is executed against the data source. The attempt to update is made, so the event fires. - /// - public event MySqlRowUpdatingEventHandler RowUpdating; - - /// - /// Occurs during Update after a command is executed against the data source. The attempt to update is made, so the event fires. - /// - public event MySqlRowUpdatedEventHandler RowUpdated; - - /// - public MySqlDataAdapter() - { - loadingDefaults = true; - updateBatchSize = 1; - } - - /// - public MySqlDataAdapter(MySqlCommand selectCommand) - : this() - { - SelectCommand = selectCommand; - } - - /// - public MySqlDataAdapter(string selectCommandText, MySqlConnection connection) - : this() - { - SelectCommand = new MySqlCommand(selectCommandText, connection); - } - - /// - public MySqlDataAdapter(string selectCommandText, string selectConnString) - : this() - { - SelectCommand = new MySqlCommand(selectCommandText, - new MySqlConnection(selectConnString)); - } - - #region Properties - - /// - [Description("Used during Update for deleted rows in Dataset.")] - public new MySqlCommand DeleteCommand - { - get { return (MySqlCommand)base.DeleteCommand; } - set { base.DeleteCommand = value; } - } - - /// - [Description("Used during Update for new rows in Dataset.")] - public new MySqlCommand InsertCommand - { - get { return (MySqlCommand)base.InsertCommand; } - set { base.InsertCommand = value; } - } - - /// - [Description("Used during Fill/FillSchema")] - [Category("Fill")] - public new MySqlCommand SelectCommand - { - get { return (MySqlCommand)base.SelectCommand; } - set { base.SelectCommand = value; } - } - - /// - [Description("Used during Update for modified rows in Dataset.")] - public new MySqlCommand UpdateCommand - { - get { return (MySqlCommand)base.UpdateCommand; } - set { base.UpdateCommand = value; } - } - - internal bool LoadDefaults - { - get { return loadingDefaults; } - set { loadingDefaults = value; } - } - - #endregion - - /// - /// Open connection if it was closed. - /// Necessary to workaround "connection must be open and valid" error - /// with batched updates. - /// - /// Row state - /// list of opened connections - /// If connection is opened by this function, the list is updated - /// - /// true if connection was opened - private void OpenConnectionIfClosed(DataRowState state, - List openedConnections) - { - MySqlCommand cmd = null; - switch (state) - { - case DataRowState.Added: - cmd = InsertCommand; - break; - case DataRowState.Deleted: - cmd = DeleteCommand; - break; - case DataRowState.Modified: - cmd = UpdateCommand; - break; - default: - return; - } - - if (cmd != null && cmd.Connection != null && - cmd.Connection.connectionState == ConnectionState.Closed) - { - cmd.Connection.Open(); - openedConnections.Add(cmd.Connection); - } - } - - - protected override int Update(DataRow[] dataRows, DataTableMapping tableMapping) - { - - List connectionsOpened = new List(); - - try - { - // Open connections for insert/update/update commands, if - // connections are closed. - foreach (DataRow row in dataRows) - { - OpenConnectionIfClosed(row.RowState, connectionsOpened); - } - - int ret = base.Update(dataRows, tableMapping); - - return ret; - } - finally - { - foreach (MySqlConnection c in connectionsOpened) - c.Close(); - } - } - - - #region Batching Support - - public override int UpdateBatchSize - { - get { return updateBatchSize; } - set { updateBatchSize = value; } - } - - protected override void InitializeBatching() - { - commandBatch = new List(); - } - - protected override int AddToBatch(IDbCommand command) - { - // the first time each command is asked to be batched, we ask - // that command to prepare its batchable command text. We only want - // to do this one time for each command - MySqlCommand commandToBatch = (MySqlCommand)command; - if (commandToBatch.BatchableCommandText == null) - commandToBatch.GetCommandTextForBatching(); - - IDbCommand cloneCommand = (IDbCommand)((ICloneable)command).Clone(); - commandBatch.Add(cloneCommand); - - return commandBatch.Count - 1; - } - - protected override int ExecuteBatch() - { - int recordsAffected = 0; - int index = 0; - while (index < commandBatch.Count) - { - MySqlCommand cmd = (MySqlCommand)commandBatch[index++]; - for (int index2 = index; index2 < commandBatch.Count; index2++, index++) - { - MySqlCommand cmd2 = (MySqlCommand)commandBatch[index2]; - if (cmd2.BatchableCommandText == null || - cmd2.CommandText != cmd.CommandText) break; - cmd.AddToBatch(cmd2); - } - recordsAffected += cmd.ExecuteNonQuery(); - } - return recordsAffected; - } - - protected override void ClearBatch() - { - if (commandBatch.Count > 0) - { - MySqlCommand cmd = (MySqlCommand)commandBatch[0]; - if (cmd.Batch != null) - cmd.Batch.Clear(); - } - commandBatch.Clear(); - } - - protected override void TerminateBatching() - { - ClearBatch(); - commandBatch = null; - } - - protected override IDataParameter GetBatchedParameter(int commandIdentifier, int parameterIndex) - { - return (IDataParameter)commandBatch[commandIdentifier].Parameters[parameterIndex]; - } - - #endregion - - /// - /// Overridden. See . - /// - /// - /// - /// - /// - /// - override protected RowUpdatedEventArgs CreateRowUpdatedEvent(DataRow dataRow, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) - { - return new MySqlRowUpdatedEventArgs(dataRow, command, statementType, tableMapping); - } - - /// - /// Overridden. See . - /// - /// - /// - /// - /// - /// - override protected RowUpdatingEventArgs CreateRowUpdatingEvent(DataRow dataRow, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) - { - return new MySqlRowUpdatingEventArgs(dataRow, command, statementType, tableMapping); - } - - /// - /// Overridden. Raises the RowUpdating event. - /// - /// A MySqlRowUpdatingEventArgs that contains the event data. - override protected void OnRowUpdating(RowUpdatingEventArgs value) - { - if (RowUpdating != null) - RowUpdating(this, (value as MySqlRowUpdatingEventArgs)); - } - - /// - /// Overridden. Raises the RowUpdated event. - /// - /// A MySqlRowUpdatedEventArgs that contains the event data. - override protected void OnRowUpdated(RowUpdatedEventArgs value) - { - if (RowUpdated != null) - RowUpdated(this, (value as MySqlRowUpdatedEventArgs)); - } - - - #region Async - #region Fill - /// - /// Async version of Fill - /// - /// Dataset to use - /// int - public Task FillAsync(DataSet dataSet) - { - return FillAsync(dataSet, CancellationToken.None); - } - - public Task FillAsync(DataSet dataSet, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var fillResult = base.Fill(dataSet); - result.SetResult(fillResult); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of Fill - /// - /// Datatable to use - /// int - public Task FillAsync(DataTable dataTable) - { - return FillAsync(dataTable, CancellationToken.None); - } - - public Task FillAsync(DataTable dataTable, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var fillResult = base.Fill(dataTable); - result.SetResult(fillResult); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of Fill - /// - /// DataSet to use - /// Source table - /// int - public Task FillAsync(DataSet dataSet, string srcTable) - { - return FillAsync(dataSet, srcTable, CancellationToken.None); - } - - public Task FillAsync(DataSet dataSet, string srcTable, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var fillResult = base.Fill(dataSet, srcTable); - result.SetResult(fillResult); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of Fill - /// - /// Datatable to use - /// DataReader to use - /// int - public Task FillAsync(DataTable dataTable, IDataReader dataReader) - { - return FillAsync(dataTable, dataReader, CancellationToken.None); - } - - public Task FillAsync(DataTable dataTable, IDataReader dataReader, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var fillResult = base.Fill(dataTable, dataReader); - result.SetResult(fillResult); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of Fill - /// - /// DataTable to use - /// DbCommand to use - /// Command Behavior - /// int - public Task FillAsync(DataTable dataTable, IDbCommand command, CommandBehavior behavior) - { - return FillAsync(dataTable, command, behavior, CancellationToken.None); - } - - public Task FillAsync(DataTable dataTable, IDbCommand command, CommandBehavior behavior, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var fillResult = base.Fill(dataTable, command, behavior); - result.SetResult(fillResult); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of Fill - /// - /// Start record - /// Max records - /// DataTable[] to use - /// int - public Task FillAsync(int startRecord, int maxRecords, params DataTable[] dataTables) - { - return FillAsync(startRecord, maxRecords, CancellationToken.None, dataTables); - } - - public Task FillAsync(int startRecord, int maxRecords, CancellationToken cancellationToken, params DataTable[] dataTables) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var fillResult = base.Fill(startRecord, maxRecords, dataTables); - result.SetResult(fillResult); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of Fill - /// - /// DataSet to use - /// Start record - /// Max records - /// Source table - /// int - public Task FillAsync(DataSet dataSet, int startRecord, int maxRecords, string srcTable) - { - return FillAsync(dataSet, startRecord, maxRecords, srcTable, CancellationToken.None); - } - - public Task FillAsync(DataSet dataSet, int startRecord, int maxRecords, string srcTable, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var fillResult = base.Fill(dataSet, startRecord, maxRecords, srcTable); - result.SetResult(fillResult); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of Fill - /// - /// DataSet to use - /// Source table - /// DataReader to use - /// Start record - /// Max records - /// - public Task FillAsync(DataSet dataSet, string srcTable, IDataReader dataReader, int startRecord, int maxRecords) - { - return FillAsync(dataSet, srcTable, dataReader, startRecord, maxRecords, CancellationToken.None); - } - - public Task FillAsync(DataSet dataSet, string srcTable, IDataReader dataReader, int startRecord, int maxRecords, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var fillResult = base.Fill(dataSet, srcTable, dataReader, startRecord, maxRecords); - result.SetResult(fillResult); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of Fill - /// - /// DataTable[] to use - /// Start record - /// Max records - /// DbCommand to use - /// Command Behavior - /// - public Task FillAsync(DataTable[] dataTables, int startRecord, int maxRecords, IDbCommand command, CommandBehavior behavior) - { - return FillAsync(dataTables, startRecord, maxRecords, command, behavior, CancellationToken.None); - } - - public Task FillAsync(DataTable[] dataTables, int startRecord, int maxRecords, IDbCommand command, CommandBehavior behavior, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var fillResult = base.Fill(dataTables, startRecord, maxRecords, command, behavior); - result.SetResult(fillResult); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of Fill - /// - /// DataSet to use - /// Start record - /// Max records - /// Source table - /// DbCommand to use - /// Command Behavior - /// - public Task FillAsync(DataSet dataSet, int startRecord, int maxRecords, string srcTable, IDbCommand command, CommandBehavior behavior) - { - return FillAsync(dataSet, startRecord, maxRecords, srcTable, command, behavior, CancellationToken.None); - } - - public Task FillAsync(DataSet dataSet, int startRecord, int maxRecords, string srcTable, IDbCommand command, CommandBehavior behavior, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var fillResult = base.Fill(dataSet, startRecord, maxRecords, srcTable, command, behavior); - result.SetResult(fillResult); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - #endregion - - #region FillSchema - /// - /// Async version of FillSchema - /// - /// DataSet to use - /// Schema Type - /// DataTable[] - public Task FillSchemaAsync(DataSet dataSet, SchemaType schemaType) - { - return FillSchemaAsync(dataSet, schemaType, CancellationToken.None); - } - - public Task FillSchemaAsync(DataSet dataSet, SchemaType schemaType, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var schemaResult = base.FillSchema(dataSet, schemaType); - result.SetResult(schemaResult); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of FillSchema - /// - /// DataSet to use - /// Schema Type - /// Source Table - /// DataTable[] - public Task FillSchemaAsync(DataSet dataSet, SchemaType schemaType, string srcTable) - { - return FillSchemaAsync(dataSet, schemaType, srcTable, CancellationToken.None); - } - - public Task FillSchemaAsync(DataSet dataSet, SchemaType schemaType, string srcTable, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var schemaResult = base.FillSchema(dataSet, schemaType, srcTable); - result.SetResult(schemaResult); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of FillSchema - /// - /// DataSet to use - /// Schema Type - /// Source Table - /// DataReader to use - /// DataTable[] - public Task FillSchemaAsync(DataSet dataSet, SchemaType schemaType, string srcTable, IDataReader dataReader) - { - return FillSchemaAsync(dataSet, schemaType, srcTable, dataReader, CancellationToken.None); - } - - public Task FillSchemaAsync(DataSet dataSet, SchemaType schemaType, string srcTable, IDataReader dataReader, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var schemaResult = base.FillSchema(dataSet, schemaType, srcTable, dataReader); - result.SetResult(schemaResult); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of FillSchema - /// - /// DataSet to use - /// Schema Type - /// DBCommand to use - /// Source Table - /// Command Behavior - /// DataTable[] - public Task FillSchemaAsync(DataSet dataSet, SchemaType schemaType, IDbCommand command, string srcTable, CommandBehavior behavior) - { - return FillSchemaAsync(dataSet, schemaType, command, srcTable, behavior, CancellationToken.None); - } - - public Task FillSchemaAsync(DataSet dataSet, SchemaType schemaType, IDbCommand command, string srcTable, CommandBehavior behavior, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var schemaResult = base.FillSchema(dataSet, schemaType, command, srcTable, behavior); - result.SetResult(schemaResult); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of FillSchema - /// - /// DataTable to use - /// Schema Type - /// DataTable - public Task FillSchemaAsync(DataTable dataTable, SchemaType schemaType) - { - return FillSchemaAsync(dataTable, schemaType, CancellationToken.None); - } - - public Task FillSchemaAsync(DataTable dataTable, SchemaType schemaType, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var schemaResult = base.FillSchema(dataTable, schemaType); - result.SetResult(schemaResult); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of FillSchema - /// - /// DataTable to use - /// Schema Type - /// DataReader to use - /// DataTable - public Task FillSchemaAsync(DataTable dataTable, SchemaType schemaType, IDataReader dataReader) - { - return FillSchemaAsync(dataTable, schemaType, dataReader, CancellationToken.None); - } - - public Task FillSchemaAsync(DataTable dataTable, SchemaType schemaType, IDataReader dataReader, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var schemaResult = base.FillSchema(dataTable, schemaType, dataReader); - result.SetResult(schemaResult); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of FillSchema - /// - /// DataTable to use - /// Schema Type - /// DBCommand to use - /// Command Behavior - /// DataTable - public Task FillSchemaAsync(DataTable dataTable, SchemaType schemaType, IDbCommand command, CommandBehavior behavior) - { - return FillSchemaAsync(dataTable, schemaType, command, behavior, CancellationToken.None); - } - - public Task FillSchemaAsync(DataTable dataTable, SchemaType schemaType, IDbCommand command, CommandBehavior behavior, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var schemaResult = base.FillSchema(dataTable, schemaType, command, behavior); - result.SetResult(schemaResult); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - #endregion - - #region Update - /// - /// Async version of Update - /// - /// DataRow[] to use - /// int - public Task UpdateAsync(DataRow[] dataRows) - { - return UpdateAsync(dataRows, CancellationToken.None); - } - - public Task UpdateAsync(DataRow[] dataRows, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var update = base.Update(dataRows); - result.SetResult(update); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of Update - /// - /// DataSet to use - /// int - public Task UpdateAsync(DataSet dataSet) - { - return UpdateAsync(dataSet, CancellationToken.None); - } - - public Task UpdateAsync(DataSet dataSet, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var update = base.Update(dataSet); - result.SetResult(update); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of Update - /// - /// DataTable to use - /// int - public Task UpdateAsync(DataTable dataTable) - { - return UpdateAsync(dataTable, CancellationToken.None); - } - - public Task UpdateAsync(DataTable dataTable, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var update = base.Update(dataTable); - result.SetResult(update); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of Update - /// - /// DataRow[] to use - /// Data Table Mapping - /// int - public Task UpdateAsync(DataRow[] dataRows, DataTableMapping tableMapping) - { - return UpdateAsync(dataRows, tableMapping, CancellationToken.None); - } - - public Task UpdateAsync(DataRow[] dataRows, DataTableMapping tableMapping, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var update = base.Update(dataRows, tableMapping); - result.SetResult(update); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - /// - /// Async version of Update - /// - /// DataSet to use - /// Source Table - /// - public Task UpdateAsync(DataSet dataSet, string srcTable) - { - return UpdateAsync(dataSet, srcTable, CancellationToken.None); - } - - public Task UpdateAsync(DataSet dataSet, string srcTable, CancellationToken cancellationToken) - { - var result = new TaskCompletionSource(); - if (cancellationToken == CancellationToken.None || !cancellationToken.IsCancellationRequested) - { - try - { - var update = base.Update(dataSet, srcTable); - result.SetResult(update); - } - catch (Exception ex) - { - result.SetException(ex); - } - } - else - { - result.SetCanceled(); - } - return result.Task; - } - - #endregion - #endregion - - } - - /// - /// Represents the method that will handle the event of a . - /// - public delegate void MySqlRowUpdatingEventHandler(object sender, MySqlRowUpdatingEventArgs e); - - /// - /// Represents the method that will handle the event of a . - /// - public delegate void MySqlRowUpdatedEventHandler(object sender, MySqlRowUpdatedEventArgs e); - - /// - /// Provides data for the RowUpdating event. This class cannot be inherited. - /// - public sealed class MySqlRowUpdatingEventArgs : RowUpdatingEventArgs - { - /// - /// Initializes a new instance of the MySqlRowUpdatingEventArgs class. - /// - /// The to - /// . - /// The to execute during . - /// One of the values that specifies the type of query executed. - /// The sent through an . - public MySqlRowUpdatingEventArgs(DataRow row, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) - : base(row, command, statementType, tableMapping) - { - } - - /// - /// Gets or sets the MySqlCommand to execute when performing the Update. - /// - new public MySqlCommand Command - { - get { return (MySqlCommand)base.Command; } - set { base.Command = value; } - } - } - - /// - /// Provides data for the RowUpdated event. This class cannot be inherited. - /// - public sealed class MySqlRowUpdatedEventArgs : RowUpdatedEventArgs - { - /// - /// Initializes a new instance of the MySqlRowUpdatedEventArgs class. - /// - /// The sent through an . - /// The executed when is called. - /// One of the values that specifies the type of query executed. - /// The sent through an . - public MySqlRowUpdatedEventArgs(DataRow row, IDbCommand command, StatementType statementType, DataTableMapping tableMapping) - : base(row, command, statementType, tableMapping) - { - } - - /// - /// Gets or sets the MySqlCommand executed when Update is called. - /// - new public MySqlCommand Command - { - get { return (MySqlCommand)base.Command; } - } - } -} diff --git a/Source/MySql.Data/datareader.cs b/Source/MySql.Data/datareader.cs deleted file mode 100644 index b8b8c9cd4..000000000 --- a/Source/MySql.Data/datareader.cs +++ /dev/null @@ -1,1019 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Data; -using System.Globalization; -using System.Threading; -using MySql.Data.MySqlClient; - -using System.Data.Common; -using MySql.Data.Types; - -namespace MySql.Data.MySqlClient -{ - /// - public sealed partial class MySqlDataReader : IDisposable - { - // The DataReader should always be open when returned to the user. - private bool _isOpen = true; - - internal long affectedRows; - internal Driver driver; - - // Used in special circumstances with stored procs to avoid exceptions from DbDataAdapter - // If set, AffectedRows returns -1 instead of 0. - private readonly bool _disableZeroAffectedRows; - - /* - * Keep track of the connection in order to implement the - * CommandBehavior.CloseConnection flag. A null reference means - * normal behavior (do not automatically close). - */ - private MySqlConnection _connection; - - /* - * Because the user should not be able to directly create a - * DataReader object, the constructors are - * marked as internal. - */ - internal MySqlDataReader(MySqlCommand cmd, PreparableStatement statement, CommandBehavior behavior) - { - this.Command = cmd; - _connection = Command.Connection; - CommandBehavior = behavior; - driver = _connection.driver; - affectedRows = -1; - this.Statement = statement; - - if (cmd.CommandType == CommandType.StoredProcedure - && cmd.UpdatedRowSource == UpdateRowSource.FirstReturnedRecord - ) - { - _disableZeroAffectedRows = true; - } - } - - #region Properties - - internal PreparableStatement Statement { get; } - - internal MySqlCommand Command { get; private set; } - - internal ResultSet ResultSet { get; private set; } - - internal CommandBehavior CommandBehavior { get; private set; } - - /// - /// Gets the number of columns in the current row. - /// - public override int FieldCount => ResultSet?.Size ?? 0; - - /// - /// Gets a value indicating whether the MySqlDataReader contains one or more rows. - /// - public override bool HasRows => ResultSet?.HasRows ?? false; - - /// - /// Gets a value indicating whether the data reader is closed. - /// - public override bool IsClosed => !_isOpen; - - /// - /// Gets the number of rows changed, inserted, or deleted by execution of the SQL statement. - /// - public override int RecordsAffected - { - // RecordsAffected returns the number of rows affected in batch - // statments from insert/delete/update statments. This property - // is not completely accurate until .Close() has been called. - get - { - if (!_disableZeroAffectedRows) return (int) affectedRows; - // In special case of updating stored procedure called from - // within data adapter, we return -1 to avoid exceptions - // (s. Bug#54895) - if (affectedRows == 0) - return -1; - - return (int)affectedRows; - } - } - - /// - /// Overloaded. Gets the value of a column in its native format. - /// In C#, this property is the indexer for the MySqlDataReader class. - /// - public override object this[int i] => GetValue(i); - - /// - /// Gets the value of a column in its native format. - /// [C#] In C#, this property is the indexer for the MySqlDataReader class. - /// - public override object this[String name] => this[GetOrdinal(name)]; - - #endregion - - /// - /// Closes the MySqlDataReader object. - /// -#if NETCORE10 - public void Close() -#else - public override void Close() -#endif - { - if (!_isOpen) return; - - bool shouldCloseConnection = (CommandBehavior & CommandBehavior.CloseConnection) != 0; - CommandBehavior originalBehavior = CommandBehavior; - - // clear all remaining resultsets - try - { - // Temporarily change to Default behavior to allow NextResult to finish properly. - if (!originalBehavior.Equals(CommandBehavior.SchemaOnly)) - CommandBehavior = CommandBehavior.Default; - while (NextResult()) { } - } - catch (MySqlException ex) - { - // Ignore aborted queries - if (!ex.IsQueryAborted) - { - // ignore IO exceptions. - // We are closing or disposing reader, and do not - // want exception to be propagated to used. If socket is - // is closed on the server side, next query will run into - // IO exception. If reader is closed by GC, we also would - // like to avoid any exception here. - bool isIOException = false; - for (Exception exception = ex; exception != null; - exception = exception.InnerException) - { - if (exception is System.IO.IOException) - { - isIOException = true; - break; - } - } - if (!isIOException) - { - // Ordinary exception (neither IO nor query aborted) - throw; - } - } - } - catch (System.IO.IOException) - { - // eat, on the same reason we eat IO exceptions wrapped into - // MySqlExceptions reasons, described above. - } - finally - { - // always ensure internal reader is null (Bug #55558) - _connection.Reader = null; - CommandBehavior = originalBehavior; - } - // we now give the command a chance to terminate. In the case of - // stored procedures it needs to update out and inout parameters - Command.Close(this); - CommandBehavior = CommandBehavior.Default; - - if (this.Command.Canceled && _connection.driver.Version.isAtLeast(5, 1, 0)) - { - // Issue dummy command to clear kill flag - ClearKillFlag(); - } - - if (shouldCloseConnection) - _connection.Close(); - - Command = null; - _connection.IsInUse = false; - _connection = null; - _isOpen = false; - } - -#region TypeSafe Accessors - - /// - /// Gets the value of the specified column as a Boolean. - /// - /// - /// - public bool GetBoolean(string name) - { - return GetBoolean(GetOrdinal(name)); - } - - /// - /// Gets the value of the specified column as a Boolean. - /// - /// - /// - public override bool GetBoolean(int i) - { - var asValue = GetValue(i); - int numericValue; - if (int.TryParse(asValue as string, out numericValue)) - return Convert.ToBoolean(numericValue); - return Convert.ToBoolean(asValue); - } - - /// - /// Gets the value of the specified column as a byte. - /// - /// - /// - public byte GetByte(string name) - { - return GetByte(GetOrdinal(name)); - } - - /// - /// Gets the value of the specified column as a byte. - /// - /// - /// - public override byte GetByte(int i) - { - IMySqlValue v = GetFieldValue(i, false); - if (v is MySqlUByte) - return ((MySqlUByte)v).Value; - else - return (byte)((MySqlByte)v).Value; - } - - /// - /// Gets the value of the specified column as a sbyte. - /// - /// - /// - public sbyte GetSByte(string name) - { - return GetSByte(GetOrdinal(name)); - } - - /// - /// Gets the value of the specified column as a sbyte. - /// - /// - /// - public sbyte GetSByte(int i) - { - IMySqlValue v = GetFieldValue(i, false); - if (v is MySqlByte) - return ((MySqlByte)v).Value; - else - return (sbyte)((MySqlByte)v).Value; - } - - /// - /// Reads a stream of bytes from the specified column offset into the buffer an array starting at the given buffer offset. - /// - /// The zero-based column ordinal. - /// The index within the field from which to begin the read operation. - /// The buffer into which to read the stream of bytes. - /// The index for buffer to begin the read operation. - /// The maximum length to copy into the buffer. - /// The actual number of bytes read. - /// - public override long GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length) - { - if (i >= FieldCount) - Throw(new IndexOutOfRangeException()); - - IMySqlValue val = GetFieldValue(i, false); - - if (!(val is MySqlBinary) && !(val is MySqlGuid)) - Throw(new MySqlException("GetBytes can only be called on binary or guid columns")); - - byte[] bytes = null; - if (val is MySqlBinary) - bytes = ((MySqlBinary)val).Value; - else - bytes = ((MySqlGuid)val).Bytes; - - if (buffer == null) - return bytes.Length; - - if (bufferoffset >= buffer.Length || bufferoffset < 0) - Throw(new IndexOutOfRangeException("Buffer index must be a valid index in buffer")); - if (buffer.Length < (bufferoffset + length)) - Throw(new ArgumentException("Buffer is not large enough to hold the requested data")); - if (fieldOffset < 0 || - ((ulong)fieldOffset >= (ulong)bytes.Length && (ulong)bytes.Length > 0)) - Throw(new IndexOutOfRangeException("Data index must be a valid index in the field")); - - // adjust the length so we don't run off the end - if ((ulong)bytes.Length < (ulong)(fieldOffset + length)) - { - length = (int)((ulong)bytes.Length - (ulong)fieldOffset); - } - - Buffer.BlockCopy(bytes, (int)fieldOffset, buffer, (int)bufferoffset, (int)length); - - return length; - } - - private object ChangeType(IMySqlValue value, int fieldIndex, Type newType) - { - ResultSet.Fields[fieldIndex].AddTypeConversion(newType); - return Convert.ChangeType(value.Value, newType, CultureInfo.InvariantCulture); - } - - /// - /// Gets the value of the specified column as a single character. - /// - /// - /// - public char GetChar(string name) - { - return GetChar(GetOrdinal(name)); - } - - /// - /// Gets the value of the specified column as a single character. - /// - /// - /// - public override char GetChar(int i) - { - string s = GetString(i); - return s[0]; - } - - /// - /// Reads a stream of characters from the specified column offset into the buffer as an array starting at the given buffer offset. - /// - /// - /// - /// - /// - /// - /// - public override long GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length) - { - if (i >= FieldCount) - Throw(new IndexOutOfRangeException()); - - string valAsString = GetString(i); - - if (buffer == null) return valAsString.Length; - - if (bufferoffset >= buffer.Length || bufferoffset < 0) - Throw(new IndexOutOfRangeException("Buffer index must be a valid index in buffer")); - if (buffer.Length < (bufferoffset + length)) - Throw(new ArgumentException("Buffer is not large enough to hold the requested data")); - if (fieldoffset < 0 || fieldoffset >= valAsString.Length) - Throw(new IndexOutOfRangeException("Field offset must be a valid index in the field")); - - if (valAsString.Length < length) - length = valAsString.Length; - valAsString.CopyTo((int)fieldoffset, buffer, bufferoffset, length); - return length; - } - - /// - /// Gets the name of the source data type. - /// - /// - /// - public override String GetDataTypeName(int i) - { - if (!_isOpen) - Throw(new Exception("No current query in data reader")); - if (i >= FieldCount) - Throw(new IndexOutOfRangeException()); - - // return the name of the type used on the backend - IMySqlValue v = ResultSet.Values[i]; - return v.MySqlTypeName; - } - - /// - public MySqlDateTime GetMySqlDateTime(string column) - { - return GetMySqlDateTime(GetOrdinal(column)); - } - - /// - public MySqlDateTime GetMySqlDateTime(int column) - { - return (MySqlDateTime)GetFieldValue(column, true); - } - - /// - public DateTime GetDateTime(string column) - { - return GetDateTime(GetOrdinal(column)); - } - - /// - public override DateTime GetDateTime(int i) - { - IMySqlValue val = GetFieldValue(i, true); - MySqlDateTime dt; - - if (val is MySqlDateTime) - dt = (MySqlDateTime)val; - else - { - // we need to do this because functions like date_add return string - string s = GetString(i); - dt = MySqlDateTime.Parse(s); - } - - dt.TimezoneOffset = driver.timeZoneOffset; - if (_connection.Settings.ConvertZeroDateTime && !dt.IsValidDateTime) - return DateTime.MinValue; - else - return dt.GetDateTime(); - } - - public MySqlDecimal GetMySqlDecimal(string column) - { - return GetMySqlDecimal(GetOrdinal(column)); - } - - public MySqlDecimal GetMySqlDecimal(int i) - { - return (MySqlDecimal)GetFieldValue(i, false); - } - - /// - public Decimal GetDecimal(string column) - { - return GetDecimal(GetOrdinal(column)); - } - - /// - public override Decimal GetDecimal(int i) - { - IMySqlValue v = GetFieldValue(i, true); - if (v is MySqlDecimal) - return ((MySqlDecimal)v).Value; - return Convert.ToDecimal(v.Value); - } - - /// - public double GetDouble(string column) - { - return GetDouble(GetOrdinal(column)); - } - - /// - public override double GetDouble(int i) - { - IMySqlValue v = GetFieldValue(i, true); - if (v is MySqlDouble) - return ((MySqlDouble)v).Value; - return Convert.ToDouble(v.Value); - } - - public Type GetFieldType(string column) - { - return GetFieldType(GetOrdinal(column)); - } - - /// - /// Gets the Type that is the data type of the object. - /// - /// - /// - public override Type GetFieldType(int i) - { - if (!_isOpen) - Throw(new Exception("No current query in data reader")); - if (i >= FieldCount) - Throw(new IndexOutOfRangeException()); - - // we have to use the values array directly because we can't go through - // GetValue - IMySqlValue v = ResultSet.Values[i]; - if (v is MySqlDateTime) - { - if (!_connection.Settings.AllowZeroDateTime) - return typeof(DateTime); - return typeof(MySqlDateTime); - } - return v.SystemType; - } - - /// - public float GetFloat(string column) - { - return GetFloat(GetOrdinal(column)); - } - - /// - public override float GetFloat(int i) - { - IMySqlValue v = GetFieldValue(i, true); - if (v is MySqlSingle) - return ((MySqlSingle)v).Value; - return Convert.ToSingle(v.Value); - } - - /// - public Guid GetGuid(string column) - { - return GetGuid(GetOrdinal(column)); - } - - /// - public override Guid GetGuid(int i) - { - object v = GetValue(i); - if (v is Guid) - return (Guid)v; - if (v is string) - return new Guid(v as string); - if (v is byte[]) - { - byte[] bytes = (byte[])v; - if (bytes.Length == 16) - return new Guid(bytes); - } - Throw(new MySqlException(Resources.ValueNotSupportedForGuid)); - return Guid.Empty; // just to silence compiler - } - - /// - public Int16 GetInt16(string column) - { - return GetInt16(GetOrdinal(column)); - } - - /// - public override Int16 GetInt16(int i) - { - IMySqlValue v = GetFieldValue(i, true); - if (v is MySqlInt16) - return ((MySqlInt16)v).Value; - - return (short)ChangeType(v, i, typeof(short)); - } - - /// - public Int32 GetInt32(string column) - { - return GetInt32(GetOrdinal(column)); - } - - /// - public override Int32 GetInt32(int i) - { - IMySqlValue v = GetFieldValue(i, true); - if (v is MySqlInt32) - return ((MySqlInt32)v).Value; - - return (Int32)ChangeType(v, i, typeof(Int32)); - } - - /// - public Int64 GetInt64(string column) - { - return GetInt64(GetOrdinal(column)); - } - - /// - public override Int64 GetInt64(int i) - { - IMySqlValue v = GetFieldValue(i, true); - if (v is MySqlInt64) - return ((MySqlInt64)v).Value; - - return (Int64)ChangeType(v, i, typeof(Int64)); - } - - /// - /// Gets the name of the specified column. - /// - /// - /// - public override String GetName(int i) - { - if (!_isOpen) - Throw(new Exception("No current query in data reader")); - if (i >= FieldCount) - Throw(new IndexOutOfRangeException()); - - return ResultSet.Fields[i].ColumnName; - } - - /// - /// Gets the column ordinal, given the name of the column. - /// - /// - /// - public override int GetOrdinal(string name) - { - if (!_isOpen || ResultSet == null) - Throw(new Exception("No current query in data reader")); - - return ResultSet.GetOrdinal(name); - } - - /// - public string GetString(string column) - { - return GetString(GetOrdinal(column)); - } - - /// - public override String GetString(int i) - { - IMySqlValue val = GetFieldValue(i, true); - - if (val is MySqlBinary) - { - byte[] v = ((MySqlBinary)val).Value; - return ResultSet.Fields[i].Encoding.GetString(v, 0, v.Length); - } - - return val.Value.ToString(); - } - - /// - public TimeSpan GetTimeSpan(string column) - { - return GetTimeSpan(GetOrdinal(column)); - } - - /// - public TimeSpan GetTimeSpan(int column) - { - IMySqlValue val = GetFieldValue(column, true); - - MySqlTimeSpan ts = (MySqlTimeSpan)val; - return ts.Value; - } - - /// - /// Gets the value of the specified column in its native format. - /// - /// - /// - public override object GetValue(int i) - { - if (!_isOpen) - Throw(new Exception("No current query in data reader")); - if (i >= FieldCount) - Throw(new IndexOutOfRangeException()); - - IMySqlValue val = GetFieldValue(i, false); - if (val.IsNull) - return DBNull.Value; - - // if the column is a date/time, then we return a MySqlDateTime - // so .ToString() will print '0000-00-00' correctly - if (val is MySqlDateTime) - { - MySqlDateTime dt = (MySqlDateTime)val; - if (!dt.IsValidDateTime && _connection.Settings.ConvertZeroDateTime) - return DateTime.MinValue; - else if (_connection.Settings.AllowZeroDateTime) - return val; - else - return dt.GetDateTime(); - } - - return val.Value; - } - - /// - /// Gets all attribute columns in the collection for the current row. - /// - /// - /// - public override int GetValues(object[] values) - { - int numCols = Math.Min(values.Length, FieldCount); - for (int i = 0; i < numCols; i++) - values[i] = GetValue(i); - - return numCols; - } - - /// - public UInt16 GetUInt16(string column) - { - return GetUInt16(GetOrdinal(column)); - } - - /// - public UInt16 GetUInt16(int column) - { - IMySqlValue v = GetFieldValue(column, true); - if (v is MySqlUInt16) - return ((MySqlUInt16)v).Value; - - return (UInt16)ChangeType(v, column, typeof(UInt16)); - } - - /// - public UInt32 GetUInt32(string column) - { - return GetUInt32(GetOrdinal(column)); - } - - /// - public UInt32 GetUInt32(int column) - { - IMySqlValue v = GetFieldValue(column, true); - if (v is MySqlUInt32) - return ((MySqlUInt32)v).Value; - return (uint)ChangeType(v, column, typeof(UInt32)); - } - - /// - public UInt64 GetUInt64(string column) - { - return GetUInt64(GetOrdinal(column)); - } - - /// - public UInt64 GetUInt64(int column) - { - IMySqlValue v = GetFieldValue(column, true); - if (v is MySqlUInt64) - return ((MySqlUInt64)v).Value; - - return (UInt64)ChangeType(v, column, typeof(UInt64)); - } - - - #endregion - -#if !NETCORE10 - IDataReader IDataRecord.GetData(int i) - { - return base.GetData(i); - } -#else - public new DbDataReader GetData(int i) - { - return base.GetData(i); - } -#endif - - /// - /// Gets a value indicating whether the column contains non-existent or missing values. - /// - /// - /// - public override bool IsDBNull(int i) - { - return DBNull.Value == GetValue(i); - } - - /// - /// Advances the data reader to the next result, when reading the results of batch SQL statements. - /// - /// - public override bool NextResult() - { - if (!_isOpen) - Throw(new MySqlException(Resources.NextResultIsClosed)); - - bool isCaching = Command.CommandType == CommandType.TableDirect && Command.EnableCaching && - (CommandBehavior & CommandBehavior.SequentialAccess) == 0; - - // this will clear out any unread data - if (ResultSet != null) - { - ResultSet.Close(); - if (isCaching) - TableCache.AddToCache(Command.CommandText, ResultSet); - } - - // single result means we only return a single resultset. If we have already - // returned one, then we return false - // TableDirect is basically a select * from a single table so it will generate - // a single result also - if (ResultSet != null && - ((CommandBehavior & CommandBehavior.SingleResult) != 0 || isCaching)) - return false; - - // next load up the next resultset if any - try - { - do - { - ResultSet = null; - // if we are table caching, then try to retrieve the resultSet from the cache - if (isCaching) - ResultSet = TableCache.RetrieveFromCache(Command.CommandText, - Command.CacheAge); - - if (ResultSet == null) - { - ResultSet = driver.NextResult(Statement.StatementId, false); - if (ResultSet == null) return false; - if (ResultSet.IsOutputParameters && Command.CommandType == CommandType.StoredProcedure) - { - StoredProcedure sp = Statement as StoredProcedure; - sp.ProcessOutputParameters(this); - ResultSet.Close(); - if (!sp.ServerProvidingOutputParameters) return false; - // if we are using server side output parameters then we will get our ok packet - // *after* the output parameters resultset - ResultSet = driver.NextResult(Statement.StatementId, true); - } - ResultSet.Cached = isCaching; - } - - if (ResultSet.Size == 0) - { - Command.LastInsertedId = ResultSet.InsertedId; - if (affectedRows == -1) - affectedRows = ResultSet.AffectedRows; - else - affectedRows += ResultSet.AffectedRows; - } - } while (ResultSet.Size == 0); - - return true; - } - catch (MySqlException ex) - { - if (ex.IsFatal) - _connection.Abort(); - if (ex.Number == 0) - throw new MySqlException(Resources.FatalErrorReadingResult, ex); - if ((CommandBehavior & CommandBehavior.CloseConnection) != 0) - Close(); - throw; - } - } - - /// - /// Advances the MySqlDataReader to the next record. - /// - /// - public override bool Read() - { - if (!_isOpen) - Throw(new MySqlException("Invalid attempt to Read when reader is closed.")); - if (ResultSet == null) - return false; - - try - { - return ResultSet.NextRow(CommandBehavior); - } - catch (TimeoutException tex) - { - _connection.HandleTimeoutOrThreadAbort(tex); - throw; // unreached - } -#if !NETCORE10 - catch (ThreadAbortException taex) - { - _connection.HandleTimeoutOrThreadAbort(taex); - throw; - } - -#endif - catch (MySqlException ex) - { - if (ex.IsFatal) - _connection.Abort(); - - if (ex.IsQueryAborted) - { - throw; - } - - throw new MySqlException(Resources.FatalErrorDuringRead, ex); - } - } - - - private IMySqlValue GetFieldValue(int index, bool checkNull) - { - if (index < 0 || index >= FieldCount) - Throw(new ArgumentException(Resources.InvalidColumnOrdinal)); - - IMySqlValue v = ResultSet[index]; - - if (checkNull && v.IsNull) - throw new System.Data.SqlTypes.SqlNullValueException(); - - return v; - } - - - private void ClearKillFlag() - { - // This query will silently crash because of the Kill call that happened before. - string dummyStatement = "SELECT * FROM bogus_table LIMIT 0"; /* dummy query used to clear kill flag */ - MySqlCommand dummyCommand = new MySqlCommand(dummyStatement, _connection) {InternallyCreated = true}; - - try - { - dummyCommand.ExecuteReader(); // ExecuteReader catches the exception and returns null, which is expected. - } - catch (MySqlException ex) - { - if (ex.Number != (int)MySqlErrorCode.NoSuchTable) throw; - } - } - - private void ProcessOutputParameters() - { - // if we are not 5.5 or later or we are not prepared then we are simulating output parameters - // with user variables and they are also string so we have to work some magic with out - // column types before we read the data - if (!driver.SupportsOutputParameters || !Command.IsPrepared) - AdjustOutputTypes(); - - // now read the output parameters data row - if ((CommandBehavior & CommandBehavior.SchemaOnly) != 0) return; - ResultSet.NextRow(CommandBehavior); - - string prefix = "@" + StoredProcedure.ParameterPrefix; - - for (int i = 0; i < FieldCount; i++) - { - string fieldName = GetName(i); - if (fieldName.StartsWith(prefix)) - fieldName = fieldName.Remove(0, prefix.Length); - MySqlParameter parameter = Command.Parameters.GetParameterFlexible(fieldName, true); - parameter.Value = GetValue(i); - } - } - - private void AdjustOutputTypes() - { - // since MySQL likes to return user variables as strings - // we reset the types of the readers internal value objects - // this will allow those value objects to parse the string based - // return values - for (int i = 0; i < FieldCount; i++) - { - string fieldName = GetName(i); - fieldName = fieldName.Remove(0, StoredProcedure.ParameterPrefix.Length + 1); - MySqlParameter parameter = Command.Parameters.GetParameterFlexible(fieldName, true); - - IMySqlValue v = MySqlField.GetIMySqlValue(parameter.MySqlDbType); - if (v is MySqlBit) - { - MySqlBit bit = (MySqlBit)v; - bit.ReadAsString = true; - ResultSet.SetValueObject(i, bit); - } - else - ResultSet.SetValueObject(i, v); - } - } - - private void Throw(Exception ex) - { - _connection?.Throw(ex); - throw ex; - } - - public new void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - internal new void Dispose(bool disposing) - { - if (disposing) - { - Close(); - } - } - -#region Destructor - ~MySqlDataReader() - { - Dispose(false); - } -#endregion - } -} diff --git a/Source/MySql.Data/docs/MySqlCommand.xml b/Source/MySql.Data/docs/MySqlCommand.xml deleted file mode 100644 index 4d8915219..000000000 --- a/Source/MySql.Data/docs/MySqlCommand.xml +++ /dev/null @@ -1,934 +0,0 @@ - - - Represents a SQL statement to execute against a MySQL database. This class cannot be inherited. - - MySqlCommand features the following methods for executing commands at a MySQL database: - - - Item - Description - - - - ExecuteReader - - Executes commands that return rows. - - - - ExecuteNonQuery - - Executes commands such as SQL INSERT, DELETE, and UPDATE statements. - - - - ExecuteScalar - - Retrieves a single value (for example, an aggregate value) from a database. - - - - You can reset the CommandText property and reuse the MySqlCommand - object. However, you must close the MySqlDataReader - before you can execute a new or previous command. - - If a MySqlException is - generated by the method executing a MySqlCommand, the MySqlConnection - remains open. It is the responsibility of the programmer to close the connection. - - - Using the '@' symbol for paramters is now the preferred approach although the old pattern of using - '?' is still supported. Please be aware though that using '@' can cause conflicts when user variables - are also used. To help with this situation please see the documentation on the 'allow user variables' - connection string option. The 'old syntax' connection string option has now been deprecated. - - - - - The following example creates a MySqlCommand and - a MySqlConnection. The MySqlConnection is opened and set as the Connection - for the MySqlCommand. The example then calls ExecuteNonQuery, - and closes the connection. To accomplish this, the ExecuteNonQuery is - passed a connection string and a query string that is a SQL INSERT - statement. - - Public Sub InsertRow(myConnectionString As String) - " If the connection string is null, use a default. - If myConnectionString = "" Then - myConnectionString = "Database=Test;Data Source=localhost;User Id=username;Password=pass" - End If - Dim myConnection As New MySqlConnection(myConnectionString) - Dim myInsertQuery As String = "INSERT INTO Orders (id, customerId, amount) Values(1001, 23, 30.66)" - Dim myCommand As New MySqlCommand(myInsertQuery) - myCommand.Connection = myConnection - myConnection.Open() - myCommand.ExecuteNonQuery() - myCommand.Connection.Close() - End Sub - - - public void InsertRow(string myConnectionString) - { - // If the connection string is null, use a default. - if(myConnectionString == "") - { - myConnectionString = "Database=Test;Data Source=localhost;User Id=username;Password=pass"; - } - MySqlConnection myConnection = new MySqlConnection(myConnectionString); - string myInsertQuery = "INSERT INTO Orders (id, customerId, amount) Values(1001, 23, 30.66)"; - MySqlCommand myCommand = new MySqlCommand(myInsertQuery); - myCommand.Connection = myConnection; - myConnection.Open(); - myCommand.ExecuteNonQuery(); - myCommand.Connection.Close(); - } - - - - - - - - - - Initializes a new instance of the MySqlCommand class. - - - The following example creates a MySqlCommand and sets some of its properties. - - - This example shows how to use one of the overloaded - versions of the MySqlCommand constructor. For other examples that might be available, - see the individual overload topics. - - - - Public Sub CreateMySqlCommand() - Dim myConnection As New MySqlConnection _ - ("Persist Security Info=False;database=test;server=myServer") - myConnection.Open() - Dim myTrans As MySqlTransaction = myConnection.BeginTransaction() - Dim mySelectQuery As String = "SELECT * FROM MyTable" - Dim myCommand As New MySqlCommand(mySelectQuery, myConnection, myTrans) - myCommand.CommandTimeout = 20 - End Sub - - - public void CreateMySqlCommand() - { - MySqlConnection myConnection = new MySqlConnection("Persist Security Info=False; - database=test;server=myServer"); - myConnection.Open(); - MySqlTransaction myTrans = myConnection.BeginTransaction(); - string mySelectQuery = "SELECT * FROM myTable"; - MySqlCommand myCommand = new MySqlCommand(mySelectQuery, myConnection,myTrans); - myCommand.CommandTimeout = 20; - } - - - public: - void CreateMySqlCommand() - { - MySqlConnection* myConnection = new MySqlConnection(S"Persist Security Info=False; - database=test;server=myServer"); - myConnection->Open(); - MySqlTransaction* myTrans = myConnection->BeginTransaction(); - String* mySelectQuery = S"SELECT * FROM myTable"; - MySqlCommand* myCommand = new MySqlCommand(mySelectQuery, myConnection, myTrans); - myCommand->CommandTimeout = 20; - }; - - - - - - - Initializes a new instance of the MySqlCommand class. - - - The base constructor initializes all fields to their default values. The - following table shows initial property values for an instance of . - - - Properties - Initial Value - - - - - - empty string ("") - - - - - - 0 - - - - - - CommandType.Text - - - - - - Null - - - - You can change the value for any of these properties through a separate call to - the property. - - - - The following example creates a and - sets some of its properties. - - - Public Sub CreateMySqlCommand() - Dim myCommand As New MySqlCommand() - myCommand.CommandType = CommandType.Text - End Sub - - - public void CreateMySqlCommand() - { - MySqlCommand myCommand = new MySqlCommand(); - myCommand.CommandType = CommandType.Text; - } - - - - - - - Initializes a new instance of the class with the text of the query. - - The text of the query. - - When an instance of is created, - the following read/write properties are set to initial values. - - - - Properties - Initial Value - - - - - - - cmdText - - - - - - - 0 - - - - - - CommandType.Text - - - - - - Null - - - - You can change the value for any of these properties through a separate call to - the property. - - - - The following example creates a and - sets some of its properties. - - - Public Sub CreateMySqlCommand() - Dim sql as String = "SELECT * FROM mytable" - Dim myCommand As New MySqlCommand(sql) - myCommand.CommandType = CommandType.Text - End Sub - - - public void CreateMySqlCommand() - { - string sql = "SELECT * FROM mytable"; - MySqlCommand myCommand = new MySqlCommand(sql); - myCommand.CommandType = CommandType.Text; - } - - - - - - - Initializes a new instance of the class - with the text of the query and a . - - The text of the query. - - A that represents the - connection to an instance of SQL Server. - - - When an instance of is created, - the following read/write properties are set to initial values. - - - - Properties - Initial Value - - - - - - - cmdText - - - - - - - 0 - - - - - - CommandType.Text - - - - - - - connection - - - - - You can change the value for any of these properties through a separate call to - the property. - - - - The following example creates a and - sets some of its properties. - - - Public Sub CreateMySqlCommand() - Dim conn as new MySqlConnection("server=myServer") - Dim sql as String = "SELECT * FROM mytable" - Dim myCommand As New MySqlCommand(sql, conn) - myCommand.CommandType = CommandType.Text - End Sub - - - public void CreateMySqlCommand() - { - MySqlConnection conn = new MySqlConnection("server=myserver") - string sql = "SELECT * FROM mytable"; - MySqlCommand myCommand = new MySqlCommand(sql, conn); - myCommand.CommandType = CommandType.Text; - } - - - - - - - - - Initializes a new instance of the class - with the text of the query, a , and the - . - - - The text of the query. - - A that represents the - connection to an instance of SQL Server. - - - The in which the executes. - - - When an instance of is created, - the following read/write properties are set to initial values. - - - - Properties - Initial Value - - - - - - - cmdText - - - - - - - 0 - - - - - - CommandType.Text - - - - - - - connection - - - - - You can change the value for any of these properties through a separate call to - the property. - - - - The following example creates a and - sets some of its properties. - - - Public Sub CreateMySqlCommand() - Dim conn as new MySqlConnection("server=myServer") - conn.Open(); - Dim txn as MySqlTransaction = conn.BeginTransaction() - Dim sql as String = "SELECT * FROM mytable" - Dim myCommand As New MySqlCommand(sql, conn, txn) - myCommand.CommandType = CommandType.Text - End Sub - - - public void CreateMySqlCommand() - { - MySqlConnection conn = new MySqlConnection("server=myserver") - conn.Open(); - MySqlTransaction txn = conn.BeginTransaction(); - string sql = "SELECT * FROM mytable"; - MySqlCommand myCommand = new MySqlCommand(sql, conn, txn); - myCommand.CommandType = CommandType.Text; - } - - - - - - - - - - - Executes a SQL statement against the connection and returns the number of rows affected. - - Number of rows affected - - You can use ExecuteNonQuery to perform any type of database operation, - however any resultsets returned will not be available. Any output parameters - used in calling a stored procedure will be populated with data and can be - retrieved after execution is complete. - For UPDATE, INSERT, and DELETE statements, the return value is the number - of rows affected by the command. For all other types of statements, the return - value is -1. - - - The following example creates a MySqlCommand and then - executes it using ExecuteNonQuery. The example is passed a string that is a - SQL statement (such as UPDATE, INSERT, or DELETE) and a string to use to - connect to the data source. - - Public Sub CreateMySqlCommand(myExecuteQuery As String, myConnection As MySqlConnection) - Dim myCommand As New MySqlCommand(myExecuteQuery, myConnection) - myCommand.Connection.Open() - myCommand.ExecuteNonQuery() - myConnection.Close() - End Sub - - - public void CreateMySqlCommand(string myExecuteQuery, MySqlConnection myConnection) - { - MySqlCommand myCommand = new MySqlCommand(myExecuteQuery, myConnection); - myCommand.Connection.Open(); - myCommand.ExecuteNonQuery(); - myConnection.Close(); - } - - - - - - - Sends the to the Connection, - and builds a using one of the values. - - - One of the values. - - - - When the property is set to StoredProcedure, - the property should be set to the name of the stored - procedure. The command executes this stored procedure when you call - ExecuteReader. - - - The supports a special mode that enables large binary - values to be read efficiently. For more information, see the SequentialAccess - setting for . - - - While the is in use, the associated - is busy serving the MySqlDataReader. - While in this state, no other operations can be performed on the - MySqlConnection other than closing it. This is the case until the - method of the MySqlDataReader is called. - If the MySqlDataReader is created with CommandBehavior set to - CloseConnection, closing the MySqlDataReader closes the connection - automatically. - - - When calling ExecuteReader with the SingleRow behavior, you should be aware that using a limit - clause in your SQL will cause all rows (up to the limit given) to be retrieved by the client. The - method will still return false after the first row but pulling all rows of data - into the client will have a performance impact. If the limit clause is not necessary, it should - be avoided. - - - - A object. - - - - - - - Sends the to the Connection - and builds a . - - - A object. - - - - When the property is set to StoredProcedure, - the property should be set to the name of the stored - procedure. The command executes this stored procedure when you call - ExecuteReader. - - - While the is in use, the associated - is busy serving the MySqlDataReader. - While in this state, no other operations can be performed on the - MySqlConnection other than closing it. This is the case until the - method of the MySqlDataReader is called. - - - - The following example creates a , then executes it by - passing a string that is a SQL SELECT statement, and a string to use to connect to the - data source. - - Public Sub CreateMySqlDataReader(mySelectQuery As String, myConnection As MySqlConnection) - Dim myCommand As New MySqlCommand(mySelectQuery, myConnection) - myConnection.Open() - Dim myReader As MySqlDataReader - myReader = myCommand.ExecuteReader() - Try - While myReader.Read() - Console.WriteLine(myReader.GetString(0)) - End While - Finally - myReader.Close - myConnection.Close - End Try - End Sub - - - public void CreateMySqlDataReader(string mySelectQuery, MySqlConnection myConnection) - { - MySqlCommand myCommand = new MySqlCommand(mySelectQuery, myConnection); - myConnection.Open(); - MMySqlDataReader myReader; - myReader = myCommand.ExecuteReader(); - try - { - while(myReader.Read()) - { - Console.WriteLine(myReader.GetString(0)); - } - } - finally - { - myReader.Close(); - myConnection.Close(); - } - } - - - - - - - - Creates a prepared version of the command on an instance of MySQL Server. - - - - Prepared statements are only supported on MySQL version 4.1 and higher. Calling - prepare while connected to earlier versions of MySQL will succeed but will execute - the statement in the same way as unprepared. - - - - The following example demonstrates the use of the Prepare method. - - public sub PrepareExample() - Dim cmd as New MySqlCommand("INSERT INTO mytable VALUES (@val)", myConnection) - cmd.Parameters.Add( "@val", 10 ) - cmd.Prepare() - cmd.ExecuteNonQuery() - - cmd.Parameters(0).Value = 20 - cmd.ExecuteNonQuery() - end sub - - - private void PrepareExample() - { - MySqlCommand cmd = new MySqlCommand("INSERT INTO mytable VALUES (@val)", myConnection); - cmd.Parameters.Add( "@val", 10 ); - cmd.Prepare(); - cmd.ExecuteNonQuery(); - - cmd.Parameters[0].Value = 20; - cmd.ExecuteNonQuery(); - } - - - - - - - Executes the query, and returns the first column of the first row in the - result set returned by the query. Extra columns or rows are ignored. - - - The first column of the first row in the result set, or a null reference if the - result set is empty - - - - Use the ExecuteScalar method to retrieve a single value (for example, - an aggregate value) from a database. This requires less code than using the - method, and then performing the operations necessary - to generate the single value using the data returned by a - - - - The following example creates a and then - executes it using ExecuteScalar. The example is passed a string that is a - SQL statement that returns an aggregate result, and a string to use to - connect to the data source. - - - Public Sub CreateMySqlCommand(myScalarQuery As String, myConnection As MySqlConnection) - Dim myCommand As New MySqlCommand(myScalarQuery, myConnection) - myCommand.Connection.Open() - myCommand.ExecuteScalar() - myConnection.Close() - End Sub - - - public void CreateMySqlCommand(string myScalarQuery, MySqlConnection myConnection) - { - MySqlCommand myCommand = new MySqlCommand(myScalarQuery, myConnection); - myCommand.Connection.Open(); - myCommand.ExecuteScalar(); - myConnection.Close(); - } - - - public: - void CreateMySqlCommand(String* myScalarQuery, MySqlConnection* myConnection) - { - MySqlCommand* myCommand = new MySqlCommand(myScalarQuery, myConnection); - myCommand->Connection->Open(); - myCommand->ExecuteScalar(); - myConnection->Close(); - } - - - - - - - - Gets or sets the SQL statement to execute at the data source. - - - The SQL statement or stored procedure to execute. The default is an empty string. - - - - When the property is set to StoredProcedure, - the CommandText property should be set to the name of the stored procedure. - The user may be required to use escape character syntax if the stored procedure name - contains any special characters. The command executes this stored procedure when - you call one of the Execute methods. Starting with Connector/Net 5.0, having both a stored function - and stored procedure with the same name in the same database is not supported. It is - suggested that you provide unqiue names for your stored routines. - - - - The following example creates a and sets some of its properties. - - Public Sub CreateMySqlCommand() - Dim myCommand As New MySqlCommand() - myCommand.CommandText = "SELECT * FROM Mytable ORDER BY id" - myCommand.CommandType = CommandType.Text - End Sub - - - public void CreateMySqlCommand() - { - MySqlCommand myCommand = new MySqlCommand(); - myCommand.CommandText = "SELECT * FROM mytable ORDER BY id"; - myCommand.CommandType = CommandType.Text; - } - - - - - - - Gets or sets the wait time before terminating the attempt to execute a command - and generating an error. - - - The time (in seconds) to wait for the command to execute. The default is 30 - seconds. - - - CommandTimeout is dependent on the ability of MySQL to cancel an executing query. - Because of this, CommandTimeout is only supported when connected to MySQL - version 5.0.0 or higher. - - - - - - Gets or sets a value indicating how the property is to be interpreted. - - - One of the values. The default is Text. - - - - When you set the CommandType property to StoredProcedure, you - should set the property to the name of the stored - procedure. The command executes this stored procedure when you call one of the - Execute methods. - - - - The following example creates a and sets some of its properties. - - Public Sub CreateMySqlCommand() - Dim myCommand As New MySqlCommand() - myCommand.CommandType = CommandType.Text - End Sub - - - public void CreateMySqlCommand() - { - MySqlCommand myCommand = new MySqlCommand(); - myCommand.CommandType = CommandType.Text; - } - - - - - - - - - - - Gets or sets the used by this instance of the - . - - - The connection to a data source. The default value is a null reference - (Nothing in Visual Basic). - - - - If you set Connection while a transaction is in progress and the - property is not null, an - is generated. If the Transaction property is not null and the transaction - has already been committed or rolled back, Transaction is set to - null. - - - - The following example creates a and sets some of its properties. - - Public Sub CreateMySqlCommand() - Dim mySelectQuery As String = "SELECT * FROM mytable ORDER BY id" - Dim myConnectString As String = "Persist Security Info=False;database=test;server=myServer" - Dim myCommand As New MySqlCommand(mySelectQuery) - myCommand.Connection = New MySqlConnection(myConnectString) - myCommand.CommandType = CommandType.Text - End Sub - - - public void CreateMySqlCommand() - { - string mySelectQuery = "SELECT * FROM mytable ORDER BY id"; - string myConnectString = "Persist Security Info=False;database=test;server=myServer"; - MySqlCommand myCommand = new MySqlCommand(mySelectQuery); - myCommand.Connection = new MySqlConnection(myConnectString); - myCommand.CommandType = CommandType.Text; - } - - - - - - - - - Provides the id of the last inserted row. - - Id of the last inserted row. -1 if none exists. - - - An important point to remember is that this property can be used - in batch SQL scenarios but it's important to remember that it will - only reflect the insert id from the last insert statement in the batch. - - This property can also be used when the batch includes select statements - and ExecuteReader is used. This property can be consulted during result set - processing. - - - - - - Get the - - - The parameters of the SQL statement or stored procedure. The default is - an empty collection. - - - Connector/Net does not support unnamed parameters. Every parameter added to the collection must - have an associated name. - - - The following example creates a and displays its parameters. - To accomplish this, the method is passed a , a query string - that is a SQL SELECT statement, and an array of objects. - - Public Sub CreateMySqlCommand(myConnection As MySqlConnection, _ - mySelectQuery As String, myParamArray() As MySqlParameter) - Dim myCommand As New MySqlCommand(mySelectQuery, myConnection) - myCommand.CommandText = "SELECT id, name FROM mytable WHERE age=@age" - myCommand.UpdatedRowSource = UpdateRowSource.Both - myCommand.Parameters.Add(myParamArray) - Dim j As Integer - For j = 0 To myCommand.Parameters.Count - 1 - myCommand.Parameters.Add(myParamArray(j)) - Next j - Dim myMessage As String = "" - Dim i As Integer - For i = 0 To myCommand.Parameters.Count - 1 - myMessage += myCommand.Parameters(i).ToString() & ControlChars.Cr - Next i - Console.WriteLine(myMessage) - End Sub - - - public void CreateMySqlCommand(MySqlConnection myConnection, string mySelectQuery, - MySqlParameter[] myParamArray) - { - MySqlCommand myCommand = new MySqlCommand(mySelectQuery, myConnection); - myCommand.CommandText = "SELECT id, name FROM mytable WHERE age=@age"; - myCommand.Parameters.Add(myParamArray); - for (int j=0; j<myParamArray.Length; j++) - { - myCommand.Parameters.Add(myParamArray[j]) ; - } - string myMessage = ""; - for (int i = 0; i < myCommand.Parameters.Count; i++) - { - myMessage += myCommand.Parameters[i].ToString() + "\n"; - } - MessageBox.Show(myMessage); - } - - - - - - - Gets or sets the within which the executes. - - - The . The default value is a null reference (Nothing in Visual Basic). - - - You cannot set the Transaction property if it is already set to a - specific value, and the command is in the process of executing. If you set the - transaction property to a object that is not connected - to the same as the object, - an exception will be thrown the next time you attempt to execute a statement. - - - - - - Gets or sets how command results are applied to the - when used by the method - of the . - - - One of the values. - - - - The default value is - Both unless the command is automatically generated (as in the case of the - ), in which case the default is None. - - - - - diff --git a/Source/MySql.Data/docs/MySqlCommandBuilder.xml b/Source/MySql.Data/docs/MySqlCommandBuilder.xml deleted file mode 100644 index 8b3731faa..000000000 --- a/Source/MySql.Data/docs/MySqlCommandBuilder.xml +++ /dev/null @@ -1,321 +0,0 @@ - - - - Automatically generates single-table commands used to reconcile changes made to a DataSet with the associated MySQL database. This class cannot be inherited. - - - - The does not automatically generate the SQL statements required to - reconcile changes made to a DataSet with the associated instance of MySQL. - However, you can create a MySqlCommandBuilder object to automatically generate SQL statements for - single-table updates if you set the SelectCommand property - of the MySqlDataAdapter. Then, any additional SQL statements that you do not set are generated by the - MySqlCommandBuilder. - - - - The MySqlCommandBuilder registers itself as a listener for RowUpdating - events whenever you set the property. You can only associate one - MySqlDataAdapter or MySqlCommandBuilder object with each other at one time. - - - - To generate INSERT, UPDATE, or DELETE statements, the MySqlCommandBuilder uses the - SelectCommand property to retrieve a required set of metadata automatically. If you change - the SelectCommand after the metadata has is retrieved (for example, after the first update), you - should call the method to update the metadata. - - - - The SelectCommand must also return at least one primary key or unique - column. If none are present, an InvalidOperation exception is generated, - and the commands are not generated. - - - - The MySqlCommandBuilder also uses the Connection, - CommandTimeout, and Transaction - properties referenced by the SelectCommand. The user should call - RefreshSchema if any of these properties are modified, or if the - SelectCommand itself is replaced. Otherwise the InsertCommand, - UpdateCommand, and - DeleteCommand properties retain - their previous values. - - - - If you call Dispose, the MySqlCommandBuilder is disassociated - from the MySqlDataAdapter, and the generated commands are no longer used. - - - - Caution must be used when using MySqlCOmmandBuilder on MySql 4.0 systems. With MySql 4.0, - database/schema information is not provided to the connector for a query. This means that - a query that pulls columns from two identically named tables in two or more different databases - will not cause an exception to be thrown but will not work correctly. Even more dangerous - is the situation where your select statement references database X but is executed in - database Y and both databases have tables with similar layouts. This situation can cause - unwanted changes or deletes. - This note does not apply to MySQL versions 4.1 and later. - - - - - - The following example uses the , along - and , to - select rows from a data source. The example is passed an initialized - , a connection string, a - query string that is a SQL SELECT statement, and a string that is the - name of the database table. The example then creates a MySqlCommandBuilder. - - - Public Shared Function SelectRows(myConnection As String, mySelectQuery As String, myTableName As String) As DataSet - Dim myConn As New MySqlConnection(myConnection) - Dim myDataAdapter As New MySqlDataAdapter() - myDataAdapter.SelectCommand = New MySqlCommand(mySelectQuery, myConn) - Dim cb As SqlCommandBuilder = New MySqlCommandBuilder(myDataAdapter) - - myConn.Open() - - Dim ds As DataSet = New DataSet - myDataAdapter.Fill(ds, myTableName) - - ' Code to modify data in DataSet here - - ' Without the MySqlCommandBuilder this line would fail. - myDataAdapter.Update(ds, myTableName) - - myConn.Close() - End Function 'SelectRows - - - public static DataSet SelectRows(string myConnection, string mySelectQuery, string myTableName) - { - MySqlConnection myConn = new MySqlConnection(myConnection); - MySqlDataAdapter myDataAdapter = new MySqlDataAdapter(); - myDataAdapter.SelectCommand = new MySqlCommand(mySelectQuery, myConn); - MySqlCommandBuilder cb = new MySqlCommandBuilder(myDataAdapter); - - myConn.Open(); - - DataSet ds = new DataSet(); - myDataAdapter.Fill(ds, myTableName); - - //code to modify data in DataSet here - - //Without the MySqlCommandBuilder this line would fail - myDataAdapter.Update(ds, myTableName); - - myConn.Close(); - - return ds; - } - - - - - - - - Initializes a new instance of the class. - - - - - - Initializes a new instance of the class - with the associated object. - - - The to use. - - - - The registers itself as a listener for - events that are generated by the - specified in this property. - - - When you create a new instance MySqlCommandBuilder, any existing - MySqlCommandBuilder associated with this MySqlDataAdapter - is released. - - - - - - - - Gets or sets a object for which SQL statements are automatically generated. - - - A object. - - - - The registers itself as a listener for - events that are generated by the - specified in this property. - - - When you create a new instance MySqlCommandBuilder, any existing - MySqlCommandBuilder associated with this MySqlDataAdapter - is released. - - - - - - - Gets or sets the beginning character or characters to use when specifying MySQL - database objects (for example, tables or columns) whose names contain - characters such as spaces or reserved tokens. - - - The beginning character or characters to use. The default value is `. - - - Database objects in MySQL can contain special characters such as spaces that would - make normal SQL strings impossible to correctly parse. Use of the QuotePrefix - and the properties allows the - to build SQL commands that handle this situation. - - - - - - Gets or sets the beginning character or characters to use when specifying MySQL - database objects (for example, tables or columns) whose names contain - characters such as spaces or reserved tokens. - - - The beginning character or characters to use. The default value is `. - - - Database objects in MySQL can contain special characters such as spaces that would - make normal SQL strings impossible to correctly parse. Use of the - and the QuoteSuffix properties allows the - to build SQL commands that handle this situation. - - - - - - - - - - - - - - Gets the automatically generated object - required to perform deletions on the database. - - - The object generated to handle delete operations. - - - - An application can use the GetDeleteCommand method for informational - or troubleshooting purposes because it returns the - object to be executed. - - - You can also use GetDeleteCommand as the basis of a modified command. - For example, you might call GetDeleteCommand and modify the - value, and then explicitly set that on the - . - - - After the SQL statement is first generated, the application must explicitly - call if it changes the statement in any way. - Otherwise, the GetDeleteCommand will be still be using information - from the previous statement, which might not be correct. The SQL statements - are first generated either when the application calls - or GetDeleteCommand. - - - - - - - Gets the automatically generated object - required to perform insertions on the database. - - - The object generated to handle insert operations. - - - - An application can use the GetInsertCommand method for informational - or troubleshooting purposes because it returns the - object to be executed. - - - You can also use the GetInsertCommand as the basis of a modified command. - For example, you might call GetInsertCommand and modify the - value, and then explicitly set that on the - . - - - After the SQL statement is first generated, the application must explicitly - call if it changes the statement in any way. - Otherwise, the GetInsertCommand will be still be using information - from the previous statement, which might not be correct. The SQL statements - are first generated either when the application calls - or GetInsertCommand. - - - - - - - Gets the automatically generated object - required to perform updates on the database. - - - The object generated to handle update operations. - - - - An application can use the GetUpdateCommand method for informational - or troubleshooting purposes because it returns the - object to be executed. - - - You can also use GetUpdateCommand as the basis of a modified command. - For example, you might call GetUpdateCommand and modify the - value, and then explicitly set that on the - . - - - After the SQL statement is first generated, the application must explicitly - call if it changes the statement in any way. - Otherwise, the GetUpdateCommand will be still be using information - from the previous statement, which might not be correct. The SQL statements - are first generated either when the application calls - or GetUpdateCommand. - - - - - - - Refreshes the database schema information used to generate INSERT, UPDATE, or - DELETE statements. - - - - An application should call RefreshSchema whenever the SELECT statement - associated with the changes. - - - An application should call RefreshSchema whenever the - value of the changes. - - - - - \ No newline at end of file diff --git a/Source/MySql.Data/docs/MySqlConnection.xml b/Source/MySql.Data/docs/MySqlConnection.xml deleted file mode 100644 index 9f340aec7..000000000 --- a/Source/MySql.Data/docs/MySqlConnection.xml +++ /dev/null @@ -1,1248 +0,0 @@ - - - - Initializes a new instance of the class. - - - When a new instance of is created, the read/write - properties are set to the following initial values unless they are specifically - set using their associated keywords in the property. - - - - Properties - Initial Value - - - - - - empty string ("") - - - - - - 15 - - - - - - empty string ("") - - - - - - empty string ("") - - - - - - empty string ("") - - - - You can change the value for these properties only by using the ConnectionString property. - - - - - - Initializes a new instance of the class. - - - - - - - Initializes a new instance of the class when given a string containing the connection string. - - - When a new instance of is created, the read/write - properties are set to the following initial values unless they are specifically - set using their associated keywords in the property. - - - - Properties - Initial Value - - - - - - empty string ("") - - - - - - 15 - - - - - - empty string ("") - - - - - - empty string ("") - - - - - - empty string ("") - - - - You can change the value for these properties only by using the ConnectionString property. - - - - The connection properties used to open the MySQL database. - - - - Opens a database connection with the property settings specified by the ConnectionString. - Cannot open a connection without specifying a data source or server. - A connection-level error occurred while opening the connection. - - - The draws an open connection from the connection pool if one is available. - Otherwise, it establishes a new connection to an instance of MySQL. - - - - The following example creates a , opens it, - displays some of its properties, then closes the connection. - - - Public Sub CreateMySqlConnection(myConnString As String) - Dim myConnection As New MySqlConnection(myConnString) - myConnection.Open() - MessageBox.Show("ServerVersion: " + myConnection.ServerVersion _ - + ControlChars.Cr + "State: " + myConnection.State.ToString()) - myConnection.Close() - End Sub - - - public void CreateMySqlConnection(string myConnString) - { - MySqlConnection myConnection = new MySqlConnection(myConnString); - myConnection.Open(); - MessageBox.Show("ServerVersion: " + myConnection.ServerVersion + - "\nState: " + myConnection.State.ToString()); - myConnection.Close(); - } - - - - - - Gets the name of the current database or the database to be used after a connection is opened. - The name of the current database or the name of the database to be used after a connection is opened. The default value is an empty string. - - - The Database property does not update dynamically. - If you change the current database using a SQL statement, then this property - may reflect the wrong value. If you change the current database using the - method, this property is updated to reflect the new database. - - - - The following example creates a and displays - some of its read-only properties. - - - Public Sub CreateMySqlConnection() - Dim myConnString As String = _ - "Persist Security Info=False;database=test;server=localhost;user id=joeuser;pwd=pass" - Dim myConnection As New MySqlConnection( myConnString ) - myConnection.Open() - MessageBox.Show( "Server Version: " + myConnection.ServerVersion _ - + ControlChars.NewLine + "Database: " + myConnection.Database ) - myConnection.ChangeDatabase( "test2" ) - MessageBox.Show( "ServerVersion: " + myConnection.ServerVersion _ - + ControlChars.NewLine + "Database: " + myConnection.Database ) - myConnection.Close() - End Sub - - - - public void CreateMySqlConnection() - { - string myConnString = - "Persist Security Info=False;database=test;server=localhost;user id=joeuser;pwd=pass"; - MySqlConnection myConnection = new MySqlConnection( myConnString ); - myConnection.Open(); - MessageBox.Show( "Server Version: " + myConnection.ServerVersion - + "\nDatabase: " + myConnection.Database ); - myConnection.ChangeDatabase( "test2" ); - MessageBox.Show( "ServerVersion: " + myConnection.ServerVersion - + "\nDatabase: " + myConnection.Database ); - myConnection.Close(); - } - - - - - - Gets the current state of the connection. - - A bitwise combination of the values. The default is Closed. - - - The allowed state changes are: - - - From Closed to Open, using the Open method of the connection object. - - - From Open to Closed, using either the Close method or the Dispose method of the connection object. - - - - - The following example creates a , opens it, - displays some of its properties, then closes the connection. - - - Public Sub CreateMySqlConnection(myConnString As String) - Dim myConnection As New MySqlConnection(myConnString) - myConnection.Open() - MessageBox.Show("ServerVersion: " + myConnection.ServerVersion _ - + ControlChars.Cr + "State: " + myConnection.State.ToString()) - myConnection.Close() - End Sub - - - public void CreateMySqlConnection(string myConnString) - { - MySqlConnection myConnection = new MySqlConnection(myConnString); - myConnection.Open(); - MessageBox.Show("ServerVersion: " + myConnection.ServerVersion + - "\nState: " + myConnection.State.ToString()); - myConnection.Close(); - } - - - - - - Gets a string containing the version of the MySQL server to which the client is connected. - The version of the instance of MySQL. - The connection is closed. - - The following example creates a , opens it, - displays some of its properties, then closes the connection. - - - Public Sub CreateMySqlConnection(myConnString As String) - Dim myConnection As New MySqlConnection(myConnString) - myConnection.Open() - MessageBox.Show("ServerVersion: " + myConnection.ServerVersion _ - + ControlChars.Cr + "State: " + myConnection.State.ToString()) - myConnection.Close() - End Sub - - - public void CreateMySqlConnection(string myConnString) - { - MySqlConnection myConnection = new MySqlConnection(myConnString); - myConnection.Open(); - MessageBox.Show("ServerVersion: " + myConnection.ServerVersion + - "\nState: " + myConnection.State.ToString()); - myConnection.Close(); - } - - - - - - Closes the connection to the database. This is the preferred method of closing any open connection. - - - The Close method rolls back any pending transactions. It then releases - the connection to the connection pool, or closes the connection if connection - pooling is disabled. - - - An application can call Close more than one time. No exception is - generated. - - - - The following example creates a , opens it, - displays some of its properties, then closes the connection. - - - Public Sub CreateMySqlConnection(myConnString As String) - Dim myConnection As New MySqlConnection(myConnString) - myConnection.Open() - MessageBox.Show("ServerVersion: " + myConnection.ServerVersion _ - + ControlChars.Cr + "State: " + myConnection.State.ToString()) - myConnection.Close() - End Sub - - - public void CreateMySqlConnection(string myConnString) - { - MySqlConnection myConnection = new MySqlConnection(myConnString); - myConnection.Open(); - MessageBox.Show("ServerVersion: " + myConnection.ServerVersion + - "\nState: " + myConnection.State.ToString()); - myConnection.Close(); - } - - - - - - - Creates and returns a object associated with the . - - - A object. - - - - - Begins a database transaction. - An object representing the new transaction. - Parallel transactions are not supported. - - This command is equivalent to the MySQL BEGIN TRANSACTION command. - - You must explicitly commit or roll back the transaction using the or - method. - - If you do not specify an isolation level, the default isolation level is used. To specify an isolation - level with the method, use the overload that takes the iso parameter. Also - note that any attempt to begin a transaction while a transaction is in progress will throw an exception on MySQL 4.1 and higher. - On MySQL 4.0, an exception will not be thrown because servers 4.0 and earlier did not report their transacation status. - - - - - The following example creates a and a - . It also demonstrates how to use the BeginTransaction, a - , and methods. - - Public Sub RunTransaction(myConnString As String) - Dim myConnection As New MySqlConnection(myConnString) - myConnection.Open() - - Dim myCommand As MySqlCommand = myConnection.CreateCommand() - Dim myTrans As MySqlTransaction - - ' Start a local transaction - myTrans = myConnection.BeginTransaction() - ' Must assign both transaction object and connection - ' to Command object for a pending local transaction - myCommand.Connection = myConnection - myCommand.Transaction = myTrans - - Try - myCommand.CommandText = "Insert into Test (id, desc) VALUES (100, 'Description')" - myCommand.ExecuteNonQuery() - myCommand.CommandText = "Insert into Test (id, desc) VALUES (101, 'Description')" - myCommand.ExecuteNonQuery() - myTrans.Commit() - Console.WriteLine("Both records are written to database.") - Catch e As Exception - Try - myTrans.Rollback() - Catch ex As MySqlException - If Not myTrans.Connection Is Nothing Then - Console.WriteLine("An exception of type " + ex.GetType().ToString() + _ - " was encountered while attempting to roll back the transaction.") - End If - End Try - - Console.WriteLine("An exception of type " + e.GetType().ToString() + _ - "was encountered while inserting the data.") - Console.WriteLine("Neither record was written to database.") - Finally - myConnection.Close() - End Try - End Sub - - - public void RunTransaction(string myConnString) - { - MySqlConnection myConnection = new MySqlConnection(myConnString); - myConnection.Open(); - - MySqlCommand myCommand = myConnection.CreateCommand(); - MySqlTransaction myTrans; - - // Start a local transaction - myTrans = myConnection.BeginTransaction(); - // Must assign both transaction object and connection - // to Command object for a pending local transaction - myCommand.Connection = myConnection; - myCommand.Transaction = myTrans; - - try - { - myCommand.CommandText = "insert into Test (id, desc) VALUES (100, 'Description')"; - myCommand.ExecuteNonQuery(); - myCommand.CommandText = "insert into Test (id, desc) VALUES (101, 'Description')"; - myCommand.ExecuteNonQuery(); - myTrans.Commit(); - Console.WriteLine("Both records are written to database."); - } - catch(Exception e) - { - try - { - myTrans.Rollback(); - } - catch (SqlException ex) - { - if (myTrans.Connection != null) - { - Console.WriteLine("An exception of type " + ex.GetType() + - " was encountered while attempting to roll back the transaction."); - } - } - - Console.WriteLine("An exception of type " + e.GetType() + - " was encountered while inserting the data."); - Console.WriteLine("Neither record was written to database."); - } - finally - { - myConnection.Close(); - } - } - - - - - - Begins a database transaction with the specified isolation level. - The isolation level under which the transaction should run. - An object representing the new transaction. - Parallel exceptions are not supported. - - This command is equivalent to the MySQL BEGIN TRANSACTION command. - - You must explicitly commit or roll back the transaction using the or - method. - - If you do not specify an isolation level, the default isolation level is used. To specify an isolation - level with the method, use the overload that takes the iso parameter. - Also note that any attempt to begin a transaction while a transaction is in progress will throw an exception on MySQL 4.1 and higher. - On MySQL 4.0, an exception will not be thrown because servers 4.0 and earlier did not report their transacation status. - - - - - The following example creates a and a - . It also demonstrates how to use the BeginTransaction, a - , and methods. - - Public Sub RunTransaction(myConnString As String) - Dim myConnection As New MySqlConnection(myConnString) - myConnection.Open() - - Dim myCommand As MySqlCommand = myConnection.CreateCommand() - Dim myTrans As MySqlTransaction - - ' Start a local transaction - myTrans = myConnection.BeginTransaction() - ' Must assign both transaction object and connection - ' to Command object for a pending local transaction - myCommand.Connection = myConnection - myCommand.Transaction = myTrans - - Try - myCommand.CommandText = "Insert into Test (id, desc) VALUES (100, 'Description')" - myCommand.ExecuteNonQuery() - myCommand.CommandText = "Insert into Test (id, desc) VALUES (101, 'Description')" - myCommand.ExecuteNonQuery() - myTrans.Commit() - Console.WriteLine("Both records are written to database.") - Catch e As Exception - Try - myTrans.Rollback() - Catch ex As MySqlException - If Not myTrans.Connection Is Nothing Then - Console.WriteLine("An exception of type " + ex.GetType().ToString() + _ - " was encountered while attempting to roll back the transaction.") - End If - End Try - - Console.WriteLine("An exception of type " + e.GetType().ToString() + _ - "was encountered while inserting the data.") - Console.WriteLine("Neither record was written to database.") - Finally - myConnection.Close() - End Try - End Sub - - - public void RunTransaction(string myConnString) - { - MySqlConnection myConnection = new MySqlConnection(myConnString); - myConnection.Open(); - - MySqlCommand myCommand = myConnection.CreateCommand(); - MySqlTransaction myTrans; - - // Start a local transaction - myTrans = myConnection.BeginTransaction(); - // Must assign both transaction object and connection - // to Command object for a pending local transaction - myCommand.Connection = myConnection; - myCommand.Transaction = myTrans; - - try - { - myCommand.CommandText = "insert into Test (id, desc) VALUES (100, 'Description')"; - myCommand.ExecuteNonQuery(); - myCommand.CommandText = "insert into Test (id, desc) VALUES (101, 'Description')"; - myCommand.ExecuteNonQuery(); - myTrans.Commit(); - Console.WriteLine("Both records are written to database."); - } - catch(Exception e) - { - try - { - myTrans.Rollback(); - } - catch (SqlException ex) - { - if (myTrans.Connection != null) - { - Console.WriteLine("An exception of type " + ex.GetType() + - " was encountered while attempting to roll back the transaction."); - } - } - - Console.WriteLine("An exception of type " + e.GetType() + - " was encountered while inserting the data."); - Console.WriteLine("Neither record was written to database."); - } - finally - { - myConnection.Close(); - } - } - - - - - - Changes the current database for an open MySqlConnection. - The name of the database to use. - - - The value supplied in the database parameter must be a valid database - name. The database parameter cannot contain a null value, an empty - string, or a string with only blank characters. - - - - When you are using connection pooling against MySQL, and you close - the connection, it is returned to the connection pool. The next time the - connection is retrieved from the pool, the reset connection request - executes before the user performs any operations. - - - The database name is not valid. - The connection is not open. - Cannot change the database. - - The following example creates a and displays - some of its read-only properties. - - - Public Sub CreateMySqlConnection() - Dim myConnString As String = _ - "Persist Security Info=False;database=test;server=localhost;user id=joeuser;pwd=pass" - Dim myConnection As New MySqlConnection( myConnString ) - myConnection.Open() - MessageBox.Show( "Server Version: " + myConnection.ServerVersion _ - + ControlChars.NewLine + "Database: " + myConnection.Database ) - myConnection.ChangeDatabase( "test2" ) - MessageBox.Show( "ServerVersion: " + myConnection.ServerVersion _ - + ControlChars.NewLine + "Database: " + myConnection.Database ) - myConnection.Close() - End Sub - - - - public void CreateMySqlConnection() - { - string myConnString = - "Persist Security Info=False;database=test;server=localhost;user id=joeuser;pwd=pass"; - MySqlConnection myConnection = new MySqlConnection( myConnString ); - myConnection.Open(); - MessageBox.Show( "Server Version: " + myConnection.ServerVersion - + "\nDatabase: " + myConnection.Database ); - myConnection.ChangeDatabase( "test2" ); - MessageBox.Show( "ServerVersion: " + myConnection.ServerVersion - + "\nDatabase: " + myConnection.Database ); - myConnection.Close(); - } - - - - - - Occurs when the state of the connection changes. - - - The StateChange event fires whenever the changes from - closed to opened, or from opened to closed. StateChange fires immediately - after the transitions. - - - - If an event handler throws an exception from within the StateChange - event, the exception propagates to the caller of the or - method. - - - - The StateChange event is not raised unless you explicitly call - Close or Dispose. - - - - Raised. - - - The event handler receives an argument of type - containing data related to this event. The following StateChangeEventArgs - properties provide information specific to this event. - - - - Property - Description - - - - - - - Gets the new state of the connection. The connection object will - be in the new state already when the event is fired. - - - - - - - Gets the original state of the connection. - - - - - - - - Occurs when MySQL returns warnings as a result of executing a command or query. - - - - - - - Represents an open connection to a MySQL Server database. This class cannot be inherited. - - - - A MySqlConnection object represents a session to a MySQL Server - data source. When you create an instance of MySqlConnection, all - properties are set to their initial values. For a list of these values, see the - MySqlConnection constructor. - - - - If the MySqlConnection goes out of scope, it is not closed. Therefore, - you must explicitly close the connection by calling - or . - - - - - The following example creates a and - a MySqlConnection. The MySqlConnection is opened and set as the - for the MySqlCommand. The example then calls - , and closes the connection. To accomplish this, the ExecuteNonQuery is - passed a connection string and a query string that is a SQL INSERT - statement. - - - Public Sub InsertRow(myConnectionString As String) - ' If the connection string is null, use a default. - If myConnectionString = "" Then - myConnectionString = "Database=Test;Data Source=localhost;User Id=username;Password=pass" - End If - Dim myConnection As New MySqlConnection(myConnectionString) - Dim myInsertQuery As String = "INSERT INTO Orders (id, customerId, amount) Values(1001, 23, 30.66)" - Dim myCommand As New MySqlCommand(myInsertQuery) - myCommand.Connection = myConnection - myConnection.Open() - myCommand.ExecuteNonQuery() - myCommand.Connection.Close() - End Sub - - - - - public void InsertRow(string myConnectionString) - { - // If the connection string is null, use a default. - if(myConnectionString == "") - { - myConnectionString = "Database=Test;Data Source=localhost;User Id=username;Password=pass"; - } - MySqlConnection myConnection = new MySqlConnection(myConnectionString); - string myInsertQuery = "INSERT INTO Orders (id, customerId, amount) Values(1001, 23, 30.66)"; - MySqlCommand myCommand = new MySqlCommand(myInsertQuery); - myCommand.Connection = myConnection; - myConnection.Open(); - myCommand.ExecuteNonQuery(); - myCommand.Connection.Close(); - } - - - - - - - - Gets the time to wait while trying to establish a connection before terminating the attempt and generating an error. - - The value set is less than 0. - - A value of 0 indicates no limit, and should be avoided in a - because an attempt to connect - will wait indefinitely. - - - The following example creates a MySqlConnection - and sets some of its properties in the connection string. - - Public Sub CreateSqlConnection() - Dim myConnection As New MySqlConnection() - myConnection.ConnectionString = "Persist Security Info=False;Username=user;Password=pass;database=test1;server=localhost;Connect Timeout=30" - myConnection.Open() - End Sub - - - public void CreateSqlConnection() - { - MySqlConnection myConnection = new MySqlConnection(); - myConnection.ConnectionString = "Persist Security Info=False;Username=user;Password=pass;database=test1;server=localhost;Connect Timeout=30"; - myConnection.Open(); - } - - - - - - - - Gets or sets the string used to connect to a MySQL Server database. - - - - The ConnectionString returned may not be exactly like what was originally - set but will be indentical in terms of keyword/value pairs. Security information - will not be included unless the Persist Security Info value is set to true. - - - You can use the ConnectionString property to connect to a database. - The following example illustrates a typical connection string. - - "Persist Security Info=False;database=MyDB;server=MySqlServer;user id=myUser;Password=myPass" - - The ConnectionString property can be set only when the connection is - closed. Many of the connection string values have corresponding read-only - properties. When the connection string is set, all of these properties are - updated, except when an error is detected. In this case, none of the properties - are updated. properties return only those settings contained in the - ConnectionString. - - - To connect to a local machine, specify "localhost" for the server. If you do not - specify a server, localhost is assumed. - - - Resetting the ConnectionString on a closed connection resets all - connection string values (and related properties) including the password. For - example, if you set a connection string that includes "Database= MyDb", and - then reset the connection string to "Data Source=myserver;User Id=myUser;Password=myPass", - the property is no longer set to MyDb. - - - The connection string is parsed immediately after being set. If errors in - syntax are found when parsing, a runtime exception, such as , - is generated. Other errors can be found only when an attempt is made to open the - connection. - - - The basic format of a connection string consists of a series of keyword/value - pairs separated by semicolons. The equal sign (=) connects each keyword and its - value. To include values that contain a semicolon, single-quote character, or - double-quote character, the value must be enclosed in double quotes. If the - value contains both a semicolon and a double-quote character, the value can be - enclosed in single quotes. The single quote is also useful if the value begins - with a double-quote character. Conversely, the double quote can be used if the - value begins with a single quote. If the value contains both single-quote and - double-quote characters, the quote character used to enclose the value must be - doubled each time it occurs within the value. - - - To include preceding or trailing spaces in the string value, the value must - be enclosed in either single quotes or double quotes. Any leading or trailing - spaces around integer, Boolean, or enumerated values are ignored, even if - enclosed in quotes. However, spaces within a string literal keyword or value are - preserved. Using .NET Framework version 1.1, single or double quotes may be used - within a connection string without using delimiters (for example, Data Source= - my'Server or Data Source= my"Server), unless a quote character is the first or - last character in the value. - - - To include an equal sign (=) in a keyword or value, it must be preceded by - another equal sign. For example, in the hypothetical connection string - - "key==word=value" - - the keyword is "key=word" and the value is "value". - - If a specific keyword in a keyword= value pair occurs multiple times in a - connection string, the last occurrence listed is used in the value set. - - Keywords are not case sensitive. - - The following table lists the valid names for keyword values within the - ConnectionString. - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDefaultDescription
- Connect Timeout -or- Connection Timeout - 15 - The length of time (in seconds) to wait for a connection to the server before - terminating the attempt and generating an error. -
- Host -or- Server -or- Data Source -or- - DataSource -or- Address -or- Addr -or- - Network Address - localhost - - The name or network address of the instance of MySQL to which to connect. Multiple hosts can be - specified separated by &. This can be useful where multiple MySQL servers are configured for replication - and you are not concerned about the precise server you are connecting to. No attempt is made by the provider to - synchronize writes to the database so care should be taken when using this option. - - - In Unix environment with Mono, this can be a fully qualified path to MySQL socket filename. With this configuration, the Unix socket will be used instead of TCP/IP socket. - Currently only a single socket name can be given so accessing MySQL in a replicated environment using Unix sockets is not currently supported. - -
Port3306 - The port MySQL is using to listen for connections. This value is ignored if the connection protocol - is anything but socket. -
Protocolsocket - Specifies the type of connection to make to the server.Values can be: - socket or tcp for a socket connection
- pipe for a named pipe connection
- unix for a Unix socket connection
- memory to use MySQL shared memory -
- CharSet -or Character Set - - Specifies the character set that should be used to encode all queries sent to the server. - Resultsets are still returned in the character set of the data returned. -
LoggingfalseWhen true, various pieces of information is output to any configured TraceListeners.
Allow Batchtrue - When true, multiple SQL statements can be sent with one command execution.

- -Note-
- Starting with MySQL 4.1.1, batch statements should be separated by the server-defined seperator character.
- Commands sent to earlier versions of MySQL should be seperated with ';'. -
Encryptfalse - When true, SSL/TLS encryption is used for all data sent between the - client and server if the server has a certificate installed. Recognized values - are true, false, yes, and no. -
- Initial Catalog -or- Database - mysqlThe name of the database to use intially
- Password -or- pwd - The password for the MySQL account being used.
Persist Security Infofalse - When set to false or no (strongly recommended), security-sensitive - information, such as the password, is not returned as part of the connection if - the connection is open or has ever been in an open state. Resetting the - connection string resets all connection string values including the password. - Recognized values are true, false, yes, and no. -
- User Id -or- Username -or- Uid -or- User name - The MySQL login account being used.
Shared Memory NameMYSQLThe name of the shared memory object to use for communication if the connection protocol is set to memory.
Allow Zero Datetimefalse - True to have MySqlDataReader.GetValue() return a MySqlDateTime for date or datetime columns that have illegal values. - False will cause a DateTime object to be returned for legal values and an exception will be thrown for illegal values. -
Convert Zero Datetimefalse - True to have MySqlDataReader.GetValue() and MySqlDataReader.GetDateTime() - return DateTime.MinValue for date or datetime columns that have illegal values. -
- Pipe Name -or- Pipe - mysql - When set to the name of a named pipe, the MySqlConnection will attempt to connect to MySQL - on that named pipe.

This settings only applies to the Windows platform. -
- Use Performance Monitor -or- UsePerformanceMonitor - false - Posts performance data that can be tracked using perfmon -
- Procedure Cache Size - 25 - How many stored procedure definitions can be held in the cache -
- Ignore Prepare - true - Instructs the provider to ignore any attempts to prepare commands. This option - was added to allow a user to disable prepared statements in an entire application - without modifying the code. A user might want to do this if errors or bugs are - encountered with MySQL prepared statements. -
Use Procedure Bodiestrue - Instructs the provider to attempt to call the procedure without first resolving the metadata. This - is useful in situations where the calling user does not have access to the mysql.proc table. To - use this mode, the parameters for the procedure must be added to the command in the same order - as they appear in the procedure definition and their types must be explicitly set. -
Auto Enlisttrue - Indicates whether the connection should automatically enlist in the current transaction, - if there is one. -
Respect Binary Flagstrue - Indicates whether the connection should respect all binary flags sent to the client - as part of column metadata. False will cause the connector to behave like - Connector/Net 5.0 and earlier. -
BlobAsUTF8IncludePatternnull - Pattern that should be used to indicate which blob columns should be treated as UTF-8. -
BlobAsUTF8ExcludePatternnull - Pattern that should be used to indicate which blob columns should not be treated as UTF-8. -
Default Command Timeout30 - The default timeout that new MySqlCommand objects will use unless changed. -
Allow User Variablesfalse - Should the provider expect user variables in the SQL. -
Interactive -or- Interactive Sessionfalse - Should this session be considered interactive? -
Functions Return Stringfalse - Set this option to true to force the return value of SQL functions to be string. -
Use Affected Rowsfalse - Set this option to true to cause the affected rows reported to reflect only the - rows that are actually changed. By default, the number of rows that are matched - is returned. -
- - - The following table lists the valid names for connection pooling values within - the ConnectionString. For more information about connection pooling, see - Connection Pooling for the MySql Data Provider. - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameDefaultDescription
Connection Lifetime0 - When a connection is returned to the pool, its creation time is compared with - the current time, and the connection is destroyed if that time span (in seconds) - exceeds the value specified by Connection Lifetime. This is useful in - clustered configurations to force load balancing between a running server and a - server just brought online. - - A value of zero (0) causes pooled connections to have the maximum connection - timeout. - -
Max Pool Size100The maximum number of connections allowed in the pool.
Min Pool Size0The minimum number of connections allowed in the pool.
Poolingtrue - When true, the MySqlConnection object is drawn from the appropriate - pool, or if necessary, is created and added to the appropriate pool. Recognized - values are true, false, yes, and no. -
Connection Resetfalse - Specifies whether the database connection should be reset when being - drawn from the pool. Leaving this as false will yeild much faster - connection opens but the user should understand the side effects - of doing this such as temporary tables and user variables from the previous - session not being cleared out. -
Cache Server Propertiesfalse - Specifies whether the server variables are cached between pooled connections. - On systems where the variables change infrequently and there are lots of - connection attempts, this can speed up things dramatically. -
-
- - When setting keyword or connection pooling values that require a Boolean - value, you can use 'yes' instead of 'true', and 'no' instead of 'false'. - - - Note The MySql Data Provider uses the native socket protocol to - communicate with MySQL. Therefore, it does not support the use of an ODBC data source name (DSN) when - connecting to MySQL because it does not add an ODBC layer. - - - CAUTION In this release, the application should use caution when constructing a - connection string based on user input (for example when retrieving user ID and password information from a - dialog box, and appending it to the connection string). The application should - ensure that a user cannot embed extra connection string parameters in these - values (for example, entering a password as "validpassword;database=somedb" in - an attempt to attach to a different database). - - - - The following example creates a and sets some of its properties - - Public Sub CreateConnection() - Dim myConnection As New MySqlConnection() - myConnection.ConnectionString = "Persist Security Info=False;database=myDB;server=myHost;Connect Timeout=30;user id=myUser; pwd=myPass" - myConnection.Open() - End Sub 'CreateConnection - - - public void CreateConnection() - { - MySqlConnection myConnection = new MySqlConnection(); - myConnection.ConnectionString = "Persist Security Info=False;database=myDB;server=myHost;Connect Timeout=30;user id=myUser; pwd=myPass"; - myConnection.Open(); - } - - - - The following example creates a in Unix environment with Mono installed. MySQL socket filename used in this example is "/var/lib/mysql/mysql.sock". The actual filename depends on your MySQL configuration. - - Public Sub CreateConnection() - Dim myConnection As New MySqlConnection() - myConnection.ConnectionString = "database=myDB;server=/var/lib/mysql/mysql.sock;user id=myUser; pwd=myPass" - myConnection.Open() - End Sub 'CreateConnection - - - public void CreateConnection() - { - MySqlConnection myConnection = new MySqlConnection(); - myConnection.ConnectionString = "database=myDB;server=/var/lib/mysql/mysql.sock;user id=myUser; pwd=myPass"; - myConnection.Open(); - } - - - - - Empties the connection pool associated with the specified connection. - - The associated with the pool to be cleared. - - - - ClearPool clears the connection pool that is associated with the connection. - If additional connections associated with connection are in use at the time of the call, - they are marked appropriately and are discarded (instead of being returned to the pool) - when Close is called on them. - - - - - - Clears all connection pools. - - - ClearAllPools essentially performs a on all current connection - pools. - - - - - diff --git a/Source/MySql.Data/docs/MySqlConnectionStringBuilder.xml b/Source/MySql.Data/docs/MySqlConnectionStringBuilder.xml deleted file mode 100644 index 3955bfad8..000000000 --- a/Source/MySql.Data/docs/MySqlConnectionStringBuilder.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - Gets or sets the name or address of the MySQL instance to connect to. - - - If this property is not set, then the provider will attempt to - connect to localhost even though this property will return - String.Empty. - - - - - - - - Gets or sets the name of the database that should be selected - when the connection is first opened. - - - There is no default for this property and, if not set, the - connection will not have a current database until one is set - using the method. - - - - - - - - Gets or sets the connection protocol that is being used for this - connection. - - - - - - - - - - - Gets or sets the name of the named pipe object that the provider - should use. - - - This property has no effect unless the - property has been set to NamedPipe. - - - - - - - \ No newline at end of file diff --git a/Source/MySql.Data/docs/MySqlDataAdapter.xml b/Source/MySql.Data/docs/MySqlDataAdapter.xml deleted file mode 100644 index f499ca627..000000000 --- a/Source/MySql.Data/docs/MySqlDataAdapter.xml +++ /dev/null @@ -1,801 +0,0 @@ - - - - Represents a set of data commands and a database connection that are used to fill a dataset and update a MySQL database. This class cannot be inherited. - - - - The MySQLDataAdapter, serves as a bridge between a - and MySQL for retrieving and saving data. The MySQLDataAdapter provides this - bridge by mapping , which changes the data in the - DataSet to match the data in the data source, and , - which changes the data in the data source to match the data in the DataSet, - using the appropriate SQL statements against the data source. - - - When the MySQLDataAdapter fills a DataSet, it will create the necessary - tables and columns for the returned data if they do not already exist. However, primary - key information will not be included in the implicitly created schema unless the - property is set to . - You may also have the MySQLDataAdapter create the schema of the DataSet, - including primary key information, before filling it with data using . - - - MySQLDataAdapter is used in conjunction with - and to increase performance when connecting to a MySQL database. - - - The MySQLDataAdapter also includes the , - , , - , and - properties to facilitate the loading and updating of data. - - - When an instance of MySQLDataAdapter is created, the read/write properties - are set to initial values. For a list of these values, see the MySQLDataAdapter - constructor. - - - Please be aware that the class allows only - Int16, Int32, and Int64 to have the AutoIncrement property set. - If you plan to use autoincremement columns with MySQL, you should consider - using signed integer columns. - - - - - The following example creates a and a . - The MySqlConnection is opened and set as the for the - MySqlCommand. The example then calls , and closes - the connection. To accomplish this, the ExecuteNonQuery is - passed a connection string and a query string that is a SQL INSERT - statement. - - Public Function SelectRows(dataSet As DataSet, connection As String, query As String) As DataSet - Dim conn As New MySqlConnection(connection) - Dim adapter As New MySqlDataAdapter() - adapter.SelectCommand = new MySqlCommand(query, conn) - adapter.Fill(dataset) - Return dataset - End Function - - - public DataSet SelectRows(DataSet dataset,string connection,string query) - { - MySqlConnection conn = new MySqlConnection(connection); - MySqlDataAdapter adapter = new MySqlDataAdapter(); - adapter.SelectCommand = new MySqlCommand(query, conn); - adapter.Fill(dataset); - return dataset; - } - - - - - - - - Initializes a new instance of the MySqlDataAdapter class. - - - - When an instance of is created, - the following read/write properties are set to the following initial - values. - - - - Properties - Initial Value - - - - - - - MissingMappingAction.Passthrough - - - - - - - - MissingSchemaAction.Add - - - - - You can change the value of any of these properties through a separate call - to the property. - - - - The following example creates a and sets some of - its properties. - - Public Sub CreateSqlDataAdapter() - Dim conn As MySqlConnection = New MySqlConnection("Data Source=localhost;" & _ - "database=test") - Dim da As MySqlDataAdapter = New MySqlDataAdapter - da.MissingSchemaAction = MissingSchemaAction.AddWithKey - - da.SelectCommand = New MySqlCommand("SELECT id, name FROM mytable", conn) - da.InsertCommand = New MySqlCommand("INSERT INTO mytable (id, name) " & _ - "VALUES (@id, @name)", conn) - da.UpdateCommand = New MySqlCommand("UPDATE mytable SET id=@id, name=@name " & _ - "WHERE id=@oldId", conn) - da.DeleteCommand = New MySqlCommand("DELETE FROM mytable WHERE id=@id", conn) - - da.InsertCommand.Parameters.Add("@id", MySqlDbType.VarChar, 5, "id") - da.InsertCommand.Parameters.Add("@name", MySqlDbType.VarChar, 40, "name") - - da.UpdateCommand.Parameters.Add("@id", MySqlDbType.VarChar, 5, "id") - da.UpdateCommand.Parameters.Add("@name", MySqlDbType.VarChar, 40, "name") - da.UpdateCommand.Parameters.Add("@oldId", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion.Original - - da.DeleteCommand.Parameters.Add("@id", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion.Original - End Sub - - - public static void CreateSqlDataAdapter() - { - MySqlConnection conn = new MySqlConnection("Data Source=localhost;database=test"); - MySqlDataAdapter da = new MySqlDataAdapter(); - da.MissingSchemaAction = MissingSchemaAction.AddWithKey; - - da.SelectCommand = new MySqlCommand("SELECT id, name FROM mytable", conn); - da.InsertCommand = new MySqlCommand("INSERT INTO mytable (id, name) " + - "VALUES (@id, @name)", conn); - da.UpdateCommand = new MySqlCommand("UPDATE mytable SET id=@id, name=@name " + - "WHERE id=@oldId", conn); - da.DeleteCommand = new MySqlCommand("DELETE FROM mytable WHERE id=@id", conn); - - da.InsertCommand.Parameters.Add("@id", MySqlDbType.VarChar, 5, "id"); - da.InsertCommand.Parameters.Add("@name", MySqlDbType.VarChar, 40, "name"); - - da.UpdateCommand.Parameters.Add("@id", MySqlDbType.VarChar, 5, "id"); - da.UpdateCommand.Parameters.Add("@name", MySqlDbType.VarChar, 40, "name"); - da.UpdateCommand.Parameters.Add("@oldId", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion.Original; - - da.DeleteCommand.Parameters.Add("@id", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion.Original; - } - - - - - - - Initializes a new instance of the class with - the specified as the - property. - - - that is a SQL SELECT statement or stored procedure and is set - as the property of the . - - - - When an instance of is created, - the following read/write properties are set to the following initial - values. - - - - Properties - Initial Value - - - - - - - MissingMappingAction.Passthrough - - - - - - - - MissingSchemaAction.Add - - - - - You can change the value of any of these properties through a separate call - to the property. - - - When SelectCommand (or any of the other command properties) is assigned - to a previously created , the MySqlCommand is not cloned. - The SelectCommand maintains a reference to the previously created MySqlCommand - object. - - - - The following example creates a and sets some of - its properties. - - Public Sub CreateSqlDataAdapter() - Dim conn As MySqlConnection = New MySqlConnection("Data Source=localhost;" & _ - "database=test") - Dim cmd as new MySqlCommand("SELECT id, name FROM mytable", conn) - Dim da As MySqlDataAdapter = New MySqlDataAdapter(cmd) - da.MissingSchemaAction = MissingSchemaAction.AddWithKey - - da.InsertCommand = New MySqlCommand("INSERT INTO mytable (id, name) " & _ - "VALUES (@id, @name)", conn) - da.UpdateCommand = New MySqlCommand("UPDATE mytable SET id=@id, name=@name " & _ - "WHERE id=@oldId", conn) - da.DeleteCommand = New MySqlCommand("DELETE FROM mytable WHERE id=@id", conn) - - da.InsertCommand.Parameters.Add("@id", MySqlDbType.VarChar, 5, "id") - da.InsertCommand.Parameters.Add("@name", MySqlDbType.VarChar, 40, "name") - - da.UpdateCommand.Parameters.Add("@id", MySqlDbType.VarChar, 5, "id") - da.UpdateCommand.Parameters.Add("@name", MySqlDbType.VarChar, 40, "name") - da.UpdateCommand.Parameters.Add("@oldId", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion.Original - - da.DeleteCommand.Parameters.Add("@id", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion.Original - End Sub - - - public static void CreateSqlDataAdapter() - { - MySqlConnection conn = new MySqlConnection("Data Source=localhost;database=test"); - MySqlCommand cmd = new MySqlCommand("SELECT id, name FROM mytable", conn); - MySqlDataAdapter da = new MySqlDataAdapter(cmd); - da.MissingSchemaAction = MissingSchemaAction.AddWithKey; - - da.InsertCommand = new MySqlCommand("INSERT INTO mytable (id, name) " + - "VALUES (@id, @name)", conn); - da.UpdateCommand = new MySqlCommand("UPDATE mytable SET id=@id, name=@name " + - "WHERE id=@oldId", conn); - da.DeleteCommand = new MySqlCommand("DELETE FROM mytable WHERE id=@id", conn); - - da.InsertCommand.Parameters.Add("@id", MySqlDbType.VarChar, 5, "id"); - da.InsertCommand.Parameters.Add("@name", MySqlDbType.VarChar, 40, "name"); - - da.UpdateCommand.Parameters.Add("@id", MySqlDbType.VarChar, 5, "id"); - da.UpdateCommand.Parameters.Add("@name", MySqlDbType.VarChar, 40, "name"); - da.UpdateCommand.Parameters.Add("@oldId", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion.Original; - - da.DeleteCommand.Parameters.Add("@id", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion.Original; - } - - - - - - - Initializes a new instance of the class with - a and a object. - - - A String that is a SQL SELECT statement or stored procedure to be used by - the property of the . - - - A that represents the connection. - - - - This implementation of the opens and closes a - if it is not already open. This can be useful in a an application that must call the - method for two or more MySqlDataAdapter objects. - If the MySqlConnection is already open, you must explicitly call - or to close it. - - - When an instance of is created, - the following read/write properties are set to the following initial - values. - - - - Properties - Initial Value - - - - - - - MissingMappingAction.Passthrough - - - - - - - - MissingSchemaAction.Add - - - - - You can change the value of any of these properties through a separate call - to the property. - - - - The following example creates a and sets some of - its properties. - - Public Sub CreateSqlDataAdapter() - Dim conn As MySqlConnection = New MySqlConnection("Data Source=localhost;" & _ - "database=test") - Dim da As MySqlDataAdapter = New MySqlDataAdapter("SELECT id, name FROM mytable", conn) - da.MissingSchemaAction = MissingSchemaAction.AddWithKey - - da.InsertCommand = New MySqlCommand("INSERT INTO mytable (id, name) " & _ - "VALUES (@id, @name)", conn) - da.UpdateCommand = New MySqlCommand("UPDATE mytable SET id=@id, name=@name " & _ - "WHERE id=@oldId", conn) - da.DeleteCommand = New MySqlCommand("DELETE FROM mytable WHERE id=@id", conn) - - da.InsertCommand.Parameters.Add("@id", MySqlDbType.VarChar, 5, "id") - da.InsertCommand.Parameters.Add("@name", MySqlDbType.VarChar, 40, "name") - - da.UpdateCommand.Parameters.Add("@id", MySqlDbType.VarChar, 5, "id") - da.UpdateCommand.Parameters.Add("@name", MySqlDbType.VarChar, 40, "name") - da.UpdateCommand.Parameters.Add("@oldId", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion.Original - - da.DeleteCommand.Parameters.Add("@id", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion.Original - End Sub - - - public static void CreateSqlDataAdapter() - { - MySqlConnection conn = new MySqlConnection("Data Source=localhost;database=test"); - MySqlDataAdapter da = new MySqlDataAdapter("SELECT id, name FROM mytable", conn); - da.MissingSchemaAction = MissingSchemaAction.AddWithKey; - - da.InsertCommand = new MySqlCommand("INSERT INTO mytable (id, name) " + - "VALUES (@id, @name)", conn); - da.UpdateCommand = new MySqlCommand("UPDATE mytable SET id=@id, name=@name " + - "WHERE id=@oldId", conn); - da.DeleteCommand = new MySqlCommand("DELETE FROM mytable WHERE id=@id", conn); - - da.InsertCommand.Parameters.Add("@id", MySqlDbType.VarChar, 5, "id"); - da.InsertCommand.Parameters.Add("@name", MySqlDbType.VarChar, 40, "name"); - - da.UpdateCommand.Parameters.Add("@id", MySqlDbType.VarChar, 5, "id"); - da.UpdateCommand.Parameters.Add("@name", MySqlDbType.VarChar, 40, "name"); - da.UpdateCommand.Parameters.Add("@oldId", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion.Original; - - da.DeleteCommand.Parameters.Add("@id", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion.Original; - } - - - - - - - Initializes a new instance of the class with - a and a connection string. - - - A that is a SQL SELECT statement or stored procedure to - be used by the property of the . - - The connection string - - - When an instance of is created, - the following read/write properties are set to the following initial - values. - - - - Properties - Initial Value - - - - - - - MissingMappingAction.Passthrough - - - - - - - - MissingSchemaAction.Add - - - - - You can change the value of any of these properties through a separate call - to the property. - - - - The following example creates a and sets some of - its properties. - - Public Sub CreateSqlDataAdapter() - Dim da As MySqlDataAdapter = New MySqlDataAdapter("SELECT id, name FROM mytable", "Data Source=localhost;database=test") - Dim conn As MySqlConnection = da.SelectCommand.Connection - da.MissingSchemaAction = MissingSchemaAction.AddWithKey - - da.InsertCommand = New MySqlCommand("INSERT INTO mytable (id, name) " & _ - "VALUES (@id, @name)", conn) - da.UpdateCommand = New MySqlCommand("UPDATE mytable SET id=@id, name=@name " & _ - "WHERE id=@oldId", conn) - da.DeleteCommand = New MySqlCommand("DELETE FROM mytable WHERE id=@id", conn) - - da.InsertCommand.Parameters.Add("@id", MySqlDbType.VarChar, 5, "id") - da.InsertCommand.Parameters.Add("@name", MySqlDbType.VarChar, 40, "name") - - da.UpdateCommand.Parameters.Add("@id", MySqlDbType.VarChar, 5, "id") - da.UpdateCommand.Parameters.Add("@name", MySqlDbType.VarChar, 40, "name") - da.UpdateCommand.Parameters.Add("@oldId", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion.Original - - da.DeleteCommand.Parameters.Add("@id", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion.Original - End Sub - - - public static void CreateSqlDataAdapter() - { - MySqlDataAdapter da = new MySqlDataAdapter("SELECT id, name FROM mytable", "Data Source=localhost;database=test"); - MySqlConnection conn = da.SelectCommand.Connection; - da.MissingSchemaAction = MissingSchemaAction.AddWithKey; - - da.InsertCommand = new MySqlCommand("INSERT INTO mytable (id, name) " + - "VALUES (@id, @name)", conn); - da.UpdateCommand = new MySqlCommand("UPDATE mytable SET id=@id, name=@name " + - "WHERE id=@oldId", conn); - da.DeleteCommand = new MySqlCommand("DELETE FROM mytable WHERE id=@id", conn); - - da.InsertCommand.Parameters.Add("@id", MySqlDbType.VarChar, 5, "id"); - da.InsertCommand.Parameters.Add("@name", MySqlDbType.VarChar, 40, "name"); - - da.UpdateCommand.Parameters.Add("@id", MySqlDbType.VarChar, 5, "id"); - da.UpdateCommand.Parameters.Add("@name", MySqlDbType.VarChar, 40, "name"); - da.UpdateCommand.Parameters.Add("@oldId", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion.Original; - - da.DeleteCommand.Parameters.Add("@id", MySqlDbType.VarChar, 5, "id").SourceVersion = DataRowVersion.Original; - } - - - - - - - Gets or sets a SQL statement or stored procedure used to delete records from the data set. - - - A used during to delete records in the - database that correspond to deleted rows in the . - - - - During , if this property is not set and primary key information - is present in the , the DeleteCommand can be generated - automatically if you set the property and use the - . Then, any additional commands that you do not set are - generated by the MySqlCommandBuilder. This generation logic requires key column - information to be present in the DataSet. - - - When DeleteCommand is assigned to a previously created , - the MySqlCommand is not cloned. The DeleteCommand maintains a reference - to the previously created MySqlCommand object. - - - - The following example creates a and sets the - and DeleteCommand properties. It assumes you have already - created a object. - - Public Shared Function CreateCustomerAdapter(conn As MySqlConnection) As MySqlDataAdapter - - Dim da As MySqlDataAdapter = New MySqlDataAdapter() - Dim cmd As MySqlCommand - Dim parm As MySqlParameter - - ' Create the SelectCommand. - cmd = New MySqlCommand("SELECT * FROM mytable WHERE id=@id AND name=@name", conn) - - cmd.Parameters.Add("@id", MySqlDbType.VarChar, 15) - cmd.Parameters.Add("@name", MySqlDbType.VarChar, 15) - - da.SelectCommand = cmd - - ' Create the DeleteCommand. - cmd = New MySqlCommand("DELETE FROM mytable WHERE id=@id", conn) - - parm = cmd.Parameters.Add("@id", MySqlDbType.VarChar, 5, "id") - parm.SourceVersion = DataRowVersion.Original - - da.DeleteCommand = cmd - - Return da - End Function - - - public static MySqlDataAdapter CreateCustomerAdapter(MySqlConnection conn) - { - MySqlDataAdapter da = new MySqlDataAdapter(); - MySqlCommand cmd; - MySqlParameter parm; - - // Create the SelectCommand. - cmd = new MySqlCommand("SELECT * FROM mytable WHERE id=@id AND name=@name", conn); - - cmd.Parameters.Add("@id", MySqlDbType.VarChar, 15); - cmd.Parameters.Add("@name", MySqlDbType.VarChar, 15); - - da.SelectCommand = cmd; - - // Create the DeleteCommand. - cmd = new MySqlCommand("DELETE FROM mytable WHERE id=@id", conn); - - parm = cmd.Parameters.Add("@id", MySqlDbType.VarChar, 5, "id"); - parm.SourceVersion = DataRowVersion.Original; - - da.DeleteCommand = cmd; - - return da; - } - - - - - - - Gets or sets a SQL statement or stored procedure used to insert records into the data set. - - - A used during to insert records into the - database that correspond to new rows in the . - - - - During , if this property is not set and primary key information - is present in the , the InsertCommand can be generated - automatically if you set the property and use the - . Then, any additional commands that you do not set are - generated by the MySqlCommandBuilder. This generation logic requires key column - information to be present in the DataSet. - - - When InsertCommand is assigned to a previously created , - the MySqlCommand is not cloned. The InsertCommand maintains a reference - to the previously created MySqlCommand object. - - - If execution of this command returns rows, these rows may be added to the DataSet - depending on how you set the property of the MySqlCommand object. - - - - The following example creates a and sets the - and InsertCommand properties. It assumes you have already - created a object. - - Public Shared Function CreateCustomerAdapter(conn As MySqlConnection) As MySqlDataAdapter - - Dim da As MySqlDataAdapter = New MySqlDataAdapter() - Dim cmd As MySqlCommand - Dim parm As MySqlParameter - - ' Create the SelectCommand. - cmd = New MySqlCommand("SELECT * FROM mytable WHERE id=@id AND name=@name", conn) - - cmd.Parameters.Add("@id", MySqlDbType.VarChar, 15) - cmd.Parameters.Add("@name", MySqlDbType.VarChar, 15) - - da.SelectCommand = cmd - - ' Create the InsertCommand. - cmd = New MySqlCommand("INSERT INTO mytable (id,name) VALUES (@id, @name)", conn) - - cmd.Parameters.Add( "@id", MySqlDbType.VarChar, 15, "id" ) - cmd.Parameters.Add( "@name", MySqlDbType.VarChar, 15, "name" ) - da.InsertCommand = cmd - - Return da - End Function - - - public static MySqlDataAdapter CreateCustomerAdapter(MySqlConnection conn) - { - MySqlDataAdapter da = new MySqlDataAdapter(); - MySqlCommand cmd; - MySqlParameter parm; - - // Create the SelectCommand. - cmd = new MySqlCommand("SELECT * FROM mytable WHERE id=@id AND name=@name", conn); - - cmd.Parameters.Add("@id", MySqlDbType.VarChar, 15); - cmd.Parameters.Add("@name", MySqlDbType.VarChar, 15); - - da.SelectCommand = cmd; - - // Create the InsertCommand. - cmd = new MySqlCommand("INSERT INTO mytable (id,name) VALUES (@id,@name)", conn); - cmd.Parameters.Add("@id", MySqlDbType.VarChar, 15, "id" ); - cmd.Parameters.Add("@name", MySqlDbType.VarChar, 15, "name" ); - - da.InsertCommand = cmd; - - return da; - } - - - - - - - Gets or sets a SQL statement or stored procedure used to updated records in the data source. - - - A used during to update records in the - database with data from the . - - - - During , if this property is not set and primary key information - is present in the , the UpdateCommand can be generated - automatically if you set the property and use the - . Then, any additional commands that you do not set are - generated by the MySqlCommandBuilder. This generation logic requires key column - information to be present in the DataSet. - - - When UpdateCommand is assigned to a previously created , - the MySqlCommand is not cloned. The UpdateCommand maintains a reference - to the previously created MySqlCommand object. - - - If execution of this command returns rows, these rows may be merged with the DataSet - depending on how you set the property of the MySqlCommand object. - - - - The following example creates a and sets the - and UpdateCommand properties. It assumes you have already - created a object. - - Public Shared Function CreateCustomerAdapter(conn As MySqlConnection) As MySqlDataAdapter - - Dim da As MySqlDataAdapter = New MySqlDataAdapter() - Dim cmd As MySqlCommand - Dim parm As MySqlParameter - - ' Create the SelectCommand. - cmd = New MySqlCommand("SELECT * FROM mytable WHERE id=@id AND name=@name", conn) - - cmd.Parameters.Add("@id", MySqlDbType.VarChar, 15) - cmd.Parameters.Add("@name", MySqlDbType.VarChar, 15) - - da.SelectCommand = cmd - - ' Create the UpdateCommand. - cmd = New MySqlCommand("UPDATE mytable SET id=@id, name=@name WHERE id=@oldId", conn) - - cmd.Parameters.Add( "@id", MySqlDbType.VarChar, 15, "id" ) - cmd.Parameters.Add( "@name", MySqlDbType.VarChar, 15, "name" ) - - parm = cmd.Parameters.Add("@oldId", MySqlDbType.VarChar, 15, "id") - parm.SourceVersion = DataRowVersion.Original - - da.UpdateCommand = cmd - - Return da - End Function - - - public static MySqlDataAdapter CreateCustomerAdapter(MySqlConnection conn) - { - MySqlDataAdapter da = new MySqlDataAdapter(); - MySqlCommand cmd; - MySqlParameter parm; - - // Create the SelectCommand. - cmd = new MySqlCommand("SELECT * FROM mytable WHERE id=@id AND name=@name", conn); - - cmd.Parameters.Add("@id", MySqlDbType.VarChar, 15); - cmd.Parameters.Add("@name", MySqlDbType.VarChar, 15); - - da.SelectCommand = cmd; - - // Create the UpdateCommand. - cmd = new MySqlCommand("UPDATE mytable SET id=@id, name=@name WHERE id=@oldId", conn); - cmd.Parameters.Add("@id", MySqlDbType.VarChar, 15, "id" ); - cmd.Parameters.Add("@name", MySqlDbType.VarChar, 15, "name" ); - - parm = cmd.Parameters.Add( "@oldId", MySqlDbType.VarChar, 15, "id" ); - parm.SourceVersion = DataRowVersion.Original; - - da.UpdateCommand = cmd; - - return da; - } - - - - - - - Gets or sets a SQL statement or stored procedure used to select records in the data source. - - - A used during to select records from the - database for placement in the . - - - - When SelectCommand is assigned to a previously created , - the MySqlCommand is not cloned. The SelectCommand maintains a reference to the - previously created MySqlCommand object. - - - If the SelectCommand does not return any rows, no tables are added to the - , and no exception is raised. - - - - The following example creates a and sets the - and InsertCommand properties. It assumes you have already - created a object. - - Public Shared Function CreateCustomerAdapter(conn As MySqlConnection) As MySqlDataAdapter - - Dim da As MySqlDataAdapter = New MySqlDataAdapter() - Dim cmd As MySqlCommand - Dim parm As MySqlParameter - - ' Create the SelectCommand. - cmd = New MySqlCommand("SELECT * FROM mytable WHERE id=@id AND name=@name", conn) - - cmd.Parameters.Add("@id", MySqlDbType.VarChar, 15) - cmd.Parameters.Add("@name", MySqlDbType.VarChar, 15) - - da.SelectCommand = cmd - - ' Create the InsertCommand. - cmd = New MySqlCommand("INSERT INTO mytable (id,name) VALUES (@id, @name)", conn) - - cmd.Parameters.Add( "@id", MySqlDbType.VarChar, 15, "id" ) - cmd.Parameters.Add( "@name", MySqlDbType.VarChar, 15, "name" ) - da.InsertCommand = cmd - - Return da - End Function - - - public static MySqlDataAdapter CreateCustomerAdapter(MySqlConnection conn) - { - MySqlDataAdapter da = new MySqlDataAdapter(); - MySqlCommand cmd; - MySqlParameter parm; - - // Create the SelectCommand. - cmd = new MySqlCommand("SELECT * FROM mytable WHERE id=@id AND name=@name", conn); - - cmd.Parameters.Add("@id", MySqlDbType.VarChar, 15); - cmd.Parameters.Add("@name", MySqlDbType.VarChar, 15); - - da.SelectCommand = cmd; - - // Create the InsertCommand. - cmd = new MySqlCommand("INSERT INTO mytable (id,name) VALUES (@id,@name)", conn); - cmd.Parameters.Add("@id", MySqlDbType.VarChar, 15, "id" ); - cmd.Parameters.Add("@name", MySqlDbType.VarChar, 15, "name" ); - - da.InsertCommand = cmd; - - return da; - } - - - - - \ No newline at end of file diff --git a/Source/MySql.Data/docs/MySqlDataReader.xml b/Source/MySql.Data/docs/MySqlDataReader.xml deleted file mode 100644 index c0f861f5a..000000000 --- a/Source/MySql.Data/docs/MySqlDataReader.xml +++ /dev/null @@ -1,452 +0,0 @@ - - - - Provides a means of reading a forward-only stream of rows from a MySQL database. This class cannot be inherited. - - - - To create a MySQLDataReader, you must call the - method of the object, rather than directly using a constructor. - - - While the MySqlDataReader is in use, the associated - is busy serving the MySqlDataReader, and no other operations can be performed - on the MySqlConnection other than closing it. This is the case until the - method of the MySqlDataReader is called. - - - and - are the only properties that you can call after the MySqlDataReader is - closed. Though the RecordsAffected property may be accessed at any time - while the MySqlDataReader exists, always call Close before returning - the value of RecordsAffected to ensure an accurate return value. - - - For optimal performance, MySqlDataReader avoids creating - unnecessary objects or making unnecessary copies of data. As a result, multiple calls - to methods such as return a reference to the - same object. Use caution if you are modifying the underlying value of the objects - returned by methods such as GetValue. - - - - - The following example creates a , - a , and a MySqlDataReader. The example reads through - the data, writing it out to the console. Finally, the example closes the MySqlDataReader, then the - MySqlConnection. - - Public Sub ReadMyData(myConnString As String) - Dim mySelectQuery As String = "SELECT OrderID, CustomerID FROM Orders" - Dim myConnection As New MySqlConnection(myConnString) - Dim myCommand As New MySqlCommand(mySelectQuery, myConnection) - myConnection.Open() - Dim myReader As MySqlDataReader - myReader = myCommand.ExecuteReader() - ' Always call Read before accessing data. - While myReader.Read() - Console.WriteLine((myReader.GetInt32(0) & ", " & myReader.GetString(1))) - End While - ' always call Close when done reading. - myReader.Close() - ' Close the connection when done with it. - myConnection.Close() - End Sub 'ReadMyData - - - public void ReadMyData(string myConnString) { - string mySelectQuery = "SELECT OrderID, CustomerID FROM Orders"; - MySqlConnection myConnection = new MySqlConnection(myConnString); - MySqlCommand myCommand = new MySqlCommand(mySelectQuery,myConnection); - myConnection.Open(); - MySqlDataReader myReader; - myReader = myCommand.ExecuteReader(); - // Always call Read before accessing data. - while (myReader.Read()) { - Console.WriteLine(myReader.GetInt32(0) + ", " + myReader.GetString(1)); - } - // always call Close when done reading. - myReader.Close(); - // Close the connection when done with it. - myConnection.Close(); - } - - - - - - - - GetBytes returns the number of available bytes in the field. In most - cases this is the exact length of the field. However, the number returned may be - less than the true length of the field if GetBytes has already been used - to obtain bytes from the field. This may be the case, for example, if the - is reading a large data structure into a buffer. - For more information, see the SequentialAccess setting for - . - - - If you pass a buffer that is a null reference (Nothing in Visual - Basic), GetBytes returns the length of the field in bytes. - - - No conversions are performed; therefore the data retrieved must already be a - byte array. - - - - - - - - Gets the value of the specified column as a object. - - - - No conversions are performed; therefore, the data retrieved must already be a Time value. - - - Call IsDBNull to check for null values before calling this method. - - - The zero-based column ordinal or column name. - The value of the specified column. - - - - - Gets the value of the specified column as a object. - - - - No conversions are performed; therefore, the data retrieved must already be a DateTime object. - - - Call IsDBNull to check for null values before calling this method. - - - - MySql allows date columns to contain the value '0000-00-00' and datetime - columns to contain the value '0000-00-00 00:00:00'. The DateTime structure cannot contain - or represent these values. To read a datetime value from a column that might - contain zero values, use . - - - The behavior of reading a zero datetime column using this method is defined by the - ZeroDateTimeBehavior connection string option. For more information on this option, - please refer to . - - - - The zero-based column ordinal. - The value of the specified column. - - - - - Gets the value of the specified column as a object. - - - - No conversions are performed; therefore, the data retrieved must already be a DateTime object. - - - Call IsDBNull to check for null values before calling this method. - - - - MySql allows date columns to contain the value '0000-00-00' and datetime - columns to contain the value '0000-00-00 00:00:00'. The DateTime structure cannot contain - or represent these values. To read a datetime value from a column that might - contain zero values, use . - - - The behavior of reading a zero datetime column using this method is defined by the - ZeroDateTimeBehavior connection string option. For more information on this option, - please refer to . - - - - The column name. - The value of the specified column. - - - - - Gets the value of the specified column as a object. - - - - No conversions are performed; therefore, the data retrieved must already be a DateTime object. - - - Call IsDBNull to check for null values before calling this method. - - - The zero-based column ordinal or column name. - The value of the specified column. - - - - - Gets the value of the specified column as a object. - - - - No conversions are performed; therefore, the data retrieved must already be a String object. - - - Call IsDBNull to check for null values before calling this method. - - - The zero-based column ordinal. - The value of the specified column. - - - - - Gets the value of the specified column as a object. - - - - No conversions are performed; therefore, the data retrieved must already be a String object. - - - Call IsDBNull to check for null values before calling this method. - - - The column name. - The value of the specified column. - - - - - Gets the value of the specified column as a object. - - - - No conversions are performed; therefore, the data retrieved must already be a Decimal object. - - - Call IsDBNull to check for null values before calling this method. - - - The zero-based column ordinal - The value of the specified column. - - - - - Gets the value of the specified column as a object. - - - - No conversions are performed; therefore, the data retrieved must already be a Decimal object. - - - Call IsDBNull to check for null values before calling this method. - - - The column name - The value of the specified column. - - - - Gets the value of the specified column as a double-precision floating point number. - - - No conversions are performed; therefore, the data retrieved must already be a Double object. - - - Call IsDBNull to check for null values before calling this method. - - - The zero-based column ordinal. - The value of the specified column. - - - - Gets the value of the specified column as a double-precision floating point number. - - - No conversions are performed; therefore, the data retrieved must already be a Double object. - - - Call IsDBNull to check for null values before calling this method. - - - The column name - The value of the specified column. - - - - - Gets the value of the specified column as a single-precision floating point number. - - - - No conversions are performed; therefore, the data retrieved must already be a Float object. - - - Call IsDBNull to check for null values before calling this method. - - - The zero-based column ordinal. - The value of the specified column. - - - - - Gets the value of the specified column as a single-precision floating point number. - - - - No conversions are performed; therefore, the data retrieved must already be a Float object. - - - Call IsDBNull to check for null values before calling this method. - - - The column name - The value of the specified column. - - - - Gets the value of the specified column as a globally-unique identifier (GUID). - The zero-based column ordinal. - The value of the specified column. - - - - Gets the value of the specified column as a globally-unique identifier (GUID). - The column name - The value of the specified column. - - - - Gets the value of the specified column as a 16-bit signed integer. - - - No conversions are performed; therefore, the data retrieved must already be a 16 bit integer value. - - - Call IsDBNull to check for null values before calling this method. - - - The zero-based column ordinal. - The value of the specified column. - - - - Gets the value of the specified column as a 16-bit signed integer. - - - No conversions are performed; threfore, the data retrieved must already be a 16 bit integer value. - - - Call IsDBNull to check for null values before calling this method. - - - The column name - The value of the specified column. - - - - Gets the value of the specified column as a 32-bit signed integer. - - - No conversions are performed; therefore, the data retrieved must already be a 32 bit integer value. - - - Call IsDBNull to check for null values before calling this method. - - - The zero-based column ordinal. - The value of the specified column. - - - - Gets the value of the specified column as a 32-bit signed integer. - - - No conversions are performed; therefore, the data retrieved must already be a 32 bit integer value. - - - Call IsDBNull to check for null values before calling this method. - - - The column name. - The value of the specified column. - - - - Gets the value of the specified column as a 64-bit signed integer. - - - No conversions are performed; therefore, the data retrieved must already be a 64 bit integer value. - - - Call IsDBNull to check for null values before calling this method. - - - The zero-based column ordinal. - The value of the specified column. - - - - Gets the value of the specified column as a 64-bit signed integer. - - - No conversions are performed; therefore, the data retrieved must already be a 64 bit integer value. - - - Call IsDBNull to check for null values before calling this method. - - - The column name. - The value of the specified column. - - - - Gets the value of the specified column as a 16-bit unsigned integer. - - - No conversions are performed; therefore, the data retrieved must already be a 16 bit unsigned integer value. - - - Call IsDBNull to check for null values before calling this method. - - - The zero-based column ordinal or column name. - The value of the specified column. - - - - Gets the value of the specified column as a 32-bit unsigned integer. - - - No conversions are performed; therefore, the data retrieved must already be a 32 bit unsigned integer value. - - - Call IsDBNull to check for null values before calling this method. - - - The zero-based column ordinal or column name. - The value of the specified column. - - - - Gets the value of the specified column as a 64-bit unsigned integer. - - - No conversions are performed; therefore, the data retrieved must already be a 64 bit unsigned integer value. - - - Call IsDBNull to check for null values before calling this method. - - - The zero-based column ordinal or column name. - The value of the specified column. - - - \ No newline at end of file diff --git a/Source/MySql.Data/docs/MySqlException.xml b/Source/MySql.Data/docs/MySqlException.xml deleted file mode 100644 index 48308051e..000000000 --- a/Source/MySql.Data/docs/MySqlException.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - This class is created whenever the MySql Data Provider encounters an error generated from the server. - - - Any open connections are not automatically closed when an exception is thrown. If - the client application determines that the exception is fatal, it should close any open - objects or objects. - - - - - The following example generates a MySqlException due to a missing server, - and then displays the exception. - - - Public Sub ShowException() - Dim mySelectQuery As String = "SELECT column1 FROM table1" - Dim myConnection As New MySqlConnection ("Data Source=localhost;Database=Sample;") - Dim myCommand As New MySqlCommand(mySelectQuery, myConnection) - - Try - myCommand.Connection.Open() - Catch e As MySqlException - MessageBox.Show( e.Message ) - End Try - End Sub - - - public void ShowException() - { - string mySelectQuery = "SELECT column1 FROM table1"; - MySqlConnection myConnection = - new MySqlConnection("Data Source=localhost;Database=Sample;"); - MySqlCommand myCommand = new MySqlCommand(mySelectQuery,myConnection); - - try - { - myCommand.Connection.Open(); - } - catch (MySqlException e) - { - MessageBox.Show( e.Message ); - } - } - - - - - - \ No newline at end of file diff --git a/Source/MySql.Data/docs/MySqlHelper.xml b/Source/MySql.Data/docs/MySqlHelper.xml deleted file mode 100644 index 48308051e..000000000 --- a/Source/MySql.Data/docs/MySqlHelper.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - This class is created whenever the MySql Data Provider encounters an error generated from the server. - - - Any open connections are not automatically closed when an exception is thrown. If - the client application determines that the exception is fatal, it should close any open - objects or objects. - - - - - The following example generates a MySqlException due to a missing server, - and then displays the exception. - - - Public Sub ShowException() - Dim mySelectQuery As String = "SELECT column1 FROM table1" - Dim myConnection As New MySqlConnection ("Data Source=localhost;Database=Sample;") - Dim myCommand As New MySqlCommand(mySelectQuery, myConnection) - - Try - myCommand.Connection.Open() - Catch e As MySqlException - MessageBox.Show( e.Message ) - End Try - End Sub - - - public void ShowException() - { - string mySelectQuery = "SELECT column1 FROM table1"; - MySqlConnection myConnection = - new MySqlConnection("Data Source=localhost;Database=Sample;"); - MySqlCommand myCommand = new MySqlCommand(mySelectQuery,myConnection); - - try - { - myCommand.Connection.Open(); - } - catch (MySqlException e) - { - MessageBox.Show( e.Message ); - } - } - - - - - - \ No newline at end of file diff --git a/Source/MySql.Data/docs/MySqlParameter.xml b/Source/MySql.Data/docs/MySqlParameter.xml deleted file mode 100644 index c3cc26394..000000000 --- a/Source/MySql.Data/docs/MySqlParameter.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - Parameter names are not case sensitive. - - - - The following example creates multiple instances of MySqlParameter through the - collection within the . - These parameters are used to select data from the data source and place the data - in the . This example assumes that a DataSet and a - MySqlDataAdapter have already been created with the appropriate schema, commands, - and connection. - - Public Sub AddSqlParameters() - ' ... - ' create myDataSet and myDataAdapter - ' ... - myDataAdapter.SelectCommand.Parameters.Add("@CategoryName", MySqlDbType.VarChar, 80).Value = "toasters" - myDataAdapter.SelectCommand.Parameters.Add("@SerialNum", MySqlDbType.Long).Value = 239 - - myDataAdapter.Fill(myDataSet) - End Sub 'AddSqlParameters - - - public void AddSqlParameters() - { - // ... - // create myDataSet and myDataAdapter - // ... - - myDataAdapter.SelectCommand.Parameters.Add("@CategoryName", MySqlDbType.VarChar, 80).Value = "toasters"; - myDataAdapter.SelectCommand.Parameters.Add("@SerialNum", MySqlDbType.Long).Value = 239; - myDataAdapter.Fill(myDataSet); - - } - - - - - - - - - \ No newline at end of file diff --git a/Source/MySql.Data/docs/MySqlParameterCollection.xml b/Source/MySql.Data/docs/MySqlParameterCollection.xml deleted file mode 100644 index 19c0ca597..000000000 --- a/Source/MySql.Data/docs/MySqlParameterCollection.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - The number of the parameters in the collection must be equal to the number of - parameter placeholders within the command text, or an exception will be generated. - - - - The following example creates multiple instances of - through the MySqlParameterCollection collection within the . - These parameters are used to select data within the data source and place the data in - the . This code assumes that a DataSet and a MySqlDataAdapter - have already been created with the appropriate schema, commands, and connection. - - Public Sub AddParameters() - ' ... - ' create myDataSet and myDataAdapter - ' ... - myDataAdapter.SelectCommand.Parameters.Add("@CategoryName", MySqlDbType.VarChar, 80).Value = "toasters" - myDataAdapter.SelectCommand.Parameters.Add("@SerialNum", MySqlDbType.Long).Value = 239 - - myDataAdapter.Fill(myDataSet) - End Sub 'AddSqlParameters - - - public void AddSqlParameters() - { - // ... - // create myDataSet and myDataAdapter - // ... - - myDataAdapter.SelectCommand.Parameters.Add("@CategoryName", MySqlDbType.VarChar, 80).Value = "toasters"; - myDataAdapter.SelectCommand.Parameters.Add("@SerialNum", MySqlDbType.Long).Value = 239; - myDataAdapter.Fill(myDataSet); - - } - - - - - - - - - \ No newline at end of file diff --git a/Source/MySql.Data/docs/MySqlTransaction.xml b/Source/MySql.Data/docs/MySqlTransaction.xml deleted file mode 100644 index a8544eda7..000000000 --- a/Source/MySql.Data/docs/MySqlTransaction.xml +++ /dev/null @@ -1,329 +0,0 @@ - - - - Represents a SQL transaction to be made in a MySQL database. This class cannot be inherited. - - - - The application creates a MySqlTransaction object by calling - on the object. All subsequent operations associated with the - transaction (for example, committing or aborting the transaction), are performed on the - MySqlTransaction object. - - - - The following example creates a and a MySqlTransaction. - It also demonstrates how to use the , - , and methods. - - Public Sub RunTransaction(myConnString As String) - Dim myConnection As New MySqlConnection(myConnString) - myConnection.Open() - - Dim myCommand As MySqlCommand = myConnection.CreateCommand() - Dim myTrans As MySqlTransaction - - ' Start a local transaction - myTrans = myConnection.BeginTransaction() - ' Must assign both transaction object and connection - ' to Command object for a pending local transaction - myCommand.Connection = myConnection - myCommand.Transaction = myTrans - - Try - myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')" - myCommand.ExecuteNonQuery() - myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')" - myCommand.ExecuteNonQuery() - myTrans.Commit() - Console.WriteLine("Both records are written to database.") - Catch e As Exception - Try - myTrans.Rollback() - Catch ex As MySqlException - If Not myTrans.Connection Is Nothing Then - Console.WriteLine("An exception of type " & ex.GetType().ToString() & _ - " was encountered while attempting to roll back the transaction.") - End If - End Try - - Console.WriteLine("An exception of type " & e.GetType().ToString() & _ - "was encountered while inserting the data.") - Console.WriteLine("Neither record was written to database.") - Finally - myConnection.Close() - End Try - End Sub 'RunTransaction - - - public void RunTransaction(string myConnString) - { - MySqlConnection myConnection = new MySqlConnection(myConnString); - myConnection.Open(); - - MySqlCommand myCommand = myConnection.CreateCommand(); - MySqlTransaction myTrans; - - // Start a local transaction - myTrans = myConnection.BeginTransaction(); - // Must assign both transaction object and connection - // to Command object for a pending local transaction - myCommand.Connection = myConnection; - myCommand.Transaction = myTrans; - - try - { - myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')"; - myCommand.ExecuteNonQuery(); - myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')"; - myCommand.ExecuteNonQuery(); - myTrans.Commit(); - Console.WriteLine("Both records are written to database."); - } - catch(Exception e) - { - try - { - myTrans.Rollback(); - } - catch (MySqlException ex) - { - if (myTrans.Connection != null) - { - Console.WriteLine("An exception of type " + ex.GetType() + - " was encountered while attempting to roll back the transaction."); - } - } - - Console.WriteLine("An exception of type " + e.GetType() + - " was encountered while inserting the data."); - Console.WriteLine("Neither record was written to database."); - } - finally - { - myConnection.Close(); - } - } - - - - - - - - - Rolls back a transaction from a pending state. - - - The Rollback method is equivalent to the MySQL statement ROLLBACK. - The transaction can only be rolled back from a pending state - (after BeginTransaction has been called, but before Commit is - called). - - - The following example creates a and a - . It also demonstrates how to use the - , , and Rollback - methods. - - Public Sub RunSqlTransaction(myConnString As String) - Dim myConnection As New MySqlConnection(myConnString) - myConnection.Open() - - Dim myCommand As MySqlCommand = myConnection.CreateCommand() - Dim myTrans As MySqlTransaction - - ' Start a local transaction - myTrans = myConnection.BeginTransaction() - - ' Must assign both transaction object and connection - ' to Command object for a pending local transaction - myCommand.Connection = myConnection - myCommand.Transaction = myTrans - - Try - myCommand.CommandText = "Insert into mytable (id, desc) VALUES (100, 'Description')" - myCommand.ExecuteNonQuery() - myCommand.CommandText = "Insert into mytable (id, desc) VALUES (101, 'Description')" - myCommand.ExecuteNonQuery() - myTrans.Commit() - Console.WriteLine("Success.") - Catch e As Exception - Try - myTrans.Rollback() - Catch ex As MySqlException - If Not myTrans.Connection Is Nothing Then - Console.WriteLine("An exception of type " & ex.GetType().ToString() & _ - " was encountered while attempting to roll back the transaction.") - End If - End Try - - Console.WriteLine("An exception of type " & e.GetType().ToString() & _ - "was encountered while inserting the data.") - Console.WriteLine("Neither record was written to database.") - Finally - myConnection.Close() - End Try - End Sub - - - public void RunSqlTransaction(string myConnString) - { - MySqlConnection myConnection = new MySqlConnection(myConnString); - myConnection.Open(); - - MySqlCommand myCommand = myConnection.CreateCommand(); - MySqlTransaction myTrans; - - // Start a local transaction - myTrans = myConnection.BeginTransaction(); - // Must assign both transaction object and connection - // to Command object for a pending local transaction - myCommand.Connection = myConnection; - myCommand.Transaction = myTrans; - - try - { - myCommand.CommandText = "Insert into mytable (id, desc) VALUES (100, 'Description')"; - myCommand.ExecuteNonQuery(); - myCommand.CommandText = "Insert into mytable (id, desc) VALUES (101, 'Description')"; - myCommand.ExecuteNonQuery(); - myTrans.Commit(); - Console.WriteLine("Both records are written to database."); - } - catch(Exception e) - { - try - { - myTrans.Rollback(); - } - catch (MySqlException ex) - { - if (myTrans.Connection != null) - { - Console.WriteLine("An exception of type " + ex.GetType() + - " was encountered while attempting to roll back the transaction."); - } - } - - Console.WriteLine("An exception of type " + e.GetType() + - " was encountered while inserting the data."); - Console.WriteLine("Neither record was written to database."); - } - finally - { - myConnection.Close(); - } - } - - - - - - - Commits the database transaction. - - - The Commit method is equivalent to the MySQL SQL statement - COMMIT. - - - The following example creates a and a - . It also demonstrates how to use the - , , and Rollback - methods. - - Public Sub RunSqlTransaction(myConnString As String) - Dim myConnection As New MySqlConnection(myConnString) - myConnection.Open() - - Dim myCommand As MySqlCommand = myConnection.CreateCommand() - Dim myTrans As MySqlTransaction - - ' Start a local transaction - myTrans = myConnection.BeginTransaction() - - ' Must assign both transaction object and connection - ' to Command object for a pending local transaction - myCommand.Connection = myConnection - myCommand.Transaction = myTrans - - Try - myCommand.CommandText = "Insert into mytable (id, desc) VALUES (100, 'Description')" - myCommand.ExecuteNonQuery() - myCommand.CommandText = "Insert into mytable (id, desc) VALUES (101, 'Description')" - myCommand.ExecuteNonQuery() - myTrans.Commit() - Console.WriteLine("Success.") - Catch e As Exception - Try - myTrans.Rollback() - Catch ex As MySqlException - If Not myTrans.Connection Is Nothing Then - Console.WriteLine("An exception of type " & ex.GetType().ToString() & _ - " was encountered while attempting to roll back the transaction.") - End If - End Try - - Console.WriteLine("An exception of type " & e.GetType().ToString() & _ - "was encountered while inserting the data.") - Console.WriteLine("Neither record was written to database.") - Finally - myConnection.Close() - End Try - End Sub - - - public void RunSqlTransaction(string myConnString) - { - MySqlConnection myConnection = new MySqlConnection(myConnString); - myConnection.Open(); - - MySqlCommand myCommand = myConnection.CreateCommand(); - MySqlTransaction myTrans; - - // Start a local transaction - myTrans = myConnection.BeginTransaction(); - // Must assign both transaction object and connection - // to Command object for a pending local transaction - myCommand.Connection = myConnection; - myCommand.Transaction = myTrans; - - try - { - myCommand.CommandText = "Insert into mytable (id, desc) VALUES (100, 'Description')"; - myCommand.ExecuteNonQuery(); - myCommand.CommandText = "Insert into mytable (id, desc) VALUES (101, 'Description')"; - myCommand.ExecuteNonQuery(); - myTrans.Commit(); - Console.WriteLine("Both records are written to database."); - } - catch(Exception e) - { - try - { - myTrans.Rollback(); - } - catch (MySqlException ex) - { - if (myTrans.Connection != null) - { - Console.WriteLine("An exception of type " + ex.GetType() + - " was encountered while attempting to roll back the transaction."); - } - } - - Console.WriteLine("An exception of type " + e.GetType() + - " was encountered while inserting the data."); - Console.WriteLine("Neither record was written to database."); - } - finally - { - myConnection.Close(); - } - } - - - - - \ No newline at end of file diff --git a/Source/MySql.Data/keywords.txt b/Source/MySql.Data/keywords.txt deleted file mode 100644 index 27aeb8638..000000000 --- a/Source/MySql.Data/keywords.txt +++ /dev/null @@ -1,234 +0,0 @@ -ACCESSIBLE -ADD -ALL -ALTER -ANALYZE -AND -AS -ASC -ASENSITIVE -BEFORE -BEGIN -BETWEEN -BIGINT -BINARY -BLOB -BOTH -BY -CALL -CASCADE -CASE -CHANGE -CHAR -CHARACTER -CHECK -COLLATE -COLUMN -COMMIT -CONDITION -CONNECTION -CONSTRAINT -CONTINUE -CONVERT -CREATE -CROSS -CURRENT_DATE -CURRENT_TIME -CURRENT_TIMESTAMP -CURRENT_USER -CURSOR -DATABASE -DATABASES -DAY_HOUR -DAY_MICROSECOND -DAY_MINUTE -DAY_SECOND -DEC -DECIMAL -DECLARE -DEFAULT -DELAYED -DELETE -DESC -DESCRIBE -DETERMINISTIC -DISTINCT -DISTINCTROW -DIV -DO -DOUBLE -DROP -DUAL -EACH -ELSE -ELSEIF -ENCLOSED -END -ESCAPED -EXISTS -EXIT -EXPLAIN -FALSE -FETCH -FLOAT -FLOAT4 -FLOAT8 -FOR -FORCE -FOREIGN -FROM -FULLTEXT -GOTO -GRANT -GROUP -HAVING -HIGH_PRIORITY -HOUR_MICROSECOND -HOUR_MINUTE -HOUR_SECOND -IF -IGNORE -IN -INDEX -INFILE -INNER -INOUT -INSENSITIVE -INSERT -INT -INT1 -INT2 -INT3 -INT4 -INT8 -INTEGER -INTERVAL -INTO -IS -ITERATE -JOIN -KEY -KEYS -KILL -LABEL -LEADING -LEAVE -LEFT -LIKE -LIMIT -LINEAR -LINES -LOAD -LOCALTIME -LOCALTIMESTAMP -LOCK -LONG -LONGBLOB -LONGTEXT -LOOP -LOW_PRIORITY -MASTER_SSL_VERIFY_SERVER_CERT -MATCH -MEDIUMBLOB -MEDIUMINT -MEDIUMTEXT -MIDDLEINT -MINUTE_MICROSECOND -MINUTE_SECOND -MOD -MODIFIES -NATURAL -NOT -NO_WRITE_TO_BINLOG -NULL -NUMERIC -ON -OPTIMIZE -OPTION -OPTIONALLY -OR -ORDER -OUT -OUTER -OUTFILE -PRECISION -PRIMARY -PROCEDURE -PURGE -RANGE -READ -READS -READ_ONLY -READ_WRITE -REAL -REFERENCES -REGEXP -RELEASE -RENAME -REPEAT -REPLACE -REQUIRE -RESTRICT -RETURN -REVOKE -RIGHT -RLIKE -ROLLBACK -SCHEMA -SCHEMAS -SECOND_MICROSECOND -SELECT -SENSITIVE -SEPARATOR -SET -SHOW -SMALLINT -SPATIAL -SPECIFIC -SQL -SQLEXCEPTION -SQLSTATE -SQLWARNING -SQL_BIG_RESULT -SQL_CALC_FOUND_ROWS -SQL_SMALL_RESULT -SSL -STARTING -STRAIGHT_JOIN -TABLE -TERMINATED -THEN -TINYBLOB -TINYINT -TINYTEXT -TO -TRAILING -TRIGGER -TRUE -UNDO -UNION -UNIQUE -UNLOCK -UNSIGNED -UPDATE -UPGRADE -USAGE -USE -USING -UTC_DATE -UTC_TIME -UTC_TIMESTAMP -VALUE -VALUES -VARBINARY -VARCHAR -VARCHARACTER -VARYING -WHEN -WHERE -WHILE -WITH -WRITE -XOR -YEAR_MONTH -ZEROFILL \ No newline at end of file diff --git a/Source/MySql.Data/parameter.cs b/Source/MySql.Data/parameter.cs deleted file mode 100644 index f24362bc8..000000000 --- a/Source/MySql.Data/parameter.cs +++ /dev/null @@ -1,345 +0,0 @@ -// Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.ComponentModel; -using System.Reflection; -using System.Text; -using System.Collections; -using System.Data; -using MySql.Data.Types; -using MySql.Data.Common; -using System.Data.Common; - -namespace MySql.Data.MySqlClient -{ - /// - /// Represents a parameter to a , This class cannot be inherited. - /// -#if !NETCORE10 - public sealed partial class MySqlParameter : System.ICloneable -#else - public sealed partial class MySqlParameter : MySql.Data.Common.ICloneable -#endif - { - private const int UNSIGNED_MASK = 0x8000; - private object _paramValue; - private string _paramName; - private MySqlDbType _mySqlDbType; - private bool _inferType = true; - private const int GEOMETRY_LENGTH = 25; - -#region Constructors - - public MySqlParameter() - { - Init(); - } - - /// - /// Initializes a new instance of the class with the parameter name and a value of the new MySqlParameter. - /// - /// The name of the parameter to map. - /// An that is the value of the . - public MySqlParameter(string parameterName, object value) : this() - { - ParameterName = parameterName; - Value = value; - } - - /// - /// Initializes a new instance of the class with the parameter name and the data type. - /// - /// The name of the parameter to map. - /// One of the values. - public MySqlParameter(string parameterName, MySqlDbType dbType) : this(parameterName, null) - { - MySqlDbType = dbType; - } - - /// - /// Initializes a new instance of the class with the parameter name, the , and the size. - /// - /// The name of the parameter to map. - /// One of the values. - /// The length of the parameter. - public MySqlParameter(string parameterName, MySqlDbType dbType, int size) : this(parameterName, dbType) - { - Size = size; - } - - partial void Init(); - -#endregion - -#region Properties - - [Category("Misc")] - public override String ParameterName - { - get { return _paramName; } - set { SetParameterName(value); } - } - - internal MySqlParameterCollection Collection { get; set; } - internal Encoding Encoding { get; set; } - - internal bool TypeHasBeenSet => _inferType == false; - - - internal string BaseName - { - get - { - if (ParameterName.StartsWith("@", StringComparison.Ordinal) || ParameterName.StartsWith("?", StringComparison.Ordinal)) - return ParameterName.Substring(1); - return ParameterName; - } - } - - /// - /// Gets or sets a value indicating whether the parameter is input-only, output-only, bidirectional, or a stored procedure return value parameter. - /// As of MySql version 4.1 and earlier, input-only is the only valid choice. - /// - [Category("Data")] - public override ParameterDirection Direction { get; set; } - - /// - /// Gets or sets a value indicating whether the parameter accepts null values. - /// - [Browsable(false)] - public override Boolean IsNullable { get; set; } - - /// - /// Gets or sets the MySqlDbType of the parameter. - /// - [Category("Data")] - [DbProviderSpecificTypeProperty(true)] - public MySqlDbType MySqlDbType - { - get { return _mySqlDbType; } - set - { - SetMySqlDbType(value); - _inferType = false; - } - } - - /// - /// Gets or sets the maximum number of digits used to represent the property. - /// - [Category("Data")] - public override byte Precision { get; set; } - - /// - /// Gets or sets the number of decimal places to which is resolved. - /// - [Category("Data")] - public override byte Scale { get; set; } - - /// - /// Gets or sets the maximum size, in bytes, of the data within the column. - /// - [Category("Data")] - public override int Size { get; set; } - - /// - /// Gets or sets the value of the parameter. - /// - [TypeConverter(typeof(StringConverter))] - [Category("Data")] - public override object Value - { - get { return _paramValue; } - set - { - _paramValue = value; - byte[] valueAsByte = value as byte[]; - string valueAsString = value as string; - - if (valueAsByte != null) - Size = valueAsByte.Length; - else if (valueAsString != null) - Size = valueAsString.Length; - if (_inferType) - SetTypeFromValue(); - } - } - - internal IMySqlValue ValueObject { get; private set; } - - /// - /// Returns the possible values for this parameter if this parameter is of type - /// SET or ENUM. Returns null otherwise. - /// - public IList PossibleValues { get; internal set; } - -#endregion - - private void SetParameterName(string name) - { - Collection?.ParameterNameChanged(this, _paramName, name); - _paramName = name; - } - - /// - /// Overridden. Gets a string containing the . - /// - /// - public override string ToString() => _paramName; - - internal int GetPSType() - { - switch (_mySqlDbType) - { - case MySqlDbType.Bit: - return (int)MySqlDbType.Int64 | UNSIGNED_MASK; - case MySqlDbType.UByte: - return (int)MySqlDbType.Byte | UNSIGNED_MASK; - case MySqlDbType.UInt64: - return (int)MySqlDbType.Int64 | UNSIGNED_MASK; - case MySqlDbType.UInt32: - return (int)MySqlDbType.Int32 | UNSIGNED_MASK; - case MySqlDbType.UInt24: - return (int)MySqlDbType.Int32 | UNSIGNED_MASK; - case MySqlDbType.UInt16: - return (int)MySqlDbType.Int16 | UNSIGNED_MASK; - default: - return (int)_mySqlDbType; - } - } - - internal void Serialize(MySqlPacket packet, bool binary, MySqlConnectionStringBuilder settings) - { - if (!binary && (_paramValue == null || _paramValue == DBNull.Value)) - packet.WriteStringNoNull("NULL"); - else - { - if (ValueObject.MySqlDbType == MySqlDbType.Guid) - { - MySqlGuid g = (MySqlGuid)ValueObject; - g.OldGuids = settings.OldGuids; - ValueObject = g; - } - if (ValueObject.MySqlDbType == MySqlDbType.Geometry) - { - MySqlGeometry v = (MySqlGeometry)ValueObject; - if (v.IsNull && Value != null) - { - MySqlGeometry.TryParse(Value.ToString(), out v); - } - ValueObject = v; - } - ValueObject.WriteValue(packet, binary, _paramValue, Size); - } - } - - partial void SetDbTypeFromMySqlDbType(); - - private void SetMySqlDbType(MySqlDbType mysqlDbtype) - { - _mySqlDbType = mysqlDbtype; - ValueObject = MySqlField.GetIMySqlValue(_mySqlDbType); - SetDbTypeFromMySqlDbType(); - } - - private void SetTypeFromValue() - { - if (_paramValue == null || _paramValue == DBNull.Value) return; - - if (_paramValue is Guid) - MySqlDbType = MySqlDbType.Guid; - else if (_paramValue is TimeSpan) - MySqlDbType = MySqlDbType.Time; - else if (_paramValue is bool) - MySqlDbType = MySqlDbType.Byte; - else - { - Type t = _paramValue.GetType(); - switch (t.Name) - { - case "SByte": MySqlDbType = MySqlDbType.Byte; break; - case "Byte": MySqlDbType = MySqlDbType.UByte; break; - case "Int16": MySqlDbType = MySqlDbType.Int16; break; - case "UInt16": MySqlDbType = MySqlDbType.UInt16; break; - case "Int32": MySqlDbType = MySqlDbType.Int32; break; - case "UInt32": MySqlDbType = MySqlDbType.UInt32; break; - case "Int64": MySqlDbType = MySqlDbType.Int64; break; - case "UInt64": MySqlDbType = MySqlDbType.UInt64; break; - case "DateTime": MySqlDbType = MySqlDbType.DateTime; break; - case "String": MySqlDbType = MySqlDbType.VarChar; break; - case "Single": MySqlDbType = MySqlDbType.Float; break; - case "Double": MySqlDbType = MySqlDbType.Double; break; - - case "Decimal": MySqlDbType = MySqlDbType.Decimal; break; - case "Object": - default: - if (t.GetTypeInfo().BaseType == typeof(Enum)) - MySqlDbType = MySqlDbType.Int32; - else - MySqlDbType = MySqlDbType.Blob; - break; - } - } - } - -#region ICloneable - - public MySqlParameter Clone() - { -#if NETCORE10 - MySqlParameter clone = new MySqlParameter(_paramName, _mySqlDbType, Direction, SourceColumn, _paramValue) -#else - MySqlParameter clone = new MySqlParameter(_paramName, _mySqlDbType, Direction, SourceColumn, SourceVersion , _paramValue) -#endif - { _inferType = _inferType}; - // if we have not had our type set yet then our clone should not either - return clone; - } - -#if !NETCORE10 - object System.ICloneable.Clone() - { - return this.Clone(); - } -#endif - -#endregion - - // this method is pretty dumb but we want it to be fast. it doesn't return size based - // on value and type but just on the value. - internal long EstimatedSize() - { - if (Value == null || Value == DBNull.Value) - return 4; // size of NULL - if (Value is byte[]) - return ((byte[]) Value).Length; - if (Value is string) - return ((string) Value).Length * 4; // account for UTF-8 (yeah I know) - if (Value is decimal || Value is float) - return 64; - return 32; - } - - } - -} diff --git a/Source/MySql.Data/parameter_collection.cs b/Source/MySql.Data/parameter_collection.cs deleted file mode 100644 index 73aea214d..000000000 --- a/Source/MySql.Data/parameter_collection.cs +++ /dev/null @@ -1,346 +0,0 @@ -// Copyright � 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; - - -namespace MySql.Data.MySqlClient -{ - /// - /// Represents a collection of parameters relevant to a as well as their respective mappings to columns in a . This class cannot be inherited. - /// - /// - public sealed partial class MySqlParameterCollection - { - readonly List _items = new List(); - private readonly Dictionary _indexHashCs; - private readonly Dictionary _indexHashCi; - //turns to true if any parameter is unnamed - internal bool containsUnnamedParameters; - - internal MySqlParameterCollection(MySqlCommand cmd) - { - _indexHashCs = new Dictionary(); - _indexHashCi = new Dictionary(StringComparer.CurrentCultureIgnoreCase); - containsUnnamedParameters = false; - Clear(); - } - - /// - /// Gets the number of MySqlParameter objects in the collection. - /// - public override int Count => _items.Count; - - #region Public Methods - - /// - /// Gets the at the specified index. - /// - /// Gets the with a specified attribute. - /// [C#] In C#, this property is the indexer for the class. - /// - public new MySqlParameter this[int index] - { - get { return InternalGetParameter(index); } - set { InternalSetParameter(index, value); } - } - - /// - /// Gets the with the specified name. - /// - public new MySqlParameter this[string name] - { - get { return InternalGetParameter(name); } - set { InternalSetParameter(name, value); } - } - - /// - /// Adds the specified object to the . - /// - /// The to add to the collection. - /// The newly added object. - public MySqlParameter Add(MySqlParameter value) - { - return InternalAdd(value, -1); - } - - /// - /// Adds a to the given the specified parameter name and value. - /// - /// The name of the parameter. - /// The of the to add to the collection. - /// The newly added object. - [Obsolete("Add(String parameterName, Object value) has been deprecated. Use AddWithValue(String parameterName, Object value)")] - public MySqlParameter Add(string parameterName, object value) - { - return Add(new MySqlParameter(parameterName, value)); - } - - public MySqlParameter AddWithValue(string parameterName, object value) - { - return Add(new MySqlParameter(parameterName, value)); - } - - /// - /// Adds a to the given the parameter name and the data type. - /// - /// The name of the parameter. - /// One of the values. - /// The newly added object. - public MySqlParameter Add(string parameterName, MySqlDbType dbType) - { - return Add(new MySqlParameter(parameterName, dbType)); - } - - /// - /// Adds a to the with the parameter name, the data type, and the column length. - /// - /// The name of the parameter. - /// One of the values. - /// The length of the column. - /// The newly added object. - public MySqlParameter Add(string parameterName, MySqlDbType dbType, int size) - { - return Add(new MySqlParameter(parameterName, dbType, size)); - } - - #endregion - - /// - /// Removes all items from the collection. - /// - public override void Clear() - { - foreach (MySqlParameter p in _items) - p.Collection = null; - _items.Clear(); - _indexHashCs.Clear(); - _indexHashCi.Clear(); - } - - void CheckIndex(int index) - { - if (index < 0 || index >= Count) - throw new IndexOutOfRangeException("Parameter index is out of range."); - } - - private MySqlParameter InternalGetParameter(int index) - { - CheckIndex(index); - return _items[index]; - } - - private MySqlParameter InternalGetParameter(string parameterName) - { - int index = IndexOf(parameterName); - if (index < 0) - { - // check to see if the user has added the parameter without a - // parameter marker. If so, kindly tell them what they did. - if (parameterName.StartsWith("@", StringComparison.Ordinal) || - parameterName.StartsWith("?", StringComparison.Ordinal)) - { - string newParameterName = parameterName.Substring(1); - index = IndexOf(newParameterName); - if (index != -1) - return _items[index]; - } - throw new ArgumentException("Parameter '" + parameterName + "' not found in the collection."); - } - return _items[index]; - } - - private void InternalSetParameter(string parameterName, MySqlParameter value) - { - int index = IndexOf(parameterName); - if (index < 0) - throw new ArgumentException("Parameter '" + parameterName + "' not found in the collection."); - InternalSetParameter(index, value); - } - - private void InternalSetParameter(int index, MySqlParameter value) - { - MySqlParameter newParameter = value; - if (newParameter == null) - throw new ArgumentException(Resources.NewValueShouldBeMySqlParameter); - - CheckIndex(index); - MySqlParameter p = _items[index]; - - // first we remove the old parameter from our hashes - _indexHashCs.Remove(p.ParameterName); - _indexHashCi.Remove(p.ParameterName); - - // then we add in the new parameter - _items[index] = newParameter; - _indexHashCs.Add(value.ParameterName, index); - _indexHashCi.Add(value.ParameterName, index); - } - - /// - /// Gets the location of the in the collection with a specific parameter name. - /// - /// The name of the object to retrieve. - /// The zero-based location of the in the collection. - public override int IndexOf(string parameterName) - { - int i = -1; - if (!_indexHashCs.TryGetValue(parameterName, out i) && - !_indexHashCi.TryGetValue(parameterName, out i)) - return -1; - return i; - } - - /// - /// Gets the location of a in the collection. - /// - /// The object to locate. - /// The zero-based location of the in the collection. - /// Gets the location of a in the collection. - public override int IndexOf(object value) - { - MySqlParameter parameter = value as MySqlParameter; - if (null == parameter) - throw new ArgumentException("Argument must be of type DbParameter", "value"); - return _items.IndexOf(parameter); - } - - internal void ParameterNameChanged(MySqlParameter p, string oldName, string newName) - { - int index = IndexOf(oldName); - _indexHashCs.Remove(oldName); - _indexHashCi.Remove(oldName); - - _indexHashCs.Add(newName, index); - _indexHashCi.Add(newName, index); - } - - private MySqlParameter InternalAdd(MySqlParameter value, int index) - { - if (value == null) - throw new ArgumentException("The MySqlParameterCollection only accepts non-null MySqlParameter type objects.", "value"); - - // if the parameter is unnamed, then assign a default name - if (String.IsNullOrEmpty(value.ParameterName)) - value.ParameterName = String.Format("Parameter{0}", GetNextIndex()); - - // make sure we don't already have a parameter with this name - if (IndexOf(value.ParameterName) >= 0) - { - throw new MySqlException( - String.Format(Resources.ParameterAlreadyDefined, value.ParameterName)); - } - else - { - string inComingName = value.ParameterName; - if (inComingName[0] == '@' || inComingName[0] == '?') - inComingName = inComingName.Substring(1, inComingName.Length - 1); - if (IndexOf(inComingName) >= 0) - throw new MySqlException( - String.Format(Resources.ParameterAlreadyDefined, value.ParameterName)); - } - - if (index == -1) - { - _items.Add(value); - index = _items.Count - 1; - } - else - { - _items.Insert(index, value); - AdjustHashes(index, true); - } - - _indexHashCs.Add(value.ParameterName, index); - _indexHashCi.Add(value.ParameterName, index); - - value.Collection = this; - return value; - } - - private int GetNextIndex() - { - int index = Count+1; - - while (true) - { - string name = "Parameter" + index.ToString(); - if (!_indexHashCi.ContainsKey(name)) break; - index++; - } - return index; - } - - private static void AdjustHash(Dictionary hash, string parameterName, int keyIndex, bool addEntry) - { - if (!hash.ContainsKey(parameterName)) return; - int index = hash[parameterName]; - if (index < keyIndex) return; - hash[parameterName] = addEntry ? ++index : --index; - } - - /// - /// This method will update all the items in the index hashes when - /// we insert a parameter somewhere in the middle - /// - /// - /// - private void AdjustHashes(int keyIndex, bool addEntry) - { - for (int i = 0; i < Count; i++) - { - string name = _items[i].ParameterName; - AdjustHash(_indexHashCi, name, keyIndex, addEntry); - AdjustHash(_indexHashCs, name, keyIndex, addEntry); - } - } - - private MySqlParameter GetParameterFlexibleInternal(string baseName) - { - int index = IndexOf(baseName); - if (-1 == index) - index = IndexOf("?" + baseName); - if (-1 == index) - index = IndexOf("@" + baseName); - if (-1 != index) - return this[index]; - return null; - } - - internal MySqlParameter GetParameterFlexible(string parameterName, bool throwOnNotFound) - { - string baseName = parameterName; - MySqlParameter p = GetParameterFlexibleInternal(baseName); - if (p != null) return p; - - if (parameterName.StartsWith("@", StringComparison.Ordinal) || parameterName.StartsWith("?", StringComparison.Ordinal)) - baseName = parameterName.Substring(1); - p = GetParameterFlexibleInternal(baseName); - if (p != null) return p; - - if (throwOnNotFound) - throw new ArgumentException("Parameter '" + parameterName + "' not found in the collection."); - return null; - } - } -} diff --git a/Source/MySql.Data/project.json b/Source/MySql.Data/project.json deleted file mode 100644 index 7b6299723..000000000 --- a/Source/MySql.Data/project.json +++ /dev/null @@ -1,175 +0,0 @@ -{ - "version": "7.0.7-m6", - "description": "MySql.Data.MySqlClient .Net Core Class Library", - "authors": [ - "Oracle" - ], - "copyright": "Copyright © 2016, 2017, Oracle and/or its affiliates. All rights reserved.", - "language": "en-US", - "packOptions": { - "projectUrl": "http://dev.mysql.com/downloads/", - "licenseUrl": "http://www.gnu.org/licenses/old-licenses/gpl-2.0.html", - "iconUrl": "http://www.mysql.com/common/logos/logo-mysql-170x115.png", - "tags": [ - "MySql", - ".NET Connector", - "MySql Connector/NET", - "netcore", - ".Net Core", - "MySql Conector/Net Core", - "coreclr", - "C/NET", - "C/Net Core" - ], - "files": { - "includeFiles": [ - "../../Release Notes.txt" - ], - "include": [ - "../../README" - ] - }, - "releaseNotes": "Review ReleaseNotes.txt for details.", - "requireLicenseAcceptance": true - }, - "buildOptions": { - "keyFile": "../../ConnectorNetPublicKey.snk", - "delaySign": true, - "publicSign": false, - "nowarn": [ "CS1591" ] - }, - "dependencies": { - "Google.Protobuf": "3.0.0", - "System.Runtime.InteropServices.RuntimeInformation": "4.0.0" - }, - "frameworks": { - "net451": { - "frameworkAssemblies": { - "System.ComponentModel.DataAnnotations": "", - "System.Data": "", - "System.Drawing": "", - "System.Drawing.Design": "", - "System.Transactions": "", - "System.Configuration": "", - "System.Configuration.Install": "", - "System.Management": "", - "System.Xml": "", - "System.Runtime": { - "type": "build" - } - }, - "buildOptions": { - "embed": [ - "keywords.txt", - "Resources.resx", - "ResourcesX.resx", - "Properties/ReservedWords.txt" - ], - "compile": { - "exclude": [ - "Framework/NetCore10/*.*" - ] - } - }, - "dependencies": {} - }, - "netstandard1.6": { - "imports": "dnxcore50", - "buildOptions": { - "define": [ - "NETCORE10" - ], - "warningsAsErrors": false, - "nowarn": [ "CS1591" ], - "embed": [ - "keywords.txt", - "Resources.resx", - "ResourcesX.resx", - "Properties/ReservedWords.txt" - ], - "resource": [ - "**/*.resx" - ], - "compile": { - "exclude": [ - "Framework/Net451/**/*.*", - "Replication/**/*.*", - "TimeStream.cs", - "**/._*" - ], - "includeFiles": [ - "Resources.Designer.cs", - "ResourcesX.Designer.cs" - ], - "excludeFiles": [ - "Properties/VersionInfo.cs", - "Properties/ResourcesX.Designer.cs", - "CommandBuilder.cs", - "dataadapter.cs", - "Installer.cs", - "MySqlClientPermission.cs", - "MySqlClientPermissionAttribute.cs", - "MySqlConfiguration.cs", - "MySqlPromotableTransaction.cs", - "MySqlSecurityPermission.cs", - "SystemPerformanceMonitor.cs", - "common/NamedPipeStream.cs", - "common/NativeMethods.cs", - "common/SHA1.cs", - "common/SharedMemoryStream.cs", - "common/SocketStream.cs" - ] - } - }, - "dependencies": { - "Microsoft.Extensions.Configuration.Json": "1.0.0", - "System.Collections.NonGeneric": "4.0.1", - "System.ComponentModel": "4.0.1", - "System.ComponentModel.Annotations": "4.1.0", - "System.ComponentModel.Primitives": "4.1.0", - "System.ComponentModel.TypeConverter": "4.1.0", - "System.Data.Common": "4.1.0", - "System.Data.SqlClient": "4.1.0", - "System.Diagnostics.Process": "4.1.0", - "System.Diagnostics.TextWriterTraceListener": "4.0.0", - "System.IO.Compression": "4.1.0", - "System.IO.FileSystem.Primitives": "4.0.1", - "System.IO.MemoryMappedFiles": "4.0.0", - "System.IO.Pipes": "4.0.0", - "System.Linq.Expressions": "4.1.0", - "System.Net.NameResolution": "4.0.0", - "System.Net.Security": "4.0.0", - "System.Net.Sockets": "4.1.0", - "System.Reflection": "4.1.0", - "System.Reflection.TypeExtensions": "4.1.0", - "System.Resources.ResourceManager": "4.0.1", - "System.Security.Principal.Windows": "4.0.0", - "System.Text.Encoding.CodePages": "4.0.1", - "System.Threading.Timer": "4.0.1", - "System.Threading.ThreadPool": "4.0.10" - } - } - }, - "configurations": { - "Debug": { - "buildOptions": { - "define": [ - "DEBUG", "TRACE" - ], - "optimize": false, - "preserveCompilationContext": true - } - }, - "Release": { - "buildOptions": { - "define": [ - "RELEASE" - ], - "optimize": true, - "preserveCompilationContext": true, - "xmlDoc": true, - "nowarn": [ "CS1591" ] - } - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data/transaction.cs b/Source/MySql.Data/transaction.cs deleted file mode 100644 index 50dccbbba..000000000 --- a/Source/MySql.Data/transaction.cs +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright (c) 2004, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Data; - -namespace MySql.Data.MySqlClient -{ - /// - public sealed partial class MySqlTransaction : IDisposable - { - private bool open; - private bool disposed = false; - - internal MySqlTransaction(MySqlConnection c, IsolationLevel il) - { - Connection = c; - IsolationLevel = il; - open = true; - } - - #region Destructor - ~MySqlTransaction() - { - Dispose(false); - } - #endregion - - #region Properties - - /// - /// Gets the object associated with the transaction, or a null reference (Nothing in Visual Basic) if the transaction is no longer valid. - /// - /// The object associated with this transaction. - /// - /// A single application may have multiple database connections, each - /// with zero or more transactions. This property enables you to - /// determine the connection object associated with a particular - /// transaction created by . - /// - public new MySqlConnection Connection { get; } - - /// - /// Specifies the for this transaction. - /// - /// - /// The for this transaction. The default is ReadCommitted. - /// - /// - /// Parallel transactions are not supported. Therefore, the IsolationLevel - /// applies to the entire transaction. - /// - public override IsolationLevel IsolationLevel { get; } - - #endregion - - - protected override void Dispose(bool disposing) - { - if (disposed) return; - base.Dispose(disposing); - if (disposing) - { - if ((Connection != null && Connection.State == ConnectionState.Open || Connection.SoftClosed) && open) - Rollback(); - } - disposed = true; - } - - /// - public override void Commit() - { - if (Connection == null || (Connection.State != ConnectionState.Open && !Connection.SoftClosed)) - throw new InvalidOperationException("Connection must be valid and open to commit transaction"); - if (!open) - throw new InvalidOperationException("Transaction has already been committed or is not pending"); - MySqlCommand cmd = new MySqlCommand("COMMIT", Connection); - cmd.ExecuteNonQuery(); - open = false; - } - - /// - public override void Rollback() - { - if (Connection == null || (Connection.State != ConnectionState.Open && !Connection.SoftClosed)) - throw new InvalidOperationException("Connection must be valid and open to rollback transaction"); - if (!open) - throw new InvalidOperationException("Transaction has already been rolled back or is not pending"); - MySqlCommand cmd = new MySqlCommand("ROLLBACK", Connection); - cmd.ExecuteNonQuery(); - open = false; - } - - } -} diff --git a/Source/MySql.Data/zlib/Adler32.cs b/Source/MySql.Data/zlib/Adler32.cs deleted file mode 100644 index 4367c04d0..000000000 --- a/Source/MySql.Data/zlib/Adler32.cs +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright (c) 2006, ComponentAce -// http://www.componentace.com -// 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 ComponentAce 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. - - - -/* -Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. - -2. 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. - -3. The names of the authors may not be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 JCRAFT, -INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE 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. -*/ -/* -* This program is based on zlib-1.1.3, so all credit should go authors -* Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) -* and contributors of zlib. -*/ -using System; -namespace zlib -{ - - sealed class Adler32 - { - - // largest prime smaller than 65536 - private const int BASE = 65521; - // NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 - private const int NMAX = 5552; - - internal long adler32(long adler, byte[] buf, int index, int len) - { - if (buf == null) - { - return 1L; - } - - long s1 = adler & 0xffff; - long s2 = (adler >> 16) & 0xffff; - int k; - - while (len > 0) - { - k = len < NMAX?len:NMAX; - len -= k; - while (k >= 16) - { - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - s1 += (buf[index++] & 0xff); s2 += s1; - k -= 16; - } - if (k != 0) - { - do - { - s1 += (buf[index++] & 0xff); s2 += s1; - } - while (--k != 0); - } - s1 %= BASE; - s2 %= BASE; - } - return (s2 << 16) | s1; - } - - } -} \ No newline at end of file diff --git a/Source/MySql.Data/zlib/Deflate.cs b/Source/MySql.Data/zlib/Deflate.cs deleted file mode 100644 index cd6fd2d89..000000000 --- a/Source/MySql.Data/zlib/Deflate.cs +++ /dev/null @@ -1,1799 +0,0 @@ -// Copyright (c) 2006, ComponentAce -// http://www.componentace.com -// 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 ComponentAce 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. - -/* -Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. - -2. 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. - -3. The names of the authors may not be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 JCRAFT, -INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE 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. -*/ -/* -* This program is based on zlib-1.1.3, so all credit should go authors -* Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) -* and contributors of zlib. -*/ -using System; -namespace zlib -{ - - sealed class Deflate - { - - private const int MAX_MEM_LEVEL = 9; - - private const int Z_DEFAULT_COMPRESSION = - 1; - - private const int MAX_WBITS = 15; // 32K LZ77 window - private const int DEF_MEM_LEVEL = 8; - - internal class Config - { - internal int good_length; // reduce lazy search above this match length - internal int max_lazy; // do not perform lazy search above this match length - internal int nice_length; // quit search above this match length - internal int max_chain; - internal int func; - internal Config(int good_length, int max_lazy, int nice_length, int max_chain, int func) - { - this.good_length = good_length; - this.max_lazy = max_lazy; - this.nice_length = nice_length; - this.max_chain = max_chain; - this.func = func; - } - } - - private const int STORED = 0; - private const int FAST = 1; - private const int SLOW = 2; - private static Config[] config_table; - - private static readonly System.String[] z_errmsg = new System.String[]{"need dictionary", "stream end", "", "file error", "stream error", "data error", "insufficient memory", "buffer error", "incompatible version", ""}; - - // block not completed, need more input or more output - private const int NeedMore = 0; - - // block flush performed - private const int BlockDone = 1; - - // finish started, need only more output at next deflate - private const int FinishStarted = 2; - - // finish done, accept no more input or output - private const int FinishDone = 3; - - // preset dictionary flag in zlib header - private const int PRESET_DICT = 0x20; - - private const int Z_FILTERED = 1; - private const int Z_HUFFMAN_ONLY = 2; - private const int Z_DEFAULT_STRATEGY = 0; - - private const int Z_NO_FLUSH = 0; - private const int Z_PARTIAL_FLUSH = 1; - private const int Z_SYNC_FLUSH = 2; - private const int Z_FULL_FLUSH = 3; - private const int Z_FINISH = 4; - - private const int Z_OK = 0; - private const int Z_STREAM_END = 1; - private const int Z_NEED_DICT = 2; - private const int Z_ERRNO = - 1; - private const int Z_STREAM_ERROR = - 2; - private const int Z_DATA_ERROR = - 3; - private const int Z_MEM_ERROR = - 4; - private const int Z_BUF_ERROR = - 5; - private const int Z_VERSION_ERROR = - 6; - - private const int INIT_STATE = 42; - private const int BUSY_STATE = 113; - private const int FINISH_STATE = 666; - - // The deflate compression method - private const int Z_DEFLATED = 8; - - private const int STORED_BLOCK = 0; - private const int STATIC_TREES = 1; - private const int DYN_TREES = 2; - - // The three kinds of block type - private const int Z_BINARY = 0; - private const int Z_ASCII = 1; - private const int Z_UNKNOWN = 2; - - private const int Buf_size = 8 * 2; - - // repeat previous bit length 3-6 times (2 bits of repeat count) - private const int REP_3_6 = 16; - - // repeat a zero length 3-10 times (3 bits of repeat count) - private const int REPZ_3_10 = 17; - - // repeat a zero length 11-138 times (7 bits of repeat count) - private const int REPZ_11_138 = 18; - - private const int MIN_MATCH = 3; - private const int MAX_MATCH = 258; - private static readonly int MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1); - - private const int MAX_BITS = 15; - private const int D_CODES = 30; - private const int BL_CODES = 19; - private const int LENGTH_CODES = 29; - private const int LITERALS = 256; - private static readonly int L_CODES = (LITERALS + 1 + LENGTH_CODES); - private static readonly int HEAP_SIZE = (2 * L_CODES + 1); - - private const int END_BLOCK = 256; - - internal ZStream strm; // pointer back to this zlib stream - internal int status; // as the name implies - internal byte[] pending_buf; // output still pending - internal int pending_buf_size; // size of pending_buf - internal int pending_out; // next pending byte to output to the stream - internal int pending; // nb of bytes in the pending buffer - internal int noheader; // suppress zlib header and adler32 - internal byte data_type; // UNKNOWN, BINARY or ASCII - internal byte method; // STORED (for zip only) or DEFLATED - internal int last_flush; // value of flush param for previous deflate call - - internal int w_size; // LZ77 window size (32K by default) - internal int w_bits; // log2(w_size) (8..16) - internal int w_mask; // w_size - 1 - - internal byte[] window; - // Sliding window. Input bytes are read into the second half of the window, - // and move to the first half later to keep a dictionary of at least wSize - // bytes. With this organization, matches are limited to a distance of - // wSize-MAX_MATCH bytes, but this ensures that IO is always - // performed with a length multiple of the block size. Also, it limits - // the window size to 64K, which is quite useful on MSDOS. - // To do: use the user input buffer as sliding window. - - internal int window_size; - // Actual size of window: 2*wSize, except when the user input buffer - // is directly used as sliding window. - - internal short[] prev; - // Link to older string with same hash index. To limit the size of this - // array to 64K, this link is maintained only for the last 32K strings. - // An index in this array is thus a window index modulo 32K. - - internal short[] head; // Heads of the hash chains or NIL. - - internal int ins_h; // hash index of string to be inserted - internal int hash_size; // number of elements in hash table - internal int hash_bits; // log2(hash_size) - internal int hash_mask; // hash_size-1 - - // Number of bits by which ins_h must be shifted at each input - // step. It must be such that after MIN_MATCH steps, the oldest - // byte no longer takes part in the hash key, that is: - // hash_shift * MIN_MATCH >= hash_bits - internal int hash_shift; - - // Window position at the beginning of the current output block. Gets - // negative when the window is moved backwards. - - internal int block_start; - - internal int match_length; // length of best match - internal int prev_match; // previous match - internal int match_available; // set if previous match exists - internal int strstart; // start of string to insert - internal int match_start; // start of matching string - internal int lookahead; // number of valid bytes ahead in window - - // Length of the best match at previous step. Matches not greater than this - // are discarded. This is used in the lazy match evaluation. - internal int prev_length; - - // To speed up deflation, hash chains are never searched beyond this - // length. A higher limit improves compression ratio but degrades the speed. - internal int max_chain_length; - - // Attempt to find a better match only when the current match is strictly - // smaller than this value. This mechanism is used only for compression - // levels >= 4. - internal int max_lazy_match; - - // Insert new strings in the hash table only if the match length is not - // greater than this length. This saves time but degrades compression. - // max_insert_length is used only for compression levels <= 3. - - internal int level; // compression level (1..9) - internal int strategy; // favor or force Huffman coding - - // Use a faster search when the previous match is longer than this - internal int good_match; - - // Stop searching when current match exceeds this - internal int nice_match; - - internal short[] dyn_ltree; // literal and length tree - internal short[] dyn_dtree; // distance tree - internal short[] bl_tree; // Huffman tree for bit lengths - - internal Tree l_desc = new Tree(); // desc for literal tree - internal Tree d_desc = new Tree(); // desc for distance tree - internal Tree bl_desc = new Tree(); // desc for bit length tree - - // number of codes at each bit length for an optimal tree - internal short[] bl_count = new short[MAX_BITS + 1]; - - // heap used to build the Huffman trees - internal int[] heap = new int[2 * L_CODES + 1]; - - internal int heap_len; // number of elements in the heap - internal int heap_max; // element of largest frequency - // The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used. - // The same heap array is used to build all trees. - - // Depth of each subtree used as tie breaker for trees of equal frequency - internal byte[] depth = new byte[2 * L_CODES + 1]; - - internal int l_buf; // index for literals or lengths */ - - // Size of match buffer for literals/lengths. There are 4 reasons for - // limiting lit_bufsize to 64K: - // - frequencies can be kept in 16 bit counters - // - if compression is not successful for the first block, all input - // data is still in the window so we can still emit a stored block even - // when input comes from standard input. (This can also be done for - // all blocks if lit_bufsize is not greater than 32K.) - // - if compression is not successful for a file smaller than 64K, we can - // even emit a stored file instead of a stored block (saving 5 bytes). - // This is applicable only for zip (not gzip or zlib). - // - creating new Huffman trees less frequently may not provide fast - // adaptation to changes in the input data statistics. (Take for - // example a binary file with poorly compressible code followed by - // a highly compressible string table.) Smaller buffer sizes give - // fast adaptation but have of course the overhead of transmitting - // trees more frequently. - // - I can't count above 4 - internal int lit_bufsize; - - internal int last_lit; // running index in l_buf - - // Buffer for distances. To simplify the code, d_buf and l_buf have - // the same number of elements. To use different lengths, an extra flag - // array would be necessary. - - internal int d_buf; // index of pendig_buf - - internal int opt_len; // bit length of current block with optimal trees - internal int static_len; // bit length of current block with static trees - internal int matches; // number of string matches in current block - internal int last_eob_len; // bit length of EOB code for last block - - // Output buffer. bits are inserted starting at the bottom (least - // significant bits). - internal short bi_buf; - - // Number of valid bits in bi_buf. All bits above the last valid bit - // are always zero. - internal int bi_valid; - - internal Deflate() - { - dyn_ltree = new short[HEAP_SIZE * 2]; - dyn_dtree = new short[(2 * D_CODES + 1) * 2]; // distance tree - bl_tree = new short[(2 * BL_CODES + 1) * 2]; // Huffman tree for bit lengths - } - - internal void lm_init() - { - window_size = 2 * w_size; - - head[hash_size - 1] = 0; - for (int i = 0; i < hash_size - 1; i++) - { - head[i] = 0; - } - - // Set the default configuration parameters: - max_lazy_match = Deflate.config_table[level].max_lazy; - good_match = Deflate.config_table[level].good_length; - nice_match = Deflate.config_table[level].nice_length; - max_chain_length = Deflate.config_table[level].max_chain; - - strstart = 0; - block_start = 0; - lookahead = 0; - match_length = prev_length = MIN_MATCH - 1; - match_available = 0; - ins_h = 0; - } - - // Initialize the tree data structures for a new zlib stream. - internal void tr_init() - { - - l_desc.dyn_tree = dyn_ltree; - l_desc.stat_desc = StaticTree.static_l_desc; - - d_desc.dyn_tree = dyn_dtree; - d_desc.stat_desc = StaticTree.static_d_desc; - - bl_desc.dyn_tree = bl_tree; - bl_desc.stat_desc = StaticTree.static_bl_desc; - - bi_buf = 0; - bi_valid = 0; - last_eob_len = 8; // enough lookahead for inflate - - // Initialize the first block of the first file: - init_block(); - } - - internal void init_block() - { - // Initialize the trees. - for (int i = 0; i < L_CODES; i++) - dyn_ltree[i * 2] = 0; - for (int i = 0; i < D_CODES; i++) - dyn_dtree[i * 2] = 0; - for (int i = 0; i < BL_CODES; i++) - bl_tree[i * 2] = 0; - - dyn_ltree[END_BLOCK * 2] = 1; - opt_len = static_len = 0; - last_lit = matches = 0; - } - - // Restore the heap property by moving down the tree starting at node k, - // exchanging a node with the smallest of its two sons if necessary, stopping - // when the heap property is re-established (each father smaller than its - // two sons). - internal void pqdownheap(short[] tree, int k) - { - int v = heap[k]; - int j = k << 1; // left son of k - while (j <= heap_len) - { - // Set j to the smallest of the two sons: - if (j < heap_len && smaller(tree, heap[j + 1], heap[j], depth)) - { - j++; - } - // Exit if v is smaller than both sons - if (smaller(tree, v, heap[j], depth)) - break; - - // Exchange v with the smallest son - heap[k] = heap[j]; k = j; - // And continue down the tree, setting j to the left son of k - j <<= 1; - } - heap[k] = v; - } - - internal static bool smaller(short[] tree, int n, int m, byte[] depth) - { - return (tree[n * 2] < tree[m * 2] || (tree[n * 2] == tree[m * 2] && depth[n] <= depth[m])); - } - - // Scan a literal or distance tree to determine the frequencies of the codes - // in the bit length tree. - internal void scan_tree(short[] tree, int max_code) - { - int n; // iterates over all tree elements - int prevlen = - 1; // last emitted length - int curlen; // length of current code - int nextlen = tree[0 * 2 + 1]; // length of next code - int count = 0; // repeat count of the current code - int max_count = 7; // max repeat count - int min_count = 4; // min repeat count - - if (nextlen == 0) - { - max_count = 138; min_count = 3; - } - tree[(max_code + 1) * 2 + 1] = (short) SupportClass.Identity(0xffff); // guard - - for (n = 0; n <= max_code; n++) - { - curlen = nextlen; nextlen = tree[(n + 1) * 2 + 1]; - if (++count < max_count && curlen == nextlen) - { - continue; - } - else if (count < min_count) - { - bl_tree[curlen * 2] = (short) (bl_tree[curlen * 2] + count); - } - else if (curlen != 0) - { - if (curlen != prevlen) - bl_tree[curlen * 2]++; - bl_tree[REP_3_6 * 2]++; - } - else if (count <= 10) - { - bl_tree[REPZ_3_10 * 2]++; - } - else - { - bl_tree[REPZ_11_138 * 2]++; - } - count = 0; prevlen = curlen; - if (nextlen == 0) - { - max_count = 138; min_count = 3; - } - else if (curlen == nextlen) - { - max_count = 6; min_count = 3; - } - else - { - max_count = 7; min_count = 4; - } - } - } - - // Construct the Huffman tree for the bit lengths and return the index in - // bl_order of the last bit length code to send. - internal int build_bl_tree() - { - int max_blindex; // index of last bit length code of non zero freq - - // Determine the bit length frequencies for literal and distance trees - scan_tree(dyn_ltree, l_desc.max_code); - scan_tree(dyn_dtree, d_desc.max_code); - - // Build the bit length tree: - bl_desc.build_tree(this); - // opt_len now includes the length of the tree representations, except - // the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - - // Determine the number of bit length codes to send. The pkzip format - // requires that at least 4 bit length codes be sent. (appnote.txt says - // 3 but the actual value used is 4.) - for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) - { - if (bl_tree[Tree.bl_order[max_blindex] * 2 + 1] != 0) - break; - } - // Update opt_len to include the bit length tree and counts - opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; - - return max_blindex; - } - - - // Send the header for a block using dynamic Huffman trees: the counts, the - // lengths of the bit length codes, the literal tree and the distance tree. - // IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - internal void send_all_trees(int lcodes, int dcodes, int blcodes) - { - int rank; // index in bl_order - - send_bits(lcodes - 257, 5); // not +255 as stated in appnote.txt - send_bits(dcodes - 1, 5); - send_bits(blcodes - 4, 4); // not -3 as stated in appnote.txt - for (rank = 0; rank < blcodes; rank++) - { - send_bits(bl_tree[Tree.bl_order[rank] * 2 + 1], 3); - } - send_tree(dyn_ltree, lcodes - 1); // literal tree - send_tree(dyn_dtree, dcodes - 1); // distance tree - } - - // Send a literal or distance tree in compressed form, using the codes in - // bl_tree. - internal void send_tree(short[] tree, int max_code) - { - int n; // iterates over all tree elements - int prevlen = - 1; // last emitted length - int curlen; // length of current code - int nextlen = tree[0 * 2 + 1]; // length of next code - int count = 0; // repeat count of the current code - int max_count = 7; // max repeat count - int min_count = 4; // min repeat count - - if (nextlen == 0) - { - max_count = 138; min_count = 3; - } - - for (n = 0; n <= max_code; n++) - { - curlen = nextlen; nextlen = tree[(n + 1) * 2 + 1]; - if (++count < max_count && curlen == nextlen) - { - continue; - } - else if (count < min_count) - { - do - { - send_code(curlen, bl_tree); - } - while (--count != 0); - } - else if (curlen != 0) - { - if (curlen != prevlen) - { - send_code(curlen, bl_tree); count--; - } - send_code(REP_3_6, bl_tree); - send_bits(count - 3, 2); - } - else if (count <= 10) - { - send_code(REPZ_3_10, bl_tree); - send_bits(count - 3, 3); - } - else - { - send_code(REPZ_11_138, bl_tree); - send_bits(count - 11, 7); - } - count = 0; prevlen = curlen; - if (nextlen == 0) - { - max_count = 138; min_count = 3; - } - else if (curlen == nextlen) - { - max_count = 6; min_count = 3; - } - else - { - max_count = 7; min_count = 4; - } - } - } - - // Output a byte on the stream. - // IN assertion: there is enough room in pending_buf. - internal void put_byte(byte[] p, int start, int len) - { - Array.Copy(p, start, pending_buf, pending, len); - pending += len; - } - - internal void put_byte(byte c) - { - pending_buf[pending++] = c; - } - internal void put_short(int w) - { - put_byte((byte) (w)); - put_byte((byte) (SupportClass.URShift(w, 8))); - } - internal void putShortMSB(int b) - { - put_byte((byte) (b >> 8)); - put_byte((byte) (b)); - } - - internal void send_code(int c, short[] tree) - { - send_bits((tree[c * 2] & 0xffff), (tree[c * 2 + 1] & 0xffff)); - } - - internal void send_bits(int value_Renamed, int length) - { - int len = length; - if (bi_valid > (int) Buf_size - len) - { - int val = value_Renamed; - // bi_buf |= (val << bi_valid); - bi_buf = (short) ((ushort) bi_buf | (ushort) (((val << bi_valid) & 0xffff))); - put_short(bi_buf); - bi_buf = (short) (SupportClass.URShift(val, (Buf_size - bi_valid))); - bi_valid += len - Buf_size; - } - else - { - // bi_buf |= (value) << bi_valid; - bi_buf = (short)((ushort)bi_buf | (ushort)((((value_Renamed) << bi_valid) & 0xffff))); - bi_valid += len; - } - } - - // Send one empty static block to give enough lookahead for inflate. - // This takes 10 bits, of which 7 may remain in the bit buffer. - // The current inflate code requires 9 bits of lookahead. If the - // last two codes for the previous block (real code plus EOB) were coded - // on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode - // the last real code. In this case we send two empty static blocks instead - // of one. (There are no problems if the previous block is stored or fixed.) - // To simplify the code, we assume the worst case of last real code encoded - // on one bit only. - internal void _tr_align() - { - send_bits(STATIC_TREES << 1, 3); - send_code(END_BLOCK, StaticTree.static_ltree); - - bi_flush(); - - // Of the 10 bits for the empty block, we have already sent - // (10 - bi_valid) bits. The lookahead for the last real code (before - // the EOB of the previous block) was thus at least one plus the length - // of the EOB plus what we have just sent of the empty static block. - if (1 + last_eob_len + 10 - bi_valid < 9) - { - send_bits(STATIC_TREES << 1, 3); - send_code(END_BLOCK, StaticTree.static_ltree); - bi_flush(); - } - last_eob_len = 7; - } - - - // Save the match info and tally the frequency counts. Return true if - // the current block must be flushed. - internal bool _tr_tally(int dist, int lc) - { - - pending_buf[d_buf + last_lit * 2] = (byte) (SupportClass.URShift(dist, 8)); - pending_buf[d_buf + last_lit * 2 + 1] = (byte) dist; - - pending_buf[l_buf + last_lit] = (byte) lc; last_lit++; - - if (dist == 0) - { - // lc is the unmatched char - dyn_ltree[lc * 2]++; - } - else - { - matches++; - // Here, lc is the match length - MIN_MATCH - dist--; // dist = match distance - 1 - dyn_ltree[(Tree._length_code[lc] + LITERALS + 1) * 2]++; - dyn_dtree[Tree.d_code(dist) * 2]++; - } - - if ((last_lit & 0x1fff) == 0 && level > 2) - { - // Compute an upper bound for the compressed length - int out_length = last_lit * 8; - int in_length = strstart - block_start; - int dcode; - for (dcode = 0; dcode < D_CODES; dcode++) - { - out_length = (int) (out_length + (int) dyn_dtree[dcode * 2] * (5L + Tree.extra_dbits[dcode])); - } - out_length = SupportClass.URShift(out_length, 3); - if ((matches < (last_lit / 2)) && out_length < in_length / 2) - return true; - } - - return (last_lit == lit_bufsize - 1); - // We avoid equality with lit_bufsize because of wraparound at 64K - // on 16 bit machines and because stored blocks are restricted to - // 64K-1 bytes. - } - - // Send the block data compressed using the given Huffman trees - internal void compress_block(short[] ltree, short[] dtree) - { - int dist; // distance of matched string - int lc; // match length or unmatched char (if dist == 0) - int lx = 0; // running index in l_buf - int code; // the code to send - int extra; // number of extra bits to send - - if (last_lit != 0) - { - do - { - dist = ((pending_buf[d_buf + lx * 2] << 8) & 0xff00) | (pending_buf[d_buf + lx * 2 + 1] & 0xff); - lc = (pending_buf[l_buf + lx]) & 0xff; lx++; - - if (dist == 0) - { - send_code(lc, ltree); // send a literal byte - } - else - { - // Here, lc is the match length - MIN_MATCH - code = Tree._length_code[lc]; - - send_code(code + LITERALS + 1, ltree); // send the length code - extra = Tree.extra_lbits[code]; - if (extra != 0) - { - lc -= Tree.base_length[code]; - send_bits(lc, extra); // send the extra length bits - } - dist--; // dist is now the match distance - 1 - code = Tree.d_code(dist); - - send_code(code, dtree); // send the distance code - extra = Tree.extra_dbits[code]; - if (extra != 0) - { - dist -= Tree.base_dist[code]; - send_bits(dist, extra); // send the extra distance bits - } - } // literal or match pair ? - - // Check that the overlay between pending_buf and d_buf+l_buf is ok: - } - while (lx < last_lit); - } - - send_code(END_BLOCK, ltree); - last_eob_len = ltree[END_BLOCK * 2 + 1]; - } - - // Set the data type to ASCII or BINARY, using a crude approximation: - // binary if more than 20% of the bytes are <= 6 or >= 128, ascii otherwise. - // IN assertion: the fields freq of dyn_ltree are set and the total of all - // frequencies does not exceed 64K (to fit in an int on 16 bit machines). - internal void set_data_type() - { - int n = 0; - int ascii_freq = 0; - int bin_freq = 0; - while (n < 7) - { - bin_freq += dyn_ltree[n * 2]; n++; - } - while (n < 128) - { - ascii_freq += dyn_ltree[n * 2]; n++; - } - while (n < LITERALS) - { - bin_freq += dyn_ltree[n * 2]; n++; - } - data_type = (byte) (bin_freq > (SupportClass.URShift(ascii_freq, 2))?Z_BINARY:Z_ASCII); - } - - // Flush the bit buffer, keeping at most 7 bits in it. - internal void bi_flush() - { - if (bi_valid == 16) - { - put_short(bi_buf); - bi_buf = 0; - bi_valid = 0; - } - else if (bi_valid >= 8) - { - put_byte((byte) bi_buf); - bi_buf = (short) (SupportClass.URShift(bi_buf, 8)); - bi_valid -= 8; - } - } - - // Flush the bit buffer and align the output on a byte boundary - internal void bi_windup() - { - if (bi_valid > 8) - { - put_short(bi_buf); - } - else if (bi_valid > 0) - { - put_byte((byte) bi_buf); - } - bi_buf = 0; - bi_valid = 0; - } - - // Copy a stored block, storing first the length and its - // one's complement if requested. - internal void copy_block(int buf, int len, bool header) - { - - bi_windup(); // align on byte boundary - last_eob_len = 8; // enough lookahead for inflate - - if (header) - { - put_short((short) len); - put_short((short) ~ len); - } - - // while(len--!=0) { - // put_byte(window[buf+index]); - // index++; - // } - put_byte(window, buf, len); - } - - internal void flush_block_only(bool eof) - { - _tr_flush_block(block_start >= 0?block_start:- 1, strstart - block_start, eof); - block_start = strstart; - strm.flush_pending(); - } - - // Copy without compression as much as possible from the input stream, return - // the current block state. - // This function does not insert new strings in the dictionary since - // uncompressible data is probably not useful. This function is used - // only for the level=0 compression option. - // NOTE: this function should be optimized to avoid extra copying from - // window to pending_buf. - internal int deflate_stored(int flush) - { - // Stored blocks are limited to 0xffff bytes, pending_buf is limited - // to pending_buf_size, and each stored block has a 5 byte header: - - int max_block_size = 0xffff; - int max_start; - - if (max_block_size > pending_buf_size - 5) - { - max_block_size = pending_buf_size - 5; - } - - // Copy as much as possible from input to output: - while (true) - { - // Fill the window as much as possible: - if (lookahead <= 1) - { - fill_window(); - if (lookahead == 0 && flush == Z_NO_FLUSH) - return NeedMore; - if (lookahead == 0) - break; // flush the current block - } - - strstart += lookahead; - lookahead = 0; - - // Emit a stored block if pending_buf will be full: - max_start = block_start + max_block_size; - if (strstart == 0 || strstart >= max_start) - { - // strstart == 0 is possible when wraparound on 16-bit machine - lookahead = (int) (strstart - max_start); - strstart = (int) max_start; - - flush_block_only(false); - if (strm.avail_out == 0) - return NeedMore; - } - - // Flush if we may have to slide, otherwise block_start may become - // negative and the data will be gone: - if (strstart - block_start >= w_size - MIN_LOOKAHEAD) - { - flush_block_only(false); - if (strm.avail_out == 0) - return NeedMore; - } - } - - flush_block_only(flush == Z_FINISH); - if (strm.avail_out == 0) - return (flush == Z_FINISH)?FinishStarted:NeedMore; - - return flush == Z_FINISH?FinishDone:BlockDone; - } - - // Send a stored block - internal void _tr_stored_block(int buf, int stored_len, bool eof) - { - send_bits((STORED_BLOCK << 1) + (eof?1:0), 3); // send block type - copy_block(buf, stored_len, true); // with header - } - - // Determine the best encoding for the current block: dynamic trees, static - // trees or store, and output the encoded block to the zip file. - internal void _tr_flush_block(int buf, int stored_len, bool eof) - { - int opt_lenb, static_lenb; // opt_len and static_len in bytes - int max_blindex = 0; // index of last bit length code of non zero freq - - // Build the Huffman trees unless a stored block is forced - if (level > 0) - { - // Check if the file is ascii or binary - if (data_type == Z_UNKNOWN) - set_data_type(); - - // Construct the literal and distance trees - l_desc.build_tree(this); - - d_desc.build_tree(this); - - // At this point, opt_len and static_len are the total bit lengths of - // the compressed block data, excluding the tree representations. - - // Build the bit length tree for the above two trees, and get the index - // in bl_order of the last bit length code to send. - max_blindex = build_bl_tree(); - - // Determine the best encoding. Compute first the block length in bytes - opt_lenb = SupportClass.URShift((opt_len + 3 + 7), 3); - static_lenb = SupportClass.URShift((static_len + 3 + 7), 3); - - if (static_lenb <= opt_lenb) - opt_lenb = static_lenb; - } - else - { - opt_lenb = static_lenb = stored_len + 5; // force a stored block - } - - if (stored_len + 4 <= opt_lenb && buf != - 1) - { - // 4: two words for the lengths - // The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - // Otherwise we can't have processed more than WSIZE input bytes since - // the last block flush, because compression would have been - // successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - // transform a block into a stored block. - _tr_stored_block(buf, stored_len, eof); - } - else if (static_lenb == opt_lenb) - { - send_bits((STATIC_TREES << 1) + (eof?1:0), 3); - compress_block(StaticTree.static_ltree, StaticTree.static_dtree); - } - else - { - send_bits((DYN_TREES << 1) + (eof?1:0), 3); - send_all_trees(l_desc.max_code + 1, d_desc.max_code + 1, max_blindex + 1); - compress_block(dyn_ltree, dyn_dtree); - } - - // The above check is made mod 2^32, for files larger than 512 MB - // and uLong implemented on 32 bits. - - init_block(); - - if (eof) - { - bi_windup(); - } - } - - // Fill the window when the lookahead becomes insufficient. - // Updates strstart and lookahead. - // - // IN assertion: lookahead < MIN_LOOKAHEAD - // OUT assertions: strstart <= window_size-MIN_LOOKAHEAD - // At least one byte has been read, or avail_in == 0; reads are - // performed for at least two bytes (required for the zip translate_eol - // option -- not supported here). - internal void fill_window() - { - int n, m; - int p; - int more; // Amount of free space at the end of the window. - - do - { - more = (window_size - lookahead - strstart); - - // Deal with !@#$% 64K limit: - if (more == 0 && strstart == 0 && lookahead == 0) - { - more = w_size; - } - else if (more == - 1) - { - // Very unlikely, but possible on 16 bit machine if strstart == 0 - // and lookahead == 1 (input done one byte at time) - more--; - - // If the window is almost full and there is insufficient lookahead, - // move the upper half to the lower one to make room in the upper half. - } - else if (strstart >= w_size + w_size - MIN_LOOKAHEAD) - { - Array.Copy(window, w_size, window, 0, w_size); - match_start -= w_size; - strstart -= w_size; // we now have strstart >= MAX_DIST - block_start -= w_size; - - // Slide the hash table (could be avoided with 32 bit values - // at the expense of memory usage). We slide even when level == 0 - // to keep the hash table consistent if we switch back to level > 0 - // later. (Using level 0 permanently is not an optimal usage of - // zlib, so we don't care about this pathological case.) - - n = hash_size; - p = n; - do - { - m = (head[--p] & 0xffff); - head[p] = (short)(m >= w_size?(m - w_size):0); - //head[p] = (m >= w_size?(short) (m - w_size):0); - } - while (--n != 0); - - n = w_size; - p = n; - do - { - m = (prev[--p] & 0xffff); - prev[p] = (short)(m >= w_size?(m - w_size):0); - //prev[p] = (m >= w_size?(short) (m - w_size):0); - // If n is not on any hash chain, prev[n] is garbage but - // its value will never be used. - } - while (--n != 0); - more += w_size; - } - - if (strm.avail_in == 0) - return ; - - // If there was no sliding: - // strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 && - // more == window_size - lookahead - strstart - // => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1) - // => more >= window_size - 2*WSIZE + 2 - // In the BIG_MEM or MMAP case (not yet supported), - // window_size == input_size + MIN_LOOKAHEAD && - // strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD. - // Otherwise, window_size == 2*WSIZE so more >= 2. - // If there was sliding, more >= WSIZE. So in all cases, more >= 2. - - n = strm.read_buf(window, strstart + lookahead, more); - lookahead += n; - - // Initialize the hash value now that we have some input: - if (lookahead >= MIN_MATCH) - { - ins_h = window[strstart] & 0xff; - ins_h = (((ins_h) << hash_shift) ^ (window[strstart + 1] & 0xff)) & hash_mask; - } - // If the whole input has less than MIN_MATCH bytes, ins_h is garbage, - // but this is not important since only literal bytes will be emitted. - } - while (lookahead < MIN_LOOKAHEAD && strm.avail_in != 0); - } - - // Compress as much as possible from the input stream, return the current - // block state. - // This function does not perform lazy evaluation of matches and inserts - // new strings in the dictionary only for unmatched strings or for short - // matches. It is used only for the fast compression options. - internal int deflate_fast(int flush) - { - // short hash_head = 0; // head of the hash chain - int hash_head = 0; // head of the hash chain - bool bflush; // set if current block must be flushed - - while (true) - { - // Make sure that we always have enough lookahead, except - // at the end of the input file. We need MAX_MATCH bytes - // for the next match, plus MIN_MATCH bytes to insert the - // string following the next match. - if (lookahead < MIN_LOOKAHEAD) - { - fill_window(); - if (lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) - { - return NeedMore; - } - if (lookahead == 0) - break; // flush the current block - } - - // Insert the string window[strstart .. strstart+2] in the - // dictionary, and set hash_head to the head of the hash chain: - if (lookahead >= MIN_MATCH) - { - ins_h = (((ins_h) << hash_shift) ^ (window[(strstart) + (MIN_MATCH - 1)] & 0xff)) & hash_mask; - - // prev[strstart&w_mask]=hash_head=head[ins_h]; - hash_head = (head[ins_h] & 0xffff); - prev[strstart & w_mask] = head[ins_h]; - head[ins_h] = (short) strstart; - } - - // Find the longest match, discarding those <= prev_length. - // At this point we have always match_length < MIN_MATCH - - if (hash_head != 0L && ((strstart - hash_head) & 0xffff) <= w_size - MIN_LOOKAHEAD) - { - // To simplify the code, we prevent matches with the string - // of window index 0 (in particular we have to avoid a match - // of the string with itself at the start of the input file). - if (strategy != Z_HUFFMAN_ONLY) - { - match_length = longest_match(hash_head); - } - // longest_match() sets match_start - } - if (match_length >= MIN_MATCH) - { - // check_match(strstart, match_start, match_length); - - bflush = _tr_tally(strstart - match_start, match_length - MIN_MATCH); - - lookahead -= match_length; - - // Insert new strings in the hash table only if the match length - // is not too large. This saves time but degrades compression. - if (match_length <= max_lazy_match && lookahead >= MIN_MATCH) - { - match_length--; // string at strstart already in hash table - do - { - strstart++; - - ins_h = ((ins_h << hash_shift) ^ (window[(strstart) + (MIN_MATCH - 1)] & 0xff)) & hash_mask; - // prev[strstart&w_mask]=hash_head=head[ins_h]; - hash_head = (head[ins_h] & 0xffff); - prev[strstart & w_mask] = head[ins_h]; - head[ins_h] = (short) strstart; - - // strstart never exceeds WSIZE-MAX_MATCH, so there are - // always MIN_MATCH bytes ahead. - } - while (--match_length != 0); - strstart++; - } - else - { - strstart += match_length; - match_length = 0; - ins_h = window[strstart] & 0xff; - - ins_h = (((ins_h) << hash_shift) ^ (window[strstart + 1] & 0xff)) & hash_mask; - // If lookahead < MIN_MATCH, ins_h is garbage, but it does not - // matter since it will be recomputed at next deflate call. - } - } - else - { - // No match, output a literal byte - - bflush = _tr_tally(0, window[strstart] & 0xff); - lookahead--; - strstart++; - } - if (bflush) - { - - flush_block_only(false); - if (strm.avail_out == 0) - return NeedMore; - } - } - - flush_block_only(flush == Z_FINISH); - if (strm.avail_out == 0) - { - if (flush == Z_FINISH) - return FinishStarted; - else - return NeedMore; - } - return flush == Z_FINISH?FinishDone:BlockDone; - } - - // Same as above, but achieves better compression. We use a lazy - // evaluation for matches: a match is finally adopted only if there is - // no better match at the next window position. - internal int deflate_slow(int flush) - { - // short hash_head = 0; // head of hash chain - int hash_head = 0; // head of hash chain - bool bflush; // set if current block must be flushed - - // Process the input block. - while (true) - { - // Make sure that we always have enough lookahead, except - // at the end of the input file. We need MAX_MATCH bytes - // for the next match, plus MIN_MATCH bytes to insert the - // string following the next match. - - if (lookahead < MIN_LOOKAHEAD) - { - fill_window(); - if (lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) - { - return NeedMore; - } - if (lookahead == 0) - break; // flush the current block - } - - // Insert the string window[strstart .. strstart+2] in the - // dictionary, and set hash_head to the head of the hash chain: - - if (lookahead >= MIN_MATCH) - { - ins_h = (((ins_h) << hash_shift) ^ (window[(strstart) + (MIN_MATCH - 1)] & 0xff)) & hash_mask; - // prev[strstart&w_mask]=hash_head=head[ins_h]; - hash_head = (head[ins_h] & 0xffff); - prev[strstart & w_mask] = head[ins_h]; - head[ins_h] = (short) strstart; - } - - // Find the longest match, discarding those <= prev_length. - prev_length = match_length; prev_match = match_start; - match_length = MIN_MATCH - 1; - - if (hash_head != 0 && prev_length < max_lazy_match && ((strstart - hash_head) & 0xffff) <= w_size - MIN_LOOKAHEAD) - { - // To simplify the code, we prevent matches with the string - // of window index 0 (in particular we have to avoid a match - // of the string with itself at the start of the input file). - - if (strategy != Z_HUFFMAN_ONLY) - { - match_length = longest_match(hash_head); - } - // longest_match() sets match_start - - if (match_length <= 5 && (strategy == Z_FILTERED || (match_length == MIN_MATCH && strstart - match_start > 4096))) - { - - // If prev_match is also MIN_MATCH, match_start is garbage - // but we will ignore the current match anyway. - match_length = MIN_MATCH - 1; - } - } - - // If there was a match at the previous step and the current - // match is not better, output the previous match: - if (prev_length >= MIN_MATCH && match_length <= prev_length) - { - int max_insert = strstart + lookahead - MIN_MATCH; - // Do not insert strings in hash table beyond this. - - // check_match(strstart-1, prev_match, prev_length); - - bflush = _tr_tally(strstart - 1 - prev_match, prev_length - MIN_MATCH); - - // Insert in hash table all strings up to the end of the match. - // strstart-1 and strstart are already inserted. If there is not - // enough lookahead, the last two strings are not inserted in - // the hash table. - lookahead -= (prev_length - 1); - prev_length -= 2; - do - { - if (++strstart <= max_insert) - { - ins_h = (((ins_h) << hash_shift) ^ (window[(strstart) + (MIN_MATCH - 1)] & 0xff)) & hash_mask; - //prev[strstart&w_mask]=hash_head=head[ins_h]; - hash_head = (head[ins_h] & 0xffff); - prev[strstart & w_mask] = head[ins_h]; - head[ins_h] = (short) strstart; - } - } - while (--prev_length != 0); - match_available = 0; - match_length = MIN_MATCH - 1; - strstart++; - - if (bflush) - { - flush_block_only(false); - if (strm.avail_out == 0) - return NeedMore; - } - } - else if (match_available != 0) - { - - // If there was no match at the previous position, output a - // single literal. If there was a match but the current match - // is longer, truncate the previous match to a single literal. - - bflush = _tr_tally(0, window[strstart - 1] & 0xff); - - if (bflush) - { - flush_block_only(false); - } - strstart++; - lookahead--; - if (strm.avail_out == 0) - return NeedMore; - } - else - { - // There is no previous match to compare with, wait for - // the next step to decide. - - match_available = 1; - strstart++; - lookahead--; - } - } - - if (match_available != 0) - { - bflush = _tr_tally(0, window[strstart - 1] & 0xff); - match_available = 0; - } - flush_block_only(flush == Z_FINISH); - - if (strm.avail_out == 0) - { - if (flush == Z_FINISH) - return FinishStarted; - else - return NeedMore; - } - - return flush == Z_FINISH?FinishDone:BlockDone; - } - - internal int longest_match(int cur_match) - { - int chain_length = max_chain_length; // max hash chain length - int scan = strstart; // current string - int match; // matched string - int len; // length of current match - int best_len = prev_length; // best match length so far - int limit = strstart > (w_size - MIN_LOOKAHEAD)?strstart - (w_size - MIN_LOOKAHEAD):0; - int nice_match = this.nice_match; - - // Stop when cur_match becomes <= limit. To simplify the code, - // we prevent matches with the string of window index 0. - - int wmask = w_mask; - - int strend = strstart + MAX_MATCH; - byte scan_end1 = window[scan + best_len - 1]; - byte scan_end = window[scan + best_len]; - - // The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16. - // It is easy to get rid of this optimization if necessary. - - // Do not waste too much time if we already have a good match: - if (prev_length >= good_match) - { - chain_length >>= 2; - } - - // Do not look for matches beyond the end of the input. This is necessary - // to make deflate deterministic. - if (nice_match > lookahead) - nice_match = lookahead; - - do - { - match = cur_match; - - // Skip to next match if the match length cannot increase - // or if the match length is less than 2: - if (window[match + best_len] != scan_end || window[match + best_len - 1] != scan_end1 || window[match] != window[scan] || window[++match] != window[scan + 1]) - continue; - - // The check at best_len-1 can be removed because it will be made - // again later. (This heuristic is not always a win.) - // It is not necessary to compare scan[2] and match[2] since they - // are always equal when the other bytes match, given that - // the hash keys are equal and that HASH_BITS >= 8. - scan += 2; match++; - - // We check for insufficient lookahead only every 8th comparison; - // the 256th check will be made at strstart+258. - do - { - } - while (window[++scan] == window[++match] && window[++scan] == window[++match] && window[++scan] == window[++match] && window[++scan] == window[++match] && window[++scan] == window[++match] && window[++scan] == window[++match] && window[++scan] == window[++match] && window[++scan] == window[++match] && scan < strend); - - len = MAX_MATCH - (int) (strend - scan); - scan = strend - MAX_MATCH; - - if (len > best_len) - { - match_start = cur_match; - best_len = len; - if (len >= nice_match) - break; - scan_end1 = window[scan + best_len - 1]; - scan_end = window[scan + best_len]; - } - } - while ((cur_match = (prev[cur_match & wmask] & 0xffff)) > limit && --chain_length != 0); - - if (best_len <= lookahead) - return best_len; - return lookahead; - } - - internal int deflateInit(ZStream strm, int level, int bits) - { - return deflateInit2(strm, level, Z_DEFLATED, bits, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY); - } - internal int deflateInit(ZStream strm, int level) - { - return deflateInit(strm, level, MAX_WBITS); - } - internal int deflateInit2(ZStream strm, int level, int method, int windowBits, int memLevel, int strategy) - { - int noheader = 0; - // byte[] my_version=ZLIB_VERSION; - - // - // if (version == null || version[0] != my_version[0] - // || stream_size != sizeof(z_stream)) { - // return Z_VERSION_ERROR; - // } - - strm.msg = null; - - if (level == Z_DEFAULT_COMPRESSION) - level = 6; - - if (windowBits < 0) - { - // undocumented feature: suppress zlib header - noheader = 1; - windowBits = - windowBits; - } - - if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED || windowBits < 9 || windowBits > 15 || level < 0 || level > 9 || strategy < 0 || strategy > Z_HUFFMAN_ONLY) - { - return Z_STREAM_ERROR; - } - - strm.dstate = (Deflate) this; - - this.noheader = noheader; - w_bits = windowBits; - w_size = 1 << w_bits; - w_mask = w_size - 1; - - hash_bits = memLevel + 7; - hash_size = 1 << hash_bits; - hash_mask = hash_size - 1; - hash_shift = ((hash_bits + MIN_MATCH - 1) / MIN_MATCH); - - window = new byte[w_size * 2]; - prev = new short[w_size]; - head = new short[hash_size]; - - lit_bufsize = 1 << (memLevel + 6); // 16K elements by default - - // We overlay pending_buf and d_buf+l_buf. This works since the average - // output size for (length,distance) codes is <= 24 bits. - pending_buf = new byte[lit_bufsize * 4]; - pending_buf_size = lit_bufsize * 4; - - d_buf = lit_bufsize / 2; - l_buf = (1 + 2) * lit_bufsize; - - this.level = level; - - //System.out.println("level="+level); - - this.strategy = strategy; - this.method = (byte) method; - - return deflateReset(strm); - } - - internal int deflateReset(ZStream strm) - { - strm.total_in = strm.total_out = 0; - strm.msg = null; // - strm.data_type = Z_UNKNOWN; - - pending = 0; - pending_out = 0; - - if (noheader < 0) - { - noheader = 0; // was set to -1 by deflate(..., Z_FINISH); - } - status = (noheader != 0)?BUSY_STATE:INIT_STATE; - strm.adler = strm._adler.adler32(0, null, 0, 0); - - last_flush = Z_NO_FLUSH; - - tr_init(); - lm_init(); - return Z_OK; - } - - internal int deflateEnd() - { - if (status != INIT_STATE && status != BUSY_STATE && status != FINISH_STATE) - { - return Z_STREAM_ERROR; - } - // Deallocate in reverse order of allocations: - pending_buf = null; - head = null; - prev = null; - window = null; - // free - // dstate=null; - return status == BUSY_STATE?Z_DATA_ERROR:Z_OK; - } - - internal int deflateParams(ZStream strm, int _level, int _strategy) - { - int err = Z_OK; - - if (_level == Z_DEFAULT_COMPRESSION) - { - _level = 6; - } - if (_level < 0 || _level > 9 || _strategy < 0 || _strategy > Z_HUFFMAN_ONLY) - { - return Z_STREAM_ERROR; - } - - if (config_table[level].func != config_table[_level].func && strm.total_in != 0) - { - // Flush the last buffer: - err = strm.deflate(Z_PARTIAL_FLUSH); - } - - if (level != _level) - { - level = _level; - max_lazy_match = config_table[level].max_lazy; - good_match = config_table[level].good_length; - nice_match = config_table[level].nice_length; - max_chain_length = config_table[level].max_chain; - } - strategy = _strategy; - return err; - } - - internal int deflateSetDictionary(ZStream strm, byte[] dictionary, int dictLength) - { - int length = dictLength; - int index = 0; - - if (dictionary == null || status != INIT_STATE) - return Z_STREAM_ERROR; - - strm.adler = strm._adler.adler32(strm.adler, dictionary, 0, dictLength); - - if (length < MIN_MATCH) - return Z_OK; - if (length > w_size - MIN_LOOKAHEAD) - { - length = w_size - MIN_LOOKAHEAD; - index = dictLength - length; // use the tail of the dictionary - } - Array.Copy(dictionary, index, window, 0, length); - strstart = length; - block_start = length; - - // Insert all strings in the hash table (except for the last two bytes). - // s->lookahead stays null, so s->ins_h will be recomputed at the next - // call of fill_window. - - ins_h = window[0] & 0xff; - ins_h = (((ins_h) << hash_shift) ^ (window[1] & 0xff)) & hash_mask; - - for (int n = 0; n <= length - MIN_MATCH; n++) - { - ins_h = (((ins_h) << hash_shift) ^ (window[(n) + (MIN_MATCH - 1)] & 0xff)) & hash_mask; - prev[n & w_mask] = head[ins_h]; - head[ins_h] = (short) n; - } - return Z_OK; - } - - internal int deflate(ZStream strm, int flush) - { - int old_flush; - - if (flush > Z_FINISH || flush < 0) - { - return Z_STREAM_ERROR; - } - - if (strm.next_out == null || (strm.next_in == null && strm.avail_in != 0) || (status == FINISH_STATE && flush != Z_FINISH)) - { - strm.msg = z_errmsg[Z_NEED_DICT - (Z_STREAM_ERROR)]; - return Z_STREAM_ERROR; - } - if (strm.avail_out == 0) - { - strm.msg = z_errmsg[Z_NEED_DICT - (Z_BUF_ERROR)]; - return Z_BUF_ERROR; - } - - this.strm = strm; // just in case - old_flush = last_flush; - last_flush = flush; - - // Write the zlib header - if (status == INIT_STATE) - { - int header = (Z_DEFLATED + ((w_bits - 8) << 4)) << 8; - int level_flags = ((level - 1) & 0xff) >> 1; - - if (level_flags > 3) - level_flags = 3; - header |= (level_flags << 6); - if (strstart != 0) - header |= PRESET_DICT; - header += 31 - (header % 31); - - status = BUSY_STATE; - putShortMSB(header); - - - // Save the adler32 of the preset dictionary: - if (strstart != 0) - { - putShortMSB((int) (SupportClass.URShift(strm.adler, 16))); - putShortMSB((int) (strm.adler & 0xffff)); - } - strm.adler = strm._adler.adler32(0, null, 0, 0); - } - - // Flush as much pending output as possible - if (pending != 0) - { - strm.flush_pending(); - if (strm.avail_out == 0) - { - //System.out.println(" avail_out==0"); - // Since avail_out is 0, deflate will be called again with - // more output space, but possibly with both pending and - // avail_in equal to zero. There won't be anything to do, - // but this is not an error situation so make sure we - // return OK instead of BUF_ERROR at next call of deflate: - last_flush = - 1; - return Z_OK; - } - - // Make sure there is something to do and avoid duplicate consecutive - // flushes. For repeated and useless calls with Z_FINISH, we keep - // returning Z_STREAM_END instead of Z_BUFF_ERROR. - } - else if (strm.avail_in == 0 && flush <= old_flush && flush != Z_FINISH) - { - strm.msg = z_errmsg[Z_NEED_DICT - (Z_BUF_ERROR)]; - return Z_BUF_ERROR; - } - - // User must not provide more input after the first FINISH: - if (status == FINISH_STATE && strm.avail_in != 0) - { - strm.msg = z_errmsg[Z_NEED_DICT - (Z_BUF_ERROR)]; - return Z_BUF_ERROR; - } - - // Start a new block or continue the current one. - if (strm.avail_in != 0 || lookahead != 0 || (flush != Z_NO_FLUSH && status != FINISH_STATE)) - { - int bstate = - 1; - switch (config_table[level].func) - { - - case STORED: - bstate = deflate_stored(flush); - break; - - case FAST: - bstate = deflate_fast(flush); - break; - - case SLOW: - bstate = deflate_slow(flush); - break; - - default: - break; - - } - - if (bstate == FinishStarted || bstate == FinishDone) - { - status = FINISH_STATE; - } - if (bstate == NeedMore || bstate == FinishStarted) - { - if (strm.avail_out == 0) - { - last_flush = - 1; // avoid BUF_ERROR next call, see above - } - return Z_OK; - // If flush != Z_NO_FLUSH && avail_out == 0, the next call - // of deflate should use the same flush parameter to make sure - // that the flush is complete. So we don't have to output an - // empty block here, this will be done at next call. This also - // ensures that for a very small output buffer, we emit at most - // one empty block. - } - - if (bstate == BlockDone) - { - if (flush == Z_PARTIAL_FLUSH) - { - _tr_align(); - } - else - { - // FULL_FLUSH or SYNC_FLUSH - _tr_stored_block(0, 0, false); - // For a full flush, this empty block will be recognized - // as a special marker by inflate_sync(). - if (flush == Z_FULL_FLUSH) - { - //state.head[s.hash_size-1]=0; - for (int i = 0; i < hash_size; i++) - // forget history - head[i] = 0; - } - } - strm.flush_pending(); - if (strm.avail_out == 0) - { - last_flush = - 1; // avoid BUF_ERROR at next call, see above - return Z_OK; - } - } - } - - if (flush != Z_FINISH) - return Z_OK; - if (noheader != 0) - return Z_STREAM_END; - - // Write the zlib trailer (adler32) - putShortMSB((int) (SupportClass.URShift(strm.adler, 16))); - putShortMSB((int) (strm.adler & 0xffff)); - strm.flush_pending(); - - // If avail_out is zero, the application will call deflate again - // to flush the rest. - noheader = - 1; // write the trailer only once! - return pending != 0?Z_OK:Z_STREAM_END; - } - static Deflate() - { - { - config_table = new Config[10]; - // good lazy nice chain - config_table[0] = new Config(0, 0, 0, 0, STORED); - config_table[1] = new Config(4, 4, 8, 4, FAST); - config_table[2] = new Config(4, 5, 16, 8, FAST); - config_table[3] = new Config(4, 6, 32, 32, FAST); - - config_table[4] = new Config(4, 4, 16, 16, SLOW); - config_table[5] = new Config(8, 16, 32, 32, SLOW); - config_table[6] = new Config(8, 16, 128, 128, SLOW); - config_table[7] = new Config(8, 32, 128, 256, SLOW); - config_table[8] = new Config(32, 128, 258, 1024, SLOW); - config_table[9] = new Config(32, 258, 258, 4096, SLOW); - } - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data/zlib/InfBlocks.cs b/Source/MySql.Data/zlib/InfBlocks.cs deleted file mode 100644 index 251589f4b..000000000 --- a/Source/MySql.Data/zlib/InfBlocks.cs +++ /dev/null @@ -1,720 +0,0 @@ -// Copyright (c) 2006, ComponentAce -// http://www.componentace.com -// 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 ComponentAce 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. - -/* -Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. - -2. 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. - -3. The names of the authors may not be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 JCRAFT, -INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE 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. -*/ -/* -* This program is based on zlib-1.1.3, so all credit should go authors -* Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) -* and contributors of zlib. -*/ -using System; -namespace zlib -{ - - sealed class InfBlocks - { - private const int MANY = 1440; - - // And'ing with mask[n] masks the lower n bits - private static readonly int[] inflate_mask = new int[]{0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff}; - - // Table for deflate from PKZIP's appnote.txt. - internal static readonly int[] border = new int[]{16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - - private const int Z_OK = 0; - private const int Z_STREAM_END = 1; - private const int Z_NEED_DICT = 2; - private const int Z_ERRNO = - 1; - private const int Z_STREAM_ERROR = - 2; - private const int Z_DATA_ERROR = - 3; - private const int Z_MEM_ERROR = - 4; - private const int Z_BUF_ERROR = - 5; - private const int Z_VERSION_ERROR = - 6; - - private const int TYPE = 0; // get type bits (3, including end bit) - private const int LENS = 1; // get lengths for stored - private const int STORED = 2; // processing stored block - private const int TABLE = 3; // get table lengths - private const int BTREE = 4; // get bit lengths tree for a dynamic block - private const int DTREE = 5; // get length, distance trees for a dynamic block - private const int CODES = 6; // processing fixed or dynamic block - private const int DRY = 7; // output remaining window bytes - private const int DONE = 8; // finished last block, done - private const int BAD = 9; // ot a data error--stuck here - - internal int mode; // current inflate_block mode - - internal int left; // if STORED, bytes left to copy - - internal int table; // table lengths (14 bits) - internal int index; // index into blens (or border) - internal int[] blens; // bit lengths of codes - internal int[] bb = new int[1]; // bit length tree depth - internal int[] tb = new int[1]; // bit length decoding tree - - internal InfCodes codes; // if CODES, current state - - internal int last; // true if this block is the last block - - // mode independent information - internal int bitk; // bits in bit buffer - internal int bitb; // bit buffer - internal int[] hufts; // single malloc for tree space - internal byte[] window; // sliding window - internal int end; // one byte after sliding window - internal int read; // window read pointer - internal int write; // window write pointer - internal System.Object checkfn; // check function - internal long check; // check on output - - internal InfBlocks(ZStream z, System.Object checkfn, int w) - { - hufts = new int[MANY * 3]; - window = new byte[w]; - end = w; - this.checkfn = checkfn; - mode = TYPE; - reset(z, null); - } - - internal void reset(ZStream z, long[] c) - { - if (c != null) - c[0] = check; - if (mode == BTREE || mode == DTREE) - { - blens = null; - } - if (mode == CODES) - { - codes.free(z); - } - mode = TYPE; - bitk = 0; - bitb = 0; - read = write = 0; - - if (checkfn != null) - z.adler = check = z._adler.adler32(0L, null, 0, 0); - } - - internal int proc(ZStream z, int r) - { - int t; // temporary storage - int b; // bit buffer - int k; // bits in bit buffer - int p; // input data pointer - int n; // bytes available there - int q; // output window write pointer - int m; // bytes to end of window or read pointer - - // copy input/output information to locals (UPDATE macro restores) - { - p = z.next_in_index; n = z.avail_in; b = bitb; k = bitk; - } - { - q = write; m = (int) (q < read?read - q - 1:end - q); - } - - // process input based on current state - while (true) - { - switch (mode) - { - - case TYPE: - - while (k < (3)) - { - if (n != 0) - { - r = Z_OK; - } - else - { - bitb = b; bitk = k; - z.avail_in = n; - z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - ; - n--; - b |= (z.next_in[p++] & 0xff) << k; - k += 8; - } - t = (int) (b & 7); - last = t & 1; - - switch (SupportClass.URShift(t, 1)) - { - - case 0: // stored - { - b = SupportClass.URShift(b, (3)); k -= (3); - } - t = k & 7; // go to byte boundary - - { - b = SupportClass.URShift(b, (t)); k -= (t); - } - mode = LENS; // get length of stored block - break; - - case 1: // fixed - { - int[] bl = new int[1]; - int[] bd = new int[1]; - int[][] tl = new int[1][]; - int[][] td = new int[1][]; - - InfTree.inflate_trees_fixed(bl, bd, tl, td, z); - codes = new InfCodes(bl[0], bd[0], tl[0], td[0], z); - } - - { - b = SupportClass.URShift(b, (3)); k -= (3); - } - - mode = CODES; - break; - - case 2: // dynamic - - { - b = SupportClass.URShift(b, (3)); k -= (3); - } - - mode = TABLE; - break; - - case 3: // illegal - - { - b = SupportClass.URShift(b, (3)); k -= (3); - } - mode = BAD; - z.msg = "invalid block type"; - r = Z_DATA_ERROR; - - bitb = b; bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - break; - - case LENS: - - while (k < (32)) - { - if (n != 0) - { - r = Z_OK; - } - else - { - bitb = b; bitk = k; - z.avail_in = n; - z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - ; - n--; - b |= (z.next_in[p++] & 0xff) << k; - k += 8; - } - - if (((SupportClass.URShift((~ b), 16)) & 0xffff) != (b & 0xffff)) - { - mode = BAD; - z.msg = "invalid stored block lengths"; - r = Z_DATA_ERROR; - - bitb = b; bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - left = (b & 0xffff); - b = k = 0; // dump bits - mode = left != 0?STORED:(last != 0?DRY:TYPE); - break; - - case STORED: - if (n == 0) - { - bitb = b; bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - - if (m == 0) - { - if (q == end && read != 0) - { - q = 0; m = (int) (q < read?read - q - 1:end - q); - } - if (m == 0) - { - write = q; - r = inflate_flush(z, r); - q = write; m = (int) (q < read?read - q - 1:end - q); - if (q == end && read != 0) - { - q = 0; m = (int) (q < read?read - q - 1:end - q); - } - if (m == 0) - { - bitb = b; bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - } - } - r = Z_OK; - - t = left; - if (t > n) - t = n; - if (t > m) - t = m; - Array.Copy(z.next_in, p, window, q, t); - p += t; n -= t; - q += t; m -= t; - if ((left -= t) != 0) - break; - mode = last != 0?DRY:TYPE; - break; - - case TABLE: - - while (k < (14)) - { - if (n != 0) - { - r = Z_OK; - } - else - { - bitb = b; bitk = k; - z.avail_in = n; - z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - ; - n--; - b |= (z.next_in[p++] & 0xff) << k; - k += 8; - } - - table = t = (b & 0x3fff); - if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29) - { - mode = BAD; - z.msg = "too many length or distance symbols"; - r = Z_DATA_ERROR; - - bitb = b; bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f); - blens = new int[t]; - - { - b = SupportClass.URShift(b, (14)); k -= (14); - } - - index = 0; - mode = BTREE; - goto case BTREE; - - case BTREE: - while (index < 4 + (SupportClass.URShift(table, 10))) - { - while (k < (3)) - { - if (n != 0) - { - r = Z_OK; - } - else - { - bitb = b; bitk = k; - z.avail_in = n; - z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - ; - n--; - b |= (z.next_in[p++] & 0xff) << k; - k += 8; - } - - blens[border[index++]] = b & 7; - - { - b = SupportClass.URShift(b, (3)); k -= (3); - } - } - - while (index < 19) - { - blens[border[index++]] = 0; - } - - bb[0] = 7; - t = InfTree.inflate_trees_bits(blens, bb, tb, hufts, z); - if (t != Z_OK) - { - r = t; - if (r == Z_DATA_ERROR) - { - blens = null; - mode = BAD; - } - - bitb = b; bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - - index = 0; - mode = DTREE; - goto case DTREE; - - case DTREE: - while (true) - { - t = table; - if (!(index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f))) - { - break; - } - - - int i, j, c; - - t = bb[0]; - - while (k < (t)) - { - if (n != 0) - { - r = Z_OK; - } - else - { - bitb = b; bitk = k; - z.avail_in = n; - z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - ; - n--; - b |= (z.next_in[p++] & 0xff) << k; - k += 8; - } - - if (tb[0] == - 1) - { - //System.err.println("null..."); - } - - t = hufts[(tb[0] + (b & inflate_mask[t])) * 3 + 1]; - c = hufts[(tb[0] + (b & inflate_mask[t])) * 3 + 2]; - - if (c < 16) - { - b = SupportClass.URShift(b, (t)); k -= (t); - blens[index++] = c; - } - else - { - // c == 16..18 - i = c == 18?7:c - 14; - j = c == 18?11:3; - - while (k < (t + i)) - { - if (n != 0) - { - r = Z_OK; - } - else - { - bitb = b; bitk = k; - z.avail_in = n; - z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - ; - n--; - b |= (z.next_in[p++] & 0xff) << k; - k += 8; - } - - b = SupportClass.URShift(b, (t)); k -= (t); - - j += (b & inflate_mask[i]); - - b = SupportClass.URShift(b, (i)); k -= (i); - - i = index; - t = table; - if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) || (c == 16 && i < 1)) - { - blens = null; - mode = BAD; - z.msg = "invalid bit length repeat"; - r = Z_DATA_ERROR; - - bitb = b; bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - - c = c == 16?blens[i - 1]:0; - do - { - blens[i++] = c; - } - while (--j != 0); - index = i; - } - } - - tb[0] = - 1; - { - int[] bl = new int[1]; - int[] bd = new int[1]; - int[] tl = new int[1]; - int[] td = new int[1]; - - - bl[0] = 9; // must be <= 9 for lookahead assumptions - bd[0] = 6; // must be <= 9 for lookahead assumptions - t = table; - t = InfTree.inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f), blens, bl, bd, tl, td, hufts, z); - if (t != Z_OK) - { - if (t == Z_DATA_ERROR) - { - blens = null; - mode = BAD; - } - r = t; - - bitb = b; bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - - codes = new InfCodes(bl[0], bd[0], hufts, tl[0], hufts, td[0], z); - } - blens = null; - mode = CODES; - goto case CODES; - - case CODES: - bitb = b; bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - - if ((r = codes.proc(this, z, r)) != Z_STREAM_END) - { - return inflate_flush(z, r); - } - r = Z_OK; - codes.free(z); - - p = z.next_in_index; n = z.avail_in; b = bitb; k = bitk; - q = write; m = (int) (q < read?read - q - 1:end - q); - - if (last == 0) - { - mode = TYPE; - break; - } - mode = DRY; - goto case DRY; - - case DRY: - write = q; - r = inflate_flush(z, r); - q = write; m = (int) (q < read?read - q - 1:end - q); - if (read != write) - { - bitb = b; bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - } - mode = DONE; - goto case DONE; - - case DONE: - r = Z_STREAM_END; - - bitb = b; bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - - case BAD: - r = Z_DATA_ERROR; - - bitb = b; bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - - - default: - r = Z_STREAM_ERROR; - - bitb = b; bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - write = q; - return inflate_flush(z, r); - - } - } - } - - internal void free(ZStream z) - { - reset(z, null); - window = null; - hufts = null; - //ZFREE(z, s); - } - - internal void set_dictionary(byte[] d, int start, int n) - { - Array.Copy(d, start, window, 0, n); - read = write = n; - } - - // Returns true if inflate is currently at the end of a block generated - // by Z_SYNC_FLUSH or Z_FULL_FLUSH. - internal int sync_point() - { - return mode == LENS?1:0; - } - - // copy as much as possible from the sliding window to the output area - internal int inflate_flush(ZStream z, int r) - { - int n; - int p; - int q; - - // local copies of source and destination pointers - p = z.next_out_index; - q = read; - - // compute number of bytes to copy as far as end of window - n = (int) ((q <= write?write:end) - q); - if (n > z.avail_out) - n = z.avail_out; - if (n != 0 && r == Z_BUF_ERROR) - r = Z_OK; - - // update counters - z.avail_out -= n; - z.total_out += n; - - // update check information - if (checkfn != null) - z.adler = check = z._adler.adler32(check, window, q, n); - - // copy as far as end of window - Array.Copy(window, q, z.next_out, p, n); - p += n; - q += n; - - // see if more to copy at beginning of window - if (q == end) - { - // wrap pointers - q = 0; - if (write == end) - write = 0; - - // compute bytes to copy - n = write - q; - if (n > z.avail_out) - n = z.avail_out; - if (n != 0 && r == Z_BUF_ERROR) - r = Z_OK; - - // update counters - z.avail_out -= n; - z.total_out += n; - - // update check information - if (checkfn != null) - z.adler = check = z._adler.adler32(check, window, q, n); - - // copy - Array.Copy(window, q, z.next_out, p, n); - p += n; - q += n; - } - - // update pointers - z.next_out_index = p; - read = q; - - // done - return r; - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data/zlib/InfCodes.cs b/Source/MySql.Data/zlib/InfCodes.cs deleted file mode 100644 index d8124badd..000000000 --- a/Source/MySql.Data/zlib/InfCodes.cs +++ /dev/null @@ -1,716 +0,0 @@ -// Copyright (c) 2006, ComponentAce -// http://www.componentace.com -// 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 ComponentAce 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. - -/* -Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. - -2. 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. - -3. The names of the authors may not be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 JCRAFT, -INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE 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. -*/ -/* -* This program is based on zlib-1.1.3, so all credit should go authors -* Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) -* and contributors of zlib. -*/ -using System; -namespace zlib -{ - - sealed class InfCodes - { - - private static readonly int[] inflate_mask = new int[]{0x00000000, 0x00000001, 0x00000003, 0x00000007, 0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff}; - - private const int Z_OK = 0; - private const int Z_STREAM_END = 1; - private const int Z_NEED_DICT = 2; - private const int Z_ERRNO = - 1; - private const int Z_STREAM_ERROR = - 2; - private const int Z_DATA_ERROR = - 3; - private const int Z_MEM_ERROR = - 4; - private const int Z_BUF_ERROR = - 5; - private const int Z_VERSION_ERROR = - 6; - - // waiting for "i:"=input, - // "o:"=output, - // "x:"=nothing - private const int START = 0; // x: set up for LEN - private const int LEN = 1; // i: get length/literal/eob next - private const int LENEXT = 2; // i: getting length extra (have base) - private const int DIST = 3; // i: get distance next - private const int DISTEXT = 4; // i: getting distance extra - private const int COPY = 5; // o: copying bytes in window, waiting for space - private const int LIT = 6; // o: got literal, waiting for output space - private const int WASH = 7; // o: got eob, possibly still output waiting - private const int END = 8; // x: got eob and all data flushed - private const int BADCODE = 9; // x: got error - - internal int mode; // current inflate_codes mode - - // mode dependent information - internal int len; - - internal int[] tree; // pointer into tree - internal int tree_index = 0; - internal int need; // bits needed - - internal int lit; - - // if EXT or COPY, where and how much - internal int get_Renamed; // bits to get for extra - internal int dist; // distance back to copy from - - internal byte lbits; // ltree bits decoded per branch - internal byte dbits; // dtree bits decoder per branch - internal int[] ltree; // literal/length/eob tree - internal int ltree_index; // literal/length/eob tree - internal int[] dtree; // distance tree - internal int dtree_index; // distance tree - - internal InfCodes(int bl, int bd, int[] tl, int tl_index, int[] td, int td_index, ZStream z) - { - mode = START; - lbits = (byte) bl; - dbits = (byte) bd; - ltree = tl; - ltree_index = tl_index; - dtree = td; - dtree_index = td_index; - } - - internal InfCodes(int bl, int bd, int[] tl, int[] td, ZStream z) - { - mode = START; - lbits = (byte) bl; - dbits = (byte) bd; - ltree = tl; - ltree_index = 0; - dtree = td; - dtree_index = 0; - } - - internal int proc(InfBlocks s, ZStream z, int r) - { - int j; // temporary storage - //int[] t; // temporary pointer - int tindex; // temporary pointer - int e; // extra bits or operation - int b = 0; // bit buffer - int k = 0; // bits in bit buffer - int p = 0; // input data pointer - int n; // bytes available there - int q; // output window write pointer - int m; // bytes to end of window or read pointer - int f; // pointer to copy strings from - - // copy input/output information to locals (UPDATE macro restores) - p = z.next_in_index; n = z.avail_in; b = s.bitb; k = s.bitk; - q = s.write; m = q < s.read?s.read - q - 1:s.end - q; - - // process input and output based on current state - while (true) - { - switch (mode) - { - - // waiting for "i:"=input, "o:"=output, "x:"=nothing - case START: // x: set up for LEN - if (m >= 258 && n >= 10) - { - - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - r = inflate_fast(lbits, dbits, ltree, ltree_index, dtree, dtree_index, s, z); - - p = z.next_in_index; n = z.avail_in; b = s.bitb; k = s.bitk; - q = s.write; m = q < s.read?s.read - q - 1:s.end - q; - - if (r != Z_OK) - { - mode = r == Z_STREAM_END?WASH:BADCODE; - break; - } - } - need = lbits; - tree = ltree; - tree_index = ltree_index; - - mode = LEN; - goto case LEN; - - case LEN: // i: get length/literal/eob next - j = need; - - while (k < (j)) - { - if (n != 0) - r = Z_OK; - else - { - - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - return s.inflate_flush(z, r); - } - n--; - b |= (z.next_in[p++] & 0xff) << k; - k += 8; - } - - tindex = (tree_index + (b & inflate_mask[j])) * 3; - - b = SupportClass.URShift(b, (tree[tindex + 1])); - k -= (tree[tindex + 1]); - - e = tree[tindex]; - - if (e == 0) - { - // literal - lit = tree[tindex + 2]; - mode = LIT; - break; - } - if ((e & 16) != 0) - { - // length - get_Renamed = e & 15; - len = tree[tindex + 2]; - mode = LENEXT; - break; - } - if ((e & 64) == 0) - { - // next table - need = e; - tree_index = tindex / 3 + tree[tindex + 2]; - break; - } - if ((e & 32) != 0) - { - // end of block - mode = WASH; - break; - } - mode = BADCODE; // invalid code - z.msg = "invalid literal/length code"; - r = Z_DATA_ERROR; - - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - return s.inflate_flush(z, r); - - - case LENEXT: // i: getting length extra (have base) - j = get_Renamed; - - while (k < (j)) - { - if (n != 0) - r = Z_OK; - else - { - - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - return s.inflate_flush(z, r); - } - n--; b |= (z.next_in[p++] & 0xff) << k; - k += 8; - } - - len += (b & inflate_mask[j]); - - b >>= j; - k -= j; - - need = dbits; - tree = dtree; - tree_index = dtree_index; - mode = DIST; - goto case DIST; - - case DIST: // i: get distance next - j = need; - - while (k < (j)) - { - if (n != 0) - r = Z_OK; - else - { - - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - return s.inflate_flush(z, r); - } - n--; b |= (z.next_in[p++] & 0xff) << k; - k += 8; - } - - tindex = (tree_index + (b & inflate_mask[j])) * 3; - - b >>= tree[tindex + 1]; - k -= tree[tindex + 1]; - - e = (tree[tindex]); - if ((e & 16) != 0) - { - // distance - get_Renamed = e & 15; - dist = tree[tindex + 2]; - mode = DISTEXT; - break; - } - if ((e & 64) == 0) - { - // next table - need = e; - tree_index = tindex / 3 + tree[tindex + 2]; - break; - } - mode = BADCODE; // invalid code - z.msg = "invalid distance code"; - r = Z_DATA_ERROR; - - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - return s.inflate_flush(z, r); - - - case DISTEXT: // i: getting distance extra - j = get_Renamed; - - while (k < (j)) - { - if (n != 0) - r = Z_OK; - else - { - - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - return s.inflate_flush(z, r); - } - n--; b |= (z.next_in[p++] & 0xff) << k; - k += 8; - } - - dist += (b & inflate_mask[j]); - - b >>= j; - k -= j; - - mode = COPY; - goto case COPY; - - case COPY: // o: copying bytes in window, waiting for space - f = q - dist; - while (f < 0) - { - // modulo window size-"while" instead - f += s.end; // of "if" handles invalid distances - } - while (len != 0) - { - - if (m == 0) - { - if (q == s.end && s.read != 0) - { - q = 0; m = q < s.read?s.read - q - 1:s.end - q; - } - if (m == 0) - { - s.write = q; r = s.inflate_flush(z, r); - q = s.write; m = q < s.read?s.read - q - 1:s.end - q; - - if (q == s.end && s.read != 0) - { - q = 0; m = q < s.read?s.read - q - 1:s.end - q; - } - - if (m == 0) - { - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - return s.inflate_flush(z, r); - } - } - } - - s.window[q++] = s.window[f++]; m--; - - if (f == s.end) - f = 0; - len--; - } - mode = START; - break; - - case LIT: // o: got literal, waiting for output space - if (m == 0) - { - if (q == s.end && s.read != 0) - { - q = 0; m = q < s.read?s.read - q - 1:s.end - q; - } - if (m == 0) - { - s.write = q; r = s.inflate_flush(z, r); - q = s.write; m = q < s.read?s.read - q - 1:s.end - q; - - if (q == s.end && s.read != 0) - { - q = 0; m = q < s.read?s.read - q - 1:s.end - q; - } - if (m == 0) - { - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - return s.inflate_flush(z, r); - } - } - } - r = Z_OK; - - s.window[q++] = (byte) lit; m--; - - mode = START; - break; - - case WASH: // o: got eob, possibly more output - if (k > 7) - { - // return unused byte, if any - k -= 8; - n++; - p--; // can always return one - } - - s.write = q; r = s.inflate_flush(z, r); - q = s.write; m = q < s.read?s.read - q - 1:s.end - q; - - if (s.read != s.write) - { - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - return s.inflate_flush(z, r); - } - mode = END; - goto case END; - - case END: - r = Z_STREAM_END; - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - return s.inflate_flush(z, r); - - - case BADCODE: // x: got error - - r = Z_DATA_ERROR; - - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - return s.inflate_flush(z, r); - - - default: - r = Z_STREAM_ERROR; - - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - return s.inflate_flush(z, r); - - } - } - } - - internal void free(ZStream z) - { - // ZFREE(z, c); - } - - // Called with number of bytes left to write in window at least 258 - // (the maximum string length) and number of input bytes available - // at least ten. The ten bytes are six bytes for the longest length/ - // distance pair plus four bytes for overloading the bit buffer. - - internal int inflate_fast(int bl, int bd, int[] tl, int tl_index, int[] td, int td_index, InfBlocks s, ZStream z) - { - int t; // temporary pointer - int[] tp; // temporary pointer - int tp_index; // temporary pointer - int e; // extra bits or operation - int b; // bit buffer - int k; // bits in bit buffer - int p; // input data pointer - int n; // bytes available there - int q; // output window write pointer - int m; // bytes to end of window or read pointer - int ml; // mask for literal/length tree - int md; // mask for distance tree - int c; // bytes to copy - int d; // distance back to copy from - int r; // copy source pointer - - // load input, output, bit values - p = z.next_in_index; n = z.avail_in; b = s.bitb; k = s.bitk; - q = s.write; m = q < s.read?s.read - q - 1:s.end - q; - - // initialize masks - ml = inflate_mask[bl]; - md = inflate_mask[bd]; - - // do until not enough input or output space for fast loop - do - { - // assume called with m >= 258 && n >= 10 - // get literal/length code - while (k < (20)) - { - // max bits for literal/length code - n--; - b |= (z.next_in[p++] & 0xff) << k; k += 8; - } - - t = b & ml; - tp = tl; - tp_index = tl_index; - if ((e = tp[(tp_index + t) * 3]) == 0) - { - b >>= (tp[(tp_index + t) * 3 + 1]); k -= (tp[(tp_index + t) * 3 + 1]); - - s.window[q++] = (byte) tp[(tp_index + t) * 3 + 2]; - m--; - continue; - } - do - { - - b >>= (tp[(tp_index + t) * 3 + 1]); k -= (tp[(tp_index + t) * 3 + 1]); - - if ((e & 16) != 0) - { - e &= 15; - c = tp[(tp_index + t) * 3 + 2] + ((int) b & inflate_mask[e]); - - b >>= e; k -= e; - - // decode distance base of block to copy - while (k < (15)) - { - // max bits for distance code - n--; - b |= (z.next_in[p++] & 0xff) << k; k += 8; - } - - t = b & md; - tp = td; - tp_index = td_index; - e = tp[(tp_index + t) * 3]; - - do - { - - b >>= (tp[(tp_index + t) * 3 + 1]); k -= (tp[(tp_index + t) * 3 + 1]); - - if ((e & 16) != 0) - { - // get extra bits to add to distance base - e &= 15; - while (k < (e)) - { - // get extra bits (up to 13) - n--; - b |= (z.next_in[p++] & 0xff) << k; k += 8; - } - - d = tp[(tp_index + t) * 3 + 2] + (b & inflate_mask[e]); - - b >>= (e); k -= (e); - - // do the copy - m -= c; - if (q >= d) - { - // offset before dest - // just copy - r = q - d; - if (q - r > 0 && 2 > (q - r)) - { - s.window[q++] = s.window[r++]; c--; // minimum count is three, - s.window[q++] = s.window[r++]; c--; // so unroll loop a little - } - else - { - Array.Copy(s.window, r, s.window, q, 2); - q += 2; r += 2; c -= 2; - } - } - else - { - // else offset after destination - r = q - d; - do - { - r += s.end; // force pointer in window - } - while (r < 0); // covers invalid distances - e = s.end - r; - if (c > e) - { - // if source crosses, - c -= e; // wrapped copy - if (q - r > 0 && e > (q - r)) - { - do - { - s.window[q++] = s.window[r++]; - } - while (--e != 0); - } - else - { - Array.Copy(s.window, r, s.window, q, e); - q += e; r += e; e = 0; - } - r = 0; // copy rest from start of window - } - } - - // copy all or what's left - if (q - r > 0 && c > (q - r)) - { - do - { - s.window[q++] = s.window[r++]; - } - while (--c != 0); - } - else - { - Array.Copy(s.window, r, s.window, q, c); - q += c; r += c; c = 0; - } - break; - } - else if ((e & 64) == 0) - { - t += tp[(tp_index + t) * 3 + 2]; - t += (b & inflate_mask[e]); - e = tp[(tp_index + t) * 3]; - } - else - { - z.msg = "invalid distance code"; - - c = z.avail_in - n; c = (k >> 3) < c?k >> 3:c; n += c; p -= c; k -= (c << 3); - - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - - return Z_DATA_ERROR; - } - } - while (true); - break; - } - - if ((e & 64) == 0) - { - t += tp[(tp_index + t) * 3 + 2]; - t += (b & inflate_mask[e]); - if ((e = tp[(tp_index + t) * 3]) == 0) - { - - b >>= (tp[(tp_index + t) * 3 + 1]); k -= (tp[(tp_index + t) * 3 + 1]); - - s.window[q++] = (byte) tp[(tp_index + t) * 3 + 2]; - m--; - break; - } - } - else if ((e & 32) != 0) - { - - c = z.avail_in - n; c = (k >> 3) < c?k >> 3:c; n += c; p -= c; k -= (c << 3); - - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - - return Z_STREAM_END; - } - else - { - z.msg = "invalid literal/length code"; - - c = z.avail_in - n; c = (k >> 3) < c?k >> 3:c; n += c; p -= c; k -= (c << 3); - - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - - return Z_DATA_ERROR; - } - } - while (true); - } - while (m >= 258 && n >= 10); - - // not enough input or output--restore pointers and return - c = z.avail_in - n; c = (k >> 3) < c?k >> 3:c; n += c; p -= c; k -= (c << 3); - - s.bitb = b; s.bitk = k; - z.avail_in = n; z.total_in += p - z.next_in_index; z.next_in_index = p; - s.write = q; - - return Z_OK; - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data/zlib/InfTree.cs b/Source/MySql.Data/zlib/InfTree.cs deleted file mode 100644 index a15c4fa2f..000000000 --- a/Source/MySql.Data/zlib/InfTree.cs +++ /dev/null @@ -1,377 +0,0 @@ -// Copyright (c) 2006, ComponentAce -// http://www.componentace.com -// 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 ComponentAce 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. - -/* -Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. - -2. 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. - -3. The names of the authors may not be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 JCRAFT, -INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE 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. -*/ -/* -* This program is based on zlib-1.1.3, so all credit should go authors -* Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) -* and contributors of zlib. -*/ -using System; -namespace zlib -{ - - sealed class InfTree - { - - private const int MANY = 1440; - - private const int Z_OK = 0; - private const int Z_STREAM_END = 1; - private const int Z_NEED_DICT = 2; - private const int Z_ERRNO = - 1; - private const int Z_STREAM_ERROR = - 2; - private const int Z_DATA_ERROR = - 3; - private const int Z_MEM_ERROR = - 4; - private const int Z_BUF_ERROR = - 5; - private const int Z_VERSION_ERROR = - 6; - - internal const int fixed_bl = 9; - internal const int fixed_bd = 5; - - - internal static readonly int[] fixed_tl = new int[]{96, 7, 256, 0, 8, 80, 0, 8, 16, 84, 8, 115, 82, 7, 31, 0, 8, 112, 0, 8, 48, 0, 9, 192, 80, 7, 10, 0, 8, 96, 0, 8, 32, 0, 9, 160, 0, 8, 0, 0, 8, 128, 0, 8, 64, 0, 9, 224, 80, 7, 6, 0, 8, 88, 0, 8, 24, 0, 9, 144, 83, 7, 59, 0, 8, 120, 0, 8, 56, 0, 9, 208, 81, 7, 17, 0, 8, 104, 0, 8, 40, 0, 9, 176, 0, 8, 8, 0, 8, 136, 0, 8, 72, 0, 9, 240, 80, 7, 4, 0, 8, 84, 0, 8, 20, 85, 8, 227, 83, 7, 43, 0, 8, 116, 0, 8, 52, 0, 9, 200, 81, 7, 13, 0, 8, 100, 0, 8, 36, 0, 9, 168, 0, 8, 4, 0, 8, 132, 0, 8, 68, 0, 9, 232, 80, 7, 8, 0, 8, 92, 0, 8, 28, 0, 9, 152, 84, 7, 83, 0, 8, 124, 0, 8, 60, 0, 9, 216, 82, 7, 23, 0, 8, 108, 0, 8, 44, 0, 9, 184, 0, 8, 12, 0, 8, 140, 0, 8, 76, 0, 9, 248, 80, 7, 3, 0, 8, 82, 0, 8, 18, 85, 8, 163, 83, 7, 35, 0, 8, 114, 0, 8, 50, 0, 9, 196, 81, 7, 11, 0, 8, 98, 0, 8, 34, 0, 9, 164, 0, 8, 2, 0, 8, 130, 0, 8, 66, 0, 9, 228, 80, 7, 7, 0, 8, 90, 0, 8, 26, 0, 9, 148, 84, 7, 67, 0, 8, 122, 0, 8, 58, 0, 9, 212, 82, 7, 19, 0, 8, 106, 0, 8, 42, 0, 9, 180, 0, 8, 10, 0, 8, 138, 0, 8, 74, 0, 9, 244, 80, 7, 5, 0, 8, 86, 0, 8, 22, 192, 8, 0, 83, 7, 51, 0, 8, 118, 0, 8, 54, 0, 9, 204, 81, 7, 15, 0, 8, 102, 0, 8, 38, 0, 9, 172, 0, 8, 6, 0, 8, 134, 0, 8, 70, 0, 9, 236, 80, 7, 9, 0, 8, 94, 0, 8, 30, 0, 9, 156, 84, 7, 99, 0, 8, 126, 0, 8, 62, 0, 9, 220, 82, 7, 27, 0, 8, 110, 0, 8, 46, 0, 9, 188, 0, 8, 14, 0, 8, 142, 0, 8, 78, 0, 9, 252, 96, 7, 256, 0, 8, 81, 0, 8, 17, 85, 8, 131, 82, 7, 31, 0, 8, 113, 0, 8, 49, 0, 9, 194, 80, 7, 10, 0, 8, 97, 0, 8, 33, 0, 9, 162, 0, 8, 1, 0, 8, 129, 0, 8, 65, 0, 9, 226, 80, 7, 6, 0, 8, 89, 0, 8, 25, 0, 9, 146, 83, 7, 59, 0, 8, 121, 0, 8, 57, 0, 9, 210, 81, 7, 17, 0, 8, 105, 0, 8, 41, 0, 9, 178, 0, 8, 9, 0, 8, 137, 0, 8, 73, 0, 9, 242, 80, 7, 4, 0, 8, 85, 0, 8, 21, 80, 8, 258, 83, 7, 43, 0, 8, 117, 0, 8, 53, 0, 9, 202, 81, 7, 13, 0, 8, 101, 0, 8, 37, 0, 9, 170, 0, 8, 5, 0, 8, 133, 0, 8, 69, 0, 9, 234, 80, 7, 8, 0, 8, 93, 0, 8, 29, 0, 9, 154, 84, 7, 83, 0, 8, 125, 0, 8, 61, 0, 9, 218, 82, 7, 23, 0, 8, 109, 0, 8, 45, 0, 9, 186, - 0, 8, 13, 0, 8, 141, 0, 8, 77, 0, 9, 250, 80, 7, 3, 0, 8, 83, 0, 8, 19, 85, 8, 195, 83, 7, 35, 0, 8, 115, 0, 8, 51, 0, 9, 198, 81, 7, 11, 0, 8, 99, 0, 8, 35, 0, 9, 166, 0, 8, 3, 0, 8, 131, 0, 8, 67, 0, 9, 230, 80, 7, 7, 0, 8, 91, 0, 8, 27, 0, 9, 150, 84, 7, 67, 0, 8, 123, 0, 8, 59, 0, 9, 214, 82, 7, 19, 0, 8, 107, 0, 8, 43, 0, 9, 182, 0, 8, 11, 0, 8, 139, 0, 8, 75, 0, 9, 246, 80, 7, 5, 0, 8, 87, 0, 8, 23, 192, 8, 0, 83, 7, 51, 0, 8, 119, 0, 8, 55, 0, 9, 206, 81, 7, 15, 0, 8, 103, 0, 8, 39, 0, 9, 174, 0, 8, 7, 0, 8, 135, 0, 8, 71, 0, 9, 238, 80, 7, 9, 0, 8, 95, 0, 8, 31, 0, 9, 158, 84, 7, 99, 0, 8, 127, 0, 8, 63, 0, 9, 222, 82, 7, 27, 0, 8, 111, 0, 8, 47, 0, 9, 190, 0, 8, 15, 0, 8, 143, 0, 8, 79, 0, 9, 254, 96, 7, 256, 0, 8, 80, 0, 8, 16, 84, 8, 115, 82, 7, 31, 0, 8, 112, 0, 8, 48, 0, 9, 193, 80, 7, 10, 0, 8, 96, 0, 8, 32, 0, 9, 161, 0, 8, 0, 0, 8, 128, 0, 8, 64, 0, 9, 225, 80, 7, 6, 0, 8, 88, 0, 8, 24, 0, 9, 145, 83, 7, 59, 0, 8, 120, 0, 8, 56, 0, 9, 209, 81, 7, 17, 0, 8, 104, 0, 8, 40, 0, 9, 177, 0, 8, 8, 0, 8, 136, 0, 8, 72, 0, 9, 241, 80, 7, 4, 0, 8, 84, 0, 8, 20, 85, 8, 227, 83, 7, 43, 0, 8, 116, 0, 8, 52, 0, 9, 201, 81, 7, 13, 0, 8, 100, 0, 8, 36, 0, 9, 169, 0, 8, 4, 0, 8, 132, 0, 8, 68, 0, 9, 233, 80, 7, 8, 0, 8, 92, 0, 8, 28, 0, 9, 153, 84, 7, 83, 0, 8, 124, 0, 8, 60, 0, 9, 217, 82, 7, 23, 0, 8, 108, 0, 8, 44, 0, 9, 185, 0, 8, 12, 0, 8, 140, 0, 8, 76, 0, 9, 249, 80, 7, 3, 0, 8, 82, 0, 8, 18, 85, 8, 163, 83, 7, 35, 0, 8, 114, 0, 8, 50, 0, 9, 197, 81, 7, 11, 0, 8, 98, 0, 8, 34, 0, 9, 165, 0, 8, 2, 0, 8, 130, 0, 8, 66, 0, 9, 229, 80, 7, 7, 0, 8, 90, 0, 8, 26, 0, 9, 149, 84, 7, 67, 0, 8, 122, 0, 8, 58, 0, 9, 213, 82, 7, 19, 0, 8, 106, 0, 8, 42, 0, 9, 181, 0, 8, 10, 0, 8, 138, 0, 8, 74, 0, 9, 245, 80, 7, 5, 0, 8, 86, 0, 8, 22, 192, 8, 0, 83, 7, 51, 0, 8, 118, 0, 8, 54, 0, 9, 205, 81, 7, 15, 0, 8, 102, 0, 8, 38, 0, 9, 173, 0, 8, 6, 0, 8, 134, 0, 8, 70, 0, 9, 237, 80, 7, 9, 0, 8, 94, 0, 8, 30, 0, 9, 157, 84, 7, 99, 0, 8, 126, 0, 8, 62, 0, 9, 221, 82, 7, 27, 0, 8, 110, 0, 8, 46, 0, 9, 189, 0, 8, - 14, 0, 8, 142, 0, 8, 78, 0, 9, 253, 96, 7, 256, 0, 8, 81, 0, 8, 17, 85, 8, 131, 82, 7, 31, 0, 8, 113, 0, 8, 49, 0, 9, 195, 80, 7, 10, 0, 8, 97, 0, 8, 33, 0, 9, 163, 0, 8, 1, 0, 8, 129, 0, 8, 65, 0, 9, 227, 80, 7, 6, 0, 8, 89, 0, 8, 25, 0, 9, 147, 83, 7, 59, 0, 8, 121, 0, 8, 57, 0, 9, 211, 81, 7, 17, 0, 8, 105, 0, 8, 41, 0, 9, 179, 0, 8, 9, 0, 8, 137, 0, 8, 73, 0, 9, 243, 80, 7, 4, 0, 8, 85, 0, 8, 21, 80, 8, 258, 83, 7, 43, 0, 8, 117, 0, 8, 53, 0, 9, 203, 81, 7, 13, 0, 8, 101, 0, 8, 37, 0, 9, 171, 0, 8, 5, 0, 8, 133, 0, 8, 69, 0, 9, 235, 80, 7, 8, 0, 8, 93, 0, 8, 29, 0, 9, 155, 84, 7, 83, 0, 8, 125, 0, 8, 61, 0, 9, 219, 82, 7, 23, 0, 8, 109, 0, 8, 45, 0, 9, 187, 0, 8, 13, 0, 8, 141, 0, 8, 77, 0, 9, 251, 80, 7, 3, 0, 8, 83, 0, 8, 19, 85, 8, 195, 83, 7, 35, 0, 8, 115, 0, 8, 51, 0, 9, 199, 81, 7, 11, 0, 8, 99, 0, 8, 35, 0, 9, 167, 0, 8, 3, 0, 8, 131, 0, 8, 67, 0, 9, 231, 80, 7, 7, 0, 8, 91, 0, 8, 27, 0, 9, 151, 84, 7, 67, 0, 8, 123, 0, 8, 59, 0, 9, 215, 82, 7, 19, 0, 8, 107, 0, 8, 43, 0, 9, 183, 0, 8, 11, 0, 8, 139, 0, 8, 75, 0, 9, 247, 80, 7, 5, 0, 8, 87, 0, 8, 23, 192, 8, 0, 83, 7, 51, 0, 8, 119, 0, 8, 55, 0, 9, 207, 81, 7, 15, 0, 8, 103, 0, 8, 39, 0, 9, 175, 0, 8, 7, 0, 8, 135, 0, 8, 71, 0, 9, 239, 80, 7, 9, 0, 8, 95, 0, 8, 31, 0, 9, 159, 84, 7, 99, 0, 8, 127, 0, 8, 63, 0, 9, 223, 82, 7, 27, 0, 8, 111, 0, 8, 47, 0, 9, 191, 0, 8, 15, 0, 8, 143, 0, 8, 79, 0, 9, 255}; - - internal static readonly int[] fixed_td = new int[]{80, 5, 1, 87, 5, 257, 83, 5, 17, 91, 5, 4097, 81, 5, 5, 89, 5, 1025, 85, 5, 65, 93, 5, 16385, 80, 5, 3, 88, 5, 513, 84, 5, 33, 92, 5, 8193, 82, 5, 9, 90, 5, 2049, 86, 5, 129, 192, 5, 24577, 80, 5, 2, 87, 5, 385, 83, 5, 25, 91, 5, 6145, 81, 5, 7, 89, 5, 1537, 85, 5, 97, 93, 5, 24577, 80, 5, 4, 88, 5, 769, 84, 5, 49, 92, 5, 12289, 82, 5, 13, 90, 5, 3073, 86, 5, 193, 192, 5, 24577}; - - // Tables for deflate from PKZIP's appnote.txt. - internal static readonly int[] cplens = new int[]{3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; - - internal static readonly int[] cplext = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; - - internal static readonly int[] cpdist = new int[]{1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577}; - - internal static readonly int[] cpdext = new int[]{0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; - - // If BMAX needs to be larger than 16, then h and x[] should be uLong. - internal const int BMAX = 15; // maximum bit length of any code - - internal static int huft_build(int[] b, int bindex, int n, int s, int[] d, int[] e, int[] t, int[] m, int[] hp, int[] hn, int[] v) - { - // Given a list of code lengths and a maximum table size, make a set of - // tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR - // if the given code set is incomplete (the tables are still built in this - // case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of - // lengths), or Z_MEM_ERROR if not enough memory. - - int a; // counter for codes of length k - int[] c = new int[BMAX + 1]; // bit length count table - int f; // i repeats in table every f entries - int g; // maximum code length - int h; // table level - int i; // counter, current code - int j; // counter - int k; // number of bits in current code - int l; // bits per table (returned in m) - int mask; // (1 << w) - 1, to avoid cc -O bug on HP - int p; // pointer into c[], b[], or v[] - int q; // points to current table - int[] r = new int[3]; // table entry for structure assignment - int[] u = new int[BMAX]; // table stack - int w; // bits before this table == (l * h) - int[] x = new int[BMAX + 1]; // bit offsets, then code stack - int xp; // pointer into x - int y; // number of dummy codes added - int z; // number of entries in current table - - // Generate counts for each bit length - - p = 0; i = n; - do - { - c[b[bindex + p]]++; p++; i--; // assume all entries <= BMAX - } - while (i != 0); - - if (c[0] == n) - { - // null input--all zero length codes - t[0] = - 1; - m[0] = 0; - return Z_OK; - } - - // Find minimum and maximum length, bound *m by those - l = m[0]; - for (j = 1; j <= BMAX; j++) - if (c[j] != 0) - break; - k = j; // minimum code length - if (l < j) - { - l = j; - } - for (i = BMAX; i != 0; i--) - { - if (c[i] != 0) - break; - } - g = i; // maximum code length - if (l > i) - { - l = i; - } - m[0] = l; - - // Adjust last length count to fill out codes, if needed - for (y = 1 << j; j < i; j++, y <<= 1) - { - if ((y -= c[j]) < 0) - { - return Z_DATA_ERROR; - } - } - if ((y -= c[i]) < 0) - { - return Z_DATA_ERROR; - } - c[i] += y; - - // Generate starting offsets into the value table for each length - x[1] = j = 0; - p = 1; xp = 2; - while (--i != 0) - { - // note that i == g from above - x[xp] = (j += c[p]); - xp++; - p++; - } - - // Make a table of values in order of bit lengths - i = 0; p = 0; - do - { - if ((j = b[bindex + p]) != 0) - { - v[x[j]++] = i; - } - p++; - } - while (++i < n); - n = x[g]; // set n to length of v - - // Generate the Huffman codes and for each, make the table entries - x[0] = i = 0; // first Huffman code is zero - p = 0; // grab values in bit order - h = - 1; // no tables yet--level -1 - w = - l; // bits decoded == (l * h) - u[0] = 0; // just to keep compilers happy - q = 0; // ditto - z = 0; // ditto - - // go through the bit lengths (k already is bits in shortest code) - for (; k <= g; k++) - { - a = c[k]; - while (a-- != 0) - { - // here i is the Huffman code of length k bits for value *p - // make tables up to required level - while (k > w + l) - { - h++; - w += l; // previous table always l bits - // compute minimum size table less than or equal to l bits - z = g - w; - z = (z > l)?l:z; // table size upper limit - if ((f = 1 << (j = k - w)) > a + 1) - { - // try a k-w bit table - // too few codes for k-w bit table - f -= (a + 1); // deduct codes from patterns left - xp = k; - if (j < z) - { - while (++j < z) - { - // try smaller tables up to z bits - if ((f <<= 1) <= c[++xp]) - break; // enough codes to use up j bits - f -= c[xp]; // else deduct codes from patterns - } - } - } - z = 1 << j; // table entries for j-bit table - - // allocate new table - if (hn[0] + z > MANY) - // (note: doesn't matter for fixed) - return Z_DATA_ERROR; // overflow of MANY - u[h] = q = hn[0]; // DEBUG - hn[0] += z; - - // connect to last table, if there is one - if (h != 0) - { - x[h] = i; // save pattern for backing up - r[0] = (byte) j; // bits in this table - r[1] = (byte) l; // bits to dump before this table - j = SupportClass.URShift(i, (w - l)); - r[2] = (int) (q - u[h - 1] - j); // offset to this table - Array.Copy(r, 0, hp, (u[h - 1] + j) * 3, 3); // connect to last table - } - else - { - t[0] = q; // first table is returned result - } - } - - // set up table entry in r - r[1] = (byte) (k - w); - if (p >= n) - { - r[0] = 128 + 64; // out of values--invalid code - } - else if (v[p] < s) - { - r[0] = (byte) (v[p] < 256?0:32 + 64); // 256 is end-of-block - r[2] = v[p++]; // simple code is just the value - } - else - { - r[0] = (byte) (e[v[p] - s] + 16 + 64); // non-simple--look up in lists - r[2] = d[v[p++] - s]; - } - - // fill code-like entries with r - f = 1 << (k - w); - for (j = SupportClass.URShift(i, w); j < z; j += f) - { - Array.Copy(r, 0, hp, (q + j) * 3, 3); - } - - // backwards increment the k-bit code i - for (j = 1 << (k - 1); (i & j) != 0; j = SupportClass.URShift(j, 1)) - { - i ^= j; - } - i ^= j; - - // backup over finished tables - mask = (1 << w) - 1; // needed on HP, cc -O bug - while ((i & mask) != x[h]) - { - h--; // don't need to update q - w -= l; - mask = (1 << w) - 1; - } - } - } - // Return Z_BUF_ERROR if we were given an incomplete table - return y != 0 && g != 1?Z_BUF_ERROR:Z_OK; - } - - internal static int inflate_trees_bits(int[] c, int[] bb, int[] tb, int[] hp, ZStream z) - { - int r; - int[] hn = new int[1]; // hufts used in space - int[] v = new int[19]; // work area for huft_build - - r = huft_build(c, 0, 19, 19, null, null, tb, bb, hp, hn, v); - - if (r == Z_DATA_ERROR) - { - z.msg = "oversubscribed dynamic bit lengths tree"; - } - else if (r == Z_BUF_ERROR || bb[0] == 0) - { - z.msg = "incomplete dynamic bit lengths tree"; - r = Z_DATA_ERROR; - } - return r; - } - - internal static int inflate_trees_dynamic(int nl, int nd, int[] c, int[] bl, int[] bd, int[] tl, int[] td, int[] hp, ZStream z) - { - int r; - int[] hn = new int[1]; // hufts used in space - int[] v = new int[288]; // work area for huft_build - - // build literal/length tree - r = huft_build(c, 0, nl, 257, cplens, cplext, tl, bl, hp, hn, v); - if (r != Z_OK || bl[0] == 0) - { - if (r == Z_DATA_ERROR) - { - z.msg = "oversubscribed literal/length tree"; - } - else if (r != Z_MEM_ERROR) - { - z.msg = "incomplete literal/length tree"; - r = Z_DATA_ERROR; - } - return r; - } - - // build distance tree - r = huft_build(c, nl, nd, 0, cpdist, cpdext, td, bd, hp, hn, v); - - if (r != Z_OK || (bd[0] == 0 && nl > 257)) - { - if (r == Z_DATA_ERROR) - { - z.msg = "oversubscribed distance tree"; - } - else if (r == Z_BUF_ERROR) - { - z.msg = "incomplete distance tree"; - r = Z_DATA_ERROR; - } - else if (r != Z_MEM_ERROR) - { - z.msg = "empty distance tree with lengths"; - r = Z_DATA_ERROR; - } - return r; - } - - return Z_OK; - } - - internal static int inflate_trees_fixed(int[] bl, int[] bd, int[][] tl, int[][] td, ZStream z) - { - bl[0] = fixed_bl; - bd[0] = fixed_bd; - tl[0] = fixed_tl; - td[0] = fixed_td; - return Z_OK; - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data/zlib/Inflate.cs b/Source/MySql.Data/zlib/Inflate.cs deleted file mode 100644 index 25b201964..000000000 --- a/Source/MySql.Data/zlib/Inflate.cs +++ /dev/null @@ -1,450 +0,0 @@ -// Copyright (c) 2006, ComponentAce -// http://www.componentace.com -// 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 ComponentAce 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. - -/* -Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. - -2. 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. - -3. The names of the authors may not be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 JCRAFT, -INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE 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. -*/ -/* -* This program is based on zlib-1.1.3, so all credit should go authors -* Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) -* and contributors of zlib. -*/ -using System; -namespace zlib -{ - - sealed class Inflate - { - - private const int MAX_WBITS = 15; // 32K LZ77 window - - // preset dictionary flag in zlib header - private const int PRESET_DICT = 0x20; - - internal const int Z_NO_FLUSH = 0; - internal const int Z_PARTIAL_FLUSH = 1; - internal const int Z_SYNC_FLUSH = 2; - internal const int Z_FULL_FLUSH = 3; - internal const int Z_FINISH = 4; - - private const int Z_DEFLATED = 8; - - private const int Z_OK = 0; - private const int Z_STREAM_END = 1; - private const int Z_NEED_DICT = 2; - private const int Z_ERRNO = - 1; - private const int Z_STREAM_ERROR = - 2; - private const int Z_DATA_ERROR = - 3; - private const int Z_MEM_ERROR = - 4; - private const int Z_BUF_ERROR = - 5; - private const int Z_VERSION_ERROR = - 6; - - private const int METHOD = 0; // waiting for method byte - private const int FLAG = 1; // waiting for flag byte - private const int DICT4 = 2; // four dictionary check bytes to go - private const int DICT3 = 3; // three dictionary check bytes to go - private const int DICT2 = 4; // two dictionary check bytes to go - private const int DICT1 = 5; // one dictionary check byte to go - private const int DICT0 = 6; // waiting for inflateSetDictionary - private const int BLOCKS = 7; // decompressing blocks - private const int CHECK4 = 8; // four check bytes to go - private const int CHECK3 = 9; // three check bytes to go - private const int CHECK2 = 10; // two check bytes to go - private const int CHECK1 = 11; // one check byte to go - private const int DONE = 12; // finished check, done - private const int BAD = 13; // got an error--stay here - - internal int mode; // current inflate mode - - // mode dependent information - internal int method; // if FLAGS, method byte - - // if CHECK, check values to compare - internal long[] was = new long[1]; // computed check value - internal long need; // stream check value - - // if BAD, inflateSync's marker bytes count - internal int marker; - - // mode independent information - internal int nowrap; // flag for no wrapper - internal int wbits; // log2(window size) (8..15, defaults to 15) - - internal InfBlocks blocks; // current inflate_blocks state - - internal int inflateReset(ZStream z) - { - if (z == null || z.istate == null) - return Z_STREAM_ERROR; - - z.total_in = z.total_out = 0; - z.msg = null; - z.istate.mode = z.istate.nowrap != 0?BLOCKS:METHOD; - z.istate.blocks.reset(z, null); - return Z_OK; - } - - internal int inflateEnd(ZStream z) - { - if (blocks != null) - blocks.free(z); - blocks = null; - // ZFREE(z, z->state); - return Z_OK; - } - - internal int inflateInit(ZStream z, int w) - { - z.msg = null; - blocks = null; - - // handle undocumented nowrap option (no zlib header or check) - nowrap = 0; - if (w < 0) - { - w = - w; - nowrap = 1; - } - - // set window size - if (w < 8 || w > 15) - { - inflateEnd(z); - return Z_STREAM_ERROR; - } - wbits = w; - - z.istate.blocks = new InfBlocks(z, z.istate.nowrap != 0?null:this, 1 << w); - - // reset state - inflateReset(z); - return Z_OK; - } - - internal int inflate(ZStream z, int f) - { - int r; - int b; - - if (z == null || z.istate == null || z.next_in == null) - return Z_STREAM_ERROR; - f = f == Z_FINISH?Z_BUF_ERROR:Z_OK; - r = Z_BUF_ERROR; - while (true) - { - //System.out.println("mode: "+z.istate.mode); - switch (z.istate.mode) - { - - case METHOD: - - if (z.avail_in == 0) - return r; r = f; - - z.avail_in--; z.total_in++; - if (((z.istate.method = z.next_in[z.next_in_index++]) & 0xf) != Z_DEFLATED) - { - z.istate.mode = BAD; - z.msg = "unknown compression method"; - z.istate.marker = 5; // can't try inflateSync - break; - } - if ((z.istate.method >> 4) + 8 > z.istate.wbits) - { - z.istate.mode = BAD; - z.msg = "invalid window size"; - z.istate.marker = 5; // can't try inflateSync - break; - } - z.istate.mode = FLAG; - goto case FLAG; - - case FLAG: - - if (z.avail_in == 0) - return r; r = f; - - z.avail_in--; z.total_in++; - b = (z.next_in[z.next_in_index++]) & 0xff; - - if ((((z.istate.method << 8) + b) % 31) != 0) - { - z.istate.mode = BAD; - z.msg = "incorrect header check"; - z.istate.marker = 5; // can't try inflateSync - break; - } - - if ((b & PRESET_DICT) == 0) - { - z.istate.mode = BLOCKS; - break; - } - z.istate.mode = DICT4; - goto case DICT4; - - case DICT4: - - if (z.avail_in == 0) - return r; r = f; - - z.avail_in--; z.total_in++; - z.istate.need = ((z.next_in[z.next_in_index++] & 0xff) << 24) & unchecked((int) 0xff000000L); - z.istate.mode = DICT3; - goto case DICT3; - - case DICT3: - - if (z.avail_in == 0) - return r; r = f; - - z.avail_in--; z.total_in++; - z.istate.need += (((z.next_in[z.next_in_index++] & 0xff) << 16) & 0xff0000L); - z.istate.mode = DICT2; - goto case DICT2; - - case DICT2: - - if (z.avail_in == 0) - return r; r = f; - - z.avail_in--; z.total_in++; - z.istate.need += (((z.next_in[z.next_in_index++] & 0xff) << 8) & 0xff00L); - z.istate.mode = DICT1; - goto case DICT1; - - case DICT1: - - if (z.avail_in == 0) - return r; r = f; - - z.avail_in--; z.total_in++; - z.istate.need += (z.next_in[z.next_in_index++] & 0xffL); - z.adler = z.istate.need; - z.istate.mode = DICT0; - return Z_NEED_DICT; - - case DICT0: - z.istate.mode = BAD; - z.msg = "need dictionary"; - z.istate.marker = 0; // can try inflateSync - return Z_STREAM_ERROR; - - case BLOCKS: - - r = z.istate.blocks.proc(z, r); - if (r == Z_DATA_ERROR) - { - z.istate.mode = BAD; - z.istate.marker = 0; // can try inflateSync - break; - } - if (r == Z_OK) - { - r = f; - } - if (r != Z_STREAM_END) - { - return r; - } - r = f; - z.istate.blocks.reset(z, z.istate.was); - if (z.istate.nowrap != 0) - { - z.istate.mode = DONE; - break; - } - z.istate.mode = CHECK4; - goto case CHECK4; - - case CHECK4: - - if (z.avail_in == 0) - return r; r = f; - - z.avail_in--; z.total_in++; - z.istate.need = ((z.next_in[z.next_in_index++] & 0xff) << 24) & unchecked((int) 0xff000000L); - z.istate.mode = CHECK3; - goto case CHECK3; - - case CHECK3: - - if (z.avail_in == 0) - return r; r = f; - - z.avail_in--; z.total_in++; - z.istate.need += (((z.next_in[z.next_in_index++] & 0xff) << 16) & 0xff0000L); - z.istate.mode = CHECK2; - goto case CHECK2; - - case CHECK2: - - if (z.avail_in == 0) - return r; r = f; - - z.avail_in--; z.total_in++; - z.istate.need += (((z.next_in[z.next_in_index++] & 0xff) << 8) & 0xff00L); - z.istate.mode = CHECK1; - goto case CHECK1; - - case CHECK1: - - if (z.avail_in == 0) - return r; r = f; - - z.avail_in--; z.total_in++; - z.istate.need += (z.next_in[z.next_in_index++] & 0xffL); - - if (((int) (z.istate.was[0])) != ((int) (z.istate.need))) - { - z.istate.mode = BAD; - z.msg = "incorrect data check"; - z.istate.marker = 5; // can't try inflateSync - break; - } - - z.istate.mode = DONE; - goto case DONE; - - case DONE: - return Z_STREAM_END; - - case BAD: - return Z_DATA_ERROR; - - default: - return Z_STREAM_ERROR; - - } - } - } - - - internal int inflateSetDictionary(ZStream z, byte[] dictionary, int dictLength) - { - int index = 0; - int length = dictLength; - if (z == null || z.istate == null || z.istate.mode != DICT0) - return Z_STREAM_ERROR; - - if (z._adler.adler32(1L, dictionary, 0, dictLength) != z.adler) - { - return Z_DATA_ERROR; - } - - z.adler = z._adler.adler32(0, null, 0, 0); - - if (length >= (1 << z.istate.wbits)) - { - length = (1 << z.istate.wbits) - 1; - index = dictLength - length; - } - z.istate.blocks.set_dictionary(dictionary, index, length); - z.istate.mode = BLOCKS; - return Z_OK; - } - - private static byte[] mark = new byte[]{(byte) 0, (byte) 0, (byte) SupportClass.Identity(0xff), (byte) SupportClass.Identity(0xff)}; - - internal int inflateSync(ZStream z) - { - int n; // number of bytes to look at - int p; // pointer to bytes - int m; // number of marker bytes found in a row - long r, w; // temporaries to save total_in and total_out - - // set up - if (z == null || z.istate == null) - return Z_STREAM_ERROR; - if (z.istate.mode != BAD) - { - z.istate.mode = BAD; - z.istate.marker = 0; - } - if ((n = z.avail_in) == 0) - return Z_BUF_ERROR; - p = z.next_in_index; - m = z.istate.marker; - - // search - while (n != 0 && m < 4) - { - if (z.next_in[p] == mark[m]) - { - m++; - } - else if (z.next_in[p] != 0) - { - m = 0; - } - else - { - m = 4 - m; - } - p++; n--; - } - - // restore - z.total_in += p - z.next_in_index; - z.next_in_index = p; - z.avail_in = n; - z.istate.marker = m; - - // return no joy or set up to restart on a new block - if (m != 4) - { - return Z_DATA_ERROR; - } - r = z.total_in; w = z.total_out; - inflateReset(z); - z.total_in = r; z.total_out = w; - z.istate.mode = BLOCKS; - return Z_OK; - } - - // Returns true if inflate is currently at the end of a block generated - // by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP - // implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH - // but removes the length bytes of the resulting empty stored block. When - // decompressing, PPP checks that at the end of input packet, inflate is - // waiting for these length bytes. - internal int inflateSyncPoint(ZStream z) - { - if (z == null || z.istate == null || z.istate.blocks == null) - return Z_STREAM_ERROR; - return z.istate.blocks.sync_point(); - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data/zlib/StaticTree.cs b/Source/MySql.Data/zlib/StaticTree.cs deleted file mode 100644 index b1db3cf36..000000000 --- a/Source/MySql.Data/zlib/StaticTree.cs +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright (c) 2006, ComponentAce -// http://www.componentace.com -// 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 ComponentAce 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. - -/* -Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. - -2. 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. - -3. The names of the authors may not be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 JCRAFT, -INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE 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. -*/ -/* -* This program is based on zlib-1.1.3, so all credit should go authors -* Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) -* and contributors of zlib. -*/ -using System; -namespace zlib -{ - - sealed class StaticTree - { - private const int MAX_BITS = 15; - - private const int BL_CODES = 19; - private const int D_CODES = 30; - private const int LITERALS = 256; - private const int LENGTH_CODES = 29; - private static readonly int L_CODES = (LITERALS + 1 + LENGTH_CODES); - - // Bit length codes must not exceed MAX_BL_BITS bits - internal const int MAX_BL_BITS = 7; - - internal static readonly short[] static_ltree = new short[]{12, 8, 140, 8, 76, 8, 204, 8, 44, 8, 172, 8, 108, 8, 236, 8, 28, 8, 156, 8, 92, 8, 220, 8, 60, 8, 188, 8, 124, 8, 252, 8, 2, 8, 130, 8, 66, 8, 194, 8, 34, 8, 162, 8, 98, 8, 226, 8, 18, 8, 146, 8, 82, 8, 210, 8, 50, 8, 178, 8, 114, 8, 242, 8, 10, 8, 138, 8, 74, 8, 202, 8, 42, 8, 170, 8, 106, 8, 234, 8, 26, 8, 154, 8, 90, 8, 218, 8, 58, 8, 186, 8, 122, 8, 250, 8, 6, 8, 134, 8, 70, 8, 198, 8, 38, 8, 166, 8, 102, 8, 230, 8, 22, 8, 150, 8, 86, 8, 214, 8, 54, 8, 182, 8, 118, 8, 246, 8, 14, 8, 142, 8, 78, 8, 206, 8, 46, 8, 174, 8, 110, 8, 238, 8, 30, 8, 158, 8, 94, 8, 222, 8, 62, 8, 190, 8, 126, 8, 254, 8, 1, 8, 129, 8, 65, 8, 193, 8, 33, 8, 161, 8, 97, 8, 225, 8, 17, 8, 145, 8, 81, 8, 209, 8, 49, 8, 177, 8, 113, 8, 241, 8, 9, 8, 137, 8, 73, 8, 201, 8, 41, 8, 169, 8, 105, 8, 233, 8, 25, 8, 153, 8, 89, 8, 217, 8, 57, 8, 185, 8, 121, 8, 249, 8, 5, 8, 133, 8, 69, 8, 197, 8, 37, 8, 165, 8, 101, 8, 229, 8, 21, 8, 149, 8, 85, 8, 213, 8, 53, 8, 181, 8, 117, 8, 245, 8, 13, 8, 141, 8, 77, 8, 205, 8, 45, 8, 173, 8, 109, 8, 237, 8, 29, 8, 157, 8, 93, 8, 221, 8, 61, 8, 189, 8, 125, 8, 253, 8, 19, 9, 275, 9, 147, 9, 403, 9, 83, 9, 339, 9, 211, 9, 467, 9, 51, 9, 307, 9, 179, 9, 435, 9, 115, 9, 371, 9, 243, 9, 499, 9, 11, 9, 267, 9, 139, 9, 395, 9, 75, 9, 331, 9, 203, 9, 459, 9, 43, 9, 299, 9, 171, 9, 427, 9, 107, 9, 363, 9, 235, 9, 491, 9, 27, 9, 283, 9, 155, 9, 411, 9, 91, 9, 347, 9, 219, 9, 475, 9, 59, 9, 315, 9, 187, 9, 443, 9, 123, 9, 379, 9, 251, 9, 507, 9, 7, 9, 263, 9, 135, 9, 391, 9, 71, 9, 327, 9, 199, 9, 455, 9, 39, 9, 295, 9, 167, 9, 423, 9, 103, 9, 359, 9, 231, 9, 487, 9, 23, 9, 279, 9, 151, 9, 407, 9, 87, 9, 343, 9, 215, 9, 471, 9, 55, 9, 311, 9, 183, 9, 439, 9, 119, 9, 375, 9, 247, 9, 503, 9, 15, 9, 271, 9, 143, 9, 399, 9, 79, 9, 335, 9, 207, 9, 463, 9, 47, 9, 303, 9, 175, 9, 431, 9, 111, 9, 367, 9, 239, 9, 495, 9, 31, 9, 287, 9, 159, 9, 415, 9, 95, 9, 351, 9, 223, 9, 479, 9, 63, 9, 319, 9, 191, 9, 447, 9, 127, 9, 383, 9, 255, 9, 511, 9, 0, 7, 64, 7 - , 32, 7, 96, 7, 16, 7, 80, 7, 48, 7, 112, 7, 8, 7, 72, 7, 40, 7, 104, 7, 24, 7, 88, 7, 56, 7, 120, 7, 4, 7, 68, 7, 36, 7, 100, 7, 20, 7, 84, 7, 52, 7, 116, 7, 3, 8, 131, 8, 67, 8, 195, 8, 35, 8, 163, 8, 99, 8, 227, 8}; - - internal static readonly short[] static_dtree = new short[]{0, 5, 16, 5, 8, 5, 24, 5, 4, 5, 20, 5, 12, 5, 28, 5, 2, 5, 18, 5, 10, 5, 26, 5, 6, 5, 22, 5, 14, 5, 30, 5, 1, 5, 17, 5, 9, 5, 25, 5, 5, 5, 21, 5, 13, 5, 29, 5, 3, 5, 19, 5, 11, 5, 27, 5, 7, 5, 23, 5}; - - internal static StaticTree static_l_desc; - - internal static StaticTree static_d_desc; - - internal static StaticTree static_bl_desc; - - internal short[] static_tree; // static tree or null - internal int[] extra_bits; // extra bits for each code or null - internal int extra_base; // base index for extra_bits - internal int elems; // max number of elements in the tree - internal int max_length; // max bit length for the codes - - internal StaticTree(short[] static_tree, int[] extra_bits, int extra_base, int elems, int max_length) - { - this.static_tree = static_tree; - this.extra_bits = extra_bits; - this.extra_base = extra_base; - this.elems = elems; - this.max_length = max_length; - } - static StaticTree() - { - static_l_desc = new StaticTree(static_ltree, Tree.extra_lbits, LITERALS + 1, L_CODES, MAX_BITS); - static_d_desc = new StaticTree(static_dtree, Tree.extra_dbits, 0, D_CODES, MAX_BITS); - static_bl_desc = new StaticTree(null, Tree.extra_blbits, 0, BL_CODES, MAX_BL_BITS); - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data/zlib/SupportClass.cs b/Source/MySql.Data/zlib/SupportClass.cs deleted file mode 100644 index 9d897d325..000000000 --- a/Source/MySql.Data/zlib/SupportClass.cs +++ /dev/null @@ -1,219 +0,0 @@ -using System; - -/* Contains conversion support elements such as classes, interfaces and static methods. */ -namespace zlib -{ - class SupportClass - { - /// - /// This method returns the literal value received - /// - /// The literal to return - /// The received value - public static long Identity(long literal) - { - return literal; - } - - /// - /// This method returns the literal value received - /// - /// The literal to return - /// The received value - public static ulong Identity(ulong literal) - { - return literal; - } - - /// - /// This method returns the literal value received - /// - /// The literal to return - /// The received value - public static float Identity(float literal) - { - return literal; - } - - /// - /// This method returns the literal value received - /// - /// The literal to return - /// The received value - public static double Identity(double literal) - { - return literal; - } - - /*******************************/ - /// - /// Performs an unsigned bitwise right shift with the specified number - /// - /// Number to operate on - /// Ammount of bits to shift - /// The resulting number from the shift operation - public static int URShift(int number, int bits) - { - if ( number >= 0) - return number >> bits; - else - return (number >> bits) + (2 << ~bits); - } - - /// - /// Performs an unsigned bitwise right shift with the specified number - /// - /// Number to operate on - /// Ammount of bits to shift - /// The resulting number from the shift operation - public static int URShift(int number, long bits) - { - return URShift(number, (int)bits); - } - - /// - /// Performs an unsigned bitwise right shift with the specified number - /// - /// Number to operate on - /// Ammount of bits to shift - /// The resulting number from the shift operation - public static long URShift(long number, int bits) - { - if ( number >= 0) - return number >> bits; - else - return (number >> bits) + (2L << ~bits); - } - - /// - /// Performs an unsigned bitwise right shift with the specified number - /// - /// Number to operate on - /// Ammount of bits to shift - /// The resulting number from the shift operation - public static long URShift(long number, long bits) - { - return URShift(number, (int)bits); - } - - /*******************************/ - /// Reads a number of characters from the current source Stream and writes the data to the target array at the specified index. - /// The source Stream to read from. - /// Contains the array of characteres read from the source Stream. - /// The starting index of the target array. - /// The maximum number of characters to read from the source Stream. - /// The number of characters read. The number will be less than or equal to count depending on the data available in the source Stream. Returns -1 if the end of the stream is reached. - public static System.Int32 ReadInput(System.IO.Stream sourceStream, byte[] target, int start, int count) - { - // Returns 0 bytes if not enough space in target - if (target.Length == 0) - return 0; - - byte[] receiver = new byte[target.Length]; - int bytesRead = sourceStream.Read(receiver, start, count); - - // Returns -1 if EOF - if (bytesRead == 0) - return -1; - - for(int i = start; i < start + bytesRead; i++) - target[i] = (byte)receiver[i]; - - return bytesRead; - } - - /// Reads a number of characters from the current source TextReader and writes the data to the target array at the specified index. - /// The source TextReader to read from - /// Contains the array of characteres read from the source TextReader. - /// The starting index of the target array. - /// The maximum number of characters to read from the source TextReader. - /// The number of characters read. The number will be less than or equal to count depending on the data available in the source TextReader. Returns -1 if the end of the stream is reached. - public static System.Int32 ReadInput(System.IO.TextReader sourceTextReader, byte[] target, int start, int count) - { - // Returns 0 bytes if not enough space in target - if (target.Length == 0) return 0; - - char[] charArray = new char[target.Length]; - int bytesRead = sourceTextReader.Read(charArray, start, count); - - // Returns -1 if EOF - if (bytesRead == 0) return -1; - - for(int index=start; index - /// Converts a string to an array of bytes - ///
- /// The string to be converted - /// The new array of bytes - public static byte[] ToByteArray(System.String sourceString) - { - return System.Text.UTF8Encoding.UTF8.GetBytes(sourceString); - } - - /// - /// Converts an array of bytes to an array of chars - /// - /// The array of bytes to convert - /// The new array of chars - public static char[] ToCharArray(byte[] byteArray) - { - return System.Text.UTF8Encoding.UTF8.GetChars(byteArray); - } - -#if !NETCORE10 - /*******************************/ - /// - /// Writes an object to the specified Stream - /// - /// The target Stream - /// The object to be sent - public static void Serialize(System.IO.Stream stream, System.Object objectToSend) - { - System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); - formatter.Serialize(stream, objectToSend); - } - - /// - /// Writes an object to the specified BinaryWriter - /// - /// The target BinaryWriter - /// The object to be sent - public static void Serialize(System.IO.BinaryWriter binaryWriter, System.Object objectToSend) - { - System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); - formatter.Serialize(binaryWriter.BaseStream, objectToSend); - } - - /*******************************/ - /// - /// Deserializes an object, or an entire graph of connected objects, and returns the object intance - /// - /// Reader instance used to read the object - /// The object instance - public static System.Object Deserialize(System.IO.BinaryReader binaryReader) - { - System.Runtime.Serialization.Formatters.Binary.BinaryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); - return formatter.Deserialize(binaryReader.BaseStream); - } - -#endif - - /*******************************/ - /// - /// Writes the exception stack trace to the received stream - /// - /// Exception to obtain information from - /// Output sream used to write to - public static void WriteStackTrace(System.Exception throwable, System.IO.TextWriter stream) - { - stream.Write(throwable.StackTrace); - stream.Flush(); - } - - } -} \ No newline at end of file diff --git a/Source/MySql.Data/zlib/Tree.cs b/Source/MySql.Data/zlib/Tree.cs deleted file mode 100644 index 73bcce07a..000000000 --- a/Source/MySql.Data/zlib/Tree.cs +++ /dev/null @@ -1,349 +0,0 @@ -// Copyright (c) 2006, ComponentAce -// http://www.componentace.com -// 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 ComponentAce 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. - -/* -Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. - -2. 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. - -3. The names of the authors may not be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 JCRAFT, -INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE 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. -*/ -/* -* This program is based on zlib-1.1.3, so all credit should go authors -* Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) -* and contributors of zlib. -*/ -using System; -namespace zlib -{ - - sealed class Tree - { - private const int MAX_BITS = 15; - private const int BL_CODES = 19; - private const int D_CODES = 30; - private const int LITERALS = 256; - private const int LENGTH_CODES = 29; - private static readonly int L_CODES = (LITERALS + 1 + LENGTH_CODES); - private static readonly int HEAP_SIZE = (2 * L_CODES + 1); - - // Bit length codes must not exceed MAX_BL_BITS bits - internal const int MAX_BL_BITS = 7; - - // end of block literal code - internal const int END_BLOCK = 256; - - // repeat previous bit length 3-6 times (2 bits of repeat count) - internal const int REP_3_6 = 16; - - // repeat a zero length 3-10 times (3 bits of repeat count) - internal const int REPZ_3_10 = 17; - - // repeat a zero length 11-138 times (7 bits of repeat count) - internal const int REPZ_11_138 = 18; - - // extra bits for each length code - internal static readonly int[] extra_lbits = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0}; - - // extra bits for each distance code - internal static readonly int[] extra_dbits = new int[]{0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; - - // extra bits for each bit length code - internal static readonly int[] extra_blbits = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7}; - - internal static readonly byte[] bl_order = new byte[]{16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; - - - // The lengths of the bit length codes are sent in order of decreasing - // probability, to avoid transmitting the lengths for unused bit - // length codes. - - internal const int Buf_size = 8 * 2; - - // see definition of array dist_code below - internal const int DIST_CODE_LEN = 512; - - internal static readonly byte[] _dist_code = new byte[]{0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17, 18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29}; - - internal static readonly byte[] _length_code = new byte[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28}; - - internal static readonly int[] base_length = new int[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 0}; - - internal static readonly int[] base_dist = new int[]{0, 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576}; - - // Mapping from a distance to a distance code. dist is the distance - 1 and - // must not have side effects. _dist_code[256] and _dist_code[257] are never - // used. - internal static int d_code(int dist) - { - return ((dist) < 256?_dist_code[dist]:_dist_code[256 + (SupportClass.URShift((dist), 7))]); - } - - internal short[] dyn_tree; // the dynamic tree - internal int max_code; // largest code with non zero frequency - internal StaticTree stat_desc; // the corresponding static tree - - // Compute the optimal bit lengths for a tree and update the total bit length - // for the current block. - // IN assertion: the fields freq and dad are set, heap[heap_max] and - // above are the tree nodes sorted by increasing frequency. - // OUT assertions: the field len is set to the optimal bit length, the - // array bl_count contains the frequencies for each bit length. - // The length opt_len is updated; static_len is also updated if stree is - // not null. - internal void gen_bitlen(Deflate s) - { - short[] tree = dyn_tree; - short[] stree = stat_desc.static_tree; - int[] extra = stat_desc.extra_bits; - int base_Renamed = stat_desc.extra_base; - int max_length = stat_desc.max_length; - int h; // heap index - int n, m; // iterate over the tree elements - int bits; // bit length - int xbits; // extra bits - short f; // frequency - int overflow = 0; // number of elements with bit length too large - - for (bits = 0; bits <= MAX_BITS; bits++) - s.bl_count[bits] = 0; - - // In a first pass, compute the optimal bit lengths (which may - // overflow in the case of the bit length tree). - tree[s.heap[s.heap_max] * 2 + 1] = 0; // root of the heap - - for (h = s.heap_max + 1; h < HEAP_SIZE; h++) - { - n = s.heap[h]; - bits = tree[tree[n * 2 + 1] * 2 + 1] + 1; - if (bits > max_length) - { - bits = max_length; overflow++; - } - tree[n * 2 + 1] = (short) bits; - // We overwrite tree[n*2+1] which is no longer needed - - if (n > max_code) - continue; // not a leaf node - - s.bl_count[bits]++; - xbits = 0; - if (n >= base_Renamed) - xbits = extra[n - base_Renamed]; - f = tree[n * 2]; - s.opt_len += f * (bits + xbits); - if (stree != null) - s.static_len += f * (stree[n * 2 + 1] + xbits); - } - if (overflow == 0) - return ; - - // This happens for example on obj2 and pic of the Calgary corpus - // Find the first bit length which could increase: - do - { - bits = max_length - 1; - while (s.bl_count[bits] == 0) - bits--; - s.bl_count[bits]--; // move one leaf down the tree - s.bl_count[bits + 1] = (short) (s.bl_count[bits + 1] + 2); // move one overflow item as its brother - s.bl_count[max_length]--; - // The brother of the overflow item also moves one step up, - // but this does not affect bl_count[max_length] - overflow -= 2; - } - while (overflow > 0); - - for (bits = max_length; bits != 0; bits--) - { - n = s.bl_count[bits]; - while (n != 0) - { - m = s.heap[--h]; - if (m > max_code) - continue; - if (tree[m * 2 + 1] != bits) - { - s.opt_len = (int) (s.opt_len + ((long) bits - (long) tree[m * 2 + 1]) * (long) tree[m * 2]); - tree[m * 2 + 1] = (short) bits; - } - n--; - } - } - } - - // Construct one Huffman tree and assigns the code bit strings and lengths. - // Update the total bit length for the current block. - // IN assertion: the field freq is set for all tree elements. - // OUT assertions: the fields len and code are set to the optimal bit length - // and corresponding code. The length opt_len is updated; static_len is - // also updated if stree is not null. The field max_code is set. - internal void build_tree(Deflate s) - { - short[] tree = dyn_tree; - short[] stree = stat_desc.static_tree; - int elems = stat_desc.elems; - int n, m; // iterate over heap elements - int max_code = - 1; // largest code with non zero frequency - int node; // new node being created - - // Construct the initial heap, with least frequent element in - // heap[1]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - // heap[0] is not used. - s.heap_len = 0; - s.heap_max = HEAP_SIZE; - - for (n = 0; n < elems; n++) - { - if (tree[n * 2] != 0) - { - s.heap[++s.heap_len] = max_code = n; - s.depth[n] = 0; - } - else - { - tree[n * 2 + 1] = 0; - } - } - - // The pkzip format requires that at least one distance code exists, - // and that at least one bit should be sent even if there is only one - // possible code. So to avoid special checks later on we force at least - // two codes of non zero frequency. - while (s.heap_len < 2) - { - node = s.heap[++s.heap_len] = (max_code < 2?++max_code:0); - tree[node * 2] = 1; - s.depth[node] = 0; - s.opt_len--; - if (stree != null) - s.static_len -= stree[node * 2 + 1]; - // node is 0 or 1 so it does not have extra bits - } - this.max_code = max_code; - - // The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - // establish sub-heaps of increasing lengths: - - for (n = s.heap_len / 2; n >= 1; n--) - s.pqdownheap(tree, n); - - // Construct the Huffman tree by repeatedly combining the least two - // frequent nodes. - - node = elems; // next internal node of the tree - do - { - // n = node of least frequency - n = s.heap[1]; - s.heap[1] = s.heap[s.heap_len--]; - s.pqdownheap(tree, 1); - m = s.heap[1]; // m = node of next least frequency - - s.heap[--s.heap_max] = n; // keep the nodes sorted by frequency - s.heap[--s.heap_max] = m; - - // Create a new node father of n and m - tree[node * 2] = (short) (tree[n * 2] + tree[m * 2]); - s.depth[node] = (byte) (System.Math.Max((byte) s.depth[n], (byte) s.depth[m]) + 1); - tree[n * 2 + 1] = tree[m * 2 + 1] = (short) node; - - // and insert the new node in the heap - s.heap[1] = node++; - s.pqdownheap(tree, 1); - } - while (s.heap_len >= 2); - - s.heap[--s.heap_max] = s.heap[1]; - - // At this point, the fields freq and dad are set. We can now - // generate the bit lengths. - - gen_bitlen(s); - - // The field len is now set, we can generate the bit codes - gen_codes(tree, max_code, s.bl_count); - } - - // Generate the codes for a given tree and bit counts (which need not be - // optimal). - // IN assertion: the array bl_count contains the bit length statistics for - // the given tree and the field len is set for all tree elements. - // OUT assertion: the field code is set for all tree elements of non - // zero code length. - internal static void gen_codes(short[] tree, int max_code, short[] bl_count) - { - short[] next_code = new short[MAX_BITS + 1]; // next code value for each bit length - short code = 0; // running code value - int bits; // bit index - int n; // code index - - // The distribution counts are first used to generate the code values - // without bit reversal. - for (bits = 1; bits <= MAX_BITS; bits++) - { - next_code[bits] = code = (short) ((code + bl_count[bits - 1]) << 1); - } - - // Check that the bit counts in bl_count are consistent. The last code - // must be all ones. - //Assert (code + bl_count[MAX_BITS]-1 == (1< 0); - return SupportClass.URShift(res, 1); - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data/zlib/ZInputStream.cs b/Source/MySql.Data/zlib/ZInputStream.cs deleted file mode 100644 index 031a1939b..000000000 --- a/Source/MySql.Data/zlib/ZInputStream.cs +++ /dev/null @@ -1,204 +0,0 @@ -// Copyright (c) 2006, ComponentAce -// http://www.componentace.com -// 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 ComponentAce 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. - -/* -Copyright (c) 2001 Lapo Luchini. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. - -2. 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. - -3. The names of the authors may not be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 AUTHORS -OR ANY CONTRIBUTORS TO THIS SOFTWARE 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. -*/ -/* -* This program is based on zlib-1.1.3, so all credit should go authors -* Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) -* and contributors of zlib. -*/ -using System; -namespace zlib -{ - - class ZInputStream : System.IO.BinaryReader - { - public long maxInput; - - private void InitBlock() - { - flush = zlibConst.Z_NO_FLUSH; - buf = new byte[bufsize]; - } - virtual public int FlushMode - { - get - { - return (flush); - } - - set - { - this.flush = value; - } - - } - /// Returns the total number of bytes input so far. - virtual public long TotalIn - { - get - { - return z.total_in; - } - - } - /// Returns the total number of bytes output so far. - virtual public long TotalOut - { - get - { - return z.total_out; - } - - } - - protected internal ZStream z = new ZStream(); - protected internal int bufsize = 512; - protected internal int flush; - protected internal byte[] buf, buf1 = new byte[1]; - protected internal bool compress; - - private System.IO.Stream in_Renamed = null; - - public ZInputStream(System.IO.Stream in_Renamed) - : base(in_Renamed) - { - InitBlock(); - this.in_Renamed = in_Renamed; - z.inflateInit(); - compress = false; - z.next_in = buf; - z.next_in_index = 0; - z.avail_in = 0; - } - - public ZInputStream(System.IO.Stream in_Renamed, int level) - : base(in_Renamed) - { - InitBlock(); - this.in_Renamed = in_Renamed; - z.deflateInit(level); - compress = true; - z.next_in = buf; - z.next_in_index = 0; - z.avail_in = 0; - } - - /*public int available() throws IOException { - return inf.finished() ? 0 : 1; - }*/ - - public override int Read() - { - if (read(buf1, 0, 1) == -1) - return (-1); - return (buf1[0] & 0xFF); - } - - private bool nomoreinput = false; - - public int read(byte[] b, int off, int len) - { - if (len == 0) - return (0); - int err; - z.next_out = b; - z.next_out_index = off; - z.avail_out = len; - do - { - if ((z.avail_in == 0) && (!nomoreinput)) - { - // if buffer is empty and more input is avaiable, refill it - z.next_in_index = 0; - - int inToRead = bufsize; - if (maxInput > 0) - { - if (TotalIn < maxInput) - inToRead = (int)(Math.Min(maxInput - TotalIn, (long)bufsize)); - else - z.avail_in = -1; - } - if (z.avail_in != -1) - z.avail_in = SupportClass.ReadInput(in_Renamed, buf, 0, inToRead); //(bufsize 0 && err == zlibConst.Z_OK); - //while (z.avail_out == len && err == zlibConst.Z_OK); - //System.err.print("("+(len-z.avail_out)+")"); - return (len - z.avail_out); - } - - public long skip(long n) - { - int len = 512; - if (n < len) - len = (int)n; - byte[] tmp = new byte[len]; - return ((long)SupportClass.ReadInput(BaseStream, tmp, 0, tmp.Length)); - } - -#if NETCORE10 - public void Close() -#else - public override void Close() -#endif - { -#if NETCORE10 - in_Renamed.Dispose(); -#else - in_Renamed.Close(); -#endif - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data/zlib/ZOutputStream.cs b/Source/MySql.Data/zlib/ZOutputStream.cs deleted file mode 100644 index 7f3ed8c31..000000000 --- a/Source/MySql.Data/zlib/ZOutputStream.cs +++ /dev/null @@ -1,291 +0,0 @@ -// Copyright (c) 2006, ComponentAce -// http://www.componentace.com -// 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 ComponentAce 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. - - -/* -Copyright (c) 2001 Lapo Luchini. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. - -2. 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. - -3. The names of the authors may not be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 AUTHORS -OR ANY CONTRIBUTORS TO THIS SOFTWARE 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. -*/ -/* -* This program is based on zlib-1.1.3, so all credit should go authors -* Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) -* and contributors of zlib. -*/ -using System; -namespace zlib -{ - - class ZOutputStream : System.IO.Stream - { - private void InitBlock() - { - flush_Renamed_Field = zlibConst.Z_NO_FLUSH; - buf = new byte[bufsize]; - } - virtual public int FlushMode - { - get - { - return (flush_Renamed_Field); - } - - set - { - this.flush_Renamed_Field = value; - } - - } - /// Returns the total number of bytes input so far. - virtual public long TotalIn - { - get - { - return z.total_in; - } - - } - /// Returns the total number of bytes output so far. - virtual public long TotalOut - { - get - { - return z.total_out; - } - - } - - protected internal ZStream z = new ZStream(); - protected internal int bufsize = 512; - protected internal int flush_Renamed_Field; - protected internal byte[] buf, buf1 = new byte[1]; - protected internal bool compress; - - private System.IO.Stream out_Renamed; - - public ZOutputStream(System.IO.Stream out_Renamed) : base() - { - InitBlock(); - this.out_Renamed = out_Renamed; - z.inflateInit(); - compress = false; - } - - public ZOutputStream(System.IO.Stream out_Renamed, int level) : base() - { - InitBlock(); - this.out_Renamed = out_Renamed; - z.deflateInit(level); - compress = true; - } - - public void WriteByte(int b) - { - buf1[0] = (byte)b; - Write(buf1, 0, 1); - } - //UPGRADE_TODO: The differences in the Expected value of parameters for method 'WriteByte' may cause compilation errors. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1092_3"' - public override void WriteByte(byte b) - { - WriteByte((int)b); - } - - public override void Write(System.Byte[] b1, int off, int len) - { - if (len == 0) - return; - int err; - byte[] b = new byte[b1.Length]; - System.Array.Copy(b1, b, b1.Length); - z.next_in = b; - z.next_in_index = off; - z.avail_in = len; - do - { - z.next_out = buf; - z.next_out_index = 0; - z.avail_out = bufsize; - if (compress) - err = z.deflate(flush_Renamed_Field); - else - err = z.inflate(flush_Renamed_Field); - if (err != zlibConst.Z_OK) - throw new ZStreamException((compress ? "de" : "in") + "flating: " + z.msg); - out_Renamed.Write(buf, 0, bufsize - z.avail_out); - } - while (z.avail_in > 0 || z.avail_out == 0); - } - - public virtual void finish() - { - int err; - do - { - z.next_out = buf; - z.next_out_index = 0; - z.avail_out = bufsize; - if (compress) - { - err = z.deflate(zlibConst.Z_FINISH); - } - else - { - err = z.inflate(zlibConst.Z_FINISH); - } - if (err != zlibConst.Z_STREAM_END && err != zlibConst.Z_OK) - throw new ZStreamException((compress ? "de" : "in") + "flating: " + z.msg); - if (bufsize - z.avail_out > 0) - { - out_Renamed.Write(buf, 0, bufsize - z.avail_out); - } - } - while (z.avail_in > 0 || z.avail_out == 0); - try - { - Flush(); - } - catch - { - } - } - public virtual void end() - { - if (compress) - { - z.deflateEnd(); - } - else - { - z.inflateEnd(); - } - z.free(); - z = null; - } - -#if NETCORE10 - public void Close() -#else - public override void Close() -#endif - { - try - { - try - { - finish(); - } - catch - { - } - } - finally - { - end(); -#if NETCORE10 - out_Renamed.Dispose(); -#else - out_Renamed.Close(); -#endif - out_Renamed = null; - } - } - - public override void Flush() - { - out_Renamed.Flush(); - } - //UPGRADE_TODO: The following method was automatically generated and it must be implemented in order to preserve the class logic. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1232_3"' - public override System.Int32 Read(System.Byte[] buffer, System.Int32 offset, System.Int32 count) - { - return 0; - } - //UPGRADE_TODO: The following method was automatically generated and it must be implemented in order to preserve the class logic. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1232_3"' - public override void SetLength(System.Int64 value) - { - } - //UPGRADE_TODO: The following method was automatically generated and it must be implemented in order to preserve the class logic. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1232_3"' - public override System.Int64 Seek(System.Int64 offset, System.IO.SeekOrigin origin) - { - return 0; - } - //UPGRADE_TODO: The following property was automatically generated and it must be implemented in order to preserve the class logic. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1232_3"' - public override System.Boolean CanRead - { - get - { - return false; - } - - } - //UPGRADE_TODO: The following property was automatically generated and it must be implemented in order to preserve the class logic. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1232_3"' - public override System.Boolean CanSeek - { - get - { - return false; - } - - } - //UPGRADE_TODO: The following property was automatically generated and it must be implemented in order to preserve the class logic. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1232_3"' - public override System.Boolean CanWrite - { - get - { - return false; - } - - } - //UPGRADE_TODO: The following property was automatically generated and it must be implemented in order to preserve the class logic. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1232_3"' - public override System.Int64 Length - { - get - { - return 0; - } - - } - //UPGRADE_TODO: The following property was automatically generated and it must be implemented in order to preserve the class logic. 'ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="jlca1232_3"' - public override System.Int64 Position - { - get - { - return 0; - } - - set - { - } - - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data/zlib/ZStream.cs b/Source/MySql.Data/zlib/ZStream.cs deleted file mode 100644 index 620ea0267..000000000 --- a/Source/MySql.Data/zlib/ZStream.cs +++ /dev/null @@ -1,243 +0,0 @@ -// Copyright (c) 2006, ComponentAce -// http://www.componentace.com -// 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 ComponentAce 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. - -/* -Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. - -2. 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. - -3. The names of the authors may not be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 JCRAFT, -INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE 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. -*/ -/* -* This program is based on zlib-1.1.3, so all credit should go authors -* Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) -* and contributors of zlib. -*/ -using System; - -#if NETCORE10 -using System.Diagnostics; -#endif - -namespace zlib -{ - - sealed class ZStream - { - - private const int MAX_WBITS = 15; // 32K LZ77 window - private static readonly int DEF_WBITS = MAX_WBITS; - - private const int Z_NO_FLUSH = 0; - private const int Z_PARTIAL_FLUSH = 1; - private const int Z_SYNC_FLUSH = 2; - private const int Z_FULL_FLUSH = 3; - private const int Z_FINISH = 4; - - private const int MAX_MEM_LEVEL = 9; - - private const int Z_OK = 0; - private const int Z_STREAM_END = 1; - private const int Z_NEED_DICT = 2; - private const int Z_ERRNO = -1; - private const int Z_STREAM_ERROR = -2; - private const int Z_DATA_ERROR = -3; - private const int Z_MEM_ERROR = -4; - private const int Z_BUF_ERROR = -5; - private const int Z_VERSION_ERROR = -6; - - public byte[] next_in; // next input byte - public int next_in_index; - public int avail_in; // number of bytes available at next_in - public long total_in; // total nb of input bytes read so far - - public byte[] next_out; // next output byte should be put there - public int next_out_index; - public int avail_out; // remaining free space at next_out - public long total_out; // total nb of bytes output so far - - public System.String msg; - - internal Deflate dstate; - internal Inflate istate; - - internal int data_type; // best guess about the data type: ascii or binary - - public long adler; - internal Adler32 _adler = new Adler32(); - - public int inflateInit() - { - return inflateInit(DEF_WBITS); - } - public int inflateInit(int w) - { - istate = new Inflate(); - return istate.inflateInit(this, w); - } - - public int inflate(int f) - { - if (istate == null) - return Z_STREAM_ERROR; - return istate.inflate(this, f); - } - public int inflateEnd() - { - if (istate == null) - return Z_STREAM_ERROR; - int ret = istate.inflateEnd(this); - istate = null; - return ret; - } - public int inflateSync() - { - if (istate == null) - return Z_STREAM_ERROR; - return istate.inflateSync(this); - } - public int inflateSetDictionary(byte[] dictionary, int dictLength) - { - if (istate == null) - return Z_STREAM_ERROR; - return istate.inflateSetDictionary(this, dictionary, dictLength); - } - - public int deflateInit(int level) - { - return deflateInit(level, MAX_WBITS); - } - public int deflateInit(int level, int bits) - { - dstate = new Deflate(); - return dstate.deflateInit(this, level, bits); - } - public int deflate(int flush) - { - if (dstate == null) - { - return Z_STREAM_ERROR; - } - return dstate.deflate(this, flush); - } - public int deflateEnd() - { - if (dstate == null) - return Z_STREAM_ERROR; - int ret = dstate.deflateEnd(); - dstate = null; - return ret; - } - public int deflateParams(int level, int strategy) - { - if (dstate == null) - return Z_STREAM_ERROR; - return dstate.deflateParams(this, level, strategy); - } - public int deflateSetDictionary(byte[] dictionary, int dictLength) - { - if (dstate == null) - return Z_STREAM_ERROR; - return dstate.deflateSetDictionary(this, dictionary, dictLength); - } - - // Flush as much pending output as possible. All deflate() output goes - // through this function so some applications may wish to modify it - // to avoid allocating a large strm->next_out buffer and copying into it. - // (See also read_buf()). - internal void flush_pending() - { - int len = dstate.pending; - - if (len > avail_out) - len = avail_out; - if (len == 0) - return; - - if (dstate.pending_buf.Length <= dstate.pending_out || next_out.Length <= next_out_index || dstate.pending_buf.Length < (dstate.pending_out + len) || next_out.Length < (next_out_index + len)) - { -#if !NETCORE10 - System.Console.Out.WriteLine(dstate.pending_buf.Length + ", " + dstate.pending_out + ", " + next_out.Length + ", " + next_out_index + ", " + len); - System.Console.Out.WriteLine("avail_out=" + avail_out); -#else - Debug.WriteLine(dstate.pending_buf.Length + ", " + dstate.pending_out + ", " + next_out.Length + ", " + next_out_index + ", " + len); - Debug.WriteLine("avail_out=" + avail_out); -#endif - } - - Array.Copy(dstate.pending_buf, dstate.pending_out, next_out, next_out_index, len); - - next_out_index += len; - dstate.pending_out += len; - total_out += len; - avail_out -= len; - dstate.pending -= len; - if (dstate.pending == 0) - { - dstate.pending_out = 0; - } - } - - // Read a new buffer from the current input stream, update the adler32 - // and total number of bytes read. All deflate() input goes through - // this function so some applications may wish to modify it to avoid - // allocating a large strm->next_in buffer and copying from it. - // (See also flush_pending()). - internal int read_buf(byte[] buf, int start, int size) - { - int len = avail_in; - - if (len > size) - len = size; - if (len == 0) - return 0; - - avail_in -= len; - - if (dstate.noheader == 0) - { - adler = _adler.adler32(adler, next_in, next_in_index, len); - } - Array.Copy(next_in, next_in_index, buf, start, len); - next_in_index += len; - total_in += len; - return len; - } - - public void free() - { - next_in = null; - next_out = null; - msg = null; - _adler = null; - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data/zlib/ZStreamException.cs b/Source/MySql.Data/zlib/ZStreamException.cs deleted file mode 100644 index ea3c4376c..000000000 --- a/Source/MySql.Data/zlib/ZStreamException.cs +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) 2006, ComponentAce -// http://www.componentace.com -// 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 ComponentAce 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. - -/* -Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. - -2. 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. - -3. The names of the authors may not be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 JCRAFT, -INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE 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. -*/ -/* -* This program is based on zlib-1.1.3, so all credit should go authors -* Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) -* and contributors of zlib. -*/ -using System; -namespace zlib -{ -// [Serializable] - class ZStreamException:System.IO.IOException - { - public ZStreamException():base() - { - } - public ZStreamException(System.String s):base(s) - { - } - } -} \ No newline at end of file diff --git a/Source/MySql.Data/zlib/Zlib.cs b/Source/MySql.Data/zlib/Zlib.cs deleted file mode 100644 index 8cf60c95c..000000000 --- a/Source/MySql.Data/zlib/Zlib.cs +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) 2006, ComponentAce -// http://www.componentace.com -// 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 ComponentAce 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. - -/* -Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. - -2. 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. - -3. The names of the authors may not be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED 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 JCRAFT, -INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE 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. -*/ -/* -* This program is based on zlib-1.1.3, so all credit should go authors -* Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu) -* and contributors of zlib. -*/ -using System; -namespace zlib -{ - - sealed class zlibConst - { - private const System.String version_Renamed_Field = "1.0.2"; - public static System.String version() - { - return version_Renamed_Field; - } - - // compression levels - public const int Z_NO_COMPRESSION = 0; - public const int Z_BEST_SPEED = 1; - public const int Z_BEST_COMPRESSION = 9; - public const int Z_DEFAULT_COMPRESSION = (- 1); - - // compression strategy - public const int Z_FILTERED = 1; - public const int Z_HUFFMAN_ONLY = 2; - public const int Z_DEFAULT_STRATEGY = 0; - - public const int Z_NO_FLUSH = 0; - public const int Z_PARTIAL_FLUSH = 1; - public const int Z_SYNC_FLUSH = 2; - public const int Z_FULL_FLUSH = 3; - public const int Z_FINISH = 4; - - public const int Z_OK = 0; - public const int Z_STREAM_END = 1; - public const int Z_NEED_DICT = 2; - public const int Z_ERRNO = - 1; - public const int Z_STREAM_ERROR = - 2; - public const int Z_DATA_ERROR = - 3; - public const int Z_MEM_ERROR = - 4; - public const int Z_BUF_ERROR = - 5; - public const int Z_VERSION_ERROR = - 6; - } -} \ No newline at end of file diff --git a/Source/MySql.Web/Application.cs b/Source/MySql.Web/Application.cs deleted file mode 100644 index 083b9a613..000000000 --- a/Source/MySql.Web/Application.cs +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright © 2009, 2011, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; -using System.Configuration.Provider; -using MySql.Web.Properties; - -namespace MySql.Web.General -{ - internal class Application - { - private long _id; - private string _desc; - - public Application(string name, string desc) - { - Id = -1; - Name = name; - Description = desc; - } - public long Id - { - get { return _id; } - private set { _id = value; } - } - public string Name; - - public string Description - { - get { return _desc; } - private set { _desc = value; } - } - - public long FetchId(MySqlConnection connection) - { - if (Id == -1) - { - MySqlCommand cmd = new MySqlCommand( - @"SELECT id FROM my_aspnet_applications WHERE name=@name", connection); - cmd.Parameters.AddWithValue("@name", Name); - object id = cmd.ExecuteScalar(); - Id = id == null ? -1 : Convert.ToInt64(id); - } - return Id; - } - - /// - /// Creates the or fetch application id. - /// - /// Name of the application. - /// The application id. - /// The application desc. - /// The connection. - public long EnsureId(MySqlConnection connection) - { - // first try and retrieve the existing id - if (FetchId(connection) <= 0) - { - MySqlCommand cmd = new MySqlCommand( - "INSERT INTO my_aspnet_applications VALUES (NULL, @appName, @appDesc)", connection); - cmd.Parameters.AddWithValue("@appName", Name); - cmd.Parameters.AddWithValue("@appDesc", Description); - int recordsAffected = cmd.ExecuteNonQuery(); - if (recordsAffected != 1) - throw new ProviderException(Properties.Resources.UnableToCreateApplication); - - Id = cmd.LastInsertedId; - } - return Id; - } - } -} diff --git a/Source/MySql.Web/Install.cs b/Source/MySql.Web/Install.cs deleted file mode 100644 index 5cd03f764..000000000 --- a/Source/MySql.Web/Install.cs +++ /dev/null @@ -1,532 +0,0 @@ -// Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -#if !MONO && !PocketPC -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Configuration.Install; -using System.Collections; -using System.IO; -using Microsoft.Win32; -using System.Xml; -using System.Reflection; -using System.Security.Permissions; - -namespace MySql.Web.Security -{ - [RunInstaller(true)] - [PermissionSetAttribute(SecurityAction.InheritanceDemand, Name = "FullTrust")] - [PermissionSetAttribute(SecurityAction.LinkDemand, Name = "FullTrust")] - public class CustomInstaller : Installer - { - /// - /// When overridden in a derived class, performs the installation. - /// - /// An used to save information needed to perform a commit, rollback, or uninstall operation. - /// - /// The parameter is null. - /// - /// - /// An exception occurred in the event handler of one of the installers in the collection. - /// -or- - /// An exception occurred in the event handler of one of the installers in the collection. - /// - public override void Install(IDictionary stateSaver) - { - base.Install(stateSaver); - AddProviderToMachineConfig(); - } - - /// - /// When overridden in a derived class, removes an installation. - /// - /// An that contains the state of the computer after the installation was complete. - /// - /// The saved-state might have been corrupted. - /// - /// - /// An exception occurred while uninstalling. This exception is ignored and the uninstall continues. However, the application might not be fully uninstalled after the uninstallation completes. - /// - public override void Uninstall(IDictionary savedState) - { - base.Uninstall(savedState); - RemoveProviderFromMachineConfig(); - } - - private void AddProviderToMachineConfig() - { - object installRoot = Registry.GetValue( - @"HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\", - "InstallRoot", null); - if (installRoot == null) - throw new Exception("Unable to retrieve install root for .NET framework"); - UpdateMachineConfigs(installRoot.ToString(), true); - - string installRoot64 = installRoot.ToString(); - installRoot64 = installRoot64.Substring(0, installRoot64.Length - 1); - installRoot64 = string.Format("{0}64{1}", installRoot64, - Path.DirectorySeparatorChar); - if (Directory.Exists(installRoot64)) - UpdateMachineConfigs(installRoot64, true); - } - - private void UpdateMachineConfigs(string rootPath, bool add) - { - string[] dirs = new string[2] { "v2.0.50727", "v4.0.30319" }; - foreach (string frameworkDir in dirs) - { - string path = rootPath + frameworkDir; - - string configPath = String.Format(@"{0}\CONFIG", path); - if (Directory.Exists(configPath)) - { - if (add) - AddProviderToMachineConfigInDir(configPath); - else - RemoveProviderFromMachineConfigInDir(configPath); - } - } - } - - private void AddProviderToMachineConfigInDir(string path) - { - string configFile = String.Format(@"{0}\machine.config", path); - if (!File.Exists(configFile)) return; - - // now read the config file into memory - StreamReader sr = new StreamReader(configFile); - string configXML = sr.ReadToEnd(); - sr.Close(); - - // load the XML into the XmlDocument - XmlDocument doc = new XmlDocument(); - doc.LoadXml(configXML); - - AddDefaultConnectionString(doc); - AddMembershipProvider(doc); - AddRoleProvider(doc); - AddProfileProvider(doc); - AddSiteMapProvider(doc); - AddPersonalizationProvider(doc); - - // Save the document to a file and auto-indent the output. - XmlTextWriter writer = new XmlTextWriter(configFile, null); - writer.Formatting = Formatting.Indented; - doc.Save(writer); - writer.Flush(); - writer.Close(); - } - - private void AddDefaultConnectionString(XmlDocument doc) - { - // create our new node - XmlElement newNode = (XmlElement)doc.CreateNode(XmlNodeType.Element, "add", ""); - - // add the proper attributes - newNode.SetAttribute("name", "LocalMySqlServer"); - newNode.SetAttribute("connectionString", ""); - - XmlNodeList nodes = doc.GetElementsByTagName("connectionStrings"); - XmlNode connectionStringList = nodes[0]; - - bool alreadyThere = false; - foreach (XmlNode node in connectionStringList.ChildNodes) - { - string nameValue = node.Attributes["name"].Value; - if (nameValue == "LocalMySqlServer") - { - alreadyThere = true; - break; - } - } - - if (!alreadyThere) - connectionStringList.AppendChild(newNode); - } - - private void AddMembershipProvider(XmlDocument doc) - { - // create our new node - XmlElement newNode = (XmlElement)doc.CreateNode(XmlNodeType.Element, "add", ""); - - // add the proper attributes - newNode.SetAttribute("name", "MySQLMembershipProvider"); - - // add the type attribute by reflecting on the executing assembly - Assembly a = Assembly.GetExecutingAssembly(); - string type = String.Format("MySql.Web.Security.MySQLMembershipProvider, {0}", - a.FullName.Replace("Installers", "Web").Replace(".NET40", string.Empty)); - newNode.SetAttribute("type", type); - - newNode.SetAttribute("connectionStringName", "LocalMySqlServer"); - newNode.SetAttribute("enablePasswordRetrieval", "false"); - newNode.SetAttribute("enablePasswordReset", "true"); - newNode.SetAttribute("requiresQuestionAndAnswer", "true"); - newNode.SetAttribute("applicationName", "/"); - newNode.SetAttribute("requiresUniqueEmail", "false"); - newNode.SetAttribute("passwordFormat", "Clear"); - newNode.SetAttribute("maxInvalidPasswordAttempts", "5"); - newNode.SetAttribute("minRequiredPasswordLength", "7"); - newNode.SetAttribute("minRequiredNonalphanumericCharacters", "1"); - newNode.SetAttribute("passwordAttemptWindow", "10"); - newNode.SetAttribute("passwordStrengthRegularExpression", ""); - - XmlNodeList nodes = doc.GetElementsByTagName("membership"); - XmlNode providerList = nodes[0].FirstChild; - - foreach (XmlNode node in providerList.ChildNodes) - { - string typeValue = node.Attributes["type"].Value; - if (typeValue.StartsWith("MySql.Web.Security.MySQLMembershipProvider", StringComparison.OrdinalIgnoreCase)) - { - providerList.RemoveChild(node); - break; - } - } - - providerList.AppendChild(newNode); - } - - private void AddRoleProvider(XmlDocument doc) - { - // create our new node - XmlElement newNode = (XmlElement)doc.CreateNode(XmlNodeType.Element, "add", ""); - - // add the proper attributes - newNode.SetAttribute("name", "MySQLRoleProvider"); - - // add the type attribute by reflecting on the executing assembly - Assembly a = Assembly.GetExecutingAssembly(); - string type = String.Format("MySql.Web.Security.MySQLRoleProvider, {0}", - a.FullName.Replace("Installers", "Web").Replace(".NET40", string.Empty)); - newNode.SetAttribute("type", type); - - newNode.SetAttribute("connectionStringName", "LocalMySqlServer"); - newNode.SetAttribute("applicationName", "/"); - - XmlNodeList nodes = doc.GetElementsByTagName("roleManager"); - XmlNode providerList = nodes[0].FirstChild; - - foreach (XmlNode node in providerList.ChildNodes) - { - string typeValue = node.Attributes["type"].Value; - if (typeValue.StartsWith("MySql.Web.Security.MySQLRoleProvider", StringComparison.OrdinalIgnoreCase)) - { - providerList.RemoveChild(node); - break; - } - } - - providerList.AppendChild(newNode); - } - - private void AddProfileProvider(XmlDocument doc) - { - // create our new node - XmlElement newNode = (XmlElement)doc.CreateNode(XmlNodeType.Element, "add", ""); - - // add the proper attributes - newNode.SetAttribute("name", "MySQLProfileProvider"); - - // add the type attribute by reflecting on the executing assembly - Assembly a = Assembly.GetExecutingAssembly(); - string type = String.Format("MySql.Web.Profile.MySQLProfileProvider, {0}", - a.FullName.Replace("Installers", "Web").Replace(".NET40", string.Empty)); - newNode.SetAttribute("type", type); - - newNode.SetAttribute("connectionStringName", "LocalMySqlServer"); - newNode.SetAttribute("applicationName", "/"); - - XmlNodeList nodes = doc.GetElementsByTagName("profile"); - XmlNode providerList = nodes[0].FirstChild; - - foreach (XmlNode node in providerList.ChildNodes) - { - string typeValue = node.Attributes["type"].Value; - if (typeValue.StartsWith("MySql.Web.Profile.MySQLProfileProvider", StringComparison.OrdinalIgnoreCase)) - { - providerList.RemoveChild(node); - break; - } - } - - providerList.AppendChild(newNode); - } - - private void AddSiteMapProvider(XmlDocument doc) - { - // create our new node - XmlElement newNode = (XmlElement)doc.CreateNode(XmlNodeType.Element, "add", ""); - - // add the proper attributes - newNode.SetAttribute("name", "MySqlSiteMapProvider"); - - // add the type attribute by reflecting on the executing assembly - Assembly a = Assembly.GetExecutingAssembly(); - string type = String.Format("MySql.Web.SiteMap.MySqlSiteMapProvider, {0}", - a.FullName.Replace("Installers", "Web").Replace(".NET40", string.Empty)); - newNode.SetAttribute("type", type); - - newNode.SetAttribute("connectionStringName", "LocalMySqlServer"); - newNode.SetAttribute("applicationName", "/"); - - XmlNodeList nodes = doc.GetElementsByTagName("siteMap"); - - // It may not exists initially - if (nodes == null || nodes.Count == 0) - { - XmlNodeList nodesRoot = doc.GetElementsByTagName("system.web"); - XmlElement node = (XmlElement)doc.CreateNode(XmlNodeType.Element, "siteMap", ""); - nodesRoot[0].AppendChild(node); - } - if(nodes[0].ChildNodes.Count == 0) - { - XmlElement node2 = (XmlElement)doc.CreateNode(XmlNodeType.Element, "providers", ""); - nodes[0].AppendChild(node2); - } - XmlNode providerList = nodes[0].FirstChild; - - foreach (XmlNode node in providerList.ChildNodes) - { - string typeValue = node.Attributes["type"].Value; - if (typeValue.StartsWith("MySql.Web.SiteMap.MySqlSiteMapProvider", StringComparison.OrdinalIgnoreCase)) - { - providerList.RemoveChild(node); - break; - } - } - providerList.AppendChild(newNode); - } - - - private void AddPersonalizationProvider(XmlDocument doc) - { - XmlNode webpartNode = doc.GetElementsByTagName("webParts")[0]; - - //check if webpart node exists - if (webpartNode == null) - { - webpartNode = doc.CreateNode(XmlNodeType.Element, "webParts", ""); - doc.GetElementsByTagName("system.web")[0].AppendChild(webpartNode); - } - if (webpartNode.ChildNodes.Count == 0) - { - var personalizationNode = doc.CreateNode(XmlNodeType.Element, "personalization", ""); - webpartNode.AppendChild(personalizationNode); - } - if (webpartNode.FirstChild.ChildNodes.Count == 0) - { - webpartNode.FirstChild.AppendChild(doc.CreateNode(XmlNodeType.Element, "providers", "")); - } - - - // create our new node - XmlElement newNode = (XmlElement)doc.CreateNode(XmlNodeType.Element, "add", ""); - - // add the proper attributes - newNode.SetAttribute("name", "MySQLPersonalizationProvider"); - - // add the type attribute by reflecting on the executing assembly - Assembly a = Assembly.GetExecutingAssembly(); - string type = String.Format("MySql.Web.Personalization.MySqlPersonalizationProvider, {0}", - a.FullName.Replace("Installers", "Web").Replace(".NET40", string.Empty)); - newNode.SetAttribute("type", type); - - newNode.SetAttribute("connectionStringName", "LocalMySqlServer"); - newNode.SetAttribute("applicationName", "/"); - - XmlNode providerPersonalizationList = webpartNode.FirstChild.FirstChild; - - if (providerPersonalizationList!= null && providerPersonalizationList.ChildNodes!= null) - { - foreach (XmlNode node in providerPersonalizationList.ChildNodes) - { - string typeValue = node.Attributes["type"].Value; - if (typeValue.StartsWith("MySql.Web.Personalization.MySqlPersonalizationProvider", StringComparison.OrdinalIgnoreCase)) - { - providerPersonalizationList.RemoveChild(node); - break; - } - } - } - - providerPersonalizationList.AppendChild(newNode); - } - - - private void RemoveProviderFromMachineConfig() - { - object installRoot = Registry.GetValue( - @"HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\", - "InstallRoot", null); - if (installRoot == null) - throw new Exception("Unable to retrieve install root for .NET framework"); - UpdateMachineConfigs(installRoot.ToString(), false); - - string installRoot64 = installRoot.ToString(); - installRoot64 = installRoot64.Substring(0, installRoot64.Length - 1); - installRoot64 = string.Format("{0}64{1}", installRoot64, - Path.DirectorySeparatorChar); - if (Directory.Exists(installRoot64)) - UpdateMachineConfigs(installRoot64, false); - } - - private void RemoveProviderFromMachineConfigInDir(string path) - { - string configFile = String.Format(@"{0}\machine.config", path); - if (!File.Exists(configFile)) return; - - // now read the config file into memory - StreamReader sr = new StreamReader(configFile); - string configXML = sr.ReadToEnd(); - sr.Close(); - - // load the XML into the XmlDocument - XmlDocument doc = new XmlDocument(); - doc.LoadXml(configXML); - - RemoveDefaultConnectionString(doc); - RemoveMembershipProvider(doc); - RemoveRoleProvider(doc); - RemoveProfileProvider(doc); - RemoveSiteMapProvider(doc); - RemovePersonalizationProvider(doc); - - // Save the document to a file and auto-indent the output. - XmlTextWriter writer = new XmlTextWriter(configFile, null); - writer.Formatting = Formatting.Indented; - doc.Save(writer); - writer.Flush(); - writer.Close(); - } - - private void RemoveDefaultConnectionString(XmlDocument doc) - { - XmlNodeList nodes = doc.GetElementsByTagName("connectionStrings"); - if (nodes.Count == 0) return; - XmlNode connectionStringList = nodes[0]; - foreach (XmlNode node in connectionStringList.ChildNodes) - { - string name = node.Attributes["name"].Value; - if (name == "LocalMySqlServer") - { - connectionStringList.RemoveChild(node); - break; - } - } - } - - private void RemoveMembershipProvider(XmlDocument doc) - { - XmlNodeList nodes = doc.GetElementsByTagName("membership"); - if (nodes.Count == 0) return; - XmlNode providersNode = nodes[0].FirstChild; - foreach (XmlNode node in providersNode.ChildNodes) - { - string name = node.Attributes["name"].Value; - if (name == "MySQLMembershipProvider") - { - providersNode.RemoveChild(node); - break; - } - } - } - - private void RemoveRoleProvider(XmlDocument doc) - { - XmlNodeList nodes = doc.GetElementsByTagName("roleManager"); - if (nodes.Count == 0) return; - XmlNode providersNode = nodes[0].FirstChild; - foreach (XmlNode node in providersNode.ChildNodes) - { - string name = node.Attributes["name"].Value; - if (name == "MySQLRoleProvider") - { - providersNode.RemoveChild(node); - break; - } - } - } - - private void RemoveProfileProvider(XmlDocument doc) - { - XmlNodeList nodes = doc.GetElementsByTagName("profile"); - if (nodes.Count == 0) return; - XmlNode providersNode = nodes[0].FirstChild; - foreach (XmlNode node in providersNode.ChildNodes) - { - string name = node.Attributes["name"].Value; - if (name == "MySQLProfileProvider") - { - providersNode.RemoveChild(node); - break; - } - } - } - - private void RemoveSiteMapProvider(XmlDocument doc) - { - XmlNodeList nodes = doc.GetElementsByTagName("siteMap"); - if (nodes.Count == 0 || nodes[0].FirstChild == null) return; - XmlNode providersNode = nodes[0].FirstChild; - foreach (XmlNode node in providersNode.ChildNodes) - { - string name = node.Attributes["name"].Value; - if ( string.Compare( name, "MySqlSiteMapProvider", StringComparison.OrdinalIgnoreCase ) == 0 ) - { - providersNode.RemoveChild(node); - break; - } - } - if (providersNode.ChildNodes.Count == 0 - && nodes[0].ChildNodes.Count == 1) - { - nodes[0].ParentNode.RemoveChild(nodes[0]); - } - } - - private void RemovePersonalizationProvider(XmlDocument doc) - { - XmlNodeList nodes = doc.GetElementsByTagName("personalization"); - if (nodes.Count == 0 || nodes[0].FirstChild == null) return; - XmlNode providersNode = nodes[0].FirstChild; - foreach (XmlNode node in providersNode.ChildNodes) - { - string name = node.Attributes["name"].Value; - if (name == "MySQLPersonalizationProvider") - { - providersNode.RemoveChild(node); - break; - } - } - if (providersNode.ChildNodes.Count == 0 - && nodes[0].ChildNodes.Count == 1 - && nodes[0].ParentNode.ChildNodes.Count == 1) - { - nodes[0].ParentNode.ParentNode.RemoveChild(nodes[0].ParentNode); - } - } - } -} - -#endif \ No newline at end of file diff --git a/Source/MySql.Web/MySql.Web.xproj b/Source/MySql.Web/MySql.Web.xproj deleted file mode 100644 index adbba5621..000000000 --- a/Source/MySql.Web/MySql.Web.xproj +++ /dev/null @@ -1,18 +0,0 @@ - - - - 14.0.25420 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 644c0442-74d1-4cea-8b5b-b70099d4ccb2 - MySql.Web - .\obj - .\bin\ - - - 2.0 - - - \ No newline at end of file diff --git a/Source/MySql.Web/MySqlWebSecurity.cs b/Source/MySql.Web/MySqlWebSecurity.cs deleted file mode 100644 index 09d88271c..000000000 --- a/Source/MySql.Web/MySqlWebSecurity.cs +++ /dev/null @@ -1,478 +0,0 @@ -// Copyright © 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Configuration; -using System.Text; -using System.Web; -using System.Web.Security; -using System.Web.Routing; -using System.Web.WebPages; -using MySql.Web.Security; -using System.Collections.Specialized; -using System.Net; -using MySql.Web.Properties; - -namespace MySql.Web.Security -{ - public static class MySqlWebSecurity - { - public static readonly string EnableSimpleMembershipKey = "enableSimpleMembership"; - private static readonly string MySqlMembershipProviderName = "MySqlMembershipProvider"; - private static readonly string MySqlRoleProviderName = "MySQLRoleProvider"; - - #region Public - /// - /// Change the password for the user provided - /// - /// User name - /// Current pasword - /// New Password - /// - public static bool ChangePassword(string userName, string oldPassword, string newPassword) - { - ValidProvider(); - var user = Membership.GetUser(userName, true); - return user.ChangePassword(oldPassword, newPassword); - } - - /// - /// Confirms user by confirmation token - /// - /// Confirmation token - /// If user was confirmed - public static bool ConfirmAccount(string confirmationToken) - { - var provider = ValidProvider(); - return provider.ConfirmAccount(confirmationToken); - } - - /// - /// Confirms user by confirmation token and user name - /// - /// User name - /// Confirmation token - /// If user was confirmed - public static bool ConfirmAccount(string userName, string confirmationToken) - { - var provider = ValidProvider(); - return provider.ConfirmAccount(userName, confirmationToken); - } - - /// - /// Create user account - /// - /// User Name - /// User password - /// Confirmation token is required? - /// Confirmation token if required - public static string CreateAccount(string userName, string password, bool requireConfirmationToken = false) - { - var provider = ValidProvider(); - return provider.CreateAccount(userName, password, requireConfirmationToken); - } - - /// - /// Create user and account - /// - /// User Name - /// User Password - /// Additional data for user table - /// Confirmation token is required? - /// Confirmation token if required - public static string CreateUserAndAccount(string userName, string password, object additionalUserAttributes = null, bool requireConfirmationToken = false) - { - var provider = ValidProvider(); - IDictionary userAttrs = additionalUserAttributes as RouteValueDictionary; - - if (userAttrs == null && additionalUserAttributes != null) - { - var attrs = additionalUserAttributes as IDictionary; - userAttrs = attrs != null ? new RouteValueDictionary(attrs) : new RouteValueDictionary(additionalUserAttributes); - } - - return provider.CreateUserAndAccount(userName, password, requireConfirmationToken, userAttrs); - } - - /// - /// Get the date when the specified user was created - /// - /// User Name - /// Date created or minimum date value if the user was not found - public static DateTime GetCreateDate(string userName) - { - var provider = ValidProvider(); - return provider.GetCreateDate(userName); - } - - /// - /// Get last date when password fails - /// - /// User Name - /// Last failure date or minimum date value if the user was not found - public static DateTime GetLastPasswordFailureDate(string userName) - { - var provider = ValidProvider(); - return provider.GetLastPasswordFailureDate(userName); - } - - /// - /// Get date when password was changed - /// - /// User Name - /// Last password changed date or minimum date value if the user was not found - public static DateTime GetPasswordChangedDate(string userName) - { - var provider = ValidProvider(); - return provider.GetPasswordChangedDate(userName); - } - - /// - /// Password failures since last success - /// - /// User Name - /// Number of failures since last success - public static int GetPasswordFailuresSinceLastSuccess(string userName) - { - var provider = ValidProvider(); - return provider.GetPasswordFailuresSinceLastSuccess(userName); - } - - /// - /// Generates password reset token for confirmed user - /// - /// User Name - /// Time that the token will be valid - /// Token generated or null if the user is not confirmed or does not has a token - public static string GeneratePasswordResetToken(string userName, int tokenExpirationInMinutesFromNow = 1440) - { - var provider = ValidProvider(); - return provider.GeneratePasswordResetToken(userName, tokenExpirationInMinutesFromNow); - } - - /// - /// Get user id - /// - /// User Name - /// User Id, -1 if user doesn't exists - public static int GetUserId(string userName) - { - ValidProvider(); - var user = Membership.GetUser(userName); - return user != null ? (int)user.ProviderUserKey : -1; - } - - /// - /// Get User Id from password reset token - /// - /// Reset token - /// User Id, 0 if user dosn't exists - public static int GetUserIdFromPasswordResetToken(string resetToken) - { - var provider = ValidProvider(); - return provider.GetUserIdFromPasswordResetToken(resetToken); - } - - /// - /// Initialize the simple membership provider with the values given - /// - /// Connection string name defined in config file - /// Table name defined to create new users - /// Column name defined that will store the user id - /// Column name defined that will store the user name - /// Create tables? - public static void InitializeDatabaseConnection(string connectionStringName, string userTableName, string userIdColumn, string userNameColumn, bool createTables, bool checkIfInitialized = false) - { - InitializeMembershipProvider(connectionStringName, null, null, userTableName, userIdColumn, userNameColumn, createTables, checkIfInitialized); - InitializeRoleProvider(connectionStringName, null, null, userTableName, userIdColumn, userNameColumn, createTables, checkIfInitialized); - Initialized = true; - } - - public static void InitializeDatabaseConnection(string connectionString, string providerName, string userTableName, string userIdColumn, string userNameColumn, bool createTables, bool checkIfInitialized = false) - { - InitializeMembershipProvider(null, connectionString, providerName, userTableName, userIdColumn, userNameColumn, createTables, checkIfInitialized); - InitializeRoleProvider(null, connectionString, providerName, userTableName, userIdColumn, userNameColumn, createTables, checkIfInitialized); - Initialized = true; - } - - public static bool IsAccountLockedOut(string userName, int allowedPasswordAttempts, int intervalInSeconds) - { - return IsAccountLockedOut(userName, allowedPasswordAttempts, TimeSpan.FromSeconds(intervalInSeconds)); - } - - public static bool IsAccountLockedOut(string userName, int allowedPasswordAttempts, TimeSpan interval) - { - var provider = ValidProvider(); - return (provider.GetUser(userName, false) != null && provider.GetPasswordFailuresSinceLastSuccess(userName) > allowedPasswordAttempts && provider.GetLastPasswordFailureDate(userName).Add(interval) > DateTime.UtcNow); - } - - public static bool IsConfirmed(string userName) - { - var provider = ValidProvider(); - return provider.IsConfirmed(userName); - } - - public static bool IsCurrentUser(string userName) - { - ValidProvider(); - return string.Equals(CurrentUserName, userName, StringComparison.OrdinalIgnoreCase); - } - - public static bool IsUseLoggedOn(int userId) - { - ValidProvider(); - return CurrentUserId == userId; - } - - public static bool Login(string userName, string password, bool createPersistentCookie = false) - { - var curentProvider = ValidProvider(); - bool loginSuccessful = false; - if (curentProvider != null) - loginSuccessful = curentProvider.ValidateUser(userName, password); - else - loginSuccessful = Membership.ValidateUser(userName, password); - - if (loginSuccessful) - { - FormsAuthentication.SetAuthCookie(userName, createPersistentCookie); - } - return loginSuccessful; - } - - public static void Logout() - { - ValidProvider(); - FormsAuthentication.SignOut(); - } - - public static void RequireAuthenticatedUser() - { - ValidProvider(); - var user = CurrentContext.User; - if (user == null || !user.Identity.IsAuthenticated) - { - CurrentContext.Response.SetStatus(HttpStatusCode.Unauthorized); - } - } - - public static void RequireRoles(params string[] roles) - { - ValidProvider(); - foreach (var role in roles) - { - if (!Roles.IsUserInRole(CurrentUserName, role)) - { - CurrentContext.Response.SetStatus(HttpStatusCode.Unauthorized); - } - } - } - - public static void RequiresUser(int userId) - { - ValidProvider(); - if (!IsUseLoggedOn(userId)) - { - CurrentContext.Response.SetStatus(HttpStatusCode.Unauthorized); - } - } - - public static void RequiresUser(string userName) - { - ValidProvider(); - if (!string.Equals(CurrentUserName, userName, StringComparison.OrdinalIgnoreCase)) - { - CurrentContext.Response.SetStatus(HttpStatusCode.Unauthorized); - } - } - - public static bool ResetPassword(string passwordResetToken, string newPassword) - { - var provider = ValidProvider(); - return provider.ResetPasswordWithToken(passwordResetToken, newPassword); - } - - public static bool UserExists(string username) - { - var curentProvider = ValidProvider(); - if (curentProvider != null) - return curentProvider.GetUser(username, false) != null; - else - return Membership.GetUser(username) != null; - } - #endregion - - #region Properties - public static bool Initialized - { - get; - private set; - } - - public static int CurrentUserId - { - get { return GetUserId(CurrentUserName); } - } - - public static string CurrentUserName - { - get { return CurrentContext.User.Identity.Name; } - } - - public static bool HasUserId - { - get { return CurrentUserId != -1; } - } - - public static bool IsAuthenticated - { - get { return CurrentContext.Request.IsAuthenticated; } - } - #endregion - - #region Private_Internal - - private static MySqlSimpleMembershipProvider CreateSimpleMembershipProvider(string name, MySQLMembershipProvider currentDefault) - { - MySqlSimpleMembershipProvider simpleProvider = new MySqlSimpleMembershipProvider(currentDefault); - NameValueCollection config = new NameValueCollection(); - simpleProvider.Initialize(name, config); - return simpleProvider; - } - - private static MySqlSimpleRoleProvider CreateSimpleRoleProvider(string name, MySQLRoleProvider currentDefault) - { - MySqlSimpleRoleProvider simpleProvider = new MySqlSimpleRoleProvider(currentDefault); - NameValueCollection config = new NameValueCollection(); - simpleProvider.Initialize(name, config); - return simpleProvider; - } - - private static MySqlSimpleMembershipProvider ValidProvider() - { - if (_provider.Initialized) - return _provider; - - throw new Exception(Resources.SimpleMembershipNotInitialized); - } - - private static void InitializeMembershipProvider(string connectionStringName, string connectionString, string providerName, string userTableName, string userIdColumn, string userNameColumn, bool createTables, bool checkIfInitialized = false) - { - if (checkIfInitialized) - { - if (_provider != null) - return; - } - - MySqlSimpleMembershipProvider simpleMembership = new MySqlSimpleMembershipProvider(Membership.Provider); - if (_provider != null && _provider.Initialized) - { - throw new InvalidOperationException(Resources.SimpleMembershipAlreadyInitialized); - } - simpleMembership.ConnectionStringName = connectionStringName; - simpleMembership.ConnectionString = connectionString; - simpleMembership.ProviderName = providerName; - simpleMembership.UserTableName = userTableName; - simpleMembership.UserIdColumn = userIdColumn; - simpleMembership.UserNameColumn = userNameColumn; - if (createTables) - { - simpleMembership.CreateTables(); - } - else - { - simpleMembership.ValidateUserTable(); - } - simpleMembership.Initialized = true; - _provider = simpleMembership; - } - - private static void InitializeRoleProvider(string connectionStringName, string connectionString, string providerName, string userTableName, string userIdColumn, string userNameColumn, bool createTables, bool checkIfInitialized = false) - { - if (checkIfInitialized) - { - if (_roleprovider != null) - return; - } - - MySqlSimpleRoleProvider roleProvider = new MySqlSimpleRoleProvider(Roles.Provider); - if (_roleprovider != null && _roleprovider.Initialized) - { - throw new InvalidOperationException(Resources.SimpleRoleAlreadyInitialized); - } - roleProvider.ConnectionStringName = connectionStringName; - roleProvider.ConnectionString = connectionString; - roleProvider.UserTableName = userTableName; - roleProvider.UserIdColumn = userIdColumn; - roleProvider.UserNameColumn = userNameColumn; - if (createTables) - { - roleProvider.CreateTables(); - } - roleProvider.Initialized = true; - _roleprovider = roleProvider; - } - - private static bool IsSimpleMembershipEnabled() - { - string config = ConfigurationManager.AppSettings[EnableSimpleMembershipKey]; - bool isEnabled = false; - if (!string.IsNullOrEmpty(config)) - { - bool.TryParse(config, out isEnabled); - } - return isEnabled; - } - - internal static void PreAppStartInit() - { - if (IsSimpleMembershipEnabled()) - { - MembershipProvider provider = Membership.Providers[MySqlMembershipProviderName]; - if (provider != null) - { - MySqlSimpleMembershipProvider mysqlProvider = CreateSimpleMembershipProvider(MySqlMembershipProviderName, (MySQLMembershipProvider)provider); - Membership.Providers.Remove(MySqlMembershipProviderName); - Membership.Providers.Add(mysqlProvider); - } - Roles.Enabled = true; - RoleProvider roleProvider = Roles.Providers[MySqlRoleProviderName]; - if (roleProvider != null) - { - MySqlSimpleRoleProvider simpleRoleProv = CreateSimpleRoleProvider(MySqlRoleProviderName, (MySQLRoleProvider)roleProvider); - Roles.Providers.Remove(MySqlRoleProviderName); - Roles.Providers.Add(simpleRoleProv); - } - } - } - - internal static HttpContextBase CurrentContext - { - get { return new HttpContextWrapper(HttpContext.Current); } - } - - private static MySqlSimpleMembershipProvider _provider; - private static MySqlSimpleRoleProvider _roleprovider; - #endregion - } -} diff --git a/Source/MySql.Web/PersonalizationConnectionHelper.cs b/Source/MySql.Web/PersonalizationConnectionHelper.cs deleted file mode 100644 index 63315b5eb..000000000 --- a/Source/MySql.Web/PersonalizationConnectionHelper.cs +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright © 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using System.Web.Hosting; -using MySql.Data.MySqlClient; - -namespace MySql.Web -{ - internal sealed class MySQLPersonalizationConnectionHelper - { - private MySqlConnection _connection; - - public MySqlConnection Connection - { - get { - return _connection; - } - } - - public bool Opened - { - get { - return _connection.State == System.Data.ConnectionState.Open; - } - } - - internal MySQLPersonalizationConnectionHelper(string connectionString) - { - if (string.IsNullOrEmpty(connectionString)) - { - throw new ArgumentNullException("connectionString"); - } - - _connection = new MySqlConnection(connectionString); - } - - internal void OpenConnection(bool impersonateContext) - { - if (_connection.State != System.Data.ConnectionState.Open) - { - if (impersonateContext) - { - using (HostingEnvironment.Impersonate()) - { - _connection.Open(); - } - } - else - _connection.Open(); - } - } - - internal void CloseConnection() - { - if (_connection.State != System.Data.ConnectionState.Closed) - _connection.Close(); - } - - } -} diff --git a/Source/MySql.Web/PersonalizationProvider.cs b/Source/MySql.Web/PersonalizationProvider.cs deleted file mode 100644 index e9decf604..000000000 --- a/Source/MySql.Web/PersonalizationProvider.cs +++ /dev/null @@ -1,580 +0,0 @@ -// Copyright © 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System; -using System.Collections.Generic; -using System.Configuration; -using System.Configuration.Provider; -using System.Diagnostics; -using System.Security.Cryptography; -using System.Text; -using System.Web; -using System.Web.Configuration; -using System.Web.Hosting; -using System.Web.UI.WebControls.WebParts; -using MySql.Data.MySqlClient; -using MySql.Web.Common; -using MySql.Web.General; - -namespace MySql.Web.Personalization -{ - /// - /// Implementation for Personalization Provider - /// to use web parts in ASP.NET websites - /// - public class MySqlPersonalizationProvider : PersonalizationProvider - { - - string connectionString; - ConnectionStringSettings connectionStringSettings; - - - string eventSource = "MySQLPersonalizationProvider"; - string eventLog = "Application"; - string exceptionMessage = "An exception occurred. Please check the event log."; - bool writeExceptionsToEventLog = false; - - Application app; - - /// - /// Set or gets the Application Name - /// - public override string ApplicationName - { - get { return app.Name; } - set { app.Name = value; } - } - - private long ApplicationId - { - get { return app.Id; } - } - - private enum ResetUserStateMode { - PerInactiveDate, - PerPaths, - PerUsers - } - - - /// - /// Initializes settings values for Personalization Provider - /// - /// - /// - public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config) - { - if (config == null) - throw new ArgumentNullException("config"); - - if (string.IsNullOrEmpty(name)) - { - name = "MySqlPersonalizationProvider"; - } - - if (string.IsNullOrEmpty(config["description"])) - { - config.Remove("description"); - config.Add("description", "MySql Personalization provider"); - } - - base.Initialize(name, config); - - string applicationName = HostingEnvironment.ApplicationVirtualPath; - if (!String.IsNullOrEmpty(config["applicationName"])) - applicationName = config["applicationName"]; - - - if (!(config["writeExceptionsToEventLog"] == null)) - { - if (config["writeExceptionsToEventLog"].ToUpper() == "TRUE") - { - writeExceptionsToEventLog = true; - } - } - - connectionStringSettings = ConfigurationManager.ConnectionStrings[config["connectionStringName"]]; - if (connectionStringSettings != null) - connectionString = connectionStringSettings.ConnectionString.Trim(); - else - connectionString = ""; - - if (String.IsNullOrEmpty(connectionString)) return; - - // Make sure we have the correct schema. - SchemaManager.CheckSchema(connectionString, config); - - app = new Application(applicationName, base.Description); - - // Get the application id. - try - { - using (MySqlConnection conn = new MySqlConnection(connectionString)) - { - conn.Open(); - app.EnsureId(conn); - } - } - catch (Exception ex) - { - if (writeExceptionsToEventLog) - WriteToEventLog(ex, "MySQLPersonalizationProvider - Initialize"); - throw; - } - } - - /// - /// Returns a collection of PersonalizationStateInfo objects containing administrative information regarding records in the database that match the specified criteria - /// -for example, records corresponding to users named Jeff* that have been modified since January 1, 2005. Wildcard support is provider-dependent. - /// - /// - /// - /// - /// - /// - /// - public override PersonalizationStateInfoCollection FindState(PersonalizationScope scope, PersonalizationStateQuery query, int pageIndex, int pageSize, out int totalRecords) - { - - if (query == null) - throw new ArgumentNullException("query"); - - if (pageIndex < 0) - throw new ArgumentOutOfRangeException("pageIndex"); - - if (pageSize < 1) - throw new ArgumentOutOfRangeException("pageSize"); - - if (query.PathToMatch == null) - throw new ArgumentNullException("query.PathToMatch"); - - if (query.UsernameToMatch == null) - throw new ArgumentNullException("query.UserToMatch"); - - DateTime inactiveSinceDate = query.UserInactiveSinceDate; - - if (scope == PersonalizationScope.User) - { - return FindUserState(query.PathToMatch.Trim(), inactiveSinceDate, query.UsernameToMatch.Trim(), pageIndex, pageSize, out totalRecords); - } - else - { - return FindSharedState(query.PathToMatch.Trim(), pageIndex, pageSize, out totalRecords); - } - - } - - - /// - /// Returns the number of records in the database that match the specified criteria- - /// for example, records corresponding to users named Jeff* that haven't been modified since January 1, 2005. Wildcard support is provider-dependent. - /// - /// - /// - /// - public override int GetCountOfState(PersonalizationScope scope, PersonalizationStateQuery query) - { - if (query == null) - throw new ArgumentNullException("query"); - - if (scope == PersonalizationScope.User) - { - return GetCountUserState(query.PathToMatch.Trim(), query.UserInactiveSinceDate, query.UsernameToMatch); - } - else - { - return GetCountOfSharedState(query.PathToMatch.Trim()); - } - } - - - /// - /// Retrieves personalization state as opaque blobs from the data source. Retrieves both shared and user personalization state corresponding to a specified user and a specified page. - /// - /// - /// - /// - /// - /// - protected override void LoadPersonalizationBlobs(WebPartManager webPartManager, string path, string userName, ref Byte[] sharedDataBlob, ref Byte[] userDataBlob) - { - sharedDataBlob = null; - userDataBlob = null; - MySQLPersonalizationConnectionHelper connection = new MySQLPersonalizationConnectionHelper(connectionString); - connection.OpenConnection(true); - try - { - sharedDataBlob = PersonalizationProviderProcedures.my_aspnet_PersonalizationAllUsers_GetPageSettings( - ApplicationId, path, connection); - if (!String.IsNullOrEmpty(userName)) - { - userDataBlob = PersonalizationProviderProcedures.my_aspnet_PersonalizationPerUser_GetPageSettings( - ApplicationId, path, userName, DateTime.UtcNow, connection); - } - - connection.CloseConnection(); - } - catch (Exception ex) - { - if (writeExceptionsToEventLog) - WriteToEventLog(ex, "MySQLPersonalizationProvider - LoadPersonazalitionBlobs"); - throw; - } - finally - { - connection.CloseConnection(); - } - } - /// - /// Deletes personalization state corresponding to a specified user and a specified page from the database. - /// - /// - /// - /// - protected override void ResetPersonalizationBlob(WebPartManager webPartManager, string path, string userName) - { - MySQLPersonalizationConnectionHelper connection = new MySQLPersonalizationConnectionHelper(connectionString); - connection.OpenConnection(true); - try - { - if (string.IsNullOrEmpty(userName)) - { - PersonalizationProviderProcedures.my_aspnet_PersonalizationAllUsers_ResetPageSettings(ApplicationId, path, connection); - } - else - { - PersonalizationProviderProcedures.my_aspnet_PersonalizationPerUser_ResetPageSettings(ApplicationId, userName, path, DateTime.UtcNow, connection); - } - } - catch (Exception ex) - { - if (writeExceptionsToEventLog) - WriteToEventLog(ex, "MySQLPersonalizationProvider - ResetPersonalizationBlob"); - throw; - } - finally - { - connection.CloseConnection(); - } - } - - /// - /// Deletes personalization state corresponding to the specified users and specified pages from the database - /// - /// - /// - /// - /// - public override int ResetState(PersonalizationScope scope, string[] paths, string[] usernames) - { - - bool hasPaths = !(paths == null || paths.Length == 0); - bool hasUsers = !(usernames == null || usernames.Length == 0); - - var count = 0; - - var connection = new MySQLPersonalizationConnectionHelper(connectionString); - connection.OpenConnection(true); - - if (scope == PersonalizationScope.Shared) - { - try - { - if (paths == null) // reset all state - { - return PersonalizationProviderProcedures.my_aspnet_PersonalizationAdministration_DeleteAllState(true, ApplicationId, connection); - } - else - { - return PersonalizationProviderProcedures.my_aspnet_PersonalizationAdministration_ResetSharedState(ApplicationId, paths, connection); - } - } - catch (Exception ex) - { - if (writeExceptionsToEventLog) - WriteToEventLog(ex, "MySQLPersonalizationProvider - ResetState"); - throw; - } - finally - { - connection.CloseConnection(); - } - } - else - { - if (!hasPaths && !hasUsers) - { - count = PersonalizationProviderProcedures.my_aspnet_PersonalizationAdministration_DeleteAllState(true, ApplicationId, connection); - } - else if (!hasUsers) - { - count = ResetUserState(ResetUserStateMode.PerPaths, DateTime.MaxValue, paths, null); - } - else - { - count = ResetUserState(ResetUserStateMode.PerUsers, DateTime.MaxValue, paths, usernames); - } - } - return count; - } - - - /// - /// Deletes user personalization state corresponding to the specified pages and that hasn't been updated since a specified date from the database. - /// - /// - /// - /// - public override int ResetUserState(string path, DateTime userInactiveSinceDate) - { - if (string.IsNullOrEmpty(path)) - return 0; - - string [] paths = (path == null) ? null : new string [] {path}; - try - { - return ResetUserState(ResetUserStateMode.PerInactiveDate, userInactiveSinceDate, paths, null); - } - catch (Exception ex) - { - if (writeExceptionsToEventLog) - WriteToEventLog(ex, "MySQLPersonalizationProvider - ResetUserState"); - throw; - } - } - - /// - /// Writes personalization state corresponding to a specified user and a specified page as an opaque blob to the database. - /// If userName is null, then the personalization state is shared state and is not keyed by user name. - /// - /// - /// - /// - /// - protected override void SavePersonalizationBlob(WebPartManager webPartManager, string path, string userName, Byte[] dataBlob) - { - - MySQLPersonalizationConnectionHelper connection = new MySQLPersonalizationConnectionHelper(connectionString); - - try - { - MySqlCommand cmd = new MySqlCommand(); - connection.OpenConnection(true); - if (!string.IsNullOrEmpty(userName)) - { - PersonalizationProviderProcedures.my_aspnet_PersonalizationPerUser_SetPageSettings(ApplicationId, userName, path, dataBlob, DateTime.UtcNow, connection); - } - else - { - PersonalizationProviderProcedures.my_aspnet_PersonalizationAllUsers_SetPageSettings(ApplicationId, path, dataBlob, DateTime.UtcNow, connection); - } - } - catch (Exception ex) - { - if (writeExceptionsToEventLog) - WriteToEventLog(ex, "MySQLPersonalizationProvider - SavePersonalizationBlob"); - throw; - } - } - - private PersonalizationStateInfoCollection FindSharedState(string path, int pageIndex, int pageSize, out int totalRecords) - { - MySQLPersonalizationConnectionHelper connection = new MySQLPersonalizationConnectionHelper(connectionString); - - try - { - MySqlCommand cmd = new MySqlCommand(); - connection.OpenConnection(true); - totalRecords = PersonalizationProviderProcedures.myaspnet_PersonalizationAdministration_FindState(true, ApplicationId, ApplicationName, pageIndex, pageSize, - path, null, DateTime.MinValue, connection, ref cmd); - - PersonalizationStateInfoCollection sharedStateInfoCollection = new PersonalizationStateInfoCollection(); - - using (var reader = cmd.ExecuteReader()) - { - while (reader.Read()) - { - string pathQuery = reader.GetString("Path"); - DateTime lastUpdatedDate = (reader.IsDBNull(1)) ? DateTime.MinValue : - DateTime.SpecifyKind(reader.GetDateTime(1), DateTimeKind.Utc); - int size = (reader.IsDBNull(2)) ? 0 : reader.GetInt32("SharedDataLength"); - int userDataLength = (reader.IsDBNull(3)) ? 0 : reader.GetInt32("UserDataLength"); - int userCount = (reader.IsDBNull(4)) ? 0 : reader.GetInt32("UserCount"); - - sharedStateInfoCollection.Add(new SharedPersonalizationStateInfo( - pathQuery, lastUpdatedDate, size, userDataLength, userCount)); - } - } - connection.CloseConnection(); - return sharedStateInfoCollection; - } - catch (Exception ex) - { - if (writeExceptionsToEventLog) - WriteToEventLog(ex, "MySQLPersonalizationProvider - FindSharedState"); - throw; - } - finally - { - connection.CloseConnection(); - } - } - - - - private PersonalizationStateInfoCollection FindUserState(string path, DateTime inactiveSinceDate, string userName, int pageIndex, int pageSize, out int totalRecords) - { - MySQLPersonalizationConnectionHelper connection = new MySQLPersonalizationConnectionHelper(connectionString); - - try - { - - MySqlCommand cmd = new MySqlCommand(); - connection.OpenConnection(true); - totalRecords = PersonalizationProviderProcedures.myaspnet_PersonalizationAdministration_FindState(false, ApplicationId, ApplicationName, pageIndex, pageSize, - path, userName, inactiveSinceDate, connection, ref cmd); - - PersonalizationStateInfoCollection stateInfoCollection = new PersonalizationStateInfoCollection(); - - using(var reader = cmd.ExecuteReader()) - { - while (reader.Read()) - { - string pathQuery = reader.GetString("Path"); - DateTime lastUpdatedDate = DateTime.SpecifyKind(reader.GetDateTime("LastUpdatedDate"), DateTimeKind.Utc); - int size = reader.GetInt32("Size"); - string usernameQuery = reader.GetString("name"); - DateTime lastActivityDate = DateTime.SpecifyKind(reader.GetDateTime("LastActivityDate"), DateTimeKind.Utc); - stateInfoCollection.Add(new UserPersonalizationStateInfo(pathQuery, lastActivityDate, size, usernameQuery, lastActivityDate)); - } - } - connection.CloseConnection(); - - return stateInfoCollection; - } - catch (Exception ex) - { - if (writeExceptionsToEventLog) - WriteToEventLog(ex, "MySQLPersonalizationProvider - FindUserState"); - throw; - } - finally - { - connection.CloseConnection(); - } - } - - - private int GetCountOfSharedState(string path) - { - MySQLPersonalizationConnectionHelper connection = new MySQLPersonalizationConnectionHelper(connectionString); - try - { - MySqlCommand cmd = new MySqlCommand(); - connection.OpenConnection(true); - return PersonalizationProviderProcedures.myaspnet_PersonalizationAdministration_GetCountOfState( - true, ApplicationName, ApplicationId, path, - null, DateTime.MinValue, connection); - } - catch (Exception ex) - { - if (writeExceptionsToEventLog) - WriteToEventLog(ex, "MySQLPersonalizationProvider - GetCountOfSharedState"); - throw; - } - finally - { - connection.CloseConnection(); - } - } - - private int GetCountUserState(string path, DateTime userInactiveSinceDate, string userName) - { - MySQLPersonalizationConnectionHelper connection = new MySQLPersonalizationConnectionHelper(connectionString); - try - { - MySqlCommand cmd = new MySqlCommand(); - connection.OpenConnection(true); - return PersonalizationProviderProcedures.myaspnet_PersonalizationAdministration_GetCountOfState( - false, ApplicationName, ApplicationId, path, - userName, userInactiveSinceDate, connection); - } - catch (Exception ex) - { - if (writeExceptionsToEventLog) - WriteToEventLog(ex, "MySQLPersonalizationProvider - GetCountUserState"); - throw; - } - finally - { - connection.CloseConnection(); - } - } - - private int ResetUserState(ResetUserStateMode mode, DateTime userInactiveSinceDate, string[] paths, string[] usernames) - { - var connection = new MySQLPersonalizationConnectionHelper(connectionString); - connection.OpenConnection(true); - - try - { - if (ResetUserStateMode.PerInactiveDate == mode) - { - return PersonalizationProviderProcedures.my_aspnet_PersonalizationAdministration_ResetUserState(ApplicationId, userInactiveSinceDate.ToUniversalTime(), null, null, connection); - } - if (ResetUserStateMode.PerPaths == mode) - { - return PersonalizationProviderProcedures.my_aspnet_PersonalizationAdministration_ResetUserState(ApplicationId, userInactiveSinceDate, null, paths, connection); - } - else - { - return PersonalizationProviderProcedures.my_aspnet_PersonalizationAdministration_ResetUserState(ApplicationId, userInactiveSinceDate, usernames, paths, connection); - } - } - catch (Exception ex) - { - if (writeExceptionsToEventLog) - WriteToEventLog(ex, "MySQLPersonalizationProvider - ResetUserState"); - throw; - } - finally - { - connection.CloseConnection(); - } - } - - private void WriteToEventLog(Exception e, string action) - { - using (EventLog log = new EventLog()) - { - log.Source = eventSource; - log.Log = eventLog; - string message = exceptionMessage + Environment.NewLine + Environment.NewLine; - message += "Action: " + action + Environment.NewLine + Environment.NewLine; - message += "Exception: " + e; - log.WriteEntry(message); - } - } - - } -} diff --git a/Source/MySql.Web/Properties/AssemblyInfo.cs b/Source/MySql.Web/Properties/AssemblyInfo.cs deleted file mode 100644 index a9d37af6b..000000000 --- a/Source/MySql.Web/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright © 2004, 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -// 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. -[assembly: AssemblyTitle("MySql.Web")] -[assembly: AssemblyDescription("ADO.Net driver for MySQL")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Oracle")] -[assembly: AssemblyProduct("MySql.Web")] -[assembly: AssemblyCopyright("Copyright © 2004, 2015, Oracle and/or its affiliates. All rights reserved.")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: AllowPartiallyTrustedCallers()] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -#if NET_45_OR_GREATER -[assembly: SecurityRules(SecurityRuleSet.Level1)] -#endif - -// The following GUID is for the ID of the typelib if this project is exposed to COM -//[assembly: Guid("01520f33-9ecd-4574-96d0-5e6604e0f3aa")] - -[assembly: AssemblyDelaySign(true)] -[assembly: AssemblyKeyFileAttribute(@"..\..\ConnectorNetPublicKey.snk")] diff --git a/Source/MySql.Web/Properties/Resources.Designer.cs b/Source/MySql.Web/Properties/Resources.Designer.cs deleted file mode 100644 index 39ccaf55a..000000000 --- a/Source/MySql.Web/Properties/Resources.Designer.cs +++ /dev/null @@ -1,818 +0,0 @@ -//------------------------------------------------------------------------------ -// -// 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 MySql.Web.Properties { - 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", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - public class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - public static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MySql.Web.Properties.Resources", typeof(Resources).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)] - public static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to Cannot delete a populated role.. - /// - public static string CannotDeleteAPopulatedRole { - get { - return ResourceManager.GetString("CannotDeleteAPopulatedRole", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Setting EnablePasswordRetrieval to true when PasswordFormat is Hashed is not supported.. - /// - public static string CannotRetrieveHashedPasswords { - get { - return ResourceManager.GetString("CannotRetrieveHashedPasswords", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Cannot unencode a hashed password.. - /// - public static string CannotUnencodeHashedPwd { - get { - return ResourceManager.GetString("CannotUnencodeHashedPwd", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Change password operation was canceled.. - /// - public static string ChangePasswordCanceled { - get { - return ResourceManager.GetString("ChangePasswordCanceled", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to clear the token for the userid {0} in the table {1} after password update.. - /// - public static string ClearPassTokenFailed { - get { - return ResourceManager.GetString("ClearPassTokenFailed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to An unexpected error occurred while creating the role '{0}'.. - /// - public static string CreateRoleFailed { - get { - return ResourceManager.GetString("CreateRoleFailed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to delete OAuth Account, combination of provider '{0}' and provider user id '{1}' not found.. - /// - public static string DeleteOAuthAccountFailed { - get { - return ResourceManager.GetString("DeleteOAuthAccountFailed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to There was an error during membership provider initilization.. - /// - public static string ErrorInitOfMembershipProvider { - get { - return ResourceManager.GetString("ErrorInitOfMembershipProvider", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to There was an error during role provider initilization.. - /// - public static string ErrorInitOfRoleProvider { - get { - return ResourceManager.GetString("ErrorInitOfRoleProvider", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to There was an error during profile provider initilization.. - /// - public static string ErrorInitProfileProvider { - get { - return ResourceManager.GetString("ErrorInitProfileProvider", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to There was an error resetting the password.. - /// - public static string ErrorResettingPassword { - get { - return ResourceManager.GetString("ErrorResettingPassword", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to generates the PasswordVerificationToken, update not performed to Database.. - /// - public static string GeneratePassVerificationTokenFailed { - get { - return ResourceManager.GetString("GeneratePassVerificationTokenFailed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Role names must not be null or empty.. - /// - public static string IllegalRoleName { - get { - return ResourceManager.GetString("IllegalRoleName", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to User names must not be null or empty.. - /// - public static string IllegalUserName { - get { - return ResourceManager.GetString("IllegalUserName", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Incorrect password answer.. - /// - public static string IncorrectPasswordAnswer { - get { - return ResourceManager.GetString("IncorrectPasswordAnswer", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Please provide a valid value: value provided is null or empty.. - /// - public static string InvalidArgument { - get { - return ResourceManager.GetString("InvalidArgument", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Some of the values in the arrays received are null or empty, please verify it.. - /// - public static string InvalidArrayValue { - get { - return ResourceManager.GetString("InvalidArrayValue", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Invalid characters in user name.. - /// - public static string InvalidCharactersInUserName { - get { - return ResourceManager.GetString("InvalidCharactersInUserName", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to User {0} not found in the table {1}.. - /// - public static string InvalidUser { - get { - return ResourceManager.GetString("InvalidUser", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to initialize provider. Missing or incorrect schema.. - /// - public static string MissingOrWrongSchema { - get { - return ResourceManager.GetString("MissingOrWrongSchema", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The mono runtime did not support hashed passwords. Please use clear or encrypted passwords.. - /// - public static string MonoDoesNotSupportHash { - get { - return ResourceManager.GetString("MonoDoesNotSupportHash", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Change password canceled due to New password validation failure.. - /// - public static string NewPasswordValidationFailed { - get { - return ResourceManager.GetString("NewPasswordValidationFailed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to There is no connection string configured.. - /// - public static string NoConnString { - get { - return ResourceManager.GetString("NoConnString", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Non alpha numeric characters in '{0}' needs to be greater than or equal to '{1}'.. - /// - public static string NotEnoughNonAlphaNumericInPwd { - get { - return ResourceManager.GetString("NotEnoughNonAlphaNumericInPwd", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Password answer supplied is invalid.. - /// - public static string PasswordAnswerInvalid { - get { - return ResourceManager.GetString("PasswordAnswerInvalid", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Password exceeds maximum length allowed.. - /// - public static string PasswordExceedsMaxLength { - get { - return ResourceManager.GetString("PasswordExceedsMaxLength", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Password format not supported.. - /// - public static string PasswordFormatNotSupported { - get { - return ResourceManager.GetString("PasswordFormatNotSupported", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The length of parameter '{0}' needs to be greater or equal to '{1}'.. - /// - public static string PasswordNotLongEnough { - get { - return ResourceManager.GetString("PasswordNotLongEnough", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Password question supplied is invalid.. - /// - public static string PasswordQuestionInvalid { - get { - return ResourceManager.GetString("PasswordQuestionInvalid", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Password answer required for password reset.. - /// - public static string PasswordRequiredForReset { - get { - return ResourceManager.GetString("PasswordRequiredForReset", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Reset password canceled due to password validation failure.. - /// - public static string PasswordResetCanceledNotValid { - get { - return ResourceManager.GetString("PasswordResetCanceledNotValid", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Password Reset is not enabled.. - /// - public static string PasswordResetNotEnabled { - get { - return ResourceManager.GetString("PasswordResetNotEnabled", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Password Retrieval Not Enabled.. - /// - public static string PasswordRetrievalNotEnabled { - get { - return ResourceManager.GetString("PasswordRetrievalNotEnabled", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to MySqlSimpleMembershipProvider is already initialized and its schema does not match the MySqlMembershipProvider schema.. - /// - public static string PreviousProviderException { - get { - return ResourceManager.GetString("PreviousProviderException", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Profile update failed.. - /// - public static string ProfileUpdateFailed { - get { - return ResourceManager.GetString("ProfileUpdateFailed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The role '{0}' already exists.. - /// - public static string RoleAlreadyExists { - get { - return ResourceManager.GetString("RoleAlreadyExists", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The role '{0}' is in use.. - /// - public static string RoleInUse { - get { - return ResourceManager.GetString("RoleInUse", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Role name already exists.. - /// - public static string RoleNameAlreadyExists { - get { - return ResourceManager.GetString("RoleNameAlreadyExists", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Role name not found.. - /// - public static string RoleNameNotFound { - get { - return ResourceManager.GetString("RoleNameNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to save the request token secret value '{0}'.. - /// - public static string SaveTokenFailed { - get { - return ResourceManager.GetString("SaveTokenFailed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to CREATE TABLE mysql_Membership(`PKID` varchar(36) NOT NULL, - /// Username varchar(255) NOT NULL, - /// ApplicationName varchar(255) NOT NULL, - /// Email varchar(128) NOT NULL, - /// Comment varchar(255) default NULL, - /// Password varchar(128) NOT NULL, - /// PasswordQuestion varchar(255) default NULL, - /// PasswordAnswer varchar(255) default NULL, - /// IsApproved tinyint(1) default NULL, - /// LastActivityDate datetim [rest of string was truncated]";. - /// - public static string schema1 { - get { - return ResourceManager.GetString("schema1", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to CREATE TABLE my_aspnet_personalizationperuser( - ///id INT PRIMARY KEY AUTO_INCREMENT, - ///applicationId INT NOT NULL, - ///pathId VARCHAR(36) DEFAULT NULL, - ///userId INT, - ///pageSettings BLOB NOT NULL, - ///lastUpdatedDate DATETIME NOT NULL)DEFAULT CHARSET=latin1 ; - /// - /// - ///CREATE TABLE my_aspnet_personalizationallusers( - ///pathId VARCHAR(36) PRIMARY KEY, - ///pageSettings BLOB NOT NULL, - ///lastUpdatedDate DATETIME NOT NULL)DEFAULT CHARSET=latin1 ; - /// - ///CREATE TABLE my_aspnet_paths - ///( - ///applicationId INT NOT NULL, - ///pathId VARCHAR(36) PRI [rest of string was truncated]";. - /// - public static string schema10 { - get { - return ResourceManager.GetString("schema10", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to CREATE TABLE IF NOT EXISTS webpages_membership ( - /// UserId int NOT NULL primary key, - /// CreateDate datetime NULL, - /// ConfirmationToken nvarchar(128) NULL, - /// IsConfirmed bit NULL DEFAULT 0, - /// LastPasswordFailureDate datetime NULL, - /// PasswordFailuresSinceLastSuccess int NOT NULL DEFAULT 0, - /// Password nvarchar(128) NOT NULL, - /// PasswordChangedDate datetime NULL, - /// PasswordSalt nvarchar(128) NOT NULL, - /// PasswordVerificationToken nvarchar(128) NULL, - /// PasswordVerificationTokenExpirat [rest of string was truncated]";. - /// - public static string schema11 { - get { - return ResourceManager.GetString("schema11", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ALTER TABLE mysql_Membership - /// ADD PasswordKey char(32) AFTER Password, - /// ADD PasswordFormat tinyint AFTER PasswordKey, - /// CHANGE Email Email VARCHAR(128), COMMENT='2'; - /// - /// - /// . - /// - public static string schema2 { - get { - return ResourceManager.GetString("schema2", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to /* Provider schema block -- version 3 */ - /// - ////* create our application and user tables */ - ///create table my_aspnet_applications(id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(256), description VARCHAR(256)); - ///create table my_aspnet_users(id INT PRIMARY KEY AUTO_INCREMENT, - /// applicationId INT NOT NULL, name VARCHAR(256) NOT NULL, - /// isAnonymous TINYINT(1) NOT NULL DEFAULT 1, lastActivityDate DATETIME); - ///create table my_aspnet_profiles(userId INT PRIMARY KEY, valueindex longtext, stringdata longtext, binary [rest of string was truncated]";. - /// - public static string schema3 { - get { - return ResourceManager.GetString("schema3", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ALTER TABLE my_aspnet_membership CONVERT TO CHARACTER SET DEFAULT; - ///ALTER TABLE my_aspnet_roles CONVERT TO CHARACTER SET DEFAULT; - ///ALTER TABLE my_aspnet_usersinroles CONVERT TO CHARACTER SET DEFAULT; - /// - ///UPDATE my_aspnet_schemaversion SET version=4 WHERE version=3; - ///. - /// - public static string schema4 { - get { - return ResourceManager.GetString("schema4", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to CREATE TABLE my_aspnet_sessions - ///( - /// SessionId varchar(191) NOT NULL, - /// ApplicationId int NOT NULL, - /// Created datetime NOT NULL, - /// Expires datetime NOT NULL, - /// LockDate datetime NOT NULL, - /// LockId int NOT NULL, - /// Timeout int NOT NULL, - /// Locked tinyint(1) NOT NULL, - /// SessionItems BLOB, - /// Flags int NOT NULL, - /// primary key (SessionId,ApplicationId) - ///) DEFAULT CHARSET=latin1; - /// - ////* - /// Cleaning up timed ou [rest of string was truncated]";. - /// - public static string schema5 { - get { - return ResourceManager.GetString("schema5", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to ALTER TABLE my_aspnet_sessions CONVERT TO CHARACTER SET DEFAULT; - ///ALTER TABLE my_aspnet_sessions MODIFY SessionItems LONGBLOB; - /// - ///UPDATE my_aspnet_schemaversion SET version=6; - ///. - /// - public static string schema6 { - get { - return ResourceManager.GetString("schema6", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to RENAME TABLE my_aspnet_Applications TO my_aspnet_applications; - ///RENAME TABLE my_aspnet_Membership TO my_aspnet_membership; - ///RENAME TABLE my_aspnet_Profiles TO my_aspnet_profiles; - ///RENAME TABLE my_aspnet_Roles TO my_aspnet_roles; - ///RENAME TABLE my_aspnet_SchemaVersion TO my_aspnet_schemaversion; - ///RENAME TABLE my_aspnet_SessionCleanup TO my_aspnet_sessioncleanup; - ///RENAME TABLE my_aspnet_Sessions TO my_aspnet_sessions; - ///RENAME TABLE my_aspnet_Users TO my_aspnet_users; - ///RENAME TABLE my_aspnet_UsersInRoles TO my [rest of string was truncated]";. - /// - public static string schema7 { - get { - return ResourceManager.GetString("schema7", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to DELETE FROM my_aspnet_sessioncleanup; - /// - ///ALTER TABLE my_aspnet_sessioncleanup ADD ApplicationId INT NOT NULL; - ///ALTER TABLE my_aspnet_sessioncleanup ADD Primary Key (ApplicationId); - /// - ///UPDATE my_aspnet_schemaversion SET version=8;. - /// - public static string schema8 { - get { - return ResourceManager.GetString("schema8", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to - ///create table my_aspnet_sitemap( - /// Id int auto_increment primary key, - /// Title varchar( 50 ), - /// Description varchar( 512 ), - /// Url varchar( 512 ), - /// Roles varchar( 1000 ), - /// ParentId int default null - ///) engine=Innodb; - /// - ///UPDATE my_aspnet_schemaversion SET version=9;. - /// - public static string schema9 { - get { - return ResourceManager.GetString("schema9", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The MySqlSimpleMembershipProvider is already initialized.. - /// - public static string SimpleMembershipAlreadyInitialized { - get { - return ResourceManager.GetString("SimpleMembershipAlreadyInitialized", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The membership provider was not initialized, it must be initialized before start using it.. - /// - public static string SimpleMembershipNotInitialized { - get { - return ResourceManager.GetString("SimpleMembershipNotInitialized", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The MySqlSimpleRoleProvider is already initialized.. - /// - public static string SimpleRoleAlreadyInitialized { - get { - return ResourceManager.GetString("SimpleRoleAlreadyInitialized", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The connection string name is missing for the MySqlSiteMapProvider. - /// - public static string SiteMapConnectionStringMissing { - get { - return ResourceManager.GetString("SiteMapConnectionStringMissing", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to create application.. - /// - public static string UnableToCreateApplication { - get { - return ResourceManager.GetString("UnableToCreateApplication", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to create user.. - /// - public static string UnableToCreateUser { - get { - return ResourceManager.GetString("UnableToCreateUser", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to lock out user.. - /// - public static string UnableToLockOutUser { - get { - return ResourceManager.GetString("UnableToLockOutUser", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to retrieve profile data from database.. - /// - public static string UnableToRetrieveProfileData { - get { - return ResourceManager.GetString("UnableToRetrieveProfileData", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to update failure count. Membership database may be corrupt.. - /// - public static string UnableToUpdateFailureCount { - get { - return ResourceManager.GetString("UnableToUpdateFailureCount", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unsupported password format.. - /// - public static string UnsupportedPasswordFormat { - get { - return ResourceManager.GetString("UnsupportedPasswordFormat", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Failed to update the request token secret value '{0}'.. - /// - public static string UpdateTokenFailed { - get { - return ResourceManager.GetString("UpdateTokenFailed", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to User {0} already exists.. - /// - public static string UserAlreadyExists { - get { - return ResourceManager.GetString("UserAlreadyExists", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to UserIdColumn configuration was not initialized.. - /// - public static string UserIdColumnNotInitialized { - get { - return ResourceManager.GetString("UserIdColumnNotInitialized", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to User is already in role.. - /// - public static string UserIsAlreadyInRole { - get { - return ResourceManager.GetString("UserIsAlreadyInRole", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The supplied user is locked out.. - /// - public static string UserIsLockedOut { - get { - return ResourceManager.GetString("UserIsLockedOut", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to UserNameColumn configuration was not initialized.. - /// - public static string UserNameColumnNotInitialized { - get { - return ResourceManager.GetString("UserNameColumnNotInitialized", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Username not found.. - /// - public static string UsernameNotFound { - get { - return ResourceManager.GetString("UsernameNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to User not found int the table {0}.. - /// - public static string UserNotFound { - get { - return ResourceManager.GetString("UserNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to User not in role.. - /// - public static string UserNotInRole { - get { - return ResourceManager.GetString("UserNotInRole", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to UserTableName configuration was not initialized.. - /// - public static string UserTableNameNotInitilized { - get { - return ResourceManager.GetString("UserTableNameNotInitilized", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Unable to find the table users {0}. Please create it or initialize the MySqlSimpleMembershipProvider with 'createTables=true'.. - /// - public static string UserTableNotFound { - get { - return ResourceManager.GetString("UserTableNotFound", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to The validate password operation was canceled.. - /// - public static string ValidatePasswordCanceled { - get { - return ResourceManager.GetString("ValidatePasswordCanceled", resourceCulture); - } - } - } -} diff --git a/Source/MySql.Web/Properties/Resources.resx b/Source/MySql.Web/Properties/Resources.resx deleted file mode 100644 index a8ea2bbc0..000000000 --- a/Source/MySql.Web/Properties/Resources.resx +++ /dev/null @@ -1,340 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - Cannot delete a populated role. - - - Setting EnablePasswordRetrieval to true when PasswordFormat is Hashed is not supported. - - - Cannot unencode a hashed password. - - - There was an error during membership provider initilization. - - - There was an error during role provider initilization. - - - There was an error during profile provider initilization. - - - There was an error resetting the password. - - - Incorrect password answer. - - - Invalid characters in user name. - - - Change password canceled due to New password validation failure. - - - Password answer required for password reset. - - - Reset password canceled due to password validation failure. - - - Password Reset is not enabled. - - - Password Retrieval Not Enabled. - - - Profile update failed. - - - Role name already exists. - - - Role name not found. - - - - schema1.sql;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 - - - schema2.sql;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 - - - schema3.sql;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 - - - Unable to lock out user. - - - Unable to retrieve profile data from database. - - - Unable to update failure count. Membership database may be corrupt. - - - Unsupported password format. - - - User is already in role. - - - The supplied user is locked out. - - - Username not found. - - - User not in role. - - - Unable to initialize provider. Missing or incorrect schema. - - - Unable to create application. - - - Unable to create user. - - - Change password operation was canceled. - - - Non alpha numeric characters in '{0}' needs to be greater than or equal to '{1}'. - - - The length of parameter '{0}' needs to be greater or equal to '{1}'. - - - The validate password operation was canceled. - - - Password answer supplied is invalid. - - - Password question supplied is invalid. - - - schema4.sql;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 - - - Role names must not be null or empty. - - - User names must not be null or empty. - - - The mono runtime did not support hashed passwords. Please use clear or encrypted passwords. - - - schema5.sql;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 - - - schema6.sql;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 - - - schema7.sql;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 - - - schema8.sql;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 - - - schema9.sql;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 - - - schema11.sql;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 - - - The connection string name is missing for the MySqlSiteMapProvider - - - schema10.sql;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 - - - Failed to clear the token for the userid {0} in the table {1} after password update. - - - An unexpected error occurred while creating the role '{0}'. - - - Failed to delete OAuth Account, combination of provider '{0}' and provider user id '{1}' not found. - - - Failed to generates the PasswordVerificationToken, update not performed to Database. - - - Please provide a valid value: value provided is null or empty. - - - Some of the values in the arrays received are null or empty, please verify it. - - - User {0} not found in the table {1}. - - - There is no connection string configured. - - - Password exceeds maximum length allowed. - - - Password format not supported. - - - MySqlSimpleMembershipProvider is already initialized and its schema does not match the MySqlMembershipProvider schema. - - - The role '{0}' already exists. - - - The role '{0}' is in use. - - - Failed to save the request token secret value '{0}'. - - - The MySqlSimpleMembershipProvider is already initialized. - - - The membership provider was not initialized, it must be initialized before start using it. - - - The MySqlSimpleRoleProvider is already initialized. - - - Failed to update the request token secret value '{0}'. - - - User {0} already exists. - - - UserIdColumn configuration was not initialized. - - - UserNameColumn configuration was not initialized. - - - User not found int the table {0}. - - - UserTableName configuration was not initialized. - - - Unable to find the table users {0}. Please create it or initialize the MySqlSimpleMembershipProvider with 'createTables=true'. - - \ No newline at end of file diff --git a/Source/MySql.Web/Runtime.cs b/Source/MySql.Web/Runtime.cs deleted file mode 100644 index 668f87d92..000000000 --- a/Source/MySql.Web/Runtime.cs +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright © 2004, 2009, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -// This code was contributed by Sean Wright (srwright@alcor.concordia.ca) on 2007-01-12 -// The copyright was assigned and transferred under the terms of -// the MySQL Contributor License Agreement (CLA) - -using System; - -namespace MySql.Web.Security -{ - internal static class Runtime - { - private static bool inited; - private static bool isMono; - - public static bool IsMono - { - get - { - if (!inited) - Init(); - return isMono; - } - } - - private static void Init() - { - inited = true; - Type t = Type.GetType("Mono.Runtime"); - isMono = t != null; - } - } -} diff --git a/Source/MySql.Web/SchemaManager.cs b/Source/MySql.Web/SchemaManager.cs deleted file mode 100644 index 17aa649fe..000000000 --- a/Source/MySql.Web/SchemaManager.cs +++ /dev/null @@ -1,171 +0,0 @@ -// Copyright � 2004, 2014, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -// This code was contributed by Sean Wright (srwright@alcor.concordia.ca) on 2007-01-12 -// The copyright was assigned and transferred under the terms of -// the MySQL Contributor License Agreement (CLA) - -using System; -using System.Data; -using MySql.Data.MySqlClient; -using System.Collections.Specialized; -using System.Configuration.Provider; -using System.Resources; -using System.IO; -using System.Diagnostics; -using MySql.Web.Properties; - -namespace MySql.Web.Common -{ - /// - /// - /// - public static class SchemaManager - { - private const int schemaVersion = 10; - - /// - /// Gets the most recent version of the schema. - /// - /// The most recent version number of the schema. - public static int Version - { - get { return schemaVersion; } - } - - internal static void CheckSchema(string connectionString, NameValueCollection config) - { - int ver = GetSchemaVersion(connectionString); - if (ver == Version) return; - - try - { - if (String.Compare(config["autogenerateschema"], "true", true) == 0) - UpgradeToCurrent(connectionString, ver); - else - throw new ProviderException(Properties.Resources.MissingOrWrongSchema); - - } - catch (Exception ex) - { - throw new ProviderException(Properties.Resources.MissingOrWrongSchema, ex); - } - } - - private static void UpgradeToCurrent(string connectionString, int version) - { - ResourceManager r = new ResourceManager("MySql.Web.Properties.Resources", - typeof(SchemaManager).Assembly); - - if (version == Version) return; - - using (MySqlConnection connection = new MySqlConnection(connectionString)) - { - connection.Open(); - - for (int ver = version + 1; ver <= Version; ver++) - { - string schema = r.GetString(String.Format("schema{0}", ver)); - MySqlScript script = new MySqlScript(connection); - script.Query = schema; - - try - { - script.Execute(); - } - catch (MySqlException ex) - { - if (ex.Number == 1050 && ver == 7) - { - // Schema7 performs several renames of tables to their lowercase representation. - // If the current server OS does not support renaming to lowercase, then let's just continue. - script.Query = "UPDATE my_aspnet_schemaversion SET version=7"; - script.Execute(); - continue; - } - throw ex; - } - } - } - } - - private static int GetSchemaVersion(string connectionString) - { - // retrieve the current schema version - using (MySqlConnection conn = new MySqlConnection(connectionString)) - { - conn.Open(); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM my_aspnet_schemaversion", conn); - try - { - object ver = cmd.ExecuteScalar(); - if (ver != null) - return (int)ver; - } - catch (MySqlException ex) - { - if (ex.Number != (int)MySqlErrorCode.NoSuchTable) - throw; - string[] restrictions = new string[4]; - restrictions[2] = "mysql_membership"; - DataTable dt = conn.GetSchema("Tables", restrictions); - if (dt.Rows.Count == 1) - return Convert.ToInt32(dt.Rows[0]["TABLE_COMMENT"]); - } - return 0; - } - } - - /// - /// Creates the or fetch user id. - /// - /// The connection. - /// The username. - /// The application id. - /// if set to true [authenticated]. - /// - internal static long CreateOrFetchUserId(MySqlConnection connection, string username, - long applicationId, bool authenticated) - { - Debug.Assert(applicationId > 0); - - // first attempt to fetch an existing user id - MySqlCommand cmd = new MySqlCommand(@"SELECT id FROM my_aspnet_users - WHERE applicationId = @appId AND name = @name", connection); - cmd.Parameters.AddWithValue("@appId", applicationId); - cmd.Parameters.AddWithValue("@name", username); - object userId = cmd.ExecuteScalar(); - if (userId != null) return (int)userId; - - cmd.CommandText = @"INSERT INTO my_aspnet_users VALUES - (NULL, @appId, @name, @isAnon, Now())"; - cmd.Parameters.AddWithValue("@isAnon", !authenticated); - int recordsAffected = cmd.ExecuteNonQuery(); - if (recordsAffected != 1) - throw new ProviderException(Properties.Resources.UnableToCreateUser); - - cmd.CommandText = "SELECT LAST_INSERT_ID()"; - return Convert.ToInt64(cmd.ExecuteScalar()); - } - } -} \ No newline at end of file diff --git a/Source/MySql.Web/project.json b/Source/MySql.Web/project.json deleted file mode 100644 index 35c005b82..000000000 --- a/Source/MySql.Web/project.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "version": "7.0.7-m6", - "description": "MySql.Web", - "authors": [ - "Oracle" - ], - "copyright": "Copyright © 2016, 2017, Oracle and/or its affiliates. All rights reserved.", - "language": "en-US", - "packOptions": { - "projectUrl": "http://dev.mysql.com/downloads/", - "licenseUrl": "http://www.gnu.org/licenses/old-licenses/gpl-2.0.html", - "iconUrl": "http://www.mysql.com/common/logos/logo-mysql-170x115.png", - "tags": [ - "MySql", - ".NET Connector", - "MySql Connector/NET" - ], - "requireLicenseAcceptance": true - }, - "buildOptions": {"nowarn": ["CS1591"]}, - "frameworks": { - "net451": { - "keyFile": "../../ConnectorNetPublicKey.snk", - "delaySign": true, - "publicSign": false, - "dependencies": { - "MySql.Data": { - "target": "project" - }, - "Microsoft.AspNet.Razor": "3.2.3", - "Microsoft.AspNet.WebPages": "3.2.3", - "Microsoft.AspNet.WebPages.Data": "3.2.3", - "Microsoft.AspNet.WebPages.WebData": "3.2.3", - "Microsoft.Web.Infrastructure": "1.0.0", - "WebMatrix.WebData": "2.0.30506" - }, - "frameworkAssemblies": { - "System.ComponentModel.DataAnnotations": "", - "System.Configuration.Install": "4.0.0.0", - "System.Core": "", - "System.Data": "", - "System.Data.DataSetExtensions": "", - "System.Management": "4.0.0.0", - "System.Runtime": { - "type": "build" - }, - "System.Security": "", - "System.Web": "4.0.0.0", - "System.Web.ApplicationServices": "4.0.0.0", - "System.Xml": "" - } - } - }, - "configurations": { - "Debug": { - "buildOptions": { - "define": [ - "DEBUG" - ], - "optimize": false, - "preserveCompilationContext": true - } - }, - "Release": { - "buildOptions": { - "define": [ - "RELEASE" - ], - "optimize": true, - "preserveCompilationContext": true, - "xmlDoc": true, - "compile": { - "excludeFiles": [ - - ] - } - } - }, - "ReleaseNET40_Only": { - "buildOptions": { - "define": [ - "ReleaseNET40_Only" - ], - "optimize": true, - "preserveCompilationContext": true, - "xmlDoc": true, - "compile": { - "excludeFiles": [ - "MySqlDatabaseWrapper.cs", - "MySqlWebSecurity.cs", - "SimpleMembershipProvider.cs", - "SimpleRoleProvider.cs" - ] - } - } - } - } -} \ No newline at end of file diff --git a/Tests/MySql.Data.Tests.Stress/MySql.Data.Tests.Stress.csproj b/Tests/MySql.Data.Tests.Stress/MySql.Data.Tests.Stress.csproj deleted file mode 100644 index 76eb29fc4..000000000 --- a/Tests/MySql.Data.Tests.Stress/MySql.Data.Tests.Stress.csproj +++ /dev/null @@ -1,116 +0,0 @@ - - - - Debug - AnyCPU - {2D442A7A-B938-4168-A736-21A41CAD5DD2} - Library - Properties - MySql.Data.Tests.Stress - MySql.Data.Tests.Stress - 512 - - ..\..\ - true - - - - - 9.0.30729 - 2.0 - 4.0 - v4.0 - NET_40_OR_GREATER - - - - - 9.0.30729 - 2.0 - 4.5 - v4.5.1 - NET_40_OR_GREATER;NET_45_OR_GREATER; - - - - - true - full - false - $(TargetFrameworkVersion)\ - obj\$(TargetFrameworkVersion)\ - obj\$(TargetFrameworkVersion)\ - bin\$(TargetFrameworkVersion)\Debug\ - DEBUG;TRACE - prompt - 4 - false - - - pdbonly - true - $(TargetFrameworkVersion)\ - obj\$(TargetFrameworkVersion)\ - obj\$(TargetFrameworkVersion)\ - bin\$(TargetFrameworkVersion)\Release\ - TRACE - prompt - 4 - false - - - - - - - - - - - - ..\..\packages\xunit.1.9.2\lib\net20\xunit.dll - True - - - - - Properties\VersionInfo.cs - - - - - - - - - - - - - - - - {e9df5ed1-4cbd-4226-b931-9a51610ac14d} - MySql.Data - - - {f29e5b3d-7f76-4cf9-bf5e-8e3a1377b1e4} - MySql.Data.Tests - - - {43E3AF8C-6DBF-4B91-9D51-A61172FC0037} - MySql.EF6.Basic.Tests - - - - - - - - \ No newline at end of file diff --git a/Tests/MySql.Data.Tests.Stress/MySql.Data.Tests.Stress.xproj b/Tests/MySql.Data.Tests.Stress/MySql.Data.Tests.Stress.xproj deleted file mode 100644 index ca05c7cf2..000000000 --- a/Tests/MySql.Data.Tests.Stress/MySql.Data.Tests.Stress.xproj +++ /dev/null @@ -1,22 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - bf425d4d-96a8-4ec7-9dd6-d8c83459e52d - MySql.Data.Tests.Stress - .\obj - .\bin\ - v4.6.1 - - - 2.0 - - - - - - \ No newline at end of file diff --git a/Tests/MySql.Data.Tests.Stress/Properties/AssemblyInfo.cs b/Tests/MySql.Data.Tests.Stress/Properties/AssemblyInfo.cs deleted file mode 100644 index d95ec293c..000000000 --- a/Tests/MySql.Data.Tests.Stress/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright © 2014, 2015 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -// 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. -[assembly: AssemblyTitle("MySql.Data.Tests.Stress")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Oracle Corporation")] -[assembly: AssemblyProduct("MySql.Data.Tests.Stress")] -[assembly: AssemblyCopyright("Copyright © 2014, 2015 Oracle and/or its affiliates. All rights reserved.")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -[assembly: AssemblyKeyName("ConnectorNet")] -[assembly: AllowPartiallyTrustedCallers] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("02681727-f306-4923-8c16-717d6f1716ce")] - diff --git a/Tests/MySql.Data.Tests.Stress/SetUp.cs b/Tests/MySql.Data.Tests.Stress/SetUp.cs deleted file mode 100644 index ec317a764..000000000 --- a/Tests/MySql.Data.Tests.Stress/SetUp.cs +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright © 2014, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Reflection; -using MySql.Data.MySqlClient; -using System.Configuration; -using Xunit; -using MySql.Data.MySqlClient.Tests; -using MySql.Data.Entity.Tests; - -namespace MySql.Data.Tests.Stress -{ - public class SetUpStressClass : SetUpClass, IDisposable - { - public SetUpStressClass() - { - Initialize(); - LoadBaseConfiguration(); - } - } - - /// - /// This Setup class changes the initialization semantic to be exeucuted once per unit test, instead of once per Fixture class. - /// - public class SetUpClassPerTestInit : SetUpStressClass - { - public SetUpClassPerTestInit() - { - // No initialization - } - - } - - /// - /// This is a companion of the previous class to allow customization before inialization code. - /// - - //public class SpecialFixtureWithCustomConnectionString : IUseFixture, IDisposable - public class SpecialFixtureWithCustomConnectionString : IDisposable - { - protected SetUpClassPerTestInit st; - - public virtual void SetFixture(SetUpClassPerTestInit data) - { - st = data; - st.OnGetConnectionStringInfo += new SetUpStressClass.GetConnectionStringInfoCallback(OnGetConnectionStringInfo); - st.MyInit(); - //if (st.conn.State != ConnectionState.Open) - // st.conn.Open(); - } - - /// - /// Override to provide special connect options like using pipes, compression, etc. - /// - /// - protected virtual string OnGetConnectionStringInfo() - { - return "protocol=sockets;"; - } - - public void Dispose() - { - Dispose(true); - } - - protected virtual void Dispose(bool disposing) - { - if (!disposing) return; - st.Dispose(); - } - } - -} diff --git a/Tests/MySql.Data.Tests.Stress/StressTests.cs b/Tests/MySql.Data.Tests.Stress/StressTests.cs deleted file mode 100644 index 48ae87585..000000000 --- a/Tests/MySql.Data.Tests.Stress/StressTests.cs +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright © 2013, 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using MySql.Data.MySqlClient; -using Xunit; -using System.Diagnostics; -using MySql.Data.MySqlClient.Tests; - -namespace MySql.Data.Tests.Stress -{ - public class StressTests : SpecialFixtureWithCustomConnectionString - { - public override void SetFixture(SetUpClassPerTestInit data) - { - base.SetFixture(data); - st.execSQL("CREATE TABLE Test (id INT NOT NULL, name varchar(100), blob1 LONGBLOB, text1 TEXT, " + - "PRIMARY KEY(id))"); - } - - protected override void Dispose(bool disposing) - { - st.execSQL("DROP TABLE IF EXISTS TEST"); - base.Dispose(disposing); - } - - [Fact] - public void TestMultiPacket() - { - int len = 20000000; - - st.suExecSQL("SET GLOBAL max_allowed_packet=64000000"); - - // currently do not test this with compression - if (st.conn.UseCompression) return; - - using (MySqlConnection c = new MySqlConnection(st.GetConnectionString(true))) - { - c.Open(); - byte[] dataIn = MySql.Data.MySqlClient.Tests.Utils.CreateBlob(len); - byte[] dataIn2 = MySql.Data.MySqlClient.Tests.Utils.CreateBlob(len); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?id, NULL, ?blob, NULL )", c); - cmd.CommandTimeout = 0; - cmd.Parameters.Add(new MySqlParameter("?id", 1)); - cmd.Parameters.Add(new MySqlParameter("?blob", dataIn)); - cmd.ExecuteNonQuery(); - - cmd.Parameters[0].Value = 2; - cmd.Parameters[1].Value = dataIn2; - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM Test"; - - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - byte[] dataOut = new byte[len]; - long count = reader.GetBytes(2, 0, dataOut, 0, len); - Assert.Equal(len, count); - int i = 0; - try - { - for (; i < len; i++) - Assert.Equal(dataIn[i], dataOut[i]); - } - catch (Exception) - { - int z = i; - } - - reader.Read(); - count = reader.GetBytes(2, 0, dataOut, 0, len); - Assert.Equal(len, count); - - for (int x = 0; x < len; x++) - Assert.Equal(dataIn2[x], dataOut[x]); - } - } - } - - [Fact] - public void TestSequence() - { - MySqlCommand cmd = new MySqlCommand("insert into Test (id, name) values (?id, 'test')", st.conn); - cmd.Parameters.Add(new MySqlParameter("?id", 1)); - - for (int i = 1; i <= 8000; i++) - { - cmd.Parameters[0].Value = i; - cmd.ExecuteNonQuery(); - } - - int i2 = 0; - cmd = new MySqlCommand("select * from Test", st.conn); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - while (reader.Read()) - { - Assert.True(i2 + 1 == reader.GetInt32(0), "Sequence out of order"); - i2++; - } - reader.Close(); - - Assert.Equal(8000, i2); - cmd = new MySqlCommand("delete from Test where id >= 100", st.conn); - cmd.ExecuteNonQuery(); - } - } - } -} diff --git a/Tests/MySql.Data.Tests.Stress/StressTestsPipe.cs b/Tests/MySql.Data.Tests.Stress/StressTestsPipe.cs deleted file mode 100644 index 80c224bbb..000000000 --- a/Tests/MySql.Data.Tests.Stress/StressTestsPipe.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright © 2013, 2015 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Security.Authentication; - -namespace MySql.Data.Tests.Stress -{ - public class StressTestsPipe : StressTests - { - protected override string OnGetConnectionStringInfo() - { - return string.Format("protocol=pipe;pipe name={0};ssl mode=none;", st.pipeName); - } - } -} diff --git a/Tests/MySql.Data.Tests.Stress/StressTestsPipeCompressed.cs b/Tests/MySql.Data.Tests.Stress/StressTestsPipeCompressed.cs deleted file mode 100644 index 2cc0b7537..000000000 --- a/Tests/MySql.Data.Tests.Stress/StressTestsPipeCompressed.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright © 2013, 2015 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Security.Authentication; - -namespace MySql.Data.Tests.Stress -{ - public class StressTestsPipeCompressed : StressTests - { - protected override string OnGetConnectionStringInfo() - { - return string.Format("protocol=pipe;pipe name={0};compress=true;ssl mode=none;", st.pipeName); - } - } -} diff --git a/Tests/MySql.Data.Tests.Stress/StressTestsSharedMemory.cs b/Tests/MySql.Data.Tests.Stress/StressTestsSharedMemory.cs deleted file mode 100644 index 7ef74e43b..000000000 --- a/Tests/MySql.Data.Tests.Stress/StressTestsSharedMemory.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright © 2013, 2015 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Security.Authentication; - -namespace MySql.Data.Tests.Stress -{ - public class StressTestsSharedMemory : StressTests - { - protected override string OnGetConnectionStringInfo() - { - return string.Format("protocol=memory; shared memory name={0};ssl mode=none;", st.memoryName); - } - } -} diff --git a/Tests/MySql.Data.Tests.Stress/StressTestsSharedMemoryCompressed.cs b/Tests/MySql.Data.Tests.Stress/StressTestsSharedMemoryCompressed.cs deleted file mode 100644 index d7a424db2..000000000 --- a/Tests/MySql.Data.Tests.Stress/StressTestsSharedMemoryCompressed.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright © 2013, 2015 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Security.Authentication; - -namespace MySql.Data.Tests.Stress -{ - public class StressTestsSharedMemoryCompressed : StressTests - { - protected override string OnGetConnectionStringInfo() - { - return string.Format("protocol=memory; shared memory name={0};compress=true;ssl mode=none;", st.memoryName); - } - } -} diff --git a/Tests/MySql.Data.Tests.Stress/StressTestsSocketCompressed.cs b/Tests/MySql.Data.Tests.Stress/StressTestsSocketCompressed.cs deleted file mode 100644 index f6182ba67..000000000 --- a/Tests/MySql.Data.Tests.Stress/StressTestsSocketCompressed.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright © 2013, 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Security.Authentication; - -namespace MySql.Data.Tests.Stress -{ - public class StressTestsSocketCompressed : StressTests - { - protected override string OnGetConnectionStringInfo() - { - return "compress=true"; - } - } -} diff --git a/Tests/MySql.Data.Tests.Stress/project.json b/Tests/MySql.Data.Tests.Stress/project.json deleted file mode 100644 index 062d56571..000000000 --- a/Tests/MySql.Data.Tests.Stress/project.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "version": "7.0.7-m6", - "description": "MySql.Data.Tests.Stress Class Library", - "authors": [ "Oracle" ], - "copyright": "Copyright © 2016, 2017, Oracle and/or its affiliates. All rights reserved.", - - "packOptions": { - "projectUrl": "http://dev.mysql.com/downloads/", - "licenseUrl": "http://www.gnu.org/licenses/old-licenses/gpl-2.0.html", - "iconUrl": "http://www.mysql.com/common/logos/logo-mysql-170x115.png", - "tags": [ "MySql", ".NET Connector", "MySql Connector/NET", "netcore", ".Net Core", "MySql Conector/Net Core", "coreclr", "C/NET", "C/Net Core" ], - "requireLicenseAcceptance": true - }, - "dependencies": { - "dotnet-test-xunit": "2.2.0-*", - "xunit": "2.2.0-*" - }, - "buildOptions": { - "warningsAsErrors": false, - "keyFile": "../../ConnectorNetPublicKey.snk", - "delaySign": true, - "publicSign": false - }, - "testRunner": "xunit", - "frameworks": { - "net451": { - "frameworkAssemblies": { - "System.Data": "4.0.0.0", - "System.Data.DataSetExtensions": "4.0.0.0", - "System.Xml.Linq": "4.0.0.0" - }, - "dependencies": { - "MySql.Data": { - "target": "project" - }, - "MySql.Data.Tests": { - "target": "project" - }, - "MySql.EntityFramework6.Basic.Tests": { - "target": "project" - } - - }, - "buildOptions": { - "compile": { - "exclude": [ - "Framework/Net451/MediumTrust/*.*", - "Framework/NetCore10/*.*" - ], - "excludeFiles": [ - "Framework/Net451/PerfMonTests.cs", - "Framework/Net451/ReplicationTests.cs" - ] - } - } - } - }, - "configurations": { - "Debug": { - "buildOptions": { - "define": [ "DEBUG" ], - "optimize": false, - "preserveCompilationContext": true - } - }, - "Release": { - "buildOptions": { - "define": [ "RELEASE" ], - "optimize": true, - "preserveCompilationContext": true, - "xmlDoc": true - } - } - } -} diff --git a/Tests/MySql.Data.Tests/.vscode/tasks.json b/Tests/MySql.Data.Tests/.vscode/tasks.json deleted file mode 100644 index 2a737c6cf..000000000 --- a/Tests/MySql.Data.Tests/.vscode/tasks.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - // See http://go.microsoft.com/fwlink/?LinkId=733558 - // for the documentation about the tasks.json format - "version": "0.1.0", - "command": "dotnet", - "isShellCommand": true, - "args": [], - "tasks": [ - { - "taskName": "build", - "args": [ ], - "isBuildCommand": true, - "showOutput": "silent", - "problemMatcher": "$msCompile" - } - ] -} \ No newline at end of file diff --git a/Tests/MySql.Data.Tests/AuthTests.cs b/Tests/MySql.Data.Tests/AuthTests.cs deleted file mode 100644 index 37e8e9da4..000000000 --- a/Tests/MySql.Data.Tests/AuthTests.cs +++ /dev/null @@ -1,337 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Xunit; - -namespace MySql.Data.MySqlClient.Tests -{ - public class AuthTests : TestBase - { - protected TestSetup ts; - - public AuthTests(TestSetup setup) : base (setup, "authtests") - { - ts = setup; - } - - - [Fact] - public void TestIntegratedSecurityNoPoolingWithoutUser() - { - TestIntegratedSecurityWithUser(null, false); - } - - [Fact] - public void TestIntegratedSecurityPoolingWithoutUser() - { - TestIntegratedSecurityWithUser(null, true); - } - - public void TestIntegratedSecurityWithUser(string user, bool pooling) - { - const string PluginName = "authentication_windows"; - string UserName = "auth_windows"; - if (user != null) - UserName = user; - - // Check if server has windows authentication plugin is installed - MySqlDataReader reader = ExecuteAsReader("show plugins", ts.GetConnection(true)); - - bool haveWindowsAuthentication = false; - using (reader) - { - if (reader.HasRows) - { - while (reader.Read()) - { - string name = (string)reader["Name"]; - if (name == PluginName) - { - haveWindowsAuthentication = true; - break; - } - } - } - } - if (!haveWindowsAuthentication) - return; - - bool haveAuthWindowsUser = false; - string pluginName = null; - string authenticationString = ""; - - // Check if predefined proxy user exists - string sql = string.Format("select plugin, authentication_string from mysql.user where user='{0}'", UserName); - using (MySqlDataReader reader2 = ExecuteAsReader(sql, ts.GetConnection(true))) - { - if (reader2.Read()) - { - haveAuthWindowsUser = true; - pluginName = (string)reader2["plugin"]; - authenticationString = - (string)((reader2["authentication_string"] == DBNull.Value) ? - "" : reader2["authentication_string"]); - } - } - - // Create mapping for current Windows user=>foo_user - String windowsUser = System.Security.Principal.WindowsIdentity.GetCurrent().Name; - windowsUser = windowsUser.Replace("\\", "\\\\"); - string userMapping = windowsUser + "=foo_user"; - - if (!haveAuthWindowsUser) - { - executeAsRoot( - "CREATE USER " + UserName + " IDENTIFIED WITH " + PluginName + " as '" + - userMapping + "'"); - } - else - { - // extend mapping string for current user - executeAsRoot( - "UPDATE mysql.user SET authentication_string='" + userMapping + - "," + authenticationString + "' where user='" + UserName + "'"); - } - executeAsRoot("create user foo_user identified by 'pass'"); - executeAsRoot("grant all privileges on *.* to 'foo_user'@'%'"); - executeAsRoot("grant proxy on foo_user to " + UserName); - - - // Finally, use IntegratedSecurity=true for the newly created user - string connStr = ts.GetConnection(true).ConnectionString + ";Integrated Security=SSPI"; - - MySqlConnectionStringBuilder sb = - new MySqlConnectionStringBuilder(connStr); - sb.UserID = user; - connStr = sb.ConnectionString; - - /* If pooling is requested, we'll run test twice, with connection reset in between */ - if (pooling) - { - connStr += ";Connection Reset=true;Pooling=true"; - } - int testIterations = pooling ? 2 : 1; - - int threadId = -1; - for (int i = 0; i < testIterations; i++) - { - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - threadId = c.ServerThread; - MySqlCommand command = new MySqlCommand("SELECT 1", c); - long ret = (long)command.ExecuteScalar(); - Assert.Equal(ret, 1); - - command.CommandText = "select user()"; - string myUser = (string)command.ExecuteScalar(); - // Check if proxy user is correct - Assert.True(myUser.StartsWith(UserName + "@")); - - // check if mysql user is correct - // (foo_user is mapped to current OS user) - command.CommandText = "select current_user()"; - string currentUser = (string)command.ExecuteScalar(); - Assert.True(currentUser.StartsWith("foo_user@")); - } - } - - if (pooling) - { - executeAsRoot("KILL " + threadId); - } - } - - [Fact] - public void TestIntegratedSecurityNoPoolingWithUser() - { - TestIntegratedSecurityWithUser("myuser1", false); - } - - [Fact] - public void TestIntegratedSecurityPoolingWithUser() - { - TestIntegratedSecurityWithUser("myuser1", true); - } - - public void TestIntegratedSecurityWithoutProxy(string user, bool pooling) - { - const string PluginName = "authentication_windows"; - string UserName = "auth_windows"; - if (user != null) - UserName = user; - - var conn = ts.GetConnection(true); - - if (conn.State != ConnectionState.Open) - conn.Open(); - - // Check if server has windows authentication plugin is installed - MySqlCommand cmd = new MySqlCommand("show plugins", conn); - - bool haveWindowsAuthentication = false; - using (MySqlDataReader r = cmd.ExecuteReader()) - { - while (r.Read()) - { - string name = (string)r["Name"]; - if (name == PluginName) - { - haveWindowsAuthentication = true; - break; - } - } - } - - conn.Close(); - - if (!haveWindowsAuthentication) - return; - - bool haveAuthWindowsUser = false; - string pluginName = null; - string authenticationString = ""; - - // Check if predefined proxy user exists - cmd.CommandText = string.Format( - "select plugin, authentication_string from mysql.user where user='{0}'", - UserName); - using (MySqlDataReader r = cmd.ExecuteReader()) - { - if (r.Read()) - { - haveAuthWindowsUser = true; - pluginName = (string)r["plugin"]; - authenticationString = - (string)((r["authentication_string"] == DBNull.Value) ? - "" : r["authentication_string"]); - } - } - - // Create mapping for current Windows user=>foo_user - String windowsUser = System.Security.Principal.WindowsIdentity.GetCurrent().Name; - windowsUser = windowsUser.Replace("\\", "\\\\"); - string userMapping = "fergs, Administrators"; - - try - { - if (!haveAuthWindowsUser) - { - executeAsRoot( - "CREATE USER " + UserName + " IDENTIFIED WITH " + PluginName + " as '" + - userMapping + "'"); - } - else - { - // extend mapping string for current user - executeAsRoot( - "UPDATE mysql.user SET authentication_string='" + userMapping + - "," + authenticationString + "' where user='" + UserName + "'"); - } - executeAsRoot(string.Format("grant all privileges on *.* to '{0}'@'%'", UserName)); - - - // Finally, use IntegratedSecurity=true for the newly created user - string connStr = ts.GetConnection(true).ConnectionString + ";Integrated Security=SSPI"; - - MySqlConnectionStringBuilder sb = - new MySqlConnectionStringBuilder(connStr); - sb.UserID = user; - connStr = sb.ConnectionString; - - /* If pooling is requested, we'll run test twice, with connection reset in between */ - if (pooling) - { - connStr += ";Connection Reset=true;Pooling=true"; - } - int testIterations = pooling ? 2 : 1; - - int threadId = -1; - for (int i = 0; i < testIterations; i++) - { - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - threadId = c.ServerThread; - MySqlCommand command = new MySqlCommand("SELECT 1", c); - long ret = (long)command.ExecuteScalar(); - Assert.Equal(ret, 1); - - command.CommandText = "select user()"; - string myUser = (string)command.ExecuteScalar(); - // Check if proxy user is correct - Assert.True(myUser.StartsWith(UserName + "@")); - - // check if mysql user is correct - // (foo_user is mapped to current OS user) - command.CommandText = "select current_user()"; - string currentUser = (string)command.ExecuteScalar(); - Assert.True(currentUser.StartsWith(UserName)); - } - } - - if (pooling) - { - executeAsRoot("KILL " + threadId); - } - } - finally - { - // Cleanup - - // Drop test user - executeAsRoot(string.Format("drop user {0}", UserName)); - } - } - - [Fact] - public void TestWinAuthWithoutProxyNoUserNoPooling() - { - TestIntegratedSecurityWithoutProxy(null, false); - } - - [Fact] - public void TestWinAuthWithoutProxyNoUserPooling() - { - TestIntegratedSecurityWithoutProxy("myuser1", true); - } - - [Fact] - public void TestWinAuthWithoutProxyAndUser() - { - TestIntegratedSecurityWithoutProxy("myuser1", false); - } - - [Fact] - public void TestWinAuthWithoutProxyAndUserPooling() - { - TestIntegratedSecurityWithoutProxy("myuser1", true); - } - - } -} diff --git a/Tests/MySql.Data.Tests/BlobTests.cs b/Tests/MySql.Data.Tests/BlobTests.cs deleted file mode 100644 index 969a68df5..000000000 --- a/Tests/MySql.Data.Tests/BlobTests.cs +++ /dev/null @@ -1,371 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.ComponentModel; -using System.Data; -using Xunit; - - -namespace MySql.Data.MySqlClient.Tests -{ - public class BlobTests : TestBase, IDisposable - { - protected TestSetup ts; - - public BlobTests(TestSetup setup) : base(setup, "blob") - { - ts = setup; - customConnection = new MySqlConnection(ts.GetConnection(false).ConnectionString + ";" + OnGetConnectionStringInfo()); - customConnection.Open(); - } - - - protected BlobTests(TestSetup setup, String nameSpace) : base(setup, nameSpace) - { - ts = setup; - customConnection = new MySqlConnection(ts.GetConnection(false).ConnectionString + ";" + OnGetConnectionStringInfo()); - customConnection.Open(); - } - - protected override string OnGetConnectionStringInfo() - { - return "SSL Mode=Required;"; - } - - [Fact] - public void InsertNullBinary() - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (id INT NOT NULL, blob1 LONGBLOB, PRIMARY KEY(id))"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?id, ?b1)", customConnection); - cmd.Parameters.Add(new MySqlParameter("?id", 1)); - cmd.Parameters.Add(new MySqlParameter("?b1", null)); - int rows = cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.HasRows == true, "Checking HasRows"); - - reader.Read(); - var value = reader.GetValue(1) as string; - Assert.True(value == null); - } - } - - [Fact] - public void InsertBinary() - { - int lenIn = 400000; - byte[] dataIn = Utils.CreateBlob(lenIn); - - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (id INT NOT NULL, blob1 LONGBLOB, PRIMARY KEY(id))"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?id, ?b1)", customConnection); - cmd.Parameters.Add(new MySqlParameter("?id", 1)); - cmd.Parameters.Add(new MySqlParameter("?b1", dataIn)); - int rows = cmd.ExecuteNonQuery(); - - byte[] dataIn2 = Utils.CreateBlob(lenIn); - cmd.Parameters[0].Value = 2; - cmd.Parameters[1].Value = dataIn2; - rows += cmd.ExecuteNonQuery(); - - Assert.True(rows == 2, "Checking insert rowcount"); - - cmd.CommandText = "SELECT * FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.HasRows == true, "Checking HasRows"); - - reader.Read(); - - byte[] dataOut = new byte[lenIn]; - long lenOut = reader.GetBytes(1, 0, dataOut, 0, lenIn); - - Assert.True(lenIn == lenOut, "Checking length of binary data (row 1)"); - - // now see if the buffer is intact - for (int x = 0; x < dataIn.Length; x++) - Assert.True(dataIn[x] == dataOut[x], "Checking first binary array at " + x); - - // now we test chunking - int pos = 0; - int lenToRead = dataIn.Length; - while (lenToRead > 0) - { - int size = Math.Min(lenToRead, 1024); - int read = (int)reader.GetBytes(1, pos, dataOut, pos, size); - lenToRead -= read; - pos += read; - } - // now see if the buffer is intact - for (int x = 0; x < dataIn.Length; x++) - Assert.True(dataIn[x] == dataOut[x], "Checking first binary array at " + x); - - reader.Read(); - lenOut = reader.GetBytes(1, 0, dataOut, 0, lenIn); - Assert.True(lenIn == lenOut, "Checking length of binary data (row 2)"); - - // now see if the buffer is intact - for (int x = 0; x < dataIn2.Length; x++) - Assert.True(dataIn2[x] == dataOut[x], "Checking second binary array at " + x); - } - } - - [Fact] - public void GetChars() - { - InternalGetChars(false); - } - - [Fact] - public void GetCharsPrepared() - { - InternalGetChars(true); - } - - private void InternalGetChars(bool prepare) - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (id INT NOT NULL, text1 LONGTEXT, PRIMARY KEY(id))"); - - char[] data = new char[20000]; - for (int x = 0; x < data.Length; x++) - data[x] = (char)(65 + (x % 20)); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (1, ?text1)", customConnection); - cmd.Parameters.AddWithValue("?text1", data); - if (prepare) - cmd.Prepare(); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM Test"; - cmd.Parameters.Clear(); - if (prepare) - cmd.Prepare(); - - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - - // now we test chunking - char[] dataOut = new char[data.Length]; - int pos = 0; - int lenToRead = data.Length; - while (lenToRead > 0) - { - int size = Math.Min(lenToRead, 1024); - int read = (int)reader.GetChars(1, pos, dataOut, pos, size); - lenToRead -= read; - pos += read; - } - // now see if the buffer is intact - for (int x = 0; x < data.Length; x++) - Assert.True(data[x] == dataOut[x], "Checking first text array at " + x); - } - } - - [Fact] - public void InsertText() - { - InternalInsertText(false); - } - - [Fact] - public void InsertTextPrepared() - { - InternalInsertText(true); - } - - private void InternalInsertText(bool prepare) - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (id INT NOT NULL, blob1 LONGBLOB, text1 LONGTEXT, PRIMARY KEY(id))"); - - byte[] data = new byte[1024]; - for (int x = 0; x < 1024; x++) - data[x] = (byte)(65 + (x % 20)); - - // Create sample table - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (1, ?b1, ?t1)", customConnection); - cmd.Parameters.Add(new MySqlParameter("?t1", data)); - cmd.Parameters.Add(new MySqlParameter("?b1", "This is my blob data")); - if (prepare) cmd.Prepare(); - int rows = cmd.ExecuteNonQuery(); - Assert.True(rows == 1, "Checking insert rowcount"); - - cmd.CommandText = "INSERT INTO Test VALUES(2, ?b1, ?t1)"; - cmd.Parameters.Clear(); - cmd.Parameters.AddWithValue("?t1", DBNull.Value); - string str = "This is my text value"; - - cmd.Parameters.AddWithValue("?b1", str); - - rows = cmd.ExecuteNonQuery(); - Assert.True(rows == 1, "Checking insert rowcount"); - - cmd.CommandText = "SELECT * FROM Test"; - if (prepare) cmd.Prepare(); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.HasRows, "Checking HasRows"); - - Assert.True(reader.Read()); - - Assert.Equal("This is my blob data", reader.GetString(1)); - string s = reader.GetString(2); - Assert.True(s.Length == 1024, "Checking length returned "); - Assert.True(s.Substring(0, 9) == "ABCDEFGHI", "Checking first few chars of string"); - - Assert.True(reader.Read()); - Assert.Equal(DBNull.Value, reader.GetValue(2)); - Assert.Equal("This is my text value", reader.GetString(1)); - } - } - - [Fact] - public void GetCharsOnLongTextColumn() - { - //if (connection.connectionState != ConnectionState.Open) - // connection.Open(); - - executeSQL("CREATE TABLE Test1 (id INT NOT NULL, blob1 LONGBLOB, text1 LONGTEXT, PRIMARY KEY(id))"); - executeSQL("INSERT INTO Test1 (id, text1) VALUES(1, 'Test')"); - - MySqlCommand cmd = new MySqlCommand("SELECT id, text1 FROM Test1", customConnection); - char[] buf = new char[2]; - - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - reader.GetChars(1, 0, buf, 0, 2); - Assert.Equal(buf[0], 'T'); - Assert.Equal(buf[1], 'e'); - } - } - - [Fact] - public void MediumIntBlobSize() - { - executeSQL("DROP TABLE IF EXISTS Test"); - - executeSQL("CREATE TABLE test (id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, " + - "image MEDIUMBLOB NOT NULL, imageSize MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT 0, " + - "PRIMARY KEY (id))"); - - byte[] image = new byte[2048]; - for (int x = 0; x < image.Length; x++) - image[x] = (byte)(x % 47); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO test VALUES(NULL, ?image, ?size)", customConnection); - cmd.Parameters.AddWithValue("?image", image); - cmd.Parameters.AddWithValue("?size", image.Length); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT imageSize, length(image), image FROM test WHERE id=?id"; - cmd.Parameters.AddWithValue("?id", 1); - cmd.Prepare(); - - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - uint actualsize = reader.GetUInt32(1); - Assert.Equal((uint)image.Length, actualsize); - - uint size = reader.GetUInt32(0); - byte[] outImage = new byte[size]; - long len = reader.GetBytes(reader.GetOrdinal("image"), 0, outImage, 0, (int)size); - Assert.Equal((uint)image.Length, size); - Assert.Equal((uint)image.Length, len); - } - } - - [Fact] - public void BlobBiggerThanMaxPacket() - { - executeAsRoot("SET GLOBAL max_allowed_packet=" + 500 * 1024); - - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE test (id INT(10), image BLOB)"); - - using (var c = GetConnection()) - { - c.Open(); - byte[] image = Utils.CreateBlob(1000000); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO test VALUES(NULL, ?image)", c); - cmd.Parameters.AddWithValue("?image", image); - - Exception ex = Assert.Throws(() => cmd.ExecuteNonQuery()); - Assert.Equal(ex.Message, "Packets larger than max_allowed_packet are not allowed."); - } - } - -#if !NETCORE10 - - [Fact] - public void UpdateDataSet() - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (id INT NOT NULL, blob1 LONGBLOB, text1 LONGTEXT, PRIMARY KEY(id))"); - executeSQL("INSERT INTO Test VALUES( 1, NULL, 'Text field' )"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", customConnection); - DataTable dt = new DataTable(); - da.Fill(dt); - - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - - string s = (string)dt.Rows[0][2]; - Assert.Equal("Text field", s); - - byte[] inBuf = Utils.CreateBlob(512); - dt.Rows[0].BeginEdit(); - dt.Rows[0]["blob1"] = inBuf; - dt.Rows[0].EndEdit(); - DataTable changes = dt.GetChanges(); - da.Update(changes); - dt.AcceptChanges(); - - dt.Clear(); - da.Fill(dt); - cb.Dispose(); - - byte[] outBuf = (byte[])dt.Rows[0]["blob1"]; - Assert.True(inBuf.Length == outBuf.Length, "checking length of updated buffer"); - - for (int y = 0; y < inBuf.Length; y++) - Assert.True(inBuf[y] == outBuf[y], "checking array data"); - } -#endif - - public override void Dispose() - { - customConnection.Close(); - base.Dispose(); - } - } -} diff --git a/Tests/MySql.Data.Tests/CharacterSetTests.cs b/Tests/MySql.Data.Tests/CharacterSetTests.cs deleted file mode 100644 index 1adfbd893..000000000 --- a/Tests/MySql.Data.Tests/CharacterSetTests.cs +++ /dev/null @@ -1,693 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Data; - -namespace MySql.Data.MySqlClient.Tests -{ - public class CharacterSetTests : TestBase - { - protected TestSetup ts; - - public CharacterSetTests(TestSetup setup) : base(setup, "characterset") - { - ts = setup; - } - - [Fact] - public void UseFunctions() - { - executeSQL("CREATE TABLE Test (valid char, UserCode varchar(100), password varchar(100)) CHARSET latin1"); - - MySqlConnection c = new MySqlConnection(ts.GetConnection(false).ConnectionString + ";charset=latin1"); - c.Open(); - MySqlCommand cmd = new MySqlCommand("SELECT valid FROM Test WHERE Valid = 'Y' AND " + - "UserCode = 'username' AND Password = AES_ENCRYPT('Password','abc')", c); - cmd.ExecuteScalar(); - c.Close(); - } - - [Fact] - public void VarBinary() - { - if (ts.version < new Version(4, 1)) return; - - executeSQL("CREATE TABLE test (id int, name varchar(200) collate utf8_bin) charset utf8"); - executeSQL("INSERT INTO test VALUES (1, 'Test1')"); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM test", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.Read()); - object o = reader.GetValue(1); - Assert.True(o is string); - } - } - - [Fact] - public void Latin1Connection() - { - if (ts.version < new Version(4, 1)) return; - - executeSQL("CREATE TABLE Test (id INT, name VARCHAR(200)) CHARSET latin1"); - executeSQL("INSERT INTO Test VALUES( 1, _latin1 'Test')"); - - MySqlConnection c = new MySqlConnection(ts.GetConnection(false).ConnectionString + ";charset=latin1"); - c.Open(); - - MySqlCommand cmd = new MySqlCommand("SELECT id FROM Test WHERE name LIKE 'Test'", c); - object id = cmd.ExecuteScalar(); - Assert.Equal(1, id); - c.Close(); - } - -#if !NETCORE10 - /// - /// Bug #14592 Wrong column length returned for VARCHAR UTF8 columns - /// - [Fact] - public void GetSchemaOnUTF8() - { - - executeSQL("CREATE TABLE Test(name VARCHAR(40) NOT NULL, name2 VARCHAR(20)) " + - "CHARACTER SET utf8"); - executeSQL("INSERT INTO Test VALUES('Test', 'Test')"); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM test", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - DataTable dt = reader.GetSchemaTable(); - Assert.Equal(40, dt.Rows[0]["ColumnSize"]); - Assert.Equal(20, dt.Rows[1]["ColumnSize"]); - } - } -#endif - - [Fact] - public void UTF8BlogsTruncating() - { - - executeSQL("DROP TABLE IF EXISTS test"); - executeSQL("CREATE TABLE test (name LONGTEXT) CHARSET utf8"); - - string szParam = "test:éàçùêû"; - string szSQL = "INSERT INTO test Values (?monParametre)"; - - string connStr = ts.GetConnection(false).ConnectionString + ";charset=utf8"; - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - MySqlCommand cmd = new MySqlCommand(szSQL, c); - cmd.Parameters.Add(new MySqlParameter("?monParametre", MySqlDbType.VarChar)); - cmd.Parameters[0].Value = szParam; - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - string s = reader.GetString(0); - Assert.Equal(szParam, s); - } - } - } - -#if !NETCORE10 - - [Fact] - public void BlobAsUtf8() - { - executeSQL(@"CREATE TABLE Test(include_blob BLOB, include_tinyblob TINYBLOB, - include_longblob LONGBLOB, exclude_tinyblob TINYBLOB, exclude_blob BLOB, - exclude_longblob LONGBLOB)"); - - byte[] utf8_bytes = new byte[4] { 0xf0, 0x90, 0x80, 0x80 }; - Encoding utf8 = Encoding.GetEncoding("UTF-8"); - string utf8_string = utf8.GetString(utf8_bytes, 0, utf8_bytes.Length); - - // insert our UTF-8 bytes into the table - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?p1, ?p2, ?p3, ?p4, ?p5, ?p5)", connection); - cmd.Parameters.AddWithValue("?p1", utf8_bytes); - cmd.Parameters.AddWithValue("?p2", utf8_bytes); - cmd.Parameters.AddWithValue("?p3", utf8_bytes); - cmd.Parameters.AddWithValue("?p4", utf8_bytes); - cmd.Parameters.AddWithValue("?p5", utf8_bytes); - cmd.Parameters.AddWithValue("?p6", utf8_bytes); - cmd.ExecuteNonQuery(); - - // now check that the on/off is working - string connStr = ts.GetConnection(false).ConnectionString + ";Treat Blobs As UTF8=yes;BlobAsUTF8IncludePattern=.*"; - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", c); - DataTable dt = new DataTable(); - da.Fill(dt); - foreach (DataColumn col in dt.Columns) - { - Assert.Equal(typeof(string), col.DataType); - string s = (string)dt.Rows[0][0]; - byte[] b = utf8.GetBytes(s); - Assert.Equal(utf8_string, dt.Rows[0][col.Ordinal].ToString()); - } - } - - // now check that exclusion works - connStr = ts.GetConnection(false).ConnectionString + ";Treat Blobs As UTF8=yes;BlobAsUTF8ExcludePattern=exclude.*"; - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", c); - DataTable dt = new DataTable(); - da.Fill(dt); - foreach (DataColumn col in dt.Columns) - { - if (col.ColumnName.StartsWith("exclude", StringComparison.OrdinalIgnoreCase)) - Assert.Equal(typeof(byte[]), col.DataType); - else - { - Assert.Equal(typeof(string), col.DataType); - Assert.Equal(utf8_string, dt.Rows[0][col.Ordinal].ToString()); - } - } - } - - // now check that inclusion works - connStr = ts.GetConnection(false).ConnectionString + ";Treat Blobs As UTF8=yes;BlobAsUTF8IncludePattern=include.*"; - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", c); - DataTable dt = new DataTable(); - da.Fill(dt); - foreach (DataColumn col in dt.Columns) - { - if (col.ColumnName.StartsWith("include", StringComparison.OrdinalIgnoreCase)) - { - Assert.Equal(typeof(string), col.DataType); - Assert.Equal(utf8_string, dt.Rows[0][col.Ordinal].ToString()); - } - else - Assert.Equal(typeof(byte[]), col.DataType); - } - } - } - - - - /// - /// Bug #31185 columns names are incorrect when using the 'AS' clause and name with accents - /// Bug #38721 GetOrdinal doesn't accept column names accepted by MySQL 5.0 - /// - [Fact] - public void UTF8AsColumnNames() - { - string connStr = ts.GetConnection(true).ConnectionString + ";charset=utf8;pooling=false"; - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - - MySqlDataAdapter da = new MySqlDataAdapter("select now() as 'Numéro'", c); - DataTable dt = new DataTable(); - da.Fill(dt); - - Assert.Equal("Numéro", dt.Columns[0].ColumnName); - - MySqlCommand cmd = new MySqlCommand("SELECT NOW() AS 'Numéro'", c); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - int ord = reader.GetOrdinal("Numéro"); - Assert.Equal(0, ord); - } - } - } - -#endif - - /// - /// Bug #31117 Connector/Net exceptions do not support server charset - /// - [Fact] - public void NonLatin1Exception() - { - string connStr = ts.GetConnection(false).ConnectionString + ";charset=utf8"; - - executeSQL("CREATE TABLE Test (id int)"); - - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - - try - { - MySqlCommand cmd = new MySqlCommand("select `Numéro` from Test", c); - cmd.ExecuteScalar(); - } - catch (Exception ex) - { - Assert.Equal("Unknown column 'Numéro' in 'field list'", ex.Message); - } - } - } - - /// - /// Bug #40076 "Functions Return String" option does not set the proper encoding for the string - /// - [Fact] - public void FunctionReturnsStringWithCharSet() - { - string connStr = ts.GetConnection(true).ConnectionString + ";functions return string=true"; - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - - MySqlCommand cmd = new MySqlCommand( - "SELECT CONCAT('Trädgårdsvägen', 1)", c); - - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - Assert.Equal("Trädgårdsvägen1", reader.GetString(0)); - } - } - } - - -#if !NETCORE10 - [Fact] - public void RespectBinaryFlags() - { - if (ts.version.Major >= 5 && ts.version.Minor >= 5) return; - - string connStr = ts.GetConnection(true).ConnectionString + ";respect binary flags=true"; - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - - MySqlDataAdapter da = new MySqlDataAdapter( - "SELECT CONCAT('Trädgårdsvägen', 1)", c); - DataTable dt = new DataTable(); - da.Fill(dt); - Assert.True(dt.Rows[0][0] is byte[]); - } - connStr = ts.GetConnection(true).ConnectionString + ";respect binary flags=false"; - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - - MySqlDataAdapter da = new MySqlDataAdapter( - "SELECT CONCAT('Trädgårdsvägen', 1)", c); - DataTable dt = new DataTable(); - da.Fill(dt); - Assert.True(dt.Rows[0][0] is string); - Assert.Equal("Trädgårdsvägen1", dt.Rows[0][0]); - } - } -#endif - - [Fact] - public void RussianErrorMessagesShowCorrectly() - { - if (ts.version < new Version(5, 5)) - return; - - string connectionString = ts.GetConnection(true).ConnectionString; - using (MySqlConnection connection = new MySqlConnection(connectionString)) - { - connection.Open(); - MySqlCommand cmd = new MySqlCommand("SHOW VARIABLES LIKE '%lc_messages'", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - if (!reader.GetString(1).Equals("ru_RU")) - { - Console.Error.WriteLine("This test requires starting the server with Russian language."); - return; - } - } - } - - connectionString += "; Character Set=cp1251"; - string expected = "У вас ошибка в запросе. Изучите документацию по используемой версии MySQL на предмет корректного синтаксиса около 'query with error' на строке 1"; - - try - { - MySqlHelper.ExecuteNonQuery(connectionString, "query with error"); - } - catch (MySqlException e) - { - Assert.Equal(expected, e.Message); - } - } - - -#if !NETCORE10 - /// - /// Tests for bug http://bugs.mysql.com/bug.php?id=62094 - /// (char field mapped to System.String of MaxLength=3*len(char) in .NET/Connector). - /// - [Fact] - public void GetCharLengthInUTF8() - { - executeSQL( - @"CREATE TABLE `t62094` ( `id` int(11) NOT NULL, `name` char(1) DEFAULT NULL, - `longname` char(20) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;"); - MySqlCommand cmd = new MySqlCommand("select * from t62094", connection); - MySqlDataAdapter ad = new MySqlDataAdapter(cmd); - DataSet ds = new DataSet(); - ad.Fill(ds); - ad.FillSchema(ds, SchemaType.Mapped); - Assert.Equal(1, ds.Tables[0].Columns["name"].MaxLength); - Assert.Equal(20, ds.Tables[0].Columns["longname"].MaxLength); - } -#endif - - /// - /// Test for fix of Connector/NET cannot read data from a MySql table using UTF-16/UTF-32 - /// (MySql bug #69169, Oracle bug #16776818). - /// - [Fact] - public void UsingUtf16() - { - MySqlConnection con = new MySqlConnection(ts.GetConnection(false).ConnectionString); - con.Open(); - try - { - MySqlCommand cmd = new MySqlCommand("", con); - cmd.CommandText = "drop table if exists `actor`"; - cmd.ExecuteNonQuery(); - cmd.CommandText = @"CREATE TABLE `actor` ( - `actor_id` smallint(5) unsigned NOT NULL DEFAULT '0', - `first_name` varchar(45) NOT NULL, - `last_name` varchar(45) NOT NULL, - `last_update` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' - ) ENGINE=InnoDB DEFAULT CHARSET=utf16"; - cmd.ExecuteNonQuery(); - - string[] firstNames = new string[] { "PENELOPE", "NICK", "ED" }; - string[] lastNames = new string[] { "GUINESS", "WAHLBERG", "CHASE" }; - DateTime[] lastUpdates = new DateTime[] { - new DateTime(2006, 2, 15, 4, 34, 33), new DateTime(2007, 2, 15, 4, 34, 33), new DateTime(2008, 4, 15, 4, 34, 33) }; - for (int i = 0; i < firstNames.Length; i++) - { - cmd.CommandText = string.Format( - "insert into `actor`( actor_id, first_name, last_name, last_update ) values ( {0}, '{1}', '{2}', '{3}' )", - i, firstNames[i], lastNames[i], lastUpdates[i].ToString("yyyy/MM/dd hh:mm:ss")); - cmd.ExecuteNonQuery(); - } - - cmd.CommandText = "select actor_id, first_name, last_name, last_update from `actor`"; - - using (MySqlDataReader r = cmd.ExecuteReader()) - { - int j = 0; - while (r.Read()) - { - for (int i = 0; i < r.FieldCount; i++) - { - Assert.True(j == r.GetInt32(0)); - Assert.True(firstNames[j] == r.GetString(1)); - Assert.True(lastNames[j] == r.GetString(2)); - Assert.True(lastUpdates[j] == r.GetDateTime(3)); - } - j++; - } - } - } - finally - { - MySqlCommand cmd = new MySqlCommand("drop table if exists `actor`", con); - cmd.ExecuteNonQuery(); - con.Close(); - } - } - - /// - /// 2nd part of tests for fix of Connector/NET cannot read data from a MySql table using UTF-16/UTF-32 - /// (MySql bug #69169, Oracle bug #16776818). - /// - [Fact] - public void UsingUtf32() - { - MySqlConnection con = new MySqlConnection(ts.GetConnection(false).ConnectionString); - con.Open(); - try - { - MySqlCommand cmd = new MySqlCommand("", con); - cmd.CommandText = "drop table if exists `actor`"; - cmd.ExecuteNonQuery(); - cmd.CommandText = @"CREATE TABLE `actor` ( - `actor_id` smallint(5) unsigned NOT NULL DEFAULT '0', - `first_name` varchar(45) NOT NULL, - `last_name` varchar(45) NOT NULL, - `last_update` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' - ) ENGINE=InnoDB DEFAULT CHARSET=utf32"; - cmd.ExecuteNonQuery(); - - string[] firstNames = new string[] { "PENELOPE", "NICK", "ED" }; - string[] lastNames = new string[] { "GUINESS", "WAHLBERG", "CHASE" }; - DateTime[] lastUpdates = new DateTime[] { - new DateTime(2006, 2, 15, 4, 34, 33), new DateTime(2007, 2, 15, 4, 34, 33), new DateTime(2008, 4, 15, 4, 34, 33) }; - for (int i = 0; i < firstNames.Length; i++) - { - cmd.CommandText = string.Format( - "insert into `actor`( actor_id, first_name, last_name, last_update ) values ( {0}, '{1}', '{2}', '{3}' )", - i, firstNames[i], lastNames[i], lastUpdates[i].ToString("yyyy/MM/dd hh:mm:ss")); - cmd.ExecuteNonQuery(); - } - - cmd.CommandText = "select actor_id, first_name, last_name, last_update from `actor`"; - - using (MySqlDataReader r = cmd.ExecuteReader()) - { - int j = 0; - while (r.Read()) - { - for (int i = 0; i < r.FieldCount; i++) - { - Assert.True(j == r.GetInt32(0)); - Assert.True(firstNames[j] == r.GetString(1)); - Assert.True(lastNames[j] == r.GetString(2)); - Assert.True(lastUpdates[j] == r.GetDateTime(3)); - } - j++; - } - } - } - finally - { - MySqlCommand cmd = new MySqlCommand("drop table if exists `actor`", con); - cmd.ExecuteNonQuery(); - con.Close(); - } - } - - - - /// - /// Test for new functionality on 5.7.9 supporting chinese character sets gb18030 - /// WL #4024 - /// (Oracle bug #21098546). - /// - [Fact] - public void CanInsertChineseCharacterSetGB18030() - { - if (ts.version < new Version(5, 7, 4)) return; - - try - { - executeSQL("CREATE TABLE Test (id int, name VARCHAR(100) CHAR SET gb18030, KEY(name(20)))"); - using (MySqlConnection c = new MySqlConnection(ts.GetConnection(false).ConnectionString + ";charset=gb18030")) - { - c.Open(); - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1, '㭋玤䂜蚌')", c); - cmd.ExecuteNonQuery(); - cmd = new MySqlCommand("INSERT INTO Test VALUES(2, 0xC4EEC5ABBDBFA1A4B3E0B1DABBB3B9C520A1A4CBD5B6ABC6C2)", c); - cmd.ExecuteNonQuery(); - cmd = new MySqlCommand("SELECT id, name from Test", c); - var reader = cmd.ExecuteReader(); - while (reader.Read()) - { - if (reader.GetUInt32(0) == 1) - Assert.Equal("㭋玤䂜蚌", reader.GetString(1)); - if (reader.GetUInt32(0) == 2) - Assert.Equal("念奴娇·赤壁怀古 ·苏东坡", reader.GetString(1)); - } - } - } - finally - { - executeSQL("drop table if exists `Test`"); - } - } - - - - /// - /// Test for new functionality on 5.7.9 supporting chinese character sets on gb18030 - /// WL #4024 - /// (Oracle bug #21098546). - /// - [Fact] - public void CanCreateDbUsingChineseCharacterSetGB18030() - { - if (ts.version < new Version(5, 7, 4)) return; - - MySqlConnectionStringBuilder rootSb = new MySqlConnectionStringBuilder(ts.GetConnection(true).ConnectionString); - rootSb.CharacterSet = "gb18030"; - using (MySqlConnection rootConnection = new MySqlConnection(rootSb.ToString())) - { - string database = "㭋玤䂜蚌"; - - rootConnection.Open(); - MySqlCommand rootCommand = new MySqlCommand(); - rootCommand.Connection = rootConnection; - rootCommand.CommandText = string.Format("CREATE DATABASE `{0}` CHARSET=gb18030;", database); - rootCommand.ExecuteNonQuery(); - - try - { - rootSb.Database = database; - using (MySqlConnection conn = new MySqlConnection(rootSb.ConnectionString)) - { - conn.Open(); - Assert.Equal(database, conn.Database); - } - } - finally - { - if (rootConnection.State == ConnectionState.Open) - { - rootCommand.CommandText = string.Format("DROP DATABASE `{0}`;", database); - rootCommand.ExecuteNonQuery(); - } - } - } - } - - public override void Dispose() - { - executeSQL("DROP TABLE IF EXISTS TEST"); - executeSQL("DROP TABLE IF EXISTS t62094"); - base.Dispose(); - } - - [Fact] - public void UTF16LETest() - { - if (ts.version < new Version(5, 6)) return; - - using (MySqlDataReader reader = ExecuteAsReader("select _utf16le 'utf16le test';", connection)) - { - while (reader.Read()) - { - Assert.Equal("瑵ㅦ氶⁥整瑳", reader[0].ToString()); - } - } - } - -#if !NETCORE10 - [Fact] - public void GEOSTD8Test() - { - MySqlConnection dbconn = new MySqlConnection(ts.GetConnection(false).ConnectionString); - try - { - using (MySqlCommand cmd = new MySqlCommand("select _geostd8 'geostd8 test';", dbconn)) - { - dbconn.Open(); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - while (reader.Read()) - { - Assert.Equal("geostd8 test", reader[0].ToString()); - } - } - } - throw new Exception("The test should have failed with a MySqlException but it does not."); - } - catch (MySqlException ex) - { - while (ex.InnerException != null) - ex = (MySqlException)ex.InnerException; - - Assert.Equal(typeof(MySqlException), ex.GetType()); - } - catch (Exception ex) - { - Assert.Equal(typeof(MySqlException), ex.GetType()); - } - finally - { - dbconn.Close(); - } - } -#endif - - [Fact] - public void ExtendedCharsetOnConnection() - { - MySqlConnectionStringBuilder rootSb = new MySqlConnectionStringBuilder(ts.GetConnection(true).ConnectionString); - rootSb.CharacterSet = "utf8"; - using (MySqlConnection rootConnection = new MySqlConnection(rootSb.ToString())) - { - string database = "数据库"; - string user = "用户"; - string password = "test"; - - rootConnection.Open(); - MySqlCommand rootCommand = new MySqlCommand(); - rootCommand.Connection = rootConnection; - rootCommand.CommandText = string.Format("CREATE DATABASE `{0}`;", database); - rootCommand.CommandText += string.Format("GRANT ALL ON `{0}`.* to '{1}'@'localhost' identified by '{2}';", database, user, password); - rootCommand.ExecuteNonQuery(); - - string connString = ts.GetConnection(false).ConnectionString; - MySqlConnectionStringBuilder sb = new MySqlConnectionStringBuilder(connString); - sb.Database = database; - sb.UserID = user; - sb.Password = password; - sb.CharacterSet = "utf8"; - try - { - using (MySqlConnection conn = new MySqlConnection(sb.ToString())) - { - conn.Open(); - Assert.Equal(database, conn.Database); - } - } - finally - { - if (rootConnection.State == ConnectionState.Open) - { - rootCommand.CommandText = string.Format("DROP DATABASE `{0}`;DROP USER '{1}'@'localhost'", database, user); - rootCommand.ExecuteNonQuery(); - } - } - } - } - } -} diff --git a/Tests/MySql.Data.Tests/CompressBlobTests.cs b/Tests/MySql.Data.Tests/CompressBlobTests.cs deleted file mode 100644 index 9de800b88..000000000 --- a/Tests/MySql.Data.Tests/CompressBlobTests.cs +++ /dev/null @@ -1,371 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.ComponentModel; -using System.Data; -using Xunit; - - -namespace MySql.Data.MySqlClient.Tests -{ - public class CompressBlobTests : TestBase, IDisposable - { - protected TestSetup Ts; - - public CompressBlobTests(TestSetup setup) : base(setup, "compress_blob") - { - Ts = setup; - customConnection = new MySqlConnection(Ts.GetConnection().ConnectionString + ";" + OnGetConnectionStringInfo()); - customConnection.Open(); - } - - - protected CompressBlobTests(TestSetup setup, String nameSpace) : base(setup, nameSpace) - { - Ts = setup; - customConnection = new MySqlConnection(Ts.GetConnection().ConnectionString + ";" + OnGetConnectionStringInfo()); - customConnection.Open(); - } - - protected sealed override string OnGetConnectionStringInfo() - { - return "ssl mode=Preferred;Use Compression=True"; - } - - [Fact] - public void InsertNullBinary() - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (id INT NOT NULL, blob1 LONGBLOB, PRIMARY KEY(id))"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?id, ?b1)", customConnection); - cmd.Parameters.Add(new MySqlParameter("?id", 1)); - cmd.Parameters.Add(new MySqlParameter("?b1", null)); - int rows = cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.HasRows == true, "Checking HasRows"); - - reader.Read(); - var value = reader.GetValue(1) as string; - Assert.True(value == null); - } - } - - [Fact] - public void InsertBinary() - { - int lenIn = 40000; - byte[] dataIn = Utils.CreateBlob(lenIn); - - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (id INT NOT NULL, blob1 LONGBLOB, PRIMARY KEY(id))"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?id, ?b1)", customConnection); - cmd.Parameters.Add(new MySqlParameter("?id", 1)); - cmd.Parameters.Add(new MySqlParameter("?b1", dataIn)); - int rows = cmd.ExecuteNonQuery(); - - byte[] dataIn2 = Utils.CreateBlob(lenIn); - cmd.Parameters[0].Value = 2; - cmd.Parameters[1].Value = dataIn2; - rows += cmd.ExecuteNonQuery(); - - Assert.True(rows == 2, "Checking insert rowcount"); - - cmd.CommandText = "SELECT * FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.HasRows == true, "Checking HasRows"); - - reader.Read(); - - byte[] dataOut = new byte[lenIn]; - long lenOut = reader.GetBytes(1, 0, dataOut, 0, lenIn); - - Assert.True(lenIn == lenOut, "Checking length of binary data (row 1)"); - - // now see if the buffer is intact - for (int x = 0; x < dataIn.Length; x++) - Assert.True(dataIn[x] == dataOut[x], "Checking first binary array at " + x); - - // now we test chunking - int pos = 0; - int lenToRead = dataIn.Length; - while (lenToRead > 0) - { - int size = Math.Min(lenToRead, 1024); - int read = (int)reader.GetBytes(1, pos, dataOut, pos, size); - lenToRead -= read; - pos += read; - } - // now see if the buffer is intact - for (int x = 0; x < dataIn.Length; x++) - Assert.True(dataIn[x] == dataOut[x], "Checking first binary array at " + x); - - reader.Read(); - lenOut = reader.GetBytes(1, 0, dataOut, 0, lenIn); - Assert.True(lenIn == lenOut, "Checking length of binary data (row 2)"); - - // now see if the buffer is intact - for (int x = 0; x < dataIn2.Length; x++) - Assert.True(dataIn2[x] == dataOut[x], "Checking second binary array at " + x); - } - } - - [Fact] - public void GetChars() - { - InternalGetChars(false); - } - - [Fact] - public void GetCharsPrepared() - { - InternalGetChars(true); - } - - private void InternalGetChars(bool prepare) - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (id INT NOT NULL, text1 LONGTEXT, PRIMARY KEY(id))"); - - char[] data = new char[20000]; - for (int x = 0; x < data.Length; x++) - data[x] = (char)(65 + (x % 20)); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (1, ?text1)", customConnection); - cmd.Parameters.AddWithValue("?text1", data); - if (prepare) - cmd.Prepare(); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM Test"; - cmd.Parameters.Clear(); - if (prepare) - cmd.Prepare(); - - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - - // now we test chunking - char[] dataOut = new char[data.Length]; - int pos = 0; - int lenToRead = data.Length; - while (lenToRead > 0) - { - int size = Math.Min(lenToRead, 1024); - int read = (int)reader.GetChars(1, pos, dataOut, pos, size); - lenToRead -= read; - pos += read; - } - // now see if the buffer is intact - for (int x = 0; x < data.Length; x++) - Assert.True(data[x] == dataOut[x], "Checking first text array at " + x); - } - } - - [Fact] - public void InsertText() - { - InternalInsertText(false); - } - - [Fact] - public void InsertTextPrepared() - { - InternalInsertText(true); - } - - private void InternalInsertText(bool prepare) - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (id INT NOT NULL, blob1 LONGBLOB, text1 LONGTEXT, PRIMARY KEY(id))"); - - byte[] data = new byte[1024]; - for (int x = 0; x < 1024; x++) - data[x] = (byte)(65 + (x % 20)); - - // Create sample table - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (1, ?b1, ?t1)", customConnection); - cmd.Parameters.Add(new MySqlParameter("?t1", data)); - cmd.Parameters.Add(new MySqlParameter("?b1", "This is my blob data")); - if (prepare) cmd.Prepare(); - int rows = cmd.ExecuteNonQuery(); - Assert.True(rows == 1, "Checking insert rowcount"); - - cmd.CommandText = "INSERT INTO Test VALUES(2, ?b1, ?t1)"; - cmd.Parameters.Clear(); - cmd.Parameters.AddWithValue("?t1", DBNull.Value); - string str = "This is my text value"; - - cmd.Parameters.AddWithValue("?b1", str); - - rows = cmd.ExecuteNonQuery(); - Assert.True(rows == 1, "Checking insert rowcount"); - - cmd.CommandText = "SELECT * FROM Test"; - if (prepare) cmd.Prepare(); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.HasRows, "Checking HasRows"); - - Assert.True(reader.Read()); - - Assert.Equal("This is my blob data", reader.GetString(1)); - string s = reader.GetString(2); - Assert.True(s.Length == 1024, "Checking length returned "); - Assert.True(s.Substring(0, 9) == "ABCDEFGHI", "Checking first few chars of string"); - - Assert.True(reader.Read()); - Assert.Equal(DBNull.Value, reader.GetValue(2)); - Assert.Equal("This is my text value", reader.GetString(1)); - } - } - - [Fact] - public void GetCharsOnLongTextColumn() - { - //if (connection.connectionState != ConnectionState.Open) - // connection.Open(); - - executeSQL("CREATE TABLE Test1 (id INT NOT NULL, blob1 LONGBLOB, text1 LONGTEXT, PRIMARY KEY(id))"); - executeSQL("INSERT INTO Test1 (id, text1) VALUES(1, 'Test')"); - - MySqlCommand cmd = new MySqlCommand("SELECT id, text1 FROM Test1", customConnection); - char[] buf = new char[2]; - - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - reader.GetChars(1, 0, buf, 0, 2); - Assert.Equal(buf[0], 'T'); - Assert.Equal(buf[1], 'e'); - } - } - - [Fact] - public void MediumIntBlobSize() - { - executeSQL("DROP TABLE IF EXISTS Test"); - - executeSQL("CREATE TABLE test (id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, " + - "image MEDIUMBLOB NOT NULL, imageSize MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT 0, " + - "PRIMARY KEY (id))"); - - byte[] image = new byte[2048]; - for (int x = 0; x < image.Length; x++) - image[x] = (byte)(x % 47); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO test VALUES(NULL, ?image, ?size)", customConnection); - cmd.Parameters.AddWithValue("?image", image); - cmd.Parameters.AddWithValue("?size", image.Length); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT imageSize, length(image), image FROM test WHERE id=?id"; - cmd.Parameters.AddWithValue("?id", 1); - cmd.Prepare(); - - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - uint actualsize = reader.GetUInt32(1); - Assert.Equal((uint)image.Length, actualsize); - - uint size = reader.GetUInt32(0); - byte[] outImage = new byte[size]; - long len = reader.GetBytes(reader.GetOrdinal("image"), 0, outImage, 0, (int)size); - Assert.Equal((uint)image.Length, size); - Assert.Equal((uint)image.Length, len); - } - } - - [Fact] - public void BlobBiggerThanMaxPacket() - { - executeAsRoot("SET GLOBAL max_allowed_packet=" + 500 * 1024); - - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE test (id INT(10), image BLOB)"); - - using (MySqlConnection c = new MySqlConnection(customConnection.ConnectionString)) - { - c.Open(); - byte[] image = Utils.CreateBlob(1000000); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO test VALUES(NULL, ?image)", c); - cmd.Parameters.AddWithValue("?image", image); - - Exception ex = Assert.Throws(() => cmd.ExecuteNonQuery()); - Assert.Equal("Packets larger than max_allowed_packet are not allowed.", ex.Message); - } - } - -#if !NETCORE10 - - [Fact] - public void UpdateDataSet() - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (id INT NOT NULL, blob1 LONGBLOB, text1 LONGTEXT, PRIMARY KEY(id))"); - executeSQL("INSERT INTO Test VALUES( 1, NULL, 'Text field' )"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", customConnection); - DataTable dt = new DataTable(); - da.Fill(dt); - - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - - string s = (string)dt.Rows[0][2]; - Assert.Equal("Text field", s); - - byte[] inBuf = Utils.CreateBlob(512); - dt.Rows[0].BeginEdit(); - dt.Rows[0]["blob1"] = inBuf; - dt.Rows[0].EndEdit(); - DataTable changes = dt.GetChanges(); - da.Update(changes); - dt.AcceptChanges(); - - dt.Clear(); - da.Fill(dt); - cb.Dispose(); - - byte[] outBuf = (byte[])dt.Rows[0]["blob1"]; - Assert.True(inBuf.Length == outBuf.Length, "checking length of updated buffer"); - - for (int y = 0; y < inBuf.Length; y++) - Assert.True(inBuf[y] == outBuf[y], "checking array data"); - } -#endif - - public override void Dispose() - { - customConnection.Close(); - base.Dispose(); - } - } -} diff --git a/Tests/MySql.Data.Tests/CultureTests.cs b/Tests/MySql.Data.Tests/CultureTests.cs deleted file mode 100644 index bd0f49707..000000000 --- a/Tests/MySql.Data.Tests/CultureTests.cs +++ /dev/null @@ -1,189 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Threading; -using System.Globalization; -using System.Data; - -namespace MySql.Data.MySqlClient.Tests -{ - public class CultureTests : TestBase - { - protected TestSetup ts; - - public CultureTests(TestSetup setup): base(setup, "culturetests") - { - ts = setup; - } - -#if !NETCORE10 - [Fact] - public void TestFloats() - { - InternalTestFloats(false); - } - - [Fact] - public void TestFloatsPrepared() - { - if (ts.version < new Version(4, 1)) return; - - InternalTestFloats(true); - } - - - private void InternalTestFloats(bool prepared) - { - CultureInfo curCulture = Thread.CurrentThread.CurrentCulture; - CultureInfo curUICulture = Thread.CurrentThread.CurrentUICulture; - CultureInfo c = new CultureInfo("de-DE"); - Thread.CurrentThread.CurrentCulture = c; - Thread.CurrentThread.CurrentUICulture = c; - - executeSQL("CREATE TABLE Test (fl FLOAT, db DOUBLE, dec1 DECIMAL(5,2))"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?fl, ?db, ?dec)", connection); - cmd.Parameters.Add("?fl", MySqlDbType.Float); - cmd.Parameters.Add("?db", MySqlDbType.Double); - cmd.Parameters.Add("?dec", MySqlDbType.Decimal); - cmd.Parameters[0].Value = 2.3; - cmd.Parameters[1].Value = 4.6; - cmd.Parameters[2].Value = 23.82; - if (prepared) - cmd.Prepare(); - int count = cmd.ExecuteNonQuery(); - Assert.Equal(1, count); - - try - { - cmd.CommandText = "SELECT * FROM Test"; - if (prepared) cmd.Prepare(); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - Assert.Equal((decimal)2.3, (decimal)reader.GetFloat(0)); - Assert.Equal(4.6, reader.GetDouble(1)); - Assert.Equal((decimal)23.82, reader.GetDecimal(2)); - } - } - finally - { - Thread.CurrentThread.CurrentCulture = curCulture; - Thread.CurrentThread.CurrentUICulture = curUICulture; - } - } - - /// - /// Bug #8228 turkish character set causing the error - /// - [Fact] - public void Turkish() - { - CultureInfo curCulture = Thread.CurrentThread.CurrentCulture; - CultureInfo curUICulture = Thread.CurrentThread.CurrentUICulture; - CultureInfo c = new CultureInfo("tr-TR"); - Thread.CurrentThread.CurrentCulture = c; - Thread.CurrentThread.CurrentUICulture = c; - - using (MySqlConnection newConn = new MySqlConnection(ts.GetConnection(true).ConnectionString)) - { - newConn.Open(); - } - - Thread.CurrentThread.CurrentCulture = curCulture; - Thread.CurrentThread.CurrentUICulture = curUICulture; - } - - /// - /// Bug #29931 Connector/NET does not handle Saudi Hijri calendar correctly - /// - [Fact] - public void ArabicCalendars() - { - executeSQL("CREATE TABLE test(dt DATETIME)"); - executeSQL("INSERT INTO test VALUES ('2007-01-01 12:30:45')"); - - CultureInfo curCulture = Thread.CurrentThread.CurrentCulture; - CultureInfo curUICulture = Thread.CurrentThread.CurrentUICulture; - CultureInfo c = new CultureInfo("ar-SA"); - Thread.CurrentThread.CurrentCulture = c; - Thread.CurrentThread.CurrentUICulture = c; - - MySqlCommand cmd = new MySqlCommand("SELECT dt FROM test", connection); - DateTime dt = (DateTime)cmd.ExecuteScalar(); - Assert.Equal(2007, dt.Year); - Assert.Equal(1, dt.Month); - Assert.Equal(1, dt.Day); - Assert.Equal(12, dt.Hour); - Assert.Equal(30, dt.Minute); - Assert.Equal(45, dt.Second); - - Thread.CurrentThread.CurrentCulture = curCulture; - Thread.CurrentThread.CurrentUICulture = curUICulture; - } - - /// - /// Bug #52187 FunctionsReturnString=true messes up decimal separator - /// - [Fact] - public void FunctionsReturnStringAndDecimal() - { - executeSQL("CREATE TABLE bug52187a (a decimal(5,2) not null)"); - executeSQL("CREATE TABLE bug52187b (b decimal(5,2) not null)"); - executeSQL("insert into bug52187a values (1.25)"); - executeSQL("insert into bug52187b values (5.99)"); - - CultureInfo curCulture = Thread.CurrentThread.CurrentCulture; - CultureInfo curUICulture = Thread.CurrentThread.CurrentUICulture; - CultureInfo c = new CultureInfo("pt-PT"); - Thread.CurrentThread.CurrentCulture = c; - Thread.CurrentThread.CurrentUICulture = c; - - string connStr = ts.GetConnection(false).ConnectionString + ";functions return string=true"; - try - { - using (MySqlConnection con = new MySqlConnection(connStr)) - { - con.Open(); - MySqlDataAdapter da = new MySqlDataAdapter( - "select *,(select b from bug52187b) as field_b from bug52187a", con); - DataTable dt = new DataTable(); - da.Fill(dt); - Assert.Equal(1, dt.Rows.Count); - Assert.Equal((decimal)1.25, (decimal)dt.Rows[0][0]); - Assert.Equal((decimal)5.99, (decimal)dt.Rows[0][1]); - } - } - finally - { - Thread.CurrentThread.CurrentCulture = curCulture; - Thread.CurrentThread.CurrentUICulture = curUICulture; - } - - } -#endif - } -} diff --git a/Tests/MySql.Data.Tests/DataTypeTests.cs b/Tests/MySql.Data.Tests/DataTypeTests.cs deleted file mode 100644 index 93a051930..000000000 --- a/Tests/MySql.Data.Tests/DataTypeTests.cs +++ /dev/null @@ -1,1366 +0,0 @@ -// Copyright © 2013, 2015 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Data; -using MySql.Data.Types; -using System.Data.Common; - -namespace MySql.Data.MySqlClient.Tests -{ - public class DataTypeTests : TestBase - { - protected TestSetup ts; - - public DataTypeTests(TestSetup setup) : base(setup, "datatypetests") - { - ts = setup; - } - - [Fact] - public void BytesAndBooleans() - { - InternalBytesAndBooleans(false); - } - - [Fact] - public void BytesAndBooleansPrepared() - { - if (ts.version < new Version(4, 1)) return; - - InternalBytesAndBooleans(true); - } - - private void InternalBytesAndBooleans(bool prepare) - { - executeSQL("CREATE TABLE Test (id TINYINT, idu TINYINT UNSIGNED, i INT UNSIGNED)"); - executeSQL("INSERT INTO Test VALUES (-98, 140, 20)"); - executeSQL("INSERT INTO Test VALUES (0, 0, 0)"); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", connection); - if (prepare) cmd.Prepare(); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.Read()); - Assert.Equal(-98, (sbyte)reader.GetByte(0)); - Assert.Equal(140, reader.GetByte(1)); - Assert.True(reader.GetBoolean(1)); - Assert.Equal(20, Convert.ToInt32(reader.GetUInt32(2))); - Assert.Equal(20, reader.GetInt32(2)); - - Assert.True(reader.Read()); - Assert.Equal(0, reader.GetByte(0)); - Assert.Equal(0, reader.GetByte(1)); - Assert.False(reader.GetBoolean(1)); - - Assert.False(reader.Read()); - } - } - - /// - /// Bug#46205 - tinyint as boolean does not work for utf8 default database character set. - /// - /// - /// Original bug occured only with mysqld started with --default-character-set=utf8. - /// It does not seem possible to reproduce the original buggy behavior´otherwise - /// Neither "set global character_set_server = utf8" , nor "create table /database with character set " - /// were sufficient. - /// - [Fact] - public void TreatTinyAsBool() - { - if (ts.version < new Version(4, 1)) return; - executeSQL("CREATE TABLE Test2(i TINYINT(1))"); - executeSQL("INSERT INTO Test2 VALUES(1)"); - executeSQL("INSERT INTO Test2 VALUES(0)"); - executeSQL("INSERT INTO Test2 VALUES(2)"); - MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder(connection.ConnectionString); - Assert.True(builder.TreatTinyAsBoolean); - - MySqlCommand cmd = new MySqlCommand("SELECT * from Test2", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - bool b; - Assert.True(reader.Read()); - b = (bool)reader.GetValue(0); - Assert.True(b); - Assert.True(reader.Read()); - b = (bool)reader.GetValue(0); - Assert.False(b); - Assert.True(reader.Read()); - b = (bool)reader.GetValue(0); - Assert.True(b); - } - } - - [Fact] - public void TestFloat() - { - InternalTestFloats(false); - } - - [Fact] - public void TestFloatPrepared() - { - if (ts.version < new Version(4, 1)) return; - - InternalTestFloats(true); - } - - private void InternalTestFloats(bool prepared) - { - executeSQL("CREATE TABLE Test (fl FLOAT, db DOUBLE, dec1 DECIMAL(5,2))"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?fl, ?db, ?dec)", connection); - cmd.Parameters.Add("?fl", MySqlDbType.Float); - cmd.Parameters.Add("?db", MySqlDbType.Double); - cmd.Parameters.Add("?dec", MySqlDbType.Decimal); - cmd.Parameters[0].Value = 2.3; - cmd.Parameters[1].Value = 4.6; - cmd.Parameters[2].Value = 23.82; - if (prepared) - cmd.Prepare(); - int count = cmd.ExecuteNonQuery(); - Assert.Equal(1, count); - - cmd.Parameters[0].Value = 1.5; - cmd.Parameters[1].Value = 47.85; - cmd.Parameters[2].Value = 123.85; - count = cmd.ExecuteNonQuery(); - Assert.Equal(1, count); - - cmd.CommandText = "SELECT * FROM Test"; - if (prepared) - cmd.Prepare(); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.Read()); - Assert.True((decimal)2.3 == (decimal)reader.GetFloat(0)); - Assert.Equal(4.6, reader.GetDouble(1)); - Assert.True((decimal)23.82 == reader.GetDecimal(2)); - - Assert.True(reader.Read()); - Assert.True((decimal)1.5 == (decimal)reader.GetFloat(0)); - Assert.Equal(47.85, reader.GetDouble(1)); - Assert.True((decimal)123.85 == reader.GetDecimal(2)); - } - } - - [Fact] - public void TestTime() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), d DATE, dt DATETIME, tm TIME, PRIMARY KEY(id))"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id, tm) VALUES (1, '00:00')", connection); - cmd.ExecuteNonQuery(); - cmd.CommandText = "INSERT INTO Test (id, tm) VALUES (2, '512:45:17')"; - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - - object value = reader["tm"]; - Assert.Equal(value.GetType(), typeof(TimeSpan)); - TimeSpan ts = (TimeSpan)reader["tm"]; - Assert.Equal(0, ts.Hours); - Assert.Equal(0, ts.Minutes); - Assert.Equal(0, ts.Seconds); - - reader.Read(); - value = reader["tm"]; - Assert.Equal(value.GetType(), typeof(TimeSpan)); - ts = (TimeSpan)reader["tm"]; - Assert.Equal(21, ts.Days); - Assert.Equal(8, ts.Hours); - Assert.Equal(45, ts.Minutes); - Assert.Equal(17, ts.Seconds); - } - } - - [Fact] - public void YearType() - { - executeSQL("CREATE TABLE Test (yr YEAR)"); - executeSQL("INSERT INTO Test VALUES (98)"); - executeSQL("INSERT INTO Test VALUES (1990)"); - executeSQL("INSERT INTO Test VALUES (2004)"); - executeSQL("SET SQL_MODE=''"); - executeSQL("INSERT INTO Test VALUES (111111111111111111111)"); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - Assert.True(1998 == reader.GetUInt32(0)); - reader.Read(); - Assert.True(1990 == reader.GetUInt32(0)); - reader.Read(); - Assert.True(2004 == reader.GetUInt32(0)); - reader.Read(); - Assert.True(0 == reader.GetUInt32(0)); - } - } - - [Fact] - public void TypeCoercion() - { - MySqlParameter p = new MySqlParameter("?test", 1); - Assert.Equal(DbType.Int32, p.DbType); - Assert.Equal(MySqlDbType.Int32, p.MySqlDbType); - - p.DbType = DbType.Int64; - Assert.Equal(DbType.Int64, p.DbType); - Assert.Equal(MySqlDbType.Int64, p.MySqlDbType); - - p.MySqlDbType = MySqlDbType.Int16; - Assert.Equal(DbType.Int16, p.DbType); - Assert.Equal(MySqlDbType.Int16, p.MySqlDbType); - } - - /// - /// Bug #7951 - Error reading timestamp column - /// - [Fact] - public void Timestamp() - { - // don't run this test on 6 and higher - if (ts.version.Major >= 5 && ts.version.Minor >= 5) return; - - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (id int, dt DATETIME, ts2 TIMESTAMP(2), ts4 TIMESTAMP(4), " + - "ts6 TIMESTAMP(6), ts8 TIMESTAMP(8), ts10 TIMESTAMP(10), ts12 TIMESTAMP(12), " + - "ts14 TIMESTAMP(14))"); - executeSQL("INSERT INTO Test (id, dt, ts2, ts4, ts6, ts8, ts10, ts12, ts14) " + - "VALUES (1, Now(), Now(), Now(), Now(), Now(), Now(), Now(), Now())"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - DataTable dt = new DataTable(); - da.Fill(dt); - - DateTime now = (DateTime)dt.Rows[0]["dt"]; - Assert.Equal(1, dt.Rows[0]["id"]); - - DateTime ts2 = (DateTime)dt.Rows[0]["ts2"]; - Assert.Equal(now.Year, ts2.Year); - - DateTime ts4 = (DateTime)dt.Rows[0]["ts4"]; - Assert.Equal(now.Year, ts4.Year); - Assert.Equal(now.Month, ts4.Month); - - DateTime ts6 = (DateTime)dt.Rows[0]["ts6"]; - Assert.Equal(now.Year, ts6.Year); - Assert.Equal(now.Month, ts6.Month); - Assert.Equal(now.Day, ts6.Day); - - DateTime ts8 = (DateTime)dt.Rows[0]["ts8"]; - Assert.Equal(now.Year, ts8.Year); - Assert.Equal(now.Month, ts8.Month); - Assert.Equal(now.Day, ts8.Day); - - DateTime ts10 = (DateTime)dt.Rows[0]["ts10"]; - Assert.Equal(now.Year, ts10.Year); - Assert.Equal(now.Month, ts10.Month); - Assert.Equal(now.Day, ts10.Day); - Assert.Equal(now.Hour, ts10.Hour); - Assert.Equal(now.Minute, ts10.Minute); - - DateTime ts12 = (DateTime)dt.Rows[0]["ts12"]; - Assert.Equal(now.Year, ts12.Year); - Assert.Equal(now.Month, ts12.Month); - Assert.Equal(now.Day, ts12.Day); - Assert.Equal(now.Hour, ts12.Hour); - Assert.Equal(now.Minute, ts12.Minute); - Assert.Equal(now.Second, ts12.Second); - - DateTime ts14 = (DateTime)dt.Rows[0]["ts14"]; - Assert.Equal(now.Year, ts14.Year); - Assert.Equal(now.Month, ts14.Month); - Assert.Equal(now.Day, ts14.Day); - Assert.Equal(now.Hour, ts14.Hour); - Assert.Equal(now.Minute, ts14.Minute); - Assert.Equal(now.Second, ts14.Second); - } - - - [Fact] - public void AggregateTypesTest() - { - executeSQL("CREATE TABLE foo (abigint bigint, aint int)"); - executeSQL("INSERT INTO foo VALUES (1, 2)"); - executeSQL("INSERT INTO foo VALUES (2, 3)"); - executeSQL("INSERT INTO foo VALUES (3, 4)"); - executeSQL("INSERT INTO foo VALUES (3, 5)"); - - // Try a normal query - string NORMAL_QRY = "SELECT abigint, aint FROM foo WHERE abigint = {0}"; - string qry = String.Format(NORMAL_QRY, 3); - MySqlCommand cmd = new MySqlCommand(qry, connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - while (reader.Read()) - { - reader.GetInt64(0); - reader.GetInt32(1); // <--- aint... this succeeds - } - } - - cmd.CommandText = "SELECT abigint, max(aint) FROM foo GROUP BY abigint"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - while (reader.Read()) - { - reader.GetInt64(0); - reader.GetInt64(1); // <--- max(aint)... this fails - } - } - } - - [Fact] - public void BitAndDecimal() - { - executeSQL("CREATE TABLE Test (bt1 BIT(2), bt4 BIT(4), bt11 BIT(11), bt23 BIT(23), bt32 BIT(32)) engine=myisam"); - executeSQL("INSERT INTO Test VALUES (2, 3, 120, 240, 1000)"); - executeSQL("INSERT INTO Test VALUES (NULL, NULL, 100, NULL, NULL)"); - - string connStr = ts.GetConnection(false).ConnectionString + ";treat tiny as boolean=false"; - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", c); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.Read()); - Assert.Equal(2, reader.GetInt32(0)); - Assert.Equal(3, reader.GetInt32(1)); - Assert.Equal(120, reader.GetInt32(2)); - if (ts.version >= new Version(5, 0)) - { - Assert.Equal(240, reader.GetInt32(3)); - Assert.Equal(1000, reader.GetInt32(4)); - } - else - { - Assert.Equal(127, reader.GetInt32(3)); - Assert.Equal(127, reader.GetInt32(4)); - } - - Assert.True(reader.Read()); - Assert.True(reader.IsDBNull(0)); - Assert.True(reader.IsDBNull(1)); - Assert.Equal(100, reader.GetInt32(2)); - Assert.True(reader.IsDBNull(3)); - Assert.True(reader.IsDBNull(4)); - } - } - } - - /// - /// Bug #10486 MySqlDataAdapter.Update error for decimal column - /// - [Fact] - public void UpdateDecimalColumns() - { - executeSQL("CREATE TABLE Test (id int not null auto_increment primary key, " + - "dec1 decimal(10,1))"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - DataTable dt = new DataTable(); - da.Fill(dt); - DataRow row = dt.NewRow(); - row["id"] = DBNull.Value; - row["dec1"] = 23.4; - dt.Rows.Add(row); - da.Update(dt); - - dt.Clear(); - da.Fill(dt); - Assert.Equal(1, dt.Rows.Count); - Assert.Equal(1, dt.Rows[0]["id"]); - Assert.Equal((decimal)23.4, Convert.ToDecimal(dt.Rows[0]["dec1"])); - cb.Dispose(); - } - - [Fact] - public void DecimalTests() - { - executeSQL("CREATE TABLE Test (val decimal(10,1))"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(?dec)", connection); - cmd.Parameters.AddWithValue("?dec", (decimal)2.4); - Assert.Equal(1, cmd.ExecuteNonQuery()); - - cmd.Prepare(); - Assert.Equal(1, cmd.ExecuteNonQuery()); - - cmd.CommandText = "SELECT * FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.Read()); - Assert.True(reader[0] is Decimal); - Assert.Equal((decimal)2.4, Convert.ToDecimal(reader[0])); - - Assert.True(reader.Read()); - Assert.True(reader[0] is Decimal); - Assert.Equal((decimal)2.4, Convert.ToDecimal(reader[0])); - - Assert.False(reader.Read()); - Assert.False(reader.NextResult()); - } - } - - [Fact] - public void DecimalTests2() - { - executeSQL("CREATE TABLE Test (val decimal(10,1))"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(?dec)", connection); - cmd.Parameters.AddWithValue("?dec", (decimal)2.4); - Assert.Equal(1, cmd.ExecuteNonQuery()); - - cmd.Prepare(); - Assert.Equal(1, cmd.ExecuteNonQuery()); - - cmd.CommandText = "SELECT * FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.Read()); - Assert.True(reader[0] is Decimal); - Assert.Equal((decimal)2.4, Convert.ToDecimal(reader[0])); - - Assert.True(reader.Read()); - Assert.True(reader[0] is Decimal); - Assert.Equal((decimal)2.4, Convert.ToDecimal(reader[0])); - - Assert.False(reader.Read()); - Assert.False(reader.NextResult()); - } - } - - [Fact] - public void Bit() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE TABLE Test (bit1 BIT, bit2 BIT(5), bit3 BIT(10))"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?b1, ?b2, ?b3)", connection); - cmd.Parameters.Add(new MySqlParameter("?b1", MySqlDbType.Bit)); - cmd.Parameters.Add(new MySqlParameter("?b2", MySqlDbType.Bit)); - cmd.Parameters.Add(new MySqlParameter("?b3", MySqlDbType.Bit)); - cmd.Prepare(); - cmd.Parameters[0].Value = 1; - cmd.Parameters[1].Value = 2; - cmd.Parameters[2].Value = 3; - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM Test"; - cmd.Prepare(); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.Read()); - Assert.Equal(1, Convert.ToInt32(reader[0])); - Assert.Equal(2, Convert.ToInt32(reader[1])); - Assert.Equal(3, Convert.ToInt32(reader[2])); - } - } - - /// - /// Bug #17375 CommandBuilder ignores Unsigned flag at Parameter creation - /// Bug #15274 Use MySqlDbType.UInt32, throwed exception 'Only byte arrays can be serialize' - /// - [Fact] - public void UnsignedTypes() - { - executeSQL("CREATE TABLE Test (b TINYINT UNSIGNED PRIMARY KEY)"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - - DataTable dt = new DataTable(); - da.Fill(dt); - - DataView dv = new DataView(dt); - DataRowView row; - - row = dv.AddNew(); - row["b"] = 120; - row.EndEdit(); - da.Update(dv.Table); - - row = dv.AddNew(); - row["b"] = 135; - row.EndEdit(); - da.Update(dv.Table); - cb.Dispose(); - - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (b MEDIUMINT UNSIGNED PRIMARY KEY)"); - executeSQL("INSERT INTO Test VALUES(20)"); - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test WHERE (b > ?id)", connection); - cmd.Parameters.Add("?id", MySqlDbType.UInt16).Value = 10; - using (MySqlDataReader dr = cmd.ExecuteReader()) - { - dr.Read(); - Assert.Equal(20, dr.GetUInt16(0)); - } - } - - /// - /// Bug #25912 selecting negative time values gets wrong results - /// - [Fact] - public void TestNegativeTime() - { - executeSQL("CREATE TABLE Test (t time)"); - executeSQL("INSERT INTO Test SET T='-07:24:00'"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - DataTable dt = new DataTable(); - da.Fill(dt); - - TimeSpan ts = (TimeSpan)dt.Rows[0]["t"]; - Assert.Equal(-7, ts.Hours); - Assert.Equal(-24, ts.Minutes); - Assert.Equal(0, ts.Seconds); - } - - /// - /// Bug #25605 BINARY and VARBINARY is returned as a string - /// - [Fact] - public void BinaryAndVarBinary() - { - MySqlCommand cmd = new MySqlCommand("SELECT BINARY 'something' AS BinaryData", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - byte[] buffer = new byte[2]; - long read = reader.GetBytes(0, 0, buffer, 0, 2); - Assert.Equal('s', (char)buffer[0]); - Assert.Equal('o', (char)buffer[1]); - Assert.Equal(2, read); - - string s = reader.GetString(0); - Assert.Equal("something", s); - } - } - - [Fact] - public void NumericAsBinary() - { - MySqlCommand cmd = new MySqlCommand("SELECT IFNULL(NULL,0) AS MyServerID", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - Assert.Equal("BIGINT", reader.GetDataTypeName(0)); - Assert.Equal(typeof(Int64), reader.GetFieldType(0)); - Assert.Equal("System.Int64", reader.GetValue(0).GetType().FullName); - Assert.Equal(0, Convert.ToInt32(reader.GetValue(0))); - } - } - - [Fact] - public void BinaryTypes() - { - executeSQL(@"CREATE TABLE Test (c1 VARCHAR(20), c2 VARBINARY(20), - c3 TEXT, c4 BLOB, c6 VARCHAR(20) CHARACTER SET BINARY)"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - DataTable dt = new DataTable(); - da.Fill(dt); - Assert.Equal(typeof(String), dt.Columns[0].DataType); - Assert.Equal(typeof(byte[]), dt.Columns[1].DataType); - Assert.Equal(typeof(String), dt.Columns[2].DataType); - Assert.Equal(typeof(byte[]), dt.Columns[3].DataType); - Assert.Equal(typeof(byte[]), dt.Columns[4].DataType); - } - - [Fact] - public void ShowColumns() - { - if (ts.version < new Version(5, 0)) return; - - MySqlDataAdapter da = new MySqlDataAdapter( - @"SELECT TRIM(TRAILING ' unsigned' FROM - TRIM(TRAILING ' zerofill' FROM COLUMN_TYPE)) AS MYSQL_TYPE, - IF(COLUMN_DEFAULT IS NULL, NULL, - IF(ASCII(COLUMN_DEFAULT) = 1 OR COLUMN_DEFAULT = '1', 1, 0)) - AS TRUE_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS - WHERE TABLE_SCHEMA='test' AND TABLE_NAME='test'", connection); - DataTable dt = new DataTable(); - da.Fill(dt); - - Assert.Equal(typeof(string), dt.Columns[0].DataType); - Assert.Equal(typeof(Int64), dt.Columns[1].DataType); - } - - [Fact] - public void RespectBinaryFlag() - { - executeSQL("CREATE TABLE Test (col1 VARBINARY(20), col2 BLOB)"); - - string connStr = ts.GetConnection(false).ConnectionString + ";respect binary flags=false"; - - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", c); - DataTable dt = new DataTable(); - da.Fill(dt); - Assert.True(dt.Columns[0].DataType == typeof(System.String)); - Assert.True(dt.Columns[1].DataType == typeof(System.Byte[])); - } - } - - /// - /// Bug #27959 Bool datatype is not returned as System.Boolean by MySqlDataAdapter - /// - [Fact] - public void Boolean() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE TABLE Test (id INT, `on` BOOLEAN, v TINYINT(2))"); - executeSQL("INSERT INTO Test VALUES (1,1,1), (2,0,0)"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - DataTable dt = new DataTable(); - da.Fill(dt); - Assert.Equal(typeof(Boolean), dt.Columns[1].DataType); - Assert.Equal(typeof(SByte), dt.Columns[2].DataType); - Assert.Equal(true, dt.Rows[0][1]); - Assert.Equal(false, dt.Rows[1][1]); - Assert.Equal(1, Convert.ToInt32(dt.Rows[0][2])); - Assert.Equal(0, Convert.ToInt32(dt.Rows[1][2])); - } - - [Fact] - public void Binary16AsGuid() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (id INT, g BINARY(16), c VARBINARY(16), c1 BINARY(255))"); - - string connStr = ts.GetConnection(false).ConnectionString + ";old guids=true"; - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - Guid g = Guid.NewGuid(); - byte[] bytes = g.ToByteArray(); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (1, @g, @c, @c1)", c); - cmd.Parameters.AddWithValue("@g", bytes); - cmd.Parameters.AddWithValue("@c", bytes); - cmd.Parameters.AddWithValue("@c1", g.ToString()); - cmd.ExecuteNonQuery(); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", c); - DataTable dt = new DataTable(); - da.Fill(dt); - Assert.True(dt.Rows[0][1] is Guid); - Assert.True(dt.Rows[0][2] is byte[]); - Assert.True(dt.Rows[0][3] is byte[]); - - Assert.Equal(g, dt.Rows[0][1]); - - string s = BitConverter.ToString(bytes); - - s = s.Replace("-", ""); - string sql = String.Format("TRUNCATE TABLE Test;INSERT INTO Test VALUES(1,0x{0},NULL,NULL)", s); - executeSQL(sql); - - cmd.CommandText = "SELECT * FROM Test"; - cmd.Parameters.Clear(); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - Guid g1 = reader.GetGuid(1); - Assert.Equal(g, g1); - } - } - } - - /// - /// Bug #35041 'Binary(16) as GUID' - columns lose IsGuid value after a NULL value found - /// - [Fact] - public void Binary16AsGuidWithNull() - { - executeSQL(@"CREATE TABLE Test (id int(10) NOT NULL AUTO_INCREMENT, - AGUID binary(16), PRIMARY KEY (id))"); - Guid g = new Guid(); - byte[] guid = g.ToByteArray(); - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (NULL, @g)", connection); - cmd.Parameters.AddWithValue("@g", guid); - cmd.ExecuteNonQuery(); - executeSQL("insert into Test (AGUID) values (NULL)"); - cmd.ExecuteNonQuery(); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - DataTable dt = new DataTable(); - da.Fill(dt); - } - - /// - /// Bug #36313 BIT result is lost in the left outer join - /// - [Fact] - public void BitInLeftOuterJoin() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL(@"CREATE TABLE Main (Id int(10) unsigned NOT NULL AUTO_INCREMENT, - Descr varchar(45) NOT NULL, PRIMARY KEY (`Id`)) - ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1"); - executeSQL(@"INSERT INTO Main (Id,Descr) VALUES (1,'AAA'), (2,'BBB'), (3, 'CCC')"); - - executeSQL(@"CREATE TABLE Child (Id int(10) unsigned NOT NULL AUTO_INCREMENT, - MainId int(10) unsigned NOT NULL, Value int(10) unsigned NOT NULL, - Enabled bit(1) NOT NULL, PRIMARY KEY (`Id`)) - ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1"); - executeSQL(@"INSERT INTO Child (Id, MainId, Value, Enabled) VALUES (1,2,12345,0x01)"); - - MySqlDataAdapter da = new MySqlDataAdapter( - @"SELECT m.Descr, c.Value, c.Enabled FROM Main m - LEFT OUTER JOIN Child c ON m.Id=c.MainId ORDER BY m.Descr", connection); - DataTable dt = new DataTable(); - da.Fill(dt); - Assert.Equal(3, dt.Rows.Count); - Assert.Equal("AAA", dt.Rows[0][0]); - Assert.Equal("BBB", dt.Rows[1][0]); - Assert.Equal("CCC", dt.Rows[2][0]); - - Assert.Equal(DBNull.Value, dt.Rows[0][1]); - Assert.Equal(12345, Convert.ToInt32(dt.Rows[1][1])); - Assert.Equal(DBNull.Value, dt.Rows[2][1]); - - Assert.Equal(DBNull.Value, dt.Rows[0][2]); - Assert.Equal(1, Convert.ToInt32(dt.Rows[1][2])); - Assert.Equal(DBNull.Value, dt.Rows[2][2]); - } - - /// - /// Bug #36081 Get Unknown Datatype in C# .Net - /// - [Fact] - public void GeometryType() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL(@"CREATE TABLE Test (ID int(11) NOT NULL, ogc_geom geometry NOT NULL, - PRIMARY KEY (`ID`))"); - executeSQL(@"INSERT INTO Test VALUES (1, - GeomFromText('GeometryCollection(Point(1 1), LineString(2 2, 3 3))'))"); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - } - } - - #region MySqlGeometry Tests - - [Fact] - public void CanParseGeometryValueString() - { - var v = MySqlGeometry.Parse("POINT (47.37 -122.21)"); - Assert.Equal("POINT(47.37 -122.21)", v.ToString()); - } - - [Fact] - public void CanTryParseGeometryValueString() - { - MySqlGeometry v = new MySqlGeometry(0, 0); - MySqlGeometry.TryParse("POINT (47.37 -122.21)", out v); - Assert.Equal("POINT(47.37 -122.21)", v.ToString()); - } - - [Fact] - public void CanTryParseGeometryValueStringWithSRIDValue() - { - var mysqlGeometryResult = new MySqlGeometry(0, 0); - MySqlGeometry.TryParse("SRID=101;POINT (47.37 -122.21)", out mysqlGeometryResult); - Assert.Equal("SRID=101;POINT(47.37 -122.21)", mysqlGeometryResult.ToString()); - } - - - [Fact] - public void StoringAndRetrievingGeometry() - { - if (ts.version.Major < 5) return; - - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (v Geometry NOT NULL)"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (GeomFromText(?v))", connection); - cmd.Parameters.Add("?v", MySqlDbType.String); - cmd.Parameters[0].Value = "POINT(47.37 -122.21)"; - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT AsText(v) FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - var val = reader.GetValue(0); - } - } - - [Fact] - public void CanFetchGeometryAsBinary() - { - if (ts.version.Major < 5) return; - - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (v Geometry NOT NULL)"); - - MySqlGeometry v = new MySqlGeometry(47.37, -122.21); - - var par = new MySqlParameter("?v", MySqlDbType.Geometry); - par.Value = v; - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?v)", connection); - cmd.Parameters.Add(par); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT AsBinary(v) FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - var val = reader.GetValue(0) as Byte[]; - var MyGeometry = new MySqlGeometry(MySqlDbType.Geometry, val); - Assert.Equal("POINT(47.37 -122.21)", MyGeometry.ToString()); - } - } - - - [Fact] - public void CanSaveSridValueOnGeometry() - { - if (ts.version.Major < 5) return; - - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (v Geometry NOT NULL)"); - - MySqlGeometry v = new MySqlGeometry(47.37, -122.21, 101); - var par = new MySqlParameter("?v", MySqlDbType.Geometry); - par.Value = v; - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?v)", connection); - cmd.Parameters.Add(par); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT SRID(v) FROM Test"; - - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - var val = reader.GetString(0); - Assert.Equal("101", val); - } - } - - - [Fact] - public void CanFetchGeometryAsText() - { - if (ts.version.Major < 5) return; - - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (v Geometry NOT NULL)"); - - MySqlGeometry v = new MySqlGeometry(47.37, -122.21); - var par = new MySqlParameter("?v", MySqlDbType.Geometry); - par.Value = v; - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?v)", connection); - cmd.Parameters.Add(par); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT AsText(v) FROM Test"; - - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - var val = reader.GetString(0); - Assert.Equal("POINT(47.37 -122.21)", val); - } - } - - [Fact] - public void CanUseReaderGetMySqlGeometry() - { - if (ts.version.Major < 5) return; - - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (v Geometry NOT NULL)"); - - MySqlGeometry v = new MySqlGeometry(47.37, -122.21); - var par = new MySqlParameter("?v", MySqlDbType.Geometry); - par.Value = v; - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?v)", connection); - cmd.Parameters.Add(par); - cmd.ExecuteNonQuery(); - - // reading as binary - cmd.CommandText = "SELECT AsBinary(v) as v FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - var val = reader.GetMySqlGeometry(0); - var valWithName = reader.GetMySqlGeometry("v"); - Assert.Equal("POINT(47.37 -122.21)", val.ToString()); - Assert.Equal("POINT(47.37 -122.21)", valWithName.ToString()); - } - - // reading as geometry - cmd.CommandText = "SELECT v as v FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - var val = reader.GetMySqlGeometry(0); - var valWithName = reader.GetMySqlGeometry("v"); - Assert.Equal("POINT(47.37 -122.21)", val.ToString()); - Assert.Equal("POINT(47.37 -122.21)", valWithName.ToString()); - } - - } - - public void CanGetToStringFromMySqlGeometry() - { - MySqlGeometry v = new MySqlGeometry(47.37, -122.21); - var valToString = v.ToString(); - Assert.Equal("POINT(47.37 -122.21)", valToString); - } - - #endregion - - /// - /// Bug #33322 Incorrect Double/Single value saved to MySQL database using MySQL Connector for - /// - [Fact] - public void StoringAndRetrievingDouble() - { - if (ts.version.Major < 5) return; - - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (v DOUBLE(25,20) NOT NULL)"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?v)", connection); - cmd.Parameters.Add("?v", MySqlDbType.Double); - cmd.Parameters[0].Value = Math.PI; - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - double d = reader.GetDouble(0); - Assert.Equal(Math.PI, d); - } - } - - /// - /// Bug #40571 Add GetSByte to the list of public methods supported by MySqlDataReader - /// - [Fact] - public void SByteFromReader() - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (c1 TINYINT, c2 TINYINT UNSIGNED)"); - executeSQL("INSERT INTO Test VALUES (99, 217)"); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - Assert.Equal(99, reader.GetSByte(0)); - Assert.Equal(217, reader.GetByte(1)); - Assert.Equal(99, reader.GetByte(0)); - } - } - - [Fact] - public void NewGuidDataType() - { - executeSQL("CREATE TABLE Test(id INT, g BINARY(16))"); - - string connStr = ts.GetConnection(false).ConnectionString + ";old guids=true"; - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - Guid guid = Guid.NewGuid(); - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1, @g)", c); - cmd.Parameters.Add(new MySqlParameter("@g", MySqlDbType.Guid)); - cmd.Parameters[0].Value = guid; - cmd.ExecuteNonQuery(); - - DataTable dt = new DataTable(); - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", c); - da.Fill(dt); - Assert.Equal(1, dt.Rows.Count); - Assert.Equal(1, dt.Rows[0]["id"]); - Assert.Equal(guid, dt.Rows[0]["g"]); - } - } - - /// - /// Bug #44507 Binary(16) considered as Guid - /// - [Fact] - public void ReadBinary16AsBinary() - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (id INT, guid BINARY(16))"); - - string connStr = ts.GetConnection(false).ConnectionString + ";old guids=true"; - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - - Guid g = new Guid("32A48AC5-285A-46c6-A0D4-158E6E39729C"); - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (1, ?guid)", c); - //MySqlParameter p = new MySqlParameter(); - //p.ParameterName = "guid"; - //p.Value = Guid.NewGuid(); - cmd.Parameters.AddWithValue("guid", Guid.NewGuid()); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM Test"; - cmd.Parameters.Clear(); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - - object o = reader.GetValue(1); - Assert.True(o is Guid); - - byte[] bytes = new byte[16]; - long size = reader.GetBytes(1, 0, bytes, 0, 16); - Assert.Equal(16, size); - } - } - } - - [Fact] - public void ReadingUUIDAsGuid() - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (id INT, guid CHAR(36))"); - executeSQL("INSERT INTO Test VALUES (1, UUID())"); - - MySqlCommand cmd = new MySqlCommand("SELECT CONCAT('A', guid) FROM Test", connection); - string serverGuidStr = cmd.ExecuteScalar().ToString().Substring(1); - Guid serverGuid = new Guid(serverGuidStr); - - cmd.CommandText = "SELECT guid FROM Test"; - Guid g = (Guid)cmd.ExecuteScalar(); - Assert.Equal(serverGuid, g); - } - - [Fact] - public void NewGuidType() - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (id INT, guid CHAR(36))"); - - Guid g = Guid.NewGuid(); - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1, @g)", connection); - cmd.Parameters.AddWithValue("@g", g); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT guid FROM Test"; - Guid readG = (Guid)cmd.ExecuteScalar(); - Assert.Equal(g, readG); - } - - /// - /// Bug #47928 Old Guids=true setting is lost after null value is - /// encountered in a Binary(16) - /// - [Fact] - public void OldGuidsWithNull() - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (id INT, guid BINARY(16))"); - - string connStr = ts.GetConnection(false).ConnectionString + ";old guids=true"; - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (1, ?guid)", c); - cmd.Parameters.AddWithValue("guid", Guid.NewGuid()); - cmd.ExecuteNonQuery(); - - cmd.Parameters["guid"].Value = null; - cmd.ExecuteNonQuery(); - cmd.Parameters["guid"].Value = Guid.NewGuid(); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT guid FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - //In Bug #47928, following loop will crash after encountering - // null value. - while (reader.Read()) - { - object o = reader.GetValue(0); - } - } - } - } - - /// - /// Bug #47985 UTF-8 String Length Issue (guids etc) - /// - [Fact] - public void UTF8Char12AsGuid() - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (id INT, name CHAR(12) CHARSET utf8)"); - executeSQL("INSERT INTO Test VALUES (1, 'Name')"); - - string connStr = ts.GetConnection(false).ConnectionString + ";charset=utf8"; - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", c); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - string s = reader.GetString(1); - Assert.Equal("Name", s); - } - } - } - - /// - /// Bug #48100 Impossible to retrieve decimal value if it doesn't fit into .Net System.Decimal - /// - [Fact] - public void MySqlDecimal() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (id INT, dec1 DECIMAL(36,2))"); - executeSQL("INSERT INTO Test VALUES (1, 9999999999999999999999999999999999.99)"); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - MySqlDecimal dec = reader.GetMySqlDecimal(1); - string s = dec.ToString(); - Assert.Equal(9999999999999999999999999999999999.99, dec.ToDouble()); - Assert.Equal("9999999999999999999999999999999999.99", dec.ToString()); - Exception ex = Assert.Throws(() => dec.Value); - Assert.Equal(ex.Message, "Value was either too large or too small for a Decimal."); - } - } - - /// - /// Bug #48171 MySqlDataReader.GetSchemaTable() returns 0 in "NumericPrecision" for newdecimal - /// - [Fact] - public void DecimalPrecision() - { - executeSQL("DROP TABLE IF EXISTS test"); - executeSQL("CREATE TABLE test(a decimal(35,2), b decimal(36,2), c decimal(36,2) unsigned)"); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM test", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - DataTable dt = reader.GetSchemaTable(); - DataRow columnDefinition = dt.Rows[0]; - Assert.Equal(35, columnDefinition[SchemaTableColumn.NumericPrecision]); - columnDefinition = dt.Rows[1]; - Assert.Equal(36, columnDefinition[SchemaTableColumn.NumericPrecision]); - columnDefinition = dt.Rows[2]; - Assert.Equal(36, columnDefinition[SchemaTableColumn.NumericPrecision]); - } - } - - /// - /// Bug #55644 Value was either too large or too small for a Double - /// - [Fact] - public void DoubleMinValue() - { - executeSQL("DROP TABLE IF EXISTS test"); - executeSQL("CREATE TABLE test(dbl double)"); - MySqlCommand cmd = new MySqlCommand("insert into test values(?param1)"); - cmd.Connection = connection; - cmd.Parameters.Add(new MySqlParameter("?param1", MySqlDbType.Double)); - cmd.Parameters["?param1"].Value = Double.MinValue; - cmd.ExecuteNonQuery(); - cmd.Parameters["?param1"].Value = Double.MaxValue; - cmd.ExecuteNonQuery(); - - cmd = new MySqlCommand("SELECT * FROM test", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - double d = reader.GetDouble(0); - Assert.Equal(d, double.MinValue); - reader.Read(); - d = reader.GetDouble(0); - Assert.Equal(d, double.MaxValue); - } - } - - /// - /// Bug #58373 ReadInteger problem - /// - [Fact] - public void BigIntAutoInc() - { - executeSQL("DROP TABLE IF EXISTS test"); - executeSQL("CREATE TABLE test(ID bigint unsigned AUTO_INCREMENT NOT NULL PRIMARY KEY, name VARCHAR(20))"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO test VALUES (@id, 'boo')", connection); - ulong val = UInt64.MaxValue; - val -= 100; - cmd.Parameters.AddWithValue("@id", val); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "INSERT INTO test (name) VALUES ('boo2')"; - cmd.ExecuteNonQuery(); - } - - /// - /// Bug # 13708884 timediff function - /// Executing a simple query that generates a time difference that has a - /// fractional second value throws an exception - /// - [Fact] - public void Timediff() - { - MySqlCommand cmd = new MySqlCommand("select timediff('2 0:1:1.0', '4 1:2:3.123456')", connection); - var result = cmd.ExecuteScalar(); - Assert.Equal(new TimeSpan(new TimeSpan(-2, -1, -1, -2).Ticks - 1234560), result); - } - - [Fact] - public void CanReadJsonValue() - { - - if (ts.version < new Version(5, 7)) return; - - executeSQL("DROP TABLE IF EXISTS test"); - executeSQL("CREATE TABLE test(Id int NOT NULL PRIMARY KEY, jsoncolumn JSON)"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO test VALUES (@id, '[1]')", connection); - cmd.Parameters.AddWithValue("@id", 1); - cmd.ExecuteNonQuery(); - - string command = @"INSERT INTO test VALUES (@id, '[""a"", {""b"": [true, false]}, [10, 20]]')"; - cmd = new MySqlCommand(command, connection); - cmd.Parameters.AddWithValue("@id", 2); - cmd.ExecuteNonQuery(); - - cmd = new MySqlCommand("SELECT jsoncolumn from test where id = 2 ", connection); - - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.Read()); - Assert.Equal("[\"a\", {\"b\": [true, false]}, [10, 20]]", reader.GetString(0)); - } - } - - [Fact] - public void CanUpdateJsonValue() - { - if (ts.version < new Version(5, 7)) return; - - executeSQL("DROP TABLE IF EXISTS test"); - executeSQL("CREATE TABLE test(Id int NOT NULL PRIMARY KEY, jsoncolumn JSON)"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO test VALUES (@id, '[1]')", connection); - cmd.Parameters.AddWithValue("@id", 1); - cmd.ExecuteNonQuery(); - - string command = @"UPDATE test set jsoncolumn = '[""a"", {""b"": [true, false]}, [10, 20]]' where id = 1"; - cmd = new MySqlCommand(command, connection); - cmd.ExecuteNonQuery(); - - cmd = new MySqlCommand("SELECT jsoncolumn from test where id = 1 ", connection); - - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.Read()); - Assert.Equal("[\"a\", {\"b\": [true, false]}, [10, 20]]", reader.GetString(0)); - } - } - - /// Testing out Generated Columns - /// Using a case sensitive collation on a column - /// and an insensitive serch with a generated column - /// WL #411 - /// - [Fact] - public void CanUseGeneratedColumns() - { - if (ts.version < new Version(5, 7)) return; - - executeSQL("DROP TABLE IF EXISTS test"); - executeSQL("CREATE TABLE `Test` (`ID` int NOT NULL AUTO_INCREMENT PRIMARY KEY, `Name` char(35) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL)"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO test (Name) VALUES ('Berlin')", connection); - cmd.ExecuteNonQuery(); - cmd = new MySqlCommand("INSERT INTO test (Name) VALUES ('London')", connection); - cmd.ExecuteNonQuery(); - cmd = new MySqlCommand("INSERT INTO test (Name) VALUES ('France')", connection); - cmd.ExecuteNonQuery(); - cmd = new MySqlCommand("INSERT INTO test (Name) VALUES ('United Kingdom')", connection); - cmd.ExecuteNonQuery(); - cmd = new MySqlCommand("INSERT INTO test (Name) VALUES ('Italy')", connection); - cmd.ExecuteNonQuery(); - - cmd = new MySqlCommand("ALTER TABLE test ADD COLUMN Name_ci char(35) CHARACTER SET utf8 AS (Name) STORED;", connection); - cmd.ExecuteNonQuery(); - - cmd = new MySqlCommand("ALTER TABLE test ADD INDEX (Name_ci);", connection); - cmd.ExecuteNonQuery(); - - cmd = new MySqlCommand("SELECT Name FROM test WHERE Name_ci='berlin'", connection); - - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.Read()); - Assert.True(reader.GetString(0).Equals("Berlin", StringComparison.CurrentCulture)); - } - } - } -} diff --git a/Tests/MySql.Data.Tests/DateTimeTests.cs b/Tests/MySql.Data.Tests/DateTimeTests.cs deleted file mode 100644 index 989160a25..000000000 --- a/Tests/MySql.Data.Tests/DateTimeTests.cs +++ /dev/null @@ -1,955 +0,0 @@ -// Copyright © 2013, 2015 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using MySql.Data.Types; -using System.Data; -using System.Globalization; -using System.Threading; - -namespace MySql.Data.MySqlClient.Tests -{ - public class DateTimeTests : TestBase - { - protected TestSetup ts; - - public DateTimeTests(TestSetup setup) : base(setup, "datetimetests") - { - ts = setup; - executeSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME, d DATE, " + - "t TIME, ts TIMESTAMP, PRIMARY KEY(id))"); - } - - [Fact] - public void ConvertZeroDateTime() - { - executeSQL("INSERT INTO Test VALUES(1, '0000-00-00', '0000-00-00', " + - "'00:00:00', NULL)"); - - string connStr = ts.GetConnection(false).ConnectionString; - connStr += ";convert zero datetime=yes"; - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", c); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.Read()); - Assert.Equal(DateTime.MinValue.Date, reader.GetDateTime(1).Date); - Assert.Equal(DateTime.MinValue.Date, reader.GetDateTime(2).Date); - } - } - } - - [Fact] - public void TestNotAllowZerDateAndTime() - { - executeSQL("SET SQL_MODE=''"); - executeSQL("INSERT INTO Test VALUES(1, 'Test', '0000-00-00', '0000-00-00', '00:00:00')"); - executeSQL("INSERT INTO Test VALUES(2, 'Test', '2004-11-11', '2004-11-11', '06:06:06')"); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.Read()); - - MySqlDateTime testDate = reader.GetMySqlDateTime(2); - Assert.False(testDate.IsValidDateTime, "IsZero is false"); - - Exception ex = Assert.Throws(() => reader.GetValue(2)); - Assert.Equal(ex.Message, "Unable to convert MySQL date/time value to System.DateTime"); - - Assert.True(reader.Read()); - - DateTime dt2 = (DateTime)reader.GetValue(2); - Assert.Equal(new DateTime(2004, 11, 11).Date, dt2.Date); - } - } - - [Fact] - public void DateAdd() - { - MySqlCommand cmd = new MySqlCommand("select date_add(?someday, interval 1 hour)", - connection); - DateTime now = DateTime.Now; - DateTime later = now.AddHours(1); - later = later.AddMilliseconds(later.Millisecond * -1); - cmd.Parameters.AddWithValue("?someday", now); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.Read()); - DateTime dt = reader.GetDateTime(0); - Assert.Equal(later.Date, dt.Date); - Assert.Equal(later.Hour, dt.Hour); - Assert.Equal(later.Minute, dt.Minute); - Assert.Equal(later.Second, dt.Second); - } - } - - /// - /// Bug #9619 Cannot update row using DbDataAdapter when row contains an invalid date - /// Bug #15112 MySqlDateTime Constructor - /// - [Fact] - public void TestAllowZeroDateTime() - { - executeSQL("TRUNCATE TABLE Test"); - executeSQL("INSERT INTO Test (id, d, dt) VALUES (1, '0000-00-00', '0000-00-00 00:00:00')"); - - using (MySqlConnection c = new MySqlConnection( - connection.ConnectionString + ";pooling=false;AllowZeroDatetime=true")) - { - c.Open(); - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", c); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - - Assert.True(reader.GetValue(1) is MySqlDateTime); - Assert.True(reader.GetValue(2) is MySqlDateTime); - - Assert.False(reader.GetMySqlDateTime(1).IsValidDateTime); - Assert.False(reader.GetMySqlDateTime(2).IsValidDateTime); - - Exception ex = Assert.Throws(() =>reader.GetDateTime(1)); - Assert.Equal(ex.Message, "Unable to convert MySQL date/time value to System.DateTime"); - } - - DataTable dt = new DataTable(); - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", c); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - da.Fill(dt); - dt.Rows[0]["id"] = 2; - DataRow row = dt.NewRow(); - row["id"] = 3; - row["d"] = new MySqlDateTime("2003-9-24"); - row["dt"] = new MySqlDateTime("0000/0/00 00:00:00"); - dt.Rows.Add(row); - - da.Update(dt); - - dt.Clear(); - da.Fill(dt); - Assert.Equal(2, dt.Rows.Count); - MySqlDateTime date = (MySqlDateTime)dt.Rows[1]["d"]; - Assert.Equal(2003, date.Year); - Assert.Equal(9, date.Month); - Assert.Equal(24, date.Day); - cb.Dispose(); - } - } - - [Fact] - public void InsertDateTimeValue() - { - using (MySqlConnection c = new MySqlConnection(connection.ConnectionString + - ";allow zero datetime=yes")) - { - c.Open(); - MySqlDataAdapter da = new MySqlDataAdapter("SELECT id, dt FROM Test", c); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - - DataTable dt = new DataTable(); - dt.Columns.Add(new DataColumn("id", typeof(int))); - dt.Columns.Add(new DataColumn("dt", typeof(DateTime))); - - da.Fill(dt); - - DateTime now = DateTime.Now; - DataRow row = dt.NewRow(); - row["id"] = 1; - row["dt"] = now; - dt.Rows.Add(row); - da.Update(dt); - - dt.Clear(); - da.Fill(dt); - cb.Dispose(); - - Assert.Equal(1, dt.Rows.Count); - Assert.Equal(now.Date, ((DateTime)dt.Rows[0]["dt"]).Date); - } - } - - [Fact] - public void SortingMySqlDateTimes() - { - executeSQL("INSERT INTO Test (id, dt) VALUES (1, '2004-10-01')"); - executeSQL("INSERT INTO Test (id, dt) VALUES (2, '2004-10-02')"); - executeSQL("INSERT INTO Test (id, dt) VALUES (3, '2004-11-01')"); - executeSQL("INSERT INTO Test (id, dt) VALUES (4, '2004-11-02')"); - - CultureInfo curCulture = Thread.CurrentThread.CurrentCulture; - CultureInfo curUICulture = Thread.CurrentThread.CurrentUICulture; - CultureInfo cul = new CultureInfo("en-GB"); - Thread.CurrentThread.CurrentCulture = cul; - Thread.CurrentThread.CurrentUICulture = cul; - - using (MySqlConnection c = new MySqlConnection(connection.ConnectionString + ";allow zero datetime=yes")) - { - MySqlDataAdapter da = new MySqlDataAdapter("SELECT dt FROM Test", c); - DataTable dt = new DataTable(); - da.Fill(dt); - - DataView dv = dt.DefaultView; - dv.Sort = "dt ASC"; - - Assert.Equal(new DateTime(2004, 10, 1).Date, Convert.ToDateTime(dv[0]["dt"]).Date); - Assert.Equal(new DateTime(2004, 10, 2).Date, Convert.ToDateTime(dv[1]["dt"]).Date); - Assert.Equal(new DateTime(2004, 11, 1).Date, Convert.ToDateTime(dv[2]["dt"]).Date); - Assert.Equal(new DateTime(2004, 11, 2).Date, Convert.ToDateTime(dv[3]["dt"]).Date); - - Thread.CurrentThread.CurrentCulture = curCulture; - Thread.CurrentThread.CurrentUICulture = curUICulture; - } - } - - [Fact] - public void TestZeroDateTimeException() - { - executeSQL("INSERT INTO Test (id, d, dt) VALUES (1, '0000-00-00', '0000-00-00 00:00:00')"); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - Exception ex = Assert.Throws(() =>reader.GetDateTime(2)); - Assert.Equal(ex.Message, "Unable to convert MySQL date/time value to System.DateTime"); - } - } - - /// - /// Bug #8929 Timestamp values with a date > 10/29/9997 cause problems - /// - [Fact] - public void LargeDateTime() - { - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id, dt) VALUES(?id,?dt)", connection); - cmd.Parameters.Add(new MySqlParameter("?id", 1)); - cmd.Parameters.Add(new MySqlParameter("?dt", DateTime.Parse("9997-10-29"))); - cmd.ExecuteNonQuery(); - cmd.Parameters[0].Value = 2; - cmd.Parameters[1].Value = DateTime.Parse("9997-10-30"); - cmd.ExecuteNonQuery(); - cmd.Parameters[0].Value = 3; - cmd.Parameters[1].Value = DateTime.Parse("9999-12-31"); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT id,dt FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.Read()); - Assert.Equal(DateTime.Parse("9997-10-29").Date, reader.GetDateTime(1).Date); - Assert.True(reader.Read()); - Assert.Equal(DateTime.Parse("9997-10-30").Date, reader.GetDateTime(1).Date); - Assert.True(reader.Read()); - Assert.Equal(DateTime.Parse("9999-12-31").Date, reader.GetDateTime(1).Date); - } - } - - [Fact] - public void UsingDatesAsStrings() - { - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id, dt) VALUES (1, ?dt)", connection); - cmd.Parameters.Add("?dt", MySqlDbType.Date); - cmd.Parameters[0].Value = "2005-03-04"; - cmd.ExecuteNonQuery(); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - DataTable dt = new DataTable(); - da.Fill(dt); - Assert.Equal(1, dt.Rows.Count); - DateTime date = (DateTime)dt.Rows[0]["dt"]; - Assert.Equal(2005, date.Year); - Assert.Equal(3, date.Month); - Assert.Equal(4, date.Day); - } - - /// - /// Bug #19481 Where clause with datetime throws exception [any warning causes the exception] - /// - [Fact] - public void Bug19481() - { - executeSQL("DROP TABLE Test"); - executeSQL("CREATE TABLE Test(ID INT NOT NULL AUTO_INCREMENT, " + - "SATELLITEID VARCHAR(3) NOT NULL, ANTENNAID INT, AOS_TIMESTAMP DATETIME NOT NULL, " + - "TEL_TIMESTAMP DATETIME, LOS_TIMESTAMP DATETIME, PRIMARY KEY (ID))"); - executeSQL("INSERT INTO Test VALUES (NULL,'224','0','2005-07-24 00:00:00'," + - "'2005-07-24 00:02:00','2005-07-24 00:22:00')"); - executeSQL("INSERT INTO Test VALUES (NULL,'155','24','2005-07-24 03:00:00'," + - "'2005-07-24 03:02:30','2005-07-24 03:20:00')"); - executeSQL("INSERT INTO Test VALUES (NULL,'094','34','2005-07-24 09:00:00'," + - "'2005-07-24 09:00:30','2005-07-24 09:15:00')"); - executeSQL("INSERT INTO Test VALUES (NULL,'224','54','2005-07-24 12:00:00'," + - "'2005-07-24 12:01:00','2005-07-24 12:33:00')"); - executeSQL("INSERT INTO Test VALUES (NULL,'155','25','2005-07-24 15:00:00'," + - "'2005-07-24 15:02:00','2005-07-24 15:22:00')"); - executeSQL("INSERT INTO Test VALUES (NULL,'094','0','2005-07-24 17:00:00'," + - "'2005-07-24 17:02:12','2005-07-24 17:20:00')"); - executeSQL("INSERT INTO Test VALUES (NULL,'224','24','2005-07-24 19:00:00'," + - "'2005-07-24 19:02:00','2005-07-24 19:27:00')"); - executeSQL("INSERT INTO Test VALUES (NULL,'155','34','2005-07-24 21:00:00'," + - "'2005-07-24 21:02:33','2005-07-24 21:22:55')"); - executeSQL("INSERT INTO Test VALUES (NULL,'094','55','2005-07-24 23:00:00'," + - "'2005-07-24 23:00:45','2005-07-24 23:22:23')"); - - DateTime date = DateTime.Parse("7/24/2005", CultureInfo.GetCultureInfo("en-us")); - StringBuilder sql = new StringBuilder(); - sql.AppendFormat(CultureInfo.InvariantCulture, - @"SELECT ID, ANTENNAID, TEL_TIMESTAMP, LOS_TIMESTAMP FROM Test - WHERE TEL_TIMESTAMP >= '{0}'", date.ToString("u")); - MySqlDataAdapter da = new MySqlDataAdapter(sql.ToString(), connection); - DataSet dataSet = new DataSet(); - da.Fill(dataSet); - } - - /// - /// Bug #17736 Selecting a row with with empty date '0000-00-00' results in Read() hanging. - /// - [Fact] - public void PreparedZeroDateTime() - { - if (ts.version < new Version(4, 1)) return; - - executeSQL("INSERT INTO Test VALUES(1, Now(), '0000-00-00', NULL, NULL)"); - MySqlCommand cmd = new MySqlCommand("SELECT d FROM Test WHERE id=?id", connection); - cmd.Parameters.AddWithValue("?id", 1); - cmd.Prepare(); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - } - } - - [Fact] - public void DateTimeInDataTable() - { - executeSQL("INSERT INTO Test VALUES(1, Now(), '0000-00-00', NULL, NULL)"); - - using (MySqlConnection c = new MySqlConnection( - connection.ConnectionString + ";pooling=false;AllowZeroDatetime=true")) - { - c.Open(); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", c); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - DataTable dt = new DataTable(); - - da.Fill(dt); - DataRow row = dt.NewRow(); - row["id"] = 2; - row["dt"] = new MySqlDateTime(DateTime.Now); - row["d"] = new MySqlDateTime(DateTime.Now); - row["t"] = new TimeSpan(1, 1, 1); - row["ts"] = DBNull.Value; - dt.Rows.Add(row); - da.Update(dt); - - dt.Rows.Clear(); - da.Fill(dt); - Assert.Equal(2, dt.Rows.Count); - cb.Dispose(); - } - } - - /// - /// Bug #32010 Connector return incorrect value when pulling 0 datetime - /// - [Fact] - public void MySqlDateTimeFormatting() - { - DateTime dt = DateTime.Now; - MySqlDateTime mdt = new MySqlDateTime(dt); - Assert.Equal(dt.ToString(), mdt.ToString()); - } - - /// - /// Bug #41021 DateTime format incorrect - /// - [Fact] - public void DateFormat() - { - DateTime dt = DateTime.Now; - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1, ?dt, NULL, NULL, NULL)", connection); - cmd.Parameters.AddWithValue("?dt", dt); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT dt FROM Test WHERE DATE_FORMAT(DATE(dt), GET_FORMAT(DATETIME, 'ISO'))=?datefilter"; - cmd.Parameters.Clear(); - cmd.Parameters.AddWithValue("?datefilter", dt.Date); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.Read()); - } - } - - #region DateTimeTypeTests - - [Fact] - public void CanUpdateMicroseconds() - { - if (ts.version < new Version(5, 6)) return; - DateTime dt = DateTime.Now; - MySqlCommand cmd = new MySqlCommand(); - - executeSQL("DROP TABLE Test"); - executeSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME(6), d DATE, " + - "t TIME, ts TIMESTAMP, PRIMARY KEY(id))"); - - cmd.Connection = connection; - cmd.CommandText = "INSERT INTO Test VALUES(1, ?dt, NULL, NULL, NULL)"; - cmd.Parameters.AddWithValue("?dt", dt); - cmd.ExecuteNonQuery(); - - //Update value - cmd.Parameters.Clear(); - cmd.Connection = connection; - cmd.CommandText = "UPDATE Test SET dt=?dt"; - cmd.Parameters.Add(new MySqlParameter("?dt", "2011-01-01 12:34:56.123456")); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT dt FROM Test"; - cmd.Parameters.Clear(); - cmd.Connection = connection; - - MySqlDataReader rdr = cmd.ExecuteReader(); - - while (rdr.Read()) - { - Assert.Equal("12:34:56.123456", rdr.GetDateTime(0).ToString("hh:mm:ss.ffffff")); - } - rdr.Close(); - } - - #endregion - - [Fact] - public void CanUpdateMicrosecondsWithIgnorePrepareOnFalse() - { - if (ts.version < new Version(5, 6)) return; - MySqlCommand cmd = new MySqlCommand(); - - using (MySqlConnection c = new MySqlConnection(connection.ConnectionString + ";ignore prepare=False;")) - { - c.Open(); - - executeSQL("DROP TABLE Test"); - executeSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME(6), d DATE, " + - "t TIME, ts TIMESTAMP, PRIMARY KEY(id))"); - - cmd.Connection = c; - cmd.CommandText = "INSERT INTO Test VALUES(?id, ?dt, NULL, NULL, NULL)"; - cmd.Parameters.Add(new MySqlParameter("?id", 1)); - - MySqlParameter datetimeinsert = new MySqlParameter(); - datetimeinsert.ParameterName = "?dt"; - datetimeinsert.MySqlDbType = MySqlDbType.DateTime; - datetimeinsert.Value = "2011-01-01 12:34:59.123456"; - cmd.Parameters.Add(datetimeinsert); - - cmd.Prepare(); - - cmd.ExecuteNonQuery(); - - cmd.Parameters.Clear(); - - MySqlParameter datetimepar = new MySqlParameter(); - datetimepar.ParameterName = "?dt"; - datetimepar.MySqlDbType = MySqlDbType.DateTime; - datetimepar.Value = "1999-01-01 12:34:59.999999"; - - cmd.Connection = c; - cmd.CommandText = "UPDATE Test SET dt=?dt WHERE id =1"; - cmd.Parameters.Add(datetimepar); - cmd.Prepare(); - cmd.ExecuteNonQuery(); - - - - cmd.CommandText = "SELECT dt FROM Test WHERE id = 1"; - cmd.Parameters.Clear(); - cmd.Connection = c; - cmd.Prepare(); - MySqlDataReader rdr = cmd.ExecuteReader(); - - while (rdr.Read()) - { - Assert.Equal("12:34:59.999999", rdr.GetDateTime(0).ToString("hh:mm:ss.ffffff")); - } - rdr.Close(); - } - } - - #region TimeTypeTests - - [Fact] - // reference http://msdn.microsoft.com/en-us/library/system.timespan.frommilliseconds.aspx - public void CanUpdateMillisecondsUsingTimeType() - { - if (ts.version < new Version(5, 6)) return; - DateTime dt = DateTime.Now; - MySqlCommand cmd = new MySqlCommand(); - - executeSQL("DROP TABLE Test"); - executeSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME(6), d DATE, " + - "t TIME(6), ts TIMESTAMP(6), PRIMARY KEY(id))"); - - cmd.Connection = connection; - cmd.CommandText = "INSERT INTO Test VALUES(1, NULL, NULL, ?t, NULL)"; - - MySqlParameter timeinsert = new MySqlParameter(); - timeinsert.ParameterName = "?t"; - timeinsert.MySqlDbType = MySqlDbType.Time; - timeinsert.Value = TimeSpan.FromMilliseconds(12345.6); - cmd.Parameters.Add(timeinsert); - cmd.ExecuteNonQuery(); - - - cmd.CommandText = "SELECT Time(t) FROM Test"; - cmd.Parameters.Clear(); - cmd.Connection = connection; - - MySqlDataReader rdr = cmd.ExecuteReader(); - - while (rdr.Read()) - { - Assert.Equal(346, rdr.GetTimeSpan(0).Milliseconds); - } - rdr.Close(); - } - - [Fact] - // reference http://msdn.microsoft.com/en-us/library/system.timespan.frommilliseconds.aspx - public void CanUpdateMillisecondsUsingTimeTypeOnPrepareStatements() - { - if (ts.version < new Version(5, 6)) return; - DateTime dt = DateTime.Now; - MySqlCommand cmd = new MySqlCommand(); - - executeSQL("DROP TABLE Test"); - executeSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME(6), d DATE, " + - "t TIME(6), ts TIMESTAMP(6), PRIMARY KEY(id))"); - - - using (MySqlConnection c = new MySqlConnection(connection.ConnectionString + ";ignore prepare=False;")) - { - c.Open(); - cmd.Connection = c; - cmd.CommandText = "INSERT INTO Test VALUES(1, NULL, NULL, ?t, NULL)"; - - MySqlParameter timeinsert = new MySqlParameter(); - timeinsert.ParameterName = "?t"; - timeinsert.MySqlDbType = MySqlDbType.Time; - timeinsert.Value = TimeSpan.FromMilliseconds(1.5); - cmd.Parameters.Add(timeinsert); - - cmd.Prepare(); - - cmd.ExecuteNonQuery(); - - - cmd.CommandText = "SELECT Time(t) FROM Test"; - cmd.Parameters.Clear(); - cmd.Connection = connection; - cmd.Prepare(); - - MySqlDataReader rdr = cmd.ExecuteReader(); - - while (rdr.Read()) - { - Assert.Equal(2, rdr.GetTimeSpan(0).Milliseconds); - } - rdr.Close(); - } - } - - #endregion - - #region TimeStampTests - [Fact] - public void CanUpdateMillisecondsUsingTimeStampType() - { - if (ts.version < new Version(5, 6)) return; - DateTime dt = DateTime.Now; - MySqlCommand cmd = new MySqlCommand(); - - using (MySqlConnection c = new MySqlConnection(connection.ConnectionString)) - { - c.Open(); - - executeSQL("DROP TABLE Test"); - executeSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME(6), d DATE, " + - "t TIME(6), ts TIMESTAMP(6), PRIMARY KEY(id))"); - - cmd.Connection = c; - cmd.CommandText = "INSERT INTO Test VALUES(1, NULL, NULL, NULL, ?ts)"; - - MySqlParameter timeinsert = new MySqlParameter(); - timeinsert.ParameterName = "?ts"; - timeinsert.MySqlDbType = MySqlDbType.Timestamp; - timeinsert.Value = "2011-01-01 12:34:56.123456"; - cmd.Parameters.Add(timeinsert); - - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT ts FROM Test"; - cmd.Parameters.Clear(); - cmd.Connection = connection; - - MySqlDataReader rdr = cmd.ExecuteReader(); - - while (rdr.Read()) - { - Assert.Equal(123456, rdr.GetMySqlDateTime(0).Microsecond); - } - rdr.Close(); - } - - } - - - [Fact] - public void CanUpdateMillisecondsUsingTimeStampTypeWithPrepare() - { - if (ts.version < new Version(5, 6)) return; - DateTime dt = DateTime.Now; - MySqlCommand cmd = new MySqlCommand(); - - using (MySqlConnection c = new MySqlConnection(connection.ConnectionString + ";ignore prepare=False;")) - { - c.Open(); - - executeSQL("DROP TABLE Test"); - executeSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME(6), d DATE, " + - "t TIME(6), ts TIMESTAMP(6), PRIMARY KEY(id))"); - - cmd.Connection = c; - cmd.CommandText = "INSERT INTO Test VALUES(1, NULL, NULL, NULL, ?ts)"; - - MySqlParameter timeinsert = new MySqlParameter(); - timeinsert.ParameterName = "?ts"; - timeinsert.MySqlDbType = MySqlDbType.Timestamp; - timeinsert.Value = "2011-01-01 12:34:56.123456"; - cmd.Parameters.Add(timeinsert); - - cmd.Prepare(); - - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT ts FROM Test"; - cmd.Parameters.Clear(); - cmd.Connection = connection; - - using (MySqlDataReader rdr = cmd.ExecuteReader()) - { - while (rdr.Read()) - { - Assert.Equal(123456, rdr.GetMySqlDateTime(0).Microsecond); - } - } - } - } - #endregion - - /// - /// Bug #63812 MySqlDateTime.GetDateTime() does not specify Timezone for TIMESTAMP fields - /// - [Fact] - public void TimestampValuesAreLocal() - { - DateTime dt = DateTime.Now; - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1, ?dt, NULL, NULL, NULL)", connection); - cmd.Parameters.AddWithValue("@dt", dt); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT dt,ts FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - DateTime dt1 = reader.GetDateTime(0); - DateTime ts = reader.GetDateTime(1); - Assert.Equal(DateTimeKind.Unspecified, dt1.Kind); - Assert.Equal(DateTimeKind.Local, ts.Kind); - } - } - - /// - /// Bug #66964 TIMESTAMP values are mistakenly represented as DateTime with Kind = Local - /// - [Fact] - public void TimestampCorrectTimezone() - { - DateTime dt = DateTime.Now; - MySqlCommand cmd = new MySqlCommand("select timediff( curtime(), utc_time() )", connection); - string s = cmd.ExecuteScalar().ToString(); - int curroffset = int.Parse(s.Substring(0, s.IndexOf(':'))); - string prevTimeZone = ""; - // Ensure timezone is UTC - if (curroffset != 0) - { - cmd.CommandText = "SELECT @@global.time_zone"; - prevTimeZone = cmd.ExecuteScalar().ToString(); - cmd.CommandText = "set @@global.time_zone = '+0:00'"; - cmd.ExecuteNonQuery(); - // Refresh time_zone value - connection.Close(); - connection.Open(); - } - try - { - cmd.CommandText = string.Format("INSERT INTO `{0}`.Test VALUES(1, curdate(), NULL, NULL, current_timestamp())", connection.Database); ; - cmd.ExecuteNonQuery(); - cmd.CommandText = string.Format("SELECT dt,ts FROM `{0}`.Test", connection.Database); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - DateTime ts = reader.GetDateTime(1); - Assert.Equal(ts.Kind, DateTimeKind.Utc); - } - // Now set it to non-UTC - cmd.CommandText = "set @@global.time_zone = '+5:00'"; - cmd.ExecuteNonQuery(); - // Refresh time_zone value - connection.Close(); - connection.Open(); - cmd.CommandText = string.Format("SELECT dt,ts FROM `{0}`.Test", connection.Database); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - DateTime ts = reader.GetDateTime(1); - Assert.Equal(ts.Kind, DateTimeKind.Local); - } - } - finally - { - if (!string.IsNullOrEmpty(prevTimeZone)) - { - // restore modified time zone if any - cmd.CommandText = string.Format("set @@global.time_zone = '{0}'", prevTimeZone); - cmd.ExecuteNonQuery(); - connection.Close(); - connection.Open(); - } - } - } - - /// - /// Bug #13881444 DateTime(3) column definition on - /// 5.6.x server is not processing Milliseconds value - /// correctly - /// - [Fact] - public void CanSaveMillisecondsPrecision3WithPrepare() - { - - if (ts.version < new Version(5, 6)) return; - DateTime dt = new DateTime(2012, 3, 18, 23, 9, 7, 6); - MySqlCommand cmd = new MySqlCommand(); - - executeSQL("DROP TABLE Test"); - executeSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME(3), PRIMARY KEY(id))"); - - using (MySqlConnection c = new MySqlConnection(connection.ConnectionString + ";ignore prepare=False;")) - { - c.Open(); - cmd.Connection = c; - cmd.CommandText = "INSERT INTO Test VALUES(1, ?dt)"; - cmd.Parameters.AddWithValue("?dt", dt); - cmd.Prepare(); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT dt FROM Test"; - cmd.Parameters.Clear(); - cmd.Connection = connection; - MySqlDataReader rdr = cmd.ExecuteReader(); - - while (rdr.Read()) - { - Assert.Equal("11:09:07.0060", rdr.GetDateTime(0).ToString("hh:mm:ss.ffff")); - } - rdr.Close(); - } - } - - [Fact] - public void CanSaveMillisecondsPrecision3() - { - - if (ts.version < new Version(5, 6)) return; - DateTime dt = new DateTime(2012, 3, 18, 23, 9, 7, 6); - MySqlCommand cmd = new MySqlCommand(); - - executeSQL("DROP TABLE Test"); - executeSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME(3), PRIMARY KEY(id))"); - cmd.Connection = connection; - cmd.CommandText = "INSERT INTO Test VALUES(1, ?dt)"; - cmd.Parameters.AddWithValue("?dt", dt); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT dt FROM Test"; - cmd.Parameters.Clear(); - cmd.Connection = connection; - MySqlDataReader rdr = cmd.ExecuteReader(); - - while (rdr.Read()) - { - Assert.Equal("11:09:07.0060", rdr.GetDateTime(0).ToString("hh:mm:ss.ffff")); - } - rdr.Close(); - } - - [Fact] - public void CanSaveMicrosecondsPrecision4() - { - - if (ts.version < new Version(5, 6)) return; - DateTime dt = new DateTime(2012, 3, 18, 23, 9, 7, 6); - MySqlCommand cmd = new MySqlCommand(); - - executeSQL("DROP TABLE Test"); - executeSQL("CREATE TABLE Test (id INT NOT NULL, dt DATETIME(4), PRIMARY KEY(id))"); - cmd.Connection = connection; - cmd.CommandText = "INSERT INTO Test VALUES(1, ?dt)"; - cmd.Parameters.AddWithValue("?dt", dt); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT dt FROM Test"; - cmd.Parameters.Clear(); - cmd.Connection = connection; - MySqlDataReader rdr = cmd.ExecuteReader(); - - while (rdr.Read()) - { - Assert.Equal(dt.ToString("hh:mm:ss.ffff"), rdr.GetDateTime(0).ToString("hh:mm:ss.ffff")); - } - rdr.Close(); - } - - [Fact] - public void ShowMicrosecondError() - { - MySqlCommand cmd = new MySqlCommand(); - cmd.CommandText = "SELECT NOW() + INTERVAL 123456 MICROSECOND"; - cmd.Parameters.Clear(); - cmd.Connection = connection; - string date = cmd.ExecuteScalar().ToString(); - DateTime temp; - Assert.True(DateTime.TryParse(date, out temp)); - } - -#if NET_45_OR_GREATER - /// - /// Testing new functionality for Server 5.6 - /// On WL 5874 - /// - [Fact] - public void CanDefineCurrentTimeStampAsDefaultOnDateTime() - { - if (ts.version < new Version(5, 6, 5)) return; - MySqlCommand cmd = new MySqlCommand(); - cmd.CommandText = " CREATE TABLE t1 (id int, a DATETIME DEFAULT CURRENT_TIMESTAMP );"; - cmd.Parameters.Clear(); - - cmd.Connection = connection; - var result = cmd.ExecuteNonQuery(); - - cmd.CommandText = " INSERT INTO t1 (id) values(1);"; - cmd.ExecuteNonQuery(); - - cmd.CommandText = " SELECT a from t1"; - var reader = cmd.ExecuteReader(); - - DateTime tempDate = new DateTime(); - - while (reader.Read()) - { - Assert.True(DateTime.TryParse(reader.GetDateTime(0).ToString(), out tempDate)); - } - reader.Close(); - } -#endif - - [Fact] - public void ReadAndWriteMicroseconds() - { - if (ts.version < new Version(5, 6, 5)) return; - MySqlCommand cmd = new MySqlCommand(); - cmd.CommandText = "CREATE TABLE t1 (id int, t3 TIME(3), t6 TIME(6), d6 DATETIME(6));"; - cmd.Connection = connection; - var result = cmd.ExecuteNonQuery(); - - DateTime milliseconds = new DateTime(1, 1, 1, 15, 45, 23, 123); - DateTime microseconds = milliseconds.AddTicks(4560); - - cmd.CommandText = "INSERT INTO t1 (id, t3, t6, d6) values(1, @t3, @t6, @d6);"; - cmd.Parameters.AddWithValue("t3", new TimeSpan(milliseconds.Ticks)); - cmd.Parameters.AddWithValue("t6", new TimeSpan(microseconds.Ticks)); - cmd.Parameters.AddWithValue("d6", microseconds); - cmd.ExecuteNonQuery(); - - cmd.CommandText = " SELECT * from t1"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.Read()); - Assert.Equal(milliseconds.Ticks, reader.GetTimeSpan(1).Ticks); - Assert.Equal(microseconds.Ticks, reader.GetTimeSpan(2).Ticks); - Assert.Equal(microseconds.Ticks, reader.GetDateTime(3).Ticks); - Assert.Equal(microseconds.Millisecond, reader.GetDateTime(3).Millisecond); - Assert.Equal(microseconds.Millisecond, reader.GetMySqlDateTime(3).Millisecond); - Assert.Equal((microseconds.Ticks % 10000000) / 10, reader.GetMySqlDateTime(3).Microsecond); - } - } - - [Fact] - public void TimeZoneOffset() - { - string timeZone = "-12:00"; - int timeZoneHours = -12; - if (DateTime.UtcNow.Hour >= 12) - { - timeZone = "+13:00"; - timeZoneHours = 13; - } - - executeSQL(string.Format("SET @@global.time_zone='{0}'", timeZone)); - - try - { - using (MySqlConnection conn2 = (MySqlConnection)connection.Clone()) - { - conn2.Open(); - Assert.Equal(timeZoneHours, conn2.driver.timeZoneOffset); - } - } - finally - { - executeSQL("SET @@global.time_zone=@@session.time_zone"); - } - } - } -} diff --git a/Tests/MySql.Data.Tests/EventTests.cs b/Tests/MySql.Data.Tests/EventTests.cs deleted file mode 100644 index 998c44e22..000000000 --- a/Tests/MySql.Data.Tests/EventTests.cs +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Data; - -namespace MySql.Data.MySqlClient.Tests -{ - public class EventTests : TestBase - { - public EventTests(TestSetup setup) : base(setup, "event") - { - - } - - [Fact] - public void Warnings() - { - executeSQL("CREATE TABLE Test (name VARCHAR(10))"); - - string connStr = Settings.GetConnectionString(true); - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - - MySqlCommand cmd = new MySqlCommand("SET SQL_MODE=''", c); - cmd.ExecuteNonQuery(); - - c.InfoMessage += new MySqlInfoMessageEventHandler(WarningsInfoMessage); - - cmd.CommandText = "INSERT INTO Test VALUES ('12345678901')"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - } - } - } - - private void WarningsInfoMessage(object sender, MySqlInfoMessageEventArgs args) - { - Assert.Equal(1, args.errors.Length); - } - - [Fact] - public void StateChange() - { - MySqlConnection c = new MySqlConnection(Settings.GetConnectionString(true)); - c.StateChange += new StateChangeEventHandler(StateChangeHandler); - c.Open(); - c.Close(); - } - - private void StateChangeHandler(object sender, StateChangeEventArgs e) - { - } - } -} diff --git a/Tests/MySql.Data.Tests/ExceptionTests.cs b/Tests/MySql.Data.Tests/ExceptionTests.cs deleted file mode 100644 index f3ffbb1be..000000000 --- a/Tests/MySql.Data.Tests/ExceptionTests.cs +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Data; - -namespace MySql.Data.MySqlClient.Tests -{ - public class ExceptionTests : TestBase - { - public ExceptionTests(TestSetup setup) : base(setup, "exception") - { - - } - - [Fact (Skip = "Having an issue")] - public void Timeout() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100))"); - for (int i = 1; i < 10; i++) - executeSQL("INSERT INTO Test VALUES (" + i + ", 'This is a long text string that I am inserting')"); - - // we create a new connection so our base one is not closed - MySqlConnection c2 = new MySqlConnection(connection.ConnectionString); - c2.Open(); - - KillConnection(c2); - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", c2); - - Exception ex = Assert.Throws(() => cmd.ExecuteReader()); - Assert.Equal(ex.Message, "Connection must be valid and open."); - Assert.Equal(ConnectionState.Closed, c2.State); - c2.Close(); - - } - /// - /// Bug #27436 Add the MySqlException.Number property value to the Exception.Data Dictionary - /// - [Fact] - public void ErrorData() - { - MySqlCommand cmd = new MySqlCommand("SELEDT 1", connection); - try - { - cmd.ExecuteNonQuery(); - } - catch (Exception ex) - { - Assert.Equal(1064, ex.Data["Server Error Code"]); - } - } - } -} diff --git a/Tests/MySql.Data.Tests/Framework/Net451/AsyncTests.cs b/Tests/MySql.Data.Tests/Framework/Net451/AsyncTests.cs deleted file mode 100644 index 61eb6221f..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/AsyncTests.cs +++ /dev/null @@ -1,597 +0,0 @@ -// Copyright © 2013, 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; -using Xunit; -using System.Data; -using System.Threading.Tasks; - - -namespace MySql.Data.MySqlClient.Tests -{ - public class AsyncTests : TestBase - { - protected TestSetup ts; - - public AsyncTests(TestSetup setup) : base(setup, "async") - { - ts = setup; - ts.CreateDatabase("1"); - } - - [Fact] - public void ExecuteNonQuery() - { - if (ts.version < new Version(5, 0)) return; - - if (connection.State != ConnectionState.Open) - connection.Open(); - - executeSQL("CREATE TABLE test (id int)"); - - executeSQL("CREATE PROCEDURE spTest() BEGIN SET @x=0; REPEAT INSERT INTO test VALUES(@x); " + - "SET @x=@x+1; UNTIL @x = 300 END REPEAT; END"); - - MySqlCommand proc = new MySqlCommand("spTest", connection); - proc.CommandType = CommandType.StoredProcedure; - IAsyncResult iar = proc.BeginExecuteNonQuery(); - int count = 0; - while (!iar.IsCompleted) - { - count++; - System.Threading.Thread.Sleep(20); - } - proc.EndExecuteNonQuery(iar); - - - Assert.True(count > 0); - - proc.CommandType = CommandType.Text; - proc.CommandText = "SELECT COUNT(*) FROM test"; - object cnt = proc.ExecuteScalar(); - Assert.Equal(300, Convert.ToInt32(cnt)); - } - - [Fact] - public void ExecuteReader() - { - if (ts.version < new Version(5, 0)) return; - - if (connection.State != ConnectionState.Open) - connection.Open(); - - executeSQL("CREATE TABLE test (id int)"); - executeSQL("CREATE PROCEDURE spTest() BEGIN INSERT INTO test VALUES(1); " + - "SELECT SLEEP(2); SELECT 'done'; END"); - - MySqlCommand proc = new MySqlCommand("spTest", connection); - proc.CommandType = CommandType.StoredProcedure; - IAsyncResult iar = proc.BeginExecuteReader(); - int count = 0; - while (!iar.IsCompleted) - { - count++; - System.Threading.Thread.Sleep(20); - } - - using (MySqlDataReader reader = proc.EndExecuteReader(iar)) - { - Assert.NotNull(reader); - Assert.True(count > 0, "count > 0"); - Assert.True(reader.Read(), "can read"); - Assert.True(reader.NextResult()); - Assert.True(reader.Read()); - Assert.Equal("done", reader.GetString(0)); - reader.Close(); - - proc.CommandType = CommandType.Text; - proc.CommandText = "SELECT COUNT(*) FROM test"; - object cnt = proc.ExecuteScalar(); - Assert.Equal(1, Convert.ToInt32(cnt)); - } - } - - [Fact] - public void ThrowingExceptions() - { - if (connection.State != ConnectionState.Open) - connection.Open(); - - MySqlCommand cmd = new MySqlCommand("SELECT xxx", connection); - IAsyncResult r = cmd.BeginExecuteReader(); - Exception ex = Assert.Throws(() => cmd.EndExecuteReader(r)); - Assert.Equal("Unknown column 'xxx' in 'field list'", ex.Message); - } - - - #region Async - #region PrivateMembers - private int statementCount; - private string statementTemplate1 = @"CREATE PROCEDURE `spTest{0}`() NOT DETERMINISTIC - CONTAINS SQL SQL SECURITY DEFINER COMMENT '' - BEGIN - SELECT 1,2,3; - END{1}"; - private string statementTemplate2 = @"INSERT INTO Test (id, name) VALUES ({0}, 'a "" na;me'){1}"; - private void CreateDefaultTable() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL AUTO_INCREMENT, " + - "id2 INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, " + - "ts TIMESTAMP, OriginalId INT, PRIMARY KEY(id, id2))"); - } - void ExecuteScriptWithInserts_StatementExecuted(object sender, MySqlScriptEventArgs e) - { - string stmt = String.Format(statementTemplate2, statementCount++, null); - Assert.Equal(stmt, e.StatementText); - } - void ExecuteScriptWithProcedures_QueryExecuted(object sender, MySqlScriptEventArgs e) - { - string stmt = String.Format(statementTemplate1, statementCount++, null); - Assert.Equal(stmt, e.StatementText); - } - #endregion - - #region BulkLoad - [Fact] - public async Task BulkLoadAsync() - { - executeSQL("CREATE TABLE BulkLoadTest (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); - - string path = System.IO.Path.GetTempFileName(); - System.IO.StreamWriter sw = new System.IO.StreamWriter(path); - for (int i = 0; i < 500; i++) - sw.WriteLine(i + "\t'Test'"); - sw.Flush(); - sw.Close(); - - MySqlBulkLoader loader = new MySqlBulkLoader(connection); - loader.TableName = "BulkLoadTest"; - loader.FileName = path; - loader.Timeout = 0; - - var result = await loader.LoadAsync(); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM BulkLoadTest", connection); - DataTable dt = new DataTable(); - da.Fill(dt); - Assert.Equal(500, dt.Rows.Count); - Assert.Equal("'Test'", dt.Rows[0][1].ToString().Trim()); - } - #endregion - - #region Command - [Fact] - public async Task ExecuteNonQueryAsync() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE TABLE NonQueryAsyncTest (id int)"); - executeSQL("CREATE PROCEDURE NonQueryAsyncSpTest() BEGIN SET @x=0; REPEAT INSERT INTO NonQueryAsyncTest VALUES(@x); SET @x=@x+1; UNTIL @x = 100 END REPEAT; END"); - - MySqlCommand proc = new MySqlCommand("NonQueryAsyncSpTest", connection); - proc.CommandType = CommandType.StoredProcedure; - int result = await proc.ExecuteNonQueryAsync(); - - Assert.NotEqual(-1, result); - - MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM NonQueryAsyncTest;", connection); - cmd.CommandType = CommandType.Text; - object cnt = cmd.ExecuteScalar(); - Assert.Equal(100, Convert.ToInt32(cnt)); - } - - [Fact] - public async Task ExecuteReaderAsync() - { - if (ts.version < new Version(5, 0)) return; - - if (connection.State != ConnectionState.Open) - connection.Open(); - - executeSQL("CREATE TABLE ReaderAsyncTest (id int)"); - executeSQL("CREATE PROCEDURE ReaderAsyncSpTest() BEGIN INSERT INTO ReaderAsyncTest VALUES(1); SELECT SLEEP(2); SELECT 'done'; END"); - - MySqlCommand proc = new MySqlCommand("ReaderAsyncSpTest", connection); - proc.CommandType = CommandType.StoredProcedure; - - using (MySqlDataReader reader = await proc.ExecuteReaderAsync() as MySqlDataReader) - { - Assert.NotNull(reader); - Assert.True(reader.Read(), "can read"); - Assert.True(reader.NextResult()); - Assert.True(reader.Read()); - Assert.Equal("done", reader.GetString(0)); - reader.Close(); - - proc.CommandType = CommandType.Text; - proc.CommandText = "SELECT COUNT(*) FROM ReaderAsyncTest"; - object cnt = proc.ExecuteScalar(); - Assert.Equal(1, Convert.ToInt32(cnt)); - } - } - - [Fact] - public async Task ExecuteScalarAsync() - { - if (ts.version < new Version(5, 0)) return; - - if (connection.State != ConnectionState.Open) - connection.Open(); - - executeSQL("CREATE PROCEDURE ScalarAsyncSpTest( IN valin VARCHAR(50), OUT valout VARCHAR(50) ) BEGIN SET valout=valin; SELECT 'Test'; END"); - - MySqlCommand cmd = new MySqlCommand("ScalarAsyncSpTest", connection); - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.AddWithValue("?valin", "valuein"); - cmd.Parameters.Add(new MySqlParameter("?valout", MySqlDbType.VarChar)); - cmd.Parameters[1].Direction = ParameterDirection.Output; - - object result = await cmd.ExecuteScalarAsync(); - Assert.Equal("Test", result); - Assert.Equal("valuein", cmd.Parameters[1].Value); - } - #endregion - - #region Connection - [Fact] - public async Task TransactionAsync() - { - executeSQL("Create Table TranAsyncTest(key2 varchar(50), name varchar(50), name2 varchar(50))"); - executeSQL("INSERT INTO TranAsyncTest VALUES('P', 'Test1', 'Test2')"); - - MySqlTransaction txn = await connection.BeginTransactionAsync(); - MySqlConnection c = txn.Connection; - Assert.Equal(connection, c); - MySqlCommand cmd = new MySqlCommand("SELECT name, name2 FROM TranAsyncTest WHERE key2='P'", connection, txn); - MySqlTransaction t2 = cmd.Transaction; - Assert.Equal(txn, t2); - MySqlDataReader reader = null; - try - { - reader = cmd.ExecuteReader(); - reader.Close(); - txn.Commit(); - } - catch (Exception ex) - { - Assert.False(ex.Message != string.Empty, ex.Message); - txn.Rollback(); - } - finally - { - if (reader != null) reader.Close(); - } - } - - [Fact] - public async Task ChangeDataBaseAsync() - { - if (ts.version < new Version(4, 1)) return; - - executeSQL("CREATE TABLE ChangeDBAsyncTest (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, `multi word` int, PRIMARY KEY(id))"); - executeSQL("INSERT INTO ChangeDBAsyncTest (id, name) VALUES (1,'test1')"); - executeSQL("INSERT INTO ChangeDBAsyncTest (id, name) VALUES (2,'test2')"); - executeSQL("INSERT INTO ChangeDBAsyncTest (id, name) VALUES (3,'test3')"); - - await connection.ChangeDataBaseAsync(ts.baseDBName + "1"); - - MySqlDataAdapter da = new MySqlDataAdapter(String.Format("SELECT id, name FROM `{0}`.ChangeDBAsyncTest", ts.baseDBName + "0"), connection); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - DataSet ds = new DataSet(); - da.Fill(ds); - - Assert.Equal(3, ds.Tables[0].Rows.Count); - - ds.Tables[0].Rows[0]["id"] = 4; - DataSet changes = ds.GetChanges(); - da.Update(changes); - ds.Merge(changes); - ds.AcceptChanges(); - cb.Dispose(); - await connection.ChangeDataBaseAsync(ts.baseDBName + "0"); - } - - [Fact] - public async Task OpenAndCloseConnectionAsync() - { - string connStr2 = ts.GetConnection(false).ConnectionString; - MySqlConnection c = new MySqlConnection(connStr2); - await c.OpenAsync(); - await c.CloseAsync(); - } - - [Fact] - public async Task ClearPoolAsync() - { - MySqlConnection c1 = new MySqlConnection(ts.GetConnection(true).ConnectionString); - MySqlConnection c2 = new MySqlConnection(ts.GetConnection(true).ConnectionString); - c1.Open(); - c2.Open(); - c1.Close(); - c2.Close(); - await c1.ClearPoolAsync(c1); - await c2.ClearPoolAsync(c1); - } - - [Fact] - public async Task ClearAllPoolsAsync() - { - MySqlConnection c1 = new MySqlConnection(ts.GetConnection(true).ConnectionString); - MySqlConnection c2 = new MySqlConnection(ts.GetConnection(true).ConnectionString); - c1.Open(); - c2.Open(); - c1.Close(); - c2.Close(); - await c1.ClearAllPoolsAsync(); - await c2.ClearAllPoolsAsync(); - } - - [Fact] - public async Task GetSchemaCollectionAsync() - { - MySqlConnection c1 = new MySqlConnection(ts.GetConnection(true).ConnectionString); - c1.Open(); - MySqlSchemaCollection schemaColl = await c1.GetSchemaCollectionAsync(SchemaProvider.MetaCollection, null); - c1.Close(); - Assert.NotNull(schemaColl); - } - - #endregion - - #region Adapter - [Fact] - public async Task FillAsync() - { - executeSQL("CREATE TABLE FillAsyncTest (id INT NOT NULL AUTO_INCREMENT, id2 INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, ts TIMESTAMP, OriginalId INT, PRIMARY KEY(id, id2))"); - executeSQL("INSERT INTO FillAsyncTest (id, id2, name, dt) VALUES (NULL, 1, 'Name 1', Now())"); - executeSQL("INSERT INTO FillAsyncTest (id, id2, name, dt) VALUES (NULL, 2, NULL, Now())"); - executeSQL("INSERT INTO FillAsyncTest (id, id2, name, dt) VALUES (NULL, 3, '', Now())"); - - MySqlDataAdapter da = new MySqlDataAdapter("select * from FillAsyncTest", connection); - DataSet ds = new DataSet(); - await da.FillAsync(ds, "FillAsyncTest"); - - Assert.Equal(1, ds.Tables.Count); - Assert.Equal(3, ds.Tables[0].Rows.Count); - - Assert.Equal(1, ds.Tables[0].Rows[0]["id2"]); - Assert.Equal(2, ds.Tables[0].Rows[1]["id2"]); - Assert.Equal(3, ds.Tables[0].Rows[2]["id2"]); - - Assert.Equal("Name 1", ds.Tables[0].Rows[0]["name"]); - Assert.Equal(DBNull.Value, ds.Tables[0].Rows[1]["name"]); - Assert.Equal(String.Empty, ds.Tables[0].Rows[2]["name"]); - } - - [Fact] - public async Task FillSchemaAsync() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE PROCEDURE FillSchemaAsyncSpTest() BEGIN SELECT * FROM FillSchemaAsyncTest; END"); - executeSQL(@"CREATE TABLE FillSchemaAsyncTest(id INT AUTO_INCREMENT, name VARCHAR(20), PRIMARY KEY (id)) "); - - MySqlCommand cmd = new MySqlCommand("FillSchemaAsyncSpTest", connection); - cmd.CommandType = CommandType.StoredProcedure; - - MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly); - reader.Read(); - reader.Close(); - - MySqlDataAdapter da = new MySqlDataAdapter(cmd); - DataTable schema = new DataTable(); - await da.FillSchemaAsync(schema, SchemaType.Source); - Assert.Equal(2, schema.Columns.Count); - } - - [Fact] - public async Task UpdateAsync() - { - executeSQL("CREATE TABLE UpdateAsyncTest (id INT NOT NULL AUTO_INCREMENT, id2 INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, ts TIMESTAMP, OriginalId INT, PRIMARY KEY(id, id2))"); - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM UpdateAsyncTest", connection); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - DataTable dt = new DataTable(); - da.Fill(dt); - - DataRow dr = dt.NewRow(); - dr["id2"] = 2; - dr["name"] = "TestName1"; - dt.Rows.Add(dr); - int count = await da.UpdateAsync(dt); - - Assert.True(count == 1, "checking insert count"); - Assert.True(dt.Rows[dt.Rows.Count - 1]["id"] != null, "Checking auto increment column"); - - dt.Rows.Clear(); - da.Fill(dt); - dt.Rows[0]["id2"] = 3; - dt.Rows[0]["name"] = "TestName2"; - dt.Rows[0]["ts"] = DBNull.Value; - DateTime day1 = new DateTime(2003, 1, 16, 12, 24, 0); - dt.Rows[0]["dt"] = day1; - dt.Rows[0]["tm"] = day1.TimeOfDay; - count = await da.UpdateAsync(dt); - - Assert.True(dt.Rows[0]["ts"] != null, "checking refresh of record"); - Assert.True(dt.Rows[0]["id2"] != null, "checking refresh of primary column"); - - dt.Rows.Clear(); - da.Fill(dt); - - Assert.True(count == 1, "checking update count"); - DateTime dateTime = (DateTime)dt.Rows[0]["dt"]; - Assert.True(day1.Date == dateTime.Date, "checking date"); - Assert.True(day1.TimeOfDay == (TimeSpan)dt.Rows[0]["tm"], "checking time"); - - dt.Rows[0].Delete(); - count = await da.UpdateAsync(dt); - - Assert.True(count == 1, "checking insert count"); - - dt.Rows.Clear(); - da.Fill(dt); - Assert.True(dt.Rows.Count == 0, "checking row count"); - cb.Dispose(); - } - - #endregion - - #region MySqlScript - [Fact] - public async Task ExecuteScriptWithProceduresAsync() - { - if (ts.version < new Version(5, 0)) return; - - string spTpl = @"CREATE PROCEDURE `ScriptWithProceduresAsyncSpTest{0}`() NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER COMMENT '' BEGIN SELECT 1,2,3; END{1}"; - statementCount = 0; - string scriptText = String.Empty; - for (int i = 0; i < 10; i++) - { - scriptText += String.Format(spTpl, i, "$$"); - } - MySqlScript script = new MySqlScript(scriptText); - script.StatementExecuted += new MySqlStatementExecutedEventHandler(delegate(object sender, MySqlScriptEventArgs e) - { - string stmt = String.Format(spTpl, statementCount++, null); - Assert.Equal(stmt, e.StatementText); - }); - script.Connection = connection; - script.Delimiter = "$$"; - int count = await script.ExecuteAsync(); - Assert.Equal(10, count); - - MySqlCommand cmd = new MySqlCommand(String.Format(@"SELECT COUNT(*) FROM information_schema.routines WHERE routine_schema = '{0}' AND routine_name LIKE 'ScriptWithProceduresAsyncSpTest%'", ts.baseDBName + "0"), connection); - Assert.Equal(10, Convert.ToInt32(cmd.ExecuteScalar())); - } - - [Fact] - public async Task ExecuteScriptWithInsertsAsync() - { - executeSQL("CREATE TABLE ScriptWithInsertsAsyncTest (id int, name varchar(50))"); - string queryTpl = @"INSERT INTO ScriptWithInsertsAsyncTest (id, name) VALUES ({0}, 'a "" na;me'){1}"; - statementCount = 0; - string scriptText = String.Empty; - for (int i = 0; i < 10; i++) - { - scriptText += String.Format(queryTpl, i, ";"); - } - MySqlScript script = new MySqlScript(scriptText); - script.Connection = connection; - script.StatementExecuted += new MySqlStatementExecutedEventHandler(delegate(object sender, MySqlScriptEventArgs e) - { - string stmt = String.Format(queryTpl, statementCount++, null); - Assert.Equal(stmt, e.StatementText); - }); - - int count = await script.ExecuteAsync(); - Assert.Equal(10, count); - - MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM ScriptWithInsertsAsyncTest", connection); - Assert.Equal(10, Convert.ToInt32(cmd.ExecuteScalar())); - } - - #endregion - - #region MySqlHelper - [Fact] - public async Task MSH_ExecuteNonQueryAsync() - { - if (ts.version < new Version(5, 0)) return; - executeSQL("CREATE TABLE HelperNonQueryAsyncTest (id int)"); - executeSQL("CREATE PROCEDURE HelperNonQueryAsyncSpTest() BEGIN SET @x=0; REPEAT INSERT INTO HelperNonQueryAsyncTest VALUES(@x); SET @x=@x+1; UNTIL @x = 100 END REPEAT; END"); - - int result = await MySqlHelper.ExecuteNonQueryAsync(connection, "call HelperNonQueryAsyncSpTest", null); - Assert.NotEqual(-1, result); - - MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM HelperNonQueryAsyncTest;", connection); - cmd.CommandType = System.Data.CommandType.Text; - object cnt = cmd.ExecuteScalar(); - Assert.Equal(100, Convert.ToInt32(cnt)); - } - - [Fact] - public async Task MSH_ExecuteDataSetAsync() - { - executeSQL("CREATE TABLE HelperDataSetAsyncTable1 (`key` INT, PRIMARY KEY(`key`))"); - executeSQL("CREATE TABLE HelperDataSetAsyncTable2 (`key` INT, PRIMARY KEY(`key`))"); - executeSQL("INSERT INTO HelperDataSetAsyncTable1 VALUES (1)"); - executeSQL("INSERT INTO HelperDataSetAsyncTable2 VALUES (1)"); - - string sql = "SELECT HelperDataSetAsyncTable1.key FROM HelperDataSetAsyncTable1 WHERE HelperDataSetAsyncTable1.key=1; SELECT HelperDataSetAsyncTable2.key FROM HelperDataSetAsyncTable2 WHERE HelperDataSetAsyncTable2.key=1"; - DataSet ds = await MySqlHelper.ExecuteDatasetAsync(connection, sql, null); - - Assert.Equal(2, ds.Tables.Count); - Assert.Equal(1, ds.Tables[0].Rows.Count); - Assert.Equal(1, ds.Tables[1].Rows.Count); - Assert.Equal(1, ds.Tables[0].Rows[0]["key"]); - Assert.Equal(1, ds.Tables[1].Rows[0]["key"]); - } - - [Fact] - public async Task MSH_ExecuteReaderAsync() - { - if (ts.version < new Version(5, 0)) return; - - if (connection.State != ConnectionState.Open) - connection.Open(); - - executeSQL("CREATE TABLE HelperReaderAsyncTest (id int)"); - executeSQL("CREATE PROCEDURE HelperReaderAsyncSpTest() BEGIN INSERT INTO HelperReaderAsyncTest VALUES(1); SELECT SLEEP(2); SELECT 'done'; END"); - - using (MySqlDataReader reader = await MySqlHelper.ExecuteReaderAsync(connection, "call HelperReaderAsyncSpTest")) - { - Assert.NotNull(reader); - Assert.True(reader.Read(), "can read"); - Assert.True(reader.NextResult()); - Assert.True(reader.Read()); - Assert.Equal("done", reader.GetString(0)); - reader.Close(); - - MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM HelperReaderAsyncTest", connection); - cmd.CommandType = CommandType.Text; - object cnt = cmd.ExecuteScalar(); - Assert.Equal(1, Convert.ToInt32(cnt)); - } - } - - [Fact] - public async Task MSH_ExecuteScalarAsync() - { - if (ts.version < new Version(5, 0)) return; - - if (connection.State != ConnectionState.Open) - connection.Open(); - - executeSQL("CREATE TABLE HelperScalarAsyncTest (`key` INT, PRIMARY KEY(`key`))"); - executeSQL("INSERT INTO HelperScalarAsyncTest VALUES (1)"); - - object result = await MySqlHelper.ExecuteScalarAsync(connection, "SELECT HelperScalarAsyncTest.key FROM HelperScalarAsyncTest WHERE HelperScalarAsyncTest.key=1;"); - Assert.Equal(1, int.Parse(result.ToString())); - } - #endregion - - #endregion - } -} diff --git a/Tests/MySql.Data.Tests/Framework/Net451/BlobTestsPipe.cs b/Tests/MySql.Data.Tests/Framework/Net451/BlobTestsPipe.cs deleted file mode 100644 index 63230c3b1..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/BlobTestsPipe.cs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright © 2013, 2015 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Security.Authentication; - -namespace MySql.Data.MySqlClient.Tests -{ - #region Configs - - public class BlobTestsPipe : BlobTests - { - public BlobTestsPipe(TestSetup setup): base(setup , "blobtestspipe") - { - } - - protected override string OnGetConnectionStringInfo() - { - return String.Format("protocol=pipe;pipe name={0};ssl mode=none;", ts.pipeName); - } - - } - #endregion -} diff --git a/Tests/MySql.Data.Tests/Framework/Net451/BlobTestsPipeCompressed.cs b/Tests/MySql.Data.Tests/Framework/Net451/BlobTestsPipeCompressed.cs deleted file mode 100644 index e3b3873d8..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/BlobTestsPipeCompressed.cs +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Security.Authentication; - -namespace MySql.Data.MySqlClient.Tests -{ - #region Configs - - [Category("Compressed")] - public class BlobTestsPipeCompressed : BlobTests - { - public BlobTestsPipeCompressed(TestSetup setup): base(setup, "blobtestpipecomp") - { - - } - - protected override string OnGetConnectionStringInfo() - { - return String.Format("protocol=pipe;pipe name={0};compress=true;ssl mode=none;", ts.pipeName); - } - } - - #endregion -} \ No newline at end of file diff --git a/Tests/MySql.Data.Tests/Framework/Net451/BlobTestsSharedMemory.cs b/Tests/MySql.Data.Tests/Framework/Net451/BlobTestsSharedMemory.cs deleted file mode 100644 index 67dbb718c..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/BlobTestsSharedMemory.cs +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Security.Authentication; - -namespace MySql.Data.MySqlClient.Tests -{ - #region Configs - - public class BlobTestsSharedMemory : BlobTests - { - - public BlobTestsSharedMemory(TestSetup setup) : base (setup, "blobtestssharedm") - { - - } - - protected override string OnGetConnectionStringInfo() - { - return String.Format("protocol=memory; shared memory name={0};ssl mode=none;", ts.sharedMemoryName); - } - } - #endregion -} \ No newline at end of file diff --git a/Tests/MySql.Data.Tests/Framework/Net451/BlobTestsSharedMemoryCompressed.cs b/Tests/MySql.Data.Tests/Framework/Net451/BlobTestsSharedMemoryCompressed.cs deleted file mode 100644 index e1b37a79c..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/BlobTestsSharedMemoryCompressed.cs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright © 2013, 2015 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Security.Authentication; - -namespace MySql.Data.MySqlClient.Tests -{ - #region Configs - - [Category("Compressed")] - public class BlobTestsSharedMemoryCompressed : BlobTests - { - public BlobTestsSharedMemoryCompressed(TestSetup setup) : base (setup, "blobtestssharedmc") - { - - } - protected override string OnGetConnectionStringInfo() - { - return String.Format("protocol=memory; shared memory name={0};compress=true;ssl mode=none;", ts.sharedMemoryName); - } - } - #endregion -} \ No newline at end of file diff --git a/Tests/MySql.Data.Tests/Framework/Net451/BlobTestsSocketCompressed.cs b/Tests/MySql.Data.Tests/Framework/Net451/BlobTestsSocketCompressed.cs deleted file mode 100644 index 1834a2956..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/BlobTestsSocketCompressed.cs +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Security.Authentication; - -namespace MySql.Data.MySqlClient.Tests -{ - #region Configs - [Category("Compressed")] - public class BlobTestsSocketCompressed : BlobTests - { - public BlobTestsSocketCompressed(TestSetup setup) : base(setup, "blobtestsocketcomp") - { - } - protected override string OnGetConnectionStringInfo() - { - return String.Format("port={0};compress=true", ts.port); - } - } - #endregion -} diff --git a/Tests/MySql.Data.Tests/Framework/Net451/MediumTrust/MediumTrustFixtureAttribute.cs b/Tests/MySql.Data.Tests/Framework/Net451/MediumTrust/MediumTrustFixtureAttribute.cs deleted file mode 100644 index 3b0f4dee0..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/MediumTrust/MediumTrustFixtureAttribute.cs +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; - -namespace MySql.Data.MySqlClient.Tests.Xunit -{ - class MediumTrustFixtureAttribute : RunWithAttribute - { - public MediumTrustFixtureAttribute() - : base(typeof(MediumTrustTestClassCommand)) - { } - } -} diff --git a/Tests/MySql.Data.Tests/Framework/Net451/MediumTrust/MediumTrustTestClassCommand.cs b/Tests/MySql.Data.Tests/Framework/Net451/MediumTrust/MediumTrustTestClassCommand.cs deleted file mode 100644 index f9df12c8e..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/MediumTrust/MediumTrustTestClassCommand.cs +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient.Tests.Xunit.MediumTrust; -using Xunit.Sdk; - -namespace MySql.Data.MySqlClient.Tests.Xunit -{ - class MediumTrustTestClassCommand : ITestClassCommand - { - - readonly TestClassCommand _cmd = new TestClassCommand(); - Random randomizer = new Random(); - - #region ITestClassCommand Members - public object ObjectUnderTest - { - get { return _cmd.ObjectUnderTest; } - } - - public ITypeInfo TypeUnderTest - { - get { return _cmd.TypeUnderTest; } - set { _cmd.TypeUnderTest = value; } - } - - public int ChooseNextTest(ICollection testsLeftToRun) - { - return randomizer.Next(testsLeftToRun.Count); - } - - public Exception ClassFinish() - { - return _cmd.ClassFinish(); - } - - public Exception ClassStart() - { - return _cmd.ClassStart(); - } - - public IEnumerable EnumerateTestCommands(IMethodInfo testMethod) - { - foreach (var testCommand in _cmd.EnumerateTestCommands(testMethod)) - { - if (testCommand is MediumTrustTestCommand) - { - yield return testCommand; - continue; - } - - yield return new MediumTrustTestCommand(testCommand, null); - } - } - - public bool IsTestMethod(IMethodInfo testMethod) - { - return _cmd.IsTestMethod(testMethod); - } - - public IEnumerable EnumerateTestMethods() - { - return _cmd.EnumerateTestMethods(); - } - #endregion - } -} diff --git a/Tests/MySql.Data.Tests/Framework/Net451/MediumTrust/MediumTrustTestCommand.cs b/Tests/MySql.Data.Tests/Framework/Net451/MediumTrust/MediumTrustTestCommand.cs deleted file mode 100644 index 32d632183..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/MediumTrust/MediumTrustTestCommand.cs +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Reflection; -using System.Text; -using Xunit; -using Xunit.Sdk; - -namespace MySql.Data.MySqlClient.Tests.Xunit.MediumTrust -{ - public class MediumTrustTestCommand: ITestCommand - { - private readonly ITestCommand _command; - private readonly IDictionary _fixtures; - - - public MediumTrustTestCommand(ITestCommand command,IDictionary fixtures) - { - this._command = command; - this._fixtures = fixtures; - } - - public string DisplayName - { - get { return _command.DisplayName; } - } - - public bool ShouldCreateInstance - { - get { return _command.ShouldCreateInstance; } - } - - public System.Xml.XmlNode ToStartXml() - { - return _command.ToStartXml(); - } - - public int Timeout - { - get { return _command.Timeout; } - } - - public MethodResult Execute(object testClass) - { - try - { - if (testClass == null) return null; - - var testClassType = testClass.GetType(); - - if (!typeof(MarshalByRefObject).IsAssignableFrom(testClassType)) - { - throw new InvalidOperationException( - string.Format("Test class attribute '{0}' must derive from MarshalByRefObject.", - testClassType.FullName)); - } - - object sandboxedClass = null; - - var mediumTrustSandbox = new MediumTrustDomain(); - var partialTrustDomain = mediumTrustSandbox.CreatePartialTrustAppDomain(); - - sandboxedClass = partialTrustDomain.CreateInstanceAndUnwrap(testClassType.Assembly.FullName, testClassType.FullName); - - if (_fixtures != null) - { - foreach (var fixture in _fixtures) - { - fixture.Key.Invoke(sandboxedClass, new object[] { fixture.Value }); - } - } - - var result = _command.Execute(sandboxedClass); - mediumTrustSandbox.Dispose(); - return result; - } - catch (Exception ex) - { - if (ex.Message.Equals("Assembly is still loading")) - { - //This case is when our assembly was not found. - } - } - - return null; - } - - } -} diff --git a/Tests/MySql.Data.Tests/Framework/Net451/MediumTrust/MySql.MediumTrustsTests.cs b/Tests/MySql.Data.Tests/Framework/Net451/MediumTrust/MySql.MediumTrustsTests.cs deleted file mode 100644 index c8f2ce551..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/MediumTrust/MySql.MediumTrustsTests.cs +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright © 2013, 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using Xunit.Sdk; -using System.IO; -using System.Security; -using System.Security.Permissions; -using System.Data; -using System.Diagnostics; -using MySql.Data.MySqlClient.Tests; - -namespace MySql.Data.MySqlClient.Tests.Xunit -{ - - [RunWith(typeof(MediumTrustTestClassCommand))] - [MediumTrustFixture] - public class MySqlMediumTrustTests : MarshalByRefObject - { - - //[Fact] - //public void TestConnectionStrings() - //{ - // MySqlConnection c = new MySqlConnection(); - // c.ConnectionString = "server=localhost;userid=root;database=mysql;port=3305;includesecurityasserts=true;"; - // c.Open(); - // c.Close(); - //} - } -} diff --git a/Tests/MySql.Data.Tests/Framework/Net451/MediumTrust/MySqlClientPermissionTests.cs b/Tests/MySql.Data.Tests/Framework/Net451/MediumTrust/MySqlClientPermissionTests.cs deleted file mode 100644 index 8ed6c48a6..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/MediumTrust/MySqlClientPermissionTests.cs +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright © 2004, 2011, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; -using System.Security; -using System.Security.Permissions; -using System.Data; - -namespace MySql.Data.MySqlClient.Tests -{ - public class MySqlClientPermissionTests : SetUpClass - { - - //[Test] - //[ExpectedException(typeof(System.Security.SecurityException))] - //public void CanChangeConnectionSettingsOnClientPermission() - //{ - // MySqlConnection dummyconn = new MySqlConnection(); - // PermissionSet permissionsSet = new PermissionSet(PermissionState.None); - // MySqlClientPermission permission = new MySqlClientPermission(PermissionState.None); - - // // Allow only server localhost, any database, only with root user - // permission.Add("server=localhost;", "database=; user id=root;", KeyRestrictionBehavior.PreventUsage); - // permissionsSet.AddPermission(permission); - // permissionsSet.PermitOnly(); - // dummyconn.ConnectionString = "server=localhost; user id=test;includesecurityasserts=true;"; - // dummyconn.Open(); - // if (dummyconn.State == ConnectionState.Open) dummyconn.Close(); - //} - - //[Test] - //public void CanAllowConnectionAfterPermitOnlyPermission() - //{ - // PermissionSet permissionset = new PermissionSet(PermissionState.None); - - // MySqlClientPermission permission = new MySqlClientPermission(PermissionState.None); - - // MySqlConnectionStringBuilder strConn = new MySqlConnectionStringBuilder(conn.ConnectionString); - - // //// Allow connections only to specified database no additional optional parameters - // permission.Add("server=localhost;User Id=root;database=" + strConn.Database + ";port=" + strConn.Port + ";", "", KeyRestrictionBehavior.PreventUsage); - // permission.PermitOnly(); - // permissionset.AddPermission(permission); - // permissionset.Demand(); - - // // this conection should be allowed - // MySqlConnection dummyconn = new MySqlConnection(); - // dummyconn.ConnectionString = "server=localhost;User Id=root;database=" + strConn.Database + ";port=" + strConn.Port + ";includesecurityasserts=true;"; - // dummyconn.Open(); - // if (dummyconn.State == ConnectionState.Open) dummyconn.Close(); - - //} - - //[Test] - //[ExpectedException(typeof(System.Security.SecurityException))] - //public void CanDenyConnectionAfterPermitOnlyPermission() - //{ - // PermissionSet permissionset = new PermissionSet(PermissionState.None); - - // MySqlClientPermission permission = new MySqlClientPermission(PermissionState.None); - - // MySqlConnectionStringBuilder strConn = new MySqlConnectionStringBuilder(conn.ConnectionString); - - // //// Allow connections only to specified database no additional optional parameters - // permission.Add("server=localhost;User Id=root; database=" + strConn.Database + ";", "", KeyRestrictionBehavior.PreventUsage); - // permission.PermitOnly(); - // permissionset.AddPermission(permission); - // permissionset.Demand(); - - // // this connection should NOT be allowed - // MySqlConnection dummyconn = new MySqlConnection(); - // dummyconn.ConnectionString = "server=localhost;User Id=root;database=test;includesecurityasserts=true;"; - // dummyconn.Open(); - // if (dummyconn.State == ConnectionState.Open) dummyconn.Close(); - - //} - - } -} diff --git a/Tests/MySql.Data.Tests/Framework/Net451/MySqlCommandTestsPipe.cs b/Tests/MySql.Data.Tests/Framework/Net451/MySqlCommandTestsPipe.cs deleted file mode 100644 index 46c7a0237..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/MySqlCommandTestsPipe.cs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright © 2013, 2015 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Security.Authentication; - -namespace MySql.Data.MySqlClient.Tests -{ - #region Configs - public class MySqlCommandTestsPipe : MySqlCommandTests - { - - public MySqlCommandTestsPipe(TestSetup setup): base (setup, "mysqlcmdtestspipe") - { - ts = setup; - } - - protected override string OnGetConnectionStringInfo() - { - return String.Format("protocol=namedpipe;pipe name={0};ssl mode=none;", ts.pipeName); - } - } - #endregion -} \ No newline at end of file diff --git a/Tests/MySql.Data.Tests/Framework/Net451/MySqlCommandTestsPipeCompressed.cs b/Tests/MySql.Data.Tests/Framework/Net451/MySqlCommandTestsPipeCompressed.cs deleted file mode 100644 index 4e1985da7..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/MySqlCommandTestsPipeCompressed.cs +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Security.Authentication; - -namespace MySql.Data.MySqlClient.Tests -{ - #region Configs - public class MySqlCommandTestsPipeCompressed : MySqlCommandTests - { - public MySqlCommandTestsPipeCompressed(TestSetup setup) : base(setup, "mysqlcmdtspipec") - { - - } - protected override string OnGetConnectionStringInfo() - { - return String.Format("protocol=namedpipe;pipe name={0};compress=true;ssl mode=none;", ts.pipeName); - } - } - #endregion -} \ No newline at end of file diff --git a/Tests/MySql.Data.Tests/Framework/Net451/MySqlCommandTestsSharedMemory.cs b/Tests/MySql.Data.Tests/Framework/Net451/MySqlCommandTestsSharedMemory.cs deleted file mode 100644 index 309f8a25c..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/MySqlCommandTestsSharedMemory.cs +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Security.Authentication; - -namespace MySql.Data.MySqlClient.Tests -{ - #region Configs - public class MySqlCommandTestsSharedMemory : MySqlCommandTests - { - public MySqlCommandTestsSharedMemory(TestSetup setup) : base(setup, "mysqlcmdtssharedmem") - { - } - protected override string OnGetConnectionStringInfo() - { - return String.Format("protocol=memory; shared memory name={0};ssl mode=none;", ts.sharedMemoryName); - } - - } - #endregion -} \ No newline at end of file diff --git a/Tests/MySql.Data.Tests/Framework/Net451/MySqlCommandTestsSharedMemoryCompressed.cs b/Tests/MySql.Data.Tests/Framework/Net451/MySqlCommandTestsSharedMemoryCompressed.cs deleted file mode 100644 index 23b445298..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/MySqlCommandTestsSharedMemoryCompressed.cs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Security.Authentication; - -namespace MySql.Data.MySqlClient.Tests -{ - #region Configs - public class MySqlCommandTestsSharedMemoryCompressed : MySqlCommandTests - { - - public MySqlCommandTestsSharedMemoryCompressed(TestSetup setup) : base(setup, "mysqlcmdsredmemcomp") - { - - } - - protected override string OnGetConnectionStringInfo() - { - return String.Format("protocol=sharedmemory; shared memory name={0};compress=true;ssl mode=none;", ts.sharedMemoryName); - } - } - #endregion -} \ No newline at end of file diff --git a/Tests/MySql.Data.Tests/Framework/Net451/MySqlCommandTestsSocketCompressed.cs b/Tests/MySql.Data.Tests/Framework/Net451/MySqlCommandTestsSocketCompressed.cs deleted file mode 100644 index a087c4410..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/MySqlCommandTestsSocketCompressed.cs +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Security.Authentication; - -namespace MySql.Data.MySqlClient.Tests -{ - #region Configs - public class MySqlCommandTestsSocketCompressed : MySqlCommandTests - { - public MySqlCommandTestsSocketCompressed(TestSetup setup) : base(setup, "mysqlcmdtssocketcomp") - { - - } - - protected override string OnGetConnectionStringInfo() - { - return ";compress=true"; - } - - - [Fact] - public override void InsertingPreparedNulls() - { - base.InsertingPreparedNulls(); - } - } - #endregion -} \ No newline at end of file diff --git a/Tests/MySql.Data.Tests/Framework/Net451/PartialTrustSandbox.cs b/Tests/MySql.Data.Tests/Framework/Net451/PartialTrustSandbox.cs deleted file mode 100644 index aceee3b7d..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/PartialTrustSandbox.cs +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using System.Security; -using System.Security.Permissions; -using System.Net; -using MySql.Data.MySqlClient; - -namespace MySql.Data.MySqlClient.Tests -{ - public class PartialTrustSandbox : MarshalByRefObject - { - public static AppDomain CreatePartialTrustDomain() - { - AppDomainSetup setup = new AppDomainSetup() { ApplicationBase = AppDomain.CurrentDomain.BaseDirectory, PrivateBinPath = AppDomain.CurrentDomain.RelativeSearchPath }; - PermissionSet permissions = new PermissionSet(PermissionState.Unrestricted); - return AppDomain.CreateDomain("Partial Trust Sandbox", AppDomain.CurrentDomain.Evidence, setup, permissions); - } - - - public MySqlConnection TryOpenConnection(string connectionString) - { - MySqlConnection connection = new MySqlConnection(connectionString); - connection.Open(); - return connection; - } - } - - public class FullTrustSandbox : MarshalByRefObject - { - public static AppDomain CreateFullTrustDomain() - { - AppDomainSetup setup = new AppDomainSetup() { ApplicationBase = AppDomain.CurrentDomain.BaseDirectory, PrivateBinPath = AppDomain.CurrentDomain.RelativeSearchPath }; - return AppDomain.CreateDomain("Partial Trust Sandbox", AppDomain.CurrentDomain.Evidence, setup); - } - - public MySqlConnection TryOpenConnection(string connectionString) - { - MySqlConnection connection = new MySqlConnection(connectionString); - connection.Open(); - return connection; - } - } -} diff --git a/Tests/MySql.Data.Tests/Framework/Net451/PerfMonTests.cs b/Tests/MySql.Data.Tests/Framework/Net451/PerfMonTests.cs deleted file mode 100644 index 6e7a33def..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/PerfMonTests.cs +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Diagnostics; -using System.Data; - -#if !MONO -namespace MySql.Data.MySqlClient.Tests -{ - public class PerfMonTests : IUseFixture, IDisposable - { - - protected SetUpClass st; - private string _connString = string.Empty; - - public string conn - { - get - { - _connString = st.conn.ConnectionString; - _connString += st.csAdditions; - return _connString; - } - } - - public void SetFixture(SetUpClass data) - { - st = data; - st.csAdditions = ";use performance monitor=true;"; - st.execSQL("CREATE TABLE Test (id INT, name VARCHAR(100))"); - } - - public void Dispose() - { - st.execSQL("DROP TABLE IF EXISTS TEST"); - } - /// - /// This test doesn't work from the CI setup currently - /// - [Fact] - public void ProcedureFromCache() - { - //TODO: Check this test - return; - - if (st.Version < new Version(5, 0)) return; - - st.execSQL("DROP PROCEDURE IF EXISTS spTest"); - st.execSQL("CREATE PROCEDURE spTest(id int) BEGIN END"); - - PerformanceCounter hardQuery = new PerformanceCounter( - ".NET Data Provider for MySQL", "HardProcedureQueries", true); - PerformanceCounter softQuery = new PerformanceCounter( - ".NET Data Provider for MySQL", "SoftProcedureQueries", true); - long hardCount = hardQuery.RawValue; - long softCount = softQuery.RawValue; - - MySqlCommand cmd = new MySqlCommand("spTest", st.conn); - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.AddWithValue("?id", 1); - cmd.ExecuteScalar(); - - Assert.Equal(hardCount + 1, hardQuery.RawValue); - Assert.Equal(softCount, softQuery.RawValue); - hardCount = hardQuery.RawValue; - - MySqlCommand cmd2 = new MySqlCommand("spTest", st.conn); - cmd2.CommandType = CommandType.StoredProcedure; - cmd2.Parameters.AddWithValue("?id", 1); - cmd2.ExecuteScalar(); - - Assert.Equal(hardCount, hardQuery.RawValue); - Assert.Equal(softCount + 1, softQuery.RawValue); - } - } -} -#endif \ No newline at end of file diff --git a/Tests/MySql.Data.Tests/Framework/Net451/PreparedStatementsPipe.cs b/Tests/MySql.Data.Tests/Framework/Net451/PreparedStatementsPipe.cs deleted file mode 100644 index 97fd779ca..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/PreparedStatementsPipe.cs +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Security.Authentication; - -namespace MySql.Data.MySqlClient.Tests -{ - public class PreparedStatementsPipe : PreparedStatements - { - - public PreparedStatementsPipe(TestSetup setup) : base (setup, "preparedstatementspipe") - { - ts = setup; - } - - protected override string OnGetConnectionStringInfo() - { - return string.Format(";ignore prepare=false;protocol=pipe;pipe name={0};ssl mode=none;", ts.pipeName); - } - } -} diff --git a/Tests/MySql.Data.Tests/Framework/Net451/PreparedStatementsPipeCompressed.cs b/Tests/MySql.Data.Tests/Framework/Net451/PreparedStatementsPipeCompressed.cs deleted file mode 100644 index 06cf4da4c..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/PreparedStatementsPipeCompressed.cs +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Security.Authentication; - -namespace MySql.Data.MySqlClient.Tests -{ - public class PreparedStatementsPipeCompressed : PreparedStatements - { - - public PreparedStatementsPipeCompressed(TestSetup setup) : base (setup, "preparedstmspipec") - { - ts = setup; - } - - protected override string OnGetConnectionStringInfo() - { - return string.Format(";ignore prepare=false;protocol=pipe;pipe name={0};compress=true;ssl mode=none;", ts.pipeName); - } - } -} diff --git a/Tests/MySql.Data.Tests/Framework/Net451/PreparedStatementsSharedMemory.cs b/Tests/MySql.Data.Tests/Framework/Net451/PreparedStatementsSharedMemory.cs deleted file mode 100644 index 23ca44be2..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/PreparedStatementsSharedMemory.cs +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Security.Authentication; - -namespace MySql.Data.MySqlClient.Tests -{ - public class PreparedStatementsSharedMemory : PreparedStatements - { - - public PreparedStatementsSharedMemory(TestSetup setup) : base (setup, "preparedstmssharedm") - { - ts = setup; - } - - - protected override string OnGetConnectionStringInfo() - { - return string.Format(";ignore prepare=false;protocol=memory; shared memory name={0};ssl mode=none;", ts.sharedMemoryName); - } - } -} diff --git a/Tests/MySql.Data.Tests/Framework/Net451/PreparedStatementsSharedMemoryCompressed.cs b/Tests/MySql.Data.Tests/Framework/Net451/PreparedStatementsSharedMemoryCompressed.cs deleted file mode 100644 index a5fbb6b22..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/PreparedStatementsSharedMemoryCompressed.cs +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Security.Authentication; - -namespace MySql.Data.MySqlClient.Tests -{ - public class PreparedStatementsSharedMemoryCompressed : PreparedStatements - { - - public PreparedStatementsSharedMemoryCompressed(TestSetup setup) : base (setup, "prepstmsmemc") - { - ts = setup; - } - - protected override string OnGetConnectionStringInfo() - { - return string.Format(";ignore prepare=false;protocol=memory; shared memory name={0};compress=true;ssl mode=none;", ts.sharedMemoryName); - } - } -} diff --git a/Tests/MySql.Data.Tests/Framework/Net451/PreparedStatementsSocketCompressed.cs b/Tests/MySql.Data.Tests/Framework/Net451/PreparedStatementsSocketCompressed.cs deleted file mode 100644 index 1020f82f7..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/PreparedStatementsSocketCompressed.cs +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Security.Authentication; - -namespace MySql.Data.MySqlClient.Tests -{ - public class PreparedStatementsSocketCompressed : PreparedStatements - { - - public PreparedStatementsSocketCompressed(TestSetup setup) : base (setup, "prepstmssckcom") - { - ts = setup; - } - - protected override string OnGetConnectionStringInfo() - { - return ";ignore prepare=false;compress=true;"; - } - } -} diff --git a/Tests/MySql.Data.Tests/Framework/Net451/ReplicationTests.cs b/Tests/MySql.Data.Tests/Framework/Net451/ReplicationTests.cs deleted file mode 100644 index 2d164f748..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/ReplicationTests.cs +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; - -namespace MySql.Data.MySqlClient.Tests -{ - public class ReplicationTests: IUseFixture, IDisposable - { - private SetUpClass st; - - public void SetFixture(SetUpClass data) - { - st = data; - } - - public void Dispose() - { - //Nothing to clean - } - - - [Fact] - public void Simple() - { - using (MySqlConnection connection = new MySqlConnection(st.GetConnectionString(true) + ";replication=yes")) - { - MySqlCommand cmd = new MySqlCommand("SET @v=1", connection); - try - { - connection.Open(); - cmd.ExecuteNonQuery(); - } - catch (MySqlException ex) - { - Assert.True(ex.Message.Contains("Replicated")); - } - } - } - } -} diff --git a/Tests/MySql.Data.Tests/Framework/Net451/TimeoutAndCancelPipe.cs b/Tests/MySql.Data.Tests/Framework/Net451/TimeoutAndCancelPipe.cs deleted file mode 100644 index c83ea928b..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/TimeoutAndCancelPipe.cs +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Security.Authentication; - -namespace MySql.Data.MySqlClient.Tests -{ - public class TimeoutAndCancelPipe : TimeoutAndCancel - { - private string pipeName = ""; - public TimeoutAndCancelPipe(TestSetup setup) : base (setup, "timeoutandcpipe") - { - pipeName = setup.pipeName; - } - - - protected override string OnGetConnectionStringInfo() - { - return string.Format("protocol=namedpipe;pipe name={0};ssl mode=none;", pipeName); - } - } -} diff --git a/Tests/MySql.Data.Tests/Framework/Net451/TimeoutAndCancelSharedMemory.cs b/Tests/MySql.Data.Tests/Framework/Net451/TimeoutAndCancelSharedMemory.cs deleted file mode 100644 index 423af1602..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/TimeoutAndCancelSharedMemory.cs +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Security.Authentication; - -namespace MySql.Data.MySqlClient.Tests -{ - public class TimeoutAndCancelSharedMemory : TimeoutAndCancel - { - private string sharedMemory = ""; - - public TimeoutAndCancelSharedMemory(TestSetup setup) : base (setup, "timeoutandsmem") - { - sharedMemory = setup.sharedMemoryName; - } - - protected override string OnGetConnectionStringInfo() - { - return string.Format("protocol=sharedmemory; shared memory name={0};ssl mode=none;", sharedMemory); - } - } -} diff --git a/Tests/MySql.Data.Tests/Framework/Net451/TimeoutAndCancelSocketCompressed.cs b/Tests/MySql.Data.Tests/Framework/Net451/TimeoutAndCancelSocketCompressed.cs deleted file mode 100644 index 814532c64..000000000 --- a/Tests/MySql.Data.Tests/Framework/Net451/TimeoutAndCancelSocketCompressed.cs +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Security.Authentication; - -namespace MySql.Data.MySqlClient.Tests -{ - public class TimeoutAndCancelSocketCompressed : TimeoutAndCancel - { - public TimeoutAndCancelSocketCompressed(TestSetup setup) : base(setup, "timeoutandcscom") - { - - } - - protected override string OnGetConnectionStringInfo() - { - return ";compress=true;"; - } - } -} diff --git a/Tests/MySql.Data.Tests/Framework/NetCore10/DataColumn.cs b/Tests/MySql.Data.Tests/Framework/NetCore10/DataColumn.cs deleted file mode 100644 index 6891d0c89..000000000 --- a/Tests/MySql.Data.Tests/Framework/NetCore10/DataColumn.cs +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; - -namespace MySql.Data.MySqlClient.Tests -{ - public class DataColumn - { - public DataColumn(string name, Type type) - { - Name = name; - Type = type; - } - - public string Name { get; set; } - public Type Type { get; set; } - } -} diff --git a/Tests/MySql.Data.Tests/Framework/NetCore10/DataRow.cs b/Tests/MySql.Data.Tests/Framework/NetCore10/DataRow.cs deleted file mode 100644 index 9e05da9db..000000000 --- a/Tests/MySql.Data.Tests/Framework/NetCore10/DataRow.cs +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System.Collections.Generic; - -namespace MySql.Data.MySqlClient.Tests -{ - public class DataRow : List - { - public TestDataTable OwningTable; - - public object this[string name] - { - get - { - int index = OwningTable.GetColumnIndex(name); - return this[index]; - } - set - { - int index = OwningTable.GetColumnIndex(name); - this[index] = value; - } - } - } -} diff --git a/Tests/MySql.Data.Tests/Framework/NetCore10/DataTable.cs b/Tests/MySql.Data.Tests/Framework/NetCore10/DataTable.cs deleted file mode 100644 index 4782ac7ab..000000000 --- a/Tests/MySql.Data.Tests/Framework/NetCore10/DataTable.cs +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Data; -using System.Collections.Generic; -using System; - -namespace MySql.Data.MySqlClient.Tests -{ - public class TestDataTable - { - public List Columns = new List(); - public List Rows = new List(); - - public TestDataTable() - { - - } - - public int GetColumnIndex(string name) - { - for (int x = 0; x < Columns.Count; x++) - if (Columns[x].Name == name) return x; - throw new ArgumentOutOfRangeException("Column name not found " + name); - } - - public DataRow NewRow() - { - DataRow row = new DataRow(); - row.OwningTable = this; - return row; - } - - public void Load(MySqlDataReader reader) - { - // add the columns - for (int x = 0; x < reader.FieldCount; x++) - Columns.Add(new DataColumn(reader.GetName(x), reader.GetFieldType(x))); - - // now add the rows - while (reader.Read()) - { - DataRow row = NewRow(); - - object[] rowValues = new object[reader.FieldCount]; - for (int index = 0; index < reader.FieldCount; index++) - row.Add(reader[index]); - Rows.Add(row); - } - } - } -} diff --git a/Tests/MySql.Data.Tests/Framework/NetCore10/MySqlDataAdapter.cs b/Tests/MySql.Data.Tests/Framework/NetCore10/MySqlDataAdapter.cs deleted file mode 100644 index b40730d03..000000000 --- a/Tests/MySql.Data.Tests/Framework/NetCore10/MySqlDataAdapter.cs +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -namespace MySql.Data.MySqlClient.Tests -{ - public class MySqlDataAdapter - { - string SQL; - MySqlConnection connection; - - public MySqlDataAdapter(string sql, MySqlConnection conn) - { - SQL = sql; - connection = conn; - } - - public void Fill(TestDataTable dt) - { - var cmd = connection.CreateCommand(); - cmd.CommandText = SQL; - using (var reader = cmd.ExecuteReader()) - dt.Load(reader); - - } - } -} diff --git a/Tests/MySql.Data.Tests/GenericListener.cs b/Tests/MySql.Data.Tests/GenericListener.cs deleted file mode 100644 index c7bd7907f..000000000 --- a/Tests/MySql.Data.Tests/GenericListener.cs +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using System.Diagnostics; -using System.Collections.Specialized; - -namespace MySql.Data.MySqlClient.Tests -{ -#if !NETCORE10 - public class GenericListener : TraceListener -#else - public class GenericListener -#endif - { - List strings; - StringBuilder partial; - - public GenericListener() - { - strings = new List(); - partial = new StringBuilder(); - } - - public List Strings - { - get { return strings; } - } - - public int Find(string sToFind) - { - int count = 0; - foreach (string s in strings) - if (s.IndexOf(sToFind) != -1) - count++; - return count; - } - - public void Clear() - { - partial.Remove(0, partial.Length); - strings.Clear(); - } - -#if !NETCORE10 - public override void Write(string message) -#else - public void Write(string message) -#endif - { - partial.Append(message); - } - -#if !NETCORE10 - public override void WriteLine(string message) -#else - public void WriteLine(string message) -#endif - { - Write(message); - strings.Add(partial.ToString()); - partial.Remove(0, partial.Length); - } - - public int CountLinesContaining(string text) - { - int count = 0; - foreach (string s in strings) - if (s.Contains(text)) count++; - return count; - } - } -} diff --git a/Tests/MySql.Data.Tests/GetSchemaTests.cs b/Tests/MySql.Data.Tests/GetSchemaTests.cs deleted file mode 100644 index 83278024b..000000000 --- a/Tests/MySql.Data.Tests/GetSchemaTests.cs +++ /dev/null @@ -1,626 +0,0 @@ -// Copyright © 2013, 2015 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Data; - -namespace MySql.Data.MySqlClient.Tests -{ - public class GetSchemaTests : TestBase - { - protected TestSetup ts; - - public GetSchemaTests(TestSetup setup) : base(setup, "getschematests") - { - ts = setup; - ts.CreateDatabase("1"); - } - - [Fact] - public void Collections() - { - DataTable dt = connection.GetSchema(); - - int row = 0; - Assert.Equal("MetaDataCollections", dt.Rows[row++][0]); - Assert.Equal("DataSourceInformation", dt.Rows[row++][0]); - Assert.Equal("DataTypes", dt.Rows[row++][0]); - Assert.Equal("Restrictions", dt.Rows[row++][0]); - Assert.Equal("ReservedWords", dt.Rows[row++][0]); - Assert.Equal("Databases", dt.Rows[row++][0]); - Assert.Equal("Tables", dt.Rows[row++][0]); - Assert.Equal("Columns", dt.Rows[row++][0]); - Assert.Equal("Users", dt.Rows[row++][0]); - Assert.Equal("Foreign Keys", dt.Rows[row++][0]); - Assert.Equal("IndexColumns", dt.Rows[row++][0]); - Assert.Equal("Indexes", dt.Rows[row++][0]); - Assert.Equal("Foreign Key Columns", dt.Rows[row++][0]); - Assert.Equal("UDF", dt.Rows[row++][0]); - Assert.Equal("Views", dt.Rows[row++][0]); - Assert.Equal("ViewColumns", dt.Rows[row++][0]); - Assert.Equal("Procedure Parameters", dt.Rows[row++][0]); - Assert.Equal("Procedures", dt.Rows[row++][0]); - Assert.Equal("Triggers", dt.Rows[row++][0]); - } - - /// - /// Bug #25907 DataType Column of DataTypes collection does'nt contain the correct CLR Datatype - /// Bug #25947 CreateFormat/CreateParameters Column of DataTypes collection incorrect for CHAR - /// - [Fact] - public void DataTypes() - { - DataTable dt = connection.GetSchema("DataTypes", new string[] { }); - - foreach (DataRow row in dt.Rows) - { - string type = row["TYPENAME"].ToString(); - Type systemType = Type.GetType(row["DATATYPE"].ToString()); - if (type == "BIT") - Assert.Equal(typeof(System.UInt64), systemType); - else if (type == "DATE" || type == "DATETIME" || - type == "TIMESTAMP") - Assert.Equal(typeof(System.DateTime), systemType); - else if (type == "BLOB" || type == "TINYBLOB" || - type == "MEDIUMBLOB" || type == "LONGBLOB") - Assert.Equal(typeof(System.Byte[]), systemType); - else if (type == "TIME") - Assert.Equal(typeof(System.TimeSpan), systemType); - else if (type == "CHAR" || type == "VARCHAR") - { - Assert.Equal(typeof(System.String), systemType); - Assert.False(Convert.ToBoolean(row["IsFixedLength"])); - string format = type + "({0})"; - Assert.Equal(format, row["CreateFormat"].ToString()); - } - else if (type == "SET" || type == "ENUM") - Assert.Equal(typeof(System.String), systemType); - else if (type == "DOUBLE") - Assert.Equal(typeof(System.Double), systemType); - else if (type == "SINGLE") - Assert.Equal(typeof(System.Single), systemType); - else if (type == "TINYINT") - { - if (row["CREATEFORMAT"].ToString().EndsWith("UNSIGNED", StringComparison.OrdinalIgnoreCase)) - Assert.Equal(typeof(System.Byte), systemType); - else - Assert.Equal(typeof(System.SByte), systemType); - } - else if (type == "SMALLINT") - { - if (row["CREATEFORMAT"].ToString().EndsWith("UNSIGNED", StringComparison.OrdinalIgnoreCase)) - Assert.Equal(typeof(System.UInt16), systemType); - else - Assert.Equal(typeof(System.Int16), systemType); - } - else if (type == "MEDIUMINT" || type == "INT") - { - if (row["CREATEFORMAT"].ToString().EndsWith("UNSIGNED", StringComparison.OrdinalIgnoreCase)) - Assert.Equal(typeof(System.UInt32), systemType); - else - Assert.Equal(typeof(System.Int32), systemType); - } - else if (type == "BIGINT") - { - if (row["CREATEFORMAT"].ToString().EndsWith("UNSIGNED", StringComparison.OrdinalIgnoreCase)) - Assert.Equal(typeof(System.UInt64), systemType); - else - Assert.Equal(typeof(System.Int64), systemType); - } - else if (type == "DECIMAL") - { - Assert.Equal(typeof(System.Decimal), systemType); - Assert.Equal("DECIMAL({0},{1})", row["CreateFormat"].ToString()); - } - else if (type == "TINYINT") - Assert.Equal(typeof(System.Byte), systemType); - } - } - - [Fact] - public void Databases() - { - DataTable dt = connection.GetSchema("Databases"); - Assert.Equal("Databases", dt.TableName); - - bool foundZero = false; - bool foundOne = false; - foreach (DataRow row in dt.Rows) - { - string dbName = row[1].ToString().ToLower(); - if (dbName == (ts.baseDBName + "0").ToLower()) - foundZero = true; - else if (dbName == (ts.baseDBName + "1").ToLower()) - foundOne = true; - } - Assert.True(foundZero); - Assert.True(foundOne); - - dt = connection.GetSchema("Databases", new string[1] { (ts.baseDBName + "0").ToLower() }); - Assert.Equal(1, dt.Rows.Count); - Assert.Equal((ts.baseDBName + "0").ToLower(), dt.Rows[0][1].ToString().ToLower()); - } - - [Fact] - public void Tables() - { - executeSQL("DROP TABLE IF EXISTS test1"); - executeSQL("CREATE TABLE test1 (id int)"); - - string[] restrictions = new string[4]; - restrictions[1] = ts.baseDBName + "0"; - restrictions[2] = "test1"; - DataTable dt = connection.GetSchema("Tables", restrictions); - if (ts.version.Major >= 5 && ts.version.Minor >= 1) - { - Assert.True(dt.Columns["VERSION"].DataType == typeof(UInt64)); - Assert.True(dt.Columns["TABLE_ROWS"].DataType == typeof(UInt64)); - Assert.True(dt.Columns["AVG_ROW_LENGTH"].DataType == typeof(UInt64)); - Assert.True(dt.Columns["DATA_LENGTH"].DataType == typeof(UInt64)); - Assert.True(dt.Columns["MAX_DATA_LENGTH"].DataType == typeof(UInt64)); - Assert.True(dt.Columns["INDEX_LENGTH"].DataType == typeof(UInt64)); - Assert.True(dt.Columns["DATA_FREE"].DataType == typeof(UInt64)); - Assert.True(dt.Columns["AUTO_INCREMENT"].DataType == typeof(UInt64)); - Assert.True(dt.Columns["CHECKSUM"].DataType == typeof(UInt64)); - } - Assert.True(dt.Rows.Count == 1); - Assert.Equal("Tables", dt.TableName); - Assert.Equal("test1", dt.Rows[0][2]); - } - - [Fact] - public void Columns() - { - executeSQL(@"CREATE TABLE test (col1 int, col2 decimal(20,5), - col3 varchar(50) character set utf8, col4 tinyint unsigned, - col5 varchar(20) default 'boo')"); - - string[] restrictions = new string[4]; - restrictions[1] = ts.baseDBName + "0"; - restrictions[2] = "test"; - DataTable dt = connection.GetSchema("Columns", restrictions); - Assert.Equal(5, dt.Rows.Count); - Assert.Equal("Columns", dt.TableName); - if (ts.version.Major >= 5 && ts.version.Minor >= 1) - { - Assert.True(dt.Columns["ORDINAL_POSITION"].DataType == typeof(UInt64)); - Assert.True(dt.Columns["CHARACTER_MAXIMUM_LENGTH"].DataType == typeof(UInt64)); - Assert.True(dt.Columns["NUMERIC_PRECISION"].DataType == typeof(UInt64)); - Assert.True(dt.Columns["NUMERIC_SCALE"].DataType == typeof(UInt64)); - } - - // first column - Assert.Equal((ts.baseDBName + "0").ToUpper(), dt.Rows[0]["TABLE_SCHEMA"].ToString().ToUpper()); - Assert.Equal("COL1", dt.Rows[0]["COLUMN_NAME"].ToString().ToUpper()); - Assert.Equal(1, Convert.ToInt32(dt.Rows[0]["ORDINAL_POSITION"])); - Assert.Equal("YES", dt.Rows[0]["IS_NULLABLE"]); - Assert.Equal("INT", dt.Rows[0]["DATA_TYPE"].ToString().ToUpper()); - - // second column - Assert.Equal((ts.baseDBName + "0").ToUpper(), dt.Rows[1]["TABLE_SCHEMA"].ToString().ToUpper()); - Assert.Equal("COL2", dt.Rows[1]["COLUMN_NAME"].ToString().ToUpper()); - Assert.Equal(2, Convert.ToInt32(dt.Rows[1]["ORDINAL_POSITION"])); - Assert.Equal("YES", dt.Rows[1]["IS_NULLABLE"]); - Assert.Equal("DECIMAL", dt.Rows[1]["DATA_TYPE"].ToString().ToUpper()); - Assert.Equal("DECIMAL(20,5)", dt.Rows[1]["COLUMN_TYPE"].ToString().ToUpper()); - Assert.Equal(20, Convert.ToInt32(dt.Rows[1]["NUMERIC_PRECISION"])); - Assert.Equal(5, Convert.ToInt32(dt.Rows[1]["NUMERIC_SCALE"])); - - // third column - Assert.Equal((ts.baseDBName + "0").ToUpper(), dt.Rows[2]["TABLE_SCHEMA"].ToString().ToUpper()); - Assert.Equal("COL3", dt.Rows[2]["COLUMN_NAME"].ToString().ToUpper()); - Assert.Equal(3, Convert.ToInt32(dt.Rows[2]["ORDINAL_POSITION"])); - Assert.Equal("YES", dt.Rows[2]["IS_NULLABLE"]); - Assert.Equal("VARCHAR", dt.Rows[2]["DATA_TYPE"].ToString().ToUpper()); - Assert.Equal("VARCHAR(50)", dt.Rows[2]["COLUMN_TYPE"].ToString().ToUpper()); - - // fourth column - Assert.Equal((ts.baseDBName + "0").ToUpper(), dt.Rows[3]["TABLE_SCHEMA"].ToString().ToUpper()); - Assert.Equal("COL4", dt.Rows[3]["COLUMN_NAME"].ToString().ToUpper()); - Assert.Equal(4, Convert.ToInt32(dt.Rows[3]["ORDINAL_POSITION"])); - Assert.Equal("YES", dt.Rows[3]["IS_NULLABLE"]); - Assert.Equal("TINYINT", dt.Rows[3]["DATA_TYPE"].ToString().ToUpper()); - - // fifth column - Assert.Equal((ts.baseDBName + "0").ToUpper(), dt.Rows[4]["TABLE_SCHEMA"].ToString().ToUpper()); - Assert.Equal("COL5", dt.Rows[4]["COLUMN_NAME"].ToString().ToUpper()); - Assert.Equal(5, Convert.ToInt32(dt.Rows[4]["ORDINAL_POSITION"])); - Assert.Equal("YES", dt.Rows[4]["IS_NULLABLE"]); - Assert.Equal("VARCHAR", dt.Rows[4]["DATA_TYPE"].ToString().ToUpper()); - Assert.Equal("VARCHAR(20)", dt.Rows[4]["COLUMN_TYPE"].ToString().ToUpper()); - Assert.Equal("BOO", dt.Rows[4]["COLUMN_DEFAULT"].ToString().ToUpper()); - } - - - /// - ///Testing out schema information about generated columns - /// only in version 5.7.6 or later - /// - [Fact] - public void CanGetSchemaInformationGeneratedColumns() - { - if (ts.version < new Version(5, 7, 6)) return; - - executeSQL("DROP TABLE IF EXISTS test"); - executeSQL("CREATE TABLE `Test` (`ID` int NOT NULL AUTO_INCREMENT PRIMARY KEY, `Name` char(35) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL)"); - - var cmd = new MySqlCommand("ALTER TABLE test ADD COLUMN Name_ci char(35) CHARACTER SET utf8 AS (Name) STORED;", connection); - cmd.ExecuteNonQuery(); - - DataTable dt = connection.GetSchema("Columns", new string[] { null, null, "test", null }); - Assert.Equal(3, dt.Rows.Count); - Assert.Equal("Columns", dt.TableName); - if (ts.version.Major >= 5 && ts.version.Minor >= 7 && ts.version.Build >= 6) - { - Assert.Equal("char", dt.Rows[2]["DATA_TYPE"]); - Assert.Equal("Name", dt.Rows[2]["GENERATION_EXPRESSION"].ToString().Trim('`')); - Assert.Equal("STORED GENERATED", dt.Rows[2]["EXTRA"]); - } - } - - - /// - /// Bug #46270 connection.GetSchema("Columns") fails on MySQL 4.1 - /// - [Fact] - public void EnumAndSetColumns() - { - executeSQL("DROP TABLE IF EXISTS test"); - executeSQL("CREATE TABLE test (col1 set('A','B','C'), col2 enum('A','B','C'))"); - - DataTable dt = connection.GetSchema("Columns", new string[] { null, null, "test", null }); - Assert.Equal(2, dt.Rows.Count); - Assert.Equal("set", dt.Rows[0]["DATA_TYPE"]); - Assert.Equal("enum", dt.Rows[1]["DATA_TYPE"]); - Assert.Equal("set('A','B','C')", dt.Rows[0]["COLUMN_TYPE"]); - Assert.Equal("enum('A','B','C')", dt.Rows[1]["COLUMN_TYPE"]); - } - - [Fact] - public void Procedures() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("DROP PROCEDURE IF EXISTS spTest"); - executeSQL("CREATE PROCEDURE spTest (id int) BEGIN SELECT 1; END"); - - string[] restrictions = new string[4]; - restrictions[1] = ts.baseDBName + "0"; - restrictions[2] = "spTest"; - DataTable dt = connection.GetSchema("Procedures", restrictions); - Assert.True(dt.Rows.Count == 1); - Assert.Equal("Procedures", dt.TableName); - Assert.Equal("spTest", dt.Rows[0][3]); - } - - [Fact] - public void ProceduresWithParameters() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("DROP PROCEDURE IF EXISTS spTest"); - executeSQL("CREATE PROCEDURE spTest (id int) BEGIN SELECT 1; END"); - - string[] restrictions = new string[4]; - restrictions[1] = ts.baseDBName + "0"; - restrictions[2] = "spTest"; - DataTable dt = connection.GetSchema("PROCEDURES WITH PARAMETERS", restrictions); - Assert.True(dt.Rows.Count == 1); - Assert.Equal("Procedures", dt.TableName); - Assert.Equal("spTest", dt.Rows[0][3]); - Assert.Equal("id int", dt.Rows[0][dt.Columns.Count - 1]); - } - - [Fact] - public void Functions() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("DROP FUNCTION IF EXISTS spFunc"); - executeSQL("CREATE FUNCTION spFunc (id int) RETURNS INT BEGIN RETURN 1; END"); - - string[] restrictions = new string[4]; - restrictions[1] = ts.baseDBName + "0"; - restrictions[2] = "spFunc"; - DataTable dt = connection.GetSchema("Procedures", restrictions); - Assert.True(dt.Rows.Count == 1); - Assert.Equal("Procedures", dt.TableName); - Assert.Equal("spFunc", dt.Rows[0][3]); - } - - [Fact] - public void Indexes() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE TABLE test (id int, PRIMARY KEY(id))"); - string[] restrictions = new string[4]; - restrictions[2] = "test"; - restrictions[1] = ts.baseDBName + "0"; - DataTable dt = connection.GetSchema("Indexes", restrictions); - Assert.Equal(1, dt.Rows.Count); - Assert.Equal("test", dt.Rows[0]["TABLE_NAME"]); - Assert.Equal(true, dt.Rows[0]["PRIMARY"]); - Assert.Equal(true, dt.Rows[0]["UNIQUE"]); - - executeSQL("DROP TABLE IF EXISTS test"); - executeSQL("CREATE TABLE test (id int, name varchar(50), " + - "UNIQUE KEY key2 (name))"); - - dt = connection.GetSchema("Indexes", restrictions); - Assert.Equal(1, dt.Rows.Count); - Assert.Equal("test", dt.Rows[0]["TABLE_NAME"]); - Assert.Equal("key2", dt.Rows[0]["INDEX_NAME"]); - Assert.Equal(false, dt.Rows[0]["PRIMARY"]); - Assert.Equal(true, dt.Rows[0]["UNIQUE"]); - - restrictions[3] = "key2"; - dt = connection.GetSchema("Indexes", restrictions); - Assert.Equal(1, dt.Rows.Count); - Assert.Equal("test", dt.Rows[0]["TABLE_NAME"]); - Assert.Equal("key2", dt.Rows[0]["INDEX_NAME"]); - Assert.Equal(false, dt.Rows[0]["PRIMARY"]); - Assert.Equal(true, dt.Rows[0]["UNIQUE"]); - - /// - /// Bug #48101 MySqlConnection.GetSchema on "Indexes" throws when there's a table named "b`a`d" - /// - executeSQL("DROP TABLE IF EXISTS test"); - executeSQL(@"CREATE TABLE `te``s``t` (id int, name varchar(50), " + - "KEY key2 (name))"); - - restrictions[2] = "te`s`t"; - dt = connection.GetSchema("Indexes", restrictions); - Assert.Equal(1, dt.Rows.Count); - Assert.Equal("te`s`t", dt.Rows[0]["TABLE_NAME"]); - Assert.Equal("key2", dt.Rows[0]["INDEX_NAME"]); - Assert.Equal(false, dt.Rows[0]["PRIMARY"]); - Assert.Equal(false, dt.Rows[0]["UNIQUE"]); - } - - [Fact] - public void IndexColumns() - { - executeSQL("CREATE TABLE test (id int, PRIMARY KEY(id))"); - string[] restrictions = new string[5]; - restrictions[2] = "test"; - restrictions[1] = ts.baseDBName + "0"; - DataTable dt = connection.GetSchema("IndexColumns", restrictions); - Assert.Equal(1, dt.Rows.Count); - Assert.Equal("test", dt.Rows[0]["TABLE_NAME"]); - Assert.Equal("id", dt.Rows[0]["COLUMN_NAME"]); - - executeSQL("DROP TABLE IF EXISTS test"); - executeSQL("CREATE TABLE test (id int, id1 int, id2 int, " + - "INDEX key1 (id1, id2))"); - restrictions[2] = "test"; - restrictions[1] = ts.baseDBName + "0"; - restrictions[4] = "id2"; - dt = connection.GetSchema("IndexColumns", restrictions); - Assert.Equal(1, dt.Rows.Count); - Assert.Equal("test", dt.Rows[0]["TABLE_NAME"]); - Assert.Equal("id2", dt.Rows[0]["COLUMN_NAME"]); - Assert.Equal(2, dt.Rows[0]["ORDINAL_POSITION"]); - - restrictions[3] = "key1"; - dt = connection.GetSchema("IndexColumns", restrictions); - Assert.Equal(1, dt.Rows.Count); - Assert.Equal("test", dt.Rows[0]["TABLE_NAME"]); - Assert.Equal("id2", dt.Rows[0]["COLUMN_NAME"]); - Assert.Equal(2, dt.Rows[0]["ORDINAL_POSITION"]); - - restrictions = new string[3]; - restrictions[1] = ts.baseDBName + "0"; - restrictions[2] = "test"; - dt = connection.GetSchema("IndexColumns", restrictions); - Assert.Equal(2, dt.Rows.Count); - Assert.Equal("test", dt.Rows[0]["TABLE_NAME"]); - Assert.Equal("id1", dt.Rows[0]["COLUMN_NAME"]); - Assert.Equal(1, dt.Rows[0]["ORDINAL_POSITION"]); - Assert.Equal("test", dt.Rows[1]["TABLE_NAME"]); - Assert.Equal("id2", dt.Rows[1]["COLUMN_NAME"]); - Assert.Equal(2, dt.Rows[1]["ORDINAL_POSITION"]); - - restrictions = new string[4]; - executeSQL("DROP TABLE IF EXISTS test"); - executeSQL("CREATE TABLE test (id int primary key, id1 int, KEY key1 (id1))"); - restrictions[2] = "test"; - restrictions[1] = ts.baseDBName + "0"; - restrictions[3] = "PRIMARY"; - dt = connection.GetSchema("IndexColumns", restrictions); - } - - [Fact] - public void Views() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("DROP VIEW IF EXISTS vw"); - executeSQL("CREATE VIEW vw AS SELECT Now() as theTime"); - - string[] restrictions = new string[4]; - restrictions[1] = ts.baseDBName + "0"; - restrictions[2] = "vw"; - DataTable dt = connection.GetSchema("Views", restrictions); - Assert.True(dt.Rows.Count == 1); - Assert.Equal("Views", dt.TableName); - Assert.Equal("vw", dt.Rows[0]["TABLE_NAME"]); - } - - [Fact] - public void ViewColumns() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("DROP VIEW IF EXISTS vw"); - executeSQL("CREATE VIEW vw AS SELECT Now() as theTime"); - - string[] restrictions = new string[4]; - restrictions[1] = ts.baseDBName + "0"; - restrictions[2] = "vw"; - DataTable dt = connection.GetSchema("ViewColumns", restrictions); - Assert.True(dt.Rows.Count == 1); - Assert.Equal("ViewColumns", dt.TableName); - Assert.Equal(ts.baseDBName + "0".ToLower(), dt.Rows[0]["VIEW_SCHEMA"].ToString().ToLower()); - Assert.Equal("vw", dt.Rows[0]["VIEW_NAME"]); - Assert.Equal("theTime", dt.Rows[0]["COLUMN_NAME"]); - } - - [Fact] - public void SingleForeignKey() - { - executeSQL("CREATE TABLE parent (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB"); - executeSQL("CREATE TABLE child (id INT, parent_id INT, INDEX par_ind (parent_id), " + - "CONSTRAINT c1 FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE) ENGINE=INNODB"); - string[] restrictions = new string[4]; - restrictions[0] = null; - restrictions[1] = ts.baseDBName + "0"; - restrictions[2] = "child"; - DataTable dt = connection.GetSchema("Foreign Keys", restrictions); - Assert.Equal(1, dt.Rows.Count); - DataRow row = dt.Rows[0]; - Assert.Equal(ts.baseDBName + "0".ToLower(), row["CONSTRAINT_SCHEMA"].ToString().ToLower()); - Assert.Equal("c1", row["CONSTRAINT_NAME"]); - Assert.Equal(ts.baseDBName + "0".ToLower(), row["TABLE_SCHEMA"].ToString().ToLower()); - Assert.Equal("child", row["TABLE_NAME"]); - Assert.Equal(ts.baseDBName + "0".ToLower(), row["REFERENCED_TABLE_SCHEMA"].ToString().ToLower()); - Assert.Equal("parent", row["REFERENCED_TABLE_NAME"]); - } - - /// - /// Bug #26660 MySqlConnection.GetSchema fails with NullReferenceException for Foreign Keys - /// - [Fact] - public void ForeignKeys() - { - executeSQL("DROP TABLE IF EXISTS product_order"); - executeSQL("DROP TABLE IF EXISTS customer"); - executeSQL("DROP TABLE IF EXISTS product"); - - executeSQL("CREATE TABLE product (category INT NOT NULL, id INT NOT NULL, " + - "price DECIMAL, PRIMARY KEY(category, id)) ENGINE=INNODB"); - executeSQL("CREATE TABLE customer (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB"); - executeSQL("CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT, " + - "product_category INT NOT NULL, product_id INT NOT NULL, customer_id INT NOT NULL, " + - "PRIMARY KEY(no), INDEX (product_category, product_id), " + - "FOREIGN KEY (product_category, product_id) REFERENCES product(category, id) " + - "ON UPDATE CASCADE ON DELETE RESTRICT, INDEX (customer_id), " + - "FOREIGN KEY (customer_id) REFERENCES customer(id)) ENGINE=INNODB"); - - DataTable dt = connection.GetSchema("Foreign Keys"); - Assert.True(dt.Columns.Contains("REFERENCED_TABLE_CATALOG")); - } - - [Fact] - public void MultiSingleForeignKey() - { - executeSQL("DROP TABLE IF EXISTS product_order"); - executeSQL("DROP TABLE IF EXISTS customer"); - executeSQL("DROP TABLE IF EXISTS product"); - - executeSQL("CREATE TABLE product (category INT NOT NULL, id INT NOT NULL, " + - "price DECIMAL, PRIMARY KEY(category, id)) ENGINE=INNODB"); - executeSQL("CREATE TABLE customer (id INT NOT NULL, PRIMARY KEY (id)) ENGINE=INNODB"); - executeSQL("CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT, " + - "product_category INT NOT NULL, product_id INT NOT NULL, customer_id INT NOT NULL, " + - "PRIMARY KEY(no), INDEX (product_category, product_id), " + - "FOREIGN KEY (product_category, product_id) REFERENCES product(category, id) " + - "ON UPDATE CASCADE ON DELETE RESTRICT, INDEX (customer_id), " + - "FOREIGN KEY (customer_id) REFERENCES customer(id)) ENGINE=INNODB"); - - string[] restrictions = new string[4]; - restrictions[0] = null; - restrictions[1] = ts.baseDBName + "0"; - restrictions[2] = "product_order"; - DataTable dt = connection.GetSchema("Foreign Keys", restrictions); - Assert.Equal(2, dt.Rows.Count); - DataRow row = dt.Rows[0]; - Assert.Equal(ts.baseDBName + "0".ToLower(), row["CONSTRAINT_SCHEMA"].ToString().ToLower()); - Assert.Equal("product_order_ibfk_1", row["CONSTRAINT_NAME"]); - Assert.Equal(ts.baseDBName + "0".ToLower(), row["TABLE_SCHEMA"].ToString().ToLower()); - Assert.Equal("product_order", row["TABLE_NAME"]); - Assert.Equal(ts.baseDBName + "0".ToLower(), row["REFERENCED_TABLE_SCHEMA"].ToString().ToLower()); - Assert.Equal("product", row["REFERENCED_TABLE_NAME"]); - - row = dt.Rows[1]; - Assert.Equal(ts.baseDBName + "0".ToLower(), row["CONSTRAINT_SCHEMA"].ToString().ToLower()); - Assert.Equal("product_order_ibfk_2", row["CONSTRAINT_NAME"]); - Assert.Equal(ts.baseDBName + "0".ToLower(), row["TABLE_SCHEMA"].ToString().ToLower()); - Assert.Equal("product_order", row["TABLE_NAME"]); - Assert.Equal(ts.baseDBName + "0".ToLower(), row["REFERENCED_TABLE_SCHEMA"].ToString().ToLower()); - Assert.Equal("customer", row["REFERENCED_TABLE_NAME"]); - } - - [Fact] - public void Triggers() - { - if (ts.version < new Version(5, 1, 6)) return; - - executeSQL("DROP TABLE IF EXISTS test1"); - executeSQL("CREATE TABLE test1 (id int)"); - executeSQL("CREATE TABLE test2 (count int)"); - executeSQL("INSERT INTO test2 VALUES (0)"); - string sql = String.Format("CREATE TRIGGER `{0}`.trigger1 AFTER INSERT ON test1 FOR EACH ROW BEGIN " + - "UPDATE test2 SET count = count+1; END", ts.baseDBName + "0"); - executeSQL(sql); - - string[] restrictions = new string[4]; - restrictions[1] = ts.baseDBName + "0"; - restrictions[2] = "test1"; - DataTable dt = connection.GetSchema("Triggers", restrictions); - Assert.True(dt.Rows.Count == 1); - Assert.Equal("Triggers", dt.TableName); - Assert.Equal("trigger1", dt.Rows[0]["TRIGGER_NAME"]); - Assert.Equal("INSERT", dt.Rows[0]["EVENT_MANIPULATION"]); - Assert.Equal("test1", dt.Rows[0]["EVENT_OBJECT_TABLE"]); - Assert.Equal("ROW", dt.Rows[0]["ACTION_ORIENTATION"]); - Assert.Equal("AFTER", dt.Rows[0]["ACTION_TIMING"]); - } - - [Fact] - public void UsingQuotedRestrictions() - { - executeSQL("DROP TABLE IF EXISTS test1"); - executeSQL("CREATE TABLE test1 (id int)"); - - string[] restrictions = new string[4]; - restrictions[1] = ts.baseDBName + "0"; - restrictions[2] = "`test1`"; - DataTable dt = connection.GetSchema("Tables", restrictions); - Assert.True(dt.Rows.Count == 1); - Assert.Equal("Tables", dt.TableName); - Assert.Equal("test1", dt.Rows[0][2]); - Assert.Equal("`test1`", restrictions[2]); - } - - [Fact] - public void ReservedWords() - { - DataTable dt = connection.GetSchema("ReservedWords"); - foreach (DataRow row in dt.Rows) - Assert.False(String.IsNullOrEmpty(row[0] as string)); - } - } -} diff --git a/Tests/MySql.Data.Tests/InstallerTests.cs b/Tests/MySql.Data.Tests/InstallerTests.cs deleted file mode 100644 index 74fba80c9..000000000 --- a/Tests/MySql.Data.Tests/InstallerTests.cs +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Xunit; -using MySql.Data.MySqlClient; -using Microsoft.Win32; -using System.IO; -using System.Xml; - -namespace MySql.Data.MySqlClient.Tests -{ - public class InstallerTests - { - private void CreateFiles() - { - //make a local copy of the machine.config file - object installRoot = Registry.GetValue( - @"HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\", - "InstallRoot", null); - if (installRoot == null) - throw new Exception("Unable to retrieve install root for .NET framework"); - - string[] dirs = new string[2] { "v2.0.50727", "v4.0.30319" }; - - foreach (string frameworkDir in dirs) - { - string path = installRoot.ToString() + frameworkDir; - string configPath = String.Format(@"{0}\CONFIG", path); - - if (!Directory.Exists(configPath)) - { - throw new Exception("Unable to get config .NET framework path"); - } - - if (!Directory.Exists(Environment.CurrentDirectory + "\\" + frameworkDir + @"\CONFIG")) - { - Directory.CreateDirectory(Environment.CurrentDirectory + "\\" + frameworkDir + @"\CONFIG"); - } - - File.Copy(configPath + @"\machine.config", Environment.CurrentDirectory + "\\" + frameworkDir + @"\CONFIG" + @"\machine.config", true); - } - - } - - - [Fact] - public void CanAddAssemblyBinding() - { - CreateFiles(); - CustomInstaller.UpdateMachineConfigs(Environment.CurrentDirectory + "\\", true); - DeleteFiles(); - } - - [Fact] - public void CanRemoveAssemblyBinding() - { - CreateFiles(); - CustomInstaller.UpdateMachineConfigs(Environment.CurrentDirectory + "\\", true); - - CustomInstaller.UpdateMachineConfigs(Environment.CurrentDirectory + "\\", false); - - string[] dirs = new string[2] { "v2.0.50727", "v4.0.30319" }; - - foreach (string frameworkDir in dirs) - { - var configFile = Environment.CurrentDirectory + "\\" + frameworkDir + @"\CONFIG" + @"\machine.config"; - - StreamReader sr = new StreamReader(configFile); - string configXML = sr.ReadToEnd(); - sr.Close(); - - // load the XML into the XmlDocument - XmlDocument doc = new XmlDocument(); - doc.LoadXml(configXML); - - XmlNodeList nodesDependantAssembly = doc.GetElementsByTagName("assemblyBinding")[0].ChildNodes; - if (nodesDependantAssembly != null) - { - int nodesCount = nodesDependantAssembly.Count; - for (int i = 0; i < nodesCount; i++) - { - if (nodesDependantAssembly[0].ChildNodes[0].Attributes[0].Name == "name" - && - nodesDependantAssembly[0].ChildNodes[0].Attributes[0].Value.Contains("MySql")) - { - Assert.True(true, "Error when removing assembly binding redirection"); - } - } - } - } - - DeleteFiles(); - } - - public void DeleteFiles() - { - - string[] dirs = new string[2] { "v2.0.50727", "v4.0.30319" }; - - foreach (string frameworkDir in dirs) - { - Directory.Delete(Environment.CurrentDirectory + "\\" + frameworkDir, true); - } - - } - } -} diff --git a/Tests/MySql.Data.Tests/LanguageTests.cs b/Tests/MySql.Data.Tests/LanguageTests.cs deleted file mode 100644 index 73cb68074..000000000 --- a/Tests/MySql.Data.Tests/LanguageTests.cs +++ /dev/null @@ -1,293 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; - -namespace MySql.Data.MySqlClient.Tests -{ - public class LanguageTests : TestBase - { - public LanguageTests(TestSetup setup) : base(setup, "language") - { - - } - - [Fact] - public void Unicode() - { - executeSQL("CREATE TABLE Test (u2 varchar(255) CHARACTER SET ucs2)"); - - using (MySqlConnection c = new MySqlConnection(connection.ConnectionString + ";charset=utf8")) - { - c.Open(); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES ( CONVERT('困巫忘否役' using ucs2))", c); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - string s1 = reader.GetString(0); - Assert.Equal("困巫忘否役", s1); - } - } - } - - /// - /// Bug #13806 Does not support Code Page 932 - /// - [Fact] - public void CP932() - { - using (MySqlConnection c = new MySqlConnection(Settings.GetConnectionString(true) + ";charset=cp932")) - { - c.Open(); - - MySqlCommand cmd = new MySqlCommand("SELECT '涯割晦叶角'", c); - string s = (string)cmd.ExecuteScalar(); - Assert.Equal("涯割晦叶角", s); - } - } - - [Fact] - public void UTF8() - { - executeSQL("CREATE TABLE Test (id int, name VARCHAR(200) CHAR SET utf8)"); - - using (MySqlConnection c = new MySqlConnection(connection.ConnectionString + ";charset=utf8")) - { - c.Open(); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1, 'ЁЄЉҖҚ')", c); //russian - cmd.ExecuteNonQuery(); - - cmd.CommandText = "INSERT INTO Test VALUES(2, '兣冘凥凷冋')"; // simplified Chinese - cmd.ExecuteNonQuery(); - - cmd.CommandText = "INSERT INTO Test VALUES(3, '困巫忘否役')"; // traditional Chinese - cmd.ExecuteNonQuery(); - - cmd.CommandText = "INSERT INTO Test VALUES(4, '涯割晦叶角')"; // Japanese - cmd.ExecuteNonQuery(); - - cmd.CommandText = "INSERT INTO Test VALUES(5, 'ברחפע')"; // Hebrew - cmd.ExecuteNonQuery(); - - cmd.CommandText = "INSERT INTO Test VALUES(6, 'ψόβΩΞ')"; // Greek - cmd.ExecuteNonQuery(); - - cmd.CommandText = "INSERT INTO Test VALUES(7, 'þðüçöÝÞÐÜÇÖ')"; // Turkish - cmd.ExecuteNonQuery(); - - cmd.CommandText = "INSERT INTO Test VALUES(8, 'ฅๆษ')"; // Thai - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - Assert.Equal("ЁЄЉҖҚ", reader.GetString(1)); - reader.Read(); - Assert.Equal("兣冘凥凷冋", reader.GetString(1)); - reader.Read(); - Assert.Equal("困巫忘否役", reader.GetString(1)); - reader.Read(); - Assert.Equal("涯割晦叶角", reader.GetString(1)); - reader.Read(); - Assert.Equal("ברחפע", reader.GetString(1)); - reader.Read(); - Assert.Equal("ψόβΩΞ", reader.GetString(1)); - reader.Read(); - Assert.Equal("þðüçöÝÞÐÜÇÖ", reader.GetString(1)); - reader.Read(); - Assert.Equal("ฅๆษ", reader.GetString(1)); - } - } - } - - [Fact] - public void UTF8PreparedAndUsingParameters() - { - executeSQL("CREATE TABLE Test (name VARCHAR(200) CHAR SET utf8)"); - - using (MySqlConnection c = new MySqlConnection(connection.ConnectionString + ";charset=utf8")) - { - c.Open(); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(?val)", c); - cmd.Parameters.Add("?val", MySqlDbType.VarChar); - cmd.Prepare(); - - cmd.Parameters[0].Value = "ЁЄЉҖҚ"; // Russian - cmd.ExecuteNonQuery(); - - cmd.Parameters[0].Value = "兣冘凥凷冋"; // simplified Chinese - cmd.ExecuteNonQuery(); - - cmd.Parameters[0].Value = "困巫忘否役"; // traditional Chinese - cmd.ExecuteNonQuery(); - - cmd.Parameters[0].Value = "涯割晦叶角"; // Japanese - cmd.ExecuteNonQuery(); - - cmd.Parameters[0].Value = "ברחפע"; // Hebrew - cmd.ExecuteNonQuery(); - - cmd.Parameters[0].Value = "ψόβΩΞ"; // Greek - cmd.ExecuteNonQuery(); - - cmd.Parameters[0].Value = "þðüçöÝÞÐÜÇÖ"; // Turkish - cmd.ExecuteNonQuery(); - - cmd.Parameters[0].Value = "ฅๆษ"; // Thai - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - Assert.Equal("ЁЄЉҖҚ", reader.GetString(0)); - reader.Read(); - Assert.Equal("兣冘凥凷冋", reader.GetString(0)); - reader.Read(); - Assert.Equal("困巫忘否役", reader.GetString(0)); - reader.Read(); - Assert.Equal("涯割晦叶角", reader.GetString(0)); - reader.Read(); - Assert.Equal("ברחפע", reader.GetString(0)); - reader.Read(); - Assert.Equal("ψόβΩΞ", reader.GetString(0)); - reader.Read(); - Assert.Equal("þðüçöÝÞÐÜÇÖ", reader.GetString(0)); - reader.Read(); - Assert.Equal("ฅๆษ", reader.GetString(0)); - } - } - } - - [Fact] - public void Chinese() - { - using (MySqlConnection c = new MySqlConnection(connection.ConnectionString + ";charset=utf8")) - { - c.Open(); - - executeSQL("CREATE TABLE Test (id int, name VARCHAR(200) CHAR SET big5, name2 VARCHAR(200) CHAR SET gb2312)"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1, '困巫忘否役', '涝搞谷侪魍' )", c); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - Assert.Equal("困巫忘否役", reader.GetString(1)); - Assert.Equal("涝搞谷侪魍", reader.GetString(2)); - } - } - } - - [Fact] - public void Turkish() - { - executeSQL("CREATE TABLE Test (id int, name VARCHAR(200) CHAR SET latin5 )"); - - using (MySqlConnection c = new MySqlConnection(connection.ConnectionString + ";charset=utf8")) - { - c.Open(); - - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1, 'ĞËÇÄŞ')", c); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - Assert.Equal("ĞËÇÄŞ", reader.GetString(1)); - } - } - } - - [Fact] - public void Russian() - { - executeSQL("CREATE TABLE Test (id int, name VARCHAR(200) CHAR SET cp1251)"); - - using (MySqlConnection c = new MySqlConnection(connection.ConnectionString + ";charset=utf8")) - { - c.Open(); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1, 'щьеи')", c); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - Assert.Equal("щьеи", reader.GetString(1)); - } - } - } - - [Fact] - public void VariousCollations() - { - executeSQL("DROP TABLE IF EXISTS test_tb"); - executeSQL(@"CREATE TABLE `test_tbl`(`test` VARCHAR(255) NOT NULL) - CHARACTER SET utf8 COLLATE utf8_swedish_ci"); - executeSQL("INSERT INTO test_tbl VALUES ('myval')"); - MySqlCommand cmd = new MySqlCommand("SELECT test FROM test_tbl", connection); - cmd.ExecuteScalar(); - } - - /// - /// Bug #25651 SELECT does not work properly when WHERE contains UTF-8 characters - /// - [Fact] - public void UTF8Parameters() - { - executeSQL("CREATE TABLE test (id int(11) NOT NULL, " + - "value varchar(100) NOT NULL, PRIMARY KEY (id)) " + - "ENGINE=MyISAM DEFAULT CHARSET=utf8"); - - string conString = Settings.GetConnectionString(true) + ";charset=utf8"; - using (MySqlConnection con = new MySqlConnection(conString)) - { - con.Open(); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO test VALUES (1, 'šđč枊ĐČĆŽ')", con); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT id FROM test WHERE value = ?parameter"; - cmd.Parameters.Add("?parameter", MySqlDbType.VarString); - cmd.Parameters[0].Value = "šđč枊ĐČĆŽ"; - object o = cmd.ExecuteScalar(); - Assert.Equal(1, o); - } - } - } -} diff --git a/Tests/MySql.Data.Tests/LoggingTests.cs b/Tests/MySql.Data.Tests/LoggingTests.cs deleted file mode 100644 index b45cb3e36..000000000 --- a/Tests/MySql.Data.Tests/LoggingTests.cs +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Diagnostics; - -namespace MySql.Data.MySqlClient.Tests -{ - public class LoggingTests : TestBase - { - - public LoggingTests(TestSetup setup) : base(setup, "logging") - { - - } - - protected override void Init() - { - base.Init(); - Setup.Settings.Logging = true; - } - -#if !NETCORE10 - - [Fact] - public void SimpleLogging() - { - executeSQL("CREATE TABLE Test(id INT, name VARCHAR(200))"); - executeSQL("INSERT INTO Test VALUES (1, 'Test1')"); - executeSQL("INSERT INTO Test VALUES (2, 'Test2')"); - executeSQL("INSERT INTO Test VALUES (3, 'Test3')"); - executeSQL("INSERT INTO Test VALUES (4, 'Test4')"); - - MySqlTrace.Listeners.Clear(); - MySqlTrace.Switch.Level = SourceLevels.All; - - - GenericListener listener = new GenericListener(); - - MySqlTrace.Listeners.Add(listener); - - using (MySqlConnection logConn = new MySqlConnection(Settings.GetConnectionString(true))) - { - logConn.Open(); - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", logConn); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - } - } - //Assert.Equal(4, listener.Strings.Count); - Assert.Equal(27, listener.Strings.Count); - Assert.True(listener.Strings[listener.Strings.Count - 5].Contains("Query Opened: SELECT * FROM Test")); - Assert.True(listener.Strings[listener.Strings.Count - 4].Contains("Resultset Opened: field(s) = 2, affected rows = -1, inserted id = -1")); - Assert.True(listener.Strings[listener.Strings.Count - 3].Contains("Resultset Closed. Total rows=4, skipped rows=4, size (bytes)=32")); - Assert.True(listener.Strings[listener.Strings.Count - 2].Contains("Query Closed")); - } - - [Fact] - public void Warnings() - { - executeSQL("CREATE TABLE Test(id INT, name VARCHAR(5))"); - MySqlTrace.Listeners.Clear(); - MySqlTrace.Switch.Level = SourceLevels.All; - GenericListener listener = new GenericListener(); - - MySqlTrace.Listeners.Add(listener); - - using (MySqlConnection logConnection = new MySqlConnection(Settings.GetConnectionString(true))) - { - logConnection.Open(); - MySqlCommand cmd = new MySqlCommand("INSERT IGNORE INTO Test VALUES (1, 'abcdef')", logConnection); - cmd.ExecuteNonQuery(); - } - - Assert.Equal(32, listener.Strings.Count); - Assert.True(listener.Strings[listener.Strings.Count - 10].Contains("Query Opened: INSERT IGNORE INTO Test VALUES (1, 'abcdef')")); - Assert.True(listener.Strings[listener.Strings.Count - 9].Contains("Resultset Opened: field(s) = 0, affected rows = 1, inserted id = 0")); - Assert.True(listener.Strings[listener.Strings.Count - 8].Contains("Resultset Closed. Total rows=0, skipped rows=0, size (bytes)=0")); - Assert.True(listener.Strings[listener.Strings.Count - 7].Contains("Query Opened: SHOW WARNINGS")); - Assert.True(listener.Strings[listener.Strings.Count - 6].Contains("Resultset Opened: field(s) = 3, affected rows = -1, inserted id = -1")); - Assert.True(listener.Strings[listener.Strings.Count - 5].Contains("Resultset Closed. Total rows=1, skipped rows=0, size (bytes)=55")); - Assert.True(listener.Strings[listener.Strings.Count - 4].Contains("Query Closed")); - Assert.True(listener.Strings[listener.Strings.Count - 3].Contains("MySql Warning: Level=Warning, Code=1265, Message=Data truncated for column 'name' at row 1")); - Assert.True(listener.Strings[listener.Strings.Count - 2].Contains("Query Closed")); - } - - [Fact] - public void ProviderNormalizingQuery() - { - MySqlTrace.Listeners.Clear(); - MySqlTrace.Switch.Level = SourceLevels.All; - GenericListener listener = new GenericListener(); - MySqlTrace.Listeners.Add(listener); - - StringBuilder sql = new StringBuilder("SELECT '"); - for (int i = 0; i < 400; i++) - sql.Append("a"); - sql.Append("'"); - - using (MySqlConnection logConnection = new MySqlConnection(Settings.GetConnectionString(true))) - { - logConnection.Open(); - MySqlCommand cmd = new MySqlCommand(sql.ToString(), logConnection); - cmd.ExecuteNonQuery(); - } - - Assert.Equal(28, listener.Strings.Count); - Assert.True(listener.Strings[listener.Strings.Count - 5].EndsWith("SELECT ?", StringComparison.OrdinalIgnoreCase)); - } - - /// - /// Bug #57641 Substring out of range exception in ConsumeQuotedToken - /// - [Fact] - public void QuotedTokenAt300() - { - MySqlTrace.Listeners.Clear(); - MySqlTrace.Switch.Level = SourceLevels.All; - GenericListener listener = new GenericListener(); - MySqlTrace.Listeners.Add(listener); - - string sql = @"SELECT 1 AS `AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1`, 2 AS `AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2`, - 3 AS `AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3`, 4 AS `AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4`, - 5 AS `AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5`, 6 AS `AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA6`;"; - - using (MySqlConnection logConnection = new MySqlConnection(Settings.GetConnectionString(true))) - { - logConnection.Open(); - MySqlCommand cmd = new MySqlCommand(sql, logConnection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - } - } - } -#endif - } -} diff --git a/Tests/MySql.Data.Tests/Memcached.cs b/Tests/MySql.Data.Tests/Memcached.cs deleted file mode 100644 index a9fd29b1f..000000000 --- a/Tests/MySql.Data.Tests/Memcached.cs +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright © 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -namespace MySql.Data.MySqlClient.Tests -{ - using System; - using System.Collections.Generic; - using System.Text; - using MySql.Data.MySqlClient.Memcached; - using Xunit; - - /* - /// - /// This class implements all the unit tests for the memcached client implementation - /// of Connector/NET. - /// - public class Memcached - { - - //TODO: These tests will only run in linux and OS X - - // A server that must be running Innodb memcached plugin in the standard 11211 port. - public static readonly string SERVER = "192.168.56.99"; - public static readonly uint PORT = 11211; - - [Test] - public void SetTest() - { - Client cli = Client.GetInstance( SERVER, PORT, MemcachedFlags.TextProtocol); - cli.Open(); - cli.Set("key1", "hello", TimeSpan.Zero); - string s = ( string )cli.Get("key1").Value; - cli.Close(); - Assert.AreEqual("hello", s); - } - - [Test] - public void AddTest() - { - Client cli = Client.GetInstance(SERVER, PORT, MemcachedFlags.TextProtocol); - cli.Open(); - cli.Add("key4", "hello", TimeSpan.Zero); - string s = (string)cli.Get("key4").Value; - cli.Close(); - Assert.AreEqual("hello", s); - } - - [Test] - public void AppendTest() - { - Client cli = Client.GetInstance(SERVER, PORT, MemcachedFlags.TextProtocol); - cli.Open(); - cli.Set("key1", "Hello", TimeSpan.Zero); - cli.Append("key1", "World"); - string s = (string)cli.Get("key1").Value; - cli.Close(); - Assert.AreEqual("HelloWorld", s); - } - - [Test] - public void PrependTest() - { - Client cli = Client.GetInstance(SERVER, PORT, MemcachedFlags.TextProtocol); - cli.Open(); - cli.Set("key1", "hello", TimeSpan.Zero); - cli.Prepend("key1", "World"); - string s = (string)cli.Get("key1").Value; - cli.Close(); - Assert.AreEqual("Worldhello", s); - } - - [Test] - public void ReplaceTest() - { - Client cli = Client.GetInstance(SERVER, PORT, MemcachedFlags.TextProtocol); - cli.Open(); - cli.Set("key1", "hello", TimeSpan.Zero); - cli.Replace("key1", "world", TimeSpan.Zero); - string s = (string)cli.Get("key1").Value; - cli.Close(); - Assert.AreEqual("world", s); - } - - [Test] - public void DeleteTest() - { - Client cli = Client.GetInstance(SERVER, PORT, MemcachedFlags.TextProtocol); - cli.Open(); - cli.Set("key1", "hello", TimeSpan.Zero); - try - { - cli.Delete("key1"); - string s = (string)cli.Get("key1").Value; - Assert.Fail(); - } - catch (MemcachedException) { } - finally - { - cli.Close(); - } - } - - [Test] - public void IncrementTest() - { - Client cli = Client.GetInstance(SERVER, PORT, MemcachedFlags.TextProtocol); - cli.Open(); - cli.Set("key1", "1", TimeSpan.Zero); - cli.Increment("key1", 1); - int n = Convert.ToInt32(cli.Get("key1").Value); - cli.Close(); - Assert.AreEqual(2, n); - } - - [Test] - public void DecrementTest() - { - Client cli = Client.GetInstance(SERVER, PORT, MemcachedFlags.TextProtocol); - cli.Open(); - cli.Set("key1", "1", TimeSpan.Zero); - cli.Decrement("key1", 1); - int n = Convert.ToInt32(cli.Get("key1").Value); - cli.Close(); - Assert.AreEqual(0, n); - } - - [Test] - public void SimpleBinaryTest() - { - //System.Diagnostics.Debug.Write(BitConverter.IsLittleEndian); - Client cli = Client.GetInstance(SERVER, PORT, MemcachedFlags.BinaryProtocol); - cli.Open(); - cli.Set("key3", "hello4", TimeSpan.Zero); - string s = (string)cli.Get("key3").Value; - cli.Close(); - Assert.AreEqual("hello4", s); - } - } - * */ -} diff --git a/Tests/MySql.Data.Tests/MySQLHelperTests.cs b/Tests/MySql.Data.Tests/MySQLHelperTests.cs deleted file mode 100644 index f93595b82..000000000 --- a/Tests/MySql.Data.Tests/MySQLHelperTests.cs +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Data; -using System.Threading.Tasks; - -namespace MySql.Data.MySqlClient.Tests -{ - public class MySQLHelperTests : TestBase - { - protected TestSetup ts; - - public MySQLHelperTests(TestSetup setup) : base (setup, "mysqlhelpertests") - { - ts = setup; - } - - /// - /// Bug #62585 MySql Connector/NET 6.4.3+ Doesn't escape quotation mark (U+0022) - /// - [Fact] - public void EscapeStringMethodCanEscapeQuotationMark() - { - executeSQL("CREATE TABLE Test (id int NOT NULL, name VARCHAR(100))"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO test VALUES (1,\"firstname\")", connection); - cmd.ExecuteNonQuery(); - - cmd = new MySqlCommand("UPDATE test SET name = \"" + MySqlHelper.EscapeString("test\"name\"") + "\";", connection); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT name FROM Test WHERE id=1"; - string name = (string)cmd.ExecuteScalar(); - - Assert.True("test\"name\"" == name, "Update result with quotation mark"); - } - - #region Async - [Fact] - public async Task ExecuteNonQueryAsync() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE TABLE MSHNonQueryAsyncTest (id int)"); - executeSQL("CREATE PROCEDURE MSHNonQueryAsyncSpTest() BEGIN SET @x=0; REPEAT INSERT INTO MSHNonQueryAsyncTest VALUES(@x); SET @x=@x+1; UNTIL @x = 100 END REPEAT; END"); - - try - { - int result = await MySqlHelper.ExecuteNonQueryAsync(connection, "call MSHNonQueryAsyncSpTest", null); - Assert.NotEqual(-1, result); - - MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM MSHNonQueryAsyncTest;", connection); - cmd.CommandType = System.Data.CommandType.Text; - object cnt = cmd.ExecuteScalar(); - Assert.Equal(100, Convert.ToInt32(cnt)); - } - finally - { - executeSQL("DROP PROCEDURE MSHNonQueryAsyncSpTest"); - executeSQL("DROP TABLE MSHNonQueryAsyncTest"); - } - } - - [Fact] - public async Task ExecuteDataSetAsync() - { - executeSQL("CREATE TABLE MSHDataSetAsyncTable1 (`key` INT, PRIMARY KEY(`key`))"); - executeSQL("CREATE TABLE MSHDataSetAsyncTable2 (`key` INT, PRIMARY KEY(`key`))"); - executeSQL("INSERT INTO MSHDataSetAsyncTable1 VALUES (1)"); - executeSQL("INSERT INTO MSHDataSetAsyncTable2 VALUES (1)"); - - try - { - string sql = "SELECT MSHDataSetAsyncTable1.key FROM MSHDataSetAsyncTable1 WHERE MSHDataSetAsyncTable1.key=1; " + - "SELECT MSHDataSetAsyncTable2.key FROM MSHDataSetAsyncTable2 WHERE MSHDataSetAsyncTable2.key=1"; - DataSet ds = await MySqlHelper.ExecuteDatasetAsync(connection, sql, null); - Assert.Equal(2, ds.Tables.Count); - Assert.Equal(1, ds.Tables[0].Rows.Count); - Assert.Equal(1, ds.Tables[1].Rows.Count); - Assert.Equal(1, ds.Tables[0].Rows[0]["key"]); - Assert.Equal(1, ds.Tables[1].Rows[0]["key"]); - } - finally - { - executeSQL("DROP TABLE MSHDataSetAsyncTable1"); - executeSQL("DROP TABLE MSHDataSetAsyncTable2"); - } - } - - [Fact] - public async Task ExecuteReaderAsync() - { - if (ts.version < new Version(5, 0)) return; - - if (connection.State != ConnectionState.Open) - connection.Open(); - - executeSQL("CREATE TABLE MSHReaderAsyncTest (id int)"); - executeSQL("CREATE PROCEDURE MSHReaderAsyncSpTest() BEGIN INSERT INTO MSHReaderAsyncTest VALUES(1); SELECT SLEEP(2); SELECT 'done'; END"); - - try - { - using (MySqlDataReader reader = await MySqlHelper.ExecuteReaderAsync(connection, "call MSHReaderAsyncSpTest")) - { - Assert.NotNull(reader); - Assert.True(reader.Read(), "can read"); - Assert.True(reader.NextResult()); - Assert.True(reader.Read()); - Assert.Equal("done", reader.GetString(0)); - reader.Close(); - - MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM MSHReaderAsyncTest", connection); - cmd.CommandType = CommandType.Text; - object cnt = cmd.ExecuteScalar(); - Assert.Equal(1, Convert.ToInt32(cnt)); - } - } - finally - { - executeSQL("DROP PROCEDURE MSHReaderAsyncSpTest"); - executeSQL("DROP TABLE MSHReaderAsyncTest"); - } - } - - [Fact] - public async Task ExecuteScalarAsync() - { - if (ts.version < new Version(5, 0)) return; - - if (connection.connectionState != ConnectionState.Open) - connection.Open(); - - executeSQL("CREATE TABLE MSHScalarAsyncTable1 (`key` INT, PRIMARY KEY(`key`))"); - executeSQL("INSERT INTO MSHScalarAsyncTable1 VALUES (1)"); - - try - { - object result = await MySqlHelper.ExecuteScalarAsync(connection, "SELECT MSHScalarAsyncTable1.key FROM MSHScalarAsyncTable1 WHERE MSHScalarAsyncTable1.key=1;"); - Assert.Equal(1, int.Parse(result.ToString())); - } - finally - { - executeSQL("DROP TABLE MSHScalarAsyncTable1"); - } - } - #endregion - } -} diff --git a/Tests/MySql.Data.Tests/MySql.Data.Tests.xproj b/Tests/MySql.Data.Tests/MySql.Data.Tests.xproj deleted file mode 100644 index c87551b93..000000000 --- a/Tests/MySql.Data.Tests/MySql.Data.Tests.xproj +++ /dev/null @@ -1,22 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 42229016-61ac-4abf-88eb-354055d2ac40 - MySql.Data.Tests - .\obj - .\bin\ - v4.6.1 - - - 2.0 - - - - - - \ No newline at end of file diff --git a/Tests/MySql.Data.Tests/MySqlBulkLoaderTests.cs b/Tests/MySql.Data.Tests/MySqlBulkLoaderTests.cs deleted file mode 100644 index eb6d14c00..000000000 --- a/Tests/MySql.Data.Tests/MySqlBulkLoaderTests.cs +++ /dev/null @@ -1,600 +0,0 @@ -// Copyright © 2013, 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using Xunit; -using System.IO; - -namespace MySql.Data.MySqlClient.Tests -{ - public class MySqlBulkLoaderTests : TestBase - { - public MySqlBulkLoaderTests(TestSetup setup) : base(setup, "bulkload") - { - } - - [Fact] - public void BulkLoadSimple() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); - - // first create the external file - string path = Path.GetTempFileName(); - StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); - for (int i = 0; i < 200; i++) - sw.WriteLine(i + "\t'Test'"); - sw.Flush(); - sw.Dispose(); - - MySqlBulkLoader loader = new MySqlBulkLoader(connection); - loader.TableName = "Test"; - loader.FileName = path; - loader.Timeout = 0; - int count = loader.Load(); - Assert.Equal(200, count); - - TestDataTable dt = Utils.FillTable("SELECT * FROM Test", connection); - Assert.Equal(200, dt.Rows.Count); - Assert.Equal("'Test'", dt.Rows[0][1].ToString().Trim()); - } - - [Fact] - public void BulkLoadReadOnlyFile() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); - - // first create the external file - string path = Path.GetTempFileName(); - StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); - for (int i = 0; i < 200; i++) - sw.WriteLine(i + "\t'Test'"); - sw.Flush(); - sw.Dispose(); - - FileInfo fi = new FileInfo(path); - FileAttributes oldAttr = fi.Attributes; - fi.Attributes = fi.Attributes | FileAttributes.ReadOnly; - try - { - MySqlBulkLoader loader = new MySqlBulkLoader(connection); - loader.TableName = "Test"; - loader.FileName = path; - loader.Timeout = 0; - int count = loader.Load(); - Assert.Equal(200, count); - - TestDataTable dt = Utils.FillTable("SELECT * FROM Test", connection); - Assert.Equal(200, dt.Rows.Count); - Assert.Equal("'Test'", dt.Rows[0][1].ToString().Trim()); - } - finally - { - fi.Attributes = oldAttr; - fi.Delete(); - } - } - - [Fact] - public void BulkLoadSimple2() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); - - // first create the external file - string path = Path.GetTempFileName(); - StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); - for (int i = 0; i < 200; i++) - sw.Write(i + ",'Test' xxx"); - sw.Flush(); - sw.Dispose(); - - MySqlBulkLoader loader = new MySqlBulkLoader(connection); - loader.TableName = "Test"; - loader.FileName = path; - loader.Timeout = 0; - loader.FieldTerminator = ","; - loader.LineTerminator = "xxx"; - int count = loader.Load(); - Assert.Equal(200, count); - - MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM Test", connection); - Assert.Equal(200, Convert.ToInt32(cmd.ExecuteScalar())); - } - - [Fact] - public void BulkLoadSimple3() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); - - // first create the external file - string path = Path.GetTempFileName(); - StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); - for (int i = 0; i < 200; i++) - sw.Write(i + ",'Test' xxx"); - sw.Flush(); - sw.Dispose(); - - MySqlBulkLoader loader = new MySqlBulkLoader(connection); - loader.TableName = "Test"; - loader.FileName = path; - loader.Timeout = 0; - loader.FieldTerminator = ","; - loader.LineTerminator = "xxx"; - loader.NumberOfLinesToSkip = 50; - int count = loader.Load(); - Assert.Equal(150, count); - - MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM Test", connection); - Assert.Equal(150, Convert.ToInt32(cmd.ExecuteScalar())); - } - - [Fact] - public void BulkLoadSimple4() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); - - // first create the external file - string path = Path.GetTempFileName(); - StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); - for (int i = 0; i < 100; i++) - sw.Write("aaa" + i + ",'Test' xxx"); - for (int i = 100; i < 200; i++) - sw.Write("bbb" + i + ",'Test' xxx"); - for (int i = 200; i < 300; i++) - sw.Write("aaa" + i + ",'Test' xxx"); - for (int i = 300; i < 400; i++) - sw.Write("bbb" + i + ",'Test' xxx"); - sw.Flush(); - sw.Dispose(); - - MySqlBulkLoader loader = new MySqlBulkLoader(connection); - loader.TableName = "Test"; - loader.FileName = path; - loader.Timeout = 0; - loader.FieldTerminator = ","; - loader.LineTerminator = "xxx"; - loader.LinePrefix = "bbb"; - int count = loader.Load(); - Assert.Equal(200, count); - - MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM Test", connection); - Assert.Equal(200, Convert.ToInt32(cmd.ExecuteScalar())); - } - - [Fact] - public void BulkLoadFieldQuoting() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), name2 VARCHAR(250), PRIMARY KEY(id))"); - - // first create the external file - string path = Path.GetTempFileName(); - StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); - for (int i = 0; i < 200; i++) - sw.WriteLine(i + "\t`col1`\tcol2"); - sw.Flush(); - sw.Dispose(); - - MySqlBulkLoader loader = new MySqlBulkLoader(connection); - loader.TableName = "Test"; - loader.FileName = path; - loader.Timeout = 0; - loader.FieldQuotationCharacter = '`'; - loader.FieldQuotationOptional = true; - int count = loader.Load(); - Assert.Equal(200, count); - - TestDataTable dt = Utils.FillTable("SELECT * FROM Test", connection); - Assert.Equal(200, dt.Rows.Count); - Assert.Equal("col1", dt.Rows[0][1]); - Assert.Equal("col2", dt.Rows[0][2].ToString().Trim()); - } - - [Fact] - public void BulkLoadEscaping() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), name2 VARCHAR(250), PRIMARY KEY(id))"); - - // first create the external file - string path = Path.GetTempFileName(); - StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); - for (int i = 0; i < 200; i++) - sw.WriteLine(i + ",col1\tstill col1,col2"); - sw.Flush(); - sw.Dispose(); - - MySqlBulkLoader loader = new MySqlBulkLoader(connection); - loader.TableName = "Test"; - loader.FileName = path; - loader.Timeout = 0; - loader.EscapeCharacter = '\t'; - loader.FieldTerminator = ","; - int count = loader.Load(); - Assert.Equal(200, count); - - TestDataTable dt = Utils.FillTable("SELECT * FROM Test", connection); - Assert.Equal(200, dt.Rows.Count); - Assert.Equal("col1still col1", dt.Rows[0][1]); - Assert.Equal("col2", dt.Rows[0][2].ToString().Trim()); - } - - [Fact] - public void BulkLoadConflictOptionReplace() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); - - // first create the external file - string path = Path.GetTempFileName(); - StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); - for (int i = 0; i < 20; i++) - sw.WriteLine(i + ",col1"); - sw.Flush(); - sw.Dispose(); - - MySqlBulkLoader loader = new MySqlBulkLoader(connection); - loader.TableName = "Test"; - loader.FileName = path; - loader.Timeout = 0; - loader.FieldTerminator = ","; - int count = loader.Load(); - Assert.Equal(20, count); - - path = Path.GetTempFileName(); - sw = new StreamWriter(new FileStream(path, FileMode.Create)); - for (int i = 0; i < 20; i++) - sw.WriteLine(i + ",col2"); - sw.Flush(); - sw.Dispose(); - - loader = new MySqlBulkLoader(connection); - loader.TableName = "Test"; - loader.FileName = path; - loader.Timeout = 0; - loader.FieldTerminator = ","; - loader.ConflictOption = MySqlBulkLoaderConflictOption.Replace; - loader.Load(); - - TestDataTable dt = Utils.FillTable("SELECT * FROM Test", connection); - Assert.Equal(20, dt.Rows.Count); - Assert.Equal("col2", dt.Rows[0][1].ToString().Trim()); - } - - [Fact] - public void BulkLoadConflictOptionIgnore() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); - - // first create the external file - string path = Path.GetTempFileName(); - StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); - for (int i = 0; i < 20; i++) - sw.WriteLine(i + ",col1"); - sw.Flush(); - sw.Dispose(); - - MySqlBulkLoader loader = new MySqlBulkLoader(connection); - loader.TableName = "Test"; - loader.FileName = path; - loader.Timeout = 0; - loader.FieldTerminator = ","; - int count = loader.Load(); - Assert.Equal(20, count); - - path = Path.GetTempFileName(); - sw = new StreamWriter(new FileStream(path, FileMode.Create)); - for (int i = 0; i < 20; i++) - sw.WriteLine(i + ",col2"); - sw.Flush(); - sw.Dispose(); - - loader = new MySqlBulkLoader(connection); - loader.TableName = "Test"; - loader.FileName = path; - loader.Timeout = 0; - loader.FieldTerminator = ","; - loader.ConflictOption = MySqlBulkLoaderConflictOption.Ignore; - loader.Load(); - - TestDataTable dt = Utils.FillTable("SELECT * FROM Test", connection); - Assert.Equal(20, dt.Rows.Count); - Assert.Equal("col1", dt.Rows[0][1].ToString().Trim()); - } - - #region AsyncTests - [Fact] - public void BulkLoadSimpleAsync() - { - executeSQL("CREATE TABLE BulkLoadSimpleAsyncTest (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); - string path = Path.GetTempFileName(); - StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); - for (int i = 0; i < 500; i++) - sw.WriteLine(i + "\t'Test'"); - sw.Flush(); - sw.Dispose(); - - MySqlBulkLoader loader = new MySqlBulkLoader(connection); - loader.TableName = "BulkLoadSimpleAsyncTest"; - loader.FileName = path; - loader.Timeout = 0; - - loader.LoadAsync().ContinueWith(loadResult => - { - int dataLoaded = loadResult.Result; - TestDataTable dt = Utils.FillTable("SELECT * FROM BulkLoadSimpleAsyncTest", connection); - - Assert.Equal(dataLoaded, dt.Rows.Count); - Assert.Equal("'Test'", dt.Rows[0][1].ToString().Trim()); - }).Wait(); - } - - [Fact] - public void BulkLoadReadOnlyFileAsync() - { - executeSQL("CREATE TABLE BulkLoadReadOnlyFileAsyncTest (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); - - string path = Path.GetTempFileName(); - StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); - for (int i = 0; i < 500; i++) - sw.WriteLine(i + "\t'Test'"); - sw.Flush(); - sw.Dispose(); - - FileInfo fi = new FileInfo(path); - FileAttributes oldAttr = fi.Attributes; - fi.Attributes = fi.Attributes | FileAttributes.ReadOnly; - try - { - MySqlBulkLoader loader = new MySqlBulkLoader(connection); - loader.TableName = "BulkLoadReadOnlyFileAsyncTest"; - loader.FileName = path; - loader.Timeout = 0; - - loader.LoadAsync().ContinueWith(loadResult => - { - int dataLoaded = loadResult.Result; - - TestDataTable dt = Utils.FillTable("SELECT * FROM BulkLoadReadOnlyFileAsyncTest", connection); - Assert.Equal(dataLoaded, dt.Rows.Count); - Assert.Equal("'Test'", dt.Rows[0][1].ToString().Trim()); - }).Wait(); - } - finally - { - fi.Attributes = oldAttr; - fi.Delete(); - } - } - - [Fact] - public void BulkLoadFieldQuotingAsync() - { - executeSQL("CREATE TABLE BulkLoadFieldQuotingAsyncTest (id INT NOT NULL, name VARCHAR(250), name2 VARCHAR(250), PRIMARY KEY(id))"); - - string path = Path.GetTempFileName(); - StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); - for (int i = 0; i < 500; i++) - sw.WriteLine(i + "\t`col1`\tcol2"); - sw.Flush(); - sw.Dispose(); - - MySqlBulkLoader loader = new MySqlBulkLoader(connection); - loader.TableName = "BulkLoadFieldQuotingAsyncTest"; - loader.FileName = path; - loader.Timeout = 0; - loader.FieldQuotationCharacter = '`'; - loader.FieldQuotationOptional = true; - - loader.LoadAsync().ContinueWith(loadResult => { - int dataLoaded = loadResult.Result; - TestDataTable dt = Utils.FillTable("SELECT * FROM BulkLoadFieldQuotingAsyncTest", connection); - - Assert.Equal(dataLoaded, dt.Rows.Count); - Assert.Equal("col1", dt.Rows[0][1]); - Assert.Equal("col2", dt.Rows[0][2].ToString().Trim()); - }).Wait(); - } - - [Fact] - public void BulkLoadEscapingAsync() - { - executeSQL("CREATE TABLE BulkLoadEscapingAsyncTest (id INT NOT NULL, name VARCHAR(250), name2 VARCHAR(250), PRIMARY KEY(id))"); - - string path = Path.GetTempFileName(); - StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); - for (int i = 0; i < 500; i++) - sw.WriteLine(i + ",col1\tstill col1,col2"); - sw.Flush(); - sw.Dispose(); - - MySqlBulkLoader loader = new MySqlBulkLoader(connection); - loader.TableName = "BulkLoadEscapingAsyncTest"; - loader.FileName = path; - loader.Timeout = 0; - loader.EscapeCharacter = '\t'; - loader.FieldTerminator = ","; - - loader.LoadAsync().ContinueWith(loadResult => { - int dataLoaded = loadResult.Result; - TestDataTable dt = Utils.FillTable("SELECT * FROM BulkLoadEscapingAsyncTest", connection); - - Assert.Equal(dataLoaded, dt.Rows.Count); - Assert.Equal("col1still col1", dt.Rows[0][1]); - Assert.Equal("col2", dt.Rows[0][2].ToString().Trim()); - }).Wait(); - } - - [Fact] - public void BulkLoadConflictOptionReplaceAsync() - { - executeSQL("CREATE TABLE BulkLoadConflictOptionReplaceAsyncTest (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); - - string path = Path.GetTempFileName(); - StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); - for (int i = 0; i < 20; i++) - sw.WriteLine(i + ",col1"); - sw.Flush(); - sw.Dispose(); - - MySqlBulkLoader loader = new MySqlBulkLoader(connection); - loader.TableName = "BulkLoadConflictOptionReplaceAsyncTest"; - loader.FileName = path; - loader.Timeout = 0; - loader.FieldTerminator = ","; - - loader.LoadAsync().Wait(); - - path = Path.GetTempFileName(); - sw = new StreamWriter(new FileStream(path, FileMode.Create)); - for (int i = 0; i < 20; i++) - sw.WriteLine(i + ",col2"); - sw.Flush(); - sw.Dispose(); - - loader = new MySqlBulkLoader(connection); - loader.TableName = "BulkLoadConflictOptionReplaceAsyncTest"; - loader.FileName = path; - loader.Timeout = 0; - loader.FieldTerminator = ","; - loader.ConflictOption = MySqlBulkLoaderConflictOption.Replace; - - loader.LoadAsync().Wait(); - TestDataTable dt = Utils.FillTable("SELECT * FROM BulkLoadConflictOptionReplaceAsyncTest", connection); - Assert.Equal(20, dt.Rows.Count); - Assert.Equal("col2", dt.Rows[0][1].ToString().Trim()); - } - - [Fact] - public void BulkLoadConflictOptionIgnoreAsync() - { - executeSQL("CREATE TABLE BulkLoadConflictOptionIgnoreAsyncTest (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); - - string path = Path.GetTempFileName(); - StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); - for (int i = 0; i < 20; i++) - sw.WriteLine(i + ",col1"); - sw.Flush(); - sw.Dispose(); - - MySqlBulkLoader loader = new MySqlBulkLoader(connection); - loader.TableName = "BulkLoadConflictOptionIgnoreAsyncTest"; - loader.FileName = path; - loader.Timeout = 0; - loader.FieldTerminator = ","; - - loader.LoadAsync().ContinueWith(loadResult => { - int dataLoaded = loadResult.Result; - path = Path.GetTempFileName(); - sw = new StreamWriter(new FileStream(path, FileMode.Create)); - for (int i = 0; i < dataLoaded; i++) - sw.WriteLine(i + ",col2"); - sw.Flush(); - sw.Dispose(); - }).Wait(); - - loader = new MySqlBulkLoader(connection); - loader.TableName = "BulkLoadConflictOptionIgnoreAsyncTest"; - loader.FileName = path; - loader.Timeout = 0; - loader.FieldTerminator = ","; - loader.ConflictOption = MySqlBulkLoaderConflictOption.Ignore; - - loader.LoadAsync().ContinueWith(loadResult => { - int dataLoaded = loadResult.Result; - TestDataTable dt = Utils.FillTable("SELECT * FROM BulkLoadConflictOptionIgnoreAsyncTest", connection); - Assert.Equal(20, dt.Rows.Count); - Assert.Equal("col1", dt.Rows[0][1].ToString().Trim()); - }).Wait(); - } - - [Fact] - public void BulkLoadColumnOrderAsync() - { - executeSQL(@"CREATE TABLE BulkLoadColumnOrderAsyncTest (id INT NOT NULL, n1 VARCHAR(250), n2 VARCHAR(250), n3 VARCHAR(250), PRIMARY KEY(id))"); - - string path = Path.GetTempFileName(); - StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); - for (int i = 0; i < 20; i++) - sw.WriteLine(i + ",col3,col2,col1"); - sw.Flush(); - sw.Dispose(); - - MySqlBulkLoader loader = new MySqlBulkLoader(connection); - loader.TableName = "BulkLoadColumnOrderAsyncTest"; - loader.FileName = path; - loader.Timeout = 0; - loader.FieldTerminator = ","; - loader.LineTerminator = Environment.NewLine; - loader.Columns.Add("id"); - loader.Columns.Add("n3"); - loader.Columns.Add("n2"); - loader.Columns.Add("n1"); - - loader.LoadAsync().ContinueWith(loadResult => { - int dataLoaded = loadResult.Result; - TestDataTable dt = Utils.FillTable("SELECT * FROM BulkLoadColumnOrderAsyncTest", connection); - Assert.Equal(20, dt.Rows.Count); - Assert.Equal("col1", dt.Rows[0][1]); - Assert.Equal("col2", dt.Rows[0][2]); - Assert.Equal("col3", dt.Rows[0][3].ToString().Trim()); - }).Wait(); - } - #endregion - - private string GetElapsedTime(System.Diagnostics.Stopwatch Timer) - { - TimeSpan timeElapsed = Timer.Elapsed; - return string.Format("{0}:{1}:{2}.{3} (HH:MM:SS.MS)", timeElapsed.Hours, timeElapsed.Minutes, timeElapsed.Seconds, timeElapsed.Milliseconds); - } - - [Fact] - public void BulkLoadColumnOrder() - { - executeSQL(@"CREATE TABLE Test (id INT NOT NULL, n1 VARCHAR(250), n2 VARCHAR(250), - n3 VARCHAR(250), PRIMARY KEY(id))"); - - // first create the external file - string path = Path.GetTempFileName(); - StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); - for (int i = 0; i < 20; i++) - sw.WriteLine(i + ",col3,col2,col1"); - sw.Flush(); - sw.Dispose(); - - MySqlBulkLoader loader = new MySqlBulkLoader(connection); - loader.TableName = "Test"; - loader.FileName = path; - loader.Timeout = 0; - loader.FieldTerminator = ","; - loader.LineTerminator = Environment.NewLine; - loader.Columns.Add("id"); - loader.Columns.Add("n3"); - loader.Columns.Add("n2"); - loader.Columns.Add("n1"); - int count = loader.Load(); - Assert.Equal(20, count); - - TestDataTable dt = Utils.FillTable("SELECT * FROM Test", connection); - Assert.Equal(20, dt.Rows.Count); - Assert.Equal("col1", dt.Rows[0][1]); - Assert.Equal("col2", dt.Rows[0][2]); - Assert.Equal("col3", dt.Rows[0][3].ToString().Trim()); - } - } -} diff --git a/Tests/MySql.Data.Tests/MySqlCommandBuilderTests.cs b/Tests/MySql.Data.Tests/MySqlCommandBuilderTests.cs deleted file mode 100644 index c93c19376..000000000 --- a/Tests/MySql.Data.Tests/MySqlCommandBuilderTests.cs +++ /dev/null @@ -1,391 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Data; - - -namespace MySql.Data.MySqlClient.Tests -{ - public class MySqlCommandBuilderTests : TestBase - { - protected TestSetup ts; - - public MySqlCommandBuilderTests(TestSetup setup) : base(setup, "mysqlcmdbdrtests") - { - ts = setup; - ts.CreateDatabase("1"); - } - - - [Fact] - public void MultiWord() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, `multi word` int, PRIMARY KEY(id))"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - DataTable dt = new DataTable(); - da.Fill(dt); - - DataRow row = dt.NewRow(); - row["id"] = 1; - row["name"] = "Name"; - row["dt"] = DBNull.Value; - row["tm"] = DBNull.Value; - row["multi word"] = 2; - dt.Rows.Add(row); - da.Update(dt); - Assert.Equal(1, dt.Rows.Count); - Assert.Equal(2, dt.Rows[0]["multi word"]); - - dt.Rows[0]["multi word"] = 3; - da.Update(dt); - cb.Dispose(); - Assert.Equal(1, dt.Rows.Count); - Assert.Equal(3, dt.Rows[0]["multi word"]); - } - - [Fact] - public void LastOneWins() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, `multi word` int, PRIMARY KEY(id))"); - executeSQL("INSERT INTO Test (id, name) VALUES (1, 'Test')"); - - MySqlCommandBuilder cb = new MySqlCommandBuilder( - new MySqlDataAdapter("SELECT * FROM Test", connection)); - MySqlDataAdapter da = cb.DataAdapter; - cb.ConflictOption = ConflictOption.OverwriteChanges; - DataTable dt = new DataTable(); - da.Fill(dt); - Assert.Equal(1, dt.Rows.Count); - - executeSQL("UPDATE Test SET name='Test2' WHERE id=1"); - - dt.Rows[0]["name"] = "Test3"; - Assert.Equal(1, da.Update(dt)); - - dt.Rows.Clear(); - da.Fill(dt); - Assert.Equal(1, dt.Rows.Count); - Assert.Equal("Test3", dt.Rows[0]["name"]); - } - - [Fact] - public void NotLastOneWins() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, `multi word` int, PRIMARY KEY(id))"); - executeSQL("INSERT INTO Test (id, name) VALUES (1, 'Test')"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - cb.ConflictOption = ConflictOption.CompareAllSearchableValues; - DataTable dt = new DataTable(); - da.Fill(dt); - Assert.Equal(1, dt.Rows.Count); - - executeSQL("UPDATE Test SET name='Test2' WHERE id=1"); - dt.Rows[0]["name"] = "Test3"; - Exception ex = Assert.Throws(() => (da.Update(dt))); - Assert.Equal(ex.Message, "Concurrency violation: the UpdateCommand affected 0 of the expected 1 records."); - - dt.Rows.Clear(); - da.Fill(dt); - Assert.Equal(1, dt.Rows.Count); - Assert.Equal("Test2", dt.Rows[0]["name"]); - } - - /// - /// Bug #8574 - MySqlCommandBuilder unable to support sub-queries - /// Bug #11947 - MySQLCommandBuilder mishandling CONCAT() aliased column - /// - [Fact] - public void UsingFunctions() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, `multi word` int, PRIMARY KEY(id))"); - executeSQL("INSERT INTO Test (id, name) VALUES (1,'test1')"); - executeSQL("INSERT INTO Test (id, name) VALUES (2,'test2')"); - executeSQL("INSERT INTO Test (id, name) VALUES (3,'test3')"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT id, name, now() as ServerTime FROM Test", connection); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - DataTable dt = new DataTable(); - da.Fill(dt); - - dt.Rows[0]["id"] = 4; - da.Update(dt); - - da.SelectCommand.CommandText = "SELECT id, name, CONCAT(name, ' boo') as newname from Test where id=4"; - dt.Clear(); - da.Fill(dt); - Assert.Equal(1, dt.Rows.Count); - Assert.Equal("test1", dt.Rows[0]["name"]); - Assert.Equal("test1 boo", dt.Rows[0]["newname"]); - - dt.Rows[0]["id"] = 5; - da.Update(dt); - - dt.Clear(); - da.SelectCommand.CommandText = "SELECT * FROM Test WHERE id=5"; - da.Fill(dt); - Assert.Equal(1, dt.Rows.Count); - Assert.Equal("test1", dt.Rows[0]["name"]); - - da.SelectCommand.CommandText = "SELECT *, now() as stime FROM Test WHERE id<4"; - cb = new MySqlCommandBuilder(da); - cb.ConflictOption = ConflictOption.OverwriteChanges; - da.InsertCommand = cb.GetInsertCommand(); - } - - /// - /// Bug #8382 Commandbuilder does not handle queries to other databases than the default one- - /// - [Fact] - public void DifferentDatabase() - { - if (ts.version < new Version(4, 1)) return; - - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, `multi word` int, PRIMARY KEY(id))"); - executeSQL("INSERT INTO Test (id, name) VALUES (1,'test1')"); - executeSQL("INSERT INTO Test (id, name) VALUES (2,'test2')"); - executeSQL("INSERT INTO Test (id, name) VALUES (3,'test3')"); - - connection.ChangeDatabase(ts.baseDBName + "1"); - - MySqlDataAdapter da = new MySqlDataAdapter( - String.Format("SELECT id, name FROM `{0}`.Test", ts.baseDBName + "0"), connection); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - DataSet ds = new DataSet(); - da.Fill(ds); - - ds.Tables[0].Rows[0]["id"] = 4; - DataSet changes = ds.GetChanges(); - da.Update(changes); - ds.Merge(changes); - ds.AcceptChanges(); - cb.Dispose(); - - connection.ChangeDatabase(ts.baseDBName + "0"); - } - - /// - /// Bug #13036 Returns error when field names contain any of the following chars %<>()/ etc - /// - [Fact] - public void SpecialCharactersInFieldNames() - { - executeSQL("CREATE TABLE Test (`col%1` int PRIMARY KEY, `col()2` int, `col<>3` int, `col/4` int)"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - cb.ToString(); // keep the compiler happy - DataTable dt = new DataTable(); - da.Fill(dt); - DataRow row = dt.NewRow(); - row[0] = 1; - row[1] = 2; - row[2] = 3; - row[3] = 4; - dt.Rows.Add(row); - da.Update(dt); - } - - /// - /// Bug #14631 "#42000Query was empty" - /// - [Fact] - public void SemicolonAtEndOfSQL() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), PRIMARY KEY(id))"); - executeSQL("INSERT INTO Test VALUES(1, 'Data')"); - - DataSet ds = new DataSet(); - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM `Test`;", connection); - da.FillSchema(ds, SchemaType.Source, "Test"); - - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - DataTable dt = new DataTable(); - da.Fill(dt); - dt.Rows[0]["id"] = 2; - da.Update(dt); - - dt.Clear(); - da.Fill(dt); - cb.Dispose(); - Assert.Equal(1, dt.Rows.Count); - Assert.Equal(2, dt.Rows[0]["id"]); - } - - /// - /// Bug #23862 Problem with CommandBuilder 'GetInsertCommand' method - /// - [Fact] - public void AutoIncrementColumnsOnInsert() - { - executeSQL("CREATE TABLE Test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, " + - "name VARCHAR(100), PRIMARY KEY(id))"); - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - - da.InsertCommand = cb.GetInsertCommand(); - da.InsertCommand.CommandText += "; SELECT last_insert_id()"; - da.InsertCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord; - - DataTable dt = new DataTable(); - da.Fill(dt); - dt.Columns[0].AutoIncrement = true; - Assert.True(dt.Columns[0].AutoIncrement); - dt.Columns[0].AutoIncrementSeed = -1; - dt.Columns[0].AutoIncrementStep = -1; - DataRow row = dt.NewRow(); - row["name"] = "Test"; - - dt.Rows.Add(row); - da.Update(dt); - - dt.Clear(); - da.Fill(dt); - Assert.Equal(1, dt.Rows.Count); - Assert.Equal(1, dt.Rows[0]["id"]); - Assert.Equal("Test", dt.Rows[0]["name"]); - cb.Dispose(); - } - - /// - /// Bug #25569 UpdateRowSource.FirstReturnedRecord does not work - /// - [Fact] - public void AutoIncrementColumnsOnInsert2() - { - executeSQL("CREATE TABLE Test (id INT UNSIGNED NOT NULL " + - "AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20))"); - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - - MySqlCommand cmd = (MySqlCommand)(cb.GetInsertCommand() as ICloneable).Clone(); - cmd.CommandText += "; SELECT last_insert_id() as id"; - cmd.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord; - da.InsertCommand = cmd; - - DataTable dt = new DataTable(); - da.Fill(dt); - dt.Rows.Clear(); - - DataRow row = dt.NewRow(); - row["name"] = "Test"; - dt.Rows.Add(row); - da.Update(dt); - Assert.Equal(1, Convert.ToInt32(dt.Rows[0]["id"])); - Assert.Equal("Test", dt.Rows[0]["name"]); - - row = dt.NewRow(); - row["name"] = "Test2"; - dt.Rows.Add(row); - da.Update(dt); - Assert.Equal(2, Convert.ToInt32(dt.Rows[1]["id"])); - Assert.Equal("Test2", dt.Rows[1]["name"]); - - Assert.Equal(1, Convert.ToInt32(dt.Rows[0]["id"])); - } - - [Fact] - public void MultiUpdate() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, `multi word` int, PRIMARY KEY(id))"); - executeSQL("INSERT INTO Test (id, name) VALUES (1, 'test1')"); - executeSQL("INSERT INTO Test (id, name) VALUES (2, 'test2')"); - executeSQL("INSERT INTO Test (id, name) VALUES (3, 'test3')"); - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - DataTable dt = new DataTable(); - da.Fill(dt); - - dt.Rows[0]["id"] = 4; - dt.Rows[0]["name"] = "test4"; - dt.Rows[1]["id"] = 5; - dt.Rows[1]["name"] = "test5"; - dt.Rows[2]["id"] = 6; - dt.Rows[2]["name"] = "test6"; - DataTable changes = dt.GetChanges(); - da.Update(changes); - dt.AcceptChanges(); - - dt.Rows[0]["id"] = 7; - dt.Rows[0]["name"] = "test7"; - dt.Rows[1]["id"] = 8; - dt.Rows[1]["name"] = "test8"; - dt.Rows[2]["id"] = 9; - dt.Rows[2]["name"] = "test9"; - changes = dt.GetChanges(); - da.Update(changes); - dt.AcceptChanges(); - cb.Dispose(); - } - - /// - /// Bug #30077 MySqlDataAdapter.Update() exception due to date field format - /// - [Fact] - public void UpdatingWithDateInKey() - { - executeSQL("CREATE TABLE Test (cod INT, dt DATE, PRIMARY KEY(cod, dt))"); - - executeSQL("INSERT INTO Test (cod, dt) VALUES (1, '2006-1-1')"); - executeSQL("INSERT INTO Test (cod, dt) VALUES (2, '2006-1-2')"); - executeSQL("INSERT INTO Test (cod, dt) VALUES (3, '2006-1-3')"); - executeSQL("INSERT INTO Test (cod, dt) VALUES (4, '2006-1-4')"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test ORDER BY cod", connection); - MySqlCommandBuilder bld = new MySqlCommandBuilder(da); - bld.ConflictOption = ConflictOption.OverwriteChanges; - DataTable dt = new DataTable(); - da.Fill(dt); - dt.Rows[0]["cod"] = 6; - da.Update(dt); - - dt.Clear(); - da.SelectCommand.CommandText = "SELECT * FROM Test WHERE cod=6"; - da.Fill(dt); - Assert.Equal(6, dt.Rows[0]["cod"]); - } - - /// - /// Bug #35492 Please implement DbCommandBuilder.QuoteIdentifier - /// - [Fact] - public void QuoteAndUnquoteIdentifiers() - { - MySqlCommandBuilder cb = new MySqlCommandBuilder(); - Assert.Equal("`boo`", cb.QuoteIdentifier("boo")); - Assert.Equal("`bo``o`", cb.QuoteIdentifier("bo`o")); - Assert.Equal("`boo`", cb.QuoteIdentifier("`boo`")); - - // now do the unquoting - Assert.Equal("boo", cb.UnquoteIdentifier("`boo`")); - Assert.Equal("`boo", cb.UnquoteIdentifier("`boo")); - Assert.Equal("bo`o", cb.UnquoteIdentifier("`bo``o`")); - } - } -} diff --git a/Tests/MySql.Data.Tests/MySqlCommandTests.cs b/Tests/MySql.Data.Tests/MySqlCommandTests.cs deleted file mode 100644 index b8aaaa123..000000000 --- a/Tests/MySql.Data.Tests/MySqlCommandTests.cs +++ /dev/null @@ -1,690 +0,0 @@ -// Copyright © 2013, 2015 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using Xunit; -using System.Data; -using System.Diagnostics; -using System.Threading.Tasks; - -namespace MySql.Data.MySqlClient.Tests -{ - public class MySqlCommandTests : TestBase - { - protected TestSetup ts; - - public MySqlCommandTests(TestSetup setup) : base(setup, "command") - { - ts = setup; - customConnection = new MySqlConnection(ts.GetConnection(false).ConnectionString + ";" + OnGetConnectionStringInfo()); - customConnection.Open(); - } - - - protected MySqlCommandTests(TestSetup setup, string nameSpace) : base(setup, nameSpace) - { - ts = setup; - customConnection = new MySqlConnection(ts.GetConnection(false).ConnectionString + ";" + OnGetConnectionStringInfo()); - customConnection.Open(); - } - - /// - /// Tests for MySql bug #64633 - System.InvalidCastException when executing a stored function. - /// - [Fact] - public void InvalidCast() - { - executeAsRoot(String.Format("CREATE FUNCTION `{0}`.`MyTwice`( val int ) RETURNS INT BEGIN return val * 2; END;", Settings.Database)); - executeAsRoot(String.Format("CREATE PROCEDURE `{0}`.`spMyTwice`( out result int, val int ) BEGIN set result = val * 2; END;", Settings.Database)); - string user = CreateUser("1", "123"); - executeAsRoot(String.Format("GRANT EXECUTE ON FUNCTION `{0}`.`MyTwice` TO '{1}'@'localhost';", Settings.Database, user)); - executeAsRoot(String.Format("GRANT EXECUTE ON PROCEDURE `{0}`.`spMyTwice` TO '{1}'@'localhost'", Settings.Database, user)); - executeAsRoot("GRANT SELECT ON TABLE mysql.proc TO 'user1'@'localhost'"); - executeAsRoot("FLUSH PRIVILEGES"); - - MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(customConnection.ConnectionString); - connStr.UserID = user; - connStr.Password = "123"; - MySqlConnection con = new MySqlConnection(connStr.GetConnectionString(true)); - - // Invoke the function - var cmd = con.CreateCommand(); - using (con) - { - con.Open(); - cmd.CommandText = "MyTwice"; - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.Add(new MySqlParameter("val", System.DBNull.Value)); - cmd.Parameters.Add("@p", MySqlDbType.Int32); - cmd.Parameters[1].Direction = ParameterDirection.ReturnValue; - cmd.Parameters[0].Value = 20; - cmd.ExecuteNonQuery(); - Assert.Equal(cmd.Parameters[1].Value, 40); - - cmd.CommandText = "spMyTwice"; - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.Clear(); - cmd.Parameters.Add(new MySqlParameter("result", System.DBNull.Value)); - cmd.Parameters.Add("val", MySqlDbType.Int32); - cmd.Parameters[0].Direction = ParameterDirection.Output; - cmd.Parameters[1].Value = 20; - cmd.ExecuteNonQuery(); - Assert.Equal(cmd.Parameters[0].Value, 40); - } - } - - - [Fact] - public void InsertTest() - { - executeSQL("CREATE TABLE Test (id int NOT NULL, name VARCHAR(100))"); - // do the insert - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id,name) VALUES(10,'Test')", customConnection); - int cnt = cmd.ExecuteNonQuery(); - Assert.True(cnt == 1, "Insert Count"); - - // make sure we get the right value back out - cmd.CommandText = "SELECT name FROM Test WHERE id=10"; - string name = (string)cmd.ExecuteScalar(); - Assert.True(name == "Test", "Insert result"); - - // now do the insert with parameters - cmd.CommandText = "INSERT INTO Test (id,name) VALUES(?id, ?name)"; - cmd.Parameters.Add(new MySqlParameter("?id", 11)); - cmd.Parameters.Add(new MySqlParameter("?name", "Test2")); - cnt = cmd.ExecuteNonQuery(); - Assert.True(cnt == 1, "Insert with Parameters Count"); - - // make sure we get the right value back out - cmd.Parameters.Clear(); - cmd.CommandText = "SELECT name FROM Test WHERE id=11"; - name = (string)cmd.ExecuteScalar(); - Assert.True(name == "Test2", "Insert with parameters result"); - } - - [Fact] - public void UpdateTest() - { - executeSQL("CREATE TABLE Test (id int NOT NULL, name VARCHAR(100))"); - executeSQL("INSERT INTO Test (id,name) VALUES(10, 'Test')"); - executeSQL("INSERT INTO Test (id,name) VALUES(11, 'Test2')"); - - // do the update - MySqlCommand cmd = new MySqlCommand("UPDATE Test SET name='Test3' WHERE id=10 OR id=11", customConnection); - int cnt = cmd.ExecuteNonQuery(); - Assert.Equal(2, cnt); - - // make sure we get the right value back out - cmd.CommandText = "SELECT name FROM Test WHERE id=10"; - string name = (string)cmd.ExecuteScalar(); - Assert.Equal("Test3", name); - - cmd.CommandText = "SELECT name FROM Test WHERE id=11"; - name = (string)cmd.ExecuteScalar(); - Assert.Equal("Test3", name); - - // now do the update with parameters - cmd.CommandText = "UPDATE Test SET name=?name WHERE id=?id"; - cmd.Parameters.Add(new MySqlParameter("?id", 11)); - cmd.Parameters.Add(new MySqlParameter("?name", "Test5")); - cnt = cmd.ExecuteNonQuery(); - Assert.True(cnt == 1, "Update with Parameters Count"); - - // make sure we get the right value back out - cmd.Parameters.Clear(); - cmd.CommandText = "SELECT name FROM Test WHERE id=11"; - name = (string)cmd.ExecuteScalar(); - Assert.Equal("Test5", name); - } - - [Fact] - public void DeleteTest() - { - executeSQL("CREATE TABLE Test (id int NOT NULL, name VARCHAR(100))"); - executeSQL("INSERT INTO Test (id, name) VALUES(1, 'Test')"); - executeSQL("INSERT INTO Test (id, name) VALUES(2, 'Test2')"); - - // make sure we get the right value back out - MySqlCommand cmd = new MySqlCommand("DELETE FROM Test WHERE id=1 or id=2", customConnection); - int delcnt = cmd.ExecuteNonQuery(); - Assert.Equal(2, delcnt); - - // find out how many rows we have now - cmd.CommandText = "SELECT COUNT(*) FROM Test"; - object after_cnt = cmd.ExecuteScalar(); - Assert.Equal(0, Convert.ToInt32(after_cnt)); - } - - [Fact] - public void CtorTest() - { - executeSQL("CREATE TABLE Test (id int NOT NULL, name VARCHAR(100))"); - MySqlTransaction txn = connection.BeginTransaction(); - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", customConnection); - - MySqlCommand clone = new MySqlCommand(cmd.CommandText, (MySqlConnection)cmd.Connection, - (MySqlTransaction)cmd.Transaction); - clone.Parameters.AddWithValue("?test", 1); - txn.Rollback(); - } - - [Fact] - public void TableWithOVer100Columns() - { - string sql = "create table IF NOT EXISTS zvan (id int(8) primary key " + - "unique auto_increment, name varchar(250)) ENGINE=INNODB; "; - /* "create table IF NOT EXISTS ljudyna (id int(8) primary key " + - "unique auto_increment, name varchar(250), data_narod date, " + - "id_in_zvan int(8), kandidat varchar(250), tel_rob_vn varchar(250), " + - "tel_rob_mis varchar(250), n_kabin varchar(250), n_nak_zvan varchar(250), " + - "d_nak_zvan date, sex tinyint(1), n_nak_pos varchar(250), " + - "d_nak_pos date, posad_data varchar(250), visl1 varchar(250), visl2 " + - "varchar(250), visl3 varchar(250), cpidr_f int(8), cposad_f int(8), sumis " + - "tinyint(1), zs_s date, zs_po date, ovs_z date, ovs_po date, naiavn_zviln " + - "tinyint(1), ovs_z1 date, ovs_po1 date, ovs_z2 date, ovs_po2 date, ovs_z3 date, " + - "ovs_po3 date, ovs_prakt varchar(250), data_atest date, data_sp date, v_akad_z " + - "date, z_akad_zvln tinyint(1), v_akad_period varchar(250), nauk_stup " + - "varchar(250), vch_zvan varchar(250), n_sprav varchar(250), n_posv varchar(250), " + - "nacional varchar(250), osvita varchar(250), osvita_zakin_sho varchar(250), " + - "osvita_zakin_koli date, osvita_special varchar(250), osvita_kvalifikac " + - "varchar(250), de_navchaet varchar(250), data_vstupu date, termin_navch " + - "varchar(250), adresa varchar(250), tel_dom varchar(250), marka_avto " + - "varchar(250), n_avto varchar(250), color_avto varchar(250), vikor_avto " + - "varchar(250), posv_avto varchar(250), marka_zbr varchar(250), nomer_calibr_zbr " + - "varchar(250), vid_zbr varchar(250), nomer_data_razreshen varchar(250), pasport " + - "varchar(250), oklad1 varchar(250), prem07_2003 varchar(250), nadb07_2003 " + - "varchar(250), osob_nom varchar(250), nadbavka_stag_max varchar(250), " + - "nadbavka_stag_08_2003 varchar(250), nadbavka_stag_10_2003 varchar(250), " + - "nadbavka_stag_11_2003 varchar(250), nadbavka_stag_02_2004 varchar(250), " + - "vidp_vikoristav varchar(250), vidp_plan varchar(250), vidp_vidgil varchar(250), " + - "vidp_nevidgil_dniv varchar(250), nadb111 varchar(250), prem_3_1 varchar(250), " + - "nadb_4_1 varchar(250), prem_3_2 varchar(250), nadb_3_2 varchar(250), nedolos " + - "varchar(250), sposl int(8), cposl int(8), czaoh int(8), 07_2003_oklad " + - "varchar(250), 05_2003_oklad varchar(250), deti_jeni varchar(250), nadb_volny " + - "varchar(250), prem_volny varchar(250), dispanser tinyint(1), posl_spisok " + - "tinyint(1), anketa_avtobiogr tinyint(1), photokartka tinyint(1), sp1 tinyint(1), " + - "inshe varchar(250), oklad2 varchar(250), slugbova tinyint(1), atestuvan " + - "varchar(250), 09_2004_oklad_vstan varchar(250), golosuvannia varchar(250), " + - "stag_kalendar varchar(250), data_stag_kalendar varchar(250), medali " + - "varchar(250), medali_mae varchar(250), visluga_cal_ovs_and_zs varchar(250), " + - "FOREIGN KEY (id_in_zvan) REFERENCES zvan(id) ON DELETE CASCADE ON UPDATE " + - "CASCADE) TYPE=INNODB DEFAULT CHARACTER SET cp1251 COLLATE cp1251_ukrainian_ci"; - */ - - MySqlCommand cmd = new MySqlCommand(sql, customConnection); - cmd.ExecuteNonQuery(); - } - - /// - /// Bug #12245 using Prepare() on an insert command causes null parameters to convert to "0" - /// - [Fact] - public virtual void InsertingPreparedNulls() - { - executeSQL("CREATE TABLE Test (id int NOT NULL, name VARCHAR(100))"); - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1, ?str)", customConnection); - cmd.Parameters.Add("?str", MySqlDbType.VarChar); - cmd.Prepare(); - - cmd.Parameters[0].Value = null; - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.Read()); - Assert.Equal(DBNull.Value, reader[1]); - } - } - - /// - /// MySQL Bugs: #12163: Insert using prepared statement causes double insert - /// - [Fact] - public void PreparedInsertUsingReader() - { - executeSQL("CREATE TABLE Test (id int NOT NULL, name VARCHAR(100))"); - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1, 'Test')", customConnection); - cmd.Prepare(); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - } - - cmd.CommandText = "SELECT * FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.Read()); - Assert.False(reader.Read()); - Assert.False(reader.NextResult()); - } - } - - /// - /// Bug #7248 There is already an open DataReader associated with this Connection which must - /// - //[Fact] - //public void GenWarnings() - //{ - // executeSQL("CREATE TABLE Test (id INT, dt DATETIME)"); - // executeSQL("INSERT INTO Test VALUES (1, NOW())"); - // executeSQL("INSERT INTO Test VALUES (2, NOW())"); - // executeSQL("INSERT INTO Test VALUES (3, NOW())"); - - // MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test WHERE dt = '" + - // DateTime.Now + "'", connection); - // DataSet ds = new DataSet(); - // da.Fill(ds); - //} - - /// - /// Bug #11991 ExecuteScalar - /// - [Fact] - public void CloseReaderAfterFailedConvert() - { - executeSQL("CREATE TABLE Test (dt DATETIME)"); - executeSQL("INSERT INTO Test VALUES ('00-00-0000 00:00:00')"); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", customConnection); - try - { - cmd.ExecuteScalar(); - } - catch (Exception) - { - } - - connection.BeginTransaction(); - } - - /// - /// Bug #25443 ExecuteScalar() hangs when more than one bad result - /// - [Fact] - public void ExecuteWithOneBadQuery() - { - MySqlCommand command = new MySqlCommand("SELECT 1; SELECT * FROM foo", customConnection); - try - { - command.ExecuteScalar(); - } - catch (MySqlException) - { - } - - // now try using ExecuteNonQuery - try - { - command.ExecuteNonQuery(); - } - catch (MySqlException) - { - } - } - - /// - /// Bug #27958 Cannot use Data Source Configuration Wizard on large databases - /// - [Fact] - public void DefaultCommandTimeout() - { - MySqlConnection c = new MySqlConnection("server=localhost"); - MySqlCommand cmd = new MySqlCommand("", c); - Assert.Equal(30, cmd.CommandTimeout); - - c = new MySqlConnection("server=localhost;default command timeout=47"); - cmd = new MySqlCommand("", c); - Assert.Equal(47, cmd.CommandTimeout); - - cmd = new MySqlCommand(""); - Assert.Equal(30, cmd.CommandTimeout); - - cmd.CommandTimeout = 66; - cmd.Connection = c; - Assert.Equal(66, cmd.CommandTimeout); - cmd.CommandTimeout = 0; - Assert.Equal(0, cmd.CommandTimeout); - - c = new MySqlConnection("server=localhost;default command timeout=0"); - cmd = new MySqlCommand("", c); - Assert.Equal(0, cmd.CommandTimeout); - } - - /// - /// Bug #38276 Short circuit evaluation error in MySqlCommand.CheckState() - /// - [Fact] - public void SetNullConnection() - { - MySqlCommand command = new MySqlCommand(); - command.CommandText = "SELECT 1"; - command.Connection = null; - try - { - object o = command.ExecuteScalar(); - } - catch (InvalidOperationException) - { - } - } - - /// - /// Bug #45941 SQL-Injection attack - /// - [Fact] - public void SqlInjection1() - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test(name VARCHAR(100)) ENGINE=MyISAM DEFAULT CHARSET=utf8"); - executeSQL("INSERT INTO Test VALUES ('name1'), ('name2'), ('name3')"); - - MySqlCommand cnt = new MySqlCommand("SELECT COUNT(*) FROM Test", customConnection); - Int64 count = (Int64)cnt.ExecuteScalar(); - - MySqlCommand cmd = new MySqlCommand("DELETE FROM Test WHERE name=?name", customConnection); - cmd.Parameters.Add("?name", MySqlDbType.VarChar); - cmd.Parameters[0].Value = "\u2032 OR 1=1;-- --"; - cmd.ExecuteNonQuery(); - - Assert.Equal(count, (Int64)cnt.ExecuteScalar()); - } - - /// - /// Bug #44194 ExecuteNonQuery for update commands does not match actual rows updated - /// - [Fact] - public void UseAffectedRows() - { - executeSQL("CREATE TABLE Test (id INT, name VARCHAR(20))"); - executeSQL("INSERT INTO Test VALUES (1, 'A')"); - executeSQL("INSERT INTO Test VALUES (2, 'B')"); - executeSQL("INSERT INTO Test VALUES (3, 'C')"); - - MySqlCommand cmd = new MySqlCommand("UPDATE Test SET name='C' WHERE id=3", customConnection); - Assert.Equal(1, cmd.ExecuteNonQuery()); - - MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(Settings.GetConnectionString(true)); - connStr.UseAffectedRows = true; - using (MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true))) - { - c.Open(); - cmd.Connection = c; - Assert.Equal(0, cmd.ExecuteNonQuery()); - } - } - - /// - /// Bug #45502 error if "Allow Batch=False" - /// - [Fact] - public void DontAllowBatching() - { - MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(Settings.GetConnectionString(true)); - connStr.AllowBatch = false; - connStr.CharacterSet = "utf8"; - using (MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true))) - { - c.Open(); - MySqlCommand cmd = new MySqlCommand("SELECT 1", c); - cmd.ExecuteScalar(); - } - } - - [Fact] - public void TableCommandType() - { - executeSQL("CREATE TABLE Test (id INT, name VARCHAR(20))"); - executeSQL("INSERT INTO Test VALUES (1, 'A')"); - executeSQL("CREATE TABLE Test1 (id INT, name VARCHAR(20))"); - executeSQL("INSERT INTO Test1 VALUES (2, 'B')"); - - MySqlCommand cmd = new MySqlCommand("Test,Test1", customConnection); - cmd.CommandType = CommandType.TableDirect; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - Assert.Equal(1, reader.GetInt32(0)); - Assert.Equal("A", reader.GetString(1)); - Assert.Equal(2, reader.GetInt32(2)); - Assert.Equal("B", reader.GetString(3)); - } - } - - /// - /// Bug #57501 MySql Connector/NET 6.3.5.0 fails to read from DataReader - /// - [Fact] - public void HelperTest() - { - string connStr = connection.ConnectionString; - using (MySqlDataReader reader = MySqlHelper.ExecuteReader(connStr, "SHOW TABLES")) - { - while (reader.Read()) - { - } - } - } - - /// - /// Bug #58652 ExecuteReader throws NullReferenceException when using CommandBehavior.Close - /// - [Fact] - public void SyntaxErrorWithCloseConnection() - { - MySqlConnection c = new MySqlConnection(customConnection.ConnectionString); - c.Open(); - MySqlCommand cmd = new MySqlCommand("SELE 1", c); - var exception = Record.Exception(() => cmd.ExecuteReader(CommandBehavior.CloseConnection)); - Assert.NotNull(exception); - Assert.IsType(exception); - MySqlException ex = exception as MySqlException; - Assert.Equal("You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELE 1' at line 1", ex.Message); - Assert.True(c.State == ConnectionState.Closed); - } - - /// - /// Bug #59537 Different behavior from console and - /// - [Fact] - public void EmptyOrJustSemiCommand() - { - MySqlCommand cmd = new MySqlCommand("", customConnection); - cmd.CommandText = ";"; - MySqlException ex = Assert.Throws(() => cmd.ExecuteNonQuery()); - // Error: 1065 Message: Query was empty - Assert.Equal(1065, ex.Number); - } - - /// - /// MySql Bug #64092, Oracle bug #13624659 - /// If MySqlCommand.CommandText equal to null, then MySqlCommand.ExecuteReader() - /// throw NullReferenceException instead of InvalidOperationException. - /// - [Fact] - public void CommandTextIsNull() - { - MySqlCommand cmd = new MySqlCommand(null, customConnection); - Exception ex = Assert.Throws(() => cmd.ExecuteReader()); - Assert.True(ex.Message != String.Empty); - } - - /// - /// Tests fix for http://bugs.mysql.com/bug.php?id=65452 / http://clustra.no.oracle.com/orabugs/14171960 - /// (MySqlCommand.LastInsertedId can only have 32 bit values but has type long). - /// - [Fact] - public void LongLastInsertId() - { - string sql = @"CREATE TABLE longids (id BIGINT NOT NULL AUTO_INCREMENT, PRIMARY KEY (id)); - alter table longids AUTO_INCREMENT = 2147483640;"; - MySqlCommand cmd = new MySqlCommand(sql, customConnection); - cmd.ExecuteNonQuery(); - long seed = 2147483640; - for (int i = 1; i < 10; ++i) - { - cmd.CommandText = "INSERT INTO longids VALUES ();"; - cmd.ExecuteNonQuery(); - Assert.Equal(seed++, cmd.LastInsertedId); - } - } - - #region Async - [Fact] - public async Task ExecuteNonQueryAsync() - { - executeSQL("CREATE TABLE CMDNonQueryAsyncTest (id int)"); - executeSQL("CREATE PROCEDURE CMDNonQueryAsyncSpTest() BEGIN SET @x=0; REPEAT INSERT INTO CMDNonQueryAsyncTest VALUES(@x); SET @x=@x+1; UNTIL @x = 100 END REPEAT; END"); - - MySqlCommand proc = new MySqlCommand("CMDNonQueryAsyncSpTest", customConnection); - proc.CommandType = CommandType.StoredProcedure; - int result = await proc.ExecuteNonQueryAsync(); - - Assert.NotEqual(-1, result); - - MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM CMDNonQueryAsyncTest;", customConnection); - cmd.CommandType = CommandType.Text; - object cnt = cmd.ExecuteScalar(); - Assert.Equal(100, Convert.ToInt32(cnt)); - } - - [Fact] - public async Task ExecuteReaderAsync() - { - executeSQL("CREATE TABLE CMDReaderAsyncTest (id int)"); - executeSQL("CREATE PROCEDURE CMDReaderAsyncSpTest() BEGIN INSERT INTO CMDReaderAsyncTest VALUES(1); SELECT SLEEP(2); SELECT 'done'; END"); - - MySqlCommand proc = new MySqlCommand("CMDReaderAsyncSpTest", customConnection); - proc.CommandType = CommandType.StoredProcedure; - - using (MySqlDataReader reader = await proc.ExecuteReaderAsync() as MySqlDataReader) - { - Assert.NotNull(reader); - Assert.True(reader.Read(), "can read"); - Assert.True(reader.NextResult()); - Assert.True(reader.Read()); - Assert.Equal("done", reader.GetString(0)); - reader.Close(); - - proc.CommandType = CommandType.Text; - proc.CommandText = "SELECT COUNT(*) FROM CMDReaderAsyncTest"; - object cnt = proc.ExecuteScalar(); - Assert.Equal(1, Convert.ToInt32(cnt)); - } - } - - [Fact] - public async Task ExecuteScalarAsync() - { - executeSQL("CREATE PROCEDURE CMDScalarAsyncSpTest( IN valin VARCHAR(50), OUT valout VARCHAR(50) ) BEGIN SET valout=valin; SELECT 'Test'; END"); - - MySqlCommand cmd = new MySqlCommand("CMDScalarAsyncSpTest", customConnection); - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.AddWithValue("?valin", "valuein"); - cmd.Parameters.Add(new MySqlParameter("?valout", MySqlDbType.VarChar)); - cmd.Parameters[1].Direction = ParameterDirection.Output; - - object result = await cmd.ExecuteScalarAsync(); - Assert.Equal("Test", result); - Assert.Equal("valuein", cmd.Parameters[1].Value); - } - #endregion - - #region Not Core Compatible - -#if !NETCORE10 - - /// - /// Bug #59616 Only INSERTs are batched - /// - [Fact] - public void BatchUpdatesAndDeletes() - { - executeSQL("CREATE TABLE test (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20))"); - executeSQL("INSERT INTO test VALUES (1, 'boo'), (2, 'boo'), (3, 'boo')"); - - MySqlTrace.Listeners.Clear(); - MySqlTrace.Switch.Level = SourceLevels.All; - GenericListener listener = new GenericListener(); - MySqlTrace.Listeners.Add(listener); - - var connectionStringCustom = customConnection.ConnectionString; - - MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(connectionStringCustom); - connStr.AllowBatch = true; - connStr.Logging = true; - using (MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true))) - { - c.Open(); - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM test", c); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - da.UpdateCommand = cb.GetUpdateCommand(); - da.UpdateCommand.UpdatedRowSource = UpdateRowSource.None; - da.UpdateBatchSize = 100; - - DataTable dt = new DataTable(); - da.Fill(dt); - - dt.Rows[0]["name"] = "boo2"; - dt.Rows[1]["name"] = "boo2"; - dt.Rows[2]["name"] = "boo2"; - da.Update(dt); - } - - Assert.Equal(1, listener.Find("Query Opened: UPDATE")); - } - - [Fact] - public void ExecuteReaderReturnsReaderAfterCancel() - { - executeSQL("CREATE TABLE TableWithDateAsPrimaryKey(PrimaryKey date NOT NULL, PRIMARY KEY (PrimaryKey)) ENGINE=InnoDB"); - executeSQL("CREATE TABLE TableWithStringAsPrimaryKey(PrimaryKey nvarchar(50) NOT NULL, PRIMARY KEY (PrimaryKey)) ENGINE=InnoDB"); - - MySqlCommand command = new MySqlCommand("SELECT PrimaryKey FROM TableWithDateAsPrimaryKey", customConnection); - IDataReader reader = command.ExecuteReader(CommandBehavior.KeyInfo); - DataTable dataTableSchema = reader.GetSchemaTable(); - command.Cancel(); - reader.Close(); - - command = new MySqlCommand("SELECT PrimaryKey FROM TableWithStringAsPrimaryKey", customConnection); - reader = command.ExecuteReader(CommandBehavior.KeyInfo); - Assert.NotNull(reader); - - dataTableSchema = reader.GetSchemaTable(); - Assert.True("PrimaryKey" == (string)dataTableSchema.Rows[0][dataTableSchema.Columns[0]]); - reader.Close(); - } - - [Fact] - public void CloneCommand() - { - MySqlCommand cmd = new MySqlCommand(); - MySqlCommand newCommand = cmd.Clone(); - IDbCommand newCommand2 = (IDbCommand)(cmd as ICloneable).Clone(); - } - - - -#endif - #endregion - - } -} diff --git a/Tests/MySql.Data.Tests/MySqlConnectionStringBuilderTests.cs b/Tests/MySql.Data.Tests/MySqlConnectionStringBuilderTests.cs deleted file mode 100644 index 239cc7c2f..000000000 --- a/Tests/MySql.Data.Tests/MySqlConnectionStringBuilderTests.cs +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; - -namespace MySql.Data.MySqlClient.Tests -{ - public class MySqlConnectionStringBuilderTests : TestBase - { - public MySqlConnectionStringBuilderTests(TestSetup setup) : base(setup, "string-builder") - { - } - - [Fact] - public void Simple() - { - MySqlConnectionStringBuilder sb = null; - sb = new MySqlConnectionStringBuilder(); - sb.ConnectionString = "server=localhost;uid=reggie;pwd=pass;port=1111;" + - "connection timeout=23; pooling=true; min pool size=33; " + - "max pool size=66;keepalive=1"; - Assert.Equal("localhost", sb.Server); - Assert.Equal("reggie", sb.UserID); - Assert.Equal("pass", sb.Password); - Assert.Equal(1111, Convert.ToInt32(sb.Port)); - Assert.Equal(23, Convert.ToInt32(sb.ConnectionTimeout)); - Assert.True(sb.Pooling); - Assert.Equal(33, Convert.ToInt32(sb.MinimumPoolSize)); - Assert.Equal(66, Convert.ToInt32(sb.MaximumPoolSize)); - Assert.Equal(1, Convert.ToInt32(sb.Keepalive)); - Exception ex = Assert.Throws(()=> (sb.ConnectionString = "server=localhost;badkey=badvalue")); - Assert.Equal($"Keyword not supported.{Environment.NewLine}Parameter name: badkey", ex.Message); - sb.Clear(); - Assert.Equal(15, Convert.ToInt32(sb.ConnectionTimeout)); - Assert.Equal(true, sb.Pooling); - Assert.Equal(3306, Convert.ToInt32(sb.Port)); - Assert.Equal(String.Empty, sb.Server); - Assert.Equal(false, sb.PersistSecurityInfo); - Assert.Equal(0, Convert.ToInt32(sb.ConnectionLifeTime)); - Assert.False(sb.ConnectionReset); - Assert.Equal(0, Convert.ToInt32(sb.MinimumPoolSize)); - Assert.Equal(100, Convert.ToInt32(sb.MaximumPoolSize)); - Assert.Equal(String.Empty, sb.UserID); - Assert.Equal(String.Empty, sb.Password); - Assert.Equal(false, sb.UseUsageAdvisor); - Assert.Equal(String.Empty, sb.CharacterSet); - Assert.Equal(false, sb.UseCompression); - Assert.Equal("MYSQL", sb.PipeName); - Assert.False(sb.Logging); - Assert.False(sb.UseOldSyntax); - Assert.True(sb.AllowBatch); - Assert.False(sb.ConvertZeroDateTime); - Assert.Equal("MYSQL", sb.SharedMemoryName); - Assert.Equal(String.Empty, sb.Database); - Assert.Equal(MySqlConnectionProtocol.Sockets, sb.ConnectionProtocol); - Assert.False(sb.AllowZeroDateTime); - Assert.False(sb.UsePerformanceMonitor); - Assert.Equal(25, Convert.ToInt32(sb.ProcedureCacheSize)); - Assert.Equal(0, Convert.ToInt32(sb.Keepalive)); - } - - /// - /// Bug #37955 Connector/NET keeps adding the same option to the connection string - /// - [Fact] - public void SettingValueMultipeTimes() - { - MySqlConnectionStringBuilder s = new MySqlConnectionStringBuilder(); - s["database"] = "test"; - s["database"] = "test2"; - Assert.Equal("database=test2", s.ConnectionString); - } - - [Fact] - public void EncryptKeyword() - { - string connStr = "database=test;uid=root;server=localhost;encrypt=yes"; - MySqlConnectionStringBuilder sb = new MySqlConnectionStringBuilder(connStr); - } - - /// - /// Bug #51209 error on parameter without value on connectionstring - /// - [Fact] - public void NoValueGivenForConnectionStringOption() - { - MySqlConnectionStringBuilder s = new MySqlConnectionStringBuilder(); - s.ConnectionString = "compress=;pooling="; - Assert.False(s.UseCompression); - Assert.True(s.Pooling); - } - - /// - /// Bug #59835 .Net Connector MySqlConnectionStringBuilder wrong result ContainsKey function - /// - [Fact] - public void ContainsKey() - { - MySqlConnectionStringBuilder s = new MySqlConnectionStringBuilder(); - s["database"] = "test"; - Assert.True(s.ContainsKey("initial catalog")); - s["server"] = "myserver"; - Assert.True(s.ContainsKey("server")); - Assert.True(s.ContainsKey("host")); - Assert.False(s.ContainsKey("badkey")); - } - - [Fact] - public void UseProcedureBodiesSettingCheckParameters() - { - MySqlConnectionStringBuilder s = new MySqlConnectionStringBuilder("server=localhost;use procedure bodies=false"); - Assert.False(s.CheckParameters); - } - - [Fact] - public void EncrpytSslmode() - { - MySqlConnectionStringBuilder s = new MySqlConnectionStringBuilder("server=localhost;encrypt=true"); - Assert.Equal(s.SslMode, MySqlSslMode.Preferred); - } - - [Fact] - public void SettingInvalidKeyThrowsArgumentException() - { - MySqlConnectionStringBuilder s = new MySqlConnectionStringBuilder(); - //[ExpectedException(typeof(ArgumentException))] - Exception ex = Assert.Throws(() => (s["foo keyword"] = "foo")); - Assert.Equal($"Keyword not supported.{Environment.NewLine}Parameter name: foo keyword", ex.Message); - } - - /// - /// Bug #66880 Keyword not supported. Parameter name: AttachDbFilename. - /// - [Fact] - public void SafeTryGetValue() - { - object obj; - MySqlConnectionStringBuilder s = new MySqlConnectionStringBuilder("server=localhost;"); - s.TryGetValue("unknownproperty", out obj); - Assert.Equal(null, obj); - } - - } -} diff --git a/Tests/MySql.Data.Tests/MySqlConnectionTests.cs b/Tests/MySql.Data.Tests/MySqlConnectionTests.cs deleted file mode 100644 index 29322378d..000000000 --- a/Tests/MySql.Data.Tests/MySqlConnectionTests.cs +++ /dev/null @@ -1,885 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Data; -using System.Threading.Tasks; -using Xunit; - - -namespace MySql.Data.MySqlClient.Tests -{ - public class MySqlConnectionTests : TestBase - { - - protected TestSetup ts; - public MySqlConnectionTests(TestSetup setup) : base(setup, "connection") - { - ts = setup; - } - - [Fact] - public void TestConnectionStrings() - { - MySqlConnection c = new MySqlConnection(); - - // public properties - Assert.True(15 == c.ConnectionTimeout, "ConnectionTimeout"); - Assert.True(String.Empty == c.Database, "Database"); - Assert.True(String.Empty == c.DataSource, "DataSource"); - Assert.True(false == c.UseCompression, "Use Compression"); - Assert.True(System.Data.ConnectionState.Closed == c.State, "State"); - - c = new MySqlConnection("connection timeout=25; user id=myuser; " + - "password=mypass; database=Test;server=myserver; use compression=true; " + - "pooling=false;min pool size=5; max pool size=101"); - - // public properties - Assert.True(25 == c.ConnectionTimeout, "ConnectionTimeout"); - Assert.True("Test" == c.Database, "Database"); - Assert.True("myserver" == c.DataSource, "DataSource"); - Assert.True(true == c.UseCompression, "Use Compression"); - Assert.True(System.Data.ConnectionState.Closed == c.State, "State"); - - c.ConnectionString = "connection timeout=15; user id=newuser; " + - "password=newpass; port=3308; database=mydb; data source=myserver2; " + - "use compression=true; pooling=true; min pool size=3; max pool size=76"; - - // public properties - Assert.True(15 == c.ConnectionTimeout, "ConnectionTimeout"); - Assert.True("mydb" == c.Database, "Database"); - Assert.True("myserver2" == c.DataSource, "DataSource"); - Assert.True(true == c.UseCompression, "Use Compression"); - Assert.True(System.Data.ConnectionState.Closed == c.State, "State"); - } - - - [Fact] - public void TestConnectingSocketBadUserName() - { - MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(connection.ConnectionString); - connStr.UserID = "bad_one"; - MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true)); - var exception = Record.Exception(() => c.Open()); - Assert.NotNull(exception); - Assert.IsType(exception); - } - - [Fact] - public void TestConnectingSocketBadDbName() - { - MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(connection.ConnectionString); - connStr.Password = "bad_pwd"; - MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true)); - var exception = Record.Exception(() => c.Open()); - Assert.NotNull(exception); - Assert.IsType(exception); - } - - [Fact] - public void TestPersistSecurityInfoCachingPasswords() - { - MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(connection.ConnectionString); - - // Persist Security Info = true means that it should be returned - connStr.PersistSecurityInfo = true; - MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true)); - c.Open(); - c.Close(); - MySqlConnectionStringBuilder afterOpenSettings = new MySqlConnectionStringBuilder(c.ConnectionString); - Assert.Equal(connStr.Password, afterOpenSettings.Password); - - // Persist Security Info = false means that it should not be returned - connStr.PersistSecurityInfo = false; - c = new MySqlConnection(connStr.GetConnectionString(true)); - c.Open(); - c.Close(); - afterOpenSettings = new MySqlConnectionStringBuilder(c.ConnectionString); - Assert.True(String.IsNullOrEmpty(afterOpenSettings.Password)); - } - - [Fact] - public void ChangeDatabase() - { - MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(connection.ConnectionString); - MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true)); - using (c) - { - c.Open(); - Assert.True(c.State == ConnectionState.Open); - Assert.Equal(connStr.Database, c.Database); - - string dbName = CreateDatabase("db1"); - c.ChangeDatabase(dbName); - Assert.Equal(dbName, c.Database); - } - } - - [Fact] - public void ConnectionTimeout() - { - MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(connection.ConnectionString); - connStr.Server = "bad_host"; - connStr.ConnectionTimeout = 5; - MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true)); - - DateTime start = DateTime.Now; - var exception = Record.Exception(() => c.Open()); - Assert.NotNull(exception); - TimeSpan diff = DateTime.Now.Subtract(start); - Assert.True(diff.TotalSeconds < 10, "Timeout exceeded"); - } - - /* [Fact] - public void AnonymousLogin() - { - suExecSQL(String.Format("GRANT ALL ON *.* to ''@'{0}' IDENTIFIED BY 'set_to_blank'", host)); - suExecSQL("UPDATE mysql.user SET password='' WHERE password='set_to_blank'"); - - MySqlConnection c = new MySqlConnection(String.Empty); - c.Open(); - c.Close(); - } - */ - [Fact] - public void ConnectInVariousWays() - { - // connect with no db - MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(connection.ConnectionString); - connStr.Database = null; - MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true)); - c.Open(); - c.Close(); - - executeAsRoot("GRANT ALL ON *.* to 'nopass'@'%'"); - executeAsRoot("GRANT ALL ON *.* to 'nopass'@'localhost'"); - executeAsRoot("FLUSH PRIVILEGES"); - - // connect with no password - connStr.UserID = "nopass"; - connStr.Password = null; - c = new MySqlConnection(connStr.GetConnectionString(true)); - c.Open(); - c.Close(); - - connStr.Password = ""; - c = new MySqlConnection(connStr.GetConnectionString(true)); - c.Open(); - c.Close(); - } - - [Fact] - public void ConnectingAsUTF8() - { - MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(connection.ConnectionString); - connStr.CharacterSet = "utf8"; - using (MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true))) - { - c.Open(); - - MySqlCommand cmd = new MySqlCommand( - "CREATE TABLE test (id varbinary(16), active bit) CHARACTER SET utf8", c); - cmd.ExecuteNonQuery(); - cmd.CommandText = "INSERT INTO test (id, active) VALUES (CAST(0x1234567890 AS Binary), true)"; - cmd.ExecuteNonQuery(); - cmd.CommandText = "INSERT INTO test (id, active) VALUES (CAST(0x123456789a AS Binary), true)"; - cmd.ExecuteNonQuery(); - cmd.CommandText = "INSERT INTO test (id, active) VALUES (CAST(0x123456789b AS Binary), true)"; - cmd.ExecuteNonQuery(); - } - - using (MySqlConnection d = new MySqlConnection(connStr.GetConnectionString(true))) - { - d.Open(); - - MySqlCommand cmd2 = new MySqlCommand("SELECT id, active FROM test", d); - using (MySqlDataReader reader = cmd2.ExecuteReader()) - { - Assert.True(reader.Read()); - Assert.True(reader.GetBoolean(1)); - } - } - } - - /// - /// Bug #10281 Clone issue with MySqlConnection - /// Bug #27269 MySqlConnection.Clone does not mimic SqlConnection.Clone behaviour - /// - [Fact] - public void TestConnectionCloneRetainsPassword() - { - MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(connection.ConnectionString); - connStr.PersistSecurityInfo = false; - - MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true)); - c.Open(); - c.Close(); - MySqlConnection clone = (MySqlConnection)c.Clone(); - clone.Open(); - clone.Close(); - } - - /// - /// Bug #13321 Persist security info does not woek - /// - [Fact] - public void PersistSecurityInfo() - { - MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(connection.ConnectionString); - connStr.PersistSecurityInfo = false; - - Assert.False(String.IsNullOrEmpty(connStr.Password)); - MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true)); - c.Open(); - c.Close(); - connStr = new MySqlConnectionStringBuilder(c.ConnectionString); - Assert.True(String.IsNullOrEmpty(connStr.Password)); - } - - /// - /// Bug #13658 connection.state does not update on Ping() - /// - [Fact] - public void PingUpdatesState() - { - var conn2 = GetConnection(); - conn2.Open(); - KillConnection(conn2); - Assert.False(conn2.Ping()); - Assert.True(conn2.State == ConnectionState.Closed); - conn2.Open(); - conn2.Close(); - } - - /// - /// Bug #16659 Can't use double quotation marks(") as password access server by Connector/NET - /// - [Fact] - public void ConnectWithQuotePassword() - { - executeAsRoot("GRANT ALL ON *.* to 'quotedUser'@'%' IDENTIFIED BY '\"'"); - executeAsRoot("GRANT ALL ON *.* to 'quotedUser'@'localhost' IDENTIFIED BY '\"'"); - MySqlConnectionStringBuilder settings = new MySqlConnectionStringBuilder(connection.ConnectionString); - settings.UserID = "quotedUser"; - settings.Password = "\""; - using (MySqlConnection c = new MySqlConnection(connection.ConnectionString)) - { - c.Open(); - } - } - - /// - /// Bug #24802 Error Handling - /// - [Fact] - public void TestConnectingSocketBadHostName() - { - MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(connection.ConnectionString); - connStr.Server = "foobar"; - MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true)); - var exception = Record.Exception(() => c.Open()); - Assert.NotNull(exception); - Assert.IsType(exception); - MySqlException ex = exception as MySqlException; - Assert.Equal((int)MySqlErrorCode.UnableToConnectToHost, ex.Number); - } - - /// - /// Bug #29123 Connection String grows with each use resulting in OutOfMemoryException - /// - [Fact] - public void ConnectionStringNotAffectedByChangeDatabase() - { - for (int i = 0; i < 10; i++) - { - string connStr = connection.ConnectionString + ";pooling=false"; - connStr = connStr.Replace("database", "Initial Catalog"); - connStr = connStr.Replace("persist security info=true", - "persist security info=false"); - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - string str = c.ConnectionString; - int index = str.IndexOf("Database="); - Assert.Equal(-1, index); - } - } - } - - class ConnectionClosedCheck - { - public bool closed = false; - public void stateChangeHandler(object sender, StateChangeEventArgs e) - { - if (e.CurrentState == ConnectionState.Closed) - closed = true; - } - } - [Fact] - public void ConnectionCloseByGC() - { - int threadId; - ConnectionClosedCheck check = new ConnectionClosedCheck(); - - MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(connection.ConnectionString); - connStr.Pooling = false; - MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true)); - c.StateChange += new StateChangeEventHandler(check.stateChangeHandler); - c.Open(); - threadId = c.ServerThread; - c = null; - GC.Collect(); - GC.WaitForPendingFinalizers(); - Assert.True(check.closed); - } - - // /// - // /// Bug #30964 StateChange imperfection - // /// - // MySqlConnection rqConnection; - - - // [Fact] - // public void RunningAQueryFromStateChangeHandler() - // { - // string connStr = st.GetConnectionString(true); - // using (rqConnection = new MySqlConnection(connStr)) - // { - // rqConnection.StateChange += new StateChangeEventHandler(RunningQueryStateChangeHandler); - // rqConnection.Open(); - // } - // } - - // void RunningQueryStateChangeHandler(object sender, StateChangeEventArgs e) - // { - // if (e.CurrentState == ConnectionState.Open) - // { - // MySqlCommand cmd = new MySqlCommand("SELECT 1", rqConnection); - // object o = cmd.ExecuteScalar(); - // Assert.Equal(1, Convert.ToInt32(o)); - // } - // } - - /// - /// Bug #31262 NullReferenceException in MySql.Data.MySqlClient.NativeDriver.ExecuteCommand - /// - [Fact] - public void ConnectionNotOpenThrowningBadException() - { - var c2 = GetConnection(); - //conn.Open(); << REM - MySqlCommand command = new MySqlCommand(); - command.Connection = c2; - - MySqlCommand cmdCreateTable = new MySqlCommand("DROP TABLE IF EXISTS `test`.`contents_catalog`", c2); - cmdCreateTable.CommandType = CommandType.Text; - cmdCreateTable.CommandTimeout = 0; - var exception = Record.Exception(() => cmdCreateTable.ExecuteNonQuery()); - Assert.NotNull(exception); - Assert.IsType(exception); - } - - /// - /// Bug #31433 Username incorrectly cached for logon where case sensitive - /// - [Fact] - public void CaseSensitiveUserId() - { - MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(connection.ConnectionString); - string original_uid = connStr.UserID; - connStr.UserID = connStr.UserID.ToUpper(); - MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true)); - var exception = Record.Exception(() => c.Open()); - Assert.NotNull(exception); - Assert.IsType(exception); - - connStr.UserID = original_uid; - c = new MySqlConnection(connStr.GetConnectionString(true)); - c.Open(); - c.Close(); - } - - /// - /// Bug #35619 creating a MySql connection from toolbox generates an error - /// - [Fact] - public void NullConnectionString() - { - MySqlConnection c = new MySqlConnection(); - c.ConnectionString = null; - } - - /// - /// Bug #53097 Connection.Ping() closes connection if executed on a connection with datareader - /// - [Fact] - public void PingWhileReading() - { - using (MySqlConnection conn = new MySqlConnection(connection.ConnectionString)) - { - conn.Open(); - MySqlCommand command = new MySqlCommand("SELECT 1", conn); - - using (MySqlDataReader reader = command.ExecuteReader()) - { - reader.Read(); - var exception = Record.Exception(() => conn.Ping()); - Assert.NotNull(exception); - Assert.IsType(exception); - } - } - } - - /// - /// Test if keepalive parameters work. - /// - [Fact] - public void Keepalive() - { - MySqlConnectionStringBuilder connStr = new MySqlConnectionStringBuilder(connection.ConnectionString); - connStr.Keepalive = 1; - using (MySqlConnection c = new MySqlConnection(connStr.GetConnectionString(true))) - { - c.Open(); - } - } - - // [Fact] - // public void CanOpenConnectionInMediumTrust() - // { - // AppDomain appDomain = PartialTrustSandbox.CreatePartialTrustDomain(); - - // PartialTrustSandbox sandbox = (PartialTrustSandbox)appDomain.CreateInstanceAndUnwrap( - // typeof(PartialTrustSandbox).Assembly.FullName, - // typeof(PartialTrustSandbox).FullName); - - // try - // { - // MySqlConnection connection = sandbox.TryOpenConnection(st.GetConnectionString(true)); - // Assert.True(null != connection); - - // Assert.True(connection.State == ConnectionState.Open); - // connection.Close(); - - // //Now try with logging enabled - // connection = sandbox.TryOpenConnection(st.GetConnectionString(true) + ";logging=true"); - // Assert.True(null != connection); - // Assert.True(connection.State == ConnectionState.Open); - // connection.Close(); - - // //Now try with Usage Advisor enabled - // connection = sandbox.TryOpenConnection(st.GetConnectionString(true) + ";Use Usage Advisor=true"); - // Assert.True(null != connection); - // Assert.True(connection.State == ConnectionState.Open); - // connection.Close(); - // } - // finally - // { - // AppDomain.Unload(appDomain); - // } - // } - - /// - /// A client can connect to MySQL server using SSL and a pfx file. - /// - /// This test requires starting the server with SSL support. - /// For instance, the following command line enables SSL in the server: - /// mysqld --no-defaults --standalone --console --ssl-ca='MySQLServerDir'\mysql-test\std_data\cacert.pem --ssl-cert='MySQLServerDir'\mysql-test\std_data\server-cert.pem --ssl-key='MySQLServerDir'\mysql-test\std_data\server-key.pem - /// - /// - [Fact] - public void CanConnectUsingFileBasedCertificate() - { - string connstr = connection.ConnectionString; - connstr += ";CertificateFile=client.pfx;CertificatePassword=pass;SSL Mode=Required;"; - using (MySqlConnection c = new MySqlConnection(connstr)) - { - c.Open(); - Assert.Equal(ConnectionState.Open, c.State); - MySqlCommand command = new MySqlCommand("SHOW SESSION STATUS LIKE 'Ssl_version';", c); - using (MySqlDataReader reader = command.ExecuteReader()) - { - Assert.True(reader.Read()); - Assert.StartsWith("TLSv1", reader.GetString(1)); - } - } - } - - [Fact] - public void CanOpenConnectionAfterAborting() - { - MySqlConnection connection = new MySqlConnection(ts.GetConnection(false).ConnectionString); - connection.Open(); - Assert.Equal(ConnectionState.Open, connection.State); - - connection.Abort(); - Assert.Equal(ConnectionState.Closed, connection.State); - - connection.Open(); - Assert.Equal(ConnectionState.Open, connection.State); - - connection.Close(); - } - - - ///// - ///// Fix for bug http://bugs.mysql.com/bug.php?id=63942 (Connections not closed properly when using pooling) - ///// - //[Fact] - //public void ReleasePooledConnectionsProperly() - //{ - // MySqlConnection con = new MySqlConnection(st.GetConnectionString(true)); - // MySqlCommand cmd = new MySqlCommand("show global status like 'aborted_clients'", con); - // con.Open(); - // MySqlDataReader r = cmd.ExecuteReader(); - // r.Read(); - // int numClientsAborted = r.GetInt32(1); - // r.Close(); - - // AppDomain appDomain = FullTrustSandbox.CreateFullTrustDomain(); - - - // FullTrustSandbox sandbox = (FullTrustSandbox)appDomain.CreateInstanceAndUnwrap( - // typeof(FullTrustSandbox).Assembly.FullName, - // typeof(FullTrustSandbox).FullName); - - // try - // { - // for (int i = 0; i < 200; i++) - // { - // MySqlConnection connection = sandbox.TryOpenConnection(st.GetPoolingConnectionString()); - // Assert.NotNull(connection); - // Assert.True(connection.State == ConnectionState.Open); - // connection.Close(); - // } - // } - // finally - // { - // AppDomain.Unload(appDomain); - // } - // r = cmd.ExecuteReader(); - // r.Read(); - // int numClientsAborted2 = r.GetInt32(1); - // r.Close(); - // Assert.Equal(numClientsAborted, numClientsAborted2); - // con.Close(); - //} - - /// - /// Test for Connect attributes feature used in MySql Server > 5.6.6 - /// (Stores client connection data on server) - /// - [Fact] - public void ConnectAttributes() - { - if (ts.version < new Version(5, 6, 6)) return; - using (MySqlConnection connection = new MySqlConnection(ts.GetConnection(true).ConnectionString)) - { - connection.Open(); - if (connection.driver.SupportsConnectAttrs) - { - MySqlCommand cmd = new MySqlCommand("SELECT * FROM performance_schema.session_connect_attrs WHERE PROCESSLIST_ID = connection_id()", connection); - MySqlDataReader dr = cmd.ExecuteReader(); - Assert.True(dr.HasRows, "No session_connect_attrs found"); - MySqlConnectAttrs connectAttrs = new MySqlConnectAttrs(); - bool isValidated = false; - while (dr.Read()) - { - if (dr.GetString(1).ToLowerInvariant().Contains("_client_name")) - { - Assert.Equal(connectAttrs.ClientName, dr.GetString(2)); - isValidated = true; - break; - } - } - Assert.True(isValidated, "Missing _client_name attribute"); - } - } - } - - /// - /// Test for password expiration feature in MySql Server 5.6 or higher - /// - [Fact] - public void PasswordExpiration() - { - const string expireduser = "expireduser"; - const string expiredhost = "localhost"; - string expiredfull = string.Format("'{0}'@'{1}'", expireduser, expiredhost); - - using (MySqlConnection conn = ts.GetConnection(true)) - { - conn.Open(); - if (ts.version >= new Version(5, 6, 6)) - { - MySqlCommand cmd = new MySqlCommand("", conn); - - // creates expired user - cmd.CommandText = string.Format("SELECT COUNT(*) FROM mysql.user WHERE user='{0}' AND host='{1}'", expireduser, expiredhost); - long count = (long)cmd.ExecuteScalar(); - if (count > 0) - ts.executeInternal(string.Format("DROP USER " + expiredfull), conn); - - ts.executeInternal(string.Format("CREATE USER {0} IDENTIFIED BY '{1}1'", expiredfull, expireduser), conn); - ts.executeInternal(string.Format("GRANT SELECT ON `{0}`.* TO {1}", conn.Database, expiredfull), conn); - - ts.executeInternal(string.Format("ALTER USER {0} PASSWORD EXPIRE", expiredfull), conn); - conn.Close(); - - // validates expired user - var cnstrBuilder = new MySqlConnectionStringBuilder(ts.GetConnection(true).ConnectionString); - cnstrBuilder.UserID = expireduser; - cnstrBuilder.Password = expireduser + "1"; - conn.ConnectionString = cnstrBuilder.ConnectionString; - conn.Open(); - - cmd.CommandText = "SELECT 1"; - MySqlException ex = Assert.Throws(() => cmd.ExecuteScalar()); - Assert.Equal(1820, ex.Number); - - if (ts.version >= new Version(5, 7, 6)) - cmd.CommandText = string.Format("SET PASSWORD = '{0}1'", expireduser); - else - cmd.CommandText = string.Format("SET PASSWORD = PASSWORD('{0}1')", expireduser); - - cmd.ExecuteNonQuery(); - cmd.CommandText = "SELECT 1"; - cmd.ExecuteScalar(); - conn.Close(); - conn.ConnectionString = ts.GetConnection(true).ConnectionString; - conn.Open(); - ts.executeInternal(string.Format("DROP USER " + expiredfull), conn); - conn.Close(); - } - else - { - System.Diagnostics.Debug.WriteLine("Password expire not supported in this server version."); - } - } - } - - /// - /// As part of feedback from bug http://bugs.mysql.com/bug.php?id=66647 (Arithmetic operation resulted in an overflow). - /// - [Fact] - public void OldPasswordNotSupported() - { - - if (ts.version > new Version(5, 6)) return; - //get value of flag 'old_passwords' - MySqlConnectionStringBuilder csb = new MySqlConnectionStringBuilder(ts.GetConnection(false).ConnectionString); - MySqlConnection con = new MySqlConnection(csb.ToString()); - MySqlCommand cmd = new MySqlCommand("show variables like 'old_passwords'", con); - string db = con.Settings.Database; - con.Open(); - MySqlDataReader r = cmd.ExecuteReader(); - r.Read(); - object o = r.GetValue(1); - if (o.ToString() == "OFF") - o = "0"; - int old_passwords = Convert.ToInt32(o); - r.Close(); - if (old_passwords == 0) - { - //System.Diagnostics.Debug.Write("This test must be ran with old_passwords=0"); - ts.executeInternal("set old_passwords=1;", con); - //return; - } - // create user - cmd.CommandText = "select count( * ) from mysql.user where user = 'myoldpassuser' and host = 'localhost'"; - cmd.Connection = ts.GetConnection(true); - int n = Convert.ToInt32(cmd.ExecuteScalar()); - if (n != 0) - { - ts.executeInternal("drop user 'myoldpassuser'@'localhost'", con); - } - // user with old password is different depending upon the version. - if (ts.version.Minor >= 6) - { - ts.executeInternal("create user 'myoldpassuser'@'localhost' IDENTIFIED with 'mysql_old_password'", con); - } - else - { - ts.executeInternal("create user 'myoldpassuser'@'localhost' ", con); - } - // setup user with old password, attempt to open connection with it, must fail - ts.executeInternal(string.Format("grant all on `{0}`.* to 'myoldpassuser'@'localhost'", db), con); - ts.executeInternal("set password for 'myoldpassuser'@'localhost' = old_password( '123' )", con); - con.Close(); - //con.Settings.UserID = "myoldpassuser"; - //con.Settings.Password = "123"; - csb.UserID = "myoldpassuser"; - csb.Password = "123"; - con.ConnectionString = csb.ToString(); - Exception ex = Assert.Throws(() => con.Open()); - Assert.Equal(Resources.OldPasswordsNotSupported, ex.Message); - - if (old_passwords == 0) - { - ts.executeInternal("set old_passwords=0;", con); - } - ts.executeInternal("drop user 'myoldpassuser'@'localhost'", con); - - con.Close(); - - } - - [Fact] - public void TestNonSupportedOptions() - { - string connstr = ts.GetConnection(true).ConnectionString; - connstr += ";CertificateFile=client.pfx;CertificatePassword=pass;SSL Mode=Required;"; - using (MySqlConnection c = new MySqlConnection(connstr)) - { - c.Open(); - Assert.Equal(ConnectionState.Open, c.State); - } - } - - #region Async - [Fact] - public async Task TransactionAsync() - { - executeSQL("CREATE TABLE test(key2 varchar(50), name varchar(50), name2 varchar(50))"); - - var conn = GetConnection(); - using (conn) - { - conn.Open(); - var txn = conn.BeginTransaction(); - Assert.Equal(conn, txn.Connection); - - var cmd = conn.CreateCommand(); - cmd.CommandText = "SET AUTOCOMMIT=0"; - cmd.ExecuteNonQuery(); - - cmd.CommandText = "INSERT INTO test VALUES ('P', 'Test1', 'Test2')"; - cmd.ExecuteNonQuery(); - txn.Rollback(); - cmd.CommandText = "SELECT COUNT(*) FROM test"; - long cnt = (long)cmd.ExecuteScalar(); - Assert.True(cnt == 0); - } - } - - [Fact] - public async Task ChangeDataBaseAsync() - { - string dbName = CreateDatabase("db1"); - executeAsRoot(String.Format( - "CREATE TABLE `{0}`.`footest` (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, `multi word` int, PRIMARY KEY(id))", dbName)); - - var conn = GetConnection(); - using (conn) - { - conn.Open(); - await conn.ChangeDataBaseAsync(dbName); - - var cmd = conn.CreateCommand(); - cmd.CommandText = "SELECT COUNT(*) FROM footest"; - var count = cmd.ExecuteScalar(); - } - } - - [Fact] - public async Task OpenAndCloseConnectionAsync() - { - var conn = GetConnection(); - await conn.OpenAsync(); - Assert.True(conn.State == ConnectionState.Open); - await conn.CloseAsync(); - Assert.True(conn.State == ConnectionState.Closed); - } - - [Fact] - public async Task ClearPoolAsync() - { - MySqlConnection c1 = GetConnection(); - MySqlConnection c2 = GetConnection(); - c1.Open(); - c2.Open(); - c1.Close(); - c2.Close(); - await c1.ClearPoolAsync(c1); - await c2.ClearPoolAsync(c1); - } - - [Fact] - public async Task ClearAllPoolsAsync() - { - MySqlConnection c1 = GetConnection(); - MySqlConnection c2 = GetConnection(); - c1.Open(); - c2.Open(); - c1.Close(); - c2.Close(); - await c1.ClearAllPoolsAsync(); - await c2.ClearAllPoolsAsync(); - } - - [Fact] - public async Task GetSchemaCollectionAsync() - { - var schemaColl = await connection.GetSchemaCollectionAsync("MetaDataCollections", null); - Assert.NotNull(schemaColl); - } - - #endregion - - [Fact] - public void SslPreferredByDefault() - { - MySqlConnectionStringBuilder csb = new MySqlConnectionStringBuilder(); - csb.Server = Settings.Server; - csb.Port = Settings.Port; - csb.UserID = Settings.UserID; - csb.Password = Settings.Password; - using (MySqlConnection connection = new MySqlConnection(csb.ToString())) - { - connection.Open(); - MySqlCommand command = new MySqlCommand("SHOW SESSION STATUS LIKE 'Ssl_version';", connection); - using (MySqlDataReader reader = command.ExecuteReader()) - { - Assert.True(reader.Read()); - Assert.StartsWith("TLSv1", reader.GetString(1)); - } - } - } - - [Fact] - public void SslOverrided() - { - var cstrBuilder = new MySqlConnectionStringBuilder(ts.GetConnection(true).ConnectionString); - cstrBuilder.SslMode = MySqlSslMode.None; - using (MySqlConnection connection = new MySqlConnection(cstrBuilder.ConnectionString)) - { - connection.Open(); - MySqlCommand command = new MySqlCommand("SHOW SESSION STATUS LIKE 'Ssl_version';", connection); - using (MySqlDataReader reader = command.ExecuteReader()) - { - Assert.True(reader.Read()); - Assert.Equal(string.Empty, reader.GetString(1)); - } - } - } - } -} diff --git a/Tests/MySql.Data.Tests/MySqlDataAdapterTests.cs b/Tests/MySql.Data.Tests/MySqlDataAdapterTests.cs deleted file mode 100644 index 31bca1a9e..000000000 --- a/Tests/MySql.Data.Tests/MySqlDataAdapterTests.cs +++ /dev/null @@ -1,1109 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Data; -using System.Threading.Tasks; - - -namespace MySql.Data.MySqlClient.Tests -{ - public class MySqlDataAdapterTests : TestBase - { - - protected TestSetup ts; - - public MySqlDataAdapterTests(TestSetup setup) : base (setup, "dataadaptertest") - { - ts = setup; - } - - private void CreateDefaultTable() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL AUTO_INCREMENT, " + - "id2 INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, " + - "ts TIMESTAMP, OriginalId INT, PRIMARY KEY(id, id2))"); - } - - [Fact] - public void TestFill() - { - FillImpl(false); - } - - [Fact] - public void TestFillPrepared() - { - FillImpl(true); - } - - private void FillImpl(bool prepare) - { - CreateDefaultTable(); - executeSQL("INSERT INTO Test (id, id2, name, dt) VALUES (NULL, 1, 'Name 1', Now())"); - executeSQL("INSERT INTO Test (id, id2, name, dt) VALUES (NULL, 2, NULL, Now())"); - executeSQL("INSERT INTO Test (id, id2, name, dt) VALUES (NULL, 3, '', Now())"); - - MySqlDataAdapter da = new MySqlDataAdapter("select * from Test", connection); - if (prepare) da.SelectCommand.Prepare(); - DataSet ds = new DataSet(); - da.Fill(ds, "Test"); - - Assert.Equal(1, ds.Tables.Count); - Assert.Equal(3, ds.Tables[0].Rows.Count); - - Assert.Equal(1, ds.Tables[0].Rows[0]["id2"]); - Assert.Equal(2, ds.Tables[0].Rows[1]["id2"]); - Assert.Equal(3, ds.Tables[0].Rows[2]["id2"]); - - Assert.Equal("Name 1", ds.Tables[0].Rows[0]["name"]); - Assert.Equal(DBNull.Value, ds.Tables[0].Rows[1]["name"]); - Assert.Equal(String.Empty, ds.Tables[0].Rows[2]["name"]); - } - - [Fact] - public void TestUpdate() - { - CreateDefaultTable(); - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - DataTable dt = new DataTable(); - da.Fill(dt); - - DataRow dr = dt.NewRow(); - dr["id2"] = 2; - dr["name"] = "TestName1"; - dt.Rows.Add(dr); - int count = da.Update(dt); - - // make sure our refresh of auto increment values worked - Assert.True(count == 1, "checking insert count"); - Assert.True(dt.Rows[dt.Rows.Count - 1]["id"] != null,"Checking auto increment column"); - - dt.Rows.Clear(); - da.Fill(dt); - dt.Rows[0]["id2"] = 3; - dt.Rows[0]["name"] = "TestName2"; - dt.Rows[0]["ts"] = DBNull.Value; - DateTime day1 = new DateTime(2003, 1, 16, 12, 24, 0); - dt.Rows[0]["dt"] = day1; - dt.Rows[0]["tm"] = day1.TimeOfDay; - count = da.Update(dt); - - Assert.True(dt.Rows[0]["ts"] != null, "checking refresh of record"); - Assert.True(dt.Rows[0]["id2"] != null, "checking refresh of primary column"); - - dt.Rows.Clear(); - da.Fill(dt); - - Assert.True(count == 1, "checking update count"); - DateTime dateTime = (DateTime)dt.Rows[0]["dt"]; - Assert.True(day1.Date == dateTime.Date, "checking date"); - Assert.True(day1.TimeOfDay == (TimeSpan)dt.Rows[0]["tm"], "checking time"); - - dt.Rows[0].Delete(); - count = da.Update(dt); - - Assert.True(count == 1, "checking insert count"); - - dt.Rows.Clear(); - da.Fill(dt); - Assert.True(dt.Rows.Count == 0, "checking row count"); - cb.Dispose(); - } - - [Fact] - public void OriginalInName() - { - CreateDefaultTable(); - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - cb.ToString(); // keep the compiler happy - DataTable dt = new DataTable(); - da.Fill(dt); - - DataRow row = dt.NewRow(); - row["id"] = DBNull.Value; - row["id2"] = 1; - row["name"] = "Test"; - row["dt"] = DBNull.Value; - row["tm"] = DBNull.Value; - row["ts"] = DBNull.Value; - row["OriginalId"] = 2; - dt.Rows.Add(row); - da.Update(dt); - - Assert.Equal(1, dt.Rows.Count); - Assert.Equal(2, dt.Rows[0]["OriginalId"]); - } - - [Fact] - public void UseAdapterPropertyOfCommandBuilder() - { - CreateDefaultTable(); - executeSQL("INSERT INTO Test (id, id2, name) VALUES (NULL, 1, 'Test')"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - MySqlCommandBuilder cb = new MySqlCommandBuilder(); - cb.DataAdapter = da; - - DataTable dt = new DataTable(); - da.Fill(dt); - - dt.Rows[0]["name"] = "Test Update"; - int updateCnt = da.Update(dt); - - Assert.Equal(1, updateCnt); - - dt.Rows.Clear(); - da.Fill(dt); - - Assert.Equal(1, dt.Rows.Count); - Assert.Equal("Test Update", dt.Rows[0]["name"]); - } - - [Fact] - public void UpdateNullTextFieldToEmptyString() - { - CreateDefaultTable(); - executeSQL("INSERT INTO Test (id, id2, name) VALUES (1, 1, NULL)"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - cb.ToString(); // keep the compiler happy - - DataTable dt = new DataTable(); - da.Fill(dt); - - dt.Rows[0]["name"] = ""; - int updateCnt = da.Update(dt); - - Assert.Equal(1, updateCnt); - - dt.Rows.Clear(); - da.Fill(dt); - - Assert.Equal(1, dt.Rows.Count); - Assert.Equal("", dt.Rows[0]["name"]); - } - - [Fact] - public void UpdateExtendedTextFields() - { - executeSQL("CREATE TABLE Test (id int, notes MEDIUMTEXT, PRIMARY KEY(id))"); - executeSQL("INSERT INTO Test VALUES(1, 'This is my note')"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - cb.ToString(); // keep the compiler happy - DataTable dt = new DataTable(); - da.Fill(dt); - - dt.Rows[0]["notes"] = "This is my new note"; - da.Update(dt); - - dt.Clear(); - da.Fill(dt); - Assert.Equal("This is my new note", dt.Rows[0]["notes"]); - } - - [Fact] - public void SelectMoreThan252Rows() - { - CreateDefaultTable(); - for (int i = 0; i < 500; i++) - executeSQL("INSERT INTO Test(id, id2) VALUES(NULL, " + i + ")"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - DataTable dt = new DataTable(); - da.Fill(dt); - - Assert.Equal(500, dt.Rows.Count); - } - - [Fact] - public void DiscreteValues() - { - executeSQL("CREATE TABLE Test (id int, name varchar(200), dt DATETIME, b1 TEXT)"); - executeSQL("INSERT INTO Test VALUES (1, 'Test', '2004-08-01', 'Text 1')"); - executeSQL("INSERT INTO Test VALUES (2, 'Test 1', '2004-07-02', 'Text 2')"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - DataTable dt = new DataTable(); - da.Fill(dt); - - Assert.Equal("Test", dt.Rows[0]["name"]); - Assert.Equal("Test 1", dt.Rows[1]["name"]); - - Assert.Equal("Text 1", dt.Rows[0]["b1"]); - Assert.Equal("Text 2", dt.Rows[1]["b1"]); - - Assert.Equal(new DateTime(2004, 8, 1, 0, 0, 0).ToString(), dt.Rows[0]["dt"].ToString()); - Assert.Equal(new DateTime(2004, 7, 2, 0, 0, 0).ToString(), dt.Rows[1]["dt"].ToString()); - } - - [Fact] - public void Bug5798() - { - CreateDefaultTable(); - executeSQL("INSERT INTO Test (id, id2, name) VALUES (1, 1, '')"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - cb.ToString(); // keep the compiler happy - DataTable dt = new DataTable(); - da.Fill(dt); - - Assert.Equal(String.Empty, dt.Rows[0]["name"]); - - dt.Rows[0]["name"] = "Test"; - da.Update(dt); - - dt.Clear(); - da.Fill(dt); - Assert.Equal("Test", dt.Rows[0]["name"]); - } - - [Fact] - public void ColumnMapping() - { - executeSQL("CREATE TABLE Test (id int, dcname varchar(100), primary key(id))"); - executeSQL("INSERT INTO Test VALUES (1, 'Test1')"); - executeSQL("INSERT INTO Test VALUES (2, 'Test2')"); - executeSQL("INSERT INTO Test VALUES (3, 'Test3')"); - executeSQL("INSERT INTO Test VALUES (4, 'Test4')"); - - } - - [Fact] - public void TestFillWithHelper() - { - executeSQL("CREATE TABLE table1 (`key` INT, PRIMARY KEY(`key`))"); - executeSQL("CREATE TABLE table2 (`key` INT, PRIMARY KEY(`key`))"); - executeSQL("INSERT INTO table1 VALUES (1)"); - executeSQL("INSERT INTO table2 VALUES (1)"); - - string sql = "SELECT table1.key FROM table1 WHERE table1.key=1; " + - "SELECT table2.key FROM table2 WHERE table2.key=1"; - DataSet ds = MySqlHelper.ExecuteDataset(connection, sql, null); - Assert.Equal(2, ds.Tables.Count); - Assert.Equal(1, ds.Tables[0].Rows.Count); - Assert.Equal(1, ds.Tables[1].Rows.Count); - Assert.Equal(1, ds.Tables[0].Rows[0]["key"]); - Assert.Equal(1, ds.Tables[1].Rows[0]["key"]); - } - - /// - /// Bug #8509 - MySqlDataAdapter.FillSchema does not interpret unsigned integer - /// - [Fact] - public void AutoIncrementColumns() - { - executeSQL("CREATE TABLE Test (id int(10) unsigned NOT NULL auto_increment primary key)"); - executeSQL("INSERT INTO Test VALUES(NULL)"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - DataSet ds = new DataSet(); - da.Fill(ds); - Assert.Equal(1, Convert.ToInt32(ds.Tables[0].Rows[0]["id"])); - DataRow row = ds.Tables[0].NewRow(); - ds.Tables[0].Rows.Add(row); - - da.Update(ds); - - ds.Clear(); - da.Fill(ds); - Assert.Equal(1, Convert.ToInt32(ds.Tables[0].Rows[0]["id"])); - Assert.Equal(2, Convert.ToInt32(ds.Tables[0].Rows[1]["id"])); - cb.Dispose(); - } - - /// - /// Bug #8292 GROUP BY / WITH ROLLUP with DataSet causes System.Data.ConstraintException - /// - [Fact] - public void Rollup() - { - if (ts.version < new Version(4, 1)) - return; - - executeSQL("CREATE TABLE Test ( id INT NOT NULL, amount INT )"); - executeSQL("INSERT INTO Test VALUES (1, 44)"); - executeSQL("INSERT INTO Test VALUES (2, 88)"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test GROUP BY id WITH ROLLUP", connection); - DataSet ds = new DataSet(); - da.Fill(ds); - - Assert.Equal(1, ds.Tables.Count); - Assert.Equal(3, ds.Tables[0].Rows.Count); - Assert.Equal(88, ds.Tables[0].Rows[2]["amount"]); - Assert.Equal(DBNull.Value, ds.Tables[0].Rows[2]["id"]); - } - - /// - /// Bug #16307 @@Identity returning incorrect value - /// - [Fact] - public void Bug16307() - { - executeSQL("CREATE TABLE Test (OrgNum int auto_increment, CallReportNum int, Stamp varchar(50), " + - "WasRealCall varchar(50), WasHangup varchar(50), primary key(orgnum))"); - - string strSQL = "INSERT INTO Test(OrgNum, CallReportNum, Stamp, WasRealCall, WasHangup) " + - "VALUES (?OrgNum, ?CallReportNum, ?Stamp, ?WasRealCall, ?WasHangup)"; - - MySqlCommand cmd = new MySqlCommand(strSQL, connection); - MySqlParameterCollection pc = cmd.Parameters; - - pc.Add("?OrgNum", MySqlDbType.Int32, 0, "OrgNum"); - pc.Add("?CallReportNum", MySqlDbType.Int32, 0, "CallReportNum"); - pc.Add("?Stamp", MySqlDbType.VarChar, 0, "Stamp"); - pc.Add("?WasRealCall", MySqlDbType.VarChar, 0, "WasRealCall"); - pc.Add("?WasHangup", MySqlDbType.VarChar, 0, "WasHangup"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - da.InsertCommand = cmd; - - DataSet ds = new DataSet(); - da.Fill(ds); - - DataRow row = ds.Tables[0].NewRow(); - row["CallReportNum"] = 1; - row["Stamp"] = "stamp"; - row["WasRealCall"] = "yes"; - row["WasHangup"] = "no"; - ds.Tables[0].Rows.Add(row); - - da.Update(ds.Tables[0]); - - strSQL = "SELECT @@IDENTITY AS 'Identity';"; - MySqlCommand cmd2 = new MySqlCommand(strSQL, connection); - using (MySqlDataReader reader = cmd2.ExecuteReader()) - { - reader.Read(); - int intCallNum = Int32.Parse(reader.GetValue(0).ToString()); - Assert.Equal(1, intCallNum); - } - } - - /// - /// Bug #8131 Data Adapter doesn't close connection - /// - [Fact] - public void QuietOpenAndClose() - { - executeSQL("CREATE TABLE Test (id INT, PRIMARY KEY(id))"); - executeSQL("INSERT INTO Test VALUES(1)"); - - using (MySqlConnection c = new MySqlConnection(GetConnection(true).ConnectionString + ";database=" + ts.baseDBName + "0")) - { - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", c); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - Assert.True(c.State == ConnectionState.Closed); - DataTable dt = new DataTable(); - da.Fill(dt); - Assert.True(c.State == ConnectionState.Closed); - Assert.Equal(1, dt.Rows.Count); - - dt.Rows[0][0] = 2; - DataRow[] rows = new DataRow[1]; - rows[0] = dt.Rows[0]; - da.Update(dt); - Assert.True(c.State == ConnectionState.Closed); - - dt.Clear(); - c.Open(); - Assert.True(c.State == ConnectionState.Open); - da.Fill(dt); - Assert.True(c.State == ConnectionState.Open); - Assert.Equal(1, dt.Rows.Count); - cb.Dispose(); - } - } - - [Fact] - public void RangeFill() - { - executeSQL("CREATE TABLE Test (id INT)"); - executeSQL("INSERT INTO Test VALUES (1)"); - executeSQL("INSERT INTO Test VALUES (2)"); - executeSQL("INSERT INTO Test VALUES (3)"); - executeSQL("INSERT INTO Test VALUES (4)"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - DataSet ds = new DataSet(); - da.Fill(ds, 1, 2, "Test"); - } - - [Fact] - public void FillWithNulls() - { - executeSQL(@"CREATE TABLE Test (id INT UNSIGNED NOT NULL AUTO_INCREMENT, - name VARCHAR(100), PRIMARY KEY(id))"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - DataTable dt = new DataTable(); - da.Fill(dt); - dt.Columns[0].AutoIncrement = true; - dt.Columns[0].AutoIncrementSeed = -1; - dt.Columns[0].AutoIncrementStep = -1; - DataRow row = dt.NewRow(); - row["name"] = "Test1"; - - dt.Rows.Add(row); - da.Update(dt); - - dt.Clear(); - da.Fill(dt); - Assert.Equal(1, dt.Rows.Count); - Assert.Equal(1, dt.Rows[0]["id"]); - Assert.Equal("Test1", dt.Rows[0]["name"]); - - row = dt.NewRow(); - row["name"] = System.DBNull.Value; - - dt.Rows.Add(row); - da.Update(dt); - - dt.Clear(); - da.Fill(dt); - Assert.Equal(2, dt.Rows.Count); - Assert.Equal(2, dt.Rows[1]["id"]); - Assert.Equal(DBNull.Value, dt.Rows[1]["name"]); - - row = dt.NewRow(); - row["name"] = "Test3"; - - dt.Rows.Add(row); - da.Update(dt); - - dt.Clear(); - da.Fill(dt); - Assert.Equal(3, dt.Rows.Count); - Assert.Equal(3, dt.Rows[2]["id"]); - Assert.Equal("Test3", dt.Rows[2]["name"]); - cb.Dispose(); - } - - [Fact] - public void PagingFill() - { - CreateDefaultTable(); - executeSQL("INSERT INTO Test (id, id2, name) VALUES (NULL, 1, 'Name 1')"); - executeSQL("INSERT INTO Test (id, id2, name) VALUES (NULL, 2, 'Name 2')"); - executeSQL("INSERT INTO Test (id, id2, name) VALUES (NULL, 3, 'Name 3')"); - executeSQL("INSERT INTO Test (id, id2, name) VALUES (NULL, 4, 'Name 4')"); - executeSQL("INSERT INTO Test (id, id2, name) VALUES (NULL, 5, 'Name 5')"); - executeSQL("INSERT INTO Test (id, id2, name) VALUES (NULL, 6, 'Name 6')"); - executeSQL("INSERT INTO Test (id, id2, name) VALUES (NULL, 7, 'Name 7')"); - executeSQL("INSERT INTO Test (id, id2, name) VALUES (NULL, 8, 'Name 8')"); - executeSQL("INSERT INTO Test (id, id2, name) VALUES (NULL, 9, 'Name 9')"); - executeSQL("INSERT INTO Test (id, id2, name) VALUES (NULL, 10, 'Name 10')"); - executeSQL("INSERT INTO Test (id, id2, name) VALUES (NULL, 11, 'Name 11')"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - DataTable dt = new DataTable(); - da.Fill(0, 10, new DataTable[] { dt }); - Assert.Equal(10, dt.Rows.Count); - } - - private string MakeLargeString(int len) - { - System.Text.StringBuilder sb = new System.Text.StringBuilder(len); - while (len-- > 0) - sb.Append('a'); - return sb.ToString(); - } - - [Fact] - public void SkippingRowsLargerThan1024() - { - executeSQL("CREATE TABLE Test (id INT, name TEXT)"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?id, ?name)", connection); - cmd.Parameters.Add("?id", MySqlDbType.Int32); - cmd.Parameters.Add("?name", MySqlDbType.Text); - for (int i = 0; i < 5; i++) - { - cmd.Parameters[0].Value = i; - cmd.Parameters[1].Value = MakeLargeString(2000); - cmd.ExecuteNonQuery(); - } - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - DataTable dt = new DataTable(); - da.Fill(0, 2, new DataTable[] { dt }); - } - - [Fact] - public void TestBatchingInserts() - { - executeSQL("CREATE TABLE Test (id INT, name VARCHAR(20), PRIMARY KEY(id))"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - MySqlCommand ins = new MySqlCommand("INSERT INTO test (id, name) VALUES (?p1, ?p2)", connection); - da.InsertCommand = ins; - ins.UpdatedRowSource = UpdateRowSource.None; - ins.Parameters.Add("?p1", MySqlDbType.Int32).SourceColumn = "id"; - ins.Parameters.Add("?p2", MySqlDbType.VarChar, 20).SourceColumn = "name"; - - DataTable dt = new DataTable(); - da.Fill(dt); - - for (int i = 1; i <= 100; i++) - { - DataRow row = dt.NewRow(); - row["id"] = i; - row["name"] = "name " + i; - dt.Rows.Add(row); - } - - da.UpdateBatchSize = 10; - da.Update(dt); - - dt.Rows.Clear(); - da.Fill(dt); - Assert.Equal(100, dt.Rows.Count); - for (int i = 0; i < 100; i++) - { - Assert.Equal(i + 1, dt.Rows[i]["id"]); - Assert.Equal("name " + (i + 1), dt.Rows[i]["name"]); - } - } - - [Fact] - public void TestBatchingUpdates() - { - executeSQL("CREATE TABLE Test (id INT, name VARCHAR(20), PRIMARY KEY(id))"); - executeSQL("INSERT INTO Test VALUES (1, 'Test 1')"); - executeSQL("INSERT INTO Test VALUES (2, 'Test 2')"); - executeSQL("INSERT INTO Test VALUES (3, 'Test 3')"); - - MySqlDataAdapter dummyDA = new MySqlDataAdapter("SELECT * FROM Test", connection); - MySqlCommandBuilder cb = new MySqlCommandBuilder(dummyDA); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test ORDER BY id ASC", connection); - da.UpdateCommand = cb.GetUpdateCommand(); - da.UpdateCommand.UpdatedRowSource = UpdateRowSource.None; - - DataTable dt = new DataTable(); - da.Fill(dt); - - dt.Rows[0]["id"] = 4; - dt.Rows[1]["name"] = "new test value"; - dt.Rows[2]["id"] = 6; - dt.Rows[2]["name"] = "new test value #2"; - - da.UpdateBatchSize = 0; - da.Update(dt); - - dt.Rows.Clear(); - da.Fill(dt); - Assert.Equal(3, dt.Rows.Count); - Assert.Equal(2, dt.Rows[0]["id"]); - Assert.Equal(4, dt.Rows[1]["id"]); - Assert.Equal(6, dt.Rows[2]["id"]); - Assert.Equal("new test value", dt.Rows[0]["name"]); - Assert.Equal("Test 1", dt.Rows[1]["name"]); - Assert.Equal("new test value #2", dt.Rows[2]["name"]); - } - - [Fact] - public void TestBatchingMixed() - { - executeSQL("CREATE TABLE Test (id INT, name VARCHAR(20), PRIMARY KEY(id))"); - executeSQL("INSERT INTO Test VALUES (1, 'Test 1')"); - executeSQL("INSERT INTO Test VALUES (2, 'Test 2')"); - executeSQL("INSERT INTO Test VALUES (3, 'Test 3')"); - - MySqlDataAdapter dummyDA = new MySqlDataAdapter("SELECT * FROM Test", connection); - MySqlCommandBuilder cb = new MySqlCommandBuilder(dummyDA); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test ORDER BY id", connection); - da.UpdateCommand = cb.GetUpdateCommand(); - da.InsertCommand = cb.GetInsertCommand(); - da.DeleteCommand = cb.GetDeleteCommand(); - da.UpdateCommand.UpdatedRowSource = UpdateRowSource.None; - da.InsertCommand.UpdatedRowSource = UpdateRowSource.None; - da.DeleteCommand.UpdatedRowSource = UpdateRowSource.None; - - DataTable dt = new DataTable(); - da.Fill(dt); - - dt.Rows[0]["id"] = 4; - dt.Rows[1]["name"] = "new test value"; - dt.Rows[2]["id"] = 6; - dt.Rows[2]["name"] = "new test value #2"; - - DataRow row = dt.NewRow(); - row["id"] = 7; - row["name"] = "foobar"; - dt.Rows.Add(row); - - dt.Rows[1].Delete(); - - da.UpdateBatchSize = 0; - da.Update(dt); - - dt.Rows.Clear(); - da.Fill(dt); - Assert.Equal(3, dt.Rows.Count); - Assert.Equal(4, dt.Rows[0]["id"]); - Assert.Equal(6, dt.Rows[1]["id"]); - Assert.Equal(7, dt.Rows[2]["id"]); - Assert.Equal("Test 1", dt.Rows[0]["name"]); - Assert.Equal("new test value #2", dt.Rows[1]["name"]); - Assert.Equal("foobar", dt.Rows[2]["name"]); - } - - [Fact] - public void TestBatchingInsertsMoreThanMaxPacket() - { - int blobSize = 64000; - - executeSQL("CREATE TABLE Test (id INT, img BLOB, PRIMARY KEY(id))"); - - int numRows = (ts.maxPacketSize / blobSize) * 2; - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - MySqlCommand ins = new MySqlCommand("INSERT INTO test (id, img) VALUES (@p1, @p2)", connection); - da.InsertCommand = ins; - ins.UpdatedRowSource = UpdateRowSource.None; - ins.Parameters.Add("@p1", MySqlDbType.Int32).SourceColumn = "id"; - ins.Parameters.Add("@p2", MySqlDbType.Blob).SourceColumn = "img"; - - DataTable dt = new DataTable(); - da.Fill(dt); - - for (int i = 0; i < numRows; i++) - { - DataRow row = dt.NewRow(); - row["id"] = i; - row["img"] = Utils.CreateBlob(blobSize); - dt.Rows.Add(row); - } - - da.UpdateBatchSize = 0; - da.Update(dt); - - dt.Rows.Clear(); - da.Fill(dt); - Assert.Equal(numRows, dt.Rows.Count); - for (int i = 0; i < numRows; i++) - Assert.Equal(i, dt.Rows[i]["id"]); - } - - [Fact] - public void FunctionsReturnString() - { - string connStr = ts.GetConnection(true).ConnectionString + ";functions return string=yes;database=" + ts.baseDBName + "0"; - - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - MySqlDataAdapter da = new MySqlDataAdapter("SELECT CONCAT(1,2)", c); - DataTable dt = new DataTable(); - da.Fill(dt); - Assert.Equal(1, dt.Rows.Count); - Assert.Equal("12", dt.Rows[0][0]); - Assert.True(dt.Rows[0][0] is string); - } - } - - /// - /// Bug #34657 MySqlDataAdapter.Update(DataRow[] rows) fails with MySqlCommandBuilder - /// - [Fact] - public void ConnectionNotOpenForInsert() - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL(@"CREATE TABLE Test (id int(11) NOT NULL default '0', - txt varchar(100) default NULL, val decimal(11,2) default NULL, - PRIMARY KEY(id)) ENGINE=InnoDB DEFAULT CHARSET=latin1"); - executeSQL("INSERT INTO Test VALUES (1, 'name', 23.2)"); - - string connStr = ts.GetConnection(true).ConnectionString + ";database=" + ts.baseDBName + "0"; - using (MySqlConnection c = new MySqlConnection(connStr)) - { - string sql = "SELECT * FROM Test"; - MySqlDataAdapter da = new MySqlDataAdapter(sql, c); - MySqlCommandBuilder bld = new MySqlCommandBuilder(da); - DataSet ds = new DataSet(); - da.Fill(ds); - - ds.Tables[0].Rows[0]["val"] = 99.9M; - da.Update(new DataRow[] { ds.Tables[0].Rows[0] }); - - DataRow r = ds.Tables[0].NewRow(); - r["id"] = 4; - r["txt"] = "sds"; - r["val"] = 113.2M; - ds.Tables[0].Rows.Add(r); - da.Update(new DataRow[] { r }); - } - } - - /// - /// Bug#54863 : several datadapter.Update()s with DataTable changes in - /// between can result into ConcurrencyException - /// - [Fact] - public void AdapterConcurrentException() - { - executeSQL( - "CREATE TABLE T (" + - "id_auto int(11) NOT NULL AUTO_INCREMENT," + - "field varchar(50) DEFAULT NULL," + - "PRIMARY KEY (id_auto))"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM T", connection); - da.InsertCommand = connection.CreateCommand(); - da.InsertCommand.CommandText = @"INSERT INTO T(field) VALUES (@p_field); - SELECT * FROM T WHERE id_auto=@@IDENTITY"; - da.InsertCommand.Parameters.Add("@p_field", MySqlDbType.VarChar, 50, "field"); - da.InsertCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord; - - da.DeleteCommand = connection.CreateCommand(); - da.DeleteCommand.CommandText = "DELETE FROM T WHERE id_auto=@id_auto"; - da.DeleteCommand.Parameters.Add("@id_auto", MySqlDbType.Int32, 4, "id_auto"); - - DataSet ds = new DataSet(); - da.Fill(ds, "T"); - - DataTable table = ds.Tables["T"]; - DataRow r = table.NewRow(); - r["field"] = "row"; - table.Rows.Add(r); - da.Update(table); - - Assert.Equal(r.RowState, DataRowState.Unchanged); - - table.Rows[0].Delete(); - - r = table.NewRow(); - r["field"] = "row2"; - table.Rows.Add(r); - - da.Update(table); // here was concurrencyviolation - da.Fill(ds); - Assert.Equal(ds.Tables["T"].Rows.Count, 1); - Assert.Equal(ds.Tables["T"].Rows[0]["field"], "row2"); - } - - /// - /// Bug #38411, using closed connection with data adapter. - /// - [Fact] - public void BatchingConnectionClosed() - { - executeSQL("CREATE TABLE Test (id INT, name VARCHAR(20), PRIMARY KEY(id))"); - - MySqlConnection c = new MySqlConnection(GetConnection(true).ConnectionString +";database=" + ts.baseDBName + "0"); - MySqlConnection c2 = new MySqlConnection(GetConnection(true).ConnectionString + ";database=" + ts.baseDBName + "0"); - MySqlConnection c3 = new MySqlConnection(GetConnection(true).ConnectionString + ";database=" + ts.baseDBName + "0"); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", c); - MySqlCommand ins = new MySqlCommand("INSERT INTO test (id, name) VALUES (?p1, ?p2)", c); - da.InsertCommand = ins; - ins.UpdatedRowSource = UpdateRowSource.None; - ins.Parameters.Add("?p1", MySqlDbType.Int32).SourceColumn = "id"; - ins.Parameters.Add("?p2", MySqlDbType.VarChar, 20).SourceColumn = "name"; - - MySqlCommand del = new MySqlCommand("delete from test where id=?p1", c2); - da.DeleteCommand = del; - del.UpdatedRowSource = UpdateRowSource.None; - del.Parameters.Add("?p1", MySqlDbType.Int32).SourceColumn = "id"; - - - MySqlCommand upd = new MySqlCommand("update test set id=?p1, name=?p2 where id=?p1", c3); - da.UpdateCommand = upd; - upd.UpdatedRowSource = UpdateRowSource.None; - upd.Parameters.Add("?p1", MySqlDbType.Int32).SourceColumn = "id"; - upd.Parameters.Add("?p2", MySqlDbType.VarChar, 20).SourceColumn = "name"; - - DataTable dt = new DataTable(); - da.Fill(dt); - - for (int i = 1; i <= 100; i++) - { - DataRow row = dt.NewRow(); - row["id"] = i; - row["name"] = "name " + i; - dt.Rows.Add(row); - } - - da.UpdateBatchSize = 10; - da.Update(dt); - - dt.Rows.Clear(); - da.Fill(dt); - Assert.Equal(100, dt.Rows.Count); - for (int i = 0; i < 100; i++) - { - Assert.Equal(i + 1, dt.Rows[i]["id"]); - Assert.Equal("name " + (i + 1), dt.Rows[i]["name"]); - } - - foreach (DataRow row in dt.Rows) - { - row["name"] = row["name"] + "_xxx"; - } - da.Update(dt); - for (int i = 0; i < 100; i++) - { - dt.Rows[i].Delete(); - } - da.Update(dt); - dt.Rows.Clear(); - da.Fill(dt); - Assert.Equal(dt.Rows.Count, 0); - - } - /// - /// Bug#54895 - /// ConcurrencyException when trying to use UpdateRowSource.FirstReturnedRecord - /// with UpdateCommand and stored procedure. - /// - [Fact] - public void UpdateReturnFirstRecord() - { - string createTable = - "CREATE TABLE `bugtable` ( " + - "`id_auto` int(11) NOT NULL AUTO_INCREMENT," + - "`field` varchar(50) DEFAULT NULL," + - "counter int NOT NULL DEFAULT 0," + - "PRIMARY KEY (`id_auto`)" + - ")"; - - string procGetAll = - "CREATE PROCEDURE sp_getall_bugtable()" + - " BEGIN " + - "select * from bugtable;" + - " END "; - - string procUpdate = - "CREATE PROCEDURE sp_updatebugtable(" + - "in p_id_auto int, " + - "in p_field varchar(50)) " + - "BEGIN " + - "update bugtable set field = p_field, counter = counter+1 where id_auto=p_id_auto; " + - "select * from bugtable where id_auto=p_id_auto; " + /*retrieve updated row*/ - "END "; - - executeSQL(createTable); - executeSQL(procGetAll); - executeSQL(procUpdate); - - - /* Add one row to the table */ - MySqlCommand cmd = new MySqlCommand( - "insert into bugtable(field) values('x')", connection); - cmd.ExecuteNonQuery(); - - - DataSet ds = new DataSet(); - MySqlDataAdapter da = new MySqlDataAdapter(); - - da.SelectCommand = connection.CreateCommand(); - da.SelectCommand.CommandType = CommandType.StoredProcedure; - da.SelectCommand.CommandText = "sp_getall_bugtable"; - - da.UpdateCommand = connection.CreateCommand(); - da.UpdateCommand.CommandType = CommandType.StoredProcedure; - da.UpdateCommand.CommandText = "sp_updatebugtable"; - da.UpdateCommand.Parameters.Add("p_id_auto", MySqlDbType.Int32, 4, "id_auto"); - da.UpdateCommand.Parameters.Add("p_field", MySqlDbType.VarChar, 4, "field"); - da.UpdateCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord; - - - da.Fill(ds, "bugtable"); - DataTable table = ds.Tables["bugtable"]; - DataRow row = table.Rows[0]; - row["field"] = "newvalue"; - Assert.Equal(row.RowState, DataRowState.Modified); - Assert.Equal((int)row["counter"], 0); - - da.Update(table); - - // Verify that "counter" field was changed by updating stored procedure. - Assert.Equal((int)row["counter"], 1); - } - - [Fact] - public void FillFromStoredProcedureMultipleTimesCreatesExpectedRows() - { - executeSQL("CREATE PROCEDURE SimpleSelect() BEGIN SELECT 'ADummyVal' as DummyVal; END"); - - using (MySqlConnection connection = new MySqlConnection(ts.GetPoolingConnectionString())) - { - MySqlDataAdapter adapter = new MySqlDataAdapter("SimpleSelect", connection); - adapter.SelectCommand.CommandType = CommandType.StoredProcedure; - DataTable table = new DataTable(); - adapter.Fill(table); - Assert.Equal(1, table.Rows.Count); - - adapter = new MySqlDataAdapter("SimpleSelect", connection); - adapter.SelectCommand.CommandType = CommandType.StoredProcedure; - table = new DataTable(); - adapter.Fill(table); - Assert.Equal(1, table.Rows.Count); - - MySqlConnection.ClearPool(connection); - } - } - - [Fact] - public void ChangeStoredProcedureBasedSelectCommandDoesNotThrow() - { - executeSQL("CREATE PROCEDURE SimpleSelect1() BEGIN SELECT 'ADummyVal' as DummyVal; END"); - executeSQL("CREATE PROCEDURE SimpleSelect2() BEGIN SELECT 'ADummyVal' as DummyVal; END"); - - using (MySqlConnection connection = new MySqlConnection(ts.GetPoolingConnectionString())) - { - MySqlDataAdapter adapter = new MySqlDataAdapter("SimpleSelect1", connection); - adapter.SelectCommand.CommandType = CommandType.StoredProcedure; - DataTable table = new DataTable(); - adapter.Fill(table); - Assert.Equal(1, table.Rows.Count); - - adapter.SelectCommand = new MySqlCommand("SimpleSelect2", connection); - adapter.SelectCommand.CommandType = CommandType.StoredProcedure; - table = new DataTable(); - - try - { - adapter.Fill(table); - Assert.Equal(1, table.Rows.Count); - } - finally - { - MySqlConnection.ClearPool(connection); - } - } - } - -#if NET_45_OR_GREATER - #region Async - [Fact] - public async Task FillAsync() - { - executeSQL("CREATE TABLE DAFillAsyncTest (id INT NOT NULL AUTO_INCREMENT, id2 INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, ts TIMESTAMP, OriginalId INT, PRIMARY KEY(id, id2))"); - executeSQL("INSERT INTO DAFillAsyncTest (id, id2, name, dt) VALUES (NULL, 1, 'Name 1', Now())"); - executeSQL("INSERT INTO DAFillAsyncTest (id, id2, name, dt) VALUES (NULL, 2, NULL, Now())"); - executeSQL("INSERT INTO DAFillAsyncTest (id, id2, name, dt) VALUES (NULL, 3, '', Now())"); - - MySqlDataAdapter da = new MySqlDataAdapter("select * from DAFillAsyncTest", connection); - DataSet ds = new DataSet(); - await da.FillAsync(ds, "DAFillAsyncTest"); - - Assert.Equal(1, ds.Tables.Count); - Assert.Equal(3, ds.Tables[0].Rows.Count); - - Assert.Equal(1, ds.Tables[0].Rows[0]["id2"]); - Assert.Equal(2, ds.Tables[0].Rows[1]["id2"]); - Assert.Equal(3, ds.Tables[0].Rows[2]["id2"]); - - Assert.Equal("Name 1", ds.Tables[0].Rows[0]["name"]); - Assert.Equal(DBNull.Value, ds.Tables[0].Rows[1]["name"]); - Assert.Equal(String.Empty, ds.Tables[0].Rows[2]["name"]); - } - - [Fact] - public async Task FillSchemaAsync() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE PROCEDURE DAFillSchemaAsyncSpTest() BEGIN SELECT * FROM DAFillSchemaAsyncTest; END"); - executeSQL(@"CREATE TABLE DAFillSchemaAsyncTest(id INT AUTO_INCREMENT, name VARCHAR(20), PRIMARY KEY (id)) "); - - MySqlCommand cmd = new MySqlCommand("DAFillSchemaAsyncSpTest", connection); - cmd.CommandType = CommandType.StoredProcedure; - - MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly); - reader.Read(); - reader.Close(); - - MySqlDataAdapter da = new MySqlDataAdapter(cmd); - DataTable schema = new DataTable(); - await da.FillSchemaAsync(schema, SchemaType.Source); - Assert.Equal(2, schema.Columns.Count); - } - - [Fact] - public async Task UpdateAsync() - { - executeSQL("CREATE TABLE DAUpdateAsyncTest (id INT NOT NULL AUTO_INCREMENT, id2 INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, ts TIMESTAMP, OriginalId INT, PRIMARY KEY(id, id2))"); - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM DAUpdateAsyncTest;", connection); - MySqlCommandBuilder cb = new MySqlCommandBuilder(da); - DataTable dt = new DataTable(); - da.Fill(dt); - - DataRow dr = dt.NewRow(); - dr["id2"] = 2; - dr["name"] = "TestName1"; - dt.Rows.Add(dr); - int count = await da.UpdateAsync(dt); - - Assert.True(count == 1, "checking insert count"); - Assert.True(dt.Rows[dt.Rows.Count - 1]["id"] != null, "Checking auto increment column"); - - dt.Rows.Clear(); - da.Fill(dt); - dt.Rows[0]["id2"] = 3; - dt.Rows[0]["name"] = "TestName2"; - dt.Rows[0]["ts"] = DBNull.Value; - DateTime day1 = new DateTime(2003, 1, 16, 12, 24, 0); - dt.Rows[0]["dt"] = day1; - dt.Rows[0]["tm"] = day1.TimeOfDay; - count = await da.UpdateAsync(dt); - - Assert.True(dt.Rows[0]["ts"] != null, "checking refresh of record"); - Assert.True(dt.Rows[0]["id2"] != null, "checking refresh of primary column"); - - dt.Rows.Clear(); - da.Fill(dt); - - Assert.True(count == 1, "checking update count"); - DateTime dateTime = (DateTime)dt.Rows[0]["dt"]; - Assert.True(day1.Date == dateTime.Date, "checking date"); - Assert.True(day1.TimeOfDay == (TimeSpan)dt.Rows[0]["tm"], "checking time"); - - dt.Rows[0].Delete(); - count = await da.UpdateAsync(dt); - - Assert.True(count == 1, "checking insert count"); - - dt.Rows.Clear(); - da.Fill(dt); - Assert.True(dt.Rows.Count == 0, "checking row count"); - cb.Dispose(); - } - #endregion -#endif - } -} diff --git a/Tests/MySql.Data.Tests/MySqlDataReaderTests.cs b/Tests/MySql.Data.Tests/MySqlDataReaderTests.cs deleted file mode 100644 index bd7293a68..000000000 --- a/Tests/MySql.Data.Tests/MySqlDataReaderTests.cs +++ /dev/null @@ -1,889 +0,0 @@ -// Copyright © 2013, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Data; -#if !NETCORE10 -using System.Data.SqlTypes; -#endif - -namespace MySql.Data.MySqlClient.Tests -{ - public class MySqlDataReaderTests : TestBase - { - - TestSetup ts; - - public MySqlDataReaderTests(TestSetup setup):base (setup, "datareadertests") - { - ts = setup; - } - - - private void CreateDefaultTable() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), d DATE, dt DATETIME, b1 LONGBLOB, PRIMARY KEY(id))"); - } - - [Fact] - public void TestMultipleResultsets() - { - CreateDefaultTable(); - - MySqlCommand cmd = new MySqlCommand("", connection); - // insert 100 records - cmd.CommandText = "INSERT INTO Test (id,name) VALUES (?id, 'test')"; - cmd.Parameters.Add(new MySqlParameter("?id", 1)); - for (int i = 1; i <= 100; i++) - { - cmd.Parameters[0].Value = i; - cmd.ExecuteNonQuery(); - } - - // execute it one time - cmd = new MySqlCommand("SELECT id FROM Test WHERE id<50; SELECT * FROM Test WHERE id >= 50;", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.NotNull(reader); - Assert.Equal(true, reader.HasRows); - Assert.True(reader.Read()); - Assert.Equal(1, reader.FieldCount); - Assert.True(reader.NextResult()); - Assert.Equal(true, reader.HasRows); - Assert.Equal(5, reader.FieldCount); - } - - // now do it again - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.NotNull(reader); - Assert.Equal(true, reader.HasRows); - Assert.True(reader.Read()); - Assert.Equal(1, reader.FieldCount); - Assert.True(reader.NextResult()); - Assert.Equal(true, reader.HasRows); - Assert.Equal(5, reader.FieldCount); - } - } - - [Fact] - public void GetBytes() - { - CreateDefaultTable(); - int len = 50000; - byte[] bytes = Utils.CreateBlob(len); - MySqlCommand cmd = new MySqlCommand( - "INSERT INTO Test (id, name, b1) VALUES(1, 'Test', ?b1)", connection); - cmd.Parameters.AddWithValue("?b1", bytes); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - - long sizeBytes = reader.GetBytes(4, 0, null, 0, 0); - Assert.Equal(len, sizeBytes); - - byte[] buff1 = new byte[len / 2]; - byte[] buff2 = new byte[len - (len / 2)]; - long buff1cnt = reader.GetBytes(4, 0, buff1, 0, len / 2); - long buff2cnt = reader.GetBytes(4, buff1cnt, buff2, 0, buff2.Length); - Assert.Equal(buff1.Length, buff1cnt); - Assert.Equal(buff2.Length, buff2cnt); - - for (int i = 0; i < buff1.Length; i++) - Assert.Equal(bytes[i], buff1[i]); - - for (int i = 0; i < buff2.Length; i++) - Assert.Equal(bytes[buff1.Length + i], buff2[i]); - } - - // now check with sequential access - using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)) - { - Assert.True(reader.Read()); - int mylen = len; - byte[] buff = new byte[8192]; - int startIndex = 0; - while (mylen > 0) - { - int readLen = Math.Min(mylen, buff.Length); - int retVal = (int)reader.GetBytes(4, startIndex, buff, 0, readLen); - Assert.Equal(readLen, retVal); - for (int i = 0; i < readLen; i++) - Assert.Equal(bytes[startIndex + i], buff[i]); - startIndex += readLen; - mylen -= readLen; - } - } - } - - [Fact] - public void TestSingleResultSetBehavior() - { - CreateDefaultTable(); - executeSQL("INSERT INTO Test (id, name, b1) VALUES (1, 'Test1', NULL)"); - executeSQL("INSERT INTO Test (id, name, b1) VALUES (2, 'Test1', NULL)"); - - MySqlCommand cmd = new MySqlCommand( - "SELECT * FROM Test WHERE id=1; SELECT * FROM Test WHERE id=2", connection); - using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleResult)) - { - bool result = reader.Read(); - Assert.Equal(true, result); - - result = reader.NextResult(); - Assert.Equal(false, result); - } - } - - -#if !NETCORE10 - /// - /// Bug #59989 MysqlDataReader.GetSchemaTable returns incorrect Values an types - /// - [Fact] - public void GetSchema() - { - string sql = @"CREATE TABLE test2(id INT UNSIGNED AUTO_INCREMENT - NOT NULL, name VARCHAR(255) NOT NULL, name2 VARCHAR(40), fl FLOAT, - dt DATETIME, `udec` DECIMAL(20,6) unsigned, - `dec` DECIMAL(44,3), bt boolean, PRIMARY KEY(id))"; - - executeSQL(sql); - executeSQL("INSERT INTO test2 VALUES(1,'Test', 'Test', 1.0, now(), 20.0, 12.324, True)"); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM test2", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - DataTable dt = reader.GetSchemaTable(); - Assert.True(true == (Boolean)dt.Rows[0]["IsAutoIncrement"], "Checking auto increment"); - Assert.False((bool)dt.Rows[0]["IsUnique"], "Checking IsUnique"); - Assert.True((bool)dt.Rows[0]["IsKey"]); - Assert.True(false == (Boolean)dt.Rows[0]["AllowDBNull"], "Checking AllowDBNull"); - Assert.True(false == (Boolean)dt.Rows[1]["AllowDBNull"], "Checking AllowDBNull"); - Assert.Equal(255, dt.Rows[1]["ColumnSize"]); - Assert.Equal(40, dt.Rows[2]["ColumnSize"]); - - // udec column - Assert.Equal(21, dt.Rows[5]["ColumnSize"]); - Assert.Equal(20, dt.Rows[5]["NumericPrecision"]); - Assert.Equal(6, dt.Rows[5]["NumericScale"]); - - // dec column - Assert.Equal(46, dt.Rows[6]["ColumnSize"]); - Assert.Equal(44, dt.Rows[6]["NumericPrecision"]); - Assert.Equal(3, dt.Rows[6]["NumericScale"]); - } - } -#endif - - [Fact] - public void CloseConnectionBehavior() - { - CreateDefaultTable(); - executeSQL("INSERT INTO Test(id,name) VALUES(1,'test')"); - - using (MySqlConnection c2 = new MySqlConnection(connection.ConnectionString)) - { - c2.Open(); - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", c2); - using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)) - { - Assert.True(reader.Read()); - reader.Close(); - Assert.True(c2.State == ConnectionState.Closed); - } - } - } - - [Fact] - public void SingleRowBehavior() - { - CreateDefaultTable(); - executeSQL("INSERT INTO Test(id,name) VALUES(1,'test1')"); - executeSQL("INSERT INTO Test(id,name) VALUES(2,'test2')"); - executeSQL("INSERT INTO Test(id,name) VALUES(3,'test3')"); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", connection); - using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) - { - Assert.True(reader.Read(), "First read"); - Assert.False(reader.Read(), "Second read"); - Assert.False(reader.NextResult(), "Trying NextResult"); - } - - cmd.CommandText = "SELECT * FROM Test where id=1"; - using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) - { - Assert.True(reader.Read()); - Assert.Equal("test1", reader.GetString(1)); - Assert.False(reader.Read()); - Assert.False(reader.NextResult()); - } - } - - [Fact] - public void SingleRowBehaviorWithLimit() - { - CreateDefaultTable(); - executeSQL("INSERT INTO Test(id,name) VALUES(1,'test1')"); - executeSQL("INSERT INTO Test(id,name) VALUES(2,'test2')"); - executeSQL("INSERT INTO Test(id,name) VALUES(3,'test3')"); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test LIMIT 2", connection); - using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) - { - Assert.True(reader.Read(), "First read"); - Assert.False(reader.Read(), "Second read"); - Assert.False(reader.NextResult(), "Trying NextResult"); - } - - using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) - { - Assert.True(reader.Read(), "First read"); - Assert.False(reader.Read(), "Second read"); - Assert.False(reader.NextResult(), "Trying NextResult"); - } - - using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SingleRow)) - { - Assert.True(reader.Read(), "First read"); - Assert.False(reader.Read(), "Second read"); - Assert.False(reader.NextResult(), "Trying NextResult"); - } - } - - [Fact] - public void SimpleSingleRow() - { - CreateDefaultTable(); - executeSQL("INSERT INTO Test(id,name) VALUES(1,'test1')"); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.Read(), "First read"); - Assert.Equal(1, reader.GetInt32(0)); - Assert.Equal("test1", reader.GetString(1)); - Assert.False(reader.Read(), "Second read"); - Assert.False(reader.NextResult(), "Trying NextResult"); - } - } - - [Fact] - public void ConsecutiveNulls() - { - CreateDefaultTable(); - executeSQL("INSERT INTO Test (id, name, dt) VALUES (1, 'Test', NULL)"); - executeSQL("INSERT INTO Test (id, name, dt) VALUES (2, NULL, now())"); - executeSQL("INSERT INTO Test (id, name, dt) VALUES (3, 'Test2', NULL)"); - - MySqlCommand cmd = new MySqlCommand("SELECT id, name, dt FROM Test", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - Assert.Equal(1, reader.GetValue(0)); - Assert.Equal("Test", reader.GetValue(1)); - Assert.Equal("Test", reader.GetString(1)); - Assert.Equal(DBNull.Value, reader.GetValue(2)); - reader.Read(); - Assert.Equal(2, reader.GetValue(0)); - Assert.Equal(DBNull.Value, reader.GetValue(1)); -#if !NETCORE10 - Exception ex = Assert.Throws(() => reader.GetString(1)); - Assert.Equal(ex.Message, "Data is Null. This method or property cannot be called on Null values."); -#endif - Assert.False(reader.IsDBNull(2)); - reader.Read(); - Assert.Equal(3, reader.GetValue(0)); - Assert.Equal("Test2", reader.GetValue(1)); - Assert.Equal("Test2", reader.GetString(1)); - Assert.Equal(DBNull.Value, reader.GetValue(2)); -#if !NETCORE10 - ex = Assert.Throws(() => reader.GetMySqlDateTime(2)); - Assert.Equal(ex.Message, "Data is Null. This method or property cannot be called on Null values."); -#endif - Assert.False(reader.Read()); - Assert.False(reader.NextResult()); - } - } - - [Fact] - public void HungDataReader() - { - MySqlCommand cmd = new MySqlCommand("USE `" + ts.baseDBName + "0" + "`; SHOW TABLES", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - while (reader.Read()) - { - reader.GetString(0); - } - } - } - - /// - /// Added test for IsDBNull from bug# 7399 - /// - [Fact] - public void SequentialAccessBehavior() - { - CreateDefaultTable(); - executeSQL("INSERT INTO Test(id,name) VALUES(1,'test1')"); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", connection); - using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)) - { - Assert.True(reader.Read()); - Assert.False(reader.IsDBNull(0)); - int i = reader.GetInt32(0); - string s = reader.GetString(1); - Assert.Equal(1, i); - Assert.Equal("test1", s); - - // this next line should throw an exception - Exception ex = Assert.Throws(() => i = reader.GetInt32(0)); - Assert.Equal(ex.Message, "Invalid attempt to read a prior column using SequentialAccess"); - } - } - - - [Fact] - public void ReadingTextFields() - { - executeSQL("CREATE TABLE Test (id int, t1 TEXT)"); - executeSQL("INSERT INTO Test VALUES (1, 'Text value')"); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - string s = reader["t1"].ToString(); - Assert.Equal("Text value", s); - } - } - - [Fact] - public void ReadingFieldsBeforeRead() - { - CreateDefaultTable(); - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - try - { - reader.GetInt32(0); - } - catch (MySqlException) - { - } - } - } - - [Fact] - public void GetChar() - { - CreateDefaultTable(); - executeSQL("INSERT INTO Test (id, name) VALUES (1, 'a')"); - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - char achar = reader.GetChar(1); - Assert.Equal('a', achar); - } - } - - [Fact] - public void ReaderOnNonQuery() - { - CreateDefaultTable(); - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id,name) VALUES (1,'Test')", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.False(reader.Read()); - reader.Close(); - - cmd.CommandText = "SELECT name FROM Test"; - object v = cmd.ExecuteScalar(); - Assert.Equal("Test", v); - } - } - - [Fact] - public void TestManyDifferentResultsets() - { - CreateDefaultTable(); - MySqlCommand cmd = new MySqlCommand("", connection); - // insert 100 records - cmd.CommandText = "INSERT INTO Test (id,name,dt,b1) VALUES (?id, 'test','2004-12-05 12:57:00','long blob data')"; - cmd.Parameters.Add(new MySqlParameter("?id", 1)); - for (int i = 1; i <= 100; i++) - { - cmd.Parameters[0].Value = i; - cmd.ExecuteNonQuery(); - } - - cmd = new MySqlCommand("SELECT id FROM Test WHERE id= ?param1; " + - "SELECT id, dt, b1 FROM Test WHERE id = -50; " + - "SELECT b1 FROM Test WHERE id = -50; " + - "SELECT id, dt, b1 FROM Test WHERE id < ?param1; " + - "SELECT b1 FROM Test WHERE id >= ?param1;", connection); - - cmd.Parameters.AddWithValue("?param1", 50); - - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - //First ResultSet, should have 49 rows. - //SELECT id FROM Test WHERE id= ?param1; - Assert.True(reader.NextResult()); - Assert.Equal(true, reader.HasRows); - Assert.Equal(5, reader.FieldCount); - for (int i = 0; i < 51; i++) - { - Assert.True(reader.Read()); - } - Assert.Equal(false, reader.Read()); - - - //Fourth ResultSet, should have no rows. - //SELECT id, dt, b1 FROM Test WHERE id = -50; - Assert.True(reader.NextResult()); - Assert.Equal(false, reader.HasRows); - Assert.Equal(3, reader.FieldCount); //Will Fail if uncommented expected 3 returned 5 - Assert.Equal(false, reader.Read()); - - //Fifth ResultSet, should have no rows. - //SELECT b1 FROM Test WHERE id = -50; - Assert.True(reader.NextResult()); - Assert.Equal(false, reader.HasRows); - Assert.Equal(1, reader.FieldCount); //Will Fail if uncommented expected 1 returned 5 - Assert.Equal(false, reader.Read()); - - //Sixth ResultSet, should have 49 rows. - //SELECT id, dt, b1 FROM Test WHERE id < ?param1; - Assert.True(reader.NextResult()); - Assert.Equal(true, reader.HasRows); - Assert.Equal(3, reader.FieldCount); //Will Fail if uncommented expected 3 returned 5 - for (int i = 0; i < 49; i++) - { - Assert.True(reader.Read()); - } - Assert.Equal(false, reader.Read()); - - //Seventh ResultSet, should have 51 rows. - //SELECT b1 FROM Test WHERE id >= ?param1; - Assert.True(reader.NextResult()); - Assert.Equal(true, reader.HasRows); - Assert.Equal(1, reader.FieldCount); //Will Fail if uncommented expected 1 returned 5 - for (int i = 0; i < 51; i++) - { - Assert.True(reader.Read()); - } - Assert.Equal(false, reader.Read()); - } - } - - - [Fact] - public void TestMultipleResultsWithQueryCacheOn() - { - CreateDefaultTable(); - executeSQL("SET SESSION query_cache_type = ON"); - executeSQL("INSERT INTO Test (id,name) VALUES (1, 'Test')"); - executeSQL("INSERT INTO Test (id,name) VALUES (51, 'Test')"); - - // execute it one time - MySqlCommand cmd = new MySqlCommand("SELECT id FROM Test WHERE id<50; SELECT * FROM Test WHERE id >= 50;", connection); - - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.NotNull(reader); - Assert.Equal(true, reader.HasRows); - Assert.True(reader.Read()); - Assert.Equal(1, reader.FieldCount); - Assert.True(reader.NextResult()); - Assert.Equal(true, reader.HasRows); - Assert.Equal(5, reader.FieldCount); - } - - // now do it again - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.NotNull(reader); - Assert.Equal(true, reader.HasRows); - Assert.True(reader.Read()); - Assert.Equal(1, reader.FieldCount); - Assert.True(reader.NextResult()); - Assert.Equal(true, reader.HasRows); - Assert.Equal(5, reader.FieldCount); - } - } - - /// - /// Bug #8630 Executing a query with the SchemaOnly option reads the entire resultset - /// - [Fact] - public void SchemaOnly() - { - CreateDefaultTable(); - executeSQL("INSERT INTO Test (id,name) VALUES(1,'test1')"); - executeSQL("INSERT INTO Test (id,name) VALUES(2,'test2')"); - executeSQL("INSERT INTO Test (id,name) VALUES(3,'test3')"); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", connection); - using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly)) - { -#if RT - Assert.Equal(5, reader.FieldCount); -#else - DataTable table = reader.GetSchemaTable(); - Assert.Equal(5, table.Rows.Count); - Assert.Equal(22, table.Columns.Count); -#endif - - Assert.False(reader.Read()); - } - } - - /// - /// Bug #9237 MySqlDataReader.AffectedRecords not set to -1 - /// - [Fact] - public void AffectedRows() - { - MySqlCommand cmd = new MySqlCommand("SHOW TABLES", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - reader.Close(); - Assert.Equal(-1, reader.RecordsAffected); - } - } - - /// - /// Bug #11873 Invalid timestamp in query produces incorrect reader exception - /// - [Fact] - public void InvalidTimestamp() - { - executeSQL("CREATE TABLE Test (tm TIMESTAMP)"); - executeSQL("INSERT INTO Test VALUES (NULL)"); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test WHERE tm = '7/1/2005 12:00:00 AM'", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - } - } - - /// - /// Bug #19294 IDataRecord.GetString method should return null for null values - /// - [Fact] - public void GetStringOnNull() - { - executeSQL("CREATE TABLE Test (id int, PRIMARY KEY(id))"); - MySqlCommand cmd = new MySqlCommand( - String.Format("SHOW INDEX FROM Test FROM `{0}`", ts.baseDBName + "0"), connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); -#if NETCORE10 - Assert.Throws(() => reader.GetString(reader.GetOrdinal("Sub_part"))); -#else - Assert.Throws(()=> reader.GetString(reader.GetOrdinal("Sub_part"))); -#endif - } - } - - -#if !NETCORE10 - /// - /// Bug #23538 Exception thrown when GetSchemaTable is called and "fields" is null. - /// - [Fact] - public void GetSchemaTableOnEmptyResultset() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE PROCEDURE spTest() BEGIN END"); - - MySqlCommand cmd = new MySqlCommand("spTest", connection); - cmd.CommandType = CommandType.StoredProcedure; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - DataTable dt = reader.GetSchemaTable(); - Assert.Null(dt); - } - } -#endif - - /// - /// Bug #24765 Retrieving empty fields results in check for isDBNull - /// - [Fact] - public void IsDbNullOnNonNullFields() - { - CreateDefaultTable(); - executeSQL("INSERT INTO Test (id, name) VALUES (1, '')"); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.Read()); - Assert.False(reader.IsDBNull(1)); - } - } - - -#if !NETCORE10 - /// - /// Bug #30204 Incorrect ConstraintException - /// - [Fact] - public void ConstraintWithLoadingReader() - { - executeSQL(@"CREATE TABLE Test (ID_A int(11) NOT NULL, - ID_B int(11) NOT NULL, PRIMARY KEY (ID_A,ID_B) - ) ENGINE=MyISAM DEFAULT CHARSET=latin1;"); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", connection); - DataTable dt = new DataTable(); - - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - dt.Load(reader); - } - - DataRow row = dt.NewRow(); - row["ID_A"] = 2; - row["ID_B"] = 3; - dt.Rows.Add(row); - - row = dt.NewRow(); - row["ID_A"] = 2; - row["ID_B"] = 4; - dt.Rows.Add(row); - } -#endif - - [Fact] - public void CloseConnectionBehavior2() - { - CreateDefaultTable(); - executeSQL("INSERT INTO Test(id,name) VALUES(1,'test')"); - - using (MySqlConnection c2 = new MySqlConnection(connection.ConnectionString)) - { - c2.Open(); - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", c2); - using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)) - { - Assert.True(reader.Read()); - } - } - } - - /// - /// Test that using command behavior SchemaOnly does not hose the st.connection - /// by leaving SQL_SELECT_LIMIT set to 0 after the error (and in normal - /// case too) - /// - /// Bug#30518 - /// - [Fact] - public void CommandBehaviorSchemaOnly() - { - - MySqlCommand cmd = new MySqlCommand("select * from doesnotexist", connection); - MySqlDataReader reader; - Exception ex = Assert.Throws(() => reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly)); - Assert.True(ex.Message.Contains(".doesnotexist' doesn't exist")); - - // Check that failed ExecuteReader did not leave SQL_SELECT_LIMIT - // set to 0. - cmd.CommandText = "select now()"; - reader = cmd.ExecuteReader(); - Assert.True(reader.Read()); - reader.Close(); - - - // Check that CommandBehavior.SchemaOnly does not return rows - reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly); - Assert.False(reader.Read()); - reader.Close(); - - - reader = cmd.ExecuteReader(); - // Check that prior setting of CommandBehavior did not - // leave SQL_SELECT_LIMIT set to 0 - Assert.True(reader.Read()); - reader.Close(); - } - - /// - /// Bug #37239 MySqlReader GetOrdinal performance changes break existing functionality - /// - [Fact] - public void ColumnsWithSameName() - { - CreateDefaultTable(); - executeSQL("INSERT INTO Test (id, name) VALUES (1, 'test')"); - - MySqlCommand cmd = new MySqlCommand("SELECT a.name, a.name FROM Test a", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - string name1 = reader.GetString(0); - string name2 = reader.GetString(1); - Assert.Equal(name1, name2); - Assert.Equal(name1, "test"); - } - - cmd.CommandText = "SELECT 'a' AS XYZ, 'b' as Xyz"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - string name1 = reader.GetString(0); - string name2 = reader.GetString(1); - } - } - - /// - /// Bug #47467 Two simple changes for DataReader - /// - [Fact] - public void Bug47467() - { - MySqlCommand cmd = new MySqlCommand("SELECT 1 as c1", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - Type t = reader.GetFieldType("c1"); - Exception ex = Assert.Throws(() => reader.GetOrdinal("nocol")); - Assert.True(ex.Message.IndexOf("nocol") != -1); - } - } - -#if !RT - /// - /// Tests fix for bug "ConstraintException when filling a datatable" (MySql bug #65065). - /// - [Fact] - public void ConstraintExceptionOnLoad() - { - MySqlConnection con = new MySqlConnection(); - try - { - con.ConnectionString = ts.GetConnection(false).ConnectionString; - con.Open(); - - MySqlCommand cmd = new MySqlCommand(); - - cmd.Connection = con; - - cmd.CommandText = "DROP TABLE IF EXISTS trx"; - cmd.ExecuteNonQuery(); - - cmd.CommandText = "DROP TABLE IF EXISTS camn"; - cmd.ExecuteNonQuery(); - - cmd.CommandText = "CREATE TABLE `camn` (" + - "`id_camn` int(10) unsigned NOT NULL AUTO_INCREMENT," + - "`no` int(4) unsigned NOT NULL," + - "`marq` varchar(45) COLLATE utf8_bin DEFAULT NULL," + - "`modl` varchar(45) COLLATE utf8_bin DEFAULT NULL," + - "`no_serie` varchar(17) COLLATE utf8_bin DEFAULT NULL," + - "`no_plaq` varchar(7) COLLATE utf8_bin DEFAULT NULL," + - "PRIMARY KEY (`id_camn`)," + - "UNIQUE KEY `id_camn_UNIQUE` (`id_camn`)," + - "UNIQUE KEY `no_UNIQUE` (`no`)," + - "UNIQUE KEY `no_serie_UNIQUE` (`no_serie`)," + - "UNIQUE KEY `no_plaq_UNIQUE` (`no_plaq`)" + - ") ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COLLATE=utf8_bin"; - cmd.ExecuteNonQuery(); - - cmd.CommandText = "CREATE TABLE `trx` (" + - "`id_trx` int(10) unsigned NOT NULL AUTO_INCREMENT," + - "`mnt` decimal(9,2) NOT NULL," + - "`dat_trx` date NOT NULL," + - "`typ_trx` varchar(45) COLLATE utf8_bin DEFAULT NULL," + - "`descr` tinytext COLLATE utf8_bin," + - "`id_camn` int(10) unsigned DEFAULT NULL," + - "PRIMARY KEY (`id_trx`)," + - "UNIQUE KEY `id_trx_UNIQUE` (`id_trx`)," + - "KEY `fk_trx_camn` (`id_camn`)," + - "CONSTRAINT `fk_trx_camn` FOREIGN KEY (`id_camn`) REFERENCES `camn` (`id_camn`) ON DELETE NO ACTION ON UPDATE NO ACTION" + - ") ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_bin"; - - cmd.ExecuteNonQuery(); - - cmd.CommandText = "INSERT INTO camn(id_camn, no, marq, modl, no_serie, no_plaq) VALUES(9, 3327, null, null, null, null);"; - cmd.ExecuteNonQuery(); - - cmd.CommandText = "INSERT INTO trx(id_trx, mnt, dat_trx, typ_trx, descr, id_camn) VALUES(1, 10, '2012-04-30', null, null, 9);"; - cmd.ExecuteNonQuery(); - cmd.CommandText = "INSERT INTO trx(id_trx, mnt, dat_trx, typ_trx, descr, id_camn) VALUES(2, 10, '2012-04-15', null, null, 9);"; - cmd.ExecuteNonQuery(); - cmd.CommandText = "INSERT INTO trx(id_trx, mnt, dat_trx, typ_trx, descr, id_camn) VALUES(3, 10, '2012-04-15', null, null, null);"; - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT cam.no_serie, t.mnt FROM trx t LEFT JOIN camn cam USING(id_camn) "; - MySqlDataReader dr = cmd.ExecuteReader(); - DataTable dataTable = new DataTable(); - DataSet ds = new DataSet(); - dataTable.Load( dr ); - dr.Close(); - } - finally - { - con.Close(); - } - } -#endif - } -} diff --git a/Tests/MySql.Data.Tests/OutputParametersBatch.cs b/Tests/MySql.Data.Tests/OutputParametersBatch.cs deleted file mode 100644 index dc2aef983..000000000 --- a/Tests/MySql.Data.Tests/OutputParametersBatch.cs +++ /dev/null @@ -1,615 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Data; - -namespace MySql.Data.MySqlClient.Tests -{ - public class OutputParametersBatch : TestBase - { - protected TestSetup ts; - protected bool prepare; - - public OutputParametersBatch(TestSetup setup) : base(setup, "outputparambatch") - { - ts = setup; - customConnection = new MySqlConnection(ts.GetConnection(false).ConnectionString + ";" + OnGetConnectionStringInfo()); - customConnection.Open(); - } - - protected OutputParametersBatch(TestSetup setup, string nameSpace): base(setup, nameSpace) - { - ts = setup; - customConnection = new MySqlConnection(ts.GetConnection(false).ConnectionString + ";" + OnGetConnectionStringInfo()); - customConnection.Open(); - } - - protected override string OnGetConnectionStringInfo() - { - return ";allow batch=true; ignore prepare = false;"; - } - - /// - /// Bug #17814 Stored procedure fails unless DbType set explicitly - /// Bug #23749 VarChar field size over 255 causes a System.OverflowException - /// - [Fact] - public void OutputParameters() - { - if (ts.version < new Version(5, 0)) return; - - // we don't want to run this test under no access - string connInfo = customConnection.ConnectionString; - if (connInfo.IndexOf("use procedure bodies=false") != -1) return; - - if (customConnection.connectionState != ConnectionState.Open) - customConnection.Open(); - - // create our procedure - executeSQL("CREATE PROCEDURE spTest(out value VARCHAR(350), OUT intVal INT, " + - "OUT dateVal TIMESTAMP, OUT floatVal FLOAT, OUT noTypeVarChar VARCHAR(20), " + - "OUT noTypeInt INT) " + - "BEGIN SET value='42'; SET intVal=33; SET dateVal='2004-06-05 07:58:09'; " + - "SET floatVal = 1.2; SET noTypeVarChar='test'; SET noTypeInt=66; END"); - - // we use rootConn here since we are using parameters - MySqlCommand cmd = new MySqlCommand("spTest", customConnection); - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.Add(new MySqlParameter("?value", MySqlDbType.VarChar)); - cmd.Parameters.Add(new MySqlParameter("?intVal", MySqlDbType.Int32)); - cmd.Parameters.Add(new MySqlParameter("?dateVal", MySqlDbType.DateTime)); - cmd.Parameters.Add(new MySqlParameter("?floatVal", MySqlDbType.Float)); - MySqlParameter vcP = new MySqlParameter(); - vcP.ParameterName = "?noTypeVarChar"; - vcP.Direction = ParameterDirection.Output; - cmd.Parameters.Add(vcP); - MySqlParameter vcI = new MySqlParameter(); - vcI.ParameterName = "?noTypeInt"; - vcI.Direction = ParameterDirection.Output; - cmd.Parameters.Add(vcI); - cmd.Parameters[0].Direction = ParameterDirection.Output; - cmd.Parameters[1].Direction = ParameterDirection.Output; - cmd.Parameters[2].Direction = ParameterDirection.Output; - cmd.Parameters[3].Direction = ParameterDirection.Output; - if (prepare) cmd.Prepare(); - int rowsAffected = cmd.ExecuteNonQuery(); - - //TODO fix this - //Assert.Equal(0, rowsAffected); - Assert.Equal("42", cmd.Parameters[0].Value); - Assert.Equal(33, cmd.Parameters[1].Value); - Assert.Equal(new DateTime(2004, 6, 5, 7, 58, 9), - Convert.ToDateTime(cmd.Parameters[2].Value)); - Assert.Equal((decimal)1.2, (decimal)(float)cmd.Parameters[3].Value); - Assert.Equal("test", cmd.Parameters[4].Value); - Assert.Equal(66, cmd.Parameters[5].Value); - } - - [Fact] - public void InputOutputParameters() - { - if (ts.version < new Version(5, 0)) return; - - if (customConnection.connectionState != ConnectionState.Open) - customConnection.Open(); - - // create our procedure - executeSQL("CREATE PROCEDURE spTest( INOUT strVal VARCHAR(50), INOUT numVal INT, OUT outVal INT UNSIGNED ) " + - "BEGIN SET strVal = CONCAT(strVal,'ending'); SET numVal=numVal * 2; SET outVal=99; END"); - - MySqlCommand cmd = new MySqlCommand("spTest", customConnection); - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.AddWithValue("?strVal", "beginning"); - cmd.Parameters.AddWithValue("?numVal", 33); - cmd.Parameters.AddWithValue("?outVal", MySqlDbType.Int32); - cmd.Parameters[0].Direction = ParameterDirection.InputOutput; - cmd.Parameters[1].Direction = ParameterDirection.InputOutput; - cmd.Parameters[2].Direction = ParameterDirection.Output; - if (prepare) cmd.Prepare(); - int rowsAffected = cmd.ExecuteNonQuery(); - Assert.Equal(0, rowsAffected); - Assert.Equal("beginningending", cmd.Parameters[0].Value); - Assert.Equal(66, cmd.Parameters[1].Value); - Assert.Equal(99, cmd.Parameters[2].Value); - } - - [Fact] - public void ExecuteScalar() - { - if (ts.version < new Version(5, 0)) return; - - if (customConnection.connectionState != ConnectionState.Open) - customConnection.Open(); - - // create our procedure - executeSQL("CREATE PROCEDURE spTest( IN valin VARCHAR(50), OUT valout VARCHAR(50) ) " + - "BEGIN SET valout=valin; SELECT 'Test'; END"); - - MySqlCommand cmd = new MySqlCommand("spTest", customConnection); - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.AddWithValue("?valin", "valuein"); - cmd.Parameters.Add(new MySqlParameter("?valout", MySqlDbType.VarChar)); - cmd.Parameters[1].Direction = ParameterDirection.Output; - if (prepare) cmd.Prepare(); - object result = cmd.ExecuteScalar(); - Assert.Equal("Test", result); - Assert.Equal("valuein", cmd.Parameters[1].Value); - } - - [Fact] - public void ExecuteReader() - { - if (ts.version < new Version(5, 0)) return; - - if (customConnection.connectionState != ConnectionState.Open) - customConnection.Open(); - - // create our procedure - executeSQL("CREATE PROCEDURE spTest(OUT p INT) " + - "BEGIN SELECT 1; SET p=2; END"); - - MySqlCommand cmd = new MySqlCommand("spTest", customConnection); - cmd.Parameters.Add("?p", MySqlDbType.Int32); - cmd.Parameters[0].Direction = ParameterDirection.Output; - cmd.CommandType = CommandType.StoredProcedure; - if (prepare) cmd.Prepare(); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.Equal(true, reader.Read()); - Assert.Equal(false, reader.NextResult()); - Assert.Equal(false, reader.Read()); - } - Assert.Equal(2, cmd.Parameters[0].Value); - } - - [Fact] - public void FunctionNoParams() - { - if (ts.version < new Version(5, 0)) return; - - if (customConnection.connectionState != ConnectionState.Open) - customConnection.Open(); - - executeSQL("CREATE FUNCTION fnTest() RETURNS CHAR(50)" + - " LANGUAGE SQL DETERMINISTIC BEGIN RETURN \"Test\"; END"); - - MySqlCommand cmd = new MySqlCommand("SELECT fnTest()", customConnection); - cmd.CommandType = CommandType.Text; - if (prepare) cmd.Prepare(); - object result = cmd.ExecuteScalar(); - Assert.Equal("Test", result); - } - - [Fact] - public void FunctionParams() - { - if (ts.version < new Version(5, 0)) return; - - if (customConnection.connectionState != ConnectionState.Open) - customConnection.Open(); - - executeSQL("CREATE FUNCTION fnTest( val1 INT, val2 CHAR(40) ) RETURNS INT " + - " LANGUAGE SQL DETERMINISTIC BEGIN RETURN val1 + LENGTH(val2); END"); - - MySqlCommand cmd = new MySqlCommand("SELECT fnTest(22, 'Test')", customConnection); - cmd.CommandType = CommandType.Text; - if (prepare) cmd.Prepare(); - object result = cmd.ExecuteScalar(); - Assert.Equal(26, result); - } - - /// - /// Bug #10644 Cannot call a stored function directly from Connector/Net - /// Bug #25013 Return Value parameter not found - /// - [Fact] - public void CallingStoredFunctionasProcedure() - { - if (ts.version < new Version(5, 0)) return; - - if (customConnection.connectionState != ConnectionState.Open) - customConnection.Open(); - - executeSQL("CREATE FUNCTION fnTest(valin int) RETURNS INT " + - " LANGUAGE SQL DETERMINISTIC BEGIN return valin * 2; END"); - MySqlCommand cmd = new MySqlCommand("fnTest", customConnection); - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.AddWithValue("?valin", 22); - MySqlParameter retVal = cmd.CreateParameter(); - retVal.ParameterName = "?retval"; - retVal.MySqlDbType = MySqlDbType.Int32; - retVal.Direction = ParameterDirection.ReturnValue; - cmd.Parameters.Add(retVal); - if (prepare) cmd.Prepare(); - cmd.ExecuteNonQuery(); - Assert.Equal(44, cmd.Parameters[1].Value); - } - - [Fact] - public void ReturningEmptyResultSet() - { - if (ts.version < new Version(5, 0)) return; - - if (customConnection.connectionState != ConnectionState.Open) - customConnection.Open(); - - executeSQL("CREATE TABLE test1 (id int AUTO_INCREMENT NOT NULL, " + - "Name VARCHAR(100) NOT NULL, PRIMARY KEY(id))"); - executeSQL("CREATE TABLE test2 (id int AUTO_INCREMENT NOT NULL, " + - "id1 INT NOT NULL, id2 INT NOT NULL, PRIMARY KEY(id))"); - - executeSQL("INSERT INTO test1 (Id, Name) VALUES (1, 'Item1')"); - executeSQL("INSERT INTO test1 (Id, Name) VALUES (2, 'Item2')"); - executeSQL("INSERT INTO test2 (Id, Id1, Id2) VALUES (1, 1, 1)"); - executeSQL("INSERT INTO test2 (Id, Id1, Id2) VALUES (2, 2, 1)"); - - executeSQL("CREATE PROCEDURE spTest(Name VARCHAR(100), OUT Table1Id INT) " + - "BEGIN SELECT t1.Id INTO Table1Id FROM test1 t1 WHERE t1.Name LIKE Name; " + - "SELECT t3.Id2 FROM test2 t3 WHERE t3.Id1 = Table1Id; END"); - - MySqlCommand cmd = customConnection.CreateCommand(); - cmd.CommandType = CommandType.StoredProcedure; - cmd.CommandText = "spTest"; - cmd.Parameters.AddWithValue("?Name", "Item3"); - cmd.Parameters.Add("?Table1Id", MySqlDbType.Int32); - cmd.Parameters["?Table1Id"].Direction = ParameterDirection.Output; - -#if NETCORE10 - using (MySqlDataReader dr = cmd.ExecuteReader()) - { - dr.Read(); - Assert.False(dr.HasRows); - } -#else - DataSet ds = new DataSet(); - if (prepare) cmd.Prepare(); - MySqlDataAdapter da = new MySqlDataAdapter(cmd); - try - { - da.Fill(ds); - } - catch (MySqlException) - { - // on 5.1 this throws an exception that no rows were returned. - } -#endif - } - - [Fact] - public void UnsignedOutputParameters() - { - if (ts.version < new Version(5, 0)) return; - - if (customConnection.connectionState != ConnectionState.Open) - customConnection.Open(); - - executeSQL("CREATE TABLE Test (id INT(10) UNSIGNED AUTO_INCREMENT, PRIMARY KEY (id)) "); - executeSQL("CREATE PROCEDURE spTest (OUT id BIGINT UNSIGNED) " + - "BEGIN INSERT INTO Test VALUES (NULL); SET id=LAST_INSERT_ID(); END"); - - MySqlCommand cmd = new MySqlCommand("spTest", customConnection); - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.Add("?id", MySqlDbType.UInt64); - cmd.Parameters[0].Direction = ParameterDirection.Output; - if (prepare) cmd.Prepare(); - cmd.ExecuteNonQuery(); - - object o = cmd.Parameters[0].Value; - Assert.True(o is ulong); - Assert.Equal(1, Convert.ToInt32(o)); - } - - /// - /// Bug #25625 Crashes when calling with CommandType set to StoredProcedure - /// - [Fact] - public void RunWithoutSelectPrivsThrowException() - { - if (ts.version < new Version(5, 0)) return; - - if (customConnection.connectionState != ConnectionState.Open) - customConnection.Open(); - - // we don't want this test to run in our all access fixture - string connInfo = customConnection.ConnectionString; - if (connInfo.IndexOf("use procedure bodies=false") == -1) - return; - - executeSQL(String.Format( - "GRANT ALL ON `{0}`.* to 'testuser'@'%' identified by 'testuser'", - (ts.baseDBName + "0"))); - executeSQL(String.Format( - "GRANT ALL ON `{0}`.* to 'testuser'@'localhost' identified by 'testuser'", - (ts.baseDBName + "0"))); - - executeSQL("DROP PROCEDURE IF EXISTS spTest"); - executeSQL("CREATE PROCEDURE spTest(id int, OUT outid int, INOUT inoutid int) " + - "BEGIN SET outid=id+inoutid; SET inoutid=inoutid+id; END"); - - var csb = new MySqlConnectionStringBuilder(customConnection.ConnectionString); - csb.UserID = "testuser"; - csb.Password = "testuser"; - MySqlConnection c = new MySqlConnection(csb.ConnectionString); - c.Open(); - - try - { - - MySqlCommand cmd = new MySqlCommand("spTest", c); - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.AddWithValue("?id", 2); - cmd.Parameters.AddWithValue("?outid", MySqlDbType.Int32); - cmd.Parameters[1].Direction = ParameterDirection.Output; - cmd.Parameters.AddWithValue("?inoutid", 4); - cmd.Parameters[2].Direction = ParameterDirection.InputOutput; - if (prepare) cmd.Prepare(); - cmd.ExecuteNonQuery(); - - Assert.Equal(6, cmd.Parameters[1].Value); - Assert.Equal(6, cmd.Parameters[2].Value); - } - catch (InvalidOperationException iex) - { - Assert.True(iex.Message.StartsWith("Unable to retrieve", StringComparison.Ordinal)); - } - finally - { - if (c != null) - c.Close(); - executeSQL("DELETE FROM mysql.user WHERE user = 'testuser'"); - } - } - - [Fact] - public void CallingFunctionWithoutReturnParameter() - { - if (ts.version < new Version(5, 0)) return; - - if (customConnection.connectionState != ConnectionState.Open) - customConnection.Open(); - - executeSQL("CREATE FUNCTION fnTest (p_kiosk bigint(20), " + - "p_user bigint(20)) returns double begin declare v_return double; " + - "set v_return = 3.6; return v_return; end"); - - MySqlCommand cmd = new MySqlCommand("fnTest", customConnection); - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.AddWithValue("?p_kiosk", 2); - cmd.Parameters.AddWithValue("?p_user", 4); - Exception ex = Assert.Throws(() => { if (prepare) cmd.Prepare(); cmd.ExecuteNonQuery(); }); - Assert.Equal(ex.Message, "Attempt to call stored function '`" + (ts.baseDBName + "0") + "`.`fnTest`' without specifying a return parameter"); - } - - /// - /// Bug #27668 FillSchema and Stored Proc with an out parameter - /// - [Fact] - public void GetSchema2() - { - if (ts.version.Major < 5) return; - - if (customConnection.connectionState != ConnectionState.Open) - customConnection.Open(); - - executeSQL(@"CREATE TABLE Test(id INT AUTO_INCREMENT, PRIMARY KEY (id)) "); - executeSQL(@"CREATE PROCEDURE spTest (OUT id INT) - BEGIN INSERT INTO Test VALUES (NULL); SET id=520; END"); - - MySqlCommand cmd = new MySqlCommand("spTest", customConnection); - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.Add("?id", MySqlDbType.Int32); - cmd.Parameters[0].Direction = ParameterDirection.Output; - -#if RT - using (MySqlDataReader dr = cmd.ExecuteReader()) - { - dr.Read(); - } -#else - MySqlDataAdapter da = new MySqlDataAdapter(cmd); - DataTable dt = new DataTable(); - if (prepare) cmd.Prepare(); - cmd.ExecuteNonQuery(); - da.Fill(dt); - da.FillSchema(dt, SchemaType.Mapped); -#endif - } - - [Fact] - public void NoAccessToProcedureBodies() - { - if (ts.version < new Version(5, 0)) return; - - if (customConnection.connectionState != ConnectionState.Open) - customConnection.Open(); - - string sql = String.Format("CREATE PROCEDURE `{0}`.`spTest`(in1 INT, INOUT inout1 INT, OUT out1 INT ) " + - "BEGIN SET inout1 = inout1+2; SET out1=inout1-3; SELECT in1; END", (ts.baseDBName + "0")); - executeSQL(sql); - - using (MySqlConnection c = new MySqlConnection(customConnection.ConnectionString + "; use procedure bodies=false")) - { - c.Open(); - - MySqlCommand cmd = new MySqlCommand("spTest", c); - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.AddWithValue("?in1", 2); - cmd.Parameters.AddWithValue("?inout1", 4); - cmd.Parameters.Add("?out1", MySqlDbType.Int32); - cmd.Parameters[1].Direction = ParameterDirection.InputOutput; - cmd.Parameters[2].Direction = ParameterDirection.Output; - if (prepare) cmd.Prepare(); - cmd.ExecuteNonQuery(); - - Assert.Equal(6, cmd.Parameters[1].Value); - Assert.Equal(3, cmd.Parameters[2].Value); - } - } - - [Fact] - public void BinaryAndVarBinaryParameters() - { - if (ts.version < new Version(5, 0)) return; - - if (customConnection.connectionState != ConnectionState.Open) - customConnection.Open(); - - executeSQL("CREATE PROCEDURE spTest(OUT out1 BINARY(20), OUT out2 VARBINARY(20)) " + - "BEGIN SET out1 = 'out1'; SET out2='out2'; END"); - - MySqlCommand cmd = new MySqlCommand("spTest", customConnection); - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.Add("out1", MySqlDbType.Binary); - cmd.Parameters[0].Direction = ParameterDirection.Output; - cmd.Parameters.Add("out2", MySqlDbType.VarBinary); - cmd.Parameters[1].Direction = ParameterDirection.Output; - if (prepare) cmd.Prepare(); - cmd.ExecuteNonQuery(); - - byte[] out1 = (byte[])cmd.Parameters[0].Value; - Assert.Equal('o', (char)out1[0]); - Assert.Equal('u', (char)out1[1]); - Assert.Equal('t', (char)out1[2]); - Assert.Equal('1', (char)out1[3]); - - out1 = (byte[])cmd.Parameters[1].Value; - Assert.Equal('o', (char)out1[0]); - Assert.Equal('u', (char)out1[1]); - Assert.Equal('t', (char)out1[2]); - Assert.Equal('2', (char)out1[3]); - } - - /// - /// Bug #31930 Stored procedures with "ambiguous column name" error cause lock-ups - /// - [Fact] - public void CallingFunction() - { - if (ts.version < new Version(5, 0)) return; - if (customConnection.connectionState != ConnectionState.Open) - customConnection.Open(); - executeSQL(@"CREATE FUNCTION `GetSupplierBalance`(SupplierID_ INTEGER(11)) - RETURNS double NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER - COMMENT '' - BEGIN - RETURN 1.0; - END"); - - MySqlCommand command = new MySqlCommand("GetSupplierBalance", customConnection); - command.CommandType = CommandType.StoredProcedure; - command.Parameters.Add("?SupplierID_", MySqlDbType.Int32).Value = 1; - command.Parameters.Add("?Balance", MySqlDbType.Double).Direction = ParameterDirection.ReturnValue; - if (prepare) command.Prepare(); - command.ExecuteNonQuery(); - double balance = Convert.ToDouble(command.Parameters["?Balance"].Value); - Assert.Equal(1.0, balance); - } - - /// - /// - [Fact] - public void OutputParametersWithNewParamHandling() - { - if (ts.version < new Version(5, 0)) return; - - if (customConnection.connectionState != ConnectionState.Open) - customConnection.Open(); - - // create our procedure - executeSQL("CREATE PROCEDURE spTest(out val1 VARCHAR(350)) " + - "BEGIN SET val1 = '42'; END"); - - var connStr = customConnection.ConnectionString.Replace("allow user variables=true", "allow user variables=false"); - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - - MySqlCommand cmd = new MySqlCommand("spTest", c); - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.Add(new MySqlParameter("@val1", MySqlDbType.VarChar)).Direction = ParameterDirection.Output; - if (prepare) cmd.Prepare(); - int rowsAffected = cmd.ExecuteNonQuery(); - - Assert.Equal(0, rowsAffected); - Assert.Equal("42", cmd.Parameters[0].Value); - } - } - - /// - /// - [Fact] - public void FunctionWithNewParamHandling() - { - if (ts.version < new Version(5, 0)) return; - - if (customConnection.connectionState != ConnectionState.Open) - customConnection.Open(); - // create our procedure - executeSQL("CREATE FUNCTION fnTest(`value` INT) RETURNS INT " + - "BEGIN RETURN value; END"); - - var connStr = customConnection.ConnectionString.Replace("allow user variables=true", "allow user variables=false"); - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - - MySqlCommand cmd = new MySqlCommand("fnTest", c); - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.Add(new MySqlParameter("@value", MySqlDbType.Int32)).Value = 22; - cmd.Parameters.Add(new MySqlParameter("@returnvalue", MySqlDbType.Int32)).Direction = ParameterDirection.ReturnValue; - if (prepare) cmd.Prepare(); - int rowsAffected = cmd.ExecuteNonQuery(); - - Assert.Equal(0, rowsAffected); - Assert.Equal(22, cmd.Parameters[1].Value); - } - } - - /// - /// Bug #56756 Output Parameter MySqlDbType.Bit get a wrong Value (48/49 for false or true) - /// - [Fact] - public void BitTypeAsOutParameter() - { - - if (customConnection.connectionState != ConnectionState.Open) - customConnection.Open(); - - executeSQL(@"CREATE PROCEDURE `spTest`(out x bit(1)) - BEGIN - Set x = 1; -- Outparameter value is 49 - Set x = 0; -- Outparameter value is 48 - END"); - MySqlCommand cmd = new MySqlCommand("spTest", customConnection); - cmd.Parameters.Clear(); - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.Add("x", MySqlDbType.Bit).Direction = ParameterDirection.Output; - if (prepare) cmd.Prepare(); - cmd.ExecuteNonQuery(); - Assert.Equal(0, Convert.ToInt32(cmd.Parameters[0].Value)); - } - } -} diff --git a/Tests/MySql.Data.Tests/OutputParametersBatchPrepared.cs b/Tests/MySql.Data.Tests/OutputParametersBatchPrepared.cs deleted file mode 100644 index c471bd7ca..000000000 --- a/Tests/MySql.Data.Tests/OutputParametersBatchPrepared.cs +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Security.Authentication; - -namespace MySql.Data.MySqlClient.Tests -{ - public class OutputParametersBatchPrepared : OutputParametersBatch - { - - public OutputParametersBatchPrepared(TestSetup setup): base(setup, "outparbatchprep") - { - - } - - protected override string OnGetConnectionStringInfo() - { - prepare = true; - return ";allow batch=true; ignore prepare = false;"; - } - } -} diff --git a/Tests/MySql.Data.Tests/OutputParametersNoBatch.cs b/Tests/MySql.Data.Tests/OutputParametersNoBatch.cs deleted file mode 100644 index a1a1886bc..000000000 --- a/Tests/MySql.Data.Tests/OutputParametersNoBatch.cs +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Security.Authentication; - -namespace MySql.Data.MySqlClient.Tests -{ - public class OutputParametersNoBatch : OutputParametersBatch - { - public OutputParametersNoBatch(TestSetup setup) : base (setup, "outparnobatch") - { - - } - - protected override string OnGetConnectionStringInfo() - { - return ";allow batch=false;"; - } - } -} diff --git a/Tests/MySql.Data.Tests/OutputParametersNoBatchPrepared.cs b/Tests/MySql.Data.Tests/OutputParametersNoBatchPrepared.cs deleted file mode 100644 index 1a8eda5c7..000000000 --- a/Tests/MySql.Data.Tests/OutputParametersNoBatchPrepared.cs +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; - -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Security.Authentication; - -namespace MySql.Data.MySqlClient.Tests -{ - public class OutputParametersNoBatchPrepared : OutputParametersBatch - { - - public OutputParametersNoBatchPrepared(TestSetup setup) :base (setup, "outparamnbprep") - { - - } - - protected override string OnGetConnectionStringInfo() - { - prepare = true; - return ";allow batch=false; ignore prepare=false; "; - } - } -} diff --git a/Tests/MySql.Data.Tests/ParameterTests.cs b/Tests/MySql.Data.Tests/ParameterTests.cs deleted file mode 100644 index 0431d9add..000000000 --- a/Tests/MySql.Data.Tests/ParameterTests.cs +++ /dev/null @@ -1,668 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Diagnostics; -using System.Data; - -namespace MySql.Data.MySqlClient.Tests -{ - public class ParameterTests : TestBase - { - - public ParameterTests(TestSetup setup) : base (setup, "parametertests") - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(100), dt DATETIME, tm TIME, ts TIMESTAMP, PRIMARY KEY(id))"); - } - - [Fact] - public void TestQuoting() - { - MySqlCommand cmd = new MySqlCommand("", connection); - cmd.CommandText = "INSERT INTO Test VALUES (?id, ?name, NULL,NULL,NULL)"; - cmd.Parameters.Add(new MySqlParameter("?id", 1)); - cmd.Parameters.Add(new MySqlParameter("?name", "my ' value")); - cmd.ExecuteNonQuery(); - - cmd.Parameters[0].Value = 2; - cmd.Parameters[1].Value = @"my "" value"; - cmd.ExecuteNonQuery(); - - cmd.Parameters[0].Value = 3; - cmd.Parameters[1].Value = @"my ` value"; - cmd.ExecuteNonQuery(); - - cmd.Parameters[0].Value = 4; - cmd.Parameters[1].Value = @"my ´ value"; - cmd.ExecuteNonQuery(); - - cmd.Parameters[0].Value = 5; - cmd.Parameters[1].Value = @"my \ value"; - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM Test"; - MySqlDataReader reader = null; - try - { - reader = cmd.ExecuteReader(); - reader.Read(); - Assert.Equal("my ' value", reader.GetString(1)); - reader.Read(); - Assert.Equal(@"my "" value", reader.GetString(1)); - reader.Read(); - Assert.Equal("my ` value", reader.GetString(1)); - reader.Read(); - Assert.Equal("my ´ value", reader.GetString(1)); - reader.Read(); - Assert.Equal(@"my \ value", reader.GetString(1)); - } - catch (Exception ex) - { - Assert.False(ex.Message == String.Empty, ex.Message); - } - finally - { - if (reader != null) reader.Close(); - } - } - - [Fact] - public void TestDateTimeParameter() - { - MySqlCommand cmd = new MySqlCommand("", connection); - - TimeSpan time = new TimeSpan(0, 1, 2, 3); - DateTime dt = new DateTime(2003, 11, 11, 1, 2, 3); - cmd.CommandText = "INSERT INTO Test VALUES (1, 'test', ?dt, ?time, NULL)"; - cmd.Parameters.Add(new MySqlParameter("?time", time)); - cmd.Parameters.Add(new MySqlParameter("?dt", dt)); - int cnt = cmd.ExecuteNonQuery(); - Assert.True(cnt == 1, "Insert count"); - - cmd = new MySqlCommand("SELECT tm, dt, ts FROM Test WHERE id=1", connection); - MySqlDataReader reader = cmd.ExecuteReader(); - reader.Read(); - TimeSpan time2 = (TimeSpan)reader.GetValue(0); - Assert.Equal(time, time2); - - DateTime dt2 = reader.GetDateTime(1); - Assert.Equal(dt, dt2); - - DateTime ts2 = reader.GetDateTime(2); - reader.Close(); - - // now check the timestamp column. We won't check the minute or second for obvious reasons - DateTime now = DateTime.Now; - Assert.Equal(now.Year, ts2.Year); - Assert.Equal(now.Month, ts2.Month); - Assert.Equal(now.Day, ts2.Day); - Assert.Equal(now.Hour, ts2.Hour); - - // now we'll set some nulls and see how they are handled - cmd = new MySqlCommand("UPDATE Test SET tm=?ts, dt=?dt WHERE id=1", connection); - cmd.Parameters.Add(new MySqlParameter("?ts", DBNull.Value)); - cmd.Parameters.Add(new MySqlParameter("?dt", DBNull.Value)); - cnt = cmd.ExecuteNonQuery(); - Assert.True(cnt == 1, "Update null count"); - - cmd = new MySqlCommand("SELECT tm, dt FROM Test WHERE id=1", connection); - reader = cmd.ExecuteReader(); - reader.Read(); - object tso = reader.GetValue(0); - object dto = reader.GetValue(1); - Assert.True(tso == DBNull.Value, "Time column"); - Assert.True(dto == DBNull.Value, "DateTime column"); - - reader.Close(); - - cmd.CommandText = "DELETE FROM Test WHERE id=1"; - cmd.ExecuteNonQuery(); - } - - [Fact] - public void NestedQuoting() - { - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id, name) " + - "VALUES(1, 'this is ?\"my value\"')", connection); - int count = cmd.ExecuteNonQuery(); - Assert.Equal(1, count); - } - - [Fact] - public void SetDbType() - { -#if RT - MySqlCommand cmd = connection.CreateCommand(); - MySqlParameter prm = cmd.CreateParameter(); - prm.MySqlDbType = MySqlDbType.Int64; - Assert.Equal(MySqlDbType.Int64, prm.MySqlDbType); - prm.Value = 3; - Assert.Equal(MySqlDbType.Int64, prm.MySqlDbType); - - MySqlParameter p = new MySqlParameter("name", MySqlDbType.Int64); - Assert.Equal(MySqlDbType.Int64, p.MySqlDbType); - p.Value = 3; - Assert.Equal(MySqlDbType.Int64, p.MySqlDbType); -#else - IDbCommand cmd = connection.CreateCommand(); - IDbDataParameter prm = cmd.CreateParameter(); - prm.DbType = DbType.Int64; - Assert.Equal(DbType.Int64, prm.DbType); - prm.Value = 3; - Assert.Equal(DbType.Int64, prm.DbType); - - MySqlParameter p = new MySqlParameter("name", MySqlDbType.Int64); - Assert.Equal(DbType.Int64, p.DbType); - Assert.Equal(MySqlDbType.Int64, p.MySqlDbType); - p.Value = 3; - Assert.Equal(DbType.Int64, p.DbType); - Assert.Equal(MySqlDbType.Int64, p.MySqlDbType); -#endif - } - -#if !NETCORE10 - [Fact] - public void UseOldSyntaxGivesWarning() - { - Trace.Listeners.Clear(); - GenericListener listener = new GenericListener(); - Trace.Listeners.Add(listener); - - string connStr = connection.ConnectionString + ";old syntax=yes;pooling=false"; - MySqlConnection conn2 = new MySqlConnection(connStr); - conn2.Open(); - - Assert.True(listener.Find("Use Old Syntax is now obsolete") != 0); - conn2.Close(); - Trace.Listeners.Clear(); - } -#endif - - [Fact] - public void NullParameterObject() - { - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id, name) VALUES (1, ?name)", connection); - try - { - cmd.Parameters.Add(null); - } - catch (ArgumentException) - { - } - } - - /// - /// Bug #7398 MySqlParameterCollection doesn't allow parameters without filled in names - /// - [Fact] - public void AllowUnnamedParameters() - { - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id,name) VALUES (?id, ?name)", connection); - - MySqlParameter p = new MySqlParameter(); - p.Value = 1; - cmd.Parameters.Add(p); - cmd.Parameters[0].ParameterName = "?id"; - - p = new MySqlParameter(); - p.Value = "test"; - cmd.Parameters.Add(p); - p.ParameterName = "?name"; - - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT id FROM Test"; - Assert.Equal(1, cmd.ExecuteScalar()); - - cmd.CommandText = "SELECT name FROM Test"; - Assert.Equal("test", cmd.ExecuteScalar()); - } - - [Fact] - public void NullParameterValue() - { - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id, name) VALUES (1, ?name)", connection); - cmd.Parameters.Add(new MySqlParameter("?name", null)); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT name FROM Test WHERE id=1"; - object name = cmd.ExecuteScalar(); - Assert.Equal(DBNull.Value, name); - } - - /// - /// Bug #12646 Parameters are defaulted to Decimal - /// - [Fact] - public void DefaultType() - { -#if RT - MySqlCommand cmd = connection.CreateCommand(); - MySqlParameter p = cmd.CreateParameter(); -#else - IDbCommand cmd = connection.CreateCommand(); - IDbDataParameter p = cmd.CreateParameter(); -#endif - p.ParameterName = "?boo"; - p.Value = "test"; - MySqlParameter mp = (MySqlParameter)p; - Assert.Equal(MySqlDbType.VarChar, mp.MySqlDbType); - } - - [Fact] - public void OddCharsInParameterNames() - { - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id, name) VALUES (1, ?nam$es)", connection); - cmd.Parameters.Add(new MySqlParameter("?nam$es", "Test")); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "INSERT INTO Test (id, name) VALUES (2, ?nam_es)"; - cmd.Parameters.Clear(); - cmd.Parameters.Add(new MySqlParameter("?nam_es", "Test2")); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "INSERT INTO Test (id, name) VALUES (3, ?nam.es)"; - cmd.Parameters.Clear(); - cmd.Parameters.Add(new MySqlParameter("?nam.es", "Test3")); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT name FROM Test WHERE id=1"; - object name = cmd.ExecuteScalar(); - Assert.Equal("Test", name); - - cmd.CommandText = "SELECT name FROM Test WHERE id=2"; - name = cmd.ExecuteScalar(); - Assert.Equal("Test2", name); - - cmd.CommandText = "SELECT name FROM Test WHERE id=3"; - name = cmd.ExecuteScalar(); - Assert.Equal("Test3", name); - } - - /// - /// Bug #13276 Exception on serialize after inserting null value - /// - [Fact] - public void InsertValueAfterNull() - { - executeSQL("DROP TABLE Test"); - executeSQL("CREATE TABLE Test (id int auto_increment primary key, foo int)"); - -#if RT - MySqlCommand c = new MySqlCommand("INSERT INTO Test (foo) values (?foo)", connection); - c.Parameters.Add("?foo", MySqlDbType.Int32); - c.ExecuteNonQuery(); - - c.Parameters[0].Value = 2; - c.ExecuteNonQuery(); - - c.CommandText = "SELECT * FROM Test"; - using (MySqlDataReader dr = c.ExecuteReader()) - { - Assert.True(dr.Read()); - Assert.Equal(DBNull.Value, dr.GetValue(1)); - Assert.True(dr.Read()); - Assert.Equal(2, dr.GetValue(1)); - } -#else - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - MySqlCommand c = new MySqlCommand("INSERT INTO Test (foo) values (?foo)", connection); - c.Parameters.Add("?foo", MySqlDbType.Int32, 0, "foo"); - - da.InsertCommand = c; - DataTable dt = new DataTable(); - da.Fill(dt); - DataRow row = dt.NewRow(); - dt.Rows.Add(row); - row = dt.NewRow(); - row["foo"] = 2; - dt.Rows.Add(row); - da.Update(dt); - - dt.Clear(); - da.Fill(dt); - Assert.Equal(2, dt.Rows.Count); - Assert.Equal(2, dt.Rows[1]["foo"]); -#endif - } - - /// - /// Bug #24565 Inferring DbType fails when reusing commands and the first time the value is nul - /// - [Fact] - public void UnTypedParameterBeingReused() - { - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id, dt) VALUES (?id, ?dt)", connection); - cmd.Parameters.AddWithValue("?id", 1); - MySqlParameter p = cmd.CreateParameter(); - p.ParameterName = "?dt"; - p.Value = DBNull.Value; - cmd.Parameters.Add(p); - cmd.ExecuteNonQuery(); - - cmd.Parameters[0].Value = 2; - p.Value = DateTime.Now; - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM Test"; - cmd.Parameters.Clear(); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - Assert.True(reader.IsDBNull(2)); - reader.Read(); - Assert.False(reader.IsDBNull(2)); - Assert.False(reader.Read()); - } - } - - [Fact] - public void ParameterCacheNotClearing() - { - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id, name) VALUES (?id, ?name)", connection); - cmd.Parameters.AddWithValue("?id", 1); - cmd.Parameters.AddWithValue("?name", "test"); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "INSERT INTO Test (id, name, dt) VALUES (?id1, ?name1, ?id)"; - cmd.Parameters[0].ParameterName = "?id1"; - cmd.Parameters[0].Value = 2; - cmd.Parameters[1].ParameterName = "?name1"; - cmd.Parameters.AddWithValue("?id", DateTime.Now); - cmd.ExecuteNonQuery(); - } - - [Fact] - public void WithAndWithoutMarker() - { - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id, name) VALUES (?id, ?name)", connection); - cmd.Parameters.AddWithValue("id", 1); - Assert.Equal(-1, cmd.Parameters.IndexOf("?id")); - cmd.Parameters.AddWithValue("name", "test"); - cmd.ExecuteNonQuery(); - - cmd.Parameters.Clear(); - cmd.Parameters.AddWithValue("?id", 2); - Assert.Equal(-1, cmd.Parameters.IndexOf("id")); - cmd.Parameters.AddWithValue("?name", "test2"); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT COUNT(*) FROM Test"; - object count = cmd.ExecuteScalar(); - Assert.Equal(2, Convert.ToInt32(count)); - } - - [Fact] - public void DoubleAddingParameters() - { - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id, name) VALUES (?id, ?name)", connection); - cmd.Parameters.AddWithValue("id", 1); - Assert.Equal(-1, cmd.Parameters.IndexOf("?id")); - Assert.Equal(-1, cmd.Parameters.IndexOf("@id")); - cmd.Parameters.AddWithValue("name", "test"); - Exception ex = Assert.Throws(() => cmd.Parameters.AddWithValue("?id", 2)); - Assert.Equal(ex.Message, "Parameter '?id' has already been defined."); - } - -#if !NETCORE10 - /// - /// Bug #26904 MySqlParameterCollection fails to add MySqlParameter that previously removed - /// - [Fact] - public void AddingParameterPreviouslyRemoved() - { - MySqlCommand cmd = new - MySqlCommand("Insert into sometable(s1, s2) values(?p1, ?p2)"); - - MySqlParameter param1 = cmd.CreateParameter(); - param1.ParameterName = "?p1"; - param1.DbType = DbType.String; - param1.Value = "Ali Gel"; - - cmd.Parameters.Add(param1); - cmd.Parameters.RemoveAt(0); - cmd.Parameters.Add(param1); - } - - /// - /// Bug #27135 MySqlParameterCollection and parameters added with Insert Method - /// - [Fact] - public void AddingParametersUsingInsert() - { - MySqlCommand cmd = new MySqlCommand(); - cmd.Parameters.Insert(0, new MySqlParameter("?id", MySqlDbType.Int32)); - MySqlParameter p = cmd.Parameters["?id"]; - Assert.Equal("?id", p.ParameterName); - } - - /// - /// Bug #27187 cmd.Parameters.RemoveAt("Id") will cause an error if the last item is requested - /// - [Fact] - public void FindParameterAfterRemoval() - { - MySqlCommand cmd = new MySqlCommand(); - - cmd.Parameters.Add("?id1", MySqlDbType.Int32); - cmd.Parameters.Add("?id2", MySqlDbType.Int32); - cmd.Parameters.Add("?id3", MySqlDbType.Int32); - cmd.Parameters.Add("?id4", MySqlDbType.Int32); - cmd.Parameters.Add("?id5", MySqlDbType.Int32); - cmd.Parameters.Add("?id6", MySqlDbType.Int32); - cmd.Parameters.RemoveAt("?id1"); - MySqlParameter p = cmd.Parameters["?id6"]; - Assert.Equal("?id6", p.ParameterName); - } -#endif - - /// - /// Bug #29312 System.FormatException if parameter not found - /// - [Fact] - public void MissingParameter() - { - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test(id) VALUES (?id)", connection); - try - { - cmd.ExecuteNonQuery(); - } - catch (MySqlException) - { - } - } - - /// - /// Bug #32094 Size property on string parameter throws an exception - /// - [Fact] - public void StringParameterSizeSetAfterValue() - { - executeSQL("DROP TABLE Test"); - executeSQL("CREATE TABLE Test (v VARCHAR(10))"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?p1)", connection); - cmd.Parameters.Add("?p1", MySqlDbType.VarChar); - cmd.Parameters[0].Value = "123"; - cmd.Parameters[0].Size = 10; - cmd.ExecuteNonQuery(); - -#if !NETCORE10 - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - DataTable dt = new DataTable(); - da.Fill(dt); - Assert.Equal("123", dt.Rows[0][0]); -#endif - - cmd.Parameters.Clear(); - cmd.Parameters.Add("?p1", MySqlDbType.VarChar); - cmd.Parameters[0].Value = "123456789012345"; - cmd.Parameters[0].Size = 10; - cmd.ExecuteNonQuery(); - -#if NETCORE10 - MySqlCommand newValueCommand = new MySqlCommand("SELECT * FROM Test", connection); - using (MySqlDataReader dr = newValueCommand.ExecuteReader()) - { - Assert.True(dr.Read()); - Assert.Equal("123", dr.GetString(0)); - Assert.True(dr.Read()); - Assert.Equal("1234567890", dr.GetString(0)); - } -#else - dt.Clear(); - da.Fill(dt); - Assert.Equal("1234567890", dt.Rows[1][0]); -#endif - } - -#if !NETCORE10 - /// - /// Bug #32093 MySqlParameter Constructor does not allow Direction of anything other than Input - /// - [Fact] - public void NonInputParametersToCtor() - { - MySqlParameter p = new MySqlParameter("?p1", MySqlDbType.VarChar, 20, - ParameterDirection.InputOutput, true, 0, 0, "id", DataRowVersion.Current, 0); - Assert.Equal(ParameterDirection.InputOutput, p.Direction); - - MySqlParameter p1 = new MySqlParameter("?p1", MySqlDbType.VarChar, 20, - ParameterDirection.Output, true, 0, 0, "id", DataRowVersion.Current, 0); - Assert.Equal(ParameterDirection.Output, p1.Direction); - } -#endif - - /// - /// Bug #13991 oldsyntax configuration and ParameterMarker value bug - /// - [Fact] - public void SetOldSyntaxAfterCommandCreation() - { - MySqlConnection c = new MySqlConnection(connection.ConnectionString + ";old syntax=yes"); - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id) VALUES (@id)", c); - cmd.Parameters.AddWithValue("@id", 2); - c.Open(); - cmd.ExecuteNonQuery(); - c.Close(); - } - - [Fact] - public void UseAtSignForParameters() - { - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id, name) VALUES (@id, @name)", connection); - cmd.Parameters.AddWithValue("@id", 33); - cmd.Parameters.AddWithValue("@name", "Test"); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - Assert.Equal(33, reader.GetInt32(0)); - Assert.Equal("Test", reader.GetString(1)); - } - } - -#if !NETCORE10 - /// - /// Bug #62194 MySQL Parameter constructor doesn't set - /// all properties: IsNullable, Precision and Scale - /// - [Fact] - public void CanCreateMySQLParameterWithNullability() - { - - MySqlParameter p = new MySqlParameter("?id", MySqlDbType.Decimal, 2, - ParameterDirection.Input, true, 1, 1, "sourceColumn", DataRowVersion.Default, 1); - - Assert.Equal(p.IsNullable, true); - } - - /// - /// Bug #62194 MySQL Parameter constructor doesn't set - /// all properties: IsNullable, Precision and Scale - /// - [Fact] - public void CanCreateMySQLParameterWithPrecision() - { - MySqlParameter p = new MySqlParameter("?id", MySqlDbType.Decimal, 2, - ParameterDirection.Input, true, Byte.MaxValue, 1, "sourceColumn", DataRowVersion.Default, 1); - - Assert.Equal(p.Precision, Byte.MaxValue); - } - - - /// - /// Bug #62194 MySQL Parameter constructor doesn't set - /// all properties: IsNullable, Precision and Scale - /// - [Fact] - public void CanCreateMySQLParameterWithScale() - { - - MySqlParameter p = new MySqlParameter("?id", MySqlDbType.Decimal, 2, - ParameterDirection.Input, true, 1, Byte.MaxValue, "sourceColumn", DataRowVersion.Default, 1); - - Assert.Equal(p.Scale, Byte.MaxValue); - } -#endif - - /// - /// Bug #66060 #14499549 "Parameter '?' must be defined" error, when using unnamed parameters - /// - [Fact] - public void CanIdentifyParameterWithOutName() - { - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id,name) VALUES (?, ?)", connection); - - cmd.Parameters.AddWithValue("", 1); - cmd.Parameters.AddWithValue("", "test"); - - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT id FROM Test"; - Assert.Equal(1, cmd.ExecuteScalar()); - - cmd.CommandText = "SELECT name FROM Test"; - Assert.Equal("test", cmd.ExecuteScalar()); - } - - /// - /// Bug #66060 #14499549 "Parameter '?' must be defined" error, when using unnamed parameters - /// - [Fact] - public void CanThrowAnExceptionWhenMixingParameterNaming() - { - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id,name) VALUES (?Id, ?name, ?)", connection); - cmd.Parameters.AddWithValue("?Id", 1); - cmd.Parameters.AddWithValue("?name", "test"); - Exception ex = Assert.Throws(() =>cmd.ExecuteNonQuery()); - Assert.Equal(ex.Message, "Fatal error encountered during command execution."); - } - } -} diff --git a/Tests/MySql.Data.Tests/PoolingTests.cs b/Tests/MySql.Data.Tests/PoolingTests.cs deleted file mode 100644 index 4d996415e..000000000 --- a/Tests/MySql.Data.Tests/PoolingTests.cs +++ /dev/null @@ -1,651 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Reflection; -using System.Threading; -using System.Data; -using System.Collections; -#if !NETCORE10 -using System.Timers; -#endif -using System.Threading.Tasks; -using System.Diagnostics; - - -namespace MySql.Data.MySqlClient.Tests -{ - public class PoolingTests : TestBase - { - TestSetup ts; - - public PoolingTests(TestSetup setup) : base(setup, "poolingtests") - { - ts = setup; - executeSQL("CREATE TABLE Test (id INT, name VARCHAR(100))"); - } - - [Fact] - public void Connection() - { - - MySqlConnection c = new MySqlConnection(ts.GetPoolingConnectionString()); - c.Open(); - int serverThread = c.ServerThread; - c.Close(); - - // first test that only a single connection get's used - for (int i = 0; i < 10; i++) - { - c = new MySqlConnection(ts.GetPoolingConnectionString()); - c.Open(); - Assert.Equal(serverThread, c.ServerThread); - c.Close(); - } - - c.Open(); - ts.KillConnection(c); - c.Close(); - - string poolingCS = ts.GetPoolingConnectionString() + ";Min Pool Size=10"; - MySqlConnection[] connArray = new MySqlConnection[10]; - for (int i = 0; i < connArray.Length; i++) - { - connArray[i] = new MySqlConnection(poolingCS); - connArray[i].Open(); - } - - // now make sure all the server ids are different - for (int i = 0; i < connArray.Length; i++) - { - for (int j = 0; j < connArray.Length; j++) - { - if (i != j) - Assert.True(connArray[i].ServerThread != connArray[j].ServerThread); - } - } - - for (int i = 0; i < connArray.Length; i++) - { - ts.KillConnection(connArray[i]); - connArray[i].Close(); - } - } - - [Fact] - public void OpenKilled() - { - string connStr = ts.GetPoolingConnectionString() + ";min pool size=1; max pool size=1"; - MySqlConnection c = new MySqlConnection(connStr); - c.Open(); - int threadId = c.ServerThread; - // thread gets killed right here - ts.KillConnection(c); - c.Close(); - - c.Dispose(); - - c = new MySqlConnection(connStr); - c.Open(); - int secondThreadId = c.ServerThread; - ts.KillConnection(c); - c.Close(); - Assert.False(threadId == secondThreadId); - } - -#if !NETCORE10 - [Fact] - public void ReclaimBrokenConnection() - { - // now create a new connection string only allowing 1 connection in the pool - string connStr = ts.GetPoolingConnectionString() + ";connect timeout=1;max pool size=1"; - - // now use up that connection - MySqlConnection c = new MySqlConnection(connStr); - c.Open(); - - // now attempting to open a connection should fail - MySqlConnection c2 = new MySqlConnection(connStr); - Exception ex = Assert.Throws(() => c2.Open()); - Assert.True(ex.Message.Contains("error connecting: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool.")); - - // we now kill the first connection to simulate a server stoppage - ts.KillConnection(c); - - // now we do something on the first connection - - ex = Assert.Throws(() => c.ChangeDatabase("mysql")); - Assert.True(ex.Message.Contains("The connection is not open.")); - - // Opening a connection now should work - MySqlConnection connection = new MySqlConnection(connStr); - connection.Open(); - ts.KillConnection(connection); - connection.Close(); - } -#endif - - [Fact] - public void TestUserReset() - { - string connStr = ts.GetPoolingConnectionString() + ";connection reset=true;"; - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - MySqlCommand cmd = new MySqlCommand("SET @testvar='5'", c); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT @testvar"; - object var = cmd.ExecuteScalar(); - Assert.Equal("5", var); - c.Close(); - - c.Open(); - object var2 = cmd.ExecuteScalar(); - Assert.Equal(DBNull.Value, var2); - ts.KillConnection(c); - } - } - -#if !NETCORE10 - // Test that thread does not come to pool after abort - [Fact] - public void TestAbort() - { - string connStr = ts.GetPoolingConnectionString(); - int threadId; - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - threadId = c.ServerThread; - MethodInfo abort = c.GetType().GetMethod("Abort", - BindingFlags.NonPublic | BindingFlags.Instance); - abort.Invoke(c, null); - } - using (MySqlConnection c1 = new MySqlConnection(connStr)) - { - c1.Open(); - Assert.True(c1.ServerThread != threadId); - ts.KillConnection(c1); - } - } -#endif - - /// - /// Bug #25614 After connection is closed, and opened again UTF-8 characters are not read well - /// - [Fact] - public void UTF8AfterClosing() - { - string originalValue = "??????????"; - executeSQL("DROP TABLE IF EXISTS test"); - - - executeSQL("CREATE TABLE test (id int(11) NOT NULL, " + - "value varchar(100) NOT NULL, PRIMARY KEY (`id`) " + - ") ENGINE=MyISAM DEFAULT CHARSET=utf8"); - - string connStr = ts.GetPoolingConnectionString() + ";charset=utf8"; - using (MySqlConnection con = new MySqlConnection(connStr)) - { - con.Open(); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO test VALUES (1, '??????????')", con); - cmd.ExecuteNonQuery(); - - cmd = new MySqlCommand("SELECT value FROM test WHERE id = 1", con); - string firstS = cmd.ExecuteScalar().ToString(); - Assert.Equal(originalValue, firstS); - - con.Close(); - con.Open(); - - //Does not work: - cmd = new MySqlCommand("SELECT value FROM test WHERE id = 1", con); - string secondS = cmd.ExecuteScalar().ToString(); - - ts.KillConnection(con); - con.Close(); - Assert.Equal(firstS, secondS); - } - } - -#if !NETCORE10 - - private void PoolingWorker(object cn) - { - MySqlConnection conn = (cn as MySqlConnection); - - Thread.Sleep(5000); - conn.Close(); - } - - /// - /// Bug #24373 High CPU utilization when no idle connection - /// - [Fact] - public void MultipleThreads() - { - string connStr = ts.GetPoolingConnectionString() + ";max pool size=1"; - MySqlConnection c = new MySqlConnection(connStr); - c.Open(); - - ParameterizedThreadStart pts = new ParameterizedThreadStart(PoolingWorker); - Thread t = new Thread(pts); - t.Start(c); - - using (MySqlConnection c2 = new MySqlConnection(connStr)) - { - c2.Open(); - ts.KillConnection(c2); - } - c.Close(); - } - -#endif - - - [Fact] - public void NewTest() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (id INT, name VARCHAR(50))"); - executeSQL("CREATE PROCEDURE spTest(theid INT) BEGIN SELECT * FROM Test WHERE id=theid; END"); - executeSQL("INSERT INTO Test VALUES (1, 'First')"); - executeSQL("INSERT INTO Test VALUES (2, 'Second')"); - executeSQL("INSERT INTO Test VALUES (3, 'Third')"); - executeSQL("INSERT INTO Test VALUES (4, 'Fourth')"); - - string connStr = ts.GetPoolingConnectionString(); - - for (int i = 1; i < 5; i++) - { - using (MySqlConnection con = new MySqlConnection(connStr)) - { - con.Open(); - MySqlCommand reccmd = new MySqlCommand("spTest", con); - reccmd.CommandTimeout = 0; - reccmd.CommandType = CommandType.StoredProcedure; - MySqlParameter par = new MySqlParameter("@theid", MySqlDbType.String); - par.Value = i; - reccmd.Parameters.Add(par); - using (MySqlDataReader recdr = reccmd.ExecuteReader()) - { - if (recdr.Read()) - { - int x = recdr.GetOrdinal("name"); - Assert.Equal(1, x); - } - } - } - } - MySqlConnection c = new MySqlConnection(connStr); - c.Open(); - ts.KillConnection(c); - } - - bool IsConnectionAlive(int serverThread) - { - -#if NETCORE10 - MySqlCommand cmd = new MySqlCommand("SHOW PROCESSLIST", connection); - using (MySqlDataReader dr = cmd.ExecuteReader()) - { - while (dr.Read()) - { - if (dr.GetInt64("id") == serverThread) - return true; - } - } - return false; -#else - MySqlDataAdapter da = new MySqlDataAdapter("SHOW PROCESSLIST", connection); - DataTable dt = new DataTable(); - da.Fill(dt); - foreach (DataRow row in dt.Rows) - if ((long)row["Id"] == serverThread) - return true; - return false; -#endif - } - -#if CLR4 - [Fact] - public void CleanIdleConnections() - { - string assemblyName = typeof(MySqlConnection).Assembly.FullName; - string pmName = String.Format("MySql.Data.MySqlClient.MySqlPoolManager, {0}", assemblyName); - - Type poolManager = Type.GetType(pmName, false); - FieldInfo poolManagerTimerField = poolManager.GetField("timer", - BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); - FieldInfo poolManagerMaxConnectionIdleTime = - poolManager.GetField("maxConnectionIdleTime", - BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); - - System.Threading.Timer poolManagerTimer = (System.Threading.Timer)poolManagerTimerField.GetValue(null); - int origMaxConnectionIdleTime = (int)poolManagerMaxConnectionIdleTime.GetValue(null); - - - try - { - // Normally, idle connection would expire after 3 minutes and would - // be cleaned up by timer that also runs every 3 minutes. - // Since we do not want to wait that long during a unit tests, - // we use tricks. - // - temporarily reduce max.idle time for connections down to 1 - // second - // - temporarily change cleanup timer to run each second. - isConnectionAlive = true; - threadId = -1; - string connStr = st.GetPoolingConnectionString(); - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - callbacksCount = 0; - threadId = c.ServerThread; - } - - // Pooled connection should be still alive - Assert.True(IsConnectionAlive(threadId)); - - poolManagerMaxConnectionIdleTime.SetValue(null, 3); - - int testIdleTime = (int)poolManagerMaxConnectionIdleTime.GetValue(null); - - poolManagerTimer.Change((testIdleTime * 1000) + 1000, (testIdleTime * 1000)); - - - //create a second timer to check just right after the first interval is completed - timer = new System.Timers.Timer((testIdleTime * 1000) + 1500); - - timer.Elapsed += new ElapsedEventHandler(_timer_Elapsed); - timer.Enabled = true; - - // Let the idle connection expire and let cleanup timer run. - Thread.Sleep((testIdleTime * 1000) + 2000); - - // The removed of the iddle connections should be done in the first callback - Assert.True(callbacksCount == 1, "Callbacks value was not 1"); - - //Check the connection was removed - Assert.False(isConnectionAlive, "IsConnectionAlive failed"); - - } - finally - { - // restore values for connection idle time and timer interval - poolManagerMaxConnectionIdleTime.SetValue(null, origMaxConnectionIdleTime); - poolManagerTimer.Change(origMaxConnectionIdleTime * 1000, - origMaxConnectionIdleTime * 1000); - - timer = null; - } - } -#endif - - //[Fact] - //public void ClearPool() - //{ - // // Start by clearing clearingPools for a clean test - // List clearingPools = GetClearingPools(); - // clearingPools.Clear(); - - // string connStr = st.GetPoolingConnectionString() + ";min pool size=10"; - // MySqlConnectionStringBuilder settings = new MySqlConnectionStringBuilder(connStr); - - // MySqlConnection[] connections = new MySqlConnection[10]; - // connections[0] = new MySqlConnection(connStr); - // connections[0].Open(); - - // Type poolManagerType = typeof(MySqlPoolManager); - // FieldInfo poolManagerHashTable = poolManagerType.GetField("pools", - // BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); - // Hashtable poolHash = (Hashtable)poolManagerHashTable.GetValue(null); - - // // now we need to investigate - // Type poolType = typeof(MySqlPool); - - // FieldInfo idlePool = poolType.GetField("idlePool", BindingFlags.NonPublic | BindingFlags.Instance); - // ICollection idleList = (ICollection)idlePool.GetValue(poolHash[settings.ConnectionString]); - // Debug.Print("Clear Pool test connection string 2 " + settings.ConnectionString); - // Assert.Equal(9, idleList.Count); - - // FieldInfo inUsePool = poolType.GetField("inUsePool", BindingFlags.NonPublic | BindingFlags.Instance); - // ICollection inUseList = (ICollection)inUsePool.GetValue(poolHash[settings.ConnectionString]); - // Assert.Equal(1, inUseList.Count); - - // // now open 4 more of these. Now we shoudl have 5 open and five - // // still in the pool - // for (int i = 1; i < 5; i++) - // { - // connections[i] = new MySqlConnection(connStr); - // connections[i].Open(); - // } - - // Assert.Equal(5, inUseList.Count); - // Assert.Equal(5, idleList.Count); - - // clearingPools = GetClearingPools(); - // Assert.Equal(0, clearingPools.Count); - - // // now tell this connection to clear its pool - // MySqlConnection.ClearPool(connections[0]); - // Assert.Equal(1, clearingPools.Count); - // Assert.Equal(0, idleList.Count); - - // for (int i = 0; i < 5; i++) - // connections[i].Close(); - // Assert.Equal(0, clearingPools.Count); - //} - - private static List GetClearingPools() - { - Type poolManagerType = typeof(MySqlPoolManager); -#if NETCORE10 - FieldInfo clearingPoolsFI = poolManagerType.GetRuntimeField("clearingPools"); -#else - FieldInfo clearingPoolsFI = poolManagerType.GetField("clearingPools", - BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance); -#endif - return clearingPoolsFI.GetValue(null) as List; - } - - [Fact] - public void TestBadConnections() - { - MySqlConnectionStringBuilder builder = new - MySqlConnectionStringBuilder(); - - builder.Pooling = true; - builder.Server = "xxxxxxxx"; // one that definitely does not exist. - builder.UserID = "whoever"; - builder.Password = "whatever"; - - int numberOfConnections = 1; - - for (int i = 0; i < numberOfConnections; ++i) - { - using (MySqlConnection connection = new MySqlConnection(builder.ConnectionString)) - { - Exception ex = Assert.Throws(() => connection.Open()); - Assert.Equal(ex.Message, "Unable to connect to any of the specified MySQL hosts."); - } - Thread.Sleep(50); - } - MySqlConnection.ClearAllPools(); - } - - /// - /// Bug #42801 ClearPool .Net connector : NullReferenceException - /// - [Fact] - public void DoubleClearingConnectionPool() - { - MySqlConnection c1 = ts.GetConnection(true); - MySqlConnection c2 = ts.GetConnection(true); - c1.Open(); - c2.Open(); - c1.Close(); - c2.Close(); - MySqlConnection.ClearPool(c1); - MySqlConnection.ClearPool(c2); - } - - /// - /// Bug #49563 Mysql Client wrongly communications with server when using pooled connections - /// - [Fact] - public void OpenSecondPooledConnectionWithoutDatabase() - { - string connectionString = ts.GetPoolingConnectionString(); - - using (MySqlConnection c1 = new MySqlConnection(connectionString)) - { - c1.Open(); - c1.Close(); - } - using (MySqlConnection c2 = new MySqlConnection(connectionString)) - { - c2.Open(); - c2.Close(); - } - } - - /// - /// Bug #47153 Connector/NET fails to reset connection when encoding has changed - /// - [Fact] - public void ConnectionResetAfterUnicode() - { - executeSQL("DROP TABLE IF EXISTS test"); - executeSQL("CREATE TABLE test (id INT, name VARCHAR(20) CHARSET UCS2)"); - executeSQL("INSERT INTO test VALUES (1, 'test')"); - - string connStr = ts.GetPoolingConnectionString() + ";connection reset=true;min pool size=1; max pool size=1"; - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - MySqlCommand cmd = new MySqlCommand("SELECT * FROM test", c); - using (MySqlDataReader r = cmd.ExecuteReader()) - { - r.Read(); - } - c.Close(); - - try - { - c.Open(); - } - finally - { - ts.KillConnection(c); - } - } - } - -#if !NETCORE10 - private void CacheServerPropertiesInternal(bool cache) - { - string connStr = ts.GetPoolingConnectionString() + - String.Format(";logging=true;cache server properties={0}", cache); - - GenericListener listener = new GenericListener(); - MySqlTrace.Listeners.Add(listener); - MySqlTrace.Switch.Level = System.Diagnostics.SourceLevels.All; - - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - using (MySqlConnection c2 = new MySqlConnection(connStr)) - { - c2.Open(); - ts.KillConnection(c2); - } - ts.KillConnection(c); - } - int count = listener.CountLinesContaining("SHOW VARIABLES"); - Assert.Equal(cache ? 1 : 2, count); - } - - [Fact] - public void CacheServerProperties() - { - //CacheServerPropertiesInternal(true); - //CacheServerPropertiesInternal(false); - } - - - - /// - /// Bug #66578 - /// CacheServerProperties can cause 'Packet too large' error - /// when query exceeds 1024 bytes - /// - [Fact] - public void CacheServerPropertiesCausePacketTooLarge() - { - executeSQL("DROP TABLE IF EXISTS test"); - executeSQL("CREATE TABLE test (id INT(10), image BLOB)"); - - InsertSmallBlobInTestTableUsingPoolingConnection(); - InsertSmallBlobInTestTableUsingPoolingConnection(); - InsertSmallBlobInTestTableUsingPoolingConnection(); - - using (MySqlConnection c1 = new MySqlConnection(ts.GetPoolingConnectionString() + ";logging=true;cache server properties=true")) - { - c1.Open(); - MySqlCommand cmd = new MySqlCommand("SELECT Count(*) from test", c1); - var count = cmd.ExecuteScalar(); - Assert.Equal(3, Convert.ToInt32(count)); - } - - executeSQL("DROP TABLE test "); - } - - - /// - /// Util method for CacheServerPropertiesCausePacketTooLarge Test Method - /// - void InsertSmallBlobInTestTableUsingPoolingConnection() - { - string connStr = ts.GetPoolingConnectionString() + - String.Format(";logging=true;cache server properties=true;"); - - using (MySqlConnection c1 = new MySqlConnection(connStr)) - { - c1.Open(); - byte[] image = Utils.CreateBlob(7152); - MySqlCommand cmd = new MySqlCommand("INSERT INTO test VALUES(NULL, ?image)", c1); - cmd.Parameters.AddWithValue("?image", image); - cmd.ExecuteNonQuery(); - } - } -#endif - - } -} diff --git a/Tests/MySql.Data.Tests/PreparedStatements.cs b/Tests/MySql.Data.Tests/PreparedStatements.cs deleted file mode 100644 index 1f1b5a248..000000000 --- a/Tests/MySql.Data.Tests/PreparedStatements.cs +++ /dev/null @@ -1,855 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Data; -using System.ComponentModel; -using System.Diagnostics; - -namespace MySql.Data.MySqlClient.Tests -{ - public class PreparedStatements : TestBase - { - protected TestSetup ts; - - public PreparedStatements(TestSetup setup) : base(setup, "preparedstatements") - { - ts = setup; - customConnection = new MySqlConnection(connection.ConnectionString + ";" + OnGetConnectionStringInfo()); - customConnection.Open(); - } - - - protected PreparedStatements(TestSetup setup, string nameSpace) : base(setup, nameSpace) - { - ts = setup; - customConnection = new MySqlConnection(connection.ConnectionString + ";" + OnGetConnectionStringInfo()); - customConnection.Open(); - } - - - protected override string OnGetConnectionStringInfo() - { - return ";ignore prepare=false;"; - } - - - [Fact] - public void Simple() - { - executeSQL("CREATE TABLE Test (id INT, dec1 DECIMAL(5,2), name VARCHAR(100))"); - executeSQL("INSERT INTO Test VALUES (1, 345.12, 'abcd')"); - - //using (MySqlConnection cnn = new MySqlConnection(conn)) - //{ - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(1,345.12,'abcd')", connection); - cmd.Prepare(); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM Test"; - cmd.Prepare(); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.Read()); - Assert.Equal(1, reader.GetInt32(0)); - Assert.Equal((decimal)345.12, reader.GetDecimal(1)); - Assert.Equal("abcd", reader.GetString(2)); - } - //} - } - - - [Fact] - public void SimplePrepareBeforeParms() - { - executeSQL("CREATE TABLE Test (one INTEGER, two INTEGER)"); - executeSQL("INSERT INTO Test VALUES (1, 2)"); - - // create the command and prepare the statement - IDbCommand cmd = connection.CreateCommand(); - cmd.CommandText = "SELECT * FROM Test WHERE one = ?p1"; - - // create the parameter - IDbDataParameter p1 = cmd.CreateParameter(); - p1.ParameterName = "?p1"; - p1.DbType = DbType.Int32; - p1.Precision = (byte)10; - p1.Scale = (byte)0; - p1.Size = 4; - cmd.Parameters.Add(p1); - p1.Value = 1; - - cmd.Prepare(); - // Execute the reader - using (IDataReader reader = cmd.ExecuteReader()) - { - // Fetch the first record - reader.Read(); - Assert.Equal(1, reader.GetInt32(0)); - Assert.Equal(2, reader.GetInt32(1)); - } - } - - [Fact] - public void DateAndTimes() - { - - if (ts.version < new Version(5, 6)) - executeSQL("CREATE TABLE Test (id INT NOT NULL, d DATE, dt DATETIME, tm TIME, ts TIMESTAMP, PRIMARY KEY(id))"); - else - executeSQL("CREATE TABLE Test (id INT NOT NULL, d DATE, dt DATETIME, tm TIME(6), ts TIMESTAMP, PRIMARY KEY(id))"); - - //using (MySqlConnection cnn = new MySqlConnection(conn)) - //{ - string sql = "INSERT INTO Test VALUES(?id, ?d, ?dt, ?tm, NULL)"; - MySqlCommand cmd = new MySqlCommand(sql, connection); - - DateTime dt = DateTime.Now; - dt = dt.AddMilliseconds(dt.Millisecond * -1); - TimeSpan timeSp = new TimeSpan(8, 11, 44, 56, 501); - - cmd.Parameters.AddWithValue("?id", 1); - cmd.Parameters.AddWithValue("?d", dt); - cmd.Parameters.AddWithValue("?dt", dt); - cmd.Parameters.AddWithValue("?tm", timeSp); - cmd.Prepare(); - int count = cmd.ExecuteNonQuery(); - Assert.True(count == 1, "Records affected by insert"); - - cmd.CommandText = "SELECT * FROM Test"; - cmd.Prepare(); - - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - Assert.True(reader.GetInt32(0) == 1, "Id column"); - Assert.True(dt.Date == reader.GetDateTime(1).Date, "Date column"); - - DateTime dt2 = reader.GetDateTime(2); - Assert.Equal(dt.Date, dt2.Date); - Assert.Equal(dt.Hour, dt2.Hour); - Assert.Equal(dt.Minute, dt2.Minute); - Assert.Equal(dt.Second, dt2.Second); - - TimeSpan ts2 = reader.GetTimeSpan(3); - Assert.Equal(timeSp.Days, ts2.Days); - Assert.Equal(timeSp.Hours, ts2.Hours); - Assert.Equal(timeSp.Minutes, ts2.Minutes); - Assert.Equal(timeSp.Seconds, ts2.Seconds); - Assert.True(dt.Date == reader.GetDateTime(4).Date, "Timestamp column"); - } - //} - } - - [Fact] - public void ResetCommandText() - { - executeSQL("CREATE TABLE Test (id int, name varchar(100))"); - executeSQL("INSERT INTO Test VALUES (1, 'Test')"); - - MySqlCommand cmd = new MySqlCommand("SELECT id FROM Test", connection); - cmd.Prepare(); - object o = cmd.ExecuteScalar(); - Assert.Equal(1, o); - - cmd.CommandText = "SELECT name FROM Test"; - cmd.Prepare(); - o = cmd.ExecuteScalar(); - Assert.Equal("Test", o); - - } - - [Fact] - public void DifferentParameterOrder() - { - executeSQL("CREATE TABLE Test (id int NOT NULL AUTO_INCREMENT, " + - "id2 int NOT NULL, name varchar(50) DEFAULT NULL, " + - "id3 int DEFAULT NULL, PRIMARY KEY (id))"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test (id, id2, name, id3) " + - "VALUES(?id, ?id2, ?name,?id3)", connection); - - MySqlParameter id = new MySqlParameter(); - id.ParameterName = "?id"; - id.DbType = DbType.Int32; - id.Value = DBNull.Value; - - MySqlParameter id2 = new MySqlParameter(); - id2.ParameterName = "?id2"; - id2.DbType = DbType.Int32; - id2.Value = 2; - - MySqlParameter name = new MySqlParameter(); - name.ParameterName = "?name"; - name.DbType = DbType.String; - name.Value = "Test"; - - MySqlParameter id3 = new MySqlParameter(); - id3.ParameterName = "?id3"; - id3.DbType = DbType.Int32; - id3.Value = 3; - - cmd.Parameters.Add(id); - cmd.Parameters.Add(id2); - cmd.Parameters.Add(name); - cmd.Parameters.Add(id3); - cmd.Prepare(); - Assert.Equal(1, cmd.ExecuteNonQuery()); - - cmd.Parameters.Clear(); - - id3.Value = DBNull.Value; - name.Value = DBNull.Value; - cmd.Parameters.Add(id); - cmd.Parameters.Add(id2); - cmd.Parameters.Add(id3); - cmd.Parameters.Add(name); - - cmd.Prepare(); - Assert.Equal(1, cmd.ExecuteNonQuery()); - - cmd.CommandText = "SELECT id3 FROM Test WHERE id=1"; - Assert.Equal(3, cmd.ExecuteScalar()); - - cmd.CommandText = "SELECT name FROM Test WHERE id=2"; - Assert.Equal(DBNull.Value, cmd.ExecuteScalar()); - } - - [Fact] - public void Blobs() - { - executeSQL("CREATE TABLE Test (id INT, blob1 LONGBLOB, text1 LONGTEXT)"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?id, ?blob1, ?text1)", connection); - - byte[] bytes = Utils.CreateBlob(400000); - string inStr = "This is my text"; - - cmd.Parameters.AddWithValue("?id", 1); - cmd.Parameters.AddWithValue("?blob1", bytes); - cmd.Parameters.AddWithValue("?text1", inStr); - cmd.Prepare(); - int count = cmd.ExecuteNonQuery(); - Assert.Equal(1, count); - - cmd.CommandText = "SELECT * FROM Test"; - cmd.Prepare(); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.Read()); - Assert.Equal(1, reader.GetInt32(0)); - Assert.Equal(bytes.Length, reader.GetBytes(1, 0, null, 0, 0)); - byte[] outBytes = new byte[bytes.Length]; - reader.GetBytes(1, 0, outBytes, 0, bytes.Length); - for (int x = 0; x < bytes.Length; x++) - Assert.Equal(bytes[x], outBytes[x]); - Assert.Equal(inStr, reader.GetString(2)); - } - } - - [Fact] - public void SimpleTest2() - { - executeSQL("CREATE TABLE Test (one integer, two integer, three integer, four integer, five integer, six integer, seven integer)"); - executeSQL("INSERT INTO Test VALUES (1, 2, 3, 4, 5, 6, 7)"); - - // create the command and prepare the statement - IDbCommand cmd = connection.CreateCommand(); - cmd.CommandText = "SELECT one, two, three, four, five, six, seven FROM Test"; - cmd.Prepare(); - // Execute the reader - using (IDataReader reader = cmd.ExecuteReader()) - { - // Fetch the first record - reader.Read(); - - Assert.Equal(1, reader.GetInt32(0)); - Assert.Equal(2, reader.GetInt32(1)); - Assert.Equal(3, reader.GetInt32(2)); - Assert.Equal(4, reader.GetInt32(3)); - Assert.Equal(5, reader.GetInt32(4)); - Assert.Equal(6, reader.GetInt32(5)); - Assert.Equal(7, reader.GetInt32(6)); - } - } - - [Fact] - public void Bug6271() - { - if (ts.version < new Version(4, 1)) return; - - // Create the table again - executeSQL("CREATE TABLE `Test2` (id INT unsigned NOT NULL auto_increment, " + - "`xpDOSG_Name` text,`xpDOSG_Desc` text, `Avatar` MEDIUMBLOB, `dtAdded` DATETIME, `dtTime` TIMESTAMP, " + - "PRIMARY KEY(id)) ENGINE=InnoDB DEFAULT CHARSET=latin1"); - - string sql = "INSERT INTO `Test2` (`xpDOSG_Name`,`dtAdded`, `xpDOSG_Desc`,`Avatar`, `dtTime`) " + - "VALUES(?name, ?dt, ?desc, ?Avatar, NULL)"; - - MySqlCommand cmd = new MySqlCommand(sql, connection); - - DateTime dt = DateTime.Now; - dt = dt.AddMilliseconds(dt.Millisecond * -1); - - byte[] xpDOSG_Avatar = Utils.CreateBlob(13000); - cmd.Parameters.AddWithValue("?name", "Ceci est un nom"); - - cmd.Parameters.AddWithValue("?desc", "Ceci est une description facile à plantouiller"); - cmd.Parameters.AddWithValue("?avatar", xpDOSG_Avatar); - cmd.Parameters.AddWithValue("?dt", dt); - cmd.Prepare(); - int count = cmd.ExecuteNonQuery(); - Assert.Equal(1, count); - - cmd.CommandText = "SELECT * FROM Test2"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.Read()); - Assert.Equal("Ceci est un nom", reader.GetString(1)); - Assert.Equal(dt.ToString("G"), reader.GetDateTime(4).ToString("G")); - Assert.Equal("Ceci est une description facile à plantouiller", reader.GetString(2)); - - long len = reader.GetBytes(3, 0, null, 0, 0); - Assert.Equal(xpDOSG_Avatar.Length, len); - byte[] outBytes = new byte[len]; - reader.GetBytes(3, 0, outBytes, 0, (int)len); - - for (int x = 0; x < xpDOSG_Avatar.Length; x++) - Assert.Equal(xpDOSG_Avatar[x], outBytes[x]); - } - } - - [Fact] - public void SimpleTest() - { - executeSQL("CREATE TABLE Test (one integer, two integer )"); - executeSQL("INSERT INTO Test VALUES( 1, 2)"); - // create the command and prepare the statement - IDbCommand cmd = connection.CreateCommand(); - cmd.CommandText = "SELECT * FROM Test where one = ?p1"; - // create the parameter - IDbDataParameter p1 = cmd.CreateParameter(); - p1.ParameterName = "?p1"; - p1.DbType = DbType.Int32; - p1.Precision = (byte)10; - p1.Scale = (byte)0; - p1.Size = 4; - cmd.Parameters.Add(p1); - // prepare the command - cmd.Prepare(); - // set the parameter value - p1.Value = 1; - // Execute the reader - IDataReader reader = null; - reader = cmd.ExecuteReader(); - // Fetch the first record - reader.Read(); - if (reader != null) reader.Close(); - - } - - /// - /// Bug #13662 Prepare() truncates accented character input - /// - [Fact] - public void InsertAccentedCharacters() - { - if (ts.version < new Version(4, 1)) return; - - executeSQL("CREATE TABLE Test (id INT UNSIGNED NOT NULL PRIMARY KEY " + - "AUTO_INCREMENT, input TEXT NOT NULL) CHARACTER SET UTF8"); - // COLLATE " + - //"utf8_bin"); - using (MySqlConnection conn2 = new MySqlConnection(connection.ConnectionString + - ";charset=utf8")) - { - conn2.Open(); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test(input) " + - "VALUES (?input) ON DUPLICATE KEY UPDATE " + - "id=LAST_INSERT_ID(id)", conn2); - cmd.Parameters.Add(new MySqlParameter("?input", "")); - cmd.Prepare(); - cmd.Parameters[0].Value = "irache martínez@yahoo.es aol.com"; - cmd.ExecuteNonQuery(); - - MySqlCommand cmd2 = new MySqlCommand("SELECT input FROM Test", conn2); - Assert.Equal("irache martínez@yahoo.es aol.com", - cmd2.ExecuteScalar()); - } - } - - /// - /// Bug #13541 Prepare breaks if a parameter is used more than once - /// - [Fact] - public void UsingParametersTwice() - { - if (ts.version < new Version(4, 1)) return; - - executeSQL(@"CREATE TABLE IF NOT EXISTS Test (input TEXT NOT NULL, - UNIQUE (input(100)), state INT NOT NULL, score INT NOT NULL)"); - - MySqlCommand cmd = new MySqlCommand(@"Insert into Test (input, - state, score) VALUES (?input, ?st, ?sc) ON DUPLICATE KEY - UPDATE state=state|?st;", connection); - cmd.Parameters.Add(new MySqlParameter("?input", "")); - cmd.Parameters.Add(new MySqlParameter("?st", Convert.ToInt32(0))); - cmd.Parameters.Add(new MySqlParameter("?sc", Convert.ToInt32(0))); - cmd.Prepare(); - - cmd.Parameters["?input"].Value = "test"; - cmd.Parameters["?st"].Value = 1; - cmd.Parameters["?sc"].Value = 42; - int result = cmd.ExecuteNonQuery(); - Assert.Equal(1, result); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - DataTable dt = new DataTable(); - da.Fill(dt); - Assert.Equal(1, dt.Rows.Count); - Assert.Equal("test", dt.Rows[0]["input"]); - Assert.Equal(1, dt.Rows[0]["state"]); - Assert.Equal(42, dt.Rows[0]["score"]); - } - - /// - /// Bug #19261 Supplying Input Parameters - /// - [Fact] - public void MoreParametersOutOfOrder() - { - if (ts.version < new Version(4, 1)) return; - - executeSQL("CREATE TABLE `Test` (`BlackListID` int(11) NOT NULL auto_increment, " + - "`SubscriberID` int(11) NOT NULL, `Phone` varchar(50) default NULL, " + - "`ContactID` int(11) default NULL, " + - "`AdminJunk` tinyint(1) NOT NULL default '0', " + - "PRIMARY KEY (`BlackListID`), KEY `SubscriberID` (`SubscriberID`))"); - - IDbCommand cmd = connection.CreateCommand(); - cmd.CommandText = "INSERT INTO `Test`(`SubscriberID`,`Phone`,`ContactID`, " + - "`AdminJunk`) VALUES (?SubscriberID,?Phone,?ContactID, ?AdminJunk);"; - - MySqlParameter oParameterSubscriberID = new MySqlParameter(); - oParameterSubscriberID.ParameterName = "?SubscriberID"; - oParameterSubscriberID.DbType = DbType.Int32; - oParameterSubscriberID.Value = 1; - - MySqlParameter oParameterPhone = new MySqlParameter(); - oParameterPhone.ParameterName = "?Phone"; - oParameterPhone.DbType = DbType.String; - oParameterPhone.Value = DBNull.Value; - - MySqlParameter oParameterContactID = new MySqlParameter(); - oParameterContactID.ParameterName = "?ContactID"; - oParameterContactID.DbType = DbType.Int32; - oParameterContactID.Value = DBNull.Value; - - MySqlParameter oParameterAdminJunk = new MySqlParameter(); - oParameterAdminJunk.ParameterName = "?AdminJunk"; - oParameterAdminJunk.DbType = DbType.Boolean; - oParameterAdminJunk.Value = true; - - cmd.Parameters.Add(oParameterSubscriberID); - cmd.Parameters.Add(oParameterPhone); - cmd.Parameters.Add(oParameterAdminJunk); - cmd.Parameters.Add(oParameterContactID); - - cmd.Prepare(); - int cnt = cmd.ExecuteNonQuery(); - Assert.Equal(1, cnt); - } - - /// - /// Bug #16627 Index and length must refer to a location within the string." when executing c - /// - [Fact] - public void ParameterLengths() - { - if (ts.version < new Version(4, 1)) return; - executeSQL("CREATE TABLE Test (id int, name VARCHAR(255))"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?id, ?name)", connection); - cmd.Parameters.Add("?id", MySqlDbType.Int32); - cmd.Parameters.Add("?name", MySqlDbType.VarChar); - cmd.Parameters[1].Size = 255; - cmd.Prepare(); - - cmd.Parameters[0].Value = 1; - cmd.Parameters[1].Value = "short string"; - cmd.ExecuteNonQuery(); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - DataTable dt = new DataTable(); - da.Fill(dt); - Assert.Equal(1, dt.Rows.Count); - Assert.Equal(1, dt.Rows[0]["id"]); - Assert.Equal("short string", dt.Rows[0]["name"]); - } - - /// - /// Bug #18570 Unsigned tinyint (NET byte) incorrectly determined param type from param val - /// - [Fact] - public void UnsignedTinyInt() - { - if (ts.version < new Version(4, 1)) return; - - executeSQL("CREATE TABLE Test(ID TINYINT UNSIGNED NOT NULL, " + - "Name VARCHAR(50) NOT NULL, PRIMARY KEY (ID), UNIQUE (ID), " + - "UNIQUE (Name))"); - executeSQL("INSERT INTO Test VALUES ('127', 'name1')"); - executeSQL("INSERT INTO Test VALUES ('128', 'name2')"); - executeSQL("INSERT INTO Test VALUES ('255', 'name3')"); - - string sql = " SELECT count(*) FROM Test WHERE ID = ?id"; - - MySqlCommand command = new MySqlCommand(); - command.CommandText = sql; - command.CommandType = CommandType.Text; - command.Connection = (MySqlConnection)connection; - - command.Parameters.AddWithValue("?id", (byte)127); - command.Prepare(); - int count = Convert.ToInt32(command.ExecuteScalar()); - Assert.Equal(1, count); - - command.Parameters.Clear(); - command.Parameters.AddWithValue("?id", (byte)128); - count = Convert.ToInt32(command.ExecuteScalar()); - Assert.Equal(1, count); - - command.Parameters.Clear(); - command.Parameters.AddWithValue("?id", (byte)255); - count = Convert.ToInt32(command.ExecuteScalar()); - Assert.Equal(1, count); - - command.Parameters.Clear(); - command.Parameters.AddWithValue("?id", "255"); - count = Convert.ToInt32(command.ExecuteScalar()); - Assert.Equal(1, count); - } - - /// - /// Bug #16934 Unsigned values > 2^63 (UInt64) cannot be used in prepared statements - /// - [Fact] - public void UnsignedValues() - { - if (ts.version < new Version(4, 1)) return; - - executeSQL("CREATE TABLE Test (ulVal BIGINT UNSIGNED, lVal INT UNSIGNED, " + - "mVal MEDIUMINT UNSIGNED, sVal SMALLINT UNSIGNED)"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?ulVal, " + - "?lVal, ?mVal, ?sVal)", connection); - cmd.Parameters.Add("?ulVal", MySqlDbType.UInt64); - cmd.Parameters.Add("?lVal", MySqlDbType.UInt32); - cmd.Parameters.Add("?mVal", MySqlDbType.UInt24); - cmd.Parameters.Add("?sVal", MySqlDbType.UInt16); - cmd.Prepare(); - cmd.Parameters[0].Value = UInt64.MaxValue; - cmd.Parameters[1].Value = UInt32.MaxValue; - cmd.Parameters[2].Value = 16777215; - cmd.Parameters[3].Value = UInt16.MaxValue; - Assert.Equal(1, cmd.ExecuteNonQuery()); - cmd.CommandText = "SELECT * FROM Test"; - cmd.CommandType = CommandType.Text; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - Assert.Equal(UInt64.MaxValue, reader.GetUInt64(0)); - Assert.Equal(UInt32.MaxValue, reader.GetUInt32(1)); - Assert.Equal(16777215, Convert.ToInt32(reader.GetUInt32(2))); - Assert.Equal(UInt16.MaxValue, reader.GetUInt16(3)); - } - } - - /// - /// Bug #18391 Better error handling for the .NET class "MySqlCommand" needed. - /// - [Fact] - public void PrepareEmptyString() - { - MySqlCommand cmd = new MySqlCommand("", connection); - cmd.Prepare(); - Exception ex = Assert.Throws(() => cmd.ExecuteNonQuery()); - Assert.Equal(ex.Message, "The CommandText property has not been properly initialized."); - } - - /// - /// Bug #14115 Prepare() with compound statements breaks - /// - [Fact] - public void CompoundStatements() - { - executeSQL("CREATE TABLE IF NOT EXISTS Test (" + - "id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT," + - "test1 INT UNSIGNED, test2 INT UNSIGNED)"); - - MySqlCommand cmd = customConnection.CreateCommand(); - cmd.CommandText = "INSERT INTO Test VALUES (NULL, ?t1, ?t2);" + - "SELECT last_insert_id()"; - cmd.Parameters.Add("?t1", MySqlDbType.Int32); - cmd.Parameters.Add("?t2", MySqlDbType.Int32); - Exception ex = Assert.Throws(() => cmd.Prepare()); - Assert.True(ex.Message.Contains("You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version")); - } - - [Fact] - public void SchemaOnly() - { - executeSQL("CREATE TABLE Test (id INT, name VARCHAR(50))"); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", connection); - cmd.Prepare(); - using (MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly)) - { - reader.Read(); - } - } - - private int GetPreparedStatementCount() - { - MySqlCommand cmd = new MySqlCommand("SHOW GLOBAL STATUS LIKE 'Prepared%'", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - string s = reader.GetString(1); - return Int32.Parse(s); - } - } - - [Fact] - public void ClosingCommandsProperly() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE TABLE Test (id INT, name VARCHAR(50))"); - - string connStr = connection.ConnectionString + ";ignore prepare=false"; - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - - int initialCount = GetPreparedStatementCount(); - - for (int i = 0; i < 10; i++) - { - using (MySqlCommand cmd = - new MySqlCommand("INSERT INTO Test VALUES (?id, ?name)", c)) - { - cmd.Parameters.Add("?id", MySqlDbType.Int32); - cmd.Parameters.Add("?name", MySqlDbType.VarChar); - cmd.Prepare(); - cmd.Parameters[0].Value = i; - cmd.Parameters[1].Value = "foobar"; - cmd.ExecuteNonQuery(); - } - } - c.Ping(); - Assert.Equal(initialCount, GetPreparedStatementCount()); - } - } - - /// - /// Bug #37968 Prepared statements byte/tinyint causes data corruption. - /// - [Fact] - public void InsertingUnsignedTinyInt() - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL(@"CREATE TABLE Test(id TINYINT UNSIGNED NOT NULL, - id2 INT UNSIGNED, id3 TINYINT UNSIGNED, id4 INT UNSIGNED NOT NULL)"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?id, ?id2, ?id3, ?id4)", connection); - cmd.Parameters.Add("?id", MySqlDbType.UByte); - cmd.Parameters.Add("?id2", MySqlDbType.UByte); - cmd.Parameters.Add("?id3", MySqlDbType.UByte); - cmd.Parameters.Add("?id4", MySqlDbType.UByte); - cmd.Prepare(); - - cmd.Parameters[0].Value = 127; - cmd.Parameters[1].Value = 1; - cmd.Parameters[2].Value = 2; - cmd.Parameters[3].Value = 3; - cmd.ExecuteNonQuery(); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - DataTable dt = new DataTable(); - da.Fill(dt); - Assert.Equal(1, dt.Rows.Count); - Assert.Equal(127, Convert.ToInt32(dt.Rows[0][0])); - Assert.Equal(1, Convert.ToInt32(dt.Rows[0][1])); - Assert.Equal(2, Convert.ToInt32(dt.Rows[0][2])); - Assert.Equal(3, Convert.ToInt32(dt.Rows[0][3])); - } - - /// - /// Bug #39275 Inserting negative time value through the use of MySqlParameter throws exception - /// Bug #39294 Reading negative time value greater than -01:00:00 return positive value - /// - [Fact] - public void NegativeTimePrepared() - { - NegativeTime(true); - ReadNegativeTime(true); - } - - /// - /// Bug #39275 Inserting negative time value through the use of MySqlParameter throws exception - /// Bug #39294 Reading negative time value greater than -01:00:00 return positive value - /// - [Fact] - public void NegativeTimeNonPrepared() - { - NegativeTime(false); - ReadNegativeTime(false); - } - - public void NegativeTime(bool prepared) - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL(@"CREATE TABLE Test(id int, t time)"); - - MySqlCommand cmd = new MySqlCommand(@"INSERT INTO Test VALUES (1, @t)", connection); - cmd.Parameters.Add("@t", MySqlDbType.Time); - - TimeSpan[] times = new TimeSpan[8] { - new TimeSpan(-10, 0, 0), new TimeSpan(2, -5, 10, 20), - new TimeSpan(20, -10, 10), new TimeSpan(0, -15, 25), - new TimeSpan(-4, -10, 20, -10), new TimeSpan(3, 17, 23, 6), - new TimeSpan(-1,-2,-3,-4), new TimeSpan(0,0,0,-15) }; - if (prepared) - cmd.Prepare(); - foreach (TimeSpan ts in times) - { - cmd.Parameters[0].Value = ts; - cmd.ExecuteNonQuery(); - } - - cmd.CommandText = "SELECT * FROM Test"; - cmd.Parameters.Clear(); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - foreach (TimeSpan ts in times) - { - reader.Read(); - TimeSpan t = reader.GetTimeSpan(1); - Assert.Equal(ts, t); - } - } - } - - private void ReadNegativeTime(bool prepared) - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test(id int, t time)"); - executeSQL("INSERT INTO Test VALUES (1, '-00:10:00')"); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", connection); - if (prepared) - cmd.Prepare(); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - TimeSpan ts = reader.GetTimeSpan(1); - Assert.Equal(0, ts.Hours); - Assert.Equal(-10, ts.Minutes); - Assert.Equal(0, ts.Seconds); - } - } - - [Fact] - public void SprocOutputParams() - { - if (ts.version < new Version(6, 0, 8)) return; - - executeSQL("CREATE PROCEDURE spTest(id INT, OUT age INT) BEGIN SET age=id; END"); - - MySqlCommand cmd = new MySqlCommand("spTest", connection); - cmd.Parameters.Add("@id", MySqlDbType.Int32); - cmd.Parameters.Add("@age", MySqlDbType.Int32).Direction = ParameterDirection.Output; - cmd.CommandType = CommandType.StoredProcedure; - cmd.Prepare(); - - cmd.Parameters[0].Value = 20; - Assert.Equal(0, cmd.ExecuteNonQuery()); - Assert.Equal(20, cmd.Parameters[1].Value); - - executeSQL("DROP PROCEDURE IF EXISTS spTest"); - executeSQL("CREATE PROCEDURE spTest(id INT, OUT age INT) BEGIN SET age=age*2; END"); - - cmd.Parameters[0].Value = 1; - cmd.Parameters[1].Value = 20; - Assert.Equal(0, cmd.ExecuteNonQuery()); - Assert.Equal(20, cmd.Parameters[1].Value); - } - - [Fact] - public void SprocInputOutputParams() - { - if (ts.version < new Version(6, 0, 8)) return; - - executeSQL("CREATE PROCEDURE spTest(id INT, INOUT age INT) BEGIN SET age=age*2; END"); - - MySqlCommand cmd = new MySqlCommand("spTest", connection); - cmd.Parameters.Add("@id", MySqlDbType.Int32); - cmd.Parameters.Add("@age", MySqlDbType.Int32).Direction = ParameterDirection.InputOutput; - cmd.CommandType = CommandType.StoredProcedure; - cmd.Prepare(); - - cmd.Parameters[0].Value = 1; - cmd.Parameters[1].Value = 20; - Assert.Equal(0, cmd.ExecuteNonQuery()); - Assert.Equal(40, cmd.Parameters[1].Value); - } - - /// - /// Bug #49794 MySqlDataReader.GetUInt64 doesn't work for large BIGINT UNSIGNED - /// - [Fact] - public void BigIntUnsigned() - { - executeSQL("DROP TABLE IF EXISTS test"); - executeSQL(@"CREATE TABLE test(id int(10) unsigned NOT NULL, testValue bigint(20) unsigned NOT NULL, - PRIMARY KEY USING BTREE (Id)) ENGINE=InnoDB DEFAULT CHARSET=latin1"); - executeSQL("INSERT INTO test(Id,TestValue) VALUES(1, 3000000000)"); - - MySqlCommand cmd = new MySqlCommand("SELECT testValue FROM test WHERE id=@Id", connection); - cmd.Parameters.Add("@id", MySqlDbType.UInt32); - cmd.Prepare(); - - cmd.Parameters["@id"].Value = 1; - using (MySqlDataReader rdr = cmd.ExecuteReader()) - { - rdr.Read(); - UInt64 v = rdr.GetUInt64(0); - Assert.Equal(3000000000, v); - } - } - } -} diff --git a/Tests/MySql.Data.Tests/ProcedureParameterTests.cs b/Tests/MySql.Data.Tests/ProcedureParameterTests.cs deleted file mode 100644 index 36a341376..000000000 --- a/Tests/MySql.Data.Tests/ProcedureParameterTests.cs +++ /dev/null @@ -1,405 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Data; - -namespace MySql.Data.MySqlClient.Tests -{ - public class ProcedureParameterTests : TestBase - { - - protected TestSetup ts; - - public ProcedureParameterTests(TestSetup setup) : base (setup, "procedurepartests") - { - ts = setup; - } - - [Fact] - public void ProcedureParameters() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE PROCEDURE spTest (id int, name varchar(50)) BEGIN SELECT 1; END"); - - string[] restrictions = new string[5]; - restrictions[1] = ts.baseDBName + "0"; - restrictions[2] = "spTest"; - DataTable dt = connection.GetSchema("Procedure Parameters", restrictions); - Assert.True(dt.Rows.Count == 2, "Actual result " + dt.Rows.Count); - Assert.Equal("Procedure Parameters", dt.TableName); - Assert.Equal(ts.baseDBName + "0".ToLower(), dt.Rows[0]["SPECIFIC_SCHEMA"].ToString().ToLower()); - Assert.Equal("sptest", dt.Rows[0]["SPECIFIC_NAME"].ToString().ToLower()); - Assert.Equal("id", dt.Rows[0]["PARAMETER_NAME"].ToString().ToLower()); - Assert.Equal(1, dt.Rows[0]["ORDINAL_POSITION"]); - Assert.Equal("IN", dt.Rows[0]["PARAMETER_MODE"]); - - restrictions[4] = "name"; - dt.Clear(); - dt = connection.GetSchema("Procedure Parameters", restrictions); - Assert.Equal(1, dt.Rows.Count); - Assert.Equal(ts.baseDBName + "0".ToLower(), dt.Rows[0]["SPECIFIC_SCHEMA"].ToString().ToLower()); - Assert.Equal("sptest", dt.Rows[0]["SPECIFIC_NAME"].ToString().ToLower()); - Assert.Equal("name", dt.Rows[0]["PARAMETER_NAME"].ToString().ToLower()); - Assert.Equal(2, dt.Rows[0]["ORDINAL_POSITION"]); - Assert.Equal("IN", dt.Rows[0]["PARAMETER_MODE"]); - - executeSQL("DROP FUNCTION IF EXISTS spFunc"); - executeSQL("CREATE FUNCTION spFunc (id int) RETURNS INT BEGIN RETURN 1; END"); - - restrictions[4] = null; - restrictions[1] = ts.baseDBName + "0"; - restrictions[2] = "spFunc"; - dt = connection.GetSchema("Procedure Parameters", restrictions); - Assert.True(dt.Rows.Count == 2); - Assert.Equal("Procedure Parameters", dt.TableName); - Assert.Equal(ts.baseDBName + "0".ToLower(), dt.Rows[0]["SPECIFIC_SCHEMA"].ToString().ToLower()); - Assert.Equal("spfunc", dt.Rows[0]["SPECIFIC_NAME"].ToString().ToLower()); - Assert.Equal(0, dt.Rows[0]["ORDINAL_POSITION"]); - - Assert.Equal(ts.baseDBName + "0".ToLower(), dt.Rows[1]["SPECIFIC_SCHEMA"].ToString().ToLower()); - Assert.Equal("spfunc", dt.Rows[1]["SPECIFIC_NAME"].ToString().ToLower()); - Assert.Equal("id", dt.Rows[1]["PARAMETER_NAME"].ToString().ToLower()); - Assert.Equal(1, dt.Rows[1]["ORDINAL_POSITION"]); - Assert.Equal("IN", dt.Rows[1]["PARAMETER_MODE"]); - } - - /// - /// Bug #6902 Errors in parsing stored procedure parameters - /// - [Fact] - public void ProcedureParameters2() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL(@"CREATE PROCEDURE spTest(`/*id*/` /* before type 1 */ varchar(20), - /* after type 1 */ OUT result2 DECIMAL(/*size1*/10,/*size2*/2) /* p2 */) - BEGIN SELECT action, result; END"); - - string[] restrictions = new string[5]; - restrictions[1] = ts.baseDBName + "0"; - restrictions[2] = "spTest"; - DataTable dt = connection.GetSchema("Procedure Parameters", restrictions); - - Assert.True(dt.Rows.Count == 2, "Actual result " + dt.Rows.Count); - Assert.Equal(ts.baseDBName + "0".ToLower(), dt.Rows[0]["SPECIFIC_SCHEMA"].ToString().ToLower()); - Assert.Equal("sptest", dt.Rows[0]["SPECIFIC_NAME"].ToString().ToLower()); - Assert.Equal("/*id*/", dt.Rows[0]["PARAMETER_NAME"].ToString().ToLower()); - Assert.Equal(1, dt.Rows[0]["ORDINAL_POSITION"]); - Assert.Equal("IN", dt.Rows[0]["PARAMETER_MODE"]); - Assert.Equal("VARCHAR", dt.Rows[0]["DATA_TYPE"].ToString().ToUpper()); - Assert.Equal(20, dt.Rows[0]["CHARACTER_MAXIMUM_LENGTH"]); - Assert.Equal(20, dt.Rows[0]["CHARACTER_OCTET_LENGTH"]); - - Assert.Equal(ts.baseDBName + "0".ToLower(), dt.Rows[1]["SPECIFIC_SCHEMA"].ToString().ToLower()); - Assert.Equal("sptest", dt.Rows[1]["SPECIFIC_NAME"].ToString().ToLower()); - Assert.Equal("result2", dt.Rows[1]["PARAMETER_NAME"].ToString().ToLower()); - Assert.Equal(2, dt.Rows[1]["ORDINAL_POSITION"]); - Assert.Equal("OUT", dt.Rows[1]["PARAMETER_MODE"]); - Assert.Equal("DECIMAL", dt.Rows[1]["DATA_TYPE"].ToString().ToUpper()); - Assert.Equal(10, Convert.ToInt32(dt.Rows[1]["NUMERIC_PRECISION"])); - Assert.Equal(2, dt.Rows[1]["NUMERIC_SCALE"]); - } - - [Fact] - public void ProcedureParameters3() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL(@"CREATE PROCEDURE spTest (_ACTION varchar(20), - `/*dumb-identifier-1*/` int, `#dumb-identifier-2` int, - `--dumb-identifier-3` int, - _CLIENT_ID int, -- ABC - _LOGIN_ID int, # DEF - _WHERE varchar(2000), - _SORT varchar(2000), - out _SQL varchar(/* inline right here - oh my gosh! */ 8000), - _SONG_ID int, - _NOTES varchar(2000), - out _RESULT varchar(10) - /* - , -- Generic result parameter - out _PERIOD_ID int, -- Returns the period_id. Useful when using @PREDEFLINK to return which is the last period - _SONGS_LIST varchar(8000), - _COMPOSERID int, - _PUBLISHERID int, - _PREDEFLINK int -- If the user is accessing through a predefined link: 0=none 1=last period - */) BEGIN SELECT 1; END"); - - string[] restrictions = new string[5]; - restrictions[1] = ts.baseDBName + "0"; - restrictions[2] = "spTest"; - DataTable dt = connection.GetSchema("Procedure Parameters", restrictions); - - Assert.True(dt.Rows.Count == 12, "Rows count failed"); - Assert.Equal(ts.baseDBName + "0".ToLower(), dt.Rows[0]["SPECIFIC_SCHEMA"].ToString().ToLower()); - Assert.Equal("sptest", dt.Rows[0]["SPECIFIC_NAME"].ToString().ToLower()); - Assert.Equal("_action", dt.Rows[0]["PARAMETER_NAME"].ToString().ToLower()); - Assert.Equal(1, dt.Rows[0]["ORDINAL_POSITION"]); - Assert.Equal("IN", dt.Rows[0]["PARAMETER_MODE"]); - Assert.Equal("VARCHAR", dt.Rows[0]["DATA_TYPE"].ToString().ToUpper()); - Assert.Equal(20, dt.Rows[0]["CHARACTER_OCTET_LENGTH"]); - - Assert.Equal(ts.baseDBName + "0".ToLower(), dt.Rows[1]["SPECIFIC_SCHEMA"].ToString().ToLower()); - Assert.Equal("sptest", dt.Rows[1]["SPECIFIC_NAME"].ToString().ToLower()); - Assert.Equal("/*dumb-identifier-1*/", dt.Rows[1]["PARAMETER_NAME"].ToString().ToLower()); - Assert.Equal(2, dt.Rows[1]["ORDINAL_POSITION"]); - Assert.Equal("IN", dt.Rows[1]["PARAMETER_MODE"]); - Assert.Equal("INT", dt.Rows[1]["DATA_TYPE"].ToString().ToUpper()); - - Assert.Equal(ts.baseDBName + "0".ToLower(), dt.Rows[2]["SPECIFIC_SCHEMA"].ToString().ToLower()); - Assert.Equal("sptest", dt.Rows[2]["SPECIFIC_NAME"].ToString().ToLower()); - Assert.Equal("#dumb-identifier-2", dt.Rows[2]["PARAMETER_NAME"].ToString().ToLower()); - Assert.Equal(3, dt.Rows[2]["ORDINAL_POSITION"]); - Assert.Equal("IN", dt.Rows[2]["PARAMETER_MODE"]); - Assert.Equal("INT", dt.Rows[2]["DATA_TYPE"].ToString().ToUpper()); - - Assert.Equal(ts.baseDBName + "0".ToLower(), dt.Rows[3]["SPECIFIC_SCHEMA"].ToString().ToLower()); - Assert.Equal("sptest", dt.Rows[3]["SPECIFIC_NAME"].ToString().ToLower()); - Assert.Equal("--dumb-identifier-3", dt.Rows[3]["PARAMETER_NAME"].ToString().ToLower()); - Assert.Equal(4, dt.Rows[3]["ORDINAL_POSITION"]); - Assert.Equal("IN", dt.Rows[3]["PARAMETER_MODE"]); - Assert.Equal("INT", dt.Rows[3]["DATA_TYPE"].ToString().ToUpper()); - - Assert.Equal(ts.baseDBName + "0".ToLower(), dt.Rows[4]["SPECIFIC_SCHEMA"].ToString().ToLower()); - Assert.Equal("sptest", dt.Rows[4]["SPECIFIC_NAME"].ToString().ToLower()); - Assert.Equal("_client_id", dt.Rows[4]["PARAMETER_NAME"].ToString().ToLower()); - Assert.Equal(5, dt.Rows[4]["ORDINAL_POSITION"]); - Assert.Equal("IN", dt.Rows[4]["PARAMETER_MODE"]); - Assert.Equal("INT", dt.Rows[4]["DATA_TYPE"].ToString().ToUpper()); - - Assert.Equal(ts.baseDBName + "0".ToLower(), dt.Rows[5]["SPECIFIC_SCHEMA"].ToString().ToLower()); - Assert.Equal("sptest", dt.Rows[5]["SPECIFIC_NAME"].ToString().ToLower()); - Assert.Equal("_login_id", dt.Rows[5]["PARAMETER_NAME"].ToString().ToLower()); - Assert.Equal(6, dt.Rows[5]["ORDINAL_POSITION"]); - Assert.Equal("IN", dt.Rows[5]["PARAMETER_MODE"]); - Assert.Equal("INT", dt.Rows[5]["DATA_TYPE"].ToString().ToUpper()); - - Assert.Equal(ts.baseDBName + "0".ToLower(), dt.Rows[6]["SPECIFIC_SCHEMA"].ToString().ToLower()); - Assert.Equal("sptest", dt.Rows[6]["SPECIFIC_NAME"].ToString().ToLower()); - Assert.Equal("_where", dt.Rows[6]["PARAMETER_NAME"].ToString().ToLower()); - Assert.Equal(7, dt.Rows[6]["ORDINAL_POSITION"]); - Assert.Equal("IN", dt.Rows[6]["PARAMETER_MODE"]); - Assert.Equal("VARCHAR", dt.Rows[6]["DATA_TYPE"].ToString().ToUpper()); - Assert.Equal(2000, dt.Rows[6]["CHARACTER_OCTET_LENGTH"]); - - Assert.Equal(ts.baseDBName + "0".ToLower(), dt.Rows[7]["SPECIFIC_SCHEMA"].ToString().ToLower()); - Assert.Equal("sptest", dt.Rows[7]["SPECIFIC_NAME"].ToString().ToLower()); - Assert.Equal("_sort", dt.Rows[7]["PARAMETER_NAME"].ToString().ToLower()); - Assert.Equal(8, dt.Rows[7]["ORDINAL_POSITION"]); - Assert.Equal("IN", dt.Rows[7]["PARAMETER_MODE"]); - Assert.Equal("VARCHAR", dt.Rows[7]["DATA_TYPE"].ToString().ToUpper()); - Assert.Equal(2000, dt.Rows[7]["CHARACTER_OCTET_LENGTH"]); - - Assert.Equal(ts.baseDBName + "0".ToLower(), dt.Rows[8]["SPECIFIC_SCHEMA"].ToString().ToLower()); - Assert.Equal("sptest", dt.Rows[8]["SPECIFIC_NAME"].ToString().ToLower()); - Assert.Equal("_sql", dt.Rows[8]["PARAMETER_NAME"].ToString().ToLower()); - Assert.Equal(9, dt.Rows[8]["ORDINAL_POSITION"]); - Assert.Equal("OUT", dt.Rows[8]["PARAMETER_MODE"]); - Assert.Equal("VARCHAR", dt.Rows[8]["DATA_TYPE"].ToString().ToUpper()); - Assert.Equal(8000, dt.Rows[8]["CHARACTER_OCTET_LENGTH"]); - - Assert.Equal(ts.baseDBName + "0".ToLower(), dt.Rows[9]["SPECIFIC_SCHEMA"].ToString().ToLower()); - Assert.Equal("sptest", dt.Rows[9]["SPECIFIC_NAME"].ToString().ToLower()); - Assert.Equal("_song_id", dt.Rows[9]["PARAMETER_NAME"].ToString().ToLower()); - Assert.Equal(10, dt.Rows[9]["ORDINAL_POSITION"]); - Assert.Equal("IN", dt.Rows[9]["PARAMETER_MODE"]); - Assert.Equal("INT", dt.Rows[9]["DATA_TYPE"].ToString().ToUpper()); - - Assert.Equal(ts.baseDBName + "0".ToLower(), dt.Rows[10]["SPECIFIC_SCHEMA"].ToString().ToLower()); - Assert.Equal("sptest", dt.Rows[10]["SPECIFIC_NAME"].ToString().ToLower()); - Assert.Equal("_notes", dt.Rows[10]["PARAMETER_NAME"].ToString().ToLower()); - Assert.Equal(11, dt.Rows[10]["ORDINAL_POSITION"]); - Assert.Equal("IN", dt.Rows[10]["PARAMETER_MODE"]); - Assert.Equal("VARCHAR", dt.Rows[10]["DATA_TYPE"].ToString().ToUpper()); - Assert.Equal(2000, dt.Rows[10]["CHARACTER_OCTET_LENGTH"]); - - Assert.Equal(ts.baseDBName + "0".ToLower(), dt.Rows[11]["SPECIFIC_SCHEMA"].ToString().ToLower()); - Assert.Equal("sptest", dt.Rows[11]["SPECIFIC_NAME"].ToString().ToLower()); - Assert.Equal("_result", dt.Rows[11]["PARAMETER_NAME"].ToString().ToLower()); - Assert.Equal(12, dt.Rows[11]["ORDINAL_POSITION"]); - Assert.Equal("OUT", dt.Rows[11]["PARAMETER_MODE"]); - Assert.Equal("VARCHAR", dt.Rows[11]["DATA_TYPE"].ToString().ToUpper()); - Assert.Equal(10, dt.Rows[11]["CHARACTER_OCTET_LENGTH"]); - } - - [Fact] - public void ProcedureParameters4() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL(@"CREATE PROCEDURE spTest (name VARCHAR(1200) - CHARACTER /* hello*/ SET utf8) BEGIN SELECT name; END"); - - string[] restrictions = new string[5]; - restrictions[1] = ts.baseDBName + "0"; - restrictions[2] = "spTest"; - DataTable dt = connection.GetSchema("Procedure Parameters", restrictions); - - Assert.True(dt.Rows.Count == 1, "Actual Result " + dt.Rows.Count); - Assert.Equal(ts.baseDBName + "0".ToLower(), dt.Rows[0]["SPECIFIC_SCHEMA"].ToString().ToLower()); - Assert.Equal("sptest", dt.Rows[0]["SPECIFIC_NAME"].ToString().ToLower()); - Assert.Equal("name", dt.Rows[0]["PARAMETER_NAME"].ToString().ToLower()); - Assert.Equal(1, dt.Rows[0]["ORDINAL_POSITION"]); - Assert.Equal("IN", dt.Rows[0]["PARAMETER_MODE"]); - Assert.Equal("VARCHAR", dt.Rows[0]["DATA_TYPE"].ToString().ToUpper()); - Assert.Equal(1200, dt.Rows[0]["CHARACTER_MAXIMUM_LENGTH"]); - if (ts.version.Major >= 6) - Assert.Equal(4800, dt.Rows[0]["CHARACTER_OCTET_LENGTH"]); - else - Assert.Equal(3600, dt.Rows[0]["CHARACTER_OCTET_LENGTH"]); - Assert.Equal("utf8", dt.Rows[0]["CHARACTER_SET_NAME"]); - Assert.Equal("utf8_general_ci", dt.Rows[0]["COLLATION_NAME"]); - } - - [Fact] - public void ProcedureParameters5() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL(@"CREATE PROCEDURE spTest (name VARCHAR(1200) ASCII BINARY, - name2 TEXT UNICODE) BEGIN SELECT name; END"); - - string[] restrictions = new string[5]; - restrictions[1] = ts.baseDBName + "0"; - restrictions[2] = "spTest"; - DataTable dt = connection.GetSchema("Procedure Parameters", restrictions); - - Assert.True(dt.Rows.Count == 2); - Assert.Equal(ts.baseDBName + "0".ToLower(), dt.Rows[0]["SPECIFIC_SCHEMA"].ToString().ToLower()); - Assert.Equal("sptest", dt.Rows[0]["SPECIFIC_NAME"].ToString().ToLower()); - Assert.Equal("name", dt.Rows[0]["PARAMETER_NAME"].ToString().ToLower()); - Assert.Equal(1, dt.Rows[0]["ORDINAL_POSITION"]); - Assert.Equal("IN", dt.Rows[0]["PARAMETER_MODE"]); - Assert.Equal("VARCHAR", dt.Rows[0]["DATA_TYPE"].ToString().ToUpper()); - Assert.Equal("latin1", dt.Rows[0]["CHARACTER_SET_NAME"]); - Assert.Equal(1200, dt.Rows[0]["CHARACTER_OCTET_LENGTH"]); - - Assert.Equal(ts.baseDBName + "0".ToLower(), dt.Rows[1]["SPECIFIC_SCHEMA"].ToString().ToLower()); - Assert.Equal("sptest", dt.Rows[1]["SPECIFIC_NAME"].ToString().ToLower()); - Assert.Equal("name2", dt.Rows[1]["PARAMETER_NAME"].ToString().ToLower()); - Assert.Equal(2, dt.Rows[1]["ORDINAL_POSITION"]); - Assert.Equal("IN", dt.Rows[1]["PARAMETER_MODE"]); - Assert.Equal("TEXT", dt.Rows[1]["DATA_TYPE"].ToString().ToUpper()); - Assert.Equal("ucs2", dt.Rows[1]["CHARACTER_SET_NAME"]); - } - - [Fact] - public void DTD_Identifier() - { - if (ts.version < new Version(5, 0)) return; - - using (var conn = new MySqlConnection(connection.ConnectionString)) - { - conn.Open(); - var cmd = new MySqlCommand(@"CREATE PROCEDURE spTest (id INT UNSIGNED ZEROFILL, - dec1 DECIMAL(10,2), - name VARCHAR(20) /* this is a comment */ CHARACTER SET ascii, - t1 TINYTEXT BINARY, t2 ENUM('a','b','c'), - t3 /* comment */ SET(/* comment */'1','2','3')) - BEGIN SELECT name; END", conn); - cmd.ExecuteNonQuery(); - - string[] restrictions = new string[5]; - restrictions[1] = ts.baseDBName + "0"; - restrictions[2] = "spTest"; - DataTable dt = connection.GetSchema("Procedure Parameters", restrictions); - - Assert.True(dt.Rows.Count == 6, "Actual Result " + dt.Rows.Count); - Assert.Equal("INT(10) UNSIGNED ZEROFILL", - dt.Rows[0]["DTD_IDENTIFIER"].ToString().ToUpper()); - Assert.Equal("DECIMAL(10,2)", - dt.Rows[1]["DTD_IDENTIFIER"].ToString().ToUpper()); - Assert.Equal("VARCHAR(20)", - dt.Rows[2]["DTD_IDENTIFIER"].ToString().ToUpper()); - Assert.Equal("TINYTEXT", - dt.Rows[3]["DTD_IDENTIFIER"].ToString().ToUpper()); - Assert.Equal("ENUM('A','B','C')", - dt.Rows[4]["DTD_IDENTIFIER"].ToString().ToUpper()); - Assert.Equal("SET('1','2','3')", - dt.Rows[5]["DTD_IDENTIFIER"].ToString().ToUpper()); - conn.Close(); - } - } - - /// - /// Bug #48586 Expose defined possible enum values - /// - [Fact] - public void PossibleValues() - { - if (ts.version < new Version(5, 0)) return; - - using (var conn = new MySqlConnection(connection.ConnectionString)) - { - conn.Open(); - var cmd = new MySqlCommand(@"CREATE PROCEDURE spTest (id INT UNSIGNED ZEROFILL, - dec1 DECIMAL(10,2), - name VARCHAR(20) /* this is a comment */ CHARACTER SET ascii, - t1 TINYTEXT BINARY, t2 ENUM('a','b','c'), - t3 /* comment */ SET(/* comment */'1','2','3')) - BEGIN SELECT name; END", conn); - cmd.ExecuteNonQuery(); - cmd = new MySqlCommand("spTest", connection); - cmd.CommandType = CommandType.StoredProcedure; - MySqlCommandBuilder.DeriveParameters(cmd); - Assert.Null(cmd.Parameters["@id"].PossibleValues); - Assert.Null(cmd.Parameters["@dec1"].PossibleValues); - Assert.Null(cmd.Parameters["@name"].PossibleValues); - Assert.Null(cmd.Parameters["@t1"].PossibleValues); - MySqlParameter t2 = cmd.Parameters["@t2"]; - Assert.NotNull(t2.PossibleValues); - Assert.Equal("a", t2.PossibleValues[0]); - Assert.Equal("b", t2.PossibleValues[1]); - Assert.Equal("c", t2.PossibleValues[2]); - MySqlParameter t3 = cmd.Parameters["@t3"]; - Assert.NotNull(t3.PossibleValues); - Assert.Equal("1", t3.PossibleValues[0]); - Assert.Equal("2", t3.PossibleValues[1]); - Assert.Equal("3", t3.PossibleValues[2]); - conn.Close(); - } - } - - /// - /// Bug #62416 IndexOutOfRangeException when using return parameter with no name - /// - [Fact] - public void UnnamedReturnValue() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("DROP FUNCTION IF EXISTS spFunc"); - executeSQL("CREATE FUNCTION spFunc() RETURNS DATETIME BEGIN RETURN NOW(); END"); - MySqlCommand cmd = new MySqlCommand("spFunc", connection); - cmd.CommandType = CommandType.StoredProcedure; - MySqlParameter p1 = new MySqlParameter("", MySqlDbType.DateTime); - p1.Direction = ParameterDirection.ReturnValue; - cmd.Parameters.Add(p1); - cmd.ExecuteNonQuery(); - } - } -} diff --git a/Tests/MySql.Data.Tests/Properties/AssemblyInfo.cs b/Tests/MySql.Data.Tests/Properties/AssemblyInfo.cs deleted file mode 100644 index a7a297c29..000000000 --- a/Tests/MySql.Data.Tests/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Security; - -// -// 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. -// -[assembly: AssemblyTitle("MySql.Data.Tests")] -[assembly: AssemblyDescription("Test fixtures for MySQL Connector/Net")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Oracle")] -[assembly: AssemblyProduct("MySql.Data.Tests")] -[assembly: AssemblyCopyright("Copyright � 2004, 2016, Oracle and/or its affiliates. All rights reserved.")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the project output directory which is -// %Project Directory%\obj\. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// - -[assembly: AssemblyKeyName("ConnectorNet")] -[assembly: AllowPartiallyTrustedCallers] -#if !NETCORE10 -[assembly: SecurityRules(SecurityRuleSet.Level1)] -#endif - -[assembly: InternalsVisibleTo("MySql.Data.MySqlClient, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] -[assembly: InternalsVisibleTo("MySql.Data.Entity.Tests, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] -[assembly: InternalsVisibleTo("MySql.Data.Entity.CodeFirst.Tests, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] -[assembly: InternalsVisibleTo("MySql.Web.Tests, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] -[assembly: InternalsVisibleTo("MySql.Data.Entity.Migrations.Tests, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] -[assembly: InternalsVisibleTo("MySql.Data.Tests.Stress, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] diff --git a/Tests/MySql.Data.Tests/ScriptExecution.cs b/Tests/MySql.Data.Tests/ScriptExecution.cs deleted file mode 100644 index caf2bb5b0..000000000 --- a/Tests/MySql.Data.Tests/ScriptExecution.cs +++ /dev/null @@ -1,302 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading.Tasks; -using Xunit; - -namespace MySql.Data.MySqlClient.Tests -{ - public class ScriptExecution : TestBase - { - protected TestSetup ts; - - public ScriptExecution(TestSetup setup): base(setup, "scriptexectests") - { - ts = setup; - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); - } - - private int statementCount; - private string statementTemplate1 = @"CREATE PROCEDURE `spTest{0}`() NOT DETERMINISTIC - CONTAINS SQL SQL SECURITY DEFINER COMMENT '' - BEGIN - SELECT 1,2,3; - END{1}"; - - private string statementTemplate2 = @"INSERT INTO Test (id, name) VALUES ({0}, 'a "" na;me'){1}"; - - - [Fact] - public void ExecuteScriptWithProcedures() - { - if (ts.version < new Version(5, 0)) return; - - statementCount = 0; - string scriptText = String.Empty; - for (int i = 0; i < 10; i++) - { - scriptText += String.Format(statementTemplate1, i, "$$"); - } - MySqlScript script = new MySqlScript(scriptText); - script.StatementExecuted += new MySqlStatementExecutedEventHandler(ExecuteScriptWithProcedures_QueryExecuted); - script.Connection = connection; - script.Delimiter = "$$"; - int count = script.Execute(); - Assert.Equal(10, count); - - MySqlCommand cmd = new MySqlCommand( - String.Format(@"SELECT COUNT(*) FROM information_schema.routines WHERE - routine_schema = '{0}' AND routine_name LIKE 'spTest%'", - ts.baseDBName + "0"), connection); - Assert.Equal(10, Convert.ToInt32(cmd.ExecuteScalar())); - } - - void ExecuteScriptWithProcedures_QueryExecuted(object sender, MySqlScriptEventArgs e) - { - string stmt = String.Format(statementTemplate1, statementCount++, null); - Assert.Equal(stmt, e.StatementText); - } - - - [Fact] - public void ExecuteScriptWithInserts() - { - statementCount = 0; - string scriptText = String.Empty; - for (int i = 0; i < 10; i++) - { - scriptText += String.Format(statementTemplate2, i, ";"); - } - MySqlScript script = new MySqlScript(scriptText); - script.Connection = connection; - script.StatementExecuted += new MySqlStatementExecutedEventHandler(ExecuteScriptWithInserts_StatementExecuted); - int count = script.Execute(); - Assert.Equal(10, count); - - MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM Test", connection); - Assert.Equal(10, Convert.ToInt32(cmd.ExecuteScalar())); - } - - void ExecuteScriptWithInserts_StatementExecuted(object sender, MySqlScriptEventArgs e) - { - string stmt = String.Format(statementTemplate2, statementCount++, null); - Assert.Equal(stmt, e.StatementText); - } - - [Fact] - public void ExecuteScriptContinueOnError() - { - statementCount = 0; - string scriptText = String.Empty; - for (int i = 0; i < 5; i++) - scriptText += String.Format(statementTemplate2, i, ";"); - scriptText += "bogus statement;"; - for (int i = 5; i < 10; i++) - scriptText += String.Format(statementTemplate2, i, ";"); - MySqlScript script = new MySqlScript(scriptText); - script.Connection = connection; - script.Error += new MySqlScriptErrorEventHandler(ExecuteScript_ContinueOnError); - int count = script.Execute(); - Assert.Equal((int)10, count); - Assert.Equal((int)1, statementCount); - - MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM Test", connection); - Assert.Equal(10, Convert.ToInt32(cmd.ExecuteScalar())); - } - - void ExecuteScript_ContinueOnError(object sender, MySqlScriptErrorEventArgs args) - { - args.Ignore = true; - statementCount++; - } - - [Fact] - public void ExecuteScriptNotContinueOnError() - { - statementCount = 0; - string scriptText = String.Empty; - for (int i = 0; i < 5; i++) - scriptText += String.Format(statementTemplate2, i, ";"); - scriptText += "bogus statement;"; - for (int i = 5; i < 10; i++) - scriptText += String.Format(statementTemplate2, i, ";"); - MySqlScript script = new MySqlScript(scriptText); - script.Connection = connection; - script.Error += new MySqlScriptErrorEventHandler(ExecuteScript_NotContinueOnError); - int count = script.Execute(); - Assert.Equal(5, count); - Assert.Equal(1, statementCount); - - MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM Test", connection); - Assert.Equal(5, Convert.ToInt32(cmd.ExecuteScalar())); - } - - void ExecuteScript_NotContinueOnError(object sender, MySqlScriptErrorEventArgs args) - { - args.Ignore = false; - statementCount++; - } - - [Fact] - public void ExecuteScriptWithUserVariables() - { - string connStr = connection.ConnectionString.ToLowerInvariant(); - connStr = connStr.Replace("allow user variables=true", - "allow user variables=false"); - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - string scriptText = "SET @myvar = 1"; - MySqlScript script = new MySqlScript(scriptText); - script.Connection = c; - int count = script.Execute(); - Assert.Equal(1, count); - } - } - - /// - /// Bug #46429 use DELIMITER command in MySql.Data.MySqlClient.MySqlScript - /// - [Fact] - public void ScriptWithDelimiterStatements() - { - if (ts.version < new Version(5, 0)) return; - - StringBuilder sql = new StringBuilder(); - - sql.AppendFormat("{0}DELIMITER $${0}", Environment.NewLine); - sql.AppendFormat(statementTemplate1, 1, "$$"); - sql.AppendFormat("{0}DELIMITER //{0}", Environment.NewLine); - sql.AppendFormat(statementTemplate1, 2, "//"); - - MySqlScript s = new MySqlScript(); - s.Query = sql.ToString(); - s.Delimiter = "XX"; - s.Connection = connection; - int count = s.Execute(); - } - - /// - /// Bug #46429 use DELIMITER command in MySql.Data.MySqlClient.MySqlScript - /// - [Fact] - public void DelimiterInScriptV2() - { - StringBuilder sql = new StringBuilder(); - - sql.AppendLine("DELIMITER MySuperDelimiter"); - sql.AppendLine("CREATE PROCEDURE TestProcedure1()"); - sql.AppendLine("BEGIN"); - sql.AppendLine(" SELECT * FROM mysql.proc;"); - sql.AppendLine("END MySuperDelimiter"); - sql.AppendLine("CREATE PROCEDURE TestProcedure2()"); - sql.AppendLine("BEGIN"); - sql.AppendLine(" SELECT * FROM mysql.proc;"); - sql.AppendLine("END mysuperdelimiter"); - - sql.AppendLine("DELIMITER ;"); - - MySqlScript script = new MySqlScript(connection, sql.ToString()); - script.Execute(); - } - - - /// - /// Bug #50344 MySqlScript.Execute() throws InvalidOperationException - /// - [Fact] - public void EmptyLastLineWithScriptExecute() - { - StringBuilder sb = new StringBuilder(); - sb.AppendLine("DROP FUNCTION IF EXISTS `BlaBla`;"); - sb.AppendLine("DELIMITER ;;"); - MySqlScript script = new MySqlScript(connection, sb.ToString()); - // InvalidOperationException : The CommandText property has not been properly initialized. - script.Execute(); - } - - [Fact] - public void DelimiterCommandDoesNotThrow() - { - MySqlScript script = new MySqlScript(connection, "DELIMITER ;"); - script.Execute(); - } - - #region Async - [Fact] - public async Task ExecuteScriptWithProceduresAsync() - { - if (ts.version < new Version(5, 0)) return; - string spTpl = @"CREATE PROCEDURE `SEScriptWithProceduresAsyncSpTest{0}`() NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER COMMENT '' BEGIN SELECT 1,2,3; END{1}"; - statementCount = 0; - string scriptText = String.Empty; - for (int i = 0; i < 10; i++) - { - scriptText += String.Format(spTpl, i, "$$"); - } - MySqlScript script = new MySqlScript(scriptText); - script.StatementExecuted += new MySqlStatementExecutedEventHandler(delegate(object sender, MySqlScriptEventArgs e) - { - string stmt = String.Format(spTpl, statementCount++, null); - Assert.Equal(stmt, e.StatementText); - }); - script.Connection = connection; - script.Delimiter = "$$"; - int count = await script.ExecuteAsync(); - Assert.Equal(10, count); - - MySqlCommand cmd = new MySqlCommand( - String.Format(@"SELECT COUNT(*) FROM information_schema.routines WHERE routine_schema = '{0}' AND routine_name LIKE 'SEScriptWithProceduresAsyncSpTest%'", ts.baseDBName + "0"), connection); - Assert.Equal(10, Convert.ToInt32(cmd.ExecuteScalar())); - } - - [Fact] - public async Task ExecuteScriptWithInsertsAsync() - { - executeSQL("CREATE TABLE SEScriptWithInsertsAsyncTest (id int, name varchar(50))"); - string queryTpl = @"INSERT INTO SEScriptWithInsertsAsyncTest (id, name) VALUES ({0}, 'a "" na;me'){1}"; - statementCount = 0; - string scriptText = String.Empty; - for (int i = 0; i < 10; i++) - { - scriptText += String.Format(queryTpl, i, ";"); - } - MySqlScript script = new MySqlScript(scriptText); - script.Connection = connection; - script.StatementExecuted += new MySqlStatementExecutedEventHandler(delegate(object sender, MySqlScriptEventArgs e) - { - string stmt = String.Format(queryTpl, statementCount++, null); - Assert.Equal(stmt, e.StatementText); - }); - int count = await script.ExecuteAsync(); - Assert.Equal(10, count); - - MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM SEScriptWithInsertsAsyncTest", connection); - Assert.Equal(10, Convert.ToInt32(cmd.ExecuteScalar())); - } - #endregion - } -} diff --git a/Tests/MySql.Data.Tests/SimpleTransactions.cs b/Tests/MySql.Data.Tests/SimpleTransactions.cs deleted file mode 100644 index 793b2460a..000000000 --- a/Tests/MySql.Data.Tests/SimpleTransactions.cs +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Data; -using System.Reflection; - -namespace MySql.Data.MySqlClient.Tests -{ - public class SimpleTransactions : TestBase - { - - protected TestSetup ts; - - public SimpleTransactions(TestSetup setup) : base(setup, "simpletrantests") - { - ts = setup; - } - - - [Fact] - public void TestReader() - { - executeSQL("CREATE TABLE Test (key2 VARCHAR(1), name VARCHAR(100), name2 VARCHAR(100))"); - executeSQL("INSERT INTO Test VALUES('P', 'Test1', 'Test2')"); - - MySqlTransaction txn = connection.BeginTransaction(); - MySqlConnection c = txn.Connection; - Assert.Equal(connection, c); - MySqlCommand cmd = new MySqlCommand("SELECT name, name2 FROM Test WHERE key2='P'", - connection, txn); - MySqlTransaction t2 = cmd.Transaction; - Assert.Equal(txn, t2); - MySqlDataReader reader = null; - try - { - reader = cmd.ExecuteReader(); - reader.Close(); - txn.Commit(); - } - catch (Exception ex) - { - Assert.False(ex.Message != string.Empty, ex.Message); - txn.Rollback(); - } - finally - { - if (reader != null) reader.Close(); - } - } - - /// - /// Bug #22400 Nested transactions - /// - [Fact] - public void NestedTransactions() - { - MySqlTransaction t1 = connection.BeginTransaction(); - //try - //{ - Exception ex = Assert.Throws(() => { connection.BeginTransaction(); }); - Assert.Equal(ex.Message, "Nested transactions are not supported."); - ////Assert.Fail("Exception should have been thrown"); - //t2.Rollback(); - //} - //catch (InvalidOperationException) - //{ - //} - //finally - //{ - t1.Rollback(); - //} - } - - [Fact] - public void BeginTransactionOnPreviouslyOpenConnection() - { - string connStr = connection.ConnectionString; - MySqlConnection c = new MySqlConnection(connStr); - c.Open(); - c.Close(); - try - { - c.BeginTransaction(); - } - catch (Exception ex) - { - Assert.Equal("The connection is not open.", ex.Message); - } - } - - /// - /// Bug #37991 Connection fails when trying to close after a commit while network to db is bad - /// This test is not a perfect test of this bug as the kill connection is not quite the - /// same as unplugging the network but it's the best I've figured out so far - /// - [Fact(Skip="Temporary Skip")] - public void CommitAfterConnectionDead() - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test(id INT, name VARCHAR(20))"); - - string connStr = connection.ConnectionString + ";pooling=false"; - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - MySqlTransaction trans = c.BeginTransaction(); - - using (MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (1, 'boo')", c)) - { - cmd.ExecuteNonQuery(); - } - ts.KillConnection(c); - //try - //{ - Exception ex = Assert.Throws(() => trans.Commit()); - Assert.Equal(ex.Message, "Connection must be valid and open to commit transaction"); - //} - //catch (Exception) - //{ - //} - Assert.Equal(ConnectionState.Closed, c.State); - c.Close(); // this should work even though we are closed - } - } - - /// - /// Bug #39817 Transaction Dispose does not roll back - /// - [Fact] - public void DisposingCallsRollback() - { - executeSQL("CREATE TABLE Test (key2 VARCHAR(1), name VARCHAR(100), name2 VARCHAR(100))"); - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES ('a', 'b', 'c')", connection); - MySqlTransaction txn = connection.BeginTransaction(); - using (txn) - { - cmd.ExecuteNonQuery(); - } - // the txn should be closed now as a rollback should have happened. - Type t = txn.GetType(); - FieldInfo fi = t.GetField("open", BindingFlags.Instance | BindingFlags.NonPublic); - bool isOpen = (bool)fi.GetValue(txn); - Assert.False(isOpen); - } - - } -} diff --git a/Tests/MySql.Data.Tests/SqlServerMode.cs b/Tests/MySql.Data.Tests/SqlServerMode.cs deleted file mode 100644 index 1612f3748..000000000 --- a/Tests/MySql.Data.Tests/SqlServerMode.cs +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Data; - -namespace MySql.Data.MySqlClient.Tests -{ - public class SqlServerMode : TestBase - { - public SqlServerMode(TestSetup setup) : base(setup, "boo") - { - } - - protected override void Init() - { - base.Init(); - Setup.Settings.SqlServerMode = true; - } - - [Fact] - public void Simple() - { - executeSQL("CREATE TABLE Test (id INT, name VARCHAR(20))"); - executeSQL("INSERT INTO Test VALUES (1, 'A')"); - - MySqlCommand cmd = new MySqlCommand("SELECT [id], [name] FROM [Test]", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - Assert.Equal(1, reader.GetInt32(0)); - Assert.Equal("A", reader.GetString(1)); - } - } - - } -} diff --git a/Tests/MySql.Data.Tests/SqlTokenizer.cs b/Tests/MySql.Data.Tests/SqlTokenizer.cs deleted file mode 100644 index 589db9a43..000000000 --- a/Tests/MySql.Data.Tests/SqlTokenizer.cs +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System.Reflection; -using System.Collections.Generic; - -namespace MySql.Data.MySqlClient.Tests -{ - public class SqlTokenizer - { - object tokenizer; - - public SqlTokenizer(string sql) - { - Assembly a = Assembly.Load("MySql.Data"); - tokenizer = a.CreateInstance("MySql.Data.Common.MySqlTokenizer", - false, System.Reflection.BindingFlags.CreateInstance, null, - new object[] { sql }, null, null); - } - - public bool ReturnComments - { - set - { - PropertyInfo pi = tokenizer.GetType().GetProperty("ReturnComments"); - pi.SetValue(tokenizer, value, null); - } - } - - public bool AnsiQuotes - { - set - { - PropertyInfo pi = tokenizer.GetType().GetProperty("AnsiQuotes"); - pi.SetValue(tokenizer, value, null); - } - } - - public bool SqlServerMode - { - set - { - PropertyInfo pi = tokenizer.GetType().GetProperty("SqlServerMode"); - pi.SetValue(tokenizer, value, null); - } - } - - public bool Quoted - { - get - { - PropertyInfo pi = tokenizer.GetType().GetProperty("Quoted"); - return (bool)pi.GetValue(tokenizer, null); - } - } - - public string NextToken() - { - return (string)tokenizer.GetType().InvokeMember("NextToken", - System.Reflection.BindingFlags.InvokeMethod, - null, tokenizer, null); - } - - public string NextParameter() - { - return (string)tokenizer.GetType().InvokeMember("NextParameter", - System.Reflection.BindingFlags.InvokeMethod, - null, tokenizer, null); - } - } -} diff --git a/Tests/MySql.Data.Tests/StoredProcedure.cs b/Tests/MySql.Data.Tests/StoredProcedure.cs deleted file mode 100644 index d82a4a217..000000000 --- a/Tests/MySql.Data.Tests/StoredProcedure.cs +++ /dev/null @@ -1,971 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Data; -using System.Globalization; -using System.Threading; -#if !NETCORE10 -using System.Data.Common; -#endif - -namespace MySql.Data.MySqlClient.Tests -{ - public class StoredProcedure : TestBase - { - - private static string fillError = null; - protected TestSetup ts; - - public StoredProcedure(TestSetup setup): base(setup, "storedproctests") - { - ts = setup; - } - - /// - /// Bug #7623 Adding MySqlParameter causes error if MySqlDbType is Decimal - /// - [Fact] - public void ReturningResultset() - { - if (ts.version < new Version(5, 0)) return; - - // create our procedure - executeSQL("CREATE PROCEDURE spTest(val decimal(10,3)) begin select val; end"); - - using (MySqlCommand cmd = new MySqlCommand("spTest", connection)) - { - cmd.CommandType = CommandType.StoredProcedure; - - MySqlParameter p = cmd.Parameters.Add("?val", MySqlDbType.Decimal); - p.Precision = 10; - p.Scale = 3; - p.Value = 21; - - decimal id = (decimal)cmd.ExecuteScalar(); - Assert.Equal(21, id); - } - } - - [Fact] - public void NonQuery() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE TABLE Test(id INT, name VARCHAR(20))"); - executeSQL(@"CREATE PROCEDURE spTest(IN value INT) - BEGIN INSERT INTO Test VALUES(value, 'Test'); END"); - - //setup testing data - MySqlCommand cmd = new MySqlCommand("spTest", connection); - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.AddWithValue("?value", 2); - int rowsAffected = cmd.ExecuteNonQuery(); - Assert.Equal(1, rowsAffected); - - cmd.CommandText = "SELECT * FROM Test"; - cmd.CommandType = CommandType.Text; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.Read()); - Assert.Equal(2, reader.GetInt32(0)); - Assert.Equal("Test", reader.GetString(1)); - Assert.False(reader.Read()); - Assert.False(reader.NextResult()); - } - } - - [Fact] - public void NoBatch() - { - if (ts.version < new Version(5, 0)) return; - - //try - //{ - MySqlCommand cmd = new MySqlCommand("spTest;select * from Test", connection); - cmd.CommandType = CommandType.StoredProcedure; - Exception ex = Assert.Throws(() => cmd.ExecuteNonQuery()); - // Assert.Fail("Should have thrown an exception"); - //} - //catch (Exception) - //{ - //} - } - - [Fact] - public void WrongParameters() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE PROCEDURE spTest(p1 INT) BEGIN SELECT 1; END"); - try - { - MySqlCommand cmd = new MySqlCommand("spTest", connection); - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.AddWithValue("?p2", 1); - Exception ex = Assert.Throws(() =>cmd.ExecuteNonQuery()); - //Assert.Fail("Should have thrown an exception"); - } - catch (Exception) - { - } - } - - [Fact] - public void NoInOutMarker() - { - if (ts.version < new Version(5, 0)) return; - - // create our procedure - executeSQL("CREATE PROCEDURE spTest( valin varchar(50) ) BEGIN SELECT valin; END"); - - MySqlCommand cmd = new MySqlCommand("spTest", connection); - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.AddWithValue("?valin", "myvalue"); - object val = cmd.ExecuteScalar(); - Assert.Equal("myvalue", val); - } - - [Fact] - public void NoSPOnPre50() - { - if (ts.version < new Version(5, 0)) return; - - //try - //{ - MySqlCommand cmd = new MySqlCommand("spTest", connection); - cmd.CommandType = CommandType.StoredProcedure; - Exception ex = Assert.Throws(() => cmd.ExecuteNonQuery()); - //Assert.Fail("This should not have worked"); - //} - //catch (Exception) - //{ - //} - } - - /// - /// Bug #13590 ExecuteScalar returns only Int64 regardless of actual SQL type - /// - [Fact] - public void ExecuteScalar2() - { - if (ts.version < new Version(5, 0)) return; - - // create our procedure - executeSQL("CREATE PROCEDURE spTest() " + - "BEGIN DECLARE myVar1 INT; SET myVar1 := 1; SELECT myVar1; END"); - - MySqlCommand cmd = new MySqlCommand("spTest", connection); - cmd.CommandType = CommandType.StoredProcedure; - object result = cmd.ExecuteScalar(); - Assert.Equal(1, result); - Assert.True(result is Int32); - } - - [Fact] - public void MultipleResultsets() - { - if (ts.version < new Version(5, 0)) return; - - MultipleResultsetsImpl(false); - } - - [Fact] - public void MultipleResultsetsPrepared() - { - if (ts.version < new Version(5, 0)) return; - - MultipleResultsetsImpl(true); - } - - private void MultipleResultsetsImpl(bool prepare) - { - if (ts.version < new Version(5, 0)) return; - - // create our procedure - executeSQL("CREATE PROCEDURE spTest() " + - "BEGIN SELECT 1; SELECT 2; END"); - - MySqlCommand cmd = new MySqlCommand("spTest", connection); - if (prepare) cmd.Prepare(); - cmd.CommandType = CommandType.StoredProcedure; - MySqlDataReader reader = cmd.ExecuteReader(); - Assert.Equal(true, reader.Read()); - Assert.Equal(true, reader.NextResult()); - Assert.Equal(true, reader.Read()); - Assert.Equal(false, reader.NextResult()); - Assert.Equal(false, reader.Read()); - reader.Close(); - -#if !NETCORE10 - DataSet ds = new DataSet(); - MySqlCommand cmd2 = new MySqlCommand("spTest", connection); - cmd2.CommandType = CommandType.StoredProcedure; - MySqlDataAdapter da = new MySqlDataAdapter(cmd2); - da.FillError += new FillErrorEventHandler(da_FillError); - fillError = null; - da.Fill(ds); - Assert.Equal(2, ds.Tables.Count); - Assert.Equal(1, Convert.ToInt32(ds.Tables[0].Rows.Count)); - Assert.Equal(1, Convert.ToInt32(ds.Tables[1].Rows.Count)); - Assert.Equal(1, Convert.ToInt32(ds.Tables[0].Rows[0][0])); - Assert.Equal(2, Convert.ToInt32(ds.Tables[1].Rows[0][0])); - Assert.Null(fillError); -#endif - } - -#if !NETCORE10 - private static void da_FillError(object sender, FillErrorEventArgs e) - { - fillError = e.Errors.Message; - e.Continue = true; - } -#endif - - [Fact] - public void ExecuteWithCreate() - { - if (ts.version < new Version(5, 0)) return; - - // create our procedure - string sql = "CREATE PROCEDURE spTest(IN var INT) BEGIN SELECT var; END; call spTest(?v)"; - - MySqlCommand cmd = new MySqlCommand(sql, connection); - cmd.Parameters.Add(new MySqlParameter("?v", 33)); - object val = cmd.ExecuteScalar(); - Assert.Equal(33, val); - } - - /// - /// Bug #9722 Connector does not recognize parameters separated by a linefeed - /// - [Fact] - public void OtherProcSigs() - { - if (ts.version < new Version(5, 0)) return; - - // create our procedure - executeSQL("CREATE PROCEDURE spTest(IN \r\nvalin DECIMAL(10,2),\nIN val2 INT) " + - "SQL SECURITY INVOKER BEGIN SELECT valin; END"); - - MySqlCommand cmd = new MySqlCommand("spTest", connection); - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.AddWithValue("?valin", 20.4); - cmd.Parameters.AddWithValue("?val2", 4); - decimal val = (decimal)cmd.ExecuteScalar(); - Decimal d = new Decimal(20.4); - Assert.Equal(d, val); - - // create our second procedure - executeSQL("DROP PROCEDURE IF EXISTS spTest"); - executeSQL("CREATE PROCEDURE spTest( \r\n) BEGIN SELECT 4; END"); - cmd.Parameters.Clear(); - object val1 = cmd.ExecuteScalar(); - Assert.Equal(4, Convert.ToInt32(val1)); - } - - /// - /// Bug #11450 Connector/Net, current database and stored procedures - /// - [Fact] - public void NoDefaultDatabase() - { - if (ts.version < new Version(5, 0)) return; - - // create our procedure - executeSQL("CREATE PROCEDURE spTest() BEGIN SELECT 4; END"); - executeSQL("CREATE DATABASE `" + ts.baseDBName + "1`;"); - - string newConnStr = connection.ConnectionString; - using (MySqlConnection c = new MySqlConnection(newConnStr)) - { - c.Open(); - MySqlCommand cmd2 = new MySqlCommand(String.Format("use `{0}`", ts.baseDBName + "0"), c); - cmd2.ExecuteNonQuery(); - - MySqlCommand cmd = new MySqlCommand("spTest", c); - cmd.CommandType = CommandType.StoredProcedure; - object val = cmd.ExecuteScalar(); - Assert.Equal(4, Convert.ToInt32(val)); - - cmd2.CommandText = String.Format("use `{0}`", ts.baseDBName + "1"); - cmd2.ExecuteNonQuery(); - - cmd.CommandText = String.Format("`{0}`.spTest", ts.baseDBName + "0"); - val = cmd.ExecuteScalar(); - Assert.Equal(4, Convert.ToInt32(val)); - } - } - - /// - /// Bug #13590 ExecuteScalar returns only Int64 regardless of actual SQL type - /// - /* [Fact] - public void TestSelectingInts() - { - executeSQL("CREATE PROCEDURE spTest() BEGIN DECLARE myVar INT; " + - "SET MyVar := 1; SELECT CAST(myVar as SIGNED); END"); - - MySqlCommand cmd = new MySqlCommand("spTest", connection); - cmd.CommandType = CommandType.StoredProcedure; - object val = cmd.ExecuteScalar(); - Assert.Equal(1, val, "Checking value"); - Assert.True(val is Int32, "Checking type"); - } - */ - - /// - /// Bug #11386 Numeric parameters with Precision and Scale not taken into account by Connector - /// - [Fact] - public void DecimalAsParameter() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE PROCEDURE spTest(IN d DECIMAL(19,4)) BEGIN SELECT d; END"); - - MySqlCommand cmd = new MySqlCommand("spTest", connection); - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.AddWithValue("?d", 21); - decimal d = (decimal)cmd.ExecuteScalar(); - Assert.Equal(21, d); - } - - /// - /// Bug #6902 Errors in parsing stored procedure parameters - /// - [Fact] - public void ParmWithCharacterSet() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE PROCEDURE spTest(P longtext character set utf8) " + - "BEGIN SELECT P; END"); - - MySqlCommand cmd = new MySqlCommand("spTest", connection); - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.AddWithValue("?P", "This is my value"); - string p = (string)cmd.ExecuteScalar(); - Assert.Equal("This is my value", p); - } - - /// - /// Bug #13753 Exception calling stored procedure with special characters in parameters - /// - [Fact] - public void SpecialCharacters() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("SET sql_mode=ANSI_QUOTES"); - try - { - executeSQL("CREATE PROCEDURE spTest(\"@Param1\" text) BEGIN SELECT \"@Param1\"; END"); - - MySqlCommand cmd = new MySqlCommand("spTest", connection); - cmd.Parameters.AddWithValue("@Param1", "This is my value"); - cmd.CommandType = CommandType.StoredProcedure; - - string val = (string)cmd.ExecuteScalar(); - Assert.Equal("This is my value", val); - } - finally - { - executeSQL("SET sql_mode=\"\""); - } - } - - [Fact] - public void CallingSPWithPrepare() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE PROCEDURE spTest(P int) BEGIN SELECT P; END"); - - MySqlCommand cmd = new MySqlCommand("spTest", connection); - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.AddWithValue("?P", 33); - cmd.Prepare(); - - int p = (int)cmd.ExecuteScalar(); - Assert.Equal(33, p); - } - - /// - /// Bug #13927 Multiple Records to same Table in Transaction Problem - /// - [Fact] - public void MultipleRecords() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE TABLE Test (id INT, name VARCHAR(20))"); - executeSQL("CREATE PROCEDURE spTest(id int, str VARCHAR(45)) " + - "BEGIN INSERT INTO Test VALUES(id, str); END"); - - MySqlCommand cmd = new MySqlCommand("spTest", connection); - cmd.CommandType = CommandType.StoredProcedure; - - cmd.Parameters.AddWithValue("?id", 1); - cmd.Parameters.AddWithValue("?str", "First record"); - cmd.ExecuteNonQuery(); - - cmd.Parameters.Clear(); - cmd.Parameters.AddWithValue("?id", 2); - cmd.Parameters.AddWithValue("?str", "Second record"); - cmd.ExecuteNonQuery(); - -#if NETCORE10 - MySqlCommand cmdSelect = new MySqlCommand("SELECT * FROM Test", connection); - using (MySqlDataReader dr = cmdSelect.ExecuteReader()) - { - Assert.True(dr.Read()); - Assert.Equal(1, dr.GetInt32("id")); - Assert.Equal("First record", dr.GetString("name")); - - Assert.True(dr.Read()); - Assert.Equal(2, dr.GetInt32("id")); - Assert.Equal("Second record", dr.GetString("name")); - } -#else - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - DataTable dt = new DataTable(); - da.Fill(dt); - - Assert.Equal(1, dt.Rows[0]["id"]); - Assert.Equal(2, dt.Rows[1]["id"]); - Assert.Equal("First record", dt.Rows[0]["name"]); - Assert.Equal("Second record", dt.Rows[1]["name"]); -#endif - } - - /// - /// Bug #16788 Only byte arrays and strings can be serialized by MySqlBinary - /// - [Fact] - public void Bug16788() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE TABLE Test (id integer(9), state varchar(2))"); - executeSQL("CREATE PROCEDURE spTest(IN p1 integer(9), IN p2 varchar(2)) " + - "BEGIN " + - "INSERT INTO Test (id, state) VALUES (p1, p2); " + - "END"); - - MySqlCommand cmd = connection.CreateCommand(); - cmd.CommandType = CommandType.StoredProcedure; - cmd.CommandText = "spTest"; - cmd.Parameters.Add("?p1", MySqlDbType.UInt16, 9); - cmd.Parameters["?p1"].Value = 44; - cmd.Parameters.Add("?p2", MySqlDbType.VarChar, 2); - cmd.Parameters["?p2"].Value = "ss"; - cmd.ExecuteNonQuery(); - } - -#if !NETCORE10 - //[Explicit] - [Fact] - public void ProcedureCache() - { - if (ts.version < new Version(5, 0)) return; - - // open a new connection using a procedure cache - string connStr = connection.ConnectionString; - connStr += ";procedure cache size=25;logging=true"; - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - - // install our custom trace listener - GenericListener myListener = new GenericListener(); - System.Diagnostics.Trace.Listeners.Add(myListener); - - for (int x = 0; x < 10; x++) - { - executeSQL("CREATE PROCEDURE spTest" + x + "() BEGIN SELECT 1; END"); - MySqlCommand cmd = new MySqlCommand("spTest" + x, c); - cmd.CommandType = CommandType.StoredProcedure; - for (int y = 0; y < 20; y++) - { - cmd.ExecuteNonQuery(); - } - } - - // remove our custom trace listener - System.Diagnostics.Trace.Listeners.Remove(myListener); - - // now see how many times our listener recorded a cache hit - Assert.Equal(190, myListener.Find("from procedure cache")); - Assert.Equal(10, myListener.Find("from server")); - } - } -#endif - - /// - /// Bug #20581 Null Reference Exception when closing reader after stored procedure. - /// - [Fact] - public void Bug20581() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE PROCEDURE spTest(p int) BEGIN SELECT p; END"); - MySqlParameter param1; - MySqlCommand command = new MySqlCommand("spTest", connection); - command.CommandType = CommandType.StoredProcedure; - - param1 = command.Parameters.Add("?p", MySqlDbType.Int32); - param1.Value = 3; - - command.Prepare(); - using (MySqlDataReader reader = command.ExecuteReader()) - { - reader.Read(); - } - } - - /// - /// Bug #17046 Null pointer access when stored procedure is used - /// - [Fact] - public void PreparedReader() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE TABLE Test (id int(10) unsigned NOT NULL default '0', " + - "val int(10) unsigned default NULL, PRIMARY KEY (id)) " + - "ENGINE=InnoDB DEFAULT CHARSET=utf8"); - executeSQL("CREATE PROCEDURE spTest (IN pp INTEGER) " + - "select * from Test where id > pp "); - - MySqlCommand c = new MySqlCommand("spTest", connection); - c.CommandType = CommandType.StoredProcedure; -#if NETCORE10 - MySqlParameter p = c.CreateParameter(); -#else - IDataParameter p = c.CreateParameter(); -#endif - p.ParameterName = "?pp"; - p.Value = 10; - c.Parameters.Add(p); - c.Prepare(); - using (MySqlDataReader reader = c.ExecuteReader()) - { - while (reader.Read()) - { - - } - } - } - -#if !NETCORE10 - - /// - /// Bug #22452 MySql.Data.MySqlClient.MySqlException: - /// - [Fact] - public void TurkishStoredProcs() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE PROCEDURE spTest(IN p_paramname INT) BEGIN SELECT p_paramname; END"); - CultureInfo uiCulture = Thread.CurrentThread.CurrentUICulture; - CultureInfo culture = Thread.CurrentThread.CurrentCulture; - Thread.CurrentThread.CurrentCulture = new CultureInfo("tr-TR"); - Thread.CurrentThread.CurrentUICulture = new CultureInfo("tr-TR"); - - try - { - MySqlCommand cmd = new MySqlCommand("spTest", connection); - cmd.Parameters.AddWithValue("?p_paramname", 2); - cmd.CommandType = CommandType.StoredProcedure; - cmd.ExecuteScalar(); - } - finally - { - Thread.CurrentThread.CurrentCulture = culture; - Thread.CurrentThread.CurrentUICulture = uiCulture; - } - } - -#endif - - /// - /// Bug #23268 System.FormatException when invoking procedure with ENUM input parameter - /// - [Fact] - public void ProcEnumParamTest() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE TABLE Test(str VARCHAR(50), e ENUM ('P','R','F','E'), i INT(6))"); - executeSQL("CREATE PROCEDURE spTest(IN p_enum ENUM('P','R','F','E')) BEGIN " + - "INSERT INTO Test (str, e, i) VALUES (null, p_enum, 55); END"); - - MySqlCommand cmd = new MySqlCommand("spTest", connection); - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.AddWithValue("?p_enum", "P"); - cmd.Parameters["?p_enum"].Direction = ParameterDirection.Input; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - } - cmd.CommandText = "SELECT e FROM Test"; - cmd.CommandType = CommandType.Text; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - Assert.Equal("P", reader.GetString(0)); - } - } - -#if !NETCORE10 - /// - /// Bug #25609 MySqlDataAdapter.FillSchema - /// - [Fact] - public void GetSchema() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE PROCEDURE spTest() BEGIN SELECT * FROM Test; END"); - executeSQL(@"CREATE TABLE Test(id INT AUTO_INCREMENT, name VARCHAR(20), PRIMARY KEY (id)) "); - - MySqlCommand cmd = new MySqlCommand("spTest", connection); - cmd.CommandType = CommandType.StoredProcedure; - - MySqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly); - reader.Read(); - reader.Close(); - - MySqlDataAdapter da = new MySqlDataAdapter(cmd); - DataTable schema = new DataTable(); - da.FillSchema(schema, SchemaType.Source); - Assert.Equal(2, schema.Columns.Count); - } -#endif - - /// - /// Bug #26139 MySqlCommand.LastInsertedId doesn't work for stored procedures - /// Currently this is borked on the server so we are marking this as notworking - /// until the server has this fixed. - /// - /* [Fact] - public void LastInsertId() - { - executeSQL("CREATE TABLE Test (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(200))"); - executeSQL("INSERT INTO Test VALUES (NULL, 'Test1')"); - executeSQL("CREATE PROCEDURE spTest() BEGIN " + - "INSERT INTO Test VALUES (NULL, 'test'); END"); - - MySqlCommand cmd = new MySqlCommand("spTest", connection); - cmd.CommandType = CommandType.StoredProcedure; - cmd.ExecuteNonQuery(); - Assert.Equal(2, cmd.LastInsertedId); - } - */ - - /// - /// Bug #27093 Exception when using large values in IN UInt64 parameters - /// - [Fact] - public void UsingUInt64AsParam() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL(@"CREATE TABLE Test(f1 bigint(20) unsigned NOT NULL, - PRIMARY KEY(f1)) ENGINE=InnoDB DEFAULT CHARSET=utf8"); - - executeSQL(@"CREATE PROCEDURE spTest(in _val bigint unsigned) - BEGIN insert into Test set f1=_val; END"); - -#if NETCORE10 - MySqlCommand cmd = new MySqlCommand(); - MySqlParameter param = cmd.CreateParameter(); - param.MySqlDbType = MySqlDbType.UInt64; -#else - DbCommand cmd = new MySqlCommand(); - DbParameter param = cmd.CreateParameter(); - param.DbType = DbType.UInt64; -#endif - cmd.Connection = connection; - cmd.CommandType = CommandType.StoredProcedure; - cmd.CommandText = "spTest"; - param.Direction = ParameterDirection.Input; - param.ParameterName = "?_val"; - ulong bigval = long.MaxValue; - bigval += 1000; - param.Value = bigval; - cmd.Parameters.Add(param); - cmd.ExecuteNonQuery(); - } - - /// - /// Bug #29526 syntax error: "show create procedure" with catalog names containing hyphens - /// - [Fact] - public void CatalogWithHyphens() - { - if (ts.version < new Version(5, 0)) return; - - // make sure this test is valid - Assert.True((ts.baseDBName + "0").IndexOf('-') != -1); - - MySqlCommand cmd = new MySqlCommand("CREATE PROCEDURE spTest() BEGIN SELECT 1; END", connection); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "spTest"; - cmd.CommandType = CommandType.StoredProcedure; - Assert.Equal(1, Convert.ToInt32(cmd.ExecuteScalar())); - } - - [Fact] - public void ComplexDefinition() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL(@"CREATE PROCEDURE `spTest`() NOT DETERMINISTIC - CONTAINS SQL SQL SECURITY DEFINER COMMENT '' - BEGIN - SELECT 1,2,3; - END"); - MySqlCommand command = new MySqlCommand("spTest", connection); - command.CommandType = CommandType.StoredProcedure; - using (MySqlDataReader reader = command.ExecuteReader()) - { - } - } - -#if !NETCORE10 - [Fact] - public void AmbiguousColumns() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE TABLE t1 (id INT)"); - executeSQL("CREATE TABLE t2 (id1 INT, id INT)"); - executeSQL(@"CREATE PROCEDURE spTest() BEGIN SELECT * FROM t1; - SELECT id FROM t1 JOIN t2 on t1.id=t2.id; - SELECT * FROM t2; END"); - - MySqlCommand cmd = new MySqlCommand("spTest", connection); - cmd.CommandType = CommandType.StoredProcedure; - cmd.CommandTimeout = 0; - MySqlDataAdapter da = new MySqlDataAdapter(cmd); - DataSet ds = new DataSet(); - //try - //{ - Exception ex = Assert.Throws(() => da.Fill(ds)); - //Assert.Fail("The above should have thrown an exception"); - //} - //catch (Exception) - //{ - //} - } -#endif - - /// - /// Bug #41034 .net parameter not found in the collection - /// - [Fact] - public void SPWithSpaceInParameterType() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE PROCEDURE spTest(myparam decimal (8,2)) BEGIN SELECT 1; END"); - - MySqlCommand cmd = new MySqlCommand("spTest", connection); - cmd.Parameters.Add("@myparam", MySqlDbType.Decimal).Value = 20; - cmd.CommandType = CommandType.StoredProcedure; - object o = cmd.ExecuteScalar(); - Assert.Equal(1, Convert.ToInt32(o)); - } - - private void ParametersInReverseOrderInternal(bool isOwner) - { - if (ts.version.Major < 5) return; - - executeSQL(@"CREATE PROCEDURE spTest(IN p_1 VARCHAR(5), IN p_2 VARCHAR(5)) - BEGIN SELECT p_1 AS P1, p_2 AS P2; END"); - string spName = "spTest"; - - string connStr = connection.ConnectionString; - if (!isOwner) - connStr += ";use procedure bodies=false"; - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - MySqlCommand cmd = new MySqlCommand(spName, c); - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.AddWithValue("?p_2", ("World")); - cmd.Parameters[0].Direction = ParameterDirection.Input; - cmd.Parameters.AddWithValue("?p_1", ("Hello")); - cmd.Parameters[1].Direction = ParameterDirection.Input; -#if NETCORE10 - cmd.Parameters[0].MySqlDbType = MySqlDbType.String; - cmd.Parameters[1].MySqlDbType = MySqlDbType.String; - - using (MySqlDataReader dr = cmd.ExecuteReader()) - { - Assert.True(dr.Read()); - if (!isOwner) - { - Assert.Equal("World", dr.GetValue(0)); - Assert.Equal("Hello", dr.GetValue(1)); - } - else - { - Assert.Equal("Hello", dr.GetString("P1")); - Assert.Equal("World", dr.GetString("P2")); - } - } -#else - cmd.Parameters[0].DbType = DbType.AnsiString; - cmd.Parameters[1].DbType = DbType.AnsiString; - MySqlDataAdapter da = new MySqlDataAdapter(cmd); - DataTable dt = new DataTable(); - da.Fill(dt); - if (!isOwner) - { - Assert.Equal("World", dt.Rows[0][0]); - Assert.Equal("Hello", dt.Rows[0][1]); - } - else - { - Assert.Equal("Hello", dt.Rows[0]["P1"]); - Assert.Equal("World", dt.Rows[0]["P2"]); - } -#endif - } - } - - [Fact] - public void ParametersInReverseOrderNotOwner() - { - ParametersInReverseOrderInternal(false); - } - - [Fact] - public void ParametersInReverseOrderOwner() - { - ParametersInReverseOrderInternal(true); - } - -#if !NETCORE10 - [Fact] - public void DeriveParameters() - { - if (ts.version < new Version(5, 0)) return; - if (ts.version > new Version(6, 0, 6)) return; - - executeSQL(@"CREATE PROCEDURE spTest (id INT, name VARCHAR(20)) - BEGIN SELECT name; END"); - - MySqlCommand cmd = new MySqlCommand("spTest", connection); - cmd.CommandType = CommandType.StoredProcedure; - MySqlCommandBuilder.DeriveParameters(cmd); - Assert.Equal(2, cmd.Parameters.Count); - } -#endif - - /// - /// Bug #52562 Sometimes we need to reload cached function parameters - /// - [Fact] - public void ProcedureCacheMiss() - { - executeSQL("CREATE PROCEDURE spTest(id INT) BEGIN SELECT 1; END"); - - string connStr = connection.ConnectionString + ";procedure cache size=25"; - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - MySqlCommand cmd = new MySqlCommand("spTest", c); - cmd.Parameters.AddWithValue("@id", 1); - cmd.CommandType = CommandType.StoredProcedure; - cmd.ExecuteScalar(); - - executeSQL("DROP PROCEDURE spTest"); - executeSQL("CREATE PROCEDURE spTest(id INT, id2 INT, id3 INT) BEGIN SELECT 1; END"); - - cmd.Parameters.AddWithValue("@id2", 2); - cmd.Parameters.AddWithValue("@id3", 3); - cmd.ExecuteScalar(); - } - } - -#if !NETCORE10 - /// - /// Verifies that GetProcedureParameters does not require SELECT permission on mysql.proc table. - /// - [Fact] - public void GetProcedureParametersDoesNotRequireSelectFromMySqlProceduresTable() - { - if (ts.version < new Version(5, 5, 3)) return; - - executeAsRoot(String.Format("GRANT ALL ON `{0}`.* to 'simpleuser' identified by 'simpleuser'", ts.baseDBName + "0")); - executeSQL("DROP PROCEDURE IF EXISTS spTest"); - executeSQL(@"CREATE PROCEDURE spTest(id INT, name VARCHAR(20)) - BEGIN SELECT name; END"); - - string connStr = "server=localhost; userid=simpleuser; pwd=simpleuser;database=" + ts.baseDBName + "0" + ";use procedure bodies=false; port= 3305;"; - - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - - string[] restrictions = new string[4]; - restrictions[1] = c.Database; - restrictions[2] = "spTest"; - - DataTable procTable = c.GetSchema("procedures", restrictions); - - ISSchemaProvider isp = new ISSchemaProvider(c); - string[] rest = isp.CleanRestrictions(restrictions); - - MySqlSchemaCollection parametersTable = isp.GetProcedureParameters(rest, new MySqlSchemaCollection( procTable )); - - Assert.NotNull(parametersTable); - } - } -#endif - - /// - /// Validates a stored procedure call without the "call" statement - /// Bug #14008699 - /// - [Fact] - public void CallStoredProcedure() - { - executeSQL("CREATE PROCEDURE GetCount() BEGIN SELECT 5; END"); - - MySqlCommand cmd = new MySqlCommand("GetCount", connection); - cmd.CommandType = CommandType.Text; - - Assert.Equal(5, Convert.ToInt32(cmd.ExecuteScalar())); - } - - } -} diff --git a/Tests/MySql.Data.Tests/StoredProcedureWithAccess.cs b/Tests/MySql.Data.Tests/StoredProcedureWithAccess.cs deleted file mode 100644 index 9cd1b5dc4..000000000 --- a/Tests/MySql.Data.Tests/StoredProcedureWithAccess.cs +++ /dev/null @@ -1,433 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Data; -using System.Globalization; - -namespace MySql.Data.MySqlClient.Tests -{ - public class StoredProcedureWithAccess : TestBase - { - protected TestSetup ts; - - private static string fillError = null; - - public StoredProcedureWithAccess(TestSetup setup): base(setup, "storedprocwithacc") - { - ts = setup; - } - - - //public void SetFixture(SetUpClass data) - //{ - // st = data; - // st.accessToMySqlDb = true; - //} - - - /// - /// Bug #40139 ExecuteNonQuery hangs - /// - [Fact] - public void CallingStoredProcWithOnlyExecPrivs() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE PROCEDURE spTest() BEGIN SELECT 1; END"); - executeSQL("CREATE PROCEDURE spTest2() BEGIN SELECT 1; END"); - executeAsRoot(String.Format("GRANT USAGE ON `{0}`.* TO 'abc'@'%' IDENTIFIED BY 'abc'", ts.baseDBName + "0")); - - try - { - executeAsRoot(String.Format("GRANT SELECT ON `{0}`.* TO 'abc'@'%'", ts.baseDBName + "0")); - executeAsRoot(String.Format("GRANT EXECUTE ON PROCEDURE `{0}`.spTest TO abc", ts.baseDBName + "0")); - - string connStr = "server=localhost;userid=abc;pwd=abc;port=3305;database=" + ts.baseDBName + "0" + "; check parameters=false"; - - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - MySqlCommand cmd = new MySqlCommand("spTest", c); - cmd.CommandType = CommandType.StoredProcedure; - object o = null; - o = cmd.ExecuteScalar(); - Assert.Equal(1, Convert.ToInt32(o)); - - cmd.CommandText = "spTest2"; - Assert.Throws(typeof(MySqlException), delegate { cmd.ExecuteScalar(); }); - } - } - finally - { - executeAsRoot("DROP USER abc"); - } - } - - [Fact] - public void ProcedureParameters() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("DROP PROCEDURE IF EXISTS spTest"); - executeSQL("CREATE PROCEDURE spTest (id int, name varchar(50)) BEGIN SELECT 1; END"); - - string[] restrictions = new string[5]; - restrictions[1] = ts.baseDBName + "0"; - restrictions[2] = "spTest"; -#if NETCORE10 - MySqlSchemaCollection dt = connection.GetSchemaCollection("Procedure Parameters", restrictions); - string tableName = dt.Name; -#else - DataTable dt = connection.GetSchema("Procedure Parameters", restrictions); - string tableName = dt.TableName; -#endif - Assert.True(dt.Rows.Count == 2); - Assert.Equal("Procedure Parameters", tableName); - Assert.Equal(ts.baseDBName.ToLower() + "0", dt.Rows[0]["SPECIFIC_SCHEMA"].ToString().ToLower()); - Assert.Equal("sptest", dt.Rows[0]["SPECIFIC_NAME"].ToString().ToLower()); - Assert.Equal("id", dt.Rows[0]["PARAMETER_NAME"].ToString().ToLower()); - Assert.Equal(1, dt.Rows[0]["ORDINAL_POSITION"]); - Assert.Equal("IN", dt.Rows[0]["PARAMETER_MODE"]); - - restrictions[4] = "name"; -#if NETCORE10 - dt = connection.GetSchemaCollection("Procedure Parameters", restrictions); -#else - dt.Clear(); - dt = connection.GetSchema("Procedure Parameters", restrictions); -#endif - Assert.Equal(1, dt.Rows.Count); - Assert.Equal("sptest", dt.Rows[0]["SPECIFIC_NAME"].ToString().ToLower()); - Assert.Equal("name", dt.Rows[0]["PARAMETER_NAME"].ToString().ToLower()); - Assert.Equal(2, dt.Rows[0]["ORDINAL_POSITION"]); - Assert.Equal("IN", dt.Rows[0]["PARAMETER_MODE"]); - - executeSQL("DROP FUNCTION IF EXISTS spFunc"); - executeSQL("CREATE FUNCTION spFunc (id int) RETURNS INT BEGIN RETURN 1; END"); - - restrictions[4] = null; - restrictions[1] = ts.baseDBName + "0"; - restrictions[2] = "spFunc"; -#if NETCORE10 - dt = connection.GetSchemaCollection("Procedure Parameters", restrictions); -#else - dt = connection.GetSchema("Procedure Parameters", restrictions); -#endif - Assert.True(dt.Rows.Count == 2); - Assert.Equal("Procedure Parameters", tableName); - Assert.Equal(ts.baseDBName.ToLower() + "0", dt.Rows[0]["SPECIFIC_SCHEMA"].ToString().ToLower()); - Assert.Equal("spfunc", dt.Rows[0]["SPECIFIC_NAME"].ToString().ToLower()); - Assert.Equal(0, dt.Rows[0]["ORDINAL_POSITION"]); - - Assert.Equal(ts.baseDBName.ToLower() + "0", dt.Rows[1]["SPECIFIC_SCHEMA"].ToString().ToLower()); - Assert.Equal("spfunc", dt.Rows[1]["SPECIFIC_NAME"].ToString().ToLower()); - Assert.Equal("id", dt.Rows[1]["PARAMETER_NAME"].ToString().ToLower()); - Assert.Equal(1, dt.Rows[1]["ORDINAL_POSITION"]); - Assert.Equal("IN", dt.Rows[1]["PARAMETER_MODE"]); - } - - [Fact] - public void SingleProcedureParameters() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("DROP PROCEDURE IF EXISTS spTest"); - executeSQL("CREATE PROCEDURE spTest(id int, IN id2 INT(11), " + - "INOUT io1 VARCHAR(20), OUT out1 FLOAT) BEGIN END"); - string[] restrictions = new string[4]; - restrictions[1] = ts.baseDBName + "0"; - restrictions[2] = "spTest"; -#if NETCORE10 - MySqlSchemaCollection procs = connection.GetSchemaCollection("PROCEDURES", restrictions); -#else - DataTable procs = connection.GetSchema("PROCEDURES", restrictions); -#endif - Assert.Equal(1, procs.Rows.Count); - Assert.Equal("spTest", procs.Rows[0][0]); - Assert.Equal(ts.baseDBName.ToLower() + "0", procs.Rows[0][2].ToString().ToLower(CultureInfo.InvariantCulture)); - Assert.Equal("spTest", procs.Rows[0][3]); - -#if NETCORE10 - MySqlSchemaCollection parameters = connection.GetSchemaCollection("PROCEDURE PARAMETERS", restrictions); -#else - DataTable parameters = connection.GetSchema("PROCEDURE PARAMETERS", restrictions); -#endif - Assert.Equal(4, parameters.Rows.Count); - -#if RT - MySqlSchemaRow row = parameters.Rows[0]; -#else - DataRow row = parameters.Rows[0]; -#endif - Assert.Equal(ts.baseDBName.ToLower(CultureInfo.InvariantCulture) + "0", - row["SPECIFIC_SCHEMA"].ToString().ToLower(CultureInfo.InvariantCulture)); - Assert.Equal("spTest", row["SPECIFIC_NAME"]); - Assert.Equal(1, row["ORDINAL_POSITION"]); - Assert.Equal("IN", row["PARAMETER_MODE"]); - Assert.Equal("id", row["PARAMETER_NAME"]); - Assert.Equal("INT", row["DATA_TYPE"].ToString().ToUpper(CultureInfo.InvariantCulture)); - - row = parameters.Rows[1]; - Assert.Equal(ts.baseDBName.ToLower(CultureInfo.InvariantCulture) + "0", row["SPECIFIC_SCHEMA"].ToString().ToLower(CultureInfo.InvariantCulture)); - Assert.Equal("spTest", row["SPECIFIC_NAME"]); - Assert.Equal(2, row["ORDINAL_POSITION"]); - Assert.Equal("IN", row["PARAMETER_MODE"]); - Assert.Equal("id2", row["PARAMETER_NAME"]); - Assert.Equal("INT", row["DATA_TYPE"].ToString().ToUpper(CultureInfo.InvariantCulture)); - - row = parameters.Rows[2]; - Assert.Equal(ts.baseDBName.ToLower(CultureInfo.InvariantCulture) + "0", row["SPECIFIC_SCHEMA"].ToString().ToLower(CultureInfo.InvariantCulture)); - Assert.Equal("spTest", row["SPECIFIC_NAME"]); - Assert.Equal(3, row["ORDINAL_POSITION"]); - Assert.Equal("INOUT", row["PARAMETER_MODE"]); - Assert.Equal("io1", row["PARAMETER_NAME"]); - Assert.Equal("VARCHAR", row["DATA_TYPE"].ToString().ToUpper(CultureInfo.InvariantCulture)); - - row = parameters.Rows[3]; - Assert.Equal(ts.baseDBName.ToLower(CultureInfo.InvariantCulture) + "0", row["SPECIFIC_SCHEMA"].ToString().ToLower(CultureInfo.InvariantCulture)); - Assert.Equal("spTest", row["SPECIFIC_NAME"]); - Assert.Equal(4, row["ORDINAL_POSITION"]); - Assert.Equal("OUT", row["PARAMETER_MODE"]); - Assert.Equal("out1", row["PARAMETER_NAME"]); - Assert.Equal("FLOAT", row["DATA_TYPE"].ToString().ToUpper(CultureInfo.InvariantCulture)); - } - -#if !NETCORE10 - /// - /// Bug #27679 MySqlCommandBuilder.DeriveParameters ignores UNSIGNED flag - /// - [Fact] - public void UnsignedParametersInSP() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE PROCEDURE spTest(testid TINYINT UNSIGNED) BEGIN SELECT testid; END"); - - MySqlCommand cmd = new MySqlCommand("spTest", connection); - cmd.CommandType = CommandType.StoredProcedure; - MySqlCommandBuilder.DeriveParameters(cmd); - Assert.Equal(MySqlDbType.UByte, cmd.Parameters[0].MySqlDbType); - Assert.Equal(DbType.Byte, cmd.Parameters[0].DbType); - } - - [Fact] - public void CheckNameOfReturnParameter() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("DROP FUNCTION IF EXISTS fnTest"); - executeSQL("CREATE FUNCTION fnTest() RETURNS CHAR(50)" + - " LANGUAGE SQL DETERMINISTIC BEGIN RETURN \"Test\"; END"); - - MySqlCommand cmd = new MySqlCommand("fnTest", connection); - cmd.CommandType = CommandType.StoredProcedure; - MySqlCommandBuilder.DeriveParameters(cmd); - Assert.Equal(1, cmd.Parameters.Count); - Assert.Equal("@RETURN_VALUE", cmd.Parameters[0].ParameterName); - } - - /// - /// Bug #13632 the MySQLCommandBuilder.deriveparameters has not been updated for MySQL 5 - /// Bug #15077 Error MySqlCommandBuilder.DeriveParameters for sp without parameters. - /// Bug #19515 DiscoverParameters fails on numeric datatype - /// - [Fact] - public void DeriveParameters() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("CREATE TABLE test2 (c CHAR(20))"); - executeSQL("INSERT INTO test2 values ( 'xxxx')"); - MySqlCommand cmd2 = new MySqlCommand("SELECT * FROM test2", connection); - using (MySqlDataReader reader = cmd2.ExecuteReader()) - { - } - - executeSQL("CREATE PROCEDURE spTest(IN \r\nvalin DECIMAL(10,2), " + - "\nIN val2 INT, INOUT val3 FLOAT, OUT val4 DOUBLE, INOUT val5 BIT, " + - "val6 VARCHAR(155), val7 SET('a','b'), val8 CHAR, val9 NUMERIC(10,2)) " + - "BEGIN SELECT 1; END"); - - MySqlCommand cmd = new MySqlCommand("spTest", connection); - cmd.CommandType = CommandType.StoredProcedure; - MySqlCommandBuilder.DeriveParameters(cmd); - - Assert.Equal(9, cmd.Parameters.Count); - Assert.Equal("@valin", cmd.Parameters[0].ParameterName); - Assert.Equal(ParameterDirection.Input, cmd.Parameters[0].Direction); - Assert.Equal(MySqlDbType.NewDecimal, cmd.Parameters[0].MySqlDbType); - - Assert.Equal("@val2", cmd.Parameters[1].ParameterName); - Assert.Equal(ParameterDirection.Input, cmd.Parameters[1].Direction); - Assert.Equal(MySqlDbType.Int32, cmd.Parameters[1].MySqlDbType); - - Assert.Equal("@val3", cmd.Parameters[2].ParameterName); - Assert.Equal(ParameterDirection.InputOutput, cmd.Parameters[2].Direction); - Assert.Equal(MySqlDbType.Float, cmd.Parameters[2].MySqlDbType); - - Assert.Equal("@val4", cmd.Parameters[3].ParameterName); - Assert.Equal(ParameterDirection.Output, cmd.Parameters[3].Direction); - Assert.Equal(MySqlDbType.Double, cmd.Parameters[3].MySqlDbType); - - Assert.Equal("@val5", cmd.Parameters[4].ParameterName); - Assert.Equal(ParameterDirection.InputOutput, cmd.Parameters[4].Direction); - Assert.Equal(MySqlDbType.Bit, cmd.Parameters[4].MySqlDbType); - - Assert.Equal("@val6", cmd.Parameters[5].ParameterName); - Assert.Equal(ParameterDirection.Input, cmd.Parameters[5].Direction); - Assert.Equal(MySqlDbType.VarChar, cmd.Parameters[5].MySqlDbType); - - Assert.Equal("@val7", cmd.Parameters[6].ParameterName); - Assert.Equal(ParameterDirection.Input, cmd.Parameters[6].Direction); - Assert.Equal(MySqlDbType.Set, cmd.Parameters[6].MySqlDbType); - - Assert.Equal("@val8", cmd.Parameters[7].ParameterName); - Assert.Equal(ParameterDirection.Input, cmd.Parameters[7].Direction); - Assert.Equal(MySqlDbType.String, cmd.Parameters[7].MySqlDbType); - - Assert.Equal("@val9", cmd.Parameters[8].ParameterName); - Assert.Equal(ParameterDirection.Input, cmd.Parameters[8].Direction); - Assert.Equal(MySqlDbType.NewDecimal, cmd.Parameters[8].MySqlDbType); - - executeSQL("DROP PROCEDURE spTest"); - executeSQL("CREATE PROCEDURE spTest() BEGIN END"); - cmd.CommandText = "spTest"; - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.Clear(); - MySqlCommandBuilder.DeriveParameters(cmd); - Assert.Equal(0, cmd.Parameters.Count); - } - - /// - /// Bug #13632 the MySQLCommandBuilder.deriveparameters has not been updated for MySQL 5 - /// - [Fact] - public void DeriveParametersForFunction() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("DROP FUNCTION IF EXISTS fnTest"); - executeSQL("CREATE FUNCTION fnTest(v1 DATETIME) RETURNS INT " + - " LANGUAGE SQL DETERMINISTIC BEGIN RETURN 1; END"); - - MySqlCommand cmd = new MySqlCommand("fnTest", connection); - cmd.CommandType = CommandType.StoredProcedure; - MySqlCommandBuilder.DeriveParameters(cmd); - - Assert.Equal(2, cmd.Parameters.Count); - Assert.Equal("@v1", cmd.Parameters[1].ParameterName); - Assert.Equal(ParameterDirection.Input, cmd.Parameters[1].Direction); - Assert.Equal(MySqlDbType.DateTime, cmd.Parameters[1].MySqlDbType); - - Assert.Equal(ParameterDirection.ReturnValue, cmd.Parameters[0].Direction); - Assert.Equal(MySqlDbType.Int32, cmd.Parameters[0].MySqlDbType); - } - - /// - /// Bug #49642 FormatException when returning empty string from a stored function - /// - [Fact] - public void NotSpecifyingDataTypeOfReturnValue() - { - if (ts.version < new Version(5, 0)) return; - - executeSQL("DROP FUNCTION IF EXISTS TestFunction"); - - executeSQL(@"CREATE FUNCTION `TestFunction`() - RETURNS varchar(20) - RETURN ''"); - MySqlCommand cmd = new MySqlCommand("TestFunction", connection); - cmd.CommandType = CommandType.StoredProcedure; - MySqlParameter returnParam = new MySqlParameter(); - returnParam.ParameterName = "?RetVal_"; - returnParam.Direction = ParameterDirection.ReturnValue; - cmd.Parameters.Add(returnParam); - cmd.ExecuteNonQuery(); - } - - /// - /// Bug #50123 Batch updates bug when UpdateBatchSize > 1 - /// Bug #50444 Parameters.Clear() not working - /// - [Fact] - public void UpdateBatchSizeMoreThanOne() - { - executeSQL(@"CREATE TABLE test(fldID INT NOT NULL, - fldValue VARCHAR(50) NOT NULL, PRIMARY KEY(fldID))"); - - MySqlDataAdapter adapter = new MySqlDataAdapter("SELECT * FROM test", connection); - DataTable data = new DataTable(); - adapter.Fill(data); - - MySqlCommand ins = new MySqlCommand( - "INSERT INTO test(fldID, fldValue) VALUES (?p1, ?p2)", connection); - ins.Parameters.Add("p1", MySqlDbType.Int32).SourceColumn = "fldID"; - ins.Parameters.Add("p2", MySqlDbType.String).SourceColumn = "fldValue"; - - ins.UpdatedRowSource = UpdateRowSource.None; - adapter.InsertCommand = ins; - adapter.UpdateBatchSize = 10; - - int numToInsert = 20; - for (int i = 0; i < numToInsert; i++) - { - DataRow row = data.NewRow(); - row["fldID"] = i + 1; - row["fldValue"] = "ID = " + (i + 1); - data.Rows.Add(row); - } - Assert.Equal(numToInsert, adapter.Update(data)); - - //UPDATE VIA SP - MySqlCommand comm = new MySqlCommand("DROP PROCEDURE IF EXISTS pbug50123", connection); - comm.ExecuteNonQuery(); - comm.CommandText = "CREATE PROCEDURE pbug50123(" + - "IN pfldID INT, IN pfldValue VARCHAR(50)) " + - "BEGIN INSERT INTO test(fldID, fldValue) " + - "VALUES(pfldID, pfldValue); END"; - comm.ExecuteNonQuery(); - - // Set the Insert Command - ins.Parameters.Clear(); - ins.CommandText = "pbug50123"; - ins.CommandType = CommandType.StoredProcedure; - ins.Parameters.Add("pfldID", MySqlDbType.Int32).SourceColumn = "fldID"; - ins.Parameters.Add("pfldValue", MySqlDbType.String).SourceColumn = "fldValue"; - ins.UpdatedRowSource = UpdateRowSource.None; - - for (int i = 21; i < 41; i++) - { - DataRow row = data.NewRow(); - row["fldID"] = i + 1; - row["fldValue"] = "ID = " + (i + 1); - data.Rows.Add(row); - } - // Do the update - Assert.Equal(numToInsert, adapter.Update(data)); - } -#endif - } -} diff --git a/Tests/MySql.Data.Tests/Syntax.cs b/Tests/MySql.Data.Tests/Syntax.cs deleted file mode 100644 index ae007ea52..000000000 --- a/Tests/MySql.Data.Tests/Syntax.cs +++ /dev/null @@ -1,564 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Data; -using System.IO; -using System.ComponentModel; - -namespace MySql.Data.MySqlClient.Tests -{ - public class Syntax : TestBase - { - public Syntax(TestSetup setup) : base(setup, "syntax") - { - } - - [Fact] - public void ShowCreateTable() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); - TestDataTable dt = Utils.FillTable("SHOW CREATE TABLE Test", connection); - - Assert.Equal(1, dt.Rows.Count); - Assert.Equal(2, dt.Columns.Count); - } - - [Fact] - public void ProblemCharsInSQLUTF8() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), mt MEDIUMTEXT, " + - "PRIMARY KEY(id)) CHAR SET utf8"); - - var settings = new MySqlConnectionStringBuilder(Settings.GetConnectionString(true)); - settings.CharacterSet = "utf8"; - using (MySqlConnection c = new MySqlConnection(settings.GetConnectionString(true))) - { - c.Open(); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?id, ?text, ?mt)", c); - cmd.Parameters.AddWithValue("?id", 1); - cmd.Parameters.AddWithValue("?text", "This is my;test ? string–’‘’“”…"); - cmd.Parameters.AddWithValue("?mt", "My MT string: ?"); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.Read()); - Assert.Equal(1, reader.GetInt32(0)); - Assert.Equal("This is my;test ? string–’‘’“”…", reader.GetString(1)); - Assert.Equal("My MT string: ?", reader.GetString(2)); - } - } - } - - - [Fact] - public void ProblemCharsInSQL() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), mt MEDIUMTEXT, " + - "PRIMARY KEY(id))"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (?id, ?text, ?mt)", connection); - cmd.Parameters.AddWithValue("?id", 1); - cmd.Parameters.AddWithValue("?text", "This is my;test ? string-'''\"\"."); - cmd.Parameters.AddWithValue("?mt", "My MT string: ?"); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM Test"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - Assert.True(reader.Read()); - Assert.Equal(1, reader.GetInt32(0)); - Assert.Equal("This is my;test ? string-'''\"\".", reader.GetString(1)); - Assert.Equal("My MT string: ?", reader.GetString(2)); - } - } - - [Fact] - public void LoadDataLocalInfile() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); - string connString = connection.ConnectionString + ";pooling=false"; - MySqlConnection c = new MySqlConnection(connString); - c.Open(); - - string path = Path.GetTempFileName(); - StreamWriter sw = new StreamWriter(new FileStream(path, FileMode.Create)); - for (int i = 0; i < 2000000; i++) - sw.WriteLine(i + ",'Test'"); - sw.Flush(); - sw.Dispose(); - - path = path.Replace(@"\", @"\\"); - MySqlCommand cmd = new MySqlCommand( - "LOAD DATA LOCAL INFILE '" + path + "' INTO TABLE Test FIELDS TERMINATED BY ','", connection); - cmd.CommandTimeout = 0; - - object cnt = 0; - cnt = cmd.ExecuteNonQuery(); - Assert.Equal(2000000, Convert.ToInt32(cnt)); - - cmd.CommandText = "SELECT COUNT(*) FROM Test"; - cnt = cmd.ExecuteScalar(); - Assert.Equal(2000000, Convert.ToInt32(cnt)); - - c.Close(); - } - - [Fact] - public void ShowTablesInNonExistentDb() - { - MySqlCommand cmd = new MySqlCommand("SHOW TABLES FROM dummy", connection); - Assert.Throws(() => cmd.ExecuteReader()); - //try - //{ - // using (MySqlDataReader reader = cmd.ExecuteReader()) - // { - // Assert.Fail("ExecuteReader should not succeed"); - // } - //} - //catch (MySqlException) - //{ - // Assert.Equal(ConnectionState.Open, connection.State); - //} - } - - [Fact] - public void Bug6135() - { - string sql = @"CREATE TABLE `KLANT` (`KlantNummer` int(11) NOT NULL auto_increment, - `Username` varchar(50) NOT NULL default '', `Password` varchar(100) NOT NULL default '', - `Naam` varchar(100) NOT NULL default '', `Voornaam` varchar(100) NOT NULL default '', - `Straat` varchar(100) NOT NULL default '', `StraatNr` varchar(10) NOT NULL default '', - `Gemeente` varchar(100) NOT NULL default '', `Postcode` varchar(10) NOT NULL default '', - `DefaultMail` varchar(255) default '', `BtwNr` varchar(50) default '', - `ReceiveMail` tinyint(1) NOT NULL default '0', `Online` tinyint(1) NOT NULL default '0', - `LastVisit` timestamp NOT NULL, `Categorie` int(11) NOT NULL default '0', - PRIMARY KEY (`KlantNummer`), UNIQUE KEY `UniqueUsername` (`Username`), - UNIQUE KEY `UniqueDefaultMail` (`DefaultMail`) )"; - executeSQL(sql); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM KLANT", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - while (reader.Read()) { } - } - } - - [Fact] - public void Sum() - { - executeSQL("CREATE TABLE Test (field1 mediumint(9) default '0', field2 float(9,3) " + - "default '0.000', field3 double(15,3) default '0.000') engine=innodb "); - executeSQL("INSERT INTO Test values (1,1,1)"); - - MySqlCommand cmd2 = new MySqlCommand("SELECT sum(field2) FROM Test", connection); - using (MySqlDataReader reader = cmd2.ExecuteReader()) - { - reader.Read(); - object o = reader[0]; - Assert.Equal(1, Convert.ToInt32(o)); - } - } - - [Fact] - public void Sum2() - { - executeSQL("CREATE TABLE Test (id int, count int)"); - executeSQL("INSERT INTO Test VALUES (1, 21)"); - executeSQL("INSERT INTO Test VALUES (1, 33)"); - executeSQL("INSERT INTO Test VALUES (1, 16)"); - executeSQL("INSERT INTO Test VALUES (1, 40)"); - - MySqlCommand cmd = new MySqlCommand("SELECT id, SUM(count) FROM Test GROUP BY id", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - Assert.Equal(1, reader.GetInt32(0)); - Assert.Equal(110, reader.GetDouble(1)); - } - } - - [Fact] - public void ForceWarnings() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); - MySqlCommand cmd = new MySqlCommand( - "SELECT * FROM Test; DROP TABLE IF EXISTS test2; SELECT * FROM Test", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - while (reader.NextResult()) { } - } - } - - [Fact] - public void SettingAutoIncrementColumns() - { - executeSQL("CREATE TABLE Test (id int auto_increment, name varchar(100), primary key(id))"); - executeSQL("INSERT INTO Test VALUES (1, 'One')"); - executeSQL("INSERT INTO Test VALUES (3, 'Two')"); - - MySqlCommand cmd = new MySqlCommand("SELECT name FROM Test WHERE id=1", connection); - object name = cmd.ExecuteScalar(); - Assert.Equal("One", name); - - cmd.CommandText = "SELECT name FROM Test WHERE id=3"; - name = cmd.ExecuteScalar(); - Assert.Equal("Two", name); - - //try - //{ - Assert.Throws(() => executeSQL("INSERT INTO Test (id, name2) values (5, 'Three')")); - // Assert.Fail("This should have failed"); - //} - //catch (MySqlException) - //{ - //} - } - - /// - /// Bug #16645 FOUND_ROWS() Bug - /// - [Fact] - public void FoundRows() - { - executeSQL("CREATE TABLE Test (testID int(11) NOT NULL auto_increment, testName varchar(100) default '', " + - "PRIMARY KEY (testID)) ENGINE=InnoDB DEFAULT CHARSET=latin1"); - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (NULL, 'test')", connection); - for (int i = 0; i < 1000; i++) - cmd.ExecuteNonQuery(); - cmd.CommandText = "SELECT SQL_CALC_FOUND_ROWS * FROM Test LIMIT 0, 10"; - cmd.ExecuteNonQuery(); - cmd.CommandText = "SELECT FOUND_ROWS()"; - object cnt = cmd.ExecuteScalar(); - Assert.Equal(1000, Convert.ToInt32(cnt)); - } - - [Fact] - public void AutoIncrement() - { - executeSQL("CREATE TABLE Test (testID int(11) NOT NULL auto_increment, testName varchar(100) default '', " + - "PRIMARY KEY (testID)) ENGINE=InnoDB DEFAULT CHARSET=latin1"); - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (NULL, 'test')", connection); - cmd.ExecuteNonQuery(); - cmd.CommandText = "SELECT @@IDENTITY as 'Identity'"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - int ident = Int32.Parse(reader.GetValue(0).ToString()); - Assert.Equal(1, ident); - } - } - - /// - /// Bug #21521 # Symbols not allowed in column/table names. - /// - [Fact] - public void CommentSymbolInTableName() - { - executeSQL("CREATE TABLE Test (`PO#` int(11) NOT NULL auto_increment, " + - "`PODate` date default NULL, PRIMARY KEY (`PO#`))"); - executeSQL("INSERT INTO Test ( `PO#`, `PODate` ) " + - "VALUES ( NULL, '2006-01-01' )"); - - string sql = "SELECT `PO#` AS PurchaseOrderNumber, " + - "`PODate` AS OrderDate FROM Test"; - TestDataTable dt = Utils.FillTable(sql, connection); - Assert.Equal(1, dt.Rows.Count); - } - - /// - /// Bug #25178 Addition message in error - /// - [Fact] - public void ErrorMessage() - { - MySqlCommand cmd = new MySqlCommand("SELEKT NOW() as theTime", connection); - try - { - cmd.ExecuteScalar(); - } - catch (MySqlException ex) - { - string s = ex.Message; - Assert.False(s.StartsWith("#", StringComparison.Ordinal)); - } - } - - /// - /// Bug #27221 describe SQL command returns all byte array on MySQL versions older than 4.1.15 - /// - [Fact] - public void Describe() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); - var reader = ExecuteAsReader("DESCRIBE Test", connection); - using (reader) - { - Assert.True(reader.GetFieldType(0) == typeof(string)); - Assert.True(reader.GetFieldType(1) == typeof(string)); - Assert.True(reader.GetFieldType(2) == typeof(string)); - Assert.True(reader.GetFieldType(3) == typeof(string)); - Assert.True(reader.GetFieldType(4) == typeof(string)); - Assert.True(reader.GetFieldType(5) == typeof(string)); - } - } - - [Fact] - public void ShowTableStatus() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); - var reader = ExecuteAsReader("DESCRIBE Test", connection); - using (reader) - { - reader.Read(); - Assert.True(reader[0].GetType() == typeof(string)); - } - } - - /// - /// Bug #26960 Connector .NET 5.0.5 / Visual Studio Plugin 1.1.2 - /// - [Fact] - public void NullAsAType() - { - TestDataTable dt = Utils.FillTable(@"SELECT 'localhost' as SERVER_NAME, - null as CATALOG_NAME, database() as SCHEMA_NAME", connection); - Assert.True(dt.Rows[0][0].GetType() == typeof(string)); - Assert.Equal(DBNull.Value, dt.Rows[0][1]); - Assert.True(dt.Rows[0][2].GetType() == typeof(string)); - } - - [Fact] - public void SpaceInDatabaseName() - { - string dbName = System.IO.Path.GetFileNameWithoutExtension( - System.IO.Path.GetTempFileName()) + " x"; - string fullDbName = CreateDatabase(dbName); - - var settings = GetConnectionSettings(); - settings.Database = fullDbName; - MySqlConnection c = new MySqlConnection(settings.GetConnectionString(true)); - c.Open(); - c.Close(); - } - - /// - /// Bug #28448 show processlist; returns byte arrays in the resulting data table - /// - [Fact] - public void ShowProcessList() - { - var settings = GetConnectionSettings(); - settings.RespectBinaryFlags = false; - MySqlConnection c = new MySqlConnection(settings.GetConnectionString(true)); - using (c) - { - c.Open(); - - - MySqlCommand cmd = new MySqlCommand("show processlist", c); - TestDataTable dt = new TestDataTable(); - - using (MySqlDataReader rdr = cmd.ExecuteReader()) - { - dt.Load(rdr); - } - DataRow row = dt.Rows[0]; - - Assert.True(row["User"].GetType().Name == "String"); - Assert.True(row["Host"].GetType().Name == "String"); - Assert.True(row["Command"].GetType().Name == "String"); - } - } - - [Fact] - public void SemisAtStartAndEnd() - { - using (MySqlCommand cmd = new MySqlCommand(";;SELECT 1;;;", connection)) - { - Assert.Equal(1, Convert.ToInt32(cmd.ExecuteScalar())); - } - } - - /// - /// Bug #51610 Exception thrown inside Connector.NET - /// - [Fact] - public void Bug51610() - { - MySqlCommand cmd = new MySqlCommand("SELECT 'ABC', (0/`QOH`) from (SELECT 1 as `QOH`) `d1`", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - Assert.Equal("ABC", reader.GetString(0)); - Assert.Equal(0, reader.GetInt32(1)); - } - - cmd.CommandText = "SELECT 'ABC', (0-`QOH`) from (SELECT 1 as `QOH`) `d1`"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - Assert.Equal("ABC", reader.GetString(0)); - Assert.Equal(-1, reader.GetInt32(1)); - } - - cmd.CommandText = "SELECT 'test 2010-03-04 @ 10:14'"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - Assert.Equal("test 2010-03-04 @ 10:14", reader.GetString(0)); - } - - } - - /// - /// Bug #51788 Error in SQL syntax not reported. A CLR exception was thrown instead, - /// - [Fact] - public void NonTerminatedString() - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test(id INT, name1 VARCHAR(20), name2 VARCHAR(20))"); - - try - { - MySqlCommand cmd = new MySqlCommand( - "INSERT INTO test VALUES (1, 'test 2010-03-04 @ 10:14, name2=' joe')", connection); - cmd.ExecuteNonQuery(); - } - catch (MySqlException) - { - } - } - - /// - /// Bug #53865 : crash in QueryNormalizer, "IN" clause incomplete - /// - [Fact] - public void QueryNormalizerCrash1() - { - - executeSQL( - "CREATE TABLE extable_1 (x_coord int, y_coord int, z_coord int," + - "edge_id int, life_id int)"); - executeSQL("CREATE TABLE extable_2 (daset_id int, sect_id int, " + - "xyz_id int, edge_id int, life_id int, another_id int, yetanother_id int)"); - - var settings = GetConnectionSettings(); - settings.Logging = true; - using (MySqlConnection c = new MySqlConnection(settings.GetConnectionString(true))) - { - c.Open(); - MySqlCommand cmd = new MySqlCommand( - "SELECT tblb.x_coord, tblb.y_coord, tblb.z_coord, " + - "tbl_c.x_coord, tbl_c.y_coord, tbl_c.z_coord, tbl_a.edge_id, " + - "tbl_a.life_id, tbl_a.daset_id, tbl_a.sect_id, tbl_a.yetanother_id," + - " IFNULL(tbl_a.xyz_id,0) FROM extable_2 tbl_a, extable_1 tblb, " + - "extable_1 tbl_c WHERE tbl_a.daset_id=208 AND tbl_a.sect_id IN " + - "(1,2,3,4,5,6,7)", - c); - Console.WriteLine(cmd.ExecuteScalar()); - } - } - - /// - /// Bug #54152 : Crash in QueryNormalizer, VALUES incomplete - /// - [Fact] - public void QueryNormalizerCrash2() - { - executeSQL("CREATE TABLE bug54152 (id INT, expr INT,name VARCHAR(20)," + - "fld4 VARCHAR(10), fld5 VARCHAR(10), fld6 VARCHAR(10)," + - "fld7 VARCHAR(10), fld8 VARCHAR(10), fld9 VARCHAR(10)," + - "fld10 VARCHAR(10), PRIMARY KEY(id))"); - - var settings = GetConnectionSettings(); - settings.Logging = true; - using (MySqlConnection c = new MySqlConnection(settings.GetConnectionString(true))) - { - c.Open(); - string query = - "INSERT INTO bug54152 VALUES " + - "(1,1, 'name 1',1,1,1,1,1,1,1)," + - "(2,2,'name 2',2,2,2,2,2,2,2)," + - "(3,3,'name 3',3,3,3,3,3,3,3)," + - "(4,4,'name 4',4,4,4,4,4,4,4)," + - "(5,5,'name 5',5,5,5,5,5,5,5)," + - "(6,6,'name 6',6,6,6,6,6,6,6)," + - "(7,7,'name 7',7,7,7,7,7,7,7)," + - "(8,8,'name 8',8,8,8,8,8,8,8)," + - "(9,9,'name 9',9,9,9,9,9,9,9)," + - "(10,10,'name 10',10,10,10,10,10,10,10)"; - MySqlCommand cmd = new MySqlCommand(query, c); - cmd.ExecuteNonQuery(); - } - } - -#if !NETCORE10 - /// - /// Bug #54386 : expression with parentheses in INSERT leads to invalid - /// query when using batching - /// - [Fact] - public void TokenizerBatching() - { - executeSQL("CREATE TABLE Test (id INT, expr INT,name VARCHAR(20), PRIMARY KEY(id))"); - - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", - connection); - MySqlCommand ins = new MySqlCommand( - "INSERT INTO test (id, expr, name) VALUES(?p1, (?p2 * 2) + 3, ?p3)", - connection); - da.InsertCommand = ins; - ins.UpdatedRowSource = UpdateRowSource.None; - ins.Parameters.Add("?p1", MySqlDbType.Int32).SourceColumn = "id"; - ins.Parameters.Add("?p2", MySqlDbType.Int32).SourceColumn = "expr"; - ins.Parameters.Add("?p3", MySqlDbType.VarChar, 20).SourceColumn = "name"; - - TestDataTable dt = new TestDataTable(); - da.Fill(dt); - - for (int i = 1; i <= 100; i++) - { - DataRow row = dt.NewRow(); - row["id"] = i; - row["expr"] = i; - row["name"] = "name " + i; - dt.Rows.Add(row); - } - - da.UpdateBatchSize = 10; - da.Update(dt); - - } - -#endif - - } -} diff --git a/Tests/MySql.Data.Tests/Syntax2.cs b/Tests/MySql.Data.Tests/Syntax2.cs deleted file mode 100644 index 2e24a8275..000000000 --- a/Tests/MySql.Data.Tests/Syntax2.cs +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Data; -using System.ComponentModel; - -namespace MySql.Data.MySqlClient.Tests -{ - public class Syntax2 : TestBase - { - public Syntax2(TestSetup setup) : base(setup, "syntax2") - { - } - - [Fact] - public void CommentsInSQL() - { - executeSQL("CREATE TABLE Test (id INT NOT NULL, name VARCHAR(250), PRIMARY KEY(id))"); - string sql = "INSERT INTO Test /* my table */ VALUES (1 /* this is the id */, 'Test' );" + - "/* These next inserts are just for testing \r\n" + - " comments */\r\n" + - "INSERT INTO \r\n" + - " # This table is bogus\r\n" + - "Test VALUES (2, 'Test2')"; - - - MySqlCommand cmd = new MySqlCommand(sql, connection); - cmd.ExecuteNonQuery(); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - TestDataTable table = new TestDataTable(); - da.Fill(table); - Assert.Equal(1, table.Rows[0]["id"]); - Assert.Equal("Test", table.Rows[0]["name"]); - Assert.Equal(2, table.Rows.Count); - Assert.Equal(2, table.Rows[1]["id"]); - Assert.Equal("Test2", table.Rows[1]["name"]); - } - - [Fact] - public void LastInsertid() - { - executeSQL("CREATE TABLE Test(id int auto_increment, name varchar(20), primary key(id))"); - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES(NULL, 'test')", connection); - cmd.ExecuteNonQuery(); - Assert.Equal(1, cmd.LastInsertedId); - - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - } - Assert.Equal(2, cmd.LastInsertedId); - - cmd.CommandText = "SELECT id FROM Test"; - cmd.ExecuteScalar(); - Assert.Equal(-1, cmd.LastInsertedId); - } - - [Fact] - public void ParsingBugTest() - { - executeSQL(@"CREATE FUNCTION `TestFunction`(A INTEGER (11), B INTEGER (11), C VARCHAR (20)) - RETURNS int(11) - RETURN 1"); - - MySqlCommand command = new MySqlCommand("TestFunction", connection); - command.CommandType = CommandType.StoredProcedure; - command.CommandText = "TestFunction"; - command.Parameters.AddWithValue("@A", 1); - command.Parameters.AddWithValue("@B", 2); - command.Parameters.AddWithValue("@C", "test"); - command.Parameters.Add("@return", MySqlDbType.Int32).Direction = ParameterDirection.ReturnValue; - command.ExecuteNonQuery(); - } - - /// - /// Bug #44960 backslash in string - connector return exeption - /// - [Fact] - public void EscapedBackslash() - { - executeSQL("CREATE TABLE Test(id INT, name VARCHAR(20))"); - - MySqlCommand cmd = new MySqlCommand(@"INSERT INTO Test VALUES (1, '\\=\\')", connection); - cmd.ExecuteNonQuery(); - } - } -} diff --git a/Tests/MySql.Data.Tests/TableCaching.cs b/Tests/MySql.Data.Tests/TableCaching.cs deleted file mode 100644 index 5103dc787..000000000 --- a/Tests/MySql.Data.Tests/TableCaching.cs +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Data; -using System.Threading; -using System.Diagnostics; - -namespace MySql.Data.MySqlClient.Tests -{ - public class TableCaching : TestBase - { - - protected TestSetup ts; - - public TableCaching(TestSetup setup) : base(setup, "tablectests") - { - ts = setup; - } - - [Fact] - public void SimpleTableCaching() - { - executeSQL("CREATE TABLE test (id INT, name VARCHAR(20), name2 VARCHAR(20))"); - executeSQL("INSERT INTO test VALUES (1, 'boo', 'hoo'), (2, 'first', 'last'), (3, 'fred', 'flintstone')"); - -#if !NETCORE10 - MySqlTrace.Listeners.Clear(); - MySqlTrace.Switch.Level = SourceLevels.All; - GenericListener listener = new GenericListener(); - - MySqlTrace.Listeners.Add(listener); - - - string connStr = connection.ConnectionString + ";logging=true;table cache=true"; -#else - string connStr = connection.ConnectionString + ";table cache=true"; -#endif - - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - - MySqlCommand cmd = new MySqlCommand("test", c); - cmd.CommandType = CommandType.TableDirect; - ConsumeReader(cmd); - // now run the query again but this time it shouldn't generate a call to the database - ConsumeReader(cmd); - } -#if !NETCORE10 - Assert.Equal(1, listener.Find("Resultset Opened: field(s) = 3")); -#endif - } - - [Fact] - public void ConnectionStringExpiry() - { - executeSQL("CREATE TABLE test3 (id INT, name VARCHAR(20), name2 VARCHAR(20))"); - executeSQL("INSERT INTO test3 VALUES (1, 'boo', 'hoo'), (2, 'first', 'last'), (3, 'fred', 'flintstone')"); - -#if !NETCORE10 - MySqlTrace.Listeners.Clear(); - MySqlTrace.Switch.Level = SourceLevels.All; - GenericListener listener = new GenericListener(); - MySqlTrace.Listeners.Add(listener); - string connStr = connection.ConnectionString + ";logging=true;table cache=true;default table cache age=1"; -#else - string connStr = connection.ConnectionString + ";table cache=true;default table cache age=1"; -#endif - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - MySqlCommand cmd = new MySqlCommand("test3", c); - cmd.CommandType = CommandType.TableDirect; - ConsumeReader(cmd); - Thread.Sleep(1500); - // now run the query again but this time it should generate a call to the database - // since our next query is past the cache age of 1 second - ConsumeReader(cmd); - } -#if !NETCORE10 - Assert.Equal(2, listener.Find("Resultset Opened: field(s) = 3")); -#endif - } - - [Fact] - public void SettingAgeOnCommand() - { - executeSQL("CREATE TABLE test2 (id INT, name VARCHAR(20), name2 VARCHAR(20))"); - executeSQL("INSERT INTO test2 VALUES (1, 'boo', 'hoo'), (2, 'first', 'last'), (3, 'fred', 'flintstone')"); - -#if !NETCORE10 - MySqlTrace.Listeners.Clear(); - MySqlTrace.Switch.Level = SourceLevels.All; - GenericListener listener = new GenericListener(); - MySqlTrace.Listeners.Add(listener); - string connStr = connection.ConnectionString + ";logging=true;table cache=true;default table cache age=1"; -#else - string connStr = connection.ConnectionString + ";logging=true;table cache=true;default table cache age=1"; -#endif - - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - - MySqlCommand cmd = new MySqlCommand("test2", c); - cmd.CommandType = CommandType.TableDirect; - cmd.CacheAge = 20; - ConsumeReader(cmd); - Thread.Sleep(1000); - // now run the query again but this time it shouldn't generate a call to the database - // since we have overriden the connection string cache age of 1 second and set it - // to 20 seconds on our command - ConsumeReader(cmd); - } -#if !NETCORE10 - Assert.Equal(1, listener.Find("Resultset Opened: field(s) = 3")); -#endif - } - - private void ConsumeReader(MySqlCommand cmd) - { - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - Assert.Equal(1, reader.GetInt32(0)); - Assert.Equal("boo", reader.GetString(1)); - Assert.Equal("hoo", reader.GetString(2)); - reader.Read(); - Assert.Equal(2, reader.GetInt32(0)); - Assert.Equal("first", reader.GetString(1)); - Assert.Equal("last", reader.GetString(2)); - reader.Read(); - Assert.Equal(3, reader.GetInt32(0)); - Assert.Equal("fred", reader.GetString(1)); - Assert.Equal("flintstone", reader.GetString(2)); - Assert.False(reader.Read()); - } - } - } -} diff --git a/Tests/MySql.Data.Tests/TestBase.cs b/Tests/MySql.Data.Tests/TestBase.cs deleted file mode 100644 index 090ccef69..000000000 --- a/Tests/MySql.Data.Tests/TestBase.cs +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Reflection; -using Xunit; - -namespace MySql.Data.MySqlClient.Tests -{ - public class TestBase : IClassFixture, IDisposable - { - protected MySqlConnection connection; - protected MySqlConnection customConnection; - protected TestSetup Setup; - protected string TestNameSpace; - - - public TestBase(TestSetup setup, string ns) - { - Setup = setup; - TestNameSpace = ns; - Init(); - connection = Setup.GetConnection(); - connection.Open(); - } - - protected virtual string Namespace - { - get { return null; } - } - - protected virtual void Init() - { - Setup.Init(Namespace ?? TestNameSpace); - } - - protected MySqlConnectionStringBuilder Settings - { - get { return Setup.Settings; } - } - - protected string CreateUser(string postfix, string pwd) - { - return Setup.CreateUser(postfix, pwd); - } - - protected string CreateDatabase(string postfix) - { - return Setup.CreateDatabase(postfix); - } - - protected MySqlConnectionStringBuilder GetConnectionSettings() - { - return new MySqlConnectionStringBuilder(Settings.GetConnectionString(true)); - } - - protected MySqlConnection GetConnection(bool asRoot=false) - { - return Setup.GetConnection(asRoot); - } - - protected virtual string OnGetConnectionStringInfo() - { - return Settings.GetConnectionString(true); - } - - - protected MySqlDataReader ExecuteAsReader(string sql, MySqlConnection conn) - { - return Setup.ExecuteReader(sql, conn); - } - - protected void executeSQL(string sql) - { - Setup.executeInternal(sql, connection); - } - - protected void executeAsRoot(string sql) - { - Setup.executeInternal(sql, Setup.root); - } - - protected void KillConnection(MySqlConnection c) - { - int threadId = c.ServerThread; - var root = Setup.GetConnection(true); - root.Open(); - MySqlCommand cmd = new MySqlCommand("KILL " + threadId, root); - cmd.ExecuteNonQuery(); - - // the kill flag might need a little prodding to do its thing - try - { - cmd.CommandText = "SELECT 1"; - cmd.Connection = c; - cmd.ExecuteNonQuery(); - } - catch (Exception) { } - - // now wait till the process dies - bool processStillAlive = false; - while (true) - { - MySqlCommand cmdProcess = new MySqlCommand("SHOW PROCESSLIST", root); - MySqlDataReader dr = cmdProcess.ExecuteReader(); - while (dr.Read()) - { - if (dr.GetInt32(0) == threadId) processStillAlive = true; - } - dr.Close(); - - if (!processStillAlive) break; - System.Threading.Thread.Sleep(500); - } - } - - public virtual void Dispose() - { - if (connection != null) - connection.Close(); - if (customConnection != null) - customConnection.Close(); - } - } -} diff --git a/Tests/MySql.Data.Tests/TestDataTable.cs b/Tests/MySql.Data.Tests/TestDataTable.cs deleted file mode 100644 index f67b1015a..000000000 --- a/Tests/MySql.Data.Tests/TestDataTable.cs +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Data; - -namespace MySql.Data.MySqlClient.Tests -{ - public class TestDataTable : DataTable - { - } -} diff --git a/Tests/MySql.Data.Tests/TestSetUp.cs b/Tests/MySql.Data.Tests/TestSetUp.cs deleted file mode 100644 index a02ef5c9b..000000000 --- a/Tests/MySql.Data.Tests/TestSetUp.cs +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright © 2013, 2015 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using Xunit; -using System.Data; - -namespace MySql.Data.MySqlClient.Tests -{ - public class TestSetup : TestSetupClass - { - - public TestSetup() - { - } - - public override void Init(string ns) - { - base.Init(ns); - } - - protected override void LoadBaseConfiguration() - { - base.LoadBaseConfiguration(); - } - - private void InitializeDatabase() - { - CleanupDatabase(); - Settings.Database = CreateDatabase("0"); - Settings.UserID = CreateUser("0", "pwd"); - } - } -} diff --git a/Tests/MySql.Data.Tests/TestSetupClass.cs b/Tests/MySql.Data.Tests/TestSetupClass.cs deleted file mode 100644 index 475d0fb94..000000000 --- a/Tests/MySql.Data.Tests/TestSetupClass.cs +++ /dev/null @@ -1,493 +0,0 @@ -// Copyright © 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using Xunit; -using System.Data; -using System.IO; -using System.Diagnostics; - -namespace MySql.Data.MySqlClient.Tests -{ - public class TestSetupClass : IDisposable - { - public MySqlConnectionStringBuilder Settings; - public MySqlConnectionStringBuilder RootSettings; - public Version version; - public bool firstTime = true; - internal protected int maxPacketSize; - public string baseDBName; - public string baseUserName; - public string testNameSpace; - public MySqlConnection root; - public string pipeName; - public string sharedMemoryName; - public int port; - - internal protected string table; - internal protected string csAdditions = String.Empty; - internal protected bool accessToMySqlDb; - private bool disposed = false; - - public TestSetupClass() - { - } - - public virtual void Init(string ns) - { - if (String.IsNullOrEmpty(ns)) - throw new Exception("No namespace given"); - testNameSpace = ns; - if (firstTime) - LoadBaseConfiguration(); - - pipeName = "MySQLSocket"; - port = 3305; - - MySqlConnection.ClearAllPools(); - InitializeDatabase(); - firstTime = false; - - } - - protected virtual void LoadBaseConfiguration() - { - baseDBName = "db-" + testNameSpace + "-"; - baseUserName ="u-" + (testNameSpace.Length > 10 ? testNameSpace.Substring(0,10) : testNameSpace) + "-"; - var s = new MySqlConnectionStringBuilder(); - -#if NETCORE10 - string port; - - var pathandfile = Path.GetFullPath(@"../..") + @"/appsettings.json"; - var config = new ConfigUtils(pathandfile); - port = config.GetPort(); - - if (!string.IsNullOrEmpty(port)) - { - s.Port = Convert.ToUInt32(port); - } - else - { - s.Port = 3306; - } - -#else - s.Port = 3305; -#endif - - s.UserID = "root"; - s.Password = null; - s.Server = "localhost"; -#if !NETCORE10 - s.SharedMemoryName = "MySQLSocket"; - s.PipeName = "MySQLSocket"; -#endif - s.PersistSecurityInfo = true; - s.AllowUserVariables = true; - s.Pooling = false; - s.SslMode = MySqlSslMode.Preferred; - - RootSettings = new MySqlConnectionStringBuilder(s.GetConnectionString(true)); - Settings = new MySqlConnectionStringBuilder(s.GetConnectionString(true)); - - Settings.Password = "pwd"; - - root = GetConnection(true); - root.Open(); - SetVersion(root.ServerVersion); - executeInternal("SET GLOBAL max_allowed_packet=" + 1000 * 1024, root); - executeInternal("SET GLOBAL SQL_MODE = STRICT_ALL_TABLES", root); - } - - private void InitializeDatabase() - { - CleanupDatabase(); - Settings.Database = CreateDatabase("0"); - Settings.UserID = CreateUser("0", "pwd"); - } - - protected void CleanupDatabase() - { - var data = Utils.FillTable("SHOW DATABASES", root); - foreach (DataRow row in data.Rows) - { - - string name = row[0].ToString(); - if (!name.StartsWith(baseDBName)) continue; - executeInternal(String.Format("DROP DATABASE IF EXISTS `{0}`", name), root); - } - - data = Utils.FillTable(String.Format("SELECT user,host FROM mysql.user WHERE user LIKE '{0}%'", baseUserName), root); - foreach (DataRow row in data.Rows) - { - if (version >= new Version("5.7")) - executeInternal(String.Format("DROP USER IF EXISTS '{0}'@'{1}'", row[0].ToString(), row[1].ToString()), root); - else - executeInternal(String.Format("DROP USER '{0}'@'{1}'", row[0].ToString(), row[1].ToString()), root); - } - executeInternal("FLUSH PRIVILEGES", root); - } - - private void SetVersion(string versionString) - { - int i = 0; - while (i < versionString.Length && - (Char.IsDigit(versionString[i]) || versionString[i] == '.')) - i++; - - version = new Version(versionString.Substring(0, i)); - } - - public MySqlConnection GetConnection(bool asRoot = false) - { - var s = asRoot ? RootSettings : Settings; - return new MySqlConnection(s.GetConnectionString(true)); - } - - public string CreateDatabase(string postfix) - { - string dbName = String.Format("{0}{1}", baseDBName, postfix); - executeInternal(String.Format("CREATE DATABASE `{0}`", dbName), root); - return dbName; - } - - public string DropDatabase(string postfix) - { - string dbName = String.Format("{0}{1}", baseDBName, postfix); - executeInternal(String.Format("DROP DATABASE `{0}`", dbName), root); - return dbName; - } - - - public string CreateUser(string postfix, string password) - { - string userName = String.Format("{0}{1}", baseUserName, postfix); - executeInternal(String.Format("CREATE USER '{0}'@'localhost' IDENTIFIED BY '{1}'", userName, password), root); - executeInternal(String.Format("GRANT ALL ON *.* TO '{0}'@'localhost'", userName), root); - executeInternal("FLUSH PRIVILEGES", root); - return userName; - } - - public MySqlDataReader ExecuteReader(string sql, MySqlConnection conn) - { - if (conn.State != ConnectionState.Open) - conn.Open(); - - MySqlCommand cmd = new MySqlCommand(sql, conn); - return cmd.ExecuteReader(); - - } - - public void executeInternal(string sql, MySqlConnection conn) - { - var cmd = conn.CreateCommand(); - cmd.CommandText = sql; - cmd.ExecuteNonQuery(); - } - - //internal protected virtual void Initialize() - //{ - // // we don't use FileVersion because it's not available - // // on the compact framework - // string fullname = Assembly.GetExecutingAssembly().FullName; - - // string[] parts = fullname.Split(new char[] { '=' }); - // string[] versionParts = parts[1].Split(new char[] { '.' }); - // database0 = String.Format("db{0}{1}{2}-a", versionParts[0], versionParts[1], port - 3300); - // database1 = String.Format("db{0}{1}{2}-b", versionParts[0], versionParts[1], port - 3300); - // MySqlConnection.ClearAllPools(); - //} - - //internal protected virtual string GetConnectionInfo() - //{ - // if (OnGetConnectionStringInfo != null) - // return OnGetConnectionStringInfo(); - // return String.Format(";protocol=sockets;port={0};", port); - //} - - //public delegate string GetConnectionStringInfoCallback(); - - //public event GetConnectionStringInfoCallback OnGetConnectionStringInfo; - - //internal protected string GetConnectionString(string userId, string pw, bool persistSecurityInfo, bool includedb) - //{ - // string connStr = String.Format("server={0};user id={1};pooling=false;" + - // "persist security info={2};connection reset=true;allow user variables=true;port={3};", - // host, userId, persistSecurityInfo.ToString().ToLower(), port); - // if (pw != null) - // connStr += String.Format(";password={0};", pw); - // if (includedb) - // connStr += String.Format("database={0};", database0); - // connStr += GetConnectionInfo(); - // connStr += csAdditions; - // return connStr; - //} - - //internal protected string GetConnectionString(string userId, string pw, bool includedb) - //{ - // return GetConnectionString(userId, pw, true, includedb); - //} - - //internal protected string GetConnectionString(bool includedb) - //{ - // return GetConnectionString(user, password, includedb); - //} - - //protected void Open() - //{ - // string connString = GetConnectionString(true); - // conn = new MySqlConnection(connString); - // conn.Open(); - //} - - //internal protected void suExecSQL(string sql) - //{ - // if (rootConn.State != ConnectionState.Open) - // rootConn.Open(); - - // MySqlCommand cmd = new MySqlCommand(sql, rootConn); - // cmd.ExecuteNonQuery(); - //} - - - //internal protected bool TableExists(string tableName) - //{ - // string[] restrictions = new string[4]; - // restrictions[2] = tableName; - // DataTable dt = conn.GetSchema("Tables", restrictions); - // return dt.Rows.Count > 0; - //} - - - //protected int CountProcesses() - //{ - // MySqlDataAdapter da = new MySqlDataAdapter("SHOW PROCESSLIST", rootConn); - // DataTable dt = new DataTable(); - // da.Fill(dt); - // return dt.Rows.Count; - //} - - //internal protected DataTable FillTable(string sql) - //{ - // MySqlDataAdapter da = new MySqlDataAdapter(sql, conn); - // DataTable dt = new DataTable(); - // da.Fill(dt); - // return dt; - //} - - - - //protected void DropDatabase(string name) - //{ - // for (int i = 0; i < 5; i++) - // { - // try - // { - // executeInternal(String.Format("DROP DATABASE IF EXISTS `{0}`", name), root); - // return; - // } - // catch (Exception) - // { - // System.Threading.Thread.Sleep(1000); - // } - // } - //} - - //protected void CheckOrphanedConnections() - //{ - // // wait up to 5 seconds for our connection to close - // int procs = CountProcesses(); - // for (int x = 0; x < 50; x++) - // { - // if (procs == numProcessesRunning) break; - // System.Threading.Thread.Sleep(100); - // procs = CountProcesses(); - // } - // if (procs > numProcessesRunning) - // { - // KillOrphanedConnections(); - // int temp = CountProcesses(); - // Assert.True(numProcessesRunning == temp, "Killing orphaned connections failed"); - // Assert.True(numProcessesRunning == procs, "Too many processes still running"); - // } - //} - - //protected void KillOrphanedConnections() - //{ - // MySqlDataAdapter da = new MySqlDataAdapter("SHOW PROCESSLIST", rootConn); - // DataTable dt = new DataTable(); - // da.Fill(dt); - // foreach (DataRow row in dt.Rows) - // { - // long id = (long)row[0]; - // if (id == rootConn.ServerThread) continue; - // if (id == conn.ServerThread) continue; - // suExecSQL(String.Format("KILL {0}", id)); - // } - //} - - - internal protected string GetPoolingConnectionString() - { - RootSettings.Database = baseDBName + "0"; - MySqlConnectionStringBuilder csBuilder = new MySqlConnectionStringBuilder(RootSettings.GetConnectionString(false)); - csBuilder.Pooling = true; - return csBuilder.ToString(); - } - - - internal protected void KillConnection(MySqlConnection c) - { - int threadId = c.ServerThread; - var root = GetConnection(true); - root.Open(); - MySqlCommand cmd = new MySqlCommand("KILL " + threadId, root); - cmd.ExecuteNonQuery(); - - // the kill flag might need a little prodding to do its thing - try - { - cmd.CommandText = "SELECT 1"; - cmd.Connection = c; - cmd.ExecuteNonQuery(); - } - catch (Exception) { } - - // now wait till the process dies - bool processStillAlive = false; - while (true) - { - MySqlCommand cmdProcess = new MySqlCommand("SHOW PROCESSLIST", root); - MySqlDataReader dr = cmdProcess.ExecuteReader(); - while (dr.Read()) - { - if (dr.GetInt32(0) == threadId) processStillAlive = true; - } - dr.Close(); - - if (!processStillAlive) break; - System.Threading.Thread.Sleep(500); - } - root.Close(); - } - - internal protected void KillPooledConnection(string connStr) - { - MySqlConnection c = new MySqlConnection(connStr); - c.Open(); - KillConnection(c); - } - - //internal protected void execSQL(string sql) - //{ - // MySqlCommand cmd = new MySqlCommand(sql, conn); - // cmd.ExecuteNonQuery(); - //} - - //internal protected MySqlDataReader execReader(string sql) - //{ - // MySqlCommand cmd = new MySqlCommand(sql, conn); - // return cmd.ExecuteReader(); - //} - - - //internal protected void ExecuteSQLAsRoot(string sql) - //{ - // MySqlScript s = new MySqlScript(rootConn, sql); - // s.Execute(); - //} - - protected virtual void Dispose(bool disposing) - { - if (disposed) - return; - - if (disposing) - { - MySqlConnection.ClearAllPools(); - CleanupDatabase(); - } - - disposed = true; - - } - - public virtual void Dispose() - { - Dispose(true); - } - } - - /// - /// This Setup class changes the initialization semantic to be exeucuted once per unit test, instead of once per Fixture class. - /// - //public class SetUpClassPerTestInit : SetUpClass - //{ - // public SetUpClassPerTestInit() - // { - // // No initialization - // } - - // protected internal override void Init() - // { - // // Does nothing, so constructor of base class does nothing. - // } - //} - - /// - /// This is a companion of the previous class to allow customization before inialization code. - /// - //public class SpecialFixtureWithCustomConnectionString : IClassFixture, IDisposable - //{ - // protected SetUpClassPerTestInit st; - - // public virtual void SetFixture(SetUpClassPerTestInit data) - // { - // st = data; - // st.OnGetConnectionStringInfo += new SetUpClass.GetConnectionStringInfoCallback(OnGetConnectionStringInfo); - // st.MyInit(); - // //if (st.conn.State != ConnectionState.Open) - // // st.conn.Open(); - // } - - // /// - // /// Override to provide special connect options like using pipes, compression, etc. - // /// - // /// - // protected virtual string OnGetConnectionStringInfo() - // { - // return "protocol=sockets;"; - // } - - // public void Dispose() - // { - // Dispose(true); - // } - - // protected virtual void Dispose(bool disposing) - // { - // if (!disposing) return; - // st.Dispose(); - // } - //} -} diff --git a/Tests/MySql.Data.Tests/ThreadingTests.cs b/Tests/MySql.Data.Tests/ThreadingTests.cs deleted file mode 100644 index 7e18d43e3..000000000 --- a/Tests/MySql.Data.Tests/ThreadingTests.cs +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Threading; -using System.Collections; - -namespace MySql.Data.MySqlClient.Tests -{ - public class ThreadingTests : TestBase - { - - protected TestSetup ts; - - public ThreadingTests(TestSetup setup): base(setup, "threadingtests") - { - ts = setup; - TableCache.DumpCache(); - } - - private void MultipleThreadsWorker(object ev) - { - (ev as ManualResetEvent).WaitOne(); - - using (MySqlConnection c = new MySqlConnection(connection.ConnectionString)) - { - c.Open(); - } - } - - /// - /// Bug #17106 MySql.Data.MySqlClient.CharSetMap.GetEncoding thread synchronization issue - /// - [Fact] - public void MultipleThreads() - { - GenericListener myListener = new GenericListener(); - ManualResetEvent ev = new ManualResetEvent(false); - ArrayList threads = new ArrayList(); - System.Diagnostics.Trace.Listeners.Add(myListener); - - for (int i = 0; i < 20; i++) - { - ParameterizedThreadStart ts = new ParameterizedThreadStart(MultipleThreadsWorker); - Thread t = new Thread(ts); - threads.Add(t); - t.Start(ev); - } - // now let the threads go - ev.Set(); - - // wait for the threads to end - int x = 0; - while (x < threads.Count) - { - while ((threads[x] as Thread).IsAlive) - Thread.Sleep(50); - x++; - } - } - - private Exception lastException; - - /// - /// Bug #54012 MySql Connector/NET is not hardened to deal with - /// ThreadAbortException - /// - private void HardenedThreadAbortExceptionWorker() - { - try - { - using (MySqlConnection c = new MySqlConnection(connection.ConnectionString)) - { - c.Open(); - MySqlCommand cmd = new MySqlCommand( - "SELECT BENCHMARK(10000000000,ENCODE('hello','goodbye'))", - c); - // ThreadAbortException is not delivered, when thread is - // stuck in system call. To shorten test time, set command - // timeout to a small value. Note .shortening command timeout - // means we could actually have timeout exception here too, - // but it seems like CLR delivers ThreadAbortException, if - // the thread was aborted. - cmd.CommandTimeout = 2; - cmd.ExecuteNonQuery(); - } - } - catch (Exception e) - { - lastException = e; - } - } - - [Fact] - public void HardenedThreadAbortException() - { - Thread t = new Thread(new ThreadStart(HardenedThreadAbortExceptionWorker)); - t.Name = "Execute Query"; - t.Start(); - Thread.Sleep(500); - t.Abort(); - t.Join(); - - Assert.NotNull(lastException); - - if (lastException is MySqlException) - { - // In some runs the ThreadAbortException comes as an inner exception - lastException = lastException.InnerException; - } - - //Assert.InstanceOf(typeof(ThreadAbortException), lastException); - Assert.IsType(typeof(ThreadAbortException), lastException); - } - } -} diff --git a/Tests/MySql.Data.Tests/TimeoutAndCancel.cs b/Tests/MySql.Data.Tests/TimeoutAndCancel.cs deleted file mode 100644 index a65e18f97..000000000 --- a/Tests/MySql.Data.Tests/TimeoutAndCancel.cs +++ /dev/null @@ -1,362 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Threading; -using System.Data; -using System.Globalization; -using System.IO; -using System.ComponentModel; - -namespace MySql.Data.MySqlClient.Tests -{ - public class TimeoutAndCancel : TestBase - { - private delegate void CommandInvokerDelegate(MySqlCommand cmdToRun); - private ManualResetEvent resetEvent = new ManualResetEvent(false); - private Version version; - - public TimeoutAndCancel(TestSetup setup): base(setup, "timeoutandcancel") - { - version = setup.version; - } - - protected TimeoutAndCancel(TestSetup setup, string nameSpace) : base(setup, nameSpace) - { - version = setup.version; - } - - - private void CommandRunner(MySqlCommand cmdToRun) - { - object o = cmdToRun.ExecuteScalar(); - resetEvent.Set(); - Assert.Null(o); - } - - [Fact] - public void CancelSingleQuery() - { - if (version < new Version(5, 0)) return; - - // first we need a routine that will run for a bit - executeSQL(@"CREATE PROCEDURE spTest(duration INT) - BEGIN - SELECT SLEEP(duration); - END"); - - MySqlCommand cmd = new MySqlCommand("spTest", connection); - cmd.CommandType = CommandType.StoredProcedure; - cmd.Parameters.AddWithValue("duration", 10); - - // now we start execution of the command - CommandInvokerDelegate d = new CommandInvokerDelegate(CommandRunner); - d.BeginInvoke(cmd, null, null); - - // sleep 1 seconds - Thread.Sleep(1000); - - // now cancel the command - cmd.Cancel(); - - Assert.True(resetEvent.WaitOne(30 * 1000), "timeout"); - } - - int stateChangeCount; - [Fact] - public void WaitTimeoutExpiring() - { - string connStr = connection.ConnectionString; - MySqlConnectionStringBuilder sb = new MySqlConnectionStringBuilder(connStr); - - if (sb.ConnectionProtocol == MySqlConnectionProtocol.NamedPipe) - // wait timeout does not work for named pipe connections - return; - - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - c.StateChange += new StateChangeEventHandler(c_StateChange); - - // set the session wait timeout on this new connection - MySqlCommand cmd = new MySqlCommand("SET SESSION interactive_timeout=3", c); - cmd.ExecuteNonQuery(); - cmd.CommandText = "SET SESSION wait_timeout=2"; - cmd.ExecuteNonQuery(); - - stateChangeCount = 0; - // now wait 4 seconds - Thread.Sleep(4000); - - try - { - cmd.CommandText = "SELECT now()"; - cmd.ExecuteScalar(); - } - catch (Exception ex) - { - Assert.True(ex.Message.StartsWith("Fatal", StringComparison.OrdinalIgnoreCase)); - } - - Assert.Equal(1, stateChangeCount); - Assert.Equal(ConnectionState.Closed, c.State); - } - - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - MySqlCommand cmd = new MySqlCommand("SELECT now() as thetime, database() as db", c); - using (MySqlDataReader r = cmd.ExecuteReader()) - { - Assert.True(r.Read()); - } - } - } - - void c_StateChange(object sender, StateChangeEventArgs e) - { - stateChangeCount++; - } - - [Fact] - public void TimeoutExpiring() - { - if (version < new Version(5, 0)) return; - - DateTime start = DateTime.Now; - MySqlCommand cmd = new MySqlCommand("SELECT SLEEP(5)", connection); - cmd.CommandTimeout = 1; - Exception ex = Assert.Throws(() => cmd.ExecuteNonQuery()); - Assert.True(ex.Message.StartsWith("Fatal error encountered during", StringComparison.OrdinalIgnoreCase), "Message is wrong " + ex.Message); - } - - [Fact] - public void TimeoutNotExpiring() - { - if (version < new Version(5, 0)) return; - - MySqlCommand cmd = new MySqlCommand("SELECT SLEEP(1)", connection); - cmd.CommandTimeout = 2; - cmd.ExecuteNonQuery(); - } - - [Fact] - public void TimeoutNotExpiring2() - { - if (version < new Version(5, 0)) return; - - MySqlCommand cmd = new MySqlCommand("SELECT SLEEP(1)", connection); - cmd.CommandTimeout = 0; // infinite timeout - cmd.ExecuteNonQuery(); - } - - [Fact] - public void TimeoutDuringBatch() - { - if (version < new Version(5, 0)) return; - - executeSQL(@"CREATE PROCEDURE spTest(duration INT) - BEGIN - SELECT SLEEP(duration); - END"); - - executeSQL("CREATE TABLE test (id INT)"); - - MySqlCommand cmd = new MySqlCommand( - "call spTest(5);INSERT INTO test VALUES(4)", connection); - cmd.CommandTimeout = 2; - //try - //{ - Exception ex = Assert.Throws(() => cmd.ExecuteNonQuery()); - // Assert.Fail("This should have timed out"); - //} - //catch (MySqlException ex) - //{ - Assert.True(ex.Message.StartsWith("Timeout expired", StringComparison.OrdinalIgnoreCase), "Message is wrong" + ex); - //} - - // Check that connection is still usable - MySqlCommand cmd2 = new MySqlCommand("select 10", connection); - long res = (long)cmd2.ExecuteScalar(); - Assert.Equal(10, res); - } - - [Fact] - public void CancelSelect() - { - if (version < new Version(5, 0)) return; - - executeSQL("CREATE TABLE Test (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20))"); - for (int i = 0; i < 1000; i++) - executeSQL("INSERT INTO Test VALUES (NULL, 'my string')"); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", connection); - cmd.CommandTimeout = 0; - int rows = 0; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - - cmd.Cancel(); - - while (true) - { - - try - { - if (!reader.Read()) - break; - rows++; - } - catch (MySqlException ex) - { - Assert.True(ex.Number == (int)MySqlErrorCode.QueryInterrupted); - if (rows < 1000) - { - bool readOK = reader.Read(); - Assert.False(readOK); - } - } - - } - } - Assert.True(rows < 1000); - } - - /// - /// Bug #40091 mysql driver 5.2.3.0 connection pooling issue - /// - [Fact (Skip = "Issue")] - public void ConnectionStringModifiedAfterCancel() - { - if (version.Major < 5) return; - - string connStr = "server=localhost;userid=root;pwd=;database=test;port=3305;persist security info=true"; - MySqlConnectionStringBuilder sb = new MySqlConnectionStringBuilder(connStr); - - if (sb.ConnectionProtocol == MySqlConnectionProtocol.NamedPipe) - // idle named pipe connections cannot be KILLed (server bug#47571) - return; - - connStr = connStr.Replace("persist security info=true", "persist security info=false"); - - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - string connStr1 = c.ConnectionString; - - MySqlCommand cmd = new MySqlCommand("SELECT SLEEP(5)", c); - cmd.CommandTimeout = 1; - try - { - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - } - } - catch (MySqlException ex) - { - Assert.True(ex.InnerException is TimeoutException); - Assert.True(c.State == ConnectionState.Open); - } - string connStr2 = c.ConnectionString.ToLower(CultureInfo.InvariantCulture); - Assert.Equal(connStr1.ToLower(CultureInfo.InvariantCulture), connStr2); - c.Close(); - } - - } - - - /// - /// Bug #45978 Silent problem when net_write_timeout is exceeded - /// - [Fact] - public void NetWriteTimeoutExpiring() - { - // net_write_timeout did not apply to named pipes connections before MySQL 5.1.41. - if (version < new Version(5, 1, 41) && (connection.ConnectionString.IndexOf("protocol=namedpipe") >= 0 || connection.ConnectionString.IndexOf("protocol=sharedmemory") >= 0)) return; - - executeSQL("CREATE TABLE Test(id int, blob1 longblob)"); - int rows = 1000; - byte[] b1 = Utils.CreateBlob(5000); - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (@id, @b1)", connection); - cmd.Parameters.Add("@id", MySqlDbType.Int32); - cmd.Parameters.AddWithValue("@name", b1); - for (int i = 0; i < rows; i++) - { - cmd.Parameters[0].Value = i; - cmd.ExecuteNonQuery(); - } - - string connStr = connection.ConnectionString; - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - cmd.Connection = c; - cmd.Parameters.Clear(); - cmd.CommandText = "SET net_write_timeout = 1"; - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT * FROM Test LIMIT " + rows; - int i = 0; - - try - { - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - // after this several cycles of DataReader.Read() are executed - // normally and then the problem, described above, occurs - for (; i < rows; i++) - { - Assert.False(!reader.Read(),"unexpected 'false' from reader.Read"); - if (i % 10 == 0) - Thread.Sleep(1); - object v = reader.GetValue(1); - } - } - } - catch (Exception e) - { - Exception currentException = e; - while (currentException != null) - { - if (currentException is EndOfStreamException) - return; - - if ((connection.ConnectionString.IndexOf("protocol=namedpipe") >= 0 || connection.ConnectionString.IndexOf("protocol=sharedmemory") >= 0) && currentException is MySqlException) - return; - - currentException = currentException.InnerException; - } - - throw e; - } - - // IT is relatively hard to predict where - Console.WriteLine("Warning: all reads completed!"); - Assert.True(i == rows); - } - } - } -} diff --git a/Tests/MySql.Data.Tests/Tokenizer.cs b/Tests/MySql.Data.Tests/Tokenizer.cs deleted file mode 100644 index 666616fbb..000000000 --- a/Tests/MySql.Data.Tests/Tokenizer.cs +++ /dev/null @@ -1,296 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; - -namespace MySql.Data.MySqlClient.Tests -{ - public class Tokenizer : TestBase - { - public Tokenizer(TestSetup setup) : base(setup, "tokenizer") - { - - } - - [Fact] - public void Simple() - { - SqlTokenizer tokenizer = new SqlTokenizer("SELECT * FROM Test"); - Assert.Equal("SELECT", tokenizer.NextToken()); - Assert.Equal("*", tokenizer.NextToken()); - Assert.Equal("FROM", tokenizer.NextToken()); - Assert.Equal("Test", tokenizer.NextToken()); - Assert.Null(tokenizer.NextToken()); - } - - [Fact] - public void DashSingleLineComment() - { - string comment = "-- this is my comment\r\n"; - string sql = String.Format("SELECT {0} * FROM Test", comment); - SqlTokenizer tokenizer = new SqlTokenizer(sql); - tokenizer.ReturnComments = true; - Assert.Equal("SELECT", tokenizer.NextToken()); - Assert.Equal(comment, tokenizer.NextToken()); - Assert.Equal("*", tokenizer.NextToken()); - Assert.Equal("FROM", tokenizer.NextToken()); - Assert.Equal("Test", tokenizer.NextToken()); - Assert.Null(tokenizer.NextToken()); - - tokenizer = new SqlTokenizer(sql); - tokenizer.ReturnComments = false; - Assert.Equal("SELECT", tokenizer.NextToken()); - Assert.Equal("*", tokenizer.NextToken()); - Assert.Equal("FROM", tokenizer.NextToken()); - Assert.Equal("Test", tokenizer.NextToken()); - Assert.Null(tokenizer.NextToken()); - } - - [Fact] - public void HashSingleLineComment() - { - string comment = "#this is my comment\r\n"; - string sql = String.Format("SELECT {0} * FROM Test", comment); - SqlTokenizer tokenizer = new SqlTokenizer(sql); - tokenizer.ReturnComments = true; - Assert.Equal("SELECT", tokenizer.NextToken()); - Assert.Equal(comment, tokenizer.NextToken()); - Assert.Equal("*", tokenizer.NextToken()); - Assert.Equal("FROM", tokenizer.NextToken()); - Assert.Equal("Test", tokenizer.NextToken()); - Assert.Null(tokenizer.NextToken()); - - tokenizer = new SqlTokenizer(sql); - tokenizer.ReturnComments = false; - Assert.Equal("SELECT", tokenizer.NextToken()); - Assert.Equal("*", tokenizer.NextToken()); - Assert.Equal("FROM", tokenizer.NextToken()); - Assert.Equal("Test", tokenizer.NextToken()); - Assert.Null(tokenizer.NextToken()); - } - - [Fact] - public void MultiLineComment() - { - string comment = "/* this is my comment \r\n lines 2 \r\n line 3*/"; - string sql = String.Format("SELECT{0} * FROM Test", comment); - SqlTokenizer tokenizer = new SqlTokenizer(sql); - tokenizer.ReturnComments = true; - Assert.Equal("SELECT", tokenizer.NextToken()); - Assert.Equal(comment.Trim(), tokenizer.NextToken()); - Assert.Equal("*", tokenizer.NextToken()); - Assert.Equal("FROM", tokenizer.NextToken()); - Assert.Equal("Test", tokenizer.NextToken()); - Assert.Null(tokenizer.NextToken()); - - tokenizer = new SqlTokenizer(sql); - tokenizer.ReturnComments = false; - Assert.Equal("SELECT", tokenizer.NextToken()); - Assert.Equal("*", tokenizer.NextToken()); - Assert.Equal("FROM", tokenizer.NextToken()); - Assert.Equal("Test", tokenizer.NextToken()); - Assert.Null(tokenizer.NextToken()); - } - - [Fact] - public void Parameter() - { - string sql = "SELECT * FROM Test WHERE id=@id AND id2=?id2"; - SqlTokenizer tokenizer = new SqlTokenizer(sql); - tokenizer.ReturnComments = true; - Assert.Equal("SELECT", tokenizer.NextToken()); - Assert.Equal("*", tokenizer.NextToken()); - Assert.Equal("FROM", tokenizer.NextToken()); - Assert.Equal("Test", tokenizer.NextToken()); - Assert.Equal("WHERE", tokenizer.NextToken()); - Assert.Equal("id", tokenizer.NextToken()); - Assert.Equal("=", tokenizer.NextToken()); - Assert.Equal("@id", tokenizer.NextToken()); - Assert.Equal("AND", tokenizer.NextToken()); - Assert.Equal("id2", tokenizer.NextToken()); - Assert.Equal("=", tokenizer.NextToken()); - Assert.Equal("?id2", tokenizer.NextToken()); - Assert.Null(tokenizer.NextToken()); - } - - [Fact] - public void NextParameter() - { - string sql = "SELECT * FROM Test WHERE id=@id AND id2=?id2"; - SqlTokenizer tokenizer = new SqlTokenizer(sql); - tokenizer.ReturnComments = true; - Assert.Equal("@id", tokenizer.NextParameter()); - Assert.Equal("?id2", tokenizer.NextParameter()); - Assert.Null(tokenizer.NextParameter()); - } - - [Fact] - public void ParameterWithSpecialCharacters() - { - string sql = "SELECT * FROM Test WHERE id=@id_$123"; - SqlTokenizer tokenizer = new SqlTokenizer(sql); - tokenizer.ReturnComments = true; - Assert.Equal("SELECT", tokenizer.NextToken()); - Assert.Equal("*", tokenizer.NextToken()); - Assert.Equal("FROM", tokenizer.NextToken()); - Assert.Equal("Test", tokenizer.NextToken()); - Assert.Equal("WHERE", tokenizer.NextToken()); - Assert.Equal("id", tokenizer.NextToken()); - Assert.Equal("=", tokenizer.NextToken()); - Assert.Equal("@id_$123", tokenizer.NextToken()); - Assert.Null(tokenizer.NextToken()); - } - - [Fact] - public void StringLiteral() - { - string sql = "SELECT 'a', 1, 'b'"; - SqlTokenizer tokenizer = new SqlTokenizer(sql); - tokenizer.ReturnComments = false; - Assert.Equal("SELECT", tokenizer.NextToken()); - Assert.Equal("'a'", tokenizer.NextToken()); - Assert.Equal(",", tokenizer.NextToken()); - Assert.Equal("1", tokenizer.NextToken()); - Assert.Equal(",", tokenizer.NextToken()); - Assert.Equal("'b'", tokenizer.NextToken()); - Assert.Null(tokenizer.NextToken()); - } - - [Fact] - public void UserVariable() - { - string sql = "SELECT 'a', 1, @@myVar"; - SqlTokenizer tokenizer = new SqlTokenizer(sql); - tokenizer.ReturnComments = false; - Assert.Equal("SELECT", tokenizer.NextToken()); - Assert.Equal("'a'", tokenizer.NextToken()); - Assert.Equal(",", tokenizer.NextToken()); - Assert.Equal("1", tokenizer.NextToken()); - Assert.Equal(",", tokenizer.NextToken()); - Assert.Equal("@@myVar", tokenizer.NextToken()); - Assert.Null(tokenizer.NextToken()); - } - - [Fact] - public void AnsiQuotes() - { - string sql = "SELECT 'a', \"a\", `a`"; - SqlTokenizer tokenizer = new SqlTokenizer(sql); - tokenizer.AnsiQuotes = false; - Assert.Equal("SELECT", tokenizer.NextToken()); - Assert.Equal("'a'", tokenizer.NextToken()); - Assert.True(tokenizer.Quoted); - Assert.Equal(",", tokenizer.NextToken()); - Assert.Equal("\"a\"", tokenizer.NextToken()); - Assert.True(tokenizer.Quoted); - Assert.Equal(",", tokenizer.NextToken()); - Assert.Equal("`a`", tokenizer.NextToken()); - Assert.True(tokenizer.Quoted); - Assert.Null(tokenizer.NextToken()); - } - - [Fact] - public void ParseProcBody() - { - string sql = "CREATE PROCEDURE spTest(testid INT, testname VARCHAR(20)) BEGIN SELECT 1; END"; - SqlTokenizer tokenizer = new SqlTokenizer(sql); - tokenizer.AnsiQuotes = false; - Assert.Equal("CREATE", tokenizer.NextToken()); - Assert.Equal("PROCEDURE", tokenizer.NextToken()); - Assert.Equal("spTest", tokenizer.NextToken()); - Assert.Equal("(", tokenizer.NextToken()); - Assert.Equal("testid", tokenizer.NextToken()); - Assert.Equal("INT", tokenizer.NextToken()); - Assert.Equal(",", tokenizer.NextToken()); - Assert.Equal("testname", tokenizer.NextToken()); - Assert.Equal("VARCHAR", tokenizer.NextToken()); - Assert.Equal("(", tokenizer.NextToken()); - Assert.Equal("20", tokenizer.NextToken()); - Assert.Equal(")", tokenizer.NextToken()); - Assert.Equal(")", tokenizer.NextToken()); - Assert.Equal("BEGIN", tokenizer.NextToken()); - Assert.Equal("SELECT", tokenizer.NextToken()); - Assert.Equal("1", tokenizer.NextToken()); - Assert.Equal(";", tokenizer.NextToken()); - Assert.Equal("END", tokenizer.NextToken()); - Assert.Null(tokenizer.NextToken()); - } - - /// - /// Bug #44318 Tokenizer - /// - [Fact] - public void NoSpaceAroundEquals() - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test(name VARCHAR(40))"); - - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test SET name='test -- test';", connection); - cmd.ExecuteNonQuery(); - cmd.CommandText = "SELECT name FROM Test"; - object o = cmd.ExecuteScalar(); - Assert.Equal("test -- test", o); - - cmd.CommandText = "UPDATE Test SET name='Can you explain this ?';"; - cmd.ExecuteNonQuery(); - cmd.CommandText = "SELECT name FROM Test"; - o = cmd.ExecuteScalar(); - Assert.Equal("Can you explain this ?", o); - } - - [Fact] - public void Slash() - { - string sql = "AND // OR"; - SqlTokenizer tokenizer = new SqlTokenizer(sql); - tokenizer.AnsiQuotes = false; - Assert.Equal("AND", tokenizer.NextToken()); - Assert.Equal("/", tokenizer.NextToken()); - Assert.Equal("/", tokenizer.NextToken()); - Assert.Equal("OR", tokenizer.NextToken()); - Assert.Null(tokenizer.NextToken()); - } - - [Fact] - public void SqlServerMode() - { - string sql = "SELECT `a`, [id], [name] FROM [Fact]"; - SqlTokenizer tokenizer = new SqlTokenizer(sql); - tokenizer.SqlServerMode = true; - tokenizer.NextToken(); - Assert.Equal("`a`", tokenizer.NextToken()); - Assert.True(tokenizer.Quoted); - tokenizer.NextToken(); // read , - Assert.Equal("[id]", tokenizer.NextToken()); - Assert.True(tokenizer.Quoted); - tokenizer.NextToken(); // read , - Assert.Equal("[name]", tokenizer.NextToken()); - Assert.True(tokenizer.Quoted); - tokenizer.NextToken(); // read FROM - Assert.Equal("[Fact]", tokenizer.NextToken()); - Assert.True(tokenizer.Quoted); - } - } -} diff --git a/Tests/MySql.Data.Tests/Transactions.cs b/Tests/MySql.Data.Tests/Transactions.cs deleted file mode 100644 index b65793feb..000000000 --- a/Tests/MySql.Data.Tests/Transactions.cs +++ /dev/null @@ -1,748 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -#if !NETCORE10 -using System.Transactions; -using System.Data.Common; -#endif -using System.Data; -using System.Threading; -using System.Diagnostics; - -namespace MySql.Data.MySqlClient.Tests -{ - public class Transactions : TestBase - { - protected TestSetup ts; - public Transactions(TestSetup setup): base (setup, "transactions") - { - ts = setup; - } - -#if !NETCORE10 - void TransactionScopeInternal(bool commit) - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (key2 VARCHAR(1), name VARCHAR(100), name2 VARCHAR(100))"); - using (MySqlConnection c = new MySqlConnection(connection.ConnectionString)) - { - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES ('a', 'name', 'name2')", c); - - using (TransactionScope ts = new TransactionScope()) - { - c.Open(); - cmd.ExecuteNonQuery(); - if (commit) - ts.Complete(); - } - - cmd.CommandText = "SELECT COUNT(*) FROM Test"; - object count = cmd.ExecuteScalar(); - Assert.Equal(commit ? 1 : 0, Convert.ToInt32(count)); - } - } - - [Fact] - public void TransactionScopeRollback() - { - TransactionScopeInternal(false); - } - - [Fact] - public void TransactionScopeCommit() - { - TransactionScopeInternal(true); - } - - /// - /// Bug #34448 Connector .Net 5.2.0 with Transactionscope doesn´t use specified IsolationLevel - /// - [Fact] - public void TransactionScopeWithIsolationLevel() - { - TransactionOptions opts = new TransactionOptions(); - opts.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted; - - using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, opts)) - { - string connStr = connection.ConnectionString; - using (MySqlConnection myconn = new MySqlConnection(connStr)) - { - myconn.Open(); - MySqlCommand cmd = new MySqlCommand("SHOW VARIABLES LIKE 'tx_isolation'", myconn); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - string level = reader.GetString(1); - Assert.Equal("READ-COMMITTED", level); - } - } - } - } -#endif - - /// - /// Bug #27289 Transaction is not rolledback when connection close - /// - [Fact] - public void RollingBackOnClose() - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (id INT) ENGINE=InnoDB"); - - string connStr = ts.GetPoolingConnectionString(); - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - MySqlCommand cmd = new MySqlCommand("INSERT INTO Test VALUES (1)", c); - c.BeginTransaction(); - cmd.ExecuteNonQuery(); - } - - using (MySqlConnection c2 = new MySqlConnection(connStr)) - { - c2.Open(); - MySqlCommand cmd2 = new MySqlCommand("SELECT COUNT(*) from Test", c2); - c2.BeginTransaction(); - object count = cmd2.ExecuteScalar(); - Assert.Equal(0, Convert.ToInt32(count)); - } - - MySqlConnection connection = new MySqlConnection(connStr); - connection.Open(); - ts.KillConnection(connection); - } - - /// - /// NullReferenceException thrown on TransactionScope dispose - /// -// [Fact] -// public void LockedTable() -// { - -// Debug.Print("Enter LockedTable"); - -// string connStr = st.GetConnectionString(true); - -// executeSQL("DROP TABLE IF EXISTS t1"); -// executeSQL("DROP TABLE IF EXISTS t2"); - -// connStr = String.Format(@"Use Affected Rows=true;allow user variables=yes;Server=localhost;Port={0}; -// Database={1};Uid=root;Connect Timeout=35;default command timeout=90;charset=utf8", st.port, st.database0); - - -// executeSQL(@"CREATE TABLE `t1` ( -// `Key` int(10) unsigned NOT NULL auto_increment, -// `Val` varchar(100) NOT NULL, -// `Val2` varchar(100) NOT NULL default '', -// PRIMARY KEY (`Key`) -// ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=latin1"); -// executeSQL(@"CREATE TABLE `t2` ( -// `Key` int(10) unsigned NOT NULL auto_increment, -// `Val` varchar(100) NOT NULL, -// PRIMARY KEY (`Key`) -// ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1"); - -// executeSQL("lock tables t2 read"); - -// using (TransactionScope scope = new TransactionScope()) -// { -// using (MySqlConnection conn = new MySqlConnection(connStr)) -// using (MySqlCommand cmd = conn.CreateCommand()) -// { -// conn.Open(); -// cmd.CommandText = @"insert into t1 (Val,Val2) values (?value1, ?value2)"; ; -// cmd.CommandTimeout = 5; -// cmd.Parameters.AddWithValue("?value1", new Random().Next()); -// cmd.Parameters.AddWithValue("?value2", new Random().Next()); -// cmd.ExecuteNonQuery(); -// } - -// using (MySqlConnection conn = new MySqlConnection(connStr)) -// using (MySqlCommand cmd = conn.CreateCommand()) -// { -// conn.Open(); -// cmd.CommandText = @"insert into t2 (Val) values (?value)"; -// cmd.CommandTimeout = 5; -// cmd.Parameters.AddWithValue("?value", new Random().Next()); -// Exception ex = Assert.Throws(() => cmd.ExecuteNonQuery()); -// Assert.Equal(ex.Message, "Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding."); -// } - -// scope.Complete(); -// } - -// MySqlPoolManager.ClearAllPools(); - -// Debug.Print("Out LockedTable"); -// } - - -#if !NETCORE10 - /// - /// Bug #22042 mysql-connector-net-5.0.0-alpha BeginTransaction - /// - [Fact] - public void Bug22042() - { - DbProviderFactory factory = - new MySql.Data.MySqlClient.MySqlClientFactory(); - using (DbConnection conexion = factory.CreateConnection()) - { - conexion.ConnectionString = connection.ConnectionString; - conexion.Open(); - DbTransaction trans = conexion.BeginTransaction(); - trans.Rollback(); - } - } - - /// - /// Bug #26754 EnlistTransaction throws false MySqlExeption "Already enlisted" - /// - [Fact] - public void EnlistTransactionNullTest() - { - try - { - MySqlCommand cmd = new MySqlCommand(); - cmd.Connection = connection; - cmd.Connection.EnlistTransaction(null); - } - catch { } - - using (TransactionScope ts = new TransactionScope()) - { - MySqlCommand cmd = new MySqlCommand(); - cmd.Connection = connection; - cmd.Connection.EnlistTransaction(Transaction.Current); - } - } - - /// - /// Bug #26754 EnlistTransaction throws false MySqlExeption "Already enlisted" - /// - [Fact] - public void EnlistTransactionWNestedTrxTest() - { - MySqlTransaction t = connection.BeginTransaction(); - - using (TransactionScope ts = new TransactionScope()) - { - MySqlCommand cmd = new MySqlCommand(); - cmd.Connection = connection; - try - { - cmd.Connection.EnlistTransaction(Transaction.Current); - } - catch (InvalidOperationException) - { - /* caught NoNestedTransactions */ - } - } - - t.Rollback(); - - using (TransactionScope ts = new TransactionScope()) - { - MySqlCommand cmd = new MySqlCommand(); - cmd.Connection = connection; - cmd.Connection.EnlistTransaction(Transaction.Current); - } - } - - [Fact] - public void ManualEnlistment() - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (key2 VARCHAR(1), name VARCHAR(100), name2 VARCHAR(100))"); - string connStr = connection.ConnectionString + ";auto enlist=false"; - MySqlConnection c = null; - using (TransactionScope ts = new TransactionScope()) - { - c = new MySqlConnection(connStr); - c.Open(); - MySqlCommand cmd = new MySqlCommand("LOCK TABLES test WRITE;", c); - cmd.ExecuteNonQuery(); - cmd = new MySqlCommand("INSERT INTO Test VALUES ('a', 'name', 'name2')", c); - cmd.ExecuteNonQuery(); - executeSQL("UNLOCK TABLES"); - } - MySqlCommand cmd2 = new MySqlCommand("LOCK TABLES test READ; SELECT COUNT(*) FROM test", c); - Assert.Equal(1, Convert.ToInt32(cmd2.ExecuteScalar())); - executeSQL("UNLOCK TABLES"); - c.Dispose(); - ts.KillPooledConnection(connStr); - } - - private void ManuallyEnlistingInitialConnection(bool complete) - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (key2 VARCHAR(1), name VARCHAR(100), name2 VARCHAR(100))"); - string connStr = connection.ConnectionString + ";auto enlist=false"; - - using (TransactionScope ts = new TransactionScope()) - { - using (MySqlConnection c1 = new MySqlConnection(connStr)) - { - c1.Open(); - c1.EnlistTransaction(Transaction.Current); - MySqlCommand cmd1 = new MySqlCommand("INSERT INTO Test (key2) VALUES ('a')", c1); - cmd1.ExecuteNonQuery(); - } - - using (MySqlConnection c2 = new MySqlConnection(connStr)) - { - c2.Open(); - c2.EnlistTransaction(Transaction.Current); - MySqlCommand cmd2 = new MySqlCommand("INSERT INTO Test (key2) VALUES ('b')", c2); - cmd2.ExecuteNonQuery(); - } - if (complete) - ts.Complete(); - } - - ts.KillPooledConnection(connStr); - } - - [Fact] - public void ManuallyEnlistingInitialConnectionTest() - { - ManuallyEnlistingInitialConnection(true); - } - - [Fact] - public void ManuallyEnlistingInitialConnectionNoComplete() - { - ManuallyEnlistingInitialConnection(false); - } - - [Fact] - public void ManualEnlistmentWithActiveConnection() - { - using (TransactionScope ts = new TransactionScope()) - { - string connStr = connection.ConnectionString; - - using (MySqlConnection c1 = new MySqlConnection(connStr)) - { - c1.Open(); - - connStr += "; auto enlist=false"; - using (MySqlConnection c2 = new MySqlConnection(connStr)) - { - c2.Open(); - try - { - c2.EnlistTransaction(Transaction.Current); - } - catch (NotSupportedException) - { - } - } - } - } - } - - [Fact] - public void AttemptToEnlistTwoConnections() - { - using (TransactionScope ts = new TransactionScope()) - { - string connStr = connection.ConnectionString; - - using (MySqlConnection c1 = new MySqlConnection(connStr)) - { - c1.Open(); - - using (MySqlConnection c2 = new MySqlConnection(connStr)) - { - try - { - c2.Open(); - } - catch (NotSupportedException) - { - } - } - } - } - } - - - private void NestedScopeInternalTest( - TransactionScopeOption nestedOption, - bool innerComplete, - bool outerComplete, - bool expectInnerChangesVisible, - bool expectOuterChangesVisible) - { - executeSQL("CREATE TABLE T(str varchar(10))"); - try - { - using (TransactionScope outer = new TransactionScope()) - { - string connStr = connection.ConnectionString; - using (MySqlConnection c1 = new MySqlConnection(connStr)) - { - c1.Open(); - //MySqlCommand cmd1 = new MySqlCommand("LOCK TABLES T WRITE;", c1); - //cmd1.ExecuteNonQuery(); - MySqlCommand cmd1 = new MySqlCommand("INSERT INTO T VALUES ('outer')", c1); - cmd1.ExecuteNonQuery(); - //cmd1 = new MySqlCommand("UNLOCK TABLES", c1); - //cmd1.ExecuteNonQuery(); - using (TransactionScope inner = new TransactionScope(nestedOption)) - { - - MySqlConnection c2; - if (nestedOption == TransactionScopeOption.Required) - { - // inner scope joins already running ambient - // transaction, we cannot use new connection here - c2 = c1; - } - else - { - // when TransactionScopeOption.RequiresNew or - // new TransactionScopeOption.Suppress is used, - // we have to use a new transaction. We create a - // new connection for it. - c2 = new MySqlConnection(connStr); - c2.Open(); - } - //MySqlCommand cmd2 = new MySqlCommand("LOCK TABLES T WRITE;", c2); - //cmd2.ExecuteNonQuery(); - MySqlCommand cmd2 = new MySqlCommand("INSERT INTO T VALUES ('inner')", c2); - cmd2.ExecuteNonQuery(); - //cmd2 = new MySqlCommand("UNLOCK TABLES", c2); - //cmd2.ExecuteNonQuery(); - if (innerComplete) - { - inner.Complete(); - } - - // Dispose connection if it was created. - if (c2 != c1) - c2.Dispose(); - } - } - - if (outerComplete) - outer.Complete(); - - } - bool innerChangesVisible = - ((long)MySqlHelper.ExecuteScalar(connection, "select count(*) from T where str = 'inner'") == 1); - bool outerChangesVisible = - ((long)MySqlHelper.ExecuteScalar(connection, "select count(*) from T where str = 'outer'") == 1); - Assert.Equal(innerChangesVisible, expectInnerChangesVisible); - Assert.Equal(outerChangesVisible, expectOuterChangesVisible); - } - finally - { - MySqlHelper.ExecuteNonQuery(connection, "DROP TABLE T"); - } - } - - /// - /// Test inner/outer scope behavior, with different scope options, - /// completing either inner or outer scope, or both. - /// - [Fact] - public void NestedScope() - { - // inner scope joins the ambient scope, neither inner not outer scope completes - // Expect empty table. - NestedScopeInternalTest(TransactionScopeOption.Required, false, false, false, false); - - // inner scope joins the ambient scope, inner does not complete, outer completes - // Expect exception while disposing outer transaction - //try - //{ - Assert.Throws(() => NestedScopeInternalTest(TransactionScopeOption.Required, false, true, false, false)); - //} - //catch (TransactionAbortedException) - //{ - //} - - // inner scope joins the ambient scope, inner completes, outer does not - // Expect empty table. - NestedScopeInternalTest(TransactionScopeOption.Required, true, false, false, false); - - // inner scope joins the ambient scope, both complete. - // Expect table with entries for inner and outer scope - NestedScopeInternalTest(TransactionScopeOption.Required, true, true, true, true); - - - - // inner scope creates new transaction, neither inner not outer scope completes - // Expect empty table. - NestedScopeInternalTest(TransactionScopeOption.RequiresNew, false, false, false, false); - - // inner scope creates new transaction, inner does not complete, outer completes - // Expect changes by outer transaction visible ?? - NestedScopeInternalTest(TransactionScopeOption.RequiresNew, false, true, false, true); - - // inner scope creates new transactiion, inner completes, outer does not - // Expect changes by inner transaction visible - NestedScopeInternalTest(TransactionScopeOption.RequiresNew, true, false, true, false); - - // inner scope creates new transaction, both complete - NestedScopeInternalTest(TransactionScopeOption.RequiresNew, true, true, true, true); - - - // inner scope suppresses transaction, neither inner not outer scope completes - // Expect changes made by inner scope to be visible - NestedScopeInternalTest(TransactionScopeOption.Suppress, false, false, true, false); - - // inner scope supresses transaction, inner does not complete, outer completes - // Expect changes by inner scope to be visible ?? - NestedScopeInternalTest(TransactionScopeOption.Suppress, true, false, true, false); - - // inner scope supresses transaction, inner completes, outer does not - // Expect changes by inner transaction visible - NestedScopeInternalTest(TransactionScopeOption.Suppress, true, false, true, false); - - // inner scope supresses transaction, both complete - NestedScopeInternalTest(TransactionScopeOption.Suppress, true, true, true, true); - } - - private void ReusingSameConnection(bool pooling, bool complete) - { - int c1Thread; - executeSQL("TRUNCATE TABLE Test"); - - using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew, TimeSpan.MaxValue)) - { - string connStr = connection.ConnectionString; - if (!pooling) - connStr += ";pooling=false"; - - using (MySqlConnection c1 = new MySqlConnection(connStr)) - { - c1.Open(); - MySqlCommand cmd1 = new MySqlCommand("INSERT INTO Test (key2) VALUES ('a')", c1); - cmd1.ExecuteNonQuery(); - c1Thread = c1.ServerThread; - } - - using (MySqlConnection c2 = new MySqlConnection(connStr)) - { - c2.Open(); - MySqlCommand cmd2 = new MySqlCommand("INSERT INTO Test (key2) VALUES ('b')", c2); - cmd2.ExecuteNonQuery(); - Assert.Equal(c1Thread, c2.ServerThread); - } - - if (complete) - ts.Complete(); - } - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Test", connection); - DataTable dt = new DataTable(); - da.Fill(dt); - if (complete) - { - Assert.Equal(2, dt.Rows.Count); - Assert.Equal("a", dt.Rows[0][0]); - Assert.Equal("b", dt.Rows[1][0]); - } - else - { - Assert.Equal(0, dt.Rows.Count); - } - } - - [Fact] - public void ReusingSameConnectionTest() - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (key2 VARCHAR(1), name VARCHAR(100), name2 VARCHAR(100))"); - ReusingSameConnection(true, true); - // Assert.Equal(processes + 1, CountProcesses()); - - ReusingSameConnection(true, false); - // Assert.Equal(processes + 1, CountProcesses()); - - ReusingSameConnection(false, true); - // Assert.Equal(processes + 1, CountProcesses()); - - ReusingSameConnection(false, false); - // Assert.Equal(processes + 1, CountProcesses()); - } - - /// - /// bug#35330 - even if transaction scope has expired, rows can be inserted into - /// the table, due to race condition with the thread doing rollback - /// - [Fact] - public void ScopeTimeoutWithMySqlHelper() - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (id int)"); - string connStr = connection.ConnectionString; - using (new TransactionScope(TransactionScopeOption.RequiresNew, TimeSpan.FromSeconds(1))) - { - try - { - for (int i = 0; ; i++) - { - MySqlHelper.ExecuteNonQuery(connStr, String.Format("INSERT INTO Test VALUES({0})", i)); ; - } - } - catch (Exception) - { - } - } - long count = (long)MySqlHelper.ExecuteScalar(connStr, "select count(*) from test"); - Assert.Equal(0, count); - } - - /// - /// Variation of previous test, with a single connection and maual enlistment. - /// Checks that transaction rollback leaves the connection intact (does not close it) - /// and checks that no command is possible after scope has expired and - /// rollback by timer thread is finished. - /// - [Fact] - public void AttemptToUseConnectionAfterScopeTimeout() - { - executeSQL("DROP TABLE IF EXISTS Test"); - executeSQL("CREATE TABLE Test (id int)"); - string connStr = connection.ConnectionString; - using (MySqlConnection c = new MySqlConnection(connStr)) - { - c.Open(); - MySqlCommand cmd = new MySqlCommand("select 1", c); - using (new TransactionScope(TransactionScopeOption.RequiresNew, - TimeSpan.FromSeconds(1))) - { - c.EnlistTransaction(Transaction.Current); - cmd = new MySqlCommand("select 1", c); - try - { - for (int i = 0; ; i++) - { - cmd.CommandText = String.Format("INSERT INTO Test VALUES({0})", i); - cmd.ExecuteNonQuery(); - } - } - catch (Exception) - { - // Eat exception - } - - // Here, scope is timed out and rollback is in progress. - // Wait until timeout thread finishes rollback then try to - // use an aborted connection. - Thread.Sleep(500); - //try - //{ - - Assert.Throws(() => cmd.ExecuteNonQuery()); - //} - //catch (TransactionAbortedException) - //{ - //} - } - Assert.True(c.State == ConnectionState.Open); - cmd.CommandText = "select count(*) from Test"; - long count = (long)cmd.ExecuteScalar(); - Assert.Equal(0, count); - } - } - - - /// - /// Bug#54681 : Null Reference exception when using transaction - /// scope in more that one thread - /// - [Fact] - public void TransactionScopeWithThreads() - { - // use transaction scope in the current thread - DoThreadWork(); - - //use transaction scope in another thread (used to crash with null - // reference exception) - Thread t = new Thread(new ThreadStart(DoThreadWork)); - t.Start(); - t.Join(); - } - - [Fact] - public void SnapshotIsolationLevelThrowsNotSupportedException() - { - using (MySqlConnection newcon = new MySqlConnection(connection.ConnectionString)) - { - newcon.Open(); - var ex = Assert.Throws(() => newcon.BeginTransaction(System.Data.IsolationLevel.Snapshot)); - Assert.Equal(ex.Message, "Snapshot isolation level is not supported."); - } - } - - private void DoThreadWork() - { - using (TransactionScope ts = new TransactionScope()) - { - string connStr = connection.ConnectionString; - using (MySqlConnection c1 = new MySqlConnection(connStr)) - { - c1.Open(); - } - } - } - - /// - /// Related to bug http://bugs.mysql.com/bug.php?id=71502 - /// - [Fact] - public void NestedTransactionException() - { - MySqlConnectionStringBuilder sb = new MySqlConnectionStringBuilder(connection.ConnectionString); - sb.Pooling = true; - sb.ConnectionReset = false; - string connectionString = sb.ToString(); - for (int i = 0; i < 5; i++) - { - using (MySqlConnection connection = new MySqlConnection(connectionString)) - { - connection.Open(); - DbTransaction trx = connection.BeginTransaction(); - MySqlCommand cmd = new MySqlCommand("update abc", connection); - Assert.Throws(() => cmd.ExecuteNonQuery()); - // the following condition validates 2 scenarios - // when trx.Dispose is not invoked (when i == 0 or 1) - // and when the connection is closed before calling trx.Dispose - if (i > 1) connection.Close(); - trx.Dispose(); - } - } - } - -#endif - } -} diff --git a/Tests/MySql.Data.Tests/TypeTests.cs b/Tests/MySql.Data.Tests/TypeTests.cs deleted file mode 100644 index 15beea417..000000000 --- a/Tests/MySql.Data.Tests/TypeTests.cs +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using MySql.Data.Types; -using System.IO; - -namespace MySql.Data.MySqlClient.Tests -{ - public class TypeTests : TestBase - { - public TypeTests(TestSetup setup) : base(setup, "typetests") - { - - } - - /// - /// Test fix for http://bugs.mysql.com/bug.php?id=40555 - /// Make MySql.Data.Types.MySqlDateTime serializable. - /// - [Fact] - public void TestSerializationMySqlDataTime() - { - MySqlDateTime dt = new MySqlDateTime(2011, 10, 6, 11, 38, 01, 0); - Assert.Equal(2011, dt.Year); - Assert.Equal(10, dt.Month); - Assert.Equal(6, dt.Day); - Assert.Equal(11, dt.Hour); - Assert.Equal(38, dt.Minute); - Assert.Equal(1, dt.Second); - System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = - new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); - MemoryStream ms = new MemoryStream(1024); - bf.Serialize(ms, dt); - ms.Position = 0; - object o = bf.Deserialize(ms); - dt = (MySqlDateTime)o; - Assert.Equal(2011, dt.Year); - Assert.Equal(10, dt.Month); - Assert.Equal(6, dt.Day); - Assert.Equal(11, dt.Hour); - Assert.Equal(38, dt.Minute); - Assert.Equal(1, dt.Second); - } - } -} diff --git a/Tests/MySql.Data.Tests/UsageAdvisorTests.cs b/Tests/MySql.Data.Tests/UsageAdvisorTests.cs deleted file mode 100644 index 773f50b68..000000000 --- a/Tests/MySql.Data.Tests/UsageAdvisorTests.cs +++ /dev/null @@ -1,225 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Diagnostics; -using System.Data; - -namespace MySql.Data.MySqlClient.Tests -{ - public class UsageAdvisorTests : TestBase - { - public UsageAdvisorTests(TestSetup setup) : base(setup, "usage-advisor") - { - - } - - protected override void Init() - { - base.Init(); - Settings.UseUsageAdvisor = true; - } - - [Fact] - public void NotReadingEveryField() - { - executeSQL("CREATE TABLE Test (id int, name VARCHAR(200))"); - executeSQL("INSERT INTO Test VALUES (1, 'Test1')"); - executeSQL("INSERT INTO Test VALUES (2, 'Test2')"); - executeSQL("INSERT INTO Test VALUES (3, 'Test3')"); - executeSQL("INSERT INTO Test VALUES (4, 'Test4')"); - -#if !NETCORE10 - MySqlTrace.Listeners.Clear(); - MySqlTrace.Switch.Level = SourceLevels.All; - GenericListener listener = new GenericListener(); - MySqlTrace.Listeners.Add(listener); -#endif - string sql = "SELECT * FROM Test; SELECT * FROM Test WHERE id > 2"; - MySqlCommand cmd = new MySqlCommand(sql, connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - reader.GetInt32(0); // access the first field - reader.Read(); - Assert.True(reader.NextResult()); - reader.Read(); - Assert.Equal("Test3", reader.GetString(1)); - Assert.False(reader.NextResult()); - } - -#if !NETCORE10 - Assert.Equal(12, listener.Strings.Count); - Assert.True(listener.Strings[0].Contains("Query Opened: SELECT * FROM Test; SELECT * FROM Test WHERE id > 2")); - Assert.True(listener.Strings[1].Contains("Resultset Opened: field(s) = 2, affected rows = -1, inserted id = -1")); - Assert.True(listener.Strings[2].Contains("Usage Advisor Warning: Query does not use an index")); - Assert.True(listener.Strings[3].Contains("Usage Advisor Warning: Skipped 2 rows. Consider a more focused query.")); - Assert.True(listener.Strings[4].Contains("Usage Advisor Warning: The following columns were not accessed: name")); - Assert.True(listener.Strings[5].Contains("Resultset Closed. Total rows=4, skipped rows=2, size (bytes)=32")); - Assert.True(listener.Strings[6].Contains("Resultset Opened: field(s) = 2, affected rows = -1, inserted id = -1")); - Assert.True(listener.Strings[7].Contains("Usage Advisor Warning: Query does not use an index")); - Assert.True(listener.Strings[8].Contains("Usage Advisor Warning: Skipped 1 rows. Consider a more focused query.")); - Assert.True(listener.Strings[9].Contains("Usage Advisor Warning: The following columns were not accessed: id")); - Assert.True(listener.Strings[10].Contains("Resultset Closed. Total rows=2, skipped rows=1, size (bytes)=16")); - Assert.True(listener.Strings[11].Contains("Query Closed")); -#endif - } - - [Fact] - public void NotReadingEveryRow() - { - executeSQL("CREATE TABLE Test (id int, name VARCHAR(200))"); - executeSQL("INSERT INTO Test VALUES (1, 'Test1')"); - executeSQL("INSERT INTO Test VALUES (2, 'Test2')"); - executeSQL("INSERT INTO Test VALUES (3, 'Test3')"); - executeSQL("INSERT INTO Test VALUES (4, 'Test4')"); - -#if !NETCORE10 - MySqlTrace.Listeners.Clear(); - MySqlTrace.Switch.Level = SourceLevels.All; - GenericListener listener = new GenericListener(); - MySqlTrace.Listeners.Add(listener); -#endif - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test; SELECT * FROM Test WHERE id > 2", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - reader.Read(); - Assert.True(reader.NextResult()); - reader.Read(); - reader.Read(); - Assert.False(reader.NextResult()); - } - -#if !NETCORE10 - Assert.Equal(11, listener.Strings.Count); - Assert.True(listener.Strings[0].Contains("Query Opened: SELECT * FROM Test; SELECT * FROM Test WHERE id > 2")); - Assert.True(listener.Strings[1].Contains("Resultset Opened: field(s) = 2, affected rows = -1, inserted id = -1")); - Assert.True(listener.Strings[2].Contains("Usage Advisor Warning: Query does not use an index")); - Assert.True(listener.Strings[3].Contains("Usage Advisor Warning: Skipped 2 rows. Consider a more focused query.")); - Assert.True(listener.Strings[4].Contains("Usage Advisor Warning: The following columns were not accessed: id,name")); - Assert.True(listener.Strings[5].Contains("Resultset Closed. Total rows=4, skipped rows=2, size (bytes)=32")); - Assert.True(listener.Strings[6].Contains("Resultset Opened: field(s) = 2, affected rows = -1, inserted id = -1")); - Assert.True(listener.Strings[7].Contains("Usage Advisor Warning: Query does not use an index")); - Assert.True(listener.Strings[8].Contains("Usage Advisor Warning: The following columns were not accessed: id,name")); - Assert.True(listener.Strings[9].Contains("Resultset Closed. Total rows=2, skipped rows=0, size (bytes)=16")); - Assert.True(listener.Strings[10].Contains("Query Closed")); -#endif - } - - [Fact] - public void FieldConversion() - { - executeSQL("CREATE TABLE Test (id int, name VARCHAR(200))"); - executeSQL("INSERT INTO Test VALUES (1, 'Test1')"); -#if !NETCORE10 - MySqlTrace.Listeners.Clear(); - MySqlTrace.Switch.Level = SourceLevels.All; - GenericListener listener = new GenericListener(); - MySqlTrace.Listeners.Add(listener); -#endif - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Test", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - short s = reader.GetInt16(0); - long l = reader.GetInt64(0); - string str = reader.GetString(1); - } -#if !NETCORE10 - Assert.Equal(6, listener.Strings.Count); - Assert.True(listener.Strings[0].Contains("Query Opened: SELECT * FROM Test")); - Assert.True(listener.Strings[1].Contains("Resultset Opened: field(s) = 2, affected rows = -1, inserted id = -1")); - Assert.True(listener.Strings[2].Contains("Usage Advisor Warning: Query does not use an index")); - Assert.True(listener.Strings[3].Contains("Usage Advisor Warning: The field 'id' was converted to the following types: Int16,Int64")); - Assert.True(listener.Strings[4].Contains("Resultset Closed. Total rows=1, skipped rows=0, size (bytes)=8")); - Assert.True(listener.Strings[5].Contains("Query Closed")); -#endif - } - - [Fact] - public void NoIndexUsed() - { - executeSQL("CREATE TABLE Test (id int, name VARCHAR(200))"); - executeSQL("INSERT INTO Test VALUES (1, 'Test1')"); - executeSQL("INSERT INTO Test VALUES (2, 'Test1')"); - executeSQL("INSERT INTO Test VALUES (3, 'Test1')"); - executeSQL("INSERT INTO Test VALUES (4, 'Test1')"); - -#if !NETCORE10 - MySqlTrace.Listeners.Clear(); - MySqlTrace.Switch.Level = SourceLevels.All; - GenericListener listener = new GenericListener(); - MySqlTrace.Listeners.Add(listener); -#endif - MySqlCommand cmd = new MySqlCommand("SELECT name FROM Test WHERE id=3", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - } -#if !NETCORE10 - Assert.Equal(6, listener.Strings.Count); - Assert.True(listener.Strings[0].Contains("Query Opened: SELECT name FROM Test WHERE id=3")); - Assert.True(listener.Strings[1].Contains("Resultset Opened: field(s) = 1, affected rows = -1, inserted id = -1")); - Assert.True(listener.Strings[2].Contains("Usage Advisor Warning: Query does not use an index")); - Assert.True(listener.Strings[3].Contains("Usage Advisor Warning: The following columns were not accessed: name")); - Assert.True(listener.Strings[4].Contains("Resultset Closed. Total rows=1, skipped rows=0, size (bytes)=6")); - Assert.True(listener.Strings[5].Contains("Query Closed")); -#endif - } - - [Fact] - public void BadIndexUsed() - { - executeSQL("CREATE TABLE Test(id INT, name VARCHAR(20) PRIMARY KEY)"); - executeSQL("INSERT INTO Test VALUES (1, 'Test1')"); - executeSQL("INSERT INTO Test VALUES (2, 'Test2')"); - executeSQL("INSERT INTO Test VALUES (3, 'Test3')"); - executeSQL("INSERT INTO Test VALUES (4, 'Test4')"); -#if !NETCORE10 - MySqlTrace.Listeners.Clear(); - MySqlTrace.Switch.Level = SourceLevels.All; - GenericListener listener = new GenericListener(); - MySqlTrace.Listeners.Add(listener); -#endif - MySqlCommand cmd = new MySqlCommand("SELECT name FROM Test WHERE id=3", connection); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - } - -#if !NETCORE10 - Assert.Equal(6, listener.Strings.Count); - Assert.True(listener.Strings[0].Contains("Query Opened: SELECT name FROM Test WHERE id=3")); - Assert.True(listener.Strings[1].Contains("Resultset Opened: field(s) = 1, affected rows = -1, inserted id = -1")); - Assert.True(listener.Strings[2].Contains("Usage Advisor Warning: Query does not use an index")); - Assert.True(listener.Strings[3].Contains("Usage Advisor Warning: The following columns were not accessed: name")); - Assert.True(listener.Strings[4].Contains("Resultset Closed. Total rows=1, skipped rows=0, size (bytes)=6")); - Assert.True(listener.Strings[5].Contains("Query Closed")); -#endif - } - } -} diff --git a/Tests/MySql.Data.Tests/Utils.cs b/Tests/MySql.Data.Tests/Utils.cs deleted file mode 100644 index d8947e181..000000000 --- a/Tests/MySql.Data.Tests/Utils.cs +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Data; - -namespace MySql.Data.MySqlClient.Tests -{ - /// - /// Summary description for Utils. - /// - public class Utils - { - - public static byte[] CreateBlob(int size) - { - byte[] buf = new byte[size]; - - Random r = new Random(); - r.NextBytes(buf); - return buf; - } - - public static TestDataTable FillTable(string sql, MySqlConnection conn) - { - MySqlDataAdapter da = new MySqlDataAdapter(sql, conn); - TestDataTable dt = new TestDataTable(); - da.Fill(dt); - return dt; - } - } - - -} diff --git a/Tests/MySql.Data.Tests/certificates/ca-key.pem b/Tests/MySql.Data.Tests/certificates/ca-key.pem deleted file mode 100644 index 075999ecb..000000000 Binary files a/Tests/MySql.Data.Tests/certificates/ca-key.pem and /dev/null differ diff --git a/Tests/MySql.Data.Tests/certificates/ca.pem b/Tests/MySql.Data.Tests/certificates/ca.pem deleted file mode 100644 index 8a9a4d1c3..000000000 Binary files a/Tests/MySql.Data.Tests/certificates/ca.pem and /dev/null differ diff --git a/Tests/MySql.Data.Tests/certificates/client-cert.pem b/Tests/MySql.Data.Tests/certificates/client-cert.pem deleted file mode 100644 index 9f3bb8a76..000000000 Binary files a/Tests/MySql.Data.Tests/certificates/client-cert.pem and /dev/null differ diff --git a/Tests/MySql.Data.Tests/certificates/client-key.pem b/Tests/MySql.Data.Tests/certificates/client-key.pem deleted file mode 100644 index 917cd0476..000000000 Binary files a/Tests/MySql.Data.Tests/certificates/client-key.pem and /dev/null differ diff --git a/Tests/MySql.Data.Tests/certificates/server-cert.pem b/Tests/MySql.Data.Tests/certificates/server-cert.pem deleted file mode 100644 index 19c7b2e7b..000000000 Binary files a/Tests/MySql.Data.Tests/certificates/server-cert.pem and /dev/null differ diff --git a/Tests/MySql.Data.Tests/certificates/server-key.pem b/Tests/MySql.Data.Tests/certificates/server-key.pem deleted file mode 100644 index d92b98bb0..000000000 Binary files a/Tests/MySql.Data.Tests/certificates/server-key.pem and /dev/null differ diff --git a/Tests/MySql.Data.Tests/client.pfx b/Tests/MySql.Data.Tests/client.pfx deleted file mode 100644 index 6d6852d40..000000000 Binary files a/Tests/MySql.Data.Tests/client.pfx and /dev/null differ diff --git a/Tests/MySql.Data.Tests/project.json b/Tests/MySql.Data.Tests/project.json deleted file mode 100644 index 780448243..000000000 --- a/Tests/MySql.Data.Tests/project.json +++ /dev/null @@ -1,148 +0,0 @@ -{ - "version": "7.0.7-m6", - "description": "MySql.Data.Tests Class Library", - "authors": [ "Oracle" ], - "copyright": "Copyright © 2016, 2017, Oracle and/or its affiliates. All rights reserved.", - - "packOptions": { - "projectUrl": "http://dev.mysql.com/downloads/", - "licenseUrl": "http://www.gnu.org/licenses/old-licenses/gpl-2.0.html", - "iconUrl": "http://www.mysql.com/common/logos/logo-mysql-170x115.png", - "tags": [ "MySql", ".NET Connector", "MySql Connector/NET", "netcore", ".Net Core", "MySql Conector/Net Core", "coreclr", "C/NET", "C/Net Core" ], - "requireLicenseAcceptance": true - }, - "dependencies": { - "dotnet-test-xunit": "2.2.0-*", - "xunit": "2.2.0-*", - "MySql.Data": { - "target": "project" - }, - "OpenCover": "4.6.519", - "ReportGenerator": "2.4.5", - "xunit.runner.console": "2.2.0-beta3-build3402" - }, - "buildOptions": { - "warningsAsErrors": false, - "keyFile": "../../ConnectorNetPublicKey.snk", - "delaySign": true, - "publicSign": false, - "xmlDoc": false, - "nowarn": ["CS1591"] - }, - "testRunner": "xunit", - "frameworks": { - "netcoreapp1.0": { - "imports": [ - "dnxcore50" - ], - "dependencies": { - "Microsoft.NETCore.App": { - "version": "1.0.0-*", - "type": "platform" - } - }, - "buildOptions": { - "define": [ "NETCORE10" ], - "copyToOutput": [ "client.pfx" ], - "compile": { - "include": [ "../*.cs" ], - "exclude": [ - "**/._*", - "Framework/Net451/**/*.*" - ], - "excludeFiles": [ - "DataTypeTests.cs", - "DateTimeTests.cs", - "GetSchemaTests.cs", - "InstallerTests.cs", - "MySqlCommandBuilderTests.cs", - "MySqlDataAdapterTests.cs", - "MySqlDataReaderTests.cs", - "MySQLHelperTests.cs", - "OutputParametersBatch.cs", - "ParameterTests.cs", - "PreparedStatements.cs", - "PreparedStatementsPipe.cs", - "PreparedStatementsPipeCompressed.cs", - "PreparedStatementsSharedMemory.cs", - "PreparedStatementsSharedMemoryCompressed.cs", - "PreparedStatementsSocketCompressed.cs", - "ProcedureParameterTests.cs", - "StoredProcedureWithAccess.cs", - "ThreadingTests.cs", - "TimeoutAndCancel.cs", - "OutputParametersBatchPrepared.cs", - "OutputParametersNoBatch.cs", - "OutputParametersNoBatchPrepared.cs", - "SqlTokenizer.cs", - "TimeoutAndCancelPipe.cs", - "TimeoutAndCancelSharedMemory.cs", - "TimeoutAndCancelSocketCompressed.cs", - "Tokenizer.cs", - "TypeTests.cs", - "TestDataTable.cs" - ] - }, - "warningsAsErrors": false - } - }, - "net451": { - "frameworkAssemblies": { - "System.Collections": { - "type": "build" - }, - "System.Diagnostics.Debug": { - "type": "build" - }, - "System.Linq": { - "type": "build" - }, - "System.Reflection": { - "type": "build" - }, - "System.Reflection.Extensions": { - "type": "build" - }, - "System.Runtime": { - "type": "build" - }, - "System.Runtime.Extensions": { - "type": "build" - }, - "System.Threading.Tasks": { - "type": "build" - } - }, - "buildOptions": { - "compile": { - "exclude": [ - "Framework/Net451/MediumTrust/*.*", - "Framework/NetCore10/*.*" - ], - "excludeFiles": [ - "Framework/Net451/PerfMonTests.cs", - "Framework/Net451/ReplicationTests.cs" - ] - }, - "copyToOutput": [ "client.pfx" ] - } - } - }, - "configurations": { - "Debug": { - "buildOptions": { - "define": [ "DEBUG", "TRACE" ], - "optimize": false, - "preserveCompilationContext": true - } - }, - "Release": { - "buildOptions": { - "define": [ "RELEASE" ], - "optimize": false, - "preserveCompilationContext": true, - "xmlDoc": true - } - } - } -} diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/App.config b/Tests/MySql.EntityFramework.CodeFirst.Tests/App.config deleted file mode 100644 index 8917aae2c..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/App.config +++ /dev/null @@ -1,36 +0,0 @@ - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/MySql.EF5.CodeFirst.Tests.csproj b/Tests/MySql.EntityFramework.CodeFirst.Tests/MySql.EF5.CodeFirst.Tests.csproj deleted file mode 100644 index 14ae854a0..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/MySql.EF5.CodeFirst.Tests.csproj +++ /dev/null @@ -1,187 +0,0 @@ - - - - Debug - AnyCPU - {EF3B193C-EFAE-458C-8077-CB8602365E10} - Library - Properties - MySql.Data.Entity.CodeFirst.Tests - MySql.Data.Entity.CodeFirst.Tests - v4.0 - 512 - ..\..\ - true - - - - 10.0 - - - - - - - - 9.0.30729 - 2.0 - 4.0 - v4.0 - NET_40_OR_GREATER - - - - - 9.0.30729 - 2.0 - 4.5 - v4.5.1 - NET_40_OR_GREATER;NET_45_OR_GREATER; - - - - - true - full - false - $(TargetFrameworkVersion)\ - obj\$(TargetFrameworkVersion)\ - obj\$(TargetFrameworkVersion)\ - bin\$(TargetFrameworkVersion)\Debug\ - prompt - 4 - DEBUG;TRACE;EF5;$(DefineConstants) - - - pdbonly - true - $(TargetFrameworkVersion)\ - obj\$(TargetFrameworkVersion)\ - obj\$(TargetFrameworkVersion)\ - bin\$(TargetFrameworkVersion)\Release\ - prompt - 4 - TRACE;EF5;$(DefineConstants) - - - - - - - ..\..\packages\EntityFramework.5.0.0\lib\net40\EntityFramework.dll - True - False - - - - - - - ..\..\packages\EntityFramework.5.0.0\lib\net45\EntityFramework.dll - True - - - - - - - - - - - - - ..\..\packages\xunit.1.9.2\lib\net20\xunit.dll - True - - - - - Properties\VersionInfo.cs - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - True - True - SQLSyntax.resx - - - - - - - - - - {e9df5ed1-4cbd-4226-b931-9a51610ac14d} - MySql.Data - - - {f29e5b3d-7f76-4cf9-bf5e-8e3a1377b1e4} - MySql.Data.Tests - - - - - Designer - PreserveNewest - - - - - - - ResXFileCodeGenerator - SQLSyntax.Designer.cs - Designer - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/Properties/AssemblyInfo.cs b/Tests/MySql.EntityFramework.CodeFirst.Tests/Properties/AssemblyInfo.cs deleted file mode 100644 index d84dac302..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright © 2014, 2015 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System.Reflection; -using System.Runtime.CompilerServices; -using 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. -[assembly: AssemblyTitle("MySql.Data.Entity.CodeFirst.Tests")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Oracle")] -[assembly: AssemblyProduct("MySql.Data.Entity.CodeFirst.Tests")] -[assembly: AssemblyCopyright("Copyright © 2011, 2015, Oracle and/or its affiliates. All rights reserved.")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("9390d98e-16dc-4846-a1bb-19487a499a34")] - -// 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: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyDelaySign(true)] -[assembly: AssemblyKeyFileAttribute(@"..\..\ConnectorNetPublicKey.snk")] diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/Properties/SQLSyntax.Designer.cs b/Tests/MySql.EntityFramework.CodeFirst.Tests/Properties/SQLSyntax.Designer.cs deleted file mode 100644 index c8506ae42..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/Properties/SQLSyntax.Designer.cs +++ /dev/null @@ -1,486 +0,0 @@ -//------------------------------------------------------------------------------ -// -// 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 MySql.Data.Entity.CodeFirst.Tests.Properties { - 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", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class SQLSyntax { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal SQLSyntax() { - } - - /// - /// 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("MySql.Data.Entity.CodeFirst.Tests.Properties.SQLSyntax", typeof(SQLSyntax).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 SELECT - ///1 AS `C1`, - ///`Project3`.`nCdSite`, - ///`Project3`.`C1` AS `C2` - ///FROM (SELECT - ///`visitante`.`nCdSite`, - ///COUNT(DISTINCT `visitante`.`sDsIp`) AS `C1` - ///FROM `visitante` - /// GROUP BY - ///`visitante`.`nCdSite`) AS `Project3`. - /// - internal static string CountGroupBy { - get { - return ResourceManager.GetString("CountGroupBy", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///1 AS `C1`, - ///`Project3`.`nCdSite`, - ///`Project3`.`C1` AS `C2` - ///FROM (SELECT - ///`Extent4`.`nCdSite`, - ///COUNT(DISTINCT `Extent4`.`sDsIp`) AS `C1` - ///FROM `pagina` AS `Extent3` INNER JOIN `visitante` AS `Extent4` ON `Extent3`.`nCdVisitante` = `Extent4`.`nCdVisitante` - /// GROUP BY - ///`Extent4`.`nCdSite`) AS `Project3`. - /// - internal static string CountGroupBy2 { - get { - return ResourceManager.GetString("CountGroupBy2", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to - ///SELECT - ///1 AS `C1`, - ///`Project3`.`nCdSite`, - ///`Project3`.`C1` AS `C2` - ///FROM (SELECT - ///`Extent5`.`nCdSite`, - ///COUNT(DISTINCT `Extent5`.`sDsIp`) AS `C1` - ///FROM `pagina` AS `Extent3` INNER JOIN `visitante` AS `Extent4` ON `Extent3`.`nCdVisitante` = `Extent4`.`nCdVisitante` LEFT OUTER JOIN `visitante` AS `Extent5` ON `Extent3`.`nCdVisitante` = `Extent5`.`nCdVisitante` - /// GROUP BY - ///`Extent5`.`nCdSite`) AS `Project3` - /// . - /// - internal static string CountGroupBy2EF5 { - get { - return ResourceManager.GetString("CountGroupBy2EF5", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///1 AS `C1`, - ///`Project3`.`nCdSite`, - ///`Project3`.`C1` AS `C2` - ///FROM (SELECT - ///`visitante`.`nCdSite`, - ///COUNT(DISTINCT `visitante`.`sDsIp`) AS `C1` - ///FROM `visitante` - /// GROUP BY - ///`visitante`.`nCdSite`) AS `Project3`. - /// - internal static string CountGroupByEF5 { - get { - return ResourceManager.GetString("CountGroupByEF5", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - /// `Apply1`.`customer_id`, - /// `Extent5`.`country` - /// FROM (SELECT - /// `Extent1`.`customer_id`, - /// `Extent1`.`store_id`, - /// `Extent1`.`first_name`, - /// `Extent1`.`last_name`, - /// `Extent1`.`email`, - /// `Extent1`.`address_id`, - /// `Extent1`.`active`, - /// `Extent1`.`create_date`, - /// `Extent1`.`last_update`, - /// (SELECT - /// `Project1`.`address_id` - /// FROM `address` AS `Project1` - /// WHERE `Project1`.`address_id` = `Extent1`.`address_id` - /// ORDER BY - /// `Project1`.`address_id` DESC LIMIT 1) AS `ADDRESS [rest of string was truncated]";. - /// - internal static string FirstOrDefaultNestedWithOrderBy { - get { - return ResourceManager.GetString("FirstOrDefaultNestedWithOrderBy", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - /// `Project1`.`ID`, - /// `Project1`.`Title`, - /// `Project1`.`ReleaseDate`, - /// `Project1`.`Genre`, - /// `Project1`.`Price`, - /// `Project1`.`Data`, - /// `Project1`.`Director_ID` - /// FROM `Movies` AS `Project1` - /// WHERE `Project1`.`ReleaseDate` >= @p__linq__0 - /// ORDER BY - /// `Project1`.`ReleaseDate` DESC LIMIT 2. - /// - internal static string NestedOrderBy { - get { - return ResourceManager.GetString("NestedOrderBy", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`ID`, - ///`Extent1`.`Title`, - ///`Extent1`.`ReleaseDate`, - ///`Extent1`.`Genre`, - ///`Extent1`.`Price`, - ///`Extent1`.`Data`, - ///`Extent1`.`Director_ID` - ///FROM `Movies` AS `Extent1` - /// WHERE `Extent1`.`Title` LIKE @p__linq__0. - /// - internal static string QueryWithContains { - get { - return ResourceManager.GetString("QueryWithContains", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`ID`, - ///`Extent1`.`Title`, - ///`Extent1`.`ReleaseDate`, - ///`Extent1`.`Genre`, - ///`Extent1`.`Price`, - ///`Extent1`.`Data`, - ///`Extent1`.`Director_ID` - ///FROM `Movies` AS `Extent1` - /// WHERE `Extent1`.`Title` LIKE @p__linq__0. - /// - internal static string QueryWithEndsWith { - get { - return ResourceManager.GetString("QueryWithEndsWith", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Project1`.`ID`, - ///`Project1`.`Title`, - ///`Project1`.`ReleaseDate`, - ///`Project1`.`Genre`, - ///`Project1`.`Price`, - ///`Project1`.`Data`, - ///`Project1`.`Director_ID` - ///FROM `Movies` AS `Project1` - /// WHERE `Project1`.`Title` LIKE @p__linq__0 - /// ORDER BY - ///`Project1`.`ID` DESC LIMIT 10. - /// - internal static string QueryWithOrderByTakeContains { - get { - return ResourceManager.GetString("QueryWithOrderByTakeContains", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`ID`, - ///`Extent1`.`Title`, - ///`Extent1`.`ReleaseDate`, - ///`Extent1`.`Genre`, - ///`Extent1`.`Price`, - ///`Extent1`.`Data`, - ///`Extent1`.`Director_ID` - ///FROM `Movies` AS `Extent1` - /// WHERE `Extent1`.`Title` LIKE @p__linq__0. - /// - internal static string QueryWithStartsWith { - get { - return ResourceManager.GetString("QueryWithStartsWith", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - /// `Project2`.`customer_id`, - /// `Project2`.`store_id`, - /// `Project2`.`first_name`, - /// `Project2`.`last_name`, - /// `Project2`.`email`, - /// `Project2`.`address_id`, - /// `Project2`.`active`, - /// `Project2`.`create_date`, - /// `Project2`.`last_update` - /// FROM `customer` AS `Project2` - /// WHERE EXISTS(SELECT - /// 1 AS `C1` - /// FROM `rental` AS `Extent2` - /// WHERE (`Project2`.`customer_id` = `Extent2`.`customer_id`) AND (`Extent2`.`rental_date` < @p__linq__0)) - /// ORDER BY - /// `Project2`.`customer_id` ASC. - /// - internal static string ReplaceNameVisitorQuery { - get { - return ResourceManager.GetString("ReplaceNameVisitorQuery", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Project1`.`HarborId`, - ///`Project1`.`Description`, - ///`Project1`.`C2` AS `C1`, - ///`Project1`.`ShipId`, - ///`Project1`.`HarborId1`, - ///`Project1`.`Description1`, - ///`Project1`.`C1` AS `C2`, - ///`Project1`.`CrewMemberId`, - ///`Project1`.`ShipId1`, - ///`Project1`.`RankId`, - ///`Project1`.`ClearanceId`, - ///`Project1`.`Description2`, - ///`Project1`.`RankId1`, - ///`Project1`.`Description3`, - ///`Project1`.`ClearanceId1`, - ///`Project1`.`Description4` - ///FROM (SELECT - ///`Extent1`.`HarborId`, - ///`Extent1`.`Description`, - ///`Join3`.`Shi [rest of string was truncated]";. - /// - internal static string ShipQueryMalformedDueMultipleProjecttionsCorrected { - get { - return ResourceManager.GetString("ShipQueryMalformedDueMultipleProjecttionsCorrected", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Project1`.`HarborId`, - ///`Project1`.`Description`, - ///`Project1`.`C2` AS `C1`, - ///`Project1`.`ShipId`, - ///`Project1`.`HarborId1`, - ///`Project1`.`Description1`, - ///`Project1`.`C1` AS `C2`, - ///`Project1`.`CrewMemberId`, - ///`Project1`.`ShipId1`, - ///`Project1`.`RankId`, - ///`Project1`.`ClearanceId`, - ///`Project1`.`Description2`, - ///`Project1`.`RankId1`, - ///`Project1`.`Description3`, - ///`Project1`.`ClearanceId1`, - ///`Project1`.`Description4` - ///FROM (SELECT - ///`Extent1`.`HarborId`, - ///`Extent1`.`Description`, - ///`Join3`.`Shi [rest of string was truncated]";. - /// - internal static string ShipQueryMalformedDueMultipleProjecttionsCorrectedEF6 { - get { - return ResourceManager.GetString("ShipQueryMalformedDueMultipleProjecttionsCorrectedEF6", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - /// `Extent1`.`ID`, - /// `Extent1`.`Title`, - /// `Extent1`.`ReleaseDate`, - /// `Extent1`.`Genre`, - /// `Extent1`.`Price`, - /// `Extent1`.`Data`, - /// `Extent1`.`Director_ID` - /// FROM `Movies` AS `Extent1` - /// WHERE (@gp1 IN ( @gp2 )) AND (@gp3 IS NOT NULL). - /// - internal static string TestContainsListWitConstant { - get { - return ResourceManager.GetString("TestContainsListWitConstant", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`ID`, - ///`Extent1`.`Title`, - ///`Extent1`.`ReleaseDate`, - ///`Extent1`.`Genre`, - ///`Extent1`.`Price`, - ///`Extent1`.`Data`, - ///`Extent1`.`Director_ID` - ///FROM `Movies` AS `Extent1` - /// WHERE @gp1 = @gp2. - /// - internal static string TestContainsListWitConstantEF5 { - get { - return ResourceManager.GetString("TestContainsListWitConstantEF5", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - /// `Extent1`.`ID`, - /// `Extent1`.`Title`, - /// `Extent1`.`ReleaseDate`, - /// `Extent1`.`Genre`, - /// `Extent1`.`Price`, - /// `Extent1`.`Data`, - /// `Extent1`.`Director_ID` - /// FROM `Movies` AS `Extent1` - /// WHERE (`Extent1`.`ID` IN ( 1,2,3 )) AND (`Extent1`.`ID` IS NOT NULL). - /// - internal static string TestContainsListWithCast { - get { - return ResourceManager.GetString("TestContainsListWithCast", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`ID`, - ///`Extent1`.`Title`, - ///`Extent1`.`ReleaseDate`, - ///`Extent1`.`Genre`, - ///`Extent1`.`Price`, - ///`Extent1`.`Data`, - ///`Extent1`.`Director_ID` - ///FROM `Movies` AS `Extent1` - /// WHERE `Extent1`.`ID` IN ( 1,2,3 ). - /// - internal static string TestContainsListWithCastEF5 { - get { - return ResourceManager.GetString("TestContainsListWithCastEF5", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`ID`, - ///`Extent1`.`Title`, - ///`Extent1`.`ReleaseDate`, - ///`Extent1`.`Genre`, - ///`Extent1`.`Price`, - ///`Extent1`.`Data`, - ///`Extent1`.`Director_ID` - ///FROM `Movies` AS `Extent1` - /// WHERE @p__linq__0 IN ( 1,2,3 ). - /// - internal static string TestContainsListWithParameterReference { - get { - return ResourceManager.GetString("TestContainsListWithParameterReference", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`ID`, - ///`Extent1`.`Title`, - ///`Extent1`.`ReleaseDate`, - ///`Extent1`.`Genre`, - ///`Extent1`.`Price`, - ///`Extent1`.`Data`, - ///`Extent1`.`Director_ID` - ///FROM `Movies` AS `Extent1` - /// WHERE ((1 = @p__linq__0) OR (2 = @p__linq__0)) OR (3 = @p__linq__0). - /// - internal static string TestContainsListWithParameterReferenceEF5 { - get { - return ResourceManager.GetString("TestContainsListWithParameterReferenceEF5", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - /// `Project1`.`ID` AS `C1` - /// FROM `Movies` AS `Project1` - /// WHERE (`Project1`.`ID`) = @p__linq__0 - /// ORDER BY - /// `Project1`.`ID` ASC. - /// - internal static string UnknownProjectC1 { - get { - return ResourceManager.GetString("UnknownProjectC1", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Project1`.`ID` AS `C1` - ///FROM `Movies` AS `Project1` - /// WHERE (`Project1`.`ID`) = @p__linq__0 - /// ORDER BY - ///`Project1`.`ID` ASC. - /// - internal static string UnknownProjectC1EF6 { - get { - return ResourceManager.GetString("UnknownProjectC1EF6", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to UPDATE `MovieReleases` SET `Name`='Director\'s Cut' WHERE (`Id` = 1) AND (`Name` = 'Commercial'); SELECT `Timestamp` FROM `MovieReleases` WHERE row_count() > 0 and (`Id` = 1) AND (`Name` = 'Director\'s Cut'). - /// - internal static string UpdateWithSelect { - get { - return ResourceManager.GetString("UpdateWithSelect", resourceCulture); - } - } - } -} diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/Properties/SQLSyntax.resx b/Tests/MySql.EntityFramework.CodeFirst.Tests/Properties/SQLSyntax.resx deleted file mode 100644 index d5a25f719..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/Properties/SQLSyntax.resx +++ /dev/null @@ -1,506 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - SELECT -1 AS `C1`, -`Project3`.`nCdSite`, -`Project3`.`C1` AS `C2` -FROM (SELECT -`visitante`.`nCdSite`, -COUNT(DISTINCT `visitante`.`sDsIp`) AS `C1` -FROM `visitante` - GROUP BY -`visitante`.`nCdSite`) AS `Project3` - - - -SELECT -1 AS `C1`, -`Project3`.`nCdSite`, -`Project3`.`C1` AS `C2` -FROM (SELECT -`Extent5`.`nCdSite`, -COUNT(DISTINCT `Extent5`.`sDsIp`) AS `C1` -FROM `pagina` AS `Extent3` INNER JOIN `visitante` AS `Extent4` ON `Extent3`.`nCdVisitante` = `Extent4`.`nCdVisitante` LEFT OUTER JOIN `visitante` AS `Extent5` ON `Extent3`.`nCdVisitante` = `Extent5`.`nCdVisitante` - GROUP BY -`Extent5`.`nCdSite`) AS `Project3` - - - - SELECT -1 AS `C1`, -`Project3`.`nCdSite`, -`Project3`.`C1` AS `C2` -FROM (SELECT -`Extent4`.`nCdSite`, -COUNT(DISTINCT `Extent4`.`sDsIp`) AS `C1` -FROM `pagina` AS `Extent3` INNER JOIN `visitante` AS `Extent4` ON `Extent3`.`nCdVisitante` = `Extent4`.`nCdVisitante` - GROUP BY -`Extent4`.`nCdSite`) AS `Project3` - - - SELECT -1 AS `C1`, -`Project3`.`nCdSite`, -`Project3`.`C1` AS `C2` -FROM (SELECT -`visitante`.`nCdSite`, -COUNT(DISTINCT `visitante`.`sDsIp`) AS `C1` -FROM `visitante` - GROUP BY -`visitante`.`nCdSite`) AS `Project3` - - - SELECT - `Project1`.`ID`, - `Project1`.`Title`, - `Project1`.`ReleaseDate`, - `Project1`.`Genre`, - `Project1`.`Price`, - `Project1`.`Data`, - `Project1`.`Director_ID` - FROM `Movies` AS `Project1` - WHERE `Project1`.`ReleaseDate` >= @p__linq__0 - ORDER BY - `Project1`.`ReleaseDate` DESC LIMIT 2 - - - SELECT -`Project1`.`ID`, -`Project1`.`Title`, -`Project1`.`ReleaseDate`, -`Project1`.`Genre`, -`Project1`.`Price`, -`Project1`.`Data`, -`Project1`.`Director_ID` -FROM `Movies` AS `Project1` - WHERE `Project1`.`Title` LIKE @p__linq__0 - ORDER BY -`Project1`.`ID` DESC LIMIT 10 - - - SELECT -`Project1`.`HarborId`, -`Project1`.`Description`, -`Project1`.`C2` AS `C1`, -`Project1`.`ShipId`, -`Project1`.`HarborId1`, -`Project1`.`Description1`, -`Project1`.`C1` AS `C2`, -`Project1`.`CrewMemberId`, -`Project1`.`ShipId1`, -`Project1`.`RankId`, -`Project1`.`ClearanceId`, -`Project1`.`Description2`, -`Project1`.`RankId1`, -`Project1`.`Description3`, -`Project1`.`ClearanceId1`, -`Project1`.`Description4` -FROM (SELECT -`Extent1`.`HarborId`, -`Extent1`.`Description`, -`Join3`.`ShipId`, -`Join3`.`HarborId` AS `HarborId1`, -`Join3`.`Description` AS `Description1`, -`Join3`.`CrewMemberId`, -`Join3`.`SHIPID1` AS `ShipId1`, -`Join3`.`RankId`, -`Join3`.`ClearanceId`, -`Join3`.`DESCRIPTION1` AS `Description2`, -`Join3`.`RANKID1` AS `RankId1`, -`Join3`.`DESCRIPTION11` AS `Description3`, -`Join3`.`CLEARANCEID1` AS `ClearanceId1`, -`Join3`.`DESCRIPTION2` AS `Description4`, -CASE WHEN (`Join3`.`ShipId` IS NULL) THEN (NULL) WHEN (`Join3`.`CrewMemberId` IS NULL) THEN (NULL) ELSE (1) END AS `C1`, -CASE WHEN (`Join3`.`ShipId` IS NULL) THEN (NULL) ELSE (1) END AS `C2` -FROM `Harbors` AS `Extent1` LEFT OUTER JOIN (SELECT -`Extent2`.`ShipId`, -`Extent2`.`HarborId`, -`Extent2`.`Description`, -`Join2`.`CrewMemberId`, -`Join2`.`ShipId` AS `SHIPID1`, -`Join2`.`RankId`, -`Join2`.`ClearanceId`, -`Join2`.`Description` AS `DESCRIPTION1`, -`Join2`.`RANKID1`, -`Join2`.`DESCRIPTION1` AS `DESCRIPTION11`, -`Join2`.`CLEARANCEID1`, -`Join2`.`DESCRIPTION2` -FROM `Ships` AS `Extent2` LEFT OUTER JOIN (SELECT -`Extent3`.`CrewMemberId`, -`Extent3`.`ShipId`, -`Extent3`.`RankId`, -`Extent3`.`ClearanceId`, -`Extent3`.`Description`, -`Extent4`.`RankId` AS `RANKID1`, -`Extent4`.`Description` AS `DESCRIPTION1`, -`Extent5`.`ClearanceId` AS `CLEARANCEID1`, -`Extent5`.`Description` AS `DESCRIPTION2` -FROM `CrewMembers` AS `Extent3` INNER JOIN `Ranks` AS `Extent4` ON `Extent3`.`RankId` = `Extent4`.`RankId` LEFT OUTER JOIN `Clearances` AS `Extent5` ON `Extent3`.`ClearanceId` = `Extent5`.`ClearanceId`) AS `Join2` ON `Extent2`.`ShipId` = `Join2`.`ShipId`) AS `Join3` ON `Extent1`.`HarborId` = `Join3`.`HarborId`) AS `Project1` - ORDER BY -`Project1`.`HarborId` ASC, -`Project1`.`C2` ASC, -`Project1`.`ShipId` ASC, -`Project1`.`C1` ASC - - - SELECT -`Project1`.`HarborId`, -`Project1`.`Description`, -`Project1`.`C2` AS `C1`, -`Project1`.`ShipId`, -`Project1`.`HarborId1`, -`Project1`.`Description1`, -`Project1`.`C1` AS `C2`, -`Project1`.`CrewMemberId`, -`Project1`.`ShipId1`, -`Project1`.`RankId`, -`Project1`.`ClearanceId`, -`Project1`.`Description2`, -`Project1`.`RankId1`, -`Project1`.`Description3`, -`Project1`.`ClearanceId1`, -`Project1`.`Description4` -FROM (SELECT -`Extent1`.`HarborId`, -`Extent1`.`Description`, -`Join3`.`ShipId`, -`Join3`.`HarborId` AS `HarborId1`, -`Join3`.`Description` AS `Description1`, -`Join3`.`CrewMemberId`, -`Join3`.`SHIPID1` AS `ShipId1`, -`Join3`.`RankId`, -`Join3`.`ClearanceId`, -`Join3`.`DESCRIPTION1` AS `Description2`, -`Join3`.`RANKID1` AS `RankId1`, -`Join3`.`DESCRIPTION11` AS `Description3`, -`Join3`.`CLEARANCEID1` AS `ClearanceId1`, -`Join3`.`DESCRIPTION2` AS `Description4`, -CASE WHEN (`Join3`.`ShipId` IS NULL) THEN (NULL) WHEN (`Join3`.`CrewMemberId` IS NULL) THEN (NULL) ELSE (1) END AS `C1`, -CASE WHEN (`Join3`.`ShipId` IS NULL) THEN (NULL) ELSE (1) END AS `C2` -FROM `Harbors` AS `Extent1` LEFT OUTER JOIN (SELECT -`Extent2`.`ShipId`, -`Extent2`.`HarborId`, -`Extent2`.`Description`, -`Join2`.`CrewMemberId`, -`Join2`.`ShipId` AS `SHIPID1`, -`Join2`.`RankId`, -`Join2`.`ClearanceId`, -`Join2`.`Description` AS `DESCRIPTION1`, -`Join2`.`RANKID1`, -`Join2`.`DESCRIPTION1` AS `DESCRIPTION11`, -`Join2`.`CLEARANCEID1`, -`Join2`.`DESCRIPTION2` -FROM `Ships` AS `Extent2` LEFT OUTER JOIN (SELECT -`Extent3`.`CrewMemberId`, -`Extent3`.`ShipId`, -`Extent3`.`RankId`, -`Extent3`.`ClearanceId`, -`Extent3`.`Description`, -`Extent4`.`RankId` AS `RANKID1`, -`Extent4`.`Description` AS `DESCRIPTION1`, -`Extent5`.`ClearanceId` AS `CLEARANCEID1`, -`Extent5`.`Description` AS `DESCRIPTION2` -FROM `CrewMembers` AS `Extent3` INNER JOIN `Ranks` AS `Extent4` ON `Extent3`.`RankId` = `Extent4`.`RankId` INNER JOIN `Clearances` AS `Extent5` ON `Extent3`.`ClearanceId` = `Extent5`.`ClearanceId`) AS `Join2` ON `Extent2`.`ShipId` = `Join2`.`ShipId`) AS `Join3` ON `Extent1`.`HarborId` = `Join3`.`HarborId`) AS `Project1` - ORDER BY -`Project1`.`HarborId` ASC, -`Project1`.`C2` ASC, -`Project1`.`ShipId` ASC, -`Project1`.`C1` ASC - - - UPDATE `MovieReleases` SET `Name`='Director\'s Cut' WHERE (`Id` = 1) AND (`Name` = 'Commercial'); SELECT `Timestamp` FROM `MovieReleases` WHERE row_count() > 0 and (`Id` = 1) AND (`Name` = 'Director\'s Cut') - - - SELECT - `Project1`.`ID` AS `C1` - FROM `Movies` AS `Project1` - WHERE (`Project1`.`ID`) = @p__linq__0 - ORDER BY - `Project1`.`ID` ASC - - - SELECT -`Project1`.`ID` AS `C1` -FROM `Movies` AS `Project1` - WHERE (`Project1`.`ID`) = @p__linq__0 - ORDER BY -`Project1`.`ID` ASC - - - SELECT -`Extent1`.`ID`, -`Extent1`.`Title`, -`Extent1`.`ReleaseDate`, -`Extent1`.`Genre`, -`Extent1`.`Price`, -`Extent1`.`Data`, -`Extent1`.`Director_ID` -FROM `Movies` AS `Extent1` - WHERE `Extent1`.`Title` LIKE @p__linq__0 - - - SELECT -`Extent1`.`ID`, -`Extent1`.`Title`, -`Extent1`.`ReleaseDate`, -`Extent1`.`Genre`, -`Extent1`.`Price`, -`Extent1`.`Data`, -`Extent1`.`Director_ID` -FROM `Movies` AS `Extent1` - WHERE `Extent1`.`Title` LIKE @p__linq__0 - - - SELECT -`Extent1`.`ID`, -`Extent1`.`Title`, -`Extent1`.`ReleaseDate`, -`Extent1`.`Genre`, -`Extent1`.`Price`, -`Extent1`.`Data`, -`Extent1`.`Director_ID` -FROM `Movies` AS `Extent1` - WHERE `Extent1`.`Title` LIKE @p__linq__0 - - - SELECT - `Extent1`.`ID`, - `Extent1`.`Title`, - `Extent1`.`ReleaseDate`, - `Extent1`.`Genre`, - `Extent1`.`Price`, - `Extent1`.`Data`, - `Extent1`.`Director_ID` - FROM `Movies` AS `Extent1` - WHERE (@gp1 IN ( @gp2 )) AND (@gp3 IS NOT NULL) - - - SELECT - `Extent1`.`ID`, - `Extent1`.`Title`, - `Extent1`.`ReleaseDate`, - `Extent1`.`Genre`, - `Extent1`.`Price`, - `Extent1`.`Data`, - `Extent1`.`Director_ID` - FROM `Movies` AS `Extent1` - WHERE (`Extent1`.`ID` IN ( 1,2,3 )) AND (`Extent1`.`ID` IS NOT NULL) - - - SELECT -`Extent1`.`ID`, -`Extent1`.`Title`, -`Extent1`.`ReleaseDate`, -`Extent1`.`Genre`, -`Extent1`.`Price`, -`Extent1`.`Data`, -`Extent1`.`Director_ID` -FROM `Movies` AS `Extent1` - WHERE @p__linq__0 IN ( 1,2,3 ) - - - SELECT -`Extent1`.`ID`, -`Extent1`.`Title`, -`Extent1`.`ReleaseDate`, -`Extent1`.`Genre`, -`Extent1`.`Price`, -`Extent1`.`Data`, -`Extent1`.`Director_ID` -FROM `Movies` AS `Extent1` - WHERE @gp1 = @gp2 - - - SELECT -`Extent1`.`ID`, -`Extent1`.`Title`, -`Extent1`.`ReleaseDate`, -`Extent1`.`Genre`, -`Extent1`.`Price`, -`Extent1`.`Data`, -`Extent1`.`Director_ID` -FROM `Movies` AS `Extent1` - WHERE `Extent1`.`ID` IN ( 1,2,3 ) - - - SELECT -`Extent1`.`ID`, -`Extent1`.`Title`, -`Extent1`.`ReleaseDate`, -`Extent1`.`Genre`, -`Extent1`.`Price`, -`Extent1`.`Data`, -`Extent1`.`Director_ID` -FROM `Movies` AS `Extent1` - WHERE ((1 = @p__linq__0) OR (2 = @p__linq__0)) OR (3 = @p__linq__0) - - - SELECT - `Apply1`.`customer_id`, - `Extent5`.`country` - FROM (SELECT - `Extent1`.`customer_id`, - `Extent1`.`store_id`, - `Extent1`.`first_name`, - `Extent1`.`last_name`, - `Extent1`.`email`, - `Extent1`.`address_id`, - `Extent1`.`active`, - `Extent1`.`create_date`, - `Extent1`.`last_update`, - (SELECT - `Project1`.`address_id` - FROM `address` AS `Project1` - WHERE `Project1`.`address_id` = `Extent1`.`address_id` - ORDER BY - `Project1`.`address_id` DESC LIMIT 1) AS `ADDRESS_ID1`, - (SELECT - `Project1`.`city_id` - FROM `address` AS `Project1` - WHERE `Project1`.`address_id` = `Extent1`.`address_id` - ORDER BY - `Project1`.`address_id` DESC LIMIT 1) AS `city_id` - FROM `customer` AS `Extent1`) AS `Apply1` INNER JOIN `store` AS `Extent3` ON `Apply1`.`store_id` = - `Extent3`.`store_id` LEFT OUTER JOIN `city` AS `Extent4` ON `Apply1`.`city_id` = `Extent4`.`city_id` - LEFT OUTER JOIN `country` AS `Extent5` ON `Extent4`.`country_id` = `Extent5`.`country_id` - ORDER BY - `Apply1`.`customer_id` DESC - - - SELECT - `Project2`.`customer_id`, - `Project2`.`store_id`, - `Project2`.`first_name`, - `Project2`.`last_name`, - `Project2`.`email`, - `Project2`.`address_id`, - `Project2`.`active`, - `Project2`.`create_date`, - `Project2`.`last_update` - FROM `customer` AS `Project2` - WHERE EXISTS(SELECT - 1 AS `C1` - FROM `rental` AS `Extent2` - WHERE (`Project2`.`customer_id` = `Extent2`.`customer_id`) AND (`Extent2`.`rental_date` < @p__linq__0)) - ORDER BY - `Project2`.`customer_id` ASC - - \ No newline at end of file diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/Properties/SakilaDbDataScript.sql b/Tests/MySql.EntityFramework.CodeFirst.Tests/Properties/SakilaDbDataScript.sql deleted file mode 100644 index c05364d3d..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/Properties/SakilaDbDataScript.sql +++ /dev/null @@ -1,186 +0,0 @@ --- 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 --- -TRUNCATE TABLE actor; -TRUNCATE TABLE address; -TRUNCATE TABLE category; -TRUNCATE TABLE city; -TRUNCATE TABLE country; -TRUNCATE TABLE customer; -TRUNCATE TABLE film; -TRUNCATE TABLE film_actor; -TRUNCATE TABLE film_category; -TRUNCATE TABLE film_text; -TRUNCATE TABLE inventory; -TRUNCATE TABLE language; -TRUNCATE TABLE payment; -TRUNCATE TABLE rental; -TRUNCATE TABLE staff; -TRUNCATE TABLE store; - -DROP TRIGGER IF EXISTS customer_create_date; -DROP TRIGGER IF EXISTS payment_date; -DROP TRIGGER IF EXISTS rental_date; - -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,'‰PNG\r\n\Z\n\0\0\0\rIHDR\0\0\0y\0\0\0u\0\0\0åZÙe\0\0\0 pHYs\0\0Ã\0\0ÃÇo¨d\0\0 \0IDATxœL»w”$gyÿ»÷{~¾FawgwrÎ=fz¦{¦\'vÎ9TUWÎ9tI«•V9\"ABX0ѰIL°1ÙÁ`„PZíîLÝ?¸·ÎsÞSõÖuÎç¼õ<Ï÷ûV»|魗/½õ®Ëo½t磷_~ôÎ{Þré®7_ºÿÍgn¿÷❟={Ù0:’¬ƒ`¥R.aŠ\00\"€Q A8VDÈN•  H€ÀòS¦©\" g`Ài Ë8YÆ(ÃË0¡d!Ë\rb4\03%-•ÉL†Éf¨lšÎ¥ÊÍ²ùñDÍÅÙ\\\\Î\'´rR.ĘD°^)@VÉEÕRB-%ØLÍù\\˜I…øtŒODÔlR/dØdD.¦¥rF,%™l„)$˜¿ÙÁâ ¸ÉSd>QI‰BŠ.f˜rI¬ „‘E˜.£\"ÁeŒ†HÀé\nÎÀ\r:­Š(O•  Xg+\r&²Ç\n\\…ã* R,DãE‡P¨È’~îü¥»î}讇½ðÀ÷<úȱ».¿íò_¸øð¥»½|ï[ÎÝqÿ…Ëž½xçޙÛt­EáPDK`€\0ÁK( àx ÅKQƉ2ŽP Ð2F^@ÉN軀Óe”,Âlc”G(Å\"žË♠‘N–ۀlÐñ˜ÉùD̵p …C5¸$2B)Mg‚B>$äCB>‚%6ḗHmÓ©:µÃfütÂÇ¥ƒl<ÀÆ\\,@Åüt2Èd#hÂG¤ƒT6ÌdcL\"ȧ#r6Æ¥Â|:ÂebB)e#Åð&‘‰Â±™ÏPÅS.³0ÂV0\nœaœ1@(\0g@ŠH¶B±‚†H\n$iˆ\"‚I¦B³̀R|…á š…ic¡\"ŒTðZµÕÚÝ»çÑGîzø¡cç/>zû¿ýKw=|pñ®3·ÝÑè¢J“\\*œ.¦JH Å\0 /¡d£\0œ*D¿ñ$´€`E”pÀ1\0\'Ê8\rtg /‚teJW†˜bI‚A²˜Æóq$Îú×ÀÈ6\ZɀRJéPºC¢¨CiÊòÅ’Vb~ 䣲i&“r &bA4¸MÆýt2HeÃH|xAß\Z°³\nû×Kx{Üö–ýëåÀÙ)‡6so%€ÂÛhÌOƃl:|#˜l„Ì„¨\\„âZ%#–â\"b\n º˜¢J²œÇ\n9¦2†@\0iá`’1ÂI%A”©PL…¢’ ¦Y˜&Ê‘ H± ÅÃ, 3T…q¡R¨”‹%E“î±K÷¿åÒ½ž½tZkɊAS|&ž…Ë()Dò0VDq\'/\"7c\0Ž–1(_!Ê8R„QA8QBÙ2*–+|±Ì•Ë\\¾Hēh(€¶¨D€ËG”JºÍBmºRƒ j1¥’\\&\"æãdÊO\'ƒX\"_wÓ¥|S€X¬Åñí¾\'úzO ŽôNNöœ89?:;Ó?ᙵlÚìk³³›óïÌìÚôŒÏfß¶Ù¶Žu›mÝf[µXÖm6¯Õº2;»<5åôÛm¡%»Ï:]qd¶<©•ÔÆJ9°A&v،ŸHú°¤ŸÊŘ|˜ÎEØb’3L9ED>ÔK—qÊÝó×CŽY72>Ïöڊۿ±á¶9“¡Ôªs}bʹ¹)„·Ýùv0ILM.ö›êŸuN9ÝóÎr$΋X†£~8@C8 ³ÉbÈ_ŠËÁ ¼›é•µ¬w3áY ڝ‘EWȱè[°mZ¬ÛVûւmÛjß¶ÙB.GÂëÊl¹s[«@p ñDJ‡¸L„ËÄðD/fÙBŽ.y \"@_!9ˆ` /¡ÂR M, 3L…¦@’åhˆdaš©c¥t- T™Àr0Q@©ND¥WJ0+%¸R¨à%Œ,áh¶‚º‚3*ažÉŠ\0ÀòHÔWò¯£ –Ü¡²þ&]ê²J‹¥8™\nòÙ¨THI¹$òÅv÷ÔÄÚüüø­§ç{&o×.œåÏF\\É©SÖûöd ô§Þý‘¯~äÓÅíhhÃgŸ·¹K­àððô›NZ,˽½£T…ôòc³ÓKËKÛ}§\'-s®ž“}§O­-Ú} NFèl’Ë¥¹B\nI…átŠàhÇ @ô‡àH Gá@\0Üö×·³ë;éµ­àâÊêô¼gjÎ56a\ZrOMmZ¬>»3î^-îlƒ-,ì§:&“*“ 3i:—cóE® ÐE€…P¶BP AC sƳ0s£ròÃÁ4Pd;†Q¼„±f\"“‚(ãH …‹\\„1\0CË(’¯P\0NP¡ðÀC](à©™Ž–T\"$·é́„4ȂXŽJÅ›“éڊ{}Öy÷ø˜{lÂ7·°66³84=ß;¹§žùÎ?¿ì‡³Þœª¿úö/~ø•ï|â½Llúoéë?=ÚsbxzÂöW7v/í`)âá3ÆãʼnG«~Æb]ó³} ùò¦ÓwúäÀÀàpßp¿Íjñ:í`,̳|1ÍCÙJ*ˆæBp*Hg“T:…\'’d*M¥Sx<Æ&3T2Ex\"U G‘p ‹&²kÛéµ­à¢Ç;ïØ´.;Ff¼³ [Vkhq)í]Ëo¯Cá<Fãa,£³ÉÐéR‰«`7Z\Z¢°\"N\r1,D³JDX¾BŠ{Œ(“•,Œ0¬ˆcEôF&Ê^Âð†¼„%¸ÊŠT¡Œeò`4†gSåàõáÉP‡ADªŠ¥rŠJȔŸJ‡*Ñ­äڒgftufÂ39±9?çŸÜœ²„­ž¸s³èœ—ÛïyäÉn{ä­¼ëÕß\\ùúç¾êw»ý^ÏÌÐ\0 Á±íè-§Çú†æŽŸ\Z_tlÌ.,÷÷On¯….ìÞ!ÓÚ}ï…2âÆ\'ÒÁŒu~yfÊÑß760<Ñsªß2g››IG6e‘’Œ•x(+V\nt.Årl¡À‹T6+V\0<›¢ÒY6“ç²&›§3Y±Pf²ùJ$–÷\"«ëÁeÏÚ¼uqdjyfÆ96¹i³û—]Ñ57Ãa–¡ñ š a™(žË’%€ƒq¶BÐeœ ¢ŒQ0Eÿ¹9!‹ð±”Ñö\'Ðe 0¸c B\0^Yæ@ ’ˆ\"©xfg½  Ñ€THu©Ê™–À4–\n ’}ÞôúÊúÜĎmÖ5>¼:5¹:5v.åÖÖJëD(NG\nj\Z;CUß~û£t‰BJèù³( ýÀ3ïúÞ¿þëE½1r²Ÿ( X¡rô=Ú%(\nRð©“#ålå-÷½¹Æ«:\'_hŸ}ߓOëW#Å=üTj;=5bíš=94Ý74wbpªlædßàÀP¿Ó6Ùq XÉ a\ZÌÃùQ*H8ÊC A ð(B¶TfŠ%¶TbK%2Ÿ!ó&Ÿ%3\"ÆS) \"Ѹw3¸ì٘·-NL¯Ylë Öm›-¿íËï씃;•d\0Œû*©YÈRÅ\"Sa*0Tè\nN–1a8ˆ8†å1¼€cy„(bxÁJ€‘r™@,Ÿ§KE2Ÿ#;PԗÙX¡Ò‘]?#‘·©”XŠß ¹àzb˽³hõÎͬNMz&§Ü“Açbv݋ÂR6§æ²\\<Ƨ²L¼ðÌýo§3•Û›ç.vÏïkß4_{íKŸþÔ—nùüãã+NŠ+ñXïéA·Ãí_÷?|Û}>ώF\n:N½ùîËß}™!eèR)°¹‰åÀ‘¾‰ÁSã«+;3s˽ÃóÇ&ßtjääÀTOÿhïàÀàÐémï2”OŠ8š†ÉRI%I‚x–IJ&) ÆQ0LĶr0Ä@\0\r) €çÒd!K²x&ƒ¥3L®€FS¹­à–Í噵ØGÆ×-ÎMëҖc)¶î-G‚åÈ ‰ “Kѹ %£+0¡< ùÊ1*rd@²3 ‚—Ê$PƋYº˜Aâár`³ìÛ‹™:žSXÉC±ô–K\nÁÍøº{gÑêsŽ»Æ&gjmµäÛ!’),žÄâ :“e2i6›I{×ñdv_­=~×#ÿG>ù±g?øÞ¿18Æçr͏Ž-YÅý;ô³l›Ÿš¨óòÓ½…`«mÎb±ÌLOê¦C:…„<©éٙÁÁáñ¡‰áÓ#“có££óvûj>Œ\rOÅ¢ÙñQkω±[ŽßÚ;|ӛŽ;,öD(FWФߧ1Tç\r†pBc“eŠWHV¡h…\"e’p‚Åq\nªÈ8N—Š,Pä ²P sy.W¦Ry*QÀ\"™Ìz0âÞ²ŽÎÙ&–fmþååèš;¿½}@p«ف²1$—¡\ne¹BñòVÄI€ ËV\0¨r™‡@ªEÁ즛H†4 wgU¾T“[,šØ\\.†7+I_|cqmabirdirÌ59靛 »V²›`0@eD*‚&\"T6Me³l¡ÀJx2-ÃØ;î{ðãû?óôg>ñìWþåß|ÿ¹hÀ·²²í^85´½¼Zޤe€úÀ۟yàìåm—gŶ°²ìïøEŒ™Ÿóx³S£¾5ۜµçDoßHOÏЉCSƒc3§Ʀ§“³kž5Ÿ}ÆuúÄXωÑÓýc\'OŽNÁ\0XN\'‰r±Æ³gëuãE‚–IQt…T†×9^ex‘fy’æIZ$HEã0„CP¦Se*<\02Å“+™’(@Ñ|Ü\\›wÙGgc“žÙ¹ ÓQðmC;…¨¿ƒñ](ReðRB l ÉD¸BæSp<\07©t¨†•Ú¯^PH¾¯Ä|¹àFjÇ_uï,Z—&‡œ“ÃËÓËU ‡h‰FÈtœÎ\'ðl Ï\'ÑL’*8$ó%<[úØ{ßÿُ¬¥\nO½0c›š™Ÿš›Ÿ˜Ÿ\Z˜XœuN\rO\rŽŒ\r÷ž\Zí?9?¿<>¹4:éµZ#›ë™à  ñ0™Œa™8žMQ…,YÈãÅ<–¸LC\0\r@¿í˃ùX°Âé(šŽá©•MSù<[*‰0, Sx–qÜ ™*M?óØc\\¸°½`•Šå»jƛw»u.‹KߔovIˆçá\r_nskqb:äÝY˜².YVF<Ó®ˆk{}aÅ9i]·,Œ[¦Gf¦§Æ{Ç&zG{{Nôž¼µ¿çøÐñ›oySïMoê¹éM=·Ü4pë̓\'O œ>9Ðs¼¯ïä@ïñÑ¡¾™þþéá±ù¾áÉÞ¡±ÞÁ«Í‘Mäx‚×՚¬¢¤)rUtY¨\n¬¢ˆ†È©«(¬ª1ªÆ¨2§H¬ÌS‚@Š2)‰8/‚@qÁ0NT0\n@Ád/•±|NÐt©Φ}ñ­Åõå¹%û„Õ3g;–óo×ÈÊݝê‰ÄS¾¸×–\n¬%Ö<¡E×ú̂{Üâ™XðN[Ã.#ÉT9\Z©dp>çSX!CærL®À•¶ ñ0ʏb*Í ÓäÄÕ@ãÉ&Iw ®YÁß{÷½+#³ÃƒC½ƒõý?h¬øì£O|üÍo»SS#®•5Ëâšm-µ.\nˆ/ûž»Þچ¥m»Û66??:;3:;Ü7:|jl¨gtèÄpÏ`ßðñãýǏöœ=~Óà-Ýü–¡[þz¨çÖÑÓ\'ÆzŸ¾u¨çæ¡7¿i¤çÄèéžÑ¡ÁÉá¡©©qË܄=LÔäº&ê†VWdC“k†\\ÓÔº¦ÖQã•çUDFÒD]eAx^y…§R V 8£ˆ\n&b Á4\0P D•+X¾Œd‹7ˆ§6£+ÓÎåɅc·×´\0±lp5¶½’ñolÚl+ÓsÎáIÇÐÄÊØtdÉSò P%€HO¥ðL+dÐR-ä‰\\Q(2Œˆ(®ÐœL±\ZË© [ã寵x¥Ž•ªï¹÷áϼë=w©zjmukÁaí›L¬ø¾ø¿ûã÷¾ûÆÿ°ZÊÇW6Öf]\"À?ûö9póTß-\'üõ_Ÿì99xúäÈÀ驉«}a)°ˆmùó‘TÒËS9,µŠoc[þøv ²åÛñzS‘HxÇï]YsÙn›Ó·º¾l_Z]r{««Žåù±iǼmÃíµNιæì®Û¦}%´¼á_ÚpÏ87Þ\r«gÛáõZV6VŽc¡lhÛçZÚ´/:Æf—&¬VwxeŠ¦ËH9¬DÃ@4PŽÀX˜He¸2DfËT¾Ä•‚4 7(ªÎðŒq¤Æ *FÊNæK\ZŨÆ÷Þ{W»þ؅ƒzæ]çx*áX¸Sž}ì‘;«òmcáMõhµÉ’r¨òDûÁ§÷ßþT÷m_|û?™?xÃüÞóë/~ù—üô÷øÔg?yÛíÇxŠÀJÖ;¶¶:±¶<évMy\\SžU˺׺™t\'2îDi#Wñ8ÿcÂ=p|¢ç֑žž±›oîëééí?Ý7522㲯l,yW­n·Õã˜Z²Ž;¼vïÊüʺcm}qÍ9cwÙ—íK‹³ŽÅéÅU‹Ç5i_™[\\ž[ò,¬l97ם[>wpcyÛãðºÜ˖•ÍÅMǤÃ>³hŸYô8¼K³++óžÅÉ%÷œÇ·¸uÌçr…W=ŽÑ ×èœgÒî™txç]¡å­ðÊf`i5ººZYz½Q¯7²¾Z÷n-¯„¼[>·7º±µírùÝ«û¢sÖº½²¹±ä]s®¬;Ýn‹}ݺX܉=uÏýOß{ùž¦úíOèsïÇ}-龪ø‰ÇiÀe)ÌÝòÒՏ^º?6æ|OçÑOÜ÷W¿ÿ’ùªi^3ÍCÓ¼fš¯š?û¥ùŸ?þãç¿þëOüËÏ?òùŸ}è ßzücØ} [)¤±ˆ#°†ÎpØI¬&ò9È Ø*–·ÊùõRb9»<±:?d95wêøÄñ[†Ožë9=qkÏèÈðÂĐ%°ä.ãkɤ7_MG=ñÜN!¿ÏnfKþRn\'ŸÜÊd|ùb  †@0\\.EóÅhNUÊQ\0ƒPãP)R$ŠžÃÐ ‚§14ƒ`YÍ •8ÛNa1N\"Ioô˜}tb®¯uzÞ3±à³zÆíÞÇò”ÝkYY]ܶ¯nÙ<îç–}uenÉm]v[–mã6×ôÒº}Õ=¿´4m_œ]Z²¬,Œ[—-+n˲sÒ¶2·èwe×ï½÷¡§.Ýv‡B~í£OՑøí\Zòæ]½äu;ÞuËXØ1û›¯|‰òìžÈ?¿ó“拦ùªyíÚáuóðèèºyíÈüÝË׿û½?÷¹_}ôcÿñÄ»žûÐGü¾ýç“ïÿÒltáµ\"¸¼@i\0¶Š¬ø\0vôoßøîSóå‡Þòáý»»V‰³|œCü(˜0A16BJqJŒÒB„á\"<î\'àm0ãIùáÙᕱÁÅá~Kïô©“ã§zgn훜œq\0Y°Êê&ʸ¬Š@ŠÎK„ 0±+aŠ„ˆ&H˜À³Ks Ns#“¢€q,Br(E\0 Œ‘%ˆ)!t•P¦M×|«vk~É:a9rz\\#³+£ ®aËʸmy¾n÷€±t%‘-…cY_Nf x˔ádÊ#|™ š) ta‹˜Rx`AœƒÄ%˜P¦Š\nM\\¹§uÛݍ}6‘Ôò½˜ÒÊI(°š[óÄV܋ã+ƒS±ÝÂäúnZüùç|tÝ<2MÓ<4ÌgæÑ¡ùê«/í_ýìGøÔÓ_yä-æ~ø¹øà™‹°z§Àòq‚MRh°Â&)\"sqZJóJ‚SãB#W­¦51ÊÓ!Ü)GÝIë˜{¬Ï6Ö¿Ðjª÷ÔdÏÉÉSÖÓÓ8Jq8§³ªÂ*-)”¤P’ÆJÎÊwãRÀx%B”§8Žd9‚QhAfE‰áx’f`„C1\'¸\n¦bt‡W©õE×ìî\r§×5¿ä˜tì,o /®ºÇ-Ë#‰û\0\0 \0IDAT£sÛ îí÷ò¤Í5»°éôW7ò0TX\0 K%2_\"ó%²Å2^(‘%€ F˜\nÄ¡Ø\rùÄc´„ÓB¨${®ÚyÛ]|ìɧðp \røùt\\È&«K[vÇüé`#äØ#¸ô„ùªi¾n™æuóÐ4Íã?­ë×_;zþ×/}é_þ÷#üî“O~øàÜÑ¿}ë]õÖãz·•E«YRÉÐm¸JGP%ËIiVÎ RVÔ²Š’à\Zy¹^µ¬ÄÇ9$XI¯çV-¾é¡Å‘ÞÙþS“½½“\'OMô\rZN÷Ma©³ªFJUN3$Mã5ƒÓTZ68]&%ƒÓeFÑCt™S5^W$¡xUNAáe™åšQiÆ ¹6§ðe¬Hlؖ§ló£sŽI›ß½§A¡…–ÜK£ÓÎÁ©Ôª¯¸Kxw6l΋Ó:>¿8=r¯Ãa9¢ÊeBi\0æ*˜B0‚ñ(Æ!¨€’\n)Š\'‚L0\nAÕhn_Ñ¿tûûzHH&:•\n¼¾¡åsàÖv̹ÜÉÏ?ø®/=úþ_|êßÍ×Móмb^7Ì££#Ó4Í#óèíoþÏÏ^øì§þû}ïþê#¼¯Ùý\'Ÿ¾e›I¤§µYˋj†“”œfä §æ>Ã*Y±šky¾Võ²,æD2B1zÓ±Œ,Xú&O÷õŽÌ [‡§ìÛ;ÁN½[å\r×4¥ªKU•¯ê|Me\r«\ZBÝêU±¡Ju•¯\ZrM‘tM­)¢! ºÈ+<+è²\"³ìAµŽ¥\n%_Ü;³¸2·h³,Í8¾¸ˆòM¡*Ã,š/ó9WmCSŽÁ©ÂV\nEnˆC,‘Éûb¾Åõ•y×â´Ã5»¸µ¸Z\n§ ‚n‹¢J’Ç* %‘”Bs*-k´l°ªBI:«éŒÒ•ªeý.C§ 6› /:ý¶9$âßY˜¹@ÑÿùwzîŸ>ñ«o}üvÍ4ÿÿyúèÏã•×Ì?üÞüŸŸüòcÏ~ýÁG?Ò>xàÞ®uörøn‰k%FK³ZšÓ3¼šåÔ,§§ÅfQl¸f‘¯—…fE5\0¥ƒ7©8^N;§¼Ó#ö¡é¾Á‰þá™ÁaËôôâÖºŸ#UÐkz«ª5\r¹VUêšÜЕ¦&7T©®+M]©krM—ªU©VUj†V¯uC«ÖU}¯Ölˆ*˜Ìn8V×ÜKې5¸”a¡#Ôd‚Ó9™‚A9æ_Ù°L/O.v‚7 ~4ž¦39:]`\np!Ž¬E“‹Î)§kÆ^Y\"q š’Д%•aU†×Eg5•VdZ“(µ.ÖvÅêåzóþvóÞfýíw\\\n,..ML¸\'Ɲ§O݆ßÿû÷ÿêß>sí…çÌÃ7LóڑyøÈa}í¥?š|ùÚÿø—ûÄ×~üƒÍ3ñõó\0ÛÊQoäèjžQS”–fõ §¥Y%IjiVI2F†©å˜VIh–…zY¨’”ãj`µ¼\rmØü3#¶©që©S£ýƒ³ãcö¹Wp+ªòUCmÔªíZµ[7Ú\r½Õ¨îêZËкºÖ2ô¶®µªZ»®¶jӐ4MPj¢²g4jœTޤ½6÷òìâÒøâ¦u‹È ÓÏVM&8#yŒ”)šÃ\ZEEV·çûƖF§¡` ÅÑXœHå¨t–Læ˜@d\02[Á3•ÌvÒ5étÍ..Í:֝ËP& w»U^ÐXIgU•ÓdVW¸š.gôip陇î}âî»bk^ßÒÊêԌ§ð©ný{ý›+?þªù‡Ÿ›W^6®™æá_Ê¡išæáÑÕkæëWŽ~ó‚ù??ûíg>ûoê.=t?mœ‡¥N™Wó¬–c•$©$I9M‰IBJÑB’’Ÿ Õ%ÅñZž×óœ^kÖE5°Ê$™ÐRØ9ᚘ˜µÎÍ,/Ì®WW»U­mèíjµ[¯µëÕVÝhkJÛÐön„®îVÕ½ºÜiʍ;ö/ܱwV\'X8ž]œ±ZÇ痦—F—\n;Å}q¿+tª´±«u$BŽ#Y‘æyŒ– †#ˆc™ÈÂÀÄêôBaǏÅx\"‰\'³d*ÃäJl äA” ®‚é$!ßJÀ5ëZ·Xg,‹6{p}ƒ‡Qƒá4š×E“k’¨k¢~`´K;¡J(øä?öŽÇ4»×ü×úÈØƒ\"ù_ÿ̋ÿù…ë¿yÎ|ãÓ¼ztø†yxtdþ9_›æÑÕ7Ì+¯›¿ýù?¿üý¿ô“?ûÅRÝ?ȳ’¨ç!Š*IšOP|‚4Áù8ÁÆp6I²QDKÓF–Õó‚–õ’ÖBšg¨.#²ÞŒkÚ=Ú?{ºgtrÜ>;¹<04ßÐ:»{ç½U3öڍ³õZ§^ë4ê{U­]S:5e×Pvuu¯fì×ö•–BP±@È:aYž[žë]šZ‰¯%%@¾ _èH]ÕtA¯ò†ÌÈ2#ó$Ë”Ìò,Nr ,áݱô.ŽÍT\"1\"DRqºTÂ3\0h\0¢@ˆ\'8gAR%e`J¡üªÅ㘴Ù&,®9;”Ê´euW«íê͆TkÈÆ¹æ^!± ö%V—*áíwÝsùÎFËgq†æ,lôkïy³ù‹ï˜/?ÿÿ±>úSÊ>:::::2Í×^5ÿðó×ÏÿôSŸúõ\'?ó½§Þÿɋ^È1þ\\Eß+)@Q2,#ØÁÅI:N`¡JÅIJɰFA¬–½¤U¡j£Ro€Õ&TËoä<–™aûPߌݺ6=íèœ\"`JÓz­Û¨4«gkÚ~£v¶ZÝ«×÷êF·eìÖ¤fWß=W?èu(šõ:Væ&禬ÖqGn;Ó¤šçj·5øNoʌrc·Aãu‘’$Z’A 8gdŠg0êXrÓo_ÃÒ$\" Y(“ÆŠy\nX¥Q”#ÇyŒ0N@é*©ì\n­*®£IleÖíš^Zžw¸-öôf Fò{Jõ޽³»Z­‰¯Û¬‘×ú܄XÌ]$µP>CÒ¢ýgŸù°ù›¿þüsæõ7Ì£7ޝ˜GWŽŽLóððúUóèºyý\róÊkæK/™/üî_ýÚþå‹ÏüÓ_¾ÿñ31è—ÞúDíÒÃâA5KK)RLÑT §b8›¤˜‰1Ũ9^Ér Ö*µ:\\o¡õ\ZX=ϟCðòìúܨsd`~ɹ9:eé›,¤KÕj×0vkµ3Uý aœ¯gªƒZµÝª¶÷k»·uΝ­íeÉMçškÆáœrÚ\'œ¹@±É´.¶nk+»ºØT¥ºÄh\Z¯«´\\ªšP“XEdäªT¥Z&Ee9„=óúæÆ-ƒp2ǔËt©ˆ\nИB0\Z\'xš(Š#(çN’)^¥¤:g\\h]ÐIŽ#«Vïâ´cyÖ¹a[Î섈\\ù@©uH9³ºSÜ‚ÁPvÝs؟¼pásïzâv¤üÓüèÕÿù®ùÆKæÑµë‡WÌ£7Ì£«GG×o°>:|ãO¬_}ÙüãËæOž»úÍoüæSŸùÙŸ}öìÝ_{Ûûf\Z ÝzŽRR¸\"ԏì\0|‚¢Â(&”,¯åP꽍5\ZH£Ž¢u^<EÐmWd¬Þ2³<2bé›ý¿÷–³X½~ÖÐ ý¬¡ž3ôMëhz£¡×Ï6v›œZ‰Wç\\ŽI‡uÌjs ìŒqþb÷Žƒæ…š\\×DC•ªŠX3¤†!Ôu¾¦òÕ›;«è’!ÑO!\n˜x,½™ï›pŒÎg}Q\"W&ó%ºTb+‹,Br8ǼH‰,NS!S¼B *#j¼.ӚÊÖÚún“oAÀïðÛÇö)‡}Êêw­¶1ŠJf¸T.duÊùìóKÉøÇzàQû¯O}ðÊ/~l^}Å<ºj]¿Q¯^3Íëo¼úƕWÌ£kæë¯š¯¾rå{ÿùÂçþñ…OâÛï|dz.½Cß¿Õ:9FKQB‚S´’a,ß,(j‚ãc¤šåŒ‚h¥\Z¤Õ`Ý\05–UP>\'œÁdr»°0á²Î,ÎÝ|z¼¿wZd[úíšzPÕÎÖªçkµ3µj{·³§lÚuMÚǜ‹c®ÍyØSAùbëŽ3õÛjJGÓZšhԕ†!VoôàºXWDCuQÐxN‘ĪÀj- ¤È‚DÈÇR[!ËàÄò´µI Ù\"š+`ùößxøó.ݪÛþs9ࠈÑ\\5RУ°Ä¤F!%ZæBYd+ZZGœÞð¢×o÷¬/¬¬Ì-º-ˋóË«ÎMeCÁëhŽí”,ãî¥ÙU äΈ»vï8«ïæ·âÛ nçøœu¶8µ²i÷5¹½]íB»~AÓv£[mTN]k4µVSíԔÝK[`º±§JM]ikrCjU±¡ñº*èºÒ”„º$ÔyÖàh¡ÔcY_Ô28aA’e<áy˜,cT™à†Ã9Ž–8Zá]á ‰UTÙP]ãuƒÓ«¼Qª5¹nH\rMnèb³!¶›R§®¶w®ÑèFÀüãkæµWÍk‡æË׿ôà[Ÿi7ðÉ÷™×^4®þYº\\?2¯šG‡¿ÿoýì Ÿyþ ŸúéGŸþ—ûν[Æ€S2¥Zx­lŸ‚—ìÜÆ¦º6ÃÕHN匠†A5\n þ ëK ’g;æXµôÎö. N[‡fmcç”Ó=çY³o¥¶ËXkRçЌ8zzˆ û\Z[ð¨\0½8nwN8£Öµ™µàR´Áîwå‹uýŒ¦u$½)kmUmz³j´êF·¥·Z§®v5©SSv5©Sý‹¼Tš†Úҕ¦ª4T¥¡JMEhI|MätŽVDZ=ÝØ±Î8Ç犡$ž‡)\0Ç@äÆ/7-I¬\"rºÄ×$ÞXEá5]0n$©eW㪚h¨Rýë–Ôj)Í]©±W¡Ÿh·ÍW{ô»›‡/™W^1_{Íü¯=}®c¾ü‚yýµ£†Þìüê«üáwúƒç¿ô?ö™¿ë\ZÂ@#è§½«YÛ|Ön——‘/áÙ®†³Z ¥RF¸¨\n¼/-s˜7X^ÙJ9Övf7ç—ÜӎÍùåõÙ¥-‹{Ç†3¾l!°€V£öe¸µañßNî)þrlÚUÙÎZO/ÌôZ²[Å\ZÖ=[½ó q¹¥Ÿ¯ê²Ö–õŽ¢·´jGÓZªÒ¨jݺÚnÖö µ£)]CÙ«ª{šÒ­ê»ºÞU”–*·tµ£Ê-]i+b£ªu%¾ö\'܌~,ºî·ŽÎØGgÀhž( DÜ‚)‘`eŠ—Yå4™­ÊÏ\'tUª\ZRCjºØ¬)šÒ¹aÖԔNC鶔vKiî)õ3(óí\'ßjþ×7ï {Íï}㍟þؼúŠùÚK_yú‰×~þcóðõ#óªi^¿b¾öÂÏ~`^ùùúïÍ_ÿôgyßûêÕˤEâµt^ §ÕhFčh–Zõ“ž€Hë,¿™à·Òôf’ÜŒÁÞPѽ³­%¬ëQçfi3^X›ñÒf<·’H¸@\':ÏԙîííûÒÛå”KНäZ2Tr-u®~ûÙÖå3µ;;ú…šv ËMYkkÚ®®ïiZG5ÚªÚÔ´Ž¡u[õ}Cm5ëg©]ÓÚÕ³UuÏÐöt½«ªmUíÞô†ÚQĆ&·t¥-\n†Àë £ËS³½ã¶áY,\r„p#)„¸ÁZgUÕ¦jH\rE4dÉP•š®µ4µi¨ºÚ5¤VMij§ªuëj·¥u[zûLµSˁæs?2?ùá\'sqó•ßýêß¼þÜs¯}û¯üÇ¿›W^yé·ÿû‡ß>o^7Í«æµ?š×_4¯¼øêwþý›o{â½jý!”½PÄ:i°+ÔÓe#Q¸“ßÙ8óáó÷ýMõB3TjD!֛BÝQ|=V^ÙI9Ö\nkÁœ\'XöÆBŽõ€ÝYZO¯ùó›áìFˆŒ•…4¤åI2‰ò ,ÑÍ¡“s×ï–}@ljå<×½P¿´[;߬Ÿi5ηŒ3ÍÚ^µÖÖõ¶¡u«ê^£º¯ªÍjµ[«íZ·QÝ­ݺ±gh{Ú¹Ní\\MÛ×ՎaìjZGÓvuu×Pv\rµ£É-Uª+b¦$Ui°¬z,ºêŸê[œ²•¢9$ñŠ\"$ƒ³,Æ*¬¢ñºB©:khBC•[Š\\W•š®54µ®k\r]kéJóƛeèíªÖîV÷›ZkÏhu\n°ùûßýü‘>F¢æk¯]ûÕÿ¾øo_ùî¿þògæÕWÍ£«øÅ/~ð¯½ô«ÏýÀ¼ú¢ù۟¿ÅÐÞ¥5ß)4·ûÔ¸oÂâèܞ™ß˜˜Î-¯\"›9’{÷îûYœX @K¡¬}\\‹f—wP_ª¼óÛ×ܶ…Ñ…±ž±Ñ“£¶Q«cbaqÊæ±¬Ï.qi‹\0« ›Û+i0ÊÞ!]VÂøÚIËý{—ºµÝºÚnh»µj·ªµ\rµaèm]íhÚ®¦îÚ^­Ú5´nUß­{õê~Uß­×võ½†¶Û2ökú®®´\r­«i»š¶«Ê]îjRG²\\—åº,Õ±Á1ú±äFxv`Ü11&³,„R\0J,GòÉó¬¤ðš.Ö«rSšr£J´u­U«¶u­Q«¶«Z³¦wêj»ªµëF»©vZz{¿Ú>\0qó÷/>wïƒï+•Ì7®˜æËæáKæ/¾ð«Ã×þ`šWMóÚÑk/›/ýî“o~äéNó‡|¿ùÜ™W^3_»fþâ÷Ÿy𩋀Ìïä¡õHrћpz²K^l+.ûßÙ¸óoÛ÷1ž4á͕Vã–ˆ—SžÀƌË;çöXÖ=óÞÀR0±šÈ®¥°TÕ¼7NFŠàN–ɱ—ڏ„yN/œÕ:\r½U7º5¥eèíFu¿ªµ\rµ¥)]CÛ7´ý†q¦n쵫ê~Mß­{ú^­¶[­µ[õý¦Þ­é»šÒÖÕ]ÃØ×´]Uíjêž$4©ÍKuYnJBS曫 ¯Æû†gGÆ¡l(A4HPÇàC\n<§ˆ‚! u…«É|S曊ÒR”–¢44µ©*\rMm\ZjK—»5e×кU­ÝÐ:­j§[o·Äüæ·¯ú³ÿ|áœyõÅW¿þ™çÞqï׻üþòŸ,\'óÚÑ_œ½+GÏõk¿üÚÌ_ýÐ|þû/}ùŸÞÓéì&Jí¸Ÿ£ºº\ZÁ…MZÍþæó?øÁ‡¿h~÷m¶ j .ìTB`q;ŸYMf×RÙí\\v3 ŠX¤B°­æù,S«u|÷|õžÇïxºìa\0B÷µ½ºÑ­é»-c_WÚUuOWچÞnÔ\Zµ³ÚÙº~Шî×k»ênÝØkg\Zµ³õúÙjõ Qß«W÷U¹£kûšº÷—Õ®,·¹+)]Yê\\]dë*[;– §ÇN\rÏ Ž\0BS¡9X¤ žežÓ®*ò5I¨‹l]‘ÚœX䆤¶4­£ªmI¨+RSW;5}א:Mu¿¥íuõNGnpÚ§yÌ|ñ¥þí»ÍWûÇ.þìüîÇxÔ¼ú²ùÆËæõ×ÿ¬Í[æ«¯üî›ÿöoo{üã{Ý¿Ûí>.ˆg2ÀnØMãÍ­ûqcQóç<üñ ¯|õGl=|[J5¢4æʛy4XwÀ¢¯úJh\"C0€¨ Bø+dæâdl´ÑNë4ÉÝGÏ?ÞF;øzIM1{úÁ^ç|»q¶cR§^?[¯ŸmÔ\ZÕýNóœ¡uoÌԌ½fýLÝØkÕÎ5ëçjÕ³úùVãì\rúõêÍØ×«gT}¿jœÑÕ]]ÝÓÕ½ª¾¯«»ŠÒźÌ֏e‚É¡ãý¶‰¹r\"Ç@$\r‘,Ìq„ÄR*Ïè\"[Ùÿ—ŠïŽn㺳†ˆ™Ø«Šmْ-Éj¦:{G!@ X@‚{;Ñ1½Wt€”-ר)¶ã”u¼)§8q6՛²_²‰³éʼnw[’%«Í÷hï.Î=ïÌá™s\0^Üw÷ý0ïV<¡ÕåÈÊRxe%´²Ù6¦5ÄïÅÂAÊ·6ˆ°—ÜXŠ A\Zñá¸SBôÖFX}ïâ;?xQ}ï͗Ðð‹£#_Yõ¨7.©Wß»uýýÿá:G÷×Ô×ßP_þÍo>ùÔ3¾ÈÖ¤çSêÓhTvoà]óËg9ÇÆ+/¾¬^UÕkê¿xù­oý¿øp`µÍí1Ž6ô-tMÏwÏ µ9]mCã&÷pËàXÛð´ibÊ8>kYí] ‡£‘È\Z™Å£áåa†ëûÖú<° ‡ÉPˆˆ)8Ìýt8Ȇý4`Â^<짃~\ns‘ ’ÂãE$ÂGB,d‘\0û頗 (‡Ù°Ÿ{ÉÐûØÇøWѼ«¨¦×Ø}GÉî{o»g¸k`adf~tfaғ[¿,Î{sD¯-EÖV`ï:¶¶öm ëë¨ÏGƒtÐO|x(@‡ƒLÈG¡ƒ94ÂâaZ€YffY}çW¿ýuõwŸØú´©çÖ·ÿ]ýà¢zõ=õƕ[7?¸µÝxúð™w/Ýü͟þòůÿèüǞg҉aOrd\r·Ž}I¼ð篾¤¾¯ª¨·nÜTo\\»uñíK?~ùá9l¥~í_[³ÍÁ®Õ¾¹þÆÞQÃðh‡k®{n¬Ã=Ñ>>e˜œëš_ê]õ:ƒQ8<‰á‹ ».%Â鎣mËÎE$ˆúÃH8‚Ã!‰°á0\nÐA?\nÁ\0G(¦„ ¡4Jðá0‰À$ILG\"T$DÃaÑá ³îCƒ:!”\ná@öûÂAœƒ#¼±ÖØZLÇîo8B1”Š„±pÃÁ`8‚ ‚ˆD\"0 £0¡T¡ÄÅÅË?ÿ±úÆß_ýìçÕ_ýúæosó¯Þ¼úžzí’zý²zãŠzãƒ[7?êí©7/^RÿñúÛßûÑïžü̗páëâÖSAîwO?÷UŒü~œý›_P¯¿¦^|E}çŸêõ믾🟠¤7šGéþp׬¿ofÝî^0Ì\ZçM£sã3æñ “{¡gv±{~±{Þ;´±1¼\Zaóx4SѶÃ-JPཻ¢VýôŠ_ñãÜ\Z 1‘™|iY\\‡—VÞ卉dÞ Ïm&Ã3+¾©…ÀÌ\"¶ê Ì,{\'=KΉµ‘9ÏÀD`fu¬gpatbÉížš™v¸r»ifûÇ&º]šžvÓÑ=wUß¾ßÓ?‚-®ÃKëå5d=Húþ…eÌD¼<–)÷!QBB4 ÉuXQqJ–PŽòcqJf‚XŒdŒ#¤àE’ëHtfö›ç3êÅ7ý¹Ïÿþ‹_V¯½­w¿\0\0 \0IDATÞº|냋êµKêµ÷ÕWnÞ¸ú?Nró–úÁ•kúãkß~ñå\'>ùhæi/¶5¹ô<)>íY™ß¿ï)çÏ~öwÏ~Fý۟իWÕ«êߞû¡`_ÝabØ;ožll˜n·/˜³ÆÁ9Óð¢mrÑ6½Ü=·lŸ÷9WBãx*ŒÎ!‰HR Dƒä\"Q{ìܽ{ž>vúܱ³Ç÷=yèÄ©CÕgœ:{ìäÉ£ÇìÛîÄ©“÷¯¾ç؉Ǐí?R}oõ©£§ßs䮽ûö߱û÷íÙW}àø‰ƒÕï{äÔ¡ÛÜ·ÿØ=»öW8qöÀ‰“ûŽ»óÞÓ«ï½ýàá;Ÿ;R[{¬þìþ³göŸª9tæÜÁÓÍ\'šN¬i=kj?k>w¸Á\\ßÓ|ÊÔÕê°µöô6Ûë:gÚû­GO|ùÁMõÚÛ7ó_øü3oüìGê÷o]¿¤Þ¸¬Þ¸¬Þx_½úŽzé-õò›êk¼ú«—Þúö´™ÜrOGÚí”Í19ê\ZJË>Ëêµ·Õ÷^ÿF:¡^¹¨Þ¼vý׿{`Ânï“Üþ Ý³Þ3r̬[Ý=÷ž¶<2ÙØ¼h².wÚ}=#A»ÛÛíZ³Á£sĬ—Xã8‰Ä‘Tò‰ü\nÍ,“ì\ZÍxY6$)h\"Ž$ðBB¢\\H¤7XÑ+dŒà—Y¯È\nÊ8!IJ^R \nè\"LoPl yÂÁÅ ²†Ð~ŠXÅCó~b.°e4<FçÐ\\PãlïšèrŽ[CöQsß|ßèD·k²kÄã˜Y^\\òxÝ«‘)p|Ÿ\rF×è%Œô ÁI/<ėQb#×(|…àü¶LˆQð2Ñ\0Ç®`q˜WVYï†zåmõꛯ~뛯ýÇÕkï©×.©7®¨×.©Wß¹uéuõ­W®¿ú»[øo¿ø¥_~ì£˞ˆ¹¶DLŽåÆvÇñ“wícýꥨ¿ùñ3ÞyõÍß«7ßøñƒó&fêçç2 ‘ø|\\Xét©ï:|¤ïÄÉ©¦¶…vËZgÿºe`¥«o©ËL“K!÷\"¹ó_Á°\r óGu?æ\r£‘ÈZ8´FýDd…}\ZÀP/Bʏc>÷£¹1â !ˆóÂðz\r`þ•\0Ĩ0F\"ˆ7\0o1و ëáðJ\0Y\r!«!MpÜ™\\]wÍÍõº–†Æ]ÙÕ±ßÜZh)°:³â_ôù¼þùð’?¼z|þù\rx%ôø\"+¡ÈJ(²\ZD6\"‘µ0æCC+Ô ã¾ÄèFù|¡aç?þýëêû¯©ûÍ­×þ¬^O½qQ½þžzõ[—^Sßù«úßÜüó/®ýì[úÌÇþöá¶N´»×k°¬¶\Z§ëšìÕg\\\rM¶;÷G펨µsæÐÿÂS꥿~ƒÀžÀ­ý¤cqL̵uV7.YúÆÚ\\5µŽãՎãÕ9ºÚ-k–^_÷€¿wŽzÐـàI‡)8¡0”ˆD¨0B2ˆ£ö‡±BGpÂaüㅩ@„ô‡‰@‰Àd(Œ‚T8B†`\"ˆ ~ñ#x{ƒð†ŸŽ DA}a<\0#ëAdݏmp¯Y÷kBK+¸7¸:5³0æ^™ZŸ›Y››Ìy‚ó˾ù%¿gÍ·¸X\\¬úáhu#²@ÖÃÈz^Ûf™!¸/‚`2„Òœ t¦6æB!niñcp@ýïþùêo¢Þ¼¤^{O½òŽúþ›·Þü«úêooýágWñâå¿ô5#:Mk­íËm‹­†Ñšº¾êÓý§\ZF›Ì#µ¦±\ZÃ@uùŽ;GøÑfúk4;qüÄJ[çJ{ÏlGÏPaªÅ>mè™l³ŒÔµöž8k#H( ûƒ,BbþHā}0B`˜\"d BP.ˆQ~„ô‡q_ˆ …1õÑ`8ì\r†ÖCÁµ`x#Xò…V}ÈzpuÚZ „V‘µ¼ÂÖC¸7YÙ-{5ðÚ\næ]ߘžòÎL†gü³SÁ¹ùàÂBÀ³ä_\\\n­nWÖËkþ¥U¿gñm„W×\"Ë>t-Œ¬†\"ËÌ £¾ppÝû`Øã~”\n¢„7BúÃT Â1%ˆ‰‹Ë†7^ùÒg^zâ¼zã¢zåõòÛêÅ×n½öÇË/ÿøòϾóƋ_øAV–ûìKµ\r&ëRGçtCk÷‘}gëm\r¶FscÏhÓàxƒc¼¾³þŽ}‡ŽM6ûÁccµ-uw“m¤¥w¢}ÀÝnŸlïm0\rÕ¶öŸ©7Þ{¬ýÀ᡺†Ù6ãl£aÑh_uŒyG=Á/¾N„×1ć#~ó!t˜$“xˆÀC“H%`ö‡ÉÊF(:HÒ!‚ `÷oï^¬«Yh¨_hi™¬k´;5p¦ÅQÓÞ×lém°6÷¹[“­ƒ3íýÎs®Ú¶C×\\»eªÕ2ÙÚ=ÑÚ;aœ4Ï[]3½³ÆnWs‡ã\\Ã@]³ùHuÿٚév£§³{ÙÖçš\\wÍù&7Ð5’Æ£,.ó¨ ¢DˆésL{Ì#¡¹ðàÌZ·s®³ÛÙÐêlhuÔ6:jjgÍ] =«½ƒëN·g`l}b…\n0Q>Ëã±(•IE$ž”9ZXEbbU%JÊ\n! „Ìâ2KE9Bé¸@ÅDRÙ%q8/âÛߖˆ õÂTˆÀ#Ž8JM\"‹±<̲0Çã\n…K$!P$G‘‰3,Á‹t”Á$—*ÆŠHÆ8\"e32‹’ÑóBö~6ñ\0!¾ñ‹Ÿ©×.ª_»ùúŸo¼òëËÿýÓ׿ÿ}häd͓¤ˆ\rMŒ×Fê Ý\'›NÝvàPùÞ{­\'êæL=¡>÷d‹uÖàkîžk³÷Ÿé0©¨±ŒwôwŒºÉIoȽG[°WWvjÏ!óñZWKçHGפžÐí\\îZíqúúÆ# ÁŠÝ䈘H\'7câ|Fa’2¨8ÏÈ\"XE`cé¨ÄÄb\\RaâQ6!ÒQŽò\\L`c2‹1J”V$Z(E¤£<Y d‰–ãlL&%–ZHQ&%‘5ØÚ\Zæ]ǃ>4Dƒa4„àa”`Tˆ `’ħHœÉq- œˆŠ<\"1ˆÈ`Mð,%²¸ÈCJc©(G+<#óL”£’\n—ÉXœMdùL†Š]`b¿þÆó굋7ßþ»úúŸÔWþûÒ¯þãõï~óWO}Êk¶üî‹ÿ–òlLÖ]5FÇ©¶þZ³¹ºeŸ~ïú;êlܘ/`vÇf‚Á¡™­0띃ǖ£RO°ÙdñXäÌú‰;©Ø×y¢¹ùà™ö#5C­ÖqKïŒm`Þ6è±\r/Xú×úÆ×]óáùPŒNóLœgâ ©H|Jä’\n—é¸@D%*.1 ŠÉlRáR2—˜˜Â%&.11QHðlB`2P¨¨BEBÎÝ QQ‘T*\Z¥e…’c”\"R’ÄÊ2#ˤ(2’†ò¨@€ úñpÃx%\"\"¨™ãš\"XŠ`)”¦`Š‹0<̳A@eYTàq%7¹XFùÇÊ,#qLRâS1!•2)!R‰™ç.< ^»¨¾õÊ­×þ¨¾òëË¿üá?_|þå§>!¹ÿú•çöÃSMæñæ.ۉ–)Óмe¢ºôøÉ’êšŠæÛêŽæßíl°YN5Jk°lq¶gdcxnÌ2xâîãGï<|{ÑmûKïhrÌYǺNw«Z:Ç-}Ó]ýs]NOÏèjÿä²c|eh]Çy<Æ3q†Š\n|\\“Q%# ižM(LZ\"Sq~Sá22›Ž ™(ŸŒòI‘Žò¤¬p KŠ|JâS\n—R˜´D%*–ÓµÂÄ£´\"“J”V¢¤œ`b-I¬,³¢B +k¨@„†ÉPÃx#`’„q:L2šDh£Iœ!0:×TäpŽ\'—DRɍ,¥p‰&dš’86ÊÐ2Ã(…ÇÄE.. q‘Wbb\"ÎÆÒ\\üAžQ¯]Tßûç­×þxó¯¿zÿW?úÇwžÿÍ3O>òÿøcO|¦Ûa?cì:ÓÙq¨ÙxOË`}Í6»Ü3íl¶™Î¶ô5›Ç:žž¡éÎþy›kÚ:´40¹:扬¢\"äð8O\' œgÙ¨(Äd)!rQސD:®ˆž‰‹\\<*¥e!.rQYHn“Î%E>%²i…ËdR ›Ø˜ÌÆe:câ\nÒ±‹Q1‰U$V‘9Ea‰•5TÁü!Ʊ0JÀä¶~–…¦Œ¦IŽÆgy‚g\"‹±4!’¸ÄPQ‘N²¨ÂãGH!“¤ŒS2A+¢˜…„,¤e6—’’œ•¤,%²R*ê÷«×.ª¼«¾ñwõ•ß_yùǯï«¿z擟Ä\"ÿ~áü7Ο÷ö Œ¶t»Ûæ#ÎûLß~äsêû7Õk7Õ˪ú÷«¯|æ;?L<ù$»PÓ=Sg¯µž²œ´,™\'¦Z†V,SŽ™Áù±Î¡î:ãp‡mºÓ1csÎZÇ\rŽY›kÆ1áq/W1™ÏJB–§“Š˜¥8/ÇxA¹(KɊ˜’…¤ÈE%>& q‰‰ILŒg’–…´Ä$¢|Zä’“Åì‡\ZOÈtL d™ŽE©DŒLÅÈTŒNÊtLá2•…¸ÌE5B0N¡4“8B(Cc,‹q ʒMb,…s$Ʋ¸È`‹\n!фLâMÆx:)1 E:Ê3q–N0L‚¥\"Ÿ¹¤,¤.—’’—¤TTJ§ù$¿îU_û›zý¢úÖ«ê+¿½õ›ŸþãÛ_ú÷³[k‹_ŠË/>òpxÈíª·tß×:ÕÜç8Ò¨¾sY½vE}çŸê+y÷Ûß}í¹¯ý$ûØ âƒ”}z©¥o¶©w¦Ñ1^kŸjXëš \r.ùœsó=ãŽÆ®¾&›«£wÒÒ?k5ôLZú§,Î塙•ñex\rKŠç%>ÅÓIIÈJRŠc‚“…¤,fd)%K)IŒ‹BBâ\"—ä™8Ç%!% iž‰‹\\R3\"ŸâٔÌg.åÓ1.çSQ6eS\n“ŽqÙ(›R˜¸ÌÆ9Z¹¸ÄÄ4X\'`’ÆX\Zcœ£pÇc ”ÉQO…K$&R˜BáG)L¡ˆ(CÅiRa¨(KÉ\"çé¤À¤y:#0Y…ÍŠTŠ\'㓹8ÏD%!³1.™Æèÿ÷üó굋ê;ÿPßøËß_øÒïŸûô×¶Rô¸;ØïH¬¯rsK£\r¦ñFë£þŸßýõê%õÊÛêëºö˟¼óÍo|æ‘6ë쉦…ÚNOSÏl“}¢¶kÅ8â³M£^bb}Õ19mîlu8[ì³¶‘VËP‡mÌÜ?iuÎL†<ÁùÑE…If”-™M\n\\ZR¢˜–¤ Ï\'E1-ŠiQLJRJàã—”¸ŒÈgX>-I›²˜á™¸Ä§$!s’¨¸¥p©\\’‰qi…K)\\Já2¹ºªp R6&rq‘ŽjÐI\"40D˜¤`šÁ9’`Iœ¡IŽ¥D†R¢p‰De\n‹²T”¥¢,ç¨O\'*ÊÒ1†ŠrtŒ§“\"›˜¬H¥d&£0i…Ë(bFŠ”U„ͤ|RÞBð㱨zõ]õƒwԋÿøõ>ý±•ÔÊÊjÏÀŒÉ:i¶ú†ÜÞ¾‘O Ñ7^ú‘zùmõò«êë¿W_ýí՟|÷Ï<ùÀÌẩ¶ÅÖÞUËТyhÎ0¸`t®˜F=3öiŸsnÎêš0[Ü-}#ý®¶žK¿«³ÏmuNöŒLõOÂ^âô‰†Ncï§üDLÈH¦Äe·-EÌr\\JüJAH BF6E>+\n›¢°) ›2ŸÙ´Èg$!›»–Ùô‡‰%™‹4ŸŠòé(ŸV¸D\\LËl\\ ‰Šjrú¥P†‚ieœ#P†Àh§hŒa žÅES\"F2C* ©pT‚\'ã,eh™¢ž‰²dœc’<›âل\"f8\"e¶d~SdÓ“ùlî_’¸ÌÑM~Ý«^zS½ñ¶zéŸ?}òñ Íêu8\':ûœmƒí#FÛ¸¡{¸¡u£Û›ýžøñ÷¿úüç®|ÿ[/?ýôC«aŸyxà´a¸¡{¸ÁÞÎ:ÖÜ;ÝÑ?o^ê\Z›ë›´ŒNtŽŒ3=-=Ã}ƒv§É1nžì›^ ×èƒNk€Â8}àþ‡e%ɳ žM‹Ây‰?/‹›—¸¤$&e)% iAȈ¦ÀerˆËLŠ¡â<›¸Œ\"fd1“»YäS2Ÿ•˜”D%&-Ó©(ŸŽ …KILB¢â\Z£œ¥1&WiŒ%1Ç8eh‚§ ‘&d–L0DŒÆ£$.Q„L“1šŒQD”&Š’Zä™(KÇx6Aà¼À&8*¡°[\"•’Ù´Ìg%.«÷‹ì¦Ìo&ùx†Àÿ£ï¨7ÞV?xû[=°d2­ô8ÇÌ#&ǀ¡§·£»¿£w°­{¸µ{ Ö°b¶/,ôëÉñõèægIå!/I¯Mµ9ûNYF\ZÜ-ƒSÆÑù®ñi“{Ôàœ°ŽŽZ\\.óP›Ãièëoëî3ڝ&ǘep¢Ûµ84‡n;\n*5`þ°ÓõÈýe²[\\,))‰ËrlZ’6%iS’2Š”U¤¬,f1#óY–L°dB`Ò2“‰r›—aˆXTޔ„´($$)%I)QL+Êy™ß”™ŒH¥$:-1©(Ÿ˜O\'E:®¡PšÁY\n¥q”\"Pƒ\n—pT@aŽÀy)\"Êq\ZÒ„ÌÐ2EÈ$®°t’&ã4céKÇ$!Í1IŽIJBšgS,”Øûe&#³i‘M‹lF·d~Sâ2¤8Ïpð´zý¢úÁÅ_åËsFëŒÅéîìw\Zíöv‹ÝØc7öښ»½“¶áމUÇä²Å5ßâXé¤Ý«ÉUü1<ú´ô>˜1Žµ\rGÇL#£®£sÄ<2iŸpYœCæ>{s§³½Ûiè5÷[\'í®U÷üøÐ„&O§­Ø©Ñå76µm¥6¸ðH4‘e9™ç†OpB†åӜ‘Åͨ¸6e:%qYIótRfÓ\n—‰ñ[\n›•„¬Ègx>)ËYIÊp\\J–Î \\Fâ²\"›QجÌdd�ižNILJC\"…Ò4Áã#,r$*SDCx B\"q…\"¢ ©”Â2ʇºŽÓdœ%,ç˜Ǥ.#òÛo/òYžÚü®ùŒ$d)+‰É ™׆ÆÚÝ«^}O½úþõßþ.èt¯õOu\rwö÷\Zzº½¦æ®î6{W“m¢g|Ô:6ÚéisΘÜ3íC³fהeh±k(2ä™5ŒNÜc†‘ Ó¨Ûè\Zé\Z58]æ¡iÇT_»ÝÞbq´vö6uŒ{ƌ}³½®Iû<·vôà1*ÛyTy‡F—¿ïîý“ÏdÎožß¢¢\"-Çh)ÅIšO BFâ²Qn3ÎmI\\Fæ³›Ù¤ÂeD:ÉÓ)™?/ ›<›’å-AHq\\Šç2ŸùŒÀ¤e~Sa³–ùMžMótRƒ#4‰±4ʨ€ç€° &‘˜ˆã\"Jˆ£é8EDy2NaQ†ˆ1T”&šT*Β –NòlZàÒ“ùŒÈoׁËÈ|6÷)eq3\ZÝRĄϳÑpèԙŠ»ÕkªzãšúÆ¢gÍmpŒÙœ#ÖÁS¿ÃØßÝÞÛÕÚciê\Z´ º:GÚÇÌî1ã¨Û02nm\\²OºÚ£çhû»cØÝ1#ó›\"›¸Œ$lŠÂ¦Àgs¢–è´D§%.«›·í×­h˜Æƒ9á L$0‘Âf)\\Àq§dŒŠT#¢£°(…Ei2Î҉œ´*AÓq†Iðlê#|T E6#²i™ÏŠ|F3d44wÛ{tÊ8 ÞP՛7Õ®ùÂã ]CӎÑqÛðyÀÞÖÛÝf·¶t[[»ÌMÃ¶‘AóðÉ5Øî1¸\\íÎ1ÓÈTçØBה»cxÆ:6Ó9:arw8GŒn눳s¨§­«ýlcO‹¡»ÑÐÛhv\Z»ûÛ­Nc·Ëæ<²¿\ZДÞVV|WiѾâüÛõú2\r\0i\0 bϞº3µ6sרÐ(î‹<š~àé‡?þɽ?MƼ„„,gy>)pI‘MËü¦ÌŸØMÝ…ó¢p^à³9…‰Ü–Àn\n\\Fä3\"—Œòé8Ÿ‰ \r\ns$&ˆ„E)R¤PÓÊá8‘N+%¨Ž) ‘¤ñEÄH<š#𥓗 I…gS“˜4Gåæ×¦ÄmI\\VdÓ9c‰ ™M%[¦ùÀîñõ¦zëÖ-õšú×üŸXöŽ.¸;ƺ\\ý½Ý-¶î¶îÎf³¹Éè0÷õ™}}mýí}®ö·a`´¹w²cp¼£ÏÝjŸjwLµ;ÆÚzG}æ>{{—©®ÕÜÐdkjíoïìk6;Z;Z-.KýÙÆå³1.+óY\r\n \"ѨL ‰‰)²G<Žq!¤HÐ\nÉD Z¡¨K&\"ΐ)\nOPdœeR,“¢)IäS•˜´ÈnJtV¢³<ØM‰Ë挅çÓÙÔCáÕP_÷ÀžÂªçîÿxî±2õºª¾{ãs‰‡<½có½cS]Ãn³sÀ`··ÛºZ;\rõ햖N[«­§Õîhë±7u9[»Ç:z‡›-Ãm]#]ƒÍ¦áfóh›ÍÕns4˜{šÌÆsMæ†&KS“­¹¹§¹m°ÕÜßjš°öw5õ`‘V[¨Ë\n wë\nwé «Š\nvêÀJ=Tä•ëv–U¥º*(¯¬¨hW~Ù\r¤×èANSÎrïŽ\0\0 \0IDATXQ8`0òÄ#J2—Ê$eYŽESÉÄf:õ€(¦&!ðÙ×Û6ÂeE>›KQnSf2<›Öਔ)&“˜HáEŠ9?Éõ=(J¡(…d¢$¥é¸À¥Y:ÉÒIŽIqlšab<›âé”Äm‰TF`²¹Ä3Y‘Û’„MIÈFå͘œ²w÷õØPÙÃ\\fû¡É›·Ôëê»?ÿ3ê^Ûœ÷8¦ÜVçˆu°·ÃÖÝj±µtš\r½¶žÆNGSgo½©¯Áè¨oé° 4ut×Ô4´ô×7;ê[¶šfóéFsm‹ál­½¥µ»¾±«¶ÑÞlr´ZÛlwß~wž*‚Ê\nô•ùù;óu; òwëu;! Êõ@E>X™VêÀJ=P™VêJ=¸ ÔUêJªvi <\r¨=pàîÉ¡a…`Î ©ã÷?š}è± |üñ\'.<ô`\"™•ÄdL:ã·$>•²Q)«HYEÚŬ$mŠ|Fƒ!<Ž\n$ž£[&q…@$ ‘LaÉx.VÓdŒ\"b£È8EÆY:ÁQ IqL’e“4•`¨K¥v“¥Ò,“á„-†ßä„,\'dY6)‹›©økËS‡ÕÐÜy[áí^PoªÛNÞRÕkê|îe‰D&|s½3#–Q§qÐeèïk´Ø›Mݍí]\r͖ºFsM½ñÔ¹Žgji?uÖtºÆpòt{õéγuÆ3õÖº–®ÚæŽ3uƺ&K}‹©¦ÙÚdî8g´L4ÖÙ´;J‹u; tùù•úEú]…º…ººŠb]yT¦Ï+‚4…Ú’|m±,ӂåZ¨‚Ê  ´P_©×Wé¡òò’ÝPa‰‚4  Ñë4…\ZMFSªÛ{Ï=½¦1D=?ÿ促»ÿÁGxp+µ“SQ)Í3Q‘‹ólBƒ¢<Ž‹$)㸈a9ҏxt{µBDi2Çr’¦R ™â¨´ÌlJtšcR—¢ÙÇfY&%p–Nò\\F¶h>ÍpiIܒ„Ídôæ§G,m¶ý·Ñi\nñŸªäv’ÞÌ9ÉõW.}ë_9Š *4p[ÆÜF—«µ¿¯ÙÒÓdìjl174Ïՙj\ZçšŒgš;N5šN5ØêZºj›­5MgÌç\Z;Î4˜\Z\r¦F£¡ÞX{¢¥î¤Åfœí[/ÝuÔí*ÑV‚åúʨªª*ª\n€Š ¬,ՃEº=X”@Ú,te€®ŠŠ v‚•%à® ¢\0ªÒeùPyYÁ®]…·•é+ËKvj ‹5z­F¿C£Û¡)ÔÝ~×>ssËhï@dÕÿHö¡óé­lvK”%Y‰i`TD0 %%f1”Å1Ã8” B!…&c §ˆM$i*EižÙb©,Om\ndZa³“¢©C§9z“£Ò\"•⨄,§Ø Å¥.%pé„ò\0ì\'§\\ó=Žƒ»ªmõ½—_ͧ¥ÞÊ=¤ªªê\rõò_/~÷©žÏ“Äêu¯Oö¸ûÚº햮–ŽÎÆæ®ÆsmCgM“õ\\‹ål«ù\\kg]kW}«µ¦É|ºÑt¶ÅÒhj:ÛÞXkÞ·¿æèQóÔ±2Íß}ܤÉÛ©+t`E>X©*Šò«Š ²¨ªP[Q¤­Òí(ÕA%:¨ °ԖhµÅZm1\0”@@)ëÀ2=P¡* ¼²¨*¬Ô…ù»Š‹ª\nó«ôPeaÁž¢ÂÛÊÊöï΋4\0¨É4ùšÛÝÝÛe\'üèÑÍç5(, ¨‚qT PÇE— B!q…&c,gˆ8K\')<ÁцNÓD’§3™–è,K&xn“¤S8™`¸ÏÇ>Êq1š‹sB†çӒö­D¼‹¡¹Ñùƍ 2óéû?ý—ŸÿQýßòmo-PÕ×®¿øéo>“yjÉrËtÐíër\ZíÝÍFs}›©®Õ\\Óf:—ÛÌ5íÖZƒµ®Ã|¶Íp¦­åTGÛӉ“¦#Çm‹áÀcþàCuíS\Zí\Z`·ªÊq]\0í,ÔWêKu@q¾¶´¨Ô ¶‹!°Ð@ \0lÓ\rAe XªÕy¥:myŽq=X–¯«ÐCåz¨<_W¥‡ª\nô»À¼J¬,(ØUX¸³¸ø¶\"ý®²’;4€N£4…: ¸àøñj\rsH„G… qTBQÅe—I2ÊPq†ˆqTò£„ÇÐIŠLRx‚!’<‘â¨$C\'q2†±qVIqrìþŒÅӉÄùp˜\r…(ÂÜ·˜h¨®ûücŸùÜß~(ºõцõևÃMU½¡ª×Ô_|ûO§Ÿþ˜ðxÂ_ꟙîq9]¶¦v㹆Ž3\rí§\Z;NÕwœj4Ÿm3i7Ÿê0í4ÕÚkï3»·££y~f*ƒÏz6íŒì:تÑTBúÝz¨²¸p—ªÔ•:°LæCÅ@I¾¶T–AP¨-€RP»MtŽq\0( *Óé*õP¥ªÌ‡Ê!m‰,ƒ€RX¦‡Ê! ԖƒÚr=TU ßY¨ÛY•ßè«òõ{J‹ï(¯Ü—W\\©A\rf±ˆ€Â0DÂQ Æ„LÊÙ‰+4Ïj–Lx”$b$céMÆh:J²1ZˆñJ*™=/вwÝ71>ÓØhššY÷(ŸÛXo,†®Ó‡O}bóñǔ ¾©åÿ9)n{/ØÍí]Ó·TõšúîÞ{*ý̃Ô#¡1ÿ˜ixÄäèi2vÖ´O6¶ßW×q¼Îp¦­ùdGÃ)só¹žsÇzNq[–çg·(á«ð–CŸëŸHži›Õ€{wäUé´åz°D–APUèu¥:°@AÚ\"Pœ#w›8°‹A ø`\0P\0”y¥z B§-/€ªô@E®LèÊt@iNìùº\nX–¯«(Òï*+ØSTx›¾`·^·»8ÿö|ý\r\Z¡qTÀQ ‰hXÀ!DŒPLˆ(†F <Ž¡Q •I\"F‘Ixœ\"“ ¤(…¤øx,ÍsŠgqmxtº¶Å|ädÝÑêúññ%ŸØðË둕•Ð҂o¸o¼¹Ö@oP„ óýóê9ÿ¸¾}>߇Œo×TõšúËï¾ó§–zW\'MÖ³ÖZSë}Íu÷œm«n:s¬á\\uÛÙꮦºñÑ~Îãy؏!\"~c*ü/®Õ§ÆÖ>Õåäî8Ö¥öèwA…`©(,ЕäCÅ: ð#lk9¯Ԗ@@9\0”€`i^^A^^‚P!\0€`1”y¥P¡ƒv@™,ÓA%Û\0Šu@i>TþÑ_\n ª|¨¼0¿\nЖCàN´ Жë\nwk0”%0Ey “0DDaÆ— <Šc\nÆp$J`\nGQDB‰$b#ɨ\"eSÉûIŒ™]líè<~ª¶útcõéæº³Áл4X\\ô¯¬G–Ö ޅùµ±‘™>›sɽü¥Çÿu¦wöÿùGõƶœÿ×Qˆ7o©7oݺ¥ÞÚ>Väæ{êåñ¾fWÝ¡c­­é¤ñô‘¦SÎ՟2‡×â\"ÿYJú2.}ƒ¿åcŸß¿>èûôàò\'-#©Ž>\\SxL£Ù …ºz°LëÁ’|¨4\'^P æyÛ¦¬Ët`@‚@*ÒëJA°Ԗl×F B«)òJ·¹Þv’Š ¨ \0ŠòõeùPyNïz \"çæ:°¢H¿{»6¨HP11L‚Q E$SL&09—¾*J2…)Q)+K©µUÿð ÛÐÖilï2›çêõíÝç\Z;kë-=V×ìØêÒ¬/·wue%´äñ/Ì®®.xûìÃÖfÛWŸ|~Õ¹š‹¨×r\'zÞøèt¾ÿýÊi¦~ ~þþ\'þ¹íÛ¿bÜ^Ù=Ú2xîài͎Â{O7ýVdókžØ×Ößñˆ/Œ_ql<혬©›¸óä fÇíZh7 -s³ܞìPjË °\0Š>ôå\"\0(‚ ¾Ðæƒyù`^¾,ɕʜ›(ü2\0Ø6w\0(ÓAU PhË!°R –ƒºJ@W¦×•B`q®¬\0ª*ÔíÑ;u`e‘~·‡–ðAD‘XÆÐ(FÅLÆ0 Ey†–IŒgH)“|P¤“ë+á>ûp{›¹©±½­µ³£Ífl³›}Íí=Ǫ›Í&ç¤kybØ37³±¶¯.†W–Â+‹5OÀ·tt\r\ZjM_}úkÑ@Âe»úæÍkâÍÿK󇸩þà_¿>x¬þþ)/ÖÜÍбæB“§Í养5šŠþ`úɟ®d¾5qˆüjð_»«ÅÕiìwLôÛÇ,ÆþŽÖ.‹±¿½ÑÚc\Z˜í³ õOMŒ..Ìm¬/7æüóã«ëËpÄG­Îm´Ô¶»ëÈçûÂ&ÿçßژD?xë†zK½yóºzK½‘ãú†ªÞRß¿¡^~O}ö¡/ ë?ÒÚWµmïQóîƒuÅ»CÅÇô»î)¾+Ü¥ÉÛ9µ‘L<ýó1îëÎðWí+ÿÒî¾Ð;šÖÝÖ¢îÊÓîÔC•ÐÎÿÃ5På:°sŠ.Õj  H äçiõyZ½È´ù:¨Š>ô™¢M£ä£û·=,ÓC•¹x‚Åy@™¬\0ªý.¶BUió*@Ý.Ø¥ƒª4A˜ DØ@„\rE¸H„CQ!d‚Vr¿l|xoËÔÞk5\rØ:VÓ Í:lítZ;»­ƒfƒÝ`°µ´tÚ{ÝÃóŽ.W¯uxdhzz³ìñ.ϭϏ/O»—ÖV` 斦W{ ¶½·ë¹ïl‰3¡CËñ§þWõÚÿq›×Õÿúí›?þ¯×ñ“öœíoÚy¬mçÑæÝGn¿ïLÅáê²{Wº\'ïmùvhn׀î<Þ«<öÒ,÷;/õ,þ‹}â«SÒäЀwè ª|¨\\§-µe@ÞöRKµÚR(×j‹s‘C›W\0hóµyú¼ºy:-\0Ey;ò?*›\0P\0Û¹o(ǵ*҃%º\n(ÒA% X\n\0eZ°\nvåC»óÁ*®R V\0ÐN¨‚ \nM0̆>sÁ0 Ã<Šò$#²Œ4;µd5÷µ5uZíö®{—»×6Öm´˜vÛPWg¿Åähm1w˜ºMÖA{»»k¸Ç:ÜÛ=ìvÍÎM/¯-û¦\'<3c‹K󿟄ÌÓ1|æ¾S»+öüç÷~ùì\'^@Öï_psëÓTŽëm¹©þî/ï}õûúâ7~ñfÊ4{ÚöÕ¶Þy¦æöã÷í>r¤üÀ‘Ò{–ÞuGÁÞ|Í^<^}ßðYÃêúÙEö…îµçÌO¸Ú{dD³ã. ¯¨È2P[¦·\r:/¯H§«\n­¶\0JrÁC«Ñåi 0/„\nóò\nrzÏM,‡rá\Z(Ñj‹¡í`W…z°¤*ƒ´E¶‹A°\\›Wh+ó€J@[jË ü\n]A%–ëÀJªÐD! ó¡ŠpÁâêjØ54m5÷\r:&úzÆÝnG·»Û2dëtÚ;‡­†>«¹Ïlêé´ô˜;»ÍÝÎ!÷À€Û`èíhuôX]“#óËó«Óžnëàä˜\'$q„_]òŸªi(ßu[áŽüç>ñåï}ãåGÒ_ö®l®,$Ÿý̋êõÍú¦úµþû™¯ÿñ+/üµî¾ÞRpË=5ûNÝs¼ºêðáÊ}Ê÷í/Þ¿³ð@qþ‰ÃG†;,¸Ý>PïC¾dYþ´iêSc³i\nNh4·ë =ú]ÚJ¶ԖåL9Ì-ˀ¼â<°Km>°CìÐçíÈÏۑŸ³(€€R(¯ È+µe ¶D–Ú’¼¼\"*Ëy‹(փez° ҖäòbΚtÚ\n¨‚ÀJªÐùºzp¤­µå\Z8Ì`Ã,E),›\\Z\nY;{{F{{Fú&úzÇìÝ#9ôöŒöõŽÚ¬ƒfSÑÔe4Ym]½öž¡á±sçš[[mfc¿«bftÞ»âï³÷v¯­„Q˜#q©©Õ•îÚ¹÷0¯P€£Ï=ûƒÏ?óR<þÜü\\rqžW¯oWÅ?ýþO<ý“O|ñ±ô¿Ý}{ÓÞÒ£Mûjjî<~â¶#GvÝ{´êÀ’}wޝî?~b¬Ù@{3öñǏ·Ó­#[ÃÁg»§7ö‘šwi€Ý PAz 2×Á€ÀbT€:ýöÊP •‚`qŽh`‡Òæ:|ŀ¶Š `»’ ‹®Ò`±*‡€R=P‘¯-ׁ•:°*  \"ws!X^\0Uéu;sY*@m9¤­‚´U:m•Ã8áp\\œ™YµwŒ8gGfûÆú{G#ÎÁ±ÞWw—³³sÀjuZ­Vk_NÎ]6GO÷à¨k¶®Ñx¶¦£¹Ùj1 9F}KÁ©Ñ…¶ÛÂüÚҒ/ ûnMñÎü=ûJ+÷iôUƒ«Ï<ùm,òÌ>«(_óF>AãËÈÿöCŸùÕãÏþ¥¦iõä鑯3®ƒǎ”Ú_q÷eûï(¾k§î.\0ØÇþNc¯dŸüdÏô3Ãë_lØ<ÐwNlzÖ\05ÚÛôP•,Óé*óÁ*X å:¨ !°s‹òRP[– $`^1˜Wh µyzH[ Šs*€\"*Ôj‹  *t`eÎús\\¾† \n@[hËstë€Ò  ‹s-Ü z ²\0¨\0µe\Z˜’|!²·oÜåšìŸr\rÎ:&‡ûÜÃý#Îþ‘Á>W¯«Û6`1÷õö¸œýãsŸÙl·X6ë Ý64Ø?Ùij7ôž>ÝÔeœ;{ºujlyq~uy~5$öî;’_¶§d羒²;uw8 “¿øÁëxè‰õåG‚ðÓì3žG¯ßR¯¨êýOüÿ&½´I²êLïܳŸs÷%oîµWu74ƒÄ@ƒ4½VUVn•ûÍåæZ[7ÝÐ,0Œ\Z‹‘`ÐH!k$ÄÌtà¦%´`°%941E!>A®â”Z„˜ŒZY9Xóp r)t9ö6(u(õñ‰æèзP 4 D£+Î´ÙžÖk£¨½×ª;i«ÚoV¢f­×ØíÖª½r±]Úi•v:›+ۛµæöf­¼ÓªW{Íz\\©õ\Z¸¸Ýè¶\'¥ÎÙG\nÅ­ötpu:8¸2»^ÞiÁBZµýÛ]\0È{èô¥þ¯ÿûÇßûÏ<ù·‡WÞ~üé[O<ÿþ¿~÷÷ÿçÿþ¿w>øç7ßûýë½vO{öÍÍdž‹îÉekyçs\"Ÿ–yG_pq§ö• Íï]ˆßݚý¬þäG«¼t¶þíý·/T_4Dš#—b——!!!!Aj.F.‚Å®C60Ò 4 4‘fdaì¨÷ïŠÇÍNLH H åÚPì2œPˆL4›cO±ˆŒ|Šƒ$ èÈӃ§£Þa«5i5ÆýÎ~·5ë4¦Q}ܪöË;­âv£RêìlÕ+;Qáb­^í¶êۛb¡]ÜnÔ«½j¥]Þ틍ún?jÏ\n…Ö¥Íú`pÔiLž¹òìÕçOŸAÌs˦3¬¬®øöÒþÍ?}ð³?¼øÂíãwöoܚ<~kÿşþ«wþËk·þé÷þ×}go+/4w¿äY§–Ã9=›çÙE±á ¦XÚ…ò‹Wßx,¾µµ÷Aaÿk¾\\¿sô¥ŸjÁ€e õ ±T}1v v5ä¨\']ÕWI ¹ÇLΠÔ\"؀š@PÎÑ™\ZªÊsÆBLÆlÊ Ì,H H,zÜ×Dañ)v•šˆ©‡©Op@Q HȐ§LF×\'ñãÝö¤MúÑd4Øo7GÑî¨S֊òNkg«^-´j…èÒÙÒöf£Xè”v¢r!ªíô\Zåþn¥Ûhvw«R¡9ˆ\Zµáŋår¹ÕFW¦WÎ<ð¨´ÒÜÊö‚n椑•A û֏óë_ÿË«¯ÿúɧÞ>qsðø»×þüãÇ_ûøkó/ß|û÷|.î6^H{Œ@•¹ O…(\\1VóbÅâk\0,}ñâ³Û?ښþ²pðáöþû§.|}úô/ÎW_t…àp—K#c>£ÁF>‚VXX:ڄ˜”s—@“2\rŲù»ãÑ`l0f+ö™…¨­¦¥¢Õ;”:ŒÙ”˜Œù¹{ùXó(\n°æ1äa¼?ö£Ñ ?é÷gQ4ŽZãncÒªÇÕR«RnUŠÍj¡U¾Ü,o¶7/Õ [ÍÂV½\\lWJÝb±S¬´ê¥v¯·÷Þ÷Å+“k£Þ¤\\®–J•³^\\^¼KçiÛXv¬5ʲ\\ϸþÀη^½ùÑGÿøæ?yêùŸ¯Ý\Z\\»=ý“_|ëw_}ç¿_ûòûwÝÛ9±vQâ…$[ÎÊLžgWåҚ±¶Àm²ÀÊùâŸnµÞ¾0úyýúß_¼·ºõʵ>Ȝª˜¥Ä\'ĄÌDÔÆp^Œ?ík‚†\\ªÐ[ˆšJAÅHÇHÇÐÄÐTUÆØøô—D,ä\0I…JâÔUp˜±C£˜\"E֝g)\nˆ èq|0ìï\rû{ý޴כvz“v{µ†­z¿±ÛUµ®ÛÕB§VˆÊ[­z)jUû­jw§½[ŽšµhЉËەû?ÿí%Ÿ<º±?>¼p~ósŸÀ÷³†‘²¼ï¬»æš¥/zÞrrº­7o~òÖÛ¿{OÜî¾[9¸5{哗øµè/W6JŽq\"i®gô•”ÌfyvÍXY’Ëy¹ä²\0VîäúùèísñûÕ«¿=Óþë³ñž¹\rôÏ”fÄ#Xªí™)í}ZkJ| ¢Ù:Z:± – ¨1¨1Œt¤×é\nÁ•\0¢hµ21\'Ä=ÞBMDmÄwϙ|fÕsÕåÙÔâÒÂêÉS÷l>r鞓÷ZVhºy)²†ž5õ´ce+kê¡©§¤Hk2{rõüÏþ‡—¿ñÑ×¾þÛëÏürÿúϚ·*ƒÝxáÃÓ÷\0Zôí¥„™ eʁ¾á¬/ÉÅ,M;8è°Îœmÿò•\ZÏ}|Ïö·Ÿzñ?\0íв’dMæsbpbq` ä*œEH×°©aÑy¥(²tbKb D\"2%:BsàÆ\ZWP92œúL³…æPè`ìp(f­x#¾ª>c.†¦rs83•M¡DÔÄØ£Ááh°?MG£Á,L{½i§=l6úõú XîÖëÃJ©Û¨ÆÍJ¯½ÛkV¢ÚnôÀÃ礟2ܤc\'NÒ2¶—öÃ|,XVJèI*C)Ҝ%u™±ôœ©§M=eȄ”!0Rˆ/üèÍß|ë­xý­ÿöÕW?¹ñü¯F×>Ø»ò“Áä\0¬r¹èÉ´¥‡¡È¦dvÃßX1–ó,—\"i›ä^hã|ô£‹³ª×õX÷ûÍáw¶Êð¢EB“:jÁ„ü\0\0\rIDATaØæÐÀмc+@ąØAÈÄH§Qˆ0$0¨ ¨1¬qN uޤNlŠ Nîð\r‡b›àùHTžA#>A.#Å.§þ\\ŸBúg…*‚,0ìïŽٰ?Ç{Ãþt<Úïõ¦QkÕ‡íÆ°QTJÝj9*šr·Rlw£z):ÿØ“¾¾N\\[ø–ê\"ÐEhê)ÓÈH‘<Ôõ$ç.S‚‡ºL2%yIbf\0HN&¯\\{áÖ/~øÜ7þÓsßø‡ƒg?úó×~þÂÓ\0ä“֪ǒ¡L…\"›7WŒåEc%\'ò)–¶H\n‘`þÑvüvõú¯\n?¿ðKihYBS&\ruèKì1â)÷D…=Ô Dt΋5214±&©F·¶&0ÒÖÕÊΰΉÁ¡¡j­<ø¹ª‡,µ¯«µ…Rï3¸á – ØUd!R‹bLFW;íá8>ˆ{³q|0õ:Ó~kÒÞ4+½Z¥[«övËQ«×*Ýr±]+v£ÝQT2©ëI…’yœ8&ó\rá áKîKæIpî1‘FZ—))’’‡ŒùÂL˜8_¸Þ™½Ù9¼ÙyüvÿúÏ¿ôákñq:{‚T‚fS,ÄI\'׬Õ5k5\'—’\"Є…Œs@[‰®Þ޾ôÛÂôæùÆ+@[4‡ÈÄ\'hN® ²ñæŽ-15)µ(1”sÉ b\r¨1Mš¦C(å@©j*™£l3Š=ŒÜ;#‘Oy4ó—ÌÅØ¡Øå4`( ØSµfÌÆHgÄaÈÓÑÕÑàp2<œ†Ñt:8ê·fÃö¬ßš4+½V½_«t:ía­ÚÛ­tkÕAµÐéT‡ÚèîSª†•<”4a„ÎB)CˆÆ|É<]OP0‘zŠË¤à¡`>—I€waЙ½UŽÿª2þ›ÊøæäÆûýî_\0óÙb‚¦“0‘—ùŒÈmØ«ËÆbN_X*ä \'[h¹{åÝÙK·¯Ý^ú£hËL, âjÄ¢ÄWEQ«\n†6#†¦Òðµ8±tbcÈd\Z¤@£\0\n\0u\0-„t\rë\0ÍV™8 ÍC ù;ˆÚ„ØŒù@3µ!±0s8WO’«•ï!ÄÄØP’¡D>ÇGÓÑÕAöÔéE³a¯ßŽ;Í~»Ñ‹ZÃÝJ·¾Û¯×ºµZ¿Qî6 V¡³õXŒi§9 KpêKîë\"àÔU±ÉCC¦t=©ë ))Å2@ÒΟۻq³Ð}k»óƒúþ{GOÜN-—€–Jò¼GÂ$NæX&/óëÞú‚¹”•¹”Ì,e @çY -õ®¼{ô•¿«Þän 60I«‘[±4%rb䪗ÇDÛbÔâÄ`P`H Ä\02MJEøŽf:€:ĎZô9õ\n(\nԞIˆ‚fOC\"si›ç\Z0´9\ró)u2)¶9õ)tòÀ8>š gã+ãxoïãƒa´×ëŒÝqÔîwڃF½×¬\r:͑bÜõR»¾Óª^ÞíÕGw­ÝÅp‚Ó€ŸS_¡ä …: u‘”<4dRÊPʐó@ðPI.Ó\0å\0وö¾¿Ù~ã±Ægko5¢o|·alø4ã¡0ËsK|aÝ^;án,è‹Y™KëŸ%,š0eh ‡ÏþäàËÿvãÌ!\0«\0-P’dÄCÄ£Ô9Îl˜JÜ`ÈeÈEÚÜ[AP(¨Æ©ÆFç­èèÞ âX¹œ%ٜ’;‚ø»J–Rb¥º¨\ržR‹3›`ƒ`)Rˆ,†m:ç×ý=µÎŒãƒÉðpÔݏ[{Qk<èNûÑ(LãÁ^Ԟ´›£¨5îTõR»Vlí\\ª´Êѹ‡7%÷ñ ›WœbÓ@€S_°@Ñ#%éòyû‡\ZÍ\0²ÜŸ½Qî¾y®þÆåæ_=vñi\0–,œ÷P˜ÀaNä׌µ\rc}Õ\\ˉŜȧXÒ%¾}ƒ§ÊϞºùìËÿ°Ó\0/–ãš/iÀˆG¥r šÙ*_Š4KÙ¯\nŽƒs‹\0A I±\riAºZaÔVr‡lpìÍVþ€Rñ¸“zPÚ÷qêÌ!ÄU}-˜\'¨Ë©&£«ñ`ï`vmúøhpØo͍½^sÜkãÞ,ìõ»{Q´×éÌê»ýNuجôÊ;­âv­RØÝ¼¸³°|ÒÒCƒ’&KPâì 0â á3ær0‘ ,`\"”FÚÔCC\ZN”mǯ–Z¯_¨ÿåví{¹Å\0ri}ÍÇÉI-[+§ì“§Ì%±šãË9‘OÓ´‡ Mš ÿÒKŒzßÚ\n‹§$MpêêÄgØæÄâÄ¢ó\0Ï¡s ¸†&Ô† ‚!#P (±& Ôµ4¬_•!¨Í”†GFÁ‚9pCG…]r)R6ãœØª3j¨4 ÇŠ¡‰ $ØÀÐqÿ`6¹6ŠÆñQÜÛïwöÛõq§÷£É ;Ug4Øö÷ºíQ{wP/õJ۝ÍÖÖåúæ¥j¥Ô¡Ô\"!y‚ Cõý|J=DMBlÎ=Æ\\.C®„úR†˜\0&‹¥ç½ï\\,}£Û{€“YñHèoY.Üe­ŸvNœv6ôå _H°”Ïu-êsìÄ*¼Ï-KI’1Ÿ3[P›`C0ï80¦t‹@S}+‚¤YH3°&±&5@ Färµ+*éCýŒx9wB”s—‹˜Ÿ®ûؽ#dߙÊ+ԕ4 ØUާ.Ã&Å6¯Æñþhx0ŽFƒÃn{2ê_é5‡ýÖhԝ)l\röãޤێ›µ^½Ú+ÚۛͭËõËʕí¶ae((ñK0œ·uáы[›E!m*<ÁCÁ’‡{ˆ¨I¨¢à F!|E½q0õN-ێ¾VÝúòÙ\'&\\ ùJ@r–_³Ö7œkÖúª¹–ã«Y¶’f‹É8(°±\'4ËÆ}…œ„\' )ô N¨ƒR\0©¤gDu•Òƒ€C ‘f`$4¨ÐCû5:B:„#‘Â&PP$].‹a›a›a“3aA¨Ž¨N©¥R–”|Öö•g±ÇØ`D-÷.8˜=1èîõ»{ãá•^4ëv¦íÝA³Ô÷ö¢Ö`2>‡ñþ ·?\\i7†Ýn©Pß¼¸sùÒιÇ.]8¿ùè#çWWN2ébî#jî*HQù.ABŽ}Ftïý?ðÅÀÏJ 4wõñ$M0œ’4ɱψOI£Å\".) %O¾Z.=a8÷„|1 ©4M¯Ù+Öچµ±\"W–øÒ²¾”ù ˺(°‘«#G Ó⛇qýOwb%¶)7ùj‚!dB(•¿¥R„tˆ8FCó8d3¯µ†?•Š˜r³°ƒˆ{¾9÷0ž7û©¨ÀšS—ÍÇ£%¨M‘¡Dp5Ÿ²A?š‡ƒîž¡zq7\Z·êqÔ\rãýA<LÇ£ýñèpÜÛ;\Z?>éM+…Ý/žyäþû’ùÊQ%8 (¤(¤p>9N0ä2æRêÍ?q÷v¹pU×O„\"Ÿ é4Ï,™KÎúª¹¶¬¯äYnÙX\\”ù Ë4é`Ï$žA=N]F100% because --- some titles belong to more than 1 category --- - -CREATE VIEW sales_by_film_category -AS -SELECT -c.name AS category -, SUM(p.amount) AS total_sales -FROM payment AS p -INNER JOIN rental AS r ON p.rental_id = r.rental_id -INNER JOIN inventory AS i ON r.inventory_id = i.inventory_id -INNER JOIN film AS f ON i.film_id = f.film_id -INNER JOIN film_category AS fc ON f.film_id = fc.film_id -INNER JOIN category AS c ON fc.category_id = c.category_id -GROUP BY c.name -ORDER BY total_sales DESC; - --- --- View structure for view `actor_info` --- - -CREATE DEFINER=CURRENT_USER SQL SECURITY INVOKER VIEW actor_info -AS -SELECT -a.actor_id, -a.first_name, -a.last_name, -GROUP_CONCAT(DISTINCT CONCAT(c.name, ': ', - (SELECT GROUP_CONCAT(f.title ORDER BY f.title SEPARATOR ', ') - FROM sakila.film f - INNER JOIN sakila.film_category fc - ON f.film_id = fc.film_id - INNER JOIN sakila.film_actor fa - ON f.film_id = fa.film_id - WHERE fc.category_id = c.category_id - AND fa.actor_id = a.actor_id - ) - ) - ORDER BY c.name SEPARATOR '; ') -AS film_info -FROM sakila.actor a -LEFT JOIN sakila.film_actor fa - ON a.actor_id = fa.actor_id -LEFT JOIN sakila.film_category fc - ON fa.film_id = fc.film_id -LEFT JOIN sakila.category c - ON fc.category_id = c.category_id -GROUP BY a.actor_id, a.first_name, a.last_name; - --- --- Procedure structure for procedure `rewards_report` --- - -DELIMITER // - -CREATE PROCEDURE rewards_report ( - IN min_monthly_purchases TINYINT UNSIGNED - , IN min_dollar_amount_purchased DECIMAL(10,2) UNSIGNED - , OUT count_rewardees INT -) -LANGUAGE SQL -NOT DETERMINISTIC -READS SQL DATA -SQL SECURITY DEFINER -COMMENT 'Provides a customizable report on best customers' -proc: BEGIN - - DECLARE last_month_start DATE; - DECLARE last_month_end DATE; - - /* Some sanity checks... */ - IF min_monthly_purchases = 0 THEN - SELECT 'Minimum monthly purchases parameter must be > 0'; - LEAVE proc; - END IF; - IF min_dollar_amount_purchased = 0.00 THEN - SELECT 'Minimum monthly dollar amount purchased parameter must be > $0.00'; - LEAVE proc; - END IF; - - /* Determine start and end time periods */ - SET last_month_start = DATE_SUB(CURRENT_DATE(), INTERVAL 1 MONTH); - SET last_month_start = STR_TO_DATE(CONCAT(YEAR(last_month_start),'-',MONTH(last_month_start),'-01'),'%Y-%m-%d'); - SET last_month_end = LAST_DAY(last_month_start); - - /* - Create a temporary storage area for - Customer IDs. - */ - CREATE TEMPORARY TABLE tmpCustomer (customer_id SMALLINT UNSIGNED NOT NULL PRIMARY KEY); - - /* - Find all customers meeting the - monthly purchase requirements - */ - INSERT INTO tmpCustomer (customer_id) - SELECT p.customer_id - FROM payment AS p - WHERE DATE(p.payment_date) BETWEEN last_month_start AND last_month_end - GROUP BY customer_id - HAVING SUM(p.amount) > min_dollar_amount_purchased - AND COUNT(customer_id) > min_monthly_purchases; - - /* Populate OUT parameter with count of found customers */ - SELECT COUNT(*) FROM tmpCustomer INTO count_rewardees; - - /* - Output ALL customer information of matching rewardees. - Customize output as needed. - */ - SELECT c.* - FROM tmpCustomer AS t - INNER JOIN customer AS c ON t.customer_id = c.customer_id; - - /* Clean up */ - DROP TABLE tmpCustomer; -END // - -DELIMITER ; - -DELIMITER $$ - -CREATE FUNCTION get_customer_balance(p_customer_id INT, p_effective_date DATETIME) RETURNS DECIMAL(5,2) - DETERMINISTIC - READS SQL DATA -BEGIN - - #OK, WE NEED TO CALCULATE THE CURRENT BALANCE GIVEN A CUSTOMER_ID AND A DATE - #THAT WE WANT THE BALANCE TO BE EFFECTIVE FOR. THE BALANCE IS: - # 1) RENTAL FEES FOR ALL PREVIOUS RENTALS - # 2) ONE DOLLAR FOR EVERY DAY THE PREVIOUS RENTALS ARE OVERDUE - # 3) IF A FILM IS MORE THAN RENTAL_DURATION * 2 OVERDUE, CHARGE THE REPLACEMENT_COST - # 4) SUBTRACT ALL PAYMENTS MADE BEFORE THE DATE SPECIFIED - - DECLARE v_rentfees DECIMAL(5,2); #FEES PAID TO RENT THE VIDEOS INITIALLY - DECLARE v_overfees INTEGER; #LATE FEES FOR PRIOR RENTALS - DECLARE v_payments DECIMAL(5,2); #SUM OF PAYMENTS MADE PREVIOUSLY - - SELECT IFNULL(SUM(film.rental_rate),0) INTO v_rentfees - FROM film, inventory, rental - WHERE film.film_id = inventory.film_id - AND inventory.inventory_id = rental.inventory_id - AND rental.rental_date <= p_effective_date - AND rental.customer_id = p_customer_id; - - SELECT IFNULL(SUM(IF((TO_DAYS(rental.return_date) - TO_DAYS(rental.rental_date)) > film.rental_duration, - ((TO_DAYS(rental.return_date) - TO_DAYS(rental.rental_date)) - film.rental_duration),0)),0) INTO v_overfees - FROM rental, inventory, film - WHERE film.film_id = inventory.film_id - AND inventory.inventory_id = rental.inventory_id - AND rental.rental_date <= p_effective_date - AND rental.customer_id = p_customer_id; - - - SELECT IFNULL(SUM(payment.amount),0) INTO v_payments - FROM payment - - WHERE payment.payment_date <= p_effective_date - AND payment.customer_id = p_customer_id; - - RETURN v_rentfees + v_overfees - v_payments; -END $$ - -DELIMITER ; - -DELIMITER $$ - -CREATE PROCEDURE film_in_stock(IN p_film_id INT, IN p_store_id INT, OUT p_film_count INT) -READS SQL DATA -BEGIN - SELECT inventory_id - FROM inventory - WHERE film_id = p_film_id - AND store_id = p_store_id - AND inventory_in_stock(inventory_id); - - SELECT FOUND_ROWS() INTO p_film_count; -END $$ - -DELIMITER ; - -DELIMITER $$ - -CREATE PROCEDURE film_not_in_stock(IN p_film_id INT, IN p_store_id INT, OUT p_film_count INT) -READS SQL DATA -BEGIN - SELECT inventory_id - FROM inventory - WHERE film_id = p_film_id - AND store_id = p_store_id - AND NOT inventory_in_stock(inventory_id); - - SELECT FOUND_ROWS() INTO p_film_count; -END $$ - -DELIMITER ; - -DELIMITER $$ - -CREATE FUNCTION inventory_held_by_customer(p_inventory_id INT) RETURNS INT -READS SQL DATA -BEGIN - DECLARE v_customer_id INT; - DECLARE EXIT HANDLER FOR NOT FOUND RETURN NULL; - - SELECT customer_id INTO v_customer_id - FROM rental - WHERE return_date IS NULL - AND inventory_id = p_inventory_id; - - RETURN v_customer_id; -END $$ - -DELIMITER ; - -DELIMITER $$ - -CREATE FUNCTION inventory_in_stock(p_inventory_id INT) RETURNS BOOLEAN -READS SQL DATA -BEGIN - DECLARE v_rentals INT; - DECLARE v_out INT; - - #AN ITEM IS IN-STOCK IF THERE ARE EITHER NO ROWS IN THE rental TABLE - #FOR THE ITEM OR ALL ROWS HAVE return_date POPULATED - - SELECT COUNT(*) INTO v_rentals - FROM rental - WHERE inventory_id = p_inventory_id; - - IF v_rentals = 0 THEN - RETURN TRUE; - END IF; - - SELECT COUNT(rental_id) INTO v_out - FROM inventory LEFT JOIN rental USING(inventory_id) - WHERE inventory.inventory_id = p_inventory_id - AND rental.return_date IS NULL; - - IF v_out > 0 THEN - RETURN FALSE; - ELSE - RETURN TRUE; - END IF; -END $$ - -DELIMITER ; - -SET SQL_MODE=@OLD_SQL_MODE; -SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; -SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; - - diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/SakilaDb.cs b/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/SakilaDb.cs deleted file mode 100644 index 006a0c9ea..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/SakilaDb.cs +++ /dev/null @@ -1,398 +0,0 @@ -// Copyright � 2015 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Data.Entity; -using System.ComponentModel.DataAnnotations.Schema; -using System.Linq; -using System.Data.Common; - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [DbConfigurationType(typeof(MySqlEFConfiguration))] -#endif - public partial class SakilaDb : DbContext - { - - public SakilaDb() - : base("name=SakilaDb") - { - } - - public SakilaDb(DbConnection existingConnection, bool contextOwnsConnection) - : base(existingConnection, contextOwnsConnection) - { - } - - public virtual DbSet actors { get; set; } - public virtual DbSet
addresses { get; set; } - public virtual DbSet categories { get; set; } - public virtual DbSet cities { get; set; } - public virtual DbSet countries { get; set; } - public virtual DbSet customers { get; set; } - public virtual DbSet films { get; set; } - public virtual DbSet film_actor { get; set; } - public virtual DbSet film_category { get; set; } - public virtual DbSet film_text { get; set; } - public virtual DbSet inventories { get; set; } - public virtual DbSet languages { get; set; } - public virtual DbSet payments { get; set; } - public virtual DbSet rentals { get; set; } - public virtual DbSet staffs { get; set; } - public virtual DbSet stores { get; set; } - public virtual DbSet actor_info { get; set; } - public virtual DbSet customer_list { get; set; } - public virtual DbSet film_list { get; set; } - public virtual DbSet nicer_but_slower_film_list { get; set; } - public virtual DbSet sales_by_film_category { get; set; } - public virtual DbSet sales_by_store { get; set; } - public virtual DbSet staff_list { get; set; } - - protected override void OnModelCreating(DbModelBuilder modelBuilder) - { - modelBuilder.Entity() - .Property(e => e.first_name) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.last_name) - .IsUnicode(false); - - modelBuilder.Entity() - .HasMany(e => e.film_actor) - .WithRequired(e => e.actor) - .WillCascadeOnDelete(false); - - modelBuilder.Entity
() - .Property(e => e.address1) - .IsUnicode(false); - - modelBuilder.Entity
() - .Property(e => e.address2) - .IsUnicode(false); - - modelBuilder.Entity
() - .Property(e => e.district) - .IsUnicode(false); - - modelBuilder.Entity
() - .Property(e => e.postal_code) - .IsUnicode(false); - - modelBuilder.Entity
() - .Property(e => e.phone) - .IsUnicode(false); - - modelBuilder.Entity
() - .HasMany(e => e.customers) - .WithRequired(e => e.address) - .WillCascadeOnDelete(false); - - modelBuilder.Entity
() - .HasMany(e => e.staffs) - .WithRequired(e => e.address) - .WillCascadeOnDelete(false); - - modelBuilder.Entity
() - .HasMany(e => e.stores) - .WithRequired(e => e.address) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .Property(e => e.name) - .IsUnicode(false); - - modelBuilder.Entity() - .HasMany(e => e.film_category) - .WithRequired(e => e.category) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .Property(e => e.city1) - .IsUnicode(false); - - modelBuilder.Entity() - .HasMany(e => e.addresses) - .WithRequired(e => e.city) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .Property(e => e.country1) - .IsUnicode(false); - - modelBuilder.Entity() - .HasMany(e => e.cities) - .WithRequired(e => e.country) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .Property(e => e.first_name) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.last_name) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.email) - .IsUnicode(false); - - modelBuilder.Entity() - .HasMany(e => e.payments) - .WithRequired(e => e.customer) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .HasMany(e => e.rentals) - .WithRequired(e => e.customer) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .Property(e => e.title) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.description) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.rating) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.special_features) - .IsUnicode(false); - - modelBuilder.Entity() - .HasMany(e => e.film_actor) - .WithRequired(e => e.film) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .HasMany(e => e.film_category) - .WithRequired(e => e.film) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .HasMany(e => e.inventories) - .WithRequired(e => e.film) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .Property(e => e.title) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.description) - .IsUnicode(false); - - modelBuilder.Entity() - .HasMany(e => e.rentals) - .WithRequired(e => e.inventory) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .Property(e => e.name) - .IsUnicode(false); - - modelBuilder.Entity() - .HasMany(e => e.films) - .WithRequired(e => e.language) - .HasForeignKey(e => e.language_id) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .HasMany(e => e.films1) - .WithOptional(e => e.language1) - .HasForeignKey(e => e.original_language_id); - - modelBuilder.Entity() - .Property(e => e.first_name) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.last_name) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.email) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.username) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.password) - .IsUnicode(false); - - modelBuilder.Entity() - .HasMany(e => e.payments) - .WithRequired(e => e.staff) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .HasMany(e => e.rentals) - .WithRequired(e => e.staff) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .HasMany(e => e.stores) - .WithRequired(e => e.staff) - .HasForeignKey(e => e.manager_staff_id) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .HasMany(e => e.customers) - .WithRequired(e => e.store) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .HasMany(e => e.inventories) - .WithRequired(e => e.store) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .HasMany(e => e.staffs) - .WithRequired(e => e.store) - .HasForeignKey(e => e.store_id) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .Property(e => e.first_name) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.last_name) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.film_info) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.name) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.address) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.zip_code) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.phone) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.city) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.country) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.notes) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.title) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.description) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.category) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.rating) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.actors) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.title) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.description) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.category) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.rating) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.actors) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.category) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.store) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.manager) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.name) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.address) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.zip_code) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.phone) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.city) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.country) - .IsUnicode(false); - } - } -} diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/actor.cs b/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/actor.cs deleted file mode 100644 index 8ef579725..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/actor.cs +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.actor")] -#else - [Table("actor")] -#endif - public partial class actor - { - public actor() - { - film_actor = new HashSet(); - } - - [Key] - [Column(TypeName = "usmallint")] - public int actor_id { get; set; } - - [Required] - [StringLength(45)] - public string first_name { get; set; } - - [Required] - [StringLength(45)] - public string last_name { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual ICollection film_actor { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/actor_info.cs b/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/actor_info.cs deleted file mode 100644 index e96ef6621..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/actor_info.cs +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.actor_info")] -#else - [Table("actor_info")] -#endif - public partial class actor_info - { - [Key] - [Column(Order = 0, TypeName = "usmallint")] - [DatabaseGenerated(DatabaseGeneratedOption.None)] - public int actor_id { get; set; } - - [Key] - [Column(Order = 1)] - [StringLength(45)] - public string first_name { get; set; } - - [Key] - [Column(Order = 2)] - [StringLength(45)] - public string last_name { get; set; } - - [Column(TypeName = "text")] - [StringLength(65535)] - public string film_info { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/address.cs b/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/address.cs deleted file mode 100644 index b2f500222..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/address.cs +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.address")] -#else - [Table("address")] -#endif - public partial class address - { - public address() - { - customers = new HashSet(); - staffs = new HashSet(); - stores = new HashSet(); - } - - [Key] - [Column(TypeName = "usmallint")] - public int address_id { get; set; } - - [Column("address")] - [Required] - [StringLength(50)] - public string address1 { get; set; } - - [StringLength(50)] - public string address2 { get; set; } - - [Required] - [StringLength(20)] - public string district { get; set; } - - [Column(TypeName = "usmallint")] - public int city_id { get; set; } - - [StringLength(10)] - public string postal_code { get; set; } - - [Required] - [StringLength(20)] - public string phone { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual city city { get; set; } - - public virtual ICollection customers { get; set; } - - public virtual ICollection staffs { get; set; } - - public virtual ICollection stores { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/category.cs b/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/category.cs deleted file mode 100644 index 7b618f8b9..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/category.cs +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.category")] -#else - [Table("category")] -#endif - public partial class category - { - public category() - { - film_category = new HashSet(); - } - - [Key] - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public byte category_id { get; set; } - - [Required] - [StringLength(25)] - public string name { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual ICollection film_category { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/city.cs b/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/city.cs deleted file mode 100644 index 009f7b317..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/city.cs +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.city")] -#else - [Table("city")] -#endif - public partial class city - { - public city() - { - addresses = new HashSet
(); - } - - [Key] - [Column(TypeName = "usmallint")] - public int city_id { get; set; } - - [Column("city")] - [Required] - [StringLength(50)] - public string city1 { get; set; } - - [Column(TypeName = "usmallint")] - public int country_id { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual ICollection
addresses { get; set; } - - public virtual country country { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/country.cs b/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/country.cs deleted file mode 100644 index 21d34abc7..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/country.cs +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.country")] -#else - [Table("country")] -#endif - public partial class country - { - public country() - { - cities = new HashSet(); - } - - [Key] - [Column(TypeName = "usmallint")] - public int country_id { get; set; } - - [Column("country")] - [Required] - [StringLength(50)] - public string country1 { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual ICollection cities { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/customer.cs b/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/customer.cs deleted file mode 100644 index a121a7cff..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/customer.cs +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.customer")] -#else - [Table("customer")] -#endif - public partial class customer - { - public customer() - { - payments = new HashSet(); - rentals = new HashSet(); - } - - [Key] - [Column(TypeName = "usmallint")] - public int customer_id { get; set; } - - public byte store_id { get; set; } - - [Required] - [StringLength(45)] - public string first_name { get; set; } - - [Required] - [StringLength(45)] - public string last_name { get; set; } - - [StringLength(50)] - public string email { get; set; } - - [Column(TypeName = "usmallint")] - public int address_id { get; set; } - - public bool active { get; set; } - - public DateTime create_date { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual address address { get; set; } - - public virtual store store { get; set; } - - public virtual ICollection payments { get; set; } - - public virtual ICollection rentals { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/customer_list.cs b/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/customer_list.cs deleted file mode 100644 index d63688e2a..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/customer_list.cs +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.customer_list")] -#else - [Table("customer_list")] -#endif - public partial class customer_list - { - [Key] - [Column(Order = 0, TypeName = "usmallint")] - [DatabaseGenerated(DatabaseGeneratedOption.None)] - public int ID { get; set; } - - [Key] - [Column(Order = 1)] - [StringLength(91)] - public string name { get; set; } - - [Key] - [Column(Order = 2)] - [StringLength(50)] - public string address { get; set; } - - [Column("zip code")] - [StringLength(10)] - public string zip_code { get; set; } - - [Key] - [Column(Order = 3)] - [StringLength(20)] - public string phone { get; set; } - - [Key] - [Column(Order = 4)] - [StringLength(50)] - public string city { get; set; } - - [Key] - [Column(Order = 5)] - [StringLength(50)] - public string country { get; set; } - - [Key] - [Column(Order = 6)] - [StringLength(6)] - public string notes { get; set; } - - [Key] - [Column(Order = 7)] - public byte SID { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film.cs b/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film.cs deleted file mode 100644 index 2701d3e9d..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film.cs +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.film")] -#else - [Table("film")] -#endif - public partial class film - { - public film() - { - film_actor = new HashSet(); - film_category = new HashSet(); - inventories = new HashSet(); - } - - [Key] - [Column(TypeName = "usmallint")] - public int film_id { get; set; } - - [Required] - [StringLength(255)] - public string title { get; set; } - - [Column(TypeName = "text")] - [StringLength(65535)] - public string description { get; set; } - - [Column(TypeName = "year")] - public short? release_year { get; set; } - - public byte language_id { get; set; } - - public byte? original_language_id { get; set; } - - public byte rental_duration { get; set; } - - public decimal rental_rate { get; set; } - - [Column(TypeName = "usmallint")] - public int? length { get; set; } - - public decimal replacement_cost { get; set; } - - [Column(TypeName = "enum")] - [StringLength(65532)] - public string rating { get; set; } - - [Column(TypeName = "set")] - [StringLength(65531)] - public string special_features { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual ICollection film_actor { get; set; } - - public virtual ICollection film_category { get; set; } - - public virtual language language { get; set; } - - public virtual language language1 { get; set; } - - public virtual ICollection inventories { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film_actor.cs b/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film_actor.cs deleted file mode 100644 index 9eec1954d..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film_actor.cs +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.film_actor")] -#else - [Table("film_actor")] -#endif - public partial class film_actor - { - [Key] - [Column(Order = 0, TypeName = "usmallint")] - [DatabaseGenerated(DatabaseGeneratedOption.None)] - public int actor_id { get; set; } - - [Key] - [Column(Order = 1, TypeName = "usmallint")] - [DatabaseGenerated(DatabaseGeneratedOption.None)] - public int film_id { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual actor actor { get; set; } - - public virtual film film { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film_category.cs b/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film_category.cs deleted file mode 100644 index 9a4741352..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film_category.cs +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.film_category")] -#else - [Table("film_category")] -#endif - public partial class film_category - { - [Key] - [Column(Order = 0, TypeName = "usmallint")] - [DatabaseGenerated(DatabaseGeneratedOption.None)] - public int film_id { get; set; } - - [Key] - [Column(Order = 1)] - public byte category_id { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual category category { get; set; } - - public virtual film film { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film_list.cs b/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film_list.cs deleted file mode 100644 index 870a0baf8..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film_list.cs +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.film_list")] -#else - [Table("film_list")] -#endif - public partial class film_list - { - [Column(TypeName = "usmallint")] - public int? FID { get; set; } - - [StringLength(255)] - public string title { get; set; } - - [Column(TypeName = "text")] - [StringLength(65535)] - public string description { get; set; } - - [Key] - [StringLength(25)] - public string category { get; set; } - - public decimal? price { get; set; } - - [Column(TypeName = "usmallint")] - public int? length { get; set; } - - [Column(TypeName = "enum")] - [StringLength(65532)] - public string rating { get; set; } - - [Column(TypeName = "text")] - [StringLength(65535)] - public string actors { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film_text.cs b/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film_text.cs deleted file mode 100644 index 1b13c0490..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/film_text.cs +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.film_text")] -#else - [Table("film_text")] -#endif - public partial class film_text - { - [Key] - [DatabaseGenerated(DatabaseGeneratedOption.None)] - public short film_id { get; set; } - - [Required] - [StringLength(255)] - public string title { get; set; } - - [Column(TypeName = "text")] - [StringLength(65535)] - public string description { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/inventory.cs b/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/inventory.cs deleted file mode 100644 index 72d43dd6a..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/inventory.cs +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.inventory")] -#else - [Table("inventory")] -#endif - public partial class inventory - { - public inventory() - { - rentals = new HashSet(); - } - - [Key] - [Column(TypeName = "umediumint")] - public int inventory_id { get; set; } - - [Column(TypeName = "usmallint")] - public int film_id { get; set; } - - public byte store_id { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual film film { get; set; } - - public virtual store store { get; set; } - - public virtual ICollection rentals { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/language.cs b/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/language.cs deleted file mode 100644 index 032cdddf8..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/language.cs +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.language")] -#else - [Table("language")] -#endif - public partial class language - { - public language() - { - films = new HashSet(); - films1 = new HashSet(); - } - - [Key] - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public byte language_id { get; set; } - - [Column(TypeName = "char")] - [Required] - [StringLength(20)] - public string name { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual ICollection films { get; set; } - - public virtual ICollection films1 { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/nicer_but_slower_film_list.cs b/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/nicer_but_slower_film_list.cs deleted file mode 100644 index 5d43f3e9e..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/nicer_but_slower_film_list.cs +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.nicer_but_slower_film_list")] -#else - [Table("nicer_but_slower_film_list")] -#endif - public partial class nicer_but_slower_film_list - { - [Column(TypeName = "usmallint")] - public int? FID { get; set; } - - [StringLength(255)] - public string title { get; set; } - - [Column(TypeName = "text")] - [StringLength(65535)] - public string description { get; set; } - - [Key] - [StringLength(25)] - public string category { get; set; } - - public decimal? price { get; set; } - - [Column(TypeName = "usmallint")] - public int? length { get; set; } - - [Column(TypeName = "enum")] - [StringLength(65532)] - public string rating { get; set; } - - [Column(TypeName = "text")] - [StringLength(65535)] - public string actors { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/payment.cs b/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/payment.cs deleted file mode 100644 index 6ebf53f6c..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/payment.cs +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.payment")] -#else - [Table("payment")] -#endif - public partial class payment - { - [Key] - [Column(TypeName = "usmallint")] - public int payment_id { get; set; } - - [Column(TypeName = "usmallint")] - public int customer_id { get; set; } - - public byte staff_id { get; set; } - - public int? rental_id { get; set; } - - public decimal amount { get; set; } - - public DateTime payment_date { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual customer customer { get; set; } - - public virtual rental rental { get; set; } - - public virtual staff staff { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/rental.cs b/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/rental.cs deleted file mode 100644 index cfdf3c11f..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/rental.cs +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.rental")] -#else - [Table("rental")] -#endif - public partial class rental - { - public rental() - { - payments = new HashSet(); - } - - [Key] - public int rental_id { get; set; } - - public DateTime rental_date { get; set; } - - [Column(TypeName = "umediumint")] - public int inventory_id { get; set; } - - [Column(TypeName = "usmallint")] - public int customer_id { get; set; } - - public DateTime? return_date { get; set; } - - public byte staff_id { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual customer customer { get; set; } - - public virtual inventory inventory { get; set; } - - public virtual ICollection payments { get; set; } - - public virtual staff staff { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/sales_by_film_category.cs b/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/sales_by_film_category.cs deleted file mode 100644 index a85fd327c..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/sales_by_film_category.cs +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 - using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.sales_by_film_category")] -#else - [Table("sales_by_film_category")] -#endif - public partial class sales_by_film_category - { - [Key] - [StringLength(25)] - public string category { get; set; } - - public decimal? total_sales { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/sales_by_store.cs b/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/sales_by_store.cs deleted file mode 100644 index 4eaf8f1e6..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/sales_by_store.cs +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.sales_by_store")] -#else - [Table("sales_by_store")] -#endif - public partial class sales_by_store - { - [Key] - [Column(Order = 0)] - [StringLength(101)] - public string store { get; set; } - - [Key] - [Column(Order = 1)] - [StringLength(91)] - public string manager { get; set; } - - public decimal? total_sales { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/staff.cs b/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/staff.cs deleted file mode 100644 index aefc84a04..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/staff.cs +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.staff")] -#else - [Table("staff")] -#endif - public partial class staff - { - public staff() - { - payments = new HashSet(); - rentals = new HashSet(); - stores = new HashSet(); - } - - [Key] - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public byte staff_id { get; set; } - - [Required] - [StringLength(45)] - public string first_name { get; set; } - - [Required] - [StringLength(45)] - public string last_name { get; set; } - - [Column(TypeName = "usmallint")] - public int address_id { get; set; } - - [Column(TypeName = "blob")] - public byte[] picture { get; set; } - - [StringLength(50)] - public string email { get; set; } - - public byte store_id { get; set; } - - public bool active { get; set; } - - [Required] - [StringLength(16)] - public string username { get; set; } - - [StringLength(40)] - public string password { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual address address { get; set; } - - public virtual ICollection payments { get; set; } - - public virtual ICollection rentals { get; set; } - - public virtual store store { get; set; } - - public virtual ICollection stores { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/staff_list.cs b/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/staff_list.cs deleted file mode 100644 index b39ef569b..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/staff_list.cs +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.staff_list")] -#else - [Table("staff_list")] -#endif - public partial class staff_list - { - [Key] - [Column(Order = 0)] - public byte ID { get; set; } - - [Key] - [Column(Order = 1)] - [StringLength(91)] - public string name { get; set; } - - [Key] - [Column(Order = 2)] - [StringLength(50)] - public string address { get; set; } - - [Column("zip code")] - [StringLength(10)] - public string zip_code { get; set; } - - [Key] - [Column(Order = 3)] - [StringLength(20)] - public string phone { get; set; } - - [Key] - [Column(Order = 4)] - [StringLength(50)] - public string city { get; set; } - - [Key] - [Column(Order = 5)] - [StringLength(50)] - public string country { get; set; } - - [Key] - [Column(Order = 6)] - public byte SID { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/store.cs b/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/store.cs deleted file mode 100644 index f8a0d2c10..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/SakilaModel/store.cs +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.store")] -#else - [Table("store")] -#endif - public partial class store - { - public store() - { - customers = new HashSet(); - inventories = new HashSet(); - staffs = new HashSet(); - } - - [Key] - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public byte store_id { get; set; } - - public byte manager_staff_id { get; set; } - - [Column(TypeName = "usmallint")] - public int address_id { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual address address { get; set; } - - public virtual ICollection customers { get; set; } - - public virtual ICollection inventories { get; set; } - - public virtual ICollection staffs { get; set; } - - public virtual staff staff { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework.CodeFirst.Tests/packages.config b/Tests/MySql.EntityFramework.CodeFirst.Tests/packages.config deleted file mode 100644 index 1807bad61..000000000 --- a/Tests/MySql.EntityFramework.CodeFirst.Tests/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/Tests/MySql.EntityFramework.Migrations.Tests/App.config b/Tests/MySql.EntityFramework.Migrations.Tests/App.config deleted file mode 100644 index e5083d59b..000000000 --- a/Tests/MySql.EntityFramework.Migrations.Tests/App.config +++ /dev/null @@ -1,20 +0,0 @@ - - - -
- - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Tests/MySql.EntityFramework.Migrations.Tests/MySql.EF5.Migrations.Tests.csproj b/Tests/MySql.EntityFramework.Migrations.Tests/MySql.EF5.Migrations.Tests.csproj deleted file mode 100644 index 7d015c471..000000000 --- a/Tests/MySql.EntityFramework.Migrations.Tests/MySql.EF5.Migrations.Tests.csproj +++ /dev/null @@ -1,136 +0,0 @@ - - - - Debug - AnyCPU - {A3F23E22-934F-4D35-8599-C453794A9D82} - Library - Properties - MySql.Data.Entity.Migrations.Tests - MySql.Data.Entity.Migrations.Tests - v4.0 - 512 - ..\..\ - true - - - - 9.0 - - - 3.5 - - - - - - 9.0.30729 - 2.0 - 4.0 - v4.0 - NET_40_OR_GREATER - - - - - 9.0.30729 - 2.0 - 4.5 - v4.5.1 - NET_40_OR_GREATER;NET_45_OR_GREATER; - - - - - true - full - false - $(TargetFrameworkVersion)\ - obj\$(TargetFrameworkVersion)\ - obj\$(TargetFrameworkVersion)\ - bin\$(TargetFrameworkVersion)\Debug\ - prompt - 4 - DEBUG;TRACE;$(DefineConstants) - - - pdbonly - true - $(TargetFrameworkVersion)\ - obj\$(TargetFrameworkVersion)\ - obj\$(TargetFrameworkVersion)\ - bin\$(TargetFrameworkVersion)\Release\ - prompt - 4 - TRACE;$(DefineConstants) - - - - - - - ..\..\packages\EntityFramework.5.0.0\lib\net40\EntityFramework.dll - True - False - - - - - - - ..\..\packages\EntityFramework.5.0.0\lib\net45\EntityFramework.dll - True - - - - - - - - - - - - - ..\..\packages\xunit.1.9.2\lib\net20\xunit.dll - True - - - - - - - - - - - Designer - Always - - - - - - - - - {e9df5ed1-4cbd-4226-b931-9a51610ac14d} - MySql.Data - - - {f29e5b3d-7f76-4cf9-bf5e-8e3a1377b1e4} - MySql.Data.Tests - - - - - - - - \ No newline at end of file diff --git a/Tests/MySql.EntityFramework.Migrations.Tests/packages.config b/Tests/MySql.EntityFramework.Migrations.Tests/packages.config deleted file mode 100644 index 1807bad61..000000000 --- a/Tests/MySql.EntityFramework.Migrations.Tests/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/AggregateOperators.cs b/Tests/MySql.EntityFramework6.Basic.Tests/AggregateOperators.cs deleted file mode 100644 index 72ba387b7..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/AggregateOperators.cs +++ /dev/null @@ -1,439 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Xunit; -using MySql.Data.MySqlClient; -using System.Data.Common; -using System.Data; -using MySql.Data.Entity.Tests.Properties; -#if EF6 -using System.Data.Entity.Core.Objects; -#else -using System.Data.Objects; -#endif - - -namespace MySql.Data.Entity.Tests -{ - public class AggregateOperators : IUseFixture - { - private SetUpEntityTests st; - - public void SetFixture(SetUpEntityTests data) - { - st = data; - } - - [Fact] - public void CountSimple() - { - MySqlCommand trueCmd = new MySqlCommand("SELECT COUNT(*) FROM Toys", st.conn); - object trueCount = trueCmd.ExecuteScalar(); - - using (testEntities context = new testEntities()) - { - string eSql = "SELECT VALUE Count(t.Id) FROM Toys AS t"; - ObjectQuery q = context.CreateQuery(eSql); - - string sql = q.ToTraceString(); - st.CheckSql(sql, SQLSyntax.CountSimple); - - foreach (int count in q) - Assert.Equal(Convert.ToInt32(trueCount), count); - } - } - - [Fact] - public void BigCountSimple() - { - MySqlCommand trueCmd = new MySqlCommand("SELECT COUNT(*) FROM Toys", st.conn); - object trueCount = trueCmd.ExecuteScalar(); - - using (testEntities context = new testEntities()) - { - string eSql = "SELECT VALUE BigCount(t.Id) FROM Toys AS t"; -#if EF6 - ObjectQuery q = context.CreateQuery(eSql); -#else - ObjectQuery q = context.CreateQuery(eSql); -#endif - - string sql = q.ToTraceString(); - st.CheckSql(sql, SQLSyntax.BigCountSimple); - - foreach (int count in q) - Assert.Equal(Convert.ToInt32(trueCount), count); - } - } - - [Fact] - public void CountWithPredicate() - { - MySqlCommand trueCmd = new MySqlCommand("SELECT COUNT(*) FROM Toys AS t WHERE t.MinAge > 3", st.conn); - object trueCount = trueCmd.ExecuteScalar(); - - using (testEntities context = new testEntities()) - { - string eSql = "SELECT VALUE Count(t.Id) FROM Toys AS t WHERE t.MinAge > 3"; - ObjectQuery q = context.CreateQuery(eSql); - - string sql = q.ToTraceString(); - st.CheckSql(sql, SQLSyntax.CountWithPredicate); - - foreach (int count in q) - Assert.Equal(Convert.ToInt32(trueCount), count); - } - } - - [Fact] - public void MinSimple() - { - MySqlCommand trueCmd = new MySqlCommand("SELECT MIN(minage) FROM Toys", st.conn); - int trueMin = (int)trueCmd.ExecuteScalar(); - - using (testEntities context = new testEntities()) - { - string eSql = "SELECT VALUE MIN(t.MinAge) FROM Toys AS t"; - ObjectQuery q = context.CreateQuery(eSql); - - string sql = q.ToTraceString(); - st.CheckSql(sql, SQLSyntax.MinSimple); - - foreach (int age in q) - Assert.Equal(trueMin, age); - } - } - - [Fact] - public void MinWithPredicate() - { - MySqlCommand trueCmd = new MySqlCommand("SELECT MIN(Freight) FROM Orders WHERE shopId=2", st.conn); - object freight = trueCmd.ExecuteScalar(); - - using (testEntities context = new testEntities()) - { - string eSql = "SELECT Min(o.Freight) FROM Orders AS o WHERE o.Shop.Id = 2"; - ObjectQuery q = context.CreateQuery(eSql); - - string sql = q.ToTraceString(); - st.CheckSql(sql, SQLSyntax.MinWithPredicate); - - foreach (DbDataRecord r in q) - { - Assert.Equal(Convert.ToDouble(freight), r.GetDouble(0)); - } - } - } - - [Fact] - public void MinWithGrouping() - { - MySqlDataAdapter da = new MySqlDataAdapter( - "SELECT MIN(Freight) FROM Orders GROUP BY shopId", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - - using (testEntities context = new testEntities()) - { - string eSql = "SELECT VALUE Min(o.Freight) FROM Orders AS o GROUP BY o.Shop.Id"; - ObjectQuery q = context.CreateQuery(eSql); - - string sql = q.ToTraceString(); - st.CheckSql(sql, SQLSyntax.MinWithGrouping); - - int i = 0; - foreach (double freight in q) - Assert.Equal(Convert.ToInt32(dt.Rows[i++][0]), Convert.ToInt32(freight)); - } - } - - [Fact] - public void MaxSimple() - { - MySqlCommand trueCmd = new MySqlCommand("SELECT MAX(minage) FROM Toys", st.conn); - int trueMax = (int)trueCmd.ExecuteScalar(); - - using (testEntities context = new testEntities()) - { - string eSql = "SELECT VALUE MAX(t.MinAge) FROM Toys AS t"; - ObjectQuery q = context.CreateQuery(eSql); - - string sql = q.ToTraceString(); - st.CheckSql(sql, SQLSyntax.MaxSimple); - - foreach (int max in q) - Assert.Equal(trueMax, max); - } - } - - [Fact] - public void MaxWithPredicate() - { - MySqlCommand trueCmd = new MySqlCommand("SELECT MAX(Freight) FROM Orders WHERE shopId=1", st.conn); - object freight = trueCmd.ExecuteScalar(); - - using (testEntities context = new testEntities()) - { - string eSql = "SELECT MAX(o.Freight) FROM Orders AS o WHERE o.Shop.Id = 1"; - ObjectQuery q = context.CreateQuery(eSql); - - string sql = q.ToTraceString(); - st.CheckSql(sql, SQLSyntax.MaxWithPredicate); - - foreach (DbDataRecord r in q) - Assert.Equal(Convert.ToDouble(freight), r.GetDouble(0)); - } - } - - [Fact] - public void MaxWithGrouping() - { - MySqlDataAdapter da = new MySqlDataAdapter( - "SELECT MAX(Freight) FROM Orders GROUP BY ShopId", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - - using (testEntities context = new testEntities()) - { - string eSql = "SELECT VALUE MAX(o.Freight) FROM Orders AS o GROUP BY o.Shop.Id"; - ObjectQuery q = context.CreateQuery(eSql); - - string sql = q.ToTraceString(); - st.CheckSql(sql, SQLSyntax.MaxWithGrouping); - - int i = 0; - foreach (double freight in q) - Assert.Equal(Convert.ToInt32(dt.Rows[i++][0]), Convert.ToInt32(freight)); - } - } - - [Fact] - public void AverageSimple() - { - MySqlCommand trueCmd = new MySqlCommand("SELECT AVG(minAge) FROM Toys", st.conn); -//#if EF6 -// int avgAge = (int)trueCmd.ExecuteScalar(); -//#else - Decimal avgAge = (Decimal)trueCmd.ExecuteScalar(); -//#endif - - using (testEntities context = new testEntities()) - { - string eSql = "SELECT VALUE Avg(t.MinAge) FROM Toys AS t"; -//#if EF6 -// ObjectQuery q = context.CreateQuery(eSql); -//#else - ObjectQuery q = context.CreateQuery(eSql); -//#endif - - string sql = q.ToTraceString(); - st.CheckSql(sql, SQLSyntax.AverageSimple); - -//#if EF6 -// foreach (int r in q) -//#else - foreach (Decimal r in q) -//#endif - Assert.Equal(avgAge, r); - } - } - - [Fact] - public void AverageWithPredicate() - { - MySqlCommand trueCmd = new MySqlCommand("SELECT AVG(Freight) FROM Orders WHERE shopId=3", st.conn); - Double freight = (Double)trueCmd.ExecuteScalar(); - - using (testEntities context = new testEntities()) - { - string eSql = "SELECT VALUE AVG(o.Freight) FROM Orders AS o WHERE o.Shop.Id = 3"; - ObjectQuery q = context.CreateQuery(eSql); - - string sql = q.ToTraceString(); - st.CheckSql(sql, SQLSyntax.AverageWithPredicate); - - foreach (Double r in q) - Assert.Equal(Convert.ToInt32(freight), Convert.ToInt32(r)); - } - } - - [Fact] - public void AverageWithGrouping() - { - MySqlDataAdapter da = new MySqlDataAdapter( - "SELECT AVG(Freight) FROM Orders GROUP BY ShopId", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - - using (testEntities context = new testEntities()) - { - string eSql = "SELECT AVG(o.Freight) FROM Orders AS o GROUP BY o.Shop.Id"; - ObjectQuery q = context.CreateQuery(eSql); - - string sql = q.ToTraceString(); - st.CheckSql(sql, SQLSyntax.AverageWithGrouping); - - foreach (object x in q) - { - string s = x.GetType().ToString(); - } - int i = 0; - foreach (var freight in q) - { - // Assert.Equal(Convert.ToInt32(dt.Rows[i++][0]), Convert.ToInt32(freight)); - } - } - } - - [Fact] - public void SumSimple() - { - MySqlCommand trueCmd = new MySqlCommand("SELECT SUM(minage) FROM Toys", st.conn); - int sumAge = Convert.ToInt32(trueCmd.ExecuteScalar()); - - using (testEntities context = new testEntities()) - { - string eSql = "SELECT VALUE Sum(t.MinAge) FROM Toys AS t"; - ObjectQuery q = context.CreateQuery(eSql); - - string sql = q.ToTraceString(); - st.CheckSql(sql, SQLSyntax.SumSimple); - - foreach (int r in q) - Assert.Equal(sumAge, r); - } - } - - [Fact] - public void SumWithPredicate() - { - MySqlCommand trueCmd = new MySqlCommand("SELECT SUM(Freight) FROM Orders WHERE shopId=2", st.conn); - object freight = trueCmd.ExecuteScalar(); - - using (testEntities context = new testEntities()) - { - string eSql = "SELECT VALUE SUM(o.Freight) FROM Orders AS o WHERE o.Shop.Id = 2"; - ObjectQuery q = context.CreateQuery(eSql); - - string sql = q.ToTraceString(); - st.CheckSql(sql, SQLSyntax.SumWithPredicate); - - foreach (Double r in q) - Assert.Equal(freight, r); - } - } - - [Fact] - public void SumWithGrouping() - { - MySqlDataAdapter da = new MySqlDataAdapter( - "SELECT SUM(Freight) FROM Orders GROUP BY ShopId", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - - using (testEntities context = new testEntities()) - { - string eSql = "SELECT VALUE SUM(o.Freight) FROM Orders AS o GROUP BY o.Shop.Id"; - ObjectQuery q = context.CreateQuery(eSql); - - string sql = q.ToTraceString(); - st.CheckSql(sql, SQLSyntax.SumWithGrouping); - - int i = 0; - foreach (double freight in q) - Assert.Equal(Convert.ToInt32(dt.Rows[i++][0]), Convert.ToInt32(freight)); - } - } - - [Fact] - public void MaxInSubQuery1() - { - MySqlDataAdapter da = new MySqlDataAdapter( - "SELECT s.* FROM Shops AS s WHERE s.id=(SELECT MAX(o.shopId) FROM Orders AS o)", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - - using (testEntities context = new testEntities()) - { - string eSql = @"SELECT VALUE s FROM Shops AS s WHERE s.Id = - MAX(SELECT VALUE o.Shop.Id FROM Orders As o)"; - ObjectQuery q = context.CreateQuery(eSql); - - string sql = q.ToTraceString(); - st.CheckSql(sql, SQLSyntax.MaxInSubQuery1); - - int i = 0; - foreach (Shop s in q) - Assert.Equal(dt.Rows[i++]["id"], s.Id); - } - } - - [Fact] - public void MaxInSubQuery2() - { - MySqlDataAdapter da = new MySqlDataAdapter( - "SELECT s.* FROM Shops AS s WHERE s.id=(SELECT MAX(o.shopId) FROM Orders AS o)", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - - using (testEntities context = new testEntities()) - { - string eSql = @"SELECT VALUE s FROM Shops AS s WHERE s.Id = - ANYELEMENT(SELECT VALUE MAX(o.Shop.Id) FROM Orders As o)"; - ObjectQuery q = context.CreateQuery(eSql); - - string sql = q.ToTraceString(); - st.CheckSql(sql, SQLSyntax.MaxInSubQuery2); - - int i = 0; - foreach (Shop s in q) - Assert.Equal(dt.Rows[i++]["id"], s.Id); - } - } - - /// - /// This test the fix for bug 67377. - /// - [Fact] - public void FirstOrDefaultNested() - { - using (testEntities ctx = new testEntities()) - { - var q = ctx.Authors.Where(p => p.Id == p.Id).Select(p => new { AuthorId = p.Id, FirstBook = (int?)p.Books.FirstOrDefault().Id }); - - string sql = q.ToTraceString(); - int?[,] input = { { 1, 1 }, { 2, 2 }, { 3, 3 }, { 4, null }, { 5, null } }; - int i = 0; - foreach (var r in q) - { - Assert.Equal(input[i, 0], r.AuthorId); - Assert.Equal(input[i, 1], r.FirstBook); - i++; - } - } - } - } -} diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/App.Config b/Tests/MySql.EntityFramework6.Basic.Tests/App.Config deleted file mode 100644 index 71382a861..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/App.Config +++ /dev/null @@ -1,37 +0,0 @@ - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/CanonicalFunctions.cs b/Tests/MySql.EntityFramework6.Basic.Tests/CanonicalFunctions.cs deleted file mode 100644 index f69bffdcf..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/CanonicalFunctions.cs +++ /dev/null @@ -1,423 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Xunit; -using System.Data.Common; -using MySql.Data.Entity.Tests.Properties; -using System.Diagnostics; -#if EF6 -using System.Data.Entity.Core.EntityClient; -using System.Data.Entity.Core.Objects; -#else -using System.Data.EntityClient; -using System.Data.Objects; -#endif - - -namespace MySql.Data.Entity.Tests -{ - public class CanonicalFunctions : IUseFixture, IDisposable - { - private SetUpEntityTests st; - - public void SetFixture(SetUpEntityTests data) - { - st = data; - } - - public void Dispose() - { } - - private EntityConnection GetEntityConnection() - { - string connectionString = String.Format( - "metadata=TestDB.csdl|TestDB.msl|TestDB.ssdl;provider=MySql.Data.MySqlClient; provider connection string=\"{0}\"", st.GetConnectionString(true)); - EntityConnection connection = new EntityConnection(connectionString); - return connection; - } - - [Fact] - public void Bitwise() - { - using (testEntities context = new testEntities()) - { - ObjectQuery q = context.CreateQuery("BitwiseAnd(255,15)"); - foreach (int i in q) - Assert.Equal(15, i); - q = context.CreateQuery("BitwiseOr(240,31)"); - foreach (int i in q) - Assert.Equal(255, i); - q = context.CreateQuery("BitwiseXor(255,15)"); - foreach (int i in q) - Assert.Equal(240, i); - } - } - - [Fact] - public void CurrentDateTime() - { - DateTime current = DateTime.Now; - - using (testEntities context = new testEntities()) - { - ObjectQuery q = context.CreateQuery("CurrentDateTime()"); - foreach (DateTime dt in q) - { - Assert.Equal(current.Year, dt.Year); - Assert.Equal(current.Month, dt.Month); - Assert.Equal(current.Day, dt.Day); - // we don't check time as that will be always be different - } - } - } - - [Fact] - public void YearMonthDay() - { - using (testEntities context = new testEntities()) - { - ObjectQuery q = context.CreateQuery( - @"SELECT c.DateBegan, Year(c.DateBegan), Month(c.DateBegan), Day(c.DateBegan) - FROM Companies AS c WHERE c.Id=1"); - foreach (DbDataRecord record in q) - { - Assert.Equal(1996, record[1]); - Assert.Equal(11, record[2]); - Assert.Equal(15, record[3]); - } - } - } - - [Fact] - public void HourMinuteSecond() - { - using (testEntities context = new testEntities()) - { - ObjectQuery q = context.CreateQuery( - @"SELECT c.DateBegan, Hour(c.DateBegan), Minute(c.DateBegan), Second(c.DateBegan) - FROM Companies AS c WHERE c.Id=1"); - foreach (DbDataRecord record in q) - { - Assert.Equal(5, record[1]); - Assert.Equal(18, record[2]); - Assert.Equal(23, record[3]); - } - } - } - - [Fact] - public void IndexOf() - { - using (testEntities context = new testEntities()) - { - ObjectQuery q = context.CreateQuery(@"IndexOf('needle', 'haystackneedle')"); - foreach (int index in q) - Assert.Equal(9, index); - - q = context.CreateQuery(@"IndexOf('haystack', 'needle')"); - foreach (int index in q) - Assert.Equal(0, index); - } - } - - [Fact] - public void LeftRight() - { - using (testEntities context = new testEntities()) - { - string entitySQL = "CONCAT(LEFT('foo',3),RIGHT('bar',3))"; - ObjectQuery query = context.CreateQuery(entitySQL); - foreach (string s in query) - Assert.Equal("foobar", s); - - entitySQL = "CONCAT(LEFT('foobar',3),RIGHT('barfoo',3))"; - query = context.CreateQuery(entitySQL); - foreach (string s in query) - Assert.Equal("foofoo", s); - - entitySQL = "CONCAT(LEFT('foobar',8),RIGHT('barfoo',8))"; - query = context.CreateQuery(entitySQL); - foreach (string s in query) - Assert.Equal("foobarbarfoo", s); - } - } - - [Fact] - public void Length() - { - using (testEntities context = new testEntities()) - { - string entitySQL = "Length('abc')"; - ObjectQuery query = context.CreateQuery(entitySQL); - foreach (int len in query) - Assert.Equal(3, len); - } - } - - [Fact] - public void Trims() - { - using (testEntities context = new testEntities()) - { - ObjectQuery query = context.CreateQuery("LTrim(' text ')"); - foreach (string s in query) - Assert.Equal("text ", s); - query = context.CreateQuery("RTrim(' text ')"); - foreach (string s in query) - Assert.Equal(" text", s); - query = context.CreateQuery("Trim(' text ')"); - foreach (string s in query) - Assert.Equal("text", s); - } - } - - [Fact] - public void Round() - { - using (testEntities context = new testEntities()) - { - ObjectQuery q = context.CreateQuery(@" - SELECT o.Id, o.Freight, - Round(o.Freight) AS [Rounded Freight], - Floor(o.Freight) AS [Floor of Freight], - Ceiling(o.Freight) AS [Ceiling of Freight] - FROM Orders AS o WHERE o.Id=1"); - foreach (DbDataRecord r in q) - { - Assert.Equal(1, r[0]); - Assert.Equal(65.3, r[1]); - Assert.Equal(65, Convert.ToInt32(r[2])); - Assert.Equal(65, Convert.ToInt32(r[3])); - Assert.Equal(66, Convert.ToInt32(r[4])); - } - } - } - - [Fact] - public void Substring() - { - using (testEntities context = new testEntities()) - { - ObjectQuery query = context.CreateQuery("SUBSTRING('foobarfoo',4,3)"); - query = context.CreateQuery("SUBSTRING('foobarfoo',4,30)"); - foreach (string s in query) - Assert.Equal("barfoo", s); - } - } - - [Fact] - public void ToUpperToLowerReverse() - { - using (testEntities context = new testEntities()) - { - ObjectQuery q = context.CreateQuery( - @"SELECT ToUpper(c.Name),ToLower(c.Name), - Reverse(c.Name) FROM Companies AS c WHERE c.Id=1"); - foreach (DbDataRecord r in q) - { - Assert.Equal("HASBRO", r[0]); - Assert.Equal("hasbro", r[1]); - Assert.Equal("orbsaH", r[2]); - } - } - } - - [Fact] - public void Replace() - { - using (testEntities context = new testEntities()) - { - ObjectQuery q = context.CreateQuery( - @"Replace('abcdefghi', 'def', 'zzz')"); - foreach (string s in q) - Assert.Equal("abczzzghi", s); - } - } - -#if CLR4 - [Fact] - public void CanRoundToNonZeroDigits() - { - - using (testEntities context = new testEntities()) - { - DbDataRecord order = context.CreateQuery(@" - SELECT o.Id, o.Freight, - Round(o.Freight, 2) AS [Rounded Freight] - FROM Orders AS o WHERE o.Id=10").First(); - - Assert.Equal(350.54721, order[1]); - Assert.Equal(350.55, order[2]); - } - } -#endif - - - /// - /// Fix for bug "Using List.Contains in Linq to EF generates many ORs instead of more efficient IN" - /// (http://bugs.mysql.com/bug.php?id=64934 / http://www.google.com ). - /// - [Fact] - public void ListContains2In() - { - using (testEntities context = new testEntities()) - { - int i = 0; - - // 1st test, only ORs - List Ages = new List(); - Ages.AddRange(new int[] { 37, 38, 39, 40, 41, 42, 43 }); - var q = from e in context.Employees - where Ages.Contains(e.Age.Value) - orderby e.LastName, e.FirstName - select e; - string[,] data1 = new string[,] { { "Flintstone", "Fred" }, { "Flintstone", "Wilma" }, - { "Rubble", "Barney" } }; - string query = string.Empty; - query = q.ToTraceString(); - st.CheckSql(query, SQLSyntax.InExpressionSimple); - Assert.Equal(3, q.Count()); - foreach (var e in q) - { - Assert.Equal(data1[i, 0], e.LastName); - Assert.Equal(data1[i, 1], e.FirstName); - i++; - } - - // 2nd test, mix of ORs & ANDs - Ages.Clear(); - Ages.AddRange(new int[] { 37, 38, 39 }); - List Ages2 = new List(); - Ages2.AddRange(new int[] { 40, 41, 42, 43 }); - q = from e in context.Employees - where (Ages2.Contains(e.Age.Value) && (e.FirstName == "Flintstones")) || - (!Ages.Contains(e.Age.Value)) - orderby e.LastName, e.FirstName - select e; - query = q.ToTraceString(); - st.CheckSql(SQLSyntax.InExpressionComplex, query); - Assert.Equal(6, q.Count()); - string[,] data2 = new string[,] { { "Doo", "Scooby" }, { "Flintstone", "Fred" }, - { "Rubble", "Barney" }, { "Rubble", "Betty" }, { "Slate", "S" }, - { "Underdog", "J" } - }; - i = 0; - foreach (var e in q) - { - Assert.Equal(data2[i, 0], e.LastName); - Assert.Equal(data2[i, 1], e.FirstName); - i++; - } - - // 3rd test, using only ||'s - q = from e in context.Employees - where (e.Age.Value == 37) || (e.Age.Value == 38) || (e.Age.Value == 39) || - (e.Age.Value == 40) || (e.Age.Value == 41) || (e.Age.Value == 42) || - (e.Age.Value == 43) - orderby e.LastName, e.FirstName - select e; - query = q.ToTraceString(); -#if !EF6 - st.CheckSql(query, SQLSyntax.InExpressionSimple); -#else - st.CheckSql(query, SQLSyntax.InExpressionSimpleEF6); -#endif - Assert.Equal(3, q.Count()); - i = 0; - foreach (var e in q) - { - Assert.Equal(data1[i, 0], e.LastName); - Assert.Equal(data1[i, 1], e.FirstName); - i++; - } - } - } - - /// - /// Fix for bug LINQ to SQL's StartsWith() and Contains() generate slow LOCATE() - /// instead of LIKE (bug http://bugs.mysql.com/bug.php?id=64935 / http://clustra.no.oracle.com/orabugs/14009363). - /// - [Fact] - public void ConversionToLike() - { - // Generates queries for each LIKE + wildcards case and checks SQL generated. - using (testEntities ctx = new testEntities()) - { - // Like 'pattern%' - var q = from c in ctx.Employees - where c.FirstName.StartsWith("B") - orderby c.FirstName - select c; - string query = q.ToTraceString(); - st.CheckSql(query, SQLSyntax.StartsWithTranslatedToLike); - Assert.Equal(2, q.Count()); - Assert.Equal("Barney", q.First().FirstName); - Assert.Equal("Betty", q.Skip(1).First().FirstName); - // Like '%pattern%' - q = from c in ctx.Employees - where c.FirstName.Contains("r") - orderby c.FirstName - select c; - query = q.ToTraceString(); - st.CheckSql(query, SQLSyntax.ContainsTranslatedToLike); - Assert.Equal(2, q.Count()); - Assert.Equal("Barney", q.First().FirstName); - Assert.Equal("Fred", q.Skip(1).First().FirstName); - // Like '%pattern' - q = from c in ctx.Employees - where c.FirstName.EndsWith("y") - orderby c.FirstName - select c; - query = q.ToTraceString(); - st.CheckSql(query, SQLSyntax.EndsWithTranslatedToLike); - Assert.Equal(3, q.Count()); - Assert.Equal("Barney", q.First().FirstName); - Assert.Equal("Betty", q.Skip(1).First().FirstName); - Assert.Equal("Scooby", q.Skip(2).First().FirstName); - } - } - - /// - /// Tests fix for bug http://bugs.mysql.com/bug.php?id=69409, Entity Framework Syntax Error in Where clause. - /// - [Fact] - public void EFSyntaxErrorApostrophe() - { - using (testEntities ctx = new testEntities()) - { - var q = from c in ctx.Employees - where c.FirstName.EndsWith("y'") - orderby c.FirstName - select c; - string query = q.ToTraceString(); - st.CheckSql(query, SQLSyntax.EndsWithTranslatedLikeApostrophes); - foreach (var row in q) - { - } - } - } - } -} diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/DataTypeTests.cs b/Tests/MySql.EntityFramework6.Basic.Tests/DataTypeTests.cs deleted file mode 100644 index ddd7f2a7b..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/DataTypeTests.cs +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Xunit; -using MySql.Data.MySqlClient; -using System.Data; -using System.Globalization; -using System.Threading; - -namespace MySql.Data.Entity.Tests -{ - public class DataTypeTests : IUseFixture - { - private SetUpEntityTests st; - - public void SetFixture(SetUpEntityTests data) - { - st = data; - } - - /// - /// Bug #45457 DbType Time is not supported in entity framework - /// - [Fact] - public void TimeType() - { - using (testEntities context = new testEntities()) - { - TimeSpan birth = new TimeSpan(11, 3, 2); - - Child c = new Child(); - c.Id = 20; - c.EmployeeID = 1; - c.FirstName = "first"; - c.LastName = "last"; - c.BirthTime = birth; - c.Modified = DateTime.Now; - context.AddToChildren(c); - context.SaveChanges(); - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM EmployeeChildren WHERE id=20", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - Assert.Equal(birth, dt.Rows[0]["birthtime"]); - } - } - - /// - /// Bug #45077 Insert problem with Connector/NET 6.0.3 and entity framework - /// Bug #45175 Wrong SqlType for unsigned smallint when generating Entity Framework Model - /// - [Fact] - public void UnsignedValues() - { - using (testEntities context = new testEntities()) - { - var row = context.Children.First(); - context.Detach(row); - context.Attach(row); - } - } - - /// - /// Bug #44455 insert and update error with entity framework - /// - [Fact] - public void DoubleValuesNonEnglish() - { - CultureInfo curCulture = Thread.CurrentThread.CurrentCulture; - CultureInfo curUICulture = Thread.CurrentThread.CurrentUICulture; - CultureInfo newCulture = new CultureInfo("da-DK"); - Thread.CurrentThread.CurrentCulture = newCulture; - Thread.CurrentThread.CurrentUICulture = newCulture; - - try - { - using (testEntities context = new testEntities()) - { - Child c = new Child(); - c.EmployeeID = 1; - c.FirstName = "Bam bam"; - c.LastName = "Rubble"; - c.BirthWeight = 8.65; - c.Modified = DateTime.Now; - context.AddToChildren(c); - context.SaveChanges(); - } - } - finally - { - Thread.CurrentThread.CurrentCulture = curCulture; - Thread.CurrentThread.CurrentUICulture = curUICulture; - } - } - - /// - /// Bug #46311 TimeStamp table column Entity Framework issue. - /// - [Fact] - public void TimestampColumn() - { - DateTime now = DateTime.Now; - - using (testEntities context = new testEntities()) - { - Child c = context.Children.First(); - DateTime dt = c.Modified; - c.Modified = now; - context.SaveChanges(); - - c = context.Children.First(); - dt = c.Modified; - Assert.Equal(now, dt); - } - } - - /// - /// Bug #48417 Invalid cast from 'System.String' to 'System.Guid' - /// - [Fact] - public void GuidType() - { - using (testEntities context = new testEntities()) - { - DataTypeTest dtt = context.DataTypeTests.First(); - string guidAsChar = dtt.idAsChar; - Assert.Equal(0, String.Compare(guidAsChar, dtt.id.ToString(), true)); - Assert.Equal(0, String.Compare(guidAsChar, dtt.id2.ToString(), true)); - } - } - - /// - /// Bug #62246 Connector/Net Incorrectly Maps Decimal To AnsiString - /// - [Fact] - public void CanSetDbTypeDecimalFromNewDecimalParameter() - { - MySqlParameter newDecimalParameter = new MySqlParameter - { - ParameterName = "TestNewDecimal", - Size = 10, - Scale = 2, - MySqlDbType = MySqlDbType.NewDecimal, - Value = 1111111.12, - IsNullable = true - }; - - Assert.Equal(DbType.Decimal, newDecimalParameter.DbType); - } - } -} diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/DatesTypesTests.cs b/Tests/MySql.EntityFramework6.Basic.Tests/DatesTypesTests.cs deleted file mode 100644 index bb21d6618..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/DatesTypesTests.cs +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright © 2011, 2013, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Xunit; -using MySql.Data.MySqlClient; - -namespace MySql.Data.Entity.Tests -{ - public class DatesTypesTests : IUseFixture - { - private SetUpEntityTests st; - - public void SetFixture(SetUpEntityTests data) - { - st = data; - } - -#if CLR4 - [Fact] - public void CanCreateDBScriptWithDateTimePrecision() - { - if (st.Version < new Version(5, 6, 5)) return; - - MySqlConnection c = new MySqlConnection(st.conn.ConnectionString); - c.Open(); - - var script = new MySqlScript(c); - using (var ctx = new datesTypesEntities()) - { - MySqlCommand query = new MySqlCommand("Create database test_types", c); - query.Connection = c; - query.ExecuteNonQuery(); - c.ChangeDatabase("test_types"); - - script.Query = ctx.CreateDatabaseScript(); - script.Execute(); - - query = new MySqlCommand("Select Column_name, Is_Nullable, Data_Type, DateTime_Precision from information_schema.Columns where table_schema ='" + c.Database + "' and table_name = 'Products' and column_name ='DateTimeWithPrecision'", c); - query.Connection = c; - MySqlDataReader reader = query.ExecuteReader(); - while (reader.Read()) - { - Assert.Equal("DateTimeWithPrecision", reader[0].ToString()); - Assert.Equal("NO", reader[1].ToString()); - Assert.Equal("datetime", reader[2].ToString()); - Assert.Equal("3", reader[3].ToString()); - } - reader.Close(); - ctx.DeleteDatabase(); - c.Close(); - } - } -#endif - } -} diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/DeleteTests.cs b/Tests/MySql.EntityFramework6.Basic.Tests/DeleteTests.cs deleted file mode 100644 index 115dc633d..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/DeleteTests.cs +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Xunit; -using MySql.Data.MySqlClient; -using System.Data; -using System.Data.Entity.Core.EntityClient; -using System.Data.Entity.Core.Objects; - - - -namespace MySql.Data.Entity.Tests -{ - public class DeleteTests : IUseFixture - { - private SetUpEntityTests st; - - public void SetFixture(SetUpEntityTests data) - { - st = data; - } - - [Fact] - public void SimpleDeleteAllRows() - { - //Make sure the table exists - var createTableSql = "CREATE TABLE IF NOT EXISTS Toys ( `Id` INT NOT NULL AUTO_INCREMENT, `SupplierId` INT NOT NULL, `Name` varchar(100) NOT NULL,`MinAge` int NOT NULL, CONSTRAINT PK_Toys PRIMARY KEY (Id) ) ENGINE=InnoDB;"; - if (st.conn.State != ConnectionState.Open) - st.conn.Open(); - - MySqlHelper.ExecuteNonQuery(st.conn, createTableSql); - MySqlHelper.ExecuteNonQuery(st.conn, "DELETE FROM Toys"); - MySqlHelper.ExecuteNonQuery(st.conn, "INSERT INTO Toys VALUES (1, 3, 'Slinky', 2), (2, 2, 'Rubiks Cube', 5), (3, 1, 'Lincoln Logs', 3), (4, 4, 'Legos', 4)"); - - using (testEntities context = new testEntities()) - { - foreach (Toy t in context.Toys) - context.DeleteObject(t); - context.SaveChanges(); - - EntityConnection ec = context.Connection as EntityConnection; - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM toys", - (MySqlConnection)ec.StoreConnection); - DataTable dt = new DataTable(); - da.Fill(dt); - Assert.Equal(0, dt.Rows.Count); - } - } - - [Fact] - public void SimpleDeleteRowByParameter() - { - //Make sure the table exists - var createTableSql = "CREATE TABLE IF NOT EXISTS Toys ( `Id` INT NOT NULL AUTO_INCREMENT, `SupplierId` INT NOT NULL, `Name` varchar(100) NOT NULL,`MinAge` int NOT NULL, CONSTRAINT PK_Toys PRIMARY KEY (Id)) ENGINE=InnoDB;"; - if (st.conn.State != ConnectionState.Open) - st.conn.Open(); - - MySqlHelper.ExecuteNonQuery(st.conn, createTableSql); - MySqlHelper.ExecuteNonQuery(st.conn, "DELETE FROM Toys"); - MySqlHelper.ExecuteNonQuery(st.conn, "INSERT INTO Toys VALUES (1, 3, 'Slinky', 2), (2, 2, 'Rubiks Cube', 5), (3, 1, 'Lincoln Logs', 3), (4, 4, 'Legos', 4)"); - - - using (testEntities context = new testEntities()) - { - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM toys WHERE minage=3", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - Assert.True(dt.Rows.Count > 0); - - ObjectQuery toys = context.Toys.Where("it.MinAge = @age", new ObjectParameter("age", 3)); - foreach (Toy t in toys) - context.DeleteObject(t); - context.SaveChanges(); - - dt.Clear(); - da.Fill(dt); - Assert.Equal(0, dt.Rows.Count); - } - } - - /// - /// Fix for bug Cascading delete using CreateDatabase in Entity Framework - /// (http://bugs.mysql.com/bug.php?id=64779) using ModelFirst. - /// - [Fact] - public void XOnDeleteCascade() - { -#if CLR4 - using (ModelFirstModel1Container ctx = new ModelFirstModel1Container()) - { - if (ctx.DatabaseExists()) - ctx.DeleteDatabase(); - ctx.CreateDatabase(); - ctx.SaveChanges(); - } -#endif - using (ModelFirstModel1Container ctx = new ModelFirstModel1Container()) - { - Student s = new Student(); - s.Name = "Einstein, Albert"; - s.Kardexes.Add(new Kardex() { Score = 9.0 }); - ctx.AddToStudents(s); - ctx.SaveChanges(); - } - - using (ModelFirstModel1Container ctx = new ModelFirstModel1Container()) - { - var a = from st in ctx.Students select st; - Student s = a.First(); - s.Kardexes.Load(); - Assert.Equal("Einstein, Albert", s.Name); - Kardex k = s.Kardexes.First(); - Assert.Equal(9.0, k.Score); - ctx.DeleteObject(s); - ctx.SaveChanges(); - } - - using (ModelFirstModel1Container ctx = new ModelFirstModel1Container()) - { - var q = from st in ctx.Students select st; - Assert.Equal(0, q.Count()); - var q2 = from k in ctx.Kardexes select k; - Assert.Equal(0, q2.Count()); - } - } - } -} diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/GenericListener.cs b/Tests/MySql.EntityFramework6.Basic.Tests/GenericListener.cs deleted file mode 100644 index c1eb295b5..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/GenericListener.cs +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Text; -using System.Diagnostics; -using System.Collections.Specialized; - -namespace MySql.Data.Entity.Tests -{ - public class GenericListener : TraceListener - { - - StringCollection strings; - StringBuilder partial; - - public GenericListener() - { - strings = new StringCollection(); - partial = new StringBuilder(); - } - - public StringCollection Strings - { - get { return strings; } - } - - public int Find(string sToFind) - { - int count = 0; - foreach (string s in strings) - if (s.IndexOf(sToFind) != -1) - count++; - return count; - } - - public void Clear() - { - partial.Remove(0, partial.Length); - strings.Clear(); - } - - public override void Write(string message) - { - partial.Append(message); - } - - public override void WriteLine(string message) - { - Write(message); - strings.Add(partial.ToString()); - partial.Remove(0, partial.Length); - } - - public int CountLinesContaining(string text) - { - int count = 0; - foreach (string s in strings) - if (s.Contains(text)) count++; - return count; - } - } -} diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/InsertTests.cs b/Tests/MySql.EntityFramework6.Basic.Tests/InsertTests.cs deleted file mode 100644 index 6409307ee..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/InsertTests.cs +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright � 2013, 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Data; -using System.Threading; -using MySql.Data.MySqlClient; -using System.Data.Common; -using Xunit; -#if EF6 -#else -using System.Data.EntityClient; -using System.Data.Objects; -#endif -#if NET_45_OR_GREATER -using System.Threading.Tasks; -#endif - -namespace MySql.Data.Entity.Tests -{ - public class InsertTests : IUseFixture - { - private SetUpEntityTests st; - - public void SetFixture(SetUpEntityTests data) - { - st = data; - } - - [Fact] - public void InsertSingleRow() - { - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM companies", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - DataRow lastRow = dt.Rows[dt.Rows.Count - 1]; - int lastId = (int)lastRow["id"]; - DateTime dateBegan = DateTime.Now; - - using (testEntities context = new testEntities()) - { - Company c = new Company(); - c.Id = 23; - c.Name = "Yoyo"; - c.NumEmployees = 486; - c.DateBegan = dateBegan; - c.Address.Address = "212 My Street."; - c.Address.City = "Helena"; - c.Address.State = "MT"; - c.Address.ZipCode = "44558"; - - context.AddToCompanies(c); - int result = context.SaveChanges(); - - DataTable afterInsert = new DataTable(); - da.Fill(afterInsert); - lastRow = afterInsert.Rows[afterInsert.Rows.Count - 1]; - - Assert.Equal(dt.Rows.Count + 1, afterInsert.Rows.Count); - Assert.Equal(lastId + 1, lastRow["id"]); - Assert.Equal("Yoyo", lastRow["name"]); - Assert.Equal(486, lastRow["numemployees"]); - DateTime insertedDT = (DateTime)lastRow["dateBegan"]; - Assert.Equal(dateBegan.Date, insertedDT.Date); - Assert.Equal("212 My Street.", lastRow["address"]); - Assert.Equal("Helena", lastRow["city"]); - Assert.Equal("MT", lastRow["state"]); - Assert.Equal("44558", lastRow["zipcode"]); - } - } - - [Fact] - public void CanInsertRowWithDefaultTimeStamp() - { - using (testEntities context = new testEntities()) - { - // The default timestamp is in the CreatedDate column. - Product product = new Product(); - product.Name = "Coca Cola"; - - context.AddToProducts(product); - context.SaveChanges(); - - Assert.Equal(DateTime.Today.Day, product.CreatedDate.Day); - } - } - - #region Async -#if NET_45_OR_GREATER - [Fact] - public async Task ExecuteNonQueryAndScalarAsyncAwait() - { - if (st.Version < new Version(5, 0)) return; - - st.execSQL("CREATE TABLE NonQueryAndScalarAsyncAwaitTest (id int)"); - st.execSQL("CREATE PROCEDURE NonQueryAndScalarAsyncAwaitSpTest() BEGIN SET @x=0; REPEAT INSERT INTO NonQueryAndScalarAsyncAwaitTest VALUES(@x); " + - "SET @x=@x+1; UNTIL @x = 100 END REPEAT; END"); - - EFMySqlCommand proc = new EFMySqlCommand() { CommandText = "NonQueryAndScalarAsyncAwaitSpTest", Connection = st.conn }; - proc.CommandType = CommandType.StoredProcedure; - int result = await proc.ExecuteNonQueryAsync(); - - Assert.NotEqual(-1, result); - - EFMySqlCommand cmd = new EFMySqlCommand() { CommandText = "SELECT COUNT(*) FROM NonQueryAndScalarAsyncAwaitTest;", Connection = st.conn }; - cmd.CommandType = CommandType.Text; - object cnt = await cmd.ExecuteScalarAsync(); - Assert.Equal(100, Convert.ToInt32(cnt)); - } - [Fact] - public async Task PrepareAsyncAwait() - { - st.execSQL("CREATE TABLE PrepareAsyncAwaitTest (val1 varchar(20), numbercol int, numbername varchar(50));"); - EFMySqlCommand cmd = new EFMySqlCommand() { CommandText = "INSERT INTO PrepareAsyncAwaitTest VALUES(NULL, @number, @text)", Connection = st.conn }; - await cmd.PrepareAsync(); - - cmd.Parameters.Add(new MySqlParameter("@number", 1)); - cmd.Parameters.Add(new MySqlParameter("@text", "One")); - - for (int i = 1; i <= 100; i++) - { - cmd.Parameters["@number"].Value = i; - cmd.Parameters["@text"].Value = "A string value"; - cmd.ExecuteNonQuery(); - } - } -#endif - #endregion - - /// - /// Test for fix for "NullReferenceException when try to save entity with TINYINY or BIGINT as PK" (MySql bug #70888, Oracle bug #17866076). - /// - [Fact] - public void NullReferenceWhenInsertingPk() - { - using (testEntities1 ctx = new testEntities1()) - { - gamingplatform gp = new gamingplatform() { Name="PlayStation2" }; - ctx.AddTogamingplatform(gp); - ctx.SaveChanges(); - } - } - } -} \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/JoinTests.cs b/Tests/MySql.EntityFramework6.Basic.Tests/JoinTests.cs deleted file mode 100644 index 87f97c177..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/JoinTests.cs +++ /dev/null @@ -1,331 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System; -using System.Data; -using System.Diagnostics; -using System.Threading; -using MySql.Data.MySqlClient; -using System.Data.Common; -using System.Linq; -using MySql.Data.Entity.Tests.Properties; -using System.Collections; -using System.Collections.Generic; -using Xunit; -#if EF6 -using System.Data.Entity.Core.Objects; -#else -using System.Data.EntityClient; -using System.Data.Objects; -#endif - -namespace MySql.Data.Entity.Tests -{ - public class JoinTests : IUseFixture - { - private SetUpEntityTests st; - - public void SetFixture(SetUpEntityTests data) - { - st = data; - } - - [Fact] - public void SimpleJoin() - { - MySqlDataAdapter da = new MySqlDataAdapter( - @"SELECT b.id,b.name,a.name as author_name from books b JOIN - authors a ON b.author_id=a.id", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - - using (testEntities context = new testEntities()) - { - var q = from b in context.Books - join a in context.Authors - on b.Author.Id equals a.Id - select new - { - bookId = b.Id, - bookName = b.Name, - authorName = a.Name - }; - - string sql = q.ToTraceString(); - st.CheckSql(sql, SQLSyntax.SimpleJoin); - - int i = 0; - foreach (var o in q) - Assert.Equal(dt.Rows[i++][0], o.bookId); - Assert.Equal(dt.Rows.Count, i); - } - } - - [Fact] - public void SimpleJoinWithPredicate() - { - MySqlDataAdapter da = new MySqlDataAdapter( - @"SELECT b.id,b.name,a.name as author_name from books b JOIN - authors a ON b.author_id=a.id WHERE b.pages > 300", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - - using (testEntities context = new testEntities()) - { - var q = from b in context.Books - join a in context.Authors - on b.Author.Id equals a.Id - where b.Pages > 300 - select new - { - bookId = b.Id, - bookName = b.Name, - authorName = a.Name - }; - - string sql = q.ToTraceString(); - st.CheckSql(sql, SQLSyntax.SimpleJoinWithPredicate); - - int i = 0; - foreach (var o in q) - Assert.Equal(dt.Rows[i++][0], o.bookId); - Assert.Equal(dt.Rows.Count, i); - } - } - - [Fact] - public void JoinOnRightSideAsDerivedTable() - { - using (testEntities context = new testEntities()) - { - var q = from child in context.Children - join emp in context.Employees - on child.EmployeeID equals emp.Id - where child.BirthWeight > 7 - select child; - string sql = q.ToTraceString(); - st.CheckSql(sql, SQLSyntax.JoinOnRightSideAsDerivedTable); - - foreach (Child c in q) - { - } - } - } - - [Fact] - public void JoinOfUnionsOnRightSideofJoin() - { - using (testEntities context = new testEntities()) - { - string eSql = @"SELECT c.Id, c.Name, Union1.Id, Union1.Name, - Union2.Id, Union2.Name FROM - testEntities.Companies AS c JOIN ( - ((SELECT t.Id, t.Name FROM testEntities.Toys as t) - UNION ALL - (SELECT s.Id, s.Name FROM testEntities.Shops as s)) AS Union1 - JOIN - ((SELECT a.Id, a.Name FROM testEntities.Authors AS a) - UNION ALL - (SELECT b.Id, b.Name FROM testEntities.Books AS b)) AS Union2 - ON Union1.Id = Union2.Id) ON c.Id = Union1.Id"; - ObjectQuery query = context.CreateQuery(eSql); - - string[] data = new string[] { - "1,Hasbro,1,Slinky,1,Tom Clancy", - "1,Hasbro,1,Target,1,Tom Clancy", - "1,Hasbro,1,Slinky,1,Debt of Honor", - "1,Hasbro,1,Target,1,Debt of Honor", - "2,Acme,2,K-Mart,2,Insomnia", - "2,Acme,2,Rubiks Cube,2,Stephen King", - "2,Acme,2,K-Mart,2,Stephen King", - "2,Acme,2,Rubiks Cube,2,Insomnia", - "3,Bandai America,3,Wal-Mart,3,Rainmaker", - "3,Bandai America,3,Lincoln Logs,3,John Grisham", - "3,Bandai America,3,Wal-Mart,3,John Grisham", - "3,Bandai America,3,Lincoln Logs,3,Rainmaker", - "4,Lego Group,4,Legos,4,Hallo", - "4,Lego Group,4,Legos,4,Dean Koontz" - }; - Dictionary outData = new Dictionary(); - string sql = query.ToTraceString(); - st.CheckSql(sql, SQLSyntax.JoinOfUnionsOnRightSideOfJoin); - // check data integrity - foreach (DbDataRecord record in query) - { - outData.Add(string.Format("{0},{1},{2},{3},{4},{5}", record.GetInt32( 0 ), - record.GetString( 1 ), record.GetInt32( 2 ), record.GetString( 3 ), - record.GetInt32( 4 ), record.GetString( 5 )), null); - } - Assert.Equal(data.Length, outData.Count); - for( int i = 0; i < data.Length; i++ ) - { - Assert.True(outData.ContainsKey(data[i])); - } - } - } - - [Fact] - public void t() - { - using (testEntities context = new testEntities()) - { - var q = from d in context.Computers - join l in context.Computers on d.Id equals l.Id - where (d is DesktopComputer) - select new { d.Id, d.Brand }; - foreach (var o in q) - { - } - } - } - - /// - /// Tests for bug http://bugs.mysql.com/bug.php?id=61729 - /// (Skip/Take Clauses Causes Null Reference Exception in 6.3.7 and 6.4.1 Only). - /// - [Fact] - public void JoinOfNestedUnionsWithLimit() - { - using (testEntities context = new testEntities()) - { - var q = context.Books.Include("Author"); - q = q.Include("Publisher"); - q = q.Include("Publisher.Books"); - string sql = q.ToTraceString(); - - var i = 0; - foreach (var o in q.Where(p => p.Id > 0).OrderBy(p => p.Name).ThenByDescending(p => p.Id).Skip(0).Take(32).ToList()) - { - switch (i) - { - case 0: - Assert.Equal(5, o.Id); - Assert.Equal("Debt of Honor", o.Name); - break; - case 1: - Assert.Equal(1, o.Id); - Assert.Equal("Debt of Honor", o.Name); - break; - case 4: - Assert.Equal(3, o.Id); - Assert.Equal("Rainmaker", o.Name); - break; - } - i++; - } - } - } - - [Fact] - public void JoinOnRightSideNameClash() - { - using (testEntities context = new testEntities()) - { - string eSql = @"SELECT c.Id, c.Name, a.Id, a.Name, b.Id, b.Name FROM - testEntities.Companies AS c JOIN (testEntities.Authors AS a - JOIN testEntities.Books AS b ON a.Id = b.Id) ON c.Id = a.Id"; - ObjectQuery query = context.CreateQuery(eSql); - string sql = query.ToTraceString(); - st.CheckSql(sql, SQLSyntax.JoinOnRightSideNameClash); - foreach (DbDataRecord record in query) - { - Assert.Equal(6, record.FieldCount); - } - } - } - - /// - /// Test for fix of Oracle bug 12807366. - /// - [Fact] - public void JoinsAndConcatsWithComposedKeys() - { - using (testEntities1 ctx = new testEntities1()) - { - IQueryable l2 = ctx.gamingplatform.Where(p => string.IsNullOrEmpty(p.Name)).Take(10); - IQueryable l = ctx.gamingplatform.Where(p => string.IsNullOrEmpty(p.Name)).Take(10); - var l4 = ctx.gamingplatform.Where(p => string.IsNullOrEmpty(p.Name)).Take(10); - l = l.Concat(l4); - l = l.Concat(ctx.gamingplatform.Where(p => string.IsNullOrEmpty(p.Name)).Take(10).Distinct()); - - IQueryable q = (from i in l join i2 in l2 on i.Id equals i2.Id select i); - IQueryable l3 = from t1 in q - join t2 in q.SelectMany(p => p.videogameplatform) - on t1.Id equals t2.IdGamingPlatform - select t2; - videogameplatform pu = null; - - pu = l3.FirstOrDefault(); - } - } - - /// - /// Test to fix Oracle bug 13491698 - /// - [Fact] - public void CanIncludeWithEagerLoading() - { - var myarray = new ArrayList(); - using (var db = new mybooksEntities()) - { - var author = db.myauthors.Include("mybooks.myeditions").AsEnumerable().First(); - var strquery = ((ObjectQuery)db.myauthors.Include("mybooks.myeditions").AsEnumerable()).ToTraceString(); - st.CheckSql(strquery, SQLSyntax.JoinUsingInclude); - foreach (var book in author.mybooks.ToList()) - { - foreach (var edition in book.myeditions.ToList()) - { - myarray.Add(edition.Title); - } - } - myarray.Sort(); - Assert.Equal(0, myarray.IndexOf("Another Book First Edition")); - Assert.Equal(1, myarray.IndexOf("Another Book Second Edition")); - Assert.Equal(2, myarray.IndexOf("Another Book Third Edition")); - Assert.Equal(3, myarray.IndexOf("Some Book First Edition")); - Assert.Equal(myarray.Count, 4); - } - } - - /// - /// Tests Fix for Error of "Every derived table must have an alias" in LINQ to Entities when using EF6 + DbFirst + View + Take (MySql Bug #72148, Oracle bug #19356006). - /// - [Fact] - public void TakeWithView() - { - using (testEntities1 ctx = new testEntities1()) - { - var q = ctx.vivideogametitle.Take(10); - string sql = q.ToTraceString(); - st.CheckSql(sql, SQLSyntax.TakeWithView); -#if DEBUG - Debug.WriteLine(sql); -#endif - foreach( var row in q ) - { - // - } - } - } - } -} \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/ModelFirstModel1.edmx.sql b/Tests/MySql.EntityFramework6.Basic.Tests/ModelFirstModel1.edmx.sql deleted file mode 100644 index 2368fa1e4..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/ModelFirstModel1.edmx.sql +++ /dev/null @@ -1,74 +0,0 @@ - - - - --- ----------------------------------------------------------- --- Entity Designer DDL Script for MySQL Server 4.1 and higher --- ----------------------------------------------------------- --- Date Created: 04/26/2012 16:08:15 --- Generated from EDMX file: C:\src\MainSource\features\bug64779-CascadingDelete\Tests\MySql.Data.Entity.Tests\ModelFirstModel1.edmx --- Target version: 2.0.0.0 --- -------------------------------------------------- - - --- -------------------------------------------------- --- Dropping existing FOREIGN KEY constraints --- NOTE: if the constraint does not exist, an ignorable error will be reported. --- -------------------------------------------------- - - --- -------------------------------------------------- --- Dropping existing tables --- -------------------------------------------------- -SET foreign_key_checks = 0; -SET foreign_key_checks = 1; - --- -------------------------------------------------- --- Creating all tables --- -------------------------------------------------- - --- Creating table 'Students' - -CREATE TABLE `Students` ( - `Id` int AUTO_INCREMENT PRIMARY KEY NOT NULL, - `Name` longtext NOT NULL -); - --- Creating table 'Kardexes' - -CREATE TABLE `Kardexes` ( - `Id` int AUTO_INCREMENT PRIMARY KEY NOT NULL, - `StudentId` int NOT NULL, - `Score` double NOT NULL -); - - - --- -------------------------------------------------- --- Creating all PRIMARY KEY constraints --- -------------------------------------------------- - - - --- -------------------------------------------------- --- Creating all FOREIGN KEY constraints --- -------------------------------------------------- - --- Creating foreign key on `StudentId` in table 'Kardexes' - -ALTER TABLE `Kardexes` -ADD CONSTRAINT `FK_StudentKardex` - FOREIGN KEY (`StudentId`) - REFERENCES `Students` - (`Id`) - ON DELETE CASCADE ON UPDATE NO ACTION; - --- Creating non-clustered index for FOREIGN KEY 'FK_StudentKardex' - -CREATE INDEX `IX_FK_StudentKardex` - ON `Kardexes` - (`StudentId`); - --- -------------------------------------------------- --- Script has ended --- -------------------------------------------------- diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Models/BooksModel.Designer.cs b/Tests/MySql.EntityFramework6.Basic.Tests/Models/BooksModel.Designer.cs deleted file mode 100644 index f9b68d7bb..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Models/BooksModel.Designer.cs +++ /dev/null @@ -1,527 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated from a template. -// -// Manual changes to this file may cause unexpected behavior in your application. -// Manual changes to this file will be overwritten if the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.ComponentModel; -using System.Linq; -using System.Runtime.Serialization; -using System.Xml.Serialization; - -using System.Data.Entity.Core.Objects; -using System.Data.Entity.Core.Objects.DataClasses; -using System.Data.Entity.Core.EntityClient; - - - -[assembly: EdmSchema()] -#region EDM Relationship Metadata -[assembly: EdmRelationshipAttribute("booksModel", "fk_authors_myBooks", "myauthors", System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.One, typeof(MySql.Data.Entity.Tests.myauthor), "mybooks", System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(MySql.Data.Entity.Tests.mybook), true)] -[assembly: EdmRelationshipAttribute("booksModel", "myeditionsinmybooks", "mybooks", System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(MySql.Data.Entity.Tests.mybook), "myeditions", System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(MySql.Data.Entity.Tests.myedition))] -#endregion - -namespace MySql.Data.Entity.Tests -{ - #region Contexts - - /// - /// No Metadata Documentation available. - /// - public partial class mybooksEntities : ObjectContext - { - #region Constructors - - /// - /// Initializes a new mybooksEntities object using the connection string found in the 'mybooksEntities' section of the application configuration file. - /// - public mybooksEntities() : base("name=mybooksEntities", "mybooksEntities") - { - this.ContextOptions.LazyLoadingEnabled = true; - OnContextCreated(); - } - - /// - /// Initialize a new mybooksEntities object. - /// - public mybooksEntities(string connectionString) : base(connectionString, "mybooksEntities") - { - this.ContextOptions.LazyLoadingEnabled = true; - OnContextCreated(); - } - - /// - /// Initialize a new mybooksEntities object. - /// - public mybooksEntities(EntityConnection connection) : base(connection, "mybooksEntities") - { - this.ContextOptions.LazyLoadingEnabled = true; - OnContextCreated(); - } - - #endregion - - #region Partial Methods - - partial void OnContextCreated(); - - #endregion - - #region ObjectSet Properties - - /// - /// No Metadata Documentation available. - /// - public ObjectSet myauthors - { - get - { - if ((_myauthors == null)) - { - _myauthors = base.CreateObjectSet("myauthors"); - } - return _myauthors; - } - } - private ObjectSet _myauthors; - - /// - /// No Metadata Documentation available. - /// - public ObjectSet mybooks - { - get - { - if ((_mybooks == null)) - { - _mybooks = base.CreateObjectSet("mybooks"); - } - return _mybooks; - } - } - private ObjectSet _mybooks; - - /// - /// No Metadata Documentation available. - /// - public ObjectSet myeditions - { - get - { - if ((_myeditions == null)) - { - _myeditions = base.CreateObjectSet("myeditions"); - } - return _myeditions; - } - } - private ObjectSet _myeditions; - - #endregion - - #region AddTo Methods - - /// - /// Deprecated Method for adding a new object to the myauthors EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead. - /// - public void AddTomyauthors(myauthor myauthor) - { - base.AddObject("myauthors", myauthor); - } - - /// - /// Deprecated Method for adding a new object to the mybooks EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead. - /// - public void AddTomybooks(mybook mybook) - { - base.AddObject("mybooks", mybook); - } - - /// - /// Deprecated Method for adding a new object to the myeditions EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead. - /// - public void AddTomyeditions(myedition myedition) - { - base.AddObject("myeditions", myedition); - } - - #endregion - - } - - #endregion - - #region Entities - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName = "booksModel", Name = "myauthor")] - [Serializable()] - [DataContractAttribute(IsReference = true)] - public partial class myauthor : EntityObject - { - #region Factory Method - - /// - /// Create a new myauthor object. - /// - /// Initial value of the Id property. - /// Initial value of the Name property. - public static myauthor Createmyauthor(global::System.Int32 id, global::System.String name) - { - myauthor myauthor = new myauthor(); - myauthor.Id = id; - myauthor.Name = name; - return myauthor; - } - - #endregion - - #region Primitive Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)] - [DataMemberAttribute()] - public global::System.Int32 Id - { - get - { - return _Id; - } - set - { - if (_Id != value) - { - OnIdChanging(value); - ReportPropertyChanging("Id"); - _Id = StructuralObject.SetValidValue(value); - ReportPropertyChanged("Id"); - OnIdChanged(); - } - } - } - private global::System.Int32 _Id; - partial void OnIdChanging(global::System.Int32 value); - partial void OnIdChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty = false, IsNullable = false)] - [DataMemberAttribute()] - public global::System.String Name - { - get - { - return _Name; - } - set - { - OnNameChanging(value); - ReportPropertyChanging("Name"); - _Name = StructuralObject.SetValidValue(value, false); - ReportPropertyChanged("Name"); - OnNameChanged(); - } - } - private global::System.String _Name; - partial void OnNameChanging(global::System.String value); - partial void OnNameChanged(); - - #endregion - - - #region Navigation Properties - - /// - /// No Metadata Documentation available. - /// - [XmlIgnoreAttribute()] - [SoapIgnoreAttribute()] - [DataMemberAttribute()] - [EdmRelationshipNavigationPropertyAttribute("booksModel", "fk_authors_myBooks", "mybooks")] - public EntityCollection mybooks - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection("booksModel.fk_authors_myBooks", "mybooks"); - } - set - { - if ((value != null)) - { - ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection("booksModel.fk_authors_myBooks", "mybooks", value); - } - } - } - - #endregion - - } - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName = "booksModel", Name = "mybook")] - [Serializable()] - [DataContractAttribute(IsReference = true)] - public partial class mybook : EntityObject - { - #region Factory Method - - /// - /// Create a new mybook object. - /// - /// Initial value of the Id property. - /// Initial value of the AuthorId property. - public static mybook Createmybook(global::System.Int32 id, global::System.Int32 authorId) - { - mybook mybook = new mybook(); - mybook.Id = id; - mybook.AuthorId = authorId; - return mybook; - } - - #endregion - - #region Primitive Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)] - [DataMemberAttribute()] - public global::System.Int32 Id - { - get - { - return _Id; - } - set - { - if (_Id != value) - { - OnIdChanging(value); - ReportPropertyChanging("Id"); - _Id = StructuralObject.SetValidValue(value); - ReportPropertyChanged("Id"); - OnIdChanged(); - } - } - } - private global::System.Int32 _Id; - partial void OnIdChanging(global::System.Int32 value); - partial void OnIdChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty = false, IsNullable = false)] - [DataMemberAttribute()] - public global::System.Int32 AuthorId - { - get - { - return _AuthorId; - } - set - { - OnAuthorIdChanging(value); - ReportPropertyChanging("AuthorId"); - _AuthorId = StructuralObject.SetValidValue(value); - ReportPropertyChanged("AuthorId"); - OnAuthorIdChanged(); - } - } - private global::System.Int32 _AuthorId; - partial void OnAuthorIdChanging(global::System.Int32 value); - partial void OnAuthorIdChanged(); - - #endregion - - - #region Navigation Properties - - /// - /// No Metadata Documentation available. - /// - [XmlIgnoreAttribute()] - [SoapIgnoreAttribute()] - [DataMemberAttribute()] - [EdmRelationshipNavigationPropertyAttribute("booksModel", "fk_authors_myBooks", "myauthors")] - public myauthor myauthor - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("booksModel.fk_authors_myBooks", "myauthors").Value; - } - set - { - ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("booksModel.fk_authors_myBooks", "myauthors").Value = value; - } - } - /// - /// No Metadata Documentation available. - /// - [BrowsableAttribute(false)] - [DataMemberAttribute()] - public EntityReference myauthorReference - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("booksModel.fk_authors_myBooks", "myauthors"); - } - set - { - if ((value != null)) - { - ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference("booksModel.fk_authors_myBooks", "myauthors", value); - } - } - } - - /// - /// No Metadata Documentation available. - /// - [XmlIgnoreAttribute()] - [SoapIgnoreAttribute()] - [DataMemberAttribute()] - [EdmRelationshipNavigationPropertyAttribute("booksModel", "myeditionsinmybooks", "myeditions")] - public EntityCollection myeditions - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection("booksModel.myeditionsinmybooks", "myeditions"); - } - set - { - if ((value != null)) - { - ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection("booksModel.myeditionsinmybooks", "myeditions", value); - } - } - } - - #endregion - - } - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName = "booksModel", Name = "myedition")] - [Serializable()] - [DataContractAttribute(IsReference = true)] - public partial class myedition : EntityObject - { - #region Factory Method - - /// - /// Create a new myedition object. - /// - /// Initial value of the Id property. - /// Initial value of the Title property. - public static myedition Createmyedition(global::System.Int32 id, global::System.String title) - { - myedition myedition = new myedition(); - myedition.Id = id; - myedition.Title = title; - return myedition; - } - - #endregion - - #region Primitive Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)] - [DataMemberAttribute()] - public global::System.Int32 Id - { - get - { - return _Id; - } - set - { - if (_Id != value) - { - OnIdChanging(value); - ReportPropertyChanging("Id"); - _Id = StructuralObject.SetValidValue(value); - ReportPropertyChanged("Id"); - OnIdChanged(); - } - } - } - private global::System.Int32 _Id; - partial void OnIdChanging(global::System.Int32 value); - partial void OnIdChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty = false, IsNullable = false)] - [DataMemberAttribute()] - public global::System.String Title - { - get - { - return _Title; - } - set - { - OnTitleChanging(value); - ReportPropertyChanging("Title"); - _Title = StructuralObject.SetValidValue(value, false); - ReportPropertyChanged("Title"); - OnTitleChanged(); - } - } - private global::System.String _Title; - partial void OnTitleChanging(global::System.String value); - partial void OnTitleChanged(); - - #endregion - - - #region Navigation Properties - - /// - /// No Metadata Documentation available. - /// - [XmlIgnoreAttribute()] - [SoapIgnoreAttribute()] - [DataMemberAttribute()] - [EdmRelationshipNavigationPropertyAttribute("booksModel", "myeditionsinmybooks", "mybooks")] - public EntityCollection mybooks - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection("booksModel.myeditionsinmybooks", "mybooks"); - } - set - { - if ((value != null)) - { - ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection("booksModel.myeditionsinmybooks", "mybooks", value); - } - } - } - - #endregion - - } - - #endregion - -} diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Models/BooksModel.edmx b/Tests/MySql.EntityFramework6.Basic.Tests/Models/BooksModel.edmx deleted file mode 100644 index 40944afb1..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Models/BooksModel.edmx +++ /dev/null @@ -1,212 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Models/DatesTypesModel.Designer.cs b/Tests/MySql.EntityFramework6.Basic.Tests/Models/DatesTypesModel.Designer.cs deleted file mode 100644 index debe71a9a..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Models/DatesTypesModel.Designer.cs +++ /dev/null @@ -1,268 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated from a template. -// -// Manual changes to this file may cause unexpected behavior in your application. -// Manual changes to this file will be overwritten if the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.ComponentModel; -using System.Linq; -using System.Runtime.Serialization; -using System.Xml.Serialization; -using System.Data.Entity.Core.Objects; -using System.Data.Entity.Core.Objects.DataClasses; -using System.Data.Entity.Core.EntityClient; - -[assembly: EdmSchemaAttribute()] -namespace MySql.Data.Entity.Tests.v4.x -{ - #region Contexts - - /// - /// No Metadata Documentation available. - /// - public partial class datesTypesEntities : ObjectContext - { - #region Constructors - - /// - /// Initializes a new datesTypesEntities object using the connection string found in the 'datesTypesEntities' section of the application configuration file. - /// - public datesTypesEntities() : base("name=datesTypesEntities", "datesTypesEntities") - { - this.ContextOptions.LazyLoadingEnabled = true; - OnContextCreated(); - } - - /// - /// Initialize a new datesTypesEntities object. - /// - public datesTypesEntities(string connectionString) : base(connectionString, "datesTypesEntities") - { - this.ContextOptions.LazyLoadingEnabled = true; - OnContextCreated(); - } - - /// - /// Initialize a new datesTypesEntities object. - /// - public datesTypesEntities(EntityConnection connection) : base(connection, "datesTypesEntities") - { - this.ContextOptions.LazyLoadingEnabled = true; - OnContextCreated(); - } - - #endregion - - #region Partial Methods - - partial void OnContextCreated(); - - #endregion - - #region ObjectSet Properties - - /// - /// No Metadata Documentation available. - /// - public ObjectSet products - { - get - { - if ((_products == null)) - { - _products = base.CreateObjectSet("products"); - } - return _products; - } - } - private ObjectSet _products; - - #endregion - - #region AddTo Methods - - /// - /// Deprecated Method for adding a new object to the products EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead. - /// - public void AddToproducts(product product) - { - base.AddObject("products", product); - } - - #endregion - - } - - #endregion - - #region Entities - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="test_datestypesModel", Name="product")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - public partial class product : EntityObject - { - #region Factory Method - - /// - /// Create a new product object. - /// - /// Initial value of the Id property. - /// Initial value of the DateCreated property. - /// Initial value of the Timestamp property. - /// Initial value of the DateTimeWithPrecision property. - /// Initial value of the TimeStampWithPrecision property. - public static product Createproduct(global::System.Int32 id, global::System.DateTime dateCreated, global::System.DateTime timestamp, global::System.DateTime dateTimeWithPrecision, global::System.DateTime timeStampWithPrecision) - { - product product = new product(); - product.Id = id; - product.DateCreated = dateCreated; - product.Timestamp = timestamp; - product.DateTimeWithPrecision = dateTimeWithPrecision; - product.TimeStampWithPrecision = timeStampWithPrecision; - return product; - } - - #endregion - - #region Primitive Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int32 Id - { - get - { - return _Id; - } - set - { - if (_Id != value) - { - OnIdChanging(value); - ReportPropertyChanging("Id"); - _Id = StructuralObject.SetValidValue(value); - ReportPropertyChanged("Id"); - OnIdChanged(); - } - } - } - private global::System.Int32 _Id; - partial void OnIdChanging(global::System.Int32 value); - partial void OnIdChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.DateTime DateCreated - { - get - { - return _DateCreated; - } - set - { - OnDateCreatedChanging(value); - ReportPropertyChanging("DateCreated"); - _DateCreated = StructuralObject.SetValidValue(value); - ReportPropertyChanged("DateCreated"); - OnDateCreatedChanged(); - } - } - private global::System.DateTime _DateCreated; - partial void OnDateCreatedChanging(global::System.DateTime value); - partial void OnDateCreatedChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.DateTime Timestamp - { - get - { - return _Timestamp; - } - set - { - OnTimestampChanging(value); - ReportPropertyChanging("Timestamp"); - _Timestamp = StructuralObject.SetValidValue(value); - ReportPropertyChanged("Timestamp"); - OnTimestampChanged(); - } - } - private global::System.DateTime _Timestamp; - partial void OnTimestampChanging(global::System.DateTime value); - partial void OnTimestampChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.DateTime DateTimeWithPrecision - { - get - { - return _DateTimeWithPrecision; - } - set - { - OnDateTimeWithPrecisionChanging(value); - ReportPropertyChanging("DateTimeWithPrecision"); - _DateTimeWithPrecision = StructuralObject.SetValidValue(value); - ReportPropertyChanged("DateTimeWithPrecision"); - OnDateTimeWithPrecisionChanged(); - } - } - private global::System.DateTime _DateTimeWithPrecision; - partial void OnDateTimeWithPrecisionChanging(global::System.DateTime value); - partial void OnDateTimeWithPrecisionChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.DateTime TimeStampWithPrecision - { - get - { - return _TimeStampWithPrecision; - } - set - { - OnTimeStampWithPrecisionChanging(value); - ReportPropertyChanging("TimeStampWithPrecision"); - _TimeStampWithPrecision = StructuralObject.SetValidValue(value); - ReportPropertyChanged("TimeStampWithPrecision"); - OnTimeStampWithPrecisionChanged(); - } - } - private global::System.DateTime _TimeStampWithPrecision; - partial void OnTimeStampWithPrecisionChanging(global::System.DateTime value); - partial void OnTimeStampWithPrecisionChanged(); - - #endregion - - - } - - #endregion - - -} diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Models/DatesTypesModel.edmx b/Tests/MySql.EntityFramework6.Basic.Tests/Models/DatesTypesModel.edmx deleted file mode 100644 index bd246e591..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Models/DatesTypesModel.edmx +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Models/Model1.Designer.cs b/Tests/MySql.EntityFramework6.Basic.Tests/Models/Model1.Designer.cs deleted file mode 100644 index c540f314f..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Models/Model1.Designer.cs +++ /dev/null @@ -1,291 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated from a template. -// -// Manual changes to this file may cause unexpected behavior in your application. -// Manual changes to this file will be overwritten if the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.ComponentModel; -using System.Data.Entity.Core.Objects; -using System.Data.Entity.Core.Objects.DataClasses; -using System.Data.Entity.Core.EntityClient; -using System.Linq; -using System.Runtime.Serialization; -using System.Xml.Serialization; - -[assembly: EdmSchemaAttribute()] -namespace MySql.Data.Entity.Tests -{ - #region Contexts - - /// - /// No Metadata Documentation available. - /// - public partial class Model1Container : ObjectContext - { - #region Constructors - - /// - /// Initializes a new Model1Container object using the connection string found in the 'Model1Container' section of the application configuration file. - /// - public Model1Container() : base("name=Model1Container", "Model1Container") - { - OnContextCreated(); - } - - /// - /// Initialize a new Model1Container object. - /// - public Model1Container(string connectionString) : base(connectionString, "Model1Container") - { - OnContextCreated(); - } - - /// - /// Initialize a new Model1Container object. - /// - public Model1Container(EntityConnection connection) : base(connection, "Model1Container") - { - OnContextCreated(); - } - - #endregion - - #region Partial Methods - - partial void OnContextCreated(); - - #endregion - - #region ObjectSet Properties - - /// - /// No Metadata Documentation available. - /// - public ObjectSet Animals - { - get - { - if ((_Animals == null)) - { - _Animals = base.CreateObjectSet("Animals"); - } - return _Animals; - } - } - private ObjectSet _Animals; - - /// - /// No Metadata Documentation available. - /// - public ObjectSet Shelters - { - get - { - if ((_Shelters == null)) - { - _Shelters = base.CreateObjectSet("Shelters"); - } - return _Shelters; - } - } - private ObjectSet _Shelters; - - #endregion - - #region AddTo Methods - - /// - /// Deprecated Method for adding a new object to the Animals EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead. - /// - public void AddToAnimals(Animal animal) - { - base.AddObject("Animals", animal); - } - - /// - /// Deprecated Method for adding a new object to the Shelters EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead. - /// - public void AddToShelters(Shelter shelter) - { - base.AddObject("Shelters", shelter); - } - - #endregion - - } - - #endregion - - #region Entities - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="Model1", Name="Animal")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - public partial class Animal : EntityObject - { - #region Factory Method - - /// - /// Create a new Animal object. - /// - /// Initial value of the Id property. - /// Initial value of the Name property. - /// Initial value of the ShelterId property. - public static Animal CreateAnimal(global::System.Int32 id, global::System.String name, global::System.Int32 shelterId) - { - Animal animal = new Animal(); - animal.Id = id; - animal.Name = name; - animal.ShelterId = shelterId; - return animal; - } - - #endregion - - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int32 Id - { - get - { - return _Id; - } - set - { - if (_Id != value) - { - OnIdChanging(value); - ReportPropertyChanging("Id"); - _Id = StructuralObject.SetValidValue(value, "Id"); - ReportPropertyChanged("Id"); - OnIdChanged(); - } - } - } - private global::System.Int32 _Id; - partial void OnIdChanging(global::System.Int32 value); - partial void OnIdChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.String Name - { - get - { - return _Name; - } - set - { - OnNameChanging(value); - ReportPropertyChanging("Name"); - _Name = StructuralObject.SetValidValue(value, false, "Name"); - ReportPropertyChanged("Name"); - OnNameChanged(); - } - } - private global::System.String _Name; - partial void OnNameChanging(global::System.String value); - partial void OnNameChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int32 ShelterId - { - get - { - return _ShelterId; - } - set - { - OnShelterIdChanging(value); - ReportPropertyChanging("ShelterId"); - _ShelterId = StructuralObject.SetValidValue(value, "ShelterId"); - ReportPropertyChanged("ShelterId"); - OnShelterIdChanged(); - } - } - private global::System.Int32 _ShelterId; - partial void OnShelterIdChanging(global::System.Int32 value); - partial void OnShelterIdChanged(); - - #endregion - - } - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="Model1", Name="Shelter")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - public partial class Shelter : EntityObject - { - #region Factory Method - - /// - /// Create a new Shelter object. - /// - /// Initial value of the Id property. - public static Shelter CreateShelter(global::System.Int32 id) - { - Shelter shelter = new Shelter(); - shelter.Id = id; - return shelter; - } - - #endregion - - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int32 Id - { - get - { - return _Id; - } - set - { - if (_Id != value) - { - OnIdChanging(value); - ReportPropertyChanging("Id"); - _Id = StructuralObject.SetValidValue(value, "Id"); - ReportPropertyChanged("Id"); - OnIdChanged(); - } - } - } - private global::System.Int32 _Id; - partial void OnIdChanging(global::System.Int32 value); - partial void OnIdChanged(); - - #endregion - - } - - #endregion - -} diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Models/Model1.edmx b/Tests/MySql.EntityFramework6.Basic.Tests/Models/Model1.edmx deleted file mode 100644 index 9d810afe8..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Models/Model1.edmx +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Models/Model2.Designer.cs b/Tests/MySql.EntityFramework6.Basic.Tests/Models/Model2.Designer.cs deleted file mode 100644 index a6c375d6b..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Models/Model2.Designer.cs +++ /dev/null @@ -1,365 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated from a template. -// -// Manual changes to this file may cause unexpected behavior in your application. -// Manual changes to this file will be overwritten if the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.ComponentModel; -using System.Linq; -using System.Runtime.Serialization; -using System.Xml.Serialization; -using System.Data.Entity.Core.Objects; -using System.Data.Entity.Core.Objects.DataClasses; -using System.Data.Entity.Core.EntityClient; - -[assembly: EdmSchemaAttribute()] -#region EDM Relationship Metadata - -[assembly: global::System.Data.Entity.Core.Objects.DataClasses.EdmSchemaAttribute()] -[assembly: global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipAttribute("juliotestsModel", "FK_ORDER_CUSTOMER", "customer", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.ZeroOrOne, typeof(MySql.Data.Entity.Tests.customer), "order", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(MySql.Data.Entity.Tests.order))] - - -#endregion - -namespace MySql.Data.Entity.Tests -{ - #region Contexts - - /// - /// No Metadata Documentation available. - /// - public partial class model2Entities : ObjectContext - { - #region Constructors - - /// - /// Initializes a new model2Entities object using the connection string found in the 'model2Entities' section of the application configuration file. - /// - public model2Entities() : base("name=model2Entities", "model2Entities") - { - OnContextCreated(); - } - - /// - /// Initialize a new model2Entities object. - /// - public model2Entities(string connectionString) : base(connectionString, "model2Entities") - { - OnContextCreated(); - } - - /// - /// Initialize a new model2Entities object. - /// - public model2Entities(EntityConnection connection) : base(connection, "model2Entities") - { - OnContextCreated(); - } - - #endregion - - #region Partial Methods - - partial void OnContextCreated(); - - #endregion - - #region ObjectSet Properties - - /// - /// No Metadata Documentation available. - /// - public ObjectSet customer - { - get - { - if ((_customer == null)) - { - _customer = base.CreateObjectSet("customer"); - } - return _customer; - } - } - private ObjectSet _customer; - - /// - /// No Metadata Documentation available. - /// - public ObjectSet order - { - get - { - if ((_order == null)) - { - _order = base.CreateObjectSet("order"); - } - return _order; - } - } - private ObjectSet _order; - - #endregion - - #region AddTo Methods - - /// - /// Deprecated Method for adding a new object to the customer EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead. - /// - public void AddTocustomer(customer customer) - { - base.AddObject("customer", customer); - } - - /// - /// Deprecated Method for adding a new object to the order EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead. - /// - public void AddToorder(order order) - { - base.AddObject("order", order); - } - - #endregion - - } - - #endregion - - #region Entities - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="juliotestsModel", Name="customer")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - public partial class customer : EntityObject - { - #region Factory Method - - /// - /// Create a new customer object. - /// - /// Initial value of the Id property. - public static customer Createcustomer(global::System.Int32 id) - { - customer customer = new customer(); - customer.Id = id; - return customer; - } - - #endregion - - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int32 Id - { - get - { - return _Id; - } - set - { - if (_Id != value) - { - OnIdChanging(value); - ReportPropertyChanging("Id"); - _Id = StructuralObject.SetValidValue(value, "Id"); - ReportPropertyChanged("Id"); - OnIdChanged(); - } - } - } - private global::System.Int32 _Id; - partial void OnIdChanging(global::System.Int32 value); - partial void OnIdChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public global::System.String Name - { - get - { - return _Name; - } - set - { - OnNameChanging(value); - ReportPropertyChanging("Name"); - _Name = StructuralObject.SetValidValue(value, true, "Name"); - ReportPropertyChanged("Name"); - OnNameChanged(); - } - } - private global::System.String _Name; - partial void OnNameChanging(global::System.String value); - partial void OnNameChanged(); - - #endregion - - #region Navigation Properties - - /// - /// No Metadata Documentation available. - /// - [XmlIgnoreAttribute()] - [SoapIgnoreAttribute()] - [DataMemberAttribute()] - [EdmRelationshipNavigationPropertyAttribute("juliotestsModel", "FK_ORDER_CUSTOMER", "order")] - public EntityCollection order - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection("juliotestsModel.FK_ORDER_CUSTOMER", "order"); - } - set - { - if ((value != null)) - { - ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection("juliotestsModel.FK_ORDER_CUSTOMER", "order", value); - } - } - } - - #endregion - - } - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="juliotestsModel", Name="order")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - public partial class order : EntityObject - { - #region Factory Method - - /// - /// Create a new order object. - /// - /// Initial value of the Id property. - /// Initial value of the Order_Date property. - public static order Createorder(global::System.Int32 id, global::System.DateTime order_Date) - { - order order = new order(); - order.Id = id; - order.Order_Date = order_Date; - return order; - } - - #endregion - - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int32 Id - { - get - { - return _Id; - } - set - { - if (_Id != value) - { - OnIdChanging(value); - ReportPropertyChanging("Id"); - _Id = StructuralObject.SetValidValue(value, "Id"); - ReportPropertyChanged("Id"); - OnIdChanged(); - } - } - } - private global::System.Int32 _Id; - partial void OnIdChanging(global::System.Int32 value); - partial void OnIdChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.DateTime Order_Date - { - get - { - return _Order_Date; - } - set - { - OnOrder_DateChanging(value); - ReportPropertyChanging("Order_Date"); - _Order_Date = StructuralObject.SetValidValue(value, "Order_Date"); - ReportPropertyChanged("Order_Date"); - OnOrder_DateChanged(); - } - } - private global::System.DateTime _Order_Date; - partial void OnOrder_DateChanging(global::System.DateTime value); - partial void OnOrder_DateChanged(); - - #endregion - - #region Navigation Properties - - /// - /// No Metadata Documentation available. - /// - [XmlIgnoreAttribute()] - [SoapIgnoreAttribute()] - [DataMemberAttribute()] - [EdmRelationshipNavigationPropertyAttribute("juliotestsModel", "FK_ORDER_CUSTOMER", "customer")] - public customer customer - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("juliotestsModel.FK_ORDER_CUSTOMER", "customer").Value; - } - set - { - ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("juliotestsModel.FK_ORDER_CUSTOMER", "customer").Value = value; - } - } - /// - /// No Metadata Documentation available. - /// - [BrowsableAttribute(false)] - [DataMemberAttribute()] - public EntityReference customerReference - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("juliotestsModel.FK_ORDER_CUSTOMER", "customer"); - } - set - { - if ((value != null)) - { - ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference("juliotestsModel.FK_ORDER_CUSTOMER", "customer", value); - } - } - } - - #endregion - - } - - #endregion - -} diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Models/Model2.edmx b/Tests/MySql.EntityFramework6.Basic.Tests/Models/Model2.edmx deleted file mode 100644 index e40c7aa66..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Models/Model2.edmx +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Models/Model3.Designer.cs b/Tests/MySql.EntityFramework6.Basic.Tests/Models/Model3.Designer.cs deleted file mode 100644 index 408ae16b9..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Models/Model3.Designer.cs +++ /dev/null @@ -1,734 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated from a template. -// -// Manual changes to this file may cause unexpected behavior in your application. -// Manual changes to this file will be overwritten if the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.ComponentModel; -using System.Linq; -using System.Runtime.Serialization; -using System.Xml.Serialization; -using System.Data.Entity.Core.Objects; -using System.Data.Entity.Core.Objects.DataClasses; -using System.Data.Entity.Core.EntityClient; - -[assembly: EdmSchemaAttribute()] -#region EDM Relationship Metadata -[assembly: global::System.Data.Entity.Core.Objects.DataClasses.EdmSchemaAttribute()] -[assembly: global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipAttribute("testModel1", "fk_VideoGamePlatform_Platform", "gamingplatform", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.One, typeof(MySql.Data.Entity.Tests.gamingplatform), "videogameplatform", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(MySql.Data.Entity.Tests.videogameplatform))] -[assembly: global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipAttribute("testModel1", "fk_VideoGamePlatform_VideoGameTitle", "videogametitle", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.One, typeof(MySql.Data.Entity.Tests.videogametitle), "videogameplatform", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(MySql.Data.Entity.Tests.videogameplatform))] -#endregion - -namespace MySql.Data.Entity.Tests -{ - #region Contexts - - /// - /// No Metadata Documentation available. - /// - public partial class testEntities1 : ObjectContext - { - #region Constructors - - /// - /// Initializes a new testEntities1 object using the connection string found in the 'testEntities1' section of the application configuration file. - /// - public testEntities1() : base("name=testEntities1", "testEntities1") - { - OnContextCreated(); - } - - /// - /// Initialize a new testEntities1 object. - /// - public testEntities1(string connectionString) : base(connectionString, "testEntities1") - { - OnContextCreated(); - } - - /// - /// Initialize a new testEntities1 object. - /// - public testEntities1(EntityConnection connection) : base(connection, "testEntities1") - { - OnContextCreated(); - } - - #endregion - - #region Partial Methods - - partial void OnContextCreated(); - - #endregion - - #region ObjectSet Properties - - /// - /// No Metadata Documentation available. - /// - public ObjectSet gamingplatform - { - get - { - if ((_gamingplatform == null)) - { - _gamingplatform = base.CreateObjectSet("gamingplatform"); - } - return _gamingplatform; - } - } - private ObjectSet _gamingplatform; - - /// - /// No Metadata Documentation available. - /// - public ObjectSet videogameplatform - { - get - { - if ((_videogameplatform == null)) - { - _videogameplatform = base.CreateObjectSet("videogameplatform"); - } - return _videogameplatform; - } - } - private ObjectSet _videogameplatform; - - /// - /// No Metadata Documentation available. - /// - public ObjectSet videogametitle - { - get - { - if ((_videogametitle == null)) - { - _videogametitle = base.CreateObjectSet("videogametitle"); - } - return _videogametitle; - } - } - private ObjectSet _videogametitle; - - /// - /// No Metadata Documentation available. - /// - public ObjectSet vivideogametitle - { - get - { - if ((_vivideogametitle == null)) - { - _vivideogametitle = base.CreateObjectSet("vivideogametitle"); - } - return _vivideogametitle; - } - } - private ObjectSet _vivideogametitle; - - #endregion - - #region AddTo Methods - - /// - /// Deprecated Method for adding a new object to the gamingplatform EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead. - /// - public void AddTogamingplatform(gamingplatform gamingplatform) - { - base.AddObject("gamingplatform", gamingplatform); - } - - /// - /// Deprecated Method for adding a new object to the videogameplatform EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead. - /// - public void AddTovideogameplatform(videogameplatform videogameplatform) - { - base.AddObject("videogameplatform", videogameplatform); - } - - /// - /// Deprecated Method for adding a new object to the videogametitle EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead. - /// - public void AddTovideogametitle(videogametitle videogametitle) - { - base.AddObject("videogametitle", videogametitle); - } - - /// - /// Deprecated Method for adding a new object to the vivideogametitle EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead. - /// - public void AddTovivideogametitle(vivideogametitle vivideogametitle) - { - base.AddObject("vivideogametitle", vivideogametitle); - } - - #endregion - - } - - #endregion - - #region Entities - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="testModel1", Name="gamingplatform")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - public partial class gamingplatform : EntityObject - { - #region Factory Method - - /// - /// Create a new gamingplatform object. - /// - /// Initial value of the Id property. - public static gamingplatform Creategamingplatform(global::System.SByte id) - { - gamingplatform gamingplatform = new gamingplatform(); - gamingplatform.Id = id; - return gamingplatform; - } - - #endregion - - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] - [DataMemberAttribute()] - public global::System.SByte Id - { - get - { - return _Id; - } - set - { - if (_Id != value) - { - OnIdChanging(value); - ReportPropertyChanging("Id"); - _Id = StructuralObject.SetValidValue(value, "Id"); - ReportPropertyChanged("Id"); - OnIdChanged(); - } - } - } - private global::System.SByte _Id; - partial void OnIdChanging(global::System.SByte value); - partial void OnIdChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public global::System.String Name - { - get - { - return _Name; - } - set - { - OnNameChanging(value); - ReportPropertyChanging("Name"); - _Name = StructuralObject.SetValidValue(value, true, "Name"); - ReportPropertyChanged("Name"); - OnNameChanged(); - } - } - private global::System.String _Name; - partial void OnNameChanging(global::System.String value); - partial void OnNameChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public global::System.String Developer - { - get - { - return _Developer; - } - set - { - OnDeveloperChanging(value); - ReportPropertyChanging("Developer"); - _Developer = StructuralObject.SetValidValue(value, true, "Developer"); - ReportPropertyChanged("Developer"); - OnDeveloperChanged(); - } - } - private global::System.String _Developer; - partial void OnDeveloperChanging(global::System.String value); - partial void OnDeveloperChanged(); - - #endregion - - #region Navigation Properties - - /// - /// No Metadata Documentation available. - /// - [XmlIgnoreAttribute()] - [SoapIgnoreAttribute()] - [DataMemberAttribute()] - [EdmRelationshipNavigationPropertyAttribute("testModel1", "fk_VideoGamePlatform_Platform", "videogameplatform")] - public EntityCollection videogameplatform - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection("testModel1.fk_VideoGamePlatform_Platform", "videogameplatform"); - } - set - { - if ((value != null)) - { - ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection("testModel1.fk_VideoGamePlatform_Platform", "videogameplatform", value); - } - } - } - - #endregion - - } - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="testModel1", Name="videogameplatform")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - public partial class videogameplatform : EntityObject - { - #region Factory Method - - /// - /// Create a new videogameplatform object. - /// - /// Initial value of the IdGamingPlatform property. - /// Initial value of the IdVideoGameTitle property. - public static videogameplatform Createvideogameplatform(global::System.SByte idGamingPlatform, global::System.Int32 idVideoGameTitle) - { - videogameplatform videogameplatform = new videogameplatform(); - videogameplatform.IdGamingPlatform = idGamingPlatform; - videogameplatform.IdVideoGameTitle = idVideoGameTitle; - return videogameplatform; - } - - #endregion - - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] - [DataMemberAttribute()] - public global::System.SByte IdGamingPlatform - { - get - { - return _IdGamingPlatform; - } - set - { - if (_IdGamingPlatform != value) - { - OnIdGamingPlatformChanging(value); - ReportPropertyChanging("IdGamingPlatform"); - _IdGamingPlatform = StructuralObject.SetValidValue(value, "IdGamingPlatform"); - ReportPropertyChanged("IdGamingPlatform"); - OnIdGamingPlatformChanged(); - } - } - } - private global::System.SByte _IdGamingPlatform; - partial void OnIdGamingPlatformChanging(global::System.SByte value); - partial void OnIdGamingPlatformChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int32 IdVideoGameTitle - { - get - { - return _IdVideoGameTitle; - } - set - { - if (_IdVideoGameTitle != value) - { - OnIdVideoGameTitleChanging(value); - ReportPropertyChanging("IdVideoGameTitle"); - _IdVideoGameTitle = StructuralObject.SetValidValue(value, "IdVideoGameTitle"); - ReportPropertyChanged("IdVideoGameTitle"); - OnIdVideoGameTitleChanged(); - } - } - } - private global::System.Int32 _IdVideoGameTitle; - partial void OnIdVideoGameTitleChanging(global::System.Int32 value); - partial void OnIdVideoGameTitleChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public global::System.String Category - { - get - { - return _Category; - } - set - { - OnCategoryChanging(value); - ReportPropertyChanging("Category"); - _Category = StructuralObject.SetValidValue(value, true, "Category"); - ReportPropertyChanged("Category"); - OnCategoryChanged(); - } - } - private global::System.String _Category; - partial void OnCategoryChanging(global::System.String value); - partial void OnCategoryChanged(); - - #endregion - - #region Navigation Properties - - /// - /// No Metadata Documentation available. - /// - [XmlIgnoreAttribute()] - [SoapIgnoreAttribute()] - [DataMemberAttribute()] - [EdmRelationshipNavigationPropertyAttribute("testModel1", "fk_VideoGamePlatform_Platform", "gamingplatform")] - public gamingplatform gamingplatform - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("testModel1.fk_VideoGamePlatform_Platform", "gamingplatform").Value; - } - set - { - ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("testModel1.fk_VideoGamePlatform_Platform", "gamingplatform").Value = value; - } - } - /// - /// No Metadata Documentation available. - /// - [BrowsableAttribute(false)] - [DataMemberAttribute()] - public EntityReference gamingplatformReference - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("testModel1.fk_VideoGamePlatform_Platform", "gamingplatform"); - } - set - { - if ((value != null)) - { - ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference("testModel1.fk_VideoGamePlatform_Platform", "gamingplatform", value); - } - } - } - - /// - /// No Metadata Documentation available. - /// - [XmlIgnoreAttribute()] - [SoapIgnoreAttribute()] - [DataMemberAttribute()] - [EdmRelationshipNavigationPropertyAttribute("testModel1", "fk_VideoGamePlatform_VideoGameTitle", "videogametitle")] - public videogametitle videogametitle - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("testModel1.fk_VideoGamePlatform_VideoGameTitle", "videogametitle").Value; - } - set - { - ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("testModel1.fk_VideoGamePlatform_VideoGameTitle", "videogametitle").Value = value; - } - } - /// - /// No Metadata Documentation available. - /// - [BrowsableAttribute(false)] - [DataMemberAttribute()] - public EntityReference videogametitleReference - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("testModel1.fk_VideoGamePlatform_VideoGameTitle", "videogametitle"); - } - set - { - if ((value != null)) - { - ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference("testModel1.fk_VideoGamePlatform_VideoGameTitle", "videogametitle", value); - } - } - } - - #endregion - - } - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="testModel1", Name="videogametitle")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - public partial class videogametitle : EntityObject - { - #region Factory Method - - /// - /// Create a new videogametitle object. - /// - /// Initial value of the Id property. - public static videogametitle Createvideogametitle(global::System.Int32 id) - { - videogametitle videogametitle = new videogametitle(); - videogametitle.Id = id; - return videogametitle; - } - - #endregion - - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int32 Id - { - get - { - return _Id; - } - set - { - if (_Id != value) - { - OnIdChanging(value); - ReportPropertyChanging("Id"); - _Id = StructuralObject.SetValidValue(value, "Id"); - ReportPropertyChanged("Id"); - OnIdChanged(); - } - } - } - private global::System.Int32 _Id; - partial void OnIdChanging(global::System.Int32 value); - partial void OnIdChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public global::System.String Name - { - get - { - return _Name; - } - set - { - OnNameChanging(value); - ReportPropertyChanging("Name"); - _Name = StructuralObject.SetValidValue(value, true, "Name"); - ReportPropertyChanged("Name"); - OnNameChanged(); - } - } - private global::System.String _Name; - partial void OnNameChanging(global::System.String value); - partial void OnNameChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public global::System.String Developer - { - get - { - return _Developer; - } - set - { - OnDeveloperChanging(value); - ReportPropertyChanging("Developer"); - _Developer = StructuralObject.SetValidValue(value, true, "Developer"); - ReportPropertyChanged("Developer"); - OnDeveloperChanged(); - } - } - private global::System.String _Developer; - partial void OnDeveloperChanging(global::System.String value); - partial void OnDeveloperChanged(); - - #endregion - - #region Navigation Properties - - /// - /// No Metadata Documentation available. - /// - [XmlIgnoreAttribute()] - [SoapIgnoreAttribute()] - [DataMemberAttribute()] - [EdmRelationshipNavigationPropertyAttribute("testModel1", "fk_VideoGamePlatform_VideoGameTitle", "videogameplatform")] - public EntityCollection videogameplatform - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection("testModel1.fk_VideoGamePlatform_VideoGameTitle", "videogameplatform"); - } - set - { - if ((value != null)) - { - ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection("testModel1.fk_VideoGamePlatform_VideoGameTitle", "videogameplatform", value); - } - } - } - - #endregion - - } - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="testModel1", Name="vivideogametitle")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - public partial class vivideogametitle : EntityObject - { - #region Factory Method - - /// - /// Create a new vivideogametitle object. - /// - /// Initial value of the Id property. - public static vivideogametitle Createvivideogametitle(global::System.Int32 id) - { - vivideogametitle vivideogametitle = new vivideogametitle(); - vivideogametitle.Id = id; - return vivideogametitle; - } - - #endregion - - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int32 Id - { - get - { - return _Id; - } - set - { - if (_Id != value) - { - OnIdChanging(value); - ReportPropertyChanging("Id"); - _Id = StructuralObject.SetValidValue(value, "Id"); - ReportPropertyChanged("Id"); - OnIdChanged(); - } - } - } - private global::System.Int32 _Id; - partial void OnIdChanging(global::System.Int32 value); - partial void OnIdChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public global::System.String Name - { - get - { - return _Name; - } - set - { - OnNameChanging(value); - ReportPropertyChanging("Name"); - _Name = StructuralObject.SetValidValue(value, true, "Name"); - ReportPropertyChanged("Name"); - OnNameChanged(); - } - } - private global::System.String _Name; - partial void OnNameChanging(global::System.String value); - partial void OnNameChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public global::System.String Developer - { - get - { - return _Developer; - } - set - { - OnDeveloperChanging(value); - ReportPropertyChanging("Developer"); - _Developer = StructuralObject.SetValidValue(value, true, "Developer"); - ReportPropertyChanged("Developer"); - OnDeveloperChanged(); - } - } - private global::System.String _Developer; - partial void OnDeveloperChanging(global::System.String value); - partial void OnDeveloperChanged(); - - #endregion - - } - - #endregion - -} diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Models/Model3.edmx b/Tests/MySql.EntityFramework6.Basic.Tests/Models/Model3.edmx deleted file mode 100644 index e7bfcfb52..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Models/Model3.edmx +++ /dev/null @@ -1,263 +0,0 @@ - - - - - - - - - - - - - SELECT -`vivideogametitle`.`Id`, -`vivideogametitle`.`Name`, -`vivideogametitle`.`Developer` -FROM `vivideogametitle` AS `vivideogametitle` - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Models/ModelFirstModel1.Designer.cs b/Tests/MySql.EntityFramework6.Basic.Tests/Models/ModelFirstModel1.Designer.cs deleted file mode 100644 index 0920a4e3b..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Models/ModelFirstModel1.Designer.cs +++ /dev/null @@ -1,395 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated from a template. -// -// Manual changes to this file may cause unexpected behavior in your application. -// Manual changes to this file will be overwritten if the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.ComponentModel; -using System.Linq; -using System.Runtime.Serialization; -using System.Xml.Serialization; -using System.Data.Entity.Core.EntityClient; -using System.Data.Entity.Core.Objects; -using System.Data.Entity.Core.Objects.DataClasses; - - -[assembly: EdmSchemaAttribute()] -#region EDM Relationship Metadata - -[assembly: EdmRelationshipAttribute("ModelFirstModel1", "StudentKardex", "Student", System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.One, typeof(MySql.Data.Entity.Tests.Student), "Kardex", System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(MySql.Data.Entity.Tests.Kardex), true)] - -#endregion - -namespace MySql.Data.Entity.Tests -{ - #region Contexts - - /// - /// No Metadata Documentation available. - /// - public partial class ModelFirstModel1Container : ObjectContext - { - #region Constructors - - /// - /// Initializes a new ModelFirstModel1Container object using the connection string found in the 'ModelFirstModel1Container' section of the application configuration file. - /// - public ModelFirstModel1Container() : base("name=ModelFirstModel1Container", "ModelFirstModel1Container") - { - this.ContextOptions.LazyLoadingEnabled = true; - OnContextCreated(); - } - - /// - /// Initialize a new ModelFirstModel1Container object. - /// - public ModelFirstModel1Container(string connectionString) : base(connectionString, "ModelFirstModel1Container") - { - this.ContextOptions.LazyLoadingEnabled = true; - OnContextCreated(); - } - - /// - /// Initialize a new ModelFirstModel1Container object. - /// - public ModelFirstModel1Container(EntityConnection connection) : base(connection, "ModelFirstModel1Container") - { - this.ContextOptions.LazyLoadingEnabled = true; - OnContextCreated(); - } - - #endregion - - #region Partial Methods - - partial void OnContextCreated(); - - #endregion - - #region ObjectSet Properties - - /// - /// No Metadata Documentation available. - /// - public ObjectSet Students - { - get - { - if ((_Students == null)) - { - _Students = base.CreateObjectSet("Students"); - } - return _Students; - } - } - private ObjectSet _Students; - - /// - /// No Metadata Documentation available. - /// - public ObjectSet Kardexes - { - get - { - if ((_Kardexes == null)) - { - _Kardexes = base.CreateObjectSet("Kardexes"); - } - return _Kardexes; - } - } - private ObjectSet _Kardexes; - - #endregion - - #region AddTo Methods - - /// - /// Deprecated Method for adding a new object to the Students EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead. - /// - public void AddToStudents(Student student) - { - base.AddObject("Students", student); - } - - /// - /// Deprecated Method for adding a new object to the Kardexes EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead. - /// - public void AddToKardexes(Kardex kardex) - { - base.AddObject("Kardexes", kardex); - } - - #endregion - - } - - #endregion - - #region Entities - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="ModelFirstModel1", Name="Kardex")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - public partial class Kardex : EntityObject - { - #region Factory Method - - /// - /// Create a new Kardex object. - /// - /// Initial value of the Id property. - /// Initial value of the StudentId property. - /// Initial value of the Score property. - public static Kardex CreateKardex(global::System.Int32 id, global::System.Int32 studentId, global::System.Double score) - { - Kardex kardex = new Kardex(); - kardex.Id = id; - kardex.StudentId = studentId; - kardex.Score = score; - return kardex; - } - - #endregion - - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int32 Id - { - get - { - return _Id; - } - set - { - if (_Id != value) - { - OnIdChanging(value); - ReportPropertyChanging("Id"); - _Id = StructuralObject.SetValidValue(value, "Id"); - ReportPropertyChanged("Id"); - OnIdChanged(); - } - } - } - private global::System.Int32 _Id; - partial void OnIdChanging(global::System.Int32 value); - partial void OnIdChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int32 StudentId - { - get - { - return _StudentId; - } - set - { - OnStudentIdChanging(value); - ReportPropertyChanging("StudentId"); - _StudentId = StructuralObject.SetValidValue(value, "StudentId"); - ReportPropertyChanged("StudentId"); - OnStudentIdChanged(); - } - } - private global::System.Int32 _StudentId; - partial void OnStudentIdChanging(global::System.Int32 value); - partial void OnStudentIdChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Double Score - { - get - { - return _Score; - } - set - { - OnScoreChanging(value); - ReportPropertyChanging("Score"); - _Score = StructuralObject.SetValidValue(value, "Score"); - ReportPropertyChanged("Score"); - OnScoreChanged(); - } - } - private global::System.Double _Score; - partial void OnScoreChanging(global::System.Double value); - partial void OnScoreChanged(); - - #endregion - - #region Navigation Properties - - /// - /// No Metadata Documentation available. - /// - [XmlIgnoreAttribute()] - [SoapIgnoreAttribute()] - [DataMemberAttribute()] - [EdmRelationshipNavigationPropertyAttribute("ModelFirstModel1", "StudentKardex", "Student")] - public Student Student - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("ModelFirstModel1.StudentKardex", "Student").Value; - } - set - { - ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("ModelFirstModel1.StudentKardex", "Student").Value = value; - } - } - /// - /// No Metadata Documentation available. - /// - [BrowsableAttribute(false)] - [DataMemberAttribute()] - public EntityReference StudentReference - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("ModelFirstModel1.StudentKardex", "Student"); - } - set - { - if ((value != null)) - { - ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference("ModelFirstModel1.StudentKardex", "Student", value); - } - } - } - - #endregion - - } - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="ModelFirstModel1", Name="Student")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - public partial class Student : EntityObject - { - #region Factory Method - - /// - /// Create a new Student object. - /// - /// Initial value of the Id property. - /// Initial value of the Name property. - public static Student CreateStudent(global::System.Int32 id, global::System.String name) - { - Student student = new Student(); - student.Id = id; - student.Name = name; - return student; - } - - #endregion - - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int32 Id - { - get - { - return _Id; - } - set - { - if (_Id != value) - { - OnIdChanging(value); - ReportPropertyChanging("Id"); - _Id = StructuralObject.SetValidValue(value, "Id"); - ReportPropertyChanged("Id"); - OnIdChanged(); - } - } - } - private global::System.Int32 _Id; - partial void OnIdChanging(global::System.Int32 value); - partial void OnIdChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.String Name - { - get - { - return _Name; - } - set - { - OnNameChanging(value); - ReportPropertyChanging("Name"); - _Name = StructuralObject.SetValidValue(value, false, "Name"); - ReportPropertyChanged("Name"); - OnNameChanged(); - } - } - private global::System.String _Name; - partial void OnNameChanging(global::System.String value); - partial void OnNameChanged(); - - #endregion - - #region Navigation Properties - - /// - /// No Metadata Documentation available. - /// - [XmlIgnoreAttribute()] - [SoapIgnoreAttribute()] - [DataMemberAttribute()] - [EdmRelationshipNavigationPropertyAttribute("ModelFirstModel1", "StudentKardex", "Kardex")] - public EntityCollection Kardexes - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection("ModelFirstModel1.StudentKardex", "Kardex"); - } - set - { - if ((value != null)) - { - ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection("ModelFirstModel1.StudentKardex", "Kardex", value); - } - } - } - - #endregion - - } - - #endregion - -} diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Models/ModelFirstModel1.edmx b/Tests/MySql.EntityFramework6.Basic.Tests/Models/ModelFirstModel1.edmx deleted file mode 100644 index a9322a80d..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Models/ModelFirstModel1.edmx +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Models/ReservedWordColumnName.Context.cs b/Tests/MySql.EntityFramework6.Basic.Tests/Models/ReservedWordColumnName.Context.cs deleted file mode 100644 index 521ed4e3a..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Models/ReservedWordColumnName.Context.cs +++ /dev/null @@ -1,30 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated from a template. -// -// Manual changes to this file may cause unexpected behavior in your application. -// Manual changes to this file will be overwritten if the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace MySql.Data.Entity.Tests -{ - using System; - using System.Data.Entity; - using System.Data.Entity.Infrastructure; - - public partial class ReservedWordColumnNameContainer : DbContext - { - public ReservedWordColumnNameContainer() - : base("name=ReservedWordColumnNameContainer") - { - } - - protected override void OnModelCreating(DbModelBuilder modelBuilder) - { - throw new UnintentionalCodeFirstException(); - } - - public virtual DbSet new_table { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Models/ReservedWordColumnName.Context.tt b/Tests/MySql.EntityFramework6.Basic.Tests/Models/ReservedWordColumnName.Context.tt deleted file mode 100644 index 8f545901a..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Models/ReservedWordColumnName.Context.tt +++ /dev/null @@ -1,636 +0,0 @@ -<#@ template language="C#" debug="false" hostspecific="true"#> -<#@ include file="EF6.Utility.CS.ttinclude"#><#@ - output extension=".cs"#><# - -const string inputFile = @"ReservedWordColumnName.edmx"; -var textTransform = DynamicTextTransformation.Create(this); -var code = new CodeGenerationTools(this); -var ef = new MetadataTools(this); -var typeMapper = new TypeMapper(code, ef, textTransform.Errors); -var loader = new EdmMetadataLoader(textTransform.Host, textTransform.Errors); -var itemCollection = loader.CreateEdmItemCollection(inputFile); -var modelNamespace = loader.GetModelNamespace(inputFile); -var codeStringGenerator = new CodeStringGenerator(code, typeMapper, ef); - -var container = itemCollection.OfType().FirstOrDefault(); -if (container == null) -{ - return string.Empty; -} -#> -//------------------------------------------------------------------------------ -// -// <#=CodeGenerationTools.GetResourceString("Template_GeneratedCodeCommentLine1")#> -// -// <#=CodeGenerationTools.GetResourceString("Template_GeneratedCodeCommentLine2")#> -// <#=CodeGenerationTools.GetResourceString("Template_GeneratedCodeCommentLine3")#> -// -//------------------------------------------------------------------------------ - -<# - -var codeNamespace = code.VsNamespaceSuggestion(); -if (!String.IsNullOrEmpty(codeNamespace)) -{ -#> -namespace <#=code.EscapeNamespace(codeNamespace)#> -{ -<# - PushIndent(" "); -} - -#> -using System; -using System.Data.Entity; -using System.Data.Entity.Infrastructure; -<# -if (container.FunctionImports.Any()) -{ -#> -using System.Data.Entity.Core.Objects; -using System.Linq; -<# -} -#> - -<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#> : DbContext -{ - public <#=code.Escape(container)#>() - : base("name=<#=container.Name#>") - { -<# -if (!loader.IsLazyLoadingEnabled(container)) -{ -#> - this.Configuration.LazyLoadingEnabled = false; -<# -} - -foreach (var entitySet in container.BaseEntitySets.OfType()) -{ - // Note: the DbSet members are defined below such that the getter and - // setter always have the same accessibility as the DbSet definition - if (Accessibility.ForReadOnlyProperty(entitySet) != "public") - { -#> - <#=codeStringGenerator.DbSetInitializer(entitySet)#> -<# - } -} -#> - } - - protected override void OnModelCreating(DbModelBuilder modelBuilder) - { - throw new UnintentionalCodeFirstException(); - } - -<# - foreach (var entitySet in container.BaseEntitySets.OfType()) - { -#> - <#=codeStringGenerator.DbSet(entitySet)#> -<# - } - - foreach (var edmFunction in container.FunctionImports) - { - WriteFunctionImport(typeMapper, codeStringGenerator, edmFunction, modelNamespace, includeMergeOption: false); - } -#> -} -<# - -if (!String.IsNullOrEmpty(codeNamespace)) -{ - PopIndent(); -#> -} -<# -} -#> -<#+ - -private void WriteFunctionImport(TypeMapper typeMapper, CodeStringGenerator codeStringGenerator, EdmFunction edmFunction, string modelNamespace, bool includeMergeOption) -{ - if (typeMapper.IsComposable(edmFunction)) - { -#> - - [DbFunction("<#=edmFunction.NamespaceName#>", "<#=edmFunction.Name#>")] - <#=codeStringGenerator.ComposableFunctionMethod(edmFunction, modelNamespace)#> - { -<#+ - codeStringGenerator.WriteFunctionParameters(edmFunction, WriteFunctionParameter); -#> - <#=codeStringGenerator.ComposableCreateQuery(edmFunction, modelNamespace)#> - } -<#+ - } - else - { -#> - - <#=codeStringGenerator.FunctionMethod(edmFunction, modelNamespace, includeMergeOption)#> - { -<#+ - codeStringGenerator.WriteFunctionParameters(edmFunction, WriteFunctionParameter); -#> - <#=codeStringGenerator.ExecuteFunction(edmFunction, modelNamespace, includeMergeOption)#> - } -<#+ - if (typeMapper.GenerateMergeOptionFunction(edmFunction, includeMergeOption)) - { - WriteFunctionImport(typeMapper, codeStringGenerator, edmFunction, modelNamespace, includeMergeOption: true); - } - } -} - -public void WriteFunctionParameter(string name, string isNotNull, string notNullInit, string nullInit) -{ -#> - var <#=name#> = <#=isNotNull#> ? - <#=notNullInit#> : - <#=nullInit#>; - -<#+ -} - -public const string TemplateId = "CSharp_DbContext_Context_EF6"; - -public class CodeStringGenerator -{ - private readonly CodeGenerationTools _code; - private readonly TypeMapper _typeMapper; - private readonly MetadataTools _ef; - - public CodeStringGenerator(CodeGenerationTools code, TypeMapper typeMapper, MetadataTools ef) - { - ArgumentNotNull(code, "code"); - ArgumentNotNull(typeMapper, "typeMapper"); - ArgumentNotNull(ef, "ef"); - - _code = code; - _typeMapper = typeMapper; - _ef = ef; - } - - public string Property(EdmProperty edmProperty) - { - return string.Format( - CultureInfo.InvariantCulture, - "{0} {1} {2} {{ {3}get; {4}set; }}", - Accessibility.ForProperty(edmProperty), - _typeMapper.GetTypeName(edmProperty.TypeUsage), - _code.Escape(edmProperty), - _code.SpaceAfter(Accessibility.ForGetter(edmProperty)), - _code.SpaceAfter(Accessibility.ForSetter(edmProperty))); - } - - public string NavigationProperty(NavigationProperty navProp) - { - var endType = _typeMapper.GetTypeName(navProp.ToEndMember.GetEntityType()); - return string.Format( - CultureInfo.InvariantCulture, - "{0} {1} {2} {{ {3}get; {4}set; }}", - AccessibilityAndVirtual(Accessibility.ForNavigationProperty(navProp)), - navProp.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType, - _code.Escape(navProp), - _code.SpaceAfter(Accessibility.ForGetter(navProp)), - _code.SpaceAfter(Accessibility.ForSetter(navProp))); - } - - public string AccessibilityAndVirtual(string accessibility) - { - return accessibility + (accessibility != "private" ? " virtual" : ""); - } - - public string EntityClassOpening(EntityType entity) - { - return string.Format( - CultureInfo.InvariantCulture, - "{0} {1}partial class {2}{3}", - Accessibility.ForType(entity), - _code.SpaceAfter(_code.AbstractOption(entity)), - _code.Escape(entity), - _code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType))); - } - - public string EnumOpening(SimpleType enumType) - { - return string.Format( - CultureInfo.InvariantCulture, - "{0} enum {1} : {2}", - Accessibility.ForType(enumType), - _code.Escape(enumType), - _code.Escape(_typeMapper.UnderlyingClrType(enumType))); - } - - public void WriteFunctionParameters(EdmFunction edmFunction, Action writeParameter) - { - var parameters = FunctionImportParameter.Create(edmFunction.Parameters, _code, _ef); - foreach (var parameter in parameters.Where(p => p.NeedsLocalVariable)) - { - var isNotNull = parameter.IsNullableOfT ? parameter.FunctionParameterName + ".HasValue" : parameter.FunctionParameterName + " != null"; - var notNullInit = "new ObjectParameter(\"" + parameter.EsqlParameterName + "\", " + parameter.FunctionParameterName + ")"; - var nullInit = "new ObjectParameter(\"" + parameter.EsqlParameterName + "\", typeof(" + TypeMapper.FixNamespaces(parameter.RawClrTypeName) + "))"; - writeParameter(parameter.LocalVariableName, isNotNull, notNullInit, nullInit); - } - } - - public string ComposableFunctionMethod(EdmFunction edmFunction, string modelNamespace) - { - var parameters = _typeMapper.GetParameters(edmFunction); - - return string.Format( - CultureInfo.InvariantCulture, - "{0} IQueryable<{1}> {2}({3})", - AccessibilityAndVirtual(Accessibility.ForMethod(edmFunction)), - _typeMapper.GetTypeName(_typeMapper.GetReturnType(edmFunction), modelNamespace), - _code.Escape(edmFunction), - string.Join(", ", parameters.Select(p => TypeMapper.FixNamespaces(p.FunctionParameterType) + " " + p.FunctionParameterName).ToArray())); - } - - public string ComposableCreateQuery(EdmFunction edmFunction, string modelNamespace) - { - var parameters = _typeMapper.GetParameters(edmFunction); - - return string.Format( - CultureInfo.InvariantCulture, - "return ((IObjectContextAdapter)this).ObjectContext.CreateQuery<{0}>(\"[{1}].[{2}]({3})\"{4});", - _typeMapper.GetTypeName(_typeMapper.GetReturnType(edmFunction), modelNamespace), - edmFunction.NamespaceName, - edmFunction.Name, - string.Join(", ", parameters.Select(p => "@" + p.EsqlParameterName).ToArray()), - _code.StringBefore(", ", string.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray()))); - } - - public string FunctionMethod(EdmFunction edmFunction, string modelNamespace, bool includeMergeOption) - { - var parameters = _typeMapper.GetParameters(edmFunction); - var returnType = _typeMapper.GetReturnType(edmFunction); - - var paramList = String.Join(", ", parameters.Select(p => TypeMapper.FixNamespaces(p.FunctionParameterType) + " " + p.FunctionParameterName).ToArray()); - if (includeMergeOption) - { - paramList = _code.StringAfter(paramList, ", ") + "MergeOption mergeOption"; - } - - return string.Format( - CultureInfo.InvariantCulture, - "{0} {1} {2}({3})", - AccessibilityAndVirtual(Accessibility.ForMethod(edmFunction)), - returnType == null ? "int" : "ObjectResult<" + _typeMapper.GetTypeName(returnType, modelNamespace) + ">", - _code.Escape(edmFunction), - paramList); - } - - public string ExecuteFunction(EdmFunction edmFunction, string modelNamespace, bool includeMergeOption) - { - var parameters = _typeMapper.GetParameters(edmFunction); - var returnType = _typeMapper.GetReturnType(edmFunction); - - var callParams = _code.StringBefore(", ", String.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray())); - if (includeMergeOption) - { - callParams = ", mergeOption" + callParams; - } - - return string.Format( - CultureInfo.InvariantCulture, - "return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction{0}(\"{1}\"{2});", - returnType == null ? "" : "<" + _typeMapper.GetTypeName(returnType, modelNamespace) + ">", - edmFunction.Name, - callParams); - } - - public string DbSet(EntitySet entitySet) - { - return string.Format( - CultureInfo.InvariantCulture, - "{0} virtual DbSet<{1}> {2} {{ get; set; }}", - Accessibility.ForReadOnlyProperty(entitySet), - _typeMapper.GetTypeName(entitySet.ElementType), - _code.Escape(entitySet)); - } - - public string DbSetInitializer(EntitySet entitySet) - { - return string.Format( - CultureInfo.InvariantCulture, - "{0} = Set<{1}>();", - _code.Escape(entitySet), - _typeMapper.GetTypeName(entitySet.ElementType)); - } - - public string UsingDirectives(bool inHeader, bool includeCollections = true) - { - return inHeader == string.IsNullOrEmpty(_code.VsNamespaceSuggestion()) - ? string.Format( - CultureInfo.InvariantCulture, - "{0}using System;{1}" + - "{2}", - inHeader ? Environment.NewLine : "", - includeCollections ? (Environment.NewLine + "using System.Collections.Generic;") : "", - inHeader ? "" : Environment.NewLine) - : ""; - } -} - -public class TypeMapper -{ - private const string ExternalTypeNameAttributeName = @"http://schemas.microsoft.com/ado/2006/04/codegeneration:ExternalTypeName"; - - private readonly System.Collections.IList _errors; - private readonly CodeGenerationTools _code; - private readonly MetadataTools _ef; - - public static string FixNamespaces(string typeName) - { - return typeName.Replace("System.Data.Spatial.", "System.Data.Entity.Spatial."); - } - - public TypeMapper(CodeGenerationTools code, MetadataTools ef, System.Collections.IList errors) - { - ArgumentNotNull(code, "code"); - ArgumentNotNull(ef, "ef"); - ArgumentNotNull(errors, "errors"); - - _code = code; - _ef = ef; - _errors = errors; - } - - public string GetTypeName(TypeUsage typeUsage) - { - return typeUsage == null ? null : GetTypeName(typeUsage.EdmType, _ef.IsNullable(typeUsage), modelNamespace: null); - } - - public string GetTypeName(EdmType edmType) - { - return GetTypeName(edmType, isNullable: null, modelNamespace: null); - } - - public string GetTypeName(TypeUsage typeUsage, string modelNamespace) - { - return typeUsage == null ? null : GetTypeName(typeUsage.EdmType, _ef.IsNullable(typeUsage), modelNamespace); - } - - public string GetTypeName(EdmType edmType, string modelNamespace) - { - return GetTypeName(edmType, isNullable: null, modelNamespace: modelNamespace); - } - - public string GetTypeName(EdmType edmType, bool? isNullable, string modelNamespace) - { - if (edmType == null) - { - return null; - } - - var collectionType = edmType as CollectionType; - if (collectionType != null) - { - return String.Format(CultureInfo.InvariantCulture, "ICollection<{0}>", GetTypeName(collectionType.TypeUsage, modelNamespace)); - } - - var typeName = _code.Escape(edmType.MetadataProperties - .Where(p => p.Name == ExternalTypeNameAttributeName) - .Select(p => (string)p.Value) - .FirstOrDefault()) - ?? (modelNamespace != null && edmType.NamespaceName != modelNamespace ? - _code.CreateFullName(_code.EscapeNamespace(edmType.NamespaceName), _code.Escape(edmType)) : - _code.Escape(edmType)); - - if (edmType is StructuralType) - { - return typeName; - } - - if (edmType is SimpleType) - { - var clrType = UnderlyingClrType(edmType); - if (!IsEnumType(edmType)) - { - typeName = _code.Escape(clrType); - } - - typeName = FixNamespaces(typeName); - - return clrType.IsValueType && isNullable == true ? - String.Format(CultureInfo.InvariantCulture, "Nullable<{0}>", typeName) : - typeName; - } - - throw new ArgumentException("edmType"); - } - - public Type UnderlyingClrType(EdmType edmType) - { - ArgumentNotNull(edmType, "edmType"); - - var primitiveType = edmType as PrimitiveType; - if (primitiveType != null) - { - return primitiveType.ClrEquivalentType; - } - - if (IsEnumType(edmType)) - { - return GetEnumUnderlyingType(edmType).ClrEquivalentType; - } - - return typeof(object); - } - - public object GetEnumMemberValue(MetadataItem enumMember) - { - ArgumentNotNull(enumMember, "enumMember"); - - var valueProperty = enumMember.GetType().GetProperty("Value"); - return valueProperty == null ? null : valueProperty.GetValue(enumMember, null); - } - - public string GetEnumMemberName(MetadataItem enumMember) - { - ArgumentNotNull(enumMember, "enumMember"); - - var nameProperty = enumMember.GetType().GetProperty("Name"); - return nameProperty == null ? null : (string)nameProperty.GetValue(enumMember, null); - } - - public System.Collections.IEnumerable GetEnumMembers(EdmType enumType) - { - ArgumentNotNull(enumType, "enumType"); - - var membersProperty = enumType.GetType().GetProperty("Members"); - return membersProperty != null - ? (System.Collections.IEnumerable)membersProperty.GetValue(enumType, null) - : Enumerable.Empty(); - } - - public bool EnumIsFlags(EdmType enumType) - { - ArgumentNotNull(enumType, "enumType"); - - var isFlagsProperty = enumType.GetType().GetProperty("IsFlags"); - return isFlagsProperty != null && (bool)isFlagsProperty.GetValue(enumType, null); - } - - public bool IsEnumType(GlobalItem edmType) - { - ArgumentNotNull(edmType, "edmType"); - - return edmType.GetType().Name == "EnumType"; - } - - public PrimitiveType GetEnumUnderlyingType(EdmType enumType) - { - ArgumentNotNull(enumType, "enumType"); - - return (PrimitiveType)enumType.GetType().GetProperty("UnderlyingType").GetValue(enumType, null); - } - - public string CreateLiteral(object value) - { - if (value == null || value.GetType() != typeof(TimeSpan)) - { - return _code.CreateLiteral(value); - } - - return string.Format(CultureInfo.InvariantCulture, "new TimeSpan({0})", ((TimeSpan)value).Ticks); - } - - public bool VerifyCaseInsensitiveTypeUniqueness(IEnumerable types, string sourceFile) - { - ArgumentNotNull(types, "types"); - ArgumentNotNull(sourceFile, "sourceFile"); - - var hash = new HashSet(StringComparer.InvariantCultureIgnoreCase); - if (types.Any(item => !hash.Add(item))) - { - _errors.Add( - new CompilerError(sourceFile, -1, -1, "6023", - String.Format(CultureInfo.CurrentCulture, CodeGenerationTools.GetResourceString("Template_CaseInsensitiveTypeConflict")))); - return false; - } - return true; - } - - public IEnumerable GetEnumItemsToGenerate(IEnumerable itemCollection) - { - return GetItemsToGenerate(itemCollection) - .Where(e => IsEnumType(e)); - } - - public IEnumerable GetItemsToGenerate(IEnumerable itemCollection) where T: EdmType - { - return itemCollection - .OfType() - .Where(i => !i.MetadataProperties.Any(p => p.Name == ExternalTypeNameAttributeName)) - .OrderBy(i => i.Name); - } - - public IEnumerable GetAllGlobalItems(IEnumerable itemCollection) - { - return itemCollection - .Where(i => i is EntityType || i is ComplexType || i is EntityContainer || IsEnumType(i)) - .Select(g => GetGlobalItemName(g)); - } - - public string GetGlobalItemName(GlobalItem item) - { - if (item is EdmType) - { - return ((EdmType)item).Name; - } - else - { - return ((EntityContainer)item).Name; - } - } - - public IEnumerable GetSimpleProperties(EntityType type) - { - return type.Properties.Where(p => p.TypeUsage.EdmType is SimpleType && p.DeclaringType == type); - } - - public IEnumerable GetSimpleProperties(ComplexType type) - { - return type.Properties.Where(p => p.TypeUsage.EdmType is SimpleType && p.DeclaringType == type); - } - - public IEnumerable GetComplexProperties(EntityType type) - { - return type.Properties.Where(p => p.TypeUsage.EdmType is ComplexType && p.DeclaringType == type); - } - - public IEnumerable GetComplexProperties(ComplexType type) - { - return type.Properties.Where(p => p.TypeUsage.EdmType is ComplexType && p.DeclaringType == type); - } - - public IEnumerable GetPropertiesWithDefaultValues(EntityType type) - { - return type.Properties.Where(p => p.TypeUsage.EdmType is SimpleType && p.DeclaringType == type && p.DefaultValue != null); - } - - public IEnumerable GetPropertiesWithDefaultValues(ComplexType type) - { - return type.Properties.Where(p => p.TypeUsage.EdmType is SimpleType && p.DeclaringType == type && p.DefaultValue != null); - } - - public IEnumerable GetNavigationProperties(EntityType type) - { - return type.NavigationProperties.Where(np => np.DeclaringType == type); - } - - public IEnumerable GetCollectionNavigationProperties(EntityType type) - { - return type.NavigationProperties.Where(np => np.DeclaringType == type && np.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many); - } - - public FunctionParameter GetReturnParameter(EdmFunction edmFunction) - { - ArgumentNotNull(edmFunction, "edmFunction"); - - var returnParamsProperty = edmFunction.GetType().GetProperty("ReturnParameters"); - return returnParamsProperty == null - ? edmFunction.ReturnParameter - : ((IEnumerable)returnParamsProperty.GetValue(edmFunction, null)).FirstOrDefault(); - } - - public bool IsComposable(EdmFunction edmFunction) - { - ArgumentNotNull(edmFunction, "edmFunction"); - - var isComposableProperty = edmFunction.GetType().GetProperty("IsComposableAttribute"); - return isComposableProperty != null && (bool)isComposableProperty.GetValue(edmFunction, null); - } - - public IEnumerable GetParameters(EdmFunction edmFunction) - { - return FunctionImportParameter.Create(edmFunction.Parameters, _code, _ef); - } - - public TypeUsage GetReturnType(EdmFunction edmFunction) - { - var returnParam = GetReturnParameter(edmFunction); - return returnParam == null ? null : _ef.GetElementType(returnParam.TypeUsage); - } - - public bool GenerateMergeOptionFunction(EdmFunction edmFunction, bool includeMergeOption) - { - var returnType = GetReturnType(edmFunction); - return !includeMergeOption && returnType != null && returnType.EdmType.BuiltInTypeKind == BuiltInTypeKind.EntityType; - } -} - -public static void ArgumentNotNull(T arg, string name) where T : class -{ - if (arg == null) - { - throw new ArgumentNullException(name); - } -} -#> \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Models/ReservedWordColumnName.Designer.cs b/Tests/MySql.EntityFramework6.Basic.Tests/Models/ReservedWordColumnName.Designer.cs deleted file mode 100644 index 6444c3826..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Models/ReservedWordColumnName.Designer.cs +++ /dev/null @@ -1,10 +0,0 @@ -// T4 code generation is enabled for model 'C:\Wex\cnet 67\Tests\MySql.EntityFramework6.Basic.Tests\v4.x\ReservedWordColumnName.edmx'. -// To enable legacy code generation, change the value of the 'Code Generation Strategy' designer -// property to 'Legacy ObjectContext'. This property is available in the Properties Window when the model -// is open in the designer. - -// If no context and entity classes have been generated, it may be because you created an empty model but -// have not yet chosen which version of Entity Framework to use. To generate a context class and entity -// classes for your model, open the model in the designer, right-click on the designer surface, and -// select 'Update Model from Database...', 'Generate Database from Model...', or 'Add Code Generation -// Item...'. \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Models/ReservedWordColumnName.cs b/Tests/MySql.EntityFramework6.Basic.Tests/Models/ReservedWordColumnName.cs deleted file mode 100644 index 7cc066228..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Models/ReservedWordColumnName.cs +++ /dev/null @@ -1,9 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated from a template. -// -// Manual changes to this file may cause unexpected behavior in your application. -// Manual changes to this file will be overwritten if the code is regenerated. -// -//------------------------------------------------------------------------------ - diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Models/ReservedWordColumnName.edmx b/Tests/MySql.EntityFramework6.Basic.Tests/Models/ReservedWordColumnName.edmx deleted file mode 100644 index c972408ad..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Models/ReservedWordColumnName.edmx +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Models/ReservedWordColumnName.edmx.diagram b/Tests/MySql.EntityFramework6.Basic.Tests/Models/ReservedWordColumnName.edmx.diagram deleted file mode 100644 index b7e3bfd91..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Models/ReservedWordColumnName.edmx.diagram +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Models/ReservedWordColumnName.tt b/Tests/MySql.EntityFramework6.Basic.Tests/Models/ReservedWordColumnName.tt deleted file mode 100644 index a82767096..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Models/ReservedWordColumnName.tt +++ /dev/null @@ -1,733 +0,0 @@ -<#@ template language="C#" debug="false" hostspecific="true"#> -<#@ include file="EF6.Utility.CS.ttinclude"#><#@ - output extension=".cs"#><# - -const string inputFile = @"ReservedWordColumnName.edmx"; -var textTransform = DynamicTextTransformation.Create(this); -var code = new CodeGenerationTools(this); -var ef = new MetadataTools(this); -var typeMapper = new TypeMapper(code, ef, textTransform.Errors); -var fileManager = EntityFrameworkTemplateFileManager.Create(this); -var itemCollection = new EdmMetadataLoader(textTransform.Host, textTransform.Errors).CreateEdmItemCollection(inputFile); -var codeStringGenerator = new CodeStringGenerator(code, typeMapper, ef); - -if (!typeMapper.VerifyCaseInsensitiveTypeUniqueness(typeMapper.GetAllGlobalItems(itemCollection), inputFile)) -{ - return string.Empty; -} - -WriteHeader(codeStringGenerator, fileManager); - -foreach (var entity in typeMapper.GetItemsToGenerate(itemCollection)) -{ - fileManager.StartNewFile(entity.Name + ".cs"); - BeginNamespace(code); -#> -<#=codeStringGenerator.UsingDirectives(inHeader: false)#> -<#=codeStringGenerator.EntityClassOpening(entity)#> -{ -<# - var propertiesWithDefaultValues = typeMapper.GetPropertiesWithDefaultValues(entity); - var collectionNavigationProperties = typeMapper.GetCollectionNavigationProperties(entity); - var complexProperties = typeMapper.GetComplexProperties(entity); - - if (propertiesWithDefaultValues.Any() || collectionNavigationProperties.Any() || complexProperties.Any()) - { -#> - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] - public <#=code.Escape(entity)#>() - { -<# - foreach (var edmProperty in propertiesWithDefaultValues) - { -#> - this.<#=code.Escape(edmProperty)#> = <#=typeMapper.CreateLiteral(edmProperty.DefaultValue)#>; -<# - } - - foreach (var navigationProperty in collectionNavigationProperties) - { -#> - this.<#=code.Escape(navigationProperty)#> = new HashSet<<#=typeMapper.GetTypeName(navigationProperty.ToEndMember.GetEntityType())#>>(); -<# - } - - foreach (var complexProperty in complexProperties) - { -#> - this.<#=code.Escape(complexProperty)#> = new <#=typeMapper.GetTypeName(complexProperty.TypeUsage)#>(); -<# - } -#> - } - -<# - } - - var simpleProperties = typeMapper.GetSimpleProperties(entity); - if (simpleProperties.Any()) - { - foreach (var edmProperty in simpleProperties) - { -#> - <#=codeStringGenerator.Property(edmProperty)#> -<# - } - } - - if (complexProperties.Any()) - { -#> - -<# - foreach(var complexProperty in complexProperties) - { -#> - <#=codeStringGenerator.Property(complexProperty)#> -<# - } - } - - var navigationProperties = typeMapper.GetNavigationProperties(entity); - if (navigationProperties.Any()) - { -#> - -<# - foreach (var navigationProperty in navigationProperties) - { - if (navigationProperty.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many) - { -#> - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] -<# - } -#> - <#=codeStringGenerator.NavigationProperty(navigationProperty)#> -<# - } - } -#> -} -<# - EndNamespace(code); -} - -foreach (var complex in typeMapper.GetItemsToGenerate(itemCollection)) -{ - fileManager.StartNewFile(complex.Name + ".cs"); - BeginNamespace(code); -#> -<#=codeStringGenerator.UsingDirectives(inHeader: false, includeCollections: false)#> -<#=Accessibility.ForType(complex)#> partial class <#=code.Escape(complex)#> -{ -<# - var complexProperties = typeMapper.GetComplexProperties(complex); - var propertiesWithDefaultValues = typeMapper.GetPropertiesWithDefaultValues(complex); - - if (propertiesWithDefaultValues.Any() || complexProperties.Any()) - { -#> - public <#=code.Escape(complex)#>() - { -<# - foreach (var edmProperty in propertiesWithDefaultValues) - { -#> - this.<#=code.Escape(edmProperty)#> = <#=typeMapper.CreateLiteral(edmProperty.DefaultValue)#>; -<# - } - - foreach (var complexProperty in complexProperties) - { -#> - this.<#=code.Escape(complexProperty)#> = new <#=typeMapper.GetTypeName(complexProperty.TypeUsage)#>(); -<# - } -#> - } - -<# - } - - var simpleProperties = typeMapper.GetSimpleProperties(complex); - if (simpleProperties.Any()) - { - foreach(var edmProperty in simpleProperties) - { -#> - <#=codeStringGenerator.Property(edmProperty)#> -<# - } - } - - if (complexProperties.Any()) - { -#> - -<# - foreach(var edmProperty in complexProperties) - { -#> - <#=codeStringGenerator.Property(edmProperty)#> -<# - } - } -#> -} -<# - EndNamespace(code); -} - -foreach (var enumType in typeMapper.GetEnumItemsToGenerate(itemCollection)) -{ - fileManager.StartNewFile(enumType.Name + ".cs"); - BeginNamespace(code); -#> -<#=codeStringGenerator.UsingDirectives(inHeader: false, includeCollections: false)#> -<# - if (typeMapper.EnumIsFlags(enumType)) - { -#> -[Flags] -<# - } -#> -<#=codeStringGenerator.EnumOpening(enumType)#> -{ -<# - var foundOne = false; - - foreach (MetadataItem member in typeMapper.GetEnumMembers(enumType)) - { - foundOne = true; -#> - <#=code.Escape(typeMapper.GetEnumMemberName(member))#> = <#=typeMapper.GetEnumMemberValue(member)#>, -<# - } - - if (foundOne) - { - this.GenerationEnvironment.Remove(this.GenerationEnvironment.Length - 3, 1); - } -#> -} -<# - EndNamespace(code); -} - -fileManager.Process(); - -#> -<#+ - -public void WriteHeader(CodeStringGenerator codeStringGenerator, EntityFrameworkTemplateFileManager fileManager) -{ - fileManager.StartHeader(); -#> -//------------------------------------------------------------------------------ -// -// <#=CodeGenerationTools.GetResourceString("Template_GeneratedCodeCommentLine1")#> -// -// <#=CodeGenerationTools.GetResourceString("Template_GeneratedCodeCommentLine2")#> -// <#=CodeGenerationTools.GetResourceString("Template_GeneratedCodeCommentLine3")#> -// -//------------------------------------------------------------------------------ -<#=codeStringGenerator.UsingDirectives(inHeader: true)#> -<#+ - fileManager.EndBlock(); -} - -public void BeginNamespace(CodeGenerationTools code) -{ - var codeNamespace = code.VsNamespaceSuggestion(); - if (!String.IsNullOrEmpty(codeNamespace)) - { -#> -namespace <#=code.EscapeNamespace(codeNamespace)#> -{ -<#+ - PushIndent(" "); - } -} - -public void EndNamespace(CodeGenerationTools code) -{ - if (!String.IsNullOrEmpty(code.VsNamespaceSuggestion())) - { - PopIndent(); -#> -} -<#+ - } -} - -public const string TemplateId = "CSharp_DbContext_Types_EF6"; - -public class CodeStringGenerator -{ - private readonly CodeGenerationTools _code; - private readonly TypeMapper _typeMapper; - private readonly MetadataTools _ef; - - public CodeStringGenerator(CodeGenerationTools code, TypeMapper typeMapper, MetadataTools ef) - { - ArgumentNotNull(code, "code"); - ArgumentNotNull(typeMapper, "typeMapper"); - ArgumentNotNull(ef, "ef"); - - _code = code; - _typeMapper = typeMapper; - _ef = ef; - } - - public string Property(EdmProperty edmProperty) - { - return string.Format( - CultureInfo.InvariantCulture, - "{0} {1} {2} {{ {3}get; {4}set; }}", - Accessibility.ForProperty(edmProperty), - _typeMapper.GetTypeName(edmProperty.TypeUsage), - _code.Escape(edmProperty), - _code.SpaceAfter(Accessibility.ForGetter(edmProperty)), - _code.SpaceAfter(Accessibility.ForSetter(edmProperty))); - } - - public string NavigationProperty(NavigationProperty navProp) - { - var endType = _typeMapper.GetTypeName(navProp.ToEndMember.GetEntityType()); - return string.Format( - CultureInfo.InvariantCulture, - "{0} {1} {2} {{ {3}get; {4}set; }}", - AccessibilityAndVirtual(Accessibility.ForNavigationProperty(navProp)), - navProp.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many ? ("ICollection<" + endType + ">") : endType, - _code.Escape(navProp), - _code.SpaceAfter(Accessibility.ForGetter(navProp)), - _code.SpaceAfter(Accessibility.ForSetter(navProp))); - } - - public string AccessibilityAndVirtual(string accessibility) - { - return accessibility + (accessibility != "private" ? " virtual" : ""); - } - - public string EntityClassOpening(EntityType entity) - { - return string.Format( - CultureInfo.InvariantCulture, - "{0} {1}partial class {2}{3}", - Accessibility.ForType(entity), - _code.SpaceAfter(_code.AbstractOption(entity)), - _code.Escape(entity), - _code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType))); - } - - public string EnumOpening(SimpleType enumType) - { - return string.Format( - CultureInfo.InvariantCulture, - "{0} enum {1} : {2}", - Accessibility.ForType(enumType), - _code.Escape(enumType), - _code.Escape(_typeMapper.UnderlyingClrType(enumType))); - } - - public void WriteFunctionParameters(EdmFunction edmFunction, Action writeParameter) - { - var parameters = FunctionImportParameter.Create(edmFunction.Parameters, _code, _ef); - foreach (var parameter in parameters.Where(p => p.NeedsLocalVariable)) - { - var isNotNull = parameter.IsNullableOfT ? parameter.FunctionParameterName + ".HasValue" : parameter.FunctionParameterName + " != null"; - var notNullInit = "new ObjectParameter(\"" + parameter.EsqlParameterName + "\", " + parameter.FunctionParameterName + ")"; - var nullInit = "new ObjectParameter(\"" + parameter.EsqlParameterName + "\", typeof(" + TypeMapper.FixNamespaces(parameter.RawClrTypeName) + "))"; - writeParameter(parameter.LocalVariableName, isNotNull, notNullInit, nullInit); - } - } - - public string ComposableFunctionMethod(EdmFunction edmFunction, string modelNamespace) - { - var parameters = _typeMapper.GetParameters(edmFunction); - - return string.Format( - CultureInfo.InvariantCulture, - "{0} IQueryable<{1}> {2}({3})", - AccessibilityAndVirtual(Accessibility.ForMethod(edmFunction)), - _typeMapper.GetTypeName(_typeMapper.GetReturnType(edmFunction), modelNamespace), - _code.Escape(edmFunction), - string.Join(", ", parameters.Select(p => TypeMapper.FixNamespaces(p.FunctionParameterType) + " " + p.FunctionParameterName).ToArray())); - } - - public string ComposableCreateQuery(EdmFunction edmFunction, string modelNamespace) - { - var parameters = _typeMapper.GetParameters(edmFunction); - - return string.Format( - CultureInfo.InvariantCulture, - "return ((IObjectContextAdapter)this).ObjectContext.CreateQuery<{0}>(\"[{1}].[{2}]({3})\"{4});", - _typeMapper.GetTypeName(_typeMapper.GetReturnType(edmFunction), modelNamespace), - edmFunction.NamespaceName, - edmFunction.Name, - string.Join(", ", parameters.Select(p => "@" + p.EsqlParameterName).ToArray()), - _code.StringBefore(", ", string.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray()))); - } - - public string FunctionMethod(EdmFunction edmFunction, string modelNamespace, bool includeMergeOption) - { - var parameters = _typeMapper.GetParameters(edmFunction); - var returnType = _typeMapper.GetReturnType(edmFunction); - - var paramList = String.Join(", ", parameters.Select(p => TypeMapper.FixNamespaces(p.FunctionParameterType) + " " + p.FunctionParameterName).ToArray()); - if (includeMergeOption) - { - paramList = _code.StringAfter(paramList, ", ") + "MergeOption mergeOption"; - } - - return string.Format( - CultureInfo.InvariantCulture, - "{0} {1} {2}({3})", - AccessibilityAndVirtual(Accessibility.ForMethod(edmFunction)), - returnType == null ? "int" : "ObjectResult<" + _typeMapper.GetTypeName(returnType, modelNamespace) + ">", - _code.Escape(edmFunction), - paramList); - } - - public string ExecuteFunction(EdmFunction edmFunction, string modelNamespace, bool includeMergeOption) - { - var parameters = _typeMapper.GetParameters(edmFunction); - var returnType = _typeMapper.GetReturnType(edmFunction); - - var callParams = _code.StringBefore(", ", String.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray())); - if (includeMergeOption) - { - callParams = ", mergeOption" + callParams; - } - - return string.Format( - CultureInfo.InvariantCulture, - "return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction{0}(\"{1}\"{2});", - returnType == null ? "" : "<" + _typeMapper.GetTypeName(returnType, modelNamespace) + ">", - edmFunction.Name, - callParams); - } - - public string DbSet(EntitySet entitySet) - { - return string.Format( - CultureInfo.InvariantCulture, - "{0} virtual DbSet<{1}> {2} {{ get; set; }}", - Accessibility.ForReadOnlyProperty(entitySet), - _typeMapper.GetTypeName(entitySet.ElementType), - _code.Escape(entitySet)); - } - - public string UsingDirectives(bool inHeader, bool includeCollections = true) - { - return inHeader == string.IsNullOrEmpty(_code.VsNamespaceSuggestion()) - ? string.Format( - CultureInfo.InvariantCulture, - "{0}using System;{1}" + - "{2}", - inHeader ? Environment.NewLine : "", - includeCollections ? (Environment.NewLine + "using System.Collections.Generic;") : "", - inHeader ? "" : Environment.NewLine) - : ""; - } -} - -public class TypeMapper -{ - private const string ExternalTypeNameAttributeName = @"http://schemas.microsoft.com/ado/2006/04/codegeneration:ExternalTypeName"; - - private readonly System.Collections.IList _errors; - private readonly CodeGenerationTools _code; - private readonly MetadataTools _ef; - - public TypeMapper(CodeGenerationTools code, MetadataTools ef, System.Collections.IList errors) - { - ArgumentNotNull(code, "code"); - ArgumentNotNull(ef, "ef"); - ArgumentNotNull(errors, "errors"); - - _code = code; - _ef = ef; - _errors = errors; - } - - public static string FixNamespaces(string typeName) - { - return typeName.Replace("System.Data.Spatial.", "System.Data.Entity.Spatial."); - } - - public string GetTypeName(TypeUsage typeUsage) - { - return typeUsage == null ? null : GetTypeName(typeUsage.EdmType, _ef.IsNullable(typeUsage), modelNamespace: null); - } - - public string GetTypeName(EdmType edmType) - { - return GetTypeName(edmType, isNullable: null, modelNamespace: null); - } - - public string GetTypeName(TypeUsage typeUsage, string modelNamespace) - { - return typeUsage == null ? null : GetTypeName(typeUsage.EdmType, _ef.IsNullable(typeUsage), modelNamespace); - } - - public string GetTypeName(EdmType edmType, string modelNamespace) - { - return GetTypeName(edmType, isNullable: null, modelNamespace: modelNamespace); - } - - public string GetTypeName(EdmType edmType, bool? isNullable, string modelNamespace) - { - if (edmType == null) - { - return null; - } - - var collectionType = edmType as CollectionType; - if (collectionType != null) - { - return String.Format(CultureInfo.InvariantCulture, "ICollection<{0}>", GetTypeName(collectionType.TypeUsage, modelNamespace)); - } - - var typeName = _code.Escape(edmType.MetadataProperties - .Where(p => p.Name == ExternalTypeNameAttributeName) - .Select(p => (string)p.Value) - .FirstOrDefault()) - ?? (modelNamespace != null && edmType.NamespaceName != modelNamespace ? - _code.CreateFullName(_code.EscapeNamespace(edmType.NamespaceName), _code.Escape(edmType)) : - _code.Escape(edmType)); - - if (edmType is StructuralType) - { - return typeName; - } - - if (edmType is SimpleType) - { - var clrType = UnderlyingClrType(edmType); - if (!IsEnumType(edmType)) - { - typeName = _code.Escape(clrType); - } - - typeName = FixNamespaces(typeName); - - return clrType.IsValueType && isNullable == true ? - String.Format(CultureInfo.InvariantCulture, "Nullable<{0}>", typeName) : - typeName; - } - - throw new ArgumentException("edmType"); - } - - public Type UnderlyingClrType(EdmType edmType) - { - ArgumentNotNull(edmType, "edmType"); - - var primitiveType = edmType as PrimitiveType; - if (primitiveType != null) - { - return primitiveType.ClrEquivalentType; - } - - if (IsEnumType(edmType)) - { - return GetEnumUnderlyingType(edmType).ClrEquivalentType; - } - - return typeof(object); - } - - public object GetEnumMemberValue(MetadataItem enumMember) - { - ArgumentNotNull(enumMember, "enumMember"); - - var valueProperty = enumMember.GetType().GetProperty("Value"); - return valueProperty == null ? null : valueProperty.GetValue(enumMember, null); - } - - public string GetEnumMemberName(MetadataItem enumMember) - { - ArgumentNotNull(enumMember, "enumMember"); - - var nameProperty = enumMember.GetType().GetProperty("Name"); - return nameProperty == null ? null : (string)nameProperty.GetValue(enumMember, null); - } - - public System.Collections.IEnumerable GetEnumMembers(EdmType enumType) - { - ArgumentNotNull(enumType, "enumType"); - - var membersProperty = enumType.GetType().GetProperty("Members"); - return membersProperty != null - ? (System.Collections.IEnumerable)membersProperty.GetValue(enumType, null) - : Enumerable.Empty(); - } - - public bool EnumIsFlags(EdmType enumType) - { - ArgumentNotNull(enumType, "enumType"); - - var isFlagsProperty = enumType.GetType().GetProperty("IsFlags"); - return isFlagsProperty != null && (bool)isFlagsProperty.GetValue(enumType, null); - } - - public bool IsEnumType(GlobalItem edmType) - { - ArgumentNotNull(edmType, "edmType"); - - return edmType.GetType().Name == "EnumType"; - } - - public PrimitiveType GetEnumUnderlyingType(EdmType enumType) - { - ArgumentNotNull(enumType, "enumType"); - - return (PrimitiveType)enumType.GetType().GetProperty("UnderlyingType").GetValue(enumType, null); - } - - public string CreateLiteral(object value) - { - if (value == null || value.GetType() != typeof(TimeSpan)) - { - return _code.CreateLiteral(value); - } - - return string.Format(CultureInfo.InvariantCulture, "new TimeSpan({0})", ((TimeSpan)value).Ticks); - } - - public bool VerifyCaseInsensitiveTypeUniqueness(IEnumerable types, string sourceFile) - { - ArgumentNotNull(types, "types"); - ArgumentNotNull(sourceFile, "sourceFile"); - - var hash = new HashSet(StringComparer.InvariantCultureIgnoreCase); - if (types.Any(item => !hash.Add(item))) - { - _errors.Add( - new CompilerError(sourceFile, -1, -1, "6023", - String.Format(CultureInfo.CurrentCulture, CodeGenerationTools.GetResourceString("Template_CaseInsensitiveTypeConflict")))); - return false; - } - return true; - } - - public IEnumerable GetEnumItemsToGenerate(IEnumerable itemCollection) - { - return GetItemsToGenerate(itemCollection) - .Where(e => IsEnumType(e)); - } - - public IEnumerable GetItemsToGenerate(IEnumerable itemCollection) where T: EdmType - { - return itemCollection - .OfType() - .Where(i => !i.MetadataProperties.Any(p => p.Name == ExternalTypeNameAttributeName)) - .OrderBy(i => i.Name); - } - - public IEnumerable GetAllGlobalItems(IEnumerable itemCollection) - { - return itemCollection - .Where(i => i is EntityType || i is ComplexType || i is EntityContainer || IsEnumType(i)) - .Select(g => GetGlobalItemName(g)); - } - - public string GetGlobalItemName(GlobalItem item) - { - if (item is EdmType) - { - return ((EdmType)item).Name; - } - else - { - return ((EntityContainer)item).Name; - } - } - - public IEnumerable GetSimpleProperties(EntityType type) - { - return type.Properties.Where(p => p.TypeUsage.EdmType is SimpleType && p.DeclaringType == type); - } - - public IEnumerable GetSimpleProperties(ComplexType type) - { - return type.Properties.Where(p => p.TypeUsage.EdmType is SimpleType && p.DeclaringType == type); - } - - public IEnumerable GetComplexProperties(EntityType type) - { - return type.Properties.Where(p => p.TypeUsage.EdmType is ComplexType && p.DeclaringType == type); - } - - public IEnumerable GetComplexProperties(ComplexType type) - { - return type.Properties.Where(p => p.TypeUsage.EdmType is ComplexType && p.DeclaringType == type); - } - - public IEnumerable GetPropertiesWithDefaultValues(EntityType type) - { - return type.Properties.Where(p => p.TypeUsage.EdmType is SimpleType && p.DeclaringType == type && p.DefaultValue != null); - } - - public IEnumerable GetPropertiesWithDefaultValues(ComplexType type) - { - return type.Properties.Where(p => p.TypeUsage.EdmType is SimpleType && p.DeclaringType == type && p.DefaultValue != null); - } - - public IEnumerable GetNavigationProperties(EntityType type) - { - return type.NavigationProperties.Where(np => np.DeclaringType == type); - } - - public IEnumerable GetCollectionNavigationProperties(EntityType type) - { - return type.NavigationProperties.Where(np => np.DeclaringType == type && np.ToEndMember.RelationshipMultiplicity == RelationshipMultiplicity.Many); - } - - public FunctionParameter GetReturnParameter(EdmFunction edmFunction) - { - ArgumentNotNull(edmFunction, "edmFunction"); - - var returnParamsProperty = edmFunction.GetType().GetProperty("ReturnParameters"); - return returnParamsProperty == null - ? edmFunction.ReturnParameter - : ((IEnumerable)returnParamsProperty.GetValue(edmFunction, null)).FirstOrDefault(); - } - - public bool IsComposable(EdmFunction edmFunction) - { - ArgumentNotNull(edmFunction, "edmFunction"); - - var isComposableProperty = edmFunction.GetType().GetProperty("IsComposableAttribute"); - return isComposableProperty != null && (bool)isComposableProperty.GetValue(edmFunction, null); - } - - public IEnumerable GetParameters(EdmFunction edmFunction) - { - return FunctionImportParameter.Create(edmFunction.Parameters, _code, _ef); - } - - public TypeUsage GetReturnType(EdmFunction edmFunction) - { - var returnParam = GetReturnParameter(edmFunction); - return returnParam == null ? null : _ef.GetElementType(returnParam.TypeUsage); - } - - public bool GenerateMergeOptionFunction(EdmFunction edmFunction, bool includeMergeOption) - { - var returnType = GetReturnType(edmFunction); - return !includeMergeOption && returnType != null && returnType.EdmType.BuiltInTypeKind == BuiltInTypeKind.EntityType; - } -} - -public static void ArgumentNotNull(T arg, string name) where T : class -{ - if (arg == null) - { - throw new ArgumentNullException(name); - } -} -#> \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Models/SQLSyntax.Designer.cs b/Tests/MySql.EntityFramework6.Basic.Tests/Models/SQLSyntax.Designer.cs deleted file mode 100644 index eb078af9a..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Models/SQLSyntax.Designer.cs +++ /dev/null @@ -1,1043 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.17929 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace MySql.Data.Entity.Tests.Properties { - 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", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class SQLSyntax { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal SQLSyntax() { - } - - /// - /// 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("MySql.Data.Entity.Tests.Properties.SQLSyntax", typeof(SQLSyntax).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 SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`Name`, - ///`Extent1`.`Age` - ///FROM `Authors` AS `Extent1` - /// WHERE NOT EXISTS(SELECT - ///1 AS `C1` - ///FROM `Books` AS `Extent2` - /// WHERE `Extent1`.`Id` = `Extent2`.`Author_id`). - /// - internal static string Any { - get { - return ResourceManager.GetString("Any", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`GroupBy1`.`A1` AS `C1` - ///FROM (SELECT - ///AVG(`Extent1`.`MinAge`) AS `A1` - ///FROM `Toys` AS `Extent1`) AS `GroupBy1`. - /// - internal static string AverageSimple { - get { - return ResourceManager.GetString("AverageSimple", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///1 AS `C1`, - ///`GroupBy1`.`A1` AS `C2` - ///FROM (SELECT - ///`Extent1`.`ShopId` AS `K1`, - ///AVG(`Extent1`.`Freight`) AS `A1` - ///FROM `Orders` AS `Extent1` - /// GROUP BY - ///`Extent1`.`ShopId`) AS `GroupBy1`. - /// - internal static string AverageWithGrouping { - get { - return ResourceManager.GetString("AverageWithGrouping", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`GroupBy1`.`A1` AS `C1` - ///FROM (SELECT - ///AVG(`Extent1`.`Freight`) AS `A1` - ///FROM `Orders` AS `Extent1` - /// WHERE `Extent1`.`ShopId` = 3) AS `GroupBy1`. - /// - internal static string AverageWithPredicate { - get { - return ResourceManager.GetString("AverageWithPredicate", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`GroupBy1`.`A1` AS `C1` - ///FROM (SELECT - ///COUNT(`Extent1`.`Id`) AS `A1` - ///FROM `Toys` AS `Extent1`) AS `GroupBy1`. - /// - internal static string BigCountSimple { - get { - return ResourceManager.GetString("BigCountSimple", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///1 AS `C1`, - ///`GroupBy1`.`K1` AS `Name`, - ///`GroupBy1`.`A1` AS `C2` - ///FROM (SELECT - ///`Extent1`.`Name` AS `K1`, - ///`Extent1`.`DateBegan` AS `K2`, - ///`Extent1`.`NumEmployees` AS `K3`, - ///COUNT(1) AS `A1` - ///FROM `Companies` AS `Extent1` - /// GROUP BY - ///`Extent1`.`Name`, - ///`Extent1`.`DateBegan`, - ///`Extent1`.`NumEmployees`) AS `GroupBy1`. - /// - internal static string CanGroupByMultipleColumns { - get { - return ResourceManager.GetString("CanGroupByMultipleColumns", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///1 AS `C1`, - ///`GroupBy1`.`K1` AS `Name`, - ///`GroupBy1`.`A1` AS `C2` - ///FROM (SELECT - ///`Extent1`.`Name` AS `K1`, - ///COUNT(1) AS `A1` - ///FROM `Companies` AS `Extent1` - /// GROUP BY - ///`Extent1`.`Name`) AS `GroupBy1`. - /// - internal static string CanGroupBySingleColumn { - get { - return ResourceManager.GetString("CanGroupBySingleColumn", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Project2`.`C1`, - ///`Project2`.`Id`, - ///`Project2`.`LastName`, - ///`Project2`.`FirstName`, - ///`Project2`.`Age`, - ///`Project2`.`C2` - ///FROM (SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`LastName`, - ///`Extent1`.`FirstName`, - ///`Extent1`.`Age`, - ///CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (@gp1) ELSE (@gp2) END AS `C1`, - ///CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (NULL) ELSE (`Project1`.`Salary`) END AS `C2` - ///FROM `Employees` AS `Extent1` LEFT OU [rest of string was truncated]";. - /// - internal static string ContainsTranslatedToLike { - get { - return ResourceManager.GetString("ContainsTranslatedToLike", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`GroupBy1`.`A1` AS `C1` - ///FROM (SELECT - ///COUNT(`Extent1`.`Id`) AS `A1` - ///FROM `Toys` AS `Extent1`) AS `GroupBy1`. - /// - internal static string CountSimple { - get { - return ResourceManager.GetString("CountSimple", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`GroupBy1`.`A1` AS `C1` - ///FROM (SELECT - ///COUNT(`Extent1`.`Id`) AS `A1` - ///FROM `Toys` AS `Extent1` - /// WHERE `Extent1`.`MinAge` > 3) AS `GroupBy1`. - /// - internal static string CountWithPredicate { - get { - return ResourceManager.GetString("CountWithPredicate", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - /// `Project2`.`C1`, - /// `Project2`.`Id`, - /// `Project2`.`LastName`, - /// `Project2`.`FirstName`, - /// `Project2`.`Age`, - /// `Project2`.`C2` - /// FROM (SELECT - /// `Extent1`.`Id`, - /// `Extent1`.`LastName`, - /// `Extent1`.`FirstName`, - /// `Extent1`.`Age`, - /// CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (@gp1) ELSE (@gp2) END AS `C1`, - /// CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (NULL) ELSE (`Project1`.`Salary`) END AS `C2` - /// FROM `Emp [rest of string was truncated]";. - /// - internal static string EndsWithTranslatedLikeApostrophes { - get { - return ResourceManager.GetString("EndsWithTranslatedLikeApostrophes", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Project2`.`C1`, - ///`Project2`.`Id`, - ///`Project2`.`LastName`, - ///`Project2`.`FirstName`, - ///`Project2`.`Age`, - ///`Project2`.`C2` - ///FROM (SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`LastName`, - ///`Extent1`.`FirstName`, - ///`Extent1`.`Age`, - ///CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (@gp1) ELSE (@gp2) END AS `C1`, - ///CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (NULL) ELSE (`Project1`.`Salary`) END AS `C2` - ///FROM `Employees` AS `Extent1` LEFT OU [rest of string was truncated]";. - /// - internal static string EndsWithTranslatedToLike { - get { - return ResourceManager.GetString("EndsWithTranslatedToLike", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`Name`, - ///`Extent1`.`DateBegan`, - ///`Extent1`.`NumEmployees`, - ///`Extent1`.`Address`, - ///`Extent1`.`City`, - ///`Extent1`.`State`, - ///`Extent1`.`ZipCode` - ///FROM `Companies` AS `Extent1` - /// WHERE EXISTS(SELECT - ///1 AS `C1` - ///FROM `Toys` AS `Extent2` - /// WHERE (`Extent1`.`Id` = `Extent2`.`SupplierId`) AND (`Extent2`.`MinAge` < 4)). - /// - internal static string Exists { - get { - return ResourceManager.GetString("Exists", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Project2`.`C1`, - ///`Project2`.`Id`, - ///`Project2`.`LastName`, - ///`Project2`.`FirstName`, - ///`Project2`.`Age`, - ///`Project2`.`C2` - ///FROM (SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`LastName`, - ///`Extent1`.`FirstName`, - ///`Extent1`.`Age`, - ///CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (@gp2) ELSE (@gp3) END AS `C1`, - ///CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (NULL) ELSE (`Project1`.`Salary`) END AS `C2` - ///FROM `Employees` AS `Extent1` LEFT OU [rest of string was truncated]";. - /// - internal static string InExpressionComplex { - get { - return ResourceManager.GetString("InExpressionComplex", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Project2`.`C1`, - ///`Project2`.`Id`, - ///`Project2`.`LastName`, - ///`Project2`.`FirstName`, - ///`Project2`.`Age`, - ///`Project2`.`C2` - ///FROM (SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`LastName`, - ///`Extent1`.`FirstName`, - ///`Extent1`.`Age`, - ///CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (@gp1) ELSE (@gp2) END AS `C1`, - ///CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (NULL) ELSE (`Project1`.`Salary`) END AS `C2` - ///FROM `Employees` AS `Extent1` LEFT OU [rest of string was truncated]";. - /// - internal static string InExpressionSimple { - get { - return ResourceManager.GetString("InExpressionSimple", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Project2`.`C1`, - ///`Project2`.`Id`, - ///`Project2`.`LastName`, - ///`Project2`.`FirstName`, - ///`Project2`.`Age`, - ///`Project2`.`C2` - ///FROM (SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`LastName`, - ///`Extent1`.`FirstName`, - ///`Extent1`.`Age`, - ///CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (@gp1) ELSE (@gp2) END AS `C1`, - ///CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (NULL) ELSE (`Project1`.`Salary`) END AS `C2` - ///FROM `Employees` AS `Extent1` LEFT OU [rest of string was truncated]";. - /// - internal static string InExpressionSimpleEF6 { - get { - return ResourceManager.GetString("InExpressionSimpleEF6", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Project1`.`Id`, - ///`Project1`.`Name`, - ///`Project1`.`Pages`, - ///`Project1`.`Id1`, - ///`Project1`.`Name1`, - ///`Project1`.`Age`, - ///`Project1`.`Id2`, - ///`Project1`.`Name2`, - ///`Project1`.`C1`, - ///`Project1`.`Id3`, - ///`Project1`.`Name3`, - ///`Project1`.`Pages1`, - ///`Project1`.`Author_id`, - ///`Project1`.`Publisher_id` - ///FROM (SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`Name`, - ///`Extent1`.`Pages`, - ///`Extent2`.`Id` AS `Id1`, - ///`Extent2`.`Name` AS `Name1`, - ///`Extent2`.`Age`, - ///`Extent3`.`id` AS `Id2`, - ///`Extent3`.`name` AS `Nam [rest of string was truncated]";. - /// - internal static string JoinOfNestedUnionsWithLimit { - get { - return ResourceManager.GetString("JoinOfNestedUnionsWithLimit", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`UnionAll1`.`Id` AS `C1`, - ///`UnionAll1`.`Name` AS `C2`, - ///`UnionAll1`.`MinAge` AS `C3`, - ///`UnionAll1`.`SupplierId` AS `C4` - ///FROM (SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`Name`, - ///`Extent1`.`MinAge`, - ///`Extent1`.`SupplierId` - ///FROM `Toys` AS `Extent1` UNION ALL (SELECT - ///`Id`, - ///`Name`, - ///`MinAge`, - ///`SupplierId` - ///FROM `Toys` LIMIT 0)) AS `UnionAll1` - /// - internal static string UnionWithLimit - { - get - { - return ResourceManager.GetString("UnionWithLimit", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT ... - /// - internal static string UnionWithLimit2 - { - get - { - return ResourceManager.GetString("UnionWithLimit2", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`Name`, - ///`Join1`.`Id` AS `C1`, - ///`Join1`.`Name` AS `C2`, - ///`Join1`.`ID1` AS `C3`, - ///`Join1`.`NAME1` AS `C4` - ///FROM `Companies` AS `Extent1` INNER JOIN (SELECT - ///`UnionAll1`.`Id`, - ///`UnionAll1`.`Name`, - ///`UnionAll2`.`Id` AS `ID1`, - ///`UnionAll2`.`Name` AS `NAME1` - ///FROM (SELECT - ///`Extent2`.`Id`, - ///`Extent2`.`Name` - ///FROM `Toys` AS `Extent2` UNION ALL SELECT - ///`Extent3`.`Id`, - ///`Extent3`.`Name` - ///FROM `Shops` AS `Extent3`) AS `UnionAll1` INNER JOIN (SELECT - ///`Extent4`.`Id`, - ///`Extent4`.`Name` - ///FROM `Au [rest of string was truncated]";. - /// - internal static string JoinOfUnionsOnRightSideOfJoin { - get { - return ResourceManager.GetString("JoinOfUnionsOnRightSideOfJoin", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`EmployeeID`, - ///`Extent1`.`LastName`, - ///`Extent1`.`FirstName`, - ///`Extent1`.`BirthTime`, - ///`Extent1`.`Weight`, - ///`Extent1`.`LastModified` - ///FROM `EmployeeChildren` AS `Extent1` INNER JOIN (SELECT - ///`Extent2`.`Id`, - ///`Extent2`.`LastName`, - ///`Extent2`.`FirstName`, - ///`Extent2`.`Age`, - ///`Extent3`.`EmployeeId`, - ///`Extent3`.`Salary` - ///FROM `Employees` AS `Extent2` LEFT OUTER JOIN `SalariedEmployees` AS `Extent3` ON `Extent2`.`Id` = `Extent3`.`EmployeeId`) AS `Join1` ON `Extent1`.`E [rest of string was truncated]";. - /// - internal static string JoinOnRightSideAsDerivedTable { - get { - return ResourceManager.GetString("JoinOnRightSideAsDerivedTable", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`Name`, - ///`Join1`.`Id` AS `Id1`, - ///`Join1`.`Name` AS `Name1`, - ///`Join1`.`Id1` AS `Id2`, - ///`Join1`.`Name1` AS `Name2` - ///FROM `Companies` AS `Extent1` INNER JOIN (SELECT - ///`Extent2`.`Id`, - ///`Extent2`.`Name`, - ///`Extent2`.`Age`, - ///`Extent3`.`Id` AS `Id1`, - ///`Extent3`.`Name` AS `Name1`, - ///`Extent3`.`Pages`, - ///`Extent3`.`Author_id`, - ///`Extent3`.`Publisher_id` - ///FROM `Authors` AS `Extent2` INNER JOIN `Books` AS `Extent3` ON `Extent2`.`Id` = `Extent3`.`Id`) AS `Join1` ON `Extent1`.` [rest of string was truncated]";. - /// - internal static string JoinOnRightSideNameClash { - get { - return ResourceManager.GetString("JoinOnRightSideNameClash", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT `Project1`.`Id`, - /// `Project1`.`Name`, - /// `Project1`.`C2` AS `C1`, - /// `Project1`.`Id1`, - /// `Project1`.`AuthorId`, - /// `Project1`.`C1` AS `C2`, - /// `Project1`.`Id2`, - /// `Project1`.`Title` - ///FROM (SELECT `Extent1`.`Id`, - /// `Extent1`.`Name`, - /// `Join2`.`Id` AS `Id1`, - /// `Join2`.`AuthorId`, - /// `Join2`.`Id1` AS `Id2`, - /// `Join2`.`Title`, - /// CASE - /// WHEN ( `Join2`.`Id` IS NULL ) T [rest of string was truncated]";. - /// - internal static string JoinUsingInclude { - get { - return ResourceManager.GetString("JoinUsingInclude", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`Name`, - ///`Extent1`.`Address`, - ///`Extent1`.`City`, - ///`Extent1`.`State`, - ///`Extent1`.`ZipCode` - ///FROM `Shops` AS `Extent1` INNER JOIN (SELECT - ///MAX(`Extent2`.`ShopId`) AS `A1` - ///FROM `Orders` AS `Extent2`) AS `GroupBy1` ON `Extent1`.`Id` = `GroupBy1`.`A1`. - /// - internal static string MaxInSubQuery1 { - get { - return ResourceManager.GetString("MaxInSubQuery1", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`Name`, - ///`Extent1`.`Address`, - ///`Extent1`.`City`, - ///`Extent1`.`State`, - ///`Extent1`.`ZipCode` - ///FROM `Shops` AS `Extent1` INNER JOIN (SELECT - ///MAX(`Extent2`.`ShopId`) AS `A1` - ///FROM `Orders` AS `Extent2`) AS `GroupBy1` ON `Extent1`.`Id` = `GroupBy1`.`A1`. - /// - internal static string MaxInSubQuery2 { - get { - return ResourceManager.GetString("MaxInSubQuery2", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`GroupBy1`.`A1` AS `C1` - ///FROM (SELECT - ///MAX(`Extent1`.`MinAge`) AS `A1` - ///FROM `Toys` AS `Extent1`) AS `GroupBy1`. - /// - internal static string MaxSimple { - get { - return ResourceManager.GetString("MaxSimple", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`GroupBy1`.`A1` AS `C1` - ///FROM (SELECT - ///`Extent1`.`ShopId` AS `K1`, - ///MAX(`Extent1`.`Freight`) AS `A1` - ///FROM `Orders` AS `Extent1` - /// GROUP BY - ///`Extent1`.`ShopId`) AS `GroupBy1`. - /// - internal static string MaxWithGrouping { - get { - return ResourceManager.GetString("MaxWithGrouping", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///1 AS `C1`, - ///`GroupBy1`.`A1` AS `C2` - ///FROM (SELECT - ///MAX(`Extent1`.`Freight`) AS `A1` - ///FROM `Orders` AS `Extent1` - /// WHERE `Extent1`.`ShopId` = 1) AS `GroupBy1`. - /// - internal static string MaxWithPredicate { - get { - return ResourceManager.GetString("MaxWithPredicate", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`GroupBy1`.`A1` AS `C1` - ///FROM (SELECT - ///MIN(`Extent1`.`MinAge`) AS `A1` - ///FROM `Toys` AS `Extent1`) AS `GroupBy1`. - /// - internal static string MinSimple { - get { - return ResourceManager.GetString("MinSimple", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`GroupBy1`.`A1` AS `C1` - ///FROM (SELECT - ///`Extent1`.`ShopId` AS `K1`, - ///MIN(`Extent1`.`Freight`) AS `A1` - ///FROM `Orders` AS `Extent1` - /// GROUP BY - ///`Extent1`.`ShopId`) AS `GroupBy1`. - /// - internal static string MinWithGrouping { - get { - return ResourceManager.GetString("MinWithGrouping", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///1 AS `C1`, - ///`GroupBy1`.`A1` AS `C2` - ///FROM (SELECT - ///MIN(`Extent1`.`Freight`) AS `A1` - ///FROM `Orders` AS `Extent1` - /// WHERE `Extent1`.`ShopId` = 2) AS `GroupBy1`. - /// - internal static string MinWithPredicate { - get { - return ResourceManager.GetString("MinWithPredicate", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`Name`, - ///`Extent1`.`DateBegan`, - ///`Extent1`.`NumEmployees`, - ///`Extent1`.`Address`, - ///`Extent1`.`City`, - ///`Extent1`.`State`, - ///`Extent1`.`ZipCode` - ///FROM `Companies` AS `Extent1` - /// ORDER BY - ///`Extent1`.`Name` ASC. - /// - internal static string OrderBySimple { - get { - return ResourceManager.GetString("OrderBySimple", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`Name`, - ///`Extent1`.`DateBegan`, - ///`Extent1`.`NumEmployees`, - ///`Extent1`.`Address`, - ///`Extent1`.`City`, - ///`Extent1`.`State`, - ///`Extent1`.`ZipCode` - ///FROM `Companies` AS `Extent1` - /// WHERE `Extent1`.`NumEmployees` > 100 - /// ORDER BY - ///`Extent1`.`Name` ASC. - /// - internal static string OrderByWithPredicate { - get { - return ResourceManager.GetString("OrderByWithPredicate", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`LastName` - ///FROM `Employees` AS `Extent1` LEFT OUTER JOIN `SalariedEmployees` AS `Extent2` ON `Extent1`.`Id` = `Extent2`.`EmployeeId` - /// WHERE `Extent1`.`Age` > 20. - /// - internal static string SelectWithComplexType { - get { - return ResourceManager.GetString("SelectWithComplexType", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`Name`, - ///`Extent2`.`Name` AS `Name1` - ///FROM `Books` AS `Extent1` INNER JOIN `Authors` AS `Extent2` ON `Extent1`.`Author_id` = `Extent2`.`Id`. - /// - internal static string SimpleJoin { - get { - return ResourceManager.GetString("SimpleJoin", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`Name`, - ///`Extent2`.`Name` AS `Name1` - ///FROM `Books` AS `Extent1` INNER JOIN `Authors` AS `Extent2` ON `Extent1`.`Author_id` = `Extent2`.`Id` - /// WHERE `Extent1`.`Pages` > 300. - /// - internal static string SimpleJoinWithPredicate { - get { - return ResourceManager.GetString("SimpleJoinWithPredicate", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`Name`, - ///`Extent1`.`MinAge`, - ///`Extent1`.`SupplierId` - ///FROM `Toys` AS `Extent1`. - /// - internal static string SimpleSelect { - get { - return ResourceManager.GetString("SimpleSelect", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`Name`, - ///`Extent1`.`MinAge`, - ///`Extent1`.`SupplierId` - ///FROM `Toys` AS `Extent1` - /// WHERE `Extent1`.`MinAge` = 4. - /// - internal static string SimpleSelectWithFilter { - get { - return ResourceManager.GetString("SimpleSelectWithFilter", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`Name`, - ///`Extent1`.`MinAge`, - ///`Extent1`.`SupplierId` - ///FROM `Toys` AS `Extent1` - /// WHERE `Extent1`.`MinAge` > @age. - /// - internal static string SimpleSelectWithParam { - get { - return ResourceManager.GetString("SimpleSelectWithParam", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`Name`, - ///`Extent1`.`DateBegan`, - ///`Extent1`.`NumEmployees`, - ///`Extent1`.`Address`, - ///`Extent1`.`City`, - ///`Extent1`.`State`, - ///`Extent1`.`ZipCode` - ///FROM `Companies` AS `Extent1` - /// ORDER BY - ///`Extent1`.`Id` ASC LIMIT 3,18446744073709551615. - /// - internal static string Skip { - get { - return ResourceManager.GetString("Skip", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`Name`, - ///`Extent1`.`DateBegan`, - ///`Extent1`.`NumEmployees`, - ///`Extent1`.`Address`, - ///`Extent1`.`City`, - ///`Extent1`.`State`, - ///`Extent1`.`ZipCode` - ///FROM `Companies` AS `Extent1` - /// ORDER BY - ///`Extent1`.`Id` ASC LIMIT 2,2. - /// - internal static string SkipAndTakeSimple { - get { - return ResourceManager.GetString("SkipAndTakeSimple", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`Name`, - ///`Extent1`.`DateBegan`, - ///`Extent1`.`NumEmployees`, - ///`Extent1`.`Address`, - ///`Extent1`.`City`, - ///`Extent1`.`State`, - ///`Extent1`.`ZipCode` - ///FROM `Companies` AS `Extent1` - /// ORDER BY - ///`Extent1`.`Name` DESC LIMIT 2,2. - /// - internal static string SkipAndTakeWithOrdering { - get { - return ResourceManager.GetString("SkipAndTakeWithOrdering", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Project2`.`C1`, - ///`Project2`.`Id`, - ///`Project2`.`LastName`, - ///`Project2`.`FirstName`, - ///`Project2`.`Age`, - ///`Project2`.`C2` - ///FROM (SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`LastName`, - ///`Extent1`.`FirstName`, - ///`Extent1`.`Age`, - ///CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (@gp1) ELSE (@gp2) END AS `C1`, - ///CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (NULL) ELSE (`Project1`.`Salary`) END AS `C2` - ///FROM `Employees` AS `Extent1` LEFT OU [rest of string was truncated]";. - /// - internal static string StartsWithTranslatedToLike { - get { - return ResourceManager.GetString("StartsWithTranslatedToLike", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to . - /// - internal static string String1 { - get { - return ResourceManager.GetString("String1", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`GroupBy1`.`A1` AS `C1` - ///FROM (SELECT - ///SUM(`Extent1`.`MinAge`) AS `A1` - ///FROM `Toys` AS `Extent1`) AS `GroupBy1`. - /// - internal static string SumSimple { - get { - return ResourceManager.GetString("SumSimple", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`GroupBy1`.`A1` AS `C1` - ///FROM (SELECT - ///`Extent1`.`ShopId` AS `K1`, - ///SUM(`Extent1`.`Freight`) AS `A1` - ///FROM `Orders` AS `Extent1` - /// GROUP BY - ///`Extent1`.`ShopId`) AS `GroupBy1`. - /// - internal static string SumWithGrouping { - get { - return ResourceManager.GetString("SumWithGrouping", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`GroupBy1`.`A1` AS `C1` - ///FROM (SELECT - ///SUM(`Extent1`.`Freight`) AS `A1` - ///FROM `Orders` AS `Extent1` - /// WHERE `Extent1`.`ShopId` = 2) AS `GroupBy1`. - /// - internal static string SumWithPredicate { - get { - return ResourceManager.GetString("SumWithPredicate", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - /// `Id`, - /// `Name`, - /// `Developer` - /// FROM `vivideogametitle` LIMIT 10. - /// - internal static string TakeWithView { - get { - return ResourceManager.GetString("TakeWithView", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Id`, - ///`Name`, - ///`DateBegan`, - ///`NumEmployees`, - ///`Address`, - ///`City`, - ///`State`, - ///`ZipCode` - ///FROM `Companies` LIMIT 2. - /// - internal static string Top { - get { - return ResourceManager.GetString("Top", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`UnionAll1`.`Id` AS `C1`, - ///`UnionAll1`.`Id1` AS `C2`, - ///`UnionAll1`.`Name` AS `C3` - ///FROM (SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`Id` AS `Id1`, - ///`Extent1`.`Name` - ///FROM `Toys` AS `Extent1` UNION ALL SELECT - ///`Extent2`.`Id`, - ///`Extent2`.`Id` AS `Id1`, - ///`Extent2`.`Name` - ///FROM `Companies` AS `Extent2`) AS `UnionAll1`. - /// - internal static string UnionAll { - get { - return ResourceManager.GetString("UnionAll", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to UPDATE `Products` SET `Name`='Acme 2' WHERE `Id` = 1; SELECT `CreatedDate` FROM `Products` WHERE row_count() > 0 and `Id` = 1. - /// - internal static string UpdateWithSelect { - get { - return ResourceManager.GetString("UpdateWithSelect", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`Name`, - ///`Extent1`.`DateBegan`, - ///`Extent1`.`NumEmployees`, - ///`Extent1`.`Address`, - ///`Extent1`.`City`, - ///`Extent1`.`State`, - ///`Extent1`.`ZipCode` - ///FROM `Companies` AS `Extent1` - /// WHERE `Extent1`.`City` = @gp1. - /// - internal static string WhereLiteralOnRelation { - get { - return ResourceManager.GetString("WhereLiteralOnRelation", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`Name`, - ///`Extent1`.`MinAge`, - ///`Extent1`.`SupplierId` - ///FROM `Toys` AS `Extent1` INNER JOIN `Companies` AS `Extent2` ON `Extent1`.`SupplierId` = `Extent2`.`Id` - /// WHERE `Extent2`.`State` = @gp1. - /// - internal static string WhereWithRelatedEntities1 { - get { - return ResourceManager.GetString("WhereWithRelatedEntities1", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Filter1`.`Id`, - ///`Filter1`.`Name`, - ///`Filter1`.`MinAge`, - ///`Filter1`.`SupplierId` - ///FROM (SELECT - ///`Extent1`.`Id`, - ///`Extent1`.`SupplierId`, - ///`Extent1`.`Name`, - ///`Extent1`.`MinAge`, - ///`Extent2`.`Id` AS `Id1`, - ///`Extent2`.`Name` AS `Name1`, - ///`Extent2`.`DateBegan`, - ///`Extent2`.`NumEmployees`, - ///`Extent2`.`Address`, - ///`Extent2`.`City`, - ///`Extent2`.`State`, - ///`Extent2`.`ZipCode` - ///FROM `Toys` AS `Extent1` INNER JOIN `Companies` AS `Extent2` ON `Extent1`.`SupplierId` = `Extent2`.`Id` - /// WHERE `Extent2`.`S [rest of string was truncated]";. - /// - internal static string WhereWithRelatedEntities2 { - get { - return ResourceManager.GetString("WhereWithRelatedEntities2", resourceCulture); - } - } - } -} diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Models/SQLSyntax.resx b/Tests/MySql.EntityFramework6.Basic.Tests/Models/SQLSyntax.resx deleted file mode 100644 index a75316e26..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Models/SQLSyntax.resx +++ /dev/null @@ -1,891 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - SELECT -`Extent1`.`Id`, -`Extent1`.`Name`, -`Extent1`.`Age` -FROM `Authors` AS `Extent1` - WHERE NOT EXISTS(SELECT -1 AS `C1` -FROM `Books` AS `Extent2` - WHERE `Extent1`.`Id` = `Extent2`.`Author_id`) - - - SELECT -`GroupBy1`.`A1` AS `C1` -FROM (SELECT -AVG(`Extent1`.`MinAge`) AS `A1` -FROM `Toys` AS `Extent1`) AS `GroupBy1` - - - SELECT -1 AS `C1`, -`GroupBy1`.`A1` AS `C2` -FROM (SELECT -`Extent1`.`ShopId` AS `K1`, -AVG(`Extent1`.`Freight`) AS `A1` -FROM `Orders` AS `Extent1` - GROUP BY -`Extent1`.`ShopId`) AS `GroupBy1` - - - SELECT -`GroupBy1`.`A1` AS `C1` -FROM (SELECT -AVG(`Extent1`.`Freight`) AS `A1` -FROM `Orders` AS `Extent1` - WHERE `Extent1`.`ShopId` = 3) AS `GroupBy1` - - - SELECT -`GroupBy1`.`A1` AS `C1` -FROM (SELECT -COUNT(`Extent1`.`Id`) AS `A1` -FROM `Toys` AS `Extent1`) AS `GroupBy1` - - - SELECT -1 AS `C1`, -`GroupBy1`.`K1` AS `Name`, -`GroupBy1`.`A1` AS `C2` -FROM (SELECT -`Extent1`.`Name` AS `K1`, -`Extent1`.`DateBegan` AS `K2`, -`Extent1`.`NumEmployees` AS `K3`, -COUNT(1) AS `A1` -FROM `Companies` AS `Extent1` - GROUP BY -`Extent1`.`Name`, -`Extent1`.`DateBegan`, -`Extent1`.`NumEmployees`) AS `GroupBy1` - - - SELECT -1 AS `C1`, -`GroupBy1`.`K1` AS `Name`, -`GroupBy1`.`A1` AS `C2` -FROM (SELECT -`Extent1`.`Name` AS `K1`, -COUNT(1) AS `A1` -FROM `Companies` AS `Extent1` - GROUP BY -`Extent1`.`Name`) AS `GroupBy1` - - - SELECT -`Project2`.`C1`, -`Project2`.`Id`, -`Project2`.`LastName`, -`Project2`.`FirstName`, -`Project2`.`Age`, -`Project2`.`C2` -FROM (SELECT -`Extent1`.`Id`, -`Extent1`.`LastName`, -`Extent1`.`FirstName`, -`Extent1`.`Age`, -CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (@gp2) ELSE (@gp3) END AS `C1`, -CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (NULL) ELSE (`Project1`.`Salary`) END AS `C2` -FROM `Employees` AS `Extent1` LEFT OUTER JOIN (SELECT -`Extent2`.`EmployeeId`, -`Extent2`.`Salary`, -1 AS `C1` -FROM `SalariedEmployees` AS `Extent2`) AS `Project1` ON `Extent1`.`Id` = `Project1`.`EmployeeId` - WHERE `Extent1`.`FirstName` LIKE @gp1) AS `Project2` - ORDER BY -`Project2`.`FirstName` ASC - - - SELECT -`GroupBy1`.`A1` AS `C1` -FROM (SELECT -COUNT(`Extent1`.`Id`) AS `A1` -FROM `Toys` AS `Extent1`) AS `GroupBy1` - - - SELECT -`GroupBy1`.`A1` AS `C1` -FROM (SELECT -COUNT(`Extent1`.`Id`) AS `A1` -FROM `Toys` AS `Extent1` - WHERE `Extent1`.`MinAge` > 3) AS `GroupBy1` - - - SELECT -`Project2`.`C1`, -`Project2`.`Id`, -`Project2`.`LastName`, -`Project2`.`FirstName`, -`Project2`.`Age`, -`Project2`.`C2` -FROM (SELECT -`Extent1`.`Id`, -`Extent1`.`LastName`, -`Extent1`.`FirstName`, -`Extent1`.`Age`, -CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (@gp2) ELSE (@gp3) END AS `C1`, -CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (NULL) ELSE (`Project1`.`Salary`) END AS `C2` -FROM `Employees` AS `Extent1` LEFT OUTER JOIN (SELECT -`Extent2`.`EmployeeId`, -`Extent2`.`Salary`, -1 AS `C1` -FROM `SalariedEmployees` AS `Extent2`) AS `Project1` ON `Extent1`.`Id` = `Project1`.`EmployeeId` - WHERE `Extent1`.`FirstName` LIKE @gp1) AS `Project2` - ORDER BY -`Project2`.`FirstName` ASC - - - SELECT -`Project2`.`C1`, -`Project2`.`Id`, -`Project2`.`LastName`, -`Project2`.`FirstName`, -`Project2`.`Age`, -`Project2`.`C2` -FROM (SELECT -`Extent1`.`Id`, -`Extent1`.`LastName`, -`Extent1`.`FirstName`, -`Extent1`.`Age`, -CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (@gp2) ELSE (@gp3) END AS `C1`, -CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (NULL) ELSE (`Project1`.`Salary`) END AS `C2` -FROM `Employees` AS `Extent1` LEFT OUTER JOIN (SELECT -`Extent2`.`EmployeeId`, -`Extent2`.`Salary`, -1 AS `C1` -FROM `SalariedEmployees` AS `Extent2`) AS `Project1` ON `Extent1`.`Id` = `Project1`.`EmployeeId` - WHERE `Extent1`.`FirstName` LIKE @gp1) AS `Project2` - ORDER BY -`Project2`.`FirstName` ASC - - - SELECT -`Extent1`.`Id`, -`Extent1`.`Name`, -`Extent1`.`DateBegan`, -`Extent1`.`NumEmployees`, -`Extent1`.`Address`, -`Extent1`.`City`, -`Extent1`.`State`, -`Extent1`.`ZipCode` -FROM `Companies` AS `Extent1` - WHERE EXISTS(SELECT -1 AS `C1` -FROM `Toys` AS `Extent2` - WHERE (`Extent1`.`Id` = `Extent2`.`SupplierId`) AND (`Extent2`.`MinAge` < 4)) - - - SELECT -`Project2`.`C1`, -`Project2`.`Id`, -`Project2`.`LastName`, -`Project2`.`FirstName`, -`Project2`.`Age`, -`Project2`.`C2` -FROM (SELECT -`Extent1`.`Id`, -`Extent1`.`LastName`, -`Extent1`.`FirstName`, -`Extent1`.`Age`, -CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (@gp2) ELSE (@gp3) END AS `C1`, -CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (NULL) ELSE (`Project1`.`Salary`) END AS `C2` -FROM `Employees` AS `Extent1` LEFT OUTER JOIN (SELECT -`Extent2`.`EmployeeId`, -`Extent2`.`Salary`, -1 AS `C1` -FROM `SalariedEmployees` AS `Extent2`) AS `Project1` ON `Extent1`.`Id` = `Project1`.`EmployeeId` - WHERE ((`Extent1`.`Age` IN ( 40,41,42,43 )) AND (@gp1 = `Extent1`.`FirstName`)) OR (`Extent1`.`Age` NOT IN ( 37,38,39 ))) AS `Project2` - ORDER BY -`Project2`.`LastName` ASC, -`Project2`.`FirstName` ASC - - - SELECT -`Project2`.`C1`, -`Project2`.`Id`, -`Project2`.`LastName`, -`Project2`.`FirstName`, -`Project2`.`Age`, -`Project2`.`C2` -FROM (SELECT -`Extent1`.`Id`, -`Extent1`.`LastName`, -`Extent1`.`FirstName`, -`Extent1`.`Age`, -CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (@gp1) ELSE (@gp2) END AS `C1`, -CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (NULL) ELSE (`Project1`.`Salary`) END AS `C2` -FROM `Employees` AS `Extent1` LEFT OUTER JOIN (SELECT -`Extent2`.`EmployeeId`, -`Extent2`.`Salary`, -1 AS `C1` -FROM `SalariedEmployees` AS `Extent2`) AS `Project1` ON `Extent1`.`Id` = `Project1`.`EmployeeId` - WHERE `Extent1`.`Age` IN ( 37,38,39,40,41,42,43 )) AS `Project2` - ORDER BY -`Project2`.`LastName` ASC, -`Project2`.`FirstName` ASC - - - SELECT -`Project2`.`C1`, -`Project2`.`Id`, -`Project2`.`LastName`, -`Project2`.`FirstName`, -`Project2`.`Age`, -`Project2`.`C2` -FROM (SELECT -`Extent1`.`Id`, -`Extent1`.`LastName`, -`Extent1`.`FirstName`, -`Extent1`.`Age`, -CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (@gp1) ELSE (@gp2) END AS `C1`, -CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (NULL) ELSE (`Project1`.`Salary`) END AS `C2` -FROM `Employees` AS `Extent1` LEFT OUTER JOIN (SELECT -`Extent2`.`EmployeeId`, -`Extent2`.`Salary`, -1 AS `C1` -FROM `SalariedEmployees` AS `Extent2`) AS `Project1` ON `Extent1`.`Id` = `Project1`.`EmployeeId` - WHERE ((((((37 = `Extent1`.`Age`) OR (38 = `Extent1`.`Age`)) OR (39 = `Extent1`.`Age`)) OR (40 = `Extent1`.`Age`)) OR (41 = `Extent1`.`Age`)) OR (42 = `Extent1`.`Age`)) OR (43 = `Extent1`.`Age`)) AS `Project2` - ORDER BY -`Project2`.`LastName` ASC, -`Project2`.`FirstName` ASC - - - SELECT -`Project1`.`Id`, -`Project1`.`Name`, -`Project1`.`Pages`, -`Project1`.`Id1`, -`Project1`.`Name1`, -`Project1`.`Age`, -`Project1`.`Id2`, -`Project1`.`Name2`, -`Project1`.`C1`, -`Project1`.`Id3`, -`Project1`.`Name3`, -`Project1`.`Pages1`, -`Project1`.`Author_id`, -`Project1`.`Publisher_id` -FROM (SELECT -`Extent1`.`Id`, -`Extent1`.`Name`, -`Extent1`.`Pages`, -`Extent2`.`Id` AS `Id1`, -`Extent2`.`Name` AS `Name1`, -`Extent2`.`Age`, -`Extent3`.`id` AS `Id2`, -`Extent3`.`name` AS `Name2`, -`Extent4`.`Id` AS `Id3`, -`Extent4`.`Name` AS `Name3`, -`Extent4`.`Pages` AS `Pages1`, -`Extent4`.`Author_id`, -`Extent4`.`Publisher_id`, -CASE WHEN (`Extent4`.`Id` IS NULL) THEN (NULL) ELSE (1) END AS `C1` -FROM `Books` AS `Extent1` INNER JOIN `Authors` AS `Extent2` ON `Extent1`.`Author_id` = `Extent2`.`Id` INNER JOIN `Publishers` AS `Extent3` ON `Extent1`.`Publisher_id` = `Extent3`.`id` LEFT OUTER JOIN `Books` AS `Extent4` ON `Extent4`.`Publisher_id` = `Extent1`.`Publisher_id`) AS `Project1` - ORDER BY -`Project1`.`Id` ASC, -`Project1`.`Id1` ASC, -`Project1`.`Id2` ASC, -`Project1`.`C1` ASC - - - SELECT -`Extent1`.`Id`, -`Extent1`.`Name`, -`Join1`.`Id` AS `C1`, -`Join1`.`Name` AS `C2`, -`Join1`.`ID1` AS `C3`, -`Join1`.`NAME1` AS `C4` -FROM `Companies` AS `Extent1` INNER JOIN (SELECT -`UnionAll1`.`Id`, -`UnionAll1`.`Name`, -`UnionAll2`.`Id` AS `ID1`, -`UnionAll2`.`Name` AS `NAME1` -FROM ((SELECT -`Extent2`.`Id`, -`Extent2`.`Name` -FROM `Toys` AS `Extent2`) UNION ALL (SELECT -`Extent3`.`Id`, -`Extent3`.`Name` -FROM `Shops` AS `Extent3`)) AS `UnionAll1` INNER JOIN ((SELECT -`Extent4`.`Id`, -`Extent4`.`Name` -FROM `Authors` AS `Extent4`) UNION ALL (SELECT -`Extent5`.`Id`, -`Extent5`.`Name` -FROM `Books` AS `Extent5`)) AS `UnionAll2` ON `UnionAll1`.`Id` = `UnionAll2`.`Id`) AS `Join1` ON `Extent1`.`Id` = `Join1`.`Id` - - - SELECT -`Extent1`.`Id`, -`Extent1`.`EmployeeID`, -`Extent1`.`LastName`, -`Extent1`.`FirstName`, -`Extent1`.`BirthTime`, -`Extent1`.`Weight`, -`Extent1`.`LastModified` -FROM `EmployeeChildren` AS `Extent1` INNER JOIN (SELECT -`Extent2`.`Id`, -`Extent2`.`LastName`, -`Extent2`.`FirstName`, -`Extent2`.`Age`, -`Extent3`.`EmployeeId`, -`Extent3`.`Salary` -FROM `Employees` AS `Extent2` LEFT OUTER JOIN `SalariedEmployees` AS `Extent3` ON `Extent2`.`Id` = `Extent3`.`EmployeeId`) AS `Join1` ON `Extent1`.`EmployeeID` = `Join1`.`Id` - WHERE `Extent1`.`Weight` > 7 - - - SELECT -`Extent1`.`Id`, -`Extent1`.`Name`, -`Join1`.`Id` AS `Id1`, -`Join1`.`Name` AS `Name1`, -`Join1`.`Id1` AS `Id2`, -`Join1`.`Name1` AS `Name2` -FROM `Companies` AS `Extent1` INNER JOIN (SELECT -`Extent2`.`Id`, -`Extent2`.`Name`, -`Extent2`.`Age`, -`Extent3`.`Id` AS `Id1`, -`Extent3`.`Name` AS `Name1`, -`Extent3`.`Pages`, -`Extent3`.`Author_id`, -`Extent3`.`Publisher_id` -FROM `Authors` AS `Extent2` INNER JOIN `Books` AS `Extent3` ON `Extent2`.`Id` = `Extent3`.`Id`) AS `Join1` ON `Extent1`.`Id` = `Join1`.`Id` - - - SELECT `Project1`.`Id`, - `Project1`.`Name`, - `Project1`.`C2` AS `C1`, - `Project1`.`Id1`, - `Project1`.`AuthorId`, - `Project1`.`C1` AS `C2`, - `Project1`.`Id2`, - `Project1`.`Title` -FROM (SELECT `Extent1`.`Id`, - `Extent1`.`Name`, - `Join2`.`Id` AS `Id1`, - `Join2`.`AuthorId`, - `Join2`.`Id1` AS `Id2`, - `Join2`.`Title`, - CASE - WHEN ( `Join2`.`Id` IS NULL ) THEN ( NULL ) - WHEN ( `Join2`.`BookId` IS NULL ) THEN ( NULL ) - ELSE ( 1 ) - END AS `C1`, - CASE - WHEN ( `Join2`.`Id` IS NULL ) THEN ( NULL ) - ELSE ( 1 ) - END AS `C2` - FROM `myauthors` AS `Extent1` - LEFT OUTER JOIN (SELECT `Extent2`.`Id`, - `Extent2`.`AuthorId`, - `Join1`.`BookId`, - `Join1`.`EditionId`, - `Join1`.`Id` AS `Id1`, - `Join1`.`Title` - FROM `mybooks` AS `Extent2` - LEFT OUTER JOIN (SELECT - `Extent3`.`BookId`, - `Extent3`.`EditionId`, - `Extent4`.`Id`, - `Extent4`.`Title` - FROM - `myeditionsinmybooks` AS - `Extent3` - INNER JOIN `myeditions` - AS - `Extent4` - ON `Extent4`.`Id` = - `Extent3`.`EditionId`) AS - `Join1` - ON `Extent2`.`Id` = `Join1`.`BookId`) AS `Join2` - ON `Extent1`.`Id` = `Join2`.`AuthorId`) AS `Project1` -ORDER BY `Project1`.`Id` ASC, - `Project1`.`C2` ASC, - `Project1`.`Id1` ASC, - `Project1`.`C1` ASC - - - SELECT -`Extent1`.`Id`, -`Extent1`.`Name`, -`Extent1`.`Address`, -`Extent1`.`City`, -`Extent1`.`State`, -`Extent1`.`ZipCode` -FROM `Shops` AS `Extent1` INNER JOIN (SELECT -MAX(`Extent2`.`ShopId`) AS `A1` -FROM `Orders` AS `Extent2`) AS `GroupBy1` ON `Extent1`.`Id` = `GroupBy1`.`A1` - - - SELECT -`Extent1`.`Id`, -`Extent1`.`Name`, -`Extent1`.`Address`, -`Extent1`.`City`, -`Extent1`.`State`, -`Extent1`.`ZipCode` -FROM `Shops` AS `Extent1` INNER JOIN (SELECT -MAX(`Extent2`.`ShopId`) AS `A1` -FROM `Orders` AS `Extent2`) AS `GroupBy1` ON `Extent1`.`Id` = `GroupBy1`.`A1` - - - SELECT -`GroupBy1`.`A1` AS `C1` -FROM (SELECT -MAX(`Extent1`.`MinAge`) AS `A1` -FROM `Toys` AS `Extent1`) AS `GroupBy1` - - - SELECT -`GroupBy1`.`A1` AS `C1` -FROM (SELECT -`Extent1`.`ShopId` AS `K1`, -MAX(`Extent1`.`Freight`) AS `A1` -FROM `Orders` AS `Extent1` - GROUP BY -`Extent1`.`ShopId`) AS `GroupBy1` - - - SELECT -1 AS `C1`, -`GroupBy1`.`A1` AS `C2` -FROM (SELECT -MAX(`Extent1`.`Freight`) AS `A1` -FROM `Orders` AS `Extent1` - WHERE `Extent1`.`ShopId` = 1) AS `GroupBy1` - - - SELECT -`GroupBy1`.`A1` AS `C1` -FROM (SELECT -MIN(`Extent1`.`MinAge`) AS `A1` -FROM `Toys` AS `Extent1`) AS `GroupBy1` - - - SELECT -`GroupBy1`.`A1` AS `C1` -FROM (SELECT -`Extent1`.`ShopId` AS `K1`, -MIN(`Extent1`.`Freight`) AS `A1` -FROM `Orders` AS `Extent1` - GROUP BY -`Extent1`.`ShopId`) AS `GroupBy1` - - - SELECT -1 AS `C1`, -`GroupBy1`.`A1` AS `C2` -FROM (SELECT -MIN(`Extent1`.`Freight`) AS `A1` -FROM `Orders` AS `Extent1` - WHERE `Extent1`.`ShopId` = 2) AS `GroupBy1` - - - SELECT -`Extent1`.`Id`, -`Extent1`.`Name`, -`Extent1`.`DateBegan`, -`Extent1`.`NumEmployees`, -`Extent1`.`Address`, -`Extent1`.`City`, -`Extent1`.`State`, -`Extent1`.`ZipCode` -FROM `Companies` AS `Extent1` - ORDER BY -`Extent1`.`Name` ASC - - - SELECT -`Extent1`.`Id`, -`Extent1`.`Name`, -`Extent1`.`DateBegan`, -`Extent1`.`NumEmployees`, -`Extent1`.`Address`, -`Extent1`.`City`, -`Extent1`.`State`, -`Extent1`.`ZipCode` -FROM `Companies` AS `Extent1` - WHERE `Extent1`.`NumEmployees` > 100 - ORDER BY -`Extent1`.`Name` ASC - - - SELECT -`Extent1`.`Id`, -`Extent1`.`LastName` -FROM `Employees` AS `Extent1` LEFT OUTER JOIN `SalariedEmployees` AS `Extent2` ON `Extent1`.`Id` = `Extent2`.`EmployeeId` - WHERE `Extent1`.`Age` > 20 - - - SELECT -`Extent1`.`Id`, -`Extent1`.`Name`, -`Extent2`.`Name` AS `Name1` -FROM `Books` AS `Extent1` INNER JOIN `Authors` AS `Extent2` ON `Extent1`.`Author_id` = `Extent2`.`Id` - - - SELECT -`Extent1`.`Id`, -`Extent1`.`Name`, -`Extent2`.`Name` AS `Name1` -FROM `Books` AS `Extent1` INNER JOIN `Authors` AS `Extent2` ON `Extent1`.`Author_id` = `Extent2`.`Id` - WHERE `Extent1`.`Pages` > 300 - - - SELECT -`Extent1`.`Id`, -`Extent1`.`Name`, -`Extent1`.`MinAge`, -`Extent1`.`SupplierId` -FROM `Toys` AS `Extent1` - - - SELECT -`Extent1`.`Id`, -`Extent1`.`Name`, -`Extent1`.`MinAge`, -`Extent1`.`SupplierId` -FROM `Toys` AS `Extent1` - WHERE `Extent1`.`MinAge` = 4 - - - SELECT -`Extent1`.`Id`, -`Extent1`.`Name`, -`Extent1`.`MinAge`, -`Extent1`.`SupplierId` -FROM `Toys` AS `Extent1` - WHERE `Extent1`.`MinAge` > @age - - - SELECT -`Extent1`.`Id`, -`Extent1`.`Name`, -`Extent1`.`DateBegan`, -`Extent1`.`NumEmployees`, -`Extent1`.`Address`, -`Extent1`.`City`, -`Extent1`.`State`, -`Extent1`.`ZipCode` -FROM `Companies` AS `Extent1` - ORDER BY -`Extent1`.`Id` ASC LIMIT 3,18446744073709551615 - - - SELECT -`Extent1`.`Id`, -`Extent1`.`Name`, -`Extent1`.`DateBegan`, -`Extent1`.`NumEmployees`, -`Extent1`.`Address`, -`Extent1`.`City`, -`Extent1`.`State`, -`Extent1`.`ZipCode` -FROM `Companies` AS `Extent1` - ORDER BY -`Extent1`.`Id` ASC LIMIT 2,2 - - - SELECT -`Extent1`.`Id`, -`Extent1`.`Name`, -`Extent1`.`DateBegan`, -`Extent1`.`NumEmployees`, -`Extent1`.`Address`, -`Extent1`.`City`, -`Extent1`.`State`, -`Extent1`.`ZipCode` -FROM `Companies` AS `Extent1` - ORDER BY -`Extent1`.`Name` DESC LIMIT 2,2 - - - SELECT -`Project2`.`C1`, -`Project2`.`Id`, -`Project2`.`LastName`, -`Project2`.`FirstName`, -`Project2`.`Age`, -`Project2`.`C2` -FROM (SELECT -`Extent1`.`Id`, -`Extent1`.`LastName`, -`Extent1`.`FirstName`, -`Extent1`.`Age`, -CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (@gp2) ELSE (@gp3) END AS `C1`, -CASE WHEN (NOT ((`Project1`.`C1` = 1) AND (`Project1`.`C1` IS NOT NULL))) THEN (NULL) ELSE (`Project1`.`Salary`) END AS `C2` -FROM `Employees` AS `Extent1` LEFT OUTER JOIN (SELECT -`Extent2`.`EmployeeId`, -`Extent2`.`Salary`, -1 AS `C1` -FROM `SalariedEmployees` AS `Extent2`) AS `Project1` ON `Extent1`.`Id` = `Project1`.`EmployeeId` - WHERE `Extent1`.`FirstName` LIKE @gp1) AS `Project2` - ORDER BY -`Project2`.`FirstName` ASC - - - - - - SELECT -`GroupBy1`.`A1` AS `C1` -FROM (SELECT -SUM(`Extent1`.`MinAge`) AS `A1` -FROM `Toys` AS `Extent1`) AS `GroupBy1` - - - SELECT -`GroupBy1`.`A1` AS `C1` -FROM (SELECT -`Extent1`.`ShopId` AS `K1`, -SUM(`Extent1`.`Freight`) AS `A1` -FROM `Orders` AS `Extent1` - GROUP BY -`Extent1`.`ShopId`) AS `GroupBy1` - - - SELECT -`GroupBy1`.`A1` AS `C1` -FROM (SELECT -SUM(`Extent1`.`Freight`) AS `A1` -FROM `Orders` AS `Extent1` - WHERE `Extent1`.`ShopId` = 2) AS `GroupBy1` - - - SELECT - `Id`, - `Name`, - `Developer` - FROM `vivideogametitle` LIMIT 10 - - - SELECT -`Id`, -`Name`, -`DateBegan`, -`NumEmployees`, -`Address`, -`City`, -`State`, -`ZipCode` -FROM `Companies` LIMIT 2 - - - SELECT -`UnionAll1`.`Id` AS `C1`, -`UnionAll1`.`Id1` AS `C2`, -`UnionAll1`.`Name` AS `C3` -FROM ((SELECT -`Extent1`.`Id`, -`Extent1`.`Id` AS `Id1`, -`Extent1`.`Name` -FROM `Toys` AS `Extent1`) UNION ALL (SELECT -`Extent2`.`Id`, -`Extent2`.`Id` AS `Id1`, -`Extent2`.`Name` -FROM `Companies` AS `Extent2`)) AS `UnionAll1` - - - SELECT -`UnionAll1`.`Id` AS `C1`, -`UnionAll1`.`Name` AS `C2`, -`UnionAll1`.`MinAge` AS `C3`, -`UnionAll1`.`SupplierId` AS `C4` -FROM ((SELECT -`Extent1`.`Id`, -`Extent1`.`Name`, -`Extent1`.`MinAge`, -`Extent1`.`SupplierId` -FROM `Toys` AS `Extent1`) UNION ALL (SELECT -`Id`, -`Name`, -`MinAge`, -`SupplierId` -FROM `Toys` LIMIT 0)) AS `UnionAll1` - - - SELECT - `UnionAll1`.`Id` AS `C1`, - `UnionAll1`.`Name` AS `C2`, - `UnionAll1`.`MinAge` AS `C3`, - `UnionAll1`.`SupplierId` AS `C4` - FROM ((SELECT - `Id`, - `Name`, - `MinAge`, - `SupplierId` - FROM `Toys` LIMIT 0) UNION ALL (SELECT - `Extent2`.`Id`, - `Extent2`.`Name`, - `Extent2`.`MinAge`, - `Extent2`.`SupplierId` - FROM `Toys` AS `Extent2`)) AS `UnionAll1` - - - UPDATE `Products` SET `Name`='Acme 2' WHERE `Id` = 1; SELECT `CreatedDate` FROM `Products` WHERE row_count() > 0 and `Id` = 1 - - - SELECT -`Extent1`.`Id`, -`Extent1`.`Name`, -`Extent1`.`DateBegan`, -`Extent1`.`NumEmployees`, -`Extent1`.`Address`, -`Extent1`.`City`, -`Extent1`.`State`, -`Extent1`.`ZipCode` -FROM `Companies` AS `Extent1` - WHERE `Extent1`.`City` = @gp1 - - - SELECT -`Extent1`.`Id`, -`Extent1`.`Name`, -`Extent1`.`MinAge`, -`Extent1`.`SupplierId` -FROM `Toys` AS `Extent1` INNER JOIN `Companies` AS `Extent2` ON `Extent1`.`SupplierId` = `Extent2`.`Id` - WHERE `Extent2`.`State` = @gp1 - - - SELECT -`Filter1`.`Id`, -`Filter1`.`Name`, -`Filter1`.`MinAge`, -`Filter1`.`SupplierId` -FROM (SELECT -`Extent1`.`Id`, -`Extent1`.`SupplierId`, -`Extent1`.`Name`, -`Extent1`.`MinAge`, -`Extent2`.`Id` AS `Id1`, -`Extent2`.`Name` AS `Name1`, -`Extent2`.`DateBegan`, -`Extent2`.`NumEmployees`, -`Extent2`.`Address`, -`Extent2`.`City`, -`Extent2`.`State`, -`Extent2`.`ZipCode` -FROM `Toys` AS `Extent1` INNER JOIN `Companies` AS `Extent2` ON `Extent1`.`SupplierId` = `Extent2`.`Id` - WHERE `Extent2`.`State` != @gp1) AS `Filter1` LEFT OUTER JOIN `Companies` AS `Extent3` ON `Filter1`.`SupplierId` = `Extent3`.`Id` - WHERE `Extent3`.`State` != @gp2 - - \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Models/TestModel.Designer.cs b/Tests/MySql.EntityFramework6.Basic.Tests/Models/TestModel.Designer.cs deleted file mode 100644 index ca51a15c1..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Models/TestModel.Designer.cs +++ /dev/null @@ -1,2456 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated from a template. -// -// Manual changes to this file may cause unexpected behavior in your application. -// Manual changes to this file will be overwritten if the code is regenerated. -// -//------------------------------------------------------------------------------ - -using System; -using System.ComponentModel; -using System.Data.Entity.Core.Objects.DataClasses; -using System.Runtime.Serialization; -using System.Xml.Serialization; -using System.Data.Entity.Core.EntityClient; -using System.Data.Entity.Core.Objects; - - -[assembly: EdmSchemaAttribute()] -#region EDM Relationship Metadata -[assembly: EdmRelationshipAttribute("testModel", "FK_Toys_Supplier", "Supplier", System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.One, typeof(MySql.Data.Entity.Tests.Company), "Toys", System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(MySql.Data.Entity.Tests.Toy))] -[assembly: EdmRelationshipAttribute("testModel", "FK_Orders_Shop", "Shop", System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.One, typeof(MySql.Data.Entity.Tests.Shop), "Orders", System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(MySql.Data.Entity.Tests.Order))] -[assembly: EdmRelationshipAttribute("testModel", "FK_Books_Authors", "Authors", System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.One, typeof(MySql.Data.Entity.Tests.Author), "Books", System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(MySql.Data.Entity.Tests.Book))] -[assembly: EdmRelationshipAttribute("testModel", "FK_Books_Publishers", "Publishers", System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.One, typeof(MySql.Data.Entity.Tests.Publisher), "Books", System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(MySql.Data.Entity.Tests.Book))] -#endregion - -namespace MySql.Data.Entity.Tests -{ - #region Contexts - - /// - /// No Metadata Documentation available. - /// - public partial class testEntities : ObjectContext - { - #region Constructors - - /// - /// Initializes a new testEntities object using the connection string found in the 'testEntities' section of the application configuration file. - /// - public testEntities() : base("name=testEntities", "testEntities") - { - OnContextCreated(); - } - - /// - /// Initialize a new testEntities object. - /// - public testEntities(string connectionString) : base(connectionString, "testEntities") - { - OnContextCreated(); - } - - /// - /// Initialize a new testEntities object. - /// - public testEntities(EntityConnection connection) : base(connection, "testEntities") - { - OnContextCreated(); - } - - #endregion - - #region Partial Methods - - partial void OnContextCreated(); - - #endregion - - #region ObjectSet Properties - - /// - /// No Metadata Documentation available. - /// - public ObjectSet Employees - { - get - { - if ((_Employees == null)) - { - _Employees = base.CreateObjectSet("Employees"); - } - return _Employees; - } - } - private ObjectSet _Employees; - - /// - /// No Metadata Documentation available. - /// - public ObjectSet Children - { - get - { - if ((_Children == null)) - { - _Children = base.CreateObjectSet("Children"); - } - return _Children; - } - } - private ObjectSet _Children; - - /// - /// No Metadata Documentation available. - /// - public ObjectSet Companies - { - get - { - if ((_Companies == null)) - { - _Companies = base.CreateObjectSet("Companies"); - } - return _Companies; - } - } - private ObjectSet _Companies; - - /// - /// No Metadata Documentation available. - /// - public ObjectSet Toys - { - get - { - if ((_Toys == null)) - { - _Toys = base.CreateObjectSet("Toys"); - } - return _Toys; - } - } - private ObjectSet _Toys; - - /// - /// No Metadata Documentation available. - /// - public ObjectSet Shops - { - get - { - if ((_Shops == null)) - { - _Shops = base.CreateObjectSet("Shops"); - } - return _Shops; - } - } - private ObjectSet _Shops; - - /// - /// No Metadata Documentation available. - /// - public ObjectSet Orders - { - get - { - if ((_Orders == null)) - { - _Orders = base.CreateObjectSet("Orders"); - } - return _Orders; - } - } - private ObjectSet _Orders; - - /// - /// No Metadata Documentation available. - /// - public ObjectSet Books - { - get - { - if ((_Books == null)) - { - _Books = base.CreateObjectSet("Books"); - } - return _Books; - } - } - private ObjectSet _Books; - - /// - /// No Metadata Documentation available. - /// - public ObjectSet Authors - { - get - { - if ((_Authors == null)) - { - _Authors = base.CreateObjectSet("Authors"); - } - return _Authors; - } - } - private ObjectSet _Authors; - - /// - /// No Metadata Documentation available. - /// - public ObjectSet Publishers - { - get - { - if ((_Publishers == null)) - { - _Publishers = base.CreateObjectSet("Publishers"); - } - return _Publishers; - } - } - private ObjectSet _Publishers; - - /// - /// No Metadata Documentation available. - /// - public ObjectSet DataTypeTests - { - get - { - if ((_DataTypeTests == null)) - { - _DataTypeTests = base.CreateObjectSet("DataTypeTests"); - } - return _DataTypeTests; - } - } - private ObjectSet _DataTypeTests; - - /// - /// No Metadata Documentation available. - /// - public ObjectSet Computers - { - get - { - if ((_Computers == null)) - { - _Computers = base.CreateObjectSet("Computers"); - } - return _Computers; - } - } - private ObjectSet _Computers; - - /// - /// No Metadata Documentation available. - /// - public ObjectSet Products - { - get - { - if ((_Products == null)) - { - _Products = base.CreateObjectSet("Products"); - } - return _Products; - } - } - private ObjectSet _Products; - - #endregion - - #region AddTo Methods - - /// - /// Deprecated Method for adding a new object to the Employees EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead. - /// - public void AddToEmployees(Employee employee) - { - base.AddObject("Employees", employee); - } - - /// - /// Deprecated Method for adding a new object to the Children EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead. - /// - public void AddToChildren(Child child) - { - base.AddObject("Children", child); - } - - /// - /// Deprecated Method for adding a new object to the Companies EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead. - /// - public void AddToCompanies(Company company) - { - base.AddObject("Companies", company); - } - - /// - /// Deprecated Method for adding a new object to the Toys EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead. - /// - public void AddToToys(Toy toy) - { - base.AddObject("Toys", toy); - } - - /// - /// Deprecated Method for adding a new object to the Shops EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead. - /// - public void AddToShops(Shop shop) - { - base.AddObject("Shops", shop); - } - - /// - /// Deprecated Method for adding a new object to the Orders EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead. - /// - public void AddToOrders(Order order) - { - base.AddObject("Orders", order); - } - - /// - /// Deprecated Method for adding a new object to the Books EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead. - /// - public void AddToBooks(Book book) - { - base.AddObject("Books", book); - } - - /// - /// Deprecated Method for adding a new object to the Authors EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead. - /// - public void AddToAuthors(Author author) - { - base.AddObject("Authors", author); - } - - /// - /// Deprecated Method for adding a new object to the Publishers EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead. - /// - public void AddToPublishers(Publisher publisher) - { - base.AddObject("Publishers", publisher); - } - - /// - /// Deprecated Method for adding a new object to the DataTypeTests EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead. - /// - public void AddToDataTypeTests(DataTypeTest dataTypeTest) - { - base.AddObject("DataTypeTests", dataTypeTest); - } - - /// - /// Deprecated Method for adding a new object to the Computers EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead. - /// - public void AddToComputers(Computer computer) - { - base.AddObject("Computers", computer); - } - - /// - /// Deprecated Method for adding a new object to the Products EntitySet. Consider using the .Add method of the associated ObjectSet<T> property instead. - /// - public void AddToProducts(Product product) - { - base.AddObject("Products", product); - } - - #endregion - - } - - #endregion - - #region Entities - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="testModel", Name="Author")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - public partial class Author : EntityObject - { - #region Factory Method - - /// - /// Create a new Author object. - /// - /// Initial value of the Id property. - /// Initial value of the Name property. - public static Author CreateAuthor(global::System.Int32 id, global::System.String name) - { - Author author = new Author(); - author.Id = id; - author.Name = name; - return author; - } - - #endregion - - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int32 Id - { - get - { - return _Id; - } - set - { - if (_Id != value) - { - OnIdChanging(value); - ReportPropertyChanging("Id"); - _Id = StructuralObject.SetValidValue(value, "Id"); - ReportPropertyChanged("Id"); - OnIdChanged(); - } - } - } - private global::System.Int32 _Id; - partial void OnIdChanging(global::System.Int32 value); - partial void OnIdChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.String Name - { - get - { - return _Name; - } - set - { - OnNameChanging(value); - ReportPropertyChanging("Name"); - _Name = StructuralObject.SetValidValue(value, false, "Name"); - ReportPropertyChanged("Name"); - OnNameChanged(); - } - } - private global::System.String _Name; - partial void OnNameChanging(global::System.String value); - partial void OnNameChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public Nullable Age - { - get - { - return _Age; - } - set - { - OnAgeChanging(value); - ReportPropertyChanging("Age"); - _Age = StructuralObject.SetValidValue(value, "Age"); - ReportPropertyChanged("Age"); - OnAgeChanged(); - } - } - private Nullable _Age; - partial void OnAgeChanging(Nullable value); - partial void OnAgeChanged(); - - #endregion - - #region Navigation Properties - - /// - /// No Metadata Documentation available. - /// - [XmlIgnoreAttribute()] - [SoapIgnoreAttribute()] - [DataMemberAttribute()] - [EdmRelationshipNavigationPropertyAttribute("testModel", "FK_Books_Authors", "Books")] - public EntityCollection Books - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection("testModel.FK_Books_Authors", "Books"); - } - set - { - if ((value != null)) - { - ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection("testModel.FK_Books_Authors", "Books", value); - } - } - } - - #endregion - - } - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="testModel", Name="Book")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - public partial class Book : EntityObject - { - #region Factory Method - - /// - /// Create a new Book object. - /// - /// Initial value of the Id property. - /// Initial value of the Name property. - /// Initial value of the Pages property. - public static Book CreateBook(global::System.Int32 id, global::System.String name, global::System.Int32 pages) - { - Book book = new Book(); - book.Id = id; - book.Name = name; - book.Pages = pages; - return book; - } - - #endregion - - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int32 Id - { - get - { - return _Id; - } - set - { - if (_Id != value) - { - OnIdChanging(value); - ReportPropertyChanging("Id"); - _Id = StructuralObject.SetValidValue(value, "Id"); - ReportPropertyChanged("Id"); - OnIdChanged(); - } - } - } - private global::System.Int32 _Id; - partial void OnIdChanging(global::System.Int32 value); - partial void OnIdChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.String Name - { - get - { - return _Name; - } - set - { - OnNameChanging(value); - ReportPropertyChanging("Name"); - _Name = StructuralObject.SetValidValue(value, false, "Name"); - ReportPropertyChanged("Name"); - OnNameChanged(); - } - } - private global::System.String _Name; - partial void OnNameChanging(global::System.String value); - partial void OnNameChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int32 Pages - { - get - { - return _Pages; - } - set - { - OnPagesChanging(value); - ReportPropertyChanging("Pages"); - _Pages = StructuralObject.SetValidValue(value, "Pages"); - ReportPropertyChanged("Pages"); - OnPagesChanged(); - } - } - private global::System.Int32 _Pages; - partial void OnPagesChanging(global::System.Int32 value); - partial void OnPagesChanged(); - - #endregion - - #region Navigation Properties - - /// - /// No Metadata Documentation available. - /// - [XmlIgnoreAttribute()] - [SoapIgnoreAttribute()] - [DataMemberAttribute()] - [EdmRelationshipNavigationPropertyAttribute("testModel", "FK_Books_Authors", "Authors")] - public Author Author - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("testModel.FK_Books_Authors", "Authors").Value; - } - set - { - ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("testModel.FK_Books_Authors", "Authors").Value = value; - } - } - /// - /// No Metadata Documentation available. - /// - [BrowsableAttribute(false)] - [DataMemberAttribute()] - public EntityReference AuthorReference - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("testModel.FK_Books_Authors", "Authors"); - } - set - { - if ((value != null)) - { - ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference("testModel.FK_Books_Authors", "Authors", value); - } - } - } - - /// - /// No Metadata Documentation available. - /// - [XmlIgnoreAttribute()] - [SoapIgnoreAttribute()] - [DataMemberAttribute()] - [EdmRelationshipNavigationPropertyAttribute("testModel", "FK_Books_Publishers", "Publishers")] - public Publisher Publisher - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("testModel.FK_Books_Publishers", "Publishers").Value; - } - set - { - ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("testModel.FK_Books_Publishers", "Publishers").Value = value; - } - } - /// - /// No Metadata Documentation available. - /// - [BrowsableAttribute(false)] - [DataMemberAttribute()] - public EntityReference PublisherReference - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("testModel.FK_Books_Publishers", "Publishers"); - } - set - { - if ((value != null)) - { - ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference("testModel.FK_Books_Publishers", "Publishers", value); - } - } - } - - #endregion - - } - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="testModel", Name="Child")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - public partial class Child : EntityObject - { - #region Factory Method - - /// - /// Create a new Child object. - /// - /// Initial value of the Id property. - /// Initial value of the EmployeeID property. - /// Initial value of the LastName property. - /// Initial value of the FirstName property. - /// Initial value of the Modified property. - public static Child CreateChild(global::System.Int64 id, global::System.Int32 employeeID, global::System.String lastName, global::System.String firstName, global::System.DateTime modified) - { - Child child = new Child(); - child.Id = id; - child.EmployeeID = employeeID; - child.LastName = lastName; - child.FirstName = firstName; - child.Modified = modified; - return child; - } - - #endregion - - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int64 Id - { - get - { - return _Id; - } - set - { - if (_Id != value) - { - OnIdChanging(value); - ReportPropertyChanging("Id"); - _Id = StructuralObject.SetValidValue(value, "Id"); - ReportPropertyChanged("Id"); - OnIdChanged(); - } - } - } - private global::System.Int64 _Id; - partial void OnIdChanging(global::System.Int64 value); - partial void OnIdChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int32 EmployeeID - { - get - { - return _EmployeeID; - } - set - { - OnEmployeeIDChanging(value); - ReportPropertyChanging("EmployeeID"); - _EmployeeID = StructuralObject.SetValidValue(value, "EmployeeID"); - ReportPropertyChanged("EmployeeID"); - OnEmployeeIDChanged(); - } - } - private global::System.Int32 _EmployeeID; - partial void OnEmployeeIDChanging(global::System.Int32 value); - partial void OnEmployeeIDChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.String LastName - { - get - { - return _LastName; - } - set - { - OnLastNameChanging(value); - ReportPropertyChanging("LastName"); - _LastName = StructuralObject.SetValidValue(value, false, "LastName"); - ReportPropertyChanged("LastName"); - OnLastNameChanged(); - } - } - private global::System.String _LastName; - partial void OnLastNameChanging(global::System.String value); - partial void OnLastNameChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.String FirstName - { - get - { - return _FirstName; - } - set - { - OnFirstNameChanging(value); - ReportPropertyChanging("FirstName"); - _FirstName = StructuralObject.SetValidValue(value, false, "FirstName"); - ReportPropertyChanged("FirstName"); - OnFirstNameChanged(); - } - } - private global::System.String _FirstName; - partial void OnFirstNameChanging(global::System.String value); - partial void OnFirstNameChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public Nullable BirthTime - { - get - { - return _BirthTime; - } - set - { - OnBirthTimeChanging(value); - ReportPropertyChanging("BirthTime"); - _BirthTime = StructuralObject.SetValidValue(value, "BirthTime"); - ReportPropertyChanged("BirthTime"); - OnBirthTimeChanged(); - } - } - private Nullable _BirthTime; - partial void OnBirthTimeChanging(Nullable value); - partial void OnBirthTimeChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public Nullable BirthWeight - { - get - { - return _BirthWeight; - } - set - { - OnBirthWeightChanging(value); - ReportPropertyChanging("BirthWeight"); - _BirthWeight = StructuralObject.SetValidValue(value, "BirthWeight"); - ReportPropertyChanged("BirthWeight"); - OnBirthWeightChanged(); - } - } - private Nullable _BirthWeight; - partial void OnBirthWeightChanging(Nullable value); - partial void OnBirthWeightChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.DateTime Modified - { - get - { - return _Modified; - } - set - { - OnModifiedChanging(value); - ReportPropertyChanging("Modified"); - _Modified = StructuralObject.SetValidValue(value, "Modified"); - ReportPropertyChanged("Modified"); - OnModifiedChanged(); - } - } - private global::System.DateTime _Modified; - partial void OnModifiedChanging(global::System.DateTime value); - partial void OnModifiedChanged(); - - #endregion - - } - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="testModel", Name="Company")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - public partial class Company : EntityObject - { - #region Factory Method - - /// - /// Create a new Company object. - /// - /// Initial value of the Id property. - /// Initial value of the Name property. - /// Initial value of the Address property. - public static Company CreateCompany(global::System.Int32 id, global::System.String name, CommonAddress address) - { - Company company = new Company(); - company.Id = id; - company.Name = name; - company.Address = StructuralObject.VerifyComplexObjectIsNotNull(address, "Address"); - return company; - } - - #endregion - - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int32 Id - { - get - { - return _Id; - } - set - { - if (_Id != value) - { - OnIdChanging(value); - ReportPropertyChanging("Id"); - _Id = StructuralObject.SetValidValue(value, "Id"); - ReportPropertyChanged("Id"); - OnIdChanged(); - } - } - } - private global::System.Int32 _Id; - partial void OnIdChanging(global::System.Int32 value); - partial void OnIdChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.String Name - { - get - { - return _Name; - } - set - { - OnNameChanging(value); - ReportPropertyChanging("Name"); - _Name = StructuralObject.SetValidValue(value, false, "Name"); - ReportPropertyChanged("Name"); - OnNameChanged(); - } - } - private global::System.String _Name; - partial void OnNameChanging(global::System.String value); - partial void OnNameChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public Nullable DateBegan - { - get - { - return _DateBegan; - } - set - { - OnDateBeganChanging(value); - ReportPropertyChanging("DateBegan"); - _DateBegan = StructuralObject.SetValidValue(value, "DateBegan"); - ReportPropertyChanged("DateBegan"); - OnDateBeganChanged(); - } - } - private Nullable _DateBegan; - partial void OnDateBeganChanging(Nullable value); - partial void OnDateBeganChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public Nullable NumEmployees - { - get - { - return _NumEmployees; - } - set - { - OnNumEmployeesChanging(value); - ReportPropertyChanging("NumEmployees"); - _NumEmployees = StructuralObject.SetValidValue(value, "NumEmployees"); - ReportPropertyChanged("NumEmployees"); - OnNumEmployeesChanged(); - } - } - private Nullable _NumEmployees; - partial void OnNumEmployeesChanging(Nullable value); - partial void OnNumEmployeesChanged(); - - #endregion - - #region Complex Properties - - /// - /// No Metadata Documentation available. - /// - [EdmComplexPropertyAttribute()] - [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] - [XmlElement(IsNullable=true)] - [SoapElement(IsNullable=true)] - [DataMemberAttribute()] - public CommonAddress Address - { - get - { - _Address = GetValidValue(_Address, "Address", false, _AddressInitialized); - _AddressInitialized = true; - return _Address; - } - set - { - OnAddressChanging(value); - ReportPropertyChanging("Address"); - _Address = SetValidValue(_Address, value, "Address"); - _AddressInitialized = true; - ReportPropertyChanged("Address"); - OnAddressChanged(); - } - } - private CommonAddress _Address; - private bool _AddressInitialized; - partial void OnAddressChanging(CommonAddress value); - partial void OnAddressChanged(); - - #endregion - - #region Navigation Properties - - /// - /// No Metadata Documentation available. - /// - [XmlIgnoreAttribute()] - [SoapIgnoreAttribute()] - [DataMemberAttribute()] - [EdmRelationshipNavigationPropertyAttribute("testModel", "FK_Toys_Supplier", "Toys")] - public EntityCollection Toys - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection("testModel.FK_Toys_Supplier", "Toys"); - } - set - { - if ((value != null)) - { - ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection("testModel.FK_Toys_Supplier", "Toys", value); - } - } - } - - #endregion - - } - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="testModel", Name="Computer")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - [KnownTypeAttribute(typeof(DesktopComputer))] - [KnownTypeAttribute(typeof(LaptopComputer))] - [KnownTypeAttribute(typeof(TabletComputer))] - public abstract partial class Computer : EntityObject - { - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.String Brand - { - get - { - return _Brand; - } - set - { - OnBrandChanging(value); - ReportPropertyChanging("Brand"); - _Brand = StructuralObject.SetValidValue(value, false, "Brand"); - ReportPropertyChanged("Brand"); - OnBrandChanged(); - } - } - private global::System.String _Brand; - partial void OnBrandChanging(global::System.String value); - partial void OnBrandChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int32 Id - { - get - { - return _Id; - } - set - { - if (_Id != value) - { - OnIdChanging(value); - ReportPropertyChanging("Id"); - _Id = StructuralObject.SetValidValue(value, "Id"); - ReportPropertyChanged("Id"); - OnIdChanged(); - } - } - } - private global::System.Int32 _Id; - partial void OnIdChanging(global::System.Int32 value); - partial void OnIdChanged(); - - #endregion - - } - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="testModel", Name="DataTypeTest")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - public partial class DataTypeTest : EntityObject - { - #region Factory Method - - /// - /// Create a new DataTypeTest object. - /// - /// Initial value of the id property. - /// Initial value of the id2 property. - public static DataTypeTest CreateDataTypeTest(global::System.Guid id, global::System.Guid id2) - { - DataTypeTest dataTypeTest = new DataTypeTest(); - dataTypeTest.id = id; - dataTypeTest.id2 = id2; - return dataTypeTest; - } - - #endregion - - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Guid id - { - get - { - return _id; - } - set - { - if (_id != value) - { - OnidChanging(value); - ReportPropertyChanging("id"); - _id = StructuralObject.SetValidValue(value, "id"); - ReportPropertyChanged("id"); - OnidChanged(); - } - } - } - private global::System.Guid _id; - partial void OnidChanging(global::System.Guid value); - partial void OnidChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Guid id2 - { - get - { - return _id2; - } - set - { - Onid2Changing(value); - ReportPropertyChanging("id2"); - _id2 = StructuralObject.SetValidValue(value, "id2"); - ReportPropertyChanged("id2"); - Onid2Changed(); - } - } - private global::System.Guid _id2; - partial void Onid2Changing(global::System.Guid value); - partial void Onid2Changed(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public global::System.String idAsChar - { - get - { - return _idAsChar; - } - set - { - OnidAsCharChanging(value); - ReportPropertyChanging("idAsChar"); - _idAsChar = StructuralObject.SetValidValue(value, true, "idAsChar"); - ReportPropertyChanged("idAsChar"); - OnidAsCharChanged(); - } - } - private global::System.String _idAsChar; - partial void OnidAsCharChanging(global::System.String value); - partial void OnidAsCharChanged(); - - #endregion - - } - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="testModel", Name="DesktopComputer")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - public partial class DesktopComputer : Computer - { - #region Factory Method - - /// - /// Create a new DesktopComputer object. - /// - /// Initial value of the Brand property. - /// Initial value of the Id property. - public static DesktopComputer CreateDesktopComputer(global::System.String brand, global::System.Int32 id) - { - DesktopComputer desktopComputer = new DesktopComputer(); - desktopComputer.Brand = brand; - desktopComputer.Id = id; - return desktopComputer; - } - - #endregion - - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public global::System.String Color - { - get - { - return _Color; - } - set - { - OnColorChanging(value); - ReportPropertyChanging("Color"); - _Color = StructuralObject.SetValidValue(value, true, "Color"); - ReportPropertyChanged("Color"); - OnColorChanged(); - } - } - private global::System.String _Color; - partial void OnColorChanging(global::System.String value); - partial void OnColorChanged(); - - #endregion - - } - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="testModel", Name="Employee")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - [KnownTypeAttribute(typeof(SalariedEmployee))] - public partial class Employee : EntityObject - { - #region Factory Method - - /// - /// Create a new Employee object. - /// - /// Initial value of the Id property. - /// Initial value of the LastName property. - /// Initial value of the FirstName property. - public static Employee CreateEmployee(global::System.Int32 id, global::System.String lastName, global::System.String firstName) - { - Employee employee = new Employee(); - employee.Id = id; - employee.LastName = lastName; - employee.FirstName = firstName; - return employee; - } - - #endregion - - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int32 Id - { - get - { - return _Id; - } - set - { - if (_Id != value) - { - OnIdChanging(value); - ReportPropertyChanging("Id"); - _Id = StructuralObject.SetValidValue(value, "Id"); - ReportPropertyChanged("Id"); - OnIdChanged(); - } - } - } - private global::System.Int32 _Id; - partial void OnIdChanging(global::System.Int32 value); - partial void OnIdChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.String LastName - { - get - { - return _LastName; - } - set - { - OnLastNameChanging(value); - ReportPropertyChanging("LastName"); - _LastName = StructuralObject.SetValidValue(value, false, "LastName"); - ReportPropertyChanged("LastName"); - OnLastNameChanged(); - } - } - private global::System.String _LastName; - partial void OnLastNameChanging(global::System.String value); - partial void OnLastNameChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.String FirstName - { - get - { - return _FirstName; - } - set - { - OnFirstNameChanging(value); - ReportPropertyChanging("FirstName"); - _FirstName = StructuralObject.SetValidValue(value, false, "FirstName"); - ReportPropertyChanged("FirstName"); - OnFirstNameChanged(); - } - } - private global::System.String _FirstName; - partial void OnFirstNameChanging(global::System.String value); - partial void OnFirstNameChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public Nullable Age - { - get - { - return _Age; - } - set - { - OnAgeChanging(value); - ReportPropertyChanging("Age"); - _Age = StructuralObject.SetValidValue(value, "Age"); - ReportPropertyChanged("Age"); - OnAgeChanged(); - } - } - private Nullable _Age; - partial void OnAgeChanging(Nullable value); - partial void OnAgeChanged(); - - #endregion - - } - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="testModel", Name="LaptopComputer")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - public partial class LaptopComputer : Computer - { - #region Factory Method - - /// - /// Create a new LaptopComputer object. - /// - /// Initial value of the Brand property. - /// Initial value of the Id property. - public static LaptopComputer CreateLaptopComputer(global::System.String brand, global::System.Int32 id) - { - LaptopComputer laptopComputer = new LaptopComputer(); - laptopComputer.Brand = brand; - laptopComputer.Id = id; - return laptopComputer; - } - - #endregion - - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public Nullable IsCertified - { - get - { - return _IsCertified; - } - set - { - OnIsCertifiedChanging(value); - ReportPropertyChanging("IsCertified"); - _IsCertified = StructuralObject.SetValidValue(value, "IsCertified"); - ReportPropertyChanged("IsCertified"); - OnIsCertifiedChanged(); - } - } - private Nullable _IsCertified; - partial void OnIsCertifiedChanging(Nullable value); - partial void OnIsCertifiedChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public global::System.String Size - { - get - { - return _Size; - } - set - { - OnSizeChanging(value); - ReportPropertyChanging("Size"); - _Size = StructuralObject.SetValidValue(value, true, "Size"); - ReportPropertyChanged("Size"); - OnSizeChanged(); - } - } - private global::System.String _Size; - partial void OnSizeChanging(global::System.String value); - partial void OnSizeChanged(); - - #endregion - - } - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="testModel", Name="Order")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - public partial class Order : EntityObject - { - #region Factory Method - - /// - /// Create a new Order object. - /// - /// Initial value of the Id property. - /// Initial value of the Freight property. - public static Order CreateOrder(global::System.Int32 id, global::System.Double freight) - { - Order order = new Order(); - order.Id = id; - order.Freight = freight; - return order; - } - - #endregion - - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int32 Id - { - get - { - return _Id; - } - set - { - if (_Id != value) - { - OnIdChanging(value); - ReportPropertyChanging("Id"); - _Id = StructuralObject.SetValidValue(value, "Id"); - ReportPropertyChanged("Id"); - OnIdChanged(); - } - } - } - private global::System.Int32 _Id; - partial void OnIdChanging(global::System.Int32 value); - partial void OnIdChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Double Freight - { - get - { - return _Freight; - } - set - { - OnFreightChanging(value); - ReportPropertyChanging("Freight"); - _Freight = StructuralObject.SetValidValue(value, "Freight"); - ReportPropertyChanged("Freight"); - OnFreightChanged(); - } - } - private global::System.Double _Freight; - partial void OnFreightChanging(global::System.Double value); - partial void OnFreightChanged(); - - #endregion - - #region Navigation Properties - - /// - /// No Metadata Documentation available. - /// - [XmlIgnoreAttribute()] - [SoapIgnoreAttribute()] - [DataMemberAttribute()] - [EdmRelationshipNavigationPropertyAttribute("testModel", "FK_Orders_Shop", "Shop")] - public Shop Shop - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("testModel.FK_Orders_Shop", "Shop").Value; - } - set - { - ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("testModel.FK_Orders_Shop", "Shop").Value = value; - } - } - /// - /// No Metadata Documentation available. - /// - [BrowsableAttribute(false)] - [DataMemberAttribute()] - public EntityReference ShopReference - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("testModel.FK_Orders_Shop", "Shop"); - } - set - { - if ((value != null)) - { - ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference("testModel.FK_Orders_Shop", "Shop", value); - } - } - } - - #endregion - - } - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="testModel", Name="Product")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - public partial class Product : EntityObject - { - #region Factory Method - - /// - /// Create a new Product object. - /// - /// Initial value of the Id property. - /// Initial value of the Name property. - /// Initial value of the CreatedDate property. - public static Product CreateProduct(global::System.Int32 id, global::System.String name, global::System.DateTime createdDate) - { - Product product = new Product(); - product.Id = id; - product.Name = name; - product.CreatedDate = createdDate; - return product; - } - - #endregion - - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int32 Id - { - get - { - return _Id; - } - set - { - if (_Id != value) - { - OnIdChanging(value); - ReportPropertyChanging("Id"); - _Id = StructuralObject.SetValidValue(value, "Id"); - ReportPropertyChanged("Id"); - OnIdChanged(); - } - } - } - private global::System.Int32 _Id; - partial void OnIdChanging(global::System.Int32 value); - partial void OnIdChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.String Name - { - get - { - return _Name; - } - set - { - OnNameChanging(value); - ReportPropertyChanging("Name"); - _Name = StructuralObject.SetValidValue(value, false, "Name"); - ReportPropertyChanged("Name"); - OnNameChanged(); - } - } - private global::System.String _Name; - partial void OnNameChanging(global::System.String value); - partial void OnNameChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.DateTime CreatedDate - { - get - { - return _CreatedDate; - } - set - { - OnCreatedDateChanging(value); - ReportPropertyChanging("CreatedDate"); - _CreatedDate = StructuralObject.SetValidValue(value, "CreatedDate"); - ReportPropertyChanged("CreatedDate"); - OnCreatedDateChanged(); - } - } - private global::System.DateTime _CreatedDate; - partial void OnCreatedDateChanging(global::System.DateTime value); - partial void OnCreatedDateChanged(); - - #endregion - - } - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="testModel", Name="Publisher")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - public partial class Publisher : EntityObject - { - #region Factory Method - - /// - /// Create a new Publisher object. - /// - /// Initial value of the id property. - /// Initial value of the name property. - public static Publisher CreatePublisher(global::System.Int32 id, global::System.String name) - { - Publisher publisher = new Publisher(); - publisher.id = id; - publisher.name = name; - return publisher; - } - - #endregion - - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int32 id - { - get - { - return _id; - } - set - { - if (_id != value) - { - OnidChanging(value); - ReportPropertyChanging("id"); - _id = StructuralObject.SetValidValue(value, "id"); - ReportPropertyChanged("id"); - OnidChanged(); - } - } - } - private global::System.Int32 _id; - partial void OnidChanging(global::System.Int32 value); - partial void OnidChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.String name - { - get - { - return _name; - } - set - { - OnnameChanging(value); - ReportPropertyChanging("name"); - _name = StructuralObject.SetValidValue(value, false, "name"); - ReportPropertyChanged("name"); - OnnameChanged(); - } - } - private global::System.String _name; - partial void OnnameChanging(global::System.String value); - partial void OnnameChanged(); - - #endregion - - #region Navigation Properties - - /// - /// No Metadata Documentation available. - /// - [XmlIgnoreAttribute()] - [SoapIgnoreAttribute()] - [DataMemberAttribute()] - [EdmRelationshipNavigationPropertyAttribute("testModel", "FK_Books_Publishers", "Books")] - public EntityCollection Books - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedCollection("testModel.FK_Books_Publishers", "Books"); - } - set - { - if ((value != null)) - { - ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedCollection("testModel.FK_Books_Publishers", "Books", value); - } - } - } - - #endregion - - } - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="testModel", Name="SalariedEmployee")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - public partial class SalariedEmployee : Employee - { - #region Factory Method - - /// - /// Create a new SalariedEmployee object. - /// - /// Initial value of the Id property. - /// Initial value of the LastName property. - /// Initial value of the FirstName property. - /// Initial value of the Salary property. - public static SalariedEmployee CreateSalariedEmployee(global::System.Int32 id, global::System.String lastName, global::System.String firstName, global::System.Int32 salary) - { - SalariedEmployee salariedEmployee = new SalariedEmployee(); - salariedEmployee.Id = id; - salariedEmployee.LastName = lastName; - salariedEmployee.FirstName = firstName; - salariedEmployee.Salary = salary; - return salariedEmployee; - } - - #endregion - - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int32 Salary - { - get - { - return _Salary; - } - set - { - OnSalaryChanging(value); - ReportPropertyChanging("Salary"); - _Salary = StructuralObject.SetValidValue(value, "Salary"); - ReportPropertyChanged("Salary"); - OnSalaryChanged(); - } - } - private global::System.Int32 _Salary; - partial void OnSalaryChanging(global::System.Int32 value); - partial void OnSalaryChanged(); - - #endregion - - } - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="testModel", Name="Shop")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - public partial class Shop : EntityObject - { - #region Factory Method - - /// - /// Create a new Shop object. - /// - /// Initial value of the Id property. - /// Initial value of the Name property. - public static Shop CreateShop(global::System.Int32 id, global::System.String name) - { - Shop shop = new Shop(); - shop.Id = id; - shop.Name = name; - return shop; - } - - #endregion - - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int32 Id - { - get - { - return _Id; - } - set - { - if (_Id != value) - { - OnIdChanging(value); - ReportPropertyChanging("Id"); - _Id = StructuralObject.SetValidValue(value, "Id"); - ReportPropertyChanged("Id"); - OnIdChanged(); - } - } - } - private global::System.Int32 _Id; - partial void OnIdChanging(global::System.Int32 value); - partial void OnIdChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.String Name - { - get - { - return _Name; - } - set - { - OnNameChanging(value); - ReportPropertyChanging("Name"); - _Name = StructuralObject.SetValidValue(value, false, "Name"); - ReportPropertyChanged("Name"); - OnNameChanged(); - } - } - private global::System.String _Name; - partial void OnNameChanging(global::System.String value); - partial void OnNameChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public global::System.String Address - { - get - { - return _Address; - } - set - { - OnAddressChanging(value); - ReportPropertyChanging("Address"); - _Address = StructuralObject.SetValidValue(value, true, "Address"); - ReportPropertyChanged("Address"); - OnAddressChanged(); - } - } - private global::System.String _Address; - partial void OnAddressChanging(global::System.String value); - partial void OnAddressChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public global::System.String City - { - get - { - return _City; - } - set - { - OnCityChanging(value); - ReportPropertyChanging("City"); - _City = StructuralObject.SetValidValue(value, true, "City"); - ReportPropertyChanged("City"); - OnCityChanged(); - } - } - private global::System.String _City; - partial void OnCityChanging(global::System.String value); - partial void OnCityChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public global::System.String State - { - get - { - return _State; - } - set - { - OnStateChanging(value); - ReportPropertyChanging("State"); - _State = StructuralObject.SetValidValue(value, true, "State"); - ReportPropertyChanged("State"); - OnStateChanged(); - } - } - private global::System.String _State; - partial void OnStateChanging(global::System.String value); - partial void OnStateChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public global::System.String ZipCode - { - get - { - return _ZipCode; - } - set - { - OnZipCodeChanging(value); - ReportPropertyChanging("ZipCode"); - _ZipCode = StructuralObject.SetValidValue(value, true, "ZipCode"); - ReportPropertyChanged("ZipCode"); - OnZipCodeChanged(); - } - } - private global::System.String _ZipCode; - partial void OnZipCodeChanging(global::System.String value); - partial void OnZipCodeChanged(); - - #endregion - - } - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="testModel", Name="TabletComputer")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - public partial class TabletComputer : Computer - { - #region Factory Method - - /// - /// Create a new TabletComputer object. - /// - /// Initial value of the Brand property. - /// Initial value of the Id property. - public static TabletComputer CreateTabletComputer(global::System.String brand, global::System.Int32 id) - { - TabletComputer tabletComputer = new TabletComputer(); - tabletComputer.Brand = brand; - tabletComputer.Id = id; - return tabletComputer; - } - - #endregion - - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public Nullable IsAvailable - { - get - { - return _IsAvailable; - } - set - { - OnIsAvailableChanging(value); - ReportPropertyChanging("IsAvailable"); - _IsAvailable = StructuralObject.SetValidValue(value, "IsAvailable"); - ReportPropertyChanged("IsAvailable"); - OnIsAvailableChanged(); - } - } - private Nullable _IsAvailable; - partial void OnIsAvailableChanging(Nullable value); - partial void OnIsAvailableChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public Nullable ReleaseDate - { - get - { - return _ReleaseDate; - } - set - { - OnReleaseDateChanging(value); - ReportPropertyChanging("ReleaseDate"); - _ReleaseDate = StructuralObject.SetValidValue(value, "ReleaseDate"); - ReportPropertyChanged("ReleaseDate"); - OnReleaseDateChanged(); - } - } - private Nullable _ReleaseDate; - partial void OnReleaseDateChanging(Nullable value); - partial void OnReleaseDateChanged(); - - #endregion - - } - - /// - /// No Metadata Documentation available. - /// - [EdmEntityTypeAttribute(NamespaceName="testModel", Name="Toy")] - [Serializable()] - [DataContractAttribute(IsReference=true)] - public partial class Toy : EntityObject - { - #region Factory Method - - /// - /// Create a new Toy object. - /// - /// Initial value of the Id property. - /// Initial value of the Name property. - /// Initial value of the MinAge property. - public static Toy CreateToy(global::System.Int32 id, global::System.String name, global::System.Int32 minAge) - { - Toy toy = new Toy(); - toy.Id = id; - toy.Name = name; - toy.MinAge = minAge; - return toy; - } - - #endregion - - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int32 Id - { - get - { - return _Id; - } - set - { - if (_Id != value) - { - OnIdChanging(value); - ReportPropertyChanging("Id"); - _Id = StructuralObject.SetValidValue(value, "Id"); - ReportPropertyChanged("Id"); - OnIdChanged(); - } - } - } - private global::System.Int32 _Id; - partial void OnIdChanging(global::System.Int32 value); - partial void OnIdChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.String Name - { - get - { - return _Name; - } - set - { - OnNameChanging(value); - ReportPropertyChanging("Name"); - _Name = StructuralObject.SetValidValue(value, false, "Name"); - ReportPropertyChanged("Name"); - OnNameChanged(); - } - } - private global::System.String _Name; - partial void OnNameChanging(global::System.String value); - partial void OnNameChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)] - [DataMemberAttribute()] - public global::System.Int32 MinAge - { - get - { - return _MinAge; - } - set - { - OnMinAgeChanging(value); - ReportPropertyChanging("MinAge"); - _MinAge = StructuralObject.SetValidValue(value, "MinAge"); - ReportPropertyChanged("MinAge"); - OnMinAgeChanged(); - } - } - private global::System.Int32 _MinAge; - partial void OnMinAgeChanging(global::System.Int32 value); - partial void OnMinAgeChanged(); - - #endregion - - #region Navigation Properties - - /// - /// No Metadata Documentation available. - /// - [XmlIgnoreAttribute()] - [SoapIgnoreAttribute()] - [DataMemberAttribute()] - [EdmRelationshipNavigationPropertyAttribute("testModel", "FK_Toys_Supplier", "Supplier")] - public Company Supplier - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("testModel.FK_Toys_Supplier", "Supplier").Value; - } - set - { - ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("testModel.FK_Toys_Supplier", "Supplier").Value = value; - } - } - /// - /// No Metadata Documentation available. - /// - [BrowsableAttribute(false)] - [DataMemberAttribute()] - public EntityReference SupplierReference - { - get - { - return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference("testModel.FK_Toys_Supplier", "Supplier"); - } - set - { - if ((value != null)) - { - ((IEntityWithRelationships)this).RelationshipManager.InitializeRelatedReference("testModel.FK_Toys_Supplier", "Supplier", value); - } - } - } - - #endregion - - } - - #endregion - - #region ComplexTypes - - /// - /// No Metadata Documentation available. - /// - [EdmComplexTypeAttribute(NamespaceName="testModel", Name="CommonAddress")] - [DataContractAttribute(IsReference=true)] - [Serializable()] - public partial class CommonAddress : ComplexObject - { - #region Simple Properties - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public global::System.String Address - { - get - { - return _Address; - } - set - { - OnAddressChanging(value); - ReportPropertyChanging("Address"); - _Address = StructuralObject.SetValidValue(value, true, "Address"); - ReportPropertyChanged("Address"); - OnAddressChanged(); - } - } - private global::System.String _Address; - partial void OnAddressChanging(global::System.String value); - partial void OnAddressChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public global::System.String City - { - get - { - return _City; - } - set - { - OnCityChanging(value); - ReportPropertyChanging("City"); - _City = StructuralObject.SetValidValue(value, true, "City"); - ReportPropertyChanged("City"); - OnCityChanged(); - } - } - private global::System.String _City; - partial void OnCityChanging(global::System.String value); - partial void OnCityChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public global::System.String State - { - get - { - return _State; - } - set - { - OnStateChanging(value); - ReportPropertyChanging("State"); - _State = StructuralObject.SetValidValue(value, true, "State"); - ReportPropertyChanged("State"); - OnStateChanged(); - } - } - private global::System.String _State; - partial void OnStateChanging(global::System.String value); - partial void OnStateChanged(); - - /// - /// No Metadata Documentation available. - /// - [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=true)] - [DataMemberAttribute()] - public global::System.String ZipCode - { - get - { - return _ZipCode; - } - set - { - OnZipCodeChanging(value); - ReportPropertyChanging("ZipCode"); - _ZipCode = StructuralObject.SetValidValue(value, true, "ZipCode"); - ReportPropertyChanged("ZipCode"); - OnZipCodeChanged(); - } - } - private global::System.String _ZipCode; - partial void OnZipCodeChanging(global::System.String value); - partial void OnZipCodeChanged(); - - #endregion - - } - - #endregion - -} diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Models/TestModel.edmx b/Tests/MySql.EntityFramework6.Basic.Tests/Models/TestModel.edmx deleted file mode 100644 index 6924f7861..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Models/TestModel.edmx +++ /dev/null @@ -1,769 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Models/table_name.cs b/Tests/MySql.EntityFramework6.Basic.Tests/Models/table_name.cs deleted file mode 100644 index a81172d8c..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Models/table_name.cs +++ /dev/null @@ -1,19 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated from a template. -// -// Manual changes to this file may cause unexpected behavior in your application. -// Manual changes to this file will be overwritten if the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace MySql.Data.Entity.Tests -{ - using System; - using System.Collections.Generic; - - public partial class table_name - { - public int key { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/MyConfiguration.cs b/Tests/MySql.EntityFramework6.Basic.Tests/MyConfiguration.cs deleted file mode 100644 index d1c1a812e..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/MyConfiguration.cs +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using MySql.Data.Entity; - -namespace MySql.Data.Entity.Tests -{ - public class MyConfiguration : MySqlEFConfiguration - { - public MyConfiguration() - : base() - { - //AddMigrationSqlGenerator(() => { return new MySqlMigrationSqlGenerator(); }); - //AddMigrationSqlGenerator(() => { return new MySqlMigrationSqlGenerator(); }); - } - } -} diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/MySql.EntityFramework6.Basic.Tests.xproj b/Tests/MySql.EntityFramework6.Basic.Tests/MySql.EntityFramework6.Basic.Tests.xproj deleted file mode 100644 index b432eb0a7..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/MySql.EntityFramework6.Basic.Tests.xproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - 14.0.25420 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - f8c09fa3-67c7-4ad6-9fe2-17a3f82c1f2b - MySql.EntityFramework6.Basic.Tests - .\obj - .\bin\ - - - - 2.0 - - - \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/OrderingAndGrouping.cs b/Tests/MySql.EntityFramework6.Basic.Tests/OrderingAndGrouping.cs deleted file mode 100644 index dd101cbbc..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/OrderingAndGrouping.cs +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright � 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System; -using System.Data; -using System.Threading; -using MySql.Data.MySqlClient; -#if !EF6 -using System.Data.EntityClient; -using System.Data.Objects; -#else -using System.Data.Entity.Core.EntityClient; -using System.Data.Entity.Core.Objects; -#endif -using System.Data.Common; -using MySql.Data.Entity.Tests.Properties; -using System.Linq; -using Xunit; - -namespace MySql.Data.Entity.Tests -{ - public class OrderingAndGrouping : IUseFixture - { - private SetUpEntityTests st; - - public void SetFixture(SetUpEntityTests data) - { - st = data; - } - - [Fact] - public void OrderBySimple() - { - MySqlDataAdapter da = new MySqlDataAdapter( - "SELECT id FROM Companies c ORDER BY c.Name", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - - using (testEntities context = new testEntities()) - { - string eSql = "SELECT VALUE c FROM Companies AS c ORDER BY c.Name"; - ObjectQuery query = context.CreateQuery(eSql); - - string sql = query.ToTraceString(); - st.CheckSql(sql, SQLSyntax.OrderBySimple); - - int i = 0; - foreach (Company c in query) - Assert.Equal(dt.Rows[i++][0], c.Id); - } - } - - [Fact] - public void OrderByWithPredicate() - { - using (testEntities context = new testEntities()) - { - using (EntityConnection ec = context.Connection as EntityConnection) - { - ec.Open(); - MySqlDataAdapter da = new MySqlDataAdapter( - "SELECT id FROM Companies c WHERE c.NumEmployees > 100 ORDER BY c.Name", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - - string eSql = "SELECT VALUE c FROM Companies AS c WHERE c.NumEmployees > 100 ORDER BY c.Name"; - ObjectQuery query = context.CreateQuery(eSql); - - string sql = query.ToTraceString(); - st.CheckSql(sql, SQLSyntax.OrderByWithPredicate); - - int i = 0; - foreach (Company c in query) - Assert.Equal(dt.Rows[i++][0], c.Id); - } - } - } - - [Fact] - public void CanGroupBySingleColumn() - { - MySqlDataAdapter adapter = new MySqlDataAdapter( - "SELECT Name, COUNT(Id) as Count FROM Companies GROUP BY Name", st.conn); - DataTable table = new DataTable(); - adapter.Fill(table); - - using (testEntities context = new testEntities()) - { - var companies = from c in context.Companies - group c by c.Name into cgroup - select new - { - Name = cgroup.Key, - Count = cgroup.Count() - }; - string sql = companies.ToTraceString(); - st.CheckSql(sql, SQLSyntax.CanGroupBySingleColumn); - - int i = 0; - foreach (var company in companies) - { - Assert.Equal(table.Rows[i][0], company.Name); - Assert.Equal(Convert.ToInt32(table.Rows[i][1]), Convert.ToInt32(company.Count)); - i++; - } - } - } - - [Fact] - public void CanGroupByMultipleColumns() - { - MySqlDataAdapter adapter = new MySqlDataAdapter( - "SELECT Name, COUNT(Id) as Count FROM Companies GROUP BY Name, NumEmployees, DateBegan", st.conn); - DataTable table = new DataTable(); - adapter.Fill(table); - - using (testEntities context = new testEntities()) - { - var companies = from c in context.Companies - group c by new { c.Name, c.NumEmployees, c.DateBegan } into cgroup - select new - { - Name = cgroup.Key.Name, - Count = cgroup.Count() - }; - - string sql = companies.ToTraceString(); - st.CheckSql(sql, SQLSyntax.CanGroupByMultipleColumns); - - int i = 0; - foreach (var company in companies) - { - Assert.Equal(table.Rows[i][0],company.Name); - Assert.Equal(Convert.ToInt32(table.Rows[i][1]),Convert.ToInt32(company.Count)); - i++; - } - } - } - - [Fact] - public void OrdersTableDoesNotProvokeSyntaxError() - { - using (model2Entities context = new model2Entities()) - { - var customers = from c in context.customer - select c; - - Assert.DoesNotThrow(delegate { customers.ToList().ForEach(c => c.order.Load()); }); - } - } - } -} \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Paging.cs b/Tests/MySql.EntityFramework6.Basic.Tests/Paging.cs deleted file mode 100644 index 9db243b66..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Paging.cs +++ /dev/null @@ -1,178 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Data; -using System.Threading; -using MySql.Data.MySqlClient; -using System.Linq; -using MySql.Data.Entity.Tests.Properties; -using Xunit; - -namespace MySql.Data.Entity.Tests -{ - public class Paging : IUseFixture - { - private SetUpEntityTests st; - - public void SetFixture(SetUpEntityTests data) - { - st = data; - } - - [Fact] - public void Top() - { - using (testEntities context = new testEntities()) - { - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Companies LIMIT 2", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - - int i = 0; - var query = context.Companies.Top("2"); - string sql = query.ToTraceString(); - st.CheckSql(sql, SQLSyntax.Top); - - foreach (Company c in query) - { - Assert.Equal(dt.Rows[i++]["id"], c.Id); - } - } - } - - [Fact] - public void Skip() - { - using (testEntities context = new testEntities()) - { - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Companies LIMIT 3,20", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - - int i = 0; - var query = context.Companies.Skip("it.Id", "3"); - string sql = query.ToTraceString(); - st.CheckSql(sql, SQLSyntax.Skip); - - foreach (Company c in query) - { - Assert.Equal(dt.Rows[i++]["id"], c.Id); - } - } - } - - [Fact] - public void SkipAndTakeSimple() - { - using (testEntities context = new testEntities()) - { - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Companies LIMIT 2,2", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - - int i = 0; - var query = context.Companies.Skip("it.Id", "2").Top("2"); - string sql = query.ToTraceString(); - st.CheckSql(sql, SQLSyntax.SkipAndTakeSimple); - - foreach (Company c in query) - { - Assert.Equal(dt.Rows[i++]["id"], c.Id); - } - Assert.Equal(2, i); - } - } - - /// - /// Bug #45723 Entity Framework DbSortExpression not processed when using Skip & Take - /// - [Fact] - public void SkipAndTakeWithOrdering() - { - using (testEntities context = new testEntities()) - { - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Companies ORDER BY Name DESC LIMIT 2,2", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - - int i = 0; - var query = context.Companies.OrderByDescending(q => q.Name).Skip(2).Take(2); - string sql = query.ToTraceString(); - st.CheckSql(sql, SQLSyntax.SkipAndTakeWithOrdering); - foreach (Company c in query) - Assert.Equal(dt.Rows[i++]["Name"], c.Name); - } - } - - /// - /// Tests fix for bug #64749 - Entity Framework - Take().Count() fails with EntityCommandCompilationException. - /// - [Fact] - public void TakeWithCount() - { - using (testEntities context = new testEntities()) - { - int cnt = context.Companies.Take(2).Count(); - Assert.Equal(2, cnt); - } - } - - /// - /// Fix for EF SQL Generator, Union Syntax (Concat operator) is missing required parentheses - /// (may cause semantic changes when combined with Limit clause (Take operator)). - /// (MySql bug #70828, Oracle bug #18049691). - /// - [Fact] - public void TakeWithUnion() - { - int[] ids = new int[] { 1, 2, 3, 4 }; - string[] names = new string[] { "Slinky", "Rubiks Cube", "Lincoln Logs", "Legos" }; -#if EF5 - using (testEntities ctx = new testEntities()) - { - var q = ctx.Toys; - var q2 = ctx.Toys.Take(0).Concat(q); - var q3 = q.Concat(q.Take(0)); - int i = 0; - string sql = q2.ToTraceString(); - st.CheckSql(sql, SQLSyntax.UnionWithLimit2); - foreach (var row in q2) - { - Assert.Equal(ids[i], row.Id); - Assert.Equal(names[i], row.Name); - i++; - } - i = 0; - sql = q3.ToTraceString(); - st.CheckSql(sql, SQLSyntax.UnionWithLimit); - foreach (var row in q) - { - Assert.Equal(ids[i], row.Id); - Assert.Equal( names[ i ], row.Name ); - i++; - } - } -#endif - } - } -} \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/ProceduresAndFunctions.cs b/Tests/MySql.EntityFramework6.Basic.Tests/ProceduresAndFunctions.cs deleted file mode 100644 index 91bc65d11..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/ProceduresAndFunctions.cs +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright � 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Data; -using System.Threading; -using MySql.Data.MySqlClient; - -#if !EF6 -using System.Data.EntityClient; -using System.Data.Objects; -#else -using System.Data.Entity.Core.EntityClient; -using System.Data.Entity.Core.Objects; -#endif -using System.Data.Common; -using System.Linq; -using Xunit; - -namespace MySql.Data.Entity.Tests -{ - public class ProceduresAndFunctions : IUseFixture - { - private SetUpEntityTests st; - - public void SetFixture(SetUpEntityTests data) - { - st = data; - } - - public ProceduresAndFunctions() - : base() - { - } - - [Fact] - public void Insert() - { - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Authors", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - int count = dt.Rows.Count; - - using (testEntities context = new testEntities()) - { - Author a = new Author(); - a.Id = 23; - a.Name = "Test name"; - a.Age = 44; - context.AddToAuthors(a); - context.SaveChanges(); - } - - dt.Clear(); - da.Fill(dt); - Assert.Equal(count + 1, dt.Rows.Count); - Assert.Equal(23, dt.Rows[count]["id"]); - } - - [Fact] - public void Update() - { - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Authors", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - int count = dt.Rows.Count; - - using (testEntities context = new testEntities()) - { - var q = from a in context.Authors - where a.Name == "Don Box" - select a; - foreach (Author a in q) - a.Name = "Dummy"; - context.SaveChanges(); - } - - da.SelectCommand.CommandText = "SELECT * FROM Authors WHERE name='Dummy'"; - dt.Clear(); - da.Fill(dt); - Assert.Equal(1, dt.Rows.Count); - } - - [Fact] - public void Delete() - { - using (testEntities context = new testEntities()) - { - foreach (Book b in context.Books) - context.DeleteObject(b); - context.SaveChanges(); - } - - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Books", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - Assert.Equal(0, dt.Rows.Count); - } - - /// - /// Bug #45277 Calling User Defined Function using eSql causes NullReferenceException - /// - [Fact] - public void UserDefinedFunction() - { - using (EntityConnection conn = new EntityConnection("name=testEntities")) - { - conn.Open(); - - string query = @"SELECT e.FirstName AS Name FROM testEntities.Employees AS e - WHERE testModel.Store.spFunc(e.Id, '') = 6"; - using (EntityCommand cmd = new EntityCommand(query, conn)) - { - EntityDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess); - Assert.True(reader.Read()); - Assert.Equal("Scooby", reader[0]); - } - } - } - - /// - /// Bug #56806 Default Command Timeout has no effect in connection string - /// - [Fact] - public void CommandTimeout() - { - string connectionString = String.Format( - "metadata=res://*/TestModel.csdl|res://*/TestModel.ssdl|res://*/TestModel.msl;provider=MySql.Data.MySqlClient; provider connection string=\"{0};default command timeout=5\"", st.GetConnectionString(true)); - EntityConnection connection = new EntityConnection(connectionString); - - using (testEntities context = new testEntities(connection)) - { - Author a = new Author(); - a.Id = 66; // special value to indicate the routine should take 30 seconds - a.Name = "Test name"; - a.Age = 44; - context.AddToAuthors(a); - try - { - context.SaveChanges(); - //Assert.Fail("This should have timed out"); - } - catch (Exception ex) - { - string s = ex.Message; - } - } - } - - } -} \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Properties/AssemblyInfo.cs b/Tests/MySql.EntityFramework6.Basic.Tests/Properties/AssemblyInfo.cs deleted file mode 100644 index e3f7b8f7a..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright © 2008, 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using System.Security; - -// 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. -[assembly: AssemblyTitle("MySql.Data.Entity.EF6.Tests")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Oracle")] -[assembly: AssemblyProduct("MySql.Data.Entity.EF6.Tests")] -[assembly: AssemblyCopyright("Copyright © 2008, 2015, Oracle and/or its affiliates. All rights reserved.")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] -[assembly: AllowPartiallyTrustedCallers()] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("a4c0a8f2-5e48-4227-a712-bf8ae7446101")] - -[assembly: AssemblyDelaySign(true)] -[assembly: AssemblyKeyFileAttribute(@"..\..\ConnectorNetPublicKey.snk")] -[assembly: InternalsVisibleTo("MySql.Data.Entity.CodeFirst.Tests, PublicKey = 0024000004800000940000000602000000240000525341310004000001000100d973bda91f71752c78294126974a41a08643168271f65fc0fb3cd45f658da01fbca75ac74067d18e7afbf1467d7a519ce0248b13719717281bb4ddd4ecd71a580dfe0912dfc3690b1d24c7e1975bf7eed90e4ab14e10501eedf763bff8ac204f955c9c15c2cf4ebf6563d8320b6ea8d1ea3807623141f4b81ae30a6c886b3ee1")] diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Properties/Resources.resx b/Tests/MySql.EntityFramework6.Basic.Tests/Properties/Resources.resx deleted file mode 100644 index fa0b254b1..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Properties/Resources.resx +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - - ..\ModelFirstModel1.edmx.sql;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 - - - procs.sql;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 - - - schema.sql;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 - - \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Properties/Setup.sql b/Tests/MySql.EntityFramework6.Basic.Tests/Properties/Setup.sql deleted file mode 100644 index 5a7aa5c73..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Properties/Setup.sql +++ /dev/null @@ -1,17 +0,0 @@ -DROP DATABASE IF EXISTS `[database0]`; CREATE DATABASE `[database0]`; -GRANT ALL ON `[database0]`.* to 'test'@'localhost' IDENTIFIED BY 'test'; -GRANT ALL ON `[database0]`.* to 'test'@'%' IDENTIFIED BY 'test'; - -DROP DATABASE IF EXISTS `[database1]`; CREATE DATABASE `[database1]`; -GRANT ALL ON `[database1]`.* to 'test'@'localhost' IDENTIFIED BY 'test'; -GRANT ALL ON `[database1]`.* to 'test'@'%' IDENTIFIED BY 'test'; - -FLUSH PRIVILEGES; - -SET GLOBAL max_allowed_packet = 1048576; - -DELETE FROM mysql.user WHERE length(user) = 0; -DELETE FROM mysql.user WHERE user='nopass'; -DELETE FROM mysql.user WHERE user='quotedUser'; - -FLUSH PRIVILEGES; diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Properties/procs.sql b/Tests/MySql.EntityFramework6.Basic.Tests/Properties/procs.sql deleted file mode 100644 index d1370fc41..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Properties/procs.sql +++ /dev/null @@ -1,29 +0,0 @@ - -DROP PROCEDURE IF EXISTS AddAuthor$$ -DROP PROCEDURE IF EXISTS DeleteAuthor$$ -DROP PROCEDURE IF EXISTS UpdateAuthor$$ - -CREATE PROCEDURE AddAuthor(theid INT, thename VARCHAR(20), theage INT) -BEGIN - IF theid = 66 THEN - SELECT SLEEP(30); - ELSE - INSERT INTO authors VALUES (theid, thename, theage); - END IF; -END $$ - -CREATE PROCEDURE DeleteAuthor(theid int) -BEGIN - DELETE FROM authors WHERE id=theid; -END $$ - -CREATE PROCEDURE UpdateAuthor(theid int, thename varchar(20), theage int) -BEGIN - UPDATE authors SET `name`=thename, age=theage WHERE id=theid; -END $$ - -CREATE FUNCTION spFunc(id INT, name VARCHAR(20)) RETURNS INT -BEGIN - RETURN id; -END $$ - diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Properties/schema.sql b/Tests/MySql.EntityFramework6.Basic.Tests/Properties/schema.sql deleted file mode 100644 index ec0783a1b..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Properties/schema.sql +++ /dev/null @@ -1,286 +0,0 @@ -DROP TABLE IF EXISTS `Order`; -DROP TABLE IF EXISTS Customer; -DROP TABLE IF EXISTS Products; -DROP TABLE IF EXISTS SalariedEmployees; -DROP TABLE IF EXISTS Employees; -DROP TABLE IF EXISTS EmployeeChildren; -DROP TABLE IF EXISTS Toys; -DROP TABLE IF EXISTS Companies; -DROP TABLE IF EXISTS Orders; -DROP TABLE IF EXISTS Shops; -DROP TABLE IF EXISTS Books; -DROP TABLE IF EXISTS Authors; -DROP TABLE IF EXISTS Publishers; -DROP TABLE IF EXISTS DataTypeTests; -DROP TABLE IF EXISTS DesktopComputers; -DROP TABLE IF EXISTS LaptopComputers; -DROP TABLE IF EXISTS TabletComputers; -DROP TABLE IF EXISTS Computers; -drop table if exists VideoGamePlatform; -drop table if exists GamingPlatform; -drop table if exists VideoGameTitle; -drop table if exists myeditionsinmybooks; -drop table if exists myeditions; -drop table if exists mybooks; -drop table if exists myauthors; - -CREATE TABLE Employees( - Id INT NOT NULL PRIMARY KEY, - LastName NVARCHAR(20) NOT NULL, - FirstName NVARCHAR(10) NOT NULL, - Age INT) ENGINE=InnoDB; - -INSERT INTO Employees VALUES (1, 'Flintstone', 'Fred', 43); -INSERT INTO Employees VALUES (2, 'Flintstone', 'Wilma', 37); -INSERT INTO Employees VALUES (3, 'Rubble', 'Barney', 41); -INSERT INTO Employees VALUES (4, 'Rubble', 'Betty', 35); -INSERT INTO Employees VALUES (5, 'Slate', 'S', 62); -INSERT INTO Employees VALUES (6, 'Doo', 'Scooby', 7); -INSERT INTO Employees VALUES (7, 'Underdog', 'J', 12); - -CREATE TABLE SalariedEmployees( - EmployeeId INT NOT NULL PRIMARY KEY, - Salary INT NOT NULL, - CONSTRAINT FOREIGN KEY (EmployeeId) REFERENCES Employees (Id)) Engine=InnoDB; - -INSERT INTO salariedEmployees VALUES (5, 500); -INSERT INTO salariedEmployees VALUES (7, 50); - -CREATE TABLE EmployeeChildren( - Id INT UNSIGNED NOT NULL PRIMARY KEY, - EmployeeId INT NOT NULL, - LastName NVARCHAR(20) NOT NULL, - FirstName NVARCHAR(10) NOT NULL, - BirthTime TIME, - Weight DOUBLE, - LastModified TIMESTAMP NOT NULL); - -INSERT INTO EmployeeChildren VALUES (1, 1, 'Flintstone', 'Pebbles', NULL, NULL, NULL); - -CREATE TABLE Companies ( - `Id` INT NOT NULL AUTO_INCREMENT, - `Name` VARCHAR(100) NOT NULL, - `DateBegan` DATETIME, - `NumEmployees` INT, - `Address` VARCHAR(50), - `City` VARCHAR(50), - `State` CHAR(2), - `ZipCode` CHAR(9), - CONSTRAINT PK_Companies PRIMARY KEY (Id)) ENGINE=InnoDB; - -INSERT INTO Companies VALUES (1, 'Hasbro', '1996-11-15 5:18:23', 200, '123 My Street', 'Nashville', 'TN', 12345); -INSERT INTO Companies VALUES (2, 'Acme', NULL, 55, '45 The Lane', 'St. Louis', 'MO', 44332); -INSERT INTO Companies VALUES (3, 'Bandai America', NULL, 376, '1 Infinite Loop', 'Cupertino', 'CA', 54321); -INSERT INTO Companies VALUES (4, 'Lego Group', NULL, 700, '222 Park Circle', 'Lexington', 'KY', 32323); -INSERT INTO Companies VALUES (5, 'Mattel', NULL, 888, '111 Parkwood Ave', 'San Jose', 'CA', 55676); -INSERT INTO Companies VALUES (6, 'K''NEX', NULL, 382, '7812 N. 51st', 'Dallas', 'TX', 11239); -INSERT INTO Companies VALUES (7, 'Playmobil', NULL, 541, '546 Main St.', 'Omaha', 'NE', 78439); - -CREATE TABLE Toys ( - `Id` INT NOT NULL AUTO_INCREMENT, - `SupplierId` INT NOT NULL, - `Name` varchar(100) NOT NULL, - `MinAge` int NOT NULL, - CONSTRAINT PK_Toys PRIMARY KEY (Id), - KEY `SupplierId` (`SupplierId`), - FOREIGN KEY (SupplierId) REFERENCES Companies(Id) ) ENGINE=InnoDB; - -INSERT INTO Toys VALUES (1, 3, 'Slinky', 2); -INSERT INTO Toys VALUES (2, 2, 'Rubiks Cube', 5); -INSERT INTO Toys VALUES (3, 1, 'Lincoln Logs', 3); -INSERT INTO Toys VALUES (4, 4, 'Legos', 4); - -CREATE TABLE Computers ( - `Id` INT NOT NULL AUTO_INCREMENT, - `Brand` varchar(100) NOT NULL, - CONSTRAINT PK_Computers PRIMARY KEY (Id)) ENGINE=InnoDB; - -INSERT INTO Computers VALUES (1, 'Dell'); -INSERT INTO Computers VALUES (2, 'Acer'); -INSERT INTO Computers VALUES (3, 'Toshiba'); -INSERT INTO Computers VALUES (4, 'Sony'); -INSERT INTO Computers VALUES (5, 'Apple'); -INSERT INTO Computers VALUES (6, 'HP'); - -CREATE TABLE DesktopComputers ( - `IdDesktopComputer` INT NOT NULL , - `Color` VARCHAR(15) NULL DEFAULT NULL , - PRIMARY KEY (`IdDesktopComputer`) , - CONSTRAINT FK_DesktopComputer_Computer - FOREIGN KEY (IdDesktopComputer) - REFERENCES Computers (Id)) ENGINE = InnoDB; - -INSERT INTO DesktopComputers VALUES (1, 'White'); -INSERT INTO DesktopComputers VALUES (2, 'Black'); - -CREATE TABLE LaptopComputers ( - `IdLaptopComputer` INT NOT NULL , - `Size` VARCHAR(45) NULL DEFAULT NULL , - `IsCertified` BIT(1) NULL DEFAULT NULL , - PRIMARY KEY (IdLaptopComputer) , - CONSTRAINT FK_LaptopComputer_Computer - FOREIGN KEY (IdLaptopComputer) - REFERENCES Computers(Id)) ENGINE = InnoDB; - -INSERT INTO LaptopComputers VALUES (3, '13.2 x 9.4', 1); -INSERT INTO LaptopComputers VALUES (4, '19.5 x 13', 0); - -CREATE TABLE TabletComputers ( - `IdTabletComputer` INT NOT NULL , - `IsAvailable` BIT(1) NULL DEFAULT NULL , - `ReleaseDate` DATETIME NULL DEFAULT NULL , - PRIMARY KEY (IdTabletComputer) , - CONSTRAINT FK_TabletComputer_Computer - FOREIGN KEY (IdTabletComputer) - REFERENCES Computers(Id)) ENGINE = InnoDB; - -INSERT INTO TabletComputers VALUES (5, 1, '2011-05-04'); -INSERT INTO TabletComputers VALUES (6, 1, '2010-06-09'); - -CREATE TABLE Shops ( - id INT PRIMARY KEY, - `name` VARCHAR(50) NOT NULL, - address VARCHAR(50), - city VARCHAR(50), - state CHAR(2), - zipcode CHAR(9) - ) ENGINE=InnoDB; -INSERT INTO Shops VALUES (1, 'Target', '2417 N. Haskell Ave', 'Dallas', 'TX', '75204'); -INSERT INTO Shops VALUES (2, 'K-Mart', '4225 W. Indian School Rd.', 'Phoenix', 'AZ', '85019'); -INSERT INTO Shops VALUES (3, 'Wal-Mart', '1238 Putty Hill Ave', 'Towson', 'MD', '21286'); - - -CREATE TABLE Orders ( - id INT PRIMARY KEY, - shopId INT NOT NULL, - freight DOUBLE NOT NULL, - FOREIGN KEY (shopId) REFERENCES Shops(id)) ENGINE=InnoDB; -INSERT INTO Orders VALUES (1, 1, 65.3); -INSERT INTO Orders VALUES (2, 2, 127.8); -INSERT INTO Orders VALUES (3, 3, 254.78); -INSERT INTO Orders VALUES (4, 1, 165.8); -INSERT INTO Orders VALUES (5, 2, 85.2); -INSERT INTO Orders VALUES (6, 3, 98.5); -INSERT INTO Orders VALUES (7, 1, 222.3); -INSERT INTO Orders VALUES (8, 2, 125); -INSERT INTO Orders VALUES (9, 3, 126.4); -INSERT INTO Orders VALUES (10, 3, 350.54721); - - -CREATE TABLE Authors( - id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, - `name` VARCHAR(20) NOT NULL, - age INT) ENGINE=InnoDB; -INSERT INTO Authors VALUES (1, 'Tom Clancy', 65); -INSERT INTO Authors VALUES (2, 'Stephen King', 57); -INSERT INTO Authors VALUES (3, 'John Grisham', 49); -INSERT INTO Authors VALUES (4, 'Dean Koontz', 52); -INSERT INTO Authors VALUES (5, 'Don Box', 44); - - -CREATE TABLE Publishers( - id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, - `name` VARCHAR(20) NOT NULL) ENGINE=InnoDB; -INSERT INTO Publishers VALUES (1, 'Acme Publishing'); - -CREATE TABLE Books ( - id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, - `name` VARCHAR(20) NOT NULL, - pages int, - author_id int NOT NULL, - publisher_id int NOT NULL, - FOREIGN KEY (author_id) REFERENCES Authors(id), - FOREIGN KEY (publisher_id) REFERENCES Publishers(id)) ENGINE=InnoDB; -INSERT INTO Books VALUES (1, 'Debt of Honor', 200, 1, 1); -INSERT INTO Books VALUES (2, 'Insomnia', 350, 2, 1); -INSERT INTO Books VALUES (3, 'Rainmaker', 475, 3, 1); -INSERT INTO Books VALUES (4, 'Hallo', 175, 3, 1); -INSERT INTO Books VALUES (5, 'Debt of Honor', 200, 1, 1); - -SET @guid=UUID(); -CREATE TABLE DataTypeTests( - id CHAR(36) CHARACTER SET utf8 NOT NULL PRIMARY KEY, - id2 CHAR(36) BINARY NOT NULL, - idAsChar VARCHAR(36)); -INSERT INTO DataTypeTests VALUES (@guid, @guid, @guid); -INSERT INTO DataTypeTests VALUES ('481A6506-03A3-4ef9-A05A-B247E75A2FB4', - '481A6506-03A3-4ef9-A05A-B247E75A2FB4', '481A6506-03A3-4ef9-A05A-B247E75A2FB4'); - -CREATE TABLE Products ( - Id INT NOT NULL AUTO_INCREMENT, - Name VARCHAR(45) NOT NULL, - CreatedDate TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - PRIMARY KEY (Id)); - -CREATE TABLE Customer ( - Id int(11) NOT NULL auto_increment, - Name varchar(255) default NULL, - PRIMARY KEY (ID) -) ENGINE=InnoDB AUTO_INCREMENT=5; - -insert into Customer(Id,Name) - values (1,'Fred'),(2,'Barney'),(3,'Wilma'),(4,'Betty'); - -CREATE TABLE `Order` ( - Id int(11) NOT NULL auto_increment, - Order_Date datetime NOT NULL, - Customer_Id int(11) default NULL, - PRIMARY KEY (ID), - CONSTRAINT FK_ORDER_CUSTOMER FOREIGN KEY (Customer_Id) REFERENCES Customer (Id) -) ENGINE=InnoDB AUTO_INCREMENT=7; - -insert into `Order`(Id,Order_Date,Customer_Id) - values (1,'2011-06-24 00:00:00',1),(2,'2011-06-25 00:00:00',1),(3,'2011-06-26 00:00:00',1), - (4,'2011-06-01 00:00:00',2),(5,'2011-06-02 00:00:00',2),(6,'2011-06-03 00:00:00',3); - -create table `GamingPlatform` ( - Id int( 11 ) not null auto_increment, - Name varchar( 50 ) default null, - Developer varchar( 50 ) default null, - primary key ( Id ) -) ENGINE=InnoDB; - -insert into `GamingPlatform`( Id, Name, Developer ) - values ( 1, 'Playstation 3', 'Sony' ), ( 2, 'Xbox 360', 'Microsoft' ), ( 3, 'Wii', 'Nintendo' ), ( 4, 'PC', NULL ); - -create table `VideoGameTitle` ( - Id int ( 11 ), - Name varchar( 50 ), - Developer varchar( 50 ), - primary key ( Id ) -) ENGINE=InnoDB; - -insert into `VideoGameTitle` ( Id, Name, Developer ) - values ( 1, 'Halo 3', 'Bungie' ), ( 2, 'Gears of War', 'Epyx' ), ( 3, 'Call of Duty: Black Ops', 'Treyarch' ), - ( 4, 'Resistance', 'Insomniac' ), ( 5, 'FIFA 11', 'EA' ), ( 6, 'Fallout 3', 'Bethesda' ), - ( 7, '3D Dot Game Heroes', 'From' ), ( 8, 'Mario Galaxy', 'Nintendo' ); - -create view `viVideoGameTitle` as -select vi.`Id`, vi.`Name`, vi.`Developer` -from `VideoGameTitle` vi; - -create table `VideoGamePlatform` ( - IdGamingPlatform int( 11 ) not null, - IdVideoGameTitle int( 11 ) not null, - Category varchar( 50 ), - primary key ( IdGamingPlatform, IdVideoGameTitle ), - CONSTRAINT fk_VideoGamePlatform_Platform FOREIGN KEY (IdGamingPlatform) REFERENCES GamingPlatform ( Id ), - constraint fk_VideoGamePlatform_VideoGameTitle FOREIGN KEY ( IdVideoGameTitle ) REFERENCES VideoGameTitle ( Id ) -) ENGINE=InnoDB; - -insert into `VideoGamePlatform` ( IdGamingPlatform, IdVideoGameTitle, Category ) - values ( 1, 3, 'FPS' ), ( 1, 4, 'FPS' ), ( 1, 5, 'Soccer' ), ( 1, 6, 'RPG' ), ( 1, 7, 'RPG-Action' ), ( 2, 1, 'FPS' ), ( 2, 2, '3PS' ), ( 2, 3, 'FPS' ), - ( 2, 5, 'Soccer' ), ( 2, 6, 'RPG' ), ( 3, 5, 'Soccer' ), ( 3, 8, 'Platformer' ); - -create table myeditions ( id int(11) not null, title varchar(45) not null, primary key (id)) engine=innodb default charset=latin1; -create table myauthors (id int(11) not null, name varchar(45) not null, primary key (id)) engine=innodb default charset=latin1; -create table mybooks ( id int(11) not null, authorid int(11) not null, primary key (id), key fk_authors_mybooks (authorid), constraint fk_authors_mybooks foreign key (authorid) references myauthors (id) on delete no action on update no action) engine=innodb default charset=latin1; -create table myeditionsinmybooks ( bookid int(11) not null, editionid int(11) not null, primary key (bookid,editionid), key fk1 (bookid), key fk2 (editionid), constraint fk1 foreign key (bookid) references mybooks (id) on delete no action on update no action, - constraint fk2 foreign key (editionid) references myeditions (id) on delete no action on update no action -) engine=innodb default charset=latin1; - -insert into `myEditions` values (1,'Some Book First Edition'),(2,'Another Book First Edition'),(3,'Another Book Second Edition'),(4,'Another Book Third Edition'); -insert into `myAuthors` values (1,'Some Author'),(2,'Another Author'); -insert into `myBooks` values (8,1),(9,1); -insert into `myEditionsinmyBooks` values (8,1),(9,2),(9,3),(9,4); - \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/ProviderManifestTests.cs b/Tests/MySql.EntityFramework6.Basic.Tests/ProviderManifestTests.cs deleted file mode 100644 index 75c025f13..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/ProviderManifestTests.cs +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using MySql.Data.MySqlClient; -using System.Threading; -using System.Globalization; -using System.Data.Entity.Core.Metadata.Edm; -using Xunit; - -namespace MySql.Data.Entity.Tests -{ - public class ProviderManifestTests : IUseFixture - { - private SetUpEntityTests st; - - public void SetFixture(SetUpEntityTests data) - { - st = data; - } - - [Fact] - public void TestingMaxLengthFacet() - { - using (MySqlConnection connection = new MySqlConnection(st.GetConnectionString(true))) - { - MySqlProviderManifest pm = new MySqlProviderManifest(st.Version.ToString()); - TypeUsage tu = TypeUsage.CreateStringTypeUsage( - PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.String), false, false); - TypeUsage result = pm.GetStoreType(tu); - Assert.Equal("longtext", result.EdmType.Name); - - tu = TypeUsage.CreateStringTypeUsage( - PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.String), false, false, Int32.MaxValue); - result = pm.GetStoreType(tu); - Assert.Equal("longtext", result.EdmType.Name); - - tu = TypeUsage.CreateStringTypeUsage( - PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.String), false, false, 70000); - result = pm.GetStoreType(tu); - Assert.Equal("mediumtext", result.EdmType.Name); - - } - } - - /// - /// Bug #62135 Connector/Net Incorrectly Maps PrimitiveTypeKind.Byte to "tinyint" - /// - /// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using MySql.Data.MySqlClient; -using System.Threading; -using System.Globalization; -using Xunit; -using System.Data; -using System.Data.Entity; -using System.Data.Entity.Infrastructure; -using System.Data.Entity.Migrations; -using System.Data.Entity.Migrations.Infrastructure; -using MySql.Data.Entity.Tests.v4.x; - -namespace MySql.Data.Entity.Tests -{ - public class ProviderServicesTests : IUseFixture, IDisposable - { - private SetUpEntityTests st; - - public void SetFixture(SetUpEntityTests data) - { - st = data; - } - private CultureInfo originalCulture; - - public ProviderServicesTests() - : base() - { - originalCulture = Thread.CurrentThread.CurrentCulture; - } - -#if CLR4 - [Fact] - public void CreateDatabase() - { - st.suExecSQL("GRANT ALL ON `modeldb`.* to 'test'@'localhost'"); - st.suExecSQL("FLUSH PRIVILEGES"); - - using (Model1Container ctx = new Model1Container()) - { - Assert.False(ctx.DatabaseExists()); - ctx.CreateDatabase(); - Assert.True(ctx.DatabaseExists()); - } - } - - [Fact] - public void CreateDatabaseScript() - { - using (testEntities ctx = new testEntities()) - { - string s = ctx.CreateDatabaseScript(); - } - } - - [Fact] - public void DeleteDatabase() - { - st.suExecSQL("GRANT ALL ON `modeldb`.* to 'test'@'localhost'"); - st.suExecSQL("FLUSH PRIVILEGES"); - - using (Model1Container ctx = new Model1Container()) - { - Assert.False(ctx.DatabaseExists()); - ctx.CreateDatabase(); - Assert.True(ctx.DatabaseExists()); - ctx.DeleteDatabase(); - Assert.False(ctx.DatabaseExists()); - } - } - - [Fact] - public void DatabaseExists() - { - st.suExecSQL("GRANT ALL ON `modeldb`.* to 'test'@'localhost'"); - st.suExecSQL("FLUSH PRIVILEGES"); - - using (Model1Container ctx = new Model1Container()) - { - Assert.False(ctx.DatabaseExists()); - ctx.CreateDatabase(); - Assert.True(ctx.DatabaseExists()); - ctx.DeleteDatabase(); - Assert.False(ctx.DatabaseExists()); - } - } -#endif - - [Fact(Skip = "EF 5 have an known issue that is happening when the CreateDatabaseScript is called in this test and is suppose to be fixed in EF 6 but need a lot of changes incopatibles with the current architecture")] - public void CheckReservedWordColumnName() - { - using (ReservedWordColumnNameContainer ctx = new ReservedWordColumnNameContainer()) - { - var ddl = ((IObjectContextAdapter)ctx).ObjectContext.CreateDatabaseScript(); - Assert.Contains("ALTER TABLE `table_name` ADD PRIMARY KEY (`key`);", ddl); - } - } - - [Fact] - public void GetDbProviderManifestTokenDoesNotThrowWhenLocalized() - { - Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-CA"); - - using (MySqlConnection connection = new MySqlConnection(st.GetConnectionString(true))) - { - MySqlProviderServices providerServices = new MySqlProviderServices(); - string token = null; - - Assert.DoesNotThrow(delegate () { token = providerServices.GetProviderManifestToken(connection); }); - Assert.NotNull(token); - } - } - - [Fact] - public void GetDbProviderManifestTokenDoesNotThrowWhenMissingPersistSecurityInfo() - { - var conn = new MySqlConnection(st.rootConn.ConnectionString); - conn.Open(); - MySqlProviderServices providerServices = new MySqlProviderServices(); - string token = null; - - Assert.DoesNotThrow(delegate () { token = providerServices.GetProviderManifestToken(conn); }); - Assert.NotNull(token); - conn.Close(); - } - - public void Dispose() - { - Thread.CurrentThread.CurrentCulture = originalCulture; - st.Dispose(); - } - } -} diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/RelationalOperators.cs b/Tests/MySql.EntityFramework6.Basic.Tests/RelationalOperators.cs deleted file mode 100644 index fbd180420..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/RelationalOperators.cs +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright � 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System; -using System.Data; -using System.Threading; -using MySql.Data.MySqlClient; - -#if !EF6 -using System.Data.EntityClient; -using System.Data.Objects; -#else -using System.Data.Entity.Core.EntityClient; -using System.Data.Entity.Core.Objects; -#endif -using System.Data.Common; -using MySql.Data.Entity.Tests.Properties; -using System.Linq; -using Xunit; -using MySql.Data.Entity.Tests; - -namespace MySql.Data.Entity.Tests -{ - public class RelationalOperators : IUseFixture - { - private SetUpEntityTests st; - - public void SetFixture(SetUpEntityTests data) - { - st = data; - } - - [Fact] - public void Except() - { - /* using (TestDB.TestDB db = new TestDB.TestDB()) - { - var q = from c in db.Companies where - var query = from o in db.Orders - where o.StoreId = 3 - select o; - - var result = query.First(); - }*/ - } - - [Fact] - public void Intersect() - { - } - - [Fact] - public void CrossJoin() - { - } - - [Fact] - public void Union() - { - } - - [Fact] - public void UnionAll() - { - using (testEntities context = new testEntities()) - { - MySqlDataAdapter da = new MySqlDataAdapter( - "SELECT t.Id FROM Toys t UNION ALL SELECT c.Id FROM Companies c", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - - string entitySQL = @"(SELECT t.Id, t.Name FROM Toys AS t) - UNION ALL (SELECT c.Id, c.Name FROM Companies AS c)"; - ObjectQuery query = context.CreateQuery(entitySQL); - - string sql = query.ToTraceString(); - st.CheckSql(sql, SQLSyntax.UnionAll); - - int i = 0; - foreach (DbDataRecord r in query) - { - i++; - } - Assert.Equal(dt.Rows.Count, i); - } - } - - /// - /// Bug #60652 Query returns BLOB type but no BLOBs are in the database. - /// - [Fact] - public void UnionAllWithBitColumnsDoesNotThrow() - { - using (testEntities entities = new testEntities()) - { - // Here, Computer is the base type of DesktopComputer, LaptopComputer and TabletComputer. - // LaptopComputer and TabletComputer include the bit fields that would provoke - // an InvalidCastException (byte[] to bool) when participating in a UNION - // created internally by the Connector/Net entity framework provider. - var computers = from c in entities.Computers - select c; - - foreach (Computer computer in computers) - { - Assert.NotNull(computer); - Assert.True(computer.Id > 0); - } - } - } - } -} \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/RestrictionOperators.cs b/Tests/MySql.EntityFramework6.Basic.Tests/RestrictionOperators.cs deleted file mode 100644 index d5623f833..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/RestrictionOperators.cs +++ /dev/null @@ -1,223 +0,0 @@ -// Copyright � 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Data; -using System.Threading; -using MySql.Data.MySqlClient; -using System.Data.Entity.Core.EntityClient; -using System.Data.Entity.Core.Objects; -using System.Data.Common; -using System.Collections.Generic; -using Xunit; -using MySql.Data.Entity.Tests.Properties; - -namespace MySql.Data.Entity.Tests -{ - public class RestrictionOperators : IUseFixture - { - private SetUpEntityTests st; - - public void SetFixture(SetUpEntityTests data) - { - st = data; - } - - [Fact] - public void SimpleSelect() - { - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Toys", st.conn); - DataTable toys = new DataTable(); - da.Fill(toys); - int i = 0; - - using (testEntities context = new testEntities()) - { - var query = context.CreateQuery("SELECT VALUE c FROM Toys AS c"); - string sql = query.ToTraceString(); - st.CheckSql(sql, SQLSyntax.SimpleSelect); - - foreach (Toy t in query) - { - Assert.Equal(toys.Rows[i++]["name"], t.Name); - } - } - } - - [Fact] - public void SimpleSelectWithFilter() - { - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Toys WHERE minage=4", st.conn); - DataTable toys = new DataTable(); - da.Fill(toys); - int i = 0; - - using (testEntities context = new testEntities()) - { - var query = context.CreateQuery("SELECT VALUE t FROM Toys AS t WHERE t.MinAge=4"); - string sql = query.ToTraceString(); - st.CheckSql(sql, SQLSyntax.SimpleSelectWithFilter); - - foreach (Toy t in query) - Assert.Equal(toys.Rows[i++]["name"], t.Name); - } - } - - [Fact] - public void SimpleSelectWithParam() - { - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Toys WHERE minage>3", st.conn); - DataTable toys = new DataTable(); - da.Fill(toys); - int i = 0; - - using (testEntities context = new testEntities()) - { - var query = context.CreateQuery("SELECT VALUE t FROM Toys AS t WHERE t.MinAge>@age"); - query.Parameters.Add(new ObjectParameter("age", 3)); - string sql = query.ToTraceString(); - st.CheckSql(sql, SQLSyntax.SimpleSelectWithParam); - - foreach (Toy t in query) - { - Assert.Equal(toys.Rows[i++]["name"], t.Name); - } - } - } - - [Fact] - public void WhereLiteralOnRelation() - { - MySqlDataAdapter da = new MySqlDataAdapter("SELECT id FROM Companies WHERE city = 'Dallas'", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - - using (testEntities context = new testEntities()) - { - string eSql = "SELECT VALUE c FROM Companies AS c WHERE c.Address.City = 'Dallas'"; - ObjectQuery query = context.CreateQuery(eSql); - - string sql = query.ToTraceString(); - st.CheckSql(sql, SQLSyntax.WhereLiteralOnRelation); - - int i = 0; - foreach (Company c in query) - Assert.Equal(dt.Rows[i++]["id"], c.Id); - } - } - - [Fact] - public void SelectWithComplexType() - { - MySqlDataAdapter da = new MySqlDataAdapter("SELECT c.LastName FROM Employees AS c WHERE c.Age > 20", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - - using (testEntities context = new testEntities()) - { - string eSql = @"SELECT c.LastName FROM Employees AS c WHERE c.Age > 20"; - ObjectQuery query = context.CreateQuery(eSql); - - string sql = query.ToTraceString(); - st.CheckSql(sql, SQLSyntax.SelectWithComplexType); - - int i = 0; - foreach (DbDataRecord s in query) - Assert.Equal(dt.Rows[i++][0], s.GetString(0)); - } - } - - [Fact] - public void WhereWithRelatedEntities1() - { - MySqlDataAdapter da = new MySqlDataAdapter( - "SELECT c.* FROM Toys t LEFT JOIN Companies c ON c.id=t.SupplierId WHERE c.State='TX'", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - - using (testEntities context = new testEntities()) - { - string eSql = "SELECT VALUE t FROM Toys AS t WHERE t.Supplier.Address.State = 'TX'"; - ObjectQuery query = context.CreateQuery(eSql); - - string sql = query.ToTraceString(); - st.CheckSql(sql, SQLSyntax.WhereWithRelatedEntities1); - - int i = 0; - foreach (Toy t in query) - { - Assert.Equal(dt.Rows[i++]["id"], t.Id); - } - } - } - - [Fact] - public void WhereWithRelatedEntities2() - { - MySqlDataAdapter da = new MySqlDataAdapter( - @"SELECT c.* FROM Toys t LEFT JOIN Companies c ON c.Id=t.SupplierId - WHERE c.State<>'TX' AND c.State<>'AZ'", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - - using (testEntities context = new testEntities()) - { - string eSql = @"SELECT VALUE t FROM Toys AS t - WHERE t.Supplier.Address.State<>'TX' AND t.Supplier.Address.State <> 'AZ'"; - ObjectQuery query = context.CreateQuery(eSql); - - string sql = query.ToTraceString(); - st.CheckSql(sql, SQLSyntax.WhereWithRelatedEntities2); - - int i = 0; - foreach (Toy t in query) - { - Assert.Equal(dt.Rows[i++]["id"], t.Id); - } - } - } - - [Fact] - public void Exists() - { - MySqlDataAdapter da = new MySqlDataAdapter( - @"SELECT c.* FROM Companies c WHERE EXISTS - (SELECT * FROM Toys t WHERE t.SupplierId=c.Id && t.MinAge < 4)", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - - using (testEntities context = new testEntities()) - { - string eSql = @"SELECT VALUE c FROM Companies AS c WHERE EXISTS( - SELECT p FROM c.Toys AS p WHERE p.MinAge < 4)"; - ObjectQuery query = context.CreateQuery(eSql); - - string sql = query.ToTraceString(); - st.CheckSql(sql, SQLSyntax.Exists); - - int i = 0; - foreach (Company c in query) - Assert.Equal(dt.Rows[i++]["id"], c.Id); - } - } - } -} \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/SchemaInformation.cs b/Tests/MySql.EntityFramework6.Basic.Tests/SchemaInformation.cs deleted file mode 100644 index 553711941..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/SchemaInformation.cs +++ /dev/null @@ -1,3213 +0,0 @@ -// Copyright � 2014, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.4900 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -#if !EF6 -[assembly: global::System.Data.Objects.DataClasses.EdmSchemaAttribute()] -[assembly: global::System.Data.Objects.DataClasses.EdmRelationshipAttribute("Store", "TableOrViewColumn", "Parent", global::System.Data.Metadata.Edm.RelationshipMultiplicity.One, typeof(Store.TableOrView), "Column", global::System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Store.Column))] -[assembly: global::System.Data.Objects.DataClasses.EdmRelationshipAttribute("Store", "TableOrViewConstraint", "Parent", global::System.Data.Metadata.Edm.RelationshipMultiplicity.One, typeof(Store.TableOrView), "Constraint", global::System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Store.Constraint))] -[assembly: global::System.Data.Objects.DataClasses.EdmRelationshipAttribute("Store", "TableOrViewConstraintColumn", "Constraint", global::System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Store.TableOrViewColumnConstraint), "Column", global::System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Store.Column))] -[assembly: global::System.Data.Objects.DataClasses.EdmRelationshipAttribute("Store", "ConstraintForeignKey", "Constraint", global::System.Data.Metadata.Edm.RelationshipMultiplicity.One, typeof(Store.ForeignKeyConstraint), "ForeignKey", global::System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Store.ForeignKey))] -[assembly: global::System.Data.Objects.DataClasses.EdmRelationshipAttribute("Store", "ToForeignKeyColumn", "ForeignKey", global::System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Store.ForeignKey), "Column", global::System.Data.Metadata.Edm.RelationshipMultiplicity.One, typeof(Store.Column))] -[assembly: global::System.Data.Objects.DataClasses.EdmRelationshipAttribute("Store", "FromForeignKeyColumn", "ForeignKey", global::System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Store.ForeignKey), "Column", global::System.Data.Metadata.Edm.RelationshipMultiplicity.One, typeof(Store.Column))] -[assembly: global::System.Data.Objects.DataClasses.EdmRelationshipAttribute("Store", "RoutineParameter", "Routine", global::System.Data.Metadata.Edm.RelationshipMultiplicity.One, typeof(Store.Routine), "Parameter", global::System.Data.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Store.Parameter))] -#else -[assembly: global::System.Data.Entity.Core.Objects.DataClasses.EdmSchemaAttribute()] -[assembly: global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipAttribute("Store", "TableOrViewColumn", "Parent", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.One, typeof(Store.TableOrView), "Column", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Store.Column))] -[assembly: global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipAttribute("Store", "TableOrViewConstraint", "Parent", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.One, typeof(Store.TableOrView), "Constraint", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Store.Constraint))] -[assembly: global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipAttribute("Store", "TableOrViewConstraintColumn", "Constraint", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Store.TableOrViewColumnConstraint), "Column", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Store.Column))] -[assembly: global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipAttribute("Store", "ConstraintForeignKey", "Constraint", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.One, typeof(Store.ForeignKeyConstraint), "ForeignKey", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Store.ForeignKey))] -[assembly: global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipAttribute("Store", "ToForeignKeyColumn", "ForeignKey", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Store.ForeignKey), "Column", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.One, typeof(Store.Column))] -[assembly: global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipAttribute("Store", "FromForeignKeyColumn", "ForeignKey", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Store.ForeignKey), "Column", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.One, typeof(Store.Column))] -[assembly: global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipAttribute("Store", "RoutineParameter", "Routine", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.One, typeof(Store.Routine), "Parameter", global::System.Data.Entity.Core.Metadata.Edm.RelationshipMultiplicity.Many, typeof(Store.Parameter))] -#endif - -// Original file name: SchemaInformation.cs -// Generation date: 2/11/2009 2:18:33 PM -namespace Store -{ - - /// - /// There are no comments for SchemaInformation in the schema. - /// -#if !EF6 - public partial class SchemaInformation : global::System.Data.Objects.ObjectContext -#else - public partial class SchemaInformation : global::System.Data.Entity.Core.Objects.ObjectContext -#endif - { - /// - /// Initializes a new SchemaInformation object using the connection string found in the 'SchemaInformation' section of the application configuration file. - /// - public SchemaInformation() : - base("name=SchemaInformation", "SchemaInformation") - { - this.OnContextCreated(); - } - /// - /// Initialize a new SchemaInformation object. - /// - public SchemaInformation(string connectionString) : - base(connectionString, "SchemaInformation") - { - this.OnContextCreated(); - } - /// - /// Initialize a new SchemaInformation object. - /// -#if !EF6 - public SchemaInformation(global::System.Data.EntityClient.EntityConnection connection) - : base(connection, "SchemaInformation") -#else - public SchemaInformation(global::System.Data.Entity.Core.EntityClient.EntityConnection connection) - : base(connection, "SchemaInformation") -#endif - { - this.OnContextCreated(); - } - partial void OnContextCreated(); - /// - /// There are no comments for Tables in the schema. - /// -#if !EF6 - public global::System.Data.Objects.ObjectQuery Tables -#else - public global::System.Data.Entity.Core.Objects.ObjectQuery
Tables -#endif - { - get - { - if ((this._Tables == null)) - { - this._Tables = base.CreateQuery
("[Tables]"); - } - return this._Tables; - } - } -#if !EF6 - private global::System.Data.Objects.ObjectQuery
_Tables; -#else - private global::System.Data.Entity.Core.Objects.ObjectQuery
_Tables; -#endif - /// - /// There are no comments for TableColumns in the schema. - /// -#if !EF6 - public global::System.Data.Objects.ObjectQuery TableColumns -#else - public global::System.Data.Entity.Core.Objects.ObjectQuery TableColumns -#endif - { - get - { - if ((this._TableColumns == null)) - { - this._TableColumns = base.CreateQuery("[TableColumns]"); - } - return this._TableColumns; - } - } -#if !EF6 - private global::System.Data.Objects.ObjectQuery _TableColumns; -#else - private global::System.Data.Entity.Core.Objects.ObjectQuery _TableColumns; -#endif - /// - /// There are no comments for TableConstraints in the schema. - /// -#if !EF6 - public global::System.Data.Objects.ObjectQuery TableConstraints -#else - public global::System.Data.Entity.Core.Objects.ObjectQuery TableConstraints -#endif - { - get - { - if ((this._TableConstraints == null)) - { - this._TableConstraints = base.CreateQuery("[TableConstraints]"); - } - return this._TableConstraints; - } - } -#if !EF6 - private global::System.Data.Objects.ObjectQuery _TableConstraints; -#else - private global::System.Data.Entity.Core.Objects.ObjectQuery _TableConstraints; -#endif - /// - /// There are no comments for TableForeignKeys in the schema. - /// -#if !EF6 - public global::System.Data.Objects.ObjectQuery TableForeignKeys -#else - public global::System.Data.Entity.Core.Objects.ObjectQuery TableForeignKeys -#endif - { - get - { - if ((this._TableForeignKeys == null)) - { - this._TableForeignKeys = base.CreateQuery("[TableForeignKeys]"); - } - return this._TableForeignKeys; - } - } -#if !EF6 - private global::System.Data.Objects.ObjectQuery _TableForeignKeys; -#else - private global::System.Data.Entity.Core.Objects.ObjectQuery _TableForeignKeys; -#endif - /// - /// There are no comments for Views in the schema. - /// -#if !EF6 - public global::System.Data.Objects.ObjectQuery Views -#else - public global::System.Data.Entity.Core.Objects.ObjectQuery Views -#endif - { - get - { - if ((this._Views == null)) - { - this._Views = base.CreateQuery("[Views]"); - } - return this._Views; - } - } -#if !EF6 - private global::System.Data.Objects.ObjectQuery _Views; -#else - private global::System.Data.Entity.Core.Objects.ObjectQuery _Views; -#endif - /// - /// There are no comments for ViewColumns in the schema. - /// -#if !EF6 - public global::System.Data.Objects.ObjectQuery ViewColumns -#else - public global::System.Data.Entity.Core.Objects.ObjectQuery ViewColumns -#endif - { - get - { - if ((this._ViewColumns == null)) - { - this._ViewColumns = base.CreateQuery("[ViewColumns]"); - } - return this._ViewColumns; - } - } -#if !EF6 - private global::System.Data.Objects.ObjectQuery _ViewColumns; -#else - private global::System.Data.Entity.Core.Objects.ObjectQuery _ViewColumns; -#endif - /// - /// There are no comments for ViewConstraints in the schema. - /// -#if !EF6 - public global::System.Data.Objects.ObjectQuery ViewConstraints -#else - public global::System.Data.Entity.Core.Objects.ObjectQuery ViewConstraints -#endif - { - get - { - if ((this._ViewConstraints == null)) - { - this._ViewConstraints = base.CreateQuery("[ViewConstraints]"); - } - return this._ViewConstraints; - } - } -#if !EF6 - private global::System.Data.Objects.ObjectQuery _ViewConstraints; -#else - private global::System.Data.Entity.Core.Objects.ObjectQuery _ViewConstraints; -#endif - /// - /// There are no comments for ViewForeignKeys in the schema. - /// -#if !EF6 - public global::System.Data.Objects.ObjectQuery ViewForeignKeys -#else - public global::System.Data.Entity.Core.Objects.ObjectQuery ViewForeignKeys -#endif - { - get - { - if ((this._ViewForeignKeys == null)) - { - this._ViewForeignKeys = base.CreateQuery("[ViewForeignKeys]"); - } - return this._ViewForeignKeys; - } - } -#if !EF6 - private global::System.Data.Objects.ObjectQuery _ViewForeignKeys; -#else - private global::System.Data.Entity.Core.Objects.ObjectQuery _ViewForeignKeys; -#endif - /// - /// There are no comments for Functions in the schema. - /// -#if !EF6 - public global::System.Data.Objects.ObjectQuery Functions -#else - public global::System.Data.Entity.Core.Objects.ObjectQuery Functions -#endif - { - get - { - if ((this._Functions == null)) - { - this._Functions = base.CreateQuery("[Functions]"); - } - return this._Functions; - } - } -#if !EF6 - private global::System.Data.Objects.ObjectQuery _Functions; -#else - private global::System.Data.Entity.Core.Objects.ObjectQuery _Functions; -#endif - /// - /// There are no comments for FunctionParameters in the schema. - /// -#if !EF6 - public global::System.Data.Objects.ObjectQuery FunctionParameters -#else - public global::System.Data.Entity.Core.Objects.ObjectQuery FunctionParameters -#endif - { - get - { - if ((this._FunctionParameters == null)) - { - this._FunctionParameters = base.CreateQuery("[FunctionParameters]"); - } - return this._FunctionParameters; - } - } -#if !EF6 - private global::System.Data.Objects.ObjectQuery _FunctionParameters; -#else - private global::System.Data.Entity.Core.Objects.ObjectQuery _FunctionParameters; -#endif - /// - /// There are no comments for Procedures in the schema. - /// -#if !EF6 - public global::System.Data.Objects.ObjectQuery Procedures -#else - public global::System.Data.Entity.Core.Objects.ObjectQuery Procedures -#endif - { - get - { - if ((this._Procedures == null)) - { - this._Procedures = base.CreateQuery("[Procedures]"); - } - return this._Procedures; - } - } -#if !EF6 - private global::System.Data.Objects.ObjectQuery _Procedures; -#else - private global::System.Data.Entity.Core.Objects.ObjectQuery _Procedures; -#endif - /// - /// There are no comments for ProcedureParameters in the schema. - /// -#if !EF6 - public global::System.Data.Objects.ObjectQuery ProcedureParameters -#else - public global::System.Data.Entity.Core.Objects.ObjectQuery ProcedureParameters -#endif - { - get - { - if ((this._ProcedureParameters == null)) - { - this._ProcedureParameters = base.CreateQuery("[ProcedureParameters]"); - } - return this._ProcedureParameters; - } - } -#if !EF6 - private global::System.Data.Objects.ObjectQuery _ProcedureParameters; -#else - private global::System.Data.Entity.Core.Objects.ObjectQuery _ProcedureParameters; -#endif - /// - /// There are no comments for Tables in the schema. - /// - public void AddToTables(Table table) - { - base.AddObject("Tables", table); - } - /// - /// There are no comments for TableColumns in the schema. - /// - public void AddToTableColumns(Column column) - { - base.AddObject("TableColumns", column); - } - /// - /// There are no comments for TableConstraints in the schema. - /// - public void AddToTableConstraints(Constraint constraint) - { - base.AddObject("TableConstraints", constraint); - } - /// - /// There are no comments for TableForeignKeys in the schema. - /// - public void AddToTableForeignKeys(ForeignKey foreignKey) - { - base.AddObject("TableForeignKeys", foreignKey); - } - /// - /// There are no comments for Views in the schema. - /// - public void AddToViews(View view) - { - base.AddObject("Views", view); - } - /// - /// There are no comments for ViewColumns in the schema. - /// - public void AddToViewColumns(Column column) - { - base.AddObject("ViewColumns", column); - } - /// - /// There are no comments for ViewConstraints in the schema. - /// - public void AddToViewConstraints(Constraint constraint) - { - base.AddObject("ViewConstraints", constraint); - } - /// - /// There are no comments for ViewForeignKeys in the schema. - /// - public void AddToViewForeignKeys(ForeignKey foreignKey) - { - base.AddObject("ViewForeignKeys", foreignKey); - } - /// - /// There are no comments for Functions in the schema. - /// - public void AddToFunctions(Function function) - { - base.AddObject("Functions", function); - } - /// - /// There are no comments for FunctionParameters in the schema. - /// - public void AddToFunctionParameters(Parameter parameter) - { - base.AddObject("FunctionParameters", parameter); - } - /// - /// There are no comments for Procedures in the schema. - /// - public void AddToProcedures(Procedure procedure) - { - base.AddObject("Procedures", procedure); - } - /// - /// There are no comments for ProcedureParameters in the schema. - /// - public void AddToProcedureParameters(Parameter parameter) - { - base.AddObject("ProcedureParameters", parameter); - } - } - /// - /// There are no comments for ComplexType Store.TypeSpecification in the schema. - /// - [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] - [global::System.Serializable()] -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmComplexTypeAttribute(NamespaceName = "Store", Name = "TypeSpecification")] - public partial class TypeSpecification : global::System.Data.Objects.DataClasses.ComplexObject -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmComplexTypeAttribute(NamespaceName = "Store", Name = "TypeSpecification")] - public partial class TypeSpecification : global::System.Data.Entity.Core.Objects.DataClasses.ComplexObject -#endif - { - /// - /// Create a new TypeSpecification object. - /// - /// Initial value of TypeName. - /// Initial value of Collation. - /// Initial value of CharacterSet. - /// Initial value of IsMultiSet. - public static TypeSpecification CreateTypeSpecification(string typeName, Collation collation, CharacterSet characterSet, bool isMultiSet) - { - TypeSpecification typeSpecification = new TypeSpecification(); - typeSpecification.TypeName = typeName; -#if !EF6 - typeSpecification.Collation = global::System.Data.Objects.DataClasses.StructuralObject.VerifyComplexObjectIsNotNull(collation, "Collation"); - typeSpecification.CharacterSet = global::System.Data.Objects.DataClasses.StructuralObject.VerifyComplexObjectIsNotNull(characterSet, "CharacterSet"); -#else - typeSpecification.Collation = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.VerifyComplexObjectIsNotNull(collation, "Collation"); - typeSpecification.CharacterSet = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.VerifyComplexObjectIsNotNull(characterSet, "CharacterSet"); -#endif - typeSpecification.IsMultiSet = isMultiSet; - return typeSpecification; - } - /// - /// There are no comments for Property TypeName in the schema. - /// -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string TypeName - { - get - { - return this._TypeName; - } - set - { - this.OnTypeNameChanging(value); - this.ReportPropertyChanging("TypeName"); -#if !EF6 - this._TypeName = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#else - this._TypeName = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#endif - this.ReportPropertyChanged("TypeName"); - this.OnTypeNameChanged(); - } - } - private string _TypeName; - partial void OnTypeNameChanging(string value); - partial void OnTypeNameChanged(); - /// - /// There are no comments for Property MaxLength in the schema. - /// -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()] -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public global::System.Nullable MaxLength - { - get - { - return this._MaxLength; - } - set - { - this.OnMaxLengthChanging(value); - this.ReportPropertyChanging("MaxLength"); -#if !EF6 - this._MaxLength = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value); -#else - this._MaxLength = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); -#endif - this.ReportPropertyChanged("MaxLength"); - this.OnMaxLengthChanged(); - } - } - private global::System.Nullable _MaxLength; - partial void OnMaxLengthChanging(global::System.Nullable value); - partial void OnMaxLengthChanged(); - /// - /// There are no comments for Property Precision in the schema. - /// -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()] -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public global::System.Nullable Precision - { - get - { - return this._Precision; - } - set - { - this.OnPrecisionChanging(value); - this.ReportPropertyChanging("Precision"); -#if !EF6 - this._Precision = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value); -#else - this._Precision = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); -#endif - this.ReportPropertyChanged("Precision"); - this.OnPrecisionChanged(); - } - } - private global::System.Nullable _Precision; - partial void OnPrecisionChanging(global::System.Nullable value); - partial void OnPrecisionChanged(); - /// - /// There are no comments for Property DateTimePrecision in the schema. - /// -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()] -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public global::System.Nullable DateTimePrecision - { - get - { - return this._DateTimePrecision; - } - set - { - this.OnDateTimePrecisionChanging(value); - this.ReportPropertyChanging("DateTimePrecision"); -#if !EF6 - this._DateTimePrecision = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value); -#else - this._DateTimePrecision = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); -#endif - this.ReportPropertyChanged("DateTimePrecision"); - this.OnDateTimePrecisionChanged(); - } - } - private global::System.Nullable _DateTimePrecision; - partial void OnDateTimePrecisionChanging(global::System.Nullable value); - partial void OnDateTimePrecisionChanged(); - /// - /// There are no comments for Property Scale in the schema. - /// -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()] -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public global::System.Nullable Scale - { - get - { - return this._Scale; - } - set - { - this.OnScaleChanging(value); - this.ReportPropertyChanging("Scale"); -#if !EF6 - this._Scale = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value); -#else - this._Scale = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); -#endif - this.ReportPropertyChanged("Scale"); - this.OnScaleChanged(); - } - } - private global::System.Nullable _Scale; - partial void OnScaleChanging(global::System.Nullable value); - partial void OnScaleChanged(); - /// - /// There are no comments for Property Collation in the schema. - /// -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmComplexPropertyAttribute()] -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmComplexPropertyAttribute()] -#endif - [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)] - [global::System.Xml.Serialization.XmlElement(IsNullable = true)] - [global::System.Xml.Serialization.SoapElement(IsNullable = true)] - [global::System.Runtime.Serialization.DataMemberAttribute()] - public Collation Collation - { - get - { - this._Collation = this.GetValidValue(this._Collation, "Collation", false, this._CollationInitialized); - this._CollationInitialized = true; - return this._Collation; - } - set - { - this.OnCollationChanging(value); - this.ReportPropertyChanging("Collation"); - this._Collation = this.SetValidValue(this._Collation, value, "Collation"); - this._CollationInitialized = true; - this.ReportPropertyChanged("Collation"); - this.OnCollationChanged(); - } - } - private Collation _Collation; - private bool _CollationInitialized; - partial void OnCollationChanging(Collation value); - partial void OnCollationChanged(); - /// - /// There are no comments for Property CharacterSet in the schema. - /// -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmComplexPropertyAttribute()] -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmComplexPropertyAttribute()] -#endif - [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)] - [global::System.Xml.Serialization.XmlElement(IsNullable = true)] - [global::System.Xml.Serialization.SoapElement(IsNullable = true)] - [global::System.Runtime.Serialization.DataMemberAttribute()] - public CharacterSet CharacterSet - { - get - { - this._CharacterSet = this.GetValidValue(this._CharacterSet, "CharacterSet", false, this._CharacterSetInitialized); - this._CharacterSetInitialized = true; - return this._CharacterSet; - } - set - { - this.OnCharacterSetChanging(value); - this.ReportPropertyChanging("CharacterSet"); - this._CharacterSet = this.SetValidValue(this._CharacterSet, value, "CharacterSet"); - this._CharacterSetInitialized = true; - this.ReportPropertyChanged("CharacterSet"); - this.OnCharacterSetChanged(); - } - } - private CharacterSet _CharacterSet; - private bool _CharacterSetInitialized; - partial void OnCharacterSetChanging(CharacterSet value); - partial void OnCharacterSetChanged(); - /// - /// There are no comments for Property IsMultiSet in the schema. - /// -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public bool IsMultiSet - { - get - { - return this._IsMultiSet; - } - set - { - this.OnIsMultiSetChanging(value); - this.ReportPropertyChanging("IsMultiSet"); -#if !EF6 - this._IsMultiSet = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value); -#else - this._IsMultiSet = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); -#endif - this.ReportPropertyChanged("IsMultiSet"); - this.OnIsMultiSetChanged(); - } - } - private bool _IsMultiSet; - partial void OnIsMultiSetChanging(bool value); - partial void OnIsMultiSetChanged(); - } - /// - /// There are no comments for ComplexType Store.Collation in the schema. - /// -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmComplexTypeAttribute(NamespaceName = "Store", Name = "Collation")] -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmComplexTypeAttribute(NamespaceName = "Store", Name = "Collation")] -#endif - [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] - [global::System.Serializable()] -#if !EF6 - public partial class Collation : global::System.Data.Objects.DataClasses.ComplexObject -#else - public partial class Collation : global::System.Data.Entity.Core.Objects.DataClasses.ComplexObject -#endif - { - /// - /// There are no comments for Property CatalogName in the schema. - /// -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()] -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string CatalogName - { - get - { - return this._CatalogName; - } - set - { - this.OnCatalogNameChanging(value); - this.ReportPropertyChanging("CatalogName"); -#if !EF6 - this._CatalogName = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#else - this._CatalogName = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#endif - this.ReportPropertyChanged("CatalogName"); - this.OnCatalogNameChanged(); - } - } - private string _CatalogName; - partial void OnCatalogNameChanging(string value); - partial void OnCatalogNameChanged(); - /// - /// There are no comments for Property SchemaName in the schema. - /// -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()] -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string SchemaName - { - get - { - return this._SchemaName; - } - set - { - this.OnSchemaNameChanging(value); - this.ReportPropertyChanging("SchemaName"); -#if !EF6 - this._SchemaName = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#else - this._SchemaName = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#endif - this.ReportPropertyChanged("SchemaName"); - this.OnSchemaNameChanged(); - } - } - private string _SchemaName; - partial void OnSchemaNameChanging(string value); - partial void OnSchemaNameChanged(); - /// - /// There are no comments for Property Name in the schema. - /// -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()] -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string Name - { - get - { - return this._Name; - } - set - { - this.OnNameChanging(value); - this.ReportPropertyChanging("Name"); -#if !EF6 - this._Name = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#else - this._Name = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#endif - this.ReportPropertyChanged("Name"); - this.OnNameChanged(); - } - } - private string _Name; - partial void OnNameChanging(string value); - partial void OnNameChanged(); - } - /// - /// There are no comments for ComplexType Store.CharacterSet in the schema. - /// - [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] - [global::System.Serializable()] -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmComplexTypeAttribute(NamespaceName = "Store", Name = "CharacterSet")] - public partial class CharacterSet : global::System.Data.Objects.DataClasses.ComplexObject -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmComplexTypeAttribute(NamespaceName = "Store", Name = "CharacterSet")] - public partial class CharacterSet : global::System.Data.Entity.Core.Objects.DataClasses.ComplexObject -#endif - { - /// - /// There are no comments for Property CatalogName in the schema. - /// -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()] -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string CatalogName - { - get - { - return this._CatalogName; - } - set - { - this.OnCatalogNameChanging(value); - this.ReportPropertyChanging("CatalogName"); -#if !EF6 - this._CatalogName = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#else - this._CatalogName = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#endif - this.ReportPropertyChanged("CatalogName"); - this.OnCatalogNameChanged(); - } - } - private string _CatalogName; - partial void OnCatalogNameChanging(string value); - partial void OnCatalogNameChanged(); - /// - /// There are no comments for Property SchemaName in the schema. - /// -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()] -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string SchemaName - { - get - { - return this._SchemaName; - } - set - { - this.OnSchemaNameChanging(value); - this.ReportPropertyChanging("SchemaName"); -#if !EF6 - this._SchemaName = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#else - this._SchemaName = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#endif - this.ReportPropertyChanged("SchemaName"); - this.OnSchemaNameChanged(); - } - } - private string _SchemaName; - partial void OnSchemaNameChanging(string value); - partial void OnSchemaNameChanged(); - /// - /// There are no comments for Property Name in the schema. - /// -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()] -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string Name - { - get - { - return this._Name; - } - set - { - this.OnNameChanging(value); - this.ReportPropertyChanging("Name"); -#if !EF6 - this._Name = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#else - this._Name = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#endif - this.ReportPropertyChanged("Name"); - this.OnNameChanged(); - } - } - private string _Name; - partial void OnNameChanging(string value); - partial void OnNameChanged(); - } - /// - /// There are no comments for Store.TableOrView in the schema. - /// - /// - /// Id - /// - [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] - [global::System.Serializable()] - [global::System.Runtime.Serialization.KnownTypeAttribute(typeof(global::Store.Table))] - [global::System.Runtime.Serialization.KnownTypeAttribute(typeof(global::Store.View))] -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "TableOrView")] - public abstract partial class TableOrView : global::System.Data.Objects.DataClasses.EntityObject -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "TableOrView")] - public abstract partial class TableOrView : global::System.Data.Entity.Core.Objects.DataClasses.EntityObject -#endif - { - /// - /// There are no comments for Property Id in the schema. - /// -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)] -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string Id - { - get - { - return this._Id; - } - set - { - this.OnIdChanging(value); - this.ReportPropertyChanging("Id"); -#if !EF6 - this._Id = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#else - this._Id = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#endif - this.ReportPropertyChanged("Id"); - this.OnIdChanged(); - } - } - private string _Id; - partial void OnIdChanging(string value); - partial void OnIdChanged(); - /// - /// There are no comments for Property Name in the schema. - /// -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string Name - { - get - { - return this._Name; - } - set - { - this.OnNameChanging(value); - this.ReportPropertyChanging("Name"); -#if !EF6 - this._Name = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#else - this._Name = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#endif - this.ReportPropertyChanged("Name"); - this.OnNameChanged(); - } - } - private string _Name; - partial void OnNameChanging(string value); - partial void OnNameChanged(); - /// - /// There are no comments for Property CatalogName in the schema. - /// -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()] -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string CatalogName - { - get - { - return this._CatalogName; - } - set - { - this.OnCatalogNameChanging(value); - this.ReportPropertyChanging("CatalogName"); -#if !EF6 - this._CatalogName = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#else - this._CatalogName = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#endif - this.ReportPropertyChanged("CatalogName"); - this.OnCatalogNameChanged(); - } - } - private string _CatalogName; - partial void OnCatalogNameChanging(string value); - partial void OnCatalogNameChanged(); - /// - /// There are no comments for Property SchemaName in the schema. - /// -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()] -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string SchemaName - { - get - { - return this._SchemaName; - } - set - { - this.OnSchemaNameChanging(value); - this.ReportPropertyChanging("SchemaName"); -#if !EF6 - this._SchemaName = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#else - this._SchemaName = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#endif - this.ReportPropertyChanged("SchemaName"); - this.OnSchemaNameChanged(); - } - } - private string _SchemaName; - partial void OnSchemaNameChanging(string value); - partial void OnSchemaNameChanged(); - /// - /// There are no comments for Columns in the schema. - /// - [global::System.Xml.Serialization.XmlIgnoreAttribute()] - [global::System.Xml.Serialization.SoapIgnoreAttribute()] - [global::System.Runtime.Serialization.DataMemberAttribute()] -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "TableOrViewColumn", "Column")] - public global::System.Data.Objects.DataClasses.EntityCollection Columns -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "TableOrViewColumn", "Column")] - public global::System.Data.Entity.Core.Objects.DataClasses.EntityCollection Columns -#endif - { - get - { -#if !EF6 - return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection("Store.TableOrViewColumn", "Column"); -#else - return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection("Store.TableOrViewColumn", "Column"); -#endif - } - set - { - if ((value != null)) - { -#if !EF6 - ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection("Store.TableOrViewColumn", "Column", value); -#else - ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection("Store.TableOrViewColumn", "Column", value); -#endif - } - } - } - /// - /// There are no comments for Constraints in the schema. - /// - [global::System.Xml.Serialization.XmlIgnoreAttribute()] - [global::System.Xml.Serialization.SoapIgnoreAttribute()] - [global::System.Runtime.Serialization.DataMemberAttribute()] -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "TableOrViewConstraint", "Constraint")] - public global::System.Data.Objects.DataClasses.EntityCollection Constraints -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "TableOrViewConstraint", "Constraint")] - public global::System.Data.Entity.Core.Objects.DataClasses.EntityCollection Constraints -#endif - { - get - { -#if !EF6 - return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection("Store.TableOrViewConstraint", "Constraint"); -#else - return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection("Store.TableOrViewConstraint", "Constraint"); -#endif - } - set - { - if ((value != null)) - { -#if !EF6 - ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection("Store.TableOrViewConstraint", "Constraint", value); -#else - ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection("Store.TableOrViewConstraint", "Constraint", value); -#endif - } - } - } - } - /// - /// There are no comments for Store.Table in the schema. - /// - /// - /// Id - /// -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "Table")] -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "Table")] -#endif - [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] - [global::System.Serializable()] - public partial class Table : TableOrView - { - /// - /// Create a new Table object. - /// - /// Initial value of Id. - /// Initial value of Name. - public static Table CreateTable(string id, string name) - { - Table table = new Table(); - table.Id = id; - table.Name = name; - return table; - } - } - /// - /// There are no comments for Store.Column in the schema. - /// - /// - /// Id - /// - [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] - [global::System.Serializable()] -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "Column")] - public partial class Column : global::System.Data.Objects.DataClasses.EntityObject -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "Column")] - public partial class Column : global::System.Data.Entity.Core.Objects.DataClasses.EntityObject -#endif - { - /// - /// Create a new Column object. - /// - /// Initial value of Id. - /// Initial value of Name. - /// Initial value of Ordinal. - /// Initial value of IsNullable. - /// Initial value of ColumnType. - /// Initial value of IsIdentity. - /// Initial value of IsStoreGenerated. - public static Column CreateColumn(string id, string name, int ordinal, bool isNullable, TypeSpecification columnType, bool isIdentity, bool isStoreGenerated) - { - Column column = new Column(); - column.Id = id; - column.Name = name; - column.Ordinal = ordinal; - column.IsNullable = isNullable; -#if !EF6 - column.ColumnType = global::System.Data.Objects.DataClasses.StructuralObject.VerifyComplexObjectIsNotNull(columnType, "ColumnType"); -#else - column.ColumnType = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.VerifyComplexObjectIsNotNull(columnType, "ColumnType"); -#endif - column.IsIdentity = isIdentity; - column.IsStoreGenerated = isStoreGenerated; - return column; - } - /// - /// There are no comments for Property Id in the schema. - /// -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)] -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string Id - { - get - { - return this._Id; - } - set - { - this.OnIdChanging(value); - this.ReportPropertyChanging("Id"); -#if !EF6 - this._Id = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#else - this._Id = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#endif - this.ReportPropertyChanged("Id"); - this.OnIdChanged(); - } - } - private string _Id; - partial void OnIdChanging(string value); - partial void OnIdChanged(); - /// - /// There are no comments for Property Name in the schema. - /// -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string Name - { - get - { - return this._Name; - } - set - { - this.OnNameChanging(value); - this.ReportPropertyChanging("Name"); -#if !EF6 - this._Name = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#else - this._Name = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#endif - this.ReportPropertyChanged("Name"); - this.OnNameChanged(); - } - } - private string _Name; - partial void OnNameChanging(string value); - partial void OnNameChanged(); - /// - /// There are no comments for Property Ordinal in the schema. - /// -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public int Ordinal - { - get - { - return this._Ordinal; - } - set - { - this.OnOrdinalChanging(value); - this.ReportPropertyChanging("Ordinal"); -#if !EF6 - this._Ordinal = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value); -#else - this._Ordinal = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); -#endif - this.ReportPropertyChanged("Ordinal"); - this.OnOrdinalChanged(); - } - } - private int _Ordinal; - partial void OnOrdinalChanging(int value); - partial void OnOrdinalChanged(); - /// - /// There are no comments for Property IsNullable in the schema. - /// -#if !EF6 - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#else - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public bool IsNullable - { - get - { - return this._IsNullable; - } - set - { - this.OnIsNullableChanging(value); - this.ReportPropertyChanging("IsNullable"); -#if !EF6 - this._IsNullable = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value); -#else - this._IsNullable = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); -#endif - this.ReportPropertyChanged("IsNullable"); - this.OnIsNullableChanged(); - } - } - private bool _IsNullable; - partial void OnIsNullableChanging(bool value); - partial void OnIsNullableChanged(); - /// - /// There are no comments for Property ColumnType in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmComplexPropertyAttribute()] -#else - [global::System.Data.Objects.DataClasses.EdmComplexPropertyAttribute()] -#endif - [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)] - [global::System.Xml.Serialization.XmlElement(IsNullable = true)] - [global::System.Xml.Serialization.SoapElement(IsNullable = true)] - [global::System.Runtime.Serialization.DataMemberAttribute()] - public TypeSpecification ColumnType - { - get - { - this._ColumnType = this.GetValidValue(this._ColumnType, "ColumnType", false, this._ColumnTypeInitialized); - this._ColumnTypeInitialized = true; - return this._ColumnType; - } - set - { - this.OnColumnTypeChanging(value); - this.ReportPropertyChanging("ColumnType"); - this._ColumnType = this.SetValidValue(this._ColumnType, value, "ColumnType"); - this._ColumnTypeInitialized = true; - this.ReportPropertyChanged("ColumnType"); - this.OnColumnTypeChanged(); - } - } - private TypeSpecification _ColumnType; - private bool _ColumnTypeInitialized; - partial void OnColumnTypeChanging(TypeSpecification value); - partial void OnColumnTypeChanged(); - /// - /// There are no comments for Property IsIdentity in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#else - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public bool IsIdentity - { - get - { - return this._IsIdentity; - } - set - { - this.OnIsIdentityChanging(value); - this.ReportPropertyChanging("IsIdentity"); -#if EF6 - this._IsIdentity = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); -#else - this._IsIdentity = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value); -#endif - this.ReportPropertyChanged("IsIdentity"); - this.OnIsIdentityChanged(); - } - } - private bool _IsIdentity; - partial void OnIsIdentityChanging(bool value); - partial void OnIsIdentityChanged(); - /// - /// There are no comments for Property IsStoreGenerated in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#else - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public bool IsStoreGenerated - { - get - { - return this._IsStoreGenerated; - } - set - { - this.OnIsStoreGeneratedChanging(value); - this.ReportPropertyChanging("IsStoreGenerated"); -#if EF6 - this._IsStoreGenerated = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); -#else - this._IsStoreGenerated = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value); -#endif - this.ReportPropertyChanged("IsStoreGenerated"); - this.OnIsStoreGeneratedChanged(); - } - } - private bool _IsStoreGenerated; - partial void OnIsStoreGeneratedChanging(bool value); - partial void OnIsStoreGeneratedChanged(); - /// - /// There are no comments for Property Default in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] -#else - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string Default - { - get - { - return this._Default; - } - set - { - this.OnDefaultChanging(value); - this.ReportPropertyChanging("Default"); -#if EF6 - this._Default = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#else - this._Default = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#endif - this.ReportPropertyChanged("Default"); - this.OnDefaultChanged(); - } - } - private string _Default; - partial void OnDefaultChanging(string value); - partial void OnDefaultChanged(); - /// - /// There are no comments for Parent in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "TableOrViewColumn", "Parent")] -#else - [global::System.Data.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "TableOrViewColumn", "Parent")] -#endif - [global::System.Xml.Serialization.XmlIgnoreAttribute()] - [global::System.Xml.Serialization.SoapIgnoreAttribute()] - [global::System.Runtime.Serialization.DataMemberAttribute()] - public TableOrView Parent - { - get - { -#if EF6 - return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.TableOrViewColumn", "Parent").Value; -#else - return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.TableOrViewColumn", "Parent").Value; -#endif - } - set - { -#if EF6 - ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.TableOrViewColumn", "Parent").Value = value; -#else - ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.TableOrViewColumn", "Parent").Value = value; -#endif - } - } - /// - /// There are no comments for Parent in the schema. - /// - [global::System.ComponentModel.BrowsableAttribute(false)] - [global::System.Runtime.Serialization.DataMemberAttribute()] -#if EF6 - public global::System.Data.Entity.Core.Objects.DataClasses.EntityReference ParentReference -#else - public global::System.Data.Objects.DataClasses.EntityReference ParentReference -#endif - { - get - { -#if EF6 - return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.TableOrViewColumn", "Parent"); -#else - return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.TableOrViewColumn", "Parent"); -#endif - } - set - { - if ((value != null)) - { -#if EF6 - ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedReference("Store.TableOrViewColumn", "Parent", value); -#else - ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedReference("Store.TableOrViewColumn", "Parent", value); -#endif - } - } - } - /// - /// There are no comments for Constraints in the schema. - /// - [global::System.Xml.Serialization.XmlIgnoreAttribute()] - [global::System.Xml.Serialization.SoapIgnoreAttribute()] - [global::System.Runtime.Serialization.DataMemberAttribute()] -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "TableOrViewConstraintColumn", "Constraint")] - public global::System.Data.Entity.Core.Objects.DataClasses.EntityCollection Constraints -#else - [global::System.Data.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "TableOrViewConstraintColumn", "Constraint")] - public global::System.Data.Objects.DataClasses.EntityCollection Constraints -#endif - { - get - { -#if EF6 - return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection("Store.TableOrViewConstraintColumn", "Constraint"); -#else - return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection("Store.TableOrViewConstraintColumn", "Constraint"); -#endif - } - set - { - if ((value != null)) - { -#if EF6 - ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection("Store.TableOrViewConstraintColumn", "Constraint", value); -#else - ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection("Store.TableOrViewConstraintColumn", "Constraint", value); -#endif - } - } - } - /// - /// There are no comments for ToForeignKeys in the schema. - /// - [global::System.Xml.Serialization.XmlIgnoreAttribute()] - [global::System.Xml.Serialization.SoapIgnoreAttribute()] - [global::System.Runtime.Serialization.DataMemberAttribute()] -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "ToForeignKeyColumn", "ForeignKey")] - public global::System.Data.Entity.Core.Objects.DataClasses.EntityCollection ToForeignKeys -#else - [global::System.Data.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "ToForeignKeyColumn", "ForeignKey")] - public global::System.Data.Objects.DataClasses.EntityCollection ToForeignKeys -#endif - { - get - { -#if EF6 - return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection("Store.ToForeignKeyColumn", "ForeignKey"); -#else - return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection("Store.ToForeignKeyColumn", "ForeignKey"); -#endif - } - set - { - if ((value != null)) - { -#if EF6 - ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection("Store.ToForeignKeyColumn", "ForeignKey", value); -#else - ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection("Store.ToForeignKeyColumn", "ForeignKey", value); -#endif - } - } - } - /// - /// There are no comments for FromForeignKeys in the schema. - /// - [global::System.Xml.Serialization.XmlIgnoreAttribute()] - [global::System.Xml.Serialization.SoapIgnoreAttribute()] - [global::System.Runtime.Serialization.DataMemberAttribute()] -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "FromForeignKeyColumn", "ForeignKey")] - public global::System.Data.Entity.Core.Objects.DataClasses.EntityCollection FromForeignKeys -#else - [global::System.Data.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "FromForeignKeyColumn", "ForeignKey")] - public global::System.Data.Objects.DataClasses.EntityCollection FromForeignKeys -#endif - { - get - { -#if EF6 - return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection("Store.FromForeignKeyColumn", "ForeignKey"); -#else - return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection("Store.FromForeignKeyColumn", "ForeignKey"); -#endif - } - set - { - if ((value != null)) - { -#if EF6 - ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection("Store.FromForeignKeyColumn", "ForeignKey", value); -#else - ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection("Store.FromForeignKeyColumn", "ForeignKey", value); -#endif - } - } - } - } - /// - /// There are no comments for Store.View in the schema. - /// - /// - /// Id - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "View")] -#else - [global::System.Data.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "View")] -#endif - [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] - [global::System.Serializable()] - public partial class View : TableOrView - { - /// - /// Create a new View object. - /// - /// Initial value of Id. - /// Initial value of Name. - /// Initial value of IsUpdatable. - public static View CreateView(string id, string name, bool isUpdatable) - { - View view = new View(); - view.Id = id; - view.Name = name; - view.IsUpdatable = isUpdatable; - return view; - } - /// - /// There are no comments for Property IsUpdatable in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#else - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public bool IsUpdatable - { - get - { - return this._IsUpdatable; - } - set - { - this.OnIsUpdatableChanging(value); - this.ReportPropertyChanging("IsUpdatable"); -#if EF6 - this._IsUpdatable = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); -#else - this._IsUpdatable = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value); -#endif - this.ReportPropertyChanged("IsUpdatable"); - this.OnIsUpdatableChanged(); - } - } - private bool _IsUpdatable; - partial void OnIsUpdatableChanging(bool value); - partial void OnIsUpdatableChanged(); - /// - /// There are no comments for Property ViewDefinition in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] -#else - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string ViewDefinition - { - get - { - return this._ViewDefinition; - } - set - { - this.OnViewDefinitionChanging(value); - this.ReportPropertyChanging("ViewDefinition"); -#if EF6 - this._ViewDefinition = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#else - this._ViewDefinition = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#endif - this.ReportPropertyChanged("ViewDefinition"); - this.OnViewDefinitionChanged(); - } - } - private string _ViewDefinition; - partial void OnViewDefinitionChanging(string value); - partial void OnViewDefinitionChanged(); - } - /// - /// There are no comments for Store.Routine in the schema. - /// - /// - /// Id - /// - [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] - [global::System.Serializable()] - [global::System.Runtime.Serialization.KnownTypeAttribute(typeof(global::Store.Function))] - [global::System.Runtime.Serialization.KnownTypeAttribute(typeof(global::Store.Procedure))] -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "Routine")] - public abstract partial class Routine : global::System.Data.Entity.Core.Objects.DataClasses.EntityObject -#else - [global::System.Data.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "Routine")] - public abstract partial class Routine : global::System.Data.Objects.DataClasses.EntityObject -#endif - { - /// - /// There are no comments for Property Id in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)] -#else - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string Id - { - get - { - return this._Id; - } - set - { - this.OnIdChanging(value); - this.ReportPropertyChanging("Id"); -#if EF6 - this._Id = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#else - this._Id = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#endif - this.ReportPropertyChanged("Id"); - this.OnIdChanged(); - } - } - private string _Id; - partial void OnIdChanging(string value); - partial void OnIdChanged(); - /// - /// There are no comments for Property CatalogName in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] -#else - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string CatalogName - { - get - { - return this._CatalogName; - } - set - { - this.OnCatalogNameChanging(value); - this.ReportPropertyChanging("CatalogName"); -#if EF6 - this._CatalogName = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#else - this._CatalogName = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#endif - this.ReportPropertyChanged("CatalogName"); - this.OnCatalogNameChanged(); - } - } - private string _CatalogName; - partial void OnCatalogNameChanging(string value); - partial void OnCatalogNameChanged(); - /// - /// There are no comments for Property SchemaName in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] -#else - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string SchemaName - { - get - { - return this._SchemaName; - } - set - { - this.OnSchemaNameChanging(value); - this.ReportPropertyChanging("SchemaName"); -#if EF6 - this._SchemaName = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#else - this._SchemaName = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#endif - this.ReportPropertyChanged("SchemaName"); - this.OnSchemaNameChanged(); - } - } - private string _SchemaName; - partial void OnSchemaNameChanging(string value); - partial void OnSchemaNameChanged(); - /// - /// There are no comments for Property Name in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#else - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string Name - { - get - { - return this._Name; - } - set - { - this.OnNameChanging(value); - this.ReportPropertyChanging("Name"); -#if EF6 - this._Name = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#else - this._Name = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#endif - this.ReportPropertyChanged("Name"); - this.OnNameChanged(); - } - } - private string _Name; - partial void OnNameChanging(string value); - partial void OnNameChanged(); - /// - /// There are no comments for Parameters in the schema. - /// - [global::System.Xml.Serialization.XmlIgnoreAttribute()] - [global::System.Xml.Serialization.SoapIgnoreAttribute()] - [global::System.Runtime.Serialization.DataMemberAttribute()] -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "RoutineParameter", "Parameter")] - public global::System.Data.Entity.Core.Objects.DataClasses.EntityCollection Parameters -#else - [global::System.Data.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "RoutineParameter", "Parameter")] - public global::System.Data.Objects.DataClasses.EntityCollection Parameters -#endif - { - get - { -#if EF6 - return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection("Store.RoutineParameter", "Parameter"); -#else - return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection("Store.RoutineParameter", "Parameter"); -#endif - } - set - { - if ((value != null)) - { -#if EF6 - ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection("Store.RoutineParameter", "Parameter", value); -#else - ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection("Store.RoutineParameter", "Parameter", value); -#endif - } - } - } - } - /// - /// There are no comments for Store.Parameter in the schema. - /// - /// - /// Id - /// - [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] - [global::System.Serializable()] -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "Parameter")] - public partial class Parameter : global::System.Data.Entity.Core.Objects.DataClasses.EntityObject -#else - [global::System.Data.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "Parameter")] - public partial class Parameter : global::System.Data.Objects.DataClasses.EntityObject -#endif - { - /// - /// Create a new Parameter object. - /// - /// Initial value of Id. - /// Initial value of Name. - /// Initial value of Ordinal. - /// Initial value of ParameterType. - public static Parameter CreateParameter(string id, string name, int ordinal, TypeSpecification parameterType) - { - Parameter parameter = new Parameter(); - parameter.Id = id; - parameter.Name = name; - parameter.Ordinal = ordinal; -#if EF6 - parameter.ParameterType = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.VerifyComplexObjectIsNotNull(parameterType, "ParameterType"); -#else - parameter.ParameterType = global::System.Data.Objects.DataClasses.StructuralObject.VerifyComplexObjectIsNotNull(parameterType, "ParameterType"); -#endif - return parameter; - } - /// - /// There are no comments for Property Id in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)] -#else - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string Id - { - get - { - return this._Id; - } - set - { - this.OnIdChanging(value); - this.ReportPropertyChanging("Id"); -#if EF6 - this._Id = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#else - this._Id = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#endif - this.ReportPropertyChanged("Id"); - this.OnIdChanged(); - } - } - private string _Id; - partial void OnIdChanging(string value); - partial void OnIdChanged(); - /// - /// There are no comments for Property Name in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#else - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string Name - { - get - { - return this._Name; - } - set - { - this.OnNameChanging(value); - this.ReportPropertyChanging("Name"); -#if EF6 - this._Name = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#else - this._Name = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#endif - this.ReportPropertyChanged("Name"); - this.OnNameChanged(); - } - } - private string _Name; - partial void OnNameChanging(string value); - partial void OnNameChanged(); - /// - /// There are no comments for Property Ordinal in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#else - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public int Ordinal - { - get - { - return this._Ordinal; - } - set - { - this.OnOrdinalChanging(value); - this.ReportPropertyChanging("Ordinal"); -#if EF6 - this._Ordinal = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); -#else - this._Ordinal = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value); -#endif - this.ReportPropertyChanged("Ordinal"); - this.OnOrdinalChanged(); - } - } - private int _Ordinal; - partial void OnOrdinalChanging(int value); - partial void OnOrdinalChanged(); - /// - /// There are no comments for Property ParameterType in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmComplexPropertyAttribute()] -#else - [global::System.Data.Objects.DataClasses.EdmComplexPropertyAttribute()] -#endif - [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)] - [global::System.Xml.Serialization.XmlElement(IsNullable = true)] - [global::System.Xml.Serialization.SoapElement(IsNullable = true)] - [global::System.Runtime.Serialization.DataMemberAttribute()] - public TypeSpecification ParameterType - { - get - { - this._ParameterType = this.GetValidValue(this._ParameterType, "ParameterType", false, this._ParameterTypeInitialized); - this._ParameterTypeInitialized = true; - return this._ParameterType; - } - set - { - this.OnParameterTypeChanging(value); - this.ReportPropertyChanging("ParameterType"); - this._ParameterType = this.SetValidValue(this._ParameterType, value, "ParameterType"); - this._ParameterTypeInitialized = true; - this.ReportPropertyChanged("ParameterType"); - this.OnParameterTypeChanged(); - } - } - private TypeSpecification _ParameterType; - private bool _ParameterTypeInitialized; - partial void OnParameterTypeChanging(TypeSpecification value); - partial void OnParameterTypeChanged(); - /// - /// There are no comments for Property Mode in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] -#else - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string Mode - { - get - { - return this._Mode; - } - set - { - this.OnModeChanging(value); - this.ReportPropertyChanging("Mode"); -#if EF6 - this._Mode = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#else - this._Mode = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#endif - this.ReportPropertyChanged("Mode"); - this.OnModeChanged(); - } - } - private string _Mode; - partial void OnModeChanging(string value); - partial void OnModeChanged(); - /// - /// There are no comments for Property Default in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] -#else - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string Default - { - get - { - return this._Default; - } - set - { - this.OnDefaultChanging(value); - this.ReportPropertyChanging("Default"); -#if EF6 - this._Default = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#else - this._Default = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#endif - this.ReportPropertyChanged("Default"); - this.OnDefaultChanged(); - } - } - private string _Default; - partial void OnDefaultChanging(string value); - partial void OnDefaultChanged(); - /// - /// There are no comments for Routine in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "RoutineParameter", "Routine")] -#else - [global::System.Data.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "RoutineParameter", "Routine")] -#endif - [global::System.Xml.Serialization.XmlIgnoreAttribute()] - [global::System.Xml.Serialization.SoapIgnoreAttribute()] - [global::System.Runtime.Serialization.DataMemberAttribute()] - public Routine Routine - { - get - { -#if EF6 - return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.RoutineParameter", "Routine").Value; -#else - return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.RoutineParameter", "Routine").Value; -#endif - } - set - { -#if EF6 - ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.RoutineParameter", "Routine").Value = value; -#else - ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.RoutineParameter", "Routine").Value = value; -#endif - } - } - /// - /// There are no comments for Routine in the schema. - /// - [global::System.ComponentModel.BrowsableAttribute(false)] - [global::System.Runtime.Serialization.DataMemberAttribute()] -#if EF6 - public global::System.Data.Entity.Core.Objects.DataClasses.EntityReference RoutineReference -#else - public global::System.Data.Objects.DataClasses.EntityReference RoutineReference -#endif - { - get - { -#if EF6 - return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.RoutineParameter", "Routine"); -#else - return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.RoutineParameter", "Routine"); -#endif - } - set - { - if ((value != null)) - { -#if EF6 - ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedReference("Store.RoutineParameter", "Routine", value); -#else - ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedReference("Store.RoutineParameter", "Routine", value); -#endif - } - } - } - } - /// - /// There are no comments for Store.Function in the schema. - /// - /// - /// Id - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "Function")] -#else - [global::System.Data.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "Function")] -#endif - [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] - [global::System.Serializable()] - [global::System.Runtime.Serialization.KnownTypeAttribute(typeof(global::Store.ScalarFunction))] - public abstract partial class Function : Routine - { - /// - /// There are no comments for Property IsBuiltIn in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] -#else - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public global::System.Nullable IsBuiltIn - { - get - { - return this._IsBuiltIn; - } - set - { - this.OnIsBuiltInChanging(value); - this.ReportPropertyChanging("IsBuiltIn"); -#if EF6 - this._IsBuiltIn = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); -#else - this._IsBuiltIn = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value); -#endif - this.ReportPropertyChanged("IsBuiltIn"); - this.OnIsBuiltInChanged(); - } - } - private global::System.Nullable _IsBuiltIn; - partial void OnIsBuiltInChanging(global::System.Nullable value); - partial void OnIsBuiltInChanged(); - /// - /// There are no comments for Property IsNiladic in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] -#else - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public global::System.Nullable IsNiladic - { - get - { - return this._IsNiladic; - } - set - { - this.OnIsNiladicChanging(value); - this.ReportPropertyChanging("IsNiladic"); -#if EF6 - this._IsNiladic = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); -#else - this._IsNiladic = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value); -#endif - this.ReportPropertyChanged("IsNiladic"); - this.OnIsNiladicChanged(); - } - } - private global::System.Nullable _IsNiladic; - partial void OnIsNiladicChanging(global::System.Nullable value); - partial void OnIsNiladicChanged(); - } - /// - /// There are no comments for Store.ScalarFunction in the schema. - /// - /// - /// Id - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "ScalarFunction")] -#else - [global::System.Data.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "ScalarFunction")] -#endif - [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] - [global::System.Serializable()] - public partial class ScalarFunction : Function - { - /// - /// Create a new ScalarFunction object. - /// - /// Initial value of Id. - /// Initial value of Name. - /// Initial value of ReturnType. - public static ScalarFunction CreateScalarFunction(string id, string name, TypeSpecification returnType) - { - ScalarFunction scalarFunction = new ScalarFunction(); - scalarFunction.Id = id; - scalarFunction.Name = name; -#if EF6 - scalarFunction.ReturnType = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.VerifyComplexObjectIsNotNull(returnType, "ReturnType"); -#else - scalarFunction.ReturnType = global::System.Data.Objects.DataClasses.StructuralObject.VerifyComplexObjectIsNotNull(returnType, "ReturnType"); -#endif - return scalarFunction; - } - /// - /// There are no comments for Property ReturnType in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmComplexPropertyAttribute()] -#else - [global::System.Data.Objects.DataClasses.EdmComplexPropertyAttribute()] -#endif - [global::System.ComponentModel.DesignerSerializationVisibility(global::System.ComponentModel.DesignerSerializationVisibility.Content)] - [global::System.Xml.Serialization.XmlElement(IsNullable = true)] - [global::System.Xml.Serialization.SoapElement(IsNullable = true)] - [global::System.Runtime.Serialization.DataMemberAttribute()] - public TypeSpecification ReturnType - { - get - { - this._ReturnType = this.GetValidValue(this._ReturnType, "ReturnType", false, this._ReturnTypeInitialized); - this._ReturnTypeInitialized = true; - return this._ReturnType; - } - set - { - this.OnReturnTypeChanging(value); - this.ReportPropertyChanging("ReturnType"); - this._ReturnType = this.SetValidValue(this._ReturnType, value, "ReturnType"); - this._ReturnTypeInitialized = true; - this.ReportPropertyChanged("ReturnType"); - this.OnReturnTypeChanged(); - } - } - private TypeSpecification _ReturnType; - private bool _ReturnTypeInitialized; - partial void OnReturnTypeChanging(TypeSpecification value); - partial void OnReturnTypeChanged(); - /// - /// There are no comments for Property IsAggregate in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] -#else - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public global::System.Nullable IsAggregate - { - get - { - return this._IsAggregate; - } - set - { - this.OnIsAggregateChanging(value); - this.ReportPropertyChanging("IsAggregate"); -#if EF6 - this._IsAggregate = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); -#else - this._IsAggregate = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value); -#endif - this.ReportPropertyChanged("IsAggregate"); - this.OnIsAggregateChanged(); - } - } - private global::System.Nullable _IsAggregate; - partial void OnIsAggregateChanging(global::System.Nullable value); - partial void OnIsAggregateChanged(); - } - /// - /// There are no comments for Store.Procedure in the schema. - /// - /// - /// Id - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "Procedure")] -#else - [global::System.Data.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "Procedure")] -#endif - [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] - [global::System.Serializable()] - public partial class Procedure : Routine - { - /// - /// Create a new Procedure object. - /// - /// Initial value of Id. - /// Initial value of Name. - public static Procedure CreateProcedure(string id, string name) - { - Procedure procedure = new Procedure(); - procedure.Id = id; - procedure.Name = name; - return procedure; - } - } - /// - /// There are no comments for Store.Constraint in the schema. - /// - /// - /// Id - /// - [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] - [global::System.Serializable()] - [global::System.Runtime.Serialization.KnownTypeAttribute(typeof(global::Store.TableOrViewColumnConstraint))] - [global::System.Runtime.Serialization.KnownTypeAttribute(typeof(global::Store.ForeignKeyConstraint))] - [global::System.Runtime.Serialization.KnownTypeAttribute(typeof(global::Store.CheckConstraint))] -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "Constraint")] - public abstract partial class Constraint : global::System.Data.Entity.Core.Objects.DataClasses.EntityObject -#else - [global::System.Data.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "Constraint")] - public abstract partial class Constraint : global::System.Data.Objects.DataClasses.EntityObject -#endif - { - /// - /// There are no comments for Property Id in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)] -#else - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string Id - { - get - { - return this._Id; - } - set - { - this.OnIdChanging(value); - this.ReportPropertyChanging("Id"); -#if EF6 - this._Id = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#else - this._Id = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#endif - this.ReportPropertyChanged("Id"); - this.OnIdChanged(); - } - } - private string _Id; - partial void OnIdChanging(string value); - partial void OnIdChanged(); - /// - /// There are no comments for Property Name in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#else - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string Name - { - get - { - return this._Name; - } - set - { - this.OnNameChanging(value); - this.ReportPropertyChanging("Name"); -#if EF6 - this._Name = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#else - this._Name = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#endif - this.ReportPropertyChanged("Name"); - this.OnNameChanged(); - } - } - private string _Name; - partial void OnNameChanging(string value); - partial void OnNameChanged(); - /// - /// There are no comments for Property IsDeferrable in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#else - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public bool IsDeferrable - { - get - { - return this._IsDeferrable; - } - set - { - this.OnIsDeferrableChanging(value); - this.ReportPropertyChanging("IsDeferrable"); -#if EF6 - this._IsDeferrable = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); -#else - this._IsDeferrable = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value); -#endif - this.ReportPropertyChanged("IsDeferrable"); - this.OnIsDeferrableChanged(); - } - } - private bool _IsDeferrable; - partial void OnIsDeferrableChanging(bool value); - partial void OnIsDeferrableChanged(); - /// - /// There are no comments for Property IsInitiallyDeferred in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#else - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public bool IsInitiallyDeferred - { - get - { - return this._IsInitiallyDeferred; - } - set - { - this.OnIsInitiallyDeferredChanging(value); - this.ReportPropertyChanging("IsInitiallyDeferred"); -#if EF6 - this._IsInitiallyDeferred = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); -#else - this._IsInitiallyDeferred = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value); -#endif - this.ReportPropertyChanged("IsInitiallyDeferred"); - this.OnIsInitiallyDeferredChanged(); - } - } - private bool _IsInitiallyDeferred; - partial void OnIsInitiallyDeferredChanging(bool value); - partial void OnIsInitiallyDeferredChanged(); - /// - /// There are no comments for Parent in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "TableOrViewConstraint", "Parent")] -#else - [global::System.Data.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "TableOrViewConstraint", "Parent")] -#endif - [global::System.Xml.Serialization.XmlIgnoreAttribute()] - [global::System.Xml.Serialization.SoapIgnoreAttribute()] - [global::System.Runtime.Serialization.DataMemberAttribute()] - public TableOrView Parent - { - get - { -#if EF6 - return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.TableOrViewConstraint", "Parent").Value; -#else - return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.TableOrViewConstraint", "Parent").Value; -#endif - } - set - { -#if EF6 - ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.TableOrViewConstraint", "Parent").Value = value; -#else - ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.TableOrViewConstraint", "Parent").Value = value; -#endif - } - } - /// - /// There are no comments for Parent in the schema. - /// - [global::System.ComponentModel.BrowsableAttribute(false)] - [global::System.Runtime.Serialization.DataMemberAttribute()] -#if EF6 - public global::System.Data.Entity.Core.Objects.DataClasses.EntityReference ParentReference -#else - public global::System.Data.Objects.DataClasses.EntityReference ParentReference -#endif - { - get - { -#if EF6 - return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.TableOrViewConstraint", "Parent"); -#else - return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.TableOrViewConstraint", "Parent"); -#endif - } - set - { - if ((value != null)) - { -#if EF6 - ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedReference("Store.TableOrViewConstraint", "Parent", value); -#else - ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedReference("Store.TableOrViewConstraint", "Parent", value); -#endif - } - } - } - } - /// - /// There are no comments for Store.CheckConstraint in the schema. - /// - /// - /// Id - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "CheckConstraint")] -#else - [global::System.Data.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "CheckConstraint")] -#endif - [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] - [global::System.Serializable()] - public partial class CheckConstraint : Constraint - { - /// - /// Create a new CheckConstraint object. - /// - /// Initial value of Id. - /// Initial value of Name. - /// Initial value of IsDeferrable. - /// Initial value of IsInitiallyDeferred. - public static CheckConstraint CreateCheckConstraint(string id, string name, bool isDeferrable, bool isInitiallyDeferred) - { - CheckConstraint checkConstraint = new CheckConstraint(); - checkConstraint.Id = id; - checkConstraint.Name = name; - checkConstraint.IsDeferrable = isDeferrable; - checkConstraint.IsInitiallyDeferred = isInitiallyDeferred; - return checkConstraint; - } - /// - /// There are no comments for Property Expression in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute()] -#else - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute()] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string Expression - { - get - { - return this._Expression; - } - set - { - this.OnExpressionChanging(value); - this.ReportPropertyChanging("Expression"); -#if EF6 - this._Expression = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#else - this._Expression = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, true); -#endif - this.ReportPropertyChanged("Expression"); - this.OnExpressionChanged(); - } - } - private string _Expression; - partial void OnExpressionChanging(string value); - partial void OnExpressionChanged(); - } - /// - /// There are no comments for Store.TableOrViewColumnConstraint in the schema. - /// - /// - /// Id - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "TableOrViewColumnConstraint")] -#else - [global::System.Data.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "TableOrViewColumnConstraint")] -#endif - [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] - [global::System.Serializable()] - [global::System.Runtime.Serialization.KnownTypeAttribute(typeof(global::Store.PrimaryKeyConstraint))] - [global::System.Runtime.Serialization.KnownTypeAttribute(typeof(global::Store.UniqueConstraint))] - public abstract partial class TableOrViewColumnConstraint : Constraint - { - /// - /// There are no comments for Columns in the schema. - /// - [global::System.Xml.Serialization.XmlIgnoreAttribute()] - [global::System.Xml.Serialization.SoapIgnoreAttribute()] - [global::System.Runtime.Serialization.DataMemberAttribute()] -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "TableOrViewConstraintColumn", "Column")] - public global::System.Data.Entity.Core.Objects.DataClasses.EntityCollection Columns -#else - [global::System.Data.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "TableOrViewConstraintColumn", "Column")] - public global::System.Data.Objects.DataClasses.EntityCollection Columns -#endif - { - get - { -#if EF6 - return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection("Store.TableOrViewConstraintColumn", "Column"); -#else - return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection("Store.TableOrViewConstraintColumn", "Column"); -#endif - } - set - { - if ((value != null)) - { -#if EF6 - ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection("Store.TableOrViewConstraintColumn", "Column", value); -#else - ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection("Store.TableOrViewConstraintColumn", "Column", value); -#endif - } - } - } - } - /// - /// There are no comments for Store.PrimaryKeyConstraint in the schema. - /// - /// - /// Id - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "PrimaryKeyConstraint")] -#else - [global::System.Data.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "PrimaryKeyConstraint")] -#endif - [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] - [global::System.Serializable()] - public partial class PrimaryKeyConstraint : TableOrViewColumnConstraint - { - /// - /// Create a new PrimaryKeyConstraint object. - /// - /// Initial value of Id. - /// Initial value of Name. - /// Initial value of IsDeferrable. - /// Initial value of IsInitiallyDeferred. - public static PrimaryKeyConstraint CreatePrimaryKeyConstraint(string id, string name, bool isDeferrable, bool isInitiallyDeferred) - { - PrimaryKeyConstraint primaryKeyConstraint = new PrimaryKeyConstraint(); - primaryKeyConstraint.Id = id; - primaryKeyConstraint.Name = name; - primaryKeyConstraint.IsDeferrable = isDeferrable; - primaryKeyConstraint.IsInitiallyDeferred = isInitiallyDeferred; - return primaryKeyConstraint; - } - } - /// - /// There are no comments for Store.UniqueConstraint in the schema. - /// - /// - /// Id - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "UniqueConstraint")] -#else - [global::System.Data.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "UniqueConstraint")] -#endif - [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] - [global::System.Serializable()] - public partial class UniqueConstraint : TableOrViewColumnConstraint - { - /// - /// Create a new UniqueConstraint object. - /// - /// Initial value of Id. - /// Initial value of Name. - /// Initial value of IsDeferrable. - /// Initial value of IsInitiallyDeferred. - public static UniqueConstraint CreateUniqueConstraint(string id, string name, bool isDeferrable, bool isInitiallyDeferred) - { - UniqueConstraint uniqueConstraint = new UniqueConstraint(); - uniqueConstraint.Id = id; - uniqueConstraint.Name = name; - uniqueConstraint.IsDeferrable = isDeferrable; - uniqueConstraint.IsInitiallyDeferred = isInitiallyDeferred; - return uniqueConstraint; - } - } - /// - /// There are no comments for Store.ForeignKeyConstraint in the schema. - /// - /// - /// Id - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "ForeignKeyConstraint")] -#else - [global::System.Data.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "ForeignKeyConstraint")] -#endif - [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] - [global::System.Serializable()] - public partial class ForeignKeyConstraint : Constraint - { - /// - /// Create a new ForeignKeyConstraint object. - /// - /// Initial value of Id. - /// Initial value of Name. - /// Initial value of IsDeferrable. - /// Initial value of IsInitiallyDeferred. - /// Initial value of UpdateRule. - /// Initial value of DeleteRule. - public static ForeignKeyConstraint CreateForeignKeyConstraint(string id, string name, bool isDeferrable, bool isInitiallyDeferred, string updateRule, string deleteRule) - { - ForeignKeyConstraint foreignKeyConstraint = new ForeignKeyConstraint(); - foreignKeyConstraint.Id = id; - foreignKeyConstraint.Name = name; - foreignKeyConstraint.IsDeferrable = isDeferrable; - foreignKeyConstraint.IsInitiallyDeferred = isInitiallyDeferred; - foreignKeyConstraint.UpdateRule = updateRule; - foreignKeyConstraint.DeleteRule = deleteRule; - return foreignKeyConstraint; - } - /// - /// There are no comments for Property UpdateRule in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#else - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string UpdateRule - { - get - { - return this._UpdateRule; - } - set - { - this.OnUpdateRuleChanging(value); - this.ReportPropertyChanging("UpdateRule"); -#if EF6 - this._UpdateRule = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#else - this._UpdateRule = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#endif - this.ReportPropertyChanged("UpdateRule"); - this.OnUpdateRuleChanged(); - } - } - private string _UpdateRule; - partial void OnUpdateRuleChanging(string value); - partial void OnUpdateRuleChanged(); - /// - /// There are no comments for Property DeleteRule in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#else - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string DeleteRule - { - get - { - return this._DeleteRule; - } - set - { - this.OnDeleteRuleChanging(value); - this.ReportPropertyChanging("DeleteRule"); -#if EF6 - this._DeleteRule = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#else - this._DeleteRule = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#endif - this.ReportPropertyChanged("DeleteRule"); - this.OnDeleteRuleChanged(); - } - } - private string _DeleteRule; - partial void OnDeleteRuleChanging(string value); - partial void OnDeleteRuleChanged(); - /// - /// There are no comments for ForeignKeys in the schema. - /// - [global::System.Xml.Serialization.XmlIgnoreAttribute()] - [global::System.Xml.Serialization.SoapIgnoreAttribute()] - [global::System.Runtime.Serialization.DataMemberAttribute()] -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "ConstraintForeignKey", "ForeignKey")] - public global::System.Data.Entity.Core.Objects.DataClasses.EntityCollection ForeignKeys -#else - [global::System.Data.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "ConstraintForeignKey", "ForeignKey")] - public global::System.Data.Objects.DataClasses.EntityCollection ForeignKeys -#endif - { - get - { -#if EF6 - return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection("Store.ConstraintForeignKey", "ForeignKey"); -#else - return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedCollection("Store.ConstraintForeignKey", "ForeignKey"); -#endif - } - set - { - if ((value != null)) - { -#if EF6 - ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection("Store.ConstraintForeignKey", "ForeignKey", value); -#else - ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedCollection("Store.ConstraintForeignKey", "ForeignKey", value); -#endif - } - } - } - } - /// - /// There are no comments for Store.ForeignKey in the schema. - /// - /// - /// Id - /// - [global::System.Runtime.Serialization.DataContractAttribute(IsReference = true)] - [global::System.Serializable()] -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "ForeignKey")] - public partial class ForeignKey : global::System.Data.Entity.Core.Objects.DataClasses.EntityObject -#else - [global::System.Data.Objects.DataClasses.EdmEntityTypeAttribute(NamespaceName = "Store", Name = "ForeignKey")] - public partial class ForeignKey : global::System.Data.Objects.DataClasses.EntityObject -#endif - { - /// - /// Create a new ForeignKey object. - /// - /// Initial value of Id. - /// Initial value of Ordinal. - public static ForeignKey CreateForeignKey(string id, int ordinal) - { - ForeignKey foreignKey = new ForeignKey(); - foreignKey.Id = id; - foreignKey.Ordinal = ordinal; - return foreignKey; - } - /// - /// There are no comments for Property Id in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)] -#else - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(EntityKeyProperty = true, IsNullable = false)] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public string Id - { - get - { - return this._Id; - } - set - { - this.OnIdChanging(value); - this.ReportPropertyChanging("Id"); -#if EF6 - this._Id = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#else - this._Id = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value, false); -#endif - this.ReportPropertyChanged("Id"); - this.OnIdChanged(); - } - } - private string _Id; - partial void OnIdChanging(string value); - partial void OnIdChanged(); - /// - /// There are no comments for Property Ordinal in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#else - [global::System.Data.Objects.DataClasses.EdmScalarPropertyAttribute(IsNullable = false)] -#endif - [global::System.Runtime.Serialization.DataMemberAttribute()] - public int Ordinal - { - get - { - return this._Ordinal; - } - set - { - this.OnOrdinalChanging(value); - this.ReportPropertyChanging("Ordinal"); -#if EF6 - this._Ordinal = global::System.Data.Entity.Core.Objects.DataClasses.StructuralObject.SetValidValue(value); -#else - this._Ordinal = global::System.Data.Objects.DataClasses.StructuralObject.SetValidValue(value); -#endif - this.ReportPropertyChanged("Ordinal"); - this.OnOrdinalChanged(); - } - } - private int _Ordinal; - partial void OnOrdinalChanging(int value); - partial void OnOrdinalChanged(); - /// - /// There are no comments for Constraint in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "ConstraintForeignKey", "Constraint")] -#else - [global::System.Data.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "ConstraintForeignKey", "Constraint")] -#endif - [global::System.Xml.Serialization.XmlIgnoreAttribute()] - [global::System.Xml.Serialization.SoapIgnoreAttribute()] - [global::System.Runtime.Serialization.DataMemberAttribute()] - public ForeignKeyConstraint Constraint - { - get - { -#if EF6 - return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.ConstraintForeignKey", "Constraint").Value; -#else - return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.ConstraintForeignKey", "Constraint").Value; -#endif - } - set - { -#if EF6 - ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.ConstraintForeignKey", "Constraint").Value = value; -#else - ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.ConstraintForeignKey", "Constraint").Value = value; -#endif - } - } - /// - /// There are no comments for Constraint in the schema. - /// - [global::System.ComponentModel.BrowsableAttribute(false)] - [global::System.Runtime.Serialization.DataMemberAttribute()] -#if EF6 - public global::System.Data.Entity.Core.Objects.DataClasses.EntityReference ConstraintReference -#else - public global::System.Data.Objects.DataClasses.EntityReference ConstraintReference -#endif - { - get - { -#if EF6 - return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.ConstraintForeignKey", "Constraint"); -#else - return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.ConstraintForeignKey", "Constraint"); -#endif - } - set - { - if ((value != null)) - { -#if EF6 - ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedReference("Store.ConstraintForeignKey", "Constraint", value); -#else - ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedReference("Store.ConstraintForeignKey", "Constraint", value); -#endif - } - } - } - /// - /// There are no comments for FromColumn in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "FromForeignKeyColumn", "Column")] -#else - [global::System.Data.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "FromForeignKeyColumn", "Column")] -#endif - [global::System.Xml.Serialization.XmlIgnoreAttribute()] - [global::System.Xml.Serialization.SoapIgnoreAttribute()] - [global::System.Runtime.Serialization.DataMemberAttribute()] - public Column FromColumn - { - get - { -#if EF6 - return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.FromForeignKeyColumn", "Column").Value; -#else - return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.FromForeignKeyColumn", "Column").Value; -#endif - } - set - { -#if EF6 - ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.FromForeignKeyColumn", "Column").Value = value; -#else - ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.FromForeignKeyColumn", "Column").Value = value; -#endif - } - } - /// - /// There are no comments for FromColumn in the schema. - /// - [global::System.ComponentModel.BrowsableAttribute(false)] - [global::System.Runtime.Serialization.DataMemberAttribute()] -#if EF6 - public global::System.Data.Entity.Core.Objects.DataClasses.EntityReference FromColumnReference -#else - public global::System.Data.Objects.DataClasses.EntityReference FromColumnReference -#endif - { - get - { -#if EF6 - return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.FromForeignKeyColumn", "Column"); -#else - return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.FromForeignKeyColumn", "Column"); -#endif - } - set - { - if ((value != null)) - { -#if EF6 - ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedReference("Store.FromForeignKeyColumn", "Column", value); -#else - ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedReference("Store.FromForeignKeyColumn", "Column", value); -#endif - } - } - } - /// - /// There are no comments for ToColumn in the schema. - /// -#if EF6 - [global::System.Data.Entity.Core.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "ToForeignKeyColumn", "Column")] -#else - [global::System.Data.Objects.DataClasses.EdmRelationshipNavigationPropertyAttribute("Store", "ToForeignKeyColumn", "Column")] -#endif - [global::System.Xml.Serialization.XmlIgnoreAttribute()] - [global::System.Xml.Serialization.SoapIgnoreAttribute()] - [global::System.Runtime.Serialization.DataMemberAttribute()] - public Column ToColumn - { - get - { -#if EF6 - return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.ToForeignKeyColumn", "Column").Value; -#else - return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.ToForeignKeyColumn", "Column").Value; -#endif - } - set - { -#if EF6 - ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.ToForeignKeyColumn", "Column").Value = value; -#else - ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.ToForeignKeyColumn", "Column").Value = value; -#endif - } - } - /// - /// There are no comments for ToColumn in the schema. - /// - [global::System.ComponentModel.BrowsableAttribute(false)] - [global::System.Runtime.Serialization.DataMemberAttribute()] -#if EF6 - public global::System.Data.Entity.Core.Objects.DataClasses.EntityReference ToColumnReference -#else - public global::System.Data.Objects.DataClasses.EntityReference ToColumnReference -#endif - { - get - { -#if EF6 - return ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.ToForeignKeyColumn", "Column"); -#else - return ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.GetRelatedReference("Store.ToForeignKeyColumn", "Column"); -#endif - } - set - { - if ((value != null)) - { -#if EF6 - ((global::System.Data.Entity.Core.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedReference("Store.ToForeignKeyColumn", "Column", value); -#else - ((global::System.Data.Objects.DataClasses.IEntityWithRelationships)(this)).RelationshipManager.InitializeRelatedReference("Store.ToForeignKeyColumn", "Column", value); -#endif - } - } - } - } -} diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/SetOperators.cs b/Tests/MySql.EntityFramework6.Basic.Tests/SetOperators.cs deleted file mode 100644 index 8584760d6..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/SetOperators.cs +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright � 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Data; -using System.Threading; -using MySql.Data.MySqlClient; - -#if !EF6 -using System.Data.EntityClient; -using System.Data.Objects; -#else -using System.Data.Entity.Core.EntityClient; -using System.Data.Entity.Core.Objects; -#endif -using System.Data.Common; -using System.Linq; -using MySql.Data.Entity.Tests.Properties; -using Xunit; -using MySql.Data.Entity.Tests; - -namespace MySql.Data.Entity.Tests -{ - public class SetOperators : IUseFixture - { - private SetUpEntityTests st; - - public void SetFixture(SetUpEntityTests data) - { - st = data; - } - [Fact] - public void Any() - { - MySqlDataAdapter da = new MySqlDataAdapter( - @"SELECT a.id FROM authors a WHERE NOT EXISTS(SELECT * FROM books b WHERE b.author_id=a.id)", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - - int i = 0; - // find all authors that are in our db with no books - using (testEntities context = new testEntities()) - { - var authors = from a in context.Authors where !a.Books.Any() select a; - - string sql = authors.ToTraceString(); - st.CheckSql(sql, SQLSyntax.Any); - - foreach (Author a in authors) - Assert.Equal(dt.Rows[i++]["id"], a.Id); - } - } - - [Fact] - public void FirstSimple() - { - MySqlCommand cmd = new MySqlCommand("SELECT id FROM orders", st.conn); - int id = (int)cmd.ExecuteScalar(); - - using (testEntities context = new testEntities()) - { - var q = from o in context.Orders - select o; - Order order = q.First() as Order; - - Assert.Equal(id, order.Id); - } - } - - [Fact] - public void FirstPredicate() - { - MySqlCommand cmd = new MySqlCommand("SELECT id FROM orders WHERE freight > 100", st.conn); - int id = (int)cmd.ExecuteScalar(); - - using (testEntities context = new testEntities()) - { - var q = from o in context.Orders - where o.Freight > 100 - select o; - Order order = q.First() as Order; - Assert.Equal(id, order.Id); - } - } - - [Fact] - public void Distinct() - { - using (testEntities context = new testEntities()) - { - MySqlDataAdapter da = new MySqlDataAdapter("SELECT * FROM Companies LIMIT 2", st.conn); - DataTable dt = new DataTable(); - da.Fill(dt); - - int i = 0; - var query = context.Companies.Top("2"); - foreach (Company c in query) - { - Assert.Equal(dt.Rows[i++]["id"], c.Id); - } - } - } - } -} \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/SetUpClass.cs b/Tests/MySql.EntityFramework6.Basic.Tests/SetUpClass.cs deleted file mode 100644 index e6328cb24..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/SetUpClass.cs +++ /dev/null @@ -1,496 +0,0 @@ -// Copyright © 2013, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Configuration; -using Xunit; -using System.Reflection; -using System.Data; -using System.IO; -using MySql.Data.MySqlClient; - -namespace MySql.Data.Entity.Tests -{ - public class SetUpClass : IDisposable - { - private int numProcessesRunning; - private bool disposed = false; - - #region Properties - - public int maxPacketSize { get; set; } - public MySqlConnection rootConn { get; set; } - public string host { get; set; } - public string user { get; set; } - public string password { get; set; } - public int port { get; set; } - public string pipeName { get; set; } - public string memoryName { get; set; } - public string rootUser { get; set; } - public string rootPassword { get; set; } - public string database0 { get; set; } - public string database1 { get; set; } - public Version version { get; set; } - - public string table; - public string csAdditions = String.Empty; - public bool accessToMySqlDb; - - - - - public MySqlConnection conn { get; set; } - - public Version Version - { - get - { - if (version == null) - { - string versionString = rootConn.ServerVersion; - int i = 0; - while (i < versionString.Length && - (Char.IsDigit(versionString[i]) || versionString[i] == '.')) - i++; - - version = new Version(versionString.Substring(0, i)); - } - return version; - } - } - - #endregion - - public SetUpClass() - { - Init(); - } - - public virtual void Init() - { - MyInit(); - } - - public void MyInit() - { - LoadBaseConfiguration(); - Initialize(); - - SetupRootConnection(); - - if (rootConn.ServerVersion.StartsWith("5", StringComparison.Ordinal)) - { - // run all tests in strict mode - MySqlCommand cmd = new MySqlCommand("SET GLOBAL SQL_MODE=STRICT_ALL_TABLES", rootConn); - cmd.ExecuteNonQuery(); - } - - - Assembly executingAssembly = Assembly.GetExecutingAssembly(); - Stream stream = executingAssembly.GetManifestResourceStream("MySql.Data.Entity.Tests.Properties.Setup.sql"); - - StreamReader sr = new StreamReader(stream); - string sql = sr.ReadToEnd(); - sr.Close(); - - SetAccountPerms(accessToMySqlDb); - sql = sql.Replace("[database0]", database0); - sql = sql.Replace("[database1]", database1); - - ExecuteSQLAsRoot(sql); - Open(); -#if !RT - numProcessesRunning = CountProcesses(); -#endif - } - - public void SetAccountPerms(bool includeProc) - { - // now allow our user to access them - suExecSQL(String.Format(@"GRANT ALL ON `{0}`.* to 'test'@'localhost' - identified by 'test'", database0)); - suExecSQL(String.Format(@"GRANT SELECT ON `{0}`.* to 'test'@'localhost' - identified by 'test'", database1)); - if (Version.Major >= 5) - suExecSQL(String.Format(@"GRANT EXECUTE ON `{0}`.* to 'test'@'localhost' - identified by 'test'", database1)); - - if (includeProc) - { - // now allow our user to access them - suExecSQL(@"GRANT ALL ON mysql.proc to 'test'@'localhost' identified by 'test'"); - } - - suExecSQL("FLUSH PRIVILEGES"); - } - - - - public void LoadBaseConfiguration() - { - user = "test"; - password = "test"; - string portString = null; - - rootUser = ConfigurationManager.AppSettings["rootuser"]; - rootPassword = ConfigurationManager.AppSettings["rootpassword"]; - host = ConfigurationManager.AppSettings["host"]; - portString = ConfigurationManager.AppSettings["port"]; - memoryName = ConfigurationManager.AppSettings["memory_name"]; - pipeName = ConfigurationManager.AppSettings["memory_name"]; - - if (string.IsNullOrEmpty(rootUser)) - rootUser = "root"; - if (string.IsNullOrEmpty(rootPassword)) - rootPassword = ""; - if (string.IsNullOrEmpty(host)) - host = "localhost"; - if (string.IsNullOrEmpty(portString)) - port = 3305; - else - port = int.Parse(portString); - if (string.IsNullOrEmpty(pipeName)) - pipeName = "MySQLSocket"; - if (string.IsNullOrEmpty(memoryName)) - memoryName = "MySQLSocket"; - - } - - public virtual void Initialize() - { - // we don't use FileVersion because it's not available - // on the compact framework - - string fullname = Assembly.GetExecutingAssembly().FullName; - - string[] parts = fullname.Split(new char[] { '=' }); - string[] versionParts = parts[1].Split(new char[] { '.' }); - database0 = String.Format("db{0}{1}{2}-a", versionParts[0], versionParts[1], port - 3300); - database1 = String.Format("db{0}{1}{2}-b", versionParts[0], versionParts[1], port - 3300); - MySqlConnection.ClearAllPools(); - } - - public virtual string GetConnectionInfo() - { - if (OnGetConnectionStringInfo != null) - return OnGetConnectionStringInfo(); - return String.Format(";protocol=sockets;port={0};", port); - } - - public delegate string GetConnectionStringInfoCallback(); - - public event GetConnectionStringInfoCallback OnGetConnectionStringInfo; - - public string GetConnectionString(string userId, string pw, bool persistSecurityInfo, bool includedb) - { - string connStr = String.Format("server={0};user id={1};pooling=false;" + - "persist security info={2};connection reset=true;allow user variables=true;port={3};", - host, userId, persistSecurityInfo.ToString().ToLower(), port); - if (pw != null) - connStr += String.Format(";password={0};", pw); - if (includedb) - connStr += String.Format("database={0};", database0); - connStr += GetConnectionInfo(); - connStr += csAdditions; - return connStr; - } - - public string GetConnectionString(string userId, string pw, bool includedb) - { - return GetConnectionString(userId, pw, true, includedb); - } - - public string GetConnectionString(bool includedb) - { - return GetConnectionString(user, password, includedb); - } - - public void SetupRootConnection() - { - string connStr = GetConnectionString(rootUser, rootPassword, false); - rootConn = new MySqlConnection(connStr + ";database=mysql"); - rootConn.Open(); - } - - public void Open() - { - string connString = GetConnectionString(true); - conn = new MySqlConnection(connString); - conn.Open(); - } - - public void suExecSQL(string sql) - { - if (rootConn.State != ConnectionState.Open) - rootConn.Open(); - - MySqlCommand cmd = new MySqlCommand(sql, rootConn); - cmd.ExecuteNonQuery(); - } - -#if !RT - - public bool TableExists(string tableName) - { - string[] restrictions = new string[4]; - restrictions[2] = tableName; - DataTable dt = conn.GetSchema("Tables", restrictions); - return dt.Rows.Count > 0; - } - - - public int CountProcesses() - { - MySqlDataAdapter da = new MySqlDataAdapter("SHOW PROCESSLIST", rootConn); - DataTable dt = new DataTable(); - da.Fill(dt); - return dt.Rows.Count; - } - - public DataTable FillTable(string sql) - { - MySqlDataAdapter da = new MySqlDataAdapter(sql, conn); - DataTable dt = new DataTable(); - da.Fill(dt); - return dt; - } - -#endif - - - public void DropDatabase(string name) - { - for (int i = 0; i < 5; i++) - { - try - { - suExecSQL(String.Format("DROP DATABASE IF EXISTS `{0}`", name)); - return; - } - catch (Exception) - { -#if !RT - System.Threading.Thread.Sleep(1000); -#endif - } - } - } - -#if !RT - public void CheckOrphanedConnections() - { - // wait up to 5 seconds for our connection to close - int procs = CountProcesses(); - for (int x = 0; x < 50; x++) - { - if (procs == numProcessesRunning) break; - System.Threading.Thread.Sleep(100); - procs = CountProcesses(); - } - if (procs > numProcessesRunning) - { - KillOrphanedConnections(); - int temp = CountProcesses(); - Assert.True(numProcessesRunning == temp, "Killing orphaned connections failed"); - Assert.True(numProcessesRunning == procs, "Too many processes still running"); - } - } - - public void KillOrphanedConnections() - { - MySqlDataAdapter da = new MySqlDataAdapter("SHOW PROCESSLIST", rootConn); - DataTable dt = new DataTable(); - da.Fill(dt); - foreach (DataRow row in dt.Rows) - { - long id = (long)row[0]; - if (id == rootConn.ServerThread) continue; - if (id == conn.ServerThread) continue; - suExecSQL(String.Format("KILL {0}", id)); - } - } - -#endif - - - public string GetPoolingConnectionString() - { - string s = GetConnectionString(true); - s = s.Replace("pooling=false", "pooling=true"); - return s; - } - - - public void KillConnection(MySqlConnection c) - { - int threadId = c.ServerThread; - MySqlCommand cmd = new MySqlCommand("KILL " + threadId, conn); - cmd.ExecuteNonQuery(); - - // the kill flag might need a little prodding to do its thing - try - { - cmd.CommandText = "SELECT 1"; - cmd.Connection = c; - cmd.ExecuteNonQuery(); - } - catch (Exception) { } - - // now wait till the process dies - bool processStillAlive = false; - while (true) - { - MySqlCommand cmdProcess = new MySqlCommand("SHOW PROCESSLIST", conn); - MySqlDataReader dr = cmdProcess.ExecuteReader(); - while (dr.Read()) - { - if (dr.GetInt32(0) == threadId) processStillAlive = true; - } - dr.Close(); - - if (!processStillAlive) break; - System.Threading.Thread.Sleep(500); - } - } - - public void KillPooledConnection(string connStr) - { - MySqlConnection c = new MySqlConnection(connStr); - c.Open(); - KillConnection(c); - } - - public void execSQL(string sql) - { - MySqlCommand cmd = new MySqlCommand(sql, conn); - cmd.ExecuteNonQuery(); - } - - public MySqlDataReader execReader(string sql) - { - MySqlCommand cmd = new MySqlCommand(sql, conn); - return cmd.ExecuteReader(); - } - - - public void createTable(string sql, string engine) - { - if (Version >= new Version(4, 1)) - sql += " ENGINE=" + engine; - else - sql += " TYPE=" + engine; - execSQL(sql); - } - - public void ExecuteSQLAsRoot(string sql) - { - MySqlScript s = new MySqlScript(rootConn, sql); - s.Execute(); - } - - public virtual void Dispose(bool disposing) - { - if (disposed) - return; - - if (disposing) - { - MySqlConnection.ClearAllPools(); - -#if !RT - CheckOrphanedConnections(); -#endif - if (rootConn.State == ConnectionState.Closed) - rootConn.Open(); - - DropDatabase(database0); - DropDatabase(database1); - - DropDatabase("Perm"); - - rootConn.Close(); - conn.Close(); - } - - disposed = true; - - } - - public virtual void Dispose() - { - Dispose(true); - } - } - - /// - /// This Setup class changes the initialization semantic to be exeucuted once per unit test, instead of once per Fixture class. - /// - public class SetUpClassPerTestInit : SetUpClass - { - public SetUpClassPerTestInit() - { - // No initialization - } - - public override void Init() - { - // Does nothing, so constructor of base class does nothing. - } - } - - /// - /// This is a companion of the previous class to allow customization before inialization code. - /// - public class SpecialFixtureWithCustomConnectionString : IUseFixture, IDisposable - { - public SetUpClassPerTestInit st; - - public virtual void SetFixture(SetUpClassPerTestInit data) - { - st = data; - st.OnGetConnectionStringInfo += new SetUpClass.GetConnectionStringInfoCallback(OnGetConnectionStringInfo); - st.MyInit(); - //if (st.conn.State != ConnectionState.Open) - // st.conn.Open(); - } - - /// - /// Override to provide special connect options like using pipes, compression, etc. - /// - /// - public virtual string OnGetConnectionStringInfo() - { - return "protocol=sockets;"; - } - - public void Dispose() - { - Dispose(true); - } - - public virtual void Dispose(bool disposing) - { - if (!disposing) return; - st.Dispose(); - } - } -} diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/SetUpEntityTests.cs b/Tests/MySql.EntityFramework6.Basic.Tests/SetUpEntityTests.cs deleted file mode 100644 index 8d7220d7e..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/SetUpEntityTests.cs +++ /dev/null @@ -1,129 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using MySql.Data.MySqlClient; -using System.Diagnostics; -using System.Resources; -using Xunit; -using System.Linq; -using System.Data.Entity.Core.Objects; -#if EF5 -using System.Data.Entity.Core.Objects; -using System.Data.Entity.Core.EntityClient; -using System.Data.Entity.Core.Objects; -#endif - -namespace MySql.Data.Entity.Tests -{ - public class SetUpEntityTests : SetUpClass - { - // A trace listener to use during testing. - private AssertFailTraceListener asertFailListener = new AssertFailTraceListener(); - - //internal protected override void Initialize() - //{ - // database0 = database1 = "test"; - // MySqlConnection.ClearAllPools(); - //} - - public SetUpEntityTests() - { - // Replace existing listeners with listener for testing. - Trace.Listeners.Clear(); - Trace.Listeners.Add(this.asertFailListener); - - ResourceManager r = new ResourceManager("MySql.Data.Entity.Tests.Properties.Resources", typeof(SetUpEntityTests).Assembly); - string schema = r.GetString("schema"); - MySqlScript script = new MySqlScript(base.conn); - script.Query = schema; - script.Execute(); - - // now create our procs - schema = r.GetString("procs"); - script = new MySqlScript(base.conn); - script.Delimiter = "$$"; - script.Query = schema; - script.Execute(); - - //ModelFirstModel1 - schema = r.GetString("ModelFirstModel1"); - script = new MySqlScript(base.conn); - script.Query = schema; - script.Execute(); - - MySqlCommand cmd = new MySqlCommand("DROP DATABASE IF EXISTS `modeldb`", base.rootConn); - cmd.ExecuteNonQuery(); - } - -#if EF5 - private EntityConnection GetEntityConnection() - { - string connectionString = String.Format( - "metadata=TestDB.csdl|TestDB.msl|TestDB.ssdl;provider=MySql.Data.MySqlClient; provider connection string=\"{0}\"", GetConnectionString(true)); - EntityConnection connection = new EntityConnection(connectionString); - return connection; - } -#endif - - protected internal void CheckSql(string sql, string refSql) - { - StringBuilder str1 = new StringBuilder(); - StringBuilder str2 = new StringBuilder(); - foreach (char c in sql) - if (!Char.IsWhiteSpace(c)) - str1.Append(c); - foreach (char c in refSql) - if (!Char.IsWhiteSpace(c)) - str2.Append(c); - Assert.Equal(0, String.Compare(str1.ToString(), str2.ToString(), true)); - } - - - private class AssertFailTraceListener : DefaultTraceListener - { - public override void Fail(string message) - { - //Assert.Fail("Assertion failure: " + message); - } - - public override void Fail(string message, string detailMessage) - { - //Assert.Fail("Assertion failure: " + detailMessage); - } - } - } - - public static class ExtensionMethods - { - public static string ToTraceString(this IQueryable t) - { - // try to cast to ObjectQuery - ObjectQuery oqt = t as ObjectQuery; - if (oqt != null) - return oqt.ToTraceString(); - return ""; - } - } -} diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/UpdateTests.cs b/Tests/MySql.EntityFramework6.Basic.Tests/UpdateTests.cs deleted file mode 100644 index c84c653af..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/UpdateTests.cs +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright � 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Data; -using System.Diagnostics; -using System.Text.RegularExpressions; -using System.Threading; -using MySql.Data.MySqlClient; - -using System.Data.Common; -#if !EF6 -using System.Data.EntityClient; -using System.Data.Objects; -#else -using System.Data.Entity.Core.EntityClient; -using System.Data.Entity.Core.Objects; -#endif -using Xunit; - - -namespace MySql.Data.Entity.Tests -{ - public class UpdateTests : IUseFixture - { - private SetUpEntityTests st; - - public void SetFixture(SetUpEntityTests data) - { - st = data; - } - - [Fact] - public void UpdateAllRows() - { - MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM toys", st.conn); - object count = cmd.ExecuteScalar(); - - using (testEntities context = new testEntities()) - { - foreach (Toy t in context.Toys) - t.Name = "Top"; - context.SaveChanges(); - } - - cmd.CommandText = "SELECT COUNT(*) FROM Toys WHERE name='Top'"; - object newCount = cmd.ExecuteScalar(); - Assert.Equal(count, newCount); - } - - /// - /// Fix for "Connector/Net Generates Incorrect SELECT Clause after UPDATE" (MySql bug #62134, Oracle bug #13491689). - /// - [Fact] - public void UpdateSimple() - { - using (testEntities context = new testEntities()) - { - MySqlTrace.Listeners.Clear(); - MySqlTrace.Switch.Level = SourceLevels.All; - GenericListener listener = new GenericListener(); - MySqlTrace.Listeners.Add(listener); - Product pc = null; - try - { - pc = new Product(); - pc.Name= "Acme"; - context.AddToProducts(pc); - context.SaveChanges(); - pc.Name = "Acme 2"; - context.SaveChanges(); - } - finally - { -#if CLR4 - context.Products.DeleteObject(pc); -#endif - } - // Check sql - Regex rx = new Regex(@"Query Opened: (?UPDATE .*)", RegexOptions.Compiled | RegexOptions.Singleline); - foreach( string s in listener.Strings ) - { - Match m = rx.Match(s); - if (m.Success) - { - st.CheckSql(m.Groups["item"].Value, MySql.Data.Entity.Tests.Properties.SQLSyntax.UpdateWithSelect); - //TODO:check assert.fail commented. - //Assert.Pass(); - } - } - //Assert.Fail(); - } - } - } -} \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/Wizard.cs b/Tests/MySql.EntityFramework6.Basic.Tests/Wizard.cs deleted file mode 100644 index 2eb656ed0..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/Wizard.cs +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Threading; -using MySql.Data.MySqlClient; - -#if !EF6 -using System.Data.EntityClient; -using System.Data.Objects; -using System.Data.Entity.Design; -#else -using System.Data.Entity.Core.Common; -using System.Data.Entity.Core.EntityClient; -using System.Data.Entity.Core.Objects; -using System.Data.Entity.ModelConfiguration.Design; -#endif -using System.Data.Common; -using System.Linq; -using Store; -using System.Configuration; -using System.Xml; -using Xunit; - - -namespace MySql.Data.Entity.Tests -{ - // This test unit covers the tests that the wizard runs when generating a model - // from an existing database - public class WizardTests : IUseFixture - { - private SetUpEntityTests st; - - public void SetFixture(SetUpEntityTests data) - { - st = data; - } - -#if !EF6 - private EntityConnection GetConnection() - { - return EntityStoreSchemaGenerator.CreateStoreSchemaConnection( - "MySql.Data.MySqlClient", string.Format(@"server=localhost;uid=root;database=test;pooling=false; port={0}", st.port)); - } - - [Fact] - public void SelectAllTables() - { - st.execSQL("CREATE TABLE IF NOT EXISTS test (id int)"); - - System.Data.DataTable dt = st.conn.GetSchema("Tables"); - - using (EntityConnection ec = GetConnection()) - { - using (SchemaInformation si = new SchemaInformation(ec)) - { - int i = 0; - var q = si.Tables.Select("it.CatalogName, it.SchemaName, it.Name").OrderBy("it.Name, it.SchemaName"); - foreach (DbDataRecord t in q) - Assert.Equal(dt.Rows[i++]["TABLE_NAME"], t.GetString(2)); - } - } - } - - - [Fact] - public void SelectAllViews() - { - st.execSQL("CREATE TABLE IF NOT EXISTS test(id int)"); - st.execSQL("CREATE VIEW view1 as SELECT * FROM test"); - - System.Data.DataTable dt = st.conn.GetSchema("Views"); - - using (EntityConnection ec = GetConnection()) - { - using (SchemaInformation si = new SchemaInformation(ec)) - { - int i = 0; - var q = si.Views.Select("it.CatalogName, it.SchemaName, it.Name").OrderBy("it.Name, it.SchemaName"); - foreach (DbDataRecord t in q) - Assert.Equal(dt.Rows[i++]["TABLE_NAME"], t.GetString(2)); - } - } - } -#endif - - [Fact] - public void GetDbProviderManifestTokenReturnsCorrectSchemaVersion() - { - if (st.Version < new Version(5, 0)) return; - - MySqlProviderServices services = new MySqlProviderServices(); - string token = services.GetProviderManifestToken(st.conn); - - if (st.Version < new Version(5, 1)) - Assert.Equal("5.0", token); - else if (st.Version < new Version(5, 5)) - Assert.Equal("5.1", token); - else if (st.Version < new Version(5, 6)) - Assert.Equal("5.5", token); - else if (st.Version < new Version(5, 7)) - Assert.Equal("5.6", token); - else - Assert.Equal("5.7", token); - } - - [Fact] - public void GetStoreSchemaDescriptionDoesNotThrowForServer50OrGreater() - { - if (st.Version < new Version(5, 0)) return; - - MySqlProviderManifest manifest = new MySqlProviderManifest(st.Version.Major + "." + st.Version.Minor); -#if !EF6 - using (XmlReader reader = manifest.GetInformation(DbProviderManifest.StoreSchemaDefinition)) -#else - using (XmlReader reader = manifest.GetInformation(DbXmlEnabledProviderManifest.StoreSchemaDefinition)) -#endif - { - Assert.NotNull(reader); - } - } - } -} \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Basic.Tests/project.json b/Tests/MySql.EntityFramework6.Basic.Tests/project.json deleted file mode 100644 index 3362ffaa5..000000000 --- a/Tests/MySql.EntityFramework6.Basic.Tests/project.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "version": "7.0.7-m6", - "description": "MySql.Data.EF6.CodeFirst.Tests", - "authors": [ - "Oracle" - ], - "copyright": "Copyright © 2016, 2017, Oracle and/or its affiliates. All rights reserved.", - "language": "en-US", - "packOptions": { - "projectUrl": "http://dev.mysql.com/downloads/", - "licenseUrl": "http://www.gnu.org/licenses/old-licenses/gpl-2.0.html", - "iconUrl": "http://www.mysql.com/common/logos/logo-mysql-170x115.png", - "tags": [ - "MySql", - ".NET Connector", - "MySql Connector/NET" - ], - "requireLicenseAcceptance": true - }, - "dependencies": { - "EntityFramework": "6.1.3", - "xunit": "1.9.2", - "MySql.Data": { - "target": "project" - }, - "MySql.Data.Entity.EF6": { - "target": "project" - } - }, - "frameworks": { - "net451": { - "buildOptions": { - "define": [ "EF6" ] - }, - "keyFile": "../../ConnectorNetPublicKey.snk", - "delaySign": true, - "publicSign": false, - "frameworkAssemblies": { - "System.Data": "", - "System.ComponentModel.DataAnnotations": "", - "System.Core": "", - "System.Data.DataSetExtensions": "", - "System.Security": "", - "System.Xml": "", - "System.Runtime.Serialization": "", - "System.Runtime": { - "type": "build" - } - } - } - } -} \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/App.config b/Tests/MySql.EntityFramework6.CodeFirst.Tests/App.config deleted file mode 100644 index 4207bc3f5..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/App.config +++ /dev/null @@ -1,26 +0,0 @@ - - - - -
- - - - - - - - - - - - - - - - - - - - - diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/CodeFirstTests.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/CodeFirstTests.cs deleted file mode 100644 index 78a0db129..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/CodeFirstTests.cs +++ /dev/null @@ -1,1784 +0,0 @@ -// Copyright © 2014, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Configuration; -using System.Data; -using System.Data.Common; -using System.Data.Entity; -using System.Data.Entity.Infrastructure; -using System.Diagnostics; -using System.Linq; -using System.Text.RegularExpressions; -using System.Threading; -using MySql.Data.MySqlClient; -using System.Collections.Generic; -using Xunit; -using System.Data.Entity.Spatial; -using MySql.Data.Entity.Tests; -using MySql.EntityFramework6.CodeFirst.Tests.Properties; - -namespace MySql.Data.Entity.CodeFirst.Tests -{ - public class CodeFirstTests : IUseFixture, IDisposable - { - private SetUpCodeFirstTests st; - - public void SetFixture(SetUpCodeFirstTests data) - { - st = data; - } - - public void Dispose() - { - } - - private void ReInitDb() - { - st.suExecSQL(string.Format("drop database if exists `{0}`", st.conn.Database)); - st.suExecSQL(string.Format("create database `{0}`", st.conn.Database)); - } - - /// - /// Tests for fix of http://bugs.mysql.com/bug.php?id=61230 - /// ("The provider did not return a ProviderManifestToken string."). - /// - [Fact] - public void SimpleCodeFirstSelect() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - MovieDBContext db = new MovieDBContext(); - db.Database.Initialize(true); -#if EF6 - MovieDBInitialize.DoDataPopulation(db); -#endif - var l = db.Movies.ToList(); - int j = l.Count; - foreach (var i in l) - { - j--; - } - Assert.Equal(0, j); - } - - /// - /// Tests for fix of http://bugs.mysql.com/bug.php?id=62150 - /// ("EF4.1, Code First, CreateDatabaseScript() generates an invalid MySQL script."). - /// - [Fact] - public void AlterTableTest() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - MovieDBContext db = new MovieDBContext(); - db.Database.Initialize(true); -#if EF6 - MovieDBInitialize.DoDataPopulation(db); -#endif - var l = db.MovieFormats.ToList(); - int j = l.Count; - foreach (var i in l) - { - j--; - } - Assert.Equal(0, j); - MovieFormat m = new MovieFormat(); - m.Format = 8.0f; - db.MovieFormats.Add(m); - db.SaveChanges(); - MovieFormat m2 = db.MovieFormats.Where(p => p.Format == 8.0f).FirstOrDefault(); - Assert.NotNull(m2); - Assert.Equal( 8.0f, m2.Format); - } - - /// - /// Fix for "Connector/Net Generates Incorrect SELECT Clause after UPDATE" (MySql bug #62134, Oracle bug #13491689). - /// - [Fact] - public void ConcurrencyCheck() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - using (MovieDBContext db = new MovieDBContext()) - { - db.Database.Delete(); - db.Database.CreateIfNotExists(); -#if EF6 - MovieDBInitialize.DoDataPopulation(db); -#endif - db.Database.ExecuteSqlCommand(@"DROP TABLE IF EXISTS `MovieReleases`"); - - db.Database.ExecuteSqlCommand( -@"CREATE TABLE IF NOT EXISTS `MovieReleases` ( - `Id` int(11) NOT NULL, - `Name` varbinary(45) NOT NULL, - `Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`Id`) -) ENGINE=InnoDB DEFAULT CHARSET=binary"); - MySqlTrace.Listeners.Clear(); - MySqlTrace.Switch.Level = SourceLevels.All; - GenericListener listener = new GenericListener(); - MySqlTrace.Listeners.Add(listener); - try - { - MovieRelease mr = db.MovieReleases.Create(); - mr.Id = 1; - mr.Name = "Commercial"; - db.MovieReleases.Add(mr); - db.SaveChanges(); - mr.Name = "Director's Cut"; - db.SaveChanges(); - } - finally - { - db.Database.ExecuteSqlCommand(@"DROP TABLE IF EXISTS `MovieReleases`"); - } - // Check sql - Regex rx = new Regex(@"Query Opened: (?UPDATE .*)", RegexOptions.Compiled | RegexOptions.Singleline); - foreach (string s in listener.Strings) - { - Match m = rx.Match(s); - if (m.Success) - { - st.CheckSql(m.Groups["item"].Value, SQLSyntax.UpdateWithSelect); - //Assert.Pass(); - } - } - //Assert.Fail(); - } - } - - /// - /// This tests fix for http://bugs.mysql.com/bug.php?id=64216. - /// - [Fact] - public void CheckByteArray() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - MovieDBContext db = new MovieDBContext(); - db.Database.Initialize(true); - string dbCreationScript = - ((IObjectContextAdapter)db).ObjectContext.CreateDatabaseScript(); - Regex rx = new Regex(@"`Data` (?[^\),]*)", RegexOptions.Compiled | RegexOptions.Singleline); - Match m = rx.Match(dbCreationScript); - Assert.Equal("longblob", m.Groups["type"].Value); - } - -/// - /// Validates a stored procedure call using Code First - /// Bug #14008699 - [Fact] - public void CallStoredProcedure() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - using (MovieDBContext context = new MovieDBContext()) - { - context.Database.Initialize(true); - context.Database.ExecuteSqlCommand(@"drop procedure if exists `GetCount`"); - context.Database.ExecuteSqlCommand(@"create procedure `GetCount`() begin select 5; end;"); -#if EF6 - long count = context.Database.SqlQuery("GetCount").First(); -#else - int count = context.Database.SqlQuery("GetCount").First(); -#endif - - Assert.Equal(5, count); - } - } - - /// - /// Tests for fix of http://bugs.mysql.com/bug.php?id=63920 - /// Maxlength error when it's used code-first and inheritance (discriminator generated column) - /// - [Fact] - public void Bug63920_Test1() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - using (VehicleDbContext context = new VehicleDbContext()) - { - context.Database.Delete(); - context.Database.Initialize(true); - - context.Vehicles.Add(new Car { Id = 1, Name = "Mustang", Year = 2012, CarProperty = "Car" }); - context.Vehicles.Add(new Bike { Id = 101, Name = "Mountain", Year = 2011, BikeProperty = "Bike" }); - context.SaveChanges(); - - var list = context.Vehicles.ToList(); - - int records = -1; - using (MySqlConnection conn = new MySqlConnection(context.Database.Connection.ConnectionString)) - { - conn.Open(); - MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM Vehicles", conn); - records = Convert.ToInt32(cmd.ExecuteScalar()); - } - - Assert.Equal(context.Vehicles.Count(), records); - } - } - - /// - /// Tests for fix of http://bugs.mysql.com/bug.php?id=63920 - /// Key reference generation script error when it's used code-first and a single table for the inherited models - /// - [Fact] - public void Bug63920_Test2() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - using (VehicleDbContext2 context = new VehicleDbContext2()) - { - context.Database.Delete(); - context.Database.Initialize(true); - - context.Vehicles.Add(new Car2 { Id = 1, Name = "Mustang", Year = 2012, CarProperty = "Car" }); - context.Vehicles.Add(new Bike2 { Id = 101, Name = "Mountain", Year = 2011, BikeProperty = "Bike" }); - context.SaveChanges(); - - var list = context.Vehicles.ToList(); - - int records = -1; - using (MySqlConnection conn = new MySqlConnection(context.Database.Connection.ConnectionString)) - { - conn.Open(); - MySqlCommand cmd = new MySqlCommand("SELECT COUNT(*) FROM Vehicle2", conn); - records = Convert.ToInt32(cmd.ExecuteScalar()); - } - - Assert.Equal(context.Vehicles.Count(), records); - } - } - - /// - /// This test fix for precision customization for columns bug (http://bugs.mysql.com/bug.php?id=65001), - /// Trying to customize column precision in Code First does not work). - /// - [Fact] - public void TestPrecisionNscale() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - MovieDBContext db = new MovieDBContext(); - db.Database.Initialize(true); - var l = db.Movies.ToList(); - IDataReader r = st.execReader( string.Format( -@"select numeric_precision, numeric_scale from information_schema.columns -where table_schema = '{0}' and table_name = 'movies' and column_name = 'Price'", st.conn.Database )); - r.Read(); - Assert.Equal( 16, r.GetInt32( 0 ) ); - Assert.Equal( 2, r.GetInt32( 1 ) ); - } - - /// - /// Test String types to StoreType for String - /// A string with FixedLength=true will become a char - /// Max Length left empty will be char(max) - /// Max Length(100) will be char(100) - /// while FixedLength=false will result in nvarchar. - /// Max Length left empty will be nvarchar(max) - /// Max Length(100) will be nvarchar(100) - /// - [Fact] - public void TestStringTypeToStoreType() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - using (VehicleDbContext3 context = new VehicleDbContext3()) - { - if (context.Database.Exists()) context.Database.Delete(); - context.Database.CreateIfNotExists(); - context.Accessories.Add(new Accessory { Name = "Accesory One", Description = "Accesories descriptions", LongDescription = "Some long description" }); - context.SaveChanges(); - - using (MySqlConnection conn = new MySqlConnection(context.Database.Connection.ConnectionString)) - { - conn.Open(); - MySqlCommand query = new MySqlCommand("Select Column_name, Is_Nullable, Data_Type from information_schema.Columns where table_schema ='" + conn.Database + "' and table_name = 'Accessories' and column_name ='Description'", conn); - query.Connection = conn; - MySqlDataReader reader = query.ExecuteReader(); - while (reader.Read()) - { - Assert.Equal("Description", reader[0].ToString()); - Assert.Equal("NO", reader[1].ToString()); - Assert.Equal("mediumtext", reader[2].ToString()); - } - reader.Close(); - - query = new MySqlCommand("Select Column_name, Is_Nullable, Data_Type, character_maximum_length from information_schema.Columns where table_schema ='" + conn.Database + "' and table_name = 'Accessories' and column_name ='Name'", conn); - reader = query.ExecuteReader(); - while (reader.Read()) - { - Assert.Equal("Name", reader[0].ToString()); - Assert.Equal("NO", reader[1].ToString()); - Assert.Equal("varchar", reader[2].ToString()); - Assert.Equal("255", reader[3].ToString()); - } - reader.Close(); - - query = new MySqlCommand("Select Column_name, Is_Nullable, Data_Type, character_maximum_length from information_schema.Columns where table_schema ='" + conn.Database + "' and table_name = 'Accessories' and column_name ='LongDescription'", conn); - reader = query.ExecuteReader(); - while (reader.Read()) - { - Assert.Equal("LongDescription", reader[0].ToString()); - Assert.Equal("NO", reader[1].ToString()); - Assert.Equal("longtext", reader[2].ToString()); - Assert.Equal("4294967295", reader[3].ToString()); - } - } - } - } - - /// - /// Test fix for http://bugs.mysql.com/bug.php?id=66066 / http://clustra.no.oracle.com/orabugs/bug.php?id=14479715 - /// (Using EF, crash when generating insert with no values.). - /// - [Fact] - public void AddingEmptyRow() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - using (MovieDBContext ctx = new MovieDBContext()) - { - ctx.Database.Initialize(true); - ctx.EntitySingleColumns.Add(new EntitySingleColumn()); - ctx.SaveChanges(); - } - - using (MovieDBContext ctx2 = new MovieDBContext()) - { - var q = from esc in ctx2.EntitySingleColumns where esc.Id == 1 select esc; - Assert.Equal(1, q.Count()); - } - } - -/// - /// Test for identity columns when type is Integer or Guid (auto-generate - /// values) - /// - [Fact] - public void IdentityTest() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - using (VehicleDbContext context = new VehicleDbContext()) - { - context.Database.ExecuteSqlCommand("SET GLOBAL sql_mode='STRICT_ALL_TABLES'"); - if (context.Database.Exists()) context.Database.Delete(); - context.Database.CreateIfNotExists(); - - // Identity as Guid - Manufacturer nissan = new Manufacturer - { - Name = "Nissan" - }; - Manufacturer ford = new Manufacturer - { - Name = "Ford" - }; - context.Manufacturers.Add(nissan); - context.Manufacturers.Add(ford); - - // Identity as Integer - Distributor dis1 = new Distributor - { - Name = "Distributor1" - }; - Distributor dis2 = new Distributor - { - Name = "Distributor2" - }; - context.Distributors.Add(dis1); - context.Distributors.Add(dis2); - - context.SaveChanges(); - - using (MySqlConnection conn = new MySqlConnection(context.Database.Connection.ConnectionString)) - { - conn.Open(); - - // Validates Guid - MySqlCommand cmd = new MySqlCommand("SELECT * FROM Manufacturers", conn); - MySqlDataReader dr = cmd.ExecuteReader(); - Assert.False(!dr.HasRows, "No records found"); - - while (dr.Read()) - { - string name = dr.GetString(1); - switch (name) - { - case "Nissan": - Assert.Equal(dr.GetGuid(0), nissan.ManufacturerId); - Assert.Equal(dr.GetGuid(2), nissan.GroupIdentifier); - break; - case "Ford": - Assert.Equal(dr.GetGuid(0), ford.ManufacturerId); - Assert.Equal(dr.GetGuid(2), ford.GroupIdentifier); - break; - default: - //Assert.Fail(); - break; - } - } - dr.Close(); - - // Validates Integer - cmd = new MySqlCommand("SELECT * FROM Distributors", conn); - dr = cmd.ExecuteReader(); - if (!dr.HasRows) - //Assert.Fail("No records found"); - while (dr.Read()) - { - string name = dr.GetString(1); - switch (name) - { - case "Distributor1": - Assert.Equal(dr.GetInt32(0), dis1.DistributorId); - break; - case "Distributor2": - Assert.Equal(dr.GetInt32(0), dis2.DistributorId); - break; - default: - //Assert.Fail(); - break; - } - } - dr.Close(); - } - } - } - - /// - /// This test the fix for bug 67377. - /// - [Fact] - public void FirstOrDefaultNested() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - using (MovieDBContext ctx = new MovieDBContext()) - { - ctx.Database.Initialize(true); -#if EF6 - MovieDBInitialize.DoDataPopulation(ctx); -#endif - int DirectorId = 1; - var q = ctx.Movies.Where(p => p.Director.ID == DirectorId).Select(p => - new - { - Id = p.ID, - FirstMovieFormat = p.Formats.Count == 0 ? 0.0 : p.Formats.FirstOrDefault().Format - }); - string sql = q.ToString(); -#if DEBUG - Debug.WriteLine(sql); -#endif - int j = q.Count(); - foreach (var r in q) - { - j--; - } - Assert.Equal(0, j); - } - } - - /// - /// This tests the fix for bug 73549, Generated Sql does not contain ORDER BY statement whose is requested by LINQ. - /// - [Fact] - public void FirstOrDefaultNestedWithOrderBy() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - using (SakilaDb db = new SakilaDb()) - { - var q = from cu in db.customers - let curAddr = db.addresses.OrderByDescending(p => p.address_id).Where(p => p.address_id == cu.address_id).FirstOrDefault() - join sto in db.stores on cu.store_id equals sto.store_id - orderby cu.customer_id descending - select new - { - curAddr.city.country.country1 - }; - string sql = q.ToString(); - st.CheckSql(sql, SQLSyntax.FirstOrDefaultNestedWithOrderBy); -#if DEBUG - Debug.WriteLine(sql); -#endif - int j = q.Count(); - foreach (var r in q) - { - //Debug.WriteLine( r.country1 ); - } - Assert.Equal(599, j); - } - } - - /// - /// SUPPORT FOR DATE TYPES WITH PRECISION - /// - [Fact] - public void CanDefineDatesWithPrecisionFor56() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - - if (st.Version < new Version(5, 6)) return; - - ReInitDb(); - using (var db = new ProductsDbContext()) - { - using (MySqlConnection conn = new MySqlConnection(db.Database.Connection.ConnectionString)) - { - conn.Open(); - MySqlCommand query = new MySqlCommand("Select Column_name, Is_Nullable, Data_Type, DateTime_Precision from information_schema.Columns where table_schema ='" + conn.Database + "' and table_name = 'Products' and column_name ='DateTimeWithPrecision'", conn); - query.Connection = conn; - MySqlDataReader reader = query.ExecuteReader(); - while (reader.Read()) - { - Assert.Equal("DateTimeWithPrecision", reader[0].ToString()); - Assert.Equal("NO", reader[1].ToString()); - Assert.Equal("datetime", reader[2].ToString()); - Assert.Equal("3", reader[3].ToString()); - } - reader.Close(); - - query = new MySqlCommand("Select Column_name, Is_Nullable, Data_Type, DateTime_Precision from information_schema.Columns where table_schema ='" + conn.Database + "' and table_name = 'Products' and column_name ='TimeStampWithPrecision'", conn); - query.Connection = conn; - reader = query.ExecuteReader(); - while (reader.Read()) - { - Assert.Equal("TimeStampWithPrecision", reader[0].ToString()); - Assert.Equal("NO", reader[1].ToString()); - Assert.Equal("timestamp", reader[2].ToString()); - Assert.Equal("3", reader[3].ToString()); - } - reader.Close(); - } - db.Database.Delete(); - } - } - - /// - /// Orabug #15935094 SUPPORT FOR CURRENT_TIMESTAMP AS DEFAULT FOR DATETIME WITH EF - /// - [Fact] - public void CanDefineDateTimeAndTimestampWithIdentity() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - if (st.Version < new Version(5, 6)) return; - - ReInitDb(); - using (var db = new ProductsDbContext()) - { - MySqlConnection con = (MySqlConnection)db.Database.Connection; - MySqlCommand cmd = new MySqlCommand("set session sql_mode = '';", con); - con.Open(); - cmd.ExecuteNonQuery(); - con.Close(); - - Product product = new Product - { - //Omitting Identity Columns - DateTimeWithPrecision = DateTime.Now, - TimeStampWithPrecision = DateTime.Now - }; - - db.Products.Add(product); - db.SaveChanges(); - - var updateProduct = db.Products.First(); - updateProduct.DateTimeWithPrecision = new DateTime(2012, 3, 18, 23, 9, 7, 6); - db.SaveChanges(); - - Assert.NotNull(db.Products.First().Timestamp); - Assert.NotNull(db.Products.First().DateCreated); - Assert.Equal(new DateTime(2012, 3, 18, 23, 9, 7, 6), db.Products.First().DateTimeWithPrecision); - Assert.Equal(1, db.Products.Count()); - db.Database.Delete(); - } - } - - - /// - /// Test of fix for bug Support for EntityFramework 4.3 Code First Generated Identifiers (MySql Bug #67285, Oracle bug #16286397). - /// FKs are renamed to met http://dev.mysql.com/doc/refman/5.0/en/identifiers.html limitations. - /// - [Fact] - public void LongIdentifiersInheritanceTPT() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - using (DinosauriaDBContext db = new DinosauriaDBContext()) - { - db.Database.Initialize(true); - Tyrannosauridae ty = new Tyrannosauridae() { Id = 1, Name = "Genghis Rex", SpecieName = "TRex", Weight = 1000 }; - db.dinos.Add(ty); - Oviraptorosauria ovi = new Oviraptorosauria() { Id = 2, EggsPerYear = 100, Name = "John the Velociraptor", SpecieName = "Oviraptor" }; - db.dinos.Add(ovi); - db.SaveChanges(); - } - } - - - /// - /// Test fix for http://bugs.mysql.com/bug.php?id=67183 - /// (Malformed Query while eager loading with EF 4 due to multiple projections). - /// - [Fact] - public void ShipTest() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - using (var context = new ShipContext()) - { - context.Database.Initialize(true); - - var harbor = new Harbor - { - Ships = new HashSet - { - new Ship - { - CrewMembers = new HashSet - { - new CrewMember - { - Rank = new Rank { Description = "Rank A" }, - Clearance = new Clearance { Description = "Clearance A" }, - Description = "CrewMember A" - }, - new CrewMember - { - Rank = new Rank { Description = "Rank B" }, - Clearance = new Clearance { Description = "Clearance B" }, - Description = "CrewMember B" - } - }, - Description = "Ship AB" - }, - new Ship - { - CrewMembers = new HashSet - { - new CrewMember - { - Rank = new Rank { Description = "Rank C" }, - Clearance = new Clearance { Description = "Clearance C" }, - Description = "CrewMember C" - }, - new CrewMember - { - Rank = new Rank { Description = "Rank D" }, - Clearance = new Clearance { Description = "Clearance D" }, - Description = "CrewMember D" - } - }, - Description = "Ship CD" - } - }, - Description = "Harbor ABCD" - }; - - context.Harbors.Add(harbor); - context.SaveChanges(); - } - - using (var context = new ShipContext()) - { - DbSet dbSet = context.Set(); - IQueryable query = dbSet; - query = query.Include(entity => entity.Ships); - query = query.Include(entity => entity.Ships.Select(s => s.CrewMembers)); - query = query.Include(entity => entity.Ships.Select(s => s.CrewMembers.Select(cm => cm.Rank))); - query = query.Include(entity => entity.Ships.Select(s => s.CrewMembers.Select(cm => cm.Clearance))); - - string[] data = new string[] { - "1,Harbor ABCD,1,1,1,Ship AB,1,1,1,1,1,CrewMember A,1,Rank A,1,Clearance A", - "1,Harbor ABCD,1,1,1,Ship AB,1,2,1,2,2,CrewMember B,2,Rank B,2,Clearance B", - "1,Harbor ABCD,1,2,1,Ship CD,1,3,2,3,3,CrewMember C,3,Rank C,3,Clearance C", - "1,Harbor ABCD,1,2,1,Ship CD,1,4,2,4,4,CrewMember D,4,Rank D,4,Clearance D" - }; - Dictionary outData = new Dictionary(); - - var sqlString = query.ToString(); -#if EF6 - st.CheckSql(sqlString, SQLSyntax.ShipQueryMalformedDueMultipleProjecttionsCorrectedEF6); -#else - st.CheckSql(sqlString, SQLSyntax.ShipQueryMalformedDueMultipleProjecttionsCorrected); -#endif - // see below for the generated SQL query - - var harbor = query.Single(); - - foreach (var ship in harbor.Ships) - { - foreach (var crewMember in ship.CrewMembers) - { - outData.Add(string.Format( - "{0},{1},1,{2},{3},{4},1,{5},{6},{7},{8},{9},{10},{11},{12},{13}", - harbor.HarborId, harbor.Description, ship.ShipId, harbor.HarborId, - ship.Description, crewMember.CrewMemberId, crewMember.ShipId, crewMember.RankId, - crewMember.ClearanceId, crewMember.Description, crewMember.Rank.RankId, - crewMember.Rank.Description, crewMember.Clearance.ClearanceId, - crewMember.Clearance.Description), null); - } - } - // check data integrity - Assert.Equal(outData.Count, data.Length); - for (int i = 0; i < data.Length; i++) - { - Assert.True(outData.ContainsKey(data[i])); - } - } - } - - /// - /// Tests fix for bug http://bugs.mysql.com/bug.php?id=68513, Error in LINQ to Entities query when using Distinct().Count(). - /// - [Fact] - public void DistinctCount() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - using (SiteDbContext ctx = new SiteDbContext()) - { - ctx.Database.Initialize(true); - visitante v1 = new visitante() { nCdSite = 1, nCdVisitante = 1, sDsIp = "x1" }; - visitante v2 = new visitante() { nCdSite = 1, nCdVisitante = 2, sDsIp = "x2" }; - site s1 = new site() { nCdSite = 1, sDsTitulo = "MyNewsPage" }; - site s2 = new site() { nCdSite = 2, sDsTitulo = "MySearchPage" }; - ctx.Visitante.Add(v1); - ctx.Visitante.Add(v2); - ctx.Site.Add(s1); - ctx.Site.Add(s2); - ctx.SaveChanges(); - - var q = (from vis in ctx.Visitante.Include("site") - group vis by vis.nCdSite into g - select new retorno - { - Key = g.Key, - Online = g.Select(e => e.sDsIp).Distinct().Count() - }); - string sql = q.ToString(); -#if EF6 - st.CheckSql(sql, SQLSyntax.CountGroupBy); -#else - st.CheckSql(sql, SQLSyntax.CountGroupByEF5); -#endif - var q2 = q.ToList(); - foreach( var row in q2 ) - { - } - } - } - - /// - /// Tests fix for bug http://bugs.mysql.com/bug.php?id=68513, Error in LINQ to Entities query when using Distinct().Count(). - /// - [Fact] - public void DistinctCount2() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - using (SiteDbContext ctx = new SiteDbContext()) - { - ctx.Database.Initialize(true); - visitante v1 = new visitante() { nCdSite = 1, nCdVisitante = 1, sDsIp = "x1" }; - visitante v2 = new visitante() { nCdSite = 1, nCdVisitante = 2, sDsIp = "x2" }; - site s1 = new site() { nCdSite = 1, sDsTitulo = "MyNewsPage" }; - site s2 = new site() { nCdSite = 2, sDsTitulo = "MySearchPage" }; - pagina p1 = new pagina() { nCdPagina = 1, nCdVisitante = 1, sDsTitulo = "index.html" }; - ctx.Visitante.Add(v1); - ctx.Visitante.Add(v2); - ctx.Site.Add(s1); - ctx.Site.Add(s2); - ctx.Pagina.Add(p1); - ctx.SaveChanges(); - - var q = (from pag in ctx.Pagina.Include("visitante").Include("site") - group pag by pag.visitante.nCdSite into g - select new retorno - { - Key = g.Key, - Online = g.Select(e => e.visitante.sDsIp).Distinct().Count() - }); - string sql = q.ToString(); -#if EF6 - st.CheckSql(sql, SQLSyntax.CountGroupBy2); -#else - st.CheckSql(sql, SQLSyntax.CountGroupBy2EF5); -#endif - var q2 = q.ToList(); - foreach (var row in q2) - { - } - } - } - - /// - /// Tests fix for bug http://bugs.mysql.com/bug.php?id=65723, MySql Provider for EntityFramework produces "bad" SQL for OrderBy. - /// - [Fact] - public void BadOrderBy() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - using (MovieDBContext db = new MovieDBContext()) - { - db.Database.Initialize(true); -#if EF6 - MovieDBInitialize.DoDataPopulation(db); -#endif - DateTime filterDate = new DateTime(1986, 1, 1); - var q = db.Movies.Where(p => p.ReleaseDate >= filterDate). - OrderByDescending(p => p.ReleaseDate).Take(2); - string sql = q.ToString(); - st.CheckSql(SQLSyntax.NestedOrderBy, sql); - // Data integrity testing - Movie[] data = new Movie[] { - new Movie() { ID = 4, Title = "Star Wars, The Sith Revenge", ReleaseDate = new DateTime( 2005, 5, 19 ) }, - new Movie() { ID = 2, Title = "The Matrix", ReleaseDate = new DateTime( 1999, 3, 31 ) } - }; - int i = 0; - foreach (Movie m in q) - { - Assert.Equal(data[i].ID, m.ID); - Assert.Equal(data[i].Title, m.Title); - Assert.Equal(data[i].ReleaseDate, m.ReleaseDate); - i++; - } - Assert.Equal(2, i); - } - } - - /// - /// Tests fix for bug http://bugs.mysql.com/bug.php?id=69751, Invalid SQL query generated for query with Contains, OrderBy, and Take. - /// - [Fact] - public void BadContainsOrderByTake() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - using (MovieDBContext db = new MovieDBContext()) - { - db.Database.Initialize(true); -#if EF6 - MovieDBInitialize.DoDataPopulation(db); -#endif - string title = "T"; - var q = from m in db.Movies - where m.Title.Contains(title) - orderby m.ID descending - select m; - var q1 = q.Take(10); - string sql = q1.ToString(); - - st.CheckSql(SQLSyntax.QueryWithOrderByTakeContains, sql); - - int i = 0; - foreach (var row in q1) - { - Assert.Equal( MovieDBInitialize.data[i].ID, row.ID); - Assert.Equal( MovieDBInitialize.data[i].Title, row.Title); - Assert.Equal( MovieDBInitialize.data[i].ReleaseDate, row.ReleaseDate); - i++; - } - } - } - - /// - /// Tests fix for bug http://bugs.mysql.com/bug.php?id=69922, Unknown column Extent1... - /// - [Fact] - public void BadAliasTable() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - using (PromotionsDB db = new PromotionsDB()) - { - db.Database.Initialize(true); - DateTime now = DateTime.Now; - var q = db - .HomePromoes - .Where(x => - x.Active - && - (x.ActiveFrom == null || x.ActiveFrom <= now) - && - (x.ActiveTo == null || x.ActiveTo >= now) - ) - .OrderBy(x => x.DisplayOrder).Select( d => d ); - string sql = q.ToString(); - foreach( var row in q ) - { - } - } - } - - /// - /// Tests other variants of bug http://bugs.mysql.com/bug.php?id=69751, Invalid SQL query generated for query with Contains, OrderBy, and Take. - /// - [Fact] - public void BadContainsOrderByTake2() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - using (MovieDBContext db = new MovieDBContext()) - { - db.Database.Initialize(true); -#if EF6 - MovieDBInitialize.DoDataPopulation(db); -#endif - var q = db.Movies. - Where(m => !string.IsNullOrEmpty(m.Title) && m.Title.Contains("x")). - OrderByDescending(m => m.ID). - Skip(1). - Take(1); - string sql = q.ToString(); -#if DEBUG - Debug.WriteLine(sql); -#endif - List l = q.ToList(); - int j = l.Count; - foreach( Movie m in l ) - { - j--; - } - Assert.Equal(0, j); - } - } - - /// - /// Tests other variants of bug http://bugs.mysql.com/bug.php?id=69751, Invalid SQL query generated for query with Contains, OrderBy, and Take. - /// - [Fact] - public void BadContainsOrderByTake3() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - using (MovieDBContext db = new MovieDBContext()) - { - db.Database.Initialize(true); -#if EF6 - MovieDBInitialize.DoDataPopulation(db); -#endif - var q = db.Movies. - Where(m => !string.IsNullOrEmpty(m.Title) && m.Title.Contains("x")). - OrderByDescending(m => m.ID). - Skip(1). - Take(1).Select(m => new { - Id = m.ID, - CriticsScore = ( - m.Title == "Terminator 1" ? "Good" : - m.Title == "Predator" ? "Sunday best, cheese" : - m.Title == "The Matrix" ? "Really Good" : - m.Title == "Star Wars, The Sith Revenge" ? "Really Good" : "Unknown" ) - }); - string sql = q.ToString(); -#if DEBUG - Debug.WriteLine(sql); -#endif - int j = q.Count(); - foreach (var row in q) - { - j--; - } - Assert.Equal(0, j); - } - } - - /// - /// Tests other variants of bug http://bugs.mysql.com/bug.php?id=69751, Invalid SQL query generated for query with Contains, OrderBy, and Take. - /// - [Fact] - public void BadContainsOrderByTake4() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - using (MovieDBContext db = new MovieDBContext()) - { - db.Database.Initialize(true); -#if EF6 - MovieDBInitialize.DoDataPopulation(db); -#endif - bool q = db.Movies.Any(m => m.ReleaseDate.Year > 1985); -// string sql = q.ToString(); -//#if DEBUG -// Debug.WriteLine(sql); -//#endif - //foreach (var row in q) - //{ - //} - } - } - - /// - /// Tests other variants of bug http://bugs.mysql.com/bug.php?id=69751, Invalid SQL query generated for query with Contains, OrderBy, and Take. - /// - [Fact] - public void BadContainsOrderByTake5() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - using (MovieDBContext db = new MovieDBContext()) - { - db.Database.Initialize(true); -#if EF6 - MovieDBInitialize.DoDataPopulation(db); -#endif - // TODO: add subquery like - // var shifts = Shifts.Where(s => !EmployeeShifts.Where(es => es.ShiftID == s.ShiftID).Any()); - bool q = db.Movies.Where( m => m.ReleaseDate.Month != 10 ).Any(m => m.ReleaseDate.Year > 1985); -// string sql = q.ToString(); -//#if DEBUG -// Debug.WriteLine(sql); -//#endif -// foreach (var row in q) -// { -// } - } - } - - /// - /// Tests other variants of bug http://bugs.mysql.com/bug.php?id=69751, Invalid SQL query generated for query with Contains, OrderBy, and Take. - /// - [Fact] - public void BadContainsOrderByTake6() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - using (MovieDBContext db = new MovieDBContext()) - { - db.Database.Initialize(true); -#if EF6 - MovieDBInitialize.DoDataPopulation(db); -#endif - var q = from m in db.Movies - where m.Title.Contains("x") && db.Medias.Where( mm => mm.Format == "Digital" ).Any() - select m; - string sql = q.ToString(); -#if DEBUG - Debug.WriteLine(sql); -#endif - int j = q.Count(); - foreach (var row in q) - { - j--; - } - Assert.Equal(0, j); - } - } - - /// - /// Test for Mysql Bug 70602: http://bugs.mysql.com/bug.php?id=70602 - /// - [Fact] - public void AutoIncrementBug() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - AutoIncrementBugContext dbContext = new AutoIncrementBugContext(); - - dbContext.Database.Initialize(true); - dbContext.AutoIncrementBug.Add(new AutoIncrementBug() { Description = "Test" }); - dbContext.SaveChanges(); - using (var reader = MySqlHelper.ExecuteReader(dbContext.Database.Connection.ConnectionString, "SHOW COLUMNS FROM AUTOINCREMENTBUGS WHERE EXTRA LIKE '%AUTO_INCREMENT%'")) - { - Assert.Equal(true, reader.HasRows); - } - dbContext.Database.Delete(); - } - -#if EF6 - [Fact] - public void SimpleCodeFirstSelectCbc() - { - MovieCodedBasedConfigDBContext db = new MovieCodedBasedConfigDBContext(); - db.Database.Initialize(true); - var l = db.Movies.ToList(); - foreach (var i in l) - { - Console.WriteLine(i); - } - } - - [Fact] - public void TestStoredProcedureMapping() - { - using (var db = new MovieCodedBasedConfigDBContext()) - { - db.Database.Initialize(true); - var movie = new MovieCBC() - { - Title = "Sharknado", - Genre = "Documental", - Price = 1.50M, - ReleaseDate = DateTime.Parse("01/07/2013") - }; - - db.Movies.Add(movie); - db.SaveChanges(); - movie.Genre = "Fiction"; - db.SaveChanges(); - db.Movies.Remove(movie); - db.SaveChanges(); - } - } - - [Fact] - public void MigrationHistoryConfigurationTest() - { - ReInitDb(); - MovieCodedBasedConfigDBContext db = new MovieCodedBasedConfigDBContext(); - db.Database.Initialize(true); - var l = db.Movies.ToList(); - foreach (var i in l) - { - } - var result = MySqlHelper.ExecuteScalar("server=localhost;User Id=root;database=test;logging=true; port=3305;", "SELECT COUNT(_MigrationId) FROM __MySqlMigrations;"); - Assert.Equal(1, int.Parse(result.ToString())); - } - - [Fact] - public void DbSetRangeTest() - { - ReInitDb(); - using (MovieDBContext db = new MovieDBContext()) - { - db.Database.Initialize(true); - Movie m1 = new Movie() { Title = "Terminator 1", ReleaseDate = new DateTime(1984, 10, 26) }; - Movie m2 = new Movie() { Title = "The Matrix", ReleaseDate = new DateTime(1999, 3, 31) }; - Movie m3 = new Movie() { Title = "Predator", ReleaseDate = new DateTime(1987, 6, 12) }; - Movie m4 = new Movie() { Title = "Star Wars, The Sith Revenge", ReleaseDate = new DateTime(2005, 5, 19) }; - db.Movies.AddRange( new Movie[] { m1, m2, m3, m4 }); - db.SaveChanges(); - var q = from m in db.Movies select m; - Assert.Equal(4, q.Count()); - foreach (var row in q) - { - } - db.Movies.RemoveRange(q.ToList()); - db.SaveChanges(); - var q2 = from m in db.Movies select m; - Assert.Equal(0, q2.Count()); - } - } - - [Fact] - public void EnumSupportTest() - { - using (var dbCtx = new EnumTestSupportContext()) - { - dbCtx.Database.Initialize(true); - dbCtx.SchoolSchedules.Add(new SchoolSchedule() { TeacherName = "Pako", Subject = SchoolSubject.History }); - dbCtx.SaveChanges(); - - var schedule = (from s in dbCtx.SchoolSchedules - where s.Subject == SchoolSubject.History - select s).FirstOrDefault(); - - Assert.NotEqual(null, schedule); - Assert.Equal(SchoolSubject.History, schedule.Subject); - } - } - - [Fact] - public void SpatialSupportTest() - { - using (var dbCtx = new JourneyContext()) - { - dbCtx.Database.Initialize(true); - dbCtx.MyPlaces.Add(new MyPlace() - { - name = "JFK INTERNATIONAL AIRPORT OF NEW YORK", - location = DbGeometry.FromText("POINT(40.644047 -73.782291)"), - }); - dbCtx.SaveChanges(); - - var place = (from p in dbCtx.MyPlaces - where p.name == "JFK INTERNATIONAL AIRPORT OF NEW YORK" - select p).FirstOrDefault(); - - var point = DbGeometry.FromText("POINT(40.717957 -73.736501)"); - - var distance = (point.Distance(place.location) * 100); - - Assert.NotEqual(null, place); - Assert.Equal(8.6944880240295852D, distance.Value); - - var distanceDB = from p in dbCtx.MyPlaces - select p.location.Distance(point); - - Assert.Equal(0.086944880240295852D, distanceDB.FirstOrDefault()); - } - } - - [Fact] - public void BeginTransactionSupportTest() - { - using (var dbcontext = new MovieCodedBasedConfigDBContext()) - { - dbcontext.Database.Initialize(true); - using (var transaction = dbcontext.Database.BeginTransaction()) - { - try - { - dbcontext.Movies.Add(new MovieCBC() - { - Title = "Sharknado", - Genre = "Documental", - Price = 1.50M, - ReleaseDate = DateTime.Parse("01/07/2013") - }); - - dbcontext.SaveChanges(); - var result = MySqlHelper.ExecuteScalar("server=localhost;User Id=root;database=test;logging=true; port=3305;", "select COUNT(*) from moviecbcs;"); - Assert.Equal(0, int.Parse(result.ToString())); - - transaction.Commit(); - - result = MySqlHelper.ExecuteScalar("server=localhost;User Id=root;database=test;logging=true; port=3305;", "select COUNT(*) from moviecbcs;"); - Assert.Equal(1, int.Parse(result.ToString())); - } - catch (Exception) - { - transaction.Rollback(); - } - } - } - } - - /// - /// This test covers two new features on EF6: - /// 1- "DbContext.Database.UseTransaction, that use a transaction created from an open connection" - /// 2- "DbContext can now be created with a DbConnection that is already opened" - /// - [Fact] - public void UseTransactionSupportTest() - { - using (var connection = new MySqlConnection("server=localhost;User Id=root;database=test;logging=true; port=3305;")) - { - connection.Open(); - using (var transaction = connection.BeginTransaction()) - { - try - { - using (var dbcontext = new MovieCodedBasedConfigDBContext(connection, contextOwnsConnection: false)) - { - dbcontext.Database.Initialize(true); - dbcontext.Database.UseTransaction(transaction); - dbcontext.Movies.Add(new MovieCBC() - { - Title = "Sharknado", - Genre = "Documental", - Price = 1.50M, - ReleaseDate = DateTime.Parse("01/07/2013") - }); - - dbcontext.SaveChanges(); - } - var result = MySqlHelper.ExecuteScalar("server=localhost;User Id=root;database=test;logging=true; port=3305;", "select COUNT(*) from moviecbcs;"); - Assert.Equal(0, int.Parse(result.ToString())); - - transaction.Commit(); - - result = MySqlHelper.ExecuteScalar("server=localhost;User Id=root;database=test;logging=true; port=3305;", "select COUNT(*) from moviecbcs;"); - Assert.Equal(1, int.Parse(result.ToString())); - } - catch (Exception) - { - transaction.Rollback(); - } - } - } - } - - [Fact] - public void HasChangesSupportTest() - { - using (var dbcontext = new MovieCodedBasedConfigDBContext()) - { - dbcontext.Database.Initialize(true); - - dbcontext.Movies.Add(new MovieCBC() - { - Title = "Sharknado", - Genre = "Documental", - Price = 1.50M, - ReleaseDate = DateTime.Parse("01/07/2013") - }); - - Assert.Equal(true, dbcontext.ChangeTracker.HasChanges()); - dbcontext.SaveChanges(); - Assert.Equal(false, dbcontext.ChangeTracker.HasChanges()); - } - } - - [Fact] - public void MySqlLoggingToFileSupportTest() - { - string logName = "mysql.log"; - //if (System.IO.File.Exists(logName)) - // System.IO.File.Delete(logName); - - using (var dbcontext = new MovieCodedBasedConfigDBContext()) - { - dbcontext.Database.Log = MySqlLogger.Logger(logName, true).Write; - - dbcontext.Database.Initialize(true); - dbcontext.Movies.Add(new MovieCBC() - { - Title = "Sharknado", - Genre = "Documental", - Price = 1.50M, - ReleaseDate = DateTime.Parse("01/07/2013") - }); - dbcontext.SaveChanges(); - } - - Assert.Equal(true, System.IO.File.Exists(logName)); - } - - [Fact] - public void MySqlLoggingToConsoleSupportTest() - { - string logName = "mysql_2.log"; - if (System.IO.File.Exists(logName)) - System.IO.File.Delete(logName); - - System.IO.FileStream file; - System.IO.StreamWriter writer; - System.IO.TextWriter txtOut = Console.Out; - try - { - file = new System.IO.FileStream(logName, System.IO.FileMode.OpenOrCreate, System.IO.FileAccess.Write); - writer = new System.IO.StreamWriter(file); - } - catch (Exception e) - { - throw e; - } - Console.SetOut(writer); - - using (var dbcontext = new MovieCodedBasedConfigDBContext()) - { - dbcontext.Database.Log = new MySqlLogger(s => Console.Write(s)).Write; - - dbcontext.Database.Initialize(true); - dbcontext.Movies.Add(new MovieCBC() - { - Title = "Sharknado", - Genre = "Documental", - Price = 1.50M, - ReleaseDate = DateTime.Parse("01/07/2013") - }); - dbcontext.SaveChanges(); - } - Console.SetOut(txtOut); - writer.Close(); - file.Close(); - - Assert.Equal(true, System.IO.File.Exists(logName)); - } - - [Fact] - public void EntityAndComplexTypeSupportTest() - { - using (var dbContext = new EntityAndComplexTypeContext()) - { - dbContext.Database.Initialize(true); - dbContext.Students.Add( - new Student() - { - Name = "Pakorasu Pakolas", - Address = new Address() { City = "Mazatlan", Street = "Tierra de Venados 440" }, - Schedule = new List() { new SchoolSchedule() { TeacherName = "Pako", Subject = SchoolSubject.History } } - }); - dbContext.SaveChanges(); - - var student = (from s in dbContext.Students - select s).FirstOrDefault(); - - Assert.NotEqual(null, student); - Assert.NotEqual(null, student.Schedule); - Assert.NotEqual(true, string.IsNullOrEmpty(student.Address.Street)); - Assert.NotEqual(0, student.Schedule.Count()); - } - } - - /// - /// TO RUN THIS TEST ITS NECESSARY TO ENABLE THE EXECUTION STRATEGY IN THE CLASS MySqlEFConfiguration (Source\MySql.Data.Entity\MySqlConfiguration.cs) AS WELL AS START A MYSQL SERVER INSTACE WITH THE OPTION "--max_connections=3" - /// WHY 3?: 1)For main process (User: root, DB: mysql). 2)For Setup Class. 3)For the connections in this test. - /// The expected result is that opening a third connection and trying to open a fourth(with an asynchronous task) the execution strategy implementation handle the reconnection process until the third one is closed. - /// - //[Fact] //<---DON'T FORGET ME TO RUN! =D - public void ExecutionStrategyTest() - { - var connection = new MySqlConnection("server=localhost;User Id=root;logging=true; port=3305;"); - using (var dbcontext = new MovieCodedBasedConfigDBContext()) - { - dbcontext.Database.Initialize(true); - dbcontext.Movies.Add(new MovieCBC() - { - Title = "Sharknado", - Genre = "Documental", - Price = 1.50M, - ReleaseDate = DateTime.Parse("01/07/2013") - }); - connection.Open(); - System.Threading.Tasks.Task.Factory.StartNew(() => { dbcontext.SaveChanges(); }); - Thread.Sleep(1000); - connection.Close(); - connection.Dispose(); - } - var result = MySqlHelper.ExecuteScalar("server=localhost;User Id=root;database=test;logging=true; port=3305;", "select COUNT(*) from moviecbcs;"); - Assert.Equal(1, int.Parse(result.ToString())); - } -#endif - - [Fact] - public void UnknownProjectC1() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - using (MovieDBContext db = new MovieDBContext()) - { - db.Database.Initialize(true); -#if EF6 - MovieDBInitialize.DoDataPopulation(db); -#endif - long myKey = 20; - var q = (from r in db.Movies where (r.ID == myKey) select (long)r.ID).OrderBy(p => p); - string sql = q.ToString(); -#if EF6 - st.CheckSql(sql, SQLSyntax.UnknownProjectC1EF6 ); -#else - st.CheckSql(sql, SQLSyntax.UnknownProjectC1); -#endif - -#if DEBUG - Debug.WriteLine(sql); -#endif - long[] array = (from r in db.Movies where (r.ID == myKey) select (long)r.ID).OrderBy(p => p).ToArray(); - } - } - - [Fact] - public void StartsWithTest() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - MovieDBContext db = new MovieDBContext(); - db.Database.Initialize(true); -#if EF6 - MovieDBInitialize.DoDataPopulation(db); -#endif - string term = "The"; - var l = db.Movies.Where(p => p.Title.StartsWith(term)); - - string sql = l.ToString(); - - st.CheckSql(sql, SQLSyntax.QueryWithStartsWith); - -#if DEBUG - Debug.WriteLine(sql); -#endif - int j = l.Count(); - foreach (var i in l) - { - j--; - } - Assert.Equal(0, j); - } - - [Fact] - public void EndsWithTest() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - MovieDBContext db = new MovieDBContext(); - db.Database.Initialize(true); -#if EF6 - MovieDBInitialize.DoDataPopulation(db); -#endif - string term = "The"; - var l = db.Movies.Where(p => p.Title.EndsWith(term)); - - string sql = l.ToString(); - - st.CheckSql(sql, SQLSyntax.QueryWithEndsWith); - -#if DEBUG - Debug.WriteLine(sql); -#endif - int j = l.Count(); - foreach (var i in l) - { - j--; - } - Assert.Equal(0, j); - } - - [Fact] - public void ContainsTest() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - MovieDBContext db = new MovieDBContext(); - db.Database.Initialize(true); -#if EF6 - MovieDBInitialize.DoDataPopulation(db); -#endif - string term = "The"; - var l = db.Movies.Where(p => p.Title.Contains(term)); - - string sql = l.ToString(); - st.CheckSql(sql, SQLSyntax.QueryWithContains); - -#if DEBUG - Debug.WriteLine(sql); -#endif - int j = l.Count(); - foreach (var i in l) - { - j--; - } - Assert.Equal(0, j); - } - - - /// - /// Test to reproduce bug http://bugs.mysql.com/bug.php?id=73643, Exception when using IEnumera.Contains(model.property) in Where predicate - /// - [Fact] - public void TestContainsListWithCast() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - using (MovieDBContext db = new MovieDBContext()) - { - db.Database.Initialize(true); - - long[] longs = new long[] { 1, 2, 3 }; - var q = db.Movies.Where(p => longs.Contains((long)p.ID)); - string sql = q.ToString(); -#if EF6 - st.CheckSql(sql, SQLSyntax.TestContainsListWithCast); -#else - st.CheckSql(sql, SQLSyntax.TestContainsListWithCastEF5); -#endif -#if DEBUG - Debug.WriteLine(sql); -#endif - var l = q.ToList(); - } - } - - /// - /// Test to reproduce bug http://bugs.mysql.com/bug.php?id=73643, Exception when using IEnumera.Contains(model.property) in Where predicate - /// - [Fact] - public void TestContainsListWitConstant() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - using( MovieDBContext db = new MovieDBContext() ) - { - db.Database.Initialize(true); - - List strIds = new List(new string[] { "two" }); - var q = db.Movies.Where(p => strIds.Contains("two")); - string sql = q.ToString(); -#if EF6 - st.CheckSql(sql, SQLSyntax.TestContainsListWitConstant ); -#else - st.CheckSql(sql, SQLSyntax.TestContainsListWitConstantEF5); -#endif -#if DEBUG - Debug.WriteLine(sql); -#endif - var l = q.ToList(); - } - } - - /// - /// Test to reproduce bug http://bugs.mysql.com/bug.php?id=73643, Exception when using IEnumera.Contains(model.property) in Where predicate - /// - [Fact] - public void TestContainsListWithParameterReference() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - ReInitDb(); - using( MovieDBContext db = new MovieDBContext() ) - { - db.Database.Initialize(true); - - long[] longs = new long[] { 1, 2, 3 }; - int myNum = 1; - var q = db.Movies.Where(p => longs.Contains(myNum)); - string sql = q.ToString(); -#if EF6 - st.CheckSql(sql, SQLSyntax.TestContainsListWithParameterReference ); -#else - st.CheckSql(sql, SQLSyntax.TestContainsListWithParameterReferenceEF5); -#endif -#if DEBUG - Debug.WriteLine(sql); -#endif - var l = q.ToList(); - } - } - - [Fact] - public void ReplaceTableNameVisitor() - { - using (SakilaDb context = new SakilaDb()) - { - var date = new DateTime(2005, 6, 1); - var rentals = context.customers.Where(t => t.rentals.Any(r => r.rental_date < date)).OrderBy(o => o.customer_id); - string sql = rentals.ToString(); - st.CheckSql(sql, SQLSyntax.ReplaceNameVisitorQuery); -#if DEBUG - Debug.WriteLine(sql); -#endif - var result = rentals.ToList(); - Assert.Equal(520, rentals.Count()); - } - } - - - /// - /// Bug #70941 - Invalid SQL query when eager loading two nested collections - /// - [Fact] - public void InvalidQuery() - { - using (UsingUnionContext context = new UsingUnionContext()) - { - if (context.Database.Exists()) - context.Database.Delete(); - - context.Database.Create(); - - for (int i = 1; i <= 3; i++) - { - var order = new Order(); - var items = new List(); - - items.Add(new Item { Id = 1 }); - items.Add(new Item { Id = 2 }); - items.Add(new Item { Id = 3 }); - - order.Items = items; - var client = new Client { Id = i }; - client.Orders = new List(); - client.Orders.Add(order); - - context.Clients.Add(client); - } - context.SaveChanges(); - - var clients = context.Clients - .Include(c => c.Orders.Select(o => o.Items)) - .Include(c => c.Orders.Select(o => o.Discounts)).ToList(); - - Assert.Equal(clients.Count(), 3); - Assert.Equal(clients.Where(t => t.Id == 1).Single().Orders.Count(), 1); - Assert.Equal(clients.Where(t => t.Id == 1).Single().Orders.Where(j => j.Id == 1).Single().Items.Count(), 3); - } - } - } -} - diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/Dinosauria.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/Dinosauria.cs deleted file mode 100644 index 98fb5b405..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/Dinosauria.cs +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright © 2014, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.ComponentModel.DataAnnotations; -using System.Data.Entity; -using System.ComponentModel.DataAnnotations.Schema; - - - -namespace MySql.Data.Entity.CodeFirst.Tests -{ - /* - * This data model tests very long names to break FK limit of 64 chars. - * Also uses Table per Type inheritance (TPT). - * */ - public class Animalia_Chordata_Dinosauria_Eusaurischia_Theropoda - { - [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] - public int Id { get; set; } - - [MaxLength(40)] - public string Name { get; set; } - } - - [Table("Tyrannosauridaes")] - public class Tyrannosauridae : Animalia_Chordata_Dinosauria_Eusaurischia_Theropoda - { - public string SpecieName { get; set; } - public float Weight { get; set; } - } - - [Table("Oviraptorosaurias")] - public class Oviraptorosauria : Animalia_Chordata_Dinosauria_Eusaurischia_Theropoda - { - public string SpecieName { get; set; } - public int EggsPerYear { get; set; } - } - -#if EF6 - [DbConfigurationType(typeof(MySqlEFConfiguration))] -#endif - public class DinosauriaDBContext : DbContext - { - public DbSet dinos { get; set; } - - public DinosauriaDBContext() - { - Database.SetInitializer(new DinosauriaDBInitializer()); - } - - protected override void OnModelCreating(DbModelBuilder modelBuilder) - { - modelBuilder.Entity().ToTable("Tyrannosauridaes"); - modelBuilder.Entity().ToTable("Oviraptorosaurias"); - } - } - - public class DinosauriaDBInitializer : DropCreateDatabaseReallyAlways - { - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/ExpressionTests.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/ExpressionTests.cs deleted file mode 100644 index 8dbd0ddaa..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/ExpressionTests.cs +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright � 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System; -using System.Collections.Generic; -using System.Data.Common; -using System.Diagnostics; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Xunit; - -namespace MySql.Data.Entity.CodeFirst.Tests -{ - public class ExpressionTests : IUseFixture, IDisposable - { - - private SetUpCodeFirstTests st; - - public void SetFixture(SetUpCodeFirstTests data) - { - st = data; - } - - public void Dispose() - { - } - - /// - /// Using StartsWith on a list when using variable as parameter - /// - [Fact] - public void CheckStartsWithWhenUsingVariable() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - - using (SakilaDb db = new SakilaDb()) - { - string str = "Astaire"; - var records = db.actors.Where(e => e.last_name.StartsWith(str)).ToArray(); - Assert.Equal(1, records.Count()); - } - } - - /// - /// Using StartsWith on a list when using a hardcoded value - /// - [Fact] - public void CheckStartsWithWhenUsingValue() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - using (SakilaDb db = new SakilaDb()) - { - var result = db.actors.Where(e => e.last_name.StartsWith("Astaire")).ToArray(); - Assert.Equal(1, result.Count()); - } - } - - /// - /// Using EndsWith on a list when using a variable as parameter - /// - [Fact] - public void CheckEndsWithWhenUsingVariable() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - - using (SakilaDb db = new SakilaDb()) - { - string str = "Astaire"; - var result = db.actors.Where(e => e.last_name.EndsWith(str)).ToArray(); - Assert.Equal(1, result.Count()); - } - } - - /// - /// Using EndsWith on a list when using a hardcoded value - /// - [Fact] - public void CheckEndsWithWhenUsingValue() - { -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - - using (SakilaDb db = new SakilaDb()) - { - var result = db.actors.Where(e => e.last_name.EndsWith("Astaire")).ToArray(); - Assert.Equal(1, result.Count()); - } - } - - - /// - /// Using Contains on a list when using a variable - /// - [Fact] - public void CheckContainsWhenUsingVariable() - { - -#if DEBUG - Debug.WriteLine(new StackTrace().GetFrame(0).GetMethod().Name); -#endif - string str = "stai"; - - using (SakilaDb db = new SakilaDb()) - { - var result = db.actors.Where(e => e.last_name.Contains(str)).ToArray(); - Assert.Equal(1, result.Count()); - } - } - - - /// - /// Using Contains on a list when using a hardcoded value - /// - [Fact] - public void CheckContainsWhenUsingHardCodedValue() - { - using (SakilaDb db = new SakilaDb()) - { - var result = db.actors.Where(e => e.last_name.Contains("stai")).ToArray(); - Assert.Equal(1, result.Count()); - } - } - - /// - /// Using Contains on a list when using a hardcoded value - /// - [Fact] - public void CheckContainsWhenUsingHardCodedValueWithPorcentageSymbol() - { - using (SakilaDb db = new SakilaDb()) - { - var result = db.actors.Where(e => e.last_name.Contains("%")).ToArray(); - Assert.Equal(0, result.Count()); - } - } - - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/Movie.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/Movie.cs deleted file mode 100644 index 592299fcb..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/Movie.cs +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright © 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.Linq; -using System.Text; -using System.Data.Entity; -using System.Data.Entity.ModelConfiguration.Conventions; -using System.Data.Entity.Migrations; -using System.ComponentModel.DataAnnotations.Schema; - - -namespace MySql.Data.Entity.CodeFirst.Tests -{ - public class Movie - { - public int ID { get; set; } - public string Title { get; set; } - public DateTime ReleaseDate { get; set; } - public string Genre { get; set; } - public decimal Price { get; set; } - public Director Director { get; set; } - public virtual ICollection Formats { get; set; } - public virtual ICollection Medias { get; set; } - public byte[] Data { get; set; } - } - - public class MovieMedia - { - public int ID { get; set; } - public int MovieID { get; set; } - public string Format { get; set; } - } - - public class Director - { - public int ID { get; set; } - public string Name { get; set; } - public int YearBorn { get; set; } - } - - public class MovieFormat - { - [Key] - public float Format { get; set; } - } - -#if EF6 - [DbConfigurationType(typeof(MySqlEFConfiguration))] -#endif - public class MovieDBContext : DbContext - { - public DbSet Movies { get; set; } - public DbSet MovieFormats { get; set; } - public DbSet MovieReleases { get; set; } - public DbSet EntitySingleColumns { get; set; } - public DbSet Medias { get; set; } - - public MovieDBContext() - { -#if !EF6 - Database.SetInitializer(new MovieDBInitialize()); -#else - Database.SetInitializer(new MigrateDatabaseToLatestVersion>()); -#endif - } - - protected override void OnModelCreating(DbModelBuilder modelBuilder) - { - base.OnModelCreating(modelBuilder); -#if EF6 - modelBuilder.Configurations.AddFromAssembly(System.Reflection.Assembly.GetExecutingAssembly()); -#endif - modelBuilder.Entity().Property(x => x.Price).HasPrecision(16, 2); - modelBuilder.Entity().HasMany(p => p.Formats); - modelBuilder.Entity().HasMany( p => p.Medias ); -} - } - - public class EntitySingleColumn - { - public int Id { get; set; } - } - - public class MovieRelease - { - [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] - public virtual int Id { get; set; } - - [DatabaseGenerated(DatabaseGeneratedOption.Computed)] - public virtual DateTime Timestamp { get; set; } - - [ConcurrencyCheck, Required, MaxLength(45)] - public virtual string Name { get; set; } - } - - public class MovieDBInitialize : DropCreateDatabaseReallyAlways - { - public static Movie[] data = new Movie[] { - new Movie() { ID = 4, Title = "Star Wars, The Sith Revenge", ReleaseDate = new DateTime( 2005, 5, 19 ) }, - new Movie() { ID = 3, Title = "Predator", ReleaseDate = new DateTime(1987, 6, 12) }, - new Movie() { ID = 2, Title = "The Matrix", ReleaseDate = new DateTime( 1999, 3, 31 ) }, - new Movie() { ID = 1, Title = "Terminator 1", ReleaseDate = new DateTime(1984, 10, 26) } - }; - -#if !EF6 - protected override void Seed(MovieDBContext ctx) - { - base.Seed(ctx); - DoDataPopulation( ctx ); - } -#endif - - internal static void DoDataPopulation( MovieDBContext ctx ) - { - ctx.Database.ExecuteSqlCommand("CREATE PROCEDURE GetCount() BEGIN SELECT 5; END"); - Movie m1 = new Movie() { Title = "Terminator 1", ReleaseDate = new DateTime(1984, 10, 26) }; - Movie m2 = new Movie() { Title = "The Matrix", ReleaseDate = new DateTime(1999, 3, 31) }; - Movie m3 = new Movie() { Title = "Predator", ReleaseDate = new DateTime(1987, 6, 12) }; - Movie m4 = new Movie() { Title = "Star Wars, The Sith Revenge", ReleaseDate = new DateTime(2005, 5, 19) }; - ctx.Movies.Add(m1); - ctx.Movies.Add(m2); - ctx.Movies.Add(m3); - ctx.Movies.Add(m4); - ctx.SaveChanges(); - ctx.Entry(m1).Collection(p => p.Medias).Load(); - m1.Medias.Add( new MovieMedia() { Format = "DVD" } ); - m1.Medias.Add( new MovieMedia() { Format = "BlueRay" } ); - ctx.Entry(m2).Collection(p => p.Medias).Load(); - m2.Medias.Add(new MovieMedia() { Format = "DVD" }); - m2.Medias.Add(new MovieMedia() { Format = "Digital" }); - ctx.Entry(m3).Collection(p => p.Medias).Load(); - m3.Medias.Add(new MovieMedia() { Format = "DVD" }); - m3.Medias.Add(new MovieMedia() { Format = "VHS" }); - ctx.Entry(m4).Collection(p => p.Medias).Load(); - m4.Medias.Add(new MovieMedia() { Format = "Digital" }); - m4.Medias.Add(new MovieMedia() { Format = "VHS" }); - ctx.SaveChanges(); - } - } -} \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/MySql.EntityFramework6.CodeFirst.Tests.xproj b/Tests/MySql.EntityFramework6.CodeFirst.Tests/MySql.EntityFramework6.CodeFirst.Tests.xproj deleted file mode 100644 index 6251e5370..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/MySql.EntityFramework6.CodeFirst.Tests.xproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - 14.0.25420 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 1cdc2d65-c754-4e0c-8f72-0a0c0fa2f17a - MySql.EntityFramework6.CodeFirst.Tests - .\obj - .\bin\ - - - - 2.0 - - - \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/PromotionsDB.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/PromotionsDB.cs deleted file mode 100644 index 184465bb5..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/PromotionsDB.cs +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright © 2014, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Data.Entity; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [DbConfigurationType(typeof(MySqlEFConfiguration))] -#endif - public class PromotionsDB: DbContext - { - public virtual DbSet HomePromoes { get; set; } - - public PromotionsDB() - { - Database.SetInitializer(new PromotionsDBInitializer()); - } - } - - public class PromotionsDBInitializer : DropCreateDatabaseReallyAlways - { - } - - public class HomePromo - { - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - [Key] - public int ID { get; set; } - - public string Image { get; set; } - - public string Url { get; set; } - - public int DisplayOrder { get; set; } - - [Column("Active")] - public bool Active { get; set; } - [Column("ActiveFrom")] - public DateTime? ActiveFrom { get; set; } - [Column("ActiveTo")] - public DateTime? ActiveTo { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/Properties/AssemblyInfo.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/Properties/AssemblyInfo.cs deleted file mode 100644 index 0c2043879..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright © 2014, 2015 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Reflection; -using System.Runtime.CompilerServices; -using 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. -[assembly: AssemblyTitle("MySql.EF6.CodeFirst.Tests")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Oracle")] -[assembly: AssemblyProduct("MySql.EF6.CodeFirst.Tests")] -[assembly: AssemblyCopyright("Copyright © 2011, 2015, Oracle and/or its affiliates. All rights reserved.")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("9390d98e-16dc-4846-a1bb-19487a499a34")] - -// 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: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyDelaySign(true)] -[assembly: AssemblyKeyFileAttribute(@"..\..\ConnectorNetPublicKey.snk")] - diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/Properties/SQLSyntax.Designer.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/Properties/SQLSyntax.Designer.cs deleted file mode 100644 index fc59a1da6..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/Properties/SQLSyntax.Designer.cs +++ /dev/null @@ -1,485 +0,0 @@ -//------------------------------------------------------------------------------ -// -// 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 MySql.EntityFramework6.CodeFirst.Tests.Properties { - using System; - using System.Reflection; - - - /// - /// 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.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - public class SQLSyntax { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - internal SQLSyntax() { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - public static global::System.Resources.ResourceManager ResourceManager { - get { - if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("MySql.EntityFramework6.CodeFirst.Tests.Properties.SQLSyntax", typeof(SQLSyntax).GetTypeInfo().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)] - public static global::System.Globalization.CultureInfo Culture { - get { - return resourceCulture; - } - set { - resourceCulture = value; - } - } - - /// - /// Looks up a localized string similar to SELECT - ///1 AS `C1`, - ///`Project3`.`nCdSite`, - ///`Project3`.`C1` AS `C2` - ///FROM (SELECT - ///`visitante`.`nCdSite`, - ///COUNT(DISTINCT `visitante`.`sDsIp`) AS `C1` - ///FROM `visitante` - /// GROUP BY - ///`visitante`.`nCdSite`) AS `Project3`. - /// - public static string CountGroupBy { - get { - return ResourceManager.GetString("CountGroupBy", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///1 AS `C1`, - ///`Project3`.`nCdSite`, - ///`Project3`.`C1` AS `C2` - ///FROM (SELECT - ///`Extent4`.`nCdSite`, - ///COUNT(DISTINCT `Extent4`.`sDsIp`) AS `C1` - ///FROM `pagina` AS `Extent3` INNER JOIN `visitante` AS `Extent4` ON `Extent3`.`nCdVisitante` = `Extent4`.`nCdVisitante` - /// GROUP BY - ///`Extent4`.`nCdSite`) AS `Project3`. - /// - public static string CountGroupBy2 { - get { - return ResourceManager.GetString("CountGroupBy2", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to - ///SELECT - ///1 AS `C1`, - ///`Project3`.`nCdSite`, - ///`Project3`.`C1` AS `C2` - ///FROM (SELECT - ///`Extent5`.`nCdSite`, - ///COUNT(DISTINCT `Extent5`.`sDsIp`) AS `C1` - ///FROM `pagina` AS `Extent3` INNER JOIN `visitante` AS `Extent4` ON `Extent3`.`nCdVisitante` = `Extent4`.`nCdVisitante` LEFT OUTER JOIN `visitante` AS `Extent5` ON `Extent3`.`nCdVisitante` = `Extent5`.`nCdVisitante` - /// GROUP BY - ///`Extent5`.`nCdSite`) AS `Project3` - /// . - /// - public static string CountGroupBy2EF5 { - get { - return ResourceManager.GetString("CountGroupBy2EF5", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///1 AS `C1`, - ///`Project3`.`nCdSite`, - ///`Project3`.`C1` AS `C2` - ///FROM (SELECT - ///`visitante`.`nCdSite`, - ///COUNT(DISTINCT `visitante`.`sDsIp`) AS `C1` - ///FROM `visitante` - /// GROUP BY - ///`visitante`.`nCdSite`) AS `Project3`. - /// - public static string CountGroupByEF5 { - get { - return ResourceManager.GetString("CountGroupByEF5", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - /// `Apply1`.`customer_id`, - /// `Extent5`.`country` - /// FROM (SELECT - /// `Extent1`.`customer_id`, - /// `Extent1`.`store_id`, - /// `Extent1`.`first_name`, - /// `Extent1`.`last_name`, - /// `Extent1`.`email`, - /// `Extent1`.`address_id`, - /// `Extent1`.`active`, - /// `Extent1`.`create_date`, - /// `Extent1`.`last_update`, - /// (SELECT - /// `Project1`.`address_id` - /// FROM `address` AS `Project1` - /// WHERE `Project1`.`address_id` = `Extent1`.`address_id` - /// ORDER BY - /// `Project1`.`address_id` DESC LIMIT 1) AS `ADDRESS [rest of string was truncated]";. - /// - public static string FirstOrDefaultNestedWithOrderBy { - get { - return ResourceManager.GetString("FirstOrDefaultNestedWithOrderBy", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - /// `Project1`.`ID`, - /// `Project1`.`Title`, - /// `Project1`.`ReleaseDate`, - /// `Project1`.`Genre`, - /// `Project1`.`Price`, - /// `Project1`.`Data`, - /// `Project1`.`Director_ID` - /// FROM `Movies` AS `Project1` - /// WHERE `Project1`.`ReleaseDate` >= @p__linq__0 - /// ORDER BY - /// `Project1`.`ReleaseDate` DESC LIMIT 2. - /// - public static string NestedOrderBy { - get { - return ResourceManager.GetString("NestedOrderBy", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`ID`, - ///`Extent1`.`Title`, - ///`Extent1`.`ReleaseDate`, - ///`Extent1`.`Genre`, - ///`Extent1`.`Price`, - ///`Extent1`.`Data`, - ///`Extent1`.`Director_ID` - ///FROM `Movies` AS `Extent1` - /// WHERE `Extent1`.`Title` LIKE @p__linq__0. - /// - public static string QueryWithContains { - get { - return ResourceManager.GetString("QueryWithContains", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`ID`, - ///`Extent1`.`Title`, - ///`Extent1`.`ReleaseDate`, - ///`Extent1`.`Genre`, - ///`Extent1`.`Price`, - ///`Extent1`.`Data`, - ///`Extent1`.`Director_ID` - ///FROM `Movies` AS `Extent1` - /// WHERE `Extent1`.`Title` LIKE @p__linq__0. - /// - public static string QueryWithEndsWith { - get { - return ResourceManager.GetString("QueryWithEndsWith", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Project1`.`ID`, - ///`Project1`.`Title`, - ///`Project1`.`ReleaseDate`, - ///`Project1`.`Genre`, - ///`Project1`.`Price`, - ///`Project1`.`Data`, - ///`Project1`.`Director_ID` - ///FROM `Movies` AS `Project1` - /// WHERE `Project1`.`Title` LIKE @p__linq__0 - /// ORDER BY - ///`Project1`.`ID` DESC LIMIT 10. - /// - public static string QueryWithOrderByTakeContains { - get { - return ResourceManager.GetString("QueryWithOrderByTakeContains", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`ID`, - ///`Extent1`.`Title`, - ///`Extent1`.`ReleaseDate`, - ///`Extent1`.`Genre`, - ///`Extent1`.`Price`, - ///`Extent1`.`Data`, - ///`Extent1`.`Director_ID` - ///FROM `Movies` AS `Extent1` - /// WHERE `Extent1`.`Title` LIKE @p__linq__0. - /// - public static string QueryWithStartsWith { - get { - return ResourceManager.GetString("QueryWithStartsWith", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - /// `Project2`.`customer_id`, - /// `Project2`.`store_id`, - /// `Project2`.`first_name`, - /// `Project2`.`last_name`, - /// `Project2`.`email`, - /// `Project2`.`address_id`, - /// `Project2`.`active`, - /// `Project2`.`create_date`, - /// `Project2`.`last_update` - /// FROM `customer` AS `Project2` - /// WHERE EXISTS(SELECT - /// 1 AS `C1` - /// FROM `rental` AS `Extent2` - /// WHERE (`Project2`.`customer_id` = `Extent2`.`customer_id`) AND (`Extent2`.`rental_date` < @p__linq__0)) - /// ORDER BY - /// `Project2`.`customer_id` ASC. - /// - public static string ReplaceNameVisitorQuery { - get { - return ResourceManager.GetString("ReplaceNameVisitorQuery", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Project1`.`HarborId`, - ///`Project1`.`Description`, - ///`Project1`.`C2` AS `C1`, - ///`Project1`.`ShipId`, - ///`Project1`.`HarborId1`, - ///`Project1`.`Description1`, - ///`Project1`.`C1` AS `C2`, - ///`Project1`.`CrewMemberId`, - ///`Project1`.`ShipId1`, - ///`Project1`.`RankId`, - ///`Project1`.`ClearanceId`, - ///`Project1`.`Description2`, - ///`Project1`.`RankId1`, - ///`Project1`.`Description3`, - ///`Project1`.`ClearanceId1`, - ///`Project1`.`Description4` - ///FROM (SELECT - ///`Extent1`.`HarborId`, - ///`Extent1`.`Description`, - ///`Join3`.`Shi [rest of string was truncated]";. - /// - public static string ShipQueryMalformedDueMultipleProjecttionsCorrected { - get { - return ResourceManager.GetString("ShipQueryMalformedDueMultipleProjecttionsCorrected", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Project1`.`HarborId`, - ///`Project1`.`Description`, - ///`Project1`.`C2` AS `C1`, - ///`Project1`.`ShipId`, - ///`Project1`.`HarborId1`, - ///`Project1`.`Description1`, - ///`Project1`.`C1` AS `C2`, - ///`Project1`.`CrewMemberId`, - ///`Project1`.`ShipId1`, - ///`Project1`.`RankId`, - ///`Project1`.`ClearanceId`, - ///`Project1`.`Description2`, - ///`Project1`.`RankId1`, - ///`Project1`.`Description3`, - ///`Project1`.`ClearanceId1`, - ///`Project1`.`Description4` - ///FROM (SELECT - ///`Extent1`.`HarborId`, - ///`Extent1`.`Description`, - ///`Join3`.`Shi [rest of string was truncated]";. - /// - public static string ShipQueryMalformedDueMultipleProjecttionsCorrectedEF6 { - get { - return ResourceManager.GetString("ShipQueryMalformedDueMultipleProjecttionsCorrectedEF6", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - /// `Extent1`.`ID`, - /// `Extent1`.`Title`, - /// `Extent1`.`ReleaseDate`, - /// `Extent1`.`Genre`, - /// `Extent1`.`Price`, - /// `Extent1`.`Data`, - /// `Extent1`.`Director_ID` - /// FROM `Movies` AS `Extent1` - /// WHERE (@gp1 IN ( @gp2 )) AND (@gp3 IS NOT NULL). - /// - public static string TestContainsListWitConstant { - get { - return ResourceManager.GetString("TestContainsListWitConstant", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`ID`, - ///`Extent1`.`Title`, - ///`Extent1`.`ReleaseDate`, - ///`Extent1`.`Genre`, - ///`Extent1`.`Price`, - ///`Extent1`.`Data`, - ///`Extent1`.`Director_ID` - ///FROM `Movies` AS `Extent1` - /// WHERE @gp1 = @gp2. - /// - public static string TestContainsListWitConstantEF5 { - get { - return ResourceManager.GetString("TestContainsListWitConstantEF5", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - /// `Extent1`.`ID`, - /// `Extent1`.`Title`, - /// `Extent1`.`ReleaseDate`, - /// `Extent1`.`Genre`, - /// `Extent1`.`Price`, - /// `Extent1`.`Data`, - /// `Extent1`.`Director_ID` - /// FROM `Movies` AS `Extent1` - /// WHERE (`Extent1`.`ID` IN ( 1,2,3 )) AND (`Extent1`.`ID` IS NOT NULL). - /// - public static string TestContainsListWithCast { - get { - return ResourceManager.GetString("TestContainsListWithCast", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`ID`, - ///`Extent1`.`Title`, - ///`Extent1`.`ReleaseDate`, - ///`Extent1`.`Genre`, - ///`Extent1`.`Price`, - ///`Extent1`.`Data`, - ///`Extent1`.`Director_ID` - ///FROM `Movies` AS `Extent1` - /// WHERE `Extent1`.`ID` IN ( 1,2,3 ). - /// - public static string TestContainsListWithCastEF5 { - get { - return ResourceManager.GetString("TestContainsListWithCastEF5", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`ID`, - ///`Extent1`.`Title`, - ///`Extent1`.`ReleaseDate`, - ///`Extent1`.`Genre`, - ///`Extent1`.`Price`, - ///`Extent1`.`Data`, - ///`Extent1`.`Director_ID` - ///FROM `Movies` AS `Extent1` - /// WHERE @p__linq__0 IN ( 1,2,3 ). - /// - public static string TestContainsListWithParameterReference { - get { - return ResourceManager.GetString("TestContainsListWithParameterReference", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Extent1`.`ID`, - ///`Extent1`.`Title`, - ///`Extent1`.`ReleaseDate`, - ///`Extent1`.`Genre`, - ///`Extent1`.`Price`, - ///`Extent1`.`Data`, - ///`Extent1`.`Director_ID` - ///FROM `Movies` AS `Extent1` - /// WHERE ((1 = @p__linq__0) OR (2 = @p__linq__0)) OR (3 = @p__linq__0). - /// - public static string TestContainsListWithParameterReferenceEF5 { - get { - return ResourceManager.GetString("TestContainsListWithParameterReferenceEF5", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - /// `Project1`.`ID` AS `C1` - /// FROM `Movies` AS `Project1` - /// WHERE (`Project1`.`ID`) = @p__linq__0 - /// ORDER BY - /// `Project1`.`ID` ASC. - /// - public static string UnknownProjectC1 { - get { - return ResourceManager.GetString("UnknownProjectC1", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to SELECT - ///`Project1`.`ID` AS `C1` - ///FROM `Movies` AS `Project1` - /// WHERE (`Project1`.`ID`) = @p__linq__0 - /// ORDER BY - ///`Project1`.`ID` ASC. - /// - public static string UnknownProjectC1EF6 { - get { - return ResourceManager.GetString("UnknownProjectC1EF6", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to UPDATE `MovieReleases` SET `Name`='Director\'s Cut' WHERE (`Id` = 1) AND (`Name` = 'Commercial'); SELECT `Timestamp` FROM `MovieReleases` WHERE row_count() > 0 and (`Id` = 1) AND (`Name` = 'Director\'s Cut'). - /// - public static string UpdateWithSelect { - get { - return ResourceManager.GetString("UpdateWithSelect", resourceCulture); - } - } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/Properties/SQLSyntax.resx b/Tests/MySql.EntityFramework6.CodeFirst.Tests/Properties/SQLSyntax.resx deleted file mode 100644 index d5a25f719..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/Properties/SQLSyntax.resx +++ /dev/null @@ -1,506 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - SELECT -1 AS `C1`, -`Project3`.`nCdSite`, -`Project3`.`C1` AS `C2` -FROM (SELECT -`visitante`.`nCdSite`, -COUNT(DISTINCT `visitante`.`sDsIp`) AS `C1` -FROM `visitante` - GROUP BY -`visitante`.`nCdSite`) AS `Project3` - - - -SELECT -1 AS `C1`, -`Project3`.`nCdSite`, -`Project3`.`C1` AS `C2` -FROM (SELECT -`Extent5`.`nCdSite`, -COUNT(DISTINCT `Extent5`.`sDsIp`) AS `C1` -FROM `pagina` AS `Extent3` INNER JOIN `visitante` AS `Extent4` ON `Extent3`.`nCdVisitante` = `Extent4`.`nCdVisitante` LEFT OUTER JOIN `visitante` AS `Extent5` ON `Extent3`.`nCdVisitante` = `Extent5`.`nCdVisitante` - GROUP BY -`Extent5`.`nCdSite`) AS `Project3` - - - - SELECT -1 AS `C1`, -`Project3`.`nCdSite`, -`Project3`.`C1` AS `C2` -FROM (SELECT -`Extent4`.`nCdSite`, -COUNT(DISTINCT `Extent4`.`sDsIp`) AS `C1` -FROM `pagina` AS `Extent3` INNER JOIN `visitante` AS `Extent4` ON `Extent3`.`nCdVisitante` = `Extent4`.`nCdVisitante` - GROUP BY -`Extent4`.`nCdSite`) AS `Project3` - - - SELECT -1 AS `C1`, -`Project3`.`nCdSite`, -`Project3`.`C1` AS `C2` -FROM (SELECT -`visitante`.`nCdSite`, -COUNT(DISTINCT `visitante`.`sDsIp`) AS `C1` -FROM `visitante` - GROUP BY -`visitante`.`nCdSite`) AS `Project3` - - - SELECT - `Project1`.`ID`, - `Project1`.`Title`, - `Project1`.`ReleaseDate`, - `Project1`.`Genre`, - `Project1`.`Price`, - `Project1`.`Data`, - `Project1`.`Director_ID` - FROM `Movies` AS `Project1` - WHERE `Project1`.`ReleaseDate` >= @p__linq__0 - ORDER BY - `Project1`.`ReleaseDate` DESC LIMIT 2 - - - SELECT -`Project1`.`ID`, -`Project1`.`Title`, -`Project1`.`ReleaseDate`, -`Project1`.`Genre`, -`Project1`.`Price`, -`Project1`.`Data`, -`Project1`.`Director_ID` -FROM `Movies` AS `Project1` - WHERE `Project1`.`Title` LIKE @p__linq__0 - ORDER BY -`Project1`.`ID` DESC LIMIT 10 - - - SELECT -`Project1`.`HarborId`, -`Project1`.`Description`, -`Project1`.`C2` AS `C1`, -`Project1`.`ShipId`, -`Project1`.`HarborId1`, -`Project1`.`Description1`, -`Project1`.`C1` AS `C2`, -`Project1`.`CrewMemberId`, -`Project1`.`ShipId1`, -`Project1`.`RankId`, -`Project1`.`ClearanceId`, -`Project1`.`Description2`, -`Project1`.`RankId1`, -`Project1`.`Description3`, -`Project1`.`ClearanceId1`, -`Project1`.`Description4` -FROM (SELECT -`Extent1`.`HarborId`, -`Extent1`.`Description`, -`Join3`.`ShipId`, -`Join3`.`HarborId` AS `HarborId1`, -`Join3`.`Description` AS `Description1`, -`Join3`.`CrewMemberId`, -`Join3`.`SHIPID1` AS `ShipId1`, -`Join3`.`RankId`, -`Join3`.`ClearanceId`, -`Join3`.`DESCRIPTION1` AS `Description2`, -`Join3`.`RANKID1` AS `RankId1`, -`Join3`.`DESCRIPTION11` AS `Description3`, -`Join3`.`CLEARANCEID1` AS `ClearanceId1`, -`Join3`.`DESCRIPTION2` AS `Description4`, -CASE WHEN (`Join3`.`ShipId` IS NULL) THEN (NULL) WHEN (`Join3`.`CrewMemberId` IS NULL) THEN (NULL) ELSE (1) END AS `C1`, -CASE WHEN (`Join3`.`ShipId` IS NULL) THEN (NULL) ELSE (1) END AS `C2` -FROM `Harbors` AS `Extent1` LEFT OUTER JOIN (SELECT -`Extent2`.`ShipId`, -`Extent2`.`HarborId`, -`Extent2`.`Description`, -`Join2`.`CrewMemberId`, -`Join2`.`ShipId` AS `SHIPID1`, -`Join2`.`RankId`, -`Join2`.`ClearanceId`, -`Join2`.`Description` AS `DESCRIPTION1`, -`Join2`.`RANKID1`, -`Join2`.`DESCRIPTION1` AS `DESCRIPTION11`, -`Join2`.`CLEARANCEID1`, -`Join2`.`DESCRIPTION2` -FROM `Ships` AS `Extent2` LEFT OUTER JOIN (SELECT -`Extent3`.`CrewMemberId`, -`Extent3`.`ShipId`, -`Extent3`.`RankId`, -`Extent3`.`ClearanceId`, -`Extent3`.`Description`, -`Extent4`.`RankId` AS `RANKID1`, -`Extent4`.`Description` AS `DESCRIPTION1`, -`Extent5`.`ClearanceId` AS `CLEARANCEID1`, -`Extent5`.`Description` AS `DESCRIPTION2` -FROM `CrewMembers` AS `Extent3` INNER JOIN `Ranks` AS `Extent4` ON `Extent3`.`RankId` = `Extent4`.`RankId` LEFT OUTER JOIN `Clearances` AS `Extent5` ON `Extent3`.`ClearanceId` = `Extent5`.`ClearanceId`) AS `Join2` ON `Extent2`.`ShipId` = `Join2`.`ShipId`) AS `Join3` ON `Extent1`.`HarborId` = `Join3`.`HarborId`) AS `Project1` - ORDER BY -`Project1`.`HarborId` ASC, -`Project1`.`C2` ASC, -`Project1`.`ShipId` ASC, -`Project1`.`C1` ASC - - - SELECT -`Project1`.`HarborId`, -`Project1`.`Description`, -`Project1`.`C2` AS `C1`, -`Project1`.`ShipId`, -`Project1`.`HarborId1`, -`Project1`.`Description1`, -`Project1`.`C1` AS `C2`, -`Project1`.`CrewMemberId`, -`Project1`.`ShipId1`, -`Project1`.`RankId`, -`Project1`.`ClearanceId`, -`Project1`.`Description2`, -`Project1`.`RankId1`, -`Project1`.`Description3`, -`Project1`.`ClearanceId1`, -`Project1`.`Description4` -FROM (SELECT -`Extent1`.`HarborId`, -`Extent1`.`Description`, -`Join3`.`ShipId`, -`Join3`.`HarborId` AS `HarborId1`, -`Join3`.`Description` AS `Description1`, -`Join3`.`CrewMemberId`, -`Join3`.`SHIPID1` AS `ShipId1`, -`Join3`.`RankId`, -`Join3`.`ClearanceId`, -`Join3`.`DESCRIPTION1` AS `Description2`, -`Join3`.`RANKID1` AS `RankId1`, -`Join3`.`DESCRIPTION11` AS `Description3`, -`Join3`.`CLEARANCEID1` AS `ClearanceId1`, -`Join3`.`DESCRIPTION2` AS `Description4`, -CASE WHEN (`Join3`.`ShipId` IS NULL) THEN (NULL) WHEN (`Join3`.`CrewMemberId` IS NULL) THEN (NULL) ELSE (1) END AS `C1`, -CASE WHEN (`Join3`.`ShipId` IS NULL) THEN (NULL) ELSE (1) END AS `C2` -FROM `Harbors` AS `Extent1` LEFT OUTER JOIN (SELECT -`Extent2`.`ShipId`, -`Extent2`.`HarborId`, -`Extent2`.`Description`, -`Join2`.`CrewMemberId`, -`Join2`.`ShipId` AS `SHIPID1`, -`Join2`.`RankId`, -`Join2`.`ClearanceId`, -`Join2`.`Description` AS `DESCRIPTION1`, -`Join2`.`RANKID1`, -`Join2`.`DESCRIPTION1` AS `DESCRIPTION11`, -`Join2`.`CLEARANCEID1`, -`Join2`.`DESCRIPTION2` -FROM `Ships` AS `Extent2` LEFT OUTER JOIN (SELECT -`Extent3`.`CrewMemberId`, -`Extent3`.`ShipId`, -`Extent3`.`RankId`, -`Extent3`.`ClearanceId`, -`Extent3`.`Description`, -`Extent4`.`RankId` AS `RANKID1`, -`Extent4`.`Description` AS `DESCRIPTION1`, -`Extent5`.`ClearanceId` AS `CLEARANCEID1`, -`Extent5`.`Description` AS `DESCRIPTION2` -FROM `CrewMembers` AS `Extent3` INNER JOIN `Ranks` AS `Extent4` ON `Extent3`.`RankId` = `Extent4`.`RankId` INNER JOIN `Clearances` AS `Extent5` ON `Extent3`.`ClearanceId` = `Extent5`.`ClearanceId`) AS `Join2` ON `Extent2`.`ShipId` = `Join2`.`ShipId`) AS `Join3` ON `Extent1`.`HarborId` = `Join3`.`HarborId`) AS `Project1` - ORDER BY -`Project1`.`HarborId` ASC, -`Project1`.`C2` ASC, -`Project1`.`ShipId` ASC, -`Project1`.`C1` ASC - - - UPDATE `MovieReleases` SET `Name`='Director\'s Cut' WHERE (`Id` = 1) AND (`Name` = 'Commercial'); SELECT `Timestamp` FROM `MovieReleases` WHERE row_count() > 0 and (`Id` = 1) AND (`Name` = 'Director\'s Cut') - - - SELECT - `Project1`.`ID` AS `C1` - FROM `Movies` AS `Project1` - WHERE (`Project1`.`ID`) = @p__linq__0 - ORDER BY - `Project1`.`ID` ASC - - - SELECT -`Project1`.`ID` AS `C1` -FROM `Movies` AS `Project1` - WHERE (`Project1`.`ID`) = @p__linq__0 - ORDER BY -`Project1`.`ID` ASC - - - SELECT -`Extent1`.`ID`, -`Extent1`.`Title`, -`Extent1`.`ReleaseDate`, -`Extent1`.`Genre`, -`Extent1`.`Price`, -`Extent1`.`Data`, -`Extent1`.`Director_ID` -FROM `Movies` AS `Extent1` - WHERE `Extent1`.`Title` LIKE @p__linq__0 - - - SELECT -`Extent1`.`ID`, -`Extent1`.`Title`, -`Extent1`.`ReleaseDate`, -`Extent1`.`Genre`, -`Extent1`.`Price`, -`Extent1`.`Data`, -`Extent1`.`Director_ID` -FROM `Movies` AS `Extent1` - WHERE `Extent1`.`Title` LIKE @p__linq__0 - - - SELECT -`Extent1`.`ID`, -`Extent1`.`Title`, -`Extent1`.`ReleaseDate`, -`Extent1`.`Genre`, -`Extent1`.`Price`, -`Extent1`.`Data`, -`Extent1`.`Director_ID` -FROM `Movies` AS `Extent1` - WHERE `Extent1`.`Title` LIKE @p__linq__0 - - - SELECT - `Extent1`.`ID`, - `Extent1`.`Title`, - `Extent1`.`ReleaseDate`, - `Extent1`.`Genre`, - `Extent1`.`Price`, - `Extent1`.`Data`, - `Extent1`.`Director_ID` - FROM `Movies` AS `Extent1` - WHERE (@gp1 IN ( @gp2 )) AND (@gp3 IS NOT NULL) - - - SELECT - `Extent1`.`ID`, - `Extent1`.`Title`, - `Extent1`.`ReleaseDate`, - `Extent1`.`Genre`, - `Extent1`.`Price`, - `Extent1`.`Data`, - `Extent1`.`Director_ID` - FROM `Movies` AS `Extent1` - WHERE (`Extent1`.`ID` IN ( 1,2,3 )) AND (`Extent1`.`ID` IS NOT NULL) - - - SELECT -`Extent1`.`ID`, -`Extent1`.`Title`, -`Extent1`.`ReleaseDate`, -`Extent1`.`Genre`, -`Extent1`.`Price`, -`Extent1`.`Data`, -`Extent1`.`Director_ID` -FROM `Movies` AS `Extent1` - WHERE @p__linq__0 IN ( 1,2,3 ) - - - SELECT -`Extent1`.`ID`, -`Extent1`.`Title`, -`Extent1`.`ReleaseDate`, -`Extent1`.`Genre`, -`Extent1`.`Price`, -`Extent1`.`Data`, -`Extent1`.`Director_ID` -FROM `Movies` AS `Extent1` - WHERE @gp1 = @gp2 - - - SELECT -`Extent1`.`ID`, -`Extent1`.`Title`, -`Extent1`.`ReleaseDate`, -`Extent1`.`Genre`, -`Extent1`.`Price`, -`Extent1`.`Data`, -`Extent1`.`Director_ID` -FROM `Movies` AS `Extent1` - WHERE `Extent1`.`ID` IN ( 1,2,3 ) - - - SELECT -`Extent1`.`ID`, -`Extent1`.`Title`, -`Extent1`.`ReleaseDate`, -`Extent1`.`Genre`, -`Extent1`.`Price`, -`Extent1`.`Data`, -`Extent1`.`Director_ID` -FROM `Movies` AS `Extent1` - WHERE ((1 = @p__linq__0) OR (2 = @p__linq__0)) OR (3 = @p__linq__0) - - - SELECT - `Apply1`.`customer_id`, - `Extent5`.`country` - FROM (SELECT - `Extent1`.`customer_id`, - `Extent1`.`store_id`, - `Extent1`.`first_name`, - `Extent1`.`last_name`, - `Extent1`.`email`, - `Extent1`.`address_id`, - `Extent1`.`active`, - `Extent1`.`create_date`, - `Extent1`.`last_update`, - (SELECT - `Project1`.`address_id` - FROM `address` AS `Project1` - WHERE `Project1`.`address_id` = `Extent1`.`address_id` - ORDER BY - `Project1`.`address_id` DESC LIMIT 1) AS `ADDRESS_ID1`, - (SELECT - `Project1`.`city_id` - FROM `address` AS `Project1` - WHERE `Project1`.`address_id` = `Extent1`.`address_id` - ORDER BY - `Project1`.`address_id` DESC LIMIT 1) AS `city_id` - FROM `customer` AS `Extent1`) AS `Apply1` INNER JOIN `store` AS `Extent3` ON `Apply1`.`store_id` = - `Extent3`.`store_id` LEFT OUTER JOIN `city` AS `Extent4` ON `Apply1`.`city_id` = `Extent4`.`city_id` - LEFT OUTER JOIN `country` AS `Extent5` ON `Extent4`.`country_id` = `Extent5`.`country_id` - ORDER BY - `Apply1`.`customer_id` DESC - - - SELECT - `Project2`.`customer_id`, - `Project2`.`store_id`, - `Project2`.`first_name`, - `Project2`.`last_name`, - `Project2`.`email`, - `Project2`.`address_id`, - `Project2`.`active`, - `Project2`.`create_date`, - `Project2`.`last_update` - FROM `customer` AS `Project2` - WHERE EXISTS(SELECT - 1 AS `C1` - FROM `rental` AS `Extent2` - WHERE (`Project2`.`customer_id` = `Extent2`.`customer_id`) AND (`Extent2`.`rental_date` < @p__linq__0)) - ORDER BY - `Project2`.`customer_id` ASC - - \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/SakilaDb.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/SakilaDb.cs deleted file mode 100644 index 006a0c9ea..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/SakilaDb.cs +++ /dev/null @@ -1,398 +0,0 @@ -// Copyright � 2015 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Data.Entity; -using System.ComponentModel.DataAnnotations.Schema; -using System.Linq; -using System.Data.Common; - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [DbConfigurationType(typeof(MySqlEFConfiguration))] -#endif - public partial class SakilaDb : DbContext - { - - public SakilaDb() - : base("name=SakilaDb") - { - } - - public SakilaDb(DbConnection existingConnection, bool contextOwnsConnection) - : base(existingConnection, contextOwnsConnection) - { - } - - public virtual DbSet actors { get; set; } - public virtual DbSet
addresses { get; set; } - public virtual DbSet categories { get; set; } - public virtual DbSet cities { get; set; } - public virtual DbSet countries { get; set; } - public virtual DbSet customers { get; set; } - public virtual DbSet films { get; set; } - public virtual DbSet film_actor { get; set; } - public virtual DbSet film_category { get; set; } - public virtual DbSet film_text { get; set; } - public virtual DbSet inventories { get; set; } - public virtual DbSet languages { get; set; } - public virtual DbSet payments { get; set; } - public virtual DbSet rentals { get; set; } - public virtual DbSet staffs { get; set; } - public virtual DbSet stores { get; set; } - public virtual DbSet actor_info { get; set; } - public virtual DbSet customer_list { get; set; } - public virtual DbSet film_list { get; set; } - public virtual DbSet nicer_but_slower_film_list { get; set; } - public virtual DbSet sales_by_film_category { get; set; } - public virtual DbSet sales_by_store { get; set; } - public virtual DbSet staff_list { get; set; } - - protected override void OnModelCreating(DbModelBuilder modelBuilder) - { - modelBuilder.Entity() - .Property(e => e.first_name) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.last_name) - .IsUnicode(false); - - modelBuilder.Entity() - .HasMany(e => e.film_actor) - .WithRequired(e => e.actor) - .WillCascadeOnDelete(false); - - modelBuilder.Entity
() - .Property(e => e.address1) - .IsUnicode(false); - - modelBuilder.Entity
() - .Property(e => e.address2) - .IsUnicode(false); - - modelBuilder.Entity
() - .Property(e => e.district) - .IsUnicode(false); - - modelBuilder.Entity
() - .Property(e => e.postal_code) - .IsUnicode(false); - - modelBuilder.Entity
() - .Property(e => e.phone) - .IsUnicode(false); - - modelBuilder.Entity
() - .HasMany(e => e.customers) - .WithRequired(e => e.address) - .WillCascadeOnDelete(false); - - modelBuilder.Entity
() - .HasMany(e => e.staffs) - .WithRequired(e => e.address) - .WillCascadeOnDelete(false); - - modelBuilder.Entity
() - .HasMany(e => e.stores) - .WithRequired(e => e.address) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .Property(e => e.name) - .IsUnicode(false); - - modelBuilder.Entity() - .HasMany(e => e.film_category) - .WithRequired(e => e.category) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .Property(e => e.city1) - .IsUnicode(false); - - modelBuilder.Entity() - .HasMany(e => e.addresses) - .WithRequired(e => e.city) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .Property(e => e.country1) - .IsUnicode(false); - - modelBuilder.Entity() - .HasMany(e => e.cities) - .WithRequired(e => e.country) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .Property(e => e.first_name) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.last_name) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.email) - .IsUnicode(false); - - modelBuilder.Entity() - .HasMany(e => e.payments) - .WithRequired(e => e.customer) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .HasMany(e => e.rentals) - .WithRequired(e => e.customer) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .Property(e => e.title) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.description) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.rating) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.special_features) - .IsUnicode(false); - - modelBuilder.Entity() - .HasMany(e => e.film_actor) - .WithRequired(e => e.film) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .HasMany(e => e.film_category) - .WithRequired(e => e.film) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .HasMany(e => e.inventories) - .WithRequired(e => e.film) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .Property(e => e.title) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.description) - .IsUnicode(false); - - modelBuilder.Entity() - .HasMany(e => e.rentals) - .WithRequired(e => e.inventory) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .Property(e => e.name) - .IsUnicode(false); - - modelBuilder.Entity() - .HasMany(e => e.films) - .WithRequired(e => e.language) - .HasForeignKey(e => e.language_id) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .HasMany(e => e.films1) - .WithOptional(e => e.language1) - .HasForeignKey(e => e.original_language_id); - - modelBuilder.Entity() - .Property(e => e.first_name) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.last_name) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.email) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.username) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.password) - .IsUnicode(false); - - modelBuilder.Entity() - .HasMany(e => e.payments) - .WithRequired(e => e.staff) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .HasMany(e => e.rentals) - .WithRequired(e => e.staff) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .HasMany(e => e.stores) - .WithRequired(e => e.staff) - .HasForeignKey(e => e.manager_staff_id) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .HasMany(e => e.customers) - .WithRequired(e => e.store) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .HasMany(e => e.inventories) - .WithRequired(e => e.store) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .HasMany(e => e.staffs) - .WithRequired(e => e.store) - .HasForeignKey(e => e.store_id) - .WillCascadeOnDelete(false); - - modelBuilder.Entity() - .Property(e => e.first_name) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.last_name) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.film_info) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.name) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.address) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.zip_code) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.phone) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.city) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.country) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.notes) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.title) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.description) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.category) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.rating) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.actors) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.title) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.description) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.category) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.rating) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.actors) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.category) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.store) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.manager) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.name) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.address) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.zip_code) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.phone) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.city) - .IsUnicode(false); - - modelBuilder.Entity() - .Property(e => e.country) - .IsUnicode(false); - } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/actor.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/actor.cs deleted file mode 100644 index 8ef579725..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/actor.cs +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.actor")] -#else - [Table("actor")] -#endif - public partial class actor - { - public actor() - { - film_actor = new HashSet(); - } - - [Key] - [Column(TypeName = "usmallint")] - public int actor_id { get; set; } - - [Required] - [StringLength(45)] - public string first_name { get; set; } - - [Required] - [StringLength(45)] - public string last_name { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual ICollection film_actor { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/actor_info.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/actor_info.cs deleted file mode 100644 index e96ef6621..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/actor_info.cs +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.actor_info")] -#else - [Table("actor_info")] -#endif - public partial class actor_info - { - [Key] - [Column(Order = 0, TypeName = "usmallint")] - [DatabaseGenerated(DatabaseGeneratedOption.None)] - public int actor_id { get; set; } - - [Key] - [Column(Order = 1)] - [StringLength(45)] - public string first_name { get; set; } - - [Key] - [Column(Order = 2)] - [StringLength(45)] - public string last_name { get; set; } - - [Column(TypeName = "text")] - [StringLength(65535)] - public string film_info { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/address.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/address.cs deleted file mode 100644 index b2f500222..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/address.cs +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.address")] -#else - [Table("address")] -#endif - public partial class address - { - public address() - { - customers = new HashSet(); - staffs = new HashSet(); - stores = new HashSet(); - } - - [Key] - [Column(TypeName = "usmallint")] - public int address_id { get; set; } - - [Column("address")] - [Required] - [StringLength(50)] - public string address1 { get; set; } - - [StringLength(50)] - public string address2 { get; set; } - - [Required] - [StringLength(20)] - public string district { get; set; } - - [Column(TypeName = "usmallint")] - public int city_id { get; set; } - - [StringLength(10)] - public string postal_code { get; set; } - - [Required] - [StringLength(20)] - public string phone { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual city city { get; set; } - - public virtual ICollection customers { get; set; } - - public virtual ICollection staffs { get; set; } - - public virtual ICollection stores { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/category.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/category.cs deleted file mode 100644 index 7b618f8b9..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/category.cs +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.category")] -#else - [Table("category")] -#endif - public partial class category - { - public category() - { - film_category = new HashSet(); - } - - [Key] - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public byte category_id { get; set; } - - [Required] - [StringLength(25)] - public string name { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual ICollection film_category { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/city.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/city.cs deleted file mode 100644 index 009f7b317..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/city.cs +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.city")] -#else - [Table("city")] -#endif - public partial class city - { - public city() - { - addresses = new HashSet
(); - } - - [Key] - [Column(TypeName = "usmallint")] - public int city_id { get; set; } - - [Column("city")] - [Required] - [StringLength(50)] - public string city1 { get; set; } - - [Column(TypeName = "usmallint")] - public int country_id { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual ICollection
addresses { get; set; } - - public virtual country country { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/country.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/country.cs deleted file mode 100644 index 21d34abc7..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/country.cs +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.country")] -#else - [Table("country")] -#endif - public partial class country - { - public country() - { - cities = new HashSet(); - } - - [Key] - [Column(TypeName = "usmallint")] - public int country_id { get; set; } - - [Column("country")] - [Required] - [StringLength(50)] - public string country1 { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual ICollection cities { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/customer.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/customer.cs deleted file mode 100644 index a121a7cff..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/customer.cs +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.customer")] -#else - [Table("customer")] -#endif - public partial class customer - { - public customer() - { - payments = new HashSet(); - rentals = new HashSet(); - } - - [Key] - [Column(TypeName = "usmallint")] - public int customer_id { get; set; } - - public byte store_id { get; set; } - - [Required] - [StringLength(45)] - public string first_name { get; set; } - - [Required] - [StringLength(45)] - public string last_name { get; set; } - - [StringLength(50)] - public string email { get; set; } - - [Column(TypeName = "usmallint")] - public int address_id { get; set; } - - public bool active { get; set; } - - public DateTime create_date { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual address address { get; set; } - - public virtual store store { get; set; } - - public virtual ICollection payments { get; set; } - - public virtual ICollection rentals { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/customer_list.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/customer_list.cs deleted file mode 100644 index d63688e2a..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/customer_list.cs +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.customer_list")] -#else - [Table("customer_list")] -#endif - public partial class customer_list - { - [Key] - [Column(Order = 0, TypeName = "usmallint")] - [DatabaseGenerated(DatabaseGeneratedOption.None)] - public int ID { get; set; } - - [Key] - [Column(Order = 1)] - [StringLength(91)] - public string name { get; set; } - - [Key] - [Column(Order = 2)] - [StringLength(50)] - public string address { get; set; } - - [Column("zip code")] - [StringLength(10)] - public string zip_code { get; set; } - - [Key] - [Column(Order = 3)] - [StringLength(20)] - public string phone { get; set; } - - [Key] - [Column(Order = 4)] - [StringLength(50)] - public string city { get; set; } - - [Key] - [Column(Order = 5)] - [StringLength(50)] - public string country { get; set; } - - [Key] - [Column(Order = 6)] - [StringLength(6)] - public string notes { get; set; } - - [Key] - [Column(Order = 7)] - public byte SID { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/film.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/film.cs deleted file mode 100644 index 2701d3e9d..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/film.cs +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.film")] -#else - [Table("film")] -#endif - public partial class film - { - public film() - { - film_actor = new HashSet(); - film_category = new HashSet(); - inventories = new HashSet(); - } - - [Key] - [Column(TypeName = "usmallint")] - public int film_id { get; set; } - - [Required] - [StringLength(255)] - public string title { get; set; } - - [Column(TypeName = "text")] - [StringLength(65535)] - public string description { get; set; } - - [Column(TypeName = "year")] - public short? release_year { get; set; } - - public byte language_id { get; set; } - - public byte? original_language_id { get; set; } - - public byte rental_duration { get; set; } - - public decimal rental_rate { get; set; } - - [Column(TypeName = "usmallint")] - public int? length { get; set; } - - public decimal replacement_cost { get; set; } - - [Column(TypeName = "enum")] - [StringLength(65532)] - public string rating { get; set; } - - [Column(TypeName = "set")] - [StringLength(65531)] - public string special_features { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual ICollection film_actor { get; set; } - - public virtual ICollection film_category { get; set; } - - public virtual language language { get; set; } - - public virtual language language1 { get; set; } - - public virtual ICollection inventories { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/film_actor.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/film_actor.cs deleted file mode 100644 index 9eec1954d..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/film_actor.cs +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.film_actor")] -#else - [Table("film_actor")] -#endif - public partial class film_actor - { - [Key] - [Column(Order = 0, TypeName = "usmallint")] - [DatabaseGenerated(DatabaseGeneratedOption.None)] - public int actor_id { get; set; } - - [Key] - [Column(Order = 1, TypeName = "usmallint")] - [DatabaseGenerated(DatabaseGeneratedOption.None)] - public int film_id { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual actor actor { get; set; } - - public virtual film film { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/film_category.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/film_category.cs deleted file mode 100644 index 9a4741352..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/film_category.cs +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.film_category")] -#else - [Table("film_category")] -#endif - public partial class film_category - { - [Key] - [Column(Order = 0, TypeName = "usmallint")] - [DatabaseGenerated(DatabaseGeneratedOption.None)] - public int film_id { get; set; } - - [Key] - [Column(Order = 1)] - public byte category_id { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual category category { get; set; } - - public virtual film film { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/film_list.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/film_list.cs deleted file mode 100644 index 870a0baf8..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/film_list.cs +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.film_list")] -#else - [Table("film_list")] -#endif - public partial class film_list - { - [Column(TypeName = "usmallint")] - public int? FID { get; set; } - - [StringLength(255)] - public string title { get; set; } - - [Column(TypeName = "text")] - [StringLength(65535)] - public string description { get; set; } - - [Key] - [StringLength(25)] - public string category { get; set; } - - public decimal? price { get; set; } - - [Column(TypeName = "usmallint")] - public int? length { get; set; } - - [Column(TypeName = "enum")] - [StringLength(65532)] - public string rating { get; set; } - - [Column(TypeName = "text")] - [StringLength(65535)] - public string actors { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/film_text.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/film_text.cs deleted file mode 100644 index 1b13c0490..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/film_text.cs +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.film_text")] -#else - [Table("film_text")] -#endif - public partial class film_text - { - [Key] - [DatabaseGenerated(DatabaseGeneratedOption.None)] - public short film_id { get; set; } - - [Required] - [StringLength(255)] - public string title { get; set; } - - [Column(TypeName = "text")] - [StringLength(65535)] - public string description { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/inventory.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/inventory.cs deleted file mode 100644 index 72d43dd6a..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/inventory.cs +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.inventory")] -#else - [Table("inventory")] -#endif - public partial class inventory - { - public inventory() - { - rentals = new HashSet(); - } - - [Key] - [Column(TypeName = "umediumint")] - public int inventory_id { get; set; } - - [Column(TypeName = "usmallint")] - public int film_id { get; set; } - - public byte store_id { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual film film { get; set; } - - public virtual store store { get; set; } - - public virtual ICollection rentals { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/language.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/language.cs deleted file mode 100644 index 032cdddf8..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/language.cs +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.language")] -#else - [Table("language")] -#endif - public partial class language - { - public language() - { - films = new HashSet(); - films1 = new HashSet(); - } - - [Key] - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public byte language_id { get; set; } - - [Column(TypeName = "char")] - [Required] - [StringLength(20)] - public string name { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual ICollection films { get; set; } - - public virtual ICollection films1 { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/nicer_but_slower_film_list.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/nicer_but_slower_film_list.cs deleted file mode 100644 index 5d43f3e9e..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/nicer_but_slower_film_list.cs +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.nicer_but_slower_film_list")] -#else - [Table("nicer_but_slower_film_list")] -#endif - public partial class nicer_but_slower_film_list - { - [Column(TypeName = "usmallint")] - public int? FID { get; set; } - - [StringLength(255)] - public string title { get; set; } - - [Column(TypeName = "text")] - [StringLength(65535)] - public string description { get; set; } - - [Key] - [StringLength(25)] - public string category { get; set; } - - public decimal? price { get; set; } - - [Column(TypeName = "usmallint")] - public int? length { get; set; } - - [Column(TypeName = "enum")] - [StringLength(65532)] - public string rating { get; set; } - - [Column(TypeName = "text")] - [StringLength(65535)] - public string actors { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/payment.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/payment.cs deleted file mode 100644 index 6ebf53f6c..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/payment.cs +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.payment")] -#else - [Table("payment")] -#endif - public partial class payment - { - [Key] - [Column(TypeName = "usmallint")] - public int payment_id { get; set; } - - [Column(TypeName = "usmallint")] - public int customer_id { get; set; } - - public byte staff_id { get; set; } - - public int? rental_id { get; set; } - - public decimal amount { get; set; } - - public DateTime payment_date { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual customer customer { get; set; } - - public virtual rental rental { get; set; } - - public virtual staff staff { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/rental.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/rental.cs deleted file mode 100644 index cfdf3c11f..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/rental.cs +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.rental")] -#else - [Table("rental")] -#endif - public partial class rental - { - public rental() - { - payments = new HashSet(); - } - - [Key] - public int rental_id { get; set; } - - public DateTime rental_date { get; set; } - - [Column(TypeName = "umediumint")] - public int inventory_id { get; set; } - - [Column(TypeName = "usmallint")] - public int customer_id { get; set; } - - public DateTime? return_date { get; set; } - - public byte staff_id { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual customer customer { get; set; } - - public virtual inventory inventory { get; set; } - - public virtual ICollection payments { get; set; } - - public virtual staff staff { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/sales_by_film_category.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/sales_by_film_category.cs deleted file mode 100644 index a85fd327c..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/sales_by_film_category.cs +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 - using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.sales_by_film_category")] -#else - [Table("sales_by_film_category")] -#endif - public partial class sales_by_film_category - { - [Key] - [StringLength(25)] - public string category { get; set; } - - public decimal? total_sales { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/sales_by_store.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/sales_by_store.cs deleted file mode 100644 index 4eaf8f1e6..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/sales_by_store.cs +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.sales_by_store")] -#else - [Table("sales_by_store")] -#endif - public partial class sales_by_store - { - [Key] - [Column(Order = 0)] - [StringLength(101)] - public string store { get; set; } - - [Key] - [Column(Order = 1)] - [StringLength(91)] - public string manager { get; set; } - - public decimal? total_sales { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/staff.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/staff.cs deleted file mode 100644 index aefc84a04..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/staff.cs +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.staff")] -#else - [Table("staff")] -#endif - public partial class staff - { - public staff() - { - payments = new HashSet(); - rentals = new HashSet(); - stores = new HashSet(); - } - - [Key] - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public byte staff_id { get; set; } - - [Required] - [StringLength(45)] - public string first_name { get; set; } - - [Required] - [StringLength(45)] - public string last_name { get; set; } - - [Column(TypeName = "usmallint")] - public int address_id { get; set; } - - [Column(TypeName = "blob")] - public byte[] picture { get; set; } - - [StringLength(50)] - public string email { get; set; } - - public byte store_id { get; set; } - - public bool active { get; set; } - - [Required] - [StringLength(16)] - public string username { get; set; } - - [StringLength(40)] - public string password { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual address address { get; set; } - - public virtual ICollection payments { get; set; } - - public virtual ICollection rentals { get; set; } - - public virtual store store { get; set; } - - public virtual ICollection stores { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/staff_list.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/staff_list.cs deleted file mode 100644 index b39ef569b..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/staff_list.cs +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.staff_list")] -#else - [Table("staff_list")] -#endif - public partial class staff_list - { - [Key] - [Column(Order = 0)] - public byte ID { get; set; } - - [Key] - [Column(Order = 1)] - [StringLength(91)] - public string name { get; set; } - - [Key] - [Column(Order = 2)] - [StringLength(50)] - public string address { get; set; } - - [Column("zip code")] - [StringLength(10)] - public string zip_code { get; set; } - - [Key] - [Column(Order = 3)] - [StringLength(20)] - public string phone { get; set; } - - [Key] - [Column(Order = 4)] - [StringLength(50)] - public string city { get; set; } - - [Key] - [Column(Order = 5)] - [StringLength(50)] - public string country { get; set; } - - [Key] - [Column(Order = 6)] - public byte SID { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/store.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/store.cs deleted file mode 100644 index f8a0d2c10..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SakilaModel/store.cs +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright � 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if EF6 -using System.Data.Entity.Spatial; -#endif - -namespace MySql.Data.Entity.CodeFirst.Tests -{ -#if EF6 - [Table("sakila.store")] -#else - [Table("store")] -#endif - public partial class store - { - public store() - { - customers = new HashSet(); - inventories = new HashSet(); - staffs = new HashSet(); - } - - [Key] - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public byte store_id { get; set; } - - public byte manager_staff_id { get; set; } - - [Column(TypeName = "usmallint")] - public int address_id { get; set; } - - [Column(TypeName = "timestamp")] - public DateTime last_update { get; set; } - - public virtual address address { get; set; } - - public virtual ICollection customers { get; set; } - - public virtual ICollection inventories { get; set; } - - public virtual ICollection staffs { get; set; } - - public virtual staff staff { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SetUpCodeFirstTests.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/SetUpCodeFirstTests.cs deleted file mode 100644 index 7f3ebb8e9..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SetUpCodeFirstTests.cs +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright © 2013, 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySql.Data.MySqlClient; -using System.Data; -using System.Configuration; -using System.Reflection; -using System; -using System.Collections.Specialized; -using System.Diagnostics; -using System.Resources; -using System.Xml; -using System.IO; -using System.Text; -using Xunit; -using MySql.Data.Entity.Tests; -using System.Data.Entity.Core.EntityClient; - - -namespace MySql.Data.Entity.CodeFirst.Tests -{ - public class SetUpCodeFirstTests : SetUpClass, IDisposable - { - // A trace listener to use during testing. - private AssertFailTraceListener asertFailListener = new AssertFailTraceListener(); - - public override void Initialize() - { - database0 = database1 = "test"; - MySqlConnection.ClearAllPools(); - } - - public SetUpCodeFirstTests():base() - { - - // Override sql_mode so it converts automatically from varchar(65535) to text - MySqlCommand cmd = new MySqlCommand("SET GLOBAL SQL_MODE=``", rootConn); - cmd.ExecuteNonQuery(); - - // Replace existing listeners with listener for testing. - Trace.Listeners.Clear(); - Trace.Listeners.Add(this.asertFailListener); - - DataSet dataSet = ConfigurationManager.GetSection("system.data") as System.Data.DataSet; - DataView vi = dataSet.Tables[0].DefaultView; - vi.Sort = "Name"; - int idx = -1; - if ( ((idx = vi.Find("MySql")) != -1 ) || (( idx = vi.Find("MySQL Data Provider")) != -1 ) ) - { - DataRow row = vi[idx].Row; - dataSet.Tables[0].Rows.Remove(row); - } - dataSet.Tables[0].Rows.Add("MySql" - , "MySql.Data.MySqlClient" - , "MySql.Data.MySqlClient" - , - typeof(MySql.Data.MySqlClient.MySqlClientFactory).AssemblyQualifiedName); - - - cmd = new MySqlCommand("SELECT COUNT(SCHEMA_NAME) FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'sakila'", rootConn); - - if (Convert.ToInt32(cmd.ExecuteScalar() ?? 0) == 0) - { - Assembly executingAssembly = Assembly.GetExecutingAssembly(); - using (var stream = executingAssembly.GetManifestResourceStream("MySql.Data.Entity.CodeFirst.Tests.Properties.SetupSakilaDb.sql")) - { - using (StreamReader sr = new StreamReader(stream)) - { - string sql = sr.ReadToEnd(); - MySqlScript s = new MySqlScript(rootConn, sql); - s.Execute(); - } - } - - using (var stream = executingAssembly.GetManifestResourceStream("MySql.Data.Entity.CodeFirst.Tests.Properties.SakilaDbDataScript.sql")) - { - using (StreamReader sr = new StreamReader(stream)) - { - string sql = sr.ReadToEnd(); - MySqlScript s = new MySqlScript(rootConn, sql); - s.Execute(); - } - } - } - } - - public override void Dispose() - { - base.Dispose(); - } - - private EntityConnection GetEntityConnection() - { - return null; - } - - protected internal void CheckSql(string sql, string refSql) - { - StringBuilder str1 = new StringBuilder(); - StringBuilder str2 = new StringBuilder(); - foreach (char c in sql) - if (!Char.IsWhiteSpace(c)) - str1.Append(c); - foreach (char c in refSql) - if (!Char.IsWhiteSpace(c)) - str2.Append(c); - Assert.Equal(0, String.Compare(str1.ToString(), str2.ToString(), true)); - } - - private class AssertFailTraceListener : DefaultTraceListener - { - public override void Fail(string message) - { - Assert.True(message == String.Empty, "Failure: " + message); - } - - public override void Fail(string message, string detailMessage) - { - Assert.True(message == String.Empty, "Failure: " + message); - } - } - - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/Ship.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/Ship.cs deleted file mode 100644 index 0e3b84210..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/Ship.cs +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright © 2013, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Data.Entity; - - -namespace MySql.Data.Entity.CodeFirst.Tests -{ - public class Harbor - { - public int HarborId { get; set; } - public virtual ICollection Ships { get; set; } - - public string Description { get; set; } - } - - public class Ship - { - public int ShipId { get; set; } - public int HarborId { get; set; } - public virtual Harbor Harbor { get; set; } - public virtual ICollection CrewMembers { get; set; } - - public string Description { get; set; } - } - - public class CrewMember - { - public int CrewMemberId { get; set; } - public int ShipId { get; set; } - public virtual Ship Ship { get; set; } - public int RankId { get; set; } - public virtual Rank Rank { get; set; } - public int ClearanceId { get; set; } - public virtual Clearance Clearance { get; set; } - - public string Description { get; set; } - } - - public class Rank - { - public int RankId { get; set; } - public virtual ICollection CrewMembers { get; set; } - - public string Description { get; set; } - } - - public class Clearance - { - public int ClearanceId { get; set; } - public virtual ICollection CrewMembers { get; set; } - - public string Description { get; set; } - } - -#if EF6 - [DbConfigurationType(typeof(MySqlEFConfiguration))] -#endif - public class ShipContext : DbContext - { - public DbSet Harbors { get; set; } - public DbSet Ships { get; set; } - public DbSet CrewMembers { get; set; } - public DbSet Ranks { get; set; } - public DbSet Clearances { get; set; } - - public ShipContext() - { - Database.SetInitializer(new DropCreateDatabaseAlways()); - } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SiteDB.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/SiteDB.cs deleted file mode 100644 index d94b28e57..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/SiteDB.cs +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright © 2014, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Data.Entity; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - - -namespace MySql.Data.Entity.CodeFirst.Tests -{ - [Table("pagina")] - public class pagina - { - [Key] - public long nCdPagina { get; set; } - public long nCdVisitante { get; set; } - public string sDsUrlReferencia { get; set; } - public string sDsPalavraChave { get; set; } - public string sDsTitulo { get; set; } - - [ForeignKey("nCdVisitante")] - public visitante visitante { get; set; } - } - - public class retorno - { - //[Key] - public long Key { get; set; } - public int Online { get; set; } - } - - [Table("site")] - public class site - { - [Key] - public long nCdSite { get; set; } - public string sDsTitulo { get; set; } - public string sDsUrl { get; set; } - public DateTime tDtCadastro { get; set; } - } - - [Table("visitante")] - public class visitante - { - [Key] - public long nCdVisitante { get; set; } - public long nCdSite { get; set; } - public string sDsIp { get; set; } - public DateTime tDtCadastro { get; set; } - public DateTime tDtAtualizacao { get; set; } - - [ForeignKey("nCdSite")] - public site site { get; set; } - } - -#if EF6 - [DbConfigurationType(typeof(MySqlEFConfiguration))] -#endif - public class SiteDbContext : DbContext - { - public DbSet Visitante { get; set; } - public DbSet Site { get; set; } - //public DbSet Retorno { get; set; } - public DbSet Pagina { get; set; } - - public SiteDbContext() - { - Database.SetInitializer(new SiteDbInitializer()); -#if EF6 - Database.SetInitializer(new MigrateDatabaseToLatestVersion>()); -#endif - } - } - - public class SiteDbInitializer : DropCreateDatabaseReallyAlways - { - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/TransactionTests.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/TransactionTests.cs deleted file mode 100644 index 631039e06..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/TransactionTests.cs +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright © 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySql.Data.MySqlClient; -using System; -using System.Collections.Generic; -using System.Data.Entity.Infrastructure; -using System.Data.Entity.Validation; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Xunit; - -namespace MySql.Data.Entity.CodeFirst.Tests -{ - public class TransactionTests - { - [Fact] - public void DisposeNestedTransactions() - { - using (SakilaDb context = new SakilaDb()) - { - using (var trans = context.Database.BeginTransaction()) - { - Assert.Throws(() => context.Database.ExecuteSqlCommand("update abc")); - } - } - - // new second transaction - using (SakilaDb context = new SakilaDb()) - { - using (var trans = context.Database.BeginTransaction()) - { - Assert.Throws(() => context.Database.ExecuteSqlCommand("update abc")); - } - } - } - - [Fact] - public void NestedTransactionsUniqueKey() - { - using (SakilaDb context = new SakilaDb()) - { - var store = new store - { - manager_staff_id = 1 - }; - context.stores.Add(store); - for (int i = 0; i < 10; i++) - { - Assert.Throws(() => context.SaveChanges()); - } - } - } - } -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/Vehicle.cs b/Tests/MySql.EntityFramework6.CodeFirst.Tests/Vehicle.cs deleted file mode 100644 index f5b6785d1..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/Vehicle.cs +++ /dev/null @@ -1,351 +0,0 @@ -// Copyright © 2014, 2015 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Data.Entity; -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; - - -namespace MySql.Data.Entity.CodeFirst.Tests -{ - - [DbConfigurationType(typeof(MySqlEFConfiguration))] - public class VehicleDbContext : DbContext - { - public DbSet Vehicles { get; set; } - public DbSet Manufacturers { get; set; } - public DbSet Distributors { get; set; } - - public VehicleDbContext() - { - Database.SetInitializer( new VehicleDBInitializer() ); - } - - protected override void OnModelCreating(DbModelBuilder modelBuilder) - { - //modelBuilder.Entity() - // .Map(o => o.ToTable("Cars")) - // .Map(o => o.ToTable("Bikes")); - modelBuilder.Entity().ToTable("Cars"); - modelBuilder.Entity().ToTable("Bikes"); - } - } - - public class VehicleDBInitializer : DropCreateDatabaseReallyAlways - { - } - -#if EF6 - [DbConfigurationType(typeof(MySqlEFConfiguration))] -#endif - public class VehicleDbContext2 : DbContext - { - public DbSet Vehicles { get; set; } - - public VehicleDbContext2() - { - Database.SetInitializer( new VehicleDBInitializer2() ); - } - } - - public class VehicleDBInitializer2 : DropCreateDatabaseReallyAlways - { - } - - /// - /// This initializer really drops the database, not just once per AppDomain (like the DropCreateDatabaseAlways). - /// - /// - public class DropCreateDatabaseReallyAlways : IDatabaseInitializer where TContext : DbContext - { - public void InitializeDatabase(TContext context) - { - context.Database.Delete(); - context.Database.CreateIfNotExists(); - this.Seed(context); - context.SaveChanges(); - } - - protected virtual void Seed(TContext context) - { - } - } - - public class Vehicle - { - public int Id { get; set; } - public int Year { get; set; } - - [MaxLength(1024)] - public string Name { get; set; } - } - -#if EF6 - [DbConfigurationType(typeof(MySqlEFConfiguration))] -#endif - public class VehicleDbContext3 : DbContext - { - public DbSet Accessories { get; set; } - - } - - public class Accessory - { - [Key] - [MaxLength(255)] - public string Name { get; set; } - - [Required] - [MaxLength(80000)] - public string Description { get; set; } - - [Required] - [MaxLength(16777216)] - public string LongDescription { get; set; } - - } - - public class Car : Vehicle - { - public string CarProperty { get; set; } - } - - public class Bike : Vehicle - { - public string BikeProperty { get; set; } - } - public class Vehicle2 - { - public int Id { get; set; } - public int Year { get; set; } - [MaxLength(1024)] - public string Name { get; set; } - } - - public class Car2 : Vehicle2 - { - public string CarProperty { get; set; } - } - - public class Bike2 : Vehicle2 - { - public string BikeProperty { get; set; } - } - - public class Manufacturer - { - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public Guid ManufacturerId { get; set; } - public string Name { get; set; } - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public Guid GroupIdentifier { get; set; } - } - - public class Distributor - { - public int DistributorId { get; set; } - public string Name { get; set; } - } - - - public class Product - { - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public int Id { get; set; } - - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public DateTime DateCreated { get; set; } - - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - [Column(TypeName = "timestamp")] - public DateTime Timestamp { get; set; } - - public DateTime DateTimeWithPrecision { get; set; } - - [Column(TypeName = "TimeStamp")] - public DateTime TimeStampWithPrecision { get; set; } - - } - -#if EF6 - [DbConfigurationType(typeof(MySqlEFConfiguration))] -#endif - public class ProductsDbContext : DbContext - { - public DbSet Products { get; set; } - - protected override void OnModelCreating(DbModelBuilder modelBuilder) - { - base.OnModelCreating(modelBuilder); - - Database.SetInitializer(new ProductDBInitializer()); - - modelBuilder.Entity() - .Property(f => f.DateTimeWithPrecision) - .HasColumnType("DateTime") - .HasPrecision(3); - - modelBuilder.Entity() - .Property(f => f.TimeStampWithPrecision) - .HasColumnType("Timestamp") - .HasPrecision(3); - -#if EF6 - Database.SetInitializer(new MigrateDatabaseToLatestVersion>()); -#endif - } - } - - public class ProductDBInitializer : DropCreateDatabaseReallyAlways - { - } - - public class Names - { - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public int Id { get; set; } - - public DateTime DateCreated { get; set; } - } - -#if EF6 - [DbConfigurationType(typeof(MySqlEFConfiguration))] -#endif - public class ShortDbContext : DbContext - { - public DbSet Names { get; set; } - - protected override void OnModelCreating(DbModelBuilder modelBuilder) - { - modelBuilder.Entity() - .Property(f => f.DateCreated) - .HasColumnType("DateTime") - .HasPrecision(9); - } - } - -#if EF6 - [DbConfigurationType(typeof(MySqlEFConfiguration))] -#endif - public class AutoIncrementBugContext : DbContext - { - public DbSet AutoIncrementBug { get; set; } - - public AutoIncrementBugContext() - { - Database.SetInitializer(new AutoIncrementBugInitialize()); - Database.SetInitializer(new MigrateDatabaseToLatestVersion>()); - } - - protected override void OnModelCreating(DbModelBuilder modelBuilder) - { - base.OnModelCreating(modelBuilder); - } - } - - public class AutoIncrementBugInitialize : IDatabaseInitializer where TContext : DbContext - { - public void InitializeDatabase(TContext context) - { - context.Database.Delete(); - context.Database.CreateIfNotExists(); - this.Seed(context); - context.SaveChanges(); - } - - protected virtual void Seed(TContext context) - { - } - } - - public class AutoIncrementBug - { - [Key] - public short MyKey { get; set; } - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public long AutoIncrementBugId { get; set; } - public string Description { get; set; } - } - - public class AutoIncrementConfiguration : System.Data.Entity.Migrations.DbMigrationsConfiguration where TContext : DbContext - { - public AutoIncrementConfiguration() - { - AutomaticMigrationsEnabled = true; - //CodeGenerator = new MySqlMigrationCodeGenerator(); - SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator()); - } - } - - - [Table("client")] - public class Client - { - [Key] - public int Id { get; set; } - public ICollection Orders { get; set; } - } - - [Table("order")] - public class Order - { - [Key] - public int Id { get; set; } - public ICollection Items { get; set; } - public ICollection Discounts { get; set; } - } - - [Table("item")] - public class Item - { - [Key] - public int Id { get; set; } - } - - [Table("discount")] - public class Discount - { - [Key] - public int Id { get; set; } - } - - -#if EF6 - [DbConfigurationType(typeof(MySqlEFConfiguration))] -#endif - public class UsingUnionContext : DbContext - { - public DbSet Clients { get; set; } - public DbSet Items { get; set; } - - public DbSet Orders { get; set; } - - public DbSet Discounts { get; set; } - } - - - -} diff --git a/Tests/MySql.EntityFramework6.CodeFirst.Tests/project.json b/Tests/MySql.EntityFramework6.CodeFirst.Tests/project.json deleted file mode 100644 index b0df626fd..000000000 --- a/Tests/MySql.EntityFramework6.CodeFirst.Tests/project.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "version": "7.0.7-m6", - "description": "MySql.Data.EF6.CodeFirst.Tests", - "authors": [ - "Oracle" - ], - "copyright": "Copyright © 2016, 2017, Oracle and/or its affiliates. All rights reserved.", - "language": "en-US", - "packOptions": { - "projectUrl": "http://dev.mysql.com/downloads/", - "licenseUrl": "http://www.gnu.org/licenses/old-licenses/gpl-2.0.html", - "iconUrl": "http://www.mysql.com/common/logos/logo-mysql-170x115.png", - "tags": [ - "MySql", - ".NET Connector", - "MySql Connector/NET" - ], - "requireLicenseAcceptance": true - }, - "dependencies": { - "EntityFramework": "6.1.3", - "xunit": "1.9.2", - "MySql.Data": { - "target": "project" - }, - "MySql.Data.Entity.EF6": { - "target": "project" - }, - "MySql.EntityFramework6.Basic.Tests": { - "target": "project" - } - }, - "frameworks": { - "net451": { - "buildOptions": { - "define": [ "EF6" ] - }, - "keyFile": "../../ConnectorNetPublicKey.snk", - "delaySign": true, - "publicSign": false, - "frameworkAssemblies": { - "System.Data": "", - "System.ComponentModel.DataAnnotations": "", - "System.Core": "", - "System.Data.DataSetExtensions": "", - "System.Security": "", - "System.Xml": "", - "System.Runtime": { - "type": "build" - } - } - } - }, - "configurations": { - "Debug": { - "buildOptions": { - "define": [ "DEBUG" ], - "optimize": false, - "preserveCompilationContext": true - } - }, - "Release": { - "buildOptions": { - "define": [ "RELEASE" ], - "optimize": true, - "preserveCompilationContext": true, - "xmlDoc": true - } - } - } -} \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Migrations.Tests/App.config b/Tests/MySql.EntityFramework6.Migrations.Tests/App.config deleted file mode 100644 index bd5245a65..000000000 --- a/Tests/MySql.EntityFramework6.Migrations.Tests/App.config +++ /dev/null @@ -1,14 +0,0 @@ - - - -
- - - - - - - - - - \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Migrations.Tests/BlogsModel.cs b/Tests/MySql.EntityFramework6.Migrations.Tests/BlogsModel.cs deleted file mode 100644 index cbdb27b96..000000000 --- a/Tests/MySql.EntityFramework6.Migrations.Tests/BlogsModel.cs +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Data.Entity; -using System.ComponentModel.DataAnnotations; - -namespace MySql.Data.Entity.Migrations.Tests -{ - public class BlogContext : DbContext - { - public BlogContext() : base("BlogsContext") { } - - public DbSet Blog { get; set; } - - } - - public class Blog - { - [Key] - public int BlogId { get; set; } - public string Title { get; set; } - } -} diff --git a/Tests/MySql.EntityFramework6.Migrations.Tests/MyConfiguration.cs b/Tests/MySql.EntityFramework6.Migrations.Tests/MyConfiguration.cs deleted file mode 100644 index d1c7fa571..000000000 --- a/Tests/MySql.EntityFramework6.Migrations.Tests/MyConfiguration.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using MySql.Data.Entity; - -namespace MySql.Data.Entity.Migrations.Tests -{ - public class MyConfiguration : MySqlEFConfiguration - { - public MyConfiguration() - : base() - { - } - } -} diff --git a/Tests/MySql.EntityFramework6.Migrations.Tests/MySql.EntityFramework6.Migrations.Tests.xproj b/Tests/MySql.EntityFramework6.Migrations.Tests/MySql.EntityFramework6.Migrations.Tests.xproj deleted file mode 100644 index ab878b2b8..000000000 --- a/Tests/MySql.EntityFramework6.Migrations.Tests/MySql.EntityFramework6.Migrations.Tests.xproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - 14.0.25420 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - f3ae9f45-d8cc-47bb-bf30-f11eb24ead16 - MySql.EntityFramework6.Migrations.Tests - .\obj - .\bin\ - - - - 2.0 - - - \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Migrations.Tests/MySqlMigrationsTests.cs b/Tests/MySql.EntityFramework6.Migrations.Tests/MySqlMigrationsTests.cs deleted file mode 100644 index 5fdd07c87..000000000 --- a/Tests/MySql.EntityFramework6.Migrations.Tests/MySqlMigrationsTests.cs +++ /dev/null @@ -1,453 +0,0 @@ -// Copyright © 2013, 2015 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Data.Entity; -using System.Data.Entity.Infrastructure; -using System.Data.Entity.Migrations.Model; -using System.Data.Entity.Migrations.Sql; -using System.Diagnostics; -using System.Globalization; -using System.Linq; -using System.Text; -using Xunit; -using MySql.Data.Entity; -using MySql.Data.MySqlClient; -#if EF6 -using System.Data.Entity.Core.EntityClient; -using System.Data.Entity.Core.Metadata.Edm; -#else -using System.Data.EntityClient; -using System.Data.Metadata.Edm; -#endif - -namespace MySql.Data.Entity.Migrations.Tests -{ - public class MySqlMigrationsTests : IUseFixture - { - private MySqlProviderManifest ProviderManifest; - - private SetUpMigrationsTests st; - - public void SetFixture(SetUpMigrationsTests data) - { - st = data; -#if EF6 - Database.SetInitializer(new MigrateDatabaseToLatestVersion()); -#endif - } - - private MySqlConnection GetConnectionFromContext(DbContext ctx) - { - return (MySqlConnection)((EntityConnection)(((IObjectContextAdapter)ctx).ObjectContext.Connection)).StoreConnection; - } - - /// - /// Add int32 type column to existing table - /// - [Fact] - public void AddColumnOperationMigration() - { - var migrationOperations = new List(); - - if (ProviderManifest == null) - ProviderManifest = new MySqlProviderManifest(st.Version.ToString()); - - TypeUsage tu = TypeUsage.CreateDefaultTypeUsage(PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.Int32)); - TypeUsage result = ProviderManifest.GetStoreType(tu); - - var intColumn = new ColumnModel(PrimitiveTypeKind.Int32, result) - { - Name = "TotalPosts", - IsNullable = false - }; - - var addColumnMigratioOperation = new AddColumnOperation("Blogs", intColumn); - migrationOperations.Add(addColumnMigratioOperation); - - using (BlogContext context = new BlogContext()) - { - if (context.Database.Exists()) context.Database.Delete(); - context.Database.Create(); - - using (MySqlConnection conn = new MySqlConnection(context.Database.Connection.ConnectionString)) - { - if (conn.State == System.Data.ConnectionState.Closed) conn.Open(); - Assert.Equal(true, GenerateAndExecuteMySQLStatements(migrationOperations)); - - MySqlCommand query = new MySqlCommand("Select Column_name, Is_Nullable, Data_Type from information_schema.Columns where table_schema ='" + conn.Database + "' and table_name = 'Blogs' and column_name ='TotalPosts'" , conn); - MySqlDataReader reader = query.ExecuteReader(); - while (reader.Read()) - { - Assert.Equal("TotalPosts", reader[0].ToString()); - Assert.Equal("NO", reader[1].ToString()); - Assert.Equal("int", reader[2].ToString()); - } - reader.Close(); - conn.Close(); - } - } - } - - /// - /// CreateTable operation - /// with the following columns int PostId string Title string Body - /// - [Fact] - public void CreateTableOperationMigration() - { - - var migrationOperations = new List(); - var createTableOperation = CreateTableOperation(); - - migrationOperations.Add(createTableOperation); - - using (BlogContext context = new BlogContext()) - { - if (context.Database.Exists()) context.Database.Delete(); - context.Database.Create(); - - using (var conn = new MySqlConnection(context.Database.Connection.ConnectionString)) - { - if (conn.State == System.Data.ConnectionState.Closed) conn.Open(); - Assert.Equal(true, GenerateAndExecuteMySQLStatements(migrationOperations)); - MySqlCommand query = new MySqlCommand("Select Column_name from information_schema.Columns where table_schema ='" + conn.Database + "' and table_name = 'Posts'", conn); - MySqlDataReader reader = query.ExecuteReader(); - while (reader.Read()) - { - Assert.Equal(1, createTableOperation.Columns.Where(t => t.Name.Equals(reader[0].ToString())).Count()); - } - reader.Close(); - conn.Close(); - } - } - } - - /// - /// CreateForeignKey operation - /// between Blogs and Posts table - /// - [Fact] - public void CreateForeignKeyOperation() - { - var migrationOperations = new List(); - - // create dependant table Posts - var createTableOperation = CreateTableOperation(); - migrationOperations.Add(createTableOperation); - - // Add column BlogId to create the constraints - - if (ProviderManifest == null) - ProviderManifest = new MySqlProviderManifest(st.Version.ToString()); - - TypeUsage tu = TypeUsage.CreateDefaultTypeUsage(PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.Int32)); - TypeUsage result = ProviderManifest.GetStoreType(tu); - - var intColumn = new ColumnModel(PrimitiveTypeKind.Int32, result) - { - Name = "BlogId", - IsNullable = false - }; - - var addColumnMigratioOperation = new AddColumnOperation("Posts", intColumn); - migrationOperations.Add(addColumnMigratioOperation); - - // create constrain object - var createForeignkeyOperation = new AddForeignKeyOperation(); - - createForeignkeyOperation.Name = "FKBlogs"; - createForeignkeyOperation.DependentTable = "Posts"; - createForeignkeyOperation.DependentColumns.Add("BlogId"); - createForeignkeyOperation.CascadeDelete = true; - createForeignkeyOperation.PrincipalTable = "Blogs"; - createForeignkeyOperation.PrincipalColumns.Add("BlogId"); - - //create index to use - migrationOperations.Add(createForeignkeyOperation.CreateCreateIndexOperation()); - - migrationOperations.Add(createForeignkeyOperation); - - - using (BlogContext context = new BlogContext()) - { - - if (context.Database.Exists()) context.Database.Delete(); - context.Database.Create(); - - Assert.Equal(true, GenerateAndExecuteMySQLStatements(migrationOperations)); - - using (var conn = new MySqlConnection(context.Database.Connection.ConnectionString)) - { - if (conn.State == System.Data.ConnectionState.Closed) conn.Open(); - // check for foreign key creation - MySqlCommand query = new MySqlCommand("select Count(*) from information_schema.table_constraints where constraint_type = 'foreign key' and constraint_schema = '" + conn.Database + "' and constraint_name = 'FKBlogs'", conn); - int rows = Convert.ToInt32(query.ExecuteScalar()); - Assert.Equal(1, rows); - // check for table creation - query = new MySqlCommand("select Count(*) from information_schema.Tables WHERE `table_name` = 'Posts' and `table_schema` = '" + conn.Database + "' ", conn); - rows = Convert.ToInt32(query.ExecuteScalar()); - Assert.Equal(1, rows); - conn.Close(); - } - - // Test fix for - MySqlConnection con = GetConnectionFromContext(context); - con.Open(); - try - { - MySqlCommand cmd = new MySqlCommand("show create table `posts`", con); - using (MySqlDataReader r = cmd.ExecuteReader()) - { - r.Read(); - string sql = r.GetString(1); - Assert.True(sql.IndexOf( - " CONSTRAINT `FKBlogs` FOREIGN KEY (`BlogId`) REFERENCES `blogs` (`BlogId`) ON DELETE CASCADE ON UPDATE CASCADE", - StringComparison.OrdinalIgnoreCase) != -1); - } - } - finally - { - con.Close(); - } - } - } - - - /// - /// Remove PK and the autoincrement property for the column - /// - - [Fact] - public void DropPrimaryKeyOperationWithAnonymousArguments() - { - - var migrationOperations = new List(); - - // create table where the PK exists - var createTableOperation = CreateTableOperation(); - migrationOperations.Add(createTableOperation); - - var createDropPKOperation = new DropPrimaryKeyOperation(anonymousArguments: new { DeleteAutoIncrement = true }); - createDropPKOperation.Table = "Posts"; - createDropPKOperation.Columns.Add("PostId"); - migrationOperations.Add(createDropPKOperation); - - using (BlogContext context = new BlogContext()) - { - if (context.Database.Exists()) context.Database.Delete(); - context.Database.Create(); - - - Assert.Equal(true, GenerateAndExecuteMySQLStatements(migrationOperations)); - - using (var conn = new MySqlConnection(context.Database.Connection.ConnectionString)) - { - if (conn.State == System.Data.ConnectionState.Closed) conn.Open(); - - // check for table creation - var query = new MySqlCommand("select Count(*) from information_schema.Tables WHERE `table_name` = 'Posts' and `table_schema` = '" + conn.Database + "' ", conn); - int rows = Convert.ToInt32(query.ExecuteScalar()); - Assert.Equal(1, rows); - - // check if PK exists - query = new MySqlCommand("select Count(*) from information_schema.table_constraints where `constraint_type` = 'primary key' and `constraint_schema` = '" + conn.Database + "' and table_name= 'Posts'", conn); - rows = Convert.ToInt32(query.ExecuteScalar()); - Assert.Equal(0, rows); - - //check the definition of the column that was PK - query = new MySqlCommand("Select Column_name, Is_Nullable, Data_Type from information_schema.Columns where table_schema ='" + conn.Database + "' and table_name = 'Posts' and column_name ='PostId'", conn); - MySqlDataReader reader = query.ExecuteReader(); - while (reader.Read()) - { - Assert.Equal("PostId", reader[0].ToString()); - Assert.Equal("NO", reader[1].ToString()); - Assert.Equal("int", reader[2].ToString()); - } - reader.Close(); - conn.Close(); - } - } - } - - - /// - /// Drop primary key. No anonymous arguments - /// - [Fact] - public void DropPrimaryKeyOperation() - { - - var migrationOperations = new List(); - - // create table where the PK exists - var createTableOperation = CreateTableOperation(); - migrationOperations.Add(createTableOperation); - - var createDropPKOperation = new DropPrimaryKeyOperation(anonymousArguments: new { DeleteAutoIncrement = true }); - createDropPKOperation.Table = "Posts"; - createDropPKOperation.Columns.Add("PostId"); - migrationOperations.Add(createDropPKOperation); - - using (BlogContext context = new BlogContext()) - { - if (context.Database.Exists()) context.Database.Delete(); - context.Database.Create(); - - - Assert.Equal(true, GenerateAndExecuteMySQLStatements(migrationOperations)); - - using (var conn = new MySqlConnection(context.Database.Connection.ConnectionString)) - { - if (conn.State == System.Data.ConnectionState.Closed) conn.Open(); - - // check for table creation - var query = new MySqlCommand("select Count(*) from information_schema.Tables WHERE `table_name` = 'Posts' and `table_schema` = '" + conn.Database + "' ", conn); - int rows = Convert.ToInt32(query.ExecuteScalar()); - Assert.Equal(1, rows); - - // check if PK exists - query = new MySqlCommand("select Count(*) from information_schema.table_constraints where `constraint_type` = 'primary key' and `constraint_schema` = '" + conn.Database + "' and table_name= 'Posts'", conn); - rows = Convert.ToInt32(query.ExecuteScalar()); - Assert.Equal(0, rows); - - //check the definition of the column that was PK - query = new MySqlCommand("Select Column_name, Is_Nullable, Data_Type from information_schema.Columns where table_schema ='" + conn.Database + "' and table_name = 'Posts' and column_name ='PostId'", conn); - MySqlDataReader reader = query.ExecuteReader(); - while (reader.Read()) - { - Assert.Equal("PostId", reader[0].ToString()); - Assert.Equal("NO", reader[1].ToString()); - Assert.Equal("int", reader[2].ToString()); - } - reader.Close(); - conn.Close(); - } - } - - - } - - - - /// - /// Creates a table named Posts - /// and columns int PostId, string Title, string Body - /// - /// - - private CreateTableOperation CreateTableOperation() - { - TypeUsage tu; - TypeUsage result; - - if (ProviderManifest == null) - ProviderManifest = new MySqlProviderManifest(st.Version.ToString()); - - var createTableOperation = new CreateTableOperation("Posts"); - - //Column model for int IdPost - tu = TypeUsage.CreateDefaultTypeUsage(PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.Int32)); - result = ProviderManifest.GetStoreType(tu); - - var intColumn = new ColumnModel(PrimitiveTypeKind.Int32, result) - { - Name = "PostId", - IsNullable = false, - IsIdentity = true - }; - - createTableOperation.Columns.Add(intColumn); - - //Column model for string - tu = TypeUsage.CreateDefaultTypeUsage(PrimitiveType.GetEdmPrimitiveType(PrimitiveTypeKind.String)); - result = ProviderManifest.GetStoreType(tu); - - var stringColumnTitle = new ColumnModel(PrimitiveTypeKind.String, result) - { - Name = "Title", - IsNullable = false - }; - - var stringColumnBody = new ColumnModel(PrimitiveTypeKind.String, result) - { - Name = "Body", - IsNullable = true - }; - - createTableOperation.Columns.Add(stringColumnTitle); - createTableOperation.Columns.Add(stringColumnBody); - var primaryKey = new AddPrimaryKeyOperation(); - - primaryKey.Columns.Add("PostId"); - - createTableOperation.PrimaryKey = primaryKey; - - return createTableOperation; - - } - - - /// - /// Generate and apply sql statemens from the - /// migration operations list - /// return false is case of fail or if database doesn't exist - /// - private bool GenerateAndExecuteMySQLStatements(List migrationOperations) - { - MySqlProviderServices ProviderServices; - - ProviderServices = new MySqlProviderServices(); - - using (BlogContext context = new BlogContext()) - { - if (!context.Database.Exists()) return false; - - using (MySqlConnection conn = new MySqlConnection(context.Database.Connection.ConnectionString)) - { - var migratorGenerator = new MySqlMigrationSqlGenerator(); - var Token = ProviderServices.GetProviderManifestToken(conn); - var sqlStmts = migratorGenerator.Generate(migrationOperations, providerManifestToken: Token); - if (conn.State == System.Data.ConnectionState.Closed) conn.Open(); - foreach (MigrationStatement stmt in sqlStmts) - { - try - { - MySqlCommand cmd = new MySqlCommand(stmt.Sql, conn); - cmd.ExecuteNonQuery(); - } - catch (Exception) - { - return false; - } - } - } - } - return true; - } - } -} - - - - \ No newline at end of file diff --git a/Tests/MySql.EntityFramework6.Migrations.Tests/Properties/AssemblyInfo.cs b/Tests/MySql.EntityFramework6.Migrations.Tests/Properties/AssemblyInfo.cs deleted file mode 100644 index f863e12f2..000000000 --- a/Tests/MySql.EntityFramework6.Migrations.Tests/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright © 2013, 2015 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Reflection; -using System.Runtime.CompilerServices; -using 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. -[assembly: AssemblyTitle("MySql.Data.Entity.Migrations.Tests")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Oracle")] -[assembly: AssemblyProduct("MySql.Data.Entity.Migrations.Tests")] -[assembly: AssemblyCopyright("Copyright © 2013, 2015, Oracle and/or its affiliates. All rights reserved.")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("13e45075-7292-42a8-a5a5-41a014ab2224")] - -// 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: -// [assembly: AssemblyVersion("1.0.*")] - -[assembly: AssemblyDelaySign(true)] -[assembly: AssemblyKeyFileAttribute(@"..\..\ConnectorNetPublicKey.snk")] diff --git a/Tests/MySql.EntityFramework6.Migrations.Tests/SetUpMigrationsTests.cs b/Tests/MySql.EntityFramework6.Migrations.Tests/SetUpMigrationsTests.cs deleted file mode 100644 index 78b5ea2b1..000000000 --- a/Tests/MySql.EntityFramework6.Migrations.Tests/SetUpMigrationsTests.cs +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright © 2013, 2015 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySql.Data.Entity.Tests; -using System; -using System.Configuration; -using System.Data; -using System.Data.Entity.Migrations; - - -namespace MySql.Data.Entity.Migrations.Tests -{ - public class SetUpMigrationsTests : SetUpClass, IDisposable - { - - private Configuration configuration; - public DbMigrator Migrator; - - public SetUpMigrationsTests():base() - { - configuration = new Configuration(); - DataSet dataSet = ConfigurationManager.GetSection("system.data") as System.Data.DataSet; - DataView vi = dataSet.Tables[0].DefaultView; - vi.Sort = "Name"; - int idx = -1; - if (((idx = vi.Find("MySql")) != -1) || ((idx = vi.Find("MySQL Data Provider")) != -1)) - { - DataRow row = vi[idx].Row; - dataSet.Tables[0].Rows.Remove(row); - } - dataSet.Tables[0].Rows.Add("MySql" - , "MySql.Data.MySqlClient" - , "MySql.Data.MySqlClient" - , - typeof(MySql.Data.MySqlClient.MySqlClientFactory).AssemblyQualifiedName); - Migrator = new DbMigrator(configuration); - } - - public override void Dispose() - { - base.Dispose(); - - using (BlogContext context = new BlogContext()) - { - if (context.Database.Exists()) - { - context.Database.Delete(); - } - } - } - } - - internal sealed class Configuration : DbMigrationsConfiguration - { - public Configuration() - { - CodeGenerator = new MySqlMigrationCodeGenerator(); - AutomaticMigrationsEnabled = false; - SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator()); - } - - protected override void Seed(BlogContext context) - { - } - } - - - internal sealed class EF6Configuration : DbMigrationsConfiguration - { - public EF6Configuration() - { - CodeGenerator = new MySqlMigrationCodeGenerator(); - AutomaticMigrationsEnabled = true; - SetSqlGenerator("MySql.Data.MySqlClient", new MySql.Data.Entity.MySqlMigrationSqlGenerator()); - } - - protected override void Seed(BlogContext context) - { - } - } - -} diff --git a/Tests/MySql.EntityFramework6.Migrations.Tests/project.json b/Tests/MySql.EntityFramework6.Migrations.Tests/project.json deleted file mode 100644 index d78317c9d..000000000 --- a/Tests/MySql.EntityFramework6.Migrations.Tests/project.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "version": "7.0.7-m6", - "description": "MySql.Data.EF6.Migrations.Tests", - "authors": [ - "Oracle" - ], - "copyright": "Copyright © 2016, 2017, Oracle and/or its affiliates. All rights reserved.", - "language": "en-US", - "packOptions": { - "projectUrl": "http://dev.mysql.com/downloads/", - "licenseUrl": "http://www.gnu.org/licenses/old-licenses/gpl-2.0.html", - "iconUrl": "http://www.mysql.com/common/logos/logo-mysql-170x115.png", - "tags": [ - "MySql", - ".NET Connector", - "MySql Connector/NET" - ], - "requireLicenseAcceptance": true - }, - "dependencies": { - "EntityFramework": "6.1.3", - "xunit": "1.9.2", - "MySql.Data": { - "target": "project" - }, - "MySql.Data.Entity.EF6": { - "target": "project" - }, - "MySql.EntityFramework6.Basic.Tests": { - "target": "project" - } - }, - "frameworks": { - "net451": { - "buildOptions": { - "define": [ "EF6" ] - }, - "keyFile": "../../ConnectorNetPublicKey.snk", - "delaySign": true, - "publicSign": false, - "frameworkAssemblies": { - "System.Data": "", - "System.ComponentModel.DataAnnotations": "", - "System.Core": "", - "System.Data.DataSetExtensions": "", - "System.Security": "", - "System.Xml": "", - "System.Runtime": { - "type": "build" - } - } - } - } -} \ No newline at end of file diff --git a/Tests/MySql.EntityFrameworkCore.Basic.Tests/.vscode/launch.json b/Tests/MySql.EntityFrameworkCore.Basic.Tests/.vscode/launch.json deleted file mode 100644 index 2a54b49e2..000000000 --- a/Tests/MySql.EntityFrameworkCore.Basic.Tests/.vscode/launch.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "name": ".NET Core Launch (console)", - "type": "coreclr", - "request": "launch", - "preLaunchTask": "build", - "program": "${workspaceRoot}/bin/Debug//", - "args": [], - "cwd": "${workspaceRoot}", - "externalConsole": false, - "stopAtEntry": false - }, - { - "name": ".NET Core Attach", - "type": "coreclr", - "request": "attach", - "processId": 0 - } - ] -} \ No newline at end of file diff --git a/Tests/MySql.EntityFrameworkCore.Basic.Tests/.vscode/tasks.json b/Tests/MySql.EntityFrameworkCore.Basic.Tests/.vscode/tasks.json deleted file mode 100644 index 67d6eb75c..000000000 --- a/Tests/MySql.EntityFrameworkCore.Basic.Tests/.vscode/tasks.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "version": "0.1.0", - "command": "dotnet", - "isShellCommand": true, - "args": [], - "tasks": [ - { - "taskName": "build", - "args": [], - "isBuildCommand": true, - "problemMatcher": "$msCompile" - } - ] -} \ No newline at end of file diff --git a/Tests/MySql.EntityFrameworkCore.Basic.Tests/App.Config b/Tests/MySql.EntityFrameworkCore.Basic.Tests/App.Config deleted file mode 100644 index 1162fb2de..000000000 --- a/Tests/MySql.EntityFrameworkCore.Basic.Tests/App.Config +++ /dev/null @@ -1,38 +0,0 @@ - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Tests/MySql.EntityFrameworkCore.Basic.Tests/ConcurrencyTests.cs b/Tests/MySql.EntityFrameworkCore.Basic.Tests/ConcurrencyTests.cs deleted file mode 100644 index 46c417f73..000000000 --- a/Tests/MySql.EntityFrameworkCore.Basic.Tests/ConcurrencyTests.cs +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright © 2016, 2017, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.DependencyInjection; -using MySql.Data.EntityFrameworkCore.Tests.DbContextClasses; -using MySQL.Data.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Xunit; - -namespace MySql.Data.EntityFrameworkCore.Tests -{ - public class ConcurrencyTests - { - - [Fact] - public void CanHandleConcurrencyConflicts() - { - var serviceCollection = new ServiceCollection(); - serviceCollection.AddEntityFrameworkMySQL() - .AddDbContext(); - - var serviceProvider = serviceCollection.BuildServiceProvider(); - - using (var context = serviceProvider.GetRequiredService()) - { - context.Database.EnsureDeleted(); - context.Database.EnsureCreated(); - - context.People.Add(new Person { Name = "Mike Redman", SocialSecurityNumber = "SSS1229932", PhoneNumber = "565665656" }); - context.SaveChanges(); - - var person = context.People.Single(p => p.PersonId == 1); - person.SocialSecurityNumber = "SS15555"; - - context.Database.ExecuteSqlCommand("UPDATE People SET Name = 'Jane' WHERE PersonId = 1"); - - try - { - context.SaveChanges(); - } - catch (DbUpdateConcurrencyException ex) - { - foreach (var entry in ex.Entries) - { - if (entry.Entity is Person) - { - // Using a NoTracking query means we get the entity but it is not tracked by the context - // and will not be merged with existing entities in the context. - var databaseEntity = context.People.AsNoTracking().Single(p => p.PersonId == ((Person)entry.Entity).PersonId); - var databaseEntry = context.Entry(databaseEntity); - - foreach (var property in entry.Metadata.GetProperties()) - { - if (property.Name.Equals("Name")) - { - var proposedValue = entry.Property(property.Name).CurrentValue; - var originalValue = entry.Property(property.Name).OriginalValue; - var databaseValue = databaseEntry.Property(property.Name).CurrentValue; - entry.Property(property.Name).OriginalValue = databaseEntry.Property(property.Name).CurrentValue; - Assert.Equal(databaseValue, "Jane"); - } - } - } - else - { - throw new NotSupportedException("Don't know how to handle concurrency conflicts for " + entry.Metadata.Name); - } - } - - // Retry the save operation - context.SaveChanges(); - } - finally - { - context.Database.EnsureDeleted(); - } - } - } - } -} diff --git a/Tests/MySql.EntityFrameworkCore.Basic.Tests/ConnectionTests.cs b/Tests/MySql.EntityFrameworkCore.Basic.Tests/ConnectionTests.cs deleted file mode 100644 index 0a18a6d9d..000000000 --- a/Tests/MySql.EntityFrameworkCore.Basic.Tests/ConnectionTests.cs +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.Extensions.Logging; -using MySql.Data.MySqlClient; -using MySQL.Data.EntityFrameworkCore; -using MySQL.Data.EntityFrameworkCore.Extensions; -using Xunit; - -namespace MySql.Data.EntityFrameworkCore.Tests -{ - public class ConnectionTests - { - [Fact] - public void CanCreateConnectionString() - { - using (var connection = new MySQLServerConnection(CreateOptions(), new Logger(new LoggerFactory()))) - { - Assert.IsType(connection.DbConnection); - } - } - - [Fact] - public void CanCreateMainConnection() - { - using (var connection = new MySQLServerConnection(CreateOptions(), new Logger(new LoggerFactory()))) - { - using (var master = connection.CreateSystemConnection()) - { - var csb = new MySqlConnectionStringBuilder(master.ConnectionString); - var csb1 = new MySqlConnectionStringBuilder(MySQLTestStore.baseConnectionString + "database=mysql"); - Assert.True(csb.Database == csb1.Database); - Assert.True(csb.Port == csb1.Port); - Assert.True(csb.Server == csb1.Server); - Assert.True(csb.UserID == csb1.UserID); - } - } - } - - public static IDbContextOptions CreateOptions() - { - var optionsBuilder = new DbContextOptionsBuilder(); - optionsBuilder.UseMySQL(MySQLTestStore.baseConnectionString + "database=test;"); - return optionsBuilder.Options; - } - - } -} diff --git a/Tests/MySql.EntityFrameworkCore.Basic.Tests/DbContextClasses/ConventionsContexts.cs b/Tests/MySql.EntityFrameworkCore.Basic.Tests/DbContextClasses/ConventionsContexts.cs deleted file mode 100644 index 791988c4e..000000000 --- a/Tests/MySql.EntityFrameworkCore.Basic.Tests/DbContextClasses/ConventionsContexts.cs +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore; -using MySQL.Data.EntityFrameworkCore.Extensions; - - -namespace MySql.Data.EntityFrameworkCore.Tests.DbContextClasses -{ - public class SimpleContextWithIgnore : MyTestContext - { - - public DbSet Blogs { get; set; } - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - - modelBuilder.Entity() - .HasOne(p => p.RecentPost) - .WithOne(i => i.Blog) - .HasForeignKey(b => b.PostId); - - - modelBuilder.Ignore(); // ignoring entity type - modelBuilder.Entity() // ignoring property - .Ignore(b => b.Url); - - } - } -} diff --git a/Tests/MySql.EntityFrameworkCore.Basic.Tests/DbContextClasses/EFFluentAPIContexts.cs b/Tests/MySql.EntityFrameworkCore.Basic.Tests/DbContextClasses/EFFluentAPIContexts.cs deleted file mode 100644 index 3534adb08..000000000 --- a/Tests/MySql.EntityFrameworkCore.Basic.Tests/DbContextClasses/EFFluentAPIContexts.cs +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using Microsoft.EntityFrameworkCore; -using MySQL.Data.EntityFrameworkCore.Extensions; -using System; - -namespace MySql.Data.EntityFrameworkCore.Tests.DbContextClasses -{ - public class ComputedColumnContext : MyTestContext - { - public DbSet Employees { get; set; } - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - modelBuilder.Entity() - .HasKey(b => b.EmployeeId) - .HasName("PrimaryKey_EmployeeId"); - - modelBuilder.Entity() - .Property(p => p.DisplayName) - .HasComputedColumnSql("CONCAT_WS(' ', LastName , FirstName)"); - - modelBuilder.Entity() - .Property(p => p.Timestamp) - .HasDefaultValue(DateTime.Now) - .ForMySQLHasDefaultValueSql("CURRENT_TIMESTAMP") - .ValueGeneratedOnAddOrUpdate(); - - } - } - - public class QuickContext : MyTestContext - { - public DbSet QuickEntity { get; set; } - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - modelBuilder.Entity() - .HasKey(b => b.Id) - .HasName("PrimaryKey_Id"); - - modelBuilder.Entity() - .Property(b => b.Created) - .HasColumnType("Timestamp"); - } - } - - - - public class TableConventionsContext : MyTestContext - { - public DbSet Cars { get; set; } - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - modelBuilder.Entity() - .ToTable("somecars"); - - modelBuilder.Entity() - .HasKey(c => new { c.State, c.LicensePlate }); - - - modelBuilder.Entity() - .HasOne(s => s.Car) - .WithMany(c => c.SaleHistory) - .HasForeignKey(s => new { s.CarState, s.CarLicensePlate }) - .HasPrincipalKey(c => new { c.State, c.LicensePlate }); - } - } - - public class KeyConventionsContext : MyTestContext - { - public DbSet Cars { get; set; } - public DbSet Blogs { get; set; } - - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - modelBuilder.Entity() - .HasAlternateKey(c => c.LicensePlate) - .HasName("AlternateKey_LicensePlate"); - - modelBuilder.Entity() - .HasIndex(b => b.Url) - .HasName("Index_Url"); - - modelBuilder.Entity() - .HasOne(p => p.Metadata) - .WithOne(i => i.Blog) - .HasForeignKey(b => b.BlogId); - - modelBuilder.Entity() - .HasOne(p => p.RecentPost) - .WithOne(i => i.Blog) - .HasForeignKey(b => b.PostId); - - modelBuilder.Entity() - .Property(b => b.Make) - .ForMySQLHasColumnType("varchar(100)"); - - modelBuilder.Entity() - .Property(b => b.Model) - .ForMySQLHasDefaultValue("1999"); - - - } - } - - - public class ConcurrencyTestsContext : MyTestContext - { - public DbSet People { get; set; } - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - modelBuilder.Entity() - .Property(p => p.SocialSecurityNumber) - .IsConcurrencyToken(); - } - } -} - - - diff --git a/Tests/MySql.EntityFrameworkCore.Basic.Tests/DbContextClasses/EntitiesClasses.cs b/Tests/MySql.EntityFrameworkCore.Basic.Tests/DbContextClasses/EntitiesClasses.cs deleted file mode 100644 index 2955c97c4..000000000 --- a/Tests/MySql.EntityFrameworkCore.Basic.Tests/DbContextClasses/EntitiesClasses.cs +++ /dev/null @@ -1,190 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.ComponentModel.DataAnnotations; - -namespace MySql.Data.EntityFrameworkCore.Tests.DbContextClasses -{ - public class Blog - { - public int BlogId { get; set; } - public string Url { get; set; } - - //public List Posts { get; set; } - - public Post RecentPost { get; set; } - public BlogMetadata Metadata { get; set; } - - } - - public class Post - { - public int PostId { get; set; } - public string Title { get; set; } - public string Content { get; set; } - - public int BlogIdFK { get; set; } - - public string Url { get; set; } - - public Blog Blog { get; set; } - } - - - public class Read - { - public int ReadId { get; set; } - public string Title { get; set; } - public string Content { get; set; } - - public List ReadTags { get; set; } - } - - public class Tag - { - public int TagId { get; set; } - - public List ReadTags { get; set; } - } - - public class ReadTag - { - public int ReadId { get; set; } - public Read Read { get; set; } - - public int TagId { get; set; } - public Tag Tag { get; set; } - } - - - public class AuditEntry - { - public int AuditEntryId { get; set; } - public string Username { get; set; } - public string Action { get; set; } - } - - - public class BlogMetadata - { - [Key] - public int BlogId { get; set; } - public Blog Blog { get; set; } - public DateTime LoadedFromDatabase { get; set; } - } - - - public class Employee - { - public int EmployeeId { get; set; } - public string FirstName { get; set; } - public string LastName { get; set; } - public string DisplayName { get; set; } - - public DateTime Timestamp { get; set; } - - } - - - public class Car - { - public int CarId { get; set; } - [MaxLength(30)] - public string LicensePlate { get; set; } - [MaxLength(30)] - public string State { get; set; } - public string Make { get; set; } - public string Model { get; set; } - - public List SaleHistory { get; set; } - } - - - public class RecordOfSale - { - public int RecordOfSaleId { get; set; } - public DateTime DateSold { get; set; } - public decimal Price { get; set; } - [MaxLength(30)] - public string CarState { get; set; } - [MaxLength(30)] - public string CarLicensePlate { get; set; } - public Car Car { get; set; } - } - - public class Person - { - public int PersonId { get; set; } - - [ConcurrencyCheck] - public string SocialSecurityNumber { get; set; } - public string PhoneNumber { get; set; } - [ConcurrencyCheck] - public string Name { get; set; } - } - - public class Guest - { - [Key] - public int IdGuest { get; set; } - public string Name { get; set; } - public Address Address { get; set; } - } - - public class Address - { - [Key] - public int IdAddress { get; set; } - public string Street { get; set; } - public string City { get; set; } - public Guest Guest { get; set; } - } - - public class Relative - { - [Key] - public int IdRelative { get; set; } - public string Name { get; set; } - public AddressRelative Address { get; set; } - } - - public class AddressRelative - { - [Key] - public int IdAddressRelative { get; set; } - public string Street { get; set; } - public string City { get; set; } - public Relative Relative { get; set; } - } - - - public class QuickEntity - { - [Key] - public int Id { get; set; } - public string Name { get; set; } - public DateTimeOffset Created { get; set; } - - } -} diff --git a/Tests/MySql.EntityFrameworkCore.Basic.Tests/DbContextClasses/TestsContexts.cs b/Tests/MySql.EntityFrameworkCore.Basic.Tests/DbContextClasses/TestsContexts.cs deleted file mode 100644 index 62e19ec61..000000000 --- a/Tests/MySql.EntityFrameworkCore.Basic.Tests/DbContextClasses/TestsContexts.cs +++ /dev/null @@ -1,196 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using EntityFrameworkCore.Basic.Tests.Logging; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.ChangeTracking; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; - -using Microsoft.EntityFrameworkCore.Internal; - - -using Microsoft.EntityFrameworkCore.Storage; -using Microsoft.EntityFrameworkCore.Storage.Internal; - - -using MySQL.Data.EntityFrameworkCore.Extensions; -using System; -using MySQL.Data.EntityFrameworkCore; - -namespace MySql.Data.EntityFrameworkCore.Tests.DbContextClasses -{ - - public class NoConfigurationContext : DbContext - { - public DbSet Blogs { get; set; } - //Empty configuration - } - - public class SimpleContext : DbContext - { - public DbSet Blogs { get; set; } - public DbSet Posts { get; set; } - - public SimpleContext(DbContextOptions options): base(options) - { - } - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - modelBuilder.Entity() - .HasOne(p => p.RecentPost) - .WithOne(i => i.Blog) - .HasForeignKey(b => b.PostId); - - - modelBuilder.Entity() - .HasOne(p => p.Metadata) - .WithOne(i => i.Blog) - .HasForeignKey(b => b.BlogId); - - } - - } - - - public class TestsContext : MyTestContext - { - public DbSet Blogs { get; set; } - public DbSet Posts { get; set; } - public DbSet Reads { get; set; } - public DbSet Tags { get; set; } - - public DbSet ReadTags { get; set; } - - public TestsContext() - { } - - public TestsContext(DbContextOptions options): base(options) - { - } - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - modelBuilder.Entity() - .HasOne(p => p.RecentPost) - .WithOne(i => i.Blog) - .HasPrincipalKey(p => new { p.BlogId, p.Url }) - .HasForeignKey(b => new { b.BlogIdFK, b.Url }); - - modelBuilder.Entity() - .HasOne(p => p.Blog) - .WithOne(i => i.Metadata) - .HasForeignKey(b => b.BlogId); - - - modelBuilder.Entity() - .HasKey(t => new { t.ReadId, t.TagId }); - - modelBuilder.Entity() - .HasOne(pt => pt.Read) - .WithMany(p => p.ReadTags) - .HasForeignKey(pt => pt.ReadId) - .OnDelete(DeleteBehavior.Cascade); - - modelBuilder.Entity() - .HasOne(pt => pt.Tag) - .WithMany(t => t.ReadTags) - .HasForeignKey(pt => pt.TagId); - - } - } - - public class ContextWithShadowProperty : MyTestContext - { - public DbSet Guests { get; set; } - - public ContextWithShadowProperty(DbContextOptions options) : base(options) - { - ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.TrackAll; - } - - public override int SaveChanges() - { - var now = DateTime.Now; - foreach (EntityEntry entry in ChangeTracker.Entries()) - { - if (entry.State == EntityState.Added) - { - entry.Property("CreatedAt").CurrentValue = now; - } - else if (entry.State == EntityState.Modified) - { - entry.Property("UpdatedAt").CurrentValue = now; - } - } - return base.SaveChanges(); - } - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - modelBuilder - .Entity(e => e.HasOne(a => a.Address).WithOne(p => p.Guest) - .HasForeignKey
(a => a.IdAddress) - ); - - modelBuilder.Entity().Property("CreatedAt"); - modelBuilder.Entity().Property("UpdatedAt"); - } - } - - - public class EagerLoadingContext : MyTestContext - { - public DbSet Guests { get; set; } - public DbSet Persons2 { get; set; } - - public EagerLoadingContext() - { - } - - public EagerLoadingContext(DbContextOptions options) : base(options) - { - } - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - modelBuilder.Entity() - .HasOne(p => p.Address) - .WithOne(i => i.Guest) - .HasForeignKey
(i => i.IdAddress) - .HasConstraintName("FKGuestAddress"); - - modelBuilder.Entity() - .HasOne(p => p.Address) - .WithOne(i => i.Relative) - .HasForeignKey(i => i.IdAddressRelative) - .HasConstraintName("FKRelativeAddress"); - - // add shadow property - modelBuilder.Entity().Property("RelativeId"); - } - - } -} diff --git a/Tests/MySql.EntityFrameworkCore.Basic.Tests/FluentAPITests.cs b/Tests/MySql.EntityFrameworkCore.Basic.Tests/FluentAPITests.cs deleted file mode 100644 index d9275fbff..000000000 --- a/Tests/MySql.EntityFrameworkCore.Basic.Tests/FluentAPITests.cs +++ /dev/null @@ -1,266 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.DependencyInjection; -using MySql.Data.EntityFrameworkCore.Tests.DbContextClasses; -using MySql.Data.MySqlClient; -using MySQL.Data.EntityFrameworkCore; -using System; -using System.Diagnostics; -using System.Linq; -using System.Threading.Tasks; -using Xunit; - -namespace MySql.Data.EntityFrameworkCore.Tests -{ - public class FluentAPITests : IDisposable - { - - [Fact] - public void EnsureRelationalPatterns() - { - var serviceCollection = new ServiceCollection(); - serviceCollection.AddEntityFrameworkMySQL() - .AddDbContext(); - - var serviceProvider = serviceCollection.BuildServiceProvider(); - - using (var context = serviceProvider.GetRequiredService()) - { - context.Database.EnsureCreated(); - - var e = new Employee { FirstName = "Jos", LastName = "Stuart" }; - context.Employees.Add(e); - context.SaveChanges(); - var employeeComputedColumn = context.Employees.FirstOrDefault(); - Assert.True(employeeComputedColumn.DisplayName.Equals("Stuart Jos"), "Wrong computed column"); - context.Database.EnsureDeleted(); - } - } - - - - [Fact] - public void CanUseModelWithDateTimeOffset() - { - var serviceCollection = new ServiceCollection(); - serviceCollection.AddEntityFrameworkMySQL() - .AddDbContext(); - - var serviceProvider = serviceCollection.BuildServiceProvider(); - - using (var context = serviceProvider.GetRequiredService()) - { - try - { - context.Database.EnsureCreated(); - var dt = DateTime.Now; - var e = new QuickEntity { Name = "Jos", Created = dt }; - context.QuickEntity.Add(e); - context.SaveChanges(); - var row = context.QuickEntity.FirstOrDefault(); - Assert.Equal(dt, row.Created); - } - catch (Exception) - { - throw; - } - finally - { - context.Database.EnsureDeleted(); - } - } - } - - - [Fact] - public async Task CanUseModelWithDateTimeOffsetAsync() - { - var serviceCollection = new ServiceCollection(); - serviceCollection.AddEntityFrameworkMySQL() - .AddDbContext(); - - var serviceProvider = serviceCollection.BuildServiceProvider(); - - using (var context = serviceProvider.GetRequiredService()) - { - try - { - context.Database.EnsureCreated(); - var dt = DateTime.Now; - var e = new QuickEntity { Name = "Jos", Created = dt }; - context.QuickEntity.Add(e); - context.SaveChanges(); - var result = await context.QuickEntity.FirstOrDefaultAsync(); - Assert.Equal(dt, result.Created); - } - catch (Exception) - { - throw; - } - finally - { - context.Database.EnsureDeleted(); - } - } - } - - - [Fact] - public void CanNameAlternateKey() - { - var serviceCollection = new ServiceCollection(); - - serviceCollection.AddEntityFrameworkMySQL() - .AddDbContext(); - - var serviceProvider = serviceCollection.BuildServiceProvider(); - - using (var context = serviceProvider.GetRequiredService()) - { - context.Database.EnsureCreated(); - using (var cnn = new MySqlConnection(MySQLTestStore.baseConnectionString)) - { - cnn.Open(); - var cmd = new MySqlCommand("SELECT DISTINCT table_name, index_name FROM INFORMATION_SCHEMA.STATISTICS where table_name like 'cars' and index_name not like 'PRIMARY' ", cnn); - var reader = cmd.ExecuteReader(); - while (reader.Read()) - { - Assert.True(reader.GetString(1).ToString().Equals("AlternateKey_LicensePlate"), "Wrong index creation"); - } - } - } - } - - - - [Fact] - public void CanUseToTable() - { - var serviceCollection = new ServiceCollection(); - serviceCollection.AddEntityFrameworkMySQL() - .AddDbContext(); - - var serviceProvider = serviceCollection.BuildServiceProvider(); - - using (var context = serviceProvider.GetRequiredService()) - { - context.Database.EnsureCreated(); - using (var cnn = new MySqlConnection(MySQLTestStore.baseConnectionString)) - { - cnn.Open(); - var cmd = new MySqlCommand("SELECT table_name FROM INFORMATION_SCHEMA.STATISTICS where table_name like 'somecars' ", cnn); - var reader = cmd.ExecuteReader(); - while (reader.Read()) - { - Assert.True(reader.GetString(0).ToString().Equals("somecars"), "Wrong table name"); - } - } - context.Database.EnsureDeleted(); - } - } - - - [Fact] - public void CanUseConcurrency() - { - var serviceCollection = new ServiceCollection(); - serviceCollection.AddEntityFrameworkMySQL() - .AddDbContext(); - - var serviceProvider = serviceCollection.BuildServiceProvider(); - - using (var context = serviceProvider.GetRequiredService()) - { - context.Database.EnsureCreated(); - using (var cnn = new MySqlConnection(MySQLTestStore.baseConnectionString)) - { - cnn.Open(); - var cmd = new MySqlCommand("SELECT table_name FROM INFORMATION_SCHEMA.STATISTICS where table_schema like 'somecars' ", cnn); - var reader = cmd.ExecuteReader(); - while (reader.Read()) - { - Assert.True(reader.GetString(0).ToString().Equals("somecars"), "Wrong table name"); - } - } - context.Database.EnsureDeleted(); - } - } - - - [Fact] - public void CanUseConcurrencyToken() - { - var serviceCollection = new ServiceCollection(); - serviceCollection.AddEntityFrameworkMySQL() - .AddDbContext(); - - var serviceProvider = serviceCollection.BuildServiceProvider(); - - using (var context = serviceProvider.GetRequiredService()) - { - context.Database.EnsureCreated(); - - var e = new Employee { FirstName = "Jos", LastName = "Stuart" }; - context.Employees.Add(e); - context.SaveChanges(); - var employeeComputedColumn = context.Employees.SingleOrDefault(); - Assert.True(employeeComputedColumn.DisplayName.Equals("Stuart Jos"), "Wrong computed column"); - context.Database.EnsureDeleted(); - } - } - - [Fact] - public void CanUseContainsInQuery() - { - var serviceCollection = new ServiceCollection(); - serviceCollection.AddEntityFrameworkMySQL() - .AddDbContext(); - - var serviceProvider = serviceCollection.BuildServiceProvider(); - - using (var context = serviceProvider.GetRequiredService()) - { - context.Database.EnsureCreated(); - var e = new Employee { FirstName = "Jos", LastName = "Stuart" }; - context.Employees.Add(e); - context.SaveChanges(); - var result = context.Employees.Where(t => t.FirstName.Contains("jo")).ToList(); - Assert.Equal(1, result.Count); - context.Database.EnsureDeleted(); - } - } - - - public void Dispose() - { - // ensure database deletion - using (var cnn = new MySqlConnection(MySQLTestStore.baseConnectionString)) - { - cnn.Open(); - var cmd = new MySqlCommand("DROP DATABASE IF EXISTS test", cnn); - cmd.ExecuteNonQuery(); - } - } - } -} diff --git a/Tests/MySql.EntityFrameworkCore.Basic.Tests/FunctionalTests.cs b/Tests/MySql.EntityFrameworkCore.Basic.Tests/FunctionalTests.cs deleted file mode 100644 index 68fc475e2..000000000 --- a/Tests/MySql.EntityFrameworkCore.Basic.Tests/FunctionalTests.cs +++ /dev/null @@ -1,236 +0,0 @@ -// Copyright © 2016, 2017, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySql.Data.EntityFrameworkCore.Tests.DbContextClasses; -using System; -using System.Linq; -using Xunit; -using MySQL.Data.EntityFrameworkCore; -using MySQL.Data.EntityFrameworkCore.Extensions; -using Microsoft.Extensions.DependencyInjection; -using MySql.Data.MySqlClient; -using Microsoft.EntityFrameworkCore.Internal; -using Microsoft.EntityFrameworkCore; - -namespace MySql.Data.EntityFrameworkCore.Tests -{ - public class FunctionalTests : IDisposable - { - - [Fact] - public void CanConnectWithConnectionOnConfiguring() - { - var serviceCollection = new ServiceCollection(); - serviceCollection.AddEntityFrameworkMySQL() - .AddDbContext(); - - var serviceProvider = serviceCollection.BuildServiceProvider(); - - using (var context = serviceProvider.GetRequiredService()) - { - context.Database.EnsureCreated(); - Assert.False(context.Posts.Any()); - context.Database.EnsureDeleted(); - } - } - - - [Fact] - public void CanThrowExceptionWhenNoConfiguration() - { - var serviceCollection = new ServiceCollection(); - serviceCollection.AddEntityFrameworkMySQL() - .AddDbContext(); - - var serviceProvider = serviceCollection.BuildServiceProvider(); - - using (var context = serviceProvider.GetRequiredService()) - { - Assert.Equal(CoreStrings.NoProviderConfigured, Assert.Throws(() => context.Blogs.Any()).Message); - } - } - - - [Fact] - public void CreatedDb() - { - var serviceCollection = new ServiceCollection(); - serviceCollection.AddEntityFrameworkMySQL() - .AddDbContext(); - - var serviceProvider = serviceCollection.BuildServiceProvider(); - - using (var context = serviceProvider.GetRequiredService()) - { - context.Database.EnsureCreated(); - var dbname = context.Database.GetDbConnection().Database; - using (var cnn = new MySqlConnection(MySQLTestStore.baseConnectionString + string.Format(";database={0}", context.Database.GetDbConnection().Database))) - { - cnn.Open(); - var cmd = new MySqlCommand(string.Format("SHOW DATABASES LIKE '{0}'", context.Database.GetDbConnection().Database), cnn); - var reader = cmd.ExecuteReader(); - while (reader.Read()) - { - Assert.True(string.Equals(dbname, reader.GetString(0), StringComparison.CurrentCultureIgnoreCase), "Database was not created"); - } - } - context.Database.EnsureDeleted(); - } - } - - - [Fact] - public void EnsureRelationalPatterns() - { - var serviceCollection = new ServiceCollection(); - serviceCollection.AddEntityFrameworkMySQL() - .AddDbContext(); - - var serviceProvider = serviceCollection.BuildServiceProvider(); - - using (var context = serviceProvider.GetRequiredService()) - { - context.Database.EnsureCreated(); - using (var cnn = new MySqlConnection(MySQLTestStore.baseConnectionString + string.Format(";database={0}", context.Database.GetDbConnection().Database))) - { - var dbname = context.Database.GetDbConnection().Database; - cnn.Open(); - var cmd = new MySqlCommand(string.Format("SHOW DATABASES LIKE '{0}'", context.Database.GetDbConnection().Database), cnn); - var reader = cmd.ExecuteReader(); - while (reader.Read()) - { - Assert.True(string.Equals(dbname, reader.GetString(0), StringComparison.CurrentCultureIgnoreCase), "Database was not created"); - } - } - context.Database.EnsureDeleted(); - } - } - - - [Fact] - public void CanUseIgnoreEntity() - { - var serviceCollection = new ServiceCollection(); - serviceCollection.AddEntityFrameworkMySQL() - .AddDbContext(); - - var serviceProvider = serviceCollection.BuildServiceProvider(); - - using (var context = serviceProvider.GetRequiredService()) - { - context.Database.EnsureCreated(); - Assert.True(context.Model.GetEntityTypes().Count() == 2, "Wrong model generation"); - Assert.True(context.Blogs.ToList().Count == 0, ""); - context.Database.EnsureDeleted(); - } - } - - - - [Fact] - public void CanUseOptionsInDbContextCtor() - { - using (var context = new OptionsContext(new DbContextOptions(), - new MySqlConnection(MySQLTestStore.CreateConnectionString("db-optionsindbcontext")))) - { - context.Database.EnsureCreated(); - Assert.False(context.Blogs.Any()); - context.Database.EnsureDeleted(); - } - - } - - - public void Dispose() - { - //ensure test database is deleted - using (var cnn = new MySqlConnection(MySQLTestStore.baseConnectionString)) - { - cnn.Open(); - var cmd = new MySqlCommand("DROP DATABASE IF EXISTS TEST", cnn); - cmd.ExecuteNonQuery(); - } - } - - - #region ContextClasses - - protected class OptionsContext : SimpleContext - { - private readonly MySqlConnection _connection; - private readonly DbContextOptions _options; - - public OptionsContext(DbContextOptions options, MySqlConnection connection) - : base(options) - { - _options = options; - _connection = connection; - } - - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { - Assert.Same(_options, optionsBuilder.Options); - - optionsBuilder.UseMySQL(_connection); - - Assert.NotSame(_options, optionsBuilder.Options); - } - - public override void Dispose() - { - _connection.Dispose(); - base.Dispose(); - } - } - - private class ConnectionStringInOnConfiguringTestContext : TestsContext - { - public ConnectionStringInOnConfiguringTestContext(DbContextOptions options) - : base(options) - { - } - } - - - private class UseConnectionInOnConfiguring : TestsContext - { - private MySqlConnection _connection; - - public UseConnectionInOnConfiguring(MySqlConnection connection) - { - _connection = connection; - } - - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { - optionsBuilder.UseMySQL(_connection); - } - - public override void Dispose() - { - _connection.Dispose(); - base.Dispose(); - } - } - #endregion - } -} diff --git a/Tests/MySql.EntityFrameworkCore.Basic.Tests/LoadingRelatedDataTests.cs b/Tests/MySql.EntityFrameworkCore.Basic.Tests/LoadingRelatedDataTests.cs deleted file mode 100644 index 8c0004724..000000000 --- a/Tests/MySql.EntityFrameworkCore.Basic.Tests/LoadingRelatedDataTests.cs +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using EntityFrameworkCore.Basic.Tests.Logging; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using MySql.Data.EntityFrameworkCore.Tests; -using MySql.Data.EntityFrameworkCore.Tests.DbContextClasses; -using MySQL.Data.EntityFrameworkCore; -using MySQL.Data.EntityFrameworkCore.Extensions; -using System; -using System.Linq; -using Xunit; - -namespace MySql.Data.EntityFrameworkCore.Tests -{ - public class LoadingRelatedDataTests : IDisposable - { - - DbContext context; - DbContextOptions options; - IServiceCollection collection = new ServiceCollection() - .AddEntityFrameworkMySQL() - .AddSingleton(new MySqlLoggerFactory()); - - string Sql => MySqlLoggerFactory.SqlStatements.LastOrDefault(); - - public LoadingRelatedDataTests() - { - - options = new DbContextOptionsBuilder() - .UseInternalServiceProvider(collection.BuildServiceProvider()) - .UseMySQL(MySQLTestStore.baseConnectionString + "bd-eagerloading") - .Options; - - context = new EagerLoadingContext(options); - context.Database.EnsureCreated(); - AddData(context); - - } - - - [Fact] - public void CanIncludeAddressData() - { - Assert.False(context.Database.EnsureCreated()); - var people - = context.Set() - .Include(p => p.Address) - .ToList(); - - Assert.Equal(4, people.Count); - Assert.Equal(3, people.Count(p => p.Address != null)); -// Assert.Equal(@"SELECT `p`.`IdGuest`, `p`.`Name`, `p`.`RelativeId`, `a`.`IdAddress`, `a`.`City`, `a`.`Street` -//FROM `Guests` AS `p` -//LEFT JOIN `Address` AS `a` ON `a`.`IdAddress` = `p`.`IdGuest`", Sql); - } - - [Fact] - public void CanIncludeGuestData() - { - Assert.False(context.Database.EnsureCreated()); - var ad - = context.Set
() - .Include(p => p.Guest) - .ToList(); - - Assert.Equal(3, ad.Count); - var rows = ad.Select(g => g.Guest).Where(a => a != null).ToList(); - Assert.Equal(3, rows.Count()); - - // TODO check the logger implementation -// Assert.Equal(@"SELECT `p`.`IdAddress`, `p`.`City`, `p`.`Street`, `g`.`IdGuest`, `g`.`Name`, `g`.`RelativeId` -//FROM `Address` AS `p` -//INNER JOIN `Guests` AS `g` ON `p`.`IdAddress` = `g`.`IdGuest`", Sql); - } - - - [Fact] - public void CanIncludeGuestShadowProperty() - { - Assert.False(context.Database.EnsureCreated()); - var addressRelative - = context.Set() - .Include(a => a.Relative) - .ToList(); - - Assert.Equal(3, addressRelative.Count); - Assert.True(addressRelative.All(p => p.Relative!= null)); - // TODO: review what should be the result here (acc. EF tests should be 6) -// Assert.Equal(13, context.ChangeTracker.Entries().Count()); -// Assert.Equal(@"SELECT `a`.`IdAddressRelative`, `a`.`City`, `a`.`Street`, `p`.`IdRelative`, `p`.`Name` -//FROM `AddressRelative` AS `a` -//INNER JOIN `Persons2` AS `p` ON `a`.`IdAddressRelative` = `p`.`IdRelative`", Sql); - } - - - - private void AddData(DbContext context) - { - var d = new Address { Street = "Street one", City = "Michigan" }; - var d1 = new Address { Street = "Street two", City = "San Francisco" }; - var d2 = new Address { Street = "Street three", City = "Denver" }; - - context.Set().AddRange( - new Guest { Name = "Guest one", Address = d }, - new Guest { Name = "Guest two", Address = d1 }, - new Guest { Name = "Guest three", Address = d2}, - new Guest { Name = "Guest four"} - ); - - context.Set
().AddRange(d, d1, d2); - - var ad = new AddressRelative { Street = "Street one", City = "Michigan" }; - var ad1 = new AddressRelative { Street = "Street two", City = "San Francisco" }; - var ad2 = new AddressRelative { Street = "Street three", City = "Denver" }; - - context.Set().AddRange( - new Relative { Name = "L. J.", Address = ad }, - new Relative { Name = "M. M.", Address = ad1 }, - new Relative { Name = "Z. Z.", Address = ad2 } - ); - - context.Set().AddRange(ad, ad1, ad2); - - context.SaveChanges(); - } - - public void Dispose() - { - context.Database.EnsureDeleted(); - } - } -} diff --git a/Tests/MySql.EntityFrameworkCore.Basic.Tests/Logging/MySqlLoggerFactory.cs b/Tests/MySql.EntityFrameworkCore.Basic.Tests/Logging/MySqlLoggerFactory.cs deleted file mode 100644 index 301a4758c..000000000 --- a/Tests/MySql.EntityFrameworkCore.Basic.Tests/Logging/MySqlLoggerFactory.cs +++ /dev/null @@ -1,203 +0,0 @@ -// Copyright © 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore.Storage; -using Microsoft.Extensions.Logging; -using System; -using System.Collections.Generic; -using System.Linq; -#if !NETCORE10 -using System.Runtime.Remoting.Messaging; -#endif -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using Xunit.Abstractions; - -namespace EntityFrameworkCore.Basic.Tests.Logging -{ - public class MySqlLoggerFactory : ILoggerFactory - { - private static MySqlLogger _logger; - private static MySqlLogger Logger => LazyInitializer.EnsureInitialized(ref _logger); - - public static IReadOnlyList SqlStatements - { - get - { - return Logger.MySqlLoggerData.mySqlStatements; - } - } - - public static IReadOnlyList CommandLogData => Logger.MySqlLoggerData.logData; - - public void AddProvider(ILoggerProvider provider) - { - throw new NotImplementedException(); - } - - public ILogger CreateLogger(string categoryName) - { - return Logger; - } - - public void Dispose() - { - } - - public static string Log => Logger.MySqlLoggerData.output; - public static string Sql => string.Join(Environment.NewLine, Logger.MySqlLoggerData.mySqlStatements); - - - - public static void Reset() => Logger.ResetLoggerData(); - - - private class MySqlLogger : ILogger - { - -#if NETCORE10 - private readonly static AsyncLocal loggerData = new AsyncLocal(); -#else - private const string contextName = "_LogMySQL"; -#endif - - public MySqlLoggerData MySqlLoggerData - { - get - { -#if NETCORE10 - var lgData = loggerData.Value; -#else - var lgData = (MySqlLoggerData)CallContext.LogicalGetData(contextName); -#endif - return lgData ?? CreateLoggerData(); - } - } - - private static MySqlLoggerData CreateLoggerData() - { - var lgData = new MySqlLoggerData(); -#if NETCORE10 - loggerData.Value = lgData; -#else - CallContext.LogicalSetData(contextName, lgData); -#endif - return lgData; - - } - - - public IDisposable BeginScope(TState state) - { - return MySqlLoggerData.stmt; - } - - public bool IsEnabled(LogLevel logLevel) => true; - - public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) - { - - var format = formatter(state, exception)?.Trim(); - if (format != null) - { - var mysqlLoggerData = MySqlLoggerData; - var cmdLog = state as DbCommandLogData; - - if (cmdLog != null) - { - var parameters = ""; - - if (cmdLog.Parameters.Any()) - { - parameters = string.Join(Environment.NewLine , cmdLog.Parameters.Select(p => $"{p.Name}: {p.Value.ToString()}")); - } - - mysqlLoggerData.mySqlStatements.Add(parameters + cmdLog.CommandText); - - mysqlLoggerData.logData.Add(cmdLog); - } - - else - { - mysqlLoggerData.stmt.AppendLine(format); - } - - mysqlLoggerData.xUnitOutputHelper?.WriteLine(format + Environment.NewLine); - } - } - - internal void ResetLoggerData() - { -#if NETCORE10 - loggerData.Value = null; -#else - CallContext.LogicalSetData(contextName, null); -#endif - } - } - - - private class MySqlLoggerData - { - public string output => stmt.ToString(); - -#if !NETCORE10 - [NonSerialized] -#endif - public readonly HelperDisposable stmt = new HelperDisposable(new StringBuilder("")); - public readonly List mySqlStatements = new List(); -#if !NETCORE10 - [NonSerialized] -#endif - public readonly List logData = new List(); - -#if !NETCORE10 - [NonSerialized] -#endif - public ITestOutputHelper xUnitOutputHelper; - } - - private class HelperDisposable : IDisposable - { - private readonly StringBuilder _stringBuilder; - - public HelperDisposable(StringBuilder stringBuilder) - { - _stringBuilder = stringBuilder; - } - - public void Dispose() - { - _stringBuilder.Append(""); - } - - public override string ToString() => _stringBuilder.ToString(); - - public HelperDisposable AppendLine(string stringBuilder) - { - _stringBuilder.AppendLine(stringBuilder); - return this; - } - } - } -} diff --git a/Tests/MySql.EntityFrameworkCore.Basic.Tests/MySQLTypeMapperTests.cs b/Tests/MySql.EntityFrameworkCore.Basic.Tests/MySQLTypeMapperTests.cs deleted file mode 100644 index 95be27544..000000000 --- a/Tests/MySql.EntityFrameworkCore.Basic.Tests/MySQLTypeMapperTests.cs +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore.Storage; -using Microsoft.Extensions.DependencyInjection; -using MySql.Data.EntityFrameworkCore.Storage.Internal; -using MySql.Data.EntityFrameworkCore.Tests.DbContextClasses; -using MySql.Data.MySqlClient; -using System; -using System.Diagnostics; -using Xunit; - -namespace EntityFrameworkCore.Basic.Tests -{ - public class MySQLTypeMapperTests : RelationalTypeMapperTestBase - { - [Fact] - public void ReadTimeOffset() - { - //var cnn = new MySqlConnection("server = localhost; userid = root; database=db-quickcontext; port=3305; "); - //cnn.Open(); - //var cmd = new MySqlCommand(@"Insert into quickentity (city, name) values ('01/01/01', 'namecolumn')", cnn); - //cmd.ExecuteNonQuery(); - //cmd.CommandText = "Select city, name from quickentity"; - //var reader = cmd.ExecuteReader(); - - //while (reader.Read()) - //{ - // Debug.Write("" + reader.GetFieldValue(0).ToString()); - //} - //cnn.Close(); - - - - - - - - } - - - - [Fact] - public void SimpleMappingsToDDLTypes() - { - - //ContextUtils.Instance.CreateModelBuilder(); - - - //var serviceCollection = new ServiceCollection(); - //serviceCollection.AddEntityFrameworkMySQL() - //.AddDbContext(); - - //var serviceProvider = serviceCollection.BuildServiceProvider(); - - //using (var context = serviceProvider.GetRequiredService()) - //{ - // var e = context.FindEntityType - // protected static EntityType CreateEntityType() - //=> (EntityType)CreateModel().FindEntityType(typeof(MyType)); - - // Assert.Equal("datetime", GetTypeMapping(typeof(DateTimeOffset)).StoreType); - } - - private static RelationalTypeMapping GetTypeMapping( - Type propertyType, - bool? nullable = null, - int? maxLength = null, - bool? unicode = null) - { - //var property = CreateEntityType().AddProperty("MyProp", propertyType); - - //if (nullable.HasValue) - //{ - // property.IsNullable = nullable.Value; - //} - - //if (maxLength.HasValue) - //{ - // property.SetMaxLength(maxLength); - //} - - //if (unicode.HasValue) - //{ - // property.IsUnicode(unicode); - //} - - //return new MySQLTypeMapper().GetMapping(); - - return null; - } - - } - } - -public class RelationalTypeMapperTestBase -{ - //protected static EntityType CreateEntityType() - // => (EntityType)CreateModel().FindEntityType(typeof(MyType)); - - - //protected static IModel CreateModel() - //{ - // var modelBuilder = MySql.Data.EntityFrameworkCore.TestsContextUtils.Instance.CreateModelBuilder(); - // buildAction(modelBuilder); - - - // var builder = TestHelpers.Instance.CreateConventionBuilder(); - - //} -} - - - diff --git a/Tests/MySql.EntityFrameworkCore.Basic.Tests/MySql.EntityFrameworkCore.Basic.Tests.csproj b/Tests/MySql.EntityFrameworkCore.Basic.Tests/MySql.EntityFrameworkCore.Basic.Tests.csproj deleted file mode 100644 index d59819fd2..000000000 --- a/Tests/MySql.EntityFrameworkCore.Basic.Tests/MySql.EntityFrameworkCore.Basic.Tests.csproj +++ /dev/null @@ -1,165 +0,0 @@ - - - - 10.0 - v4.0 - - - - - - - - 9.0.30729 - 2.0 - 4.6 - v4.5.1 - NET_40_OR_GREATER;NET_45_OR_GREATER;NET_451_OR_GREATER;NET_46_OR_GREATER; - - - - - 9.0.30729 - 2.0 - 4.5 - v4.5.1 - TRACE;NET_40_OR_GREATER;NET_45_OR_GREATER;NET_451_OR_GREATER - - - - - 9.0.30729 - 2.0 - 4.5 - v4.5 - TRACE;NET_40_OR_GREATER;NET_45_OR_GREATER - - - - - 9.0.30729 - 2.0 - 4.0 - v4.0 - TRACE;NET_40_OR_GREATER - - - - - Debug - AnyCPU - {0F441D9D-9ABB-47CE-991D-FCF70A912866} - Library - Properties - MySql.Data.EntityFrameworkCore.Tests - MySql.Data.EntityFrameworkCore.Tests - 512 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - - true - full - false - $(TargetFrameworkVersion)\ - obj\$(TargetFrameworkVersion)\ - obj\$(TargetFrameworkVersion)\ - bin\$(TargetFrameworkVersion)\Debug\ - DEBUG;EF6;$(DefineConstants) - prompt - 4 - AllRules.ruleset - - - pdbonly - true - $(TargetFrameworkVersion)\ - obj\$(TargetFrameworkVersion)\ - obj\$(TargetFrameworkVersion)\ - bin\$(TargetFrameworkVersion)\Release\ - EF7;$(DefineConstants) - prompt - 4 - AllRules.ruleset - - - - Properties\VersionInfo.cs - - - - - - - - - - - - - - - - - - {11e455ee-8ba8-466c-b8d6-5e5edb0767fc} - MySql.Data.EntityFrameworkCore - - - - - Always - - - Designer - - - - - - - - - - - - - - - - {E9DF5ED1-4CBD-4226-B931-9A51610AC14D} - MySql.Data - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Tests/MySql.EntityFrameworkCore.Basic.Tests/MySql.EntityFrameworkCore.Basic.Tests.xproj b/Tests/MySql.EntityFrameworkCore.Basic.Tests/MySql.EntityFrameworkCore.Basic.Tests.xproj deleted file mode 100644 index 38ec08e74..000000000 --- a/Tests/MySql.EntityFrameworkCore.Basic.Tests/MySql.EntityFrameworkCore.Basic.Tests.xproj +++ /dev/null @@ -1,22 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 1caab7d0-8d06-46b8-b3c9-8639828a6ae8 - EntityFrameworkCore.Basic.Tests - .\obj - .\bin\ - v4.6.1 - - - 2.0 - - - - - - \ No newline at end of file diff --git a/Tests/MySql.EntityFrameworkCore.Basic.Tests/Properties/AssemblyInfo.cs b/Tests/MySql.EntityFrameworkCore.Basic.Tests/Properties/AssemblyInfo.cs deleted file mode 100644 index abc8a9121..000000000 --- a/Tests/MySql.EntityFrameworkCore.Basic.Tests/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Reflection; -using System.Runtime.CompilerServices; -using 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. -[assembly: AssemblyTitle("MySql.Data.EntityFrameworkCore.Tests")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Oracle")] -[assembly: AssemblyProduct("MySql.Data.EntityFrameworkCore.Tests")] -[assembly: AssemblyCopyright("Copyright © 2016, Oracle and/or its affiliates. All rights reserved.")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("a4c0a8f2-5e48-4227-a712-bf8ae7446101")] -[assembly: AssemblyKeyName("ConnectorNet")] -#if !NETCORE10 -[assembly: AssemblyDelaySign(true)] -[assembly: AssemblyKeyFileAttribute(@"..\..\ConnectorNetPublicKey.snk")] -#endif - diff --git a/Tests/MySql.EntityFrameworkCore.Basic.Tests/Properties/DatabaseSetup.sql b/Tests/MySql.EntityFrameworkCore.Basic.Tests/Properties/DatabaseSetup.sql deleted file mode 100644 index 214f6abe8..000000000 --- a/Tests/MySql.EntityFrameworkCore.Basic.Tests/Properties/DatabaseSetup.sql +++ /dev/null @@ -1,13 +0,0 @@ -DROP USER 'test'; -create user 'test'@'localhost' identified by 'test'; -grant all privileges on *.* to 'test'@'localhost'; -flush privileges; - -DROP DATABASE IF EXISTS `[database0]`; CREATE DATABASE `[database0]`; -GRANT ALL ON `[database0]`.* to 'test'@'localhost' IDENTIFIED BY 'test'; -GRANT ALL ON `[database0]`.* to 'test'@'%' IDENTIFIED BY 'test'; -FLUSH PRIVILEGES; - -SET GLOBAL max_allowed_packet = 1048576; - -FLUSH PRIVILEGES; \ No newline at end of file diff --git a/Tests/MySql.EntityFrameworkCore.Basic.Tests/ShadowPropertiesTests.cs b/Tests/MySql.EntityFrameworkCore.Basic.Tests/ShadowPropertiesTests.cs deleted file mode 100644 index 5a81f363b..000000000 --- a/Tests/MySql.EntityFrameworkCore.Basic.Tests/ShadowPropertiesTests.cs +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.ChangeTracking; -using Microsoft.Extensions.DependencyInjection; -using MySql.Data.EntityFrameworkCore.Tests.DbContextClasses; -using MySql.Data.MySqlClient; -using MySQL.Data.EntityFrameworkCore; -using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; -using Xunit; - -namespace MySql.Data.EntityFrameworkCore.Tests -{ - public class ShadowPropertiesTests : IDisposable - { - - ServiceCollection serviceCollection; - IServiceProvider serviceProvider; - DbContext context; - - public ShadowPropertiesTests() - { - serviceCollection = new ServiceCollection(); - serviceCollection.AddEntityFrameworkMySQL() - .AddDbContext(); - - serviceProvider = serviceCollection.BuildServiceProvider(); - context = serviceProvider.GetRequiredService(); - context.Database.EnsureCreated(); - } - - - [Fact] - public void CanUseShadowPropertyWhenUpdatingEntry() - { - Assert.False(context.Database.EnsureCreated()); - var ad = new Address { Street = "New street two", City = "Chicago" }; - var g = new Guest { Name = "Guest number two", Address = ad }; - context.Set().Add(g); - context.SaveChanges(); - - // update entry - var entry = context.Set().Where(t => t.Name.Equals("Guest number two")).First(); - Assert.False(entry == null); - - entry.Name = "Guest number two updated"; - context.SaveChanges(); - - // check data using MySqlCommand - using (var cnn = new MySqlConnection(context.Database.GetDbConnection().ConnectionString)) - { - if (cnn.State != ConnectionState.Open) - cnn.Open(); - - var cmd = new MySqlCommand("Select UpdatedAt from Guests where IdGuest=" + entry.IdGuest, cnn); - var updatedAt = cmd.ExecuteScalar(); - Assert.False(updatedAt == null); - Assert.True(((DateTime)updatedAt).Date.CompareTo(DateTime.Now.Date) == 0); - } - } - - [Fact] - public void CanUseShadowPropertyWhenAddingEntry() - { - - Assert.False(context.Database.EnsureCreated()); - var ad = new Address { Street = "New street", City = "Oregon" }; - var g = new Guest { Name = "Guest number one", Address = ad }; - context.Set().Add(g); - - context.SaveChanges(); - - // check data using MySqlCommand - using (var cnn = new MySqlConnection(context.Database.GetDbConnection().ConnectionString)) - { - if (cnn.State != ConnectionState.Open) - cnn.Open(); - - var cmd = new MySqlCommand("Select CreatedAt from Guests Limit 1", cnn); - var createdAt = cmd.ExecuteScalar(); - Assert.False(createdAt == null); - Assert.True(((DateTime)createdAt).Date.CompareTo(DateTime.Now.Date) == 0); - } - } - - public void Dispose() - { - context.Database.EnsureDeleted(); - } - } -} diff --git a/Tests/MySql.EntityFrameworkCore.Basic.Tests/Utils/EntityTestsFixtureClass.cs b/Tests/MySql.EntityFrameworkCore.Basic.Tests/Utils/EntityTestsFixtureClass.cs deleted file mode 100644 index ab3e0706e..000000000 --- a/Tests/MySql.EntityFrameworkCore.Basic.Tests/Utils/EntityTestsFixtureClass.cs +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright © 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Text; -using System.Diagnostics; -using Microsoft.Extensions.DependencyInjection; -using Xunit; -using System.Linq; -using MySql.Data.EntityFrameworkCore.Tests.DbContextClasses; -using MySql.Data.EntityFrameworkCore; -using MySql.Data.MySqlClient; - -namespace MySql.Data.EntityFrameworkCore.Tests -{ - public class EntityTestsFixtureClass : IDisposable - { - // A trace listener to use during testing. - private AssertFailTraceListener asertFailListener = new AssertFailTraceListener(); - private readonly IServiceProvider _serviceProvider; - - - public EntityTestsFixtureClass() - { - //TODO check if we still need this listener - // Replace existing listeners with listener for testing. - Trace.Listeners.Clear(); - Trace.Listeners.Add(this.asertFailListener); - - var serviceCollection = new ServiceCollection(); - - serviceCollection.AddDbContext(); - - _serviceProvider = serviceCollection.BuildServiceProvider(); - - } - - //public void CreateContext(MySQLTestStore testStore) - //{ - // var optionsBuilder = new DbContextOptionsBuilder(); - // optionsBuilder.UseMySQL(MySQLTestStore.CreateConnectionString(_databaseName)); - - // using (var context = new TestsContext(optionsBuilder.Options)) - // { - // context.Database.EnsureDeleted(); - // context.Database.EnsureCreated(); - // } - //} - - public void Dispose() - { - // ensure database deletion - using (var cnn = new MySqlConnection(MySQLTestStore.baseConnectionString)) - { - cnn.Open(); - var cmd = new MySqlCommand("DROP DATABASE IF EXISTS test", cnn); - cmd.ExecuteNonQuery(); - } - } - - - protected internal void CheckSql(string sql, string refSql) - { - StringBuilder str1 = new StringBuilder(); - StringBuilder str2 = new StringBuilder(); - foreach (char c in sql) - if (!Char.IsWhiteSpace(c)) - str1.Append(c); - foreach (char c in refSql) - if (!Char.IsWhiteSpace(c)) - str2.Append(c); - Assert.Equal(0, String.Compare(str1.ToString(), str2.ToString(), true)); - } - - - private class AssertFailTraceListener : DefaultTraceListener - { - public override void Fail(string message) - { - //Assert.Fail("Assertion failure: " + message); - } - - public override void Fail(string message, string detailMessage) - { - //Assert.Fail("Assertion failure: " + detailMessage); - } - } - } - - //public static class ExtensionMethods - //{ - // public static string ToTraceString(this IQueryable t) - // { - // // try to cast to ObjectQuery - // //ObjectQuery oqt = t as ObjectQuery; - // //if (oqt != null) - // // return oqt.ToTraceString(); - // return ""; - // } - //} -} diff --git a/Tests/MySql.EntityFrameworkCore.Basic.Tests/Utils/MySqlTestStore.cs b/Tests/MySql.EntityFrameworkCore.Basic.Tests/Utils/MySqlTestStore.cs deleted file mode 100644 index 99481f9e5..000000000 --- a/Tests/MySql.EntityFrameworkCore.Basic.Tests/Utils/MySqlTestStore.cs +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using Microsoft.EntityFrameworkCore; -using MySql.Data.MySqlClient; -using MySQL.Data.EntityFrameworkCore.Extensions; -using System; -using System.IO; -using System.Reflection; - -namespace MySql.Data.EntityFrameworkCore.Tests -{ - - public class MyTestContext : DbContext - { - public MyTestContext() - { - } - - public MyTestContext(DbContextOptions options): base(options) - { - } - - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) - { - // get the class name of the caller to get a unique name for the database - string name = $"db-{this.GetType().Name}"; - optionsBuilder.UseMySQL(MySQLTestStore.rootConnectionString + ";database=" + name + ";"); - } - } - - public class MySQLTestStore : IDisposable - { -#if NETCORE10 - static string pathandfile = Path.GetFullPath(@"../..") + @"/appsettings.json"; - private static ConfigUtils config = new ConfigUtils(pathandfile); -#endif - - public static string baseConnectionString - { - get - { - return $"server=localhost;user id=root;password=;port={Port()};sslmode=Required;"; - } - } - - public static string rootConnectionString - { - get - { - return $"server=localhost;user id=root;password=;port={Port()};sslmode=Required;"; - } - } - - private static string Port() - { - - string port = string.Empty; - -#if NETCORE10 - port = config.GetPort(); -#else - port= "3305"; -#endif - - if (!string.IsNullOrEmpty(port)) - { - return port; - } - - return "3306"; - } - - public static void CreateDatabase(string databaseName, string script = null) - { - if (script != null) - { - Assembly executingAssembly = Assembly.GetEntryAssembly(); - Stream stream = executingAssembly.GetManifestResourceStream("MySql.Data.Entity.Tests.Properties.DatabaseSetup.sql"); - StreamReader sr = new StreamReader(stream); - string sql = sr.ReadToEnd(); - sr.Dispose(); - sql = sql.Replace("[database0]", databaseName); - - //execute - using (var cnn = new MySqlConnection(rootConnectionString)) - { - cnn.Open(); - MySqlScript s = new MySqlScript(cnn, sql); - s.Execute(); - } - } - } - - public static string CreateConnectionString(string databasename) - { - MySqlConnectionStringBuilder csb = new MySqlConnectionStringBuilder(); - csb.Database = databasename; - csb.Port = Convert.ToUInt32(Port()); - csb.UserID = "test"; - csb.Password = "test"; - csb.Server = "localhost"; - csb.SslMode = MySqlSslMode.None; - - return csb.ConnectionString; - } - - private void DeleteDatabase(string name) - { - using (var cnn = new MySqlConnection(rootConnectionString)) - { - cnn.Open(); - var cmd = new MySqlCommand(string.Format("DROP database {0}", name), cnn); - cmd.ExecuteNonQuery(); - } - - } - - public void Dispose() - { - //nothing to do yet - } - - } -} - diff --git a/Tests/MySql.EntityFrameworkCore.Basic.Tests/project.json b/Tests/MySql.EntityFrameworkCore.Basic.Tests/project.json deleted file mode 100644 index b6c0dcef8..000000000 --- a/Tests/MySql.EntityFrameworkCore.Basic.Tests/project.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "version": "7.0.7-m6", - "description": "MySql.EntityFrameworkCore.Basic.Tests Class Library", - "authors": [ - "Oracle" - ], - "copyright": "Copyright © 2016, 2017, Oracle and/or its affiliates. All rights reserved.", - "preserveCompilationContext": true, - "packOptions": { - "projectUrl": "http://dev.mysql.com/downloads/", - "licenseUrl": "http://www.gnu.org/licenses/old-licenses/gpl-2.0.html", - "iconUrl": "http://www.mysql.com/common/logos/logo-mysql-170x115.png", - "tags": [ - "MySql", - ".NET Connector", - "MySql Connector/NET", - "netcore", - ".Net Core", - "MySql Conector/Net Core", - "coreclr", - "C/NET", - "C/Net Core", - "EF", - "Entity Framework" - ], - "requireLicenseAcceptance": true - }, - "buildOptions": { - }, - "dependencies": { - "dotnet-test-xunit": "2.2.0-*", - "xunit": "2.2.0-*", - "MySql.Data": { - "target": "project" - }, - "MySql.Data.EntityFrameworkCore": { - "target": "project" - }, - "Microsoft.EntityFrameworkCore": "1.1.0", - "Microsoft.EntityFrameworkCore.Relational": "1.1.0" - }, - "frameworks": { - "netcoreapp1.0": { - "imports": [ - "dnxcore50" - ], - "buildOptions": { - "define": [ "NETCORE10" ], - "compile": { - "include": [ "../*.cs" ] - }, - "warningsAsErrors": false, - "nowarn": [ "CS1591" ], - "keyFile": "../../ConnectorNetPublicKey.snk", - "delaySign": true, - "publicSign": false - }, - "dependencies": { - "Microsoft.NETCore.App": { - "type": "platform", - "version": "1.0.0" - } - } - }, - "net451": { - - } - }, - "configurations": { - "Debug": { - "buildOptions": { - "define": [ "DEBUG" ], - "optimize": false, - "preserveCompilationContext": true - } - }, - "Release": { - "buildOptions": { - "define": [ "RELEASE" ], - "optimize": true, - "preserveCompilationContext": true, - "xmlDoc": true - } - } - }, - - "testRunner": "xunit" -} \ No newline at end of file diff --git a/Tests/MySql.EntityFrameworkCore.Migrations.Tests/.vscode/launch.json b/Tests/MySql.EntityFrameworkCore.Migrations.Tests/.vscode/launch.json deleted file mode 100644 index 2a54b49e2..000000000 --- a/Tests/MySql.EntityFrameworkCore.Migrations.Tests/.vscode/launch.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "name": ".NET Core Launch (console)", - "type": "coreclr", - "request": "launch", - "preLaunchTask": "build", - "program": "${workspaceRoot}/bin/Debug//", - "args": [], - "cwd": "${workspaceRoot}", - "externalConsole": false, - "stopAtEntry": false - }, - { - "name": ".NET Core Attach", - "type": "coreclr", - "request": "attach", - "processId": 0 - } - ] -} \ No newline at end of file diff --git a/Tests/MySql.EntityFrameworkCore.Migrations.Tests/.vscode/tasks.json b/Tests/MySql.EntityFrameworkCore.Migrations.Tests/.vscode/tasks.json deleted file mode 100644 index 67d6eb75c..000000000 --- a/Tests/MySql.EntityFrameworkCore.Migrations.Tests/.vscode/tasks.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "version": "0.1.0", - "command": "dotnet", - "isShellCommand": true, - "args": [], - "tasks": [ - { - "taskName": "build", - "args": [], - "isBuildCommand": true, - "problemMatcher": "$msCompile" - } - ] -} \ No newline at end of file diff --git a/Tests/MySql.EntityFrameworkCore.Migrations.Tests/App.config b/Tests/MySql.EntityFrameworkCore.Migrations.Tests/App.config deleted file mode 100644 index aa6744560..000000000 --- a/Tests/MySql.EntityFrameworkCore.Migrations.Tests/App.config +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Tests/MySql.EntityFrameworkCore.Migrations.Tests/MySQLHistoryRepositoryTests.cs b/Tests/MySql.EntityFrameworkCore.Migrations.Tests/MySQLHistoryRepositoryTests.cs deleted file mode 100644 index 812b67004..000000000 --- a/Tests/MySql.EntityFrameworkCore.Migrations.Tests/MySQLHistoryRepositoryTests.cs +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Migrations.Internal; -using Microsoft.EntityFrameworkCore.Storage; -using Microsoft.EntityFrameworkCore.Storage.Internal; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using MySql.Data.EntityFrameworkCore.Storage.Internal; -using MySql.Data.EntityFrameworkCore.Tests; -using MySql.EntityFrameworkCore.Migrations.Tests.Utilities; -using MySQL.Data.EntityFrameworkCore; -using MySQL.Data.EntityFrameworkCore.Extensions; -using MySQL.Data.EntityFrameworkCore.Infraestructure.Internal; -using MySQL.Data.EntityFrameworkCore.Metadata; -using MySQL.Data.EntityFrameworkCore.Migrations; -using MySQL.Data.EntityFrameworkCore.Migrations.Internal; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Threading.Tasks; -using Xunit; - -namespace MySql.EntityFrameworkCore.Migrations.Tests -{ - public class MySQLHistoryRepositoryTests - { - [Fact] - public void GetBeginIfNotExistsScript_works() - { - var repository = CreateHistoryRepository(); - var script = repository.GetBeginIfNotExistsScript("Migration1"); - } - - [Fact] - public void GetBeginIfExistsScript_works() - { - var repository = CreateHistoryRepository(); - var script = repository.GetBeginIfExistsScript("Migration1"); - } - - [Fact] - public void CanCreateDatabase() - { - var repository = CreateHistoryRepository(); - var serviceCollection = new ServiceCollection(); - serviceCollection.AddEntityFrameworkMySQL() - .AddDbContext(); - - var serviceProvider = serviceCollection.BuildServiceProvider(); - - var context = serviceProvider.GetRequiredService(); - - - var creator = context.GetService(); - var cmdBuilder = context.GetService(); - Assert.False(creator.Exists()); - Assert.Equal("IF EXISTS(SELECT * FROM `__EFMigrationsHistory` WHERE `MigrationId` = 'MigrationId')\r\nBEGIN", - cmdBuilder.Build(repository.GetBeginIfExistsScript("MigrationId")).CommandText); - } - - private static IHistoryRepository CreateHistoryRepository() - { - var optionsBuilder = new DbContextOptionsBuilder(); - optionsBuilder.UseMySQL(MySQLTestStore.rootConnectionString + "database=test;"); - var connection = new MySQLServerConnection(optionsBuilder.Options, new Logger(new LoggerFactory())); - - var annotationsProvider = new MySQLAnnotationProvider(); - var sqlGenerator = new MySQLSqlGenerationHelper(); - var typeMapper = new MySQLTypeMapper(); - - var serviceCollection = new ServiceCollection(); - serviceCollection.AddEntityFrameworkMySQL() - .AddDbContext(); - - var serviceProvider = serviceCollection.BuildServiceProvider(); - - var context = serviceProvider.GetRequiredService(); - - - var creator = context.GetService(); - var cmdBuilder = context.GetService(); - - - return new MySQLHistoryRepository( - creator, - cmdBuilder, - connection, - new DbContextOptions( - new Dictionary - { - { typeof(MySQLOptionsExtension), new MySQLOptionsExtension() } - }), - new MigrationsModelDiffer( - new MySQLTypeMapper(), - annotationsProvider, - new MySQLMigrationsAnnotationProvider()), - new MySQLMigrationsSqlGenerator( - new RelationalCommandBuilderFactory( - new FakeSensitiveDataLogger(), - new DiagnosticListener("FakeListener"), - typeMapper), - new MySQLSqlGenerationHelper(), - typeMapper, - annotationsProvider), - annotationsProvider, - sqlGenerator); - - } - } -} diff --git a/Tests/MySql.EntityFrameworkCore.Migrations.Tests/MySQLMigrationsTests.cs b/Tests/MySql.EntityFrameworkCore.Migrations.Tests/MySQLMigrationsTests.cs deleted file mode 100644 index 651836ea6..000000000 --- a/Tests/MySql.EntityFrameworkCore.Migrations.Tests/MySQLMigrationsTests.cs +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - - -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.Extensions.DependencyInjection; -using MySql.Data.EntityFrameworkCore.Tests; -using MySQL.Data.EntityFrameworkCore; -using MySQL.Data.EntityFrameworkCore.Extensions; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Xunit; - -namespace MySql.EntityFrameworkCore.Migrations.Tests -{ - public class MySQLMigrationsTests - { - - [Fact] - public void Can_generate_migration_from_initial_database_to_initial() - { - // create the context - var optionsBuilder = new DbContextOptionsBuilder(); - optionsBuilder.UseMySQL(MySQLTestStore.rootConnectionString + "database=test;"); - - using (var mytestContext = new MyTestContext(optionsBuilder.Options)) - { - var migrator = mytestContext.GetInfrastructure().GetRequiredService(); - - migrator.GenerateScript(fromMigration: Migration.InitialDatabase, toMigration: Migration.InitialDatabase); - } - } - - } -} diff --git a/Tests/MySql.EntityFrameworkCore.Migrations.Tests/MySql.EntityFrameworkCore.Migrations.Tests.csproj b/Tests/MySql.EntityFrameworkCore.Migrations.Tests/MySql.EntityFrameworkCore.Migrations.Tests.csproj deleted file mode 100644 index 28a8389bc..000000000 --- a/Tests/MySql.EntityFrameworkCore.Migrations.Tests/MySql.EntityFrameworkCore.Migrations.Tests.csproj +++ /dev/null @@ -1,88 +0,0 @@ - - - - - true - full - false - $(TargetFrameworkVersion)\ - obj\$(TargetFrameworkVersion)\ - obj\$(TargetFrameworkVersion)\ - bin\$(TargetFrameworkVersion)\Debug\ - DEBUG;$(DefineConstants) - prompt - 4 - AllRules.ruleset - false - - - pdbonly - true - $(TargetFrameworkVersion)\ - obj\$(TargetFrameworkVersion)\ - obj\$(TargetFrameworkVersion)\ - bin\$(TargetFrameworkVersion)\Release\ - $(DefineConstants) - prompt - 4 - AllRules.ruleset - false - - - {6C93E9D4-99D8-4E47-BF04-43B9DCDD676E} - v4.5.1 - - - - Library - - - - - - - - - - - - - - - - - - - - - - - - - Always - - - - - - - {11e455ee-8ba8-466c-b8d6-5e5edb0767fc} - MySql.Data.EntityFrameworkCore - - - {0F441D9D-9ABB-47CE-991D-FCF70A912866} - MySql.EntityFrameworkCore.Basic.Tests - - - - - - - - \ No newline at end of file diff --git a/Tests/MySql.EntityFrameworkCore.Migrations.Tests/MySql.EntityFrameworkCore.Migrations.Tests.xproj b/Tests/MySql.EntityFrameworkCore.Migrations.Tests/MySql.EntityFrameworkCore.Migrations.Tests.xproj deleted file mode 100644 index f239c2df4..000000000 --- a/Tests/MySql.EntityFrameworkCore.Migrations.Tests/MySql.EntityFrameworkCore.Migrations.Tests.xproj +++ /dev/null @@ -1,22 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - accd7f4b-a8e5-4642-bfd3-cdd2e3f52495 - MySql.EntityFrameworkCore.Migrations.Tests - .\obj - .\bin\ - v4.6.1 - - - 2.0 - - - - - - \ No newline at end of file diff --git a/Tests/MySql.EntityFrameworkCore.Migrations.Tests/MySqlMigrationsGeneratorTest.cs b/Tests/MySql.EntityFrameworkCore.Migrations.Tests/MySqlMigrationsGeneratorTest.cs deleted file mode 100644 index b75df6328..000000000 --- a/Tests/MySql.EntityFrameworkCore.Migrations.Tests/MySqlMigrationsGeneratorTest.cs +++ /dev/null @@ -1,141 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.Internal; -using MySql.Data.EntityFrameworkCore.Storage.Internal; -using MySql.EntityFrameworkCore.Migrations.Tests.Utilities; -using MySQL.Data.EntityFrameworkCore; -using MySQL.Data.EntityFrameworkCore.Metadata; -using MySQL.Data.EntityFrameworkCore.Migrations; -using System.Diagnostics; -using Xunit; - -namespace MySql.EntityFrameworkCore.Migrations.Tests -{ - public class MySQLMigrationsGeneratorTest : MySQLMigrationsGeneratorTestBase - { - - protected override IMigrationsSqlGenerator SqlGenerator - { - get - { - var typeMapper = new MySQLTypeMapper(); - - return new MySQLMigrationsSqlGenerator( - new RelationalCommandBuilderFactory( - new FakeSensitiveDataLogger(), - new DiagnosticListener("FakeListener"), - typeMapper), new MySQLSqlGenerationHelper(), typeMapper, - new MySQLAnnotationProvider()); - } - } - - [Fact] - public override void CreateTableOperation() - { - base.CreateTableOperation(); - - Assert.Equal( - "CREATE TABLE `People` (" + EOL + - " `Id` int NOT NULL AUTO_INCREMENT," + EOL + - " `EmployerId` int," + EOL + - " `SSN` char(11)," + EOL + - " PRIMARY KEY (`Id`)," + EOL + - " UNIQUE (`SSN`)," + EOL + - " FOREIGN KEY (`EmployerId`) REFERENCES `Companies` (`Id`)" + EOL + - ");" + EOL, - Sql); - } - - [Fact] - public override void AddColumnOperation_with_maxLength() - { - base.AddColumnOperation_with_maxLength(); - Assert.Equal("ALTER TABLE `Person` ADD `Name` nvarchar(30);" + EOL, Sql); - } - - [Fact] - public override void AddColumnOperationWithComputedValueSql() - { - base.AddColumnOperationWithComputedValueSql(); - Assert.Equal("ALTER TABLE `People` ADD `DisplayName` varchar(50) AS (CONCAT_WS(' ', LastName , FirstName));" + EOL, Sql); - } - - [Fact] - public override void AddColumnOperationWithDefaultValueSql() - { - base.AddColumnOperationWithDefaultValueSql(); - Assert.Equal("ALTER TABLE `People` ADD `Timestamp` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP;" + EOL, Sql); - } - - [Fact] - public override void AlterColumnOperation() - { - base.AlterColumnOperation(); - Assert.Equal("ALTER TABLE Person MODIFY `Age` int NOT NULL DEFAULT 7;" + EOL, Sql); - } - - - [Fact] - public override void AlterColumnOperationWithoutType() - { - base.AlterColumnOperationWithoutType(); - Assert.Equal("ALTER TABLE Person MODIFY `Age` int NOT NULL;" + EOL, Sql); - } - - [Fact] - public override void RenameTableOperationInSchema() - { - base.RenameTableOperationInSchema(); - Assert.Equal("ALTER TABLE t1 RENAME t2;" + EOL, Sql); - } - - [Fact] - public override void CreateUniqueIndexOperation() - { - base.CreateUniqueIndexOperation(); - Assert.Equal("CREATE UNIQUE INDEX `IXPersonName` ON Person (`FirstName`, `LastName`);" + EOL, Sql); - } - - [Fact] - public override void CreateNonUniqueIndexOperation() - { - base.CreateNonUniqueIndexOperation(); - - Assert.Equal("CREATE INDEX `IXPersonName` ON Person (`Name`);" + EOL, Sql); - } - - [Fact(Skip = "Rename index not supported yet")] - public override void RenameIndexOperation() - { - base.RenameIndexOperation(); - Assert.Equal("DROP INDEX IXPersonName ON Person; CREATE INDEX IXNombre;" + EOL, Sql); - } - - public override void DropIndexOperation() - { - base.DropIndexOperation(); - Assert.Equal("DROP INDEX IXPersonName ON Person;" + EOL, Sql); - } - } -} diff --git a/Tests/MySql.EntityFrameworkCore.Migrations.Tests/MySqlMigrationsGeneratorTestBase.cs b/Tests/MySql.EntityFrameworkCore.Migrations.Tests/MySqlMigrationsGeneratorTestBase.cs deleted file mode 100644 index e9e01ab14..000000000 --- a/Tests/MySql.EntityFrameworkCore.Migrations.Tests/MySqlMigrationsGeneratorTestBase.cs +++ /dev/null @@ -1,270 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Migrations.Operations; -using MySql.EntityFrameworkCore.Migrations.Tests.Utilities; -using MySQL.Data.EntityFrameworkCore.Metadata; -using MySQL.Data.EntityFrameworkCore.Metadata.Internal; -using System; -using System.Linq; -using Xunit; - -namespace MySql.EntityFrameworkCore.Migrations.Tests -{ - public abstract class MySQLMigrationsGeneratorTestBase - { - protected abstract IMigrationsSqlGenerator SqlGenerator { get; } - protected virtual string Sql { get; set; } - protected static string EOL => Environment.NewLine; - - [Fact] - public virtual void CreateTableOperation() - { - Generate( - new CreateTableOperation - { - Name = "People", - Schema = null, - Columns = - { - new AddColumnOperation - { - Name = "Id", - ClrType = typeof(int), - IsNullable = false, - [MySQLAnnotationNames.Prefix + MySQLAnnotationNames.AutoIncrement] = true - }, - new AddColumnOperation - { - Name = "EmployerId", - ClrType = typeof(int), - IsNullable = true - }, - new AddColumnOperation - { - Name = "SSN", - ClrType = typeof(string), - ColumnType = "char(11)", - IsNullable = true - } - }, - PrimaryKey = new AddPrimaryKeyOperation - { - Table = "People", - Columns = new[] { "Id" } - }, - UniqueConstraints = - { - new AddUniqueConstraintOperation - { - Columns = new[] { "SSN" } - } - }, - ForeignKeys = - { - new AddForeignKeyOperation - { - Columns = new[] { "EmployerId" }, - PrincipalTable = "Companies", - PrincipalColumns = new[] { "Id" } - } - } - }); - } - - - [Fact] - public void AddColumnOperation() - { - Generate(new AddColumnOperation - { - Table = "People", - Schema = null, - Name = "Name", - ClrType = typeof(string), - ColumnType = "varchar(50)", - IsNullable = false - } - ); - } - - - [Fact] - public virtual void AddColumnOperationWithComputedValueSql() - { - Generate(new AddColumnOperation - { - Table = "People", - Schema = null, - Name = "DisplayName", - ClrType = typeof(string), - ColumnType = "varchar(50)", - IsNullable = false, - ComputedColumnSql = "CONCAT_WS(' ', LastName , FirstName)" - } - ); - } - - [Fact] - public virtual void AddColumnOperationWithDefaultValueSql() - { - Generate(new AddColumnOperation - { - Table = "People", - Schema = null, - Name = "Timestamp", - ClrType = typeof(DateTime), - ColumnType = "datetime", - IsNullable = false, - DefaultValueSql = "CURRENT_TIMESTAMP" - } - ); - } - - - [Fact] - public virtual void AddColumnOperation_with_maxLength() - { - Generate( - modelBuilder => modelBuilder.Entity("Person").Property("Name").HasMaxLength(30), - new AddColumnOperation - { - Table = "Person", - Name = "Name", - ClrType = typeof(string), - IsNullable = true - }); - - } - - - [Fact] - public virtual void AlterColumnOperation() - { - Generate(new AlterColumnOperation - { - Table = "Person", - Schema = "", - Name = "Age", - ClrType = typeof(int), - ColumnType = "int", - IsNullable = false, - DefaultValue = 7 - }); - } - - - [Fact] - public virtual void AlterColumnOperationWithoutType() - { - Generate( - new AlterColumnOperation - { - Table = "Person", - Name = "Age", - ClrType = typeof(int) - }); - } - - - [Fact] - public virtual void RenameTableOperationInSchema() - { - Generate( - new RenameTableOperation - { - Name = "t1", - Schema = "", - NewName = "t2", - NewSchema = "" - }); - } - - [Fact] - public virtual void CreateUniqueIndexOperation() - { - Generate( - new CreateIndexOperation - { - Name = "IXPersonName", - Table = "Person", - Schema = "", - Columns = new[] { "FirstName", "LastName" }, - IsUnique = true - }); - } - - - [Fact] - public virtual void CreateNonUniqueIndexOperation() - { - Generate( - new CreateIndexOperation - { - Name = "IXPersonName", - Table = "Person", - Columns = new[] { "Name" }, - IsUnique = false - }); - } - - [Fact] - public virtual void RenameIndexOperation() - { - Generate( - new RenameIndexOperation - { - Name = "IXPersonName", - Table = "Person", - NewName = "IXNombre" - }); - } - - [Fact] - public virtual void DropIndexOperation() - { - Generate( - new DropIndexOperation - { - Name = "IXPersonName", - Table = "Person" - }); - } - - protected virtual void Generate(MigrationOperation operation) - { - Generate(_ => { }, new[] { operation }); - } - - protected virtual void Generate(Action buildAction, params MigrationOperation[] operation) - { - var modelBuilder = ContextUtils.Instance.CreateModelBuilder(); - buildAction(modelBuilder); - - var batch = SqlGenerator.Generate(operation, modelBuilder.Model); - - Sql = string.Join(EOL, batch.Select(b => b.CommandText)); - } - } -} diff --git a/Tests/MySql.EntityFrameworkCore.Migrations.Tests/Properties/AssemblyInfo.cs b/Tests/MySql.EntityFrameworkCore.Migrations.Tests/Properties/AssemblyInfo.cs deleted file mode 100644 index 2861ec724..000000000 --- a/Tests/MySql.EntityFrameworkCore.Migrations.Tests/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Reflection; -using System.Runtime.CompilerServices; -using 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. -[assembly: AssemblyTitle("MySql.Data.EntityFrameworkCore.Migrations.Tests")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Oracle")] -[assembly: AssemblyProduct("MySql.Data.EntityFrameworkCore.Migrations.Tests")] -[assembly: AssemblyCopyright("Copyright © 2016, Oracle and/or its affiliates. All rights reserved.")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("accd7f4b-a8e5-4642-bfd3-cdd2e3f52495")] - - -#if !NETCORE10 -[assembly: AssemblyDelaySign(true)] -[assembly: AssemblyKeyFileAttribute(@"..\..\ConnectorNetPublicKey.snk")] -#endif -[assembly: AssemblyKeyName("ConnectorNet")] diff --git a/Tests/MySql.EntityFrameworkCore.Migrations.Tests/Utilities/ContextUtils.cs b/Tests/MySql.EntityFrameworkCore.Migrations.Tests/Utilities/ContextUtils.cs deleted file mode 100644 index c6200c664..000000000 --- a/Tests/MySql.EntityFrameworkCore.Migrations.Tests/Utilities/ContextUtils.cs +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal; -using Microsoft.EntityFrameworkCore.Storage; -using Microsoft.Extensions.DependencyInjection; -using MySql.Data.EntityFrameworkCore.Tests; -using MySQL.Data.EntityFrameworkCore; -using MySQL.Data.EntityFrameworkCore.Extensions; -using System; - -namespace MySql.EntityFrameworkCore.Migrations.Tests.Utilities -{ - public class ContextUtils - { - - protected ContextUtils() - { - } - public static ContextUtils Instance { get; } = new ContextUtils(); - - public DbContext CreateContext() => new DbContext(CreateOptions()); - - public IServiceProvider CreateContextServices() - => ((IInfrastructure)CreateContext()).Instance; - - private IServiceProvider CreateServiceProvider() - { - var serviceCollection = new ServiceCollection(); - serviceCollection.AddEntityFrameworkMySQL(); - - return serviceCollection.BuildServiceProvider(); - - } - - protected virtual void UseProviderOptions(DbContextOptionsBuilder optionsBuilder) => optionsBuilder.UseMySQL(MySQLTestStore.baseConnectionString); - - public DbContextOptions CreateOptions(IModel model) - { - var optionsBuilder = new DbContextOptionsBuilder(); - UseProviderOptions(optionsBuilder.UseModel(model)); - - return optionsBuilder.Options; - } - - public DbContextOptions CreateOptions() - { - var optionsBuilder = new DbContextOptionsBuilder(); - UseProviderOptions(optionsBuilder); - return optionsBuilder.Options; - } - - private ModelBuilder CreateConventionBuilder() - { - var contextServices = CreateContextServices(); - - var conventionSetBuilder = contextServices.GetRequiredService().ConventionSetBuilder; - var conventionSet = contextServices.GetRequiredService().CreateConventionSet(); - conventionSet = conventionSetBuilder == null - ? conventionSet - : conventionSetBuilder.AddConventions(conventionSet); - return new ModelBuilder(conventionSet); - } - - public ModelBuilder CreateModelBuilder() => CreateConventionBuilder(); - - - - //private ModelBuilder CreateModelBuilder() - //{ - // var contextServices = ((IInfrastructure)CreateContext()).Instance; - // var conventionSetBuilder = contextServices.GetRequiredService().ConventionSetBuilder; - // var conventionSet = contextServices.GetRequiredService().CreateConventionSet(); - // conventionSet = conventionSetBuilder == null - // ? conventionSet - // : conventionSetBuilder.AddConventions(conventionSet); - // return new ModelBuilder(conventionSet); - //} - - } -} diff --git a/Tests/MySql.EntityFrameworkCore.Migrations.Tests/Utilities/FakeSensitiveDataLogger.cs b/Tests/MySql.EntityFrameworkCore.Migrations.Tests/Utilities/FakeSensitiveDataLogger.cs deleted file mode 100644 index c72411abb..000000000 --- a/Tests/MySql.EntityFrameworkCore.Migrations.Tests/Utilities/FakeSensitiveDataLogger.cs +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.Extensions.Logging; -using System; - -namespace MySql.EntityFrameworkCore.Migrations.Tests.Utilities -{ - public class FakeSensitiveDataLogger : ISensitiveDataLogger - { - public bool LogSensitiveData { get; } - - public bool IsEnabled(LogLevel logLevel) => true; - - public IDisposable BeginScope(TState state) - { - return null; - } - - public void Log(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func formatter) - { - } - } -} diff --git a/Tests/MySql.EntityFrameworkCore.Migrations.Tests/project.json b/Tests/MySql.EntityFrameworkCore.Migrations.Tests/project.json deleted file mode 100644 index 3ba9742d1..000000000 --- a/Tests/MySql.EntityFrameworkCore.Migrations.Tests/project.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "version": "7.0.7-m6", - "description": "MySql.EntityFrameworkCore.Migrations.Tests Class Library", - "authors": [ "Oracle" ], - "copyright": "Copyright © 2016, 2017, Oracle and/or its affiliates. All rights reserved.", - "preserveCompilationContext": true, - "packOptions": { - "projectUrl": "http://dev.mysql.com/downloads/", - "licenseUrl": "http://www.gnu.org/licenses/old-licenses/gpl-2.0.html", - "iconUrl": "http://www.mysql.com/common/logos/logo-mysql-170x115.png", - "tags": [ "MySql", ".NET Connector", "MySql Connector/NET", "netcore", ".Net Core", "MySql Conector/Net Core", "coreclr", "C/NET", "C/Net Core", "EF", "Entity Framework" ], - "requireLicenseAcceptance": true - }, - "dependencies": { - "dotnet-test-xunit": "2.2.0-*", - "xunit": "2.2.0-*", - "MySql.Data": { - "target": "project" - }, - "MySql.Data.EntityFrameworkCore": { - "target": "project" - }, - "MySql.EntityFrameworkCore.Basic.Tests": { - "target": "project" - }, - "Microsoft.EntityFrameworkCore": "1.1.0", - "Microsoft.EntityFrameworkCore.Relational": "1.1.0" - }, - "frameworks": { - "netcoreapp1.0": { - "imports": [ - "dnxcore50" - ], - "buildOptions": { - "define": [ "NETCORE10" ], - "compile": { - "include": [ "../*.cs" ] - }, - "warningsAsErrors": false, - "optimize": false, - "xmlDoc": true, - "nowarn": [ "CS1591" ], - "keyFile": "../../ConnectorNetPublicKey.snk", - "delaySign": true, - "publicSign": false - }, - "dependencies": { - "Microsoft.NETCore.App": { - "type": "platform", - "version": "1.0.0" - } - } - }, - "net451": { - - } - }, - "configurations": { - "Debug": { - "buildOptions": { - "define": [ "DEBUG" ], - "optimize": false, - "preserveCompilationContext": true - } - }, - "Release": { - "buildOptions": { - "define": [ "RELEASE" ], - "optimize": true, - "preserveCompilationContext": true, - "xmlDoc": true - } - } - }, - "testRunner": "xunit" -} diff --git a/Tests/MySql.Replication.Tests/App.config b/Tests/MySql.Replication.Tests/App.config deleted file mode 100644 index a7a72b52b..000000000 --- a/Tests/MySql.Replication.Tests/App.config +++ /dev/null @@ -1,29 +0,0 @@ - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Tests/MySql.Replication.Tests/BaseTest.cs b/Tests/MySql.Replication.Tests/BaseTest.cs deleted file mode 100644 index d8c7f615e..000000000 --- a/Tests/MySql.Replication.Tests/BaseTest.cs +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright © 2013, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using NUnit.Framework; -using System.Reflection; -using MySql.Data.MySqlClient; -using System.Configuration; - -namespace MySql.LoadBalancing.Tests -{ - public class BaseTest - { - protected string databaseName; - protected int masterPort; - protected int slavePort; - protected string server; - private MySqlConnectionStringBuilder connStringRootMaster; - private MySqlConnectionStringBuilder connStringSlave; - - protected string ConnectionString - { - get - { - return string.Format("{0}database={1};", ConnectionStringNoDb, databaseName); - } - } - - protected string ConnectionStringNoDb - { - get - { - return string.Format("server={0};", server); - } - } - - protected string ConnectionStringRootMaster - { - get - { - return connStringRootMaster.ConnectionString; - } - } - - protected string ConnectionStringSlave - { - get - { - return connStringSlave.ConnectionString; - } - } - - - - public BaseTest() - { - Initialize(); - LoadBaseConfiguration(); - } - - protected void LoadBaseConfiguration() - { - string masterPortString = ValueIfEmpty(ConfigurationManager.AppSettings["masterPort"], "3305"); - string slavePortString = ValueIfEmpty(ConfigurationManager.AppSettings["slavePort"], "3307"); - server = ValueIfEmpty(ConfigurationManager.AppSettings["server"], "Group1"); - - masterPort = int.Parse(masterPortString); - slavePort = int.Parse(slavePortString); - - connStringRootMaster = new MySqlConnectionStringBuilder(); - connStringRootMaster.UserID = ValueIfEmpty(ConfigurationManager.AppSettings["rootuser"], "root"); - connStringRootMaster.Password = ValueIfEmpty(ConfigurationManager.AppSettings["rootpassword"], string.Empty); - connStringRootMaster.Server = ValueIfEmpty(ConfigurationManager.AppSettings["host"], "localhost"); - connStringRootMaster.Port = (uint)masterPort; - - connStringSlave = new MySqlConnectionStringBuilder(); - connStringSlave.UserID = ValueIfEmpty(ConfigurationManager.AppSettings["slaveUser"], "lbuser"); - connStringSlave.Password = ValueIfEmpty(ConfigurationManager.AppSettings["slavePassword"], "lbpass"); - connStringSlave.Server = ValueIfEmpty(ConfigurationManager.AppSettings["slaveHost"], "localhost"); - connStringSlave.Port = (uint)slavePort; - connStringSlave.Database = databaseName; - } - - protected virtual void Initialize() - { - // we don't use FileVersion because it's not available - // on the compact framework - string fullname = Assembly.GetExecutingAssembly().FullName; - string[] parts = fullname.Split(new char[] { '=' }); - string[] versionParts = parts[1].Split(new char[] { '.' }); - databaseName = String.Format("dblb{0}{1}", versionParts[0], versionParts[1]); - } - - [SetUp] - public void Setup() - { - using (MySqlConnection connection = new MySqlConnection(ConnectionStringRootMaster)) - { - connection.Open(); - MySqlScript script = new MySqlScript(connection); - - // Sets users - script.Query = Properties.Resources._01_Startup_root_script; - script.Execute(); - - // Sets database objects - script.Query = string.Format(Properties.Resources._02_Startup_script, databaseName); - script.Execute(); - } - } - - //[TearDown] - public void Teardown() - { - using (MySqlConnection connection = new MySqlConnection(ConnectionStringRootMaster)) - { - connection.Open(); - MySqlCommand cmd = new MySqlCommand(string.Empty, connection); - - cmd.CommandText = "DROP USER lbuser@localhost;"; - cmd.CommandText += "DROP DATABASE IF EXISTS " + databaseName; - cmd.ExecuteNonQuery(); - } - } - - protected MySqlDataReader ExecuteQuery(MySqlConnection connection, string query) - { - MySqlCommand cmd = new MySqlCommand(query, connection); - return cmd.ExecuteReader(); - } - - protected int ExecuteNonQuery(MySqlConnection connection, string query) - { - MySqlCommand cmd = new MySqlCommand(query, connection); - return cmd.ExecuteNonQuery(); - } - - private string ValueIfEmpty(string value, string valueIfEmtpy) - { - if (string.IsNullOrEmpty(value)) return valueIfEmtpy; - return value; - } - } -} diff --git a/Tests/MySql.Replication.Tests/Properties/AssemblyInfo.cs b/Tests/MySql.Replication.Tests/Properties/AssemblyInfo.cs deleted file mode 100644 index 7c91cbe2f..000000000 --- a/Tests/MySql.Replication.Tests/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright © 2013, 2015 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System.Reflection; -using System.Runtime.CompilerServices; -using 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. -[assembly: AssemblyTitle("MySql.LoadBalancing.Tests")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Oracle Corporation")] -[assembly: AssemblyProduct("MySql.LoadBalancing.Tests")] -[assembly: AssemblyCopyright("Copyright © 2013, 2015, Oracle and/or its affiliates. All rights reserved.")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("02681727-f306-4923-8c16-717d6f1716ce")] - -[assembly: AssemblyDelaySign(true)] -[assembly: AssemblyKeyFileAttribute(@"..\..\ConnectorNetPublicKey.snk")] diff --git a/Tests/MySql.Replication.Tests/Properties/Resources.Designer.cs b/Tests/MySql.Replication.Tests/Properties/Resources.Designer.cs deleted file mode 100644 index ff6244c10..000000000 --- a/Tests/MySql.Replication.Tests/Properties/Resources.Designer.cs +++ /dev/null @@ -1,112 +0,0 @@ -//------------------------------------------------------------------------------ -// -// 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 MySql.Replication.Tests.Properties { - 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", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// 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("MySql.Replication.Tests.Properties.Resources", typeof(Resources).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 -- Users - /// - ///GRANT ALL ON *.* TO lbuser@localhost IDENTIFIED BY 'lbpass'; - /// - ///REVOKE SUPER ON *.* FROM lbuser@localhost; - ///. - /// - internal static string _01_Startup_root_script { - get { - return ResourceManager.GetString("_01_Startup_root_script", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to DROP DATABASE IF EXISTS {0}; - /// - /// - ///CREATE DATABASE {0}; - ///USE {0}; - /// - ///CREATE TABLE items ( - /// item_id int primary key auto_increment, - /// description varchar(50) not null, - /// brand varchar(50), - /// price float not null, - /// quantity int not null - ///); - /// - ///CREATE TABLE stores( - /// store_id int primary key auto_increment, - /// name varchar(50) not null, - /// address varchar(100) - ///); - /// - ///CREATE TABLE employees( - /// employee_id int primary key auto_increment, - /// name varchar(50) not null, - /// store_id int, - /// active bool - ///); - /// [rest of string was truncated]";. - /// - internal static string _02_Startup_script { - get { - return ResourceManager.GetString("_02_Startup_script", resourceCulture); - } - } - } -} diff --git a/Tests/MySql.Replication.Tests/ReplicationTest.cs b/Tests/MySql.Replication.Tests/ReplicationTest.cs deleted file mode 100644 index 476352d3f..000000000 --- a/Tests/MySql.Replication.Tests/ReplicationTest.cs +++ /dev/null @@ -1,240 +0,0 @@ -// Copyright © 2013, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using MySql.Data.MySqlClient; -using Xunit; -using System.Diagnostics; -using MySql.Data; - -namespace MySql.Replication.Tests -{ - public class ReplicationTest : IUseFixture, IDisposable - { - - private SetUp st; - - public void SetFixture(SetUp data) - { - st = data; - } - - public void Dispose() - { - MySqlConnectionStringBuilder connString = new MySqlConnectionStringBuilder(st.ConnectionStringRootMaster); - connString.Database = st.databaseName; - using (MySqlConnection conn = new MySqlConnection(connString.ToString())) - { - conn.Open(); - st.ExecuteNonQuery(conn, "DELETE FROM orders"); - st.ExecuteNonQuery(conn, "DELETE FROM order_details"); - } - } - - /// - /// Validates that the slave is readonly - /// - [Fact] - public void _SlaveAsReadOnly() - { - using (MySqlConnection conn = new MySqlConnection(st.ConnectionStringSlave)) - { - conn.Open(); - MySqlException ex = Assert.Throws(() => st.ExecuteNonQuery(conn, "INSERT INTO orders VALUES(null, 1, 'James')")); - // Error 1290: The MySQL server is running with the --read-only option so - // it cannot execute this statement - Assert.Equal(1290, ex.Number); - } - } - - /// - /// Validates that each request for a connection is switched between the - /// master and slave; also validates that all non-read statements are sent - /// to the master - /// - [Fact] - public void RoundRobinWritting() - { - using (MySqlConnection conn = new MySqlConnection(st.ConnectionString)) - { - conn.Open(); - - st.ExecuteNonQuery(conn, "INSERT INTO orders VALUES(null, 1, 'James')"); - st.ExecuteNonQuery(conn, "INSERT INTO order_details VALUES(1, 1, 1, 0, 0)"); - st.ExecuteNonQuery(conn, "INSERT INTO order_details VALUES(1, 2, 1, 0, 0)"); - - Assert.Equal(st.slavePort, GetPort(conn)); - Assert.Equal(st.masterPort, GetPort(conn)); - Assert.Equal(st.slavePort, GetPort(conn)); - Assert.Equal(st.masterPort, GetPort(conn)); - - st.ExecuteNonQuery(conn, "INSERT INTO order_details VALUES(1, 3, 1, 0, 0)"); - } - } - - /// - /// Test for a master connection failure - /// - [Fact] - public void RoundRobinReadOnly() - { - using (MySqlConnection conn = new MySqlConnection("server=Group2;")) - { - conn.Open(); - - - MySqlException ex = Assert.Throws(() => st.ExecuteNonQuery(conn, "INSERT INTO orders VALUES(null, 1, 'James')")); - - Assert.Equal(Resources.Replication_NoAvailableServer, ex.Message); - - int currentPort = GetPort(conn); - Assert.True(currentPort != (currentPort = GetPort(conn)), "1st try"); - Assert.True(currentPort != (currentPort = GetPort(conn)), "2nd try"); - Assert.True(currentPort != (currentPort = GetPort(conn)), "3rd try"); - Assert.True(currentPort != (currentPort = GetPort(conn)), "4th try"); - } - } - - /// - /// Validates that data inserted in master is replicated into slave - /// - [Fact] - public void RoundRobinValidateSlaveData() - { - using (MySqlConnection conn = new MySqlConnection(st.ConnectionString)) - { - conn.Open(); - - st.ExecuteNonQuery(conn, "INSERT INTO orders VALUES(null, 2, 'Bruce')"); - } - - // Waits for replication on slave - System.Threading.Thread.Sleep(3000); - - // validates data on slave - using (MySqlConnection slaveConn = new MySqlConnection(st.ConnectionStringSlave)) - { - slaveConn.Open(); - MySqlDataReader dr = st.ExecuteQuery(slaveConn, "SELECT * FROM orders"); - Assert.True(dr.Read()); - Assert.Equal(2, dr.GetValue(1)); - Assert.Equal("Bruce", dr.GetValue(2)); - } - } - - [Fact] - public void ValidateLogging() - { - MySqlTrace.Listeners.Clear(); - MySqlTrace.Switch.Level = SourceLevels.All; - MySql.Data.MySqlClient.Tests.GenericListener listener = new MySql.Data.MySqlClient.Tests.GenericListener(); - MySqlTrace.Listeners.Add(listener); - using (MySqlConnection conn = new MySqlConnection(st.ConnectionString )) - { - conn.Open(); - - st.ExecuteNonQuery(conn, "INSERT INTO orders VALUES(null, 2, 'Bruce')"); - st.ExecuteNonQuery(conn, "INSERT INTO orders VALUES(null, 1, 'James')"); - st.ExecuteNonQuery(conn, "INSERT INTO order_details VALUES(1, 1, 1, 0, 0)"); - st.ExecuteNonQuery(conn, "INSERT INTO order_details VALUES(1, 2, 1, 0, 0)"); - } - - // Waits for replication on slave - System.Threading.Thread.Sleep(3000); - - // validates data on slave - using (MySqlConnection slaveConn = new MySqlConnection(st.ConnectionStringSlave)) - { - slaveConn.Open(); - MySqlDataReader dr = st.ExecuteQuery(slaveConn, "SELECT * FROM orders"); - Assert.True(dr.Read()); - Assert.Equal(2, dr.GetValue(1)); - Assert.Equal("Bruce", dr.GetValue(2)); - } - Debug.WriteLine("Start of tracing"); - foreach (string s in listener.Strings) - { - Debug.WriteLine(s); - } - Debug.WriteLine("End of tracing"); - } - - /// - /// When using transactions, load balancing must lock on the current server. - /// - [Fact] - public void ValidateTransactions() - { - MySqlTrace.Listeners.Clear(); - MySqlTrace.Switch.Level = SourceLevels.All; - MySql.Data.MySqlClient.Tests.GenericListener listener = new MySql.Data.MySqlClient.Tests.GenericListener(); - MySqlTrace.Listeners.Add(listener); - using (MySqlConnection conn = new MySqlConnection(st.ConnectionString)) - { - conn.Open(); - MySqlTransaction tx = conn.BeginTransaction(); - st.ExecuteNonQuery(conn, "INSERT INTO orders VALUES(null, 2, 'Bruce')"); - st.ExecuteNonQuery(conn, "INSERT INTO orders VALUES(null, 1, 'James')"); - st.ExecuteNonQuery(conn, "INSERT INTO order_details VALUES(1, 1, 1, 0, 0)"); - st.ExecuteNonQuery(conn, "INSERT INTO order_details VALUES(1, 2, 1, 0, 0)"); - tx.Commit(); - } - - // Waits for replication on slave - System.Threading.Thread.Sleep(3000); - - // validates data on slave - using (MySqlConnection slaveConn = new MySqlConnection(st.ConnectionStringSlave)) - { - slaveConn.Open(); - MySqlDataReader dr = st.ExecuteQuery(slaveConn, "SELECT * FROM orders"); - Assert.True(dr.Read()); - Assert.Equal(2, dr.GetValue(1)); - Assert.Equal("Bruce", dr.GetValue(2)); - } - Debug.WriteLine("Start of tracing"); - foreach (string s in listener.Strings) - { - Debug.WriteLine(s); - } - Debug.WriteLine("End of tracing"); - } - - #region Private methods - - private int GetPort(MySqlConnection connection) - { - MySqlDataReader dr = st.ExecuteQuery(connection, "SHOW VARIABLES LIKE 'port';"); - - dr.Read(); - int port = dr.GetInt32(1); - dr.Close(); - - return port; - } - - #endregion - } -} diff --git a/Tests/MySql.Replication.Tests/SetUp.cs b/Tests/MySql.Replication.Tests/SetUp.cs deleted file mode 100644 index 88bc05b4b..000000000 --- a/Tests/MySql.Replication.Tests/SetUp.cs +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright © 2013, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Reflection; -using MySql.Data.MySqlClient; -using System.Configuration; - -namespace MySql.Replication.Tests -{ - public class SetUp : IDisposable - { - protected internal string databaseName; - protected internal int masterPort; - protected internal int slavePort; - protected internal string groupName; - private MySqlConnectionStringBuilder connStringRootMaster; - private MySqlConnectionStringBuilder connStringSlave; - - protected internal string ConnectionString - { - get - { - return string.Format("{0}database={1};", ConnectionStringNoDb, databaseName); - } - } - - protected internal string ConnectionStringNoDb - { - get - { - return string.Format("server={0};", groupName); - } - } - - protected internal string ConnectionStringRootMaster - { - get - { - return connStringRootMaster.ConnectionString; - } - } - - protected internal string ConnectionStringSlave - { - get - { - return connStringSlave.ConnectionString; - } - } - - public SetUp() - { - Initialize(); - LoadBaseConfiguration(); - - using (MySqlConnection connection = new MySqlConnection(ConnectionStringRootMaster)) - { - connection.Open(); - MySqlScript script = new MySqlScript(connection); - - // Sets users - script.Query = Properties.Resources._01_Startup_root_script; - script.Execute(); - - // Sets database objects - script.Query = string.Format(Properties.Resources._02_Startup_script, databaseName); - script.Execute(); - } - } - - protected internal void LoadBaseConfiguration() - { - ReplicationServerGroupConfigurationElement group1 = (ConfigurationManager.GetSection("MySQL") as MySqlConfiguration).Replication.ServerGroups.ToArray()[0]; - ReplicationServerConfigurationElement masterConfiguration = group1.Servers.ToArray()[0]; - ReplicationServerConfigurationElement slaveConfiguration = group1.Servers.ToArray()[1]; - - groupName = group1.Name; - - connStringRootMaster = new MySqlConnectionStringBuilder(masterConfiguration.ConnectionString); - masterPort = (int)connStringRootMaster.Port; - - connStringSlave = new MySqlConnectionStringBuilder(slaveConfiguration.ConnectionString); - slavePort = (int)connStringSlave.Port; - connStringSlave.Database = databaseName; - } - - protected virtual void Initialize() - { - // we don't use FileVersion because it's not available - // on the compact framework - string fullname = Assembly.GetExecutingAssembly().FullName; - string[] parts = fullname.Split(new char[] { '=' }); - string[] versionParts = parts[1].Split(new char[] { '.' }); - databaseName = String.Format("dblb{0}{1}", versionParts[0], versionParts[1]); - } - - - public void Dispose() - { - using (MySqlConnection connection = new MySqlConnection(ConnectionStringRootMaster)) - { - connection.Open(); - MySqlCommand cmd = new MySqlCommand(string.Empty, connection); - - cmd.CommandText = "DROP USER lbuser@localhost;"; - cmd.CommandText += "DROP DATABASE IF EXISTS " + databaseName; - cmd.ExecuteNonQuery(); - } - } - - protected internal MySqlDataReader ExecuteQuery(MySqlConnection connection, string query) - { - MySqlCommand cmd = new MySqlCommand(query, connection); - return cmd.ExecuteReader(); - } - - protected internal int ExecuteNonQuery(MySqlConnection connection, string query) - { - MySqlCommand cmd = new MySqlCommand(query, connection); - return cmd.ExecuteNonQuery(); - } - - private string ValueIfEmpty(string value, string valueIfEmtpy) - { - if (string.IsNullOrEmpty(value)) return valueIfEmtpy; - return value; - } - } -} diff --git a/Tests/MySql.Web.Tests/App.config b/Tests/MySql.Web.Tests/App.config deleted file mode 100644 index 81d7597de..000000000 --- a/Tests/MySql.Web.Tests/App.config +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Tests/MySql.Web.Tests/MySql.Web.Tests.xproj b/Tests/MySql.Web.Tests/MySql.Web.Tests.xproj deleted file mode 100644 index 749838f41..000000000 --- a/Tests/MySql.Web.Tests/MySql.Web.Tests.xproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - 14.0.25420 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 2d54ae12-2cb6-455d-ba87-87d0df71f603 - MySql.Web.Tests - .\obj - .\bin\ - - - - 2.0 - - - \ No newline at end of file diff --git a/Tests/MySql.Web.Tests/PersonalizationTests.cs b/Tests/MySql.Web.Tests/PersonalizationTests.cs deleted file mode 100644 index 2e1f9d244..000000000 --- a/Tests/MySql.Web.Tests/PersonalizationTests.cs +++ /dev/null @@ -1,247 +0,0 @@ -// Copyright © 2014, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Data; -using MySql.Web.Common; -using MySql.Web.Security; -using System.Collections.Specialized; -using System.Configuration.Provider; -using MySql.Data.MySqlClient; -using System.Web.Security; -using System.Configuration; -using MySql.Web.Personalization; -using System.Web.UI.WebControls.WebParts; - -namespace MySql.Web.Tests -{ - public class PersonalizationTests : IUseFixture, IDisposable - { - private SetUpWeb st; - private long applicationId; - - public void SetFixture(SetUpWeb data) - { - st = data; - st.rootConn.Close(); - st.rootConn = new MySqlConnection("server=localhost;userid=root;pwd=;database=" + st.conn.Database + ";port=" + st.port); - st.rootConn.Open(); - } - - private void CreateDataForSharedScope() - { - var cmd = new MySqlCommand(); - cmd.CommandText = @"insert into my_aspnet_applications(name,description) values('\\', '\\')"; - cmd.Connection = st.conn; - cmd.ExecuteNonQuery(); - applicationId = cmd.LastInsertedId; - - // Add my_aspnet_paths - var pathId = new Guid(); - cmd.CommandText = @"insert into my_aspnet_paths(applicationId, pathid, path, loweredpath) values(" + applicationId + - ",'" + pathId.ToString() + @"', '~/default.aspx', '~/default.aspx')"; - cmd.Connection = st.conn; - cmd.ExecuteNonQuery(); - - - // personalization all users - byte[] settings = CreateBlob(1000); - - cmd.CommandText = @"insert into my_aspnet_personalizationallusers(pathid, pagesettings, lastUpdatedDate) values(" + - "'" + pathId.ToString() + "', @pageSettings, @LastUpdatedDate)"; - cmd.Parameters.AddWithValue("@pathId", pathId); - cmd.Parameters.AddWithValue("@pageSettings", settings); - cmd.Parameters.AddWithValue("@LastUpdatedDate", DateTime.UtcNow); - cmd.Connection = st.conn; - cmd.ExecuteNonQuery(); - } - - - public static byte[] CreateBlob(int size) - { - byte[] buf = new byte[size]; - - Random r = new Random(); - r.NextBytes(buf); - return buf; - } - - - private void CreateDataForUserScope() - { - var cmd = new MySqlCommand(); - cmd.CommandText = @"insert into my_aspnet_applications(name,description) values('\\', '\\')"; - cmd.Connection = st.conn; - cmd.ExecuteNonQuery(); - applicationId = cmd.LastInsertedId; - - // Add my_aspnet_paths - var pathId = new Guid(); - cmd.CommandText = @"insert into my_aspnet_paths(applicationId, pathid, path, loweredpath) values(" + applicationId + - ",'" + pathId.ToString() + @"', '~/default.aspx', '~/default.aspx')"; - cmd.Connection = st.conn; - cmd.ExecuteNonQuery(); - - // add user - cmd.CommandText = @"insert into my_aspnet_users(applicationId, name, isAnonymous, lastActivityDate) values(" + applicationId + - @",'GabPC\\Gab', 0, @LastActivityDate)"; - cmd.Connection = st.conn; - cmd.Parameters.AddWithValue("@LastActivityDate", DateTime.UtcNow); - cmd.ExecuteNonQuery(); - var userId = cmd.LastInsertedId; - - // personalization per user - byte[] settings = CreateBlob(1000); - - cmd.CommandText = @"insert into my_aspnet_personalizationperuser(applicationId, pathid, userId, pagesettings, lastUpdatedDate) values(" + - applicationId + ", '" + pathId.ToString() + "', " + userId + ", @pageSettings, @LastUpdatedDate)"; - cmd.Parameters.AddWithValue("@pageSettings", settings); - cmd.Parameters.AddWithValue("@LastUpdatedDate", DateTime.UtcNow); - cmd.Connection = st.conn; - cmd.ExecuteNonQuery(); - } - - public void Dispose() - { - st.ExecuteSQLAsRoot("Delete from my_aspnet_profiles"); - st.ExecuteSQLAsRoot("Delete from my_aspnet_users"); - st.ExecuteSQLAsRoot("Delete from my_aspnet_applications"); - st.ExecuteSQLAsRoot("Delete from my_aspnet_personalizationperuser"); - st.ExecuteSQLAsRoot("Delete from my_aspnet_paths"); - st.ExecuteSQLAsRoot("Delete from my_aspnet_personalizationallusers"); - } - - private MySqlPersonalizationProvider InitPersonalizationProvider() - { - MySqlPersonalizationProvider p = new MySqlPersonalizationProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("applicationName", @"\"); - config.Add("description", @"\"); - config.Add("autogenerateschema", "true"); - p.Initialize(null, config); - return p; - } - - [Fact] - public void CanFindState() - { - CreateDataForUserScope(); - var p = InitPersonalizationProvider(); - int totalRecords; - var psq = new PersonalizationStateQuery(); - psq.UsernameToMatch = @"GabPC\\Gab"; - psq.PathToMatch = "~/default.aspx"; - psq.UserInactiveSinceDate = DateTime.UtcNow.AddMinutes(1); - var collection = p.FindState(PersonalizationScope.User, psq, 1, 1, out totalRecords); - Assert.Equal(1, totalRecords); - } - - [Fact] - public void CanGetCountofStateForUser() - { - CreateDataForUserScope(); - var p = InitPersonalizationProvider(); - int totalRecords; - var psq = new PersonalizationStateQuery(); - psq.UsernameToMatch = @"GabPC\\Gab"; - psq.PathToMatch = "~/default.aspx"; - psq.UserInactiveSinceDate = DateTime.UtcNow.AddMinutes(1); - //System.Threading.Thread.Sleep(1000); - totalRecords = p.GetCountOfState(PersonalizationScope.User, psq); - Assert.Equal(1, totalRecords); - } - - [Fact] - public void CanGetCountofStateForAllUsers() - { - CreateDataForSharedScope(); - var p = InitPersonalizationProvider(); - int totalRecords; - var psq = new PersonalizationStateQuery(); - psq.PathToMatch = "~/default.aspx"; - psq.UserInactiveSinceDate = DateTime.UtcNow; - totalRecords = p.GetCountOfState(PersonalizationScope.Shared, psq); - Assert.Equal(1, totalRecords); - } - - [Fact] - public void CanResetStateForUser() - { - CreateDataForUserScope(); - var p = InitPersonalizationProvider(); - int totalRecords; - string[] paths = new string[1]; - paths[0] = "~/default.aspx"; - - string[] users = new string[1]; - users[0] = @"GabPC\Gab"; - - totalRecords = p.ResetState(PersonalizationScope.User, paths, users); - Assert.Equal(1, totalRecords); - } - - [Fact] - public void CanResetStateForAllUsers() - { - CreateDataForSharedScope(); - var p = InitPersonalizationProvider(); - - string[] paths = new string[1]; - paths[0] = "~/default.aspx"; - - string[] users = new string[1]; - users[0] = @"GabPC\Gab"; - - int totalRecords; - totalRecords = p.ResetState(PersonalizationScope.Shared, paths, users); - Assert.Equal(1, totalRecords); - } - - [Fact] - public void CanResetAllState() - { - CreateDataForSharedScope(); - var p = InitPersonalizationProvider(); - - int totalRecords; - totalRecords = p.ResetState(PersonalizationScope.Shared, null, null); - Assert.Equal(1, totalRecords); - } - - - [Fact] - public void CanResetUsertState() - { - CreateDataForUserScope(); - var p = InitPersonalizationProvider(); - int totalRecords; - - totalRecords = p.ResetUserState("~/default.aspx", DateTime.MaxValue); - Assert.Equal(1, totalRecords); - } - - } -} diff --git a/Tests/MySql.Web.Tests/ProfileTests.cs b/Tests/MySql.Web.Tests/ProfileTests.cs deleted file mode 100644 index a8e2d2ccc..000000000 --- a/Tests/MySql.Web.Tests/ProfileTests.cs +++ /dev/null @@ -1,292 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; - -using System.Text; -using Xunit; -using MySql.Web.Profile; -using System.Collections.Specialized; -using System.Reflection; -using System.Configuration; -using System.Data; -using System.Web.Profile; -using MySql.Data.MySqlClient; - -namespace MySql.Web.Tests -{ - public class ProfileTests : IUseFixture, IDisposable - { - private SetUpWeb st; - - public void SetFixture(SetUpWeb data) - { - st = data; - st.rootConn.Close(); - st.rootConn = new MySqlConnection("server=localhost;userid=root;pwd=;database=" + st.conn.Database + ";port=" + st.port); - st.rootConn.Open(); - } - - public void Dispose() - { - st.ExecuteSQLAsRoot("Delete from my_aspnet_profiles"); - st.ExecuteSQLAsRoot("Delete from my_aspnet_users"); - st.ExecuteSQLAsRoot("Delete from my_aspnet_applications"); - } - - private MySQLProfileProvider InitProfileProvider() - { - MySQLProfileProvider p = new MySQLProfileProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("applicationName", "/"); - p.Initialize(null, config); - return p; - } - - [Fact] - public void SettingValuesCreatesAnAppAndUserId() - { - MySQLProfileProvider provider = InitProfileProvider(); - SettingsContext ctx = new SettingsContext(); - ctx.Add("IsAuthenticated", false); - ctx.Add("UserName", "user1"); - - SettingsPropertyValueCollection values = new SettingsPropertyValueCollection(); - SettingsProperty property1 = new SettingsProperty("color"); - property1.PropertyType = typeof(string); - property1.Attributes["AllowAnonymous"] = true; - SettingsPropertyValue value = new SettingsPropertyValue(property1); - value.PropertyValue = "blue"; - values.Add(value); - - provider.SetPropertyValues(ctx, values); - - DataTable dt = st.FillTable("SELECT * FROM my_aspnet_applications"); - Assert.True(1 == dt.Rows.Count, "Rows count on table my_aspnet_applications is not 1"); - - dt = st.FillTable("SELECT * FROM my_aspnet_users"); - Assert.True(1 == dt.Rows.Count, "Rows count on table my_aspnet_users is not 1"); - - - dt = st.FillTable("SELECT * FROM my_aspnet_profiles"); - Assert.True(1 == dt.Rows.Count, "Rows count on table my_aspnet_profiles is not 1"); - - values["color"].PropertyValue = "green"; - provider.SetPropertyValues(ctx, values); - - dt = st.FillTable("SELECT * FROM my_aspnet_applications"); - Assert.True(1 == dt.Rows.Count, "Rows count on table my_aspnet_applications is not 1 after setting property"); - - dt = st.FillTable("SELECT * FROM my_aspnet_users"); - Assert.True(1 == dt.Rows.Count, "Rows count on table my_aspnet_users is not 1 after setting property"); - - dt = st.FillTable("SELECT * FROM my_aspnet_profiles"); - Assert.True(1 == dt.Rows.Count, "Rows count on table my_aspnet_profiles is not 1 after setting property"); - } - - [Fact] - public void AnonymousUserSettingNonAnonymousProperties() - { - MySQLProfileProvider provider = InitProfileProvider(); - SettingsContext ctx = new SettingsContext(); - ctx.Add("IsAuthenticated", false); - ctx.Add("UserName", "user1"); - - SettingsPropertyValueCollection values = new SettingsPropertyValueCollection(); - SettingsProperty property1 = new SettingsProperty("color"); - property1.PropertyType = typeof(string); - property1.Attributes["AllowAnonymous"] = false; - SettingsPropertyValue value = new SettingsPropertyValue(property1); - value.PropertyValue = "blue"; - values.Add(value); - - provider.SetPropertyValues(ctx, values); - - DataTable dt = st.FillTable("SELECT * FROM my_aspnet_applications"); - Assert.True(0 == dt.Rows.Count, "Table my_aspnet_applications Rows is not 0"); - - dt = st.FillTable("SELECT * FROM my_aspnet_users"); - Assert.True(0 == dt.Rows.Count, "Table my_aspnet_users Rows is not 0"); - - dt = st.FillTable("SELECT * FROM my_aspnet_profiles"); - Assert.True(0 == dt.Rows.Count, "Table my_aspnet_profiles Rows is not 0"); - - } - - [Fact] - public void StringCollectionAsProperty() - { - ProfileBase profile = ProfileBase.Create("foo", true); - ResetAppId(profile.Providers["MySqlProfileProvider"] as MySQLProfileProvider); - StringCollection colors = new StringCollection(); - colors.Add("red"); - colors.Add("green"); - colors.Add("blue"); - profile["FavoriteColors"] = colors; - profile.Save(); - - DataTable dt = st.FillTable("SELECT * FROM my_aspnet_applications"); - Assert.Equal(1, dt.Rows.Count); - dt = st.FillTable("SELECT * FROM my_aspnet_users"); - Assert.Equal(1, dt.Rows.Count); - dt = st.FillTable("SELECT * FROM my_aspnet_profiles"); - Assert.Equal(1, dt.Rows.Count); - - // now retrieve them - SettingsPropertyCollection getProps = new SettingsPropertyCollection(); - SettingsProperty getProp1 = new SettingsProperty("FavoriteColors"); - getProp1.PropertyType = typeof(StringCollection); - getProp1.SerializeAs = SettingsSerializeAs.Xml; - getProps.Add(getProp1); - - MySQLProfileProvider provider = InitProfileProvider(); - SettingsContext ctx = new SettingsContext(); - ctx.Add("IsAuthenticated", true); - ctx.Add("UserName", "foo"); - SettingsPropertyValueCollection getValues = provider.GetPropertyValues(ctx, getProps); - Assert.Equal(1, getValues.Count); - SettingsPropertyValue getValue1 = getValues["FavoriteColors"]; - StringCollection outValue = (StringCollection)getValue1.PropertyValue; - Assert.Equal(3, outValue.Count); - Assert.Equal("red", outValue[0]); - Assert.Equal("green", outValue[1]); - Assert.Equal("blue", outValue[2]); - } - - [Fact] - public void AuthenticatedDateTime() - { - ProfileBase profile = ProfileBase.Create("foo", true); - ResetAppId(profile.Providers["MySqlProfileProvider"] as MySQLProfileProvider); - DateTime date = DateTime.Now; - profile["BirthDate"] = date; - profile.Save(); - - SettingsPropertyCollection getProps = new SettingsPropertyCollection(); - SettingsProperty getProp1 = new SettingsProperty("BirthDate"); - getProp1.PropertyType = typeof(DateTime); - getProp1.SerializeAs = SettingsSerializeAs.Xml; - getProps.Add(getProp1); - - MySQLProfileProvider provider = InitProfileProvider(); - SettingsContext ctx = new SettingsContext(); - ctx.Add("IsAuthenticated", true); - ctx.Add("UserName", "foo"); - - SettingsPropertyValueCollection getValues = provider.GetPropertyValues(ctx, getProps); - Assert.Equal(1, getValues.Count); - SettingsPropertyValue getValue1 = getValues["BirthDate"]; - Assert.Equal(date, getValue1.PropertyValue); - } - - /// - /// We have to manually reset the app id because our profile provider is loaded from - /// previous tests but we are destroying our database between tests. This means that - /// our provider thinks we have an application in our database when we really don't. - /// Doing this will force the provider to generate a new app id. - /// Note that this is not really a problem in a normal app that is not destroying - /// the database behind the back of the provider. - /// - /// - private void ResetAppId(MySQLProfileProvider p) - { - Type t = p.GetType(); - FieldInfo fi = t.GetField("app", - BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.GetField); - object appObject = fi.GetValue(p); - Type appType = appObject.GetType(); - PropertyInfo pi = appType.GetProperty("Id"); - pi.SetValue(appObject, -1, null); - } - - [Fact] - public void AuthenticatedStringProperty() - { - ProfileBase profile = ProfileBase.Create("foo", true); - ResetAppId(profile.Providers["MySqlProfileProvider"] as MySQLProfileProvider); - profile["Name"] = "Fred Flintstone"; - profile.Save(); - - SettingsPropertyCollection getProps = new SettingsPropertyCollection(); - SettingsProperty getProp1 = new SettingsProperty("Name"); - getProp1.PropertyType = typeof(String); - getProps.Add(getProp1); - - MySQLProfileProvider provider = InitProfileProvider(); - SettingsContext ctx = new SettingsContext(); - ctx.Add("IsAuthenticated", true); - ctx.Add("UserName", "foo"); - - SettingsPropertyValueCollection getValues = provider.GetPropertyValues(ctx, getProps); - Assert.Equal(1, getValues.Count); - SettingsPropertyValue getValue1 = getValues["Name"]; - Assert.Equal("Fred Flintstone", getValue1.PropertyValue); - } - - /// - /// Bug #41654 FindProfilesByUserName error into Connector .NET - /// - [Fact] - public void GetAllProfiles() - { - ProfileBase profile = ProfileBase.Create("foo", true); - ResetAppId(profile.Providers["MySqlProfileProvider"] as MySQLProfileProvider); - profile["Name"] = "Fred Flintstone"; - profile.Save(); - - SettingsPropertyCollection getProps = new SettingsPropertyCollection(); - SettingsProperty getProp1 = new SettingsProperty("Name"); - getProp1.PropertyType = typeof(String); - getProps.Add(getProp1); - - MySQLProfileProvider provider = InitProfileProvider(); - SettingsContext ctx = new SettingsContext(); - ctx.Add("IsAuthenticated", true); - ctx.Add("UserName", "foo"); - - int total; - ProfileInfoCollection profiles = provider.GetAllProfiles( - ProfileAuthenticationOption.All, 0, 10, out total); - Assert.Equal(1, total); - } - - /// - /// Tests deleting a user profile - /// - [Fact] - public void DeleteProfiles() - { - ProfileBase profile = ProfileBase.Create("foo", true); - profile.SetPropertyValue("Name", "this is my name"); - profile.Save(); - profile = ProfileBase.Create("foo", true); // refresh profile from database - Assert.Equal("this is my name", profile.GetPropertyValue("Name")); - - Assert.Equal(1, ProfileManager.DeleteProfiles(new string[] { "foo" })); - profile = ProfileBase.Create("foo", true); // refresh profile from database - Assert.Equal(string.Empty, profile.GetPropertyValue("Name")); - } - - } -} diff --git a/Tests/MySql.Web.Tests/Properties/AssemblyInfo.cs b/Tests/MySql.Web.Tests/Properties/AssemblyInfo.cs deleted file mode 100644 index 066ecf404..000000000 --- a/Tests/MySql.Web.Tests/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright © 2004, 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Reflection; -using System.Runtime.CompilerServices; -using 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. -[assembly: AssemblyTitle("MySql.Web.Tests")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Oracle")] -[assembly: AssemblyProduct("MySql.Web.Tests")] -[assembly: AssemblyCopyright("Copyright © 2004, 2015, Oracle and/or its affiliates. All rights reserved.")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("5ea74c78-c679-464f-99ba-ae1b0b54550b")] - -[assembly: AssemblyDelaySign(true)] -[assembly: AssemblyKeyFileAttribute(@"..\..\ConnectorNetPublicKey.snk")] diff --git a/Tests/MySql.Web.Tests/RoleManagement.cs b/Tests/MySql.Web.Tests/RoleManagement.cs deleted file mode 100644 index 2be6e053d..000000000 --- a/Tests/MySql.Web.Tests/RoleManagement.cs +++ /dev/null @@ -1,263 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; - -using System.Text; -using Xunit; -using MySql.Web.Security; -using System.Collections.Specialized; -using System.Web.Security; - -namespace MySql.Web.Tests -{ - public class RoleManagement : IUseFixture, IDisposable - { - private SetUpWeb st; - private MySQLMembershipProvider membershipProvider; - private MySQLRoleProvider roleProvider; - - public void SetFixture(SetUpWeb data) - { - st = data; - - st.execSQL("DROP TABLE IF EXISTS mysql_membership"); - st.execSQL("DROP TABLE IF EXISTS mysql_roles"); - - membershipProvider = new MySQLMembershipProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("applicationName", "/"); - membershipProvider.Initialize(null, config); - } - - public void Dispose() - { - //Nothing to clean - } - - private void AddUser(string username, string password) - { - MembershipCreateStatus status; - membershipProvider.CreateUser(username, password, "foo@bar.com", null, - null, true, null, out status); - Assert.False(status != MembershipCreateStatus.Success, "User creation failed"); - } - - private void AttemptToAddUserToRole(string username, string role) - { - try - { - roleProvider.AddUsersToRoles(new string[] { username }, - new string[] { role }); - } - catch (ArgumentException) - { - } - } - - - [Fact] - public void CreateAndDeleteRoles() - { - roleProvider = new MySQLRoleProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("applicationName", "/"); - roleProvider.Initialize(null, config); - - // Add the role - roleProvider.CreateRole("Administrator"); - string[] roles = roleProvider.GetAllRoles(); - Assert.Equal(1, roles.Length); - Assert.Equal("Administrator", roles[0]); - roleProvider.DeleteRole("Administrator", false); - } - - [Fact] - public void AddUserToRole() - { - roleProvider = new MySQLRoleProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("applicationName", "/"); - roleProvider.Initialize(null, config); - - AddUser("eve", "eveeve!"); - roleProvider.CreateRole("Administrator"); - - roleProvider.AddUsersToRoles(new string[] { "eve" }, - new string[] { "Administrator" }); - Assert.True(roleProvider.IsUserInRole("eve", "Administrator")); - - roleProvider.RemoveUsersFromRoles(new string[] { "eve" }, new string[] { "Administrator" }); - Assert.False(roleProvider.IsUserInRole("eve", "Administrator")); - - roleProvider.DeleteRole("Administrator", false); - Assert.Equal(0, roleProvider.GetAllRoles().Length); - - //clean up - membershipProvider.DeleteUser("eve", true); - - } - - /// - /// Bug #38243 Not Handling non existing user when calling AddUsersToRoles method - /// - [Fact] - public void AddNonExistingUserToRole() - { - roleProvider = new MySQLRoleProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("applicationName", "/"); - roleProvider.Initialize(null, config); - - roleProvider.CreateRole("Administrator"); - roleProvider.AddUsersToRoles(new string[] { "eve" }, - new string[] { "Administrator" }); - Assert.True(roleProvider.IsUserInRole("eve", "Administrator")); - - //Cleanup - roleProvider.RemoveUsersFromRoles(new string[] { "eve" }, new string[] { "Administrator" }); - roleProvider.DeleteRole("Administrator", false); - - } - - - [Fact] - public void IllegalRoleAndUserNames() - { - roleProvider = new MySQLRoleProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("applicationName", "/"); - roleProvider.Initialize(null, config); - - AttemptToAddUserToRole("test", null); - AttemptToAddUserToRole("test", ""); - roleProvider.CreateRole("Administrator"); - AttemptToAddUserToRole(null, "Administrator"); - AttemptToAddUserToRole("", "Administrator"); - - //Cleanup - roleProvider.DeleteRole("Administrator", false); - } - - [Fact] - public void AddUserToRoleWithRoleClass() - { - - Roles.CreateRole("Administrator"); - MembershipCreateStatus status; - Membership.CreateUser("eve", "eve1@eve", "eve@boo.com", - "question", "answer", true, null, out status); - Assert.Equal(MembershipCreateStatus.Success, status); - - Roles.AddUserToRole("eve", "Administrator"); - Assert.True(Roles.IsUserInRole("eve", "Administrator")); - - //Cleanup - Membership.DeleteUser("eve"); - Roles.DeleteRole("Administrator"); - - } - - [Fact] - public void IsUserInRoleCrossDomain() - { - MySQLMembershipProvider provider = new MySQLMembershipProvider(); - NameValueCollection config1 = new NameValueCollection(); - config1.Add("connectionStringName", "LocalMySqlServer"); - config1.Add("applicationName", "/"); - config1.Add("passwordStrengthRegularExpression", "bar.*"); - config1.Add("passwordFormat", "Clear"); - provider.Initialize(null, config1); - MembershipCreateStatus status; - provider.CreateUser("foo", "bar!bar", null, null, null, true, null, out status); - - MySQLMembershipProvider provider2 = new MySQLMembershipProvider(); - NameValueCollection config2 = new NameValueCollection(); - config2.Add("connectionStringName", "LocalMySqlServer"); - config2.Add("applicationName", "/myapp"); - config2.Add("passwordStrengthRegularExpression", ".*"); - config2.Add("passwordFormat", "Clear"); - provider2.Initialize(null, config2); - - roleProvider = new MySQLRoleProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("applicationName", "/"); - roleProvider.Initialize(null, config); - - MySQLRoleProvider r2 = new MySQLRoleProvider(); - NameValueCollection configr2 = new NameValueCollection(); - configr2.Add("connectionStringName", "LocalMySqlServer"); - configr2.Add("applicationName", "/myapp"); - r2.Initialize(null, configr2); - - roleProvider.CreateRole("Administrator"); - roleProvider.AddUsersToRoles(new string[] { "foo" }, - new string[] { "Administrator" }); - Assert.False(r2.IsUserInRole("foo", "Administrator")); - - roleProvider.DeleteRole("Administrator", false); - Assert.Equal(0, roleProvider.GetAllRoles().Length); - - //Cleanup - provider.DeleteUser("foo",true); - - } - - /// - /// Testing fix for Calling RoleProvider.RemoveUserFromRole() causes an exception due to a wrong table being used. - /// http://clustra.no.oracle.com/orabugs/bug.php?id=14405338 / http://bugs.mysql.com/bug.php?id=65805. - /// - [Fact] - public void TestUserRemoveFindFromRole() - { - roleProvider = new MySQLRoleProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("applicationName", "/"); - roleProvider.Initialize(null, config); - - AddUser("eve", "eveeve!"); - roleProvider.CreateRole("Administrator"); - roleProvider.AddUsersToRoles(new string[] { "eve" }, - new string[] { "Administrator" }); - Assert.True(roleProvider.IsUserInRole("eve", "Administrator")); - string[] users = roleProvider.FindUsersInRole("Administrator", "eve"); - Assert.Equal(1, users.Length); - Assert.Equal("eve", users[0]); - roleProvider.RemoveUsersFromRoles(new string[] { "eve" }, new string[] { "Administrator" }); - Assert.False(roleProvider.IsUserInRole("eve", "Administrator")); - - //Cleanup - membershipProvider.DeleteUser("eve", true); - roleProvider.DeleteRole("Administrator", false); - - } - - } -} diff --git a/Tests/MySql.Web.Tests/SchemaManagerTests.cs b/Tests/MySql.Web.Tests/SchemaManagerTests.cs deleted file mode 100644 index f28889a75..000000000 --- a/Tests/MySql.Web.Tests/SchemaManagerTests.cs +++ /dev/null @@ -1,332 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Configuration; -using System.Configuration.Provider; -using System.Data; -using System.Text; -using System.Web.Security; -using MySql.Data.MySqlClient; -using MySql.Web.Common; -using MySql.Web.Security; -using Xunit; - -namespace MySql.Web.Tests -{ - public class SchemaManagerTests : IUseFixture, IDisposable - { - private SetUpWeb st; - - public void SetFixture(SetUpWeb data) - { - st = data; - DropAllTables(); - } - - private void DropAllTables() - { - DataTable dt = st.conn.GetSchema("Tables"); - foreach (DataRow row in dt.Rows) - st.execSQL(String.Format("DROP TABLE IF EXISTS {0}", row["TABLE_NAME"])); - } - - /// - /// Bug #37469 autogenerateschema optimizing - /// - [Fact] - public void SchemaCheck() - { - for (int i = 0; i <= SchemaManager.Version; i++) - { - DropAllTables(); - MySQLMembershipProvider provider = new MySQLMembershipProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("applicationName", "/"); - config.Add("passwordFormat", "Clear"); - - if (i > 0) - for (int x = 1; x <= i; x++) - st.LoadSchema(x); - - try - { - provider.Initialize(null, config); - if (i < SchemaManager.Version) - Assert.False(true,"Should have failed"); - } - catch (ProviderException) - { - if (i == SchemaManager.Version) - Assert.False(true,"This should not have failed"); - } - } - } - - /// - /// Bug #36444 'autogenerateschema' produces tables with 'random' collations - /// - [Fact] - public void CurrentSchema() - { - st.execSQL("set character_set_database=utf8"); - - st.LoadSchema(1); - st.LoadSchema(2); - st.LoadSchema(3); - st.LoadSchema(4); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM my_aspnet_schemaversion", st.conn); - object ver = cmd.ExecuteScalar(); - Assert.Equal(4, ver); - - cmd.CommandText = "SHOW CREATE TABLE my_aspnet_membership"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - string createSql = reader.GetString(1); - Assert.True(createSql.IndexOf("CHARSET=utf8") != -1); - } - } - - [Fact] - public void UpgradeV1ToV2() - { - st.LoadSchema(1); - - MySqlCommand cmd = new MySqlCommand("SHOW CREATE TABLE mysql_membership", st.conn); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - string createTable = reader.GetString(1); - int index = createTable.IndexOf("COMMENT='1'"); - Assert.NotEqual(-1, index); - } - - st.LoadSchema(2); - cmd = new MySqlCommand("SHOW CREATE TABLE mysql_membership", st.conn); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - string createTable = reader.GetString(1); - int index = createTable.IndexOf("COMMENT='2'"); - Assert.NotEqual(-1, index); - } - } - - private void LoadData() - { - st.LoadSchema(1); - st.LoadSchema(2); - st.execSQL(@"INSERT INTO mysql_membership (pkid, username, password, applicationname, lastactivitydate) - VALUES('1', 'user1', '', 'app1', '2007-01-01')"); - st.execSQL(@"INSERT INTO mysql_membership (pkid, username, password, applicationname, lastactivitydate) - VALUES('2', 'user2', '', 'app1', '2007-01-01')"); - st.execSQL(@"INSERT INTO mysql_membership (pkid, username, password, applicationname, lastactivitydate) - VALUES('3', 'user1', '', 'app2', '2007-01-01')"); - st.execSQL(@"INSERT INTO mysql_membership (pkid, username, password, applicationname, lastactivitydate) - VALUES('4', 'user2', '', 'app2', '2007-01-01')"); - st.execSQL(@"INSERT INTO mysql_roles VALUES ('role1', 'app1')"); - st.execSQL(@"INSERT INTO mysql_roles VALUES ('role2', 'app1')"); - st.execSQL(@"INSERT INTO mysql_roles VALUES ('role1', 'app2')"); - st.execSQL(@"INSERT INTO mysql_roles VALUES ('role2', 'app2')"); - st.execSQL(@"INSERT INTO mysql_UsersInRoles VALUES ('user1', 'role1', 'app1')"); - st.execSQL(@"INSERT INTO mysql_UsersInRoles VALUES ('user2', 'role2', 'app1')"); - st.execSQL(@"INSERT INTO mysql_UsersInRoles VALUES ('user1', 'role1', 'app2')"); - st.execSQL(@"INSERT INTO mysql_UsersInRoles VALUES ('user2', 'role2', 'app2')"); - st.LoadSchema(3); - Assert.False(st.TableExists("mysql_membership")); - Assert.False(st.TableExists("mysql_roles")); - Assert.False(st.TableExists("mysql_usersinroles")); - } - - [Fact] - public void CheckAppsUpgrade() - { - LoadData(); - - DataTable apps = st.FillTable("SELECT * FROM my_aspnet_applications"); - Assert.Equal(2, apps.Rows.Count); - Assert.Equal(1, apps.Rows[0]["id"]); - Assert.Equal("app1", apps.Rows[0]["name"]); - Assert.Equal(2, apps.Rows[1]["id"]); - Assert.Equal("app2", apps.Rows[1]["name"]); - } - - [Fact] - public void CheckUsersUpgrade() - { - LoadData(); - - DataTable dt = st.FillTable("SELECT * FROM my_aspnet_users"); - Assert.Equal(4, dt.Rows.Count); - Assert.Equal(1, dt.Rows[0]["id"]); - Assert.Equal(1, dt.Rows[0]["applicationId"]); - Assert.Equal("user1", dt.Rows[0]["name"]); - Assert.Equal(2, dt.Rows[1]["id"]); - Assert.Equal(1, dt.Rows[1]["applicationId"]); - Assert.Equal("user2", dt.Rows[1]["name"]); - Assert.Equal(3, dt.Rows[2]["id"]); - Assert.Equal(2, dt.Rows[2]["applicationId"]); - Assert.Equal("user1", dt.Rows[2]["name"]); - Assert.Equal(4, dt.Rows[3]["id"]); - Assert.Equal(2, dt.Rows[3]["applicationId"]); - Assert.Equal("user2", dt.Rows[3]["name"]); - } - - [Fact] - public void CheckRolesUpgrade() - { - LoadData(); - - DataTable dt = st.FillTable("SELECT * FROM my_aspnet_roles"); - Assert.Equal(4, dt.Rows.Count); - Assert.Equal(1, dt.Rows[0]["id"]); - Assert.Equal(1, dt.Rows[0]["applicationId"]); - Assert.Equal("role1", dt.Rows[0]["name"]); - Assert.Equal(2, dt.Rows[1]["id"]); - Assert.Equal(1, dt.Rows[1]["applicationId"]); - Assert.Equal("role2", dt.Rows[1]["name"]); - Assert.Equal(3, dt.Rows[2]["id"]); - Assert.Equal(2, dt.Rows[2]["applicationId"]); - Assert.Equal("role1", dt.Rows[2]["name"]); - Assert.Equal(4, dt.Rows[3]["id"]); - Assert.Equal(2, dt.Rows[3]["applicationId"]); - Assert.Equal("role2", dt.Rows[3]["name"]); - } - - [Fact] - public void CheckMembershipUpgrade() - { - LoadData(); - - DataTable dt = st.FillTable("SELECT * FROM my_aspnet_membership"); - Assert.Equal(4, dt.Rows.Count); - Assert.Equal(1, dt.Rows[0]["userid"]); - Assert.Equal(2, dt.Rows[1]["userid"]); - Assert.Equal(3, dt.Rows[2]["userid"]); - Assert.Equal(4, dt.Rows[3]["userid"]); - } - - [Fact] - public void CheckUsersInRolesUpgrade() - { - LoadData(); - - DataTable dt = st.FillTable("SELECT * FROM my_aspnet_usersinroles"); - Assert.Equal(4, dt.Rows.Count); - Assert.Equal(1, dt.Rows[0]["userid"]); - Assert.Equal(1, dt.Rows[0]["roleid"]); - Assert.Equal(2, dt.Rows[1]["userid"]); - Assert.Equal(2, dt.Rows[1]["roleid"]); - Assert.Equal(3, dt.Rows[2]["userid"]); - Assert.Equal(3, dt.Rows[2]["roleid"]); - Assert.Equal(4, dt.Rows[3]["userid"]); - Assert.Equal(4, dt.Rows[3]["roleid"]); - } - - /// - /// Bug #39072 Web provider does not work - /// - [Fact] - public void AutoGenerateSchema() - { - MySQLMembershipProvider provider = new MySQLMembershipProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("autogenerateschema", "true"); - config.Add("applicationName", "/"); - config.Add("passwordFormat", "Clear"); - - provider.Initialize(null, config); - - MembershipCreateStatus status; - MembershipUser user = provider.CreateUser("boo", "password", "email@email.com", - "question", "answer", true, null, out status); - } - - [Fact] - public void SchemaTablesUseSameEngine() - { - DropAllTables(); - - for (int x = 1; x <= SchemaManager.Version; x++) - st.LoadSchema(x); - - string query = string.Format("SELECT TABLE_NAME, ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{0}'", st.conn.Database); - MySqlCommand cmd = new MySqlCommand(query, st.conn); - string lastEngine = null; - string currentEngine; - - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - while (reader.Read()) - { - currentEngine = reader.GetString("ENGINE"); - - if (string.IsNullOrEmpty(lastEngine)) - { - lastEngine = currentEngine; - } - - Assert.Equal(lastEngine, currentEngine); - } - } - } - - [Fact] - public void InitializeInvalidConnStringThrowsArgumentException() - { - Configuration configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); - string connStr = configFile.ConnectionStrings.ConnectionStrings["LocalMySqlServer"].ConnectionString; - string fakeConnectionString = connStr.Replace("database", "fooKey"); - try - { - configFile.ConnectionStrings.ConnectionStrings["LocalMySqlServer"].ConnectionString = fakeConnectionString; - configFile.Save(); - ConfigurationManager.RefreshSection("connectionStrings"); - - MySQLMembershipProvider provider = new MySQLMembershipProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - - Exception ex = Assert.Throws(() => provider.Initialize(null, config)); - Assert.Equal("Keyword not supported.\r\nParameter name: fookey", ex.Message); - } - finally - { - configFile.ConnectionStrings.ConnectionStrings["LocalMySqlServer"].ConnectionString = connStr; - configFile.Save(); - ConfigurationManager.RefreshSection("connectionStrings"); - } - } - - public void Dispose() - { - //TODO - } - - } -} diff --git a/Tests/MySql.Web.Tests/SchemaTests.cs b/Tests/MySql.Web.Tests/SchemaTests.cs deleted file mode 100644 index c4e7a9c36..000000000 --- a/Tests/MySql.Web.Tests/SchemaTests.cs +++ /dev/null @@ -1,351 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; - -using System.Text; -using Xunit; -using System.Data; -using MySql.Web.Common; -using MySql.Web.Security; -using System.Collections.Specialized; -using System.Configuration.Provider; -using MySql.Data.MySqlClient; -using System.Web.Security; -using System.Configuration; - -namespace MySql.Web.Tests -{ - public class SchemaTests : IUseFixture, IDisposable - { - private SetUpWeb st; - - public void SetFixture(SetUpWeb data) - { - st = data; - DropAllTables(); - } - - private void DropAllTables() - { - DataTable dt = st.conn.GetSchema("Tables"); - foreach (DataRow row in dt.Rows) - st.execSQL(String.Format("DROP TABLE IF EXISTS {0}", row["TABLE_NAME"])); - } - - public void Dispose() - { - //Nothing to clean - } - - /// - /// Bug #37469 autogenerateschema optimizing - /// - [Fact] - public void SchemaCheck() - { - for (int i = 0; i <= SchemaManager.Version; i++) - { - DropAllTables(); - MySQLMembershipProvider provider = new MySQLMembershipProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("applicationName", "/"); - config.Add("passwordFormat", "Clear"); - - if (i > 0) - for (int x = 1; x <= i; x++) - st.LoadSchema(x); - - try - { - provider.Initialize(null, config); - Assert.False(i < SchemaManager.Version, "This should have failed"); - } - catch (ProviderException) - { - Assert.False(i == SchemaManager.Version,"This should not have failed"); - } - } - } - - /// - /// Bug #36444 'autogenerateschema' produces tables with 'random' collations - /// - [Fact] - public void CurrentSchema() - { - st.execSQL("set character_set_database=utf8"); - - st.LoadSchema(1); - st.LoadSchema(2); - st.LoadSchema(3); - st.LoadSchema(4); - - MySqlCommand cmd = new MySqlCommand("SELECT * FROM my_aspnet_schemaversion", st.conn); - object ver = cmd.ExecuteScalar(); - Assert.Equal(4, ver); - - cmd.CommandText = "SHOW CREATE TABLE my_aspnet_membership"; - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - string createSql = reader.GetString(1); - Assert.True(createSql.IndexOf("CHARSET=utf8") != -1); - } - } - - [Fact] - public void UpgradeV1ToV2() - { - st.LoadSchema(1); - - MySqlCommand cmd = new MySqlCommand("SHOW CREATE TABLE mysql_membership", st.conn); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - string createTable = reader.GetString(1); - int index = createTable.IndexOf("COMMENT='1'"); - Assert.NotEqual(-1, index); - } - - st.LoadSchema(2); - cmd = new MySqlCommand("SHOW CREATE TABLE mysql_membership", st.conn); - using (MySqlDataReader reader = cmd.ExecuteReader()) - { - reader.Read(); - string createTable = reader.GetString(1); - int index = createTable.IndexOf("COMMENT='2'"); - Assert.NotEqual(-1, index); - } - } - - [Fact] - private void LoadData() - { - st.LoadSchema(1); - st.LoadSchema(2); - st.execSQL(@"INSERT INTO mysql_membership (pkid, username, password, applicationname, lastactivitydate) - VALUES('1', 'user1', '', 'app1', '2007-01-01')"); - st.execSQL(@"INSERT INTO mysql_membership (pkid, username, password, applicationname, lastactivitydate) - VALUES('2', 'user2', '', 'app1', '2007-01-01')"); - st.execSQL(@"INSERT INTO mysql_membership (pkid, username, password, applicationname, lastactivitydate) - VALUES('3', 'user1', '', 'app2', '2007-01-01')"); - st.execSQL(@"INSERT INTO mysql_membership (pkid, username, password, applicationname, lastactivitydate) - VALUES('4', 'user2', '', 'app2', '2007-01-01')"); - st.execSQL(@"INSERT INTO mysql_roles VALUES ('role1', 'app1')"); - st.execSQL(@"INSERT INTO mysql_roles VALUES ('role2', 'app1')"); - st.execSQL(@"INSERT INTO mysql_roles VALUES ('role1', 'app2')"); - st.execSQL(@"INSERT INTO mysql_roles VALUES ('role2', 'app2')"); - st.execSQL(@"INSERT INTO mysql_UsersInRoles VALUES ('user1', 'role1', 'app1')"); - st.execSQL(@"INSERT INTO mysql_UsersInRoles VALUES ('user2', 'role2', 'app1')"); - st.execSQL(@"INSERT INTO mysql_UsersInRoles VALUES ('user1', 'role1', 'app2')"); - st.execSQL(@"INSERT INTO mysql_UsersInRoles VALUES ('user2', 'role2', 'app2')"); - st.LoadSchema(3); - Assert.False(st.TableExists("mysql_membership")); - Assert.False(st.TableExists("mysql_roles")); - Assert.False(st.TableExists("mysql_usersinroles")); - } - - [Fact] - public void CheckAppsUpgrade() - { - LoadData(); - - DataTable apps = st.FillTable("SELECT * FROM my_aspnet_applications"); - Assert.Equal(2, apps.Rows.Count); - Assert.Equal(1, apps.Rows[0]["id"]); - Assert.Equal("app1", apps.Rows[0]["name"]); - Assert.Equal(2, apps.Rows[1]["id"]); - Assert.Equal("app2", apps.Rows[1]["name"]); - } - -// [Fact] -// public void CheckUsersUpgrade() -// { -// LoadData(); - -// DataTable dt = st.FillTable("SELECT * FROM my_aspnet_users"); -// Assert.Equal(4, dt.Rows.Count); -// Assert.Equal(1, dt.Rows[0]["id"]); -// Assert.Equal(1, dt.Rows[0]["applicationId"]); -// Assert.Equal("user1", dt.Rows[0]["name"]); -// Assert.Equal(2, dt.Rows[1]["id"]); -// Assert.Equal(1, dt.Rows[1]["applicationId"]); -// Assert.Equal("user2", dt.Rows[1]["name"]); -// Assert.Equal(3, dt.Rows[2]["id"]); -// Assert.Equal(2, dt.Rows[2]["applicationId"]); -// Assert.Equal("user1", dt.Rows[2]["name"]); -// Assert.Equal(4, dt.Rows[3]["id"]); -// Assert.Equal(2, dt.Rows[3]["applicationId"]); -// Assert.Equal("user2", dt.Rows[3]["name"]); -// } - -// [Fact] -// public void CheckRolesUpgrade() -// { -// LoadData(); - -// DataTable dt = st.FillTable("SELECT * FROM my_aspnet_roles"); -// Assert.Equal(4, dt.Rows.Count); -// Assert.Equal(1, dt.Rows[0]["id"]); -// Assert.Equal(1, dt.Rows[0]["applicationId"]); -// Assert.Equal("role1", dt.Rows[0]["name"]); -// Assert.Equal(2, dt.Rows[1]["id"]); -// Assert.Equal(1, dt.Rows[1]["applicationId"]); -// Assert.Equal("role2", dt.Rows[1]["name"]); -// Assert.Equal(3, dt.Rows[2]["id"]); -// Assert.Equal(2, dt.Rows[2]["applicationId"]); -// Assert.Equal("role1", dt.Rows[2]["name"]); -// Assert.Equal(4, dt.Rows[3]["id"]); -// Assert.Equal(2, dt.Rows[3]["applicationId"]); -// Assert.Equal("role2", dt.Rows[3]["name"]); -// } - -// [Fact] -// public void CheckMembershipUpgrade() -// { -// LoadData(); - -// DataTable dt = st.FillTable("SELECT * FROM my_aspnet_membership"); -// Assert.Equal(4, dt.Rows.Count); -// Assert.Equal(1, dt.Rows[0]["userid"]); -// Assert.Equal(2, dt.Rows[1]["userid"]); -// Assert.Equal(3, dt.Rows[2]["userid"]); -// Assert.Equal(4, dt.Rows[3]["userid"]); -// } - -// [Fact] -// public void CheckUsersInRolesUpgrade() -// { -// LoadData(); - -// DataTable dt = st.FillTable("SELECT * FROM my_aspnet_usersinroles"); -// Assert.Equal(4, dt.Rows.Count); -// Assert.Equal(1, dt.Rows[0]["userid"]); -// Assert.Equal(1, dt.Rows[0]["roleid"]); -// Assert.Equal(2, dt.Rows[1]["userid"]); -// Assert.Equal(2, dt.Rows[1]["roleid"]); -// Assert.Equal(3, dt.Rows[2]["userid"]); -// Assert.Equal(3, dt.Rows[2]["roleid"]); -// Assert.Equal(4, dt.Rows[3]["userid"]); -// Assert.Equal(4, dt.Rows[3]["roleid"]); -// } - - /// - /// Bug #39072 Web provider does not work - /// - [Fact] - public void AutoGenerateSchema() - { - MySQLMembershipProvider provider = new MySQLMembershipProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("autogenerateschema", "true"); - config.Add("applicationName", "/"); - config.Add("passwordFormat", "Clear"); - - provider.Initialize(null, config); - - MembershipCreateStatus status; - MembershipUser user = provider.CreateUser("boo", "password", "email@email.com", - "question", "answer", true, null, out status); - } - -// [Fact] -// public void SchemaTablesUseSameEngine() -// { -// DropAllTables(); - -// for (int x = 1; x <= SchemaManager.Version; x++) -// st.LoadSchema(x); - -// string query = string.Format("SELECT TABLE_NAME, ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{0}'", st.conn.Database); -// MySqlCommand cmd = new MySqlCommand(query, st.conn); -// string lastEngine = null; -// string currentEngine; - -// using (MySqlDataReader reader = cmd.ExecuteReader()) -// { -// while (reader.Read()) -// { -// currentEngine = reader.GetString("ENGINE"); - -// if (string.IsNullOrEmpty(lastEngine)) -// { -// lastEngine = currentEngine; -// } - -// Assert.Equal(lastEngine, currentEngine); -// } -// } -// } - -// [Fact] -// public void InitializeInvalidConnStringThrowsArgumentException() -// { -// Configuration configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); -// string connStr = configFile.ConnectionStrings.ConnectionStrings["LocalMySqlServer"].ConnectionString; -// string fakeConnectionString = connStr.Replace("database", "fooKey"); -// configFile.ConnectionStrings.ConnectionStrings["LocalMySqlServer"].ConnectionString = fakeConnectionString; -// configFile.Save(); -// ConfigurationManager.RefreshSection("connectionStrings"); - -// MySQLMembershipProvider provider = new MySQLMembershipProvider(); -// NameValueCollection config = new NameValueCollection(); -// config.Add("connectionStringName", "LocalMySqlServer"); - -// Exception ex = Assert.Throws(() => provider.Initialize(null, config)); -// Assert.Equal(ex.Message, "Keyword not supported.\r\nParameter name: fookey"); - -// configFile.ConnectionStrings.ConnectionStrings["LocalMySqlServer"].ConnectionString = connStr; -// configFile.Save(); -// ConfigurationManager.RefreshSection("connectionStrings"); - -// } - - /// - /// Checking fix for http://bugs.mysql.com/bug.php?id=65144 / http://clustra.no.oracle.com/orabugs/14495292 - /// (Net Connector 6.4.4 Asp.Net Membership Database fails on MySql Db of UTF32). - /// - [Fact] - public void AttemptLatestSchemaVersion() - { - // UTF32 is only supported - if (st.Version.Minor >= 5) - { - st.execSQL(string.Format("alter database `{0}` character set = 'utf32' collate = 'utf32_general_ci'", st.database0)); - for (int i = 1; i <= 4; i++) - { - st.LoadSchema(i); - } - MySQLRoleProvider roleProvider = new MySQLRoleProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("applicationName", "/"); - config.Add("autogenerateschema", "true"); - roleProvider.Initialize(null, config); - } - } - } -} diff --git a/Tests/MySql.Web.Tests/SessionLocking/Global.asax.cs b/Tests/MySql.Web.Tests/SessionLocking/Global.asax.cs deleted file mode 100644 index 7cbc98714..000000000 --- a/Tests/MySql.Web.Tests/SessionLocking/Global.asax.cs +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright © 2004,2010, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -// This code was contributed by Sean Wright (srwright@alcor.concordia.ca) on 2007-01-12 -// The copyright was assigned and transferred under the terms of -// the MySQL Contributor License Agreement (CLA) - -using System; -using System.Collections.Generic; -#if CLR4 - -#endif -using System.Web; -using System.Web.Security; -using System.Web.SessionState; -using MySql.Web.Tests; -using System.Threading; - -namespace MySql.Web.Tests -{ - public class Global : System.Web.HttpApplication - { - - void Application_Start(object sender, EventArgs e) - { - // Code that runs on application startup - - } - - void Application_End(object sender, EventArgs e) - { - // Code that runs on application shutdown - - } - - void Application_Error(object sender, EventArgs e) - { - // Code that runs when an unhandled error occurs - - } - - void Session_Start(object sender, EventArgs e) - { - // Code that runs when a new session is started - - } - - void Session_End(object sender, EventArgs e) - { - // Code that runs when a session ends. - // Note: The Session_End event is raised only when the sessionstate mode - // is set to InProc in the Web.config file. If session mode is set to StateServer - // or SQLServer, the event is not raised. - - } - - void Application_EndRequest(object sender, EventArgs e) - { - - } - - void Application_BeginRequest(object sender, EventArgs e) - { - //System.Diagnostics.Debugger.Break(); - if (HttpContext.Current.Request.Path == "/read.aspx") - { - // Signaler - SessionTests.mtxReader = new ManualResetEvent(false); - SessionTests.WaitSyncCreation(true); - } - else if (HttpContext.Current.Request.Path == "/write.aspx") - { - SessionTests.mtxWriter = new ManualResetEvent(false); - } - } - } -} diff --git a/Tests/MySql.Web.Tests/SessionLocking/InitSessionLocking.aspx.cs b/Tests/MySql.Web.Tests/SessionLocking/InitSessionLocking.aspx.cs deleted file mode 100644 index 3c0b2889f..000000000 --- a/Tests/MySql.Web.Tests/SessionLocking/InitSessionLocking.aspx.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright © 2004, 2013, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -// This code was contributed by Sean Wright (srwright@alcor.concordia.ca) on 2007-01-12 -// The copyright was assigned and transferred under the terms of -// the MySQL Contributor License Agreement (CLA) - -using System; -using System.Collections.Generic; -using System.Web; -using System.Web.UI; -using System.Web.UI.WebControls; - -namespace MySql.Web.Tests.SessionLocking -{ - public partial class InitSessionLocking : System.Web.UI.Page - { - protected void Page_Load(object sender, EventArgs e) - { - - } - } -} \ No newline at end of file diff --git a/Tests/MySql.Web.Tests/SessionLocking/read.aspx.cs b/Tests/MySql.Web.Tests/SessionLocking/read.aspx.cs deleted file mode 100644 index 30dcd2db3..000000000 --- a/Tests/MySql.Web.Tests/SessionLocking/read.aspx.cs +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright © 2004, 2013, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -// This code was contributed by Sean Wright (srwright@alcor.concordia.ca) on 2007-01-12 -// The copyright was assigned and transferred under the terms of -// the MySQL Contributor License Agreement (CLA) - -using System; -using System.Collections.Generic; -using System.Web; -using System.Web.UI; -using System.Web.UI.WebControls; -using System.Threading; -using MySql.Web.Tests; - -namespace MySql.Web.Tests -{ - public partial class read : System.Web.UI.Page - { - protected void Page_Load(object sender, EventArgs e) - { - object o = Session["x"]; - // Signaler - SessionTests.mtxReader.Set(); - } - } -} \ No newline at end of file diff --git a/Tests/MySql.Web.Tests/SessionLocking/write.aspx.cs b/Tests/MySql.Web.Tests/SessionLocking/write.aspx.cs deleted file mode 100644 index 52748c992..000000000 --- a/Tests/MySql.Web.Tests/SessionLocking/write.aspx.cs +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright © 2004, 2013, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -// This code was contributed by Sean Wright (srwright@alcor.concordia.ca) on 2007-01-12 -// The copyright was assigned and transferred under the terms of -// the MySQL Contributor License Agreement (CLA) - -using System; -using System.Collections.Generic; -using System.Web; -using System.Web.UI; -using System.Web.UI.WebControls; -using System.Threading; -using MySql.Web.Tests; - -namespace MySql.Web.Tests -{ - public partial class write : System.Web.UI.Page - { - protected void Page_Load(object sender, EventArgs e) - { - // Make session dirty - Session["x"] = "x"; - - SessionTests.mtxWriter.Set(); - SessionTests.WaitSyncCreation( false ); - } - } -} \ No newline at end of file diff --git a/Tests/MySql.Web.Tests/SessionLocking/write2.aspx.cs b/Tests/MySql.Web.Tests/SessionLocking/write2.aspx.cs deleted file mode 100644 index 4d3383d79..000000000 --- a/Tests/MySql.Web.Tests/SessionLocking/write2.aspx.cs +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright © 2004, 2013, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -// This code was contributed by Sean Wright (srwright@alcor.concordia.ca) on 2007-01-12 -// The copyright was assigned and transferred under the terms of -// the MySQL Contributor License Agreement (CLA) - -using System; -using System.Collections.Generic; -#if CLR4 - -#endif -using System.Web; -using System.Web.UI; -using System.Web.UI.WebControls; - -namespace MySql.Web.Tests -{ - public partial class write2 : System.Web.UI.Page - { - protected void Page_Load(object sender, EventArgs e) - { - Session["x"] = "x2"; - } - } -} \ No newline at end of file diff --git a/Tests/MySql.Web.Tests/SessionTests.cs b/Tests/MySql.Web.Tests/SessionTests.cs deleted file mode 100644 index 319a5afbc..000000000 --- a/Tests/MySql.Web.Tests/SessionTests.cs +++ /dev/null @@ -1,384 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using System.Threading; -using System.Web.SessionState; -using System.IO; -using MySql.Data.MySqlClient; -using MySql.Web.SessionState; -using System.Collections.Specialized; -using System.Net; -using System.Diagnostics; -using System.Configuration; - -namespace MySql.Web.Tests -{ - public class SessionTests : IUseFixture, IDisposable - { - private SetUpWeb st; - private string strSessionID { get; set; } - private string calledId { get; set; } - private AutoResetEvent _evt { get; set; } - - public void SetFixture(SetUpWeb data) - { - st = data; - } - - public void Dispose() - { - MySqlHelper.ExecuteScalar(st.conn, "DELETE FROM my_aspnet_sessions"); - } - - private byte[] Serialize(SessionStateItemCollection items) - { - MemoryStream ms = new MemoryStream(); - BinaryWriter writer = new BinaryWriter(ms); - if (items != null) - { - items.Serialize(writer); - } - writer.Close(); - return ms.ToArray(); - } - - - private void CreateSessionData(int AppId, DateTime timeCreated) - { - MySqlCommand cmd = new MySqlCommand(); - strSessionID = System.Guid.NewGuid().ToString(); - - //DateTime now = DateTime.Now; - //DateTime lastHour = now.Subtract(new TimeSpan(1, 0, 0)); - - SessionStateItemCollection collection = new SessionStateItemCollection(); - collection["FirstName"] = "Some"; - collection["LastName"] = "Name"; - byte[] items = Serialize(collection); - - string sql = @"INSERT INTO my_aspnet_sessions VALUES ( - @sessionId, @appId, @created, @expires, @lockdate, @lockid, @timeout, - @locked, @items, @flags)"; - - cmd = new MySqlCommand(sql, st.conn); - cmd.Parameters.AddWithValue("@sessionId", strSessionID); - cmd.Parameters.AddWithValue("@appId", AppId); - cmd.Parameters.AddWithValue("@created", timeCreated); - cmd.Parameters.AddWithValue("@expires", timeCreated); - cmd.Parameters.AddWithValue("@lockdate", timeCreated); - cmd.Parameters.AddWithValue("@lockid", 1); - cmd.Parameters.AddWithValue("@timeout", 1); - cmd.Parameters.AddWithValue("@locked", 0); - cmd.Parameters.AddWithValue("@items", items); - cmd.Parameters.AddWithValue("@flags", 0); - cmd.ExecuteNonQuery(); - - //create new row on sessioncleanup table - cmd.CommandText = "INSERT IGNORE INTO my_aspnet_sessioncleanup SET" + - " ApplicationId = @ApplicationId, " + - " LastRun = NOW(), " + - " IntervalMinutes = 10"; - cmd.Parameters.Clear(); - cmd.Parameters.AddWithValue("@ApplicationId", AppId); - cmd.ExecuteNonQuery(); - - // set our last run table to 1 hour ago - cmd.CommandText = "UPDATE my_aspnet_sessioncleanup SET LastRun=@lastHour WHERE ApplicationId = @ApplicationId"; - cmd.Parameters.Clear(); - cmd.Parameters.AddWithValue("@lastHour", DateTime.Now.Subtract(new TimeSpan(1, 0, 0))); - cmd.Parameters.AddWithValue("@ApplicationId", AppId); - cmd.ExecuteNonQuery(); - } - - - private void SetSessionItemExpiredCallback(bool includeCallback) - { - _evt = new AutoResetEvent(false); - calledId = null; - - CreateSessionData(1, DateTime.Now.Subtract(new TimeSpan(1, 0, 0))); - - MySqlSessionStateStore session = new MySqlSessionStateStore(); - - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("applicationName", "/"); - config.Add("enableExpireCallback", includeCallback ? "true" : "false"); - session.Initialize("SessionProvTest", config); - if (includeCallback) session.SetItemExpireCallback(expireCallback); - Thread.Sleep(1000); - session.Dispose(); - } - - private long CountSessions() - { - return (long)MySqlHelper.ExecuteScalar(st.conn, "SELECT COUNT(*) FROM my_aspnet_sessions"); - } - - public void expireCallback(string id, SessionStateStoreData item) - { - calledId = id; - _evt.Set(); - } - - - [Fact] - public void SessionItemWithExpireCallback() - { - SetSessionItemExpiredCallback(true); - _evt.WaitOne(); - - Assert.Equal(strSessionID, calledId); - - int i = 0; - while (((long)MySqlHelper.ExecuteScalar(st.conn, "SELECT Count(*) FROM my_aspnet_sessions;") != 0) && (i < 10)) - { - Thread.Sleep(500); - i++; - } - - Assert.Equal(0, CountSessions()); - } - - - [Fact] - public void SessionItemWithoutExpireCallback() - { - SetSessionItemExpiredCallback(false); - Assert.NotEqual(strSessionID, calledId); - - int i = 0; - while (((long)MySqlHelper.ExecuteScalar(st.conn, "SELECT Count(*) FROM my_aspnet_sessions;") != 0) && (i < 10)) - { - Thread.Sleep(500); - i++; - } - - Assert.Equal(0, CountSessions()); - } - - [Fact] - public void DeleteSessionAppSpecific() - { - // create two sessions of different appId - // it should delete only 1 - CreateSessionData(1, DateTime.Now.Subtract(new TimeSpan(1, 10, 0))); - CreateSessionData(2, DateTime.Now.Subtract(new TimeSpan(1, 0, 0))); - - MySqlSessionStateStore session = new MySqlSessionStateStore(); - - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("applicationName", "/"); - config.Add("enableExpireCallback", "false"); - session.Initialize("SessionTests", config); - - int i = 0; - while (CountSessions() == 2 && (i < 10)) - { - Thread.Sleep(500); - i++; - } - - session.Dispose(); - Assert.Equal(1, CountSessions()); - - } - - public class ThreadRequestData - { - public string pageName; - public ManualResetEvent signal; - public bool FirstDateToUpdate; - } - - delegate WebResponse GetResponse(); - delegate void ThreadRequest(ThreadRequestData data); - - [Fact(Timeout=1000000)] - public void SessionLocking() - { - // Copy updated configuration file for web server process - Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); - ConnectionStringSettings css = config.ConnectionStrings.ConnectionStrings["LocalMySqlServer"]; - string curDir = Directory.GetCurrentDirectory(); - string webconfigPath = string.Format(@"{0}\SessionLocking\{1}", Directory.GetCurrentDirectory(), @"web.config"); - string webconfigPathSrc = string.Format(@"{0}\SessionLocking\{1}", Directory.GetCurrentDirectory(), @"web_config_src.txt"); - - string text = File.ReadAllText(webconfigPathSrc); - text = text.Replace("connection_string_here", css.ConnectionString); - Version ver = System.Environment.Version; - if (ver.Major != 4) - { - text = text.Replace("", ""); - } - - File.WriteAllText(webconfigPath, text); - - int port = 12224; - - string webserverPath; - if (ver.Major == 4) - { - webserverPath = @"C:\Program Files (x86)\Common Files\microsoft shared\DevServer\10.0\WebDev.WebServer40.exe"; - } - else - { - webserverPath = @"C:\Program Files (x86)\Common Files\microsoft shared\DevServer\9.0\WebDev.WebServer.exe"; - } - string webserverArgs = string.Format(" /port:{0} /path:{1}\\SessionLocking", port, - Path.GetFullPath(@".")); - - DirectoryInfo di = new DirectoryInfo(Path.GetFullPath(curDir)); - Directory.CreateDirectory(Path.GetFullPath(@".\SessionLocking\bin")); - foreach (FileInfo fi in di.GetFiles("*.dll")) - { - File.Copy(fi.FullName, Path.Combine(Path.GetFullPath(@".\SessionLocking\bin\"), fi.Name), true); - } - - Process webserver = Process.Start(webserverPath, webserverArgs); - System.Threading.Thread.Sleep(2000); - - // This dummy request is just to get the ASP.NET sessionid to reuse. - HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:12224/InitSessionLocking.aspx"); - HttpWebResponse res = (HttpWebResponse)req.GetResponse(); - WebHeaderCollection headers = new WebHeaderCollection(); - - string url = res.ResponseUri.ToString().Replace("InitSessionLocking.aspx", ""); - Debug.Write(url); - - try - { - DateTime? firstDt = null; - DateTime? secondDt = null; - - ManualResetEvent[] re = new ManualResetEvent[2]; - re[0] = new ManualResetEvent(false); - re[1] = new ManualResetEvent(false); - ParameterizedThreadStart ts = - (object data1) => - { - ThreadRequestData data = (ThreadRequestData)data1; - Debug.WriteLine(string.Format("Requesting {0}", data.pageName)); - try - { - HttpWebRequest req1 = - (HttpWebRequest)WebRequest.Create(string.Format(@"{0}{1}", url, data.pageName)); - req1.Timeout = 2000000; - WebResponse res1 = req1.GetResponse(); - Debug.WriteLine(string.Format("Response from {0}", data.pageName)); - Stream s = res1.GetResponseStream(); - while (s.ReadByte() != -1) - ; - res1.Close(); - if (data.FirstDateToUpdate) - { - firstDt = DateTime.Now; - } - else - { - secondDt = DateTime.Now; - } - } - catch (Exception e) - { - Debug.WriteLine(string.Format("Server error: {0}", e.ToString())); - throw; - } - finally - { - data.signal.Set(); - } - }; - - Thread t = new Thread(ts); - Thread t2 = new Thread(ts); - t.Start(new ThreadRequestData() - { - pageName = "write.aspx", - FirstDateToUpdate = true, - signal = re[0] - }); - t2.Start(new ThreadRequestData() - { - pageName = "read.aspx", - FirstDateToUpdate = false, - signal = re[1] - }); - WaitHandle.WaitAll(re); - re[0].Reset(); - Thread t3 = new Thread(ts); - t3.Start(new ThreadRequestData() - { - pageName = "write2.aspx", - FirstDateToUpdate = false, - signal = re[0] - }); - WaitHandle.WaitAll(re); - double totalMillisecs = Math.Abs((secondDt.Value - firstDt.Value).TotalMilliseconds); - // OK if wait is less than session timeout - Debug.WriteLine(string.Empty); - Debug.WriteLine(totalMillisecs); - Assert.True(totalMillisecs < 30000); - } - finally - { - webserver.Kill(); - } - } - - public volatile static ManualResetEvent mtxReader = null; - public volatile static ManualResetEvent mtxWriter = null; - - public static void WaitSyncCreation(bool writer) - { - if (writer) - { - while (true) - { - if (mtxWriter == null) - Thread.Sleep(100); - else - break; - } - mtxWriter.WaitOne(); - } - else - { - while (true) - { - if (mtxReader == null) - Thread.Sleep(100); - else - break; - } - mtxReader.WaitOne(); - } - } - - - } -} diff --git a/Tests/MySql.Web.Tests/SetUpWeb.cs b/Tests/MySql.Web.Tests/SetUpWeb.cs deleted file mode 100644 index 2dbe3f7dc..000000000 --- a/Tests/MySql.Web.Tests/SetUpWeb.cs +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using System; -using System.Collections.Generic; -using System.Text; -using System.Web.Configuration; -using System.Configuration; -using MySql.Web.Common; -using MySql.Web.Security; -using System.Resources; -using MySql.Data.MySqlClient; -using System.Web.Security; -using MySql.Data.Entity.Tests; - -namespace MySql.Web.Tests -{ - public class SetUpWeb : SetUpClass, IDisposable - { - public SetUpWeb(): base() - { - for (int ver = 1; ver <= SchemaManager.Version; ver++) - LoadSchema(ver); - } - - public override void Initialize() - { - base.Initialize(); - MySqlConnection.ClearAllPools(); - AddConnectionStringToConfigFile(); - } - - private void AddConnectionStringToConfigFile() - { - Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); - config.ConnectionStrings.ConnectionStrings.Remove("LocalMySqlServer"); - config.Save(); - ConfigurationManager.RefreshSection("connectionStrings"); - - ConnectionStringSettings css = new ConnectionStringSettings(); - css.ConnectionString = String.Format( - "server={0};uid={1};password={2};database={3};pooling=false;port={4}", - this.host, this.user, this.password, this.database0, this.port); - css.Name = "LocalMySqlServer"; - config.ConnectionStrings.ConnectionStrings.Add(css); - config.Save(); - ConfigurationManager.RefreshSection("connectionStrings"); - } - - internal protected void LoadSchema(int version) - { - if (version < 1) return; - - MySQLMembershipProvider provider = new MySQLMembershipProvider(); - - ResourceManager r = new ResourceManager("MySql.Web.Properties.Resources", typeof(MySQLMembershipProvider).Assembly); - string schema = r.GetString(String.Format("schema{0}", version)); - MySqlScript script = new MySqlScript(conn); - script.Query = schema; - - try - { - script.Execute(); - } - catch (MySqlException ex) - { - if (ex.Number == 1050 && version == 7) - { - // Schema7 performs several renames of tables to their lowercase representation. - // If the current server OS does not support renaming to lowercase, then let's just continue. - script.Query = "UPDATE my_aspnet_schemaversion SET version=7"; - script.Execute(); - } - } - } - - internal string GetConnectionString() - { - Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); - ConnectionStringSettings css = config.ConnectionStrings.ConnectionStrings["LocalMySqlServer"]; - return css.ConnectionString; - } - - public override void Dispose() - { - base.Dispose(); - } - } -} diff --git a/Tests/MySql.Web.Tests/SimpleMembership.cs b/Tests/MySql.Web.Tests/SimpleMembership.cs deleted file mode 100644 index 70a9be1be..000000000 --- a/Tests/MySql.Web.Tests/SimpleMembership.cs +++ /dev/null @@ -1,322 +0,0 @@ -// Copyright © 2014, 2015 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Text; -using Xunit; -using MySql.Web.Security; -using System.Collections.Specialized; -using System.Web.Security; -using MySql.Data.MySqlClient; - -namespace MySql.Web.Tests -{ - public class SimpleMembership : IUseFixture, IDisposable - { - private string _connString; - private readonly string _userTable = "UserProfile"; - private readonly string _userIdColumn = "UserId"; - private readonly string _userNameColumn = "UserName"; - private readonly string _userName = "New User"; - private readonly string _pass = "password"; - private MySqlSimpleMembershipProvider _simpleProvider; - private MySqlSimpleRoleProvider _simpleRoleProvider; - - public void SetFixture(SetUpWeb data) - { - _connString = data.GetConnectionString(true); - - _simpleProvider = new MySqlSimpleMembershipProvider(); - _simpleRoleProvider = new MySqlSimpleRoleProvider(); - - var _config = new NameValueCollection(); - _config.Add("connectionStringName", "LocalMySqlServer"); - _config.Add("userTableName", "UserProfile"); - _config.Add("userIdColumn", "UserId"); - _config.Add("userNameColumn", "UserName"); - - _simpleProvider.Initialize("Test", _config); - _simpleRoleProvider.Initialize("TestRoleProvider", _config); - - MySqlWebSecurity.InitializeDatabaseConnection(_connString, "MySqlSimpleMembership", _userTable, _userIdColumn, _userNameColumn, true, true); - } - - public void Dispose() - { - } - - [Fact] - public void CheckIfRoleNotExists() - { - var roleExists = _simpleRoleProvider.RoleExists("roleName"); - Assert.False(roleExists); - } - - [Fact] - public void CheckIfRoleExists() - { - if (!Roles.RoleExists("Administrator")) - { - _simpleRoleProvider.CreateRole("Administrator"); - var roleExists = _simpleRoleProvider.RoleExists("Administrator"); - Assert.True(roleExists); - } - } - - [Fact] - public void CreateUserAndAccountTest() - { - try - { - MySqlWebSecurity.CreateUserAndAccount(_userName, _pass); - Assert.True(MySqlWebSecurity.UserExists(_userName)); - var user = MySqlHelper.ExecuteDataRow(_connString, string.Format("select * from {0} where {1} = '{2}'", _userTable, _userNameColumn, _userName)); - Assert.NotNull(user); - Assert.Equal(_userName, user[_userNameColumn]); - - Assert.True(_simpleProvider.ValidateUser(_userName, _pass)); - //We need to mock the login because in that method there is a call to "FormsAuthentication.SetAuthCookie" which causes an "Object reference not set to an instance of an object" exception, because the test doesn't run on web application context - //Assert.True(MySqlWebSecurity.Login(_userName, _pass)); - } - catch (Exception) - { - throw; - } - finally - { - CleanUser(); - } - } - - //We need to mock this test because there is no data on Membership object, there is no user available because login doesn't add it to the context - //[Fact] - public void ChangePasswordTest() - { - try - { - string newPass = "newpassword"; - MySqlWebSecurity.CreateUserAndAccount(_userName, _pass); - Assert.True(MySqlWebSecurity.UserExists(_userName)); - - //We need to mock the login because in that method there is a call to "FormsAuthentication.SetAuthCookie" which causes an "Object reference not set to an instance of an object" exception, because the test doesn't run on web application context - - Assert.True(_simpleProvider.ValidateUser(_userName, _pass)); - //Assert.True(MySqlWebSecurity.Login(_userName, _pass)); - - Assert.True(MySqlWebSecurity.ChangePassword(_userName, _pass, newPass)); - - Assert.True(_simpleProvider.ValidateUser(_userName, newPass)); - //Assert.True(MySqlWebSecurity.Login(_userName, newPass)); - } - catch (Exception) - { - throw; - } - finally - { - CleanUser(); - } - } - - [Fact] - public void ConfirmAccountWithTokenTest() - { - try - { - var token = MySqlWebSecurity.CreateUserAndAccount(_userName, _pass, null, true); - Assert.True(MySqlWebSecurity.UserExists(_userName)); - Assert.True(MySqlWebSecurity.ConfirmAccount(token)); - } - catch (Exception) - { - throw; - } - finally - { - CleanUser(); - } - } - - [Fact] - public void ConfirmAccountWithUserAndTokenTest() - { - try - { - var token = MySqlWebSecurity.CreateUserAndAccount(_userName, _pass, null, true); - Assert.True(MySqlWebSecurity.UserExists(_userName)); - Assert.True(MySqlWebSecurity.ConfirmAccount(_userName, token)); - } - catch (Exception) - { - throw; - } - finally - { - CleanUser(); - } - } - - [Fact] - public void ConfirmAccountWithoutTokenTest() - { - try - { - var token = "falsetoken"; - MySqlWebSecurity.CreateUserAndAccount(_userName, _pass); - Assert.True(MySqlWebSecurity.UserExists(_userName)); - Assert.False(MySqlWebSecurity.ConfirmAccount(token)); - } - catch (Exception) - { - throw; - } - finally - { - CleanUser(); - } - } - - [Fact] - public void CreatedDateTest() - { - try - { - MySqlWebSecurity.CreateUserAndAccount(_userName, _pass); - Assert.NotEqual(DateTime.MinValue, MySqlWebSecurity.GetCreateDate(_userName)); - } - catch (Exception) - { - throw; - } - finally - { - CleanUser(); - } - } - - [Fact] - public void DeleteTest() - { - try - { - _simpleProvider.CreateUserAndAccount(_userName, _pass, false, null); - Assert.True(_simpleProvider.DeleteAccount(_userName)); - _simpleProvider.CreateAccount(_userName, _pass, false); - Assert.True(_simpleProvider.DeleteUser(_userName, true)); - } - catch (Exception) - { - throw; - } - finally - { - CleanUser(); - } - } - - [Fact] - public void UserIsConfirmedTest() - { - try - { - MySqlWebSecurity.CreateUserAndAccount(_userName, _pass, null, true); - Assert.False(MySqlWebSecurity.IsConfirmed(_userName)); - } - catch (Exception) - { - throw; - } - finally - { - CleanUser(); - } - } - - [Fact] - public void UserIsLockedOutTest() - { - try - { - MySqlWebSecurity.CreateUserAndAccount(_userName, _pass, null, true); - Assert.False(MySqlWebSecurity.IsAccountLockedOut(_userName, 5, 60)); - } - catch (Exception) - { - throw; - } - finally - { - CleanUser(); - } - } - - [Fact] - public void PasswordTest() - { - try - { - MySqlWebSecurity.CreateUserAndAccount(_userName, _pass); - Assert.Equal(DateTime.MinValue, MySqlWebSecurity.GetLastPasswordFailureDate(_userName)); - Assert.NotEqual(DateTime.MinValue, MySqlWebSecurity.GetPasswordChangedDate(_userName)); - Assert.Equal(0, MySqlWebSecurity.GetPasswordFailuresSinceLastSuccess(_userName)); - } - catch (Exception) - { - throw; - } - finally - { - CleanUser(); - } - } - - //Password reset token must be assigned to the user but that field is not added in any part of the code, so maybe that field must be handled manually by the user - // should we handle this functionality? WebMatrix.WebData.SimpleMembershipProvider doesn't handle it - [Fact] - public void PasswordResetTokenTest() - { - try - { - var token = MySqlWebSecurity.CreateUserAndAccount(_userName, _pass, null, true); - int userID = MySqlWebSecurity.GetUserId(_userName); - Assert.True(MySqlWebSecurity.ConfirmAccount(token)); - var newToken = MySqlWebSecurity.GeneratePasswordResetToken(_userName, 1440); - Assert.NotEqual(null, newToken); - Assert.Equal(MySqlWebSecurity.GetUserIdFromPasswordResetToken(newToken), userID); - } - catch (Exception) - { - throw; - } - finally - { - CleanUser(); - } - } - - private void CleanUser() - { - _simpleProvider.DeleteUser(_userName, true); - } - } -} diff --git a/Tests/MySql.Web.Tests/SiteMapTests.cs b/Tests/MySql.Web.Tests/SiteMapTests.cs deleted file mode 100644 index bdf19aa6b..000000000 --- a/Tests/MySql.Web.Tests/SiteMapTests.cs +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright © 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Configuration; -using System.IO; -using System.Text; -using System.Web; -using System.Web.Hosting; -using Xunit; -using MySql.Data.MySqlClient; -using MySql.Web.SiteMap; - - -namespace MySql.Web.Tests -{ - public class SiteMapTests : IUseFixture, IDisposable - { - private SetUpWeb st; - - public void SetFixture(SetUpWeb data) - { - st = data; - st.rootConn.Close(); - st.rootConn = new MySqlConnection("server=localhost;userid=root;pwd=;database=" + st.conn.Database + ";port=" + st.port); - st.rootConn.Open(); - } - - public void Dispose() - { - st.ExecuteSQLAsRoot("Delete from my_aspnet_sitemap"); - } - - private void PopulateSiteMapTable() - { - string sql = @" -insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentId ) values ( 1, 'Index', 'The Index page', '~/Index.aspx', null, null ); -insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentId ) values ( 2, 'Chess Openings', 'Collection of Chess openings articles', '~/Openings.aspx', null, 1 ); -insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentId ) values ( 3, 'King''s Gambit', 'The hyper sharp King''s Gambit', '~/Openings/KingsGambit.aspx', null, 2 ); -insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentId ) values ( 4, 'Ruy Lopez', 'The spanish opening', '~/RuyLopez.aspx', null, 2 ); -insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentId ) values ( 5, 'Evan''s Gambit', 'The Funny Italian Game', '~/EvansGambit.aspx', null, 2 ); -insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentId ) values ( 6, 'Sicilian Defense', 'Sharp Double Edge Defense', '~/Sicilian.aspx', null, 2 ); -insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentId ) values ( 7, 'Middle Game', 'Middle Game Topics', '~/MiddleGame.aspx', null, 1 ); -insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentId ) values ( 8, 'Isolated Queen Pawn', 'Isolani Typical Positions', '~/Isolani.aspx', null, 7 ); -insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentId ) values ( 9, 'Rook vs Two Minor pieces', 'Rook vs Two Minor Pieces', '~/RookVsTwoMinor.aspx', null, 7 ); -insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentID ) values (10, 'Exchange Sacrifice', 'Sacrifice of Rook per Bishop or Knight', '~/ExchangeSacrifice.aspx', null, 7 ); -insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentID ) values (11, 'Nd5 Sacrifice in Sicilian', 'Sacrifice Nc3-Nd5 against Schevening like structures', '~/Nd5SacSicilian.aspx', null, 7 ); -insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentID ) values (12, 'Endings', 'Theory of chess endings & practical endings', '~/Endings.aspx', null, 1 ); -insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentID ) values (13, 'Rook Endings', 'Rook Endings', '~/RookEndigs.aspx', null, 12 ); -insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentID ) values (14, 'Queen vs Rook', 'Queen vs Rook, pawnless endings', '~/QueenVsRook.aspx ', null, 12 ); -insert into my_aspnet_sitemap( Id, Title, Description, Url, Roles, ParentID ) values (15, 'Isolated Queen Pawn Ending', 'Endings with queen pawn isolated', '~/IQPending.aspx', null, 12 ); -"; - MySqlConnection con = new MySqlConnection( st.GetConnectionString() ); - MySqlScript script = new MySqlScript(con, sql); - con.Open(); - try - { - script.Execute(); - } - finally - { - con.Close(); - } - } - - [Fact] - public void TestBuildSiteMap() - { - PopulateSiteMapTable(); - - MySqlSiteMapProvider prov = new MySqlSiteMapProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("applicationName", "/"); - config.Add("enableExpireCallback", "false"); - - prov.Initialize("SiteMapTests", config); - prov.BuildSiteMap(); - SiteMapNode node = prov.FindSiteMapNodeFromKey("5"); - SimpleWorkerRequest req = new SimpleWorkerRequest("/dummy", Environment.CurrentDirectory, "default.aspx", null, new StringWriter()); - HttpContext.Current = new HttpContext(req); - - Assert.Equal(node.Title, "Evan's Gambit"); - SiteMapNode nodep = prov.GetParentNode(node); - Assert.Equal(node.Description, "The Funny Italian Game"); - Assert.False(node.HasChildNodes); - SiteMapNode node2 = node.NextSibling; - Assert.NotNull(node2); - Assert.Equal(node2.Title, "Sicilian Defense"); - Assert.Equal(node2.Description, "Sharp Double Edge Defense"); - - node = node.PreviousSibling; - Assert.NotNull(node); - Assert.Equal(node.Title, "Ruy Lopez"); - Assert.Equal(node.Description, "The spanish opening"); - Assert.False(node.HasChildNodes); - Assert.NotNull(node.NextSibling); - - node = node.ParentNode; - Assert.Equal(node.Title, "Chess Openings"); - - node = node.ParentNode; - Assert.Equal(node.Title, "Index"); - - node = node.ParentNode; - Assert.Null(node); - - node = prov.RootNode; - Assert.Equal(node.Title, "Index"); - string[] childData = new string[] { "Chess Openings", "Middle Game", "Endings" }; - - for( int i = 0; i < node.ChildNodes.Count; i++ ) - { - SiteMapNode child = node.ChildNodes[ i ]; - Assert.Equal(child.Title, childData[ i ]); - } - } - } -} diff --git a/Tests/MySql.Web.Tests/TestProfile.cs b/Tests/MySql.Web.Tests/TestProfile.cs deleted file mode 100644 index 3a2cef3d4..000000000 --- a/Tests/MySql.Web.Tests/TestProfile.cs +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright © 2013 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; - -using System.Text; -using Xunit; -using System.Web.Profile; -using System.Web.Security; - -namespace MySql.Web.Tests -{ - public class TestProfile : ProfileBase - { - public static TestProfile GetUserProfile(string username, bool auth) - { - return Create(username, auth) as TestProfile; - } - - public static TestProfile GetUserProfile(bool auth) - { - return Create(Membership.GetUser().UserName, auth) as TestProfile; - } - - [SettingsAllowAnonymous(false)] - public string Description - { - get { return base["Description"] as string; } - set { base["Description"] = value; } - } - - [SettingsAllowAnonymous(false)] - public string Location - { - get { return base["Location"] as string; } - set { base["Location"] = value; } - } - - [SettingsAllowAnonymous(false)] - public string FavoriteMovie - { - get { return base["FavoriteMovie"] as string; } - set { base["FavoriteMovie"] = value; } - } - } -} diff --git a/Tests/MySql.Web.Tests/UserManagement.cs b/Tests/MySql.Web.Tests/UserManagement.cs deleted file mode 100644 index 56da15e52..000000000 --- a/Tests/MySql.Web.Tests/UserManagement.cs +++ /dev/null @@ -1,832 +0,0 @@ -// Copyright © 2013, 2014 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; - -using System.Text; -using Xunit; -using System.Web.Security; -using System.Collections.Specialized; -using MySql.Web.Security; -using System.Data; -using System.Configuration.Provider; -using MySql.Data.MySqlClient; - -namespace MySql.Web.Tests -{ - public class UserManagement : IUseFixture, IDisposable - { - private SetUpWeb st; - private MySQLMembershipProvider provider { get; set; } - - public void SetFixture(SetUpWeb data) - { - st = data; - st.execSQL("DROP TABLE IF EXISTS mysql_membership"); - } - - public void Dispose() - { - //Nothing to clean - } - - private void CreateUserWithFormat(MembershipPasswordFormat format) - { - provider = new MySQLMembershipProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("applicationName", "/"); - config.Add("passwordStrengthRegularExpression", "bar.*"); - config.Add("passwordFormat", format.ToString()); - provider.Initialize(null, config); - - // create the user - MembershipCreateStatus status; - provider.CreateUser("foo", "barbar!", "foo@bar.com", null, null, true, null, out status); - Assert.Equal(MembershipCreateStatus.Success, status); - - // verify that the password format is hashed. - DataTable table = st.FillTable("SELECT * FROM my_aspnet_membership"); - MembershipPasswordFormat rowFormat = - (MembershipPasswordFormat)Convert.ToInt32(table.Rows[0]["PasswordFormat"]); - Assert.Equal(format, rowFormat); - - // then attempt to verify the user - Assert.True(provider.ValidateUser("foo", "barbar!")); - - } - - [Fact] - public void CreateUserWithHashedPassword() - { - CreateUserWithFormat(MembershipPasswordFormat.Hashed); - //Cleanup - provider.DeleteUser("foo", true); - } - - [Fact] - public void CreateUserWithEncryptedPasswordWithAutoGenKeys() - { - //TODO check this test logic - try - { - CreateUserWithFormat(MembershipPasswordFormat.Encrypted); - } - catch (ProviderException) - { - } - //Cleanup - provider.DeleteUser("foo", true); - } - - [Fact] - public void CreateUserWithClearPassword() - { - CreateUserWithFormat(MembershipPasswordFormat.Clear); - //Cleanup - provider.DeleteUser("foo", true); - } - - /// - /// Bug #34792 New User/Changing Password Validation Not working. - /// - [Fact] - public void ChangePassword() - { - CreateUserWithFormat(MembershipPasswordFormat.Hashed); - ArgumentException ex = Assert.Throws(() => provider.ChangePassword("foo", "barbar!", "bar2")); - - Assert.Equal("newPassword", ex.ParamName); - Assert.True(ex.Message.Contains("length of parameter")); - ArgumentException ex1 = Assert.Throws(() => provider.ChangePassword("foo", "barbar!", "barbar2")); - Assert.Equal("newPassword", ex1.ParamName); - Assert.True(ex1.Message.Contains("alpha numeric")); - - // now test regex strength testing - bool result = provider.ChangePassword("foo", "barbar!", "zzzxxx!"); - Assert.False(result); - - // now do one that should work - result = provider.ChangePassword("foo", "barbar!", "barfoo!"); - Assert.True(result); - - provider.ValidateUser("foo", "barfoo!"); - - //Cleanup - provider.DeleteUser("foo", true); - } - - /// - /// Bug #34792 New User/Changing Password Validation Not working. - /// - [Fact] - public void CreateUserWithErrors() - { - provider = new MySQLMembershipProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("applicationName", "/"); - config.Add("passwordStrengthRegularExpression", "bar.*"); - config.Add("passwordFormat", "Hashed"); - provider.Initialize(null, config); - - // first try to create a user with a password not long enough - MembershipCreateStatus status; - MembershipUser user = provider.CreateUser("foo", "xyz", - "foo@bar.com", null, null, true, null, out status); - Assert.Null(user); - Assert.Equal(MembershipCreateStatus.InvalidPassword, status); - - // now with not enough non-alphas - user = provider.CreateUser("foo", "xyz1234", - "foo@bar.com", null, null, true, null, out status); - Assert.Null(user); - Assert.Equal(MembershipCreateStatus.InvalidPassword, status); - - // now one that doesn't pass the regex test - user = provider.CreateUser("foo", "xyzxyz!", - "foo@bar.com", null, null, true, null, out status); - Assert.Null(user); - Assert.Equal(MembershipCreateStatus.InvalidPassword, status); - - // now one that works - user = provider.CreateUser("foo", "barbar!", - "foo@bar.com", null, null, true, null, out status); - Assert.NotNull(user); - Assert.Equal(MembershipCreateStatus.Success, status); - - //Cleanup - provider.DeleteUser("foo", true); - - } - - [Fact] - public void DeleteUser() - { - CreateUserWithFormat(MembershipPasswordFormat.Hashed); - Assert.True(provider.DeleteUser("foo", true)); - DataTable table = st.FillTable("SELECT * FROM my_aspnet_membership"); - Assert.Equal(0, table.Rows.Count); - table = st.FillTable("SELECT * FROM my_aspnet_users"); - Assert.Equal(0, table.Rows.Count); - - CreateUserWithFormat(MembershipPasswordFormat.Hashed); - provider = new MySQLMembershipProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("applicationName", "/"); - provider.Initialize(null, config); - Assert.True(Membership.DeleteUser("foo", false)); - table = st.FillTable("SELECT * FROM my_aspnet_membership"); - Assert.Equal(0, table.Rows.Count); - table = st.FillTable("SELECT * FROM my_aspnet_users"); - Assert.Equal(1, table.Rows.Count); - } - - [Fact] - public void FindUsersByName() - { - CreateUserWithFormat(MembershipPasswordFormat.Hashed); - int records; - MembershipUserCollection users = provider.FindUsersByName("F%", 0, 10, out records); - Assert.Equal(1, records); - Assert.Equal("foo", users["foo"].UserName); - - //Cleanup - provider.DeleteUser("foo", true); - } - - [Fact] - public void FindUsersByEmail() - { - CreateUserWithFormat(MembershipPasswordFormat.Hashed); - - int records; - MembershipUserCollection users = provider.FindUsersByEmail("foo@bar.com", 0, 10, out records); - Assert.Equal(1, records); - Assert.Equal("foo", users["foo"].UserName); - - //Cleanup - provider.DeleteUser("foo", true); - } - - [Fact] - public void TestCreateUserOverrides() - { - try - { - MembershipCreateStatus status; - Membership.CreateUser("foo", "barbar!", null, "question", "answer", true, out status); - int records; - MembershipUserCollection users = Membership.FindUsersByName("F%", 0, 10, out records); - Assert.Equal(1, records); - Assert.Equal("foo", users["foo"].UserName); - - Membership.CreateUser("test", "barbar!", "myemail@host.com", - "question", "answer", true, out status); - users = Membership.FindUsersByName("T%", 0, 10, out records); - Assert.Equal(1, records); - Assert.Equal("test", users["test"].UserName); - } - catch (Exception ex) - { - Assert.True(ex.Message != String.Empty, ex.Message); - } - - //Cleanup - Membership.DeleteUser("test", true); - Membership.DeleteUser("foo", true); - } - - [Fact] - public void NumberOfUsersOnline() - { - int numOnline = Membership.GetNumberOfUsersOnline(); - Assert.Equal(0, numOnline); - - MembershipCreateStatus status; - Membership.CreateUser("foo", "barbar!", null, "question", "answer", true, out status); - Membership.CreateUser("foo2", "barbar!", null, "question", "answer", true, out status); - - numOnline = Membership.GetNumberOfUsersOnline(); - Assert.Equal(2, numOnline); - - //Cleanup - Membership.DeleteUser("foo"); - Membership.DeleteUser("foo2"); - } - - [Fact] - public void UnlockUser() - { - MembershipCreateStatus status; - Membership.CreateUser("foo", "barbar!", null, "question", "answer", true, out status); - Assert.False(Membership.ValidateUser("foo", "bar2")); - Assert.False(Membership.ValidateUser("foo", "bar3")); - Assert.False(Membership.ValidateUser("foo", "bar3")); - Assert.False(Membership.ValidateUser("foo", "bar3")); - Assert.False(Membership.ValidateUser("foo", "bar3")); - - // the user should be locked now so the right password should fail - Assert.False(Membership.ValidateUser("foo", "barbar!")); - - MembershipUser user = Membership.GetUser("foo"); - Assert.True(user.IsLockedOut); - - Assert.True(user.UnlockUser()); - user = Membership.GetUser("foo"); - Assert.False(user.IsLockedOut); - - Assert.True(Membership.ValidateUser("foo", "barbar!")); - - //Cleanup - Membership.DeleteUser("foo"); - } - - [Fact] - public void GetUsernameByEmail() - { - MembershipCreateStatus status; - Membership.CreateUser("foo", "barbar!", "foo@bar.com", "question", "answer", true, out status); - string username = Membership.GetUserNameByEmail("foo@bar.com"); - Assert.Equal("foo", username); - - username = Membership.GetUserNameByEmail("foo@b.com"); - Assert.Null(username); - - username = Membership.GetUserNameByEmail(" foo@bar.com "); - Assert.Equal("foo", username); - - //Cleanup - Membership.DeleteUser("foo"); - } - - [Fact] - public void UpdateUser() - { - MembershipCreateStatus status; - Membership.CreateUser("foo", "barbar!", "foo@bar.com", "color", "blue", true, out status); - Assert.Equal(MembershipCreateStatus.Success, status); - - MembershipUser user = Membership.GetUser("foo"); - - user.Comment = "my comment"; - user.Email = "my email"; - user.IsApproved = false; - user.LastActivityDate = new DateTime(2008, 1, 1); - user.LastLoginDate = new DateTime(2008, 2, 1); - Membership.UpdateUser(user); - - MembershipUser newUser = Membership.GetUser("foo"); - Assert.Equal(user.Comment, newUser.Comment); - Assert.Equal(user.Email, newUser.Email); - Assert.Equal(user.IsApproved, newUser.IsApproved); - Assert.Equal(user.LastActivityDate, newUser.LastActivityDate); - Assert.Equal(user.LastLoginDate, newUser.LastLoginDate); - - //Cleanup - Membership.DeleteUser("foo"); - } - - private void ChangePasswordQAHelper(MembershipUser user, string pw, string newQ, string newA) - { - try - { - user.ChangePasswordQuestionAndAnswer(pw, newQ, newA); - } - catch (ArgumentNullException ane) - { - Assert.Equal("password", ane.ParamName); - } - catch (ArgumentException) - { - Assert.NotNull(pw); - } - } - - [Fact] - public void ChangePasswordQuestionAndAnswer() - { - MembershipCreateStatus status; - Membership.CreateUser("foo", "barbar!", "foo@bar.com", "color", "blue", true, out status); - Assert.Equal(MembershipCreateStatus.Success, status); - - MembershipUser user = Membership.GetUser("foo"); - ChangePasswordQAHelper(user, "", "newQ", "newA"); - ChangePasswordQAHelper(user, "barbar!", "", "newA"); - ChangePasswordQAHelper(user, "barbar!", "newQ", ""); - ChangePasswordQAHelper(user, null, "newQ", "newA"); - - bool result = user.ChangePasswordQuestionAndAnswer("barbar!", "newQ", "newA"); - Assert.True(result); - - user = Membership.GetUser("foo"); - Assert.Equal("newQ", user.PasswordQuestion); - - //Cleanup - Membership.DeleteUser("foo"); - - } - - [Fact] - public void GetAllUsers() - { - MembershipCreateStatus status; - // first create a bunch of users - for (int i = 0; i < 100; i++) - Membership.CreateUser(String.Format("foo{0}", i), "barbar!", null, - "question", "answer", true, out status); - - MembershipUserCollection users = Membership.GetAllUsers(); - Assert.Equal(100, users.Count); - int index = 0; - foreach (MembershipUser user in users) - Assert.Equal(String.Format("foo{0}", index++), user.UserName); - - int total; - users = Membership.GetAllUsers(2, 10, out total); - Assert.Equal(10, users.Count); - Assert.Equal(100, total); - index = 0; - foreach (MembershipUser user in users) - Assert.Equal(String.Format("foo2{0}", index++), user.UserName); - - //Cleanup - MySqlHelper.ExecuteScalar(st.conn, "DELETE FROM my_aspnet_users"); - MySqlHelper.ExecuteScalar(st.conn, "DELETE FROM my_aspnet_membership"); - } - - private void GetPasswordHelper(bool requireQA, bool enablePasswordRetrieval, string answer) - { - MembershipCreateStatus status; - provider = new MySQLMembershipProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("requiresQuestionAndAnswer", requireQA ? "true" : "false"); - config.Add("enablePasswordRetrieval", enablePasswordRetrieval ? "true" : "false"); - config.Add("passwordFormat", "clear"); - config.Add("applicationName", "/"); - config.Add("writeExceptionsToEventLog", "false"); - provider.Initialize(null, config); - - provider.CreateUser("foo", "barbar!", "foo@bar.com", "color", "blue", true, null, out status); - - string password = string.Empty; - if (!enablePasswordRetrieval) - { - if (requireQA && answer != null) - { - Exception ex = Assert.Throws(() => provider.GetPassword("foo", answer)); - } - else - { - Exception ex = Assert.Throws(() => provider.GetPassword("foo", answer)); - Assert.Equal(ex.Message, "Password Retrieval Not Enabled."); - } - } - else - { - if (requireQA && answer != null) - { - provider.GetPassword("foo", answer); - } - else if (requireQA && answer == null) - { - //Incorrect password answer. - Assert.Throws(() => provider.GetPassword("foo", answer)); - } - else - { - password = provider.GetPassword("foo", answer); - Assert.Equal("barbar!", password); - } - } - - //Cleanup - provider.DeleteUser("foo", true); - } - - [Fact] - public void GetPassword() - { - GetPasswordHelper(false, false, null); - GetPasswordHelper(false, true, null); - GetPasswordHelper(true, true, null); - GetPasswordHelper(true, true, "blue"); - } - - /// - /// Bug #38939 MembershipUser.GetPassword(string answer) fails when incorrect answer is passed. - /// - [Fact] - public void GetPasswordWithWrongAnswer() - { - MembershipCreateStatus status; - provider = new MySQLMembershipProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("requiresQuestionAndAnswer", "true"); - config.Add("enablePasswordRetrieval", "true"); - config.Add("passwordFormat", "Encrypted"); - config.Add("applicationName", "/"); - provider.Initialize(null, config); - provider.CreateUser("foo", "barbar!", "foo@bar.com", "color", "blue", true, null, out status); - - MySQLMembershipProvider provider2 = new MySQLMembershipProvider(); - NameValueCollection config2 = new NameValueCollection(); - config2.Add("connectionStringName", "LocalMySqlServer"); - config2.Add("requiresQuestionAndAnswer", "true"); - config2.Add("enablePasswordRetrieval", "true"); - config2.Add("passwordFormat", "Encrypted"); - config2.Add("applicationName", "/"); - provider2.Initialize(null, config2); - Assert.Throws(() => provider2.GetPassword("foo", "wrong")); - - //Cleanup - provider.DeleteUser("foo", true); - } - - [Fact] - public void GetUser() - { - //Resetting PK - MySqlHelper.ExecuteScalar(st.conn, "ALTER TABLE my_aspnet_users AUTO_INCREMENT = 1;"); - - MembershipCreateStatus status; - Membership.CreateUser("foo", "barbar!", null, "question", "answer", true, out status); - MembershipUser user = Membership.GetUser(1); - Assert.Equal("foo", user.UserName); - - // now move the activity date back outside the login - // window - user.LastActivityDate = new DateTime(2008, 1, 1); - Membership.UpdateUser(user); - - user = Membership.GetUser("foo"); - Assert.False(user.IsOnline); - - user = Membership.GetUser("foo", true); - Assert.True(user.IsOnline); - - // now move the activity date back outside the login - // window again - user.LastActivityDate = new DateTime(2008, 1, 1); - Membership.UpdateUser(user); - - user = Membership.GetUser(1); - Assert.False(user.IsOnline); - - user = Membership.GetUser(1, true); - Assert.True(user.IsOnline); - - //Cleanup - Membership.DeleteUser("foo"); - } - - [Fact] - public void FindUsers() - { - MembershipCreateStatus status; - for (int i = 0; i < 100; i++) - Membership.CreateUser(String.Format("boo{0}", i), "barbar!", null, - "question", "answer", true, out status); - for (int i = 0; i < 100; i++) - Membership.CreateUser(String.Format("foo{0}", i), "barbar!", null, - "question", "answer", true, out status); - for (int i = 0; i < 100; i++) - Membership.CreateUser(String.Format("schmoo{0}", i), "barbar!", null, - "question", "answer", true, out status); - - - MembershipUserCollection users = Membership.FindUsersByName("fo%"); - Assert.Equal(100, users.Count); - - int total; - users = Membership.FindUsersByName("fo%", 2, 10, out total); - Assert.Equal(10, users.Count); - Assert.Equal(100, total); - int index = 0; - foreach (MembershipUser user in users) - Assert.Equal(String.Format("foo2{0}", index++), user.UserName); - - //Cleanup - MySqlHelper.ExecuteScalar(st.conn, "DELETE FROM my_aspnet_users"); - MySqlHelper.ExecuteScalar(st.conn, "DELETE FROM my_aspnet_membership"); - - } - - [Fact] - public void CreateUserWithNoQA() - { - MembershipCreateStatus status; - provider = new MySQLMembershipProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("requiresQuestionAndAnswer", "true"); - config.Add("passwordFormat", "clear"); - config.Add("applicationName", "/"); - provider.Initialize(null, config); - - Exception ex = Assert.Throws(() => provider.CreateUser("foo", "barbar!", "foo@bar.com", "color", null, true, null, out status)); - Assert.True(ex.Message.StartsWith("Password answer supplied is invalid", StringComparison.OrdinalIgnoreCase)); - - ex = Assert.Throws(() => provider.CreateUser("foo", "barbar!", "foo@bar.com", "", "blue", true, null, out status)); - Assert.True(ex.Message.StartsWith("Password question supplied is invalid", StringComparison.OrdinalIgnoreCase)); - - } - - [Fact] - public void MinRequiredAlpha() - { - provider = new MySQLMembershipProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("applicationName", "/"); - config.Add("minRequiredNonalphanumericCharacters", "3"); - provider.Initialize(null, config); - - MembershipCreateStatus status; - MembershipUser user = provider.CreateUser("foo", "pw!pass", "email", null, null, true, null, out status); - Assert.Null(user); - - user = provider.CreateUser("foo", "pw!pa!!", "email", null, null, true, null, out status); - Assert.NotNull(user); - - //Cleanup - Membership.DeleteUser("foo"); - - } - - /// - /// Bug #35332 GetPassword() don't working (when PasswordAnswer is NULL) - /// - [Fact] - public void GetPasswordWithNullValues() - { - MembershipCreateStatus status; - provider = new MySQLMembershipProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("requiresQuestionAndAnswer", "false"); - config.Add("enablePasswordRetrieval", "true"); - config.Add("passwordFormat", "clear"); - config.Add("applicationName", "/"); - provider.Initialize(null, config); - - MembershipUser user = provider.CreateUser("foo", "barbar!", "foo@bar.com", null, null, true, null, out status); - Assert.NotNull(user); - - string pw = provider.GetPassword("foo", null); - Assert.Equal("barbar!", pw); - - //Cleanup - Membership.DeleteUser("foo"); - } - - /// - /// Bug #35336 GetPassword() return wrong password (when format is encrypted) - /// - [Fact] - public void GetEncryptedPassword() - { - MembershipCreateStatus status; - provider = new MySQLMembershipProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("requiresQuestionAndAnswer", "false"); - config.Add("enablePasswordRetrieval", "true"); - config.Add("passwordFormat", "encrypted"); - config.Add("applicationName", "/"); - provider.Initialize(null, config); - - MembershipUser user = provider.CreateUser("foo", "barbar!", "foo@bar.com", null, null, true, null, out status); - Assert.NotNull(user); - - string pw = provider.GetPassword("foo", null); - Assert.Equal("barbar!", pw); - - //Cleanup - provider.DeleteUser("foo", true); - } - - /// - /// Bug #42574 ValidateUser does not use the application id, allowing cross application login - /// - [Fact] - public void CrossAppLogin() - { - provider = new MySQLMembershipProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("applicationName", "/"); - config.Add("passwordStrengthRegularExpression", "bar.*"); - config.Add("passwordFormat", "Clear"); - provider.Initialize(null, config); - MembershipCreateStatus status; - provider.CreateUser("foo", "bar!bar", null, null, null, true, null, out status); - - MySQLMembershipProvider provider2 = new MySQLMembershipProvider(); - NameValueCollection config2 = new NameValueCollection(); - config2.Add("connectionStringName", "LocalMySqlServer"); - config2.Add("applicationName", "/myapp"); - config2.Add("passwordStrengthRegularExpression", ".*"); - config2.Add("passwordFormat", "Clear"); - provider2.Initialize(null, config2); - - bool worked = provider2.ValidateUser("foo", "bar!bar"); - Assert.Equal(false, worked); - - //Cleanup - provider.DeleteUser("foo", true); - } - - /// - /// Bug #41408 PasswordReset not possible when requiresQuestionAndAnswer="false" - /// - [Fact] - public void ResetPassword() - { - provider = new MySQLMembershipProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("applicationName", "/"); - config.Add("passwordStrengthRegularExpression", "bar.*"); - config.Add("passwordFormat", "Clear"); - config.Add("requiresQuestionAndAnswer", "false"); - provider.Initialize(null, config); - - MembershipCreateStatus status; - provider.CreateUser("foo", "bar!bar", null, null, null, true, null, out status); - - MembershipUser u = provider.GetUser("foo", false); - string newpw = provider.ResetPassword("foo", null); - - //Cleanup - provider.DeleteUser("foo", true); - } - - /// - /// Bug #59438 setting Membership.ApplicationName has no effect - /// - [Fact] - public void ChangeAppName() - { - provider = new MySQLMembershipProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("applicationName", "/"); - config.Add("passwordStrengthRegularExpression", "bar.*"); - config.Add("passwordFormat", "Clear"); - provider.Initialize(null, config); - MembershipCreateStatus status; - provider.CreateUser("foo", "bar!bar", null, null, null, true, null, out status); - Assert.True(status == MembershipCreateStatus.Success); - - MySQLMembershipProvider provider2 = new MySQLMembershipProvider(); - NameValueCollection config2 = new NameValueCollection(); - config2.Add("connectionStringName", "LocalMySqlServer"); - config2.Add("applicationName", "/myapp"); - config2.Add("passwordStrengthRegularExpression", "foo.*"); - config2.Add("passwordFormat", "Clear"); - provider2.Initialize(null, config2); - provider2.CreateUser("foo2", "foo!foo", null, null, null, true, null, out status); - Assert.True(status == MembershipCreateStatus.Success); - - provider.ApplicationName = "/myapp"; - Assert.False(provider.ValidateUser("foo", "bar!bar")); - Assert.True(provider.ValidateUser("foo2", "foo!foo")); - - //Cleanup - //provider.DeleteUser("foo2", true); - //provider.DeleteUser("foo", true); - - //Cleanup - MySqlHelper.ExecuteScalar(st.conn, "DELETE FROM my_aspnet_users"); - MySqlHelper.ExecuteScalar(st.conn, "DELETE FROM my_aspnet_membership"); - - } - - [Fact] - public void GetUserLooksForExactUsername() - { - MembershipCreateStatus status; - Membership.CreateUser("code", "thecode!", null, "question", "answer", true, out status); - - MembershipUser user = Membership.GetUser("code"); - Assert.Equal("code", user.UserName); - - user = Membership.GetUser("co_e"); - Assert.Null(user); - - //Cleanup - Membership.DeleteUser("code"); - } - - [Fact] - public void GetUserNameByEmailLooksForExactEmail() - { - MembershipCreateStatus status; - Membership.CreateUser("code", "thecode!", "code@mysql.com", "question", "answer", true, out status); - - string username = Membership.GetUserNameByEmail("code@mysql.com"); - Assert.Equal("code", username); - - username = Membership.GetUserNameByEmail("co_e@mysql.com"); - Assert.Null(username); - - //Cleanup - Membership.DeleteUser("code"); - } - - /// - /// MySqlBug 73411, Oracle Bug: 19453313 - /// - [Fact] - public void CreateUserWithLeadingAndTrailingSpaces() - { - provider = new MySQLMembershipProvider(); - NameValueCollection config = new NameValueCollection(); - config.Add("connectionStringName", "LocalMySqlServer"); - config.Add("autogenerateschema", "true"); - config.Add("applicationName", "/"); - provider.Initialize(null, config); - - MembershipCreateStatus status; - MembershipUser muser1 = provider.CreateUser(" with trailing space ", "dummypassword1!", "w@w1.w", "yes", "yes", true, null, out status); - Assert.NotEqual(null, muser1); - MembershipUser muser2 = provider.GetUser("with trailing space", false); - Assert.NotEqual(null, muser1); - - Roles.CreateRole("SomeRole"); - Assert.True(Roles.GetAllRoles().Length > 0); - - bool isInRole = Roles.IsUserInRole(muser2.UserName, "SomeRole"); - Assert.False(isInRole); - - Roles.AddUserToRole(muser2.UserName, "SomeRole"); - - isInRole = Roles.IsUserInRole(muser2.UserName, "SomeRole"); - Assert.True(isInRole); - } - } -} diff --git a/Tests/MySql.Web.Tests/project.json b/Tests/MySql.Web.Tests/project.json deleted file mode 100644 index 55df629ce..000000000 --- a/Tests/MySql.Web.Tests/project.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "version": "7.0.7-m6", - "description": "MySql.Web.Tests", - "authors": [ - "Oracle" - ], - "copyright": "Copyright © 2016, 2017, Oracle and/or its affiliates. All rights reserved.", - "language": "en-US", - "packOptions": { - "projectUrl": "http://dev.mysql.com/downloads/", - "licenseUrl": "http://www.gnu.org/licenses/old-licenses/gpl-2.0.html", - "iconUrl": "http://www.mysql.com/common/logos/logo-mysql-170x115.png", - "tags": [ - "MySql", - ".NET Connector", - "MySql Connector/NET" - ], - "requireLicenseAcceptance": true - }, - "dependencies": { - "xunit": "1.9.2", - "MySql.Data": { - "target": "project" - }, - "MySql.Web": { - "target": "project" - }, - "MySql.EntityFramework6.Basic.Tests": { - "target": "project" - } - }, - "frameworks": { - "net451": { - "keyFile": "../../ConnectorNetPublicKey.snk", - "delaySign": true, - "publicSign": false, - "dependencies": { - "Microsoft.AspNet.Razor": "3.2.3", - "Microsoft.AspNet.WebPages": "3.2.3", - "Microsoft.AspNet.WebPages.Data": "3.2.3", - "Microsoft.AspNet.WebPages.WebData": "3.2.3", - "Microsoft.Web.Infrastructure": "1.0.0", - "WebMatrix.WebData": "2.0.30506" - }, - "frameworkAssemblies": { - "System.ComponentModel.DataAnnotations": "", - "System.Configuration.Install": "4.0.0.0", - "System.Core": "", - "System.Data": "", - "System.Data.DataSetExtensions": "", - "System.Management": "4.0.0.0", - "System.Runtime": { - "type": "build" - }, - "System.Security": "", - "System.Web": "4.0.0.0", - "System.Web.ApplicationServices": "4.0.0.0", - "System.Xml": "" - } - } - } -} \ No newline at end of file diff --git a/Tests/MySqlX.Data.Tests/BaseTest.cs b/Tests/MySqlX.Data.Tests/BaseTest.cs deleted file mode 100644 index 5f1a465f0..000000000 --- a/Tests/MySqlX.Data.Tests/BaseTest.cs +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright © 2015, 2017, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using MySqlX.XDevAPI; -using Xunit; -using MySqlX.XDevAPI.Relational; -using System.Reflection; -using System.IO; -using MySql.Data.MySqlClient; - -namespace MySqlX.Data.Tests -{ - public class BaseTest : IDisposable - { - protected XSession session; - protected Schema testSchema; - private static NodeSession nodeSession; - protected static readonly string schemaName; - - public static string ConnectionString { get; private set; } - public static string ConnectionStringUri { get; private set; } - public static string ConnectionStringNoPassword { get; private set; } - public static string ConnectionStringRoot { get; private set; } - -#if NETCORE10 - private static ConfigUtils config = new ConfigUtils(Path.GetFullPath(@"../..") + @"/appsettings.json"); -#endif - - static BaseTest() - { -#if NETCORE10 - Port = config.GetValue("MySql:Data:Port") ?? "3306"; - XPort = config.GetValue("MySqlX:Data:Port") ?? "33060"; -#else - Port = "3305"; - XPort = "33050"; -#endif - schemaName = "test"; - ConnectionStringRoot = $"server=localhost;port={Port};uid=root;password="; - ConnectionString = $"server=localhost;port={XPort};uid=test;password=test"; - ConnectionStringNoPassword = $"server=localhost;port={XPort};uid=testNoPass;"; - ConnectionStringUri = $"mysqlx://test:test@localhost:{XPort}"; - } - - protected static string Port - { - get; private set; - } - - protected static string XPort - { - get; private set; - } - - public BaseTest() - { - Assembly executingAssembly = typeof(BaseTest).GetTypeInfo().Assembly; - Stream stream = executingAssembly.GetManifestResourceStream("MySqlX.Data.Tests.Properties.CreateUsers.sql"); - StreamReader sr = new StreamReader(stream); - string sql = sr.ReadToEnd(); - sr.Dispose(); - ExecuteSqlAsRoot(sql); - session = GetSession(); - testSchema = session.GetSchema(schemaName); - if (testSchema.ExistsInDatabase()) - session.DropSchema(schemaName); - session.CreateSchema(schemaName); - } - - protected Table GetTable(string schema, string table) - { - return GetSession().GetSchema(schema).GetTable(table); - } - - protected SqlResult ExecuteSQL(string sql) - { - NodeSession nodeSession = GetNodeSession(); - nodeSession.SetCurrentSchema(schemaName); - SqlResult r = nodeSession.SQL(sql).Execute(); - var rows = r.HasData ? r.FetchAll() : null; - return r; - } - - protected Collection CreateCollection(string name) - { - XSession s = GetSession(); - Schema test = s.GetSchema(schemaName); - test.DropCollection(name); - return test.CreateCollection(name); - } - - public XSession GetSession() - { - if (session == null) - session = MySQLX.GetSession(ConnectionString); - return session; - } - - public NodeSession GetNodeSession() - { - if (nodeSession == null) - { - nodeSession = MySQLX.GetNodeSession(ConnectionString); - nodeSession.SetCurrentSchema(schemaName); - } - return nodeSession; - } - - protected void ExecuteSqlAsRoot(string sql) - { - var rootConn = new MySqlConnection(ConnectionStringRoot + ";ssl mode=none"); - rootConn.Open(); - MySqlScript s = new MySqlScript(rootConn, sql); - s.Execute(); - rootConn.Close(); - } - - public virtual void Dispose() - { - using (XSession s = GetSession()) - { - Schema schema = s.GetSchema(schemaName); - if(schema.ExistsInDatabase()) - s.DropSchema(schemaName); - Assert.False(schema.ExistsInDatabase()); - } - } - } -} diff --git a/Tests/MySqlX.Data.Tests/BasicFindTests.cs b/Tests/MySqlX.Data.Tests/BasicFindTests.cs deleted file mode 100644 index 80229edad..000000000 --- a/Tests/MySqlX.Data.Tests/BasicFindTests.cs +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.XDevAPI; -using MySqlX.XDevAPI.Common; -using MySqlX.XDevAPI.CRUD; -using System; -using Xunit; - -namespace MySqlX.Data.Tests -{ - public class BasicFindTests : BaseTest - { - [Fact] - public void SimpleFind() - { - Collection coll = CreateCollection("test"); - var docs = new[] - { - new { _id = 1, title = "Book 1", pages = 20 }, - new { _id = 2, title = "Book 2", pages = 30 }, - new { _id = 3, title = "Book 3", pages = 40 }, - new { _id = 4, title = "Book 4", pages = 50 }, - }; - Result r = coll.Add(docs).Execute(); - Assert.Equal(4, r.RecordsAffected); - - DocResult foundDocs = coll.Find("pages > 20").Execute(); - Assert.True(foundDocs.Next()); - Assert.True(foundDocs.Current["title"] == "Book 2"); - Assert.True(foundDocs.Next()); - Assert.True(foundDocs.Current["title"] == "Book 3"); - Assert.True(foundDocs.Next()); - Assert.True(foundDocs.Current["title"] == "Book 4"); - Assert.False(foundDocs.Next()); - } - - [Fact] - public void SimpleFindWithSort() - { - Collection coll = CreateCollection("test"); - var docs = new[] - { - new { _id = 1, title = "Book 1", pages = 20 }, - new { _id = 2, title = "Book 2", pages = 30 }, - new { _id = 3, title = "Book 3", pages = 40 }, - new { _id = 4, title = "Book 4", pages = 50 }, - }; - Result r = coll.Add(docs).Execute(); - Assert.Equal(4, r.RecordsAffected); - - DocResult foundDocs = coll.Find("pages > 20").OrderBy("pages DESC").Execute(); - Assert.True(foundDocs.Next()); - Assert.True(foundDocs.Current["title"] == "Book 4"); - Assert.True(foundDocs.Next()); - Assert.True(foundDocs.Current["title"] == "Book 3"); - Assert.True(foundDocs.Next()); - Assert.True(foundDocs.Current["title"] == "Book 2"); - Assert.False(foundDocs.Next()); - } - - [Fact] - public void SimpleFindWithLimit() - { - Collection coll = CreateCollection("test"); - var docs = new[] - { - new { _id = 1, title = "Book 1", pages = 20 }, - new { _id = 2, title = "Book 2", pages = 30 }, - new { _id = 3, title = "Book 3", pages = 40 }, - new { _id = 4, title = "Book 4", pages = 50 }, - }; - Result r = coll.Add(docs).Execute(); - Assert.Equal(4, r.RecordsAffected); - - DocResult foundDocs = coll.Find("pages > 20").Limit(1).Execute(); - Assert.True(foundDocs.Next()); - Assert.True(foundDocs.Current["title"] == "Book 2"); - Assert.False(foundDocs.Next()); - } - - [Fact] - public void FindConditional() - { - Collection coll = CreateCollection("test"); - var docs = new[] - { - new { _id = 1, title = "Book 1", pages = 20 }, - new { _id = 2, title = "Book 2", pages = 30 }, - new { _id = 3, title = "Book 3", pages = 40 }, - new { _id = 4, title = "Book 4", pages = 50 }, - }; - Result r = coll.Add(docs).Execute(); - Assert.Equal(4, r.RecordsAffected); - - DocResult foundDocs = coll.Find("pages = :Pages").Bind("pAges", 40).Execute(); - Assert.True(foundDocs.Next()); - Assert.True(foundDocs.Current["title"] == "Book 3"); - Assert.False(foundDocs.Next()); - } - - [Fact] - public void BindDbDoc() - { - Collection coll = CreateCollection("test"); - var docs = new[] - { - new { _id = 1, title = "Book 1", pages = 20 }, - new { _id = 2, title = "Book 2", pages = 30 }, - new { _id = 3, title = "Book 3", pages = 40 }, - new { _id = 4, title = "Book 4", pages = 50 }, - }; - Result r = coll.Add(docs).Execute(); - Assert.Equal(4, r.RecordsAffected); - - //var s = MySql.Data.ResourcesX.TestingResources; - - DbDoc docParams = new DbDoc(new { pages1 = 30, pages2 = 40 }); - DocResult foundDocs = coll.Find("pages = :Pages1 || pages = :Pages2").Bind(docParams).Execute(); - Assert.True(foundDocs.Next()); - Assert.Equal("Book 2", foundDocs.Current["title"]); - Assert.True(foundDocs.Next()); - Assert.Equal("Book 3", foundDocs.Current["title"]); - Assert.False(foundDocs.Next()); - } - - [Fact] - public void BindJsonAsAnonymous() - { - Collection coll = CreateCollection("test"); - var docs = new[] - { - new { _id = 1, title = "Book 1", pages = 20 }, - new { _id = 2, title = "Book 2", pages = 30 }, - new { _id = 3, title = "Book 3", pages = 40 }, - new { _id = 4, title = "Book 4", pages = 50 }, - }; - Result r = coll.Add(docs).Execute(); - Assert.Equal(4, r.RecordsAffected); - - var jsonParams = new { pages1 = 30, pages2 = 40 }; - DocResult foundDocs = coll.Find("pages = :Pages1 || pages = :Pages2").Bind(jsonParams).Execute(); - Assert.True(foundDocs.Next()); - Assert.Equal("Book 2", foundDocs.Current["title"]); - Assert.True(foundDocs.Next()); - Assert.Equal("Book 3", foundDocs.Current["title"]); - Assert.False(foundDocs.Next()); - } - - [Fact] - public void BindJsonAsString() - { - Collection coll = CreateCollection("test"); - var docs = new[] - { - new { _id = 1, title = "Book 1", pages = 20 }, - new { _id = 2, title = "Book 2", pages = 30 }, - new { _id = 3, title = "Book 3", pages = 40 }, - new { _id = 4, title = "Book 4", pages = 50 }, - }; - Result r = coll.Add(docs).Execute(); - Assert.Equal(4, r.RecordsAffected); - - var jsonParams = "{ \"pages1\" : 30, \"pages2\" : 40 }"; - DocResult foundDocs = coll.Find("pages = :Pages1 || pages = :Pages2").Bind(jsonParams).Execute(); - Assert.True(foundDocs.Next()); - Assert.Equal("Book 2", foundDocs.Current["title"]); - Assert.True(foundDocs.Next()); - Assert.Equal("Book 3", foundDocs.Current["title"]); - Assert.False(foundDocs.Next()); - } - } -} - diff --git a/Tests/MySqlX.Data.Tests/BasicSelectTests.cs b/Tests/MySqlX.Data.Tests/BasicSelectTests.cs deleted file mode 100644 index f267ba16d..000000000 --- a/Tests/MySqlX.Data.Tests/BasicSelectTests.cs +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.XDevAPI; -using MySqlX.XDevAPI.Relational; -using Xunit; - -namespace MySqlX.Data.Tests -{ - public class BasicSelectTests : BaseTest - { - [Fact] - public void SimpleSelect() - { - CreateBooksTable(); - Table books = GetTable("test", "books"); - - RowResult result = books.Select("name", "pages").Execute(); - var rows = result.FetchAll(); - Assert.True(result.Columns.Count == 2); - Assert.True(rows.Count == 2); - } - - [Fact] - public void SimpleSelectWithWhere() - { - CreateBooksTable(); - Table books = GetTable("test", "books"); - - RowResult result = books.Select("name", "pages").Where("pages > 250").Execute(); - var rows = result.FetchAll(); - Assert.True(result.Columns.Count == 2); - Assert.True(rows.Count == 1); - } - - private void CreateBooksTable() - { - ExecuteSQL("DROP TABLE IF EXISTS test.books"); - ExecuteSQL("CREATE TABLE test.books(id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), pages INT)"); - ExecuteSQL("INSERT INTO test.books VALUES (NULL, 'Moby Dick', 500)"); - ExecuteSQL("INSERT INTO test.books VALUES (NULL, 'A Tale of Two Cities', 250)"); - } - } -} diff --git a/Tests/MySqlX.Data.Tests/CollectionAsyncTests.cs b/Tests/MySqlX.Data.Tests/CollectionAsyncTests.cs deleted file mode 100644 index dfbc32c68..000000000 --- a/Tests/MySqlX.Data.Tests/CollectionAsyncTests.cs +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.XDevAPI; -using MySqlX.XDevAPI.Common; -using MySqlX.XDevAPI.CRUD; -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using Xunit; - -namespace MySqlX.Data.Tests -{ - public class CollectionAsyncTests : BaseTest - { - [Fact] - public void CollectionInsert() - { - var coll = CreateCollection("test"); - List> tasksList = new List>(); - - for (int i = 1; i <= 200; i++) - { - tasksList.Add(coll.Add(string.Format(@"{{ ""_id"": {0}, ""foo"": {0} }}", i)).ExecuteAsync()); - } - - Task.WaitAll(tasksList.ToArray(), TimeSpan.FromMinutes(2)); - } - - [Fact] - public void MultipleFindAsync() - { - var coll = testSchema.CreateCollection("test"); - int docs = 100; - HashSet validator = new HashSet(); - var addStatement = coll.Add(new { id = 1, age = 1 }); - - for (int i = 2; i <= docs; i++) - { - addStatement.Add(new { id = i, age = i }); - } - var result = addStatement.Execute(); - - List> tasksList = new List>(); - - for (int i = 1; i <= docs; i++) - { - tasksList.Add(coll.Find("age = :age").Bind("AgE", i).ExecuteAsync()); - } - - Assert.True(Task.WaitAll(tasksList.ToArray(), TimeSpan.FromMinutes(2)), "WaitAll timeout"); - foreach (Task task in tasksList) - { - var doc = task.Result.FetchOne(); - string value = task.Result.Current["age"]; - Assert.False(validator.Contains(value), value + " value exists"); - validator.Add(value); - } - Assert.Equal(docs, validator.Count); - } - } -} diff --git a/Tests/MySqlX.Data.Tests/CollectionTests.cs b/Tests/MySqlX.Data.Tests/CollectionTests.cs deleted file mode 100644 index fde82aa91..000000000 --- a/Tests/MySqlX.Data.Tests/CollectionTests.cs +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright © 2015, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Collections.Generic; -using MySqlX.XDevAPI; -using Xunit; -using MySql.Data.MySqlClient; - -namespace MySqlX.Data.Tests -{ - public class CollectionTests : BaseTest - { - [Fact] - public void GetAllCollections() - { - Collection book = CreateCollection("book"); - List collections = book.Schema.GetCollections(); - Assert.True(collections.Count == 1); - Assert.True(collections[0].Name == "book"); - } - - [Fact] - public void CreateAndDeleteCollection() - { - XSession s = GetSession(); - Schema test = s.GetSchema("test"); - Collection testColl = test.CreateCollection("test"); - Assert.True(testColl.ExistsInDatabase()); - test.DropCollection("test"); - Assert.False(testColl.ExistsInDatabase()); - } - - [Fact] - public void CreateCollectionIndex() - { - XSession session = GetSession(); - Schema test = session.GetSchema("test"); - Collection testColl = test.CreateCollection("test"); - Assert.True(testColl.ExistsInDatabase(), "ExistsInDatabase failed"); - var result = testColl.CreateIndex("testIndex", true).Field("$.myId", "INT", true).Execute(); - result = testColl.Add(new { myId = 1 }).Add(new { myId = 2 }).Execute(); - Assert.Throws(() => testColl.Add(new { myId = 1 }).Execute()); - result = testColl.DropIndex("testIndex"); - result = testColl.Add(new { myId = 1 }).Execute(); - } - - } -} diff --git a/Tests/MySqlX.Data.Tests/CrudInsertTests.cs b/Tests/MySqlX.Data.Tests/CrudInsertTests.cs deleted file mode 100644 index bfb2a67fc..000000000 --- a/Tests/MySqlX.Data.Tests/CrudInsertTests.cs +++ /dev/null @@ -1,188 +0,0 @@ -// Copyright © 2015, 2017, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.XDevAPI; -using MySqlX.XDevAPI.Common; -using System; -using Xunit; - -namespace MySqlX.Data.Tests -{ - public class CrudInsertTests : BaseTest - { - [Fact] - public void InsertSingleDbDocWithId() - { - Collection coll = CreateCollection("test"); - Result r = coll.Add(@"{ ""_id"": 1, ""foo"": 1 }").Execute(); - Assert.Equal(1, r.RecordsAffected); - Assert.Equal(1, coll.Count()); - Assert.False(string.IsNullOrWhiteSpace(r.DocumentId)); - Assert.Equal(1, r.DocumentIds.Count); - } - - [Fact] - public void InsertSingleDbDocWithoutId() - { - Collection coll = CreateCollection("test"); - Result r = coll.Add("{ \"foo\": 1 }").Execute(); - Assert.Equal(1, r.RecordsAffected); - Assert.Equal(1, coll.Count()); - Assert.False(string.IsNullOrWhiteSpace(r.DocumentId)); - Assert.Equal(1, r.DocumentIds.Count); - } - - [Fact] - public void InsertMultipleDbDocWithoutId() - { - Collection coll = CreateCollection("test"); - Result r = coll.Add("{ \"foo\": 1 }") - .Add("{ \"amber\": 2 }") - .Add("{ \"any\": 3 }") - .Execute(); - Assert.Equal(3, r.RecordsAffected); - Assert.Equal(3, coll.Count()); - Assert.Throws(() => r.DocumentId); - Assert.Equal(3, r.DocumentIds.Count); - } - - [Fact] - public void InsertAnonymousObjectWithId() - { - var obj = new { _id = "5", name = "Sakila", age = 15 }; - - Collection coll = CreateCollection("test"); - Result r = coll.Add(obj).Execute(); - Assert.Equal(1, r.RecordsAffected); - //TODO: pull object and verify data - Assert.Equal(1, coll.Count()); - Assert.False(string.IsNullOrWhiteSpace(r.DocumentId)); - Assert.Equal(1, r.DocumentIds.Count); - } - - [Fact] - public void InsertAnonymousObjectWithNoId() - { - var obj = new { name = "Sakila", age = 15 }; - - Collection coll = CreateCollection("test"); - Result r = coll.Add(obj).Execute(); - Assert.Equal(1, r.RecordsAffected); - //TODO: pull object and verify data - Assert.Equal(1, coll.Count()); - Assert.False(string.IsNullOrWhiteSpace(r.DocumentId)); - Assert.Equal(1, r.DocumentIds.Count); - } - - [Fact] - public void InsertMultipleAnonymousObjectsWithId() - { - Collection coll = CreateCollection("test"); - var docs = new[] - { - new { _id = 1, title = "Book 1", pages = 20 }, - new { _id = 2, title = "Book 2", pages = 30 }, - new { _id = 3, title = "Book 3", pages = 40 }, - new { _id = 4, title = "Book 4", pages = 50 }, - }; - Result r = coll.Add(docs).Execute(); - Assert.Equal(4, r.RecordsAffected); - Assert.Equal(4, coll.Count()); - Assert.Throws(() => r.DocumentId); - Assert.Equal(4, r.DocumentIds.Count); - } - - [Fact] - public void ValidatesDocumentIds() - { - Collection coll = CreateCollection("test"); - Result result = coll.Add(new { name = "Book 1" }).Execute(); - Assert.Equal(1, result.RecordsAffected); - - result = coll.Modify($"_id = '{result.DocumentId}'").Set("pages", "20").Execute(); - Assert.Equal(1, result.RecordsAffected); - Assert.Null(result.DocumentId); - Assert.Null(result.DocumentIds); - } - - [Fact] - public void ReuseStatement() - { - Collection coll = CreateCollection("test"); - var docs = new[] - { - new { _id = 1, title = "Book 1", pages = 20 }, - new { _id = 2, title = "Book 2", pages = 30 }, - new { _id = 3, title = "Book 3", pages = 40 }, - new { _id = 4, title = "Book 4", pages = 50 }, - }; - var stmt = coll.Add(0); - stmt.Execute(); - foreach (var doc in docs) - { - Result r = stmt.Add(doc).Execute(); - Assert.Equal(1, r.RecordsAffected); - } - Assert.Equal(5, coll.Count()); - } - - [Fact] - public void EmptyDocArray() - { - Collection coll = CreateCollection("test"); - - var insertResult = coll.Add(new DbDoc[] { }).Execute(); - Assert.Equal(0ul, insertResult.RecordsAffected); - - var result = coll.Find().Execute().FetchAll(); - Assert.Equal(0, result.Count); - } - - [Fact] - public void NullParameter() - { - Collection coll = CreateCollection("test"); - - Assert.Throws(() => coll.Add(null).Execute()); - } - - [Fact] - public void InsertingArray() - { - var docs = new[] - { - new { id = 1, title = "Book 1" }, - new { id = 2, title = "Book 2" }, - }; - DbDoc d2 = new DbDoc(); - d2.SetValue("_id", 1); - d2.SetValue("books", docs); - d2.SetValue("pages", 20); - - Collection coll = CreateCollection("test"); - coll.Add(d2).Execute(); - var result = coll.Find().Execute().FetchAll(); - Assert.Equal(1, result.Count); - Assert.Equal(d2.ToString(), result[0].ToString()); - } - } -} diff --git a/Tests/MySqlX.Data.Tests/CrudRemoveTests.cs b/Tests/MySqlX.Data.Tests/CrudRemoveTests.cs deleted file mode 100644 index 1a3148fd9..000000000 --- a/Tests/MySqlX.Data.Tests/CrudRemoveTests.cs +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using MySqlX.XDevAPI; -using Xunit; -using MySqlX.XDevAPI.Common; - -namespace MySqlX.Data.Tests -{ - public class CrudRemoveTests : BaseTest - { - [Fact] - public void RemoveSingleDocumentById() - { - Collection coll = CreateCollection("test"); - var docs = new { _id = 12, title = "Book 1", pages = 20 }; - Result r = coll.Add(docs).Execute(); - Assert.Equal(1, r.RecordsAffected); - - r = coll.Remove(12).Execute(); - Assert.Equal(1, r.RecordsAffected); - } - - [Fact] - public void RemoveMultipleDocuments() - { - Collection coll = CreateCollection("test"); - var docs = new[] - { - new { _id = 1, title = "Book 1", pages = 20 }, - new { _id = 2, title = "Book 2", pages = 30 }, - new { _id = 3, title = "Book 3", pages = 40 }, - new { _id = 4, title = "Book 4", pages = 50 }, - }; - Result r = coll.Add(docs).Execute(); - Assert.Equal(4, r.RecordsAffected); - - r = coll.Remove("pages > 20").Execute(); - Assert.Equal(3, r.RecordsAffected); - } - - [Fact] - public void RemoveMultipleDocumentsWithLimit() - { - Collection coll = CreateCollection("test"); - var docs = new[] - { - new { _id = 1, title = "Book 1", pages = 20 }, - new { _id = 2, title = "Book 2", pages = 30 }, - new { _id = 3, title = "Book 3", pages = 40 }, - new { _id = 4, title = "Book 4", pages = 50 }, - }; - Result r = coll.Add(docs).Execute(); - Assert.Equal(4, r.RecordsAffected); - - r = coll.Remove("pages > 20").Limit(1).Execute(); - Assert.Equal(1, r.RecordsAffected); - } - - [Fact] - public void RemoveMultipleDocumentsWithLimitAndOrder() - { - Collection coll = CreateCollection("test"); - var docs = new[] - { - new { _id = 1, title = "Book 1", pages = 20 }, - new { _id = 2, title = "Book 2", pages = 30 }, - new { _id = 3, title = "Book 3", pages = 40 }, - new { _id = 4, title = "Book 4", pages = 50 }, - }; - Result r = coll.Add(docs).Execute(); - Assert.Equal(4, r.RecordsAffected); - - r = coll.Remove("pages > 20").Limit(1).Execute(); - Assert.Equal(1, r.RecordsAffected); - } - - [Fact] - public void RemovingDocWithNoIdThrowsException() - { - Collection coll = CreateCollection("test"); - DbDoc doc = new DbDoc(); - Exception ex = Assert.Throws(() => coll.Remove(doc)); - } - - [Fact] - public void RemovingItemUsingDbDoc() - { - Collection coll = CreateCollection("test"); - DbDoc doc = new DbDoc(new { _id = 1, title = "Book 1", pages = 20 }); - Result r = coll.Add(doc).Execute(); - Assert.Equal(1, r.RecordsAffected); - - r = coll.Remove(doc).Execute(); - Assert.Equal(1, r.RecordsAffected); - } - - [Fact] - public void RemoveBind() - { - Collection coll = CreateCollection("test"); - var docs = new[] - { - new { _id = 1, title = "Book 1", pages = 20 }, - new { _id = 2, title = "Book 2", pages = 30 }, - new { _id = 3, title = "Book 3", pages = 40 }, - new { _id = 4, title = "Book 4", pages = 50 }, - }; - Result r = coll.Add(docs).Execute(); - Assert.Equal(4, r.RecordsAffected); - - r = coll.Remove("pages = :Pages").Bind("pAges", 50).Execute(); - Assert.Equal(1, r.RecordsAffected); - } - } -} diff --git a/Tests/MySqlX.Data.Tests/CrudTests/CrudGCTests.cs b/Tests/MySqlX.Data.Tests/CrudTests/CrudGCTests.cs deleted file mode 100644 index b0c1b8c6d..000000000 --- a/Tests/MySqlX.Data.Tests/CrudTests/CrudGCTests.cs +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.XDevAPI; -using MySqlX.XDevAPI.Common; -using System; -using Xunit; - -namespace MySqlX.Data.Tests.ResultTests -{ - public class CrudGCTests : BaseTest - { - [Fact] - public void FetchAllNoReference() - { - Collection testColl = CreateCollection("test"); - var stmt = testColl.Add(@"{ ""_id"": 1, ""foo"": 1 }"); - stmt.Add(@"{ ""_id"": 2, ""foo"": 2 }"); - stmt.Add(@"{ ""_id"": 3, ""foo"": 3 }"); - stmt.Add(@"{ ""_id"": 4, ""foo"": 4 }"); - Result result = stmt.Execute(); - Assert.Equal(4, (int)result.RecordsAffected); - - var docResult = testColl.Find().Execute(); - var docs = docResult.FetchAll(); - WeakReference wr = new WeakReference(docResult); - docResult = null; - GC.Collect(); - Assert.False(wr.IsAlive); - Assert.Equal(4, docs.Count); - } - } -} diff --git a/Tests/MySqlX.Data.Tests/CrudTests/DocBufferingTests.cs b/Tests/MySqlX.Data.Tests/CrudTests/DocBufferingTests.cs deleted file mode 100644 index dd77a5aed..000000000 --- a/Tests/MySqlX.Data.Tests/CrudTests/DocBufferingTests.cs +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.XDevAPI; -using MySqlX.XDevAPI.Common; -using Xunit; - -namespace MySqlX.Data.Tests.CrudTests -{ - public class DocBufferingTests : BaseTest - { - [Fact] - public void SmartBuffering() - { - Collection test = CreateCollection("test"); - Collection test2 = CreateCollection("test2"); - - var docs = new[] - { - new { _id = 1, title = "Book 1", pages = 20 }, - new { _id = 2, title = "Book 2", pages = 30 }, - new { _id = 3, title = "Book 3", pages = 40 }, - new { _id = 4, title = "Book 4", pages = 50 }, - }; - Result r = test.Add(docs).Execute(); - - var docResult = test.Find().Execute(); - foreach (var doc in docResult) - { - var result = test2.Add(doc).Execute(); - Assert.Equal(1, result.RecordsAffected); - } - } - } -} diff --git a/Tests/MySqlX.Data.Tests/CrudUpdateTests.cs b/Tests/MySqlX.Data.Tests/CrudUpdateTests.cs deleted file mode 100644 index eab9213a2..000000000 --- a/Tests/MySqlX.Data.Tests/CrudUpdateTests.cs +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.Serialization; -using MySqlX.XDevAPI; -using MySqlX.XDevAPI.Common; -using System; -using Xunit; - -namespace MySqlX.Data.Tests -{ - public class CrudUpdateTests : BaseTest - { - [Fact] - public void SetItemInSingleDocument() - { - Collection coll = CreateCollection("test"); - Result result = coll.Add(new { _id = 1, name = "Book 1" }).Execute(); - Assert.Equal(1, result.RecordsAffected); - - result = coll.Modify("_id = 1").Set("pages", "20").Execute(); - Assert.Equal(1, result.RecordsAffected); - } - - [Fact] - public void ChangeItemInSingleDocument() - { - Collection coll = CreateCollection("test"); - Result result = coll.Add(new { _id = 1, name = "Book 1", pages = 20 }).Execute(); - Assert.Equal(1, result.RecordsAffected); - - result = coll.Modify("_id = 1").Change("name", "Book 2").Execute(); - Assert.Equal(1, result.RecordsAffected); - } - - [Fact] - public void RemoveItemInSingleDocument() - { - Collection coll = CreateCollection("test"); - Result result = coll.Add(new { _id = 1, name = "Book 1", pages = 20 }).Execute(); - Assert.Equal(1, result.RecordsAffected); - - result = coll.Modify("_id = 1").Unset("pages").Execute(); - Assert.Equal(1, result.RecordsAffected); - } - - [Fact] - public void SetItemAndBind() - { - Collection coll = CreateCollection("test"); - Result result = coll.Add(new { _id = 1, name = "Book 1" }) - .Add(new { _id = 2, name = "Book 2" }).Execute(); - Assert.Equal(2, result.RecordsAffected); - - var stmt = coll.Modify("_id = :ID"); - result = stmt.Bind("Id", 2).Set("pages", "20").Execute(); - Assert.Equal(1, result.RecordsAffected); - result = stmt.Bind("Id", 1).Set("pages", "10").Execute(); - Assert.Equal(1, result.RecordsAffected); - - var docs = coll.Find().Execute().FetchAll(); - Assert.Equal(new DbDoc("{ \"_id\": 1, \"name\": \"Book 1\", \"pages\": 10 }").ToString(), docs[0].ToString()); - Assert.Equal(new DbDoc("{ \"_id\": 2, \"name\": \"Book 2\", \"pages\": 20 }").ToString(), docs[1].ToString()); - } - } -} diff --git a/Tests/MySqlX.Data.Tests/CrudViewsTests.cs b/Tests/MySqlX.Data.Tests/CrudViewsTests.cs deleted file mode 100644 index def27189f..000000000 --- a/Tests/MySqlX.Data.Tests/CrudViewsTests.cs +++ /dev/null @@ -1,262 +0,0 @@ -// Copyright © 2017, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySql.Data.MySqlClient; -using MySqlX.XDevAPI; -using MySqlX.XDevAPI.Relational; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Xunit; - -namespace MySqlX.Data.Tests -{ - public class CrudViewsTests : BaseTest - { - #region Private methods - - private string tableName = "test"; - private string collectionName = "mycoll"; - object[][] allRows = { - new object[] { 1, "jonh doe", 38 }, - new object[] { 2, "milton green", 45 } - }; - - - public override void Dispose() - { - GetSession().DropSchema(schemaName); - base.Dispose(); - } - - private void CreateTableData() - { - ExecuteSQL($"CREATE TABLE `{tableName}` (id INT, name VARCHAR(45), age INT)"); - Table table = GetSession().GetSchema(schemaName).GetTable(tableName); - var insertStmt = table.Insert().Values(allRows[0]); - for (int i = 1; i < allRows.Length; i++) - insertStmt.Values(allRows[0]); - insertStmt.Execute(); - } - - private void CreateCollectionData() - { - var coll = GetSession().GetSchema(schemaName).CreateCollection(collectionName); - var addStmt = coll.Add(ConvertObjToAnonymous(allRows[0])); - for (int i = 1; i < allRows.Length; i++) - addStmt.Add(ConvertObjToAnonymous(allRows[i])); - addStmt.Execute(); - } - - private object ConvertObjToAnonymous(object[] values) - { - return new { id = values[0], name = values[1], age = values[2] }; - } - - #endregion - - #region Create View - - [Fact] - public void CreateSimpleView() - { - CreateTableData(); - Schema db = GetSession().Schema; - Table table = db.GetTable(tableName); - db.CreateView("myview") - .DefinedAs(table.Select().Limit(1)) - .Execute(); - - Table view = db.GetTable("myview"); - Assert.True(view.IsView); - Assert.Equal(1, view.Count()); - } - - [Fact] - public void CreateBasicViewFromTable() - { - CreateTableData(); - Schema db = GetSession().Schema; - Table table = db.GetTable(tableName); - db.CreateView("myview") - .DefinedAs(table.Select()) - .Execute(); - - Table view = db.GetTable("myview"); - Assert.True(view.IsView); - Assert.Equal(allRows.Length, view.Count()); - } - - [Fact] - public void CreateViewFromTable() - { - CreateTableData(); - Schema db = GetSession().Schema; - Table table = db.GetTable(tableName); - db.CreateView("myview") - .DefinedAs(table.Select()) - .Algorithm(DataAccess.ViewAlgorithmEnum.Merge) - .Columns("id1", "name1", "age1") - .Definer($"{GetSession().Settings.UserID}@localhost") - .Security(DataAccess.ViewSqlSecurityEnum.Definer) - .WithCheckOption(DataAccess.ViewCheckOptionEnum.Local) - .Execute(); - - Table view = db.GetTable("myview"); - Assert.True(view.IsView); - Assert.Equal(allRows.Length, view.Count()); - } - - [Fact] - public void CreateViewDeferedExecute() - { - CreateTableData(); - Schema db = GetSession().Schema; - Table table = db.GetTable(tableName); - var query = table.Select(); - var createView = db.CreateView("myview").DefinedAs(query); - // change the defined query but the view should be unaffected - query.Where("id = 5"); - query.Limit(1); - var result = createView.Execute(); - - Table view = db.GetTable("myview"); - Assert.True(view.IsView); - Assert.Equal(allRows.Length, view.Count()); - } - - [Fact] - public void CreateViewNullValidations() - { - CreateTableData(); - Schema db = GetSession().Schema; - Table table = db.GetTable(tableName); - Assert.Equal("Name", Assert.ThrowsAny(() => db.CreateView("").Execute()).ParamName); - Assert.Equal("Query", Assert.ThrowsAny(() => db.CreateView("myview").Execute()).ParamName); - Assert.Equal("Definer", Assert.ThrowsAny(() => db.CreateView("myview").DefinedAs(table.Select()).Definer(null).Execute()).ParamName); - } - - [Fact] - public void CreateViewReplace() - { - CreateBasicViewFromTable(); - Schema db = GetSession().Schema; - Table table = db.GetTable(tableName); - db.CreateView("myview", true) - .DefinedAs(table.Select("id")) - .Execute(); - - var result = GetNodeSession().SQL("DESC myview").Execute().FetchAll(); - Assert.Equal(1, result.Count); - Assert.Equal("id", result[0]["field"]); - } - - [Fact] - public void CreateTempTableView() - { - CreateTableData(); - Schema db = GetSession().Schema; - Table table = db.GetTable(tableName); - db.CreateView("myview") - .DefinedAs(table.Select()) - .Algorithm(DataAccess.ViewAlgorithmEnum.TempTable) - .Columns("id1", "name1", "age1") - .Execute(); - - Table view = db.GetTable("myview"); - Assert.True(view.IsView); - Assert.Equal(allRows.Length, view.Count()); - } - - #endregion - - #region Alter View - - [Fact] - public void AlterSimpleViewFromTable() - { - CreateViewFromTable(); - var table = GetSession().Schema.GetTable(tableName); - - GetSession().Schema.AlterView("myview") - .DefinedAs(table.Select("id", "age")) - .Columns("id2", "age2") - .Execute(); - var view = GetSession().Schema.GetTable("myview"); - Assert.True(view.IsView); - Assert.Equal(allRows.Length, view.Count()); - var sql = GetNodeSession().SQL("SHOW CREATE VIEW myview").Execute(); - var result = sql.FetchAll(); - string desc = result[0][1].ToString(); - Assert.Equal($"CREATE ALGORITHM=MERGE DEFINER=`{GetSession().Settings.UserID}`@`localhost` SQL SECURITY DEFINER VIEW `myview` AS select `{tableName}`.`id` AS `id2`,`{tableName}`.`age` AS `age2` from `{tableName}`", - desc); - } - - [Fact] - public void AlterViewFromTable() - { - CreateViewFromTable(); - var table = GetSession().Schema.GetTable(tableName); - - GetSession().Schema.AlterView("myview") - .DefinedAs(table.Select("id", "age")) - .Algorithm(DataAccess.ViewAlgorithmEnum.Undefined) - .Columns("id2", "age2") - .Definer($"{GetSession().Settings.UserID}@localhost") - .Security(DataAccess.ViewSqlSecurityEnum.Invoker) - .WithCheckOption(DataAccess.ViewCheckOptionEnum.Cascaded) - .Execute(); - var view = GetSession().Schema.GetTable("myview"); - Assert.True(view.IsView); - Assert.Equal(allRows.Length, view.Count()); - var sql = GetNodeSession().SQL("SHOW CREATE VIEW myview").Execute(); - var result = sql.FetchAll(); - string desc = result[0][1].ToString(); - Assert.Equal($"CREATE ALGORITHM=MERGE DEFINER=`{GetSession().Settings.UserID}`@`localhost` SQL SECURITY INVOKER VIEW `myview` AS select `{tableName}`.`id` AS `id2`,`{tableName}`.`age` AS `age2` from `{tableName}` WITH CASCADED CHECK OPTION", - desc); - } - - #endregion - - #region Drop View - - [Fact] - public void DropTableView() - { - CreateBasicViewFromTable(); - Assert.True(GetSession().Schema.GetTable("myview").ExistsInDatabase()); - GetSession().Schema.DropView("myview").Execute(); - Assert.False(GetSession().Schema.GetTable("myview").ExistsInDatabase()); - } - - [Fact] - public void DropViewIfExists() - { - Assert.False(GetSession().Schema.GetTable("viewNotExists").ExistsInDatabase()); - Assert.ThrowsAny(() => GetSession().Schema.DropView("viewNotExists").Execute()); - GetSession().Schema.DropView("viewNotExists").IfExists().Execute(); - } - - #endregion - } -} diff --git a/Tests/MySqlX.Data.Tests/ExprParserTests.cs b/Tests/MySqlX.Data.Tests/ExprParserTests.cs deleted file mode 100644 index ec29068d7..000000000 --- a/Tests/MySqlX.Data.Tests/ExprParserTests.cs +++ /dev/null @@ -1,552 +0,0 @@ -// Copyright © 2015, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.Protocol.X; -using Mysqlx.Crud; -using Mysqlx.Datatypes; -using Mysqlx.Expr; -using System; -using System.Collections.Generic; -using System.Linq; -using Xunit; -using Xunit.Abstractions; - -namespace MySqlX.Data.Tests -{ - public class ExprParserTests - { - private readonly ITestOutputHelper _testOutput; - - public ExprParserTests(ITestOutputHelper testOutput) - { - _testOutput = testOutput; - } - - /// - /// Check that a string doesn't parse. - /// - /// - private void CheckBadParse(string s) - { - //_testOutput.WriteLine(s); - Assert.Throws(() => { Expr e = new ExprParser(s).Parse(); }); - } - - [Fact] - public void TestUnparseables() - { - CheckBadParse("1ee1"); - CheckBadParse("1 + "); - CheckBadParse("x 1,2,3)"); - CheckBadParse("x(1,2,3"); - CheckBadParse("x(1 2,3)"); - CheckBadParse("x(1,, 2,3)"); - CheckBadParse("x not y"); - CheckBadParse("x like"); - CheckBadParse("like"); - CheckBadParse("like x"); - CheckBadParse("x + interval 1 MACROsecond"); - CheckBadParse("x + interval 1 + 1"); - CheckBadParse("x * interval 1 hour"); - CheckBadParse("1.1.1"); - CheckBadParse("a$**"); - CheckBadParse("a.b.c.d > 1"); - CheckBadParse("a$[1.1]"); - CheckBadParse("a$[-1]"); - CheckBadParse("a$1"); - CheckBadParse("a$.1"); - CheckBadParse("a$a"); - CheckBadParse("a$.+"); - CheckBadParse("a$(x)"); - CheckBadParse("\"xyz"); - CheckBadParse("x between 1"); - CheckBadParse("x.1 > 1"); - CheckBadParse("x$ > 1"); - CheckBadParse(":>1"); - CheckBadParse(":1.1"); - CheckBadParse("cast(x as varchar)"); - CheckBadParse("not"); - CheckBadParse("$.a[-1]"); - // TODO: test bad JSON identifiers (quoting?) - } - - /** - * Check that a string parses and is reconstituted as a string that we expect. Futher we parse the canonical version to make sure it doesn't change. - */ - private void CheckParseRoundTrip(string input, string expected) - { - if (expected == null) - { - expected = input; - } - Expr expr = new ExprParser(input).Parse(); - string canonicalized = ExprUnparser.ExprToString(expr); - Assert.Equal(expected, canonicalized); - - // System.err.println("Canonicalized: " + canonicalized); - Expr expr2 = new ExprParser(canonicalized).Parse(); - string recanonicalized = ExprUnparser.ExprToString(expr2); - Assert.Equal(expected, recanonicalized); - } - - /** - * Test that expressions parsed and serialize back to the expected form. - */ - [Fact] - public void TestRoundTrips() - { - //CheckParseRoundTrip("_id == 20", "($.pages > 20)"); - CheckParseRoundTrip("$.pages > 20", "($.pages > 20)"); - CheckParseRoundTrip("now () - interval '10:20' hour_MiNuTe", "date_sub(now(), \"10:20\", \"HOUR_MINUTE\")"); - CheckParseRoundTrip("now () - interval 1 hour - interval 2 minute - interval 3 second", - "date_sub(date_sub(date_sub(now(), 1, \"HOUR\"), 2, \"MINUTE\"), 3, \"SECOND\")"); - // this needs parens around 1+1 in interval expression - CheckParseRoundTrip("a + interval 1 hour + 1 + interval (1 + 1) second", "(date_add(a, 1, \"HOUR\") + date_add(1, (1 + 1), \"SECOND\"))"); - CheckParseRoundTrip("a + interval 1 hour + 1 + interval 1 * 1 second", "(date_add(a, 1, \"HOUR\") + date_add(1, (1 * 1), \"SECOND\"))"); - CheckParseRoundTrip("now () - interval -2 day", "date_sub(now(), -2, \"DAY\")"); // interval exprs compile to date_add/date_sub calls - CheckParseRoundTrip("1", "1"); - CheckParseRoundTrip("1^0", "(1 ^ 0)"); - CheckParseRoundTrip("1e1", "10"); - CheckParseRoundTrip("-1e1", "-10"); - CheckParseRoundTrip("!0", "!0"); - CheckParseRoundTrip("1e4", "10000"); - CheckParseRoundTrip("12e-4", "0.0012"); - CheckParseRoundTrip("a + 314.1592e-2", "(a + 3.141592)"); - CheckParseRoundTrip("a + 0.0271e+2", "(a + 2.71)"); - CheckParseRoundTrip("a + 0.0271e2", "(a + 2.71)"); - CheckParseRoundTrip("10+1", "(10 + 1)"); - CheckParseRoundTrip("(abC == 1)", "(abC == 1)"); - CheckParseRoundTrip("(abC = 1)", "(abC == 1)"); - CheckParseRoundTrip("(Func(abc)==1)", "(Func(abc) == 1)"); - CheckParseRoundTrip("(abc == \"jess\")", "(abc == \"jess\")"); - CheckParseRoundTrip("(abc == \"with \\\"\")", "(abc == \"with \"\"\")"); // we escape with two internal quotes - CheckParseRoundTrip("(abc != .10)", "(abc != 0.1)"); - CheckParseRoundTrip("(abc != \"xyz\")", "(abc != \"xyz\")"); - CheckParseRoundTrip("a + b * c + d", "((a + (b * c)) + d)"); // shows precedence and associativity - CheckParseRoundTrip("a * b + c * d", "((a * b) + (c * d))"); - CheckParseRoundTrip("(a + b) * c + d", "(((a + b) * c) + d)"); - CheckParseRoundTrip("(field not in ('a',func('b', 2.0),'c'))", "field not in(\"a\", func(\"b\", 2), \"c\")"); - CheckParseRoundTrip("jess.age beTwEEn 30 and death", "(jess.age between 30 AND death)"); - CheckParseRoundTrip("jess.age not BeTweeN 30 and death", "(jess.age not between 30 AND death)"); - CheckParseRoundTrip("a + b * c + d", "((a + (b * c)) + d)"); - CheckParseRoundTrip("x > 10 and Y >= -20", "((x > 10) && (Y >= -20))"); - CheckParseRoundTrip("a is true and b is null and C + 1 > 40 and (thetime == now() or hungry())", - "((((a is TRUE) && (b is NULL)) && ((C + 1) > 40)) && ((thetime == now()) || hungry()))"); - CheckParseRoundTrip("a + b + -c > 2", "(((a + b) + -c) > 2)"); - CheckParseRoundTrip("now () + b + c > 2", "(((now() + b) + c) > 2)"); - CheckParseRoundTrip("now () + $.b + c > 2", "(((now() + $.b) + c) > 2)"); - CheckParseRoundTrip("now () - interval +2 day > some_other_time() or something_else IS NOT NULL", - "((date_sub(now(), 2, \"DAY\") > some_other_time()) || is_not(something_else, NULL))"); - CheckParseRoundTrip("\"two quotes to one\"\"\"", null); - CheckParseRoundTrip("'two quotes to one'''", "\"two quotes to one'\""); - CheckParseRoundTrip("'different quote \"'", "\"different quote \"\"\""); - CheckParseRoundTrip("\"different quote '\"", "\"different quote '\""); - CheckParseRoundTrip("`ident`", "ident"); // doesn't need quoting - CheckParseRoundTrip("`ident```", "`ident```"); - CheckParseRoundTrip("`ident\"'`", "`ident\"'`"); - CheckParseRoundTrip(":0 > x and func(:3, :2, :1)", "((:0 > x) && func(:1, :2, :3))"); // serialized in order of position (needs mapped externally) - CheckParseRoundTrip("a > now() + interval (2 + x) MiNuTe", "(a > date_add(now(), (2 + x), \"MINUTE\"))"); - CheckParseRoundTrip("a between 1 and 2", "(a between 1 AND 2)"); - CheckParseRoundTrip("a not between 1 and 2", "(a not between 1 AND 2)"); - CheckParseRoundTrip("a in (1,2,a.b(3),4,5,x)", "a in(1, 2, a.b(3), 4, 5, x)"); - CheckParseRoundTrip("a not in (1,2,3,4,5,$.x)", "a not in(1, 2, 3, 4, 5, $.x)"); - CheckParseRoundTrip("a like b escape c", "a like b ESCAPE c"); - CheckParseRoundTrip("a not like b escape c", "a not like b ESCAPE c"); - CheckParseRoundTrip("(1 + 3) in (3, 4, 5)", "(1 + 3) in(3, 4, 5)"); - CheckParseRoundTrip("`a crazy \"function\"``'name'`(1 + 3) in (3, 4, 5)", "`a crazy \"function\"``'name'`((1 + 3)) in(3, 4, 5)"); - CheckParseRoundTrip("a$.b", "a$.b"); - CheckParseRoundTrip("a$.\"bcd\"", "a$.bcd"); - CheckParseRoundTrip("a$.*", "a$.*"); - CheckParseRoundTrip("a$[0].*", "a$[0].*"); - CheckParseRoundTrip("a$[*].*", "a$[*].*"); - CheckParseRoundTrip("a$**[0].*", "a$**[0].*"); - CheckParseRoundTrip("$._id", "$._id"); - CheckParseRoundTrip("$._id == :0", "($._id == :0)"); - CheckParseRoundTrip("'Monty!' REGEXP '.*'", "(\"Monty!\" regexp \".*\")"); - CheckParseRoundTrip("a regexp b regexp c", "((a regexp b) regexp c)"); - CheckParseRoundTrip("a + b + c", "((a + b) + c)"); - CheckParseRoundTrip("a + cast(b as json)", "(a + cast(b AS JSON))"); - CheckParseRoundTrip("a + cast(b as decimal)", "(a + cast(b AS DECIMAL))"); - CheckParseRoundTrip("a + cast(b as decimal(2))", "(a + cast(b AS DECIMAL(2)))"); - CheckParseRoundTrip("a + cast(b as decimal(1, 2))", "(a + cast(b AS DECIMAL(1,2)))"); - CheckParseRoundTrip("a + cast(b as binary)", "(a + cast(b AS BINARY))"); - CheckParseRoundTrip("a + cast(b as DaTe)", "(a + cast(b AS DATE))"); - CheckParseRoundTrip("a + cast(b as char)", "(a + cast(b AS CHAR))"); - CheckParseRoundTrip("a + cast(b as DaTeTiMe)", "(a + cast(b AS DATETIME))"); - CheckParseRoundTrip("a + cast(b as time)", "(a + cast(b AS TIME))"); - CheckParseRoundTrip("a + cast(b as binary(3))", "(a + cast(b AS BINARY(3)))"); - CheckParseRoundTrip("a + cast(b as unsigned)", "(a + cast(b AS UNSIGNED))"); - CheckParseRoundTrip("a + cast(b as unsigned integer)", "(a + cast(b AS UNSIGNED))"); - CheckParseRoundTrip("a is true or a is false", "((a is TRUE) || (a is FALSE))"); - // TODO: this isn't serialized correctly by the unparser - //checkParseRoundTrip("a$.b[0][0].c**.d.\"a weird\\\"key name\"", ""); - CheckParseRoundTrip("*", "*"); - CheckParseRoundTrip("count(*) + 1", "(count(*) + 1)"); - } - - /** - * Explicit test inspecting the expression tree. - */ - [Fact] - public void TestExprTree() - { - Expr expr = new ExprParser("a like 'xyz' and $.count > 10 + 1").Parse(); - Assert.Equal(Expr.Types.Type.Operator, expr.Type); - Assert.Equal("&&", expr.Operator.Name); - Assert.Equal(2, expr.Operator.Param.Count); - - // check left side of AND: (a like 'xyz') - Expr andLeft = expr.Operator.Param[0]; - Assert.Equal(Expr.Types.Type.Operator, andLeft.Type); - Assert.Equal("like", andLeft.Operator.Name); - Assert.Equal(2, andLeft.Operator.Param.Count); - Expr identA = andLeft.Operator.Param[0]; - Assert.Equal(Expr.Types.Type.Ident, identA.Type); - Assert.Equal("a", identA.Identifier.Name); - Expr literalXyz = andLeft.Operator.Param[1]; - Assert.Equal(Expr.Types.Type.Literal, literalXyz.Type); - Scalar scalarXyz = literalXyz.Literal; - Assert.Equal(Scalar.Types.Type.VString, scalarXyz.Type); - Assert.Equal("xyz", scalarXyz.VString.Value.ToStringUtf8()); - - // check right side of AND: ($.count > 10 + 1) - Expr andRight = expr.Operator.Param[1]; - Assert.Equal(Expr.Types.Type.Operator, andRight.Type); - Assert.Equal(">", andRight.Operator.Name); - Assert.Equal(2, andRight.Operator.Param.Count); - Expr countDocPath = andRight.Operator.Param[0]; - Assert.Equal(Expr.Types.Type.Ident, countDocPath.Type); - ColumnIdentifier countId = countDocPath.Identifier; - Assert.Equal(string.Empty, countId.Name); - Assert.Equal(string.Empty, countId.TableName); - Assert.Equal(string.Empty, countId.SchemaName); - Assert.Equal(1, countId.DocumentPath.Count); - Assert.Equal(DocumentPathItem.Types.Type.Member, countId.DocumentPath[0].Type); - Assert.Equal("count", countId.DocumentPath[0].Value); - Expr addition = andRight.Operator.Param[1]; - Scalar addLeftScalar = addition.Operator.Param[0].Literal; - Scalar addRightScalar = addition.Operator.Param[1].Literal; - Assert.Equal(Expr.Types.Type.Operator, addition.Type); - Assert.Equal("+", addition.Operator.Name); - Assert.Equal(2, addition.Operator.Param.Count); - Assert.Equal(Expr.Types.Type.Literal, addition.Operator.Param[0].Type); - Assert.Equal(Expr.Types.Type.Literal, addition.Operator.Param[1].Type); - Assert.Equal(Scalar.Types.Type.VSint, addLeftScalar.Type); - Assert.Equal(Scalar.Types.Type.VSint, addRightScalar.Type); - Assert.Equal(10, addLeftScalar.VSignedInt); - Assert.Equal(1, addRightScalar.VSignedInt); - } - - [Fact] - public void TestOrderByParserBasic() - { - List orderSpec = new ExprParser("a, b desc").ParseOrderSpec(); - Assert.Equal(2, orderSpec.Count); - Order o1 = orderSpec[0]; - Assert.Equal(Order.Types.Direction.None, o1.Direction); - Assert.Equal("a", ExprUnparser.ExprToString(o1.Expr)); - Order o2 = orderSpec[1]; - Assert.NotEqual(Order.Types.Direction.None, o2.Direction); - Assert.Equal(Order.Types.Direction.Desc, o2.Direction); - Assert.Equal("b", ExprUnparser.ExprToString(o2.Expr)); - } - - [Fact] - public void TestOrderByParserComplexExpressions() - { - List orderSpec = new ExprParser("field not in ('a',func('b', 2.0),'c') desc, 1-a$**[0].*, now () + $.b + c > 2 asc").ParseOrderSpec(); - Assert.Equal(3, orderSpec.Count); - Order o1 = orderSpec[0]; - Assert.NotEqual(Order.Types.Direction.None, o1.Direction); - Assert.Equal(Order.Types.Direction.Desc, o1.Direction); - Assert.Equal("field not in(\"a\", func(\"b\", 2), \"c\")", ExprUnparser.ExprToString(o1.Expr)); - Order o2 = orderSpec[1]; - Assert.Equal(Order.Types.Direction.None, o2.Direction); - Assert.Equal("(1 - a$**[0].*)", ExprUnparser.ExprToString(o2.Expr)); - Order o3 = orderSpec[2]; - Assert.NotEqual(Order.Types.Direction.None, o3.Direction); - Assert.Equal(Order.Types.Direction.Asc, o3.Direction); - Assert.Equal("(((now() + $.b) + c) > 2)", ExprUnparser.ExprToString(o3.Expr)); - } - - [Fact] - public void TestNamedPlaceholders() - { - ExprParser parser = new ExprParser("a = :a and b = :b and (c = 'x' or d = :b)"); - Assert.Equal("IDENT(a)", parser.tokens[0].ToString()); - Assert.Equal("EQ", parser.tokens[1].ToString()); - Expr e = parser.Parse(); - Assert.Equal(0, parser.placeholderNameToPosition["a"]); - Assert.Equal(1, parser.placeholderNameToPosition["b"]); - Assert.Equal(2, parser.positionalPlaceholderCount); - - Expr aEqualsPlaceholder = e.Operator.Param[0].Operator.Param[0].Operator.Param[1]; - Assert.Equal(Expr.Types.Type.Placeholder, aEqualsPlaceholder.Type); - Assert.Equal((uint)0, aEqualsPlaceholder.Position); - Expr bEqualsPlaceholder = e.Operator.Param[0].Operator.Param[1].Operator.Param[1]; - Assert.Equal(Expr.Types.Type.Placeholder, bEqualsPlaceholder.Type); - Assert.Equal((uint)1, bEqualsPlaceholder.Position); - Expr dEqualsPlaceholder = e.Operator.Param[1].Operator.Param[1].Operator.Param[1]; - Assert.Equal(Expr.Types.Type.Placeholder, dEqualsPlaceholder.Type); - Assert.Equal((uint)1, dEqualsPlaceholder.Position); - } - - [Fact] - public void TestNumberedPlaceholders() - { - ExprParser parser = new ExprParser("a == :1 and b == :3 and (c == :2 or d == :2)"); - Expr e = parser.Parse(); - Assert.Equal(0, parser.placeholderNameToPosition["1"]); - Assert.Equal(1, parser.placeholderNameToPosition["3"]); - Assert.Equal(2, parser.placeholderNameToPosition["2"]); - Assert.Equal(3, parser.positionalPlaceholderCount); - - Expr aEqualsPlaceholder = e.Operator.Param[0].Operator.Param[0].Operator.Param[1]; - Assert.Equal(Expr.Types.Type.Placeholder, aEqualsPlaceholder.Type); - Assert.Equal((uint)0, aEqualsPlaceholder.Position); - Expr bEqualsPlaceholder = e.Operator.Param[0].Operator.Param[1].Operator.Param[1]; - Assert.Equal(Expr.Types.Type.Placeholder, bEqualsPlaceholder.Type); - Assert.Equal((uint)1, bEqualsPlaceholder.Position); - Expr cEqualsPlaceholder = e.Operator.Param[1].Operator.Param[0].Operator.Param[1]; - Assert.Equal(Expr.Types.Type.Placeholder, cEqualsPlaceholder.Type); - Assert.Equal((uint)2, cEqualsPlaceholder.Position); - Expr dEqualsPlaceholder = e.Operator.Param[1].Operator.Param[1].Operator.Param[1]; - Assert.Equal(Expr.Types.Type.Placeholder, dEqualsPlaceholder.Type); - Assert.Equal((uint)2, dEqualsPlaceholder.Position); - } - - [Fact] - public void TestUnnumberedPlaceholders() - { - ExprParser parser = new ExprParser("a = ? and b = ? and (c = 'x' or d = ?)"); - Expr e = parser.Parse(); - Assert.Equal(0, parser.placeholderNameToPosition["0"]); - Assert.Equal(1, parser.placeholderNameToPosition["1"]); - Assert.Equal(2, parser.placeholderNameToPosition["2"]); - Assert.Equal(3, parser.positionalPlaceholderCount); - - Expr aEqualsPlaceholder = e.Operator.Param[0].Operator.Param[0].Operator.Param[1]; - Assert.Equal(Expr.Types.Type.Placeholder, aEqualsPlaceholder.Type); - Assert.Equal((uint)0, aEqualsPlaceholder.Position); - Expr bEqualsPlaceholder = e.Operator.Param[0].Operator.Param[1].Operator.Param[1]; - Assert.Equal(Expr.Types.Type.Placeholder, bEqualsPlaceholder.Type); - Assert.Equal((uint)1, bEqualsPlaceholder.Position); - Expr dEqualsPlaceholder = e.Operator.Param[1].Operator.Param[1].Operator.Param[1]; - Assert.Equal(Expr.Types.Type.Placeholder, dEqualsPlaceholder.Type); - Assert.Equal((uint)2, dEqualsPlaceholder.Position); - } - - [Fact] - public void TestJsonLiteral() - { - Expr e = new ExprParser("{'a':1, 'b':\"a string\"}").Parse(); - - Assert.Equal("{'a':1, 'b':\"a string\"}", ExprUnparser.ExprToString(e)); - - Assert.Equal(Expr.Types.Type.Object, e.Type); - Mysqlx.Expr.Object o = e.Object; - Assert.Equal(2, o.Fld.Count); - Mysqlx.Expr.Object.Types.ObjectField of; - - of = o.Fld[0]; - Assert.Equal("a", of.Key); - e = of.Value; - Assert.Equal(Expr.Types.Type.Literal, e.Type); - Assert.Equal(1, e.Literal.VSignedInt); - - of = o.Fld[1]; - Assert.Equal("b", of.Key); - e = of.Value; - Assert.Equal(Expr.Types.Type.Literal, e.Type); - Assert.Equal("a string", e.Literal.VString.Value.ToStringUtf8()); - } - - [Fact] - public void TestTrivialDocumentProjection() - { - List proj; - - proj = new ExprParser("$.a as a").ParseDocumentProjection(); - Assert.Equal(1, proj.Count); - Assert.NotEqual(string.Empty, proj[0].Alias); - Assert.Equal("a", proj[0].Alias); - - proj = new ExprParser("$.a as a, $.b as b, $.c as c").ParseDocumentProjection(); - } - - [Fact] - public void TestExprAsPathDocumentProjection() - { - List projList = new ExprParser("$.a as b, (1 + 1) * 100 as x, 2 as j42").ParseDocumentProjection(); - - Assert.Equal(3, projList.Count); - - // check $.a as b - Projection proj = projList[0]; - IList paths = proj.Source.Identifier.DocumentPath; - Assert.Equal(1, paths.Count); - Assert.Equal(DocumentPathItem.Types.Type.Member, paths[0].Type); - Assert.Equal("a", paths[0].Value); - - Assert.Equal("b", proj.Alias); - - // check (1 + 1) * 100 as x - proj = projList[1]; - Assert.Equal("((1 + 1) * 100)", ExprUnparser.ExprToString(proj.Source)); - Assert.Equal("x", proj.Alias); - - // check 2 as j42 - proj = projList[2]; - Assert.Equal("2", ExprUnparser.ExprToString(proj.Source)); - Assert.Equal("j42", proj.Alias); - } - - [Fact] - public void TestJsonConstructorAsDocumentProjection() - { - // same as we use in find().field("{...}") - string projString = "{'a':'value for a', 'b':1+1, 'c'::bindvar, 'd':$.member[22], 'e':{'nested':'doc'}}"; - Projection proj = new Projection(); - proj.Source = new ExprParser(projString, false).Parse(); - Assert.Equal(Expr.Types.Type.Object, proj.Source.Type); - - IEnumerator fields = proj.Source.Object.Fld.GetEnumerator(); - string[][] array = new string[][] { - new string[] {"a", "\"value for a\""}, - new string[] {"b", "(1 + 1)"}, - new string[] {"c", ":0"}, - new string[] {"d", "$.member[22]"}, - new string[] {"e", "{'nested':\"doc\"}"}}; - array.ToList().ForEach(pair => - { - fields.MoveNext(); - Mysqlx.Expr.Object.Types.ObjectField f = fields.Current; - Assert.Equal(pair[0], f.Key); - Assert.Equal(pair[1], ExprUnparser.ExprToString(f.Value)); - }); - Assert.False(fields.MoveNext()); - } - - [Fact] - public void TestJsonExprsInDocumentProjection() - { - // this is not a single doc as the project but multiple docs as embedded fields - string projString = "{'a':1} as a, {'b':2} as b"; - List projList = new ExprParser(projString).ParseDocumentProjection(); - Assert.Equal(2, projList.Count); - // TODO: verification of remaining elements - } - - [Fact] - public void TestTableInsertProjection() - { - Column col = new ExprParser("a").ParseTableInsertField(); - Assert.Equal("a", col.Name); - - col = new ExprParser("`double weird `` string`").ParseTableInsertField(); - Assert.Equal("double weird ` string", col.Name); - } - - [Fact] - public void TestTableUpdateField() - { - ColumnIdentifier col; - col = new ExprParser("a").ParseTableUpdateField(); - Assert.Equal("a", col.Name); - - col = new ExprParser("b.c").ParseTableUpdateField(); - Assert.Equal("b", col.TableName); - Assert.Equal("c", col.Name); - - col = new ExprParser("d.e$.the_path[2]").ParseTableUpdateField(); - Assert.Equal("d", col.TableName); - Assert.Equal("e", col.Name); - Assert.Equal(2, col.DocumentPath.Count); - Assert.Equal("the_path", col.DocumentPath[0].Value); - Assert.Equal((uint)2, col.DocumentPath[1].Index); - - col = new ExprParser("`zzz\\``").ParseTableUpdateField(); - Assert.Equal("zzz`", col.Name); - } - - [Fact] - public void TestTrivialTableSelectProjection() - { - List proj = new ExprParser("a, b as c").ParseTableSelectProjection(); - Assert.Equal(2, proj.Count); - Assert.Equal("a", ExprUnparser.ExprToString(proj[0].Source)); - Assert.Equal(string.Empty, proj[0].Alias); - Assert.Equal("b", ExprUnparser.ExprToString(proj[1].Source)); - Assert.NotEqual(string.Empty, proj[1].Alias); - Assert.Equal("c", proj[1].Alias); - } - - [Fact] - public void TestStarTableSelectProjection() - { - List proj = new ExprParser("*, b as c").ParseTableSelectProjection(); - Assert.Equal(2, proj.Count); - Assert.Equal("*", ExprUnparser.ExprToString(proj[0].Source)); - Assert.Equal(string.Empty, proj[0].Alias); - Assert.Equal("b", ExprUnparser.ExprToString(proj[1].Source)); - Assert.NotEqual(string.Empty, proj[1].Alias); - Assert.Equal("c", proj[1].Alias); - } - - [Fact] - public void TestComplexTableSelectProjection() - { - string projectionString = "(1 + 1) * 100 as `one-o-two`, 'a is \\'a\\'' as `what is 'a'`"; - List proj = new ExprParser(projectionString).ParseTableSelectProjection(); - Assert.Equal(2, proj.Count); - - Assert.Equal("((1 + 1) * 100)", ExprUnparser.ExprToString(proj[0].Source)); - Assert.Equal("one-o-two", proj[0].Alias); - - Assert.Equal("a is 'a'", proj[1].Source.Literal.VString.Value.ToStringUtf8()); - Assert.Equal("what is 'a'", proj[1].Alias); - } - - [Fact] - public void TestRandom() - { - // tests generated by the random expression generator - CheckParseRoundTrip("x - INTERVAL { } DAY_HOUR * { } + { }", "((date_sub(x, {}, \"DAY_HOUR\") * {}) + {})"); - CheckParseRoundTrip("NULL - INTERVAL $ ** [ 89 ] << { '' : { } - $ . V << { '' : { } + { } REGEXP ? << { } - { } < { } | { } << { '' : : 8 + : 26 ^ { } } + { } >> { } } || { } } & { } SECOND", "date_sub(NULL, (($**[89] << {'':((({} - $.V) << {'':(({} + {}) regexp ((:0 << ({} - {})) < ({} | (({} << ({'':((:1 + :2) ^ {})} + {})) >> {}))))}) || {})}) & {}), \"SECOND\")"); - // TODO: check the validity of this: - // checkParseRoundTrip("_XJl . F ( `ho` @ [*] [*] - ~ ! { '' : { } LIKE { } && : rkc & 1 & y @ ** . d [*] [*] || { } ^ { } REGEXP { } } || { } - { } ^ { } < { } IN ( ) >= { } IN ( ) )", ""); - } - - [Fact] - public void UnqualifiedDocPaths() - { - Expr expr = new ExprParser("1 + b[0]", false).Parse(); - Assert.Equal("(1 + $.b[0])", ExprUnparser.ExprToString(expr)); - expr = new ExprParser("a.*", false).Parse(); - Assert.Equal("$.a.*", ExprUnparser.ExprToString(expr)); - expr = new ExprParser("bL . vT .*", false).Parse(); - Assert.Equal("$.bL.vT.*", ExprUnparser.ExprToString(expr)); - expr = new ExprParser("dd ** .X", false).Parse(); - Assert.Equal("$.dd**.X", ExprUnparser.ExprToString(expr)); - } - } -} diff --git a/Tests/MySqlX.Data.Tests/JsonDocTests.cs b/Tests/MySqlX.Data.Tests/JsonDocTests.cs deleted file mode 100644 index 1b423b1a4..000000000 --- a/Tests/MySqlX.Data.Tests/JsonDocTests.cs +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright © 2015, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.XDevAPI; -using System; -using Xunit; - -namespace MySqlX.Data.Tests -{ - public class DbDocTests - { - [Fact] - public void SimpleConverstionToJson() - { - DbDoc d = new DbDoc(); - d.SetValue("_id", 1); - d.SetValue("pages", 20); - string s = d.ToString(); - Assert.Equal(@"{ - ""_id"": 1, - ""pages"": 20 -}".Replace("\r\n", Environment.NewLine), d.ToString()); - } - - [Fact] - public void SimpleParse() - { - DbDoc d = new DbDoc(@"{ ""id"": 1, ""pages"": 20}"); - DbDoc d2 = new DbDoc(); - d2.SetValue("id", 1); - d2.SetValue("pages", 20); - Assert.True(d.Equals(d2)); - } - - [Fact] - public void NestedParse() - { - DbDoc d = new DbDoc(@"{ ""id"": 1, ""pages"": 20, - ""person"": { ""name"": ""Fred"", ""age"": 45 } - }"); - DbDoc d2 = new DbDoc(); - d2.SetValue("id", 1); - d2.SetValue("pages", 20); - d2.SetValue("person", new { name = "Fred", age = 45 }); - Assert.True(d.Equals(d2)); - } - - [Fact] - public void ParseWithArray() - { - string json = @"{ - ""id"": 1, - ""pages"": 20, - ""books"": [ - { - ""_id"": 1, - ""title"": ""Book 1"" - }, - { - ""_id"": 2, - ""title"": ""Book 2"" - } - ] -}"; - - string[] lines = json.Split(new string[] { "\r\n", "\r" }, StringSplitOptions.RemoveEmptyEntries); - for (int i = 0; i < lines.Length; i++) - lines[i] = lines[i].Trim(); - - string noFormat = string.Join(" ", lines); - - DbDoc d = new DbDoc(json); - - var docs = new[] - { - new { _id = 1, title = "Book 1" }, - new { _id = 2, title = "Book 2" }, - }; - DbDoc d2 = new DbDoc(); - d2.SetValue("id", 1); - d2.SetValue("pages", 20); - d2.SetValue("books", docs); - Assert.True(d.Equals(d2)); - Assert.Equal(json.Replace("\r\n", Environment.NewLine), d2.ToString()); - } - - [Fact] - public void ParseLongValues() - { - DbDoc d = new DbDoc(@"{ ""id"": 1, ""pages"": " + ((long)int.MaxValue + 1) + "}"); - DbDoc d2 = new DbDoc(); - d2.SetValue("id", 1); - d2.SetValue("pages", (long)int.MaxValue + 1); - Assert.True(d.Equals(d2)); - } - - [Fact] - public void ParseFloatValues() - { - DbDoc d = new DbDoc(@"{ ""id"": 1, ""pi"": 3.14159 }"); - DbDoc d2 = new DbDoc(); - d2.SetValue("id", 1); - d2.SetValue("pi", 3.14159); - Assert.True(d.Equals(d2)); - } - } -} diff --git a/Tests/MySqlX.Data.Tests/MySqlX.Data.Tests.csproj b/Tests/MySqlX.Data.Tests/MySqlX.Data.Tests.csproj deleted file mode 100644 index a62fd7fbd..000000000 --- a/Tests/MySqlX.Data.Tests/MySqlX.Data.Tests.csproj +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - 9.0.30729 - 2.0 - 4.0 - v4.0 - 40 - NET_40_OR_GREATER - - - - - 9.0.30729 - 2.0 - 4.5 - v4.5.1 - 45 - NET_40_OR_GREATER;NET_45_OR_GREATER; - - - - - Debug - AnyCPU - {CAA32940-8FAD-4B2C-B0DE-937592F2B7D4} - Library - Properties - MySqlX.Data.Tests - MySqlX.Data.Tests - 512 - - - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - Properties\VersionInfo.cs - - - - - - - - - - - - - - - - - True - True - Resources.resx - - - - - - - - - - - - - - - - - - - - - - - - - - Always - - - client.pfx - PreserveNewest - - - - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - - - - - - - - - {e9df5ed1-4cbd-4226-b931-9a51610ac14d} - MySql.Data - - - - - \ No newline at end of file diff --git a/Tests/MySqlX.Data.Tests/MySqlX.Data.Tests.xproj b/Tests/MySqlX.Data.Tests/MySqlX.Data.Tests.xproj deleted file mode 100644 index 2a7c0f74c..000000000 --- a/Tests/MySqlX.Data.Tests/MySqlX.Data.Tests.xproj +++ /dev/null @@ -1,22 +0,0 @@ - - - - 14.0.25420 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 863b140b-0956-4871-b9f5-aa2681af59da - MySqlX.Data.Tests - .\obj - .\bin\ - v4.6.1 - - - 2.0 - - - - - - \ No newline at end of file diff --git a/Tests/MySqlX.Data.Tests/Properties/AssemblyInfo.cs b/Tests/MySqlX.Data.Tests/Properties/AssemblyInfo.cs deleted file mode 100644 index 398bf03f4..000000000 --- a/Tests/MySqlX.Data.Tests/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; -using Xunit; - -// 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. -[assembly: AssemblyTitle("MySqlX.Data.Tests")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("MySQL Connector/NET")] -[assembly: AssemblyCopyright("Copyright © 2016")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] -#if !NETCORE10 -[assembly: AssemblyDelaySign(true)] -[assembly: AssemblyKeyFileAttribute(@"..\..\ConnectorNetPublicKey.snk")] -#endif -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("2f36ea96-5616-4b9e-9e53-eb380b8c4292")] -[assembly: CollectionBehavior(DisableTestParallelization = true)] - diff --git a/Tests/MySqlX.Data.Tests/Properties/CreateUsers.sql b/Tests/MySqlX.Data.Tests/Properties/CreateUsers.sql deleted file mode 100644 index 45fcf9be0..000000000 --- a/Tests/MySqlX.Data.Tests/Properties/CreateUsers.sql +++ /dev/null @@ -1,9 +0,0 @@ -DROP USER IF EXISTS 'test'@'localhost'; -DROP USER IF EXISTS 'testNoPass'@'localhost'; -CREATE USER 'test'@'localhost' identified by 'test'; -GRANT ALL PRIVILEGES ON *.* TO 'test'@'localhost'; -CREATE USER 'testNoPass'@'localhost'; -FLUSH PRIVILEGES; - - - diff --git a/Tests/MySqlX.Data.Tests/RelationalTests/ColumnMetadataTests.cs b/Tests/MySqlX.Data.Tests/RelationalTests/ColumnMetadataTests.cs deleted file mode 100644 index 206e39d1e..000000000 --- a/Tests/MySqlX.Data.Tests/RelationalTests/ColumnMetadataTests.cs +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySql.Data.MySqlClient.X.XDevAPI.Common; -using MySqlX.XDevAPI.Relational; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Xunit; - -namespace MySqlX.Data.Tests.RelationalTests -{ - public class ColumnMetadataTests : BaseTest - { - [Fact] - public void ColumnMetadata() - { - ExecuteSQL("CREATE TABLE test(b VARCHAR(255) COLLATE latin1_swedish_ci, c VARCHAR(20) CHARSET greek)"); - ExecuteSQL("INSERT INTO test VALUES('Bob', 'Δ')"); - - RowResult r = GetSession().GetSchema(schemaName).GetTable("test").Select("1 + 1 as a", "b", "c").Execute(); - var rows = r.FetchAll(); - Assert.Equal(3, r.Columns.Count); - //Assert.Null(r.Columns[0].DatabaseName); - Assert.Null(r.Columns[0].SchemaName); - Assert.Null(r.Columns[0].TableName); - Assert.Null(r.Columns[0].TableLabel); - Assert.Null(r.Columns[0].ColumnName); - Assert.Equal("a", r.Columns[0].ColumnLabel); - Assert.Equal(ColumnType.Tinyint, r.Columns[0].Type); - Assert.Equal(3u, r.Columns[0].Length); - Assert.Equal(0u, r.Columns[0].FractionalDigits); - Assert.Equal(true, r.Columns[0].IsNumberSigned); - Assert.Null(r.Columns[0].CharacterSetName); - Assert.Null(r.Columns[0].CollationName); - Assert.Equal(false, r.Columns[0].IsPadded); - - Assert.Equal(schemaName, r.Columns[1].SchemaName); - Assert.Equal("test", r.Columns[1].TableName); - Assert.Equal("test", r.Columns[1].TableLabel); - Assert.Equal("b", r.Columns[1].ColumnName); - Assert.Equal("b", r.Columns[1].ColumnLabel); - Assert.Equal(ColumnType.String, r.Columns[1].Type); - Assert.Equal(255u, r.Columns[1].Length); - Assert.Equal(0u, r.Columns[1].FractionalDigits); - Assert.Equal(false, r.Columns[1].IsNumberSigned); - Assert.Equal("latin1", r.Columns[1].CharacterSetName); - Assert.Equal("latin1_swedish_ci", r.Columns[1].CollationName); - Assert.Equal(false, r.Columns[1].IsPadded); - - Assert.Equal(schemaName, r.Columns[2].SchemaName); - Assert.Equal("test", r.Columns[2].TableName); - Assert.Equal("test", r.Columns[2].TableLabel); - Assert.Equal("c", r.Columns[2].ColumnName); - Assert.Equal("c", r.Columns[2].ColumnLabel); - Assert.Equal(ColumnType.String, r.Columns[2].Type); - Assert.Equal(20u, r.Columns[2].Length); - Assert.Equal(0u, r.Columns[2].FractionalDigits); - Assert.Equal(false, r.Columns[2].IsNumberSigned); - Assert.Equal("greek", r.Columns[2].CharacterSetName); - Assert.Equal("greek_general_ci", r.Columns[2].CollationName); - Assert.Equal(false, r.Columns[2].IsPadded); - Assert.Equal("Δ", rows[0][2]); - } - - [Fact] - public void SchemaDefaultCharset() - { - ExecuteSQL("CREATE TABLE test(b VARCHAR(255))"); - ExecuteSQL("INSERT INTO test VALUES('CAR')"); - - var defaultValues = GetNodeSession().SQL("SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME " + - $"FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '{schemaName}'; ").Execute().FetchAll(); - - RowResult r = GetSession().GetSchema(schemaName).GetTable("test").Select("b").Execute(); - var rows = r.FetchAll(); - - Assert.Equal(schemaName, r.Columns[0].SchemaName); - Assert.Equal("test", r.Columns[0].TableName); - Assert.Equal("test", r.Columns[0].TableLabel); - Assert.Equal("b", r.Columns[0].ColumnName); - Assert.Equal("b", r.Columns[0].ColumnLabel); - Assert.Equal(ColumnType.String, r.Columns[0].Type); - Assert.Equal(255u, r.Columns[0].Length); - Assert.Equal(0u, r.Columns[0].FractionalDigits); - Assert.Equal(false, r.Columns[0].IsNumberSigned); - Assert.Equal(defaultValues[0][0], r.Columns[0].CharacterSetName); - Assert.Equal(defaultValues[0][1], r.Columns[0].CollationName); - Assert.Equal(false, r.Columns[0].IsPadded); - Assert.Equal("CAR", rows[0][0]); - } - - [Fact] - public void TableDefaultCharset() - { - ExecuteSQL("CREATE TABLE test(b VARCHAR(255)) CHARSET greek"); - ExecuteSQL("INSERT INTO test VALUES('Δ')"); - - RowResult r = GetSession().GetSchema(schemaName).GetTable("test").Select("b").Execute(); - var rows = r.FetchAll(); - - Assert.Equal(schemaName, r.Columns[0].SchemaName); - Assert.Equal("test", r.Columns[0].TableName); - Assert.Equal("test", r.Columns[0].TableLabel); - Assert.Equal("b", r.Columns[0].ColumnName); - Assert.Equal("b", r.Columns[0].ColumnLabel); - Assert.Equal(ColumnType.String, r.Columns[0].Type); - Assert.Equal(255u, r.Columns[0].Length); - Assert.Equal(0u, r.Columns[0].FractionalDigits); - Assert.Equal(false, r.Columns[0].IsNumberSigned); - Assert.Equal("greek", r.Columns[0].CharacterSetName); - Assert.Equal("greek_general_ci", r.Columns[0].CollationName); - Assert.Equal(false, r.Columns[0].IsPadded); - Assert.Equal("Δ", rows[0][0]); - } - } -} diff --git a/Tests/MySqlX.Data.Tests/RelationalTests/DataTypeTests.cs b/Tests/MySqlX.Data.Tests/RelationalTests/DataTypeTests.cs deleted file mode 100644 index f6b780902..000000000 --- a/Tests/MySqlX.Data.Tests/RelationalTests/DataTypeTests.cs +++ /dev/null @@ -1,306 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySql.Data.Common; -using MySql.Data.MySqlClient; -using MySql.Data.MySqlClient.X.XDevAPI.Common; -using MySqlX.XDevAPI.Relational; -using System; -using System.Text; -using Xunit; -using Xunit.Abstractions; - -namespace MySqlX.Data.Tests.RelationalTests -{ - public class DataTypeTests : BaseTest - { - [Fact] - public void Float() - { - ExecuteSQL("CREATE TABLE test(rvalue FLOAT(14,8))"); - ExecuteSQL("INSERT INTO test VALUES(23.4), (14.8), (11.9)"); - - RowResult r = GetSession().GetSchema("test").GetTable("test").Select("rvalue").Execute(); - var rows = r.FetchAll(); - Assert.Equal(1, r.Columns.Count); - Assert.Equal(typeof(float), r.Columns[0].ClrType); - Assert.Equal(14, (int)r.Columns[0].Length); - Assert.Equal(8, (int)r.Columns[0].FractionalDigits); - Assert.Equal(ColumnType.Float, r.Columns[0].Type); - Assert.Equal(3, rows.Count); - Assert.Equal(23.4f, (float)rows[0][0]); - Assert.Equal(14.8f, rows[1][0]); - Assert.Equal(11.9f, rows[2][0]); - } - - [Fact] - public void Double() - { - ExecuteSQL("CREATE TABLE test(rvalue DOUBLE(12,4))"); - ExecuteSQL("INSERT INTO test VALUES(23.4), (14.8), (11.9)"); - - RowResult r = GetSession().GetSchema("test").GetTable("test").Select("rvalue").Execute(); - var rows = r.FetchAll(); - Assert.Equal(1, r.Columns.Count); - Assert.Equal(typeof(double), r.Columns[0].ClrType); - Assert.Equal(ColumnType.Double, r.Columns[0].Type); - Assert.Equal(12, (int)r.Columns[0].Length); - Assert.Equal(4, (int)r.Columns[0].FractionalDigits); - Assert.Equal(3, rows.Count); - Assert.Equal(23.4, rows[0][0]); - Assert.Equal(14.8, rows[1][0]); - Assert.Equal(11.9, rows[2][0]); - } - - [Fact] - public void Set() - { - ExecuteSQL("CREATE TABLE test(rvalue SET('A','B','C','D'))"); - ExecuteSQL("INSERT INTO test VALUES('A'), ('B,A'), ('B')"); - - RowResult r = GetSession().GetSchema("test").GetTable("test").Select("rvalue").Execute(); - var rows = r.FetchAll(); - Assert.Equal(1, r.Columns.Count); - Assert.Equal(typeof(string), r.Columns[0].ClrType); - Assert.Equal(ColumnType.Set, r.Columns[0].Type); - Assert.Equal(3, rows.Count); - Assert.Equal("A", rows[0][0]); - Assert.Equal("A,B", rows[1][0]); - Assert.Equal("B", rows[2][0]); - } - - [Fact] - public void Enum() - { - ExecuteSQL("CREATE TABLE test(rvalue Enum('Alpha','Beta','C','D'))"); - ExecuteSQL("INSERT INTO test VALUES('Alpha'), ('Beta'), ('C')"); - - RowResult r = GetSession().GetSchema("test").GetTable("test").Select("rvalue").Execute(); - var rows = r.FetchAll(); - Assert.Equal(1, r.Columns.Count); - Assert.Equal(typeof(string), r.Columns[0].ClrType); - Assert.Equal(ColumnType.Enum, r.Columns[0].Type); - Assert.Equal(3, rows.Count); - Assert.Equal("Alpha", rows[0][0]); - Assert.Equal("Beta", rows[1][0]); - Assert.Equal("C", rows[2][0]); - } - - [Fact] - public void SignedIntegers() - { - ExecuteSQL("CREATE TABLE test(tinyCol TINYINT, smallCol SMALLINT, mediumCol MEDIUMINT, intCol INT, bigCol BIGINT)"); - ExecuteSQL("INSERT INTO test VALUES(127, 32767, 8388607, 2147483647, 9223372036854775807)"); - ExecuteSQL("INSERT INTO test VALUES(-128, -32768, -8388608, -2147483648, -9223372036854775808)"); - - RowResult r = GetSession().GetSchema("test").GetTable("test").Select().Execute(); - var rows = r.FetchAll(); - Assert.Equal(5, r.Columns.Count); - Assert.Equal(typeof(sbyte), r.Columns[0].ClrType); - Assert.Equal(ColumnType.Tinyint, r.Columns[0].Type); - Assert.Equal((sbyte)127, rows[0][0]); - Assert.Equal((sbyte)-128, rows[1][0]); - Assert.Equal(typeof(Int16), r.Columns[1].ClrType); - Assert.Equal(ColumnType.Smallint, r.Columns[1].Type); - Assert.Equal((short)32767, rows[0][1]); - Assert.Equal((short)-32768, rows[1][1]); - Assert.Equal(typeof(Int32), r.Columns[2].ClrType); - Assert.Equal(ColumnType.Mediumint, r.Columns[2].Type); - Assert.Equal(8388607, rows[0][2]); - Assert.Equal(-8388608, rows[1][2]); - Assert.Equal(typeof(Int32), r.Columns[3].ClrType); - Assert.Equal(ColumnType.Int, r.Columns[3].Type); - Assert.Equal(2147483647, rows[0][3]); - Assert.Equal(-2147483648, rows[1][3]); - Assert.Equal(typeof(Int64), r.Columns[4].ClrType); - Assert.Equal(ColumnType.Bigint, r.Columns[4].Type); - Assert.Equal((long)9223372036854775807, rows[0][4]); - Assert.Equal((long)-9223372036854775808, rows[1][4]); - } - - [Fact] - public void UnsignedIntegers() - { - ExecuteSQL("CREATE TABLE test(tinyCol TINYINT UNSIGNED, smallCol SMALLINT UNSIGNED, mediumCol MEDIUMINT UNSIGNED, intCol INT UNSIGNED, bigCol BIGINT UNSIGNED)"); - ExecuteSQL("INSERT INTO test VALUES(255, 65535, 16777215, 4294967295, 18446744073709551615)"); - - RowResult r = GetSession().GetSchema("test").GetTable("test").Select().Execute(); - var rows = r.FetchAll(); - Assert.Equal(5, r.Columns.Count); - Assert.Equal(typeof(byte), r.Columns[0].ClrType); - Assert.Equal(ColumnType.Tinyint, r.Columns[0].Type); - Assert.Equal((byte)255, rows[0][0]); - Assert.Equal(typeof(UInt16), r.Columns[1].ClrType); - Assert.Equal(ColumnType.Smallint, r.Columns[1].Type); - Assert.Equal((ushort)65535, rows[0][1]); - Assert.Equal(typeof(UInt32), r.Columns[2].ClrType); - Assert.Equal(ColumnType.Mediumint, r.Columns[2].Type); - Assert.Equal((uint)16777215, rows[0][2]); - Assert.Equal(typeof(UInt32), r.Columns[3].ClrType); - Assert.Equal(ColumnType.Int, r.Columns[3].Type); - Assert.Equal((uint)4294967295, rows[0][3]); - Assert.Equal(typeof(UInt64), r.Columns[4].ClrType); - Assert.Equal(ColumnType.Bigint, r.Columns[4].Type); - Assert.Equal((ulong)18446744073709551615, rows[0][4]); - } - - [Fact] - public void Bit() - { - ExecuteSQL("CREATE TABLE test(bitCol BIT(8))"); - ExecuteSQL("INSERT INTO test VALUES(b'1111111')"); - - RowResult r = GetSession().GetSchema("test").GetTable("test").Select().Execute(); - var rows = r.FetchAll(); - Assert.Equal(1, r.Columns.Count); - Assert.Equal(typeof(UInt64), r.Columns[0].ClrType); - Assert.Equal(ColumnType.Bit, r.Columns[0].Type); - Assert.Equal((ulong)127, rows[0][0]); - } - - [Fact] - public void Decimal() - { - ExecuteSQL("CREATE TABLE test(decCol1 DECIMAL(20,9))"); - ExecuteSQL("INSERT INTO test VALUES(-1.23), (-12.345), (5), (43)"); - ExecuteSQL("INSERT INTO test VALUES(14523.2887238), (-8947.8923784)"); - - RowResult r = GetSession().GetSchema("test").GetTable("test").Select().Execute(); - var rows = r.FetchAll(); - Assert.Equal(1, r.Columns.Count); - Assert.Equal(typeof(decimal), r.Columns[0].ClrType); - Assert.Equal(ColumnType.Decimal, r.Columns[0].Type); - Assert.Equal(-1.23m, rows[0][0]); - Assert.Equal(-12.345m, rows[1][0]); - Assert.Equal(5m, rows[2][0]); - Assert.Equal(43m, rows[3][0]); - Assert.Equal(14523.2887238m, rows[4][0]); - Assert.Equal(-8947.8923784m, rows[5][0]); - } - - [Fact] - public void Json() - { - ExecuteSQL("CREATE TABLE test(jdoc JSON)"); - ExecuteSQL("INSERT INTO test VALUES('{ \"id\": 1, \"name\": \"John\" }')"); - ExecuteSQL("INSERT INTO test VALUES('[ \"a\", 1, \"b\", 2 ]')"); - - RowResult r = GetSession().GetSchema("test").GetTable("test").Select().Execute(); - var rows = r.FetchAll(); - Assert.Equal(1, r.Columns.Count); - Assert.Equal(typeof(string), r.Columns[0].ClrType); - Assert.Equal(ColumnType.Json, r.Columns[0].Type); - Assert.Equal("{\"id\": 1, \"name\": \"John\"}", rows[0][0]); - Assert.Equal("[\"a\", 1, \"b\", 2]", rows[1][0]); - } - - [Fact] - public void Strings() - { - ExecuteSQL("CREATE TABLE test(name VARCHAR(255) COLLATE cp932_japanese_ci)"); - ExecuteSQL("INSERT INTO test VALUES('表')"); - - RowResult r = GetSession().GetSchema("test").GetTable("test").Select().Execute(); - var rows = r.FetchAll(); - Assert.Equal(1, r.Columns.Count); - Assert.Equal(typeof(string), r.Columns[0].ClrType); - Assert.Equal(ColumnType.String, r.Columns[0].Type); - Assert.Equal("表", rows[0][0]); - } - - //[Fact] - public void UnsingedZeroFill() - { - ExecuteSQL("CREATE TABLE test(id INT ZEROFILL)"); - ExecuteSQL("INSERT INTO test VALUES(100)"); - - RowResult r = GetSession().GetSchema("test").GetTable("test").Select().Execute(); - var rows = r.FetchAll(); - Assert.Equal(1, r.Columns.Count); - Assert.Equal(typeof(UInt32), r.Columns[0].ClrType); - Assert.Equal(ColumnType.Int, r.Columns[0].Type); - Assert.False(r.Columns[0].IsNumberSigned); - Assert.True(r.Columns[0].IsPadded); - Assert.Equal("0000000100", rows[0][0].ToString()); - } - - [Fact] - public void Bytes() - { - ExecuteSQL("CREATE TABLE test(name VARCHAR(255) BINARY)"); - ExecuteSQL("INSERT INTO test VALUES('John')"); - - RowResult r = GetSession().GetSchema("test").GetTable("test").Select().Execute(); - var rows = r.FetchAll(); - Assert.Equal(1, r.Columns.Count); - Assert.Equal(typeof(string), r.Columns[0].ClrType); - Assert.Equal(ColumnType.String, r.Columns[0].Type); - Assert.Equal("John", rows[0][0]); - } - - [Fact] - public void BytesUsingCollation() - { - ExecuteSQL("CREATE TABLE test(name VARCHAR(255) COLLATE utf8_bin)"); - ExecuteSQL("INSERT INTO test VALUES('Mark')"); - - RowResult r = GetSession().GetSchema("test").GetTable("test").Select().Execute(); - var rows = r.FetchAll(); - Assert.Equal(1, r.Columns.Count); - Assert.Equal(typeof(string), r.Columns[0].ClrType); - Assert.Equal(ColumnType.String, r.Columns[0].Type); - Assert.Equal("Mark", rows[0][0]); - } - - [Fact] - public void Geometry() - { - ExecuteSQL("CREATE TABLE test(line GEOMETRY)"); - ExecuteSQL("INSERT INTO test VALUES(ST_GeomFromText('LINESTRING(0 0, 10 10, 20 25, 50 60)'))"); - - RowResult r = GetSession().GetSchema("test").GetTable("test").Select().Execute(); - var rows = r.FetchAll(); - Assert.Equal(1, r.Columns.Count); - Assert.Equal(typeof(byte[]), r.Columns[0].ClrType); - Assert.Equal(ColumnType.Geometry, r.Columns[0].Type); - Assert.Equal("0000000001020000000400000000000000000000000000000000000000000000000000244000000000000024400000000000003440000000000000394000000000000049400000000000004E40", - BitConverter.ToString((byte[])rows[0][0]).Replace("-", "")); - } - - [Fact] - public void BlobTypes() - { - ExecuteSQL("CREATE TABLE test(a BLOB, b TEXT)"); - ExecuteSQL("INSERT INTO test VALUES('Car', 'Plane')"); - - RowResult r = GetSession().GetSchema(schemaName).GetTable("test").Select().Execute(); - var rows = r.FetchAll(); - Assert.Equal(2, r.Columns.Count); - Assert.Equal(typeof(byte[]), r.Columns[0].ClrType); - Assert.Equal(typeof(string), r.Columns[1].ClrType); - Assert.Equal(ColumnType.Bytes, r.Columns[0].Type); - Assert.Equal(ColumnType.String, r.Columns[1].Type); - Assert.Equal(CharSetMap.GetEncoding(new DBVersion(), r.Columns[0].CharacterSetName).GetBytes("Car"), rows[0][0]); - Assert.Equal("Plane", rows[0][1]); - } - } -} diff --git a/Tests/MySqlX.Data.Tests/RelationalTests/DateTimeTests.cs b/Tests/MySqlX.Data.Tests/RelationalTests/DateTimeTests.cs deleted file mode 100644 index 401786087..000000000 --- a/Tests/MySqlX.Data.Tests/RelationalTests/DateTimeTests.cs +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright © 2015, 2017 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using MySqlX.XDevAPI.Relational; -using Xunit; -using MySqlX.Data; -using MySql.Data.MySqlClient; -using MySql.Data.MySqlClient.X.XDevAPI.Common; - -namespace MySqlX.Data.Tests.RelationalTests -{ - public class DateTimeTests : BaseTest - { - [Fact] - public void DateTime() - { - ExecuteSQL("CREATE TABLE test.test(DT DATETIME)"); - ExecuteSQL("INSERT INTO test.test VALUES('2001-02-03 04:05:06')"); - - RowResult r = GetSession().GetSchema("test").GetTable("test").Select("dt").Execute(); - var rows = r.FetchAll(); - Assert.Equal(1, r.Columns.Count); - Assert.Equal(typeof(DateTime), r.Columns[0].ClrType); - Assert.Equal(ColumnType.DateTime, r.Columns[0].Type); - Assert.Equal(1, rows.Count); - DateTime dt = (DateTime)rows[0]["dt"]; - DateTime test = new DateTime(2001, 2, 3, 4, 5, 6); - Assert.Equal(test, dt); - } - - [Fact] - public void Date() - { - ExecuteSQL("CREATE TABLE test.test(DT DATE)"); - ExecuteSQL("INSERT INTO test.test VALUES('2001-02-03')"); - - RowResult r = GetSession().GetSchema("test").GetTable("test").Select("dt").Execute(); - var rows = r.FetchAll(); - Assert.Equal(1, r.Columns.Count); - Assert.Equal(typeof(DateTime), r.Columns[0].ClrType); - Assert.Equal(ColumnType.Date, r.Columns[0].Type); - Assert.Equal(1, rows.Count); - DateTime dt = (DateTime)rows[0]["dt"]; - DateTime test = new DateTime(2001, 2, 3); - Assert.Equal(test, dt); - } - - [Fact] - public void Timestamp() - { - ExecuteSQL("CREATE TABLE test.test(DT TIMESTAMP)"); - ExecuteSQL("INSERT INTO test.test VALUES('2001-02-03')"); - - RowResult r = GetSession().GetSchema("test").GetTable("test").Select("dt").Execute(); - var rows = r.FetchAll(); - Assert.Equal(1, r.Columns.Count); - Assert.Equal(typeof(DateTime), r.Columns[0].ClrType); - //TODO: this should support timestamp - Assert.Equal(ColumnType.Timestamp, r.Columns[0].Type); - Assert.Equal(1, rows.Count); - DateTime dt = (DateTime)rows[0]["dt"]; - DateTime test = new DateTime(2001, 2, 3); - Assert.Equal(test, dt); - } - - [Fact] - public void Time() - { - ExecuteSQL("CREATE TABLE test.test(DT TIME)"); - ExecuteSQL("INSERT INTO test.test VALUES('01:02:03')"); - - RowResult r = GetSession().GetSchema("test").GetTable("test").Select("dt").Execute(); - var rows = r.FetchAll(); - Assert.Equal(1, r.Columns.Count); - Assert.Equal(typeof(TimeSpan), r.Columns[0].ClrType); - Assert.Equal(ColumnType.Time, r.Columns[0].Type); - Assert.Equal(1, rows.Count); - TimeSpan t = (TimeSpan)rows[0]["dt"]; - TimeSpan test = new TimeSpan(1, 2, 3); - Assert.Equal(test, t); - } - - [Fact] - public void NegativeTime() - { - ExecuteSQL("CREATE TABLE test.test(DT TIME)"); - ExecuteSQL("INSERT INTO test.test VALUES('-01:02:03')"); - - RowResult r = GetSession().GetSchema("test").GetTable("test").Select("dt").Execute(); - var rows = r.FetchAll(); - Assert.Equal(1, r.Columns.Count); - Assert.Equal(typeof(TimeSpan), r.Columns[0].ClrType); - Assert.Equal(ColumnType.Time, r.Columns[0].Type); - Assert.Equal(1, rows.Count); - TimeSpan t = (TimeSpan)rows[0]["dt"]; - TimeSpan test = new TimeSpan(-1, 2, 3); - Assert.Equal(test, t); - } - } -} diff --git a/Tests/MySqlX.Data.Tests/RelationalTests/RelationalGCTests.cs b/Tests/MySqlX.Data.Tests/RelationalTests/RelationalGCTests.cs deleted file mode 100644 index fbd378231..000000000 --- a/Tests/MySqlX.Data.Tests/RelationalTests/RelationalGCTests.cs +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.XDevAPI.Relational; -using System; -using Xunit; - -namespace MySqlX.Data.Tests.ResultTests -{ - public class RelationalGCTests : BaseTest - { - [Fact] - public void FetchAllNoReference() - { - ExecuteSQL("CREATE TABLE test(name VARCHAR(40), age INT)"); - Table table = testSchema.GetTable("test"); - - table.Insert("name", "age").Values("Henry", "22").Values("Patric", 30).Execute(); - var result = table.Select().Execute(); - var rows = result.FetchAll(); - WeakReference wr = new WeakReference(result); - result = null; - GC.Collect(); - Assert.False(wr.IsAlive); - Assert.Equal(2, rows.Count); - Assert.Equal(22, rows[0]["age"]); - Assert.Equal("Patric", rows[1]["name"]); - } - } -} diff --git a/Tests/MySqlX.Data.Tests/RelationalTests/RowBufferingTests.cs b/Tests/MySqlX.Data.Tests/RelationalTests/RowBufferingTests.cs deleted file mode 100644 index 5612f972d..000000000 --- a/Tests/MySqlX.Data.Tests/RelationalTests/RowBufferingTests.cs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.XDevAPI.Relational; -using System.Linq; -using Xunit; - -namespace MySqlX.Data.Tests.RelationalTests -{ - class RowBufferingTests : BaseTest - { - [Fact] - public void SmartBuffering() - { - ExecuteSQL("CREATE TABLE test1(id INT)"); - ExecuteSQL("INSERT INTO test1 VALUES (1),(2),(3),(4)"); - ExecuteSQL("CREATE TABLE test2(id INT, val INT)"); - ExecuteSQL("INSERT INTO test2 VALUES (1,0)"); - - var rowResult = testSchema.GetTable("test1").Select("id").Execute(); - foreach (var row in rowResult) - { - var result = testSchema.GetTable("test2").Update().Where("id=1").Set("val", row["id"]).Execute(); - Assert.Equal(1, result.RecordsAffected); - } - - Row valRow = testSchema.GetTable("test2").Select("val").Execute().FetchOne(); - Assert.Equal(4, valRow[0]); - } - } -} diff --git a/Tests/MySqlX.Data.Tests/RelationalTests/SqlTests.cs b/Tests/MySqlX.Data.Tests/RelationalTests/SqlTests.cs deleted file mode 100644 index 67b15446c..000000000 --- a/Tests/MySqlX.Data.Tests/RelationalTests/SqlTests.cs +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.XDevAPI; -using MySqlX.XDevAPI.Relational; -using Xunit; - -namespace MySqlX.Data.Tests.RelationalTests -{ - public class SqlTests : BaseTest - { - [Fact] - public void ReturnSimpleScalar() - { - ExecuteSQL("CREATE TABLE test(id INT)"); - ExecuteSQL("INSERT INTO test VALUES (1)"); - SqlResult r = GetNodeSession().SQL("SELECT * FROM test").Execute(); - Assert.True(r.Next()); - Assert.Equal(1, r[0]); - Assert.False(r.NextResult()); - } - - [Fact] - public void ExecuteStoredProcedure() - { - ExecuteSQL("CREATE PROCEDURE `my_proc` () BEGIN SELECT 5; END"); - - NodeSession session = GetNodeSession(); - var result = session.SQL("CALL my_proc()").Execute(); - Assert.True(result.HasData); - var row = result.FetchOne(); - Assert.NotNull(row); - Assert.Equal((sbyte)5, row[0]); - Assert.False(result.Next()); - Assert.Null(result.FetchOne()); - Assert.False(result.NextResult()); - } - - [Fact] - public void ExecuteStoredProcedureMultipleResults() - { - ExecuteSQL("CREATE PROCEDURE `my_proc` () BEGIN SELECT 5; SELECT 'A'; SELECT 5 * 2; END"); - - NodeSession session = GetNodeSession(); - var result = session.SQL("CALL my_proc()").Execute(); - Assert.True(result.HasData); - var row = result.FetchOne(); - Assert.NotNull(row); - Assert.Equal((sbyte)5, row[0]); - Assert.False(result.Next()); - Assert.Null(result.FetchOne()); - - Assert.True(result.NextResult()); - row = result.FetchOne(); - Assert.NotNull(row); - Assert.Equal("A", row[0]); - Assert.False(result.Next()); - Assert.Null(result.FetchOne()); - - Assert.True(result.NextResult()); - row = result.FetchOne(); - Assert.NotNull(row); - Assert.Equal((sbyte)10, row[0]); - Assert.False(result.Next()); - Assert.Null(result.FetchOne()); - - Assert.False(result.NextResult()); - } - - [Fact] - public void Bind() - { - ExecuteSQL("CREATE TABLE test(id INT, letter varchar(1))"); - for (int i = 1; i <= 10; i++) - GetNodeSession().SQL("INSERT INTO test VALUES (?, ?), (?, ?)") - .Bind(i, ((char)('@' + i)).ToString()) - .Bind(++i, ((char)('@' + i)).ToString()) - .Execute(); - - SqlResult result = GetNodeSession().SQL("select * from test where id=?").Bind(5).Execute(); - Assert.True(result.Next()); - Assert.Equal(1, result.Rows.Count); - Assert.Equal(5, result[0]); - Assert.Equal("E", result[1]); - } - - [Fact] - public void BindNull() - { - ExecuteSQL("CREATE TABLE test(id INT, letter varchar(1))"); - - var nodeSession = GetNodeSession(); - var result = nodeSession.SQL("INSERT INTO test VALUES(1, ?), (2, 'B');").Bind(null).Execute(); - Assert.Equal(2ul, result.RecordsAffected); - - var sqlResult = nodeSession.SQL("SELECT * FROM test WHERE letter is ?").Bind(null).Execute().FetchAll(); - Assert.Equal(1, sqlResult.Count); - Assert.Equal(1, sqlResult[0][0]); - Assert.Null(sqlResult[0][1]); - } - - [Fact] - public void Alias() - { - var nodeSession = GetNodeSession(); - var stmt = nodeSession.SQL("SELECT 1 AS UNO").Execute(); - var result = stmt.FetchAll(); - Assert.Equal("UNO", stmt.Columns[0].ColumnLabel); - } - } -} diff --git a/Tests/MySqlX.Data.Tests/RelationalTests/TableAsyncTests.cs b/Tests/MySqlX.Data.Tests/RelationalTests/TableAsyncTests.cs deleted file mode 100644 index f1b3bf2e8..000000000 --- a/Tests/MySqlX.Data.Tests/RelationalTests/TableAsyncTests.cs +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using MySqlX.XDevAPI.Common; -using MySqlX.XDevAPI.Relational; -using Xunit; - -namespace MySqlX.Data.Tests.RelationalTests -{ - public class TableAsyncTests : BaseTest - { - public TableAsyncTests() - { - ExecuteSQL("CREATE TABLE test.test(id INT, age INT)"); - } - - [Fact] - public void MultipleTableInsertAsync() - { - Table table = testSchema.GetTable("test"); - List> tasksList = new List>(); - - for (int i = 1; i <= 200; i++) - { - tasksList.Add(table.Insert().Values(i, i%250).ExecuteAsync()); - } - - Assert.True(Task.WaitAll(tasksList.ToArray(), TimeSpan.FromMinutes(2)), "WaitAll timeout"); - Assert.Equal(200, table.Count()); - } - - [Fact] - public void MultipleTableSelectAsync() - { - var table = testSchema.GetTable("test"); - int rows = 100; - var insert = table.Insert(); - HashSet validator = new HashSet(); - - for(int i = 1; i <= rows; i++) - { - insert.Values(i, i); - } - var result = insert.Execute(); - - List> tasksList = new List>(); - - for(int i = 1; i <= rows; i++) - { - tasksList.Add(table.Select().Where("age = :age").Bind("aGe", i).ExecuteAsync()); - } - - Assert.True(Task.WaitAll(tasksList.ToArray(), TimeSpan.FromMinutes(2)), "WaitAll timeout"); - foreach (Task task in tasksList) - { - Assert.Equal(2, task.Result.Columns.Count); - Assert.Equal(1, task.Result.Rows.Count); - int value = (int)task.Result.Rows[0][1]; - Assert.False(validator.Contains(value), value + " value exists"); - validator.Add(value); - } - Assert.Equal(rows, validator.Count); - } - } -} diff --git a/Tests/MySqlX.Data.Tests/RelationalTests/TableDeleteTests.cs b/Tests/MySqlX.Data.Tests/RelationalTests/TableDeleteTests.cs deleted file mode 100644 index de29fea00..000000000 --- a/Tests/MySqlX.Data.Tests/RelationalTests/TableDeleteTests.cs +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.XDevAPI.Common; -using MySqlX.XDevAPI.Relational; -using Xunit; - -namespace MySqlX.Data.Tests.RelationalTests -{ - public class TableDeleteTests : BaseTest - { - public TableDeleteTests() - { - ExecuteSQL("CREATE TABLE test.test(id INT, age INT)"); - - var insertStatement = testSchema.GetTable("test").Insert(); - int rowsToInsert = 10; - for (int i = 1; i <= rowsToInsert; i++) - { - insertStatement.Values(i, i); - } - insertStatement.Execute(); - Assert.Equal(rowsToInsert, CountRows()); - } - - private long CountRows() - { - return testSchema.GetTable("test").Count(); - } - - private void ExecuteDelete(TableDeleteStatement statement, int expectedRowsCount) - { - Result result = statement.Execute(); - Assert.Equal(expectedRowsCount, CountRows()); - } - - [Fact] - public void DeleteAllTest() - { - ExecuteDelete(testSchema.GetTable("test").Delete(), 0); - } - - [Fact] - public void DeleteConditionTest() - { - ExecuteDelete(testSchema.GetTable("test").Delete().Where("age % 2 = 0"), 5); - } - - [Fact] - public void DeleteOrderbyAndLimit() - { - ExecuteDelete(testSchema.GetTable("test").Delete().OrderBy("age Desc").Limit(3), 7); - } - - [Fact] - public void DeleteConditionOrderbyAndLimit() - { - ExecuteDelete(testSchema.GetTable("test").Delete().Where("id > 5").OrderBy("id Desc").Limit(2), 8); - } - - [Fact] - public void DeleteBindTest() - { - var deleteStmt = testSchema.GetTable("test").Delete().Where("age = :aGe"); - ExecuteDelete(deleteStmt.Bind("Age", 4), 9); - ExecuteDelete(deleteStmt.Bind("age", 6), 8); - } - } -} diff --git a/Tests/MySqlX.Data.Tests/RelationalTests/TableInsertTests.cs b/Tests/MySqlX.Data.Tests/RelationalTests/TableInsertTests.cs deleted file mode 100644 index 895fd09eb..000000000 --- a/Tests/MySqlX.Data.Tests/RelationalTests/TableInsertTests.cs +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using System.Linq; -using MySqlX.XDevAPI.Relational; -using Xunit; -using MySql.Data.MySqlClient; - -namespace MySqlX.Data.Tests.RelationalTests -{ - public class TableInsertTests : BaseTest - { - public TableInsertTests() - { - } - - [Fact] - public void InsertMultipleValues() - { - ExecuteSQL("CREATE TABLE test.test(name VARCHAR(40), age INT)"); - Table table = testSchema.GetTable("test"); - - var result = table.Insert("name", "age") - .Values("Henry", "22") - .Values("Patric", 30) - .Execute(); - Assert.Equal(2, result.RecordsAffected); - - var selectResult = table.Select().Execute(); - while (selectResult.Next()) ; - Assert.Equal(2, selectResult.Rows.Count); - Assert.Equal("Henry", selectResult.Rows.ToArray()[0][0]); - Assert.Equal(22, selectResult.Rows.ToArray()[0][1]); - Assert.Equal("Patric", selectResult.Rows.ToArray()[1][0]); - Assert.Equal(30, selectResult.Rows.ToArray()[1][1]); - - Assert.Equal(2, table.Count()); - } - - [Fact] - public void InsertExpressions() - { - ExecuteSQL("CREATE TABLE test.test(name VARCHAR(40), age INT)"); - Table table = testSchema.GetTable("test"); - - var result = table.Insert("name", "age") - .Values("upper('mark')", "50-16") - .Execute(); - Assert.Equal(1, result.RecordsAffected); - - var selectResult = table.Select().Execute(); - while (selectResult.Next()) ; - Assert.Equal(1, selectResult.Rows.Count); - Assert.Equal("MARK", selectResult.Rows.ToArray()[0][0]); - Assert.Equal(34, selectResult.Rows.ToArray()[0][1]); - } - - [Fact] - public void ReuseStatement() - { - ExecuteSQL("CREATE TABLE test(name VARCHAR(40), age INT)"); - Table table = testSchema.GetTable("test"); - - var stmt = table.Insert("name", "age"); - var result = stmt.Values("upper('mark')", "50-16").Execute(); - Assert.Equal(1, result.RecordsAffected); - Assert.Throws(() => result = stmt.Values("George", 34, 1).Execute()); - result = stmt.Values("George", 34).Execute(); - Assert.Equal(1, result.RecordsAffected); - Assert.Equal(2, table.Select().Execute().FetchAll().Count); - } - } -} diff --git a/Tests/MySqlX.Data.Tests/RelationalTests/TableSelectTests.cs b/Tests/MySqlX.Data.Tests/RelationalTests/TableSelectTests.cs deleted file mode 100644 index 20a6c1c19..000000000 --- a/Tests/MySqlX.Data.Tests/RelationalTests/TableSelectTests.cs +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.XDevAPI; -using Xunit; -using System.Linq; -using MySqlX.XDevAPI.Relational; -using MySqlX.XDevAPI.Common; -using System; - -namespace MySqlX.Data.Tests.RelationalTests -{ - public class TableSelectTests : BaseTest - { - object[][] allRows = { - new object[] { 1, "jonh doe", 38 }, - new object[] { 2, "milton green", 45 } - }; - - public TableSelectTests() - { - ExecuteSQL("CREATE TABLE test.test (id INT, name VARCHAR(45), age INT)"); - TableInsertStatement stmt = testSchema.GetTable("test").Insert(); - stmt.Values(allRows[0]); - stmt.Values(allRows[1]); - Result result = stmt.Execute(); - } - - [Fact] - public void FetchOne() - { - Table t = testSchema.GetTable("test"); - Assert.Equal(38, t.Select("age").Execute().FetchOne()["age"]); - } - - private void MultiTableSelectTest(TableSelectStatement statement, object[][] expectedValues) - { - RowResult result = statement.Execute(); - int rowCount = result.FetchAll().Count; - - Assert.Equal(expectedValues.Length, rowCount); - Assert.Equal(expectedValues.Length, result.Rows.Count); - for (int i = 0; i < expectedValues.Length; i++) - { - for (int j = 0; j < expectedValues[i].Length; j++) - { - Assert.Equal(expectedValues[i][j], result.Rows.ToArray()[i][j]); - } - } - } - - [Fact] - public void TableSelect() - { - var table = testSchema.GetTable("test"); - - MultiTableSelectTest(table.Select(), allRows); - MultiTableSelectTest(table.Select("name", "age"), - allRows.Select(c => new[] { c[1], c[2] }).ToArray()); - MultiTableSelectTest(table.Select("name", "age").Where("age == 38"), - allRows.Select(c => new[] { c[1], c[2] }).Where(c => (int)c[1] == 38).ToArray()); - MultiTableSelectTest(table.Select().Where("age == 45"), - allRows.Where(c => (int)c[2] == 45).ToArray()); - MultiTableSelectTest(table.Select().OrderBy("age"), - allRows.OrderBy(c => c[2]).ToArray()); - MultiTableSelectTest(table.Select().OrderBy("age desc"), - allRows.OrderByDescending(c => c[2]).ToArray()); - MultiTableSelectTest(table.Select().OrderBy("age desc, name"), - allRows.OrderByDescending(c => c[2]).ThenBy(c => c[1]).ToArray()); - MultiTableSelectTest(table.Select().Limit(1), - allRows.Take(1).ToArray()); - MultiTableSelectTest(table.Select().Limit(10, 1), - allRows.Skip(1).Take(10).ToArray()); - MultiTableSelectTest(table.Select().Limit(1, 1), - allRows.Skip(1).Take(1).ToArray()); - MultiTableSelectTest(table.Select().Where("name like :name").Bind("nAme", "%jon%"), - allRows.Where(c => c[1].ToString().Contains("jon")).ToArray()); - MultiTableSelectTest(table.Select().Where("name like :name").Bind("naMe", "%on%"), - allRows.Where(c => c[1].ToString().Contains("on")).ToArray()); - //MultiTableSelectTest(employees.Select().GroupBy("age"), - //allRows.GroupBy(c => new[] { c[2] }).First().ToArray()); - } - - [Fact] - public void AllColumns() - { - var table = testSchema.GetTable("test"); - var select = table.Select("*, 42 as a_number, '43' as a_string").Execute(); - var rows = select.FetchAll(); - Assert.Equal(5, select.Columns.Count); - Assert.Equal(allRows.Length, rows.Count); - Assert.Equal(allRows[0][0], rows[0]["id"]); - Assert.Equal(allRows[0][1], rows[0]["name"]); - Assert.Equal(allRows[0][2], rows[0]["age"]); - Assert.Equal((sbyte)42, rows[0]["a_number"]); - Assert.Equal("43", rows[0]["a_string"]); - } - - [Fact] - public void CountAllColumns() - { - var table = testSchema.GetTable("test"); - var select = table.Select("count(*) + 10").Execute(); - var rows = select.FetchAll(); - Assert.Equal(1, select.Columns.Count); - Assert.Equal(1, rows.Count); - Assert.Equal(allRows.Length + 10, (long)rows[0][0]); - } - - [Fact] - public void MultipleBind() - { - object[] validationRow = allRows[1]; - var table = testSchema.GetTable("test"); - var select = table.Select().Where("Name = :nAme && Age = :aGe").Bind("agE", validationRow[2]).Bind("naMe", validationRow[1]).Execute(); - var rows = select.FetchAll(); - Assert.Equal(1, rows.Count); - Assert.Equal(validationRow[1], rows[0]["namE"]); - Assert.Equal(validationRow[2], rows[0]["AGe"]); - } - - [Fact] - public void DatetimeAndMicroseconds() - { - ExecuteSQL("CREATE TABLE test.testDate (id INT, name VARCHAR(45), birthday DATETIME(6))"); - ExecuteSQL("INSERT INTO test.testDate VALUES(1, 'JOHN', '1985-10-21 16:34:22.123456')"); - ExecuteSQL("INSERT INTO test.testDate VALUES(1, 'BILL', '1985-10-21 10:00:45.987')"); - var rows = GetSession().GetSchema("test").GetTable("testDate").Select().Execute().FetchAll(); - Assert.Equal(2, rows.Count); - Assert.Equal(new DateTime(1985, 10, 21, 16, 34, 22).AddTicks(1234560), (DateTime)rows[0]["birthday"]); - Assert.Equal(new DateTime(1985, 10, 21, 10, 0, 45).AddTicks(9870000), (DateTime)rows[1]["birthday"]); - } - - [Fact] - public void DatetimeAndMilliseconds() - { - ExecuteSQL("CREATE TABLE test.testDate (id INT, name VARCHAR(45), birthday DATETIME(3))"); - ExecuteSQL("INSERT INTO test.testDate VALUES(1, 'JOHN', '1985-10-21 16:34:22.123456')"); - ExecuteSQL("INSERT INTO test.testDate VALUES(1, 'BILL', '1985-10-21 10:00:45.098')"); - var rows = GetSession().GetSchema("test").GetTable("testDate").Select().Execute().FetchAll(); - Assert.Equal(2, rows.Count); - Assert.Equal(new DateTime(1985, 10, 21, 16, 34, 22).AddTicks(1230000), (DateTime)rows[0]["birthday"]); - Assert.Equal(new DateTime(1985, 10, 21, 10, 0, 45).AddTicks(980000), (DateTime)rows[1]["birthday"]); - } - } - -} diff --git a/Tests/MySqlX.Data.Tests/RelationalTests/TableUpdateTests.cs b/Tests/MySqlX.Data.Tests/RelationalTests/TableUpdateTests.cs deleted file mode 100644 index df29fe2c9..000000000 --- a/Tests/MySqlX.Data.Tests/RelationalTests/TableUpdateTests.cs +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright © 2015, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySql.Data.MySqlClient; -using MySqlX.XDevAPI.Common; -using MySqlX.XDevAPI.Relational; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Xunit; - -namespace MySqlX.Data.Tests.RelationalTests -{ - public class TableUpdateTests : BaseTest - { - Table table; - - public TableUpdateTests() - { - ExecuteSQL("CREATE TABLE test.test(id INT, name VARCHAR(40), age INT)"); - - table = testSchema.GetTable("test"); - var insertStatement = table.Insert(); - int rowsToInsert = 10; - for (int i = 1; i <= rowsToInsert; i++) - { - insertStatement.Values(i, i, i); - } - insertStatement.Execute(); - Assert.Equal(rowsToInsert, CountRows()); - } - - private int CountRows() - { - return GetRows(null).Count; - } - - private IReadOnlyCollection GetRows(FilterParams filter) - { - var statement = table.Select(); - if (filter != null) - { - statement.FilterData.Condition = filter.Condition; - statement.FilterData.Limit = filter.Limit; - statement.FilterData.OrderBy = filter.OrderBy; - statement.FilterData.Parameters = filter.Parameters; - } - var result = statement.Execute(); - while (result.Next()) ; - return result.Rows; - } - - private void ValidateUpdate(TableUpdateStatement statement) - { - Dictionary parameters = new Dictionary(statement.FilterData.Parameters); - var result = statement.Execute(); - statement.FilterData.Parameters = parameters; - var rows = GetRows(statement.FilterData); - foreach (var row in rows) - { - foreach (var set in statement.updates) - { - Assert.Equal(set.Value.ToString(), row.GetString(set.Path)); - } - } - } - - [Fact] - public void EmptyUpdateTest() - { - Assert.Throws(() => table.Update().Execute()); - } - - [Fact] - public void UpdateConditionTest() - { - ValidateUpdate(table.Update().Where("id = 5").Set("name", "other")); - } - - [Fact] - public void UpdateMultiSet() - { - ValidateUpdate(table.Update().Set("name", "other") - .Set("age", 21) - .Set("id", 30) - .Where("id = 3")); - } - - [Fact] - public void UpdateMultiRows() - { - ValidateUpdate(table.Update().Set("age", 85).Where("id % 2 = 0")); - } - - [Fact] - public void UpdateAllRows() - { - ValidateUpdate(table.Update().Set("age", 32).Set("name", "jonh")); - } - - [Fact] - public void UpdateOrderbyAndLimit() - { - ValidateUpdate(table.Update().Set("age", 15).OrderBy("id DES").Limit(5)); - } - - [Fact] - public void UpdateBind() - { - var stmt = table.Update().Set("age", 55).Where("id = :id or id = :id or id = :id2"); - ValidateUpdate(stmt.Bind("id", 4).Bind("id2", 7)); - ValidateUpdate(stmt.Bind("id", 5).Bind("id2", 8)); - } - } -} diff --git a/Tests/MySqlX.Data.Tests/RelationalTests/ViewTests.cs b/Tests/MySqlX.Data.Tests/RelationalTests/ViewTests.cs deleted file mode 100644 index a545e9b52..000000000 --- a/Tests/MySqlX.Data.Tests/RelationalTests/ViewTests.cs +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright © 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySql.Data.MySqlClient; -using MySqlX.XDevAPI.Relational; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Xunit; - -namespace MySqlX.Data.Tests.RelationalTests -{ - public class ViewTests : BaseTest - { - [Fact] - public void TryUpdatingView() - { - ExecuteSQL("CREATE TABLE test(id int)"); - ExecuteSQL("CREATE VIEW view1 AS select *, 1 from test"); - - List
tables = testSchema.GetTables(); - Assert.Equal(2, tables.Count); - - Table view = tables.First(i => i.IsView); - Assert.Equal("view1", view.Name); - MySqlException ex = Assert.Throws(() => view.Insert().Values(1).Execute()); - Assert.Equal("Column '1' is not updatable", ex.Message); - } - - [Fact] - public void GetView() - { - ExecuteSQL("CREATE TABLE test(id int)"); - ExecuteSQL("CREATE VIEW view1 AS select *, 1 from test"); - - Table table = testSchema.GetTable("test"); - Table view = testSchema.GetTable("view1"); - Assert.True(view.IsView); - Assert.False(table.IsView); - } - - [Fact] - public void NonExistingView() - { - Assert.Throws(() => testSchema.GetTable("no_exists").IsView); - } - } -} diff --git a/Tests/MySqlX.Data.Tests/Resources.Designer.cs b/Tests/MySqlX.Data.Tests/Resources.Designer.cs deleted file mode 100644 index 12b2ee430..000000000 --- a/Tests/MySqlX.Data.Tests/Resources.Designer.cs +++ /dev/null @@ -1,97 +0,0 @@ -//------------------------------------------------------------------------------ -// -// 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 MySqlX.Data.Tests { - 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", "4.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() { - } - - /// - /// 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(typeof(Resources)); - 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 DROP SCHEMA IF EXISTS `{0}`; - ///CREATE SCHEMA `{0}`; - ///USE `{0}`; - /// - ///CREATE TABLE `{1}` ( - /// `employee_id` INT NOT NULL AUTO_INCREMENT, - /// `name` VARCHAR(450) NOT NULL, - /// `age` TINYINT UNSIGNED NULL, - /// PRIMARY KEY (`employee_id`)); - /// - ///INSERT INTO `{1}` - ///(`name`, `age`) - ///VALUES - ///('jonh doe', 38); - /// - ///INSERT INTO `{1}` - ///(`name`, `age`) - ///VALUES - ///('milton green', 45); - /// - /// - ///CREATE TABLE `{2}` ( - /// `employee_id` INT NOT NULL AUTO_INCREMENT, - /// `name` VARCHAR(450) NOT NULL, - /// `age` TINYINT UNSIGNED NULL, - /// PRIMARY [rest of string was truncated]";. - /// - internal static string TableScripts { - get { - return ResourceManager.GetString("TableScripts", resourceCulture); - } - } - } -} diff --git a/Tests/MySqlX.Data.Tests/SchemaTests.cs b/Tests/MySqlX.Data.Tests/SchemaTests.cs deleted file mode 100644 index 35909f598..000000000 --- a/Tests/MySqlX.Data.Tests/SchemaTests.cs +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright © 2015, 2016 Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySqlX.XDevAPI; -using MySqlX.XDevAPI.Common; -using MySqlX.XDevAPI.Relational; -using System.Collections.Generic; -using Xunit; -using System.Linq; - -namespace MySqlX.Data.Tests -{ - public class SchemaTests : BaseTest - { - [Fact] - public void GetSchemas() - { - XSession session = GetSession(); - List schemas = session.GetSchemas(); - - Assert.True(schemas.Exists(s => s.Name == base.testSchema.Name)); - } - - [Fact] - public void GetInvalidSchema() - { - XSession s = GetSession(); - Schema schema = s.GetSchema("test-schema"); - Assert.False(schema.ExistsInDatabase()); - } - - [Fact] - public void GetAllTables() - { - Collection coll = CreateCollection("coll"); - ExecuteSQL("CREATE TABLE test(id int)"); - - List
tables = testSchema.GetTables(); - Assert.True(tables.Count == 1); - } - - [Fact] - public void GetAllViews() - { - Collection coll = CreateCollection("coll"); - - ExecuteSQL("CREATE TABLE test(id int)"); - ExecuteSQL("CREATE VIEW view1 AS select * from test"); - ExecuteSQL("CREATE VIEW view2 AS select * from test"); - - List
tables = testSchema.GetTables(); - Assert.Equal(3, tables.Count); - Assert.Equal(1, tables.Count(i => !i.IsView)); - Assert.Equal(2, tables.Count(i => i.IsView)); - - List colls = testSchema.GetCollections(); - Assert.Equal(1, colls.Count); - } - - [Fact] - public void GetCollectionAsTable() - { - Collection testCollection = CreateCollection("test"); - - Result r = testCollection.Add(@"{ ""_id"": 1, ""foo"": 1 }").Execute(); - Assert.Equal(1, r.RecordsAffected); - - Table test = testSchema.GetCollectionAsTable("test"); - Assert.True(test.ExistsInDatabase()); - - RowResult result = test.Select("_id").Execute(); - Assert.True(result.Next()); - Assert.Equal("1", result[0]); - } - } -} diff --git a/Tests/MySqlX.Data.Tests/SessionConfigurationTests.cs b/Tests/MySqlX.Data.Tests/SessionConfigurationTests.cs deleted file mode 100644 index a38f807f6..000000000 --- a/Tests/MySqlX.Data.Tests/SessionConfigurationTests.cs +++ /dev/null @@ -1,230 +0,0 @@ -// Copyright © 2016, 2017, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - -using MySqlX.XDevAPI; -using MySqlX.XDevAPI.Config; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Xunit; - -namespace MySqlX.Data.Tests -{ - public class SessionConfigurationTests - { - public SessionConfigurationTests() - { - foreach (string name in SessionConfigManager.List()) - { - SessionConfigManager.Delete(name); - } - } - - [Fact] - public void Save() - { - // save using SessionConfig instance - SessionConfig scSave = new SessionConfig("SessionConfig", "mysqlx://myuser@localhost/SessionConfig"); - scSave.SetAppData("alias", "SessionConfigAlias"); - SessionConfigManager.Save(scSave); - SessionConfig sc = SessionConfigManager.Get("SessionConfig"); - Assert.Equal("SessionConfig", sc.Name); - Assert.Equal("mysqlx://myuser@localhost/SessionConfig", sc.Uri); - Assert.Equal("SessionConfigAlias", sc.GetAppData("alias")); - - // save using Json string and Uri - SessionConfigManager.Save("JsonString", "{ \"uri\": \"mysqlx://myuser@localhost/JsonString\", \"appdata\": { \"alias\": \"JsonStringAlias\" } }"); - sc = SessionConfigManager.Get("JsonString"); - Assert.Equal("JsonString", sc.Name); - Assert.Equal("mysqlx://myuser@localhost/JsonString", sc.Uri); - Assert.Equal("JsonStringAlias", sc.GetAppData("alias")); - - // save using DbDoc - SessionConfigManager.Save("DbDoc", new DbDoc("{ \"uri\": \"mysqlx://myuser@localhost/DbDoc\", \"appdata\": { \"alias\": \"DbDocAlias\" } }")); - sc = SessionConfigManager.Get("DbDoc"); - Assert.Equal("DbDoc", sc.Name); - Assert.Equal("mysqlx://myuser@localhost/DbDoc", sc.Uri); - Assert.Equal("DbDocAlias", sc.GetAppData("alias")); - - // save using Dictionary and Uri - Dictionary dic = new Dictionary(); - dic.Add("uri", "mysqlx://myuser@localhost/Dictionary"); - dic.Add("alias", "DictionaryAlias"); - SessionConfigManager.Save("Dictionary", dic); - sc = SessionConfigManager.Get("Dictionary"); - Assert.Equal("Dictionary", sc.Name); - Assert.Equal("mysqlx://myuser@localhost/Dictionary", sc.Uri); - Assert.Equal("DictionaryAlias", sc.GetAppData("alias")); - - // save using Dictionary and connection attributes - Dictionary dic2 = new Dictionary(); - dic2.Add("user", "myuser"); - dic2.Add("host", "localhost"); - dic2.Add("port", "33060"); - dic2.Add("schema", "Dictionary2"); - dic2.Add("alias", "Dictionary2Alias"); - SessionConfigManager.Save("Dictionary2", dic2); - sc = SessionConfigManager.Get("Dictionary2"); - Assert.Equal("Dictionary2", sc.Name); - Assert.Equal("mysqlx://myuser@localhost:33060/Dictionary2", sc.Uri); - Assert.Equal("Dictionary2Alias", sc.GetAppData("alias")); - - // save using Uri and appdata as json - SessionConfigManager.Save("UriJson", "mysqlx://myuser@localhost/UriJson", "{ \"alias\": \"UriJsonAlias\" }"); - sc = SessionConfigManager.Get("UriJson"); - Assert.Equal("UriJson", sc.Name); - Assert.Equal("mysqlx://myuser@localhost/UriJson", sc.Uri); - Assert.Equal("UriJsonAlias", sc.GetAppData("alias")); - - // save using Uri and appdata as dictionary - Dictionary dicAppData = new Dictionary(); - dicAppData.Add("alias", "UriDicAlias"); - SessionConfigManager.Save("UriDic", "mysqlx://myuser@localhost/UriDic", dicAppData); - sc = SessionConfigManager.Get("UriDic"); - Assert.Equal("UriDic", sc.Name); - Assert.Equal("mysqlx://myuser@localhost/UriDic", sc.Uri); - Assert.Equal("UriDicAlias", sc.GetAppData("alias")); - - // save using Json string and connection attributes - SessionConfigManager.Save("JsonStringAttributes", "{ \"host\": \"localhost\", \"user\": \"\", \"port\": 33060, \"schema\": \"JsonStringAttributes\", \"appdata\": { \"alias\": \"JsonStringAttributesAlias\", \"other\": 5 }, \"a\":1 }"); - sc = SessionConfigManager.Get("JsonStringAttributes"); - Assert.Equal("JsonStringAttributes", sc.Name); - Assert.Equal("mysqlx://localhost:33060/JsonStringAttributes", sc.Uri); - Assert.Equal("JsonStringAttributesAlias", sc.GetAppData("alias")); - Assert.Equal("5", sc.GetAppData("other")); - - // save using json anonymous - SessionConfigManager.Save("JsonAnonymous", new - { - host = "localhost", - user = "", - port = 33060, - schema = "JsonAnonymous", - appdata = new - { - alias = "JsonAnonymousAlias", - other = 5 - } - }); - sc = SessionConfigManager.Get("JsonAnonymous"); - Assert.Equal("JsonAnonymous", sc.Name); - Assert.Equal("mysqlx://localhost:33060/JsonAnonymous", sc.Uri); - Assert.Equal("JsonAnonymousAlias", sc.GetAppData("alias")); - Assert.Equal("5", sc.GetAppData("other")); - } - - [Fact] - public void SaveDictionaryData() - { - Dictionary dic = new Dictionary(); - List combination = new List(); - dic.Add("user", "myuser"); - dic.Add("port", "33060"); - dic.Add("schema", "Dictionary"); - dic.Add("alias", "DictionaryAlias"); - - for(int i = 0; i < dic.Count; i++) - { - Combinations(dic.Select(c => c.Key).ToList(), i + 1).ForEach(k => combination.Add(k)); - } - - int counter = 1; - foreach (string[] values in combination) - { - Dictionary dicTest = new Dictionary(); - dicTest.Add("host", "localhost"); - values.ToList().ForEach(o => dicTest.Add(o, dic[o])); - - string name = "Dictionary" + string.Join("", values); - SessionConfigManager.Save(name, dicTest); - SessionConfig sc = SessionConfigManager.Get(name); - Assert.Equal(name, sc.Name); - - StringBuilder uri = new StringBuilder("mysqlx://"); - if (dicTest.ContainsKey("user")) - uri.Append(dicTest["user"]).Append("@"); - uri.Append(dicTest["host"]); - if (dicTest.ContainsKey("port")) - uri.Append(":").Append(dicTest["port"]); - if (dicTest.ContainsKey("schema")) - uri.Append("/").Append(dicTest["schema"]); - - Assert.Equal(uri.ToString(), sc.Uri); - if (dicTest.ContainsKey("alias")) - Assert.Equal("DictionaryAlias", sc.GetAppData("alias")); - counter++; - } - } - - private List Combinations(List elements, int members) - { - List list = new List(); - for(int i = 0; i <= (elements.Count - members); i++) - { - if (members > 1) - { - Combinations(elements.Skip(i + 1).ToList(), members - 1).ForEach(m => - { - List tupla = new List(); - tupla.Add(elements.ElementAt(i)); - tupla.AddRange(m); - list.Add(tupla.ToArray()); - }); - } - else - { - list.Add(new T[] { elements.ElementAt(i) }); - } - } - return list; - } - - [Fact] - public void Update() - { - SessionConfigManager.Save("Update", "mysqlx://localhost/database1", (string)null); - SessionConfig sc = SessionConfigManager.Get("Update"); - Assert.Equal("Update", sc.Name); - Assert.Equal("mysqlx://localhost/database1", sc.Uri); - - sc.Uri = "mysqlx://localhost/database20"; - SessionConfigManager.Update(sc); - sc = SessionConfigManager.Get("Update"); - Assert.Equal("Update", sc.Name); - Assert.Equal("mysqlx://localhost/database20", sc.Uri); - } - - [Fact] - public void Validations() - { - Assert.Throws(() => SessionConfigManager.Save(null, (string)null)); - Assert.Equal("Name", Assert.Throws(() => SessionConfigManager.Save("@#!^^^", "")).ParamName); - Assert.Equal("Name", Assert.Throws(() => SessionConfigManager.Save("1 name", "mysqlx://localhost", (string)null)).ParamName); - Assert.Equal("Name", Assert.Throws(() => SessionConfigManager.Save("1!name", "mysqlx://localhost", (string)null)).ParamName); - Assert.Equal("Name", Assert.Throws(() => SessionConfigManager.Save("1@name", "mysqlx://localhost", (string)null)).ParamName); - Assert.Equal("Name", Assert.Throws(() => SessionConfigManager.Save("1name%", "mysqlx://localhost", (string)null)).ParamName); - } - } -} diff --git a/Tests/MySqlX.Data.Tests/SessionTests.cs b/Tests/MySqlX.Data.Tests/SessionTests.cs deleted file mode 100644 index 075417ef4..000000000 --- a/Tests/MySqlX.Data.Tests/SessionTests.cs +++ /dev/null @@ -1,273 +0,0 @@ -// Copyright © 2015, 2017, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySql.Data.MySqlClient; -using MySqlX.XDevAPI; -using System; -using System.Collections.Generic; -using Xunit; - -namespace MySqlX.Data.Tests -{ - public class SessionTests : BaseTest - { - [Fact] - public void CanCloseSession() - { - XSession s = MySqlX.XDevAPI.MySQLX.GetSession(ConnectionString); - Assert.True(s.InternalSession.SessionState == SessionState.Open); - s.Close(); - Assert.Equal(s.InternalSession.SessionState, SessionState.Closed); - } - - [Fact] - public void NoPassword() - { - XSession session = MySqlX.XDevAPI.MySQLX.GetSession(ConnectionStringNoPassword); - Assert.True(session.InternalSession.SessionState == SessionState.Open); - session.Close(); - Assert.Equal(session.InternalSession.SessionState, SessionState.Closed); - } - - [Fact] - public void NodeSessionClose() - { - NodeSession session = MySQLX.GetNodeSession(ConnectionString); - Assert.Equal(SessionState.Open, session.InternalSession.SessionState); - session.Close(); - Assert.Equal(SessionState.Closed, session.InternalSession.SessionState); - } - - [Fact] - public void CountClosedSession() - { - NodeSession nodeSession = MySQLX.GetNodeSession(ConnectionString); - int sessions = nodeSession.SQL("show processlist").Execute().FetchAll().Count; - - for (int i = 0; i < 20; i++) - { - XSession session = MySQLX.GetSession(ConnectionString); - Assert.True(session.InternalSession.SessionState == SessionState.Open); - session.Close(); - Assert.Equal(session.InternalSession.SessionState, SessionState.Closed); - } - - int newSessions = nodeSession.SQL("show processlist").Execute().FetchAll().Count; - nodeSession.Close(); - Assert.Equal(sessions, newSessions); - } - - [Fact] - public void ConnectionStringAsAnonymousType() - { - var connstring = new - { - server = session.Settings.Server, - port = session.Settings.Port, - user = session.Settings.UserID, - password = session.Settings.Password - }; - using (var testSession = MySQLX.GetNodeSession(connstring)) - { - Assert.Equal(SessionState.Open, testSession.InternalSession.SessionState); - } - } - - [Fact] - public void NodeSession_Get_Set_CurrentSchema() - { - using (NodeSession testSession = MySQLX.GetNodeSession(ConnectionString)) - { - Assert.Equal(SessionState.Open, testSession.InternalSession.SessionState); - Assert.Null(testSession.GetCurrentSchema()); - Assert.Throws(() => testSession.SetCurrentSchema("")); - testSession.SetCurrentSchema(schemaName); - Assert.Equal(schemaName, testSession.Schema.Name); - Assert.Equal(schemaName, testSession.GetCurrentSchema().Name); - } - } - - [Fact] - public void NodeSessionUsingSchema() - { - using (NodeSession mySession = MySQLX.GetNodeSession(ConnectionString + $";database={schemaName};")) - { - Assert.Equal(SessionState.Open, mySession.InternalSession.SessionState); - Assert.Equal(schemaName, mySession.Schema.Name); - Assert.Equal(schemaName, mySession.GetCurrentSchema().Name); - Assert.True(mySession.Schema.ExistsInDatabase()); - } - } - - [Fact] - public void XSessionUsingSchema() - { - using (XSession mySession = MySQLX.GetSession(ConnectionString + $";database={schemaName};")) - { - Assert.Equal(SessionState.Open, mySession.InternalSession.SessionState); - Assert.Equal(schemaName, mySession.Schema.Name); - Assert.True(mySession.Schema.ExistsInDatabase()); - } - } - - protected void CheckConnectionStringAsUri(string connectionstring, string user, string password, string server, uint port, params string[] parameters) - { - string result = this.session.ParseConnectionStringFromUri(connectionstring); - MySql.Data.MySqlClient.MySqlConnectionStringBuilder csbuilder = new MySql.Data.MySqlClient.MySqlConnectionStringBuilder(result); - Assert.True(user == csbuilder.UserID, string.Format("Expected:{0} Current:{1} in {2}", user, csbuilder.UserID, connectionstring)); - Assert.True(password == csbuilder.Password, string.Format("Expected:{0} Current:{1} in {2}", password, csbuilder.Password, connectionstring)); - Assert.True(server == csbuilder.Server, string.Format("Expected:{0} Current:{1} in {2}", server, csbuilder.Server, connectionstring)); - Assert.True(port == csbuilder.Port, string.Format("Expected:{0} Current:{1} in {2}", port, csbuilder.Port, connectionstring)); - if (parameters != null) - { - if (parameters.Length % 2 != 0) - throw new ArgumentOutOfRangeException(); - for (int i = 0; i < parameters.Length; i += 2) - { - Assert.True(csbuilder.ContainsKey(parameters[i])); - Assert.Equal(parameters[i + 1], csbuilder[parameters[i]].ToString()); - } - } - } - - [Fact] - public void ConnectionStringAsUri() - { - CheckConnectionStringAsUri("mysqlx://myuser:password@localhost:33060", "myuser", "password", "localhost", 33060); - CheckConnectionStringAsUri("mysqlx://my%3Auser:p%40ssword@localhost:33060", "my:user", "p@ssword", "localhost", 33060); - CheckConnectionStringAsUri("mysqlx://my%20user:p%40ss%20word@localhost:33060", "my user", "p@ss word", "localhost", 33060); - CheckConnectionStringAsUri("mysqlx:// myuser : p%40ssword@localhost:33060", "myuser", "p@ssword", "localhost", 33060); - CheckConnectionStringAsUri("mysqlx://myuser@localhost:33060", "myuser", "", "localhost", 33060); - CheckConnectionStringAsUri("mysqlx://myuser:p%40ssword@localhost", "myuser", "p@ssword", "localhost", 33060); - CheckConnectionStringAsUri("mysqlx://myuser:p%40ssw%40rd@localhost", "myuser", "p@ssw@rd", "localhost", 33060); - CheckConnectionStringAsUri("mysqlx://my%40user:p%40ssword@localhost", "my@user", "p@ssword", "localhost", 33060); - CheckConnectionStringAsUri("mysqlx://myuser@localhost", "myuser", "", "localhost", 33060); - CheckConnectionStringAsUri("mysqlx://myuser@127.0.0.1", "myuser", "", "127.0.0.1", 33060); - CheckConnectionStringAsUri("mysqlx://myuser@[::1]", "myuser", "", "[::1]", 33060); - CheckConnectionStringAsUri("mysqlx://myuser@localhost/test", "myuser", "", "localhost", 33060, "database", "test"); - CheckConnectionStringAsUri("mysqlx://myuser@localhost/test?ssl%20mode=none&pooling=false", "myuser", "", "localhost", 33060, "database", "test", "ssl mode", "None", "pooling", "False"); - CheckConnectionStringAsUri("mysqlx+ssh://myuser:password@localhost:33060", "myuser", "password", "localhost", 33060); - CheckConnectionStringAsUri("mysqlx://_%21%22%23%24s%26%2F%3D-%25r@localhost", "_!\"#$s&/=-%r", "", "localhost", 33060); - Assert.Throws(() => CheckConnectionStringAsUri("mysql://myuser@localhost", "myuser", "", "localhost", 33060)); - Assert.Throws(() => CheckConnectionStringAsUri("myuser@localhost", "myuser", "", "localhost", 33060)); - Assert.Throws(() => CheckConnectionStringAsUri("mysqlx://uid=myuser;server=localhost", "myuser", "", "localhost", 33060)); - CheckConnectionStringAsUri("mysqlx://user:password@server.example.com/?ssl-enable", "user", "password", "server.example.com", 33060, "sslenable", "True", "ssl mode", "Required"); - CheckConnectionStringAsUri("mysqlx://user:password@server.example.com/?ssl-ca=(c:\\client.pfx)", "user", "password", "server.example.com", 33060, "sslenable", "True", "ssl mode", "Required", "ssl-ca", "(c:%5Cclient.pfx)"); - Assert.Throws(() => CheckConnectionStringAsUri("mysqlx://user:password@server.example.com/?ssl-crl=(c:\\crl.pfx)", "user", "password", "server.example.com", 33060, "sslenable", "True", "ssl mode", "Required", "ssl-crl", "(c:%5Ccrl.pfx)")); - } - - [Fact] - public void ConnectionUsingUri() - { - using (var session = MySQLX.GetNodeSession(ConnectionStringUri)) - { - Assert.Equal(SessionState.Open, session.InternalSession.SessionState); - } - } - - [Fact] - public void ConnectionStringNull() - { - Assert.Throws(() => MySQLX.GetSession(null)); - Assert.Throws(() => MySQLX.GetNodeSession(null)); - } - - [Fact] - public void SslSession() - { - string connstring = ConnectionStringUri + "/?ssl-enable"; - using (var s3 = MySQLX.GetNodeSession(connstring)) - { - Assert.Equal(SessionState.Open, s3.InternalSession.SessionState); - var result = s3.SQL("SHOW SESSION STATUS LIKE 'Mysqlx_ssl_version';").Execute().FetchAll(); - Assert.StartsWith("TLSv1", result[0][1].ToString()); - } - } - - [Fact] - public void SslCertificate() - { - string path = "../MySql.Data.Tests/"; - string connstring = ConnectionStringUri + $"/?ssl-ca={path}client.pfx&ssl-ca-pwd=pass"; - using (var s3 = MySQLX.GetNodeSession(connstring)) - { - Assert.Equal(SessionState.Open, s3.InternalSession.SessionState); - var result = s3.SQL("SHOW SESSION STATUS LIKE 'Mysqlx_ssl_version';").Execute().FetchAll(); - Assert.StartsWith("TLSv1", result[0][1].ToString()); - } - } - - [Fact] - public void SslEmptyCertificate() - { - string connstring = ConnectionStringUri + $"/?ssl-ca="; - // if certificate is empty, it connects without a certificate - using (var s1 = MySQLX.GetNodeSession(connstring)) - { - Assert.Equal(SessionState.Open, s1.InternalSession.SessionState); - var result = s1.SQL("SHOW SESSION STATUS LIKE 'Mysqlx_ssl_version';").Execute().FetchAll(); - Assert.StartsWith("TLSv1", result[0][1].ToString()); - } - } - - [Fact] - public void SslCrl() - { - string connstring = ConnectionStringUri + "/?ssl-crl=crlcert.pfx"; - Assert.Throws(() => MySQLX.GetNodeSession(connstring)); - } - - [Fact] - public void IPv6() - { - MySqlConnectionStringBuilder csBuilder = new MySqlConnectionStringBuilder(ConnectionString); - csBuilder.Server = "::1"; - csBuilder.Port = uint.Parse(XPort); - - using (var session = MySQLX.GetSession(csBuilder.ToString())) - { - Assert.Equal(SessionState.Open, session.InternalSession.SessionState); - } - } - - [Fact] - public void IPv6AsUrl() - { - MySqlConnectionStringBuilder csBuilder = new MySqlConnectionStringBuilder(ConnectionString); - string connString = $"mysqlx://{csBuilder.UserID}:{csBuilder.Password}@[::1]:{XPort}"; - using (XSession session = MySQLX.GetSession(connString)) - { - Assert.Equal(SessionState.Open, session.InternalSession.SessionState); - } - } - - [Fact] - public void IPv6AsAnonymous() - { - MySqlConnectionStringBuilder csBuilder = new MySqlConnectionStringBuilder(ConnectionString); - using (XSession session = MySQLX.GetSession(new { server = "::1", user = csBuilder.UserID, password = csBuilder.Password, port = XPort })) - { - Assert.Equal(SessionState.Open, session.InternalSession.SessionState); - } - } - } -} diff --git a/Tests/MySqlX.Data.Tests/TransactionTests.cs b/Tests/MySqlX.Data.Tests/TransactionTests.cs deleted file mode 100644 index 48ec47d4b..000000000 --- a/Tests/MySqlX.Data.Tests/TransactionTests.cs +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright © 2015, 2016, Oracle and/or its affiliates. All rights reserved. -// -// MySQL Connector/NET is licensed under the terms of the GPLv2 -// , like most -// MySQL Connectors. There are special exceptions to the terms and -// conditions of the GPLv2 as it is applied to this software, see the -// FLOSS License Exception -// . -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published -// by the Free Software Foundation; version 2 of the License. -// -// This program is distributed in the hope that it will be useful, but -// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -// for more details. -// -// You should have received a copy of the GNU General Public License along -// with this program; if not, write to the Free Software Foundation, Inc., -// 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -using MySql.Data.MySqlClient; -using MySqlX.XDevAPI; -using MySqlX.XDevAPI.Common; -using MySqlX.XDevAPI.CRUD; -using MySqlX.XDevAPI.Relational; -using Xunit; - -namespace MySqlX.Data.Tests -{ - public class TransactionTests : BaseTest - { - [Fact] - public void Commit() - { - Collection coll = CreateCollection("test"); - var docs = new[] - { - new { _id = 1, title = "Book 1", pages = 20 }, - new { _id = 2, title = "Book 2", pages = 30 }, - new { _id = 3, title = "Book 3", pages = 40 }, - new { _id = 4, title = "Book 4", pages = 50 }, - }; - - // start the transaction - coll.Session.StartTransaction(); - - Result r = coll.Add(docs).Execute(); - Assert.Equal(4, r.RecordsAffected); - - // now roll it back - coll.Session.Commit(); - - DocResult foundDocs = coll.Find().Execute(); - Assert.True(foundDocs.Next()); - Assert.True(foundDocs.Next()); - Assert.True(foundDocs.Next()); - Assert.True(foundDocs.Next()); - Assert.False(foundDocs.Next()); - } - - [Fact] - public void Rollback() - { - Collection coll = CreateCollection("test"); - var docs = new[] - { - new { _id = 1, title = "Book 1", pages = 20 }, - new { _id = 2, title = "Book 2", pages = 30 }, - new { _id = 3, title = "Book 3", pages = 40 }, - new { _id = 4, title = "Book 4", pages = 50 }, - }; - - // start the transaction - coll.Session.StartTransaction(); - - Result r = coll.Add(docs).Execute(); - Assert.Equal(4, r.RecordsAffected); - - // now roll it back - coll.Session.Rollback(); - - DocResult foundDocs = coll.Find().Execute(); - Assert.False(foundDocs.Next()); - } - - [Fact] - public void Warnings() - { - using(NodeSession session = MySQLX.GetNodeSession(ConnectionString)) - { - session.SetCurrentSchema(schemaName); - Schema schema = session.GetSchema(schemaName); - session.SQL("CREATE TABLE nontrac(id INT primary key) ENGINE=MyISAM").Execute(); - Table table = schema.GetTable("nontrac"); - session.StartTransaction(); - table.Insert().Values(5).Execute(); - Assert.Throws(() => { table.Insert().Values(5).Execute(); }); - var result = session.Rollback(); - Assert.Equal(1, result.Warnings.Count); - // warning message: Some non-transactional changed tables couldn't be rolled back - Assert.Equal(1196u, result.Warnings[0].Code); - } - } - } -} diff --git a/Tests/MySqlX.Data.Tests/project.json b/Tests/MySqlX.Data.Tests/project.json deleted file mode 100644 index 14a7b544b..000000000 --- a/Tests/MySqlX.Data.Tests/project.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "version": "7.0.7-m6", - "description": "MySqlX.Data.Tests Class Library", - "authors": [ "Oracle" ], - "copyright": "Copyright © 2016, 2017, Oracle and/or its affiliates. All rights reserved.", - - "packOptions": { - "projectUrl": "http://dev.mysql.com/downloads/", - "licenseUrl": "http://www.gnu.org/licenses/old-licenses/gpl-2.0.html", - "iconUrl": "http://www.mysql.com/common/logos/logo-mysql-170x115.png", - "tags": [ "MySql", ".NET Connector", "MySql Connector/NET", "netcore", ".Net Core", "MySql Conector/Net Core", "coreclr", "C/NET", "C/Net Core" ], - "requireLicenseAcceptance": true - }, - "dependencies": { - "dotnet-test-xunit": "2.2.0-*", - "xunit": "2.2.0-*", - "Google.Protobuf": "3.0.0", - "MySql.Data": { - "target": "project" - } - }, - - "frameworks": { - "netcoreapp1.0": { - "imports": [ - "dnxcore50" - ], - "dependencies": { - "Microsoft.NETCore.App": { - "version": "1.0.0-*", - "type": "platform" - } - }, - "buildOptions": { - "define": [ "NETCORE10" ], - "warningsAsErrors": false, - "embed": [ "Properties/CreateUsers.sql" ], - "nowarn": [ "CS1591" ], - "keyFile": "../../ConnectorNetPublicKey.snk", - "delaySign": true, - "publicSign": false, - "compile": { - "include": [ "../*.cs", "../../Source/MySql.Data/Properties/VersionInfo.cs" ] - } - } - }, - "net451": { - "dependencies": { - "xunit.runner.visualstudio": "2.2.0" - } - } - }, - "configurations": { - "Debug": { - "buildOptions": { - "define": [ "DEBUG" ], - "embed": [ "Properties/CreateUsers.sql" ], - "optimize": false, - "preserveCompilationContext": true - } - }, - "Release": { - "buildOptions": { - "define": [ "RELEASE" ], - "embed": [ "Properties/CreateUsers.sql" ], - "optimize": true, - "preserveCompilationContext": true, - "xmlDoc": true, - "nowarn": [ "CS1591" ] - } - } - }, - "testRunner": "xunit" -} diff --git a/appsettings.json b/appsettings.json deleted file mode 100644 index 881abfc1d..000000000 --- a/appsettings.json +++ /dev/null @@ -1,12 +0,0 @@ - { - "MySql": { - "Data": { - "Port": 3305 - } - }, - "MySqlX": { - "Data": { - "Port": 33050 - } - } - } \ No newline at end of file diff --git a/global.json b/global.json index 0e7975fc1..4978943db 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,8 @@ { - "projects": [ "Source", "Tests", "Samples", "Source/Plugins" ], + "msbuild-sdks": { + "Microsoft.Build.Traversal": "4.1.0" + }, "sdk": { - "version": "1.0.0-preview2-1-003177" - } + "allowPrerelease": false } +} \ No newline at end of file